diff --git a/go.mod b/go.mod new file mode 100644 index 000000000..09707158a --- /dev/null +++ b/go.mod @@ -0,0 +1,37 @@ +module github.com/ouqiang/gocron + +go 1.12 + +require ( + github.com/Tang-RoseChild/mahonia v0.0.0-20131226213531-0eef680515cc + github.com/Unknwon/com v0.0.0-20190321035513-0fed4efef755 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 + github.com/dgrijalva/jwt-go v3.2.0+incompatible + github.com/go-gomail/gomail v0.0.0-20160411212932-81ebce5c23df + github.com/go-macaron/binding v0.0.0-20170611065819-ac54ee249c27 + github.com/go-macaron/gzip v0.0.0-20160222043647-cad1c6580a07 + github.com/go-macaron/inject v0.0.0-20160627170012-d8a0b8677191 // indirect + github.com/go-macaron/toolbox v0.0.0-20180818072302-a77f45a7ce90 + github.com/go-sql-driver/mysql v1.4.1 + github.com/go-xorm/builder v0.3.4 // indirect + github.com/go-xorm/core v0.6.2 + github.com/go-xorm/xorm v0.7.1 + github.com/golang/protobuf v1.3.1 + github.com/jakecoffman/cron v0.0.0-20190106200828-7e2009c226a5 + github.com/klauspost/compress v1.5.0 // indirect + github.com/klauspost/cpuid v1.2.1 // indirect + github.com/lib/pq v1.1.1 + github.com/ouqiang/goutil v1.1.1 + github.com/rakyll/statik v0.1.6 + github.com/urfave/cli v1.20.0 + golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5 // indirect + golang.org/x/net v0.0.0-20190522155817-f3200d17e092 + golang.org/x/sync v0.0.0-20181108010431-42b317875d0f // indirect + golang.org/x/text v0.3.2 // indirect + google.golang.org/genproto v0.0.0-20190530194941-fb225487d101 // indirect + google.golang.org/grpc v1.21.0 + gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect + gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df // indirect + gopkg.in/ini.v1 v1.42.0 + gopkg.in/macaron.v1 v1.3.2 +) diff --git a/go.sum b/go.sum new file mode 100644 index 000000000..58ce86760 --- /dev/null +++ b/go.sum @@ -0,0 +1,148 @@ +cloud.google.com/go v0.26.0 h1:e0WKqKTd5BnrG8aKH3J3h+QvEIQtSUcf2n5UZ5ZgLtQ= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/Tang-RoseChild/mahonia v0.0.0-20131226213531-0eef680515cc h1:7QGNag2vwx98HBiQ8A9M2PWO0ws/xNU6eZVlAbvIWZw= +github.com/Tang-RoseChild/mahonia v0.0.0-20131226213531-0eef680515cc/go.mod h1:Dl60+a8Tcs+dl3UbHuY54vuwwXo6JJ22RwnDGZ+0U+o= +github.com/Unknwon/com v0.0.0-20190321035513-0fed4efef755 h1:1B7wb36fHLSwZfHg6ngZhhtIEHQjiC5H4p7qQGBEffg= +github.com/Unknwon/com v0.0.0-20190321035513-0fed4efef755/go.mod h1:voKvFVpXBJxdIPeqjoJuLK+UVcRlo/JLjeToGxPYu68= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denisenkom/go-mssqldb v0.0.0-20181014144952-4e0d7dc8888f h1:WH0w/R4Yoey+04HhFxqZ6VX6I0d7RMyw5aXQ9UTvQPs= +github.com/denisenkom/go-mssqldb v0.0.0-20181014144952-4e0d7dc8888f/go.mod h1:xN/JuLBIz4bjkxNmByTiV1IbhfnYb6oo99phBn4Eqhc= +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/go-gomail/gomail v0.0.0-20160411212932-81ebce5c23df h1:Bao6dhmbTA1KFVxmJ6nBoMuOJit2yjEgLJpIMYpop0E= +github.com/go-gomail/gomail v0.0.0-20160411212932-81ebce5c23df/go.mod h1:GJr+FCSXshIwgHBtLglIg9M2l2kQSi6QjVAngtzI08Y= +github.com/go-macaron/binding v0.0.0-20170611065819-ac54ee249c27 h1:ieTTL9+RAtpcMaskwWNN19Vdrsl4X+k2CWsQijWNsAU= +github.com/go-macaron/binding v0.0.0-20170611065819-ac54ee249c27/go.mod h1:u+H6rwW+HQwUL+w5uaEJSpIlVZDye1o9MB4Su0JfRfM= +github.com/go-macaron/gzip v0.0.0-20160222043647-cad1c6580a07 h1:YSIA98PevNf1NtCa/J6cz7gjzpz99WVAOa9Eg0klKps= +github.com/go-macaron/gzip v0.0.0-20160222043647-cad1c6580a07/go.mod h1://cJFfDp/70L0oTNAMB+M8Jd0rpuIx/55iARuJ6StwE= +github.com/go-macaron/inject v0.0.0-20160627170012-d8a0b8677191 h1:NjHlg70DuOkcAMqgt0+XA+NHwtu66MkTVVgR4fFWbcI= +github.com/go-macaron/inject v0.0.0-20160627170012-d8a0b8677191/go.mod h1:VFI2o2q9kYsC4o7VP1HrEVosiZZTd+MVT3YZx4gqvJw= +github.com/go-macaron/toolbox v0.0.0-20180818072302-a77f45a7ce90 h1:3wYKrRg9IjUMfaf3H0Hh7M5Li9ge79Y7aw2yujHa2jQ= +github.com/go-macaron/toolbox v0.0.0-20180818072302-a77f45a7ce90/go.mod h1:Ut/NmkIMGVYlEdJBzEZgWVWG5ZpYS9BLmUgXfAgi+qM= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= +github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-xorm/builder v0.3.2/go.mod h1:v8mE3MFBgtL+RGFNfUnAMUqqfk/Y4W5KuwCFQIEpQLk= +github.com/go-xorm/builder v0.3.4 h1:FxkeGB4Cggdw3tPwutLCpfjng2jugfkg6LDMrd/KsoY= +github.com/go-xorm/builder v0.3.4/go.mod h1:KxkQkNN1DpPKTedxXyTQcmH+rXfvk4LZ9SOOBoZBAxw= +github.com/go-xorm/core v0.6.0/go.mod h1:d8FJ9Br8OGyQl12MCclmYBuBqqxsyeedpXciV5Myih8= +github.com/go-xorm/core v0.6.2 h1:EJLcSxf336POJr670wKB55Mah9f93xzvGYzNRgnT8/Y= +github.com/go-xorm/core v0.6.2/go.mod h1:bwPIfLdm/FzWgVUH8WPVlr+uJhscvNGFcaZKXsI3n2c= +github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:9wScpmSP5A3Bk8V3XHWUcJmYTh+ZnlHVyc+A4oZYS3Y= +github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:56xuuqnHyryaerycW3BfssRdxQstACi0Epw/yC5E2xM= +github.com/go-xorm/xorm v0.7.1 h1:Kj7mfuqctPdX60zuxP6EoEut0f3E6K66H6hcoxiHUMc= +github.com/go-xorm/xorm v0.7.1/go.mod h1:EHS1htMQFptzMaIHKyzqpHGw6C9Rtug75nsq6DA9unI= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e h1:JKmoR8x90Iww1ks85zJ1lfDGgIiMDuIptTOhJq+zKyg= +github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 h1:vr3AYkKovP8uR8AvSGGUK1IDqRa5lAAvEkZG1LKaCRc= +github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ= +github.com/jackc/pgx v3.2.0+incompatible h1:0Vihzu20St42/UDsvZGdNE6jak7oi/UOeMzwMPHkgFY= +github.com/jackc/pgx v3.2.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= +github.com/jakecoffman/cron v0.0.0-20190106200828-7e2009c226a5 h1:kCvm3G3u+eTRbjfLPyfsfznJtraYEfZer/UvQ6CaQhI= +github.com/jakecoffman/cron v0.0.0-20190106200828-7e2009c226a5/go.mod h1:6DM2KNNK69jRu0lAHmYK9LYxmqpNjYHOaNp/ZxttD4U= +github.com/jtolds/gls v4.2.1+incompatible h1:fSuqC+Gmlu6l/ZYAoZzx2pyucC8Xza35fpRVWLVmUEE= +github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/klauspost/compress v1.5.0 h1:iDac0ZKbmSA4PRrRuXXjZL8C7UoJan8oBYxXkMzEQrI= +github.com/klauspost/compress v1.5.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/cpuid v1.2.1 h1:vJi+O/nMdFt0vqm8NZBI6wzALWdA2X+egi0ogNyrC/w= +github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.1.1 h1:sJZmqHoEaY7f+NPP8pgLB/WxulyR3fewgCM2qaSlBb4= +github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-sqlite3 v1.10.0 h1:jbhqpg7tQe4SupckyijYiy0mJJ/pRyHvXf7JdWK860o= +github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/ouqiang/goutil v1.1.1 h1:r5EKn1jw6vBnj0sLrk3XWeQGxG5ftjGQ3ftuiiO2DYE= +github.com/ouqiang/goutil v1.1.1/go.mod h1:QrB1Ky4uGqcixxOx55MXweI3IA6nDZ0NtLMXbMfkur4= +github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rakyll/statik v0.1.6 h1:uICcfUXpgqtw2VopbIncslhAmE5hwc4g20TEyEENBNs= +github.com/rakyll/statik v0.1.6/go.mod h1:OEi9wJV/fMUAGx1eNjq75DKDsJVuEv1U0oYdX6GX8Zs= +github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24 h1:pntxY8Ary0t43dCZ5dqY4YTJCObLY1kIXl0uzMv+7DE= +github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304 h1:Jpy1PXuP99tXNrhbq2BaPz9B+jNAvH1JPQQpG/9GCXY= +github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c h1:Ho+uVpkel/udgjbwB5Lktg9BtvJSh2DT0Hi6LPSyI2w= +github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs= +github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5 h1:8dUaAV7K4uHsF56JQWkprecIQKdPHtR9jCHF5nB8uzc= +golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092 h1:4QSRKanuywn15aTZvI/mIDEgPQpswuFndXpOj3rKEco= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101 h1:wuGevabY6r+ivPNagjUXGGxF+GqgMd+dBhjsxW4q9u4= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.21.0 h1:G+97AoqBnmZIT91cLG/EkCoK9NSelj64P8bOHHNmGn0= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk= +gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE= +gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw= +gopkg.in/ini.v1 v1.42.0 h1:7N3gPTt50s8GuLortA00n8AqRTk75qOP98+mTPpgzRk= +gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/macaron.v1 v1.3.2 h1:AvWIaPmwBUA87/OWzePkoxeaw6YJWDfBt1pDFPBnLf8= +gopkg.in/macaron.v1 v1.3.2/go.mod h1:PrsiawTWAGZs6wFbT5hlr7SQ2Ns9h7cUVtcUu4lQOVo= +gopkg.in/stretchr/testify.v1 v1.2.2/go.mod h1:QI5V/q6UbPmuhtm10CaFZxED9NreB8PnFYN9JcR6TxU= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/internal/models/model.go b/internal/models/model.go index fea95ba5f..e7804e448 100644 --- a/internal/models/model.go +++ b/internal/models/model.go @@ -5,6 +5,8 @@ import ( "strings" "time" + macaron "gopkg.in/macaron.v1" + _ "github.com/go-sql-driver/mysql" "github.com/go-xorm/core" "github.com/go-xorm/xorm" @@ -12,7 +14,6 @@ import ( "github.com/ouqiang/gocron/internal/modules/app" "github.com/ouqiang/gocron/internal/modules/logger" "github.com/ouqiang/gocron/internal/modules/setting" - "gopkg.in/macaron.v1" ) type Status int8 @@ -78,7 +79,7 @@ func CreateDb() *xorm.Engine { } engine.SetMaxIdleConns(app.Setting.Db.MaxIdleConns) engine.SetMaxOpenConns(app.Setting.Db.MaxOpenConns) - engine.DB().SetConnMaxLifetime(dbMaxLiftTime) + engine.SetConnMaxLifetime(dbMaxLiftTime) if app.Setting.Db.Prefix != "" { // 设置表前缀 @@ -110,7 +111,7 @@ func getDbEngineDSN(setting *setting.Setting) string { dsn := "" switch engine { case "mysql": - dsn = fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s", + dsn = fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&allowNativePasswords=true", setting.Db.User, setting.Db.Password, setting.Db.Host, diff --git a/internal/modules/utils/utils.go b/internal/modules/utils/utils.go index 7a2adac61..1ab0d1e6d 100644 --- a/internal/modules/utils/utils.go +++ b/internal/modules/utils/utils.go @@ -26,7 +26,7 @@ func RandAuthToken() string { // 生成长度为length的随机字符串 func RandString(length int64) string { sources := []byte("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") - result := []byte{} + var result []byte r := rand.New(rand.NewSource(time.Now().UnixNano())) sourceLength := len(sources) var i int64 = 0 diff --git a/internal/routers/install/install.go b/internal/routers/install/install.go index cec9484d9..51177e3af 100644 --- a/internal/routers/install/install.go +++ b/internal/routers/install/install.go @@ -5,6 +5,8 @@ import ( "fmt" "strconv" + macaron "gopkg.in/macaron.v1" + "github.com/go-macaron/binding" "github.com/go-sql-driver/mysql" "github.com/lib/pq" @@ -13,7 +15,6 @@ import ( "github.com/ouqiang/gocron/internal/modules/setting" "github.com/ouqiang/gocron/internal/modules/utils" "github.com/ouqiang/gocron/internal/service" - "gopkg.in/macaron.v1" ) // 系统安装 @@ -107,7 +108,7 @@ func writeConfig(form InstallForm) error { "db.database", form.DbName, "db.prefix", form.DbTablePrefix, "db.charset", "utf8", - "db.max.idle.conns", "30", + "db.max.idle.conns", "5", "db.max.open.conns", "100", "allow_ips", "", "app.name", "定时任务管理系统", // 应用名称 diff --git a/makefile b/makefile index d7e39a5af..1dfbe6f9d 100644 --- a/makefile +++ b/makefile @@ -1,3 +1,5 @@ +GO111MODULE=on + .PHONY: build build: gocron node diff --git a/vendor/github.com/Tang-RoseChild/mahonia/8bit.go b/vendor/github.com/Tang-RoseChild/mahonia/8bit.go deleted file mode 100644 index 8c85c9fe9..000000000 --- a/vendor/github.com/Tang-RoseChild/mahonia/8bit.go +++ /dev/null @@ -1,844 +0,0 @@ -package mahonia - -import ( - "fmt" - "sync" -) - -// Converters for simple 8-bit character sets. - -type eightBitInfo struct { - Name string - Aliases []string - - // the character used for characters that can't be converted - SubstitutionChar byte - - // a string containing all 256 characters, in order. - Repertoire string - - // used to synchronize unpacking Repertoire into the conversion tables - once *sync.Once - - // true if the first 128 characters are the same as US-ASCII - asciiCompatible bool - - byte2char [256]rune - char2byte map[rune]byte -} - -const asciiRepertoire = "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f" - -func (info *eightBitInfo) register() { - var cs Charset - cs.Name = info.Name - cs.Aliases = info.Aliases - - info.once = new(sync.Once) - - cs.NewDecoder = func() Decoder { - info.once.Do(func() { info.unpack() }) - - return func(p []byte) (c rune, size int, status Status) { - if len(p) == 0 { - status = NO_ROOM - return - } - - c = info.byte2char[p[0]] - - if c == 0xfffd { - status = INVALID_CHAR - } else { - status = SUCCESS - } - - size = 1 - return - } - } - - cs.NewEncoder = func() Encoder { - info.once.Do(func() { info.unpack() }) - - return func(p []byte, c rune) (size int, status Status) { - if len(p) == 0 { - status = NO_ROOM - return - } - - if c < 128 && info.asciiCompatible { - p[0] = byte(c) - return 1, SUCCESS - } - - b, ok := info.char2byte[c] - if !ok { - b = info.SubstitutionChar - status = INVALID_CHAR - } else { - status = SUCCESS - } - p[0] = b - size = 1 - return - } - } - - RegisterCharset(&cs) -} - -func (info *eightBitInfo) unpack() { - info.asciiCompatible = info.Repertoire[:128] == asciiRepertoire - - info.char2byte = make(map[rune]byte, 256) - i := 0 - for _, c := range info.Repertoire { - info.byte2char[i] = c - if c != 0xfffd { - info.char2byte[c] = byte(i) - } - i++ - } - if i != 256 { - panic(fmt.Errorf("%s has only %d characters", info.Name, i)) - } -} - -func init() { - for i := 0; i < len(eightBitCharsets); i++ { - eightBitCharsets[i].register() - } -} - -var eightBitCharsets = []eightBitInfo{ - { - Name: "ISO-8859-2", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u0104\u02d8\u0141\u00a4\u013d\u015a\u00a7\u00a8\u0160\u015e\u0164\u0179\u00ad\u017d\u017b\u00b0\u0105\u02db\u0142\u00b4\u013e\u015b\u02c7\u00b8\u0161\u015f\u0165\u017a\u02dd\u017e\u017c\u0154\u00c1\u00c2\u0102\u00c4\u0139\u0106\u00c7\u010c\u00c9\u0118\u00cb\u011a\u00cd\u00ce\u010e\u0110\u0143\u0147\u00d3\u00d4\u0150\u00d6\u00d7\u0158\u016e\u00da\u0170\u00dc\u00dd\u0162\u00df\u0155\u00e1\u00e2\u0103\u00e4\u013a\u0107\u00e7\u010d\u00e9\u0119\u00eb\u011b\u00ed\u00ee\u010f\u0111\u0144\u0148\u00f3\u00f4\u0151\u00f6\u00f7\u0159\u016f\u00fa\u0171\u00fc\u00fd\u0163\u02d9", - Aliases: []string{"ISO_8859-2:1987", "iso-ir-101", "latin2", "l2", "csISOLatin2"}, - }, - { - Name: "ISO-8859-3", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u0126\u02d8\u00a3\u00a4\ufffd\u0124\u00a7\u00a8\u0130\u015e\u011e\u0134\u00ad\ufffd\u017b\u00b0\u0127\u00b2\u00b3\u00b4\u00b5\u0125\u00b7\u00b8\u0131\u015f\u011f\u0135\u00bd\ufffd\u017c\u00c0\u00c1\u00c2\ufffd\u00c4\u010a\u0108\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf\ufffd\u00d1\u00d2\u00d3\u00d4\u0120\u00d6\u00d7\u011c\u00d9\u00da\u00db\u00dc\u016c\u015c\u00df\u00e0\u00e1\u00e2\ufffd\u00e4\u010b\u0109\u00e7\u00e8\u00e9\u00ea\u00eb\u00ec\u00ed\u00ee\u00ef\ufffd\u00f1\u00f2\u00f3\u00f4\u0121\u00f6\u00f7\u011d\u00f9\u00fa\u00fb\u00fc\u016d\u015d\u02d9", - Aliases: []string{"ISO_8859-3:1988", "iso-ir-109", "latin3", "l3", "csISOLatin3"}, - }, - { - Name: "ISO-8859-4", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u0104\u0138\u0156\u00a4\u0128\u013b\u00a7\u00a8\u0160\u0112\u0122\u0166\u00ad\u017d\u00af\u00b0\u0105\u02db\u0157\u00b4\u0129\u013c\u02c7\u00b8\u0161\u0113\u0123\u0167\u014a\u017e\u014b\u0100\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u012e\u010c\u00c9\u0118\u00cb\u0116\u00cd\u00ce\u012a\u0110\u0145\u014c\u0136\u00d4\u00d5\u00d6\u00d7\u00d8\u0172\u00da\u00db\u00dc\u0168\u016a\u00df\u0101\u00e1\u00e2\u00e3\u00e4\u00e5\u00e6\u012f\u010d\u00e9\u0119\u00eb\u0117\u00ed\u00ee\u012b\u0111\u0146\u014d\u0137\u00f4\u00f5\u00f6\u00f7\u00f8\u0173\u00fa\u00fb\u00fc\u0169\u016b\u02d9", - Aliases: []string{"ISO_8859-4:1988", "iso-ir-110", "latin4", "l4", "csISOLatin4"}, - }, - { - Name: "ISO-8859-5", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u0401\u0402\u0403\u0404\u0405\u0406\u0407\u0408\u0409\u040a\u040b\u040c\u00ad\u040e\u040f\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u044f\u2116\u0451\u0452\u0453\u0454\u0455\u0456\u0457\u0458\u0459\u045a\u045b\u045c\u00a7\u045e\u045f", - Aliases: []string{"ISO_8859-5:1988", "iso-ir-144", "cyrillic", "csISOLatinCyrillic"}, - }, - { - Name: "ISO-8859-6", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\ufffd\ufffd\ufffd\u00a4\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u060c\u00ad\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u061b\ufffd\ufffd\ufffd\u061f\ufffd\u0621\u0622\u0623\u0624\u0625\u0626\u0627\u0628\u0629\u062a\u062b\u062c\u062d\u062e\u062f\u0630\u0631\u0632\u0633\u0634\u0635\u0636\u0637\u0638\u0639\u063a\ufffd\ufffd\ufffd\ufffd\ufffd\u0640\u0641\u0642\u0643\u0644\u0645\u0646\u0647\u0648\u0649\u064a\u064b\u064c\u064d\u064e\u064f\u0650\u0651\u0652\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd", - Aliases: []string{"ISO_8859-6:1987", "iso-ir-127", "ECMA-114", "ASMO-708", "arabic", "csISOLatinArabic"}, - }, - { - Name: "ISO-8859-7", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u2018\u2019\u00a3\u20ac\u20af\u00a6\u00a7\u00a8\u00a9\u037a\u00ab\u00ac\u00ad\ufffd\u2015\u00b0\u00b1\u00b2\u00b3\u0384\u0385\u0386\u00b7\u0388\u0389\u038a\u00bb\u038c\u00bd\u038e\u038f\u0390\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\ufffd\u03a3\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u03ca\u03cb\u03cc\u03cd\u03ce\ufffd", - Aliases: []string{"ISO_8859-7:2003", "iso-ir-126", "ELOT_928", "ECMA-118", "greek", "greek8", "csISOLatinGreek"}, - }, - { - Name: "ISO-8859-8", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\ufffd\u00a2\u00a3\u00a4\u00a5\u00a6\u00a7\u00a8\u00a9\u00d7\u00ab\u00ac\u00ad\u00ae\u00af\u00b0\u00b1\u00b2\u00b3\u00b4\u00b5\u00b6\u00b7\u00b8\u00b9\u00f7\u00bb\u00bc\u00bd\u00be\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u2017\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05da\u05db\u05dc\u05dd\u05de\u05df\u05e0\u05e1\u05e2\u05e3\u05e4\u05e5\u05e6\u05e7\u05e8\u05e9\u05ea\ufffd\ufffd\u200e\u200f\ufffd", - Aliases: []string{"ISO_8859-8:1999", "iso-ir-138", "hebrew", "csISOLatinHebrew"}, - }, - { - Name: "ISO-8859-9", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u00a1\u00a2\u00a3\u00a4\u00a5\u00a6\u00a7\u00a8\u00a9\u00aa\u00ab\u00ac\u00ad\u00ae\u00af\u00b0\u00b1\u00b2\u00b3\u00b4\u00b5\u00b6\u00b7\u00b8\u00b9\u00ba\u00bb\u00bc\u00bd\u00be\u00bf\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf\u011e\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d7\u00d8\u00d9\u00da\u00db\u00dc\u0130\u015e\u00df\u00e0\u00e1\u00e2\u00e3\u00e4\u00e5\u00e6\u00e7\u00e8\u00e9\u00ea\u00eb\u00ec\u00ed\u00ee\u00ef\u011f\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f7\u00f8\u00f9\u00fa\u00fb\u00fc\u0131\u015f\u00ff", - Aliases: []string{"ISO_8859-9:1999", "iso-ir-148", "latin5", "l5", "csISOLatin5"}, - }, - { - Name: "ISO-8859-10", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u0104\u0112\u0122\u012a\u0128\u0136\u00a7\u013b\u0110\u0160\u0166\u017d\u00ad\u016a\u014a\u00b0\u0105\u0113\u0123\u012b\u0129\u0137\u00b7\u013c\u0111\u0161\u0167\u017e\u2015\u016b\u014b\u0100\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u012e\u010c\u00c9\u0118\u00cb\u0116\u00cd\u00ce\u00cf\u00d0\u0145\u014c\u00d3\u00d4\u00d5\u00d6\u0168\u00d8\u0172\u00da\u00db\u00dc\u00dd\u00de\u00df\u0101\u00e1\u00e2\u00e3\u00e4\u00e5\u00e6\u012f\u010d\u00e9\u0119\u00eb\u0117\u00ed\u00ee\u00ef\u00f0\u0146\u014d\u00f3\u00f4\u00f5\u00f6\u0169\u00f8\u0173\u00fa\u00fb\u00fc\u00fd\u00fe\u0138", - Aliases: []string{"iso_8859-10:1992", "l6", "iso-ir-157", "latin6", "csISOLatin6"}, - }, - { - Name: "ISO-8859-11", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u0e01\u0e02\u0e03\u0e04\u0e05\u0e06\u0e07\u0e08\u0e09\u0e0a\u0e0b\u0e0c\u0e0d\u0e0e\u0e0f\u0e10\u0e11\u0e12\u0e13\u0e14\u0e15\u0e16\u0e17\u0e18\u0e19\u0e1a\u0e1b\u0e1c\u0e1d\u0e1e\u0e1f\u0e20\u0e21\u0e22\u0e23\u0e24\u0e25\u0e26\u0e27\u0e28\u0e29\u0e2a\u0e2b\u0e2c\u0e2d\u0e2e\u0e2f\u0e30\u0e31\u0e32\u0e33\u0e34\u0e35\u0e36\u0e37\u0e38\u0e39\u0e3a\ufffd\ufffd\ufffd\ufffd\u0e3f\u0e40\u0e41\u0e42\u0e43\u0e44\u0e45\u0e46\u0e47\u0e48\u0e49\u0e4a\u0e4b\u0e4c\u0e4d\u0e4e\u0e4f\u0e50\u0e51\u0e52\u0e53\u0e54\u0e55\u0e56\u0e57\u0e58\u0e59\u0e5a\u0e5b\ufffd\ufffd\ufffd\ufffd", - Aliases: []string{"iso_8859-11:2001", "Latin/Thai", "TIS-620"}, - }, - { - Name: "ISO-8859-13", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u201d\u00a2\u00a3\u00a4\u201e\u00a6\u00a7\u00d8\u00a9\u0156\u00ab\u00ac\u00ad\u00ae\u00c6\u00b0\u00b1\u00b2\u00b3\u201c\u00b5\u00b6\u00b7\u00f8\u00b9\u0157\u00bb\u00bc\u00bd\u00be\u00e6\u0104\u012e\u0100\u0106\u00c4\u00c5\u0118\u0112\u010c\u00c9\u0179\u0116\u0122\u0136\u012a\u013b\u0160\u0143\u0145\u00d3\u014c\u00d5\u00d6\u00d7\u0172\u0141\u015a\u016a\u00dc\u017b\u017d\u00df\u0105\u012f\u0101\u0107\u00e4\u00e5\u0119\u0113\u010d\u00e9\u017a\u0117\u0123\u0137\u012b\u013c\u0161\u0144\u0146\u00f3\u014d\u00f5\u00f6\u00f7\u0173\u0142\u015b\u016b\u00fc\u017c\u017e\u2019", - Aliases: []string{"latin7", "Baltic Rim"}, - }, - { - Name: "ISO-8859-14", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u1e02\u1e03\u00a3\u010a\u010b\u1e0a\u00a7\u1e80\u00a9\u1e82\u1e0b\u1ef2\u00ad\u00ae\u0178\u1e1e\u1e1f\u0120\u0121\u1e40\u1e41\u00b6\u1e56\u1e81\u1e57\u1e83\u1e60\u1ef3\u1e84\u1e85\u1e61\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf\u0174\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u1e6a\u00d8\u00d9\u00da\u00db\u00dc\u00dd\u0176\u00df\u00e0\u00e1\u00e2\u00e3\u00e4\u00e5\u00e6\u00e7\u00e8\u00e9\u00ea\u00eb\u00ec\u00ed\u00ee\u00ef\u0175\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u1e6b\u00f8\u00f9\u00fa\u00fb\u00fc\u00fd\u0177\u00ff", - Aliases: []string{"iso-ir-199", "ISO_8859-14:1998", "latin8", "iso-celtic", "l8"}, - }, - { - Name: "ISO-8859-15", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u00a1\u00a2\u00a3\u20ac\u00a5\u0160\u00a7\u0161\u00a9\u00aa\u00ab\u00ac\u00ad\u00ae\u00af\u00b0\u00b1\u00b2\u00b3\u017d\u00b5\u00b6\u00b7\u017e\u00b9\u00ba\u00bb\u0152\u0153\u0178\u00bf\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d7\u00d8\u00d9\u00da\u00db\u00dc\u00dd\u00de\u00df\u00e0\u00e1\u00e2\u00e3\u00e4\u00e5\u00e6\u00e7\u00e8\u00e9\u00ea\u00eb\u00ec\u00ed\u00ee\u00ef\u00f0\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f7\u00f8\u00f9\u00fa\u00fb\u00fc\u00fd\u00fe\u00ff", - Aliases: []string{"Latin-9"}, - }, - { - Name: "ISO-8859-16", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u0104\u0105\u0141\u20ac\u201e\u0160\u00a7\u0161\u00a9\u0218\u00ab\u0179\u00ad\u017a\u017b\u00b0\u00b1\u010c\u0142\u017d\u201d\u00b6\u00b7\u017e\u010d\u0219\u00bb\u0152\u0153\u0178\u017c\u00c0\u00c1\u00c2\u0102\u00c4\u0106\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf\u0110\u0143\u00d2\u00d3\u00d4\u0150\u00d6\u015a\u0170\u00d9\u00da\u00db\u00dc\u0118\u021a\u00df\u00e0\u00e1\u00e2\u0103\u00e4\u0107\u00e6\u00e7\u00e8\u00e9\u00ea\u00eb\u00ec\u00ed\u00ee\u00ef\u0111\u0144\u00f2\u00f3\u00f4\u0151\u00f6\u015b\u0171\u00f9\u00fa\u00fb\u00fc\u0119\u021b\u00ff", - Aliases: []string{"iso-ir-226", "ISO_8859-16:2001", "latin10", "l10"}, - }, - { - Name: "macos-0_2-10.2", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u00c4\u00c5\u00c7\u00c9\u00d1\u00d6\u00dc\u00e1\u00e0\u00e2\u00e4\u00e3\u00e5\u00e7\u00e9\u00e8\u00ea\u00eb\u00ed\u00ec\u00ee\u00ef\u00f1\u00f3\u00f2\u00f4\u00f6\u00f5\u00fa\u00f9\u00fb\u00fc\u2020\u00b0\u00a2\u00a3\u00a7\u2022\u00b6\u00df\u00ae\u00a9\u2122\u00b4\u00a8\u2260\u00c6\u00d8\u221e\u00b1\u2264\u2265\u00a5\u00b5\u2202\u2211\u220f\u03c0\u222b\u00aa\u00ba\u03a9\u00e6\u00f8\u00bf\u00a1\u00ac\u221a\u0192\u2248\u2206\u00ab\u00bb\u2026\u00a0\u00c0\u00c3\u00d5\u0152\u0153\u2013\u2014\u201c\u201d\u2018\u2019\u00f7\u25ca\u00ff\u0178\u2044\u20ac\u2039\u203a\ufb01\ufb02\u2021\u00b7\u201a\u201e\u2030\u00c2\u00ca\u00c1\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u00d3\u00d4\uf8ff\u00d2\u00da\u00db\u00d9\u0131\u02c6\u02dc\u00af\u02d8\u02d9\u02da\u00b8\u02dd\u02db\u02c7", - Aliases: []string{"macos-0_2-10.2", "macintosh", "mac", "csMacintosh", "windows-10000", "macroman"}, - }, - { - Name: "macos-6_2-10.4", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u00c4\u00b9\u00b2\u00c9\u00b3\u00d6\u00dc\u0385\u00e0\u00e2\u00e4\u0384\u00a8\u00e7\u00e9\u00e8\u00ea\u00eb\u00a3\u2122\u00ee\u00ef\u2022\u00bd\u2030\u00f4\u00f6\u00a6\u20ac\u00f9\u00fb\u00fc\u2020\u0393\u0394\u0398\u039b\u039e\u03a0\u00df\u00ae\u00a9\u03a3\u03aa\u00a7\u2260\u00b0\u00b7\u0391\u00b1\u2264\u2265\u00a5\u0392\u0395\u0396\u0397\u0399\u039a\u039c\u03a6\u03ab\u03a8\u03a9\u03ac\u039d\u00ac\u039f\u03a1\u2248\u03a4\u00ab\u00bb\u2026\u00a0\u03a5\u03a7\u0386\u0388\u0153\u2013\u2015\u201c\u201d\u2018\u2019\u00f7\u0389\u038a\u038c\u038e\u03ad\u03ae\u03af\u03cc\u038f\u03cd\u03b1\u03b2\u03c8\u03b4\u03b5\u03c6\u03b3\u03b7\u03b9\u03be\u03ba\u03bb\u03bc\u03bd\u03bf\u03c0\u03ce\u03c1\u03c3\u03c4\u03b8\u03c9\u03c2\u03c7\u03c5\u03b6\u03ca\u03cb\u0390\u03b0\u00ad", - Aliases: []string{"macos-6_2-10.4", "x-mac-greek", "windows-10006", "macgr"}, - }, - { - Name: "macos-7_3-10.2", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a\u042b\u042c\u042d\u042e\u042f\u2020\u00b0\u0490\u00a3\u00a7\u2022\u00b6\u0406\u00ae\u00a9\u2122\u0402\u0452\u2260\u0403\u0453\u221e\u00b1\u2264\u2265\u0456\u00b5\u0491\u0408\u0404\u0454\u0407\u0457\u0409\u0459\u040a\u045a\u0458\u0405\u00ac\u221a\u0192\u2248\u2206\u00ab\u00bb\u2026\u00a0\u040b\u045b\u040c\u045c\u0455\u2013\u2014\u201c\u201d\u2018\u2019\u00f7\u201e\u040e\u045e\u040f\u045f\u2116\u0401\u0451\u044f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u20ac", - Aliases: []string{"macos-7_3-10.2", "x-mac-cyrillic", "windows-10007", "mac-cyrillic", "maccy"}, - }, - { - Name: "macos-29-10.2", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u00c4\u0100\u0101\u00c9\u0104\u00d6\u00dc\u00e1\u0105\u010c\u00e4\u010d\u0106\u0107\u00e9\u0179\u017a\u010e\u00ed\u010f\u0112\u0113\u0116\u00f3\u0117\u00f4\u00f6\u00f5\u00fa\u011a\u011b\u00fc\u2020\u00b0\u0118\u00a3\u00a7\u2022\u00b6\u00df\u00ae\u00a9\u2122\u0119\u00a8\u2260\u0123\u012e\u012f\u012a\u2264\u2265\u012b\u0136\u2202\u2211\u0142\u013b\u013c\u013d\u013e\u0139\u013a\u0145\u0146\u0143\u00ac\u221a\u0144\u0147\u2206\u00ab\u00bb\u2026\u00a0\u0148\u0150\u00d5\u0151\u014c\u2013\u2014\u201c\u201d\u2018\u2019\u00f7\u25ca\u014d\u0154\u0155\u0158\u2039\u203a\u0159\u0156\u0157\u0160\u201a\u201e\u0161\u015a\u015b\u00c1\u0164\u0165\u00cd\u017d\u017e\u016a\u00d3\u00d4\u016b\u016e\u00da\u016f\u0170\u0171\u0172\u0173\u00dd\u00fd\u0137\u017b\u0141\u017c\u0122\u02c7", - Aliases: []string{"macos-29-10.2", "x-mac-centraleurroman", "windows-10029", "x-mac-ce", "macce", "maccentraleurope"}, - }, - { - Name: "macos-35-10.2", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u00c4\u00c5\u00c7\u00c9\u00d1\u00d6\u00dc\u00e1\u00e0\u00e2\u00e4\u00e3\u00e5\u00e7\u00e9\u00e8\u00ea\u00eb\u00ed\u00ec\u00ee\u00ef\u00f1\u00f3\u00f2\u00f4\u00f6\u00f5\u00fa\u00f9\u00fb\u00fc\u2020\u00b0\u00a2\u00a3\u00a7\u2022\u00b6\u00df\u00ae\u00a9\u2122\u00b4\u00a8\u2260\u00c6\u00d8\u221e\u00b1\u2264\u2265\u00a5\u00b5\u2202\u2211\u220f\u03c0\u222b\u00aa\u00ba\u03a9\u00e6\u00f8\u00bf\u00a1\u00ac\u221a\u0192\u2248\u2206\u00ab\u00bb\u2026\u00a0\u00c0\u00c3\u00d5\u0152\u0153\u2013\u2014\u201c\u201d\u2018\u2019\u00f7\u25ca\u00ff\u0178\u011e\u011f\u0130\u0131\u015e\u015f\u2021\u00b7\u201a\u201e\u2030\u00c2\u00ca\u00c1\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u00d3\u00d4\uf8ff\u00d2\u00da\u00db\u00d9\uf8a0\u02c6\u02dc\u00af\u02d8\u02d9\u02da\u00b8\u02dd\u02db\u02c7", - Aliases: []string{"macos-35-10.2", "x-mac-turkish", "windows-10081", "mactr"}, - }, - { - Name: "windows-1250", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u20ac\ufffd\u201a\ufffd\u201e\u2026\u2020\u2021\ufffd\u2030\u0160\u2039\u015a\u0164\u017d\u0179\ufffd\u2018\u2019\u201c\u201d\u2022\u2013\u2014\ufffd\u2122\u0161\u203a\u015b\u0165\u017e\u017a\u00a0\u02c7\u02d8\u0141\u00a4\u0104\u00a6\u00a7\u00a8\u00a9\u015e\u00ab\u00ac\u00ad\u00ae\u017b\u00b0\u00b1\u02db\u0142\u00b4\u00b5\u00b6\u00b7\u00b8\u0105\u015f\u00bb\u013d\u02dd\u013e\u017c\u0154\u00c1\u00c2\u0102\u00c4\u0139\u0106\u00c7\u010c\u00c9\u0118\u00cb\u011a\u00cd\u00ce\u010e\u0110\u0143\u0147\u00d3\u00d4\u0150\u00d6\u00d7\u0158\u016e\u00da\u0170\u00dc\u00dd\u0162\u00df\u0155\u00e1\u00e2\u0103\u00e4\u013a\u0107\u00e7\u010d\u00e9\u0119\u00eb\u011b\u00ed\u00ee\u010f\u0111\u0144\u0148\u00f3\u00f4\u0151\u00f6\u00f7\u0159\u016f\u00fa\u0171\u00fc\u00fd\u0163\u02d9", - }, - { - Name: "windows-1251", - Aliases: []string{"CP1251"}, - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0402\u0403\u201a\u0453\u201e\u2026\u2020\u2021\u20ac\u2030\u0409\u2039\u040a\u040c\u040b\u040f\u0452\u2018\u2019\u201c\u201d\u2022\u2013\u2014\ufffd\u2122\u0459\u203a\u045a\u045c\u045b\u045f\u00a0\u040e\u045e\u0408\u00a4\u0490\u00a6\u00a7\u0401\u00a9\u0404\u00ab\u00ac\u00ad\u00ae\u0407\u00b0\u00b1\u0406\u0456\u0491\u00b5\u00b6\u00b7\u0451\u2116\u0454\u00bb\u0458\u0405\u0455\u0457\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u044f", - }, - { - Name: "windows-1252", - Aliases: []string{"cp1252"}, - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u20ac\ufffd\u201a\u0192\u201e\u2026\u2020\u2021\u02c6\u2030\u0160\u2039\u0152\ufffd\u017d\ufffd\ufffd\u2018\u2019\u201c\u201d\u2022\u2013\u2014\u02dc\u2122\u0161\u203a\u0153\ufffd\u017e\u0178\u00a0\u00a1\u00a2\u00a3\u00a4\u00a5\u00a6\u00a7\u00a8\u00a9\u00aa\u00ab\u00ac\u00ad\u00ae\u00af\u00b0\u00b1\u00b2\u00b3\u00b4\u00b5\u00b6\u00b7\u00b8\u00b9\u00ba\u00bb\u00bc\u00bd\u00be\u00bf\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d7\u00d8\u00d9\u00da\u00db\u00dc\u00dd\u00de\u00df\u00e0\u00e1\u00e2\u00e3\u00e4\u00e5\u00e6\u00e7\u00e8\u00e9\u00ea\u00eb\u00ec\u00ed\u00ee\u00ef\u00f0\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f7\u00f8\u00f9\u00fa\u00fb\u00fc\u00fd\u00fe\u00ff", - }, - { - Name: "windows-1253", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u20ac\ufffd\u201a\u0192\u201e\u2026\u2020\u2021\ufffd\u2030\ufffd\u2039\ufffd\ufffd\ufffd\ufffd\ufffd\u2018\u2019\u201c\u201d\u2022\u2013\u2014\ufffd\u2122\ufffd\u203a\ufffd\ufffd\ufffd\ufffd\u00a0\u0385\u0386\u00a3\u00a4\u00a5\u00a6\u00a7\u00a8\u00a9\ufffd\u00ab\u00ac\u00ad\u00ae\u2015\u00b0\u00b1\u00b2\u00b3\u0384\u00b5\u00b6\u00b7\u0388\u0389\u038a\u00bb\u038c\u00bd\u038e\u038f\u0390\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\ufffd\u03a3\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u03ca\u03cb\u03cc\u03cd\u03ce\ufffd", - }, - { - Name: "windows-1254", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u20ac\ufffd\u201a\u0192\u201e\u2026\u2020\u2021\u02c6\u2030\u0160\u2039\u0152\ufffd\ufffd\ufffd\ufffd\u2018\u2019\u201c\u201d\u2022\u2013\u2014\u02dc\u2122\u0161\u203a\u0153\ufffd\ufffd\u0178\u00a0\u00a1\u00a2\u00a3\u00a4\u00a5\u00a6\u00a7\u00a8\u00a9\u00aa\u00ab\u00ac\u00ad\u00ae\u00af\u00b0\u00b1\u00b2\u00b3\u00b4\u00b5\u00b6\u00b7\u00b8\u00b9\u00ba\u00bb\u00bc\u00bd\u00be\u00bf\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf\u011e\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d7\u00d8\u00d9\u00da\u00db\u00dc\u0130\u015e\u00df\u00e0\u00e1\u00e2\u00e3\u00e4\u00e5\u00e6\u00e7\u00e8\u00e9\u00ea\u00eb\u00ec\u00ed\u00ee\u00ef\u011f\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f7\u00f8\u00f9\u00fa\u00fb\u00fc\u0131\u015f\u00ff", - }, - { - Name: "windows-1255", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u20ac\ufffd\u201a\u0192\u201e\u2026\u2020\u2021\u02c6\u2030\ufffd\u2039\ufffd\ufffd\ufffd\ufffd\ufffd\u2018\u2019\u201c\u201d\u2022\u2013\u2014\u02dc\u2122\ufffd\u203a\ufffd\ufffd\ufffd\ufffd\u00a0\u00a1\u00a2\u00a3\u20aa\u00a5\u00a6\u00a7\u00a8\u00a9\u00d7\u00ab\u00ac\u00ad\u00ae\u00af\u00b0\u00b1\u00b2\u00b3\u00b4\u00b5\u00b6\u00b7\u00b8\u00b9\u00f7\u00bb\u00bc\u00bd\u00be\u00bf\u05b0\u05b1\u05b2\u05b3\u05b4\u05b5\u05b6\u05b7\u05b8\u05b9\ufffd\u05bb\u05bc\u05bd\u05be\u05bf\u05c0\u05c1\u05c2\u05c3\u05f0\u05f1\u05f2\u05f3\u05f4\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05da\u05db\u05dc\u05dd\u05de\u05df\u05e0\u05e1\u05e2\u05e3\u05e4\u05e5\u05e6\u05e7\u05e8\u05e9\u05ea\ufffd\ufffd\u200e\u200f\ufffd", - }, - { - Name: "windows-1256", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u20ac\u067e\u201a\u0192\u201e\u2026\u2020\u2021\u02c6\u2030\u0679\u2039\u0152\u0686\u0698\u0688\u06af\u2018\u2019\u201c\u201d\u2022\u2013\u2014\u06a9\u2122\u0691\u203a\u0153\u200c\u200d\u06ba\u00a0\u060c\u00a2\u00a3\u00a4\u00a5\u00a6\u00a7\u00a8\u00a9\u06be\u00ab\u00ac\u00ad\u00ae\u00af\u00b0\u00b1\u00b2\u00b3\u00b4\u00b5\u00b6\u00b7\u00b8\u00b9\u061b\u00bb\u00bc\u00bd\u00be\u061f\u06c1\u0621\u0622\u0623\u0624\u0625\u0626\u0627\u0628\u0629\u062a\u062b\u062c\u062d\u062e\u062f\u0630\u0631\u0632\u0633\u0634\u0635\u0636\u00d7\u0637\u0638\u0639\u063a\u0640\u0641\u0642\u0643\u00e0\u0644\u00e2\u0645\u0646\u0647\u0648\u00e7\u00e8\u00e9\u00ea\u00eb\u0649\u064a\u00ee\u00ef\u064b\u064c\u064d\u064e\u00f4\u064f\u0650\u00f7\u0651\u00f9\u0652\u00fb\u00fc\u200e\u200f\u06d2", - }, - { - Name: "windows-1257", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u20ac\ufffd\u201a\ufffd\u201e\u2026\u2020\u2021\ufffd\u2030\ufffd\u2039\ufffd\u00a8\u02c7\u00b8\ufffd\u2018\u2019\u201c\u201d\u2022\u2013\u2014\ufffd\u2122\ufffd\u203a\ufffd\u00af\u02db\ufffd\u00a0\ufffd\u00a2\u00a3\u00a4\ufffd\u00a6\u00a7\u00d8\u00a9\u0156\u00ab\u00ac\u00ad\u00ae\u00c6\u00b0\u00b1\u00b2\u00b3\u00b4\u00b5\u00b6\u00b7\u00f8\u00b9\u0157\u00bb\u00bc\u00bd\u00be\u00e6\u0104\u012e\u0100\u0106\u00c4\u00c5\u0118\u0112\u010c\u00c9\u0179\u0116\u0122\u0136\u012a\u013b\u0160\u0143\u0145\u00d3\u014c\u00d5\u00d6\u00d7\u0172\u0141\u015a\u016a\u00dc\u017b\u017d\u00df\u0105\u012f\u0101\u0107\u00e4\u00e5\u0119\u0113\u010d\u00e9\u017a\u0117\u0123\u0137\u012b\u013c\u0161\u0144\u0146\u00f3\u014d\u00f5\u00f6\u00f7\u0173\u0142\u015b\u016b\u00fc\u017c\u017e\u02d9", - }, - { - Name: "windows-1258", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u20ac\ufffd\u201a\u0192\u201e\u2026\u2020\u2021\u02c6\u2030\ufffd\u2039\u0152\ufffd\ufffd\ufffd\ufffd\u2018\u2019\u201c\u201d\u2022\u2013\u2014\u02dc\u2122\ufffd\u203a\u0153\ufffd\ufffd\u0178\u00a0\u00a1\u00a2\u00a3\u00a4\u00a5\u00a6\u00a7\u00a8\u00a9\u00aa\u00ab\u00ac\u00ad\u00ae\u00af\u00b0\u00b1\u00b2\u00b3\u00b4\u00b5\u00b6\u00b7\u00b8\u00b9\u00ba\u00bb\u00bc\u00bd\u00be\u00bf\u00c0\u00c1\u00c2\u0102\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u0300\u00cd\u00ce\u00cf\u0110\u00d1\u0309\u00d3\u00d4\u01a0\u00d6\u00d7\u00d8\u00d9\u00da\u00db\u00dc\u01af\u0303\u00df\u00e0\u00e1\u00e2\u0103\u00e4\u00e5\u00e6\u00e7\u00e8\u00e9\u00ea\u00eb\u0301\u00ed\u00ee\u00ef\u0111\u00f1\u0323\u00f3\u00f4\u01a1\u00f6\u00f7\u00f8\u00f9\u00fa\u00fb\u00fc\u01b0\u20ab\u00ff", - }, - { - Name: "windows-874", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u20ac\ufffd\ufffd\ufffd\ufffd\u2026\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u2018\u2019\u201c\u201d\u2022\u2013\u2014\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u00a0\u0e01\u0e02\u0e03\u0e04\u0e05\u0e06\u0e07\u0e08\u0e09\u0e0a\u0e0b\u0e0c\u0e0d\u0e0e\u0e0f\u0e10\u0e11\u0e12\u0e13\u0e14\u0e15\u0e16\u0e17\u0e18\u0e19\u0e1a\u0e1b\u0e1c\u0e1d\u0e1e\u0e1f\u0e20\u0e21\u0e22\u0e23\u0e24\u0e25\u0e26\u0e27\u0e28\u0e29\u0e2a\u0e2b\u0e2c\u0e2d\u0e2e\u0e2f\u0e30\u0e31\u0e32\u0e33\u0e34\u0e35\u0e36\u0e37\u0e38\u0e39\u0e3a\ufffd\ufffd\ufffd\ufffd\u0e3f\u0e40\u0e41\u0e42\u0e43\u0e44\u0e45\u0e46\u0e47\u0e48\u0e49\u0e4a\u0e4b\u0e4c\u0e4d\u0e4e\u0e4f\u0e50\u0e51\u0e52\u0e53\u0e54\u0e55\u0e56\u0e57\u0e58\u0e59\u0e5a\u0e5b\ufffd\ufffd\ufffd\ufffd", - }, - { - Name: "IBM037", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5\u00e7\u00f1\u00a2.<(+|&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df!$*);\u00ac-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00a6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:#@'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u00a4\u00b5~stuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae^\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be[]\u00af\u00a8\u00b4\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5}JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"cp037", "ebcdic-cp-us", "ebcdic-cp-ca", "ebcdic-cp-wt", "ebcdic-cp-nl", "csIBM037"}, - }, - { - Name: "ibm-273_P100-1995", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2{\u00e0\u00e1\u00e3\u00e5\u00e7\u00f1\u00c4.<(+!&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec~\u00dc$*);^-/\u00c2[\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00f6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:#\u00a7'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u00a4\u00b5\u00dfstuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9@\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7\u00e4ABCDEFGHI\u00ad\u00f4\u00a6\u00f2\u00f3\u00f5\u00fcJKLMNOPQR\u00b9\u00fb}\u00f9\u00fa\u00ff\u00d6\u00f7STUVWXYZ\u00b2\u00d4\\\u00d2\u00d3\u00d50123456789\u00b3\u00db]\u00d9\u00da\u009f", - Aliases: []string{"ibm-273_P100-1995", "ibm-273", "IBM273", "CP273", "csIBM273", "ebcdic-de", "273"}, - }, - { - Name: "ibm-277_P100-1995", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3}\u00e7\u00f1#.<(+!&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df\u00a4\u00c5*);^-/\u00c2\u00c4\u00c0\u00c1\u00c3$\u00c7\u00d1\u00f8,%_>?\u00a6\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:\u00c6\u00d8'=\"@abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba{\u00b8[]\u00b5\u00fcstuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7\u00e6ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5\u00e5JKLMNOPQR\u00b9\u00fb~\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-277_P100-1995", "ibm-277", "IBM277", "cp277", "EBCDIC-CP-DK", "EBCDIC-CP-NO", "csIBM277", "ebcdic-dk", "277"}, - }, - { - Name: "ibm-278_P100-1995", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2{\u00e0\u00e1\u00e3}\u00e7\u00f1\u00a7.<(+!&`\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df\u00a4\u00c5*);^-/\u00c2#\u00c0\u00c1\u00c3$\u00c7\u00d1\u00f6,%_>?\u00f8\\\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u00e9:\u00c4\u00d6'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6]\u00b5\u00fcstuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9[\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7\u00e4ABCDEFGHI\u00ad\u00f4\u00a6\u00f2\u00f3\u00f5\u00e5JKLMNOPQR\u00b9\u00fb~\u00f9\u00fa\u00ff\u00c9\u00f7STUVWXYZ\u00b2\u00d4@\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-278_P100-1995", "ibm-278", "IBM278", "cp278", "ebcdic-cp-fi", "ebcdic-cp-se", "csIBM278", "ebcdic-sv", "278"}, - }, - { - Name: "ibm-280_P100-1995", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4{\u00e1\u00e3\u00e5\\\u00f1\u00b0.<(+!&]\u00ea\u00eb}\u00ed\u00ee\u00ef~\u00df\u00e9$*);^-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00f2,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u00f9:\u00a3\u00a7'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1[jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u00a4\u00b5\u00ecstuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2#\u00a5\u00b7\u00a9@\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7\u00e0ABCDEFGHI\u00ad\u00f4\u00f6\u00a6\u00f3\u00f5\u00e8JKLMNOPQR\u00b9\u00fb\u00fc`\u00fa\u00ff\u00e7\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-280_P100-1995", "ibm-280", "IBM280", "CP280", "ebcdic-cp-it", "csIBM280", "280"}, - }, - { - Name: "ibm-284_P100-1995", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5\u00e7\u00a6[.<(+|&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df]$*);\u00ac-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7#\u00f1,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:\u00d1@'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u00a4\u00b5\u00a8stuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be^!\u00af~\u00b4\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5}JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-284_P100-1995", "ibm-284", "IBM284", "CP284", "ebcdic-cp-es", "csIBM284", "cpibm284", "284"}, - }, - { - Name: "ibm-285_P100-1995", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5\u00e7\u00f1$.<(+|&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df!\u00a3*);\u00ac-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00a6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:#@'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u00a4\u00b5\u00afstuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2[\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be^]~\u00a8\u00b4\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5}JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-285_P100-1995", "ibm-285", "IBM285", "CP285", "ebcdic-cp-gb", "csIBM285", "cpibm285", "ebcdic-gb", "285"}, - }, - { - Name: "ibm-290_P100-1995", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \uff61\uff62\uff63\uff64\uff65\uff66\uff67\uff68\uff69\u00a3.<(+|&\uff6a\uff6b\uff6c\uff6d\uff6e\uff6f\ufffd\uff70\ufffd!\u00a5*);\u00ac-/abcdefgh\ufffd,%_>?[ijklmnop`:#@'=\"]\uff71\uff72\uff73\uff74\uff75\uff76\uff77\uff78\uff79\uff7aq\uff7b\uff7c\uff7d\uff7e\uff7f\uff80\uff81\uff82\uff83\uff84\uff85\uff86\uff87\uff88\uff89r\ufffd\uff8a\uff8b\uff8c~\u203e\uff8d\uff8e\uff8f\uff90\uff91\uff92\uff93\uff94\uff95s\uff96\uff97\uff98\uff99^\u00a2\\tuvwxyz\uff9a\uff9b\uff9c\uff9d\uff9e\uff9f{ABCDEFGHI\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd}JKLMNOPQR\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd$\ufffdSTUVWXYZ\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0123456789\ufffd\ufffd\ufffd\ufffd\ufffd\u009f", - Aliases: []string{"ibm-290_P100-1995", "ibm-290", "IBM290", "cp290", "EBCDIC-JP-kana", "csIBM290"}, - }, - { - Name: "ibm-297_P100-1995", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4@\u00e1\u00e3\u00e5\\\u00f1\u00b0.<(+!&{\u00ea\u00eb}\u00ed\u00ee\u00ef\u00ec\u00df\u00a7$*);^-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00f9,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u00b5:\u00a3\u00e0'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1[jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u00a4`\u00a8stuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2#\u00a5\u00b7\u00a9]\u00b6\u00bc\u00bd\u00be\u00ac|\u00af~\u00b4\u00d7\u00e9ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5\u00e8JKLMNOPQR\u00b9\u00fb\u00fc\u00a6\u00fa\u00ff\u00e7\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-297_P100-1995", "ibm-297", "IBM297", "cp297", "ebcdic-cp-fr", "csIBM297", "cpibm297", "297"}, - }, - { - Name: "ibm-420_X120-1999", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u0651\ufe7d\u0640\u200b\u0621\u0622\ufe82\u0623\u00a2.<(+|&\ufe84\u0624\ufffd\ufffd\u0626\u0627\ufe8e\u0628\ufe91!$*);\u00ac-/\u0629\u062a\ufe97\u062b\ufe9b\u062c\ufe9f\u062d\u00a6,%_>?\ufea3\u062e\ufea7\u062f\u0630\u0631\u0632\u0633\ufeb3\u060c:#@'=\"\u0634abcdefghi\ufeb7\u0635\ufebb\u0636\ufebf\u0637\u0638jklmnopqr\u0639\ufeca\ufecb\ufecc\u063a\ufece\ufecf\u00f7stuvwxyz\ufed0\u0641\ufed3\u0642\ufed7\u0643\ufedb\u0644\ufef5\ufef6\ufef7\ufef8\ufffd\ufffd\ufefb\ufefc\ufedf\u0645\ufee3\u0646\ufee7\u0647\u061bABCDEFGHI\u00ad\ufeeb\ufffd\ufeec\ufffd\u0648\u061fJKLMNOPQR\u0649\ufef0\u064a\ufef2\ufef3\u0660\u00d7\ufffdSTUVWXYZ\u0661\u0662\ufffd\u0663\u0664\u06650123456789\ufffd\u0666\u0667\u0668\u0669\u009f", - Aliases: []string{"ibm-420_X120-1999", "ibm-420", "IBM420", "cp420", "ebcdic-cp-ar1", "csIBM420", "420"}, - }, - { - Name: "IBM424", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u00a2.<(+|&\u05d9\u05da\u05db\u05dc\u05dd\u05de\u05df\u05e0\u05e1!$*);\u00ac-/\u05e2\u05e3\u05e4\u05e5\u05e6\u05e7\u05e8\u05e9\u00a6,%_>?\ufffd\u05ea\ufffd\ufffd\u00a0\ufffd\ufffd\ufffd\u2017`:#@'=\"\ufffdabcdefghi\u00ab\u00bb\ufffd\ufffd\ufffd\u00b1\u00b0jklmnopqr\ufffd\ufffd\ufffd\u00b8\ufffd\u00a4\u00b5~stuvwxyz\ufffd\ufffd\ufffd\ufffd\ufffd\u00ae^\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be[]\u00af\u00a8\u00b4\u00d7{ABCDEFGHI\u00ad\ufffd\ufffd\ufffd\ufffd\ufffd}JKLMNOPQR\u00b9\ufffd\ufffd\ufffd\ufffd\ufffd\\\u00f7STUVWXYZ\u00b2\ufffd\ufffd\ufffd\ufffd\ufffd0123456789\u00b3\ufffd\ufffd\ufffd\ufffd\u009f", - Aliases: []string{"cp424", "ebcdic-cp-he", "csIBM424"}, - }, - { - Name: "IBM437", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u00c7\u00fc\u00e9\u00e2\u00e4\u00e0\u00e5\u00e7\u00ea\u00eb\u00e8\u00ef\u00ee\u00ec\u00c4\u00c5\u00c9\u00e6\u00c6\u00f4\u00f6\u00f2\u00fb\u00f9\u00ff\u00d6\u00dc\u00a2\u00a3\u00a5\u20a7\u0192\u00e1\u00ed\u00f3\u00fa\u00f1\u00d1\u00aa\u00ba\u00bf\u2310\u00ac\u00bd\u00bc\u00a1\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u03b1\u00df\u0393\u03c0\u03a3\u03c3\u00b5\u03c4\u03a6\u0398\u03a9\u03b4\u221e\u03c6\u03b5\u2229\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u00a0", - Aliases: []string{"cp437", "437", "csPC8CodePage437"}, - }, - { - Name: "IBM500", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5\u00e7\u00f1[.<(+!&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df]$*);^-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00a6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:#@'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u00a4\u00b5~stuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5}JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"CP500", "ebcdic-cp-be", "ebcdic-cp-ch", "csIBM500"}, - }, - { - Name: "ibm-720_P100-1997", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\ufffd\ufffd\u00e9\u00e2\ufffd\u00e0\ufffd\u00e7\u00ea\u00eb\u00e8\u00ef\u00ee\ufffd\ufffd\ufffd\ufffd\u0651\u0652\u00f4\u00a4\u0640\u00fb\u00f9\u0621\u0622\u0623\u0624\u00a3\u0625\u0626\u0627\u0628\u0629\u062a\u062b\u062c\u062d\u062e\u062f\u0630\u0631\u0632\u0633\u0634\u0635\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u0636\u0637\u0638\u0639\u063a\u0641\u00b5\u0642\u0643\u0644\u0645\u0646\u0647\u0648\u0649\u064a\u2261\u064b\u064c\u064d\u064e\u064f\u0650\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u00a0", - Aliases: []string{"ibm-720_P100-1997", "ibm-720", "windows-720", "DOS-720"}, - }, - { - Name: "IBM737", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c3\u03c2\u03c4\u03c5\u03c6\u03c7\u03c8\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u03c9\u03ac\u03ad\u03ae\u03ca\u03af\u03cc\u03cd\u03cb\u03ce\u0386\u0388\u0389\u038a\u038c\u038e\u038f\u00b1\u2265\u2264\u03aa\u03ab\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u00a0", - Aliases: []string{"cp737", "cp737_DOSGreek"}, - }, - { - Name: "IBM775", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0106\u00fc\u00e9\u0101\u00e4\u0123\u00e5\u0107\u0142\u0113\u0156\u0157\u012b\u0179\u00c4\u00c5\u00c9\u00e6\u00c6\u014d\u00f6\u0122\u00a2\u015a\u015b\u00d6\u00dc\u00f8\u00a3\u00d8\u00d7\u00a4\u0100\u012a\u00f3\u017b\u017c\u017a\u201d\u00a6\u00a9\u00ae\u00ac\u00bd\u00bc\u0141\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u0104\u010c\u0118\u0116\u2563\u2551\u2557\u255d\u012e\u0160\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u0172\u016a\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u017d\u0105\u010d\u0119\u0117\u012f\u0161\u0173\u016b\u017e\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u00d3\u00df\u014c\u0143\u00f5\u00d5\u00b5\u0144\u0136\u0137\u013b\u013c\u0146\u0112\u0145\u2019\u00ad\u00b1\u201c\u00be\u00b6\u00a7\u00f7\u201e\u00b0\u2219\u00b7\u00b9\u00b3\u00b2\u25a0\u00a0", - Aliases: []string{"cp775", "csPC775Baltic"}, - }, - { - Name: "ibm-803_P100-1999", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd$.<(+|\u05d0\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd!\u00a2*);\u00ac-/\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd,%_>?\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd:#@'=\"\ufffd\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u05da\u05db\u05dc\u05dd\u05de\u05df\u05e0\u05e1\u05e2\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u05e3\u05e4\u05e5\u05e6\u05e7\u05e8\u05e9\u05ea\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdABCDEFGHI\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdJKLMNOPQR\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdSTUVWXYZ\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0123456789\ufffd\ufffd\ufffd\ufffd\ufffd\u009f", - Aliases: []string{"ibm-803_P100-1999", "ibm-803", "cp803"}, - }, - { - Name: "ibm-838_P100-1995", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u0e01\u0e02\u0e03\u0e04\u0e05\u0e06\u0e07[\u00a2.<(+|&\u0e48\u0e08\u0e09\u0e0a\u0e0b\u0e0c\u0e0d\u0e0e]!$*);\u00ac-/\u0e0f\u0e10\u0e11\u0e12\u0e13\u0e14\u0e15^\u00a6,%_>?\u0e3f\u0e4e\u0e16\u0e17\u0e18\u0e19\u0e1a\u0e1b\u0e1c`:#@'=\"\u0e4fabcdefghi\u0e1d\u0e1e\u0e1f\u0e20\u0e21\u0e22\u0e5ajklmnopqr\u0e23\u0e24\u0e25\u0e26\u0e27\u0e28\u0e5b~stuvwxyz\u0e29\u0e2a\u0e2b\u0e2c\u0e2d\u0e2e\u0e50\u0e51\u0e52\u0e53\u0e54\u0e55\u0e56\u0e57\u0e58\u0e59\u0e2f\u0e30\u0e31\u0e32\u0e33\u0e34{ABCDEFGHI\u0e49\u0e35\u0e36\u0e37\u0e38\u0e39}JKLMNOPQR\u0e3a\u0e40\u0e41\u0e42\u0e43\u0e44\\\u0e4aSTUVWXYZ\u0e45\u0e46\u0e47\u0e48\u0e49\u0e4a0123456789\u0e4b\u0e4c\u0e4d\u0e4b\u0e4c\u009f", - Aliases: []string{"ibm-838_P100-1995", "ibm-838", "IBM838", "IBM-Thai", "csIBMThai", "cp838", "838", "ibm-9030"}, - }, - { - Name: "IBM850", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u00c7\u00fc\u00e9\u00e2\u00e4\u00e0\u00e5\u00e7\u00ea\u00eb\u00e8\u00ef\u00ee\u00ec\u00c4\u00c5\u00c9\u00e6\u00c6\u00f4\u00f6\u00f2\u00fb\u00f9\u00ff\u00d6\u00dc\u00f8\u00a3\u00d8\u00d7\u0192\u00e1\u00ed\u00f3\u00fa\u00f1\u00d1\u00aa\u00ba\u00bf\u00ae\u00ac\u00bd\u00bc\u00a1\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u00c1\u00c2\u00c0\u00a9\u2563\u2551\u2557\u255d\u00a2\u00a5\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u00e3\u00c3\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u00a4\u00f0\u00d0\u00ca\u00cb\u00c8\u0131\u00cd\u00ce\u00cf\u2518\u250c\u2588\u2584\u00a6\u00cc\u2580\u00d3\u00df\u00d4\u00d2\u00f5\u00d5\u00b5\u00fe\u00de\u00da\u00db\u00d9\u00fd\u00dd\u00af\u00b4\u00ad\u00b1\u2017\u00be\u00b6\u00a7\u00f7\u00b8\u00b0\u00a8\u00b7\u00b9\u00b3\u00b2\u25a0\u00a0", - Aliases: []string{"cp850", "850", "csPC850Multilingual"}, - }, - { - Name: "ibm-851_P100-1995", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u00c7\u00fc\u00e9\u00e2\u00e4\u00e0\u0386\u00e7\u00ea\u00eb\u00e8\u00ef\u00ee\u0388\u00c4\u0389\u038a\ufffd\u038c\u00f4\u00f6\u038e\u00fb\u00f9\u038f\u00d6\u00dc\u03ac\u00a3\u03ad\u03ae\u03af\u03ca\u0390\u03cc\u03cd\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u00bd\u0398\u0399\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u039a\u039b\u039c\u039d\u2563\u2551\u2557\u255d\u039e\u039f\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u03a0\u03a1\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u03a3\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03b1\u03b2\u03b3\u2518\u250c\u2588\u2584\u03b4\u03b5\u2580\u03b6\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c3\u03c2\u03c4\u00b4\u00ad\u00b1\u03c5\u03c6\u03c7\u00a7\u03c8\u00b8\u00b0\u00a8\u03c9\u03cb\u03b0\u03ce\u25a0\u00a0", - Aliases: []string{"ibm-851_P100-1995", "ibm-851", "IBM851", "cp851", "851", "csPC851"}, - }, - { - Name: "IBM852", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u00c7\u00fc\u00e9\u00e2\u00e4\u016f\u0107\u00e7\u0142\u00eb\u0150\u0151\u00ee\u0179\u00c4\u0106\u00c9\u0139\u013a\u00f4\u00f6\u013d\u013e\u015a\u015b\u00d6\u00dc\u0164\u0165\u0141\u00d7\u010d\u00e1\u00ed\u00f3\u00fa\u0104\u0105\u017d\u017e\u0118\u0119\u00ac\u017a\u010c\u015f\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u00c1\u00c2\u011a\u015e\u2563\u2551\u2557\u255d\u017b\u017c\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u0102\u0103\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u00a4\u0111\u0110\u010e\u00cb\u010f\u0147\u00cd\u00ce\u011b\u2518\u250c\u2588\u2584\u0162\u016e\u2580\u00d3\u00df\u00d4\u0143\u0144\u0148\u0160\u0161\u0154\u00da\u0155\u0170\u00fd\u00dd\u0163\u00b4\u00ad\u02dd\u02db\u02c7\u02d8\u00a7\u00f7\u00b8\u00b0\u00a8\u02d9\u0171\u0158\u0159\u25a0\u00a0", - Aliases: []string{"cp852", "852", "csPCp852"}, - }, - { - Name: "IBM855", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0452\u0402\u0453\u0403\u0451\u0401\u0454\u0404\u0455\u0405\u0456\u0406\u0457\u0407\u0458\u0408\u0459\u0409\u045a\u040a\u045b\u040b\u045c\u040c\u045e\u040e\u045f\u040f\u044e\u042e\u044a\u042a\u0430\u0410\u0431\u0411\u0446\u0426\u0434\u0414\u0435\u0415\u0444\u0424\u0433\u0413\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u0445\u0425\u0438\u0418\u2563\u2551\u2557\u255d\u0439\u0419\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u043a\u041a\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u00a4\u043b\u041b\u043c\u041c\u043d\u041d\u043e\u041e\u043f\u2518\u250c\u2588\u2584\u041f\u044f\u2580\u042f\u0440\u0420\u0441\u0421\u0442\u0422\u0443\u0423\u0436\u0416\u0432\u0412\u044c\u042c\u2116\u00ad\u044b\u042b\u0437\u0417\u0448\u0428\u044d\u042d\u0449\u0429\u0447\u0427\u00a7\u25a0\u00a0", - Aliases: []string{"cp855", "855", "csIBM855"}, - }, - { - Name: "IBM856", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05da\u05db\u05dc\u05dd\u05de\u05df\u05e0\u05e1\u05e2\u05e3\u05e4\u05e5\u05e6\u05e7\u05e8\u05e9\u05ea\ufffd\u00a3\ufffd\u00d7\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u00ae\u00ac\u00bd\u00bc\ufffd\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\ufffd\ufffd\ufffd\u00a9\u2563\u2551\u2557\u255d\u00a2\u00a5\u2510\u2514\u2534\u252c\u251c\u2500\u253c\ufffd\ufffd\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u00a4\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u2518\u250c\u2588\u2584\u00a6\ufffd\u2580\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u00b5\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u00af\u00b4\u00ad\u00b1\u2017\u00be\u00b6\u00a7\u00f7\u00b8\u00b0\u00a8\u00b7\u00b9\u00b3\u00b2\u25a0\u00a0", - Aliases: []string{"cp856", "cp856_Hebrew_PC"}, - }, - { - Name: "ibm-857_P100-1995", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u00c7\u00fc\u00e9\u00e2\u00e4\u00e0\u00e5\u00e7\u00ea\u00eb\u00e8\u00ef\u00ee\u0131\u00c4\u00c5\u00c9\u00e6\u00c6\u00f4\u00f6\u00f2\u00fb\u00f9\u0130\u00d6\u00dc\u00f8\u00a3\u00d8\u015e\u015f\u00e1\u00ed\u00f3\u00fa\u00f1\u00d1\u011e\u011f\u00bf\u00ae\u00ac\u00bd\u00bc\u00a1\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u00c1\u00c2\u00c0\u00a9\u2563\u2551\u2557\u255d\u00a2\u00a5\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u00e3\u00c3\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u00a4\u00ba\u00aa\u00ca\u00cb\u00c8\ufffd\u00cd\u00ce\u00cf\u2518\u250c\u2588\u2584\u00a6\u00cc\u2580\u00d3\u00df\u00d4\u00d2\u00f5\u00d5\u00b5\ufffd\u00d7\u00da\u00db\u00d9\u00ec\u00ff\u00af\u00b4\u00ad\u00b1\ufffd\u00be\u00b6\u00a7\u00f7\u00b8\u00b0\u00a8\u00b7\u00b9\u00b3\u00b2\u25a0\u00a0", - Aliases: []string{"ibm-857_P100-1995", "ibm-857", "IBM857", "cp857", "857", "csIBM857", "windows-857"}, - }, - { - Name: "ibm-858_P100-1997", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u00c7\u00fc\u00e9\u00e2\u00e4\u00e0\u00e5\u00e7\u00ea\u00eb\u00e8\u00ef\u00ee\u00ec\u00c4\u00c5\u00c9\u00e6\u00c6\u00f4\u00f6\u00f2\u00fb\u00f9\u00ff\u00d6\u00dc\u00f8\u00a3\u00d8\u00d7\u0192\u00e1\u00ed\u00f3\u00fa\u00f1\u00d1\u00aa\u00ba\u00bf\u00ae\u00ac\u00bd\u00bc\u00a1\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u00c1\u00c2\u00c0\u00a9\u2563\u2551\u2557\u255d\u00a2\u00a5\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u00e3\u00c3\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u00a4\u00f0\u00d0\u00ca\u00cb\u00c8\u20ac\u00cd\u00ce\u00cf\u2518\u250c\u2588\u2584\u00a6\u00cc\u2580\u00d3\u00df\u00d4\u00d2\u00f5\u00d5\u00b5\u00fe\u00de\u00da\u00db\u00d9\u00fd\u00dd\u00af\u00b4\u00ad\u00b1\u2017\u00be\u00b6\u00a7\u00f7\u00b8\u00b0\u00a8\u00b7\u00b9\u00b3\u00b2\u25a0\u00a0", - Aliases: []string{"ibm-858_P100-1997", "ibm-858", "IBM00858", "CCSID00858", "CP00858", "PC-Multilingual-850+euro", "cp858", "windows-858"}, - }, - { - Name: "ibm-860_P100-1995", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u00c7\u00fc\u00e9\u00e2\u00e3\u00e0\u00c1\u00e7\u00ea\u00ca\u00e8\u00cd\u00d4\u00ec\u00c3\u00c2\u00c9\u00c0\u00c8\u00f4\u00f5\u00f2\u00da\u00f9\u00cc\u00d5\u00dc\u00a2\u00a3\u00d9\u20a7\u00d3\u00e1\u00ed\u00f3\u00fa\u00f1\u00d1\u00aa\u00ba\u00bf\u00d2\u00ac\u00bd\u00bc\u00a1\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u03b1\u00df\u0393\u03c0\u03a3\u03c3\u03bc\u03c4\u03a6\u0398\u03a9\u03b4\u221e\u03c6\u03b5\u2229\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u00a0", - Aliases: []string{"ibm-860_P100-1995", "ibm-860", "IBM860", "cp860", "860", "csIBM860"}, - }, - { - Name: "ibm-861_P100-1995", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u00c7\u00fc\u00e9\u00e2\u00e4\u00e0\u00e5\u00e7\u00ea\u00eb\u00e8\u00d0\u00f0\u00de\u00c4\u00c5\u00c9\u00e6\u00c6\u00f4\u00f6\u00fe\u00fb\u00dd\u00fd\u00d6\u00dc\u00f8\u00a3\u00d8\u20a7\u0192\u00e1\u00ed\u00f3\u00fa\u00c1\u00cd\u00d3\u00da\u00bf\u2310\u00ac\u00bd\u00bc\u00a1\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u03b1\u00df\u0393\u03c0\u03a3\u03c3\u03bc\u03c4\u03a6\u0398\u03a9\u03b4\u221e\u03c6\u03b5\u2229\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u00a0", - Aliases: []string{"ibm-861_P100-1995", "ibm-861", "IBM861", "cp861", "861", "cp-is", "csIBM861", "windows-861"}, - }, - { - Name: "ibm-862_P100-1995", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05da\u05db\u05dc\u05dd\u05de\u05df\u05e0\u05e1\u05e2\u05e3\u05e4\u05e5\u05e6\u05e7\u05e8\u05e9\u05ea\u00a2\u00a3\u00a5\u20a7\u0192\u00e1\u00ed\u00f3\u00fa\u00f1\u00d1\u00aa\u00ba\u00bf\u2310\u00ac\u00bd\u00bc\u00a1\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u03b1\u00df\u0393\u03c0\u03a3\u03c3\u03bc\u03c4\u03a6\u0398\u03a9\u03b4\u221e\u03c6\u03b5\u2229\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u00a0", - Aliases: []string{"ibm-862_P100-1995", "ibm-862", "IBM862", "cp862", "862", "csPC862LatinHebrew", "DOS-862", "windows-862"}, - }, - { - Name: "ibm-863_P100-1995", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u00c7\u00fc\u00e9\u00e2\u00c2\u00e0\u00b6\u00e7\u00ea\u00eb\u00e8\u00ef\u00ee\u2017\u00c0\u00a7\u00c9\u00c8\u00ca\u00f4\u00cb\u00cf\u00fb\u00f9\u00a4\u00d4\u00dc\u00a2\u00a3\u00d9\u00db\u0192\u00a6\u00b4\u00f3\u00fa\u00a8\u00b8\u00b3\u00af\u00ce\u2310\u00ac\u00bd\u00bc\u00be\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u03b1\u00df\u0393\u03c0\u03a3\u03c3\u03bc\u03c4\u03a6\u0398\u03a9\u03b4\u221e\u03c6\u03b5\u2229\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u00a0", - Aliases: []string{"ibm-863_P100-1995", "ibm-863", "IBM863", "cp863", "863", "csIBM863"}, - }, - { - Name: "ibm-864_X110-1999", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u00b0\u00b7\u2219\u221a\u2592\u2500\u2502\u253c\u2524\u252c\u251c\u2534\u2510\u250c\u2514\u2518\u03b2\u221e\u03c6\u00b1\u00bd\u00bc\u2248\u00ab\u00bb\ufef7\ufef8\ufffd\ufffd\ufefb\ufefc\u200b\u00a0\u00ad\ufe82\u00a3\u00a4\ufe84\ufffd\ufffd\ufe8e\ufe8f\ufe95\ufe99\u060c\ufe9d\ufea1\ufea5\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\ufed1\u061b\ufeb1\ufeb5\ufeb9\u061f\u00a2\ufe80\ufe81\ufe83\ufe85\ufeca\ufe8b\ufe8d\ufe91\ufe93\ufe97\ufe9b\ufe9f\ufea3\ufea7\ufea9\ufeab\ufead\ufeaf\ufeb3\ufeb7\ufebb\ufebf\ufec3\ufec7\ufecb\ufecf\u00a6\u00ac\u00f7\u00d7\ufec9\u0640\ufed3\ufed7\ufedb\ufedf\ufee3\ufee7\ufeeb\ufeed\ufeef\ufef3\ufebd\ufecc\ufece\ufecd\ufee1\ufe7d\ufe7c\ufee5\ufee9\ufeec\ufef0\ufef2\ufed0\ufed5\ufef5\ufef6\ufedd\ufed9\ufef1\u25a0\ufffd", - Aliases: []string{"ibm-864_X110-1999", "ibm-864", "IBM864", "cp864", "csIBM864"}, - }, - { - Name: "ibm-865_P100-1995", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u00c7\u00fc\u00e9\u00e2\u00e4\u00e0\u00e5\u00e7\u00ea\u00eb\u00e8\u00ef\u00ee\u00ec\u00c4\u00c5\u00c9\u00e6\u00c6\u00f4\u00f6\u00f2\u00fb\u00f9\u00ff\u00d6\u00dc\u00f8\u00a3\u00d8\u20a7\u0192\u00e1\u00ed\u00f3\u00fa\u00f1\u00d1\u00aa\u00ba\u00bf\u2310\u00ac\u00bd\u00bc\u00a1\u00ab\u00a4\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u03b1\u00df\u0393\u03c0\u03a3\u03c3\u03bc\u03c4\u03a6\u0398\u03a9\u03b4\u221e\u03c6\u03b5\u2229\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u00a0", - Aliases: []string{"ibm-865_P100-1995", "ibm-865", "IBM865", "cp865", "865", "csIBM865"}, - }, - { - Name: "IBM866", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u044f\u0401\u0451\u0404\u0454\u0407\u0457\u040e\u045e\u00b0\u2219\u00b7\u221a\u2116\u00a4\u25a0\u00a0", - Aliases: []string{"cp866", "866", "csIBM866"}, - }, - { - Name: "ibm-867_P100-1998", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05da\u05db\u05dc\u05dd\u05de\u05df\u05e0\u05e1\u05e2\u05e3\u05e4\u05e5\u05e6\u05e7\u05e8\u05e9\u05ea\u00a2\u00a3\u00a5\ufffd\u20aa\u200e\u200f\u202a\u202b\u202d\u202e\u202c\ufffd\ufffd\u2310\u00ac\u00bd\u00bc\u20ac\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u03b1\u00df\u0393\u03c0\u03a3\u03c3\u03bc\u03c4\u03a6\u0398\u03a9\u03b4\u221e\u03c6\u03b5\u2229\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u00a0", - Aliases: []string{"ibm-867_P100-1998", "ibm-867"}, - }, - { - Name: "ibm-868_P100-1995", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9\u060c\u061b\u061f\ufe81\ufe8d\ufe8e\uf8fb\ufe8f\ufe91\ufb56\ufb58\ufe93\ufe95\ufe97\ufb66\ufb68\ufe99\ufe9b\ufe9d\ufe9f\ufb7a\ufb7c\ufea1\ufea3\ufea5\ufea7\ufea9\ufb88\ufeab\ufead\ufb8c\ufeaf\ufb8a\ufeb1\ufeb3\ufeb5\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\ufeb7\ufeb9\ufebb\ufebd\u2563\u2551\u2557\u255d\ufebf\ufec3\u2510\u2514\u2534\u252c\u251c\u2500\u253c\ufec7\ufec9\u255a\u2554\u2569\u2566\u2560\u2550\u256c\ufeca\ufecb\ufecc\ufecd\ufece\ufecf\ufed0\ufed1\ufed3\ufed5\u2518\u250c\u2588\u2584\ufed7\ufb8e\u2580\ufedb\ufb92\ufb94\ufedd\ufedf\ufee0\ufee1\ufee3\ufb9e\ufee5\ufee7\ufe85\ufeed\ufba6\ufba8\ufba9\u00ad\ufbaa\ufe80\ufe89\ufe8a\ufe8b\ufbfc\ufbfd\ufbfe\ufbb0\ufbae\ufe7c\ufe7d\ufffd\u25a0\u00a0", - Aliases: []string{"ibm-868_P100-1995", "ibm-868", "IBM868", "CP868", "868", "csIBM868", "cp-ar"}, - }, - { - Name: "ibm-869_P100-1995", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0386\ufffd\u0387\u00ac\u00a6\u2018\u2019\u0388\u2015\u0389\u038a\u03aa\u038c\ufffd\ufffd\u038e\u03ab\u00a9\u038f\u00b2\u00b3\u03ac\u00a3\u03ad\u03ae\u03af\u03ca\u0390\u03cc\u03cd\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u00bd\u0398\u0399\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u039a\u039b\u039c\u039d\u2563\u2551\u2557\u255d\u039e\u039f\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u03a0\u03a1\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u03a3\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03b1\u03b2\u03b3\u2518\u250c\u2588\u2584\u03b4\u03b5\u2580\u03b6\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c3\u03c2\u03c4\u00b4\u00ad\u00b1\u03c5\u03c6\u03c7\u00a7\u03c8\u0385\u00b0\u00a8\u03c9\u03cb\u03b0\u03ce\u25a0\u00a0", - Aliases: []string{"ibm-869_P100-1995", "ibm-869", "IBM869", "cp869", "869", "cp-gr", "csIBM869", "windows-869"}, - }, - { - Name: "ibm-870_P100-1995", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u0163\u00e1\u0103\u010d\u00e7\u0107[.<(+!&\u00e9\u0119\u00eb\u016f\u00ed\u00ee\u013e\u013a\u00df]$*);^-/\u00c2\u00c4\u02dd\u00c1\u0102\u010c\u00c7\u0106|,%_>?\u02c7\u00c9\u0118\u00cb\u016e\u00cd\u00ce\u013d\u0139`:#@'=\"\u02d8abcdefghi\u015b\u0148\u0111\u00fd\u0159\u015f\u00b0jklmnopqr\u0142\u0144\u0161\u00b8\u02db\u00a4\u0105~stuvwxyz\u015a\u0147\u0110\u00dd\u0158\u015e\u02d9\u0104\u017c\u0162\u017b\u00a7\u017e\u017a\u017d\u0179\u0141\u0143\u0160\u00a8\u00b4\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u0155\u00f3\u0151}JKLMNOPQR\u011a\u0171\u00fc\u0165\u00fa\u011b\\\u00f7STUVWXYZ\u010f\u00d4\u00d6\u0154\u00d3\u01500123456789\u010e\u0170\u00dc\u0164\u00da\u009f", - Aliases: []string{"ibm-870_P100-1995", "ibm-870", "IBM870", "CP870", "ebcdic-cp-roece", "ebcdic-cp-yu", "csIBM870"}, - }, - { - Name: "ibm-871_P100-1995", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5\u00e7\u00f1\u00de.<(+!&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df\u00c6$*);\u00d6-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00a6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u00f0:#\u00d0'=\"\u00d8abcdefghi\u00ab\u00bb`\u00fd{\u00b1\u00b0jklmnopqr\u00aa\u00ba}\u00b8]\u00a4\u00b5\u00f6stuvwxyz\u00a1\u00bf@\u00dd[\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\\\u00d7\u00feABCDEFGHI\u00ad\u00f4~\u00f2\u00f3\u00f5\u00e6JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\u00b4\u00f7STUVWXYZ\u00b2\u00d4^\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-871_P100-1995", "ibm-871", "IBM871", "ebcdic-cp-is", "csIBM871", "CP871", "ebcdic-is", "871"}, - }, - { - Name: "ibm-874_P100-1995", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0e48\u0e01\u0e02\u0e03\u0e04\u0e05\u0e06\u0e07\u0e08\u0e09\u0e0a\u0e0b\u0e0c\u0e0d\u0e0e\u0e0f\u0e10\u0e11\u0e12\u0e13\u0e14\u0e15\u0e16\u0e17\u0e18\u0e19\u0e1a\u0e1b\u0e1c\u0e1d\u0e1e\u0e1f\u0e20\u0e21\u0e22\u0e23\u0e24\u0e25\u0e26\u0e27\u0e28\u0e29\u0e2a\u0e2b\u0e2c\u0e2d\u0e2e\u0e2f\u0e30\u0e31\u0e32\u0e33\u0e34\u0e35\u0e36\u0e37\u0e38\u0e39\u0e3a\u0e49\u0e4a\u0e4b\u0e4c\u0e3f\u0e40\u0e41\u0e42\u0e43\u0e44\u0e45\u0e46\u0e47\u0e48\u0e49\u0e4a\u0e4b\u0e4c\u0e4d\u0e4e\u0e4f\u0e50\u0e51\u0e52\u0e53\u0e54\u0e55\u0e56\u0e57\u0e58\u0e59\u0e5a\u0e5b\u00a2\u00ac\u00a6\u00a0", - Aliases: []string{"ibm-874_P100-1995", "ibm-874", "ibm-9066", "cp874", "tis620.2533", "eucTH"}, - }, - { - Name: "ibm-875_P100-1995", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399[.<(+!&\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3]$*);^-/\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03aa\u03ab|,%_>?\u00a8\u0386\u0388\u0389\u00a0\u038a\u038c\u038e\u038f`:#@'=\"\u0385abcdefghi\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u00b0jklmnopqr\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u00b4~stuvwxyz\u03bd\u03be\u03bf\u03c0\u03c1\u03c3\u00a3\u03ac\u03ad\u03ae\u03ca\u03af\u03cc\u03cd\u03cb\u03ce\u03c2\u03c4\u03c5\u03c6\u03c7\u03c8{ABCDEFGHI\u00ad\u03c9\u0390\u03b0\u2018\u2015}JKLMNOPQR\u00b1\u00bd\ufffd\u0387\u2019\u00a6\\\ufffdSTUVWXYZ\u00b2\u00a7\ufffd\ufffd\u00ab\u00ac0123456789\u00b3\u00a9\ufffd\ufffd\u00bb\u009f", - Aliases: []string{"ibm-875_P100-1995", "ibm-875", "IBM875", "cp875", "875"}, - }, - { - Name: "ibm-901_P100-1999", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u201d\u00a2\u00a3\u20ac\u201e\u00a6\u00a7\u00d8\u00a9\u0156\u00ab\u00ac\u00ad\u00ae\u00c6\u00b0\u00b1\u00b2\u00b3\u201c\u00b5\u00b6\u00b7\u00f8\u00b9\u0157\u00bb\u00bc\u00bd\u00be\u00e6\u0104\u012e\u0100\u0106\u00c4\u00c5\u0118\u0112\u010c\u00c9\u0179\u0116\u0122\u0136\u012a\u013b\u0160\u0143\u0145\u00d3\u014c\u00d5\u00d6\u00d7\u0172\u0141\u015a\u016a\u00dc\u017b\u017d\u00df\u0105\u012f\u0101\u0107\u00e4\u00e5\u0119\u0113\u010d\u00e9\u017a\u0117\u0123\u0137\u012b\u013c\u0161\u0144\u0146\u00f3\u014d\u00f5\u00f6\u00f7\u0173\u0142\u015b\u016b\u00fc\u017c\u017e\u2019", - Aliases: []string{"ibm-901_P100-1999", "ibm-901"}, - }, - { - Name: "ibm-902_P100-1999", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u00a1\u00a2\u00a3\u20ac\u00a5\u00a6\u00a7\u00a8\u00a9\u00aa\u00ab\u00ac\u00ad\u00ae\u00af\u00b0\u00b1\u00b2\u00b3\u00b4\u00b5\u00b6\u00b7\u00b8\u00b9\u00ba\u00bb\u00bc\u00bd\u00be\u00bf\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf\u0160\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d7\u00d8\u00d9\u00da\u00db\u00dc\u00dd\u017d\u00df\u00e0\u00e1\u00e2\u00e3\u00e4\u00e5\u00e6\u00e7\u00e8\u00e9\u00ea\u00eb\u00ec\u00ed\u00ee\u00ef\u0161\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f7\u00f8\u00f9\u00fa\u00fb\u00fc\u00fd\u017e\u00ff", - Aliases: []string{"ibm-902_P100-1999", "ibm-902"}, - }, - { - Name: "ibm-916_P100-1995", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\ufffd\u00a2\u00a3\u00a4\u00a5\u00a6\u00a7\u00a8\u00a9\u00d7\u00ab\u00ac\u00ad\u00ae\u203e\u00b0\u00b1\u00b2\u00b3\u00b4\u00b5\u00b6\u2022\u00b8\u00b9\u00f7\u00bb\u00bc\u00bd\u00be\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u2017\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05da\u05db\u05dc\u05dd\u05de\u05df\u05e0\u05e1\u05e2\u05e3\u05e4\u05e5\u05e6\u05e7\u05e8\u05e9\u05ea\ufffd\ufffd\ufffd\ufffd\ufffd", - Aliases: []string{"ibm-916_P100-1995", "ibm-916", "cp916", "916"}, - }, - { - Name: "ibm-918_P100-1995", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u060c\u061b\u061f\ufe81\ufe8d\ufe8e\uf8fb\ufe8f[.<(+!&\ufe91\ufb56\ufb58\ufe93\ufe95\ufe97\ufb66\ufb68\ufe99]$*);^-/\ufe9b\ufe9d\ufe9f\ufb7a\ufb7c\ufea1\ufea3\ufea5`,%_>?\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9:#@'=\"\ufea7abcdefghi\ufea9\ufb88\ufeab\ufead\ufb8c\ufeaf\ufb8ajklmnopqr\ufeb1\ufeb3\ufeb5\ufeb7\ufeb9\ufebb\ufebd~stuvwxyz\ufebf\ufec3\ufec7\ufec9\ufeca\ufecb\ufecc\ufecd\ufece\ufecf\ufed0\ufed1\ufed3\ufed5\ufed7\ufb8e\ufedb|\ufb92\ufb94\ufedd\ufedf{ABCDEFGHI\u00ad\ufee0\ufee1\ufee3\ufb9e\ufee5}JKLMNOPQR\ufee7\ufe85\ufeed\ufba6\ufba8\ufba9\\\ufbaaSTUVWXYZ\ufe80\ufe89\ufe8a\ufe8b\ufbfc\ufbfd0123456789\ufbfe\ufbb0\ufbae\ufe7c\ufe7d\u009f", - Aliases: []string{"ibm-918_P100-1995", "ibm-918", "IBM918", "CP918", "ebcdic-cp-ar2", "csIBM918"}, - }, - { - Name: "ibm-922_P100-1999", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u00a1\u00a2\u00a3\u00a4\u00a5\u00a6\u00a7\u00a8\u00a9\u00aa\u00ab\u00ac\u00ad\u00ae\u00af\u00b0\u00b1\u00b2\u00b3\u00b4\u00b5\u00b6\u00b7\u00b8\u00b9\u00ba\u00bb\u00bc\u00bd\u00be\u00bf\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf\u0160\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d7\u00d8\u00d9\u00da\u00db\u00dc\u00dd\u017d\u00df\u00e0\u00e1\u00e2\u00e3\u00e4\u00e5\u00e6\u00e7\u00e8\u00e9\u00ea\u00eb\u00ec\u00ed\u00ee\u00ef\u0161\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f7\u00f8\u00f9\u00fa\u00fb\u00fc\u00fd\u017e\u00ff", - Aliases: []string{"ibm-922_P100-1999", "ibm-922", "IBM922", "cp922", "922"}, - }, - { - Name: "ibm-1006_P100-1995", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9\u060c\u061b\u00ad\u061f\ufe81\ufe8d\ufe8e\uf8fb\ufe8f\ufe91\ufb56\ufb58\ufe93\ufe95\ufe97\ufb66\ufb68\ufe99\ufe9b\ufe9d\ufe9f\ufb7a\ufb7c\ufea1\ufea3\ufea5\ufea7\ufea9\ufb88\ufeab\ufead\ufb8c\ufeaf\ufb8a\ufeb1\ufeb3\ufeb5\ufeb7\ufeb9\ufebb\ufebd\ufebf\ufec3\ufec7\ufec9\ufeca\ufecb\ufecc\ufecd\ufece\ufecf\ufed0\ufed1\ufed3\ufed5\ufed7\ufb8e\ufedb\ufb92\ufb94\ufedd\ufedf\ufee0\ufee1\ufee3\ufb9e\ufee5\ufee7\ufe85\ufeed\ufba6\ufba8\ufba9\ufbaa\ufe80\ufe89\ufe8a\ufe8b\ufbfc\ufbfd\ufbfe\ufbb0\ufbae\ufe7c\ufe7d", - Aliases: []string{"ibm-1006_P100-1995", "ibm-1006", "IBM1006", "cp1006", "1006"}, - }, - { - Name: "ibm-1025_P100-1995", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u0452\u0453\u0451\u0454\u0455\u0456\u0457\u0458[.<(+!&\u0459\u045a\u045b\u045c\u045e\u045f\u042a\u2116\u0402]$*);^-/\u0403\u0401\u0404\u0405\u0406\u0407\u0408\u0409|,%_>?\u040a\u040b\u040c\u00ad\u040e\u040f\u044e\u0430\u0431`:#@'=\"\u0446abcdefghi\u0434\u0435\u0444\u0433\u0445\u0438\u0439jklmnopqr\u043a\u043b\u043c\u043d\u043e\u043f\u044f~stuvwxyz\u0440\u0441\u0442\u0443\u0436\u0432\u044c\u044b\u0437\u0448\u044d\u0449\u0447\u044a\u042e\u0410\u0411\u0426\u0414\u0415\u0424\u0413{ABCDEFGHI\u0425\u0418\u0419\u041a\u041b\u041c}JKLMNOPQR\u041d\u041e\u041f\u042f\u0420\u0421\\\u00a7STUVWXYZ\u0422\u0423\u0416\u0412\u042c\u042b0123456789\u0417\u0428\u042d\u0429\u0427\u009f", - Aliases: []string{"ibm-1025_P100-1995", "ibm-1025", "cp1025", "1025"}, - }, - { - Name: "ibm-1026_P100-1995", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5{\u00f1\u00c7.<(+!&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df\u011e\u0130*);^-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5[\u00d1\u015f,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u0131:\u00d6\u015e'=\u00dc\u00d8abcdefghi\u00ab\u00bb}`\u00a6\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u00a4\u00b5\u00f6stuvwxyz\u00a1\u00bf]$@\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7\u00e7ABCDEFGHI\u00ad\u00f4~\u00f2\u00f3\u00f5\u011fJKLMNOPQR\u00b9\u00fb\\\u00f9\u00fa\u00ff\u00fc\u00f7STUVWXYZ\u00b2\u00d4#\u00d2\u00d3\u00d50123456789\u00b3\u00db\"\u00d9\u00da\u009f", - Aliases: []string{"ibm-1026_P100-1995", "ibm-1026", "IBM1026", "CP1026", "csIBM1026", "1026"}, - }, - { - Name: "ibm-1047_P100-1995", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5\u00e7\u00f1\u00a2.<(+|&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df!$*);^-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00a6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:#@'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u00a4\u00b5~stuvwxyz\u00a1\u00bf\u00d0[\u00de\u00ae\u00ac\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be\u00dd\u00a8\u00af]\u00b4\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5}JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-1047_P100-1995", "ibm-1047", "IBM1047", "cp1047", "1047"}, - }, - { - Name: "ibm-1097_P100-1995", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u060c\u064b\ufe81\ufe82\uf8fa\ufe8d\ufe8e\uf8fb\u00a4.<(+|&\ufe80\ufe83\ufe84\uf8f9\ufe85\ufe8b\ufe8f\ufe91\ufb56!$*);\u00ac-/\ufb58\ufe95\ufe97\ufe99\ufe9b\ufe9d\ufe9f\ufb7a\u061b,%_>?\ufb7c\ufea1\ufea3\ufea5\ufea7\ufea9\ufeab\ufead\ufeaf`:#@'=\"\ufb8aabcdefghi\u00ab\u00bb\ufeb1\ufeb3\ufeb5\ufeb7\ufeb9jklmnopqr\ufebb\ufebd\ufebf\ufec1\ufec3\ufec5\ufec7~stuvwxyz\ufec9\ufeca\ufecb\ufecc\ufecd\ufece\ufecf\ufed0\ufed1\ufed3\ufed5\ufed7\ufb8e\ufedb\ufb92\ufb94[]\ufedd\ufedf\ufee1\u00d7{ABCDEFGHI\u00ad\ufee3\ufee5\ufee7\ufeed\ufee9}JKLMNOPQR\ufeeb\ufeec\ufba4\ufbfc\ufbfd\ufbfe\\\u061fSTUVWXYZ\u0640\u06f0\u06f1\u06f2\u06f3\u06f40123456789\u06f5\u06f6\u06f7\u06f8\u06f9\u009f", - Aliases: []string{"ibm-1097_P100-1995", "ibm-1097", "cp1097", "1097"}, - }, - { - Name: "ibm-1098_P100-1995", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\ufffd\ufffd\u060c\u061b\u061f\u064b\ufe81\ufe82\uf8fa\ufe8d\ufe8e\uf8fb\ufe80\ufe83\ufe84\uf8f9\ufe85\ufe8b\ufe8f\ufe91\ufb56\ufb58\ufe95\ufe97\ufe99\ufe9b\ufe9d\ufe9f\ufb7a\ufb7c\u00d7\ufea1\ufea3\ufea5\ufea7\ufea9\ufeab\ufead\ufeaf\ufb8a\ufeb1\ufeb3\ufeb5\ufeb7\ufeb9\ufebb\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\ufebd\ufebf\ufec1\ufec3\u2563\u2551\u2557\u255d\u00a4\ufec5\u2510\u2514\u2534\u252c\u251c\u2500\u253c\ufec7\ufec9\u255a\u2554\u2569\u2566\u2560\u2550\u256c\ufffd\ufeca\ufecb\ufecc\ufecd\ufece\ufecf\ufed0\ufed1\ufed3\u2518\u250c\u2588\u2584\ufed5\ufed7\u2580\ufb8e\ufedb\ufb92\ufb94\ufedd\ufedf\ufee1\ufee3\ufee5\ufee7\ufeed\ufee9\ufeeb\ufeec\ufba4\ufbfc\u00ad\ufbfd\ufbfe\u0640\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9\u25a0\u00a0", - Aliases: []string{"ibm-1098_P100-1995", "ibm-1098", "IBM1098", "cp1098", "1098"}, - }, - { - Name: "ibm-1112_P100-1995", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u0161\u00e4\u0105\u012f\u016b\u00e5\u0113\u017e\u00a2.<(+|&\u00e9\u0119\u0117\u010d\u0173\u201e\u201c\u0123\u00df!$*);\u00ac-/\u0160\u00c4\u0104\u012e\u016a\u00c5\u0112\u017d\u00a6,%_>?\u00f8\u00c9\u0118\u0116\u010c\u0172\u012a\u013b\u0122`:#@'=\"\u00d8abcdefghi\u00ab\u00bb\u0101\u017c\u0144\u00b1\u00b0jklmnopqr\u0156\u0157\u00e6\u0137\u00c6\u00a4\u00b5~stuvwxyz\u201d\u017a\u0100\u017b\u0143\u00ae^\u00a3\u012b\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be[]\u0179\u0136\u013c\u00d7{ABCDEFGHI\u00ad\u014d\u00f6\u0146\u00f3\u00f5}JKLMNOPQR\u00b9\u0107\u00fc\u0142\u015b\u2019\\\u00f7STUVWXYZ\u00b2\u014c\u00d6\u0145\u00d3\u00d50123456789\u00b3\u0106\u00dc\u0141\u015a\u009f", - Aliases: []string{"ibm-1112_P100-1995", "ibm-1112", "cp1112", "1112"}, - }, - { - Name: "ibm-1122_P100-1999", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2{\u00e0\u00e1\u00e3}\u00e7\u00f1\u00a7.<(+!&`\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df\u00a4\u00c5*);^-/\u00c2#\u00c0\u00c1\u00c3$\u00c7\u00d1\u00f6,%_>?\u00f8\\\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u00e9:\u00c4\u00d6'=\"\u00d8abcdefghi\u00ab\u00bb\u0161\u00fd\u017e\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6]\u00b5\u00fcstuvwxyz\u00a1\u00bf\u0160\u00dd\u017d\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9[\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7\u00e4ABCDEFGHI\u00ad\u00f4\u00a6\u00f2\u00f3\u00f5\u00e5JKLMNOPQR\u00b9\u00fb~\u00f9\u00fa\u00ff\u00c9\u00f7STUVWXYZ\u00b2\u00d4@\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-1122_P100-1999", "ibm-1122", "cp1122", "1122"}, - }, - { - Name: "ibm-1123_P100-1995", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u0452\u0491\u0451\u0454\u0455\u0456\u0457\u0458[.<(+!&\u0459\u045a\u045b\u045c\u045e\u045f\u042a\u2116\u0402]$*);^-/\u0490\u0401\u0404\u0405\u0406\u0407\u0408\u0409|,%_>?\u040a\u040b\u040c\u00ad\u040e\u040f\u044e\u0430\u0431`:#@'=\"\u0446abcdefghi\u0434\u0435\u0444\u0433\u0445\u0438\u0439jklmnopqr\u043a\u043b\u043c\u043d\u043e\u043f\u044f~stuvwxyz\u0440\u0441\u0442\u0443\u0436\u0432\u044c\u044b\u0437\u0448\u044d\u0449\u0447\u044a\u042e\u0410\u0411\u0426\u0414\u0415\u0424\u0413{ABCDEFGHI\u0425\u0418\u0419\u041a\u041b\u041c}JKLMNOPQR\u041d\u041e\u041f\u042f\u0420\u0421\\\u00a7STUVWXYZ\u0422\u0423\u0416\u0412\u042c\u042b0123456789\u0417\u0428\u042d\u0429\u0427\u009f", - Aliases: []string{"ibm-1123_P100-1995", "ibm-1123", "cp1123", "1123"}, - }, - { - Name: "ibm-1124_P100-1996", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u0401\u0402\u0490\u0404\u0405\u0406\u0407\u0408\u0409\u040a\u040b\u040c\u00ad\u040e\u040f\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u044f\u2116\u0451\u0452\u0491\u0454\u0455\u0456\u0457\u0458\u0459\u045a\u045b\u045c\u00a7\u045e\u045f", - Aliases: []string{"ibm-1124_P100-1996", "ibm-1124", "cp1124", "1124"}, - }, - { - Name: "ibm-1125_P100-1997", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u044f\u0401\u0451\u0490\u0491\u0404\u0454\u0406\u0456\u0407\u0457\u00f7\u00b1\u2116\u00a4\u25a0\u00a0", - Aliases: []string{"ibm-1125_P100-1997", "ibm-1125", "cp1125"}, - }, - { - Name: "ibm-1129_P100-1997", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u00a1\u00a2\u00a3\u00a4\u00a5\u00a6\u00a7\u0153\u00a9\u00aa\u00ab\u00ac\u00ad\u00ae\u00af\u00b0\u00b1\u00b2\u00b3\u0178\u00b5\u00b6\u00b7\u0152\u00b9\u00ba\u00bb\u00bc\u00bd\u00be\u00bf\u00c0\u00c1\u00c2\u0102\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u0300\u00cd\u00ce\u00cf\u0110\u00d1\u0309\u00d3\u00d4\u01a0\u00d6\u00d7\u00d8\u00d9\u00da\u00db\u00dc\u01af\u0303\u00df\u00e0\u00e1\u00e2\u0103\u00e4\u00e5\u00e6\u00e7\u00e8\u00e9\u00ea\u00eb\u0301\u00ed\u00ee\u00ef\u0111\u00f1\u0323\u00f3\u00f4\u01a1\u00f6\u00f7\u00f8\u00f9\u00fa\u00fb\u00fc\u01b0\u20ab\u00ff", - Aliases: []string{"ibm-1129_P100-1997", "ibm-1129"}, - }, - { - Name: "ibm-1130_P100-1997", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u0103\u00e5\u00e7\u00f1[.<(+!&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u0303\u00df]$*);^-/\u00c2\u00c4\u00c0\u00c1\u0102\u00c5\u00c7\u00d1\u00a6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u20ab`:#@'=\"\u00d8abcdefghi\u00ab\u00bb\u0111\u0309\u0300\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u0152\u00c6\u00a4\u00b5~stuvwxyz\u00a1\u00bf\u0110\u0323\u0301\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u0153\u0178\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u01b0\u00f3\u01a1}JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u01af\u00d3\u01a00123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-1130_P100-1997", "ibm-1130"}, - }, - { - Name: "ibm-1131_P100-1997", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u044f\u0401\u0451\u0404\u0454\u0407\u0457\u040e\u045e\u0406\u0456\u00b7\u00a4\u0490\u0491\u2219\u00a0", - Aliases: []string{"ibm-1131_P100-1997", "ibm-1131", "cp1131"}, - }, - { - Name: "ibm-1132_P100-1998", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u0e81\u0e82\u0e84\u0e87\u0e88\u0eaa\u0e8a[\u00a2.<(+|&\ufffd\u0e8d\u0e94\u0e95\u0e96\u0e97\u0e99\u0e9a]!$*);\u00ac-/\u0e9b\u0e9c\u0e9d\u0e9e\u0e9f\u0ea1\u0ea2^\u00a6,%_>?\u20ad\ufffd\u0ea3\u0ea5\u0ea7\u0eab\u0ead\u0eae\ufffd`:#@'=\"\ufffdabcdefghi\ufffd\ufffd\u0eaf\u0eb0\u0eb2\u0eb3\ufffdjklmnopqr\u0eb4\u0eb5\u0eb6\u0eb7\u0eb8\u0eb9\ufffd~stuvwxyz\u0ebc\u0eb1\u0ebb\u0ebd\ufffd\ufffd\u0ed0\u0ed1\u0ed2\u0ed3\u0ed4\u0ed5\u0ed6\u0ed7\u0ed8\u0ed9\ufffd\u0ec0\u0ec1\u0ec2\u0ec3\u0ec4{ABCDEFGHI\ufffd\u0ec8\u0ec9\u0eca\u0ecb\u0ecc}JKLMNOPQR\u0ecd\u0ec6\ufffd\u0edc\u0edd\ufffd\\\ufffdSTUVWXYZ\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0123456789\ufffd\ufffd\ufffd\ufffd\ufffd\u009f", - Aliases: []string{"ibm-1132_P100-1998", "ibm-1132"}, - }, - { - Name: "ibm-1133_P100-1997", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\ufffd\u0e81\u0e82\u0e84\u0e87\u0e88\u0eaa\u0e8a\u0e8d\u0e94\u0e95\u0e96\u0e97\u0e99\u0e9a\u0e9b\u0e9c\u0e9d\u0e9e\u0e9f\u0ea1\u0ea2\u0ea3\u0ea5\u0ea7\u0eab\u0ead\u0eae\ufffd\ufffd\ufffd\u0eaf\u0eb0\u0eb2\u0eb3\u0eb4\u0eb5\u0eb6\u0eb7\u0eb8\u0eb9\u0ebc\u0eb1\u0ebb\u0ebd\ufffd\ufffd\ufffd\u0ec0\u0ec1\u0ec2\u0ec3\u0ec4\u0ec8\u0ec9\u0eca\u0ecb\u0ecc\u0ecd\u0ec6\ufffd\u0edc\u0eddk\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0ed0\u0ed1\u0ed2\u0ed3\u0ed4\u0ed5\u0ed6\u0ed7\u0ed8\u0ed9\ufffd\ufffd\u00a2\u00ac\u00a6\u00a0", - Aliases: []string{"ibm-1133_P100-1997", "ibm-1133"}, - }, - { - Name: "ibm-1137_P100-1999", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u0901\u0902\u0903\u0905\u0906\u0907\u0908\u0909\u090a.<(+|&\u090b\u090c\u090d\u090e\u090f\u0910\u0911\u0912\u0913!$*);^-/\u0914\u0915\u0916\u0917\u0918\u0919\u091a\u091b\u091c,%_>?\u091d\u091e\u091f\u0920\u0921\u0922\u0923\u0924\u0925`:#@'=\"\u0926abcdefghi\u0927\u0928\u092a\u092b\u092c\u092d\u092ejklmnopqr\u092f\u0930\u0932\u0933\u0935\u0936\u200c~stuvwxyz\u0937\u0938\u0939[\u093c\u093d\u093e\u093f\u0940\u0941\u0942\u0943\u0944\u0945\u0946\u0947\u0948\u0949\u094a]\u094b\u094c{ABCDEFGHI\u094d\u0950\u0951\u0952\ufffd\ufffd}JKLMNOPQR\u0960\u0961\u0962\u0963\u0964\u0965\\\u200dSTUVWXYZ\u0966\u0967\u0968\u0969\u096a\u096b0123456789\u096c\u096d\u096e\u096f\u0970\u009f", - Aliases: []string{"ibm-1137_P100-1999", "ibm-1137"}, - }, - { - Name: "ibm-1140_P100-1997", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5\u00e7\u00f1\u00a2.<(+|&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df!$*);\u00ac-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00a6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:#@'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u20ac\u00b5~stuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae^\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be[]\u00af\u00a8\u00b4\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5}JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-1140_P100-1997", "ibm-1140", "IBM01140", "CCSID01140", "CP01140", "cp1140", "ebcdic-us-37+euro"}, - }, - { - Name: "ibm-1141_P100-1997", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2{\u00e0\u00e1\u00e3\u00e5\u00e7\u00f1\u00c4.<(+!&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec~\u00dc$*);^-/\u00c2[\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00f6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:#\u00a7'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u20ac\u00b5\u00dfstuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9@\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7\u00e4ABCDEFGHI\u00ad\u00f4\u00a6\u00f2\u00f3\u00f5\u00fcJKLMNOPQR\u00b9\u00fb}\u00f9\u00fa\u00ff\u00d6\u00f7STUVWXYZ\u00b2\u00d4\\\u00d2\u00d3\u00d50123456789\u00b3\u00db]\u00d9\u00da\u009f", - Aliases: []string{"ibm-1141_P100-1997", "ibm-1141", "IBM01141", "CCSID01141", "CP01141", "cp1141", "ebcdic-de-273+euro"}, - }, - { - Name: "ibm-1142_P100-1997", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3}\u00e7\u00f1#.<(+!&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df\u20ac\u00c5*);^-/\u00c2\u00c4\u00c0\u00c1\u00c3$\u00c7\u00d1\u00f8,%_>?\u00a6\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:\u00c6\u00d8'=\"@abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba{\u00b8[]\u00b5\u00fcstuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7\u00e6ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5\u00e5JKLMNOPQR\u00b9\u00fb~\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-1142_P100-1997", "ibm-1142", "IBM01142", "CCSID01142", "CP01142", "cp1142", "ebcdic-dk-277+euro", "ebcdic-no-277+euro"}, - }, - { - Name: "ibm-1143_P100-1997", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2{\u00e0\u00e1\u00e3}\u00e7\u00f1\u00a7.<(+!&`\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df\u20ac\u00c5*);^-/\u00c2#\u00c0\u00c1\u00c3$\u00c7\u00d1\u00f6,%_>?\u00f8\\\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u00e9:\u00c4\u00d6'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6]\u00b5\u00fcstuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9[\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7\u00e4ABCDEFGHI\u00ad\u00f4\u00a6\u00f2\u00f3\u00f5\u00e5JKLMNOPQR\u00b9\u00fb~\u00f9\u00fa\u00ff\u00c9\u00f7STUVWXYZ\u00b2\u00d4@\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-1143_P100-1997", "ibm-1143", "IBM01143", "CCSID01143", "CP01143", "cp1143", "ebcdic-fi-278+euro", "ebcdic-se-278+euro"}, - }, - { - Name: "ibm-1144_P100-1997", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4{\u00e1\u00e3\u00e5\\\u00f1\u00b0.<(+!&]\u00ea\u00eb}\u00ed\u00ee\u00ef~\u00df\u00e9$*);^-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00f2,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u00f9:\u00a3\u00a7'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1[jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u20ac\u00b5\u00ecstuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2#\u00a5\u00b7\u00a9@\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7\u00e0ABCDEFGHI\u00ad\u00f4\u00f6\u00a6\u00f3\u00f5\u00e8JKLMNOPQR\u00b9\u00fb\u00fc`\u00fa\u00ff\u00e7\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-1144_P100-1997", "ibm-1144", "IBM01144", "CCSID01144", "CP01144", "cp1144", "ebcdic-it-280+euro"}, - }, - { - Name: "ibm-1145_P100-1997", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5\u00e7\u00a6[.<(+|&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df]$*);\u00ac-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7#\u00f1,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:\u00d1@'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u20ac\u00b5\u00a8stuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be^!\u00af~\u00b4\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5}JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-1145_P100-1997", "ibm-1145", "IBM01145", "CCSID01145", "CP01145", "cp1145", "ebcdic-es-284+euro"}, - }, - { - Name: "ibm-1146_P100-1997", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5\u00e7\u00f1$.<(+|&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df!\u00a3*);\u00ac-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00a6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:#@'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u20ac\u00b5\u00afstuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2[\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be^]~\u00a8\u00b4\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5}JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-1146_P100-1997", "ibm-1146", "IBM01146", "CCSID01146", "CP01146", "cp1146", "ebcdic-gb-285+euro"}, - }, - { - Name: "ibm-1147_P100-1997", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4@\u00e1\u00e3\u00e5\\\u00f1\u00b0.<(+!&{\u00ea\u00eb}\u00ed\u00ee\u00ef\u00ec\u00df\u00a7$*);^-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00f9,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u00b5:\u00a3\u00e0'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1[jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u20ac`\u00a8stuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2#\u00a5\u00b7\u00a9]\u00b6\u00bc\u00bd\u00be\u00ac|\u00af~\u00b4\u00d7\u00e9ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5\u00e8JKLMNOPQR\u00b9\u00fb\u00fc\u00a6\u00fa\u00ff\u00e7\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-1147_P100-1997", "ibm-1147", "IBM01147", "CCSID01147", "CP01147", "cp1147", "ebcdic-fr-297+euro"}, - }, - { - Name: "ibm-1148_P100-1997", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5\u00e7\u00f1[.<(+!&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df]$*);^-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00a6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:#@'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u20ac\u00b5~stuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5}JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-1148_P100-1997", "ibm-1148", "IBM01148", "CCSID01148", "CP01148", "cp1148", "ebcdic-international-500+euro"}, - }, - { - Name: "ibm-1149_P100-1997", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5\u00e7\u00f1\u00de.<(+!&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df\u00c6$*);\u00d6-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00a6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u00f0:#\u00d0'=\"\u00d8abcdefghi\u00ab\u00bb`\u00fd{\u00b1\u00b0jklmnopqr\u00aa\u00ba}\u00b8]\u20ac\u00b5\u00f6stuvwxyz\u00a1\u00bf@\u00dd[\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\\\u00d7\u00feABCDEFGHI\u00ad\u00f4~\u00f2\u00f3\u00f5\u00e6JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\u00b4\u00f7STUVWXYZ\u00b2\u00d4^\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-1149_P100-1997", "ibm-1149", "IBM01149", "CCSID01149", "CP01149", "cp1149", "ebcdic-is-871+euro"}, - }, - { - Name: "ibm-1153_P100-1999", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u0163\u00e1\u0103\u010d\u00e7\u0107[.<(+!&\u00e9\u0119\u00eb\u016f\u00ed\u00ee\u013e\u013a\u00df]$*);^-/\u00c2\u00c4\u02dd\u00c1\u0102\u010c\u00c7\u0106|,%_>?\u02c7\u00c9\u0118\u00cb\u016e\u00cd\u00ce\u013d\u0139`:#@'=\"\u02d8abcdefghi\u015b\u0148\u0111\u00fd\u0159\u015f\u00b0jklmnopqr\u0142\u0144\u0161\u00b8\u02db\u20ac\u0105~stuvwxyz\u015a\u0147\u0110\u00dd\u0158\u015e\u02d9\u0104\u017c\u0162\u017b\u00a7\u017e\u017a\u017d\u0179\u0141\u0143\u0160\u00a8\u00b4\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u0155\u00f3\u0151}JKLMNOPQR\u011a\u0171\u00fc\u0165\u00fa\u011b\\\u00f7STUVWXYZ\u010f\u00d4\u00d6\u0154\u00d3\u01500123456789\u010e\u0170\u00dc\u0164\u00da\u009f", - Aliases: []string{"ibm-1153_P100-1999", "ibm-1153"}, - }, - { - Name: "ibm-1154_P100-1999", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u0452\u0453\u0451\u0454\u0455\u0456\u0457\u0458[.<(+!&\u0459\u045a\u045b\u045c\u045e\u045f\u042a\u2116\u0402]$*);^-/\u0403\u0401\u0404\u0405\u0406\u0407\u0408\u0409|,%_>?\u040a\u040b\u040c\u00ad\u040e\u040f\u044e\u0430\u0431`:#@'=\"\u0446abcdefghi\u0434\u0435\u0444\u0433\u0445\u0438\u0439jklmnopqr\u043a\u043b\u043c\u043d\u043e\u043f\u044f~stuvwxyz\u0440\u0441\u0442\u0443\u0436\u0432\u044c\u044b\u0437\u0448\u044d\u0449\u0447\u044a\u042e\u0410\u0411\u0426\u0414\u0415\u0424\u0413{ABCDEFGHI\u0425\u0418\u0419\u041a\u041b\u041c}JKLMNOPQR\u041d\u041e\u041f\u042f\u0420\u0421\\\u20acSTUVWXYZ\u0422\u0423\u0416\u0412\u042c\u042b0123456789\u0417\u0428\u042d\u0429\u0427\u009f", - Aliases: []string{"ibm-1154_P100-1999", "ibm-1154"}, - }, - { - Name: "ibm-1155_P100-1999", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5{\u00f1\u00c7.<(+!&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df\u011e\u0130*);^-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5[\u00d1\u015f,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u0131:\u00d6\u015e'=\u00dc\u00d8abcdefghi\u00ab\u00bb}`\u00a6\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u20ac\u00b5\u00f6stuvwxyz\u00a1\u00bf]$@\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7\u00e7ABCDEFGHI\u00ad\u00f4~\u00f2\u00f3\u00f5\u011fJKLMNOPQR\u00b9\u00fb\\\u00f9\u00fa\u00ff\u00fc\u00f7STUVWXYZ\u00b2\u00d4#\u00d2\u00d3\u00d50123456789\u00b3\u00db\"\u00d9\u00da\u009f", - Aliases: []string{"ibm-1155_P100-1999", "ibm-1155"}, - }, - { - Name: "ibm-1156_P100-1999", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u0161\u00e4\u0105\u012f\u016b\u00e5\u0113\u017e\u00a2.<(+|&\u00e9\u0119\u0117\u010d\u0173\u201e\u201c\u0123\u00df!$*);\u00ac-/\u0160\u00c4\u0104\u012e\u016a\u00c5\u0112\u017d\u00a6,%_>?\u00f8\u00c9\u0118\u0116\u010c\u0172\u012a\u013b\u0122`:#@'=\"\u00d8abcdefghi\u00ab\u00bb\u0101\u017c\u0144\u00b1\u00b0jklmnopqr\u0156\u0157\u00e6\u0137\u00c6\u20ac\u00b5~stuvwxyz\u201d\u017a\u0100\u017b\u0143\u00ae^\u00a3\u012b\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be[]\u0179\u0136\u013c\u00d7{ABCDEFGHI\u00ad\u014d\u00f6\u0146\u00f3\u00f5}JKLMNOPQR\u00b9\u0107\u00fc\u0142\u015b\u2019\\\u00f7STUVWXYZ\u00b2\u014c\u00d6\u0145\u00d3\u00d50123456789\u00b3\u0106\u00dc\u0141\u015a\u009f", - Aliases: []string{"ibm-1156_P100-1999", "ibm-1156"}, - }, - { - Name: "ibm-1157_P100-1999", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2{\u00e0\u00e1\u00e3}\u00e7\u00f1\u00a7.<(+!&`\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df\u20ac\u00c5*);^-/\u00c2#\u00c0\u00c1\u00c3$\u00c7\u00d1\u00f6,%_>?\u00f8\\\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u00e9:\u00c4\u00d6'=\"\u00d8abcdefghi\u00ab\u00bb\u0161\u00fd\u017e\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6]\u00b5\u00fcstuvwxyz\u00a1\u00bf\u0160\u00dd\u017d\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9[\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7\u00e4ABCDEFGHI\u00ad\u00f4\u00a6\u00f2\u00f3\u00f5\u00e5JKLMNOPQR\u00b9\u00fb~\u00f9\u00fa\u00ff\u00c9\u00f7STUVWXYZ\u00b2\u00d4@\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-1157_P100-1999", "ibm-1157"}, - }, - { - Name: "ibm-1158_P100-1999", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u0452\u0491\u0451\u0454\u0455\u0456\u0457\u0458[.<(+!&\u0459\u045a\u045b\u045c\u045e\u045f\u042a\u2116\u0402]$*);^-/\u0490\u0401\u0404\u0405\u0406\u0407\u0408\u0409|,%_>?\u040a\u040b\u040c\u00ad\u040e\u040f\u044e\u0430\u0431`:#@'=\"\u0446abcdefghi\u0434\u0435\u0444\u0433\u0445\u0438\u0439jklmnopqr\u043a\u043b\u043c\u043d\u043e\u043f\u044f~stuvwxyz\u0440\u0441\u0442\u0443\u0436\u0432\u044c\u044b\u0437\u0448\u044d\u0449\u0447\u044a\u042e\u0410\u0411\u0426\u0414\u0415\u0424\u0413{ABCDEFGHI\u0425\u0418\u0419\u041a\u041b\u041c}JKLMNOPQR\u041d\u041e\u041f\u042f\u0420\u0421\\\u20acSTUVWXYZ\u0422\u0423\u0416\u0412\u042c\u042b0123456789\u0417\u0428\u042d\u0429\u0427\u009f", - Aliases: []string{"ibm-1158_P100-1999", "ibm-1158"}, - }, - { - Name: "ibm-1160_P100-1999", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u0e01\u0e02\u0e03\u0e04\u0e05\u0e06\u0e07[\u00a2.<(+|&\u0e48\u0e08\u0e09\u0e0a\u0e0b\u0e0c\u0e0d\u0e0e]!$*);\u00ac-/\u0e0f\u0e10\u0e11\u0e12\u0e13\u0e14\u0e15^\u00a6,%_>?\u0e3f\u0e4e\u0e16\u0e17\u0e18\u0e19\u0e1a\u0e1b\u0e1c`:#@'=\"\u0e4fabcdefghi\u0e1d\u0e1e\u0e1f\u0e20\u0e21\u0e22\u0e5ajklmnopqr\u0e23\u0e24\u0e25\u0e26\u0e27\u0e28\u0e5b~stuvwxyz\u0e29\u0e2a\u0e2b\u0e2c\u0e2d\u0e2e\u0e50\u0e51\u0e52\u0e53\u0e54\u0e55\u0e56\u0e57\u0e58\u0e59\u0e2f\u0e30\u0e31\u0e32\u0e33\u0e34{ABCDEFGHI\u0e49\u0e35\u0e36\u0e37\u0e38\u0e39}JKLMNOPQR\u0e3a\u0e40\u0e41\u0e42\u0e43\u0e44\\\u0e4aSTUVWXYZ\u0e45\u0e46\u0e47\u0e48\u0e49\u0e4a0123456789\u0e4b\u0e4c\u0e4d\u0e4b\u20ac\u009f", - Aliases: []string{"ibm-1160_P100-1999", "ibm-1160"}, - }, - { - Name: "ibm-1162_P100-1999", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u20ac\u0081\u0082\u0083\u0084\u2026\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u2018\u2019\u201c\u201d\u2022\u2013\u2014\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u0e01\u0e02\u0e03\u0e04\u0e05\u0e06\u0e07\u0e08\u0e09\u0e0a\u0e0b\u0e0c\u0e0d\u0e0e\u0e0f\u0e10\u0e11\u0e12\u0e13\u0e14\u0e15\u0e16\u0e17\u0e18\u0e19\u0e1a\u0e1b\u0e1c\u0e1d\u0e1e\u0e1f\u0e20\u0e21\u0e22\u0e23\u0e24\u0e25\u0e26\u0e27\u0e28\u0e29\u0e2a\u0e2b\u0e2c\u0e2d\u0e2e\u0e2f\u0e30\u0e31\u0e32\u0e33\u0e34\u0e35\u0e36\u0e37\u0e38\u0e39\u0e3a\ufffd\ufffd\ufffd\ufffd\u0e3f\u0e40\u0e41\u0e42\u0e43\u0e44\u0e45\u0e46\u0e47\u0e48\u0e49\u0e4a\u0e4b\u0e4c\u0e4d\u0e4e\u0e4f\u0e50\u0e51\u0e52\u0e53\u0e54\u0e55\u0e56\u0e57\u0e58\u0e59\u0e5a\u0e5b\ufffd\ufffd\ufffd\ufffd", - Aliases: []string{"ibm-1162_P100-1999", "ibm-1162"}, - }, - { - Name: "ibm-1164_P100-1999", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u0103\u00e5\u00e7\u00f1[.<(+!&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u0303\u00df]$*);^-/\u00c2\u00c4\u00c0\u00c1\u0102\u00c5\u00c7\u00d1\u00a6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u20ab`:#@'=\"\u00d8abcdefghi\u00ab\u00bb\u0111\u0309\u0300\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u0152\u00c6\u20ac\u00b5~stuvwxyz\u00a1\u00bf\u0110\u0323\u0301\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u0153\u0178\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u01b0\u00f3\u01a1}JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u01af\u00d3\u01a00123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-1164_P100-1999", "ibm-1164"}, - }, - { - Name: "ibm-4517_P100-2005", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\ufe7c\ufe7d\u0640\u200b\ufe80\ufe81\ufe82\ufe83\u00b0.<(+!&\ufe84\ufe85\ufffd\ufffd\ufe8b\ufe8d\ufe8e\ufe8f\ufe91\u00a7$*);^-/\ufe93\ufe95\ufe97\ufe99\ufe9b\ufe9d\ufe9f\ufea1\u00fa,%_>?\ufea3\ufea5\ufea7\ufea9\ufeab\ufead\ufeaf\ufeb1\ufeb3\u00a3:\u00b5\u00e1'=\"\ufeb5abcdefghi\ufeb7\ufeb9\ufebb\ufebd\ufebf\ufec3\ufec7jklmnopqr\ufec9\ufeca\ufecb\ufecc\ufecd\ufece\ufecf\u00a8stuvwxyz\ufed0\ufed1\ufed3\ufed5\ufed7\ufed9\ufedb\ufedd\ufef5\ufef6\ufef7\ufef8\ufffd\ufffd\ufefb\ufefc\ufedf\ufee1\ufee3\ufee5\ufee7\ufee9\u00e9ABCDEFGHI\u00ad\ufeeb\ufffd\ufeec\ufffd\ufeed\u00e8JKLMNOPQR\ufeef\ufef0\ufef1\ufef2\ufef3\ufffd\u00e7\u2007STUVWXYZ\u00f7\u060c\ufffd\u00d7\u061f\u061b0123456789\ufffd\ufffd\ufffd\ufffd\ufffd\u009f", - Aliases: []string{"ibm-4517_P100-2005", "ibm-4517"}, - }, - { - Name: "ibm-4899_P100-1998", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd$.<(+|\u05d0\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd!\u00a2*);\u00ac-/\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd,%_>?\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd:#@'=\"\ufffd\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u05da\u05db\u05dc\u05dd\u05de\u05df\u05e0\u05e1\u05e2\ufffd\ufffd\u20ac\ufffd\u20aa\ufffd\ufffd\ufffd\u05e3\u05e4\u05e5\u05e6\u05e7\u05e8\u05e9\u05ea\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdABCDEFGHI\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdJKLMNOPQR\ufffd\u202d\u202e\u202c\ufffd\ufffd\ufffd\ufffdSTUVWXYZ\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0123456789\ufffd\u202a\u202b\u200e\u200f\u009f", - Aliases: []string{"ibm-4899_P100-1998", "ibm-4899"}, - }, - { - Name: "ibm-4909_P100-1999", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u2018\u2019\u00a3\u20ac\ufffd\u00a6\u00a7\u00a8\u00a9\ufffd\u00ab\u00ac\u00ad\ufffd\u2015\u00b0\u00b1\u00b2\u00b3\u00b4\u0385\u0386\u0387\u0388\u0389\u038a\u00bb\u038c\u00bd\u038e\u038f\u0390\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\ufffd\u03a3\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u03ca\u03cb\u03cc\u03cd\u03ce\ufffd", - Aliases: []string{"ibm-4909_P100-1999", "ibm-4909"}, - }, - { - Name: "ibm-4971_P100-1999", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399[.<(+!&\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3]$*);^-/\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03aa\u03ab|,%_>?\u00a8\u0386\u0388\u0389\u00a0\u038a\u038c\u038e\u038f`:#@'=\"\u0385abcdefghi\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u00b0jklmnopqr\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u00b4~stuvwxyz\u03bd\u03be\u03bf\u03c0\u03c1\u03c3\u00a3\u03ac\u03ad\u03ae\u03ca\u03af\u03cc\u03cd\u03cb\u03ce\u03c2\u03c4\u03c5\u03c6\u03c7\u03c8{ABCDEFGHI\u00ad\u03c9\u0390\u03b0\u2018\u2015}JKLMNOPQR\u00b1\u00bd\ufffd\u0387\u2019\u00a6\\\ufffdSTUVWXYZ\u00b2\u00a7\ufffd\ufffd\u00ab\u00ac0123456789\u00b3\u00a9\u20ac\ufffd\u00bb\u009f", - Aliases: []string{"ibm-4971_P100-1999", "ibm-4971"}, - }, - { - Name: "ibm-5123_P100-1999", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \ufffd\uff61\uff62\uff63\uff64\uff65\uff66\uff67\uff68\u00a2.<(+|&\uff69\uff6a\uff6b\uff6c\uff6d\uff6e\uff6f\uff70\uff71!$*);\u00ac-/\uff72\uff73\uff74\uff75\uff76\uff77\uff78\uff79\ufffd,%_>?\uff7a\uff7b\uff7c\uff7d\uff7e\uff7f\uff80\uff81\uff82`:#@'=\"\ufffdabcdefghi\uff83\uff84\uff85\uff86\uff87\uff88\ufffdjklmnopqr\uff89\uff8a\uff8b\uff8c\uff8d\uff8e\u203e~stuvwxyz\uff8f\uff90\uff91[\uff92\uff93^\u00a3\u00a5\uff94\uff95\uff96\uff97\uff98\uff99\uff9a\uff9b\uff9c\uff9d]\uff9e\uff9f{ABCDEFGHI\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd}JKLMNOPQR\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\\\u20acSTUVWXYZ\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0123456789\ufffd\ufffd\ufffd\ufffd\ufffd\u009f", - Aliases: []string{"ibm-5123_P100-1999", "ibm-5123"}, - }, - { - Name: "ibm-8482_P100-1999", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \uff61\uff62\uff63\uff64\uff65\uff66\uff67\uff68\uff69\u00a3.<(+|&\uff6a\uff6b\uff6c\uff6d\uff6e\uff6f\ufffd\uff70\ufffd!\u00a5*);\u00ac-/abcdefgh\ufffd,%_>?[ijklmnop`:#@'=\"]\uff71\uff72\uff73\uff74\uff75\uff76\uff77\uff78\uff79\uff7aq\uff7b\uff7c\uff7d\uff7e\uff7f\uff80\uff81\uff82\uff83\uff84\uff85\uff86\uff87\uff88\uff89r\ufffd\uff8a\uff8b\uff8c~\u203e\uff8d\uff8e\uff8f\uff90\uff91\uff92\uff93\uff94\uff95s\uff96\uff97\uff98\uff99^\u00a2\\tuvwxyz\uff9a\uff9b\uff9c\uff9d\uff9e\uff9f{ABCDEFGHI\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd}JKLMNOPQR\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd$\u20acSTUVWXYZ\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0123456789\ufffd\ufffd\ufffd\ufffd\ufffd\u009f", - Aliases: []string{"ibm-8482_P100-1999", "ibm-8482"}, - }, - { - Name: "ibm-9067_X100-2005", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399[.<(+!&\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3]$*);^-/\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03aa\u03ab|,%_>?\u00a8\u0386\u0388\u0389\u00a0\u038a\u038c\u038e\u038f`:#@'=\"\u0385abcdefghi\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u00b0jklmnopqr\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u00b4~stuvwxyz\u03bd\u03be\u03bf\u03c0\u03c1\u03c3\u00a3\u03ac\u03ad\u03ae\u03ca\u03af\u03cc\u03cd\u03cb\u03ce\u03c2\u03c4\u03c5\u03c6\u03c7\u03c8{ABCDEFGHI\u00ad\u03c9\u0390\u03b0\u2018\u2015}JKLMNOPQR\u00b1\u00bd\ufffd\u0387\u2019\u00a6\\\u20afSTUVWXYZ\u00b2\u00a7\u037a\ufffd\u00ab\u00ac0123456789\u00b3\u00a9\u20ac\ufffd\u00bb\u009f", - Aliases: []string{"ibm-9067_X100-2005", "ibm-9067"}, - }, - { - Name: "ibm-12712_P100-1998", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u00a2.<(+|&\u05d9\u05da\u05db\u05dc\u05dd\u05de\u05df\u05e0\u05e1!$*);\u00ac-/\u05e2\u05e3\u05e4\u05e5\u05e6\u05e7\u05e8\u05e9\u00a6,%_>?\ufffd\u05ea\ufffd\ufffd\u00a0\ufffd\ufffd\ufffd\u2017`:#@'=\"\ufffdabcdefghi\u00ab\u00bb\ufffd\ufffd\ufffd\u00b1\u00b0jklmnopqr\ufffd\ufffd\u20ac\u00b8\u20aa\u00a4\u00b5~stuvwxyz\ufffd\ufffd\ufffd\ufffd\ufffd\u00ae^\u00a3\u00a5\u2022\u00a9\u00a7\u00b6\u00bc\u00bd\u00be[]\u203e\u00a8\u00b4\u00d7{ABCDEFGHI\u00ad\ufffd\ufffd\ufffd\ufffd\ufffd}JKLMNOPQR\u00b9\u202d\u202e\u202c\ufffd\ufffd\\\u00f7STUVWXYZ\u00b2\ufffd\ufffd\ufffd\ufffd\ufffd0123456789\u00b3\u202a\u202b\u200e\u200f\u009f", - Aliases: []string{"ibm-12712_P100-1998", "ibm-12712", "ebcdic-he"}, - }, - { - Name: "ibm-16804_X110-1999", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u0651\ufe7d\u0640\u200b\u0621\u0622\ufe82\u0623\u00a2.<(+|&\ufe84\u0624\ufffd\ufffd\u0626\u0627\ufe8e\u0628\ufe91!$*);\u00ac-/\u0629\u062a\ufe97\u062b\ufe9b\u062c\ufe9f\u062d\u00a6,%_>?\ufea3\u062e\ufea7\u062f\u0630\u0631\u0632\u0633\ufeb3\u060c:#@'=\"\u0634abcdefghi\ufeb7\u0635\ufebb\u0636\ufebf\u0637\u0638jklmnopqr\u0639\ufeca\ufecb\ufecc\u063a\ufece\ufecf\u00f7stuvwxyz\ufed0\u0641\ufed3\u0642\ufed7\u0643\ufedb\u0644\ufef5\ufef6\ufef7\ufef8\ufffd\ufffd\ufefb\ufefc\ufedf\u0645\ufee3\u0646\ufee7\u0647\u061bABCDEFGHI\u00ad\ufeeb\ufffd\ufeec\ufffd\u0648\u061fJKLMNOPQR\u0649\ufef0\u064a\ufef2\ufef3\u0660\u00d7\u2007STUVWXYZ\u0661\u0662\ufffd\u0663\u0664\u06650123456789\u20ac\u0666\u0667\u0668\u0669\u009f", - Aliases: []string{"ibm-16804_X110-1999", "ibm-16804", "ebcdic-ar"}, - }, - { - Name: "KOI8-R", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u2500\u2502\u250c\u2510\u2514\u2518\u251c\u2524\u252c\u2534\u253c\u2580\u2584\u2588\u258c\u2590\u2591\u2592\u2593\u2320\u25a0\u2219\u221a\u2248\u2264\u2265\u00a0\u2321\u00b0\u00b2\u00b7\u00f7\u2550\u2551\u2552\u0451\u2553\u2554\u2555\u2556\u2557\u2558\u2559\u255a\u255b\u255c\u255d\u255e\u255f\u2560\u2561\u0401\u2562\u2563\u2564\u2565\u2566\u2567\u2568\u2569\u256a\u256b\u256c\u00a9\u044e\u0430\u0431\u0446\u0434\u0435\u0444\u0433\u0445\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u044f\u0440\u0441\u0442\u0443\u0436\u0432\u044c\u044b\u0437\u0448\u044d\u0449\u0447\u044a\u042e\u0410\u0411\u0426\u0414\u0415\u0424\u0413\u0425\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u042f\u0420\u0421\u0422\u0423\u0416\u0412\u042c\u042b\u0417\u0428\u042d\u0429\u0427\u042a", - Aliases: []string{"csKOI8R"}, - }, - { - Name: "KOI8-U", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u2500\u2502\u250c\u2510\u2514\u2518\u251c\u2524\u252c\u2534\u253c\u2580\u2584\u2588\u258c\u2590\u2591\u2592\u2593\u2320\u25a0\u2219\u221a\u2248\u2264\u2265\u00a0\u2321\u00b0\u00b2\u00b7\u00f7\u2550\u2551\u2552\u0451\u0454\u2554\u0456\u0457\u2557\u2558\u2559\u255a\u255b\u0491\u255d\u255e\u255f\u2560\u2561\u0401\u0404\u2563\u0406\u0407\u2566\u2567\u2568\u2569\u256a\u0490\u256c\u00a9\u044e\u0430\u0431\u0446\u0434\u0435\u0444\u0433\u0445\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u044f\u0440\u0441\u0442\u0443\u0436\u0432\u044c\u044b\u0437\u0448\u044d\u0449\u0447\u044a\u042e\u0410\u0411\u0426\u0414\u0415\u0424\u0413\u0425\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u042f\u0420\u0421\u0422\u0423\u0416\u0412\u042c\u042b\u0417\u0428\u042d\u0429\u0427\u042a", - }, - { - Name: "ibm-1051_P100-1995", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\ufffd\u00c0\u00c2\u00c8\u00ca\u00cb\u00ce\u00cf\u00b4`\u02c6\u00a8\u02dc\u00d9\u00db\u00a3\u203e\u00dd\u00fd\u02da\u00c7\u00e7\u00d1\u00f1\u00a1\u00bf\u00a4\u00a3\u00a5\u00a7\u0192\u00a2\u00e2\u00ea\u00f4\u00fb\u00e1\u00e9\u00f3\u00fa\u00e0\u00e8\u00f2\u00f9\u00e4\u00eb\u00f6\u00fc\u00c5\u00ee\u00d8\u00c6\u00e5\u00ed\u00f8\u00e6\u00c4\u00ec\u00d6\u00dc\u00c9\u00ef\u00df\u00d4\u00c1\u00c3\u00e3\u00d0\u00f0\u00cd\u00cc\u00d3\u00d2\u00d5\u00f5\u0160\u0161\u00da\u0178\u00ff\u00de\u00fe\u00b7\u03bc\u00b6\u00be-\u00bc\u00bd\u00aa\u00ba\u00ab\u25a0\u00bb\u00b1\ufffd", - Aliases: []string{"ibm-1051_P100-1995", "ibm-1051", "hp-roman8", "roman8", "r8", "csHPRoman8"}, - }, - { - Name: "ibm-1276_P100-1995", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&\u2019()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_\u2018abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\ufffd\u00a1\u00a2\u00a3\u2044\u00a5\u0192\u00a7\u00a4'\u201c\u00ab\u2039\u203a\ufb01\ufb02\ufffd\u2013\u2020\u2021\u00b7\ufffd\u00b6\u2022\u201a\u201e\u201d\u00bb\u2026\u2030\ufffd\u00bf\ufffd`\u00b4\u02c6\u02dc\u00af\u02d8\u02d9\u00a8\ufffd\u02da\u00b8\ufffd\u02dd\u02db\u02c7\u2014\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u00c6\ufffd\u00aa\ufffd\ufffd\ufffd\ufffd\u0141\u00d8\u0152\u00ba\ufffd\ufffd\ufffd\ufffd\ufffd\u00e6\ufffd\ufffd\ufffd\u0131\ufffd\ufffd\u0142\u00f8\u0153\u00df\ufffd\ufffd\ufffd\ufffd", - Aliases: []string{"ibm-1276_P100-1995", "ibm-1276", "Adobe-Standard-Encoding", "csAdobeStandardEncoding"}, - }, - { - Name: "ebcdic-xml-us", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\n\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5\u00e7\u00f1\u00a2.<(+|&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df!$*);\u00ac-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00a6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:#@'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u20ac\u00b5~stuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae^\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be[]\u00af\u00a8\u00b4\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5}JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ebcdic-xml-us"}, - }, -} diff --git a/vendor/github.com/Tang-RoseChild/mahonia/ASCII.go b/vendor/github.com/Tang-RoseChild/mahonia/ASCII.go deleted file mode 100644 index 5e4eebf4a..000000000 --- a/vendor/github.com/Tang-RoseChild/mahonia/ASCII.go +++ /dev/null @@ -1,76 +0,0 @@ -package mahonia - -// Converters for ASCII and ISO-8859-1 - -func init() { - for i := 0; i < len(asciiCharsets); i++ { - RegisterCharset(&asciiCharsets[i]) - } -} - -var asciiCharsets = []Charset{ - { - Name: "US-ASCII", - NewDecoder: func() Decoder { return decodeASCIIRune }, - NewEncoder: func() Encoder { return encodeASCIIRune }, - Aliases: []string{"ASCII", "US", "ISO646-US", "IBM367", "cp367", "ANSI_X3.4-1968", "iso-ir-6", "ANSI_X3.4-1986", "ISO_646.irv:1991", "csASCII"}, - }, - { - Name: "ISO-8859-1", - NewDecoder: func() Decoder { return decodeLatin1Rune }, - NewEncoder: func() Encoder { return encodeLatin1Rune }, - Aliases: []string{"latin1", "ISO Latin 1", "IBM819", "cp819", "ISO_8859-1:1987", "iso-ir-100", "l1", "csISOLatin1"}, - }, -} - -func decodeASCIIRune(p []byte) (c rune, size int, status Status) { - if len(p) == 0 { - status = NO_ROOM - return - } - - b := p[0] - if b > 127 { - return 0xfffd, 1, INVALID_CHAR - } - return rune(b), 1, SUCCESS -} - -func encodeASCIIRune(p []byte, c rune) (size int, status Status) { - if len(p) == 0 { - status = NO_ROOM - return - } - - if c < 128 { - p[0] = byte(c) - return 1, SUCCESS - } - - p[0] = '?' - return 1, INVALID_CHAR -} - -func decodeLatin1Rune(p []byte) (c rune, size int, status Status) { - if len(p) == 0 { - status = NO_ROOM - return - } - - return rune(p[0]), 1, SUCCESS -} - -func encodeLatin1Rune(p []byte, c rune) (size int, status Status) { - if len(p) == 0 { - status = NO_ROOM - return - } - - if c < 256 { - p[0] = byte(c) - return 1, SUCCESS - } - - p[0] = '?' - return 1, INVALID_CHAR -} diff --git a/vendor/github.com/Tang-RoseChild/mahonia/big5-data.go b/vendor/github.com/Tang-RoseChild/mahonia/big5-data.go deleted file mode 100644 index a542fe1fc..000000000 --- a/vendor/github.com/Tang-RoseChild/mahonia/big5-data.go +++ /dev/null @@ -1,13707 +0,0 @@ -package mahonia - -var big5ToUnicode = [65536]uint16{ - 0xA140: 0x3000, // IDEOGRAPHIC SPACE - 0xA141: 0xFF0C, // FULLWIDTH COMMA - 0xA142: 0x3001, // IDEOGRAPHIC COMMA - 0xA143: 0x3002, // IDEOGRAPHIC FULL STOP - 0xA144: 0xFF0E, // FULLWIDTH FULL STOP - 0xA145: 0x2022, // BULLET - 0xA146: 0xFF1B, // FULLWIDTH SEMICOLON - 0xA147: 0xFF1A, // FULLWIDTH COLON - 0xA148: 0xFF1F, // FULLWIDTH QUESTION MARK - 0xA149: 0xFF01, // FULLWIDTH EXCLAMATION MARK - 0xA14A: 0xFE30, // PRESENTATION FORM FOR VERTICAL TWO DOT LEADER - 0xA14B: 0x2026, // HORIZONTAL ELLIPSIS - 0xA14C: 0x2025, // TWO DOT LEADER - 0xA14D: 0xFE50, // SMALL COMMA - 0xA14E: 0xFF64, // HALFWIDTH IDEOGRAPHIC COMMA - 0xA14F: 0xFE52, // SMALL FULL STOP - 0xA150: 0x00B7, // MIDDLE DOT - 0xA151: 0xFE54, // SMALL SEMICOLON - 0xA152: 0xFE55, // SMALL COLON - 0xA153: 0xFE56, // SMALL QUESTION MARK - 0xA154: 0xFE57, // SMALL EXCLAMATION MARK - 0xA155: 0xFF5C, // FULLWIDTH VERTICAL BAR - 0xA156: 0x2013, // EN DASH - 0xA157: 0xFE31, // PRESENTATION FORM FOR VERTICAL EM DASH - 0xA158: 0x2014, // EM DASH - 0xA159: 0xFE33, // PRESENTATION FORM FOR VERTICAL LOW LINE - 0xA15B: 0xFE34, // PRESENTATION FORM FOR VERTICAL WAVY LOW LINE - 0xA15C: 0xFE4F, // WAVY LOW LINE - 0xA15D: 0xFF08, // FULLWIDTH LEFT PARENTHESIS - 0xA15E: 0xFF09, // FULLWIDTH RIGHT PARENTHESIS - 0xA15F: 0xFE35, // PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS - 0xA160: 0xFE36, // PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS - 0xA161: 0xFF5B, // FULLWIDTH LEFT CURLY BRACKET - 0xA162: 0xFF5D, // FULLWIDTH RIGHT CURLY BRACKET - 0xA163: 0xFE37, // PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET - 0xA164: 0xFE38, // PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET - 0xA165: 0x3014, // LEFT TORTOISE SHELL BRACKET - 0xA166: 0x3015, // RIGHT TORTOISE SHELL BRACKET - 0xA167: 0xFE39, // PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET - 0xA168: 0xFE3A, // PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET - 0xA169: 0x3010, // LEFT BLACK LENTICULAR BRACKET - 0xA16A: 0x3011, // RIGHT BLACK LENTICULAR BRACKET - 0xA16B: 0xFE3B, // PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET - 0xA16C: 0xFE3C, // PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET - 0xA16D: 0x300A, // LEFT DOUBLE ANGLE BRACKET - 0xA16E: 0x300B, // RIGHT DOUBLE ANGLE BRACKET - 0xA16F: 0xFE3D, // PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET - 0xA170: 0xFE3E, // PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET - 0xA171: 0x3008, // LEFT ANGLE BRACKET - 0xA172: 0x3009, // RIGHT ANGLE BRACKET - 0xA173: 0xFE3F, // PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET - 0xA174: 0xFE40, // PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET - 0xA175: 0x300C, // LEFT CORNER BRACKET - 0xA176: 0x300D, // RIGHT CORNER BRACKET - 0xA177: 0xFE41, // PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET - 0xA178: 0xFE42, // PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET - 0xA179: 0x300E, // LEFT WHITE CORNER BRACKET - 0xA17A: 0x300F, // RIGHT WHITE CORNER BRACKET - 0xA17B: 0xFE43, // PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET - 0xA17C: 0xFE44, // PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET - 0xA17D: 0xFE59, // SMALL LEFT PARENTHESIS - 0xA17E: 0xFE5A, // SMALL RIGHT PARENTHESIS - 0xA1A1: 0xFE5B, // SMALL LEFT CURLY BRACKET - 0xA1A2: 0xFE5C, // SMALL RIGHT CURLY BRACKET - 0xA1A3: 0xFE5D, // SMALL LEFT TORTOISE SHELL BRACKET - 0xA1A4: 0xFE5E, // SMALL RIGHT TORTOISE SHELL BRACKET - 0xA1A5: 0x2018, // LEFT SINGLE QUOTATION MARK - 0xA1A6: 0x2019, // RIGHT SINGLE QUOTATION MARK - 0xA1A7: 0x201C, // LEFT DOUBLE QUOTATION MARK - 0xA1A8: 0x201D, // RIGHT DOUBLE QUOTATION MARK - 0xA1A9: 0x301D, // REVERSED DOUBLE PRIME QUOTATION MARK - 0xA1AA: 0x301E, // DOUBLE PRIME QUOTATION MARK - 0xA1AB: 0x2035, // REVERSED PRIME - 0xA1AC: 0x2032, // PRIME - 0xA1AD: 0xFF03, // FULLWIDTH NUMBER SIGN - 0xA1AE: 0xFF06, // FULLWIDTH AMPERSAND - 0xA1AF: 0xFF0A, // FULLWIDTH ASTERISK - 0xA1B0: 0x203B, // REFERENCE MARK - 0xA1B1: 0x00A7, // SECTION SIGN - 0xA1B2: 0x3003, // DITTO MARK - 0xA1B3: 0x25CB, // WHITE CIRCLE - 0xA1B4: 0x25CF, // BLACK CIRCLE - 0xA1B5: 0x25B3, // WHITE UP-POINTING TRIANGLE - 0xA1B6: 0x25B2, // BLACK UP-POINTING TRIANGLE - 0xA1B7: 0x25CE, // BULLSEYE - 0xA1B8: 0x2606, // WHITE STAR - 0xA1B9: 0x2605, // BLACK STAR - 0xA1BA: 0x25C7, // WHITE DIAMOND - 0xA1BB: 0x25C6, // BLACK DIAMOND - 0xA1BC: 0x25A1, // WHITE SQUARE - 0xA1BD: 0x25A0, // BLACK SQUARE - 0xA1BE: 0x25BD, // WHITE DOWN-POINTING TRIANGLE - 0xA1BF: 0x25BC, // BLACK DOWN-POINTING TRIANGLE - 0xA1C0: 0x32A3, // CIRCLED IDEOGRAPH CORRECT - 0xA1C1: 0x2105, // CARE OF - 0xA1C2: 0x203E, // OVERLINE - 0xA1C4: 0xFF3F, // FULLWIDTH LOW LINE - 0xA1C6: 0xFE49, // DASHED OVERLINE - 0xA1C7: 0xFE4A, // CENTRELINE OVERLINE - 0xA1C8: 0xFE4D, // DASHED LOW LINE - 0xA1C9: 0xFE4E, // CENTRELINE LOW LINE - 0xA1CA: 0xFE4B, // WAVY OVERLINE - 0xA1CB: 0xFE4C, // DOUBLE WAVY OVERLINE - 0xA1CC: 0xFE5F, // SMALL NUMBER SIGN - 0xA1CD: 0xFE60, // SMALL AMPERSAND - 0xA1CE: 0xFE61, // SMALL ASTERISK - 0xA1CF: 0xFF0B, // FULLWIDTH PLUS SIGN - 0xA1D0: 0xFF0D, // FULLWIDTH HYPHEN-MINUS - 0xA1D1: 0x00D7, // MULTIPLICATION SIGN - 0xA1D2: 0x00F7, // DIVISION SIGN - 0xA1D3: 0x00B1, // PLUS-MINUS SIGN - 0xA1D4: 0x221A, // SQUARE ROOT - 0xA1D5: 0xFF1C, // FULLWIDTH LESS-THAN SIGN - 0xA1D6: 0xFF1E, // FULLWIDTH GREATER-THAN SIGN - 0xA1D7: 0xFF1D, // FULLWIDTH EQUALS SIGN - 0xA1D8: 0x2266, // LESS THAN OVER EQUAL TO - 0xA1D9: 0x2267, // GREATER THAN OVER EQUAL TO - 0xA1DA: 0x2260, // NOT EQUAL TO - 0xA1DB: 0x221E, // INFINITY - 0xA1DC: 0x2252, // APPROXIMATELY EQUAL TO OR THE IMAGE OF - 0xA1DD: 0x2261, // IDENTICAL TO - 0xA1DE: 0xFE62, // SMALL PLUS SIGN - 0xA1DF: 0xFE63, // SMALL HYPHEN-MINUS - 0xA1E0: 0xFE64, // SMALL LESS-THAN SIGN - 0xA1E1: 0xFE65, // SMALL GREATER-THAN SIGN - 0xA1E2: 0xFE66, // SMALL EQUALS SIGN - 0xA1E3: 0x223C, // TILDE OPERATOR - 0xA1E4: 0x2229, // INTERSECTION - 0xA1E5: 0x222A, // UNION - 0xA1E6: 0x22A5, // UP TACK - 0xA1E7: 0x2220, // ANGLE - 0xA1E8: 0x221F, // RIGHT ANGLE - 0xA1E9: 0x22BF, // RIGHT TRIANGLE - 0xA1EA: 0x33D2, // SQUARE LOG - 0xA1EB: 0x33D1, // SQUARE LN - 0xA1EC: 0x222B, // INTEGRAL - 0xA1ED: 0x222E, // CONTOUR INTEGRAL - 0xA1EE: 0x2235, // BECAUSE - 0xA1EF: 0x2234, // THEREFORE - 0xA1F0: 0x2640, // FEMALE SIGN - 0xA1F1: 0x2642, // MALE SIGN - 0xA1F2: 0x2641, // EARTH - 0xA1F3: 0x2609, // SUN - 0xA1F4: 0x2191, // UPWARDS ARROW - 0xA1F5: 0x2193, // DOWNWARDS ARROW - 0xA1F6: 0x2190, // LEFTWARDS ARROW - 0xA1F7: 0x2192, // RIGHTWARDS ARROW - 0xA1F8: 0x2196, // NORTH WEST ARROW - 0xA1F9: 0x2197, // NORTH EAST ARROW - 0xA1FA: 0x2199, // SOUTH WEST ARROW - 0xA1FB: 0x2198, // SOUTH EAST ARROW - 0xA1FC: 0x2225, // PARALLEL TO - 0xA1FD: 0x2223, // DIVIDES - 0xA241: 0xFF0F, // FULLWIDTH SOLIDUS - 0xA242: 0xFF3C, // FULLWIDTH REVERSE SOLIDUS - 0xA243: 0xFF04, // FULLWIDTH DOLLAR SIGN - 0xA244: 0x00A5, // YEN SIGN - 0xA245: 0x3012, // POSTAL MARK - 0xA246: 0x00A2, // CENT SIGN - 0xA247: 0x00A3, // POUND SIGN - 0xA248: 0xFF05, // FULLWIDTH PERCENT SIGN - 0xA249: 0xFF20, // FULLWIDTH COMMERCIAL AT - 0xA24A: 0x2103, // DEGREE CELSIUS - 0xA24B: 0x2109, // DEGREE FAHRENHEIT - 0xA24C: 0xFE69, // SMALL DOLLAR SIGN - 0xA24D: 0xFE6A, // SMALL PERCENT SIGN - 0xA24E: 0xFE6B, // SMALL COMMERCIAL AT - 0xA24F: 0x33D5, // SQUARE MIL - 0xA250: 0x339C, // SQUARE MM - 0xA251: 0x339D, // SQUARE CM - 0xA252: 0x339E, // SQUARE KM - 0xA253: 0x33CE, // SQUARE KM CAPITAL - 0xA254: 0x33A1, // SQUARE M SQUARED - 0xA255: 0x338E, // SQUARE MG - 0xA256: 0x338F, // SQUARE KG - 0xA257: 0x33C4, // SQUARE CC - 0xA258: 0x00B0, // DEGREE SIGN - 0xA259: 0x5159, - 0xA25A: 0x515B, - 0xA25B: 0x515E, - 0xA25C: 0x515D, - 0xA25D: 0x5161, - 0xA25E: 0x5163, - 0xA25F: 0x55E7, - 0xA260: 0x74E9, - 0xA261: 0x7CCE, - 0xA262: 0x2581, // LOWER ONE EIGHTH BLOCK - 0xA263: 0x2582, // LOWER ONE QUARTER BLOCK - 0xA264: 0x2583, // LOWER THREE EIGHTHS BLOCK - 0xA265: 0x2584, // LOWER HALF BLOCK - 0xA266: 0x2585, // LOWER FIVE EIGHTHS BLOCK - 0xA267: 0x2586, // LOWER THREE QUARTERS BLOCK - 0xA268: 0x2587, // LOWER SEVEN EIGHTHS BLOCK - 0xA269: 0x2588, // FULL BLOCK - 0xA26A: 0x258F, // LEFT ONE EIGHTH BLOCK - 0xA26B: 0x258E, // LEFT ONE QUARTER BLOCK - 0xA26C: 0x258D, // LEFT THREE EIGHTHS BLOCK - 0xA26D: 0x258C, // LEFT HALF BLOCK - 0xA26E: 0x258B, // LEFT FIVE EIGHTHS BLOCK - 0xA26F: 0x258A, // LEFT THREE QUARTERS BLOCK - 0xA270: 0x2589, // LEFT SEVEN EIGHTHS BLOCK - 0xA271: 0x253C, // BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - 0xA272: 0x2534, // BOX DRAWINGS LIGHT UP AND HORIZONTAL - 0xA273: 0x252C, // BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - 0xA274: 0x2524, // BOX DRAWINGS LIGHT VERTICAL AND LEFT - 0xA275: 0x251C, // BOX DRAWINGS LIGHT VERTICAL AND RIGHT - 0xA276: 0x2594, // UPPER ONE EIGHTH BLOCK - 0xA277: 0x2500, // BOX DRAWINGS LIGHT HORIZONTAL - 0xA278: 0x2502, // BOX DRAWINGS LIGHT VERTICAL - 0xA279: 0x2595, // RIGHT ONE EIGHTH BLOCK - 0xA27A: 0x250C, // BOX DRAWINGS LIGHT DOWN AND RIGHT - 0xA27B: 0x2510, // BOX DRAWINGS LIGHT DOWN AND LEFT - 0xA27C: 0x2514, // BOX DRAWINGS LIGHT UP AND RIGHT - 0xA27D: 0x2518, // BOX DRAWINGS LIGHT UP AND LEFT - 0xA27E: 0x256D, // BOX DRAWINGS LIGHT ARC DOWN AND RIGHT - 0xA2A1: 0x256E, // BOX DRAWINGS LIGHT ARC DOWN AND LEFT - 0xA2A2: 0x2570, // BOX DRAWINGS LIGHT ARC UP AND RIGHT - 0xA2A3: 0x256F, // BOX DRAWINGS LIGHT ARC UP AND LEFT - 0xA2A4: 0x2550, // BOX DRAWINGS DOUBLE HORIZONTAL - 0xA2A5: 0x255E, // BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE - 0xA2A6: 0x256A, // BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE - 0xA2A7: 0x2561, // BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE - 0xA2A8: 0x25E2, // BLACK LOWER RIGHT TRIANGLE - 0xA2A9: 0x25E3, // BLACK LOWER LEFT TRIANGLE - 0xA2AA: 0x25E5, // BLACK UPPER RIGHT TRIANGLE - 0xA2AB: 0x25E4, // BLACK UPPER LEFT TRIANGLE - 0xA2AC: 0x2571, // BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT - 0xA2AD: 0x2572, // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT - 0xA2AE: 0x2573, // BOX DRAWINGS LIGHT DIAGONAL CROSS - 0xA2AF: 0xFF10, // FULLWIDTH DIGIT ZERO - 0xA2B0: 0xFF11, // FULLWIDTH DIGIT ONE - 0xA2B1: 0xFF12, // FULLWIDTH DIGIT TWO - 0xA2B2: 0xFF13, // FULLWIDTH DIGIT THREE - 0xA2B3: 0xFF14, // FULLWIDTH DIGIT FOUR - 0xA2B4: 0xFF15, // FULLWIDTH DIGIT FIVE - 0xA2B5: 0xFF16, // FULLWIDTH DIGIT SIX - 0xA2B6: 0xFF17, // FULLWIDTH DIGIT SEVEN - 0xA2B7: 0xFF18, // FULLWIDTH DIGIT EIGHT - 0xA2B8: 0xFF19, // FULLWIDTH DIGIT NINE - 0xA2B9: 0x2160, // ROMAN NUMERAL ONE - 0xA2BA: 0x2161, // ROMAN NUMERAL TWO - 0xA2BB: 0x2162, // ROMAN NUMERAL THREE - 0xA2BC: 0x2163, // ROMAN NUMERAL FOUR - 0xA2BD: 0x2164, // ROMAN NUMERAL FIVE - 0xA2BE: 0x2165, // ROMAN NUMERAL SIX - 0xA2BF: 0x2166, // ROMAN NUMERAL SEVEN - 0xA2C0: 0x2167, // ROMAN NUMERAL EIGHT - 0xA2C1: 0x2168, // ROMAN NUMERAL NINE - 0xA2C2: 0x2169, // ROMAN NUMERAL TEN - 0xA2C3: 0x3021, // HANGZHOU NUMERAL ONE - 0xA2C4: 0x3022, // HANGZHOU NUMERAL TWO - 0xA2C5: 0x3023, // HANGZHOU NUMERAL THREE - 0xA2C6: 0x3024, // HANGZHOU NUMERAL FOUR - 0xA2C7: 0x3025, // HANGZHOU NUMERAL FIVE - 0xA2C8: 0x3026, // HANGZHOU NUMERAL SIX - 0xA2C9: 0x3027, // HANGZHOU NUMERAL SEVEN - 0xA2CA: 0x3028, // HANGZHOU NUMERAL EIGHT - 0xA2CB: 0x3029, // HANGZHOU NUMERAL NINE - 0xA2CD: 0x5344, - 0xA2CF: 0xFF21, // FULLWIDTH LATIN CAPITAL LETTER A - 0xA2D0: 0xFF22, // FULLWIDTH LATIN CAPITAL LETTER B - 0xA2D1: 0xFF23, // FULLWIDTH LATIN CAPITAL LETTER C - 0xA2D2: 0xFF24, // FULLWIDTH LATIN CAPITAL LETTER D - 0xA2D3: 0xFF25, // FULLWIDTH LATIN CAPITAL LETTER E - 0xA2D4: 0xFF26, // FULLWIDTH LATIN CAPITAL LETTER F - 0xA2D5: 0xFF27, // FULLWIDTH LATIN CAPITAL LETTER G - 0xA2D6: 0xFF28, // FULLWIDTH LATIN CAPITAL LETTER H - 0xA2D7: 0xFF29, // FULLWIDTH LATIN CAPITAL LETTER I - 0xA2D8: 0xFF2A, // FULLWIDTH LATIN CAPITAL LETTER J - 0xA2D9: 0xFF2B, // FULLWIDTH LATIN CAPITAL LETTER K - 0xA2DA: 0xFF2C, // FULLWIDTH LATIN CAPITAL LETTER L - 0xA2DB: 0xFF2D, // FULLWIDTH LATIN CAPITAL LETTER M - 0xA2DC: 0xFF2E, // FULLWIDTH LATIN CAPITAL LETTER N - 0xA2DD: 0xFF2F, // FULLWIDTH LATIN CAPITAL LETTER O - 0xA2DE: 0xFF30, // FULLWIDTH LATIN CAPITAL LETTER P - 0xA2DF: 0xFF31, // FULLWIDTH LATIN CAPITAL LETTER Q - 0xA2E0: 0xFF32, // FULLWIDTH LATIN CAPITAL LETTER R - 0xA2E1: 0xFF33, // FULLWIDTH LATIN CAPITAL LETTER S - 0xA2E2: 0xFF34, // FULLWIDTH LATIN CAPITAL LETTER T - 0xA2E3: 0xFF35, // FULLWIDTH LATIN CAPITAL LETTER U - 0xA2E4: 0xFF36, // FULLWIDTH LATIN CAPITAL LETTER V - 0xA2E5: 0xFF37, // FULLWIDTH LATIN CAPITAL LETTER W - 0xA2E6: 0xFF38, // FULLWIDTH LATIN CAPITAL LETTER X - 0xA2E7: 0xFF39, // FULLWIDTH LATIN CAPITAL LETTER Y - 0xA2E8: 0xFF3A, // FULLWIDTH LATIN CAPITAL LETTER Z - 0xA2E9: 0xFF41, // FULLWIDTH LATIN SMALL LETTER A - 0xA2EA: 0xFF42, // FULLWIDTH LATIN SMALL LETTER B - 0xA2EB: 0xFF43, // FULLWIDTH LATIN SMALL LETTER C - 0xA2EC: 0xFF44, // FULLWIDTH LATIN SMALL LETTER D - 0xA2ED: 0xFF45, // FULLWIDTH LATIN SMALL LETTER E - 0xA2EE: 0xFF46, // FULLWIDTH LATIN SMALL LETTER F - 0xA2EF: 0xFF47, // FULLWIDTH LATIN SMALL LETTER G - 0xA2F0: 0xFF48, // FULLWIDTH LATIN SMALL LETTER H - 0xA2F1: 0xFF49, // FULLWIDTH LATIN SMALL LETTER I - 0xA2F2: 0xFF4A, // FULLWIDTH LATIN SMALL LETTER J - 0xA2F3: 0xFF4B, // FULLWIDTH LATIN SMALL LETTER K - 0xA2F4: 0xFF4C, // FULLWIDTH LATIN SMALL LETTER L - 0xA2F5: 0xFF4D, // FULLWIDTH LATIN SMALL LETTER M - 0xA2F6: 0xFF4E, // FULLWIDTH LATIN SMALL LETTER N - 0xA2F7: 0xFF4F, // FULLWIDTH LATIN SMALL LETTER O - 0xA2F8: 0xFF50, // FULLWIDTH LATIN SMALL LETTER P - 0xA2F9: 0xFF51, // FULLWIDTH LATIN SMALL LETTER Q - 0xA2FA: 0xFF52, // FULLWIDTH LATIN SMALL LETTER R - 0xA2FB: 0xFF53, // FULLWIDTH LATIN SMALL LETTER S - 0xA2FC: 0xFF54, // FULLWIDTH LATIN SMALL LETTER T - 0xA2FD: 0xFF55, // FULLWIDTH LATIN SMALL LETTER U - 0xA2FE: 0xFF56, // FULLWIDTH LATIN SMALL LETTER V - 0xA340: 0xFF57, // FULLWIDTH LATIN SMALL LETTER W - 0xA341: 0xFF58, // FULLWIDTH LATIN SMALL LETTER X - 0xA342: 0xFF59, // FULLWIDTH LATIN SMALL LETTER Y - 0xA343: 0xFF5A, // FULLWIDTH LATIN SMALL LETTER Z - 0xA344: 0x0391, // GREEK CAPITAL LETTER ALPHA - 0xA345: 0x0392, // GREEK CAPITAL LETTER BETA - 0xA346: 0x0393, // GREEK CAPITAL LETTER GAMMA - 0xA347: 0x0394, // GREEK CAPITAL LETTER DELTA - 0xA348: 0x0395, // GREEK CAPITAL LETTER EPSILON - 0xA349: 0x0396, // GREEK CAPITAL LETTER ZETA - 0xA34A: 0x0397, // GREEK CAPITAL LETTER ETA - 0xA34B: 0x0398, // GREEK CAPITAL LETTER THETA - 0xA34C: 0x0399, // GREEK CAPITAL LETTER IOTA - 0xA34D: 0x039A, // GREEK CAPITAL LETTER KAPPA - 0xA34E: 0x039B, // GREEK CAPITAL LETTER LAMDA - 0xA34F: 0x039C, // GREEK CAPITAL LETTER MU - 0xA350: 0x039D, // GREEK CAPITAL LETTER NU - 0xA351: 0x039E, // GREEK CAPITAL LETTER XI - 0xA352: 0x039F, // GREEK CAPITAL LETTER OMICRON - 0xA353: 0x03A0, // GREEK CAPITAL LETTER PI - 0xA354: 0x03A1, // GREEK CAPITAL LETTER RHO - 0xA355: 0x03A3, // GREEK CAPITAL LETTER SIGMA - 0xA356: 0x03A4, // GREEK CAPITAL LETTER TAU - 0xA357: 0x03A5, // GREEK CAPITAL LETTER UPSILON - 0xA358: 0x03A6, // GREEK CAPITAL LETTER PHI - 0xA359: 0x03A7, // GREEK CAPITAL LETTER CHI - 0xA35A: 0x03A8, // GREEK CAPITAL LETTER PSI - 0xA35B: 0x03A9, // GREEK CAPITAL LETTER OMEGA - 0xA35C: 0x03B1, // GREEK SMALL LETTER ALPHA - 0xA35D: 0x03B2, // GREEK SMALL LETTER BETA - 0xA35E: 0x03B3, // GREEK SMALL LETTER GAMMA - 0xA35F: 0x03B4, // GREEK SMALL LETTER DELTA - 0xA360: 0x03B5, // GREEK SMALL LETTER EPSILON - 0xA361: 0x03B6, // GREEK SMALL LETTER ZETA - 0xA362: 0x03B7, // GREEK SMALL LETTER ETA - 0xA363: 0x03B8, // GREEK SMALL LETTER THETA - 0xA364: 0x03B9, // GREEK SMALL LETTER IOTA - 0xA365: 0x03BA, // GREEK SMALL LETTER KAPPA - 0xA366: 0x03BB, // GREEK SMALL LETTER LAMDA - 0xA367: 0x03BC, // GREEK SMALL LETTER MU - 0xA368: 0x03BD, // GREEK SMALL LETTER NU - 0xA369: 0x03BE, // GREEK SMALL LETTER XI - 0xA36A: 0x03BF, // GREEK SMALL LETTER OMICRON - 0xA36B: 0x03C0, // GREEK SMALL LETTER PI - 0xA36C: 0x03C1, // GREEK SMALL LETTER RHO - 0xA36D: 0x03C3, // GREEK SMALL LETTER SIGMA - 0xA36E: 0x03C4, // GREEK SMALL LETTER TAU - 0xA36F: 0x03C5, // GREEK SMALL LETTER UPSILON - 0xA370: 0x03C6, // GREEK SMALL LETTER PHI - 0xA371: 0x03C7, // GREEK SMALL LETTER CHI - 0xA372: 0x03C8, // GREEK SMALL LETTER PSI - 0xA373: 0x03C9, // GREEK SMALL LETTER OMEGA - 0xA374: 0x3105, // BOPOMOFO LETTER B - 0xA375: 0x3106, // BOPOMOFO LETTER P - 0xA376: 0x3107, // BOPOMOFO LETTER M - 0xA377: 0x3108, // BOPOMOFO LETTER F - 0xA378: 0x3109, // BOPOMOFO LETTER D - 0xA379: 0x310A, // BOPOMOFO LETTER T - 0xA37A: 0x310B, // BOPOMOFO LETTER N - 0xA37B: 0x310C, // BOPOMOFO LETTER L - 0xA37C: 0x310D, // BOPOMOFO LETTER G - 0xA37D: 0x310E, // BOPOMOFO LETTER K - 0xA37E: 0x310F, // BOPOMOFO LETTER H - 0xA3A1: 0x3110, // BOPOMOFO LETTER J - 0xA3A2: 0x3111, // BOPOMOFO LETTER Q - 0xA3A3: 0x3112, // BOPOMOFO LETTER X - 0xA3A4: 0x3113, // BOPOMOFO LETTER ZH - 0xA3A5: 0x3114, // BOPOMOFO LETTER CH - 0xA3A6: 0x3115, // BOPOMOFO LETTER SH - 0xA3A7: 0x3116, // BOPOMOFO LETTER R - 0xA3A8: 0x3117, // BOPOMOFO LETTER Z - 0xA3A9: 0x3118, // BOPOMOFO LETTER C - 0xA3AA: 0x3119, // BOPOMOFO LETTER S - 0xA3AB: 0x311A, // BOPOMOFO LETTER A - 0xA3AC: 0x311B, // BOPOMOFO LETTER O - 0xA3AD: 0x311C, // BOPOMOFO LETTER E - 0xA3AE: 0x311D, // BOPOMOFO LETTER EH - 0xA3AF: 0x311E, // BOPOMOFO LETTER AI - 0xA3B0: 0x311F, // BOPOMOFO LETTER EI - 0xA3B1: 0x3120, // BOPOMOFO LETTER AU - 0xA3B2: 0x3121, // BOPOMOFO LETTER OU - 0xA3B3: 0x3122, // BOPOMOFO LETTER AN - 0xA3B4: 0x3123, // BOPOMOFO LETTER EN - 0xA3B5: 0x3124, // BOPOMOFO LETTER ANG - 0xA3B6: 0x3125, // BOPOMOFO LETTER ENG - 0xA3B7: 0x3126, // BOPOMOFO LETTER ER - 0xA3B8: 0x3127, // BOPOMOFO LETTER I - 0xA3B9: 0x3128, // BOPOMOFO LETTER U - 0xA3BA: 0x3129, // BOPOMOFO LETTER IU - 0xA3BB: 0x02D9, // DOT ABOVE (Mandarin Chinese light tone) - 0xA3BC: 0x02C9, // MODIFIER LETTER MACRON (Mandarin Chinese first tone) - 0xA3BD: 0x02CA, // MODIFIER LETTER ACUTE ACCENT (Mandarin Chinese second tone) - 0xA3BE: 0x02C7, // CARON (Mandarin Chinese third tone) - 0xA3BF: 0x02CB, // MODIFIER LETTER GRAVE ACCENT (Mandarin Chinese fourth tone) - 0xA440: 0x4E00, - 0xA441: 0x4E59, - 0xA442: 0x4E01, - 0xA443: 0x4E03, - 0xA444: 0x4E43, - 0xA445: 0x4E5D, - 0xA446: 0x4E86, - 0xA447: 0x4E8C, - 0xA448: 0x4EBA, - 0xA449: 0x513F, - 0xA44A: 0x5165, - 0xA44B: 0x516B, - 0xA44C: 0x51E0, - 0xA44D: 0x5200, - 0xA44E: 0x5201, - 0xA44F: 0x529B, - 0xA450: 0x5315, - 0xA451: 0x5341, - 0xA452: 0x535C, - 0xA453: 0x53C8, - 0xA454: 0x4E09, - 0xA455: 0x4E0B, - 0xA456: 0x4E08, - 0xA457: 0x4E0A, - 0xA458: 0x4E2B, - 0xA459: 0x4E38, - 0xA45A: 0x51E1, - 0xA45B: 0x4E45, - 0xA45C: 0x4E48, - 0xA45D: 0x4E5F, - 0xA45E: 0x4E5E, - 0xA45F: 0x4E8E, - 0xA460: 0x4EA1, - 0xA461: 0x5140, - 0xA462: 0x5203, - 0xA463: 0x52FA, - 0xA464: 0x5343, - 0xA465: 0x53C9, - 0xA466: 0x53E3, - 0xA467: 0x571F, - 0xA468: 0x58EB, - 0xA469: 0x5915, - 0xA46A: 0x5927, - 0xA46B: 0x5973, - 0xA46C: 0x5B50, - 0xA46D: 0x5B51, - 0xA46E: 0x5B53, - 0xA46F: 0x5BF8, - 0xA470: 0x5C0F, - 0xA471: 0x5C22, - 0xA472: 0x5C38, - 0xA473: 0x5C71, - 0xA474: 0x5DDD, - 0xA475: 0x5DE5, - 0xA476: 0x5DF1, - 0xA477: 0x5DF2, - 0xA478: 0x5DF3, - 0xA479: 0x5DFE, - 0xA47A: 0x5E72, - 0xA47B: 0x5EFE, - 0xA47C: 0x5F0B, - 0xA47D: 0x5F13, - 0xA47E: 0x624D, - 0xA4A1: 0x4E11, - 0xA4A2: 0x4E10, - 0xA4A3: 0x4E0D, - 0xA4A4: 0x4E2D, - 0xA4A5: 0x4E30, - 0xA4A6: 0x4E39, - 0xA4A7: 0x4E4B, - 0xA4A8: 0x5C39, - 0xA4A9: 0x4E88, - 0xA4AA: 0x4E91, - 0xA4AB: 0x4E95, - 0xA4AC: 0x4E92, - 0xA4AD: 0x4E94, - 0xA4AE: 0x4EA2, - 0xA4AF: 0x4EC1, - 0xA4B0: 0x4EC0, - 0xA4B1: 0x4EC3, - 0xA4B2: 0x4EC6, - 0xA4B3: 0x4EC7, - 0xA4B4: 0x4ECD, - 0xA4B5: 0x4ECA, - 0xA4B6: 0x4ECB, - 0xA4B7: 0x4EC4, - 0xA4B8: 0x5143, - 0xA4B9: 0x5141, - 0xA4BA: 0x5167, - 0xA4BB: 0x516D, - 0xA4BC: 0x516E, - 0xA4BD: 0x516C, - 0xA4BE: 0x5197, - 0xA4BF: 0x51F6, - 0xA4C0: 0x5206, - 0xA4C1: 0x5207, - 0xA4C2: 0x5208, - 0xA4C3: 0x52FB, - 0xA4C4: 0x52FE, - 0xA4C5: 0x52FF, - 0xA4C6: 0x5316, - 0xA4C7: 0x5339, - 0xA4C8: 0x5348, - 0xA4C9: 0x5347, - 0xA4CA: 0x5345, - 0xA4CB: 0x535E, - 0xA4CC: 0x5384, - 0xA4CD: 0x53CB, - 0xA4CE: 0x53CA, - 0xA4CF: 0x53CD, - 0xA4D0: 0x58EC, - 0xA4D1: 0x5929, - 0xA4D2: 0x592B, - 0xA4D3: 0x592A, - 0xA4D4: 0x592D, - 0xA4D5: 0x5B54, - 0xA4D6: 0x5C11, - 0xA4D7: 0x5C24, - 0xA4D8: 0x5C3A, - 0xA4D9: 0x5C6F, - 0xA4DA: 0x5DF4, - 0xA4DB: 0x5E7B, - 0xA4DC: 0x5EFF, - 0xA4DD: 0x5F14, - 0xA4DE: 0x5F15, - 0xA4DF: 0x5FC3, - 0xA4E0: 0x6208, - 0xA4E1: 0x6236, - 0xA4E2: 0x624B, - 0xA4E3: 0x624E, - 0xA4E4: 0x652F, - 0xA4E5: 0x6587, - 0xA4E6: 0x6597, - 0xA4E7: 0x65A4, - 0xA4E8: 0x65B9, - 0xA4E9: 0x65E5, - 0xA4EA: 0x66F0, - 0xA4EB: 0x6708, - 0xA4EC: 0x6728, - 0xA4ED: 0x6B20, - 0xA4EE: 0x6B62, - 0xA4EF: 0x6B79, - 0xA4F0: 0x6BCB, - 0xA4F1: 0x6BD4, - 0xA4F2: 0x6BDB, - 0xA4F3: 0x6C0F, - 0xA4F4: 0x6C34, - 0xA4F5: 0x706B, - 0xA4F6: 0x722A, - 0xA4F7: 0x7236, - 0xA4F8: 0x723B, - 0xA4F9: 0x7247, - 0xA4FA: 0x7259, - 0xA4FB: 0x725B, - 0xA4FC: 0x72AC, - 0xA4FD: 0x738B, - 0xA4FE: 0x4E19, - 0xA540: 0x4E16, - 0xA541: 0x4E15, - 0xA542: 0x4E14, - 0xA543: 0x4E18, - 0xA544: 0x4E3B, - 0xA545: 0x4E4D, - 0xA546: 0x4E4F, - 0xA547: 0x4E4E, - 0xA548: 0x4EE5, - 0xA549: 0x4ED8, - 0xA54A: 0x4ED4, - 0xA54B: 0x4ED5, - 0xA54C: 0x4ED6, - 0xA54D: 0x4ED7, - 0xA54E: 0x4EE3, - 0xA54F: 0x4EE4, - 0xA550: 0x4ED9, - 0xA551: 0x4EDE, - 0xA552: 0x5145, - 0xA553: 0x5144, - 0xA554: 0x5189, - 0xA555: 0x518A, - 0xA556: 0x51AC, - 0xA557: 0x51F9, - 0xA558: 0x51FA, - 0xA559: 0x51F8, - 0xA55A: 0x520A, - 0xA55B: 0x52A0, - 0xA55C: 0x529F, - 0xA55D: 0x5305, - 0xA55E: 0x5306, - 0xA55F: 0x5317, - 0xA560: 0x531D, - 0xA561: 0x4EDF, - 0xA562: 0x534A, - 0xA563: 0x5349, - 0xA564: 0x5361, - 0xA565: 0x5360, - 0xA566: 0x536F, - 0xA567: 0x536E, - 0xA568: 0x53BB, - 0xA569: 0x53EF, - 0xA56A: 0x53E4, - 0xA56B: 0x53F3, - 0xA56C: 0x53EC, - 0xA56D: 0x53EE, - 0xA56E: 0x53E9, - 0xA56F: 0x53E8, - 0xA570: 0x53FC, - 0xA571: 0x53F8, - 0xA572: 0x53F5, - 0xA573: 0x53EB, - 0xA574: 0x53E6, - 0xA575: 0x53EA, - 0xA576: 0x53F2, - 0xA577: 0x53F1, - 0xA578: 0x53F0, - 0xA579: 0x53E5, - 0xA57A: 0x53ED, - 0xA57B: 0x53FB, - 0xA57C: 0x56DB, - 0xA57D: 0x56DA, - 0xA57E: 0x5916, - 0xA5A1: 0x592E, - 0xA5A2: 0x5931, - 0xA5A3: 0x5974, - 0xA5A4: 0x5976, - 0xA5A5: 0x5B55, - 0xA5A6: 0x5B83, - 0xA5A7: 0x5C3C, - 0xA5A8: 0x5DE8, - 0xA5A9: 0x5DE7, - 0xA5AA: 0x5DE6, - 0xA5AB: 0x5E02, - 0xA5AC: 0x5E03, - 0xA5AD: 0x5E73, - 0xA5AE: 0x5E7C, - 0xA5AF: 0x5F01, - 0xA5B0: 0x5F18, - 0xA5B1: 0x5F17, - 0xA5B2: 0x5FC5, - 0xA5B3: 0x620A, - 0xA5B4: 0x6253, - 0xA5B5: 0x6254, - 0xA5B6: 0x6252, - 0xA5B7: 0x6251, - 0xA5B8: 0x65A5, - 0xA5B9: 0x65E6, - 0xA5BA: 0x672E, - 0xA5BB: 0x672C, - 0xA5BC: 0x672A, - 0xA5BD: 0x672B, - 0xA5BE: 0x672D, - 0xA5BF: 0x6B63, - 0xA5C0: 0x6BCD, - 0xA5C1: 0x6C11, - 0xA5C2: 0x6C10, - 0xA5C3: 0x6C38, - 0xA5C4: 0x6C41, - 0xA5C5: 0x6C40, - 0xA5C6: 0x6C3E, - 0xA5C7: 0x72AF, - 0xA5C8: 0x7384, - 0xA5C9: 0x7389, - 0xA5CA: 0x74DC, - 0xA5CB: 0x74E6, - 0xA5CC: 0x7518, - 0xA5CD: 0x751F, - 0xA5CE: 0x7528, - 0xA5CF: 0x7529, - 0xA5D0: 0x7530, - 0xA5D1: 0x7531, - 0xA5D2: 0x7532, - 0xA5D3: 0x7533, - 0xA5D4: 0x758B, - 0xA5D5: 0x767D, - 0xA5D6: 0x76AE, - 0xA5D7: 0x76BF, - 0xA5D8: 0x76EE, - 0xA5D9: 0x77DB, - 0xA5DA: 0x77E2, - 0xA5DB: 0x77F3, - 0xA5DC: 0x793A, - 0xA5DD: 0x79BE, - 0xA5DE: 0x7A74, - 0xA5DF: 0x7ACB, - 0xA5E0: 0x4E1E, - 0xA5E1: 0x4E1F, - 0xA5E2: 0x4E52, - 0xA5E3: 0x4E53, - 0xA5E4: 0x4E69, - 0xA5E5: 0x4E99, - 0xA5E6: 0x4EA4, - 0xA5E7: 0x4EA6, - 0xA5E8: 0x4EA5, - 0xA5E9: 0x4EFF, - 0xA5EA: 0x4F09, - 0xA5EB: 0x4F19, - 0xA5EC: 0x4F0A, - 0xA5ED: 0x4F15, - 0xA5EE: 0x4F0D, - 0xA5EF: 0x4F10, - 0xA5F0: 0x4F11, - 0xA5F1: 0x4F0F, - 0xA5F2: 0x4EF2, - 0xA5F3: 0x4EF6, - 0xA5F4: 0x4EFB, - 0xA5F5: 0x4EF0, - 0xA5F6: 0x4EF3, - 0xA5F7: 0x4EFD, - 0xA5F8: 0x4F01, - 0xA5F9: 0x4F0B, - 0xA5FA: 0x5149, - 0xA5FB: 0x5147, - 0xA5FC: 0x5146, - 0xA5FD: 0x5148, - 0xA5FE: 0x5168, - 0xA640: 0x5171, - 0xA641: 0x518D, - 0xA642: 0x51B0, - 0xA643: 0x5217, - 0xA644: 0x5211, - 0xA645: 0x5212, - 0xA646: 0x520E, - 0xA647: 0x5216, - 0xA648: 0x52A3, - 0xA649: 0x5308, - 0xA64A: 0x5321, - 0xA64B: 0x5320, - 0xA64C: 0x5370, - 0xA64D: 0x5371, - 0xA64E: 0x5409, - 0xA64F: 0x540F, - 0xA650: 0x540C, - 0xA651: 0x540A, - 0xA652: 0x5410, - 0xA653: 0x5401, - 0xA654: 0x540B, - 0xA655: 0x5404, - 0xA656: 0x5411, - 0xA657: 0x540D, - 0xA658: 0x5408, - 0xA659: 0x5403, - 0xA65A: 0x540E, - 0xA65B: 0x5406, - 0xA65C: 0x5412, - 0xA65D: 0x56E0, - 0xA65E: 0x56DE, - 0xA65F: 0x56DD, - 0xA660: 0x5733, - 0xA661: 0x5730, - 0xA662: 0x5728, - 0xA663: 0x572D, - 0xA664: 0x572C, - 0xA665: 0x572F, - 0xA666: 0x5729, - 0xA667: 0x5919, - 0xA668: 0x591A, - 0xA669: 0x5937, - 0xA66A: 0x5938, - 0xA66B: 0x5984, - 0xA66C: 0x5978, - 0xA66D: 0x5983, - 0xA66E: 0x597D, - 0xA66F: 0x5979, - 0xA670: 0x5982, - 0xA671: 0x5981, - 0xA672: 0x5B57, - 0xA673: 0x5B58, - 0xA674: 0x5B87, - 0xA675: 0x5B88, - 0xA676: 0x5B85, - 0xA677: 0x5B89, - 0xA678: 0x5BFA, - 0xA679: 0x5C16, - 0xA67A: 0x5C79, - 0xA67B: 0x5DDE, - 0xA67C: 0x5E06, - 0xA67D: 0x5E76, - 0xA67E: 0x5E74, - 0xA6A1: 0x5F0F, - 0xA6A2: 0x5F1B, - 0xA6A3: 0x5FD9, - 0xA6A4: 0x5FD6, - 0xA6A5: 0x620E, - 0xA6A6: 0x620C, - 0xA6A7: 0x620D, - 0xA6A8: 0x6210, - 0xA6A9: 0x6263, - 0xA6AA: 0x625B, - 0xA6AB: 0x6258, - 0xA6AC: 0x6536, - 0xA6AD: 0x65E9, - 0xA6AE: 0x65E8, - 0xA6AF: 0x65EC, - 0xA6B0: 0x65ED, - 0xA6B1: 0x66F2, - 0xA6B2: 0x66F3, - 0xA6B3: 0x6709, - 0xA6B4: 0x673D, - 0xA6B5: 0x6734, - 0xA6B6: 0x6731, - 0xA6B7: 0x6735, - 0xA6B8: 0x6B21, - 0xA6B9: 0x6B64, - 0xA6BA: 0x6B7B, - 0xA6BB: 0x6C16, - 0xA6BC: 0x6C5D, - 0xA6BD: 0x6C57, - 0xA6BE: 0x6C59, - 0xA6BF: 0x6C5F, - 0xA6C0: 0x6C60, - 0xA6C1: 0x6C50, - 0xA6C2: 0x6C55, - 0xA6C3: 0x6C61, - 0xA6C4: 0x6C5B, - 0xA6C5: 0x6C4D, - 0xA6C6: 0x6C4E, - 0xA6C7: 0x7070, - 0xA6C8: 0x725F, - 0xA6C9: 0x725D, - 0xA6CA: 0x767E, - 0xA6CB: 0x7AF9, - 0xA6CC: 0x7C73, - 0xA6CD: 0x7CF8, - 0xA6CE: 0x7F36, - 0xA6CF: 0x7F8A, - 0xA6D0: 0x7FBD, - 0xA6D1: 0x8001, - 0xA6D2: 0x8003, - 0xA6D3: 0x800C, - 0xA6D4: 0x8012, - 0xA6D5: 0x8033, - 0xA6D6: 0x807F, - 0xA6D7: 0x8089, - 0xA6D8: 0x808B, - 0xA6D9: 0x808C, - 0xA6DA: 0x81E3, - 0xA6DB: 0x81EA, - 0xA6DC: 0x81F3, - 0xA6DD: 0x81FC, - 0xA6DE: 0x820C, - 0xA6DF: 0x821B, - 0xA6E0: 0x821F, - 0xA6E1: 0x826E, - 0xA6E2: 0x8272, - 0xA6E3: 0x827E, - 0xA6E4: 0x866B, - 0xA6E5: 0x8840, - 0xA6E6: 0x884C, - 0xA6E7: 0x8863, - 0xA6E8: 0x897F, - 0xA6E9: 0x9621, - 0xA6EA: 0x4E32, - 0xA6EB: 0x4EA8, - 0xA6EC: 0x4F4D, - 0xA6ED: 0x4F4F, - 0xA6EE: 0x4F47, - 0xA6EF: 0x4F57, - 0xA6F0: 0x4F5E, - 0xA6F1: 0x4F34, - 0xA6F2: 0x4F5B, - 0xA6F3: 0x4F55, - 0xA6F4: 0x4F30, - 0xA6F5: 0x4F50, - 0xA6F6: 0x4F51, - 0xA6F7: 0x4F3D, - 0xA6F8: 0x4F3A, - 0xA6F9: 0x4F38, - 0xA6FA: 0x4F43, - 0xA6FB: 0x4F54, - 0xA6FC: 0x4F3C, - 0xA6FD: 0x4F46, - 0xA6FE: 0x4F63, - 0xA740: 0x4F5C, - 0xA741: 0x4F60, - 0xA742: 0x4F2F, - 0xA743: 0x4F4E, - 0xA744: 0x4F36, - 0xA745: 0x4F59, - 0xA746: 0x4F5D, - 0xA747: 0x4F48, - 0xA748: 0x4F5A, - 0xA749: 0x514C, - 0xA74A: 0x514B, - 0xA74B: 0x514D, - 0xA74C: 0x5175, - 0xA74D: 0x51B6, - 0xA74E: 0x51B7, - 0xA74F: 0x5225, - 0xA750: 0x5224, - 0xA751: 0x5229, - 0xA752: 0x522A, - 0xA753: 0x5228, - 0xA754: 0x52AB, - 0xA755: 0x52A9, - 0xA756: 0x52AA, - 0xA757: 0x52AC, - 0xA758: 0x5323, - 0xA759: 0x5373, - 0xA75A: 0x5375, - 0xA75B: 0x541D, - 0xA75C: 0x542D, - 0xA75D: 0x541E, - 0xA75E: 0x543E, - 0xA75F: 0x5426, - 0xA760: 0x544E, - 0xA761: 0x5427, - 0xA762: 0x5446, - 0xA763: 0x5443, - 0xA764: 0x5433, - 0xA765: 0x5448, - 0xA766: 0x5442, - 0xA767: 0x541B, - 0xA768: 0x5429, - 0xA769: 0x544A, - 0xA76A: 0x5439, - 0xA76B: 0x543B, - 0xA76C: 0x5438, - 0xA76D: 0x542E, - 0xA76E: 0x5435, - 0xA76F: 0x5436, - 0xA770: 0x5420, - 0xA771: 0x543C, - 0xA772: 0x5440, - 0xA773: 0x5431, - 0xA774: 0x542B, - 0xA775: 0x541F, - 0xA776: 0x542C, - 0xA777: 0x56EA, - 0xA778: 0x56F0, - 0xA779: 0x56E4, - 0xA77A: 0x56EB, - 0xA77B: 0x574A, - 0xA77C: 0x5751, - 0xA77D: 0x5740, - 0xA77E: 0x574D, - 0xA7A1: 0x5747, - 0xA7A2: 0x574E, - 0xA7A3: 0x573E, - 0xA7A4: 0x5750, - 0xA7A5: 0x574F, - 0xA7A6: 0x573B, - 0xA7A7: 0x58EF, - 0xA7A8: 0x593E, - 0xA7A9: 0x599D, - 0xA7AA: 0x5992, - 0xA7AB: 0x59A8, - 0xA7AC: 0x599E, - 0xA7AD: 0x59A3, - 0xA7AE: 0x5999, - 0xA7AF: 0x5996, - 0xA7B0: 0x598D, - 0xA7B1: 0x59A4, - 0xA7B2: 0x5993, - 0xA7B3: 0x598A, - 0xA7B4: 0x59A5, - 0xA7B5: 0x5B5D, - 0xA7B6: 0x5B5C, - 0xA7B7: 0x5B5A, - 0xA7B8: 0x5B5B, - 0xA7B9: 0x5B8C, - 0xA7BA: 0x5B8B, - 0xA7BB: 0x5B8F, - 0xA7BC: 0x5C2C, - 0xA7BD: 0x5C40, - 0xA7BE: 0x5C41, - 0xA7BF: 0x5C3F, - 0xA7C0: 0x5C3E, - 0xA7C1: 0x5C90, - 0xA7C2: 0x5C91, - 0xA7C3: 0x5C94, - 0xA7C4: 0x5C8C, - 0xA7C5: 0x5DEB, - 0xA7C6: 0x5E0C, - 0xA7C7: 0x5E8F, - 0xA7C8: 0x5E87, - 0xA7C9: 0x5E8A, - 0xA7CA: 0x5EF7, - 0xA7CB: 0x5F04, - 0xA7CC: 0x5F1F, - 0xA7CD: 0x5F64, - 0xA7CE: 0x5F62, - 0xA7CF: 0x5F77, - 0xA7D0: 0x5F79, - 0xA7D1: 0x5FD8, - 0xA7D2: 0x5FCC, - 0xA7D3: 0x5FD7, - 0xA7D4: 0x5FCD, - 0xA7D5: 0x5FF1, - 0xA7D6: 0x5FEB, - 0xA7D7: 0x5FF8, - 0xA7D8: 0x5FEA, - 0xA7D9: 0x6212, - 0xA7DA: 0x6211, - 0xA7DB: 0x6284, - 0xA7DC: 0x6297, - 0xA7DD: 0x6296, - 0xA7DE: 0x6280, - 0xA7DF: 0x6276, - 0xA7E0: 0x6289, - 0xA7E1: 0x626D, - 0xA7E2: 0x628A, - 0xA7E3: 0x627C, - 0xA7E4: 0x627E, - 0xA7E5: 0x6279, - 0xA7E6: 0x6273, - 0xA7E7: 0x6292, - 0xA7E8: 0x626F, - 0xA7E9: 0x6298, - 0xA7EA: 0x626E, - 0xA7EB: 0x6295, - 0xA7EC: 0x6293, - 0xA7ED: 0x6291, - 0xA7EE: 0x6286, - 0xA7EF: 0x6539, - 0xA7F0: 0x653B, - 0xA7F1: 0x6538, - 0xA7F2: 0x65F1, - 0xA7F3: 0x66F4, - 0xA7F4: 0x675F, - 0xA7F5: 0x674E, - 0xA7F6: 0x674F, - 0xA7F7: 0x6750, - 0xA7F8: 0x6751, - 0xA7F9: 0x675C, - 0xA7FA: 0x6756, - 0xA7FB: 0x675E, - 0xA7FC: 0x6749, - 0xA7FD: 0x6746, - 0xA7FE: 0x6760, - 0xA840: 0x6753, - 0xA841: 0x6757, - 0xA842: 0x6B65, - 0xA843: 0x6BCF, - 0xA844: 0x6C42, - 0xA845: 0x6C5E, - 0xA846: 0x6C99, - 0xA847: 0x6C81, - 0xA848: 0x6C88, - 0xA849: 0x6C89, - 0xA84A: 0x6C85, - 0xA84B: 0x6C9B, - 0xA84C: 0x6C6A, - 0xA84D: 0x6C7A, - 0xA84E: 0x6C90, - 0xA84F: 0x6C70, - 0xA850: 0x6C8C, - 0xA851: 0x6C68, - 0xA852: 0x6C96, - 0xA853: 0x6C92, - 0xA854: 0x6C7D, - 0xA855: 0x6C83, - 0xA856: 0x6C72, - 0xA857: 0x6C7E, - 0xA858: 0x6C74, - 0xA859: 0x6C86, - 0xA85A: 0x6C76, - 0xA85B: 0x6C8D, - 0xA85C: 0x6C94, - 0xA85D: 0x6C98, - 0xA85E: 0x6C82, - 0xA85F: 0x7076, - 0xA860: 0x707C, - 0xA861: 0x707D, - 0xA862: 0x7078, - 0xA863: 0x7262, - 0xA864: 0x7261, - 0xA865: 0x7260, - 0xA866: 0x72C4, - 0xA867: 0x72C2, - 0xA868: 0x7396, - 0xA869: 0x752C, - 0xA86A: 0x752B, - 0xA86B: 0x7537, - 0xA86C: 0x7538, - 0xA86D: 0x7682, - 0xA86E: 0x76EF, - 0xA86F: 0x77E3, - 0xA870: 0x79C1, - 0xA871: 0x79C0, - 0xA872: 0x79BF, - 0xA873: 0x7A76, - 0xA874: 0x7CFB, - 0xA875: 0x7F55, - 0xA876: 0x8096, - 0xA877: 0x8093, - 0xA878: 0x809D, - 0xA879: 0x8098, - 0xA87A: 0x809B, - 0xA87B: 0x809A, - 0xA87C: 0x80B2, - 0xA87D: 0x826F, - 0xA87E: 0x8292, - 0xA8A1: 0x828B, - 0xA8A2: 0x828D, - 0xA8A3: 0x898B, - 0xA8A4: 0x89D2, - 0xA8A5: 0x8A00, - 0xA8A6: 0x8C37, - 0xA8A7: 0x8C46, - 0xA8A8: 0x8C55, - 0xA8A9: 0x8C9D, - 0xA8AA: 0x8D64, - 0xA8AB: 0x8D70, - 0xA8AC: 0x8DB3, - 0xA8AD: 0x8EAB, - 0xA8AE: 0x8ECA, - 0xA8AF: 0x8F9B, - 0xA8B0: 0x8FB0, - 0xA8B1: 0x8FC2, - 0xA8B2: 0x8FC6, - 0xA8B3: 0x8FC5, - 0xA8B4: 0x8FC4, - 0xA8B5: 0x5DE1, - 0xA8B6: 0x9091, - 0xA8B7: 0x90A2, - 0xA8B8: 0x90AA, - 0xA8B9: 0x90A6, - 0xA8BA: 0x90A3, - 0xA8BB: 0x9149, - 0xA8BC: 0x91C6, - 0xA8BD: 0x91CC, - 0xA8BE: 0x9632, - 0xA8BF: 0x962E, - 0xA8C0: 0x9631, - 0xA8C1: 0x962A, - 0xA8C2: 0x962C, - 0xA8C3: 0x4E26, - 0xA8C4: 0x4E56, - 0xA8C5: 0x4E73, - 0xA8C6: 0x4E8B, - 0xA8C7: 0x4E9B, - 0xA8C8: 0x4E9E, - 0xA8C9: 0x4EAB, - 0xA8CA: 0x4EAC, - 0xA8CB: 0x4F6F, - 0xA8CC: 0x4F9D, - 0xA8CD: 0x4F8D, - 0xA8CE: 0x4F73, - 0xA8CF: 0x4F7F, - 0xA8D0: 0x4F6C, - 0xA8D1: 0x4F9B, - 0xA8D2: 0x4F8B, - 0xA8D3: 0x4F86, - 0xA8D4: 0x4F83, - 0xA8D5: 0x4F70, - 0xA8D6: 0x4F75, - 0xA8D7: 0x4F88, - 0xA8D8: 0x4F69, - 0xA8D9: 0x4F7B, - 0xA8DA: 0x4F96, - 0xA8DB: 0x4F7E, - 0xA8DC: 0x4F8F, - 0xA8DD: 0x4F91, - 0xA8DE: 0x4F7A, - 0xA8DF: 0x5154, - 0xA8E0: 0x5152, - 0xA8E1: 0x5155, - 0xA8E2: 0x5169, - 0xA8E3: 0x5177, - 0xA8E4: 0x5176, - 0xA8E5: 0x5178, - 0xA8E6: 0x51BD, - 0xA8E7: 0x51FD, - 0xA8E8: 0x523B, - 0xA8E9: 0x5238, - 0xA8EA: 0x5237, - 0xA8EB: 0x523A, - 0xA8EC: 0x5230, - 0xA8ED: 0x522E, - 0xA8EE: 0x5236, - 0xA8EF: 0x5241, - 0xA8F0: 0x52BE, - 0xA8F1: 0x52BB, - 0xA8F2: 0x5352, - 0xA8F3: 0x5354, - 0xA8F4: 0x5353, - 0xA8F5: 0x5351, - 0xA8F6: 0x5366, - 0xA8F7: 0x5377, - 0xA8F8: 0x5378, - 0xA8F9: 0x5379, - 0xA8FA: 0x53D6, - 0xA8FB: 0x53D4, - 0xA8FC: 0x53D7, - 0xA8FD: 0x5473, - 0xA8FE: 0x5475, - 0xA940: 0x5496, - 0xA941: 0x5478, - 0xA942: 0x5495, - 0xA943: 0x5480, - 0xA944: 0x547B, - 0xA945: 0x5477, - 0xA946: 0x5484, - 0xA947: 0x5492, - 0xA948: 0x5486, - 0xA949: 0x547C, - 0xA94A: 0x5490, - 0xA94B: 0x5471, - 0xA94C: 0x5476, - 0xA94D: 0x548C, - 0xA94E: 0x549A, - 0xA94F: 0x5462, - 0xA950: 0x5468, - 0xA951: 0x548B, - 0xA952: 0x547D, - 0xA953: 0x548E, - 0xA954: 0x56FA, - 0xA955: 0x5783, - 0xA956: 0x5777, - 0xA957: 0x576A, - 0xA958: 0x5769, - 0xA959: 0x5761, - 0xA95A: 0x5766, - 0xA95B: 0x5764, - 0xA95C: 0x577C, - 0xA95D: 0x591C, - 0xA95E: 0x5949, - 0xA95F: 0x5947, - 0xA960: 0x5948, - 0xA961: 0x5944, - 0xA962: 0x5954, - 0xA963: 0x59BE, - 0xA964: 0x59BB, - 0xA965: 0x59D4, - 0xA966: 0x59B9, - 0xA967: 0x59AE, - 0xA968: 0x59D1, - 0xA969: 0x59C6, - 0xA96A: 0x59D0, - 0xA96B: 0x59CD, - 0xA96C: 0x59CB, - 0xA96D: 0x59D3, - 0xA96E: 0x59CA, - 0xA96F: 0x59AF, - 0xA970: 0x59B3, - 0xA971: 0x59D2, - 0xA972: 0x59C5, - 0xA973: 0x5B5F, - 0xA974: 0x5B64, - 0xA975: 0x5B63, - 0xA976: 0x5B97, - 0xA977: 0x5B9A, - 0xA978: 0x5B98, - 0xA979: 0x5B9C, - 0xA97A: 0x5B99, - 0xA97B: 0x5B9B, - 0xA97C: 0x5C1A, - 0xA97D: 0x5C48, - 0xA97E: 0x5C45, - 0xA9A1: 0x5C46, - 0xA9A2: 0x5CB7, - 0xA9A3: 0x5CA1, - 0xA9A4: 0x5CB8, - 0xA9A5: 0x5CA9, - 0xA9A6: 0x5CAB, - 0xA9A7: 0x5CB1, - 0xA9A8: 0x5CB3, - 0xA9A9: 0x5E18, - 0xA9AA: 0x5E1A, - 0xA9AB: 0x5E16, - 0xA9AC: 0x5E15, - 0xA9AD: 0x5E1B, - 0xA9AE: 0x5E11, - 0xA9AF: 0x5E78, - 0xA9B0: 0x5E9A, - 0xA9B1: 0x5E97, - 0xA9B2: 0x5E9C, - 0xA9B3: 0x5E95, - 0xA9B4: 0x5E96, - 0xA9B5: 0x5EF6, - 0xA9B6: 0x5F26, - 0xA9B7: 0x5F27, - 0xA9B8: 0x5F29, - 0xA9B9: 0x5F80, - 0xA9BA: 0x5F81, - 0xA9BB: 0x5F7F, - 0xA9BC: 0x5F7C, - 0xA9BD: 0x5FDD, - 0xA9BE: 0x5FE0, - 0xA9BF: 0x5FFD, - 0xA9C0: 0x5FF5, - 0xA9C1: 0x5FFF, - 0xA9C2: 0x600F, - 0xA9C3: 0x6014, - 0xA9C4: 0x602F, - 0xA9C5: 0x6035, - 0xA9C6: 0x6016, - 0xA9C7: 0x602A, - 0xA9C8: 0x6015, - 0xA9C9: 0x6021, - 0xA9CA: 0x6027, - 0xA9CB: 0x6029, - 0xA9CC: 0x602B, - 0xA9CD: 0x601B, - 0xA9CE: 0x6216, - 0xA9CF: 0x6215, - 0xA9D0: 0x623F, - 0xA9D1: 0x623E, - 0xA9D2: 0x6240, - 0xA9D3: 0x627F, - 0xA9D4: 0x62C9, - 0xA9D5: 0x62CC, - 0xA9D6: 0x62C4, - 0xA9D7: 0x62BF, - 0xA9D8: 0x62C2, - 0xA9D9: 0x62B9, - 0xA9DA: 0x62D2, - 0xA9DB: 0x62DB, - 0xA9DC: 0x62AB, - 0xA9DD: 0x62D3, - 0xA9DE: 0x62D4, - 0xA9DF: 0x62CB, - 0xA9E0: 0x62C8, - 0xA9E1: 0x62A8, - 0xA9E2: 0x62BD, - 0xA9E3: 0x62BC, - 0xA9E4: 0x62D0, - 0xA9E5: 0x62D9, - 0xA9E6: 0x62C7, - 0xA9E7: 0x62CD, - 0xA9E8: 0x62B5, - 0xA9E9: 0x62DA, - 0xA9EA: 0x62B1, - 0xA9EB: 0x62D8, - 0xA9EC: 0x62D6, - 0xA9ED: 0x62D7, - 0xA9EE: 0x62C6, - 0xA9EF: 0x62AC, - 0xA9F0: 0x62CE, - 0xA9F1: 0x653E, - 0xA9F2: 0x65A7, - 0xA9F3: 0x65BC, - 0xA9F4: 0x65FA, - 0xA9F5: 0x6614, - 0xA9F6: 0x6613, - 0xA9F7: 0x660C, - 0xA9F8: 0x6606, - 0xA9F9: 0x6602, - 0xA9FA: 0x660E, - 0xA9FB: 0x6600, - 0xA9FC: 0x660F, - 0xA9FD: 0x6615, - 0xA9FE: 0x660A, - 0xAA40: 0x6607, - 0xAA41: 0x670D, - 0xAA42: 0x670B, - 0xAA43: 0x676D, - 0xAA44: 0x678B, - 0xAA45: 0x6795, - 0xAA46: 0x6771, - 0xAA47: 0x679C, - 0xAA48: 0x6773, - 0xAA49: 0x6777, - 0xAA4A: 0x6787, - 0xAA4B: 0x679D, - 0xAA4C: 0x6797, - 0xAA4D: 0x676F, - 0xAA4E: 0x6770, - 0xAA4F: 0x677F, - 0xAA50: 0x6789, - 0xAA51: 0x677E, - 0xAA52: 0x6790, - 0xAA53: 0x6775, - 0xAA54: 0x679A, - 0xAA55: 0x6793, - 0xAA56: 0x677C, - 0xAA57: 0x676A, - 0xAA58: 0x6772, - 0xAA59: 0x6B23, - 0xAA5A: 0x6B66, - 0xAA5B: 0x6B67, - 0xAA5C: 0x6B7F, - 0xAA5D: 0x6C13, - 0xAA5E: 0x6C1B, - 0xAA5F: 0x6CE3, - 0xAA60: 0x6CE8, - 0xAA61: 0x6CF3, - 0xAA62: 0x6CB1, - 0xAA63: 0x6CCC, - 0xAA64: 0x6CE5, - 0xAA65: 0x6CB3, - 0xAA66: 0x6CBD, - 0xAA67: 0x6CBE, - 0xAA68: 0x6CBC, - 0xAA69: 0x6CE2, - 0xAA6A: 0x6CAB, - 0xAA6B: 0x6CD5, - 0xAA6C: 0x6CD3, - 0xAA6D: 0x6CB8, - 0xAA6E: 0x6CC4, - 0xAA6F: 0x6CB9, - 0xAA70: 0x6CC1, - 0xAA71: 0x6CAE, - 0xAA72: 0x6CD7, - 0xAA73: 0x6CC5, - 0xAA74: 0x6CF1, - 0xAA75: 0x6CBF, - 0xAA76: 0x6CBB, - 0xAA77: 0x6CE1, - 0xAA78: 0x6CDB, - 0xAA79: 0x6CCA, - 0xAA7A: 0x6CAC, - 0xAA7B: 0x6CEF, - 0xAA7C: 0x6CDC, - 0xAA7D: 0x6CD6, - 0xAA7E: 0x6CE0, - 0xAAA1: 0x7095, - 0xAAA2: 0x708E, - 0xAAA3: 0x7092, - 0xAAA4: 0x708A, - 0xAAA5: 0x7099, - 0xAAA6: 0x722C, - 0xAAA7: 0x722D, - 0xAAA8: 0x7238, - 0xAAA9: 0x7248, - 0xAAAA: 0x7267, - 0xAAAB: 0x7269, - 0xAAAC: 0x72C0, - 0xAAAD: 0x72CE, - 0xAAAE: 0x72D9, - 0xAAAF: 0x72D7, - 0xAAB0: 0x72D0, - 0xAAB1: 0x73A9, - 0xAAB2: 0x73A8, - 0xAAB3: 0x739F, - 0xAAB4: 0x73AB, - 0xAAB5: 0x73A5, - 0xAAB6: 0x753D, - 0xAAB7: 0x759D, - 0xAAB8: 0x7599, - 0xAAB9: 0x759A, - 0xAABA: 0x7684, - 0xAABB: 0x76C2, - 0xAABC: 0x76F2, - 0xAABD: 0x76F4, - 0xAABE: 0x77E5, - 0xAABF: 0x77FD, - 0xAAC0: 0x793E, - 0xAAC1: 0x7940, - 0xAAC2: 0x7941, - 0xAAC3: 0x79C9, - 0xAAC4: 0x79C8, - 0xAAC5: 0x7A7A, - 0xAAC6: 0x7A79, - 0xAAC7: 0x7AFA, - 0xAAC8: 0x7CFE, - 0xAAC9: 0x7F54, - 0xAACA: 0x7F8C, - 0xAACB: 0x7F8B, - 0xAACC: 0x8005, - 0xAACD: 0x80BA, - 0xAACE: 0x80A5, - 0xAACF: 0x80A2, - 0xAAD0: 0x80B1, - 0xAAD1: 0x80A1, - 0xAAD2: 0x80AB, - 0xAAD3: 0x80A9, - 0xAAD4: 0x80B4, - 0xAAD5: 0x80AA, - 0xAAD6: 0x80AF, - 0xAAD7: 0x81E5, - 0xAAD8: 0x81FE, - 0xAAD9: 0x820D, - 0xAADA: 0x82B3, - 0xAADB: 0x829D, - 0xAADC: 0x8299, - 0xAADD: 0x82AD, - 0xAADE: 0x82BD, - 0xAADF: 0x829F, - 0xAAE0: 0x82B9, - 0xAAE1: 0x82B1, - 0xAAE2: 0x82AC, - 0xAAE3: 0x82A5, - 0xAAE4: 0x82AF, - 0xAAE5: 0x82B8, - 0xAAE6: 0x82A3, - 0xAAE7: 0x82B0, - 0xAAE8: 0x82BE, - 0xAAE9: 0x82B7, - 0xAAEA: 0x864E, - 0xAAEB: 0x8671, - 0xAAEC: 0x521D, - 0xAAED: 0x8868, - 0xAAEE: 0x8ECB, - 0xAAEF: 0x8FCE, - 0xAAF0: 0x8FD4, - 0xAAF1: 0x8FD1, - 0xAAF2: 0x90B5, - 0xAAF3: 0x90B8, - 0xAAF4: 0x90B1, - 0xAAF5: 0x90B6, - 0xAAF6: 0x91C7, - 0xAAF7: 0x91D1, - 0xAAF8: 0x9577, - 0xAAF9: 0x9580, - 0xAAFA: 0x961C, - 0xAAFB: 0x9640, - 0xAAFC: 0x963F, - 0xAAFD: 0x963B, - 0xAAFE: 0x9644, - 0xAB40: 0x9642, - 0xAB41: 0x96B9, - 0xAB42: 0x96E8, - 0xAB43: 0x9752, - 0xAB44: 0x975E, - 0xAB45: 0x4E9F, - 0xAB46: 0x4EAD, - 0xAB47: 0x4EAE, - 0xAB48: 0x4FE1, - 0xAB49: 0x4FB5, - 0xAB4A: 0x4FAF, - 0xAB4B: 0x4FBF, - 0xAB4C: 0x4FE0, - 0xAB4D: 0x4FD1, - 0xAB4E: 0x4FCF, - 0xAB4F: 0x4FDD, - 0xAB50: 0x4FC3, - 0xAB51: 0x4FB6, - 0xAB52: 0x4FD8, - 0xAB53: 0x4FDF, - 0xAB54: 0x4FCA, - 0xAB55: 0x4FD7, - 0xAB56: 0x4FAE, - 0xAB57: 0x4FD0, - 0xAB58: 0x4FC4, - 0xAB59: 0x4FC2, - 0xAB5A: 0x4FDA, - 0xAB5B: 0x4FCE, - 0xAB5C: 0x4FDE, - 0xAB5D: 0x4FB7, - 0xAB5E: 0x5157, - 0xAB5F: 0x5192, - 0xAB60: 0x5191, - 0xAB61: 0x51A0, - 0xAB62: 0x524E, - 0xAB63: 0x5243, - 0xAB64: 0x524A, - 0xAB65: 0x524D, - 0xAB66: 0x524C, - 0xAB67: 0x524B, - 0xAB68: 0x5247, - 0xAB69: 0x52C7, - 0xAB6A: 0x52C9, - 0xAB6B: 0x52C3, - 0xAB6C: 0x52C1, - 0xAB6D: 0x530D, - 0xAB6E: 0x5357, - 0xAB6F: 0x537B, - 0xAB70: 0x539A, - 0xAB71: 0x53DB, - 0xAB72: 0x54AC, - 0xAB73: 0x54C0, - 0xAB74: 0x54A8, - 0xAB75: 0x54CE, - 0xAB76: 0x54C9, - 0xAB77: 0x54B8, - 0xAB78: 0x54A6, - 0xAB79: 0x54B3, - 0xAB7A: 0x54C7, - 0xAB7B: 0x54C2, - 0xAB7C: 0x54BD, - 0xAB7D: 0x54AA, - 0xAB7E: 0x54C1, - 0xABA1: 0x54C4, - 0xABA2: 0x54C8, - 0xABA3: 0x54AF, - 0xABA4: 0x54AB, - 0xABA5: 0x54B1, - 0xABA6: 0x54BB, - 0xABA7: 0x54A9, - 0xABA8: 0x54A7, - 0xABA9: 0x54BF, - 0xABAA: 0x56FF, - 0xABAB: 0x5782, - 0xABAC: 0x578B, - 0xABAD: 0x57A0, - 0xABAE: 0x57A3, - 0xABAF: 0x57A2, - 0xABB0: 0x57CE, - 0xABB1: 0x57AE, - 0xABB2: 0x5793, - 0xABB3: 0x5955, - 0xABB4: 0x5951, - 0xABB5: 0x594F, - 0xABB6: 0x594E, - 0xABB7: 0x5950, - 0xABB8: 0x59DC, - 0xABB9: 0x59D8, - 0xABBA: 0x59FF, - 0xABBB: 0x59E3, - 0xABBC: 0x59E8, - 0xABBD: 0x5A03, - 0xABBE: 0x59E5, - 0xABBF: 0x59EA, - 0xABC0: 0x59DA, - 0xABC1: 0x59E6, - 0xABC2: 0x5A01, - 0xABC3: 0x59FB, - 0xABC4: 0x5B69, - 0xABC5: 0x5BA3, - 0xABC6: 0x5BA6, - 0xABC7: 0x5BA4, - 0xABC8: 0x5BA2, - 0xABC9: 0x5BA5, - 0xABCA: 0x5C01, - 0xABCB: 0x5C4E, - 0xABCC: 0x5C4F, - 0xABCD: 0x5C4D, - 0xABCE: 0x5C4B, - 0xABCF: 0x5CD9, - 0xABD0: 0x5CD2, - 0xABD1: 0x5DF7, - 0xABD2: 0x5E1D, - 0xABD3: 0x5E25, - 0xABD4: 0x5E1F, - 0xABD5: 0x5E7D, - 0xABD6: 0x5EA0, - 0xABD7: 0x5EA6, - 0xABD8: 0x5EFA, - 0xABD9: 0x5F08, - 0xABDA: 0x5F2D, - 0xABDB: 0x5F65, - 0xABDC: 0x5F88, - 0xABDD: 0x5F85, - 0xABDE: 0x5F8A, - 0xABDF: 0x5F8B, - 0xABE0: 0x5F87, - 0xABE1: 0x5F8C, - 0xABE2: 0x5F89, - 0xABE3: 0x6012, - 0xABE4: 0x601D, - 0xABE5: 0x6020, - 0xABE6: 0x6025, - 0xABE7: 0x600E, - 0xABE8: 0x6028, - 0xABE9: 0x604D, - 0xABEA: 0x6070, - 0xABEB: 0x6068, - 0xABEC: 0x6062, - 0xABED: 0x6046, - 0xABEE: 0x6043, - 0xABEF: 0x606C, - 0xABF0: 0x606B, - 0xABF1: 0x606A, - 0xABF2: 0x6064, - 0xABF3: 0x6241, - 0xABF4: 0x62DC, - 0xABF5: 0x6316, - 0xABF6: 0x6309, - 0xABF7: 0x62FC, - 0xABF8: 0x62ED, - 0xABF9: 0x6301, - 0xABFA: 0x62EE, - 0xABFB: 0x62FD, - 0xABFC: 0x6307, - 0xABFD: 0x62F1, - 0xABFE: 0x62F7, - 0xAC40: 0x62EF, - 0xAC41: 0x62EC, - 0xAC42: 0x62FE, - 0xAC43: 0x62F4, - 0xAC44: 0x6311, - 0xAC45: 0x6302, - 0xAC46: 0x653F, - 0xAC47: 0x6545, - 0xAC48: 0x65AB, - 0xAC49: 0x65BD, - 0xAC4A: 0x65E2, - 0xAC4B: 0x6625, - 0xAC4C: 0x662D, - 0xAC4D: 0x6620, - 0xAC4E: 0x6627, - 0xAC4F: 0x662F, - 0xAC50: 0x661F, - 0xAC51: 0x6628, - 0xAC52: 0x6631, - 0xAC53: 0x6624, - 0xAC54: 0x66F7, - 0xAC55: 0x67FF, - 0xAC56: 0x67D3, - 0xAC57: 0x67F1, - 0xAC58: 0x67D4, - 0xAC59: 0x67D0, - 0xAC5A: 0x67EC, - 0xAC5B: 0x67B6, - 0xAC5C: 0x67AF, - 0xAC5D: 0x67F5, - 0xAC5E: 0x67E9, - 0xAC5F: 0x67EF, - 0xAC60: 0x67C4, - 0xAC61: 0x67D1, - 0xAC62: 0x67B4, - 0xAC63: 0x67DA, - 0xAC64: 0x67E5, - 0xAC65: 0x67B8, - 0xAC66: 0x67CF, - 0xAC67: 0x67DE, - 0xAC68: 0x67F3, - 0xAC69: 0x67B0, - 0xAC6A: 0x67D9, - 0xAC6B: 0x67E2, - 0xAC6C: 0x67DD, - 0xAC6D: 0x67D2, - 0xAC6E: 0x6B6A, - 0xAC6F: 0x6B83, - 0xAC70: 0x6B86, - 0xAC71: 0x6BB5, - 0xAC72: 0x6BD2, - 0xAC73: 0x6BD7, - 0xAC74: 0x6C1F, - 0xAC75: 0x6CC9, - 0xAC76: 0x6D0B, - 0xAC77: 0x6D32, - 0xAC78: 0x6D2A, - 0xAC79: 0x6D41, - 0xAC7A: 0x6D25, - 0xAC7B: 0x6D0C, - 0xAC7C: 0x6D31, - 0xAC7D: 0x6D1E, - 0xAC7E: 0x6D17, - 0xACA1: 0x6D3B, - 0xACA2: 0x6D3D, - 0xACA3: 0x6D3E, - 0xACA4: 0x6D36, - 0xACA5: 0x6D1B, - 0xACA6: 0x6CF5, - 0xACA7: 0x6D39, - 0xACA8: 0x6D27, - 0xACA9: 0x6D38, - 0xACAA: 0x6D29, - 0xACAB: 0x6D2E, - 0xACAC: 0x6D35, - 0xACAD: 0x6D0E, - 0xACAE: 0x6D2B, - 0xACAF: 0x70AB, - 0xACB0: 0x70BA, - 0xACB1: 0x70B3, - 0xACB2: 0x70AC, - 0xACB3: 0x70AF, - 0xACB4: 0x70AD, - 0xACB5: 0x70B8, - 0xACB6: 0x70AE, - 0xACB7: 0x70A4, - 0xACB8: 0x7230, - 0xACB9: 0x7272, - 0xACBA: 0x726F, - 0xACBB: 0x7274, - 0xACBC: 0x72E9, - 0xACBD: 0x72E0, - 0xACBE: 0x72E1, - 0xACBF: 0x73B7, - 0xACC0: 0x73CA, - 0xACC1: 0x73BB, - 0xACC2: 0x73B2, - 0xACC3: 0x73CD, - 0xACC4: 0x73C0, - 0xACC5: 0x73B3, - 0xACC6: 0x751A, - 0xACC7: 0x752D, - 0xACC8: 0x754F, - 0xACC9: 0x754C, - 0xACCA: 0x754E, - 0xACCB: 0x754B, - 0xACCC: 0x75AB, - 0xACCD: 0x75A4, - 0xACCE: 0x75A5, - 0xACCF: 0x75A2, - 0xACD0: 0x75A3, - 0xACD1: 0x7678, - 0xACD2: 0x7686, - 0xACD3: 0x7687, - 0xACD4: 0x7688, - 0xACD5: 0x76C8, - 0xACD6: 0x76C6, - 0xACD7: 0x76C3, - 0xACD8: 0x76C5, - 0xACD9: 0x7701, - 0xACDA: 0x76F9, - 0xACDB: 0x76F8, - 0xACDC: 0x7709, - 0xACDD: 0x770B, - 0xACDE: 0x76FE, - 0xACDF: 0x76FC, - 0xACE0: 0x7707, - 0xACE1: 0x77DC, - 0xACE2: 0x7802, - 0xACE3: 0x7814, - 0xACE4: 0x780C, - 0xACE5: 0x780D, - 0xACE6: 0x7946, - 0xACE7: 0x7949, - 0xACE8: 0x7948, - 0xACE9: 0x7947, - 0xACEA: 0x79B9, - 0xACEB: 0x79BA, - 0xACEC: 0x79D1, - 0xACED: 0x79D2, - 0xACEE: 0x79CB, - 0xACEF: 0x7A7F, - 0xACF0: 0x7A81, - 0xACF1: 0x7AFF, - 0xACF2: 0x7AFD, - 0xACF3: 0x7C7D, - 0xACF4: 0x7D02, - 0xACF5: 0x7D05, - 0xACF6: 0x7D00, - 0xACF7: 0x7D09, - 0xACF8: 0x7D07, - 0xACF9: 0x7D04, - 0xACFA: 0x7D06, - 0xACFB: 0x7F38, - 0xACFC: 0x7F8E, - 0xACFD: 0x7FBF, - 0xACFE: 0x8004, - 0xAD40: 0x8010, - 0xAD41: 0x800D, - 0xAD42: 0x8011, - 0xAD43: 0x8036, - 0xAD44: 0x80D6, - 0xAD45: 0x80E5, - 0xAD46: 0x80DA, - 0xAD47: 0x80C3, - 0xAD48: 0x80C4, - 0xAD49: 0x80CC, - 0xAD4A: 0x80E1, - 0xAD4B: 0x80DB, - 0xAD4C: 0x80CE, - 0xAD4D: 0x80DE, - 0xAD4E: 0x80E4, - 0xAD4F: 0x80DD, - 0xAD50: 0x81F4, - 0xAD51: 0x8222, - 0xAD52: 0x82E7, - 0xAD53: 0x8303, - 0xAD54: 0x8305, - 0xAD55: 0x82E3, - 0xAD56: 0x82DB, - 0xAD57: 0x82E6, - 0xAD58: 0x8304, - 0xAD59: 0x82E5, - 0xAD5A: 0x8302, - 0xAD5B: 0x8309, - 0xAD5C: 0x82D2, - 0xAD5D: 0x82D7, - 0xAD5E: 0x82F1, - 0xAD5F: 0x8301, - 0xAD60: 0x82DC, - 0xAD61: 0x82D4, - 0xAD62: 0x82D1, - 0xAD63: 0x82DE, - 0xAD64: 0x82D3, - 0xAD65: 0x82DF, - 0xAD66: 0x82EF, - 0xAD67: 0x8306, - 0xAD68: 0x8650, - 0xAD69: 0x8679, - 0xAD6A: 0x867B, - 0xAD6B: 0x867A, - 0xAD6C: 0x884D, - 0xAD6D: 0x886B, - 0xAD6E: 0x8981, - 0xAD6F: 0x89D4, - 0xAD70: 0x8A08, - 0xAD71: 0x8A02, - 0xAD72: 0x8A03, - 0xAD73: 0x8C9E, - 0xAD74: 0x8CA0, - 0xAD75: 0x8D74, - 0xAD76: 0x8D73, - 0xAD77: 0x8DB4, - 0xAD78: 0x8ECD, - 0xAD79: 0x8ECC, - 0xAD7A: 0x8FF0, - 0xAD7B: 0x8FE6, - 0xAD7C: 0x8FE2, - 0xAD7D: 0x8FEA, - 0xAD7E: 0x8FE5, - 0xADA1: 0x8FED, - 0xADA2: 0x8FEB, - 0xADA3: 0x8FE4, - 0xADA4: 0x8FE8, - 0xADA5: 0x90CA, - 0xADA6: 0x90CE, - 0xADA7: 0x90C1, - 0xADA8: 0x90C3, - 0xADA9: 0x914B, - 0xADAA: 0x914A, - 0xADAB: 0x91CD, - 0xADAC: 0x9582, - 0xADAD: 0x9650, - 0xADAE: 0x964B, - 0xADAF: 0x964C, - 0xADB0: 0x964D, - 0xADB1: 0x9762, - 0xADB2: 0x9769, - 0xADB3: 0x97CB, - 0xADB4: 0x97ED, - 0xADB5: 0x97F3, - 0xADB6: 0x9801, - 0xADB7: 0x98A8, - 0xADB8: 0x98DB, - 0xADB9: 0x98DF, - 0xADBA: 0x9996, - 0xADBB: 0x9999, - 0xADBC: 0x4E58, - 0xADBD: 0x4EB3, - 0xADBE: 0x500C, - 0xADBF: 0x500D, - 0xADC0: 0x5023, - 0xADC1: 0x4FEF, - 0xADC2: 0x5026, - 0xADC3: 0x5025, - 0xADC4: 0x4FF8, - 0xADC5: 0x5029, - 0xADC6: 0x5016, - 0xADC7: 0x5006, - 0xADC8: 0x503C, - 0xADC9: 0x501F, - 0xADCA: 0x501A, - 0xADCB: 0x5012, - 0xADCC: 0x5011, - 0xADCD: 0x4FFA, - 0xADCE: 0x5000, - 0xADCF: 0x5014, - 0xADD0: 0x5028, - 0xADD1: 0x4FF1, - 0xADD2: 0x5021, - 0xADD3: 0x500B, - 0xADD4: 0x5019, - 0xADD5: 0x5018, - 0xADD6: 0x4FF3, - 0xADD7: 0x4FEE, - 0xADD8: 0x502D, - 0xADD9: 0x502A, - 0xADDA: 0x4FFE, - 0xADDB: 0x502B, - 0xADDC: 0x5009, - 0xADDD: 0x517C, - 0xADDE: 0x51A4, - 0xADDF: 0x51A5, - 0xADE0: 0x51A2, - 0xADE1: 0x51CD, - 0xADE2: 0x51CC, - 0xADE3: 0x51C6, - 0xADE4: 0x51CB, - 0xADE5: 0x5256, - 0xADE6: 0x525C, - 0xADE7: 0x5254, - 0xADE8: 0x525B, - 0xADE9: 0x525D, - 0xADEA: 0x532A, - 0xADEB: 0x537F, - 0xADEC: 0x539F, - 0xADED: 0x539D, - 0xADEE: 0x53DF, - 0xADEF: 0x54E8, - 0xADF0: 0x5510, - 0xADF1: 0x5501, - 0xADF2: 0x5537, - 0xADF3: 0x54FC, - 0xADF4: 0x54E5, - 0xADF5: 0x54F2, - 0xADF6: 0x5506, - 0xADF7: 0x54FA, - 0xADF8: 0x5514, - 0xADF9: 0x54E9, - 0xADFA: 0x54ED, - 0xADFB: 0x54E1, - 0xADFC: 0x5509, - 0xADFD: 0x54EE, - 0xADFE: 0x54EA, - 0xAE40: 0x54E6, - 0xAE41: 0x5527, - 0xAE42: 0x5507, - 0xAE43: 0x54FD, - 0xAE44: 0x550F, - 0xAE45: 0x5703, - 0xAE46: 0x5704, - 0xAE47: 0x57C2, - 0xAE48: 0x57D4, - 0xAE49: 0x57CB, - 0xAE4A: 0x57C3, - 0xAE4B: 0x5809, - 0xAE4C: 0x590F, - 0xAE4D: 0x5957, - 0xAE4E: 0x5958, - 0xAE4F: 0x595A, - 0xAE50: 0x5A11, - 0xAE51: 0x5A18, - 0xAE52: 0x5A1C, - 0xAE53: 0x5A1F, - 0xAE54: 0x5A1B, - 0xAE55: 0x5A13, - 0xAE56: 0x59EC, - 0xAE57: 0x5A20, - 0xAE58: 0x5A23, - 0xAE59: 0x5A29, - 0xAE5A: 0x5A25, - 0xAE5B: 0x5A0C, - 0xAE5C: 0x5A09, - 0xAE5D: 0x5B6B, - 0xAE5E: 0x5C58, - 0xAE5F: 0x5BB0, - 0xAE60: 0x5BB3, - 0xAE61: 0x5BB6, - 0xAE62: 0x5BB4, - 0xAE63: 0x5BAE, - 0xAE64: 0x5BB5, - 0xAE65: 0x5BB9, - 0xAE66: 0x5BB8, - 0xAE67: 0x5C04, - 0xAE68: 0x5C51, - 0xAE69: 0x5C55, - 0xAE6A: 0x5C50, - 0xAE6B: 0x5CED, - 0xAE6C: 0x5CFD, - 0xAE6D: 0x5CFB, - 0xAE6E: 0x5CEA, - 0xAE6F: 0x5CE8, - 0xAE70: 0x5CF0, - 0xAE71: 0x5CF6, - 0xAE72: 0x5D01, - 0xAE73: 0x5CF4, - 0xAE74: 0x5DEE, - 0xAE75: 0x5E2D, - 0xAE76: 0x5E2B, - 0xAE77: 0x5EAB, - 0xAE78: 0x5EAD, - 0xAE79: 0x5EA7, - 0xAE7A: 0x5F31, - 0xAE7B: 0x5F92, - 0xAE7C: 0x5F91, - 0xAE7D: 0x5F90, - 0xAE7E: 0x6059, - 0xAEA1: 0x6063, - 0xAEA2: 0x6065, - 0xAEA3: 0x6050, - 0xAEA4: 0x6055, - 0xAEA5: 0x606D, - 0xAEA6: 0x6069, - 0xAEA7: 0x606F, - 0xAEA8: 0x6084, - 0xAEA9: 0x609F, - 0xAEAA: 0x609A, - 0xAEAB: 0x608D, - 0xAEAC: 0x6094, - 0xAEAD: 0x608C, - 0xAEAE: 0x6085, - 0xAEAF: 0x6096, - 0xAEB0: 0x6247, - 0xAEB1: 0x62F3, - 0xAEB2: 0x6308, - 0xAEB3: 0x62FF, - 0xAEB4: 0x634E, - 0xAEB5: 0x633E, - 0xAEB6: 0x632F, - 0xAEB7: 0x6355, - 0xAEB8: 0x6342, - 0xAEB9: 0x6346, - 0xAEBA: 0x634F, - 0xAEBB: 0x6349, - 0xAEBC: 0x633A, - 0xAEBD: 0x6350, - 0xAEBE: 0x633D, - 0xAEBF: 0x632A, - 0xAEC0: 0x632B, - 0xAEC1: 0x6328, - 0xAEC2: 0x634D, - 0xAEC3: 0x634C, - 0xAEC4: 0x6548, - 0xAEC5: 0x6549, - 0xAEC6: 0x6599, - 0xAEC7: 0x65C1, - 0xAEC8: 0x65C5, - 0xAEC9: 0x6642, - 0xAECA: 0x6649, - 0xAECB: 0x664F, - 0xAECC: 0x6643, - 0xAECD: 0x6652, - 0xAECE: 0x664C, - 0xAECF: 0x6645, - 0xAED0: 0x6641, - 0xAED1: 0x66F8, - 0xAED2: 0x6714, - 0xAED3: 0x6715, - 0xAED4: 0x6717, - 0xAED5: 0x6821, - 0xAED6: 0x6838, - 0xAED7: 0x6848, - 0xAED8: 0x6846, - 0xAED9: 0x6853, - 0xAEDA: 0x6839, - 0xAEDB: 0x6842, - 0xAEDC: 0x6854, - 0xAEDD: 0x6829, - 0xAEDE: 0x68B3, - 0xAEDF: 0x6817, - 0xAEE0: 0x684C, - 0xAEE1: 0x6851, - 0xAEE2: 0x683D, - 0xAEE3: 0x67F4, - 0xAEE4: 0x6850, - 0xAEE5: 0x6840, - 0xAEE6: 0x683C, - 0xAEE7: 0x6843, - 0xAEE8: 0x682A, - 0xAEE9: 0x6845, - 0xAEEA: 0x6813, - 0xAEEB: 0x6818, - 0xAEEC: 0x6841, - 0xAEED: 0x6B8A, - 0xAEEE: 0x6B89, - 0xAEEF: 0x6BB7, - 0xAEF0: 0x6C23, - 0xAEF1: 0x6C27, - 0xAEF2: 0x6C28, - 0xAEF3: 0x6C26, - 0xAEF4: 0x6C24, - 0xAEF5: 0x6CF0, - 0xAEF6: 0x6D6A, - 0xAEF7: 0x6D95, - 0xAEF8: 0x6D88, - 0xAEF9: 0x6D87, - 0xAEFA: 0x6D66, - 0xAEFB: 0x6D78, - 0xAEFC: 0x6D77, - 0xAEFD: 0x6D59, - 0xAEFE: 0x6D93, - 0xAF40: 0x6D6C, - 0xAF41: 0x6D89, - 0xAF42: 0x6D6E, - 0xAF43: 0x6D5A, - 0xAF44: 0x6D74, - 0xAF45: 0x6D69, - 0xAF46: 0x6D8C, - 0xAF47: 0x6D8A, - 0xAF48: 0x6D79, - 0xAF49: 0x6D85, - 0xAF4A: 0x6D65, - 0xAF4B: 0x6D94, - 0xAF4C: 0x70CA, - 0xAF4D: 0x70D8, - 0xAF4E: 0x70E4, - 0xAF4F: 0x70D9, - 0xAF50: 0x70C8, - 0xAF51: 0x70CF, - 0xAF52: 0x7239, - 0xAF53: 0x7279, - 0xAF54: 0x72FC, - 0xAF55: 0x72F9, - 0xAF56: 0x72FD, - 0xAF57: 0x72F8, - 0xAF58: 0x72F7, - 0xAF59: 0x7386, - 0xAF5A: 0x73ED, - 0xAF5B: 0x7409, - 0xAF5C: 0x73EE, - 0xAF5D: 0x73E0, - 0xAF5E: 0x73EA, - 0xAF5F: 0x73DE, - 0xAF60: 0x7554, - 0xAF61: 0x755D, - 0xAF62: 0x755C, - 0xAF63: 0x755A, - 0xAF64: 0x7559, - 0xAF65: 0x75BE, - 0xAF66: 0x75C5, - 0xAF67: 0x75C7, - 0xAF68: 0x75B2, - 0xAF69: 0x75B3, - 0xAF6A: 0x75BD, - 0xAF6B: 0x75BC, - 0xAF6C: 0x75B9, - 0xAF6D: 0x75C2, - 0xAF6E: 0x75B8, - 0xAF6F: 0x768B, - 0xAF70: 0x76B0, - 0xAF71: 0x76CA, - 0xAF72: 0x76CD, - 0xAF73: 0x76CE, - 0xAF74: 0x7729, - 0xAF75: 0x771F, - 0xAF76: 0x7720, - 0xAF77: 0x7728, - 0xAF78: 0x77E9, - 0xAF79: 0x7830, - 0xAF7A: 0x7827, - 0xAF7B: 0x7838, - 0xAF7C: 0x781D, - 0xAF7D: 0x7834, - 0xAF7E: 0x7837, - 0xAFA1: 0x7825, - 0xAFA2: 0x782D, - 0xAFA3: 0x7820, - 0xAFA4: 0x781F, - 0xAFA5: 0x7832, - 0xAFA6: 0x7955, - 0xAFA7: 0x7950, - 0xAFA8: 0x7960, - 0xAFA9: 0x795F, - 0xAFAA: 0x7956, - 0xAFAB: 0x795E, - 0xAFAC: 0x795D, - 0xAFAD: 0x7957, - 0xAFAE: 0x795A, - 0xAFAF: 0x79E4, - 0xAFB0: 0x79E3, - 0xAFB1: 0x79E7, - 0xAFB2: 0x79DF, - 0xAFB3: 0x79E6, - 0xAFB4: 0x79E9, - 0xAFB5: 0x79D8, - 0xAFB6: 0x7A84, - 0xAFB7: 0x7A88, - 0xAFB8: 0x7AD9, - 0xAFB9: 0x7B06, - 0xAFBA: 0x7B11, - 0xAFBB: 0x7C89, - 0xAFBC: 0x7D21, - 0xAFBD: 0x7D17, - 0xAFBE: 0x7D0B, - 0xAFBF: 0x7D0A, - 0xAFC0: 0x7D20, - 0xAFC1: 0x7D22, - 0xAFC2: 0x7D14, - 0xAFC3: 0x7D10, - 0xAFC4: 0x7D15, - 0xAFC5: 0x7D1A, - 0xAFC6: 0x7D1C, - 0xAFC7: 0x7D0D, - 0xAFC8: 0x7D19, - 0xAFC9: 0x7D1B, - 0xAFCA: 0x7F3A, - 0xAFCB: 0x7F5F, - 0xAFCC: 0x7F94, - 0xAFCD: 0x7FC5, - 0xAFCE: 0x7FC1, - 0xAFCF: 0x8006, - 0xAFD0: 0x8018, - 0xAFD1: 0x8015, - 0xAFD2: 0x8019, - 0xAFD3: 0x8017, - 0xAFD4: 0x803D, - 0xAFD5: 0x803F, - 0xAFD6: 0x80F1, - 0xAFD7: 0x8102, - 0xAFD8: 0x80F0, - 0xAFD9: 0x8105, - 0xAFDA: 0x80ED, - 0xAFDB: 0x80F4, - 0xAFDC: 0x8106, - 0xAFDD: 0x80F8, - 0xAFDE: 0x80F3, - 0xAFDF: 0x8108, - 0xAFE0: 0x80FD, - 0xAFE1: 0x810A, - 0xAFE2: 0x80FC, - 0xAFE3: 0x80EF, - 0xAFE4: 0x81ED, - 0xAFE5: 0x81EC, - 0xAFE6: 0x8200, - 0xAFE7: 0x8210, - 0xAFE8: 0x822A, - 0xAFE9: 0x822B, - 0xAFEA: 0x8228, - 0xAFEB: 0x822C, - 0xAFEC: 0x82BB, - 0xAFED: 0x832B, - 0xAFEE: 0x8352, - 0xAFEF: 0x8354, - 0xAFF0: 0x834A, - 0xAFF1: 0x8338, - 0xAFF2: 0x8350, - 0xAFF3: 0x8349, - 0xAFF4: 0x8335, - 0xAFF5: 0x8334, - 0xAFF6: 0x834F, - 0xAFF7: 0x8332, - 0xAFF8: 0x8339, - 0xAFF9: 0x8336, - 0xAFFA: 0x8317, - 0xAFFB: 0x8340, - 0xAFFC: 0x8331, - 0xAFFD: 0x8328, - 0xAFFE: 0x8343, - 0xB040: 0x8654, - 0xB041: 0x868A, - 0xB042: 0x86AA, - 0xB043: 0x8693, - 0xB044: 0x86A4, - 0xB045: 0x86A9, - 0xB046: 0x868C, - 0xB047: 0x86A3, - 0xB048: 0x869C, - 0xB049: 0x8870, - 0xB04A: 0x8877, - 0xB04B: 0x8881, - 0xB04C: 0x8882, - 0xB04D: 0x887D, - 0xB04E: 0x8879, - 0xB04F: 0x8A18, - 0xB050: 0x8A10, - 0xB051: 0x8A0E, - 0xB052: 0x8A0C, - 0xB053: 0x8A15, - 0xB054: 0x8A0A, - 0xB055: 0x8A17, - 0xB056: 0x8A13, - 0xB057: 0x8A16, - 0xB058: 0x8A0F, - 0xB059: 0x8A11, - 0xB05A: 0x8C48, - 0xB05B: 0x8C7A, - 0xB05C: 0x8C79, - 0xB05D: 0x8CA1, - 0xB05E: 0x8CA2, - 0xB05F: 0x8D77, - 0xB060: 0x8EAC, - 0xB061: 0x8ED2, - 0xB062: 0x8ED4, - 0xB063: 0x8ECF, - 0xB064: 0x8FB1, - 0xB065: 0x9001, - 0xB066: 0x9006, - 0xB067: 0x8FF7, - 0xB068: 0x9000, - 0xB069: 0x8FFA, - 0xB06A: 0x8FF4, - 0xB06B: 0x9003, - 0xB06C: 0x8FFD, - 0xB06D: 0x9005, - 0xB06E: 0x8FF8, - 0xB06F: 0x9095, - 0xB070: 0x90E1, - 0xB071: 0x90DD, - 0xB072: 0x90E2, - 0xB073: 0x9152, - 0xB074: 0x914D, - 0xB075: 0x914C, - 0xB076: 0x91D8, - 0xB077: 0x91DD, - 0xB078: 0x91D7, - 0xB079: 0x91DC, - 0xB07A: 0x91D9, - 0xB07B: 0x9583, - 0xB07C: 0x9662, - 0xB07D: 0x9663, - 0xB07E: 0x9661, - 0xB0A1: 0x965B, - 0xB0A2: 0x965D, - 0xB0A3: 0x9664, - 0xB0A4: 0x9658, - 0xB0A5: 0x965E, - 0xB0A6: 0x96BB, - 0xB0A7: 0x98E2, - 0xB0A8: 0x99AC, - 0xB0A9: 0x9AA8, - 0xB0AA: 0x9AD8, - 0xB0AB: 0x9B25, - 0xB0AC: 0x9B32, - 0xB0AD: 0x9B3C, - 0xB0AE: 0x4E7E, - 0xB0AF: 0x507A, - 0xB0B0: 0x507D, - 0xB0B1: 0x505C, - 0xB0B2: 0x5047, - 0xB0B3: 0x5043, - 0xB0B4: 0x504C, - 0xB0B5: 0x505A, - 0xB0B6: 0x5049, - 0xB0B7: 0x5065, - 0xB0B8: 0x5076, - 0xB0B9: 0x504E, - 0xB0BA: 0x5055, - 0xB0BB: 0x5075, - 0xB0BC: 0x5074, - 0xB0BD: 0x5077, - 0xB0BE: 0x504F, - 0xB0BF: 0x500F, - 0xB0C0: 0x506F, - 0xB0C1: 0x506D, - 0xB0C2: 0x515C, - 0xB0C3: 0x5195, - 0xB0C4: 0x51F0, - 0xB0C5: 0x526A, - 0xB0C6: 0x526F, - 0xB0C7: 0x52D2, - 0xB0C8: 0x52D9, - 0xB0C9: 0x52D8, - 0xB0CA: 0x52D5, - 0xB0CB: 0x5310, - 0xB0CC: 0x530F, - 0xB0CD: 0x5319, - 0xB0CE: 0x533F, - 0xB0CF: 0x5340, - 0xB0D0: 0x533E, - 0xB0D1: 0x53C3, - 0xB0D2: 0x66FC, - 0xB0D3: 0x5546, - 0xB0D4: 0x556A, - 0xB0D5: 0x5566, - 0xB0D6: 0x5544, - 0xB0D7: 0x555E, - 0xB0D8: 0x5561, - 0xB0D9: 0x5543, - 0xB0DA: 0x554A, - 0xB0DB: 0x5531, - 0xB0DC: 0x5556, - 0xB0DD: 0x554F, - 0xB0DE: 0x5555, - 0xB0DF: 0x552F, - 0xB0E0: 0x5564, - 0xB0E1: 0x5538, - 0xB0E2: 0x552E, - 0xB0E3: 0x555C, - 0xB0E4: 0x552C, - 0xB0E5: 0x5563, - 0xB0E6: 0x5533, - 0xB0E7: 0x5541, - 0xB0E8: 0x5557, - 0xB0E9: 0x5708, - 0xB0EA: 0x570B, - 0xB0EB: 0x5709, - 0xB0EC: 0x57DF, - 0xB0ED: 0x5805, - 0xB0EE: 0x580A, - 0xB0EF: 0x5806, - 0xB0F0: 0x57E0, - 0xB0F1: 0x57E4, - 0xB0F2: 0x57FA, - 0xB0F3: 0x5802, - 0xB0F4: 0x5835, - 0xB0F5: 0x57F7, - 0xB0F6: 0x57F9, - 0xB0F7: 0x5920, - 0xB0F8: 0x5962, - 0xB0F9: 0x5A36, - 0xB0FA: 0x5A41, - 0xB0FB: 0x5A49, - 0xB0FC: 0x5A66, - 0xB0FD: 0x5A6A, - 0xB0FE: 0x5A40, - 0xB140: 0x5A3C, - 0xB141: 0x5A62, - 0xB142: 0x5A5A, - 0xB143: 0x5A46, - 0xB144: 0x5A4A, - 0xB145: 0x5B70, - 0xB146: 0x5BC7, - 0xB147: 0x5BC5, - 0xB148: 0x5BC4, - 0xB149: 0x5BC2, - 0xB14A: 0x5BBF, - 0xB14B: 0x5BC6, - 0xB14C: 0x5C09, - 0xB14D: 0x5C08, - 0xB14E: 0x5C07, - 0xB14F: 0x5C60, - 0xB150: 0x5C5C, - 0xB151: 0x5C5D, - 0xB152: 0x5D07, - 0xB153: 0x5D06, - 0xB154: 0x5D0E, - 0xB155: 0x5D1B, - 0xB156: 0x5D16, - 0xB157: 0x5D22, - 0xB158: 0x5D11, - 0xB159: 0x5D29, - 0xB15A: 0x5D14, - 0xB15B: 0x5D19, - 0xB15C: 0x5D24, - 0xB15D: 0x5D27, - 0xB15E: 0x5D17, - 0xB15F: 0x5DE2, - 0xB160: 0x5E38, - 0xB161: 0x5E36, - 0xB162: 0x5E33, - 0xB163: 0x5E37, - 0xB164: 0x5EB7, - 0xB165: 0x5EB8, - 0xB166: 0x5EB6, - 0xB167: 0x5EB5, - 0xB168: 0x5EBE, - 0xB169: 0x5F35, - 0xB16A: 0x5F37, - 0xB16B: 0x5F57, - 0xB16C: 0x5F6C, - 0xB16D: 0x5F69, - 0xB16E: 0x5F6B, - 0xB16F: 0x5F97, - 0xB170: 0x5F99, - 0xB171: 0x5F9E, - 0xB172: 0x5F98, - 0xB173: 0x5FA1, - 0xB174: 0x5FA0, - 0xB175: 0x5F9C, - 0xB176: 0x607F, - 0xB177: 0x60A3, - 0xB178: 0x6089, - 0xB179: 0x60A0, - 0xB17A: 0x60A8, - 0xB17B: 0x60CB, - 0xB17C: 0x60B4, - 0xB17D: 0x60E6, - 0xB17E: 0x60BD, - 0xB1A1: 0x60C5, - 0xB1A2: 0x60BB, - 0xB1A3: 0x60B5, - 0xB1A4: 0x60DC, - 0xB1A5: 0x60BC, - 0xB1A6: 0x60D8, - 0xB1A7: 0x60D5, - 0xB1A8: 0x60C6, - 0xB1A9: 0x60DF, - 0xB1AA: 0x60B8, - 0xB1AB: 0x60DA, - 0xB1AC: 0x60C7, - 0xB1AD: 0x621A, - 0xB1AE: 0x621B, - 0xB1AF: 0x6248, - 0xB1B0: 0x63A0, - 0xB1B1: 0x63A7, - 0xB1B2: 0x6372, - 0xB1B3: 0x6396, - 0xB1B4: 0x63A2, - 0xB1B5: 0x63A5, - 0xB1B6: 0x6377, - 0xB1B7: 0x6367, - 0xB1B8: 0x6398, - 0xB1B9: 0x63AA, - 0xB1BA: 0x6371, - 0xB1BB: 0x63A9, - 0xB1BC: 0x6389, - 0xB1BD: 0x6383, - 0xB1BE: 0x639B, - 0xB1BF: 0x636B, - 0xB1C0: 0x63A8, - 0xB1C1: 0x6384, - 0xB1C2: 0x6388, - 0xB1C3: 0x6399, - 0xB1C4: 0x63A1, - 0xB1C5: 0x63AC, - 0xB1C6: 0x6392, - 0xB1C7: 0x638F, - 0xB1C8: 0x6380, - 0xB1C9: 0x637B, - 0xB1CA: 0x6369, - 0xB1CB: 0x6368, - 0xB1CC: 0x637A, - 0xB1CD: 0x655D, - 0xB1CE: 0x6556, - 0xB1CF: 0x6551, - 0xB1D0: 0x6559, - 0xB1D1: 0x6557, - 0xB1D2: 0x555F, - 0xB1D3: 0x654F, - 0xB1D4: 0x6558, - 0xB1D5: 0x6555, - 0xB1D6: 0x6554, - 0xB1D7: 0x659C, - 0xB1D8: 0x659B, - 0xB1D9: 0x65AC, - 0xB1DA: 0x65CF, - 0xB1DB: 0x65CB, - 0xB1DC: 0x65CC, - 0xB1DD: 0x65CE, - 0xB1DE: 0x665D, - 0xB1DF: 0x665A, - 0xB1E0: 0x6664, - 0xB1E1: 0x6668, - 0xB1E2: 0x6666, - 0xB1E3: 0x665E, - 0xB1E4: 0x66F9, - 0xB1E5: 0x52D7, - 0xB1E6: 0x671B, - 0xB1E7: 0x6881, - 0xB1E8: 0x68AF, - 0xB1E9: 0x68A2, - 0xB1EA: 0x6893, - 0xB1EB: 0x68B5, - 0xB1EC: 0x687F, - 0xB1ED: 0x6876, - 0xB1EE: 0x68B1, - 0xB1EF: 0x68A7, - 0xB1F0: 0x6897, - 0xB1F1: 0x68B0, - 0xB1F2: 0x6883, - 0xB1F3: 0x68C4, - 0xB1F4: 0x68AD, - 0xB1F5: 0x6886, - 0xB1F6: 0x6885, - 0xB1F7: 0x6894, - 0xB1F8: 0x689D, - 0xB1F9: 0x68A8, - 0xB1FA: 0x689F, - 0xB1FB: 0x68A1, - 0xB1FC: 0x6882, - 0xB1FD: 0x6B32, - 0xB1FE: 0x6BBA, - 0xB240: 0x6BEB, - 0xB241: 0x6BEC, - 0xB242: 0x6C2B, - 0xB243: 0x6D8E, - 0xB244: 0x6DBC, - 0xB245: 0x6DF3, - 0xB246: 0x6DD9, - 0xB247: 0x6DB2, - 0xB248: 0x6DE1, - 0xB249: 0x6DCC, - 0xB24A: 0x6DE4, - 0xB24B: 0x6DFB, - 0xB24C: 0x6DFA, - 0xB24D: 0x6E05, - 0xB24E: 0x6DC7, - 0xB24F: 0x6DCB, - 0xB250: 0x6DAF, - 0xB251: 0x6DD1, - 0xB252: 0x6DAE, - 0xB253: 0x6DDE, - 0xB254: 0x6DF9, - 0xB255: 0x6DB8, - 0xB256: 0x6DF7, - 0xB257: 0x6DF5, - 0xB258: 0x6DC5, - 0xB259: 0x6DD2, - 0xB25A: 0x6E1A, - 0xB25B: 0x6DB5, - 0xB25C: 0x6DDA, - 0xB25D: 0x6DEB, - 0xB25E: 0x6DD8, - 0xB25F: 0x6DEA, - 0xB260: 0x6DF1, - 0xB261: 0x6DEE, - 0xB262: 0x6DE8, - 0xB263: 0x6DC6, - 0xB264: 0x6DC4, - 0xB265: 0x6DAA, - 0xB266: 0x6DEC, - 0xB267: 0x6DBF, - 0xB268: 0x6DE6, - 0xB269: 0x70F9, - 0xB26A: 0x7109, - 0xB26B: 0x710A, - 0xB26C: 0x70FD, - 0xB26D: 0x70EF, - 0xB26E: 0x723D, - 0xB26F: 0x727D, - 0xB270: 0x7281, - 0xB271: 0x731C, - 0xB272: 0x731B, - 0xB273: 0x7316, - 0xB274: 0x7313, - 0xB275: 0x7319, - 0xB276: 0x7387, - 0xB277: 0x7405, - 0xB278: 0x740A, - 0xB279: 0x7403, - 0xB27A: 0x7406, - 0xB27B: 0x73FE, - 0xB27C: 0x740D, - 0xB27D: 0x74E0, - 0xB27E: 0x74F6, - 0xB2A1: 0x74F7, - 0xB2A2: 0x751C, - 0xB2A3: 0x7522, - 0xB2A4: 0x7565, - 0xB2A5: 0x7566, - 0xB2A6: 0x7562, - 0xB2A7: 0x7570, - 0xB2A8: 0x758F, - 0xB2A9: 0x75D4, - 0xB2AA: 0x75D5, - 0xB2AB: 0x75B5, - 0xB2AC: 0x75CA, - 0xB2AD: 0x75CD, - 0xB2AE: 0x768E, - 0xB2AF: 0x76D4, - 0xB2B0: 0x76D2, - 0xB2B1: 0x76DB, - 0xB2B2: 0x7737, - 0xB2B3: 0x773E, - 0xB2B4: 0x773C, - 0xB2B5: 0x7736, - 0xB2B6: 0x7738, - 0xB2B7: 0x773A, - 0xB2B8: 0x786B, - 0xB2B9: 0x7843, - 0xB2BA: 0x784E, - 0xB2BB: 0x7965, - 0xB2BC: 0x7968, - 0xB2BD: 0x796D, - 0xB2BE: 0x79FB, - 0xB2BF: 0x7A92, - 0xB2C0: 0x7A95, - 0xB2C1: 0x7B20, - 0xB2C2: 0x7B28, - 0xB2C3: 0x7B1B, - 0xB2C4: 0x7B2C, - 0xB2C5: 0x7B26, - 0xB2C6: 0x7B19, - 0xB2C7: 0x7B1E, - 0xB2C8: 0x7B2E, - 0xB2C9: 0x7C92, - 0xB2CA: 0x7C97, - 0xB2CB: 0x7C95, - 0xB2CC: 0x7D46, - 0xB2CD: 0x7D43, - 0xB2CE: 0x7D71, - 0xB2CF: 0x7D2E, - 0xB2D0: 0x7D39, - 0xB2D1: 0x7D3C, - 0xB2D2: 0x7D40, - 0xB2D3: 0x7D30, - 0xB2D4: 0x7D33, - 0xB2D5: 0x7D44, - 0xB2D6: 0x7D2F, - 0xB2D7: 0x7D42, - 0xB2D8: 0x7D32, - 0xB2D9: 0x7D31, - 0xB2DA: 0x7F3D, - 0xB2DB: 0x7F9E, - 0xB2DC: 0x7F9A, - 0xB2DD: 0x7FCC, - 0xB2DE: 0x7FCE, - 0xB2DF: 0x7FD2, - 0xB2E0: 0x801C, - 0xB2E1: 0x804A, - 0xB2E2: 0x8046, - 0xB2E3: 0x812F, - 0xB2E4: 0x8116, - 0xB2E5: 0x8123, - 0xB2E6: 0x812B, - 0xB2E7: 0x8129, - 0xB2E8: 0x8130, - 0xB2E9: 0x8124, - 0xB2EA: 0x8202, - 0xB2EB: 0x8235, - 0xB2EC: 0x8237, - 0xB2ED: 0x8236, - 0xB2EE: 0x8239, - 0xB2EF: 0x838E, - 0xB2F0: 0x839E, - 0xB2F1: 0x8398, - 0xB2F2: 0x8378, - 0xB2F3: 0x83A2, - 0xB2F4: 0x8396, - 0xB2F5: 0x83BD, - 0xB2F6: 0x83AB, - 0xB2F7: 0x8392, - 0xB2F8: 0x838A, - 0xB2F9: 0x8393, - 0xB2FA: 0x8389, - 0xB2FB: 0x83A0, - 0xB2FC: 0x8377, - 0xB2FD: 0x837B, - 0xB2FE: 0x837C, - 0xB340: 0x8386, - 0xB341: 0x83A7, - 0xB342: 0x8655, - 0xB343: 0x5F6A, - 0xB344: 0x86C7, - 0xB345: 0x86C0, - 0xB346: 0x86B6, - 0xB347: 0x86C4, - 0xB348: 0x86B5, - 0xB349: 0x86C6, - 0xB34A: 0x86CB, - 0xB34B: 0x86B1, - 0xB34C: 0x86AF, - 0xB34D: 0x86C9, - 0xB34E: 0x8853, - 0xB34F: 0x889E, - 0xB350: 0x8888, - 0xB351: 0x88AB, - 0xB352: 0x8892, - 0xB353: 0x8896, - 0xB354: 0x888D, - 0xB355: 0x888B, - 0xB356: 0x8993, - 0xB357: 0x898F, - 0xB358: 0x8A2A, - 0xB359: 0x8A1D, - 0xB35A: 0x8A23, - 0xB35B: 0x8A25, - 0xB35C: 0x8A31, - 0xB35D: 0x8A2D, - 0xB35E: 0x8A1F, - 0xB35F: 0x8A1B, - 0xB360: 0x8A22, - 0xB361: 0x8C49, - 0xB362: 0x8C5A, - 0xB363: 0x8CA9, - 0xB364: 0x8CAC, - 0xB365: 0x8CAB, - 0xB366: 0x8CA8, - 0xB367: 0x8CAA, - 0xB368: 0x8CA7, - 0xB369: 0x8D67, - 0xB36A: 0x8D66, - 0xB36B: 0x8DBE, - 0xB36C: 0x8DBA, - 0xB36D: 0x8EDB, - 0xB36E: 0x8EDF, - 0xB36F: 0x9019, - 0xB370: 0x900D, - 0xB371: 0x901A, - 0xB372: 0x9017, - 0xB373: 0x9023, - 0xB374: 0x901F, - 0xB375: 0x901D, - 0xB376: 0x9010, - 0xB377: 0x9015, - 0xB378: 0x901E, - 0xB379: 0x9020, - 0xB37A: 0x900F, - 0xB37B: 0x9022, - 0xB37C: 0x9016, - 0xB37D: 0x901B, - 0xB37E: 0x9014, - 0xB3A1: 0x90E8, - 0xB3A2: 0x90ED, - 0xB3A3: 0x90FD, - 0xB3A4: 0x9157, - 0xB3A5: 0x91CE, - 0xB3A6: 0x91F5, - 0xB3A7: 0x91E6, - 0xB3A8: 0x91E3, - 0xB3A9: 0x91E7, - 0xB3AA: 0x91ED, - 0xB3AB: 0x91E9, - 0xB3AC: 0x9589, - 0xB3AD: 0x966A, - 0xB3AE: 0x9675, - 0xB3AF: 0x9673, - 0xB3B0: 0x9678, - 0xB3B1: 0x9670, - 0xB3B2: 0x9674, - 0xB3B3: 0x9676, - 0xB3B4: 0x9677, - 0xB3B5: 0x966C, - 0xB3B6: 0x96C0, - 0xB3B7: 0x96EA, - 0xB3B8: 0x96E9, - 0xB3B9: 0x7AE0, - 0xB3BA: 0x7ADF, - 0xB3BB: 0x9802, - 0xB3BC: 0x9803, - 0xB3BD: 0x9B5A, - 0xB3BE: 0x9CE5, - 0xB3BF: 0x9E75, - 0xB3C0: 0x9E7F, - 0xB3C1: 0x9EA5, - 0xB3C2: 0x9EBB, - 0xB3C3: 0x50A2, - 0xB3C4: 0x508D, - 0xB3C5: 0x5085, - 0xB3C6: 0x5099, - 0xB3C7: 0x5091, - 0xB3C8: 0x5080, - 0xB3C9: 0x5096, - 0xB3CA: 0x5098, - 0xB3CB: 0x509A, - 0xB3CC: 0x6700, - 0xB3CD: 0x51F1, - 0xB3CE: 0x5272, - 0xB3CF: 0x5274, - 0xB3D0: 0x5275, - 0xB3D1: 0x5269, - 0xB3D2: 0x52DE, - 0xB3D3: 0x52DD, - 0xB3D4: 0x52DB, - 0xB3D5: 0x535A, - 0xB3D6: 0x53A5, - 0xB3D7: 0x557B, - 0xB3D8: 0x5580, - 0xB3D9: 0x55A7, - 0xB3DA: 0x557C, - 0xB3DB: 0x558A, - 0xB3DC: 0x559D, - 0xB3DD: 0x5598, - 0xB3DE: 0x5582, - 0xB3DF: 0x559C, - 0xB3E0: 0x55AA, - 0xB3E1: 0x5594, - 0xB3E2: 0x5587, - 0xB3E3: 0x558B, - 0xB3E4: 0x5583, - 0xB3E5: 0x55B3, - 0xB3E6: 0x55AE, - 0xB3E7: 0x559F, - 0xB3E8: 0x553E, - 0xB3E9: 0x55B2, - 0xB3EA: 0x559A, - 0xB3EB: 0x55BB, - 0xB3EC: 0x55AC, - 0xB3ED: 0x55B1, - 0xB3EE: 0x557E, - 0xB3EF: 0x5589, - 0xB3F0: 0x55AB, - 0xB3F1: 0x5599, - 0xB3F2: 0x570D, - 0xB3F3: 0x582F, - 0xB3F4: 0x582A, - 0xB3F5: 0x5834, - 0xB3F6: 0x5824, - 0xB3F7: 0x5830, - 0xB3F8: 0x5831, - 0xB3F9: 0x5821, - 0xB3FA: 0x581D, - 0xB3FB: 0x5820, - 0xB3FC: 0x58F9, - 0xB3FD: 0x58FA, - 0xB3FE: 0x5960, - 0xB440: 0x5A77, - 0xB441: 0x5A9A, - 0xB442: 0x5A7F, - 0xB443: 0x5A92, - 0xB444: 0x5A9B, - 0xB445: 0x5AA7, - 0xB446: 0x5B73, - 0xB447: 0x5B71, - 0xB448: 0x5BD2, - 0xB449: 0x5BCC, - 0xB44A: 0x5BD3, - 0xB44B: 0x5BD0, - 0xB44C: 0x5C0A, - 0xB44D: 0x5C0B, - 0xB44E: 0x5C31, - 0xB44F: 0x5D4C, - 0xB450: 0x5D50, - 0xB451: 0x5D34, - 0xB452: 0x5D47, - 0xB453: 0x5DFD, - 0xB454: 0x5E45, - 0xB455: 0x5E3D, - 0xB456: 0x5E40, - 0xB457: 0x5E43, - 0xB458: 0x5E7E, - 0xB459: 0x5ECA, - 0xB45A: 0x5EC1, - 0xB45B: 0x5EC2, - 0xB45C: 0x5EC4, - 0xB45D: 0x5F3C, - 0xB45E: 0x5F6D, - 0xB45F: 0x5FA9, - 0xB460: 0x5FAA, - 0xB461: 0x5FA8, - 0xB462: 0x60D1, - 0xB463: 0x60E1, - 0xB464: 0x60B2, - 0xB465: 0x60B6, - 0xB466: 0x60E0, - 0xB467: 0x611C, - 0xB468: 0x6123, - 0xB469: 0x60FA, - 0xB46A: 0x6115, - 0xB46B: 0x60F0, - 0xB46C: 0x60FB, - 0xB46D: 0x60F4, - 0xB46E: 0x6168, - 0xB46F: 0x60F1, - 0xB470: 0x610E, - 0xB471: 0x60F6, - 0xB472: 0x6109, - 0xB473: 0x6100, - 0xB474: 0x6112, - 0xB475: 0x621F, - 0xB476: 0x6249, - 0xB477: 0x63A3, - 0xB478: 0x638C, - 0xB479: 0x63CF, - 0xB47A: 0x63C0, - 0xB47B: 0x63E9, - 0xB47C: 0x63C9, - 0xB47D: 0x63C6, - 0xB47E: 0x63CD, - 0xB4A1: 0x63D2, - 0xB4A2: 0x63E3, - 0xB4A3: 0x63D0, - 0xB4A4: 0x63E1, - 0xB4A5: 0x63D6, - 0xB4A6: 0x63ED, - 0xB4A7: 0x63EE, - 0xB4A8: 0x6376, - 0xB4A9: 0x63F4, - 0xB4AA: 0x63EA, - 0xB4AB: 0x63DB, - 0xB4AC: 0x6452, - 0xB4AD: 0x63DA, - 0xB4AE: 0x63F9, - 0xB4AF: 0x655E, - 0xB4B0: 0x6566, - 0xB4B1: 0x6562, - 0xB4B2: 0x6563, - 0xB4B3: 0x6591, - 0xB4B4: 0x6590, - 0xB4B5: 0x65AF, - 0xB4B6: 0x666E, - 0xB4B7: 0x6670, - 0xB4B8: 0x6674, - 0xB4B9: 0x6676, - 0xB4BA: 0x666F, - 0xB4BB: 0x6691, - 0xB4BC: 0x667A, - 0xB4BD: 0x667E, - 0xB4BE: 0x6677, - 0xB4BF: 0x66FE, - 0xB4C0: 0x66FF, - 0xB4C1: 0x671F, - 0xB4C2: 0x671D, - 0xB4C3: 0x68FA, - 0xB4C4: 0x68D5, - 0xB4C5: 0x68E0, - 0xB4C6: 0x68D8, - 0xB4C7: 0x68D7, - 0xB4C8: 0x6905, - 0xB4C9: 0x68DF, - 0xB4CA: 0x68F5, - 0xB4CB: 0x68EE, - 0xB4CC: 0x68E7, - 0xB4CD: 0x68F9, - 0xB4CE: 0x68D2, - 0xB4CF: 0x68F2, - 0xB4D0: 0x68E3, - 0xB4D1: 0x68CB, - 0xB4D2: 0x68CD, - 0xB4D3: 0x690D, - 0xB4D4: 0x6912, - 0xB4D5: 0x690E, - 0xB4D6: 0x68C9, - 0xB4D7: 0x68DA, - 0xB4D8: 0x696E, - 0xB4D9: 0x68FB, - 0xB4DA: 0x6B3E, - 0xB4DB: 0x6B3A, - 0xB4DC: 0x6B3D, - 0xB4DD: 0x6B98, - 0xB4DE: 0x6B96, - 0xB4DF: 0x6BBC, - 0xB4E0: 0x6BEF, - 0xB4E1: 0x6C2E, - 0xB4E2: 0x6C2F, - 0xB4E3: 0x6C2C, - 0xB4E4: 0x6E2F, - 0xB4E5: 0x6E38, - 0xB4E6: 0x6E54, - 0xB4E7: 0x6E21, - 0xB4E8: 0x6E32, - 0xB4E9: 0x6E67, - 0xB4EA: 0x6E4A, - 0xB4EB: 0x6E20, - 0xB4EC: 0x6E25, - 0xB4ED: 0x6E23, - 0xB4EE: 0x6E1B, - 0xB4EF: 0x6E5B, - 0xB4F0: 0x6E58, - 0xB4F1: 0x6E24, - 0xB4F2: 0x6E56, - 0xB4F3: 0x6E6E, - 0xB4F4: 0x6E2D, - 0xB4F5: 0x6E26, - 0xB4F6: 0x6E6F, - 0xB4F7: 0x6E34, - 0xB4F8: 0x6E4D, - 0xB4F9: 0x6E3A, - 0xB4FA: 0x6E2C, - 0xB4FB: 0x6E43, - 0xB4FC: 0x6E1D, - 0xB4FD: 0x6E3E, - 0xB4FE: 0x6ECB, - 0xB540: 0x6E89, - 0xB541: 0x6E19, - 0xB542: 0x6E4E, - 0xB543: 0x6E63, - 0xB544: 0x6E44, - 0xB545: 0x6E72, - 0xB546: 0x6E69, - 0xB547: 0x6E5F, - 0xB548: 0x7119, - 0xB549: 0x711A, - 0xB54A: 0x7126, - 0xB54B: 0x7130, - 0xB54C: 0x7121, - 0xB54D: 0x7136, - 0xB54E: 0x716E, - 0xB54F: 0x711C, - 0xB550: 0x724C, - 0xB551: 0x7284, - 0xB552: 0x7280, - 0xB553: 0x7336, - 0xB554: 0x7325, - 0xB555: 0x7334, - 0xB556: 0x7329, - 0xB557: 0x743A, - 0xB558: 0x742A, - 0xB559: 0x7433, - 0xB55A: 0x7422, - 0xB55B: 0x7425, - 0xB55C: 0x7435, - 0xB55D: 0x7436, - 0xB55E: 0x7434, - 0xB55F: 0x742F, - 0xB560: 0x741B, - 0xB561: 0x7426, - 0xB562: 0x7428, - 0xB563: 0x7525, - 0xB564: 0x7526, - 0xB565: 0x756B, - 0xB566: 0x756A, - 0xB567: 0x75E2, - 0xB568: 0x75DB, - 0xB569: 0x75E3, - 0xB56A: 0x75D9, - 0xB56B: 0x75D8, - 0xB56C: 0x75DE, - 0xB56D: 0x75E0, - 0xB56E: 0x767B, - 0xB56F: 0x767C, - 0xB570: 0x7696, - 0xB571: 0x7693, - 0xB572: 0x76B4, - 0xB573: 0x76DC, - 0xB574: 0x774F, - 0xB575: 0x77ED, - 0xB576: 0x785D, - 0xB577: 0x786C, - 0xB578: 0x786F, - 0xB579: 0x7A0D, - 0xB57A: 0x7A08, - 0xB57B: 0x7A0B, - 0xB57C: 0x7A05, - 0xB57D: 0x7A00, - 0xB57E: 0x7A98, - 0xB5A1: 0x7A97, - 0xB5A2: 0x7A96, - 0xB5A3: 0x7AE5, - 0xB5A4: 0x7AE3, - 0xB5A5: 0x7B49, - 0xB5A6: 0x7B56, - 0xB5A7: 0x7B46, - 0xB5A8: 0x7B50, - 0xB5A9: 0x7B52, - 0xB5AA: 0x7B54, - 0xB5AB: 0x7B4D, - 0xB5AC: 0x7B4B, - 0xB5AD: 0x7B4F, - 0xB5AE: 0x7B51, - 0xB5AF: 0x7C9F, - 0xB5B0: 0x7CA5, - 0xB5B1: 0x7D5E, - 0xB5B2: 0x7D50, - 0xB5B3: 0x7D68, - 0xB5B4: 0x7D55, - 0xB5B5: 0x7D2B, - 0xB5B6: 0x7D6E, - 0xB5B7: 0x7D72, - 0xB5B8: 0x7D61, - 0xB5B9: 0x7D66, - 0xB5BA: 0x7D62, - 0xB5BB: 0x7D70, - 0xB5BC: 0x7D73, - 0xB5BD: 0x5584, - 0xB5BE: 0x7FD4, - 0xB5BF: 0x7FD5, - 0xB5C0: 0x800B, - 0xB5C1: 0x8052, - 0xB5C2: 0x8085, - 0xB5C3: 0x8155, - 0xB5C4: 0x8154, - 0xB5C5: 0x814B, - 0xB5C6: 0x8151, - 0xB5C7: 0x814E, - 0xB5C8: 0x8139, - 0xB5C9: 0x8146, - 0xB5CA: 0x813E, - 0xB5CB: 0x814C, - 0xB5CC: 0x8153, - 0xB5CD: 0x8174, - 0xB5CE: 0x8212, - 0xB5CF: 0x821C, - 0xB5D0: 0x83E9, - 0xB5D1: 0x8403, - 0xB5D2: 0x83F8, - 0xB5D3: 0x840D, - 0xB5D4: 0x83E0, - 0xB5D5: 0x83C5, - 0xB5D6: 0x840B, - 0xB5D7: 0x83C1, - 0xB5D8: 0x83EF, - 0xB5D9: 0x83F1, - 0xB5DA: 0x83F4, - 0xB5DB: 0x8457, - 0xB5DC: 0x840A, - 0xB5DD: 0x83F0, - 0xB5DE: 0x840C, - 0xB5DF: 0x83CC, - 0xB5E0: 0x83FD, - 0xB5E1: 0x83F2, - 0xB5E2: 0x83CA, - 0xB5E3: 0x8438, - 0xB5E4: 0x840E, - 0xB5E5: 0x8404, - 0xB5E6: 0x83DC, - 0xB5E7: 0x8407, - 0xB5E8: 0x83D4, - 0xB5E9: 0x83DF, - 0xB5EA: 0x865B, - 0xB5EB: 0x86DF, - 0xB5EC: 0x86D9, - 0xB5ED: 0x86ED, - 0xB5EE: 0x86D4, - 0xB5EF: 0x86DB, - 0xB5F0: 0x86E4, - 0xB5F1: 0x86D0, - 0xB5F2: 0x86DE, - 0xB5F3: 0x8857, - 0xB5F4: 0x88C1, - 0xB5F5: 0x88C2, - 0xB5F6: 0x88B1, - 0xB5F7: 0x8983, - 0xB5F8: 0x8996, - 0xB5F9: 0x8A3B, - 0xB5FA: 0x8A60, - 0xB5FB: 0x8A55, - 0xB5FC: 0x8A5E, - 0xB5FD: 0x8A3C, - 0xB5FE: 0x8A41, - 0xB640: 0x8A54, - 0xB641: 0x8A5B, - 0xB642: 0x8A50, - 0xB643: 0x8A46, - 0xB644: 0x8A34, - 0xB645: 0x8A3A, - 0xB646: 0x8A36, - 0xB647: 0x8A56, - 0xB648: 0x8C61, - 0xB649: 0x8C82, - 0xB64A: 0x8CAF, - 0xB64B: 0x8CBC, - 0xB64C: 0x8CB3, - 0xB64D: 0x8CBD, - 0xB64E: 0x8CC1, - 0xB64F: 0x8CBB, - 0xB650: 0x8CC0, - 0xB651: 0x8CB4, - 0xB652: 0x8CB7, - 0xB653: 0x8CB6, - 0xB654: 0x8CBF, - 0xB655: 0x8CB8, - 0xB656: 0x8D8A, - 0xB657: 0x8D85, - 0xB658: 0x8D81, - 0xB659: 0x8DCE, - 0xB65A: 0x8DDD, - 0xB65B: 0x8DCB, - 0xB65C: 0x8DDA, - 0xB65D: 0x8DD1, - 0xB65E: 0x8DCC, - 0xB65F: 0x8DDB, - 0xB660: 0x8DC6, - 0xB661: 0x8EFB, - 0xB662: 0x8EF8, - 0xB663: 0x8EFC, - 0xB664: 0x8F9C, - 0xB665: 0x902E, - 0xB666: 0x9035, - 0xB667: 0x9031, - 0xB668: 0x9038, - 0xB669: 0x9032, - 0xB66A: 0x9036, - 0xB66B: 0x9102, - 0xB66C: 0x90F5, - 0xB66D: 0x9109, - 0xB66E: 0x90FE, - 0xB66F: 0x9163, - 0xB670: 0x9165, - 0xB671: 0x91CF, - 0xB672: 0x9214, - 0xB673: 0x9215, - 0xB674: 0x9223, - 0xB675: 0x9209, - 0xB676: 0x921E, - 0xB677: 0x920D, - 0xB678: 0x9210, - 0xB679: 0x9207, - 0xB67A: 0x9211, - 0xB67B: 0x9594, - 0xB67C: 0x958F, - 0xB67D: 0x958B, - 0xB67E: 0x9591, - 0xB6A1: 0x9593, - 0xB6A2: 0x9592, - 0xB6A3: 0x958E, - 0xB6A4: 0x968A, - 0xB6A5: 0x968E, - 0xB6A6: 0x968B, - 0xB6A7: 0x967D, - 0xB6A8: 0x9685, - 0xB6A9: 0x9686, - 0xB6AA: 0x968D, - 0xB6AB: 0x9672, - 0xB6AC: 0x9684, - 0xB6AD: 0x96C1, - 0xB6AE: 0x96C5, - 0xB6AF: 0x96C4, - 0xB6B0: 0x96C6, - 0xB6B1: 0x96C7, - 0xB6B2: 0x96EF, - 0xB6B3: 0x96F2, - 0xB6B4: 0x97CC, - 0xB6B5: 0x9805, - 0xB6B6: 0x9806, - 0xB6B7: 0x9808, - 0xB6B8: 0x98E7, - 0xB6B9: 0x98EA, - 0xB6BA: 0x98EF, - 0xB6BB: 0x98E9, - 0xB6BC: 0x98F2, - 0xB6BD: 0x98ED, - 0xB6BE: 0x99AE, - 0xB6BF: 0x99AD, - 0xB6C0: 0x9EC3, - 0xB6C1: 0x9ECD, - 0xB6C2: 0x9ED1, - 0xB6C3: 0x4E82, - 0xB6C4: 0x50AD, - 0xB6C5: 0x50B5, - 0xB6C6: 0x50B2, - 0xB6C7: 0x50B3, - 0xB6C8: 0x50C5, - 0xB6C9: 0x50BE, - 0xB6CA: 0x50AC, - 0xB6CB: 0x50B7, - 0xB6CC: 0x50BB, - 0xB6CD: 0x50AF, - 0xB6CE: 0x50C7, - 0xB6CF: 0x527F, - 0xB6D0: 0x5277, - 0xB6D1: 0x527D, - 0xB6D2: 0x52DF, - 0xB6D3: 0x52E6, - 0xB6D4: 0x52E4, - 0xB6D5: 0x52E2, - 0xB6D6: 0x52E3, - 0xB6D7: 0x532F, - 0xB6D8: 0x55DF, - 0xB6D9: 0x55E8, - 0xB6DA: 0x55D3, - 0xB6DB: 0x55E6, - 0xB6DC: 0x55CE, - 0xB6DD: 0x55DC, - 0xB6DE: 0x55C7, - 0xB6DF: 0x55D1, - 0xB6E0: 0x55E3, - 0xB6E1: 0x55E4, - 0xB6E2: 0x55EF, - 0xB6E3: 0x55DA, - 0xB6E4: 0x55E1, - 0xB6E5: 0x55C5, - 0xB6E6: 0x55C6, - 0xB6E7: 0x55E5, - 0xB6E8: 0x55C9, - 0xB6E9: 0x5712, - 0xB6EA: 0x5713, - 0xB6EB: 0x585E, - 0xB6EC: 0x5851, - 0xB6ED: 0x5858, - 0xB6EE: 0x5857, - 0xB6EF: 0x585A, - 0xB6F0: 0x5854, - 0xB6F1: 0x586B, - 0xB6F2: 0x584C, - 0xB6F3: 0x586D, - 0xB6F4: 0x584A, - 0xB6F5: 0x5862, - 0xB6F6: 0x5852, - 0xB6F7: 0x584B, - 0xB6F8: 0x5967, - 0xB6F9: 0x5AC1, - 0xB6FA: 0x5AC9, - 0xB6FB: 0x5ACC, - 0xB6FC: 0x5ABE, - 0xB6FD: 0x5ABD, - 0xB6FE: 0x5ABC, - 0xB740: 0x5AB3, - 0xB741: 0x5AC2, - 0xB742: 0x5AB2, - 0xB743: 0x5D69, - 0xB744: 0x5D6F, - 0xB745: 0x5E4C, - 0xB746: 0x5E79, - 0xB747: 0x5EC9, - 0xB748: 0x5EC8, - 0xB749: 0x5F12, - 0xB74A: 0x5F59, - 0xB74B: 0x5FAC, - 0xB74C: 0x5FAE, - 0xB74D: 0x611A, - 0xB74E: 0x610F, - 0xB74F: 0x6148, - 0xB750: 0x611F, - 0xB751: 0x60F3, - 0xB752: 0x611B, - 0xB753: 0x60F9, - 0xB754: 0x6101, - 0xB755: 0x6108, - 0xB756: 0x614E, - 0xB757: 0x614C, - 0xB758: 0x6144, - 0xB759: 0x614D, - 0xB75A: 0x613E, - 0xB75B: 0x6134, - 0xB75C: 0x6127, - 0xB75D: 0x610D, - 0xB75E: 0x6106, - 0xB75F: 0x6137, - 0xB760: 0x6221, - 0xB761: 0x6222, - 0xB762: 0x6413, - 0xB763: 0x643E, - 0xB764: 0x641E, - 0xB765: 0x642A, - 0xB766: 0x642D, - 0xB767: 0x643D, - 0xB768: 0x642C, - 0xB769: 0x640F, - 0xB76A: 0x641C, - 0xB76B: 0x6414, - 0xB76C: 0x640D, - 0xB76D: 0x6436, - 0xB76E: 0x6416, - 0xB76F: 0x6417, - 0xB770: 0x6406, - 0xB771: 0x656C, - 0xB772: 0x659F, - 0xB773: 0x65B0, - 0xB774: 0x6697, - 0xB775: 0x6689, - 0xB776: 0x6687, - 0xB777: 0x6688, - 0xB778: 0x6696, - 0xB779: 0x6684, - 0xB77A: 0x6698, - 0xB77B: 0x668D, - 0xB77C: 0x6703, - 0xB77D: 0x6994, - 0xB77E: 0x696D, - 0xB7A1: 0x695A, - 0xB7A2: 0x6977, - 0xB7A3: 0x6960, - 0xB7A4: 0x6954, - 0xB7A5: 0x6975, - 0xB7A6: 0x6930, - 0xB7A7: 0x6982, - 0xB7A8: 0x694A, - 0xB7A9: 0x6968, - 0xB7AA: 0x696B, - 0xB7AB: 0x695E, - 0xB7AC: 0x6953, - 0xB7AD: 0x6979, - 0xB7AE: 0x6986, - 0xB7AF: 0x695D, - 0xB7B0: 0x6963, - 0xB7B1: 0x695B, - 0xB7B2: 0x6B47, - 0xB7B3: 0x6B72, - 0xB7B4: 0x6BC0, - 0xB7B5: 0x6BBF, - 0xB7B6: 0x6BD3, - 0xB7B7: 0x6BFD, - 0xB7B8: 0x6EA2, - 0xB7B9: 0x6EAF, - 0xB7BA: 0x6ED3, - 0xB7BB: 0x6EB6, - 0xB7BC: 0x6EC2, - 0xB7BD: 0x6E90, - 0xB7BE: 0x6E9D, - 0xB7BF: 0x6EC7, - 0xB7C0: 0x6EC5, - 0xB7C1: 0x6EA5, - 0xB7C2: 0x6E98, - 0xB7C3: 0x6EBC, - 0xB7C4: 0x6EBA, - 0xB7C5: 0x6EAB, - 0xB7C6: 0x6ED1, - 0xB7C7: 0x6E96, - 0xB7C8: 0x6E9C, - 0xB7C9: 0x6EC4, - 0xB7CA: 0x6ED4, - 0xB7CB: 0x6EAA, - 0xB7CC: 0x6EA7, - 0xB7CD: 0x6EB4, - 0xB7CE: 0x714E, - 0xB7CF: 0x7159, - 0xB7D0: 0x7169, - 0xB7D1: 0x7164, - 0xB7D2: 0x7149, - 0xB7D3: 0x7167, - 0xB7D4: 0x715C, - 0xB7D5: 0x716C, - 0xB7D6: 0x7166, - 0xB7D7: 0x714C, - 0xB7D8: 0x7165, - 0xB7D9: 0x715E, - 0xB7DA: 0x7146, - 0xB7DB: 0x7168, - 0xB7DC: 0x7156, - 0xB7DD: 0x723A, - 0xB7DE: 0x7252, - 0xB7DF: 0x7337, - 0xB7E0: 0x7345, - 0xB7E1: 0x733F, - 0xB7E2: 0x733E, - 0xB7E3: 0x746F, - 0xB7E4: 0x745A, - 0xB7E5: 0x7455, - 0xB7E6: 0x745F, - 0xB7E7: 0x745E, - 0xB7E8: 0x7441, - 0xB7E9: 0x743F, - 0xB7EA: 0x7459, - 0xB7EB: 0x745B, - 0xB7EC: 0x745C, - 0xB7ED: 0x7576, - 0xB7EE: 0x7578, - 0xB7EF: 0x7600, - 0xB7F0: 0x75F0, - 0xB7F1: 0x7601, - 0xB7F2: 0x75F2, - 0xB7F3: 0x75F1, - 0xB7F4: 0x75FA, - 0xB7F5: 0x75FF, - 0xB7F6: 0x75F4, - 0xB7F7: 0x75F3, - 0xB7F8: 0x76DE, - 0xB7F9: 0x76DF, - 0xB7FA: 0x775B, - 0xB7FB: 0x776B, - 0xB7FC: 0x7766, - 0xB7FD: 0x775E, - 0xB7FE: 0x7763, - 0xB840: 0x7779, - 0xB841: 0x776A, - 0xB842: 0x776C, - 0xB843: 0x775C, - 0xB844: 0x7765, - 0xB845: 0x7768, - 0xB846: 0x7762, - 0xB847: 0x77EE, - 0xB848: 0x788E, - 0xB849: 0x78B0, - 0xB84A: 0x7897, - 0xB84B: 0x7898, - 0xB84C: 0x788C, - 0xB84D: 0x7889, - 0xB84E: 0x787C, - 0xB84F: 0x7891, - 0xB850: 0x7893, - 0xB851: 0x787F, - 0xB852: 0x797A, - 0xB853: 0x797F, - 0xB854: 0x7981, - 0xB855: 0x842C, - 0xB856: 0x79BD, - 0xB857: 0x7A1C, - 0xB858: 0x7A1A, - 0xB859: 0x7A20, - 0xB85A: 0x7A14, - 0xB85B: 0x7A1F, - 0xB85C: 0x7A1E, - 0xB85D: 0x7A9F, - 0xB85E: 0x7AA0, - 0xB85F: 0x7B77, - 0xB860: 0x7BC0, - 0xB861: 0x7B60, - 0xB862: 0x7B6E, - 0xB863: 0x7B67, - 0xB864: 0x7CB1, - 0xB865: 0x7CB3, - 0xB866: 0x7CB5, - 0xB867: 0x7D93, - 0xB868: 0x7D79, - 0xB869: 0x7D91, - 0xB86A: 0x7D81, - 0xB86B: 0x7D8F, - 0xB86C: 0x7D5B, - 0xB86D: 0x7F6E, - 0xB86E: 0x7F69, - 0xB86F: 0x7F6A, - 0xB870: 0x7F72, - 0xB871: 0x7FA9, - 0xB872: 0x7FA8, - 0xB873: 0x7FA4, - 0xB874: 0x8056, - 0xB875: 0x8058, - 0xB876: 0x8086, - 0xB877: 0x8084, - 0xB878: 0x8171, - 0xB879: 0x8170, - 0xB87A: 0x8178, - 0xB87B: 0x8165, - 0xB87C: 0x816E, - 0xB87D: 0x8173, - 0xB87E: 0x816B, - 0xB8A1: 0x8179, - 0xB8A2: 0x817A, - 0xB8A3: 0x8166, - 0xB8A4: 0x8205, - 0xB8A5: 0x8247, - 0xB8A6: 0x8482, - 0xB8A7: 0x8477, - 0xB8A8: 0x843D, - 0xB8A9: 0x8431, - 0xB8AA: 0x8475, - 0xB8AB: 0x8466, - 0xB8AC: 0x846B, - 0xB8AD: 0x8449, - 0xB8AE: 0x846C, - 0xB8AF: 0x845B, - 0xB8B0: 0x843C, - 0xB8B1: 0x8435, - 0xB8B2: 0x8461, - 0xB8B3: 0x8463, - 0xB8B4: 0x8469, - 0xB8B5: 0x846D, - 0xB8B6: 0x8446, - 0xB8B7: 0x865E, - 0xB8B8: 0x865C, - 0xB8B9: 0x865F, - 0xB8BA: 0x86F9, - 0xB8BB: 0x8713, - 0xB8BC: 0x8708, - 0xB8BD: 0x8707, - 0xB8BE: 0x8700, - 0xB8BF: 0x86FE, - 0xB8C0: 0x86FB, - 0xB8C1: 0x8702, - 0xB8C2: 0x8703, - 0xB8C3: 0x8706, - 0xB8C4: 0x870A, - 0xB8C5: 0x8859, - 0xB8C6: 0x88DF, - 0xB8C7: 0x88D4, - 0xB8C8: 0x88D9, - 0xB8C9: 0x88DC, - 0xB8CA: 0x88D8, - 0xB8CB: 0x88DD, - 0xB8CC: 0x88E1, - 0xB8CD: 0x88CA, - 0xB8CE: 0x88D5, - 0xB8CF: 0x88D2, - 0xB8D0: 0x899C, - 0xB8D1: 0x89E3, - 0xB8D2: 0x8A6B, - 0xB8D3: 0x8A72, - 0xB8D4: 0x8A73, - 0xB8D5: 0x8A66, - 0xB8D6: 0x8A69, - 0xB8D7: 0x8A70, - 0xB8D8: 0x8A87, - 0xB8D9: 0x8A7C, - 0xB8DA: 0x8A63, - 0xB8DB: 0x8AA0, - 0xB8DC: 0x8A71, - 0xB8DD: 0x8A85, - 0xB8DE: 0x8A6D, - 0xB8DF: 0x8A62, - 0xB8E0: 0x8A6E, - 0xB8E1: 0x8A6C, - 0xB8E2: 0x8A79, - 0xB8E3: 0x8A7B, - 0xB8E4: 0x8A3E, - 0xB8E5: 0x8A68, - 0xB8E6: 0x8C62, - 0xB8E7: 0x8C8A, - 0xB8E8: 0x8C89, - 0xB8E9: 0x8CCA, - 0xB8EA: 0x8CC7, - 0xB8EB: 0x8CC8, - 0xB8EC: 0x8CC4, - 0xB8ED: 0x8CB2, - 0xB8EE: 0x8CC3, - 0xB8EF: 0x8CC2, - 0xB8F0: 0x8CC5, - 0xB8F1: 0x8DE1, - 0xB8F2: 0x8DDF, - 0xB8F3: 0x8DE8, - 0xB8F4: 0x8DEF, - 0xB8F5: 0x8DF3, - 0xB8F6: 0x8DFA, - 0xB8F7: 0x8DEA, - 0xB8F8: 0x8DE4, - 0xB8F9: 0x8DE6, - 0xB8FA: 0x8EB2, - 0xB8FB: 0x8F03, - 0xB8FC: 0x8F09, - 0xB8FD: 0x8EFE, - 0xB8FE: 0x8F0A, - 0xB940: 0x8F9F, - 0xB941: 0x8FB2, - 0xB942: 0x904B, - 0xB943: 0x904A, - 0xB944: 0x9053, - 0xB945: 0x9042, - 0xB946: 0x9054, - 0xB947: 0x903C, - 0xB948: 0x9055, - 0xB949: 0x9050, - 0xB94A: 0x9047, - 0xB94B: 0x904F, - 0xB94C: 0x904E, - 0xB94D: 0x904D, - 0xB94E: 0x9051, - 0xB94F: 0x903E, - 0xB950: 0x9041, - 0xB951: 0x9112, - 0xB952: 0x9117, - 0xB953: 0x916C, - 0xB954: 0x916A, - 0xB955: 0x9169, - 0xB956: 0x91C9, - 0xB957: 0x9237, - 0xB958: 0x9257, - 0xB959: 0x9238, - 0xB95A: 0x923D, - 0xB95B: 0x9240, - 0xB95C: 0x923E, - 0xB95D: 0x925B, - 0xB95E: 0x924B, - 0xB95F: 0x9264, - 0xB960: 0x9251, - 0xB961: 0x9234, - 0xB962: 0x9249, - 0xB963: 0x924D, - 0xB964: 0x9245, - 0xB965: 0x9239, - 0xB966: 0x923F, - 0xB967: 0x925A, - 0xB968: 0x9598, - 0xB969: 0x9698, - 0xB96A: 0x9694, - 0xB96B: 0x9695, - 0xB96C: 0x96CD, - 0xB96D: 0x96CB, - 0xB96E: 0x96C9, - 0xB96F: 0x96CA, - 0xB970: 0x96F7, - 0xB971: 0x96FB, - 0xB972: 0x96F9, - 0xB973: 0x96F6, - 0xB974: 0x9756, - 0xB975: 0x9774, - 0xB976: 0x9776, - 0xB977: 0x9810, - 0xB978: 0x9811, - 0xB979: 0x9813, - 0xB97A: 0x980A, - 0xB97B: 0x9812, - 0xB97C: 0x980C, - 0xB97D: 0x98FC, - 0xB97E: 0x98F4, - 0xB9A1: 0x98FD, - 0xB9A2: 0x98FE, - 0xB9A3: 0x99B3, - 0xB9A4: 0x99B1, - 0xB9A5: 0x99B4, - 0xB9A6: 0x9AE1, - 0xB9A7: 0x9CE9, - 0xB9A8: 0x9E82, - 0xB9A9: 0x9F0E, - 0xB9AA: 0x9F13, - 0xB9AB: 0x9F20, - 0xB9AC: 0x50E7, - 0xB9AD: 0x50EE, - 0xB9AE: 0x50E5, - 0xB9AF: 0x50D6, - 0xB9B0: 0x50ED, - 0xB9B1: 0x50DA, - 0xB9B2: 0x50D5, - 0xB9B3: 0x50CF, - 0xB9B4: 0x50D1, - 0xB9B5: 0x50F1, - 0xB9B6: 0x50CE, - 0xB9B7: 0x50E9, - 0xB9B8: 0x5162, - 0xB9B9: 0x51F3, - 0xB9BA: 0x5283, - 0xB9BB: 0x5282, - 0xB9BC: 0x5331, - 0xB9BD: 0x53AD, - 0xB9BE: 0x55FE, - 0xB9BF: 0x5600, - 0xB9C0: 0x561B, - 0xB9C1: 0x5617, - 0xB9C2: 0x55FD, - 0xB9C3: 0x5614, - 0xB9C4: 0x5606, - 0xB9C5: 0x5609, - 0xB9C6: 0x560D, - 0xB9C7: 0x560E, - 0xB9C8: 0x55F7, - 0xB9C9: 0x5616, - 0xB9CA: 0x561F, - 0xB9CB: 0x5608, - 0xB9CC: 0x5610, - 0xB9CD: 0x55F6, - 0xB9CE: 0x5718, - 0xB9CF: 0x5716, - 0xB9D0: 0x5875, - 0xB9D1: 0x587E, - 0xB9D2: 0x5883, - 0xB9D3: 0x5893, - 0xB9D4: 0x588A, - 0xB9D5: 0x5879, - 0xB9D6: 0x5885, - 0xB9D7: 0x587D, - 0xB9D8: 0x58FD, - 0xB9D9: 0x5925, - 0xB9DA: 0x5922, - 0xB9DB: 0x5924, - 0xB9DC: 0x596A, - 0xB9DD: 0x5969, - 0xB9DE: 0x5AE1, - 0xB9DF: 0x5AE6, - 0xB9E0: 0x5AE9, - 0xB9E1: 0x5AD7, - 0xB9E2: 0x5AD6, - 0xB9E3: 0x5AD8, - 0xB9E4: 0x5AE3, - 0xB9E5: 0x5B75, - 0xB9E6: 0x5BDE, - 0xB9E7: 0x5BE7, - 0xB9E8: 0x5BE1, - 0xB9E9: 0x5BE5, - 0xB9EA: 0x5BE6, - 0xB9EB: 0x5BE8, - 0xB9EC: 0x5BE2, - 0xB9ED: 0x5BE4, - 0xB9EE: 0x5BDF, - 0xB9EF: 0x5C0D, - 0xB9F0: 0x5C62, - 0xB9F1: 0x5D84, - 0xB9F2: 0x5D87, - 0xB9F3: 0x5E5B, - 0xB9F4: 0x5E63, - 0xB9F5: 0x5E55, - 0xB9F6: 0x5E57, - 0xB9F7: 0x5E54, - 0xB9F8: 0x5ED3, - 0xB9F9: 0x5ED6, - 0xB9FA: 0x5F0A, - 0xB9FB: 0x5F46, - 0xB9FC: 0x5F70, - 0xB9FD: 0x5FB9, - 0xB9FE: 0x6147, - 0xBA40: 0x613F, - 0xBA41: 0x614B, - 0xBA42: 0x6177, - 0xBA43: 0x6162, - 0xBA44: 0x6163, - 0xBA45: 0x615F, - 0xBA46: 0x615A, - 0xBA47: 0x6158, - 0xBA48: 0x6175, - 0xBA49: 0x622A, - 0xBA4A: 0x6487, - 0xBA4B: 0x6458, - 0xBA4C: 0x6454, - 0xBA4D: 0x64A4, - 0xBA4E: 0x6478, - 0xBA4F: 0x645F, - 0xBA50: 0x647A, - 0xBA51: 0x6451, - 0xBA52: 0x6467, - 0xBA53: 0x6434, - 0xBA54: 0x646D, - 0xBA55: 0x647B, - 0xBA56: 0x6572, - 0xBA57: 0x65A1, - 0xBA58: 0x65D7, - 0xBA59: 0x65D6, - 0xBA5A: 0x66A2, - 0xBA5B: 0x66A8, - 0xBA5C: 0x669D, - 0xBA5D: 0x699C, - 0xBA5E: 0x69A8, - 0xBA5F: 0x6995, - 0xBA60: 0x69C1, - 0xBA61: 0x69AE, - 0xBA62: 0x69D3, - 0xBA63: 0x69CB, - 0xBA64: 0x699B, - 0xBA65: 0x69B7, - 0xBA66: 0x69BB, - 0xBA67: 0x69AB, - 0xBA68: 0x69B4, - 0xBA69: 0x69D0, - 0xBA6A: 0x69CD, - 0xBA6B: 0x69AD, - 0xBA6C: 0x69CC, - 0xBA6D: 0x69A6, - 0xBA6E: 0x69C3, - 0xBA6F: 0x69A3, - 0xBA70: 0x6B49, - 0xBA71: 0x6B4C, - 0xBA72: 0x6C33, - 0xBA73: 0x6F33, - 0xBA74: 0x6F14, - 0xBA75: 0x6EFE, - 0xBA76: 0x6F13, - 0xBA77: 0x6EF4, - 0xBA78: 0x6F29, - 0xBA79: 0x6F3E, - 0xBA7A: 0x6F20, - 0xBA7B: 0x6F2C, - 0xBA7C: 0x6F0F, - 0xBA7D: 0x6F02, - 0xBA7E: 0x6F22, - 0xBAA1: 0x6EFF, - 0xBAA2: 0x6EEF, - 0xBAA3: 0x6F06, - 0xBAA4: 0x6F31, - 0xBAA5: 0x6F38, - 0xBAA6: 0x6F32, - 0xBAA7: 0x6F23, - 0xBAA8: 0x6F15, - 0xBAA9: 0x6F2B, - 0xBAAA: 0x6F2F, - 0xBAAB: 0x6F88, - 0xBAAC: 0x6F2A, - 0xBAAD: 0x6EEC, - 0xBAAE: 0x6F01, - 0xBAAF: 0x6EF2, - 0xBAB0: 0x6ECC, - 0xBAB1: 0x6EF7, - 0xBAB2: 0x7194, - 0xBAB3: 0x7199, - 0xBAB4: 0x717D, - 0xBAB5: 0x718A, - 0xBAB6: 0x7184, - 0xBAB7: 0x7192, - 0xBAB8: 0x723E, - 0xBAB9: 0x7292, - 0xBABA: 0x7296, - 0xBABB: 0x7344, - 0xBABC: 0x7350, - 0xBABD: 0x7464, - 0xBABE: 0x7463, - 0xBABF: 0x746A, - 0xBAC0: 0x7470, - 0xBAC1: 0x746D, - 0xBAC2: 0x7504, - 0xBAC3: 0x7591, - 0xBAC4: 0x7627, - 0xBAC5: 0x760D, - 0xBAC6: 0x760B, - 0xBAC7: 0x7609, - 0xBAC8: 0x7613, - 0xBAC9: 0x76E1, - 0xBACA: 0x76E3, - 0xBACB: 0x7784, - 0xBACC: 0x777D, - 0xBACD: 0x777F, - 0xBACE: 0x7761, - 0xBACF: 0x78C1, - 0xBAD0: 0x789F, - 0xBAD1: 0x78A7, - 0xBAD2: 0x78B3, - 0xBAD3: 0x78A9, - 0xBAD4: 0x78A3, - 0xBAD5: 0x798E, - 0xBAD6: 0x798F, - 0xBAD7: 0x798D, - 0xBAD8: 0x7A2E, - 0xBAD9: 0x7A31, - 0xBADA: 0x7AAA, - 0xBADB: 0x7AA9, - 0xBADC: 0x7AED, - 0xBADD: 0x7AEF, - 0xBADE: 0x7BA1, - 0xBADF: 0x7B95, - 0xBAE0: 0x7B8B, - 0xBAE1: 0x7B75, - 0xBAE2: 0x7B97, - 0xBAE3: 0x7B9D, - 0xBAE4: 0x7B94, - 0xBAE5: 0x7B8F, - 0xBAE6: 0x7BB8, - 0xBAE7: 0x7B87, - 0xBAE8: 0x7B84, - 0xBAE9: 0x7CB9, - 0xBAEA: 0x7CBD, - 0xBAEB: 0x7CBE, - 0xBAEC: 0x7DBB, - 0xBAED: 0x7DB0, - 0xBAEE: 0x7D9C, - 0xBAEF: 0x7DBD, - 0xBAF0: 0x7DBE, - 0xBAF1: 0x7DA0, - 0xBAF2: 0x7DCA, - 0xBAF3: 0x7DB4, - 0xBAF4: 0x7DB2, - 0xBAF5: 0x7DB1, - 0xBAF6: 0x7DBA, - 0xBAF7: 0x7DA2, - 0xBAF8: 0x7DBF, - 0xBAF9: 0x7DB5, - 0xBAFA: 0x7DB8, - 0xBAFB: 0x7DAD, - 0xBAFC: 0x7DD2, - 0xBAFD: 0x7DC7, - 0xBAFE: 0x7DAC, - 0xBB40: 0x7F70, - 0xBB41: 0x7FE0, - 0xBB42: 0x7FE1, - 0xBB43: 0x7FDF, - 0xBB44: 0x805E, - 0xBB45: 0x805A, - 0xBB46: 0x8087, - 0xBB47: 0x8150, - 0xBB48: 0x8180, - 0xBB49: 0x818F, - 0xBB4A: 0x8188, - 0xBB4B: 0x818A, - 0xBB4C: 0x817F, - 0xBB4D: 0x8182, - 0xBB4E: 0x81E7, - 0xBB4F: 0x81FA, - 0xBB50: 0x8207, - 0xBB51: 0x8214, - 0xBB52: 0x821E, - 0xBB53: 0x824B, - 0xBB54: 0x84C9, - 0xBB55: 0x84BF, - 0xBB56: 0x84C6, - 0xBB57: 0x84C4, - 0xBB58: 0x8499, - 0xBB59: 0x849E, - 0xBB5A: 0x84B2, - 0xBB5B: 0x849C, - 0xBB5C: 0x84CB, - 0xBB5D: 0x84B8, - 0xBB5E: 0x84C0, - 0xBB5F: 0x84D3, - 0xBB60: 0x8490, - 0xBB61: 0x84BC, - 0xBB62: 0x84D1, - 0xBB63: 0x84CA, - 0xBB64: 0x873F, - 0xBB65: 0x871C, - 0xBB66: 0x873B, - 0xBB67: 0x8722, - 0xBB68: 0x8725, - 0xBB69: 0x8734, - 0xBB6A: 0x8718, - 0xBB6B: 0x8755, - 0xBB6C: 0x8737, - 0xBB6D: 0x8729, - 0xBB6E: 0x88F3, - 0xBB6F: 0x8902, - 0xBB70: 0x88F4, - 0xBB71: 0x88F9, - 0xBB72: 0x88F8, - 0xBB73: 0x88FD, - 0xBB74: 0x88E8, - 0xBB75: 0x891A, - 0xBB76: 0x88EF, - 0xBB77: 0x8AA6, - 0xBB78: 0x8A8C, - 0xBB79: 0x8A9E, - 0xBB7A: 0x8AA3, - 0xBB7B: 0x8A8D, - 0xBB7C: 0x8AA1, - 0xBB7D: 0x8A93, - 0xBB7E: 0x8AA4, - 0xBBA1: 0x8AAA, - 0xBBA2: 0x8AA5, - 0xBBA3: 0x8AA8, - 0xBBA4: 0x8A98, - 0xBBA5: 0x8A91, - 0xBBA6: 0x8A9A, - 0xBBA7: 0x8AA7, - 0xBBA8: 0x8C6A, - 0xBBA9: 0x8C8D, - 0xBBAA: 0x8C8C, - 0xBBAB: 0x8CD3, - 0xBBAC: 0x8CD1, - 0xBBAD: 0x8CD2, - 0xBBAE: 0x8D6B, - 0xBBAF: 0x8D99, - 0xBBB0: 0x8D95, - 0xBBB1: 0x8DFC, - 0xBBB2: 0x8F14, - 0xBBB3: 0x8F12, - 0xBBB4: 0x8F15, - 0xBBB5: 0x8F13, - 0xBBB6: 0x8FA3, - 0xBBB7: 0x9060, - 0xBBB8: 0x9058, - 0xBBB9: 0x905C, - 0xBBBA: 0x9063, - 0xBBBB: 0x9059, - 0xBBBC: 0x905E, - 0xBBBD: 0x9062, - 0xBBBE: 0x905D, - 0xBBBF: 0x905B, - 0xBBC0: 0x9119, - 0xBBC1: 0x9118, - 0xBBC2: 0x911E, - 0xBBC3: 0x9175, - 0xBBC4: 0x9178, - 0xBBC5: 0x9177, - 0xBBC6: 0x9174, - 0xBBC7: 0x9278, - 0xBBC8: 0x9280, - 0xBBC9: 0x9285, - 0xBBCA: 0x9298, - 0xBBCB: 0x9296, - 0xBBCC: 0x927B, - 0xBBCD: 0x9293, - 0xBBCE: 0x929C, - 0xBBCF: 0x92A8, - 0xBBD0: 0x927C, - 0xBBD1: 0x9291, - 0xBBD2: 0x95A1, - 0xBBD3: 0x95A8, - 0xBBD4: 0x95A9, - 0xBBD5: 0x95A3, - 0xBBD6: 0x95A5, - 0xBBD7: 0x95A4, - 0xBBD8: 0x9699, - 0xBBD9: 0x969C, - 0xBBDA: 0x969B, - 0xBBDB: 0x96CC, - 0xBBDC: 0x96D2, - 0xBBDD: 0x9700, - 0xBBDE: 0x977C, - 0xBBDF: 0x9785, - 0xBBE0: 0x97F6, - 0xBBE1: 0x9817, - 0xBBE2: 0x9818, - 0xBBE3: 0x98AF, - 0xBBE4: 0x98B1, - 0xBBE5: 0x9903, - 0xBBE6: 0x9905, - 0xBBE7: 0x990C, - 0xBBE8: 0x9909, - 0xBBE9: 0x99C1, - 0xBBEA: 0x9AAF, - 0xBBEB: 0x9AB0, - 0xBBEC: 0x9AE6, - 0xBBED: 0x9B41, - 0xBBEE: 0x9B42, - 0xBBEF: 0x9CF4, - 0xBBF0: 0x9CF6, - 0xBBF1: 0x9CF3, - 0xBBF2: 0x9EBC, - 0xBBF3: 0x9F3B, - 0xBBF4: 0x9F4A, - 0xBBF5: 0x5104, - 0xBBF6: 0x5100, - 0xBBF7: 0x50FB, - 0xBBF8: 0x50F5, - 0xBBF9: 0x50F9, - 0xBBFA: 0x5102, - 0xBBFB: 0x5108, - 0xBBFC: 0x5109, - 0xBBFD: 0x5105, - 0xBBFE: 0x51DC, - 0xBC40: 0x5287, - 0xBC41: 0x5288, - 0xBC42: 0x5289, - 0xBC43: 0x528D, - 0xBC44: 0x528A, - 0xBC45: 0x52F0, - 0xBC46: 0x53B2, - 0xBC47: 0x562E, - 0xBC48: 0x563B, - 0xBC49: 0x5639, - 0xBC4A: 0x5632, - 0xBC4B: 0x563F, - 0xBC4C: 0x5634, - 0xBC4D: 0x5629, - 0xBC4E: 0x5653, - 0xBC4F: 0x564E, - 0xBC50: 0x5657, - 0xBC51: 0x5674, - 0xBC52: 0x5636, - 0xBC53: 0x562F, - 0xBC54: 0x5630, - 0xBC55: 0x5880, - 0xBC56: 0x589F, - 0xBC57: 0x589E, - 0xBC58: 0x58B3, - 0xBC59: 0x589C, - 0xBC5A: 0x58AE, - 0xBC5B: 0x58A9, - 0xBC5C: 0x58A6, - 0xBC5D: 0x596D, - 0xBC5E: 0x5B09, - 0xBC5F: 0x5AFB, - 0xBC60: 0x5B0B, - 0xBC61: 0x5AF5, - 0xBC62: 0x5B0C, - 0xBC63: 0x5B08, - 0xBC64: 0x5BEE, - 0xBC65: 0x5BEC, - 0xBC66: 0x5BE9, - 0xBC67: 0x5BEB, - 0xBC68: 0x5C64, - 0xBC69: 0x5C65, - 0xBC6A: 0x5D9D, - 0xBC6B: 0x5D94, - 0xBC6C: 0x5E62, - 0xBC6D: 0x5E5F, - 0xBC6E: 0x5E61, - 0xBC6F: 0x5EE2, - 0xBC70: 0x5EDA, - 0xBC71: 0x5EDF, - 0xBC72: 0x5EDD, - 0xBC73: 0x5EE3, - 0xBC74: 0x5EE0, - 0xBC75: 0x5F48, - 0xBC76: 0x5F71, - 0xBC77: 0x5FB7, - 0xBC78: 0x5FB5, - 0xBC79: 0x6176, - 0xBC7A: 0x6167, - 0xBC7B: 0x616E, - 0xBC7C: 0x615D, - 0xBC7D: 0x6155, - 0xBC7E: 0x6182, - 0xBCA1: 0x617C, - 0xBCA2: 0x6170, - 0xBCA3: 0x616B, - 0xBCA4: 0x617E, - 0xBCA5: 0x61A7, - 0xBCA6: 0x6190, - 0xBCA7: 0x61AB, - 0xBCA8: 0x618E, - 0xBCA9: 0x61AC, - 0xBCAA: 0x619A, - 0xBCAB: 0x61A4, - 0xBCAC: 0x6194, - 0xBCAD: 0x61AE, - 0xBCAE: 0x622E, - 0xBCAF: 0x6469, - 0xBCB0: 0x646F, - 0xBCB1: 0x6479, - 0xBCB2: 0x649E, - 0xBCB3: 0x64B2, - 0xBCB4: 0x6488, - 0xBCB5: 0x6490, - 0xBCB6: 0x64B0, - 0xBCB7: 0x64A5, - 0xBCB8: 0x6493, - 0xBCB9: 0x6495, - 0xBCBA: 0x64A9, - 0xBCBB: 0x6492, - 0xBCBC: 0x64AE, - 0xBCBD: 0x64AD, - 0xBCBE: 0x64AB, - 0xBCBF: 0x649A, - 0xBCC0: 0x64AC, - 0xBCC1: 0x6499, - 0xBCC2: 0x64A2, - 0xBCC3: 0x64B3, - 0xBCC4: 0x6575, - 0xBCC5: 0x6577, - 0xBCC6: 0x6578, - 0xBCC7: 0x66AE, - 0xBCC8: 0x66AB, - 0xBCC9: 0x66B4, - 0xBCCA: 0x66B1, - 0xBCCB: 0x6A23, - 0xBCCC: 0x6A1F, - 0xBCCD: 0x69E8, - 0xBCCE: 0x6A01, - 0xBCCF: 0x6A1E, - 0xBCD0: 0x6A19, - 0xBCD1: 0x69FD, - 0xBCD2: 0x6A21, - 0xBCD3: 0x6A13, - 0xBCD4: 0x6A0A, - 0xBCD5: 0x69F3, - 0xBCD6: 0x6A02, - 0xBCD7: 0x6A05, - 0xBCD8: 0x69ED, - 0xBCD9: 0x6A11, - 0xBCDA: 0x6B50, - 0xBCDB: 0x6B4E, - 0xBCDC: 0x6BA4, - 0xBCDD: 0x6BC5, - 0xBCDE: 0x6BC6, - 0xBCDF: 0x6F3F, - 0xBCE0: 0x6F7C, - 0xBCE1: 0x6F84, - 0xBCE2: 0x6F51, - 0xBCE3: 0x6F66, - 0xBCE4: 0x6F54, - 0xBCE5: 0x6F86, - 0xBCE6: 0x6F6D, - 0xBCE7: 0x6F5B, - 0xBCE8: 0x6F78, - 0xBCE9: 0x6F6E, - 0xBCEA: 0x6F8E, - 0xBCEB: 0x6F7A, - 0xBCEC: 0x6F70, - 0xBCED: 0x6F64, - 0xBCEE: 0x6F97, - 0xBCEF: 0x6F58, - 0xBCF0: 0x6ED5, - 0xBCF1: 0x6F6F, - 0xBCF2: 0x6F60, - 0xBCF3: 0x6F5F, - 0xBCF4: 0x719F, - 0xBCF5: 0x71AC, - 0xBCF6: 0x71B1, - 0xBCF7: 0x71A8, - 0xBCF8: 0x7256, - 0xBCF9: 0x729B, - 0xBCFA: 0x734E, - 0xBCFB: 0x7357, - 0xBCFC: 0x7469, - 0xBCFD: 0x748B, - 0xBCFE: 0x7483, - 0xBD40: 0x747E, - 0xBD41: 0x7480, - 0xBD42: 0x757F, - 0xBD43: 0x7620, - 0xBD44: 0x7629, - 0xBD45: 0x761F, - 0xBD46: 0x7624, - 0xBD47: 0x7626, - 0xBD48: 0x7621, - 0xBD49: 0x7622, - 0xBD4A: 0x769A, - 0xBD4B: 0x76BA, - 0xBD4C: 0x76E4, - 0xBD4D: 0x778E, - 0xBD4E: 0x7787, - 0xBD4F: 0x778C, - 0xBD50: 0x7791, - 0xBD51: 0x778B, - 0xBD52: 0x78CB, - 0xBD53: 0x78C5, - 0xBD54: 0x78BA, - 0xBD55: 0x78CA, - 0xBD56: 0x78BE, - 0xBD57: 0x78D5, - 0xBD58: 0x78BC, - 0xBD59: 0x78D0, - 0xBD5A: 0x7A3F, - 0xBD5B: 0x7A3C, - 0xBD5C: 0x7A40, - 0xBD5D: 0x7A3D, - 0xBD5E: 0x7A37, - 0xBD5F: 0x7A3B, - 0xBD60: 0x7AAF, - 0xBD61: 0x7AAE, - 0xBD62: 0x7BAD, - 0xBD63: 0x7BB1, - 0xBD64: 0x7BC4, - 0xBD65: 0x7BB4, - 0xBD66: 0x7BC6, - 0xBD67: 0x7BC7, - 0xBD68: 0x7BC1, - 0xBD69: 0x7BA0, - 0xBD6A: 0x7BCC, - 0xBD6B: 0x7CCA, - 0xBD6C: 0x7DE0, - 0xBD6D: 0x7DF4, - 0xBD6E: 0x7DEF, - 0xBD6F: 0x7DFB, - 0xBD70: 0x7DD8, - 0xBD71: 0x7DEC, - 0xBD72: 0x7DDD, - 0xBD73: 0x7DE8, - 0xBD74: 0x7DE3, - 0xBD75: 0x7DDA, - 0xBD76: 0x7DDE, - 0xBD77: 0x7DE9, - 0xBD78: 0x7D9E, - 0xBD79: 0x7DD9, - 0xBD7A: 0x7DF2, - 0xBD7B: 0x7DF9, - 0xBD7C: 0x7F75, - 0xBD7D: 0x7F77, - 0xBD7E: 0x7FAF, - 0xBDA1: 0x7FE9, - 0xBDA2: 0x8026, - 0xBDA3: 0x819B, - 0xBDA4: 0x819C, - 0xBDA5: 0x819D, - 0xBDA6: 0x81A0, - 0xBDA7: 0x819A, - 0xBDA8: 0x8198, - 0xBDA9: 0x8517, - 0xBDAA: 0x853D, - 0xBDAB: 0x851A, - 0xBDAC: 0x84EE, - 0xBDAD: 0x852C, - 0xBDAE: 0x852D, - 0xBDAF: 0x8513, - 0xBDB0: 0x8511, - 0xBDB1: 0x8523, - 0xBDB2: 0x8521, - 0xBDB3: 0x8514, - 0xBDB4: 0x84EC, - 0xBDB5: 0x8525, - 0xBDB6: 0x84FF, - 0xBDB7: 0x8506, - 0xBDB8: 0x8782, - 0xBDB9: 0x8774, - 0xBDBA: 0x8776, - 0xBDBB: 0x8760, - 0xBDBC: 0x8766, - 0xBDBD: 0x8778, - 0xBDBE: 0x8768, - 0xBDBF: 0x8759, - 0xBDC0: 0x8757, - 0xBDC1: 0x874C, - 0xBDC2: 0x8753, - 0xBDC3: 0x885B, - 0xBDC4: 0x885D, - 0xBDC5: 0x8910, - 0xBDC6: 0x8907, - 0xBDC7: 0x8912, - 0xBDC8: 0x8913, - 0xBDC9: 0x8915, - 0xBDCA: 0x890A, - 0xBDCB: 0x8ABC, - 0xBDCC: 0x8AD2, - 0xBDCD: 0x8AC7, - 0xBDCE: 0x8AC4, - 0xBDCF: 0x8A95, - 0xBDD0: 0x8ACB, - 0xBDD1: 0x8AF8, - 0xBDD2: 0x8AB2, - 0xBDD3: 0x8AC9, - 0xBDD4: 0x8AC2, - 0xBDD5: 0x8ABF, - 0xBDD6: 0x8AB0, - 0xBDD7: 0x8AD6, - 0xBDD8: 0x8ACD, - 0xBDD9: 0x8AB6, - 0xBDDA: 0x8AB9, - 0xBDDB: 0x8ADB, - 0xBDDC: 0x8C4C, - 0xBDDD: 0x8C4E, - 0xBDDE: 0x8C6C, - 0xBDDF: 0x8CE0, - 0xBDE0: 0x8CDE, - 0xBDE1: 0x8CE6, - 0xBDE2: 0x8CE4, - 0xBDE3: 0x8CEC, - 0xBDE4: 0x8CED, - 0xBDE5: 0x8CE2, - 0xBDE6: 0x8CE3, - 0xBDE7: 0x8CDC, - 0xBDE8: 0x8CEA, - 0xBDE9: 0x8CE1, - 0xBDEA: 0x8D6D, - 0xBDEB: 0x8D9F, - 0xBDEC: 0x8DA3, - 0xBDED: 0x8E2B, - 0xBDEE: 0x8E10, - 0xBDEF: 0x8E1D, - 0xBDF0: 0x8E22, - 0xBDF1: 0x8E0F, - 0xBDF2: 0x8E29, - 0xBDF3: 0x8E1F, - 0xBDF4: 0x8E21, - 0xBDF5: 0x8E1E, - 0xBDF6: 0x8EBA, - 0xBDF7: 0x8F1D, - 0xBDF8: 0x8F1B, - 0xBDF9: 0x8F1F, - 0xBDFA: 0x8F29, - 0xBDFB: 0x8F26, - 0xBDFC: 0x8F2A, - 0xBDFD: 0x8F1C, - 0xBDFE: 0x8F1E, - 0xBE40: 0x8F25, - 0xBE41: 0x9069, - 0xBE42: 0x906E, - 0xBE43: 0x9068, - 0xBE44: 0x906D, - 0xBE45: 0x9077, - 0xBE46: 0x9130, - 0xBE47: 0x912D, - 0xBE48: 0x9127, - 0xBE49: 0x9131, - 0xBE4A: 0x9187, - 0xBE4B: 0x9189, - 0xBE4C: 0x918B, - 0xBE4D: 0x9183, - 0xBE4E: 0x92C5, - 0xBE4F: 0x92BB, - 0xBE50: 0x92B7, - 0xBE51: 0x92EA, - 0xBE52: 0x92AC, - 0xBE53: 0x92E4, - 0xBE54: 0x92C1, - 0xBE55: 0x92B3, - 0xBE56: 0x92BC, - 0xBE57: 0x92D2, - 0xBE58: 0x92C7, - 0xBE59: 0x92F0, - 0xBE5A: 0x92B2, - 0xBE5B: 0x95AD, - 0xBE5C: 0x95B1, - 0xBE5D: 0x9704, - 0xBE5E: 0x9706, - 0xBE5F: 0x9707, - 0xBE60: 0x9709, - 0xBE61: 0x9760, - 0xBE62: 0x978D, - 0xBE63: 0x978B, - 0xBE64: 0x978F, - 0xBE65: 0x9821, - 0xBE66: 0x982B, - 0xBE67: 0x981C, - 0xBE68: 0x98B3, - 0xBE69: 0x990A, - 0xBE6A: 0x9913, - 0xBE6B: 0x9912, - 0xBE6C: 0x9918, - 0xBE6D: 0x99DD, - 0xBE6E: 0x99D0, - 0xBE6F: 0x99DF, - 0xBE70: 0x99DB, - 0xBE71: 0x99D1, - 0xBE72: 0x99D5, - 0xBE73: 0x99D2, - 0xBE74: 0x99D9, - 0xBE75: 0x9AB7, - 0xBE76: 0x9AEE, - 0xBE77: 0x9AEF, - 0xBE78: 0x9B27, - 0xBE79: 0x9B45, - 0xBE7A: 0x9B44, - 0xBE7B: 0x9B77, - 0xBE7C: 0x9B6F, - 0xBE7D: 0x9D06, - 0xBE7E: 0x9D09, - 0xBEA1: 0x9D03, - 0xBEA2: 0x9EA9, - 0xBEA3: 0x9EBE, - 0xBEA4: 0x9ECE, - 0xBEA5: 0x58A8, - 0xBEA6: 0x9F52, - 0xBEA7: 0x5112, - 0xBEA8: 0x5118, - 0xBEA9: 0x5114, - 0xBEAA: 0x5110, - 0xBEAB: 0x5115, - 0xBEAC: 0x5180, - 0xBEAD: 0x51AA, - 0xBEAE: 0x51DD, - 0xBEAF: 0x5291, - 0xBEB0: 0x5293, - 0xBEB1: 0x52F3, - 0xBEB2: 0x5659, - 0xBEB3: 0x566B, - 0xBEB4: 0x5679, - 0xBEB5: 0x5669, - 0xBEB6: 0x5664, - 0xBEB7: 0x5678, - 0xBEB8: 0x566A, - 0xBEB9: 0x5668, - 0xBEBA: 0x5665, - 0xBEBB: 0x5671, - 0xBEBC: 0x566F, - 0xBEBD: 0x566C, - 0xBEBE: 0x5662, - 0xBEBF: 0x5676, - 0xBEC0: 0x58C1, - 0xBEC1: 0x58BE, - 0xBEC2: 0x58C7, - 0xBEC3: 0x58C5, - 0xBEC4: 0x596E, - 0xBEC5: 0x5B1D, - 0xBEC6: 0x5B34, - 0xBEC7: 0x5B78, - 0xBEC8: 0x5BF0, - 0xBEC9: 0x5C0E, - 0xBECA: 0x5F4A, - 0xBECB: 0x61B2, - 0xBECC: 0x6191, - 0xBECD: 0x61A9, - 0xBECE: 0x618A, - 0xBECF: 0x61CD, - 0xBED0: 0x61B6, - 0xBED1: 0x61BE, - 0xBED2: 0x61CA, - 0xBED3: 0x61C8, - 0xBED4: 0x6230, - 0xBED5: 0x64C5, - 0xBED6: 0x64C1, - 0xBED7: 0x64CB, - 0xBED8: 0x64BB, - 0xBED9: 0x64BC, - 0xBEDA: 0x64DA, - 0xBEDB: 0x64C4, - 0xBEDC: 0x64C7, - 0xBEDD: 0x64C2, - 0xBEDE: 0x64CD, - 0xBEDF: 0x64BF, - 0xBEE0: 0x64D2, - 0xBEE1: 0x64D4, - 0xBEE2: 0x64BE, - 0xBEE3: 0x6574, - 0xBEE4: 0x66C6, - 0xBEE5: 0x66C9, - 0xBEE6: 0x66B9, - 0xBEE7: 0x66C4, - 0xBEE8: 0x66C7, - 0xBEE9: 0x66B8, - 0xBEEA: 0x6A3D, - 0xBEEB: 0x6A38, - 0xBEEC: 0x6A3A, - 0xBEED: 0x6A59, - 0xBEEE: 0x6A6B, - 0xBEEF: 0x6A58, - 0xBEF0: 0x6A39, - 0xBEF1: 0x6A44, - 0xBEF2: 0x6A62, - 0xBEF3: 0x6A61, - 0xBEF4: 0x6A4B, - 0xBEF5: 0x6A47, - 0xBEF6: 0x6A35, - 0xBEF7: 0x6A5F, - 0xBEF8: 0x6A48, - 0xBEF9: 0x6B59, - 0xBEFA: 0x6B77, - 0xBEFB: 0x6C05, - 0xBEFC: 0x6FC2, - 0xBEFD: 0x6FB1, - 0xBEFE: 0x6FA1, - 0xBF40: 0x6FC3, - 0xBF41: 0x6FA4, - 0xBF42: 0x6FC1, - 0xBF43: 0x6FA7, - 0xBF44: 0x6FB3, - 0xBF45: 0x6FC0, - 0xBF46: 0x6FB9, - 0xBF47: 0x6FB6, - 0xBF48: 0x6FA6, - 0xBF49: 0x6FA0, - 0xBF4A: 0x6FB4, - 0xBF4B: 0x71BE, - 0xBF4C: 0x71C9, - 0xBF4D: 0x71D0, - 0xBF4E: 0x71D2, - 0xBF4F: 0x71C8, - 0xBF50: 0x71D5, - 0xBF51: 0x71B9, - 0xBF52: 0x71CE, - 0xBF53: 0x71D9, - 0xBF54: 0x71DC, - 0xBF55: 0x71C3, - 0xBF56: 0x71C4, - 0xBF57: 0x7368, - 0xBF58: 0x749C, - 0xBF59: 0x74A3, - 0xBF5A: 0x7498, - 0xBF5B: 0x749F, - 0xBF5C: 0x749E, - 0xBF5D: 0x74E2, - 0xBF5E: 0x750C, - 0xBF5F: 0x750D, - 0xBF60: 0x7634, - 0xBF61: 0x7638, - 0xBF62: 0x763A, - 0xBF63: 0x76E7, - 0xBF64: 0x76E5, - 0xBF65: 0x77A0, - 0xBF66: 0x779E, - 0xBF67: 0x779F, - 0xBF68: 0x77A5, - 0xBF69: 0x78E8, - 0xBF6A: 0x78DA, - 0xBF6B: 0x78EC, - 0xBF6C: 0x78E7, - 0xBF6D: 0x79A6, - 0xBF6E: 0x7A4D, - 0xBF6F: 0x7A4E, - 0xBF70: 0x7A46, - 0xBF71: 0x7A4C, - 0xBF72: 0x7A4B, - 0xBF73: 0x7ABA, - 0xBF74: 0x7BD9, - 0xBF75: 0x7C11, - 0xBF76: 0x7BC9, - 0xBF77: 0x7BE4, - 0xBF78: 0x7BDB, - 0xBF79: 0x7BE1, - 0xBF7A: 0x7BE9, - 0xBF7B: 0x7BE6, - 0xBF7C: 0x7CD5, - 0xBF7D: 0x7CD6, - 0xBF7E: 0x7E0A, - 0xBFA1: 0x7E11, - 0xBFA2: 0x7E08, - 0xBFA3: 0x7E1B, - 0xBFA4: 0x7E23, - 0xBFA5: 0x7E1E, - 0xBFA6: 0x7E1D, - 0xBFA7: 0x7E09, - 0xBFA8: 0x7E10, - 0xBFA9: 0x7F79, - 0xBFAA: 0x7FB2, - 0xBFAB: 0x7FF0, - 0xBFAC: 0x7FF1, - 0xBFAD: 0x7FEE, - 0xBFAE: 0x8028, - 0xBFAF: 0x81B3, - 0xBFB0: 0x81A9, - 0xBFB1: 0x81A8, - 0xBFB2: 0x81FB, - 0xBFB3: 0x8208, - 0xBFB4: 0x8258, - 0xBFB5: 0x8259, - 0xBFB6: 0x854A, - 0xBFB7: 0x8559, - 0xBFB8: 0x8548, - 0xBFB9: 0x8568, - 0xBFBA: 0x8569, - 0xBFBB: 0x8543, - 0xBFBC: 0x8549, - 0xBFBD: 0x856D, - 0xBFBE: 0x856A, - 0xBFBF: 0x855E, - 0xBFC0: 0x8783, - 0xBFC1: 0x879F, - 0xBFC2: 0x879E, - 0xBFC3: 0x87A2, - 0xBFC4: 0x878D, - 0xBFC5: 0x8861, - 0xBFC6: 0x892A, - 0xBFC7: 0x8932, - 0xBFC8: 0x8925, - 0xBFC9: 0x892B, - 0xBFCA: 0x8921, - 0xBFCB: 0x89AA, - 0xBFCC: 0x89A6, - 0xBFCD: 0x8AE6, - 0xBFCE: 0x8AFA, - 0xBFCF: 0x8AEB, - 0xBFD0: 0x8AF1, - 0xBFD1: 0x8B00, - 0xBFD2: 0x8ADC, - 0xBFD3: 0x8AE7, - 0xBFD4: 0x8AEE, - 0xBFD5: 0x8AFE, - 0xBFD6: 0x8B01, - 0xBFD7: 0x8B02, - 0xBFD8: 0x8AF7, - 0xBFD9: 0x8AED, - 0xBFDA: 0x8AF3, - 0xBFDB: 0x8AF6, - 0xBFDC: 0x8AFC, - 0xBFDD: 0x8C6B, - 0xBFDE: 0x8C6D, - 0xBFDF: 0x8C93, - 0xBFE0: 0x8CF4, - 0xBFE1: 0x8E44, - 0xBFE2: 0x8E31, - 0xBFE3: 0x8E34, - 0xBFE4: 0x8E42, - 0xBFE5: 0x8E39, - 0xBFE6: 0x8E35, - 0xBFE7: 0x8F3B, - 0xBFE8: 0x8F2F, - 0xBFE9: 0x8F38, - 0xBFEA: 0x8F33, - 0xBFEB: 0x8FA8, - 0xBFEC: 0x8FA6, - 0xBFED: 0x9075, - 0xBFEE: 0x9074, - 0xBFEF: 0x9078, - 0xBFF0: 0x9072, - 0xBFF1: 0x907C, - 0xBFF2: 0x907A, - 0xBFF3: 0x9134, - 0xBFF4: 0x9192, - 0xBFF5: 0x9320, - 0xBFF6: 0x9336, - 0xBFF7: 0x92F8, - 0xBFF8: 0x9333, - 0xBFF9: 0x932F, - 0xBFFA: 0x9322, - 0xBFFB: 0x92FC, - 0xBFFC: 0x932B, - 0xBFFD: 0x9304, - 0xBFFE: 0x931A, - 0xC040: 0x9310, - 0xC041: 0x9326, - 0xC042: 0x9321, - 0xC043: 0x9315, - 0xC044: 0x932E, - 0xC045: 0x9319, - 0xC046: 0x95BB, - 0xC047: 0x96A7, - 0xC048: 0x96A8, - 0xC049: 0x96AA, - 0xC04A: 0x96D5, - 0xC04B: 0x970E, - 0xC04C: 0x9711, - 0xC04D: 0x9716, - 0xC04E: 0x970D, - 0xC04F: 0x9713, - 0xC050: 0x970F, - 0xC051: 0x975B, - 0xC052: 0x975C, - 0xC053: 0x9766, - 0xC054: 0x9798, - 0xC055: 0x9830, - 0xC056: 0x9838, - 0xC057: 0x983B, - 0xC058: 0x9837, - 0xC059: 0x982D, - 0xC05A: 0x9839, - 0xC05B: 0x9824, - 0xC05C: 0x9910, - 0xC05D: 0x9928, - 0xC05E: 0x991E, - 0xC05F: 0x991B, - 0xC060: 0x9921, - 0xC061: 0x991A, - 0xC062: 0x99ED, - 0xC063: 0x99E2, - 0xC064: 0x99F1, - 0xC065: 0x9AB8, - 0xC066: 0x9ABC, - 0xC067: 0x9AFB, - 0xC068: 0x9AED, - 0xC069: 0x9B28, - 0xC06A: 0x9B91, - 0xC06B: 0x9D15, - 0xC06C: 0x9D23, - 0xC06D: 0x9D26, - 0xC06E: 0x9D28, - 0xC06F: 0x9D12, - 0xC070: 0x9D1B, - 0xC071: 0x9ED8, - 0xC072: 0x9ED4, - 0xC073: 0x9F8D, - 0xC074: 0x9F9C, - 0xC075: 0x512A, - 0xC076: 0x511F, - 0xC077: 0x5121, - 0xC078: 0x5132, - 0xC079: 0x52F5, - 0xC07A: 0x568E, - 0xC07B: 0x5680, - 0xC07C: 0x5690, - 0xC07D: 0x5685, - 0xC07E: 0x5687, - 0xC0A1: 0x568F, - 0xC0A2: 0x58D5, - 0xC0A3: 0x58D3, - 0xC0A4: 0x58D1, - 0xC0A5: 0x58CE, - 0xC0A6: 0x5B30, - 0xC0A7: 0x5B2A, - 0xC0A8: 0x5B24, - 0xC0A9: 0x5B7A, - 0xC0AA: 0x5C37, - 0xC0AB: 0x5C68, - 0xC0AC: 0x5DBC, - 0xC0AD: 0x5DBA, - 0xC0AE: 0x5DBD, - 0xC0AF: 0x5DB8, - 0xC0B0: 0x5E6B, - 0xC0B1: 0x5F4C, - 0xC0B2: 0x5FBD, - 0xC0B3: 0x61C9, - 0xC0B4: 0x61C2, - 0xC0B5: 0x61C7, - 0xC0B6: 0x61E6, - 0xC0B7: 0x61CB, - 0xC0B8: 0x6232, - 0xC0B9: 0x6234, - 0xC0BA: 0x64CE, - 0xC0BB: 0x64CA, - 0xC0BC: 0x64D8, - 0xC0BD: 0x64E0, - 0xC0BE: 0x64F0, - 0xC0BF: 0x64E6, - 0xC0C0: 0x64EC, - 0xC0C1: 0x64F1, - 0xC0C2: 0x64E2, - 0xC0C3: 0x64ED, - 0xC0C4: 0x6582, - 0xC0C5: 0x6583, - 0xC0C6: 0x66D9, - 0xC0C7: 0x66D6, - 0xC0C8: 0x6A80, - 0xC0C9: 0x6A94, - 0xC0CA: 0x6A84, - 0xC0CB: 0x6AA2, - 0xC0CC: 0x6A9C, - 0xC0CD: 0x6ADB, - 0xC0CE: 0x6AA3, - 0xC0CF: 0x6A7E, - 0xC0D0: 0x6A97, - 0xC0D1: 0x6A90, - 0xC0D2: 0x6AA0, - 0xC0D3: 0x6B5C, - 0xC0D4: 0x6BAE, - 0xC0D5: 0x6BDA, - 0xC0D6: 0x6C08, - 0xC0D7: 0x6FD8, - 0xC0D8: 0x6FF1, - 0xC0D9: 0x6FDF, - 0xC0DA: 0x6FE0, - 0xC0DB: 0x6FDB, - 0xC0DC: 0x6FE4, - 0xC0DD: 0x6FEB, - 0xC0DE: 0x6FEF, - 0xC0DF: 0x6F80, - 0xC0E0: 0x6FEC, - 0xC0E1: 0x6FE1, - 0xC0E2: 0x6FE9, - 0xC0E3: 0x6FD5, - 0xC0E4: 0x6FEE, - 0xC0E5: 0x6FF0, - 0xC0E6: 0x71E7, - 0xC0E7: 0x71DF, - 0xC0E8: 0x71EE, - 0xC0E9: 0x71E6, - 0xC0EA: 0x71E5, - 0xC0EB: 0x71ED, - 0xC0EC: 0x71EC, - 0xC0ED: 0x71F4, - 0xC0EE: 0x71E0, - 0xC0EF: 0x7235, - 0xC0F0: 0x7246, - 0xC0F1: 0x7370, - 0xC0F2: 0x7372, - 0xC0F3: 0x74A9, - 0xC0F4: 0x74B0, - 0xC0F5: 0x74A6, - 0xC0F6: 0x74A8, - 0xC0F7: 0x7646, - 0xC0F8: 0x7642, - 0xC0F9: 0x764C, - 0xC0FA: 0x76EA, - 0xC0FB: 0x77B3, - 0xC0FC: 0x77AA, - 0xC0FD: 0x77B0, - 0xC0FE: 0x77AC, - 0xC140: 0x77A7, - 0xC141: 0x77AD, - 0xC142: 0x77EF, - 0xC143: 0x78F7, - 0xC144: 0x78FA, - 0xC145: 0x78F4, - 0xC146: 0x78EF, - 0xC147: 0x7901, - 0xC148: 0x79A7, - 0xC149: 0x79AA, - 0xC14A: 0x7A57, - 0xC14B: 0x7ABF, - 0xC14C: 0x7C07, - 0xC14D: 0x7C0D, - 0xC14E: 0x7BFE, - 0xC14F: 0x7BF7, - 0xC150: 0x7C0C, - 0xC151: 0x7BE0, - 0xC152: 0x7CE0, - 0xC153: 0x7CDC, - 0xC154: 0x7CDE, - 0xC155: 0x7CE2, - 0xC156: 0x7CDF, - 0xC157: 0x7CD9, - 0xC158: 0x7CDD, - 0xC159: 0x7E2E, - 0xC15A: 0x7E3E, - 0xC15B: 0x7E46, - 0xC15C: 0x7E37, - 0xC15D: 0x7E32, - 0xC15E: 0x7E43, - 0xC15F: 0x7E2B, - 0xC160: 0x7E3D, - 0xC161: 0x7E31, - 0xC162: 0x7E45, - 0xC163: 0x7E41, - 0xC164: 0x7E34, - 0xC165: 0x7E39, - 0xC166: 0x7E48, - 0xC167: 0x7E35, - 0xC168: 0x7E3F, - 0xC169: 0x7E2F, - 0xC16A: 0x7F44, - 0xC16B: 0x7FF3, - 0xC16C: 0x7FFC, - 0xC16D: 0x8071, - 0xC16E: 0x8072, - 0xC16F: 0x8070, - 0xC170: 0x806F, - 0xC171: 0x8073, - 0xC172: 0x81C6, - 0xC173: 0x81C3, - 0xC174: 0x81BA, - 0xC175: 0x81C2, - 0xC176: 0x81C0, - 0xC177: 0x81BF, - 0xC178: 0x81BD, - 0xC179: 0x81C9, - 0xC17A: 0x81BE, - 0xC17B: 0x81E8, - 0xC17C: 0x8209, - 0xC17D: 0x8271, - 0xC17E: 0x85AA, - 0xC1A1: 0x8584, - 0xC1A2: 0x857E, - 0xC1A3: 0x859C, - 0xC1A4: 0x8591, - 0xC1A5: 0x8594, - 0xC1A6: 0x85AF, - 0xC1A7: 0x859B, - 0xC1A8: 0x8587, - 0xC1A9: 0x85A8, - 0xC1AA: 0x858A, - 0xC1AB: 0x8667, - 0xC1AC: 0x87C0, - 0xC1AD: 0x87D1, - 0xC1AE: 0x87B3, - 0xC1AF: 0x87D2, - 0xC1B0: 0x87C6, - 0xC1B1: 0x87AB, - 0xC1B2: 0x87BB, - 0xC1B3: 0x87BA, - 0xC1B4: 0x87C8, - 0xC1B5: 0x87CB, - 0xC1B6: 0x893B, - 0xC1B7: 0x8936, - 0xC1B8: 0x8944, - 0xC1B9: 0x8938, - 0xC1BA: 0x893D, - 0xC1BB: 0x89AC, - 0xC1BC: 0x8B0E, - 0xC1BD: 0x8B17, - 0xC1BE: 0x8B19, - 0xC1BF: 0x8B1B, - 0xC1C0: 0x8B0A, - 0xC1C1: 0x8B20, - 0xC1C2: 0x8B1D, - 0xC1C3: 0x8B04, - 0xC1C4: 0x8B10, - 0xC1C5: 0x8C41, - 0xC1C6: 0x8C3F, - 0xC1C7: 0x8C73, - 0xC1C8: 0x8CFA, - 0xC1C9: 0x8CFD, - 0xC1CA: 0x8CFC, - 0xC1CB: 0x8CF8, - 0xC1CC: 0x8CFB, - 0xC1CD: 0x8DA8, - 0xC1CE: 0x8E49, - 0xC1CF: 0x8E4B, - 0xC1D0: 0x8E48, - 0xC1D1: 0x8E4A, - 0xC1D2: 0x8F44, - 0xC1D3: 0x8F3E, - 0xC1D4: 0x8F42, - 0xC1D5: 0x8F45, - 0xC1D6: 0x8F3F, - 0xC1D7: 0x907F, - 0xC1D8: 0x907D, - 0xC1D9: 0x9084, - 0xC1DA: 0x9081, - 0xC1DB: 0x9082, - 0xC1DC: 0x9080, - 0xC1DD: 0x9139, - 0xC1DE: 0x91A3, - 0xC1DF: 0x919E, - 0xC1E0: 0x919C, - 0xC1E1: 0x934D, - 0xC1E2: 0x9382, - 0xC1E3: 0x9328, - 0xC1E4: 0x9375, - 0xC1E5: 0x934A, - 0xC1E6: 0x9365, - 0xC1E7: 0x934B, - 0xC1E8: 0x9318, - 0xC1E9: 0x937E, - 0xC1EA: 0x936C, - 0xC1EB: 0x935B, - 0xC1EC: 0x9370, - 0xC1ED: 0x935A, - 0xC1EE: 0x9354, - 0xC1EF: 0x95CA, - 0xC1F0: 0x95CB, - 0xC1F1: 0x95CC, - 0xC1F2: 0x95C8, - 0xC1F3: 0x95C6, - 0xC1F4: 0x96B1, - 0xC1F5: 0x96B8, - 0xC1F6: 0x96D6, - 0xC1F7: 0x971C, - 0xC1F8: 0x971E, - 0xC1F9: 0x97A0, - 0xC1FA: 0x97D3, - 0xC1FB: 0x9846, - 0xC1FC: 0x98B6, - 0xC1FD: 0x9935, - 0xC1FE: 0x9A01, - 0xC240: 0x99FF, - 0xC241: 0x9BAE, - 0xC242: 0x9BAB, - 0xC243: 0x9BAA, - 0xC244: 0x9BAD, - 0xC245: 0x9D3B, - 0xC246: 0x9D3F, - 0xC247: 0x9E8B, - 0xC248: 0x9ECF, - 0xC249: 0x9EDE, - 0xC24A: 0x9EDC, - 0xC24B: 0x9EDD, - 0xC24C: 0x9EDB, - 0xC24D: 0x9F3E, - 0xC24E: 0x9F4B, - 0xC24F: 0x53E2, - 0xC250: 0x5695, - 0xC251: 0x56AE, - 0xC252: 0x58D9, - 0xC253: 0x58D8, - 0xC254: 0x5B38, - 0xC255: 0x5F5D, - 0xC256: 0x61E3, - 0xC257: 0x6233, - 0xC258: 0x64F4, - 0xC259: 0x64F2, - 0xC25A: 0x64FE, - 0xC25B: 0x6506, - 0xC25C: 0x64FA, - 0xC25D: 0x64FB, - 0xC25E: 0x64F7, - 0xC25F: 0x65B7, - 0xC260: 0x66DC, - 0xC261: 0x6726, - 0xC262: 0x6AB3, - 0xC263: 0x6AAC, - 0xC264: 0x6AC3, - 0xC265: 0x6ABB, - 0xC266: 0x6AB8, - 0xC267: 0x6AC2, - 0xC268: 0x6AAE, - 0xC269: 0x6AAF, - 0xC26A: 0x6B5F, - 0xC26B: 0x6B78, - 0xC26C: 0x6BAF, - 0xC26D: 0x7009, - 0xC26E: 0x700B, - 0xC26F: 0x6FFE, - 0xC270: 0x7006, - 0xC271: 0x6FFA, - 0xC272: 0x7011, - 0xC273: 0x700F, - 0xC274: 0x71FB, - 0xC275: 0x71FC, - 0xC276: 0x71FE, - 0xC277: 0x71F8, - 0xC278: 0x7377, - 0xC279: 0x7375, - 0xC27A: 0x74A7, - 0xC27B: 0x74BF, - 0xC27C: 0x7515, - 0xC27D: 0x7656, - 0xC27E: 0x7658, - 0xC2A1: 0x7652, - 0xC2A2: 0x77BD, - 0xC2A3: 0x77BF, - 0xC2A4: 0x77BB, - 0xC2A5: 0x77BC, - 0xC2A6: 0x790E, - 0xC2A7: 0x79AE, - 0xC2A8: 0x7A61, - 0xC2A9: 0x7A62, - 0xC2AA: 0x7A60, - 0xC2AB: 0x7AC4, - 0xC2AC: 0x7AC5, - 0xC2AD: 0x7C2B, - 0xC2AE: 0x7C27, - 0xC2AF: 0x7C2A, - 0xC2B0: 0x7C1E, - 0xC2B1: 0x7C23, - 0xC2B2: 0x7C21, - 0xC2B3: 0x7CE7, - 0xC2B4: 0x7E54, - 0xC2B5: 0x7E55, - 0xC2B6: 0x7E5E, - 0xC2B7: 0x7E5A, - 0xC2B8: 0x7E61, - 0xC2B9: 0x7E52, - 0xC2BA: 0x7E59, - 0xC2BB: 0x7F48, - 0xC2BC: 0x7FF9, - 0xC2BD: 0x7FFB, - 0xC2BE: 0x8077, - 0xC2BF: 0x8076, - 0xC2C0: 0x81CD, - 0xC2C1: 0x81CF, - 0xC2C2: 0x820A, - 0xC2C3: 0x85CF, - 0xC2C4: 0x85A9, - 0xC2C5: 0x85CD, - 0xC2C6: 0x85D0, - 0xC2C7: 0x85C9, - 0xC2C8: 0x85B0, - 0xC2C9: 0x85BA, - 0xC2CA: 0x85B9, - 0xC2CB: 0x85A6, - 0xC2CC: 0x87EF, - 0xC2CD: 0x87EC, - 0xC2CE: 0x87F2, - 0xC2CF: 0x87E0, - 0xC2D0: 0x8986, - 0xC2D1: 0x89B2, - 0xC2D2: 0x89F4, - 0xC2D3: 0x8B28, - 0xC2D4: 0x8B39, - 0xC2D5: 0x8B2C, - 0xC2D6: 0x8B2B, - 0xC2D7: 0x8C50, - 0xC2D8: 0x8D05, - 0xC2D9: 0x8E59, - 0xC2DA: 0x8E63, - 0xC2DB: 0x8E66, - 0xC2DC: 0x8E64, - 0xC2DD: 0x8E5F, - 0xC2DE: 0x8E55, - 0xC2DF: 0x8EC0, - 0xC2E0: 0x8F49, - 0xC2E1: 0x8F4D, - 0xC2E2: 0x9087, - 0xC2E3: 0x9083, - 0xC2E4: 0x9088, - 0xC2E5: 0x91AB, - 0xC2E6: 0x91AC, - 0xC2E7: 0x91D0, - 0xC2E8: 0x9394, - 0xC2E9: 0x938A, - 0xC2EA: 0x9396, - 0xC2EB: 0x93A2, - 0xC2EC: 0x93B3, - 0xC2ED: 0x93AE, - 0xC2EE: 0x93AC, - 0xC2EF: 0x93B0, - 0xC2F0: 0x9398, - 0xC2F1: 0x939A, - 0xC2F2: 0x9397, - 0xC2F3: 0x95D4, - 0xC2F4: 0x95D6, - 0xC2F5: 0x95D0, - 0xC2F6: 0x95D5, - 0xC2F7: 0x96E2, - 0xC2F8: 0x96DC, - 0xC2F9: 0x96D9, - 0xC2FA: 0x96DB, - 0xC2FB: 0x96DE, - 0xC2FC: 0x9724, - 0xC2FD: 0x97A3, - 0xC2FE: 0x97A6, - 0xC340: 0x97AD, - 0xC341: 0x97F9, - 0xC342: 0x984D, - 0xC343: 0x984F, - 0xC344: 0x984C, - 0xC345: 0x984E, - 0xC346: 0x9853, - 0xC347: 0x98BA, - 0xC348: 0x993E, - 0xC349: 0x993F, - 0xC34A: 0x993D, - 0xC34B: 0x992E, - 0xC34C: 0x99A5, - 0xC34D: 0x9A0E, - 0xC34E: 0x9AC1, - 0xC34F: 0x9B03, - 0xC350: 0x9B06, - 0xC351: 0x9B4F, - 0xC352: 0x9B4E, - 0xC353: 0x9B4D, - 0xC354: 0x9BCA, - 0xC355: 0x9BC9, - 0xC356: 0x9BFD, - 0xC357: 0x9BC8, - 0xC358: 0x9BC0, - 0xC359: 0x9D51, - 0xC35A: 0x9D5D, - 0xC35B: 0x9D60, - 0xC35C: 0x9EE0, - 0xC35D: 0x9F15, - 0xC35E: 0x9F2C, - 0xC35F: 0x5133, - 0xC360: 0x56A5, - 0xC361: 0x58DE, - 0xC362: 0x58DF, - 0xC363: 0x58E2, - 0xC364: 0x5BF5, - 0xC365: 0x9F90, - 0xC366: 0x5EEC, - 0xC367: 0x61F2, - 0xC368: 0x61F7, - 0xC369: 0x61F6, - 0xC36A: 0x61F5, - 0xC36B: 0x6500, - 0xC36C: 0x650F, - 0xC36D: 0x66E0, - 0xC36E: 0x66DD, - 0xC36F: 0x6AE5, - 0xC370: 0x6ADD, - 0xC371: 0x6ADA, - 0xC372: 0x6AD3, - 0xC373: 0x701B, - 0xC374: 0x701F, - 0xC375: 0x7028, - 0xC376: 0x701A, - 0xC377: 0x701D, - 0xC378: 0x7015, - 0xC379: 0x7018, - 0xC37A: 0x7206, - 0xC37B: 0x720D, - 0xC37C: 0x7258, - 0xC37D: 0x72A2, - 0xC37E: 0x7378, - 0xC3A1: 0x737A, - 0xC3A2: 0x74BD, - 0xC3A3: 0x74CA, - 0xC3A4: 0x74E3, - 0xC3A5: 0x7587, - 0xC3A6: 0x7586, - 0xC3A7: 0x765F, - 0xC3A8: 0x7661, - 0xC3A9: 0x77C7, - 0xC3AA: 0x7919, - 0xC3AB: 0x79B1, - 0xC3AC: 0x7A6B, - 0xC3AD: 0x7A69, - 0xC3AE: 0x7C3E, - 0xC3AF: 0x7C3F, - 0xC3B0: 0x7C38, - 0xC3B1: 0x7C3D, - 0xC3B2: 0x7C37, - 0xC3B3: 0x7C40, - 0xC3B4: 0x7E6B, - 0xC3B5: 0x7E6D, - 0xC3B6: 0x7E79, - 0xC3B7: 0x7E69, - 0xC3B8: 0x7E6A, - 0xC3B9: 0x7F85, - 0xC3BA: 0x7E73, - 0xC3BB: 0x7FB6, - 0xC3BC: 0x7FB9, - 0xC3BD: 0x7FB8, - 0xC3BE: 0x81D8, - 0xC3BF: 0x85E9, - 0xC3C0: 0x85DD, - 0xC3C1: 0x85EA, - 0xC3C2: 0x85D5, - 0xC3C3: 0x85E4, - 0xC3C4: 0x85E5, - 0xC3C5: 0x85F7, - 0xC3C6: 0x87FB, - 0xC3C7: 0x8805, - 0xC3C8: 0x880D, - 0xC3C9: 0x87F9, - 0xC3CA: 0x87FE, - 0xC3CB: 0x8960, - 0xC3CC: 0x895F, - 0xC3CD: 0x8956, - 0xC3CE: 0x895E, - 0xC3CF: 0x8B41, - 0xC3D0: 0x8B5C, - 0xC3D1: 0x8B58, - 0xC3D2: 0x8B49, - 0xC3D3: 0x8B5A, - 0xC3D4: 0x8B4E, - 0xC3D5: 0x8B4F, - 0xC3D6: 0x8B46, - 0xC3D7: 0x8B59, - 0xC3D8: 0x8D08, - 0xC3D9: 0x8D0A, - 0xC3DA: 0x8E7C, - 0xC3DB: 0x8E72, - 0xC3DC: 0x8E87, - 0xC3DD: 0x8E76, - 0xC3DE: 0x8E6C, - 0xC3DF: 0x8E7A, - 0xC3E0: 0x8E74, - 0xC3E1: 0x8F54, - 0xC3E2: 0x8F4E, - 0xC3E3: 0x8FAD, - 0xC3E4: 0x908A, - 0xC3E5: 0x908B, - 0xC3E6: 0x91B1, - 0xC3E7: 0x91AE, - 0xC3E8: 0x93E1, - 0xC3E9: 0x93D1, - 0xC3EA: 0x93DF, - 0xC3EB: 0x93C3, - 0xC3EC: 0x93C8, - 0xC3ED: 0x93DC, - 0xC3EE: 0x93DD, - 0xC3EF: 0x93D6, - 0xC3F0: 0x93E2, - 0xC3F1: 0x93CD, - 0xC3F2: 0x93D8, - 0xC3F3: 0x93E4, - 0xC3F4: 0x93D7, - 0xC3F5: 0x93E8, - 0xC3F6: 0x95DC, - 0xC3F7: 0x96B4, - 0xC3F8: 0x96E3, - 0xC3F9: 0x972A, - 0xC3FA: 0x9727, - 0xC3FB: 0x9761, - 0xC3FC: 0x97DC, - 0xC3FD: 0x97FB, - 0xC3FE: 0x985E, - 0xC440: 0x9858, - 0xC441: 0x985B, - 0xC442: 0x98BC, - 0xC443: 0x9945, - 0xC444: 0x9949, - 0xC445: 0x9A16, - 0xC446: 0x9A19, - 0xC447: 0x9B0D, - 0xC448: 0x9BE8, - 0xC449: 0x9BE7, - 0xC44A: 0x9BD6, - 0xC44B: 0x9BDB, - 0xC44C: 0x9D89, - 0xC44D: 0x9D61, - 0xC44E: 0x9D72, - 0xC44F: 0x9D6A, - 0xC450: 0x9D6C, - 0xC451: 0x9E92, - 0xC452: 0x9E97, - 0xC453: 0x9E93, - 0xC454: 0x9EB4, - 0xC455: 0x52F8, - 0xC456: 0x56A8, - 0xC457: 0x56B7, - 0xC458: 0x56B6, - 0xC459: 0x56B4, - 0xC45A: 0x56BC, - 0xC45B: 0x58E4, - 0xC45C: 0x5B40, - 0xC45D: 0x5B43, - 0xC45E: 0x5B7D, - 0xC45F: 0x5BF6, - 0xC460: 0x5DC9, - 0xC461: 0x61F8, - 0xC462: 0x61FA, - 0xC463: 0x6518, - 0xC464: 0x6514, - 0xC465: 0x6519, - 0xC466: 0x66E6, - 0xC467: 0x6727, - 0xC468: 0x6AEC, - 0xC469: 0x703E, - 0xC46A: 0x7030, - 0xC46B: 0x7032, - 0xC46C: 0x7210, - 0xC46D: 0x737B, - 0xC46E: 0x74CF, - 0xC46F: 0x7662, - 0xC470: 0x7665, - 0xC471: 0x7926, - 0xC472: 0x792A, - 0xC473: 0x792C, - 0xC474: 0x792B, - 0xC475: 0x7AC7, - 0xC476: 0x7AF6, - 0xC477: 0x7C4C, - 0xC478: 0x7C43, - 0xC479: 0x7C4D, - 0xC47A: 0x7CEF, - 0xC47B: 0x7CF0, - 0xC47C: 0x8FAE, - 0xC47D: 0x7E7D, - 0xC47E: 0x7E7C, - 0xC4A1: 0x7E82, - 0xC4A2: 0x7F4C, - 0xC4A3: 0x8000, - 0xC4A4: 0x81DA, - 0xC4A5: 0x8266, - 0xC4A6: 0x85FB, - 0xC4A7: 0x85F9, - 0xC4A8: 0x8611, - 0xC4A9: 0x85FA, - 0xC4AA: 0x8606, - 0xC4AB: 0x860B, - 0xC4AC: 0x8607, - 0xC4AD: 0x860A, - 0xC4AE: 0x8814, - 0xC4AF: 0x8815, - 0xC4B0: 0x8964, - 0xC4B1: 0x89BA, - 0xC4B2: 0x89F8, - 0xC4B3: 0x8B70, - 0xC4B4: 0x8B6C, - 0xC4B5: 0x8B66, - 0xC4B6: 0x8B6F, - 0xC4B7: 0x8B5F, - 0xC4B8: 0x8B6B, - 0xC4B9: 0x8D0F, - 0xC4BA: 0x8D0D, - 0xC4BB: 0x8E89, - 0xC4BC: 0x8E81, - 0xC4BD: 0x8E85, - 0xC4BE: 0x8E82, - 0xC4BF: 0x91B4, - 0xC4C0: 0x91CB, - 0xC4C1: 0x9418, - 0xC4C2: 0x9403, - 0xC4C3: 0x93FD, - 0xC4C4: 0x95E1, - 0xC4C5: 0x9730, - 0xC4C6: 0x98C4, - 0xC4C7: 0x9952, - 0xC4C8: 0x9951, - 0xC4C9: 0x99A8, - 0xC4CA: 0x9A2B, - 0xC4CB: 0x9A30, - 0xC4CC: 0x9A37, - 0xC4CD: 0x9A35, - 0xC4CE: 0x9C13, - 0xC4CF: 0x9C0D, - 0xC4D0: 0x9E79, - 0xC4D1: 0x9EB5, - 0xC4D2: 0x9EE8, - 0xC4D3: 0x9F2F, - 0xC4D4: 0x9F5F, - 0xC4D5: 0x9F63, - 0xC4D6: 0x9F61, - 0xC4D7: 0x5137, - 0xC4D8: 0x5138, - 0xC4D9: 0x56C1, - 0xC4DA: 0x56C0, - 0xC4DB: 0x56C2, - 0xC4DC: 0x5914, - 0xC4DD: 0x5C6C, - 0xC4DE: 0x5DCD, - 0xC4DF: 0x61FC, - 0xC4E0: 0x61FE, - 0xC4E1: 0x651D, - 0xC4E2: 0x651C, - 0xC4E3: 0x6595, - 0xC4E4: 0x66E9, - 0xC4E5: 0x6AFB, - 0xC4E6: 0x6B04, - 0xC4E7: 0x6AFA, - 0xC4E8: 0x6BB2, - 0xC4E9: 0x704C, - 0xC4EA: 0x721B, - 0xC4EB: 0x72A7, - 0xC4EC: 0x74D6, - 0xC4ED: 0x74D4, - 0xC4EE: 0x7669, - 0xC4EF: 0x77D3, - 0xC4F0: 0x7C50, - 0xC4F1: 0x7E8F, - 0xC4F2: 0x7E8C, - 0xC4F3: 0x7FBC, - 0xC4F4: 0x8617, - 0xC4F5: 0x862D, - 0xC4F6: 0x861A, - 0xC4F7: 0x8823, - 0xC4F8: 0x8822, - 0xC4F9: 0x8821, - 0xC4FA: 0x881F, - 0xC4FB: 0x896A, - 0xC4FC: 0x896C, - 0xC4FD: 0x89BD, - 0xC4FE: 0x8B74, - 0xC540: 0x8B77, - 0xC541: 0x8B7D, - 0xC542: 0x8D13, - 0xC543: 0x8E8A, - 0xC544: 0x8E8D, - 0xC545: 0x8E8B, - 0xC546: 0x8F5F, - 0xC547: 0x8FAF, - 0xC548: 0x91BA, - 0xC549: 0x942E, - 0xC54A: 0x9433, - 0xC54B: 0x9435, - 0xC54C: 0x943A, - 0xC54D: 0x9438, - 0xC54E: 0x9432, - 0xC54F: 0x942B, - 0xC550: 0x95E2, - 0xC551: 0x9738, - 0xC552: 0x9739, - 0xC553: 0x9732, - 0xC554: 0x97FF, - 0xC555: 0x9867, - 0xC556: 0x9865, - 0xC557: 0x9957, - 0xC558: 0x9A45, - 0xC559: 0x9A43, - 0xC55A: 0x9A40, - 0xC55B: 0x9A3E, - 0xC55C: 0x9ACF, - 0xC55D: 0x9B54, - 0xC55E: 0x9B51, - 0xC55F: 0x9C2D, - 0xC560: 0x9C25, - 0xC561: 0x9DAF, - 0xC562: 0x9DB4, - 0xC563: 0x9DC2, - 0xC564: 0x9DB8, - 0xC565: 0x9E9D, - 0xC566: 0x9EEF, - 0xC567: 0x9F19, - 0xC568: 0x9F5C, - 0xC569: 0x9F66, - 0xC56A: 0x9F67, - 0xC56B: 0x513C, - 0xC56C: 0x513B, - 0xC56D: 0x56C8, - 0xC56E: 0x56CA, - 0xC56F: 0x56C9, - 0xC570: 0x5B7F, - 0xC571: 0x5DD4, - 0xC572: 0x5DD2, - 0xC573: 0x5F4E, - 0xC574: 0x61FF, - 0xC575: 0x6524, - 0xC576: 0x6B0A, - 0xC577: 0x6B61, - 0xC578: 0x7051, - 0xC579: 0x7058, - 0xC57A: 0x7380, - 0xC57B: 0x74E4, - 0xC57C: 0x758A, - 0xC57D: 0x766E, - 0xC57E: 0x766C, - 0xC5A1: 0x79B3, - 0xC5A2: 0x7C60, - 0xC5A3: 0x7C5F, - 0xC5A4: 0x807E, - 0xC5A5: 0x807D, - 0xC5A6: 0x81DF, - 0xC5A7: 0x8972, - 0xC5A8: 0x896F, - 0xC5A9: 0x89FC, - 0xC5AA: 0x8B80, - 0xC5AB: 0x8D16, - 0xC5AC: 0x8D17, - 0xC5AD: 0x8E91, - 0xC5AE: 0x8E93, - 0xC5AF: 0x8F61, - 0xC5B0: 0x9148, - 0xC5B1: 0x9444, - 0xC5B2: 0x9451, - 0xC5B3: 0x9452, - 0xC5B4: 0x973D, - 0xC5B5: 0x973E, - 0xC5B6: 0x97C3, - 0xC5B7: 0x97C1, - 0xC5B8: 0x986B, - 0xC5B9: 0x9955, - 0xC5BA: 0x9A55, - 0xC5BB: 0x9A4D, - 0xC5BC: 0x9AD2, - 0xC5BD: 0x9B1A, - 0xC5BE: 0x9C49, - 0xC5BF: 0x9C31, - 0xC5C0: 0x9C3E, - 0xC5C1: 0x9C3B, - 0xC5C2: 0x9DD3, - 0xC5C3: 0x9DD7, - 0xC5C4: 0x9F34, - 0xC5C5: 0x9F6C, - 0xC5C6: 0x9F6A, - 0xC5C7: 0x9F94, - 0xC5C8: 0x56CC, - 0xC5C9: 0x5DD6, - 0xC5CA: 0x6200, - 0xC5CB: 0x6523, - 0xC5CC: 0x652B, - 0xC5CD: 0x652A, - 0xC5CE: 0x66EC, - 0xC5CF: 0x6B10, - 0xC5D0: 0x74DA, - 0xC5D1: 0x7ACA, - 0xC5D2: 0x7C64, - 0xC5D3: 0x7C63, - 0xC5D4: 0x7C65, - 0xC5D5: 0x7E93, - 0xC5D6: 0x7E96, - 0xC5D7: 0x7E94, - 0xC5D8: 0x81E2, - 0xC5D9: 0x8638, - 0xC5DA: 0x863F, - 0xC5DB: 0x8831, - 0xC5DC: 0x8B8A, - 0xC5DD: 0x9090, - 0xC5DE: 0x908F, - 0xC5DF: 0x9463, - 0xC5E0: 0x9460, - 0xC5E1: 0x9464, - 0xC5E2: 0x9768, - 0xC5E3: 0x986F, - 0xC5E4: 0x995C, - 0xC5E5: 0x9A5A, - 0xC5E6: 0x9A5B, - 0xC5E7: 0x9A57, - 0xC5E8: 0x9AD3, - 0xC5E9: 0x9AD4, - 0xC5EA: 0x9AD1, - 0xC5EB: 0x9C54, - 0xC5EC: 0x9C57, - 0xC5ED: 0x9C56, - 0xC5EE: 0x9DE5, - 0xC5EF: 0x9E9F, - 0xC5F0: 0x9EF4, - 0xC5F1: 0x56D1, - 0xC5F2: 0x58E9, - 0xC5F3: 0x652C, - 0xC5F4: 0x705E, - 0xC5F5: 0x7671, - 0xC5F6: 0x7672, - 0xC5F7: 0x77D7, - 0xC5F8: 0x7F50, - 0xC5F9: 0x7F88, - 0xC5FA: 0x8836, - 0xC5FB: 0x8839, - 0xC5FC: 0x8862, - 0xC5FD: 0x8B93, - 0xC5FE: 0x8B92, - 0xC640: 0x8B96, - 0xC641: 0x8277, - 0xC642: 0x8D1B, - 0xC643: 0x91C0, - 0xC644: 0x946A, - 0xC645: 0x9742, - 0xC646: 0x9748, - 0xC647: 0x9744, - 0xC648: 0x97C6, - 0xC649: 0x9870, - 0xC64A: 0x9A5F, - 0xC64B: 0x9B22, - 0xC64C: 0x9B58, - 0xC64D: 0x9C5F, - 0xC64E: 0x9DF9, - 0xC64F: 0x9DFA, - 0xC650: 0x9E7C, - 0xC651: 0x9E7D, - 0xC652: 0x9F07, - 0xC653: 0x9F77, - 0xC654: 0x9F72, - 0xC655: 0x5EF3, - 0xC656: 0x6B16, - 0xC657: 0x7063, - 0xC658: 0x7C6C, - 0xC659: 0x7C6E, - 0xC65A: 0x883B, - 0xC65B: 0x89C0, - 0xC65C: 0x8EA1, - 0xC65D: 0x91C1, - 0xC65E: 0x9472, - 0xC65F: 0x9470, - 0xC660: 0x9871, - 0xC661: 0x995E, - 0xC662: 0x9AD6, - 0xC663: 0x9B23, - 0xC664: 0x9ECC, - 0xC665: 0x7064, - 0xC666: 0x77DA, - 0xC667: 0x8B9A, - 0xC668: 0x9477, - 0xC669: 0x97C9, - 0xC66A: 0x9A62, - 0xC66B: 0x9A65, - 0xC66C: 0x7E9C, - 0xC66D: 0x8B9C, - 0xC66E: 0x8EAA, - 0xC66F: 0x91C5, - 0xC670: 0x947D, - 0xC671: 0x947E, - 0xC672: 0x947C, - 0xC673: 0x9C77, - 0xC674: 0x9C78, - 0xC675: 0x9EF7, - 0xC676: 0x8C54, - 0xC677: 0x947F, - 0xC678: 0x9E1A, - 0xC679: 0x7228, - 0xC67A: 0x9A6A, - 0xC67B: 0x9B31, - 0xC67C: 0x9E1B, - 0xC67D: 0x9E1E, - 0xC67E: 0x7C72, - 0xC6A1: 0x30FE, // KATAKANA VOICED ITERATION MARK - 0xC6A2: 0x309D, // HIRAGANA ITERATION MARK - 0xC6A3: 0x309E, // HIRAGANA VOICED ITERATION MARK - 0xC6A4: 0x3005, // IDEOGRAPHIC ITERATION MARK - 0xC6A5: 0x3041, // HIRAGANA LETTER SMALL A - 0xC6A6: 0x3042, // HIRAGANA LETTER A - 0xC6A7: 0x3043, // HIRAGANA LETTER SMALL I - 0xC6A8: 0x3044, // HIRAGANA LETTER I - 0xC6A9: 0x3045, // HIRAGANA LETTER SMALL U - 0xC6AA: 0x3046, // HIRAGANA LETTER U - 0xC6AB: 0x3047, // HIRAGANA LETTER SMALL E - 0xC6AC: 0x3048, // HIRAGANA LETTER E - 0xC6AD: 0x3049, // HIRAGANA LETTER SMALL O - 0xC6AE: 0x304A, // HIRAGANA LETTER O - 0xC6AF: 0x304B, // HIRAGANA LETTER KA - 0xC6B0: 0x304C, // HIRAGANA LETTER GA - 0xC6B1: 0x304D, // HIRAGANA LETTER KI - 0xC6B2: 0x304E, // HIRAGANA LETTER GI - 0xC6B3: 0x304F, // HIRAGANA LETTER KU - 0xC6B4: 0x3050, // HIRAGANA LETTER GU - 0xC6B5: 0x3051, // HIRAGANA LETTER KE - 0xC6B6: 0x3052, // HIRAGANA LETTER GE - 0xC6B7: 0x3053, // HIRAGANA LETTER KO - 0xC6B8: 0x3054, // HIRAGANA LETTER GO - 0xC6B9: 0x3055, // HIRAGANA LETTER SA - 0xC6BA: 0x3056, // HIRAGANA LETTER ZA - 0xC6BB: 0x3057, // HIRAGANA LETTER SI - 0xC6BC: 0x3058, // HIRAGANA LETTER ZI - 0xC6BD: 0x3059, // HIRAGANA LETTER SU - 0xC6BE: 0x305A, // HIRAGANA LETTER ZU - 0xC6BF: 0x305B, // HIRAGANA LETTER SE - 0xC6C0: 0x305C, // HIRAGANA LETTER ZE - 0xC6C1: 0x305D, // HIRAGANA LETTER SO - 0xC6C2: 0x305E, // HIRAGANA LETTER ZO - 0xC6C3: 0x305F, // HIRAGANA LETTER TA - 0xC6C4: 0x3060, // HIRAGANA LETTER DA - 0xC6C5: 0x3061, // HIRAGANA LETTER TI - 0xC6C6: 0x3062, // HIRAGANA LETTER DI - 0xC6C7: 0x3063, // HIRAGANA LETTER SMALL TU - 0xC6C8: 0x3064, // HIRAGANA LETTER TU - 0xC6C9: 0x3065, // HIRAGANA LETTER DU - 0xC6CA: 0x3066, // HIRAGANA LETTER TE - 0xC6CB: 0x3067, // HIRAGANA LETTER DE - 0xC6CC: 0x3068, // HIRAGANA LETTER TO - 0xC6CD: 0x3069, // HIRAGANA LETTER DO - 0xC6CE: 0x306A, // HIRAGANA LETTER NA - 0xC6CF: 0x306B, // HIRAGANA LETTER NI - 0xC6D0: 0x306C, // HIRAGANA LETTER NU - 0xC6D1: 0x306D, // HIRAGANA LETTER NE - 0xC6D2: 0x306E, // HIRAGANA LETTER NO - 0xC6D3: 0x306F, // HIRAGANA LETTER HA - 0xC6D4: 0x3070, // HIRAGANA LETTER BA - 0xC6D5: 0x3071, // HIRAGANA LETTER PA - 0xC6D6: 0x3072, // HIRAGANA LETTER HI - 0xC6D7: 0x3073, // HIRAGANA LETTER BI - 0xC6D8: 0x3074, // HIRAGANA LETTER PI - 0xC6D9: 0x3075, // HIRAGANA LETTER HU - 0xC6DA: 0x3076, // HIRAGANA LETTER BU - 0xC6DB: 0x3077, // HIRAGANA LETTER PU - 0xC6DC: 0x3078, // HIRAGANA LETTER HE - 0xC6DD: 0x3079, // HIRAGANA LETTER BE - 0xC6DE: 0x307A, // HIRAGANA LETTER PE - 0xC6DF: 0x307B, // HIRAGANA LETTER HO - 0xC6E0: 0x307C, // HIRAGANA LETTER BO - 0xC6E1: 0x307D, // HIRAGANA LETTER PO - 0xC6E2: 0x307E, // HIRAGANA LETTER MA - 0xC6E3: 0x307F, // HIRAGANA LETTER MI - 0xC6E4: 0x3080, // HIRAGANA LETTER MU - 0xC6E5: 0x3081, // HIRAGANA LETTER ME - 0xC6E6: 0x3082, // HIRAGANA LETTER MO - 0xC6E7: 0x3083, // HIRAGANA LETTER SMALL YA - 0xC6E8: 0x3084, // HIRAGANA LETTER YA - 0xC6E9: 0x3085, // HIRAGANA LETTER SMALL YU - 0xC6EA: 0x3086, // HIRAGANA LETTER YU - 0xC6EB: 0x3087, // HIRAGANA LETTER SMALL YO - 0xC6EC: 0x3088, // HIRAGANA LETTER YO - 0xC6ED: 0x3089, // HIRAGANA LETTER RA - 0xC6EE: 0x308A, // HIRAGANA LETTER RI - 0xC6EF: 0x308B, // HIRAGANA LETTER RU - 0xC6F0: 0x308C, // HIRAGANA LETTER RE - 0xC6F1: 0x308D, // HIRAGANA LETTER RO - 0xC6F2: 0x308E, // HIRAGANA LETTER SMALL WA - 0xC6F3: 0x308F, // HIRAGANA LETTER WA - 0xC6F4: 0x3090, // HIRAGANA LETTER WI - 0xC6F5: 0x3091, // HIRAGANA LETTER WE - 0xC6F6: 0x3092, // HIRAGANA LETTER WO - 0xC6F7: 0x3093, // HIRAGANA LETTER N - 0xC6F8: 0x30A1, // KATAKANA LETTER SMALL A - 0xC6F9: 0x30A2, // KATAKANA LETTER A - 0xC6FA: 0x30A3, // KATAKANA LETTER SMALL I - 0xC6FB: 0x30A4, // KATAKANA LETTER I - 0xC6FC: 0x30A5, // KATAKANA LETTER SMALL U - 0xC6FD: 0x30A6, // KATAKANA LETTER U - 0xC6FE: 0x30A7, // KATAKANA LETTER SMALL E - 0xC740: 0x30A8, // KATAKANA LETTER E - 0xC741: 0x30A9, // KATAKANA LETTER SMALL O - 0xC742: 0x30AA, // KATAKANA LETTER O - 0xC743: 0x30AB, // KATAKANA LETTER KA - 0xC744: 0x30AC, // KATAKANA LETTER GA - 0xC745: 0x30AD, // KATAKANA LETTER KI - 0xC746: 0x30AE, // KATAKANA LETTER GI - 0xC747: 0x30AF, // KATAKANA LETTER KU - 0xC748: 0x30B0, // KATAKANA LETTER GU - 0xC749: 0x30B1, // KATAKANA LETTER KE - 0xC74A: 0x30B2, // KATAKANA LETTER GE - 0xC74B: 0x30B3, // KATAKANA LETTER KO - 0xC74C: 0x30B4, // KATAKANA LETTER GO - 0xC74D: 0x30B5, // KATAKANA LETTER SA - 0xC74E: 0x30B6, // KATAKANA LETTER ZA - 0xC74F: 0x30B7, // KATAKANA LETTER SI - 0xC750: 0x30B8, // KATAKANA LETTER ZI - 0xC751: 0x30B9, // KATAKANA LETTER SU - 0xC752: 0x30BA, // KATAKANA LETTER ZU - 0xC753: 0x30BB, // KATAKANA LETTER SE - 0xC754: 0x30BC, // KATAKANA LETTER ZE - 0xC755: 0x30BD, // KATAKANA LETTER SO - 0xC756: 0x30BE, // KATAKANA LETTER ZO - 0xC757: 0x30BF, // KATAKANA LETTER TA - 0xC758: 0x30C0, // KATAKANA LETTER DA - 0xC759: 0x30C1, // KATAKANA LETTER TI - 0xC75A: 0x30C2, // KATAKANA LETTER DI - 0xC75B: 0x30C3, // KATAKANA LETTER SMALL TU - 0xC75C: 0x30C4, // KATAKANA LETTER TU - 0xC75D: 0x30C5, // KATAKANA LETTER DU - 0xC75E: 0x30C6, // KATAKANA LETTER TE - 0xC75F: 0x30C7, // KATAKANA LETTER DE - 0xC760: 0x30C8, // KATAKANA LETTER TO - 0xC761: 0x30C9, // KATAKANA LETTER DO - 0xC762: 0x30CA, // KATAKANA LETTER NA - 0xC763: 0x30CB, // KATAKANA LETTER NI - 0xC764: 0x30CC, // KATAKANA LETTER NU - 0xC765: 0x30CD, // KATAKANA LETTER NE - 0xC766: 0x30CE, // KATAKANA LETTER NO - 0xC767: 0x30CF, // KATAKANA LETTER HA - 0xC768: 0x30D0, // KATAKANA LETTER BA - 0xC769: 0x30D1, // KATAKANA LETTER PA - 0xC76A: 0x30D2, // KATAKANA LETTER HI - 0xC76B: 0x30D3, // KATAKANA LETTER BI - 0xC76C: 0x30D4, // KATAKANA LETTER PI - 0xC76D: 0x30D5, // KATAKANA LETTER HU - 0xC76E: 0x30D6, // KATAKANA LETTER BU - 0xC76F: 0x30D7, // KATAKANA LETTER PU - 0xC770: 0x30D8, // KATAKANA LETTER HE - 0xC771: 0x30D9, // KATAKANA LETTER BE - 0xC772: 0x30DA, // KATAKANA LETTER PE - 0xC773: 0x30DB, // KATAKANA LETTER HO - 0xC774: 0x30DC, // KATAKANA LETTER BO - 0xC775: 0x30DD, // KATAKANA LETTER PO - 0xC776: 0x30DE, // KATAKANA LETTER MA - 0xC777: 0x30DF, // KATAKANA LETTER MI - 0xC778: 0x30E0, // KATAKANA LETTER MU - 0xC779: 0x30E1, // KATAKANA LETTER ME - 0xC77A: 0x30E2, // KATAKANA LETTER MO - 0xC77B: 0x30E3, // KATAKANA LETTER SMALL YA - 0xC77C: 0x30E4, // KATAKANA LETTER YA - 0xC77D: 0x30E5, // KATAKANA LETTER SMALL YU - 0xC77E: 0x30E6, // KATAKANA LETTER YU - 0xC7A1: 0x30E7, // KATAKANA LETTER SMALL YO - 0xC7A2: 0x30E8, // KATAKANA LETTER YO - 0xC7A3: 0x30E9, // KATAKANA LETTER RA - 0xC7A4: 0x30EA, // KATAKANA LETTER RI - 0xC7A5: 0x30EB, // KATAKANA LETTER RU - 0xC7A6: 0x30EC, // KATAKANA LETTER RE - 0xC7A7: 0x30ED, // KATAKANA LETTER RO - 0xC7A8: 0x30EE, // KATAKANA LETTER SMALL WA - 0xC7A9: 0x30EF, // KATAKANA LETTER WA - 0xC7AA: 0x30F0, // KATAKANA LETTER WI - 0xC7AB: 0x30F1, // KATAKANA LETTER WE - 0xC7AC: 0x30F2, // KATAKANA LETTER WO - 0xC7AD: 0x30F3, // KATAKANA LETTER N - 0xC7AE: 0x30F4, // KATAKANA LETTER VU - 0xC7AF: 0x30F5, // KATAKANA LETTER SMALL KA - 0xC7B0: 0x30F6, // KATAKANA LETTER SMALL KE - 0xC7B1: 0x0414, // CYRILLIC CAPITAL LETTER DE - 0xC7B2: 0x0415, // CYRILLIC CAPITAL LETTER IE - 0xC7B3: 0x0401, // CYRILLIC CAPITAL LETTER IO - 0xC7B4: 0x0416, // CYRILLIC CAPITAL LETTER ZHE - 0xC7B5: 0x0417, // CYRILLIC CAPITAL LETTER ZE - 0xC7B6: 0x0418, // CYRILLIC CAPITAL LETTER I - 0xC7B7: 0x0419, // CYRILLIC CAPITAL LETTER SHORT I - 0xC7B8: 0x041A, // CYRILLIC CAPITAL LETTER KA - 0xC7B9: 0x041B, // CYRILLIC CAPITAL LETTER EL - 0xC7BA: 0x041C, // CYRILLIC CAPITAL LETTER EM - 0xC7BB: 0x0423, // CYRILLIC CAPITAL LETTER U - 0xC7BC: 0x0424, // CYRILLIC CAPITAL LETTER EF - 0xC7BD: 0x0425, // CYRILLIC CAPITAL LETTER HA - 0xC7BE: 0x0426, // CYRILLIC CAPITAL LETTER TSE - 0xC7BF: 0x0427, // CYRILLIC CAPITAL LETTER CHE - 0xC7C0: 0x0428, // CYRILLIC CAPITAL LETTER SHA - 0xC7C1: 0x0429, // CYRILLIC CAPITAL LETTER SHCHA - 0xC7C2: 0x042A, // CYRILLIC CAPITAL LETTER HARD SIGN - 0xC7C3: 0x042B, // CYRILLIC CAPITAL LETTER YERU - 0xC7C4: 0x042C, // CYRILLIC CAPITAL LETTER SOFT SIGN - 0xC7C5: 0x042D, // CYRILLIC CAPITAL LETTER E - 0xC7C6: 0x042E, // CYRILLIC CAPITAL LETTER YU - 0xC7C7: 0x042F, // CYRILLIC CAPITAL LETTER YA - 0xC7C8: 0x0430, // CYRILLIC SMALL LETTER A - 0xC7C9: 0x0431, // CYRILLIC SMALL LETTER BE - 0xC7CA: 0x0432, // CYRILLIC SMALL LETTER VE - 0xC7CB: 0x0433, // CYRILLIC SMALL LETTER GHE - 0xC7CC: 0x0434, // CYRILLIC SMALL LETTER DE - 0xC7CD: 0x0435, // CYRILLIC SMALL LETTER IE - 0xC7CE: 0x0451, // CYRILLIC SMALL LETTER IO - 0xC7CF: 0x0436, // CYRILLIC SMALL LETTER ZHE - 0xC7D0: 0x0437, // CYRILLIC SMALL LETTER ZE - 0xC7D1: 0x0438, // CYRILLIC SMALL LETTER I - 0xC7D2: 0x0439, // CYRILLIC SMALL LETTER SHORT I - 0xC7D3: 0x043A, // CYRILLIC SMALL LETTER KA - 0xC7D4: 0x043B, // CYRILLIC SMALL LETTER EL - 0xC7D5: 0x043C, // CYRILLIC SMALL LETTER EM - 0xC7D6: 0x043D, // CYRILLIC SMALL LETTER EN - 0xC7D7: 0x043E, // CYRILLIC SMALL LETTER O - 0xC7D8: 0x043F, // CYRILLIC SMALL LETTER PE - 0xC7D9: 0x0440, // CYRILLIC SMALL LETTER ER - 0xC7DA: 0x0441, // CYRILLIC SMALL LETTER ES - 0xC7DB: 0x0442, // CYRILLIC SMALL LETTER TE - 0xC7DC: 0x0443, // CYRILLIC SMALL LETTER U - 0xC7DD: 0x0444, // CYRILLIC SMALL LETTER EF - 0xC7DE: 0x0445, // CYRILLIC SMALL LETTER HA - 0xC7DF: 0x0446, // CYRILLIC SMALL LETTER TSE - 0xC7E0: 0x0447, // CYRILLIC SMALL LETTER CHE - 0xC7E1: 0x0448, // CYRILLIC SMALL LETTER SHA - 0xC7E2: 0x0449, // CYRILLIC SMALL LETTER SHCHA - 0xC7E3: 0x044A, // CYRILLIC SMALL LETTER HARD SIGN - 0xC7E4: 0x044B, // CYRILLIC SMALL LETTER YERU - 0xC7E5: 0x044C, // CYRILLIC SMALL LETTER SOFT SIGN - 0xC7E6: 0x044D, // CYRILLIC SMALL LETTER E - 0xC7E7: 0x044E, // CYRILLIC SMALL LETTER YU - 0xC7E8: 0x044F, // CYRILLIC SMALL LETTER YA - 0xC7E9: 0x2460, // CIRCLED DIGIT ONE - 0xC7EA: 0x2461, // CIRCLED DIGIT TWO - 0xC7EB: 0x2462, // CIRCLED DIGIT THREE - 0xC7EC: 0x2463, // CIRCLED DIGIT FOUR - 0xC7ED: 0x2464, // CIRCLED DIGIT FIVE - 0xC7EE: 0x2465, // CIRCLED DIGIT SIX - 0xC7EF: 0x2466, // CIRCLED DIGIT SEVEN - 0xC7F0: 0x2467, // CIRCLED DIGIT EIGHT - 0xC7F1: 0x2468, // CIRCLED DIGIT NINE - 0xC7F2: 0x2469, // CIRCLED NUMBER TEN - 0xC7F3: 0x2474, // PARENTHESIZED DIGIT ONE - 0xC7F4: 0x2475, // PARENTHESIZED DIGIT TWO - 0xC7F5: 0x2476, // PARENTHESIZED DIGIT THREE - 0xC7F6: 0x2477, // PARENTHESIZED DIGIT FOUR - 0xC7F7: 0x2478, // PARENTHESIZED DIGIT FIVE - 0xC7F8: 0x2479, // PARENTHESIZED DIGIT SIX - 0xC7F9: 0x247A, // PARENTHESIZED DIGIT SEVEN - 0xC7FA: 0x247B, // PARENTHESIZED DIGIT EIGHT - 0xC7FB: 0x247C, // PARENTHESIZED DIGIT NINE - 0xC7FC: 0x247D, // PARENTHESIZED NUMBER TEN - 0xC940: 0x4E42, - 0xC941: 0x4E5C, - 0xC942: 0x51F5, - 0xC943: 0x531A, - 0xC944: 0x5382, - 0xC945: 0x4E07, - 0xC946: 0x4E0C, - 0xC947: 0x4E47, - 0xC948: 0x4E8D, - 0xC949: 0x56D7, - 0xC94A: 0xFA0C, // CJK COMPATIBILITY IDEOGRAPH-FA0C - 0xC94B: 0x5C6E, - 0xC94C: 0x5F73, - 0xC94D: 0x4E0F, - 0xC94E: 0x5187, - 0xC94F: 0x4E0E, - 0xC950: 0x4E2E, - 0xC951: 0x4E93, - 0xC952: 0x4EC2, - 0xC953: 0x4EC9, - 0xC954: 0x4EC8, - 0xC955: 0x5198, - 0xC956: 0x52FC, - 0xC957: 0x536C, - 0xC958: 0x53B9, - 0xC959: 0x5720, - 0xC95A: 0x5903, - 0xC95B: 0x592C, - 0xC95C: 0x5C10, - 0xC95D: 0x5DFF, - 0xC95E: 0x65E1, - 0xC95F: 0x6BB3, - 0xC960: 0x6BCC, - 0xC961: 0x6C14, - 0xC962: 0x723F, - 0xC963: 0x4E31, - 0xC964: 0x4E3C, - 0xC965: 0x4EE8, - 0xC966: 0x4EDC, - 0xC967: 0x4EE9, - 0xC968: 0x4EE1, - 0xC969: 0x4EDD, - 0xC96A: 0x4EDA, - 0xC96B: 0x520C, - 0xC96C: 0x531C, - 0xC96D: 0x534C, - 0xC96E: 0x5722, - 0xC96F: 0x5723, - 0xC970: 0x5917, - 0xC971: 0x592F, - 0xC972: 0x5B81, - 0xC973: 0x5B84, - 0xC974: 0x5C12, - 0xC975: 0x5C3B, - 0xC976: 0x5C74, - 0xC977: 0x5C73, - 0xC978: 0x5E04, - 0xC979: 0x5E80, - 0xC97A: 0x5E82, - 0xC97B: 0x5FC9, - 0xC97C: 0x6209, - 0xC97D: 0x6250, - 0xC97E: 0x6C15, - 0xC9A1: 0x6C36, - 0xC9A2: 0x6C43, - 0xC9A3: 0x6C3F, - 0xC9A4: 0x6C3B, - 0xC9A5: 0x72AE, - 0xC9A6: 0x72B0, - 0xC9A7: 0x738A, - 0xC9A8: 0x79B8, - 0xC9A9: 0x808A, - 0xC9AA: 0x961E, - 0xC9AB: 0x4F0E, - 0xC9AC: 0x4F18, - 0xC9AD: 0x4F2C, - 0xC9AE: 0x4EF5, - 0xC9AF: 0x4F14, - 0xC9B0: 0x4EF1, - 0xC9B1: 0x4F00, - 0xC9B2: 0x4EF7, - 0xC9B3: 0x4F08, - 0xC9B4: 0x4F1D, - 0xC9B5: 0x4F02, - 0xC9B6: 0x4F05, - 0xC9B7: 0x4F22, - 0xC9B8: 0x4F13, - 0xC9B9: 0x4F04, - 0xC9BA: 0x4EF4, - 0xC9BB: 0x4F12, - 0xC9BC: 0x51B1, - 0xC9BD: 0x5213, - 0xC9BE: 0x5209, - 0xC9BF: 0x5210, - 0xC9C0: 0x52A6, - 0xC9C1: 0x5322, - 0xC9C2: 0x531F, - 0xC9C3: 0x534D, - 0xC9C4: 0x538A, - 0xC9C5: 0x5407, - 0xC9C6: 0x56E1, - 0xC9C7: 0x56DF, - 0xC9C8: 0x572E, - 0xC9C9: 0x572A, - 0xC9CA: 0x5734, - 0xC9CB: 0x593C, - 0xC9CC: 0x5980, - 0xC9CD: 0x597C, - 0xC9CE: 0x5985, - 0xC9CF: 0x597B, - 0xC9D0: 0x597E, - 0xC9D1: 0x5977, - 0xC9D2: 0x597F, - 0xC9D3: 0x5B56, - 0xC9D4: 0x5C15, - 0xC9D5: 0x5C25, - 0xC9D6: 0x5C7C, - 0xC9D7: 0x5C7A, - 0xC9D8: 0x5C7B, - 0xC9D9: 0x5C7E, - 0xC9DA: 0x5DDF, - 0xC9DB: 0x5E75, - 0xC9DC: 0x5E84, - 0xC9DD: 0x5F02, - 0xC9DE: 0x5F1A, - 0xC9DF: 0x5F74, - 0xC9E0: 0x5FD5, - 0xC9E1: 0x5FD4, - 0xC9E2: 0x5FCF, - 0xC9E3: 0x625C, - 0xC9E4: 0x625E, - 0xC9E5: 0x6264, - 0xC9E6: 0x6261, - 0xC9E7: 0x6266, - 0xC9E8: 0x6262, - 0xC9E9: 0x6259, - 0xC9EA: 0x6260, - 0xC9EB: 0x625A, - 0xC9EC: 0x6265, - 0xC9ED: 0x65EF, - 0xC9EE: 0x65EE, - 0xC9EF: 0x673E, - 0xC9F0: 0x6739, - 0xC9F1: 0x6738, - 0xC9F2: 0x673B, - 0xC9F3: 0x673A, - 0xC9F4: 0x673F, - 0xC9F5: 0x673C, - 0xC9F6: 0x6733, - 0xC9F7: 0x6C18, - 0xC9F8: 0x6C46, - 0xC9F9: 0x6C52, - 0xC9FA: 0x6C5C, - 0xC9FB: 0x6C4F, - 0xC9FC: 0x6C4A, - 0xC9FD: 0x6C54, - 0xC9FE: 0x6C4B, - 0xCA40: 0x6C4C, - 0xCA41: 0x7071, - 0xCA42: 0x725E, - 0xCA43: 0x72B4, - 0xCA44: 0x72B5, - 0xCA45: 0x738E, - 0xCA46: 0x752A, - 0xCA47: 0x767F, - 0xCA48: 0x7A75, - 0xCA49: 0x7F51, - 0xCA4A: 0x8278, - 0xCA4B: 0x827C, - 0xCA4C: 0x8280, - 0xCA4D: 0x827D, - 0xCA4E: 0x827F, - 0xCA4F: 0x864D, - 0xCA50: 0x897E, - 0xCA51: 0x9099, - 0xCA52: 0x9097, - 0xCA53: 0x9098, - 0xCA54: 0x909B, - 0xCA55: 0x9094, - 0xCA56: 0x9622, - 0xCA57: 0x9624, - 0xCA58: 0x9620, - 0xCA59: 0x9623, - 0xCA5A: 0x4F56, - 0xCA5B: 0x4F3B, - 0xCA5C: 0x4F62, - 0xCA5D: 0x4F49, - 0xCA5E: 0x4F53, - 0xCA5F: 0x4F64, - 0xCA60: 0x4F3E, - 0xCA61: 0x4F67, - 0xCA62: 0x4F52, - 0xCA63: 0x4F5F, - 0xCA64: 0x4F41, - 0xCA65: 0x4F58, - 0xCA66: 0x4F2D, - 0xCA67: 0x4F33, - 0xCA68: 0x4F3F, - 0xCA69: 0x4F61, - 0xCA6A: 0x518F, - 0xCA6B: 0x51B9, - 0xCA6C: 0x521C, - 0xCA6D: 0x521E, - 0xCA6E: 0x5221, - 0xCA6F: 0x52AD, - 0xCA70: 0x52AE, - 0xCA71: 0x5309, - 0xCA72: 0x5363, - 0xCA73: 0x5372, - 0xCA74: 0x538E, - 0xCA75: 0x538F, - 0xCA76: 0x5430, - 0xCA77: 0x5437, - 0xCA78: 0x542A, - 0xCA79: 0x5454, - 0xCA7A: 0x5445, - 0xCA7B: 0x5419, - 0xCA7C: 0x541C, - 0xCA7D: 0x5425, - 0xCA7E: 0x5418, - 0xCAA1: 0x543D, - 0xCAA2: 0x544F, - 0xCAA3: 0x5441, - 0xCAA4: 0x5428, - 0xCAA5: 0x5424, - 0xCAA6: 0x5447, - 0xCAA7: 0x56EE, - 0xCAA8: 0x56E7, - 0xCAA9: 0x56E5, - 0xCAAA: 0x5741, - 0xCAAB: 0x5745, - 0xCAAC: 0x574C, - 0xCAAD: 0x5749, - 0xCAAE: 0x574B, - 0xCAAF: 0x5752, - 0xCAB0: 0x5906, - 0xCAB1: 0x5940, - 0xCAB2: 0x59A6, - 0xCAB3: 0x5998, - 0xCAB4: 0x59A0, - 0xCAB5: 0x5997, - 0xCAB6: 0x598E, - 0xCAB7: 0x59A2, - 0xCAB8: 0x5990, - 0xCAB9: 0x598F, - 0xCABA: 0x59A7, - 0xCABB: 0x59A1, - 0xCABC: 0x5B8E, - 0xCABD: 0x5B92, - 0xCABE: 0x5C28, - 0xCABF: 0x5C2A, - 0xCAC0: 0x5C8D, - 0xCAC1: 0x5C8F, - 0xCAC2: 0x5C88, - 0xCAC3: 0x5C8B, - 0xCAC4: 0x5C89, - 0xCAC5: 0x5C92, - 0xCAC6: 0x5C8A, - 0xCAC7: 0x5C86, - 0xCAC8: 0x5C93, - 0xCAC9: 0x5C95, - 0xCACA: 0x5DE0, - 0xCACB: 0x5E0A, - 0xCACC: 0x5E0E, - 0xCACD: 0x5E8B, - 0xCACE: 0x5E89, - 0xCACF: 0x5E8C, - 0xCAD0: 0x5E88, - 0xCAD1: 0x5E8D, - 0xCAD2: 0x5F05, - 0xCAD3: 0x5F1D, - 0xCAD4: 0x5F78, - 0xCAD5: 0x5F76, - 0xCAD6: 0x5FD2, - 0xCAD7: 0x5FD1, - 0xCAD8: 0x5FD0, - 0xCAD9: 0x5FED, - 0xCADA: 0x5FE8, - 0xCADB: 0x5FEE, - 0xCADC: 0x5FF3, - 0xCADD: 0x5FE1, - 0xCADE: 0x5FE4, - 0xCADF: 0x5FE3, - 0xCAE0: 0x5FFA, - 0xCAE1: 0x5FEF, - 0xCAE2: 0x5FF7, - 0xCAE3: 0x5FFB, - 0xCAE4: 0x6000, - 0xCAE5: 0x5FF4, - 0xCAE6: 0x623A, - 0xCAE7: 0x6283, - 0xCAE8: 0x628C, - 0xCAE9: 0x628E, - 0xCAEA: 0x628F, - 0xCAEB: 0x6294, - 0xCAEC: 0x6287, - 0xCAED: 0x6271, - 0xCAEE: 0x627B, - 0xCAEF: 0x627A, - 0xCAF0: 0x6270, - 0xCAF1: 0x6281, - 0xCAF2: 0x6288, - 0xCAF3: 0x6277, - 0xCAF4: 0x627D, - 0xCAF5: 0x6272, - 0xCAF6: 0x6274, - 0xCAF7: 0x6537, - 0xCAF8: 0x65F0, - 0xCAF9: 0x65F4, - 0xCAFA: 0x65F3, - 0xCAFB: 0x65F2, - 0xCAFC: 0x65F5, - 0xCAFD: 0x6745, - 0xCAFE: 0x6747, - 0xCB40: 0x6759, - 0xCB41: 0x6755, - 0xCB42: 0x674C, - 0xCB43: 0x6748, - 0xCB44: 0x675D, - 0xCB45: 0x674D, - 0xCB46: 0x675A, - 0xCB47: 0x674B, - 0xCB48: 0x6BD0, - 0xCB49: 0x6C19, - 0xCB4A: 0x6C1A, - 0xCB4B: 0x6C78, - 0xCB4C: 0x6C67, - 0xCB4D: 0x6C6B, - 0xCB4E: 0x6C84, - 0xCB4F: 0x6C8B, - 0xCB50: 0x6C8F, - 0xCB51: 0x6C71, - 0xCB52: 0x6C6F, - 0xCB53: 0x6C69, - 0xCB54: 0x6C9A, - 0xCB55: 0x6C6D, - 0xCB56: 0x6C87, - 0xCB57: 0x6C95, - 0xCB58: 0x6C9C, - 0xCB59: 0x6C66, - 0xCB5A: 0x6C73, - 0xCB5B: 0x6C65, - 0xCB5C: 0x6C7B, - 0xCB5D: 0x6C8E, - 0xCB5E: 0x7074, - 0xCB5F: 0x707A, - 0xCB60: 0x7263, - 0xCB61: 0x72BF, - 0xCB62: 0x72BD, - 0xCB63: 0x72C3, - 0xCB64: 0x72C6, - 0xCB65: 0x72C1, - 0xCB66: 0x72BA, - 0xCB67: 0x72C5, - 0xCB68: 0x7395, - 0xCB69: 0x7397, - 0xCB6A: 0x7393, - 0xCB6B: 0x7394, - 0xCB6C: 0x7392, - 0xCB6D: 0x753A, - 0xCB6E: 0x7539, - 0xCB6F: 0x7594, - 0xCB70: 0x7595, - 0xCB71: 0x7681, - 0xCB72: 0x793D, - 0xCB73: 0x8034, - 0xCB74: 0x8095, - 0xCB75: 0x8099, - 0xCB76: 0x8090, - 0xCB77: 0x8092, - 0xCB78: 0x809C, - 0xCB79: 0x8290, - 0xCB7A: 0x828F, - 0xCB7B: 0x8285, - 0xCB7C: 0x828E, - 0xCB7D: 0x8291, - 0xCB7E: 0x8293, - 0xCBA1: 0x828A, - 0xCBA2: 0x8283, - 0xCBA3: 0x8284, - 0xCBA4: 0x8C78, - 0xCBA5: 0x8FC9, - 0xCBA6: 0x8FBF, - 0xCBA7: 0x909F, - 0xCBA8: 0x90A1, - 0xCBA9: 0x90A5, - 0xCBAA: 0x909E, - 0xCBAB: 0x90A7, - 0xCBAC: 0x90A0, - 0xCBAD: 0x9630, - 0xCBAE: 0x9628, - 0xCBAF: 0x962F, - 0xCBB0: 0x962D, - 0xCBB1: 0x4E33, - 0xCBB2: 0x4F98, - 0xCBB3: 0x4F7C, - 0xCBB4: 0x4F85, - 0xCBB5: 0x4F7D, - 0xCBB6: 0x4F80, - 0xCBB7: 0x4F87, - 0xCBB8: 0x4F76, - 0xCBB9: 0x4F74, - 0xCBBA: 0x4F89, - 0xCBBB: 0x4F84, - 0xCBBC: 0x4F77, - 0xCBBD: 0x4F4C, - 0xCBBE: 0x4F97, - 0xCBBF: 0x4F6A, - 0xCBC0: 0x4F9A, - 0xCBC1: 0x4F79, - 0xCBC2: 0x4F81, - 0xCBC3: 0x4F78, - 0xCBC4: 0x4F90, - 0xCBC5: 0x4F9C, - 0xCBC6: 0x4F94, - 0xCBC7: 0x4F9E, - 0xCBC8: 0x4F92, - 0xCBC9: 0x4F82, - 0xCBCA: 0x4F95, - 0xCBCB: 0x4F6B, - 0xCBCC: 0x4F6E, - 0xCBCD: 0x519E, - 0xCBCE: 0x51BC, - 0xCBCF: 0x51BE, - 0xCBD0: 0x5235, - 0xCBD1: 0x5232, - 0xCBD2: 0x5233, - 0xCBD3: 0x5246, - 0xCBD4: 0x5231, - 0xCBD5: 0x52BC, - 0xCBD6: 0x530A, - 0xCBD7: 0x530B, - 0xCBD8: 0x533C, - 0xCBD9: 0x5392, - 0xCBDA: 0x5394, - 0xCBDB: 0x5487, - 0xCBDC: 0x547F, - 0xCBDD: 0x5481, - 0xCBDE: 0x5491, - 0xCBDF: 0x5482, - 0xCBE0: 0x5488, - 0xCBE1: 0x546B, - 0xCBE2: 0x547A, - 0xCBE3: 0x547E, - 0xCBE4: 0x5465, - 0xCBE5: 0x546C, - 0xCBE6: 0x5474, - 0xCBE7: 0x5466, - 0xCBE8: 0x548D, - 0xCBE9: 0x546F, - 0xCBEA: 0x5461, - 0xCBEB: 0x5460, - 0xCBEC: 0x5498, - 0xCBED: 0x5463, - 0xCBEE: 0x5467, - 0xCBEF: 0x5464, - 0xCBF0: 0x56F7, - 0xCBF1: 0x56F9, - 0xCBF2: 0x576F, - 0xCBF3: 0x5772, - 0xCBF4: 0x576D, - 0xCBF5: 0x576B, - 0xCBF6: 0x5771, - 0xCBF7: 0x5770, - 0xCBF8: 0x5776, - 0xCBF9: 0x5780, - 0xCBFA: 0x5775, - 0xCBFB: 0x577B, - 0xCBFC: 0x5773, - 0xCBFD: 0x5774, - 0xCBFE: 0x5762, - 0xCC40: 0x5768, - 0xCC41: 0x577D, - 0xCC42: 0x590C, - 0xCC43: 0x5945, - 0xCC44: 0x59B5, - 0xCC45: 0x59BA, - 0xCC46: 0x59CF, - 0xCC47: 0x59CE, - 0xCC48: 0x59B2, - 0xCC49: 0x59CC, - 0xCC4A: 0x59C1, - 0xCC4B: 0x59B6, - 0xCC4C: 0x59BC, - 0xCC4D: 0x59C3, - 0xCC4E: 0x59D6, - 0xCC4F: 0x59B1, - 0xCC50: 0x59BD, - 0xCC51: 0x59C0, - 0xCC52: 0x59C8, - 0xCC53: 0x59B4, - 0xCC54: 0x59C7, - 0xCC55: 0x5B62, - 0xCC56: 0x5B65, - 0xCC57: 0x5B93, - 0xCC58: 0x5B95, - 0xCC59: 0x5C44, - 0xCC5A: 0x5C47, - 0xCC5B: 0x5CAE, - 0xCC5C: 0x5CA4, - 0xCC5D: 0x5CA0, - 0xCC5E: 0x5CB5, - 0xCC5F: 0x5CAF, - 0xCC60: 0x5CA8, - 0xCC61: 0x5CAC, - 0xCC62: 0x5C9F, - 0xCC63: 0x5CA3, - 0xCC64: 0x5CAD, - 0xCC65: 0x5CA2, - 0xCC66: 0x5CAA, - 0xCC67: 0x5CA7, - 0xCC68: 0x5C9D, - 0xCC69: 0x5CA5, - 0xCC6A: 0x5CB6, - 0xCC6B: 0x5CB0, - 0xCC6C: 0x5CA6, - 0xCC6D: 0x5E17, - 0xCC6E: 0x5E14, - 0xCC6F: 0x5E19, - 0xCC70: 0x5F28, - 0xCC71: 0x5F22, - 0xCC72: 0x5F23, - 0xCC73: 0x5F24, - 0xCC74: 0x5F54, - 0xCC75: 0x5F82, - 0xCC76: 0x5F7E, - 0xCC77: 0x5F7D, - 0xCC78: 0x5FDE, - 0xCC79: 0x5FE5, - 0xCC7A: 0x602D, - 0xCC7B: 0x6026, - 0xCC7C: 0x6019, - 0xCC7D: 0x6032, - 0xCC7E: 0x600B, - 0xCCA1: 0x6034, - 0xCCA2: 0x600A, - 0xCCA3: 0x6017, - 0xCCA4: 0x6033, - 0xCCA5: 0x601A, - 0xCCA6: 0x601E, - 0xCCA7: 0x602C, - 0xCCA8: 0x6022, - 0xCCA9: 0x600D, - 0xCCAA: 0x6010, - 0xCCAB: 0x602E, - 0xCCAC: 0x6013, - 0xCCAD: 0x6011, - 0xCCAE: 0x600C, - 0xCCAF: 0x6009, - 0xCCB0: 0x601C, - 0xCCB1: 0x6214, - 0xCCB2: 0x623D, - 0xCCB3: 0x62AD, - 0xCCB4: 0x62B4, - 0xCCB5: 0x62D1, - 0xCCB6: 0x62BE, - 0xCCB7: 0x62AA, - 0xCCB8: 0x62B6, - 0xCCB9: 0x62CA, - 0xCCBA: 0x62AE, - 0xCCBB: 0x62B3, - 0xCCBC: 0x62AF, - 0xCCBD: 0x62BB, - 0xCCBE: 0x62A9, - 0xCCBF: 0x62B0, - 0xCCC0: 0x62B8, - 0xCCC1: 0x653D, - 0xCCC2: 0x65A8, - 0xCCC3: 0x65BB, - 0xCCC4: 0x6609, - 0xCCC5: 0x65FC, - 0xCCC6: 0x6604, - 0xCCC7: 0x6612, - 0xCCC8: 0x6608, - 0xCCC9: 0x65FB, - 0xCCCA: 0x6603, - 0xCCCB: 0x660B, - 0xCCCC: 0x660D, - 0xCCCD: 0x6605, - 0xCCCE: 0x65FD, - 0xCCCF: 0x6611, - 0xCCD0: 0x6610, - 0xCCD1: 0x66F6, - 0xCCD2: 0x670A, - 0xCCD3: 0x6785, - 0xCCD4: 0x676C, - 0xCCD5: 0x678E, - 0xCCD6: 0x6792, - 0xCCD7: 0x6776, - 0xCCD8: 0x677B, - 0xCCD9: 0x6798, - 0xCCDA: 0x6786, - 0xCCDB: 0x6784, - 0xCCDC: 0x6774, - 0xCCDD: 0x678D, - 0xCCDE: 0x678C, - 0xCCDF: 0x677A, - 0xCCE0: 0x679F, - 0xCCE1: 0x6791, - 0xCCE2: 0x6799, - 0xCCE3: 0x6783, - 0xCCE4: 0x677D, - 0xCCE5: 0x6781, - 0xCCE6: 0x6778, - 0xCCE7: 0x6779, - 0xCCE8: 0x6794, - 0xCCE9: 0x6B25, - 0xCCEA: 0x6B80, - 0xCCEB: 0x6B7E, - 0xCCEC: 0x6BDE, - 0xCCED: 0x6C1D, - 0xCCEE: 0x6C93, - 0xCCEF: 0x6CEC, - 0xCCF0: 0x6CEB, - 0xCCF1: 0x6CEE, - 0xCCF2: 0x6CD9, - 0xCCF3: 0x6CB6, - 0xCCF4: 0x6CD4, - 0xCCF5: 0x6CAD, - 0xCCF6: 0x6CE7, - 0xCCF7: 0x6CB7, - 0xCCF8: 0x6CD0, - 0xCCF9: 0x6CC2, - 0xCCFA: 0x6CBA, - 0xCCFB: 0x6CC3, - 0xCCFC: 0x6CC6, - 0xCCFD: 0x6CED, - 0xCCFE: 0x6CF2, - 0xCD40: 0x6CD2, - 0xCD41: 0x6CDD, - 0xCD42: 0x6CB4, - 0xCD43: 0x6C8A, - 0xCD44: 0x6C9D, - 0xCD45: 0x6C80, - 0xCD46: 0x6CDE, - 0xCD47: 0x6CC0, - 0xCD48: 0x6D30, - 0xCD49: 0x6CCD, - 0xCD4A: 0x6CC7, - 0xCD4B: 0x6CB0, - 0xCD4C: 0x6CF9, - 0xCD4D: 0x6CCF, - 0xCD4E: 0x6CE9, - 0xCD4F: 0x6CD1, - 0xCD50: 0x7094, - 0xCD51: 0x7098, - 0xCD52: 0x7085, - 0xCD53: 0x7093, - 0xCD54: 0x7086, - 0xCD55: 0x7084, - 0xCD56: 0x7091, - 0xCD57: 0x7096, - 0xCD58: 0x7082, - 0xCD59: 0x709A, - 0xCD5A: 0x7083, - 0xCD5B: 0x726A, - 0xCD5C: 0x72D6, - 0xCD5D: 0x72CB, - 0xCD5E: 0x72D8, - 0xCD5F: 0x72C9, - 0xCD60: 0x72DC, - 0xCD61: 0x72D2, - 0xCD62: 0x72D4, - 0xCD63: 0x72DA, - 0xCD64: 0x72CC, - 0xCD65: 0x72D1, - 0xCD66: 0x73A4, - 0xCD67: 0x73A1, - 0xCD68: 0x73AD, - 0xCD69: 0x73A6, - 0xCD6A: 0x73A2, - 0xCD6B: 0x73A0, - 0xCD6C: 0x73AC, - 0xCD6D: 0x739D, - 0xCD6E: 0x74DD, - 0xCD6F: 0x74E8, - 0xCD70: 0x753F, - 0xCD71: 0x7540, - 0xCD72: 0x753E, - 0xCD73: 0x758C, - 0xCD74: 0x7598, - 0xCD75: 0x76AF, - 0xCD76: 0x76F3, - 0xCD77: 0x76F1, - 0xCD78: 0x76F0, - 0xCD79: 0x76F5, - 0xCD7A: 0x77F8, - 0xCD7B: 0x77FC, - 0xCD7C: 0x77F9, - 0xCD7D: 0x77FB, - 0xCD7E: 0x77FA, - 0xCDA1: 0x77F7, - 0xCDA2: 0x7942, - 0xCDA3: 0x793F, - 0xCDA4: 0x79C5, - 0xCDA5: 0x7A78, - 0xCDA6: 0x7A7B, - 0xCDA7: 0x7AFB, - 0xCDA8: 0x7C75, - 0xCDA9: 0x7CFD, - 0xCDAA: 0x8035, - 0xCDAB: 0x808F, - 0xCDAC: 0x80AE, - 0xCDAD: 0x80A3, - 0xCDAE: 0x80B8, - 0xCDAF: 0x80B5, - 0xCDB0: 0x80AD, - 0xCDB1: 0x8220, - 0xCDB2: 0x82A0, - 0xCDB3: 0x82C0, - 0xCDB4: 0x82AB, - 0xCDB5: 0x829A, - 0xCDB6: 0x8298, - 0xCDB7: 0x829B, - 0xCDB8: 0x82B5, - 0xCDB9: 0x82A7, - 0xCDBA: 0x82AE, - 0xCDBB: 0x82BC, - 0xCDBC: 0x829E, - 0xCDBD: 0x82BA, - 0xCDBE: 0x82B4, - 0xCDBF: 0x82A8, - 0xCDC0: 0x82A1, - 0xCDC1: 0x82A9, - 0xCDC2: 0x82C2, - 0xCDC3: 0x82A4, - 0xCDC4: 0x82C3, - 0xCDC5: 0x82B6, - 0xCDC6: 0x82A2, - 0xCDC7: 0x8670, - 0xCDC8: 0x866F, - 0xCDC9: 0x866D, - 0xCDCA: 0x866E, - 0xCDCB: 0x8C56, - 0xCDCC: 0x8FD2, - 0xCDCD: 0x8FCB, - 0xCDCE: 0x8FD3, - 0xCDCF: 0x8FCD, - 0xCDD0: 0x8FD6, - 0xCDD1: 0x8FD5, - 0xCDD2: 0x8FD7, - 0xCDD3: 0x90B2, - 0xCDD4: 0x90B4, - 0xCDD5: 0x90AF, - 0xCDD6: 0x90B3, - 0xCDD7: 0x90B0, - 0xCDD8: 0x9639, - 0xCDD9: 0x963D, - 0xCDDA: 0x963C, - 0xCDDB: 0x963A, - 0xCDDC: 0x9643, - 0xCDDD: 0x4FCD, - 0xCDDE: 0x4FC5, - 0xCDDF: 0x4FD3, - 0xCDE0: 0x4FB2, - 0xCDE1: 0x4FC9, - 0xCDE2: 0x4FCB, - 0xCDE3: 0x4FC1, - 0xCDE4: 0x4FD4, - 0xCDE5: 0x4FDC, - 0xCDE6: 0x4FD9, - 0xCDE7: 0x4FBB, - 0xCDE8: 0x4FB3, - 0xCDE9: 0x4FDB, - 0xCDEA: 0x4FC7, - 0xCDEB: 0x4FD6, - 0xCDEC: 0x4FBA, - 0xCDED: 0x4FC0, - 0xCDEE: 0x4FB9, - 0xCDEF: 0x4FEC, - 0xCDF0: 0x5244, - 0xCDF1: 0x5249, - 0xCDF2: 0x52C0, - 0xCDF3: 0x52C2, - 0xCDF4: 0x533D, - 0xCDF5: 0x537C, - 0xCDF6: 0x5397, - 0xCDF7: 0x5396, - 0xCDF8: 0x5399, - 0xCDF9: 0x5398, - 0xCDFA: 0x54BA, - 0xCDFB: 0x54A1, - 0xCDFC: 0x54AD, - 0xCDFD: 0x54A5, - 0xCDFE: 0x54CF, - 0xCE40: 0x54C3, - 0xCE41: 0x830D, - 0xCE42: 0x54B7, - 0xCE43: 0x54AE, - 0xCE44: 0x54D6, - 0xCE45: 0x54B6, - 0xCE46: 0x54C5, - 0xCE47: 0x54C6, - 0xCE48: 0x54A0, - 0xCE49: 0x5470, - 0xCE4A: 0x54BC, - 0xCE4B: 0x54A2, - 0xCE4C: 0x54BE, - 0xCE4D: 0x5472, - 0xCE4E: 0x54DE, - 0xCE4F: 0x54B0, - 0xCE50: 0x57B5, - 0xCE51: 0x579E, - 0xCE52: 0x579F, - 0xCE53: 0x57A4, - 0xCE54: 0x578C, - 0xCE55: 0x5797, - 0xCE56: 0x579D, - 0xCE57: 0x579B, - 0xCE58: 0x5794, - 0xCE59: 0x5798, - 0xCE5A: 0x578F, - 0xCE5B: 0x5799, - 0xCE5C: 0x57A5, - 0xCE5D: 0x579A, - 0xCE5E: 0x5795, - 0xCE5F: 0x58F4, - 0xCE60: 0x590D, - 0xCE61: 0x5953, - 0xCE62: 0x59E1, - 0xCE63: 0x59DE, - 0xCE64: 0x59EE, - 0xCE65: 0x5A00, - 0xCE66: 0x59F1, - 0xCE67: 0x59DD, - 0xCE68: 0x59FA, - 0xCE69: 0x59FD, - 0xCE6A: 0x59FC, - 0xCE6B: 0x59F6, - 0xCE6C: 0x59E4, - 0xCE6D: 0x59F2, - 0xCE6E: 0x59F7, - 0xCE6F: 0x59DB, - 0xCE70: 0x59E9, - 0xCE71: 0x59F3, - 0xCE72: 0x59F5, - 0xCE73: 0x59E0, - 0xCE74: 0x59FE, - 0xCE75: 0x59F4, - 0xCE76: 0x59ED, - 0xCE77: 0x5BA8, - 0xCE78: 0x5C4C, - 0xCE79: 0x5CD0, - 0xCE7A: 0x5CD8, - 0xCE7B: 0x5CCC, - 0xCE7C: 0x5CD7, - 0xCE7D: 0x5CCB, - 0xCE7E: 0x5CDB, - 0xCEA1: 0x5CDE, - 0xCEA2: 0x5CDA, - 0xCEA3: 0x5CC9, - 0xCEA4: 0x5CC7, - 0xCEA5: 0x5CCA, - 0xCEA6: 0x5CD6, - 0xCEA7: 0x5CD3, - 0xCEA8: 0x5CD4, - 0xCEA9: 0x5CCF, - 0xCEAA: 0x5CC8, - 0xCEAB: 0x5CC6, - 0xCEAC: 0x5CCE, - 0xCEAD: 0x5CDF, - 0xCEAE: 0x5CF8, - 0xCEAF: 0x5DF9, - 0xCEB0: 0x5E21, - 0xCEB1: 0x5E22, - 0xCEB2: 0x5E23, - 0xCEB3: 0x5E20, - 0xCEB4: 0x5E24, - 0xCEB5: 0x5EB0, - 0xCEB6: 0x5EA4, - 0xCEB7: 0x5EA2, - 0xCEB8: 0x5E9B, - 0xCEB9: 0x5EA3, - 0xCEBA: 0x5EA5, - 0xCEBB: 0x5F07, - 0xCEBC: 0x5F2E, - 0xCEBD: 0x5F56, - 0xCEBE: 0x5F86, - 0xCEBF: 0x6037, - 0xCEC0: 0x6039, - 0xCEC1: 0x6054, - 0xCEC2: 0x6072, - 0xCEC3: 0x605E, - 0xCEC4: 0x6045, - 0xCEC5: 0x6053, - 0xCEC6: 0x6047, - 0xCEC7: 0x6049, - 0xCEC8: 0x605B, - 0xCEC9: 0x604C, - 0xCECA: 0x6040, - 0xCECB: 0x6042, - 0xCECC: 0x605F, - 0xCECD: 0x6024, - 0xCECE: 0x6044, - 0xCECF: 0x6058, - 0xCED0: 0x6066, - 0xCED1: 0x606E, - 0xCED2: 0x6242, - 0xCED3: 0x6243, - 0xCED4: 0x62CF, - 0xCED5: 0x630D, - 0xCED6: 0x630B, - 0xCED7: 0x62F5, - 0xCED8: 0x630E, - 0xCED9: 0x6303, - 0xCEDA: 0x62EB, - 0xCEDB: 0x62F9, - 0xCEDC: 0x630F, - 0xCEDD: 0x630C, - 0xCEDE: 0x62F8, - 0xCEDF: 0x62F6, - 0xCEE0: 0x6300, - 0xCEE1: 0x6313, - 0xCEE2: 0x6314, - 0xCEE3: 0x62FA, - 0xCEE4: 0x6315, - 0xCEE5: 0x62FB, - 0xCEE6: 0x62F0, - 0xCEE7: 0x6541, - 0xCEE8: 0x6543, - 0xCEE9: 0x65AA, - 0xCEEA: 0x65BF, - 0xCEEB: 0x6636, - 0xCEEC: 0x6621, - 0xCEED: 0x6632, - 0xCEEE: 0x6635, - 0xCEEF: 0x661C, - 0xCEF0: 0x6626, - 0xCEF1: 0x6622, - 0xCEF2: 0x6633, - 0xCEF3: 0x662B, - 0xCEF4: 0x663A, - 0xCEF5: 0x661D, - 0xCEF6: 0x6634, - 0xCEF7: 0x6639, - 0xCEF8: 0x662E, - 0xCEF9: 0x670F, - 0xCEFA: 0x6710, - 0xCEFB: 0x67C1, - 0xCEFC: 0x67F2, - 0xCEFD: 0x67C8, - 0xCEFE: 0x67BA, - 0xCF40: 0x67DC, - 0xCF41: 0x67BB, - 0xCF42: 0x67F8, - 0xCF43: 0x67D8, - 0xCF44: 0x67C0, - 0xCF45: 0x67B7, - 0xCF46: 0x67C5, - 0xCF47: 0x67EB, - 0xCF48: 0x67E4, - 0xCF49: 0x67DF, - 0xCF4A: 0x67B5, - 0xCF4B: 0x67CD, - 0xCF4C: 0x67B3, - 0xCF4D: 0x67F7, - 0xCF4E: 0x67F6, - 0xCF4F: 0x67EE, - 0xCF50: 0x67E3, - 0xCF51: 0x67C2, - 0xCF52: 0x67B9, - 0xCF53: 0x67CE, - 0xCF54: 0x67E7, - 0xCF55: 0x67F0, - 0xCF56: 0x67B2, - 0xCF57: 0x67FC, - 0xCF58: 0x67C6, - 0xCF59: 0x67ED, - 0xCF5A: 0x67CC, - 0xCF5B: 0x67AE, - 0xCF5C: 0x67E6, - 0xCF5D: 0x67DB, - 0xCF5E: 0x67FA, - 0xCF5F: 0x67C9, - 0xCF60: 0x67CA, - 0xCF61: 0x67C3, - 0xCF62: 0x67EA, - 0xCF63: 0x67CB, - 0xCF64: 0x6B28, - 0xCF65: 0x6B82, - 0xCF66: 0x6B84, - 0xCF67: 0x6BB6, - 0xCF68: 0x6BD6, - 0xCF69: 0x6BD8, - 0xCF6A: 0x6BE0, - 0xCF6B: 0x6C20, - 0xCF6C: 0x6C21, - 0xCF6D: 0x6D28, - 0xCF6E: 0x6D34, - 0xCF6F: 0x6D2D, - 0xCF70: 0x6D1F, - 0xCF71: 0x6D3C, - 0xCF72: 0x6D3F, - 0xCF73: 0x6D12, - 0xCF74: 0x6D0A, - 0xCF75: 0x6CDA, - 0xCF76: 0x6D33, - 0xCF77: 0x6D04, - 0xCF78: 0x6D19, - 0xCF79: 0x6D3A, - 0xCF7A: 0x6D1A, - 0xCF7B: 0x6D11, - 0xCF7C: 0x6D00, - 0xCF7D: 0x6D1D, - 0xCF7E: 0x6D42, - 0xCFA1: 0x6D01, - 0xCFA2: 0x6D18, - 0xCFA3: 0x6D37, - 0xCFA4: 0x6D03, - 0xCFA5: 0x6D0F, - 0xCFA6: 0x6D40, - 0xCFA7: 0x6D07, - 0xCFA8: 0x6D20, - 0xCFA9: 0x6D2C, - 0xCFAA: 0x6D08, - 0xCFAB: 0x6D22, - 0xCFAC: 0x6D09, - 0xCFAD: 0x6D10, - 0xCFAE: 0x70B7, - 0xCFAF: 0x709F, - 0xCFB0: 0x70BE, - 0xCFB1: 0x70B1, - 0xCFB2: 0x70B0, - 0xCFB3: 0x70A1, - 0xCFB4: 0x70B4, - 0xCFB5: 0x70B5, - 0xCFB6: 0x70A9, - 0xCFB7: 0x7241, - 0xCFB8: 0x7249, - 0xCFB9: 0x724A, - 0xCFBA: 0x726C, - 0xCFBB: 0x7270, - 0xCFBC: 0x7273, - 0xCFBD: 0x726E, - 0xCFBE: 0x72CA, - 0xCFBF: 0x72E4, - 0xCFC0: 0x72E8, - 0xCFC1: 0x72EB, - 0xCFC2: 0x72DF, - 0xCFC3: 0x72EA, - 0xCFC4: 0x72E6, - 0xCFC5: 0x72E3, - 0xCFC6: 0x7385, - 0xCFC7: 0x73CC, - 0xCFC8: 0x73C2, - 0xCFC9: 0x73C8, - 0xCFCA: 0x73C5, - 0xCFCB: 0x73B9, - 0xCFCC: 0x73B6, - 0xCFCD: 0x73B5, - 0xCFCE: 0x73B4, - 0xCFCF: 0x73EB, - 0xCFD0: 0x73BF, - 0xCFD1: 0x73C7, - 0xCFD2: 0x73BE, - 0xCFD3: 0x73C3, - 0xCFD4: 0x73C6, - 0xCFD5: 0x73B8, - 0xCFD6: 0x73CB, - 0xCFD7: 0x74EC, - 0xCFD8: 0x74EE, - 0xCFD9: 0x752E, - 0xCFDA: 0x7547, - 0xCFDB: 0x7548, - 0xCFDC: 0x75A7, - 0xCFDD: 0x75AA, - 0xCFDE: 0x7679, - 0xCFDF: 0x76C4, - 0xCFE0: 0x7708, - 0xCFE1: 0x7703, - 0xCFE2: 0x7704, - 0xCFE3: 0x7705, - 0xCFE4: 0x770A, - 0xCFE5: 0x76F7, - 0xCFE6: 0x76FB, - 0xCFE7: 0x76FA, - 0xCFE8: 0x77E7, - 0xCFE9: 0x77E8, - 0xCFEA: 0x7806, - 0xCFEB: 0x7811, - 0xCFEC: 0x7812, - 0xCFED: 0x7805, - 0xCFEE: 0x7810, - 0xCFEF: 0x780F, - 0xCFF0: 0x780E, - 0xCFF1: 0x7809, - 0xCFF2: 0x7803, - 0xCFF3: 0x7813, - 0xCFF4: 0x794A, - 0xCFF5: 0x794C, - 0xCFF6: 0x794B, - 0xCFF7: 0x7945, - 0xCFF8: 0x7944, - 0xCFF9: 0x79D5, - 0xCFFA: 0x79CD, - 0xCFFB: 0x79CF, - 0xCFFC: 0x79D6, - 0xCFFD: 0x79CE, - 0xCFFE: 0x7A80, - 0xD040: 0x7A7E, - 0xD041: 0x7AD1, - 0xD042: 0x7B00, - 0xD043: 0x7B01, - 0xD044: 0x7C7A, - 0xD045: 0x7C78, - 0xD046: 0x7C79, - 0xD047: 0x7C7F, - 0xD048: 0x7C80, - 0xD049: 0x7C81, - 0xD04A: 0x7D03, - 0xD04B: 0x7D08, - 0xD04C: 0x7D01, - 0xD04D: 0x7F58, - 0xD04E: 0x7F91, - 0xD04F: 0x7F8D, - 0xD050: 0x7FBE, - 0xD051: 0x8007, - 0xD052: 0x800E, - 0xD053: 0x800F, - 0xD054: 0x8014, - 0xD055: 0x8037, - 0xD056: 0x80D8, - 0xD057: 0x80C7, - 0xD058: 0x80E0, - 0xD059: 0x80D1, - 0xD05A: 0x80C8, - 0xD05B: 0x80C2, - 0xD05C: 0x80D0, - 0xD05D: 0x80C5, - 0xD05E: 0x80E3, - 0xD05F: 0x80D9, - 0xD060: 0x80DC, - 0xD061: 0x80CA, - 0xD062: 0x80D5, - 0xD063: 0x80C9, - 0xD064: 0x80CF, - 0xD065: 0x80D7, - 0xD066: 0x80E6, - 0xD067: 0x80CD, - 0xD068: 0x81FF, - 0xD069: 0x8221, - 0xD06A: 0x8294, - 0xD06B: 0x82D9, - 0xD06C: 0x82FE, - 0xD06D: 0x82F9, - 0xD06E: 0x8307, - 0xD06F: 0x82E8, - 0xD070: 0x8300, - 0xD071: 0x82D5, - 0xD072: 0x833A, - 0xD073: 0x82EB, - 0xD074: 0x82D6, - 0xD075: 0x82F4, - 0xD076: 0x82EC, - 0xD077: 0x82E1, - 0xD078: 0x82F2, - 0xD079: 0x82F5, - 0xD07A: 0x830C, - 0xD07B: 0x82FB, - 0xD07C: 0x82F6, - 0xD07D: 0x82F0, - 0xD07E: 0x82EA, - 0xD0A1: 0x82E4, - 0xD0A2: 0x82E0, - 0xD0A3: 0x82FA, - 0xD0A4: 0x82F3, - 0xD0A5: 0x82ED, - 0xD0A6: 0x8677, - 0xD0A7: 0x8674, - 0xD0A8: 0x867C, - 0xD0A9: 0x8673, - 0xD0AA: 0x8841, - 0xD0AB: 0x884E, - 0xD0AC: 0x8867, - 0xD0AD: 0x886A, - 0xD0AE: 0x8869, - 0xD0AF: 0x89D3, - 0xD0B0: 0x8A04, - 0xD0B1: 0x8A07, - 0xD0B2: 0x8D72, - 0xD0B3: 0x8FE3, - 0xD0B4: 0x8FE1, - 0xD0B5: 0x8FEE, - 0xD0B6: 0x8FE0, - 0xD0B7: 0x90F1, - 0xD0B8: 0x90BD, - 0xD0B9: 0x90BF, - 0xD0BA: 0x90D5, - 0xD0BB: 0x90C5, - 0xD0BC: 0x90BE, - 0xD0BD: 0x90C7, - 0xD0BE: 0x90CB, - 0xD0BF: 0x90C8, - 0xD0C0: 0x91D4, - 0xD0C1: 0x91D3, - 0xD0C2: 0x9654, - 0xD0C3: 0x964F, - 0xD0C4: 0x9651, - 0xD0C5: 0x9653, - 0xD0C6: 0x964A, - 0xD0C7: 0x964E, - 0xD0C8: 0x501E, - 0xD0C9: 0x5005, - 0xD0CA: 0x5007, - 0xD0CB: 0x5013, - 0xD0CC: 0x5022, - 0xD0CD: 0x5030, - 0xD0CE: 0x501B, - 0xD0CF: 0x4FF5, - 0xD0D0: 0x4FF4, - 0xD0D1: 0x5033, - 0xD0D2: 0x5037, - 0xD0D3: 0x502C, - 0xD0D4: 0x4FF6, - 0xD0D5: 0x4FF7, - 0xD0D6: 0x5017, - 0xD0D7: 0x501C, - 0xD0D8: 0x5020, - 0xD0D9: 0x5027, - 0xD0DA: 0x5035, - 0xD0DB: 0x502F, - 0xD0DC: 0x5031, - 0xD0DD: 0x500E, - 0xD0DE: 0x515A, - 0xD0DF: 0x5194, - 0xD0E0: 0x5193, - 0xD0E1: 0x51CA, - 0xD0E2: 0x51C4, - 0xD0E3: 0x51C5, - 0xD0E4: 0x51C8, - 0xD0E5: 0x51CE, - 0xD0E6: 0x5261, - 0xD0E7: 0x525A, - 0xD0E8: 0x5252, - 0xD0E9: 0x525E, - 0xD0EA: 0x525F, - 0xD0EB: 0x5255, - 0xD0EC: 0x5262, - 0xD0ED: 0x52CD, - 0xD0EE: 0x530E, - 0xD0EF: 0x539E, - 0xD0F0: 0x5526, - 0xD0F1: 0x54E2, - 0xD0F2: 0x5517, - 0xD0F3: 0x5512, - 0xD0F4: 0x54E7, - 0xD0F5: 0x54F3, - 0xD0F6: 0x54E4, - 0xD0F7: 0x551A, - 0xD0F8: 0x54FF, - 0xD0F9: 0x5504, - 0xD0FA: 0x5508, - 0xD0FB: 0x54EB, - 0xD0FC: 0x5511, - 0xD0FD: 0x5505, - 0xD0FE: 0x54F1, - 0xD140: 0x550A, - 0xD141: 0x54FB, - 0xD142: 0x54F7, - 0xD143: 0x54F8, - 0xD144: 0x54E0, - 0xD145: 0x550E, - 0xD146: 0x5503, - 0xD147: 0x550B, - 0xD148: 0x5701, - 0xD149: 0x5702, - 0xD14A: 0x57CC, - 0xD14B: 0x5832, - 0xD14C: 0x57D5, - 0xD14D: 0x57D2, - 0xD14E: 0x57BA, - 0xD14F: 0x57C6, - 0xD150: 0x57BD, - 0xD151: 0x57BC, - 0xD152: 0x57B8, - 0xD153: 0x57B6, - 0xD154: 0x57BF, - 0xD155: 0x57C7, - 0xD156: 0x57D0, - 0xD157: 0x57B9, - 0xD158: 0x57C1, - 0xD159: 0x590E, - 0xD15A: 0x594A, - 0xD15B: 0x5A19, - 0xD15C: 0x5A16, - 0xD15D: 0x5A2D, - 0xD15E: 0x5A2E, - 0xD15F: 0x5A15, - 0xD160: 0x5A0F, - 0xD161: 0x5A17, - 0xD162: 0x5A0A, - 0xD163: 0x5A1E, - 0xD164: 0x5A33, - 0xD165: 0x5B6C, - 0xD166: 0x5BA7, - 0xD167: 0x5BAD, - 0xD168: 0x5BAC, - 0xD169: 0x5C03, - 0xD16A: 0x5C56, - 0xD16B: 0x5C54, - 0xD16C: 0x5CEC, - 0xD16D: 0x5CFF, - 0xD16E: 0x5CEE, - 0xD16F: 0x5CF1, - 0xD170: 0x5CF7, - 0xD171: 0x5D00, - 0xD172: 0x5CF9, - 0xD173: 0x5E29, - 0xD174: 0x5E28, - 0xD175: 0x5EA8, - 0xD176: 0x5EAE, - 0xD177: 0x5EAA, - 0xD178: 0x5EAC, - 0xD179: 0x5F33, - 0xD17A: 0x5F30, - 0xD17B: 0x5F67, - 0xD17C: 0x605D, - 0xD17D: 0x605A, - 0xD17E: 0x6067, - 0xD1A1: 0x6041, - 0xD1A2: 0x60A2, - 0xD1A3: 0x6088, - 0xD1A4: 0x6080, - 0xD1A5: 0x6092, - 0xD1A6: 0x6081, - 0xD1A7: 0x609D, - 0xD1A8: 0x6083, - 0xD1A9: 0x6095, - 0xD1AA: 0x609B, - 0xD1AB: 0x6097, - 0xD1AC: 0x6087, - 0xD1AD: 0x609C, - 0xD1AE: 0x608E, - 0xD1AF: 0x6219, - 0xD1B0: 0x6246, - 0xD1B1: 0x62F2, - 0xD1B2: 0x6310, - 0xD1B3: 0x6356, - 0xD1B4: 0x632C, - 0xD1B5: 0x6344, - 0xD1B6: 0x6345, - 0xD1B7: 0x6336, - 0xD1B8: 0x6343, - 0xD1B9: 0x63E4, - 0xD1BA: 0x6339, - 0xD1BB: 0x634B, - 0xD1BC: 0x634A, - 0xD1BD: 0x633C, - 0xD1BE: 0x6329, - 0xD1BF: 0x6341, - 0xD1C0: 0x6334, - 0xD1C1: 0x6358, - 0xD1C2: 0x6354, - 0xD1C3: 0x6359, - 0xD1C4: 0x632D, - 0xD1C5: 0x6347, - 0xD1C6: 0x6333, - 0xD1C7: 0x635A, - 0xD1C8: 0x6351, - 0xD1C9: 0x6338, - 0xD1CA: 0x6357, - 0xD1CB: 0x6340, - 0xD1CC: 0x6348, - 0xD1CD: 0x654A, - 0xD1CE: 0x6546, - 0xD1CF: 0x65C6, - 0xD1D0: 0x65C3, - 0xD1D1: 0x65C4, - 0xD1D2: 0x65C2, - 0xD1D3: 0x664A, - 0xD1D4: 0x665F, - 0xD1D5: 0x6647, - 0xD1D6: 0x6651, - 0xD1D7: 0x6712, - 0xD1D8: 0x6713, - 0xD1D9: 0x681F, - 0xD1DA: 0x681A, - 0xD1DB: 0x6849, - 0xD1DC: 0x6832, - 0xD1DD: 0x6833, - 0xD1DE: 0x683B, - 0xD1DF: 0x684B, - 0xD1E0: 0x684F, - 0xD1E1: 0x6816, - 0xD1E2: 0x6831, - 0xD1E3: 0x681C, - 0xD1E4: 0x6835, - 0xD1E5: 0x682B, - 0xD1E6: 0x682D, - 0xD1E7: 0x682F, - 0xD1E8: 0x684E, - 0xD1E9: 0x6844, - 0xD1EA: 0x6834, - 0xD1EB: 0x681D, - 0xD1EC: 0x6812, - 0xD1ED: 0x6814, - 0xD1EE: 0x6826, - 0xD1EF: 0x6828, - 0xD1F0: 0x682E, - 0xD1F1: 0x684D, - 0xD1F2: 0x683A, - 0xD1F3: 0x6825, - 0xD1F4: 0x6820, - 0xD1F5: 0x6B2C, - 0xD1F6: 0x6B2F, - 0xD1F7: 0x6B2D, - 0xD1F8: 0x6B31, - 0xD1F9: 0x6B34, - 0xD1FA: 0x6B6D, - 0xD1FB: 0x8082, - 0xD1FC: 0x6B88, - 0xD1FD: 0x6BE6, - 0xD1FE: 0x6BE4, - 0xD240: 0x6BE8, - 0xD241: 0x6BE3, - 0xD242: 0x6BE2, - 0xD243: 0x6BE7, - 0xD244: 0x6C25, - 0xD245: 0x6D7A, - 0xD246: 0x6D63, - 0xD247: 0x6D64, - 0xD248: 0x6D76, - 0xD249: 0x6D0D, - 0xD24A: 0x6D61, - 0xD24B: 0x6D92, - 0xD24C: 0x6D58, - 0xD24D: 0x6D62, - 0xD24E: 0x6D6D, - 0xD24F: 0x6D6F, - 0xD250: 0x6D91, - 0xD251: 0x6D8D, - 0xD252: 0x6DEF, - 0xD253: 0x6D7F, - 0xD254: 0x6D86, - 0xD255: 0x6D5E, - 0xD256: 0x6D67, - 0xD257: 0x6D60, - 0xD258: 0x6D97, - 0xD259: 0x6D70, - 0xD25A: 0x6D7C, - 0xD25B: 0x6D5F, - 0xD25C: 0x6D82, - 0xD25D: 0x6D98, - 0xD25E: 0x6D2F, - 0xD25F: 0x6D68, - 0xD260: 0x6D8B, - 0xD261: 0x6D7E, - 0xD262: 0x6D80, - 0xD263: 0x6D84, - 0xD264: 0x6D16, - 0xD265: 0x6D83, - 0xD266: 0x6D7B, - 0xD267: 0x6D7D, - 0xD268: 0x6D75, - 0xD269: 0x6D90, - 0xD26A: 0x70DC, - 0xD26B: 0x70D3, - 0xD26C: 0x70D1, - 0xD26D: 0x70DD, - 0xD26E: 0x70CB, - 0xD26F: 0x7F39, - 0xD270: 0x70E2, - 0xD271: 0x70D7, - 0xD272: 0x70D2, - 0xD273: 0x70DE, - 0xD274: 0x70E0, - 0xD275: 0x70D4, - 0xD276: 0x70CD, - 0xD277: 0x70C5, - 0xD278: 0x70C6, - 0xD279: 0x70C7, - 0xD27A: 0x70DA, - 0xD27B: 0x70CE, - 0xD27C: 0x70E1, - 0xD27D: 0x7242, - 0xD27E: 0x7278, - 0xD2A1: 0x7277, - 0xD2A2: 0x7276, - 0xD2A3: 0x7300, - 0xD2A4: 0x72FA, - 0xD2A5: 0x72F4, - 0xD2A6: 0x72FE, - 0xD2A7: 0x72F6, - 0xD2A8: 0x72F3, - 0xD2A9: 0x72FB, - 0xD2AA: 0x7301, - 0xD2AB: 0x73D3, - 0xD2AC: 0x73D9, - 0xD2AD: 0x73E5, - 0xD2AE: 0x73D6, - 0xD2AF: 0x73BC, - 0xD2B0: 0x73E7, - 0xD2B1: 0x73E3, - 0xD2B2: 0x73E9, - 0xD2B3: 0x73DC, - 0xD2B4: 0x73D2, - 0xD2B5: 0x73DB, - 0xD2B6: 0x73D4, - 0xD2B7: 0x73DD, - 0xD2B8: 0x73DA, - 0xD2B9: 0x73D7, - 0xD2BA: 0x73D8, - 0xD2BB: 0x73E8, - 0xD2BC: 0x74DE, - 0xD2BD: 0x74DF, - 0xD2BE: 0x74F4, - 0xD2BF: 0x74F5, - 0xD2C0: 0x7521, - 0xD2C1: 0x755B, - 0xD2C2: 0x755F, - 0xD2C3: 0x75B0, - 0xD2C4: 0x75C1, - 0xD2C5: 0x75BB, - 0xD2C6: 0x75C4, - 0xD2C7: 0x75C0, - 0xD2C8: 0x75BF, - 0xD2C9: 0x75B6, - 0xD2CA: 0x75BA, - 0xD2CB: 0x768A, - 0xD2CC: 0x76C9, - 0xD2CD: 0x771D, - 0xD2CE: 0x771B, - 0xD2CF: 0x7710, - 0xD2D0: 0x7713, - 0xD2D1: 0x7712, - 0xD2D2: 0x7723, - 0xD2D3: 0x7711, - 0xD2D4: 0x7715, - 0xD2D5: 0x7719, - 0xD2D6: 0x771A, - 0xD2D7: 0x7722, - 0xD2D8: 0x7727, - 0xD2D9: 0x7823, - 0xD2DA: 0x782C, - 0xD2DB: 0x7822, - 0xD2DC: 0x7835, - 0xD2DD: 0x782F, - 0xD2DE: 0x7828, - 0xD2DF: 0x782E, - 0xD2E0: 0x782B, - 0xD2E1: 0x7821, - 0xD2E2: 0x7829, - 0xD2E3: 0x7833, - 0xD2E4: 0x782A, - 0xD2E5: 0x7831, - 0xD2E6: 0x7954, - 0xD2E7: 0x795B, - 0xD2E8: 0x794F, - 0xD2E9: 0x795C, - 0xD2EA: 0x7953, - 0xD2EB: 0x7952, - 0xD2EC: 0x7951, - 0xD2ED: 0x79EB, - 0xD2EE: 0x79EC, - 0xD2EF: 0x79E0, - 0xD2F0: 0x79EE, - 0xD2F1: 0x79ED, - 0xD2F2: 0x79EA, - 0xD2F3: 0x79DC, - 0xD2F4: 0x79DE, - 0xD2F5: 0x79DD, - 0xD2F6: 0x7A86, - 0xD2F7: 0x7A89, - 0xD2F8: 0x7A85, - 0xD2F9: 0x7A8B, - 0xD2FA: 0x7A8C, - 0xD2FB: 0x7A8A, - 0xD2FC: 0x7A87, - 0xD2FD: 0x7AD8, - 0xD2FE: 0x7B10, - 0xD340: 0x7B04, - 0xD341: 0x7B13, - 0xD342: 0x7B05, - 0xD343: 0x7B0F, - 0xD344: 0x7B08, - 0xD345: 0x7B0A, - 0xD346: 0x7B0E, - 0xD347: 0x7B09, - 0xD348: 0x7B12, - 0xD349: 0x7C84, - 0xD34A: 0x7C91, - 0xD34B: 0x7C8A, - 0xD34C: 0x7C8C, - 0xD34D: 0x7C88, - 0xD34E: 0x7C8D, - 0xD34F: 0x7C85, - 0xD350: 0x7D1E, - 0xD351: 0x7D1D, - 0xD352: 0x7D11, - 0xD353: 0x7D0E, - 0xD354: 0x7D18, - 0xD355: 0x7D16, - 0xD356: 0x7D13, - 0xD357: 0x7D1F, - 0xD358: 0x7D12, - 0xD359: 0x7D0F, - 0xD35A: 0x7D0C, - 0xD35B: 0x7F5C, - 0xD35C: 0x7F61, - 0xD35D: 0x7F5E, - 0xD35E: 0x7F60, - 0xD35F: 0x7F5D, - 0xD360: 0x7F5B, - 0xD361: 0x7F96, - 0xD362: 0x7F92, - 0xD363: 0x7FC3, - 0xD364: 0x7FC2, - 0xD365: 0x7FC0, - 0xD366: 0x8016, - 0xD367: 0x803E, - 0xD368: 0x8039, - 0xD369: 0x80FA, - 0xD36A: 0x80F2, - 0xD36B: 0x80F9, - 0xD36C: 0x80F5, - 0xD36D: 0x8101, - 0xD36E: 0x80FB, - 0xD36F: 0x8100, - 0xD370: 0x8201, - 0xD371: 0x822F, - 0xD372: 0x8225, - 0xD373: 0x8333, - 0xD374: 0x832D, - 0xD375: 0x8344, - 0xD376: 0x8319, - 0xD377: 0x8351, - 0xD378: 0x8325, - 0xD379: 0x8356, - 0xD37A: 0x833F, - 0xD37B: 0x8341, - 0xD37C: 0x8326, - 0xD37D: 0x831C, - 0xD37E: 0x8322, - 0xD3A1: 0x8342, - 0xD3A2: 0x834E, - 0xD3A3: 0x831B, - 0xD3A4: 0x832A, - 0xD3A5: 0x8308, - 0xD3A6: 0x833C, - 0xD3A7: 0x834D, - 0xD3A8: 0x8316, - 0xD3A9: 0x8324, - 0xD3AA: 0x8320, - 0xD3AB: 0x8337, - 0xD3AC: 0x832F, - 0xD3AD: 0x8329, - 0xD3AE: 0x8347, - 0xD3AF: 0x8345, - 0xD3B0: 0x834C, - 0xD3B1: 0x8353, - 0xD3B2: 0x831E, - 0xD3B3: 0x832C, - 0xD3B4: 0x834B, - 0xD3B5: 0x8327, - 0xD3B6: 0x8348, - 0xD3B7: 0x8653, - 0xD3B8: 0x8652, - 0xD3B9: 0x86A2, - 0xD3BA: 0x86A8, - 0xD3BB: 0x8696, - 0xD3BC: 0x868D, - 0xD3BD: 0x8691, - 0xD3BE: 0x869E, - 0xD3BF: 0x8687, - 0xD3C0: 0x8697, - 0xD3C1: 0x8686, - 0xD3C2: 0x868B, - 0xD3C3: 0x869A, - 0xD3C4: 0x8685, - 0xD3C5: 0x86A5, - 0xD3C6: 0x8699, - 0xD3C7: 0x86A1, - 0xD3C8: 0x86A7, - 0xD3C9: 0x8695, - 0xD3CA: 0x8698, - 0xD3CB: 0x868E, - 0xD3CC: 0x869D, - 0xD3CD: 0x8690, - 0xD3CE: 0x8694, - 0xD3CF: 0x8843, - 0xD3D0: 0x8844, - 0xD3D1: 0x886D, - 0xD3D2: 0x8875, - 0xD3D3: 0x8876, - 0xD3D4: 0x8872, - 0xD3D5: 0x8880, - 0xD3D6: 0x8871, - 0xD3D7: 0x887F, - 0xD3D8: 0x886F, - 0xD3D9: 0x8883, - 0xD3DA: 0x887E, - 0xD3DB: 0x8874, - 0xD3DC: 0x887C, - 0xD3DD: 0x8A12, - 0xD3DE: 0x8C47, - 0xD3DF: 0x8C57, - 0xD3E0: 0x8C7B, - 0xD3E1: 0x8CA4, - 0xD3E2: 0x8CA3, - 0xD3E3: 0x8D76, - 0xD3E4: 0x8D78, - 0xD3E5: 0x8DB5, - 0xD3E6: 0x8DB7, - 0xD3E7: 0x8DB6, - 0xD3E8: 0x8ED1, - 0xD3E9: 0x8ED3, - 0xD3EA: 0x8FFE, - 0xD3EB: 0x8FF5, - 0xD3EC: 0x9002, - 0xD3ED: 0x8FFF, - 0xD3EE: 0x8FFB, - 0xD3EF: 0x9004, - 0xD3F0: 0x8FFC, - 0xD3F1: 0x8FF6, - 0xD3F2: 0x90D6, - 0xD3F3: 0x90E0, - 0xD3F4: 0x90D9, - 0xD3F5: 0x90DA, - 0xD3F6: 0x90E3, - 0xD3F7: 0x90DF, - 0xD3F8: 0x90E5, - 0xD3F9: 0x90D8, - 0xD3FA: 0x90DB, - 0xD3FB: 0x90D7, - 0xD3FC: 0x90DC, - 0xD3FD: 0x90E4, - 0xD3FE: 0x9150, - 0xD440: 0x914E, - 0xD441: 0x914F, - 0xD442: 0x91D5, - 0xD443: 0x91E2, - 0xD444: 0x91DA, - 0xD445: 0x965C, - 0xD446: 0x965F, - 0xD447: 0x96BC, - 0xD448: 0x98E3, - 0xD449: 0x9ADF, - 0xD44A: 0x9B2F, - 0xD44B: 0x4E7F, - 0xD44C: 0x5070, - 0xD44D: 0x506A, - 0xD44E: 0x5061, - 0xD44F: 0x505E, - 0xD450: 0x5060, - 0xD451: 0x5053, - 0xD452: 0x504B, - 0xD453: 0x505D, - 0xD454: 0x5072, - 0xD455: 0x5048, - 0xD456: 0x504D, - 0xD457: 0x5041, - 0xD458: 0x505B, - 0xD459: 0x504A, - 0xD45A: 0x5062, - 0xD45B: 0x5015, - 0xD45C: 0x5045, - 0xD45D: 0x505F, - 0xD45E: 0x5069, - 0xD45F: 0x506B, - 0xD460: 0x5063, - 0xD461: 0x5064, - 0xD462: 0x5046, - 0xD463: 0x5040, - 0xD464: 0x506E, - 0xD465: 0x5073, - 0xD466: 0x5057, - 0xD467: 0x5051, - 0xD468: 0x51D0, - 0xD469: 0x526B, - 0xD46A: 0x526D, - 0xD46B: 0x526C, - 0xD46C: 0x526E, - 0xD46D: 0x52D6, - 0xD46E: 0x52D3, - 0xD46F: 0x532D, - 0xD470: 0x539C, - 0xD471: 0x5575, - 0xD472: 0x5576, - 0xD473: 0x553C, - 0xD474: 0x554D, - 0xD475: 0x5550, - 0xD476: 0x5534, - 0xD477: 0x552A, - 0xD478: 0x5551, - 0xD479: 0x5562, - 0xD47A: 0x5536, - 0xD47B: 0x5535, - 0xD47C: 0x5530, - 0xD47D: 0x5552, - 0xD47E: 0x5545, - 0xD4A1: 0x550C, - 0xD4A2: 0x5532, - 0xD4A3: 0x5565, - 0xD4A4: 0x554E, - 0xD4A5: 0x5539, - 0xD4A6: 0x5548, - 0xD4A7: 0x552D, - 0xD4A8: 0x553B, - 0xD4A9: 0x5540, - 0xD4AA: 0x554B, - 0xD4AB: 0x570A, - 0xD4AC: 0x5707, - 0xD4AD: 0x57FB, - 0xD4AE: 0x5814, - 0xD4AF: 0x57E2, - 0xD4B0: 0x57F6, - 0xD4B1: 0x57DC, - 0xD4B2: 0x57F4, - 0xD4B3: 0x5800, - 0xD4B4: 0x57ED, - 0xD4B5: 0x57FD, - 0xD4B6: 0x5808, - 0xD4B7: 0x57F8, - 0xD4B8: 0x580B, - 0xD4B9: 0x57F3, - 0xD4BA: 0x57CF, - 0xD4BB: 0x5807, - 0xD4BC: 0x57EE, - 0xD4BD: 0x57E3, - 0xD4BE: 0x57F2, - 0xD4BF: 0x57E5, - 0xD4C0: 0x57EC, - 0xD4C1: 0x57E1, - 0xD4C2: 0x580E, - 0xD4C3: 0x57FC, - 0xD4C4: 0x5810, - 0xD4C5: 0x57E7, - 0xD4C6: 0x5801, - 0xD4C7: 0x580C, - 0xD4C8: 0x57F1, - 0xD4C9: 0x57E9, - 0xD4CA: 0x57F0, - 0xD4CB: 0x580D, - 0xD4CC: 0x5804, - 0xD4CD: 0x595C, - 0xD4CE: 0x5A60, - 0xD4CF: 0x5A58, - 0xD4D0: 0x5A55, - 0xD4D1: 0x5A67, - 0xD4D2: 0x5A5E, - 0xD4D3: 0x5A38, - 0xD4D4: 0x5A35, - 0xD4D5: 0x5A6D, - 0xD4D6: 0x5A50, - 0xD4D7: 0x5A5F, - 0xD4D8: 0x5A65, - 0xD4D9: 0x5A6C, - 0xD4DA: 0x5A53, - 0xD4DB: 0x5A64, - 0xD4DC: 0x5A57, - 0xD4DD: 0x5A43, - 0xD4DE: 0x5A5D, - 0xD4DF: 0x5A52, - 0xD4E0: 0x5A44, - 0xD4E1: 0x5A5B, - 0xD4E2: 0x5A48, - 0xD4E3: 0x5A8E, - 0xD4E4: 0x5A3E, - 0xD4E5: 0x5A4D, - 0xD4E6: 0x5A39, - 0xD4E7: 0x5A4C, - 0xD4E8: 0x5A70, - 0xD4E9: 0x5A69, - 0xD4EA: 0x5A47, - 0xD4EB: 0x5A51, - 0xD4EC: 0x5A56, - 0xD4ED: 0x5A42, - 0xD4EE: 0x5A5C, - 0xD4EF: 0x5B72, - 0xD4F0: 0x5B6E, - 0xD4F1: 0x5BC1, - 0xD4F2: 0x5BC0, - 0xD4F3: 0x5C59, - 0xD4F4: 0x5D1E, - 0xD4F5: 0x5D0B, - 0xD4F6: 0x5D1D, - 0xD4F7: 0x5D1A, - 0xD4F8: 0x5D20, - 0xD4F9: 0x5D0C, - 0xD4FA: 0x5D28, - 0xD4FB: 0x5D0D, - 0xD4FC: 0x5D26, - 0xD4FD: 0x5D25, - 0xD4FE: 0x5D0F, - 0xD540: 0x5D30, - 0xD541: 0x5D12, - 0xD542: 0x5D23, - 0xD543: 0x5D1F, - 0xD544: 0x5D2E, - 0xD545: 0x5E3E, - 0xD546: 0x5E34, - 0xD547: 0x5EB1, - 0xD548: 0x5EB4, - 0xD549: 0x5EB9, - 0xD54A: 0x5EB2, - 0xD54B: 0x5EB3, - 0xD54C: 0x5F36, - 0xD54D: 0x5F38, - 0xD54E: 0x5F9B, - 0xD54F: 0x5F96, - 0xD550: 0x5F9F, - 0xD551: 0x608A, - 0xD552: 0x6090, - 0xD553: 0x6086, - 0xD554: 0x60BE, - 0xD555: 0x60B0, - 0xD556: 0x60BA, - 0xD557: 0x60D3, - 0xD558: 0x60D4, - 0xD559: 0x60CF, - 0xD55A: 0x60E4, - 0xD55B: 0x60D9, - 0xD55C: 0x60DD, - 0xD55D: 0x60C8, - 0xD55E: 0x60B1, - 0xD55F: 0x60DB, - 0xD560: 0x60B7, - 0xD561: 0x60CA, - 0xD562: 0x60BF, - 0xD563: 0x60C3, - 0xD564: 0x60CD, - 0xD565: 0x60C0, - 0xD566: 0x6332, - 0xD567: 0x6365, - 0xD568: 0x638A, - 0xD569: 0x6382, - 0xD56A: 0x637D, - 0xD56B: 0x63BD, - 0xD56C: 0x639E, - 0xD56D: 0x63AD, - 0xD56E: 0x639D, - 0xD56F: 0x6397, - 0xD570: 0x63AB, - 0xD571: 0x638E, - 0xD572: 0x636F, - 0xD573: 0x6387, - 0xD574: 0x6390, - 0xD575: 0x636E, - 0xD576: 0x63AF, - 0xD577: 0x6375, - 0xD578: 0x639C, - 0xD579: 0x636D, - 0xD57A: 0x63AE, - 0xD57B: 0x637C, - 0xD57C: 0x63A4, - 0xD57D: 0x633B, - 0xD57E: 0x639F, - 0xD5A1: 0x6378, - 0xD5A2: 0x6385, - 0xD5A3: 0x6381, - 0xD5A4: 0x6391, - 0xD5A5: 0x638D, - 0xD5A6: 0x6370, - 0xD5A7: 0x6553, - 0xD5A8: 0x65CD, - 0xD5A9: 0x6665, - 0xD5AA: 0x6661, - 0xD5AB: 0x665B, - 0xD5AC: 0x6659, - 0xD5AD: 0x665C, - 0xD5AE: 0x6662, - 0xD5AF: 0x6718, - 0xD5B0: 0x6879, - 0xD5B1: 0x6887, - 0xD5B2: 0x6890, - 0xD5B3: 0x689C, - 0xD5B4: 0x686D, - 0xD5B5: 0x686E, - 0xD5B6: 0x68AE, - 0xD5B7: 0x68AB, - 0xD5B8: 0x6956, - 0xD5B9: 0x686F, - 0xD5BA: 0x68A3, - 0xD5BB: 0x68AC, - 0xD5BC: 0x68A9, - 0xD5BD: 0x6875, - 0xD5BE: 0x6874, - 0xD5BF: 0x68B2, - 0xD5C0: 0x688F, - 0xD5C1: 0x6877, - 0xD5C2: 0x6892, - 0xD5C3: 0x687C, - 0xD5C4: 0x686B, - 0xD5C5: 0x6872, - 0xD5C6: 0x68AA, - 0xD5C7: 0x6880, - 0xD5C8: 0x6871, - 0xD5C9: 0x687E, - 0xD5CA: 0x689B, - 0xD5CB: 0x6896, - 0xD5CC: 0x688B, - 0xD5CD: 0x68A0, - 0xD5CE: 0x6889, - 0xD5CF: 0x68A4, - 0xD5D0: 0x6878, - 0xD5D1: 0x687B, - 0xD5D2: 0x6891, - 0xD5D3: 0x688C, - 0xD5D4: 0x688A, - 0xD5D5: 0x687D, - 0xD5D6: 0x6B36, - 0xD5D7: 0x6B33, - 0xD5D8: 0x6B37, - 0xD5D9: 0x6B38, - 0xD5DA: 0x6B91, - 0xD5DB: 0x6B8F, - 0xD5DC: 0x6B8D, - 0xD5DD: 0x6B8E, - 0xD5DE: 0x6B8C, - 0xD5DF: 0x6C2A, - 0xD5E0: 0x6DC0, - 0xD5E1: 0x6DAB, - 0xD5E2: 0x6DB4, - 0xD5E3: 0x6DB3, - 0xD5E4: 0x6E74, - 0xD5E5: 0x6DAC, - 0xD5E6: 0x6DE9, - 0xD5E7: 0x6DE2, - 0xD5E8: 0x6DB7, - 0xD5E9: 0x6DF6, - 0xD5EA: 0x6DD4, - 0xD5EB: 0x6E00, - 0xD5EC: 0x6DC8, - 0xD5ED: 0x6DE0, - 0xD5EE: 0x6DDF, - 0xD5EF: 0x6DD6, - 0xD5F0: 0x6DBE, - 0xD5F1: 0x6DE5, - 0xD5F2: 0x6DDC, - 0xD5F3: 0x6DDD, - 0xD5F4: 0x6DDB, - 0xD5F5: 0x6DF4, - 0xD5F6: 0x6DCA, - 0xD5F7: 0x6DBD, - 0xD5F8: 0x6DED, - 0xD5F9: 0x6DF0, - 0xD5FA: 0x6DBA, - 0xD5FB: 0x6DD5, - 0xD5FC: 0x6DC2, - 0xD5FD: 0x6DCF, - 0xD5FE: 0x6DC9, - 0xD640: 0x6DD0, - 0xD641: 0x6DF2, - 0xD642: 0x6DD3, - 0xD643: 0x6DFD, - 0xD644: 0x6DD7, - 0xD645: 0x6DCD, - 0xD646: 0x6DE3, - 0xD647: 0x6DBB, - 0xD648: 0x70FA, - 0xD649: 0x710D, - 0xD64A: 0x70F7, - 0xD64B: 0x7117, - 0xD64C: 0x70F4, - 0xD64D: 0x710C, - 0xD64E: 0x70F0, - 0xD64F: 0x7104, - 0xD650: 0x70F3, - 0xD651: 0x7110, - 0xD652: 0x70FC, - 0xD653: 0x70FF, - 0xD654: 0x7106, - 0xD655: 0x7113, - 0xD656: 0x7100, - 0xD657: 0x70F8, - 0xD658: 0x70F6, - 0xD659: 0x710B, - 0xD65A: 0x7102, - 0xD65B: 0x710E, - 0xD65C: 0x727E, - 0xD65D: 0x727B, - 0xD65E: 0x727C, - 0xD65F: 0x727F, - 0xD660: 0x731D, - 0xD661: 0x7317, - 0xD662: 0x7307, - 0xD663: 0x7311, - 0xD664: 0x7318, - 0xD665: 0x730A, - 0xD666: 0x7308, - 0xD667: 0x72FF, - 0xD668: 0x730F, - 0xD669: 0x731E, - 0xD66A: 0x7388, - 0xD66B: 0x73F6, - 0xD66C: 0x73F8, - 0xD66D: 0x73F5, - 0xD66E: 0x7404, - 0xD66F: 0x7401, - 0xD670: 0x73FD, - 0xD671: 0x7407, - 0xD672: 0x7400, - 0xD673: 0x73FA, - 0xD674: 0x73FC, - 0xD675: 0x73FF, - 0xD676: 0x740C, - 0xD677: 0x740B, - 0xD678: 0x73F4, - 0xD679: 0x7408, - 0xD67A: 0x7564, - 0xD67B: 0x7563, - 0xD67C: 0x75CE, - 0xD67D: 0x75D2, - 0xD67E: 0x75CF, - 0xD6A1: 0x75CB, - 0xD6A2: 0x75CC, - 0xD6A3: 0x75D1, - 0xD6A4: 0x75D0, - 0xD6A5: 0x768F, - 0xD6A6: 0x7689, - 0xD6A7: 0x76D3, - 0xD6A8: 0x7739, - 0xD6A9: 0x772F, - 0xD6AA: 0x772D, - 0xD6AB: 0x7731, - 0xD6AC: 0x7732, - 0xD6AD: 0x7734, - 0xD6AE: 0x7733, - 0xD6AF: 0x773D, - 0xD6B0: 0x7725, - 0xD6B1: 0x773B, - 0xD6B2: 0x7735, - 0xD6B3: 0x7848, - 0xD6B4: 0x7852, - 0xD6B5: 0x7849, - 0xD6B6: 0x784D, - 0xD6B7: 0x784A, - 0xD6B8: 0x784C, - 0xD6B9: 0x7826, - 0xD6BA: 0x7845, - 0xD6BB: 0x7850, - 0xD6BC: 0x7964, - 0xD6BD: 0x7967, - 0xD6BE: 0x7969, - 0xD6BF: 0x796A, - 0xD6C0: 0x7963, - 0xD6C1: 0x796B, - 0xD6C2: 0x7961, - 0xD6C3: 0x79BB, - 0xD6C4: 0x79FA, - 0xD6C5: 0x79F8, - 0xD6C6: 0x79F6, - 0xD6C7: 0x79F7, - 0xD6C8: 0x7A8F, - 0xD6C9: 0x7A94, - 0xD6CA: 0x7A90, - 0xD6CB: 0x7B35, - 0xD6CC: 0x7B47, - 0xD6CD: 0x7B34, - 0xD6CE: 0x7B25, - 0xD6CF: 0x7B30, - 0xD6D0: 0x7B22, - 0xD6D1: 0x7B24, - 0xD6D2: 0x7B33, - 0xD6D3: 0x7B18, - 0xD6D4: 0x7B2A, - 0xD6D5: 0x7B1D, - 0xD6D6: 0x7B31, - 0xD6D7: 0x7B2B, - 0xD6D8: 0x7B2D, - 0xD6D9: 0x7B2F, - 0xD6DA: 0x7B32, - 0xD6DB: 0x7B38, - 0xD6DC: 0x7B1A, - 0xD6DD: 0x7B23, - 0xD6DE: 0x7C94, - 0xD6DF: 0x7C98, - 0xD6E0: 0x7C96, - 0xD6E1: 0x7CA3, - 0xD6E2: 0x7D35, - 0xD6E3: 0x7D3D, - 0xD6E4: 0x7D38, - 0xD6E5: 0x7D36, - 0xD6E6: 0x7D3A, - 0xD6E7: 0x7D45, - 0xD6E8: 0x7D2C, - 0xD6E9: 0x7D29, - 0xD6EA: 0x7D41, - 0xD6EB: 0x7D47, - 0xD6EC: 0x7D3E, - 0xD6ED: 0x7D3F, - 0xD6EE: 0x7D4A, - 0xD6EF: 0x7D3B, - 0xD6F0: 0x7D28, - 0xD6F1: 0x7F63, - 0xD6F2: 0x7F95, - 0xD6F3: 0x7F9C, - 0xD6F4: 0x7F9D, - 0xD6F5: 0x7F9B, - 0xD6F6: 0x7FCA, - 0xD6F7: 0x7FCB, - 0xD6F8: 0x7FCD, - 0xD6F9: 0x7FD0, - 0xD6FA: 0x7FD1, - 0xD6FB: 0x7FC7, - 0xD6FC: 0x7FCF, - 0xD6FD: 0x7FC9, - 0xD6FE: 0x801F, - 0xD740: 0x801E, - 0xD741: 0x801B, - 0xD742: 0x8047, - 0xD743: 0x8043, - 0xD744: 0x8048, - 0xD745: 0x8118, - 0xD746: 0x8125, - 0xD747: 0x8119, - 0xD748: 0x811B, - 0xD749: 0x812D, - 0xD74A: 0x811F, - 0xD74B: 0x812C, - 0xD74C: 0x811E, - 0xD74D: 0x8121, - 0xD74E: 0x8115, - 0xD74F: 0x8127, - 0xD750: 0x811D, - 0xD751: 0x8122, - 0xD752: 0x8211, - 0xD753: 0x8238, - 0xD754: 0x8233, - 0xD755: 0x823A, - 0xD756: 0x8234, - 0xD757: 0x8232, - 0xD758: 0x8274, - 0xD759: 0x8390, - 0xD75A: 0x83A3, - 0xD75B: 0x83A8, - 0xD75C: 0x838D, - 0xD75D: 0x837A, - 0xD75E: 0x8373, - 0xD75F: 0x83A4, - 0xD760: 0x8374, - 0xD761: 0x838F, - 0xD762: 0x8381, - 0xD763: 0x8395, - 0xD764: 0x8399, - 0xD765: 0x8375, - 0xD766: 0x8394, - 0xD767: 0x83A9, - 0xD768: 0x837D, - 0xD769: 0x8383, - 0xD76A: 0x838C, - 0xD76B: 0x839D, - 0xD76C: 0x839B, - 0xD76D: 0x83AA, - 0xD76E: 0x838B, - 0xD76F: 0x837E, - 0xD770: 0x83A5, - 0xD771: 0x83AF, - 0xD772: 0x8388, - 0xD773: 0x8397, - 0xD774: 0x83B0, - 0xD775: 0x837F, - 0xD776: 0x83A6, - 0xD777: 0x8387, - 0xD778: 0x83AE, - 0xD779: 0x8376, - 0xD77A: 0x839A, - 0xD77B: 0x8659, - 0xD77C: 0x8656, - 0xD77D: 0x86BF, - 0xD77E: 0x86B7, - 0xD7A1: 0x86C2, - 0xD7A2: 0x86C1, - 0xD7A3: 0x86C5, - 0xD7A4: 0x86BA, - 0xD7A5: 0x86B0, - 0xD7A6: 0x86C8, - 0xD7A7: 0x86B9, - 0xD7A8: 0x86B3, - 0xD7A9: 0x86B8, - 0xD7AA: 0x86CC, - 0xD7AB: 0x86B4, - 0xD7AC: 0x86BB, - 0xD7AD: 0x86BC, - 0xD7AE: 0x86C3, - 0xD7AF: 0x86BD, - 0xD7B0: 0x86BE, - 0xD7B1: 0x8852, - 0xD7B2: 0x8889, - 0xD7B3: 0x8895, - 0xD7B4: 0x88A8, - 0xD7B5: 0x88A2, - 0xD7B6: 0x88AA, - 0xD7B7: 0x889A, - 0xD7B8: 0x8891, - 0xD7B9: 0x88A1, - 0xD7BA: 0x889F, - 0xD7BB: 0x8898, - 0xD7BC: 0x88A7, - 0xD7BD: 0x8899, - 0xD7BE: 0x889B, - 0xD7BF: 0x8897, - 0xD7C0: 0x88A4, - 0xD7C1: 0x88AC, - 0xD7C2: 0x888C, - 0xD7C3: 0x8893, - 0xD7C4: 0x888E, - 0xD7C5: 0x8982, - 0xD7C6: 0x89D6, - 0xD7C7: 0x89D9, - 0xD7C8: 0x89D5, - 0xD7C9: 0x8A30, - 0xD7CA: 0x8A27, - 0xD7CB: 0x8A2C, - 0xD7CC: 0x8A1E, - 0xD7CD: 0x8C39, - 0xD7CE: 0x8C3B, - 0xD7CF: 0x8C5C, - 0xD7D0: 0x8C5D, - 0xD7D1: 0x8C7D, - 0xD7D2: 0x8CA5, - 0xD7D3: 0x8D7D, - 0xD7D4: 0x8D7B, - 0xD7D5: 0x8D79, - 0xD7D6: 0x8DBC, - 0xD7D7: 0x8DC2, - 0xD7D8: 0x8DB9, - 0xD7D9: 0x8DBF, - 0xD7DA: 0x8DC1, - 0xD7DB: 0x8ED8, - 0xD7DC: 0x8EDE, - 0xD7DD: 0x8EDD, - 0xD7DE: 0x8EDC, - 0xD7DF: 0x8ED7, - 0xD7E0: 0x8EE0, - 0xD7E1: 0x8EE1, - 0xD7E2: 0x9024, - 0xD7E3: 0x900B, - 0xD7E4: 0x9011, - 0xD7E5: 0x901C, - 0xD7E6: 0x900C, - 0xD7E7: 0x9021, - 0xD7E8: 0x90EF, - 0xD7E9: 0x90EA, - 0xD7EA: 0x90F0, - 0xD7EB: 0x90F4, - 0xD7EC: 0x90F2, - 0xD7ED: 0x90F3, - 0xD7EE: 0x90D4, - 0xD7EF: 0x90EB, - 0xD7F0: 0x90EC, - 0xD7F1: 0x90E9, - 0xD7F2: 0x9156, - 0xD7F3: 0x9158, - 0xD7F4: 0x915A, - 0xD7F5: 0x9153, - 0xD7F6: 0x9155, - 0xD7F7: 0x91EC, - 0xD7F8: 0x91F4, - 0xD7F9: 0x91F1, - 0xD7FA: 0x91F3, - 0xD7FB: 0x91F8, - 0xD7FC: 0x91E4, - 0xD7FD: 0x91F9, - 0xD7FE: 0x91EA, - 0xD840: 0x91EB, - 0xD841: 0x91F7, - 0xD842: 0x91E8, - 0xD843: 0x91EE, - 0xD844: 0x957A, - 0xD845: 0x9586, - 0xD846: 0x9588, - 0xD847: 0x967C, - 0xD848: 0x966D, - 0xD849: 0x966B, - 0xD84A: 0x9671, - 0xD84B: 0x966F, - 0xD84C: 0x96BF, - 0xD84D: 0x976A, - 0xD84E: 0x9804, - 0xD84F: 0x98E5, - 0xD850: 0x9997, - 0xD851: 0x509B, - 0xD852: 0x5095, - 0xD853: 0x5094, - 0xD854: 0x509E, - 0xD855: 0x508B, - 0xD856: 0x50A3, - 0xD857: 0x5083, - 0xD858: 0x508C, - 0xD859: 0x508E, - 0xD85A: 0x509D, - 0xD85B: 0x5068, - 0xD85C: 0x509C, - 0xD85D: 0x5092, - 0xD85E: 0x5082, - 0xD85F: 0x5087, - 0xD860: 0x515F, - 0xD861: 0x51D4, - 0xD862: 0x5312, - 0xD863: 0x5311, - 0xD864: 0x53A4, - 0xD865: 0x53A7, - 0xD866: 0x5591, - 0xD867: 0x55A8, - 0xD868: 0x55A5, - 0xD869: 0x55AD, - 0xD86A: 0x5577, - 0xD86B: 0x5645, - 0xD86C: 0x55A2, - 0xD86D: 0x5593, - 0xD86E: 0x5588, - 0xD86F: 0x558F, - 0xD870: 0x55B5, - 0xD871: 0x5581, - 0xD872: 0x55A3, - 0xD873: 0x5592, - 0xD874: 0x55A4, - 0xD875: 0x557D, - 0xD876: 0x558C, - 0xD877: 0x55A6, - 0xD878: 0x557F, - 0xD879: 0x5595, - 0xD87A: 0x55A1, - 0xD87B: 0x558E, - 0xD87C: 0x570C, - 0xD87D: 0x5829, - 0xD87E: 0x5837, - 0xD8A1: 0x5819, - 0xD8A2: 0x581E, - 0xD8A3: 0x5827, - 0xD8A4: 0x5823, - 0xD8A5: 0x5828, - 0xD8A6: 0x57F5, - 0xD8A7: 0x5848, - 0xD8A8: 0x5825, - 0xD8A9: 0x581C, - 0xD8AA: 0x581B, - 0xD8AB: 0x5833, - 0xD8AC: 0x583F, - 0xD8AD: 0x5836, - 0xD8AE: 0x582E, - 0xD8AF: 0x5839, - 0xD8B0: 0x5838, - 0xD8B1: 0x582D, - 0xD8B2: 0x582C, - 0xD8B3: 0x583B, - 0xD8B4: 0x5961, - 0xD8B5: 0x5AAF, - 0xD8B6: 0x5A94, - 0xD8B7: 0x5A9F, - 0xD8B8: 0x5A7A, - 0xD8B9: 0x5AA2, - 0xD8BA: 0x5A9E, - 0xD8BB: 0x5A78, - 0xD8BC: 0x5AA6, - 0xD8BD: 0x5A7C, - 0xD8BE: 0x5AA5, - 0xD8BF: 0x5AAC, - 0xD8C0: 0x5A95, - 0xD8C1: 0x5AAE, - 0xD8C2: 0x5A37, - 0xD8C3: 0x5A84, - 0xD8C4: 0x5A8A, - 0xD8C5: 0x5A97, - 0xD8C6: 0x5A83, - 0xD8C7: 0x5A8B, - 0xD8C8: 0x5AA9, - 0xD8C9: 0x5A7B, - 0xD8CA: 0x5A7D, - 0xD8CB: 0x5A8C, - 0xD8CC: 0x5A9C, - 0xD8CD: 0x5A8F, - 0xD8CE: 0x5A93, - 0xD8CF: 0x5A9D, - 0xD8D0: 0x5BEA, - 0xD8D1: 0x5BCD, - 0xD8D2: 0x5BCB, - 0xD8D3: 0x5BD4, - 0xD8D4: 0x5BD1, - 0xD8D5: 0x5BCA, - 0xD8D6: 0x5BCE, - 0xD8D7: 0x5C0C, - 0xD8D8: 0x5C30, - 0xD8D9: 0x5D37, - 0xD8DA: 0x5D43, - 0xD8DB: 0x5D6B, - 0xD8DC: 0x5D41, - 0xD8DD: 0x5D4B, - 0xD8DE: 0x5D3F, - 0xD8DF: 0x5D35, - 0xD8E0: 0x5D51, - 0xD8E1: 0x5D4E, - 0xD8E2: 0x5D55, - 0xD8E3: 0x5D33, - 0xD8E4: 0x5D3A, - 0xD8E5: 0x5D52, - 0xD8E6: 0x5D3D, - 0xD8E7: 0x5D31, - 0xD8E8: 0x5D59, - 0xD8E9: 0x5D42, - 0xD8EA: 0x5D39, - 0xD8EB: 0x5D49, - 0xD8EC: 0x5D38, - 0xD8ED: 0x5D3C, - 0xD8EE: 0x5D32, - 0xD8EF: 0x5D36, - 0xD8F0: 0x5D40, - 0xD8F1: 0x5D45, - 0xD8F2: 0x5E44, - 0xD8F3: 0x5E41, - 0xD8F4: 0x5F58, - 0xD8F5: 0x5FA6, - 0xD8F6: 0x5FA5, - 0xD8F7: 0x5FAB, - 0xD8F8: 0x60C9, - 0xD8F9: 0x60B9, - 0xD8FA: 0x60CC, - 0xD8FB: 0x60E2, - 0xD8FC: 0x60CE, - 0xD8FD: 0x60C4, - 0xD8FE: 0x6114, - 0xD940: 0x60F2, - 0xD941: 0x610A, - 0xD942: 0x6116, - 0xD943: 0x6105, - 0xD944: 0x60F5, - 0xD945: 0x6113, - 0xD946: 0x60F8, - 0xD947: 0x60FC, - 0xD948: 0x60FE, - 0xD949: 0x60C1, - 0xD94A: 0x6103, - 0xD94B: 0x6118, - 0xD94C: 0x611D, - 0xD94D: 0x6110, - 0xD94E: 0x60FF, - 0xD94F: 0x6104, - 0xD950: 0x610B, - 0xD951: 0x624A, - 0xD952: 0x6394, - 0xD953: 0x63B1, - 0xD954: 0x63B0, - 0xD955: 0x63CE, - 0xD956: 0x63E5, - 0xD957: 0x63E8, - 0xD958: 0x63EF, - 0xD959: 0x63C3, - 0xD95A: 0x649D, - 0xD95B: 0x63F3, - 0xD95C: 0x63CA, - 0xD95D: 0x63E0, - 0xD95E: 0x63F6, - 0xD95F: 0x63D5, - 0xD960: 0x63F2, - 0xD961: 0x63F5, - 0xD962: 0x6461, - 0xD963: 0x63DF, - 0xD964: 0x63BE, - 0xD965: 0x63DD, - 0xD966: 0x63DC, - 0xD967: 0x63C4, - 0xD968: 0x63D8, - 0xD969: 0x63D3, - 0xD96A: 0x63C2, - 0xD96B: 0x63C7, - 0xD96C: 0x63CC, - 0xD96D: 0x63CB, - 0xD96E: 0x63C8, - 0xD96F: 0x63F0, - 0xD970: 0x63D7, - 0xD971: 0x63D9, - 0xD972: 0x6532, - 0xD973: 0x6567, - 0xD974: 0x656A, - 0xD975: 0x6564, - 0xD976: 0x655C, - 0xD977: 0x6568, - 0xD978: 0x6565, - 0xD979: 0x658C, - 0xD97A: 0x659D, - 0xD97B: 0x659E, - 0xD97C: 0x65AE, - 0xD97D: 0x65D0, - 0xD97E: 0x65D2, - 0xD9A1: 0x667C, - 0xD9A2: 0x666C, - 0xD9A3: 0x667B, - 0xD9A4: 0x6680, - 0xD9A5: 0x6671, - 0xD9A6: 0x6679, - 0xD9A7: 0x666A, - 0xD9A8: 0x6672, - 0xD9A9: 0x6701, - 0xD9AA: 0x690C, - 0xD9AB: 0x68D3, - 0xD9AC: 0x6904, - 0xD9AD: 0x68DC, - 0xD9AE: 0x692A, - 0xD9AF: 0x68EC, - 0xD9B0: 0x68EA, - 0xD9B1: 0x68F1, - 0xD9B2: 0x690F, - 0xD9B3: 0x68D6, - 0xD9B4: 0x68F7, - 0xD9B5: 0x68EB, - 0xD9B6: 0x68E4, - 0xD9B7: 0x68F6, - 0xD9B8: 0x6913, - 0xD9B9: 0x6910, - 0xD9BA: 0x68F3, - 0xD9BB: 0x68E1, - 0xD9BC: 0x6907, - 0xD9BD: 0x68CC, - 0xD9BE: 0x6908, - 0xD9BF: 0x6970, - 0xD9C0: 0x68B4, - 0xD9C1: 0x6911, - 0xD9C2: 0x68EF, - 0xD9C3: 0x68C6, - 0xD9C4: 0x6914, - 0xD9C5: 0x68F8, - 0xD9C6: 0x68D0, - 0xD9C7: 0x68FD, - 0xD9C8: 0x68FC, - 0xD9C9: 0x68E8, - 0xD9CA: 0x690B, - 0xD9CB: 0x690A, - 0xD9CC: 0x6917, - 0xD9CD: 0x68CE, - 0xD9CE: 0x68C8, - 0xD9CF: 0x68DD, - 0xD9D0: 0x68DE, - 0xD9D1: 0x68E6, - 0xD9D2: 0x68F4, - 0xD9D3: 0x68D1, - 0xD9D4: 0x6906, - 0xD9D5: 0x68D4, - 0xD9D6: 0x68E9, - 0xD9D7: 0x6915, - 0xD9D8: 0x6925, - 0xD9D9: 0x68C7, - 0xD9DA: 0x6B39, - 0xD9DB: 0x6B3B, - 0xD9DC: 0x6B3F, - 0xD9DD: 0x6B3C, - 0xD9DE: 0x6B94, - 0xD9DF: 0x6B97, - 0xD9E0: 0x6B99, - 0xD9E1: 0x6B95, - 0xD9E2: 0x6BBD, - 0xD9E3: 0x6BF0, - 0xD9E4: 0x6BF2, - 0xD9E5: 0x6BF3, - 0xD9E6: 0x6C30, - 0xD9E7: 0x6DFC, - 0xD9E8: 0x6E46, - 0xD9E9: 0x6E47, - 0xD9EA: 0x6E1F, - 0xD9EB: 0x6E49, - 0xD9EC: 0x6E88, - 0xD9ED: 0x6E3C, - 0xD9EE: 0x6E3D, - 0xD9EF: 0x6E45, - 0xD9F0: 0x6E62, - 0xD9F1: 0x6E2B, - 0xD9F2: 0x6E3F, - 0xD9F3: 0x6E41, - 0xD9F4: 0x6E5D, - 0xD9F5: 0x6E73, - 0xD9F6: 0x6E1C, - 0xD9F7: 0x6E33, - 0xD9F8: 0x6E4B, - 0xD9F9: 0x6E40, - 0xD9FA: 0x6E51, - 0xD9FB: 0x6E3B, - 0xD9FC: 0x6E03, - 0xD9FD: 0x6E2E, - 0xD9FE: 0x6E5E, - 0xDA40: 0x6E68, - 0xDA41: 0x6E5C, - 0xDA42: 0x6E61, - 0xDA43: 0x6E31, - 0xDA44: 0x6E28, - 0xDA45: 0x6E60, - 0xDA46: 0x6E71, - 0xDA47: 0x6E6B, - 0xDA48: 0x6E39, - 0xDA49: 0x6E22, - 0xDA4A: 0x6E30, - 0xDA4B: 0x6E53, - 0xDA4C: 0x6E65, - 0xDA4D: 0x6E27, - 0xDA4E: 0x6E78, - 0xDA4F: 0x6E64, - 0xDA50: 0x6E77, - 0xDA51: 0x6E55, - 0xDA52: 0x6E79, - 0xDA53: 0x6E52, - 0xDA54: 0x6E66, - 0xDA55: 0x6E35, - 0xDA56: 0x6E36, - 0xDA57: 0x6E5A, - 0xDA58: 0x7120, - 0xDA59: 0x711E, - 0xDA5A: 0x712F, - 0xDA5B: 0x70FB, - 0xDA5C: 0x712E, - 0xDA5D: 0x7131, - 0xDA5E: 0x7123, - 0xDA5F: 0x7125, - 0xDA60: 0x7122, - 0xDA61: 0x7132, - 0xDA62: 0x711F, - 0xDA63: 0x7128, - 0xDA64: 0x713A, - 0xDA65: 0x711B, - 0xDA66: 0x724B, - 0xDA67: 0x725A, - 0xDA68: 0x7288, - 0xDA69: 0x7289, - 0xDA6A: 0x7286, - 0xDA6B: 0x7285, - 0xDA6C: 0x728B, - 0xDA6D: 0x7312, - 0xDA6E: 0x730B, - 0xDA6F: 0x7330, - 0xDA70: 0x7322, - 0xDA71: 0x7331, - 0xDA72: 0x7333, - 0xDA73: 0x7327, - 0xDA74: 0x7332, - 0xDA75: 0x732D, - 0xDA76: 0x7326, - 0xDA77: 0x7323, - 0xDA78: 0x7335, - 0xDA79: 0x730C, - 0xDA7A: 0x742E, - 0xDA7B: 0x742C, - 0xDA7C: 0x7430, - 0xDA7D: 0x742B, - 0xDA7E: 0x7416, - 0xDAA1: 0x741A, - 0xDAA2: 0x7421, - 0xDAA3: 0x742D, - 0xDAA4: 0x7431, - 0xDAA5: 0x7424, - 0xDAA6: 0x7423, - 0xDAA7: 0x741D, - 0xDAA8: 0x7429, - 0xDAA9: 0x7420, - 0xDAAA: 0x7432, - 0xDAAB: 0x74FB, - 0xDAAC: 0x752F, - 0xDAAD: 0x756F, - 0xDAAE: 0x756C, - 0xDAAF: 0x75E7, - 0xDAB0: 0x75DA, - 0xDAB1: 0x75E1, - 0xDAB2: 0x75E6, - 0xDAB3: 0x75DD, - 0xDAB4: 0x75DF, - 0xDAB5: 0x75E4, - 0xDAB6: 0x75D7, - 0xDAB7: 0x7695, - 0xDAB8: 0x7692, - 0xDAB9: 0x76DA, - 0xDABA: 0x7746, - 0xDABB: 0x7747, - 0xDABC: 0x7744, - 0xDABD: 0x774D, - 0xDABE: 0x7745, - 0xDABF: 0x774A, - 0xDAC0: 0x774E, - 0xDAC1: 0x774B, - 0xDAC2: 0x774C, - 0xDAC3: 0x77DE, - 0xDAC4: 0x77EC, - 0xDAC5: 0x7860, - 0xDAC6: 0x7864, - 0xDAC7: 0x7865, - 0xDAC8: 0x785C, - 0xDAC9: 0x786D, - 0xDACA: 0x7871, - 0xDACB: 0x786A, - 0xDACC: 0x786E, - 0xDACD: 0x7870, - 0xDACE: 0x7869, - 0xDACF: 0x7868, - 0xDAD0: 0x785E, - 0xDAD1: 0x7862, - 0xDAD2: 0x7974, - 0xDAD3: 0x7973, - 0xDAD4: 0x7972, - 0xDAD5: 0x7970, - 0xDAD6: 0x7A02, - 0xDAD7: 0x7A0A, - 0xDAD8: 0x7A03, - 0xDAD9: 0x7A0C, - 0xDADA: 0x7A04, - 0xDADB: 0x7A99, - 0xDADC: 0x7AE6, - 0xDADD: 0x7AE4, - 0xDADE: 0x7B4A, - 0xDADF: 0x7B3B, - 0xDAE0: 0x7B44, - 0xDAE1: 0x7B48, - 0xDAE2: 0x7B4C, - 0xDAE3: 0x7B4E, - 0xDAE4: 0x7B40, - 0xDAE5: 0x7B58, - 0xDAE6: 0x7B45, - 0xDAE7: 0x7CA2, - 0xDAE8: 0x7C9E, - 0xDAE9: 0x7CA8, - 0xDAEA: 0x7CA1, - 0xDAEB: 0x7D58, - 0xDAEC: 0x7D6F, - 0xDAED: 0x7D63, - 0xDAEE: 0x7D53, - 0xDAEF: 0x7D56, - 0xDAF0: 0x7D67, - 0xDAF1: 0x7D6A, - 0xDAF2: 0x7D4F, - 0xDAF3: 0x7D6D, - 0xDAF4: 0x7D5C, - 0xDAF5: 0x7D6B, - 0xDAF6: 0x7D52, - 0xDAF7: 0x7D54, - 0xDAF8: 0x7D69, - 0xDAF9: 0x7D51, - 0xDAFA: 0x7D5F, - 0xDAFB: 0x7D4E, - 0xDAFC: 0x7F3E, - 0xDAFD: 0x7F3F, - 0xDAFE: 0x7F65, - 0xDB40: 0x7F66, - 0xDB41: 0x7FA2, - 0xDB42: 0x7FA0, - 0xDB43: 0x7FA1, - 0xDB44: 0x7FD7, - 0xDB45: 0x8051, - 0xDB46: 0x804F, - 0xDB47: 0x8050, - 0xDB48: 0x80FE, - 0xDB49: 0x80D4, - 0xDB4A: 0x8143, - 0xDB4B: 0x814A, - 0xDB4C: 0x8152, - 0xDB4D: 0x814F, - 0xDB4E: 0x8147, - 0xDB4F: 0x813D, - 0xDB50: 0x814D, - 0xDB51: 0x813A, - 0xDB52: 0x81E6, - 0xDB53: 0x81EE, - 0xDB54: 0x81F7, - 0xDB55: 0x81F8, - 0xDB56: 0x81F9, - 0xDB57: 0x8204, - 0xDB58: 0x823C, - 0xDB59: 0x823D, - 0xDB5A: 0x823F, - 0xDB5B: 0x8275, - 0xDB5C: 0x833B, - 0xDB5D: 0x83CF, - 0xDB5E: 0x83F9, - 0xDB5F: 0x8423, - 0xDB60: 0x83C0, - 0xDB61: 0x83E8, - 0xDB62: 0x8412, - 0xDB63: 0x83E7, - 0xDB64: 0x83E4, - 0xDB65: 0x83FC, - 0xDB66: 0x83F6, - 0xDB67: 0x8410, - 0xDB68: 0x83C6, - 0xDB69: 0x83C8, - 0xDB6A: 0x83EB, - 0xDB6B: 0x83E3, - 0xDB6C: 0x83BF, - 0xDB6D: 0x8401, - 0xDB6E: 0x83DD, - 0xDB6F: 0x83E5, - 0xDB70: 0x83D8, - 0xDB71: 0x83FF, - 0xDB72: 0x83E1, - 0xDB73: 0x83CB, - 0xDB74: 0x83CE, - 0xDB75: 0x83D6, - 0xDB76: 0x83F5, - 0xDB77: 0x83C9, - 0xDB78: 0x8409, - 0xDB79: 0x840F, - 0xDB7A: 0x83DE, - 0xDB7B: 0x8411, - 0xDB7C: 0x8406, - 0xDB7D: 0x83C2, - 0xDB7E: 0x83F3, - 0xDBA1: 0x83D5, - 0xDBA2: 0x83FA, - 0xDBA3: 0x83C7, - 0xDBA4: 0x83D1, - 0xDBA5: 0x83EA, - 0xDBA6: 0x8413, - 0xDBA7: 0x83C3, - 0xDBA8: 0x83EC, - 0xDBA9: 0x83EE, - 0xDBAA: 0x83C4, - 0xDBAB: 0x83FB, - 0xDBAC: 0x83D7, - 0xDBAD: 0x83E2, - 0xDBAE: 0x841B, - 0xDBAF: 0x83DB, - 0xDBB0: 0x83FE, - 0xDBB1: 0x86D8, - 0xDBB2: 0x86E2, - 0xDBB3: 0x86E6, - 0xDBB4: 0x86D3, - 0xDBB5: 0x86E3, - 0xDBB6: 0x86DA, - 0xDBB7: 0x86EA, - 0xDBB8: 0x86DD, - 0xDBB9: 0x86EB, - 0xDBBA: 0x86DC, - 0xDBBB: 0x86EC, - 0xDBBC: 0x86E9, - 0xDBBD: 0x86D7, - 0xDBBE: 0x86E8, - 0xDBBF: 0x86D1, - 0xDBC0: 0x8848, - 0xDBC1: 0x8856, - 0xDBC2: 0x8855, - 0xDBC3: 0x88BA, - 0xDBC4: 0x88D7, - 0xDBC5: 0x88B9, - 0xDBC6: 0x88B8, - 0xDBC7: 0x88C0, - 0xDBC8: 0x88BE, - 0xDBC9: 0x88B6, - 0xDBCA: 0x88BC, - 0xDBCB: 0x88B7, - 0xDBCC: 0x88BD, - 0xDBCD: 0x88B2, - 0xDBCE: 0x8901, - 0xDBCF: 0x88C9, - 0xDBD0: 0x8995, - 0xDBD1: 0x8998, - 0xDBD2: 0x8997, - 0xDBD3: 0x89DD, - 0xDBD4: 0x89DA, - 0xDBD5: 0x89DB, - 0xDBD6: 0x8A4E, - 0xDBD7: 0x8A4D, - 0xDBD8: 0x8A39, - 0xDBD9: 0x8A59, - 0xDBDA: 0x8A40, - 0xDBDB: 0x8A57, - 0xDBDC: 0x8A58, - 0xDBDD: 0x8A44, - 0xDBDE: 0x8A45, - 0xDBDF: 0x8A52, - 0xDBE0: 0x8A48, - 0xDBE1: 0x8A51, - 0xDBE2: 0x8A4A, - 0xDBE3: 0x8A4C, - 0xDBE4: 0x8A4F, - 0xDBE5: 0x8C5F, - 0xDBE6: 0x8C81, - 0xDBE7: 0x8C80, - 0xDBE8: 0x8CBA, - 0xDBE9: 0x8CBE, - 0xDBEA: 0x8CB0, - 0xDBEB: 0x8CB9, - 0xDBEC: 0x8CB5, - 0xDBED: 0x8D84, - 0xDBEE: 0x8D80, - 0xDBEF: 0x8D89, - 0xDBF0: 0x8DD8, - 0xDBF1: 0x8DD3, - 0xDBF2: 0x8DCD, - 0xDBF3: 0x8DC7, - 0xDBF4: 0x8DD6, - 0xDBF5: 0x8DDC, - 0xDBF6: 0x8DCF, - 0xDBF7: 0x8DD5, - 0xDBF8: 0x8DD9, - 0xDBF9: 0x8DC8, - 0xDBFA: 0x8DD7, - 0xDBFB: 0x8DC5, - 0xDBFC: 0x8EEF, - 0xDBFD: 0x8EF7, - 0xDBFE: 0x8EFA, - 0xDC40: 0x8EF9, - 0xDC41: 0x8EE6, - 0xDC42: 0x8EEE, - 0xDC43: 0x8EE5, - 0xDC44: 0x8EF5, - 0xDC45: 0x8EE7, - 0xDC46: 0x8EE8, - 0xDC47: 0x8EF6, - 0xDC48: 0x8EEB, - 0xDC49: 0x8EF1, - 0xDC4A: 0x8EEC, - 0xDC4B: 0x8EF4, - 0xDC4C: 0x8EE9, - 0xDC4D: 0x902D, - 0xDC4E: 0x9034, - 0xDC4F: 0x902F, - 0xDC50: 0x9106, - 0xDC51: 0x912C, - 0xDC52: 0x9104, - 0xDC53: 0x90FF, - 0xDC54: 0x90FC, - 0xDC55: 0x9108, - 0xDC56: 0x90F9, - 0xDC57: 0x90FB, - 0xDC58: 0x9101, - 0xDC59: 0x9100, - 0xDC5A: 0x9107, - 0xDC5B: 0x9105, - 0xDC5C: 0x9103, - 0xDC5D: 0x9161, - 0xDC5E: 0x9164, - 0xDC5F: 0x915F, - 0xDC60: 0x9162, - 0xDC61: 0x9160, - 0xDC62: 0x9201, - 0xDC63: 0x920A, - 0xDC64: 0x9225, - 0xDC65: 0x9203, - 0xDC66: 0x921A, - 0xDC67: 0x9226, - 0xDC68: 0x920F, - 0xDC69: 0x920C, - 0xDC6A: 0x9200, - 0xDC6B: 0x9212, - 0xDC6C: 0x91FF, - 0xDC6D: 0x91FD, - 0xDC6E: 0x9206, - 0xDC6F: 0x9204, - 0xDC70: 0x9227, - 0xDC71: 0x9202, - 0xDC72: 0x921C, - 0xDC73: 0x9224, - 0xDC74: 0x9219, - 0xDC75: 0x9217, - 0xDC76: 0x9205, - 0xDC77: 0x9216, - 0xDC78: 0x957B, - 0xDC79: 0x958D, - 0xDC7A: 0x958C, - 0xDC7B: 0x9590, - 0xDC7C: 0x9687, - 0xDC7D: 0x967E, - 0xDC7E: 0x9688, - 0xDCA1: 0x9689, - 0xDCA2: 0x9683, - 0xDCA3: 0x9680, - 0xDCA4: 0x96C2, - 0xDCA5: 0x96C8, - 0xDCA6: 0x96C3, - 0xDCA7: 0x96F1, - 0xDCA8: 0x96F0, - 0xDCA9: 0x976C, - 0xDCAA: 0x9770, - 0xDCAB: 0x976E, - 0xDCAC: 0x9807, - 0xDCAD: 0x98A9, - 0xDCAE: 0x98EB, - 0xDCAF: 0x9CE6, - 0xDCB0: 0x9EF9, - 0xDCB1: 0x4E83, - 0xDCB2: 0x4E84, - 0xDCB3: 0x4EB6, - 0xDCB4: 0x50BD, - 0xDCB5: 0x50BF, - 0xDCB6: 0x50C6, - 0xDCB7: 0x50AE, - 0xDCB8: 0x50C4, - 0xDCB9: 0x50CA, - 0xDCBA: 0x50B4, - 0xDCBB: 0x50C8, - 0xDCBC: 0x50C2, - 0xDCBD: 0x50B0, - 0xDCBE: 0x50C1, - 0xDCBF: 0x50BA, - 0xDCC0: 0x50B1, - 0xDCC1: 0x50CB, - 0xDCC2: 0x50C9, - 0xDCC3: 0x50B6, - 0xDCC4: 0x50B8, - 0xDCC5: 0x51D7, - 0xDCC6: 0x527A, - 0xDCC7: 0x5278, - 0xDCC8: 0x527B, - 0xDCC9: 0x527C, - 0xDCCA: 0x55C3, - 0xDCCB: 0x55DB, - 0xDCCC: 0x55CC, - 0xDCCD: 0x55D0, - 0xDCCE: 0x55CB, - 0xDCCF: 0x55CA, - 0xDCD0: 0x55DD, - 0xDCD1: 0x55C0, - 0xDCD2: 0x55D4, - 0xDCD3: 0x55C4, - 0xDCD4: 0x55E9, - 0xDCD5: 0x55BF, - 0xDCD6: 0x55D2, - 0xDCD7: 0x558D, - 0xDCD8: 0x55CF, - 0xDCD9: 0x55D5, - 0xDCDA: 0x55E2, - 0xDCDB: 0x55D6, - 0xDCDC: 0x55C8, - 0xDCDD: 0x55F2, - 0xDCDE: 0x55CD, - 0xDCDF: 0x55D9, - 0xDCE0: 0x55C2, - 0xDCE1: 0x5714, - 0xDCE2: 0x5853, - 0xDCE3: 0x5868, - 0xDCE4: 0x5864, - 0xDCE5: 0x584F, - 0xDCE6: 0x584D, - 0xDCE7: 0x5849, - 0xDCE8: 0x586F, - 0xDCE9: 0x5855, - 0xDCEA: 0x584E, - 0xDCEB: 0x585D, - 0xDCEC: 0x5859, - 0xDCED: 0x5865, - 0xDCEE: 0x585B, - 0xDCEF: 0x583D, - 0xDCF0: 0x5863, - 0xDCF1: 0x5871, - 0xDCF2: 0x58FC, - 0xDCF3: 0x5AC7, - 0xDCF4: 0x5AC4, - 0xDCF5: 0x5ACB, - 0xDCF6: 0x5ABA, - 0xDCF7: 0x5AB8, - 0xDCF8: 0x5AB1, - 0xDCF9: 0x5AB5, - 0xDCFA: 0x5AB0, - 0xDCFB: 0x5ABF, - 0xDCFC: 0x5AC8, - 0xDCFD: 0x5ABB, - 0xDCFE: 0x5AC6, - 0xDD40: 0x5AB7, - 0xDD41: 0x5AC0, - 0xDD42: 0x5ACA, - 0xDD43: 0x5AB4, - 0xDD44: 0x5AB6, - 0xDD45: 0x5ACD, - 0xDD46: 0x5AB9, - 0xDD47: 0x5A90, - 0xDD48: 0x5BD6, - 0xDD49: 0x5BD8, - 0xDD4A: 0x5BD9, - 0xDD4B: 0x5C1F, - 0xDD4C: 0x5C33, - 0xDD4D: 0x5D71, - 0xDD4E: 0x5D63, - 0xDD4F: 0x5D4A, - 0xDD50: 0x5D65, - 0xDD51: 0x5D72, - 0xDD52: 0x5D6C, - 0xDD53: 0x5D5E, - 0xDD54: 0x5D68, - 0xDD55: 0x5D67, - 0xDD56: 0x5D62, - 0xDD57: 0x5DF0, - 0xDD58: 0x5E4F, - 0xDD59: 0x5E4E, - 0xDD5A: 0x5E4A, - 0xDD5B: 0x5E4D, - 0xDD5C: 0x5E4B, - 0xDD5D: 0x5EC5, - 0xDD5E: 0x5ECC, - 0xDD5F: 0x5EC6, - 0xDD60: 0x5ECB, - 0xDD61: 0x5EC7, - 0xDD62: 0x5F40, - 0xDD63: 0x5FAF, - 0xDD64: 0x5FAD, - 0xDD65: 0x60F7, - 0xDD66: 0x6149, - 0xDD67: 0x614A, - 0xDD68: 0x612B, - 0xDD69: 0x6145, - 0xDD6A: 0x6136, - 0xDD6B: 0x6132, - 0xDD6C: 0x612E, - 0xDD6D: 0x6146, - 0xDD6E: 0x612F, - 0xDD6F: 0x614F, - 0xDD70: 0x6129, - 0xDD71: 0x6140, - 0xDD72: 0x6220, - 0xDD73: 0x9168, - 0xDD74: 0x6223, - 0xDD75: 0x6225, - 0xDD76: 0x6224, - 0xDD77: 0x63C5, - 0xDD78: 0x63F1, - 0xDD79: 0x63EB, - 0xDD7A: 0x6410, - 0xDD7B: 0x6412, - 0xDD7C: 0x6409, - 0xDD7D: 0x6420, - 0xDD7E: 0x6424, - 0xDDA1: 0x6433, - 0xDDA2: 0x6443, - 0xDDA3: 0x641F, - 0xDDA4: 0x6415, - 0xDDA5: 0x6418, - 0xDDA6: 0x6439, - 0xDDA7: 0x6437, - 0xDDA8: 0x6422, - 0xDDA9: 0x6423, - 0xDDAA: 0x640C, - 0xDDAB: 0x6426, - 0xDDAC: 0x6430, - 0xDDAD: 0x6428, - 0xDDAE: 0x6441, - 0xDDAF: 0x6435, - 0xDDB0: 0x642F, - 0xDDB1: 0x640A, - 0xDDB2: 0x641A, - 0xDDB3: 0x6440, - 0xDDB4: 0x6425, - 0xDDB5: 0x6427, - 0xDDB6: 0x640B, - 0xDDB7: 0x63E7, - 0xDDB8: 0x641B, - 0xDDB9: 0x642E, - 0xDDBA: 0x6421, - 0xDDBB: 0x640E, - 0xDDBC: 0x656F, - 0xDDBD: 0x6592, - 0xDDBE: 0x65D3, - 0xDDBF: 0x6686, - 0xDDC0: 0x668C, - 0xDDC1: 0x6695, - 0xDDC2: 0x6690, - 0xDDC3: 0x668B, - 0xDDC4: 0x668A, - 0xDDC5: 0x6699, - 0xDDC6: 0x6694, - 0xDDC7: 0x6678, - 0xDDC8: 0x6720, - 0xDDC9: 0x6966, - 0xDDCA: 0x695F, - 0xDDCB: 0x6938, - 0xDDCC: 0x694E, - 0xDDCD: 0x6962, - 0xDDCE: 0x6971, - 0xDDCF: 0x693F, - 0xDDD0: 0x6945, - 0xDDD1: 0x696A, - 0xDDD2: 0x6939, - 0xDDD3: 0x6942, - 0xDDD4: 0x6957, - 0xDDD5: 0x6959, - 0xDDD6: 0x697A, - 0xDDD7: 0x6948, - 0xDDD8: 0x6949, - 0xDDD9: 0x6935, - 0xDDDA: 0x696C, - 0xDDDB: 0x6933, - 0xDDDC: 0x693D, - 0xDDDD: 0x6965, - 0xDDDE: 0x68F0, - 0xDDDF: 0x6978, - 0xDDE0: 0x6934, - 0xDDE1: 0x6969, - 0xDDE2: 0x6940, - 0xDDE3: 0x696F, - 0xDDE4: 0x6944, - 0xDDE5: 0x6976, - 0xDDE6: 0x6958, - 0xDDE7: 0x6941, - 0xDDE8: 0x6974, - 0xDDE9: 0x694C, - 0xDDEA: 0x693B, - 0xDDEB: 0x694B, - 0xDDEC: 0x6937, - 0xDDED: 0x695C, - 0xDDEE: 0x694F, - 0xDDEF: 0x6951, - 0xDDF0: 0x6932, - 0xDDF1: 0x6952, - 0xDDF2: 0x692F, - 0xDDF3: 0x697B, - 0xDDF4: 0x693C, - 0xDDF5: 0x6B46, - 0xDDF6: 0x6B45, - 0xDDF7: 0x6B43, - 0xDDF8: 0x6B42, - 0xDDF9: 0x6B48, - 0xDDFA: 0x6B41, - 0xDDFB: 0x6B9B, - 0xDDFC: 0xFA0D, // CJK COMPATIBILITY IDEOGRAPH-FA0D - 0xDDFD: 0x6BFB, - 0xDDFE: 0x6BFC, - 0xDE40: 0x6BF9, - 0xDE41: 0x6BF7, - 0xDE42: 0x6BF8, - 0xDE43: 0x6E9B, - 0xDE44: 0x6ED6, - 0xDE45: 0x6EC8, - 0xDE46: 0x6E8F, - 0xDE47: 0x6EC0, - 0xDE48: 0x6E9F, - 0xDE49: 0x6E93, - 0xDE4A: 0x6E94, - 0xDE4B: 0x6EA0, - 0xDE4C: 0x6EB1, - 0xDE4D: 0x6EB9, - 0xDE4E: 0x6EC6, - 0xDE4F: 0x6ED2, - 0xDE50: 0x6EBD, - 0xDE51: 0x6EC1, - 0xDE52: 0x6E9E, - 0xDE53: 0x6EC9, - 0xDE54: 0x6EB7, - 0xDE55: 0x6EB0, - 0xDE56: 0x6ECD, - 0xDE57: 0x6EA6, - 0xDE58: 0x6ECF, - 0xDE59: 0x6EB2, - 0xDE5A: 0x6EBE, - 0xDE5B: 0x6EC3, - 0xDE5C: 0x6EDC, - 0xDE5D: 0x6ED8, - 0xDE5E: 0x6E99, - 0xDE5F: 0x6E92, - 0xDE60: 0x6E8E, - 0xDE61: 0x6E8D, - 0xDE62: 0x6EA4, - 0xDE63: 0x6EA1, - 0xDE64: 0x6EBF, - 0xDE65: 0x6EB3, - 0xDE66: 0x6ED0, - 0xDE67: 0x6ECA, - 0xDE68: 0x6E97, - 0xDE69: 0x6EAE, - 0xDE6A: 0x6EA3, - 0xDE6B: 0x7147, - 0xDE6C: 0x7154, - 0xDE6D: 0x7152, - 0xDE6E: 0x7163, - 0xDE6F: 0x7160, - 0xDE70: 0x7141, - 0xDE71: 0x715D, - 0xDE72: 0x7162, - 0xDE73: 0x7172, - 0xDE74: 0x7178, - 0xDE75: 0x716A, - 0xDE76: 0x7161, - 0xDE77: 0x7142, - 0xDE78: 0x7158, - 0xDE79: 0x7143, - 0xDE7A: 0x714B, - 0xDE7B: 0x7170, - 0xDE7C: 0x715F, - 0xDE7D: 0x7150, - 0xDE7E: 0x7153, - 0xDEA1: 0x7144, - 0xDEA2: 0x714D, - 0xDEA3: 0x715A, - 0xDEA4: 0x724F, - 0xDEA5: 0x728D, - 0xDEA6: 0x728C, - 0xDEA7: 0x7291, - 0xDEA8: 0x7290, - 0xDEA9: 0x728E, - 0xDEAA: 0x733C, - 0xDEAB: 0x7342, - 0xDEAC: 0x733B, - 0xDEAD: 0x733A, - 0xDEAE: 0x7340, - 0xDEAF: 0x734A, - 0xDEB0: 0x7349, - 0xDEB1: 0x7444, - 0xDEB2: 0x744A, - 0xDEB3: 0x744B, - 0xDEB4: 0x7452, - 0xDEB5: 0x7451, - 0xDEB6: 0x7457, - 0xDEB7: 0x7440, - 0xDEB8: 0x744F, - 0xDEB9: 0x7450, - 0xDEBA: 0x744E, - 0xDEBB: 0x7442, - 0xDEBC: 0x7446, - 0xDEBD: 0x744D, - 0xDEBE: 0x7454, - 0xDEBF: 0x74E1, - 0xDEC0: 0x74FF, - 0xDEC1: 0x74FE, - 0xDEC2: 0x74FD, - 0xDEC3: 0x751D, - 0xDEC4: 0x7579, - 0xDEC5: 0x7577, - 0xDEC6: 0x6983, - 0xDEC7: 0x75EF, - 0xDEC8: 0x760F, - 0xDEC9: 0x7603, - 0xDECA: 0x75F7, - 0xDECB: 0x75FE, - 0xDECC: 0x75FC, - 0xDECD: 0x75F9, - 0xDECE: 0x75F8, - 0xDECF: 0x7610, - 0xDED0: 0x75FB, - 0xDED1: 0x75F6, - 0xDED2: 0x75ED, - 0xDED3: 0x75F5, - 0xDED4: 0x75FD, - 0xDED5: 0x7699, - 0xDED6: 0x76B5, - 0xDED7: 0x76DD, - 0xDED8: 0x7755, - 0xDED9: 0x775F, - 0xDEDA: 0x7760, - 0xDEDB: 0x7752, - 0xDEDC: 0x7756, - 0xDEDD: 0x775A, - 0xDEDE: 0x7769, - 0xDEDF: 0x7767, - 0xDEE0: 0x7754, - 0xDEE1: 0x7759, - 0xDEE2: 0x776D, - 0xDEE3: 0x77E0, - 0xDEE4: 0x7887, - 0xDEE5: 0x789A, - 0xDEE6: 0x7894, - 0xDEE7: 0x788F, - 0xDEE8: 0x7884, - 0xDEE9: 0x7895, - 0xDEEA: 0x7885, - 0xDEEB: 0x7886, - 0xDEEC: 0x78A1, - 0xDEED: 0x7883, - 0xDEEE: 0x7879, - 0xDEEF: 0x7899, - 0xDEF0: 0x7880, - 0xDEF1: 0x7896, - 0xDEF2: 0x787B, - 0xDEF3: 0x797C, - 0xDEF4: 0x7982, - 0xDEF5: 0x797D, - 0xDEF6: 0x7979, - 0xDEF7: 0x7A11, - 0xDEF8: 0x7A18, - 0xDEF9: 0x7A19, - 0xDEFA: 0x7A12, - 0xDEFB: 0x7A17, - 0xDEFC: 0x7A15, - 0xDEFD: 0x7A22, - 0xDEFE: 0x7A13, - 0xDF40: 0x7A1B, - 0xDF41: 0x7A10, - 0xDF42: 0x7AA3, - 0xDF43: 0x7AA2, - 0xDF44: 0x7A9E, - 0xDF45: 0x7AEB, - 0xDF46: 0x7B66, - 0xDF47: 0x7B64, - 0xDF48: 0x7B6D, - 0xDF49: 0x7B74, - 0xDF4A: 0x7B69, - 0xDF4B: 0x7B72, - 0xDF4C: 0x7B65, - 0xDF4D: 0x7B73, - 0xDF4E: 0x7B71, - 0xDF4F: 0x7B70, - 0xDF50: 0x7B61, - 0xDF51: 0x7B78, - 0xDF52: 0x7B76, - 0xDF53: 0x7B63, - 0xDF54: 0x7CB2, - 0xDF55: 0x7CB4, - 0xDF56: 0x7CAF, - 0xDF57: 0x7D88, - 0xDF58: 0x7D86, - 0xDF59: 0x7D80, - 0xDF5A: 0x7D8D, - 0xDF5B: 0x7D7F, - 0xDF5C: 0x7D85, - 0xDF5D: 0x7D7A, - 0xDF5E: 0x7D8E, - 0xDF5F: 0x7D7B, - 0xDF60: 0x7D83, - 0xDF61: 0x7D7C, - 0xDF62: 0x7D8C, - 0xDF63: 0x7D94, - 0xDF64: 0x7D84, - 0xDF65: 0x7D7D, - 0xDF66: 0x7D92, - 0xDF67: 0x7F6D, - 0xDF68: 0x7F6B, - 0xDF69: 0x7F67, - 0xDF6A: 0x7F68, - 0xDF6B: 0x7F6C, - 0xDF6C: 0x7FA6, - 0xDF6D: 0x7FA5, - 0xDF6E: 0x7FA7, - 0xDF6F: 0x7FDB, - 0xDF70: 0x7FDC, - 0xDF71: 0x8021, - 0xDF72: 0x8164, - 0xDF73: 0x8160, - 0xDF74: 0x8177, - 0xDF75: 0x815C, - 0xDF76: 0x8169, - 0xDF77: 0x815B, - 0xDF78: 0x8162, - 0xDF79: 0x8172, - 0xDF7A: 0x6721, - 0xDF7B: 0x815E, - 0xDF7C: 0x8176, - 0xDF7D: 0x8167, - 0xDF7E: 0x816F, - 0xDFA1: 0x8144, - 0xDFA2: 0x8161, - 0xDFA3: 0x821D, - 0xDFA4: 0x8249, - 0xDFA5: 0x8244, - 0xDFA6: 0x8240, - 0xDFA7: 0x8242, - 0xDFA8: 0x8245, - 0xDFA9: 0x84F1, - 0xDFAA: 0x843F, - 0xDFAB: 0x8456, - 0xDFAC: 0x8476, - 0xDFAD: 0x8479, - 0xDFAE: 0x848F, - 0xDFAF: 0x848D, - 0xDFB0: 0x8465, - 0xDFB1: 0x8451, - 0xDFB2: 0x8440, - 0xDFB3: 0x8486, - 0xDFB4: 0x8467, - 0xDFB5: 0x8430, - 0xDFB6: 0x844D, - 0xDFB7: 0x847D, - 0xDFB8: 0x845A, - 0xDFB9: 0x8459, - 0xDFBA: 0x8474, - 0xDFBB: 0x8473, - 0xDFBC: 0x845D, - 0xDFBD: 0x8507, - 0xDFBE: 0x845E, - 0xDFBF: 0x8437, - 0xDFC0: 0x843A, - 0xDFC1: 0x8434, - 0xDFC2: 0x847A, - 0xDFC3: 0x8443, - 0xDFC4: 0x8478, - 0xDFC5: 0x8432, - 0xDFC6: 0x8445, - 0xDFC7: 0x8429, - 0xDFC8: 0x83D9, - 0xDFC9: 0x844B, - 0xDFCA: 0x842F, - 0xDFCB: 0x8442, - 0xDFCC: 0x842D, - 0xDFCD: 0x845F, - 0xDFCE: 0x8470, - 0xDFCF: 0x8439, - 0xDFD0: 0x844E, - 0xDFD1: 0x844C, - 0xDFD2: 0x8452, - 0xDFD3: 0x846F, - 0xDFD4: 0x84C5, - 0xDFD5: 0x848E, - 0xDFD6: 0x843B, - 0xDFD7: 0x8447, - 0xDFD8: 0x8436, - 0xDFD9: 0x8433, - 0xDFDA: 0x8468, - 0xDFDB: 0x847E, - 0xDFDC: 0x8444, - 0xDFDD: 0x842B, - 0xDFDE: 0x8460, - 0xDFDF: 0x8454, - 0xDFE0: 0x846E, - 0xDFE1: 0x8450, - 0xDFE2: 0x870B, - 0xDFE3: 0x8704, - 0xDFE4: 0x86F7, - 0xDFE5: 0x870C, - 0xDFE6: 0x86FA, - 0xDFE7: 0x86D6, - 0xDFE8: 0x86F5, - 0xDFE9: 0x874D, - 0xDFEA: 0x86F8, - 0xDFEB: 0x870E, - 0xDFEC: 0x8709, - 0xDFED: 0x8701, - 0xDFEE: 0x86F6, - 0xDFEF: 0x870D, - 0xDFF0: 0x8705, - 0xDFF1: 0x88D6, - 0xDFF2: 0x88CB, - 0xDFF3: 0x88CD, - 0xDFF4: 0x88CE, - 0xDFF5: 0x88DE, - 0xDFF6: 0x88DB, - 0xDFF7: 0x88DA, - 0xDFF8: 0x88CC, - 0xDFF9: 0x88D0, - 0xDFFA: 0x8985, - 0xDFFB: 0x899B, - 0xDFFC: 0x89DF, - 0xDFFD: 0x89E5, - 0xDFFE: 0x89E4, - 0xE040: 0x89E1, - 0xE041: 0x89E0, - 0xE042: 0x89E2, - 0xE043: 0x89DC, - 0xE044: 0x89E6, - 0xE045: 0x8A76, - 0xE046: 0x8A86, - 0xE047: 0x8A7F, - 0xE048: 0x8A61, - 0xE049: 0x8A3F, - 0xE04A: 0x8A77, - 0xE04B: 0x8A82, - 0xE04C: 0x8A84, - 0xE04D: 0x8A75, - 0xE04E: 0x8A83, - 0xE04F: 0x8A81, - 0xE050: 0x8A74, - 0xE051: 0x8A7A, - 0xE052: 0x8C3C, - 0xE053: 0x8C4B, - 0xE054: 0x8C4A, - 0xE055: 0x8C65, - 0xE056: 0x8C64, - 0xE057: 0x8C66, - 0xE058: 0x8C86, - 0xE059: 0x8C84, - 0xE05A: 0x8C85, - 0xE05B: 0x8CCC, - 0xE05C: 0x8D68, - 0xE05D: 0x8D69, - 0xE05E: 0x8D91, - 0xE05F: 0x8D8C, - 0xE060: 0x8D8E, - 0xE061: 0x8D8F, - 0xE062: 0x8D8D, - 0xE063: 0x8D93, - 0xE064: 0x8D94, - 0xE065: 0x8D90, - 0xE066: 0x8D92, - 0xE067: 0x8DF0, - 0xE068: 0x8DE0, - 0xE069: 0x8DEC, - 0xE06A: 0x8DF1, - 0xE06B: 0x8DEE, - 0xE06C: 0x8DD0, - 0xE06D: 0x8DE9, - 0xE06E: 0x8DE3, - 0xE06F: 0x8DE2, - 0xE070: 0x8DE7, - 0xE071: 0x8DF2, - 0xE072: 0x8DEB, - 0xE073: 0x8DF4, - 0xE074: 0x8F06, - 0xE075: 0x8EFF, - 0xE076: 0x8F01, - 0xE077: 0x8F00, - 0xE078: 0x8F05, - 0xE079: 0x8F07, - 0xE07A: 0x8F08, - 0xE07B: 0x8F02, - 0xE07C: 0x8F0B, - 0xE07D: 0x9052, - 0xE07E: 0x903F, - 0xE0A1: 0x9044, - 0xE0A2: 0x9049, - 0xE0A3: 0x903D, - 0xE0A4: 0x9110, - 0xE0A5: 0x910D, - 0xE0A6: 0x910F, - 0xE0A7: 0x9111, - 0xE0A8: 0x9116, - 0xE0A9: 0x9114, - 0xE0AA: 0x910B, - 0xE0AB: 0x910E, - 0xE0AC: 0x916E, - 0xE0AD: 0x916F, - 0xE0AE: 0x9248, - 0xE0AF: 0x9252, - 0xE0B0: 0x9230, - 0xE0B1: 0x923A, - 0xE0B2: 0x9266, - 0xE0B3: 0x9233, - 0xE0B4: 0x9265, - 0xE0B5: 0x925E, - 0xE0B6: 0x9283, - 0xE0B7: 0x922E, - 0xE0B8: 0x924A, - 0xE0B9: 0x9246, - 0xE0BA: 0x926D, - 0xE0BB: 0x926C, - 0xE0BC: 0x924F, - 0xE0BD: 0x9260, - 0xE0BE: 0x9267, - 0xE0BF: 0x926F, - 0xE0C0: 0x9236, - 0xE0C1: 0x9261, - 0xE0C2: 0x9270, - 0xE0C3: 0x9231, - 0xE0C4: 0x9254, - 0xE0C5: 0x9263, - 0xE0C6: 0x9250, - 0xE0C7: 0x9272, - 0xE0C8: 0x924E, - 0xE0C9: 0x9253, - 0xE0CA: 0x924C, - 0xE0CB: 0x9256, - 0xE0CC: 0x9232, - 0xE0CD: 0x959F, - 0xE0CE: 0x959C, - 0xE0CF: 0x959E, - 0xE0D0: 0x959B, - 0xE0D1: 0x9692, - 0xE0D2: 0x9693, - 0xE0D3: 0x9691, - 0xE0D4: 0x9697, - 0xE0D5: 0x96CE, - 0xE0D6: 0x96FA, - 0xE0D7: 0x96FD, - 0xE0D8: 0x96F8, - 0xE0D9: 0x96F5, - 0xE0DA: 0x9773, - 0xE0DB: 0x9777, - 0xE0DC: 0x9778, - 0xE0DD: 0x9772, - 0xE0DE: 0x980F, - 0xE0DF: 0x980D, - 0xE0E0: 0x980E, - 0xE0E1: 0x98AC, - 0xE0E2: 0x98F6, - 0xE0E3: 0x98F9, - 0xE0E4: 0x99AF, - 0xE0E5: 0x99B2, - 0xE0E6: 0x99B0, - 0xE0E7: 0x99B5, - 0xE0E8: 0x9AAD, - 0xE0E9: 0x9AAB, - 0xE0EA: 0x9B5B, - 0xE0EB: 0x9CEA, - 0xE0EC: 0x9CED, - 0xE0ED: 0x9CE7, - 0xE0EE: 0x9E80, - 0xE0EF: 0x9EFD, - 0xE0F0: 0x50E6, - 0xE0F1: 0x50D4, - 0xE0F2: 0x50D7, - 0xE0F3: 0x50E8, - 0xE0F4: 0x50F3, - 0xE0F5: 0x50DB, - 0xE0F6: 0x50EA, - 0xE0F7: 0x50DD, - 0xE0F8: 0x50E4, - 0xE0F9: 0x50D3, - 0xE0FA: 0x50EC, - 0xE0FB: 0x50F0, - 0xE0FC: 0x50EF, - 0xE0FD: 0x50E3, - 0xE0FE: 0x50E0, - 0xE140: 0x51D8, - 0xE141: 0x5280, - 0xE142: 0x5281, - 0xE143: 0x52E9, - 0xE144: 0x52EB, - 0xE145: 0x5330, - 0xE146: 0x53AC, - 0xE147: 0x5627, - 0xE148: 0x5615, - 0xE149: 0x560C, - 0xE14A: 0x5612, - 0xE14B: 0x55FC, - 0xE14C: 0x560F, - 0xE14D: 0x561C, - 0xE14E: 0x5601, - 0xE14F: 0x5613, - 0xE150: 0x5602, - 0xE151: 0x55FA, - 0xE152: 0x561D, - 0xE153: 0x5604, - 0xE154: 0x55FF, - 0xE155: 0x55F9, - 0xE156: 0x5889, - 0xE157: 0x587C, - 0xE158: 0x5890, - 0xE159: 0x5898, - 0xE15A: 0x5886, - 0xE15B: 0x5881, - 0xE15C: 0x587F, - 0xE15D: 0x5874, - 0xE15E: 0x588B, - 0xE15F: 0x587A, - 0xE160: 0x5887, - 0xE161: 0x5891, - 0xE162: 0x588E, - 0xE163: 0x5876, - 0xE164: 0x5882, - 0xE165: 0x5888, - 0xE166: 0x587B, - 0xE167: 0x5894, - 0xE168: 0x588F, - 0xE169: 0x58FE, - 0xE16A: 0x596B, - 0xE16B: 0x5ADC, - 0xE16C: 0x5AEE, - 0xE16D: 0x5AE5, - 0xE16E: 0x5AD5, - 0xE16F: 0x5AEA, - 0xE170: 0x5ADA, - 0xE171: 0x5AED, - 0xE172: 0x5AEB, - 0xE173: 0x5AF3, - 0xE174: 0x5AE2, - 0xE175: 0x5AE0, - 0xE176: 0x5ADB, - 0xE177: 0x5AEC, - 0xE178: 0x5ADE, - 0xE179: 0x5ADD, - 0xE17A: 0x5AD9, - 0xE17B: 0x5AE8, - 0xE17C: 0x5ADF, - 0xE17D: 0x5B77, - 0xE17E: 0x5BE0, - 0xE1A1: 0x5BE3, - 0xE1A2: 0x5C63, - 0xE1A3: 0x5D82, - 0xE1A4: 0x5D80, - 0xE1A5: 0x5D7D, - 0xE1A6: 0x5D86, - 0xE1A7: 0x5D7A, - 0xE1A8: 0x5D81, - 0xE1A9: 0x5D77, - 0xE1AA: 0x5D8A, - 0xE1AB: 0x5D89, - 0xE1AC: 0x5D88, - 0xE1AD: 0x5D7E, - 0xE1AE: 0x5D7C, - 0xE1AF: 0x5D8D, - 0xE1B0: 0x5D79, - 0xE1B1: 0x5D7F, - 0xE1B2: 0x5E58, - 0xE1B3: 0x5E59, - 0xE1B4: 0x5E53, - 0xE1B5: 0x5ED8, - 0xE1B6: 0x5ED1, - 0xE1B7: 0x5ED7, - 0xE1B8: 0x5ECE, - 0xE1B9: 0x5EDC, - 0xE1BA: 0x5ED5, - 0xE1BB: 0x5ED9, - 0xE1BC: 0x5ED2, - 0xE1BD: 0x5ED4, - 0xE1BE: 0x5F44, - 0xE1BF: 0x5F43, - 0xE1C0: 0x5F6F, - 0xE1C1: 0x5FB6, - 0xE1C2: 0x612C, - 0xE1C3: 0x6128, - 0xE1C4: 0x6141, - 0xE1C5: 0x615E, - 0xE1C6: 0x6171, - 0xE1C7: 0x6173, - 0xE1C8: 0x6152, - 0xE1C9: 0x6153, - 0xE1CA: 0x6172, - 0xE1CB: 0x616C, - 0xE1CC: 0x6180, - 0xE1CD: 0x6174, - 0xE1CE: 0x6154, - 0xE1CF: 0x617A, - 0xE1D0: 0x615B, - 0xE1D1: 0x6165, - 0xE1D2: 0x613B, - 0xE1D3: 0x616A, - 0xE1D4: 0x6161, - 0xE1D5: 0x6156, - 0xE1D6: 0x6229, - 0xE1D7: 0x6227, - 0xE1D8: 0x622B, - 0xE1D9: 0x642B, - 0xE1DA: 0x644D, - 0xE1DB: 0x645B, - 0xE1DC: 0x645D, - 0xE1DD: 0x6474, - 0xE1DE: 0x6476, - 0xE1DF: 0x6472, - 0xE1E0: 0x6473, - 0xE1E1: 0x647D, - 0xE1E2: 0x6475, - 0xE1E3: 0x6466, - 0xE1E4: 0x64A6, - 0xE1E5: 0x644E, - 0xE1E6: 0x6482, - 0xE1E7: 0x645E, - 0xE1E8: 0x645C, - 0xE1E9: 0x644B, - 0xE1EA: 0x6453, - 0xE1EB: 0x6460, - 0xE1EC: 0x6450, - 0xE1ED: 0x647F, - 0xE1EE: 0x643F, - 0xE1EF: 0x646C, - 0xE1F0: 0x646B, - 0xE1F1: 0x6459, - 0xE1F2: 0x6465, - 0xE1F3: 0x6477, - 0xE1F4: 0x6573, - 0xE1F5: 0x65A0, - 0xE1F6: 0x66A1, - 0xE1F7: 0x66A0, - 0xE1F8: 0x669F, - 0xE1F9: 0x6705, - 0xE1FA: 0x6704, - 0xE1FB: 0x6722, - 0xE1FC: 0x69B1, - 0xE1FD: 0x69B6, - 0xE1FE: 0x69C9, - 0xE240: 0x69A0, - 0xE241: 0x69CE, - 0xE242: 0x6996, - 0xE243: 0x69B0, - 0xE244: 0x69AC, - 0xE245: 0x69BC, - 0xE246: 0x6991, - 0xE247: 0x6999, - 0xE248: 0x698E, - 0xE249: 0x69A7, - 0xE24A: 0x698D, - 0xE24B: 0x69A9, - 0xE24C: 0x69BE, - 0xE24D: 0x69AF, - 0xE24E: 0x69BF, - 0xE24F: 0x69C4, - 0xE250: 0x69BD, - 0xE251: 0x69A4, - 0xE252: 0x69D4, - 0xE253: 0x69B9, - 0xE254: 0x69CA, - 0xE255: 0x699A, - 0xE256: 0x69CF, - 0xE257: 0x69B3, - 0xE258: 0x6993, - 0xE259: 0x69AA, - 0xE25A: 0x69A1, - 0xE25B: 0x699E, - 0xE25C: 0x69D9, - 0xE25D: 0x6997, - 0xE25E: 0x6990, - 0xE25F: 0x69C2, - 0xE260: 0x69B5, - 0xE261: 0x69A5, - 0xE262: 0x69C6, - 0xE263: 0x6B4A, - 0xE264: 0x6B4D, - 0xE265: 0x6B4B, - 0xE266: 0x6B9E, - 0xE267: 0x6B9F, - 0xE268: 0x6BA0, - 0xE269: 0x6BC3, - 0xE26A: 0x6BC4, - 0xE26B: 0x6BFE, - 0xE26C: 0x6ECE, - 0xE26D: 0x6EF5, - 0xE26E: 0x6EF1, - 0xE26F: 0x6F03, - 0xE270: 0x6F25, - 0xE271: 0x6EF8, - 0xE272: 0x6F37, - 0xE273: 0x6EFB, - 0xE274: 0x6F2E, - 0xE275: 0x6F09, - 0xE276: 0x6F4E, - 0xE277: 0x6F19, - 0xE278: 0x6F1A, - 0xE279: 0x6F27, - 0xE27A: 0x6F18, - 0xE27B: 0x6F3B, - 0xE27C: 0x6F12, - 0xE27D: 0x6EED, - 0xE27E: 0x6F0A, - 0xE2A1: 0x6F36, - 0xE2A2: 0x6F73, - 0xE2A3: 0x6EF9, - 0xE2A4: 0x6EEE, - 0xE2A5: 0x6F2D, - 0xE2A6: 0x6F40, - 0xE2A7: 0x6F30, - 0xE2A8: 0x6F3C, - 0xE2A9: 0x6F35, - 0xE2AA: 0x6EEB, - 0xE2AB: 0x6F07, - 0xE2AC: 0x6F0E, - 0xE2AD: 0x6F43, - 0xE2AE: 0x6F05, - 0xE2AF: 0x6EFD, - 0xE2B0: 0x6EF6, - 0xE2B1: 0x6F39, - 0xE2B2: 0x6F1C, - 0xE2B3: 0x6EFC, - 0xE2B4: 0x6F3A, - 0xE2B5: 0x6F1F, - 0xE2B6: 0x6F0D, - 0xE2B7: 0x6F1E, - 0xE2B8: 0x6F08, - 0xE2B9: 0x6F21, - 0xE2BA: 0x7187, - 0xE2BB: 0x7190, - 0xE2BC: 0x7189, - 0xE2BD: 0x7180, - 0xE2BE: 0x7185, - 0xE2BF: 0x7182, - 0xE2C0: 0x718F, - 0xE2C1: 0x717B, - 0xE2C2: 0x7186, - 0xE2C3: 0x7181, - 0xE2C4: 0x7197, - 0xE2C5: 0x7244, - 0xE2C6: 0x7253, - 0xE2C7: 0x7297, - 0xE2C8: 0x7295, - 0xE2C9: 0x7293, - 0xE2CA: 0x7343, - 0xE2CB: 0x734D, - 0xE2CC: 0x7351, - 0xE2CD: 0x734C, - 0xE2CE: 0x7462, - 0xE2CF: 0x7473, - 0xE2D0: 0x7471, - 0xE2D1: 0x7475, - 0xE2D2: 0x7472, - 0xE2D3: 0x7467, - 0xE2D4: 0x746E, - 0xE2D5: 0x7500, - 0xE2D6: 0x7502, - 0xE2D7: 0x7503, - 0xE2D8: 0x757D, - 0xE2D9: 0x7590, - 0xE2DA: 0x7616, - 0xE2DB: 0x7608, - 0xE2DC: 0x760C, - 0xE2DD: 0x7615, - 0xE2DE: 0x7611, - 0xE2DF: 0x760A, - 0xE2E0: 0x7614, - 0xE2E1: 0x76B8, - 0xE2E2: 0x7781, - 0xE2E3: 0x777C, - 0xE2E4: 0x7785, - 0xE2E5: 0x7782, - 0xE2E6: 0x776E, - 0xE2E7: 0x7780, - 0xE2E8: 0x776F, - 0xE2E9: 0x777E, - 0xE2EA: 0x7783, - 0xE2EB: 0x78B2, - 0xE2EC: 0x78AA, - 0xE2ED: 0x78B4, - 0xE2EE: 0x78AD, - 0xE2EF: 0x78A8, - 0xE2F0: 0x787E, - 0xE2F1: 0x78AB, - 0xE2F2: 0x789E, - 0xE2F3: 0x78A5, - 0xE2F4: 0x78A0, - 0xE2F5: 0x78AC, - 0xE2F6: 0x78A2, - 0xE2F7: 0x78A4, - 0xE2F8: 0x7998, - 0xE2F9: 0x798A, - 0xE2FA: 0x798B, - 0xE2FB: 0x7996, - 0xE2FC: 0x7995, - 0xE2FD: 0x7994, - 0xE2FE: 0x7993, - 0xE340: 0x7997, - 0xE341: 0x7988, - 0xE342: 0x7992, - 0xE343: 0x7990, - 0xE344: 0x7A2B, - 0xE345: 0x7A4A, - 0xE346: 0x7A30, - 0xE347: 0x7A2F, - 0xE348: 0x7A28, - 0xE349: 0x7A26, - 0xE34A: 0x7AA8, - 0xE34B: 0x7AAB, - 0xE34C: 0x7AAC, - 0xE34D: 0x7AEE, - 0xE34E: 0x7B88, - 0xE34F: 0x7B9C, - 0xE350: 0x7B8A, - 0xE351: 0x7B91, - 0xE352: 0x7B90, - 0xE353: 0x7B96, - 0xE354: 0x7B8D, - 0xE355: 0x7B8C, - 0xE356: 0x7B9B, - 0xE357: 0x7B8E, - 0xE358: 0x7B85, - 0xE359: 0x7B98, - 0xE35A: 0x5284, - 0xE35B: 0x7B99, - 0xE35C: 0x7BA4, - 0xE35D: 0x7B82, - 0xE35E: 0x7CBB, - 0xE35F: 0x7CBF, - 0xE360: 0x7CBC, - 0xE361: 0x7CBA, - 0xE362: 0x7DA7, - 0xE363: 0x7DB7, - 0xE364: 0x7DC2, - 0xE365: 0x7DA3, - 0xE366: 0x7DAA, - 0xE367: 0x7DC1, - 0xE368: 0x7DC0, - 0xE369: 0x7DC5, - 0xE36A: 0x7D9D, - 0xE36B: 0x7DCE, - 0xE36C: 0x7DC4, - 0xE36D: 0x7DC6, - 0xE36E: 0x7DCB, - 0xE36F: 0x7DCC, - 0xE370: 0x7DAF, - 0xE371: 0x7DB9, - 0xE372: 0x7D96, - 0xE373: 0x7DBC, - 0xE374: 0x7D9F, - 0xE375: 0x7DA6, - 0xE376: 0x7DAE, - 0xE377: 0x7DA9, - 0xE378: 0x7DA1, - 0xE379: 0x7DC9, - 0xE37A: 0x7F73, - 0xE37B: 0x7FE2, - 0xE37C: 0x7FE3, - 0xE37D: 0x7FE5, - 0xE37E: 0x7FDE, - 0xE3A1: 0x8024, - 0xE3A2: 0x805D, - 0xE3A3: 0x805C, - 0xE3A4: 0x8189, - 0xE3A5: 0x8186, - 0xE3A6: 0x8183, - 0xE3A7: 0x8187, - 0xE3A8: 0x818D, - 0xE3A9: 0x818C, - 0xE3AA: 0x818B, - 0xE3AB: 0x8215, - 0xE3AC: 0x8497, - 0xE3AD: 0x84A4, - 0xE3AE: 0x84A1, - 0xE3AF: 0x849F, - 0xE3B0: 0x84BA, - 0xE3B1: 0x84CE, - 0xE3B2: 0x84C2, - 0xE3B3: 0x84AC, - 0xE3B4: 0x84AE, - 0xE3B5: 0x84AB, - 0xE3B6: 0x84B9, - 0xE3B7: 0x84B4, - 0xE3B8: 0x84C1, - 0xE3B9: 0x84CD, - 0xE3BA: 0x84AA, - 0xE3BB: 0x849A, - 0xE3BC: 0x84B1, - 0xE3BD: 0x84D0, - 0xE3BE: 0x849D, - 0xE3BF: 0x84A7, - 0xE3C0: 0x84BB, - 0xE3C1: 0x84A2, - 0xE3C2: 0x8494, - 0xE3C3: 0x84C7, - 0xE3C4: 0x84CC, - 0xE3C5: 0x849B, - 0xE3C6: 0x84A9, - 0xE3C7: 0x84AF, - 0xE3C8: 0x84A8, - 0xE3C9: 0x84D6, - 0xE3CA: 0x8498, - 0xE3CB: 0x84B6, - 0xE3CC: 0x84CF, - 0xE3CD: 0x84A0, - 0xE3CE: 0x84D7, - 0xE3CF: 0x84D4, - 0xE3D0: 0x84D2, - 0xE3D1: 0x84DB, - 0xE3D2: 0x84B0, - 0xE3D3: 0x8491, - 0xE3D4: 0x8661, - 0xE3D5: 0x8733, - 0xE3D6: 0x8723, - 0xE3D7: 0x8728, - 0xE3D8: 0x876B, - 0xE3D9: 0x8740, - 0xE3DA: 0x872E, - 0xE3DB: 0x871E, - 0xE3DC: 0x8721, - 0xE3DD: 0x8719, - 0xE3DE: 0x871B, - 0xE3DF: 0x8743, - 0xE3E0: 0x872C, - 0xE3E1: 0x8741, - 0xE3E2: 0x873E, - 0xE3E3: 0x8746, - 0xE3E4: 0x8720, - 0xE3E5: 0x8732, - 0xE3E6: 0x872A, - 0xE3E7: 0x872D, - 0xE3E8: 0x873C, - 0xE3E9: 0x8712, - 0xE3EA: 0x873A, - 0xE3EB: 0x8731, - 0xE3EC: 0x8735, - 0xE3ED: 0x8742, - 0xE3EE: 0x8726, - 0xE3EF: 0x8727, - 0xE3F0: 0x8738, - 0xE3F1: 0x8724, - 0xE3F2: 0x871A, - 0xE3F3: 0x8730, - 0xE3F4: 0x8711, - 0xE3F5: 0x88F7, - 0xE3F6: 0x88E7, - 0xE3F7: 0x88F1, - 0xE3F8: 0x88F2, - 0xE3F9: 0x88FA, - 0xE3FA: 0x88FE, - 0xE3FB: 0x88EE, - 0xE3FC: 0x88FC, - 0xE3FD: 0x88F6, - 0xE3FE: 0x88FB, - 0xE440: 0x88F0, - 0xE441: 0x88EC, - 0xE442: 0x88EB, - 0xE443: 0x899D, - 0xE444: 0x89A1, - 0xE445: 0x899F, - 0xE446: 0x899E, - 0xE447: 0x89E9, - 0xE448: 0x89EB, - 0xE449: 0x89E8, - 0xE44A: 0x8AAB, - 0xE44B: 0x8A99, - 0xE44C: 0x8A8B, - 0xE44D: 0x8A92, - 0xE44E: 0x8A8F, - 0xE44F: 0x8A96, - 0xE450: 0x8C3D, - 0xE451: 0x8C68, - 0xE452: 0x8C69, - 0xE453: 0x8CD5, - 0xE454: 0x8CCF, - 0xE455: 0x8CD7, - 0xE456: 0x8D96, - 0xE457: 0x8E09, - 0xE458: 0x8E02, - 0xE459: 0x8DFF, - 0xE45A: 0x8E0D, - 0xE45B: 0x8DFD, - 0xE45C: 0x8E0A, - 0xE45D: 0x8E03, - 0xE45E: 0x8E07, - 0xE45F: 0x8E06, - 0xE460: 0x8E05, - 0xE461: 0x8DFE, - 0xE462: 0x8E00, - 0xE463: 0x8E04, - 0xE464: 0x8F10, - 0xE465: 0x8F11, - 0xE466: 0x8F0E, - 0xE467: 0x8F0D, - 0xE468: 0x9123, - 0xE469: 0x911C, - 0xE46A: 0x9120, - 0xE46B: 0x9122, - 0xE46C: 0x911F, - 0xE46D: 0x911D, - 0xE46E: 0x911A, - 0xE46F: 0x9124, - 0xE470: 0x9121, - 0xE471: 0x911B, - 0xE472: 0x917A, - 0xE473: 0x9172, - 0xE474: 0x9179, - 0xE475: 0x9173, - 0xE476: 0x92A5, - 0xE477: 0x92A4, - 0xE478: 0x9276, - 0xE479: 0x929B, - 0xE47A: 0x927A, - 0xE47B: 0x92A0, - 0xE47C: 0x9294, - 0xE47D: 0x92AA, - 0xE47E: 0x928D, - 0xE4A1: 0x92A6, - 0xE4A2: 0x929A, - 0xE4A3: 0x92AB, - 0xE4A4: 0x9279, - 0xE4A5: 0x9297, - 0xE4A6: 0x927F, - 0xE4A7: 0x92A3, - 0xE4A8: 0x92EE, - 0xE4A9: 0x928E, - 0xE4AA: 0x9282, - 0xE4AB: 0x9295, - 0xE4AC: 0x92A2, - 0xE4AD: 0x927D, - 0xE4AE: 0x9288, - 0xE4AF: 0x92A1, - 0xE4B0: 0x928A, - 0xE4B1: 0x9286, - 0xE4B2: 0x928C, - 0xE4B3: 0x9299, - 0xE4B4: 0x92A7, - 0xE4B5: 0x927E, - 0xE4B6: 0x9287, - 0xE4B7: 0x92A9, - 0xE4B8: 0x929D, - 0xE4B9: 0x928B, - 0xE4BA: 0x922D, - 0xE4BB: 0x969E, - 0xE4BC: 0x96A1, - 0xE4BD: 0x96FF, - 0xE4BE: 0x9758, - 0xE4BF: 0x977D, - 0xE4C0: 0x977A, - 0xE4C1: 0x977E, - 0xE4C2: 0x9783, - 0xE4C3: 0x9780, - 0xE4C4: 0x9782, - 0xE4C5: 0x977B, - 0xE4C6: 0x9784, - 0xE4C7: 0x9781, - 0xE4C8: 0x977F, - 0xE4C9: 0x97CE, - 0xE4CA: 0x97CD, - 0xE4CB: 0x9816, - 0xE4CC: 0x98AD, - 0xE4CD: 0x98AE, - 0xE4CE: 0x9902, - 0xE4CF: 0x9900, - 0xE4D0: 0x9907, - 0xE4D1: 0x999D, - 0xE4D2: 0x999C, - 0xE4D3: 0x99C3, - 0xE4D4: 0x99B9, - 0xE4D5: 0x99BB, - 0xE4D6: 0x99BA, - 0xE4D7: 0x99C2, - 0xE4D8: 0x99BD, - 0xE4D9: 0x99C7, - 0xE4DA: 0x9AB1, - 0xE4DB: 0x9AE3, - 0xE4DC: 0x9AE7, - 0xE4DD: 0x9B3E, - 0xE4DE: 0x9B3F, - 0xE4DF: 0x9B60, - 0xE4E0: 0x9B61, - 0xE4E1: 0x9B5F, - 0xE4E2: 0x9CF1, - 0xE4E3: 0x9CF2, - 0xE4E4: 0x9CF5, - 0xE4E5: 0x9EA7, - 0xE4E6: 0x50FF, - 0xE4E7: 0x5103, - 0xE4E8: 0x5130, - 0xE4E9: 0x50F8, - 0xE4EA: 0x5106, - 0xE4EB: 0x5107, - 0xE4EC: 0x50F6, - 0xE4ED: 0x50FE, - 0xE4EE: 0x510B, - 0xE4EF: 0x510C, - 0xE4F0: 0x50FD, - 0xE4F1: 0x510A, - 0xE4F2: 0x528B, - 0xE4F3: 0x528C, - 0xE4F4: 0x52F1, - 0xE4F5: 0x52EF, - 0xE4F6: 0x5648, - 0xE4F7: 0x5642, - 0xE4F8: 0x564C, - 0xE4F9: 0x5635, - 0xE4FA: 0x5641, - 0xE4FB: 0x564A, - 0xE4FC: 0x5649, - 0xE4FD: 0x5646, - 0xE4FE: 0x5658, - 0xE540: 0x565A, - 0xE541: 0x5640, - 0xE542: 0x5633, - 0xE543: 0x563D, - 0xE544: 0x562C, - 0xE545: 0x563E, - 0xE546: 0x5638, - 0xE547: 0x562A, - 0xE548: 0x563A, - 0xE549: 0x571A, - 0xE54A: 0x58AB, - 0xE54B: 0x589D, - 0xE54C: 0x58B1, - 0xE54D: 0x58A0, - 0xE54E: 0x58A3, - 0xE54F: 0x58AF, - 0xE550: 0x58AC, - 0xE551: 0x58A5, - 0xE552: 0x58A1, - 0xE553: 0x58FF, - 0xE554: 0x5AFF, - 0xE555: 0x5AF4, - 0xE556: 0x5AFD, - 0xE557: 0x5AF7, - 0xE558: 0x5AF6, - 0xE559: 0x5B03, - 0xE55A: 0x5AF8, - 0xE55B: 0x5B02, - 0xE55C: 0x5AF9, - 0xE55D: 0x5B01, - 0xE55E: 0x5B07, - 0xE55F: 0x5B05, - 0xE560: 0x5B0F, - 0xE561: 0x5C67, - 0xE562: 0x5D99, - 0xE563: 0x5D97, - 0xE564: 0x5D9F, - 0xE565: 0x5D92, - 0xE566: 0x5DA2, - 0xE567: 0x5D93, - 0xE568: 0x5D95, - 0xE569: 0x5DA0, - 0xE56A: 0x5D9C, - 0xE56B: 0x5DA1, - 0xE56C: 0x5D9A, - 0xE56D: 0x5D9E, - 0xE56E: 0x5E69, - 0xE56F: 0x5E5D, - 0xE570: 0x5E60, - 0xE571: 0x5E5C, - 0xE572: 0x7DF3, - 0xE573: 0x5EDB, - 0xE574: 0x5EDE, - 0xE575: 0x5EE1, - 0xE576: 0x5F49, - 0xE577: 0x5FB2, - 0xE578: 0x618B, - 0xE579: 0x6183, - 0xE57A: 0x6179, - 0xE57B: 0x61B1, - 0xE57C: 0x61B0, - 0xE57D: 0x61A2, - 0xE57E: 0x6189, - 0xE5A1: 0x619B, - 0xE5A2: 0x6193, - 0xE5A3: 0x61AF, - 0xE5A4: 0x61AD, - 0xE5A5: 0x619F, - 0xE5A6: 0x6192, - 0xE5A7: 0x61AA, - 0xE5A8: 0x61A1, - 0xE5A9: 0x618D, - 0xE5AA: 0x6166, - 0xE5AB: 0x61B3, - 0xE5AC: 0x622D, - 0xE5AD: 0x646E, - 0xE5AE: 0x6470, - 0xE5AF: 0x6496, - 0xE5B0: 0x64A0, - 0xE5B1: 0x6485, - 0xE5B2: 0x6497, - 0xE5B3: 0x649C, - 0xE5B4: 0x648F, - 0xE5B5: 0x648B, - 0xE5B6: 0x648A, - 0xE5B7: 0x648C, - 0xE5B8: 0x64A3, - 0xE5B9: 0x649F, - 0xE5BA: 0x6468, - 0xE5BB: 0x64B1, - 0xE5BC: 0x6498, - 0xE5BD: 0x6576, - 0xE5BE: 0x657A, - 0xE5BF: 0x6579, - 0xE5C0: 0x657B, - 0xE5C1: 0x65B2, - 0xE5C2: 0x65B3, - 0xE5C3: 0x66B5, - 0xE5C4: 0x66B0, - 0xE5C5: 0x66A9, - 0xE5C6: 0x66B2, - 0xE5C7: 0x66B7, - 0xE5C8: 0x66AA, - 0xE5C9: 0x66AF, - 0xE5CA: 0x6A00, - 0xE5CB: 0x6A06, - 0xE5CC: 0x6A17, - 0xE5CD: 0x69E5, - 0xE5CE: 0x69F8, - 0xE5CF: 0x6A15, - 0xE5D0: 0x69F1, - 0xE5D1: 0x69E4, - 0xE5D2: 0x6A20, - 0xE5D3: 0x69FF, - 0xE5D4: 0x69EC, - 0xE5D5: 0x69E2, - 0xE5D6: 0x6A1B, - 0xE5D7: 0x6A1D, - 0xE5D8: 0x69FE, - 0xE5D9: 0x6A27, - 0xE5DA: 0x69F2, - 0xE5DB: 0x69EE, - 0xE5DC: 0x6A14, - 0xE5DD: 0x69F7, - 0xE5DE: 0x69E7, - 0xE5DF: 0x6A40, - 0xE5E0: 0x6A08, - 0xE5E1: 0x69E6, - 0xE5E2: 0x69FB, - 0xE5E3: 0x6A0D, - 0xE5E4: 0x69FC, - 0xE5E5: 0x69EB, - 0xE5E6: 0x6A09, - 0xE5E7: 0x6A04, - 0xE5E8: 0x6A18, - 0xE5E9: 0x6A25, - 0xE5EA: 0x6A0F, - 0xE5EB: 0x69F6, - 0xE5EC: 0x6A26, - 0xE5ED: 0x6A07, - 0xE5EE: 0x69F4, - 0xE5EF: 0x6A16, - 0xE5F0: 0x6B51, - 0xE5F1: 0x6BA5, - 0xE5F2: 0x6BA3, - 0xE5F3: 0x6BA2, - 0xE5F4: 0x6BA6, - 0xE5F5: 0x6C01, - 0xE5F6: 0x6C00, - 0xE5F7: 0x6BFF, - 0xE5F8: 0x6C02, - 0xE5F9: 0x6F41, - 0xE5FA: 0x6F26, - 0xE5FB: 0x6F7E, - 0xE5FC: 0x6F87, - 0xE5FD: 0x6FC6, - 0xE5FE: 0x6F92, - 0xE640: 0x6F8D, - 0xE641: 0x6F89, - 0xE642: 0x6F8C, - 0xE643: 0x6F62, - 0xE644: 0x6F4F, - 0xE645: 0x6F85, - 0xE646: 0x6F5A, - 0xE647: 0x6F96, - 0xE648: 0x6F76, - 0xE649: 0x6F6C, - 0xE64A: 0x6F82, - 0xE64B: 0x6F55, - 0xE64C: 0x6F72, - 0xE64D: 0x6F52, - 0xE64E: 0x6F50, - 0xE64F: 0x6F57, - 0xE650: 0x6F94, - 0xE651: 0x6F93, - 0xE652: 0x6F5D, - 0xE653: 0x6F00, - 0xE654: 0x6F61, - 0xE655: 0x6F6B, - 0xE656: 0x6F7D, - 0xE657: 0x6F67, - 0xE658: 0x6F90, - 0xE659: 0x6F53, - 0xE65A: 0x6F8B, - 0xE65B: 0x6F69, - 0xE65C: 0x6F7F, - 0xE65D: 0x6F95, - 0xE65E: 0x6F63, - 0xE65F: 0x6F77, - 0xE660: 0x6F6A, - 0xE661: 0x6F7B, - 0xE662: 0x71B2, - 0xE663: 0x71AF, - 0xE664: 0x719B, - 0xE665: 0x71B0, - 0xE666: 0x71A0, - 0xE667: 0x719A, - 0xE668: 0x71A9, - 0xE669: 0x71B5, - 0xE66A: 0x719D, - 0xE66B: 0x71A5, - 0xE66C: 0x719E, - 0xE66D: 0x71A4, - 0xE66E: 0x71A1, - 0xE66F: 0x71AA, - 0xE670: 0x719C, - 0xE671: 0x71A7, - 0xE672: 0x71B3, - 0xE673: 0x7298, - 0xE674: 0x729A, - 0xE675: 0x7358, - 0xE676: 0x7352, - 0xE677: 0x735E, - 0xE678: 0x735F, - 0xE679: 0x7360, - 0xE67A: 0x735D, - 0xE67B: 0x735B, - 0xE67C: 0x7361, - 0xE67D: 0x735A, - 0xE67E: 0x7359, - 0xE6A1: 0x7362, - 0xE6A2: 0x7487, - 0xE6A3: 0x7489, - 0xE6A4: 0x748A, - 0xE6A5: 0x7486, - 0xE6A6: 0x7481, - 0xE6A7: 0x747D, - 0xE6A8: 0x7485, - 0xE6A9: 0x7488, - 0xE6AA: 0x747C, - 0xE6AB: 0x7479, - 0xE6AC: 0x7508, - 0xE6AD: 0x7507, - 0xE6AE: 0x757E, - 0xE6AF: 0x7625, - 0xE6B0: 0x761E, - 0xE6B1: 0x7619, - 0xE6B2: 0x761D, - 0xE6B3: 0x761C, - 0xE6B4: 0x7623, - 0xE6B5: 0x761A, - 0xE6B6: 0x7628, - 0xE6B7: 0x761B, - 0xE6B8: 0x769C, - 0xE6B9: 0x769D, - 0xE6BA: 0x769E, - 0xE6BB: 0x769B, - 0xE6BC: 0x778D, - 0xE6BD: 0x778F, - 0xE6BE: 0x7789, - 0xE6BF: 0x7788, - 0xE6C0: 0x78CD, - 0xE6C1: 0x78BB, - 0xE6C2: 0x78CF, - 0xE6C3: 0x78CC, - 0xE6C4: 0x78D1, - 0xE6C5: 0x78CE, - 0xE6C6: 0x78D4, - 0xE6C7: 0x78C8, - 0xE6C8: 0x78C3, - 0xE6C9: 0x78C4, - 0xE6CA: 0x78C9, - 0xE6CB: 0x799A, - 0xE6CC: 0x79A1, - 0xE6CD: 0x79A0, - 0xE6CE: 0x799C, - 0xE6CF: 0x79A2, - 0xE6D0: 0x799B, - 0xE6D1: 0x6B76, - 0xE6D2: 0x7A39, - 0xE6D3: 0x7AB2, - 0xE6D4: 0x7AB4, - 0xE6D5: 0x7AB3, - 0xE6D6: 0x7BB7, - 0xE6D7: 0x7BCB, - 0xE6D8: 0x7BBE, - 0xE6D9: 0x7BAC, - 0xE6DA: 0x7BCE, - 0xE6DB: 0x7BAF, - 0xE6DC: 0x7BB9, - 0xE6DD: 0x7BCA, - 0xE6DE: 0x7BB5, - 0xE6DF: 0x7CC5, - 0xE6E0: 0x7CC8, - 0xE6E1: 0x7CCC, - 0xE6E2: 0x7CCB, - 0xE6E3: 0x7DF7, - 0xE6E4: 0x7DDB, - 0xE6E5: 0x7DEA, - 0xE6E6: 0x7DE7, - 0xE6E7: 0x7DD7, - 0xE6E8: 0x7DE1, - 0xE6E9: 0x7E03, - 0xE6EA: 0x7DFA, - 0xE6EB: 0x7DE6, - 0xE6EC: 0x7DF6, - 0xE6ED: 0x7DF1, - 0xE6EE: 0x7DF0, - 0xE6EF: 0x7DEE, - 0xE6F0: 0x7DDF, - 0xE6F1: 0x7F76, - 0xE6F2: 0x7FAC, - 0xE6F3: 0x7FB0, - 0xE6F4: 0x7FAD, - 0xE6F5: 0x7FED, - 0xE6F6: 0x7FEB, - 0xE6F7: 0x7FEA, - 0xE6F8: 0x7FEC, - 0xE6F9: 0x7FE6, - 0xE6FA: 0x7FE8, - 0xE6FB: 0x8064, - 0xE6FC: 0x8067, - 0xE6FD: 0x81A3, - 0xE6FE: 0x819F, - 0xE740: 0x819E, - 0xE741: 0x8195, - 0xE742: 0x81A2, - 0xE743: 0x8199, - 0xE744: 0x8197, - 0xE745: 0x8216, - 0xE746: 0x824F, - 0xE747: 0x8253, - 0xE748: 0x8252, - 0xE749: 0x8250, - 0xE74A: 0x824E, - 0xE74B: 0x8251, - 0xE74C: 0x8524, - 0xE74D: 0x853B, - 0xE74E: 0x850F, - 0xE74F: 0x8500, - 0xE750: 0x8529, - 0xE751: 0x850E, - 0xE752: 0x8509, - 0xE753: 0x850D, - 0xE754: 0x851F, - 0xE755: 0x850A, - 0xE756: 0x8527, - 0xE757: 0x851C, - 0xE758: 0x84FB, - 0xE759: 0x852B, - 0xE75A: 0x84FA, - 0xE75B: 0x8508, - 0xE75C: 0x850C, - 0xE75D: 0x84F4, - 0xE75E: 0x852A, - 0xE75F: 0x84F2, - 0xE760: 0x8515, - 0xE761: 0x84F7, - 0xE762: 0x84EB, - 0xE763: 0x84F3, - 0xE764: 0x84FC, - 0xE765: 0x8512, - 0xE766: 0x84EA, - 0xE767: 0x84E9, - 0xE768: 0x8516, - 0xE769: 0x84FE, - 0xE76A: 0x8528, - 0xE76B: 0x851D, - 0xE76C: 0x852E, - 0xE76D: 0x8502, - 0xE76E: 0x84FD, - 0xE76F: 0x851E, - 0xE770: 0x84F6, - 0xE771: 0x8531, - 0xE772: 0x8526, - 0xE773: 0x84E7, - 0xE774: 0x84E8, - 0xE775: 0x84F0, - 0xE776: 0x84EF, - 0xE777: 0x84F9, - 0xE778: 0x8518, - 0xE779: 0x8520, - 0xE77A: 0x8530, - 0xE77B: 0x850B, - 0xE77C: 0x8519, - 0xE77D: 0x852F, - 0xE77E: 0x8662, - 0xE7A1: 0x8756, - 0xE7A2: 0x8763, - 0xE7A3: 0x8764, - 0xE7A4: 0x8777, - 0xE7A5: 0x87E1, - 0xE7A6: 0x8773, - 0xE7A7: 0x8758, - 0xE7A8: 0x8754, - 0xE7A9: 0x875B, - 0xE7AA: 0x8752, - 0xE7AB: 0x8761, - 0xE7AC: 0x875A, - 0xE7AD: 0x8751, - 0xE7AE: 0x875E, - 0xE7AF: 0x876D, - 0xE7B0: 0x876A, - 0xE7B1: 0x8750, - 0xE7B2: 0x874E, - 0xE7B3: 0x875F, - 0xE7B4: 0x875D, - 0xE7B5: 0x876F, - 0xE7B6: 0x876C, - 0xE7B7: 0x877A, - 0xE7B8: 0x876E, - 0xE7B9: 0x875C, - 0xE7BA: 0x8765, - 0xE7BB: 0x874F, - 0xE7BC: 0x877B, - 0xE7BD: 0x8775, - 0xE7BE: 0x8762, - 0xE7BF: 0x8767, - 0xE7C0: 0x8769, - 0xE7C1: 0x885A, - 0xE7C2: 0x8905, - 0xE7C3: 0x890C, - 0xE7C4: 0x8914, - 0xE7C5: 0x890B, - 0xE7C6: 0x8917, - 0xE7C7: 0x8918, - 0xE7C8: 0x8919, - 0xE7C9: 0x8906, - 0xE7CA: 0x8916, - 0xE7CB: 0x8911, - 0xE7CC: 0x890E, - 0xE7CD: 0x8909, - 0xE7CE: 0x89A2, - 0xE7CF: 0x89A4, - 0xE7D0: 0x89A3, - 0xE7D1: 0x89ED, - 0xE7D2: 0x89F0, - 0xE7D3: 0x89EC, - 0xE7D4: 0x8ACF, - 0xE7D5: 0x8AC6, - 0xE7D6: 0x8AB8, - 0xE7D7: 0x8AD3, - 0xE7D8: 0x8AD1, - 0xE7D9: 0x8AD4, - 0xE7DA: 0x8AD5, - 0xE7DB: 0x8ABB, - 0xE7DC: 0x8AD7, - 0xE7DD: 0x8ABE, - 0xE7DE: 0x8AC0, - 0xE7DF: 0x8AC5, - 0xE7E0: 0x8AD8, - 0xE7E1: 0x8AC3, - 0xE7E2: 0x8ABA, - 0xE7E3: 0x8ABD, - 0xE7E4: 0x8AD9, - 0xE7E5: 0x8C3E, - 0xE7E6: 0x8C4D, - 0xE7E7: 0x8C8F, - 0xE7E8: 0x8CE5, - 0xE7E9: 0x8CDF, - 0xE7EA: 0x8CD9, - 0xE7EB: 0x8CE8, - 0xE7EC: 0x8CDA, - 0xE7ED: 0x8CDD, - 0xE7EE: 0x8CE7, - 0xE7EF: 0x8DA0, - 0xE7F0: 0x8D9C, - 0xE7F1: 0x8DA1, - 0xE7F2: 0x8D9B, - 0xE7F3: 0x8E20, - 0xE7F4: 0x8E23, - 0xE7F5: 0x8E25, - 0xE7F6: 0x8E24, - 0xE7F7: 0x8E2E, - 0xE7F8: 0x8E15, - 0xE7F9: 0x8E1B, - 0xE7FA: 0x8E16, - 0xE7FB: 0x8E11, - 0xE7FC: 0x8E19, - 0xE7FD: 0x8E26, - 0xE7FE: 0x8E27, - 0xE840: 0x8E14, - 0xE841: 0x8E12, - 0xE842: 0x8E18, - 0xE843: 0x8E13, - 0xE844: 0x8E1C, - 0xE845: 0x8E17, - 0xE846: 0x8E1A, - 0xE847: 0x8F2C, - 0xE848: 0x8F24, - 0xE849: 0x8F18, - 0xE84A: 0x8F1A, - 0xE84B: 0x8F20, - 0xE84C: 0x8F23, - 0xE84D: 0x8F16, - 0xE84E: 0x8F17, - 0xE84F: 0x9073, - 0xE850: 0x9070, - 0xE851: 0x906F, - 0xE852: 0x9067, - 0xE853: 0x906B, - 0xE854: 0x912F, - 0xE855: 0x912B, - 0xE856: 0x9129, - 0xE857: 0x912A, - 0xE858: 0x9132, - 0xE859: 0x9126, - 0xE85A: 0x912E, - 0xE85B: 0x9185, - 0xE85C: 0x9186, - 0xE85D: 0x918A, - 0xE85E: 0x9181, - 0xE85F: 0x9182, - 0xE860: 0x9184, - 0xE861: 0x9180, - 0xE862: 0x92D0, - 0xE863: 0x92C3, - 0xE864: 0x92C4, - 0xE865: 0x92C0, - 0xE866: 0x92D9, - 0xE867: 0x92B6, - 0xE868: 0x92CF, - 0xE869: 0x92F1, - 0xE86A: 0x92DF, - 0xE86B: 0x92D8, - 0xE86C: 0x92E9, - 0xE86D: 0x92D7, - 0xE86E: 0x92DD, - 0xE86F: 0x92CC, - 0xE870: 0x92EF, - 0xE871: 0x92C2, - 0xE872: 0x92E8, - 0xE873: 0x92CA, - 0xE874: 0x92C8, - 0xE875: 0x92CE, - 0xE876: 0x92E6, - 0xE877: 0x92CD, - 0xE878: 0x92D5, - 0xE879: 0x92C9, - 0xE87A: 0x92E0, - 0xE87B: 0x92DE, - 0xE87C: 0x92E7, - 0xE87D: 0x92D1, - 0xE87E: 0x92D3, - 0xE8A1: 0x92B5, - 0xE8A2: 0x92E1, - 0xE8A3: 0x92C6, - 0xE8A4: 0x92B4, - 0xE8A5: 0x957C, - 0xE8A6: 0x95AC, - 0xE8A7: 0x95AB, - 0xE8A8: 0x95AE, - 0xE8A9: 0x95B0, - 0xE8AA: 0x96A4, - 0xE8AB: 0x96A2, - 0xE8AC: 0x96D3, - 0xE8AD: 0x9705, - 0xE8AE: 0x9708, - 0xE8AF: 0x9702, - 0xE8B0: 0x975A, - 0xE8B1: 0x978A, - 0xE8B2: 0x978E, - 0xE8B3: 0x9788, - 0xE8B4: 0x97D0, - 0xE8B5: 0x97CF, - 0xE8B6: 0x981E, - 0xE8B7: 0x981D, - 0xE8B8: 0x9826, - 0xE8B9: 0x9829, - 0xE8BA: 0x9828, - 0xE8BB: 0x9820, - 0xE8BC: 0x981B, - 0xE8BD: 0x9827, - 0xE8BE: 0x98B2, - 0xE8BF: 0x9908, - 0xE8C0: 0x98FA, - 0xE8C1: 0x9911, - 0xE8C2: 0x9914, - 0xE8C3: 0x9916, - 0xE8C4: 0x9917, - 0xE8C5: 0x9915, - 0xE8C6: 0x99DC, - 0xE8C7: 0x99CD, - 0xE8C8: 0x99CF, - 0xE8C9: 0x99D3, - 0xE8CA: 0x99D4, - 0xE8CB: 0x99CE, - 0xE8CC: 0x99C9, - 0xE8CD: 0x99D6, - 0xE8CE: 0x99D8, - 0xE8CF: 0x99CB, - 0xE8D0: 0x99D7, - 0xE8D1: 0x99CC, - 0xE8D2: 0x9AB3, - 0xE8D3: 0x9AEC, - 0xE8D4: 0x9AEB, - 0xE8D5: 0x9AF3, - 0xE8D6: 0x9AF2, - 0xE8D7: 0x9AF1, - 0xE8D8: 0x9B46, - 0xE8D9: 0x9B43, - 0xE8DA: 0x9B67, - 0xE8DB: 0x9B74, - 0xE8DC: 0x9B71, - 0xE8DD: 0x9B66, - 0xE8DE: 0x9B76, - 0xE8DF: 0x9B75, - 0xE8E0: 0x9B70, - 0xE8E1: 0x9B68, - 0xE8E2: 0x9B64, - 0xE8E3: 0x9B6C, - 0xE8E4: 0x9CFC, - 0xE8E5: 0x9CFA, - 0xE8E6: 0x9CFD, - 0xE8E7: 0x9CFF, - 0xE8E8: 0x9CF7, - 0xE8E9: 0x9D07, - 0xE8EA: 0x9D00, - 0xE8EB: 0x9CF9, - 0xE8EC: 0x9CFB, - 0xE8ED: 0x9D08, - 0xE8EE: 0x9D05, - 0xE8EF: 0x9D04, - 0xE8F0: 0x9E83, - 0xE8F1: 0x9ED3, - 0xE8F2: 0x9F0F, - 0xE8F3: 0x9F10, - 0xE8F4: 0x511C, - 0xE8F5: 0x5113, - 0xE8F6: 0x5117, - 0xE8F7: 0x511A, - 0xE8F8: 0x5111, - 0xE8F9: 0x51DE, - 0xE8FA: 0x5334, - 0xE8FB: 0x53E1, - 0xE8FC: 0x5670, - 0xE8FD: 0x5660, - 0xE8FE: 0x566E, - 0xE940: 0x5673, - 0xE941: 0x5666, - 0xE942: 0x5663, - 0xE943: 0x566D, - 0xE944: 0x5672, - 0xE945: 0x565E, - 0xE946: 0x5677, - 0xE947: 0x571C, - 0xE948: 0x571B, - 0xE949: 0x58C8, - 0xE94A: 0x58BD, - 0xE94B: 0x58C9, - 0xE94C: 0x58BF, - 0xE94D: 0x58BA, - 0xE94E: 0x58C2, - 0xE94F: 0x58BC, - 0xE950: 0x58C6, - 0xE951: 0x5B17, - 0xE952: 0x5B19, - 0xE953: 0x5B1B, - 0xE954: 0x5B21, - 0xE955: 0x5B14, - 0xE956: 0x5B13, - 0xE957: 0x5B10, - 0xE958: 0x5B16, - 0xE959: 0x5B28, - 0xE95A: 0x5B1A, - 0xE95B: 0x5B20, - 0xE95C: 0x5B1E, - 0xE95D: 0x5BEF, - 0xE95E: 0x5DAC, - 0xE95F: 0x5DB1, - 0xE960: 0x5DA9, - 0xE961: 0x5DA7, - 0xE962: 0x5DB5, - 0xE963: 0x5DB0, - 0xE964: 0x5DAE, - 0xE965: 0x5DAA, - 0xE966: 0x5DA8, - 0xE967: 0x5DB2, - 0xE968: 0x5DAD, - 0xE969: 0x5DAF, - 0xE96A: 0x5DB4, - 0xE96B: 0x5E67, - 0xE96C: 0x5E68, - 0xE96D: 0x5E66, - 0xE96E: 0x5E6F, - 0xE96F: 0x5EE9, - 0xE970: 0x5EE7, - 0xE971: 0x5EE6, - 0xE972: 0x5EE8, - 0xE973: 0x5EE5, - 0xE974: 0x5F4B, - 0xE975: 0x5FBC, - 0xE976: 0x619D, - 0xE977: 0x61A8, - 0xE978: 0x6196, - 0xE979: 0x61C5, - 0xE97A: 0x61B4, - 0xE97B: 0x61C6, - 0xE97C: 0x61C1, - 0xE97D: 0x61CC, - 0xE97E: 0x61BA, - 0xE9A1: 0x61BF, - 0xE9A2: 0x61B8, - 0xE9A3: 0x618C, - 0xE9A4: 0x64D7, - 0xE9A5: 0x64D6, - 0xE9A6: 0x64D0, - 0xE9A7: 0x64CF, - 0xE9A8: 0x64C9, - 0xE9A9: 0x64BD, - 0xE9AA: 0x6489, - 0xE9AB: 0x64C3, - 0xE9AC: 0x64DB, - 0xE9AD: 0x64F3, - 0xE9AE: 0x64D9, - 0xE9AF: 0x6533, - 0xE9B0: 0x657F, - 0xE9B1: 0x657C, - 0xE9B2: 0x65A2, - 0xE9B3: 0x66C8, - 0xE9B4: 0x66BE, - 0xE9B5: 0x66C0, - 0xE9B6: 0x66CA, - 0xE9B7: 0x66CB, - 0xE9B8: 0x66CF, - 0xE9B9: 0x66BD, - 0xE9BA: 0x66BB, - 0xE9BB: 0x66BA, - 0xE9BC: 0x66CC, - 0xE9BD: 0x6723, - 0xE9BE: 0x6A34, - 0xE9BF: 0x6A66, - 0xE9C0: 0x6A49, - 0xE9C1: 0x6A67, - 0xE9C2: 0x6A32, - 0xE9C3: 0x6A68, - 0xE9C4: 0x6A3E, - 0xE9C5: 0x6A5D, - 0xE9C6: 0x6A6D, - 0xE9C7: 0x6A76, - 0xE9C8: 0x6A5B, - 0xE9C9: 0x6A51, - 0xE9CA: 0x6A28, - 0xE9CB: 0x6A5A, - 0xE9CC: 0x6A3B, - 0xE9CD: 0x6A3F, - 0xE9CE: 0x6A41, - 0xE9CF: 0x6A6A, - 0xE9D0: 0x6A64, - 0xE9D1: 0x6A50, - 0xE9D2: 0x6A4F, - 0xE9D3: 0x6A54, - 0xE9D4: 0x6A6F, - 0xE9D5: 0x6A69, - 0xE9D6: 0x6A60, - 0xE9D7: 0x6A3C, - 0xE9D8: 0x6A5E, - 0xE9D9: 0x6A56, - 0xE9DA: 0x6A55, - 0xE9DB: 0x6A4D, - 0xE9DC: 0x6A4E, - 0xE9DD: 0x6A46, - 0xE9DE: 0x6B55, - 0xE9DF: 0x6B54, - 0xE9E0: 0x6B56, - 0xE9E1: 0x6BA7, - 0xE9E2: 0x6BAA, - 0xE9E3: 0x6BAB, - 0xE9E4: 0x6BC8, - 0xE9E5: 0x6BC7, - 0xE9E6: 0x6C04, - 0xE9E7: 0x6C03, - 0xE9E8: 0x6C06, - 0xE9E9: 0x6FAD, - 0xE9EA: 0x6FCB, - 0xE9EB: 0x6FA3, - 0xE9EC: 0x6FC7, - 0xE9ED: 0x6FBC, - 0xE9EE: 0x6FCE, - 0xE9EF: 0x6FC8, - 0xE9F0: 0x6F5E, - 0xE9F1: 0x6FC4, - 0xE9F2: 0x6FBD, - 0xE9F3: 0x6F9E, - 0xE9F4: 0x6FCA, - 0xE9F5: 0x6FA8, - 0xE9F6: 0x7004, - 0xE9F7: 0x6FA5, - 0xE9F8: 0x6FAE, - 0xE9F9: 0x6FBA, - 0xE9FA: 0x6FAC, - 0xE9FB: 0x6FAA, - 0xE9FC: 0x6FCF, - 0xE9FD: 0x6FBF, - 0xE9FE: 0x6FB8, - 0xEA40: 0x6FA2, - 0xEA41: 0x6FC9, - 0xEA42: 0x6FAB, - 0xEA43: 0x6FCD, - 0xEA44: 0x6FAF, - 0xEA45: 0x6FB2, - 0xEA46: 0x6FB0, - 0xEA47: 0x71C5, - 0xEA48: 0x71C2, - 0xEA49: 0x71BF, - 0xEA4A: 0x71B8, - 0xEA4B: 0x71D6, - 0xEA4C: 0x71C0, - 0xEA4D: 0x71C1, - 0xEA4E: 0x71CB, - 0xEA4F: 0x71D4, - 0xEA50: 0x71CA, - 0xEA51: 0x71C7, - 0xEA52: 0x71CF, - 0xEA53: 0x71BD, - 0xEA54: 0x71D8, - 0xEA55: 0x71BC, - 0xEA56: 0x71C6, - 0xEA57: 0x71DA, - 0xEA58: 0x71DB, - 0xEA59: 0x729D, - 0xEA5A: 0x729E, - 0xEA5B: 0x7369, - 0xEA5C: 0x7366, - 0xEA5D: 0x7367, - 0xEA5E: 0x736C, - 0xEA5F: 0x7365, - 0xEA60: 0x736B, - 0xEA61: 0x736A, - 0xEA62: 0x747F, - 0xEA63: 0x749A, - 0xEA64: 0x74A0, - 0xEA65: 0x7494, - 0xEA66: 0x7492, - 0xEA67: 0x7495, - 0xEA68: 0x74A1, - 0xEA69: 0x750B, - 0xEA6A: 0x7580, - 0xEA6B: 0x762F, - 0xEA6C: 0x762D, - 0xEA6D: 0x7631, - 0xEA6E: 0x763D, - 0xEA6F: 0x7633, - 0xEA70: 0x763C, - 0xEA71: 0x7635, - 0xEA72: 0x7632, - 0xEA73: 0x7630, - 0xEA74: 0x76BB, - 0xEA75: 0x76E6, - 0xEA76: 0x779A, - 0xEA77: 0x779D, - 0xEA78: 0x77A1, - 0xEA79: 0x779C, - 0xEA7A: 0x779B, - 0xEA7B: 0x77A2, - 0xEA7C: 0x77A3, - 0xEA7D: 0x7795, - 0xEA7E: 0x7799, - 0xEAA1: 0x7797, - 0xEAA2: 0x78DD, - 0xEAA3: 0x78E9, - 0xEAA4: 0x78E5, - 0xEAA5: 0x78EA, - 0xEAA6: 0x78DE, - 0xEAA7: 0x78E3, - 0xEAA8: 0x78DB, - 0xEAA9: 0x78E1, - 0xEAAA: 0x78E2, - 0xEAAB: 0x78ED, - 0xEAAC: 0x78DF, - 0xEAAD: 0x78E0, - 0xEAAE: 0x79A4, - 0xEAAF: 0x7A44, - 0xEAB0: 0x7A48, - 0xEAB1: 0x7A47, - 0xEAB2: 0x7AB6, - 0xEAB3: 0x7AB8, - 0xEAB4: 0x7AB5, - 0xEAB5: 0x7AB1, - 0xEAB6: 0x7AB7, - 0xEAB7: 0x7BDE, - 0xEAB8: 0x7BE3, - 0xEAB9: 0x7BE7, - 0xEABA: 0x7BDD, - 0xEABB: 0x7BD5, - 0xEABC: 0x7BE5, - 0xEABD: 0x7BDA, - 0xEABE: 0x7BE8, - 0xEABF: 0x7BF9, - 0xEAC0: 0x7BD4, - 0xEAC1: 0x7BEA, - 0xEAC2: 0x7BE2, - 0xEAC3: 0x7BDC, - 0xEAC4: 0x7BEB, - 0xEAC5: 0x7BD8, - 0xEAC6: 0x7BDF, - 0xEAC7: 0x7CD2, - 0xEAC8: 0x7CD4, - 0xEAC9: 0x7CD7, - 0xEACA: 0x7CD0, - 0xEACB: 0x7CD1, - 0xEACC: 0x7E12, - 0xEACD: 0x7E21, - 0xEACE: 0x7E17, - 0xEACF: 0x7E0C, - 0xEAD0: 0x7E1F, - 0xEAD1: 0x7E20, - 0xEAD2: 0x7E13, - 0xEAD3: 0x7E0E, - 0xEAD4: 0x7E1C, - 0xEAD5: 0x7E15, - 0xEAD6: 0x7E1A, - 0xEAD7: 0x7E22, - 0xEAD8: 0x7E0B, - 0xEAD9: 0x7E0F, - 0xEADA: 0x7E16, - 0xEADB: 0x7E0D, - 0xEADC: 0x7E14, - 0xEADD: 0x7E25, - 0xEADE: 0x7E24, - 0xEADF: 0x7F43, - 0xEAE0: 0x7F7B, - 0xEAE1: 0x7F7C, - 0xEAE2: 0x7F7A, - 0xEAE3: 0x7FB1, - 0xEAE4: 0x7FEF, - 0xEAE5: 0x802A, - 0xEAE6: 0x8029, - 0xEAE7: 0x806C, - 0xEAE8: 0x81B1, - 0xEAE9: 0x81A6, - 0xEAEA: 0x81AE, - 0xEAEB: 0x81B9, - 0xEAEC: 0x81B5, - 0xEAED: 0x81AB, - 0xEAEE: 0x81B0, - 0xEAEF: 0x81AC, - 0xEAF0: 0x81B4, - 0xEAF1: 0x81B2, - 0xEAF2: 0x81B7, - 0xEAF3: 0x81A7, - 0xEAF4: 0x81F2, - 0xEAF5: 0x8255, - 0xEAF6: 0x8256, - 0xEAF7: 0x8257, - 0xEAF8: 0x8556, - 0xEAF9: 0x8545, - 0xEAFA: 0x856B, - 0xEAFB: 0x854D, - 0xEAFC: 0x8553, - 0xEAFD: 0x8561, - 0xEAFE: 0x8558, - 0xEB40: 0x8540, - 0xEB41: 0x8546, - 0xEB42: 0x8564, - 0xEB43: 0x8541, - 0xEB44: 0x8562, - 0xEB45: 0x8544, - 0xEB46: 0x8551, - 0xEB47: 0x8547, - 0xEB48: 0x8563, - 0xEB49: 0x853E, - 0xEB4A: 0x855B, - 0xEB4B: 0x8571, - 0xEB4C: 0x854E, - 0xEB4D: 0x856E, - 0xEB4E: 0x8575, - 0xEB4F: 0x8555, - 0xEB50: 0x8567, - 0xEB51: 0x8560, - 0xEB52: 0x858C, - 0xEB53: 0x8566, - 0xEB54: 0x855D, - 0xEB55: 0x8554, - 0xEB56: 0x8565, - 0xEB57: 0x856C, - 0xEB58: 0x8663, - 0xEB59: 0x8665, - 0xEB5A: 0x8664, - 0xEB5B: 0x879B, - 0xEB5C: 0x878F, - 0xEB5D: 0x8797, - 0xEB5E: 0x8793, - 0xEB5F: 0x8792, - 0xEB60: 0x8788, - 0xEB61: 0x8781, - 0xEB62: 0x8796, - 0xEB63: 0x8798, - 0xEB64: 0x8779, - 0xEB65: 0x8787, - 0xEB66: 0x87A3, - 0xEB67: 0x8785, - 0xEB68: 0x8790, - 0xEB69: 0x8791, - 0xEB6A: 0x879D, - 0xEB6B: 0x8784, - 0xEB6C: 0x8794, - 0xEB6D: 0x879C, - 0xEB6E: 0x879A, - 0xEB6F: 0x8789, - 0xEB70: 0x891E, - 0xEB71: 0x8926, - 0xEB72: 0x8930, - 0xEB73: 0x892D, - 0xEB74: 0x892E, - 0xEB75: 0x8927, - 0xEB76: 0x8931, - 0xEB77: 0x8922, - 0xEB78: 0x8929, - 0xEB79: 0x8923, - 0xEB7A: 0x892F, - 0xEB7B: 0x892C, - 0xEB7C: 0x891F, - 0xEB7D: 0x89F1, - 0xEB7E: 0x8AE0, - 0xEBA1: 0x8AE2, - 0xEBA2: 0x8AF2, - 0xEBA3: 0x8AF4, - 0xEBA4: 0x8AF5, - 0xEBA5: 0x8ADD, - 0xEBA6: 0x8B14, - 0xEBA7: 0x8AE4, - 0xEBA8: 0x8ADF, - 0xEBA9: 0x8AF0, - 0xEBAA: 0x8AC8, - 0xEBAB: 0x8ADE, - 0xEBAC: 0x8AE1, - 0xEBAD: 0x8AE8, - 0xEBAE: 0x8AFF, - 0xEBAF: 0x8AEF, - 0xEBB0: 0x8AFB, - 0xEBB1: 0x8C91, - 0xEBB2: 0x8C92, - 0xEBB3: 0x8C90, - 0xEBB4: 0x8CF5, - 0xEBB5: 0x8CEE, - 0xEBB6: 0x8CF1, - 0xEBB7: 0x8CF0, - 0xEBB8: 0x8CF3, - 0xEBB9: 0x8D6C, - 0xEBBA: 0x8D6E, - 0xEBBB: 0x8DA5, - 0xEBBC: 0x8DA7, - 0xEBBD: 0x8E33, - 0xEBBE: 0x8E3E, - 0xEBBF: 0x8E38, - 0xEBC0: 0x8E40, - 0xEBC1: 0x8E45, - 0xEBC2: 0x8E36, - 0xEBC3: 0x8E3C, - 0xEBC4: 0x8E3D, - 0xEBC5: 0x8E41, - 0xEBC6: 0x8E30, - 0xEBC7: 0x8E3F, - 0xEBC8: 0x8EBD, - 0xEBC9: 0x8F36, - 0xEBCA: 0x8F2E, - 0xEBCB: 0x8F35, - 0xEBCC: 0x8F32, - 0xEBCD: 0x8F39, - 0xEBCE: 0x8F37, - 0xEBCF: 0x8F34, - 0xEBD0: 0x9076, - 0xEBD1: 0x9079, - 0xEBD2: 0x907B, - 0xEBD3: 0x9086, - 0xEBD4: 0x90FA, - 0xEBD5: 0x9133, - 0xEBD6: 0x9135, - 0xEBD7: 0x9136, - 0xEBD8: 0x9193, - 0xEBD9: 0x9190, - 0xEBDA: 0x9191, - 0xEBDB: 0x918D, - 0xEBDC: 0x918F, - 0xEBDD: 0x9327, - 0xEBDE: 0x931E, - 0xEBDF: 0x9308, - 0xEBE0: 0x931F, - 0xEBE1: 0x9306, - 0xEBE2: 0x930F, - 0xEBE3: 0x937A, - 0xEBE4: 0x9338, - 0xEBE5: 0x933C, - 0xEBE6: 0x931B, - 0xEBE7: 0x9323, - 0xEBE8: 0x9312, - 0xEBE9: 0x9301, - 0xEBEA: 0x9346, - 0xEBEB: 0x932D, - 0xEBEC: 0x930E, - 0xEBED: 0x930D, - 0xEBEE: 0x92CB, - 0xEBEF: 0x931D, - 0xEBF0: 0x92FA, - 0xEBF1: 0x9325, - 0xEBF2: 0x9313, - 0xEBF3: 0x92F9, - 0xEBF4: 0x92F7, - 0xEBF5: 0x9334, - 0xEBF6: 0x9302, - 0xEBF7: 0x9324, - 0xEBF8: 0x92FF, - 0xEBF9: 0x9329, - 0xEBFA: 0x9339, - 0xEBFB: 0x9335, - 0xEBFC: 0x932A, - 0xEBFD: 0x9314, - 0xEBFE: 0x930C, - 0xEC40: 0x930B, - 0xEC41: 0x92FE, - 0xEC42: 0x9309, - 0xEC43: 0x9300, - 0xEC44: 0x92FB, - 0xEC45: 0x9316, - 0xEC46: 0x95BC, - 0xEC47: 0x95CD, - 0xEC48: 0x95BE, - 0xEC49: 0x95B9, - 0xEC4A: 0x95BA, - 0xEC4B: 0x95B6, - 0xEC4C: 0x95BF, - 0xEC4D: 0x95B5, - 0xEC4E: 0x95BD, - 0xEC4F: 0x96A9, - 0xEC50: 0x96D4, - 0xEC51: 0x970B, - 0xEC52: 0x9712, - 0xEC53: 0x9710, - 0xEC54: 0x9799, - 0xEC55: 0x9797, - 0xEC56: 0x9794, - 0xEC57: 0x97F0, - 0xEC58: 0x97F8, - 0xEC59: 0x9835, - 0xEC5A: 0x982F, - 0xEC5B: 0x9832, - 0xEC5C: 0x9924, - 0xEC5D: 0x991F, - 0xEC5E: 0x9927, - 0xEC5F: 0x9929, - 0xEC60: 0x999E, - 0xEC61: 0x99EE, - 0xEC62: 0x99EC, - 0xEC63: 0x99E5, - 0xEC64: 0x99E4, - 0xEC65: 0x99F0, - 0xEC66: 0x99E3, - 0xEC67: 0x99EA, - 0xEC68: 0x99E9, - 0xEC69: 0x99E7, - 0xEC6A: 0x9AB9, - 0xEC6B: 0x9ABF, - 0xEC6C: 0x9AB4, - 0xEC6D: 0x9ABB, - 0xEC6E: 0x9AF6, - 0xEC6F: 0x9AFA, - 0xEC70: 0x9AF9, - 0xEC71: 0x9AF7, - 0xEC72: 0x9B33, - 0xEC73: 0x9B80, - 0xEC74: 0x9B85, - 0xEC75: 0x9B87, - 0xEC76: 0x9B7C, - 0xEC77: 0x9B7E, - 0xEC78: 0x9B7B, - 0xEC79: 0x9B82, - 0xEC7A: 0x9B93, - 0xEC7B: 0x9B92, - 0xEC7C: 0x9B90, - 0xEC7D: 0x9B7A, - 0xEC7E: 0x9B95, - 0xECA1: 0x9B7D, - 0xECA2: 0x9B88, - 0xECA3: 0x9D25, - 0xECA4: 0x9D17, - 0xECA5: 0x9D20, - 0xECA6: 0x9D1E, - 0xECA7: 0x9D14, - 0xECA8: 0x9D29, - 0xECA9: 0x9D1D, - 0xECAA: 0x9D18, - 0xECAB: 0x9D22, - 0xECAC: 0x9D10, - 0xECAD: 0x9D19, - 0xECAE: 0x9D1F, - 0xECAF: 0x9E88, - 0xECB0: 0x9E86, - 0xECB1: 0x9E87, - 0xECB2: 0x9EAE, - 0xECB3: 0x9EAD, - 0xECB4: 0x9ED5, - 0xECB5: 0x9ED6, - 0xECB6: 0x9EFA, - 0xECB7: 0x9F12, - 0xECB8: 0x9F3D, - 0xECB9: 0x5126, - 0xECBA: 0x5125, - 0xECBB: 0x5122, - 0xECBC: 0x5124, - 0xECBD: 0x5120, - 0xECBE: 0x5129, - 0xECBF: 0x52F4, - 0xECC0: 0x5693, - 0xECC1: 0x568C, - 0xECC2: 0x568D, - 0xECC3: 0x5686, - 0xECC4: 0x5684, - 0xECC5: 0x5683, - 0xECC6: 0x567E, - 0xECC7: 0x5682, - 0xECC8: 0x567F, - 0xECC9: 0x5681, - 0xECCA: 0x58D6, - 0xECCB: 0x58D4, - 0xECCC: 0x58CF, - 0xECCD: 0x58D2, - 0xECCE: 0x5B2D, - 0xECCF: 0x5B25, - 0xECD0: 0x5B32, - 0xECD1: 0x5B23, - 0xECD2: 0x5B2C, - 0xECD3: 0x5B27, - 0xECD4: 0x5B26, - 0xECD5: 0x5B2F, - 0xECD6: 0x5B2E, - 0xECD7: 0x5B7B, - 0xECD8: 0x5BF1, - 0xECD9: 0x5BF2, - 0xECDA: 0x5DB7, - 0xECDB: 0x5E6C, - 0xECDC: 0x5E6A, - 0xECDD: 0x5FBE, - 0xECDE: 0x5FBB, - 0xECDF: 0x61C3, - 0xECE0: 0x61B5, - 0xECE1: 0x61BC, - 0xECE2: 0x61E7, - 0xECE3: 0x61E0, - 0xECE4: 0x61E5, - 0xECE5: 0x61E4, - 0xECE6: 0x61E8, - 0xECE7: 0x61DE, - 0xECE8: 0x64EF, - 0xECE9: 0x64E9, - 0xECEA: 0x64E3, - 0xECEB: 0x64EB, - 0xECEC: 0x64E4, - 0xECED: 0x64E8, - 0xECEE: 0x6581, - 0xECEF: 0x6580, - 0xECF0: 0x65B6, - 0xECF1: 0x65DA, - 0xECF2: 0x66D2, - 0xECF3: 0x6A8D, - 0xECF4: 0x6A96, - 0xECF5: 0x6A81, - 0xECF6: 0x6AA5, - 0xECF7: 0x6A89, - 0xECF8: 0x6A9F, - 0xECF9: 0x6A9B, - 0xECFA: 0x6AA1, - 0xECFB: 0x6A9E, - 0xECFC: 0x6A87, - 0xECFD: 0x6A93, - 0xECFE: 0x6A8E, - 0xED40: 0x6A95, - 0xED41: 0x6A83, - 0xED42: 0x6AA8, - 0xED43: 0x6AA4, - 0xED44: 0x6A91, - 0xED45: 0x6A7F, - 0xED46: 0x6AA6, - 0xED47: 0x6A9A, - 0xED48: 0x6A85, - 0xED49: 0x6A8C, - 0xED4A: 0x6A92, - 0xED4B: 0x6B5B, - 0xED4C: 0x6BAD, - 0xED4D: 0x6C09, - 0xED4E: 0x6FCC, - 0xED4F: 0x6FA9, - 0xED50: 0x6FF4, - 0xED51: 0x6FD4, - 0xED52: 0x6FE3, - 0xED53: 0x6FDC, - 0xED54: 0x6FED, - 0xED55: 0x6FE7, - 0xED56: 0x6FE6, - 0xED57: 0x6FDE, - 0xED58: 0x6FF2, - 0xED59: 0x6FDD, - 0xED5A: 0x6FE2, - 0xED5B: 0x6FE8, - 0xED5C: 0x71E1, - 0xED5D: 0x71F1, - 0xED5E: 0x71E8, - 0xED5F: 0x71F2, - 0xED60: 0x71E4, - 0xED61: 0x71F0, - 0xED62: 0x71E2, - 0xED63: 0x7373, - 0xED64: 0x736E, - 0xED65: 0x736F, - 0xED66: 0x7497, - 0xED67: 0x74B2, - 0xED68: 0x74AB, - 0xED69: 0x7490, - 0xED6A: 0x74AA, - 0xED6B: 0x74AD, - 0xED6C: 0x74B1, - 0xED6D: 0x74A5, - 0xED6E: 0x74AF, - 0xED6F: 0x7510, - 0xED70: 0x7511, - 0xED71: 0x7512, - 0xED72: 0x750F, - 0xED73: 0x7584, - 0xED74: 0x7643, - 0xED75: 0x7648, - 0xED76: 0x7649, - 0xED77: 0x7647, - 0xED78: 0x76A4, - 0xED79: 0x76E9, - 0xED7A: 0x77B5, - 0xED7B: 0x77AB, - 0xED7C: 0x77B2, - 0xED7D: 0x77B7, - 0xED7E: 0x77B6, - 0xEDA1: 0x77B4, - 0xEDA2: 0x77B1, - 0xEDA3: 0x77A8, - 0xEDA4: 0x77F0, - 0xEDA5: 0x78F3, - 0xEDA6: 0x78FD, - 0xEDA7: 0x7902, - 0xEDA8: 0x78FB, - 0xEDA9: 0x78FC, - 0xEDAA: 0x78F2, - 0xEDAB: 0x7905, - 0xEDAC: 0x78F9, - 0xEDAD: 0x78FE, - 0xEDAE: 0x7904, - 0xEDAF: 0x79AB, - 0xEDB0: 0x79A8, - 0xEDB1: 0x7A5C, - 0xEDB2: 0x7A5B, - 0xEDB3: 0x7A56, - 0xEDB4: 0x7A58, - 0xEDB5: 0x7A54, - 0xEDB6: 0x7A5A, - 0xEDB7: 0x7ABE, - 0xEDB8: 0x7AC0, - 0xEDB9: 0x7AC1, - 0xEDBA: 0x7C05, - 0xEDBB: 0x7C0F, - 0xEDBC: 0x7BF2, - 0xEDBD: 0x7C00, - 0xEDBE: 0x7BFF, - 0xEDBF: 0x7BFB, - 0xEDC0: 0x7C0E, - 0xEDC1: 0x7BF4, - 0xEDC2: 0x7C0B, - 0xEDC3: 0x7BF3, - 0xEDC4: 0x7C02, - 0xEDC5: 0x7C09, - 0xEDC6: 0x7C03, - 0xEDC7: 0x7C01, - 0xEDC8: 0x7BF8, - 0xEDC9: 0x7BFD, - 0xEDCA: 0x7C06, - 0xEDCB: 0x7BF0, - 0xEDCC: 0x7BF1, - 0xEDCD: 0x7C10, - 0xEDCE: 0x7C0A, - 0xEDCF: 0x7CE8, - 0xEDD0: 0x7E2D, - 0xEDD1: 0x7E3C, - 0xEDD2: 0x7E42, - 0xEDD3: 0x7E33, - 0xEDD4: 0x9848, - 0xEDD5: 0x7E38, - 0xEDD6: 0x7E2A, - 0xEDD7: 0x7E49, - 0xEDD8: 0x7E40, - 0xEDD9: 0x7E47, - 0xEDDA: 0x7E29, - 0xEDDB: 0x7E4C, - 0xEDDC: 0x7E30, - 0xEDDD: 0x7E3B, - 0xEDDE: 0x7E36, - 0xEDDF: 0x7E44, - 0xEDE0: 0x7E3A, - 0xEDE1: 0x7F45, - 0xEDE2: 0x7F7F, - 0xEDE3: 0x7F7E, - 0xEDE4: 0x7F7D, - 0xEDE5: 0x7FF4, - 0xEDE6: 0x7FF2, - 0xEDE7: 0x802C, - 0xEDE8: 0x81BB, - 0xEDE9: 0x81C4, - 0xEDEA: 0x81CC, - 0xEDEB: 0x81CA, - 0xEDEC: 0x81C5, - 0xEDED: 0x81C7, - 0xEDEE: 0x81BC, - 0xEDEF: 0x81E9, - 0xEDF0: 0x825B, - 0xEDF1: 0x825A, - 0xEDF2: 0x825C, - 0xEDF3: 0x8583, - 0xEDF4: 0x8580, - 0xEDF5: 0x858F, - 0xEDF6: 0x85A7, - 0xEDF7: 0x8595, - 0xEDF8: 0x85A0, - 0xEDF9: 0x858B, - 0xEDFA: 0x85A3, - 0xEDFB: 0x857B, - 0xEDFC: 0x85A4, - 0xEDFD: 0x859A, - 0xEDFE: 0x859E, - 0xEE40: 0x8577, - 0xEE41: 0x857C, - 0xEE42: 0x8589, - 0xEE43: 0x85A1, - 0xEE44: 0x857A, - 0xEE45: 0x8578, - 0xEE46: 0x8557, - 0xEE47: 0x858E, - 0xEE48: 0x8596, - 0xEE49: 0x8586, - 0xEE4A: 0x858D, - 0xEE4B: 0x8599, - 0xEE4C: 0x859D, - 0xEE4D: 0x8581, - 0xEE4E: 0x85A2, - 0xEE4F: 0x8582, - 0xEE50: 0x8588, - 0xEE51: 0x8585, - 0xEE52: 0x8579, - 0xEE53: 0x8576, - 0xEE54: 0x8598, - 0xEE55: 0x8590, - 0xEE56: 0x859F, - 0xEE57: 0x8668, - 0xEE58: 0x87BE, - 0xEE59: 0x87AA, - 0xEE5A: 0x87AD, - 0xEE5B: 0x87C5, - 0xEE5C: 0x87B0, - 0xEE5D: 0x87AC, - 0xEE5E: 0x87B9, - 0xEE5F: 0x87B5, - 0xEE60: 0x87BC, - 0xEE61: 0x87AE, - 0xEE62: 0x87C9, - 0xEE63: 0x87C3, - 0xEE64: 0x87C2, - 0xEE65: 0x87CC, - 0xEE66: 0x87B7, - 0xEE67: 0x87AF, - 0xEE68: 0x87C4, - 0xEE69: 0x87CA, - 0xEE6A: 0x87B4, - 0xEE6B: 0x87B6, - 0xEE6C: 0x87BF, - 0xEE6D: 0x87B8, - 0xEE6E: 0x87BD, - 0xEE6F: 0x87DE, - 0xEE70: 0x87B2, - 0xEE71: 0x8935, - 0xEE72: 0x8933, - 0xEE73: 0x893C, - 0xEE74: 0x893E, - 0xEE75: 0x8941, - 0xEE76: 0x8952, - 0xEE77: 0x8937, - 0xEE78: 0x8942, - 0xEE79: 0x89AD, - 0xEE7A: 0x89AF, - 0xEE7B: 0x89AE, - 0xEE7C: 0x89F2, - 0xEE7D: 0x89F3, - 0xEE7E: 0x8B1E, - 0xEEA1: 0x8B18, - 0xEEA2: 0x8B16, - 0xEEA3: 0x8B11, - 0xEEA4: 0x8B05, - 0xEEA5: 0x8B0B, - 0xEEA6: 0x8B22, - 0xEEA7: 0x8B0F, - 0xEEA8: 0x8B12, - 0xEEA9: 0x8B15, - 0xEEAA: 0x8B07, - 0xEEAB: 0x8B0D, - 0xEEAC: 0x8B08, - 0xEEAD: 0x8B06, - 0xEEAE: 0x8B1C, - 0xEEAF: 0x8B13, - 0xEEB0: 0x8B1A, - 0xEEB1: 0x8C4F, - 0xEEB2: 0x8C70, - 0xEEB3: 0x8C72, - 0xEEB4: 0x8C71, - 0xEEB5: 0x8C6F, - 0xEEB6: 0x8C95, - 0xEEB7: 0x8C94, - 0xEEB8: 0x8CF9, - 0xEEB9: 0x8D6F, - 0xEEBA: 0x8E4E, - 0xEEBB: 0x8E4D, - 0xEEBC: 0x8E53, - 0xEEBD: 0x8E50, - 0xEEBE: 0x8E4C, - 0xEEBF: 0x8E47, - 0xEEC0: 0x8F43, - 0xEEC1: 0x8F40, - 0xEEC2: 0x9085, - 0xEEC3: 0x907E, - 0xEEC4: 0x9138, - 0xEEC5: 0x919A, - 0xEEC6: 0x91A2, - 0xEEC7: 0x919B, - 0xEEC8: 0x9199, - 0xEEC9: 0x919F, - 0xEECA: 0x91A1, - 0xEECB: 0x919D, - 0xEECC: 0x91A0, - 0xEECD: 0x93A1, - 0xEECE: 0x9383, - 0xEECF: 0x93AF, - 0xEED0: 0x9364, - 0xEED1: 0x9356, - 0xEED2: 0x9347, - 0xEED3: 0x937C, - 0xEED4: 0x9358, - 0xEED5: 0x935C, - 0xEED6: 0x9376, - 0xEED7: 0x9349, - 0xEED8: 0x9350, - 0xEED9: 0x9351, - 0xEEDA: 0x9360, - 0xEEDB: 0x936D, - 0xEEDC: 0x938F, - 0xEEDD: 0x934C, - 0xEEDE: 0x936A, - 0xEEDF: 0x9379, - 0xEEE0: 0x9357, - 0xEEE1: 0x9355, - 0xEEE2: 0x9352, - 0xEEE3: 0x934F, - 0xEEE4: 0x9371, - 0xEEE5: 0x9377, - 0xEEE6: 0x937B, - 0xEEE7: 0x9361, - 0xEEE8: 0x935E, - 0xEEE9: 0x9363, - 0xEEEA: 0x9367, - 0xEEEB: 0x9380, - 0xEEEC: 0x934E, - 0xEEED: 0x9359, - 0xEEEE: 0x95C7, - 0xEEEF: 0x95C0, - 0xEEF0: 0x95C9, - 0xEEF1: 0x95C3, - 0xEEF2: 0x95C5, - 0xEEF3: 0x95B7, - 0xEEF4: 0x96AE, - 0xEEF5: 0x96B0, - 0xEEF6: 0x96AC, - 0xEEF7: 0x9720, - 0xEEF8: 0x971F, - 0xEEF9: 0x9718, - 0xEEFA: 0x971D, - 0xEEFB: 0x9719, - 0xEEFC: 0x979A, - 0xEEFD: 0x97A1, - 0xEEFE: 0x979C, - 0xEF40: 0x979E, - 0xEF41: 0x979D, - 0xEF42: 0x97D5, - 0xEF43: 0x97D4, - 0xEF44: 0x97F1, - 0xEF45: 0x9841, - 0xEF46: 0x9844, - 0xEF47: 0x984A, - 0xEF48: 0x9849, - 0xEF49: 0x9845, - 0xEF4A: 0x9843, - 0xEF4B: 0x9925, - 0xEF4C: 0x992B, - 0xEF4D: 0x992C, - 0xEF4E: 0x992A, - 0xEF4F: 0x9933, - 0xEF50: 0x9932, - 0xEF51: 0x992F, - 0xEF52: 0x992D, - 0xEF53: 0x9931, - 0xEF54: 0x9930, - 0xEF55: 0x9998, - 0xEF56: 0x99A3, - 0xEF57: 0x99A1, - 0xEF58: 0x9A02, - 0xEF59: 0x99FA, - 0xEF5A: 0x99F4, - 0xEF5B: 0x99F7, - 0xEF5C: 0x99F9, - 0xEF5D: 0x99F8, - 0xEF5E: 0x99F6, - 0xEF5F: 0x99FB, - 0xEF60: 0x99FD, - 0xEF61: 0x99FE, - 0xEF62: 0x99FC, - 0xEF63: 0x9A03, - 0xEF64: 0x9ABE, - 0xEF65: 0x9AFE, - 0xEF66: 0x9AFD, - 0xEF67: 0x9B01, - 0xEF68: 0x9AFC, - 0xEF69: 0x9B48, - 0xEF6A: 0x9B9A, - 0xEF6B: 0x9BA8, - 0xEF6C: 0x9B9E, - 0xEF6D: 0x9B9B, - 0xEF6E: 0x9BA6, - 0xEF6F: 0x9BA1, - 0xEF70: 0x9BA5, - 0xEF71: 0x9BA4, - 0xEF72: 0x9B86, - 0xEF73: 0x9BA2, - 0xEF74: 0x9BA0, - 0xEF75: 0x9BAF, - 0xEF76: 0x9D33, - 0xEF77: 0x9D41, - 0xEF78: 0x9D67, - 0xEF79: 0x9D36, - 0xEF7A: 0x9D2E, - 0xEF7B: 0x9D2F, - 0xEF7C: 0x9D31, - 0xEF7D: 0x9D38, - 0xEF7E: 0x9D30, - 0xEFA1: 0x9D45, - 0xEFA2: 0x9D42, - 0xEFA3: 0x9D43, - 0xEFA4: 0x9D3E, - 0xEFA5: 0x9D37, - 0xEFA6: 0x9D40, - 0xEFA7: 0x9D3D, - 0xEFA8: 0x7FF5, - 0xEFA9: 0x9D2D, - 0xEFAA: 0x9E8A, - 0xEFAB: 0x9E89, - 0xEFAC: 0x9E8D, - 0xEFAD: 0x9EB0, - 0xEFAE: 0x9EC8, - 0xEFAF: 0x9EDA, - 0xEFB0: 0x9EFB, - 0xEFB1: 0x9EFF, - 0xEFB2: 0x9F24, - 0xEFB3: 0x9F23, - 0xEFB4: 0x9F22, - 0xEFB5: 0x9F54, - 0xEFB6: 0x9FA0, - 0xEFB7: 0x5131, - 0xEFB8: 0x512D, - 0xEFB9: 0x512E, - 0xEFBA: 0x5698, - 0xEFBB: 0x569C, - 0xEFBC: 0x5697, - 0xEFBD: 0x569A, - 0xEFBE: 0x569D, - 0xEFBF: 0x5699, - 0xEFC0: 0x5970, - 0xEFC1: 0x5B3C, - 0xEFC2: 0x5C69, - 0xEFC3: 0x5C6A, - 0xEFC4: 0x5DC0, - 0xEFC5: 0x5E6D, - 0xEFC6: 0x5E6E, - 0xEFC7: 0x61D8, - 0xEFC8: 0x61DF, - 0xEFC9: 0x61ED, - 0xEFCA: 0x61EE, - 0xEFCB: 0x61F1, - 0xEFCC: 0x61EA, - 0xEFCD: 0x61F0, - 0xEFCE: 0x61EB, - 0xEFCF: 0x61D6, - 0xEFD0: 0x61E9, - 0xEFD1: 0x64FF, - 0xEFD2: 0x6504, - 0xEFD3: 0x64FD, - 0xEFD4: 0x64F8, - 0xEFD5: 0x6501, - 0xEFD6: 0x6503, - 0xEFD7: 0x64FC, - 0xEFD8: 0x6594, - 0xEFD9: 0x65DB, - 0xEFDA: 0x66DA, - 0xEFDB: 0x66DB, - 0xEFDC: 0x66D8, - 0xEFDD: 0x6AC5, - 0xEFDE: 0x6AB9, - 0xEFDF: 0x6ABD, - 0xEFE0: 0x6AE1, - 0xEFE1: 0x6AC6, - 0xEFE2: 0x6ABA, - 0xEFE3: 0x6AB6, - 0xEFE4: 0x6AB7, - 0xEFE5: 0x6AC7, - 0xEFE6: 0x6AB4, - 0xEFE7: 0x6AAD, - 0xEFE8: 0x6B5E, - 0xEFE9: 0x6BC9, - 0xEFEA: 0x6C0B, - 0xEFEB: 0x7007, - 0xEFEC: 0x700C, - 0xEFED: 0x700D, - 0xEFEE: 0x7001, - 0xEFEF: 0x7005, - 0xEFF0: 0x7014, - 0xEFF1: 0x700E, - 0xEFF2: 0x6FFF, - 0xEFF3: 0x7000, - 0xEFF4: 0x6FFB, - 0xEFF5: 0x7026, - 0xEFF6: 0x6FFC, - 0xEFF7: 0x6FF7, - 0xEFF8: 0x700A, - 0xEFF9: 0x7201, - 0xEFFA: 0x71FF, - 0xEFFB: 0x71F9, - 0xEFFC: 0x7203, - 0xEFFD: 0x71FD, - 0xEFFE: 0x7376, - 0xF040: 0x74B8, - 0xF041: 0x74C0, - 0xF042: 0x74B5, - 0xF043: 0x74C1, - 0xF044: 0x74BE, - 0xF045: 0x74B6, - 0xF046: 0x74BB, - 0xF047: 0x74C2, - 0xF048: 0x7514, - 0xF049: 0x7513, - 0xF04A: 0x765C, - 0xF04B: 0x7664, - 0xF04C: 0x7659, - 0xF04D: 0x7650, - 0xF04E: 0x7653, - 0xF04F: 0x7657, - 0xF050: 0x765A, - 0xF051: 0x76A6, - 0xF052: 0x76BD, - 0xF053: 0x76EC, - 0xF054: 0x77C2, - 0xF055: 0x77BA, - 0xF056: 0x78FF, - 0xF057: 0x790C, - 0xF058: 0x7913, - 0xF059: 0x7914, - 0xF05A: 0x7909, - 0xF05B: 0x7910, - 0xF05C: 0x7912, - 0xF05D: 0x7911, - 0xF05E: 0x79AD, - 0xF05F: 0x79AC, - 0xF060: 0x7A5F, - 0xF061: 0x7C1C, - 0xF062: 0x7C29, - 0xF063: 0x7C19, - 0xF064: 0x7C20, - 0xF065: 0x7C1F, - 0xF066: 0x7C2D, - 0xF067: 0x7C1D, - 0xF068: 0x7C26, - 0xF069: 0x7C28, - 0xF06A: 0x7C22, - 0xF06B: 0x7C25, - 0xF06C: 0x7C30, - 0xF06D: 0x7E5C, - 0xF06E: 0x7E50, - 0xF06F: 0x7E56, - 0xF070: 0x7E63, - 0xF071: 0x7E58, - 0xF072: 0x7E62, - 0xF073: 0x7E5F, - 0xF074: 0x7E51, - 0xF075: 0x7E60, - 0xF076: 0x7E57, - 0xF077: 0x7E53, - 0xF078: 0x7FB5, - 0xF079: 0x7FB3, - 0xF07A: 0x7FF7, - 0xF07B: 0x7FF8, - 0xF07C: 0x8075, - 0xF07D: 0x81D1, - 0xF07E: 0x81D2, - 0xF0A1: 0x81D0, - 0xF0A2: 0x825F, - 0xF0A3: 0x825E, - 0xF0A4: 0x85B4, - 0xF0A5: 0x85C6, - 0xF0A6: 0x85C0, - 0xF0A7: 0x85C3, - 0xF0A8: 0x85C2, - 0xF0A9: 0x85B3, - 0xF0AA: 0x85B5, - 0xF0AB: 0x85BD, - 0xF0AC: 0x85C7, - 0xF0AD: 0x85C4, - 0xF0AE: 0x85BF, - 0xF0AF: 0x85CB, - 0xF0B0: 0x85CE, - 0xF0B1: 0x85C8, - 0xF0B2: 0x85C5, - 0xF0B3: 0x85B1, - 0xF0B4: 0x85B6, - 0xF0B5: 0x85D2, - 0xF0B6: 0x8624, - 0xF0B7: 0x85B8, - 0xF0B8: 0x85B7, - 0xF0B9: 0x85BE, - 0xF0BA: 0x8669, - 0xF0BB: 0x87E7, - 0xF0BC: 0x87E6, - 0xF0BD: 0x87E2, - 0xF0BE: 0x87DB, - 0xF0BF: 0x87EB, - 0xF0C0: 0x87EA, - 0xF0C1: 0x87E5, - 0xF0C2: 0x87DF, - 0xF0C3: 0x87F3, - 0xF0C4: 0x87E4, - 0xF0C5: 0x87D4, - 0xF0C6: 0x87DC, - 0xF0C7: 0x87D3, - 0xF0C8: 0x87ED, - 0xF0C9: 0x87D8, - 0xF0CA: 0x87E3, - 0xF0CB: 0x87A4, - 0xF0CC: 0x87D7, - 0xF0CD: 0x87D9, - 0xF0CE: 0x8801, - 0xF0CF: 0x87F4, - 0xF0D0: 0x87E8, - 0xF0D1: 0x87DD, - 0xF0D2: 0x8953, - 0xF0D3: 0x894B, - 0xF0D4: 0x894F, - 0xF0D5: 0x894C, - 0xF0D6: 0x8946, - 0xF0D7: 0x8950, - 0xF0D8: 0x8951, - 0xF0D9: 0x8949, - 0xF0DA: 0x8B2A, - 0xF0DB: 0x8B27, - 0xF0DC: 0x8B23, - 0xF0DD: 0x8B33, - 0xF0DE: 0x8B30, - 0xF0DF: 0x8B35, - 0xF0E0: 0x8B47, - 0xF0E1: 0x8B2F, - 0xF0E2: 0x8B3C, - 0xF0E3: 0x8B3E, - 0xF0E4: 0x8B31, - 0xF0E5: 0x8B25, - 0xF0E6: 0x8B37, - 0xF0E7: 0x8B26, - 0xF0E8: 0x8B36, - 0xF0E9: 0x8B2E, - 0xF0EA: 0x8B24, - 0xF0EB: 0x8B3B, - 0xF0EC: 0x8B3D, - 0xF0ED: 0x8B3A, - 0xF0EE: 0x8C42, - 0xF0EF: 0x8C75, - 0xF0F0: 0x8C99, - 0xF0F1: 0x8C98, - 0xF0F2: 0x8C97, - 0xF0F3: 0x8CFE, - 0xF0F4: 0x8D04, - 0xF0F5: 0x8D02, - 0xF0F6: 0x8D00, - 0xF0F7: 0x8E5C, - 0xF0F8: 0x8E62, - 0xF0F9: 0x8E60, - 0xF0FA: 0x8E57, - 0xF0FB: 0x8E56, - 0xF0FC: 0x8E5E, - 0xF0FD: 0x8E65, - 0xF0FE: 0x8E67, - 0xF140: 0x8E5B, - 0xF141: 0x8E5A, - 0xF142: 0x8E61, - 0xF143: 0x8E5D, - 0xF144: 0x8E69, - 0xF145: 0x8E54, - 0xF146: 0x8F46, - 0xF147: 0x8F47, - 0xF148: 0x8F48, - 0xF149: 0x8F4B, - 0xF14A: 0x9128, - 0xF14B: 0x913A, - 0xF14C: 0x913B, - 0xF14D: 0x913E, - 0xF14E: 0x91A8, - 0xF14F: 0x91A5, - 0xF150: 0x91A7, - 0xF151: 0x91AF, - 0xF152: 0x91AA, - 0xF153: 0x93B5, - 0xF154: 0x938C, - 0xF155: 0x9392, - 0xF156: 0x93B7, - 0xF157: 0x939B, - 0xF158: 0x939D, - 0xF159: 0x9389, - 0xF15A: 0x93A7, - 0xF15B: 0x938E, - 0xF15C: 0x93AA, - 0xF15D: 0x939E, - 0xF15E: 0x93A6, - 0xF15F: 0x9395, - 0xF160: 0x9388, - 0xF161: 0x9399, - 0xF162: 0x939F, - 0xF163: 0x938D, - 0xF164: 0x93B1, - 0xF165: 0x9391, - 0xF166: 0x93B2, - 0xF167: 0x93A4, - 0xF168: 0x93A8, - 0xF169: 0x93B4, - 0xF16A: 0x93A3, - 0xF16B: 0x93A5, - 0xF16C: 0x95D2, - 0xF16D: 0x95D3, - 0xF16E: 0x95D1, - 0xF16F: 0x96B3, - 0xF170: 0x96D7, - 0xF171: 0x96DA, - 0xF172: 0x5DC2, - 0xF173: 0x96DF, - 0xF174: 0x96D8, - 0xF175: 0x96DD, - 0xF176: 0x9723, - 0xF177: 0x9722, - 0xF178: 0x9725, - 0xF179: 0x97AC, - 0xF17A: 0x97AE, - 0xF17B: 0x97A8, - 0xF17C: 0x97AB, - 0xF17D: 0x97A4, - 0xF17E: 0x97AA, - 0xF1A1: 0x97A2, - 0xF1A2: 0x97A5, - 0xF1A3: 0x97D7, - 0xF1A4: 0x97D9, - 0xF1A5: 0x97D6, - 0xF1A6: 0x97D8, - 0xF1A7: 0x97FA, - 0xF1A8: 0x9850, - 0xF1A9: 0x9851, - 0xF1AA: 0x9852, - 0xF1AB: 0x98B8, - 0xF1AC: 0x9941, - 0xF1AD: 0x993C, - 0xF1AE: 0x993A, - 0xF1AF: 0x9A0F, - 0xF1B0: 0x9A0B, - 0xF1B1: 0x9A09, - 0xF1B2: 0x9A0D, - 0xF1B3: 0x9A04, - 0xF1B4: 0x9A11, - 0xF1B5: 0x9A0A, - 0xF1B6: 0x9A05, - 0xF1B7: 0x9A07, - 0xF1B8: 0x9A06, - 0xF1B9: 0x9AC0, - 0xF1BA: 0x9ADC, - 0xF1BB: 0x9B08, - 0xF1BC: 0x9B04, - 0xF1BD: 0x9B05, - 0xF1BE: 0x9B29, - 0xF1BF: 0x9B35, - 0xF1C0: 0x9B4A, - 0xF1C1: 0x9B4C, - 0xF1C2: 0x9B4B, - 0xF1C3: 0x9BC7, - 0xF1C4: 0x9BC6, - 0xF1C5: 0x9BC3, - 0xF1C6: 0x9BBF, - 0xF1C7: 0x9BC1, - 0xF1C8: 0x9BB5, - 0xF1C9: 0x9BB8, - 0xF1CA: 0x9BD3, - 0xF1CB: 0x9BB6, - 0xF1CC: 0x9BC4, - 0xF1CD: 0x9BB9, - 0xF1CE: 0x9BBD, - 0xF1CF: 0x9D5C, - 0xF1D0: 0x9D53, - 0xF1D1: 0x9D4F, - 0xF1D2: 0x9D4A, - 0xF1D3: 0x9D5B, - 0xF1D4: 0x9D4B, - 0xF1D5: 0x9D59, - 0xF1D6: 0x9D56, - 0xF1D7: 0x9D4C, - 0xF1D8: 0x9D57, - 0xF1D9: 0x9D52, - 0xF1DA: 0x9D54, - 0xF1DB: 0x9D5F, - 0xF1DC: 0x9D58, - 0xF1DD: 0x9D5A, - 0xF1DE: 0x9E8E, - 0xF1DF: 0x9E8C, - 0xF1E0: 0x9EDF, - 0xF1E1: 0x9F01, - 0xF1E2: 0x9F00, - 0xF1E3: 0x9F16, - 0xF1E4: 0x9F25, - 0xF1E5: 0x9F2B, - 0xF1E6: 0x9F2A, - 0xF1E7: 0x9F29, - 0xF1E8: 0x9F28, - 0xF1E9: 0x9F4C, - 0xF1EA: 0x9F55, - 0xF1EB: 0x5134, - 0xF1EC: 0x5135, - 0xF1ED: 0x5296, - 0xF1EE: 0x52F7, - 0xF1EF: 0x53B4, - 0xF1F0: 0x56AB, - 0xF1F1: 0x56AD, - 0xF1F2: 0x56A6, - 0xF1F3: 0x56A7, - 0xF1F4: 0x56AA, - 0xF1F5: 0x56AC, - 0xF1F6: 0x58DA, - 0xF1F7: 0x58DD, - 0xF1F8: 0x58DB, - 0xF1F9: 0x5912, - 0xF1FA: 0x5B3D, - 0xF1FB: 0x5B3E, - 0xF1FC: 0x5B3F, - 0xF1FD: 0x5DC3, - 0xF1FE: 0x5E70, - 0xF240: 0x5FBF, - 0xF241: 0x61FB, - 0xF242: 0x6507, - 0xF243: 0x6510, - 0xF244: 0x650D, - 0xF245: 0x6509, - 0xF246: 0x650C, - 0xF247: 0x650E, - 0xF248: 0x6584, - 0xF249: 0x65DE, - 0xF24A: 0x65DD, - 0xF24B: 0x66DE, - 0xF24C: 0x6AE7, - 0xF24D: 0x6AE0, - 0xF24E: 0x6ACC, - 0xF24F: 0x6AD1, - 0xF250: 0x6AD9, - 0xF251: 0x6ACB, - 0xF252: 0x6ADF, - 0xF253: 0x6ADC, - 0xF254: 0x6AD0, - 0xF255: 0x6AEB, - 0xF256: 0x6ACF, - 0xF257: 0x6ACD, - 0xF258: 0x6ADE, - 0xF259: 0x6B60, - 0xF25A: 0x6BB0, - 0xF25B: 0x6C0C, - 0xF25C: 0x7019, - 0xF25D: 0x7027, - 0xF25E: 0x7020, - 0xF25F: 0x7016, - 0xF260: 0x702B, - 0xF261: 0x7021, - 0xF262: 0x7022, - 0xF263: 0x7023, - 0xF264: 0x7029, - 0xF265: 0x7017, - 0xF266: 0x7024, - 0xF267: 0x701C, - 0xF268: 0x702A, - 0xF269: 0x720C, - 0xF26A: 0x720A, - 0xF26B: 0x7207, - 0xF26C: 0x7202, - 0xF26D: 0x7205, - 0xF26E: 0x72A5, - 0xF26F: 0x72A6, - 0xF270: 0x72A4, - 0xF271: 0x72A3, - 0xF272: 0x72A1, - 0xF273: 0x74CB, - 0xF274: 0x74C5, - 0xF275: 0x74B7, - 0xF276: 0x74C3, - 0xF277: 0x7516, - 0xF278: 0x7660, - 0xF279: 0x77C9, - 0xF27A: 0x77CA, - 0xF27B: 0x77C4, - 0xF27C: 0x77F1, - 0xF27D: 0x791D, - 0xF27E: 0x791B, - 0xF2A1: 0x7921, - 0xF2A2: 0x791C, - 0xF2A3: 0x7917, - 0xF2A4: 0x791E, - 0xF2A5: 0x79B0, - 0xF2A6: 0x7A67, - 0xF2A7: 0x7A68, - 0xF2A8: 0x7C33, - 0xF2A9: 0x7C3C, - 0xF2AA: 0x7C39, - 0xF2AB: 0x7C2C, - 0xF2AC: 0x7C3B, - 0xF2AD: 0x7CEC, - 0xF2AE: 0x7CEA, - 0xF2AF: 0x7E76, - 0xF2B0: 0x7E75, - 0xF2B1: 0x7E78, - 0xF2B2: 0x7E70, - 0xF2B3: 0x7E77, - 0xF2B4: 0x7E6F, - 0xF2B5: 0x7E7A, - 0xF2B6: 0x7E72, - 0xF2B7: 0x7E74, - 0xF2B8: 0x7E68, - 0xF2B9: 0x7F4B, - 0xF2BA: 0x7F4A, - 0xF2BB: 0x7F83, - 0xF2BC: 0x7F86, - 0xF2BD: 0x7FB7, - 0xF2BE: 0x7FFD, - 0xF2BF: 0x7FFE, - 0xF2C0: 0x8078, - 0xF2C1: 0x81D7, - 0xF2C2: 0x81D5, - 0xF2C3: 0x8264, - 0xF2C4: 0x8261, - 0xF2C5: 0x8263, - 0xF2C6: 0x85EB, - 0xF2C7: 0x85F1, - 0xF2C8: 0x85ED, - 0xF2C9: 0x85D9, - 0xF2CA: 0x85E1, - 0xF2CB: 0x85E8, - 0xF2CC: 0x85DA, - 0xF2CD: 0x85D7, - 0xF2CE: 0x85EC, - 0xF2CF: 0x85F2, - 0xF2D0: 0x85F8, - 0xF2D1: 0x85D8, - 0xF2D2: 0x85DF, - 0xF2D3: 0x85E3, - 0xF2D4: 0x85DC, - 0xF2D5: 0x85D1, - 0xF2D6: 0x85F0, - 0xF2D7: 0x85E6, - 0xF2D8: 0x85EF, - 0xF2D9: 0x85DE, - 0xF2DA: 0x85E2, - 0xF2DB: 0x8800, - 0xF2DC: 0x87FA, - 0xF2DD: 0x8803, - 0xF2DE: 0x87F6, - 0xF2DF: 0x87F7, - 0xF2E0: 0x8809, - 0xF2E1: 0x880C, - 0xF2E2: 0x880B, - 0xF2E3: 0x8806, - 0xF2E4: 0x87FC, - 0xF2E5: 0x8808, - 0xF2E6: 0x87FF, - 0xF2E7: 0x880A, - 0xF2E8: 0x8802, - 0xF2E9: 0x8962, - 0xF2EA: 0x895A, - 0xF2EB: 0x895B, - 0xF2EC: 0x8957, - 0xF2ED: 0x8961, - 0xF2EE: 0x895C, - 0xF2EF: 0x8958, - 0xF2F0: 0x895D, - 0xF2F1: 0x8959, - 0xF2F2: 0x8988, - 0xF2F3: 0x89B7, - 0xF2F4: 0x89B6, - 0xF2F5: 0x89F6, - 0xF2F6: 0x8B50, - 0xF2F7: 0x8B48, - 0xF2F8: 0x8B4A, - 0xF2F9: 0x8B40, - 0xF2FA: 0x8B53, - 0xF2FB: 0x8B56, - 0xF2FC: 0x8B54, - 0xF2FD: 0x8B4B, - 0xF2FE: 0x8B55, - 0xF340: 0x8B51, - 0xF341: 0x8B42, - 0xF342: 0x8B52, - 0xF343: 0x8B57, - 0xF344: 0x8C43, - 0xF345: 0x8C77, - 0xF346: 0x8C76, - 0xF347: 0x8C9A, - 0xF348: 0x8D06, - 0xF349: 0x8D07, - 0xF34A: 0x8D09, - 0xF34B: 0x8DAC, - 0xF34C: 0x8DAA, - 0xF34D: 0x8DAD, - 0xF34E: 0x8DAB, - 0xF34F: 0x8E6D, - 0xF350: 0x8E78, - 0xF351: 0x8E73, - 0xF352: 0x8E6A, - 0xF353: 0x8E6F, - 0xF354: 0x8E7B, - 0xF355: 0x8EC2, - 0xF356: 0x8F52, - 0xF357: 0x8F51, - 0xF358: 0x8F4F, - 0xF359: 0x8F50, - 0xF35A: 0x8F53, - 0xF35B: 0x8FB4, - 0xF35C: 0x9140, - 0xF35D: 0x913F, - 0xF35E: 0x91B0, - 0xF35F: 0x91AD, - 0xF360: 0x93DE, - 0xF361: 0x93C7, - 0xF362: 0x93CF, - 0xF363: 0x93C2, - 0xF364: 0x93DA, - 0xF365: 0x93D0, - 0xF366: 0x93F9, - 0xF367: 0x93EC, - 0xF368: 0x93CC, - 0xF369: 0x93D9, - 0xF36A: 0x93A9, - 0xF36B: 0x93E6, - 0xF36C: 0x93CA, - 0xF36D: 0x93D4, - 0xF36E: 0x93EE, - 0xF36F: 0x93E3, - 0xF370: 0x93D5, - 0xF371: 0x93C4, - 0xF372: 0x93CE, - 0xF373: 0x93C0, - 0xF374: 0x93D2, - 0xF375: 0x93E7, - 0xF376: 0x957D, - 0xF377: 0x95DA, - 0xF378: 0x95DB, - 0xF379: 0x96E1, - 0xF37A: 0x9729, - 0xF37B: 0x972B, - 0xF37C: 0x972C, - 0xF37D: 0x9728, - 0xF37E: 0x9726, - 0xF3A1: 0x97B3, - 0xF3A2: 0x97B7, - 0xF3A3: 0x97B6, - 0xF3A4: 0x97DD, - 0xF3A5: 0x97DE, - 0xF3A6: 0x97DF, - 0xF3A7: 0x985C, - 0xF3A8: 0x9859, - 0xF3A9: 0x985D, - 0xF3AA: 0x9857, - 0xF3AB: 0x98BF, - 0xF3AC: 0x98BD, - 0xF3AD: 0x98BB, - 0xF3AE: 0x98BE, - 0xF3AF: 0x9948, - 0xF3B0: 0x9947, - 0xF3B1: 0x9943, - 0xF3B2: 0x99A6, - 0xF3B3: 0x99A7, - 0xF3B4: 0x9A1A, - 0xF3B5: 0x9A15, - 0xF3B6: 0x9A25, - 0xF3B7: 0x9A1D, - 0xF3B8: 0x9A24, - 0xF3B9: 0x9A1B, - 0xF3BA: 0x9A22, - 0xF3BB: 0x9A20, - 0xF3BC: 0x9A27, - 0xF3BD: 0x9A23, - 0xF3BE: 0x9A1E, - 0xF3BF: 0x9A1C, - 0xF3C0: 0x9A14, - 0xF3C1: 0x9AC2, - 0xF3C2: 0x9B0B, - 0xF3C3: 0x9B0A, - 0xF3C4: 0x9B0E, - 0xF3C5: 0x9B0C, - 0xF3C6: 0x9B37, - 0xF3C7: 0x9BEA, - 0xF3C8: 0x9BEB, - 0xF3C9: 0x9BE0, - 0xF3CA: 0x9BDE, - 0xF3CB: 0x9BE4, - 0xF3CC: 0x9BE6, - 0xF3CD: 0x9BE2, - 0xF3CE: 0x9BF0, - 0xF3CF: 0x9BD4, - 0xF3D0: 0x9BD7, - 0xF3D1: 0x9BEC, - 0xF3D2: 0x9BDC, - 0xF3D3: 0x9BD9, - 0xF3D4: 0x9BE5, - 0xF3D5: 0x9BD5, - 0xF3D6: 0x9BE1, - 0xF3D7: 0x9BDA, - 0xF3D8: 0x9D77, - 0xF3D9: 0x9D81, - 0xF3DA: 0x9D8A, - 0xF3DB: 0x9D84, - 0xF3DC: 0x9D88, - 0xF3DD: 0x9D71, - 0xF3DE: 0x9D80, - 0xF3DF: 0x9D78, - 0xF3E0: 0x9D86, - 0xF3E1: 0x9D8B, - 0xF3E2: 0x9D8C, - 0xF3E3: 0x9D7D, - 0xF3E4: 0x9D6B, - 0xF3E5: 0x9D74, - 0xF3E6: 0x9D75, - 0xF3E7: 0x9D70, - 0xF3E8: 0x9D69, - 0xF3E9: 0x9D85, - 0xF3EA: 0x9D73, - 0xF3EB: 0x9D7B, - 0xF3EC: 0x9D82, - 0xF3ED: 0x9D6F, - 0xF3EE: 0x9D79, - 0xF3EF: 0x9D7F, - 0xF3F0: 0x9D87, - 0xF3F1: 0x9D68, - 0xF3F2: 0x9E94, - 0xF3F3: 0x9E91, - 0xF3F4: 0x9EC0, - 0xF3F5: 0x9EFC, - 0xF3F6: 0x9F2D, - 0xF3F7: 0x9F40, - 0xF3F8: 0x9F41, - 0xF3F9: 0x9F4D, - 0xF3FA: 0x9F56, - 0xF3FB: 0x9F57, - 0xF3FC: 0x9F58, - 0xF3FD: 0x5337, - 0xF3FE: 0x56B2, - 0xF440: 0x56B5, - 0xF441: 0x56B3, - 0xF442: 0x58E3, - 0xF443: 0x5B45, - 0xF444: 0x5DC6, - 0xF445: 0x5DC7, - 0xF446: 0x5EEE, - 0xF447: 0x5EEF, - 0xF448: 0x5FC0, - 0xF449: 0x5FC1, - 0xF44A: 0x61F9, - 0xF44B: 0x6517, - 0xF44C: 0x6516, - 0xF44D: 0x6515, - 0xF44E: 0x6513, - 0xF44F: 0x65DF, - 0xF450: 0x66E8, - 0xF451: 0x66E3, - 0xF452: 0x66E4, - 0xF453: 0x6AF3, - 0xF454: 0x6AF0, - 0xF455: 0x6AEA, - 0xF456: 0x6AE8, - 0xF457: 0x6AF9, - 0xF458: 0x6AF1, - 0xF459: 0x6AEE, - 0xF45A: 0x6AEF, - 0xF45B: 0x703C, - 0xF45C: 0x7035, - 0xF45D: 0x702F, - 0xF45E: 0x7037, - 0xF45F: 0x7034, - 0xF460: 0x7031, - 0xF461: 0x7042, - 0xF462: 0x7038, - 0xF463: 0x703F, - 0xF464: 0x703A, - 0xF465: 0x7039, - 0xF466: 0x7040, - 0xF467: 0x703B, - 0xF468: 0x7033, - 0xF469: 0x7041, - 0xF46A: 0x7213, - 0xF46B: 0x7214, - 0xF46C: 0x72A8, - 0xF46D: 0x737D, - 0xF46E: 0x737C, - 0xF46F: 0x74BA, - 0xF470: 0x76AB, - 0xF471: 0x76AA, - 0xF472: 0x76BE, - 0xF473: 0x76ED, - 0xF474: 0x77CC, - 0xF475: 0x77CE, - 0xF476: 0x77CF, - 0xF477: 0x77CD, - 0xF478: 0x77F2, - 0xF479: 0x7925, - 0xF47A: 0x7923, - 0xF47B: 0x7927, - 0xF47C: 0x7928, - 0xF47D: 0x7924, - 0xF47E: 0x7929, - 0xF4A1: 0x79B2, - 0xF4A2: 0x7A6E, - 0xF4A3: 0x7A6C, - 0xF4A4: 0x7A6D, - 0xF4A5: 0x7AF7, - 0xF4A6: 0x7C49, - 0xF4A7: 0x7C48, - 0xF4A8: 0x7C4A, - 0xF4A9: 0x7C47, - 0xF4AA: 0x7C45, - 0xF4AB: 0x7CEE, - 0xF4AC: 0x7E7B, - 0xF4AD: 0x7E7E, - 0xF4AE: 0x7E81, - 0xF4AF: 0x7E80, - 0xF4B0: 0x7FBA, - 0xF4B1: 0x7FFF, - 0xF4B2: 0x8079, - 0xF4B3: 0x81DB, - 0xF4B4: 0x81D9, - 0xF4B5: 0x820B, - 0xF4B6: 0x8268, - 0xF4B7: 0x8269, - 0xF4B8: 0x8622, - 0xF4B9: 0x85FF, - 0xF4BA: 0x8601, - 0xF4BB: 0x85FE, - 0xF4BC: 0x861B, - 0xF4BD: 0x8600, - 0xF4BE: 0x85F6, - 0xF4BF: 0x8604, - 0xF4C0: 0x8609, - 0xF4C1: 0x8605, - 0xF4C2: 0x860C, - 0xF4C3: 0x85FD, - 0xF4C4: 0x8819, - 0xF4C5: 0x8810, - 0xF4C6: 0x8811, - 0xF4C7: 0x8817, - 0xF4C8: 0x8813, - 0xF4C9: 0x8816, - 0xF4CA: 0x8963, - 0xF4CB: 0x8966, - 0xF4CC: 0x89B9, - 0xF4CD: 0x89F7, - 0xF4CE: 0x8B60, - 0xF4CF: 0x8B6A, - 0xF4D0: 0x8B5D, - 0xF4D1: 0x8B68, - 0xF4D2: 0x8B63, - 0xF4D3: 0x8B65, - 0xF4D4: 0x8B67, - 0xF4D5: 0x8B6D, - 0xF4D6: 0x8DAE, - 0xF4D7: 0x8E86, - 0xF4D8: 0x8E88, - 0xF4D9: 0x8E84, - 0xF4DA: 0x8F59, - 0xF4DB: 0x8F56, - 0xF4DC: 0x8F57, - 0xF4DD: 0x8F55, - 0xF4DE: 0x8F58, - 0xF4DF: 0x8F5A, - 0xF4E0: 0x908D, - 0xF4E1: 0x9143, - 0xF4E2: 0x9141, - 0xF4E3: 0x91B7, - 0xF4E4: 0x91B5, - 0xF4E5: 0x91B2, - 0xF4E6: 0x91B3, - 0xF4E7: 0x940B, - 0xF4E8: 0x9413, - 0xF4E9: 0x93FB, - 0xF4EA: 0x9420, - 0xF4EB: 0x940F, - 0xF4EC: 0x9414, - 0xF4ED: 0x93FE, - 0xF4EE: 0x9415, - 0xF4EF: 0x9410, - 0xF4F0: 0x9428, - 0xF4F1: 0x9419, - 0xF4F2: 0x940D, - 0xF4F3: 0x93F5, - 0xF4F4: 0x9400, - 0xF4F5: 0x93F7, - 0xF4F6: 0x9407, - 0xF4F7: 0x940E, - 0xF4F8: 0x9416, - 0xF4F9: 0x9412, - 0xF4FA: 0x93FA, - 0xF4FB: 0x9409, - 0xF4FC: 0x93F8, - 0xF4FD: 0x940A, - 0xF4FE: 0x93FF, - 0xF540: 0x93FC, - 0xF541: 0x940C, - 0xF542: 0x93F6, - 0xF543: 0x9411, - 0xF544: 0x9406, - 0xF545: 0x95DE, - 0xF546: 0x95E0, - 0xF547: 0x95DF, - 0xF548: 0x972E, - 0xF549: 0x972F, - 0xF54A: 0x97B9, - 0xF54B: 0x97BB, - 0xF54C: 0x97FD, - 0xF54D: 0x97FE, - 0xF54E: 0x9860, - 0xF54F: 0x9862, - 0xF550: 0x9863, - 0xF551: 0x985F, - 0xF552: 0x98C1, - 0xF553: 0x98C2, - 0xF554: 0x9950, - 0xF555: 0x994E, - 0xF556: 0x9959, - 0xF557: 0x994C, - 0xF558: 0x994B, - 0xF559: 0x9953, - 0xF55A: 0x9A32, - 0xF55B: 0x9A34, - 0xF55C: 0x9A31, - 0xF55D: 0x9A2C, - 0xF55E: 0x9A2A, - 0xF55F: 0x9A36, - 0xF560: 0x9A29, - 0xF561: 0x9A2E, - 0xF562: 0x9A38, - 0xF563: 0x9A2D, - 0xF564: 0x9AC7, - 0xF565: 0x9ACA, - 0xF566: 0x9AC6, - 0xF567: 0x9B10, - 0xF568: 0x9B12, - 0xF569: 0x9B11, - 0xF56A: 0x9C0B, - 0xF56B: 0x9C08, - 0xF56C: 0x9BF7, - 0xF56D: 0x9C05, - 0xF56E: 0x9C12, - 0xF56F: 0x9BF8, - 0xF570: 0x9C40, - 0xF571: 0x9C07, - 0xF572: 0x9C0E, - 0xF573: 0x9C06, - 0xF574: 0x9C17, - 0xF575: 0x9C14, - 0xF576: 0x9C09, - 0xF577: 0x9D9F, - 0xF578: 0x9D99, - 0xF579: 0x9DA4, - 0xF57A: 0x9D9D, - 0xF57B: 0x9D92, - 0xF57C: 0x9D98, - 0xF57D: 0x9D90, - 0xF57E: 0x9D9B, - 0xF5A1: 0x9DA0, - 0xF5A2: 0x9D94, - 0xF5A3: 0x9D9C, - 0xF5A4: 0x9DAA, - 0xF5A5: 0x9D97, - 0xF5A6: 0x9DA1, - 0xF5A7: 0x9D9A, - 0xF5A8: 0x9DA2, - 0xF5A9: 0x9DA8, - 0xF5AA: 0x9D9E, - 0xF5AB: 0x9DA3, - 0xF5AC: 0x9DBF, - 0xF5AD: 0x9DA9, - 0xF5AE: 0x9D96, - 0xF5AF: 0x9DA6, - 0xF5B0: 0x9DA7, - 0xF5B1: 0x9E99, - 0xF5B2: 0x9E9B, - 0xF5B3: 0x9E9A, - 0xF5B4: 0x9EE5, - 0xF5B5: 0x9EE4, - 0xF5B6: 0x9EE7, - 0xF5B7: 0x9EE6, - 0xF5B8: 0x9F30, - 0xF5B9: 0x9F2E, - 0xF5BA: 0x9F5B, - 0xF5BB: 0x9F60, - 0xF5BC: 0x9F5E, - 0xF5BD: 0x9F5D, - 0xF5BE: 0x9F59, - 0xF5BF: 0x9F91, - 0xF5C0: 0x513A, - 0xF5C1: 0x5139, - 0xF5C2: 0x5298, - 0xF5C3: 0x5297, - 0xF5C4: 0x56C3, - 0xF5C5: 0x56BD, - 0xF5C6: 0x56BE, - 0xF5C7: 0x5B48, - 0xF5C8: 0x5B47, - 0xF5C9: 0x5DCB, - 0xF5CA: 0x5DCF, - 0xF5CB: 0x5EF1, - 0xF5CC: 0x61FD, - 0xF5CD: 0x651B, - 0xF5CE: 0x6B02, - 0xF5CF: 0x6AFC, - 0xF5D0: 0x6B03, - 0xF5D1: 0x6AF8, - 0xF5D2: 0x6B00, - 0xF5D3: 0x7043, - 0xF5D4: 0x7044, - 0xF5D5: 0x704A, - 0xF5D6: 0x7048, - 0xF5D7: 0x7049, - 0xF5D8: 0x7045, - 0xF5D9: 0x7046, - 0xF5DA: 0x721D, - 0xF5DB: 0x721A, - 0xF5DC: 0x7219, - 0xF5DD: 0x737E, - 0xF5DE: 0x7517, - 0xF5DF: 0x766A, - 0xF5E0: 0x77D0, - 0xF5E1: 0x792D, - 0xF5E2: 0x7931, - 0xF5E3: 0x792F, - 0xF5E4: 0x7C54, - 0xF5E5: 0x7C53, - 0xF5E6: 0x7CF2, - 0xF5E7: 0x7E8A, - 0xF5E8: 0x7E87, - 0xF5E9: 0x7E88, - 0xF5EA: 0x7E8B, - 0xF5EB: 0x7E86, - 0xF5EC: 0x7E8D, - 0xF5ED: 0x7F4D, - 0xF5EE: 0x7FBB, - 0xF5EF: 0x8030, - 0xF5F0: 0x81DD, - 0xF5F1: 0x8618, - 0xF5F2: 0x862A, - 0xF5F3: 0x8626, - 0xF5F4: 0x861F, - 0xF5F5: 0x8623, - 0xF5F6: 0x861C, - 0xF5F7: 0x8619, - 0xF5F8: 0x8627, - 0xF5F9: 0x862E, - 0xF5FA: 0x8621, - 0xF5FB: 0x8620, - 0xF5FC: 0x8629, - 0xF5FD: 0x861E, - 0xF5FE: 0x8625, - 0xF640: 0x8829, - 0xF641: 0x881D, - 0xF642: 0x881B, - 0xF643: 0x8820, - 0xF644: 0x8824, - 0xF645: 0x881C, - 0xF646: 0x882B, - 0xF647: 0x884A, - 0xF648: 0x896D, - 0xF649: 0x8969, - 0xF64A: 0x896E, - 0xF64B: 0x896B, - 0xF64C: 0x89FA, - 0xF64D: 0x8B79, - 0xF64E: 0x8B78, - 0xF64F: 0x8B45, - 0xF650: 0x8B7A, - 0xF651: 0x8B7B, - 0xF652: 0x8D10, - 0xF653: 0x8D14, - 0xF654: 0x8DAF, - 0xF655: 0x8E8E, - 0xF656: 0x8E8C, - 0xF657: 0x8F5E, - 0xF658: 0x8F5B, - 0xF659: 0x8F5D, - 0xF65A: 0x9146, - 0xF65B: 0x9144, - 0xF65C: 0x9145, - 0xF65D: 0x91B9, - 0xF65E: 0x943F, - 0xF65F: 0x943B, - 0xF660: 0x9436, - 0xF661: 0x9429, - 0xF662: 0x943D, - 0xF663: 0x943C, - 0xF664: 0x9430, - 0xF665: 0x9439, - 0xF666: 0x942A, - 0xF667: 0x9437, - 0xF668: 0x942C, - 0xF669: 0x9440, - 0xF66A: 0x9431, - 0xF66B: 0x95E5, - 0xF66C: 0x95E4, - 0xF66D: 0x95E3, - 0xF66E: 0x9735, - 0xF66F: 0x973A, - 0xF670: 0x97BF, - 0xF671: 0x97E1, - 0xF672: 0x9864, - 0xF673: 0x98C9, - 0xF674: 0x98C6, - 0xF675: 0x98C0, - 0xF676: 0x9958, - 0xF677: 0x9956, - 0xF678: 0x9A39, - 0xF679: 0x9A3D, - 0xF67A: 0x9A46, - 0xF67B: 0x9A44, - 0xF67C: 0x9A42, - 0xF67D: 0x9A41, - 0xF67E: 0x9A3A, - 0xF6A1: 0x9A3F, - 0xF6A2: 0x9ACD, - 0xF6A3: 0x9B15, - 0xF6A4: 0x9B17, - 0xF6A5: 0x9B18, - 0xF6A6: 0x9B16, - 0xF6A7: 0x9B3A, - 0xF6A8: 0x9B52, - 0xF6A9: 0x9C2B, - 0xF6AA: 0x9C1D, - 0xF6AB: 0x9C1C, - 0xF6AC: 0x9C2C, - 0xF6AD: 0x9C23, - 0xF6AE: 0x9C28, - 0xF6AF: 0x9C29, - 0xF6B0: 0x9C24, - 0xF6B1: 0x9C21, - 0xF6B2: 0x9DB7, - 0xF6B3: 0x9DB6, - 0xF6B4: 0x9DBC, - 0xF6B5: 0x9DC1, - 0xF6B6: 0x9DC7, - 0xF6B7: 0x9DCA, - 0xF6B8: 0x9DCF, - 0xF6B9: 0x9DBE, - 0xF6BA: 0x9DC5, - 0xF6BB: 0x9DC3, - 0xF6BC: 0x9DBB, - 0xF6BD: 0x9DB5, - 0xF6BE: 0x9DCE, - 0xF6BF: 0x9DB9, - 0xF6C0: 0x9DBA, - 0xF6C1: 0x9DAC, - 0xF6C2: 0x9DC8, - 0xF6C3: 0x9DB1, - 0xF6C4: 0x9DAD, - 0xF6C5: 0x9DCC, - 0xF6C6: 0x9DB3, - 0xF6C7: 0x9DCD, - 0xF6C8: 0x9DB2, - 0xF6C9: 0x9E7A, - 0xF6CA: 0x9E9C, - 0xF6CB: 0x9EEB, - 0xF6CC: 0x9EEE, - 0xF6CD: 0x9EED, - 0xF6CE: 0x9F1B, - 0xF6CF: 0x9F18, - 0xF6D0: 0x9F1A, - 0xF6D1: 0x9F31, - 0xF6D2: 0x9F4E, - 0xF6D3: 0x9F65, - 0xF6D4: 0x9F64, - 0xF6D5: 0x9F92, - 0xF6D6: 0x4EB9, - 0xF6D7: 0x56C6, - 0xF6D8: 0x56C5, - 0xF6D9: 0x56CB, - 0xF6DA: 0x5971, - 0xF6DB: 0x5B4B, - 0xF6DC: 0x5B4C, - 0xF6DD: 0x5DD5, - 0xF6DE: 0x5DD1, - 0xF6DF: 0x5EF2, - 0xF6E0: 0x6521, - 0xF6E1: 0x6520, - 0xF6E2: 0x6526, - 0xF6E3: 0x6522, - 0xF6E4: 0x6B0B, - 0xF6E5: 0x6B08, - 0xF6E6: 0x6B09, - 0xF6E7: 0x6C0D, - 0xF6E8: 0x7055, - 0xF6E9: 0x7056, - 0xF6EA: 0x7057, - 0xF6EB: 0x7052, - 0xF6EC: 0x721E, - 0xF6ED: 0x721F, - 0xF6EE: 0x72A9, - 0xF6EF: 0x737F, - 0xF6F0: 0x74D8, - 0xF6F1: 0x74D5, - 0xF6F2: 0x74D9, - 0xF6F3: 0x74D7, - 0xF6F4: 0x766D, - 0xF6F5: 0x76AD, - 0xF6F6: 0x7935, - 0xF6F7: 0x79B4, - 0xF6F8: 0x7A70, - 0xF6F9: 0x7A71, - 0xF6FA: 0x7C57, - 0xF6FB: 0x7C5C, - 0xF6FC: 0x7C59, - 0xF6FD: 0x7C5B, - 0xF6FE: 0x7C5A, - 0xF740: 0x7CF4, - 0xF741: 0x7CF1, - 0xF742: 0x7E91, - 0xF743: 0x7F4F, - 0xF744: 0x7F87, - 0xF745: 0x81DE, - 0xF746: 0x826B, - 0xF747: 0x8634, - 0xF748: 0x8635, - 0xF749: 0x8633, - 0xF74A: 0x862C, - 0xF74B: 0x8632, - 0xF74C: 0x8636, - 0xF74D: 0x882C, - 0xF74E: 0x8828, - 0xF74F: 0x8826, - 0xF750: 0x882A, - 0xF751: 0x8825, - 0xF752: 0x8971, - 0xF753: 0x89BF, - 0xF754: 0x89BE, - 0xF755: 0x89FB, - 0xF756: 0x8B7E, - 0xF757: 0x8B84, - 0xF758: 0x8B82, - 0xF759: 0x8B86, - 0xF75A: 0x8B85, - 0xF75B: 0x8B7F, - 0xF75C: 0x8D15, - 0xF75D: 0x8E95, - 0xF75E: 0x8E94, - 0xF75F: 0x8E9A, - 0xF760: 0x8E92, - 0xF761: 0x8E90, - 0xF762: 0x8E96, - 0xF763: 0x8E97, - 0xF764: 0x8F60, - 0xF765: 0x8F62, - 0xF766: 0x9147, - 0xF767: 0x944C, - 0xF768: 0x9450, - 0xF769: 0x944A, - 0xF76A: 0x944B, - 0xF76B: 0x944F, - 0xF76C: 0x9447, - 0xF76D: 0x9445, - 0xF76E: 0x9448, - 0xF76F: 0x9449, - 0xF770: 0x9446, - 0xF771: 0x973F, - 0xF772: 0x97E3, - 0xF773: 0x986A, - 0xF774: 0x9869, - 0xF775: 0x98CB, - 0xF776: 0x9954, - 0xF777: 0x995B, - 0xF778: 0x9A4E, - 0xF779: 0x9A53, - 0xF77A: 0x9A54, - 0xF77B: 0x9A4C, - 0xF77C: 0x9A4F, - 0xF77D: 0x9A48, - 0xF77E: 0x9A4A, - 0xF7A1: 0x9A49, - 0xF7A2: 0x9A52, - 0xF7A3: 0x9A50, - 0xF7A4: 0x9AD0, - 0xF7A5: 0x9B19, - 0xF7A6: 0x9B2B, - 0xF7A7: 0x9B3B, - 0xF7A8: 0x9B56, - 0xF7A9: 0x9B55, - 0xF7AA: 0x9C46, - 0xF7AB: 0x9C48, - 0xF7AC: 0x9C3F, - 0xF7AD: 0x9C44, - 0xF7AE: 0x9C39, - 0xF7AF: 0x9C33, - 0xF7B0: 0x9C41, - 0xF7B1: 0x9C3C, - 0xF7B2: 0x9C37, - 0xF7B3: 0x9C34, - 0xF7B4: 0x9C32, - 0xF7B5: 0x9C3D, - 0xF7B6: 0x9C36, - 0xF7B7: 0x9DDB, - 0xF7B8: 0x9DD2, - 0xF7B9: 0x9DDE, - 0xF7BA: 0x9DDA, - 0xF7BB: 0x9DCB, - 0xF7BC: 0x9DD0, - 0xF7BD: 0x9DDC, - 0xF7BE: 0x9DD1, - 0xF7BF: 0x9DDF, - 0xF7C0: 0x9DE9, - 0xF7C1: 0x9DD9, - 0xF7C2: 0x9DD8, - 0xF7C3: 0x9DD6, - 0xF7C4: 0x9DF5, - 0xF7C5: 0x9DD5, - 0xF7C6: 0x9DDD, - 0xF7C7: 0x9EB6, - 0xF7C8: 0x9EF0, - 0xF7C9: 0x9F35, - 0xF7CA: 0x9F33, - 0xF7CB: 0x9F32, - 0xF7CC: 0x9F42, - 0xF7CD: 0x9F6B, - 0xF7CE: 0x9F95, - 0xF7CF: 0x9FA2, - 0xF7D0: 0x513D, - 0xF7D1: 0x5299, - 0xF7D2: 0x58E8, - 0xF7D3: 0x58E7, - 0xF7D4: 0x5972, - 0xF7D5: 0x5B4D, - 0xF7D6: 0x5DD8, - 0xF7D7: 0x882F, - 0xF7D8: 0x5F4F, - 0xF7D9: 0x6201, - 0xF7DA: 0x6203, - 0xF7DB: 0x6204, - 0xF7DC: 0x6529, - 0xF7DD: 0x6525, - 0xF7DE: 0x6596, - 0xF7DF: 0x66EB, - 0xF7E0: 0x6B11, - 0xF7E1: 0x6B12, - 0xF7E2: 0x6B0F, - 0xF7E3: 0x6BCA, - 0xF7E4: 0x705B, - 0xF7E5: 0x705A, - 0xF7E6: 0x7222, - 0xF7E7: 0x7382, - 0xF7E8: 0x7381, - 0xF7E9: 0x7383, - 0xF7EA: 0x7670, - 0xF7EB: 0x77D4, - 0xF7EC: 0x7C67, - 0xF7ED: 0x7C66, - 0xF7EE: 0x7E95, - 0xF7EF: 0x826C, - 0xF7F0: 0x863A, - 0xF7F1: 0x8640, - 0xF7F2: 0x8639, - 0xF7F3: 0x863C, - 0xF7F4: 0x8631, - 0xF7F5: 0x863B, - 0xF7F6: 0x863E, - 0xF7F7: 0x8830, - 0xF7F8: 0x8832, - 0xF7F9: 0x882E, - 0xF7FA: 0x8833, - 0xF7FB: 0x8976, - 0xF7FC: 0x8974, - 0xF7FD: 0x8973, - 0xF7FE: 0x89FE, - 0xF840: 0x8B8C, - 0xF841: 0x8B8E, - 0xF842: 0x8B8B, - 0xF843: 0x8B88, - 0xF844: 0x8C45, - 0xF845: 0x8D19, - 0xF846: 0x8E98, - 0xF847: 0x8F64, - 0xF848: 0x8F63, - 0xF849: 0x91BC, - 0xF84A: 0x9462, - 0xF84B: 0x9455, - 0xF84C: 0x945D, - 0xF84D: 0x9457, - 0xF84E: 0x945E, - 0xF84F: 0x97C4, - 0xF850: 0x97C5, - 0xF851: 0x9800, - 0xF852: 0x9A56, - 0xF853: 0x9A59, - 0xF854: 0x9B1E, - 0xF855: 0x9B1F, - 0xF856: 0x9B20, - 0xF857: 0x9C52, - 0xF858: 0x9C58, - 0xF859: 0x9C50, - 0xF85A: 0x9C4A, - 0xF85B: 0x9C4D, - 0xF85C: 0x9C4B, - 0xF85D: 0x9C55, - 0xF85E: 0x9C59, - 0xF85F: 0x9C4C, - 0xF860: 0x9C4E, - 0xF861: 0x9DFB, - 0xF862: 0x9DF7, - 0xF863: 0x9DEF, - 0xF864: 0x9DE3, - 0xF865: 0x9DEB, - 0xF866: 0x9DF8, - 0xF867: 0x9DE4, - 0xF868: 0x9DF6, - 0xF869: 0x9DE1, - 0xF86A: 0x9DEE, - 0xF86B: 0x9DE6, - 0xF86C: 0x9DF2, - 0xF86D: 0x9DF0, - 0xF86E: 0x9DE2, - 0xF86F: 0x9DEC, - 0xF870: 0x9DF4, - 0xF871: 0x9DF3, - 0xF872: 0x9DE8, - 0xF873: 0x9DED, - 0xF874: 0x9EC2, - 0xF875: 0x9ED0, - 0xF876: 0x9EF2, - 0xF877: 0x9EF3, - 0xF878: 0x9F06, - 0xF879: 0x9F1C, - 0xF87A: 0x9F38, - 0xF87B: 0x9F37, - 0xF87C: 0x9F36, - 0xF87D: 0x9F43, - 0xF87E: 0x9F4F, - 0xF8A1: 0x9F71, - 0xF8A2: 0x9F70, - 0xF8A3: 0x9F6E, - 0xF8A4: 0x9F6F, - 0xF8A5: 0x56D3, - 0xF8A6: 0x56CD, - 0xF8A7: 0x5B4E, - 0xF8A8: 0x5C6D, - 0xF8A9: 0x652D, - 0xF8AA: 0x66ED, - 0xF8AB: 0x66EE, - 0xF8AC: 0x6B13, - 0xF8AD: 0x705F, - 0xF8AE: 0x7061, - 0xF8AF: 0x705D, - 0xF8B0: 0x7060, - 0xF8B1: 0x7223, - 0xF8B2: 0x74DB, - 0xF8B3: 0x74E5, - 0xF8B4: 0x77D5, - 0xF8B5: 0x7938, - 0xF8B6: 0x79B7, - 0xF8B7: 0x79B6, - 0xF8B8: 0x7C6A, - 0xF8B9: 0x7E97, - 0xF8BA: 0x7F89, - 0xF8BB: 0x826D, - 0xF8BC: 0x8643, - 0xF8BD: 0x8838, - 0xF8BE: 0x8837, - 0xF8BF: 0x8835, - 0xF8C0: 0x884B, - 0xF8C1: 0x8B94, - 0xF8C2: 0x8B95, - 0xF8C3: 0x8E9E, - 0xF8C4: 0x8E9F, - 0xF8C5: 0x8EA0, - 0xF8C6: 0x8E9D, - 0xF8C7: 0x91BE, - 0xF8C8: 0x91BD, - 0xF8C9: 0x91C2, - 0xF8CA: 0x946B, - 0xF8CB: 0x9468, - 0xF8CC: 0x9469, - 0xF8CD: 0x96E5, - 0xF8CE: 0x9746, - 0xF8CF: 0x9743, - 0xF8D0: 0x9747, - 0xF8D1: 0x97C7, - 0xF8D2: 0x97E5, - 0xF8D3: 0x9A5E, - 0xF8D4: 0x9AD5, - 0xF8D5: 0x9B59, - 0xF8D6: 0x9C63, - 0xF8D7: 0x9C67, - 0xF8D8: 0x9C66, - 0xF8D9: 0x9C62, - 0xF8DA: 0x9C5E, - 0xF8DB: 0x9C60, - 0xF8DC: 0x9E02, - 0xF8DD: 0x9DFE, - 0xF8DE: 0x9E07, - 0xF8DF: 0x9E03, - 0xF8E0: 0x9E06, - 0xF8E1: 0x9E05, - 0xF8E2: 0x9E00, - 0xF8E3: 0x9E01, - 0xF8E4: 0x9E09, - 0xF8E5: 0x9DFF, - 0xF8E6: 0x9DFD, - 0xF8E7: 0x9E04, - 0xF8E8: 0x9EA0, - 0xF8E9: 0x9F1E, - 0xF8EA: 0x9F46, - 0xF8EB: 0x9F74, - 0xF8EC: 0x9F75, - 0xF8ED: 0x9F76, - 0xF8EE: 0x56D4, - 0xF8EF: 0x652E, - 0xF8F0: 0x65B8, - 0xF8F1: 0x6B18, - 0xF8F2: 0x6B19, - 0xF8F3: 0x6B17, - 0xF8F4: 0x6B1A, - 0xF8F5: 0x7062, - 0xF8F6: 0x7226, - 0xF8F7: 0x72AA, - 0xF8F8: 0x77D8, - 0xF8F9: 0x77D9, - 0xF8FA: 0x7939, - 0xF8FB: 0x7C69, - 0xF8FC: 0x7C6B, - 0xF8FD: 0x7CF6, - 0xF8FE: 0x7E9A, - 0xF940: 0x7E98, - 0xF941: 0x7E9B, - 0xF942: 0x7E99, - 0xF943: 0x81E0, - 0xF944: 0x81E1, - 0xF945: 0x8646, - 0xF946: 0x8647, - 0xF947: 0x8648, - 0xF948: 0x8979, - 0xF949: 0x897A, - 0xF94A: 0x897C, - 0xF94B: 0x897B, - 0xF94C: 0x89FF, - 0xF94D: 0x8B98, - 0xF94E: 0x8B99, - 0xF94F: 0x8EA5, - 0xF950: 0x8EA4, - 0xF951: 0x8EA3, - 0xF952: 0x946E, - 0xF953: 0x946D, - 0xF954: 0x946F, - 0xF955: 0x9471, - 0xF956: 0x9473, - 0xF957: 0x9749, - 0xF958: 0x9872, - 0xF959: 0x995F, - 0xF95A: 0x9C68, - 0xF95B: 0x9C6E, - 0xF95C: 0x9C6D, - 0xF95D: 0x9E0B, - 0xF95E: 0x9E0D, - 0xF95F: 0x9E10, - 0xF960: 0x9E0F, - 0xF961: 0x9E12, - 0xF962: 0x9E11, - 0xF963: 0x9EA1, - 0xF964: 0x9EF5, - 0xF965: 0x9F09, - 0xF966: 0x9F47, - 0xF967: 0x9F78, - 0xF968: 0x9F7B, - 0xF969: 0x9F7A, - 0xF96A: 0x9F79, - 0xF96B: 0x571E, - 0xF96C: 0x7066, - 0xF96D: 0x7C6F, - 0xF96E: 0x883C, - 0xF96F: 0x8DB2, - 0xF970: 0x8EA6, - 0xF971: 0x91C3, - 0xF972: 0x9474, - 0xF973: 0x9478, - 0xF974: 0x9476, - 0xF975: 0x9475, - 0xF976: 0x9A60, - 0xF977: 0x9C74, - 0xF978: 0x9C73, - 0xF979: 0x9C71, - 0xF97A: 0x9C75, - 0xF97B: 0x9E14, - 0xF97C: 0x9E13, - 0xF97D: 0x9EF6, - 0xF97E: 0x9F0A, - 0xF9A1: 0x9FA4, - 0xF9A2: 0x7068, - 0xF9A3: 0x7065, - 0xF9A4: 0x7CF7, - 0xF9A5: 0x866A, - 0xF9A6: 0x883E, - 0xF9A7: 0x883D, - 0xF9A8: 0x883F, - 0xF9A9: 0x8B9E, - 0xF9AA: 0x8C9C, - 0xF9AB: 0x8EA9, - 0xF9AC: 0x8EC9, - 0xF9AD: 0x974B, - 0xF9AE: 0x9873, - 0xF9AF: 0x9874, - 0xF9B0: 0x98CC, - 0xF9B1: 0x9961, - 0xF9B2: 0x99AB, - 0xF9B3: 0x9A64, - 0xF9B4: 0x9A66, - 0xF9B5: 0x9A67, - 0xF9B6: 0x9B24, - 0xF9B7: 0x9E15, - 0xF9B8: 0x9E17, - 0xF9B9: 0x9F48, - 0xF9BA: 0x6207, - 0xF9BB: 0x6B1E, - 0xF9BC: 0x7227, - 0xF9BD: 0x864C, - 0xF9BE: 0x8EA8, - 0xF9BF: 0x9482, - 0xF9C0: 0x9480, - 0xF9C1: 0x9481, - 0xF9C2: 0x9A69, - 0xF9C3: 0x9A68, - 0xF9C4: 0x9B2E, - 0xF9C5: 0x9E19, - 0xF9C6: 0x7229, - 0xF9C7: 0x864B, - 0xF9C8: 0x8B9F, - 0xF9C9: 0x9483, - 0xF9CA: 0x9C79, - 0xF9CB: 0x9EB7, - 0xF9CC: 0x7675, - 0xF9CD: 0x9A6B, - 0xF9CE: 0x9C7A, - 0xF9CF: 0x9E1D, - 0xF9D0: 0x7069, - 0xF9D1: 0x706A, - 0xF9D2: 0x9EA4, - 0xF9D3: 0x9F7E, - 0xF9D4: 0x9F49, - 0xF9D5: 0x9F98, -} diff --git a/vendor/github.com/Tang-RoseChild/mahonia/big5.go b/vendor/github.com/Tang-RoseChild/mahonia/big5.go deleted file mode 100644 index 07044fe9e..000000000 --- a/vendor/github.com/Tang-RoseChild/mahonia/big5.go +++ /dev/null @@ -1,89 +0,0 @@ -package mahonia - -// Converters for Big 5 encoding. - -import ( - "sync" -) - -func init() { - RegisterCharset(&Charset{ - Name: "Big5", - Aliases: []string{"csBig5"}, - NewDecoder: func() Decoder { - return decodeBig5Rune - }, - NewEncoder: func() Encoder { - big5Once.Do(reverseBig5Table) - return encodeBig5Rune - }, - }) -} - -func decodeBig5Rune(p []byte) (r rune, size int, status Status) { - if len(p) == 0 { - status = NO_ROOM - return - } - - b := p[0] - if b < 128 { - return rune(b), 1, SUCCESS - } - - if len(p) < 2 { - status = NO_ROOM - return - } - - c := int(p[0])<<8 + int(p[1]) - c = int(big5ToUnicode[c]) - if c > 0 { - return rune(c), 2, SUCCESS - } - - return 0xfffd, 1, INVALID_CHAR -} - -func encodeBig5Rune(p []byte, r rune) (size int, status Status) { - if len(p) == 0 { - status = NO_ROOM - return - } - - if r < 128 { - p[0] = byte(r) - return 1, SUCCESS - } - - if len(p) < 2 { - status = NO_ROOM - return - } - - if r < 0x10000 { - c := unicodeToBig5[r] - if c > 0 { - p[0] = byte(c >> 8) - p[1] = byte(c) - return 2, SUCCESS - } - } - - p[0] = '?' - return 1, INVALID_CHAR -} - -var big5Once sync.Once - -var unicodeToBig5 []uint16 - -func reverseBig5Table() { - unicodeToBig5 = make([]uint16, 65536) - - for big5, unicode := range big5ToUnicode { - if unicode > 0 { - unicodeToBig5[unicode] = uint16(big5) - } - } -} diff --git a/vendor/github.com/Tang-RoseChild/mahonia/charset.go b/vendor/github.com/Tang-RoseChild/mahonia/charset.go deleted file mode 100644 index 14fa3b883..000000000 --- a/vendor/github.com/Tang-RoseChild/mahonia/charset.go +++ /dev/null @@ -1,115 +0,0 @@ -// This package is a character-set conversion library for Go. -// -// (DEPRECATED: use code.google.com/p/go.text/encoding, perhaps along with -// code.google.com/p/go.net/html/charset) -package mahonia - -import ( - "bytes" - "unicode" -) - -// Status is the type for the status return value from a Decoder or Encoder. -type Status int - -const ( - // SUCCESS means that the character was converted with no problems. - SUCCESS = Status(iota) - - // INVALID_CHAR means that the source contained invalid bytes, or that the character - // could not be represented in the destination encoding. - // The Encoder or Decoder should have output a substitute character. - INVALID_CHAR - - // NO_ROOM means there were not enough input bytes to form a complete character, - // or there was not enough room in the output buffer to write a complete character. - // No bytes were written, and no internal state was changed in the Encoder or Decoder. - NO_ROOM - - // STATE_ONLY means that bytes were read or written indicating a state transition, - // but no actual character was processed. (Examples: byte order marks, ISO-2022 escape sequences) - STATE_ONLY -) - -// A Decoder is a function that decodes a character set, one character at a time. -// It works much like utf8.DecodeRune, but has an aditional status return value. -type Decoder func(p []byte) (c rune, size int, status Status) - -// An Encoder is a function that encodes a character set, one character at a time. -// It works much like utf8.EncodeRune, but has an additional status return value. -type Encoder func(p []byte, c rune) (size int, status Status) - -// A Charset represents a character set that can be converted, and contains functions -// to create Converters to encode and decode strings in that character set. -type Charset struct { - // Name is the character set's canonical name. - Name string - - // Aliases returns a list of alternate names. - Aliases []string - - // NewDecoder returns a Decoder to convert from the charset to Unicode. - NewDecoder func() Decoder - - // NewEncoder returns an Encoder to convert from Unicode to the charset. - NewEncoder func() Encoder -} - -// The charsets are stored in charsets under their canonical names. -var charsets = make(map[string]*Charset) - -// aliases maps their aliases to their canonical names. -var aliases = make(map[string]string) - -// simplifyName converts a name to lower case and removes non-alphanumeric characters. -// This is how the names are used as keys to the maps. -func simplifyName(name string) string { - var buf bytes.Buffer - for _, c := range name { - switch { - case unicode.IsDigit(c): - buf.WriteRune(c) - case unicode.IsLetter(c): - buf.WriteRune(unicode.ToLower(c)) - default: - - } - } - - return buf.String() -} - -// RegisterCharset adds a charset to the charsetMap. -func RegisterCharset(cs *Charset) { - name := cs.Name - charsets[name] = cs - aliases[simplifyName(name)] = name - for _, alias := range cs.Aliases { - aliases[simplifyName(alias)] = name - } -} - -// GetCharset fetches a charset by name. -// If the name is not found, it returns nil. -func GetCharset(name string) *Charset { - return charsets[aliases[simplifyName(name)]] -} - -// NewDecoder returns a Decoder to decode the named charset. -// If the name is not found, it returns nil. -func NewDecoder(name string) Decoder { - cs := GetCharset(name) - if cs == nil { - return nil - } - return cs.NewDecoder() -} - -// NewEncoder returns an Encoder to encode the named charset. -func NewEncoder(name string) Encoder { - cs := GetCharset(name) - if cs == nil { - return nil - } - return cs.NewEncoder() -} diff --git a/vendor/github.com/Tang-RoseChild/mahonia/convert_string.go b/vendor/github.com/Tang-RoseChild/mahonia/convert_string.go deleted file mode 100644 index 1624b888b..000000000 --- a/vendor/github.com/Tang-RoseChild/mahonia/convert_string.go +++ /dev/null @@ -1,135 +0,0 @@ -package mahonia - -import ( - "unicode/utf8" -) - -// ConvertString converts a string from UTF-8 to e's encoding. -func (e Encoder) ConvertString(s string) string { - dest := make([]byte, len(s)+10) - destPos := 0 - - for _, rune := range s { - retry: - size, status := e(dest[destPos:], rune) - - if status == NO_ROOM { - newDest := make([]byte, len(dest)*2) - copy(newDest, dest) - dest = newDest - goto retry - } - - if status == STATE_ONLY { - destPos += size - goto retry - } - - destPos += size - } - - return string(dest[:destPos]) -} - -// ConvertString converts a string from d's encoding to UTF-8. -func (d Decoder) ConvertString(s string) string { - bytes := []byte(s) - runes := make([]rune, len(s)) - destPos := 0 - - for len(bytes) > 0 { - c, size, status := d(bytes) - - if status == STATE_ONLY { - bytes = bytes[size:] - continue - } - - if status == NO_ROOM { - c = 0xfffd - size = len(bytes) - status = INVALID_CHAR - } - - bytes = bytes[size:] - runes[destPos] = c - destPos++ - } - - return string(runes[:destPos]) -} - -// ConvertStringOK converts a string from UTF-8 to e's encoding. It also -// returns a boolean indicating whether every character was converted -// successfully. -func (e Encoder) ConvertStringOK(s string) (result string, ok bool) { - dest := make([]byte, len(s)+10) - destPos := 0 - ok = true - - for i, r := range s { - // The following test is copied from utf8.ValidString. - if r == utf8.RuneError && ok { - _, size := utf8.DecodeRuneInString(s[i:]) - if size == 1 { - ok = false - } - } - - retry: - size, status := e(dest[destPos:], r) - - switch status { - case NO_ROOM: - newDest := make([]byte, len(dest)*2) - copy(newDest, dest) - dest = newDest - goto retry - - case STATE_ONLY: - destPos += size - goto retry - - case INVALID_CHAR: - ok = false - } - - destPos += size - } - - return string(dest[:destPos]), ok -} - -// ConvertStringOK converts a string from d's encoding to UTF-8. -// It also returns a boolean indicating whether every character was converted -// successfully. -func (d Decoder) ConvertStringOK(s string) (result string, ok bool) { - bytes := []byte(s) - runes := make([]rune, len(s)) - destPos := 0 - ok = true - - for len(bytes) > 0 { - c, size, status := d(bytes) - - switch status { - case STATE_ONLY: - bytes = bytes[size:] - continue - - case NO_ROOM: - c = 0xfffd - size = len(bytes) - ok = false - - case INVALID_CHAR: - ok = false - } - - bytes = bytes[size:] - runes[destPos] = c - destPos++ - } - - return string(runes[:destPos]), ok -} diff --git a/vendor/github.com/Tang-RoseChild/mahonia/cp51932.go b/vendor/github.com/Tang-RoseChild/mahonia/cp51932.go deleted file mode 100644 index a8c3d00ee..000000000 --- a/vendor/github.com/Tang-RoseChild/mahonia/cp51932.go +++ /dev/null @@ -1,76 +0,0 @@ -package mahonia - -import ( - "unicode/utf8" -) - -// Converters for Microsoft's version of the EUC-JP encoding - -func init() { - RegisterCharset(&Charset{ - Name: "cp51932", - Aliases: []string{"windows-51932"}, - NewDecoder: func() Decoder { - return decodeCP51932 - }, - NewEncoder: func() Encoder { - msJISTable.Reverse() - return encodeCP51932 - }, - }) -} - -func decodeCP51932(p []byte) (c rune, size int, status Status) { - if len(p) == 0 { - return 0, 0, NO_ROOM - } - - b := p[0] - switch { - case b < 0x80: - return rune(b), 1, SUCCESS - - case b == 0x8e: - if len(p) < 2 { - return 0, 0, NO_ROOM - } - b2 := p[1] - if b2 < 0xa1 || b2 > 0xdf { - return utf8.RuneError, 1, INVALID_CHAR - } - return rune(b2) + (0xff61 - 0xa1), 2, SUCCESS - - case 0xa1 <= b && b <= 0xfe: - return msJISTable.DecodeHigh(p) - } - - return utf8.RuneError, 1, INVALID_CHAR -} - -func encodeCP51932(p []byte, c rune) (size int, status Status) { - if len(p) == 0 { - return 0, NO_ROOM - } - - if c < 0x80 { - p[0] = byte(c) - return 1, SUCCESS - } - - if len(p) < 2 { - return 0, NO_ROOM - } - - if c > 0xffff { - p[0] = '?' - return 1, INVALID_CHAR - } - - if 0xff61 <= c && c <= 0xff9f { - p[0] = 0x8e - p[1] = byte(c - (0xff61 - 0xa1)) - return 2, SUCCESS - } - - return msJISTable.EncodeHigh(p, c) -} diff --git a/vendor/github.com/Tang-RoseChild/mahonia/entity.go b/vendor/github.com/Tang-RoseChild/mahonia/entity.go deleted file mode 100644 index ed31bbaaa..000000000 --- a/vendor/github.com/Tang-RoseChild/mahonia/entity.go +++ /dev/null @@ -1,179 +0,0 @@ -package mahonia - -// decoding HTML entities - -import ( - "sort" -) - -// EntityDecoder returns a Decoder that decodes HTML character entities. -// If there is no valid character entity at the current position, it returns INVALID_CHAR. -// So it needs to be combined with another Decoder via FallbackDecoder. -func EntityDecoder() Decoder { - var leftover rune // leftover rune from two-rune entity - return func(p []byte) (r rune, size int, status Status) { - if leftover != 0 { - r = leftover - leftover = 0 - return r, 0, SUCCESS - } - - if len(p) == 0 { - return 0, 0, NO_ROOM - } - - if p[0] != '&' { - return 0xfffd, 1, INVALID_CHAR - } - - if len(p) < 3 { - return 0, 1, NO_ROOM - } - - r, size, status = 0xfffd, 1, INVALID_CHAR - n := 1 // number of bytes read so far - - if p[n] == '#' { - n++ - c := p[n] - hex := false - if c == 'x' || c == 'X' { - hex = true - n++ - } - - var x rune - for n < len(p) { - c = p[n] - n++ - if hex { - if '0' <= c && c <= '9' { - x = 16*x + rune(c) - '0' - continue - } else if 'a' <= c && c <= 'f' { - x = 16*x + rune(c) - 'a' + 10 - continue - } else if 'A' <= c && c <= 'F' { - x = 16*x + rune(c) - 'A' + 10 - continue - } - } else if '0' <= c && c <= '9' { - x = 10*x + rune(c) - '0' - continue - } - if c != ';' { - n-- - } - break - } - - if n == len(p) && p[n-1] != ';' { - return 0, 0, NO_ROOM - } - - size = n - if p[n-1] == ';' { - n-- - } - if hex { - n-- - } - n-- - // Now n is the number of actual digits read. - if n == 0 { - return 0xfffd, 1, INVALID_CHAR - } - - if 0x80 <= x && x <= 0x9F { - // Replace characters from Windows-1252 with UTF-8 equivalents. - x = replacementTable[x-0x80] - } else if x == 0 || (0xD800 <= x && x <= 0xDFFF) || x > 0x10FFFF { - // Replace invalid characters with the replacement character. - return 0xfffd, size, INVALID_CHAR - } - - r = x - status = SUCCESS - return - } - - // Look for a named entity in EntityList. - - possible := entityList - for len(possible) > 0 { - if len(p) <= n { - leftover = 0 - return 0, 0, NO_ROOM - } - - c := p[n] - - // Narrow down the selection in possible to those items that have c in the - // appropriate byte. - first := sort.Search(len(possible), func(i int) bool { - e := possible[i].name - if len(e) < n { - return false - } - return e[n-1] >= c - }) - possible = possible[first:] - last := sort.Search(len(possible), func(i int) bool { - return possible[i].name[n-1] > c - }) - possible = possible[:last] - - n++ - if len(possible) > 0 && len(possible[0].name) == n-1 { - r, leftover = possible[0].r1, possible[0].r2 - size = n - status = SUCCESS - // but don't return yet, since we need the longest match - } - } - - return - } -} - -// This table is copied from /src/pkg/html/escape.go in the Go source -// -// These replacements permit compatibility with old numeric entities that -// assumed Windows-1252 encoding. -// http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#consume-a-character-reference -var replacementTable = [...]rune{ - '\u20AC', // First entry is what 0x80 should be replaced with. - '\u0081', - '\u201A', - '\u0192', - '\u201E', - '\u2026', - '\u2020', - '\u2021', - '\u02C6', - '\u2030', - '\u0160', - '\u2039', - '\u0152', - '\u008D', - '\u017D', - '\u008F', - '\u0090', - '\u2018', - '\u2019', - '\u201C', - '\u201D', - '\u2022', - '\u2013', - '\u2014', - '\u02DC', - '\u2122', - '\u0161', - '\u203A', - '\u0153', - '\u009D', - '\u017E', - '\u0178', // Last entry is 0x9F. - // 0x00->'\uFFFD' is handled programmatically. - // 0x0D->'\u000D' is a no-op. -} diff --git a/vendor/github.com/Tang-RoseChild/mahonia/entity_data.go b/vendor/github.com/Tang-RoseChild/mahonia/entity_data.go deleted file mode 100644 index e509e1a52..000000000 --- a/vendor/github.com/Tang-RoseChild/mahonia/entity_data.go +++ /dev/null @@ -1,2254 +0,0 @@ -package mahonia - -// Taken from /src/pkg/html/entity.go in the Go source code. - -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//package html - -// entityList is a list of HTML entity names and their values. The semicolon matters: -// http://www.whatwg.org/specs/web-apps/current-work/multipage/named-character-references.html -// lists both "amp" and "amp;" as two separate entries. -// -// Most entities translate to a single rune (r1); a few translate to two (r1 and r2). -// -// Note that the HTML5 list is larger than the HTML4 list at -// http://www.w3.org/TR/html4/sgml/entities.html -var entityList = []struct { - name string - r1, r2 rune -}{ - {"AElig", '\U000000C6', 0}, - {"AElig;", '\U000000C6', 0}, - {"AMP", '\U00000026', 0}, - {"AMP;", '\U00000026', 0}, - {"Aacute", '\U000000C1', 0}, - {"Aacute;", '\U000000C1', 0}, - {"Abreve;", '\U00000102', 0}, - {"Acirc", '\U000000C2', 0}, - {"Acirc;", '\U000000C2', 0}, - {"Acy;", '\U00000410', 0}, - {"Afr;", '\U0001D504', 0}, - {"Agrave", '\U000000C0', 0}, - {"Agrave;", '\U000000C0', 0}, - {"Alpha;", '\U00000391', 0}, - {"Amacr;", '\U00000100', 0}, - {"And;", '\U00002A53', 0}, - {"Aogon;", '\U00000104', 0}, - {"Aopf;", '\U0001D538', 0}, - {"ApplyFunction;", '\U00002061', 0}, - {"Aring", '\U000000C5', 0}, - {"Aring;", '\U000000C5', 0}, - {"Ascr;", '\U0001D49C', 0}, - {"Assign;", '\U00002254', 0}, - {"Atilde", '\U000000C3', 0}, - {"Atilde;", '\U000000C3', 0}, - {"Auml", '\U000000C4', 0}, - {"Auml;", '\U000000C4', 0}, - {"Backslash;", '\U00002216', 0}, - {"Barv;", '\U00002AE7', 0}, - {"Barwed;", '\U00002306', 0}, - {"Bcy;", '\U00000411', 0}, - {"Because;", '\U00002235', 0}, - {"Bernoullis;", '\U0000212C', 0}, - {"Beta;", '\U00000392', 0}, - {"Bfr;", '\U0001D505', 0}, - {"Bopf;", '\U0001D539', 0}, - {"Breve;", '\U000002D8', 0}, - {"Bscr;", '\U0000212C', 0}, - {"Bumpeq;", '\U0000224E', 0}, - {"CHcy;", '\U00000427', 0}, - {"COPY", '\U000000A9', 0}, - {"COPY;", '\U000000A9', 0}, - {"Cacute;", '\U00000106', 0}, - {"Cap;", '\U000022D2', 0}, - {"CapitalDifferentialD;", '\U00002145', 0}, - {"Cayleys;", '\U0000212D', 0}, - {"Ccaron;", '\U0000010C', 0}, - {"Ccedil", '\U000000C7', 0}, - {"Ccedil;", '\U000000C7', 0}, - {"Ccirc;", '\U00000108', 0}, - {"Cconint;", '\U00002230', 0}, - {"Cdot;", '\U0000010A', 0}, - {"Cedilla;", '\U000000B8', 0}, - {"CenterDot;", '\U000000B7', 0}, - {"Cfr;", '\U0000212D', 0}, - {"Chi;", '\U000003A7', 0}, - {"CircleDot;", '\U00002299', 0}, - {"CircleMinus;", '\U00002296', 0}, - {"CirclePlus;", '\U00002295', 0}, - {"CircleTimes;", '\U00002297', 0}, - {"ClockwiseContourIntegral;", '\U00002232', 0}, - {"CloseCurlyDoubleQuote;", '\U0000201D', 0}, - {"CloseCurlyQuote;", '\U00002019', 0}, - {"Colon;", '\U00002237', 0}, - {"Colone;", '\U00002A74', 0}, - {"Congruent;", '\U00002261', 0}, - {"Conint;", '\U0000222F', 0}, - {"ContourIntegral;", '\U0000222E', 0}, - {"Copf;", '\U00002102', 0}, - {"Coproduct;", '\U00002210', 0}, - {"CounterClockwiseContourIntegral;", '\U00002233', 0}, - {"Cross;", '\U00002A2F', 0}, - {"Cscr;", '\U0001D49E', 0}, - {"Cup;", '\U000022D3', 0}, - {"CupCap;", '\U0000224D', 0}, - {"DD;", '\U00002145', 0}, - {"DDotrahd;", '\U00002911', 0}, - {"DJcy;", '\U00000402', 0}, - {"DScy;", '\U00000405', 0}, - {"DZcy;", '\U0000040F', 0}, - {"Dagger;", '\U00002021', 0}, - {"Darr;", '\U000021A1', 0}, - {"Dashv;", '\U00002AE4', 0}, - {"Dcaron;", '\U0000010E', 0}, - {"Dcy;", '\U00000414', 0}, - {"Del;", '\U00002207', 0}, - {"Delta;", '\U00000394', 0}, - {"Dfr;", '\U0001D507', 0}, - {"DiacriticalAcute;", '\U000000B4', 0}, - {"DiacriticalDot;", '\U000002D9', 0}, - {"DiacriticalDoubleAcute;", '\U000002DD', 0}, - {"DiacriticalGrave;", '\U00000060', 0}, - {"DiacriticalTilde;", '\U000002DC', 0}, - {"Diamond;", '\U000022C4', 0}, - {"DifferentialD;", '\U00002146', 0}, - {"Dopf;", '\U0001D53B', 0}, - {"Dot;", '\U000000A8', 0}, - {"DotDot;", '\U000020DC', 0}, - {"DotEqual;", '\U00002250', 0}, - {"DoubleContourIntegral;", '\U0000222F', 0}, - {"DoubleDot;", '\U000000A8', 0}, - {"DoubleDownArrow;", '\U000021D3', 0}, - {"DoubleLeftArrow;", '\U000021D0', 0}, - {"DoubleLeftRightArrow;", '\U000021D4', 0}, - {"DoubleLeftTee;", '\U00002AE4', 0}, - {"DoubleLongLeftArrow;", '\U000027F8', 0}, - {"DoubleLongLeftRightArrow;", '\U000027FA', 0}, - {"DoubleLongRightArrow;", '\U000027F9', 0}, - {"DoubleRightArrow;", '\U000021D2', 0}, - {"DoubleRightTee;", '\U000022A8', 0}, - {"DoubleUpArrow;", '\U000021D1', 0}, - {"DoubleUpDownArrow;", '\U000021D5', 0}, - {"DoubleVerticalBar;", '\U00002225', 0}, - {"DownArrow;", '\U00002193', 0}, - {"DownArrowBar;", '\U00002913', 0}, - {"DownArrowUpArrow;", '\U000021F5', 0}, - {"DownBreve;", '\U00000311', 0}, - {"DownLeftRightVector;", '\U00002950', 0}, - {"DownLeftTeeVector;", '\U0000295E', 0}, - {"DownLeftVector;", '\U000021BD', 0}, - {"DownLeftVectorBar;", '\U00002956', 0}, - {"DownRightTeeVector;", '\U0000295F', 0}, - {"DownRightVector;", '\U000021C1', 0}, - {"DownRightVectorBar;", '\U00002957', 0}, - {"DownTee;", '\U000022A4', 0}, - {"DownTeeArrow;", '\U000021A7', 0}, - {"Downarrow;", '\U000021D3', 0}, - {"Dscr;", '\U0001D49F', 0}, - {"Dstrok;", '\U00000110', 0}, - {"ENG;", '\U0000014A', 0}, - {"ETH", '\U000000D0', 0}, - {"ETH;", '\U000000D0', 0}, - {"Eacute", '\U000000C9', 0}, - {"Eacute;", '\U000000C9', 0}, - {"Ecaron;", '\U0000011A', 0}, - {"Ecirc", '\U000000CA', 0}, - {"Ecirc;", '\U000000CA', 0}, - {"Ecy;", '\U0000042D', 0}, - {"Edot;", '\U00000116', 0}, - {"Efr;", '\U0001D508', 0}, - {"Egrave", '\U000000C8', 0}, - {"Egrave;", '\U000000C8', 0}, - {"Element;", '\U00002208', 0}, - {"Emacr;", '\U00000112', 0}, - {"EmptySmallSquare;", '\U000025FB', 0}, - {"EmptyVerySmallSquare;", '\U000025AB', 0}, - {"Eogon;", '\U00000118', 0}, - {"Eopf;", '\U0001D53C', 0}, - {"Epsilon;", '\U00000395', 0}, - {"Equal;", '\U00002A75', 0}, - {"EqualTilde;", '\U00002242', 0}, - {"Equilibrium;", '\U000021CC', 0}, - {"Escr;", '\U00002130', 0}, - {"Esim;", '\U00002A73', 0}, - {"Eta;", '\U00000397', 0}, - {"Euml", '\U000000CB', 0}, - {"Euml;", '\U000000CB', 0}, - {"Exists;", '\U00002203', 0}, - {"ExponentialE;", '\U00002147', 0}, - {"Fcy;", '\U00000424', 0}, - {"Ffr;", '\U0001D509', 0}, - {"FilledSmallSquare;", '\U000025FC', 0}, - {"FilledVerySmallSquare;", '\U000025AA', 0}, - {"Fopf;", '\U0001D53D', 0}, - {"ForAll;", '\U00002200', 0}, - {"Fouriertrf;", '\U00002131', 0}, - {"Fscr;", '\U00002131', 0}, - {"GJcy;", '\U00000403', 0}, - {"GT", '\U0000003E', 0}, - {"GT;", '\U0000003E', 0}, - {"Gamma;", '\U00000393', 0}, - {"Gammad;", '\U000003DC', 0}, - {"Gbreve;", '\U0000011E', 0}, - {"Gcedil;", '\U00000122', 0}, - {"Gcirc;", '\U0000011C', 0}, - {"Gcy;", '\U00000413', 0}, - {"Gdot;", '\U00000120', 0}, - {"Gfr;", '\U0001D50A', 0}, - {"Gg;", '\U000022D9', 0}, - {"Gopf;", '\U0001D53E', 0}, - {"GreaterEqual;", '\U00002265', 0}, - {"GreaterEqualLess;", '\U000022DB', 0}, - {"GreaterFullEqual;", '\U00002267', 0}, - {"GreaterGreater;", '\U00002AA2', 0}, - {"GreaterLess;", '\U00002277', 0}, - {"GreaterSlantEqual;", '\U00002A7E', 0}, - {"GreaterTilde;", '\U00002273', 0}, - {"Gscr;", '\U0001D4A2', 0}, - {"Gt;", '\U0000226B', 0}, - {"HARDcy;", '\U0000042A', 0}, - {"Hacek;", '\U000002C7', 0}, - {"Hat;", '\U0000005E', 0}, - {"Hcirc;", '\U00000124', 0}, - {"Hfr;", '\U0000210C', 0}, - {"HilbertSpace;", '\U0000210B', 0}, - {"Hopf;", '\U0000210D', 0}, - {"HorizontalLine;", '\U00002500', 0}, - {"Hscr;", '\U0000210B', 0}, - {"Hstrok;", '\U00000126', 0}, - {"HumpDownHump;", '\U0000224E', 0}, - {"HumpEqual;", '\U0000224F', 0}, - {"IEcy;", '\U00000415', 0}, - {"IJlig;", '\U00000132', 0}, - {"IOcy;", '\U00000401', 0}, - {"Iacute", '\U000000CD', 0}, - {"Iacute;", '\U000000CD', 0}, - {"Icirc", '\U000000CE', 0}, - {"Icirc;", '\U000000CE', 0}, - {"Icy;", '\U00000418', 0}, - {"Idot;", '\U00000130', 0}, - {"Ifr;", '\U00002111', 0}, - {"Igrave", '\U000000CC', 0}, - {"Igrave;", '\U000000CC', 0}, - {"Im;", '\U00002111', 0}, - {"Imacr;", '\U0000012A', 0}, - {"ImaginaryI;", '\U00002148', 0}, - {"Implies;", '\U000021D2', 0}, - {"Int;", '\U0000222C', 0}, - {"Integral;", '\U0000222B', 0}, - {"Intersection;", '\U000022C2', 0}, - {"InvisibleComma;", '\U00002063', 0}, - {"InvisibleTimes;", '\U00002062', 0}, - {"Iogon;", '\U0000012E', 0}, - {"Iopf;", '\U0001D540', 0}, - {"Iota;", '\U00000399', 0}, - {"Iscr;", '\U00002110', 0}, - {"Itilde;", '\U00000128', 0}, - {"Iukcy;", '\U00000406', 0}, - {"Iuml", '\U000000CF', 0}, - {"Iuml;", '\U000000CF', 0}, - {"Jcirc;", '\U00000134', 0}, - {"Jcy;", '\U00000419', 0}, - {"Jfr;", '\U0001D50D', 0}, - {"Jopf;", '\U0001D541', 0}, - {"Jscr;", '\U0001D4A5', 0}, - {"Jsercy;", '\U00000408', 0}, - {"Jukcy;", '\U00000404', 0}, - {"KHcy;", '\U00000425', 0}, - {"KJcy;", '\U0000040C', 0}, - {"Kappa;", '\U0000039A', 0}, - {"Kcedil;", '\U00000136', 0}, - {"Kcy;", '\U0000041A', 0}, - {"Kfr;", '\U0001D50E', 0}, - {"Kopf;", '\U0001D542', 0}, - {"Kscr;", '\U0001D4A6', 0}, - {"LJcy;", '\U00000409', 0}, - {"LT", '\U0000003C', 0}, - {"LT;", '\U0000003C', 0}, - {"Lacute;", '\U00000139', 0}, - {"Lambda;", '\U0000039B', 0}, - {"Lang;", '\U000027EA', 0}, - {"Laplacetrf;", '\U00002112', 0}, - {"Larr;", '\U0000219E', 0}, - {"Lcaron;", '\U0000013D', 0}, - {"Lcedil;", '\U0000013B', 0}, - {"Lcy;", '\U0000041B', 0}, - {"LeftAngleBracket;", '\U000027E8', 0}, - {"LeftArrow;", '\U00002190', 0}, - {"LeftArrowBar;", '\U000021E4', 0}, - {"LeftArrowRightArrow;", '\U000021C6', 0}, - {"LeftCeiling;", '\U00002308', 0}, - {"LeftDoubleBracket;", '\U000027E6', 0}, - {"LeftDownTeeVector;", '\U00002961', 0}, - {"LeftDownVector;", '\U000021C3', 0}, - {"LeftDownVectorBar;", '\U00002959', 0}, - {"LeftFloor;", '\U0000230A', 0}, - {"LeftRightArrow;", '\U00002194', 0}, - {"LeftRightVector;", '\U0000294E', 0}, - {"LeftTee;", '\U000022A3', 0}, - {"LeftTeeArrow;", '\U000021A4', 0}, - {"LeftTeeVector;", '\U0000295A', 0}, - {"LeftTriangle;", '\U000022B2', 0}, - {"LeftTriangleBar;", '\U000029CF', 0}, - {"LeftTriangleEqual;", '\U000022B4', 0}, - {"LeftUpDownVector;", '\U00002951', 0}, - {"LeftUpTeeVector;", '\U00002960', 0}, - {"LeftUpVector;", '\U000021BF', 0}, - {"LeftUpVectorBar;", '\U00002958', 0}, - {"LeftVector;", '\U000021BC', 0}, - {"LeftVectorBar;", '\U00002952', 0}, - {"Leftarrow;", '\U000021D0', 0}, - {"Leftrightarrow;", '\U000021D4', 0}, - {"LessEqualGreater;", '\U000022DA', 0}, - {"LessFullEqual;", '\U00002266', 0}, - {"LessGreater;", '\U00002276', 0}, - {"LessLess;", '\U00002AA1', 0}, - {"LessSlantEqual;", '\U00002A7D', 0}, - {"LessTilde;", '\U00002272', 0}, - {"Lfr;", '\U0001D50F', 0}, - {"Ll;", '\U000022D8', 0}, - {"Lleftarrow;", '\U000021DA', 0}, - {"Lmidot;", '\U0000013F', 0}, - {"LongLeftArrow;", '\U000027F5', 0}, - {"LongLeftRightArrow;", '\U000027F7', 0}, - {"LongRightArrow;", '\U000027F6', 0}, - {"Longleftarrow;", '\U000027F8', 0}, - {"Longleftrightarrow;", '\U000027FA', 0}, - {"Longrightarrow;", '\U000027F9', 0}, - {"Lopf;", '\U0001D543', 0}, - {"LowerLeftArrow;", '\U00002199', 0}, - {"LowerRightArrow;", '\U00002198', 0}, - {"Lscr;", '\U00002112', 0}, - {"Lsh;", '\U000021B0', 0}, - {"Lstrok;", '\U00000141', 0}, - {"Lt;", '\U0000226A', 0}, - {"Map;", '\U00002905', 0}, - {"Mcy;", '\U0000041C', 0}, - {"MediumSpace;", '\U0000205F', 0}, - {"Mellintrf;", '\U00002133', 0}, - {"Mfr;", '\U0001D510', 0}, - {"MinusPlus;", '\U00002213', 0}, - {"Mopf;", '\U0001D544', 0}, - {"Mscr;", '\U00002133', 0}, - {"Mu;", '\U0000039C', 0}, - {"NJcy;", '\U0000040A', 0}, - {"Nacute;", '\U00000143', 0}, - {"Ncaron;", '\U00000147', 0}, - {"Ncedil;", '\U00000145', 0}, - {"Ncy;", '\U0000041D', 0}, - {"NegativeMediumSpace;", '\U0000200B', 0}, - {"NegativeThickSpace;", '\U0000200B', 0}, - {"NegativeThinSpace;", '\U0000200B', 0}, - {"NegativeVeryThinSpace;", '\U0000200B', 0}, - {"NestedGreaterGreater;", '\U0000226B', 0}, - {"NestedLessLess;", '\U0000226A', 0}, - {"NewLine;", '\U0000000A', 0}, - {"Nfr;", '\U0001D511', 0}, - {"NoBreak;", '\U00002060', 0}, - {"NonBreakingSpace;", '\U000000A0', 0}, - {"Nopf;", '\U00002115', 0}, - {"Not;", '\U00002AEC', 0}, - {"NotCongruent;", '\U00002262', 0}, - {"NotCupCap;", '\U0000226D', 0}, - {"NotDoubleVerticalBar;", '\U00002226', 0}, - {"NotElement;", '\U00002209', 0}, - {"NotEqual;", '\U00002260', 0}, - {"NotEqualTilde;", '\u2242', '\u0338'}, - {"NotExists;", '\U00002204', 0}, - {"NotGreater;", '\U0000226F', 0}, - {"NotGreaterEqual;", '\U00002271', 0}, - {"NotGreaterFullEqual;", '\u2267', '\u0338'}, - {"NotGreaterGreater;", '\u226B', '\u0338'}, - {"NotGreaterLess;", '\U00002279', 0}, - {"NotGreaterSlantEqual;", '\u2A7E', '\u0338'}, - {"NotGreaterTilde;", '\U00002275', 0}, - {"NotHumpDownHump;", '\u224E', '\u0338'}, - {"NotHumpEqual;", '\u224F', '\u0338'}, - {"NotLeftTriangle;", '\U000022EA', 0}, - {"NotLeftTriangleBar;", '\u29CF', '\u0338'}, - {"NotLeftTriangleEqual;", '\U000022EC', 0}, - {"NotLess;", '\U0000226E', 0}, - {"NotLessEqual;", '\U00002270', 0}, - {"NotLessGreater;", '\U00002278', 0}, - {"NotLessLess;", '\u226A', '\u0338'}, - {"NotLessSlantEqual;", '\u2A7D', '\u0338'}, - {"NotLessTilde;", '\U00002274', 0}, - {"NotNestedGreaterGreater;", '\u2AA2', '\u0338'}, - {"NotNestedLessLess;", '\u2AA1', '\u0338'}, - {"NotPrecedes;", '\U00002280', 0}, - {"NotPrecedesEqual;", '\u2AAF', '\u0338'}, - {"NotPrecedesSlantEqual;", '\U000022E0', 0}, - {"NotReverseElement;", '\U0000220C', 0}, - {"NotRightTriangle;", '\U000022EB', 0}, - {"NotRightTriangleBar;", '\u29D0', '\u0338'}, - {"NotRightTriangleEqual;", '\U000022ED', 0}, - {"NotSquareSubset;", '\u228F', '\u0338'}, - {"NotSquareSubsetEqual;", '\U000022E2', 0}, - {"NotSquareSuperset;", '\u2290', '\u0338'}, - {"NotSquareSupersetEqual;", '\U000022E3', 0}, - {"NotSubset;", '\u2282', '\u20D2'}, - {"NotSubsetEqual;", '\U00002288', 0}, - {"NotSucceeds;", '\U00002281', 0}, - {"NotSucceedsEqual;", '\u2AB0', '\u0338'}, - {"NotSucceedsSlantEqual;", '\U000022E1', 0}, - {"NotSucceedsTilde;", '\u227F', '\u0338'}, - {"NotSuperset;", '\u2283', '\u20D2'}, - {"NotSupersetEqual;", '\U00002289', 0}, - {"NotTilde;", '\U00002241', 0}, - {"NotTildeEqual;", '\U00002244', 0}, - {"NotTildeFullEqual;", '\U00002247', 0}, - {"NotTildeTilde;", '\U00002249', 0}, - {"NotVerticalBar;", '\U00002224', 0}, - {"Nscr;", '\U0001D4A9', 0}, - {"Ntilde", '\U000000D1', 0}, - {"Ntilde;", '\U000000D1', 0}, - {"Nu;", '\U0000039D', 0}, - {"OElig;", '\U00000152', 0}, - {"Oacute", '\U000000D3', 0}, - {"Oacute;", '\U000000D3', 0}, - {"Ocirc", '\U000000D4', 0}, - {"Ocirc;", '\U000000D4', 0}, - {"Ocy;", '\U0000041E', 0}, - {"Odblac;", '\U00000150', 0}, - {"Ofr;", '\U0001D512', 0}, - {"Ograve", '\U000000D2', 0}, - {"Ograve;", '\U000000D2', 0}, - {"Omacr;", '\U0000014C', 0}, - {"Omega;", '\U000003A9', 0}, - {"Omicron;", '\U0000039F', 0}, - {"Oopf;", '\U0001D546', 0}, - {"OpenCurlyDoubleQuote;", '\U0000201C', 0}, - {"OpenCurlyQuote;", '\U00002018', 0}, - {"Or;", '\U00002A54', 0}, - {"Oscr;", '\U0001D4AA', 0}, - {"Oslash", '\U000000D8', 0}, - {"Oslash;", '\U000000D8', 0}, - {"Otilde", '\U000000D5', 0}, - {"Otilde;", '\U000000D5', 0}, - {"Otimes;", '\U00002A37', 0}, - {"Ouml", '\U000000D6', 0}, - {"Ouml;", '\U000000D6', 0}, - {"OverBar;", '\U0000203E', 0}, - {"OverBrace;", '\U000023DE', 0}, - {"OverBracket;", '\U000023B4', 0}, - {"OverParenthesis;", '\U000023DC', 0}, - {"PartialD;", '\U00002202', 0}, - {"Pcy;", '\U0000041F', 0}, - {"Pfr;", '\U0001D513', 0}, - {"Phi;", '\U000003A6', 0}, - {"Pi;", '\U000003A0', 0}, - {"PlusMinus;", '\U000000B1', 0}, - {"Poincareplane;", '\U0000210C', 0}, - {"Popf;", '\U00002119', 0}, - {"Pr;", '\U00002ABB', 0}, - {"Precedes;", '\U0000227A', 0}, - {"PrecedesEqual;", '\U00002AAF', 0}, - {"PrecedesSlantEqual;", '\U0000227C', 0}, - {"PrecedesTilde;", '\U0000227E', 0}, - {"Prime;", '\U00002033', 0}, - {"Product;", '\U0000220F', 0}, - {"Proportion;", '\U00002237', 0}, - {"Proportional;", '\U0000221D', 0}, - {"Pscr;", '\U0001D4AB', 0}, - {"Psi;", '\U000003A8', 0}, - {"QUOT", '\U00000022', 0}, - {"QUOT;", '\U00000022', 0}, - {"Qfr;", '\U0001D514', 0}, - {"Qopf;", '\U0000211A', 0}, - {"Qscr;", '\U0001D4AC', 0}, - {"RBarr;", '\U00002910', 0}, - {"REG", '\U000000AE', 0}, - {"REG;", '\U000000AE', 0}, - {"Racute;", '\U00000154', 0}, - {"Rang;", '\U000027EB', 0}, - {"Rarr;", '\U000021A0', 0}, - {"Rarrtl;", '\U00002916', 0}, - {"Rcaron;", '\U00000158', 0}, - {"Rcedil;", '\U00000156', 0}, - {"Rcy;", '\U00000420', 0}, - {"Re;", '\U0000211C', 0}, - {"ReverseElement;", '\U0000220B', 0}, - {"ReverseEquilibrium;", '\U000021CB', 0}, - {"ReverseUpEquilibrium;", '\U0000296F', 0}, - {"Rfr;", '\U0000211C', 0}, - {"Rho;", '\U000003A1', 0}, - {"RightAngleBracket;", '\U000027E9', 0}, - {"RightArrow;", '\U00002192', 0}, - {"RightArrowBar;", '\U000021E5', 0}, - {"RightArrowLeftArrow;", '\U000021C4', 0}, - {"RightCeiling;", '\U00002309', 0}, - {"RightDoubleBracket;", '\U000027E7', 0}, - {"RightDownTeeVector;", '\U0000295D', 0}, - {"RightDownVector;", '\U000021C2', 0}, - {"RightDownVectorBar;", '\U00002955', 0}, - {"RightFloor;", '\U0000230B', 0}, - {"RightTee;", '\U000022A2', 0}, - {"RightTeeArrow;", '\U000021A6', 0}, - {"RightTeeVector;", '\U0000295B', 0}, - {"RightTriangle;", '\U000022B3', 0}, - {"RightTriangleBar;", '\U000029D0', 0}, - {"RightTriangleEqual;", '\U000022B5', 0}, - {"RightUpDownVector;", '\U0000294F', 0}, - {"RightUpTeeVector;", '\U0000295C', 0}, - {"RightUpVector;", '\U000021BE', 0}, - {"RightUpVectorBar;", '\U00002954', 0}, - {"RightVector;", '\U000021C0', 0}, - {"RightVectorBar;", '\U00002953', 0}, - {"Rightarrow;", '\U000021D2', 0}, - {"Ropf;", '\U0000211D', 0}, - {"RoundImplies;", '\U00002970', 0}, - {"Rrightarrow;", '\U000021DB', 0}, - {"Rscr;", '\U0000211B', 0}, - {"Rsh;", '\U000021B1', 0}, - {"RuleDelayed;", '\U000029F4', 0}, - {"SHCHcy;", '\U00000429', 0}, - {"SHcy;", '\U00000428', 0}, - {"SOFTcy;", '\U0000042C', 0}, - {"Sacute;", '\U0000015A', 0}, - {"Sc;", '\U00002ABC', 0}, - {"Scaron;", '\U00000160', 0}, - {"Scedil;", '\U0000015E', 0}, - {"Scirc;", '\U0000015C', 0}, - {"Scy;", '\U00000421', 0}, - {"Sfr;", '\U0001D516', 0}, - {"ShortDownArrow;", '\U00002193', 0}, - {"ShortLeftArrow;", '\U00002190', 0}, - {"ShortRightArrow;", '\U00002192', 0}, - {"ShortUpArrow;", '\U00002191', 0}, - {"Sigma;", '\U000003A3', 0}, - {"SmallCircle;", '\U00002218', 0}, - {"Sopf;", '\U0001D54A', 0}, - {"Sqrt;", '\U0000221A', 0}, - {"Square;", '\U000025A1', 0}, - {"SquareIntersection;", '\U00002293', 0}, - {"SquareSubset;", '\U0000228F', 0}, - {"SquareSubsetEqual;", '\U00002291', 0}, - {"SquareSuperset;", '\U00002290', 0}, - {"SquareSupersetEqual;", '\U00002292', 0}, - {"SquareUnion;", '\U00002294', 0}, - {"Sscr;", '\U0001D4AE', 0}, - {"Star;", '\U000022C6', 0}, - {"Sub;", '\U000022D0', 0}, - {"Subset;", '\U000022D0', 0}, - {"SubsetEqual;", '\U00002286', 0}, - {"Succeeds;", '\U0000227B', 0}, - {"SucceedsEqual;", '\U00002AB0', 0}, - {"SucceedsSlantEqual;", '\U0000227D', 0}, - {"SucceedsTilde;", '\U0000227F', 0}, - {"SuchThat;", '\U0000220B', 0}, - {"Sum;", '\U00002211', 0}, - {"Sup;", '\U000022D1', 0}, - {"Superset;", '\U00002283', 0}, - {"SupersetEqual;", '\U00002287', 0}, - {"Supset;", '\U000022D1', 0}, - {"THORN", '\U000000DE', 0}, - {"THORN;", '\U000000DE', 0}, - {"TRADE;", '\U00002122', 0}, - {"TSHcy;", '\U0000040B', 0}, - {"TScy;", '\U00000426', 0}, - {"Tab;", '\U00000009', 0}, - {"Tau;", '\U000003A4', 0}, - {"Tcaron;", '\U00000164', 0}, - {"Tcedil;", '\U00000162', 0}, - {"Tcy;", '\U00000422', 0}, - {"Tfr;", '\U0001D517', 0}, - {"Therefore;", '\U00002234', 0}, - {"Theta;", '\U00000398', 0}, - {"ThickSpace;", '\u205F', '\u200A'}, - {"ThinSpace;", '\U00002009', 0}, - {"Tilde;", '\U0000223C', 0}, - {"TildeEqual;", '\U00002243', 0}, - {"TildeFullEqual;", '\U00002245', 0}, - {"TildeTilde;", '\U00002248', 0}, - {"Topf;", '\U0001D54B', 0}, - {"TripleDot;", '\U000020DB', 0}, - {"Tscr;", '\U0001D4AF', 0}, - {"Tstrok;", '\U00000166', 0}, - {"Uacute", '\U000000DA', 0}, - {"Uacute;", '\U000000DA', 0}, - {"Uarr;", '\U0000219F', 0}, - {"Uarrocir;", '\U00002949', 0}, - {"Ubrcy;", '\U0000040E', 0}, - {"Ubreve;", '\U0000016C', 0}, - {"Ucirc", '\U000000DB', 0}, - {"Ucirc;", '\U000000DB', 0}, - {"Ucy;", '\U00000423', 0}, - {"Udblac;", '\U00000170', 0}, - {"Ufr;", '\U0001D518', 0}, - {"Ugrave", '\U000000D9', 0}, - {"Ugrave;", '\U000000D9', 0}, - {"Umacr;", '\U0000016A', 0}, - {"UnderBar;", '\U0000005F', 0}, - {"UnderBrace;", '\U000023DF', 0}, - {"UnderBracket;", '\U000023B5', 0}, - {"UnderParenthesis;", '\U000023DD', 0}, - {"Union;", '\U000022C3', 0}, - {"UnionPlus;", '\U0000228E', 0}, - {"Uogon;", '\U00000172', 0}, - {"Uopf;", '\U0001D54C', 0}, - {"UpArrow;", '\U00002191', 0}, - {"UpArrowBar;", '\U00002912', 0}, - {"UpArrowDownArrow;", '\U000021C5', 0}, - {"UpDownArrow;", '\U00002195', 0}, - {"UpEquilibrium;", '\U0000296E', 0}, - {"UpTee;", '\U000022A5', 0}, - {"UpTeeArrow;", '\U000021A5', 0}, - {"Uparrow;", '\U000021D1', 0}, - {"Updownarrow;", '\U000021D5', 0}, - {"UpperLeftArrow;", '\U00002196', 0}, - {"UpperRightArrow;", '\U00002197', 0}, - {"Upsi;", '\U000003D2', 0}, - {"Upsilon;", '\U000003A5', 0}, - {"Uring;", '\U0000016E', 0}, - {"Uscr;", '\U0001D4B0', 0}, - {"Utilde;", '\U00000168', 0}, - {"Uuml", '\U000000DC', 0}, - {"Uuml;", '\U000000DC', 0}, - {"VDash;", '\U000022AB', 0}, - {"Vbar;", '\U00002AEB', 0}, - {"Vcy;", '\U00000412', 0}, - {"Vdash;", '\U000022A9', 0}, - {"Vdashl;", '\U00002AE6', 0}, - {"Vee;", '\U000022C1', 0}, - {"Verbar;", '\U00002016', 0}, - {"Vert;", '\U00002016', 0}, - {"VerticalBar;", '\U00002223', 0}, - {"VerticalLine;", '\U0000007C', 0}, - {"VerticalSeparator;", '\U00002758', 0}, - {"VerticalTilde;", '\U00002240', 0}, - {"VeryThinSpace;", '\U0000200A', 0}, - {"Vfr;", '\U0001D519', 0}, - {"Vopf;", '\U0001D54D', 0}, - {"Vscr;", '\U0001D4B1', 0}, - {"Vvdash;", '\U000022AA', 0}, - {"Wcirc;", '\U00000174', 0}, - {"Wedge;", '\U000022C0', 0}, - {"Wfr;", '\U0001D51A', 0}, - {"Wopf;", '\U0001D54E', 0}, - {"Wscr;", '\U0001D4B2', 0}, - {"Xfr;", '\U0001D51B', 0}, - {"Xi;", '\U0000039E', 0}, - {"Xopf;", '\U0001D54F', 0}, - {"Xscr;", '\U0001D4B3', 0}, - {"YAcy;", '\U0000042F', 0}, - {"YIcy;", '\U00000407', 0}, - {"YUcy;", '\U0000042E', 0}, - {"Yacute", '\U000000DD', 0}, - {"Yacute;", '\U000000DD', 0}, - {"Ycirc;", '\U00000176', 0}, - {"Ycy;", '\U0000042B', 0}, - {"Yfr;", '\U0001D51C', 0}, - {"Yopf;", '\U0001D550', 0}, - {"Yscr;", '\U0001D4B4', 0}, - {"Yuml;", '\U00000178', 0}, - {"ZHcy;", '\U00000416', 0}, - {"Zacute;", '\U00000179', 0}, - {"Zcaron;", '\U0000017D', 0}, - {"Zcy;", '\U00000417', 0}, - {"Zdot;", '\U0000017B', 0}, - {"ZeroWidthSpace;", '\U0000200B', 0}, - {"Zeta;", '\U00000396', 0}, - {"Zfr;", '\U00002128', 0}, - {"Zopf;", '\U00002124', 0}, - {"Zscr;", '\U0001D4B5', 0}, - {"aacute", '\U000000E1', 0}, - {"aacute;", '\U000000E1', 0}, - {"abreve;", '\U00000103', 0}, - {"ac;", '\U0000223E', 0}, - {"acE;", '\u223E', '\u0333'}, - {"acd;", '\U0000223F', 0}, - {"acirc", '\U000000E2', 0}, - {"acirc;", '\U000000E2', 0}, - {"acute", '\U000000B4', 0}, - {"acute;", '\U000000B4', 0}, - {"acy;", '\U00000430', 0}, - {"aelig", '\U000000E6', 0}, - {"aelig;", '\U000000E6', 0}, - {"af;", '\U00002061', 0}, - {"afr;", '\U0001D51E', 0}, - {"agrave", '\U000000E0', 0}, - {"agrave;", '\U000000E0', 0}, - {"alefsym;", '\U00002135', 0}, - {"aleph;", '\U00002135', 0}, - {"alpha;", '\U000003B1', 0}, - {"amacr;", '\U00000101', 0}, - {"amalg;", '\U00002A3F', 0}, - {"amp", '\U00000026', 0}, - {"amp;", '\U00000026', 0}, - {"and;", '\U00002227', 0}, - {"andand;", '\U00002A55', 0}, - {"andd;", '\U00002A5C', 0}, - {"andslope;", '\U00002A58', 0}, - {"andv;", '\U00002A5A', 0}, - {"ang;", '\U00002220', 0}, - {"ange;", '\U000029A4', 0}, - {"angle;", '\U00002220', 0}, - {"angmsd;", '\U00002221', 0}, - {"angmsdaa;", '\U000029A8', 0}, - {"angmsdab;", '\U000029A9', 0}, - {"angmsdac;", '\U000029AA', 0}, - {"angmsdad;", '\U000029AB', 0}, - {"angmsdae;", '\U000029AC', 0}, - {"angmsdaf;", '\U000029AD', 0}, - {"angmsdag;", '\U000029AE', 0}, - {"angmsdah;", '\U000029AF', 0}, - {"angrt;", '\U0000221F', 0}, - {"angrtvb;", '\U000022BE', 0}, - {"angrtvbd;", '\U0000299D', 0}, - {"angsph;", '\U00002222', 0}, - {"angst;", '\U000000C5', 0}, - {"angzarr;", '\U0000237C', 0}, - {"aogon;", '\U00000105', 0}, - {"aopf;", '\U0001D552', 0}, - {"ap;", '\U00002248', 0}, - {"apE;", '\U00002A70', 0}, - {"apacir;", '\U00002A6F', 0}, - {"ape;", '\U0000224A', 0}, - {"apid;", '\U0000224B', 0}, - {"apos;", '\U00000027', 0}, - {"approx;", '\U00002248', 0}, - {"approxeq;", '\U0000224A', 0}, - {"aring", '\U000000E5', 0}, - {"aring;", '\U000000E5', 0}, - {"ascr;", '\U0001D4B6', 0}, - {"ast;", '\U0000002A', 0}, - {"asymp;", '\U00002248', 0}, - {"asympeq;", '\U0000224D', 0}, - {"atilde", '\U000000E3', 0}, - {"atilde;", '\U000000E3', 0}, - {"auml", '\U000000E4', 0}, - {"auml;", '\U000000E4', 0}, - {"awconint;", '\U00002233', 0}, - {"awint;", '\U00002A11', 0}, - {"bNot;", '\U00002AED', 0}, - {"backcong;", '\U0000224C', 0}, - {"backepsilon;", '\U000003F6', 0}, - {"backprime;", '\U00002035', 0}, - {"backsim;", '\U0000223D', 0}, - {"backsimeq;", '\U000022CD', 0}, - {"barvee;", '\U000022BD', 0}, - {"barwed;", '\U00002305', 0}, - {"barwedge;", '\U00002305', 0}, - {"bbrk;", '\U000023B5', 0}, - {"bbrktbrk;", '\U000023B6', 0}, - {"bcong;", '\U0000224C', 0}, - {"bcy;", '\U00000431', 0}, - {"bdquo;", '\U0000201E', 0}, - {"becaus;", '\U00002235', 0}, - {"because;", '\U00002235', 0}, - {"bemptyv;", '\U000029B0', 0}, - {"bepsi;", '\U000003F6', 0}, - {"bernou;", '\U0000212C', 0}, - {"beta;", '\U000003B2', 0}, - {"beth;", '\U00002136', 0}, - {"between;", '\U0000226C', 0}, - {"bfr;", '\U0001D51F', 0}, - {"bigcap;", '\U000022C2', 0}, - {"bigcirc;", '\U000025EF', 0}, - {"bigcup;", '\U000022C3', 0}, - {"bigodot;", '\U00002A00', 0}, - {"bigoplus;", '\U00002A01', 0}, - {"bigotimes;", '\U00002A02', 0}, - {"bigsqcup;", '\U00002A06', 0}, - {"bigstar;", '\U00002605', 0}, - {"bigtriangledown;", '\U000025BD', 0}, - {"bigtriangleup;", '\U000025B3', 0}, - {"biguplus;", '\U00002A04', 0}, - {"bigvee;", '\U000022C1', 0}, - {"bigwedge;", '\U000022C0', 0}, - {"bkarow;", '\U0000290D', 0}, - {"blacklozenge;", '\U000029EB', 0}, - {"blacksquare;", '\U000025AA', 0}, - {"blacktriangle;", '\U000025B4', 0}, - {"blacktriangledown;", '\U000025BE', 0}, - {"blacktriangleleft;", '\U000025C2', 0}, - {"blacktriangleright;", '\U000025B8', 0}, - {"blank;", '\U00002423', 0}, - {"blk12;", '\U00002592', 0}, - {"blk14;", '\U00002591', 0}, - {"blk34;", '\U00002593', 0}, - {"block;", '\U00002588', 0}, - {"bne;", '\u003D', '\u20E5'}, - {"bnequiv;", '\u2261', '\u20E5'}, - {"bnot;", '\U00002310', 0}, - {"bopf;", '\U0001D553', 0}, - {"bot;", '\U000022A5', 0}, - {"bottom;", '\U000022A5', 0}, - {"bowtie;", '\U000022C8', 0}, - {"boxDL;", '\U00002557', 0}, - {"boxDR;", '\U00002554', 0}, - {"boxDl;", '\U00002556', 0}, - {"boxDr;", '\U00002553', 0}, - {"boxH;", '\U00002550', 0}, - {"boxHD;", '\U00002566', 0}, - {"boxHU;", '\U00002569', 0}, - {"boxHd;", '\U00002564', 0}, - {"boxHu;", '\U00002567', 0}, - {"boxUL;", '\U0000255D', 0}, - {"boxUR;", '\U0000255A', 0}, - {"boxUl;", '\U0000255C', 0}, - {"boxUr;", '\U00002559', 0}, - {"boxV;", '\U00002551', 0}, - {"boxVH;", '\U0000256C', 0}, - {"boxVL;", '\U00002563', 0}, - {"boxVR;", '\U00002560', 0}, - {"boxVh;", '\U0000256B', 0}, - {"boxVl;", '\U00002562', 0}, - {"boxVr;", '\U0000255F', 0}, - {"boxbox;", '\U000029C9', 0}, - {"boxdL;", '\U00002555', 0}, - {"boxdR;", '\U00002552', 0}, - {"boxdl;", '\U00002510', 0}, - {"boxdr;", '\U0000250C', 0}, - {"boxh;", '\U00002500', 0}, - {"boxhD;", '\U00002565', 0}, - {"boxhU;", '\U00002568', 0}, - {"boxhd;", '\U0000252C', 0}, - {"boxhu;", '\U00002534', 0}, - {"boxminus;", '\U0000229F', 0}, - {"boxplus;", '\U0000229E', 0}, - {"boxtimes;", '\U000022A0', 0}, - {"boxuL;", '\U0000255B', 0}, - {"boxuR;", '\U00002558', 0}, - {"boxul;", '\U00002518', 0}, - {"boxur;", '\U00002514', 0}, - {"boxv;", '\U00002502', 0}, - {"boxvH;", '\U0000256A', 0}, - {"boxvL;", '\U00002561', 0}, - {"boxvR;", '\U0000255E', 0}, - {"boxvh;", '\U0000253C', 0}, - {"boxvl;", '\U00002524', 0}, - {"boxvr;", '\U0000251C', 0}, - {"bprime;", '\U00002035', 0}, - {"breve;", '\U000002D8', 0}, - {"brvbar", '\U000000A6', 0}, - {"brvbar;", '\U000000A6', 0}, - {"bscr;", '\U0001D4B7', 0}, - {"bsemi;", '\U0000204F', 0}, - {"bsim;", '\U0000223D', 0}, - {"bsime;", '\U000022CD', 0}, - {"bsol;", '\U0000005C', 0}, - {"bsolb;", '\U000029C5', 0}, - {"bsolhsub;", '\U000027C8', 0}, - {"bull;", '\U00002022', 0}, - {"bullet;", '\U00002022', 0}, - {"bump;", '\U0000224E', 0}, - {"bumpE;", '\U00002AAE', 0}, - {"bumpe;", '\U0000224F', 0}, - {"bumpeq;", '\U0000224F', 0}, - {"cacute;", '\U00000107', 0}, - {"cap;", '\U00002229', 0}, - {"capand;", '\U00002A44', 0}, - {"capbrcup;", '\U00002A49', 0}, - {"capcap;", '\U00002A4B', 0}, - {"capcup;", '\U00002A47', 0}, - {"capdot;", '\U00002A40', 0}, - {"caps;", '\u2229', '\uFE00'}, - {"caret;", '\U00002041', 0}, - {"caron;", '\U000002C7', 0}, - {"ccaps;", '\U00002A4D', 0}, - {"ccaron;", '\U0000010D', 0}, - {"ccedil", '\U000000E7', 0}, - {"ccedil;", '\U000000E7', 0}, - {"ccirc;", '\U00000109', 0}, - {"ccups;", '\U00002A4C', 0}, - {"ccupssm;", '\U00002A50', 0}, - {"cdot;", '\U0000010B', 0}, - {"cedil", '\U000000B8', 0}, - {"cedil;", '\U000000B8', 0}, - {"cemptyv;", '\U000029B2', 0}, - {"cent", '\U000000A2', 0}, - {"cent;", '\U000000A2', 0}, - {"centerdot;", '\U000000B7', 0}, - {"cfr;", '\U0001D520', 0}, - {"chcy;", '\U00000447', 0}, - {"check;", '\U00002713', 0}, - {"checkmark;", '\U00002713', 0}, - {"chi;", '\U000003C7', 0}, - {"cir;", '\U000025CB', 0}, - {"cirE;", '\U000029C3', 0}, - {"circ;", '\U000002C6', 0}, - {"circeq;", '\U00002257', 0}, - {"circlearrowleft;", '\U000021BA', 0}, - {"circlearrowright;", '\U000021BB', 0}, - {"circledR;", '\U000000AE', 0}, - {"circledS;", '\U000024C8', 0}, - {"circledast;", '\U0000229B', 0}, - {"circledcirc;", '\U0000229A', 0}, - {"circleddash;", '\U0000229D', 0}, - {"cire;", '\U00002257', 0}, - {"cirfnint;", '\U00002A10', 0}, - {"cirmid;", '\U00002AEF', 0}, - {"cirscir;", '\U000029C2', 0}, - {"clubs;", '\U00002663', 0}, - {"clubsuit;", '\U00002663', 0}, - {"colon;", '\U0000003A', 0}, - {"colone;", '\U00002254', 0}, - {"coloneq;", '\U00002254', 0}, - {"comma;", '\U0000002C', 0}, - {"commat;", '\U00000040', 0}, - {"comp;", '\U00002201', 0}, - {"compfn;", '\U00002218', 0}, - {"complement;", '\U00002201', 0}, - {"complexes;", '\U00002102', 0}, - {"cong;", '\U00002245', 0}, - {"congdot;", '\U00002A6D', 0}, - {"conint;", '\U0000222E', 0}, - {"copf;", '\U0001D554', 0}, - {"coprod;", '\U00002210', 0}, - {"copy", '\U000000A9', 0}, - {"copy;", '\U000000A9', 0}, - {"copysr;", '\U00002117', 0}, - {"crarr;", '\U000021B5', 0}, - {"cross;", '\U00002717', 0}, - {"cscr;", '\U0001D4B8', 0}, - {"csub;", '\U00002ACF', 0}, - {"csube;", '\U00002AD1', 0}, - {"csup;", '\U00002AD0', 0}, - {"csupe;", '\U00002AD2', 0}, - {"ctdot;", '\U000022EF', 0}, - {"cudarrl;", '\U00002938', 0}, - {"cudarrr;", '\U00002935', 0}, - {"cuepr;", '\U000022DE', 0}, - {"cuesc;", '\U000022DF', 0}, - {"cularr;", '\U000021B6', 0}, - {"cularrp;", '\U0000293D', 0}, - {"cup;", '\U0000222A', 0}, - {"cupbrcap;", '\U00002A48', 0}, - {"cupcap;", '\U00002A46', 0}, - {"cupcup;", '\U00002A4A', 0}, - {"cupdot;", '\U0000228D', 0}, - {"cupor;", '\U00002A45', 0}, - {"cups;", '\u222A', '\uFE00'}, - {"curarr;", '\U000021B7', 0}, - {"curarrm;", '\U0000293C', 0}, - {"curlyeqprec;", '\U000022DE', 0}, - {"curlyeqsucc;", '\U000022DF', 0}, - {"curlyvee;", '\U000022CE', 0}, - {"curlywedge;", '\U000022CF', 0}, - {"curren", '\U000000A4', 0}, - {"curren;", '\U000000A4', 0}, - {"curvearrowleft;", '\U000021B6', 0}, - {"curvearrowright;", '\U000021B7', 0}, - {"cuvee;", '\U000022CE', 0}, - {"cuwed;", '\U000022CF', 0}, - {"cwconint;", '\U00002232', 0}, - {"cwint;", '\U00002231', 0}, - {"cylcty;", '\U0000232D', 0}, - {"dArr;", '\U000021D3', 0}, - {"dHar;", '\U00002965', 0}, - {"dagger;", '\U00002020', 0}, - {"daleth;", '\U00002138', 0}, - {"darr;", '\U00002193', 0}, - {"dash;", '\U00002010', 0}, - {"dashv;", '\U000022A3', 0}, - {"dbkarow;", '\U0000290F', 0}, - {"dblac;", '\U000002DD', 0}, - {"dcaron;", '\U0000010F', 0}, - {"dcy;", '\U00000434', 0}, - {"dd;", '\U00002146', 0}, - {"ddagger;", '\U00002021', 0}, - {"ddarr;", '\U000021CA', 0}, - {"ddotseq;", '\U00002A77', 0}, - {"deg", '\U000000B0', 0}, - {"deg;", '\U000000B0', 0}, - {"delta;", '\U000003B4', 0}, - {"demptyv;", '\U000029B1', 0}, - {"dfisht;", '\U0000297F', 0}, - {"dfr;", '\U0001D521', 0}, - {"dharl;", '\U000021C3', 0}, - {"dharr;", '\U000021C2', 0}, - {"diam;", '\U000022C4', 0}, - {"diamond;", '\U000022C4', 0}, - {"diamondsuit;", '\U00002666', 0}, - {"diams;", '\U00002666', 0}, - {"die;", '\U000000A8', 0}, - {"digamma;", '\U000003DD', 0}, - {"disin;", '\U000022F2', 0}, - {"div;", '\U000000F7', 0}, - {"divide", '\U000000F7', 0}, - {"divide;", '\U000000F7', 0}, - {"divideontimes;", '\U000022C7', 0}, - {"divonx;", '\U000022C7', 0}, - {"djcy;", '\U00000452', 0}, - {"dlcorn;", '\U0000231E', 0}, - {"dlcrop;", '\U0000230D', 0}, - {"dollar;", '\U00000024', 0}, - {"dopf;", '\U0001D555', 0}, - {"dot;", '\U000002D9', 0}, - {"doteq;", '\U00002250', 0}, - {"doteqdot;", '\U00002251', 0}, - {"dotminus;", '\U00002238', 0}, - {"dotplus;", '\U00002214', 0}, - {"dotsquare;", '\U000022A1', 0}, - {"doublebarwedge;", '\U00002306', 0}, - {"downarrow;", '\U00002193', 0}, - {"downdownarrows;", '\U000021CA', 0}, - {"downharpoonleft;", '\U000021C3', 0}, - {"downharpoonright;", '\U000021C2', 0}, - {"drbkarow;", '\U00002910', 0}, - {"drcorn;", '\U0000231F', 0}, - {"drcrop;", '\U0000230C', 0}, - {"dscr;", '\U0001D4B9', 0}, - {"dscy;", '\U00000455', 0}, - {"dsol;", '\U000029F6', 0}, - {"dstrok;", '\U00000111', 0}, - {"dtdot;", '\U000022F1', 0}, - {"dtri;", '\U000025BF', 0}, - {"dtrif;", '\U000025BE', 0}, - {"duarr;", '\U000021F5', 0}, - {"duhar;", '\U0000296F', 0}, - {"dwangle;", '\U000029A6', 0}, - {"dzcy;", '\U0000045F', 0}, - {"dzigrarr;", '\U000027FF', 0}, - {"eDDot;", '\U00002A77', 0}, - {"eDot;", '\U00002251', 0}, - {"eacute", '\U000000E9', 0}, - {"eacute;", '\U000000E9', 0}, - {"easter;", '\U00002A6E', 0}, - {"ecaron;", '\U0000011B', 0}, - {"ecir;", '\U00002256', 0}, - {"ecirc", '\U000000EA', 0}, - {"ecirc;", '\U000000EA', 0}, - {"ecolon;", '\U00002255', 0}, - {"ecy;", '\U0000044D', 0}, - {"edot;", '\U00000117', 0}, - {"ee;", '\U00002147', 0}, - {"efDot;", '\U00002252', 0}, - {"efr;", '\U0001D522', 0}, - {"eg;", '\U00002A9A', 0}, - {"egrave", '\U000000E8', 0}, - {"egrave;", '\U000000E8', 0}, - {"egs;", '\U00002A96', 0}, - {"egsdot;", '\U00002A98', 0}, - {"el;", '\U00002A99', 0}, - {"elinters;", '\U000023E7', 0}, - {"ell;", '\U00002113', 0}, - {"els;", '\U00002A95', 0}, - {"elsdot;", '\U00002A97', 0}, - {"emacr;", '\U00000113', 0}, - {"empty;", '\U00002205', 0}, - {"emptyset;", '\U00002205', 0}, - {"emptyv;", '\U00002205', 0}, - {"emsp13;", '\U00002004', 0}, - {"emsp14;", '\U00002005', 0}, - {"emsp;", '\U00002003', 0}, - {"eng;", '\U0000014B', 0}, - {"ensp;", '\U00002002', 0}, - {"eogon;", '\U00000119', 0}, - {"eopf;", '\U0001D556', 0}, - {"epar;", '\U000022D5', 0}, - {"eparsl;", '\U000029E3', 0}, - {"eplus;", '\U00002A71', 0}, - {"epsi;", '\U000003B5', 0}, - {"epsilon;", '\U000003B5', 0}, - {"epsiv;", '\U000003F5', 0}, - {"eqcirc;", '\U00002256', 0}, - {"eqcolon;", '\U00002255', 0}, - {"eqsim;", '\U00002242', 0}, - {"eqslantgtr;", '\U00002A96', 0}, - {"eqslantless;", '\U00002A95', 0}, - {"equals;", '\U0000003D', 0}, - {"equest;", '\U0000225F', 0}, - {"equiv;", '\U00002261', 0}, - {"equivDD;", '\U00002A78', 0}, - {"eqvparsl;", '\U000029E5', 0}, - {"erDot;", '\U00002253', 0}, - {"erarr;", '\U00002971', 0}, - {"escr;", '\U0000212F', 0}, - {"esdot;", '\U00002250', 0}, - {"esim;", '\U00002242', 0}, - {"eta;", '\U000003B7', 0}, - {"eth", '\U000000F0', 0}, - {"eth;", '\U000000F0', 0}, - {"euml", '\U000000EB', 0}, - {"euml;", '\U000000EB', 0}, - {"euro;", '\U000020AC', 0}, - {"excl;", '\U00000021', 0}, - {"exist;", '\U00002203', 0}, - {"expectation;", '\U00002130', 0}, - {"exponentiale;", '\U00002147', 0}, - {"fallingdotseq;", '\U00002252', 0}, - {"fcy;", '\U00000444', 0}, - {"female;", '\U00002640', 0}, - {"ffilig;", '\U0000FB03', 0}, - {"fflig;", '\U0000FB00', 0}, - {"ffllig;", '\U0000FB04', 0}, - {"ffr;", '\U0001D523', 0}, - {"filig;", '\U0000FB01', 0}, - {"fjlig;", '\u0066', '\u006A'}, - {"flat;", '\U0000266D', 0}, - {"fllig;", '\U0000FB02', 0}, - {"fltns;", '\U000025B1', 0}, - {"fnof;", '\U00000192', 0}, - {"fopf;", '\U0001D557', 0}, - {"forall;", '\U00002200', 0}, - {"fork;", '\U000022D4', 0}, - {"forkv;", '\U00002AD9', 0}, - {"fpartint;", '\U00002A0D', 0}, - {"frac12", '\U000000BD', 0}, - {"frac12;", '\U000000BD', 0}, - {"frac13;", '\U00002153', 0}, - {"frac14", '\U000000BC', 0}, - {"frac14;", '\U000000BC', 0}, - {"frac15;", '\U00002155', 0}, - {"frac16;", '\U00002159', 0}, - {"frac18;", '\U0000215B', 0}, - {"frac23;", '\U00002154', 0}, - {"frac25;", '\U00002156', 0}, - {"frac34", '\U000000BE', 0}, - {"frac34;", '\U000000BE', 0}, - {"frac35;", '\U00002157', 0}, - {"frac38;", '\U0000215C', 0}, - {"frac45;", '\U00002158', 0}, - {"frac56;", '\U0000215A', 0}, - {"frac58;", '\U0000215D', 0}, - {"frac78;", '\U0000215E', 0}, - {"frasl;", '\U00002044', 0}, - {"frown;", '\U00002322', 0}, - {"fscr;", '\U0001D4BB', 0}, - {"gE;", '\U00002267', 0}, - {"gEl;", '\U00002A8C', 0}, - {"gacute;", '\U000001F5', 0}, - {"gamma;", '\U000003B3', 0}, - {"gammad;", '\U000003DD', 0}, - {"gap;", '\U00002A86', 0}, - {"gbreve;", '\U0000011F', 0}, - {"gcirc;", '\U0000011D', 0}, - {"gcy;", '\U00000433', 0}, - {"gdot;", '\U00000121', 0}, - {"ge;", '\U00002265', 0}, - {"gel;", '\U000022DB', 0}, - {"geq;", '\U00002265', 0}, - {"geqq;", '\U00002267', 0}, - {"geqslant;", '\U00002A7E', 0}, - {"ges;", '\U00002A7E', 0}, - {"gescc;", '\U00002AA9', 0}, - {"gesdot;", '\U00002A80', 0}, - {"gesdoto;", '\U00002A82', 0}, - {"gesdotol;", '\U00002A84', 0}, - {"gesl;", '\u22DB', '\uFE00'}, - {"gesles;", '\U00002A94', 0}, - {"gfr;", '\U0001D524', 0}, - {"gg;", '\U0000226B', 0}, - {"ggg;", '\U000022D9', 0}, - {"gimel;", '\U00002137', 0}, - {"gjcy;", '\U00000453', 0}, - {"gl;", '\U00002277', 0}, - {"glE;", '\U00002A92', 0}, - {"gla;", '\U00002AA5', 0}, - {"glj;", '\U00002AA4', 0}, - {"gnE;", '\U00002269', 0}, - {"gnap;", '\U00002A8A', 0}, - {"gnapprox;", '\U00002A8A', 0}, - {"gne;", '\U00002A88', 0}, - {"gneq;", '\U00002A88', 0}, - {"gneqq;", '\U00002269', 0}, - {"gnsim;", '\U000022E7', 0}, - {"gopf;", '\U0001D558', 0}, - {"grave;", '\U00000060', 0}, - {"gscr;", '\U0000210A', 0}, - {"gsim;", '\U00002273', 0}, - {"gsime;", '\U00002A8E', 0}, - {"gsiml;", '\U00002A90', 0}, - {"gt", '\U0000003E', 0}, - {"gt;", '\U0000003E', 0}, - {"gtcc;", '\U00002AA7', 0}, - {"gtcir;", '\U00002A7A', 0}, - {"gtdot;", '\U000022D7', 0}, - {"gtlPar;", '\U00002995', 0}, - {"gtquest;", '\U00002A7C', 0}, - {"gtrapprox;", '\U00002A86', 0}, - {"gtrarr;", '\U00002978', 0}, - {"gtrdot;", '\U000022D7', 0}, - {"gtreqless;", '\U000022DB', 0}, - {"gtreqqless;", '\U00002A8C', 0}, - {"gtrless;", '\U00002277', 0}, - {"gtrsim;", '\U00002273', 0}, - {"gvertneqq;", '\u2269', '\uFE00'}, - {"gvnE;", '\u2269', '\uFE00'}, - {"hArr;", '\U000021D4', 0}, - {"hairsp;", '\U0000200A', 0}, - {"half;", '\U000000BD', 0}, - {"hamilt;", '\U0000210B', 0}, - {"hardcy;", '\U0000044A', 0}, - {"harr;", '\U00002194', 0}, - {"harrcir;", '\U00002948', 0}, - {"harrw;", '\U000021AD', 0}, - {"hbar;", '\U0000210F', 0}, - {"hcirc;", '\U00000125', 0}, - {"hearts;", '\U00002665', 0}, - {"heartsuit;", '\U00002665', 0}, - {"hellip;", '\U00002026', 0}, - {"hercon;", '\U000022B9', 0}, - {"hfr;", '\U0001D525', 0}, - {"hksearow;", '\U00002925', 0}, - {"hkswarow;", '\U00002926', 0}, - {"hoarr;", '\U000021FF', 0}, - {"homtht;", '\U0000223B', 0}, - {"hookleftarrow;", '\U000021A9', 0}, - {"hookrightarrow;", '\U000021AA', 0}, - {"hopf;", '\U0001D559', 0}, - {"horbar;", '\U00002015', 0}, - {"hscr;", '\U0001D4BD', 0}, - {"hslash;", '\U0000210F', 0}, - {"hstrok;", '\U00000127', 0}, - {"hybull;", '\U00002043', 0}, - {"hyphen;", '\U00002010', 0}, - {"iacute", '\U000000ED', 0}, - {"iacute;", '\U000000ED', 0}, - {"ic;", '\U00002063', 0}, - {"icirc", '\U000000EE', 0}, - {"icirc;", '\U000000EE', 0}, - {"icy;", '\U00000438', 0}, - {"iecy;", '\U00000435', 0}, - {"iexcl", '\U000000A1', 0}, - {"iexcl;", '\U000000A1', 0}, - {"iff;", '\U000021D4', 0}, - {"ifr;", '\U0001D526', 0}, - {"igrave", '\U000000EC', 0}, - {"igrave;", '\U000000EC', 0}, - {"ii;", '\U00002148', 0}, - {"iiiint;", '\U00002A0C', 0}, - {"iiint;", '\U0000222D', 0}, - {"iinfin;", '\U000029DC', 0}, - {"iiota;", '\U00002129', 0}, - {"ijlig;", '\U00000133', 0}, - {"imacr;", '\U0000012B', 0}, - {"image;", '\U00002111', 0}, - {"imagline;", '\U00002110', 0}, - {"imagpart;", '\U00002111', 0}, - {"imath;", '\U00000131', 0}, - {"imof;", '\U000022B7', 0}, - {"imped;", '\U000001B5', 0}, - {"in;", '\U00002208', 0}, - {"incare;", '\U00002105', 0}, - {"infin;", '\U0000221E', 0}, - {"infintie;", '\U000029DD', 0}, - {"inodot;", '\U00000131', 0}, - {"int;", '\U0000222B', 0}, - {"intcal;", '\U000022BA', 0}, - {"integers;", '\U00002124', 0}, - {"intercal;", '\U000022BA', 0}, - {"intlarhk;", '\U00002A17', 0}, - {"intprod;", '\U00002A3C', 0}, - {"iocy;", '\U00000451', 0}, - {"iogon;", '\U0000012F', 0}, - {"iopf;", '\U0001D55A', 0}, - {"iota;", '\U000003B9', 0}, - {"iprod;", '\U00002A3C', 0}, - {"iquest", '\U000000BF', 0}, - {"iquest;", '\U000000BF', 0}, - {"iscr;", '\U0001D4BE', 0}, - {"isin;", '\U00002208', 0}, - {"isinE;", '\U000022F9', 0}, - {"isindot;", '\U000022F5', 0}, - {"isins;", '\U000022F4', 0}, - {"isinsv;", '\U000022F3', 0}, - {"isinv;", '\U00002208', 0}, - {"it;", '\U00002062', 0}, - {"itilde;", '\U00000129', 0}, - {"iukcy;", '\U00000456', 0}, - {"iuml", '\U000000EF', 0}, - {"iuml;", '\U000000EF', 0}, - {"jcirc;", '\U00000135', 0}, - {"jcy;", '\U00000439', 0}, - {"jfr;", '\U0001D527', 0}, - {"jmath;", '\U00000237', 0}, - {"jopf;", '\U0001D55B', 0}, - {"jscr;", '\U0001D4BF', 0}, - {"jsercy;", '\U00000458', 0}, - {"jukcy;", '\U00000454', 0}, - {"kappa;", '\U000003BA', 0}, - {"kappav;", '\U000003F0', 0}, - {"kcedil;", '\U00000137', 0}, - {"kcy;", '\U0000043A', 0}, - {"kfr;", '\U0001D528', 0}, - {"kgreen;", '\U00000138', 0}, - {"khcy;", '\U00000445', 0}, - {"kjcy;", '\U0000045C', 0}, - {"kopf;", '\U0001D55C', 0}, - {"kscr;", '\U0001D4C0', 0}, - {"lAarr;", '\U000021DA', 0}, - {"lArr;", '\U000021D0', 0}, - {"lAtail;", '\U0000291B', 0}, - {"lBarr;", '\U0000290E', 0}, - {"lE;", '\U00002266', 0}, - {"lEg;", '\U00002A8B', 0}, - {"lHar;", '\U00002962', 0}, - {"lacute;", '\U0000013A', 0}, - {"laemptyv;", '\U000029B4', 0}, - {"lagran;", '\U00002112', 0}, - {"lambda;", '\U000003BB', 0}, - {"lang;", '\U000027E8', 0}, - {"langd;", '\U00002991', 0}, - {"langle;", '\U000027E8', 0}, - {"lap;", '\U00002A85', 0}, - {"laquo", '\U000000AB', 0}, - {"laquo;", '\U000000AB', 0}, - {"larr;", '\U00002190', 0}, - {"larrb;", '\U000021E4', 0}, - {"larrbfs;", '\U0000291F', 0}, - {"larrfs;", '\U0000291D', 0}, - {"larrhk;", '\U000021A9', 0}, - {"larrlp;", '\U000021AB', 0}, - {"larrpl;", '\U00002939', 0}, - {"larrsim;", '\U00002973', 0}, - {"larrtl;", '\U000021A2', 0}, - {"lat;", '\U00002AAB', 0}, - {"latail;", '\U00002919', 0}, - {"late;", '\U00002AAD', 0}, - {"lates;", '\u2AAD', '\uFE00'}, - {"lbarr;", '\U0000290C', 0}, - {"lbbrk;", '\U00002772', 0}, - {"lbrace;", '\U0000007B', 0}, - {"lbrack;", '\U0000005B', 0}, - {"lbrke;", '\U0000298B', 0}, - {"lbrksld;", '\U0000298F', 0}, - {"lbrkslu;", '\U0000298D', 0}, - {"lcaron;", '\U0000013E', 0}, - {"lcedil;", '\U0000013C', 0}, - {"lceil;", '\U00002308', 0}, - {"lcub;", '\U0000007B', 0}, - {"lcy;", '\U0000043B', 0}, - {"ldca;", '\U00002936', 0}, - {"ldquo;", '\U0000201C', 0}, - {"ldquor;", '\U0000201E', 0}, - {"ldrdhar;", '\U00002967', 0}, - {"ldrushar;", '\U0000294B', 0}, - {"ldsh;", '\U000021B2', 0}, - {"le;", '\U00002264', 0}, - {"leftarrow;", '\U00002190', 0}, - {"leftarrowtail;", '\U000021A2', 0}, - {"leftharpoondown;", '\U000021BD', 0}, - {"leftharpoonup;", '\U000021BC', 0}, - {"leftleftarrows;", '\U000021C7', 0}, - {"leftrightarrow;", '\U00002194', 0}, - {"leftrightarrows;", '\U000021C6', 0}, - {"leftrightharpoons;", '\U000021CB', 0}, - {"leftrightsquigarrow;", '\U000021AD', 0}, - {"leftthreetimes;", '\U000022CB', 0}, - {"leg;", '\U000022DA', 0}, - {"leq;", '\U00002264', 0}, - {"leqq;", '\U00002266', 0}, - {"leqslant;", '\U00002A7D', 0}, - {"les;", '\U00002A7D', 0}, - {"lescc;", '\U00002AA8', 0}, - {"lesdot;", '\U00002A7F', 0}, - {"lesdoto;", '\U00002A81', 0}, - {"lesdotor;", '\U00002A83', 0}, - {"lesg;", '\u22DA', '\uFE00'}, - {"lesges;", '\U00002A93', 0}, - {"lessapprox;", '\U00002A85', 0}, - {"lessdot;", '\U000022D6', 0}, - {"lesseqgtr;", '\U000022DA', 0}, - {"lesseqqgtr;", '\U00002A8B', 0}, - {"lessgtr;", '\U00002276', 0}, - {"lesssim;", '\U00002272', 0}, - {"lfisht;", '\U0000297C', 0}, - {"lfloor;", '\U0000230A', 0}, - {"lfr;", '\U0001D529', 0}, - {"lg;", '\U00002276', 0}, - {"lgE;", '\U00002A91', 0}, - {"lhard;", '\U000021BD', 0}, - {"lharu;", '\U000021BC', 0}, - {"lharul;", '\U0000296A', 0}, - {"lhblk;", '\U00002584', 0}, - {"ljcy;", '\U00000459', 0}, - {"ll;", '\U0000226A', 0}, - {"llarr;", '\U000021C7', 0}, - {"llcorner;", '\U0000231E', 0}, - {"llhard;", '\U0000296B', 0}, - {"lltri;", '\U000025FA', 0}, - {"lmidot;", '\U00000140', 0}, - {"lmoust;", '\U000023B0', 0}, - {"lmoustache;", '\U000023B0', 0}, - {"lnE;", '\U00002268', 0}, - {"lnap;", '\U00002A89', 0}, - {"lnapprox;", '\U00002A89', 0}, - {"lne;", '\U00002A87', 0}, - {"lneq;", '\U00002A87', 0}, - {"lneqq;", '\U00002268', 0}, - {"lnsim;", '\U000022E6', 0}, - {"loang;", '\U000027EC', 0}, - {"loarr;", '\U000021FD', 0}, - {"lobrk;", '\U000027E6', 0}, - {"longleftarrow;", '\U000027F5', 0}, - {"longleftrightarrow;", '\U000027F7', 0}, - {"longmapsto;", '\U000027FC', 0}, - {"longrightarrow;", '\U000027F6', 0}, - {"looparrowleft;", '\U000021AB', 0}, - {"looparrowright;", '\U000021AC', 0}, - {"lopar;", '\U00002985', 0}, - {"lopf;", '\U0001D55D', 0}, - {"loplus;", '\U00002A2D', 0}, - {"lotimes;", '\U00002A34', 0}, - {"lowast;", '\U00002217', 0}, - {"lowbar;", '\U0000005F', 0}, - {"loz;", '\U000025CA', 0}, - {"lozenge;", '\U000025CA', 0}, - {"lozf;", '\U000029EB', 0}, - {"lpar;", '\U00000028', 0}, - {"lparlt;", '\U00002993', 0}, - {"lrarr;", '\U000021C6', 0}, - {"lrcorner;", '\U0000231F', 0}, - {"lrhar;", '\U000021CB', 0}, - {"lrhard;", '\U0000296D', 0}, - {"lrm;", '\U0000200E', 0}, - {"lrtri;", '\U000022BF', 0}, - {"lsaquo;", '\U00002039', 0}, - {"lscr;", '\U0001D4C1', 0}, - {"lsh;", '\U000021B0', 0}, - {"lsim;", '\U00002272', 0}, - {"lsime;", '\U00002A8D', 0}, - {"lsimg;", '\U00002A8F', 0}, - {"lsqb;", '\U0000005B', 0}, - {"lsquo;", '\U00002018', 0}, - {"lsquor;", '\U0000201A', 0}, - {"lstrok;", '\U00000142', 0}, - {"lt", '\U0000003C', 0}, - {"lt;", '\U0000003C', 0}, - {"ltcc;", '\U00002AA6', 0}, - {"ltcir;", '\U00002A79', 0}, - {"ltdot;", '\U000022D6', 0}, - {"lthree;", '\U000022CB', 0}, - {"ltimes;", '\U000022C9', 0}, - {"ltlarr;", '\U00002976', 0}, - {"ltquest;", '\U00002A7B', 0}, - {"ltrPar;", '\U00002996', 0}, - {"ltri;", '\U000025C3', 0}, - {"ltrie;", '\U000022B4', 0}, - {"ltrif;", '\U000025C2', 0}, - {"lurdshar;", '\U0000294A', 0}, - {"luruhar;", '\U00002966', 0}, - {"lvertneqq;", '\u2268', '\uFE00'}, - {"lvnE;", '\u2268', '\uFE00'}, - {"mDDot;", '\U0000223A', 0}, - {"macr", '\U000000AF', 0}, - {"macr;", '\U000000AF', 0}, - {"male;", '\U00002642', 0}, - {"malt;", '\U00002720', 0}, - {"maltese;", '\U00002720', 0}, - {"map;", '\U000021A6', 0}, - {"mapsto;", '\U000021A6', 0}, - {"mapstodown;", '\U000021A7', 0}, - {"mapstoleft;", '\U000021A4', 0}, - {"mapstoup;", '\U000021A5', 0}, - {"marker;", '\U000025AE', 0}, - {"mcomma;", '\U00002A29', 0}, - {"mcy;", '\U0000043C', 0}, - {"mdash;", '\U00002014', 0}, - {"measuredangle;", '\U00002221', 0}, - {"mfr;", '\U0001D52A', 0}, - {"mho;", '\U00002127', 0}, - {"micro", '\U000000B5', 0}, - {"micro;", '\U000000B5', 0}, - {"mid;", '\U00002223', 0}, - {"midast;", '\U0000002A', 0}, - {"midcir;", '\U00002AF0', 0}, - {"middot", '\U000000B7', 0}, - {"middot;", '\U000000B7', 0}, - {"minus;", '\U00002212', 0}, - {"minusb;", '\U0000229F', 0}, - {"minusd;", '\U00002238', 0}, - {"minusdu;", '\U00002A2A', 0}, - {"mlcp;", '\U00002ADB', 0}, - {"mldr;", '\U00002026', 0}, - {"mnplus;", '\U00002213', 0}, - {"models;", '\U000022A7', 0}, - {"mopf;", '\U0001D55E', 0}, - {"mp;", '\U00002213', 0}, - {"mscr;", '\U0001D4C2', 0}, - {"mstpos;", '\U0000223E', 0}, - {"mu;", '\U000003BC', 0}, - {"multimap;", '\U000022B8', 0}, - {"mumap;", '\U000022B8', 0}, - {"nGg;", '\u22D9', '\u0338'}, - {"nGt;", '\u226B', '\u20D2'}, - {"nGtv;", '\u226B', '\u0338'}, - {"nLeftarrow;", '\U000021CD', 0}, - {"nLeftrightarrow;", '\U000021CE', 0}, - {"nLl;", '\u22D8', '\u0338'}, - {"nLt;", '\u226A', '\u20D2'}, - {"nLtv;", '\u226A', '\u0338'}, - {"nRightarrow;", '\U000021CF', 0}, - {"nVDash;", '\U000022AF', 0}, - {"nVdash;", '\U000022AE', 0}, - {"nabla;", '\U00002207', 0}, - {"nacute;", '\U00000144', 0}, - {"nang;", '\u2220', '\u20D2'}, - {"nap;", '\U00002249', 0}, - {"napE;", '\u2A70', '\u0338'}, - {"napid;", '\u224B', '\u0338'}, - {"napos;", '\U00000149', 0}, - {"napprox;", '\U00002249', 0}, - {"natur;", '\U0000266E', 0}, - {"natural;", '\U0000266E', 0}, - {"naturals;", '\U00002115', 0}, - {"nbsp", '\U000000A0', 0}, - {"nbsp;", '\U000000A0', 0}, - {"nbump;", '\u224E', '\u0338'}, - {"nbumpe;", '\u224F', '\u0338'}, - {"ncap;", '\U00002A43', 0}, - {"ncaron;", '\U00000148', 0}, - {"ncedil;", '\U00000146', 0}, - {"ncong;", '\U00002247', 0}, - {"ncongdot;", '\u2A6D', '\u0338'}, - {"ncup;", '\U00002A42', 0}, - {"ncy;", '\U0000043D', 0}, - {"ndash;", '\U00002013', 0}, - {"ne;", '\U00002260', 0}, - {"neArr;", '\U000021D7', 0}, - {"nearhk;", '\U00002924', 0}, - {"nearr;", '\U00002197', 0}, - {"nearrow;", '\U00002197', 0}, - {"nedot;", '\u2250', '\u0338'}, - {"nequiv;", '\U00002262', 0}, - {"nesear;", '\U00002928', 0}, - {"nesim;", '\u2242', '\u0338'}, - {"nexist;", '\U00002204', 0}, - {"nexists;", '\U00002204', 0}, - {"nfr;", '\U0001D52B', 0}, - {"ngE;", '\u2267', '\u0338'}, - {"nge;", '\U00002271', 0}, - {"ngeq;", '\U00002271', 0}, - {"ngeqq;", '\u2267', '\u0338'}, - {"ngeqslant;", '\u2A7E', '\u0338'}, - {"nges;", '\u2A7E', '\u0338'}, - {"ngsim;", '\U00002275', 0}, - {"ngt;", '\U0000226F', 0}, - {"ngtr;", '\U0000226F', 0}, - {"nhArr;", '\U000021CE', 0}, - {"nharr;", '\U000021AE', 0}, - {"nhpar;", '\U00002AF2', 0}, - {"ni;", '\U0000220B', 0}, - {"nis;", '\U000022FC', 0}, - {"nisd;", '\U000022FA', 0}, - {"niv;", '\U0000220B', 0}, - {"njcy;", '\U0000045A', 0}, - {"nlArr;", '\U000021CD', 0}, - {"nlE;", '\u2266', '\u0338'}, - {"nlarr;", '\U0000219A', 0}, - {"nldr;", '\U00002025', 0}, - {"nle;", '\U00002270', 0}, - {"nleftarrow;", '\U0000219A', 0}, - {"nleftrightarrow;", '\U000021AE', 0}, - {"nleq;", '\U00002270', 0}, - {"nleqq;", '\u2266', '\u0338'}, - {"nleqslant;", '\u2A7D', '\u0338'}, - {"nles;", '\u2A7D', '\u0338'}, - {"nless;", '\U0000226E', 0}, - {"nlsim;", '\U00002274', 0}, - {"nlt;", '\U0000226E', 0}, - {"nltri;", '\U000022EA', 0}, - {"nltrie;", '\U000022EC', 0}, - {"nmid;", '\U00002224', 0}, - {"nopf;", '\U0001D55F', 0}, - {"not", '\U000000AC', 0}, - {"not;", '\U000000AC', 0}, - {"notin;", '\U00002209', 0}, - {"notinE;", '\u22F9', '\u0338'}, - {"notindot;", '\u22F5', '\u0338'}, - {"notinva;", '\U00002209', 0}, - {"notinvb;", '\U000022F7', 0}, - {"notinvc;", '\U000022F6', 0}, - {"notni;", '\U0000220C', 0}, - {"notniva;", '\U0000220C', 0}, - {"notnivb;", '\U000022FE', 0}, - {"notnivc;", '\U000022FD', 0}, - {"npar;", '\U00002226', 0}, - {"nparallel;", '\U00002226', 0}, - {"nparsl;", '\u2AFD', '\u20E5'}, - {"npart;", '\u2202', '\u0338'}, - {"npolint;", '\U00002A14', 0}, - {"npr;", '\U00002280', 0}, - {"nprcue;", '\U000022E0', 0}, - {"npre;", '\u2AAF', '\u0338'}, - {"nprec;", '\U00002280', 0}, - {"npreceq;", '\u2AAF', '\u0338'}, - {"nrArr;", '\U000021CF', 0}, - {"nrarr;", '\U0000219B', 0}, - {"nrarrc;", '\u2933', '\u0338'}, - {"nrarrw;", '\u219D', '\u0338'}, - {"nrightarrow;", '\U0000219B', 0}, - {"nrtri;", '\U000022EB', 0}, - {"nrtrie;", '\U000022ED', 0}, - {"nsc;", '\U00002281', 0}, - {"nsccue;", '\U000022E1', 0}, - {"nsce;", '\u2AB0', '\u0338'}, - {"nscr;", '\U0001D4C3', 0}, - {"nshortmid;", '\U00002224', 0}, - {"nshortparallel;", '\U00002226', 0}, - {"nsim;", '\U00002241', 0}, - {"nsime;", '\U00002244', 0}, - {"nsimeq;", '\U00002244', 0}, - {"nsmid;", '\U00002224', 0}, - {"nspar;", '\U00002226', 0}, - {"nsqsube;", '\U000022E2', 0}, - {"nsqsupe;", '\U000022E3', 0}, - {"nsub;", '\U00002284', 0}, - {"nsubE;", '\u2AC5', '\u0338'}, - {"nsube;", '\U00002288', 0}, - {"nsubset;", '\u2282', '\u20D2'}, - {"nsubseteq;", '\U00002288', 0}, - {"nsubseteqq;", '\u2AC5', '\u0338'}, - {"nsucc;", '\U00002281', 0}, - {"nsucceq;", '\u2AB0', '\u0338'}, - {"nsup;", '\U00002285', 0}, - {"nsupE;", '\u2AC6', '\u0338'}, - {"nsupe;", '\U00002289', 0}, - {"nsupset;", '\u2283', '\u20D2'}, - {"nsupseteq;", '\U00002289', 0}, - {"nsupseteqq;", '\u2AC6', '\u0338'}, - {"ntgl;", '\U00002279', 0}, - {"ntilde", '\U000000F1', 0}, - {"ntilde;", '\U000000F1', 0}, - {"ntlg;", '\U00002278', 0}, - {"ntriangleleft;", '\U000022EA', 0}, - {"ntrianglelefteq;", '\U000022EC', 0}, - {"ntriangleright;", '\U000022EB', 0}, - {"ntrianglerighteq;", '\U000022ED', 0}, - {"nu;", '\U000003BD', 0}, - {"num;", '\U00000023', 0}, - {"numero;", '\U00002116', 0}, - {"numsp;", '\U00002007', 0}, - {"nvDash;", '\U000022AD', 0}, - {"nvHarr;", '\U00002904', 0}, - {"nvap;", '\u224D', '\u20D2'}, - {"nvdash;", '\U000022AC', 0}, - {"nvge;", '\u2265', '\u20D2'}, - {"nvgt;", '\u003E', '\u20D2'}, - {"nvinfin;", '\U000029DE', 0}, - {"nvlArr;", '\U00002902', 0}, - {"nvle;", '\u2264', '\u20D2'}, - {"nvlt;", '\u003C', '\u20D2'}, - {"nvltrie;", '\u22B4', '\u20D2'}, - {"nvrArr;", '\U00002903', 0}, - {"nvrtrie;", '\u22B5', '\u20D2'}, - {"nvsim;", '\u223C', '\u20D2'}, - {"nwArr;", '\U000021D6', 0}, - {"nwarhk;", '\U00002923', 0}, - {"nwarr;", '\U00002196', 0}, - {"nwarrow;", '\U00002196', 0}, - {"nwnear;", '\U00002927', 0}, - {"oS;", '\U000024C8', 0}, - {"oacute", '\U000000F3', 0}, - {"oacute;", '\U000000F3', 0}, - {"oast;", '\U0000229B', 0}, - {"ocir;", '\U0000229A', 0}, - {"ocirc", '\U000000F4', 0}, - {"ocirc;", '\U000000F4', 0}, - {"ocy;", '\U0000043E', 0}, - {"odash;", '\U0000229D', 0}, - {"odblac;", '\U00000151', 0}, - {"odiv;", '\U00002A38', 0}, - {"odot;", '\U00002299', 0}, - {"odsold;", '\U000029BC', 0}, - {"oelig;", '\U00000153', 0}, - {"ofcir;", '\U000029BF', 0}, - {"ofr;", '\U0001D52C', 0}, - {"ogon;", '\U000002DB', 0}, - {"ograve", '\U000000F2', 0}, - {"ograve;", '\U000000F2', 0}, - {"ogt;", '\U000029C1', 0}, - {"ohbar;", '\U000029B5', 0}, - {"ohm;", '\U000003A9', 0}, - {"oint;", '\U0000222E', 0}, - {"olarr;", '\U000021BA', 0}, - {"olcir;", '\U000029BE', 0}, - {"olcross;", '\U000029BB', 0}, - {"oline;", '\U0000203E', 0}, - {"olt;", '\U000029C0', 0}, - {"omacr;", '\U0000014D', 0}, - {"omega;", '\U000003C9', 0}, - {"omicron;", '\U000003BF', 0}, - {"omid;", '\U000029B6', 0}, - {"ominus;", '\U00002296', 0}, - {"oopf;", '\U0001D560', 0}, - {"opar;", '\U000029B7', 0}, - {"operp;", '\U000029B9', 0}, - {"oplus;", '\U00002295', 0}, - {"or;", '\U00002228', 0}, - {"orarr;", '\U000021BB', 0}, - {"ord;", '\U00002A5D', 0}, - {"order;", '\U00002134', 0}, - {"orderof;", '\U00002134', 0}, - {"ordf", '\U000000AA', 0}, - {"ordf;", '\U000000AA', 0}, - {"ordm", '\U000000BA', 0}, - {"ordm;", '\U000000BA', 0}, - {"origof;", '\U000022B6', 0}, - {"oror;", '\U00002A56', 0}, - {"orslope;", '\U00002A57', 0}, - {"orv;", '\U00002A5B', 0}, - {"oscr;", '\U00002134', 0}, - {"oslash", '\U000000F8', 0}, - {"oslash;", '\U000000F8', 0}, - {"osol;", '\U00002298', 0}, - {"otilde", '\U000000F5', 0}, - {"otilde;", '\U000000F5', 0}, - {"otimes;", '\U00002297', 0}, - {"otimesas;", '\U00002A36', 0}, - {"ouml", '\U000000F6', 0}, - {"ouml;", '\U000000F6', 0}, - {"ovbar;", '\U0000233D', 0}, - {"par;", '\U00002225', 0}, - {"para", '\U000000B6', 0}, - {"para;", '\U000000B6', 0}, - {"parallel;", '\U00002225', 0}, - {"parsim;", '\U00002AF3', 0}, - {"parsl;", '\U00002AFD', 0}, - {"part;", '\U00002202', 0}, - {"pcy;", '\U0000043F', 0}, - {"percnt;", '\U00000025', 0}, - {"period;", '\U0000002E', 0}, - {"permil;", '\U00002030', 0}, - {"perp;", '\U000022A5', 0}, - {"pertenk;", '\U00002031', 0}, - {"pfr;", '\U0001D52D', 0}, - {"phi;", '\U000003C6', 0}, - {"phiv;", '\U000003D5', 0}, - {"phmmat;", '\U00002133', 0}, - {"phone;", '\U0000260E', 0}, - {"pi;", '\U000003C0', 0}, - {"pitchfork;", '\U000022D4', 0}, - {"piv;", '\U000003D6', 0}, - {"planck;", '\U0000210F', 0}, - {"planckh;", '\U0000210E', 0}, - {"plankv;", '\U0000210F', 0}, - {"plus;", '\U0000002B', 0}, - {"plusacir;", '\U00002A23', 0}, - {"plusb;", '\U0000229E', 0}, - {"pluscir;", '\U00002A22', 0}, - {"plusdo;", '\U00002214', 0}, - {"plusdu;", '\U00002A25', 0}, - {"pluse;", '\U00002A72', 0}, - {"plusmn", '\U000000B1', 0}, - {"plusmn;", '\U000000B1', 0}, - {"plussim;", '\U00002A26', 0}, - {"plustwo;", '\U00002A27', 0}, - {"pm;", '\U000000B1', 0}, - {"pointint;", '\U00002A15', 0}, - {"popf;", '\U0001D561', 0}, - {"pound", '\U000000A3', 0}, - {"pound;", '\U000000A3', 0}, - {"pr;", '\U0000227A', 0}, - {"prE;", '\U00002AB3', 0}, - {"prap;", '\U00002AB7', 0}, - {"prcue;", '\U0000227C', 0}, - {"pre;", '\U00002AAF', 0}, - {"prec;", '\U0000227A', 0}, - {"precapprox;", '\U00002AB7', 0}, - {"preccurlyeq;", '\U0000227C', 0}, - {"preceq;", '\U00002AAF', 0}, - {"precnapprox;", '\U00002AB9', 0}, - {"precneqq;", '\U00002AB5', 0}, - {"precnsim;", '\U000022E8', 0}, - {"precsim;", '\U0000227E', 0}, - {"prime;", '\U00002032', 0}, - {"primes;", '\U00002119', 0}, - {"prnE;", '\U00002AB5', 0}, - {"prnap;", '\U00002AB9', 0}, - {"prnsim;", '\U000022E8', 0}, - {"prod;", '\U0000220F', 0}, - {"profalar;", '\U0000232E', 0}, - {"profline;", '\U00002312', 0}, - {"profsurf;", '\U00002313', 0}, - {"prop;", '\U0000221D', 0}, - {"propto;", '\U0000221D', 0}, - {"prsim;", '\U0000227E', 0}, - {"prurel;", '\U000022B0', 0}, - {"pscr;", '\U0001D4C5', 0}, - {"psi;", '\U000003C8', 0}, - {"puncsp;", '\U00002008', 0}, - {"qfr;", '\U0001D52E', 0}, - {"qint;", '\U00002A0C', 0}, - {"qopf;", '\U0001D562', 0}, - {"qprime;", '\U00002057', 0}, - {"qscr;", '\U0001D4C6', 0}, - {"quaternions;", '\U0000210D', 0}, - {"quatint;", '\U00002A16', 0}, - {"quest;", '\U0000003F', 0}, - {"questeq;", '\U0000225F', 0}, - {"quot", '\U00000022', 0}, - {"quot;", '\U00000022', 0}, - {"rAarr;", '\U000021DB', 0}, - {"rArr;", '\U000021D2', 0}, - {"rAtail;", '\U0000291C', 0}, - {"rBarr;", '\U0000290F', 0}, - {"rHar;", '\U00002964', 0}, - {"race;", '\u223D', '\u0331'}, - {"racute;", '\U00000155', 0}, - {"radic;", '\U0000221A', 0}, - {"raemptyv;", '\U000029B3', 0}, - {"rang;", '\U000027E9', 0}, - {"rangd;", '\U00002992', 0}, - {"range;", '\U000029A5', 0}, - {"rangle;", '\U000027E9', 0}, - {"raquo", '\U000000BB', 0}, - {"raquo;", '\U000000BB', 0}, - {"rarr;", '\U00002192', 0}, - {"rarrap;", '\U00002975', 0}, - {"rarrb;", '\U000021E5', 0}, - {"rarrbfs;", '\U00002920', 0}, - {"rarrc;", '\U00002933', 0}, - {"rarrfs;", '\U0000291E', 0}, - {"rarrhk;", '\U000021AA', 0}, - {"rarrlp;", '\U000021AC', 0}, - {"rarrpl;", '\U00002945', 0}, - {"rarrsim;", '\U00002974', 0}, - {"rarrtl;", '\U000021A3', 0}, - {"rarrw;", '\U0000219D', 0}, - {"ratail;", '\U0000291A', 0}, - {"ratio;", '\U00002236', 0}, - {"rationals;", '\U0000211A', 0}, - {"rbarr;", '\U0000290D', 0}, - {"rbbrk;", '\U00002773', 0}, - {"rbrace;", '\U0000007D', 0}, - {"rbrack;", '\U0000005D', 0}, - {"rbrke;", '\U0000298C', 0}, - {"rbrksld;", '\U0000298E', 0}, - {"rbrkslu;", '\U00002990', 0}, - {"rcaron;", '\U00000159', 0}, - {"rcedil;", '\U00000157', 0}, - {"rceil;", '\U00002309', 0}, - {"rcub;", '\U0000007D', 0}, - {"rcy;", '\U00000440', 0}, - {"rdca;", '\U00002937', 0}, - {"rdldhar;", '\U00002969', 0}, - {"rdquo;", '\U0000201D', 0}, - {"rdquor;", '\U0000201D', 0}, - {"rdsh;", '\U000021B3', 0}, - {"real;", '\U0000211C', 0}, - {"realine;", '\U0000211B', 0}, - {"realpart;", '\U0000211C', 0}, - {"reals;", '\U0000211D', 0}, - {"rect;", '\U000025AD', 0}, - {"reg", '\U000000AE', 0}, - {"reg;", '\U000000AE', 0}, - {"rfisht;", '\U0000297D', 0}, - {"rfloor;", '\U0000230B', 0}, - {"rfr;", '\U0001D52F', 0}, - {"rhard;", '\U000021C1', 0}, - {"rharu;", '\U000021C0', 0}, - {"rharul;", '\U0000296C', 0}, - {"rho;", '\U000003C1', 0}, - {"rhov;", '\U000003F1', 0}, - {"rightarrow;", '\U00002192', 0}, - {"rightarrowtail;", '\U000021A3', 0}, - {"rightharpoondown;", '\U000021C1', 0}, - {"rightharpoonup;", '\U000021C0', 0}, - {"rightleftarrows;", '\U000021C4', 0}, - {"rightleftharpoons;", '\U000021CC', 0}, - {"rightrightarrows;", '\U000021C9', 0}, - {"rightsquigarrow;", '\U0000219D', 0}, - {"rightthreetimes;", '\U000022CC', 0}, - {"ring;", '\U000002DA', 0}, - {"risingdotseq;", '\U00002253', 0}, - {"rlarr;", '\U000021C4', 0}, - {"rlhar;", '\U000021CC', 0}, - {"rlm;", '\U0000200F', 0}, - {"rmoust;", '\U000023B1', 0}, - {"rmoustache;", '\U000023B1', 0}, - {"rnmid;", '\U00002AEE', 0}, - {"roang;", '\U000027ED', 0}, - {"roarr;", '\U000021FE', 0}, - {"robrk;", '\U000027E7', 0}, - {"ropar;", '\U00002986', 0}, - {"ropf;", '\U0001D563', 0}, - {"roplus;", '\U00002A2E', 0}, - {"rotimes;", '\U00002A35', 0}, - {"rpar;", '\U00000029', 0}, - {"rpargt;", '\U00002994', 0}, - {"rppolint;", '\U00002A12', 0}, - {"rrarr;", '\U000021C9', 0}, - {"rsaquo;", '\U0000203A', 0}, - {"rscr;", '\U0001D4C7', 0}, - {"rsh;", '\U000021B1', 0}, - {"rsqb;", '\U0000005D', 0}, - {"rsquo;", '\U00002019', 0}, - {"rsquor;", '\U00002019', 0}, - {"rthree;", '\U000022CC', 0}, - {"rtimes;", '\U000022CA', 0}, - {"rtri;", '\U000025B9', 0}, - {"rtrie;", '\U000022B5', 0}, - {"rtrif;", '\U000025B8', 0}, - {"rtriltri;", '\U000029CE', 0}, - {"ruluhar;", '\U00002968', 0}, - {"rx;", '\U0000211E', 0}, - {"sacute;", '\U0000015B', 0}, - {"sbquo;", '\U0000201A', 0}, - {"sc;", '\U0000227B', 0}, - {"scE;", '\U00002AB4', 0}, - {"scap;", '\U00002AB8', 0}, - {"scaron;", '\U00000161', 0}, - {"sccue;", '\U0000227D', 0}, - {"sce;", '\U00002AB0', 0}, - {"scedil;", '\U0000015F', 0}, - {"scirc;", '\U0000015D', 0}, - {"scnE;", '\U00002AB6', 0}, - {"scnap;", '\U00002ABA', 0}, - {"scnsim;", '\U000022E9', 0}, - {"scpolint;", '\U00002A13', 0}, - {"scsim;", '\U0000227F', 0}, - {"scy;", '\U00000441', 0}, - {"sdot;", '\U000022C5', 0}, - {"sdotb;", '\U000022A1', 0}, - {"sdote;", '\U00002A66', 0}, - {"seArr;", '\U000021D8', 0}, - {"searhk;", '\U00002925', 0}, - {"searr;", '\U00002198', 0}, - {"searrow;", '\U00002198', 0}, - {"sect", '\U000000A7', 0}, - {"sect;", '\U000000A7', 0}, - {"semi;", '\U0000003B', 0}, - {"seswar;", '\U00002929', 0}, - {"setminus;", '\U00002216', 0}, - {"setmn;", '\U00002216', 0}, - {"sext;", '\U00002736', 0}, - {"sfr;", '\U0001D530', 0}, - {"sfrown;", '\U00002322', 0}, - {"sharp;", '\U0000266F', 0}, - {"shchcy;", '\U00000449', 0}, - {"shcy;", '\U00000448', 0}, - {"shortmid;", '\U00002223', 0}, - {"shortparallel;", '\U00002225', 0}, - {"shy", '\U000000AD', 0}, - {"shy;", '\U000000AD', 0}, - {"sigma;", '\U000003C3', 0}, - {"sigmaf;", '\U000003C2', 0}, - {"sigmav;", '\U000003C2', 0}, - {"sim;", '\U0000223C', 0}, - {"simdot;", '\U00002A6A', 0}, - {"sime;", '\U00002243', 0}, - {"simeq;", '\U00002243', 0}, - {"simg;", '\U00002A9E', 0}, - {"simgE;", '\U00002AA0', 0}, - {"siml;", '\U00002A9D', 0}, - {"simlE;", '\U00002A9F', 0}, - {"simne;", '\U00002246', 0}, - {"simplus;", '\U00002A24', 0}, - {"simrarr;", '\U00002972', 0}, - {"slarr;", '\U00002190', 0}, - {"smallsetminus;", '\U00002216', 0}, - {"smashp;", '\U00002A33', 0}, - {"smeparsl;", '\U000029E4', 0}, - {"smid;", '\U00002223', 0}, - {"smile;", '\U00002323', 0}, - {"smt;", '\U00002AAA', 0}, - {"smte;", '\U00002AAC', 0}, - {"smtes;", '\u2AAC', '\uFE00'}, - {"softcy;", '\U0000044C', 0}, - {"sol;", '\U0000002F', 0}, - {"solb;", '\U000029C4', 0}, - {"solbar;", '\U0000233F', 0}, - {"sopf;", '\U0001D564', 0}, - {"spades;", '\U00002660', 0}, - {"spadesuit;", '\U00002660', 0}, - {"spar;", '\U00002225', 0}, - {"sqcap;", '\U00002293', 0}, - {"sqcaps;", '\u2293', '\uFE00'}, - {"sqcup;", '\U00002294', 0}, - {"sqcups;", '\u2294', '\uFE00'}, - {"sqsub;", '\U0000228F', 0}, - {"sqsube;", '\U00002291', 0}, - {"sqsubset;", '\U0000228F', 0}, - {"sqsubseteq;", '\U00002291', 0}, - {"sqsup;", '\U00002290', 0}, - {"sqsupe;", '\U00002292', 0}, - {"sqsupset;", '\U00002290', 0}, - {"sqsupseteq;", '\U00002292', 0}, - {"squ;", '\U000025A1', 0}, - {"square;", '\U000025A1', 0}, - {"squarf;", '\U000025AA', 0}, - {"squf;", '\U000025AA', 0}, - {"srarr;", '\U00002192', 0}, - {"sscr;", '\U0001D4C8', 0}, - {"ssetmn;", '\U00002216', 0}, - {"ssmile;", '\U00002323', 0}, - {"sstarf;", '\U000022C6', 0}, - {"star;", '\U00002606', 0}, - {"starf;", '\U00002605', 0}, - {"straightepsilon;", '\U000003F5', 0}, - {"straightphi;", '\U000003D5', 0}, - {"strns;", '\U000000AF', 0}, - {"sub;", '\U00002282', 0}, - {"subE;", '\U00002AC5', 0}, - {"subdot;", '\U00002ABD', 0}, - {"sube;", '\U00002286', 0}, - {"subedot;", '\U00002AC3', 0}, - {"submult;", '\U00002AC1', 0}, - {"subnE;", '\U00002ACB', 0}, - {"subne;", '\U0000228A', 0}, - {"subplus;", '\U00002ABF', 0}, - {"subrarr;", '\U00002979', 0}, - {"subset;", '\U00002282', 0}, - {"subseteq;", '\U00002286', 0}, - {"subseteqq;", '\U00002AC5', 0}, - {"subsetneq;", '\U0000228A', 0}, - {"subsetneqq;", '\U00002ACB', 0}, - {"subsim;", '\U00002AC7', 0}, - {"subsub;", '\U00002AD5', 0}, - {"subsup;", '\U00002AD3', 0}, - {"succ;", '\U0000227B', 0}, - {"succapprox;", '\U00002AB8', 0}, - {"succcurlyeq;", '\U0000227D', 0}, - {"succeq;", '\U00002AB0', 0}, - {"succnapprox;", '\U00002ABA', 0}, - {"succneqq;", '\U00002AB6', 0}, - {"succnsim;", '\U000022E9', 0}, - {"succsim;", '\U0000227F', 0}, - {"sum;", '\U00002211', 0}, - {"sung;", '\U0000266A', 0}, - {"sup1", '\U000000B9', 0}, - {"sup1;", '\U000000B9', 0}, - {"sup2", '\U000000B2', 0}, - {"sup2;", '\U000000B2', 0}, - {"sup3", '\U000000B3', 0}, - {"sup3;", '\U000000B3', 0}, - {"sup;", '\U00002283', 0}, - {"supE;", '\U00002AC6', 0}, - {"supdot;", '\U00002ABE', 0}, - {"supdsub;", '\U00002AD8', 0}, - {"supe;", '\U00002287', 0}, - {"supedot;", '\U00002AC4', 0}, - {"suphsol;", '\U000027C9', 0}, - {"suphsub;", '\U00002AD7', 0}, - {"suplarr;", '\U0000297B', 0}, - {"supmult;", '\U00002AC2', 0}, - {"supnE;", '\U00002ACC', 0}, - {"supne;", '\U0000228B', 0}, - {"supplus;", '\U00002AC0', 0}, - {"supset;", '\U00002283', 0}, - {"supseteq;", '\U00002287', 0}, - {"supseteqq;", '\U00002AC6', 0}, - {"supsetneq;", '\U0000228B', 0}, - {"supsetneqq;", '\U00002ACC', 0}, - {"supsim;", '\U00002AC8', 0}, - {"supsub;", '\U00002AD4', 0}, - {"supsup;", '\U00002AD6', 0}, - {"swArr;", '\U000021D9', 0}, - {"swarhk;", '\U00002926', 0}, - {"swarr;", '\U00002199', 0}, - {"swarrow;", '\U00002199', 0}, - {"swnwar;", '\U0000292A', 0}, - {"szlig", '\U000000DF', 0}, - {"szlig;", '\U000000DF', 0}, - {"target;", '\U00002316', 0}, - {"tau;", '\U000003C4', 0}, - {"tbrk;", '\U000023B4', 0}, - {"tcaron;", '\U00000165', 0}, - {"tcedil;", '\U00000163', 0}, - {"tcy;", '\U00000442', 0}, - {"tdot;", '\U000020DB', 0}, - {"telrec;", '\U00002315', 0}, - {"tfr;", '\U0001D531', 0}, - {"there4;", '\U00002234', 0}, - {"therefore;", '\U00002234', 0}, - {"theta;", '\U000003B8', 0}, - {"thetasym;", '\U000003D1', 0}, - {"thetav;", '\U000003D1', 0}, - {"thickapprox;", '\U00002248', 0}, - {"thicksim;", '\U0000223C', 0}, - {"thinsp;", '\U00002009', 0}, - {"thkap;", '\U00002248', 0}, - {"thksim;", '\U0000223C', 0}, - {"thorn", '\U000000FE', 0}, - {"thorn;", '\U000000FE', 0}, - {"tilde;", '\U000002DC', 0}, - {"times", '\U000000D7', 0}, - {"times;", '\U000000D7', 0}, - {"timesb;", '\U000022A0', 0}, - {"timesbar;", '\U00002A31', 0}, - {"timesd;", '\U00002A30', 0}, - {"tint;", '\U0000222D', 0}, - {"toea;", '\U00002928', 0}, - {"top;", '\U000022A4', 0}, - {"topbot;", '\U00002336', 0}, - {"topcir;", '\U00002AF1', 0}, - {"topf;", '\U0001D565', 0}, - {"topfork;", '\U00002ADA', 0}, - {"tosa;", '\U00002929', 0}, - {"tprime;", '\U00002034', 0}, - {"trade;", '\U00002122', 0}, - {"triangle;", '\U000025B5', 0}, - {"triangledown;", '\U000025BF', 0}, - {"triangleleft;", '\U000025C3', 0}, - {"trianglelefteq;", '\U000022B4', 0}, - {"triangleq;", '\U0000225C', 0}, - {"triangleright;", '\U000025B9', 0}, - {"trianglerighteq;", '\U000022B5', 0}, - {"tridot;", '\U000025EC', 0}, - {"trie;", '\U0000225C', 0}, - {"triminus;", '\U00002A3A', 0}, - {"triplus;", '\U00002A39', 0}, - {"trisb;", '\U000029CD', 0}, - {"tritime;", '\U00002A3B', 0}, - {"trpezium;", '\U000023E2', 0}, - {"tscr;", '\U0001D4C9', 0}, - {"tscy;", '\U00000446', 0}, - {"tshcy;", '\U0000045B', 0}, - {"tstrok;", '\U00000167', 0}, - {"twixt;", '\U0000226C', 0}, - {"twoheadleftarrow;", '\U0000219E', 0}, - {"twoheadrightarrow;", '\U000021A0', 0}, - {"uArr;", '\U000021D1', 0}, - {"uHar;", '\U00002963', 0}, - {"uacute", '\U000000FA', 0}, - {"uacute;", '\U000000FA', 0}, - {"uarr;", '\U00002191', 0}, - {"ubrcy;", '\U0000045E', 0}, - {"ubreve;", '\U0000016D', 0}, - {"ucirc", '\U000000FB', 0}, - {"ucirc;", '\U000000FB', 0}, - {"ucy;", '\U00000443', 0}, - {"udarr;", '\U000021C5', 0}, - {"udblac;", '\U00000171', 0}, - {"udhar;", '\U0000296E', 0}, - {"ufisht;", '\U0000297E', 0}, - {"ufr;", '\U0001D532', 0}, - {"ugrave", '\U000000F9', 0}, - {"ugrave;", '\U000000F9', 0}, - {"uharl;", '\U000021BF', 0}, - {"uharr;", '\U000021BE', 0}, - {"uhblk;", '\U00002580', 0}, - {"ulcorn;", '\U0000231C', 0}, - {"ulcorner;", '\U0000231C', 0}, - {"ulcrop;", '\U0000230F', 0}, - {"ultri;", '\U000025F8', 0}, - {"umacr;", '\U0000016B', 0}, - {"uml", '\U000000A8', 0}, - {"uml;", '\U000000A8', 0}, - {"uogon;", '\U00000173', 0}, - {"uopf;", '\U0001D566', 0}, - {"uparrow;", '\U00002191', 0}, - {"updownarrow;", '\U00002195', 0}, - {"upharpoonleft;", '\U000021BF', 0}, - {"upharpoonright;", '\U000021BE', 0}, - {"uplus;", '\U0000228E', 0}, - {"upsi;", '\U000003C5', 0}, - {"upsih;", '\U000003D2', 0}, - {"upsilon;", '\U000003C5', 0}, - {"upuparrows;", '\U000021C8', 0}, - {"urcorn;", '\U0000231D', 0}, - {"urcorner;", '\U0000231D', 0}, - {"urcrop;", '\U0000230E', 0}, - {"uring;", '\U0000016F', 0}, - {"urtri;", '\U000025F9', 0}, - {"uscr;", '\U0001D4CA', 0}, - {"utdot;", '\U000022F0', 0}, - {"utilde;", '\U00000169', 0}, - {"utri;", '\U000025B5', 0}, - {"utrif;", '\U000025B4', 0}, - {"uuarr;", '\U000021C8', 0}, - {"uuml", '\U000000FC', 0}, - {"uuml;", '\U000000FC', 0}, - {"uwangle;", '\U000029A7', 0}, - {"vArr;", '\U000021D5', 0}, - {"vBar;", '\U00002AE8', 0}, - {"vBarv;", '\U00002AE9', 0}, - {"vDash;", '\U000022A8', 0}, - {"vangrt;", '\U0000299C', 0}, - {"varepsilon;", '\U000003F5', 0}, - {"varkappa;", '\U000003F0', 0}, - {"varnothing;", '\U00002205', 0}, - {"varphi;", '\U000003D5', 0}, - {"varpi;", '\U000003D6', 0}, - {"varpropto;", '\U0000221D', 0}, - {"varr;", '\U00002195', 0}, - {"varrho;", '\U000003F1', 0}, - {"varsigma;", '\U000003C2', 0}, - {"varsubsetneq;", '\u228A', '\uFE00'}, - {"varsubsetneqq;", '\u2ACB', '\uFE00'}, - {"varsupsetneq;", '\u228B', '\uFE00'}, - {"varsupsetneqq;", '\u2ACC', '\uFE00'}, - {"vartheta;", '\U000003D1', 0}, - {"vartriangleleft;", '\U000022B2', 0}, - {"vartriangleright;", '\U000022B3', 0}, - {"vcy;", '\U00000432', 0}, - {"vdash;", '\U000022A2', 0}, - {"vee;", '\U00002228', 0}, - {"veebar;", '\U000022BB', 0}, - {"veeeq;", '\U0000225A', 0}, - {"vellip;", '\U000022EE', 0}, - {"verbar;", '\U0000007C', 0}, - {"vert;", '\U0000007C', 0}, - {"vfr;", '\U0001D533', 0}, - {"vltri;", '\U000022B2', 0}, - {"vnsub;", '\u2282', '\u20D2'}, - {"vnsup;", '\u2283', '\u20D2'}, - {"vopf;", '\U0001D567', 0}, - {"vprop;", '\U0000221D', 0}, - {"vrtri;", '\U000022B3', 0}, - {"vscr;", '\U0001D4CB', 0}, - {"vsubnE;", '\u2ACB', '\uFE00'}, - {"vsubne;", '\u228A', '\uFE00'}, - {"vsupnE;", '\u2ACC', '\uFE00'}, - {"vsupne;", '\u228B', '\uFE00'}, - {"vzigzag;", '\U0000299A', 0}, - {"wcirc;", '\U00000175', 0}, - {"wedbar;", '\U00002A5F', 0}, - {"wedge;", '\U00002227', 0}, - {"wedgeq;", '\U00002259', 0}, - {"weierp;", '\U00002118', 0}, - {"wfr;", '\U0001D534', 0}, - {"wopf;", '\U0001D568', 0}, - {"wp;", '\U00002118', 0}, - {"wr;", '\U00002240', 0}, - {"wreath;", '\U00002240', 0}, - {"wscr;", '\U0001D4CC', 0}, - {"xcap;", '\U000022C2', 0}, - {"xcirc;", '\U000025EF', 0}, - {"xcup;", '\U000022C3', 0}, - {"xdtri;", '\U000025BD', 0}, - {"xfr;", '\U0001D535', 0}, - {"xhArr;", '\U000027FA', 0}, - {"xharr;", '\U000027F7', 0}, - {"xi;", '\U000003BE', 0}, - {"xlArr;", '\U000027F8', 0}, - {"xlarr;", '\U000027F5', 0}, - {"xmap;", '\U000027FC', 0}, - {"xnis;", '\U000022FB', 0}, - {"xodot;", '\U00002A00', 0}, - {"xopf;", '\U0001D569', 0}, - {"xoplus;", '\U00002A01', 0}, - {"xotime;", '\U00002A02', 0}, - {"xrArr;", '\U000027F9', 0}, - {"xrarr;", '\U000027F6', 0}, - {"xscr;", '\U0001D4CD', 0}, - {"xsqcup;", '\U00002A06', 0}, - {"xuplus;", '\U00002A04', 0}, - {"xutri;", '\U000025B3', 0}, - {"xvee;", '\U000022C1', 0}, - {"xwedge;", '\U000022C0', 0}, - {"yacute", '\U000000FD', 0}, - {"yacute;", '\U000000FD', 0}, - {"yacy;", '\U0000044F', 0}, - {"ycirc;", '\U00000177', 0}, - {"ycy;", '\U0000044B', 0}, - {"yen", '\U000000A5', 0}, - {"yen;", '\U000000A5', 0}, - {"yfr;", '\U0001D536', 0}, - {"yicy;", '\U00000457', 0}, - {"yopf;", '\U0001D56A', 0}, - {"yscr;", '\U0001D4CE', 0}, - {"yucy;", '\U0000044E', 0}, - {"yuml", '\U000000FF', 0}, - {"yuml;", '\U000000FF', 0}, - {"zacute;", '\U0000017A', 0}, - {"zcaron;", '\U0000017E', 0}, - {"zcy;", '\U00000437', 0}, - {"zdot;", '\U0000017C', 0}, - {"zeetrf;", '\U00002128', 0}, - {"zeta;", '\U000003B6', 0}, - {"zfr;", '\U0001D537', 0}, - {"zhcy;", '\U00000436', 0}, - {"zigrarr;", '\U000021DD', 0}, - {"zopf;", '\U0001D56B', 0}, - {"zscr;", '\U0001D4CF', 0}, - {"zwj;", '\U0000200D', 0}, - {"zwnj;", '\U0000200C', 0}, -} diff --git a/vendor/github.com/Tang-RoseChild/mahonia/euc-jp.go b/vendor/github.com/Tang-RoseChild/mahonia/euc-jp.go deleted file mode 100644 index 810c3ec7c..000000000 --- a/vendor/github.com/Tang-RoseChild/mahonia/euc-jp.go +++ /dev/null @@ -1,102 +0,0 @@ -package mahonia - -import ( - "unicode/utf8" -) - -// Converters for the EUC-JP encoding - -func init() { - RegisterCharset(&Charset{ - Name: "EUC-JP", - Aliases: []string{"extended_unix_code_packed_format_for_japanese", "cseucpkdfmtjapanese"}, - NewDecoder: func() Decoder { - return decodeEucJP - }, - NewEncoder: func() Encoder { - jis0208Table.Reverse() - jis0212Table.Reverse() - return encodeEucJP - }, - }) -} - -func decodeEucJP(p []byte) (c rune, size int, status Status) { - if len(p) == 0 { - return 0, 0, NO_ROOM - } - - b := p[0] - switch { - case b < 0x80: - return rune(b), 1, SUCCESS - - case b == 0x8e: - if len(p) < 2 { - return 0, 0, NO_ROOM - } - b2 := p[1] - if b2 < 0xa1 || b2 > 0xdf { - return utf8.RuneError, 1, INVALID_CHAR - } - return rune(b2) + (0xff61 - 0xa1), 2, SUCCESS - - case b == 0x8f: - if len(p) < 3 { - return 0, 0, NO_ROOM - } - c, size, status = jis0212Table.DecodeHigh(p[1:3]) - if status == SUCCESS { - size = 3 - } - return - - case 0xa1 <= b && b <= 0xfe: - return jis0208Table.DecodeHigh(p) - } - - return utf8.RuneError, 1, INVALID_CHAR -} - -func encodeEucJP(p []byte, c rune) (size int, status Status) { - if len(p) == 0 { - return 0, NO_ROOM - } - - if c < 0x80 { - p[0] = byte(c) - return 1, SUCCESS - } - - if len(p) < 2 { - return 0, NO_ROOM - } - - if c > 0xffff { - p[0] = '?' - return 1, INVALID_CHAR - } - - if 0xff61 <= c && c <= 0xff9f { - p[0] = 0x8e - p[1] = byte(c - (0xff61 - 0xa1)) - return 2, SUCCESS - } - - size, status = jis0208Table.EncodeHigh(p, c) - if status == SUCCESS { - return size, status - } - - size, status = jis0212Table.EncodeHigh(p[1:], c) - switch status { - case SUCCESS: - p[0] = 0x8f - return size + 1, SUCCESS - - case INVALID_CHAR: - p[0] = '?' - return 1, INVALID_CHAR - } - return size, status -} diff --git a/vendor/github.com/Tang-RoseChild/mahonia/euc-kr-data.go b/vendor/github.com/Tang-RoseChild/mahonia/euc-kr-data.go deleted file mode 100644 index b40fc91f1..000000000 --- a/vendor/github.com/Tang-RoseChild/mahonia/euc-kr-data.go +++ /dev/null @@ -1,17072 +0,0 @@ -package mahonia - -import ( - "sync" -) - -var eucKrOnce sync.Once - -var unicodeToEucKr []uint16 - -func reverseEucKrTable() { - unicodeToEucKr = make([]uint16, 65536) - for euc, unicode := range eucKrToUnicode { - if unicode != 0 { - unicodeToEucKr[unicode] = uint16(euc) - } - } -} - -// eucKrToUnicode contains the double-byte mappings from -// http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP949.TXT -// CP949 is Microsoft's version of EUC-KR. -var eucKrToUnicode = [65536]uint16{ - 0x8141: 0xAC02, - 0x8142: 0xAC03, - 0x8143: 0xAC05, - 0x8144: 0xAC06, - 0x8145: 0xAC0B, - 0x8146: 0xAC0C, - 0x8147: 0xAC0D, - 0x8148: 0xAC0E, - 0x8149: 0xAC0F, - 0x814A: 0xAC18, - 0x814B: 0xAC1E, - 0x814C: 0xAC1F, - 0x814D: 0xAC21, - 0x814E: 0xAC22, - 0x814F: 0xAC23, - 0x8150: 0xAC25, - 0x8151: 0xAC26, - 0x8152: 0xAC27, - 0x8153: 0xAC28, - 0x8154: 0xAC29, - 0x8155: 0xAC2A, - 0x8156: 0xAC2B, - 0x8157: 0xAC2E, - 0x8158: 0xAC32, - 0x8159: 0xAC33, - 0x815A: 0xAC34, - 0x8161: 0xAC35, - 0x8162: 0xAC36, - 0x8163: 0xAC37, - 0x8164: 0xAC3A, - 0x8165: 0xAC3B, - 0x8166: 0xAC3D, - 0x8167: 0xAC3E, - 0x8168: 0xAC3F, - 0x8169: 0xAC41, - 0x816A: 0xAC42, - 0x816B: 0xAC43, - 0x816C: 0xAC44, - 0x816D: 0xAC45, - 0x816E: 0xAC46, - 0x816F: 0xAC47, - 0x8170: 0xAC48, - 0x8171: 0xAC49, - 0x8172: 0xAC4A, - 0x8173: 0xAC4C, - 0x8174: 0xAC4E, - 0x8175: 0xAC4F, - 0x8176: 0xAC50, - 0x8177: 0xAC51, - 0x8178: 0xAC52, - 0x8179: 0xAC53, - 0x817A: 0xAC55, - 0x8181: 0xAC56, - 0x8182: 0xAC57, - 0x8183: 0xAC59, - 0x8184: 0xAC5A, - 0x8185: 0xAC5B, - 0x8186: 0xAC5D, - 0x8187: 0xAC5E, - 0x8188: 0xAC5F, - 0x8189: 0xAC60, - 0x818A: 0xAC61, - 0x818B: 0xAC62, - 0x818C: 0xAC63, - 0x818D: 0xAC64, - 0x818E: 0xAC65, - 0x818F: 0xAC66, - 0x8190: 0xAC67, - 0x8191: 0xAC68, - 0x8192: 0xAC69, - 0x8193: 0xAC6A, - 0x8194: 0xAC6B, - 0x8195: 0xAC6C, - 0x8196: 0xAC6D, - 0x8197: 0xAC6E, - 0x8198: 0xAC6F, - 0x8199: 0xAC72, - 0x819A: 0xAC73, - 0x819B: 0xAC75, - 0x819C: 0xAC76, - 0x819D: 0xAC79, - 0x819E: 0xAC7B, - 0x819F: 0xAC7C, - 0x81A0: 0xAC7D, - 0x81A1: 0xAC7E, - 0x81A2: 0xAC7F, - 0x81A3: 0xAC82, - 0x81A4: 0xAC87, - 0x81A5: 0xAC88, - 0x81A6: 0xAC8D, - 0x81A7: 0xAC8E, - 0x81A8: 0xAC8F, - 0x81A9: 0xAC91, - 0x81AA: 0xAC92, - 0x81AB: 0xAC93, - 0x81AC: 0xAC95, - 0x81AD: 0xAC96, - 0x81AE: 0xAC97, - 0x81AF: 0xAC98, - 0x81B0: 0xAC99, - 0x81B1: 0xAC9A, - 0x81B2: 0xAC9B, - 0x81B3: 0xAC9E, - 0x81B4: 0xACA2, - 0x81B5: 0xACA3, - 0x81B6: 0xACA4, - 0x81B7: 0xACA5, - 0x81B8: 0xACA6, - 0x81B9: 0xACA7, - 0x81BA: 0xACAB, - 0x81BB: 0xACAD, - 0x81BC: 0xACAE, - 0x81BD: 0xACB1, - 0x81BE: 0xACB2, - 0x81BF: 0xACB3, - 0x81C0: 0xACB4, - 0x81C1: 0xACB5, - 0x81C2: 0xACB6, - 0x81C3: 0xACB7, - 0x81C4: 0xACBA, - 0x81C5: 0xACBE, - 0x81C6: 0xACBF, - 0x81C7: 0xACC0, - 0x81C8: 0xACC2, - 0x81C9: 0xACC3, - 0x81CA: 0xACC5, - 0x81CB: 0xACC6, - 0x81CC: 0xACC7, - 0x81CD: 0xACC9, - 0x81CE: 0xACCA, - 0x81CF: 0xACCB, - 0x81D0: 0xACCD, - 0x81D1: 0xACCE, - 0x81D2: 0xACCF, - 0x81D3: 0xACD0, - 0x81D4: 0xACD1, - 0x81D5: 0xACD2, - 0x81D6: 0xACD3, - 0x81D7: 0xACD4, - 0x81D8: 0xACD6, - 0x81D9: 0xACD8, - 0x81DA: 0xACD9, - 0x81DB: 0xACDA, - 0x81DC: 0xACDB, - 0x81DD: 0xACDC, - 0x81DE: 0xACDD, - 0x81DF: 0xACDE, - 0x81E0: 0xACDF, - 0x81E1: 0xACE2, - 0x81E2: 0xACE3, - 0x81E3: 0xACE5, - 0x81E4: 0xACE6, - 0x81E5: 0xACE9, - 0x81E6: 0xACEB, - 0x81E7: 0xACED, - 0x81E8: 0xACEE, - 0x81E9: 0xACF2, - 0x81EA: 0xACF4, - 0x81EB: 0xACF7, - 0x81EC: 0xACF8, - 0x81ED: 0xACF9, - 0x81EE: 0xACFA, - 0x81EF: 0xACFB, - 0x81F0: 0xACFE, - 0x81F1: 0xACFF, - 0x81F2: 0xAD01, - 0x81F3: 0xAD02, - 0x81F4: 0xAD03, - 0x81F5: 0xAD05, - 0x81F6: 0xAD07, - 0x81F7: 0xAD08, - 0x81F8: 0xAD09, - 0x81F9: 0xAD0A, - 0x81FA: 0xAD0B, - 0x81FB: 0xAD0E, - 0x81FC: 0xAD10, - 0x81FD: 0xAD12, - 0x81FE: 0xAD13, - 0x8241: 0xAD14, - 0x8242: 0xAD15, - 0x8243: 0xAD16, - 0x8244: 0xAD17, - 0x8245: 0xAD19, - 0x8246: 0xAD1A, - 0x8247: 0xAD1B, - 0x8248: 0xAD1D, - 0x8249: 0xAD1E, - 0x824A: 0xAD1F, - 0x824B: 0xAD21, - 0x824C: 0xAD22, - 0x824D: 0xAD23, - 0x824E: 0xAD24, - 0x824F: 0xAD25, - 0x8250: 0xAD26, - 0x8251: 0xAD27, - 0x8252: 0xAD28, - 0x8253: 0xAD2A, - 0x8254: 0xAD2B, - 0x8255: 0xAD2E, - 0x8256: 0xAD2F, - 0x8257: 0xAD30, - 0x8258: 0xAD31, - 0x8259: 0xAD32, - 0x825A: 0xAD33, - 0x8261: 0xAD36, - 0x8262: 0xAD37, - 0x8263: 0xAD39, - 0x8264: 0xAD3A, - 0x8265: 0xAD3B, - 0x8266: 0xAD3D, - 0x8267: 0xAD3E, - 0x8268: 0xAD3F, - 0x8269: 0xAD40, - 0x826A: 0xAD41, - 0x826B: 0xAD42, - 0x826C: 0xAD43, - 0x826D: 0xAD46, - 0x826E: 0xAD48, - 0x826F: 0xAD4A, - 0x8270: 0xAD4B, - 0x8271: 0xAD4C, - 0x8272: 0xAD4D, - 0x8273: 0xAD4E, - 0x8274: 0xAD4F, - 0x8275: 0xAD51, - 0x8276: 0xAD52, - 0x8277: 0xAD53, - 0x8278: 0xAD55, - 0x8279: 0xAD56, - 0x827A: 0xAD57, - 0x8281: 0xAD59, - 0x8282: 0xAD5A, - 0x8283: 0xAD5B, - 0x8284: 0xAD5C, - 0x8285: 0xAD5D, - 0x8286: 0xAD5E, - 0x8287: 0xAD5F, - 0x8288: 0xAD60, - 0x8289: 0xAD62, - 0x828A: 0xAD64, - 0x828B: 0xAD65, - 0x828C: 0xAD66, - 0x828D: 0xAD67, - 0x828E: 0xAD68, - 0x828F: 0xAD69, - 0x8290: 0xAD6A, - 0x8291: 0xAD6B, - 0x8292: 0xAD6E, - 0x8293: 0xAD6F, - 0x8294: 0xAD71, - 0x8295: 0xAD72, - 0x8296: 0xAD77, - 0x8297: 0xAD78, - 0x8298: 0xAD79, - 0x8299: 0xAD7A, - 0x829A: 0xAD7E, - 0x829B: 0xAD80, - 0x829C: 0xAD83, - 0x829D: 0xAD84, - 0x829E: 0xAD85, - 0x829F: 0xAD86, - 0x82A0: 0xAD87, - 0x82A1: 0xAD8A, - 0x82A2: 0xAD8B, - 0x82A3: 0xAD8D, - 0x82A4: 0xAD8E, - 0x82A5: 0xAD8F, - 0x82A6: 0xAD91, - 0x82A7: 0xAD92, - 0x82A8: 0xAD93, - 0x82A9: 0xAD94, - 0x82AA: 0xAD95, - 0x82AB: 0xAD96, - 0x82AC: 0xAD97, - 0x82AD: 0xAD98, - 0x82AE: 0xAD99, - 0x82AF: 0xAD9A, - 0x82B0: 0xAD9B, - 0x82B1: 0xAD9E, - 0x82B2: 0xAD9F, - 0x82B3: 0xADA0, - 0x82B4: 0xADA1, - 0x82B5: 0xADA2, - 0x82B6: 0xADA3, - 0x82B7: 0xADA5, - 0x82B8: 0xADA6, - 0x82B9: 0xADA7, - 0x82BA: 0xADA8, - 0x82BB: 0xADA9, - 0x82BC: 0xADAA, - 0x82BD: 0xADAB, - 0x82BE: 0xADAC, - 0x82BF: 0xADAD, - 0x82C0: 0xADAE, - 0x82C1: 0xADAF, - 0x82C2: 0xADB0, - 0x82C3: 0xADB1, - 0x82C4: 0xADB2, - 0x82C5: 0xADB3, - 0x82C6: 0xADB4, - 0x82C7: 0xADB5, - 0x82C8: 0xADB6, - 0x82C9: 0xADB8, - 0x82CA: 0xADB9, - 0x82CB: 0xADBA, - 0x82CC: 0xADBB, - 0x82CD: 0xADBC, - 0x82CE: 0xADBD, - 0x82CF: 0xADBE, - 0x82D0: 0xADBF, - 0x82D1: 0xADC2, - 0x82D2: 0xADC3, - 0x82D3: 0xADC5, - 0x82D4: 0xADC6, - 0x82D5: 0xADC7, - 0x82D6: 0xADC9, - 0x82D7: 0xADCA, - 0x82D8: 0xADCB, - 0x82D9: 0xADCC, - 0x82DA: 0xADCD, - 0x82DB: 0xADCE, - 0x82DC: 0xADCF, - 0x82DD: 0xADD2, - 0x82DE: 0xADD4, - 0x82DF: 0xADD5, - 0x82E0: 0xADD6, - 0x82E1: 0xADD7, - 0x82E2: 0xADD8, - 0x82E3: 0xADD9, - 0x82E4: 0xADDA, - 0x82E5: 0xADDB, - 0x82E6: 0xADDD, - 0x82E7: 0xADDE, - 0x82E8: 0xADDF, - 0x82E9: 0xADE1, - 0x82EA: 0xADE2, - 0x82EB: 0xADE3, - 0x82EC: 0xADE5, - 0x82ED: 0xADE6, - 0x82EE: 0xADE7, - 0x82EF: 0xADE8, - 0x82F0: 0xADE9, - 0x82F1: 0xADEA, - 0x82F2: 0xADEB, - 0x82F3: 0xADEC, - 0x82F4: 0xADED, - 0x82F5: 0xADEE, - 0x82F6: 0xADEF, - 0x82F7: 0xADF0, - 0x82F8: 0xADF1, - 0x82F9: 0xADF2, - 0x82FA: 0xADF3, - 0x82FB: 0xADF4, - 0x82FC: 0xADF5, - 0x82FD: 0xADF6, - 0x82FE: 0xADF7, - 0x8341: 0xADFA, - 0x8342: 0xADFB, - 0x8343: 0xADFD, - 0x8344: 0xADFE, - 0x8345: 0xAE02, - 0x8346: 0xAE03, - 0x8347: 0xAE04, - 0x8348: 0xAE05, - 0x8349: 0xAE06, - 0x834A: 0xAE07, - 0x834B: 0xAE0A, - 0x834C: 0xAE0C, - 0x834D: 0xAE0E, - 0x834E: 0xAE0F, - 0x834F: 0xAE10, - 0x8350: 0xAE11, - 0x8351: 0xAE12, - 0x8352: 0xAE13, - 0x8353: 0xAE15, - 0x8354: 0xAE16, - 0x8355: 0xAE17, - 0x8356: 0xAE18, - 0x8357: 0xAE19, - 0x8358: 0xAE1A, - 0x8359: 0xAE1B, - 0x835A: 0xAE1C, - 0x8361: 0xAE1D, - 0x8362: 0xAE1E, - 0x8363: 0xAE1F, - 0x8364: 0xAE20, - 0x8365: 0xAE21, - 0x8366: 0xAE22, - 0x8367: 0xAE23, - 0x8368: 0xAE24, - 0x8369: 0xAE25, - 0x836A: 0xAE26, - 0x836B: 0xAE27, - 0x836C: 0xAE28, - 0x836D: 0xAE29, - 0x836E: 0xAE2A, - 0x836F: 0xAE2B, - 0x8370: 0xAE2C, - 0x8371: 0xAE2D, - 0x8372: 0xAE2E, - 0x8373: 0xAE2F, - 0x8374: 0xAE32, - 0x8375: 0xAE33, - 0x8376: 0xAE35, - 0x8377: 0xAE36, - 0x8378: 0xAE39, - 0x8379: 0xAE3B, - 0x837A: 0xAE3C, - 0x8381: 0xAE3D, - 0x8382: 0xAE3E, - 0x8383: 0xAE3F, - 0x8384: 0xAE42, - 0x8385: 0xAE44, - 0x8386: 0xAE47, - 0x8387: 0xAE48, - 0x8388: 0xAE49, - 0x8389: 0xAE4B, - 0x838A: 0xAE4F, - 0x838B: 0xAE51, - 0x838C: 0xAE52, - 0x838D: 0xAE53, - 0x838E: 0xAE55, - 0x838F: 0xAE57, - 0x8390: 0xAE58, - 0x8391: 0xAE59, - 0x8392: 0xAE5A, - 0x8393: 0xAE5B, - 0x8394: 0xAE5E, - 0x8395: 0xAE62, - 0x8396: 0xAE63, - 0x8397: 0xAE64, - 0x8398: 0xAE66, - 0x8399: 0xAE67, - 0x839A: 0xAE6A, - 0x839B: 0xAE6B, - 0x839C: 0xAE6D, - 0x839D: 0xAE6E, - 0x839E: 0xAE6F, - 0x839F: 0xAE71, - 0x83A0: 0xAE72, - 0x83A1: 0xAE73, - 0x83A2: 0xAE74, - 0x83A3: 0xAE75, - 0x83A4: 0xAE76, - 0x83A5: 0xAE77, - 0x83A6: 0xAE7A, - 0x83A7: 0xAE7E, - 0x83A8: 0xAE7F, - 0x83A9: 0xAE80, - 0x83AA: 0xAE81, - 0x83AB: 0xAE82, - 0x83AC: 0xAE83, - 0x83AD: 0xAE86, - 0x83AE: 0xAE87, - 0x83AF: 0xAE88, - 0x83B0: 0xAE89, - 0x83B1: 0xAE8A, - 0x83B2: 0xAE8B, - 0x83B3: 0xAE8D, - 0x83B4: 0xAE8E, - 0x83B5: 0xAE8F, - 0x83B6: 0xAE90, - 0x83B7: 0xAE91, - 0x83B8: 0xAE92, - 0x83B9: 0xAE93, - 0x83BA: 0xAE94, - 0x83BB: 0xAE95, - 0x83BC: 0xAE96, - 0x83BD: 0xAE97, - 0x83BE: 0xAE98, - 0x83BF: 0xAE99, - 0x83C0: 0xAE9A, - 0x83C1: 0xAE9B, - 0x83C2: 0xAE9C, - 0x83C3: 0xAE9D, - 0x83C4: 0xAE9E, - 0x83C5: 0xAE9F, - 0x83C6: 0xAEA0, - 0x83C7: 0xAEA1, - 0x83C8: 0xAEA2, - 0x83C9: 0xAEA3, - 0x83CA: 0xAEA4, - 0x83CB: 0xAEA5, - 0x83CC: 0xAEA6, - 0x83CD: 0xAEA7, - 0x83CE: 0xAEA8, - 0x83CF: 0xAEA9, - 0x83D0: 0xAEAA, - 0x83D1: 0xAEAB, - 0x83D2: 0xAEAC, - 0x83D3: 0xAEAD, - 0x83D4: 0xAEAE, - 0x83D5: 0xAEAF, - 0x83D6: 0xAEB0, - 0x83D7: 0xAEB1, - 0x83D8: 0xAEB2, - 0x83D9: 0xAEB3, - 0x83DA: 0xAEB4, - 0x83DB: 0xAEB5, - 0x83DC: 0xAEB6, - 0x83DD: 0xAEB7, - 0x83DE: 0xAEB8, - 0x83DF: 0xAEB9, - 0x83E0: 0xAEBA, - 0x83E1: 0xAEBB, - 0x83E2: 0xAEBF, - 0x83E3: 0xAEC1, - 0x83E4: 0xAEC2, - 0x83E5: 0xAEC3, - 0x83E6: 0xAEC5, - 0x83E7: 0xAEC6, - 0x83E8: 0xAEC7, - 0x83E9: 0xAEC8, - 0x83EA: 0xAEC9, - 0x83EB: 0xAECA, - 0x83EC: 0xAECB, - 0x83ED: 0xAECE, - 0x83EE: 0xAED2, - 0x83EF: 0xAED3, - 0x83F0: 0xAED4, - 0x83F1: 0xAED5, - 0x83F2: 0xAED6, - 0x83F3: 0xAED7, - 0x83F4: 0xAEDA, - 0x83F5: 0xAEDB, - 0x83F6: 0xAEDD, - 0x83F7: 0xAEDE, - 0x83F8: 0xAEDF, - 0x83F9: 0xAEE0, - 0x83FA: 0xAEE1, - 0x83FB: 0xAEE2, - 0x83FC: 0xAEE3, - 0x83FD: 0xAEE4, - 0x83FE: 0xAEE5, - 0x8441: 0xAEE6, - 0x8442: 0xAEE7, - 0x8443: 0xAEE9, - 0x8444: 0xAEEA, - 0x8445: 0xAEEC, - 0x8446: 0xAEEE, - 0x8447: 0xAEEF, - 0x8448: 0xAEF0, - 0x8449: 0xAEF1, - 0x844A: 0xAEF2, - 0x844B: 0xAEF3, - 0x844C: 0xAEF5, - 0x844D: 0xAEF6, - 0x844E: 0xAEF7, - 0x844F: 0xAEF9, - 0x8450: 0xAEFA, - 0x8451: 0xAEFB, - 0x8452: 0xAEFD, - 0x8453: 0xAEFE, - 0x8454: 0xAEFF, - 0x8455: 0xAF00, - 0x8456: 0xAF01, - 0x8457: 0xAF02, - 0x8458: 0xAF03, - 0x8459: 0xAF04, - 0x845A: 0xAF05, - 0x8461: 0xAF06, - 0x8462: 0xAF09, - 0x8463: 0xAF0A, - 0x8464: 0xAF0B, - 0x8465: 0xAF0C, - 0x8466: 0xAF0E, - 0x8467: 0xAF0F, - 0x8468: 0xAF11, - 0x8469: 0xAF12, - 0x846A: 0xAF13, - 0x846B: 0xAF14, - 0x846C: 0xAF15, - 0x846D: 0xAF16, - 0x846E: 0xAF17, - 0x846F: 0xAF18, - 0x8470: 0xAF19, - 0x8471: 0xAF1A, - 0x8472: 0xAF1B, - 0x8473: 0xAF1C, - 0x8474: 0xAF1D, - 0x8475: 0xAF1E, - 0x8476: 0xAF1F, - 0x8477: 0xAF20, - 0x8478: 0xAF21, - 0x8479: 0xAF22, - 0x847A: 0xAF23, - 0x8481: 0xAF24, - 0x8482: 0xAF25, - 0x8483: 0xAF26, - 0x8484: 0xAF27, - 0x8485: 0xAF28, - 0x8486: 0xAF29, - 0x8487: 0xAF2A, - 0x8488: 0xAF2B, - 0x8489: 0xAF2E, - 0x848A: 0xAF2F, - 0x848B: 0xAF31, - 0x848C: 0xAF33, - 0x848D: 0xAF35, - 0x848E: 0xAF36, - 0x848F: 0xAF37, - 0x8490: 0xAF38, - 0x8491: 0xAF39, - 0x8492: 0xAF3A, - 0x8493: 0xAF3B, - 0x8494: 0xAF3E, - 0x8495: 0xAF40, - 0x8496: 0xAF44, - 0x8497: 0xAF45, - 0x8498: 0xAF46, - 0x8499: 0xAF47, - 0x849A: 0xAF4A, - 0x849B: 0xAF4B, - 0x849C: 0xAF4C, - 0x849D: 0xAF4D, - 0x849E: 0xAF4E, - 0x849F: 0xAF4F, - 0x84A0: 0xAF51, - 0x84A1: 0xAF52, - 0x84A2: 0xAF53, - 0x84A3: 0xAF54, - 0x84A4: 0xAF55, - 0x84A5: 0xAF56, - 0x84A6: 0xAF57, - 0x84A7: 0xAF58, - 0x84A8: 0xAF59, - 0x84A9: 0xAF5A, - 0x84AA: 0xAF5B, - 0x84AB: 0xAF5E, - 0x84AC: 0xAF5F, - 0x84AD: 0xAF60, - 0x84AE: 0xAF61, - 0x84AF: 0xAF62, - 0x84B0: 0xAF63, - 0x84B1: 0xAF66, - 0x84B2: 0xAF67, - 0x84B3: 0xAF68, - 0x84B4: 0xAF69, - 0x84B5: 0xAF6A, - 0x84B6: 0xAF6B, - 0x84B7: 0xAF6C, - 0x84B8: 0xAF6D, - 0x84B9: 0xAF6E, - 0x84BA: 0xAF6F, - 0x84BB: 0xAF70, - 0x84BC: 0xAF71, - 0x84BD: 0xAF72, - 0x84BE: 0xAF73, - 0x84BF: 0xAF74, - 0x84C0: 0xAF75, - 0x84C1: 0xAF76, - 0x84C2: 0xAF77, - 0x84C3: 0xAF78, - 0x84C4: 0xAF7A, - 0x84C5: 0xAF7B, - 0x84C6: 0xAF7C, - 0x84C7: 0xAF7D, - 0x84C8: 0xAF7E, - 0x84C9: 0xAF7F, - 0x84CA: 0xAF81, - 0x84CB: 0xAF82, - 0x84CC: 0xAF83, - 0x84CD: 0xAF85, - 0x84CE: 0xAF86, - 0x84CF: 0xAF87, - 0x84D0: 0xAF89, - 0x84D1: 0xAF8A, - 0x84D2: 0xAF8B, - 0x84D3: 0xAF8C, - 0x84D4: 0xAF8D, - 0x84D5: 0xAF8E, - 0x84D6: 0xAF8F, - 0x84D7: 0xAF92, - 0x84D8: 0xAF93, - 0x84D9: 0xAF94, - 0x84DA: 0xAF96, - 0x84DB: 0xAF97, - 0x84DC: 0xAF98, - 0x84DD: 0xAF99, - 0x84DE: 0xAF9A, - 0x84DF: 0xAF9B, - 0x84E0: 0xAF9D, - 0x84E1: 0xAF9E, - 0x84E2: 0xAF9F, - 0x84E3: 0xAFA0, - 0x84E4: 0xAFA1, - 0x84E5: 0xAFA2, - 0x84E6: 0xAFA3, - 0x84E7: 0xAFA4, - 0x84E8: 0xAFA5, - 0x84E9: 0xAFA6, - 0x84EA: 0xAFA7, - 0x84EB: 0xAFA8, - 0x84EC: 0xAFA9, - 0x84ED: 0xAFAA, - 0x84EE: 0xAFAB, - 0x84EF: 0xAFAC, - 0x84F0: 0xAFAD, - 0x84F1: 0xAFAE, - 0x84F2: 0xAFAF, - 0x84F3: 0xAFB0, - 0x84F4: 0xAFB1, - 0x84F5: 0xAFB2, - 0x84F6: 0xAFB3, - 0x84F7: 0xAFB4, - 0x84F8: 0xAFB5, - 0x84F9: 0xAFB6, - 0x84FA: 0xAFB7, - 0x84FB: 0xAFBA, - 0x84FC: 0xAFBB, - 0x84FD: 0xAFBD, - 0x84FE: 0xAFBE, - 0x8541: 0xAFBF, - 0x8542: 0xAFC1, - 0x8543: 0xAFC2, - 0x8544: 0xAFC3, - 0x8545: 0xAFC4, - 0x8546: 0xAFC5, - 0x8547: 0xAFC6, - 0x8548: 0xAFCA, - 0x8549: 0xAFCC, - 0x854A: 0xAFCF, - 0x854B: 0xAFD0, - 0x854C: 0xAFD1, - 0x854D: 0xAFD2, - 0x854E: 0xAFD3, - 0x854F: 0xAFD5, - 0x8550: 0xAFD6, - 0x8551: 0xAFD7, - 0x8552: 0xAFD8, - 0x8553: 0xAFD9, - 0x8554: 0xAFDA, - 0x8555: 0xAFDB, - 0x8556: 0xAFDD, - 0x8557: 0xAFDE, - 0x8558: 0xAFDF, - 0x8559: 0xAFE0, - 0x855A: 0xAFE1, - 0x8561: 0xAFE2, - 0x8562: 0xAFE3, - 0x8563: 0xAFE4, - 0x8564: 0xAFE5, - 0x8565: 0xAFE6, - 0x8566: 0xAFE7, - 0x8567: 0xAFEA, - 0x8568: 0xAFEB, - 0x8569: 0xAFEC, - 0x856A: 0xAFED, - 0x856B: 0xAFEE, - 0x856C: 0xAFEF, - 0x856D: 0xAFF2, - 0x856E: 0xAFF3, - 0x856F: 0xAFF5, - 0x8570: 0xAFF6, - 0x8571: 0xAFF7, - 0x8572: 0xAFF9, - 0x8573: 0xAFFA, - 0x8574: 0xAFFB, - 0x8575: 0xAFFC, - 0x8576: 0xAFFD, - 0x8577: 0xAFFE, - 0x8578: 0xAFFF, - 0x8579: 0xB002, - 0x857A: 0xB003, - 0x8581: 0xB005, - 0x8582: 0xB006, - 0x8583: 0xB007, - 0x8584: 0xB008, - 0x8585: 0xB009, - 0x8586: 0xB00A, - 0x8587: 0xB00B, - 0x8588: 0xB00D, - 0x8589: 0xB00E, - 0x858A: 0xB00F, - 0x858B: 0xB011, - 0x858C: 0xB012, - 0x858D: 0xB013, - 0x858E: 0xB015, - 0x858F: 0xB016, - 0x8590: 0xB017, - 0x8591: 0xB018, - 0x8592: 0xB019, - 0x8593: 0xB01A, - 0x8594: 0xB01B, - 0x8595: 0xB01E, - 0x8596: 0xB01F, - 0x8597: 0xB020, - 0x8598: 0xB021, - 0x8599: 0xB022, - 0x859A: 0xB023, - 0x859B: 0xB024, - 0x859C: 0xB025, - 0x859D: 0xB026, - 0x859E: 0xB027, - 0x859F: 0xB029, - 0x85A0: 0xB02A, - 0x85A1: 0xB02B, - 0x85A2: 0xB02C, - 0x85A3: 0xB02D, - 0x85A4: 0xB02E, - 0x85A5: 0xB02F, - 0x85A6: 0xB030, - 0x85A7: 0xB031, - 0x85A8: 0xB032, - 0x85A9: 0xB033, - 0x85AA: 0xB034, - 0x85AB: 0xB035, - 0x85AC: 0xB036, - 0x85AD: 0xB037, - 0x85AE: 0xB038, - 0x85AF: 0xB039, - 0x85B0: 0xB03A, - 0x85B1: 0xB03B, - 0x85B2: 0xB03C, - 0x85B3: 0xB03D, - 0x85B4: 0xB03E, - 0x85B5: 0xB03F, - 0x85B6: 0xB040, - 0x85B7: 0xB041, - 0x85B8: 0xB042, - 0x85B9: 0xB043, - 0x85BA: 0xB046, - 0x85BB: 0xB047, - 0x85BC: 0xB049, - 0x85BD: 0xB04B, - 0x85BE: 0xB04D, - 0x85BF: 0xB04F, - 0x85C0: 0xB050, - 0x85C1: 0xB051, - 0x85C2: 0xB052, - 0x85C3: 0xB056, - 0x85C4: 0xB058, - 0x85C5: 0xB05A, - 0x85C6: 0xB05B, - 0x85C7: 0xB05C, - 0x85C8: 0xB05E, - 0x85C9: 0xB05F, - 0x85CA: 0xB060, - 0x85CB: 0xB061, - 0x85CC: 0xB062, - 0x85CD: 0xB063, - 0x85CE: 0xB064, - 0x85CF: 0xB065, - 0x85D0: 0xB066, - 0x85D1: 0xB067, - 0x85D2: 0xB068, - 0x85D3: 0xB069, - 0x85D4: 0xB06A, - 0x85D5: 0xB06B, - 0x85D6: 0xB06C, - 0x85D7: 0xB06D, - 0x85D8: 0xB06E, - 0x85D9: 0xB06F, - 0x85DA: 0xB070, - 0x85DB: 0xB071, - 0x85DC: 0xB072, - 0x85DD: 0xB073, - 0x85DE: 0xB074, - 0x85DF: 0xB075, - 0x85E0: 0xB076, - 0x85E1: 0xB077, - 0x85E2: 0xB078, - 0x85E3: 0xB079, - 0x85E4: 0xB07A, - 0x85E5: 0xB07B, - 0x85E6: 0xB07E, - 0x85E7: 0xB07F, - 0x85E8: 0xB081, - 0x85E9: 0xB082, - 0x85EA: 0xB083, - 0x85EB: 0xB085, - 0x85EC: 0xB086, - 0x85ED: 0xB087, - 0x85EE: 0xB088, - 0x85EF: 0xB089, - 0x85F0: 0xB08A, - 0x85F1: 0xB08B, - 0x85F2: 0xB08E, - 0x85F3: 0xB090, - 0x85F4: 0xB092, - 0x85F5: 0xB093, - 0x85F6: 0xB094, - 0x85F7: 0xB095, - 0x85F8: 0xB096, - 0x85F9: 0xB097, - 0x85FA: 0xB09B, - 0x85FB: 0xB09D, - 0x85FC: 0xB09E, - 0x85FD: 0xB0A3, - 0x85FE: 0xB0A4, - 0x8641: 0xB0A5, - 0x8642: 0xB0A6, - 0x8643: 0xB0A7, - 0x8644: 0xB0AA, - 0x8645: 0xB0B0, - 0x8646: 0xB0B2, - 0x8647: 0xB0B6, - 0x8648: 0xB0B7, - 0x8649: 0xB0B9, - 0x864A: 0xB0BA, - 0x864B: 0xB0BB, - 0x864C: 0xB0BD, - 0x864D: 0xB0BE, - 0x864E: 0xB0BF, - 0x864F: 0xB0C0, - 0x8650: 0xB0C1, - 0x8651: 0xB0C2, - 0x8652: 0xB0C3, - 0x8653: 0xB0C6, - 0x8654: 0xB0CA, - 0x8655: 0xB0CB, - 0x8656: 0xB0CC, - 0x8657: 0xB0CD, - 0x8658: 0xB0CE, - 0x8659: 0xB0CF, - 0x865A: 0xB0D2, - 0x8661: 0xB0D3, - 0x8662: 0xB0D5, - 0x8663: 0xB0D6, - 0x8664: 0xB0D7, - 0x8665: 0xB0D9, - 0x8666: 0xB0DA, - 0x8667: 0xB0DB, - 0x8668: 0xB0DC, - 0x8669: 0xB0DD, - 0x866A: 0xB0DE, - 0x866B: 0xB0DF, - 0x866C: 0xB0E1, - 0x866D: 0xB0E2, - 0x866E: 0xB0E3, - 0x866F: 0xB0E4, - 0x8670: 0xB0E6, - 0x8671: 0xB0E7, - 0x8672: 0xB0E8, - 0x8673: 0xB0E9, - 0x8674: 0xB0EA, - 0x8675: 0xB0EB, - 0x8676: 0xB0EC, - 0x8677: 0xB0ED, - 0x8678: 0xB0EE, - 0x8679: 0xB0EF, - 0x867A: 0xB0F0, - 0x8681: 0xB0F1, - 0x8682: 0xB0F2, - 0x8683: 0xB0F3, - 0x8684: 0xB0F4, - 0x8685: 0xB0F5, - 0x8686: 0xB0F6, - 0x8687: 0xB0F7, - 0x8688: 0xB0F8, - 0x8689: 0xB0F9, - 0x868A: 0xB0FA, - 0x868B: 0xB0FB, - 0x868C: 0xB0FC, - 0x868D: 0xB0FD, - 0x868E: 0xB0FE, - 0x868F: 0xB0FF, - 0x8690: 0xB100, - 0x8691: 0xB101, - 0x8692: 0xB102, - 0x8693: 0xB103, - 0x8694: 0xB104, - 0x8695: 0xB105, - 0x8696: 0xB106, - 0x8697: 0xB107, - 0x8698: 0xB10A, - 0x8699: 0xB10D, - 0x869A: 0xB10E, - 0x869B: 0xB10F, - 0x869C: 0xB111, - 0x869D: 0xB114, - 0x869E: 0xB115, - 0x869F: 0xB116, - 0x86A0: 0xB117, - 0x86A1: 0xB11A, - 0x86A2: 0xB11E, - 0x86A3: 0xB11F, - 0x86A4: 0xB120, - 0x86A5: 0xB121, - 0x86A6: 0xB122, - 0x86A7: 0xB126, - 0x86A8: 0xB127, - 0x86A9: 0xB129, - 0x86AA: 0xB12A, - 0x86AB: 0xB12B, - 0x86AC: 0xB12D, - 0x86AD: 0xB12E, - 0x86AE: 0xB12F, - 0x86AF: 0xB130, - 0x86B0: 0xB131, - 0x86B1: 0xB132, - 0x86B2: 0xB133, - 0x86B3: 0xB136, - 0x86B4: 0xB13A, - 0x86B5: 0xB13B, - 0x86B6: 0xB13C, - 0x86B7: 0xB13D, - 0x86B8: 0xB13E, - 0x86B9: 0xB13F, - 0x86BA: 0xB142, - 0x86BB: 0xB143, - 0x86BC: 0xB145, - 0x86BD: 0xB146, - 0x86BE: 0xB147, - 0x86BF: 0xB149, - 0x86C0: 0xB14A, - 0x86C1: 0xB14B, - 0x86C2: 0xB14C, - 0x86C3: 0xB14D, - 0x86C4: 0xB14E, - 0x86C5: 0xB14F, - 0x86C6: 0xB152, - 0x86C7: 0xB153, - 0x86C8: 0xB156, - 0x86C9: 0xB157, - 0x86CA: 0xB159, - 0x86CB: 0xB15A, - 0x86CC: 0xB15B, - 0x86CD: 0xB15D, - 0x86CE: 0xB15E, - 0x86CF: 0xB15F, - 0x86D0: 0xB161, - 0x86D1: 0xB162, - 0x86D2: 0xB163, - 0x86D3: 0xB164, - 0x86D4: 0xB165, - 0x86D5: 0xB166, - 0x86D6: 0xB167, - 0x86D7: 0xB168, - 0x86D8: 0xB169, - 0x86D9: 0xB16A, - 0x86DA: 0xB16B, - 0x86DB: 0xB16C, - 0x86DC: 0xB16D, - 0x86DD: 0xB16E, - 0x86DE: 0xB16F, - 0x86DF: 0xB170, - 0x86E0: 0xB171, - 0x86E1: 0xB172, - 0x86E2: 0xB173, - 0x86E3: 0xB174, - 0x86E4: 0xB175, - 0x86E5: 0xB176, - 0x86E6: 0xB177, - 0x86E7: 0xB17A, - 0x86E8: 0xB17B, - 0x86E9: 0xB17D, - 0x86EA: 0xB17E, - 0x86EB: 0xB17F, - 0x86EC: 0xB181, - 0x86ED: 0xB183, - 0x86EE: 0xB184, - 0x86EF: 0xB185, - 0x86F0: 0xB186, - 0x86F1: 0xB187, - 0x86F2: 0xB18A, - 0x86F3: 0xB18C, - 0x86F4: 0xB18E, - 0x86F5: 0xB18F, - 0x86F6: 0xB190, - 0x86F7: 0xB191, - 0x86F8: 0xB195, - 0x86F9: 0xB196, - 0x86FA: 0xB197, - 0x86FB: 0xB199, - 0x86FC: 0xB19A, - 0x86FD: 0xB19B, - 0x86FE: 0xB19D, - 0x8741: 0xB19E, - 0x8742: 0xB19F, - 0x8743: 0xB1A0, - 0x8744: 0xB1A1, - 0x8745: 0xB1A2, - 0x8746: 0xB1A3, - 0x8747: 0xB1A4, - 0x8748: 0xB1A5, - 0x8749: 0xB1A6, - 0x874A: 0xB1A7, - 0x874B: 0xB1A9, - 0x874C: 0xB1AA, - 0x874D: 0xB1AB, - 0x874E: 0xB1AC, - 0x874F: 0xB1AD, - 0x8750: 0xB1AE, - 0x8751: 0xB1AF, - 0x8752: 0xB1B0, - 0x8753: 0xB1B1, - 0x8754: 0xB1B2, - 0x8755: 0xB1B3, - 0x8756: 0xB1B4, - 0x8757: 0xB1B5, - 0x8758: 0xB1B6, - 0x8759: 0xB1B7, - 0x875A: 0xB1B8, - 0x8761: 0xB1B9, - 0x8762: 0xB1BA, - 0x8763: 0xB1BB, - 0x8764: 0xB1BC, - 0x8765: 0xB1BD, - 0x8766: 0xB1BE, - 0x8767: 0xB1BF, - 0x8768: 0xB1C0, - 0x8769: 0xB1C1, - 0x876A: 0xB1C2, - 0x876B: 0xB1C3, - 0x876C: 0xB1C4, - 0x876D: 0xB1C5, - 0x876E: 0xB1C6, - 0x876F: 0xB1C7, - 0x8770: 0xB1C8, - 0x8771: 0xB1C9, - 0x8772: 0xB1CA, - 0x8773: 0xB1CB, - 0x8774: 0xB1CD, - 0x8775: 0xB1CE, - 0x8776: 0xB1CF, - 0x8777: 0xB1D1, - 0x8778: 0xB1D2, - 0x8779: 0xB1D3, - 0x877A: 0xB1D5, - 0x8781: 0xB1D6, - 0x8782: 0xB1D7, - 0x8783: 0xB1D8, - 0x8784: 0xB1D9, - 0x8785: 0xB1DA, - 0x8786: 0xB1DB, - 0x8787: 0xB1DE, - 0x8788: 0xB1E0, - 0x8789: 0xB1E1, - 0x878A: 0xB1E2, - 0x878B: 0xB1E3, - 0x878C: 0xB1E4, - 0x878D: 0xB1E5, - 0x878E: 0xB1E6, - 0x878F: 0xB1E7, - 0x8790: 0xB1EA, - 0x8791: 0xB1EB, - 0x8792: 0xB1ED, - 0x8793: 0xB1EE, - 0x8794: 0xB1EF, - 0x8795: 0xB1F1, - 0x8796: 0xB1F2, - 0x8797: 0xB1F3, - 0x8798: 0xB1F4, - 0x8799: 0xB1F5, - 0x879A: 0xB1F6, - 0x879B: 0xB1F7, - 0x879C: 0xB1F8, - 0x879D: 0xB1FA, - 0x879E: 0xB1FC, - 0x879F: 0xB1FE, - 0x87A0: 0xB1FF, - 0x87A1: 0xB200, - 0x87A2: 0xB201, - 0x87A3: 0xB202, - 0x87A4: 0xB203, - 0x87A5: 0xB206, - 0x87A6: 0xB207, - 0x87A7: 0xB209, - 0x87A8: 0xB20A, - 0x87A9: 0xB20D, - 0x87AA: 0xB20E, - 0x87AB: 0xB20F, - 0x87AC: 0xB210, - 0x87AD: 0xB211, - 0x87AE: 0xB212, - 0x87AF: 0xB213, - 0x87B0: 0xB216, - 0x87B1: 0xB218, - 0x87B2: 0xB21A, - 0x87B3: 0xB21B, - 0x87B4: 0xB21C, - 0x87B5: 0xB21D, - 0x87B6: 0xB21E, - 0x87B7: 0xB21F, - 0x87B8: 0xB221, - 0x87B9: 0xB222, - 0x87BA: 0xB223, - 0x87BB: 0xB224, - 0x87BC: 0xB225, - 0x87BD: 0xB226, - 0x87BE: 0xB227, - 0x87BF: 0xB228, - 0x87C0: 0xB229, - 0x87C1: 0xB22A, - 0x87C2: 0xB22B, - 0x87C3: 0xB22C, - 0x87C4: 0xB22D, - 0x87C5: 0xB22E, - 0x87C6: 0xB22F, - 0x87C7: 0xB230, - 0x87C8: 0xB231, - 0x87C9: 0xB232, - 0x87CA: 0xB233, - 0x87CB: 0xB235, - 0x87CC: 0xB236, - 0x87CD: 0xB237, - 0x87CE: 0xB238, - 0x87CF: 0xB239, - 0x87D0: 0xB23A, - 0x87D1: 0xB23B, - 0x87D2: 0xB23D, - 0x87D3: 0xB23E, - 0x87D4: 0xB23F, - 0x87D5: 0xB240, - 0x87D6: 0xB241, - 0x87D7: 0xB242, - 0x87D8: 0xB243, - 0x87D9: 0xB244, - 0x87DA: 0xB245, - 0x87DB: 0xB246, - 0x87DC: 0xB247, - 0x87DD: 0xB248, - 0x87DE: 0xB249, - 0x87DF: 0xB24A, - 0x87E0: 0xB24B, - 0x87E1: 0xB24C, - 0x87E2: 0xB24D, - 0x87E3: 0xB24E, - 0x87E4: 0xB24F, - 0x87E5: 0xB250, - 0x87E6: 0xB251, - 0x87E7: 0xB252, - 0x87E8: 0xB253, - 0x87E9: 0xB254, - 0x87EA: 0xB255, - 0x87EB: 0xB256, - 0x87EC: 0xB257, - 0x87ED: 0xB259, - 0x87EE: 0xB25A, - 0x87EF: 0xB25B, - 0x87F0: 0xB25D, - 0x87F1: 0xB25E, - 0x87F2: 0xB25F, - 0x87F3: 0xB261, - 0x87F4: 0xB262, - 0x87F5: 0xB263, - 0x87F6: 0xB264, - 0x87F7: 0xB265, - 0x87F8: 0xB266, - 0x87F9: 0xB267, - 0x87FA: 0xB26A, - 0x87FB: 0xB26B, - 0x87FC: 0xB26C, - 0x87FD: 0xB26D, - 0x87FE: 0xB26E, - 0x8841: 0xB26F, - 0x8842: 0xB270, - 0x8843: 0xB271, - 0x8844: 0xB272, - 0x8845: 0xB273, - 0x8846: 0xB276, - 0x8847: 0xB277, - 0x8848: 0xB278, - 0x8849: 0xB279, - 0x884A: 0xB27A, - 0x884B: 0xB27B, - 0x884C: 0xB27D, - 0x884D: 0xB27E, - 0x884E: 0xB27F, - 0x884F: 0xB280, - 0x8850: 0xB281, - 0x8851: 0xB282, - 0x8852: 0xB283, - 0x8853: 0xB286, - 0x8854: 0xB287, - 0x8855: 0xB288, - 0x8856: 0xB28A, - 0x8857: 0xB28B, - 0x8858: 0xB28C, - 0x8859: 0xB28D, - 0x885A: 0xB28E, - 0x8861: 0xB28F, - 0x8862: 0xB292, - 0x8863: 0xB293, - 0x8864: 0xB295, - 0x8865: 0xB296, - 0x8866: 0xB297, - 0x8867: 0xB29B, - 0x8868: 0xB29C, - 0x8869: 0xB29D, - 0x886A: 0xB29E, - 0x886B: 0xB29F, - 0x886C: 0xB2A2, - 0x886D: 0xB2A4, - 0x886E: 0xB2A7, - 0x886F: 0xB2A8, - 0x8870: 0xB2A9, - 0x8871: 0xB2AB, - 0x8872: 0xB2AD, - 0x8873: 0xB2AE, - 0x8874: 0xB2AF, - 0x8875: 0xB2B1, - 0x8876: 0xB2B2, - 0x8877: 0xB2B3, - 0x8878: 0xB2B5, - 0x8879: 0xB2B6, - 0x887A: 0xB2B7, - 0x8881: 0xB2B8, - 0x8882: 0xB2B9, - 0x8883: 0xB2BA, - 0x8884: 0xB2BB, - 0x8885: 0xB2BC, - 0x8886: 0xB2BD, - 0x8887: 0xB2BE, - 0x8888: 0xB2BF, - 0x8889: 0xB2C0, - 0x888A: 0xB2C1, - 0x888B: 0xB2C2, - 0x888C: 0xB2C3, - 0x888D: 0xB2C4, - 0x888E: 0xB2C5, - 0x888F: 0xB2C6, - 0x8890: 0xB2C7, - 0x8891: 0xB2CA, - 0x8892: 0xB2CB, - 0x8893: 0xB2CD, - 0x8894: 0xB2CE, - 0x8895: 0xB2CF, - 0x8896: 0xB2D1, - 0x8897: 0xB2D3, - 0x8898: 0xB2D4, - 0x8899: 0xB2D5, - 0x889A: 0xB2D6, - 0x889B: 0xB2D7, - 0x889C: 0xB2DA, - 0x889D: 0xB2DC, - 0x889E: 0xB2DE, - 0x889F: 0xB2DF, - 0x88A0: 0xB2E0, - 0x88A1: 0xB2E1, - 0x88A2: 0xB2E3, - 0x88A3: 0xB2E7, - 0x88A4: 0xB2E9, - 0x88A5: 0xB2EA, - 0x88A6: 0xB2F0, - 0x88A7: 0xB2F1, - 0x88A8: 0xB2F2, - 0x88A9: 0xB2F6, - 0x88AA: 0xB2FC, - 0x88AB: 0xB2FD, - 0x88AC: 0xB2FE, - 0x88AD: 0xB302, - 0x88AE: 0xB303, - 0x88AF: 0xB305, - 0x88B0: 0xB306, - 0x88B1: 0xB307, - 0x88B2: 0xB309, - 0x88B3: 0xB30A, - 0x88B4: 0xB30B, - 0x88B5: 0xB30C, - 0x88B6: 0xB30D, - 0x88B7: 0xB30E, - 0x88B8: 0xB30F, - 0x88B9: 0xB312, - 0x88BA: 0xB316, - 0x88BB: 0xB317, - 0x88BC: 0xB318, - 0x88BD: 0xB319, - 0x88BE: 0xB31A, - 0x88BF: 0xB31B, - 0x88C0: 0xB31D, - 0x88C1: 0xB31E, - 0x88C2: 0xB31F, - 0x88C3: 0xB320, - 0x88C4: 0xB321, - 0x88C5: 0xB322, - 0x88C6: 0xB323, - 0x88C7: 0xB324, - 0x88C8: 0xB325, - 0x88C9: 0xB326, - 0x88CA: 0xB327, - 0x88CB: 0xB328, - 0x88CC: 0xB329, - 0x88CD: 0xB32A, - 0x88CE: 0xB32B, - 0x88CF: 0xB32C, - 0x88D0: 0xB32D, - 0x88D1: 0xB32E, - 0x88D2: 0xB32F, - 0x88D3: 0xB330, - 0x88D4: 0xB331, - 0x88D5: 0xB332, - 0x88D6: 0xB333, - 0x88D7: 0xB334, - 0x88D8: 0xB335, - 0x88D9: 0xB336, - 0x88DA: 0xB337, - 0x88DB: 0xB338, - 0x88DC: 0xB339, - 0x88DD: 0xB33A, - 0x88DE: 0xB33B, - 0x88DF: 0xB33C, - 0x88E0: 0xB33D, - 0x88E1: 0xB33E, - 0x88E2: 0xB33F, - 0x88E3: 0xB340, - 0x88E4: 0xB341, - 0x88E5: 0xB342, - 0x88E6: 0xB343, - 0x88E7: 0xB344, - 0x88E8: 0xB345, - 0x88E9: 0xB346, - 0x88EA: 0xB347, - 0x88EB: 0xB348, - 0x88EC: 0xB349, - 0x88ED: 0xB34A, - 0x88EE: 0xB34B, - 0x88EF: 0xB34C, - 0x88F0: 0xB34D, - 0x88F1: 0xB34E, - 0x88F2: 0xB34F, - 0x88F3: 0xB350, - 0x88F4: 0xB351, - 0x88F5: 0xB352, - 0x88F6: 0xB353, - 0x88F7: 0xB357, - 0x88F8: 0xB359, - 0x88F9: 0xB35A, - 0x88FA: 0xB35D, - 0x88FB: 0xB360, - 0x88FC: 0xB361, - 0x88FD: 0xB362, - 0x88FE: 0xB363, - 0x8941: 0xB366, - 0x8942: 0xB368, - 0x8943: 0xB36A, - 0x8944: 0xB36C, - 0x8945: 0xB36D, - 0x8946: 0xB36F, - 0x8947: 0xB372, - 0x8948: 0xB373, - 0x8949: 0xB375, - 0x894A: 0xB376, - 0x894B: 0xB377, - 0x894C: 0xB379, - 0x894D: 0xB37A, - 0x894E: 0xB37B, - 0x894F: 0xB37C, - 0x8950: 0xB37D, - 0x8951: 0xB37E, - 0x8952: 0xB37F, - 0x8953: 0xB382, - 0x8954: 0xB386, - 0x8955: 0xB387, - 0x8956: 0xB388, - 0x8957: 0xB389, - 0x8958: 0xB38A, - 0x8959: 0xB38B, - 0x895A: 0xB38D, - 0x8961: 0xB38E, - 0x8962: 0xB38F, - 0x8963: 0xB391, - 0x8964: 0xB392, - 0x8965: 0xB393, - 0x8966: 0xB395, - 0x8967: 0xB396, - 0x8968: 0xB397, - 0x8969: 0xB398, - 0x896A: 0xB399, - 0x896B: 0xB39A, - 0x896C: 0xB39B, - 0x896D: 0xB39C, - 0x896E: 0xB39D, - 0x896F: 0xB39E, - 0x8970: 0xB39F, - 0x8971: 0xB3A2, - 0x8972: 0xB3A3, - 0x8973: 0xB3A4, - 0x8974: 0xB3A5, - 0x8975: 0xB3A6, - 0x8976: 0xB3A7, - 0x8977: 0xB3A9, - 0x8978: 0xB3AA, - 0x8979: 0xB3AB, - 0x897A: 0xB3AD, - 0x8981: 0xB3AE, - 0x8982: 0xB3AF, - 0x8983: 0xB3B0, - 0x8984: 0xB3B1, - 0x8985: 0xB3B2, - 0x8986: 0xB3B3, - 0x8987: 0xB3B4, - 0x8988: 0xB3B5, - 0x8989: 0xB3B6, - 0x898A: 0xB3B7, - 0x898B: 0xB3B8, - 0x898C: 0xB3B9, - 0x898D: 0xB3BA, - 0x898E: 0xB3BB, - 0x898F: 0xB3BC, - 0x8990: 0xB3BD, - 0x8991: 0xB3BE, - 0x8992: 0xB3BF, - 0x8993: 0xB3C0, - 0x8994: 0xB3C1, - 0x8995: 0xB3C2, - 0x8996: 0xB3C3, - 0x8997: 0xB3C6, - 0x8998: 0xB3C7, - 0x8999: 0xB3C9, - 0x899A: 0xB3CA, - 0x899B: 0xB3CD, - 0x899C: 0xB3CF, - 0x899D: 0xB3D1, - 0x899E: 0xB3D2, - 0x899F: 0xB3D3, - 0x89A0: 0xB3D6, - 0x89A1: 0xB3D8, - 0x89A2: 0xB3DA, - 0x89A3: 0xB3DC, - 0x89A4: 0xB3DE, - 0x89A5: 0xB3DF, - 0x89A6: 0xB3E1, - 0x89A7: 0xB3E2, - 0x89A8: 0xB3E3, - 0x89A9: 0xB3E5, - 0x89AA: 0xB3E6, - 0x89AB: 0xB3E7, - 0x89AC: 0xB3E9, - 0x89AD: 0xB3EA, - 0x89AE: 0xB3EB, - 0x89AF: 0xB3EC, - 0x89B0: 0xB3ED, - 0x89B1: 0xB3EE, - 0x89B2: 0xB3EF, - 0x89B3: 0xB3F0, - 0x89B4: 0xB3F1, - 0x89B5: 0xB3F2, - 0x89B6: 0xB3F3, - 0x89B7: 0xB3F4, - 0x89B8: 0xB3F5, - 0x89B9: 0xB3F6, - 0x89BA: 0xB3F7, - 0x89BB: 0xB3F8, - 0x89BC: 0xB3F9, - 0x89BD: 0xB3FA, - 0x89BE: 0xB3FB, - 0x89BF: 0xB3FD, - 0x89C0: 0xB3FE, - 0x89C1: 0xB3FF, - 0x89C2: 0xB400, - 0x89C3: 0xB401, - 0x89C4: 0xB402, - 0x89C5: 0xB403, - 0x89C6: 0xB404, - 0x89C7: 0xB405, - 0x89C8: 0xB406, - 0x89C9: 0xB407, - 0x89CA: 0xB408, - 0x89CB: 0xB409, - 0x89CC: 0xB40A, - 0x89CD: 0xB40B, - 0x89CE: 0xB40C, - 0x89CF: 0xB40D, - 0x89D0: 0xB40E, - 0x89D1: 0xB40F, - 0x89D2: 0xB411, - 0x89D3: 0xB412, - 0x89D4: 0xB413, - 0x89D5: 0xB414, - 0x89D6: 0xB415, - 0x89D7: 0xB416, - 0x89D8: 0xB417, - 0x89D9: 0xB419, - 0x89DA: 0xB41A, - 0x89DB: 0xB41B, - 0x89DC: 0xB41D, - 0x89DD: 0xB41E, - 0x89DE: 0xB41F, - 0x89DF: 0xB421, - 0x89E0: 0xB422, - 0x89E1: 0xB423, - 0x89E2: 0xB424, - 0x89E3: 0xB425, - 0x89E4: 0xB426, - 0x89E5: 0xB427, - 0x89E6: 0xB42A, - 0x89E7: 0xB42C, - 0x89E8: 0xB42D, - 0x89E9: 0xB42E, - 0x89EA: 0xB42F, - 0x89EB: 0xB430, - 0x89EC: 0xB431, - 0x89ED: 0xB432, - 0x89EE: 0xB433, - 0x89EF: 0xB435, - 0x89F0: 0xB436, - 0x89F1: 0xB437, - 0x89F2: 0xB438, - 0x89F3: 0xB439, - 0x89F4: 0xB43A, - 0x89F5: 0xB43B, - 0x89F6: 0xB43C, - 0x89F7: 0xB43D, - 0x89F8: 0xB43E, - 0x89F9: 0xB43F, - 0x89FA: 0xB440, - 0x89FB: 0xB441, - 0x89FC: 0xB442, - 0x89FD: 0xB443, - 0x89FE: 0xB444, - 0x8A41: 0xB445, - 0x8A42: 0xB446, - 0x8A43: 0xB447, - 0x8A44: 0xB448, - 0x8A45: 0xB449, - 0x8A46: 0xB44A, - 0x8A47: 0xB44B, - 0x8A48: 0xB44C, - 0x8A49: 0xB44D, - 0x8A4A: 0xB44E, - 0x8A4B: 0xB44F, - 0x8A4C: 0xB452, - 0x8A4D: 0xB453, - 0x8A4E: 0xB455, - 0x8A4F: 0xB456, - 0x8A50: 0xB457, - 0x8A51: 0xB459, - 0x8A52: 0xB45A, - 0x8A53: 0xB45B, - 0x8A54: 0xB45C, - 0x8A55: 0xB45D, - 0x8A56: 0xB45E, - 0x8A57: 0xB45F, - 0x8A58: 0xB462, - 0x8A59: 0xB464, - 0x8A5A: 0xB466, - 0x8A61: 0xB467, - 0x8A62: 0xB468, - 0x8A63: 0xB469, - 0x8A64: 0xB46A, - 0x8A65: 0xB46B, - 0x8A66: 0xB46D, - 0x8A67: 0xB46E, - 0x8A68: 0xB46F, - 0x8A69: 0xB470, - 0x8A6A: 0xB471, - 0x8A6B: 0xB472, - 0x8A6C: 0xB473, - 0x8A6D: 0xB474, - 0x8A6E: 0xB475, - 0x8A6F: 0xB476, - 0x8A70: 0xB477, - 0x8A71: 0xB478, - 0x8A72: 0xB479, - 0x8A73: 0xB47A, - 0x8A74: 0xB47B, - 0x8A75: 0xB47C, - 0x8A76: 0xB47D, - 0x8A77: 0xB47E, - 0x8A78: 0xB47F, - 0x8A79: 0xB481, - 0x8A7A: 0xB482, - 0x8A81: 0xB483, - 0x8A82: 0xB484, - 0x8A83: 0xB485, - 0x8A84: 0xB486, - 0x8A85: 0xB487, - 0x8A86: 0xB489, - 0x8A87: 0xB48A, - 0x8A88: 0xB48B, - 0x8A89: 0xB48C, - 0x8A8A: 0xB48D, - 0x8A8B: 0xB48E, - 0x8A8C: 0xB48F, - 0x8A8D: 0xB490, - 0x8A8E: 0xB491, - 0x8A8F: 0xB492, - 0x8A90: 0xB493, - 0x8A91: 0xB494, - 0x8A92: 0xB495, - 0x8A93: 0xB496, - 0x8A94: 0xB497, - 0x8A95: 0xB498, - 0x8A96: 0xB499, - 0x8A97: 0xB49A, - 0x8A98: 0xB49B, - 0x8A99: 0xB49C, - 0x8A9A: 0xB49E, - 0x8A9B: 0xB49F, - 0x8A9C: 0xB4A0, - 0x8A9D: 0xB4A1, - 0x8A9E: 0xB4A2, - 0x8A9F: 0xB4A3, - 0x8AA0: 0xB4A5, - 0x8AA1: 0xB4A6, - 0x8AA2: 0xB4A7, - 0x8AA3: 0xB4A9, - 0x8AA4: 0xB4AA, - 0x8AA5: 0xB4AB, - 0x8AA6: 0xB4AD, - 0x8AA7: 0xB4AE, - 0x8AA8: 0xB4AF, - 0x8AA9: 0xB4B0, - 0x8AAA: 0xB4B1, - 0x8AAB: 0xB4B2, - 0x8AAC: 0xB4B3, - 0x8AAD: 0xB4B4, - 0x8AAE: 0xB4B6, - 0x8AAF: 0xB4B8, - 0x8AB0: 0xB4BA, - 0x8AB1: 0xB4BB, - 0x8AB2: 0xB4BC, - 0x8AB3: 0xB4BD, - 0x8AB4: 0xB4BE, - 0x8AB5: 0xB4BF, - 0x8AB6: 0xB4C1, - 0x8AB7: 0xB4C2, - 0x8AB8: 0xB4C3, - 0x8AB9: 0xB4C5, - 0x8ABA: 0xB4C6, - 0x8ABB: 0xB4C7, - 0x8ABC: 0xB4C9, - 0x8ABD: 0xB4CA, - 0x8ABE: 0xB4CB, - 0x8ABF: 0xB4CC, - 0x8AC0: 0xB4CD, - 0x8AC1: 0xB4CE, - 0x8AC2: 0xB4CF, - 0x8AC3: 0xB4D1, - 0x8AC4: 0xB4D2, - 0x8AC5: 0xB4D3, - 0x8AC6: 0xB4D4, - 0x8AC7: 0xB4D6, - 0x8AC8: 0xB4D7, - 0x8AC9: 0xB4D8, - 0x8ACA: 0xB4D9, - 0x8ACB: 0xB4DA, - 0x8ACC: 0xB4DB, - 0x8ACD: 0xB4DE, - 0x8ACE: 0xB4DF, - 0x8ACF: 0xB4E1, - 0x8AD0: 0xB4E2, - 0x8AD1: 0xB4E5, - 0x8AD2: 0xB4E7, - 0x8AD3: 0xB4E8, - 0x8AD4: 0xB4E9, - 0x8AD5: 0xB4EA, - 0x8AD6: 0xB4EB, - 0x8AD7: 0xB4EE, - 0x8AD8: 0xB4F0, - 0x8AD9: 0xB4F2, - 0x8ADA: 0xB4F3, - 0x8ADB: 0xB4F4, - 0x8ADC: 0xB4F5, - 0x8ADD: 0xB4F6, - 0x8ADE: 0xB4F7, - 0x8ADF: 0xB4F9, - 0x8AE0: 0xB4FA, - 0x8AE1: 0xB4FB, - 0x8AE2: 0xB4FC, - 0x8AE3: 0xB4FD, - 0x8AE4: 0xB4FE, - 0x8AE5: 0xB4FF, - 0x8AE6: 0xB500, - 0x8AE7: 0xB501, - 0x8AE8: 0xB502, - 0x8AE9: 0xB503, - 0x8AEA: 0xB504, - 0x8AEB: 0xB505, - 0x8AEC: 0xB506, - 0x8AED: 0xB507, - 0x8AEE: 0xB508, - 0x8AEF: 0xB509, - 0x8AF0: 0xB50A, - 0x8AF1: 0xB50B, - 0x8AF2: 0xB50C, - 0x8AF3: 0xB50D, - 0x8AF4: 0xB50E, - 0x8AF5: 0xB50F, - 0x8AF6: 0xB510, - 0x8AF7: 0xB511, - 0x8AF8: 0xB512, - 0x8AF9: 0xB513, - 0x8AFA: 0xB516, - 0x8AFB: 0xB517, - 0x8AFC: 0xB519, - 0x8AFD: 0xB51A, - 0x8AFE: 0xB51D, - 0x8B41: 0xB51E, - 0x8B42: 0xB51F, - 0x8B43: 0xB520, - 0x8B44: 0xB521, - 0x8B45: 0xB522, - 0x8B46: 0xB523, - 0x8B47: 0xB526, - 0x8B48: 0xB52B, - 0x8B49: 0xB52C, - 0x8B4A: 0xB52D, - 0x8B4B: 0xB52E, - 0x8B4C: 0xB52F, - 0x8B4D: 0xB532, - 0x8B4E: 0xB533, - 0x8B4F: 0xB535, - 0x8B50: 0xB536, - 0x8B51: 0xB537, - 0x8B52: 0xB539, - 0x8B53: 0xB53A, - 0x8B54: 0xB53B, - 0x8B55: 0xB53C, - 0x8B56: 0xB53D, - 0x8B57: 0xB53E, - 0x8B58: 0xB53F, - 0x8B59: 0xB542, - 0x8B5A: 0xB546, - 0x8B61: 0xB547, - 0x8B62: 0xB548, - 0x8B63: 0xB549, - 0x8B64: 0xB54A, - 0x8B65: 0xB54E, - 0x8B66: 0xB54F, - 0x8B67: 0xB551, - 0x8B68: 0xB552, - 0x8B69: 0xB553, - 0x8B6A: 0xB555, - 0x8B6B: 0xB556, - 0x8B6C: 0xB557, - 0x8B6D: 0xB558, - 0x8B6E: 0xB559, - 0x8B6F: 0xB55A, - 0x8B70: 0xB55B, - 0x8B71: 0xB55E, - 0x8B72: 0xB562, - 0x8B73: 0xB563, - 0x8B74: 0xB564, - 0x8B75: 0xB565, - 0x8B76: 0xB566, - 0x8B77: 0xB567, - 0x8B78: 0xB568, - 0x8B79: 0xB569, - 0x8B7A: 0xB56A, - 0x8B81: 0xB56B, - 0x8B82: 0xB56C, - 0x8B83: 0xB56D, - 0x8B84: 0xB56E, - 0x8B85: 0xB56F, - 0x8B86: 0xB570, - 0x8B87: 0xB571, - 0x8B88: 0xB572, - 0x8B89: 0xB573, - 0x8B8A: 0xB574, - 0x8B8B: 0xB575, - 0x8B8C: 0xB576, - 0x8B8D: 0xB577, - 0x8B8E: 0xB578, - 0x8B8F: 0xB579, - 0x8B90: 0xB57A, - 0x8B91: 0xB57B, - 0x8B92: 0xB57C, - 0x8B93: 0xB57D, - 0x8B94: 0xB57E, - 0x8B95: 0xB57F, - 0x8B96: 0xB580, - 0x8B97: 0xB581, - 0x8B98: 0xB582, - 0x8B99: 0xB583, - 0x8B9A: 0xB584, - 0x8B9B: 0xB585, - 0x8B9C: 0xB586, - 0x8B9D: 0xB587, - 0x8B9E: 0xB588, - 0x8B9F: 0xB589, - 0x8BA0: 0xB58A, - 0x8BA1: 0xB58B, - 0x8BA2: 0xB58C, - 0x8BA3: 0xB58D, - 0x8BA4: 0xB58E, - 0x8BA5: 0xB58F, - 0x8BA6: 0xB590, - 0x8BA7: 0xB591, - 0x8BA8: 0xB592, - 0x8BA9: 0xB593, - 0x8BAA: 0xB594, - 0x8BAB: 0xB595, - 0x8BAC: 0xB596, - 0x8BAD: 0xB597, - 0x8BAE: 0xB598, - 0x8BAF: 0xB599, - 0x8BB0: 0xB59A, - 0x8BB1: 0xB59B, - 0x8BB2: 0xB59C, - 0x8BB3: 0xB59D, - 0x8BB4: 0xB59E, - 0x8BB5: 0xB59F, - 0x8BB6: 0xB5A2, - 0x8BB7: 0xB5A3, - 0x8BB8: 0xB5A5, - 0x8BB9: 0xB5A6, - 0x8BBA: 0xB5A7, - 0x8BBB: 0xB5A9, - 0x8BBC: 0xB5AC, - 0x8BBD: 0xB5AD, - 0x8BBE: 0xB5AE, - 0x8BBF: 0xB5AF, - 0x8BC0: 0xB5B2, - 0x8BC1: 0xB5B6, - 0x8BC2: 0xB5B7, - 0x8BC3: 0xB5B8, - 0x8BC4: 0xB5B9, - 0x8BC5: 0xB5BA, - 0x8BC6: 0xB5BE, - 0x8BC7: 0xB5BF, - 0x8BC8: 0xB5C1, - 0x8BC9: 0xB5C2, - 0x8BCA: 0xB5C3, - 0x8BCB: 0xB5C5, - 0x8BCC: 0xB5C6, - 0x8BCD: 0xB5C7, - 0x8BCE: 0xB5C8, - 0x8BCF: 0xB5C9, - 0x8BD0: 0xB5CA, - 0x8BD1: 0xB5CB, - 0x8BD2: 0xB5CE, - 0x8BD3: 0xB5D2, - 0x8BD4: 0xB5D3, - 0x8BD5: 0xB5D4, - 0x8BD6: 0xB5D5, - 0x8BD7: 0xB5D6, - 0x8BD8: 0xB5D7, - 0x8BD9: 0xB5D9, - 0x8BDA: 0xB5DA, - 0x8BDB: 0xB5DB, - 0x8BDC: 0xB5DC, - 0x8BDD: 0xB5DD, - 0x8BDE: 0xB5DE, - 0x8BDF: 0xB5DF, - 0x8BE0: 0xB5E0, - 0x8BE1: 0xB5E1, - 0x8BE2: 0xB5E2, - 0x8BE3: 0xB5E3, - 0x8BE4: 0xB5E4, - 0x8BE5: 0xB5E5, - 0x8BE6: 0xB5E6, - 0x8BE7: 0xB5E7, - 0x8BE8: 0xB5E8, - 0x8BE9: 0xB5E9, - 0x8BEA: 0xB5EA, - 0x8BEB: 0xB5EB, - 0x8BEC: 0xB5ED, - 0x8BED: 0xB5EE, - 0x8BEE: 0xB5EF, - 0x8BEF: 0xB5F0, - 0x8BF0: 0xB5F1, - 0x8BF1: 0xB5F2, - 0x8BF2: 0xB5F3, - 0x8BF3: 0xB5F4, - 0x8BF4: 0xB5F5, - 0x8BF5: 0xB5F6, - 0x8BF6: 0xB5F7, - 0x8BF7: 0xB5F8, - 0x8BF8: 0xB5F9, - 0x8BF9: 0xB5FA, - 0x8BFA: 0xB5FB, - 0x8BFB: 0xB5FC, - 0x8BFC: 0xB5FD, - 0x8BFD: 0xB5FE, - 0x8BFE: 0xB5FF, - 0x8C41: 0xB600, - 0x8C42: 0xB601, - 0x8C43: 0xB602, - 0x8C44: 0xB603, - 0x8C45: 0xB604, - 0x8C46: 0xB605, - 0x8C47: 0xB606, - 0x8C48: 0xB607, - 0x8C49: 0xB608, - 0x8C4A: 0xB609, - 0x8C4B: 0xB60A, - 0x8C4C: 0xB60B, - 0x8C4D: 0xB60C, - 0x8C4E: 0xB60D, - 0x8C4F: 0xB60E, - 0x8C50: 0xB60F, - 0x8C51: 0xB612, - 0x8C52: 0xB613, - 0x8C53: 0xB615, - 0x8C54: 0xB616, - 0x8C55: 0xB617, - 0x8C56: 0xB619, - 0x8C57: 0xB61A, - 0x8C58: 0xB61B, - 0x8C59: 0xB61C, - 0x8C5A: 0xB61D, - 0x8C61: 0xB61E, - 0x8C62: 0xB61F, - 0x8C63: 0xB620, - 0x8C64: 0xB621, - 0x8C65: 0xB622, - 0x8C66: 0xB623, - 0x8C67: 0xB624, - 0x8C68: 0xB626, - 0x8C69: 0xB627, - 0x8C6A: 0xB628, - 0x8C6B: 0xB629, - 0x8C6C: 0xB62A, - 0x8C6D: 0xB62B, - 0x8C6E: 0xB62D, - 0x8C6F: 0xB62E, - 0x8C70: 0xB62F, - 0x8C71: 0xB630, - 0x8C72: 0xB631, - 0x8C73: 0xB632, - 0x8C74: 0xB633, - 0x8C75: 0xB635, - 0x8C76: 0xB636, - 0x8C77: 0xB637, - 0x8C78: 0xB638, - 0x8C79: 0xB639, - 0x8C7A: 0xB63A, - 0x8C81: 0xB63B, - 0x8C82: 0xB63C, - 0x8C83: 0xB63D, - 0x8C84: 0xB63E, - 0x8C85: 0xB63F, - 0x8C86: 0xB640, - 0x8C87: 0xB641, - 0x8C88: 0xB642, - 0x8C89: 0xB643, - 0x8C8A: 0xB644, - 0x8C8B: 0xB645, - 0x8C8C: 0xB646, - 0x8C8D: 0xB647, - 0x8C8E: 0xB649, - 0x8C8F: 0xB64A, - 0x8C90: 0xB64B, - 0x8C91: 0xB64C, - 0x8C92: 0xB64D, - 0x8C93: 0xB64E, - 0x8C94: 0xB64F, - 0x8C95: 0xB650, - 0x8C96: 0xB651, - 0x8C97: 0xB652, - 0x8C98: 0xB653, - 0x8C99: 0xB654, - 0x8C9A: 0xB655, - 0x8C9B: 0xB656, - 0x8C9C: 0xB657, - 0x8C9D: 0xB658, - 0x8C9E: 0xB659, - 0x8C9F: 0xB65A, - 0x8CA0: 0xB65B, - 0x8CA1: 0xB65C, - 0x8CA2: 0xB65D, - 0x8CA3: 0xB65E, - 0x8CA4: 0xB65F, - 0x8CA5: 0xB660, - 0x8CA6: 0xB661, - 0x8CA7: 0xB662, - 0x8CA8: 0xB663, - 0x8CA9: 0xB665, - 0x8CAA: 0xB666, - 0x8CAB: 0xB667, - 0x8CAC: 0xB669, - 0x8CAD: 0xB66A, - 0x8CAE: 0xB66B, - 0x8CAF: 0xB66C, - 0x8CB0: 0xB66D, - 0x8CB1: 0xB66E, - 0x8CB2: 0xB66F, - 0x8CB3: 0xB670, - 0x8CB4: 0xB671, - 0x8CB5: 0xB672, - 0x8CB6: 0xB673, - 0x8CB7: 0xB674, - 0x8CB8: 0xB675, - 0x8CB9: 0xB676, - 0x8CBA: 0xB677, - 0x8CBB: 0xB678, - 0x8CBC: 0xB679, - 0x8CBD: 0xB67A, - 0x8CBE: 0xB67B, - 0x8CBF: 0xB67C, - 0x8CC0: 0xB67D, - 0x8CC1: 0xB67E, - 0x8CC2: 0xB67F, - 0x8CC3: 0xB680, - 0x8CC4: 0xB681, - 0x8CC5: 0xB682, - 0x8CC6: 0xB683, - 0x8CC7: 0xB684, - 0x8CC8: 0xB685, - 0x8CC9: 0xB686, - 0x8CCA: 0xB687, - 0x8CCB: 0xB688, - 0x8CCC: 0xB689, - 0x8CCD: 0xB68A, - 0x8CCE: 0xB68B, - 0x8CCF: 0xB68C, - 0x8CD0: 0xB68D, - 0x8CD1: 0xB68E, - 0x8CD2: 0xB68F, - 0x8CD3: 0xB690, - 0x8CD4: 0xB691, - 0x8CD5: 0xB692, - 0x8CD6: 0xB693, - 0x8CD7: 0xB694, - 0x8CD8: 0xB695, - 0x8CD9: 0xB696, - 0x8CDA: 0xB697, - 0x8CDB: 0xB698, - 0x8CDC: 0xB699, - 0x8CDD: 0xB69A, - 0x8CDE: 0xB69B, - 0x8CDF: 0xB69E, - 0x8CE0: 0xB69F, - 0x8CE1: 0xB6A1, - 0x8CE2: 0xB6A2, - 0x8CE3: 0xB6A3, - 0x8CE4: 0xB6A5, - 0x8CE5: 0xB6A6, - 0x8CE6: 0xB6A7, - 0x8CE7: 0xB6A8, - 0x8CE8: 0xB6A9, - 0x8CE9: 0xB6AA, - 0x8CEA: 0xB6AD, - 0x8CEB: 0xB6AE, - 0x8CEC: 0xB6AF, - 0x8CED: 0xB6B0, - 0x8CEE: 0xB6B2, - 0x8CEF: 0xB6B3, - 0x8CF0: 0xB6B4, - 0x8CF1: 0xB6B5, - 0x8CF2: 0xB6B6, - 0x8CF3: 0xB6B7, - 0x8CF4: 0xB6B8, - 0x8CF5: 0xB6B9, - 0x8CF6: 0xB6BA, - 0x8CF7: 0xB6BB, - 0x8CF8: 0xB6BC, - 0x8CF9: 0xB6BD, - 0x8CFA: 0xB6BE, - 0x8CFB: 0xB6BF, - 0x8CFC: 0xB6C0, - 0x8CFD: 0xB6C1, - 0x8CFE: 0xB6C2, - 0x8D41: 0xB6C3, - 0x8D42: 0xB6C4, - 0x8D43: 0xB6C5, - 0x8D44: 0xB6C6, - 0x8D45: 0xB6C7, - 0x8D46: 0xB6C8, - 0x8D47: 0xB6C9, - 0x8D48: 0xB6CA, - 0x8D49: 0xB6CB, - 0x8D4A: 0xB6CC, - 0x8D4B: 0xB6CD, - 0x8D4C: 0xB6CE, - 0x8D4D: 0xB6CF, - 0x8D4E: 0xB6D0, - 0x8D4F: 0xB6D1, - 0x8D50: 0xB6D2, - 0x8D51: 0xB6D3, - 0x8D52: 0xB6D5, - 0x8D53: 0xB6D6, - 0x8D54: 0xB6D7, - 0x8D55: 0xB6D8, - 0x8D56: 0xB6D9, - 0x8D57: 0xB6DA, - 0x8D58: 0xB6DB, - 0x8D59: 0xB6DC, - 0x8D5A: 0xB6DD, - 0x8D61: 0xB6DE, - 0x8D62: 0xB6DF, - 0x8D63: 0xB6E0, - 0x8D64: 0xB6E1, - 0x8D65: 0xB6E2, - 0x8D66: 0xB6E3, - 0x8D67: 0xB6E4, - 0x8D68: 0xB6E5, - 0x8D69: 0xB6E6, - 0x8D6A: 0xB6E7, - 0x8D6B: 0xB6E8, - 0x8D6C: 0xB6E9, - 0x8D6D: 0xB6EA, - 0x8D6E: 0xB6EB, - 0x8D6F: 0xB6EC, - 0x8D70: 0xB6ED, - 0x8D71: 0xB6EE, - 0x8D72: 0xB6EF, - 0x8D73: 0xB6F1, - 0x8D74: 0xB6F2, - 0x8D75: 0xB6F3, - 0x8D76: 0xB6F5, - 0x8D77: 0xB6F6, - 0x8D78: 0xB6F7, - 0x8D79: 0xB6F9, - 0x8D7A: 0xB6FA, - 0x8D81: 0xB6FB, - 0x8D82: 0xB6FC, - 0x8D83: 0xB6FD, - 0x8D84: 0xB6FE, - 0x8D85: 0xB6FF, - 0x8D86: 0xB702, - 0x8D87: 0xB703, - 0x8D88: 0xB704, - 0x8D89: 0xB706, - 0x8D8A: 0xB707, - 0x8D8B: 0xB708, - 0x8D8C: 0xB709, - 0x8D8D: 0xB70A, - 0x8D8E: 0xB70B, - 0x8D8F: 0xB70C, - 0x8D90: 0xB70D, - 0x8D91: 0xB70E, - 0x8D92: 0xB70F, - 0x8D93: 0xB710, - 0x8D94: 0xB711, - 0x8D95: 0xB712, - 0x8D96: 0xB713, - 0x8D97: 0xB714, - 0x8D98: 0xB715, - 0x8D99: 0xB716, - 0x8D9A: 0xB717, - 0x8D9B: 0xB718, - 0x8D9C: 0xB719, - 0x8D9D: 0xB71A, - 0x8D9E: 0xB71B, - 0x8D9F: 0xB71C, - 0x8DA0: 0xB71D, - 0x8DA1: 0xB71E, - 0x8DA2: 0xB71F, - 0x8DA3: 0xB720, - 0x8DA4: 0xB721, - 0x8DA5: 0xB722, - 0x8DA6: 0xB723, - 0x8DA7: 0xB724, - 0x8DA8: 0xB725, - 0x8DA9: 0xB726, - 0x8DAA: 0xB727, - 0x8DAB: 0xB72A, - 0x8DAC: 0xB72B, - 0x8DAD: 0xB72D, - 0x8DAE: 0xB72E, - 0x8DAF: 0xB731, - 0x8DB0: 0xB732, - 0x8DB1: 0xB733, - 0x8DB2: 0xB734, - 0x8DB3: 0xB735, - 0x8DB4: 0xB736, - 0x8DB5: 0xB737, - 0x8DB6: 0xB73A, - 0x8DB7: 0xB73C, - 0x8DB8: 0xB73D, - 0x8DB9: 0xB73E, - 0x8DBA: 0xB73F, - 0x8DBB: 0xB740, - 0x8DBC: 0xB741, - 0x8DBD: 0xB742, - 0x8DBE: 0xB743, - 0x8DBF: 0xB745, - 0x8DC0: 0xB746, - 0x8DC1: 0xB747, - 0x8DC2: 0xB749, - 0x8DC3: 0xB74A, - 0x8DC4: 0xB74B, - 0x8DC5: 0xB74D, - 0x8DC6: 0xB74E, - 0x8DC7: 0xB74F, - 0x8DC8: 0xB750, - 0x8DC9: 0xB751, - 0x8DCA: 0xB752, - 0x8DCB: 0xB753, - 0x8DCC: 0xB756, - 0x8DCD: 0xB757, - 0x8DCE: 0xB758, - 0x8DCF: 0xB759, - 0x8DD0: 0xB75A, - 0x8DD1: 0xB75B, - 0x8DD2: 0xB75C, - 0x8DD3: 0xB75D, - 0x8DD4: 0xB75E, - 0x8DD5: 0xB75F, - 0x8DD6: 0xB761, - 0x8DD7: 0xB762, - 0x8DD8: 0xB763, - 0x8DD9: 0xB765, - 0x8DDA: 0xB766, - 0x8DDB: 0xB767, - 0x8DDC: 0xB769, - 0x8DDD: 0xB76A, - 0x8DDE: 0xB76B, - 0x8DDF: 0xB76C, - 0x8DE0: 0xB76D, - 0x8DE1: 0xB76E, - 0x8DE2: 0xB76F, - 0x8DE3: 0xB772, - 0x8DE4: 0xB774, - 0x8DE5: 0xB776, - 0x8DE6: 0xB777, - 0x8DE7: 0xB778, - 0x8DE8: 0xB779, - 0x8DE9: 0xB77A, - 0x8DEA: 0xB77B, - 0x8DEB: 0xB77E, - 0x8DEC: 0xB77F, - 0x8DED: 0xB781, - 0x8DEE: 0xB782, - 0x8DEF: 0xB783, - 0x8DF0: 0xB785, - 0x8DF1: 0xB786, - 0x8DF2: 0xB787, - 0x8DF3: 0xB788, - 0x8DF4: 0xB789, - 0x8DF5: 0xB78A, - 0x8DF6: 0xB78B, - 0x8DF7: 0xB78E, - 0x8DF8: 0xB793, - 0x8DF9: 0xB794, - 0x8DFA: 0xB795, - 0x8DFB: 0xB79A, - 0x8DFC: 0xB79B, - 0x8DFD: 0xB79D, - 0x8DFE: 0xB79E, - 0x8E41: 0xB79F, - 0x8E42: 0xB7A1, - 0x8E43: 0xB7A2, - 0x8E44: 0xB7A3, - 0x8E45: 0xB7A4, - 0x8E46: 0xB7A5, - 0x8E47: 0xB7A6, - 0x8E48: 0xB7A7, - 0x8E49: 0xB7AA, - 0x8E4A: 0xB7AE, - 0x8E4B: 0xB7AF, - 0x8E4C: 0xB7B0, - 0x8E4D: 0xB7B1, - 0x8E4E: 0xB7B2, - 0x8E4F: 0xB7B3, - 0x8E50: 0xB7B6, - 0x8E51: 0xB7B7, - 0x8E52: 0xB7B9, - 0x8E53: 0xB7BA, - 0x8E54: 0xB7BB, - 0x8E55: 0xB7BC, - 0x8E56: 0xB7BD, - 0x8E57: 0xB7BE, - 0x8E58: 0xB7BF, - 0x8E59: 0xB7C0, - 0x8E5A: 0xB7C1, - 0x8E61: 0xB7C2, - 0x8E62: 0xB7C3, - 0x8E63: 0xB7C4, - 0x8E64: 0xB7C5, - 0x8E65: 0xB7C6, - 0x8E66: 0xB7C8, - 0x8E67: 0xB7CA, - 0x8E68: 0xB7CB, - 0x8E69: 0xB7CC, - 0x8E6A: 0xB7CD, - 0x8E6B: 0xB7CE, - 0x8E6C: 0xB7CF, - 0x8E6D: 0xB7D0, - 0x8E6E: 0xB7D1, - 0x8E6F: 0xB7D2, - 0x8E70: 0xB7D3, - 0x8E71: 0xB7D4, - 0x8E72: 0xB7D5, - 0x8E73: 0xB7D6, - 0x8E74: 0xB7D7, - 0x8E75: 0xB7D8, - 0x8E76: 0xB7D9, - 0x8E77: 0xB7DA, - 0x8E78: 0xB7DB, - 0x8E79: 0xB7DC, - 0x8E7A: 0xB7DD, - 0x8E81: 0xB7DE, - 0x8E82: 0xB7DF, - 0x8E83: 0xB7E0, - 0x8E84: 0xB7E1, - 0x8E85: 0xB7E2, - 0x8E86: 0xB7E3, - 0x8E87: 0xB7E4, - 0x8E88: 0xB7E5, - 0x8E89: 0xB7E6, - 0x8E8A: 0xB7E7, - 0x8E8B: 0xB7E8, - 0x8E8C: 0xB7E9, - 0x8E8D: 0xB7EA, - 0x8E8E: 0xB7EB, - 0x8E8F: 0xB7EE, - 0x8E90: 0xB7EF, - 0x8E91: 0xB7F1, - 0x8E92: 0xB7F2, - 0x8E93: 0xB7F3, - 0x8E94: 0xB7F5, - 0x8E95: 0xB7F6, - 0x8E96: 0xB7F7, - 0x8E97: 0xB7F8, - 0x8E98: 0xB7F9, - 0x8E99: 0xB7FA, - 0x8E9A: 0xB7FB, - 0x8E9B: 0xB7FE, - 0x8E9C: 0xB802, - 0x8E9D: 0xB803, - 0x8E9E: 0xB804, - 0x8E9F: 0xB805, - 0x8EA0: 0xB806, - 0x8EA1: 0xB80A, - 0x8EA2: 0xB80B, - 0x8EA3: 0xB80D, - 0x8EA4: 0xB80E, - 0x8EA5: 0xB80F, - 0x8EA6: 0xB811, - 0x8EA7: 0xB812, - 0x8EA8: 0xB813, - 0x8EA9: 0xB814, - 0x8EAA: 0xB815, - 0x8EAB: 0xB816, - 0x8EAC: 0xB817, - 0x8EAD: 0xB81A, - 0x8EAE: 0xB81C, - 0x8EAF: 0xB81E, - 0x8EB0: 0xB81F, - 0x8EB1: 0xB820, - 0x8EB2: 0xB821, - 0x8EB3: 0xB822, - 0x8EB4: 0xB823, - 0x8EB5: 0xB826, - 0x8EB6: 0xB827, - 0x8EB7: 0xB829, - 0x8EB8: 0xB82A, - 0x8EB9: 0xB82B, - 0x8EBA: 0xB82D, - 0x8EBB: 0xB82E, - 0x8EBC: 0xB82F, - 0x8EBD: 0xB830, - 0x8EBE: 0xB831, - 0x8EBF: 0xB832, - 0x8EC0: 0xB833, - 0x8EC1: 0xB836, - 0x8EC2: 0xB83A, - 0x8EC3: 0xB83B, - 0x8EC4: 0xB83C, - 0x8EC5: 0xB83D, - 0x8EC6: 0xB83E, - 0x8EC7: 0xB83F, - 0x8EC8: 0xB841, - 0x8EC9: 0xB842, - 0x8ECA: 0xB843, - 0x8ECB: 0xB845, - 0x8ECC: 0xB846, - 0x8ECD: 0xB847, - 0x8ECE: 0xB848, - 0x8ECF: 0xB849, - 0x8ED0: 0xB84A, - 0x8ED1: 0xB84B, - 0x8ED2: 0xB84C, - 0x8ED3: 0xB84D, - 0x8ED4: 0xB84E, - 0x8ED5: 0xB84F, - 0x8ED6: 0xB850, - 0x8ED7: 0xB852, - 0x8ED8: 0xB854, - 0x8ED9: 0xB855, - 0x8EDA: 0xB856, - 0x8EDB: 0xB857, - 0x8EDC: 0xB858, - 0x8EDD: 0xB859, - 0x8EDE: 0xB85A, - 0x8EDF: 0xB85B, - 0x8EE0: 0xB85E, - 0x8EE1: 0xB85F, - 0x8EE2: 0xB861, - 0x8EE3: 0xB862, - 0x8EE4: 0xB863, - 0x8EE5: 0xB865, - 0x8EE6: 0xB866, - 0x8EE7: 0xB867, - 0x8EE8: 0xB868, - 0x8EE9: 0xB869, - 0x8EEA: 0xB86A, - 0x8EEB: 0xB86B, - 0x8EEC: 0xB86E, - 0x8EED: 0xB870, - 0x8EEE: 0xB872, - 0x8EEF: 0xB873, - 0x8EF0: 0xB874, - 0x8EF1: 0xB875, - 0x8EF2: 0xB876, - 0x8EF3: 0xB877, - 0x8EF4: 0xB879, - 0x8EF5: 0xB87A, - 0x8EF6: 0xB87B, - 0x8EF7: 0xB87D, - 0x8EF8: 0xB87E, - 0x8EF9: 0xB87F, - 0x8EFA: 0xB880, - 0x8EFB: 0xB881, - 0x8EFC: 0xB882, - 0x8EFD: 0xB883, - 0x8EFE: 0xB884, - 0x8F41: 0xB885, - 0x8F42: 0xB886, - 0x8F43: 0xB887, - 0x8F44: 0xB888, - 0x8F45: 0xB889, - 0x8F46: 0xB88A, - 0x8F47: 0xB88B, - 0x8F48: 0xB88C, - 0x8F49: 0xB88E, - 0x8F4A: 0xB88F, - 0x8F4B: 0xB890, - 0x8F4C: 0xB891, - 0x8F4D: 0xB892, - 0x8F4E: 0xB893, - 0x8F4F: 0xB894, - 0x8F50: 0xB895, - 0x8F51: 0xB896, - 0x8F52: 0xB897, - 0x8F53: 0xB898, - 0x8F54: 0xB899, - 0x8F55: 0xB89A, - 0x8F56: 0xB89B, - 0x8F57: 0xB89C, - 0x8F58: 0xB89D, - 0x8F59: 0xB89E, - 0x8F5A: 0xB89F, - 0x8F61: 0xB8A0, - 0x8F62: 0xB8A1, - 0x8F63: 0xB8A2, - 0x8F64: 0xB8A3, - 0x8F65: 0xB8A4, - 0x8F66: 0xB8A5, - 0x8F67: 0xB8A6, - 0x8F68: 0xB8A7, - 0x8F69: 0xB8A9, - 0x8F6A: 0xB8AA, - 0x8F6B: 0xB8AB, - 0x8F6C: 0xB8AC, - 0x8F6D: 0xB8AD, - 0x8F6E: 0xB8AE, - 0x8F6F: 0xB8AF, - 0x8F70: 0xB8B1, - 0x8F71: 0xB8B2, - 0x8F72: 0xB8B3, - 0x8F73: 0xB8B5, - 0x8F74: 0xB8B6, - 0x8F75: 0xB8B7, - 0x8F76: 0xB8B9, - 0x8F77: 0xB8BA, - 0x8F78: 0xB8BB, - 0x8F79: 0xB8BC, - 0x8F7A: 0xB8BD, - 0x8F81: 0xB8BE, - 0x8F82: 0xB8BF, - 0x8F83: 0xB8C2, - 0x8F84: 0xB8C4, - 0x8F85: 0xB8C6, - 0x8F86: 0xB8C7, - 0x8F87: 0xB8C8, - 0x8F88: 0xB8C9, - 0x8F89: 0xB8CA, - 0x8F8A: 0xB8CB, - 0x8F8B: 0xB8CD, - 0x8F8C: 0xB8CE, - 0x8F8D: 0xB8CF, - 0x8F8E: 0xB8D1, - 0x8F8F: 0xB8D2, - 0x8F90: 0xB8D3, - 0x8F91: 0xB8D5, - 0x8F92: 0xB8D6, - 0x8F93: 0xB8D7, - 0x8F94: 0xB8D8, - 0x8F95: 0xB8D9, - 0x8F96: 0xB8DA, - 0x8F97: 0xB8DB, - 0x8F98: 0xB8DC, - 0x8F99: 0xB8DE, - 0x8F9A: 0xB8E0, - 0x8F9B: 0xB8E2, - 0x8F9C: 0xB8E3, - 0x8F9D: 0xB8E4, - 0x8F9E: 0xB8E5, - 0x8F9F: 0xB8E6, - 0x8FA0: 0xB8E7, - 0x8FA1: 0xB8EA, - 0x8FA2: 0xB8EB, - 0x8FA3: 0xB8ED, - 0x8FA4: 0xB8EE, - 0x8FA5: 0xB8EF, - 0x8FA6: 0xB8F1, - 0x8FA7: 0xB8F2, - 0x8FA8: 0xB8F3, - 0x8FA9: 0xB8F4, - 0x8FAA: 0xB8F5, - 0x8FAB: 0xB8F6, - 0x8FAC: 0xB8F7, - 0x8FAD: 0xB8FA, - 0x8FAE: 0xB8FC, - 0x8FAF: 0xB8FE, - 0x8FB0: 0xB8FF, - 0x8FB1: 0xB900, - 0x8FB2: 0xB901, - 0x8FB3: 0xB902, - 0x8FB4: 0xB903, - 0x8FB5: 0xB905, - 0x8FB6: 0xB906, - 0x8FB7: 0xB907, - 0x8FB8: 0xB908, - 0x8FB9: 0xB909, - 0x8FBA: 0xB90A, - 0x8FBB: 0xB90B, - 0x8FBC: 0xB90C, - 0x8FBD: 0xB90D, - 0x8FBE: 0xB90E, - 0x8FBF: 0xB90F, - 0x8FC0: 0xB910, - 0x8FC1: 0xB911, - 0x8FC2: 0xB912, - 0x8FC3: 0xB913, - 0x8FC4: 0xB914, - 0x8FC5: 0xB915, - 0x8FC6: 0xB916, - 0x8FC7: 0xB917, - 0x8FC8: 0xB919, - 0x8FC9: 0xB91A, - 0x8FCA: 0xB91B, - 0x8FCB: 0xB91C, - 0x8FCC: 0xB91D, - 0x8FCD: 0xB91E, - 0x8FCE: 0xB91F, - 0x8FCF: 0xB921, - 0x8FD0: 0xB922, - 0x8FD1: 0xB923, - 0x8FD2: 0xB924, - 0x8FD3: 0xB925, - 0x8FD4: 0xB926, - 0x8FD5: 0xB927, - 0x8FD6: 0xB928, - 0x8FD7: 0xB929, - 0x8FD8: 0xB92A, - 0x8FD9: 0xB92B, - 0x8FDA: 0xB92C, - 0x8FDB: 0xB92D, - 0x8FDC: 0xB92E, - 0x8FDD: 0xB92F, - 0x8FDE: 0xB930, - 0x8FDF: 0xB931, - 0x8FE0: 0xB932, - 0x8FE1: 0xB933, - 0x8FE2: 0xB934, - 0x8FE3: 0xB935, - 0x8FE4: 0xB936, - 0x8FE5: 0xB937, - 0x8FE6: 0xB938, - 0x8FE7: 0xB939, - 0x8FE8: 0xB93A, - 0x8FE9: 0xB93B, - 0x8FEA: 0xB93E, - 0x8FEB: 0xB93F, - 0x8FEC: 0xB941, - 0x8FED: 0xB942, - 0x8FEE: 0xB943, - 0x8FEF: 0xB945, - 0x8FF0: 0xB946, - 0x8FF1: 0xB947, - 0x8FF2: 0xB948, - 0x8FF3: 0xB949, - 0x8FF4: 0xB94A, - 0x8FF5: 0xB94B, - 0x8FF6: 0xB94D, - 0x8FF7: 0xB94E, - 0x8FF8: 0xB950, - 0x8FF9: 0xB952, - 0x8FFA: 0xB953, - 0x8FFB: 0xB954, - 0x8FFC: 0xB955, - 0x8FFD: 0xB956, - 0x8FFE: 0xB957, - 0x9041: 0xB95A, - 0x9042: 0xB95B, - 0x9043: 0xB95D, - 0x9044: 0xB95E, - 0x9045: 0xB95F, - 0x9046: 0xB961, - 0x9047: 0xB962, - 0x9048: 0xB963, - 0x9049: 0xB964, - 0x904A: 0xB965, - 0x904B: 0xB966, - 0x904C: 0xB967, - 0x904D: 0xB96A, - 0x904E: 0xB96C, - 0x904F: 0xB96E, - 0x9050: 0xB96F, - 0x9051: 0xB970, - 0x9052: 0xB971, - 0x9053: 0xB972, - 0x9054: 0xB973, - 0x9055: 0xB976, - 0x9056: 0xB977, - 0x9057: 0xB979, - 0x9058: 0xB97A, - 0x9059: 0xB97B, - 0x905A: 0xB97D, - 0x9061: 0xB97E, - 0x9062: 0xB97F, - 0x9063: 0xB980, - 0x9064: 0xB981, - 0x9065: 0xB982, - 0x9066: 0xB983, - 0x9067: 0xB986, - 0x9068: 0xB988, - 0x9069: 0xB98B, - 0x906A: 0xB98C, - 0x906B: 0xB98F, - 0x906C: 0xB990, - 0x906D: 0xB991, - 0x906E: 0xB992, - 0x906F: 0xB993, - 0x9070: 0xB994, - 0x9071: 0xB995, - 0x9072: 0xB996, - 0x9073: 0xB997, - 0x9074: 0xB998, - 0x9075: 0xB999, - 0x9076: 0xB99A, - 0x9077: 0xB99B, - 0x9078: 0xB99C, - 0x9079: 0xB99D, - 0x907A: 0xB99E, - 0x9081: 0xB99F, - 0x9082: 0xB9A0, - 0x9083: 0xB9A1, - 0x9084: 0xB9A2, - 0x9085: 0xB9A3, - 0x9086: 0xB9A4, - 0x9087: 0xB9A5, - 0x9088: 0xB9A6, - 0x9089: 0xB9A7, - 0x908A: 0xB9A8, - 0x908B: 0xB9A9, - 0x908C: 0xB9AA, - 0x908D: 0xB9AB, - 0x908E: 0xB9AE, - 0x908F: 0xB9AF, - 0x9090: 0xB9B1, - 0x9091: 0xB9B2, - 0x9092: 0xB9B3, - 0x9093: 0xB9B5, - 0x9094: 0xB9B6, - 0x9095: 0xB9B7, - 0x9096: 0xB9B8, - 0x9097: 0xB9B9, - 0x9098: 0xB9BA, - 0x9099: 0xB9BB, - 0x909A: 0xB9BE, - 0x909B: 0xB9C0, - 0x909C: 0xB9C2, - 0x909D: 0xB9C3, - 0x909E: 0xB9C4, - 0x909F: 0xB9C5, - 0x90A0: 0xB9C6, - 0x90A1: 0xB9C7, - 0x90A2: 0xB9CA, - 0x90A3: 0xB9CB, - 0x90A4: 0xB9CD, - 0x90A5: 0xB9D3, - 0x90A6: 0xB9D4, - 0x90A7: 0xB9D5, - 0x90A8: 0xB9D6, - 0x90A9: 0xB9D7, - 0x90AA: 0xB9DA, - 0x90AB: 0xB9DC, - 0x90AC: 0xB9DF, - 0x90AD: 0xB9E0, - 0x90AE: 0xB9E2, - 0x90AF: 0xB9E6, - 0x90B0: 0xB9E7, - 0x90B1: 0xB9E9, - 0x90B2: 0xB9EA, - 0x90B3: 0xB9EB, - 0x90B4: 0xB9ED, - 0x90B5: 0xB9EE, - 0x90B6: 0xB9EF, - 0x90B7: 0xB9F0, - 0x90B8: 0xB9F1, - 0x90B9: 0xB9F2, - 0x90BA: 0xB9F3, - 0x90BB: 0xB9F6, - 0x90BC: 0xB9FB, - 0x90BD: 0xB9FC, - 0x90BE: 0xB9FD, - 0x90BF: 0xB9FE, - 0x90C0: 0xB9FF, - 0x90C1: 0xBA02, - 0x90C2: 0xBA03, - 0x90C3: 0xBA04, - 0x90C4: 0xBA05, - 0x90C5: 0xBA06, - 0x90C6: 0xBA07, - 0x90C7: 0xBA09, - 0x90C8: 0xBA0A, - 0x90C9: 0xBA0B, - 0x90CA: 0xBA0C, - 0x90CB: 0xBA0D, - 0x90CC: 0xBA0E, - 0x90CD: 0xBA0F, - 0x90CE: 0xBA10, - 0x90CF: 0xBA11, - 0x90D0: 0xBA12, - 0x90D1: 0xBA13, - 0x90D2: 0xBA14, - 0x90D3: 0xBA16, - 0x90D4: 0xBA17, - 0x90D5: 0xBA18, - 0x90D6: 0xBA19, - 0x90D7: 0xBA1A, - 0x90D8: 0xBA1B, - 0x90D9: 0xBA1C, - 0x90DA: 0xBA1D, - 0x90DB: 0xBA1E, - 0x90DC: 0xBA1F, - 0x90DD: 0xBA20, - 0x90DE: 0xBA21, - 0x90DF: 0xBA22, - 0x90E0: 0xBA23, - 0x90E1: 0xBA24, - 0x90E2: 0xBA25, - 0x90E3: 0xBA26, - 0x90E4: 0xBA27, - 0x90E5: 0xBA28, - 0x90E6: 0xBA29, - 0x90E7: 0xBA2A, - 0x90E8: 0xBA2B, - 0x90E9: 0xBA2C, - 0x90EA: 0xBA2D, - 0x90EB: 0xBA2E, - 0x90EC: 0xBA2F, - 0x90ED: 0xBA30, - 0x90EE: 0xBA31, - 0x90EF: 0xBA32, - 0x90F0: 0xBA33, - 0x90F1: 0xBA34, - 0x90F2: 0xBA35, - 0x90F3: 0xBA36, - 0x90F4: 0xBA37, - 0x90F5: 0xBA3A, - 0x90F6: 0xBA3B, - 0x90F7: 0xBA3D, - 0x90F8: 0xBA3E, - 0x90F9: 0xBA3F, - 0x90FA: 0xBA41, - 0x90FB: 0xBA43, - 0x90FC: 0xBA44, - 0x90FD: 0xBA45, - 0x90FE: 0xBA46, - 0x9141: 0xBA47, - 0x9142: 0xBA4A, - 0x9143: 0xBA4C, - 0x9144: 0xBA4F, - 0x9145: 0xBA50, - 0x9146: 0xBA51, - 0x9147: 0xBA52, - 0x9148: 0xBA56, - 0x9149: 0xBA57, - 0x914A: 0xBA59, - 0x914B: 0xBA5A, - 0x914C: 0xBA5B, - 0x914D: 0xBA5D, - 0x914E: 0xBA5E, - 0x914F: 0xBA5F, - 0x9150: 0xBA60, - 0x9151: 0xBA61, - 0x9152: 0xBA62, - 0x9153: 0xBA63, - 0x9154: 0xBA66, - 0x9155: 0xBA6A, - 0x9156: 0xBA6B, - 0x9157: 0xBA6C, - 0x9158: 0xBA6D, - 0x9159: 0xBA6E, - 0x915A: 0xBA6F, - 0x9161: 0xBA72, - 0x9162: 0xBA73, - 0x9163: 0xBA75, - 0x9164: 0xBA76, - 0x9165: 0xBA77, - 0x9166: 0xBA79, - 0x9167: 0xBA7A, - 0x9168: 0xBA7B, - 0x9169: 0xBA7C, - 0x916A: 0xBA7D, - 0x916B: 0xBA7E, - 0x916C: 0xBA7F, - 0x916D: 0xBA80, - 0x916E: 0xBA81, - 0x916F: 0xBA82, - 0x9170: 0xBA86, - 0x9171: 0xBA88, - 0x9172: 0xBA89, - 0x9173: 0xBA8A, - 0x9174: 0xBA8B, - 0x9175: 0xBA8D, - 0x9176: 0xBA8E, - 0x9177: 0xBA8F, - 0x9178: 0xBA90, - 0x9179: 0xBA91, - 0x917A: 0xBA92, - 0x9181: 0xBA93, - 0x9182: 0xBA94, - 0x9183: 0xBA95, - 0x9184: 0xBA96, - 0x9185: 0xBA97, - 0x9186: 0xBA98, - 0x9187: 0xBA99, - 0x9188: 0xBA9A, - 0x9189: 0xBA9B, - 0x918A: 0xBA9C, - 0x918B: 0xBA9D, - 0x918C: 0xBA9E, - 0x918D: 0xBA9F, - 0x918E: 0xBAA0, - 0x918F: 0xBAA1, - 0x9190: 0xBAA2, - 0x9191: 0xBAA3, - 0x9192: 0xBAA4, - 0x9193: 0xBAA5, - 0x9194: 0xBAA6, - 0x9195: 0xBAA7, - 0x9196: 0xBAAA, - 0x9197: 0xBAAD, - 0x9198: 0xBAAE, - 0x9199: 0xBAAF, - 0x919A: 0xBAB1, - 0x919B: 0xBAB3, - 0x919C: 0xBAB4, - 0x919D: 0xBAB5, - 0x919E: 0xBAB6, - 0x919F: 0xBAB7, - 0x91A0: 0xBABA, - 0x91A1: 0xBABC, - 0x91A2: 0xBABE, - 0x91A3: 0xBABF, - 0x91A4: 0xBAC0, - 0x91A5: 0xBAC1, - 0x91A6: 0xBAC2, - 0x91A7: 0xBAC3, - 0x91A8: 0xBAC5, - 0x91A9: 0xBAC6, - 0x91AA: 0xBAC7, - 0x91AB: 0xBAC9, - 0x91AC: 0xBACA, - 0x91AD: 0xBACB, - 0x91AE: 0xBACC, - 0x91AF: 0xBACD, - 0x91B0: 0xBACE, - 0x91B1: 0xBACF, - 0x91B2: 0xBAD0, - 0x91B3: 0xBAD1, - 0x91B4: 0xBAD2, - 0x91B5: 0xBAD3, - 0x91B6: 0xBAD4, - 0x91B7: 0xBAD5, - 0x91B8: 0xBAD6, - 0x91B9: 0xBAD7, - 0x91BA: 0xBADA, - 0x91BB: 0xBADB, - 0x91BC: 0xBADC, - 0x91BD: 0xBADD, - 0x91BE: 0xBADE, - 0x91BF: 0xBADF, - 0x91C0: 0xBAE0, - 0x91C1: 0xBAE1, - 0x91C2: 0xBAE2, - 0x91C3: 0xBAE3, - 0x91C4: 0xBAE4, - 0x91C5: 0xBAE5, - 0x91C6: 0xBAE6, - 0x91C7: 0xBAE7, - 0x91C8: 0xBAE8, - 0x91C9: 0xBAE9, - 0x91CA: 0xBAEA, - 0x91CB: 0xBAEB, - 0x91CC: 0xBAEC, - 0x91CD: 0xBAED, - 0x91CE: 0xBAEE, - 0x91CF: 0xBAEF, - 0x91D0: 0xBAF0, - 0x91D1: 0xBAF1, - 0x91D2: 0xBAF2, - 0x91D3: 0xBAF3, - 0x91D4: 0xBAF4, - 0x91D5: 0xBAF5, - 0x91D6: 0xBAF6, - 0x91D7: 0xBAF7, - 0x91D8: 0xBAF8, - 0x91D9: 0xBAF9, - 0x91DA: 0xBAFA, - 0x91DB: 0xBAFB, - 0x91DC: 0xBAFD, - 0x91DD: 0xBAFE, - 0x91DE: 0xBAFF, - 0x91DF: 0xBB01, - 0x91E0: 0xBB02, - 0x91E1: 0xBB03, - 0x91E2: 0xBB05, - 0x91E3: 0xBB06, - 0x91E4: 0xBB07, - 0x91E5: 0xBB08, - 0x91E6: 0xBB09, - 0x91E7: 0xBB0A, - 0x91E8: 0xBB0B, - 0x91E9: 0xBB0C, - 0x91EA: 0xBB0E, - 0x91EB: 0xBB10, - 0x91EC: 0xBB12, - 0x91ED: 0xBB13, - 0x91EE: 0xBB14, - 0x91EF: 0xBB15, - 0x91F0: 0xBB16, - 0x91F1: 0xBB17, - 0x91F2: 0xBB19, - 0x91F3: 0xBB1A, - 0x91F4: 0xBB1B, - 0x91F5: 0xBB1D, - 0x91F6: 0xBB1E, - 0x91F7: 0xBB1F, - 0x91F8: 0xBB21, - 0x91F9: 0xBB22, - 0x91FA: 0xBB23, - 0x91FB: 0xBB24, - 0x91FC: 0xBB25, - 0x91FD: 0xBB26, - 0x91FE: 0xBB27, - 0x9241: 0xBB28, - 0x9242: 0xBB2A, - 0x9243: 0xBB2C, - 0x9244: 0xBB2D, - 0x9245: 0xBB2E, - 0x9246: 0xBB2F, - 0x9247: 0xBB30, - 0x9248: 0xBB31, - 0x9249: 0xBB32, - 0x924A: 0xBB33, - 0x924B: 0xBB37, - 0x924C: 0xBB39, - 0x924D: 0xBB3A, - 0x924E: 0xBB3F, - 0x924F: 0xBB40, - 0x9250: 0xBB41, - 0x9251: 0xBB42, - 0x9252: 0xBB43, - 0x9253: 0xBB46, - 0x9254: 0xBB48, - 0x9255: 0xBB4A, - 0x9256: 0xBB4B, - 0x9257: 0xBB4C, - 0x9258: 0xBB4E, - 0x9259: 0xBB51, - 0x925A: 0xBB52, - 0x9261: 0xBB53, - 0x9262: 0xBB55, - 0x9263: 0xBB56, - 0x9264: 0xBB57, - 0x9265: 0xBB59, - 0x9266: 0xBB5A, - 0x9267: 0xBB5B, - 0x9268: 0xBB5C, - 0x9269: 0xBB5D, - 0x926A: 0xBB5E, - 0x926B: 0xBB5F, - 0x926C: 0xBB60, - 0x926D: 0xBB62, - 0x926E: 0xBB64, - 0x926F: 0xBB65, - 0x9270: 0xBB66, - 0x9271: 0xBB67, - 0x9272: 0xBB68, - 0x9273: 0xBB69, - 0x9274: 0xBB6A, - 0x9275: 0xBB6B, - 0x9276: 0xBB6D, - 0x9277: 0xBB6E, - 0x9278: 0xBB6F, - 0x9279: 0xBB70, - 0x927A: 0xBB71, - 0x9281: 0xBB72, - 0x9282: 0xBB73, - 0x9283: 0xBB74, - 0x9284: 0xBB75, - 0x9285: 0xBB76, - 0x9286: 0xBB77, - 0x9287: 0xBB78, - 0x9288: 0xBB79, - 0x9289: 0xBB7A, - 0x928A: 0xBB7B, - 0x928B: 0xBB7C, - 0x928C: 0xBB7D, - 0x928D: 0xBB7E, - 0x928E: 0xBB7F, - 0x928F: 0xBB80, - 0x9290: 0xBB81, - 0x9291: 0xBB82, - 0x9292: 0xBB83, - 0x9293: 0xBB84, - 0x9294: 0xBB85, - 0x9295: 0xBB86, - 0x9296: 0xBB87, - 0x9297: 0xBB89, - 0x9298: 0xBB8A, - 0x9299: 0xBB8B, - 0x929A: 0xBB8D, - 0x929B: 0xBB8E, - 0x929C: 0xBB8F, - 0x929D: 0xBB91, - 0x929E: 0xBB92, - 0x929F: 0xBB93, - 0x92A0: 0xBB94, - 0x92A1: 0xBB95, - 0x92A2: 0xBB96, - 0x92A3: 0xBB97, - 0x92A4: 0xBB98, - 0x92A5: 0xBB99, - 0x92A6: 0xBB9A, - 0x92A7: 0xBB9B, - 0x92A8: 0xBB9C, - 0x92A9: 0xBB9D, - 0x92AA: 0xBB9E, - 0x92AB: 0xBB9F, - 0x92AC: 0xBBA0, - 0x92AD: 0xBBA1, - 0x92AE: 0xBBA2, - 0x92AF: 0xBBA3, - 0x92B0: 0xBBA5, - 0x92B1: 0xBBA6, - 0x92B2: 0xBBA7, - 0x92B3: 0xBBA9, - 0x92B4: 0xBBAA, - 0x92B5: 0xBBAB, - 0x92B6: 0xBBAD, - 0x92B7: 0xBBAE, - 0x92B8: 0xBBAF, - 0x92B9: 0xBBB0, - 0x92BA: 0xBBB1, - 0x92BB: 0xBBB2, - 0x92BC: 0xBBB3, - 0x92BD: 0xBBB5, - 0x92BE: 0xBBB6, - 0x92BF: 0xBBB8, - 0x92C0: 0xBBB9, - 0x92C1: 0xBBBA, - 0x92C2: 0xBBBB, - 0x92C3: 0xBBBC, - 0x92C4: 0xBBBD, - 0x92C5: 0xBBBE, - 0x92C6: 0xBBBF, - 0x92C7: 0xBBC1, - 0x92C8: 0xBBC2, - 0x92C9: 0xBBC3, - 0x92CA: 0xBBC5, - 0x92CB: 0xBBC6, - 0x92CC: 0xBBC7, - 0x92CD: 0xBBC9, - 0x92CE: 0xBBCA, - 0x92CF: 0xBBCB, - 0x92D0: 0xBBCC, - 0x92D1: 0xBBCD, - 0x92D2: 0xBBCE, - 0x92D3: 0xBBCF, - 0x92D4: 0xBBD1, - 0x92D5: 0xBBD2, - 0x92D6: 0xBBD4, - 0x92D7: 0xBBD5, - 0x92D8: 0xBBD6, - 0x92D9: 0xBBD7, - 0x92DA: 0xBBD8, - 0x92DB: 0xBBD9, - 0x92DC: 0xBBDA, - 0x92DD: 0xBBDB, - 0x92DE: 0xBBDC, - 0x92DF: 0xBBDD, - 0x92E0: 0xBBDE, - 0x92E1: 0xBBDF, - 0x92E2: 0xBBE0, - 0x92E3: 0xBBE1, - 0x92E4: 0xBBE2, - 0x92E5: 0xBBE3, - 0x92E6: 0xBBE4, - 0x92E7: 0xBBE5, - 0x92E8: 0xBBE6, - 0x92E9: 0xBBE7, - 0x92EA: 0xBBE8, - 0x92EB: 0xBBE9, - 0x92EC: 0xBBEA, - 0x92ED: 0xBBEB, - 0x92EE: 0xBBEC, - 0x92EF: 0xBBED, - 0x92F0: 0xBBEE, - 0x92F1: 0xBBEF, - 0x92F2: 0xBBF0, - 0x92F3: 0xBBF1, - 0x92F4: 0xBBF2, - 0x92F5: 0xBBF3, - 0x92F6: 0xBBF4, - 0x92F7: 0xBBF5, - 0x92F8: 0xBBF6, - 0x92F9: 0xBBF7, - 0x92FA: 0xBBFA, - 0x92FB: 0xBBFB, - 0x92FC: 0xBBFD, - 0x92FD: 0xBBFE, - 0x92FE: 0xBC01, - 0x9341: 0xBC03, - 0x9342: 0xBC04, - 0x9343: 0xBC05, - 0x9344: 0xBC06, - 0x9345: 0xBC07, - 0x9346: 0xBC0A, - 0x9347: 0xBC0E, - 0x9348: 0xBC10, - 0x9349: 0xBC12, - 0x934A: 0xBC13, - 0x934B: 0xBC19, - 0x934C: 0xBC1A, - 0x934D: 0xBC20, - 0x934E: 0xBC21, - 0x934F: 0xBC22, - 0x9350: 0xBC23, - 0x9351: 0xBC26, - 0x9352: 0xBC28, - 0x9353: 0xBC2A, - 0x9354: 0xBC2B, - 0x9355: 0xBC2C, - 0x9356: 0xBC2E, - 0x9357: 0xBC2F, - 0x9358: 0xBC32, - 0x9359: 0xBC33, - 0x935A: 0xBC35, - 0x9361: 0xBC36, - 0x9362: 0xBC37, - 0x9363: 0xBC39, - 0x9364: 0xBC3A, - 0x9365: 0xBC3B, - 0x9366: 0xBC3C, - 0x9367: 0xBC3D, - 0x9368: 0xBC3E, - 0x9369: 0xBC3F, - 0x936A: 0xBC42, - 0x936B: 0xBC46, - 0x936C: 0xBC47, - 0x936D: 0xBC48, - 0x936E: 0xBC4A, - 0x936F: 0xBC4B, - 0x9370: 0xBC4E, - 0x9371: 0xBC4F, - 0x9372: 0xBC51, - 0x9373: 0xBC52, - 0x9374: 0xBC53, - 0x9375: 0xBC54, - 0x9376: 0xBC55, - 0x9377: 0xBC56, - 0x9378: 0xBC57, - 0x9379: 0xBC58, - 0x937A: 0xBC59, - 0x9381: 0xBC5A, - 0x9382: 0xBC5B, - 0x9383: 0xBC5C, - 0x9384: 0xBC5E, - 0x9385: 0xBC5F, - 0x9386: 0xBC60, - 0x9387: 0xBC61, - 0x9388: 0xBC62, - 0x9389: 0xBC63, - 0x938A: 0xBC64, - 0x938B: 0xBC65, - 0x938C: 0xBC66, - 0x938D: 0xBC67, - 0x938E: 0xBC68, - 0x938F: 0xBC69, - 0x9390: 0xBC6A, - 0x9391: 0xBC6B, - 0x9392: 0xBC6C, - 0x9393: 0xBC6D, - 0x9394: 0xBC6E, - 0x9395: 0xBC6F, - 0x9396: 0xBC70, - 0x9397: 0xBC71, - 0x9398: 0xBC72, - 0x9399: 0xBC73, - 0x939A: 0xBC74, - 0x939B: 0xBC75, - 0x939C: 0xBC76, - 0x939D: 0xBC77, - 0x939E: 0xBC78, - 0x939F: 0xBC79, - 0x93A0: 0xBC7A, - 0x93A1: 0xBC7B, - 0x93A2: 0xBC7C, - 0x93A3: 0xBC7D, - 0x93A4: 0xBC7E, - 0x93A5: 0xBC7F, - 0x93A6: 0xBC80, - 0x93A7: 0xBC81, - 0x93A8: 0xBC82, - 0x93A9: 0xBC83, - 0x93AA: 0xBC86, - 0x93AB: 0xBC87, - 0x93AC: 0xBC89, - 0x93AD: 0xBC8A, - 0x93AE: 0xBC8D, - 0x93AF: 0xBC8F, - 0x93B0: 0xBC90, - 0x93B1: 0xBC91, - 0x93B2: 0xBC92, - 0x93B3: 0xBC93, - 0x93B4: 0xBC96, - 0x93B5: 0xBC98, - 0x93B6: 0xBC9B, - 0x93B7: 0xBC9C, - 0x93B8: 0xBC9D, - 0x93B9: 0xBC9E, - 0x93BA: 0xBC9F, - 0x93BB: 0xBCA2, - 0x93BC: 0xBCA3, - 0x93BD: 0xBCA5, - 0x93BE: 0xBCA6, - 0x93BF: 0xBCA9, - 0x93C0: 0xBCAA, - 0x93C1: 0xBCAB, - 0x93C2: 0xBCAC, - 0x93C3: 0xBCAD, - 0x93C4: 0xBCAE, - 0x93C5: 0xBCAF, - 0x93C6: 0xBCB2, - 0x93C7: 0xBCB6, - 0x93C8: 0xBCB7, - 0x93C9: 0xBCB8, - 0x93CA: 0xBCB9, - 0x93CB: 0xBCBA, - 0x93CC: 0xBCBB, - 0x93CD: 0xBCBE, - 0x93CE: 0xBCBF, - 0x93CF: 0xBCC1, - 0x93D0: 0xBCC2, - 0x93D1: 0xBCC3, - 0x93D2: 0xBCC5, - 0x93D3: 0xBCC6, - 0x93D4: 0xBCC7, - 0x93D5: 0xBCC8, - 0x93D6: 0xBCC9, - 0x93D7: 0xBCCA, - 0x93D8: 0xBCCB, - 0x93D9: 0xBCCC, - 0x93DA: 0xBCCE, - 0x93DB: 0xBCD2, - 0x93DC: 0xBCD3, - 0x93DD: 0xBCD4, - 0x93DE: 0xBCD6, - 0x93DF: 0xBCD7, - 0x93E0: 0xBCD9, - 0x93E1: 0xBCDA, - 0x93E2: 0xBCDB, - 0x93E3: 0xBCDD, - 0x93E4: 0xBCDE, - 0x93E5: 0xBCDF, - 0x93E6: 0xBCE0, - 0x93E7: 0xBCE1, - 0x93E8: 0xBCE2, - 0x93E9: 0xBCE3, - 0x93EA: 0xBCE4, - 0x93EB: 0xBCE5, - 0x93EC: 0xBCE6, - 0x93ED: 0xBCE7, - 0x93EE: 0xBCE8, - 0x93EF: 0xBCE9, - 0x93F0: 0xBCEA, - 0x93F1: 0xBCEB, - 0x93F2: 0xBCEC, - 0x93F3: 0xBCED, - 0x93F4: 0xBCEE, - 0x93F5: 0xBCEF, - 0x93F6: 0xBCF0, - 0x93F7: 0xBCF1, - 0x93F8: 0xBCF2, - 0x93F9: 0xBCF3, - 0x93FA: 0xBCF7, - 0x93FB: 0xBCF9, - 0x93FC: 0xBCFA, - 0x93FD: 0xBCFB, - 0x93FE: 0xBCFD, - 0x9441: 0xBCFE, - 0x9442: 0xBCFF, - 0x9443: 0xBD00, - 0x9444: 0xBD01, - 0x9445: 0xBD02, - 0x9446: 0xBD03, - 0x9447: 0xBD06, - 0x9448: 0xBD08, - 0x9449: 0xBD0A, - 0x944A: 0xBD0B, - 0x944B: 0xBD0C, - 0x944C: 0xBD0D, - 0x944D: 0xBD0E, - 0x944E: 0xBD0F, - 0x944F: 0xBD11, - 0x9450: 0xBD12, - 0x9451: 0xBD13, - 0x9452: 0xBD15, - 0x9453: 0xBD16, - 0x9454: 0xBD17, - 0x9455: 0xBD18, - 0x9456: 0xBD19, - 0x9457: 0xBD1A, - 0x9458: 0xBD1B, - 0x9459: 0xBD1C, - 0x945A: 0xBD1D, - 0x9461: 0xBD1E, - 0x9462: 0xBD1F, - 0x9463: 0xBD20, - 0x9464: 0xBD21, - 0x9465: 0xBD22, - 0x9466: 0xBD23, - 0x9467: 0xBD25, - 0x9468: 0xBD26, - 0x9469: 0xBD27, - 0x946A: 0xBD28, - 0x946B: 0xBD29, - 0x946C: 0xBD2A, - 0x946D: 0xBD2B, - 0x946E: 0xBD2D, - 0x946F: 0xBD2E, - 0x9470: 0xBD2F, - 0x9471: 0xBD30, - 0x9472: 0xBD31, - 0x9473: 0xBD32, - 0x9474: 0xBD33, - 0x9475: 0xBD34, - 0x9476: 0xBD35, - 0x9477: 0xBD36, - 0x9478: 0xBD37, - 0x9479: 0xBD38, - 0x947A: 0xBD39, - 0x9481: 0xBD3A, - 0x9482: 0xBD3B, - 0x9483: 0xBD3C, - 0x9484: 0xBD3D, - 0x9485: 0xBD3E, - 0x9486: 0xBD3F, - 0x9487: 0xBD41, - 0x9488: 0xBD42, - 0x9489: 0xBD43, - 0x948A: 0xBD44, - 0x948B: 0xBD45, - 0x948C: 0xBD46, - 0x948D: 0xBD47, - 0x948E: 0xBD4A, - 0x948F: 0xBD4B, - 0x9490: 0xBD4D, - 0x9491: 0xBD4E, - 0x9492: 0xBD4F, - 0x9493: 0xBD51, - 0x9494: 0xBD52, - 0x9495: 0xBD53, - 0x9496: 0xBD54, - 0x9497: 0xBD55, - 0x9498: 0xBD56, - 0x9499: 0xBD57, - 0x949A: 0xBD5A, - 0x949B: 0xBD5B, - 0x949C: 0xBD5C, - 0x949D: 0xBD5D, - 0x949E: 0xBD5E, - 0x949F: 0xBD5F, - 0x94A0: 0xBD60, - 0x94A1: 0xBD61, - 0x94A2: 0xBD62, - 0x94A3: 0xBD63, - 0x94A4: 0xBD65, - 0x94A5: 0xBD66, - 0x94A6: 0xBD67, - 0x94A7: 0xBD69, - 0x94A8: 0xBD6A, - 0x94A9: 0xBD6B, - 0x94AA: 0xBD6C, - 0x94AB: 0xBD6D, - 0x94AC: 0xBD6E, - 0x94AD: 0xBD6F, - 0x94AE: 0xBD70, - 0x94AF: 0xBD71, - 0x94B0: 0xBD72, - 0x94B1: 0xBD73, - 0x94B2: 0xBD74, - 0x94B3: 0xBD75, - 0x94B4: 0xBD76, - 0x94B5: 0xBD77, - 0x94B6: 0xBD78, - 0x94B7: 0xBD79, - 0x94B8: 0xBD7A, - 0x94B9: 0xBD7B, - 0x94BA: 0xBD7C, - 0x94BB: 0xBD7D, - 0x94BC: 0xBD7E, - 0x94BD: 0xBD7F, - 0x94BE: 0xBD82, - 0x94BF: 0xBD83, - 0x94C0: 0xBD85, - 0x94C1: 0xBD86, - 0x94C2: 0xBD8B, - 0x94C3: 0xBD8C, - 0x94C4: 0xBD8D, - 0x94C5: 0xBD8E, - 0x94C6: 0xBD8F, - 0x94C7: 0xBD92, - 0x94C8: 0xBD94, - 0x94C9: 0xBD96, - 0x94CA: 0xBD97, - 0x94CB: 0xBD98, - 0x94CC: 0xBD9B, - 0x94CD: 0xBD9D, - 0x94CE: 0xBD9E, - 0x94CF: 0xBD9F, - 0x94D0: 0xBDA0, - 0x94D1: 0xBDA1, - 0x94D2: 0xBDA2, - 0x94D3: 0xBDA3, - 0x94D4: 0xBDA5, - 0x94D5: 0xBDA6, - 0x94D6: 0xBDA7, - 0x94D7: 0xBDA8, - 0x94D8: 0xBDA9, - 0x94D9: 0xBDAA, - 0x94DA: 0xBDAB, - 0x94DB: 0xBDAC, - 0x94DC: 0xBDAD, - 0x94DD: 0xBDAE, - 0x94DE: 0xBDAF, - 0x94DF: 0xBDB1, - 0x94E0: 0xBDB2, - 0x94E1: 0xBDB3, - 0x94E2: 0xBDB4, - 0x94E3: 0xBDB5, - 0x94E4: 0xBDB6, - 0x94E5: 0xBDB7, - 0x94E6: 0xBDB9, - 0x94E7: 0xBDBA, - 0x94E8: 0xBDBB, - 0x94E9: 0xBDBC, - 0x94EA: 0xBDBD, - 0x94EB: 0xBDBE, - 0x94EC: 0xBDBF, - 0x94ED: 0xBDC0, - 0x94EE: 0xBDC1, - 0x94EF: 0xBDC2, - 0x94F0: 0xBDC3, - 0x94F1: 0xBDC4, - 0x94F2: 0xBDC5, - 0x94F3: 0xBDC6, - 0x94F4: 0xBDC7, - 0x94F5: 0xBDC8, - 0x94F6: 0xBDC9, - 0x94F7: 0xBDCA, - 0x94F8: 0xBDCB, - 0x94F9: 0xBDCC, - 0x94FA: 0xBDCD, - 0x94FB: 0xBDCE, - 0x94FC: 0xBDCF, - 0x94FD: 0xBDD0, - 0x94FE: 0xBDD1, - 0x9541: 0xBDD2, - 0x9542: 0xBDD3, - 0x9543: 0xBDD6, - 0x9544: 0xBDD7, - 0x9545: 0xBDD9, - 0x9546: 0xBDDA, - 0x9547: 0xBDDB, - 0x9548: 0xBDDD, - 0x9549: 0xBDDE, - 0x954A: 0xBDDF, - 0x954B: 0xBDE0, - 0x954C: 0xBDE1, - 0x954D: 0xBDE2, - 0x954E: 0xBDE3, - 0x954F: 0xBDE4, - 0x9550: 0xBDE5, - 0x9551: 0xBDE6, - 0x9552: 0xBDE7, - 0x9553: 0xBDE8, - 0x9554: 0xBDEA, - 0x9555: 0xBDEB, - 0x9556: 0xBDEC, - 0x9557: 0xBDED, - 0x9558: 0xBDEE, - 0x9559: 0xBDEF, - 0x955A: 0xBDF1, - 0x9561: 0xBDF2, - 0x9562: 0xBDF3, - 0x9563: 0xBDF5, - 0x9564: 0xBDF6, - 0x9565: 0xBDF7, - 0x9566: 0xBDF9, - 0x9567: 0xBDFA, - 0x9568: 0xBDFB, - 0x9569: 0xBDFC, - 0x956A: 0xBDFD, - 0x956B: 0xBDFE, - 0x956C: 0xBDFF, - 0x956D: 0xBE01, - 0x956E: 0xBE02, - 0x956F: 0xBE04, - 0x9570: 0xBE06, - 0x9571: 0xBE07, - 0x9572: 0xBE08, - 0x9573: 0xBE09, - 0x9574: 0xBE0A, - 0x9575: 0xBE0B, - 0x9576: 0xBE0E, - 0x9577: 0xBE0F, - 0x9578: 0xBE11, - 0x9579: 0xBE12, - 0x957A: 0xBE13, - 0x9581: 0xBE15, - 0x9582: 0xBE16, - 0x9583: 0xBE17, - 0x9584: 0xBE18, - 0x9585: 0xBE19, - 0x9586: 0xBE1A, - 0x9587: 0xBE1B, - 0x9588: 0xBE1E, - 0x9589: 0xBE20, - 0x958A: 0xBE21, - 0x958B: 0xBE22, - 0x958C: 0xBE23, - 0x958D: 0xBE24, - 0x958E: 0xBE25, - 0x958F: 0xBE26, - 0x9590: 0xBE27, - 0x9591: 0xBE28, - 0x9592: 0xBE29, - 0x9593: 0xBE2A, - 0x9594: 0xBE2B, - 0x9595: 0xBE2C, - 0x9596: 0xBE2D, - 0x9597: 0xBE2E, - 0x9598: 0xBE2F, - 0x9599: 0xBE30, - 0x959A: 0xBE31, - 0x959B: 0xBE32, - 0x959C: 0xBE33, - 0x959D: 0xBE34, - 0x959E: 0xBE35, - 0x959F: 0xBE36, - 0x95A0: 0xBE37, - 0x95A1: 0xBE38, - 0x95A2: 0xBE39, - 0x95A3: 0xBE3A, - 0x95A4: 0xBE3B, - 0x95A5: 0xBE3C, - 0x95A6: 0xBE3D, - 0x95A7: 0xBE3E, - 0x95A8: 0xBE3F, - 0x95A9: 0xBE40, - 0x95AA: 0xBE41, - 0x95AB: 0xBE42, - 0x95AC: 0xBE43, - 0x95AD: 0xBE46, - 0x95AE: 0xBE47, - 0x95AF: 0xBE49, - 0x95B0: 0xBE4A, - 0x95B1: 0xBE4B, - 0x95B2: 0xBE4D, - 0x95B3: 0xBE4F, - 0x95B4: 0xBE50, - 0x95B5: 0xBE51, - 0x95B6: 0xBE52, - 0x95B7: 0xBE53, - 0x95B8: 0xBE56, - 0x95B9: 0xBE58, - 0x95BA: 0xBE5C, - 0x95BB: 0xBE5D, - 0x95BC: 0xBE5E, - 0x95BD: 0xBE5F, - 0x95BE: 0xBE62, - 0x95BF: 0xBE63, - 0x95C0: 0xBE65, - 0x95C1: 0xBE66, - 0x95C2: 0xBE67, - 0x95C3: 0xBE69, - 0x95C4: 0xBE6B, - 0x95C5: 0xBE6C, - 0x95C6: 0xBE6D, - 0x95C7: 0xBE6E, - 0x95C8: 0xBE6F, - 0x95C9: 0xBE72, - 0x95CA: 0xBE76, - 0x95CB: 0xBE77, - 0x95CC: 0xBE78, - 0x95CD: 0xBE79, - 0x95CE: 0xBE7A, - 0x95CF: 0xBE7E, - 0x95D0: 0xBE7F, - 0x95D1: 0xBE81, - 0x95D2: 0xBE82, - 0x95D3: 0xBE83, - 0x95D4: 0xBE85, - 0x95D5: 0xBE86, - 0x95D6: 0xBE87, - 0x95D7: 0xBE88, - 0x95D8: 0xBE89, - 0x95D9: 0xBE8A, - 0x95DA: 0xBE8B, - 0x95DB: 0xBE8E, - 0x95DC: 0xBE92, - 0x95DD: 0xBE93, - 0x95DE: 0xBE94, - 0x95DF: 0xBE95, - 0x95E0: 0xBE96, - 0x95E1: 0xBE97, - 0x95E2: 0xBE9A, - 0x95E3: 0xBE9B, - 0x95E4: 0xBE9C, - 0x95E5: 0xBE9D, - 0x95E6: 0xBE9E, - 0x95E7: 0xBE9F, - 0x95E8: 0xBEA0, - 0x95E9: 0xBEA1, - 0x95EA: 0xBEA2, - 0x95EB: 0xBEA3, - 0x95EC: 0xBEA4, - 0x95ED: 0xBEA5, - 0x95EE: 0xBEA6, - 0x95EF: 0xBEA7, - 0x95F0: 0xBEA9, - 0x95F1: 0xBEAA, - 0x95F2: 0xBEAB, - 0x95F3: 0xBEAC, - 0x95F4: 0xBEAD, - 0x95F5: 0xBEAE, - 0x95F6: 0xBEAF, - 0x95F7: 0xBEB0, - 0x95F8: 0xBEB1, - 0x95F9: 0xBEB2, - 0x95FA: 0xBEB3, - 0x95FB: 0xBEB4, - 0x95FC: 0xBEB5, - 0x95FD: 0xBEB6, - 0x95FE: 0xBEB7, - 0x9641: 0xBEB8, - 0x9642: 0xBEB9, - 0x9643: 0xBEBA, - 0x9644: 0xBEBB, - 0x9645: 0xBEBC, - 0x9646: 0xBEBD, - 0x9647: 0xBEBE, - 0x9648: 0xBEBF, - 0x9649: 0xBEC0, - 0x964A: 0xBEC1, - 0x964B: 0xBEC2, - 0x964C: 0xBEC3, - 0x964D: 0xBEC4, - 0x964E: 0xBEC5, - 0x964F: 0xBEC6, - 0x9650: 0xBEC7, - 0x9651: 0xBEC8, - 0x9652: 0xBEC9, - 0x9653: 0xBECA, - 0x9654: 0xBECB, - 0x9655: 0xBECC, - 0x9656: 0xBECD, - 0x9657: 0xBECE, - 0x9658: 0xBECF, - 0x9659: 0xBED2, - 0x965A: 0xBED3, - 0x9661: 0xBED5, - 0x9662: 0xBED6, - 0x9663: 0xBED9, - 0x9664: 0xBEDA, - 0x9665: 0xBEDB, - 0x9666: 0xBEDC, - 0x9667: 0xBEDD, - 0x9668: 0xBEDE, - 0x9669: 0xBEDF, - 0x966A: 0xBEE1, - 0x966B: 0xBEE2, - 0x966C: 0xBEE6, - 0x966D: 0xBEE7, - 0x966E: 0xBEE8, - 0x966F: 0xBEE9, - 0x9670: 0xBEEA, - 0x9671: 0xBEEB, - 0x9672: 0xBEED, - 0x9673: 0xBEEE, - 0x9674: 0xBEEF, - 0x9675: 0xBEF0, - 0x9676: 0xBEF1, - 0x9677: 0xBEF2, - 0x9678: 0xBEF3, - 0x9679: 0xBEF4, - 0x967A: 0xBEF5, - 0x9681: 0xBEF6, - 0x9682: 0xBEF7, - 0x9683: 0xBEF8, - 0x9684: 0xBEF9, - 0x9685: 0xBEFA, - 0x9686: 0xBEFB, - 0x9687: 0xBEFC, - 0x9688: 0xBEFD, - 0x9689: 0xBEFE, - 0x968A: 0xBEFF, - 0x968B: 0xBF00, - 0x968C: 0xBF02, - 0x968D: 0xBF03, - 0x968E: 0xBF04, - 0x968F: 0xBF05, - 0x9690: 0xBF06, - 0x9691: 0xBF07, - 0x9692: 0xBF0A, - 0x9693: 0xBF0B, - 0x9694: 0xBF0C, - 0x9695: 0xBF0D, - 0x9696: 0xBF0E, - 0x9697: 0xBF0F, - 0x9698: 0xBF10, - 0x9699: 0xBF11, - 0x969A: 0xBF12, - 0x969B: 0xBF13, - 0x969C: 0xBF14, - 0x969D: 0xBF15, - 0x969E: 0xBF16, - 0x969F: 0xBF17, - 0x96A0: 0xBF1A, - 0x96A1: 0xBF1E, - 0x96A2: 0xBF1F, - 0x96A3: 0xBF20, - 0x96A4: 0xBF21, - 0x96A5: 0xBF22, - 0x96A6: 0xBF23, - 0x96A7: 0xBF24, - 0x96A8: 0xBF25, - 0x96A9: 0xBF26, - 0x96AA: 0xBF27, - 0x96AB: 0xBF28, - 0x96AC: 0xBF29, - 0x96AD: 0xBF2A, - 0x96AE: 0xBF2B, - 0x96AF: 0xBF2C, - 0x96B0: 0xBF2D, - 0x96B1: 0xBF2E, - 0x96B2: 0xBF2F, - 0x96B3: 0xBF30, - 0x96B4: 0xBF31, - 0x96B5: 0xBF32, - 0x96B6: 0xBF33, - 0x96B7: 0xBF34, - 0x96B8: 0xBF35, - 0x96B9: 0xBF36, - 0x96BA: 0xBF37, - 0x96BB: 0xBF38, - 0x96BC: 0xBF39, - 0x96BD: 0xBF3A, - 0x96BE: 0xBF3B, - 0x96BF: 0xBF3C, - 0x96C0: 0xBF3D, - 0x96C1: 0xBF3E, - 0x96C2: 0xBF3F, - 0x96C3: 0xBF42, - 0x96C4: 0xBF43, - 0x96C5: 0xBF45, - 0x96C6: 0xBF46, - 0x96C7: 0xBF47, - 0x96C8: 0xBF49, - 0x96C9: 0xBF4A, - 0x96CA: 0xBF4B, - 0x96CB: 0xBF4C, - 0x96CC: 0xBF4D, - 0x96CD: 0xBF4E, - 0x96CE: 0xBF4F, - 0x96CF: 0xBF52, - 0x96D0: 0xBF53, - 0x96D1: 0xBF54, - 0x96D2: 0xBF56, - 0x96D3: 0xBF57, - 0x96D4: 0xBF58, - 0x96D5: 0xBF59, - 0x96D6: 0xBF5A, - 0x96D7: 0xBF5B, - 0x96D8: 0xBF5C, - 0x96D9: 0xBF5D, - 0x96DA: 0xBF5E, - 0x96DB: 0xBF5F, - 0x96DC: 0xBF60, - 0x96DD: 0xBF61, - 0x96DE: 0xBF62, - 0x96DF: 0xBF63, - 0x96E0: 0xBF64, - 0x96E1: 0xBF65, - 0x96E2: 0xBF66, - 0x96E3: 0xBF67, - 0x96E4: 0xBF68, - 0x96E5: 0xBF69, - 0x96E6: 0xBF6A, - 0x96E7: 0xBF6B, - 0x96E8: 0xBF6C, - 0x96E9: 0xBF6D, - 0x96EA: 0xBF6E, - 0x96EB: 0xBF6F, - 0x96EC: 0xBF70, - 0x96ED: 0xBF71, - 0x96EE: 0xBF72, - 0x96EF: 0xBF73, - 0x96F0: 0xBF74, - 0x96F1: 0xBF75, - 0x96F2: 0xBF76, - 0x96F3: 0xBF77, - 0x96F4: 0xBF78, - 0x96F5: 0xBF79, - 0x96F6: 0xBF7A, - 0x96F7: 0xBF7B, - 0x96F8: 0xBF7C, - 0x96F9: 0xBF7D, - 0x96FA: 0xBF7E, - 0x96FB: 0xBF7F, - 0x96FC: 0xBF80, - 0x96FD: 0xBF81, - 0x96FE: 0xBF82, - 0x9741: 0xBF83, - 0x9742: 0xBF84, - 0x9743: 0xBF85, - 0x9744: 0xBF86, - 0x9745: 0xBF87, - 0x9746: 0xBF88, - 0x9747: 0xBF89, - 0x9748: 0xBF8A, - 0x9749: 0xBF8B, - 0x974A: 0xBF8C, - 0x974B: 0xBF8D, - 0x974C: 0xBF8E, - 0x974D: 0xBF8F, - 0x974E: 0xBF90, - 0x974F: 0xBF91, - 0x9750: 0xBF92, - 0x9751: 0xBF93, - 0x9752: 0xBF95, - 0x9753: 0xBF96, - 0x9754: 0xBF97, - 0x9755: 0xBF98, - 0x9756: 0xBF99, - 0x9757: 0xBF9A, - 0x9758: 0xBF9B, - 0x9759: 0xBF9C, - 0x975A: 0xBF9D, - 0x9761: 0xBF9E, - 0x9762: 0xBF9F, - 0x9763: 0xBFA0, - 0x9764: 0xBFA1, - 0x9765: 0xBFA2, - 0x9766: 0xBFA3, - 0x9767: 0xBFA4, - 0x9768: 0xBFA5, - 0x9769: 0xBFA6, - 0x976A: 0xBFA7, - 0x976B: 0xBFA8, - 0x976C: 0xBFA9, - 0x976D: 0xBFAA, - 0x976E: 0xBFAB, - 0x976F: 0xBFAC, - 0x9770: 0xBFAD, - 0x9771: 0xBFAE, - 0x9772: 0xBFAF, - 0x9773: 0xBFB1, - 0x9774: 0xBFB2, - 0x9775: 0xBFB3, - 0x9776: 0xBFB4, - 0x9777: 0xBFB5, - 0x9778: 0xBFB6, - 0x9779: 0xBFB7, - 0x977A: 0xBFB8, - 0x9781: 0xBFB9, - 0x9782: 0xBFBA, - 0x9783: 0xBFBB, - 0x9784: 0xBFBC, - 0x9785: 0xBFBD, - 0x9786: 0xBFBE, - 0x9787: 0xBFBF, - 0x9788: 0xBFC0, - 0x9789: 0xBFC1, - 0x978A: 0xBFC2, - 0x978B: 0xBFC3, - 0x978C: 0xBFC4, - 0x978D: 0xBFC6, - 0x978E: 0xBFC7, - 0x978F: 0xBFC8, - 0x9790: 0xBFC9, - 0x9791: 0xBFCA, - 0x9792: 0xBFCB, - 0x9793: 0xBFCE, - 0x9794: 0xBFCF, - 0x9795: 0xBFD1, - 0x9796: 0xBFD2, - 0x9797: 0xBFD3, - 0x9798: 0xBFD5, - 0x9799: 0xBFD6, - 0x979A: 0xBFD7, - 0x979B: 0xBFD8, - 0x979C: 0xBFD9, - 0x979D: 0xBFDA, - 0x979E: 0xBFDB, - 0x979F: 0xBFDD, - 0x97A0: 0xBFDE, - 0x97A1: 0xBFE0, - 0x97A2: 0xBFE2, - 0x97A3: 0xBFE3, - 0x97A4: 0xBFE4, - 0x97A5: 0xBFE5, - 0x97A6: 0xBFE6, - 0x97A7: 0xBFE7, - 0x97A8: 0xBFE8, - 0x97A9: 0xBFE9, - 0x97AA: 0xBFEA, - 0x97AB: 0xBFEB, - 0x97AC: 0xBFEC, - 0x97AD: 0xBFED, - 0x97AE: 0xBFEE, - 0x97AF: 0xBFEF, - 0x97B0: 0xBFF0, - 0x97B1: 0xBFF1, - 0x97B2: 0xBFF2, - 0x97B3: 0xBFF3, - 0x97B4: 0xBFF4, - 0x97B5: 0xBFF5, - 0x97B6: 0xBFF6, - 0x97B7: 0xBFF7, - 0x97B8: 0xBFF8, - 0x97B9: 0xBFF9, - 0x97BA: 0xBFFA, - 0x97BB: 0xBFFB, - 0x97BC: 0xBFFC, - 0x97BD: 0xBFFD, - 0x97BE: 0xBFFE, - 0x97BF: 0xBFFF, - 0x97C0: 0xC000, - 0x97C1: 0xC001, - 0x97C2: 0xC002, - 0x97C3: 0xC003, - 0x97C4: 0xC004, - 0x97C5: 0xC005, - 0x97C6: 0xC006, - 0x97C7: 0xC007, - 0x97C8: 0xC008, - 0x97C9: 0xC009, - 0x97CA: 0xC00A, - 0x97CB: 0xC00B, - 0x97CC: 0xC00C, - 0x97CD: 0xC00D, - 0x97CE: 0xC00E, - 0x97CF: 0xC00F, - 0x97D0: 0xC010, - 0x97D1: 0xC011, - 0x97D2: 0xC012, - 0x97D3: 0xC013, - 0x97D4: 0xC014, - 0x97D5: 0xC015, - 0x97D6: 0xC016, - 0x97D7: 0xC017, - 0x97D8: 0xC018, - 0x97D9: 0xC019, - 0x97DA: 0xC01A, - 0x97DB: 0xC01B, - 0x97DC: 0xC01C, - 0x97DD: 0xC01D, - 0x97DE: 0xC01E, - 0x97DF: 0xC01F, - 0x97E0: 0xC020, - 0x97E1: 0xC021, - 0x97E2: 0xC022, - 0x97E3: 0xC023, - 0x97E4: 0xC024, - 0x97E5: 0xC025, - 0x97E6: 0xC026, - 0x97E7: 0xC027, - 0x97E8: 0xC028, - 0x97E9: 0xC029, - 0x97EA: 0xC02A, - 0x97EB: 0xC02B, - 0x97EC: 0xC02C, - 0x97ED: 0xC02D, - 0x97EE: 0xC02E, - 0x97EF: 0xC02F, - 0x97F0: 0xC030, - 0x97F1: 0xC031, - 0x97F2: 0xC032, - 0x97F3: 0xC033, - 0x97F4: 0xC034, - 0x97F5: 0xC035, - 0x97F6: 0xC036, - 0x97F7: 0xC037, - 0x97F8: 0xC038, - 0x97F9: 0xC039, - 0x97FA: 0xC03A, - 0x97FB: 0xC03B, - 0x97FC: 0xC03D, - 0x97FD: 0xC03E, - 0x97FE: 0xC03F, - 0x9841: 0xC040, - 0x9842: 0xC041, - 0x9843: 0xC042, - 0x9844: 0xC043, - 0x9845: 0xC044, - 0x9846: 0xC045, - 0x9847: 0xC046, - 0x9848: 0xC047, - 0x9849: 0xC048, - 0x984A: 0xC049, - 0x984B: 0xC04A, - 0x984C: 0xC04B, - 0x984D: 0xC04C, - 0x984E: 0xC04D, - 0x984F: 0xC04E, - 0x9850: 0xC04F, - 0x9851: 0xC050, - 0x9852: 0xC052, - 0x9853: 0xC053, - 0x9854: 0xC054, - 0x9855: 0xC055, - 0x9856: 0xC056, - 0x9857: 0xC057, - 0x9858: 0xC059, - 0x9859: 0xC05A, - 0x985A: 0xC05B, - 0x9861: 0xC05D, - 0x9862: 0xC05E, - 0x9863: 0xC05F, - 0x9864: 0xC061, - 0x9865: 0xC062, - 0x9866: 0xC063, - 0x9867: 0xC064, - 0x9868: 0xC065, - 0x9869: 0xC066, - 0x986A: 0xC067, - 0x986B: 0xC06A, - 0x986C: 0xC06B, - 0x986D: 0xC06C, - 0x986E: 0xC06D, - 0x986F: 0xC06E, - 0x9870: 0xC06F, - 0x9871: 0xC070, - 0x9872: 0xC071, - 0x9873: 0xC072, - 0x9874: 0xC073, - 0x9875: 0xC074, - 0x9876: 0xC075, - 0x9877: 0xC076, - 0x9878: 0xC077, - 0x9879: 0xC078, - 0x987A: 0xC079, - 0x9881: 0xC07A, - 0x9882: 0xC07B, - 0x9883: 0xC07C, - 0x9884: 0xC07D, - 0x9885: 0xC07E, - 0x9886: 0xC07F, - 0x9887: 0xC080, - 0x9888: 0xC081, - 0x9889: 0xC082, - 0x988A: 0xC083, - 0x988B: 0xC084, - 0x988C: 0xC085, - 0x988D: 0xC086, - 0x988E: 0xC087, - 0x988F: 0xC088, - 0x9890: 0xC089, - 0x9891: 0xC08A, - 0x9892: 0xC08B, - 0x9893: 0xC08C, - 0x9894: 0xC08D, - 0x9895: 0xC08E, - 0x9896: 0xC08F, - 0x9897: 0xC092, - 0x9898: 0xC093, - 0x9899: 0xC095, - 0x989A: 0xC096, - 0x989B: 0xC097, - 0x989C: 0xC099, - 0x989D: 0xC09A, - 0x989E: 0xC09B, - 0x989F: 0xC09C, - 0x98A0: 0xC09D, - 0x98A1: 0xC09E, - 0x98A2: 0xC09F, - 0x98A3: 0xC0A2, - 0x98A4: 0xC0A4, - 0x98A5: 0xC0A6, - 0x98A6: 0xC0A7, - 0x98A7: 0xC0A8, - 0x98A8: 0xC0A9, - 0x98A9: 0xC0AA, - 0x98AA: 0xC0AB, - 0x98AB: 0xC0AE, - 0x98AC: 0xC0B1, - 0x98AD: 0xC0B2, - 0x98AE: 0xC0B7, - 0x98AF: 0xC0B8, - 0x98B0: 0xC0B9, - 0x98B1: 0xC0BA, - 0x98B2: 0xC0BB, - 0x98B3: 0xC0BE, - 0x98B4: 0xC0C2, - 0x98B5: 0xC0C3, - 0x98B6: 0xC0C4, - 0x98B7: 0xC0C6, - 0x98B8: 0xC0C7, - 0x98B9: 0xC0CA, - 0x98BA: 0xC0CB, - 0x98BB: 0xC0CD, - 0x98BC: 0xC0CE, - 0x98BD: 0xC0CF, - 0x98BE: 0xC0D1, - 0x98BF: 0xC0D2, - 0x98C0: 0xC0D3, - 0x98C1: 0xC0D4, - 0x98C2: 0xC0D5, - 0x98C3: 0xC0D6, - 0x98C4: 0xC0D7, - 0x98C5: 0xC0DA, - 0x98C6: 0xC0DE, - 0x98C7: 0xC0DF, - 0x98C8: 0xC0E0, - 0x98C9: 0xC0E1, - 0x98CA: 0xC0E2, - 0x98CB: 0xC0E3, - 0x98CC: 0xC0E6, - 0x98CD: 0xC0E7, - 0x98CE: 0xC0E9, - 0x98CF: 0xC0EA, - 0x98D0: 0xC0EB, - 0x98D1: 0xC0ED, - 0x98D2: 0xC0EE, - 0x98D3: 0xC0EF, - 0x98D4: 0xC0F0, - 0x98D5: 0xC0F1, - 0x98D6: 0xC0F2, - 0x98D7: 0xC0F3, - 0x98D8: 0xC0F6, - 0x98D9: 0xC0F8, - 0x98DA: 0xC0FA, - 0x98DB: 0xC0FB, - 0x98DC: 0xC0FC, - 0x98DD: 0xC0FD, - 0x98DE: 0xC0FE, - 0x98DF: 0xC0FF, - 0x98E0: 0xC101, - 0x98E1: 0xC102, - 0x98E2: 0xC103, - 0x98E3: 0xC105, - 0x98E4: 0xC106, - 0x98E5: 0xC107, - 0x98E6: 0xC109, - 0x98E7: 0xC10A, - 0x98E8: 0xC10B, - 0x98E9: 0xC10C, - 0x98EA: 0xC10D, - 0x98EB: 0xC10E, - 0x98EC: 0xC10F, - 0x98ED: 0xC111, - 0x98EE: 0xC112, - 0x98EF: 0xC113, - 0x98F0: 0xC114, - 0x98F1: 0xC116, - 0x98F2: 0xC117, - 0x98F3: 0xC118, - 0x98F4: 0xC119, - 0x98F5: 0xC11A, - 0x98F6: 0xC11B, - 0x98F7: 0xC121, - 0x98F8: 0xC122, - 0x98F9: 0xC125, - 0x98FA: 0xC128, - 0x98FB: 0xC129, - 0x98FC: 0xC12A, - 0x98FD: 0xC12B, - 0x98FE: 0xC12E, - 0x9941: 0xC132, - 0x9942: 0xC133, - 0x9943: 0xC134, - 0x9944: 0xC135, - 0x9945: 0xC137, - 0x9946: 0xC13A, - 0x9947: 0xC13B, - 0x9948: 0xC13D, - 0x9949: 0xC13E, - 0x994A: 0xC13F, - 0x994B: 0xC141, - 0x994C: 0xC142, - 0x994D: 0xC143, - 0x994E: 0xC144, - 0x994F: 0xC145, - 0x9950: 0xC146, - 0x9951: 0xC147, - 0x9952: 0xC14A, - 0x9953: 0xC14E, - 0x9954: 0xC14F, - 0x9955: 0xC150, - 0x9956: 0xC151, - 0x9957: 0xC152, - 0x9958: 0xC153, - 0x9959: 0xC156, - 0x995A: 0xC157, - 0x9961: 0xC159, - 0x9962: 0xC15A, - 0x9963: 0xC15B, - 0x9964: 0xC15D, - 0x9965: 0xC15E, - 0x9966: 0xC15F, - 0x9967: 0xC160, - 0x9968: 0xC161, - 0x9969: 0xC162, - 0x996A: 0xC163, - 0x996B: 0xC166, - 0x996C: 0xC16A, - 0x996D: 0xC16B, - 0x996E: 0xC16C, - 0x996F: 0xC16D, - 0x9970: 0xC16E, - 0x9971: 0xC16F, - 0x9972: 0xC171, - 0x9973: 0xC172, - 0x9974: 0xC173, - 0x9975: 0xC175, - 0x9976: 0xC176, - 0x9977: 0xC177, - 0x9978: 0xC179, - 0x9979: 0xC17A, - 0x997A: 0xC17B, - 0x9981: 0xC17C, - 0x9982: 0xC17D, - 0x9983: 0xC17E, - 0x9984: 0xC17F, - 0x9985: 0xC180, - 0x9986: 0xC181, - 0x9987: 0xC182, - 0x9988: 0xC183, - 0x9989: 0xC184, - 0x998A: 0xC186, - 0x998B: 0xC187, - 0x998C: 0xC188, - 0x998D: 0xC189, - 0x998E: 0xC18A, - 0x998F: 0xC18B, - 0x9990: 0xC18F, - 0x9991: 0xC191, - 0x9992: 0xC192, - 0x9993: 0xC193, - 0x9994: 0xC195, - 0x9995: 0xC197, - 0x9996: 0xC198, - 0x9997: 0xC199, - 0x9998: 0xC19A, - 0x9999: 0xC19B, - 0x999A: 0xC19E, - 0x999B: 0xC1A0, - 0x999C: 0xC1A2, - 0x999D: 0xC1A3, - 0x999E: 0xC1A4, - 0x999F: 0xC1A6, - 0x99A0: 0xC1A7, - 0x99A1: 0xC1AA, - 0x99A2: 0xC1AB, - 0x99A3: 0xC1AD, - 0x99A4: 0xC1AE, - 0x99A5: 0xC1AF, - 0x99A6: 0xC1B1, - 0x99A7: 0xC1B2, - 0x99A8: 0xC1B3, - 0x99A9: 0xC1B4, - 0x99AA: 0xC1B5, - 0x99AB: 0xC1B6, - 0x99AC: 0xC1B7, - 0x99AD: 0xC1B8, - 0x99AE: 0xC1B9, - 0x99AF: 0xC1BA, - 0x99B0: 0xC1BB, - 0x99B1: 0xC1BC, - 0x99B2: 0xC1BE, - 0x99B3: 0xC1BF, - 0x99B4: 0xC1C0, - 0x99B5: 0xC1C1, - 0x99B6: 0xC1C2, - 0x99B7: 0xC1C3, - 0x99B8: 0xC1C5, - 0x99B9: 0xC1C6, - 0x99BA: 0xC1C7, - 0x99BB: 0xC1C9, - 0x99BC: 0xC1CA, - 0x99BD: 0xC1CB, - 0x99BE: 0xC1CD, - 0x99BF: 0xC1CE, - 0x99C0: 0xC1CF, - 0x99C1: 0xC1D0, - 0x99C2: 0xC1D1, - 0x99C3: 0xC1D2, - 0x99C4: 0xC1D3, - 0x99C5: 0xC1D5, - 0x99C6: 0xC1D6, - 0x99C7: 0xC1D9, - 0x99C8: 0xC1DA, - 0x99C9: 0xC1DB, - 0x99CA: 0xC1DC, - 0x99CB: 0xC1DD, - 0x99CC: 0xC1DE, - 0x99CD: 0xC1DF, - 0x99CE: 0xC1E1, - 0x99CF: 0xC1E2, - 0x99D0: 0xC1E3, - 0x99D1: 0xC1E5, - 0x99D2: 0xC1E6, - 0x99D3: 0xC1E7, - 0x99D4: 0xC1E9, - 0x99D5: 0xC1EA, - 0x99D6: 0xC1EB, - 0x99D7: 0xC1EC, - 0x99D8: 0xC1ED, - 0x99D9: 0xC1EE, - 0x99DA: 0xC1EF, - 0x99DB: 0xC1F2, - 0x99DC: 0xC1F4, - 0x99DD: 0xC1F5, - 0x99DE: 0xC1F6, - 0x99DF: 0xC1F7, - 0x99E0: 0xC1F8, - 0x99E1: 0xC1F9, - 0x99E2: 0xC1FA, - 0x99E3: 0xC1FB, - 0x99E4: 0xC1FE, - 0x99E5: 0xC1FF, - 0x99E6: 0xC201, - 0x99E7: 0xC202, - 0x99E8: 0xC203, - 0x99E9: 0xC205, - 0x99EA: 0xC206, - 0x99EB: 0xC207, - 0x99EC: 0xC208, - 0x99ED: 0xC209, - 0x99EE: 0xC20A, - 0x99EF: 0xC20B, - 0x99F0: 0xC20E, - 0x99F1: 0xC210, - 0x99F2: 0xC212, - 0x99F3: 0xC213, - 0x99F4: 0xC214, - 0x99F5: 0xC215, - 0x99F6: 0xC216, - 0x99F7: 0xC217, - 0x99F8: 0xC21A, - 0x99F9: 0xC21B, - 0x99FA: 0xC21D, - 0x99FB: 0xC21E, - 0x99FC: 0xC221, - 0x99FD: 0xC222, - 0x99FE: 0xC223, - 0x9A41: 0xC224, - 0x9A42: 0xC225, - 0x9A43: 0xC226, - 0x9A44: 0xC227, - 0x9A45: 0xC22A, - 0x9A46: 0xC22C, - 0x9A47: 0xC22E, - 0x9A48: 0xC230, - 0x9A49: 0xC233, - 0x9A4A: 0xC235, - 0x9A4B: 0xC236, - 0x9A4C: 0xC237, - 0x9A4D: 0xC238, - 0x9A4E: 0xC239, - 0x9A4F: 0xC23A, - 0x9A50: 0xC23B, - 0x9A51: 0xC23C, - 0x9A52: 0xC23D, - 0x9A53: 0xC23E, - 0x9A54: 0xC23F, - 0x9A55: 0xC240, - 0x9A56: 0xC241, - 0x9A57: 0xC242, - 0x9A58: 0xC243, - 0x9A59: 0xC244, - 0x9A5A: 0xC245, - 0x9A61: 0xC246, - 0x9A62: 0xC247, - 0x9A63: 0xC249, - 0x9A64: 0xC24A, - 0x9A65: 0xC24B, - 0x9A66: 0xC24C, - 0x9A67: 0xC24D, - 0x9A68: 0xC24E, - 0x9A69: 0xC24F, - 0x9A6A: 0xC252, - 0x9A6B: 0xC253, - 0x9A6C: 0xC255, - 0x9A6D: 0xC256, - 0x9A6E: 0xC257, - 0x9A6F: 0xC259, - 0x9A70: 0xC25A, - 0x9A71: 0xC25B, - 0x9A72: 0xC25C, - 0x9A73: 0xC25D, - 0x9A74: 0xC25E, - 0x9A75: 0xC25F, - 0x9A76: 0xC261, - 0x9A77: 0xC262, - 0x9A78: 0xC263, - 0x9A79: 0xC264, - 0x9A7A: 0xC266, - 0x9A81: 0xC267, - 0x9A82: 0xC268, - 0x9A83: 0xC269, - 0x9A84: 0xC26A, - 0x9A85: 0xC26B, - 0x9A86: 0xC26E, - 0x9A87: 0xC26F, - 0x9A88: 0xC271, - 0x9A89: 0xC272, - 0x9A8A: 0xC273, - 0x9A8B: 0xC275, - 0x9A8C: 0xC276, - 0x9A8D: 0xC277, - 0x9A8E: 0xC278, - 0x9A8F: 0xC279, - 0x9A90: 0xC27A, - 0x9A91: 0xC27B, - 0x9A92: 0xC27E, - 0x9A93: 0xC280, - 0x9A94: 0xC282, - 0x9A95: 0xC283, - 0x9A96: 0xC284, - 0x9A97: 0xC285, - 0x9A98: 0xC286, - 0x9A99: 0xC287, - 0x9A9A: 0xC28A, - 0x9A9B: 0xC28B, - 0x9A9C: 0xC28C, - 0x9A9D: 0xC28D, - 0x9A9E: 0xC28E, - 0x9A9F: 0xC28F, - 0x9AA0: 0xC291, - 0x9AA1: 0xC292, - 0x9AA2: 0xC293, - 0x9AA3: 0xC294, - 0x9AA4: 0xC295, - 0x9AA5: 0xC296, - 0x9AA6: 0xC297, - 0x9AA7: 0xC299, - 0x9AA8: 0xC29A, - 0x9AA9: 0xC29C, - 0x9AAA: 0xC29E, - 0x9AAB: 0xC29F, - 0x9AAC: 0xC2A0, - 0x9AAD: 0xC2A1, - 0x9AAE: 0xC2A2, - 0x9AAF: 0xC2A3, - 0x9AB0: 0xC2A6, - 0x9AB1: 0xC2A7, - 0x9AB2: 0xC2A9, - 0x9AB3: 0xC2AA, - 0x9AB4: 0xC2AB, - 0x9AB5: 0xC2AE, - 0x9AB6: 0xC2AF, - 0x9AB7: 0xC2B0, - 0x9AB8: 0xC2B1, - 0x9AB9: 0xC2B2, - 0x9ABA: 0xC2B3, - 0x9ABB: 0xC2B6, - 0x9ABC: 0xC2B8, - 0x9ABD: 0xC2BA, - 0x9ABE: 0xC2BB, - 0x9ABF: 0xC2BC, - 0x9AC0: 0xC2BD, - 0x9AC1: 0xC2BE, - 0x9AC2: 0xC2BF, - 0x9AC3: 0xC2C0, - 0x9AC4: 0xC2C1, - 0x9AC5: 0xC2C2, - 0x9AC6: 0xC2C3, - 0x9AC7: 0xC2C4, - 0x9AC8: 0xC2C5, - 0x9AC9: 0xC2C6, - 0x9ACA: 0xC2C7, - 0x9ACB: 0xC2C8, - 0x9ACC: 0xC2C9, - 0x9ACD: 0xC2CA, - 0x9ACE: 0xC2CB, - 0x9ACF: 0xC2CC, - 0x9AD0: 0xC2CD, - 0x9AD1: 0xC2CE, - 0x9AD2: 0xC2CF, - 0x9AD3: 0xC2D0, - 0x9AD4: 0xC2D1, - 0x9AD5: 0xC2D2, - 0x9AD6: 0xC2D3, - 0x9AD7: 0xC2D4, - 0x9AD8: 0xC2D5, - 0x9AD9: 0xC2D6, - 0x9ADA: 0xC2D7, - 0x9ADB: 0xC2D8, - 0x9ADC: 0xC2D9, - 0x9ADD: 0xC2DA, - 0x9ADE: 0xC2DB, - 0x9ADF: 0xC2DE, - 0x9AE0: 0xC2DF, - 0x9AE1: 0xC2E1, - 0x9AE2: 0xC2E2, - 0x9AE3: 0xC2E5, - 0x9AE4: 0xC2E6, - 0x9AE5: 0xC2E7, - 0x9AE6: 0xC2E8, - 0x9AE7: 0xC2E9, - 0x9AE8: 0xC2EA, - 0x9AE9: 0xC2EE, - 0x9AEA: 0xC2F0, - 0x9AEB: 0xC2F2, - 0x9AEC: 0xC2F3, - 0x9AED: 0xC2F4, - 0x9AEE: 0xC2F5, - 0x9AEF: 0xC2F7, - 0x9AF0: 0xC2FA, - 0x9AF1: 0xC2FD, - 0x9AF2: 0xC2FE, - 0x9AF3: 0xC2FF, - 0x9AF4: 0xC301, - 0x9AF5: 0xC302, - 0x9AF6: 0xC303, - 0x9AF7: 0xC304, - 0x9AF8: 0xC305, - 0x9AF9: 0xC306, - 0x9AFA: 0xC307, - 0x9AFB: 0xC30A, - 0x9AFC: 0xC30B, - 0x9AFD: 0xC30E, - 0x9AFE: 0xC30F, - 0x9B41: 0xC310, - 0x9B42: 0xC311, - 0x9B43: 0xC312, - 0x9B44: 0xC316, - 0x9B45: 0xC317, - 0x9B46: 0xC319, - 0x9B47: 0xC31A, - 0x9B48: 0xC31B, - 0x9B49: 0xC31D, - 0x9B4A: 0xC31E, - 0x9B4B: 0xC31F, - 0x9B4C: 0xC320, - 0x9B4D: 0xC321, - 0x9B4E: 0xC322, - 0x9B4F: 0xC323, - 0x9B50: 0xC326, - 0x9B51: 0xC327, - 0x9B52: 0xC32A, - 0x9B53: 0xC32B, - 0x9B54: 0xC32C, - 0x9B55: 0xC32D, - 0x9B56: 0xC32E, - 0x9B57: 0xC32F, - 0x9B58: 0xC330, - 0x9B59: 0xC331, - 0x9B5A: 0xC332, - 0x9B61: 0xC333, - 0x9B62: 0xC334, - 0x9B63: 0xC335, - 0x9B64: 0xC336, - 0x9B65: 0xC337, - 0x9B66: 0xC338, - 0x9B67: 0xC339, - 0x9B68: 0xC33A, - 0x9B69: 0xC33B, - 0x9B6A: 0xC33C, - 0x9B6B: 0xC33D, - 0x9B6C: 0xC33E, - 0x9B6D: 0xC33F, - 0x9B6E: 0xC340, - 0x9B6F: 0xC341, - 0x9B70: 0xC342, - 0x9B71: 0xC343, - 0x9B72: 0xC344, - 0x9B73: 0xC346, - 0x9B74: 0xC347, - 0x9B75: 0xC348, - 0x9B76: 0xC349, - 0x9B77: 0xC34A, - 0x9B78: 0xC34B, - 0x9B79: 0xC34C, - 0x9B7A: 0xC34D, - 0x9B81: 0xC34E, - 0x9B82: 0xC34F, - 0x9B83: 0xC350, - 0x9B84: 0xC351, - 0x9B85: 0xC352, - 0x9B86: 0xC353, - 0x9B87: 0xC354, - 0x9B88: 0xC355, - 0x9B89: 0xC356, - 0x9B8A: 0xC357, - 0x9B8B: 0xC358, - 0x9B8C: 0xC359, - 0x9B8D: 0xC35A, - 0x9B8E: 0xC35B, - 0x9B8F: 0xC35C, - 0x9B90: 0xC35D, - 0x9B91: 0xC35E, - 0x9B92: 0xC35F, - 0x9B93: 0xC360, - 0x9B94: 0xC361, - 0x9B95: 0xC362, - 0x9B96: 0xC363, - 0x9B97: 0xC364, - 0x9B98: 0xC365, - 0x9B99: 0xC366, - 0x9B9A: 0xC367, - 0x9B9B: 0xC36A, - 0x9B9C: 0xC36B, - 0x9B9D: 0xC36D, - 0x9B9E: 0xC36E, - 0x9B9F: 0xC36F, - 0x9BA0: 0xC371, - 0x9BA1: 0xC373, - 0x9BA2: 0xC374, - 0x9BA3: 0xC375, - 0x9BA4: 0xC376, - 0x9BA5: 0xC377, - 0x9BA6: 0xC37A, - 0x9BA7: 0xC37B, - 0x9BA8: 0xC37E, - 0x9BA9: 0xC37F, - 0x9BAA: 0xC380, - 0x9BAB: 0xC381, - 0x9BAC: 0xC382, - 0x9BAD: 0xC383, - 0x9BAE: 0xC385, - 0x9BAF: 0xC386, - 0x9BB0: 0xC387, - 0x9BB1: 0xC389, - 0x9BB2: 0xC38A, - 0x9BB3: 0xC38B, - 0x9BB4: 0xC38D, - 0x9BB5: 0xC38E, - 0x9BB6: 0xC38F, - 0x9BB7: 0xC390, - 0x9BB8: 0xC391, - 0x9BB9: 0xC392, - 0x9BBA: 0xC393, - 0x9BBB: 0xC394, - 0x9BBC: 0xC395, - 0x9BBD: 0xC396, - 0x9BBE: 0xC397, - 0x9BBF: 0xC398, - 0x9BC0: 0xC399, - 0x9BC1: 0xC39A, - 0x9BC2: 0xC39B, - 0x9BC3: 0xC39C, - 0x9BC4: 0xC39D, - 0x9BC5: 0xC39E, - 0x9BC6: 0xC39F, - 0x9BC7: 0xC3A0, - 0x9BC8: 0xC3A1, - 0x9BC9: 0xC3A2, - 0x9BCA: 0xC3A3, - 0x9BCB: 0xC3A4, - 0x9BCC: 0xC3A5, - 0x9BCD: 0xC3A6, - 0x9BCE: 0xC3A7, - 0x9BCF: 0xC3A8, - 0x9BD0: 0xC3A9, - 0x9BD1: 0xC3AA, - 0x9BD2: 0xC3AB, - 0x9BD3: 0xC3AC, - 0x9BD4: 0xC3AD, - 0x9BD5: 0xC3AE, - 0x9BD6: 0xC3AF, - 0x9BD7: 0xC3B0, - 0x9BD8: 0xC3B1, - 0x9BD9: 0xC3B2, - 0x9BDA: 0xC3B3, - 0x9BDB: 0xC3B4, - 0x9BDC: 0xC3B5, - 0x9BDD: 0xC3B6, - 0x9BDE: 0xC3B7, - 0x9BDF: 0xC3B8, - 0x9BE0: 0xC3B9, - 0x9BE1: 0xC3BA, - 0x9BE2: 0xC3BB, - 0x9BE3: 0xC3BC, - 0x9BE4: 0xC3BD, - 0x9BE5: 0xC3BE, - 0x9BE6: 0xC3BF, - 0x9BE7: 0xC3C1, - 0x9BE8: 0xC3C2, - 0x9BE9: 0xC3C3, - 0x9BEA: 0xC3C4, - 0x9BEB: 0xC3C5, - 0x9BEC: 0xC3C6, - 0x9BED: 0xC3C7, - 0x9BEE: 0xC3C8, - 0x9BEF: 0xC3C9, - 0x9BF0: 0xC3CA, - 0x9BF1: 0xC3CB, - 0x9BF2: 0xC3CC, - 0x9BF3: 0xC3CD, - 0x9BF4: 0xC3CE, - 0x9BF5: 0xC3CF, - 0x9BF6: 0xC3D0, - 0x9BF7: 0xC3D1, - 0x9BF8: 0xC3D2, - 0x9BF9: 0xC3D3, - 0x9BFA: 0xC3D4, - 0x9BFB: 0xC3D5, - 0x9BFC: 0xC3D6, - 0x9BFD: 0xC3D7, - 0x9BFE: 0xC3DA, - 0x9C41: 0xC3DB, - 0x9C42: 0xC3DD, - 0x9C43: 0xC3DE, - 0x9C44: 0xC3E1, - 0x9C45: 0xC3E3, - 0x9C46: 0xC3E4, - 0x9C47: 0xC3E5, - 0x9C48: 0xC3E6, - 0x9C49: 0xC3E7, - 0x9C4A: 0xC3EA, - 0x9C4B: 0xC3EB, - 0x9C4C: 0xC3EC, - 0x9C4D: 0xC3EE, - 0x9C4E: 0xC3EF, - 0x9C4F: 0xC3F0, - 0x9C50: 0xC3F1, - 0x9C51: 0xC3F2, - 0x9C52: 0xC3F3, - 0x9C53: 0xC3F6, - 0x9C54: 0xC3F7, - 0x9C55: 0xC3F9, - 0x9C56: 0xC3FA, - 0x9C57: 0xC3FB, - 0x9C58: 0xC3FC, - 0x9C59: 0xC3FD, - 0x9C5A: 0xC3FE, - 0x9C61: 0xC3FF, - 0x9C62: 0xC400, - 0x9C63: 0xC401, - 0x9C64: 0xC402, - 0x9C65: 0xC403, - 0x9C66: 0xC404, - 0x9C67: 0xC405, - 0x9C68: 0xC406, - 0x9C69: 0xC407, - 0x9C6A: 0xC409, - 0x9C6B: 0xC40A, - 0x9C6C: 0xC40B, - 0x9C6D: 0xC40C, - 0x9C6E: 0xC40D, - 0x9C6F: 0xC40E, - 0x9C70: 0xC40F, - 0x9C71: 0xC411, - 0x9C72: 0xC412, - 0x9C73: 0xC413, - 0x9C74: 0xC414, - 0x9C75: 0xC415, - 0x9C76: 0xC416, - 0x9C77: 0xC417, - 0x9C78: 0xC418, - 0x9C79: 0xC419, - 0x9C7A: 0xC41A, - 0x9C81: 0xC41B, - 0x9C82: 0xC41C, - 0x9C83: 0xC41D, - 0x9C84: 0xC41E, - 0x9C85: 0xC41F, - 0x9C86: 0xC420, - 0x9C87: 0xC421, - 0x9C88: 0xC422, - 0x9C89: 0xC423, - 0x9C8A: 0xC425, - 0x9C8B: 0xC426, - 0x9C8C: 0xC427, - 0x9C8D: 0xC428, - 0x9C8E: 0xC429, - 0x9C8F: 0xC42A, - 0x9C90: 0xC42B, - 0x9C91: 0xC42D, - 0x9C92: 0xC42E, - 0x9C93: 0xC42F, - 0x9C94: 0xC431, - 0x9C95: 0xC432, - 0x9C96: 0xC433, - 0x9C97: 0xC435, - 0x9C98: 0xC436, - 0x9C99: 0xC437, - 0x9C9A: 0xC438, - 0x9C9B: 0xC439, - 0x9C9C: 0xC43A, - 0x9C9D: 0xC43B, - 0x9C9E: 0xC43E, - 0x9C9F: 0xC43F, - 0x9CA0: 0xC440, - 0x9CA1: 0xC441, - 0x9CA2: 0xC442, - 0x9CA3: 0xC443, - 0x9CA4: 0xC444, - 0x9CA5: 0xC445, - 0x9CA6: 0xC446, - 0x9CA7: 0xC447, - 0x9CA8: 0xC449, - 0x9CA9: 0xC44A, - 0x9CAA: 0xC44B, - 0x9CAB: 0xC44C, - 0x9CAC: 0xC44D, - 0x9CAD: 0xC44E, - 0x9CAE: 0xC44F, - 0x9CAF: 0xC450, - 0x9CB0: 0xC451, - 0x9CB1: 0xC452, - 0x9CB2: 0xC453, - 0x9CB3: 0xC454, - 0x9CB4: 0xC455, - 0x9CB5: 0xC456, - 0x9CB6: 0xC457, - 0x9CB7: 0xC458, - 0x9CB8: 0xC459, - 0x9CB9: 0xC45A, - 0x9CBA: 0xC45B, - 0x9CBB: 0xC45C, - 0x9CBC: 0xC45D, - 0x9CBD: 0xC45E, - 0x9CBE: 0xC45F, - 0x9CBF: 0xC460, - 0x9CC0: 0xC461, - 0x9CC1: 0xC462, - 0x9CC2: 0xC463, - 0x9CC3: 0xC466, - 0x9CC4: 0xC467, - 0x9CC5: 0xC469, - 0x9CC6: 0xC46A, - 0x9CC7: 0xC46B, - 0x9CC8: 0xC46D, - 0x9CC9: 0xC46E, - 0x9CCA: 0xC46F, - 0x9CCB: 0xC470, - 0x9CCC: 0xC471, - 0x9CCD: 0xC472, - 0x9CCE: 0xC473, - 0x9CCF: 0xC476, - 0x9CD0: 0xC477, - 0x9CD1: 0xC478, - 0x9CD2: 0xC47A, - 0x9CD3: 0xC47B, - 0x9CD4: 0xC47C, - 0x9CD5: 0xC47D, - 0x9CD6: 0xC47E, - 0x9CD7: 0xC47F, - 0x9CD8: 0xC481, - 0x9CD9: 0xC482, - 0x9CDA: 0xC483, - 0x9CDB: 0xC484, - 0x9CDC: 0xC485, - 0x9CDD: 0xC486, - 0x9CDE: 0xC487, - 0x9CDF: 0xC488, - 0x9CE0: 0xC489, - 0x9CE1: 0xC48A, - 0x9CE2: 0xC48B, - 0x9CE3: 0xC48C, - 0x9CE4: 0xC48D, - 0x9CE5: 0xC48E, - 0x9CE6: 0xC48F, - 0x9CE7: 0xC490, - 0x9CE8: 0xC491, - 0x9CE9: 0xC492, - 0x9CEA: 0xC493, - 0x9CEB: 0xC495, - 0x9CEC: 0xC496, - 0x9CED: 0xC497, - 0x9CEE: 0xC498, - 0x9CEF: 0xC499, - 0x9CF0: 0xC49A, - 0x9CF1: 0xC49B, - 0x9CF2: 0xC49D, - 0x9CF3: 0xC49E, - 0x9CF4: 0xC49F, - 0x9CF5: 0xC4A0, - 0x9CF6: 0xC4A1, - 0x9CF7: 0xC4A2, - 0x9CF8: 0xC4A3, - 0x9CF9: 0xC4A4, - 0x9CFA: 0xC4A5, - 0x9CFB: 0xC4A6, - 0x9CFC: 0xC4A7, - 0x9CFD: 0xC4A8, - 0x9CFE: 0xC4A9, - 0x9D41: 0xC4AA, - 0x9D42: 0xC4AB, - 0x9D43: 0xC4AC, - 0x9D44: 0xC4AD, - 0x9D45: 0xC4AE, - 0x9D46: 0xC4AF, - 0x9D47: 0xC4B0, - 0x9D48: 0xC4B1, - 0x9D49: 0xC4B2, - 0x9D4A: 0xC4B3, - 0x9D4B: 0xC4B4, - 0x9D4C: 0xC4B5, - 0x9D4D: 0xC4B6, - 0x9D4E: 0xC4B7, - 0x9D4F: 0xC4B9, - 0x9D50: 0xC4BA, - 0x9D51: 0xC4BB, - 0x9D52: 0xC4BD, - 0x9D53: 0xC4BE, - 0x9D54: 0xC4BF, - 0x9D55: 0xC4C0, - 0x9D56: 0xC4C1, - 0x9D57: 0xC4C2, - 0x9D58: 0xC4C3, - 0x9D59: 0xC4C4, - 0x9D5A: 0xC4C5, - 0x9D61: 0xC4C6, - 0x9D62: 0xC4C7, - 0x9D63: 0xC4C8, - 0x9D64: 0xC4C9, - 0x9D65: 0xC4CA, - 0x9D66: 0xC4CB, - 0x9D67: 0xC4CC, - 0x9D68: 0xC4CD, - 0x9D69: 0xC4CE, - 0x9D6A: 0xC4CF, - 0x9D6B: 0xC4D0, - 0x9D6C: 0xC4D1, - 0x9D6D: 0xC4D2, - 0x9D6E: 0xC4D3, - 0x9D6F: 0xC4D4, - 0x9D70: 0xC4D5, - 0x9D71: 0xC4D6, - 0x9D72: 0xC4D7, - 0x9D73: 0xC4D8, - 0x9D74: 0xC4D9, - 0x9D75: 0xC4DA, - 0x9D76: 0xC4DB, - 0x9D77: 0xC4DC, - 0x9D78: 0xC4DD, - 0x9D79: 0xC4DE, - 0x9D7A: 0xC4DF, - 0x9D81: 0xC4E0, - 0x9D82: 0xC4E1, - 0x9D83: 0xC4E2, - 0x9D84: 0xC4E3, - 0x9D85: 0xC4E4, - 0x9D86: 0xC4E5, - 0x9D87: 0xC4E6, - 0x9D88: 0xC4E7, - 0x9D89: 0xC4E8, - 0x9D8A: 0xC4EA, - 0x9D8B: 0xC4EB, - 0x9D8C: 0xC4EC, - 0x9D8D: 0xC4ED, - 0x9D8E: 0xC4EE, - 0x9D8F: 0xC4EF, - 0x9D90: 0xC4F2, - 0x9D91: 0xC4F3, - 0x9D92: 0xC4F5, - 0x9D93: 0xC4F6, - 0x9D94: 0xC4F7, - 0x9D95: 0xC4F9, - 0x9D96: 0xC4FB, - 0x9D97: 0xC4FC, - 0x9D98: 0xC4FD, - 0x9D99: 0xC4FE, - 0x9D9A: 0xC502, - 0x9D9B: 0xC503, - 0x9D9C: 0xC504, - 0x9D9D: 0xC505, - 0x9D9E: 0xC506, - 0x9D9F: 0xC507, - 0x9DA0: 0xC508, - 0x9DA1: 0xC509, - 0x9DA2: 0xC50A, - 0x9DA3: 0xC50B, - 0x9DA4: 0xC50D, - 0x9DA5: 0xC50E, - 0x9DA6: 0xC50F, - 0x9DA7: 0xC511, - 0x9DA8: 0xC512, - 0x9DA9: 0xC513, - 0x9DAA: 0xC515, - 0x9DAB: 0xC516, - 0x9DAC: 0xC517, - 0x9DAD: 0xC518, - 0x9DAE: 0xC519, - 0x9DAF: 0xC51A, - 0x9DB0: 0xC51B, - 0x9DB1: 0xC51D, - 0x9DB2: 0xC51E, - 0x9DB3: 0xC51F, - 0x9DB4: 0xC520, - 0x9DB5: 0xC521, - 0x9DB6: 0xC522, - 0x9DB7: 0xC523, - 0x9DB8: 0xC524, - 0x9DB9: 0xC525, - 0x9DBA: 0xC526, - 0x9DBB: 0xC527, - 0x9DBC: 0xC52A, - 0x9DBD: 0xC52B, - 0x9DBE: 0xC52D, - 0x9DBF: 0xC52E, - 0x9DC0: 0xC52F, - 0x9DC1: 0xC531, - 0x9DC2: 0xC532, - 0x9DC3: 0xC533, - 0x9DC4: 0xC534, - 0x9DC5: 0xC535, - 0x9DC6: 0xC536, - 0x9DC7: 0xC537, - 0x9DC8: 0xC53A, - 0x9DC9: 0xC53C, - 0x9DCA: 0xC53E, - 0x9DCB: 0xC53F, - 0x9DCC: 0xC540, - 0x9DCD: 0xC541, - 0x9DCE: 0xC542, - 0x9DCF: 0xC543, - 0x9DD0: 0xC546, - 0x9DD1: 0xC547, - 0x9DD2: 0xC54B, - 0x9DD3: 0xC54F, - 0x9DD4: 0xC550, - 0x9DD5: 0xC551, - 0x9DD6: 0xC552, - 0x9DD7: 0xC556, - 0x9DD8: 0xC55A, - 0x9DD9: 0xC55B, - 0x9DDA: 0xC55C, - 0x9DDB: 0xC55F, - 0x9DDC: 0xC562, - 0x9DDD: 0xC563, - 0x9DDE: 0xC565, - 0x9DDF: 0xC566, - 0x9DE0: 0xC567, - 0x9DE1: 0xC569, - 0x9DE2: 0xC56A, - 0x9DE3: 0xC56B, - 0x9DE4: 0xC56C, - 0x9DE5: 0xC56D, - 0x9DE6: 0xC56E, - 0x9DE7: 0xC56F, - 0x9DE8: 0xC572, - 0x9DE9: 0xC576, - 0x9DEA: 0xC577, - 0x9DEB: 0xC578, - 0x9DEC: 0xC579, - 0x9DED: 0xC57A, - 0x9DEE: 0xC57B, - 0x9DEF: 0xC57E, - 0x9DF0: 0xC57F, - 0x9DF1: 0xC581, - 0x9DF2: 0xC582, - 0x9DF3: 0xC583, - 0x9DF4: 0xC585, - 0x9DF5: 0xC586, - 0x9DF6: 0xC588, - 0x9DF7: 0xC589, - 0x9DF8: 0xC58A, - 0x9DF9: 0xC58B, - 0x9DFA: 0xC58E, - 0x9DFB: 0xC590, - 0x9DFC: 0xC592, - 0x9DFD: 0xC593, - 0x9DFE: 0xC594, - 0x9E41: 0xC596, - 0x9E42: 0xC599, - 0x9E43: 0xC59A, - 0x9E44: 0xC59B, - 0x9E45: 0xC59D, - 0x9E46: 0xC59E, - 0x9E47: 0xC59F, - 0x9E48: 0xC5A1, - 0x9E49: 0xC5A2, - 0x9E4A: 0xC5A3, - 0x9E4B: 0xC5A4, - 0x9E4C: 0xC5A5, - 0x9E4D: 0xC5A6, - 0x9E4E: 0xC5A7, - 0x9E4F: 0xC5A8, - 0x9E50: 0xC5AA, - 0x9E51: 0xC5AB, - 0x9E52: 0xC5AC, - 0x9E53: 0xC5AD, - 0x9E54: 0xC5AE, - 0x9E55: 0xC5AF, - 0x9E56: 0xC5B0, - 0x9E57: 0xC5B1, - 0x9E58: 0xC5B2, - 0x9E59: 0xC5B3, - 0x9E5A: 0xC5B6, - 0x9E61: 0xC5B7, - 0x9E62: 0xC5BA, - 0x9E63: 0xC5BF, - 0x9E64: 0xC5C0, - 0x9E65: 0xC5C1, - 0x9E66: 0xC5C2, - 0x9E67: 0xC5C3, - 0x9E68: 0xC5CB, - 0x9E69: 0xC5CD, - 0x9E6A: 0xC5CF, - 0x9E6B: 0xC5D2, - 0x9E6C: 0xC5D3, - 0x9E6D: 0xC5D5, - 0x9E6E: 0xC5D6, - 0x9E6F: 0xC5D7, - 0x9E70: 0xC5D9, - 0x9E71: 0xC5DA, - 0x9E72: 0xC5DB, - 0x9E73: 0xC5DC, - 0x9E74: 0xC5DD, - 0x9E75: 0xC5DE, - 0x9E76: 0xC5DF, - 0x9E77: 0xC5E2, - 0x9E78: 0xC5E4, - 0x9E79: 0xC5E6, - 0x9E7A: 0xC5E7, - 0x9E81: 0xC5E8, - 0x9E82: 0xC5E9, - 0x9E83: 0xC5EA, - 0x9E84: 0xC5EB, - 0x9E85: 0xC5EF, - 0x9E86: 0xC5F1, - 0x9E87: 0xC5F2, - 0x9E88: 0xC5F3, - 0x9E89: 0xC5F5, - 0x9E8A: 0xC5F8, - 0x9E8B: 0xC5F9, - 0x9E8C: 0xC5FA, - 0x9E8D: 0xC5FB, - 0x9E8E: 0xC602, - 0x9E8F: 0xC603, - 0x9E90: 0xC604, - 0x9E91: 0xC609, - 0x9E92: 0xC60A, - 0x9E93: 0xC60B, - 0x9E94: 0xC60D, - 0x9E95: 0xC60E, - 0x9E96: 0xC60F, - 0x9E97: 0xC611, - 0x9E98: 0xC612, - 0x9E99: 0xC613, - 0x9E9A: 0xC614, - 0x9E9B: 0xC615, - 0x9E9C: 0xC616, - 0x9E9D: 0xC617, - 0x9E9E: 0xC61A, - 0x9E9F: 0xC61D, - 0x9EA0: 0xC61E, - 0x9EA1: 0xC61F, - 0x9EA2: 0xC620, - 0x9EA3: 0xC621, - 0x9EA4: 0xC622, - 0x9EA5: 0xC623, - 0x9EA6: 0xC626, - 0x9EA7: 0xC627, - 0x9EA8: 0xC629, - 0x9EA9: 0xC62A, - 0x9EAA: 0xC62B, - 0x9EAB: 0xC62F, - 0x9EAC: 0xC631, - 0x9EAD: 0xC632, - 0x9EAE: 0xC636, - 0x9EAF: 0xC638, - 0x9EB0: 0xC63A, - 0x9EB1: 0xC63C, - 0x9EB2: 0xC63D, - 0x9EB3: 0xC63E, - 0x9EB4: 0xC63F, - 0x9EB5: 0xC642, - 0x9EB6: 0xC643, - 0x9EB7: 0xC645, - 0x9EB8: 0xC646, - 0x9EB9: 0xC647, - 0x9EBA: 0xC649, - 0x9EBB: 0xC64A, - 0x9EBC: 0xC64B, - 0x9EBD: 0xC64C, - 0x9EBE: 0xC64D, - 0x9EBF: 0xC64E, - 0x9EC0: 0xC64F, - 0x9EC1: 0xC652, - 0x9EC2: 0xC656, - 0x9EC3: 0xC657, - 0x9EC4: 0xC658, - 0x9EC5: 0xC659, - 0x9EC6: 0xC65A, - 0x9EC7: 0xC65B, - 0x9EC8: 0xC65E, - 0x9EC9: 0xC65F, - 0x9ECA: 0xC661, - 0x9ECB: 0xC662, - 0x9ECC: 0xC663, - 0x9ECD: 0xC664, - 0x9ECE: 0xC665, - 0x9ECF: 0xC666, - 0x9ED0: 0xC667, - 0x9ED1: 0xC668, - 0x9ED2: 0xC669, - 0x9ED3: 0xC66A, - 0x9ED4: 0xC66B, - 0x9ED5: 0xC66D, - 0x9ED6: 0xC66E, - 0x9ED7: 0xC670, - 0x9ED8: 0xC672, - 0x9ED9: 0xC673, - 0x9EDA: 0xC674, - 0x9EDB: 0xC675, - 0x9EDC: 0xC676, - 0x9EDD: 0xC677, - 0x9EDE: 0xC67A, - 0x9EDF: 0xC67B, - 0x9EE0: 0xC67D, - 0x9EE1: 0xC67E, - 0x9EE2: 0xC67F, - 0x9EE3: 0xC681, - 0x9EE4: 0xC682, - 0x9EE5: 0xC683, - 0x9EE6: 0xC684, - 0x9EE7: 0xC685, - 0x9EE8: 0xC686, - 0x9EE9: 0xC687, - 0x9EEA: 0xC68A, - 0x9EEB: 0xC68C, - 0x9EEC: 0xC68E, - 0x9EED: 0xC68F, - 0x9EEE: 0xC690, - 0x9EEF: 0xC691, - 0x9EF0: 0xC692, - 0x9EF1: 0xC693, - 0x9EF2: 0xC696, - 0x9EF3: 0xC697, - 0x9EF4: 0xC699, - 0x9EF5: 0xC69A, - 0x9EF6: 0xC69B, - 0x9EF7: 0xC69D, - 0x9EF8: 0xC69E, - 0x9EF9: 0xC69F, - 0x9EFA: 0xC6A0, - 0x9EFB: 0xC6A1, - 0x9EFC: 0xC6A2, - 0x9EFD: 0xC6A3, - 0x9EFE: 0xC6A6, - 0x9F41: 0xC6A8, - 0x9F42: 0xC6AA, - 0x9F43: 0xC6AB, - 0x9F44: 0xC6AC, - 0x9F45: 0xC6AD, - 0x9F46: 0xC6AE, - 0x9F47: 0xC6AF, - 0x9F48: 0xC6B2, - 0x9F49: 0xC6B3, - 0x9F4A: 0xC6B5, - 0x9F4B: 0xC6B6, - 0x9F4C: 0xC6B7, - 0x9F4D: 0xC6BB, - 0x9F4E: 0xC6BC, - 0x9F4F: 0xC6BD, - 0x9F50: 0xC6BE, - 0x9F51: 0xC6BF, - 0x9F52: 0xC6C2, - 0x9F53: 0xC6C4, - 0x9F54: 0xC6C6, - 0x9F55: 0xC6C7, - 0x9F56: 0xC6C8, - 0x9F57: 0xC6C9, - 0x9F58: 0xC6CA, - 0x9F59: 0xC6CB, - 0x9F5A: 0xC6CE, - 0x9F61: 0xC6CF, - 0x9F62: 0xC6D1, - 0x9F63: 0xC6D2, - 0x9F64: 0xC6D3, - 0x9F65: 0xC6D5, - 0x9F66: 0xC6D6, - 0x9F67: 0xC6D7, - 0x9F68: 0xC6D8, - 0x9F69: 0xC6D9, - 0x9F6A: 0xC6DA, - 0x9F6B: 0xC6DB, - 0x9F6C: 0xC6DE, - 0x9F6D: 0xC6DF, - 0x9F6E: 0xC6E2, - 0x9F6F: 0xC6E3, - 0x9F70: 0xC6E4, - 0x9F71: 0xC6E5, - 0x9F72: 0xC6E6, - 0x9F73: 0xC6E7, - 0x9F74: 0xC6EA, - 0x9F75: 0xC6EB, - 0x9F76: 0xC6ED, - 0x9F77: 0xC6EE, - 0x9F78: 0xC6EF, - 0x9F79: 0xC6F1, - 0x9F7A: 0xC6F2, - 0x9F81: 0xC6F3, - 0x9F82: 0xC6F4, - 0x9F83: 0xC6F5, - 0x9F84: 0xC6F6, - 0x9F85: 0xC6F7, - 0x9F86: 0xC6FA, - 0x9F87: 0xC6FB, - 0x9F88: 0xC6FC, - 0x9F89: 0xC6FE, - 0x9F8A: 0xC6FF, - 0x9F8B: 0xC700, - 0x9F8C: 0xC701, - 0x9F8D: 0xC702, - 0x9F8E: 0xC703, - 0x9F8F: 0xC706, - 0x9F90: 0xC707, - 0x9F91: 0xC709, - 0x9F92: 0xC70A, - 0x9F93: 0xC70B, - 0x9F94: 0xC70D, - 0x9F95: 0xC70E, - 0x9F96: 0xC70F, - 0x9F97: 0xC710, - 0x9F98: 0xC711, - 0x9F99: 0xC712, - 0x9F9A: 0xC713, - 0x9F9B: 0xC716, - 0x9F9C: 0xC718, - 0x9F9D: 0xC71A, - 0x9F9E: 0xC71B, - 0x9F9F: 0xC71C, - 0x9FA0: 0xC71D, - 0x9FA1: 0xC71E, - 0x9FA2: 0xC71F, - 0x9FA3: 0xC722, - 0x9FA4: 0xC723, - 0x9FA5: 0xC725, - 0x9FA6: 0xC726, - 0x9FA7: 0xC727, - 0x9FA8: 0xC729, - 0x9FA9: 0xC72A, - 0x9FAA: 0xC72B, - 0x9FAB: 0xC72C, - 0x9FAC: 0xC72D, - 0x9FAD: 0xC72E, - 0x9FAE: 0xC72F, - 0x9FAF: 0xC732, - 0x9FB0: 0xC734, - 0x9FB1: 0xC736, - 0x9FB2: 0xC738, - 0x9FB3: 0xC739, - 0x9FB4: 0xC73A, - 0x9FB5: 0xC73B, - 0x9FB6: 0xC73E, - 0x9FB7: 0xC73F, - 0x9FB8: 0xC741, - 0x9FB9: 0xC742, - 0x9FBA: 0xC743, - 0x9FBB: 0xC745, - 0x9FBC: 0xC746, - 0x9FBD: 0xC747, - 0x9FBE: 0xC748, - 0x9FBF: 0xC749, - 0x9FC0: 0xC74B, - 0x9FC1: 0xC74E, - 0x9FC2: 0xC750, - 0x9FC3: 0xC759, - 0x9FC4: 0xC75A, - 0x9FC5: 0xC75B, - 0x9FC6: 0xC75D, - 0x9FC7: 0xC75E, - 0x9FC8: 0xC75F, - 0x9FC9: 0xC761, - 0x9FCA: 0xC762, - 0x9FCB: 0xC763, - 0x9FCC: 0xC764, - 0x9FCD: 0xC765, - 0x9FCE: 0xC766, - 0x9FCF: 0xC767, - 0x9FD0: 0xC769, - 0x9FD1: 0xC76A, - 0x9FD2: 0xC76C, - 0x9FD3: 0xC76D, - 0x9FD4: 0xC76E, - 0x9FD5: 0xC76F, - 0x9FD6: 0xC770, - 0x9FD7: 0xC771, - 0x9FD8: 0xC772, - 0x9FD9: 0xC773, - 0x9FDA: 0xC776, - 0x9FDB: 0xC777, - 0x9FDC: 0xC779, - 0x9FDD: 0xC77A, - 0x9FDE: 0xC77B, - 0x9FDF: 0xC77F, - 0x9FE0: 0xC780, - 0x9FE1: 0xC781, - 0x9FE2: 0xC782, - 0x9FE3: 0xC786, - 0x9FE4: 0xC78B, - 0x9FE5: 0xC78C, - 0x9FE6: 0xC78D, - 0x9FE7: 0xC78F, - 0x9FE8: 0xC792, - 0x9FE9: 0xC793, - 0x9FEA: 0xC795, - 0x9FEB: 0xC799, - 0x9FEC: 0xC79B, - 0x9FED: 0xC79C, - 0x9FEE: 0xC79D, - 0x9FEF: 0xC79E, - 0x9FF0: 0xC79F, - 0x9FF1: 0xC7A2, - 0x9FF2: 0xC7A7, - 0x9FF3: 0xC7A8, - 0x9FF4: 0xC7A9, - 0x9FF5: 0xC7AA, - 0x9FF6: 0xC7AB, - 0x9FF7: 0xC7AE, - 0x9FF8: 0xC7AF, - 0x9FF9: 0xC7B1, - 0x9FFA: 0xC7B2, - 0x9FFB: 0xC7B3, - 0x9FFC: 0xC7B5, - 0x9FFD: 0xC7B6, - 0x9FFE: 0xC7B7, - 0xA041: 0xC7B8, - 0xA042: 0xC7B9, - 0xA043: 0xC7BA, - 0xA044: 0xC7BB, - 0xA045: 0xC7BE, - 0xA046: 0xC7C2, - 0xA047: 0xC7C3, - 0xA048: 0xC7C4, - 0xA049: 0xC7C5, - 0xA04A: 0xC7C6, - 0xA04B: 0xC7C7, - 0xA04C: 0xC7CA, - 0xA04D: 0xC7CB, - 0xA04E: 0xC7CD, - 0xA04F: 0xC7CF, - 0xA050: 0xC7D1, - 0xA051: 0xC7D2, - 0xA052: 0xC7D3, - 0xA053: 0xC7D4, - 0xA054: 0xC7D5, - 0xA055: 0xC7D6, - 0xA056: 0xC7D7, - 0xA057: 0xC7D9, - 0xA058: 0xC7DA, - 0xA059: 0xC7DB, - 0xA05A: 0xC7DC, - 0xA061: 0xC7DE, - 0xA062: 0xC7DF, - 0xA063: 0xC7E0, - 0xA064: 0xC7E1, - 0xA065: 0xC7E2, - 0xA066: 0xC7E3, - 0xA067: 0xC7E5, - 0xA068: 0xC7E6, - 0xA069: 0xC7E7, - 0xA06A: 0xC7E9, - 0xA06B: 0xC7EA, - 0xA06C: 0xC7EB, - 0xA06D: 0xC7ED, - 0xA06E: 0xC7EE, - 0xA06F: 0xC7EF, - 0xA070: 0xC7F0, - 0xA071: 0xC7F1, - 0xA072: 0xC7F2, - 0xA073: 0xC7F3, - 0xA074: 0xC7F4, - 0xA075: 0xC7F5, - 0xA076: 0xC7F6, - 0xA077: 0xC7F7, - 0xA078: 0xC7F8, - 0xA079: 0xC7F9, - 0xA07A: 0xC7FA, - 0xA081: 0xC7FB, - 0xA082: 0xC7FC, - 0xA083: 0xC7FD, - 0xA084: 0xC7FE, - 0xA085: 0xC7FF, - 0xA086: 0xC802, - 0xA087: 0xC803, - 0xA088: 0xC805, - 0xA089: 0xC806, - 0xA08A: 0xC807, - 0xA08B: 0xC809, - 0xA08C: 0xC80B, - 0xA08D: 0xC80C, - 0xA08E: 0xC80D, - 0xA08F: 0xC80E, - 0xA090: 0xC80F, - 0xA091: 0xC812, - 0xA092: 0xC814, - 0xA093: 0xC817, - 0xA094: 0xC818, - 0xA095: 0xC819, - 0xA096: 0xC81A, - 0xA097: 0xC81B, - 0xA098: 0xC81E, - 0xA099: 0xC81F, - 0xA09A: 0xC821, - 0xA09B: 0xC822, - 0xA09C: 0xC823, - 0xA09D: 0xC825, - 0xA09E: 0xC826, - 0xA09F: 0xC827, - 0xA0A0: 0xC828, - 0xA0A1: 0xC829, - 0xA0A2: 0xC82A, - 0xA0A3: 0xC82B, - 0xA0A4: 0xC82E, - 0xA0A5: 0xC830, - 0xA0A6: 0xC832, - 0xA0A7: 0xC833, - 0xA0A8: 0xC834, - 0xA0A9: 0xC835, - 0xA0AA: 0xC836, - 0xA0AB: 0xC837, - 0xA0AC: 0xC839, - 0xA0AD: 0xC83A, - 0xA0AE: 0xC83B, - 0xA0AF: 0xC83D, - 0xA0B0: 0xC83E, - 0xA0B1: 0xC83F, - 0xA0B2: 0xC841, - 0xA0B3: 0xC842, - 0xA0B4: 0xC843, - 0xA0B5: 0xC844, - 0xA0B6: 0xC845, - 0xA0B7: 0xC846, - 0xA0B8: 0xC847, - 0xA0B9: 0xC84A, - 0xA0BA: 0xC84B, - 0xA0BB: 0xC84E, - 0xA0BC: 0xC84F, - 0xA0BD: 0xC850, - 0xA0BE: 0xC851, - 0xA0BF: 0xC852, - 0xA0C0: 0xC853, - 0xA0C1: 0xC855, - 0xA0C2: 0xC856, - 0xA0C3: 0xC857, - 0xA0C4: 0xC858, - 0xA0C5: 0xC859, - 0xA0C6: 0xC85A, - 0xA0C7: 0xC85B, - 0xA0C8: 0xC85C, - 0xA0C9: 0xC85D, - 0xA0CA: 0xC85E, - 0xA0CB: 0xC85F, - 0xA0CC: 0xC860, - 0xA0CD: 0xC861, - 0xA0CE: 0xC862, - 0xA0CF: 0xC863, - 0xA0D0: 0xC864, - 0xA0D1: 0xC865, - 0xA0D2: 0xC866, - 0xA0D3: 0xC867, - 0xA0D4: 0xC868, - 0xA0D5: 0xC869, - 0xA0D6: 0xC86A, - 0xA0D7: 0xC86B, - 0xA0D8: 0xC86C, - 0xA0D9: 0xC86D, - 0xA0DA: 0xC86E, - 0xA0DB: 0xC86F, - 0xA0DC: 0xC872, - 0xA0DD: 0xC873, - 0xA0DE: 0xC875, - 0xA0DF: 0xC876, - 0xA0E0: 0xC877, - 0xA0E1: 0xC879, - 0xA0E2: 0xC87B, - 0xA0E3: 0xC87C, - 0xA0E4: 0xC87D, - 0xA0E5: 0xC87E, - 0xA0E6: 0xC87F, - 0xA0E7: 0xC882, - 0xA0E8: 0xC884, - 0xA0E9: 0xC888, - 0xA0EA: 0xC889, - 0xA0EB: 0xC88A, - 0xA0EC: 0xC88E, - 0xA0ED: 0xC88F, - 0xA0EE: 0xC890, - 0xA0EF: 0xC891, - 0xA0F0: 0xC892, - 0xA0F1: 0xC893, - 0xA0F2: 0xC895, - 0xA0F3: 0xC896, - 0xA0F4: 0xC897, - 0xA0F5: 0xC898, - 0xA0F6: 0xC899, - 0xA0F7: 0xC89A, - 0xA0F8: 0xC89B, - 0xA0F9: 0xC89C, - 0xA0FA: 0xC89E, - 0xA0FB: 0xC8A0, - 0xA0FC: 0xC8A2, - 0xA0FD: 0xC8A3, - 0xA0FE: 0xC8A4, - 0xA141: 0xC8A5, - 0xA142: 0xC8A6, - 0xA143: 0xC8A7, - 0xA144: 0xC8A9, - 0xA145: 0xC8AA, - 0xA146: 0xC8AB, - 0xA147: 0xC8AC, - 0xA148: 0xC8AD, - 0xA149: 0xC8AE, - 0xA14A: 0xC8AF, - 0xA14B: 0xC8B0, - 0xA14C: 0xC8B1, - 0xA14D: 0xC8B2, - 0xA14E: 0xC8B3, - 0xA14F: 0xC8B4, - 0xA150: 0xC8B5, - 0xA151: 0xC8B6, - 0xA152: 0xC8B7, - 0xA153: 0xC8B8, - 0xA154: 0xC8B9, - 0xA155: 0xC8BA, - 0xA156: 0xC8BB, - 0xA157: 0xC8BE, - 0xA158: 0xC8BF, - 0xA159: 0xC8C0, - 0xA15A: 0xC8C1, - 0xA161: 0xC8C2, - 0xA162: 0xC8C3, - 0xA163: 0xC8C5, - 0xA164: 0xC8C6, - 0xA165: 0xC8C7, - 0xA166: 0xC8C9, - 0xA167: 0xC8CA, - 0xA168: 0xC8CB, - 0xA169: 0xC8CD, - 0xA16A: 0xC8CE, - 0xA16B: 0xC8CF, - 0xA16C: 0xC8D0, - 0xA16D: 0xC8D1, - 0xA16E: 0xC8D2, - 0xA16F: 0xC8D3, - 0xA170: 0xC8D6, - 0xA171: 0xC8D8, - 0xA172: 0xC8DA, - 0xA173: 0xC8DB, - 0xA174: 0xC8DC, - 0xA175: 0xC8DD, - 0xA176: 0xC8DE, - 0xA177: 0xC8DF, - 0xA178: 0xC8E2, - 0xA179: 0xC8E3, - 0xA17A: 0xC8E5, - 0xA181: 0xC8E6, - 0xA182: 0xC8E7, - 0xA183: 0xC8E8, - 0xA184: 0xC8E9, - 0xA185: 0xC8EA, - 0xA186: 0xC8EB, - 0xA187: 0xC8EC, - 0xA188: 0xC8ED, - 0xA189: 0xC8EE, - 0xA18A: 0xC8EF, - 0xA18B: 0xC8F0, - 0xA18C: 0xC8F1, - 0xA18D: 0xC8F2, - 0xA18E: 0xC8F3, - 0xA18F: 0xC8F4, - 0xA190: 0xC8F6, - 0xA191: 0xC8F7, - 0xA192: 0xC8F8, - 0xA193: 0xC8F9, - 0xA194: 0xC8FA, - 0xA195: 0xC8FB, - 0xA196: 0xC8FE, - 0xA197: 0xC8FF, - 0xA198: 0xC901, - 0xA199: 0xC902, - 0xA19A: 0xC903, - 0xA19B: 0xC907, - 0xA19C: 0xC908, - 0xA19D: 0xC909, - 0xA19E: 0xC90A, - 0xA19F: 0xC90B, - 0xA1A0: 0xC90E, - 0xA1A1: 0x3000, - 0xA1A2: 0x3001, - 0xA1A3: 0x3002, - 0xA1A4: 0x00B7, - 0xA1A5: 0x2025, - 0xA1A6: 0x2026, - 0xA1A7: 0x00A8, - 0xA1A8: 0x3003, - 0xA1A9: 0x00AD, - 0xA1AA: 0x2015, - 0xA1AB: 0x2225, - 0xA1AC: 0xFF3C, - 0xA1AD: 0x223C, - 0xA1AE: 0x2018, - 0xA1AF: 0x2019, - 0xA1B0: 0x201C, - 0xA1B1: 0x201D, - 0xA1B2: 0x3014, - 0xA1B3: 0x3015, - 0xA1B4: 0x3008, - 0xA1B5: 0x3009, - 0xA1B6: 0x300A, - 0xA1B7: 0x300B, - 0xA1B8: 0x300C, - 0xA1B9: 0x300D, - 0xA1BA: 0x300E, - 0xA1BB: 0x300F, - 0xA1BC: 0x3010, - 0xA1BD: 0x3011, - 0xA1BE: 0x00B1, - 0xA1BF: 0x00D7, - 0xA1C0: 0x00F7, - 0xA1C1: 0x2260, - 0xA1C2: 0x2264, - 0xA1C3: 0x2265, - 0xA1C4: 0x221E, - 0xA1C5: 0x2234, - 0xA1C6: 0x00B0, - 0xA1C7: 0x2032, - 0xA1C8: 0x2033, - 0xA1C9: 0x2103, - 0xA1CA: 0x212B, - 0xA1CB: 0xFFE0, - 0xA1CC: 0xFFE1, - 0xA1CD: 0xFFE5, - 0xA1CE: 0x2642, - 0xA1CF: 0x2640, - 0xA1D0: 0x2220, - 0xA1D1: 0x22A5, - 0xA1D2: 0x2312, - 0xA1D3: 0x2202, - 0xA1D4: 0x2207, - 0xA1D5: 0x2261, - 0xA1D6: 0x2252, - 0xA1D7: 0x00A7, - 0xA1D8: 0x203B, - 0xA1D9: 0x2606, - 0xA1DA: 0x2605, - 0xA1DB: 0x25CB, - 0xA1DC: 0x25CF, - 0xA1DD: 0x25CE, - 0xA1DE: 0x25C7, - 0xA1DF: 0x25C6, - 0xA1E0: 0x25A1, - 0xA1E1: 0x25A0, - 0xA1E2: 0x25B3, - 0xA1E3: 0x25B2, - 0xA1E4: 0x25BD, - 0xA1E5: 0x25BC, - 0xA1E6: 0x2192, - 0xA1E7: 0x2190, - 0xA1E8: 0x2191, - 0xA1E9: 0x2193, - 0xA1EA: 0x2194, - 0xA1EB: 0x3013, - 0xA1EC: 0x226A, - 0xA1ED: 0x226B, - 0xA1EE: 0x221A, - 0xA1EF: 0x223D, - 0xA1F0: 0x221D, - 0xA1F1: 0x2235, - 0xA1F2: 0x222B, - 0xA1F3: 0x222C, - 0xA1F4: 0x2208, - 0xA1F5: 0x220B, - 0xA1F6: 0x2286, - 0xA1F7: 0x2287, - 0xA1F8: 0x2282, - 0xA1F9: 0x2283, - 0xA1FA: 0x222A, - 0xA1FB: 0x2229, - 0xA1FC: 0x2227, - 0xA1FD: 0x2228, - 0xA1FE: 0xFFE2, - 0xA241: 0xC910, - 0xA242: 0xC912, - 0xA243: 0xC913, - 0xA244: 0xC914, - 0xA245: 0xC915, - 0xA246: 0xC916, - 0xA247: 0xC917, - 0xA248: 0xC919, - 0xA249: 0xC91A, - 0xA24A: 0xC91B, - 0xA24B: 0xC91C, - 0xA24C: 0xC91D, - 0xA24D: 0xC91E, - 0xA24E: 0xC91F, - 0xA24F: 0xC920, - 0xA250: 0xC921, - 0xA251: 0xC922, - 0xA252: 0xC923, - 0xA253: 0xC924, - 0xA254: 0xC925, - 0xA255: 0xC926, - 0xA256: 0xC927, - 0xA257: 0xC928, - 0xA258: 0xC929, - 0xA259: 0xC92A, - 0xA25A: 0xC92B, - 0xA261: 0xC92D, - 0xA262: 0xC92E, - 0xA263: 0xC92F, - 0xA264: 0xC930, - 0xA265: 0xC931, - 0xA266: 0xC932, - 0xA267: 0xC933, - 0xA268: 0xC935, - 0xA269: 0xC936, - 0xA26A: 0xC937, - 0xA26B: 0xC938, - 0xA26C: 0xC939, - 0xA26D: 0xC93A, - 0xA26E: 0xC93B, - 0xA26F: 0xC93C, - 0xA270: 0xC93D, - 0xA271: 0xC93E, - 0xA272: 0xC93F, - 0xA273: 0xC940, - 0xA274: 0xC941, - 0xA275: 0xC942, - 0xA276: 0xC943, - 0xA277: 0xC944, - 0xA278: 0xC945, - 0xA279: 0xC946, - 0xA27A: 0xC947, - 0xA281: 0xC948, - 0xA282: 0xC949, - 0xA283: 0xC94A, - 0xA284: 0xC94B, - 0xA285: 0xC94C, - 0xA286: 0xC94D, - 0xA287: 0xC94E, - 0xA288: 0xC94F, - 0xA289: 0xC952, - 0xA28A: 0xC953, - 0xA28B: 0xC955, - 0xA28C: 0xC956, - 0xA28D: 0xC957, - 0xA28E: 0xC959, - 0xA28F: 0xC95A, - 0xA290: 0xC95B, - 0xA291: 0xC95C, - 0xA292: 0xC95D, - 0xA293: 0xC95E, - 0xA294: 0xC95F, - 0xA295: 0xC962, - 0xA296: 0xC964, - 0xA297: 0xC965, - 0xA298: 0xC966, - 0xA299: 0xC967, - 0xA29A: 0xC968, - 0xA29B: 0xC969, - 0xA29C: 0xC96A, - 0xA29D: 0xC96B, - 0xA29E: 0xC96D, - 0xA29F: 0xC96E, - 0xA2A0: 0xC96F, - 0xA2A1: 0x21D2, - 0xA2A2: 0x21D4, - 0xA2A3: 0x2200, - 0xA2A4: 0x2203, - 0xA2A5: 0x00B4, - 0xA2A6: 0xFF5E, - 0xA2A7: 0x02C7, - 0xA2A8: 0x02D8, - 0xA2A9: 0x02DD, - 0xA2AA: 0x02DA, - 0xA2AB: 0x02D9, - 0xA2AC: 0x00B8, - 0xA2AD: 0x02DB, - 0xA2AE: 0x00A1, - 0xA2AF: 0x00BF, - 0xA2B0: 0x02D0, - 0xA2B1: 0x222E, - 0xA2B2: 0x2211, - 0xA2B3: 0x220F, - 0xA2B4: 0x00A4, - 0xA2B5: 0x2109, - 0xA2B6: 0x2030, - 0xA2B7: 0x25C1, - 0xA2B8: 0x25C0, - 0xA2B9: 0x25B7, - 0xA2BA: 0x25B6, - 0xA2BB: 0x2664, - 0xA2BC: 0x2660, - 0xA2BD: 0x2661, - 0xA2BE: 0x2665, - 0xA2BF: 0x2667, - 0xA2C0: 0x2663, - 0xA2C1: 0x2299, - 0xA2C2: 0x25C8, - 0xA2C3: 0x25A3, - 0xA2C4: 0x25D0, - 0xA2C5: 0x25D1, - 0xA2C6: 0x2592, - 0xA2C7: 0x25A4, - 0xA2C8: 0x25A5, - 0xA2C9: 0x25A8, - 0xA2CA: 0x25A7, - 0xA2CB: 0x25A6, - 0xA2CC: 0x25A9, - 0xA2CD: 0x2668, - 0xA2CE: 0x260F, - 0xA2CF: 0x260E, - 0xA2D0: 0x261C, - 0xA2D1: 0x261E, - 0xA2D2: 0x00B6, - 0xA2D3: 0x2020, - 0xA2D4: 0x2021, - 0xA2D5: 0x2195, - 0xA2D6: 0x2197, - 0xA2D7: 0x2199, - 0xA2D8: 0x2196, - 0xA2D9: 0x2198, - 0xA2DA: 0x266D, - 0xA2DB: 0x2669, - 0xA2DC: 0x266A, - 0xA2DD: 0x266C, - 0xA2DE: 0x327F, - 0xA2DF: 0x321C, - 0xA2E0: 0x2116, - 0xA2E1: 0x33C7, - 0xA2E2: 0x2122, - 0xA2E3: 0x33C2, - 0xA2E4: 0x33D8, - 0xA2E5: 0x2121, - 0xA2E6: 0x20AC, - 0xA2E7: 0x00AE, - 0xA341: 0xC971, - 0xA342: 0xC972, - 0xA343: 0xC973, - 0xA344: 0xC975, - 0xA345: 0xC976, - 0xA346: 0xC977, - 0xA347: 0xC978, - 0xA348: 0xC979, - 0xA349: 0xC97A, - 0xA34A: 0xC97B, - 0xA34B: 0xC97D, - 0xA34C: 0xC97E, - 0xA34D: 0xC97F, - 0xA34E: 0xC980, - 0xA34F: 0xC981, - 0xA350: 0xC982, - 0xA351: 0xC983, - 0xA352: 0xC984, - 0xA353: 0xC985, - 0xA354: 0xC986, - 0xA355: 0xC987, - 0xA356: 0xC98A, - 0xA357: 0xC98B, - 0xA358: 0xC98D, - 0xA359: 0xC98E, - 0xA35A: 0xC98F, - 0xA361: 0xC991, - 0xA362: 0xC992, - 0xA363: 0xC993, - 0xA364: 0xC994, - 0xA365: 0xC995, - 0xA366: 0xC996, - 0xA367: 0xC997, - 0xA368: 0xC99A, - 0xA369: 0xC99C, - 0xA36A: 0xC99E, - 0xA36B: 0xC99F, - 0xA36C: 0xC9A0, - 0xA36D: 0xC9A1, - 0xA36E: 0xC9A2, - 0xA36F: 0xC9A3, - 0xA370: 0xC9A4, - 0xA371: 0xC9A5, - 0xA372: 0xC9A6, - 0xA373: 0xC9A7, - 0xA374: 0xC9A8, - 0xA375: 0xC9A9, - 0xA376: 0xC9AA, - 0xA377: 0xC9AB, - 0xA378: 0xC9AC, - 0xA379: 0xC9AD, - 0xA37A: 0xC9AE, - 0xA381: 0xC9AF, - 0xA382: 0xC9B0, - 0xA383: 0xC9B1, - 0xA384: 0xC9B2, - 0xA385: 0xC9B3, - 0xA386: 0xC9B4, - 0xA387: 0xC9B5, - 0xA388: 0xC9B6, - 0xA389: 0xC9B7, - 0xA38A: 0xC9B8, - 0xA38B: 0xC9B9, - 0xA38C: 0xC9BA, - 0xA38D: 0xC9BB, - 0xA38E: 0xC9BC, - 0xA38F: 0xC9BD, - 0xA390: 0xC9BE, - 0xA391: 0xC9BF, - 0xA392: 0xC9C2, - 0xA393: 0xC9C3, - 0xA394: 0xC9C5, - 0xA395: 0xC9C6, - 0xA396: 0xC9C9, - 0xA397: 0xC9CB, - 0xA398: 0xC9CC, - 0xA399: 0xC9CD, - 0xA39A: 0xC9CE, - 0xA39B: 0xC9CF, - 0xA39C: 0xC9D2, - 0xA39D: 0xC9D4, - 0xA39E: 0xC9D7, - 0xA39F: 0xC9D8, - 0xA3A0: 0xC9DB, - 0xA3A1: 0xFF01, - 0xA3A2: 0xFF02, - 0xA3A3: 0xFF03, - 0xA3A4: 0xFF04, - 0xA3A5: 0xFF05, - 0xA3A6: 0xFF06, - 0xA3A7: 0xFF07, - 0xA3A8: 0xFF08, - 0xA3A9: 0xFF09, - 0xA3AA: 0xFF0A, - 0xA3AB: 0xFF0B, - 0xA3AC: 0xFF0C, - 0xA3AD: 0xFF0D, - 0xA3AE: 0xFF0E, - 0xA3AF: 0xFF0F, - 0xA3B0: 0xFF10, - 0xA3B1: 0xFF11, - 0xA3B2: 0xFF12, - 0xA3B3: 0xFF13, - 0xA3B4: 0xFF14, - 0xA3B5: 0xFF15, - 0xA3B6: 0xFF16, - 0xA3B7: 0xFF17, - 0xA3B8: 0xFF18, - 0xA3B9: 0xFF19, - 0xA3BA: 0xFF1A, - 0xA3BB: 0xFF1B, - 0xA3BC: 0xFF1C, - 0xA3BD: 0xFF1D, - 0xA3BE: 0xFF1E, - 0xA3BF: 0xFF1F, - 0xA3C0: 0xFF20, - 0xA3C1: 0xFF21, - 0xA3C2: 0xFF22, - 0xA3C3: 0xFF23, - 0xA3C4: 0xFF24, - 0xA3C5: 0xFF25, - 0xA3C6: 0xFF26, - 0xA3C7: 0xFF27, - 0xA3C8: 0xFF28, - 0xA3C9: 0xFF29, - 0xA3CA: 0xFF2A, - 0xA3CB: 0xFF2B, - 0xA3CC: 0xFF2C, - 0xA3CD: 0xFF2D, - 0xA3CE: 0xFF2E, - 0xA3CF: 0xFF2F, - 0xA3D0: 0xFF30, - 0xA3D1: 0xFF31, - 0xA3D2: 0xFF32, - 0xA3D3: 0xFF33, - 0xA3D4: 0xFF34, - 0xA3D5: 0xFF35, - 0xA3D6: 0xFF36, - 0xA3D7: 0xFF37, - 0xA3D8: 0xFF38, - 0xA3D9: 0xFF39, - 0xA3DA: 0xFF3A, - 0xA3DB: 0xFF3B, - 0xA3DC: 0xFFE6, - 0xA3DD: 0xFF3D, - 0xA3DE: 0xFF3E, - 0xA3DF: 0xFF3F, - 0xA3E0: 0xFF40, - 0xA3E1: 0xFF41, - 0xA3E2: 0xFF42, - 0xA3E3: 0xFF43, - 0xA3E4: 0xFF44, - 0xA3E5: 0xFF45, - 0xA3E6: 0xFF46, - 0xA3E7: 0xFF47, - 0xA3E8: 0xFF48, - 0xA3E9: 0xFF49, - 0xA3EA: 0xFF4A, - 0xA3EB: 0xFF4B, - 0xA3EC: 0xFF4C, - 0xA3ED: 0xFF4D, - 0xA3EE: 0xFF4E, - 0xA3EF: 0xFF4F, - 0xA3F0: 0xFF50, - 0xA3F1: 0xFF51, - 0xA3F2: 0xFF52, - 0xA3F3: 0xFF53, - 0xA3F4: 0xFF54, - 0xA3F5: 0xFF55, - 0xA3F6: 0xFF56, - 0xA3F7: 0xFF57, - 0xA3F8: 0xFF58, - 0xA3F9: 0xFF59, - 0xA3FA: 0xFF5A, - 0xA3FB: 0xFF5B, - 0xA3FC: 0xFF5C, - 0xA3FD: 0xFF5D, - 0xA3FE: 0xFFE3, - 0xA441: 0xC9DE, - 0xA442: 0xC9DF, - 0xA443: 0xC9E1, - 0xA444: 0xC9E3, - 0xA445: 0xC9E5, - 0xA446: 0xC9E6, - 0xA447: 0xC9E8, - 0xA448: 0xC9E9, - 0xA449: 0xC9EA, - 0xA44A: 0xC9EB, - 0xA44B: 0xC9EE, - 0xA44C: 0xC9F2, - 0xA44D: 0xC9F3, - 0xA44E: 0xC9F4, - 0xA44F: 0xC9F5, - 0xA450: 0xC9F6, - 0xA451: 0xC9F7, - 0xA452: 0xC9FA, - 0xA453: 0xC9FB, - 0xA454: 0xC9FD, - 0xA455: 0xC9FE, - 0xA456: 0xC9FF, - 0xA457: 0xCA01, - 0xA458: 0xCA02, - 0xA459: 0xCA03, - 0xA45A: 0xCA04, - 0xA461: 0xCA05, - 0xA462: 0xCA06, - 0xA463: 0xCA07, - 0xA464: 0xCA0A, - 0xA465: 0xCA0E, - 0xA466: 0xCA0F, - 0xA467: 0xCA10, - 0xA468: 0xCA11, - 0xA469: 0xCA12, - 0xA46A: 0xCA13, - 0xA46B: 0xCA15, - 0xA46C: 0xCA16, - 0xA46D: 0xCA17, - 0xA46E: 0xCA19, - 0xA46F: 0xCA1A, - 0xA470: 0xCA1B, - 0xA471: 0xCA1C, - 0xA472: 0xCA1D, - 0xA473: 0xCA1E, - 0xA474: 0xCA1F, - 0xA475: 0xCA20, - 0xA476: 0xCA21, - 0xA477: 0xCA22, - 0xA478: 0xCA23, - 0xA479: 0xCA24, - 0xA47A: 0xCA25, - 0xA481: 0xCA26, - 0xA482: 0xCA27, - 0xA483: 0xCA28, - 0xA484: 0xCA2A, - 0xA485: 0xCA2B, - 0xA486: 0xCA2C, - 0xA487: 0xCA2D, - 0xA488: 0xCA2E, - 0xA489: 0xCA2F, - 0xA48A: 0xCA30, - 0xA48B: 0xCA31, - 0xA48C: 0xCA32, - 0xA48D: 0xCA33, - 0xA48E: 0xCA34, - 0xA48F: 0xCA35, - 0xA490: 0xCA36, - 0xA491: 0xCA37, - 0xA492: 0xCA38, - 0xA493: 0xCA39, - 0xA494: 0xCA3A, - 0xA495: 0xCA3B, - 0xA496: 0xCA3C, - 0xA497: 0xCA3D, - 0xA498: 0xCA3E, - 0xA499: 0xCA3F, - 0xA49A: 0xCA40, - 0xA49B: 0xCA41, - 0xA49C: 0xCA42, - 0xA49D: 0xCA43, - 0xA49E: 0xCA44, - 0xA49F: 0xCA45, - 0xA4A0: 0xCA46, - 0xA4A1: 0x3131, - 0xA4A2: 0x3132, - 0xA4A3: 0x3133, - 0xA4A4: 0x3134, - 0xA4A5: 0x3135, - 0xA4A6: 0x3136, - 0xA4A7: 0x3137, - 0xA4A8: 0x3138, - 0xA4A9: 0x3139, - 0xA4AA: 0x313A, - 0xA4AB: 0x313B, - 0xA4AC: 0x313C, - 0xA4AD: 0x313D, - 0xA4AE: 0x313E, - 0xA4AF: 0x313F, - 0xA4B0: 0x3140, - 0xA4B1: 0x3141, - 0xA4B2: 0x3142, - 0xA4B3: 0x3143, - 0xA4B4: 0x3144, - 0xA4B5: 0x3145, - 0xA4B6: 0x3146, - 0xA4B7: 0x3147, - 0xA4B8: 0x3148, - 0xA4B9: 0x3149, - 0xA4BA: 0x314A, - 0xA4BB: 0x314B, - 0xA4BC: 0x314C, - 0xA4BD: 0x314D, - 0xA4BE: 0x314E, - 0xA4BF: 0x314F, - 0xA4C0: 0x3150, - 0xA4C1: 0x3151, - 0xA4C2: 0x3152, - 0xA4C3: 0x3153, - 0xA4C4: 0x3154, - 0xA4C5: 0x3155, - 0xA4C6: 0x3156, - 0xA4C7: 0x3157, - 0xA4C8: 0x3158, - 0xA4C9: 0x3159, - 0xA4CA: 0x315A, - 0xA4CB: 0x315B, - 0xA4CC: 0x315C, - 0xA4CD: 0x315D, - 0xA4CE: 0x315E, - 0xA4CF: 0x315F, - 0xA4D0: 0x3160, - 0xA4D1: 0x3161, - 0xA4D2: 0x3162, - 0xA4D3: 0x3163, - 0xA4D4: 0x3164, - 0xA4D5: 0x3165, - 0xA4D6: 0x3166, - 0xA4D7: 0x3167, - 0xA4D8: 0x3168, - 0xA4D9: 0x3169, - 0xA4DA: 0x316A, - 0xA4DB: 0x316B, - 0xA4DC: 0x316C, - 0xA4DD: 0x316D, - 0xA4DE: 0x316E, - 0xA4DF: 0x316F, - 0xA4E0: 0x3170, - 0xA4E1: 0x3171, - 0xA4E2: 0x3172, - 0xA4E3: 0x3173, - 0xA4E4: 0x3174, - 0xA4E5: 0x3175, - 0xA4E6: 0x3176, - 0xA4E7: 0x3177, - 0xA4E8: 0x3178, - 0xA4E9: 0x3179, - 0xA4EA: 0x317A, - 0xA4EB: 0x317B, - 0xA4EC: 0x317C, - 0xA4ED: 0x317D, - 0xA4EE: 0x317E, - 0xA4EF: 0x317F, - 0xA4F0: 0x3180, - 0xA4F1: 0x3181, - 0xA4F2: 0x3182, - 0xA4F3: 0x3183, - 0xA4F4: 0x3184, - 0xA4F5: 0x3185, - 0xA4F6: 0x3186, - 0xA4F7: 0x3187, - 0xA4F8: 0x3188, - 0xA4F9: 0x3189, - 0xA4FA: 0x318A, - 0xA4FB: 0x318B, - 0xA4FC: 0x318C, - 0xA4FD: 0x318D, - 0xA4FE: 0x318E, - 0xA541: 0xCA47, - 0xA542: 0xCA48, - 0xA543: 0xCA49, - 0xA544: 0xCA4A, - 0xA545: 0xCA4B, - 0xA546: 0xCA4E, - 0xA547: 0xCA4F, - 0xA548: 0xCA51, - 0xA549: 0xCA52, - 0xA54A: 0xCA53, - 0xA54B: 0xCA55, - 0xA54C: 0xCA56, - 0xA54D: 0xCA57, - 0xA54E: 0xCA58, - 0xA54F: 0xCA59, - 0xA550: 0xCA5A, - 0xA551: 0xCA5B, - 0xA552: 0xCA5E, - 0xA553: 0xCA62, - 0xA554: 0xCA63, - 0xA555: 0xCA64, - 0xA556: 0xCA65, - 0xA557: 0xCA66, - 0xA558: 0xCA67, - 0xA559: 0xCA69, - 0xA55A: 0xCA6A, - 0xA561: 0xCA6B, - 0xA562: 0xCA6C, - 0xA563: 0xCA6D, - 0xA564: 0xCA6E, - 0xA565: 0xCA6F, - 0xA566: 0xCA70, - 0xA567: 0xCA71, - 0xA568: 0xCA72, - 0xA569: 0xCA73, - 0xA56A: 0xCA74, - 0xA56B: 0xCA75, - 0xA56C: 0xCA76, - 0xA56D: 0xCA77, - 0xA56E: 0xCA78, - 0xA56F: 0xCA79, - 0xA570: 0xCA7A, - 0xA571: 0xCA7B, - 0xA572: 0xCA7C, - 0xA573: 0xCA7E, - 0xA574: 0xCA7F, - 0xA575: 0xCA80, - 0xA576: 0xCA81, - 0xA577: 0xCA82, - 0xA578: 0xCA83, - 0xA579: 0xCA85, - 0xA57A: 0xCA86, - 0xA581: 0xCA87, - 0xA582: 0xCA88, - 0xA583: 0xCA89, - 0xA584: 0xCA8A, - 0xA585: 0xCA8B, - 0xA586: 0xCA8C, - 0xA587: 0xCA8D, - 0xA588: 0xCA8E, - 0xA589: 0xCA8F, - 0xA58A: 0xCA90, - 0xA58B: 0xCA91, - 0xA58C: 0xCA92, - 0xA58D: 0xCA93, - 0xA58E: 0xCA94, - 0xA58F: 0xCA95, - 0xA590: 0xCA96, - 0xA591: 0xCA97, - 0xA592: 0xCA99, - 0xA593: 0xCA9A, - 0xA594: 0xCA9B, - 0xA595: 0xCA9C, - 0xA596: 0xCA9D, - 0xA597: 0xCA9E, - 0xA598: 0xCA9F, - 0xA599: 0xCAA0, - 0xA59A: 0xCAA1, - 0xA59B: 0xCAA2, - 0xA59C: 0xCAA3, - 0xA59D: 0xCAA4, - 0xA59E: 0xCAA5, - 0xA59F: 0xCAA6, - 0xA5A0: 0xCAA7, - 0xA5A1: 0x2170, - 0xA5A2: 0x2171, - 0xA5A3: 0x2172, - 0xA5A4: 0x2173, - 0xA5A5: 0x2174, - 0xA5A6: 0x2175, - 0xA5A7: 0x2176, - 0xA5A8: 0x2177, - 0xA5A9: 0x2178, - 0xA5AA: 0x2179, - 0xA5B0: 0x2160, - 0xA5B1: 0x2161, - 0xA5B2: 0x2162, - 0xA5B3: 0x2163, - 0xA5B4: 0x2164, - 0xA5B5: 0x2165, - 0xA5B6: 0x2166, - 0xA5B7: 0x2167, - 0xA5B8: 0x2168, - 0xA5B9: 0x2169, - 0xA5C1: 0x0391, - 0xA5C2: 0x0392, - 0xA5C3: 0x0393, - 0xA5C4: 0x0394, - 0xA5C5: 0x0395, - 0xA5C6: 0x0396, - 0xA5C7: 0x0397, - 0xA5C8: 0x0398, - 0xA5C9: 0x0399, - 0xA5CA: 0x039A, - 0xA5CB: 0x039B, - 0xA5CC: 0x039C, - 0xA5CD: 0x039D, - 0xA5CE: 0x039E, - 0xA5CF: 0x039F, - 0xA5D0: 0x03A0, - 0xA5D1: 0x03A1, - 0xA5D2: 0x03A3, - 0xA5D3: 0x03A4, - 0xA5D4: 0x03A5, - 0xA5D5: 0x03A6, - 0xA5D6: 0x03A7, - 0xA5D7: 0x03A8, - 0xA5D8: 0x03A9, - 0xA5E1: 0x03B1, - 0xA5E2: 0x03B2, - 0xA5E3: 0x03B3, - 0xA5E4: 0x03B4, - 0xA5E5: 0x03B5, - 0xA5E6: 0x03B6, - 0xA5E7: 0x03B7, - 0xA5E8: 0x03B8, - 0xA5E9: 0x03B9, - 0xA5EA: 0x03BA, - 0xA5EB: 0x03BB, - 0xA5EC: 0x03BC, - 0xA5ED: 0x03BD, - 0xA5EE: 0x03BE, - 0xA5EF: 0x03BF, - 0xA5F0: 0x03C0, - 0xA5F1: 0x03C1, - 0xA5F2: 0x03C3, - 0xA5F3: 0x03C4, - 0xA5F4: 0x03C5, - 0xA5F5: 0x03C6, - 0xA5F6: 0x03C7, - 0xA5F7: 0x03C8, - 0xA5F8: 0x03C9, - 0xA641: 0xCAA8, - 0xA642: 0xCAA9, - 0xA643: 0xCAAA, - 0xA644: 0xCAAB, - 0xA645: 0xCAAC, - 0xA646: 0xCAAD, - 0xA647: 0xCAAE, - 0xA648: 0xCAAF, - 0xA649: 0xCAB0, - 0xA64A: 0xCAB1, - 0xA64B: 0xCAB2, - 0xA64C: 0xCAB3, - 0xA64D: 0xCAB4, - 0xA64E: 0xCAB5, - 0xA64F: 0xCAB6, - 0xA650: 0xCAB7, - 0xA651: 0xCAB8, - 0xA652: 0xCAB9, - 0xA653: 0xCABA, - 0xA654: 0xCABB, - 0xA655: 0xCABE, - 0xA656: 0xCABF, - 0xA657: 0xCAC1, - 0xA658: 0xCAC2, - 0xA659: 0xCAC3, - 0xA65A: 0xCAC5, - 0xA661: 0xCAC6, - 0xA662: 0xCAC7, - 0xA663: 0xCAC8, - 0xA664: 0xCAC9, - 0xA665: 0xCACA, - 0xA666: 0xCACB, - 0xA667: 0xCACE, - 0xA668: 0xCAD0, - 0xA669: 0xCAD2, - 0xA66A: 0xCAD4, - 0xA66B: 0xCAD5, - 0xA66C: 0xCAD6, - 0xA66D: 0xCAD7, - 0xA66E: 0xCADA, - 0xA66F: 0xCADB, - 0xA670: 0xCADC, - 0xA671: 0xCADD, - 0xA672: 0xCADE, - 0xA673: 0xCADF, - 0xA674: 0xCAE1, - 0xA675: 0xCAE2, - 0xA676: 0xCAE3, - 0xA677: 0xCAE4, - 0xA678: 0xCAE5, - 0xA679: 0xCAE6, - 0xA67A: 0xCAE7, - 0xA681: 0xCAE8, - 0xA682: 0xCAE9, - 0xA683: 0xCAEA, - 0xA684: 0xCAEB, - 0xA685: 0xCAED, - 0xA686: 0xCAEE, - 0xA687: 0xCAEF, - 0xA688: 0xCAF0, - 0xA689: 0xCAF1, - 0xA68A: 0xCAF2, - 0xA68B: 0xCAF3, - 0xA68C: 0xCAF5, - 0xA68D: 0xCAF6, - 0xA68E: 0xCAF7, - 0xA68F: 0xCAF8, - 0xA690: 0xCAF9, - 0xA691: 0xCAFA, - 0xA692: 0xCAFB, - 0xA693: 0xCAFC, - 0xA694: 0xCAFD, - 0xA695: 0xCAFE, - 0xA696: 0xCAFF, - 0xA697: 0xCB00, - 0xA698: 0xCB01, - 0xA699: 0xCB02, - 0xA69A: 0xCB03, - 0xA69B: 0xCB04, - 0xA69C: 0xCB05, - 0xA69D: 0xCB06, - 0xA69E: 0xCB07, - 0xA69F: 0xCB09, - 0xA6A0: 0xCB0A, - 0xA6A1: 0x2500, - 0xA6A2: 0x2502, - 0xA6A3: 0x250C, - 0xA6A4: 0x2510, - 0xA6A5: 0x2518, - 0xA6A6: 0x2514, - 0xA6A7: 0x251C, - 0xA6A8: 0x252C, - 0xA6A9: 0x2524, - 0xA6AA: 0x2534, - 0xA6AB: 0x253C, - 0xA6AC: 0x2501, - 0xA6AD: 0x2503, - 0xA6AE: 0x250F, - 0xA6AF: 0x2513, - 0xA6B0: 0x251B, - 0xA6B1: 0x2517, - 0xA6B2: 0x2523, - 0xA6B3: 0x2533, - 0xA6B4: 0x252B, - 0xA6B5: 0x253B, - 0xA6B6: 0x254B, - 0xA6B7: 0x2520, - 0xA6B8: 0x252F, - 0xA6B9: 0x2528, - 0xA6BA: 0x2537, - 0xA6BB: 0x253F, - 0xA6BC: 0x251D, - 0xA6BD: 0x2530, - 0xA6BE: 0x2525, - 0xA6BF: 0x2538, - 0xA6C0: 0x2542, - 0xA6C1: 0x2512, - 0xA6C2: 0x2511, - 0xA6C3: 0x251A, - 0xA6C4: 0x2519, - 0xA6C5: 0x2516, - 0xA6C6: 0x2515, - 0xA6C7: 0x250E, - 0xA6C8: 0x250D, - 0xA6C9: 0x251E, - 0xA6CA: 0x251F, - 0xA6CB: 0x2521, - 0xA6CC: 0x2522, - 0xA6CD: 0x2526, - 0xA6CE: 0x2527, - 0xA6CF: 0x2529, - 0xA6D0: 0x252A, - 0xA6D1: 0x252D, - 0xA6D2: 0x252E, - 0xA6D3: 0x2531, - 0xA6D4: 0x2532, - 0xA6D5: 0x2535, - 0xA6D6: 0x2536, - 0xA6D7: 0x2539, - 0xA6D8: 0x253A, - 0xA6D9: 0x253D, - 0xA6DA: 0x253E, - 0xA6DB: 0x2540, - 0xA6DC: 0x2541, - 0xA6DD: 0x2543, - 0xA6DE: 0x2544, - 0xA6DF: 0x2545, - 0xA6E0: 0x2546, - 0xA6E1: 0x2547, - 0xA6E2: 0x2548, - 0xA6E3: 0x2549, - 0xA6E4: 0x254A, - 0xA741: 0xCB0B, - 0xA742: 0xCB0C, - 0xA743: 0xCB0D, - 0xA744: 0xCB0E, - 0xA745: 0xCB0F, - 0xA746: 0xCB11, - 0xA747: 0xCB12, - 0xA748: 0xCB13, - 0xA749: 0xCB15, - 0xA74A: 0xCB16, - 0xA74B: 0xCB17, - 0xA74C: 0xCB19, - 0xA74D: 0xCB1A, - 0xA74E: 0xCB1B, - 0xA74F: 0xCB1C, - 0xA750: 0xCB1D, - 0xA751: 0xCB1E, - 0xA752: 0xCB1F, - 0xA753: 0xCB22, - 0xA754: 0xCB23, - 0xA755: 0xCB24, - 0xA756: 0xCB25, - 0xA757: 0xCB26, - 0xA758: 0xCB27, - 0xA759: 0xCB28, - 0xA75A: 0xCB29, - 0xA761: 0xCB2A, - 0xA762: 0xCB2B, - 0xA763: 0xCB2C, - 0xA764: 0xCB2D, - 0xA765: 0xCB2E, - 0xA766: 0xCB2F, - 0xA767: 0xCB30, - 0xA768: 0xCB31, - 0xA769: 0xCB32, - 0xA76A: 0xCB33, - 0xA76B: 0xCB34, - 0xA76C: 0xCB35, - 0xA76D: 0xCB36, - 0xA76E: 0xCB37, - 0xA76F: 0xCB38, - 0xA770: 0xCB39, - 0xA771: 0xCB3A, - 0xA772: 0xCB3B, - 0xA773: 0xCB3C, - 0xA774: 0xCB3D, - 0xA775: 0xCB3E, - 0xA776: 0xCB3F, - 0xA777: 0xCB40, - 0xA778: 0xCB42, - 0xA779: 0xCB43, - 0xA77A: 0xCB44, - 0xA781: 0xCB45, - 0xA782: 0xCB46, - 0xA783: 0xCB47, - 0xA784: 0xCB4A, - 0xA785: 0xCB4B, - 0xA786: 0xCB4D, - 0xA787: 0xCB4E, - 0xA788: 0xCB4F, - 0xA789: 0xCB51, - 0xA78A: 0xCB52, - 0xA78B: 0xCB53, - 0xA78C: 0xCB54, - 0xA78D: 0xCB55, - 0xA78E: 0xCB56, - 0xA78F: 0xCB57, - 0xA790: 0xCB5A, - 0xA791: 0xCB5B, - 0xA792: 0xCB5C, - 0xA793: 0xCB5E, - 0xA794: 0xCB5F, - 0xA795: 0xCB60, - 0xA796: 0xCB61, - 0xA797: 0xCB62, - 0xA798: 0xCB63, - 0xA799: 0xCB65, - 0xA79A: 0xCB66, - 0xA79B: 0xCB67, - 0xA79C: 0xCB68, - 0xA79D: 0xCB69, - 0xA79E: 0xCB6A, - 0xA79F: 0xCB6B, - 0xA7A0: 0xCB6C, - 0xA7A1: 0x3395, - 0xA7A2: 0x3396, - 0xA7A3: 0x3397, - 0xA7A4: 0x2113, - 0xA7A5: 0x3398, - 0xA7A6: 0x33C4, - 0xA7A7: 0x33A3, - 0xA7A8: 0x33A4, - 0xA7A9: 0x33A5, - 0xA7AA: 0x33A6, - 0xA7AB: 0x3399, - 0xA7AC: 0x339A, - 0xA7AD: 0x339B, - 0xA7AE: 0x339C, - 0xA7AF: 0x339D, - 0xA7B0: 0x339E, - 0xA7B1: 0x339F, - 0xA7B2: 0x33A0, - 0xA7B3: 0x33A1, - 0xA7B4: 0x33A2, - 0xA7B5: 0x33CA, - 0xA7B6: 0x338D, - 0xA7B7: 0x338E, - 0xA7B8: 0x338F, - 0xA7B9: 0x33CF, - 0xA7BA: 0x3388, - 0xA7BB: 0x3389, - 0xA7BC: 0x33C8, - 0xA7BD: 0x33A7, - 0xA7BE: 0x33A8, - 0xA7BF: 0x33B0, - 0xA7C0: 0x33B1, - 0xA7C1: 0x33B2, - 0xA7C2: 0x33B3, - 0xA7C3: 0x33B4, - 0xA7C4: 0x33B5, - 0xA7C5: 0x33B6, - 0xA7C6: 0x33B7, - 0xA7C7: 0x33B8, - 0xA7C8: 0x33B9, - 0xA7C9: 0x3380, - 0xA7CA: 0x3381, - 0xA7CB: 0x3382, - 0xA7CC: 0x3383, - 0xA7CD: 0x3384, - 0xA7CE: 0x33BA, - 0xA7CF: 0x33BB, - 0xA7D0: 0x33BC, - 0xA7D1: 0x33BD, - 0xA7D2: 0x33BE, - 0xA7D3: 0x33BF, - 0xA7D4: 0x3390, - 0xA7D5: 0x3391, - 0xA7D6: 0x3392, - 0xA7D7: 0x3393, - 0xA7D8: 0x3394, - 0xA7D9: 0x2126, - 0xA7DA: 0x33C0, - 0xA7DB: 0x33C1, - 0xA7DC: 0x338A, - 0xA7DD: 0x338B, - 0xA7DE: 0x338C, - 0xA7DF: 0x33D6, - 0xA7E0: 0x33C5, - 0xA7E1: 0x33AD, - 0xA7E2: 0x33AE, - 0xA7E3: 0x33AF, - 0xA7E4: 0x33DB, - 0xA7E5: 0x33A9, - 0xA7E6: 0x33AA, - 0xA7E7: 0x33AB, - 0xA7E8: 0x33AC, - 0xA7E9: 0x33DD, - 0xA7EA: 0x33D0, - 0xA7EB: 0x33D3, - 0xA7EC: 0x33C3, - 0xA7ED: 0x33C9, - 0xA7EE: 0x33DC, - 0xA7EF: 0x33C6, - 0xA841: 0xCB6D, - 0xA842: 0xCB6E, - 0xA843: 0xCB6F, - 0xA844: 0xCB70, - 0xA845: 0xCB71, - 0xA846: 0xCB72, - 0xA847: 0xCB73, - 0xA848: 0xCB74, - 0xA849: 0xCB75, - 0xA84A: 0xCB76, - 0xA84B: 0xCB77, - 0xA84C: 0xCB7A, - 0xA84D: 0xCB7B, - 0xA84E: 0xCB7C, - 0xA84F: 0xCB7D, - 0xA850: 0xCB7E, - 0xA851: 0xCB7F, - 0xA852: 0xCB80, - 0xA853: 0xCB81, - 0xA854: 0xCB82, - 0xA855: 0xCB83, - 0xA856: 0xCB84, - 0xA857: 0xCB85, - 0xA858: 0xCB86, - 0xA859: 0xCB87, - 0xA85A: 0xCB88, - 0xA861: 0xCB89, - 0xA862: 0xCB8A, - 0xA863: 0xCB8B, - 0xA864: 0xCB8C, - 0xA865: 0xCB8D, - 0xA866: 0xCB8E, - 0xA867: 0xCB8F, - 0xA868: 0xCB90, - 0xA869: 0xCB91, - 0xA86A: 0xCB92, - 0xA86B: 0xCB93, - 0xA86C: 0xCB94, - 0xA86D: 0xCB95, - 0xA86E: 0xCB96, - 0xA86F: 0xCB97, - 0xA870: 0xCB98, - 0xA871: 0xCB99, - 0xA872: 0xCB9A, - 0xA873: 0xCB9B, - 0xA874: 0xCB9D, - 0xA875: 0xCB9E, - 0xA876: 0xCB9F, - 0xA877: 0xCBA0, - 0xA878: 0xCBA1, - 0xA879: 0xCBA2, - 0xA87A: 0xCBA3, - 0xA881: 0xCBA4, - 0xA882: 0xCBA5, - 0xA883: 0xCBA6, - 0xA884: 0xCBA7, - 0xA885: 0xCBA8, - 0xA886: 0xCBA9, - 0xA887: 0xCBAA, - 0xA888: 0xCBAB, - 0xA889: 0xCBAC, - 0xA88A: 0xCBAD, - 0xA88B: 0xCBAE, - 0xA88C: 0xCBAF, - 0xA88D: 0xCBB0, - 0xA88E: 0xCBB1, - 0xA88F: 0xCBB2, - 0xA890: 0xCBB3, - 0xA891: 0xCBB4, - 0xA892: 0xCBB5, - 0xA893: 0xCBB6, - 0xA894: 0xCBB7, - 0xA895: 0xCBB9, - 0xA896: 0xCBBA, - 0xA897: 0xCBBB, - 0xA898: 0xCBBC, - 0xA899: 0xCBBD, - 0xA89A: 0xCBBE, - 0xA89B: 0xCBBF, - 0xA89C: 0xCBC0, - 0xA89D: 0xCBC1, - 0xA89E: 0xCBC2, - 0xA89F: 0xCBC3, - 0xA8A0: 0xCBC4, - 0xA8A1: 0x00C6, - 0xA8A2: 0x00D0, - 0xA8A3: 0x00AA, - 0xA8A4: 0x0126, - 0xA8A6: 0x0132, - 0xA8A8: 0x013F, - 0xA8A9: 0x0141, - 0xA8AA: 0x00D8, - 0xA8AB: 0x0152, - 0xA8AC: 0x00BA, - 0xA8AD: 0x00DE, - 0xA8AE: 0x0166, - 0xA8AF: 0x014A, - 0xA8B1: 0x3260, - 0xA8B2: 0x3261, - 0xA8B3: 0x3262, - 0xA8B4: 0x3263, - 0xA8B5: 0x3264, - 0xA8B6: 0x3265, - 0xA8B7: 0x3266, - 0xA8B8: 0x3267, - 0xA8B9: 0x3268, - 0xA8BA: 0x3269, - 0xA8BB: 0x326A, - 0xA8BC: 0x326B, - 0xA8BD: 0x326C, - 0xA8BE: 0x326D, - 0xA8BF: 0x326E, - 0xA8C0: 0x326F, - 0xA8C1: 0x3270, - 0xA8C2: 0x3271, - 0xA8C3: 0x3272, - 0xA8C4: 0x3273, - 0xA8C5: 0x3274, - 0xA8C6: 0x3275, - 0xA8C7: 0x3276, - 0xA8C8: 0x3277, - 0xA8C9: 0x3278, - 0xA8CA: 0x3279, - 0xA8CB: 0x327A, - 0xA8CC: 0x327B, - 0xA8CD: 0x24D0, - 0xA8CE: 0x24D1, - 0xA8CF: 0x24D2, - 0xA8D0: 0x24D3, - 0xA8D1: 0x24D4, - 0xA8D2: 0x24D5, - 0xA8D3: 0x24D6, - 0xA8D4: 0x24D7, - 0xA8D5: 0x24D8, - 0xA8D6: 0x24D9, - 0xA8D7: 0x24DA, - 0xA8D8: 0x24DB, - 0xA8D9: 0x24DC, - 0xA8DA: 0x24DD, - 0xA8DB: 0x24DE, - 0xA8DC: 0x24DF, - 0xA8DD: 0x24E0, - 0xA8DE: 0x24E1, - 0xA8DF: 0x24E2, - 0xA8E0: 0x24E3, - 0xA8E1: 0x24E4, - 0xA8E2: 0x24E5, - 0xA8E3: 0x24E6, - 0xA8E4: 0x24E7, - 0xA8E5: 0x24E8, - 0xA8E6: 0x24E9, - 0xA8E7: 0x2460, - 0xA8E8: 0x2461, - 0xA8E9: 0x2462, - 0xA8EA: 0x2463, - 0xA8EB: 0x2464, - 0xA8EC: 0x2465, - 0xA8ED: 0x2466, - 0xA8EE: 0x2467, - 0xA8EF: 0x2468, - 0xA8F0: 0x2469, - 0xA8F1: 0x246A, - 0xA8F2: 0x246B, - 0xA8F3: 0x246C, - 0xA8F4: 0x246D, - 0xA8F5: 0x246E, - 0xA8F6: 0x00BD, - 0xA8F7: 0x2153, - 0xA8F8: 0x2154, - 0xA8F9: 0x00BC, - 0xA8FA: 0x00BE, - 0xA8FB: 0x215B, - 0xA8FC: 0x215C, - 0xA8FD: 0x215D, - 0xA8FE: 0x215E, - 0xA941: 0xCBC5, - 0xA942: 0xCBC6, - 0xA943: 0xCBC7, - 0xA944: 0xCBC8, - 0xA945: 0xCBC9, - 0xA946: 0xCBCA, - 0xA947: 0xCBCB, - 0xA948: 0xCBCC, - 0xA949: 0xCBCD, - 0xA94A: 0xCBCE, - 0xA94B: 0xCBCF, - 0xA94C: 0xCBD0, - 0xA94D: 0xCBD1, - 0xA94E: 0xCBD2, - 0xA94F: 0xCBD3, - 0xA950: 0xCBD5, - 0xA951: 0xCBD6, - 0xA952: 0xCBD7, - 0xA953: 0xCBD8, - 0xA954: 0xCBD9, - 0xA955: 0xCBDA, - 0xA956: 0xCBDB, - 0xA957: 0xCBDC, - 0xA958: 0xCBDD, - 0xA959: 0xCBDE, - 0xA95A: 0xCBDF, - 0xA961: 0xCBE0, - 0xA962: 0xCBE1, - 0xA963: 0xCBE2, - 0xA964: 0xCBE3, - 0xA965: 0xCBE5, - 0xA966: 0xCBE6, - 0xA967: 0xCBE8, - 0xA968: 0xCBEA, - 0xA969: 0xCBEB, - 0xA96A: 0xCBEC, - 0xA96B: 0xCBED, - 0xA96C: 0xCBEE, - 0xA96D: 0xCBEF, - 0xA96E: 0xCBF0, - 0xA96F: 0xCBF1, - 0xA970: 0xCBF2, - 0xA971: 0xCBF3, - 0xA972: 0xCBF4, - 0xA973: 0xCBF5, - 0xA974: 0xCBF6, - 0xA975: 0xCBF7, - 0xA976: 0xCBF8, - 0xA977: 0xCBF9, - 0xA978: 0xCBFA, - 0xA979: 0xCBFB, - 0xA97A: 0xCBFC, - 0xA981: 0xCBFD, - 0xA982: 0xCBFE, - 0xA983: 0xCBFF, - 0xA984: 0xCC00, - 0xA985: 0xCC01, - 0xA986: 0xCC02, - 0xA987: 0xCC03, - 0xA988: 0xCC04, - 0xA989: 0xCC05, - 0xA98A: 0xCC06, - 0xA98B: 0xCC07, - 0xA98C: 0xCC08, - 0xA98D: 0xCC09, - 0xA98E: 0xCC0A, - 0xA98F: 0xCC0B, - 0xA990: 0xCC0E, - 0xA991: 0xCC0F, - 0xA992: 0xCC11, - 0xA993: 0xCC12, - 0xA994: 0xCC13, - 0xA995: 0xCC15, - 0xA996: 0xCC16, - 0xA997: 0xCC17, - 0xA998: 0xCC18, - 0xA999: 0xCC19, - 0xA99A: 0xCC1A, - 0xA99B: 0xCC1B, - 0xA99C: 0xCC1E, - 0xA99D: 0xCC1F, - 0xA99E: 0xCC20, - 0xA99F: 0xCC23, - 0xA9A0: 0xCC24, - 0xA9A1: 0x00E6, - 0xA9A2: 0x0111, - 0xA9A3: 0x00F0, - 0xA9A4: 0x0127, - 0xA9A5: 0x0131, - 0xA9A6: 0x0133, - 0xA9A7: 0x0138, - 0xA9A8: 0x0140, - 0xA9A9: 0x0142, - 0xA9AA: 0x00F8, - 0xA9AB: 0x0153, - 0xA9AC: 0x00DF, - 0xA9AD: 0x00FE, - 0xA9AE: 0x0167, - 0xA9AF: 0x014B, - 0xA9B0: 0x0149, - 0xA9B1: 0x3200, - 0xA9B2: 0x3201, - 0xA9B3: 0x3202, - 0xA9B4: 0x3203, - 0xA9B5: 0x3204, - 0xA9B6: 0x3205, - 0xA9B7: 0x3206, - 0xA9B8: 0x3207, - 0xA9B9: 0x3208, - 0xA9BA: 0x3209, - 0xA9BB: 0x320A, - 0xA9BC: 0x320B, - 0xA9BD: 0x320C, - 0xA9BE: 0x320D, - 0xA9BF: 0x320E, - 0xA9C0: 0x320F, - 0xA9C1: 0x3210, - 0xA9C2: 0x3211, - 0xA9C3: 0x3212, - 0xA9C4: 0x3213, - 0xA9C5: 0x3214, - 0xA9C6: 0x3215, - 0xA9C7: 0x3216, - 0xA9C8: 0x3217, - 0xA9C9: 0x3218, - 0xA9CA: 0x3219, - 0xA9CB: 0x321A, - 0xA9CC: 0x321B, - 0xA9CD: 0x249C, - 0xA9CE: 0x249D, - 0xA9CF: 0x249E, - 0xA9D0: 0x249F, - 0xA9D1: 0x24A0, - 0xA9D2: 0x24A1, - 0xA9D3: 0x24A2, - 0xA9D4: 0x24A3, - 0xA9D5: 0x24A4, - 0xA9D6: 0x24A5, - 0xA9D7: 0x24A6, - 0xA9D8: 0x24A7, - 0xA9D9: 0x24A8, - 0xA9DA: 0x24A9, - 0xA9DB: 0x24AA, - 0xA9DC: 0x24AB, - 0xA9DD: 0x24AC, - 0xA9DE: 0x24AD, - 0xA9DF: 0x24AE, - 0xA9E0: 0x24AF, - 0xA9E1: 0x24B0, - 0xA9E2: 0x24B1, - 0xA9E3: 0x24B2, - 0xA9E4: 0x24B3, - 0xA9E5: 0x24B4, - 0xA9E6: 0x24B5, - 0xA9E7: 0x2474, - 0xA9E8: 0x2475, - 0xA9E9: 0x2476, - 0xA9EA: 0x2477, - 0xA9EB: 0x2478, - 0xA9EC: 0x2479, - 0xA9ED: 0x247A, - 0xA9EE: 0x247B, - 0xA9EF: 0x247C, - 0xA9F0: 0x247D, - 0xA9F1: 0x247E, - 0xA9F2: 0x247F, - 0xA9F3: 0x2480, - 0xA9F4: 0x2481, - 0xA9F5: 0x2482, - 0xA9F6: 0x00B9, - 0xA9F7: 0x00B2, - 0xA9F8: 0x00B3, - 0xA9F9: 0x2074, - 0xA9FA: 0x207F, - 0xA9FB: 0x2081, - 0xA9FC: 0x2082, - 0xA9FD: 0x2083, - 0xA9FE: 0x2084, - 0xAA41: 0xCC25, - 0xAA42: 0xCC26, - 0xAA43: 0xCC2A, - 0xAA44: 0xCC2B, - 0xAA45: 0xCC2D, - 0xAA46: 0xCC2F, - 0xAA47: 0xCC31, - 0xAA48: 0xCC32, - 0xAA49: 0xCC33, - 0xAA4A: 0xCC34, - 0xAA4B: 0xCC35, - 0xAA4C: 0xCC36, - 0xAA4D: 0xCC37, - 0xAA4E: 0xCC3A, - 0xAA4F: 0xCC3F, - 0xAA50: 0xCC40, - 0xAA51: 0xCC41, - 0xAA52: 0xCC42, - 0xAA53: 0xCC43, - 0xAA54: 0xCC46, - 0xAA55: 0xCC47, - 0xAA56: 0xCC49, - 0xAA57: 0xCC4A, - 0xAA58: 0xCC4B, - 0xAA59: 0xCC4D, - 0xAA5A: 0xCC4E, - 0xAA61: 0xCC4F, - 0xAA62: 0xCC50, - 0xAA63: 0xCC51, - 0xAA64: 0xCC52, - 0xAA65: 0xCC53, - 0xAA66: 0xCC56, - 0xAA67: 0xCC5A, - 0xAA68: 0xCC5B, - 0xAA69: 0xCC5C, - 0xAA6A: 0xCC5D, - 0xAA6B: 0xCC5E, - 0xAA6C: 0xCC5F, - 0xAA6D: 0xCC61, - 0xAA6E: 0xCC62, - 0xAA6F: 0xCC63, - 0xAA70: 0xCC65, - 0xAA71: 0xCC67, - 0xAA72: 0xCC69, - 0xAA73: 0xCC6A, - 0xAA74: 0xCC6B, - 0xAA75: 0xCC6C, - 0xAA76: 0xCC6D, - 0xAA77: 0xCC6E, - 0xAA78: 0xCC6F, - 0xAA79: 0xCC71, - 0xAA7A: 0xCC72, - 0xAA81: 0xCC73, - 0xAA82: 0xCC74, - 0xAA83: 0xCC76, - 0xAA84: 0xCC77, - 0xAA85: 0xCC78, - 0xAA86: 0xCC79, - 0xAA87: 0xCC7A, - 0xAA88: 0xCC7B, - 0xAA89: 0xCC7C, - 0xAA8A: 0xCC7D, - 0xAA8B: 0xCC7E, - 0xAA8C: 0xCC7F, - 0xAA8D: 0xCC80, - 0xAA8E: 0xCC81, - 0xAA8F: 0xCC82, - 0xAA90: 0xCC83, - 0xAA91: 0xCC84, - 0xAA92: 0xCC85, - 0xAA93: 0xCC86, - 0xAA94: 0xCC87, - 0xAA95: 0xCC88, - 0xAA96: 0xCC89, - 0xAA97: 0xCC8A, - 0xAA98: 0xCC8B, - 0xAA99: 0xCC8C, - 0xAA9A: 0xCC8D, - 0xAA9B: 0xCC8E, - 0xAA9C: 0xCC8F, - 0xAA9D: 0xCC90, - 0xAA9E: 0xCC91, - 0xAA9F: 0xCC92, - 0xAAA0: 0xCC93, - 0xAAA1: 0x3041, - 0xAAA2: 0x3042, - 0xAAA3: 0x3043, - 0xAAA4: 0x3044, - 0xAAA5: 0x3045, - 0xAAA6: 0x3046, - 0xAAA7: 0x3047, - 0xAAA8: 0x3048, - 0xAAA9: 0x3049, - 0xAAAA: 0x304A, - 0xAAAB: 0x304B, - 0xAAAC: 0x304C, - 0xAAAD: 0x304D, - 0xAAAE: 0x304E, - 0xAAAF: 0x304F, - 0xAAB0: 0x3050, - 0xAAB1: 0x3051, - 0xAAB2: 0x3052, - 0xAAB3: 0x3053, - 0xAAB4: 0x3054, - 0xAAB5: 0x3055, - 0xAAB6: 0x3056, - 0xAAB7: 0x3057, - 0xAAB8: 0x3058, - 0xAAB9: 0x3059, - 0xAABA: 0x305A, - 0xAABB: 0x305B, - 0xAABC: 0x305C, - 0xAABD: 0x305D, - 0xAABE: 0x305E, - 0xAABF: 0x305F, - 0xAAC0: 0x3060, - 0xAAC1: 0x3061, - 0xAAC2: 0x3062, - 0xAAC3: 0x3063, - 0xAAC4: 0x3064, - 0xAAC5: 0x3065, - 0xAAC6: 0x3066, - 0xAAC7: 0x3067, - 0xAAC8: 0x3068, - 0xAAC9: 0x3069, - 0xAACA: 0x306A, - 0xAACB: 0x306B, - 0xAACC: 0x306C, - 0xAACD: 0x306D, - 0xAACE: 0x306E, - 0xAACF: 0x306F, - 0xAAD0: 0x3070, - 0xAAD1: 0x3071, - 0xAAD2: 0x3072, - 0xAAD3: 0x3073, - 0xAAD4: 0x3074, - 0xAAD5: 0x3075, - 0xAAD6: 0x3076, - 0xAAD7: 0x3077, - 0xAAD8: 0x3078, - 0xAAD9: 0x3079, - 0xAADA: 0x307A, - 0xAADB: 0x307B, - 0xAADC: 0x307C, - 0xAADD: 0x307D, - 0xAADE: 0x307E, - 0xAADF: 0x307F, - 0xAAE0: 0x3080, - 0xAAE1: 0x3081, - 0xAAE2: 0x3082, - 0xAAE3: 0x3083, - 0xAAE4: 0x3084, - 0xAAE5: 0x3085, - 0xAAE6: 0x3086, - 0xAAE7: 0x3087, - 0xAAE8: 0x3088, - 0xAAE9: 0x3089, - 0xAAEA: 0x308A, - 0xAAEB: 0x308B, - 0xAAEC: 0x308C, - 0xAAED: 0x308D, - 0xAAEE: 0x308E, - 0xAAEF: 0x308F, - 0xAAF0: 0x3090, - 0xAAF1: 0x3091, - 0xAAF2: 0x3092, - 0xAAF3: 0x3093, - 0xAB41: 0xCC94, - 0xAB42: 0xCC95, - 0xAB43: 0xCC96, - 0xAB44: 0xCC97, - 0xAB45: 0xCC9A, - 0xAB46: 0xCC9B, - 0xAB47: 0xCC9D, - 0xAB48: 0xCC9E, - 0xAB49: 0xCC9F, - 0xAB4A: 0xCCA1, - 0xAB4B: 0xCCA2, - 0xAB4C: 0xCCA3, - 0xAB4D: 0xCCA4, - 0xAB4E: 0xCCA5, - 0xAB4F: 0xCCA6, - 0xAB50: 0xCCA7, - 0xAB51: 0xCCAA, - 0xAB52: 0xCCAE, - 0xAB53: 0xCCAF, - 0xAB54: 0xCCB0, - 0xAB55: 0xCCB1, - 0xAB56: 0xCCB2, - 0xAB57: 0xCCB3, - 0xAB58: 0xCCB6, - 0xAB59: 0xCCB7, - 0xAB5A: 0xCCB9, - 0xAB61: 0xCCBA, - 0xAB62: 0xCCBB, - 0xAB63: 0xCCBD, - 0xAB64: 0xCCBE, - 0xAB65: 0xCCBF, - 0xAB66: 0xCCC0, - 0xAB67: 0xCCC1, - 0xAB68: 0xCCC2, - 0xAB69: 0xCCC3, - 0xAB6A: 0xCCC6, - 0xAB6B: 0xCCC8, - 0xAB6C: 0xCCCA, - 0xAB6D: 0xCCCB, - 0xAB6E: 0xCCCC, - 0xAB6F: 0xCCCD, - 0xAB70: 0xCCCE, - 0xAB71: 0xCCCF, - 0xAB72: 0xCCD1, - 0xAB73: 0xCCD2, - 0xAB74: 0xCCD3, - 0xAB75: 0xCCD5, - 0xAB76: 0xCCD6, - 0xAB77: 0xCCD7, - 0xAB78: 0xCCD8, - 0xAB79: 0xCCD9, - 0xAB7A: 0xCCDA, - 0xAB81: 0xCCDB, - 0xAB82: 0xCCDC, - 0xAB83: 0xCCDD, - 0xAB84: 0xCCDE, - 0xAB85: 0xCCDF, - 0xAB86: 0xCCE0, - 0xAB87: 0xCCE1, - 0xAB88: 0xCCE2, - 0xAB89: 0xCCE3, - 0xAB8A: 0xCCE5, - 0xAB8B: 0xCCE6, - 0xAB8C: 0xCCE7, - 0xAB8D: 0xCCE8, - 0xAB8E: 0xCCE9, - 0xAB8F: 0xCCEA, - 0xAB90: 0xCCEB, - 0xAB91: 0xCCED, - 0xAB92: 0xCCEE, - 0xAB93: 0xCCEF, - 0xAB94: 0xCCF1, - 0xAB95: 0xCCF2, - 0xAB96: 0xCCF3, - 0xAB97: 0xCCF4, - 0xAB98: 0xCCF5, - 0xAB99: 0xCCF6, - 0xAB9A: 0xCCF7, - 0xAB9B: 0xCCF8, - 0xAB9C: 0xCCF9, - 0xAB9D: 0xCCFA, - 0xAB9E: 0xCCFB, - 0xAB9F: 0xCCFC, - 0xABA0: 0xCCFD, - 0xABA1: 0x30A1, - 0xABA2: 0x30A2, - 0xABA3: 0x30A3, - 0xABA4: 0x30A4, - 0xABA5: 0x30A5, - 0xABA6: 0x30A6, - 0xABA7: 0x30A7, - 0xABA8: 0x30A8, - 0xABA9: 0x30A9, - 0xABAA: 0x30AA, - 0xABAB: 0x30AB, - 0xABAC: 0x30AC, - 0xABAD: 0x30AD, - 0xABAE: 0x30AE, - 0xABAF: 0x30AF, - 0xABB0: 0x30B0, - 0xABB1: 0x30B1, - 0xABB2: 0x30B2, - 0xABB3: 0x30B3, - 0xABB4: 0x30B4, - 0xABB5: 0x30B5, - 0xABB6: 0x30B6, - 0xABB7: 0x30B7, - 0xABB8: 0x30B8, - 0xABB9: 0x30B9, - 0xABBA: 0x30BA, - 0xABBB: 0x30BB, - 0xABBC: 0x30BC, - 0xABBD: 0x30BD, - 0xABBE: 0x30BE, - 0xABBF: 0x30BF, - 0xABC0: 0x30C0, - 0xABC1: 0x30C1, - 0xABC2: 0x30C2, - 0xABC3: 0x30C3, - 0xABC4: 0x30C4, - 0xABC5: 0x30C5, - 0xABC6: 0x30C6, - 0xABC7: 0x30C7, - 0xABC8: 0x30C8, - 0xABC9: 0x30C9, - 0xABCA: 0x30CA, - 0xABCB: 0x30CB, - 0xABCC: 0x30CC, - 0xABCD: 0x30CD, - 0xABCE: 0x30CE, - 0xABCF: 0x30CF, - 0xABD0: 0x30D0, - 0xABD1: 0x30D1, - 0xABD2: 0x30D2, - 0xABD3: 0x30D3, - 0xABD4: 0x30D4, - 0xABD5: 0x30D5, - 0xABD6: 0x30D6, - 0xABD7: 0x30D7, - 0xABD8: 0x30D8, - 0xABD9: 0x30D9, - 0xABDA: 0x30DA, - 0xABDB: 0x30DB, - 0xABDC: 0x30DC, - 0xABDD: 0x30DD, - 0xABDE: 0x30DE, - 0xABDF: 0x30DF, - 0xABE0: 0x30E0, - 0xABE1: 0x30E1, - 0xABE2: 0x30E2, - 0xABE3: 0x30E3, - 0xABE4: 0x30E4, - 0xABE5: 0x30E5, - 0xABE6: 0x30E6, - 0xABE7: 0x30E7, - 0xABE8: 0x30E8, - 0xABE9: 0x30E9, - 0xABEA: 0x30EA, - 0xABEB: 0x30EB, - 0xABEC: 0x30EC, - 0xABED: 0x30ED, - 0xABEE: 0x30EE, - 0xABEF: 0x30EF, - 0xABF0: 0x30F0, - 0xABF1: 0x30F1, - 0xABF2: 0x30F2, - 0xABF3: 0x30F3, - 0xABF4: 0x30F4, - 0xABF5: 0x30F5, - 0xABF6: 0x30F6, - 0xAC41: 0xCCFE, - 0xAC42: 0xCCFF, - 0xAC43: 0xCD00, - 0xAC44: 0xCD02, - 0xAC45: 0xCD03, - 0xAC46: 0xCD04, - 0xAC47: 0xCD05, - 0xAC48: 0xCD06, - 0xAC49: 0xCD07, - 0xAC4A: 0xCD0A, - 0xAC4B: 0xCD0B, - 0xAC4C: 0xCD0D, - 0xAC4D: 0xCD0E, - 0xAC4E: 0xCD0F, - 0xAC4F: 0xCD11, - 0xAC50: 0xCD12, - 0xAC51: 0xCD13, - 0xAC52: 0xCD14, - 0xAC53: 0xCD15, - 0xAC54: 0xCD16, - 0xAC55: 0xCD17, - 0xAC56: 0xCD1A, - 0xAC57: 0xCD1C, - 0xAC58: 0xCD1E, - 0xAC59: 0xCD1F, - 0xAC5A: 0xCD20, - 0xAC61: 0xCD21, - 0xAC62: 0xCD22, - 0xAC63: 0xCD23, - 0xAC64: 0xCD25, - 0xAC65: 0xCD26, - 0xAC66: 0xCD27, - 0xAC67: 0xCD29, - 0xAC68: 0xCD2A, - 0xAC69: 0xCD2B, - 0xAC6A: 0xCD2D, - 0xAC6B: 0xCD2E, - 0xAC6C: 0xCD2F, - 0xAC6D: 0xCD30, - 0xAC6E: 0xCD31, - 0xAC6F: 0xCD32, - 0xAC70: 0xCD33, - 0xAC71: 0xCD34, - 0xAC72: 0xCD35, - 0xAC73: 0xCD36, - 0xAC74: 0xCD37, - 0xAC75: 0xCD38, - 0xAC76: 0xCD3A, - 0xAC77: 0xCD3B, - 0xAC78: 0xCD3C, - 0xAC79: 0xCD3D, - 0xAC7A: 0xCD3E, - 0xAC81: 0xCD3F, - 0xAC82: 0xCD40, - 0xAC83: 0xCD41, - 0xAC84: 0xCD42, - 0xAC85: 0xCD43, - 0xAC86: 0xCD44, - 0xAC87: 0xCD45, - 0xAC88: 0xCD46, - 0xAC89: 0xCD47, - 0xAC8A: 0xCD48, - 0xAC8B: 0xCD49, - 0xAC8C: 0xCD4A, - 0xAC8D: 0xCD4B, - 0xAC8E: 0xCD4C, - 0xAC8F: 0xCD4D, - 0xAC90: 0xCD4E, - 0xAC91: 0xCD4F, - 0xAC92: 0xCD50, - 0xAC93: 0xCD51, - 0xAC94: 0xCD52, - 0xAC95: 0xCD53, - 0xAC96: 0xCD54, - 0xAC97: 0xCD55, - 0xAC98: 0xCD56, - 0xAC99: 0xCD57, - 0xAC9A: 0xCD58, - 0xAC9B: 0xCD59, - 0xAC9C: 0xCD5A, - 0xAC9D: 0xCD5B, - 0xAC9E: 0xCD5D, - 0xAC9F: 0xCD5E, - 0xACA0: 0xCD5F, - 0xACA1: 0x0410, - 0xACA2: 0x0411, - 0xACA3: 0x0412, - 0xACA4: 0x0413, - 0xACA5: 0x0414, - 0xACA6: 0x0415, - 0xACA7: 0x0401, - 0xACA8: 0x0416, - 0xACA9: 0x0417, - 0xACAA: 0x0418, - 0xACAB: 0x0419, - 0xACAC: 0x041A, - 0xACAD: 0x041B, - 0xACAE: 0x041C, - 0xACAF: 0x041D, - 0xACB0: 0x041E, - 0xACB1: 0x041F, - 0xACB2: 0x0420, - 0xACB3: 0x0421, - 0xACB4: 0x0422, - 0xACB5: 0x0423, - 0xACB6: 0x0424, - 0xACB7: 0x0425, - 0xACB8: 0x0426, - 0xACB9: 0x0427, - 0xACBA: 0x0428, - 0xACBB: 0x0429, - 0xACBC: 0x042A, - 0xACBD: 0x042B, - 0xACBE: 0x042C, - 0xACBF: 0x042D, - 0xACC0: 0x042E, - 0xACC1: 0x042F, - 0xACD1: 0x0430, - 0xACD2: 0x0431, - 0xACD3: 0x0432, - 0xACD4: 0x0433, - 0xACD5: 0x0434, - 0xACD6: 0x0435, - 0xACD7: 0x0451, - 0xACD8: 0x0436, - 0xACD9: 0x0437, - 0xACDA: 0x0438, - 0xACDB: 0x0439, - 0xACDC: 0x043A, - 0xACDD: 0x043B, - 0xACDE: 0x043C, - 0xACDF: 0x043D, - 0xACE0: 0x043E, - 0xACE1: 0x043F, - 0xACE2: 0x0440, - 0xACE3: 0x0441, - 0xACE4: 0x0442, - 0xACE5: 0x0443, - 0xACE6: 0x0444, - 0xACE7: 0x0445, - 0xACE8: 0x0446, - 0xACE9: 0x0447, - 0xACEA: 0x0448, - 0xACEB: 0x0449, - 0xACEC: 0x044A, - 0xACED: 0x044B, - 0xACEE: 0x044C, - 0xACEF: 0x044D, - 0xACF0: 0x044E, - 0xACF1: 0x044F, - 0xAD41: 0xCD61, - 0xAD42: 0xCD62, - 0xAD43: 0xCD63, - 0xAD44: 0xCD65, - 0xAD45: 0xCD66, - 0xAD46: 0xCD67, - 0xAD47: 0xCD68, - 0xAD48: 0xCD69, - 0xAD49: 0xCD6A, - 0xAD4A: 0xCD6B, - 0xAD4B: 0xCD6E, - 0xAD4C: 0xCD70, - 0xAD4D: 0xCD72, - 0xAD4E: 0xCD73, - 0xAD4F: 0xCD74, - 0xAD50: 0xCD75, - 0xAD51: 0xCD76, - 0xAD52: 0xCD77, - 0xAD53: 0xCD79, - 0xAD54: 0xCD7A, - 0xAD55: 0xCD7B, - 0xAD56: 0xCD7C, - 0xAD57: 0xCD7D, - 0xAD58: 0xCD7E, - 0xAD59: 0xCD7F, - 0xAD5A: 0xCD80, - 0xAD61: 0xCD81, - 0xAD62: 0xCD82, - 0xAD63: 0xCD83, - 0xAD64: 0xCD84, - 0xAD65: 0xCD85, - 0xAD66: 0xCD86, - 0xAD67: 0xCD87, - 0xAD68: 0xCD89, - 0xAD69: 0xCD8A, - 0xAD6A: 0xCD8B, - 0xAD6B: 0xCD8C, - 0xAD6C: 0xCD8D, - 0xAD6D: 0xCD8E, - 0xAD6E: 0xCD8F, - 0xAD6F: 0xCD90, - 0xAD70: 0xCD91, - 0xAD71: 0xCD92, - 0xAD72: 0xCD93, - 0xAD73: 0xCD96, - 0xAD74: 0xCD97, - 0xAD75: 0xCD99, - 0xAD76: 0xCD9A, - 0xAD77: 0xCD9B, - 0xAD78: 0xCD9D, - 0xAD79: 0xCD9E, - 0xAD7A: 0xCD9F, - 0xAD81: 0xCDA0, - 0xAD82: 0xCDA1, - 0xAD83: 0xCDA2, - 0xAD84: 0xCDA3, - 0xAD85: 0xCDA6, - 0xAD86: 0xCDA8, - 0xAD87: 0xCDAA, - 0xAD88: 0xCDAB, - 0xAD89: 0xCDAC, - 0xAD8A: 0xCDAD, - 0xAD8B: 0xCDAE, - 0xAD8C: 0xCDAF, - 0xAD8D: 0xCDB1, - 0xAD8E: 0xCDB2, - 0xAD8F: 0xCDB3, - 0xAD90: 0xCDB4, - 0xAD91: 0xCDB5, - 0xAD92: 0xCDB6, - 0xAD93: 0xCDB7, - 0xAD94: 0xCDB8, - 0xAD95: 0xCDB9, - 0xAD96: 0xCDBA, - 0xAD97: 0xCDBB, - 0xAD98: 0xCDBC, - 0xAD99: 0xCDBD, - 0xAD9A: 0xCDBE, - 0xAD9B: 0xCDBF, - 0xAD9C: 0xCDC0, - 0xAD9D: 0xCDC1, - 0xAD9E: 0xCDC2, - 0xAD9F: 0xCDC3, - 0xADA0: 0xCDC5, - 0xAE41: 0xCDC6, - 0xAE42: 0xCDC7, - 0xAE43: 0xCDC8, - 0xAE44: 0xCDC9, - 0xAE45: 0xCDCA, - 0xAE46: 0xCDCB, - 0xAE47: 0xCDCD, - 0xAE48: 0xCDCE, - 0xAE49: 0xCDCF, - 0xAE4A: 0xCDD1, - 0xAE4B: 0xCDD2, - 0xAE4C: 0xCDD3, - 0xAE4D: 0xCDD4, - 0xAE4E: 0xCDD5, - 0xAE4F: 0xCDD6, - 0xAE50: 0xCDD7, - 0xAE51: 0xCDD8, - 0xAE52: 0xCDD9, - 0xAE53: 0xCDDA, - 0xAE54: 0xCDDB, - 0xAE55: 0xCDDC, - 0xAE56: 0xCDDD, - 0xAE57: 0xCDDE, - 0xAE58: 0xCDDF, - 0xAE59: 0xCDE0, - 0xAE5A: 0xCDE1, - 0xAE61: 0xCDE2, - 0xAE62: 0xCDE3, - 0xAE63: 0xCDE4, - 0xAE64: 0xCDE5, - 0xAE65: 0xCDE6, - 0xAE66: 0xCDE7, - 0xAE67: 0xCDE9, - 0xAE68: 0xCDEA, - 0xAE69: 0xCDEB, - 0xAE6A: 0xCDED, - 0xAE6B: 0xCDEE, - 0xAE6C: 0xCDEF, - 0xAE6D: 0xCDF1, - 0xAE6E: 0xCDF2, - 0xAE6F: 0xCDF3, - 0xAE70: 0xCDF4, - 0xAE71: 0xCDF5, - 0xAE72: 0xCDF6, - 0xAE73: 0xCDF7, - 0xAE74: 0xCDFA, - 0xAE75: 0xCDFC, - 0xAE76: 0xCDFE, - 0xAE77: 0xCDFF, - 0xAE78: 0xCE00, - 0xAE79: 0xCE01, - 0xAE7A: 0xCE02, - 0xAE81: 0xCE03, - 0xAE82: 0xCE05, - 0xAE83: 0xCE06, - 0xAE84: 0xCE07, - 0xAE85: 0xCE09, - 0xAE86: 0xCE0A, - 0xAE87: 0xCE0B, - 0xAE88: 0xCE0D, - 0xAE89: 0xCE0E, - 0xAE8A: 0xCE0F, - 0xAE8B: 0xCE10, - 0xAE8C: 0xCE11, - 0xAE8D: 0xCE12, - 0xAE8E: 0xCE13, - 0xAE8F: 0xCE15, - 0xAE90: 0xCE16, - 0xAE91: 0xCE17, - 0xAE92: 0xCE18, - 0xAE93: 0xCE1A, - 0xAE94: 0xCE1B, - 0xAE95: 0xCE1C, - 0xAE96: 0xCE1D, - 0xAE97: 0xCE1E, - 0xAE98: 0xCE1F, - 0xAE99: 0xCE22, - 0xAE9A: 0xCE23, - 0xAE9B: 0xCE25, - 0xAE9C: 0xCE26, - 0xAE9D: 0xCE27, - 0xAE9E: 0xCE29, - 0xAE9F: 0xCE2A, - 0xAEA0: 0xCE2B, - 0xAF41: 0xCE2C, - 0xAF42: 0xCE2D, - 0xAF43: 0xCE2E, - 0xAF44: 0xCE2F, - 0xAF45: 0xCE32, - 0xAF46: 0xCE34, - 0xAF47: 0xCE36, - 0xAF48: 0xCE37, - 0xAF49: 0xCE38, - 0xAF4A: 0xCE39, - 0xAF4B: 0xCE3A, - 0xAF4C: 0xCE3B, - 0xAF4D: 0xCE3C, - 0xAF4E: 0xCE3D, - 0xAF4F: 0xCE3E, - 0xAF50: 0xCE3F, - 0xAF51: 0xCE40, - 0xAF52: 0xCE41, - 0xAF53: 0xCE42, - 0xAF54: 0xCE43, - 0xAF55: 0xCE44, - 0xAF56: 0xCE45, - 0xAF57: 0xCE46, - 0xAF58: 0xCE47, - 0xAF59: 0xCE48, - 0xAF5A: 0xCE49, - 0xAF61: 0xCE4A, - 0xAF62: 0xCE4B, - 0xAF63: 0xCE4C, - 0xAF64: 0xCE4D, - 0xAF65: 0xCE4E, - 0xAF66: 0xCE4F, - 0xAF67: 0xCE50, - 0xAF68: 0xCE51, - 0xAF69: 0xCE52, - 0xAF6A: 0xCE53, - 0xAF6B: 0xCE54, - 0xAF6C: 0xCE55, - 0xAF6D: 0xCE56, - 0xAF6E: 0xCE57, - 0xAF6F: 0xCE5A, - 0xAF70: 0xCE5B, - 0xAF71: 0xCE5D, - 0xAF72: 0xCE5E, - 0xAF73: 0xCE62, - 0xAF74: 0xCE63, - 0xAF75: 0xCE64, - 0xAF76: 0xCE65, - 0xAF77: 0xCE66, - 0xAF78: 0xCE67, - 0xAF79: 0xCE6A, - 0xAF7A: 0xCE6C, - 0xAF81: 0xCE6E, - 0xAF82: 0xCE6F, - 0xAF83: 0xCE70, - 0xAF84: 0xCE71, - 0xAF85: 0xCE72, - 0xAF86: 0xCE73, - 0xAF87: 0xCE76, - 0xAF88: 0xCE77, - 0xAF89: 0xCE79, - 0xAF8A: 0xCE7A, - 0xAF8B: 0xCE7B, - 0xAF8C: 0xCE7D, - 0xAF8D: 0xCE7E, - 0xAF8E: 0xCE7F, - 0xAF8F: 0xCE80, - 0xAF90: 0xCE81, - 0xAF91: 0xCE82, - 0xAF92: 0xCE83, - 0xAF93: 0xCE86, - 0xAF94: 0xCE88, - 0xAF95: 0xCE8A, - 0xAF96: 0xCE8B, - 0xAF97: 0xCE8C, - 0xAF98: 0xCE8D, - 0xAF99: 0xCE8E, - 0xAF9A: 0xCE8F, - 0xAF9B: 0xCE92, - 0xAF9C: 0xCE93, - 0xAF9D: 0xCE95, - 0xAF9E: 0xCE96, - 0xAF9F: 0xCE97, - 0xAFA0: 0xCE99, - 0xB041: 0xCE9A, - 0xB042: 0xCE9B, - 0xB043: 0xCE9C, - 0xB044: 0xCE9D, - 0xB045: 0xCE9E, - 0xB046: 0xCE9F, - 0xB047: 0xCEA2, - 0xB048: 0xCEA6, - 0xB049: 0xCEA7, - 0xB04A: 0xCEA8, - 0xB04B: 0xCEA9, - 0xB04C: 0xCEAA, - 0xB04D: 0xCEAB, - 0xB04E: 0xCEAE, - 0xB04F: 0xCEAF, - 0xB050: 0xCEB0, - 0xB051: 0xCEB1, - 0xB052: 0xCEB2, - 0xB053: 0xCEB3, - 0xB054: 0xCEB4, - 0xB055: 0xCEB5, - 0xB056: 0xCEB6, - 0xB057: 0xCEB7, - 0xB058: 0xCEB8, - 0xB059: 0xCEB9, - 0xB05A: 0xCEBA, - 0xB061: 0xCEBB, - 0xB062: 0xCEBC, - 0xB063: 0xCEBD, - 0xB064: 0xCEBE, - 0xB065: 0xCEBF, - 0xB066: 0xCEC0, - 0xB067: 0xCEC2, - 0xB068: 0xCEC3, - 0xB069: 0xCEC4, - 0xB06A: 0xCEC5, - 0xB06B: 0xCEC6, - 0xB06C: 0xCEC7, - 0xB06D: 0xCEC8, - 0xB06E: 0xCEC9, - 0xB06F: 0xCECA, - 0xB070: 0xCECB, - 0xB071: 0xCECC, - 0xB072: 0xCECD, - 0xB073: 0xCECE, - 0xB074: 0xCECF, - 0xB075: 0xCED0, - 0xB076: 0xCED1, - 0xB077: 0xCED2, - 0xB078: 0xCED3, - 0xB079: 0xCED4, - 0xB07A: 0xCED5, - 0xB081: 0xCED6, - 0xB082: 0xCED7, - 0xB083: 0xCED8, - 0xB084: 0xCED9, - 0xB085: 0xCEDA, - 0xB086: 0xCEDB, - 0xB087: 0xCEDC, - 0xB088: 0xCEDD, - 0xB089: 0xCEDE, - 0xB08A: 0xCEDF, - 0xB08B: 0xCEE0, - 0xB08C: 0xCEE1, - 0xB08D: 0xCEE2, - 0xB08E: 0xCEE3, - 0xB08F: 0xCEE6, - 0xB090: 0xCEE7, - 0xB091: 0xCEE9, - 0xB092: 0xCEEA, - 0xB093: 0xCEED, - 0xB094: 0xCEEE, - 0xB095: 0xCEEF, - 0xB096: 0xCEF0, - 0xB097: 0xCEF1, - 0xB098: 0xCEF2, - 0xB099: 0xCEF3, - 0xB09A: 0xCEF6, - 0xB09B: 0xCEFA, - 0xB09C: 0xCEFB, - 0xB09D: 0xCEFC, - 0xB09E: 0xCEFD, - 0xB09F: 0xCEFE, - 0xB0A0: 0xCEFF, - 0xB0A1: 0xAC00, - 0xB0A2: 0xAC01, - 0xB0A3: 0xAC04, - 0xB0A4: 0xAC07, - 0xB0A5: 0xAC08, - 0xB0A6: 0xAC09, - 0xB0A7: 0xAC0A, - 0xB0A8: 0xAC10, - 0xB0A9: 0xAC11, - 0xB0AA: 0xAC12, - 0xB0AB: 0xAC13, - 0xB0AC: 0xAC14, - 0xB0AD: 0xAC15, - 0xB0AE: 0xAC16, - 0xB0AF: 0xAC17, - 0xB0B0: 0xAC19, - 0xB0B1: 0xAC1A, - 0xB0B2: 0xAC1B, - 0xB0B3: 0xAC1C, - 0xB0B4: 0xAC1D, - 0xB0B5: 0xAC20, - 0xB0B6: 0xAC24, - 0xB0B7: 0xAC2C, - 0xB0B8: 0xAC2D, - 0xB0B9: 0xAC2F, - 0xB0BA: 0xAC30, - 0xB0BB: 0xAC31, - 0xB0BC: 0xAC38, - 0xB0BD: 0xAC39, - 0xB0BE: 0xAC3C, - 0xB0BF: 0xAC40, - 0xB0C0: 0xAC4B, - 0xB0C1: 0xAC4D, - 0xB0C2: 0xAC54, - 0xB0C3: 0xAC58, - 0xB0C4: 0xAC5C, - 0xB0C5: 0xAC70, - 0xB0C6: 0xAC71, - 0xB0C7: 0xAC74, - 0xB0C8: 0xAC77, - 0xB0C9: 0xAC78, - 0xB0CA: 0xAC7A, - 0xB0CB: 0xAC80, - 0xB0CC: 0xAC81, - 0xB0CD: 0xAC83, - 0xB0CE: 0xAC84, - 0xB0CF: 0xAC85, - 0xB0D0: 0xAC86, - 0xB0D1: 0xAC89, - 0xB0D2: 0xAC8A, - 0xB0D3: 0xAC8B, - 0xB0D4: 0xAC8C, - 0xB0D5: 0xAC90, - 0xB0D6: 0xAC94, - 0xB0D7: 0xAC9C, - 0xB0D8: 0xAC9D, - 0xB0D9: 0xAC9F, - 0xB0DA: 0xACA0, - 0xB0DB: 0xACA1, - 0xB0DC: 0xACA8, - 0xB0DD: 0xACA9, - 0xB0DE: 0xACAA, - 0xB0DF: 0xACAC, - 0xB0E0: 0xACAF, - 0xB0E1: 0xACB0, - 0xB0E2: 0xACB8, - 0xB0E3: 0xACB9, - 0xB0E4: 0xACBB, - 0xB0E5: 0xACBC, - 0xB0E6: 0xACBD, - 0xB0E7: 0xACC1, - 0xB0E8: 0xACC4, - 0xB0E9: 0xACC8, - 0xB0EA: 0xACCC, - 0xB0EB: 0xACD5, - 0xB0EC: 0xACD7, - 0xB0ED: 0xACE0, - 0xB0EE: 0xACE1, - 0xB0EF: 0xACE4, - 0xB0F0: 0xACE7, - 0xB0F1: 0xACE8, - 0xB0F2: 0xACEA, - 0xB0F3: 0xACEC, - 0xB0F4: 0xACEF, - 0xB0F5: 0xACF0, - 0xB0F6: 0xACF1, - 0xB0F7: 0xACF3, - 0xB0F8: 0xACF5, - 0xB0F9: 0xACF6, - 0xB0FA: 0xACFC, - 0xB0FB: 0xACFD, - 0xB0FC: 0xAD00, - 0xB0FD: 0xAD04, - 0xB0FE: 0xAD06, - 0xB141: 0xCF02, - 0xB142: 0xCF03, - 0xB143: 0xCF05, - 0xB144: 0xCF06, - 0xB145: 0xCF07, - 0xB146: 0xCF09, - 0xB147: 0xCF0A, - 0xB148: 0xCF0B, - 0xB149: 0xCF0C, - 0xB14A: 0xCF0D, - 0xB14B: 0xCF0E, - 0xB14C: 0xCF0F, - 0xB14D: 0xCF12, - 0xB14E: 0xCF14, - 0xB14F: 0xCF16, - 0xB150: 0xCF17, - 0xB151: 0xCF18, - 0xB152: 0xCF19, - 0xB153: 0xCF1A, - 0xB154: 0xCF1B, - 0xB155: 0xCF1D, - 0xB156: 0xCF1E, - 0xB157: 0xCF1F, - 0xB158: 0xCF21, - 0xB159: 0xCF22, - 0xB15A: 0xCF23, - 0xB161: 0xCF25, - 0xB162: 0xCF26, - 0xB163: 0xCF27, - 0xB164: 0xCF28, - 0xB165: 0xCF29, - 0xB166: 0xCF2A, - 0xB167: 0xCF2B, - 0xB168: 0xCF2E, - 0xB169: 0xCF32, - 0xB16A: 0xCF33, - 0xB16B: 0xCF34, - 0xB16C: 0xCF35, - 0xB16D: 0xCF36, - 0xB16E: 0xCF37, - 0xB16F: 0xCF39, - 0xB170: 0xCF3A, - 0xB171: 0xCF3B, - 0xB172: 0xCF3C, - 0xB173: 0xCF3D, - 0xB174: 0xCF3E, - 0xB175: 0xCF3F, - 0xB176: 0xCF40, - 0xB177: 0xCF41, - 0xB178: 0xCF42, - 0xB179: 0xCF43, - 0xB17A: 0xCF44, - 0xB181: 0xCF45, - 0xB182: 0xCF46, - 0xB183: 0xCF47, - 0xB184: 0xCF48, - 0xB185: 0xCF49, - 0xB186: 0xCF4A, - 0xB187: 0xCF4B, - 0xB188: 0xCF4C, - 0xB189: 0xCF4D, - 0xB18A: 0xCF4E, - 0xB18B: 0xCF4F, - 0xB18C: 0xCF50, - 0xB18D: 0xCF51, - 0xB18E: 0xCF52, - 0xB18F: 0xCF53, - 0xB190: 0xCF56, - 0xB191: 0xCF57, - 0xB192: 0xCF59, - 0xB193: 0xCF5A, - 0xB194: 0xCF5B, - 0xB195: 0xCF5D, - 0xB196: 0xCF5E, - 0xB197: 0xCF5F, - 0xB198: 0xCF60, - 0xB199: 0xCF61, - 0xB19A: 0xCF62, - 0xB19B: 0xCF63, - 0xB19C: 0xCF66, - 0xB19D: 0xCF68, - 0xB19E: 0xCF6A, - 0xB19F: 0xCF6B, - 0xB1A0: 0xCF6C, - 0xB1A1: 0xAD0C, - 0xB1A2: 0xAD0D, - 0xB1A3: 0xAD0F, - 0xB1A4: 0xAD11, - 0xB1A5: 0xAD18, - 0xB1A6: 0xAD1C, - 0xB1A7: 0xAD20, - 0xB1A8: 0xAD29, - 0xB1A9: 0xAD2C, - 0xB1AA: 0xAD2D, - 0xB1AB: 0xAD34, - 0xB1AC: 0xAD35, - 0xB1AD: 0xAD38, - 0xB1AE: 0xAD3C, - 0xB1AF: 0xAD44, - 0xB1B0: 0xAD45, - 0xB1B1: 0xAD47, - 0xB1B2: 0xAD49, - 0xB1B3: 0xAD50, - 0xB1B4: 0xAD54, - 0xB1B5: 0xAD58, - 0xB1B6: 0xAD61, - 0xB1B7: 0xAD63, - 0xB1B8: 0xAD6C, - 0xB1B9: 0xAD6D, - 0xB1BA: 0xAD70, - 0xB1BB: 0xAD73, - 0xB1BC: 0xAD74, - 0xB1BD: 0xAD75, - 0xB1BE: 0xAD76, - 0xB1BF: 0xAD7B, - 0xB1C0: 0xAD7C, - 0xB1C1: 0xAD7D, - 0xB1C2: 0xAD7F, - 0xB1C3: 0xAD81, - 0xB1C4: 0xAD82, - 0xB1C5: 0xAD88, - 0xB1C6: 0xAD89, - 0xB1C7: 0xAD8C, - 0xB1C8: 0xAD90, - 0xB1C9: 0xAD9C, - 0xB1CA: 0xAD9D, - 0xB1CB: 0xADA4, - 0xB1CC: 0xADB7, - 0xB1CD: 0xADC0, - 0xB1CE: 0xADC1, - 0xB1CF: 0xADC4, - 0xB1D0: 0xADC8, - 0xB1D1: 0xADD0, - 0xB1D2: 0xADD1, - 0xB1D3: 0xADD3, - 0xB1D4: 0xADDC, - 0xB1D5: 0xADE0, - 0xB1D6: 0xADE4, - 0xB1D7: 0xADF8, - 0xB1D8: 0xADF9, - 0xB1D9: 0xADFC, - 0xB1DA: 0xADFF, - 0xB1DB: 0xAE00, - 0xB1DC: 0xAE01, - 0xB1DD: 0xAE08, - 0xB1DE: 0xAE09, - 0xB1DF: 0xAE0B, - 0xB1E0: 0xAE0D, - 0xB1E1: 0xAE14, - 0xB1E2: 0xAE30, - 0xB1E3: 0xAE31, - 0xB1E4: 0xAE34, - 0xB1E5: 0xAE37, - 0xB1E6: 0xAE38, - 0xB1E7: 0xAE3A, - 0xB1E8: 0xAE40, - 0xB1E9: 0xAE41, - 0xB1EA: 0xAE43, - 0xB1EB: 0xAE45, - 0xB1EC: 0xAE46, - 0xB1ED: 0xAE4A, - 0xB1EE: 0xAE4C, - 0xB1EF: 0xAE4D, - 0xB1F0: 0xAE4E, - 0xB1F1: 0xAE50, - 0xB1F2: 0xAE54, - 0xB1F3: 0xAE56, - 0xB1F4: 0xAE5C, - 0xB1F5: 0xAE5D, - 0xB1F6: 0xAE5F, - 0xB1F7: 0xAE60, - 0xB1F8: 0xAE61, - 0xB1F9: 0xAE65, - 0xB1FA: 0xAE68, - 0xB1FB: 0xAE69, - 0xB1FC: 0xAE6C, - 0xB1FD: 0xAE70, - 0xB1FE: 0xAE78, - 0xB241: 0xCF6D, - 0xB242: 0xCF6E, - 0xB243: 0xCF6F, - 0xB244: 0xCF72, - 0xB245: 0xCF73, - 0xB246: 0xCF75, - 0xB247: 0xCF76, - 0xB248: 0xCF77, - 0xB249: 0xCF79, - 0xB24A: 0xCF7A, - 0xB24B: 0xCF7B, - 0xB24C: 0xCF7C, - 0xB24D: 0xCF7D, - 0xB24E: 0xCF7E, - 0xB24F: 0xCF7F, - 0xB250: 0xCF81, - 0xB251: 0xCF82, - 0xB252: 0xCF83, - 0xB253: 0xCF84, - 0xB254: 0xCF86, - 0xB255: 0xCF87, - 0xB256: 0xCF88, - 0xB257: 0xCF89, - 0xB258: 0xCF8A, - 0xB259: 0xCF8B, - 0xB25A: 0xCF8D, - 0xB261: 0xCF8E, - 0xB262: 0xCF8F, - 0xB263: 0xCF90, - 0xB264: 0xCF91, - 0xB265: 0xCF92, - 0xB266: 0xCF93, - 0xB267: 0xCF94, - 0xB268: 0xCF95, - 0xB269: 0xCF96, - 0xB26A: 0xCF97, - 0xB26B: 0xCF98, - 0xB26C: 0xCF99, - 0xB26D: 0xCF9A, - 0xB26E: 0xCF9B, - 0xB26F: 0xCF9C, - 0xB270: 0xCF9D, - 0xB271: 0xCF9E, - 0xB272: 0xCF9F, - 0xB273: 0xCFA0, - 0xB274: 0xCFA2, - 0xB275: 0xCFA3, - 0xB276: 0xCFA4, - 0xB277: 0xCFA5, - 0xB278: 0xCFA6, - 0xB279: 0xCFA7, - 0xB27A: 0xCFA9, - 0xB281: 0xCFAA, - 0xB282: 0xCFAB, - 0xB283: 0xCFAC, - 0xB284: 0xCFAD, - 0xB285: 0xCFAE, - 0xB286: 0xCFAF, - 0xB287: 0xCFB1, - 0xB288: 0xCFB2, - 0xB289: 0xCFB3, - 0xB28A: 0xCFB4, - 0xB28B: 0xCFB5, - 0xB28C: 0xCFB6, - 0xB28D: 0xCFB7, - 0xB28E: 0xCFB8, - 0xB28F: 0xCFB9, - 0xB290: 0xCFBA, - 0xB291: 0xCFBB, - 0xB292: 0xCFBC, - 0xB293: 0xCFBD, - 0xB294: 0xCFBE, - 0xB295: 0xCFBF, - 0xB296: 0xCFC0, - 0xB297: 0xCFC1, - 0xB298: 0xCFC2, - 0xB299: 0xCFC3, - 0xB29A: 0xCFC5, - 0xB29B: 0xCFC6, - 0xB29C: 0xCFC7, - 0xB29D: 0xCFC8, - 0xB29E: 0xCFC9, - 0xB29F: 0xCFCA, - 0xB2A0: 0xCFCB, - 0xB2A1: 0xAE79, - 0xB2A2: 0xAE7B, - 0xB2A3: 0xAE7C, - 0xB2A4: 0xAE7D, - 0xB2A5: 0xAE84, - 0xB2A6: 0xAE85, - 0xB2A7: 0xAE8C, - 0xB2A8: 0xAEBC, - 0xB2A9: 0xAEBD, - 0xB2AA: 0xAEBE, - 0xB2AB: 0xAEC0, - 0xB2AC: 0xAEC4, - 0xB2AD: 0xAECC, - 0xB2AE: 0xAECD, - 0xB2AF: 0xAECF, - 0xB2B0: 0xAED0, - 0xB2B1: 0xAED1, - 0xB2B2: 0xAED8, - 0xB2B3: 0xAED9, - 0xB2B4: 0xAEDC, - 0xB2B5: 0xAEE8, - 0xB2B6: 0xAEEB, - 0xB2B7: 0xAEED, - 0xB2B8: 0xAEF4, - 0xB2B9: 0xAEF8, - 0xB2BA: 0xAEFC, - 0xB2BB: 0xAF07, - 0xB2BC: 0xAF08, - 0xB2BD: 0xAF0D, - 0xB2BE: 0xAF10, - 0xB2BF: 0xAF2C, - 0xB2C0: 0xAF2D, - 0xB2C1: 0xAF30, - 0xB2C2: 0xAF32, - 0xB2C3: 0xAF34, - 0xB2C4: 0xAF3C, - 0xB2C5: 0xAF3D, - 0xB2C6: 0xAF3F, - 0xB2C7: 0xAF41, - 0xB2C8: 0xAF42, - 0xB2C9: 0xAF43, - 0xB2CA: 0xAF48, - 0xB2CB: 0xAF49, - 0xB2CC: 0xAF50, - 0xB2CD: 0xAF5C, - 0xB2CE: 0xAF5D, - 0xB2CF: 0xAF64, - 0xB2D0: 0xAF65, - 0xB2D1: 0xAF79, - 0xB2D2: 0xAF80, - 0xB2D3: 0xAF84, - 0xB2D4: 0xAF88, - 0xB2D5: 0xAF90, - 0xB2D6: 0xAF91, - 0xB2D7: 0xAF95, - 0xB2D8: 0xAF9C, - 0xB2D9: 0xAFB8, - 0xB2DA: 0xAFB9, - 0xB2DB: 0xAFBC, - 0xB2DC: 0xAFC0, - 0xB2DD: 0xAFC7, - 0xB2DE: 0xAFC8, - 0xB2DF: 0xAFC9, - 0xB2E0: 0xAFCB, - 0xB2E1: 0xAFCD, - 0xB2E2: 0xAFCE, - 0xB2E3: 0xAFD4, - 0xB2E4: 0xAFDC, - 0xB2E5: 0xAFE8, - 0xB2E6: 0xAFE9, - 0xB2E7: 0xAFF0, - 0xB2E8: 0xAFF1, - 0xB2E9: 0xAFF4, - 0xB2EA: 0xAFF8, - 0xB2EB: 0xB000, - 0xB2EC: 0xB001, - 0xB2ED: 0xB004, - 0xB2EE: 0xB00C, - 0xB2EF: 0xB010, - 0xB2F0: 0xB014, - 0xB2F1: 0xB01C, - 0xB2F2: 0xB01D, - 0xB2F3: 0xB028, - 0xB2F4: 0xB044, - 0xB2F5: 0xB045, - 0xB2F6: 0xB048, - 0xB2F7: 0xB04A, - 0xB2F8: 0xB04C, - 0xB2F9: 0xB04E, - 0xB2FA: 0xB053, - 0xB2FB: 0xB054, - 0xB2FC: 0xB055, - 0xB2FD: 0xB057, - 0xB2FE: 0xB059, - 0xB341: 0xCFCC, - 0xB342: 0xCFCD, - 0xB343: 0xCFCE, - 0xB344: 0xCFCF, - 0xB345: 0xCFD0, - 0xB346: 0xCFD1, - 0xB347: 0xCFD2, - 0xB348: 0xCFD3, - 0xB349: 0xCFD4, - 0xB34A: 0xCFD5, - 0xB34B: 0xCFD6, - 0xB34C: 0xCFD7, - 0xB34D: 0xCFD8, - 0xB34E: 0xCFD9, - 0xB34F: 0xCFDA, - 0xB350: 0xCFDB, - 0xB351: 0xCFDC, - 0xB352: 0xCFDD, - 0xB353: 0xCFDE, - 0xB354: 0xCFDF, - 0xB355: 0xCFE2, - 0xB356: 0xCFE3, - 0xB357: 0xCFE5, - 0xB358: 0xCFE6, - 0xB359: 0xCFE7, - 0xB35A: 0xCFE9, - 0xB361: 0xCFEA, - 0xB362: 0xCFEB, - 0xB363: 0xCFEC, - 0xB364: 0xCFED, - 0xB365: 0xCFEE, - 0xB366: 0xCFEF, - 0xB367: 0xCFF2, - 0xB368: 0xCFF4, - 0xB369: 0xCFF6, - 0xB36A: 0xCFF7, - 0xB36B: 0xCFF8, - 0xB36C: 0xCFF9, - 0xB36D: 0xCFFA, - 0xB36E: 0xCFFB, - 0xB36F: 0xCFFD, - 0xB370: 0xCFFE, - 0xB371: 0xCFFF, - 0xB372: 0xD001, - 0xB373: 0xD002, - 0xB374: 0xD003, - 0xB375: 0xD005, - 0xB376: 0xD006, - 0xB377: 0xD007, - 0xB378: 0xD008, - 0xB379: 0xD009, - 0xB37A: 0xD00A, - 0xB381: 0xD00B, - 0xB382: 0xD00C, - 0xB383: 0xD00D, - 0xB384: 0xD00E, - 0xB385: 0xD00F, - 0xB386: 0xD010, - 0xB387: 0xD012, - 0xB388: 0xD013, - 0xB389: 0xD014, - 0xB38A: 0xD015, - 0xB38B: 0xD016, - 0xB38C: 0xD017, - 0xB38D: 0xD019, - 0xB38E: 0xD01A, - 0xB38F: 0xD01B, - 0xB390: 0xD01C, - 0xB391: 0xD01D, - 0xB392: 0xD01E, - 0xB393: 0xD01F, - 0xB394: 0xD020, - 0xB395: 0xD021, - 0xB396: 0xD022, - 0xB397: 0xD023, - 0xB398: 0xD024, - 0xB399: 0xD025, - 0xB39A: 0xD026, - 0xB39B: 0xD027, - 0xB39C: 0xD028, - 0xB39D: 0xD029, - 0xB39E: 0xD02A, - 0xB39F: 0xD02B, - 0xB3A0: 0xD02C, - 0xB3A1: 0xB05D, - 0xB3A2: 0xB07C, - 0xB3A3: 0xB07D, - 0xB3A4: 0xB080, - 0xB3A5: 0xB084, - 0xB3A6: 0xB08C, - 0xB3A7: 0xB08D, - 0xB3A8: 0xB08F, - 0xB3A9: 0xB091, - 0xB3AA: 0xB098, - 0xB3AB: 0xB099, - 0xB3AC: 0xB09A, - 0xB3AD: 0xB09C, - 0xB3AE: 0xB09F, - 0xB3AF: 0xB0A0, - 0xB3B0: 0xB0A1, - 0xB3B1: 0xB0A2, - 0xB3B2: 0xB0A8, - 0xB3B3: 0xB0A9, - 0xB3B4: 0xB0AB, - 0xB3B5: 0xB0AC, - 0xB3B6: 0xB0AD, - 0xB3B7: 0xB0AE, - 0xB3B8: 0xB0AF, - 0xB3B9: 0xB0B1, - 0xB3BA: 0xB0B3, - 0xB3BB: 0xB0B4, - 0xB3BC: 0xB0B5, - 0xB3BD: 0xB0B8, - 0xB3BE: 0xB0BC, - 0xB3BF: 0xB0C4, - 0xB3C0: 0xB0C5, - 0xB3C1: 0xB0C7, - 0xB3C2: 0xB0C8, - 0xB3C3: 0xB0C9, - 0xB3C4: 0xB0D0, - 0xB3C5: 0xB0D1, - 0xB3C6: 0xB0D4, - 0xB3C7: 0xB0D8, - 0xB3C8: 0xB0E0, - 0xB3C9: 0xB0E5, - 0xB3CA: 0xB108, - 0xB3CB: 0xB109, - 0xB3CC: 0xB10B, - 0xB3CD: 0xB10C, - 0xB3CE: 0xB110, - 0xB3CF: 0xB112, - 0xB3D0: 0xB113, - 0xB3D1: 0xB118, - 0xB3D2: 0xB119, - 0xB3D3: 0xB11B, - 0xB3D4: 0xB11C, - 0xB3D5: 0xB11D, - 0xB3D6: 0xB123, - 0xB3D7: 0xB124, - 0xB3D8: 0xB125, - 0xB3D9: 0xB128, - 0xB3DA: 0xB12C, - 0xB3DB: 0xB134, - 0xB3DC: 0xB135, - 0xB3DD: 0xB137, - 0xB3DE: 0xB138, - 0xB3DF: 0xB139, - 0xB3E0: 0xB140, - 0xB3E1: 0xB141, - 0xB3E2: 0xB144, - 0xB3E3: 0xB148, - 0xB3E4: 0xB150, - 0xB3E5: 0xB151, - 0xB3E6: 0xB154, - 0xB3E7: 0xB155, - 0xB3E8: 0xB158, - 0xB3E9: 0xB15C, - 0xB3EA: 0xB160, - 0xB3EB: 0xB178, - 0xB3EC: 0xB179, - 0xB3ED: 0xB17C, - 0xB3EE: 0xB180, - 0xB3EF: 0xB182, - 0xB3F0: 0xB188, - 0xB3F1: 0xB189, - 0xB3F2: 0xB18B, - 0xB3F3: 0xB18D, - 0xB3F4: 0xB192, - 0xB3F5: 0xB193, - 0xB3F6: 0xB194, - 0xB3F7: 0xB198, - 0xB3F8: 0xB19C, - 0xB3F9: 0xB1A8, - 0xB3FA: 0xB1CC, - 0xB3FB: 0xB1D0, - 0xB3FC: 0xB1D4, - 0xB3FD: 0xB1DC, - 0xB3FE: 0xB1DD, - 0xB441: 0xD02E, - 0xB442: 0xD02F, - 0xB443: 0xD030, - 0xB444: 0xD031, - 0xB445: 0xD032, - 0xB446: 0xD033, - 0xB447: 0xD036, - 0xB448: 0xD037, - 0xB449: 0xD039, - 0xB44A: 0xD03A, - 0xB44B: 0xD03B, - 0xB44C: 0xD03D, - 0xB44D: 0xD03E, - 0xB44E: 0xD03F, - 0xB44F: 0xD040, - 0xB450: 0xD041, - 0xB451: 0xD042, - 0xB452: 0xD043, - 0xB453: 0xD046, - 0xB454: 0xD048, - 0xB455: 0xD04A, - 0xB456: 0xD04B, - 0xB457: 0xD04C, - 0xB458: 0xD04D, - 0xB459: 0xD04E, - 0xB45A: 0xD04F, - 0xB461: 0xD051, - 0xB462: 0xD052, - 0xB463: 0xD053, - 0xB464: 0xD055, - 0xB465: 0xD056, - 0xB466: 0xD057, - 0xB467: 0xD059, - 0xB468: 0xD05A, - 0xB469: 0xD05B, - 0xB46A: 0xD05C, - 0xB46B: 0xD05D, - 0xB46C: 0xD05E, - 0xB46D: 0xD05F, - 0xB46E: 0xD061, - 0xB46F: 0xD062, - 0xB470: 0xD063, - 0xB471: 0xD064, - 0xB472: 0xD065, - 0xB473: 0xD066, - 0xB474: 0xD067, - 0xB475: 0xD068, - 0xB476: 0xD069, - 0xB477: 0xD06A, - 0xB478: 0xD06B, - 0xB479: 0xD06E, - 0xB47A: 0xD06F, - 0xB481: 0xD071, - 0xB482: 0xD072, - 0xB483: 0xD073, - 0xB484: 0xD075, - 0xB485: 0xD076, - 0xB486: 0xD077, - 0xB487: 0xD078, - 0xB488: 0xD079, - 0xB489: 0xD07A, - 0xB48A: 0xD07B, - 0xB48B: 0xD07E, - 0xB48C: 0xD07F, - 0xB48D: 0xD080, - 0xB48E: 0xD082, - 0xB48F: 0xD083, - 0xB490: 0xD084, - 0xB491: 0xD085, - 0xB492: 0xD086, - 0xB493: 0xD087, - 0xB494: 0xD088, - 0xB495: 0xD089, - 0xB496: 0xD08A, - 0xB497: 0xD08B, - 0xB498: 0xD08C, - 0xB499: 0xD08D, - 0xB49A: 0xD08E, - 0xB49B: 0xD08F, - 0xB49C: 0xD090, - 0xB49D: 0xD091, - 0xB49E: 0xD092, - 0xB49F: 0xD093, - 0xB4A0: 0xD094, - 0xB4A1: 0xB1DF, - 0xB4A2: 0xB1E8, - 0xB4A3: 0xB1E9, - 0xB4A4: 0xB1EC, - 0xB4A5: 0xB1F0, - 0xB4A6: 0xB1F9, - 0xB4A7: 0xB1FB, - 0xB4A8: 0xB1FD, - 0xB4A9: 0xB204, - 0xB4AA: 0xB205, - 0xB4AB: 0xB208, - 0xB4AC: 0xB20B, - 0xB4AD: 0xB20C, - 0xB4AE: 0xB214, - 0xB4AF: 0xB215, - 0xB4B0: 0xB217, - 0xB4B1: 0xB219, - 0xB4B2: 0xB220, - 0xB4B3: 0xB234, - 0xB4B4: 0xB23C, - 0xB4B5: 0xB258, - 0xB4B6: 0xB25C, - 0xB4B7: 0xB260, - 0xB4B8: 0xB268, - 0xB4B9: 0xB269, - 0xB4BA: 0xB274, - 0xB4BB: 0xB275, - 0xB4BC: 0xB27C, - 0xB4BD: 0xB284, - 0xB4BE: 0xB285, - 0xB4BF: 0xB289, - 0xB4C0: 0xB290, - 0xB4C1: 0xB291, - 0xB4C2: 0xB294, - 0xB4C3: 0xB298, - 0xB4C4: 0xB299, - 0xB4C5: 0xB29A, - 0xB4C6: 0xB2A0, - 0xB4C7: 0xB2A1, - 0xB4C8: 0xB2A3, - 0xB4C9: 0xB2A5, - 0xB4CA: 0xB2A6, - 0xB4CB: 0xB2AA, - 0xB4CC: 0xB2AC, - 0xB4CD: 0xB2B0, - 0xB4CE: 0xB2B4, - 0xB4CF: 0xB2C8, - 0xB4D0: 0xB2C9, - 0xB4D1: 0xB2CC, - 0xB4D2: 0xB2D0, - 0xB4D3: 0xB2D2, - 0xB4D4: 0xB2D8, - 0xB4D5: 0xB2D9, - 0xB4D6: 0xB2DB, - 0xB4D7: 0xB2DD, - 0xB4D8: 0xB2E2, - 0xB4D9: 0xB2E4, - 0xB4DA: 0xB2E5, - 0xB4DB: 0xB2E6, - 0xB4DC: 0xB2E8, - 0xB4DD: 0xB2EB, - 0xB4DE: 0xB2EC, - 0xB4DF: 0xB2ED, - 0xB4E0: 0xB2EE, - 0xB4E1: 0xB2EF, - 0xB4E2: 0xB2F3, - 0xB4E3: 0xB2F4, - 0xB4E4: 0xB2F5, - 0xB4E5: 0xB2F7, - 0xB4E6: 0xB2F8, - 0xB4E7: 0xB2F9, - 0xB4E8: 0xB2FA, - 0xB4E9: 0xB2FB, - 0xB4EA: 0xB2FF, - 0xB4EB: 0xB300, - 0xB4EC: 0xB301, - 0xB4ED: 0xB304, - 0xB4EE: 0xB308, - 0xB4EF: 0xB310, - 0xB4F0: 0xB311, - 0xB4F1: 0xB313, - 0xB4F2: 0xB314, - 0xB4F3: 0xB315, - 0xB4F4: 0xB31C, - 0xB4F5: 0xB354, - 0xB4F6: 0xB355, - 0xB4F7: 0xB356, - 0xB4F8: 0xB358, - 0xB4F9: 0xB35B, - 0xB4FA: 0xB35C, - 0xB4FB: 0xB35E, - 0xB4FC: 0xB35F, - 0xB4FD: 0xB364, - 0xB4FE: 0xB365, - 0xB541: 0xD095, - 0xB542: 0xD096, - 0xB543: 0xD097, - 0xB544: 0xD098, - 0xB545: 0xD099, - 0xB546: 0xD09A, - 0xB547: 0xD09B, - 0xB548: 0xD09C, - 0xB549: 0xD09D, - 0xB54A: 0xD09E, - 0xB54B: 0xD09F, - 0xB54C: 0xD0A0, - 0xB54D: 0xD0A1, - 0xB54E: 0xD0A2, - 0xB54F: 0xD0A3, - 0xB550: 0xD0A6, - 0xB551: 0xD0A7, - 0xB552: 0xD0A9, - 0xB553: 0xD0AA, - 0xB554: 0xD0AB, - 0xB555: 0xD0AD, - 0xB556: 0xD0AE, - 0xB557: 0xD0AF, - 0xB558: 0xD0B0, - 0xB559: 0xD0B1, - 0xB55A: 0xD0B2, - 0xB561: 0xD0B3, - 0xB562: 0xD0B6, - 0xB563: 0xD0B8, - 0xB564: 0xD0BA, - 0xB565: 0xD0BB, - 0xB566: 0xD0BC, - 0xB567: 0xD0BD, - 0xB568: 0xD0BE, - 0xB569: 0xD0BF, - 0xB56A: 0xD0C2, - 0xB56B: 0xD0C3, - 0xB56C: 0xD0C5, - 0xB56D: 0xD0C6, - 0xB56E: 0xD0C7, - 0xB56F: 0xD0CA, - 0xB570: 0xD0CB, - 0xB571: 0xD0CC, - 0xB572: 0xD0CD, - 0xB573: 0xD0CE, - 0xB574: 0xD0CF, - 0xB575: 0xD0D2, - 0xB576: 0xD0D6, - 0xB577: 0xD0D7, - 0xB578: 0xD0D8, - 0xB579: 0xD0D9, - 0xB57A: 0xD0DA, - 0xB581: 0xD0DB, - 0xB582: 0xD0DE, - 0xB583: 0xD0DF, - 0xB584: 0xD0E1, - 0xB585: 0xD0E2, - 0xB586: 0xD0E3, - 0xB587: 0xD0E5, - 0xB588: 0xD0E6, - 0xB589: 0xD0E7, - 0xB58A: 0xD0E8, - 0xB58B: 0xD0E9, - 0xB58C: 0xD0EA, - 0xB58D: 0xD0EB, - 0xB58E: 0xD0EE, - 0xB58F: 0xD0F2, - 0xB590: 0xD0F3, - 0xB591: 0xD0F4, - 0xB592: 0xD0F5, - 0xB593: 0xD0F6, - 0xB594: 0xD0F7, - 0xB595: 0xD0F9, - 0xB596: 0xD0FA, - 0xB597: 0xD0FB, - 0xB598: 0xD0FC, - 0xB599: 0xD0FD, - 0xB59A: 0xD0FE, - 0xB59B: 0xD0FF, - 0xB59C: 0xD100, - 0xB59D: 0xD101, - 0xB59E: 0xD102, - 0xB59F: 0xD103, - 0xB5A0: 0xD104, - 0xB5A1: 0xB367, - 0xB5A2: 0xB369, - 0xB5A3: 0xB36B, - 0xB5A4: 0xB36E, - 0xB5A5: 0xB370, - 0xB5A6: 0xB371, - 0xB5A7: 0xB374, - 0xB5A8: 0xB378, - 0xB5A9: 0xB380, - 0xB5AA: 0xB381, - 0xB5AB: 0xB383, - 0xB5AC: 0xB384, - 0xB5AD: 0xB385, - 0xB5AE: 0xB38C, - 0xB5AF: 0xB390, - 0xB5B0: 0xB394, - 0xB5B1: 0xB3A0, - 0xB5B2: 0xB3A1, - 0xB5B3: 0xB3A8, - 0xB5B4: 0xB3AC, - 0xB5B5: 0xB3C4, - 0xB5B6: 0xB3C5, - 0xB5B7: 0xB3C8, - 0xB5B8: 0xB3CB, - 0xB5B9: 0xB3CC, - 0xB5BA: 0xB3CE, - 0xB5BB: 0xB3D0, - 0xB5BC: 0xB3D4, - 0xB5BD: 0xB3D5, - 0xB5BE: 0xB3D7, - 0xB5BF: 0xB3D9, - 0xB5C0: 0xB3DB, - 0xB5C1: 0xB3DD, - 0xB5C2: 0xB3E0, - 0xB5C3: 0xB3E4, - 0xB5C4: 0xB3E8, - 0xB5C5: 0xB3FC, - 0xB5C6: 0xB410, - 0xB5C7: 0xB418, - 0xB5C8: 0xB41C, - 0xB5C9: 0xB420, - 0xB5CA: 0xB428, - 0xB5CB: 0xB429, - 0xB5CC: 0xB42B, - 0xB5CD: 0xB434, - 0xB5CE: 0xB450, - 0xB5CF: 0xB451, - 0xB5D0: 0xB454, - 0xB5D1: 0xB458, - 0xB5D2: 0xB460, - 0xB5D3: 0xB461, - 0xB5D4: 0xB463, - 0xB5D5: 0xB465, - 0xB5D6: 0xB46C, - 0xB5D7: 0xB480, - 0xB5D8: 0xB488, - 0xB5D9: 0xB49D, - 0xB5DA: 0xB4A4, - 0xB5DB: 0xB4A8, - 0xB5DC: 0xB4AC, - 0xB5DD: 0xB4B5, - 0xB5DE: 0xB4B7, - 0xB5DF: 0xB4B9, - 0xB5E0: 0xB4C0, - 0xB5E1: 0xB4C4, - 0xB5E2: 0xB4C8, - 0xB5E3: 0xB4D0, - 0xB5E4: 0xB4D5, - 0xB5E5: 0xB4DC, - 0xB5E6: 0xB4DD, - 0xB5E7: 0xB4E0, - 0xB5E8: 0xB4E3, - 0xB5E9: 0xB4E4, - 0xB5EA: 0xB4E6, - 0xB5EB: 0xB4EC, - 0xB5EC: 0xB4ED, - 0xB5ED: 0xB4EF, - 0xB5EE: 0xB4F1, - 0xB5EF: 0xB4F8, - 0xB5F0: 0xB514, - 0xB5F1: 0xB515, - 0xB5F2: 0xB518, - 0xB5F3: 0xB51B, - 0xB5F4: 0xB51C, - 0xB5F5: 0xB524, - 0xB5F6: 0xB525, - 0xB5F7: 0xB527, - 0xB5F8: 0xB528, - 0xB5F9: 0xB529, - 0xB5FA: 0xB52A, - 0xB5FB: 0xB530, - 0xB5FC: 0xB531, - 0xB5FD: 0xB534, - 0xB5FE: 0xB538, - 0xB641: 0xD105, - 0xB642: 0xD106, - 0xB643: 0xD107, - 0xB644: 0xD108, - 0xB645: 0xD109, - 0xB646: 0xD10A, - 0xB647: 0xD10B, - 0xB648: 0xD10C, - 0xB649: 0xD10E, - 0xB64A: 0xD10F, - 0xB64B: 0xD110, - 0xB64C: 0xD111, - 0xB64D: 0xD112, - 0xB64E: 0xD113, - 0xB64F: 0xD114, - 0xB650: 0xD115, - 0xB651: 0xD116, - 0xB652: 0xD117, - 0xB653: 0xD118, - 0xB654: 0xD119, - 0xB655: 0xD11A, - 0xB656: 0xD11B, - 0xB657: 0xD11C, - 0xB658: 0xD11D, - 0xB659: 0xD11E, - 0xB65A: 0xD11F, - 0xB661: 0xD120, - 0xB662: 0xD121, - 0xB663: 0xD122, - 0xB664: 0xD123, - 0xB665: 0xD124, - 0xB666: 0xD125, - 0xB667: 0xD126, - 0xB668: 0xD127, - 0xB669: 0xD128, - 0xB66A: 0xD129, - 0xB66B: 0xD12A, - 0xB66C: 0xD12B, - 0xB66D: 0xD12C, - 0xB66E: 0xD12D, - 0xB66F: 0xD12E, - 0xB670: 0xD12F, - 0xB671: 0xD132, - 0xB672: 0xD133, - 0xB673: 0xD135, - 0xB674: 0xD136, - 0xB675: 0xD137, - 0xB676: 0xD139, - 0xB677: 0xD13B, - 0xB678: 0xD13C, - 0xB679: 0xD13D, - 0xB67A: 0xD13E, - 0xB681: 0xD13F, - 0xB682: 0xD142, - 0xB683: 0xD146, - 0xB684: 0xD147, - 0xB685: 0xD148, - 0xB686: 0xD149, - 0xB687: 0xD14A, - 0xB688: 0xD14B, - 0xB689: 0xD14E, - 0xB68A: 0xD14F, - 0xB68B: 0xD151, - 0xB68C: 0xD152, - 0xB68D: 0xD153, - 0xB68E: 0xD155, - 0xB68F: 0xD156, - 0xB690: 0xD157, - 0xB691: 0xD158, - 0xB692: 0xD159, - 0xB693: 0xD15A, - 0xB694: 0xD15B, - 0xB695: 0xD15E, - 0xB696: 0xD160, - 0xB697: 0xD162, - 0xB698: 0xD163, - 0xB699: 0xD164, - 0xB69A: 0xD165, - 0xB69B: 0xD166, - 0xB69C: 0xD167, - 0xB69D: 0xD169, - 0xB69E: 0xD16A, - 0xB69F: 0xD16B, - 0xB6A0: 0xD16D, - 0xB6A1: 0xB540, - 0xB6A2: 0xB541, - 0xB6A3: 0xB543, - 0xB6A4: 0xB544, - 0xB6A5: 0xB545, - 0xB6A6: 0xB54B, - 0xB6A7: 0xB54C, - 0xB6A8: 0xB54D, - 0xB6A9: 0xB550, - 0xB6AA: 0xB554, - 0xB6AB: 0xB55C, - 0xB6AC: 0xB55D, - 0xB6AD: 0xB55F, - 0xB6AE: 0xB560, - 0xB6AF: 0xB561, - 0xB6B0: 0xB5A0, - 0xB6B1: 0xB5A1, - 0xB6B2: 0xB5A4, - 0xB6B3: 0xB5A8, - 0xB6B4: 0xB5AA, - 0xB6B5: 0xB5AB, - 0xB6B6: 0xB5B0, - 0xB6B7: 0xB5B1, - 0xB6B8: 0xB5B3, - 0xB6B9: 0xB5B4, - 0xB6BA: 0xB5B5, - 0xB6BB: 0xB5BB, - 0xB6BC: 0xB5BC, - 0xB6BD: 0xB5BD, - 0xB6BE: 0xB5C0, - 0xB6BF: 0xB5C4, - 0xB6C0: 0xB5CC, - 0xB6C1: 0xB5CD, - 0xB6C2: 0xB5CF, - 0xB6C3: 0xB5D0, - 0xB6C4: 0xB5D1, - 0xB6C5: 0xB5D8, - 0xB6C6: 0xB5EC, - 0xB6C7: 0xB610, - 0xB6C8: 0xB611, - 0xB6C9: 0xB614, - 0xB6CA: 0xB618, - 0xB6CB: 0xB625, - 0xB6CC: 0xB62C, - 0xB6CD: 0xB634, - 0xB6CE: 0xB648, - 0xB6CF: 0xB664, - 0xB6D0: 0xB668, - 0xB6D1: 0xB69C, - 0xB6D2: 0xB69D, - 0xB6D3: 0xB6A0, - 0xB6D4: 0xB6A4, - 0xB6D5: 0xB6AB, - 0xB6D6: 0xB6AC, - 0xB6D7: 0xB6B1, - 0xB6D8: 0xB6D4, - 0xB6D9: 0xB6F0, - 0xB6DA: 0xB6F4, - 0xB6DB: 0xB6F8, - 0xB6DC: 0xB700, - 0xB6DD: 0xB701, - 0xB6DE: 0xB705, - 0xB6DF: 0xB728, - 0xB6E0: 0xB729, - 0xB6E1: 0xB72C, - 0xB6E2: 0xB72F, - 0xB6E3: 0xB730, - 0xB6E4: 0xB738, - 0xB6E5: 0xB739, - 0xB6E6: 0xB73B, - 0xB6E7: 0xB744, - 0xB6E8: 0xB748, - 0xB6E9: 0xB74C, - 0xB6EA: 0xB754, - 0xB6EB: 0xB755, - 0xB6EC: 0xB760, - 0xB6ED: 0xB764, - 0xB6EE: 0xB768, - 0xB6EF: 0xB770, - 0xB6F0: 0xB771, - 0xB6F1: 0xB773, - 0xB6F2: 0xB775, - 0xB6F3: 0xB77C, - 0xB6F4: 0xB77D, - 0xB6F5: 0xB780, - 0xB6F6: 0xB784, - 0xB6F7: 0xB78C, - 0xB6F8: 0xB78D, - 0xB6F9: 0xB78F, - 0xB6FA: 0xB790, - 0xB6FB: 0xB791, - 0xB6FC: 0xB792, - 0xB6FD: 0xB796, - 0xB6FE: 0xB797, - 0xB741: 0xD16E, - 0xB742: 0xD16F, - 0xB743: 0xD170, - 0xB744: 0xD171, - 0xB745: 0xD172, - 0xB746: 0xD173, - 0xB747: 0xD174, - 0xB748: 0xD175, - 0xB749: 0xD176, - 0xB74A: 0xD177, - 0xB74B: 0xD178, - 0xB74C: 0xD179, - 0xB74D: 0xD17A, - 0xB74E: 0xD17B, - 0xB74F: 0xD17D, - 0xB750: 0xD17E, - 0xB751: 0xD17F, - 0xB752: 0xD180, - 0xB753: 0xD181, - 0xB754: 0xD182, - 0xB755: 0xD183, - 0xB756: 0xD185, - 0xB757: 0xD186, - 0xB758: 0xD187, - 0xB759: 0xD189, - 0xB75A: 0xD18A, - 0xB761: 0xD18B, - 0xB762: 0xD18C, - 0xB763: 0xD18D, - 0xB764: 0xD18E, - 0xB765: 0xD18F, - 0xB766: 0xD190, - 0xB767: 0xD191, - 0xB768: 0xD192, - 0xB769: 0xD193, - 0xB76A: 0xD194, - 0xB76B: 0xD195, - 0xB76C: 0xD196, - 0xB76D: 0xD197, - 0xB76E: 0xD198, - 0xB76F: 0xD199, - 0xB770: 0xD19A, - 0xB771: 0xD19B, - 0xB772: 0xD19C, - 0xB773: 0xD19D, - 0xB774: 0xD19E, - 0xB775: 0xD19F, - 0xB776: 0xD1A2, - 0xB777: 0xD1A3, - 0xB778: 0xD1A5, - 0xB779: 0xD1A6, - 0xB77A: 0xD1A7, - 0xB781: 0xD1A9, - 0xB782: 0xD1AA, - 0xB783: 0xD1AB, - 0xB784: 0xD1AC, - 0xB785: 0xD1AD, - 0xB786: 0xD1AE, - 0xB787: 0xD1AF, - 0xB788: 0xD1B2, - 0xB789: 0xD1B4, - 0xB78A: 0xD1B6, - 0xB78B: 0xD1B7, - 0xB78C: 0xD1B8, - 0xB78D: 0xD1B9, - 0xB78E: 0xD1BB, - 0xB78F: 0xD1BD, - 0xB790: 0xD1BE, - 0xB791: 0xD1BF, - 0xB792: 0xD1C1, - 0xB793: 0xD1C2, - 0xB794: 0xD1C3, - 0xB795: 0xD1C4, - 0xB796: 0xD1C5, - 0xB797: 0xD1C6, - 0xB798: 0xD1C7, - 0xB799: 0xD1C8, - 0xB79A: 0xD1C9, - 0xB79B: 0xD1CA, - 0xB79C: 0xD1CB, - 0xB79D: 0xD1CC, - 0xB79E: 0xD1CD, - 0xB79F: 0xD1CE, - 0xB7A0: 0xD1CF, - 0xB7A1: 0xB798, - 0xB7A2: 0xB799, - 0xB7A3: 0xB79C, - 0xB7A4: 0xB7A0, - 0xB7A5: 0xB7A8, - 0xB7A6: 0xB7A9, - 0xB7A7: 0xB7AB, - 0xB7A8: 0xB7AC, - 0xB7A9: 0xB7AD, - 0xB7AA: 0xB7B4, - 0xB7AB: 0xB7B5, - 0xB7AC: 0xB7B8, - 0xB7AD: 0xB7C7, - 0xB7AE: 0xB7C9, - 0xB7AF: 0xB7EC, - 0xB7B0: 0xB7ED, - 0xB7B1: 0xB7F0, - 0xB7B2: 0xB7F4, - 0xB7B3: 0xB7FC, - 0xB7B4: 0xB7FD, - 0xB7B5: 0xB7FF, - 0xB7B6: 0xB800, - 0xB7B7: 0xB801, - 0xB7B8: 0xB807, - 0xB7B9: 0xB808, - 0xB7BA: 0xB809, - 0xB7BB: 0xB80C, - 0xB7BC: 0xB810, - 0xB7BD: 0xB818, - 0xB7BE: 0xB819, - 0xB7BF: 0xB81B, - 0xB7C0: 0xB81D, - 0xB7C1: 0xB824, - 0xB7C2: 0xB825, - 0xB7C3: 0xB828, - 0xB7C4: 0xB82C, - 0xB7C5: 0xB834, - 0xB7C6: 0xB835, - 0xB7C7: 0xB837, - 0xB7C8: 0xB838, - 0xB7C9: 0xB839, - 0xB7CA: 0xB840, - 0xB7CB: 0xB844, - 0xB7CC: 0xB851, - 0xB7CD: 0xB853, - 0xB7CE: 0xB85C, - 0xB7CF: 0xB85D, - 0xB7D0: 0xB860, - 0xB7D1: 0xB864, - 0xB7D2: 0xB86C, - 0xB7D3: 0xB86D, - 0xB7D4: 0xB86F, - 0xB7D5: 0xB871, - 0xB7D6: 0xB878, - 0xB7D7: 0xB87C, - 0xB7D8: 0xB88D, - 0xB7D9: 0xB8A8, - 0xB7DA: 0xB8B0, - 0xB7DB: 0xB8B4, - 0xB7DC: 0xB8B8, - 0xB7DD: 0xB8C0, - 0xB7DE: 0xB8C1, - 0xB7DF: 0xB8C3, - 0xB7E0: 0xB8C5, - 0xB7E1: 0xB8CC, - 0xB7E2: 0xB8D0, - 0xB7E3: 0xB8D4, - 0xB7E4: 0xB8DD, - 0xB7E5: 0xB8DF, - 0xB7E6: 0xB8E1, - 0xB7E7: 0xB8E8, - 0xB7E8: 0xB8E9, - 0xB7E9: 0xB8EC, - 0xB7EA: 0xB8F0, - 0xB7EB: 0xB8F8, - 0xB7EC: 0xB8F9, - 0xB7ED: 0xB8FB, - 0xB7EE: 0xB8FD, - 0xB7EF: 0xB904, - 0xB7F0: 0xB918, - 0xB7F1: 0xB920, - 0xB7F2: 0xB93C, - 0xB7F3: 0xB93D, - 0xB7F4: 0xB940, - 0xB7F5: 0xB944, - 0xB7F6: 0xB94C, - 0xB7F7: 0xB94F, - 0xB7F8: 0xB951, - 0xB7F9: 0xB958, - 0xB7FA: 0xB959, - 0xB7FB: 0xB95C, - 0xB7FC: 0xB960, - 0xB7FD: 0xB968, - 0xB7FE: 0xB969, - 0xB841: 0xD1D0, - 0xB842: 0xD1D1, - 0xB843: 0xD1D2, - 0xB844: 0xD1D3, - 0xB845: 0xD1D4, - 0xB846: 0xD1D5, - 0xB847: 0xD1D6, - 0xB848: 0xD1D7, - 0xB849: 0xD1D9, - 0xB84A: 0xD1DA, - 0xB84B: 0xD1DB, - 0xB84C: 0xD1DC, - 0xB84D: 0xD1DD, - 0xB84E: 0xD1DE, - 0xB84F: 0xD1DF, - 0xB850: 0xD1E0, - 0xB851: 0xD1E1, - 0xB852: 0xD1E2, - 0xB853: 0xD1E3, - 0xB854: 0xD1E4, - 0xB855: 0xD1E5, - 0xB856: 0xD1E6, - 0xB857: 0xD1E7, - 0xB858: 0xD1E8, - 0xB859: 0xD1E9, - 0xB85A: 0xD1EA, - 0xB861: 0xD1EB, - 0xB862: 0xD1EC, - 0xB863: 0xD1ED, - 0xB864: 0xD1EE, - 0xB865: 0xD1EF, - 0xB866: 0xD1F0, - 0xB867: 0xD1F1, - 0xB868: 0xD1F2, - 0xB869: 0xD1F3, - 0xB86A: 0xD1F5, - 0xB86B: 0xD1F6, - 0xB86C: 0xD1F7, - 0xB86D: 0xD1F9, - 0xB86E: 0xD1FA, - 0xB86F: 0xD1FB, - 0xB870: 0xD1FC, - 0xB871: 0xD1FD, - 0xB872: 0xD1FE, - 0xB873: 0xD1FF, - 0xB874: 0xD200, - 0xB875: 0xD201, - 0xB876: 0xD202, - 0xB877: 0xD203, - 0xB878: 0xD204, - 0xB879: 0xD205, - 0xB87A: 0xD206, - 0xB881: 0xD208, - 0xB882: 0xD20A, - 0xB883: 0xD20B, - 0xB884: 0xD20C, - 0xB885: 0xD20D, - 0xB886: 0xD20E, - 0xB887: 0xD20F, - 0xB888: 0xD211, - 0xB889: 0xD212, - 0xB88A: 0xD213, - 0xB88B: 0xD214, - 0xB88C: 0xD215, - 0xB88D: 0xD216, - 0xB88E: 0xD217, - 0xB88F: 0xD218, - 0xB890: 0xD219, - 0xB891: 0xD21A, - 0xB892: 0xD21B, - 0xB893: 0xD21C, - 0xB894: 0xD21D, - 0xB895: 0xD21E, - 0xB896: 0xD21F, - 0xB897: 0xD220, - 0xB898: 0xD221, - 0xB899: 0xD222, - 0xB89A: 0xD223, - 0xB89B: 0xD224, - 0xB89C: 0xD225, - 0xB89D: 0xD226, - 0xB89E: 0xD227, - 0xB89F: 0xD228, - 0xB8A0: 0xD229, - 0xB8A1: 0xB96B, - 0xB8A2: 0xB96D, - 0xB8A3: 0xB974, - 0xB8A4: 0xB975, - 0xB8A5: 0xB978, - 0xB8A6: 0xB97C, - 0xB8A7: 0xB984, - 0xB8A8: 0xB985, - 0xB8A9: 0xB987, - 0xB8AA: 0xB989, - 0xB8AB: 0xB98A, - 0xB8AC: 0xB98D, - 0xB8AD: 0xB98E, - 0xB8AE: 0xB9AC, - 0xB8AF: 0xB9AD, - 0xB8B0: 0xB9B0, - 0xB8B1: 0xB9B4, - 0xB8B2: 0xB9BC, - 0xB8B3: 0xB9BD, - 0xB8B4: 0xB9BF, - 0xB8B5: 0xB9C1, - 0xB8B6: 0xB9C8, - 0xB8B7: 0xB9C9, - 0xB8B8: 0xB9CC, - 0xB8B9: 0xB9CE, - 0xB8BA: 0xB9CF, - 0xB8BB: 0xB9D0, - 0xB8BC: 0xB9D1, - 0xB8BD: 0xB9D2, - 0xB8BE: 0xB9D8, - 0xB8BF: 0xB9D9, - 0xB8C0: 0xB9DB, - 0xB8C1: 0xB9DD, - 0xB8C2: 0xB9DE, - 0xB8C3: 0xB9E1, - 0xB8C4: 0xB9E3, - 0xB8C5: 0xB9E4, - 0xB8C6: 0xB9E5, - 0xB8C7: 0xB9E8, - 0xB8C8: 0xB9EC, - 0xB8C9: 0xB9F4, - 0xB8CA: 0xB9F5, - 0xB8CB: 0xB9F7, - 0xB8CC: 0xB9F8, - 0xB8CD: 0xB9F9, - 0xB8CE: 0xB9FA, - 0xB8CF: 0xBA00, - 0xB8D0: 0xBA01, - 0xB8D1: 0xBA08, - 0xB8D2: 0xBA15, - 0xB8D3: 0xBA38, - 0xB8D4: 0xBA39, - 0xB8D5: 0xBA3C, - 0xB8D6: 0xBA40, - 0xB8D7: 0xBA42, - 0xB8D8: 0xBA48, - 0xB8D9: 0xBA49, - 0xB8DA: 0xBA4B, - 0xB8DB: 0xBA4D, - 0xB8DC: 0xBA4E, - 0xB8DD: 0xBA53, - 0xB8DE: 0xBA54, - 0xB8DF: 0xBA55, - 0xB8E0: 0xBA58, - 0xB8E1: 0xBA5C, - 0xB8E2: 0xBA64, - 0xB8E3: 0xBA65, - 0xB8E4: 0xBA67, - 0xB8E5: 0xBA68, - 0xB8E6: 0xBA69, - 0xB8E7: 0xBA70, - 0xB8E8: 0xBA71, - 0xB8E9: 0xBA74, - 0xB8EA: 0xBA78, - 0xB8EB: 0xBA83, - 0xB8EC: 0xBA84, - 0xB8ED: 0xBA85, - 0xB8EE: 0xBA87, - 0xB8EF: 0xBA8C, - 0xB8F0: 0xBAA8, - 0xB8F1: 0xBAA9, - 0xB8F2: 0xBAAB, - 0xB8F3: 0xBAAC, - 0xB8F4: 0xBAB0, - 0xB8F5: 0xBAB2, - 0xB8F6: 0xBAB8, - 0xB8F7: 0xBAB9, - 0xB8F8: 0xBABB, - 0xB8F9: 0xBABD, - 0xB8FA: 0xBAC4, - 0xB8FB: 0xBAC8, - 0xB8FC: 0xBAD8, - 0xB8FD: 0xBAD9, - 0xB8FE: 0xBAFC, - 0xB941: 0xD22A, - 0xB942: 0xD22B, - 0xB943: 0xD22E, - 0xB944: 0xD22F, - 0xB945: 0xD231, - 0xB946: 0xD232, - 0xB947: 0xD233, - 0xB948: 0xD235, - 0xB949: 0xD236, - 0xB94A: 0xD237, - 0xB94B: 0xD238, - 0xB94C: 0xD239, - 0xB94D: 0xD23A, - 0xB94E: 0xD23B, - 0xB94F: 0xD23E, - 0xB950: 0xD240, - 0xB951: 0xD242, - 0xB952: 0xD243, - 0xB953: 0xD244, - 0xB954: 0xD245, - 0xB955: 0xD246, - 0xB956: 0xD247, - 0xB957: 0xD249, - 0xB958: 0xD24A, - 0xB959: 0xD24B, - 0xB95A: 0xD24C, - 0xB961: 0xD24D, - 0xB962: 0xD24E, - 0xB963: 0xD24F, - 0xB964: 0xD250, - 0xB965: 0xD251, - 0xB966: 0xD252, - 0xB967: 0xD253, - 0xB968: 0xD254, - 0xB969: 0xD255, - 0xB96A: 0xD256, - 0xB96B: 0xD257, - 0xB96C: 0xD258, - 0xB96D: 0xD259, - 0xB96E: 0xD25A, - 0xB96F: 0xD25B, - 0xB970: 0xD25D, - 0xB971: 0xD25E, - 0xB972: 0xD25F, - 0xB973: 0xD260, - 0xB974: 0xD261, - 0xB975: 0xD262, - 0xB976: 0xD263, - 0xB977: 0xD265, - 0xB978: 0xD266, - 0xB979: 0xD267, - 0xB97A: 0xD268, - 0xB981: 0xD269, - 0xB982: 0xD26A, - 0xB983: 0xD26B, - 0xB984: 0xD26C, - 0xB985: 0xD26D, - 0xB986: 0xD26E, - 0xB987: 0xD26F, - 0xB988: 0xD270, - 0xB989: 0xD271, - 0xB98A: 0xD272, - 0xB98B: 0xD273, - 0xB98C: 0xD274, - 0xB98D: 0xD275, - 0xB98E: 0xD276, - 0xB98F: 0xD277, - 0xB990: 0xD278, - 0xB991: 0xD279, - 0xB992: 0xD27A, - 0xB993: 0xD27B, - 0xB994: 0xD27C, - 0xB995: 0xD27D, - 0xB996: 0xD27E, - 0xB997: 0xD27F, - 0xB998: 0xD282, - 0xB999: 0xD283, - 0xB99A: 0xD285, - 0xB99B: 0xD286, - 0xB99C: 0xD287, - 0xB99D: 0xD289, - 0xB99E: 0xD28A, - 0xB99F: 0xD28B, - 0xB9A0: 0xD28C, - 0xB9A1: 0xBB00, - 0xB9A2: 0xBB04, - 0xB9A3: 0xBB0D, - 0xB9A4: 0xBB0F, - 0xB9A5: 0xBB11, - 0xB9A6: 0xBB18, - 0xB9A7: 0xBB1C, - 0xB9A8: 0xBB20, - 0xB9A9: 0xBB29, - 0xB9AA: 0xBB2B, - 0xB9AB: 0xBB34, - 0xB9AC: 0xBB35, - 0xB9AD: 0xBB36, - 0xB9AE: 0xBB38, - 0xB9AF: 0xBB3B, - 0xB9B0: 0xBB3C, - 0xB9B1: 0xBB3D, - 0xB9B2: 0xBB3E, - 0xB9B3: 0xBB44, - 0xB9B4: 0xBB45, - 0xB9B5: 0xBB47, - 0xB9B6: 0xBB49, - 0xB9B7: 0xBB4D, - 0xB9B8: 0xBB4F, - 0xB9B9: 0xBB50, - 0xB9BA: 0xBB54, - 0xB9BB: 0xBB58, - 0xB9BC: 0xBB61, - 0xB9BD: 0xBB63, - 0xB9BE: 0xBB6C, - 0xB9BF: 0xBB88, - 0xB9C0: 0xBB8C, - 0xB9C1: 0xBB90, - 0xB9C2: 0xBBA4, - 0xB9C3: 0xBBA8, - 0xB9C4: 0xBBAC, - 0xB9C5: 0xBBB4, - 0xB9C6: 0xBBB7, - 0xB9C7: 0xBBC0, - 0xB9C8: 0xBBC4, - 0xB9C9: 0xBBC8, - 0xB9CA: 0xBBD0, - 0xB9CB: 0xBBD3, - 0xB9CC: 0xBBF8, - 0xB9CD: 0xBBF9, - 0xB9CE: 0xBBFC, - 0xB9CF: 0xBBFF, - 0xB9D0: 0xBC00, - 0xB9D1: 0xBC02, - 0xB9D2: 0xBC08, - 0xB9D3: 0xBC09, - 0xB9D4: 0xBC0B, - 0xB9D5: 0xBC0C, - 0xB9D6: 0xBC0D, - 0xB9D7: 0xBC0F, - 0xB9D8: 0xBC11, - 0xB9D9: 0xBC14, - 0xB9DA: 0xBC15, - 0xB9DB: 0xBC16, - 0xB9DC: 0xBC17, - 0xB9DD: 0xBC18, - 0xB9DE: 0xBC1B, - 0xB9DF: 0xBC1C, - 0xB9E0: 0xBC1D, - 0xB9E1: 0xBC1E, - 0xB9E2: 0xBC1F, - 0xB9E3: 0xBC24, - 0xB9E4: 0xBC25, - 0xB9E5: 0xBC27, - 0xB9E6: 0xBC29, - 0xB9E7: 0xBC2D, - 0xB9E8: 0xBC30, - 0xB9E9: 0xBC31, - 0xB9EA: 0xBC34, - 0xB9EB: 0xBC38, - 0xB9EC: 0xBC40, - 0xB9ED: 0xBC41, - 0xB9EE: 0xBC43, - 0xB9EF: 0xBC44, - 0xB9F0: 0xBC45, - 0xB9F1: 0xBC49, - 0xB9F2: 0xBC4C, - 0xB9F3: 0xBC4D, - 0xB9F4: 0xBC50, - 0xB9F5: 0xBC5D, - 0xB9F6: 0xBC84, - 0xB9F7: 0xBC85, - 0xB9F8: 0xBC88, - 0xB9F9: 0xBC8B, - 0xB9FA: 0xBC8C, - 0xB9FB: 0xBC8E, - 0xB9FC: 0xBC94, - 0xB9FD: 0xBC95, - 0xB9FE: 0xBC97, - 0xBA41: 0xD28D, - 0xBA42: 0xD28E, - 0xBA43: 0xD28F, - 0xBA44: 0xD292, - 0xBA45: 0xD293, - 0xBA46: 0xD294, - 0xBA47: 0xD296, - 0xBA48: 0xD297, - 0xBA49: 0xD298, - 0xBA4A: 0xD299, - 0xBA4B: 0xD29A, - 0xBA4C: 0xD29B, - 0xBA4D: 0xD29D, - 0xBA4E: 0xD29E, - 0xBA4F: 0xD29F, - 0xBA50: 0xD2A1, - 0xBA51: 0xD2A2, - 0xBA52: 0xD2A3, - 0xBA53: 0xD2A5, - 0xBA54: 0xD2A6, - 0xBA55: 0xD2A7, - 0xBA56: 0xD2A8, - 0xBA57: 0xD2A9, - 0xBA58: 0xD2AA, - 0xBA59: 0xD2AB, - 0xBA5A: 0xD2AD, - 0xBA61: 0xD2AE, - 0xBA62: 0xD2AF, - 0xBA63: 0xD2B0, - 0xBA64: 0xD2B2, - 0xBA65: 0xD2B3, - 0xBA66: 0xD2B4, - 0xBA67: 0xD2B5, - 0xBA68: 0xD2B6, - 0xBA69: 0xD2B7, - 0xBA6A: 0xD2BA, - 0xBA6B: 0xD2BB, - 0xBA6C: 0xD2BD, - 0xBA6D: 0xD2BE, - 0xBA6E: 0xD2C1, - 0xBA6F: 0xD2C3, - 0xBA70: 0xD2C4, - 0xBA71: 0xD2C5, - 0xBA72: 0xD2C6, - 0xBA73: 0xD2C7, - 0xBA74: 0xD2CA, - 0xBA75: 0xD2CC, - 0xBA76: 0xD2CD, - 0xBA77: 0xD2CE, - 0xBA78: 0xD2CF, - 0xBA79: 0xD2D0, - 0xBA7A: 0xD2D1, - 0xBA81: 0xD2D2, - 0xBA82: 0xD2D3, - 0xBA83: 0xD2D5, - 0xBA84: 0xD2D6, - 0xBA85: 0xD2D7, - 0xBA86: 0xD2D9, - 0xBA87: 0xD2DA, - 0xBA88: 0xD2DB, - 0xBA89: 0xD2DD, - 0xBA8A: 0xD2DE, - 0xBA8B: 0xD2DF, - 0xBA8C: 0xD2E0, - 0xBA8D: 0xD2E1, - 0xBA8E: 0xD2E2, - 0xBA8F: 0xD2E3, - 0xBA90: 0xD2E6, - 0xBA91: 0xD2E7, - 0xBA92: 0xD2E8, - 0xBA93: 0xD2E9, - 0xBA94: 0xD2EA, - 0xBA95: 0xD2EB, - 0xBA96: 0xD2EC, - 0xBA97: 0xD2ED, - 0xBA98: 0xD2EE, - 0xBA99: 0xD2EF, - 0xBA9A: 0xD2F2, - 0xBA9B: 0xD2F3, - 0xBA9C: 0xD2F5, - 0xBA9D: 0xD2F6, - 0xBA9E: 0xD2F7, - 0xBA9F: 0xD2F9, - 0xBAA0: 0xD2FA, - 0xBAA1: 0xBC99, - 0xBAA2: 0xBC9A, - 0xBAA3: 0xBCA0, - 0xBAA4: 0xBCA1, - 0xBAA5: 0xBCA4, - 0xBAA6: 0xBCA7, - 0xBAA7: 0xBCA8, - 0xBAA8: 0xBCB0, - 0xBAA9: 0xBCB1, - 0xBAAA: 0xBCB3, - 0xBAAB: 0xBCB4, - 0xBAAC: 0xBCB5, - 0xBAAD: 0xBCBC, - 0xBAAE: 0xBCBD, - 0xBAAF: 0xBCC0, - 0xBAB0: 0xBCC4, - 0xBAB1: 0xBCCD, - 0xBAB2: 0xBCCF, - 0xBAB3: 0xBCD0, - 0xBAB4: 0xBCD1, - 0xBAB5: 0xBCD5, - 0xBAB6: 0xBCD8, - 0xBAB7: 0xBCDC, - 0xBAB8: 0xBCF4, - 0xBAB9: 0xBCF5, - 0xBABA: 0xBCF6, - 0xBABB: 0xBCF8, - 0xBABC: 0xBCFC, - 0xBABD: 0xBD04, - 0xBABE: 0xBD05, - 0xBABF: 0xBD07, - 0xBAC0: 0xBD09, - 0xBAC1: 0xBD10, - 0xBAC2: 0xBD14, - 0xBAC3: 0xBD24, - 0xBAC4: 0xBD2C, - 0xBAC5: 0xBD40, - 0xBAC6: 0xBD48, - 0xBAC7: 0xBD49, - 0xBAC8: 0xBD4C, - 0xBAC9: 0xBD50, - 0xBACA: 0xBD58, - 0xBACB: 0xBD59, - 0xBACC: 0xBD64, - 0xBACD: 0xBD68, - 0xBACE: 0xBD80, - 0xBACF: 0xBD81, - 0xBAD0: 0xBD84, - 0xBAD1: 0xBD87, - 0xBAD2: 0xBD88, - 0xBAD3: 0xBD89, - 0xBAD4: 0xBD8A, - 0xBAD5: 0xBD90, - 0xBAD6: 0xBD91, - 0xBAD7: 0xBD93, - 0xBAD8: 0xBD95, - 0xBAD9: 0xBD99, - 0xBADA: 0xBD9A, - 0xBADB: 0xBD9C, - 0xBADC: 0xBDA4, - 0xBADD: 0xBDB0, - 0xBADE: 0xBDB8, - 0xBADF: 0xBDD4, - 0xBAE0: 0xBDD5, - 0xBAE1: 0xBDD8, - 0xBAE2: 0xBDDC, - 0xBAE3: 0xBDE9, - 0xBAE4: 0xBDF0, - 0xBAE5: 0xBDF4, - 0xBAE6: 0xBDF8, - 0xBAE7: 0xBE00, - 0xBAE8: 0xBE03, - 0xBAE9: 0xBE05, - 0xBAEA: 0xBE0C, - 0xBAEB: 0xBE0D, - 0xBAEC: 0xBE10, - 0xBAED: 0xBE14, - 0xBAEE: 0xBE1C, - 0xBAEF: 0xBE1D, - 0xBAF0: 0xBE1F, - 0xBAF1: 0xBE44, - 0xBAF2: 0xBE45, - 0xBAF3: 0xBE48, - 0xBAF4: 0xBE4C, - 0xBAF5: 0xBE4E, - 0xBAF6: 0xBE54, - 0xBAF7: 0xBE55, - 0xBAF8: 0xBE57, - 0xBAF9: 0xBE59, - 0xBAFA: 0xBE5A, - 0xBAFB: 0xBE5B, - 0xBAFC: 0xBE60, - 0xBAFD: 0xBE61, - 0xBAFE: 0xBE64, - 0xBB41: 0xD2FB, - 0xBB42: 0xD2FC, - 0xBB43: 0xD2FD, - 0xBB44: 0xD2FE, - 0xBB45: 0xD2FF, - 0xBB46: 0xD302, - 0xBB47: 0xD304, - 0xBB48: 0xD306, - 0xBB49: 0xD307, - 0xBB4A: 0xD308, - 0xBB4B: 0xD309, - 0xBB4C: 0xD30A, - 0xBB4D: 0xD30B, - 0xBB4E: 0xD30F, - 0xBB4F: 0xD311, - 0xBB50: 0xD312, - 0xBB51: 0xD313, - 0xBB52: 0xD315, - 0xBB53: 0xD317, - 0xBB54: 0xD318, - 0xBB55: 0xD319, - 0xBB56: 0xD31A, - 0xBB57: 0xD31B, - 0xBB58: 0xD31E, - 0xBB59: 0xD322, - 0xBB5A: 0xD323, - 0xBB61: 0xD324, - 0xBB62: 0xD326, - 0xBB63: 0xD327, - 0xBB64: 0xD32A, - 0xBB65: 0xD32B, - 0xBB66: 0xD32D, - 0xBB67: 0xD32E, - 0xBB68: 0xD32F, - 0xBB69: 0xD331, - 0xBB6A: 0xD332, - 0xBB6B: 0xD333, - 0xBB6C: 0xD334, - 0xBB6D: 0xD335, - 0xBB6E: 0xD336, - 0xBB6F: 0xD337, - 0xBB70: 0xD33A, - 0xBB71: 0xD33E, - 0xBB72: 0xD33F, - 0xBB73: 0xD340, - 0xBB74: 0xD341, - 0xBB75: 0xD342, - 0xBB76: 0xD343, - 0xBB77: 0xD346, - 0xBB78: 0xD347, - 0xBB79: 0xD348, - 0xBB7A: 0xD349, - 0xBB81: 0xD34A, - 0xBB82: 0xD34B, - 0xBB83: 0xD34C, - 0xBB84: 0xD34D, - 0xBB85: 0xD34E, - 0xBB86: 0xD34F, - 0xBB87: 0xD350, - 0xBB88: 0xD351, - 0xBB89: 0xD352, - 0xBB8A: 0xD353, - 0xBB8B: 0xD354, - 0xBB8C: 0xD355, - 0xBB8D: 0xD356, - 0xBB8E: 0xD357, - 0xBB8F: 0xD358, - 0xBB90: 0xD359, - 0xBB91: 0xD35A, - 0xBB92: 0xD35B, - 0xBB93: 0xD35C, - 0xBB94: 0xD35D, - 0xBB95: 0xD35E, - 0xBB96: 0xD35F, - 0xBB97: 0xD360, - 0xBB98: 0xD361, - 0xBB99: 0xD362, - 0xBB9A: 0xD363, - 0xBB9B: 0xD364, - 0xBB9C: 0xD365, - 0xBB9D: 0xD366, - 0xBB9E: 0xD367, - 0xBB9F: 0xD368, - 0xBBA0: 0xD369, - 0xBBA1: 0xBE68, - 0xBBA2: 0xBE6A, - 0xBBA3: 0xBE70, - 0xBBA4: 0xBE71, - 0xBBA5: 0xBE73, - 0xBBA6: 0xBE74, - 0xBBA7: 0xBE75, - 0xBBA8: 0xBE7B, - 0xBBA9: 0xBE7C, - 0xBBAA: 0xBE7D, - 0xBBAB: 0xBE80, - 0xBBAC: 0xBE84, - 0xBBAD: 0xBE8C, - 0xBBAE: 0xBE8D, - 0xBBAF: 0xBE8F, - 0xBBB0: 0xBE90, - 0xBBB1: 0xBE91, - 0xBBB2: 0xBE98, - 0xBBB3: 0xBE99, - 0xBBB4: 0xBEA8, - 0xBBB5: 0xBED0, - 0xBBB6: 0xBED1, - 0xBBB7: 0xBED4, - 0xBBB8: 0xBED7, - 0xBBB9: 0xBED8, - 0xBBBA: 0xBEE0, - 0xBBBB: 0xBEE3, - 0xBBBC: 0xBEE4, - 0xBBBD: 0xBEE5, - 0xBBBE: 0xBEEC, - 0xBBBF: 0xBF01, - 0xBBC0: 0xBF08, - 0xBBC1: 0xBF09, - 0xBBC2: 0xBF18, - 0xBBC3: 0xBF19, - 0xBBC4: 0xBF1B, - 0xBBC5: 0xBF1C, - 0xBBC6: 0xBF1D, - 0xBBC7: 0xBF40, - 0xBBC8: 0xBF41, - 0xBBC9: 0xBF44, - 0xBBCA: 0xBF48, - 0xBBCB: 0xBF50, - 0xBBCC: 0xBF51, - 0xBBCD: 0xBF55, - 0xBBCE: 0xBF94, - 0xBBCF: 0xBFB0, - 0xBBD0: 0xBFC5, - 0xBBD1: 0xBFCC, - 0xBBD2: 0xBFCD, - 0xBBD3: 0xBFD0, - 0xBBD4: 0xBFD4, - 0xBBD5: 0xBFDC, - 0xBBD6: 0xBFDF, - 0xBBD7: 0xBFE1, - 0xBBD8: 0xC03C, - 0xBBD9: 0xC051, - 0xBBDA: 0xC058, - 0xBBDB: 0xC05C, - 0xBBDC: 0xC060, - 0xBBDD: 0xC068, - 0xBBDE: 0xC069, - 0xBBDF: 0xC090, - 0xBBE0: 0xC091, - 0xBBE1: 0xC094, - 0xBBE2: 0xC098, - 0xBBE3: 0xC0A0, - 0xBBE4: 0xC0A1, - 0xBBE5: 0xC0A3, - 0xBBE6: 0xC0A5, - 0xBBE7: 0xC0AC, - 0xBBE8: 0xC0AD, - 0xBBE9: 0xC0AF, - 0xBBEA: 0xC0B0, - 0xBBEB: 0xC0B3, - 0xBBEC: 0xC0B4, - 0xBBED: 0xC0B5, - 0xBBEE: 0xC0B6, - 0xBBEF: 0xC0BC, - 0xBBF0: 0xC0BD, - 0xBBF1: 0xC0BF, - 0xBBF2: 0xC0C0, - 0xBBF3: 0xC0C1, - 0xBBF4: 0xC0C5, - 0xBBF5: 0xC0C8, - 0xBBF6: 0xC0C9, - 0xBBF7: 0xC0CC, - 0xBBF8: 0xC0D0, - 0xBBF9: 0xC0D8, - 0xBBFA: 0xC0D9, - 0xBBFB: 0xC0DB, - 0xBBFC: 0xC0DC, - 0xBBFD: 0xC0DD, - 0xBBFE: 0xC0E4, - 0xBC41: 0xD36A, - 0xBC42: 0xD36B, - 0xBC43: 0xD36C, - 0xBC44: 0xD36D, - 0xBC45: 0xD36E, - 0xBC46: 0xD36F, - 0xBC47: 0xD370, - 0xBC48: 0xD371, - 0xBC49: 0xD372, - 0xBC4A: 0xD373, - 0xBC4B: 0xD374, - 0xBC4C: 0xD375, - 0xBC4D: 0xD376, - 0xBC4E: 0xD377, - 0xBC4F: 0xD378, - 0xBC50: 0xD379, - 0xBC51: 0xD37A, - 0xBC52: 0xD37B, - 0xBC53: 0xD37E, - 0xBC54: 0xD37F, - 0xBC55: 0xD381, - 0xBC56: 0xD382, - 0xBC57: 0xD383, - 0xBC58: 0xD385, - 0xBC59: 0xD386, - 0xBC5A: 0xD387, - 0xBC61: 0xD388, - 0xBC62: 0xD389, - 0xBC63: 0xD38A, - 0xBC64: 0xD38B, - 0xBC65: 0xD38E, - 0xBC66: 0xD392, - 0xBC67: 0xD393, - 0xBC68: 0xD394, - 0xBC69: 0xD395, - 0xBC6A: 0xD396, - 0xBC6B: 0xD397, - 0xBC6C: 0xD39A, - 0xBC6D: 0xD39B, - 0xBC6E: 0xD39D, - 0xBC6F: 0xD39E, - 0xBC70: 0xD39F, - 0xBC71: 0xD3A1, - 0xBC72: 0xD3A2, - 0xBC73: 0xD3A3, - 0xBC74: 0xD3A4, - 0xBC75: 0xD3A5, - 0xBC76: 0xD3A6, - 0xBC77: 0xD3A7, - 0xBC78: 0xD3AA, - 0xBC79: 0xD3AC, - 0xBC7A: 0xD3AE, - 0xBC81: 0xD3AF, - 0xBC82: 0xD3B0, - 0xBC83: 0xD3B1, - 0xBC84: 0xD3B2, - 0xBC85: 0xD3B3, - 0xBC86: 0xD3B5, - 0xBC87: 0xD3B6, - 0xBC88: 0xD3B7, - 0xBC89: 0xD3B9, - 0xBC8A: 0xD3BA, - 0xBC8B: 0xD3BB, - 0xBC8C: 0xD3BD, - 0xBC8D: 0xD3BE, - 0xBC8E: 0xD3BF, - 0xBC8F: 0xD3C0, - 0xBC90: 0xD3C1, - 0xBC91: 0xD3C2, - 0xBC92: 0xD3C3, - 0xBC93: 0xD3C6, - 0xBC94: 0xD3C7, - 0xBC95: 0xD3CA, - 0xBC96: 0xD3CB, - 0xBC97: 0xD3CC, - 0xBC98: 0xD3CD, - 0xBC99: 0xD3CE, - 0xBC9A: 0xD3CF, - 0xBC9B: 0xD3D1, - 0xBC9C: 0xD3D2, - 0xBC9D: 0xD3D3, - 0xBC9E: 0xD3D4, - 0xBC9F: 0xD3D5, - 0xBCA0: 0xD3D6, - 0xBCA1: 0xC0E5, - 0xBCA2: 0xC0E8, - 0xBCA3: 0xC0EC, - 0xBCA4: 0xC0F4, - 0xBCA5: 0xC0F5, - 0xBCA6: 0xC0F7, - 0xBCA7: 0xC0F9, - 0xBCA8: 0xC100, - 0xBCA9: 0xC104, - 0xBCAA: 0xC108, - 0xBCAB: 0xC110, - 0xBCAC: 0xC115, - 0xBCAD: 0xC11C, - 0xBCAE: 0xC11D, - 0xBCAF: 0xC11E, - 0xBCB0: 0xC11F, - 0xBCB1: 0xC120, - 0xBCB2: 0xC123, - 0xBCB3: 0xC124, - 0xBCB4: 0xC126, - 0xBCB5: 0xC127, - 0xBCB6: 0xC12C, - 0xBCB7: 0xC12D, - 0xBCB8: 0xC12F, - 0xBCB9: 0xC130, - 0xBCBA: 0xC131, - 0xBCBB: 0xC136, - 0xBCBC: 0xC138, - 0xBCBD: 0xC139, - 0xBCBE: 0xC13C, - 0xBCBF: 0xC140, - 0xBCC0: 0xC148, - 0xBCC1: 0xC149, - 0xBCC2: 0xC14B, - 0xBCC3: 0xC14C, - 0xBCC4: 0xC14D, - 0xBCC5: 0xC154, - 0xBCC6: 0xC155, - 0xBCC7: 0xC158, - 0xBCC8: 0xC15C, - 0xBCC9: 0xC164, - 0xBCCA: 0xC165, - 0xBCCB: 0xC167, - 0xBCCC: 0xC168, - 0xBCCD: 0xC169, - 0xBCCE: 0xC170, - 0xBCCF: 0xC174, - 0xBCD0: 0xC178, - 0xBCD1: 0xC185, - 0xBCD2: 0xC18C, - 0xBCD3: 0xC18D, - 0xBCD4: 0xC18E, - 0xBCD5: 0xC190, - 0xBCD6: 0xC194, - 0xBCD7: 0xC196, - 0xBCD8: 0xC19C, - 0xBCD9: 0xC19D, - 0xBCDA: 0xC19F, - 0xBCDB: 0xC1A1, - 0xBCDC: 0xC1A5, - 0xBCDD: 0xC1A8, - 0xBCDE: 0xC1A9, - 0xBCDF: 0xC1AC, - 0xBCE0: 0xC1B0, - 0xBCE1: 0xC1BD, - 0xBCE2: 0xC1C4, - 0xBCE3: 0xC1C8, - 0xBCE4: 0xC1CC, - 0xBCE5: 0xC1D4, - 0xBCE6: 0xC1D7, - 0xBCE7: 0xC1D8, - 0xBCE8: 0xC1E0, - 0xBCE9: 0xC1E4, - 0xBCEA: 0xC1E8, - 0xBCEB: 0xC1F0, - 0xBCEC: 0xC1F1, - 0xBCED: 0xC1F3, - 0xBCEE: 0xC1FC, - 0xBCEF: 0xC1FD, - 0xBCF0: 0xC200, - 0xBCF1: 0xC204, - 0xBCF2: 0xC20C, - 0xBCF3: 0xC20D, - 0xBCF4: 0xC20F, - 0xBCF5: 0xC211, - 0xBCF6: 0xC218, - 0xBCF7: 0xC219, - 0xBCF8: 0xC21C, - 0xBCF9: 0xC21F, - 0xBCFA: 0xC220, - 0xBCFB: 0xC228, - 0xBCFC: 0xC229, - 0xBCFD: 0xC22B, - 0xBCFE: 0xC22D, - 0xBD41: 0xD3D7, - 0xBD42: 0xD3D9, - 0xBD43: 0xD3DA, - 0xBD44: 0xD3DB, - 0xBD45: 0xD3DC, - 0xBD46: 0xD3DD, - 0xBD47: 0xD3DE, - 0xBD48: 0xD3DF, - 0xBD49: 0xD3E0, - 0xBD4A: 0xD3E2, - 0xBD4B: 0xD3E4, - 0xBD4C: 0xD3E5, - 0xBD4D: 0xD3E6, - 0xBD4E: 0xD3E7, - 0xBD4F: 0xD3E8, - 0xBD50: 0xD3E9, - 0xBD51: 0xD3EA, - 0xBD52: 0xD3EB, - 0xBD53: 0xD3EE, - 0xBD54: 0xD3EF, - 0xBD55: 0xD3F1, - 0xBD56: 0xD3F2, - 0xBD57: 0xD3F3, - 0xBD58: 0xD3F5, - 0xBD59: 0xD3F6, - 0xBD5A: 0xD3F7, - 0xBD61: 0xD3F8, - 0xBD62: 0xD3F9, - 0xBD63: 0xD3FA, - 0xBD64: 0xD3FB, - 0xBD65: 0xD3FE, - 0xBD66: 0xD400, - 0xBD67: 0xD402, - 0xBD68: 0xD403, - 0xBD69: 0xD404, - 0xBD6A: 0xD405, - 0xBD6B: 0xD406, - 0xBD6C: 0xD407, - 0xBD6D: 0xD409, - 0xBD6E: 0xD40A, - 0xBD6F: 0xD40B, - 0xBD70: 0xD40C, - 0xBD71: 0xD40D, - 0xBD72: 0xD40E, - 0xBD73: 0xD40F, - 0xBD74: 0xD410, - 0xBD75: 0xD411, - 0xBD76: 0xD412, - 0xBD77: 0xD413, - 0xBD78: 0xD414, - 0xBD79: 0xD415, - 0xBD7A: 0xD416, - 0xBD81: 0xD417, - 0xBD82: 0xD418, - 0xBD83: 0xD419, - 0xBD84: 0xD41A, - 0xBD85: 0xD41B, - 0xBD86: 0xD41C, - 0xBD87: 0xD41E, - 0xBD88: 0xD41F, - 0xBD89: 0xD420, - 0xBD8A: 0xD421, - 0xBD8B: 0xD422, - 0xBD8C: 0xD423, - 0xBD8D: 0xD424, - 0xBD8E: 0xD425, - 0xBD8F: 0xD426, - 0xBD90: 0xD427, - 0xBD91: 0xD428, - 0xBD92: 0xD429, - 0xBD93: 0xD42A, - 0xBD94: 0xD42B, - 0xBD95: 0xD42C, - 0xBD96: 0xD42D, - 0xBD97: 0xD42E, - 0xBD98: 0xD42F, - 0xBD99: 0xD430, - 0xBD9A: 0xD431, - 0xBD9B: 0xD432, - 0xBD9C: 0xD433, - 0xBD9D: 0xD434, - 0xBD9E: 0xD435, - 0xBD9F: 0xD436, - 0xBDA0: 0xD437, - 0xBDA1: 0xC22F, - 0xBDA2: 0xC231, - 0xBDA3: 0xC232, - 0xBDA4: 0xC234, - 0xBDA5: 0xC248, - 0xBDA6: 0xC250, - 0xBDA7: 0xC251, - 0xBDA8: 0xC254, - 0xBDA9: 0xC258, - 0xBDAA: 0xC260, - 0xBDAB: 0xC265, - 0xBDAC: 0xC26C, - 0xBDAD: 0xC26D, - 0xBDAE: 0xC270, - 0xBDAF: 0xC274, - 0xBDB0: 0xC27C, - 0xBDB1: 0xC27D, - 0xBDB2: 0xC27F, - 0xBDB3: 0xC281, - 0xBDB4: 0xC288, - 0xBDB5: 0xC289, - 0xBDB6: 0xC290, - 0xBDB7: 0xC298, - 0xBDB8: 0xC29B, - 0xBDB9: 0xC29D, - 0xBDBA: 0xC2A4, - 0xBDBB: 0xC2A5, - 0xBDBC: 0xC2A8, - 0xBDBD: 0xC2AC, - 0xBDBE: 0xC2AD, - 0xBDBF: 0xC2B4, - 0xBDC0: 0xC2B5, - 0xBDC1: 0xC2B7, - 0xBDC2: 0xC2B9, - 0xBDC3: 0xC2DC, - 0xBDC4: 0xC2DD, - 0xBDC5: 0xC2E0, - 0xBDC6: 0xC2E3, - 0xBDC7: 0xC2E4, - 0xBDC8: 0xC2EB, - 0xBDC9: 0xC2EC, - 0xBDCA: 0xC2ED, - 0xBDCB: 0xC2EF, - 0xBDCC: 0xC2F1, - 0xBDCD: 0xC2F6, - 0xBDCE: 0xC2F8, - 0xBDCF: 0xC2F9, - 0xBDD0: 0xC2FB, - 0xBDD1: 0xC2FC, - 0xBDD2: 0xC300, - 0xBDD3: 0xC308, - 0xBDD4: 0xC309, - 0xBDD5: 0xC30C, - 0xBDD6: 0xC30D, - 0xBDD7: 0xC313, - 0xBDD8: 0xC314, - 0xBDD9: 0xC315, - 0xBDDA: 0xC318, - 0xBDDB: 0xC31C, - 0xBDDC: 0xC324, - 0xBDDD: 0xC325, - 0xBDDE: 0xC328, - 0xBDDF: 0xC329, - 0xBDE0: 0xC345, - 0xBDE1: 0xC368, - 0xBDE2: 0xC369, - 0xBDE3: 0xC36C, - 0xBDE4: 0xC370, - 0xBDE5: 0xC372, - 0xBDE6: 0xC378, - 0xBDE7: 0xC379, - 0xBDE8: 0xC37C, - 0xBDE9: 0xC37D, - 0xBDEA: 0xC384, - 0xBDEB: 0xC388, - 0xBDEC: 0xC38C, - 0xBDED: 0xC3C0, - 0xBDEE: 0xC3D8, - 0xBDEF: 0xC3D9, - 0xBDF0: 0xC3DC, - 0xBDF1: 0xC3DF, - 0xBDF2: 0xC3E0, - 0xBDF3: 0xC3E2, - 0xBDF4: 0xC3E8, - 0xBDF5: 0xC3E9, - 0xBDF6: 0xC3ED, - 0xBDF7: 0xC3F4, - 0xBDF8: 0xC3F5, - 0xBDF9: 0xC3F8, - 0xBDFA: 0xC408, - 0xBDFB: 0xC410, - 0xBDFC: 0xC424, - 0xBDFD: 0xC42C, - 0xBDFE: 0xC430, - 0xBE41: 0xD438, - 0xBE42: 0xD439, - 0xBE43: 0xD43A, - 0xBE44: 0xD43B, - 0xBE45: 0xD43C, - 0xBE46: 0xD43D, - 0xBE47: 0xD43E, - 0xBE48: 0xD43F, - 0xBE49: 0xD441, - 0xBE4A: 0xD442, - 0xBE4B: 0xD443, - 0xBE4C: 0xD445, - 0xBE4D: 0xD446, - 0xBE4E: 0xD447, - 0xBE4F: 0xD448, - 0xBE50: 0xD449, - 0xBE51: 0xD44A, - 0xBE52: 0xD44B, - 0xBE53: 0xD44C, - 0xBE54: 0xD44D, - 0xBE55: 0xD44E, - 0xBE56: 0xD44F, - 0xBE57: 0xD450, - 0xBE58: 0xD451, - 0xBE59: 0xD452, - 0xBE5A: 0xD453, - 0xBE61: 0xD454, - 0xBE62: 0xD455, - 0xBE63: 0xD456, - 0xBE64: 0xD457, - 0xBE65: 0xD458, - 0xBE66: 0xD459, - 0xBE67: 0xD45A, - 0xBE68: 0xD45B, - 0xBE69: 0xD45D, - 0xBE6A: 0xD45E, - 0xBE6B: 0xD45F, - 0xBE6C: 0xD461, - 0xBE6D: 0xD462, - 0xBE6E: 0xD463, - 0xBE6F: 0xD465, - 0xBE70: 0xD466, - 0xBE71: 0xD467, - 0xBE72: 0xD468, - 0xBE73: 0xD469, - 0xBE74: 0xD46A, - 0xBE75: 0xD46B, - 0xBE76: 0xD46C, - 0xBE77: 0xD46E, - 0xBE78: 0xD470, - 0xBE79: 0xD471, - 0xBE7A: 0xD472, - 0xBE81: 0xD473, - 0xBE82: 0xD474, - 0xBE83: 0xD475, - 0xBE84: 0xD476, - 0xBE85: 0xD477, - 0xBE86: 0xD47A, - 0xBE87: 0xD47B, - 0xBE88: 0xD47D, - 0xBE89: 0xD47E, - 0xBE8A: 0xD481, - 0xBE8B: 0xD483, - 0xBE8C: 0xD484, - 0xBE8D: 0xD485, - 0xBE8E: 0xD486, - 0xBE8F: 0xD487, - 0xBE90: 0xD48A, - 0xBE91: 0xD48C, - 0xBE92: 0xD48E, - 0xBE93: 0xD48F, - 0xBE94: 0xD490, - 0xBE95: 0xD491, - 0xBE96: 0xD492, - 0xBE97: 0xD493, - 0xBE98: 0xD495, - 0xBE99: 0xD496, - 0xBE9A: 0xD497, - 0xBE9B: 0xD498, - 0xBE9C: 0xD499, - 0xBE9D: 0xD49A, - 0xBE9E: 0xD49B, - 0xBE9F: 0xD49C, - 0xBEA0: 0xD49D, - 0xBEA1: 0xC434, - 0xBEA2: 0xC43C, - 0xBEA3: 0xC43D, - 0xBEA4: 0xC448, - 0xBEA5: 0xC464, - 0xBEA6: 0xC465, - 0xBEA7: 0xC468, - 0xBEA8: 0xC46C, - 0xBEA9: 0xC474, - 0xBEAA: 0xC475, - 0xBEAB: 0xC479, - 0xBEAC: 0xC480, - 0xBEAD: 0xC494, - 0xBEAE: 0xC49C, - 0xBEAF: 0xC4B8, - 0xBEB0: 0xC4BC, - 0xBEB1: 0xC4E9, - 0xBEB2: 0xC4F0, - 0xBEB3: 0xC4F1, - 0xBEB4: 0xC4F4, - 0xBEB5: 0xC4F8, - 0xBEB6: 0xC4FA, - 0xBEB7: 0xC4FF, - 0xBEB8: 0xC500, - 0xBEB9: 0xC501, - 0xBEBA: 0xC50C, - 0xBEBB: 0xC510, - 0xBEBC: 0xC514, - 0xBEBD: 0xC51C, - 0xBEBE: 0xC528, - 0xBEBF: 0xC529, - 0xBEC0: 0xC52C, - 0xBEC1: 0xC530, - 0xBEC2: 0xC538, - 0xBEC3: 0xC539, - 0xBEC4: 0xC53B, - 0xBEC5: 0xC53D, - 0xBEC6: 0xC544, - 0xBEC7: 0xC545, - 0xBEC8: 0xC548, - 0xBEC9: 0xC549, - 0xBECA: 0xC54A, - 0xBECB: 0xC54C, - 0xBECC: 0xC54D, - 0xBECD: 0xC54E, - 0xBECE: 0xC553, - 0xBECF: 0xC554, - 0xBED0: 0xC555, - 0xBED1: 0xC557, - 0xBED2: 0xC558, - 0xBED3: 0xC559, - 0xBED4: 0xC55D, - 0xBED5: 0xC55E, - 0xBED6: 0xC560, - 0xBED7: 0xC561, - 0xBED8: 0xC564, - 0xBED9: 0xC568, - 0xBEDA: 0xC570, - 0xBEDB: 0xC571, - 0xBEDC: 0xC573, - 0xBEDD: 0xC574, - 0xBEDE: 0xC575, - 0xBEDF: 0xC57C, - 0xBEE0: 0xC57D, - 0xBEE1: 0xC580, - 0xBEE2: 0xC584, - 0xBEE3: 0xC587, - 0xBEE4: 0xC58C, - 0xBEE5: 0xC58D, - 0xBEE6: 0xC58F, - 0xBEE7: 0xC591, - 0xBEE8: 0xC595, - 0xBEE9: 0xC597, - 0xBEEA: 0xC598, - 0xBEEB: 0xC59C, - 0xBEEC: 0xC5A0, - 0xBEED: 0xC5A9, - 0xBEEE: 0xC5B4, - 0xBEEF: 0xC5B5, - 0xBEF0: 0xC5B8, - 0xBEF1: 0xC5B9, - 0xBEF2: 0xC5BB, - 0xBEF3: 0xC5BC, - 0xBEF4: 0xC5BD, - 0xBEF5: 0xC5BE, - 0xBEF6: 0xC5C4, - 0xBEF7: 0xC5C5, - 0xBEF8: 0xC5C6, - 0xBEF9: 0xC5C7, - 0xBEFA: 0xC5C8, - 0xBEFB: 0xC5C9, - 0xBEFC: 0xC5CA, - 0xBEFD: 0xC5CC, - 0xBEFE: 0xC5CE, - 0xBF41: 0xD49E, - 0xBF42: 0xD49F, - 0xBF43: 0xD4A0, - 0xBF44: 0xD4A1, - 0xBF45: 0xD4A2, - 0xBF46: 0xD4A3, - 0xBF47: 0xD4A4, - 0xBF48: 0xD4A5, - 0xBF49: 0xD4A6, - 0xBF4A: 0xD4A7, - 0xBF4B: 0xD4A8, - 0xBF4C: 0xD4AA, - 0xBF4D: 0xD4AB, - 0xBF4E: 0xD4AC, - 0xBF4F: 0xD4AD, - 0xBF50: 0xD4AE, - 0xBF51: 0xD4AF, - 0xBF52: 0xD4B0, - 0xBF53: 0xD4B1, - 0xBF54: 0xD4B2, - 0xBF55: 0xD4B3, - 0xBF56: 0xD4B4, - 0xBF57: 0xD4B5, - 0xBF58: 0xD4B6, - 0xBF59: 0xD4B7, - 0xBF5A: 0xD4B8, - 0xBF61: 0xD4B9, - 0xBF62: 0xD4BA, - 0xBF63: 0xD4BB, - 0xBF64: 0xD4BC, - 0xBF65: 0xD4BD, - 0xBF66: 0xD4BE, - 0xBF67: 0xD4BF, - 0xBF68: 0xD4C0, - 0xBF69: 0xD4C1, - 0xBF6A: 0xD4C2, - 0xBF6B: 0xD4C3, - 0xBF6C: 0xD4C4, - 0xBF6D: 0xD4C5, - 0xBF6E: 0xD4C6, - 0xBF6F: 0xD4C7, - 0xBF70: 0xD4C8, - 0xBF71: 0xD4C9, - 0xBF72: 0xD4CA, - 0xBF73: 0xD4CB, - 0xBF74: 0xD4CD, - 0xBF75: 0xD4CE, - 0xBF76: 0xD4CF, - 0xBF77: 0xD4D1, - 0xBF78: 0xD4D2, - 0xBF79: 0xD4D3, - 0xBF7A: 0xD4D5, - 0xBF81: 0xD4D6, - 0xBF82: 0xD4D7, - 0xBF83: 0xD4D8, - 0xBF84: 0xD4D9, - 0xBF85: 0xD4DA, - 0xBF86: 0xD4DB, - 0xBF87: 0xD4DD, - 0xBF88: 0xD4DE, - 0xBF89: 0xD4E0, - 0xBF8A: 0xD4E1, - 0xBF8B: 0xD4E2, - 0xBF8C: 0xD4E3, - 0xBF8D: 0xD4E4, - 0xBF8E: 0xD4E5, - 0xBF8F: 0xD4E6, - 0xBF90: 0xD4E7, - 0xBF91: 0xD4E9, - 0xBF92: 0xD4EA, - 0xBF93: 0xD4EB, - 0xBF94: 0xD4ED, - 0xBF95: 0xD4EE, - 0xBF96: 0xD4EF, - 0xBF97: 0xD4F1, - 0xBF98: 0xD4F2, - 0xBF99: 0xD4F3, - 0xBF9A: 0xD4F4, - 0xBF9B: 0xD4F5, - 0xBF9C: 0xD4F6, - 0xBF9D: 0xD4F7, - 0xBF9E: 0xD4F9, - 0xBF9F: 0xD4FA, - 0xBFA0: 0xD4FC, - 0xBFA1: 0xC5D0, - 0xBFA2: 0xC5D1, - 0xBFA3: 0xC5D4, - 0xBFA4: 0xC5D8, - 0xBFA5: 0xC5E0, - 0xBFA6: 0xC5E1, - 0xBFA7: 0xC5E3, - 0xBFA8: 0xC5E5, - 0xBFA9: 0xC5EC, - 0xBFAA: 0xC5ED, - 0xBFAB: 0xC5EE, - 0xBFAC: 0xC5F0, - 0xBFAD: 0xC5F4, - 0xBFAE: 0xC5F6, - 0xBFAF: 0xC5F7, - 0xBFB0: 0xC5FC, - 0xBFB1: 0xC5FD, - 0xBFB2: 0xC5FE, - 0xBFB3: 0xC5FF, - 0xBFB4: 0xC600, - 0xBFB5: 0xC601, - 0xBFB6: 0xC605, - 0xBFB7: 0xC606, - 0xBFB8: 0xC607, - 0xBFB9: 0xC608, - 0xBFBA: 0xC60C, - 0xBFBB: 0xC610, - 0xBFBC: 0xC618, - 0xBFBD: 0xC619, - 0xBFBE: 0xC61B, - 0xBFBF: 0xC61C, - 0xBFC0: 0xC624, - 0xBFC1: 0xC625, - 0xBFC2: 0xC628, - 0xBFC3: 0xC62C, - 0xBFC4: 0xC62D, - 0xBFC5: 0xC62E, - 0xBFC6: 0xC630, - 0xBFC7: 0xC633, - 0xBFC8: 0xC634, - 0xBFC9: 0xC635, - 0xBFCA: 0xC637, - 0xBFCB: 0xC639, - 0xBFCC: 0xC63B, - 0xBFCD: 0xC640, - 0xBFCE: 0xC641, - 0xBFCF: 0xC644, - 0xBFD0: 0xC648, - 0xBFD1: 0xC650, - 0xBFD2: 0xC651, - 0xBFD3: 0xC653, - 0xBFD4: 0xC654, - 0xBFD5: 0xC655, - 0xBFD6: 0xC65C, - 0xBFD7: 0xC65D, - 0xBFD8: 0xC660, - 0xBFD9: 0xC66C, - 0xBFDA: 0xC66F, - 0xBFDB: 0xC671, - 0xBFDC: 0xC678, - 0xBFDD: 0xC679, - 0xBFDE: 0xC67C, - 0xBFDF: 0xC680, - 0xBFE0: 0xC688, - 0xBFE1: 0xC689, - 0xBFE2: 0xC68B, - 0xBFE3: 0xC68D, - 0xBFE4: 0xC694, - 0xBFE5: 0xC695, - 0xBFE6: 0xC698, - 0xBFE7: 0xC69C, - 0xBFE8: 0xC6A4, - 0xBFE9: 0xC6A5, - 0xBFEA: 0xC6A7, - 0xBFEB: 0xC6A9, - 0xBFEC: 0xC6B0, - 0xBFED: 0xC6B1, - 0xBFEE: 0xC6B4, - 0xBFEF: 0xC6B8, - 0xBFF0: 0xC6B9, - 0xBFF1: 0xC6BA, - 0xBFF2: 0xC6C0, - 0xBFF3: 0xC6C1, - 0xBFF4: 0xC6C3, - 0xBFF5: 0xC6C5, - 0xBFF6: 0xC6CC, - 0xBFF7: 0xC6CD, - 0xBFF8: 0xC6D0, - 0xBFF9: 0xC6D4, - 0xBFFA: 0xC6DC, - 0xBFFB: 0xC6DD, - 0xBFFC: 0xC6E0, - 0xBFFD: 0xC6E1, - 0xBFFE: 0xC6E8, - 0xC041: 0xD4FE, - 0xC042: 0xD4FF, - 0xC043: 0xD500, - 0xC044: 0xD501, - 0xC045: 0xD502, - 0xC046: 0xD503, - 0xC047: 0xD505, - 0xC048: 0xD506, - 0xC049: 0xD507, - 0xC04A: 0xD509, - 0xC04B: 0xD50A, - 0xC04C: 0xD50B, - 0xC04D: 0xD50D, - 0xC04E: 0xD50E, - 0xC04F: 0xD50F, - 0xC050: 0xD510, - 0xC051: 0xD511, - 0xC052: 0xD512, - 0xC053: 0xD513, - 0xC054: 0xD516, - 0xC055: 0xD518, - 0xC056: 0xD519, - 0xC057: 0xD51A, - 0xC058: 0xD51B, - 0xC059: 0xD51C, - 0xC05A: 0xD51D, - 0xC061: 0xD51E, - 0xC062: 0xD51F, - 0xC063: 0xD520, - 0xC064: 0xD521, - 0xC065: 0xD522, - 0xC066: 0xD523, - 0xC067: 0xD524, - 0xC068: 0xD525, - 0xC069: 0xD526, - 0xC06A: 0xD527, - 0xC06B: 0xD528, - 0xC06C: 0xD529, - 0xC06D: 0xD52A, - 0xC06E: 0xD52B, - 0xC06F: 0xD52C, - 0xC070: 0xD52D, - 0xC071: 0xD52E, - 0xC072: 0xD52F, - 0xC073: 0xD530, - 0xC074: 0xD531, - 0xC075: 0xD532, - 0xC076: 0xD533, - 0xC077: 0xD534, - 0xC078: 0xD535, - 0xC079: 0xD536, - 0xC07A: 0xD537, - 0xC081: 0xD538, - 0xC082: 0xD539, - 0xC083: 0xD53A, - 0xC084: 0xD53B, - 0xC085: 0xD53E, - 0xC086: 0xD53F, - 0xC087: 0xD541, - 0xC088: 0xD542, - 0xC089: 0xD543, - 0xC08A: 0xD545, - 0xC08B: 0xD546, - 0xC08C: 0xD547, - 0xC08D: 0xD548, - 0xC08E: 0xD549, - 0xC08F: 0xD54A, - 0xC090: 0xD54B, - 0xC091: 0xD54E, - 0xC092: 0xD550, - 0xC093: 0xD552, - 0xC094: 0xD553, - 0xC095: 0xD554, - 0xC096: 0xD555, - 0xC097: 0xD556, - 0xC098: 0xD557, - 0xC099: 0xD55A, - 0xC09A: 0xD55B, - 0xC09B: 0xD55D, - 0xC09C: 0xD55E, - 0xC09D: 0xD55F, - 0xC09E: 0xD561, - 0xC09F: 0xD562, - 0xC0A0: 0xD563, - 0xC0A1: 0xC6E9, - 0xC0A2: 0xC6EC, - 0xC0A3: 0xC6F0, - 0xC0A4: 0xC6F8, - 0xC0A5: 0xC6F9, - 0xC0A6: 0xC6FD, - 0xC0A7: 0xC704, - 0xC0A8: 0xC705, - 0xC0A9: 0xC708, - 0xC0AA: 0xC70C, - 0xC0AB: 0xC714, - 0xC0AC: 0xC715, - 0xC0AD: 0xC717, - 0xC0AE: 0xC719, - 0xC0AF: 0xC720, - 0xC0B0: 0xC721, - 0xC0B1: 0xC724, - 0xC0B2: 0xC728, - 0xC0B3: 0xC730, - 0xC0B4: 0xC731, - 0xC0B5: 0xC733, - 0xC0B6: 0xC735, - 0xC0B7: 0xC737, - 0xC0B8: 0xC73C, - 0xC0B9: 0xC73D, - 0xC0BA: 0xC740, - 0xC0BB: 0xC744, - 0xC0BC: 0xC74A, - 0xC0BD: 0xC74C, - 0xC0BE: 0xC74D, - 0xC0BF: 0xC74F, - 0xC0C0: 0xC751, - 0xC0C1: 0xC752, - 0xC0C2: 0xC753, - 0xC0C3: 0xC754, - 0xC0C4: 0xC755, - 0xC0C5: 0xC756, - 0xC0C6: 0xC757, - 0xC0C7: 0xC758, - 0xC0C8: 0xC75C, - 0xC0C9: 0xC760, - 0xC0CA: 0xC768, - 0xC0CB: 0xC76B, - 0xC0CC: 0xC774, - 0xC0CD: 0xC775, - 0xC0CE: 0xC778, - 0xC0CF: 0xC77C, - 0xC0D0: 0xC77D, - 0xC0D1: 0xC77E, - 0xC0D2: 0xC783, - 0xC0D3: 0xC784, - 0xC0D4: 0xC785, - 0xC0D5: 0xC787, - 0xC0D6: 0xC788, - 0xC0D7: 0xC789, - 0xC0D8: 0xC78A, - 0xC0D9: 0xC78E, - 0xC0DA: 0xC790, - 0xC0DB: 0xC791, - 0xC0DC: 0xC794, - 0xC0DD: 0xC796, - 0xC0DE: 0xC797, - 0xC0DF: 0xC798, - 0xC0E0: 0xC79A, - 0xC0E1: 0xC7A0, - 0xC0E2: 0xC7A1, - 0xC0E3: 0xC7A3, - 0xC0E4: 0xC7A4, - 0xC0E5: 0xC7A5, - 0xC0E6: 0xC7A6, - 0xC0E7: 0xC7AC, - 0xC0E8: 0xC7AD, - 0xC0E9: 0xC7B0, - 0xC0EA: 0xC7B4, - 0xC0EB: 0xC7BC, - 0xC0EC: 0xC7BD, - 0xC0ED: 0xC7BF, - 0xC0EE: 0xC7C0, - 0xC0EF: 0xC7C1, - 0xC0F0: 0xC7C8, - 0xC0F1: 0xC7C9, - 0xC0F2: 0xC7CC, - 0xC0F3: 0xC7CE, - 0xC0F4: 0xC7D0, - 0xC0F5: 0xC7D8, - 0xC0F6: 0xC7DD, - 0xC0F7: 0xC7E4, - 0xC0F8: 0xC7E8, - 0xC0F9: 0xC7EC, - 0xC0FA: 0xC800, - 0xC0FB: 0xC801, - 0xC0FC: 0xC804, - 0xC0FD: 0xC808, - 0xC0FE: 0xC80A, - 0xC141: 0xD564, - 0xC142: 0xD566, - 0xC143: 0xD567, - 0xC144: 0xD56A, - 0xC145: 0xD56C, - 0xC146: 0xD56E, - 0xC147: 0xD56F, - 0xC148: 0xD570, - 0xC149: 0xD571, - 0xC14A: 0xD572, - 0xC14B: 0xD573, - 0xC14C: 0xD576, - 0xC14D: 0xD577, - 0xC14E: 0xD579, - 0xC14F: 0xD57A, - 0xC150: 0xD57B, - 0xC151: 0xD57D, - 0xC152: 0xD57E, - 0xC153: 0xD57F, - 0xC154: 0xD580, - 0xC155: 0xD581, - 0xC156: 0xD582, - 0xC157: 0xD583, - 0xC158: 0xD586, - 0xC159: 0xD58A, - 0xC15A: 0xD58B, - 0xC161: 0xD58C, - 0xC162: 0xD58D, - 0xC163: 0xD58E, - 0xC164: 0xD58F, - 0xC165: 0xD591, - 0xC166: 0xD592, - 0xC167: 0xD593, - 0xC168: 0xD594, - 0xC169: 0xD595, - 0xC16A: 0xD596, - 0xC16B: 0xD597, - 0xC16C: 0xD598, - 0xC16D: 0xD599, - 0xC16E: 0xD59A, - 0xC16F: 0xD59B, - 0xC170: 0xD59C, - 0xC171: 0xD59D, - 0xC172: 0xD59E, - 0xC173: 0xD59F, - 0xC174: 0xD5A0, - 0xC175: 0xD5A1, - 0xC176: 0xD5A2, - 0xC177: 0xD5A3, - 0xC178: 0xD5A4, - 0xC179: 0xD5A6, - 0xC17A: 0xD5A7, - 0xC181: 0xD5A8, - 0xC182: 0xD5A9, - 0xC183: 0xD5AA, - 0xC184: 0xD5AB, - 0xC185: 0xD5AC, - 0xC186: 0xD5AD, - 0xC187: 0xD5AE, - 0xC188: 0xD5AF, - 0xC189: 0xD5B0, - 0xC18A: 0xD5B1, - 0xC18B: 0xD5B2, - 0xC18C: 0xD5B3, - 0xC18D: 0xD5B4, - 0xC18E: 0xD5B5, - 0xC18F: 0xD5B6, - 0xC190: 0xD5B7, - 0xC191: 0xD5B8, - 0xC192: 0xD5B9, - 0xC193: 0xD5BA, - 0xC194: 0xD5BB, - 0xC195: 0xD5BC, - 0xC196: 0xD5BD, - 0xC197: 0xD5BE, - 0xC198: 0xD5BF, - 0xC199: 0xD5C0, - 0xC19A: 0xD5C1, - 0xC19B: 0xD5C2, - 0xC19C: 0xD5C3, - 0xC19D: 0xD5C4, - 0xC19E: 0xD5C5, - 0xC19F: 0xD5C6, - 0xC1A0: 0xD5C7, - 0xC1A1: 0xC810, - 0xC1A2: 0xC811, - 0xC1A3: 0xC813, - 0xC1A4: 0xC815, - 0xC1A5: 0xC816, - 0xC1A6: 0xC81C, - 0xC1A7: 0xC81D, - 0xC1A8: 0xC820, - 0xC1A9: 0xC824, - 0xC1AA: 0xC82C, - 0xC1AB: 0xC82D, - 0xC1AC: 0xC82F, - 0xC1AD: 0xC831, - 0xC1AE: 0xC838, - 0xC1AF: 0xC83C, - 0xC1B0: 0xC840, - 0xC1B1: 0xC848, - 0xC1B2: 0xC849, - 0xC1B3: 0xC84C, - 0xC1B4: 0xC84D, - 0xC1B5: 0xC854, - 0xC1B6: 0xC870, - 0xC1B7: 0xC871, - 0xC1B8: 0xC874, - 0xC1B9: 0xC878, - 0xC1BA: 0xC87A, - 0xC1BB: 0xC880, - 0xC1BC: 0xC881, - 0xC1BD: 0xC883, - 0xC1BE: 0xC885, - 0xC1BF: 0xC886, - 0xC1C0: 0xC887, - 0xC1C1: 0xC88B, - 0xC1C2: 0xC88C, - 0xC1C3: 0xC88D, - 0xC1C4: 0xC894, - 0xC1C5: 0xC89D, - 0xC1C6: 0xC89F, - 0xC1C7: 0xC8A1, - 0xC1C8: 0xC8A8, - 0xC1C9: 0xC8BC, - 0xC1CA: 0xC8BD, - 0xC1CB: 0xC8C4, - 0xC1CC: 0xC8C8, - 0xC1CD: 0xC8CC, - 0xC1CE: 0xC8D4, - 0xC1CF: 0xC8D5, - 0xC1D0: 0xC8D7, - 0xC1D1: 0xC8D9, - 0xC1D2: 0xC8E0, - 0xC1D3: 0xC8E1, - 0xC1D4: 0xC8E4, - 0xC1D5: 0xC8F5, - 0xC1D6: 0xC8FC, - 0xC1D7: 0xC8FD, - 0xC1D8: 0xC900, - 0xC1D9: 0xC904, - 0xC1DA: 0xC905, - 0xC1DB: 0xC906, - 0xC1DC: 0xC90C, - 0xC1DD: 0xC90D, - 0xC1DE: 0xC90F, - 0xC1DF: 0xC911, - 0xC1E0: 0xC918, - 0xC1E1: 0xC92C, - 0xC1E2: 0xC934, - 0xC1E3: 0xC950, - 0xC1E4: 0xC951, - 0xC1E5: 0xC954, - 0xC1E6: 0xC958, - 0xC1E7: 0xC960, - 0xC1E8: 0xC961, - 0xC1E9: 0xC963, - 0xC1EA: 0xC96C, - 0xC1EB: 0xC970, - 0xC1EC: 0xC974, - 0xC1ED: 0xC97C, - 0xC1EE: 0xC988, - 0xC1EF: 0xC989, - 0xC1F0: 0xC98C, - 0xC1F1: 0xC990, - 0xC1F2: 0xC998, - 0xC1F3: 0xC999, - 0xC1F4: 0xC99B, - 0xC1F5: 0xC99D, - 0xC1F6: 0xC9C0, - 0xC1F7: 0xC9C1, - 0xC1F8: 0xC9C4, - 0xC1F9: 0xC9C7, - 0xC1FA: 0xC9C8, - 0xC1FB: 0xC9CA, - 0xC1FC: 0xC9D0, - 0xC1FD: 0xC9D1, - 0xC1FE: 0xC9D3, - 0xC241: 0xD5CA, - 0xC242: 0xD5CB, - 0xC243: 0xD5CD, - 0xC244: 0xD5CE, - 0xC245: 0xD5CF, - 0xC246: 0xD5D1, - 0xC247: 0xD5D3, - 0xC248: 0xD5D4, - 0xC249: 0xD5D5, - 0xC24A: 0xD5D6, - 0xC24B: 0xD5D7, - 0xC24C: 0xD5DA, - 0xC24D: 0xD5DC, - 0xC24E: 0xD5DE, - 0xC24F: 0xD5DF, - 0xC250: 0xD5E0, - 0xC251: 0xD5E1, - 0xC252: 0xD5E2, - 0xC253: 0xD5E3, - 0xC254: 0xD5E6, - 0xC255: 0xD5E7, - 0xC256: 0xD5E9, - 0xC257: 0xD5EA, - 0xC258: 0xD5EB, - 0xC259: 0xD5ED, - 0xC25A: 0xD5EE, - 0xC261: 0xD5EF, - 0xC262: 0xD5F0, - 0xC263: 0xD5F1, - 0xC264: 0xD5F2, - 0xC265: 0xD5F3, - 0xC266: 0xD5F6, - 0xC267: 0xD5F8, - 0xC268: 0xD5FA, - 0xC269: 0xD5FB, - 0xC26A: 0xD5FC, - 0xC26B: 0xD5FD, - 0xC26C: 0xD5FE, - 0xC26D: 0xD5FF, - 0xC26E: 0xD602, - 0xC26F: 0xD603, - 0xC270: 0xD605, - 0xC271: 0xD606, - 0xC272: 0xD607, - 0xC273: 0xD609, - 0xC274: 0xD60A, - 0xC275: 0xD60B, - 0xC276: 0xD60C, - 0xC277: 0xD60D, - 0xC278: 0xD60E, - 0xC279: 0xD60F, - 0xC27A: 0xD612, - 0xC281: 0xD616, - 0xC282: 0xD617, - 0xC283: 0xD618, - 0xC284: 0xD619, - 0xC285: 0xD61A, - 0xC286: 0xD61B, - 0xC287: 0xD61D, - 0xC288: 0xD61E, - 0xC289: 0xD61F, - 0xC28A: 0xD621, - 0xC28B: 0xD622, - 0xC28C: 0xD623, - 0xC28D: 0xD625, - 0xC28E: 0xD626, - 0xC28F: 0xD627, - 0xC290: 0xD628, - 0xC291: 0xD629, - 0xC292: 0xD62A, - 0xC293: 0xD62B, - 0xC294: 0xD62C, - 0xC295: 0xD62E, - 0xC296: 0xD62F, - 0xC297: 0xD630, - 0xC298: 0xD631, - 0xC299: 0xD632, - 0xC29A: 0xD633, - 0xC29B: 0xD634, - 0xC29C: 0xD635, - 0xC29D: 0xD636, - 0xC29E: 0xD637, - 0xC29F: 0xD63A, - 0xC2A0: 0xD63B, - 0xC2A1: 0xC9D5, - 0xC2A2: 0xC9D6, - 0xC2A3: 0xC9D9, - 0xC2A4: 0xC9DA, - 0xC2A5: 0xC9DC, - 0xC2A6: 0xC9DD, - 0xC2A7: 0xC9E0, - 0xC2A8: 0xC9E2, - 0xC2A9: 0xC9E4, - 0xC2AA: 0xC9E7, - 0xC2AB: 0xC9EC, - 0xC2AC: 0xC9ED, - 0xC2AD: 0xC9EF, - 0xC2AE: 0xC9F0, - 0xC2AF: 0xC9F1, - 0xC2B0: 0xC9F8, - 0xC2B1: 0xC9F9, - 0xC2B2: 0xC9FC, - 0xC2B3: 0xCA00, - 0xC2B4: 0xCA08, - 0xC2B5: 0xCA09, - 0xC2B6: 0xCA0B, - 0xC2B7: 0xCA0C, - 0xC2B8: 0xCA0D, - 0xC2B9: 0xCA14, - 0xC2BA: 0xCA18, - 0xC2BB: 0xCA29, - 0xC2BC: 0xCA4C, - 0xC2BD: 0xCA4D, - 0xC2BE: 0xCA50, - 0xC2BF: 0xCA54, - 0xC2C0: 0xCA5C, - 0xC2C1: 0xCA5D, - 0xC2C2: 0xCA5F, - 0xC2C3: 0xCA60, - 0xC2C4: 0xCA61, - 0xC2C5: 0xCA68, - 0xC2C6: 0xCA7D, - 0xC2C7: 0xCA84, - 0xC2C8: 0xCA98, - 0xC2C9: 0xCABC, - 0xC2CA: 0xCABD, - 0xC2CB: 0xCAC0, - 0xC2CC: 0xCAC4, - 0xC2CD: 0xCACC, - 0xC2CE: 0xCACD, - 0xC2CF: 0xCACF, - 0xC2D0: 0xCAD1, - 0xC2D1: 0xCAD3, - 0xC2D2: 0xCAD8, - 0xC2D3: 0xCAD9, - 0xC2D4: 0xCAE0, - 0xC2D5: 0xCAEC, - 0xC2D6: 0xCAF4, - 0xC2D7: 0xCB08, - 0xC2D8: 0xCB10, - 0xC2D9: 0xCB14, - 0xC2DA: 0xCB18, - 0xC2DB: 0xCB20, - 0xC2DC: 0xCB21, - 0xC2DD: 0xCB41, - 0xC2DE: 0xCB48, - 0xC2DF: 0xCB49, - 0xC2E0: 0xCB4C, - 0xC2E1: 0xCB50, - 0xC2E2: 0xCB58, - 0xC2E3: 0xCB59, - 0xC2E4: 0xCB5D, - 0xC2E5: 0xCB64, - 0xC2E6: 0xCB78, - 0xC2E7: 0xCB79, - 0xC2E8: 0xCB9C, - 0xC2E9: 0xCBB8, - 0xC2EA: 0xCBD4, - 0xC2EB: 0xCBE4, - 0xC2EC: 0xCBE7, - 0xC2ED: 0xCBE9, - 0xC2EE: 0xCC0C, - 0xC2EF: 0xCC0D, - 0xC2F0: 0xCC10, - 0xC2F1: 0xCC14, - 0xC2F2: 0xCC1C, - 0xC2F3: 0xCC1D, - 0xC2F4: 0xCC21, - 0xC2F5: 0xCC22, - 0xC2F6: 0xCC27, - 0xC2F7: 0xCC28, - 0xC2F8: 0xCC29, - 0xC2F9: 0xCC2C, - 0xC2FA: 0xCC2E, - 0xC2FB: 0xCC30, - 0xC2FC: 0xCC38, - 0xC2FD: 0xCC39, - 0xC2FE: 0xCC3B, - 0xC341: 0xD63D, - 0xC342: 0xD63E, - 0xC343: 0xD63F, - 0xC344: 0xD641, - 0xC345: 0xD642, - 0xC346: 0xD643, - 0xC347: 0xD644, - 0xC348: 0xD646, - 0xC349: 0xD647, - 0xC34A: 0xD64A, - 0xC34B: 0xD64C, - 0xC34C: 0xD64E, - 0xC34D: 0xD64F, - 0xC34E: 0xD650, - 0xC34F: 0xD652, - 0xC350: 0xD653, - 0xC351: 0xD656, - 0xC352: 0xD657, - 0xC353: 0xD659, - 0xC354: 0xD65A, - 0xC355: 0xD65B, - 0xC356: 0xD65D, - 0xC357: 0xD65E, - 0xC358: 0xD65F, - 0xC359: 0xD660, - 0xC35A: 0xD661, - 0xC361: 0xD662, - 0xC362: 0xD663, - 0xC363: 0xD664, - 0xC364: 0xD665, - 0xC365: 0xD666, - 0xC366: 0xD668, - 0xC367: 0xD66A, - 0xC368: 0xD66B, - 0xC369: 0xD66C, - 0xC36A: 0xD66D, - 0xC36B: 0xD66E, - 0xC36C: 0xD66F, - 0xC36D: 0xD672, - 0xC36E: 0xD673, - 0xC36F: 0xD675, - 0xC370: 0xD676, - 0xC371: 0xD677, - 0xC372: 0xD678, - 0xC373: 0xD679, - 0xC374: 0xD67A, - 0xC375: 0xD67B, - 0xC376: 0xD67C, - 0xC377: 0xD67D, - 0xC378: 0xD67E, - 0xC379: 0xD67F, - 0xC37A: 0xD680, - 0xC381: 0xD681, - 0xC382: 0xD682, - 0xC383: 0xD684, - 0xC384: 0xD686, - 0xC385: 0xD687, - 0xC386: 0xD688, - 0xC387: 0xD689, - 0xC388: 0xD68A, - 0xC389: 0xD68B, - 0xC38A: 0xD68E, - 0xC38B: 0xD68F, - 0xC38C: 0xD691, - 0xC38D: 0xD692, - 0xC38E: 0xD693, - 0xC38F: 0xD695, - 0xC390: 0xD696, - 0xC391: 0xD697, - 0xC392: 0xD698, - 0xC393: 0xD699, - 0xC394: 0xD69A, - 0xC395: 0xD69B, - 0xC396: 0xD69C, - 0xC397: 0xD69E, - 0xC398: 0xD6A0, - 0xC399: 0xD6A2, - 0xC39A: 0xD6A3, - 0xC39B: 0xD6A4, - 0xC39C: 0xD6A5, - 0xC39D: 0xD6A6, - 0xC39E: 0xD6A7, - 0xC39F: 0xD6A9, - 0xC3A0: 0xD6AA, - 0xC3A1: 0xCC3C, - 0xC3A2: 0xCC3D, - 0xC3A3: 0xCC3E, - 0xC3A4: 0xCC44, - 0xC3A5: 0xCC45, - 0xC3A6: 0xCC48, - 0xC3A7: 0xCC4C, - 0xC3A8: 0xCC54, - 0xC3A9: 0xCC55, - 0xC3AA: 0xCC57, - 0xC3AB: 0xCC58, - 0xC3AC: 0xCC59, - 0xC3AD: 0xCC60, - 0xC3AE: 0xCC64, - 0xC3AF: 0xCC66, - 0xC3B0: 0xCC68, - 0xC3B1: 0xCC70, - 0xC3B2: 0xCC75, - 0xC3B3: 0xCC98, - 0xC3B4: 0xCC99, - 0xC3B5: 0xCC9C, - 0xC3B6: 0xCCA0, - 0xC3B7: 0xCCA8, - 0xC3B8: 0xCCA9, - 0xC3B9: 0xCCAB, - 0xC3BA: 0xCCAC, - 0xC3BB: 0xCCAD, - 0xC3BC: 0xCCB4, - 0xC3BD: 0xCCB5, - 0xC3BE: 0xCCB8, - 0xC3BF: 0xCCBC, - 0xC3C0: 0xCCC4, - 0xC3C1: 0xCCC5, - 0xC3C2: 0xCCC7, - 0xC3C3: 0xCCC9, - 0xC3C4: 0xCCD0, - 0xC3C5: 0xCCD4, - 0xC3C6: 0xCCE4, - 0xC3C7: 0xCCEC, - 0xC3C8: 0xCCF0, - 0xC3C9: 0xCD01, - 0xC3CA: 0xCD08, - 0xC3CB: 0xCD09, - 0xC3CC: 0xCD0C, - 0xC3CD: 0xCD10, - 0xC3CE: 0xCD18, - 0xC3CF: 0xCD19, - 0xC3D0: 0xCD1B, - 0xC3D1: 0xCD1D, - 0xC3D2: 0xCD24, - 0xC3D3: 0xCD28, - 0xC3D4: 0xCD2C, - 0xC3D5: 0xCD39, - 0xC3D6: 0xCD5C, - 0xC3D7: 0xCD60, - 0xC3D8: 0xCD64, - 0xC3D9: 0xCD6C, - 0xC3DA: 0xCD6D, - 0xC3DB: 0xCD6F, - 0xC3DC: 0xCD71, - 0xC3DD: 0xCD78, - 0xC3DE: 0xCD88, - 0xC3DF: 0xCD94, - 0xC3E0: 0xCD95, - 0xC3E1: 0xCD98, - 0xC3E2: 0xCD9C, - 0xC3E3: 0xCDA4, - 0xC3E4: 0xCDA5, - 0xC3E5: 0xCDA7, - 0xC3E6: 0xCDA9, - 0xC3E7: 0xCDB0, - 0xC3E8: 0xCDC4, - 0xC3E9: 0xCDCC, - 0xC3EA: 0xCDD0, - 0xC3EB: 0xCDE8, - 0xC3EC: 0xCDEC, - 0xC3ED: 0xCDF0, - 0xC3EE: 0xCDF8, - 0xC3EF: 0xCDF9, - 0xC3F0: 0xCDFB, - 0xC3F1: 0xCDFD, - 0xC3F2: 0xCE04, - 0xC3F3: 0xCE08, - 0xC3F4: 0xCE0C, - 0xC3F5: 0xCE14, - 0xC3F6: 0xCE19, - 0xC3F7: 0xCE20, - 0xC3F8: 0xCE21, - 0xC3F9: 0xCE24, - 0xC3FA: 0xCE28, - 0xC3FB: 0xCE30, - 0xC3FC: 0xCE31, - 0xC3FD: 0xCE33, - 0xC3FE: 0xCE35, - 0xC441: 0xD6AB, - 0xC442: 0xD6AD, - 0xC443: 0xD6AE, - 0xC444: 0xD6AF, - 0xC445: 0xD6B1, - 0xC446: 0xD6B2, - 0xC447: 0xD6B3, - 0xC448: 0xD6B4, - 0xC449: 0xD6B5, - 0xC44A: 0xD6B6, - 0xC44B: 0xD6B7, - 0xC44C: 0xD6B8, - 0xC44D: 0xD6BA, - 0xC44E: 0xD6BC, - 0xC44F: 0xD6BD, - 0xC450: 0xD6BE, - 0xC451: 0xD6BF, - 0xC452: 0xD6C0, - 0xC453: 0xD6C1, - 0xC454: 0xD6C2, - 0xC455: 0xD6C3, - 0xC456: 0xD6C6, - 0xC457: 0xD6C7, - 0xC458: 0xD6C9, - 0xC459: 0xD6CA, - 0xC45A: 0xD6CB, - 0xC461: 0xD6CD, - 0xC462: 0xD6CE, - 0xC463: 0xD6CF, - 0xC464: 0xD6D0, - 0xC465: 0xD6D2, - 0xC466: 0xD6D3, - 0xC467: 0xD6D5, - 0xC468: 0xD6D6, - 0xC469: 0xD6D8, - 0xC46A: 0xD6DA, - 0xC46B: 0xD6DB, - 0xC46C: 0xD6DC, - 0xC46D: 0xD6DD, - 0xC46E: 0xD6DE, - 0xC46F: 0xD6DF, - 0xC470: 0xD6E1, - 0xC471: 0xD6E2, - 0xC472: 0xD6E3, - 0xC473: 0xD6E5, - 0xC474: 0xD6E6, - 0xC475: 0xD6E7, - 0xC476: 0xD6E9, - 0xC477: 0xD6EA, - 0xC478: 0xD6EB, - 0xC479: 0xD6EC, - 0xC47A: 0xD6ED, - 0xC481: 0xD6EE, - 0xC482: 0xD6EF, - 0xC483: 0xD6F1, - 0xC484: 0xD6F2, - 0xC485: 0xD6F3, - 0xC486: 0xD6F4, - 0xC487: 0xD6F6, - 0xC488: 0xD6F7, - 0xC489: 0xD6F8, - 0xC48A: 0xD6F9, - 0xC48B: 0xD6FA, - 0xC48C: 0xD6FB, - 0xC48D: 0xD6FE, - 0xC48E: 0xD6FF, - 0xC48F: 0xD701, - 0xC490: 0xD702, - 0xC491: 0xD703, - 0xC492: 0xD705, - 0xC493: 0xD706, - 0xC494: 0xD707, - 0xC495: 0xD708, - 0xC496: 0xD709, - 0xC497: 0xD70A, - 0xC498: 0xD70B, - 0xC499: 0xD70C, - 0xC49A: 0xD70D, - 0xC49B: 0xD70E, - 0xC49C: 0xD70F, - 0xC49D: 0xD710, - 0xC49E: 0xD712, - 0xC49F: 0xD713, - 0xC4A0: 0xD714, - 0xC4A1: 0xCE58, - 0xC4A2: 0xCE59, - 0xC4A3: 0xCE5C, - 0xC4A4: 0xCE5F, - 0xC4A5: 0xCE60, - 0xC4A6: 0xCE61, - 0xC4A7: 0xCE68, - 0xC4A8: 0xCE69, - 0xC4A9: 0xCE6B, - 0xC4AA: 0xCE6D, - 0xC4AB: 0xCE74, - 0xC4AC: 0xCE75, - 0xC4AD: 0xCE78, - 0xC4AE: 0xCE7C, - 0xC4AF: 0xCE84, - 0xC4B0: 0xCE85, - 0xC4B1: 0xCE87, - 0xC4B2: 0xCE89, - 0xC4B3: 0xCE90, - 0xC4B4: 0xCE91, - 0xC4B5: 0xCE94, - 0xC4B6: 0xCE98, - 0xC4B7: 0xCEA0, - 0xC4B8: 0xCEA1, - 0xC4B9: 0xCEA3, - 0xC4BA: 0xCEA4, - 0xC4BB: 0xCEA5, - 0xC4BC: 0xCEAC, - 0xC4BD: 0xCEAD, - 0xC4BE: 0xCEC1, - 0xC4BF: 0xCEE4, - 0xC4C0: 0xCEE5, - 0xC4C1: 0xCEE8, - 0xC4C2: 0xCEEB, - 0xC4C3: 0xCEEC, - 0xC4C4: 0xCEF4, - 0xC4C5: 0xCEF5, - 0xC4C6: 0xCEF7, - 0xC4C7: 0xCEF8, - 0xC4C8: 0xCEF9, - 0xC4C9: 0xCF00, - 0xC4CA: 0xCF01, - 0xC4CB: 0xCF04, - 0xC4CC: 0xCF08, - 0xC4CD: 0xCF10, - 0xC4CE: 0xCF11, - 0xC4CF: 0xCF13, - 0xC4D0: 0xCF15, - 0xC4D1: 0xCF1C, - 0xC4D2: 0xCF20, - 0xC4D3: 0xCF24, - 0xC4D4: 0xCF2C, - 0xC4D5: 0xCF2D, - 0xC4D6: 0xCF2F, - 0xC4D7: 0xCF30, - 0xC4D8: 0xCF31, - 0xC4D9: 0xCF38, - 0xC4DA: 0xCF54, - 0xC4DB: 0xCF55, - 0xC4DC: 0xCF58, - 0xC4DD: 0xCF5C, - 0xC4DE: 0xCF64, - 0xC4DF: 0xCF65, - 0xC4E0: 0xCF67, - 0xC4E1: 0xCF69, - 0xC4E2: 0xCF70, - 0xC4E3: 0xCF71, - 0xC4E4: 0xCF74, - 0xC4E5: 0xCF78, - 0xC4E6: 0xCF80, - 0xC4E7: 0xCF85, - 0xC4E8: 0xCF8C, - 0xC4E9: 0xCFA1, - 0xC4EA: 0xCFA8, - 0xC4EB: 0xCFB0, - 0xC4EC: 0xCFC4, - 0xC4ED: 0xCFE0, - 0xC4EE: 0xCFE1, - 0xC4EF: 0xCFE4, - 0xC4F0: 0xCFE8, - 0xC4F1: 0xCFF0, - 0xC4F2: 0xCFF1, - 0xC4F3: 0xCFF3, - 0xC4F4: 0xCFF5, - 0xC4F5: 0xCFFC, - 0xC4F6: 0xD000, - 0xC4F7: 0xD004, - 0xC4F8: 0xD011, - 0xC4F9: 0xD018, - 0xC4FA: 0xD02D, - 0xC4FB: 0xD034, - 0xC4FC: 0xD035, - 0xC4FD: 0xD038, - 0xC4FE: 0xD03C, - 0xC541: 0xD715, - 0xC542: 0xD716, - 0xC543: 0xD717, - 0xC544: 0xD71A, - 0xC545: 0xD71B, - 0xC546: 0xD71D, - 0xC547: 0xD71E, - 0xC548: 0xD71F, - 0xC549: 0xD721, - 0xC54A: 0xD722, - 0xC54B: 0xD723, - 0xC54C: 0xD724, - 0xC54D: 0xD725, - 0xC54E: 0xD726, - 0xC54F: 0xD727, - 0xC550: 0xD72A, - 0xC551: 0xD72C, - 0xC552: 0xD72E, - 0xC553: 0xD72F, - 0xC554: 0xD730, - 0xC555: 0xD731, - 0xC556: 0xD732, - 0xC557: 0xD733, - 0xC558: 0xD736, - 0xC559: 0xD737, - 0xC55A: 0xD739, - 0xC561: 0xD73A, - 0xC562: 0xD73B, - 0xC563: 0xD73D, - 0xC564: 0xD73E, - 0xC565: 0xD73F, - 0xC566: 0xD740, - 0xC567: 0xD741, - 0xC568: 0xD742, - 0xC569: 0xD743, - 0xC56A: 0xD745, - 0xC56B: 0xD746, - 0xC56C: 0xD748, - 0xC56D: 0xD74A, - 0xC56E: 0xD74B, - 0xC56F: 0xD74C, - 0xC570: 0xD74D, - 0xC571: 0xD74E, - 0xC572: 0xD74F, - 0xC573: 0xD752, - 0xC574: 0xD753, - 0xC575: 0xD755, - 0xC576: 0xD75A, - 0xC577: 0xD75B, - 0xC578: 0xD75C, - 0xC579: 0xD75D, - 0xC57A: 0xD75E, - 0xC581: 0xD75F, - 0xC582: 0xD762, - 0xC583: 0xD764, - 0xC584: 0xD766, - 0xC585: 0xD767, - 0xC586: 0xD768, - 0xC587: 0xD76A, - 0xC588: 0xD76B, - 0xC589: 0xD76D, - 0xC58A: 0xD76E, - 0xC58B: 0xD76F, - 0xC58C: 0xD771, - 0xC58D: 0xD772, - 0xC58E: 0xD773, - 0xC58F: 0xD775, - 0xC590: 0xD776, - 0xC591: 0xD777, - 0xC592: 0xD778, - 0xC593: 0xD779, - 0xC594: 0xD77A, - 0xC595: 0xD77B, - 0xC596: 0xD77E, - 0xC597: 0xD77F, - 0xC598: 0xD780, - 0xC599: 0xD782, - 0xC59A: 0xD783, - 0xC59B: 0xD784, - 0xC59C: 0xD785, - 0xC59D: 0xD786, - 0xC59E: 0xD787, - 0xC59F: 0xD78A, - 0xC5A0: 0xD78B, - 0xC5A1: 0xD044, - 0xC5A2: 0xD045, - 0xC5A3: 0xD047, - 0xC5A4: 0xD049, - 0xC5A5: 0xD050, - 0xC5A6: 0xD054, - 0xC5A7: 0xD058, - 0xC5A8: 0xD060, - 0xC5A9: 0xD06C, - 0xC5AA: 0xD06D, - 0xC5AB: 0xD070, - 0xC5AC: 0xD074, - 0xC5AD: 0xD07C, - 0xC5AE: 0xD07D, - 0xC5AF: 0xD081, - 0xC5B0: 0xD0A4, - 0xC5B1: 0xD0A5, - 0xC5B2: 0xD0A8, - 0xC5B3: 0xD0AC, - 0xC5B4: 0xD0B4, - 0xC5B5: 0xD0B5, - 0xC5B6: 0xD0B7, - 0xC5B7: 0xD0B9, - 0xC5B8: 0xD0C0, - 0xC5B9: 0xD0C1, - 0xC5BA: 0xD0C4, - 0xC5BB: 0xD0C8, - 0xC5BC: 0xD0C9, - 0xC5BD: 0xD0D0, - 0xC5BE: 0xD0D1, - 0xC5BF: 0xD0D3, - 0xC5C0: 0xD0D4, - 0xC5C1: 0xD0D5, - 0xC5C2: 0xD0DC, - 0xC5C3: 0xD0DD, - 0xC5C4: 0xD0E0, - 0xC5C5: 0xD0E4, - 0xC5C6: 0xD0EC, - 0xC5C7: 0xD0ED, - 0xC5C8: 0xD0EF, - 0xC5C9: 0xD0F0, - 0xC5CA: 0xD0F1, - 0xC5CB: 0xD0F8, - 0xC5CC: 0xD10D, - 0xC5CD: 0xD130, - 0xC5CE: 0xD131, - 0xC5CF: 0xD134, - 0xC5D0: 0xD138, - 0xC5D1: 0xD13A, - 0xC5D2: 0xD140, - 0xC5D3: 0xD141, - 0xC5D4: 0xD143, - 0xC5D5: 0xD144, - 0xC5D6: 0xD145, - 0xC5D7: 0xD14C, - 0xC5D8: 0xD14D, - 0xC5D9: 0xD150, - 0xC5DA: 0xD154, - 0xC5DB: 0xD15C, - 0xC5DC: 0xD15D, - 0xC5DD: 0xD15F, - 0xC5DE: 0xD161, - 0xC5DF: 0xD168, - 0xC5E0: 0xD16C, - 0xC5E1: 0xD17C, - 0xC5E2: 0xD184, - 0xC5E3: 0xD188, - 0xC5E4: 0xD1A0, - 0xC5E5: 0xD1A1, - 0xC5E6: 0xD1A4, - 0xC5E7: 0xD1A8, - 0xC5E8: 0xD1B0, - 0xC5E9: 0xD1B1, - 0xC5EA: 0xD1B3, - 0xC5EB: 0xD1B5, - 0xC5EC: 0xD1BA, - 0xC5ED: 0xD1BC, - 0xC5EE: 0xD1C0, - 0xC5EF: 0xD1D8, - 0xC5F0: 0xD1F4, - 0xC5F1: 0xD1F8, - 0xC5F2: 0xD207, - 0xC5F3: 0xD209, - 0xC5F4: 0xD210, - 0xC5F5: 0xD22C, - 0xC5F6: 0xD22D, - 0xC5F7: 0xD230, - 0xC5F8: 0xD234, - 0xC5F9: 0xD23C, - 0xC5FA: 0xD23D, - 0xC5FB: 0xD23F, - 0xC5FC: 0xD241, - 0xC5FD: 0xD248, - 0xC5FE: 0xD25C, - 0xC641: 0xD78D, - 0xC642: 0xD78E, - 0xC643: 0xD78F, - 0xC644: 0xD791, - 0xC645: 0xD792, - 0xC646: 0xD793, - 0xC647: 0xD794, - 0xC648: 0xD795, - 0xC649: 0xD796, - 0xC64A: 0xD797, - 0xC64B: 0xD79A, - 0xC64C: 0xD79C, - 0xC64D: 0xD79E, - 0xC64E: 0xD79F, - 0xC64F: 0xD7A0, - 0xC650: 0xD7A1, - 0xC651: 0xD7A2, - 0xC652: 0xD7A3, - 0xC6A1: 0xD264, - 0xC6A2: 0xD280, - 0xC6A3: 0xD281, - 0xC6A4: 0xD284, - 0xC6A5: 0xD288, - 0xC6A6: 0xD290, - 0xC6A7: 0xD291, - 0xC6A8: 0xD295, - 0xC6A9: 0xD29C, - 0xC6AA: 0xD2A0, - 0xC6AB: 0xD2A4, - 0xC6AC: 0xD2AC, - 0xC6AD: 0xD2B1, - 0xC6AE: 0xD2B8, - 0xC6AF: 0xD2B9, - 0xC6B0: 0xD2BC, - 0xC6B1: 0xD2BF, - 0xC6B2: 0xD2C0, - 0xC6B3: 0xD2C2, - 0xC6B4: 0xD2C8, - 0xC6B5: 0xD2C9, - 0xC6B6: 0xD2CB, - 0xC6B7: 0xD2D4, - 0xC6B8: 0xD2D8, - 0xC6B9: 0xD2DC, - 0xC6BA: 0xD2E4, - 0xC6BB: 0xD2E5, - 0xC6BC: 0xD2F0, - 0xC6BD: 0xD2F1, - 0xC6BE: 0xD2F4, - 0xC6BF: 0xD2F8, - 0xC6C0: 0xD300, - 0xC6C1: 0xD301, - 0xC6C2: 0xD303, - 0xC6C3: 0xD305, - 0xC6C4: 0xD30C, - 0xC6C5: 0xD30D, - 0xC6C6: 0xD30E, - 0xC6C7: 0xD310, - 0xC6C8: 0xD314, - 0xC6C9: 0xD316, - 0xC6CA: 0xD31C, - 0xC6CB: 0xD31D, - 0xC6CC: 0xD31F, - 0xC6CD: 0xD320, - 0xC6CE: 0xD321, - 0xC6CF: 0xD325, - 0xC6D0: 0xD328, - 0xC6D1: 0xD329, - 0xC6D2: 0xD32C, - 0xC6D3: 0xD330, - 0xC6D4: 0xD338, - 0xC6D5: 0xD339, - 0xC6D6: 0xD33B, - 0xC6D7: 0xD33C, - 0xC6D8: 0xD33D, - 0xC6D9: 0xD344, - 0xC6DA: 0xD345, - 0xC6DB: 0xD37C, - 0xC6DC: 0xD37D, - 0xC6DD: 0xD380, - 0xC6DE: 0xD384, - 0xC6DF: 0xD38C, - 0xC6E0: 0xD38D, - 0xC6E1: 0xD38F, - 0xC6E2: 0xD390, - 0xC6E3: 0xD391, - 0xC6E4: 0xD398, - 0xC6E5: 0xD399, - 0xC6E6: 0xD39C, - 0xC6E7: 0xD3A0, - 0xC6E8: 0xD3A8, - 0xC6E9: 0xD3A9, - 0xC6EA: 0xD3AB, - 0xC6EB: 0xD3AD, - 0xC6EC: 0xD3B4, - 0xC6ED: 0xD3B8, - 0xC6EE: 0xD3BC, - 0xC6EF: 0xD3C4, - 0xC6F0: 0xD3C5, - 0xC6F1: 0xD3C8, - 0xC6F2: 0xD3C9, - 0xC6F3: 0xD3D0, - 0xC6F4: 0xD3D8, - 0xC6F5: 0xD3E1, - 0xC6F6: 0xD3E3, - 0xC6F7: 0xD3EC, - 0xC6F8: 0xD3ED, - 0xC6F9: 0xD3F0, - 0xC6FA: 0xD3F4, - 0xC6FB: 0xD3FC, - 0xC6FC: 0xD3FD, - 0xC6FD: 0xD3FF, - 0xC6FE: 0xD401, - 0xC7A1: 0xD408, - 0xC7A2: 0xD41D, - 0xC7A3: 0xD440, - 0xC7A4: 0xD444, - 0xC7A5: 0xD45C, - 0xC7A6: 0xD460, - 0xC7A7: 0xD464, - 0xC7A8: 0xD46D, - 0xC7A9: 0xD46F, - 0xC7AA: 0xD478, - 0xC7AB: 0xD479, - 0xC7AC: 0xD47C, - 0xC7AD: 0xD47F, - 0xC7AE: 0xD480, - 0xC7AF: 0xD482, - 0xC7B0: 0xD488, - 0xC7B1: 0xD489, - 0xC7B2: 0xD48B, - 0xC7B3: 0xD48D, - 0xC7B4: 0xD494, - 0xC7B5: 0xD4A9, - 0xC7B6: 0xD4CC, - 0xC7B7: 0xD4D0, - 0xC7B8: 0xD4D4, - 0xC7B9: 0xD4DC, - 0xC7BA: 0xD4DF, - 0xC7BB: 0xD4E8, - 0xC7BC: 0xD4EC, - 0xC7BD: 0xD4F0, - 0xC7BE: 0xD4F8, - 0xC7BF: 0xD4FB, - 0xC7C0: 0xD4FD, - 0xC7C1: 0xD504, - 0xC7C2: 0xD508, - 0xC7C3: 0xD50C, - 0xC7C4: 0xD514, - 0xC7C5: 0xD515, - 0xC7C6: 0xD517, - 0xC7C7: 0xD53C, - 0xC7C8: 0xD53D, - 0xC7C9: 0xD540, - 0xC7CA: 0xD544, - 0xC7CB: 0xD54C, - 0xC7CC: 0xD54D, - 0xC7CD: 0xD54F, - 0xC7CE: 0xD551, - 0xC7CF: 0xD558, - 0xC7D0: 0xD559, - 0xC7D1: 0xD55C, - 0xC7D2: 0xD560, - 0xC7D3: 0xD565, - 0xC7D4: 0xD568, - 0xC7D5: 0xD569, - 0xC7D6: 0xD56B, - 0xC7D7: 0xD56D, - 0xC7D8: 0xD574, - 0xC7D9: 0xD575, - 0xC7DA: 0xD578, - 0xC7DB: 0xD57C, - 0xC7DC: 0xD584, - 0xC7DD: 0xD585, - 0xC7DE: 0xD587, - 0xC7DF: 0xD588, - 0xC7E0: 0xD589, - 0xC7E1: 0xD590, - 0xC7E2: 0xD5A5, - 0xC7E3: 0xD5C8, - 0xC7E4: 0xD5C9, - 0xC7E5: 0xD5CC, - 0xC7E6: 0xD5D0, - 0xC7E7: 0xD5D2, - 0xC7E8: 0xD5D8, - 0xC7E9: 0xD5D9, - 0xC7EA: 0xD5DB, - 0xC7EB: 0xD5DD, - 0xC7EC: 0xD5E4, - 0xC7ED: 0xD5E5, - 0xC7EE: 0xD5E8, - 0xC7EF: 0xD5EC, - 0xC7F0: 0xD5F4, - 0xC7F1: 0xD5F5, - 0xC7F2: 0xD5F7, - 0xC7F3: 0xD5F9, - 0xC7F4: 0xD600, - 0xC7F5: 0xD601, - 0xC7F6: 0xD604, - 0xC7F7: 0xD608, - 0xC7F8: 0xD610, - 0xC7F9: 0xD611, - 0xC7FA: 0xD613, - 0xC7FB: 0xD614, - 0xC7FC: 0xD615, - 0xC7FD: 0xD61C, - 0xC7FE: 0xD620, - 0xC8A1: 0xD624, - 0xC8A2: 0xD62D, - 0xC8A3: 0xD638, - 0xC8A4: 0xD639, - 0xC8A5: 0xD63C, - 0xC8A6: 0xD640, - 0xC8A7: 0xD645, - 0xC8A8: 0xD648, - 0xC8A9: 0xD649, - 0xC8AA: 0xD64B, - 0xC8AB: 0xD64D, - 0xC8AC: 0xD651, - 0xC8AD: 0xD654, - 0xC8AE: 0xD655, - 0xC8AF: 0xD658, - 0xC8B0: 0xD65C, - 0xC8B1: 0xD667, - 0xC8B2: 0xD669, - 0xC8B3: 0xD670, - 0xC8B4: 0xD671, - 0xC8B5: 0xD674, - 0xC8B6: 0xD683, - 0xC8B7: 0xD685, - 0xC8B8: 0xD68C, - 0xC8B9: 0xD68D, - 0xC8BA: 0xD690, - 0xC8BB: 0xD694, - 0xC8BC: 0xD69D, - 0xC8BD: 0xD69F, - 0xC8BE: 0xD6A1, - 0xC8BF: 0xD6A8, - 0xC8C0: 0xD6AC, - 0xC8C1: 0xD6B0, - 0xC8C2: 0xD6B9, - 0xC8C3: 0xD6BB, - 0xC8C4: 0xD6C4, - 0xC8C5: 0xD6C5, - 0xC8C6: 0xD6C8, - 0xC8C7: 0xD6CC, - 0xC8C8: 0xD6D1, - 0xC8C9: 0xD6D4, - 0xC8CA: 0xD6D7, - 0xC8CB: 0xD6D9, - 0xC8CC: 0xD6E0, - 0xC8CD: 0xD6E4, - 0xC8CE: 0xD6E8, - 0xC8CF: 0xD6F0, - 0xC8D0: 0xD6F5, - 0xC8D1: 0xD6FC, - 0xC8D2: 0xD6FD, - 0xC8D3: 0xD700, - 0xC8D4: 0xD704, - 0xC8D5: 0xD711, - 0xC8D6: 0xD718, - 0xC8D7: 0xD719, - 0xC8D8: 0xD71C, - 0xC8D9: 0xD720, - 0xC8DA: 0xD728, - 0xC8DB: 0xD729, - 0xC8DC: 0xD72B, - 0xC8DD: 0xD72D, - 0xC8DE: 0xD734, - 0xC8DF: 0xD735, - 0xC8E0: 0xD738, - 0xC8E1: 0xD73C, - 0xC8E2: 0xD744, - 0xC8E3: 0xD747, - 0xC8E4: 0xD749, - 0xC8E5: 0xD750, - 0xC8E6: 0xD751, - 0xC8E7: 0xD754, - 0xC8E8: 0xD756, - 0xC8E9: 0xD757, - 0xC8EA: 0xD758, - 0xC8EB: 0xD759, - 0xC8EC: 0xD760, - 0xC8ED: 0xD761, - 0xC8EE: 0xD763, - 0xC8EF: 0xD765, - 0xC8F0: 0xD769, - 0xC8F1: 0xD76C, - 0xC8F2: 0xD770, - 0xC8F3: 0xD774, - 0xC8F4: 0xD77C, - 0xC8F5: 0xD77D, - 0xC8F6: 0xD781, - 0xC8F7: 0xD788, - 0xC8F8: 0xD789, - 0xC8F9: 0xD78C, - 0xC8FA: 0xD790, - 0xC8FB: 0xD798, - 0xC8FC: 0xD799, - 0xC8FD: 0xD79B, - 0xC8FE: 0xD79D, - 0xCAA1: 0x4F3D, - 0xCAA2: 0x4F73, - 0xCAA3: 0x5047, - 0xCAA4: 0x50F9, - 0xCAA5: 0x52A0, - 0xCAA6: 0x53EF, - 0xCAA7: 0x5475, - 0xCAA8: 0x54E5, - 0xCAA9: 0x5609, - 0xCAAA: 0x5AC1, - 0xCAAB: 0x5BB6, - 0xCAAC: 0x6687, - 0xCAAD: 0x67B6, - 0xCAAE: 0x67B7, - 0xCAAF: 0x67EF, - 0xCAB0: 0x6B4C, - 0xCAB1: 0x73C2, - 0xCAB2: 0x75C2, - 0xCAB3: 0x7A3C, - 0xCAB4: 0x82DB, - 0xCAB5: 0x8304, - 0xCAB6: 0x8857, - 0xCAB7: 0x8888, - 0xCAB8: 0x8A36, - 0xCAB9: 0x8CC8, - 0xCABA: 0x8DCF, - 0xCABB: 0x8EFB, - 0xCABC: 0x8FE6, - 0xCABD: 0x99D5, - 0xCABE: 0x523B, - 0xCABF: 0x5374, - 0xCAC0: 0x5404, - 0xCAC1: 0x606A, - 0xCAC2: 0x6164, - 0xCAC3: 0x6BBC, - 0xCAC4: 0x73CF, - 0xCAC5: 0x811A, - 0xCAC6: 0x89BA, - 0xCAC7: 0x89D2, - 0xCAC8: 0x95A3, - 0xCAC9: 0x4F83, - 0xCACA: 0x520A, - 0xCACB: 0x58BE, - 0xCACC: 0x5978, - 0xCACD: 0x59E6, - 0xCACE: 0x5E72, - 0xCACF: 0x5E79, - 0xCAD0: 0x61C7, - 0xCAD1: 0x63C0, - 0xCAD2: 0x6746, - 0xCAD3: 0x67EC, - 0xCAD4: 0x687F, - 0xCAD5: 0x6F97, - 0xCAD6: 0x764E, - 0xCAD7: 0x770B, - 0xCAD8: 0x78F5, - 0xCAD9: 0x7A08, - 0xCADA: 0x7AFF, - 0xCADB: 0x7C21, - 0xCADC: 0x809D, - 0xCADD: 0x826E, - 0xCADE: 0x8271, - 0xCADF: 0x8AEB, - 0xCAE0: 0x9593, - 0xCAE1: 0x4E6B, - 0xCAE2: 0x559D, - 0xCAE3: 0x66F7, - 0xCAE4: 0x6E34, - 0xCAE5: 0x78A3, - 0xCAE6: 0x7AED, - 0xCAE7: 0x845B, - 0xCAE8: 0x8910, - 0xCAE9: 0x874E, - 0xCAEA: 0x97A8, - 0xCAEB: 0x52D8, - 0xCAEC: 0x574E, - 0xCAED: 0x582A, - 0xCAEE: 0x5D4C, - 0xCAEF: 0x611F, - 0xCAF0: 0x61BE, - 0xCAF1: 0x6221, - 0xCAF2: 0x6562, - 0xCAF3: 0x67D1, - 0xCAF4: 0x6A44, - 0xCAF5: 0x6E1B, - 0xCAF6: 0x7518, - 0xCAF7: 0x75B3, - 0xCAF8: 0x76E3, - 0xCAF9: 0x77B0, - 0xCAFA: 0x7D3A, - 0xCAFB: 0x90AF, - 0xCAFC: 0x9451, - 0xCAFD: 0x9452, - 0xCAFE: 0x9F95, - 0xCBA1: 0x5323, - 0xCBA2: 0x5CAC, - 0xCBA3: 0x7532, - 0xCBA4: 0x80DB, - 0xCBA5: 0x9240, - 0xCBA6: 0x9598, - 0xCBA7: 0x525B, - 0xCBA8: 0x5808, - 0xCBA9: 0x59DC, - 0xCBAA: 0x5CA1, - 0xCBAB: 0x5D17, - 0xCBAC: 0x5EB7, - 0xCBAD: 0x5F3A, - 0xCBAE: 0x5F4A, - 0xCBAF: 0x6177, - 0xCBB0: 0x6C5F, - 0xCBB1: 0x757A, - 0xCBB2: 0x7586, - 0xCBB3: 0x7CE0, - 0xCBB4: 0x7D73, - 0xCBB5: 0x7DB1, - 0xCBB6: 0x7F8C, - 0xCBB7: 0x8154, - 0xCBB8: 0x8221, - 0xCBB9: 0x8591, - 0xCBBA: 0x8941, - 0xCBBB: 0x8B1B, - 0xCBBC: 0x92FC, - 0xCBBD: 0x964D, - 0xCBBE: 0x9C47, - 0xCBBF: 0x4ECB, - 0xCBC0: 0x4EF7, - 0xCBC1: 0x500B, - 0xCBC2: 0x51F1, - 0xCBC3: 0x584F, - 0xCBC4: 0x6137, - 0xCBC5: 0x613E, - 0xCBC6: 0x6168, - 0xCBC7: 0x6539, - 0xCBC8: 0x69EA, - 0xCBC9: 0x6F11, - 0xCBCA: 0x75A5, - 0xCBCB: 0x7686, - 0xCBCC: 0x76D6, - 0xCBCD: 0x7B87, - 0xCBCE: 0x82A5, - 0xCBCF: 0x84CB, - 0xCBD0: 0xF900, - 0xCBD1: 0x93A7, - 0xCBD2: 0x958B, - 0xCBD3: 0x5580, - 0xCBD4: 0x5BA2, - 0xCBD5: 0x5751, - 0xCBD6: 0xF901, - 0xCBD7: 0x7CB3, - 0xCBD8: 0x7FB9, - 0xCBD9: 0x91B5, - 0xCBDA: 0x5028, - 0xCBDB: 0x53BB, - 0xCBDC: 0x5C45, - 0xCBDD: 0x5DE8, - 0xCBDE: 0x62D2, - 0xCBDF: 0x636E, - 0xCBE0: 0x64DA, - 0xCBE1: 0x64E7, - 0xCBE2: 0x6E20, - 0xCBE3: 0x70AC, - 0xCBE4: 0x795B, - 0xCBE5: 0x8DDD, - 0xCBE6: 0x8E1E, - 0xCBE7: 0xF902, - 0xCBE8: 0x907D, - 0xCBE9: 0x9245, - 0xCBEA: 0x92F8, - 0xCBEB: 0x4E7E, - 0xCBEC: 0x4EF6, - 0xCBED: 0x5065, - 0xCBEE: 0x5DFE, - 0xCBEF: 0x5EFA, - 0xCBF0: 0x6106, - 0xCBF1: 0x6957, - 0xCBF2: 0x8171, - 0xCBF3: 0x8654, - 0xCBF4: 0x8E47, - 0xCBF5: 0x9375, - 0xCBF6: 0x9A2B, - 0xCBF7: 0x4E5E, - 0xCBF8: 0x5091, - 0xCBF9: 0x6770, - 0xCBFA: 0x6840, - 0xCBFB: 0x5109, - 0xCBFC: 0x528D, - 0xCBFD: 0x5292, - 0xCBFE: 0x6AA2, - 0xCCA1: 0x77BC, - 0xCCA2: 0x9210, - 0xCCA3: 0x9ED4, - 0xCCA4: 0x52AB, - 0xCCA5: 0x602F, - 0xCCA6: 0x8FF2, - 0xCCA7: 0x5048, - 0xCCA8: 0x61A9, - 0xCCA9: 0x63ED, - 0xCCAA: 0x64CA, - 0xCCAB: 0x683C, - 0xCCAC: 0x6A84, - 0xCCAD: 0x6FC0, - 0xCCAE: 0x8188, - 0xCCAF: 0x89A1, - 0xCCB0: 0x9694, - 0xCCB1: 0x5805, - 0xCCB2: 0x727D, - 0xCCB3: 0x72AC, - 0xCCB4: 0x7504, - 0xCCB5: 0x7D79, - 0xCCB6: 0x7E6D, - 0xCCB7: 0x80A9, - 0xCCB8: 0x898B, - 0xCCB9: 0x8B74, - 0xCCBA: 0x9063, - 0xCCBB: 0x9D51, - 0xCCBC: 0x6289, - 0xCCBD: 0x6C7A, - 0xCCBE: 0x6F54, - 0xCCBF: 0x7D50, - 0xCCC0: 0x7F3A, - 0xCCC1: 0x8A23, - 0xCCC2: 0x517C, - 0xCCC3: 0x614A, - 0xCCC4: 0x7B9D, - 0xCCC5: 0x8B19, - 0xCCC6: 0x9257, - 0xCCC7: 0x938C, - 0xCCC8: 0x4EAC, - 0xCCC9: 0x4FD3, - 0xCCCA: 0x501E, - 0xCCCB: 0x50BE, - 0xCCCC: 0x5106, - 0xCCCD: 0x52C1, - 0xCCCE: 0x52CD, - 0xCCCF: 0x537F, - 0xCCD0: 0x5770, - 0xCCD1: 0x5883, - 0xCCD2: 0x5E9A, - 0xCCD3: 0x5F91, - 0xCCD4: 0x6176, - 0xCCD5: 0x61AC, - 0xCCD6: 0x64CE, - 0xCCD7: 0x656C, - 0xCCD8: 0x666F, - 0xCCD9: 0x66BB, - 0xCCDA: 0x66F4, - 0xCCDB: 0x6897, - 0xCCDC: 0x6D87, - 0xCCDD: 0x7085, - 0xCCDE: 0x70F1, - 0xCCDF: 0x749F, - 0xCCE0: 0x74A5, - 0xCCE1: 0x74CA, - 0xCCE2: 0x75D9, - 0xCCE3: 0x786C, - 0xCCE4: 0x78EC, - 0xCCE5: 0x7ADF, - 0xCCE6: 0x7AF6, - 0xCCE7: 0x7D45, - 0xCCE8: 0x7D93, - 0xCCE9: 0x8015, - 0xCCEA: 0x803F, - 0xCCEB: 0x811B, - 0xCCEC: 0x8396, - 0xCCED: 0x8B66, - 0xCCEE: 0x8F15, - 0xCCEF: 0x9015, - 0xCCF0: 0x93E1, - 0xCCF1: 0x9803, - 0xCCF2: 0x9838, - 0xCCF3: 0x9A5A, - 0xCCF4: 0x9BE8, - 0xCCF5: 0x4FC2, - 0xCCF6: 0x5553, - 0xCCF7: 0x583A, - 0xCCF8: 0x5951, - 0xCCF9: 0x5B63, - 0xCCFA: 0x5C46, - 0xCCFB: 0x60B8, - 0xCCFC: 0x6212, - 0xCCFD: 0x6842, - 0xCCFE: 0x68B0, - 0xCDA1: 0x68E8, - 0xCDA2: 0x6EAA, - 0xCDA3: 0x754C, - 0xCDA4: 0x7678, - 0xCDA5: 0x78CE, - 0xCDA6: 0x7A3D, - 0xCDA7: 0x7CFB, - 0xCDA8: 0x7E6B, - 0xCDA9: 0x7E7C, - 0xCDAA: 0x8A08, - 0xCDAB: 0x8AA1, - 0xCDAC: 0x8C3F, - 0xCDAD: 0x968E, - 0xCDAE: 0x9DC4, - 0xCDAF: 0x53E4, - 0xCDB0: 0x53E9, - 0xCDB1: 0x544A, - 0xCDB2: 0x5471, - 0xCDB3: 0x56FA, - 0xCDB4: 0x59D1, - 0xCDB5: 0x5B64, - 0xCDB6: 0x5C3B, - 0xCDB7: 0x5EAB, - 0xCDB8: 0x62F7, - 0xCDB9: 0x6537, - 0xCDBA: 0x6545, - 0xCDBB: 0x6572, - 0xCDBC: 0x66A0, - 0xCDBD: 0x67AF, - 0xCDBE: 0x69C1, - 0xCDBF: 0x6CBD, - 0xCDC0: 0x75FC, - 0xCDC1: 0x7690, - 0xCDC2: 0x777E, - 0xCDC3: 0x7A3F, - 0xCDC4: 0x7F94, - 0xCDC5: 0x8003, - 0xCDC6: 0x80A1, - 0xCDC7: 0x818F, - 0xCDC8: 0x82E6, - 0xCDC9: 0x82FD, - 0xCDCA: 0x83F0, - 0xCDCB: 0x85C1, - 0xCDCC: 0x8831, - 0xCDCD: 0x88B4, - 0xCDCE: 0x8AA5, - 0xCDCF: 0xF903, - 0xCDD0: 0x8F9C, - 0xCDD1: 0x932E, - 0xCDD2: 0x96C7, - 0xCDD3: 0x9867, - 0xCDD4: 0x9AD8, - 0xCDD5: 0x9F13, - 0xCDD6: 0x54ED, - 0xCDD7: 0x659B, - 0xCDD8: 0x66F2, - 0xCDD9: 0x688F, - 0xCDDA: 0x7A40, - 0xCDDB: 0x8C37, - 0xCDDC: 0x9D60, - 0xCDDD: 0x56F0, - 0xCDDE: 0x5764, - 0xCDDF: 0x5D11, - 0xCDE0: 0x6606, - 0xCDE1: 0x68B1, - 0xCDE2: 0x68CD, - 0xCDE3: 0x6EFE, - 0xCDE4: 0x7428, - 0xCDE5: 0x889E, - 0xCDE6: 0x9BE4, - 0xCDE7: 0x6C68, - 0xCDE8: 0xF904, - 0xCDE9: 0x9AA8, - 0xCDEA: 0x4F9B, - 0xCDEB: 0x516C, - 0xCDEC: 0x5171, - 0xCDED: 0x529F, - 0xCDEE: 0x5B54, - 0xCDEF: 0x5DE5, - 0xCDF0: 0x6050, - 0xCDF1: 0x606D, - 0xCDF2: 0x62F1, - 0xCDF3: 0x63A7, - 0xCDF4: 0x653B, - 0xCDF5: 0x73D9, - 0xCDF6: 0x7A7A, - 0xCDF7: 0x86A3, - 0xCDF8: 0x8CA2, - 0xCDF9: 0x978F, - 0xCDFA: 0x4E32, - 0xCDFB: 0x5BE1, - 0xCDFC: 0x6208, - 0xCDFD: 0x679C, - 0xCDFE: 0x74DC, - 0xCEA1: 0x79D1, - 0xCEA2: 0x83D3, - 0xCEA3: 0x8A87, - 0xCEA4: 0x8AB2, - 0xCEA5: 0x8DE8, - 0xCEA6: 0x904E, - 0xCEA7: 0x934B, - 0xCEA8: 0x9846, - 0xCEA9: 0x5ED3, - 0xCEAA: 0x69E8, - 0xCEAB: 0x85FF, - 0xCEAC: 0x90ED, - 0xCEAD: 0xF905, - 0xCEAE: 0x51A0, - 0xCEAF: 0x5B98, - 0xCEB0: 0x5BEC, - 0xCEB1: 0x6163, - 0xCEB2: 0x68FA, - 0xCEB3: 0x6B3E, - 0xCEB4: 0x704C, - 0xCEB5: 0x742F, - 0xCEB6: 0x74D8, - 0xCEB7: 0x7BA1, - 0xCEB8: 0x7F50, - 0xCEB9: 0x83C5, - 0xCEBA: 0x89C0, - 0xCEBB: 0x8CAB, - 0xCEBC: 0x95DC, - 0xCEBD: 0x9928, - 0xCEBE: 0x522E, - 0xCEBF: 0x605D, - 0xCEC0: 0x62EC, - 0xCEC1: 0x9002, - 0xCEC2: 0x4F8A, - 0xCEC3: 0x5149, - 0xCEC4: 0x5321, - 0xCEC5: 0x58D9, - 0xCEC6: 0x5EE3, - 0xCEC7: 0x66E0, - 0xCEC8: 0x6D38, - 0xCEC9: 0x709A, - 0xCECA: 0x72C2, - 0xCECB: 0x73D6, - 0xCECC: 0x7B50, - 0xCECD: 0x80F1, - 0xCECE: 0x945B, - 0xCECF: 0x5366, - 0xCED0: 0x639B, - 0xCED1: 0x7F6B, - 0xCED2: 0x4E56, - 0xCED3: 0x5080, - 0xCED4: 0x584A, - 0xCED5: 0x58DE, - 0xCED6: 0x602A, - 0xCED7: 0x6127, - 0xCED8: 0x62D0, - 0xCED9: 0x69D0, - 0xCEDA: 0x9B41, - 0xCEDB: 0x5B8F, - 0xCEDC: 0x7D18, - 0xCEDD: 0x80B1, - 0xCEDE: 0x8F5F, - 0xCEDF: 0x4EA4, - 0xCEE0: 0x50D1, - 0xCEE1: 0x54AC, - 0xCEE2: 0x55AC, - 0xCEE3: 0x5B0C, - 0xCEE4: 0x5DA0, - 0xCEE5: 0x5DE7, - 0xCEE6: 0x652A, - 0xCEE7: 0x654E, - 0xCEE8: 0x6821, - 0xCEE9: 0x6A4B, - 0xCEEA: 0x72E1, - 0xCEEB: 0x768E, - 0xCEEC: 0x77EF, - 0xCEED: 0x7D5E, - 0xCEEE: 0x7FF9, - 0xCEEF: 0x81A0, - 0xCEF0: 0x854E, - 0xCEF1: 0x86DF, - 0xCEF2: 0x8F03, - 0xCEF3: 0x8F4E, - 0xCEF4: 0x90CA, - 0xCEF5: 0x9903, - 0xCEF6: 0x9A55, - 0xCEF7: 0x9BAB, - 0xCEF8: 0x4E18, - 0xCEF9: 0x4E45, - 0xCEFA: 0x4E5D, - 0xCEFB: 0x4EC7, - 0xCEFC: 0x4FF1, - 0xCEFD: 0x5177, - 0xCEFE: 0x52FE, - 0xCFA1: 0x5340, - 0xCFA2: 0x53E3, - 0xCFA3: 0x53E5, - 0xCFA4: 0x548E, - 0xCFA5: 0x5614, - 0xCFA6: 0x5775, - 0xCFA7: 0x57A2, - 0xCFA8: 0x5BC7, - 0xCFA9: 0x5D87, - 0xCFAA: 0x5ED0, - 0xCFAB: 0x61FC, - 0xCFAC: 0x62D8, - 0xCFAD: 0x6551, - 0xCFAE: 0x67B8, - 0xCFAF: 0x67E9, - 0xCFB0: 0x69CB, - 0xCFB1: 0x6B50, - 0xCFB2: 0x6BC6, - 0xCFB3: 0x6BEC, - 0xCFB4: 0x6C42, - 0xCFB5: 0x6E9D, - 0xCFB6: 0x7078, - 0xCFB7: 0x72D7, - 0xCFB8: 0x7396, - 0xCFB9: 0x7403, - 0xCFBA: 0x77BF, - 0xCFBB: 0x77E9, - 0xCFBC: 0x7A76, - 0xCFBD: 0x7D7F, - 0xCFBE: 0x8009, - 0xCFBF: 0x81FC, - 0xCFC0: 0x8205, - 0xCFC1: 0x820A, - 0xCFC2: 0x82DF, - 0xCFC3: 0x8862, - 0xCFC4: 0x8B33, - 0xCFC5: 0x8CFC, - 0xCFC6: 0x8EC0, - 0xCFC7: 0x9011, - 0xCFC8: 0x90B1, - 0xCFC9: 0x9264, - 0xCFCA: 0x92B6, - 0xCFCB: 0x99D2, - 0xCFCC: 0x9A45, - 0xCFCD: 0x9CE9, - 0xCFCE: 0x9DD7, - 0xCFCF: 0x9F9C, - 0xCFD0: 0x570B, - 0xCFD1: 0x5C40, - 0xCFD2: 0x83CA, - 0xCFD3: 0x97A0, - 0xCFD4: 0x97AB, - 0xCFD5: 0x9EB4, - 0xCFD6: 0x541B, - 0xCFD7: 0x7A98, - 0xCFD8: 0x7FA4, - 0xCFD9: 0x88D9, - 0xCFDA: 0x8ECD, - 0xCFDB: 0x90E1, - 0xCFDC: 0x5800, - 0xCFDD: 0x5C48, - 0xCFDE: 0x6398, - 0xCFDF: 0x7A9F, - 0xCFE0: 0x5BAE, - 0xCFE1: 0x5F13, - 0xCFE2: 0x7A79, - 0xCFE3: 0x7AAE, - 0xCFE4: 0x828E, - 0xCFE5: 0x8EAC, - 0xCFE6: 0x5026, - 0xCFE7: 0x5238, - 0xCFE8: 0x52F8, - 0xCFE9: 0x5377, - 0xCFEA: 0x5708, - 0xCFEB: 0x62F3, - 0xCFEC: 0x6372, - 0xCFED: 0x6B0A, - 0xCFEE: 0x6DC3, - 0xCFEF: 0x7737, - 0xCFF0: 0x53A5, - 0xCFF1: 0x7357, - 0xCFF2: 0x8568, - 0xCFF3: 0x8E76, - 0xCFF4: 0x95D5, - 0xCFF5: 0x673A, - 0xCFF6: 0x6AC3, - 0xCFF7: 0x6F70, - 0xCFF8: 0x8A6D, - 0xCFF9: 0x8ECC, - 0xCFFA: 0x994B, - 0xCFFB: 0xF906, - 0xCFFC: 0x6677, - 0xCFFD: 0x6B78, - 0xCFFE: 0x8CB4, - 0xD0A1: 0x9B3C, - 0xD0A2: 0xF907, - 0xD0A3: 0x53EB, - 0xD0A4: 0x572D, - 0xD0A5: 0x594E, - 0xD0A6: 0x63C6, - 0xD0A7: 0x69FB, - 0xD0A8: 0x73EA, - 0xD0A9: 0x7845, - 0xD0AA: 0x7ABA, - 0xD0AB: 0x7AC5, - 0xD0AC: 0x7CFE, - 0xD0AD: 0x8475, - 0xD0AE: 0x898F, - 0xD0AF: 0x8D73, - 0xD0B0: 0x9035, - 0xD0B1: 0x95A8, - 0xD0B2: 0x52FB, - 0xD0B3: 0x5747, - 0xD0B4: 0x7547, - 0xD0B5: 0x7B60, - 0xD0B6: 0x83CC, - 0xD0B7: 0x921E, - 0xD0B8: 0xF908, - 0xD0B9: 0x6A58, - 0xD0BA: 0x514B, - 0xD0BB: 0x524B, - 0xD0BC: 0x5287, - 0xD0BD: 0x621F, - 0xD0BE: 0x68D8, - 0xD0BF: 0x6975, - 0xD0C0: 0x9699, - 0xD0C1: 0x50C5, - 0xD0C2: 0x52A4, - 0xD0C3: 0x52E4, - 0xD0C4: 0x61C3, - 0xD0C5: 0x65A4, - 0xD0C6: 0x6839, - 0xD0C7: 0x69FF, - 0xD0C8: 0x747E, - 0xD0C9: 0x7B4B, - 0xD0CA: 0x82B9, - 0xD0CB: 0x83EB, - 0xD0CC: 0x89B2, - 0xD0CD: 0x8B39, - 0xD0CE: 0x8FD1, - 0xD0CF: 0x9949, - 0xD0D0: 0xF909, - 0xD0D1: 0x4ECA, - 0xD0D2: 0x5997, - 0xD0D3: 0x64D2, - 0xD0D4: 0x6611, - 0xD0D5: 0x6A8E, - 0xD0D6: 0x7434, - 0xD0D7: 0x7981, - 0xD0D8: 0x79BD, - 0xD0D9: 0x82A9, - 0xD0DA: 0x887E, - 0xD0DB: 0x887F, - 0xD0DC: 0x895F, - 0xD0DD: 0xF90A, - 0xD0DE: 0x9326, - 0xD0DF: 0x4F0B, - 0xD0E0: 0x53CA, - 0xD0E1: 0x6025, - 0xD0E2: 0x6271, - 0xD0E3: 0x6C72, - 0xD0E4: 0x7D1A, - 0xD0E5: 0x7D66, - 0xD0E6: 0x4E98, - 0xD0E7: 0x5162, - 0xD0E8: 0x77DC, - 0xD0E9: 0x80AF, - 0xD0EA: 0x4F01, - 0xD0EB: 0x4F0E, - 0xD0EC: 0x5176, - 0xD0ED: 0x5180, - 0xD0EE: 0x55DC, - 0xD0EF: 0x5668, - 0xD0F0: 0x573B, - 0xD0F1: 0x57FA, - 0xD0F2: 0x57FC, - 0xD0F3: 0x5914, - 0xD0F4: 0x5947, - 0xD0F5: 0x5993, - 0xD0F6: 0x5BC4, - 0xD0F7: 0x5C90, - 0xD0F8: 0x5D0E, - 0xD0F9: 0x5DF1, - 0xD0FA: 0x5E7E, - 0xD0FB: 0x5FCC, - 0xD0FC: 0x6280, - 0xD0FD: 0x65D7, - 0xD0FE: 0x65E3, - 0xD1A1: 0x671E, - 0xD1A2: 0x671F, - 0xD1A3: 0x675E, - 0xD1A4: 0x68CB, - 0xD1A5: 0x68C4, - 0xD1A6: 0x6A5F, - 0xD1A7: 0x6B3A, - 0xD1A8: 0x6C23, - 0xD1A9: 0x6C7D, - 0xD1AA: 0x6C82, - 0xD1AB: 0x6DC7, - 0xD1AC: 0x7398, - 0xD1AD: 0x7426, - 0xD1AE: 0x742A, - 0xD1AF: 0x7482, - 0xD1B0: 0x74A3, - 0xD1B1: 0x7578, - 0xD1B2: 0x757F, - 0xD1B3: 0x7881, - 0xD1B4: 0x78EF, - 0xD1B5: 0x7941, - 0xD1B6: 0x7947, - 0xD1B7: 0x7948, - 0xD1B8: 0x797A, - 0xD1B9: 0x7B95, - 0xD1BA: 0x7D00, - 0xD1BB: 0x7DBA, - 0xD1BC: 0x7F88, - 0xD1BD: 0x8006, - 0xD1BE: 0x802D, - 0xD1BF: 0x808C, - 0xD1C0: 0x8A18, - 0xD1C1: 0x8B4F, - 0xD1C2: 0x8C48, - 0xD1C3: 0x8D77, - 0xD1C4: 0x9321, - 0xD1C5: 0x9324, - 0xD1C6: 0x98E2, - 0xD1C7: 0x9951, - 0xD1C8: 0x9A0E, - 0xD1C9: 0x9A0F, - 0xD1CA: 0x9A65, - 0xD1CB: 0x9E92, - 0xD1CC: 0x7DCA, - 0xD1CD: 0x4F76, - 0xD1CE: 0x5409, - 0xD1CF: 0x62EE, - 0xD1D0: 0x6854, - 0xD1D1: 0x91D1, - 0xD1D2: 0x55AB, - 0xD1D3: 0x513A, - 0xD1D4: 0xF90B, - 0xD1D5: 0xF90C, - 0xD1D6: 0x5A1C, - 0xD1D7: 0x61E6, - 0xD1D8: 0xF90D, - 0xD1D9: 0x62CF, - 0xD1DA: 0x62FF, - 0xD1DB: 0xF90E, - 0xD1DC: 0xF90F, - 0xD1DD: 0xF910, - 0xD1DE: 0xF911, - 0xD1DF: 0xF912, - 0xD1E0: 0xF913, - 0xD1E1: 0x90A3, - 0xD1E2: 0xF914, - 0xD1E3: 0xF915, - 0xD1E4: 0xF916, - 0xD1E5: 0xF917, - 0xD1E6: 0xF918, - 0xD1E7: 0x8AFE, - 0xD1E8: 0xF919, - 0xD1E9: 0xF91A, - 0xD1EA: 0xF91B, - 0xD1EB: 0xF91C, - 0xD1EC: 0x6696, - 0xD1ED: 0xF91D, - 0xD1EE: 0x7156, - 0xD1EF: 0xF91E, - 0xD1F0: 0xF91F, - 0xD1F1: 0x96E3, - 0xD1F2: 0xF920, - 0xD1F3: 0x634F, - 0xD1F4: 0x637A, - 0xD1F5: 0x5357, - 0xD1F6: 0xF921, - 0xD1F7: 0x678F, - 0xD1F8: 0x6960, - 0xD1F9: 0x6E73, - 0xD1FA: 0xF922, - 0xD1FB: 0x7537, - 0xD1FC: 0xF923, - 0xD1FD: 0xF924, - 0xD1FE: 0xF925, - 0xD2A1: 0x7D0D, - 0xD2A2: 0xF926, - 0xD2A3: 0xF927, - 0xD2A4: 0x8872, - 0xD2A5: 0x56CA, - 0xD2A6: 0x5A18, - 0xD2A7: 0xF928, - 0xD2A8: 0xF929, - 0xD2A9: 0xF92A, - 0xD2AA: 0xF92B, - 0xD2AB: 0xF92C, - 0xD2AC: 0x4E43, - 0xD2AD: 0xF92D, - 0xD2AE: 0x5167, - 0xD2AF: 0x5948, - 0xD2B0: 0x67F0, - 0xD2B1: 0x8010, - 0xD2B2: 0xF92E, - 0xD2B3: 0x5973, - 0xD2B4: 0x5E74, - 0xD2B5: 0x649A, - 0xD2B6: 0x79CA, - 0xD2B7: 0x5FF5, - 0xD2B8: 0x606C, - 0xD2B9: 0x62C8, - 0xD2BA: 0x637B, - 0xD2BB: 0x5BE7, - 0xD2BC: 0x5BD7, - 0xD2BD: 0x52AA, - 0xD2BE: 0xF92F, - 0xD2BF: 0x5974, - 0xD2C0: 0x5F29, - 0xD2C1: 0x6012, - 0xD2C2: 0xF930, - 0xD2C3: 0xF931, - 0xD2C4: 0xF932, - 0xD2C5: 0x7459, - 0xD2C6: 0xF933, - 0xD2C7: 0xF934, - 0xD2C8: 0xF935, - 0xD2C9: 0xF936, - 0xD2CA: 0xF937, - 0xD2CB: 0xF938, - 0xD2CC: 0x99D1, - 0xD2CD: 0xF939, - 0xD2CE: 0xF93A, - 0xD2CF: 0xF93B, - 0xD2D0: 0xF93C, - 0xD2D1: 0xF93D, - 0xD2D2: 0xF93E, - 0xD2D3: 0xF93F, - 0xD2D4: 0xF940, - 0xD2D5: 0xF941, - 0xD2D6: 0xF942, - 0xD2D7: 0xF943, - 0xD2D8: 0x6FC3, - 0xD2D9: 0xF944, - 0xD2DA: 0xF945, - 0xD2DB: 0x81BF, - 0xD2DC: 0x8FB2, - 0xD2DD: 0x60F1, - 0xD2DE: 0xF946, - 0xD2DF: 0xF947, - 0xD2E0: 0x8166, - 0xD2E1: 0xF948, - 0xD2E2: 0xF949, - 0xD2E3: 0x5C3F, - 0xD2E4: 0xF94A, - 0xD2E5: 0xF94B, - 0xD2E6: 0xF94C, - 0xD2E7: 0xF94D, - 0xD2E8: 0xF94E, - 0xD2E9: 0xF94F, - 0xD2EA: 0xF950, - 0xD2EB: 0xF951, - 0xD2EC: 0x5AE9, - 0xD2ED: 0x8A25, - 0xD2EE: 0x677B, - 0xD2EF: 0x7D10, - 0xD2F0: 0xF952, - 0xD2F1: 0xF953, - 0xD2F2: 0xF954, - 0xD2F3: 0xF955, - 0xD2F4: 0xF956, - 0xD2F5: 0xF957, - 0xD2F6: 0x80FD, - 0xD2F7: 0xF958, - 0xD2F8: 0xF959, - 0xD2F9: 0x5C3C, - 0xD2FA: 0x6CE5, - 0xD2FB: 0x533F, - 0xD2FC: 0x6EBA, - 0xD2FD: 0x591A, - 0xD2FE: 0x8336, - 0xD3A1: 0x4E39, - 0xD3A2: 0x4EB6, - 0xD3A3: 0x4F46, - 0xD3A4: 0x55AE, - 0xD3A5: 0x5718, - 0xD3A6: 0x58C7, - 0xD3A7: 0x5F56, - 0xD3A8: 0x65B7, - 0xD3A9: 0x65E6, - 0xD3AA: 0x6A80, - 0xD3AB: 0x6BB5, - 0xD3AC: 0x6E4D, - 0xD3AD: 0x77ED, - 0xD3AE: 0x7AEF, - 0xD3AF: 0x7C1E, - 0xD3B0: 0x7DDE, - 0xD3B1: 0x86CB, - 0xD3B2: 0x8892, - 0xD3B3: 0x9132, - 0xD3B4: 0x935B, - 0xD3B5: 0x64BB, - 0xD3B6: 0x6FBE, - 0xD3B7: 0x737A, - 0xD3B8: 0x75B8, - 0xD3B9: 0x9054, - 0xD3BA: 0x5556, - 0xD3BB: 0x574D, - 0xD3BC: 0x61BA, - 0xD3BD: 0x64D4, - 0xD3BE: 0x66C7, - 0xD3BF: 0x6DE1, - 0xD3C0: 0x6E5B, - 0xD3C1: 0x6F6D, - 0xD3C2: 0x6FB9, - 0xD3C3: 0x75F0, - 0xD3C4: 0x8043, - 0xD3C5: 0x81BD, - 0xD3C6: 0x8541, - 0xD3C7: 0x8983, - 0xD3C8: 0x8AC7, - 0xD3C9: 0x8B5A, - 0xD3CA: 0x931F, - 0xD3CB: 0x6C93, - 0xD3CC: 0x7553, - 0xD3CD: 0x7B54, - 0xD3CE: 0x8E0F, - 0xD3CF: 0x905D, - 0xD3D0: 0x5510, - 0xD3D1: 0x5802, - 0xD3D2: 0x5858, - 0xD3D3: 0x5E62, - 0xD3D4: 0x6207, - 0xD3D5: 0x649E, - 0xD3D6: 0x68E0, - 0xD3D7: 0x7576, - 0xD3D8: 0x7CD6, - 0xD3D9: 0x87B3, - 0xD3DA: 0x9EE8, - 0xD3DB: 0x4EE3, - 0xD3DC: 0x5788, - 0xD3DD: 0x576E, - 0xD3DE: 0x5927, - 0xD3DF: 0x5C0D, - 0xD3E0: 0x5CB1, - 0xD3E1: 0x5E36, - 0xD3E2: 0x5F85, - 0xD3E3: 0x6234, - 0xD3E4: 0x64E1, - 0xD3E5: 0x73B3, - 0xD3E6: 0x81FA, - 0xD3E7: 0x888B, - 0xD3E8: 0x8CB8, - 0xD3E9: 0x968A, - 0xD3EA: 0x9EDB, - 0xD3EB: 0x5B85, - 0xD3EC: 0x5FB7, - 0xD3ED: 0x60B3, - 0xD3EE: 0x5012, - 0xD3EF: 0x5200, - 0xD3F0: 0x5230, - 0xD3F1: 0x5716, - 0xD3F2: 0x5835, - 0xD3F3: 0x5857, - 0xD3F4: 0x5C0E, - 0xD3F5: 0x5C60, - 0xD3F6: 0x5CF6, - 0xD3F7: 0x5D8B, - 0xD3F8: 0x5EA6, - 0xD3F9: 0x5F92, - 0xD3FA: 0x60BC, - 0xD3FB: 0x6311, - 0xD3FC: 0x6389, - 0xD3FD: 0x6417, - 0xD3FE: 0x6843, - 0xD4A1: 0x68F9, - 0xD4A2: 0x6AC2, - 0xD4A3: 0x6DD8, - 0xD4A4: 0x6E21, - 0xD4A5: 0x6ED4, - 0xD4A6: 0x6FE4, - 0xD4A7: 0x71FE, - 0xD4A8: 0x76DC, - 0xD4A9: 0x7779, - 0xD4AA: 0x79B1, - 0xD4AB: 0x7A3B, - 0xD4AC: 0x8404, - 0xD4AD: 0x89A9, - 0xD4AE: 0x8CED, - 0xD4AF: 0x8DF3, - 0xD4B0: 0x8E48, - 0xD4B1: 0x9003, - 0xD4B2: 0x9014, - 0xD4B3: 0x9053, - 0xD4B4: 0x90FD, - 0xD4B5: 0x934D, - 0xD4B6: 0x9676, - 0xD4B7: 0x97DC, - 0xD4B8: 0x6BD2, - 0xD4B9: 0x7006, - 0xD4BA: 0x7258, - 0xD4BB: 0x72A2, - 0xD4BC: 0x7368, - 0xD4BD: 0x7763, - 0xD4BE: 0x79BF, - 0xD4BF: 0x7BE4, - 0xD4C0: 0x7E9B, - 0xD4C1: 0x8B80, - 0xD4C2: 0x58A9, - 0xD4C3: 0x60C7, - 0xD4C4: 0x6566, - 0xD4C5: 0x65FD, - 0xD4C6: 0x66BE, - 0xD4C7: 0x6C8C, - 0xD4C8: 0x711E, - 0xD4C9: 0x71C9, - 0xD4CA: 0x8C5A, - 0xD4CB: 0x9813, - 0xD4CC: 0x4E6D, - 0xD4CD: 0x7A81, - 0xD4CE: 0x4EDD, - 0xD4CF: 0x51AC, - 0xD4D0: 0x51CD, - 0xD4D1: 0x52D5, - 0xD4D2: 0x540C, - 0xD4D3: 0x61A7, - 0xD4D4: 0x6771, - 0xD4D5: 0x6850, - 0xD4D6: 0x68DF, - 0xD4D7: 0x6D1E, - 0xD4D8: 0x6F7C, - 0xD4D9: 0x75BC, - 0xD4DA: 0x77B3, - 0xD4DB: 0x7AE5, - 0xD4DC: 0x80F4, - 0xD4DD: 0x8463, - 0xD4DE: 0x9285, - 0xD4DF: 0x515C, - 0xD4E0: 0x6597, - 0xD4E1: 0x675C, - 0xD4E2: 0x6793, - 0xD4E3: 0x75D8, - 0xD4E4: 0x7AC7, - 0xD4E5: 0x8373, - 0xD4E6: 0xF95A, - 0xD4E7: 0x8C46, - 0xD4E8: 0x9017, - 0xD4E9: 0x982D, - 0xD4EA: 0x5C6F, - 0xD4EB: 0x81C0, - 0xD4EC: 0x829A, - 0xD4ED: 0x9041, - 0xD4EE: 0x906F, - 0xD4EF: 0x920D, - 0xD4F0: 0x5F97, - 0xD4F1: 0x5D9D, - 0xD4F2: 0x6A59, - 0xD4F3: 0x71C8, - 0xD4F4: 0x767B, - 0xD4F5: 0x7B49, - 0xD4F6: 0x85E4, - 0xD4F7: 0x8B04, - 0xD4F8: 0x9127, - 0xD4F9: 0x9A30, - 0xD4FA: 0x5587, - 0xD4FB: 0x61F6, - 0xD4FC: 0xF95B, - 0xD4FD: 0x7669, - 0xD4FE: 0x7F85, - 0xD5A1: 0x863F, - 0xD5A2: 0x87BA, - 0xD5A3: 0x88F8, - 0xD5A4: 0x908F, - 0xD5A5: 0xF95C, - 0xD5A6: 0x6D1B, - 0xD5A7: 0x70D9, - 0xD5A8: 0x73DE, - 0xD5A9: 0x7D61, - 0xD5AA: 0x843D, - 0xD5AB: 0xF95D, - 0xD5AC: 0x916A, - 0xD5AD: 0x99F1, - 0xD5AE: 0xF95E, - 0xD5AF: 0x4E82, - 0xD5B0: 0x5375, - 0xD5B1: 0x6B04, - 0xD5B2: 0x6B12, - 0xD5B3: 0x703E, - 0xD5B4: 0x721B, - 0xD5B5: 0x862D, - 0xD5B6: 0x9E1E, - 0xD5B7: 0x524C, - 0xD5B8: 0x8FA3, - 0xD5B9: 0x5D50, - 0xD5BA: 0x64E5, - 0xD5BB: 0x652C, - 0xD5BC: 0x6B16, - 0xD5BD: 0x6FEB, - 0xD5BE: 0x7C43, - 0xD5BF: 0x7E9C, - 0xD5C0: 0x85CD, - 0xD5C1: 0x8964, - 0xD5C2: 0x89BD, - 0xD5C3: 0x62C9, - 0xD5C4: 0x81D8, - 0xD5C5: 0x881F, - 0xD5C6: 0x5ECA, - 0xD5C7: 0x6717, - 0xD5C8: 0x6D6A, - 0xD5C9: 0x72FC, - 0xD5CA: 0x7405, - 0xD5CB: 0x746F, - 0xD5CC: 0x8782, - 0xD5CD: 0x90DE, - 0xD5CE: 0x4F86, - 0xD5CF: 0x5D0D, - 0xD5D0: 0x5FA0, - 0xD5D1: 0x840A, - 0xD5D2: 0x51B7, - 0xD5D3: 0x63A0, - 0xD5D4: 0x7565, - 0xD5D5: 0x4EAE, - 0xD5D6: 0x5006, - 0xD5D7: 0x5169, - 0xD5D8: 0x51C9, - 0xD5D9: 0x6881, - 0xD5DA: 0x6A11, - 0xD5DB: 0x7CAE, - 0xD5DC: 0x7CB1, - 0xD5DD: 0x7CE7, - 0xD5DE: 0x826F, - 0xD5DF: 0x8AD2, - 0xD5E0: 0x8F1B, - 0xD5E1: 0x91CF, - 0xD5E2: 0x4FB6, - 0xD5E3: 0x5137, - 0xD5E4: 0x52F5, - 0xD5E5: 0x5442, - 0xD5E6: 0x5EEC, - 0xD5E7: 0x616E, - 0xD5E8: 0x623E, - 0xD5E9: 0x65C5, - 0xD5EA: 0x6ADA, - 0xD5EB: 0x6FFE, - 0xD5EC: 0x792A, - 0xD5ED: 0x85DC, - 0xD5EE: 0x8823, - 0xD5EF: 0x95AD, - 0xD5F0: 0x9A62, - 0xD5F1: 0x9A6A, - 0xD5F2: 0x9E97, - 0xD5F3: 0x9ECE, - 0xD5F4: 0x529B, - 0xD5F5: 0x66C6, - 0xD5F6: 0x6B77, - 0xD5F7: 0x701D, - 0xD5F8: 0x792B, - 0xD5F9: 0x8F62, - 0xD5FA: 0x9742, - 0xD5FB: 0x6190, - 0xD5FC: 0x6200, - 0xD5FD: 0x6523, - 0xD5FE: 0x6F23, - 0xD6A1: 0x7149, - 0xD6A2: 0x7489, - 0xD6A3: 0x7DF4, - 0xD6A4: 0x806F, - 0xD6A5: 0x84EE, - 0xD6A6: 0x8F26, - 0xD6A7: 0x9023, - 0xD6A8: 0x934A, - 0xD6A9: 0x51BD, - 0xD6AA: 0x5217, - 0xD6AB: 0x52A3, - 0xD6AC: 0x6D0C, - 0xD6AD: 0x70C8, - 0xD6AE: 0x88C2, - 0xD6AF: 0x5EC9, - 0xD6B0: 0x6582, - 0xD6B1: 0x6BAE, - 0xD6B2: 0x6FC2, - 0xD6B3: 0x7C3E, - 0xD6B4: 0x7375, - 0xD6B5: 0x4EE4, - 0xD6B6: 0x4F36, - 0xD6B7: 0x56F9, - 0xD6B8: 0xF95F, - 0xD6B9: 0x5CBA, - 0xD6BA: 0x5DBA, - 0xD6BB: 0x601C, - 0xD6BC: 0x73B2, - 0xD6BD: 0x7B2D, - 0xD6BE: 0x7F9A, - 0xD6BF: 0x7FCE, - 0xD6C0: 0x8046, - 0xD6C1: 0x901E, - 0xD6C2: 0x9234, - 0xD6C3: 0x96F6, - 0xD6C4: 0x9748, - 0xD6C5: 0x9818, - 0xD6C6: 0x9F61, - 0xD6C7: 0x4F8B, - 0xD6C8: 0x6FA7, - 0xD6C9: 0x79AE, - 0xD6CA: 0x91B4, - 0xD6CB: 0x96B7, - 0xD6CC: 0x52DE, - 0xD6CD: 0xF960, - 0xD6CE: 0x6488, - 0xD6CF: 0x64C4, - 0xD6D0: 0x6AD3, - 0xD6D1: 0x6F5E, - 0xD6D2: 0x7018, - 0xD6D3: 0x7210, - 0xD6D4: 0x76E7, - 0xD6D5: 0x8001, - 0xD6D6: 0x8606, - 0xD6D7: 0x865C, - 0xD6D8: 0x8DEF, - 0xD6D9: 0x8F05, - 0xD6DA: 0x9732, - 0xD6DB: 0x9B6F, - 0xD6DC: 0x9DFA, - 0xD6DD: 0x9E75, - 0xD6DE: 0x788C, - 0xD6DF: 0x797F, - 0xD6E0: 0x7DA0, - 0xD6E1: 0x83C9, - 0xD6E2: 0x9304, - 0xD6E3: 0x9E7F, - 0xD6E4: 0x9E93, - 0xD6E5: 0x8AD6, - 0xD6E6: 0x58DF, - 0xD6E7: 0x5F04, - 0xD6E8: 0x6727, - 0xD6E9: 0x7027, - 0xD6EA: 0x74CF, - 0xD6EB: 0x7C60, - 0xD6EC: 0x807E, - 0xD6ED: 0x5121, - 0xD6EE: 0x7028, - 0xD6EF: 0x7262, - 0xD6F0: 0x78CA, - 0xD6F1: 0x8CC2, - 0xD6F2: 0x8CDA, - 0xD6F3: 0x8CF4, - 0xD6F4: 0x96F7, - 0xD6F5: 0x4E86, - 0xD6F6: 0x50DA, - 0xD6F7: 0x5BEE, - 0xD6F8: 0x5ED6, - 0xD6F9: 0x6599, - 0xD6FA: 0x71CE, - 0xD6FB: 0x7642, - 0xD6FC: 0x77AD, - 0xD6FD: 0x804A, - 0xD6FE: 0x84FC, - 0xD7A1: 0x907C, - 0xD7A2: 0x9B27, - 0xD7A3: 0x9F8D, - 0xD7A4: 0x58D8, - 0xD7A5: 0x5A41, - 0xD7A6: 0x5C62, - 0xD7A7: 0x6A13, - 0xD7A8: 0x6DDA, - 0xD7A9: 0x6F0F, - 0xD7AA: 0x763B, - 0xD7AB: 0x7D2F, - 0xD7AC: 0x7E37, - 0xD7AD: 0x851E, - 0xD7AE: 0x8938, - 0xD7AF: 0x93E4, - 0xD7B0: 0x964B, - 0xD7B1: 0x5289, - 0xD7B2: 0x65D2, - 0xD7B3: 0x67F3, - 0xD7B4: 0x69B4, - 0xD7B5: 0x6D41, - 0xD7B6: 0x6E9C, - 0xD7B7: 0x700F, - 0xD7B8: 0x7409, - 0xD7B9: 0x7460, - 0xD7BA: 0x7559, - 0xD7BB: 0x7624, - 0xD7BC: 0x786B, - 0xD7BD: 0x8B2C, - 0xD7BE: 0x985E, - 0xD7BF: 0x516D, - 0xD7C0: 0x622E, - 0xD7C1: 0x9678, - 0xD7C2: 0x4F96, - 0xD7C3: 0x502B, - 0xD7C4: 0x5D19, - 0xD7C5: 0x6DEA, - 0xD7C6: 0x7DB8, - 0xD7C7: 0x8F2A, - 0xD7C8: 0x5F8B, - 0xD7C9: 0x6144, - 0xD7CA: 0x6817, - 0xD7CB: 0xF961, - 0xD7CC: 0x9686, - 0xD7CD: 0x52D2, - 0xD7CE: 0x808B, - 0xD7CF: 0x51DC, - 0xD7D0: 0x51CC, - 0xD7D1: 0x695E, - 0xD7D2: 0x7A1C, - 0xD7D3: 0x7DBE, - 0xD7D4: 0x83F1, - 0xD7D5: 0x9675, - 0xD7D6: 0x4FDA, - 0xD7D7: 0x5229, - 0xD7D8: 0x5398, - 0xD7D9: 0x540F, - 0xD7DA: 0x550E, - 0xD7DB: 0x5C65, - 0xD7DC: 0x60A7, - 0xD7DD: 0x674E, - 0xD7DE: 0x68A8, - 0xD7DF: 0x6D6C, - 0xD7E0: 0x7281, - 0xD7E1: 0x72F8, - 0xD7E2: 0x7406, - 0xD7E3: 0x7483, - 0xD7E4: 0xF962, - 0xD7E5: 0x75E2, - 0xD7E6: 0x7C6C, - 0xD7E7: 0x7F79, - 0xD7E8: 0x7FB8, - 0xD7E9: 0x8389, - 0xD7EA: 0x88CF, - 0xD7EB: 0x88E1, - 0xD7EC: 0x91CC, - 0xD7ED: 0x91D0, - 0xD7EE: 0x96E2, - 0xD7EF: 0x9BC9, - 0xD7F0: 0x541D, - 0xD7F1: 0x6F7E, - 0xD7F2: 0x71D0, - 0xD7F3: 0x7498, - 0xD7F4: 0x85FA, - 0xD7F5: 0x8EAA, - 0xD7F6: 0x96A3, - 0xD7F7: 0x9C57, - 0xD7F8: 0x9E9F, - 0xD7F9: 0x6797, - 0xD7FA: 0x6DCB, - 0xD7FB: 0x7433, - 0xD7FC: 0x81E8, - 0xD7FD: 0x9716, - 0xD7FE: 0x782C, - 0xD8A1: 0x7ACB, - 0xD8A2: 0x7B20, - 0xD8A3: 0x7C92, - 0xD8A4: 0x6469, - 0xD8A5: 0x746A, - 0xD8A6: 0x75F2, - 0xD8A7: 0x78BC, - 0xD8A8: 0x78E8, - 0xD8A9: 0x99AC, - 0xD8AA: 0x9B54, - 0xD8AB: 0x9EBB, - 0xD8AC: 0x5BDE, - 0xD8AD: 0x5E55, - 0xD8AE: 0x6F20, - 0xD8AF: 0x819C, - 0xD8B0: 0x83AB, - 0xD8B1: 0x9088, - 0xD8B2: 0x4E07, - 0xD8B3: 0x534D, - 0xD8B4: 0x5A29, - 0xD8B5: 0x5DD2, - 0xD8B6: 0x5F4E, - 0xD8B7: 0x6162, - 0xD8B8: 0x633D, - 0xD8B9: 0x6669, - 0xD8BA: 0x66FC, - 0xD8BB: 0x6EFF, - 0xD8BC: 0x6F2B, - 0xD8BD: 0x7063, - 0xD8BE: 0x779E, - 0xD8BF: 0x842C, - 0xD8C0: 0x8513, - 0xD8C1: 0x883B, - 0xD8C2: 0x8F13, - 0xD8C3: 0x9945, - 0xD8C4: 0x9C3B, - 0xD8C5: 0x551C, - 0xD8C6: 0x62B9, - 0xD8C7: 0x672B, - 0xD8C8: 0x6CAB, - 0xD8C9: 0x8309, - 0xD8CA: 0x896A, - 0xD8CB: 0x977A, - 0xD8CC: 0x4EA1, - 0xD8CD: 0x5984, - 0xD8CE: 0x5FD8, - 0xD8CF: 0x5FD9, - 0xD8D0: 0x671B, - 0xD8D1: 0x7DB2, - 0xD8D2: 0x7F54, - 0xD8D3: 0x8292, - 0xD8D4: 0x832B, - 0xD8D5: 0x83BD, - 0xD8D6: 0x8F1E, - 0xD8D7: 0x9099, - 0xD8D8: 0x57CB, - 0xD8D9: 0x59B9, - 0xD8DA: 0x5A92, - 0xD8DB: 0x5BD0, - 0xD8DC: 0x6627, - 0xD8DD: 0x679A, - 0xD8DE: 0x6885, - 0xD8DF: 0x6BCF, - 0xD8E0: 0x7164, - 0xD8E1: 0x7F75, - 0xD8E2: 0x8CB7, - 0xD8E3: 0x8CE3, - 0xD8E4: 0x9081, - 0xD8E5: 0x9B45, - 0xD8E6: 0x8108, - 0xD8E7: 0x8C8A, - 0xD8E8: 0x964C, - 0xD8E9: 0x9A40, - 0xD8EA: 0x9EA5, - 0xD8EB: 0x5B5F, - 0xD8EC: 0x6C13, - 0xD8ED: 0x731B, - 0xD8EE: 0x76F2, - 0xD8EF: 0x76DF, - 0xD8F0: 0x840C, - 0xD8F1: 0x51AA, - 0xD8F2: 0x8993, - 0xD8F3: 0x514D, - 0xD8F4: 0x5195, - 0xD8F5: 0x52C9, - 0xD8F6: 0x68C9, - 0xD8F7: 0x6C94, - 0xD8F8: 0x7704, - 0xD8F9: 0x7720, - 0xD8FA: 0x7DBF, - 0xD8FB: 0x7DEC, - 0xD8FC: 0x9762, - 0xD8FD: 0x9EB5, - 0xD8FE: 0x6EC5, - 0xD9A1: 0x8511, - 0xD9A2: 0x51A5, - 0xD9A3: 0x540D, - 0xD9A4: 0x547D, - 0xD9A5: 0x660E, - 0xD9A6: 0x669D, - 0xD9A7: 0x6927, - 0xD9A8: 0x6E9F, - 0xD9A9: 0x76BF, - 0xD9AA: 0x7791, - 0xD9AB: 0x8317, - 0xD9AC: 0x84C2, - 0xD9AD: 0x879F, - 0xD9AE: 0x9169, - 0xD9AF: 0x9298, - 0xD9B0: 0x9CF4, - 0xD9B1: 0x8882, - 0xD9B2: 0x4FAE, - 0xD9B3: 0x5192, - 0xD9B4: 0x52DF, - 0xD9B5: 0x59C6, - 0xD9B6: 0x5E3D, - 0xD9B7: 0x6155, - 0xD9B8: 0x6478, - 0xD9B9: 0x6479, - 0xD9BA: 0x66AE, - 0xD9BB: 0x67D0, - 0xD9BC: 0x6A21, - 0xD9BD: 0x6BCD, - 0xD9BE: 0x6BDB, - 0xD9BF: 0x725F, - 0xD9C0: 0x7261, - 0xD9C1: 0x7441, - 0xD9C2: 0x7738, - 0xD9C3: 0x77DB, - 0xD9C4: 0x8017, - 0xD9C5: 0x82BC, - 0xD9C6: 0x8305, - 0xD9C7: 0x8B00, - 0xD9C8: 0x8B28, - 0xD9C9: 0x8C8C, - 0xD9CA: 0x6728, - 0xD9CB: 0x6C90, - 0xD9CC: 0x7267, - 0xD9CD: 0x76EE, - 0xD9CE: 0x7766, - 0xD9CF: 0x7A46, - 0xD9D0: 0x9DA9, - 0xD9D1: 0x6B7F, - 0xD9D2: 0x6C92, - 0xD9D3: 0x5922, - 0xD9D4: 0x6726, - 0xD9D5: 0x8499, - 0xD9D6: 0x536F, - 0xD9D7: 0x5893, - 0xD9D8: 0x5999, - 0xD9D9: 0x5EDF, - 0xD9DA: 0x63CF, - 0xD9DB: 0x6634, - 0xD9DC: 0x6773, - 0xD9DD: 0x6E3A, - 0xD9DE: 0x732B, - 0xD9DF: 0x7AD7, - 0xD9E0: 0x82D7, - 0xD9E1: 0x9328, - 0xD9E2: 0x52D9, - 0xD9E3: 0x5DEB, - 0xD9E4: 0x61AE, - 0xD9E5: 0x61CB, - 0xD9E6: 0x620A, - 0xD9E7: 0x62C7, - 0xD9E8: 0x64AB, - 0xD9E9: 0x65E0, - 0xD9EA: 0x6959, - 0xD9EB: 0x6B66, - 0xD9EC: 0x6BCB, - 0xD9ED: 0x7121, - 0xD9EE: 0x73F7, - 0xD9EF: 0x755D, - 0xD9F0: 0x7E46, - 0xD9F1: 0x821E, - 0xD9F2: 0x8302, - 0xD9F3: 0x856A, - 0xD9F4: 0x8AA3, - 0xD9F5: 0x8CBF, - 0xD9F6: 0x9727, - 0xD9F7: 0x9D61, - 0xD9F8: 0x58A8, - 0xD9F9: 0x9ED8, - 0xD9FA: 0x5011, - 0xD9FB: 0x520E, - 0xD9FC: 0x543B, - 0xD9FD: 0x554F, - 0xD9FE: 0x6587, - 0xDAA1: 0x6C76, - 0xDAA2: 0x7D0A, - 0xDAA3: 0x7D0B, - 0xDAA4: 0x805E, - 0xDAA5: 0x868A, - 0xDAA6: 0x9580, - 0xDAA7: 0x96EF, - 0xDAA8: 0x52FF, - 0xDAA9: 0x6C95, - 0xDAAA: 0x7269, - 0xDAAB: 0x5473, - 0xDAAC: 0x5A9A, - 0xDAAD: 0x5C3E, - 0xDAAE: 0x5D4B, - 0xDAAF: 0x5F4C, - 0xDAB0: 0x5FAE, - 0xDAB1: 0x672A, - 0xDAB2: 0x68B6, - 0xDAB3: 0x6963, - 0xDAB4: 0x6E3C, - 0xDAB5: 0x6E44, - 0xDAB6: 0x7709, - 0xDAB7: 0x7C73, - 0xDAB8: 0x7F8E, - 0xDAB9: 0x8587, - 0xDABA: 0x8B0E, - 0xDABB: 0x8FF7, - 0xDABC: 0x9761, - 0xDABD: 0x9EF4, - 0xDABE: 0x5CB7, - 0xDABF: 0x60B6, - 0xDAC0: 0x610D, - 0xDAC1: 0x61AB, - 0xDAC2: 0x654F, - 0xDAC3: 0x65FB, - 0xDAC4: 0x65FC, - 0xDAC5: 0x6C11, - 0xDAC6: 0x6CEF, - 0xDAC7: 0x739F, - 0xDAC8: 0x73C9, - 0xDAC9: 0x7DE1, - 0xDACA: 0x9594, - 0xDACB: 0x5BC6, - 0xDACC: 0x871C, - 0xDACD: 0x8B10, - 0xDACE: 0x525D, - 0xDACF: 0x535A, - 0xDAD0: 0x62CD, - 0xDAD1: 0x640F, - 0xDAD2: 0x64B2, - 0xDAD3: 0x6734, - 0xDAD4: 0x6A38, - 0xDAD5: 0x6CCA, - 0xDAD6: 0x73C0, - 0xDAD7: 0x749E, - 0xDAD8: 0x7B94, - 0xDAD9: 0x7C95, - 0xDADA: 0x7E1B, - 0xDADB: 0x818A, - 0xDADC: 0x8236, - 0xDADD: 0x8584, - 0xDADE: 0x8FEB, - 0xDADF: 0x96F9, - 0xDAE0: 0x99C1, - 0xDAE1: 0x4F34, - 0xDAE2: 0x534A, - 0xDAE3: 0x53CD, - 0xDAE4: 0x53DB, - 0xDAE5: 0x62CC, - 0xDAE6: 0x642C, - 0xDAE7: 0x6500, - 0xDAE8: 0x6591, - 0xDAE9: 0x69C3, - 0xDAEA: 0x6CEE, - 0xDAEB: 0x6F58, - 0xDAEC: 0x73ED, - 0xDAED: 0x7554, - 0xDAEE: 0x7622, - 0xDAEF: 0x76E4, - 0xDAF0: 0x76FC, - 0xDAF1: 0x78D0, - 0xDAF2: 0x78FB, - 0xDAF3: 0x792C, - 0xDAF4: 0x7D46, - 0xDAF5: 0x822C, - 0xDAF6: 0x87E0, - 0xDAF7: 0x8FD4, - 0xDAF8: 0x9812, - 0xDAF9: 0x98EF, - 0xDAFA: 0x52C3, - 0xDAFB: 0x62D4, - 0xDAFC: 0x64A5, - 0xDAFD: 0x6E24, - 0xDAFE: 0x6F51, - 0xDBA1: 0x767C, - 0xDBA2: 0x8DCB, - 0xDBA3: 0x91B1, - 0xDBA4: 0x9262, - 0xDBA5: 0x9AEE, - 0xDBA6: 0x9B43, - 0xDBA7: 0x5023, - 0xDBA8: 0x508D, - 0xDBA9: 0x574A, - 0xDBAA: 0x59A8, - 0xDBAB: 0x5C28, - 0xDBAC: 0x5E47, - 0xDBAD: 0x5F77, - 0xDBAE: 0x623F, - 0xDBAF: 0x653E, - 0xDBB0: 0x65B9, - 0xDBB1: 0x65C1, - 0xDBB2: 0x6609, - 0xDBB3: 0x678B, - 0xDBB4: 0x699C, - 0xDBB5: 0x6EC2, - 0xDBB6: 0x78C5, - 0xDBB7: 0x7D21, - 0xDBB8: 0x80AA, - 0xDBB9: 0x8180, - 0xDBBA: 0x822B, - 0xDBBB: 0x82B3, - 0xDBBC: 0x84A1, - 0xDBBD: 0x868C, - 0xDBBE: 0x8A2A, - 0xDBBF: 0x8B17, - 0xDBC0: 0x90A6, - 0xDBC1: 0x9632, - 0xDBC2: 0x9F90, - 0xDBC3: 0x500D, - 0xDBC4: 0x4FF3, - 0xDBC5: 0xF963, - 0xDBC6: 0x57F9, - 0xDBC7: 0x5F98, - 0xDBC8: 0x62DC, - 0xDBC9: 0x6392, - 0xDBCA: 0x676F, - 0xDBCB: 0x6E43, - 0xDBCC: 0x7119, - 0xDBCD: 0x76C3, - 0xDBCE: 0x80CC, - 0xDBCF: 0x80DA, - 0xDBD0: 0x88F4, - 0xDBD1: 0x88F5, - 0xDBD2: 0x8919, - 0xDBD3: 0x8CE0, - 0xDBD4: 0x8F29, - 0xDBD5: 0x914D, - 0xDBD6: 0x966A, - 0xDBD7: 0x4F2F, - 0xDBD8: 0x4F70, - 0xDBD9: 0x5E1B, - 0xDBDA: 0x67CF, - 0xDBDB: 0x6822, - 0xDBDC: 0x767D, - 0xDBDD: 0x767E, - 0xDBDE: 0x9B44, - 0xDBDF: 0x5E61, - 0xDBE0: 0x6A0A, - 0xDBE1: 0x7169, - 0xDBE2: 0x71D4, - 0xDBE3: 0x756A, - 0xDBE4: 0xF964, - 0xDBE5: 0x7E41, - 0xDBE6: 0x8543, - 0xDBE7: 0x85E9, - 0xDBE8: 0x98DC, - 0xDBE9: 0x4F10, - 0xDBEA: 0x7B4F, - 0xDBEB: 0x7F70, - 0xDBEC: 0x95A5, - 0xDBED: 0x51E1, - 0xDBEE: 0x5E06, - 0xDBEF: 0x68B5, - 0xDBF0: 0x6C3E, - 0xDBF1: 0x6C4E, - 0xDBF2: 0x6CDB, - 0xDBF3: 0x72AF, - 0xDBF4: 0x7BC4, - 0xDBF5: 0x8303, - 0xDBF6: 0x6CD5, - 0xDBF7: 0x743A, - 0xDBF8: 0x50FB, - 0xDBF9: 0x5288, - 0xDBFA: 0x58C1, - 0xDBFB: 0x64D8, - 0xDBFC: 0x6A97, - 0xDBFD: 0x74A7, - 0xDBFE: 0x7656, - 0xDCA1: 0x78A7, - 0xDCA2: 0x8617, - 0xDCA3: 0x95E2, - 0xDCA4: 0x9739, - 0xDCA5: 0xF965, - 0xDCA6: 0x535E, - 0xDCA7: 0x5F01, - 0xDCA8: 0x8B8A, - 0xDCA9: 0x8FA8, - 0xDCAA: 0x8FAF, - 0xDCAB: 0x908A, - 0xDCAC: 0x5225, - 0xDCAD: 0x77A5, - 0xDCAE: 0x9C49, - 0xDCAF: 0x9F08, - 0xDCB0: 0x4E19, - 0xDCB1: 0x5002, - 0xDCB2: 0x5175, - 0xDCB3: 0x5C5B, - 0xDCB4: 0x5E77, - 0xDCB5: 0x661E, - 0xDCB6: 0x663A, - 0xDCB7: 0x67C4, - 0xDCB8: 0x68C5, - 0xDCB9: 0x70B3, - 0xDCBA: 0x7501, - 0xDCBB: 0x75C5, - 0xDCBC: 0x79C9, - 0xDCBD: 0x7ADD, - 0xDCBE: 0x8F27, - 0xDCBF: 0x9920, - 0xDCC0: 0x9A08, - 0xDCC1: 0x4FDD, - 0xDCC2: 0x5821, - 0xDCC3: 0x5831, - 0xDCC4: 0x5BF6, - 0xDCC5: 0x666E, - 0xDCC6: 0x6B65, - 0xDCC7: 0x6D11, - 0xDCC8: 0x6E7A, - 0xDCC9: 0x6F7D, - 0xDCCA: 0x73E4, - 0xDCCB: 0x752B, - 0xDCCC: 0x83E9, - 0xDCCD: 0x88DC, - 0xDCCE: 0x8913, - 0xDCCF: 0x8B5C, - 0xDCD0: 0x8F14, - 0xDCD1: 0x4F0F, - 0xDCD2: 0x50D5, - 0xDCD3: 0x5310, - 0xDCD4: 0x535C, - 0xDCD5: 0x5B93, - 0xDCD6: 0x5FA9, - 0xDCD7: 0x670D, - 0xDCD8: 0x798F, - 0xDCD9: 0x8179, - 0xDCDA: 0x832F, - 0xDCDB: 0x8514, - 0xDCDC: 0x8907, - 0xDCDD: 0x8986, - 0xDCDE: 0x8F39, - 0xDCDF: 0x8F3B, - 0xDCE0: 0x99A5, - 0xDCE1: 0x9C12, - 0xDCE2: 0x672C, - 0xDCE3: 0x4E76, - 0xDCE4: 0x4FF8, - 0xDCE5: 0x5949, - 0xDCE6: 0x5C01, - 0xDCE7: 0x5CEF, - 0xDCE8: 0x5CF0, - 0xDCE9: 0x6367, - 0xDCEA: 0x68D2, - 0xDCEB: 0x70FD, - 0xDCEC: 0x71A2, - 0xDCED: 0x742B, - 0xDCEE: 0x7E2B, - 0xDCEF: 0x84EC, - 0xDCF0: 0x8702, - 0xDCF1: 0x9022, - 0xDCF2: 0x92D2, - 0xDCF3: 0x9CF3, - 0xDCF4: 0x4E0D, - 0xDCF5: 0x4ED8, - 0xDCF6: 0x4FEF, - 0xDCF7: 0x5085, - 0xDCF8: 0x5256, - 0xDCF9: 0x526F, - 0xDCFA: 0x5426, - 0xDCFB: 0x5490, - 0xDCFC: 0x57E0, - 0xDCFD: 0x592B, - 0xDCFE: 0x5A66, - 0xDDA1: 0x5B5A, - 0xDDA2: 0x5B75, - 0xDDA3: 0x5BCC, - 0xDDA4: 0x5E9C, - 0xDDA5: 0xF966, - 0xDDA6: 0x6276, - 0xDDA7: 0x6577, - 0xDDA8: 0x65A7, - 0xDDA9: 0x6D6E, - 0xDDAA: 0x6EA5, - 0xDDAB: 0x7236, - 0xDDAC: 0x7B26, - 0xDDAD: 0x7C3F, - 0xDDAE: 0x7F36, - 0xDDAF: 0x8150, - 0xDDB0: 0x8151, - 0xDDB1: 0x819A, - 0xDDB2: 0x8240, - 0xDDB3: 0x8299, - 0xDDB4: 0x83A9, - 0xDDB5: 0x8A03, - 0xDDB6: 0x8CA0, - 0xDDB7: 0x8CE6, - 0xDDB8: 0x8CFB, - 0xDDB9: 0x8D74, - 0xDDBA: 0x8DBA, - 0xDDBB: 0x90E8, - 0xDDBC: 0x91DC, - 0xDDBD: 0x961C, - 0xDDBE: 0x9644, - 0xDDBF: 0x99D9, - 0xDDC0: 0x9CE7, - 0xDDC1: 0x5317, - 0xDDC2: 0x5206, - 0xDDC3: 0x5429, - 0xDDC4: 0x5674, - 0xDDC5: 0x58B3, - 0xDDC6: 0x5954, - 0xDDC7: 0x596E, - 0xDDC8: 0x5FFF, - 0xDDC9: 0x61A4, - 0xDDCA: 0x626E, - 0xDDCB: 0x6610, - 0xDDCC: 0x6C7E, - 0xDDCD: 0x711A, - 0xDDCE: 0x76C6, - 0xDDCF: 0x7C89, - 0xDDD0: 0x7CDE, - 0xDDD1: 0x7D1B, - 0xDDD2: 0x82AC, - 0xDDD3: 0x8CC1, - 0xDDD4: 0x96F0, - 0xDDD5: 0xF967, - 0xDDD6: 0x4F5B, - 0xDDD7: 0x5F17, - 0xDDD8: 0x5F7F, - 0xDDD9: 0x62C2, - 0xDDDA: 0x5D29, - 0xDDDB: 0x670B, - 0xDDDC: 0x68DA, - 0xDDDD: 0x787C, - 0xDDDE: 0x7E43, - 0xDDDF: 0x9D6C, - 0xDDE0: 0x4E15, - 0xDDE1: 0x5099, - 0xDDE2: 0x5315, - 0xDDE3: 0x532A, - 0xDDE4: 0x5351, - 0xDDE5: 0x5983, - 0xDDE6: 0x5A62, - 0xDDE7: 0x5E87, - 0xDDE8: 0x60B2, - 0xDDE9: 0x618A, - 0xDDEA: 0x6249, - 0xDDEB: 0x6279, - 0xDDEC: 0x6590, - 0xDDED: 0x6787, - 0xDDEE: 0x69A7, - 0xDDEF: 0x6BD4, - 0xDDF0: 0x6BD6, - 0xDDF1: 0x6BD7, - 0xDDF2: 0x6BD8, - 0xDDF3: 0x6CB8, - 0xDDF4: 0xF968, - 0xDDF5: 0x7435, - 0xDDF6: 0x75FA, - 0xDDF7: 0x7812, - 0xDDF8: 0x7891, - 0xDDF9: 0x79D5, - 0xDDFA: 0x79D8, - 0xDDFB: 0x7C83, - 0xDDFC: 0x7DCB, - 0xDDFD: 0x7FE1, - 0xDDFE: 0x80A5, - 0xDEA1: 0x813E, - 0xDEA2: 0x81C2, - 0xDEA3: 0x83F2, - 0xDEA4: 0x871A, - 0xDEA5: 0x88E8, - 0xDEA6: 0x8AB9, - 0xDEA7: 0x8B6C, - 0xDEA8: 0x8CBB, - 0xDEA9: 0x9119, - 0xDEAA: 0x975E, - 0xDEAB: 0x98DB, - 0xDEAC: 0x9F3B, - 0xDEAD: 0x56AC, - 0xDEAE: 0x5B2A, - 0xDEAF: 0x5F6C, - 0xDEB0: 0x658C, - 0xDEB1: 0x6AB3, - 0xDEB2: 0x6BAF, - 0xDEB3: 0x6D5C, - 0xDEB4: 0x6FF1, - 0xDEB5: 0x7015, - 0xDEB6: 0x725D, - 0xDEB7: 0x73AD, - 0xDEB8: 0x8CA7, - 0xDEB9: 0x8CD3, - 0xDEBA: 0x983B, - 0xDEBB: 0x6191, - 0xDEBC: 0x6C37, - 0xDEBD: 0x8058, - 0xDEBE: 0x9A01, - 0xDEBF: 0x4E4D, - 0xDEC0: 0x4E8B, - 0xDEC1: 0x4E9B, - 0xDEC2: 0x4ED5, - 0xDEC3: 0x4F3A, - 0xDEC4: 0x4F3C, - 0xDEC5: 0x4F7F, - 0xDEC6: 0x4FDF, - 0xDEC7: 0x50FF, - 0xDEC8: 0x53F2, - 0xDEC9: 0x53F8, - 0xDECA: 0x5506, - 0xDECB: 0x55E3, - 0xDECC: 0x56DB, - 0xDECD: 0x58EB, - 0xDECE: 0x5962, - 0xDECF: 0x5A11, - 0xDED0: 0x5BEB, - 0xDED1: 0x5BFA, - 0xDED2: 0x5C04, - 0xDED3: 0x5DF3, - 0xDED4: 0x5E2B, - 0xDED5: 0x5F99, - 0xDED6: 0x601D, - 0xDED7: 0x6368, - 0xDED8: 0x659C, - 0xDED9: 0x65AF, - 0xDEDA: 0x67F6, - 0xDEDB: 0x67FB, - 0xDEDC: 0x68AD, - 0xDEDD: 0x6B7B, - 0xDEDE: 0x6C99, - 0xDEDF: 0x6CD7, - 0xDEE0: 0x6E23, - 0xDEE1: 0x7009, - 0xDEE2: 0x7345, - 0xDEE3: 0x7802, - 0xDEE4: 0x793E, - 0xDEE5: 0x7940, - 0xDEE6: 0x7960, - 0xDEE7: 0x79C1, - 0xDEE8: 0x7BE9, - 0xDEE9: 0x7D17, - 0xDEEA: 0x7D72, - 0xDEEB: 0x8086, - 0xDEEC: 0x820D, - 0xDEED: 0x838E, - 0xDEEE: 0x84D1, - 0xDEEF: 0x86C7, - 0xDEF0: 0x88DF, - 0xDEF1: 0x8A50, - 0xDEF2: 0x8A5E, - 0xDEF3: 0x8B1D, - 0xDEF4: 0x8CDC, - 0xDEF5: 0x8D66, - 0xDEF6: 0x8FAD, - 0xDEF7: 0x90AA, - 0xDEF8: 0x98FC, - 0xDEF9: 0x99DF, - 0xDEFA: 0x9E9D, - 0xDEFB: 0x524A, - 0xDEFC: 0xF969, - 0xDEFD: 0x6714, - 0xDEFE: 0xF96A, - 0xDFA1: 0x5098, - 0xDFA2: 0x522A, - 0xDFA3: 0x5C71, - 0xDFA4: 0x6563, - 0xDFA5: 0x6C55, - 0xDFA6: 0x73CA, - 0xDFA7: 0x7523, - 0xDFA8: 0x759D, - 0xDFA9: 0x7B97, - 0xDFAA: 0x849C, - 0xDFAB: 0x9178, - 0xDFAC: 0x9730, - 0xDFAD: 0x4E77, - 0xDFAE: 0x6492, - 0xDFAF: 0x6BBA, - 0xDFB0: 0x715E, - 0xDFB1: 0x85A9, - 0xDFB2: 0x4E09, - 0xDFB3: 0xF96B, - 0xDFB4: 0x6749, - 0xDFB5: 0x68EE, - 0xDFB6: 0x6E17, - 0xDFB7: 0x829F, - 0xDFB8: 0x8518, - 0xDFB9: 0x886B, - 0xDFBA: 0x63F7, - 0xDFBB: 0x6F81, - 0xDFBC: 0x9212, - 0xDFBD: 0x98AF, - 0xDFBE: 0x4E0A, - 0xDFBF: 0x50B7, - 0xDFC0: 0x50CF, - 0xDFC1: 0x511F, - 0xDFC2: 0x5546, - 0xDFC3: 0x55AA, - 0xDFC4: 0x5617, - 0xDFC5: 0x5B40, - 0xDFC6: 0x5C19, - 0xDFC7: 0x5CE0, - 0xDFC8: 0x5E38, - 0xDFC9: 0x5E8A, - 0xDFCA: 0x5EA0, - 0xDFCB: 0x5EC2, - 0xDFCC: 0x60F3, - 0xDFCD: 0x6851, - 0xDFCE: 0x6A61, - 0xDFCF: 0x6E58, - 0xDFD0: 0x723D, - 0xDFD1: 0x7240, - 0xDFD2: 0x72C0, - 0xDFD3: 0x76F8, - 0xDFD4: 0x7965, - 0xDFD5: 0x7BB1, - 0xDFD6: 0x7FD4, - 0xDFD7: 0x88F3, - 0xDFD8: 0x89F4, - 0xDFD9: 0x8A73, - 0xDFDA: 0x8C61, - 0xDFDB: 0x8CDE, - 0xDFDC: 0x971C, - 0xDFDD: 0x585E, - 0xDFDE: 0x74BD, - 0xDFDF: 0x8CFD, - 0xDFE0: 0x55C7, - 0xDFE1: 0xF96C, - 0xDFE2: 0x7A61, - 0xDFE3: 0x7D22, - 0xDFE4: 0x8272, - 0xDFE5: 0x7272, - 0xDFE6: 0x751F, - 0xDFE7: 0x7525, - 0xDFE8: 0xF96D, - 0xDFE9: 0x7B19, - 0xDFEA: 0x5885, - 0xDFEB: 0x58FB, - 0xDFEC: 0x5DBC, - 0xDFED: 0x5E8F, - 0xDFEE: 0x5EB6, - 0xDFEF: 0x5F90, - 0xDFF0: 0x6055, - 0xDFF1: 0x6292, - 0xDFF2: 0x637F, - 0xDFF3: 0x654D, - 0xDFF4: 0x6691, - 0xDFF5: 0x66D9, - 0xDFF6: 0x66F8, - 0xDFF7: 0x6816, - 0xDFF8: 0x68F2, - 0xDFF9: 0x7280, - 0xDFFA: 0x745E, - 0xDFFB: 0x7B6E, - 0xDFFC: 0x7D6E, - 0xDFFD: 0x7DD6, - 0xDFFE: 0x7F72, - 0xE0A1: 0x80E5, - 0xE0A2: 0x8212, - 0xE0A3: 0x85AF, - 0xE0A4: 0x897F, - 0xE0A5: 0x8A93, - 0xE0A6: 0x901D, - 0xE0A7: 0x92E4, - 0xE0A8: 0x9ECD, - 0xE0A9: 0x9F20, - 0xE0AA: 0x5915, - 0xE0AB: 0x596D, - 0xE0AC: 0x5E2D, - 0xE0AD: 0x60DC, - 0xE0AE: 0x6614, - 0xE0AF: 0x6673, - 0xE0B0: 0x6790, - 0xE0B1: 0x6C50, - 0xE0B2: 0x6DC5, - 0xE0B3: 0x6F5F, - 0xE0B4: 0x77F3, - 0xE0B5: 0x78A9, - 0xE0B6: 0x84C6, - 0xE0B7: 0x91CB, - 0xE0B8: 0x932B, - 0xE0B9: 0x4ED9, - 0xE0BA: 0x50CA, - 0xE0BB: 0x5148, - 0xE0BC: 0x5584, - 0xE0BD: 0x5B0B, - 0xE0BE: 0x5BA3, - 0xE0BF: 0x6247, - 0xE0C0: 0x657E, - 0xE0C1: 0x65CB, - 0xE0C2: 0x6E32, - 0xE0C3: 0x717D, - 0xE0C4: 0x7401, - 0xE0C5: 0x7444, - 0xE0C6: 0x7487, - 0xE0C7: 0x74BF, - 0xE0C8: 0x766C, - 0xE0C9: 0x79AA, - 0xE0CA: 0x7DDA, - 0xE0CB: 0x7E55, - 0xE0CC: 0x7FA8, - 0xE0CD: 0x817A, - 0xE0CE: 0x81B3, - 0xE0CF: 0x8239, - 0xE0D0: 0x861A, - 0xE0D1: 0x87EC, - 0xE0D2: 0x8A75, - 0xE0D3: 0x8DE3, - 0xE0D4: 0x9078, - 0xE0D5: 0x9291, - 0xE0D6: 0x9425, - 0xE0D7: 0x994D, - 0xE0D8: 0x9BAE, - 0xE0D9: 0x5368, - 0xE0DA: 0x5C51, - 0xE0DB: 0x6954, - 0xE0DC: 0x6CC4, - 0xE0DD: 0x6D29, - 0xE0DE: 0x6E2B, - 0xE0DF: 0x820C, - 0xE0E0: 0x859B, - 0xE0E1: 0x893B, - 0xE0E2: 0x8A2D, - 0xE0E3: 0x8AAA, - 0xE0E4: 0x96EA, - 0xE0E5: 0x9F67, - 0xE0E6: 0x5261, - 0xE0E7: 0x66B9, - 0xE0E8: 0x6BB2, - 0xE0E9: 0x7E96, - 0xE0EA: 0x87FE, - 0xE0EB: 0x8D0D, - 0xE0EC: 0x9583, - 0xE0ED: 0x965D, - 0xE0EE: 0x651D, - 0xE0EF: 0x6D89, - 0xE0F0: 0x71EE, - 0xE0F1: 0xF96E, - 0xE0F2: 0x57CE, - 0xE0F3: 0x59D3, - 0xE0F4: 0x5BAC, - 0xE0F5: 0x6027, - 0xE0F6: 0x60FA, - 0xE0F7: 0x6210, - 0xE0F8: 0x661F, - 0xE0F9: 0x665F, - 0xE0FA: 0x7329, - 0xE0FB: 0x73F9, - 0xE0FC: 0x76DB, - 0xE0FD: 0x7701, - 0xE0FE: 0x7B6C, - 0xE1A1: 0x8056, - 0xE1A2: 0x8072, - 0xE1A3: 0x8165, - 0xE1A4: 0x8AA0, - 0xE1A5: 0x9192, - 0xE1A6: 0x4E16, - 0xE1A7: 0x52E2, - 0xE1A8: 0x6B72, - 0xE1A9: 0x6D17, - 0xE1AA: 0x7A05, - 0xE1AB: 0x7B39, - 0xE1AC: 0x7D30, - 0xE1AD: 0xF96F, - 0xE1AE: 0x8CB0, - 0xE1AF: 0x53EC, - 0xE1B0: 0x562F, - 0xE1B1: 0x5851, - 0xE1B2: 0x5BB5, - 0xE1B3: 0x5C0F, - 0xE1B4: 0x5C11, - 0xE1B5: 0x5DE2, - 0xE1B6: 0x6240, - 0xE1B7: 0x6383, - 0xE1B8: 0x6414, - 0xE1B9: 0x662D, - 0xE1BA: 0x68B3, - 0xE1BB: 0x6CBC, - 0xE1BC: 0x6D88, - 0xE1BD: 0x6EAF, - 0xE1BE: 0x701F, - 0xE1BF: 0x70A4, - 0xE1C0: 0x71D2, - 0xE1C1: 0x7526, - 0xE1C2: 0x758F, - 0xE1C3: 0x758E, - 0xE1C4: 0x7619, - 0xE1C5: 0x7B11, - 0xE1C6: 0x7BE0, - 0xE1C7: 0x7C2B, - 0xE1C8: 0x7D20, - 0xE1C9: 0x7D39, - 0xE1CA: 0x852C, - 0xE1CB: 0x856D, - 0xE1CC: 0x8607, - 0xE1CD: 0x8A34, - 0xE1CE: 0x900D, - 0xE1CF: 0x9061, - 0xE1D0: 0x90B5, - 0xE1D1: 0x92B7, - 0xE1D2: 0x97F6, - 0xE1D3: 0x9A37, - 0xE1D4: 0x4FD7, - 0xE1D5: 0x5C6C, - 0xE1D6: 0x675F, - 0xE1D7: 0x6D91, - 0xE1D8: 0x7C9F, - 0xE1D9: 0x7E8C, - 0xE1DA: 0x8B16, - 0xE1DB: 0x8D16, - 0xE1DC: 0x901F, - 0xE1DD: 0x5B6B, - 0xE1DE: 0x5DFD, - 0xE1DF: 0x640D, - 0xE1E0: 0x84C0, - 0xE1E1: 0x905C, - 0xE1E2: 0x98E1, - 0xE1E3: 0x7387, - 0xE1E4: 0x5B8B, - 0xE1E5: 0x609A, - 0xE1E6: 0x677E, - 0xE1E7: 0x6DDE, - 0xE1E8: 0x8A1F, - 0xE1E9: 0x8AA6, - 0xE1EA: 0x9001, - 0xE1EB: 0x980C, - 0xE1EC: 0x5237, - 0xE1ED: 0xF970, - 0xE1EE: 0x7051, - 0xE1EF: 0x788E, - 0xE1F0: 0x9396, - 0xE1F1: 0x8870, - 0xE1F2: 0x91D7, - 0xE1F3: 0x4FEE, - 0xE1F4: 0x53D7, - 0xE1F5: 0x55FD, - 0xE1F6: 0x56DA, - 0xE1F7: 0x5782, - 0xE1F8: 0x58FD, - 0xE1F9: 0x5AC2, - 0xE1FA: 0x5B88, - 0xE1FB: 0x5CAB, - 0xE1FC: 0x5CC0, - 0xE1FD: 0x5E25, - 0xE1FE: 0x6101, - 0xE2A1: 0x620D, - 0xE2A2: 0x624B, - 0xE2A3: 0x6388, - 0xE2A4: 0x641C, - 0xE2A5: 0x6536, - 0xE2A6: 0x6578, - 0xE2A7: 0x6A39, - 0xE2A8: 0x6B8A, - 0xE2A9: 0x6C34, - 0xE2AA: 0x6D19, - 0xE2AB: 0x6F31, - 0xE2AC: 0x71E7, - 0xE2AD: 0x72E9, - 0xE2AE: 0x7378, - 0xE2AF: 0x7407, - 0xE2B0: 0x74B2, - 0xE2B1: 0x7626, - 0xE2B2: 0x7761, - 0xE2B3: 0x79C0, - 0xE2B4: 0x7A57, - 0xE2B5: 0x7AEA, - 0xE2B6: 0x7CB9, - 0xE2B7: 0x7D8F, - 0xE2B8: 0x7DAC, - 0xE2B9: 0x7E61, - 0xE2BA: 0x7F9E, - 0xE2BB: 0x8129, - 0xE2BC: 0x8331, - 0xE2BD: 0x8490, - 0xE2BE: 0x84DA, - 0xE2BF: 0x85EA, - 0xE2C0: 0x8896, - 0xE2C1: 0x8AB0, - 0xE2C2: 0x8B90, - 0xE2C3: 0x8F38, - 0xE2C4: 0x9042, - 0xE2C5: 0x9083, - 0xE2C6: 0x916C, - 0xE2C7: 0x9296, - 0xE2C8: 0x92B9, - 0xE2C9: 0x968B, - 0xE2CA: 0x96A7, - 0xE2CB: 0x96A8, - 0xE2CC: 0x96D6, - 0xE2CD: 0x9700, - 0xE2CE: 0x9808, - 0xE2CF: 0x9996, - 0xE2D0: 0x9AD3, - 0xE2D1: 0x9B1A, - 0xE2D2: 0x53D4, - 0xE2D3: 0x587E, - 0xE2D4: 0x5919, - 0xE2D5: 0x5B70, - 0xE2D6: 0x5BBF, - 0xE2D7: 0x6DD1, - 0xE2D8: 0x6F5A, - 0xE2D9: 0x719F, - 0xE2DA: 0x7421, - 0xE2DB: 0x74B9, - 0xE2DC: 0x8085, - 0xE2DD: 0x83FD, - 0xE2DE: 0x5DE1, - 0xE2DF: 0x5F87, - 0xE2E0: 0x5FAA, - 0xE2E1: 0x6042, - 0xE2E2: 0x65EC, - 0xE2E3: 0x6812, - 0xE2E4: 0x696F, - 0xE2E5: 0x6A53, - 0xE2E6: 0x6B89, - 0xE2E7: 0x6D35, - 0xE2E8: 0x6DF3, - 0xE2E9: 0x73E3, - 0xE2EA: 0x76FE, - 0xE2EB: 0x77AC, - 0xE2EC: 0x7B4D, - 0xE2ED: 0x7D14, - 0xE2EE: 0x8123, - 0xE2EF: 0x821C, - 0xE2F0: 0x8340, - 0xE2F1: 0x84F4, - 0xE2F2: 0x8563, - 0xE2F3: 0x8A62, - 0xE2F4: 0x8AC4, - 0xE2F5: 0x9187, - 0xE2F6: 0x931E, - 0xE2F7: 0x9806, - 0xE2F8: 0x99B4, - 0xE2F9: 0x620C, - 0xE2FA: 0x8853, - 0xE2FB: 0x8FF0, - 0xE2FC: 0x9265, - 0xE2FD: 0x5D07, - 0xE2FE: 0x5D27, - 0xE3A1: 0x5D69, - 0xE3A2: 0x745F, - 0xE3A3: 0x819D, - 0xE3A4: 0x8768, - 0xE3A5: 0x6FD5, - 0xE3A6: 0x62FE, - 0xE3A7: 0x7FD2, - 0xE3A8: 0x8936, - 0xE3A9: 0x8972, - 0xE3AA: 0x4E1E, - 0xE3AB: 0x4E58, - 0xE3AC: 0x50E7, - 0xE3AD: 0x52DD, - 0xE3AE: 0x5347, - 0xE3AF: 0x627F, - 0xE3B0: 0x6607, - 0xE3B1: 0x7E69, - 0xE3B2: 0x8805, - 0xE3B3: 0x965E, - 0xE3B4: 0x4F8D, - 0xE3B5: 0x5319, - 0xE3B6: 0x5636, - 0xE3B7: 0x59CB, - 0xE3B8: 0x5AA4, - 0xE3B9: 0x5C38, - 0xE3BA: 0x5C4E, - 0xE3BB: 0x5C4D, - 0xE3BC: 0x5E02, - 0xE3BD: 0x5F11, - 0xE3BE: 0x6043, - 0xE3BF: 0x65BD, - 0xE3C0: 0x662F, - 0xE3C1: 0x6642, - 0xE3C2: 0x67BE, - 0xE3C3: 0x67F4, - 0xE3C4: 0x731C, - 0xE3C5: 0x77E2, - 0xE3C6: 0x793A, - 0xE3C7: 0x7FC5, - 0xE3C8: 0x8494, - 0xE3C9: 0x84CD, - 0xE3CA: 0x8996, - 0xE3CB: 0x8A66, - 0xE3CC: 0x8A69, - 0xE3CD: 0x8AE1, - 0xE3CE: 0x8C55, - 0xE3CF: 0x8C7A, - 0xE3D0: 0x57F4, - 0xE3D1: 0x5BD4, - 0xE3D2: 0x5F0F, - 0xE3D3: 0x606F, - 0xE3D4: 0x62ED, - 0xE3D5: 0x690D, - 0xE3D6: 0x6B96, - 0xE3D7: 0x6E5C, - 0xE3D8: 0x7184, - 0xE3D9: 0x7BD2, - 0xE3DA: 0x8755, - 0xE3DB: 0x8B58, - 0xE3DC: 0x8EFE, - 0xE3DD: 0x98DF, - 0xE3DE: 0x98FE, - 0xE3DF: 0x4F38, - 0xE3E0: 0x4F81, - 0xE3E1: 0x4FE1, - 0xE3E2: 0x547B, - 0xE3E3: 0x5A20, - 0xE3E4: 0x5BB8, - 0xE3E5: 0x613C, - 0xE3E6: 0x65B0, - 0xE3E7: 0x6668, - 0xE3E8: 0x71FC, - 0xE3E9: 0x7533, - 0xE3EA: 0x795E, - 0xE3EB: 0x7D33, - 0xE3EC: 0x814E, - 0xE3ED: 0x81E3, - 0xE3EE: 0x8398, - 0xE3EF: 0x85AA, - 0xE3F0: 0x85CE, - 0xE3F1: 0x8703, - 0xE3F2: 0x8A0A, - 0xE3F3: 0x8EAB, - 0xE3F4: 0x8F9B, - 0xE3F5: 0xF971, - 0xE3F6: 0x8FC5, - 0xE3F7: 0x5931, - 0xE3F8: 0x5BA4, - 0xE3F9: 0x5BE6, - 0xE3FA: 0x6089, - 0xE3FB: 0x5BE9, - 0xE3FC: 0x5C0B, - 0xE3FD: 0x5FC3, - 0xE3FE: 0x6C81, - 0xE4A1: 0xF972, - 0xE4A2: 0x6DF1, - 0xE4A3: 0x700B, - 0xE4A4: 0x751A, - 0xE4A5: 0x82AF, - 0xE4A6: 0x8AF6, - 0xE4A7: 0x4EC0, - 0xE4A8: 0x5341, - 0xE4A9: 0xF973, - 0xE4AA: 0x96D9, - 0xE4AB: 0x6C0F, - 0xE4AC: 0x4E9E, - 0xE4AD: 0x4FC4, - 0xE4AE: 0x5152, - 0xE4AF: 0x555E, - 0xE4B0: 0x5A25, - 0xE4B1: 0x5CE8, - 0xE4B2: 0x6211, - 0xE4B3: 0x7259, - 0xE4B4: 0x82BD, - 0xE4B5: 0x83AA, - 0xE4B6: 0x86FE, - 0xE4B7: 0x8859, - 0xE4B8: 0x8A1D, - 0xE4B9: 0x963F, - 0xE4BA: 0x96C5, - 0xE4BB: 0x9913, - 0xE4BC: 0x9D09, - 0xE4BD: 0x9D5D, - 0xE4BE: 0x580A, - 0xE4BF: 0x5CB3, - 0xE4C0: 0x5DBD, - 0xE4C1: 0x5E44, - 0xE4C2: 0x60E1, - 0xE4C3: 0x6115, - 0xE4C4: 0x63E1, - 0xE4C5: 0x6A02, - 0xE4C6: 0x6E25, - 0xE4C7: 0x9102, - 0xE4C8: 0x9354, - 0xE4C9: 0x984E, - 0xE4CA: 0x9C10, - 0xE4CB: 0x9F77, - 0xE4CC: 0x5B89, - 0xE4CD: 0x5CB8, - 0xE4CE: 0x6309, - 0xE4CF: 0x664F, - 0xE4D0: 0x6848, - 0xE4D1: 0x773C, - 0xE4D2: 0x96C1, - 0xE4D3: 0x978D, - 0xE4D4: 0x9854, - 0xE4D5: 0x9B9F, - 0xE4D6: 0x65A1, - 0xE4D7: 0x8B01, - 0xE4D8: 0x8ECB, - 0xE4D9: 0x95BC, - 0xE4DA: 0x5535, - 0xE4DB: 0x5CA9, - 0xE4DC: 0x5DD6, - 0xE4DD: 0x5EB5, - 0xE4DE: 0x6697, - 0xE4DF: 0x764C, - 0xE4E0: 0x83F4, - 0xE4E1: 0x95C7, - 0xE4E2: 0x58D3, - 0xE4E3: 0x62BC, - 0xE4E4: 0x72CE, - 0xE4E5: 0x9D28, - 0xE4E6: 0x4EF0, - 0xE4E7: 0x592E, - 0xE4E8: 0x600F, - 0xE4E9: 0x663B, - 0xE4EA: 0x6B83, - 0xE4EB: 0x79E7, - 0xE4EC: 0x9D26, - 0xE4ED: 0x5393, - 0xE4EE: 0x54C0, - 0xE4EF: 0x57C3, - 0xE4F0: 0x5D16, - 0xE4F1: 0x611B, - 0xE4F2: 0x66D6, - 0xE4F3: 0x6DAF, - 0xE4F4: 0x788D, - 0xE4F5: 0x827E, - 0xE4F6: 0x9698, - 0xE4F7: 0x9744, - 0xE4F8: 0x5384, - 0xE4F9: 0x627C, - 0xE4FA: 0x6396, - 0xE4FB: 0x6DB2, - 0xE4FC: 0x7E0A, - 0xE4FD: 0x814B, - 0xE4FE: 0x984D, - 0xE5A1: 0x6AFB, - 0xE5A2: 0x7F4C, - 0xE5A3: 0x9DAF, - 0xE5A4: 0x9E1A, - 0xE5A5: 0x4E5F, - 0xE5A6: 0x503B, - 0xE5A7: 0x51B6, - 0xE5A8: 0x591C, - 0xE5A9: 0x60F9, - 0xE5AA: 0x63F6, - 0xE5AB: 0x6930, - 0xE5AC: 0x723A, - 0xE5AD: 0x8036, - 0xE5AE: 0xF974, - 0xE5AF: 0x91CE, - 0xE5B0: 0x5F31, - 0xE5B1: 0xF975, - 0xE5B2: 0xF976, - 0xE5B3: 0x7D04, - 0xE5B4: 0x82E5, - 0xE5B5: 0x846F, - 0xE5B6: 0x84BB, - 0xE5B7: 0x85E5, - 0xE5B8: 0x8E8D, - 0xE5B9: 0xF977, - 0xE5BA: 0x4F6F, - 0xE5BB: 0xF978, - 0xE5BC: 0xF979, - 0xE5BD: 0x58E4, - 0xE5BE: 0x5B43, - 0xE5BF: 0x6059, - 0xE5C0: 0x63DA, - 0xE5C1: 0x6518, - 0xE5C2: 0x656D, - 0xE5C3: 0x6698, - 0xE5C4: 0xF97A, - 0xE5C5: 0x694A, - 0xE5C6: 0x6A23, - 0xE5C7: 0x6D0B, - 0xE5C8: 0x7001, - 0xE5C9: 0x716C, - 0xE5CA: 0x75D2, - 0xE5CB: 0x760D, - 0xE5CC: 0x79B3, - 0xE5CD: 0x7A70, - 0xE5CE: 0xF97B, - 0xE5CF: 0x7F8A, - 0xE5D0: 0xF97C, - 0xE5D1: 0x8944, - 0xE5D2: 0xF97D, - 0xE5D3: 0x8B93, - 0xE5D4: 0x91C0, - 0xE5D5: 0x967D, - 0xE5D6: 0xF97E, - 0xE5D7: 0x990A, - 0xE5D8: 0x5704, - 0xE5D9: 0x5FA1, - 0xE5DA: 0x65BC, - 0xE5DB: 0x6F01, - 0xE5DC: 0x7600, - 0xE5DD: 0x79A6, - 0xE5DE: 0x8A9E, - 0xE5DF: 0x99AD, - 0xE5E0: 0x9B5A, - 0xE5E1: 0x9F6C, - 0xE5E2: 0x5104, - 0xE5E3: 0x61B6, - 0xE5E4: 0x6291, - 0xE5E5: 0x6A8D, - 0xE5E6: 0x81C6, - 0xE5E7: 0x5043, - 0xE5E8: 0x5830, - 0xE5E9: 0x5F66, - 0xE5EA: 0x7109, - 0xE5EB: 0x8A00, - 0xE5EC: 0x8AFA, - 0xE5ED: 0x5B7C, - 0xE5EE: 0x8616, - 0xE5EF: 0x4FFA, - 0xE5F0: 0x513C, - 0xE5F1: 0x56B4, - 0xE5F2: 0x5944, - 0xE5F3: 0x63A9, - 0xE5F4: 0x6DF9, - 0xE5F5: 0x5DAA, - 0xE5F6: 0x696D, - 0xE5F7: 0x5186, - 0xE5F8: 0x4E88, - 0xE5F9: 0x4F59, - 0xE5FA: 0xF97F, - 0xE5FB: 0xF980, - 0xE5FC: 0xF981, - 0xE5FD: 0x5982, - 0xE5FE: 0xF982, - 0xE6A1: 0xF983, - 0xE6A2: 0x6B5F, - 0xE6A3: 0x6C5D, - 0xE6A4: 0xF984, - 0xE6A5: 0x74B5, - 0xE6A6: 0x7916, - 0xE6A7: 0xF985, - 0xE6A8: 0x8207, - 0xE6A9: 0x8245, - 0xE6AA: 0x8339, - 0xE6AB: 0x8F3F, - 0xE6AC: 0x8F5D, - 0xE6AD: 0xF986, - 0xE6AE: 0x9918, - 0xE6AF: 0xF987, - 0xE6B0: 0xF988, - 0xE6B1: 0xF989, - 0xE6B2: 0x4EA6, - 0xE6B3: 0xF98A, - 0xE6B4: 0x57DF, - 0xE6B5: 0x5F79, - 0xE6B6: 0x6613, - 0xE6B7: 0xF98B, - 0xE6B8: 0xF98C, - 0xE6B9: 0x75AB, - 0xE6BA: 0x7E79, - 0xE6BB: 0x8B6F, - 0xE6BC: 0xF98D, - 0xE6BD: 0x9006, - 0xE6BE: 0x9A5B, - 0xE6BF: 0x56A5, - 0xE6C0: 0x5827, - 0xE6C1: 0x59F8, - 0xE6C2: 0x5A1F, - 0xE6C3: 0x5BB4, - 0xE6C4: 0xF98E, - 0xE6C5: 0x5EF6, - 0xE6C6: 0xF98F, - 0xE6C7: 0xF990, - 0xE6C8: 0x6350, - 0xE6C9: 0x633B, - 0xE6CA: 0xF991, - 0xE6CB: 0x693D, - 0xE6CC: 0x6C87, - 0xE6CD: 0x6CBF, - 0xE6CE: 0x6D8E, - 0xE6CF: 0x6D93, - 0xE6D0: 0x6DF5, - 0xE6D1: 0x6F14, - 0xE6D2: 0xF992, - 0xE6D3: 0x70DF, - 0xE6D4: 0x7136, - 0xE6D5: 0x7159, - 0xE6D6: 0xF993, - 0xE6D7: 0x71C3, - 0xE6D8: 0x71D5, - 0xE6D9: 0xF994, - 0xE6DA: 0x784F, - 0xE6DB: 0x786F, - 0xE6DC: 0xF995, - 0xE6DD: 0x7B75, - 0xE6DE: 0x7DE3, - 0xE6DF: 0xF996, - 0xE6E0: 0x7E2F, - 0xE6E1: 0xF997, - 0xE6E2: 0x884D, - 0xE6E3: 0x8EDF, - 0xE6E4: 0xF998, - 0xE6E5: 0xF999, - 0xE6E6: 0xF99A, - 0xE6E7: 0x925B, - 0xE6E8: 0xF99B, - 0xE6E9: 0x9CF6, - 0xE6EA: 0xF99C, - 0xE6EB: 0xF99D, - 0xE6EC: 0xF99E, - 0xE6ED: 0x6085, - 0xE6EE: 0x6D85, - 0xE6EF: 0xF99F, - 0xE6F0: 0x71B1, - 0xE6F1: 0xF9A0, - 0xE6F2: 0xF9A1, - 0xE6F3: 0x95B1, - 0xE6F4: 0x53AD, - 0xE6F5: 0xF9A2, - 0xE6F6: 0xF9A3, - 0xE6F7: 0xF9A4, - 0xE6F8: 0x67D3, - 0xE6F9: 0xF9A5, - 0xE6FA: 0x708E, - 0xE6FB: 0x7130, - 0xE6FC: 0x7430, - 0xE6FD: 0x8276, - 0xE6FE: 0x82D2, - 0xE7A1: 0xF9A6, - 0xE7A2: 0x95BB, - 0xE7A3: 0x9AE5, - 0xE7A4: 0x9E7D, - 0xE7A5: 0x66C4, - 0xE7A6: 0xF9A7, - 0xE7A7: 0x71C1, - 0xE7A8: 0x8449, - 0xE7A9: 0xF9A8, - 0xE7AA: 0xF9A9, - 0xE7AB: 0x584B, - 0xE7AC: 0xF9AA, - 0xE7AD: 0xF9AB, - 0xE7AE: 0x5DB8, - 0xE7AF: 0x5F71, - 0xE7B0: 0xF9AC, - 0xE7B1: 0x6620, - 0xE7B2: 0x668E, - 0xE7B3: 0x6979, - 0xE7B4: 0x69AE, - 0xE7B5: 0x6C38, - 0xE7B6: 0x6CF3, - 0xE7B7: 0x6E36, - 0xE7B8: 0x6F41, - 0xE7B9: 0x6FDA, - 0xE7BA: 0x701B, - 0xE7BB: 0x702F, - 0xE7BC: 0x7150, - 0xE7BD: 0x71DF, - 0xE7BE: 0x7370, - 0xE7BF: 0xF9AD, - 0xE7C0: 0x745B, - 0xE7C1: 0xF9AE, - 0xE7C2: 0x74D4, - 0xE7C3: 0x76C8, - 0xE7C4: 0x7A4E, - 0xE7C5: 0x7E93, - 0xE7C6: 0xF9AF, - 0xE7C7: 0xF9B0, - 0xE7C8: 0x82F1, - 0xE7C9: 0x8A60, - 0xE7CA: 0x8FCE, - 0xE7CB: 0xF9B1, - 0xE7CC: 0x9348, - 0xE7CD: 0xF9B2, - 0xE7CE: 0x9719, - 0xE7CF: 0xF9B3, - 0xE7D0: 0xF9B4, - 0xE7D1: 0x4E42, - 0xE7D2: 0x502A, - 0xE7D3: 0xF9B5, - 0xE7D4: 0x5208, - 0xE7D5: 0x53E1, - 0xE7D6: 0x66F3, - 0xE7D7: 0x6C6D, - 0xE7D8: 0x6FCA, - 0xE7D9: 0x730A, - 0xE7DA: 0x777F, - 0xE7DB: 0x7A62, - 0xE7DC: 0x82AE, - 0xE7DD: 0x85DD, - 0xE7DE: 0x8602, - 0xE7DF: 0xF9B6, - 0xE7E0: 0x88D4, - 0xE7E1: 0x8A63, - 0xE7E2: 0x8B7D, - 0xE7E3: 0x8C6B, - 0xE7E4: 0xF9B7, - 0xE7E5: 0x92B3, - 0xE7E6: 0xF9B8, - 0xE7E7: 0x9713, - 0xE7E8: 0x9810, - 0xE7E9: 0x4E94, - 0xE7EA: 0x4F0D, - 0xE7EB: 0x4FC9, - 0xE7EC: 0x50B2, - 0xE7ED: 0x5348, - 0xE7EE: 0x543E, - 0xE7EF: 0x5433, - 0xE7F0: 0x55DA, - 0xE7F1: 0x5862, - 0xE7F2: 0x58BA, - 0xE7F3: 0x5967, - 0xE7F4: 0x5A1B, - 0xE7F5: 0x5BE4, - 0xE7F6: 0x609F, - 0xE7F7: 0xF9B9, - 0xE7F8: 0x61CA, - 0xE7F9: 0x6556, - 0xE7FA: 0x65FF, - 0xE7FB: 0x6664, - 0xE7FC: 0x68A7, - 0xE7FD: 0x6C5A, - 0xE7FE: 0x6FB3, - 0xE8A1: 0x70CF, - 0xE8A2: 0x71AC, - 0xE8A3: 0x7352, - 0xE8A4: 0x7B7D, - 0xE8A5: 0x8708, - 0xE8A6: 0x8AA4, - 0xE8A7: 0x9C32, - 0xE8A8: 0x9F07, - 0xE8A9: 0x5C4B, - 0xE8AA: 0x6C83, - 0xE8AB: 0x7344, - 0xE8AC: 0x7389, - 0xE8AD: 0x923A, - 0xE8AE: 0x6EAB, - 0xE8AF: 0x7465, - 0xE8B0: 0x761F, - 0xE8B1: 0x7A69, - 0xE8B2: 0x7E15, - 0xE8B3: 0x860A, - 0xE8B4: 0x5140, - 0xE8B5: 0x58C5, - 0xE8B6: 0x64C1, - 0xE8B7: 0x74EE, - 0xE8B8: 0x7515, - 0xE8B9: 0x7670, - 0xE8BA: 0x7FC1, - 0xE8BB: 0x9095, - 0xE8BC: 0x96CD, - 0xE8BD: 0x9954, - 0xE8BE: 0x6E26, - 0xE8BF: 0x74E6, - 0xE8C0: 0x7AA9, - 0xE8C1: 0x7AAA, - 0xE8C2: 0x81E5, - 0xE8C3: 0x86D9, - 0xE8C4: 0x8778, - 0xE8C5: 0x8A1B, - 0xE8C6: 0x5A49, - 0xE8C7: 0x5B8C, - 0xE8C8: 0x5B9B, - 0xE8C9: 0x68A1, - 0xE8CA: 0x6900, - 0xE8CB: 0x6D63, - 0xE8CC: 0x73A9, - 0xE8CD: 0x7413, - 0xE8CE: 0x742C, - 0xE8CF: 0x7897, - 0xE8D0: 0x7DE9, - 0xE8D1: 0x7FEB, - 0xE8D2: 0x8118, - 0xE8D3: 0x8155, - 0xE8D4: 0x839E, - 0xE8D5: 0x8C4C, - 0xE8D6: 0x962E, - 0xE8D7: 0x9811, - 0xE8D8: 0x66F0, - 0xE8D9: 0x5F80, - 0xE8DA: 0x65FA, - 0xE8DB: 0x6789, - 0xE8DC: 0x6C6A, - 0xE8DD: 0x738B, - 0xE8DE: 0x502D, - 0xE8DF: 0x5A03, - 0xE8E0: 0x6B6A, - 0xE8E1: 0x77EE, - 0xE8E2: 0x5916, - 0xE8E3: 0x5D6C, - 0xE8E4: 0x5DCD, - 0xE8E5: 0x7325, - 0xE8E6: 0x754F, - 0xE8E7: 0xF9BA, - 0xE8E8: 0xF9BB, - 0xE8E9: 0x50E5, - 0xE8EA: 0x51F9, - 0xE8EB: 0x582F, - 0xE8EC: 0x592D, - 0xE8ED: 0x5996, - 0xE8EE: 0x59DA, - 0xE8EF: 0x5BE5, - 0xE8F0: 0xF9BC, - 0xE8F1: 0xF9BD, - 0xE8F2: 0x5DA2, - 0xE8F3: 0x62D7, - 0xE8F4: 0x6416, - 0xE8F5: 0x6493, - 0xE8F6: 0x64FE, - 0xE8F7: 0xF9BE, - 0xE8F8: 0x66DC, - 0xE8F9: 0xF9BF, - 0xE8FA: 0x6A48, - 0xE8FB: 0xF9C0, - 0xE8FC: 0x71FF, - 0xE8FD: 0x7464, - 0xE8FE: 0xF9C1, - 0xE9A1: 0x7A88, - 0xE9A2: 0x7AAF, - 0xE9A3: 0x7E47, - 0xE9A4: 0x7E5E, - 0xE9A5: 0x8000, - 0xE9A6: 0x8170, - 0xE9A7: 0xF9C2, - 0xE9A8: 0x87EF, - 0xE9A9: 0x8981, - 0xE9AA: 0x8B20, - 0xE9AB: 0x9059, - 0xE9AC: 0xF9C3, - 0xE9AD: 0x9080, - 0xE9AE: 0x9952, - 0xE9AF: 0x617E, - 0xE9B0: 0x6B32, - 0xE9B1: 0x6D74, - 0xE9B2: 0x7E1F, - 0xE9B3: 0x8925, - 0xE9B4: 0x8FB1, - 0xE9B5: 0x4FD1, - 0xE9B6: 0x50AD, - 0xE9B7: 0x5197, - 0xE9B8: 0x52C7, - 0xE9B9: 0x57C7, - 0xE9BA: 0x5889, - 0xE9BB: 0x5BB9, - 0xE9BC: 0x5EB8, - 0xE9BD: 0x6142, - 0xE9BE: 0x6995, - 0xE9BF: 0x6D8C, - 0xE9C0: 0x6E67, - 0xE9C1: 0x6EB6, - 0xE9C2: 0x7194, - 0xE9C3: 0x7462, - 0xE9C4: 0x7528, - 0xE9C5: 0x752C, - 0xE9C6: 0x8073, - 0xE9C7: 0x8338, - 0xE9C8: 0x84C9, - 0xE9C9: 0x8E0A, - 0xE9CA: 0x9394, - 0xE9CB: 0x93DE, - 0xE9CC: 0xF9C4, - 0xE9CD: 0x4E8E, - 0xE9CE: 0x4F51, - 0xE9CF: 0x5076, - 0xE9D0: 0x512A, - 0xE9D1: 0x53C8, - 0xE9D2: 0x53CB, - 0xE9D3: 0x53F3, - 0xE9D4: 0x5B87, - 0xE9D5: 0x5BD3, - 0xE9D6: 0x5C24, - 0xE9D7: 0x611A, - 0xE9D8: 0x6182, - 0xE9D9: 0x65F4, - 0xE9DA: 0x725B, - 0xE9DB: 0x7397, - 0xE9DC: 0x7440, - 0xE9DD: 0x76C2, - 0xE9DE: 0x7950, - 0xE9DF: 0x7991, - 0xE9E0: 0x79B9, - 0xE9E1: 0x7D06, - 0xE9E2: 0x7FBD, - 0xE9E3: 0x828B, - 0xE9E4: 0x85D5, - 0xE9E5: 0x865E, - 0xE9E6: 0x8FC2, - 0xE9E7: 0x9047, - 0xE9E8: 0x90F5, - 0xE9E9: 0x91EA, - 0xE9EA: 0x9685, - 0xE9EB: 0x96E8, - 0xE9EC: 0x96E9, - 0xE9ED: 0x52D6, - 0xE9EE: 0x5F67, - 0xE9EF: 0x65ED, - 0xE9F0: 0x6631, - 0xE9F1: 0x682F, - 0xE9F2: 0x715C, - 0xE9F3: 0x7A36, - 0xE9F4: 0x90C1, - 0xE9F5: 0x980A, - 0xE9F6: 0x4E91, - 0xE9F7: 0xF9C5, - 0xE9F8: 0x6A52, - 0xE9F9: 0x6B9E, - 0xE9FA: 0x6F90, - 0xE9FB: 0x7189, - 0xE9FC: 0x8018, - 0xE9FD: 0x82B8, - 0xE9FE: 0x8553, - 0xEAA1: 0x904B, - 0xEAA2: 0x9695, - 0xEAA3: 0x96F2, - 0xEAA4: 0x97FB, - 0xEAA5: 0x851A, - 0xEAA6: 0x9B31, - 0xEAA7: 0x4E90, - 0xEAA8: 0x718A, - 0xEAA9: 0x96C4, - 0xEAAA: 0x5143, - 0xEAAB: 0x539F, - 0xEAAC: 0x54E1, - 0xEAAD: 0x5713, - 0xEAAE: 0x5712, - 0xEAAF: 0x57A3, - 0xEAB0: 0x5A9B, - 0xEAB1: 0x5AC4, - 0xEAB2: 0x5BC3, - 0xEAB3: 0x6028, - 0xEAB4: 0x613F, - 0xEAB5: 0x63F4, - 0xEAB6: 0x6C85, - 0xEAB7: 0x6D39, - 0xEAB8: 0x6E72, - 0xEAB9: 0x6E90, - 0xEABA: 0x7230, - 0xEABB: 0x733F, - 0xEABC: 0x7457, - 0xEABD: 0x82D1, - 0xEABE: 0x8881, - 0xEABF: 0x8F45, - 0xEAC0: 0x9060, - 0xEAC1: 0xF9C6, - 0xEAC2: 0x9662, - 0xEAC3: 0x9858, - 0xEAC4: 0x9D1B, - 0xEAC5: 0x6708, - 0xEAC6: 0x8D8A, - 0xEAC7: 0x925E, - 0xEAC8: 0x4F4D, - 0xEAC9: 0x5049, - 0xEACA: 0x50DE, - 0xEACB: 0x5371, - 0xEACC: 0x570D, - 0xEACD: 0x59D4, - 0xEACE: 0x5A01, - 0xEACF: 0x5C09, - 0xEAD0: 0x6170, - 0xEAD1: 0x6690, - 0xEAD2: 0x6E2D, - 0xEAD3: 0x7232, - 0xEAD4: 0x744B, - 0xEAD5: 0x7DEF, - 0xEAD6: 0x80C3, - 0xEAD7: 0x840E, - 0xEAD8: 0x8466, - 0xEAD9: 0x853F, - 0xEADA: 0x875F, - 0xEADB: 0x885B, - 0xEADC: 0x8918, - 0xEADD: 0x8B02, - 0xEADE: 0x9055, - 0xEADF: 0x97CB, - 0xEAE0: 0x9B4F, - 0xEAE1: 0x4E73, - 0xEAE2: 0x4F91, - 0xEAE3: 0x5112, - 0xEAE4: 0x516A, - 0xEAE5: 0xF9C7, - 0xEAE6: 0x552F, - 0xEAE7: 0x55A9, - 0xEAE8: 0x5B7A, - 0xEAE9: 0x5BA5, - 0xEAEA: 0x5E7C, - 0xEAEB: 0x5E7D, - 0xEAEC: 0x5EBE, - 0xEAED: 0x60A0, - 0xEAEE: 0x60DF, - 0xEAEF: 0x6108, - 0xEAF0: 0x6109, - 0xEAF1: 0x63C4, - 0xEAF2: 0x6538, - 0xEAF3: 0x6709, - 0xEAF4: 0xF9C8, - 0xEAF5: 0x67D4, - 0xEAF6: 0x67DA, - 0xEAF7: 0xF9C9, - 0xEAF8: 0x6961, - 0xEAF9: 0x6962, - 0xEAFA: 0x6CB9, - 0xEAFB: 0x6D27, - 0xEAFC: 0xF9CA, - 0xEAFD: 0x6E38, - 0xEAFE: 0xF9CB, - 0xEBA1: 0x6FE1, - 0xEBA2: 0x7336, - 0xEBA3: 0x7337, - 0xEBA4: 0xF9CC, - 0xEBA5: 0x745C, - 0xEBA6: 0x7531, - 0xEBA7: 0xF9CD, - 0xEBA8: 0x7652, - 0xEBA9: 0xF9CE, - 0xEBAA: 0xF9CF, - 0xEBAB: 0x7DAD, - 0xEBAC: 0x81FE, - 0xEBAD: 0x8438, - 0xEBAE: 0x88D5, - 0xEBAF: 0x8A98, - 0xEBB0: 0x8ADB, - 0xEBB1: 0x8AED, - 0xEBB2: 0x8E30, - 0xEBB3: 0x8E42, - 0xEBB4: 0x904A, - 0xEBB5: 0x903E, - 0xEBB6: 0x907A, - 0xEBB7: 0x9149, - 0xEBB8: 0x91C9, - 0xEBB9: 0x936E, - 0xEBBA: 0xF9D0, - 0xEBBB: 0xF9D1, - 0xEBBC: 0x5809, - 0xEBBD: 0xF9D2, - 0xEBBE: 0x6BD3, - 0xEBBF: 0x8089, - 0xEBC0: 0x80B2, - 0xEBC1: 0xF9D3, - 0xEBC2: 0xF9D4, - 0xEBC3: 0x5141, - 0xEBC4: 0x596B, - 0xEBC5: 0x5C39, - 0xEBC6: 0xF9D5, - 0xEBC7: 0xF9D6, - 0xEBC8: 0x6F64, - 0xEBC9: 0x73A7, - 0xEBCA: 0x80E4, - 0xEBCB: 0x8D07, - 0xEBCC: 0xF9D7, - 0xEBCD: 0x9217, - 0xEBCE: 0x958F, - 0xEBCF: 0xF9D8, - 0xEBD0: 0xF9D9, - 0xEBD1: 0xF9DA, - 0xEBD2: 0xF9DB, - 0xEBD3: 0x807F, - 0xEBD4: 0x620E, - 0xEBD5: 0x701C, - 0xEBD6: 0x7D68, - 0xEBD7: 0x878D, - 0xEBD8: 0xF9DC, - 0xEBD9: 0x57A0, - 0xEBDA: 0x6069, - 0xEBDB: 0x6147, - 0xEBDC: 0x6BB7, - 0xEBDD: 0x8ABE, - 0xEBDE: 0x9280, - 0xEBDF: 0x96B1, - 0xEBE0: 0x4E59, - 0xEBE1: 0x541F, - 0xEBE2: 0x6DEB, - 0xEBE3: 0x852D, - 0xEBE4: 0x9670, - 0xEBE5: 0x97F3, - 0xEBE6: 0x98EE, - 0xEBE7: 0x63D6, - 0xEBE8: 0x6CE3, - 0xEBE9: 0x9091, - 0xEBEA: 0x51DD, - 0xEBEB: 0x61C9, - 0xEBEC: 0x81BA, - 0xEBED: 0x9DF9, - 0xEBEE: 0x4F9D, - 0xEBEF: 0x501A, - 0xEBF0: 0x5100, - 0xEBF1: 0x5B9C, - 0xEBF2: 0x610F, - 0xEBF3: 0x61FF, - 0xEBF4: 0x64EC, - 0xEBF5: 0x6905, - 0xEBF6: 0x6BC5, - 0xEBF7: 0x7591, - 0xEBF8: 0x77E3, - 0xEBF9: 0x7FA9, - 0xEBFA: 0x8264, - 0xEBFB: 0x858F, - 0xEBFC: 0x87FB, - 0xEBFD: 0x8863, - 0xEBFE: 0x8ABC, - 0xECA1: 0x8B70, - 0xECA2: 0x91AB, - 0xECA3: 0x4E8C, - 0xECA4: 0x4EE5, - 0xECA5: 0x4F0A, - 0xECA6: 0xF9DD, - 0xECA7: 0xF9DE, - 0xECA8: 0x5937, - 0xECA9: 0x59E8, - 0xECAA: 0xF9DF, - 0xECAB: 0x5DF2, - 0xECAC: 0x5F1B, - 0xECAD: 0x5F5B, - 0xECAE: 0x6021, - 0xECAF: 0xF9E0, - 0xECB0: 0xF9E1, - 0xECB1: 0xF9E2, - 0xECB2: 0xF9E3, - 0xECB3: 0x723E, - 0xECB4: 0x73E5, - 0xECB5: 0xF9E4, - 0xECB6: 0x7570, - 0xECB7: 0x75CD, - 0xECB8: 0xF9E5, - 0xECB9: 0x79FB, - 0xECBA: 0xF9E6, - 0xECBB: 0x800C, - 0xECBC: 0x8033, - 0xECBD: 0x8084, - 0xECBE: 0x82E1, - 0xECBF: 0x8351, - 0xECC0: 0xF9E7, - 0xECC1: 0xF9E8, - 0xECC2: 0x8CBD, - 0xECC3: 0x8CB3, - 0xECC4: 0x9087, - 0xECC5: 0xF9E9, - 0xECC6: 0xF9EA, - 0xECC7: 0x98F4, - 0xECC8: 0x990C, - 0xECC9: 0xF9EB, - 0xECCA: 0xF9EC, - 0xECCB: 0x7037, - 0xECCC: 0x76CA, - 0xECCD: 0x7FCA, - 0xECCE: 0x7FCC, - 0xECCF: 0x7FFC, - 0xECD0: 0x8B1A, - 0xECD1: 0x4EBA, - 0xECD2: 0x4EC1, - 0xECD3: 0x5203, - 0xECD4: 0x5370, - 0xECD5: 0xF9ED, - 0xECD6: 0x54BD, - 0xECD7: 0x56E0, - 0xECD8: 0x59FB, - 0xECD9: 0x5BC5, - 0xECDA: 0x5F15, - 0xECDB: 0x5FCD, - 0xECDC: 0x6E6E, - 0xECDD: 0xF9EE, - 0xECDE: 0xF9EF, - 0xECDF: 0x7D6A, - 0xECE0: 0x8335, - 0xECE1: 0xF9F0, - 0xECE2: 0x8693, - 0xECE3: 0x8A8D, - 0xECE4: 0xF9F1, - 0xECE5: 0x976D, - 0xECE6: 0x9777, - 0xECE7: 0xF9F2, - 0xECE8: 0xF9F3, - 0xECE9: 0x4E00, - 0xECEA: 0x4F5A, - 0xECEB: 0x4F7E, - 0xECEC: 0x58F9, - 0xECED: 0x65E5, - 0xECEE: 0x6EA2, - 0xECEF: 0x9038, - 0xECF0: 0x93B0, - 0xECF1: 0x99B9, - 0xECF2: 0x4EFB, - 0xECF3: 0x58EC, - 0xECF4: 0x598A, - 0xECF5: 0x59D9, - 0xECF6: 0x6041, - 0xECF7: 0xF9F4, - 0xECF8: 0xF9F5, - 0xECF9: 0x7A14, - 0xECFA: 0xF9F6, - 0xECFB: 0x834F, - 0xECFC: 0x8CC3, - 0xECFD: 0x5165, - 0xECFE: 0x5344, - 0xEDA1: 0xF9F7, - 0xEDA2: 0xF9F8, - 0xEDA3: 0xF9F9, - 0xEDA4: 0x4ECD, - 0xEDA5: 0x5269, - 0xEDA6: 0x5B55, - 0xEDA7: 0x82BF, - 0xEDA8: 0x4ED4, - 0xEDA9: 0x523A, - 0xEDAA: 0x54A8, - 0xEDAB: 0x59C9, - 0xEDAC: 0x59FF, - 0xEDAD: 0x5B50, - 0xEDAE: 0x5B57, - 0xEDAF: 0x5B5C, - 0xEDB0: 0x6063, - 0xEDB1: 0x6148, - 0xEDB2: 0x6ECB, - 0xEDB3: 0x7099, - 0xEDB4: 0x716E, - 0xEDB5: 0x7386, - 0xEDB6: 0x74F7, - 0xEDB7: 0x75B5, - 0xEDB8: 0x78C1, - 0xEDB9: 0x7D2B, - 0xEDBA: 0x8005, - 0xEDBB: 0x81EA, - 0xEDBC: 0x8328, - 0xEDBD: 0x8517, - 0xEDBE: 0x85C9, - 0xEDBF: 0x8AEE, - 0xEDC0: 0x8CC7, - 0xEDC1: 0x96CC, - 0xEDC2: 0x4F5C, - 0xEDC3: 0x52FA, - 0xEDC4: 0x56BC, - 0xEDC5: 0x65AB, - 0xEDC6: 0x6628, - 0xEDC7: 0x707C, - 0xEDC8: 0x70B8, - 0xEDC9: 0x7235, - 0xEDCA: 0x7DBD, - 0xEDCB: 0x828D, - 0xEDCC: 0x914C, - 0xEDCD: 0x96C0, - 0xEDCE: 0x9D72, - 0xEDCF: 0x5B71, - 0xEDD0: 0x68E7, - 0xEDD1: 0x6B98, - 0xEDD2: 0x6F7A, - 0xEDD3: 0x76DE, - 0xEDD4: 0x5C91, - 0xEDD5: 0x66AB, - 0xEDD6: 0x6F5B, - 0xEDD7: 0x7BB4, - 0xEDD8: 0x7C2A, - 0xEDD9: 0x8836, - 0xEDDA: 0x96DC, - 0xEDDB: 0x4E08, - 0xEDDC: 0x4ED7, - 0xEDDD: 0x5320, - 0xEDDE: 0x5834, - 0xEDDF: 0x58BB, - 0xEDE0: 0x58EF, - 0xEDE1: 0x596C, - 0xEDE2: 0x5C07, - 0xEDE3: 0x5E33, - 0xEDE4: 0x5E84, - 0xEDE5: 0x5F35, - 0xEDE6: 0x638C, - 0xEDE7: 0x66B2, - 0xEDE8: 0x6756, - 0xEDE9: 0x6A1F, - 0xEDEA: 0x6AA3, - 0xEDEB: 0x6B0C, - 0xEDEC: 0x6F3F, - 0xEDED: 0x7246, - 0xEDEE: 0xF9FA, - 0xEDEF: 0x7350, - 0xEDF0: 0x748B, - 0xEDF1: 0x7AE0, - 0xEDF2: 0x7CA7, - 0xEDF3: 0x8178, - 0xEDF4: 0x81DF, - 0xEDF5: 0x81E7, - 0xEDF6: 0x838A, - 0xEDF7: 0x846C, - 0xEDF8: 0x8523, - 0xEDF9: 0x8594, - 0xEDFA: 0x85CF, - 0xEDFB: 0x88DD, - 0xEDFC: 0x8D13, - 0xEDFD: 0x91AC, - 0xEDFE: 0x9577, - 0xEEA1: 0x969C, - 0xEEA2: 0x518D, - 0xEEA3: 0x54C9, - 0xEEA4: 0x5728, - 0xEEA5: 0x5BB0, - 0xEEA6: 0x624D, - 0xEEA7: 0x6750, - 0xEEA8: 0x683D, - 0xEEA9: 0x6893, - 0xEEAA: 0x6E3D, - 0xEEAB: 0x6ED3, - 0xEEAC: 0x707D, - 0xEEAD: 0x7E21, - 0xEEAE: 0x88C1, - 0xEEAF: 0x8CA1, - 0xEEB0: 0x8F09, - 0xEEB1: 0x9F4B, - 0xEEB2: 0x9F4E, - 0xEEB3: 0x722D, - 0xEEB4: 0x7B8F, - 0xEEB5: 0x8ACD, - 0xEEB6: 0x931A, - 0xEEB7: 0x4F47, - 0xEEB8: 0x4F4E, - 0xEEB9: 0x5132, - 0xEEBA: 0x5480, - 0xEEBB: 0x59D0, - 0xEEBC: 0x5E95, - 0xEEBD: 0x62B5, - 0xEEBE: 0x6775, - 0xEEBF: 0x696E, - 0xEEC0: 0x6A17, - 0xEEC1: 0x6CAE, - 0xEEC2: 0x6E1A, - 0xEEC3: 0x72D9, - 0xEEC4: 0x732A, - 0xEEC5: 0x75BD, - 0xEEC6: 0x7BB8, - 0xEEC7: 0x7D35, - 0xEEC8: 0x82E7, - 0xEEC9: 0x83F9, - 0xEECA: 0x8457, - 0xEECB: 0x85F7, - 0xEECC: 0x8A5B, - 0xEECD: 0x8CAF, - 0xEECE: 0x8E87, - 0xEECF: 0x9019, - 0xEED0: 0x90B8, - 0xEED1: 0x96CE, - 0xEED2: 0x9F5F, - 0xEED3: 0x52E3, - 0xEED4: 0x540A, - 0xEED5: 0x5AE1, - 0xEED6: 0x5BC2, - 0xEED7: 0x6458, - 0xEED8: 0x6575, - 0xEED9: 0x6EF4, - 0xEEDA: 0x72C4, - 0xEEDB: 0xF9FB, - 0xEEDC: 0x7684, - 0xEEDD: 0x7A4D, - 0xEEDE: 0x7B1B, - 0xEEDF: 0x7C4D, - 0xEEE0: 0x7E3E, - 0xEEE1: 0x7FDF, - 0xEEE2: 0x837B, - 0xEEE3: 0x8B2B, - 0xEEE4: 0x8CCA, - 0xEEE5: 0x8D64, - 0xEEE6: 0x8DE1, - 0xEEE7: 0x8E5F, - 0xEEE8: 0x8FEA, - 0xEEE9: 0x8FF9, - 0xEEEA: 0x9069, - 0xEEEB: 0x93D1, - 0xEEEC: 0x4F43, - 0xEEED: 0x4F7A, - 0xEEEE: 0x50B3, - 0xEEEF: 0x5168, - 0xEEF0: 0x5178, - 0xEEF1: 0x524D, - 0xEEF2: 0x526A, - 0xEEF3: 0x5861, - 0xEEF4: 0x587C, - 0xEEF5: 0x5960, - 0xEEF6: 0x5C08, - 0xEEF7: 0x5C55, - 0xEEF8: 0x5EDB, - 0xEEF9: 0x609B, - 0xEEFA: 0x6230, - 0xEEFB: 0x6813, - 0xEEFC: 0x6BBF, - 0xEEFD: 0x6C08, - 0xEEFE: 0x6FB1, - 0xEFA1: 0x714E, - 0xEFA2: 0x7420, - 0xEFA3: 0x7530, - 0xEFA4: 0x7538, - 0xEFA5: 0x7551, - 0xEFA6: 0x7672, - 0xEFA7: 0x7B4C, - 0xEFA8: 0x7B8B, - 0xEFA9: 0x7BAD, - 0xEFAA: 0x7BC6, - 0xEFAB: 0x7E8F, - 0xEFAC: 0x8A6E, - 0xEFAD: 0x8F3E, - 0xEFAE: 0x8F49, - 0xEFAF: 0x923F, - 0xEFB0: 0x9293, - 0xEFB1: 0x9322, - 0xEFB2: 0x942B, - 0xEFB3: 0x96FB, - 0xEFB4: 0x985A, - 0xEFB5: 0x986B, - 0xEFB6: 0x991E, - 0xEFB7: 0x5207, - 0xEFB8: 0x622A, - 0xEFB9: 0x6298, - 0xEFBA: 0x6D59, - 0xEFBB: 0x7664, - 0xEFBC: 0x7ACA, - 0xEFBD: 0x7BC0, - 0xEFBE: 0x7D76, - 0xEFBF: 0x5360, - 0xEFC0: 0x5CBE, - 0xEFC1: 0x5E97, - 0xEFC2: 0x6F38, - 0xEFC3: 0x70B9, - 0xEFC4: 0x7C98, - 0xEFC5: 0x9711, - 0xEFC6: 0x9B8E, - 0xEFC7: 0x9EDE, - 0xEFC8: 0x63A5, - 0xEFC9: 0x647A, - 0xEFCA: 0x8776, - 0xEFCB: 0x4E01, - 0xEFCC: 0x4E95, - 0xEFCD: 0x4EAD, - 0xEFCE: 0x505C, - 0xEFCF: 0x5075, - 0xEFD0: 0x5448, - 0xEFD1: 0x59C3, - 0xEFD2: 0x5B9A, - 0xEFD3: 0x5E40, - 0xEFD4: 0x5EAD, - 0xEFD5: 0x5EF7, - 0xEFD6: 0x5F81, - 0xEFD7: 0x60C5, - 0xEFD8: 0x633A, - 0xEFD9: 0x653F, - 0xEFDA: 0x6574, - 0xEFDB: 0x65CC, - 0xEFDC: 0x6676, - 0xEFDD: 0x6678, - 0xEFDE: 0x67FE, - 0xEFDF: 0x6968, - 0xEFE0: 0x6A89, - 0xEFE1: 0x6B63, - 0xEFE2: 0x6C40, - 0xEFE3: 0x6DC0, - 0xEFE4: 0x6DE8, - 0xEFE5: 0x6E1F, - 0xEFE6: 0x6E5E, - 0xEFE7: 0x701E, - 0xEFE8: 0x70A1, - 0xEFE9: 0x738E, - 0xEFEA: 0x73FD, - 0xEFEB: 0x753A, - 0xEFEC: 0x775B, - 0xEFED: 0x7887, - 0xEFEE: 0x798E, - 0xEFEF: 0x7A0B, - 0xEFF0: 0x7A7D, - 0xEFF1: 0x7CBE, - 0xEFF2: 0x7D8E, - 0xEFF3: 0x8247, - 0xEFF4: 0x8A02, - 0xEFF5: 0x8AEA, - 0xEFF6: 0x8C9E, - 0xEFF7: 0x912D, - 0xEFF8: 0x914A, - 0xEFF9: 0x91D8, - 0xEFFA: 0x9266, - 0xEFFB: 0x92CC, - 0xEFFC: 0x9320, - 0xEFFD: 0x9706, - 0xEFFE: 0x9756, - 0xF0A1: 0x975C, - 0xF0A2: 0x9802, - 0xF0A3: 0x9F0E, - 0xF0A4: 0x5236, - 0xF0A5: 0x5291, - 0xF0A6: 0x557C, - 0xF0A7: 0x5824, - 0xF0A8: 0x5E1D, - 0xF0A9: 0x5F1F, - 0xF0AA: 0x608C, - 0xF0AB: 0x63D0, - 0xF0AC: 0x68AF, - 0xF0AD: 0x6FDF, - 0xF0AE: 0x796D, - 0xF0AF: 0x7B2C, - 0xF0B0: 0x81CD, - 0xF0B1: 0x85BA, - 0xF0B2: 0x88FD, - 0xF0B3: 0x8AF8, - 0xF0B4: 0x8E44, - 0xF0B5: 0x918D, - 0xF0B6: 0x9664, - 0xF0B7: 0x969B, - 0xF0B8: 0x973D, - 0xF0B9: 0x984C, - 0xF0BA: 0x9F4A, - 0xF0BB: 0x4FCE, - 0xF0BC: 0x5146, - 0xF0BD: 0x51CB, - 0xF0BE: 0x52A9, - 0xF0BF: 0x5632, - 0xF0C0: 0x5F14, - 0xF0C1: 0x5F6B, - 0xF0C2: 0x63AA, - 0xF0C3: 0x64CD, - 0xF0C4: 0x65E9, - 0xF0C5: 0x6641, - 0xF0C6: 0x66FA, - 0xF0C7: 0x66F9, - 0xF0C8: 0x671D, - 0xF0C9: 0x689D, - 0xF0CA: 0x68D7, - 0xF0CB: 0x69FD, - 0xF0CC: 0x6F15, - 0xF0CD: 0x6F6E, - 0xF0CE: 0x7167, - 0xF0CF: 0x71E5, - 0xF0D0: 0x722A, - 0xF0D1: 0x74AA, - 0xF0D2: 0x773A, - 0xF0D3: 0x7956, - 0xF0D4: 0x795A, - 0xF0D5: 0x79DF, - 0xF0D6: 0x7A20, - 0xF0D7: 0x7A95, - 0xF0D8: 0x7C97, - 0xF0D9: 0x7CDF, - 0xF0DA: 0x7D44, - 0xF0DB: 0x7E70, - 0xF0DC: 0x8087, - 0xF0DD: 0x85FB, - 0xF0DE: 0x86A4, - 0xF0DF: 0x8A54, - 0xF0E0: 0x8ABF, - 0xF0E1: 0x8D99, - 0xF0E2: 0x8E81, - 0xF0E3: 0x9020, - 0xF0E4: 0x906D, - 0xF0E5: 0x91E3, - 0xF0E6: 0x963B, - 0xF0E7: 0x96D5, - 0xF0E8: 0x9CE5, - 0xF0E9: 0x65CF, - 0xF0EA: 0x7C07, - 0xF0EB: 0x8DB3, - 0xF0EC: 0x93C3, - 0xF0ED: 0x5B58, - 0xF0EE: 0x5C0A, - 0xF0EF: 0x5352, - 0xF0F0: 0x62D9, - 0xF0F1: 0x731D, - 0xF0F2: 0x5027, - 0xF0F3: 0x5B97, - 0xF0F4: 0x5F9E, - 0xF0F5: 0x60B0, - 0xF0F6: 0x616B, - 0xF0F7: 0x68D5, - 0xF0F8: 0x6DD9, - 0xF0F9: 0x742E, - 0xF0FA: 0x7A2E, - 0xF0FB: 0x7D42, - 0xF0FC: 0x7D9C, - 0xF0FD: 0x7E31, - 0xF0FE: 0x816B, - 0xF1A1: 0x8E2A, - 0xF1A2: 0x8E35, - 0xF1A3: 0x937E, - 0xF1A4: 0x9418, - 0xF1A5: 0x4F50, - 0xF1A6: 0x5750, - 0xF1A7: 0x5DE6, - 0xF1A8: 0x5EA7, - 0xF1A9: 0x632B, - 0xF1AA: 0x7F6A, - 0xF1AB: 0x4E3B, - 0xF1AC: 0x4F4F, - 0xF1AD: 0x4F8F, - 0xF1AE: 0x505A, - 0xF1AF: 0x59DD, - 0xF1B0: 0x80C4, - 0xF1B1: 0x546A, - 0xF1B2: 0x5468, - 0xF1B3: 0x55FE, - 0xF1B4: 0x594F, - 0xF1B5: 0x5B99, - 0xF1B6: 0x5DDE, - 0xF1B7: 0x5EDA, - 0xF1B8: 0x665D, - 0xF1B9: 0x6731, - 0xF1BA: 0x67F1, - 0xF1BB: 0x682A, - 0xF1BC: 0x6CE8, - 0xF1BD: 0x6D32, - 0xF1BE: 0x6E4A, - 0xF1BF: 0x6F8D, - 0xF1C0: 0x70B7, - 0xF1C1: 0x73E0, - 0xF1C2: 0x7587, - 0xF1C3: 0x7C4C, - 0xF1C4: 0x7D02, - 0xF1C5: 0x7D2C, - 0xF1C6: 0x7DA2, - 0xF1C7: 0x821F, - 0xF1C8: 0x86DB, - 0xF1C9: 0x8A3B, - 0xF1CA: 0x8A85, - 0xF1CB: 0x8D70, - 0xF1CC: 0x8E8A, - 0xF1CD: 0x8F33, - 0xF1CE: 0x9031, - 0xF1CF: 0x914E, - 0xF1D0: 0x9152, - 0xF1D1: 0x9444, - 0xF1D2: 0x99D0, - 0xF1D3: 0x7AF9, - 0xF1D4: 0x7CA5, - 0xF1D5: 0x4FCA, - 0xF1D6: 0x5101, - 0xF1D7: 0x51C6, - 0xF1D8: 0x57C8, - 0xF1D9: 0x5BEF, - 0xF1DA: 0x5CFB, - 0xF1DB: 0x6659, - 0xF1DC: 0x6A3D, - 0xF1DD: 0x6D5A, - 0xF1DE: 0x6E96, - 0xF1DF: 0x6FEC, - 0xF1E0: 0x710C, - 0xF1E1: 0x756F, - 0xF1E2: 0x7AE3, - 0xF1E3: 0x8822, - 0xF1E4: 0x9021, - 0xF1E5: 0x9075, - 0xF1E6: 0x96CB, - 0xF1E7: 0x99FF, - 0xF1E8: 0x8301, - 0xF1E9: 0x4E2D, - 0xF1EA: 0x4EF2, - 0xF1EB: 0x8846, - 0xF1EC: 0x91CD, - 0xF1ED: 0x537D, - 0xF1EE: 0x6ADB, - 0xF1EF: 0x696B, - 0xF1F0: 0x6C41, - 0xF1F1: 0x847A, - 0xF1F2: 0x589E, - 0xF1F3: 0x618E, - 0xF1F4: 0x66FE, - 0xF1F5: 0x62EF, - 0xF1F6: 0x70DD, - 0xF1F7: 0x7511, - 0xF1F8: 0x75C7, - 0xF1F9: 0x7E52, - 0xF1FA: 0x84B8, - 0xF1FB: 0x8B49, - 0xF1FC: 0x8D08, - 0xF1FD: 0x4E4B, - 0xF1FE: 0x53EA, - 0xF2A1: 0x54AB, - 0xF2A2: 0x5730, - 0xF2A3: 0x5740, - 0xF2A4: 0x5FD7, - 0xF2A5: 0x6301, - 0xF2A6: 0x6307, - 0xF2A7: 0x646F, - 0xF2A8: 0x652F, - 0xF2A9: 0x65E8, - 0xF2AA: 0x667A, - 0xF2AB: 0x679D, - 0xF2AC: 0x67B3, - 0xF2AD: 0x6B62, - 0xF2AE: 0x6C60, - 0xF2AF: 0x6C9A, - 0xF2B0: 0x6F2C, - 0xF2B1: 0x77E5, - 0xF2B2: 0x7825, - 0xF2B3: 0x7949, - 0xF2B4: 0x7957, - 0xF2B5: 0x7D19, - 0xF2B6: 0x80A2, - 0xF2B7: 0x8102, - 0xF2B8: 0x81F3, - 0xF2B9: 0x829D, - 0xF2BA: 0x82B7, - 0xF2BB: 0x8718, - 0xF2BC: 0x8A8C, - 0xF2BD: 0xF9FC, - 0xF2BE: 0x8D04, - 0xF2BF: 0x8DBE, - 0xF2C0: 0x9072, - 0xF2C1: 0x76F4, - 0xF2C2: 0x7A19, - 0xF2C3: 0x7A37, - 0xF2C4: 0x7E54, - 0xF2C5: 0x8077, - 0xF2C6: 0x5507, - 0xF2C7: 0x55D4, - 0xF2C8: 0x5875, - 0xF2C9: 0x632F, - 0xF2CA: 0x6422, - 0xF2CB: 0x6649, - 0xF2CC: 0x664B, - 0xF2CD: 0x686D, - 0xF2CE: 0x699B, - 0xF2CF: 0x6B84, - 0xF2D0: 0x6D25, - 0xF2D1: 0x6EB1, - 0xF2D2: 0x73CD, - 0xF2D3: 0x7468, - 0xF2D4: 0x74A1, - 0xF2D5: 0x755B, - 0xF2D6: 0x75B9, - 0xF2D7: 0x76E1, - 0xF2D8: 0x771E, - 0xF2D9: 0x778B, - 0xF2DA: 0x79E6, - 0xF2DB: 0x7E09, - 0xF2DC: 0x7E1D, - 0xF2DD: 0x81FB, - 0xF2DE: 0x852F, - 0xF2DF: 0x8897, - 0xF2E0: 0x8A3A, - 0xF2E1: 0x8CD1, - 0xF2E2: 0x8EEB, - 0xF2E3: 0x8FB0, - 0xF2E4: 0x9032, - 0xF2E5: 0x93AD, - 0xF2E6: 0x9663, - 0xF2E7: 0x9673, - 0xF2E8: 0x9707, - 0xF2E9: 0x4F84, - 0xF2EA: 0x53F1, - 0xF2EB: 0x59EA, - 0xF2EC: 0x5AC9, - 0xF2ED: 0x5E19, - 0xF2EE: 0x684E, - 0xF2EF: 0x74C6, - 0xF2F0: 0x75BE, - 0xF2F1: 0x79E9, - 0xF2F2: 0x7A92, - 0xF2F3: 0x81A3, - 0xF2F4: 0x86ED, - 0xF2F5: 0x8CEA, - 0xF2F6: 0x8DCC, - 0xF2F7: 0x8FED, - 0xF2F8: 0x659F, - 0xF2F9: 0x6715, - 0xF2FA: 0xF9FD, - 0xF2FB: 0x57F7, - 0xF2FC: 0x6F57, - 0xF2FD: 0x7DDD, - 0xF2FE: 0x8F2F, - 0xF3A1: 0x93F6, - 0xF3A2: 0x96C6, - 0xF3A3: 0x5FB5, - 0xF3A4: 0x61F2, - 0xF3A5: 0x6F84, - 0xF3A6: 0x4E14, - 0xF3A7: 0x4F98, - 0xF3A8: 0x501F, - 0xF3A9: 0x53C9, - 0xF3AA: 0x55DF, - 0xF3AB: 0x5D6F, - 0xF3AC: 0x5DEE, - 0xF3AD: 0x6B21, - 0xF3AE: 0x6B64, - 0xF3AF: 0x78CB, - 0xF3B0: 0x7B9A, - 0xF3B1: 0xF9FE, - 0xF3B2: 0x8E49, - 0xF3B3: 0x8ECA, - 0xF3B4: 0x906E, - 0xF3B5: 0x6349, - 0xF3B6: 0x643E, - 0xF3B7: 0x7740, - 0xF3B8: 0x7A84, - 0xF3B9: 0x932F, - 0xF3BA: 0x947F, - 0xF3BB: 0x9F6A, - 0xF3BC: 0x64B0, - 0xF3BD: 0x6FAF, - 0xF3BE: 0x71E6, - 0xF3BF: 0x74A8, - 0xF3C0: 0x74DA, - 0xF3C1: 0x7AC4, - 0xF3C2: 0x7C12, - 0xF3C3: 0x7E82, - 0xF3C4: 0x7CB2, - 0xF3C5: 0x7E98, - 0xF3C6: 0x8B9A, - 0xF3C7: 0x8D0A, - 0xF3C8: 0x947D, - 0xF3C9: 0x9910, - 0xF3CA: 0x994C, - 0xF3CB: 0x5239, - 0xF3CC: 0x5BDF, - 0xF3CD: 0x64E6, - 0xF3CE: 0x672D, - 0xF3CF: 0x7D2E, - 0xF3D0: 0x50ED, - 0xF3D1: 0x53C3, - 0xF3D2: 0x5879, - 0xF3D3: 0x6158, - 0xF3D4: 0x6159, - 0xF3D5: 0x61FA, - 0xF3D6: 0x65AC, - 0xF3D7: 0x7AD9, - 0xF3D8: 0x8B92, - 0xF3D9: 0x8B96, - 0xF3DA: 0x5009, - 0xF3DB: 0x5021, - 0xF3DC: 0x5275, - 0xF3DD: 0x5531, - 0xF3DE: 0x5A3C, - 0xF3DF: 0x5EE0, - 0xF3E0: 0x5F70, - 0xF3E1: 0x6134, - 0xF3E2: 0x655E, - 0xF3E3: 0x660C, - 0xF3E4: 0x6636, - 0xF3E5: 0x66A2, - 0xF3E6: 0x69CD, - 0xF3E7: 0x6EC4, - 0xF3E8: 0x6F32, - 0xF3E9: 0x7316, - 0xF3EA: 0x7621, - 0xF3EB: 0x7A93, - 0xF3EC: 0x8139, - 0xF3ED: 0x8259, - 0xF3EE: 0x83D6, - 0xF3EF: 0x84BC, - 0xF3F0: 0x50B5, - 0xF3F1: 0x57F0, - 0xF3F2: 0x5BC0, - 0xF3F3: 0x5BE8, - 0xF3F4: 0x5F69, - 0xF3F5: 0x63A1, - 0xF3F6: 0x7826, - 0xF3F7: 0x7DB5, - 0xF3F8: 0x83DC, - 0xF3F9: 0x8521, - 0xF3FA: 0x91C7, - 0xF3FB: 0x91F5, - 0xF3FC: 0x518A, - 0xF3FD: 0x67F5, - 0xF3FE: 0x7B56, - 0xF4A1: 0x8CAC, - 0xF4A2: 0x51C4, - 0xF4A3: 0x59BB, - 0xF4A4: 0x60BD, - 0xF4A5: 0x8655, - 0xF4A6: 0x501C, - 0xF4A7: 0xF9FF, - 0xF4A8: 0x5254, - 0xF4A9: 0x5C3A, - 0xF4AA: 0x617D, - 0xF4AB: 0x621A, - 0xF4AC: 0x62D3, - 0xF4AD: 0x64F2, - 0xF4AE: 0x65A5, - 0xF4AF: 0x6ECC, - 0xF4B0: 0x7620, - 0xF4B1: 0x810A, - 0xF4B2: 0x8E60, - 0xF4B3: 0x965F, - 0xF4B4: 0x96BB, - 0xF4B5: 0x4EDF, - 0xF4B6: 0x5343, - 0xF4B7: 0x5598, - 0xF4B8: 0x5929, - 0xF4B9: 0x5DDD, - 0xF4BA: 0x64C5, - 0xF4BB: 0x6CC9, - 0xF4BC: 0x6DFA, - 0xF4BD: 0x7394, - 0xF4BE: 0x7A7F, - 0xF4BF: 0x821B, - 0xF4C0: 0x85A6, - 0xF4C1: 0x8CE4, - 0xF4C2: 0x8E10, - 0xF4C3: 0x9077, - 0xF4C4: 0x91E7, - 0xF4C5: 0x95E1, - 0xF4C6: 0x9621, - 0xF4C7: 0x97C6, - 0xF4C8: 0x51F8, - 0xF4C9: 0x54F2, - 0xF4CA: 0x5586, - 0xF4CB: 0x5FB9, - 0xF4CC: 0x64A4, - 0xF4CD: 0x6F88, - 0xF4CE: 0x7DB4, - 0xF4CF: 0x8F1F, - 0xF4D0: 0x8F4D, - 0xF4D1: 0x9435, - 0xF4D2: 0x50C9, - 0xF4D3: 0x5C16, - 0xF4D4: 0x6CBE, - 0xF4D5: 0x6DFB, - 0xF4D6: 0x751B, - 0xF4D7: 0x77BB, - 0xF4D8: 0x7C3D, - 0xF4D9: 0x7C64, - 0xF4DA: 0x8A79, - 0xF4DB: 0x8AC2, - 0xF4DC: 0x581E, - 0xF4DD: 0x59BE, - 0xF4DE: 0x5E16, - 0xF4DF: 0x6377, - 0xF4E0: 0x7252, - 0xF4E1: 0x758A, - 0xF4E2: 0x776B, - 0xF4E3: 0x8ADC, - 0xF4E4: 0x8CBC, - 0xF4E5: 0x8F12, - 0xF4E6: 0x5EF3, - 0xF4E7: 0x6674, - 0xF4E8: 0x6DF8, - 0xF4E9: 0x807D, - 0xF4EA: 0x83C1, - 0xF4EB: 0x8ACB, - 0xF4EC: 0x9751, - 0xF4ED: 0x9BD6, - 0xF4EE: 0xFA00, - 0xF4EF: 0x5243, - 0xF4F0: 0x66FF, - 0xF4F1: 0x6D95, - 0xF4F2: 0x6EEF, - 0xF4F3: 0x7DE0, - 0xF4F4: 0x8AE6, - 0xF4F5: 0x902E, - 0xF4F6: 0x905E, - 0xF4F7: 0x9AD4, - 0xF4F8: 0x521D, - 0xF4F9: 0x527F, - 0xF4FA: 0x54E8, - 0xF4FB: 0x6194, - 0xF4FC: 0x6284, - 0xF4FD: 0x62DB, - 0xF4FE: 0x68A2, - 0xF5A1: 0x6912, - 0xF5A2: 0x695A, - 0xF5A3: 0x6A35, - 0xF5A4: 0x7092, - 0xF5A5: 0x7126, - 0xF5A6: 0x785D, - 0xF5A7: 0x7901, - 0xF5A8: 0x790E, - 0xF5A9: 0x79D2, - 0xF5AA: 0x7A0D, - 0xF5AB: 0x8096, - 0xF5AC: 0x8278, - 0xF5AD: 0x82D5, - 0xF5AE: 0x8349, - 0xF5AF: 0x8549, - 0xF5B0: 0x8C82, - 0xF5B1: 0x8D85, - 0xF5B2: 0x9162, - 0xF5B3: 0x918B, - 0xF5B4: 0x91AE, - 0xF5B5: 0x4FC3, - 0xF5B6: 0x56D1, - 0xF5B7: 0x71ED, - 0xF5B8: 0x77D7, - 0xF5B9: 0x8700, - 0xF5BA: 0x89F8, - 0xF5BB: 0x5BF8, - 0xF5BC: 0x5FD6, - 0xF5BD: 0x6751, - 0xF5BE: 0x90A8, - 0xF5BF: 0x53E2, - 0xF5C0: 0x585A, - 0xF5C1: 0x5BF5, - 0xF5C2: 0x60A4, - 0xF5C3: 0x6181, - 0xF5C4: 0x6460, - 0xF5C5: 0x7E3D, - 0xF5C6: 0x8070, - 0xF5C7: 0x8525, - 0xF5C8: 0x9283, - 0xF5C9: 0x64AE, - 0xF5CA: 0x50AC, - 0xF5CB: 0x5D14, - 0xF5CC: 0x6700, - 0xF5CD: 0x589C, - 0xF5CE: 0x62BD, - 0xF5CF: 0x63A8, - 0xF5D0: 0x690E, - 0xF5D1: 0x6978, - 0xF5D2: 0x6A1E, - 0xF5D3: 0x6E6B, - 0xF5D4: 0x76BA, - 0xF5D5: 0x79CB, - 0xF5D6: 0x82BB, - 0xF5D7: 0x8429, - 0xF5D8: 0x8ACF, - 0xF5D9: 0x8DA8, - 0xF5DA: 0x8FFD, - 0xF5DB: 0x9112, - 0xF5DC: 0x914B, - 0xF5DD: 0x919C, - 0xF5DE: 0x9310, - 0xF5DF: 0x9318, - 0xF5E0: 0x939A, - 0xF5E1: 0x96DB, - 0xF5E2: 0x9A36, - 0xF5E3: 0x9C0D, - 0xF5E4: 0x4E11, - 0xF5E5: 0x755C, - 0xF5E6: 0x795D, - 0xF5E7: 0x7AFA, - 0xF5E8: 0x7B51, - 0xF5E9: 0x7BC9, - 0xF5EA: 0x7E2E, - 0xF5EB: 0x84C4, - 0xF5EC: 0x8E59, - 0xF5ED: 0x8E74, - 0xF5EE: 0x8EF8, - 0xF5EF: 0x9010, - 0xF5F0: 0x6625, - 0xF5F1: 0x693F, - 0xF5F2: 0x7443, - 0xF5F3: 0x51FA, - 0xF5F4: 0x672E, - 0xF5F5: 0x9EDC, - 0xF5F6: 0x5145, - 0xF5F7: 0x5FE0, - 0xF5F8: 0x6C96, - 0xF5F9: 0x87F2, - 0xF5FA: 0x885D, - 0xF5FB: 0x8877, - 0xF5FC: 0x60B4, - 0xF5FD: 0x81B5, - 0xF5FE: 0x8403, - 0xF6A1: 0x8D05, - 0xF6A2: 0x53D6, - 0xF6A3: 0x5439, - 0xF6A4: 0x5634, - 0xF6A5: 0x5A36, - 0xF6A6: 0x5C31, - 0xF6A7: 0x708A, - 0xF6A8: 0x7FE0, - 0xF6A9: 0x805A, - 0xF6AA: 0x8106, - 0xF6AB: 0x81ED, - 0xF6AC: 0x8DA3, - 0xF6AD: 0x9189, - 0xF6AE: 0x9A5F, - 0xF6AF: 0x9DF2, - 0xF6B0: 0x5074, - 0xF6B1: 0x4EC4, - 0xF6B2: 0x53A0, - 0xF6B3: 0x60FB, - 0xF6B4: 0x6E2C, - 0xF6B5: 0x5C64, - 0xF6B6: 0x4F88, - 0xF6B7: 0x5024, - 0xF6B8: 0x55E4, - 0xF6B9: 0x5CD9, - 0xF6BA: 0x5E5F, - 0xF6BB: 0x6065, - 0xF6BC: 0x6894, - 0xF6BD: 0x6CBB, - 0xF6BE: 0x6DC4, - 0xF6BF: 0x71BE, - 0xF6C0: 0x75D4, - 0xF6C1: 0x75F4, - 0xF6C2: 0x7661, - 0xF6C3: 0x7A1A, - 0xF6C4: 0x7A49, - 0xF6C5: 0x7DC7, - 0xF6C6: 0x7DFB, - 0xF6C7: 0x7F6E, - 0xF6C8: 0x81F4, - 0xF6C9: 0x86A9, - 0xF6CA: 0x8F1C, - 0xF6CB: 0x96C9, - 0xF6CC: 0x99B3, - 0xF6CD: 0x9F52, - 0xF6CE: 0x5247, - 0xF6CF: 0x52C5, - 0xF6D0: 0x98ED, - 0xF6D1: 0x89AA, - 0xF6D2: 0x4E03, - 0xF6D3: 0x67D2, - 0xF6D4: 0x6F06, - 0xF6D5: 0x4FB5, - 0xF6D6: 0x5BE2, - 0xF6D7: 0x6795, - 0xF6D8: 0x6C88, - 0xF6D9: 0x6D78, - 0xF6DA: 0x741B, - 0xF6DB: 0x7827, - 0xF6DC: 0x91DD, - 0xF6DD: 0x937C, - 0xF6DE: 0x87C4, - 0xF6DF: 0x79E4, - 0xF6E0: 0x7A31, - 0xF6E1: 0x5FEB, - 0xF6E2: 0x4ED6, - 0xF6E3: 0x54A4, - 0xF6E4: 0x553E, - 0xF6E5: 0x58AE, - 0xF6E6: 0x59A5, - 0xF6E7: 0x60F0, - 0xF6E8: 0x6253, - 0xF6E9: 0x62D6, - 0xF6EA: 0x6736, - 0xF6EB: 0x6955, - 0xF6EC: 0x8235, - 0xF6ED: 0x9640, - 0xF6EE: 0x99B1, - 0xF6EF: 0x99DD, - 0xF6F0: 0x502C, - 0xF6F1: 0x5353, - 0xF6F2: 0x5544, - 0xF6F3: 0x577C, - 0xF6F4: 0xFA01, - 0xF6F5: 0x6258, - 0xF6F6: 0xFA02, - 0xF6F7: 0x64E2, - 0xF6F8: 0x666B, - 0xF6F9: 0x67DD, - 0xF6FA: 0x6FC1, - 0xF6FB: 0x6FEF, - 0xF6FC: 0x7422, - 0xF6FD: 0x7438, - 0xF6FE: 0x8A17, - 0xF7A1: 0x9438, - 0xF7A2: 0x5451, - 0xF7A3: 0x5606, - 0xF7A4: 0x5766, - 0xF7A5: 0x5F48, - 0xF7A6: 0x619A, - 0xF7A7: 0x6B4E, - 0xF7A8: 0x7058, - 0xF7A9: 0x70AD, - 0xF7AA: 0x7DBB, - 0xF7AB: 0x8A95, - 0xF7AC: 0x596A, - 0xF7AD: 0x812B, - 0xF7AE: 0x63A2, - 0xF7AF: 0x7708, - 0xF7B0: 0x803D, - 0xF7B1: 0x8CAA, - 0xF7B2: 0x5854, - 0xF7B3: 0x642D, - 0xF7B4: 0x69BB, - 0xF7B5: 0x5B95, - 0xF7B6: 0x5E11, - 0xF7B7: 0x6E6F, - 0xF7B8: 0xFA03, - 0xF7B9: 0x8569, - 0xF7BA: 0x514C, - 0xF7BB: 0x53F0, - 0xF7BC: 0x592A, - 0xF7BD: 0x6020, - 0xF7BE: 0x614B, - 0xF7BF: 0x6B86, - 0xF7C0: 0x6C70, - 0xF7C1: 0x6CF0, - 0xF7C2: 0x7B1E, - 0xF7C3: 0x80CE, - 0xF7C4: 0x82D4, - 0xF7C5: 0x8DC6, - 0xF7C6: 0x90B0, - 0xF7C7: 0x98B1, - 0xF7C8: 0xFA04, - 0xF7C9: 0x64C7, - 0xF7CA: 0x6FA4, - 0xF7CB: 0x6491, - 0xF7CC: 0x6504, - 0xF7CD: 0x514E, - 0xF7CE: 0x5410, - 0xF7CF: 0x571F, - 0xF7D0: 0x8A0E, - 0xF7D1: 0x615F, - 0xF7D2: 0x6876, - 0xF7D3: 0xFA05, - 0xF7D4: 0x75DB, - 0xF7D5: 0x7B52, - 0xF7D6: 0x7D71, - 0xF7D7: 0x901A, - 0xF7D8: 0x5806, - 0xF7D9: 0x69CC, - 0xF7DA: 0x817F, - 0xF7DB: 0x892A, - 0xF7DC: 0x9000, - 0xF7DD: 0x9839, - 0xF7DE: 0x5078, - 0xF7DF: 0x5957, - 0xF7E0: 0x59AC, - 0xF7E1: 0x6295, - 0xF7E2: 0x900F, - 0xF7E3: 0x9B2A, - 0xF7E4: 0x615D, - 0xF7E5: 0x7279, - 0xF7E6: 0x95D6, - 0xF7E7: 0x5761, - 0xF7E8: 0x5A46, - 0xF7E9: 0x5DF4, - 0xF7EA: 0x628A, - 0xF7EB: 0x64AD, - 0xF7EC: 0x64FA, - 0xF7ED: 0x6777, - 0xF7EE: 0x6CE2, - 0xF7EF: 0x6D3E, - 0xF7F0: 0x722C, - 0xF7F1: 0x7436, - 0xF7F2: 0x7834, - 0xF7F3: 0x7F77, - 0xF7F4: 0x82AD, - 0xF7F5: 0x8DDB, - 0xF7F6: 0x9817, - 0xF7F7: 0x5224, - 0xF7F8: 0x5742, - 0xF7F9: 0x677F, - 0xF7FA: 0x7248, - 0xF7FB: 0x74E3, - 0xF7FC: 0x8CA9, - 0xF7FD: 0x8FA6, - 0xF7FE: 0x9211, - 0xF8A1: 0x962A, - 0xF8A2: 0x516B, - 0xF8A3: 0x53ED, - 0xF8A4: 0x634C, - 0xF8A5: 0x4F69, - 0xF8A6: 0x5504, - 0xF8A7: 0x6096, - 0xF8A8: 0x6557, - 0xF8A9: 0x6C9B, - 0xF8AA: 0x6D7F, - 0xF8AB: 0x724C, - 0xF8AC: 0x72FD, - 0xF8AD: 0x7A17, - 0xF8AE: 0x8987, - 0xF8AF: 0x8C9D, - 0xF8B0: 0x5F6D, - 0xF8B1: 0x6F8E, - 0xF8B2: 0x70F9, - 0xF8B3: 0x81A8, - 0xF8B4: 0x610E, - 0xF8B5: 0x4FBF, - 0xF8B6: 0x504F, - 0xF8B7: 0x6241, - 0xF8B8: 0x7247, - 0xF8B9: 0x7BC7, - 0xF8BA: 0x7DE8, - 0xF8BB: 0x7FE9, - 0xF8BC: 0x904D, - 0xF8BD: 0x97AD, - 0xF8BE: 0x9A19, - 0xF8BF: 0x8CB6, - 0xF8C0: 0x576A, - 0xF8C1: 0x5E73, - 0xF8C2: 0x67B0, - 0xF8C3: 0x840D, - 0xF8C4: 0x8A55, - 0xF8C5: 0x5420, - 0xF8C6: 0x5B16, - 0xF8C7: 0x5E63, - 0xF8C8: 0x5EE2, - 0xF8C9: 0x5F0A, - 0xF8CA: 0x6583, - 0xF8CB: 0x80BA, - 0xF8CC: 0x853D, - 0xF8CD: 0x9589, - 0xF8CE: 0x965B, - 0xF8CF: 0x4F48, - 0xF8D0: 0x5305, - 0xF8D1: 0x530D, - 0xF8D2: 0x530F, - 0xF8D3: 0x5486, - 0xF8D4: 0x54FA, - 0xF8D5: 0x5703, - 0xF8D6: 0x5E03, - 0xF8D7: 0x6016, - 0xF8D8: 0x629B, - 0xF8D9: 0x62B1, - 0xF8DA: 0x6355, - 0xF8DB: 0xFA06, - 0xF8DC: 0x6CE1, - 0xF8DD: 0x6D66, - 0xF8DE: 0x75B1, - 0xF8DF: 0x7832, - 0xF8E0: 0x80DE, - 0xF8E1: 0x812F, - 0xF8E2: 0x82DE, - 0xF8E3: 0x8461, - 0xF8E4: 0x84B2, - 0xF8E5: 0x888D, - 0xF8E6: 0x8912, - 0xF8E7: 0x900B, - 0xF8E8: 0x92EA, - 0xF8E9: 0x98FD, - 0xF8EA: 0x9B91, - 0xF8EB: 0x5E45, - 0xF8EC: 0x66B4, - 0xF8ED: 0x66DD, - 0xF8EE: 0x7011, - 0xF8EF: 0x7206, - 0xF8F0: 0xFA07, - 0xF8F1: 0x4FF5, - 0xF8F2: 0x527D, - 0xF8F3: 0x5F6A, - 0xF8F4: 0x6153, - 0xF8F5: 0x6753, - 0xF8F6: 0x6A19, - 0xF8F7: 0x6F02, - 0xF8F8: 0x74E2, - 0xF8F9: 0x7968, - 0xF8FA: 0x8868, - 0xF8FB: 0x8C79, - 0xF8FC: 0x98C7, - 0xF8FD: 0x98C4, - 0xF8FE: 0x9A43, - 0xF9A1: 0x54C1, - 0xF9A2: 0x7A1F, - 0xF9A3: 0x6953, - 0xF9A4: 0x8AF7, - 0xF9A5: 0x8C4A, - 0xF9A6: 0x98A8, - 0xF9A7: 0x99AE, - 0xF9A8: 0x5F7C, - 0xF9A9: 0x62AB, - 0xF9AA: 0x75B2, - 0xF9AB: 0x76AE, - 0xF9AC: 0x88AB, - 0xF9AD: 0x907F, - 0xF9AE: 0x9642, - 0xF9AF: 0x5339, - 0xF9B0: 0x5F3C, - 0xF9B1: 0x5FC5, - 0xF9B2: 0x6CCC, - 0xF9B3: 0x73CC, - 0xF9B4: 0x7562, - 0xF9B5: 0x758B, - 0xF9B6: 0x7B46, - 0xF9B7: 0x82FE, - 0xF9B8: 0x999D, - 0xF9B9: 0x4E4F, - 0xF9BA: 0x903C, - 0xF9BB: 0x4E0B, - 0xF9BC: 0x4F55, - 0xF9BD: 0x53A6, - 0xF9BE: 0x590F, - 0xF9BF: 0x5EC8, - 0xF9C0: 0x6630, - 0xF9C1: 0x6CB3, - 0xF9C2: 0x7455, - 0xF9C3: 0x8377, - 0xF9C4: 0x8766, - 0xF9C5: 0x8CC0, - 0xF9C6: 0x9050, - 0xF9C7: 0x971E, - 0xF9C8: 0x9C15, - 0xF9C9: 0x58D1, - 0xF9CA: 0x5B78, - 0xF9CB: 0x8650, - 0xF9CC: 0x8B14, - 0xF9CD: 0x9DB4, - 0xF9CE: 0x5BD2, - 0xF9CF: 0x6068, - 0xF9D0: 0x608D, - 0xF9D1: 0x65F1, - 0xF9D2: 0x6C57, - 0xF9D3: 0x6F22, - 0xF9D4: 0x6FA3, - 0xF9D5: 0x701A, - 0xF9D6: 0x7F55, - 0xF9D7: 0x7FF0, - 0xF9D8: 0x9591, - 0xF9D9: 0x9592, - 0xF9DA: 0x9650, - 0xF9DB: 0x97D3, - 0xF9DC: 0x5272, - 0xF9DD: 0x8F44, - 0xF9DE: 0x51FD, - 0xF9DF: 0x542B, - 0xF9E0: 0x54B8, - 0xF9E1: 0x5563, - 0xF9E2: 0x558A, - 0xF9E3: 0x6ABB, - 0xF9E4: 0x6DB5, - 0xF9E5: 0x7DD8, - 0xF9E6: 0x8266, - 0xF9E7: 0x929C, - 0xF9E8: 0x9677, - 0xF9E9: 0x9E79, - 0xF9EA: 0x5408, - 0xF9EB: 0x54C8, - 0xF9EC: 0x76D2, - 0xF9ED: 0x86E4, - 0xF9EE: 0x95A4, - 0xF9EF: 0x95D4, - 0xF9F0: 0x965C, - 0xF9F1: 0x4EA2, - 0xF9F2: 0x4F09, - 0xF9F3: 0x59EE, - 0xF9F4: 0x5AE6, - 0xF9F5: 0x5DF7, - 0xF9F6: 0x6052, - 0xF9F7: 0x6297, - 0xF9F8: 0x676D, - 0xF9F9: 0x6841, - 0xF9FA: 0x6C86, - 0xF9FB: 0x6E2F, - 0xF9FC: 0x7F38, - 0xF9FD: 0x809B, - 0xF9FE: 0x822A, - 0xFAA1: 0xFA08, - 0xFAA2: 0xFA09, - 0xFAA3: 0x9805, - 0xFAA4: 0x4EA5, - 0xFAA5: 0x5055, - 0xFAA6: 0x54B3, - 0xFAA7: 0x5793, - 0xFAA8: 0x595A, - 0xFAA9: 0x5B69, - 0xFAAA: 0x5BB3, - 0xFAAB: 0x61C8, - 0xFAAC: 0x6977, - 0xFAAD: 0x6D77, - 0xFAAE: 0x7023, - 0xFAAF: 0x87F9, - 0xFAB0: 0x89E3, - 0xFAB1: 0x8A72, - 0xFAB2: 0x8AE7, - 0xFAB3: 0x9082, - 0xFAB4: 0x99ED, - 0xFAB5: 0x9AB8, - 0xFAB6: 0x52BE, - 0xFAB7: 0x6838, - 0xFAB8: 0x5016, - 0xFAB9: 0x5E78, - 0xFABA: 0x674F, - 0xFABB: 0x8347, - 0xFABC: 0x884C, - 0xFABD: 0x4EAB, - 0xFABE: 0x5411, - 0xFABF: 0x56AE, - 0xFAC0: 0x73E6, - 0xFAC1: 0x9115, - 0xFAC2: 0x97FF, - 0xFAC3: 0x9909, - 0xFAC4: 0x9957, - 0xFAC5: 0x9999, - 0xFAC6: 0x5653, - 0xFAC7: 0x589F, - 0xFAC8: 0x865B, - 0xFAC9: 0x8A31, - 0xFACA: 0x61B2, - 0xFACB: 0x6AF6, - 0xFACC: 0x737B, - 0xFACD: 0x8ED2, - 0xFACE: 0x6B47, - 0xFACF: 0x96AA, - 0xFAD0: 0x9A57, - 0xFAD1: 0x5955, - 0xFAD2: 0x7200, - 0xFAD3: 0x8D6B, - 0xFAD4: 0x9769, - 0xFAD5: 0x4FD4, - 0xFAD6: 0x5CF4, - 0xFAD7: 0x5F26, - 0xFAD8: 0x61F8, - 0xFAD9: 0x665B, - 0xFADA: 0x6CEB, - 0xFADB: 0x70AB, - 0xFADC: 0x7384, - 0xFADD: 0x73B9, - 0xFADE: 0x73FE, - 0xFADF: 0x7729, - 0xFAE0: 0x774D, - 0xFAE1: 0x7D43, - 0xFAE2: 0x7D62, - 0xFAE3: 0x7E23, - 0xFAE4: 0x8237, - 0xFAE5: 0x8852, - 0xFAE6: 0xFA0A, - 0xFAE7: 0x8CE2, - 0xFAE8: 0x9249, - 0xFAE9: 0x986F, - 0xFAEA: 0x5B51, - 0xFAEB: 0x7A74, - 0xFAEC: 0x8840, - 0xFAED: 0x9801, - 0xFAEE: 0x5ACC, - 0xFAEF: 0x4FE0, - 0xFAF0: 0x5354, - 0xFAF1: 0x593E, - 0xFAF2: 0x5CFD, - 0xFAF3: 0x633E, - 0xFAF4: 0x6D79, - 0xFAF5: 0x72F9, - 0xFAF6: 0x8105, - 0xFAF7: 0x8107, - 0xFAF8: 0x83A2, - 0xFAF9: 0x92CF, - 0xFAFA: 0x9830, - 0xFAFB: 0x4EA8, - 0xFAFC: 0x5144, - 0xFAFD: 0x5211, - 0xFAFE: 0x578B, - 0xFBA1: 0x5F62, - 0xFBA2: 0x6CC2, - 0xFBA3: 0x6ECE, - 0xFBA4: 0x7005, - 0xFBA5: 0x7050, - 0xFBA6: 0x70AF, - 0xFBA7: 0x7192, - 0xFBA8: 0x73E9, - 0xFBA9: 0x7469, - 0xFBAA: 0x834A, - 0xFBAB: 0x87A2, - 0xFBAC: 0x8861, - 0xFBAD: 0x9008, - 0xFBAE: 0x90A2, - 0xFBAF: 0x93A3, - 0xFBB0: 0x99A8, - 0xFBB1: 0x516E, - 0xFBB2: 0x5F57, - 0xFBB3: 0x60E0, - 0xFBB4: 0x6167, - 0xFBB5: 0x66B3, - 0xFBB6: 0x8559, - 0xFBB7: 0x8E4A, - 0xFBB8: 0x91AF, - 0xFBB9: 0x978B, - 0xFBBA: 0x4E4E, - 0xFBBB: 0x4E92, - 0xFBBC: 0x547C, - 0xFBBD: 0x58D5, - 0xFBBE: 0x58FA, - 0xFBBF: 0x597D, - 0xFBC0: 0x5CB5, - 0xFBC1: 0x5F27, - 0xFBC2: 0x6236, - 0xFBC3: 0x6248, - 0xFBC4: 0x660A, - 0xFBC5: 0x6667, - 0xFBC6: 0x6BEB, - 0xFBC7: 0x6D69, - 0xFBC8: 0x6DCF, - 0xFBC9: 0x6E56, - 0xFBCA: 0x6EF8, - 0xFBCB: 0x6F94, - 0xFBCC: 0x6FE0, - 0xFBCD: 0x6FE9, - 0xFBCE: 0x705D, - 0xFBCF: 0x72D0, - 0xFBD0: 0x7425, - 0xFBD1: 0x745A, - 0xFBD2: 0x74E0, - 0xFBD3: 0x7693, - 0xFBD4: 0x795C, - 0xFBD5: 0x7CCA, - 0xFBD6: 0x7E1E, - 0xFBD7: 0x80E1, - 0xFBD8: 0x82A6, - 0xFBD9: 0x846B, - 0xFBDA: 0x84BF, - 0xFBDB: 0x864E, - 0xFBDC: 0x865F, - 0xFBDD: 0x8774, - 0xFBDE: 0x8B77, - 0xFBDF: 0x8C6A, - 0xFBE0: 0x93AC, - 0xFBE1: 0x9800, - 0xFBE2: 0x9865, - 0xFBE3: 0x60D1, - 0xFBE4: 0x6216, - 0xFBE5: 0x9177, - 0xFBE6: 0x5A5A, - 0xFBE7: 0x660F, - 0xFBE8: 0x6DF7, - 0xFBE9: 0x6E3E, - 0xFBEA: 0x743F, - 0xFBEB: 0x9B42, - 0xFBEC: 0x5FFD, - 0xFBED: 0x60DA, - 0xFBEE: 0x7B0F, - 0xFBEF: 0x54C4, - 0xFBF0: 0x5F18, - 0xFBF1: 0x6C5E, - 0xFBF2: 0x6CD3, - 0xFBF3: 0x6D2A, - 0xFBF4: 0x70D8, - 0xFBF5: 0x7D05, - 0xFBF6: 0x8679, - 0xFBF7: 0x8A0C, - 0xFBF8: 0x9D3B, - 0xFBF9: 0x5316, - 0xFBFA: 0x548C, - 0xFBFB: 0x5B05, - 0xFBFC: 0x6A3A, - 0xFBFD: 0x706B, - 0xFBFE: 0x7575, - 0xFCA1: 0x798D, - 0xFCA2: 0x79BE, - 0xFCA3: 0x82B1, - 0xFCA4: 0x83EF, - 0xFCA5: 0x8A71, - 0xFCA6: 0x8B41, - 0xFCA7: 0x8CA8, - 0xFCA8: 0x9774, - 0xFCA9: 0xFA0B, - 0xFCAA: 0x64F4, - 0xFCAB: 0x652B, - 0xFCAC: 0x78BA, - 0xFCAD: 0x78BB, - 0xFCAE: 0x7A6B, - 0xFCAF: 0x4E38, - 0xFCB0: 0x559A, - 0xFCB1: 0x5950, - 0xFCB2: 0x5BA6, - 0xFCB3: 0x5E7B, - 0xFCB4: 0x60A3, - 0xFCB5: 0x63DB, - 0xFCB6: 0x6B61, - 0xFCB7: 0x6665, - 0xFCB8: 0x6853, - 0xFCB9: 0x6E19, - 0xFCBA: 0x7165, - 0xFCBB: 0x74B0, - 0xFCBC: 0x7D08, - 0xFCBD: 0x9084, - 0xFCBE: 0x9A69, - 0xFCBF: 0x9C25, - 0xFCC0: 0x6D3B, - 0xFCC1: 0x6ED1, - 0xFCC2: 0x733E, - 0xFCC3: 0x8C41, - 0xFCC4: 0x95CA, - 0xFCC5: 0x51F0, - 0xFCC6: 0x5E4C, - 0xFCC7: 0x5FA8, - 0xFCC8: 0x604D, - 0xFCC9: 0x60F6, - 0xFCCA: 0x6130, - 0xFCCB: 0x614C, - 0xFCCC: 0x6643, - 0xFCCD: 0x6644, - 0xFCCE: 0x69A5, - 0xFCCF: 0x6CC1, - 0xFCD0: 0x6E5F, - 0xFCD1: 0x6EC9, - 0xFCD2: 0x6F62, - 0xFCD3: 0x714C, - 0xFCD4: 0x749C, - 0xFCD5: 0x7687, - 0xFCD6: 0x7BC1, - 0xFCD7: 0x7C27, - 0xFCD8: 0x8352, - 0xFCD9: 0x8757, - 0xFCDA: 0x9051, - 0xFCDB: 0x968D, - 0xFCDC: 0x9EC3, - 0xFCDD: 0x532F, - 0xFCDE: 0x56DE, - 0xFCDF: 0x5EFB, - 0xFCE0: 0x5F8A, - 0xFCE1: 0x6062, - 0xFCE2: 0x6094, - 0xFCE3: 0x61F7, - 0xFCE4: 0x6666, - 0xFCE5: 0x6703, - 0xFCE6: 0x6A9C, - 0xFCE7: 0x6DEE, - 0xFCE8: 0x6FAE, - 0xFCE9: 0x7070, - 0xFCEA: 0x736A, - 0xFCEB: 0x7E6A, - 0xFCEC: 0x81BE, - 0xFCED: 0x8334, - 0xFCEE: 0x86D4, - 0xFCEF: 0x8AA8, - 0xFCF0: 0x8CC4, - 0xFCF1: 0x5283, - 0xFCF2: 0x7372, - 0xFCF3: 0x5B96, - 0xFCF4: 0x6A6B, - 0xFCF5: 0x9404, - 0xFCF6: 0x54EE, - 0xFCF7: 0x5686, - 0xFCF8: 0x5B5D, - 0xFCF9: 0x6548, - 0xFCFA: 0x6585, - 0xFCFB: 0x66C9, - 0xFCFC: 0x689F, - 0xFCFD: 0x6D8D, - 0xFCFE: 0x6DC6, - 0xFDA1: 0x723B, - 0xFDA2: 0x80B4, - 0xFDA3: 0x9175, - 0xFDA4: 0x9A4D, - 0xFDA5: 0x4FAF, - 0xFDA6: 0x5019, - 0xFDA7: 0x539A, - 0xFDA8: 0x540E, - 0xFDA9: 0x543C, - 0xFDAA: 0x5589, - 0xFDAB: 0x55C5, - 0xFDAC: 0x5E3F, - 0xFDAD: 0x5F8C, - 0xFDAE: 0x673D, - 0xFDAF: 0x7166, - 0xFDB0: 0x73DD, - 0xFDB1: 0x9005, - 0xFDB2: 0x52DB, - 0xFDB3: 0x52F3, - 0xFDB4: 0x5864, - 0xFDB5: 0x58CE, - 0xFDB6: 0x7104, - 0xFDB7: 0x718F, - 0xFDB8: 0x71FB, - 0xFDB9: 0x85B0, - 0xFDBA: 0x8A13, - 0xFDBB: 0x6688, - 0xFDBC: 0x85A8, - 0xFDBD: 0x55A7, - 0xFDBE: 0x6684, - 0xFDBF: 0x714A, - 0xFDC0: 0x8431, - 0xFDC1: 0x5349, - 0xFDC2: 0x5599, - 0xFDC3: 0x6BC1, - 0xFDC4: 0x5F59, - 0xFDC5: 0x5FBD, - 0xFDC6: 0x63EE, - 0xFDC7: 0x6689, - 0xFDC8: 0x7147, - 0xFDC9: 0x8AF1, - 0xFDCA: 0x8F1D, - 0xFDCB: 0x9EBE, - 0xFDCC: 0x4F11, - 0xFDCD: 0x643A, - 0xFDCE: 0x70CB, - 0xFDCF: 0x7566, - 0xFDD0: 0x8667, - 0xFDD1: 0x6064, - 0xFDD2: 0x8B4E, - 0xFDD3: 0x9DF8, - 0xFDD4: 0x5147, - 0xFDD5: 0x51F6, - 0xFDD6: 0x5308, - 0xFDD7: 0x6D36, - 0xFDD8: 0x80F8, - 0xFDD9: 0x9ED1, - 0xFDDA: 0x6615, - 0xFDDB: 0x6B23, - 0xFDDC: 0x7098, - 0xFDDD: 0x75D5, - 0xFDDE: 0x5403, - 0xFDDF: 0x5C79, - 0xFDE0: 0x7D07, - 0xFDE1: 0x8A16, - 0xFDE2: 0x6B20, - 0xFDE3: 0x6B3D, - 0xFDE4: 0x6B46, - 0xFDE5: 0x5438, - 0xFDE6: 0x6070, - 0xFDE7: 0x6D3D, - 0xFDE8: 0x7FD5, - 0xFDE9: 0x8208, - 0xFDEA: 0x50D6, - 0xFDEB: 0x51DE, - 0xFDEC: 0x559C, - 0xFDED: 0x566B, - 0xFDEE: 0x56CD, - 0xFDEF: 0x59EC, - 0xFDF0: 0x5B09, - 0xFDF1: 0x5E0C, - 0xFDF2: 0x6199, - 0xFDF3: 0x6198, - 0xFDF4: 0x6231, - 0xFDF5: 0x665E, - 0xFDF6: 0x66E6, - 0xFDF7: 0x7199, - 0xFDF8: 0x71B9, - 0xFDF9: 0x71BA, - 0xFDFA: 0x72A7, - 0xFDFB: 0x79A7, - 0xFDFC: 0x7A00, - 0xFDFD: 0x7FB2, - 0xFDFE: 0x8A70, -} diff --git a/vendor/github.com/Tang-RoseChild/mahonia/euc-kr.go b/vendor/github.com/Tang-RoseChild/mahonia/euc-kr.go deleted file mode 100644 index 10147c4ed..000000000 --- a/vendor/github.com/Tang-RoseChild/mahonia/euc-kr.go +++ /dev/null @@ -1,89 +0,0 @@ -package mahonia - -// Converters for the EUC-KR encoding. - -import ( - "unicode/utf8" -) - -func init() { - RegisterCharset(&Charset{ - Name: "EUC-KR", - Aliases: []string{ - "ibm-1363", - "KS_C_5601-1987", - "KS_C_5601-1989", - "KSC_5601", - "Korean", - "iso-ir-149", - "cp1363", - "5601", - "ksc", - "windows-949", - "ibm-970", - "cp970", - "970", - "cp949", - }, - NewDecoder: func() Decoder { - return decodeEucKr - }, - NewEncoder: func() Encoder { - eucKrOnce.Do(reverseEucKrTable) - return encodeEucKr - }, - }) -} - -func decodeEucKr(p []byte) (c rune, size int, status Status) { - if len(p) == 0 { - return 0, 0, NO_ROOM - } - - b := p[0] - if b < 0x80 { - return rune(b), 1, SUCCESS - } - - if len(p) < 2 { - return 0, 0, NO_ROOM - } - - euc := int(b)<<8 + int(p[1]) - c = rune(eucKrToUnicode[euc]) - - if c == 0 { - return utf8.RuneError, 2, INVALID_CHAR - } - return c, 2, SUCCESS -} - -func encodeEucKr(p []byte, c rune) (size int, status Status) { - if len(p) == 0 { - return 0, NO_ROOM - } - - if c < 0x80 { - p[0] = byte(c) - return 1, SUCCESS - } - - if len(p) < 2 { - return 0, NO_ROOM - } - - if c > 0xffff { - p[0] = '?' - return 1, INVALID_CHAR - } - - euc := unicodeToEucKr[c] - if euc == 0 { - p[0] = '?' - return 1, INVALID_CHAR - } - - p[0] = byte(euc >> 8) - p[1] = byte(euc) - return 2, SUCCESS -} diff --git a/vendor/github.com/Tang-RoseChild/mahonia/fallback.go b/vendor/github.com/Tang-RoseChild/mahonia/fallback.go deleted file mode 100644 index 27259c5d7..000000000 --- a/vendor/github.com/Tang-RoseChild/mahonia/fallback.go +++ /dev/null @@ -1,19 +0,0 @@ -package mahonia - -// FallbackDecoder combines a series of Decoders into one. -// If the first Decoder returns a status of INVALID_CHAR, the others are tried as well. -// -// Note: if the text to be decoded ends with a sequence of bytes that is not a valid character in the first charset, -// but it could be the beginning of a valid character, the FallbackDecoder will give a status of NO_ROOM instead of -// falling back to the other Decoders. -func FallbackDecoder(decoders ...Decoder) Decoder { - return func(p []byte) (c rune, size int, status Status) { - for _, d := range decoders { - c, size, status = d(p) - if status != INVALID_CHAR { - return - } - } - return 0, 1, INVALID_CHAR - } -} diff --git a/vendor/github.com/Tang-RoseChild/mahonia/gb18030-data.go b/vendor/github.com/Tang-RoseChild/mahonia/gb18030-data.go deleted file mode 100644 index a63289b71..000000000 --- a/vendor/github.com/Tang-RoseChild/mahonia/gb18030-data.go +++ /dev/null @@ -1,6839 +0,0 @@ -package mahonia - -// Data tables for 4-byte characters in GB18030 encoding. -// Based on http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/gb-18030-2005.ucm - -// gb18030Linear converts a 32-bit big-endian representation of a 4-byte -// character into a linearly-increasing integer, starting from the base -// sequence of 0x81308130 -func gb18030Linear(g uint32) uint32 { - lin := g>>24 - 0x81 - lin = lin*10 + (g>>16)&0xff - 0x30 - lin = lin*126 + (g>>8)&0xff - 0x81 - lin = lin*10 + g&0xff - 0x30 - return lin -} - -// Equivalent ranges between GB18030 and Unicode. -var gb18030Ranges = []struct { - firstRune, lastRune rune - firstGB, lastGB uint32 -}{ - {0x10000, 0x10FFFF, gb18030Linear(0x90308130), gb18030Linear(0xE3329A35)}, - {0x9FA6, 0xD7FF, gb18030Linear(0x82358F33), gb18030Linear(0x8336C738)}, - {0x0452, 0x200F, gb18030Linear(0x8130D330), gb18030Linear(0x8136A531)}, - {0xE865, 0xF92B, gb18030Linear(0x8336D030), gb18030Linear(0x84308534)}, - {0x2643, 0x2E80, gb18030Linear(0x8137A839), gb18030Linear(0x8138FD38)}, - {0xFA2A, 0xFE2F, gb18030Linear(0x84309C38), gb18030Linear(0x84318537)}, - {0x3CE1, 0x4055, gb18030Linear(0x8231D438), gb18030Linear(0x8232AF32)}, - {0x361B, 0x3917, gb18030Linear(0x8230A633), gb18030Linear(0x8230F237)}, - {0x49B8, 0x4C76, gb18030Linear(0x8234A131), gb18030Linear(0x8234E733)}, - {0x4160, 0x4336, gb18030Linear(0x8232C937), gb18030Linear(0x8232F837)}, - {0x478E, 0x4946, gb18030Linear(0x8233E838), gb18030Linear(0x82349638)}, - {0x44D7, 0x464B, gb18030Linear(0x8233A339), gb18030Linear(0x8233C931)}, - {0xFFE6, 0xFFFF, gb18030Linear(0x8431A234), gb18030Linear(0x8431A439)}, -} - -// The higest value returned by gb18030Linear for characters in gb18030Data -const maxGB18030Linear = 39393 - -// Unicode equivalents for characters not handled algorithmically. -var gb18030Data = []struct { - unicode uint16 - gb18030 uint32 -}{ - {0x0080, 0x81308130}, - {0x0081, 0x81308131}, - {0x0082, 0x81308132}, - {0x0083, 0x81308133}, - {0x0084, 0x81308134}, - {0x0085, 0x81308135}, - {0x0086, 0x81308136}, - {0x0087, 0x81308137}, - {0x0088, 0x81308138}, - {0x0089, 0x81308139}, - {0x008A, 0x81308230}, - {0x008B, 0x81308231}, - {0x008C, 0x81308232}, - {0x008D, 0x81308233}, - {0x008E, 0x81308234}, - {0x008F, 0x81308235}, - {0x0090, 0x81308236}, - {0x0091, 0x81308237}, - {0x0092, 0x81308238}, - {0x0093, 0x81308239}, - {0x0094, 0x81308330}, - {0x0095, 0x81308331}, - {0x0096, 0x81308332}, - {0x0097, 0x81308333}, - {0x0098, 0x81308334}, - {0x0099, 0x81308335}, - {0x009A, 0x81308336}, - {0x009B, 0x81308337}, - {0x009C, 0x81308338}, - {0x009D, 0x81308339}, - {0x009E, 0x81308430}, - {0x009F, 0x81308431}, - {0x00A0, 0x81308432}, - {0x00A1, 0x81308433}, - {0x00A2, 0x81308434}, - {0x00A3, 0x81308435}, - {0x00A5, 0x81308436}, - {0x00A6, 0x81308437}, - {0x00A9, 0x81308438}, - {0x00AA, 0x81308439}, - {0x00AB, 0x81308530}, - {0x00AC, 0x81308531}, - {0x00AD, 0x81308532}, - {0x00AE, 0x81308533}, - {0x00AF, 0x81308534}, - {0x00B2, 0x81308535}, - {0x00B3, 0x81308536}, - {0x00B4, 0x81308537}, - {0x00B5, 0x81308538}, - {0x00B6, 0x81308539}, - {0x00B8, 0x81308630}, - {0x00B9, 0x81308631}, - {0x00BA, 0x81308632}, - {0x00BB, 0x81308633}, - {0x00BC, 0x81308634}, - {0x00BD, 0x81308635}, - {0x00BE, 0x81308636}, - {0x00BF, 0x81308637}, - {0x00C0, 0x81308638}, - {0x00C1, 0x81308639}, - {0x00C2, 0x81308730}, - {0x00C3, 0x81308731}, - {0x00C4, 0x81308732}, - {0x00C5, 0x81308733}, - {0x00C6, 0x81308734}, - {0x00C7, 0x81308735}, - {0x00C8, 0x81308736}, - {0x00C9, 0x81308737}, - {0x00CA, 0x81308738}, - {0x00CB, 0x81308739}, - {0x00CC, 0x81308830}, - {0x00CD, 0x81308831}, - {0x00CE, 0x81308832}, - {0x00CF, 0x81308833}, - {0x00D0, 0x81308834}, - {0x00D1, 0x81308835}, - {0x00D2, 0x81308836}, - {0x00D3, 0x81308837}, - {0x00D4, 0x81308838}, - {0x00D5, 0x81308839}, - {0x00D6, 0x81308930}, - {0x00D8, 0x81308931}, - {0x00D9, 0x81308932}, - {0x00DA, 0x81308933}, - {0x00DB, 0x81308934}, - {0x00DC, 0x81308935}, - {0x00DD, 0x81308936}, - {0x00DE, 0x81308937}, - {0x00DF, 0x81308938}, - {0x00E2, 0x81308939}, - {0x00E3, 0x81308A30}, - {0x00E4, 0x81308A31}, - {0x00E5, 0x81308A32}, - {0x00E6, 0x81308A33}, - {0x00E7, 0x81308A34}, - {0x00EB, 0x81308A35}, - {0x00EE, 0x81308A36}, - {0x00EF, 0x81308A37}, - {0x00F0, 0x81308A38}, - {0x00F1, 0x81308A39}, - {0x00F4, 0x81308B30}, - {0x00F5, 0x81308B31}, - {0x00F6, 0x81308B32}, - {0x00F8, 0x81308B33}, - {0x00FB, 0x81308B34}, - {0x00FD, 0x81308B35}, - {0x00FE, 0x81308B36}, - {0x00FF, 0x81308B37}, - {0x0100, 0x81308B38}, - {0x0102, 0x81308B39}, - {0x0103, 0x81308C30}, - {0x0104, 0x81308C31}, - {0x0105, 0x81308C32}, - {0x0106, 0x81308C33}, - {0x0107, 0x81308C34}, - {0x0108, 0x81308C35}, - {0x0109, 0x81308C36}, - {0x010A, 0x81308C37}, - {0x010B, 0x81308C38}, - {0x010C, 0x81308C39}, - {0x010D, 0x81308D30}, - {0x010E, 0x81308D31}, - {0x010F, 0x81308D32}, - {0x0110, 0x81308D33}, - {0x0111, 0x81308D34}, - {0x0112, 0x81308D35}, - {0x0114, 0x81308D36}, - {0x0115, 0x81308D37}, - {0x0116, 0x81308D38}, - {0x0117, 0x81308D39}, - {0x0118, 0x81308E30}, - {0x0119, 0x81308E31}, - {0x011A, 0x81308E32}, - {0x011C, 0x81308E33}, - {0x011D, 0x81308E34}, - {0x011E, 0x81308E35}, - {0x011F, 0x81308E36}, - {0x0120, 0x81308E37}, - {0x0121, 0x81308E38}, - {0x0122, 0x81308E39}, - {0x0123, 0x81308F30}, - {0x0124, 0x81308F31}, - {0x0125, 0x81308F32}, - {0x0126, 0x81308F33}, - {0x0127, 0x81308F34}, - {0x0128, 0x81308F35}, - {0x0129, 0x81308F36}, - {0x012A, 0x81308F37}, - {0x012C, 0x81308F38}, - {0x012D, 0x81308F39}, - {0x012E, 0x81309030}, - {0x012F, 0x81309031}, - {0x0130, 0x81309032}, - {0x0131, 0x81309033}, - {0x0132, 0x81309034}, - {0x0133, 0x81309035}, - {0x0134, 0x81309036}, - {0x0135, 0x81309037}, - {0x0136, 0x81309038}, - {0x0137, 0x81309039}, - {0x0138, 0x81309130}, - {0x0139, 0x81309131}, - {0x013A, 0x81309132}, - {0x013B, 0x81309133}, - {0x013C, 0x81309134}, - {0x013D, 0x81309135}, - {0x013E, 0x81309136}, - {0x013F, 0x81309137}, - {0x0140, 0x81309138}, - {0x0141, 0x81309139}, - {0x0142, 0x81309230}, - {0x0143, 0x81309231}, - {0x0145, 0x81309232}, - {0x0146, 0x81309233}, - {0x0147, 0x81309234}, - {0x0149, 0x81309235}, - {0x014A, 0x81309236}, - {0x014B, 0x81309237}, - {0x014C, 0x81309238}, - {0x014E, 0x81309239}, - {0x014F, 0x81309330}, - {0x0150, 0x81309331}, - {0x0151, 0x81309332}, - {0x0152, 0x81309333}, - {0x0153, 0x81309334}, - {0x0154, 0x81309335}, - {0x0155, 0x81309336}, - {0x0156, 0x81309337}, - {0x0157, 0x81309338}, - {0x0158, 0x81309339}, - {0x0159, 0x81309430}, - {0x015A, 0x81309431}, - {0x015B, 0x81309432}, - {0x015C, 0x81309433}, - {0x015D, 0x81309434}, - {0x015E, 0x81309435}, - {0x015F, 0x81309436}, - {0x0160, 0x81309437}, - {0x0161, 0x81309438}, - {0x0162, 0x81309439}, - {0x0163, 0x81309530}, - {0x0164, 0x81309531}, - {0x0165, 0x81309532}, - {0x0166, 0x81309533}, - {0x0167, 0x81309534}, - {0x0168, 0x81309535}, - {0x0169, 0x81309536}, - {0x016A, 0x81309537}, - {0x016C, 0x81309538}, - {0x016D, 0x81309539}, - {0x016E, 0x81309630}, - {0x016F, 0x81309631}, - {0x0170, 0x81309632}, - {0x0171, 0x81309633}, - {0x0172, 0x81309634}, - {0x0173, 0x81309635}, - {0x0174, 0x81309636}, - {0x0175, 0x81309637}, - {0x0176, 0x81309638}, - {0x0177, 0x81309639}, - {0x0178, 0x81309730}, - {0x0179, 0x81309731}, - {0x017A, 0x81309732}, - {0x017B, 0x81309733}, - {0x017C, 0x81309734}, - {0x017D, 0x81309735}, - {0x017E, 0x81309736}, - {0x017F, 0x81309737}, - {0x0180, 0x81309738}, - {0x0181, 0x81309739}, - {0x0182, 0x81309830}, - {0x0183, 0x81309831}, - {0x0184, 0x81309832}, - {0x0185, 0x81309833}, - {0x0186, 0x81309834}, - {0x0187, 0x81309835}, - {0x0188, 0x81309836}, - {0x0189, 0x81309837}, - {0x018A, 0x81309838}, - {0x018B, 0x81309839}, - {0x018C, 0x81309930}, - {0x018D, 0x81309931}, - {0x018E, 0x81309932}, - {0x018F, 0x81309933}, - {0x0190, 0x81309934}, - {0x0191, 0x81309935}, - {0x0192, 0x81309936}, - {0x0193, 0x81309937}, - {0x0194, 0x81309938}, - {0x0195, 0x81309939}, - {0x0196, 0x81309A30}, - {0x0197, 0x81309A31}, - {0x0198, 0x81309A32}, - {0x0199, 0x81309A33}, - {0x019A, 0x81309A34}, - {0x019B, 0x81309A35}, - {0x019C, 0x81309A36}, - {0x019D, 0x81309A37}, - {0x019E, 0x81309A38}, - {0x019F, 0x81309A39}, - {0x01A0, 0x81309B30}, - {0x01A1, 0x81309B31}, - {0x01A2, 0x81309B32}, - {0x01A3, 0x81309B33}, - {0x01A4, 0x81309B34}, - {0x01A5, 0x81309B35}, - {0x01A6, 0x81309B36}, - {0x01A7, 0x81309B37}, - {0x01A8, 0x81309B38}, - {0x01A9, 0x81309B39}, - {0x01AA, 0x81309C30}, - {0x01AB, 0x81309C31}, - {0x01AC, 0x81309C32}, - {0x01AD, 0x81309C33}, - {0x01AE, 0x81309C34}, - {0x01AF, 0x81309C35}, - {0x01B0, 0x81309C36}, - {0x01B1, 0x81309C37}, - {0x01B2, 0x81309C38}, - {0x01B3, 0x81309C39}, - {0x01B4, 0x81309D30}, - {0x01B5, 0x81309D31}, - {0x01B6, 0x81309D32}, - {0x01B7, 0x81309D33}, - {0x01B8, 0x81309D34}, - {0x01B9, 0x81309D35}, - {0x01BA, 0x81309D36}, - {0x01BB, 0x81309D37}, - {0x01BC, 0x81309D38}, - {0x01BD, 0x81309D39}, - {0x01BE, 0x81309E30}, - {0x01BF, 0x81309E31}, - {0x01C0, 0x81309E32}, - {0x01C1, 0x81309E33}, - {0x01C2, 0x81309E34}, - {0x01C3, 0x81309E35}, - {0x01C4, 0x81309E36}, - {0x01C5, 0x81309E37}, - {0x01C6, 0x81309E38}, - {0x01C7, 0x81309E39}, - {0x01C8, 0x81309F30}, - {0x01C9, 0x81309F31}, - {0x01CA, 0x81309F32}, - {0x01CB, 0x81309F33}, - {0x01CC, 0x81309F34}, - {0x01CD, 0x81309F35}, - {0x01CF, 0x81309F36}, - {0x01D1, 0x81309F37}, - {0x01D3, 0x81309F38}, - {0x01D5, 0x81309F39}, - {0x01D7, 0x8130A030}, - {0x01D9, 0x8130A031}, - {0x01DB, 0x8130A032}, - {0x01DD, 0x8130A033}, - {0x01DE, 0x8130A034}, - {0x01DF, 0x8130A035}, - {0x01E0, 0x8130A036}, - {0x01E1, 0x8130A037}, - {0x01E2, 0x8130A038}, - {0x01E3, 0x8130A039}, - {0x01E4, 0x8130A130}, - {0x01E5, 0x8130A131}, - {0x01E6, 0x8130A132}, - {0x01E7, 0x8130A133}, - {0x01E8, 0x8130A134}, - {0x01E9, 0x8130A135}, - {0x01EA, 0x8130A136}, - {0x01EB, 0x8130A137}, - {0x01EC, 0x8130A138}, - {0x01ED, 0x8130A139}, - {0x01EE, 0x8130A230}, - {0x01EF, 0x8130A231}, - {0x01F0, 0x8130A232}, - {0x01F1, 0x8130A233}, - {0x01F2, 0x8130A234}, - {0x01F3, 0x8130A235}, - {0x01F4, 0x8130A236}, - {0x01F5, 0x8130A237}, - {0x01F6, 0x8130A238}, - {0x01F7, 0x8130A239}, - {0x01F8, 0x8130A330}, - {0x01FA, 0x8130A331}, - {0x01FB, 0x8130A332}, - {0x01FC, 0x8130A333}, - {0x01FD, 0x8130A334}, - {0x01FE, 0x8130A335}, - {0x01FF, 0x8130A336}, - {0x0200, 0x8130A337}, - {0x0201, 0x8130A338}, - {0x0202, 0x8130A339}, - {0x0203, 0x8130A430}, - {0x0204, 0x8130A431}, - {0x0205, 0x8130A432}, - {0x0206, 0x8130A433}, - {0x0207, 0x8130A434}, - {0x0208, 0x8130A435}, - {0x0209, 0x8130A436}, - {0x020A, 0x8130A437}, - {0x020B, 0x8130A438}, - {0x020C, 0x8130A439}, - {0x020D, 0x8130A530}, - {0x020E, 0x8130A531}, - {0x020F, 0x8130A532}, - {0x0210, 0x8130A533}, - {0x0211, 0x8130A534}, - {0x0212, 0x8130A535}, - {0x0213, 0x8130A536}, - {0x0214, 0x8130A537}, - {0x0215, 0x8130A538}, - {0x0216, 0x8130A539}, - {0x0217, 0x8130A630}, - {0x0218, 0x8130A631}, - {0x0219, 0x8130A632}, - {0x021A, 0x8130A633}, - {0x021B, 0x8130A634}, - {0x021C, 0x8130A635}, - {0x021D, 0x8130A636}, - {0x021E, 0x8130A637}, - {0x021F, 0x8130A638}, - {0x0220, 0x8130A639}, - {0x0221, 0x8130A730}, - {0x0222, 0x8130A731}, - {0x0223, 0x8130A732}, - {0x0224, 0x8130A733}, - {0x0225, 0x8130A734}, - {0x0226, 0x8130A735}, - {0x0227, 0x8130A736}, - {0x0228, 0x8130A737}, - {0x0229, 0x8130A738}, - {0x022A, 0x8130A739}, - {0x022B, 0x8130A830}, - {0x022C, 0x8130A831}, - {0x022D, 0x8130A832}, - {0x022E, 0x8130A833}, - {0x022F, 0x8130A834}, - {0x0230, 0x8130A835}, - {0x0231, 0x8130A836}, - {0x0232, 0x8130A837}, - {0x0233, 0x8130A838}, - {0x0234, 0x8130A839}, - {0x0235, 0x8130A930}, - {0x0236, 0x8130A931}, - {0x0237, 0x8130A932}, - {0x0238, 0x8130A933}, - {0x0239, 0x8130A934}, - {0x023A, 0x8130A935}, - {0x023B, 0x8130A936}, - {0x023C, 0x8130A937}, - {0x023D, 0x8130A938}, - {0x023E, 0x8130A939}, - {0x023F, 0x8130AA30}, - {0x0240, 0x8130AA31}, - {0x0241, 0x8130AA32}, - {0x0242, 0x8130AA33}, - {0x0243, 0x8130AA34}, - {0x0244, 0x8130AA35}, - {0x0245, 0x8130AA36}, - {0x0246, 0x8130AA37}, - {0x0247, 0x8130AA38}, - {0x0248, 0x8130AA39}, - {0x0249, 0x8130AB30}, - {0x024A, 0x8130AB31}, - {0x024B, 0x8130AB32}, - {0x024C, 0x8130AB33}, - {0x024D, 0x8130AB34}, - {0x024E, 0x8130AB35}, - {0x024F, 0x8130AB36}, - {0x0250, 0x8130AB37}, - {0x0252, 0x8130AB38}, - {0x0253, 0x8130AB39}, - {0x0254, 0x8130AC30}, - {0x0255, 0x8130AC31}, - {0x0256, 0x8130AC32}, - {0x0257, 0x8130AC33}, - {0x0258, 0x8130AC34}, - {0x0259, 0x8130AC35}, - {0x025A, 0x8130AC36}, - {0x025B, 0x8130AC37}, - {0x025C, 0x8130AC38}, - {0x025D, 0x8130AC39}, - {0x025E, 0x8130AD30}, - {0x025F, 0x8130AD31}, - {0x0260, 0x8130AD32}, - {0x0262, 0x8130AD33}, - {0x0263, 0x8130AD34}, - {0x0264, 0x8130AD35}, - {0x0265, 0x8130AD36}, - {0x0266, 0x8130AD37}, - {0x0267, 0x8130AD38}, - {0x0268, 0x8130AD39}, - {0x0269, 0x8130AE30}, - {0x026A, 0x8130AE31}, - {0x026B, 0x8130AE32}, - {0x026C, 0x8130AE33}, - {0x026D, 0x8130AE34}, - {0x026E, 0x8130AE35}, - {0x026F, 0x8130AE36}, - {0x0270, 0x8130AE37}, - {0x0271, 0x8130AE38}, - {0x0272, 0x8130AE39}, - {0x0273, 0x8130AF30}, - {0x0274, 0x8130AF31}, - {0x0275, 0x8130AF32}, - {0x0276, 0x8130AF33}, - {0x0277, 0x8130AF34}, - {0x0278, 0x8130AF35}, - {0x0279, 0x8130AF36}, - {0x027A, 0x8130AF37}, - {0x027B, 0x8130AF38}, - {0x027C, 0x8130AF39}, - {0x027D, 0x8130B030}, - {0x027E, 0x8130B031}, - {0x027F, 0x8130B032}, - {0x0280, 0x8130B033}, - {0x0281, 0x8130B034}, - {0x0282, 0x8130B035}, - {0x0283, 0x8130B036}, - {0x0284, 0x8130B037}, - {0x0285, 0x8130B038}, - {0x0286, 0x8130B039}, - {0x0287, 0x8130B130}, - {0x0288, 0x8130B131}, - {0x0289, 0x8130B132}, - {0x028A, 0x8130B133}, - {0x028B, 0x8130B134}, - {0x028C, 0x8130B135}, - {0x028D, 0x8130B136}, - {0x028E, 0x8130B137}, - {0x028F, 0x8130B138}, - {0x0290, 0x8130B139}, - {0x0291, 0x8130B230}, - {0x0292, 0x8130B231}, - {0x0293, 0x8130B232}, - {0x0294, 0x8130B233}, - {0x0295, 0x8130B234}, - {0x0296, 0x8130B235}, - {0x0297, 0x8130B236}, - {0x0298, 0x8130B237}, - {0x0299, 0x8130B238}, - {0x029A, 0x8130B239}, - {0x029B, 0x8130B330}, - {0x029C, 0x8130B331}, - {0x029D, 0x8130B332}, - {0x029E, 0x8130B333}, - {0x029F, 0x8130B334}, - {0x02A0, 0x8130B335}, - {0x02A1, 0x8130B336}, - {0x02A2, 0x8130B337}, - {0x02A3, 0x8130B338}, - {0x02A4, 0x8130B339}, - {0x02A5, 0x8130B430}, - {0x02A6, 0x8130B431}, - {0x02A7, 0x8130B432}, - {0x02A8, 0x8130B433}, - {0x02A9, 0x8130B434}, - {0x02AA, 0x8130B435}, - {0x02AB, 0x8130B436}, - {0x02AC, 0x8130B437}, - {0x02AD, 0x8130B438}, - {0x02AE, 0x8130B439}, - {0x02AF, 0x8130B530}, - {0x02B0, 0x8130B531}, - {0x02B1, 0x8130B532}, - {0x02B2, 0x8130B533}, - {0x02B3, 0x8130B534}, - {0x02B4, 0x8130B535}, - {0x02B5, 0x8130B536}, - {0x02B6, 0x8130B537}, - {0x02B7, 0x8130B538}, - {0x02B8, 0x8130B539}, - {0x02B9, 0x8130B630}, - {0x02BA, 0x8130B631}, - {0x02BB, 0x8130B632}, - {0x02BC, 0x8130B633}, - {0x02BD, 0x8130B634}, - {0x02BE, 0x8130B635}, - {0x02BF, 0x8130B636}, - {0x02C0, 0x8130B637}, - {0x02C1, 0x8130B638}, - {0x02C2, 0x8130B639}, - {0x02C3, 0x8130B730}, - {0x02C4, 0x8130B731}, - {0x02C5, 0x8130B732}, - {0x02C6, 0x8130B733}, - {0x02C8, 0x8130B734}, - {0x02CC, 0x8130B735}, - {0x02CD, 0x8130B736}, - {0x02CE, 0x8130B737}, - {0x02CF, 0x8130B738}, - {0x02D0, 0x8130B739}, - {0x02D1, 0x8130B830}, - {0x02D2, 0x8130B831}, - {0x02D3, 0x8130B832}, - {0x02D4, 0x8130B833}, - {0x02D5, 0x8130B834}, - {0x02D6, 0x8130B835}, - {0x02D7, 0x8130B836}, - {0x02D8, 0x8130B837}, - {0x02DA, 0x8130B838}, - {0x02DB, 0x8130B839}, - {0x02DC, 0x8130B930}, - {0x02DD, 0x8130B931}, - {0x02DE, 0x8130B932}, - {0x02DF, 0x8130B933}, - {0x02E0, 0x8130B934}, - {0x02E1, 0x8130B935}, - {0x02E2, 0x8130B936}, - {0x02E3, 0x8130B937}, - {0x02E4, 0x8130B938}, - {0x02E5, 0x8130B939}, - {0x02E6, 0x8130BA30}, - {0x02E7, 0x8130BA31}, - {0x02E8, 0x8130BA32}, - {0x02E9, 0x8130BA33}, - {0x02EA, 0x8130BA34}, - {0x02EB, 0x8130BA35}, - {0x02EC, 0x8130BA36}, - {0x02ED, 0x8130BA37}, - {0x02EE, 0x8130BA38}, - {0x02EF, 0x8130BA39}, - {0x02F0, 0x8130BB30}, - {0x02F1, 0x8130BB31}, - {0x02F2, 0x8130BB32}, - {0x02F3, 0x8130BB33}, - {0x02F4, 0x8130BB34}, - {0x02F5, 0x8130BB35}, - {0x02F6, 0x8130BB36}, - {0x02F7, 0x8130BB37}, - {0x02F8, 0x8130BB38}, - {0x02F9, 0x8130BB39}, - {0x02FA, 0x8130BC30}, - {0x02FB, 0x8130BC31}, - {0x02FC, 0x8130BC32}, - {0x02FD, 0x8130BC33}, - {0x02FE, 0x8130BC34}, - {0x02FF, 0x8130BC35}, - {0x0300, 0x8130BC36}, - {0x0301, 0x8130BC37}, - {0x0302, 0x8130BC38}, - {0x0303, 0x8130BC39}, - {0x0304, 0x8130BD30}, - {0x0305, 0x8130BD31}, - {0x0306, 0x8130BD32}, - {0x0307, 0x8130BD33}, - {0x0308, 0x8130BD34}, - {0x0309, 0x8130BD35}, - {0x030A, 0x8130BD36}, - {0x030B, 0x8130BD37}, - {0x030C, 0x8130BD38}, - {0x030D, 0x8130BD39}, - {0x030E, 0x8130BE30}, - {0x030F, 0x8130BE31}, - {0x0310, 0x8130BE32}, - {0x0311, 0x8130BE33}, - {0x0312, 0x8130BE34}, - {0x0313, 0x8130BE35}, - {0x0314, 0x8130BE36}, - {0x0315, 0x8130BE37}, - {0x0316, 0x8130BE38}, - {0x0317, 0x8130BE39}, - {0x0318, 0x8130BF30}, - {0x0319, 0x8130BF31}, - {0x031A, 0x8130BF32}, - {0x031B, 0x8130BF33}, - {0x031C, 0x8130BF34}, - {0x031D, 0x8130BF35}, - {0x031E, 0x8130BF36}, - {0x031F, 0x8130BF37}, - {0x0320, 0x8130BF38}, - {0x0321, 0x8130BF39}, - {0x0322, 0x8130C030}, - {0x0323, 0x8130C031}, - {0x0324, 0x8130C032}, - {0x0325, 0x8130C033}, - {0x0326, 0x8130C034}, - {0x0327, 0x8130C035}, - {0x0328, 0x8130C036}, - {0x0329, 0x8130C037}, - {0x032A, 0x8130C038}, - {0x032B, 0x8130C039}, - {0x032C, 0x8130C130}, - {0x032D, 0x8130C131}, - {0x032E, 0x8130C132}, - {0x032F, 0x8130C133}, - {0x0330, 0x8130C134}, - {0x0331, 0x8130C135}, - {0x0332, 0x8130C136}, - {0x0333, 0x8130C137}, - {0x0334, 0x8130C138}, - {0x0335, 0x8130C139}, - {0x0336, 0x8130C230}, - {0x0337, 0x8130C231}, - {0x0338, 0x8130C232}, - {0x0339, 0x8130C233}, - {0x033A, 0x8130C234}, - {0x033B, 0x8130C235}, - {0x033C, 0x8130C236}, - {0x033D, 0x8130C237}, - {0x033E, 0x8130C238}, - {0x033F, 0x8130C239}, - {0x0340, 0x8130C330}, - {0x0341, 0x8130C331}, - {0x0342, 0x8130C332}, - {0x0343, 0x8130C333}, - {0x0344, 0x8130C334}, - {0x0345, 0x8130C335}, - {0x0346, 0x8130C336}, - {0x0347, 0x8130C337}, - {0x0348, 0x8130C338}, - {0x0349, 0x8130C339}, - {0x034A, 0x8130C430}, - {0x034B, 0x8130C431}, - {0x034C, 0x8130C432}, - {0x034D, 0x8130C433}, - {0x034E, 0x8130C434}, - {0x034F, 0x8130C435}, - {0x0350, 0x8130C436}, - {0x0351, 0x8130C437}, - {0x0352, 0x8130C438}, - {0x0353, 0x8130C439}, - {0x0354, 0x8130C530}, - {0x0355, 0x8130C531}, - {0x0356, 0x8130C532}, - {0x0357, 0x8130C533}, - {0x0358, 0x8130C534}, - {0x0359, 0x8130C535}, - {0x035A, 0x8130C536}, - {0x035B, 0x8130C537}, - {0x035C, 0x8130C538}, - {0x035D, 0x8130C539}, - {0x035E, 0x8130C630}, - {0x035F, 0x8130C631}, - {0x0360, 0x8130C632}, - {0x0361, 0x8130C633}, - {0x0362, 0x8130C634}, - {0x0363, 0x8130C635}, - {0x0364, 0x8130C636}, - {0x0365, 0x8130C637}, - {0x0366, 0x8130C638}, - {0x0367, 0x8130C639}, - {0x0368, 0x8130C730}, - {0x0369, 0x8130C731}, - {0x036A, 0x8130C732}, - {0x036B, 0x8130C733}, - {0x036C, 0x8130C734}, - {0x036D, 0x8130C735}, - {0x036E, 0x8130C736}, - {0x036F, 0x8130C737}, - {0x0370, 0x8130C738}, - {0x0371, 0x8130C739}, - {0x0372, 0x8130C830}, - {0x0373, 0x8130C831}, - {0x0374, 0x8130C832}, - {0x0375, 0x8130C833}, - {0x0376, 0x8130C834}, - {0x0377, 0x8130C835}, - {0x0378, 0x8130C836}, - {0x0379, 0x8130C837}, - {0x037A, 0x8130C838}, - {0x037B, 0x8130C839}, - {0x037C, 0x8130C930}, - {0x037D, 0x8130C931}, - {0x037E, 0x8130C932}, - {0x037F, 0x8130C933}, - {0x0380, 0x8130C934}, - {0x0381, 0x8130C935}, - {0x0382, 0x8130C936}, - {0x0383, 0x8130C937}, - {0x0384, 0x8130C938}, - {0x0385, 0x8130C939}, - {0x0386, 0x8130CA30}, - {0x0387, 0x8130CA31}, - {0x0388, 0x8130CA32}, - {0x0389, 0x8130CA33}, - {0x038A, 0x8130CA34}, - {0x038B, 0x8130CA35}, - {0x038C, 0x8130CA36}, - {0x038D, 0x8130CA37}, - {0x038E, 0x8130CA38}, - {0x038F, 0x8130CA39}, - {0x0390, 0x8130CB30}, - {0x03A2, 0x8130CB31}, - {0x03AA, 0x8130CB32}, - {0x03AB, 0x8130CB33}, - {0x03AC, 0x8130CB34}, - {0x03AD, 0x8130CB35}, - {0x03AE, 0x8130CB36}, - {0x03AF, 0x8130CB37}, - {0x03B0, 0x8130CB38}, - {0x03C2, 0x8130CB39}, - {0x03CA, 0x8130CC30}, - {0x03CB, 0x8130CC31}, - {0x03CC, 0x8130CC32}, - {0x03CD, 0x8130CC33}, - {0x03CE, 0x8130CC34}, - {0x03CF, 0x8130CC35}, - {0x03D0, 0x8130CC36}, - {0x03D1, 0x8130CC37}, - {0x03D2, 0x8130CC38}, - {0x03D3, 0x8130CC39}, - {0x03D4, 0x8130CD30}, - {0x03D5, 0x8130CD31}, - {0x03D6, 0x8130CD32}, - {0x03D7, 0x8130CD33}, - {0x03D8, 0x8130CD34}, - {0x03D9, 0x8130CD35}, - {0x03DA, 0x8130CD36}, - {0x03DB, 0x8130CD37}, - {0x03DC, 0x8130CD38}, - {0x03DD, 0x8130CD39}, - {0x03DE, 0x8130CE30}, - {0x03DF, 0x8130CE31}, - {0x03E0, 0x8130CE32}, - {0x03E1, 0x8130CE33}, - {0x03E2, 0x8130CE34}, - {0x03E3, 0x8130CE35}, - {0x03E4, 0x8130CE36}, - {0x03E5, 0x8130CE37}, - {0x03E6, 0x8130CE38}, - {0x03E7, 0x8130CE39}, - {0x03E8, 0x8130CF30}, - {0x03E9, 0x8130CF31}, - {0x03EA, 0x8130CF32}, - {0x03EB, 0x8130CF33}, - {0x03EC, 0x8130CF34}, - {0x03ED, 0x8130CF35}, - {0x03EE, 0x8130CF36}, - {0x03EF, 0x8130CF37}, - {0x03F0, 0x8130CF38}, - {0x03F1, 0x8130CF39}, - {0x03F2, 0x8130D030}, - {0x03F3, 0x8130D031}, - {0x03F4, 0x8130D032}, - {0x03F5, 0x8130D033}, - {0x03F6, 0x8130D034}, - {0x03F7, 0x8130D035}, - {0x03F8, 0x8130D036}, - {0x03F9, 0x8130D037}, - {0x03FA, 0x8130D038}, - {0x03FB, 0x8130D039}, - {0x03FC, 0x8130D130}, - {0x03FD, 0x8130D131}, - {0x03FE, 0x8130D132}, - {0x03FF, 0x8130D133}, - {0x0400, 0x8130D134}, - {0x0402, 0x8130D135}, - {0x0403, 0x8130D136}, - {0x0404, 0x8130D137}, - {0x0405, 0x8130D138}, - {0x0406, 0x8130D139}, - {0x0407, 0x8130D230}, - {0x0408, 0x8130D231}, - {0x0409, 0x8130D232}, - {0x040A, 0x8130D233}, - {0x040B, 0x8130D234}, - {0x040C, 0x8130D235}, - {0x040D, 0x8130D236}, - {0x040E, 0x8130D237}, - {0x040F, 0x8130D238}, - {0x0450, 0x8130D239}, - {0x2011, 0x8136A532}, - {0x2012, 0x8136A533}, - {0x2017, 0x8136A534}, - {0x201A, 0x8136A535}, - {0x201B, 0x8136A536}, - {0x201E, 0x8136A537}, - {0x201F, 0x8136A538}, - {0x2020, 0x8136A539}, - {0x2021, 0x8136A630}, - {0x2022, 0x8136A631}, - {0x2023, 0x8136A632}, - {0x2024, 0x8136A633}, - {0x2027, 0x8136A634}, - {0x2028, 0x8136A635}, - {0x2029, 0x8136A636}, - {0x202A, 0x8136A637}, - {0x202B, 0x8136A638}, - {0x202C, 0x8136A639}, - {0x202D, 0x8136A730}, - {0x202E, 0x8136A731}, - {0x202F, 0x8136A732}, - {0x2031, 0x8136A733}, - {0x2034, 0x8136A734}, - {0x2036, 0x8136A735}, - {0x2037, 0x8136A736}, - {0x2038, 0x8136A737}, - {0x2039, 0x8136A738}, - {0x203A, 0x8136A739}, - {0x203C, 0x8136A830}, - {0x203D, 0x8136A831}, - {0x203E, 0x8136A832}, - {0x203F, 0x8136A833}, - {0x2040, 0x8136A834}, - {0x2041, 0x8136A835}, - {0x2042, 0x8136A836}, - {0x2043, 0x8136A837}, - {0x2044, 0x8136A838}, - {0x2045, 0x8136A839}, - {0x2046, 0x8136A930}, - {0x2047, 0x8136A931}, - {0x2048, 0x8136A932}, - {0x2049, 0x8136A933}, - {0x204A, 0x8136A934}, - {0x204B, 0x8136A935}, - {0x204C, 0x8136A936}, - {0x204D, 0x8136A937}, - {0x204E, 0x8136A938}, - {0x204F, 0x8136A939}, - {0x2050, 0x8136AA30}, - {0x2051, 0x8136AA31}, - {0x2052, 0x8136AA32}, - {0x2053, 0x8136AA33}, - {0x2054, 0x8136AA34}, - {0x2055, 0x8136AA35}, - {0x2056, 0x8136AA36}, - {0x2057, 0x8136AA37}, - {0x2058, 0x8136AA38}, - {0x2059, 0x8136AA39}, - {0x205A, 0x8136AB30}, - {0x205B, 0x8136AB31}, - {0x205C, 0x8136AB32}, - {0x205D, 0x8136AB33}, - {0x205E, 0x8136AB34}, - {0x205F, 0x8136AB35}, - {0x2060, 0x8136AB36}, - {0x2061, 0x8136AB37}, - {0x2062, 0x8136AB38}, - {0x2063, 0x8136AB39}, - {0x2064, 0x8136AC30}, - {0x2065, 0x8136AC31}, - {0x2066, 0x8136AC32}, - {0x2067, 0x8136AC33}, - {0x2068, 0x8136AC34}, - {0x2069, 0x8136AC35}, - {0x206A, 0x8136AC36}, - {0x206B, 0x8136AC37}, - {0x206C, 0x8136AC38}, - {0x206D, 0x8136AC39}, - {0x206E, 0x8136AD30}, - {0x206F, 0x8136AD31}, - {0x2070, 0x8136AD32}, - {0x2071, 0x8136AD33}, - {0x2072, 0x8136AD34}, - {0x2073, 0x8136AD35}, - {0x2074, 0x8136AD36}, - {0x2075, 0x8136AD37}, - {0x2076, 0x8136AD38}, - {0x2077, 0x8136AD39}, - {0x2078, 0x8136AE30}, - {0x2079, 0x8136AE31}, - {0x207A, 0x8136AE32}, - {0x207B, 0x8136AE33}, - {0x207C, 0x8136AE34}, - {0x207D, 0x8136AE35}, - {0x207E, 0x8136AE36}, - {0x207F, 0x8136AE37}, - {0x2080, 0x8136AE38}, - {0x2081, 0x8136AE39}, - {0x2082, 0x8136AF30}, - {0x2083, 0x8136AF31}, - {0x2084, 0x8136AF32}, - {0x2085, 0x8136AF33}, - {0x2086, 0x8136AF34}, - {0x2087, 0x8136AF35}, - {0x2088, 0x8136AF36}, - {0x2089, 0x8136AF37}, - {0x208A, 0x8136AF38}, - {0x208B, 0x8136AF39}, - {0x208C, 0x8136B030}, - {0x208D, 0x8136B031}, - {0x208E, 0x8136B032}, - {0x208F, 0x8136B033}, - {0x2090, 0x8136B034}, - {0x2091, 0x8136B035}, - {0x2092, 0x8136B036}, - {0x2093, 0x8136B037}, - {0x2094, 0x8136B038}, - {0x2095, 0x8136B039}, - {0x2096, 0x8136B130}, - {0x2097, 0x8136B131}, - {0x2098, 0x8136B132}, - {0x2099, 0x8136B133}, - {0x209A, 0x8136B134}, - {0x209B, 0x8136B135}, - {0x209C, 0x8136B136}, - {0x209D, 0x8136B137}, - {0x209E, 0x8136B138}, - {0x209F, 0x8136B139}, - {0x20A0, 0x8136B230}, - {0x20A1, 0x8136B231}, - {0x20A2, 0x8136B232}, - {0x20A3, 0x8136B233}, - {0x20A4, 0x8136B234}, - {0x20A5, 0x8136B235}, - {0x20A6, 0x8136B236}, - {0x20A7, 0x8136B237}, - {0x20A8, 0x8136B238}, - {0x20A9, 0x8136B239}, - {0x20AA, 0x8136B330}, - {0x20AB, 0x8136B331}, - {0x20AD, 0x8136B332}, - {0x20AE, 0x8136B333}, - {0x20AF, 0x8136B334}, - {0x20B0, 0x8136B335}, - {0x20B1, 0x8136B336}, - {0x20B2, 0x8136B337}, - {0x20B3, 0x8136B338}, - {0x20B4, 0x8136B339}, - {0x20B5, 0x8136B430}, - {0x20B6, 0x8136B431}, - {0x20B7, 0x8136B432}, - {0x20B8, 0x8136B433}, - {0x20B9, 0x8136B434}, - {0x20BA, 0x8136B435}, - {0x20BB, 0x8136B436}, - {0x20BC, 0x8136B437}, - {0x20BD, 0x8136B438}, - {0x20BE, 0x8136B439}, - {0x20BF, 0x8136B530}, - {0x20C0, 0x8136B531}, - {0x20C1, 0x8136B532}, - {0x20C2, 0x8136B533}, - {0x20C3, 0x8136B534}, - {0x20C4, 0x8136B535}, - {0x20C5, 0x8136B536}, - {0x20C6, 0x8136B537}, - {0x20C7, 0x8136B538}, - {0x20C8, 0x8136B539}, - {0x20C9, 0x8136B630}, - {0x20CA, 0x8136B631}, - {0x20CB, 0x8136B632}, - {0x20CC, 0x8136B633}, - {0x20CD, 0x8136B634}, - {0x20CE, 0x8136B635}, - {0x20CF, 0x8136B636}, - {0x20D0, 0x8136B637}, - {0x20D1, 0x8136B638}, - {0x20D2, 0x8136B639}, - {0x20D3, 0x8136B730}, - {0x20D4, 0x8136B731}, - {0x20D5, 0x8136B732}, - {0x20D6, 0x8136B733}, - {0x20D7, 0x8136B734}, - {0x20D8, 0x8136B735}, - {0x20D9, 0x8136B736}, - {0x20DA, 0x8136B737}, - {0x20DB, 0x8136B738}, - {0x20DC, 0x8136B739}, - {0x20DD, 0x8136B830}, - {0x20DE, 0x8136B831}, - {0x20DF, 0x8136B832}, - {0x20E0, 0x8136B833}, - {0x20E1, 0x8136B834}, - {0x20E2, 0x8136B835}, - {0x20E3, 0x8136B836}, - {0x20E4, 0x8136B837}, - {0x20E5, 0x8136B838}, - {0x20E6, 0x8136B839}, - {0x20E7, 0x8136B930}, - {0x20E8, 0x8136B931}, - {0x20E9, 0x8136B932}, - {0x20EA, 0x8136B933}, - {0x20EB, 0x8136B934}, - {0x20EC, 0x8136B935}, - {0x20ED, 0x8136B936}, - {0x20EE, 0x8136B937}, - {0x20EF, 0x8136B938}, - {0x20F0, 0x8136B939}, - {0x20F1, 0x8136BA30}, - {0x20F2, 0x8136BA31}, - {0x20F3, 0x8136BA32}, - {0x20F4, 0x8136BA33}, - {0x20F5, 0x8136BA34}, - {0x20F6, 0x8136BA35}, - {0x20F7, 0x8136BA36}, - {0x20F8, 0x8136BA37}, - {0x20F9, 0x8136BA38}, - {0x20FA, 0x8136BA39}, - {0x20FB, 0x8136BB30}, - {0x20FC, 0x8136BB31}, - {0x20FD, 0x8136BB32}, - {0x20FE, 0x8136BB33}, - {0x20FF, 0x8136BB34}, - {0x2100, 0x8136BB35}, - {0x2101, 0x8136BB36}, - {0x2102, 0x8136BB37}, - {0x2104, 0x8136BB38}, - {0x2106, 0x8136BB39}, - {0x2107, 0x8136BC30}, - {0x2108, 0x8136BC31}, - {0x210A, 0x8136BC32}, - {0x210B, 0x8136BC33}, - {0x210C, 0x8136BC34}, - {0x210D, 0x8136BC35}, - {0x210E, 0x8136BC36}, - {0x210F, 0x8136BC37}, - {0x2110, 0x8136BC38}, - {0x2111, 0x8136BC39}, - {0x2112, 0x8136BD30}, - {0x2113, 0x8136BD31}, - {0x2114, 0x8136BD32}, - {0x2115, 0x8136BD33}, - {0x2117, 0x8136BD34}, - {0x2118, 0x8136BD35}, - {0x2119, 0x8136BD36}, - {0x211A, 0x8136BD37}, - {0x211B, 0x8136BD38}, - {0x211C, 0x8136BD39}, - {0x211D, 0x8136BE30}, - {0x211E, 0x8136BE31}, - {0x211F, 0x8136BE32}, - {0x2120, 0x8136BE33}, - {0x2122, 0x8136BE34}, - {0x2123, 0x8136BE35}, - {0x2124, 0x8136BE36}, - {0x2125, 0x8136BE37}, - {0x2126, 0x8136BE38}, - {0x2127, 0x8136BE39}, - {0x2128, 0x8136BF30}, - {0x2129, 0x8136BF31}, - {0x212A, 0x8136BF32}, - {0x212B, 0x8136BF33}, - {0x212C, 0x8136BF34}, - {0x212D, 0x8136BF35}, - {0x212E, 0x8136BF36}, - {0x212F, 0x8136BF37}, - {0x2130, 0x8136BF38}, - {0x2131, 0x8136BF39}, - {0x2132, 0x8136C030}, - {0x2133, 0x8136C031}, - {0x2134, 0x8136C032}, - {0x2135, 0x8136C033}, - {0x2136, 0x8136C034}, - {0x2137, 0x8136C035}, - {0x2138, 0x8136C036}, - {0x2139, 0x8136C037}, - {0x213A, 0x8136C038}, - {0x213B, 0x8136C039}, - {0x213C, 0x8136C130}, - {0x213D, 0x8136C131}, - {0x213E, 0x8136C132}, - {0x213F, 0x8136C133}, - {0x2140, 0x8136C134}, - {0x2141, 0x8136C135}, - {0x2142, 0x8136C136}, - {0x2143, 0x8136C137}, - {0x2144, 0x8136C138}, - {0x2145, 0x8136C139}, - {0x2146, 0x8136C230}, - {0x2147, 0x8136C231}, - {0x2148, 0x8136C232}, - {0x2149, 0x8136C233}, - {0x214A, 0x8136C234}, - {0x214B, 0x8136C235}, - {0x214C, 0x8136C236}, - {0x214D, 0x8136C237}, - {0x214E, 0x8136C238}, - {0x214F, 0x8136C239}, - {0x2150, 0x8136C330}, - {0x2151, 0x8136C331}, - {0x2152, 0x8136C332}, - {0x2153, 0x8136C333}, - {0x2154, 0x8136C334}, - {0x2155, 0x8136C335}, - {0x2156, 0x8136C336}, - {0x2157, 0x8136C337}, - {0x2158, 0x8136C338}, - {0x2159, 0x8136C339}, - {0x215A, 0x8136C430}, - {0x215B, 0x8136C431}, - {0x215C, 0x8136C432}, - {0x215D, 0x8136C433}, - {0x215E, 0x8136C434}, - {0x215F, 0x8136C435}, - {0x216C, 0x8136C436}, - {0x216D, 0x8136C437}, - {0x216E, 0x8136C438}, - {0x216F, 0x8136C439}, - {0x217A, 0x8136C530}, - {0x217B, 0x8136C531}, - {0x217C, 0x8136C532}, - {0x217D, 0x8136C533}, - {0x217E, 0x8136C534}, - {0x217F, 0x8136C535}, - {0x2180, 0x8136C536}, - {0x2181, 0x8136C537}, - {0x2182, 0x8136C538}, - {0x2183, 0x8136C539}, - {0x2184, 0x8136C630}, - {0x2185, 0x8136C631}, - {0x2186, 0x8136C632}, - {0x2187, 0x8136C633}, - {0x2188, 0x8136C634}, - {0x2189, 0x8136C635}, - {0x218A, 0x8136C636}, - {0x218B, 0x8136C637}, - {0x218C, 0x8136C638}, - {0x218D, 0x8136C639}, - {0x218E, 0x8136C730}, - {0x218F, 0x8136C731}, - {0x2194, 0x8136C732}, - {0x2195, 0x8136C733}, - {0x219A, 0x8136C734}, - {0x219B, 0x8136C735}, - {0x219C, 0x8136C736}, - {0x219D, 0x8136C737}, - {0x219E, 0x8136C738}, - {0x219F, 0x8136C739}, - {0x21A0, 0x8136C830}, - {0x21A1, 0x8136C831}, - {0x21A2, 0x8136C832}, - {0x21A3, 0x8136C833}, - {0x21A4, 0x8136C834}, - {0x21A5, 0x8136C835}, - {0x21A6, 0x8136C836}, - {0x21A7, 0x8136C837}, - {0x21A8, 0x8136C838}, - {0x21A9, 0x8136C839}, - {0x21AA, 0x8136C930}, - {0x21AB, 0x8136C931}, - {0x21AC, 0x8136C932}, - {0x21AD, 0x8136C933}, - {0x21AE, 0x8136C934}, - {0x21AF, 0x8136C935}, - {0x21B0, 0x8136C936}, - {0x21B1, 0x8136C937}, - {0x21B2, 0x8136C938}, - {0x21B3, 0x8136C939}, - {0x21B4, 0x8136CA30}, - {0x21B5, 0x8136CA31}, - {0x21B6, 0x8136CA32}, - {0x21B7, 0x8136CA33}, - {0x21B8, 0x8136CA34}, - {0x21B9, 0x8136CA35}, - {0x21BA, 0x8136CA36}, - {0x21BB, 0x8136CA37}, - {0x21BC, 0x8136CA38}, - {0x21BD, 0x8136CA39}, - {0x21BE, 0x8136CB30}, - {0x21BF, 0x8136CB31}, - {0x21C0, 0x8136CB32}, - {0x21C1, 0x8136CB33}, - {0x21C2, 0x8136CB34}, - {0x21C3, 0x8136CB35}, - {0x21C4, 0x8136CB36}, - {0x21C5, 0x8136CB37}, - {0x21C6, 0x8136CB38}, - {0x21C7, 0x8136CB39}, - {0x21C8, 0x8136CC30}, - {0x21C9, 0x8136CC31}, - {0x21CA, 0x8136CC32}, - {0x21CB, 0x8136CC33}, - {0x21CC, 0x8136CC34}, - {0x21CD, 0x8136CC35}, - {0x21CE, 0x8136CC36}, - {0x21CF, 0x8136CC37}, - {0x21D0, 0x8136CC38}, - {0x21D1, 0x8136CC39}, - {0x21D2, 0x8136CD30}, - {0x21D3, 0x8136CD31}, - {0x21D4, 0x8136CD32}, - {0x21D5, 0x8136CD33}, - {0x21D6, 0x8136CD34}, - {0x21D7, 0x8136CD35}, - {0x21D8, 0x8136CD36}, - {0x21D9, 0x8136CD37}, - {0x21DA, 0x8136CD38}, - {0x21DB, 0x8136CD39}, - {0x21DC, 0x8136CE30}, - {0x21DD, 0x8136CE31}, - {0x21DE, 0x8136CE32}, - {0x21DF, 0x8136CE33}, - {0x21E0, 0x8136CE34}, - {0x21E1, 0x8136CE35}, - {0x21E2, 0x8136CE36}, - {0x21E3, 0x8136CE37}, - {0x21E4, 0x8136CE38}, - {0x21E5, 0x8136CE39}, - {0x21E6, 0x8136CF30}, - {0x21E7, 0x8136CF31}, - {0x21E8, 0x8136CF32}, - {0x21E9, 0x8136CF33}, - {0x21EA, 0x8136CF34}, - {0x21EB, 0x8136CF35}, - {0x21EC, 0x8136CF36}, - {0x21ED, 0x8136CF37}, - {0x21EE, 0x8136CF38}, - {0x21EF, 0x8136CF39}, - {0x21F0, 0x8136D030}, - {0x21F1, 0x8136D031}, - {0x21F2, 0x8136D032}, - {0x21F3, 0x8136D033}, - {0x21F4, 0x8136D034}, - {0x21F5, 0x8136D035}, - {0x21F6, 0x8136D036}, - {0x21F7, 0x8136D037}, - {0x21F8, 0x8136D038}, - {0x21F9, 0x8136D039}, - {0x21FA, 0x8136D130}, - {0x21FB, 0x8136D131}, - {0x21FC, 0x8136D132}, - {0x21FD, 0x8136D133}, - {0x21FE, 0x8136D134}, - {0x21FF, 0x8136D135}, - {0x2200, 0x8136D136}, - {0x2201, 0x8136D137}, - {0x2202, 0x8136D138}, - {0x2203, 0x8136D139}, - {0x2204, 0x8136D230}, - {0x2205, 0x8136D231}, - {0x2206, 0x8136D232}, - {0x2207, 0x8136D233}, - {0x2209, 0x8136D234}, - {0x220A, 0x8136D235}, - {0x220B, 0x8136D236}, - {0x220C, 0x8136D237}, - {0x220D, 0x8136D238}, - {0x220E, 0x8136D239}, - {0x2210, 0x8136D330}, - {0x2212, 0x8136D331}, - {0x2213, 0x8136D332}, - {0x2214, 0x8136D333}, - {0x2216, 0x8136D334}, - {0x2217, 0x8136D335}, - {0x2218, 0x8136D336}, - {0x2219, 0x8136D337}, - {0x221B, 0x8136D338}, - {0x221C, 0x8136D339}, - {0x2221, 0x8136D430}, - {0x2222, 0x8136D431}, - {0x2224, 0x8136D432}, - {0x2226, 0x8136D433}, - {0x222C, 0x8136D434}, - {0x222D, 0x8136D435}, - {0x222F, 0x8136D436}, - {0x2230, 0x8136D437}, - {0x2231, 0x8136D438}, - {0x2232, 0x8136D439}, - {0x2233, 0x8136D530}, - {0x2238, 0x8136D531}, - {0x2239, 0x8136D532}, - {0x223A, 0x8136D533}, - {0x223B, 0x8136D534}, - {0x223C, 0x8136D535}, - {0x223E, 0x8136D536}, - {0x223F, 0x8136D537}, - {0x2240, 0x8136D538}, - {0x2241, 0x8136D539}, - {0x2242, 0x8136D630}, - {0x2243, 0x8136D631}, - {0x2244, 0x8136D632}, - {0x2245, 0x8136D633}, - {0x2246, 0x8136D634}, - {0x2247, 0x8136D635}, - {0x2249, 0x8136D636}, - {0x224A, 0x8136D637}, - {0x224B, 0x8136D638}, - {0x224D, 0x8136D639}, - {0x224E, 0x8136D730}, - {0x224F, 0x8136D731}, - {0x2250, 0x8136D732}, - {0x2251, 0x8136D733}, - {0x2253, 0x8136D734}, - {0x2254, 0x8136D735}, - {0x2255, 0x8136D736}, - {0x2256, 0x8136D737}, - {0x2257, 0x8136D738}, - {0x2258, 0x8136D739}, - {0x2259, 0x8136D830}, - {0x225A, 0x8136D831}, - {0x225B, 0x8136D832}, - {0x225C, 0x8136D833}, - {0x225D, 0x8136D834}, - {0x225E, 0x8136D835}, - {0x225F, 0x8136D836}, - {0x2262, 0x8136D837}, - {0x2263, 0x8136D838}, - {0x2268, 0x8136D839}, - {0x2269, 0x8136D930}, - {0x226A, 0x8136D931}, - {0x226B, 0x8136D932}, - {0x226C, 0x8136D933}, - {0x226D, 0x8136D934}, - {0x2270, 0x8136D935}, - {0x2271, 0x8136D936}, - {0x2272, 0x8136D937}, - {0x2273, 0x8136D938}, - {0x2274, 0x8136D939}, - {0x2275, 0x8136DA30}, - {0x2276, 0x8136DA31}, - {0x2277, 0x8136DA32}, - {0x2278, 0x8136DA33}, - {0x2279, 0x8136DA34}, - {0x227A, 0x8136DA35}, - {0x227B, 0x8136DA36}, - {0x227C, 0x8136DA37}, - {0x227D, 0x8136DA38}, - {0x227E, 0x8136DA39}, - {0x227F, 0x8136DB30}, - {0x2280, 0x8136DB31}, - {0x2281, 0x8136DB32}, - {0x2282, 0x8136DB33}, - {0x2283, 0x8136DB34}, - {0x2284, 0x8136DB35}, - {0x2285, 0x8136DB36}, - {0x2286, 0x8136DB37}, - {0x2287, 0x8136DB38}, - {0x2288, 0x8136DB39}, - {0x2289, 0x8136DC30}, - {0x228A, 0x8136DC31}, - {0x228B, 0x8136DC32}, - {0x228C, 0x8136DC33}, - {0x228D, 0x8136DC34}, - {0x228E, 0x8136DC35}, - {0x228F, 0x8136DC36}, - {0x2290, 0x8136DC37}, - {0x2291, 0x8136DC38}, - {0x2292, 0x8136DC39}, - {0x2293, 0x8136DD30}, - {0x2294, 0x8136DD31}, - {0x2296, 0x8136DD32}, - {0x2297, 0x8136DD33}, - {0x2298, 0x8136DD34}, - {0x229A, 0x8136DD35}, - {0x229B, 0x8136DD36}, - {0x229C, 0x8136DD37}, - {0x229D, 0x8136DD38}, - {0x229E, 0x8136DD39}, - {0x229F, 0x8136DE30}, - {0x22A0, 0x8136DE31}, - {0x22A1, 0x8136DE32}, - {0x22A2, 0x8136DE33}, - {0x22A3, 0x8136DE34}, - {0x22A4, 0x8136DE35}, - {0x22A6, 0x8136DE36}, - {0x22A7, 0x8136DE37}, - {0x22A8, 0x8136DE38}, - {0x22A9, 0x8136DE39}, - {0x22AA, 0x8136DF30}, - {0x22AB, 0x8136DF31}, - {0x22AC, 0x8136DF32}, - {0x22AD, 0x8136DF33}, - {0x22AE, 0x8136DF34}, - {0x22AF, 0x8136DF35}, - {0x22B0, 0x8136DF36}, - {0x22B1, 0x8136DF37}, - {0x22B2, 0x8136DF38}, - {0x22B3, 0x8136DF39}, - {0x22B4, 0x8136E030}, - {0x22B5, 0x8136E031}, - {0x22B6, 0x8136E032}, - {0x22B7, 0x8136E033}, - {0x22B8, 0x8136E034}, - {0x22B9, 0x8136E035}, - {0x22BA, 0x8136E036}, - {0x22BB, 0x8136E037}, - {0x22BC, 0x8136E038}, - {0x22BD, 0x8136E039}, - {0x22BE, 0x8136E130}, - {0x22C0, 0x8136E131}, - {0x22C1, 0x8136E132}, - {0x22C2, 0x8136E133}, - {0x22C3, 0x8136E134}, - {0x22C4, 0x8136E135}, - {0x22C5, 0x8136E136}, - {0x22C6, 0x8136E137}, - {0x22C7, 0x8136E138}, - {0x22C8, 0x8136E139}, - {0x22C9, 0x8136E230}, - {0x22CA, 0x8136E231}, - {0x22CB, 0x8136E232}, - {0x22CC, 0x8136E233}, - {0x22CD, 0x8136E234}, - {0x22CE, 0x8136E235}, - {0x22CF, 0x8136E236}, - {0x22D0, 0x8136E237}, - {0x22D1, 0x8136E238}, - {0x22D2, 0x8136E239}, - {0x22D3, 0x8136E330}, - {0x22D4, 0x8136E331}, - {0x22D5, 0x8136E332}, - {0x22D6, 0x8136E333}, - {0x22D7, 0x8136E334}, - {0x22D8, 0x8136E335}, - {0x22D9, 0x8136E336}, - {0x22DA, 0x8136E337}, - {0x22DB, 0x8136E338}, - {0x22DC, 0x8136E339}, - {0x22DD, 0x8136E430}, - {0x22DE, 0x8136E431}, - {0x22DF, 0x8136E432}, - {0x22E0, 0x8136E433}, - {0x22E1, 0x8136E434}, - {0x22E2, 0x8136E435}, - {0x22E3, 0x8136E436}, - {0x22E4, 0x8136E437}, - {0x22E5, 0x8136E438}, - {0x22E6, 0x8136E439}, - {0x22E7, 0x8136E530}, - {0x22E8, 0x8136E531}, - {0x22E9, 0x8136E532}, - {0x22EA, 0x8136E533}, - {0x22EB, 0x8136E534}, - {0x22EC, 0x8136E535}, - {0x22ED, 0x8136E536}, - {0x22EE, 0x8136E537}, - {0x22EF, 0x8136E538}, - {0x22F0, 0x8136E539}, - {0x22F1, 0x8136E630}, - {0x22F2, 0x8136E631}, - {0x22F3, 0x8136E632}, - {0x22F4, 0x8136E633}, - {0x22F5, 0x8136E634}, - {0x22F6, 0x8136E635}, - {0x22F7, 0x8136E636}, - {0x22F8, 0x8136E637}, - {0x22F9, 0x8136E638}, - {0x22FA, 0x8136E639}, - {0x22FB, 0x8136E730}, - {0x22FC, 0x8136E731}, - {0x22FD, 0x8136E732}, - {0x22FE, 0x8136E733}, - {0x22FF, 0x8136E734}, - {0x2300, 0x8136E735}, - {0x2301, 0x8136E736}, - {0x2302, 0x8136E737}, - {0x2303, 0x8136E738}, - {0x2304, 0x8136E739}, - {0x2305, 0x8136E830}, - {0x2306, 0x8136E831}, - {0x2307, 0x8136E832}, - {0x2308, 0x8136E833}, - {0x2309, 0x8136E834}, - {0x230A, 0x8136E835}, - {0x230B, 0x8136E836}, - {0x230C, 0x8136E837}, - {0x230D, 0x8136E838}, - {0x230E, 0x8136E839}, - {0x230F, 0x8136E930}, - {0x2310, 0x8136E931}, - {0x2311, 0x8136E932}, - {0x2313, 0x8136E933}, - {0x2314, 0x8136E934}, - {0x2315, 0x8136E935}, - {0x2316, 0x8136E936}, - {0x2317, 0x8136E937}, - {0x2318, 0x8136E938}, - {0x2319, 0x8136E939}, - {0x231A, 0x8136EA30}, - {0x231B, 0x8136EA31}, - {0x231C, 0x8136EA32}, - {0x231D, 0x8136EA33}, - {0x231E, 0x8136EA34}, - {0x231F, 0x8136EA35}, - {0x2320, 0x8136EA36}, - {0x2321, 0x8136EA37}, - {0x2322, 0x8136EA38}, - {0x2323, 0x8136EA39}, - {0x2324, 0x8136EB30}, - {0x2325, 0x8136EB31}, - {0x2326, 0x8136EB32}, - {0x2327, 0x8136EB33}, - {0x2328, 0x8136EB34}, - {0x2329, 0x8136EB35}, - {0x232A, 0x8136EB36}, - {0x232B, 0x8136EB37}, - {0x232C, 0x8136EB38}, - {0x232D, 0x8136EB39}, - {0x232E, 0x8136EC30}, - {0x232F, 0x8136EC31}, - {0x2330, 0x8136EC32}, - {0x2331, 0x8136EC33}, - {0x2332, 0x8136EC34}, - {0x2333, 0x8136EC35}, - {0x2334, 0x8136EC36}, - {0x2335, 0x8136EC37}, - {0x2336, 0x8136EC38}, - {0x2337, 0x8136EC39}, - {0x2338, 0x8136ED30}, - {0x2339, 0x8136ED31}, - {0x233A, 0x8136ED32}, - {0x233B, 0x8136ED33}, - {0x233C, 0x8136ED34}, - {0x233D, 0x8136ED35}, - {0x233E, 0x8136ED36}, - {0x233F, 0x8136ED37}, - {0x2340, 0x8136ED38}, - {0x2341, 0x8136ED39}, - {0x2342, 0x8136EE30}, - {0x2343, 0x8136EE31}, - {0x2344, 0x8136EE32}, - {0x2345, 0x8136EE33}, - {0x2346, 0x8136EE34}, - {0x2347, 0x8136EE35}, - {0x2348, 0x8136EE36}, - {0x2349, 0x8136EE37}, - {0x234A, 0x8136EE38}, - {0x234B, 0x8136EE39}, - {0x234C, 0x8136EF30}, - {0x234D, 0x8136EF31}, - {0x234E, 0x8136EF32}, - {0x234F, 0x8136EF33}, - {0x2350, 0x8136EF34}, - {0x2351, 0x8136EF35}, - {0x2352, 0x8136EF36}, - {0x2353, 0x8136EF37}, - {0x2354, 0x8136EF38}, - {0x2355, 0x8136EF39}, - {0x2356, 0x8136F030}, - {0x2357, 0x8136F031}, - {0x2358, 0x8136F032}, - {0x2359, 0x8136F033}, - {0x235A, 0x8136F034}, - {0x235B, 0x8136F035}, - {0x235C, 0x8136F036}, - {0x235D, 0x8136F037}, - {0x235E, 0x8136F038}, - {0x235F, 0x8136F039}, - {0x2360, 0x8136F130}, - {0x2361, 0x8136F131}, - {0x2362, 0x8136F132}, - {0x2363, 0x8136F133}, - {0x2364, 0x8136F134}, - {0x2365, 0x8136F135}, - {0x2366, 0x8136F136}, - {0x2367, 0x8136F137}, - {0x2368, 0x8136F138}, - {0x2369, 0x8136F139}, - {0x236A, 0x8136F230}, - {0x236B, 0x8136F231}, - {0x236C, 0x8136F232}, - {0x236D, 0x8136F233}, - {0x236E, 0x8136F234}, - {0x236F, 0x8136F235}, - {0x2370, 0x8136F236}, - {0x2371, 0x8136F237}, - {0x2372, 0x8136F238}, - {0x2373, 0x8136F239}, - {0x2374, 0x8136F330}, - {0x2375, 0x8136F331}, - {0x2376, 0x8136F332}, - {0x2377, 0x8136F333}, - {0x2378, 0x8136F334}, - {0x2379, 0x8136F335}, - {0x237A, 0x8136F336}, - {0x237B, 0x8136F337}, - {0x237C, 0x8136F338}, - {0x237D, 0x8136F339}, - {0x237E, 0x8136F430}, - {0x237F, 0x8136F431}, - {0x2380, 0x8136F432}, - {0x2381, 0x8136F433}, - {0x2382, 0x8136F434}, - {0x2383, 0x8136F435}, - {0x2384, 0x8136F436}, - {0x2385, 0x8136F437}, - {0x2386, 0x8136F438}, - {0x2387, 0x8136F439}, - {0x2388, 0x8136F530}, - {0x2389, 0x8136F531}, - {0x238A, 0x8136F532}, - {0x238B, 0x8136F533}, - {0x238C, 0x8136F534}, - {0x238D, 0x8136F535}, - {0x238E, 0x8136F536}, - {0x238F, 0x8136F537}, - {0x2390, 0x8136F538}, - {0x2391, 0x8136F539}, - {0x2392, 0x8136F630}, - {0x2393, 0x8136F631}, - {0x2394, 0x8136F632}, - {0x2395, 0x8136F633}, - {0x2396, 0x8136F634}, - {0x2397, 0x8136F635}, - {0x2398, 0x8136F636}, - {0x2399, 0x8136F637}, - {0x239A, 0x8136F638}, - {0x239B, 0x8136F639}, - {0x239C, 0x8136F730}, - {0x239D, 0x8136F731}, - {0x239E, 0x8136F732}, - {0x239F, 0x8136F733}, - {0x23A0, 0x8136F734}, - {0x23A1, 0x8136F735}, - {0x23A2, 0x8136F736}, - {0x23A3, 0x8136F737}, - {0x23A4, 0x8136F738}, - {0x23A5, 0x8136F739}, - {0x23A6, 0x8136F830}, - {0x23A7, 0x8136F831}, - {0x23A8, 0x8136F832}, - {0x23A9, 0x8136F833}, - {0x23AA, 0x8136F834}, - {0x23AB, 0x8136F835}, - {0x23AC, 0x8136F836}, - {0x23AD, 0x8136F837}, - {0x23AE, 0x8136F838}, - {0x23AF, 0x8136F839}, - {0x23B0, 0x8136F930}, - {0x23B1, 0x8136F931}, - {0x23B2, 0x8136F932}, - {0x23B3, 0x8136F933}, - {0x23B4, 0x8136F934}, - {0x23B5, 0x8136F935}, - {0x23B6, 0x8136F936}, - {0x23B7, 0x8136F937}, - {0x23B8, 0x8136F938}, - {0x23B9, 0x8136F939}, - {0x23BA, 0x8136FA30}, - {0x23BB, 0x8136FA31}, - {0x23BC, 0x8136FA32}, - {0x23BD, 0x8136FA33}, - {0x23BE, 0x8136FA34}, - {0x23BF, 0x8136FA35}, - {0x23C0, 0x8136FA36}, - {0x23C1, 0x8136FA37}, - {0x23C2, 0x8136FA38}, - {0x23C3, 0x8136FA39}, - {0x23C4, 0x8136FB30}, - {0x23C5, 0x8136FB31}, - {0x23C6, 0x8136FB32}, - {0x23C7, 0x8136FB33}, - {0x23C8, 0x8136FB34}, - {0x23C9, 0x8136FB35}, - {0x23CA, 0x8136FB36}, - {0x23CB, 0x8136FB37}, - {0x23CC, 0x8136FB38}, - {0x23CD, 0x8136FB39}, - {0x23CE, 0x8136FC30}, - {0x23CF, 0x8136FC31}, - {0x23D0, 0x8136FC32}, - {0x23D1, 0x8136FC33}, - {0x23D2, 0x8136FC34}, - {0x23D3, 0x8136FC35}, - {0x23D4, 0x8136FC36}, - {0x23D5, 0x8136FC37}, - {0x23D6, 0x8136FC38}, - {0x23D7, 0x8136FC39}, - {0x23D8, 0x8136FD30}, - {0x23D9, 0x8136FD31}, - {0x23DA, 0x8136FD32}, - {0x23DB, 0x8136FD33}, - {0x23DC, 0x8136FD34}, - {0x23DD, 0x8136FD35}, - {0x23DE, 0x8136FD36}, - {0x23DF, 0x8136FD37}, - {0x23E0, 0x8136FD38}, - {0x23E1, 0x8136FD39}, - {0x23E2, 0x8136FE30}, - {0x23E3, 0x8136FE31}, - {0x23E4, 0x8136FE32}, - {0x23E5, 0x8136FE33}, - {0x23E6, 0x8136FE34}, - {0x23E7, 0x8136FE35}, - {0x23E8, 0x8136FE36}, - {0x23E9, 0x8136FE37}, - {0x23EA, 0x8136FE38}, - {0x23EB, 0x8136FE39}, - {0x23EC, 0x81378130}, - {0x23ED, 0x81378131}, - {0x23EE, 0x81378132}, - {0x23EF, 0x81378133}, - {0x23F0, 0x81378134}, - {0x23F1, 0x81378135}, - {0x23F2, 0x81378136}, - {0x23F3, 0x81378137}, - {0x23F4, 0x81378138}, - {0x23F5, 0x81378139}, - {0x23F6, 0x81378230}, - {0x23F7, 0x81378231}, - {0x23F8, 0x81378232}, - {0x23F9, 0x81378233}, - {0x23FA, 0x81378234}, - {0x23FB, 0x81378235}, - {0x23FC, 0x81378236}, - {0x23FD, 0x81378237}, - {0x23FE, 0x81378238}, - {0x23FF, 0x81378239}, - {0x2400, 0x81378330}, - {0x2401, 0x81378331}, - {0x2402, 0x81378332}, - {0x2403, 0x81378333}, - {0x2404, 0x81378334}, - {0x2405, 0x81378335}, - {0x2406, 0x81378336}, - {0x2407, 0x81378337}, - {0x2408, 0x81378338}, - {0x2409, 0x81378339}, - {0x240A, 0x81378430}, - {0x240B, 0x81378431}, - {0x240C, 0x81378432}, - {0x240D, 0x81378433}, - {0x240E, 0x81378434}, - {0x240F, 0x81378435}, - {0x2410, 0x81378436}, - {0x2411, 0x81378437}, - {0x2412, 0x81378438}, - {0x2413, 0x81378439}, - {0x2414, 0x81378530}, - {0x2415, 0x81378531}, - {0x2416, 0x81378532}, - {0x2417, 0x81378533}, - {0x2418, 0x81378534}, - {0x2419, 0x81378535}, - {0x241A, 0x81378536}, - {0x241B, 0x81378537}, - {0x241C, 0x81378538}, - {0x241D, 0x81378539}, - {0x241E, 0x81378630}, - {0x241F, 0x81378631}, - {0x2420, 0x81378632}, - {0x2421, 0x81378633}, - {0x2422, 0x81378634}, - {0x2423, 0x81378635}, - {0x2424, 0x81378636}, - {0x2425, 0x81378637}, - {0x2426, 0x81378638}, - {0x2427, 0x81378639}, - {0x2428, 0x81378730}, - {0x2429, 0x81378731}, - {0x242A, 0x81378732}, - {0x242B, 0x81378733}, - {0x242C, 0x81378734}, - {0x242D, 0x81378735}, - {0x242E, 0x81378736}, - {0x242F, 0x81378737}, - {0x2430, 0x81378738}, - {0x2431, 0x81378739}, - {0x2432, 0x81378830}, - {0x2433, 0x81378831}, - {0x2434, 0x81378832}, - {0x2435, 0x81378833}, - {0x2436, 0x81378834}, - {0x2437, 0x81378835}, - {0x2438, 0x81378836}, - {0x2439, 0x81378837}, - {0x243A, 0x81378838}, - {0x243B, 0x81378839}, - {0x243C, 0x81378930}, - {0x243D, 0x81378931}, - {0x243E, 0x81378932}, - {0x243F, 0x81378933}, - {0x2440, 0x81378934}, - {0x2441, 0x81378935}, - {0x2442, 0x81378936}, - {0x2443, 0x81378937}, - {0x2444, 0x81378938}, - {0x2445, 0x81378939}, - {0x2446, 0x81378A30}, - {0x2447, 0x81378A31}, - {0x2448, 0x81378A32}, - {0x2449, 0x81378A33}, - {0x244A, 0x81378A34}, - {0x244B, 0x81378A35}, - {0x244C, 0x81378A36}, - {0x244D, 0x81378A37}, - {0x244E, 0x81378A38}, - {0x244F, 0x81378A39}, - {0x2450, 0x81378B30}, - {0x2451, 0x81378B31}, - {0x2452, 0x81378B32}, - {0x2453, 0x81378B33}, - {0x2454, 0x81378B34}, - {0x2455, 0x81378B35}, - {0x2456, 0x81378B36}, - {0x2457, 0x81378B37}, - {0x2458, 0x81378B38}, - {0x2459, 0x81378B39}, - {0x245A, 0x81378C30}, - {0x245B, 0x81378C31}, - {0x245C, 0x81378C32}, - {0x245D, 0x81378C33}, - {0x245E, 0x81378C34}, - {0x245F, 0x81378C35}, - {0x246A, 0x81378C36}, - {0x246B, 0x81378C37}, - {0x246C, 0x81378C38}, - {0x246D, 0x81378C39}, - {0x246E, 0x81378D30}, - {0x246F, 0x81378D31}, - {0x2470, 0x81378D32}, - {0x2471, 0x81378D33}, - {0x2472, 0x81378D34}, - {0x2473, 0x81378D35}, - {0x249C, 0x81378D36}, - {0x249D, 0x81378D37}, - {0x249E, 0x81378D38}, - {0x249F, 0x81378D39}, - {0x24A0, 0x81378E30}, - {0x24A1, 0x81378E31}, - {0x24A2, 0x81378E32}, - {0x24A3, 0x81378E33}, - {0x24A4, 0x81378E34}, - {0x24A5, 0x81378E35}, - {0x24A6, 0x81378E36}, - {0x24A7, 0x81378E37}, - {0x24A8, 0x81378E38}, - {0x24A9, 0x81378E39}, - {0x24AA, 0x81378F30}, - {0x24AB, 0x81378F31}, - {0x24AC, 0x81378F32}, - {0x24AD, 0x81378F33}, - {0x24AE, 0x81378F34}, - {0x24AF, 0x81378F35}, - {0x24B0, 0x81378F36}, - {0x24B1, 0x81378F37}, - {0x24B2, 0x81378F38}, - {0x24B3, 0x81378F39}, - {0x24B4, 0x81379030}, - {0x24B5, 0x81379031}, - {0x24B6, 0x81379032}, - {0x24B7, 0x81379033}, - {0x24B8, 0x81379034}, - {0x24B9, 0x81379035}, - {0x24BA, 0x81379036}, - {0x24BB, 0x81379037}, - {0x24BC, 0x81379038}, - {0x24BD, 0x81379039}, - {0x24BE, 0x81379130}, - {0x24BF, 0x81379131}, - {0x24C0, 0x81379132}, - {0x24C1, 0x81379133}, - {0x24C2, 0x81379134}, - {0x24C3, 0x81379135}, - {0x24C4, 0x81379136}, - {0x24C5, 0x81379137}, - {0x24C6, 0x81379138}, - {0x24C7, 0x81379139}, - {0x24C8, 0x81379230}, - {0x24C9, 0x81379231}, - {0x24CA, 0x81379232}, - {0x24CB, 0x81379233}, - {0x24CC, 0x81379234}, - {0x24CD, 0x81379235}, - {0x24CE, 0x81379236}, - {0x24CF, 0x81379237}, - {0x24D0, 0x81379238}, - {0x24D1, 0x81379239}, - {0x24D2, 0x81379330}, - {0x24D3, 0x81379331}, - {0x24D4, 0x81379332}, - {0x24D5, 0x81379333}, - {0x24D6, 0x81379334}, - {0x24D7, 0x81379335}, - {0x24D8, 0x81379336}, - {0x24D9, 0x81379337}, - {0x24DA, 0x81379338}, - {0x24DB, 0x81379339}, - {0x24DC, 0x81379430}, - {0x24DD, 0x81379431}, - {0x24DE, 0x81379432}, - {0x24DF, 0x81379433}, - {0x24E0, 0x81379434}, - {0x24E1, 0x81379435}, - {0x24E2, 0x81379436}, - {0x24E3, 0x81379437}, - {0x24E4, 0x81379438}, - {0x24E5, 0x81379439}, - {0x24E6, 0x81379530}, - {0x24E7, 0x81379531}, - {0x24E8, 0x81379532}, - {0x24E9, 0x81379533}, - {0x24EA, 0x81379534}, - {0x24EB, 0x81379535}, - {0x24EC, 0x81379536}, - {0x24ED, 0x81379537}, - {0x24EE, 0x81379538}, - {0x24EF, 0x81379539}, - {0x24F0, 0x81379630}, - {0x24F1, 0x81379631}, - {0x24F2, 0x81379632}, - {0x24F3, 0x81379633}, - {0x24F4, 0x81379634}, - {0x24F5, 0x81379635}, - {0x24F6, 0x81379636}, - {0x24F7, 0x81379637}, - {0x24F8, 0x81379638}, - {0x24F9, 0x81379639}, - {0x24FA, 0x81379730}, - {0x24FB, 0x81379731}, - {0x24FC, 0x81379732}, - {0x24FD, 0x81379733}, - {0x24FE, 0x81379734}, - {0x24FF, 0x81379735}, - {0x254C, 0x81379736}, - {0x254D, 0x81379737}, - {0x254E, 0x81379738}, - {0x254F, 0x81379739}, - {0x2574, 0x81379830}, - {0x2575, 0x81379831}, - {0x2576, 0x81379832}, - {0x2577, 0x81379833}, - {0x2578, 0x81379834}, - {0x2579, 0x81379835}, - {0x257A, 0x81379836}, - {0x257B, 0x81379837}, - {0x257C, 0x81379838}, - {0x257D, 0x81379839}, - {0x257E, 0x81379930}, - {0x257F, 0x81379931}, - {0x2580, 0x81379932}, - {0x2590, 0x81379933}, - {0x2591, 0x81379934}, - {0x2592, 0x81379935}, - {0x2596, 0x81379936}, - {0x2597, 0x81379937}, - {0x2598, 0x81379938}, - {0x2599, 0x81379939}, - {0x259A, 0x81379A30}, - {0x259B, 0x81379A31}, - {0x259C, 0x81379A32}, - {0x259D, 0x81379A33}, - {0x259E, 0x81379A34}, - {0x259F, 0x81379A35}, - {0x25A2, 0x81379A36}, - {0x25A3, 0x81379A37}, - {0x25A4, 0x81379A38}, - {0x25A5, 0x81379A39}, - {0x25A6, 0x81379B30}, - {0x25A7, 0x81379B31}, - {0x25A8, 0x81379B32}, - {0x25A9, 0x81379B33}, - {0x25AA, 0x81379B34}, - {0x25AB, 0x81379B35}, - {0x25AC, 0x81379B36}, - {0x25AD, 0x81379B37}, - {0x25AE, 0x81379B38}, - {0x25AF, 0x81379B39}, - {0x25B0, 0x81379C30}, - {0x25B1, 0x81379C31}, - {0x25B4, 0x81379C32}, - {0x25B5, 0x81379C33}, - {0x25B6, 0x81379C34}, - {0x25B7, 0x81379C35}, - {0x25B8, 0x81379C36}, - {0x25B9, 0x81379C37}, - {0x25BA, 0x81379C38}, - {0x25BB, 0x81379C39}, - {0x25BE, 0x81379D30}, - {0x25BF, 0x81379D31}, - {0x25C0, 0x81379D32}, - {0x25C1, 0x81379D33}, - {0x25C2, 0x81379D34}, - {0x25C3, 0x81379D35}, - {0x25C4, 0x81379D36}, - {0x25C5, 0x81379D37}, - {0x25C8, 0x81379D38}, - {0x25C9, 0x81379D39}, - {0x25CA, 0x81379E30}, - {0x25CC, 0x81379E31}, - {0x25CD, 0x81379E32}, - {0x25D0, 0x81379E33}, - {0x25D1, 0x81379E34}, - {0x25D2, 0x81379E35}, - {0x25D3, 0x81379E36}, - {0x25D4, 0x81379E37}, - {0x25D5, 0x81379E38}, - {0x25D6, 0x81379E39}, - {0x25D7, 0x81379F30}, - {0x25D8, 0x81379F31}, - {0x25D9, 0x81379F32}, - {0x25DA, 0x81379F33}, - {0x25DB, 0x81379F34}, - {0x25DC, 0x81379F35}, - {0x25DD, 0x81379F36}, - {0x25DE, 0x81379F37}, - {0x25DF, 0x81379F38}, - {0x25E0, 0x81379F39}, - {0x25E1, 0x8137A030}, - {0x25E6, 0x8137A031}, - {0x25E7, 0x8137A032}, - {0x25E8, 0x8137A033}, - {0x25E9, 0x8137A034}, - {0x25EA, 0x8137A035}, - {0x25EB, 0x8137A036}, - {0x25EC, 0x8137A037}, - {0x25ED, 0x8137A038}, - {0x25EE, 0x8137A039}, - {0x25EF, 0x8137A130}, - {0x25F0, 0x8137A131}, - {0x25F1, 0x8137A132}, - {0x25F2, 0x8137A133}, - {0x25F3, 0x8137A134}, - {0x25F4, 0x8137A135}, - {0x25F5, 0x8137A136}, - {0x25F6, 0x8137A137}, - {0x25F7, 0x8137A138}, - {0x25F8, 0x8137A139}, - {0x25F9, 0x8137A230}, - {0x25FA, 0x8137A231}, - {0x25FB, 0x8137A232}, - {0x25FC, 0x8137A233}, - {0x25FD, 0x8137A234}, - {0x25FE, 0x8137A235}, - {0x25FF, 0x8137A236}, - {0x2600, 0x8137A237}, - {0x2601, 0x8137A238}, - {0x2602, 0x8137A239}, - {0x2603, 0x8137A330}, - {0x2604, 0x8137A331}, - {0x2607, 0x8137A332}, - {0x2608, 0x8137A333}, - {0x260A, 0x8137A334}, - {0x260B, 0x8137A335}, - {0x260C, 0x8137A336}, - {0x260D, 0x8137A337}, - {0x260E, 0x8137A338}, - {0x260F, 0x8137A339}, - {0x2610, 0x8137A430}, - {0x2611, 0x8137A431}, - {0x2612, 0x8137A432}, - {0x2613, 0x8137A433}, - {0x2614, 0x8137A434}, - {0x2615, 0x8137A435}, - {0x2616, 0x8137A436}, - {0x2617, 0x8137A437}, - {0x2618, 0x8137A438}, - {0x2619, 0x8137A439}, - {0x261A, 0x8137A530}, - {0x261B, 0x8137A531}, - {0x261C, 0x8137A532}, - {0x261D, 0x8137A533}, - {0x261E, 0x8137A534}, - {0x261F, 0x8137A535}, - {0x2620, 0x8137A536}, - {0x2621, 0x8137A537}, - {0x2622, 0x8137A538}, - {0x2623, 0x8137A539}, - {0x2624, 0x8137A630}, - {0x2625, 0x8137A631}, - {0x2626, 0x8137A632}, - {0x2627, 0x8137A633}, - {0x2628, 0x8137A634}, - {0x2629, 0x8137A635}, - {0x262A, 0x8137A636}, - {0x262B, 0x8137A637}, - {0x262C, 0x8137A638}, - {0x262D, 0x8137A639}, - {0x262E, 0x8137A730}, - {0x262F, 0x8137A731}, - {0x2630, 0x8137A732}, - {0x2631, 0x8137A733}, - {0x2632, 0x8137A734}, - {0x2633, 0x8137A735}, - {0x2634, 0x8137A736}, - {0x2635, 0x8137A737}, - {0x2636, 0x8137A738}, - {0x2637, 0x8137A739}, - {0x2638, 0x8137A830}, - {0x2639, 0x8137A831}, - {0x263A, 0x8137A832}, - {0x263B, 0x8137A833}, - {0x263C, 0x8137A834}, - {0x263D, 0x8137A835}, - {0x263E, 0x8137A836}, - {0x263F, 0x8137A837}, - {0x2641, 0x8137A838}, - {0x2E82, 0x8138FD39}, - {0x2E83, 0x8138FE30}, - {0x2E85, 0x8138FE31}, - {0x2E86, 0x8138FE32}, - {0x2E87, 0x8138FE33}, - {0x2E89, 0x8138FE34}, - {0x2E8A, 0x8138FE35}, - {0x2E8D, 0x8138FE36}, - {0x2E8E, 0x8138FE37}, - {0x2E8F, 0x8138FE38}, - {0x2E90, 0x8138FE39}, - {0x2E91, 0x81398130}, - {0x2E92, 0x81398131}, - {0x2E93, 0x81398132}, - {0x2E94, 0x81398133}, - {0x2E95, 0x81398134}, - {0x2E96, 0x81398135}, - {0x2E98, 0x81398136}, - {0x2E99, 0x81398137}, - {0x2E9A, 0x81398138}, - {0x2E9B, 0x81398139}, - {0x2E9C, 0x81398230}, - {0x2E9D, 0x81398231}, - {0x2E9E, 0x81398232}, - {0x2E9F, 0x81398233}, - {0x2EA0, 0x81398234}, - {0x2EA1, 0x81398235}, - {0x2EA2, 0x81398236}, - {0x2EA3, 0x81398237}, - {0x2EA4, 0x81398238}, - {0x2EA5, 0x81398239}, - {0x2EA6, 0x81398330}, - {0x2EA8, 0x81398331}, - {0x2EA9, 0x81398332}, - {0x2EAB, 0x81398333}, - {0x2EAC, 0x81398334}, - {0x2EAD, 0x81398335}, - {0x2EAF, 0x81398336}, - {0x2EB0, 0x81398337}, - {0x2EB1, 0x81398338}, - {0x2EB2, 0x81398339}, - {0x2EB4, 0x81398430}, - {0x2EB5, 0x81398431}, - {0x2EB8, 0x81398432}, - {0x2EB9, 0x81398433}, - {0x2EBA, 0x81398434}, - {0x2EBC, 0x81398435}, - {0x2EBD, 0x81398436}, - {0x2EBE, 0x81398437}, - {0x2EBF, 0x81398438}, - {0x2EC0, 0x81398439}, - {0x2EC1, 0x81398530}, - {0x2EC2, 0x81398531}, - {0x2EC3, 0x81398532}, - {0x2EC4, 0x81398533}, - {0x2EC5, 0x81398534}, - {0x2EC6, 0x81398535}, - {0x2EC7, 0x81398536}, - {0x2EC8, 0x81398537}, - {0x2EC9, 0x81398538}, - {0x2ECB, 0x81398539}, - {0x2ECC, 0x81398630}, - {0x2ECD, 0x81398631}, - {0x2ECE, 0x81398632}, - {0x2ECF, 0x81398633}, - {0x2ED0, 0x81398634}, - {0x2ED1, 0x81398635}, - {0x2ED2, 0x81398636}, - {0x2ED3, 0x81398637}, - {0x2ED4, 0x81398638}, - {0x2ED5, 0x81398639}, - {0x2ED6, 0x81398730}, - {0x2ED7, 0x81398731}, - {0x2ED8, 0x81398732}, - {0x2ED9, 0x81398733}, - {0x2EDA, 0x81398734}, - {0x2EDB, 0x81398735}, - {0x2EDC, 0x81398736}, - {0x2EDD, 0x81398737}, - {0x2EDE, 0x81398738}, - {0x2EDF, 0x81398739}, - {0x2EE0, 0x81398830}, - {0x2EE1, 0x81398831}, - {0x2EE2, 0x81398832}, - {0x2EE3, 0x81398833}, - {0x2EE4, 0x81398834}, - {0x2EE5, 0x81398835}, - {0x2EE6, 0x81398836}, - {0x2EE7, 0x81398837}, - {0x2EE8, 0x81398838}, - {0x2EE9, 0x81398839}, - {0x2EEA, 0x81398930}, - {0x2EEB, 0x81398931}, - {0x2EEC, 0x81398932}, - {0x2EED, 0x81398933}, - {0x2EEE, 0x81398934}, - {0x2EEF, 0x81398935}, - {0x2EF0, 0x81398936}, - {0x2EF1, 0x81398937}, - {0x2EF2, 0x81398938}, - {0x2EF3, 0x81398939}, - {0x2EF4, 0x81398A30}, - {0x2EF5, 0x81398A31}, - {0x2EF6, 0x81398A32}, - {0x2EF7, 0x81398A33}, - {0x2EF8, 0x81398A34}, - {0x2EF9, 0x81398A35}, - {0x2EFA, 0x81398A36}, - {0x2EFB, 0x81398A37}, - {0x2EFC, 0x81398A38}, - {0x2EFD, 0x81398A39}, - {0x2EFE, 0x81398B30}, - {0x2EFF, 0x81398B31}, - {0x2F00, 0x81398B32}, - {0x2F01, 0x81398B33}, - {0x2F02, 0x81398B34}, - {0x2F03, 0x81398B35}, - {0x2F04, 0x81398B36}, - {0x2F05, 0x81398B37}, - {0x2F06, 0x81398B38}, - {0x2F07, 0x81398B39}, - {0x2F08, 0x81398C30}, - {0x2F09, 0x81398C31}, - {0x2F0A, 0x81398C32}, - {0x2F0B, 0x81398C33}, - {0x2F0C, 0x81398C34}, - {0x2F0D, 0x81398C35}, - {0x2F0E, 0x81398C36}, - {0x2F0F, 0x81398C37}, - {0x2F10, 0x81398C38}, - {0x2F11, 0x81398C39}, - {0x2F12, 0x81398D30}, - {0x2F13, 0x81398D31}, - {0x2F14, 0x81398D32}, - {0x2F15, 0x81398D33}, - {0x2F16, 0x81398D34}, - {0x2F17, 0x81398D35}, - {0x2F18, 0x81398D36}, - {0x2F19, 0x81398D37}, - {0x2F1A, 0x81398D38}, - {0x2F1B, 0x81398D39}, - {0x2F1C, 0x81398E30}, - {0x2F1D, 0x81398E31}, - {0x2F1E, 0x81398E32}, - {0x2F1F, 0x81398E33}, - {0x2F20, 0x81398E34}, - {0x2F21, 0x81398E35}, - {0x2F22, 0x81398E36}, - {0x2F23, 0x81398E37}, - {0x2F24, 0x81398E38}, - {0x2F25, 0x81398E39}, - {0x2F26, 0x81398F30}, - {0x2F27, 0x81398F31}, - {0x2F28, 0x81398F32}, - {0x2F29, 0x81398F33}, - {0x2F2A, 0x81398F34}, - {0x2F2B, 0x81398F35}, - {0x2F2C, 0x81398F36}, - {0x2F2D, 0x81398F37}, - {0x2F2E, 0x81398F38}, - {0x2F2F, 0x81398F39}, - {0x2F30, 0x81399030}, - {0x2F31, 0x81399031}, - {0x2F32, 0x81399032}, - {0x2F33, 0x81399033}, - {0x2F34, 0x81399034}, - {0x2F35, 0x81399035}, - {0x2F36, 0x81399036}, - {0x2F37, 0x81399037}, - {0x2F38, 0x81399038}, - {0x2F39, 0x81399039}, - {0x2F3A, 0x81399130}, - {0x2F3B, 0x81399131}, - {0x2F3C, 0x81399132}, - {0x2F3D, 0x81399133}, - {0x2F3E, 0x81399134}, - {0x2F3F, 0x81399135}, - {0x2F40, 0x81399136}, - {0x2F41, 0x81399137}, - {0x2F42, 0x81399138}, - {0x2F43, 0x81399139}, - {0x2F44, 0x81399230}, - {0x2F45, 0x81399231}, - {0x2F46, 0x81399232}, - {0x2F47, 0x81399233}, - {0x2F48, 0x81399234}, - {0x2F49, 0x81399235}, - {0x2F4A, 0x81399236}, - {0x2F4B, 0x81399237}, - {0x2F4C, 0x81399238}, - {0x2F4D, 0x81399239}, - {0x2F4E, 0x81399330}, - {0x2F4F, 0x81399331}, - {0x2F50, 0x81399332}, - {0x2F51, 0x81399333}, - {0x2F52, 0x81399334}, - {0x2F53, 0x81399335}, - {0x2F54, 0x81399336}, - {0x2F55, 0x81399337}, - {0x2F56, 0x81399338}, - {0x2F57, 0x81399339}, - {0x2F58, 0x81399430}, - {0x2F59, 0x81399431}, - {0x2F5A, 0x81399432}, - {0x2F5B, 0x81399433}, - {0x2F5C, 0x81399434}, - {0x2F5D, 0x81399435}, - {0x2F5E, 0x81399436}, - {0x2F5F, 0x81399437}, - {0x2F60, 0x81399438}, - {0x2F61, 0x81399439}, - {0x2F62, 0x81399530}, - {0x2F63, 0x81399531}, - {0x2F64, 0x81399532}, - {0x2F65, 0x81399533}, - {0x2F66, 0x81399534}, - {0x2F67, 0x81399535}, - {0x2F68, 0x81399536}, - {0x2F69, 0x81399537}, - {0x2F6A, 0x81399538}, - {0x2F6B, 0x81399539}, - {0x2F6C, 0x81399630}, - {0x2F6D, 0x81399631}, - {0x2F6E, 0x81399632}, - {0x2F6F, 0x81399633}, - {0x2F70, 0x81399634}, - {0x2F71, 0x81399635}, - {0x2F72, 0x81399636}, - {0x2F73, 0x81399637}, - {0x2F74, 0x81399638}, - {0x2F75, 0x81399639}, - {0x2F76, 0x81399730}, - {0x2F77, 0x81399731}, - {0x2F78, 0x81399732}, - {0x2F79, 0x81399733}, - {0x2F7A, 0x81399734}, - {0x2F7B, 0x81399735}, - {0x2F7C, 0x81399736}, - {0x2F7D, 0x81399737}, - {0x2F7E, 0x81399738}, - {0x2F7F, 0x81399739}, - {0x2F80, 0x81399830}, - {0x2F81, 0x81399831}, - {0x2F82, 0x81399832}, - {0x2F83, 0x81399833}, - {0x2F84, 0x81399834}, - {0x2F85, 0x81399835}, - {0x2F86, 0x81399836}, - {0x2F87, 0x81399837}, - {0x2F88, 0x81399838}, - {0x2F89, 0x81399839}, - {0x2F8A, 0x81399930}, - {0x2F8B, 0x81399931}, - {0x2F8C, 0x81399932}, - {0x2F8D, 0x81399933}, - {0x2F8E, 0x81399934}, - {0x2F8F, 0x81399935}, - {0x2F90, 0x81399936}, - {0x2F91, 0x81399937}, - {0x2F92, 0x81399938}, - {0x2F93, 0x81399939}, - {0x2F94, 0x81399A30}, - {0x2F95, 0x81399A31}, - {0x2F96, 0x81399A32}, - {0x2F97, 0x81399A33}, - {0x2F98, 0x81399A34}, - {0x2F99, 0x81399A35}, - {0x2F9A, 0x81399A36}, - {0x2F9B, 0x81399A37}, - {0x2F9C, 0x81399A38}, - {0x2F9D, 0x81399A39}, - {0x2F9E, 0x81399B30}, - {0x2F9F, 0x81399B31}, - {0x2FA0, 0x81399B32}, - {0x2FA1, 0x81399B33}, - {0x2FA2, 0x81399B34}, - {0x2FA3, 0x81399B35}, - {0x2FA4, 0x81399B36}, - {0x2FA5, 0x81399B37}, - {0x2FA6, 0x81399B38}, - {0x2FA7, 0x81399B39}, - {0x2FA8, 0x81399C30}, - {0x2FA9, 0x81399C31}, - {0x2FAA, 0x81399C32}, - {0x2FAB, 0x81399C33}, - {0x2FAC, 0x81399C34}, - {0x2FAD, 0x81399C35}, - {0x2FAE, 0x81399C36}, - {0x2FAF, 0x81399C37}, - {0x2FB0, 0x81399C38}, - {0x2FB1, 0x81399C39}, - {0x2FB2, 0x81399D30}, - {0x2FB3, 0x81399D31}, - {0x2FB4, 0x81399D32}, - {0x2FB5, 0x81399D33}, - {0x2FB6, 0x81399D34}, - {0x2FB7, 0x81399D35}, - {0x2FB8, 0x81399D36}, - {0x2FB9, 0x81399D37}, - {0x2FBA, 0x81399D38}, - {0x2FBB, 0x81399D39}, - {0x2FBC, 0x81399E30}, - {0x2FBD, 0x81399E31}, - {0x2FBE, 0x81399E32}, - {0x2FBF, 0x81399E33}, - {0x2FC0, 0x81399E34}, - {0x2FC1, 0x81399E35}, - {0x2FC2, 0x81399E36}, - {0x2FC3, 0x81399E37}, - {0x2FC4, 0x81399E38}, - {0x2FC5, 0x81399E39}, - {0x2FC6, 0x81399F30}, - {0x2FC7, 0x81399F31}, - {0x2FC8, 0x81399F32}, - {0x2FC9, 0x81399F33}, - {0x2FCA, 0x81399F34}, - {0x2FCB, 0x81399F35}, - {0x2FCC, 0x81399F36}, - {0x2FCD, 0x81399F37}, - {0x2FCE, 0x81399F38}, - {0x2FCF, 0x81399F39}, - {0x2FD0, 0x8139A030}, - {0x2FD1, 0x8139A031}, - {0x2FD2, 0x8139A032}, - {0x2FD3, 0x8139A033}, - {0x2FD4, 0x8139A034}, - {0x2FD5, 0x8139A035}, - {0x2FD6, 0x8139A036}, - {0x2FD7, 0x8139A037}, - {0x2FD8, 0x8139A038}, - {0x2FD9, 0x8139A039}, - {0x2FDA, 0x8139A130}, - {0x2FDB, 0x8139A131}, - {0x2FDC, 0x8139A132}, - {0x2FDD, 0x8139A133}, - {0x2FDE, 0x8139A134}, - {0x2FDF, 0x8139A135}, - {0x2FE0, 0x8139A136}, - {0x2FE1, 0x8139A137}, - {0x2FE2, 0x8139A138}, - {0x2FE3, 0x8139A139}, - {0x2FE4, 0x8139A230}, - {0x2FE5, 0x8139A231}, - {0x2FE6, 0x8139A232}, - {0x2FE7, 0x8139A233}, - {0x2FE8, 0x8139A234}, - {0x2FE9, 0x8139A235}, - {0x2FEA, 0x8139A236}, - {0x2FEB, 0x8139A237}, - {0x2FEC, 0x8139A238}, - {0x2FED, 0x8139A239}, - {0x2FEE, 0x8139A330}, - {0x2FEF, 0x8139A331}, - {0x2FFC, 0x8139A332}, - {0x2FFD, 0x8139A333}, - {0x2FFE, 0x8139A334}, - {0x2FFF, 0x8139A335}, - {0x3004, 0x8139A336}, - {0x3018, 0x8139A337}, - {0x3019, 0x8139A338}, - {0x301A, 0x8139A339}, - {0x301B, 0x8139A430}, - {0x301C, 0x8139A431}, - {0x301F, 0x8139A432}, - {0x3020, 0x8139A433}, - {0x302A, 0x8139A434}, - {0x302B, 0x8139A435}, - {0x302C, 0x8139A436}, - {0x302D, 0x8139A437}, - {0x302E, 0x8139A438}, - {0x302F, 0x8139A439}, - {0x3030, 0x8139A530}, - {0x3031, 0x8139A531}, - {0x3032, 0x8139A532}, - {0x3033, 0x8139A533}, - {0x3034, 0x8139A534}, - {0x3035, 0x8139A535}, - {0x3036, 0x8139A536}, - {0x3037, 0x8139A537}, - {0x3038, 0x8139A538}, - {0x3039, 0x8139A539}, - {0x303A, 0x8139A630}, - {0x303B, 0x8139A631}, - {0x303C, 0x8139A632}, - {0x303D, 0x8139A633}, - {0x303F, 0x8139A634}, - {0x3040, 0x8139A635}, - {0x3094, 0x8139A636}, - {0x3095, 0x8139A637}, - {0x3096, 0x8139A638}, - {0x3097, 0x8139A639}, - {0x3098, 0x8139A730}, - {0x3099, 0x8139A731}, - {0x309A, 0x8139A732}, - {0x309F, 0x8139A733}, - {0x30A0, 0x8139A734}, - {0x30F7, 0x8139A735}, - {0x30F8, 0x8139A736}, - {0x30F9, 0x8139A737}, - {0x30FA, 0x8139A738}, - {0x30FB, 0x8139A739}, - {0x30FF, 0x8139A830}, - {0x3100, 0x8139A831}, - {0x3101, 0x8139A832}, - {0x3102, 0x8139A833}, - {0x3103, 0x8139A834}, - {0x3104, 0x8139A835}, - {0x312A, 0x8139A836}, - {0x312B, 0x8139A837}, - {0x312C, 0x8139A838}, - {0x312D, 0x8139A839}, - {0x312E, 0x8139A930}, - {0x312F, 0x8139A931}, - {0x3130, 0x8139A932}, - {0x3131, 0x8139A933}, - {0x3132, 0x8139A934}, - {0x3133, 0x8139A935}, - {0x3134, 0x8139A936}, - {0x3135, 0x8139A937}, - {0x3136, 0x8139A938}, - {0x3137, 0x8139A939}, - {0x3138, 0x8139AA30}, - {0x3139, 0x8139AA31}, - {0x313A, 0x8139AA32}, - {0x313B, 0x8139AA33}, - {0x313C, 0x8139AA34}, - {0x313D, 0x8139AA35}, - {0x313E, 0x8139AA36}, - {0x313F, 0x8139AA37}, - {0x3140, 0x8139AA38}, - {0x3141, 0x8139AA39}, - {0x3142, 0x8139AB30}, - {0x3143, 0x8139AB31}, - {0x3144, 0x8139AB32}, - {0x3145, 0x8139AB33}, - {0x3146, 0x8139AB34}, - {0x3147, 0x8139AB35}, - {0x3148, 0x8139AB36}, - {0x3149, 0x8139AB37}, - {0x314A, 0x8139AB38}, - {0x314B, 0x8139AB39}, - {0x314C, 0x8139AC30}, - {0x314D, 0x8139AC31}, - {0x314E, 0x8139AC32}, - {0x314F, 0x8139AC33}, - {0x3150, 0x8139AC34}, - {0x3151, 0x8139AC35}, - {0x3152, 0x8139AC36}, - {0x3153, 0x8139AC37}, - {0x3154, 0x8139AC38}, - {0x3155, 0x8139AC39}, - {0x3156, 0x8139AD30}, - {0x3157, 0x8139AD31}, - {0x3158, 0x8139AD32}, - {0x3159, 0x8139AD33}, - {0x315A, 0x8139AD34}, - {0x315B, 0x8139AD35}, - {0x315C, 0x8139AD36}, - {0x315D, 0x8139AD37}, - {0x315E, 0x8139AD38}, - {0x315F, 0x8139AD39}, - {0x3160, 0x8139AE30}, - {0x3161, 0x8139AE31}, - {0x3162, 0x8139AE32}, - {0x3163, 0x8139AE33}, - {0x3164, 0x8139AE34}, - {0x3165, 0x8139AE35}, - {0x3166, 0x8139AE36}, - {0x3167, 0x8139AE37}, - {0x3168, 0x8139AE38}, - {0x3169, 0x8139AE39}, - {0x316A, 0x8139AF30}, - {0x316B, 0x8139AF31}, - {0x316C, 0x8139AF32}, - {0x316D, 0x8139AF33}, - {0x316E, 0x8139AF34}, - {0x316F, 0x8139AF35}, - {0x3170, 0x8139AF36}, - {0x3171, 0x8139AF37}, - {0x3172, 0x8139AF38}, - {0x3173, 0x8139AF39}, - {0x3174, 0x8139B030}, - {0x3175, 0x8139B031}, - {0x3176, 0x8139B032}, - {0x3177, 0x8139B033}, - {0x3178, 0x8139B034}, - {0x3179, 0x8139B035}, - {0x317A, 0x8139B036}, - {0x317B, 0x8139B037}, - {0x317C, 0x8139B038}, - {0x317D, 0x8139B039}, - {0x317E, 0x8139B130}, - {0x317F, 0x8139B131}, - {0x3180, 0x8139B132}, - {0x3181, 0x8139B133}, - {0x3182, 0x8139B134}, - {0x3183, 0x8139B135}, - {0x3184, 0x8139B136}, - {0x3185, 0x8139B137}, - {0x3186, 0x8139B138}, - {0x3187, 0x8139B139}, - {0x3188, 0x8139B230}, - {0x3189, 0x8139B231}, - {0x318A, 0x8139B232}, - {0x318B, 0x8139B233}, - {0x318C, 0x8139B234}, - {0x318D, 0x8139B235}, - {0x318E, 0x8139B236}, - {0x318F, 0x8139B237}, - {0x3190, 0x8139B238}, - {0x3191, 0x8139B239}, - {0x3192, 0x8139B330}, - {0x3193, 0x8139B331}, - {0x3194, 0x8139B332}, - {0x3195, 0x8139B333}, - {0x3196, 0x8139B334}, - {0x3197, 0x8139B335}, - {0x3198, 0x8139B336}, - {0x3199, 0x8139B337}, - {0x319A, 0x8139B338}, - {0x319B, 0x8139B339}, - {0x319C, 0x8139B430}, - {0x319D, 0x8139B431}, - {0x319E, 0x8139B432}, - {0x319F, 0x8139B433}, - {0x31A0, 0x8139B434}, - {0x31A1, 0x8139B435}, - {0x31A2, 0x8139B436}, - {0x31A3, 0x8139B437}, - {0x31A4, 0x8139B438}, - {0x31A5, 0x8139B439}, - {0x31A6, 0x8139B530}, - {0x31A7, 0x8139B531}, - {0x31A8, 0x8139B532}, - {0x31A9, 0x8139B533}, - {0x31AA, 0x8139B534}, - {0x31AB, 0x8139B535}, - {0x31AC, 0x8139B536}, - {0x31AD, 0x8139B537}, - {0x31AE, 0x8139B538}, - {0x31AF, 0x8139B539}, - {0x31B0, 0x8139B630}, - {0x31B1, 0x8139B631}, - {0x31B2, 0x8139B632}, - {0x31B3, 0x8139B633}, - {0x31B4, 0x8139B634}, - {0x31B5, 0x8139B635}, - {0x31B6, 0x8139B636}, - {0x31B7, 0x8139B637}, - {0x31B8, 0x8139B638}, - {0x31B9, 0x8139B639}, - {0x31BA, 0x8139B730}, - {0x31BB, 0x8139B731}, - {0x31BC, 0x8139B732}, - {0x31BD, 0x8139B733}, - {0x31BE, 0x8139B734}, - {0x31BF, 0x8139B735}, - {0x31C0, 0x8139B736}, - {0x31C1, 0x8139B737}, - {0x31C2, 0x8139B738}, - {0x31C3, 0x8139B739}, - {0x31C4, 0x8139B830}, - {0x31C5, 0x8139B831}, - {0x31C6, 0x8139B832}, - {0x31C7, 0x8139B833}, - {0x31C8, 0x8139B834}, - {0x31C9, 0x8139B835}, - {0x31CA, 0x8139B836}, - {0x31CB, 0x8139B837}, - {0x31CC, 0x8139B838}, - {0x31CD, 0x8139B839}, - {0x31CE, 0x8139B930}, - {0x31CF, 0x8139B931}, - {0x31D0, 0x8139B932}, - {0x31D1, 0x8139B933}, - {0x31D2, 0x8139B934}, - {0x31D3, 0x8139B935}, - {0x31D4, 0x8139B936}, - {0x31D5, 0x8139B937}, - {0x31D6, 0x8139B938}, - {0x31D7, 0x8139B939}, - {0x31D8, 0x8139BA30}, - {0x31D9, 0x8139BA31}, - {0x31DA, 0x8139BA32}, - {0x31DB, 0x8139BA33}, - {0x31DC, 0x8139BA34}, - {0x31DD, 0x8139BA35}, - {0x31DE, 0x8139BA36}, - {0x31DF, 0x8139BA37}, - {0x31E0, 0x8139BA38}, - {0x31E1, 0x8139BA39}, - {0x31E2, 0x8139BB30}, - {0x31E3, 0x8139BB31}, - {0x31E4, 0x8139BB32}, - {0x31E5, 0x8139BB33}, - {0x31E6, 0x8139BB34}, - {0x31E7, 0x8139BB35}, - {0x31E8, 0x8139BB36}, - {0x31E9, 0x8139BB37}, - {0x31EA, 0x8139BB38}, - {0x31EB, 0x8139BB39}, - {0x31EC, 0x8139BC30}, - {0x31ED, 0x8139BC31}, - {0x31EE, 0x8139BC32}, - {0x31EF, 0x8139BC33}, - {0x31F0, 0x8139BC34}, - {0x31F1, 0x8139BC35}, - {0x31F2, 0x8139BC36}, - {0x31F3, 0x8139BC37}, - {0x31F4, 0x8139BC38}, - {0x31F5, 0x8139BC39}, - {0x31F6, 0x8139BD30}, - {0x31F7, 0x8139BD31}, - {0x31F8, 0x8139BD32}, - {0x31F9, 0x8139BD33}, - {0x31FA, 0x8139BD34}, - {0x31FB, 0x8139BD35}, - {0x31FC, 0x8139BD36}, - {0x31FD, 0x8139BD37}, - {0x31FE, 0x8139BD38}, - {0x31FF, 0x8139BD39}, - {0x3200, 0x8139BE30}, - {0x3201, 0x8139BE31}, - {0x3202, 0x8139BE32}, - {0x3203, 0x8139BE33}, - {0x3204, 0x8139BE34}, - {0x3205, 0x8139BE35}, - {0x3206, 0x8139BE36}, - {0x3207, 0x8139BE37}, - {0x3208, 0x8139BE38}, - {0x3209, 0x8139BE39}, - {0x320A, 0x8139BF30}, - {0x320B, 0x8139BF31}, - {0x320C, 0x8139BF32}, - {0x320D, 0x8139BF33}, - {0x320E, 0x8139BF34}, - {0x320F, 0x8139BF35}, - {0x3210, 0x8139BF36}, - {0x3211, 0x8139BF37}, - {0x3212, 0x8139BF38}, - {0x3213, 0x8139BF39}, - {0x3214, 0x8139C030}, - {0x3215, 0x8139C031}, - {0x3216, 0x8139C032}, - {0x3217, 0x8139C033}, - {0x3218, 0x8139C034}, - {0x3219, 0x8139C035}, - {0x321A, 0x8139C036}, - {0x321B, 0x8139C037}, - {0x321C, 0x8139C038}, - {0x321D, 0x8139C039}, - {0x321E, 0x8139C130}, - {0x321F, 0x8139C131}, - {0x322A, 0x8139C132}, - {0x322B, 0x8139C133}, - {0x322C, 0x8139C134}, - {0x322D, 0x8139C135}, - {0x322E, 0x8139C136}, - {0x322F, 0x8139C137}, - {0x3230, 0x8139C138}, - {0x3232, 0x8139C139}, - {0x3233, 0x8139C230}, - {0x3234, 0x8139C231}, - {0x3235, 0x8139C232}, - {0x3236, 0x8139C233}, - {0x3237, 0x8139C234}, - {0x3238, 0x8139C235}, - {0x3239, 0x8139C236}, - {0x323A, 0x8139C237}, - {0x323B, 0x8139C238}, - {0x323C, 0x8139C239}, - {0x323D, 0x8139C330}, - {0x323E, 0x8139C331}, - {0x323F, 0x8139C332}, - {0x3240, 0x8139C333}, - {0x3241, 0x8139C334}, - {0x3242, 0x8139C335}, - {0x3243, 0x8139C336}, - {0x3244, 0x8139C337}, - {0x3245, 0x8139C338}, - {0x3246, 0x8139C339}, - {0x3247, 0x8139C430}, - {0x3248, 0x8139C431}, - {0x3249, 0x8139C432}, - {0x324A, 0x8139C433}, - {0x324B, 0x8139C434}, - {0x324C, 0x8139C435}, - {0x324D, 0x8139C436}, - {0x324E, 0x8139C437}, - {0x324F, 0x8139C438}, - {0x3250, 0x8139C439}, - {0x3251, 0x8139C530}, - {0x3252, 0x8139C531}, - {0x3253, 0x8139C532}, - {0x3254, 0x8139C533}, - {0x3255, 0x8139C534}, - {0x3256, 0x8139C535}, - {0x3257, 0x8139C536}, - {0x3258, 0x8139C537}, - {0x3259, 0x8139C538}, - {0x325A, 0x8139C539}, - {0x325B, 0x8139C630}, - {0x325C, 0x8139C631}, - {0x325D, 0x8139C632}, - {0x325E, 0x8139C633}, - {0x325F, 0x8139C634}, - {0x3260, 0x8139C635}, - {0x3261, 0x8139C636}, - {0x3262, 0x8139C637}, - {0x3263, 0x8139C638}, - {0x3264, 0x8139C639}, - {0x3265, 0x8139C730}, - {0x3266, 0x8139C731}, - {0x3267, 0x8139C732}, - {0x3268, 0x8139C733}, - {0x3269, 0x8139C734}, - {0x326A, 0x8139C735}, - {0x326B, 0x8139C736}, - {0x326C, 0x8139C737}, - {0x326D, 0x8139C738}, - {0x326E, 0x8139C739}, - {0x326F, 0x8139C830}, - {0x3270, 0x8139C831}, - {0x3271, 0x8139C832}, - {0x3272, 0x8139C833}, - {0x3273, 0x8139C834}, - {0x3274, 0x8139C835}, - {0x3275, 0x8139C836}, - {0x3276, 0x8139C837}, - {0x3277, 0x8139C838}, - {0x3278, 0x8139C839}, - {0x3279, 0x8139C930}, - {0x327A, 0x8139C931}, - {0x327B, 0x8139C932}, - {0x327C, 0x8139C933}, - {0x327D, 0x8139C934}, - {0x327E, 0x8139C935}, - {0x327F, 0x8139C936}, - {0x3280, 0x8139C937}, - {0x3281, 0x8139C938}, - {0x3282, 0x8139C939}, - {0x3283, 0x8139CA30}, - {0x3284, 0x8139CA31}, - {0x3285, 0x8139CA32}, - {0x3286, 0x8139CA33}, - {0x3287, 0x8139CA34}, - {0x3288, 0x8139CA35}, - {0x3289, 0x8139CA36}, - {0x328A, 0x8139CA37}, - {0x328B, 0x8139CA38}, - {0x328C, 0x8139CA39}, - {0x328D, 0x8139CB30}, - {0x328E, 0x8139CB31}, - {0x328F, 0x8139CB32}, - {0x3290, 0x8139CB33}, - {0x3291, 0x8139CB34}, - {0x3292, 0x8139CB35}, - {0x3293, 0x8139CB36}, - {0x3294, 0x8139CB37}, - {0x3295, 0x8139CB38}, - {0x3296, 0x8139CB39}, - {0x3297, 0x8139CC30}, - {0x3298, 0x8139CC31}, - {0x3299, 0x8139CC32}, - {0x329A, 0x8139CC33}, - {0x329B, 0x8139CC34}, - {0x329C, 0x8139CC35}, - {0x329D, 0x8139CC36}, - {0x329E, 0x8139CC37}, - {0x329F, 0x8139CC38}, - {0x32A0, 0x8139CC39}, - {0x32A1, 0x8139CD30}, - {0x32A2, 0x8139CD31}, - {0x32A4, 0x8139CD32}, - {0x32A5, 0x8139CD33}, - {0x32A6, 0x8139CD34}, - {0x32A7, 0x8139CD35}, - {0x32A8, 0x8139CD36}, - {0x32A9, 0x8139CD37}, - {0x32AA, 0x8139CD38}, - {0x32AB, 0x8139CD39}, - {0x32AC, 0x8139CE30}, - {0x32AD, 0x8139CE31}, - {0x32AE, 0x8139CE32}, - {0x32AF, 0x8139CE33}, - {0x32B0, 0x8139CE34}, - {0x32B1, 0x8139CE35}, - {0x32B2, 0x8139CE36}, - {0x32B3, 0x8139CE37}, - {0x32B4, 0x8139CE38}, - {0x32B5, 0x8139CE39}, - {0x32B6, 0x8139CF30}, - {0x32B7, 0x8139CF31}, - {0x32B8, 0x8139CF32}, - {0x32B9, 0x8139CF33}, - {0x32BA, 0x8139CF34}, - {0x32BB, 0x8139CF35}, - {0x32BC, 0x8139CF36}, - {0x32BD, 0x8139CF37}, - {0x32BE, 0x8139CF38}, - {0x32BF, 0x8139CF39}, - {0x32C0, 0x8139D030}, - {0x32C1, 0x8139D031}, - {0x32C2, 0x8139D032}, - {0x32C3, 0x8139D033}, - {0x32C4, 0x8139D034}, - {0x32C5, 0x8139D035}, - {0x32C6, 0x8139D036}, - {0x32C7, 0x8139D037}, - {0x32C8, 0x8139D038}, - {0x32C9, 0x8139D039}, - {0x32CA, 0x8139D130}, - {0x32CB, 0x8139D131}, - {0x32CC, 0x8139D132}, - {0x32CD, 0x8139D133}, - {0x32CE, 0x8139D134}, - {0x32CF, 0x8139D135}, - {0x32D0, 0x8139D136}, - {0x32D1, 0x8139D137}, - {0x32D2, 0x8139D138}, - {0x32D3, 0x8139D139}, - {0x32D4, 0x8139D230}, - {0x32D5, 0x8139D231}, - {0x32D6, 0x8139D232}, - {0x32D7, 0x8139D233}, - {0x32D8, 0x8139D234}, - {0x32D9, 0x8139D235}, - {0x32DA, 0x8139D236}, - {0x32DB, 0x8139D237}, - {0x32DC, 0x8139D238}, - {0x32DD, 0x8139D239}, - {0x32DE, 0x8139D330}, - {0x32DF, 0x8139D331}, - {0x32E0, 0x8139D332}, - {0x32E1, 0x8139D333}, - {0x32E2, 0x8139D334}, - {0x32E3, 0x8139D335}, - {0x32E4, 0x8139D336}, - {0x32E5, 0x8139D337}, - {0x32E6, 0x8139D338}, - {0x32E7, 0x8139D339}, - {0x32E8, 0x8139D430}, - {0x32E9, 0x8139D431}, - {0x32EA, 0x8139D432}, - {0x32EB, 0x8139D433}, - {0x32EC, 0x8139D434}, - {0x32ED, 0x8139D435}, - {0x32EE, 0x8139D436}, - {0x32EF, 0x8139D437}, - {0x32F0, 0x8139D438}, - {0x32F1, 0x8139D439}, - {0x32F2, 0x8139D530}, - {0x32F3, 0x8139D531}, - {0x32F4, 0x8139D532}, - {0x32F5, 0x8139D533}, - {0x32F6, 0x8139D534}, - {0x32F7, 0x8139D535}, - {0x32F8, 0x8139D536}, - {0x32F9, 0x8139D537}, - {0x32FA, 0x8139D538}, - {0x32FB, 0x8139D539}, - {0x32FC, 0x8139D630}, - {0x32FD, 0x8139D631}, - {0x32FE, 0x8139D632}, - {0x32FF, 0x8139D633}, - {0x3300, 0x8139D634}, - {0x3301, 0x8139D635}, - {0x3302, 0x8139D636}, - {0x3303, 0x8139D637}, - {0x3304, 0x8139D638}, - {0x3305, 0x8139D639}, - {0x3306, 0x8139D730}, - {0x3307, 0x8139D731}, - {0x3308, 0x8139D732}, - {0x3309, 0x8139D733}, - {0x330A, 0x8139D734}, - {0x330B, 0x8139D735}, - {0x330C, 0x8139D736}, - {0x330D, 0x8139D737}, - {0x330E, 0x8139D738}, - {0x330F, 0x8139D739}, - {0x3310, 0x8139D830}, - {0x3311, 0x8139D831}, - {0x3312, 0x8139D832}, - {0x3313, 0x8139D833}, - {0x3314, 0x8139D834}, - {0x3315, 0x8139D835}, - {0x3316, 0x8139D836}, - {0x3317, 0x8139D837}, - {0x3318, 0x8139D838}, - {0x3319, 0x8139D839}, - {0x331A, 0x8139D930}, - {0x331B, 0x8139D931}, - {0x331C, 0x8139D932}, - {0x331D, 0x8139D933}, - {0x331E, 0x8139D934}, - {0x331F, 0x8139D935}, - {0x3320, 0x8139D936}, - {0x3321, 0x8139D937}, - {0x3322, 0x8139D938}, - {0x3323, 0x8139D939}, - {0x3324, 0x8139DA30}, - {0x3325, 0x8139DA31}, - {0x3326, 0x8139DA32}, - {0x3327, 0x8139DA33}, - {0x3328, 0x8139DA34}, - {0x3329, 0x8139DA35}, - {0x332A, 0x8139DA36}, - {0x332B, 0x8139DA37}, - {0x332C, 0x8139DA38}, - {0x332D, 0x8139DA39}, - {0x332E, 0x8139DB30}, - {0x332F, 0x8139DB31}, - {0x3330, 0x8139DB32}, - {0x3331, 0x8139DB33}, - {0x3332, 0x8139DB34}, - {0x3333, 0x8139DB35}, - {0x3334, 0x8139DB36}, - {0x3335, 0x8139DB37}, - {0x3336, 0x8139DB38}, - {0x3337, 0x8139DB39}, - {0x3338, 0x8139DC30}, - {0x3339, 0x8139DC31}, - {0x333A, 0x8139DC32}, - {0x333B, 0x8139DC33}, - {0x333C, 0x8139DC34}, - {0x333D, 0x8139DC35}, - {0x333E, 0x8139DC36}, - {0x333F, 0x8139DC37}, - {0x3340, 0x8139DC38}, - {0x3341, 0x8139DC39}, - {0x3342, 0x8139DD30}, - {0x3343, 0x8139DD31}, - {0x3344, 0x8139DD32}, - {0x3345, 0x8139DD33}, - {0x3346, 0x8139DD34}, - {0x3347, 0x8139DD35}, - {0x3348, 0x8139DD36}, - {0x3349, 0x8139DD37}, - {0x334A, 0x8139DD38}, - {0x334B, 0x8139DD39}, - {0x334C, 0x8139DE30}, - {0x334D, 0x8139DE31}, - {0x334E, 0x8139DE32}, - {0x334F, 0x8139DE33}, - {0x3350, 0x8139DE34}, - {0x3351, 0x8139DE35}, - {0x3352, 0x8139DE36}, - {0x3353, 0x8139DE37}, - {0x3354, 0x8139DE38}, - {0x3355, 0x8139DE39}, - {0x3356, 0x8139DF30}, - {0x3357, 0x8139DF31}, - {0x3358, 0x8139DF32}, - {0x3359, 0x8139DF33}, - {0x335A, 0x8139DF34}, - {0x335B, 0x8139DF35}, - {0x335C, 0x8139DF36}, - {0x335D, 0x8139DF37}, - {0x335E, 0x8139DF38}, - {0x335F, 0x8139DF39}, - {0x3360, 0x8139E030}, - {0x3361, 0x8139E031}, - {0x3362, 0x8139E032}, - {0x3363, 0x8139E033}, - {0x3364, 0x8139E034}, - {0x3365, 0x8139E035}, - {0x3366, 0x8139E036}, - {0x3367, 0x8139E037}, - {0x3368, 0x8139E038}, - {0x3369, 0x8139E039}, - {0x336A, 0x8139E130}, - {0x336B, 0x8139E131}, - {0x336C, 0x8139E132}, - {0x336D, 0x8139E133}, - {0x336E, 0x8139E134}, - {0x336F, 0x8139E135}, - {0x3370, 0x8139E136}, - {0x3371, 0x8139E137}, - {0x3372, 0x8139E138}, - {0x3373, 0x8139E139}, - {0x3374, 0x8139E230}, - {0x3375, 0x8139E231}, - {0x3376, 0x8139E232}, - {0x3377, 0x8139E233}, - {0x3378, 0x8139E234}, - {0x3379, 0x8139E235}, - {0x337A, 0x8139E236}, - {0x337B, 0x8139E237}, - {0x337C, 0x8139E238}, - {0x337D, 0x8139E239}, - {0x337E, 0x8139E330}, - {0x337F, 0x8139E331}, - {0x3380, 0x8139E332}, - {0x3381, 0x8139E333}, - {0x3382, 0x8139E334}, - {0x3383, 0x8139E335}, - {0x3384, 0x8139E336}, - {0x3385, 0x8139E337}, - {0x3386, 0x8139E338}, - {0x3387, 0x8139E339}, - {0x3388, 0x8139E430}, - {0x3389, 0x8139E431}, - {0x338A, 0x8139E432}, - {0x338B, 0x8139E433}, - {0x338C, 0x8139E434}, - {0x338D, 0x8139E435}, - {0x3390, 0x8139E436}, - {0x3391, 0x8139E437}, - {0x3392, 0x8139E438}, - {0x3393, 0x8139E439}, - {0x3394, 0x8139E530}, - {0x3395, 0x8139E531}, - {0x3396, 0x8139E532}, - {0x3397, 0x8139E533}, - {0x3398, 0x8139E534}, - {0x3399, 0x8139E535}, - {0x339A, 0x8139E536}, - {0x339B, 0x8139E537}, - {0x339F, 0x8139E538}, - {0x33A0, 0x8139E539}, - {0x33A2, 0x8139E630}, - {0x33A3, 0x8139E631}, - {0x33A4, 0x8139E632}, - {0x33A5, 0x8139E633}, - {0x33A6, 0x8139E634}, - {0x33A7, 0x8139E635}, - {0x33A8, 0x8139E636}, - {0x33A9, 0x8139E637}, - {0x33AA, 0x8139E638}, - {0x33AB, 0x8139E639}, - {0x33AC, 0x8139E730}, - {0x33AD, 0x8139E731}, - {0x33AE, 0x8139E732}, - {0x33AF, 0x8139E733}, - {0x33B0, 0x8139E734}, - {0x33B1, 0x8139E735}, - {0x33B2, 0x8139E736}, - {0x33B3, 0x8139E737}, - {0x33B4, 0x8139E738}, - {0x33B5, 0x8139E739}, - {0x33B6, 0x8139E830}, - {0x33B7, 0x8139E831}, - {0x33B8, 0x8139E832}, - {0x33B9, 0x8139E833}, - {0x33BA, 0x8139E834}, - {0x33BB, 0x8139E835}, - {0x33BC, 0x8139E836}, - {0x33BD, 0x8139E837}, - {0x33BE, 0x8139E838}, - {0x33BF, 0x8139E839}, - {0x33C0, 0x8139E930}, - {0x33C1, 0x8139E931}, - {0x33C2, 0x8139E932}, - {0x33C3, 0x8139E933}, - {0x33C5, 0x8139E934}, - {0x33C6, 0x8139E935}, - {0x33C7, 0x8139E936}, - {0x33C8, 0x8139E937}, - {0x33C9, 0x8139E938}, - {0x33CA, 0x8139E939}, - {0x33CB, 0x8139EA30}, - {0x33CC, 0x8139EA31}, - {0x33CD, 0x8139EA32}, - {0x33CF, 0x8139EA33}, - {0x33D0, 0x8139EA34}, - {0x33D3, 0x8139EA35}, - {0x33D4, 0x8139EA36}, - {0x33D6, 0x8139EA37}, - {0x33D7, 0x8139EA38}, - {0x33D8, 0x8139EA39}, - {0x33D9, 0x8139EB30}, - {0x33DA, 0x8139EB31}, - {0x33DB, 0x8139EB32}, - {0x33DC, 0x8139EB33}, - {0x33DD, 0x8139EB34}, - {0x33DE, 0x8139EB35}, - {0x33DF, 0x8139EB36}, - {0x33E0, 0x8139EB37}, - {0x33E1, 0x8139EB38}, - {0x33E2, 0x8139EB39}, - {0x33E3, 0x8139EC30}, - {0x33E4, 0x8139EC31}, - {0x33E5, 0x8139EC32}, - {0x33E6, 0x8139EC33}, - {0x33E7, 0x8139EC34}, - {0x33E8, 0x8139EC35}, - {0x33E9, 0x8139EC36}, - {0x33EA, 0x8139EC37}, - {0x33EB, 0x8139EC38}, - {0x33EC, 0x8139EC39}, - {0x33ED, 0x8139ED30}, - {0x33EE, 0x8139ED31}, - {0x33EF, 0x8139ED32}, - {0x33F0, 0x8139ED33}, - {0x33F1, 0x8139ED34}, - {0x33F2, 0x8139ED35}, - {0x33F3, 0x8139ED36}, - {0x33F4, 0x8139ED37}, - {0x33F5, 0x8139ED38}, - {0x33F6, 0x8139ED39}, - {0x33F7, 0x8139EE30}, - {0x33F8, 0x8139EE31}, - {0x33F9, 0x8139EE32}, - {0x33FA, 0x8139EE33}, - {0x33FB, 0x8139EE34}, - {0x33FC, 0x8139EE35}, - {0x33FD, 0x8139EE36}, - {0x33FE, 0x8139EE37}, - {0x33FF, 0x8139EE38}, - {0x3400, 0x8139EE39}, - {0x3401, 0x8139EF30}, - {0x3402, 0x8139EF31}, - {0x3403, 0x8139EF32}, - {0x3404, 0x8139EF33}, - {0x3405, 0x8139EF34}, - {0x3406, 0x8139EF35}, - {0x3407, 0x8139EF36}, - {0x3408, 0x8139EF37}, - {0x3409, 0x8139EF38}, - {0x340A, 0x8139EF39}, - {0x340B, 0x8139F030}, - {0x340C, 0x8139F031}, - {0x340D, 0x8139F032}, - {0x340E, 0x8139F033}, - {0x340F, 0x8139F034}, - {0x3410, 0x8139F035}, - {0x3411, 0x8139F036}, - {0x3412, 0x8139F037}, - {0x3413, 0x8139F038}, - {0x3414, 0x8139F039}, - {0x3415, 0x8139F130}, - {0x3416, 0x8139F131}, - {0x3417, 0x8139F132}, - {0x3418, 0x8139F133}, - {0x3419, 0x8139F134}, - {0x341A, 0x8139F135}, - {0x341B, 0x8139F136}, - {0x341C, 0x8139F137}, - {0x341D, 0x8139F138}, - {0x341E, 0x8139F139}, - {0x341F, 0x8139F230}, - {0x3420, 0x8139F231}, - {0x3421, 0x8139F232}, - {0x3422, 0x8139F233}, - {0x3423, 0x8139F234}, - {0x3424, 0x8139F235}, - {0x3425, 0x8139F236}, - {0x3426, 0x8139F237}, - {0x3427, 0x8139F238}, - {0x3428, 0x8139F239}, - {0x3429, 0x8139F330}, - {0x342A, 0x8139F331}, - {0x342B, 0x8139F332}, - {0x342C, 0x8139F333}, - {0x342D, 0x8139F334}, - {0x342E, 0x8139F335}, - {0x342F, 0x8139F336}, - {0x3430, 0x8139F337}, - {0x3431, 0x8139F338}, - {0x3432, 0x8139F339}, - {0x3433, 0x8139F430}, - {0x3434, 0x8139F431}, - {0x3435, 0x8139F432}, - {0x3436, 0x8139F433}, - {0x3437, 0x8139F434}, - {0x3438, 0x8139F435}, - {0x3439, 0x8139F436}, - {0x343A, 0x8139F437}, - {0x343B, 0x8139F438}, - {0x343C, 0x8139F439}, - {0x343D, 0x8139F530}, - {0x343E, 0x8139F531}, - {0x343F, 0x8139F532}, - {0x3440, 0x8139F533}, - {0x3441, 0x8139F534}, - {0x3442, 0x8139F535}, - {0x3443, 0x8139F536}, - {0x3444, 0x8139F537}, - {0x3445, 0x8139F538}, - {0x3446, 0x8139F539}, - {0x3448, 0x8139F630}, - {0x3449, 0x8139F631}, - {0x344A, 0x8139F632}, - {0x344B, 0x8139F633}, - {0x344C, 0x8139F634}, - {0x344D, 0x8139F635}, - {0x344E, 0x8139F636}, - {0x344F, 0x8139F637}, - {0x3450, 0x8139F638}, - {0x3451, 0x8139F639}, - {0x3452, 0x8139F730}, - {0x3453, 0x8139F731}, - {0x3454, 0x8139F732}, - {0x3455, 0x8139F733}, - {0x3456, 0x8139F734}, - {0x3457, 0x8139F735}, - {0x3458, 0x8139F736}, - {0x3459, 0x8139F737}, - {0x345A, 0x8139F738}, - {0x345B, 0x8139F739}, - {0x345C, 0x8139F830}, - {0x345D, 0x8139F831}, - {0x345E, 0x8139F832}, - {0x345F, 0x8139F833}, - {0x3460, 0x8139F834}, - {0x3461, 0x8139F835}, - {0x3462, 0x8139F836}, - {0x3463, 0x8139F837}, - {0x3464, 0x8139F838}, - {0x3465, 0x8139F839}, - {0x3466, 0x8139F930}, - {0x3467, 0x8139F931}, - {0x3468, 0x8139F932}, - {0x3469, 0x8139F933}, - {0x346A, 0x8139F934}, - {0x346B, 0x8139F935}, - {0x346C, 0x8139F936}, - {0x346D, 0x8139F937}, - {0x346E, 0x8139F938}, - {0x346F, 0x8139F939}, - {0x3470, 0x8139FA30}, - {0x3471, 0x8139FA31}, - {0x3472, 0x8139FA32}, - {0x3474, 0x8139FA33}, - {0x3475, 0x8139FA34}, - {0x3476, 0x8139FA35}, - {0x3477, 0x8139FA36}, - {0x3478, 0x8139FA37}, - {0x3479, 0x8139FA38}, - {0x347A, 0x8139FA39}, - {0x347B, 0x8139FB30}, - {0x347C, 0x8139FB31}, - {0x347D, 0x8139FB32}, - {0x347E, 0x8139FB33}, - {0x347F, 0x8139FB34}, - {0x3480, 0x8139FB35}, - {0x3481, 0x8139FB36}, - {0x3482, 0x8139FB37}, - {0x3483, 0x8139FB38}, - {0x3484, 0x8139FB39}, - {0x3485, 0x8139FC30}, - {0x3486, 0x8139FC31}, - {0x3487, 0x8139FC32}, - {0x3488, 0x8139FC33}, - {0x3489, 0x8139FC34}, - {0x348A, 0x8139FC35}, - {0x348B, 0x8139FC36}, - {0x348C, 0x8139FC37}, - {0x348D, 0x8139FC38}, - {0x348E, 0x8139FC39}, - {0x348F, 0x8139FD30}, - {0x3490, 0x8139FD31}, - {0x3491, 0x8139FD32}, - {0x3492, 0x8139FD33}, - {0x3493, 0x8139FD34}, - {0x3494, 0x8139FD35}, - {0x3495, 0x8139FD36}, - {0x3496, 0x8139FD37}, - {0x3497, 0x8139FD38}, - {0x3498, 0x8139FD39}, - {0x3499, 0x8139FE30}, - {0x349A, 0x8139FE31}, - {0x349B, 0x8139FE32}, - {0x349C, 0x8139FE33}, - {0x349D, 0x8139FE34}, - {0x349E, 0x8139FE35}, - {0x349F, 0x8139FE36}, - {0x34A0, 0x8139FE37}, - {0x34A1, 0x8139FE38}, - {0x34A2, 0x8139FE39}, - {0x34A3, 0x82308130}, - {0x34A4, 0x82308131}, - {0x34A5, 0x82308132}, - {0x34A6, 0x82308133}, - {0x34A7, 0x82308134}, - {0x34A8, 0x82308135}, - {0x34A9, 0x82308136}, - {0x34AA, 0x82308137}, - {0x34AB, 0x82308138}, - {0x34AC, 0x82308139}, - {0x34AD, 0x82308230}, - {0x34AE, 0x82308231}, - {0x34AF, 0x82308232}, - {0x34B0, 0x82308233}, - {0x34B1, 0x82308234}, - {0x34B2, 0x82308235}, - {0x34B3, 0x82308236}, - {0x34B4, 0x82308237}, - {0x34B5, 0x82308238}, - {0x34B6, 0x82308239}, - {0x34B7, 0x82308330}, - {0x34B8, 0x82308331}, - {0x34B9, 0x82308332}, - {0x34BA, 0x82308333}, - {0x34BB, 0x82308334}, - {0x34BC, 0x82308335}, - {0x34BD, 0x82308336}, - {0x34BE, 0x82308337}, - {0x34BF, 0x82308338}, - {0x34C0, 0x82308339}, - {0x34C1, 0x82308430}, - {0x34C2, 0x82308431}, - {0x34C3, 0x82308432}, - {0x34C4, 0x82308433}, - {0x34C5, 0x82308434}, - {0x34C6, 0x82308435}, - {0x34C7, 0x82308436}, - {0x34C8, 0x82308437}, - {0x34C9, 0x82308438}, - {0x34CA, 0x82308439}, - {0x34CB, 0x82308530}, - {0x34CC, 0x82308531}, - {0x34CD, 0x82308532}, - {0x34CE, 0x82308533}, - {0x34CF, 0x82308534}, - {0x34D0, 0x82308535}, - {0x34D1, 0x82308536}, - {0x34D2, 0x82308537}, - {0x34D3, 0x82308538}, - {0x34D4, 0x82308539}, - {0x34D5, 0x82308630}, - {0x34D6, 0x82308631}, - {0x34D7, 0x82308632}, - {0x34D8, 0x82308633}, - {0x34D9, 0x82308634}, - {0x34DA, 0x82308635}, - {0x34DB, 0x82308636}, - {0x34DC, 0x82308637}, - {0x34DD, 0x82308638}, - {0x34DE, 0x82308639}, - {0x34DF, 0x82308730}, - {0x34E0, 0x82308731}, - {0x34E1, 0x82308732}, - {0x34E2, 0x82308733}, - {0x34E3, 0x82308734}, - {0x34E4, 0x82308735}, - {0x34E5, 0x82308736}, - {0x34E6, 0x82308737}, - {0x34E7, 0x82308738}, - {0x34E8, 0x82308739}, - {0x34E9, 0x82308830}, - {0x34EA, 0x82308831}, - {0x34EB, 0x82308832}, - {0x34EC, 0x82308833}, - {0x34ED, 0x82308834}, - {0x34EE, 0x82308835}, - {0x34EF, 0x82308836}, - {0x34F0, 0x82308837}, - {0x34F1, 0x82308838}, - {0x34F2, 0x82308839}, - {0x34F3, 0x82308930}, - {0x34F4, 0x82308931}, - {0x34F5, 0x82308932}, - {0x34F6, 0x82308933}, - {0x34F7, 0x82308934}, - {0x34F8, 0x82308935}, - {0x34F9, 0x82308936}, - {0x34FA, 0x82308937}, - {0x34FB, 0x82308938}, - {0x34FC, 0x82308939}, - {0x34FD, 0x82308A30}, - {0x34FE, 0x82308A31}, - {0x34FF, 0x82308A32}, - {0x3500, 0x82308A33}, - {0x3501, 0x82308A34}, - {0x3502, 0x82308A35}, - {0x3503, 0x82308A36}, - {0x3504, 0x82308A37}, - {0x3505, 0x82308A38}, - {0x3506, 0x82308A39}, - {0x3507, 0x82308B30}, - {0x3508, 0x82308B31}, - {0x3509, 0x82308B32}, - {0x350A, 0x82308B33}, - {0x350B, 0x82308B34}, - {0x350C, 0x82308B35}, - {0x350D, 0x82308B36}, - {0x350E, 0x82308B37}, - {0x350F, 0x82308B38}, - {0x3510, 0x82308B39}, - {0x3511, 0x82308C30}, - {0x3512, 0x82308C31}, - {0x3513, 0x82308C32}, - {0x3514, 0x82308C33}, - {0x3515, 0x82308C34}, - {0x3516, 0x82308C35}, - {0x3517, 0x82308C36}, - {0x3518, 0x82308C37}, - {0x3519, 0x82308C38}, - {0x351A, 0x82308C39}, - {0x351B, 0x82308D30}, - {0x351C, 0x82308D31}, - {0x351D, 0x82308D32}, - {0x351E, 0x82308D33}, - {0x351F, 0x82308D34}, - {0x3520, 0x82308D35}, - {0x3521, 0x82308D36}, - {0x3522, 0x82308D37}, - {0x3523, 0x82308D38}, - {0x3524, 0x82308D39}, - {0x3525, 0x82308E30}, - {0x3526, 0x82308E31}, - {0x3527, 0x82308E32}, - {0x3528, 0x82308E33}, - {0x3529, 0x82308E34}, - {0x352A, 0x82308E35}, - {0x352B, 0x82308E36}, - {0x352C, 0x82308E37}, - {0x352D, 0x82308E38}, - {0x352E, 0x82308E39}, - {0x352F, 0x82308F30}, - {0x3530, 0x82308F31}, - {0x3531, 0x82308F32}, - {0x3532, 0x82308F33}, - {0x3533, 0x82308F34}, - {0x3534, 0x82308F35}, - {0x3535, 0x82308F36}, - {0x3536, 0x82308F37}, - {0x3537, 0x82308F38}, - {0x3538, 0x82308F39}, - {0x3539, 0x82309030}, - {0x353A, 0x82309031}, - {0x353B, 0x82309032}, - {0x353C, 0x82309033}, - {0x353D, 0x82309034}, - {0x353E, 0x82309035}, - {0x353F, 0x82309036}, - {0x3540, 0x82309037}, - {0x3541, 0x82309038}, - {0x3542, 0x82309039}, - {0x3543, 0x82309130}, - {0x3544, 0x82309131}, - {0x3545, 0x82309132}, - {0x3546, 0x82309133}, - {0x3547, 0x82309134}, - {0x3548, 0x82309135}, - {0x3549, 0x82309136}, - {0x354A, 0x82309137}, - {0x354B, 0x82309138}, - {0x354C, 0x82309139}, - {0x354D, 0x82309230}, - {0x354E, 0x82309231}, - {0x354F, 0x82309232}, - {0x3550, 0x82309233}, - {0x3551, 0x82309234}, - {0x3552, 0x82309235}, - {0x3553, 0x82309236}, - {0x3554, 0x82309237}, - {0x3555, 0x82309238}, - {0x3556, 0x82309239}, - {0x3557, 0x82309330}, - {0x3558, 0x82309331}, - {0x3559, 0x82309332}, - {0x355A, 0x82309333}, - {0x355B, 0x82309334}, - {0x355C, 0x82309335}, - {0x355D, 0x82309336}, - {0x355E, 0x82309337}, - {0x355F, 0x82309338}, - {0x3560, 0x82309339}, - {0x3561, 0x82309430}, - {0x3562, 0x82309431}, - {0x3563, 0x82309432}, - {0x3564, 0x82309433}, - {0x3565, 0x82309434}, - {0x3566, 0x82309435}, - {0x3567, 0x82309436}, - {0x3568, 0x82309437}, - {0x3569, 0x82309438}, - {0x356A, 0x82309439}, - {0x356B, 0x82309530}, - {0x356C, 0x82309531}, - {0x356D, 0x82309532}, - {0x356E, 0x82309533}, - {0x356F, 0x82309534}, - {0x3570, 0x82309535}, - {0x3571, 0x82309536}, - {0x3572, 0x82309537}, - {0x3573, 0x82309538}, - {0x3574, 0x82309539}, - {0x3575, 0x82309630}, - {0x3576, 0x82309631}, - {0x3577, 0x82309632}, - {0x3578, 0x82309633}, - {0x3579, 0x82309634}, - {0x357A, 0x82309635}, - {0x357B, 0x82309636}, - {0x357C, 0x82309637}, - {0x357D, 0x82309638}, - {0x357E, 0x82309639}, - {0x357F, 0x82309730}, - {0x3580, 0x82309731}, - {0x3581, 0x82309732}, - {0x3582, 0x82309733}, - {0x3583, 0x82309734}, - {0x3584, 0x82309735}, - {0x3585, 0x82309736}, - {0x3586, 0x82309737}, - {0x3587, 0x82309738}, - {0x3588, 0x82309739}, - {0x3589, 0x82309830}, - {0x358A, 0x82309831}, - {0x358B, 0x82309832}, - {0x358C, 0x82309833}, - {0x358D, 0x82309834}, - {0x358E, 0x82309835}, - {0x358F, 0x82309836}, - {0x3590, 0x82309837}, - {0x3591, 0x82309838}, - {0x3592, 0x82309839}, - {0x3593, 0x82309930}, - {0x3594, 0x82309931}, - {0x3595, 0x82309932}, - {0x3596, 0x82309933}, - {0x3597, 0x82309934}, - {0x3598, 0x82309935}, - {0x3599, 0x82309936}, - {0x359A, 0x82309937}, - {0x359B, 0x82309938}, - {0x359C, 0x82309939}, - {0x359D, 0x82309A30}, - {0x359F, 0x82309A31}, - {0x35A0, 0x82309A32}, - {0x35A1, 0x82309A33}, - {0x35A2, 0x82309A34}, - {0x35A3, 0x82309A35}, - {0x35A4, 0x82309A36}, - {0x35A5, 0x82309A37}, - {0x35A6, 0x82309A38}, - {0x35A7, 0x82309A39}, - {0x35A8, 0x82309B30}, - {0x35A9, 0x82309B31}, - {0x35AA, 0x82309B32}, - {0x35AB, 0x82309B33}, - {0x35AC, 0x82309B34}, - {0x35AD, 0x82309B35}, - {0x35AE, 0x82309B36}, - {0x35AF, 0x82309B37}, - {0x35B0, 0x82309B38}, - {0x35B1, 0x82309B39}, - {0x35B2, 0x82309C30}, - {0x35B3, 0x82309C31}, - {0x35B4, 0x82309C32}, - {0x35B5, 0x82309C33}, - {0x35B6, 0x82309C34}, - {0x35B7, 0x82309C35}, - {0x35B8, 0x82309C36}, - {0x35B9, 0x82309C37}, - {0x35BA, 0x82309C38}, - {0x35BB, 0x82309C39}, - {0x35BC, 0x82309D30}, - {0x35BD, 0x82309D31}, - {0x35BE, 0x82309D32}, - {0x35BF, 0x82309D33}, - {0x35C0, 0x82309D34}, - {0x35C1, 0x82309D35}, - {0x35C2, 0x82309D36}, - {0x35C3, 0x82309D37}, - {0x35C4, 0x82309D38}, - {0x35C5, 0x82309D39}, - {0x35C6, 0x82309E30}, - {0x35C7, 0x82309E31}, - {0x35C8, 0x82309E32}, - {0x35C9, 0x82309E33}, - {0x35CA, 0x82309E34}, - {0x35CB, 0x82309E35}, - {0x35CC, 0x82309E36}, - {0x35CD, 0x82309E37}, - {0x35CE, 0x82309E38}, - {0x35CF, 0x82309E39}, - {0x35D0, 0x82309F30}, - {0x35D1, 0x82309F31}, - {0x35D2, 0x82309F32}, - {0x35D3, 0x82309F33}, - {0x35D4, 0x82309F34}, - {0x35D5, 0x82309F35}, - {0x35D6, 0x82309F36}, - {0x35D7, 0x82309F37}, - {0x35D8, 0x82309F38}, - {0x35D9, 0x82309F39}, - {0x35DA, 0x8230A030}, - {0x35DB, 0x8230A031}, - {0x35DC, 0x8230A032}, - {0x35DD, 0x8230A033}, - {0x35DE, 0x8230A034}, - {0x35DF, 0x8230A035}, - {0x35E0, 0x8230A036}, - {0x35E1, 0x8230A037}, - {0x35E2, 0x8230A038}, - {0x35E3, 0x8230A039}, - {0x35E4, 0x8230A130}, - {0x35E5, 0x8230A131}, - {0x35E6, 0x8230A132}, - {0x35E7, 0x8230A133}, - {0x35E8, 0x8230A134}, - {0x35E9, 0x8230A135}, - {0x35EA, 0x8230A136}, - {0x35EB, 0x8230A137}, - {0x35EC, 0x8230A138}, - {0x35ED, 0x8230A139}, - {0x35EE, 0x8230A230}, - {0x35EF, 0x8230A231}, - {0x35F0, 0x8230A232}, - {0x35F1, 0x8230A233}, - {0x35F2, 0x8230A234}, - {0x35F3, 0x8230A235}, - {0x35F4, 0x8230A236}, - {0x35F5, 0x8230A237}, - {0x35F6, 0x8230A238}, - {0x35F7, 0x8230A239}, - {0x35F8, 0x8230A330}, - {0x35F9, 0x8230A331}, - {0x35FA, 0x8230A332}, - {0x35FB, 0x8230A333}, - {0x35FC, 0x8230A334}, - {0x35FD, 0x8230A335}, - {0x35FE, 0x8230A336}, - {0x35FF, 0x8230A337}, - {0x3600, 0x8230A338}, - {0x3601, 0x8230A339}, - {0x3602, 0x8230A430}, - {0x3603, 0x8230A431}, - {0x3604, 0x8230A432}, - {0x3605, 0x8230A433}, - {0x3606, 0x8230A434}, - {0x3607, 0x8230A435}, - {0x3608, 0x8230A436}, - {0x3609, 0x8230A437}, - {0x360A, 0x8230A438}, - {0x360B, 0x8230A439}, - {0x360C, 0x8230A530}, - {0x360D, 0x8230A531}, - {0x360F, 0x8230A532}, - {0x3610, 0x8230A533}, - {0x3611, 0x8230A534}, - {0x3612, 0x8230A535}, - {0x3613, 0x8230A536}, - {0x3614, 0x8230A537}, - {0x3615, 0x8230A538}, - {0x3616, 0x8230A539}, - {0x3617, 0x8230A630}, - {0x3618, 0x8230A631}, - {0x3619, 0x8230A632}, - {0x3919, 0x8230F238}, - {0x391A, 0x8230F239}, - {0x391B, 0x8230F330}, - {0x391C, 0x8230F331}, - {0x391D, 0x8230F332}, - {0x391E, 0x8230F333}, - {0x391F, 0x8230F334}, - {0x3920, 0x8230F335}, - {0x3921, 0x8230F336}, - {0x3922, 0x8230F337}, - {0x3923, 0x8230F338}, - {0x3924, 0x8230F339}, - {0x3925, 0x8230F430}, - {0x3926, 0x8230F431}, - {0x3927, 0x8230F432}, - {0x3928, 0x8230F433}, - {0x3929, 0x8230F434}, - {0x392A, 0x8230F435}, - {0x392B, 0x8230F436}, - {0x392C, 0x8230F437}, - {0x392D, 0x8230F438}, - {0x392E, 0x8230F439}, - {0x392F, 0x8230F530}, - {0x3930, 0x8230F531}, - {0x3931, 0x8230F532}, - {0x3932, 0x8230F533}, - {0x3933, 0x8230F534}, - {0x3934, 0x8230F535}, - {0x3935, 0x8230F536}, - {0x3936, 0x8230F537}, - {0x3937, 0x8230F538}, - {0x3938, 0x8230F539}, - {0x3939, 0x8230F630}, - {0x393A, 0x8230F631}, - {0x393B, 0x8230F632}, - {0x393C, 0x8230F633}, - {0x393D, 0x8230F634}, - {0x393E, 0x8230F635}, - {0x393F, 0x8230F636}, - {0x3940, 0x8230F637}, - {0x3941, 0x8230F638}, - {0x3942, 0x8230F639}, - {0x3943, 0x8230F730}, - {0x3944, 0x8230F731}, - {0x3945, 0x8230F732}, - {0x3946, 0x8230F733}, - {0x3947, 0x8230F734}, - {0x3948, 0x8230F735}, - {0x3949, 0x8230F736}, - {0x394A, 0x8230F737}, - {0x394B, 0x8230F738}, - {0x394C, 0x8230F739}, - {0x394D, 0x8230F830}, - {0x394E, 0x8230F831}, - {0x394F, 0x8230F832}, - {0x3950, 0x8230F833}, - {0x3951, 0x8230F834}, - {0x3952, 0x8230F835}, - {0x3953, 0x8230F836}, - {0x3954, 0x8230F837}, - {0x3955, 0x8230F838}, - {0x3956, 0x8230F839}, - {0x3957, 0x8230F930}, - {0x3958, 0x8230F931}, - {0x3959, 0x8230F932}, - {0x395A, 0x8230F933}, - {0x395B, 0x8230F934}, - {0x395C, 0x8230F935}, - {0x395D, 0x8230F936}, - {0x395E, 0x8230F937}, - {0x395F, 0x8230F938}, - {0x3960, 0x8230F939}, - {0x3961, 0x8230FA30}, - {0x3962, 0x8230FA31}, - {0x3963, 0x8230FA32}, - {0x3964, 0x8230FA33}, - {0x3965, 0x8230FA34}, - {0x3966, 0x8230FA35}, - {0x3967, 0x8230FA36}, - {0x3968, 0x8230FA37}, - {0x3969, 0x8230FA38}, - {0x396A, 0x8230FA39}, - {0x396B, 0x8230FB30}, - {0x396C, 0x8230FB31}, - {0x396D, 0x8230FB32}, - {0x396F, 0x8230FB33}, - {0x3970, 0x8230FB34}, - {0x3971, 0x8230FB35}, - {0x3972, 0x8230FB36}, - {0x3973, 0x8230FB37}, - {0x3974, 0x8230FB38}, - {0x3975, 0x8230FB39}, - {0x3976, 0x8230FC30}, - {0x3977, 0x8230FC31}, - {0x3978, 0x8230FC32}, - {0x3979, 0x8230FC33}, - {0x397A, 0x8230FC34}, - {0x397B, 0x8230FC35}, - {0x397C, 0x8230FC36}, - {0x397D, 0x8230FC37}, - {0x397E, 0x8230FC38}, - {0x397F, 0x8230FC39}, - {0x3980, 0x8230FD30}, - {0x3981, 0x8230FD31}, - {0x3982, 0x8230FD32}, - {0x3983, 0x8230FD33}, - {0x3984, 0x8230FD34}, - {0x3985, 0x8230FD35}, - {0x3986, 0x8230FD36}, - {0x3987, 0x8230FD37}, - {0x3988, 0x8230FD38}, - {0x3989, 0x8230FD39}, - {0x398A, 0x8230FE30}, - {0x398B, 0x8230FE31}, - {0x398C, 0x8230FE32}, - {0x398D, 0x8230FE33}, - {0x398E, 0x8230FE34}, - {0x398F, 0x8230FE35}, - {0x3990, 0x8230FE36}, - {0x3991, 0x8230FE37}, - {0x3992, 0x8230FE38}, - {0x3993, 0x8230FE39}, - {0x3994, 0x82318130}, - {0x3995, 0x82318131}, - {0x3996, 0x82318132}, - {0x3997, 0x82318133}, - {0x3998, 0x82318134}, - {0x3999, 0x82318135}, - {0x399A, 0x82318136}, - {0x399B, 0x82318137}, - {0x399C, 0x82318138}, - {0x399D, 0x82318139}, - {0x399E, 0x82318230}, - {0x399F, 0x82318231}, - {0x39A0, 0x82318232}, - {0x39A1, 0x82318233}, - {0x39A2, 0x82318234}, - {0x39A3, 0x82318235}, - {0x39A4, 0x82318236}, - {0x39A5, 0x82318237}, - {0x39A6, 0x82318238}, - {0x39A7, 0x82318239}, - {0x39A8, 0x82318330}, - {0x39A9, 0x82318331}, - {0x39AA, 0x82318332}, - {0x39AB, 0x82318333}, - {0x39AC, 0x82318334}, - {0x39AD, 0x82318335}, - {0x39AE, 0x82318336}, - {0x39AF, 0x82318337}, - {0x39B0, 0x82318338}, - {0x39B1, 0x82318339}, - {0x39B2, 0x82318430}, - {0x39B3, 0x82318431}, - {0x39B4, 0x82318432}, - {0x39B5, 0x82318433}, - {0x39B6, 0x82318434}, - {0x39B7, 0x82318435}, - {0x39B8, 0x82318436}, - {0x39B9, 0x82318437}, - {0x39BA, 0x82318438}, - {0x39BB, 0x82318439}, - {0x39BC, 0x82318530}, - {0x39BD, 0x82318531}, - {0x39BE, 0x82318532}, - {0x39BF, 0x82318533}, - {0x39C0, 0x82318534}, - {0x39C1, 0x82318535}, - {0x39C2, 0x82318536}, - {0x39C3, 0x82318537}, - {0x39C4, 0x82318538}, - {0x39C5, 0x82318539}, - {0x39C6, 0x82318630}, - {0x39C7, 0x82318631}, - {0x39C8, 0x82318632}, - {0x39C9, 0x82318633}, - {0x39CA, 0x82318634}, - {0x39CB, 0x82318635}, - {0x39CC, 0x82318636}, - {0x39CD, 0x82318637}, - {0x39CE, 0x82318638}, - {0x39D1, 0x82318639}, - {0x39D2, 0x82318730}, - {0x39D3, 0x82318731}, - {0x39D4, 0x82318732}, - {0x39D5, 0x82318733}, - {0x39D6, 0x82318734}, - {0x39D7, 0x82318735}, - {0x39D8, 0x82318736}, - {0x39D9, 0x82318737}, - {0x39DA, 0x82318738}, - {0x39DB, 0x82318739}, - {0x39DC, 0x82318830}, - {0x39DD, 0x82318831}, - {0x39DE, 0x82318832}, - {0x39E0, 0x82318833}, - {0x39E1, 0x82318834}, - {0x39E2, 0x82318835}, - {0x39E3, 0x82318836}, - {0x39E4, 0x82318837}, - {0x39E5, 0x82318838}, - {0x39E6, 0x82318839}, - {0x39E7, 0x82318930}, - {0x39E8, 0x82318931}, - {0x39E9, 0x82318932}, - {0x39EA, 0x82318933}, - {0x39EB, 0x82318934}, - {0x39EC, 0x82318935}, - {0x39ED, 0x82318936}, - {0x39EE, 0x82318937}, - {0x39EF, 0x82318938}, - {0x39F0, 0x82318939}, - {0x39F1, 0x82318A30}, - {0x39F2, 0x82318A31}, - {0x39F3, 0x82318A32}, - {0x39F4, 0x82318A33}, - {0x39F5, 0x82318A34}, - {0x39F6, 0x82318A35}, - {0x39F7, 0x82318A36}, - {0x39F8, 0x82318A37}, - {0x39F9, 0x82318A38}, - {0x39FA, 0x82318A39}, - {0x39FB, 0x82318B30}, - {0x39FC, 0x82318B31}, - {0x39FD, 0x82318B32}, - {0x39FE, 0x82318B33}, - {0x39FF, 0x82318B34}, - {0x3A00, 0x82318B35}, - {0x3A01, 0x82318B36}, - {0x3A02, 0x82318B37}, - {0x3A03, 0x82318B38}, - {0x3A04, 0x82318B39}, - {0x3A05, 0x82318C30}, - {0x3A06, 0x82318C31}, - {0x3A07, 0x82318C32}, - {0x3A08, 0x82318C33}, - {0x3A09, 0x82318C34}, - {0x3A0A, 0x82318C35}, - {0x3A0B, 0x82318C36}, - {0x3A0C, 0x82318C37}, - {0x3A0D, 0x82318C38}, - {0x3A0E, 0x82318C39}, - {0x3A0F, 0x82318D30}, - {0x3A10, 0x82318D31}, - {0x3A11, 0x82318D32}, - {0x3A12, 0x82318D33}, - {0x3A13, 0x82318D34}, - {0x3A14, 0x82318D35}, - {0x3A15, 0x82318D36}, - {0x3A16, 0x82318D37}, - {0x3A17, 0x82318D38}, - {0x3A18, 0x82318D39}, - {0x3A19, 0x82318E30}, - {0x3A1A, 0x82318E31}, - {0x3A1B, 0x82318E32}, - {0x3A1C, 0x82318E33}, - {0x3A1D, 0x82318E34}, - {0x3A1E, 0x82318E35}, - {0x3A1F, 0x82318E36}, - {0x3A20, 0x82318E37}, - {0x3A21, 0x82318E38}, - {0x3A22, 0x82318E39}, - {0x3A23, 0x82318F30}, - {0x3A24, 0x82318F31}, - {0x3A25, 0x82318F32}, - {0x3A26, 0x82318F33}, - {0x3A27, 0x82318F34}, - {0x3A28, 0x82318F35}, - {0x3A29, 0x82318F36}, - {0x3A2A, 0x82318F37}, - {0x3A2B, 0x82318F38}, - {0x3A2C, 0x82318F39}, - {0x3A2D, 0x82319030}, - {0x3A2E, 0x82319031}, - {0x3A2F, 0x82319032}, - {0x3A30, 0x82319033}, - {0x3A31, 0x82319034}, - {0x3A32, 0x82319035}, - {0x3A33, 0x82319036}, - {0x3A34, 0x82319037}, - {0x3A35, 0x82319038}, - {0x3A36, 0x82319039}, - {0x3A37, 0x82319130}, - {0x3A38, 0x82319131}, - {0x3A39, 0x82319132}, - {0x3A3A, 0x82319133}, - {0x3A3B, 0x82319134}, - {0x3A3C, 0x82319135}, - {0x3A3D, 0x82319136}, - {0x3A3E, 0x82319137}, - {0x3A3F, 0x82319138}, - {0x3A40, 0x82319139}, - {0x3A41, 0x82319230}, - {0x3A42, 0x82319231}, - {0x3A43, 0x82319232}, - {0x3A44, 0x82319233}, - {0x3A45, 0x82319234}, - {0x3A46, 0x82319235}, - {0x3A47, 0x82319236}, - {0x3A48, 0x82319237}, - {0x3A49, 0x82319238}, - {0x3A4A, 0x82319239}, - {0x3A4B, 0x82319330}, - {0x3A4C, 0x82319331}, - {0x3A4D, 0x82319332}, - {0x3A4E, 0x82319333}, - {0x3A4F, 0x82319334}, - {0x3A50, 0x82319335}, - {0x3A51, 0x82319336}, - {0x3A52, 0x82319337}, - {0x3A53, 0x82319338}, - {0x3A54, 0x82319339}, - {0x3A55, 0x82319430}, - {0x3A56, 0x82319431}, - {0x3A57, 0x82319432}, - {0x3A58, 0x82319433}, - {0x3A59, 0x82319434}, - {0x3A5A, 0x82319435}, - {0x3A5B, 0x82319436}, - {0x3A5C, 0x82319437}, - {0x3A5D, 0x82319438}, - {0x3A5E, 0x82319439}, - {0x3A5F, 0x82319530}, - {0x3A60, 0x82319531}, - {0x3A61, 0x82319532}, - {0x3A62, 0x82319533}, - {0x3A63, 0x82319534}, - {0x3A64, 0x82319535}, - {0x3A65, 0x82319536}, - {0x3A66, 0x82319537}, - {0x3A67, 0x82319538}, - {0x3A68, 0x82319539}, - {0x3A69, 0x82319630}, - {0x3A6A, 0x82319631}, - {0x3A6B, 0x82319632}, - {0x3A6C, 0x82319633}, - {0x3A6D, 0x82319634}, - {0x3A6E, 0x82319635}, - {0x3A6F, 0x82319636}, - {0x3A70, 0x82319637}, - {0x3A71, 0x82319638}, - {0x3A72, 0x82319639}, - {0x3A74, 0x82319730}, - {0x3A75, 0x82319731}, - {0x3A76, 0x82319732}, - {0x3A77, 0x82319733}, - {0x3A78, 0x82319734}, - {0x3A79, 0x82319735}, - {0x3A7A, 0x82319736}, - {0x3A7B, 0x82319737}, - {0x3A7C, 0x82319738}, - {0x3A7D, 0x82319739}, - {0x3A7E, 0x82319830}, - {0x3A7F, 0x82319831}, - {0x3A80, 0x82319832}, - {0x3A81, 0x82319833}, - {0x3A82, 0x82319834}, - {0x3A83, 0x82319835}, - {0x3A84, 0x82319836}, - {0x3A85, 0x82319837}, - {0x3A86, 0x82319838}, - {0x3A87, 0x82319839}, - {0x3A88, 0x82319930}, - {0x3A89, 0x82319931}, - {0x3A8A, 0x82319932}, - {0x3A8B, 0x82319933}, - {0x3A8C, 0x82319934}, - {0x3A8D, 0x82319935}, - {0x3A8E, 0x82319936}, - {0x3A8F, 0x82319937}, - {0x3A90, 0x82319938}, - {0x3A91, 0x82319939}, - {0x3A92, 0x82319A30}, - {0x3A93, 0x82319A31}, - {0x3A94, 0x82319A32}, - {0x3A95, 0x82319A33}, - {0x3A96, 0x82319A34}, - {0x3A97, 0x82319A35}, - {0x3A98, 0x82319A36}, - {0x3A99, 0x82319A37}, - {0x3A9A, 0x82319A38}, - {0x3A9B, 0x82319A39}, - {0x3A9C, 0x82319B30}, - {0x3A9D, 0x82319B31}, - {0x3A9E, 0x82319B32}, - {0x3A9F, 0x82319B33}, - {0x3AA0, 0x82319B34}, - {0x3AA1, 0x82319B35}, - {0x3AA2, 0x82319B36}, - {0x3AA3, 0x82319B37}, - {0x3AA4, 0x82319B38}, - {0x3AA5, 0x82319B39}, - {0x3AA6, 0x82319C30}, - {0x3AA7, 0x82319C31}, - {0x3AA8, 0x82319C32}, - {0x3AA9, 0x82319C33}, - {0x3AAA, 0x82319C34}, - {0x3AAB, 0x82319C35}, - {0x3AAC, 0x82319C36}, - {0x3AAD, 0x82319C37}, - {0x3AAE, 0x82319C38}, - {0x3AAF, 0x82319C39}, - {0x3AB0, 0x82319D30}, - {0x3AB1, 0x82319D31}, - {0x3AB2, 0x82319D32}, - {0x3AB3, 0x82319D33}, - {0x3AB4, 0x82319D34}, - {0x3AB5, 0x82319D35}, - {0x3AB6, 0x82319D36}, - {0x3AB7, 0x82319D37}, - {0x3AB8, 0x82319D38}, - {0x3AB9, 0x82319D39}, - {0x3ABA, 0x82319E30}, - {0x3ABB, 0x82319E31}, - {0x3ABC, 0x82319E32}, - {0x3ABD, 0x82319E33}, - {0x3ABE, 0x82319E34}, - {0x3ABF, 0x82319E35}, - {0x3AC0, 0x82319E36}, - {0x3AC1, 0x82319E37}, - {0x3AC2, 0x82319E38}, - {0x3AC3, 0x82319E39}, - {0x3AC4, 0x82319F30}, - {0x3AC5, 0x82319F31}, - {0x3AC6, 0x82319F32}, - {0x3AC7, 0x82319F33}, - {0x3AC8, 0x82319F34}, - {0x3AC9, 0x82319F35}, - {0x3ACA, 0x82319F36}, - {0x3ACB, 0x82319F37}, - {0x3ACC, 0x82319F38}, - {0x3ACD, 0x82319F39}, - {0x3ACE, 0x8231A030}, - {0x3ACF, 0x8231A031}, - {0x3AD0, 0x8231A032}, - {0x3AD1, 0x8231A033}, - {0x3AD2, 0x8231A034}, - {0x3AD3, 0x8231A035}, - {0x3AD4, 0x8231A036}, - {0x3AD5, 0x8231A037}, - {0x3AD6, 0x8231A038}, - {0x3AD7, 0x8231A039}, - {0x3AD8, 0x8231A130}, - {0x3AD9, 0x8231A131}, - {0x3ADA, 0x8231A132}, - {0x3ADB, 0x8231A133}, - {0x3ADC, 0x8231A134}, - {0x3ADD, 0x8231A135}, - {0x3ADE, 0x8231A136}, - {0x3ADF, 0x8231A137}, - {0x3AE0, 0x8231A138}, - {0x3AE1, 0x8231A139}, - {0x3AE2, 0x8231A230}, - {0x3AE3, 0x8231A231}, - {0x3AE4, 0x8231A232}, - {0x3AE5, 0x8231A233}, - {0x3AE6, 0x8231A234}, - {0x3AE7, 0x8231A235}, - {0x3AE8, 0x8231A236}, - {0x3AE9, 0x8231A237}, - {0x3AEA, 0x8231A238}, - {0x3AEB, 0x8231A239}, - {0x3AEC, 0x8231A330}, - {0x3AED, 0x8231A331}, - {0x3AEE, 0x8231A332}, - {0x3AEF, 0x8231A333}, - {0x3AF0, 0x8231A334}, - {0x3AF1, 0x8231A335}, - {0x3AF2, 0x8231A336}, - {0x3AF3, 0x8231A337}, - {0x3AF4, 0x8231A338}, - {0x3AF5, 0x8231A339}, - {0x3AF6, 0x8231A430}, - {0x3AF7, 0x8231A431}, - {0x3AF8, 0x8231A432}, - {0x3AF9, 0x8231A433}, - {0x3AFA, 0x8231A434}, - {0x3AFB, 0x8231A435}, - {0x3AFC, 0x8231A436}, - {0x3AFD, 0x8231A437}, - {0x3AFE, 0x8231A438}, - {0x3AFF, 0x8231A439}, - {0x3B00, 0x8231A530}, - {0x3B01, 0x8231A531}, - {0x3B02, 0x8231A532}, - {0x3B03, 0x8231A533}, - {0x3B04, 0x8231A534}, - {0x3B05, 0x8231A535}, - {0x3B06, 0x8231A536}, - {0x3B07, 0x8231A537}, - {0x3B08, 0x8231A538}, - {0x3B09, 0x8231A539}, - {0x3B0A, 0x8231A630}, - {0x3B0B, 0x8231A631}, - {0x3B0C, 0x8231A632}, - {0x3B0D, 0x8231A633}, - {0x3B0E, 0x8231A634}, - {0x3B0F, 0x8231A635}, - {0x3B10, 0x8231A636}, - {0x3B11, 0x8231A637}, - {0x3B12, 0x8231A638}, - {0x3B13, 0x8231A639}, - {0x3B14, 0x8231A730}, - {0x3B15, 0x8231A731}, - {0x3B16, 0x8231A732}, - {0x3B17, 0x8231A733}, - {0x3B18, 0x8231A734}, - {0x3B19, 0x8231A735}, - {0x3B1A, 0x8231A736}, - {0x3B1B, 0x8231A737}, - {0x3B1C, 0x8231A738}, - {0x3B1D, 0x8231A739}, - {0x3B1E, 0x8231A830}, - {0x3B1F, 0x8231A831}, - {0x3B20, 0x8231A832}, - {0x3B21, 0x8231A833}, - {0x3B22, 0x8231A834}, - {0x3B23, 0x8231A835}, - {0x3B24, 0x8231A836}, - {0x3B25, 0x8231A837}, - {0x3B26, 0x8231A838}, - {0x3B27, 0x8231A839}, - {0x3B28, 0x8231A930}, - {0x3B29, 0x8231A931}, - {0x3B2A, 0x8231A932}, - {0x3B2B, 0x8231A933}, - {0x3B2C, 0x8231A934}, - {0x3B2D, 0x8231A935}, - {0x3B2E, 0x8231A936}, - {0x3B2F, 0x8231A937}, - {0x3B30, 0x8231A938}, - {0x3B31, 0x8231A939}, - {0x3B32, 0x8231AA30}, - {0x3B33, 0x8231AA31}, - {0x3B34, 0x8231AA32}, - {0x3B35, 0x8231AA33}, - {0x3B36, 0x8231AA34}, - {0x3B37, 0x8231AA35}, - {0x3B38, 0x8231AA36}, - {0x3B39, 0x8231AA37}, - {0x3B3A, 0x8231AA38}, - {0x3B3B, 0x8231AA39}, - {0x3B3C, 0x8231AB30}, - {0x3B3D, 0x8231AB31}, - {0x3B3E, 0x8231AB32}, - {0x3B3F, 0x8231AB33}, - {0x3B40, 0x8231AB34}, - {0x3B41, 0x8231AB35}, - {0x3B42, 0x8231AB36}, - {0x3B43, 0x8231AB37}, - {0x3B44, 0x8231AB38}, - {0x3B45, 0x8231AB39}, - {0x3B46, 0x8231AC30}, - {0x3B47, 0x8231AC31}, - {0x3B48, 0x8231AC32}, - {0x3B49, 0x8231AC33}, - {0x3B4A, 0x8231AC34}, - {0x3B4B, 0x8231AC35}, - {0x3B4C, 0x8231AC36}, - {0x3B4D, 0x8231AC37}, - {0x3B4F, 0x8231AC38}, - {0x3B50, 0x8231AC39}, - {0x3B51, 0x8231AD30}, - {0x3B52, 0x8231AD31}, - {0x3B53, 0x8231AD32}, - {0x3B54, 0x8231AD33}, - {0x3B55, 0x8231AD34}, - {0x3B56, 0x8231AD35}, - {0x3B57, 0x8231AD36}, - {0x3B58, 0x8231AD37}, - {0x3B59, 0x8231AD38}, - {0x3B5A, 0x8231AD39}, - {0x3B5B, 0x8231AE30}, - {0x3B5C, 0x8231AE31}, - {0x3B5D, 0x8231AE32}, - {0x3B5E, 0x8231AE33}, - {0x3B5F, 0x8231AE34}, - {0x3B60, 0x8231AE35}, - {0x3B61, 0x8231AE36}, - {0x3B62, 0x8231AE37}, - {0x3B63, 0x8231AE38}, - {0x3B64, 0x8231AE39}, - {0x3B65, 0x8231AF30}, - {0x3B66, 0x8231AF31}, - {0x3B67, 0x8231AF32}, - {0x3B68, 0x8231AF33}, - {0x3B69, 0x8231AF34}, - {0x3B6A, 0x8231AF35}, - {0x3B6B, 0x8231AF36}, - {0x3B6C, 0x8231AF37}, - {0x3B6D, 0x8231AF38}, - {0x3B6E, 0x8231AF39}, - {0x3B6F, 0x8231B030}, - {0x3B70, 0x8231B031}, - {0x3B71, 0x8231B032}, - {0x3B72, 0x8231B033}, - {0x3B73, 0x8231B034}, - {0x3B74, 0x8231B035}, - {0x3B75, 0x8231B036}, - {0x3B76, 0x8231B037}, - {0x3B77, 0x8231B038}, - {0x3B78, 0x8231B039}, - {0x3B79, 0x8231B130}, - {0x3B7A, 0x8231B131}, - {0x3B7B, 0x8231B132}, - {0x3B7C, 0x8231B133}, - {0x3B7D, 0x8231B134}, - {0x3B7E, 0x8231B135}, - {0x3B7F, 0x8231B136}, - {0x3B80, 0x8231B137}, - {0x3B81, 0x8231B138}, - {0x3B82, 0x8231B139}, - {0x3B83, 0x8231B230}, - {0x3B84, 0x8231B231}, - {0x3B85, 0x8231B232}, - {0x3B86, 0x8231B233}, - {0x3B87, 0x8231B234}, - {0x3B88, 0x8231B235}, - {0x3B89, 0x8231B236}, - {0x3B8A, 0x8231B237}, - {0x3B8B, 0x8231B238}, - {0x3B8C, 0x8231B239}, - {0x3B8D, 0x8231B330}, - {0x3B8E, 0x8231B331}, - {0x3B8F, 0x8231B332}, - {0x3B90, 0x8231B333}, - {0x3B91, 0x8231B334}, - {0x3B92, 0x8231B335}, - {0x3B93, 0x8231B336}, - {0x3B94, 0x8231B337}, - {0x3B95, 0x8231B338}, - {0x3B96, 0x8231B339}, - {0x3B97, 0x8231B430}, - {0x3B98, 0x8231B431}, - {0x3B99, 0x8231B432}, - {0x3B9A, 0x8231B433}, - {0x3B9B, 0x8231B434}, - {0x3B9C, 0x8231B435}, - {0x3B9D, 0x8231B436}, - {0x3B9E, 0x8231B437}, - {0x3B9F, 0x8231B438}, - {0x3BA0, 0x8231B439}, - {0x3BA1, 0x8231B530}, - {0x3BA2, 0x8231B531}, - {0x3BA3, 0x8231B532}, - {0x3BA4, 0x8231B533}, - {0x3BA5, 0x8231B534}, - {0x3BA6, 0x8231B535}, - {0x3BA7, 0x8231B536}, - {0x3BA8, 0x8231B537}, - {0x3BA9, 0x8231B538}, - {0x3BAA, 0x8231B539}, - {0x3BAB, 0x8231B630}, - {0x3BAC, 0x8231B631}, - {0x3BAD, 0x8231B632}, - {0x3BAE, 0x8231B633}, - {0x3BAF, 0x8231B634}, - {0x3BB0, 0x8231B635}, - {0x3BB1, 0x8231B636}, - {0x3BB2, 0x8231B637}, - {0x3BB3, 0x8231B638}, - {0x3BB4, 0x8231B639}, - {0x3BB5, 0x8231B730}, - {0x3BB6, 0x8231B731}, - {0x3BB7, 0x8231B732}, - {0x3BB8, 0x8231B733}, - {0x3BB9, 0x8231B734}, - {0x3BBA, 0x8231B735}, - {0x3BBB, 0x8231B736}, - {0x3BBC, 0x8231B737}, - {0x3BBD, 0x8231B738}, - {0x3BBE, 0x8231B739}, - {0x3BBF, 0x8231B830}, - {0x3BC0, 0x8231B831}, - {0x3BC1, 0x8231B832}, - {0x3BC2, 0x8231B833}, - {0x3BC3, 0x8231B834}, - {0x3BC4, 0x8231B835}, - {0x3BC5, 0x8231B836}, - {0x3BC6, 0x8231B837}, - {0x3BC7, 0x8231B838}, - {0x3BC8, 0x8231B839}, - {0x3BC9, 0x8231B930}, - {0x3BCA, 0x8231B931}, - {0x3BCB, 0x8231B932}, - {0x3BCC, 0x8231B933}, - {0x3BCD, 0x8231B934}, - {0x3BCE, 0x8231B935}, - {0x3BCF, 0x8231B936}, - {0x3BD0, 0x8231B937}, - {0x3BD1, 0x8231B938}, - {0x3BD2, 0x8231B939}, - {0x3BD3, 0x8231BA30}, - {0x3BD4, 0x8231BA31}, - {0x3BD5, 0x8231BA32}, - {0x3BD6, 0x8231BA33}, - {0x3BD7, 0x8231BA34}, - {0x3BD8, 0x8231BA35}, - {0x3BD9, 0x8231BA36}, - {0x3BDA, 0x8231BA37}, - {0x3BDB, 0x8231BA38}, - {0x3BDC, 0x8231BA39}, - {0x3BDD, 0x8231BB30}, - {0x3BDE, 0x8231BB31}, - {0x3BDF, 0x8231BB32}, - {0x3BE0, 0x8231BB33}, - {0x3BE1, 0x8231BB34}, - {0x3BE2, 0x8231BB35}, - {0x3BE3, 0x8231BB36}, - {0x3BE4, 0x8231BB37}, - {0x3BE5, 0x8231BB38}, - {0x3BE6, 0x8231BB39}, - {0x3BE7, 0x8231BC30}, - {0x3BE8, 0x8231BC31}, - {0x3BE9, 0x8231BC32}, - {0x3BEA, 0x8231BC33}, - {0x3BEB, 0x8231BC34}, - {0x3BEC, 0x8231BC35}, - {0x3BED, 0x8231BC36}, - {0x3BEE, 0x8231BC37}, - {0x3BEF, 0x8231BC38}, - {0x3BF0, 0x8231BC39}, - {0x3BF1, 0x8231BD30}, - {0x3BF2, 0x8231BD31}, - {0x3BF3, 0x8231BD32}, - {0x3BF4, 0x8231BD33}, - {0x3BF5, 0x8231BD34}, - {0x3BF6, 0x8231BD35}, - {0x3BF7, 0x8231BD36}, - {0x3BF8, 0x8231BD37}, - {0x3BF9, 0x8231BD38}, - {0x3BFA, 0x8231BD39}, - {0x3BFB, 0x8231BE30}, - {0x3BFC, 0x8231BE31}, - {0x3BFD, 0x8231BE32}, - {0x3BFE, 0x8231BE33}, - {0x3BFF, 0x8231BE34}, - {0x3C00, 0x8231BE35}, - {0x3C01, 0x8231BE36}, - {0x3C02, 0x8231BE37}, - {0x3C03, 0x8231BE38}, - {0x3C04, 0x8231BE39}, - {0x3C05, 0x8231BF30}, - {0x3C06, 0x8231BF31}, - {0x3C07, 0x8231BF32}, - {0x3C08, 0x8231BF33}, - {0x3C09, 0x8231BF34}, - {0x3C0A, 0x8231BF35}, - {0x3C0B, 0x8231BF36}, - {0x3C0C, 0x8231BF37}, - {0x3C0D, 0x8231BF38}, - {0x3C0E, 0x8231BF39}, - {0x3C0F, 0x8231C030}, - {0x3C10, 0x8231C031}, - {0x3C11, 0x8231C032}, - {0x3C12, 0x8231C033}, - {0x3C13, 0x8231C034}, - {0x3C14, 0x8231C035}, - {0x3C15, 0x8231C036}, - {0x3C16, 0x8231C037}, - {0x3C17, 0x8231C038}, - {0x3C18, 0x8231C039}, - {0x3C19, 0x8231C130}, - {0x3C1A, 0x8231C131}, - {0x3C1B, 0x8231C132}, - {0x3C1C, 0x8231C133}, - {0x3C1D, 0x8231C134}, - {0x3C1E, 0x8231C135}, - {0x3C1F, 0x8231C136}, - {0x3C20, 0x8231C137}, - {0x3C21, 0x8231C138}, - {0x3C22, 0x8231C139}, - {0x3C23, 0x8231C230}, - {0x3C24, 0x8231C231}, - {0x3C25, 0x8231C232}, - {0x3C26, 0x8231C233}, - {0x3C27, 0x8231C234}, - {0x3C28, 0x8231C235}, - {0x3C29, 0x8231C236}, - {0x3C2A, 0x8231C237}, - {0x3C2B, 0x8231C238}, - {0x3C2C, 0x8231C239}, - {0x3C2D, 0x8231C330}, - {0x3C2E, 0x8231C331}, - {0x3C2F, 0x8231C332}, - {0x3C30, 0x8231C333}, - {0x3C31, 0x8231C334}, - {0x3C32, 0x8231C335}, - {0x3C33, 0x8231C336}, - {0x3C34, 0x8231C337}, - {0x3C35, 0x8231C338}, - {0x3C36, 0x8231C339}, - {0x3C37, 0x8231C430}, - {0x3C38, 0x8231C431}, - {0x3C39, 0x8231C432}, - {0x3C3A, 0x8231C433}, - {0x3C3B, 0x8231C434}, - {0x3C3C, 0x8231C435}, - {0x3C3D, 0x8231C436}, - {0x3C3E, 0x8231C437}, - {0x3C3F, 0x8231C438}, - {0x3C40, 0x8231C439}, - {0x3C41, 0x8231C530}, - {0x3C42, 0x8231C531}, - {0x3C43, 0x8231C532}, - {0x3C44, 0x8231C533}, - {0x3C45, 0x8231C534}, - {0x3C46, 0x8231C535}, - {0x3C47, 0x8231C536}, - {0x3C48, 0x8231C537}, - {0x3C49, 0x8231C538}, - {0x3C4A, 0x8231C539}, - {0x3C4B, 0x8231C630}, - {0x3C4C, 0x8231C631}, - {0x3C4D, 0x8231C632}, - {0x3C4E, 0x8231C633}, - {0x3C4F, 0x8231C634}, - {0x3C50, 0x8231C635}, - {0x3C51, 0x8231C636}, - {0x3C52, 0x8231C637}, - {0x3C53, 0x8231C638}, - {0x3C54, 0x8231C639}, - {0x3C55, 0x8231C730}, - {0x3C56, 0x8231C731}, - {0x3C57, 0x8231C732}, - {0x3C58, 0x8231C733}, - {0x3C59, 0x8231C734}, - {0x3C5A, 0x8231C735}, - {0x3C5B, 0x8231C736}, - {0x3C5C, 0x8231C737}, - {0x3C5D, 0x8231C738}, - {0x3C5E, 0x8231C739}, - {0x3C5F, 0x8231C830}, - {0x3C60, 0x8231C831}, - {0x3C61, 0x8231C832}, - {0x3C62, 0x8231C833}, - {0x3C63, 0x8231C834}, - {0x3C64, 0x8231C835}, - {0x3C65, 0x8231C836}, - {0x3C66, 0x8231C837}, - {0x3C67, 0x8231C838}, - {0x3C68, 0x8231C839}, - {0x3C69, 0x8231C930}, - {0x3C6A, 0x8231C931}, - {0x3C6B, 0x8231C932}, - {0x3C6C, 0x8231C933}, - {0x3C6D, 0x8231C934}, - {0x3C6F, 0x8231C935}, - {0x3C70, 0x8231C936}, - {0x3C71, 0x8231C937}, - {0x3C72, 0x8231C938}, - {0x3C73, 0x8231C939}, - {0x3C74, 0x8231CA30}, - {0x3C75, 0x8231CA31}, - {0x3C76, 0x8231CA32}, - {0x3C77, 0x8231CA33}, - {0x3C78, 0x8231CA34}, - {0x3C79, 0x8231CA35}, - {0x3C7A, 0x8231CA36}, - {0x3C7B, 0x8231CA37}, - {0x3C7C, 0x8231CA38}, - {0x3C7D, 0x8231CA39}, - {0x3C7E, 0x8231CB30}, - {0x3C7F, 0x8231CB31}, - {0x3C80, 0x8231CB32}, - {0x3C81, 0x8231CB33}, - {0x3C82, 0x8231CB34}, - {0x3C83, 0x8231CB35}, - {0x3C84, 0x8231CB36}, - {0x3C85, 0x8231CB37}, - {0x3C86, 0x8231CB38}, - {0x3C87, 0x8231CB39}, - {0x3C88, 0x8231CC30}, - {0x3C89, 0x8231CC31}, - {0x3C8A, 0x8231CC32}, - {0x3C8B, 0x8231CC33}, - {0x3C8C, 0x8231CC34}, - {0x3C8D, 0x8231CC35}, - {0x3C8E, 0x8231CC36}, - {0x3C8F, 0x8231CC37}, - {0x3C90, 0x8231CC38}, - {0x3C91, 0x8231CC39}, - {0x3C92, 0x8231CD30}, - {0x3C93, 0x8231CD31}, - {0x3C94, 0x8231CD32}, - {0x3C95, 0x8231CD33}, - {0x3C96, 0x8231CD34}, - {0x3C97, 0x8231CD35}, - {0x3C98, 0x8231CD36}, - {0x3C99, 0x8231CD37}, - {0x3C9A, 0x8231CD38}, - {0x3C9B, 0x8231CD39}, - {0x3C9C, 0x8231CE30}, - {0x3C9D, 0x8231CE31}, - {0x3C9E, 0x8231CE32}, - {0x3C9F, 0x8231CE33}, - {0x3CA0, 0x8231CE34}, - {0x3CA1, 0x8231CE35}, - {0x3CA2, 0x8231CE36}, - {0x3CA3, 0x8231CE37}, - {0x3CA4, 0x8231CE38}, - {0x3CA5, 0x8231CE39}, - {0x3CA6, 0x8231CF30}, - {0x3CA7, 0x8231CF31}, - {0x3CA8, 0x8231CF32}, - {0x3CA9, 0x8231CF33}, - {0x3CAA, 0x8231CF34}, - {0x3CAB, 0x8231CF35}, - {0x3CAC, 0x8231CF36}, - {0x3CAD, 0x8231CF37}, - {0x3CAE, 0x8231CF38}, - {0x3CAF, 0x8231CF39}, - {0x3CB0, 0x8231D030}, - {0x3CB1, 0x8231D031}, - {0x3CB2, 0x8231D032}, - {0x3CB3, 0x8231D033}, - {0x3CB4, 0x8231D034}, - {0x3CB5, 0x8231D035}, - {0x3CB6, 0x8231D036}, - {0x3CB7, 0x8231D037}, - {0x3CB8, 0x8231D038}, - {0x3CB9, 0x8231D039}, - {0x3CBA, 0x8231D130}, - {0x3CBB, 0x8231D131}, - {0x3CBC, 0x8231D132}, - {0x3CBD, 0x8231D133}, - {0x3CBE, 0x8231D134}, - {0x3CBF, 0x8231D135}, - {0x3CC0, 0x8231D136}, - {0x3CC1, 0x8231D137}, - {0x3CC2, 0x8231D138}, - {0x3CC3, 0x8231D139}, - {0x3CC4, 0x8231D230}, - {0x3CC5, 0x8231D231}, - {0x3CC6, 0x8231D232}, - {0x3CC7, 0x8231D233}, - {0x3CC8, 0x8231D234}, - {0x3CC9, 0x8231D235}, - {0x3CCA, 0x8231D236}, - {0x3CCB, 0x8231D237}, - {0x3CCC, 0x8231D238}, - {0x3CCD, 0x8231D239}, - {0x3CCE, 0x8231D330}, - {0x3CCF, 0x8231D331}, - {0x3CD0, 0x8231D332}, - {0x3CD1, 0x8231D333}, - {0x3CD2, 0x8231D334}, - {0x3CD3, 0x8231D335}, - {0x3CD4, 0x8231D336}, - {0x3CD5, 0x8231D337}, - {0x3CD6, 0x8231D338}, - {0x3CD7, 0x8231D339}, - {0x3CD8, 0x8231D430}, - {0x3CD9, 0x8231D431}, - {0x3CDA, 0x8231D432}, - {0x3CDB, 0x8231D433}, - {0x3CDC, 0x8231D434}, - {0x3CDD, 0x8231D435}, - {0x3CDE, 0x8231D436}, - {0x3CDF, 0x8231D437}, - {0x4057, 0x8232AF33}, - {0x4058, 0x8232AF34}, - {0x4059, 0x8232AF35}, - {0x405A, 0x8232AF36}, - {0x405B, 0x8232AF37}, - {0x405C, 0x8232AF38}, - {0x405D, 0x8232AF39}, - {0x405E, 0x8232B030}, - {0x405F, 0x8232B031}, - {0x4060, 0x8232B032}, - {0x4061, 0x8232B033}, - {0x4062, 0x8232B034}, - {0x4063, 0x8232B035}, - {0x4064, 0x8232B036}, - {0x4065, 0x8232B037}, - {0x4066, 0x8232B038}, - {0x4067, 0x8232B039}, - {0x4068, 0x8232B130}, - {0x4069, 0x8232B131}, - {0x406A, 0x8232B132}, - {0x406B, 0x8232B133}, - {0x406C, 0x8232B134}, - {0x406D, 0x8232B135}, - {0x406E, 0x8232B136}, - {0x406F, 0x8232B137}, - {0x4070, 0x8232B138}, - {0x4071, 0x8232B139}, - {0x4072, 0x8232B230}, - {0x4073, 0x8232B231}, - {0x4074, 0x8232B232}, - {0x4075, 0x8232B233}, - {0x4076, 0x8232B234}, - {0x4077, 0x8232B235}, - {0x4078, 0x8232B236}, - {0x4079, 0x8232B237}, - {0x407A, 0x8232B238}, - {0x407B, 0x8232B239}, - {0x407C, 0x8232B330}, - {0x407D, 0x8232B331}, - {0x407E, 0x8232B332}, - {0x407F, 0x8232B333}, - {0x4080, 0x8232B334}, - {0x4081, 0x8232B335}, - {0x4082, 0x8232B336}, - {0x4083, 0x8232B337}, - {0x4084, 0x8232B338}, - {0x4085, 0x8232B339}, - {0x4086, 0x8232B430}, - {0x4087, 0x8232B431}, - {0x4088, 0x8232B432}, - {0x4089, 0x8232B433}, - {0x408A, 0x8232B434}, - {0x408B, 0x8232B435}, - {0x408C, 0x8232B436}, - {0x408D, 0x8232B437}, - {0x408E, 0x8232B438}, - {0x408F, 0x8232B439}, - {0x4090, 0x8232B530}, - {0x4091, 0x8232B531}, - {0x4092, 0x8232B532}, - {0x4093, 0x8232B533}, - {0x4094, 0x8232B534}, - {0x4095, 0x8232B535}, - {0x4096, 0x8232B536}, - {0x4097, 0x8232B537}, - {0x4098, 0x8232B538}, - {0x4099, 0x8232B539}, - {0x409A, 0x8232B630}, - {0x409B, 0x8232B631}, - {0x409C, 0x8232B632}, - {0x409D, 0x8232B633}, - {0x409E, 0x8232B634}, - {0x409F, 0x8232B635}, - {0x40A0, 0x8232B636}, - {0x40A1, 0x8232B637}, - {0x40A2, 0x8232B638}, - {0x40A3, 0x8232B639}, - {0x40A4, 0x8232B730}, - {0x40A5, 0x8232B731}, - {0x40A6, 0x8232B732}, - {0x40A7, 0x8232B733}, - {0x40A8, 0x8232B734}, - {0x40A9, 0x8232B735}, - {0x40AA, 0x8232B736}, - {0x40AB, 0x8232B737}, - {0x40AC, 0x8232B738}, - {0x40AD, 0x8232B739}, - {0x40AE, 0x8232B830}, - {0x40AF, 0x8232B831}, - {0x40B0, 0x8232B832}, - {0x40B1, 0x8232B833}, - {0x40B2, 0x8232B834}, - {0x40B3, 0x8232B835}, - {0x40B4, 0x8232B836}, - {0x40B5, 0x8232B837}, - {0x40B6, 0x8232B838}, - {0x40B7, 0x8232B839}, - {0x40B8, 0x8232B930}, - {0x40B9, 0x8232B931}, - {0x40BA, 0x8232B932}, - {0x40BB, 0x8232B933}, - {0x40BC, 0x8232B934}, - {0x40BD, 0x8232B935}, - {0x40BE, 0x8232B936}, - {0x40BF, 0x8232B937}, - {0x40C0, 0x8232B938}, - {0x40C1, 0x8232B939}, - {0x40C2, 0x8232BA30}, - {0x40C3, 0x8232BA31}, - {0x40C4, 0x8232BA32}, - {0x40C5, 0x8232BA33}, - {0x40C6, 0x8232BA34}, - {0x40C7, 0x8232BA35}, - {0x40C8, 0x8232BA36}, - {0x40C9, 0x8232BA37}, - {0x40CA, 0x8232BA38}, - {0x40CB, 0x8232BA39}, - {0x40CC, 0x8232BB30}, - {0x40CD, 0x8232BB31}, - {0x40CE, 0x8232BB32}, - {0x40CF, 0x8232BB33}, - {0x40D0, 0x8232BB34}, - {0x40D1, 0x8232BB35}, - {0x40D2, 0x8232BB36}, - {0x40D3, 0x8232BB37}, - {0x40D4, 0x8232BB38}, - {0x40D5, 0x8232BB39}, - {0x40D6, 0x8232BC30}, - {0x40D7, 0x8232BC31}, - {0x40D8, 0x8232BC32}, - {0x40D9, 0x8232BC33}, - {0x40DA, 0x8232BC34}, - {0x40DB, 0x8232BC35}, - {0x40DC, 0x8232BC36}, - {0x40DD, 0x8232BC37}, - {0x40DE, 0x8232BC38}, - {0x40DF, 0x8232BC39}, - {0x40E0, 0x8232BD30}, - {0x40E1, 0x8232BD31}, - {0x40E2, 0x8232BD32}, - {0x40E3, 0x8232BD33}, - {0x40E4, 0x8232BD34}, - {0x40E5, 0x8232BD35}, - {0x40E6, 0x8232BD36}, - {0x40E7, 0x8232BD37}, - {0x40E8, 0x8232BD38}, - {0x40E9, 0x8232BD39}, - {0x40EA, 0x8232BE30}, - {0x40EB, 0x8232BE31}, - {0x40EC, 0x8232BE32}, - {0x40ED, 0x8232BE33}, - {0x40EE, 0x8232BE34}, - {0x40EF, 0x8232BE35}, - {0x40F0, 0x8232BE36}, - {0x40F1, 0x8232BE37}, - {0x40F2, 0x8232BE38}, - {0x40F3, 0x8232BE39}, - {0x40F4, 0x8232BF30}, - {0x40F5, 0x8232BF31}, - {0x40F6, 0x8232BF32}, - {0x40F7, 0x8232BF33}, - {0x40F8, 0x8232BF34}, - {0x40F9, 0x8232BF35}, - {0x40FA, 0x8232BF36}, - {0x40FB, 0x8232BF37}, - {0x40FC, 0x8232BF38}, - {0x40FD, 0x8232BF39}, - {0x40FE, 0x8232C030}, - {0x40FF, 0x8232C031}, - {0x4100, 0x8232C032}, - {0x4101, 0x8232C033}, - {0x4102, 0x8232C034}, - {0x4103, 0x8232C035}, - {0x4104, 0x8232C036}, - {0x4105, 0x8232C037}, - {0x4106, 0x8232C038}, - {0x4107, 0x8232C039}, - {0x4108, 0x8232C130}, - {0x4109, 0x8232C131}, - {0x410A, 0x8232C132}, - {0x410B, 0x8232C133}, - {0x410C, 0x8232C134}, - {0x410D, 0x8232C135}, - {0x410E, 0x8232C136}, - {0x410F, 0x8232C137}, - {0x4110, 0x8232C138}, - {0x4111, 0x8232C139}, - {0x4112, 0x8232C230}, - {0x4113, 0x8232C231}, - {0x4114, 0x8232C232}, - {0x4115, 0x8232C233}, - {0x4116, 0x8232C234}, - {0x4117, 0x8232C235}, - {0x4118, 0x8232C236}, - {0x4119, 0x8232C237}, - {0x411A, 0x8232C238}, - {0x411B, 0x8232C239}, - {0x411C, 0x8232C330}, - {0x411D, 0x8232C331}, - {0x411E, 0x8232C332}, - {0x411F, 0x8232C333}, - {0x4120, 0x8232C334}, - {0x4121, 0x8232C335}, - {0x4122, 0x8232C336}, - {0x4123, 0x8232C337}, - {0x4124, 0x8232C338}, - {0x4125, 0x8232C339}, - {0x4126, 0x8232C430}, - {0x4127, 0x8232C431}, - {0x4128, 0x8232C432}, - {0x4129, 0x8232C433}, - {0x412A, 0x8232C434}, - {0x412B, 0x8232C435}, - {0x412C, 0x8232C436}, - {0x412D, 0x8232C437}, - {0x412E, 0x8232C438}, - {0x412F, 0x8232C439}, - {0x4130, 0x8232C530}, - {0x4131, 0x8232C531}, - {0x4132, 0x8232C532}, - {0x4133, 0x8232C533}, - {0x4134, 0x8232C534}, - {0x4135, 0x8232C535}, - {0x4136, 0x8232C536}, - {0x4137, 0x8232C537}, - {0x4138, 0x8232C538}, - {0x4139, 0x8232C539}, - {0x413A, 0x8232C630}, - {0x413B, 0x8232C631}, - {0x413C, 0x8232C632}, - {0x413D, 0x8232C633}, - {0x413E, 0x8232C634}, - {0x413F, 0x8232C635}, - {0x4140, 0x8232C636}, - {0x4141, 0x8232C637}, - {0x4142, 0x8232C638}, - {0x4143, 0x8232C639}, - {0x4144, 0x8232C730}, - {0x4145, 0x8232C731}, - {0x4146, 0x8232C732}, - {0x4147, 0x8232C733}, - {0x4148, 0x8232C734}, - {0x4149, 0x8232C735}, - {0x414A, 0x8232C736}, - {0x414B, 0x8232C737}, - {0x414C, 0x8232C738}, - {0x414D, 0x8232C739}, - {0x414E, 0x8232C830}, - {0x414F, 0x8232C831}, - {0x4150, 0x8232C832}, - {0x4151, 0x8232C833}, - {0x4152, 0x8232C834}, - {0x4153, 0x8232C835}, - {0x4154, 0x8232C836}, - {0x4155, 0x8232C837}, - {0x4156, 0x8232C838}, - {0x4157, 0x8232C839}, - {0x4158, 0x8232C930}, - {0x4159, 0x8232C931}, - {0x415A, 0x8232C932}, - {0x415B, 0x8232C933}, - {0x415C, 0x8232C934}, - {0x415D, 0x8232C935}, - {0x415E, 0x8232C936}, - {0x4338, 0x8232F838}, - {0x4339, 0x8232F839}, - {0x433A, 0x8232F930}, - {0x433B, 0x8232F931}, - {0x433C, 0x8232F932}, - {0x433D, 0x8232F933}, - {0x433E, 0x8232F934}, - {0x433F, 0x8232F935}, - {0x4340, 0x8232F936}, - {0x4341, 0x8232F937}, - {0x4342, 0x8232F938}, - {0x4343, 0x8232F939}, - {0x4344, 0x8232FA30}, - {0x4345, 0x8232FA31}, - {0x4346, 0x8232FA32}, - {0x4347, 0x8232FA33}, - {0x4348, 0x8232FA34}, - {0x4349, 0x8232FA35}, - {0x434A, 0x8232FA36}, - {0x434B, 0x8232FA37}, - {0x434C, 0x8232FA38}, - {0x434D, 0x8232FA39}, - {0x434E, 0x8232FB30}, - {0x434F, 0x8232FB31}, - {0x4350, 0x8232FB32}, - {0x4351, 0x8232FB33}, - {0x4352, 0x8232FB34}, - {0x4353, 0x8232FB35}, - {0x4354, 0x8232FB36}, - {0x4355, 0x8232FB37}, - {0x4356, 0x8232FB38}, - {0x4357, 0x8232FB39}, - {0x4358, 0x8232FC30}, - {0x4359, 0x8232FC31}, - {0x435A, 0x8232FC32}, - {0x435B, 0x8232FC33}, - {0x435C, 0x8232FC34}, - {0x435D, 0x8232FC35}, - {0x435E, 0x8232FC36}, - {0x435F, 0x8232FC37}, - {0x4360, 0x8232FC38}, - {0x4361, 0x8232FC39}, - {0x4362, 0x8232FD30}, - {0x4363, 0x8232FD31}, - {0x4364, 0x8232FD32}, - {0x4365, 0x8232FD33}, - {0x4366, 0x8232FD34}, - {0x4367, 0x8232FD35}, - {0x4368, 0x8232FD36}, - {0x4369, 0x8232FD37}, - {0x436A, 0x8232FD38}, - {0x436B, 0x8232FD39}, - {0x436C, 0x8232FE30}, - {0x436D, 0x8232FE31}, - {0x436E, 0x8232FE32}, - {0x436F, 0x8232FE33}, - {0x4370, 0x8232FE34}, - {0x4371, 0x8232FE35}, - {0x4372, 0x8232FE36}, - {0x4373, 0x8232FE37}, - {0x4374, 0x8232FE38}, - {0x4375, 0x8232FE39}, - {0x4376, 0x82338130}, - {0x4377, 0x82338131}, - {0x4378, 0x82338132}, - {0x4379, 0x82338133}, - {0x437A, 0x82338134}, - {0x437B, 0x82338135}, - {0x437C, 0x82338136}, - {0x437D, 0x82338137}, - {0x437E, 0x82338138}, - {0x437F, 0x82338139}, - {0x4380, 0x82338230}, - {0x4381, 0x82338231}, - {0x4382, 0x82338232}, - {0x4383, 0x82338233}, - {0x4384, 0x82338234}, - {0x4385, 0x82338235}, - {0x4386, 0x82338236}, - {0x4387, 0x82338237}, - {0x4388, 0x82338238}, - {0x4389, 0x82338239}, - {0x438A, 0x82338330}, - {0x438B, 0x82338331}, - {0x438C, 0x82338332}, - {0x438D, 0x82338333}, - {0x438E, 0x82338334}, - {0x438F, 0x82338335}, - {0x4390, 0x82338336}, - {0x4391, 0x82338337}, - {0x4392, 0x82338338}, - {0x4393, 0x82338339}, - {0x4394, 0x82338430}, - {0x4395, 0x82338431}, - {0x4396, 0x82338432}, - {0x4397, 0x82338433}, - {0x4398, 0x82338434}, - {0x4399, 0x82338435}, - {0x439A, 0x82338436}, - {0x439B, 0x82338437}, - {0x439C, 0x82338438}, - {0x439D, 0x82338439}, - {0x439E, 0x82338530}, - {0x439F, 0x82338531}, - {0x43A0, 0x82338532}, - {0x43A1, 0x82338533}, - {0x43A2, 0x82338534}, - {0x43A3, 0x82338535}, - {0x43A4, 0x82338536}, - {0x43A5, 0x82338537}, - {0x43A6, 0x82338538}, - {0x43A7, 0x82338539}, - {0x43A8, 0x82338630}, - {0x43A9, 0x82338631}, - {0x43AA, 0x82338632}, - {0x43AB, 0x82338633}, - {0x43AD, 0x82338634}, - {0x43AE, 0x82338635}, - {0x43AF, 0x82338636}, - {0x43B0, 0x82338637}, - {0x43B2, 0x82338638}, - {0x43B3, 0x82338639}, - {0x43B4, 0x82338730}, - {0x43B5, 0x82338731}, - {0x43B6, 0x82338732}, - {0x43B7, 0x82338733}, - {0x43B8, 0x82338734}, - {0x43B9, 0x82338735}, - {0x43BA, 0x82338736}, - {0x43BB, 0x82338737}, - {0x43BC, 0x82338738}, - {0x43BD, 0x82338739}, - {0x43BE, 0x82338830}, - {0x43BF, 0x82338831}, - {0x43C0, 0x82338832}, - {0x43C1, 0x82338833}, - {0x43C2, 0x82338834}, - {0x43C3, 0x82338835}, - {0x43C4, 0x82338836}, - {0x43C5, 0x82338837}, - {0x43C6, 0x82338838}, - {0x43C7, 0x82338839}, - {0x43C8, 0x82338930}, - {0x43C9, 0x82338931}, - {0x43CA, 0x82338932}, - {0x43CB, 0x82338933}, - {0x43CC, 0x82338934}, - {0x43CD, 0x82338935}, - {0x43CE, 0x82338936}, - {0x43CF, 0x82338937}, - {0x43D0, 0x82338938}, - {0x43D1, 0x82338939}, - {0x43D2, 0x82338A30}, - {0x43D3, 0x82338A31}, - {0x43D4, 0x82338A32}, - {0x43D5, 0x82338A33}, - {0x43D6, 0x82338A34}, - {0x43D7, 0x82338A35}, - {0x43D8, 0x82338A36}, - {0x43D9, 0x82338A37}, - {0x43DA, 0x82338A38}, - {0x43DB, 0x82338A39}, - {0x43DC, 0x82338B30}, - {0x43DE, 0x82338B31}, - {0x43DF, 0x82338B32}, - {0x43E0, 0x82338B33}, - {0x43E1, 0x82338B34}, - {0x43E2, 0x82338B35}, - {0x43E3, 0x82338B36}, - {0x43E4, 0x82338B37}, - {0x43E5, 0x82338B38}, - {0x43E6, 0x82338B39}, - {0x43E7, 0x82338C30}, - {0x43E8, 0x82338C31}, - {0x43E9, 0x82338C32}, - {0x43EA, 0x82338C33}, - {0x43EB, 0x82338C34}, - {0x43EC, 0x82338C35}, - {0x43ED, 0x82338C36}, - {0x43EE, 0x82338C37}, - {0x43EF, 0x82338C38}, - {0x43F0, 0x82338C39}, - {0x43F1, 0x82338D30}, - {0x43F2, 0x82338D31}, - {0x43F3, 0x82338D32}, - {0x43F4, 0x82338D33}, - {0x43F5, 0x82338D34}, - {0x43F6, 0x82338D35}, - {0x43F7, 0x82338D36}, - {0x43F8, 0x82338D37}, - {0x43F9, 0x82338D38}, - {0x43FA, 0x82338D39}, - {0x43FB, 0x82338E30}, - {0x43FC, 0x82338E31}, - {0x43FD, 0x82338E32}, - {0x43FE, 0x82338E33}, - {0x43FF, 0x82338E34}, - {0x4400, 0x82338E35}, - {0x4401, 0x82338E36}, - {0x4402, 0x82338E37}, - {0x4403, 0x82338E38}, - {0x4404, 0x82338E39}, - {0x4405, 0x82338F30}, - {0x4406, 0x82338F31}, - {0x4407, 0x82338F32}, - {0x4408, 0x82338F33}, - {0x4409, 0x82338F34}, - {0x440A, 0x82338F35}, - {0x440B, 0x82338F36}, - {0x440C, 0x82338F37}, - {0x440D, 0x82338F38}, - {0x440E, 0x82338F39}, - {0x440F, 0x82339030}, - {0x4410, 0x82339031}, - {0x4411, 0x82339032}, - {0x4412, 0x82339033}, - {0x4413, 0x82339034}, - {0x4414, 0x82339035}, - {0x4415, 0x82339036}, - {0x4416, 0x82339037}, - {0x4417, 0x82339038}, - {0x4418, 0x82339039}, - {0x4419, 0x82339130}, - {0x441A, 0x82339131}, - {0x441B, 0x82339132}, - {0x441C, 0x82339133}, - {0x441D, 0x82339134}, - {0x441E, 0x82339135}, - {0x441F, 0x82339136}, - {0x4420, 0x82339137}, - {0x4421, 0x82339138}, - {0x4422, 0x82339139}, - {0x4423, 0x82339230}, - {0x4424, 0x82339231}, - {0x4425, 0x82339232}, - {0x4426, 0x82339233}, - {0x4427, 0x82339234}, - {0x4428, 0x82339235}, - {0x4429, 0x82339236}, - {0x442A, 0x82339237}, - {0x442B, 0x82339238}, - {0x442C, 0x82339239}, - {0x442D, 0x82339330}, - {0x442E, 0x82339331}, - {0x442F, 0x82339332}, - {0x4430, 0x82339333}, - {0x4431, 0x82339334}, - {0x4432, 0x82339335}, - {0x4433, 0x82339336}, - {0x4434, 0x82339337}, - {0x4435, 0x82339338}, - {0x4436, 0x82339339}, - {0x4437, 0x82339430}, - {0x4438, 0x82339431}, - {0x4439, 0x82339432}, - {0x443A, 0x82339433}, - {0x443B, 0x82339434}, - {0x443C, 0x82339435}, - {0x443D, 0x82339436}, - {0x443E, 0x82339437}, - {0x443F, 0x82339438}, - {0x4440, 0x82339439}, - {0x4441, 0x82339530}, - {0x4442, 0x82339531}, - {0x4443, 0x82339532}, - {0x4444, 0x82339533}, - {0x4445, 0x82339534}, - {0x4446, 0x82339535}, - {0x4447, 0x82339536}, - {0x4448, 0x82339537}, - {0x4449, 0x82339538}, - {0x444A, 0x82339539}, - {0x444B, 0x82339630}, - {0x444C, 0x82339631}, - {0x444D, 0x82339632}, - {0x444E, 0x82339633}, - {0x444F, 0x82339634}, - {0x4450, 0x82339635}, - {0x4451, 0x82339636}, - {0x4452, 0x82339637}, - {0x4453, 0x82339638}, - {0x4454, 0x82339639}, - {0x4455, 0x82339730}, - {0x4456, 0x82339731}, - {0x4457, 0x82339732}, - {0x4458, 0x82339733}, - {0x4459, 0x82339734}, - {0x445A, 0x82339735}, - {0x445B, 0x82339736}, - {0x445C, 0x82339737}, - {0x445D, 0x82339738}, - {0x445E, 0x82339739}, - {0x445F, 0x82339830}, - {0x4460, 0x82339831}, - {0x4461, 0x82339832}, - {0x4462, 0x82339833}, - {0x4463, 0x82339834}, - {0x4464, 0x82339835}, - {0x4465, 0x82339836}, - {0x4466, 0x82339837}, - {0x4467, 0x82339838}, - {0x4468, 0x82339839}, - {0x4469, 0x82339930}, - {0x446A, 0x82339931}, - {0x446B, 0x82339932}, - {0x446C, 0x82339933}, - {0x446D, 0x82339934}, - {0x446E, 0x82339935}, - {0x446F, 0x82339936}, - {0x4470, 0x82339937}, - {0x4471, 0x82339938}, - {0x4472, 0x82339939}, - {0x4473, 0x82339A30}, - {0x4474, 0x82339A31}, - {0x4475, 0x82339A32}, - {0x4476, 0x82339A33}, - {0x4477, 0x82339A34}, - {0x4478, 0x82339A35}, - {0x4479, 0x82339A36}, - {0x447A, 0x82339A37}, - {0x447B, 0x82339A38}, - {0x447C, 0x82339A39}, - {0x447D, 0x82339B30}, - {0x447E, 0x82339B31}, - {0x447F, 0x82339B32}, - {0x4480, 0x82339B33}, - {0x4481, 0x82339B34}, - {0x4482, 0x82339B35}, - {0x4483, 0x82339B36}, - {0x4484, 0x82339B37}, - {0x4485, 0x82339B38}, - {0x4486, 0x82339B39}, - {0x4487, 0x82339C30}, - {0x4488, 0x82339C31}, - {0x4489, 0x82339C32}, - {0x448A, 0x82339C33}, - {0x448B, 0x82339C34}, - {0x448C, 0x82339C35}, - {0x448D, 0x82339C36}, - {0x448E, 0x82339C37}, - {0x448F, 0x82339C38}, - {0x4490, 0x82339C39}, - {0x4491, 0x82339D30}, - {0x4492, 0x82339D31}, - {0x4493, 0x82339D32}, - {0x4494, 0x82339D33}, - {0x4495, 0x82339D34}, - {0x4496, 0x82339D35}, - {0x4497, 0x82339D36}, - {0x4498, 0x82339D37}, - {0x4499, 0x82339D38}, - {0x449A, 0x82339D39}, - {0x449B, 0x82339E30}, - {0x449C, 0x82339E31}, - {0x449D, 0x82339E32}, - {0x449E, 0x82339E33}, - {0x449F, 0x82339E34}, - {0x44A0, 0x82339E35}, - {0x44A1, 0x82339E36}, - {0x44A2, 0x82339E37}, - {0x44A3, 0x82339E38}, - {0x44A4, 0x82339E39}, - {0x44A5, 0x82339F30}, - {0x44A6, 0x82339F31}, - {0x44A7, 0x82339F32}, - {0x44A8, 0x82339F33}, - {0x44A9, 0x82339F34}, - {0x44AA, 0x82339F35}, - {0x44AB, 0x82339F36}, - {0x44AC, 0x82339F37}, - {0x44AD, 0x82339F38}, - {0x44AE, 0x82339F39}, - {0x44AF, 0x8233A030}, - {0x44B0, 0x8233A031}, - {0x44B1, 0x8233A032}, - {0x44B2, 0x8233A033}, - {0x44B3, 0x8233A034}, - {0x44B4, 0x8233A035}, - {0x44B5, 0x8233A036}, - {0x44B6, 0x8233A037}, - {0x44B7, 0x8233A038}, - {0x44B8, 0x8233A039}, - {0x44B9, 0x8233A130}, - {0x44BA, 0x8233A131}, - {0x44BB, 0x8233A132}, - {0x44BC, 0x8233A133}, - {0x44BD, 0x8233A134}, - {0x44BE, 0x8233A135}, - {0x44BF, 0x8233A136}, - {0x44C0, 0x8233A137}, - {0x44C1, 0x8233A138}, - {0x44C2, 0x8233A139}, - {0x44C3, 0x8233A230}, - {0x44C4, 0x8233A231}, - {0x44C5, 0x8233A232}, - {0x44C6, 0x8233A233}, - {0x44C7, 0x8233A234}, - {0x44C8, 0x8233A235}, - {0x44C9, 0x8233A236}, - {0x44CA, 0x8233A237}, - {0x44CB, 0x8233A238}, - {0x44CC, 0x8233A239}, - {0x44CD, 0x8233A330}, - {0x44CE, 0x8233A331}, - {0x44CF, 0x8233A332}, - {0x44D0, 0x8233A333}, - {0x44D1, 0x8233A334}, - {0x44D2, 0x8233A335}, - {0x44D3, 0x8233A336}, - {0x44D4, 0x8233A337}, - {0x44D5, 0x8233A338}, - {0x464D, 0x8233C932}, - {0x464E, 0x8233C933}, - {0x464F, 0x8233C934}, - {0x4650, 0x8233C935}, - {0x4651, 0x8233C936}, - {0x4652, 0x8233C937}, - {0x4653, 0x8233C938}, - {0x4654, 0x8233C939}, - {0x4655, 0x8233CA30}, - {0x4656, 0x8233CA31}, - {0x4657, 0x8233CA32}, - {0x4658, 0x8233CA33}, - {0x4659, 0x8233CA34}, - {0x465A, 0x8233CA35}, - {0x465B, 0x8233CA36}, - {0x465C, 0x8233CA37}, - {0x465D, 0x8233CA38}, - {0x465E, 0x8233CA39}, - {0x465F, 0x8233CB30}, - {0x4660, 0x8233CB31}, - {0x4662, 0x8233CB32}, - {0x4663, 0x8233CB33}, - {0x4664, 0x8233CB34}, - {0x4665, 0x8233CB35}, - {0x4666, 0x8233CB36}, - {0x4667, 0x8233CB37}, - {0x4668, 0x8233CB38}, - {0x4669, 0x8233CB39}, - {0x466A, 0x8233CC30}, - {0x466B, 0x8233CC31}, - {0x466C, 0x8233CC32}, - {0x466D, 0x8233CC33}, - {0x466E, 0x8233CC34}, - {0x466F, 0x8233CC35}, - {0x4670, 0x8233CC36}, - {0x4671, 0x8233CC37}, - {0x4672, 0x8233CC38}, - {0x4673, 0x8233CC39}, - {0x4674, 0x8233CD30}, - {0x4675, 0x8233CD31}, - {0x4676, 0x8233CD32}, - {0x4677, 0x8233CD33}, - {0x4678, 0x8233CD34}, - {0x4679, 0x8233CD35}, - {0x467A, 0x8233CD36}, - {0x467B, 0x8233CD37}, - {0x467C, 0x8233CD38}, - {0x467D, 0x8233CD39}, - {0x467E, 0x8233CE30}, - {0x467F, 0x8233CE31}, - {0x4680, 0x8233CE32}, - {0x4681, 0x8233CE33}, - {0x4682, 0x8233CE34}, - {0x4683, 0x8233CE35}, - {0x4684, 0x8233CE36}, - {0x4685, 0x8233CE37}, - {0x4686, 0x8233CE38}, - {0x4687, 0x8233CE39}, - {0x4688, 0x8233CF30}, - {0x4689, 0x8233CF31}, - {0x468A, 0x8233CF32}, - {0x468B, 0x8233CF33}, - {0x468C, 0x8233CF34}, - {0x468D, 0x8233CF35}, - {0x468E, 0x8233CF36}, - {0x468F, 0x8233CF37}, - {0x4690, 0x8233CF38}, - {0x4691, 0x8233CF39}, - {0x4692, 0x8233D030}, - {0x4693, 0x8233D031}, - {0x4694, 0x8233D032}, - {0x4695, 0x8233D033}, - {0x4696, 0x8233D034}, - {0x4697, 0x8233D035}, - {0x4698, 0x8233D036}, - {0x4699, 0x8233D037}, - {0x469A, 0x8233D038}, - {0x469B, 0x8233D039}, - {0x469C, 0x8233D130}, - {0x469D, 0x8233D131}, - {0x469E, 0x8233D132}, - {0x469F, 0x8233D133}, - {0x46A0, 0x8233D134}, - {0x46A1, 0x8233D135}, - {0x46A2, 0x8233D136}, - {0x46A3, 0x8233D137}, - {0x46A4, 0x8233D138}, - {0x46A5, 0x8233D139}, - {0x46A6, 0x8233D230}, - {0x46A7, 0x8233D231}, - {0x46A8, 0x8233D232}, - {0x46A9, 0x8233D233}, - {0x46AA, 0x8233D234}, - {0x46AB, 0x8233D235}, - {0x46AC, 0x8233D236}, - {0x46AD, 0x8233D237}, - {0x46AE, 0x8233D238}, - {0x46AF, 0x8233D239}, - {0x46B0, 0x8233D330}, - {0x46B1, 0x8233D331}, - {0x46B2, 0x8233D332}, - {0x46B3, 0x8233D333}, - {0x46B4, 0x8233D334}, - {0x46B5, 0x8233D335}, - {0x46B6, 0x8233D336}, - {0x46B7, 0x8233D337}, - {0x46B8, 0x8233D338}, - {0x46B9, 0x8233D339}, - {0x46BA, 0x8233D430}, - {0x46BB, 0x8233D431}, - {0x46BC, 0x8233D432}, - {0x46BD, 0x8233D433}, - {0x46BE, 0x8233D434}, - {0x46BF, 0x8233D435}, - {0x46C0, 0x8233D436}, - {0x46C1, 0x8233D437}, - {0x46C2, 0x8233D438}, - {0x46C3, 0x8233D439}, - {0x46C4, 0x8233D530}, - {0x46C5, 0x8233D531}, - {0x46C6, 0x8233D532}, - {0x46C7, 0x8233D533}, - {0x46C8, 0x8233D534}, - {0x46C9, 0x8233D535}, - {0x46CA, 0x8233D536}, - {0x46CB, 0x8233D537}, - {0x46CC, 0x8233D538}, - {0x46CD, 0x8233D539}, - {0x46CE, 0x8233D630}, - {0x46CF, 0x8233D631}, - {0x46D0, 0x8233D632}, - {0x46D1, 0x8233D633}, - {0x46D2, 0x8233D634}, - {0x46D3, 0x8233D635}, - {0x46D4, 0x8233D636}, - {0x46D5, 0x8233D637}, - {0x46D6, 0x8233D638}, - {0x46D7, 0x8233D639}, - {0x46D8, 0x8233D730}, - {0x46D9, 0x8233D731}, - {0x46DA, 0x8233D732}, - {0x46DB, 0x8233D733}, - {0x46DC, 0x8233D734}, - {0x46DD, 0x8233D735}, - {0x46DE, 0x8233D736}, - {0x46DF, 0x8233D737}, - {0x46E0, 0x8233D738}, - {0x46E1, 0x8233D739}, - {0x46E2, 0x8233D830}, - {0x46E3, 0x8233D831}, - {0x46E4, 0x8233D832}, - {0x46E5, 0x8233D833}, - {0x46E6, 0x8233D834}, - {0x46E7, 0x8233D835}, - {0x46E8, 0x8233D836}, - {0x46E9, 0x8233D837}, - {0x46EA, 0x8233D838}, - {0x46EB, 0x8233D839}, - {0x46EC, 0x8233D930}, - {0x46ED, 0x8233D931}, - {0x46EE, 0x8233D932}, - {0x46EF, 0x8233D933}, - {0x46F0, 0x8233D934}, - {0x46F1, 0x8233D935}, - {0x46F2, 0x8233D936}, - {0x46F3, 0x8233D937}, - {0x46F4, 0x8233D938}, - {0x46F5, 0x8233D939}, - {0x46F6, 0x8233DA30}, - {0x46F7, 0x8233DA31}, - {0x46F8, 0x8233DA32}, - {0x46F9, 0x8233DA33}, - {0x46FA, 0x8233DA34}, - {0x46FB, 0x8233DA35}, - {0x46FC, 0x8233DA36}, - {0x46FD, 0x8233DA37}, - {0x46FE, 0x8233DA38}, - {0x46FF, 0x8233DA39}, - {0x4700, 0x8233DB30}, - {0x4701, 0x8233DB31}, - {0x4702, 0x8233DB32}, - {0x4703, 0x8233DB33}, - {0x4704, 0x8233DB34}, - {0x4705, 0x8233DB35}, - {0x4706, 0x8233DB36}, - {0x4707, 0x8233DB37}, - {0x4708, 0x8233DB38}, - {0x4709, 0x8233DB39}, - {0x470A, 0x8233DC30}, - {0x470B, 0x8233DC31}, - {0x470C, 0x8233DC32}, - {0x470D, 0x8233DC33}, - {0x470E, 0x8233DC34}, - {0x470F, 0x8233DC35}, - {0x4710, 0x8233DC36}, - {0x4711, 0x8233DC37}, - {0x4712, 0x8233DC38}, - {0x4713, 0x8233DC39}, - {0x4714, 0x8233DD30}, - {0x4715, 0x8233DD31}, - {0x4716, 0x8233DD32}, - {0x4717, 0x8233DD33}, - {0x4718, 0x8233DD34}, - {0x4719, 0x8233DD35}, - {0x471A, 0x8233DD36}, - {0x471B, 0x8233DD37}, - {0x471C, 0x8233DD38}, - {0x471D, 0x8233DD39}, - {0x471E, 0x8233DE30}, - {0x471F, 0x8233DE31}, - {0x4720, 0x8233DE32}, - {0x4721, 0x8233DE33}, - {0x4722, 0x8233DE34}, - {0x4724, 0x8233DE35}, - {0x4725, 0x8233DE36}, - {0x4726, 0x8233DE37}, - {0x4727, 0x8233DE38}, - {0x4728, 0x8233DE39}, - {0x472A, 0x8233DF30}, - {0x472B, 0x8233DF31}, - {0x472C, 0x8233DF32}, - {0x472D, 0x8233DF33}, - {0x472E, 0x8233DF34}, - {0x472F, 0x8233DF35}, - {0x4730, 0x8233DF36}, - {0x4731, 0x8233DF37}, - {0x4732, 0x8233DF38}, - {0x4733, 0x8233DF39}, - {0x4734, 0x8233E030}, - {0x4735, 0x8233E031}, - {0x4736, 0x8233E032}, - {0x4737, 0x8233E033}, - {0x4738, 0x8233E034}, - {0x4739, 0x8233E035}, - {0x473A, 0x8233E036}, - {0x473B, 0x8233E037}, - {0x473C, 0x8233E038}, - {0x473D, 0x8233E039}, - {0x473E, 0x8233E130}, - {0x473F, 0x8233E131}, - {0x4740, 0x8233E132}, - {0x4741, 0x8233E133}, - {0x4742, 0x8233E134}, - {0x4743, 0x8233E135}, - {0x4744, 0x8233E136}, - {0x4745, 0x8233E137}, - {0x4746, 0x8233E138}, - {0x4747, 0x8233E139}, - {0x4748, 0x8233E230}, - {0x4749, 0x8233E231}, - {0x474A, 0x8233E232}, - {0x474B, 0x8233E233}, - {0x474C, 0x8233E234}, - {0x474D, 0x8233E235}, - {0x474E, 0x8233E236}, - {0x474F, 0x8233E237}, - {0x4750, 0x8233E238}, - {0x4751, 0x8233E239}, - {0x4752, 0x8233E330}, - {0x4753, 0x8233E331}, - {0x4754, 0x8233E332}, - {0x4755, 0x8233E333}, - {0x4756, 0x8233E334}, - {0x4757, 0x8233E335}, - {0x4758, 0x8233E336}, - {0x4759, 0x8233E337}, - {0x475A, 0x8233E338}, - {0x475B, 0x8233E339}, - {0x475C, 0x8233E430}, - {0x475D, 0x8233E431}, - {0x475E, 0x8233E432}, - {0x475F, 0x8233E433}, - {0x4760, 0x8233E434}, - {0x4761, 0x8233E435}, - {0x4762, 0x8233E436}, - {0x4763, 0x8233E437}, - {0x4764, 0x8233E438}, - {0x4765, 0x8233E439}, - {0x4766, 0x8233E530}, - {0x4767, 0x8233E531}, - {0x4768, 0x8233E532}, - {0x4769, 0x8233E533}, - {0x476A, 0x8233E534}, - {0x476B, 0x8233E535}, - {0x476C, 0x8233E536}, - {0x476D, 0x8233E537}, - {0x476E, 0x8233E538}, - {0x476F, 0x8233E539}, - {0x4770, 0x8233E630}, - {0x4771, 0x8233E631}, - {0x4772, 0x8233E632}, - {0x4773, 0x8233E633}, - {0x4774, 0x8233E634}, - {0x4775, 0x8233E635}, - {0x4776, 0x8233E636}, - {0x4777, 0x8233E637}, - {0x4778, 0x8233E638}, - {0x4779, 0x8233E639}, - {0x477A, 0x8233E730}, - {0x477B, 0x8233E731}, - {0x477D, 0x8233E732}, - {0x477E, 0x8233E733}, - {0x477F, 0x8233E734}, - {0x4780, 0x8233E735}, - {0x4781, 0x8233E736}, - {0x4782, 0x8233E737}, - {0x4783, 0x8233E738}, - {0x4784, 0x8233E739}, - {0x4785, 0x8233E830}, - {0x4786, 0x8233E831}, - {0x4787, 0x8233E832}, - {0x4788, 0x8233E833}, - {0x4789, 0x8233E834}, - {0x478A, 0x8233E835}, - {0x478B, 0x8233E836}, - {0x478C, 0x8233E837}, - {0x4948, 0x82349639}, - {0x4949, 0x82349730}, - {0x494A, 0x82349731}, - {0x494B, 0x82349732}, - {0x494C, 0x82349733}, - {0x494D, 0x82349734}, - {0x494E, 0x82349735}, - {0x494F, 0x82349736}, - {0x4950, 0x82349737}, - {0x4951, 0x82349738}, - {0x4952, 0x82349739}, - {0x4953, 0x82349830}, - {0x4954, 0x82349831}, - {0x4955, 0x82349832}, - {0x4956, 0x82349833}, - {0x4957, 0x82349834}, - {0x4958, 0x82349835}, - {0x4959, 0x82349836}, - {0x495A, 0x82349837}, - {0x495B, 0x82349838}, - {0x495C, 0x82349839}, - {0x495D, 0x82349930}, - {0x495E, 0x82349931}, - {0x495F, 0x82349932}, - {0x4960, 0x82349933}, - {0x4961, 0x82349934}, - {0x4962, 0x82349935}, - {0x4963, 0x82349936}, - {0x4964, 0x82349937}, - {0x4965, 0x82349938}, - {0x4966, 0x82349939}, - {0x4967, 0x82349A30}, - {0x4968, 0x82349A31}, - {0x4969, 0x82349A32}, - {0x496A, 0x82349A33}, - {0x496B, 0x82349A34}, - {0x496C, 0x82349A35}, - {0x496D, 0x82349A36}, - {0x496E, 0x82349A37}, - {0x496F, 0x82349A38}, - {0x4970, 0x82349A39}, - {0x4971, 0x82349B30}, - {0x4972, 0x82349B31}, - {0x4973, 0x82349B32}, - {0x4974, 0x82349B33}, - {0x4975, 0x82349B34}, - {0x4976, 0x82349B35}, - {0x4977, 0x82349B36}, - {0x4978, 0x82349B37}, - {0x4979, 0x82349B38}, - {0x497B, 0x82349B39}, - {0x497C, 0x82349C30}, - {0x497E, 0x82349C31}, - {0x497F, 0x82349C32}, - {0x4980, 0x82349C33}, - {0x4981, 0x82349C34}, - {0x4984, 0x82349C35}, - {0x4987, 0x82349C36}, - {0x4988, 0x82349C37}, - {0x4989, 0x82349C38}, - {0x498A, 0x82349C39}, - {0x498B, 0x82349D30}, - {0x498C, 0x82349D31}, - {0x498D, 0x82349D32}, - {0x498E, 0x82349D33}, - {0x498F, 0x82349D34}, - {0x4990, 0x82349D35}, - {0x4991, 0x82349D36}, - {0x4992, 0x82349D37}, - {0x4993, 0x82349D38}, - {0x4994, 0x82349D39}, - {0x4995, 0x82349E30}, - {0x4996, 0x82349E31}, - {0x4997, 0x82349E32}, - {0x4998, 0x82349E33}, - {0x4999, 0x82349E34}, - {0x499A, 0x82349E35}, - {0x499C, 0x82349E36}, - {0x499D, 0x82349E37}, - {0x499E, 0x82349E38}, - {0x49A0, 0x82349E39}, - {0x49A1, 0x82349F30}, - {0x49A2, 0x82349F31}, - {0x49A3, 0x82349F32}, - {0x49A4, 0x82349F33}, - {0x49A5, 0x82349F34}, - {0x49A6, 0x82349F35}, - {0x49A7, 0x82349F36}, - {0x49A8, 0x82349F37}, - {0x49A9, 0x82349F38}, - {0x49AA, 0x82349F39}, - {0x49AB, 0x8234A030}, - {0x49AC, 0x8234A031}, - {0x49AD, 0x8234A032}, - {0x49AE, 0x8234A033}, - {0x49AF, 0x8234A034}, - {0x49B0, 0x8234A035}, - {0x49B1, 0x8234A036}, - {0x49B2, 0x8234A037}, - {0x49B3, 0x8234A038}, - {0x49B4, 0x8234A039}, - {0x49B5, 0x8234A130}, - {0x4C78, 0x8234E734}, - {0x4C79, 0x8234E735}, - {0x4C7A, 0x8234E736}, - {0x4C7B, 0x8234E737}, - {0x4C7C, 0x8234E738}, - {0x4C7D, 0x8234E739}, - {0x4C7E, 0x8234E830}, - {0x4C7F, 0x8234E831}, - {0x4C80, 0x8234E832}, - {0x4C81, 0x8234E833}, - {0x4C82, 0x8234E834}, - {0x4C83, 0x8234E835}, - {0x4C84, 0x8234E836}, - {0x4C85, 0x8234E837}, - {0x4C86, 0x8234E838}, - {0x4C87, 0x8234E839}, - {0x4C88, 0x8234E930}, - {0x4C89, 0x8234E931}, - {0x4C8A, 0x8234E932}, - {0x4C8B, 0x8234E933}, - {0x4C8C, 0x8234E934}, - {0x4C8D, 0x8234E935}, - {0x4C8E, 0x8234E936}, - {0x4C8F, 0x8234E937}, - {0x4C90, 0x8234E938}, - {0x4C91, 0x8234E939}, - {0x4C92, 0x8234EA30}, - {0x4C93, 0x8234EA31}, - {0x4C94, 0x8234EA32}, - {0x4C95, 0x8234EA33}, - {0x4C96, 0x8234EA34}, - {0x4C97, 0x8234EA35}, - {0x4C98, 0x8234EA36}, - {0x4C99, 0x8234EA37}, - {0x4C9A, 0x8234EA38}, - {0x4C9B, 0x8234EA39}, - {0x4C9C, 0x8234EB30}, - {0x4C9D, 0x8234EB31}, - {0x4C9E, 0x8234EB32}, - {0x4CA4, 0x8234EB33}, - {0x4CA5, 0x8234EB34}, - {0x4CA6, 0x8234EB35}, - {0x4CA7, 0x8234EB36}, - {0x4CA8, 0x8234EB37}, - {0x4CA9, 0x8234EB38}, - {0x4CAA, 0x8234EB39}, - {0x4CAB, 0x8234EC30}, - {0x4CAC, 0x8234EC31}, - {0x4CAD, 0x8234EC32}, - {0x4CAE, 0x8234EC33}, - {0x4CAF, 0x8234EC34}, - {0x4CB0, 0x8234EC35}, - {0x4CB1, 0x8234EC36}, - {0x4CB2, 0x8234EC37}, - {0x4CB3, 0x8234EC38}, - {0x4CB4, 0x8234EC39}, - {0x4CB5, 0x8234ED30}, - {0x4CB6, 0x8234ED31}, - {0x4CB7, 0x8234ED32}, - {0x4CB8, 0x8234ED33}, - {0x4CB9, 0x8234ED34}, - {0x4CBA, 0x8234ED35}, - {0x4CBB, 0x8234ED36}, - {0x4CBC, 0x8234ED37}, - {0x4CBD, 0x8234ED38}, - {0x4CBE, 0x8234ED39}, - {0x4CBF, 0x8234EE30}, - {0x4CC0, 0x8234EE31}, - {0x4CC1, 0x8234EE32}, - {0x4CC2, 0x8234EE33}, - {0x4CC3, 0x8234EE34}, - {0x4CC4, 0x8234EE35}, - {0x4CC5, 0x8234EE36}, - {0x4CC6, 0x8234EE37}, - {0x4CC7, 0x8234EE38}, - {0x4CC8, 0x8234EE39}, - {0x4CC9, 0x8234EF30}, - {0x4CCA, 0x8234EF31}, - {0x4CCB, 0x8234EF32}, - {0x4CCC, 0x8234EF33}, - {0x4CCD, 0x8234EF34}, - {0x4CCE, 0x8234EF35}, - {0x4CCF, 0x8234EF36}, - {0x4CD0, 0x8234EF37}, - {0x4CD1, 0x8234EF38}, - {0x4CD2, 0x8234EF39}, - {0x4CD3, 0x8234F030}, - {0x4CD4, 0x8234F031}, - {0x4CD5, 0x8234F032}, - {0x4CD6, 0x8234F033}, - {0x4CD7, 0x8234F034}, - {0x4CD8, 0x8234F035}, - {0x4CD9, 0x8234F036}, - {0x4CDA, 0x8234F037}, - {0x4CDB, 0x8234F038}, - {0x4CDC, 0x8234F039}, - {0x4CDD, 0x8234F130}, - {0x4CDE, 0x8234F131}, - {0x4CDF, 0x8234F132}, - {0x4CE0, 0x8234F133}, - {0x4CE1, 0x8234F134}, - {0x4CE2, 0x8234F135}, - {0x4CE3, 0x8234F136}, - {0x4CE4, 0x8234F137}, - {0x4CE5, 0x8234F138}, - {0x4CE6, 0x8234F139}, - {0x4CE7, 0x8234F230}, - {0x4CE8, 0x8234F231}, - {0x4CE9, 0x8234F232}, - {0x4CEA, 0x8234F233}, - {0x4CEB, 0x8234F234}, - {0x4CEC, 0x8234F235}, - {0x4CED, 0x8234F236}, - {0x4CEE, 0x8234F237}, - {0x4CEF, 0x8234F238}, - {0x4CF0, 0x8234F239}, - {0x4CF1, 0x8234F330}, - {0x4CF2, 0x8234F331}, - {0x4CF3, 0x8234F332}, - {0x4CF4, 0x8234F333}, - {0x4CF5, 0x8234F334}, - {0x4CF6, 0x8234F335}, - {0x4CF7, 0x8234F336}, - {0x4CF8, 0x8234F337}, - {0x4CF9, 0x8234F338}, - {0x4CFA, 0x8234F339}, - {0x4CFB, 0x8234F430}, - {0x4CFC, 0x8234F431}, - {0x4CFD, 0x8234F432}, - {0x4CFE, 0x8234F433}, - {0x4CFF, 0x8234F434}, - {0x4D00, 0x8234F435}, - {0x4D01, 0x8234F436}, - {0x4D02, 0x8234F437}, - {0x4D03, 0x8234F438}, - {0x4D04, 0x8234F439}, - {0x4D05, 0x8234F530}, - {0x4D06, 0x8234F531}, - {0x4D07, 0x8234F532}, - {0x4D08, 0x8234F533}, - {0x4D09, 0x8234F534}, - {0x4D0A, 0x8234F535}, - {0x4D0B, 0x8234F536}, - {0x4D0C, 0x8234F537}, - {0x4D0D, 0x8234F538}, - {0x4D0E, 0x8234F539}, - {0x4D0F, 0x8234F630}, - {0x4D10, 0x8234F631}, - {0x4D11, 0x8234F632}, - {0x4D12, 0x8234F633}, - {0x4D1A, 0x8234F634}, - {0x4D1B, 0x8234F635}, - {0x4D1C, 0x8234F636}, - {0x4D1D, 0x8234F637}, - {0x4D1E, 0x8234F638}, - {0x4D1F, 0x8234F639}, - {0x4D20, 0x8234F730}, - {0x4D21, 0x8234F731}, - {0x4D22, 0x8234F732}, - {0x4D23, 0x8234F733}, - {0x4D24, 0x8234F734}, - {0x4D25, 0x8234F735}, - {0x4D26, 0x8234F736}, - {0x4D27, 0x8234F737}, - {0x4D28, 0x8234F738}, - {0x4D29, 0x8234F739}, - {0x4D2A, 0x8234F830}, - {0x4D2B, 0x8234F831}, - {0x4D2C, 0x8234F832}, - {0x4D2D, 0x8234F833}, - {0x4D2E, 0x8234F834}, - {0x4D2F, 0x8234F835}, - {0x4D30, 0x8234F836}, - {0x4D31, 0x8234F837}, - {0x4D32, 0x8234F838}, - {0x4D33, 0x8234F839}, - {0x4D34, 0x8234F930}, - {0x4D35, 0x8234F931}, - {0x4D36, 0x8234F932}, - {0x4D37, 0x8234F933}, - {0x4D38, 0x8234F934}, - {0x4D39, 0x8234F935}, - {0x4D3A, 0x8234F936}, - {0x4D3B, 0x8234F937}, - {0x4D3C, 0x8234F938}, - {0x4D3D, 0x8234F939}, - {0x4D3E, 0x8234FA30}, - {0x4D3F, 0x8234FA31}, - {0x4D40, 0x8234FA32}, - {0x4D41, 0x8234FA33}, - {0x4D42, 0x8234FA34}, - {0x4D43, 0x8234FA35}, - {0x4D44, 0x8234FA36}, - {0x4D45, 0x8234FA37}, - {0x4D46, 0x8234FA38}, - {0x4D47, 0x8234FA39}, - {0x4D48, 0x8234FB30}, - {0x4D49, 0x8234FB31}, - {0x4D4A, 0x8234FB32}, - {0x4D4B, 0x8234FB33}, - {0x4D4C, 0x8234FB34}, - {0x4D4D, 0x8234FB35}, - {0x4D4E, 0x8234FB36}, - {0x4D4F, 0x8234FB37}, - {0x4D50, 0x8234FB38}, - {0x4D51, 0x8234FB39}, - {0x4D52, 0x8234FC30}, - {0x4D53, 0x8234FC31}, - {0x4D54, 0x8234FC32}, - {0x4D55, 0x8234FC33}, - {0x4D56, 0x8234FC34}, - {0x4D57, 0x8234FC35}, - {0x4D58, 0x8234FC36}, - {0x4D59, 0x8234FC37}, - {0x4D5A, 0x8234FC38}, - {0x4D5B, 0x8234FC39}, - {0x4D5C, 0x8234FD30}, - {0x4D5D, 0x8234FD31}, - {0x4D5E, 0x8234FD32}, - {0x4D5F, 0x8234FD33}, - {0x4D60, 0x8234FD34}, - {0x4D61, 0x8234FD35}, - {0x4D62, 0x8234FD36}, - {0x4D63, 0x8234FD37}, - {0x4D64, 0x8234FD38}, - {0x4D65, 0x8234FD39}, - {0x4D66, 0x8234FE30}, - {0x4D67, 0x8234FE31}, - {0x4D68, 0x8234FE32}, - {0x4D69, 0x8234FE33}, - {0x4D6A, 0x8234FE34}, - {0x4D6B, 0x8234FE35}, - {0x4D6C, 0x8234FE36}, - {0x4D6D, 0x8234FE37}, - {0x4D6E, 0x8234FE38}, - {0x4D6F, 0x8234FE39}, - {0x4D70, 0x82358130}, - {0x4D71, 0x82358131}, - {0x4D72, 0x82358132}, - {0x4D73, 0x82358133}, - {0x4D74, 0x82358134}, - {0x4D75, 0x82358135}, - {0x4D76, 0x82358136}, - {0x4D77, 0x82358137}, - {0x4D78, 0x82358138}, - {0x4D79, 0x82358139}, - {0x4D7A, 0x82358230}, - {0x4D7B, 0x82358231}, - {0x4D7C, 0x82358232}, - {0x4D7D, 0x82358233}, - {0x4D7E, 0x82358234}, - {0x4D7F, 0x82358235}, - {0x4D80, 0x82358236}, - {0x4D81, 0x82358237}, - {0x4D82, 0x82358238}, - {0x4D83, 0x82358239}, - {0x4D84, 0x82358330}, - {0x4D85, 0x82358331}, - {0x4D86, 0x82358332}, - {0x4D87, 0x82358333}, - {0x4D88, 0x82358334}, - {0x4D89, 0x82358335}, - {0x4D8A, 0x82358336}, - {0x4D8B, 0x82358337}, - {0x4D8C, 0x82358338}, - {0x4D8D, 0x82358339}, - {0x4D8E, 0x82358430}, - {0x4D8F, 0x82358431}, - {0x4D90, 0x82358432}, - {0x4D91, 0x82358433}, - {0x4D92, 0x82358434}, - {0x4D93, 0x82358435}, - {0x4D94, 0x82358436}, - {0x4D95, 0x82358437}, - {0x4D96, 0x82358438}, - {0x4D97, 0x82358439}, - {0x4D98, 0x82358530}, - {0x4D99, 0x82358531}, - {0x4D9A, 0x82358532}, - {0x4D9B, 0x82358533}, - {0x4D9C, 0x82358534}, - {0x4D9D, 0x82358535}, - {0x4D9E, 0x82358536}, - {0x4D9F, 0x82358537}, - {0x4DA0, 0x82358538}, - {0x4DA1, 0x82358539}, - {0x4DA2, 0x82358630}, - {0x4DA3, 0x82358631}, - {0x4DA4, 0x82358632}, - {0x4DA5, 0x82358633}, - {0x4DA6, 0x82358634}, - {0x4DA7, 0x82358635}, - {0x4DA8, 0x82358636}, - {0x4DA9, 0x82358637}, - {0x4DAA, 0x82358638}, - {0x4DAB, 0x82358639}, - {0x4DAC, 0x82358730}, - {0x4DAD, 0x82358731}, - {0x4DAF, 0x82358732}, - {0x4DB0, 0x82358733}, - {0x4DB1, 0x82358734}, - {0x4DB2, 0x82358735}, - {0x4DB3, 0x82358736}, - {0x4DB4, 0x82358737}, - {0x4DB5, 0x82358738}, - {0x4DB6, 0x82358739}, - {0x4DB7, 0x82358830}, - {0x4DB8, 0x82358831}, - {0x4DB9, 0x82358832}, - {0x4DBA, 0x82358833}, - {0x4DBB, 0x82358834}, - {0x4DBC, 0x82358835}, - {0x4DBD, 0x82358836}, - {0x4DBE, 0x82358837}, - {0x4DBF, 0x82358838}, - {0x4DC0, 0x82358839}, - {0x4DC1, 0x82358930}, - {0x4DC2, 0x82358931}, - {0x4DC3, 0x82358932}, - {0x4DC4, 0x82358933}, - {0x4DC5, 0x82358934}, - {0x4DC6, 0x82358935}, - {0x4DC7, 0x82358936}, - {0x4DC8, 0x82358937}, - {0x4DC9, 0x82358938}, - {0x4DCA, 0x82358939}, - {0x4DCB, 0x82358A30}, - {0x4DCC, 0x82358A31}, - {0x4DCD, 0x82358A32}, - {0x4DCE, 0x82358A33}, - {0x4DCF, 0x82358A34}, - {0x4DD0, 0x82358A35}, - {0x4DD1, 0x82358A36}, - {0x4DD2, 0x82358A37}, - {0x4DD3, 0x82358A38}, - {0x4DD4, 0x82358A39}, - {0x4DD5, 0x82358B30}, - {0x4DD6, 0x82358B31}, - {0x4DD7, 0x82358B32}, - {0x4DD8, 0x82358B33}, - {0x4DD9, 0x82358B34}, - {0x4DDA, 0x82358B35}, - {0x4DDB, 0x82358B36}, - {0x4DDC, 0x82358B37}, - {0x4DDD, 0x82358B38}, - {0x4DDE, 0x82358B39}, - {0x4DDF, 0x82358C30}, - {0x4DE0, 0x82358C31}, - {0x4DE1, 0x82358C32}, - {0x4DE2, 0x82358C33}, - {0x4DE3, 0x82358C34}, - {0x4DE4, 0x82358C35}, - {0x4DE5, 0x82358C36}, - {0x4DE6, 0x82358C37}, - {0x4DE7, 0x82358C38}, - {0x4DE8, 0x82358C39}, - {0x4DE9, 0x82358D30}, - {0x4DEA, 0x82358D31}, - {0x4DEB, 0x82358D32}, - {0x4DEC, 0x82358D33}, - {0x4DED, 0x82358D34}, - {0x4DEE, 0x82358D35}, - {0x4DEF, 0x82358D36}, - {0x4DF0, 0x82358D37}, - {0x4DF1, 0x82358D38}, - {0x4DF2, 0x82358D39}, - {0x4DF3, 0x82358E30}, - {0x4DF4, 0x82358E31}, - {0x4DF5, 0x82358E32}, - {0x4DF6, 0x82358E33}, - {0x4DF7, 0x82358E34}, - {0x4DF8, 0x82358E35}, - {0x4DF9, 0x82358E36}, - {0x4DFA, 0x82358E37}, - {0x4DFB, 0x82358E38}, - {0x4DFC, 0x82358E39}, - {0x4DFD, 0x82358F30}, - {0x4DFE, 0x82358F31}, - {0x4DFF, 0x82358F32}, - {0xE76C, 0x8336C739}, - {0xE7C7, 0x8135F437}, - {0xE7C8, 0x8336C830}, - {0xE7E7, 0x8336C831}, - {0xE7E8, 0x8336C832}, - {0xE7E9, 0x8336C833}, - {0xE7EA, 0x8336C834}, - {0xE7EB, 0x8336C835}, - {0xE7EC, 0x8336C836}, - {0xE7ED, 0x8336C837}, - {0xE7EE, 0x8336C838}, - {0xE7EF, 0x8336C839}, - {0xE7F0, 0x8336C930}, - {0xE7F1, 0x8336C931}, - {0xE7F2, 0x8336C932}, - {0xE7F3, 0x8336C933}, - {0xE815, 0x8336C934}, - {0xE819, 0x8336C935}, - {0xE81A, 0x8336C936}, - {0xE81B, 0x8336C937}, - {0xE81C, 0x8336C938}, - {0xE81D, 0x8336C939}, - {0xE81F, 0x8336CA30}, - {0xE820, 0x8336CA31}, - {0xE821, 0x8336CA32}, - {0xE822, 0x8336CA33}, - {0xE823, 0x8336CA34}, - {0xE824, 0x8336CA35}, - {0xE825, 0x8336CA36}, - {0xE827, 0x8336CA37}, - {0xE828, 0x8336CA38}, - {0xE829, 0x8336CA39}, - {0xE82A, 0x8336CB30}, - {0xE82D, 0x8336CB31}, - {0xE82E, 0x8336CB32}, - {0xE82F, 0x8336CB33}, - {0xE830, 0x8336CB34}, - {0xE833, 0x8336CB35}, - {0xE834, 0x8336CB36}, - {0xE835, 0x8336CB37}, - {0xE836, 0x8336CB38}, - {0xE837, 0x8336CB39}, - {0xE838, 0x8336CC30}, - {0xE839, 0x8336CC31}, - {0xE83A, 0x8336CC32}, - {0xE83C, 0x8336CC33}, - {0xE83D, 0x8336CC34}, - {0xE83E, 0x8336CC35}, - {0xE83F, 0x8336CC36}, - {0xE840, 0x8336CC37}, - {0xE841, 0x8336CC38}, - {0xE842, 0x8336CC39}, - {0xE844, 0x8336CD30}, - {0xE845, 0x8336CD31}, - {0xE846, 0x8336CD32}, - {0xE847, 0x8336CD33}, - {0xE848, 0x8336CD34}, - {0xE849, 0x8336CD35}, - {0xE84A, 0x8336CD36}, - {0xE84B, 0x8336CD37}, - {0xE84C, 0x8336CD38}, - {0xE84D, 0x8336CD39}, - {0xE84E, 0x8336CE30}, - {0xE84F, 0x8336CE31}, - {0xE850, 0x8336CE32}, - {0xE851, 0x8336CE33}, - {0xE852, 0x8336CE34}, - {0xE853, 0x8336CE35}, - {0xE856, 0x8336CE36}, - {0xE857, 0x8336CE37}, - {0xE858, 0x8336CE38}, - {0xE859, 0x8336CE39}, - {0xE85A, 0x8336CF30}, - {0xE85B, 0x8336CF31}, - {0xE85C, 0x8336CF32}, - {0xE85D, 0x8336CF33}, - {0xE85E, 0x8336CF34}, - {0xE85F, 0x8336CF35}, - {0xE860, 0x8336CF36}, - {0xE861, 0x8336CF37}, - {0xE862, 0x8336CF38}, - {0xE863, 0x8336CF39}, - {0xF92D, 0x84308535}, - {0xF92E, 0x84308536}, - {0xF92F, 0x84308537}, - {0xF930, 0x84308538}, - {0xF931, 0x84308539}, - {0xF932, 0x84308630}, - {0xF933, 0x84308631}, - {0xF934, 0x84308632}, - {0xF935, 0x84308633}, - {0xF936, 0x84308634}, - {0xF937, 0x84308635}, - {0xF938, 0x84308636}, - {0xF939, 0x84308637}, - {0xF93A, 0x84308638}, - {0xF93B, 0x84308639}, - {0xF93C, 0x84308730}, - {0xF93D, 0x84308731}, - {0xF93E, 0x84308732}, - {0xF93F, 0x84308733}, - {0xF940, 0x84308734}, - {0xF941, 0x84308735}, - {0xF942, 0x84308736}, - {0xF943, 0x84308737}, - {0xF944, 0x84308738}, - {0xF945, 0x84308739}, - {0xF946, 0x84308830}, - {0xF947, 0x84308831}, - {0xF948, 0x84308832}, - {0xF949, 0x84308833}, - {0xF94A, 0x84308834}, - {0xF94B, 0x84308835}, - {0xF94C, 0x84308836}, - {0xF94D, 0x84308837}, - {0xF94E, 0x84308838}, - {0xF94F, 0x84308839}, - {0xF950, 0x84308930}, - {0xF951, 0x84308931}, - {0xF952, 0x84308932}, - {0xF953, 0x84308933}, - {0xF954, 0x84308934}, - {0xF955, 0x84308935}, - {0xF956, 0x84308936}, - {0xF957, 0x84308937}, - {0xF958, 0x84308938}, - {0xF959, 0x84308939}, - {0xF95A, 0x84308A30}, - {0xF95B, 0x84308A31}, - {0xF95C, 0x84308A32}, - {0xF95D, 0x84308A33}, - {0xF95E, 0x84308A34}, - {0xF95F, 0x84308A35}, - {0xF960, 0x84308A36}, - {0xF961, 0x84308A37}, - {0xF962, 0x84308A38}, - {0xF963, 0x84308A39}, - {0xF964, 0x84308B30}, - {0xF965, 0x84308B31}, - {0xF966, 0x84308B32}, - {0xF967, 0x84308B33}, - {0xF968, 0x84308B34}, - {0xF969, 0x84308B35}, - {0xF96A, 0x84308B36}, - {0xF96B, 0x84308B37}, - {0xF96C, 0x84308B38}, - {0xF96D, 0x84308B39}, - {0xF96E, 0x84308C30}, - {0xF96F, 0x84308C31}, - {0xF970, 0x84308C32}, - {0xF971, 0x84308C33}, - {0xF972, 0x84308C34}, - {0xF973, 0x84308C35}, - {0xF974, 0x84308C36}, - {0xF975, 0x84308C37}, - {0xF976, 0x84308C38}, - {0xF977, 0x84308C39}, - {0xF978, 0x84308D30}, - {0xF97A, 0x84308D31}, - {0xF97B, 0x84308D32}, - {0xF97C, 0x84308D33}, - {0xF97D, 0x84308D34}, - {0xF97E, 0x84308D35}, - {0xF97F, 0x84308D36}, - {0xF980, 0x84308D37}, - {0xF981, 0x84308D38}, - {0xF982, 0x84308D39}, - {0xF983, 0x84308E30}, - {0xF984, 0x84308E31}, - {0xF985, 0x84308E32}, - {0xF986, 0x84308E33}, - {0xF987, 0x84308E34}, - {0xF988, 0x84308E35}, - {0xF989, 0x84308E36}, - {0xF98A, 0x84308E37}, - {0xF98B, 0x84308E38}, - {0xF98C, 0x84308E39}, - {0xF98D, 0x84308F30}, - {0xF98E, 0x84308F31}, - {0xF98F, 0x84308F32}, - {0xF990, 0x84308F33}, - {0xF991, 0x84308F34}, - {0xF992, 0x84308F35}, - {0xF993, 0x84308F36}, - {0xF994, 0x84308F37}, - {0xF996, 0x84308F38}, - {0xF997, 0x84308F39}, - {0xF998, 0x84309030}, - {0xF999, 0x84309031}, - {0xF99A, 0x84309032}, - {0xF99B, 0x84309033}, - {0xF99C, 0x84309034}, - {0xF99D, 0x84309035}, - {0xF99E, 0x84309036}, - {0xF99F, 0x84309037}, - {0xF9A0, 0x84309038}, - {0xF9A1, 0x84309039}, - {0xF9A2, 0x84309130}, - {0xF9A3, 0x84309131}, - {0xF9A4, 0x84309132}, - {0xF9A5, 0x84309133}, - {0xF9A6, 0x84309134}, - {0xF9A7, 0x84309135}, - {0xF9A8, 0x84309136}, - {0xF9A9, 0x84309137}, - {0xF9AA, 0x84309138}, - {0xF9AB, 0x84309139}, - {0xF9AC, 0x84309230}, - {0xF9AD, 0x84309231}, - {0xF9AE, 0x84309232}, - {0xF9AF, 0x84309233}, - {0xF9B0, 0x84309234}, - {0xF9B1, 0x84309235}, - {0xF9B2, 0x84309236}, - {0xF9B3, 0x84309237}, - {0xF9B4, 0x84309238}, - {0xF9B5, 0x84309239}, - {0xF9B6, 0x84309330}, - {0xF9B7, 0x84309331}, - {0xF9B8, 0x84309332}, - {0xF9B9, 0x84309333}, - {0xF9BA, 0x84309334}, - {0xF9BB, 0x84309335}, - {0xF9BC, 0x84309336}, - {0xF9BD, 0x84309337}, - {0xF9BE, 0x84309338}, - {0xF9BF, 0x84309339}, - {0xF9C0, 0x84309430}, - {0xF9C1, 0x84309431}, - {0xF9C2, 0x84309432}, - {0xF9C3, 0x84309433}, - {0xF9C4, 0x84309434}, - {0xF9C5, 0x84309435}, - {0xF9C6, 0x84309436}, - {0xF9C7, 0x84309437}, - {0xF9C8, 0x84309438}, - {0xF9C9, 0x84309439}, - {0xF9CA, 0x84309530}, - {0xF9CB, 0x84309531}, - {0xF9CC, 0x84309532}, - {0xF9CD, 0x84309533}, - {0xF9CE, 0x84309534}, - {0xF9CF, 0x84309535}, - {0xF9D0, 0x84309536}, - {0xF9D1, 0x84309537}, - {0xF9D2, 0x84309538}, - {0xF9D3, 0x84309539}, - {0xF9D4, 0x84309630}, - {0xF9D5, 0x84309631}, - {0xF9D6, 0x84309632}, - {0xF9D7, 0x84309633}, - {0xF9D8, 0x84309634}, - {0xF9D9, 0x84309635}, - {0xF9DA, 0x84309636}, - {0xF9DB, 0x84309637}, - {0xF9DC, 0x84309638}, - {0xF9DD, 0x84309639}, - {0xF9DE, 0x84309730}, - {0xF9DF, 0x84309731}, - {0xF9E0, 0x84309732}, - {0xF9E1, 0x84309733}, - {0xF9E2, 0x84309734}, - {0xF9E3, 0x84309735}, - {0xF9E4, 0x84309736}, - {0xF9E5, 0x84309737}, - {0xF9E6, 0x84309738}, - {0xF9E8, 0x84309739}, - {0xF9E9, 0x84309830}, - {0xF9EA, 0x84309831}, - {0xF9EB, 0x84309832}, - {0xF9EC, 0x84309833}, - {0xF9ED, 0x84309834}, - {0xF9EE, 0x84309835}, - {0xF9EF, 0x84309836}, - {0xF9F0, 0x84309837}, - {0xF9F2, 0x84309838}, - {0xF9F3, 0x84309839}, - {0xF9F4, 0x84309930}, - {0xF9F5, 0x84309931}, - {0xF9F6, 0x84309932}, - {0xF9F7, 0x84309933}, - {0xF9F8, 0x84309934}, - {0xF9F9, 0x84309935}, - {0xF9FA, 0x84309936}, - {0xF9FB, 0x84309937}, - {0xF9FC, 0x84309938}, - {0xF9FD, 0x84309939}, - {0xF9FE, 0x84309A30}, - {0xF9FF, 0x84309A31}, - {0xFA00, 0x84309A32}, - {0xFA01, 0x84309A33}, - {0xFA02, 0x84309A34}, - {0xFA03, 0x84309A35}, - {0xFA04, 0x84309A36}, - {0xFA05, 0x84309A37}, - {0xFA06, 0x84309A38}, - {0xFA07, 0x84309A39}, - {0xFA08, 0x84309B30}, - {0xFA09, 0x84309B31}, - {0xFA0A, 0x84309B32}, - {0xFA0B, 0x84309B33}, - {0xFA10, 0x84309B34}, - {0xFA12, 0x84309B35}, - {0xFA15, 0x84309B36}, - {0xFA16, 0x84309B37}, - {0xFA17, 0x84309B38}, - {0xFA19, 0x84309B39}, - {0xFA1A, 0x84309C30}, - {0xFA1B, 0x84309C31}, - {0xFA1C, 0x84309C32}, - {0xFA1D, 0x84309C33}, - {0xFA1E, 0x84309C34}, - {0xFA22, 0x84309C35}, - {0xFA25, 0x84309C36}, - {0xFA26, 0x84309C37}, - {0xFE32, 0x84318538}, - {0xFE45, 0x84318539}, - {0xFE46, 0x84318630}, - {0xFE47, 0x84318631}, - {0xFE48, 0x84318632}, - {0xFE53, 0x84318633}, - {0xFE58, 0x84318634}, - {0xFE67, 0x84318635}, - {0xFE6C, 0x84318636}, - {0xFE6D, 0x84318637}, - {0xFE6E, 0x84318638}, - {0xFE6F, 0x84318639}, - {0xFE70, 0x84318730}, - {0xFE71, 0x84318731}, - {0xFE72, 0x84318732}, - {0xFE73, 0x84318733}, - {0xFE74, 0x84318734}, - {0xFE75, 0x84318735}, - {0xFE76, 0x84318736}, - {0xFE77, 0x84318737}, - {0xFE78, 0x84318738}, - {0xFE79, 0x84318739}, - {0xFE7A, 0x84318830}, - {0xFE7B, 0x84318831}, - {0xFE7C, 0x84318832}, - {0xFE7D, 0x84318833}, - {0xFE7E, 0x84318834}, - {0xFE7F, 0x84318835}, - {0xFE80, 0x84318836}, - {0xFE81, 0x84318837}, - {0xFE82, 0x84318838}, - {0xFE83, 0x84318839}, - {0xFE84, 0x84318930}, - {0xFE85, 0x84318931}, - {0xFE86, 0x84318932}, - {0xFE87, 0x84318933}, - {0xFE88, 0x84318934}, - {0xFE89, 0x84318935}, - {0xFE8A, 0x84318936}, - {0xFE8B, 0x84318937}, - {0xFE8C, 0x84318938}, - {0xFE8D, 0x84318939}, - {0xFE8E, 0x84318A30}, - {0xFE8F, 0x84318A31}, - {0xFE90, 0x84318A32}, - {0xFE91, 0x84318A33}, - {0xFE92, 0x84318A34}, - {0xFE93, 0x84318A35}, - {0xFE94, 0x84318A36}, - {0xFE95, 0x84318A37}, - {0xFE96, 0x84318A38}, - {0xFE97, 0x84318A39}, - {0xFE98, 0x84318B30}, - {0xFE99, 0x84318B31}, - {0xFE9A, 0x84318B32}, - {0xFE9B, 0x84318B33}, - {0xFE9C, 0x84318B34}, - {0xFE9D, 0x84318B35}, - {0xFE9E, 0x84318B36}, - {0xFE9F, 0x84318B37}, - {0xFEA0, 0x84318B38}, - {0xFEA1, 0x84318B39}, - {0xFEA2, 0x84318C30}, - {0xFEA3, 0x84318C31}, - {0xFEA4, 0x84318C32}, - {0xFEA5, 0x84318C33}, - {0xFEA6, 0x84318C34}, - {0xFEA7, 0x84318C35}, - {0xFEA8, 0x84318C36}, - {0xFEA9, 0x84318C37}, - {0xFEAA, 0x84318C38}, - {0xFEAB, 0x84318C39}, - {0xFEAC, 0x84318D30}, - {0xFEAD, 0x84318D31}, - {0xFEAE, 0x84318D32}, - {0xFEAF, 0x84318D33}, - {0xFEB0, 0x84318D34}, - {0xFEB1, 0x84318D35}, - {0xFEB2, 0x84318D36}, - {0xFEB3, 0x84318D37}, - {0xFEB4, 0x84318D38}, - {0xFEB5, 0x84318D39}, - {0xFEB6, 0x84318E30}, - {0xFEB7, 0x84318E31}, - {0xFEB8, 0x84318E32}, - {0xFEB9, 0x84318E33}, - {0xFEBA, 0x84318E34}, - {0xFEBB, 0x84318E35}, - {0xFEBC, 0x84318E36}, - {0xFEBD, 0x84318E37}, - {0xFEBE, 0x84318E38}, - {0xFEBF, 0x84318E39}, - {0xFEC0, 0x84318F30}, - {0xFEC1, 0x84318F31}, - {0xFEC2, 0x84318F32}, - {0xFEC3, 0x84318F33}, - {0xFEC4, 0x84318F34}, - {0xFEC5, 0x84318F35}, - {0xFEC6, 0x84318F36}, - {0xFEC7, 0x84318F37}, - {0xFEC8, 0x84318F38}, - {0xFEC9, 0x84318F39}, - {0xFECA, 0x84319030}, - {0xFECB, 0x84319031}, - {0xFECC, 0x84319032}, - {0xFECD, 0x84319033}, - {0xFECE, 0x84319034}, - {0xFECF, 0x84319035}, - {0xFED0, 0x84319036}, - {0xFED1, 0x84319037}, - {0xFED2, 0x84319038}, - {0xFED3, 0x84319039}, - {0xFED4, 0x84319130}, - {0xFED5, 0x84319131}, - {0xFED6, 0x84319132}, - {0xFED7, 0x84319133}, - {0xFED8, 0x84319134}, - {0xFED9, 0x84319135}, - {0xFEDA, 0x84319136}, - {0xFEDB, 0x84319137}, - {0xFEDC, 0x84319138}, - {0xFEDD, 0x84319139}, - {0xFEDE, 0x84319230}, - {0xFEDF, 0x84319231}, - {0xFEE0, 0x84319232}, - {0xFEE1, 0x84319233}, - {0xFEE2, 0x84319234}, - {0xFEE3, 0x84319235}, - {0xFEE4, 0x84319236}, - {0xFEE5, 0x84319237}, - {0xFEE6, 0x84319238}, - {0xFEE7, 0x84319239}, - {0xFEE8, 0x84319330}, - {0xFEE9, 0x84319331}, - {0xFEEA, 0x84319332}, - {0xFEEB, 0x84319333}, - {0xFEEC, 0x84319334}, - {0xFEED, 0x84319335}, - {0xFEEE, 0x84319336}, - {0xFEEF, 0x84319337}, - {0xFEF0, 0x84319338}, - {0xFEF1, 0x84319339}, - {0xFEF2, 0x84319430}, - {0xFEF3, 0x84319431}, - {0xFEF4, 0x84319432}, - {0xFEF5, 0x84319433}, - {0xFEF6, 0x84319434}, - {0xFEF7, 0x84319435}, - {0xFEF8, 0x84319436}, - {0xFEF9, 0x84319437}, - {0xFEFA, 0x84319438}, - {0xFEFB, 0x84319439}, - {0xFEFC, 0x84319530}, - {0xFEFD, 0x84319531}, - {0xFEFE, 0x84319532}, - {0xFEFF, 0x84319533}, - {0xFF00, 0x84319534}, - {0xFF5F, 0x84319535}, - {0xFF60, 0x84319536}, - {0xFF61, 0x84319537}, - {0xFF62, 0x84319538}, - {0xFF63, 0x84319539}, - {0xFF64, 0x84319630}, - {0xFF65, 0x84319631}, - {0xFF66, 0x84319632}, - {0xFF67, 0x84319633}, - {0xFF68, 0x84319634}, - {0xFF69, 0x84319635}, - {0xFF6A, 0x84319636}, - {0xFF6B, 0x84319637}, - {0xFF6C, 0x84319638}, - {0xFF6D, 0x84319639}, - {0xFF6E, 0x84319730}, - {0xFF6F, 0x84319731}, - {0xFF70, 0x84319732}, - {0xFF71, 0x84319733}, - {0xFF72, 0x84319734}, - {0xFF73, 0x84319735}, - {0xFF74, 0x84319736}, - {0xFF75, 0x84319737}, - {0xFF76, 0x84319738}, - {0xFF77, 0x84319739}, - {0xFF78, 0x84319830}, - {0xFF79, 0x84319831}, - {0xFF7A, 0x84319832}, - {0xFF7B, 0x84319833}, - {0xFF7C, 0x84319834}, - {0xFF7D, 0x84319835}, - {0xFF7E, 0x84319836}, - {0xFF7F, 0x84319837}, - {0xFF80, 0x84319838}, - {0xFF81, 0x84319839}, - {0xFF82, 0x84319930}, - {0xFF83, 0x84319931}, - {0xFF84, 0x84319932}, - {0xFF85, 0x84319933}, - {0xFF86, 0x84319934}, - {0xFF87, 0x84319935}, - {0xFF88, 0x84319936}, - {0xFF89, 0x84319937}, - {0xFF8A, 0x84319938}, - {0xFF8B, 0x84319939}, - {0xFF8C, 0x84319A30}, - {0xFF8D, 0x84319A31}, - {0xFF8E, 0x84319A32}, - {0xFF8F, 0x84319A33}, - {0xFF90, 0x84319A34}, - {0xFF91, 0x84319A35}, - {0xFF92, 0x84319A36}, - {0xFF93, 0x84319A37}, - {0xFF94, 0x84319A38}, - {0xFF95, 0x84319A39}, - {0xFF96, 0x84319B30}, - {0xFF97, 0x84319B31}, - {0xFF98, 0x84319B32}, - {0xFF99, 0x84319B33}, - {0xFF9A, 0x84319B34}, - {0xFF9B, 0x84319B35}, - {0xFF9C, 0x84319B36}, - {0xFF9D, 0x84319B37}, - {0xFF9E, 0x84319B38}, - {0xFF9F, 0x84319B39}, - {0xFFA0, 0x84319C30}, - {0xFFA1, 0x84319C31}, - {0xFFA2, 0x84319C32}, - {0xFFA3, 0x84319C33}, - {0xFFA4, 0x84319C34}, - {0xFFA5, 0x84319C35}, - {0xFFA6, 0x84319C36}, - {0xFFA7, 0x84319C37}, - {0xFFA8, 0x84319C38}, - {0xFFA9, 0x84319C39}, - {0xFFAA, 0x84319D30}, - {0xFFAB, 0x84319D31}, - {0xFFAC, 0x84319D32}, - {0xFFAD, 0x84319D33}, - {0xFFAE, 0x84319D34}, - {0xFFAF, 0x84319D35}, - {0xFFB0, 0x84319D36}, - {0xFFB1, 0x84319D37}, - {0xFFB2, 0x84319D38}, - {0xFFB3, 0x84319D39}, - {0xFFB4, 0x84319E30}, - {0xFFB5, 0x84319E31}, - {0xFFB6, 0x84319E32}, - {0xFFB7, 0x84319E33}, - {0xFFB8, 0x84319E34}, - {0xFFB9, 0x84319E35}, - {0xFFBA, 0x84319E36}, - {0xFFBB, 0x84319E37}, - {0xFFBC, 0x84319E38}, - {0xFFBD, 0x84319E39}, - {0xFFBE, 0x84319F30}, - {0xFFBF, 0x84319F31}, - {0xFFC0, 0x84319F32}, - {0xFFC1, 0x84319F33}, - {0xFFC2, 0x84319F34}, - {0xFFC3, 0x84319F35}, - {0xFFC4, 0x84319F36}, - {0xFFC5, 0x84319F37}, - {0xFFC6, 0x84319F38}, - {0xFFC7, 0x84319F39}, - {0xFFC8, 0x8431A030}, - {0xFFC9, 0x8431A031}, - {0xFFCA, 0x8431A032}, - {0xFFCB, 0x8431A033}, - {0xFFCC, 0x8431A034}, - {0xFFCD, 0x8431A035}, - {0xFFCE, 0x8431A036}, - {0xFFCF, 0x8431A037}, - {0xFFD0, 0x8431A038}, - {0xFFD1, 0x8431A039}, - {0xFFD2, 0x8431A130}, - {0xFFD3, 0x8431A131}, - {0xFFD4, 0x8431A132}, - {0xFFD5, 0x8431A133}, - {0xFFD6, 0x8431A134}, - {0xFFD7, 0x8431A135}, - {0xFFD8, 0x8431A136}, - {0xFFD9, 0x8431A137}, - {0xFFDA, 0x8431A138}, - {0xFFDB, 0x8431A139}, - {0xFFDC, 0x8431A230}, - {0xFFDD, 0x8431A231}, - {0xFFDE, 0x8431A232}, - {0xFFDF, 0x8431A233}, -} diff --git a/vendor/github.com/Tang-RoseChild/mahonia/gb18030.go b/vendor/github.com/Tang-RoseChild/mahonia/gb18030.go deleted file mode 100644 index d2759250e..000000000 --- a/vendor/github.com/Tang-RoseChild/mahonia/gb18030.go +++ /dev/null @@ -1,156 +0,0 @@ -package mahonia - -import ( - "sync" -) - -// Converters for GB18030 encoding. - -func init() { - RegisterCharset(&Charset{ - Name: "GB18030", - NewDecoder: func() Decoder { - gb18030Once.Do(buildGB18030Tables) - return decodeGB18030Rune - }, - NewEncoder: func() Encoder { - gb18030Once.Do(buildGB18030Tables) - return encodeGB18030Rune - }, - }) -} - -func decodeGB18030Rune(p []byte) (r rune, size int, status Status) { - if len(p) == 0 { - status = NO_ROOM - return - } - - b := p[0] - if b < 128 { - return rune(b), 1, SUCCESS - } - - if len(p) < 2 { - status = NO_ROOM - return - } - - if p[0] < 0x81 || p[0] > 0xfe { - return 0xfffd, 1, INVALID_CHAR - } - - if p[1] >= 0x40 { - // 2-byte character - c := uint16(p[0])<<8 + uint16(p[1]) - r = rune(gbkToUnicode[c]) - if r == 0 { - r = gbkToUnicodeExtra[c] - } - - if r != 0 { - return r, 2, SUCCESS - } - } else if p[1] >= 0x30 { - // 4-byte character - if len(p) < 4 { - return 0, 0, NO_ROOM - } - if p[2] < 0x81 || p[2] > 0xfe || p[3] < 0x30 || p[3] > 0x39 { - return 0xfffd, 1, INVALID_CHAR - } - - code := uint32(p[0])<<24 + uint32(p[1])<<16 + uint32(p[2])<<8 + uint32(p[3]) - lin := gb18030Linear(code) - - if lin <= maxGB18030Linear { - r = rune(gb18030LinearToUnicode[lin]) - if r != 0 { - return r, 4, SUCCESS - } - } - - for _, rng := range gb18030Ranges { - if lin >= rng.firstGB && lin <= rng.lastGB { - return rng.firstRune + rune(lin) - rune(rng.firstGB), 4, SUCCESS - } - } - } - - return 0xfffd, 1, INVALID_CHAR -} - -func encodeGB18030Rune(p []byte, r rune) (size int, status Status) { - if len(p) == 0 { - status = NO_ROOM - return - } - - if r < 128 { - p[0] = byte(r) - return 1, SUCCESS - } - - if len(p) < 2 { - status = NO_ROOM - return - } - - var c uint16 - if r < 0x10000 { - c = unicodeToGBK[r] - } else { - c = unicodeToGBKExtra[r] - } - - if c != 0 { - p[0] = byte(c >> 8) - p[1] = byte(c) - return 2, SUCCESS - } - - if len(p) < 4 { - return 0, NO_ROOM - } - - if r < 0x10000 { - f := unicodeToGB18030[r] - if f != 0 { - p[0] = byte(f >> 24) - p[1] = byte(f >> 16) - p[2] = byte(f >> 8) - p[3] = byte(f) - return 4, SUCCESS - } - } - - for _, rng := range gb18030Ranges { - if r >= rng.firstRune && r <= rng.lastRune { - lin := rng.firstGB + uint32(r) - uint32(rng.firstRune) - p[0] = byte(lin/(10*126*10)) + 0x81 - p[1] = byte(lin/(126*10)%10) + 0x30 - p[2] = byte(lin/10%126) + 0x81 - p[3] = byte(lin%10) + 0x30 - return 4, SUCCESS - } - } - - p[0] = 0x1a - return 1, INVALID_CHAR -} - -var gb18030Once sync.Once - -// Mapping from gb18039Linear values to Unicode. -var gb18030LinearToUnicode []uint16 - -var unicodeToGB18030 []uint32 - -func buildGB18030Tables() { - gb18030LinearToUnicode = make([]uint16, maxGB18030Linear+1) - unicodeToGB18030 = make([]uint32, 65536) - for _, data := range gb18030Data { - gb18030LinearToUnicode[gb18030Linear(data.gb18030)] = data.unicode - unicodeToGB18030[data.unicode] = data.gb18030 - } -} diff --git a/vendor/github.com/Tang-RoseChild/mahonia/gbk-data.go b/vendor/github.com/Tang-RoseChild/mahonia/gbk-data.go deleted file mode 100644 index e93023cff..000000000 --- a/vendor/github.com/Tang-RoseChild/mahonia/gbk-data.go +++ /dev/null @@ -1,47922 +0,0 @@ -package mahonia - -// Data for GBK 2-byte codes. -// GBK codes are represented in big-endian order. -// Based on the 2-byte subset of http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/gb-18030-2005.ucm - -// Codes that aren't on the BMP. -var unicodeToGBKExtra = map[rune]uint16{ - 0x20087: 0xfe51, - 0x20089: 0xfe52, - 0x200cc: 0xfe53, - 0x215d7: 0xfe6c, - 0x2298f: 0xfe76, - 0x241fe: 0xfe91, -} - -var gbkToUnicodeExtra = map[uint16]rune{ - 0xfe51: 0x20087, - 0xfe52: 0x20089, - 0xfe53: 0x200cc, - 0xfe6c: 0x215d7, - 0xfe76: 0x2298f, - 0xfe91: 0x241fe, -} - -var unicodeToGBK = [65536]uint16{ - 0x00A4: 0xA1E8, - 0x00A7: 0xA1EC, - 0x00A8: 0xA1A7, - 0x00B0: 0xA1E3, - 0x00B1: 0xA1C0, - 0x00B7: 0xA1A4, - 0x00D7: 0xA1C1, - 0x00E0: 0xA8A4, - 0x00E1: 0xA8A2, - 0x00E8: 0xA8A8, - 0x00E9: 0xA8A6, - 0x00EA: 0xA8BA, - 0x00EC: 0xA8AC, - 0x00ED: 0xA8AA, - 0x00F2: 0xA8B0, - 0x00F3: 0xA8AE, - 0x00F7: 0xA1C2, - 0x00F9: 0xA8B4, - 0x00FA: 0xA8B2, - 0x00FC: 0xA8B9, - 0x0101: 0xA8A1, - 0x0113: 0xA8A5, - 0x011B: 0xA8A7, - 0x012B: 0xA8A9, - 0x0144: 0xA8BD, - 0x0148: 0xA8BE, - 0x014D: 0xA8AD, - 0x016B: 0xA8B1, - 0x01CE: 0xA8A3, - 0x01D0: 0xA8AB, - 0x01D2: 0xA8AF, - 0x01D4: 0xA8B3, - 0x01D6: 0xA8B5, - 0x01D8: 0xA8B6, - 0x01DA: 0xA8B7, - 0x01DC: 0xA8B8, - 0x01F9: 0xA8BF, - 0x0251: 0xA8BB, - 0x0261: 0xA8C0, - 0x02C7: 0xA1A6, - 0x02C9: 0xA1A5, - 0x02CA: 0xA840, - 0x02CB: 0xA841, - 0x02D9: 0xA842, - 0x0391: 0xA6A1, - 0x0392: 0xA6A2, - 0x0393: 0xA6A3, - 0x0394: 0xA6A4, - 0x0395: 0xA6A5, - 0x0396: 0xA6A6, - 0x0397: 0xA6A7, - 0x0398: 0xA6A8, - 0x0399: 0xA6A9, - 0x039A: 0xA6AA, - 0x039B: 0xA6AB, - 0x039C: 0xA6AC, - 0x039D: 0xA6AD, - 0x039E: 0xA6AE, - 0x039F: 0xA6AF, - 0x03A0: 0xA6B0, - 0x03A1: 0xA6B1, - 0x03A3: 0xA6B2, - 0x03A4: 0xA6B3, - 0x03A5: 0xA6B4, - 0x03A6: 0xA6B5, - 0x03A7: 0xA6B6, - 0x03A8: 0xA6B7, - 0x03A9: 0xA6B8, - 0x03B1: 0xA6C1, - 0x03B2: 0xA6C2, - 0x03B3: 0xA6C3, - 0x03B4: 0xA6C4, - 0x03B5: 0xA6C5, - 0x03B6: 0xA6C6, - 0x03B7: 0xA6C7, - 0x03B8: 0xA6C8, - 0x03B9: 0xA6C9, - 0x03BA: 0xA6CA, - 0x03BB: 0xA6CB, - 0x03BC: 0xA6CC, - 0x03BD: 0xA6CD, - 0x03BE: 0xA6CE, - 0x03BF: 0xA6CF, - 0x03C0: 0xA6D0, - 0x03C1: 0xA6D1, - 0x03C3: 0xA6D2, - 0x03C4: 0xA6D3, - 0x03C5: 0xA6D4, - 0x03C6: 0xA6D5, - 0x03C7: 0xA6D6, - 0x03C8: 0xA6D7, - 0x03C9: 0xA6D8, - 0x0401: 0xA7A7, - 0x0410: 0xA7A1, - 0x0411: 0xA7A2, - 0x0412: 0xA7A3, - 0x0413: 0xA7A4, - 0x0414: 0xA7A5, - 0x0415: 0xA7A6, - 0x0416: 0xA7A8, - 0x0417: 0xA7A9, - 0x0418: 0xA7AA, - 0x0419: 0xA7AB, - 0x041A: 0xA7AC, - 0x041B: 0xA7AD, - 0x041C: 0xA7AE, - 0x041D: 0xA7AF, - 0x041E: 0xA7B0, - 0x041F: 0xA7B1, - 0x0420: 0xA7B2, - 0x0421: 0xA7B3, - 0x0422: 0xA7B4, - 0x0423: 0xA7B5, - 0x0424: 0xA7B6, - 0x0425: 0xA7B7, - 0x0426: 0xA7B8, - 0x0427: 0xA7B9, - 0x0428: 0xA7BA, - 0x0429: 0xA7BB, - 0x042A: 0xA7BC, - 0x042B: 0xA7BD, - 0x042C: 0xA7BE, - 0x042D: 0xA7BF, - 0x042E: 0xA7C0, - 0x042F: 0xA7C1, - 0x0430: 0xA7D1, - 0x0431: 0xA7D2, - 0x0432: 0xA7D3, - 0x0433: 0xA7D4, - 0x0434: 0xA7D5, - 0x0435: 0xA7D6, - 0x0436: 0xA7D8, - 0x0437: 0xA7D9, - 0x0438: 0xA7DA, - 0x0439: 0xA7DB, - 0x043A: 0xA7DC, - 0x043B: 0xA7DD, - 0x043C: 0xA7DE, - 0x043D: 0xA7DF, - 0x043E: 0xA7E0, - 0x043F: 0xA7E1, - 0x0440: 0xA7E2, - 0x0441: 0xA7E3, - 0x0442: 0xA7E4, - 0x0443: 0xA7E5, - 0x0444: 0xA7E6, - 0x0445: 0xA7E7, - 0x0446: 0xA7E8, - 0x0447: 0xA7E9, - 0x0448: 0xA7EA, - 0x0449: 0xA7EB, - 0x044A: 0xA7EC, - 0x044B: 0xA7ED, - 0x044C: 0xA7EE, - 0x044D: 0xA7EF, - 0x044E: 0xA7F0, - 0x044F: 0xA7F1, - 0x0451: 0xA7D7, - 0x1E3F: 0xA8BC, - 0x2010: 0xA95C, - 0x2013: 0xA843, - 0x2014: 0xA1AA, - 0x2015: 0xA844, - 0x2016: 0xA1AC, - 0x2018: 0xA1AE, - 0x2019: 0xA1AF, - 0x201C: 0xA1B0, - 0x201D: 0xA1B1, - 0x2025: 0xA845, - 0x2026: 0xA1AD, - 0x2030: 0xA1EB, - 0x2032: 0xA1E4, - 0x2033: 0xA1E5, - 0x2035: 0xA846, - 0x203B: 0xA1F9, - 0x20AC: 0xA2E3, - 0x2103: 0xA1E6, - 0x2105: 0xA847, - 0x2109: 0xA848, - 0x2116: 0xA1ED, - 0x2121: 0xA959, - 0x2160: 0xA2F1, - 0x2161: 0xA2F2, - 0x2162: 0xA2F3, - 0x2163: 0xA2F4, - 0x2164: 0xA2F5, - 0x2165: 0xA2F6, - 0x2166: 0xA2F7, - 0x2167: 0xA2F8, - 0x2168: 0xA2F9, - 0x2169: 0xA2FA, - 0x216A: 0xA2FB, - 0x216B: 0xA2FC, - 0x2170: 0xA2A1, - 0x2171: 0xA2A2, - 0x2172: 0xA2A3, - 0x2173: 0xA2A4, - 0x2174: 0xA2A5, - 0x2175: 0xA2A6, - 0x2176: 0xA2A7, - 0x2177: 0xA2A8, - 0x2178: 0xA2A9, - 0x2179: 0xA2AA, - 0x2190: 0xA1FB, - 0x2191: 0xA1FC, - 0x2192: 0xA1FA, - 0x2193: 0xA1FD, - 0x2196: 0xA849, - 0x2197: 0xA84A, - 0x2198: 0xA84B, - 0x2199: 0xA84C, - 0x2208: 0xA1CA, - 0x220F: 0xA1C7, - 0x2211: 0xA1C6, - 0x2215: 0xA84D, - 0x221A: 0xA1CC, - 0x221D: 0xA1D8, - 0x221E: 0xA1DE, - 0x221F: 0xA84E, - 0x2220: 0xA1CF, - 0x2223: 0xA84F, - 0x2225: 0xA1CE, - 0x2227: 0xA1C4, - 0x2228: 0xA1C5, - 0x2229: 0xA1C9, - 0x222A: 0xA1C8, - 0x222B: 0xA1D2, - 0x222E: 0xA1D3, - 0x2234: 0xA1E0, - 0x2235: 0xA1DF, - 0x2236: 0xA1C3, - 0x2237: 0xA1CB, - 0x223D: 0xA1D7, - 0x2248: 0xA1D6, - 0x224C: 0xA1D5, - 0x2252: 0xA850, - 0x2260: 0xA1D9, - 0x2261: 0xA1D4, - 0x2264: 0xA1DC, - 0x2265: 0xA1DD, - 0x2266: 0xA851, - 0x2267: 0xA852, - 0x226E: 0xA1DA, - 0x226F: 0xA1DB, - 0x2295: 0xA892, - 0x2299: 0xA1D1, - 0x22A5: 0xA1CD, - 0x22BF: 0xA853, - 0x2312: 0xA1D0, - 0x2460: 0xA2D9, - 0x2461: 0xA2DA, - 0x2462: 0xA2DB, - 0x2463: 0xA2DC, - 0x2464: 0xA2DD, - 0x2465: 0xA2DE, - 0x2466: 0xA2DF, - 0x2467: 0xA2E0, - 0x2468: 0xA2E1, - 0x2469: 0xA2E2, - 0x2474: 0xA2C5, - 0x2475: 0xA2C6, - 0x2476: 0xA2C7, - 0x2477: 0xA2C8, - 0x2478: 0xA2C9, - 0x2479: 0xA2CA, - 0x247A: 0xA2CB, - 0x247B: 0xA2CC, - 0x247C: 0xA2CD, - 0x247D: 0xA2CE, - 0x247E: 0xA2CF, - 0x247F: 0xA2D0, - 0x2480: 0xA2D1, - 0x2481: 0xA2D2, - 0x2482: 0xA2D3, - 0x2483: 0xA2D4, - 0x2484: 0xA2D5, - 0x2485: 0xA2D6, - 0x2486: 0xA2D7, - 0x2487: 0xA2D8, - 0x2488: 0xA2B1, - 0x2489: 0xA2B2, - 0x248A: 0xA2B3, - 0x248B: 0xA2B4, - 0x248C: 0xA2B5, - 0x248D: 0xA2B6, - 0x248E: 0xA2B7, - 0x248F: 0xA2B8, - 0x2490: 0xA2B9, - 0x2491: 0xA2BA, - 0x2492: 0xA2BB, - 0x2493: 0xA2BC, - 0x2494: 0xA2BD, - 0x2495: 0xA2BE, - 0x2496: 0xA2BF, - 0x2497: 0xA2C0, - 0x2498: 0xA2C1, - 0x2499: 0xA2C2, - 0x249A: 0xA2C3, - 0x249B: 0xA2C4, - 0x2500: 0xA9A4, - 0x2501: 0xA9A5, - 0x2502: 0xA9A6, - 0x2503: 0xA9A7, - 0x2504: 0xA9A8, - 0x2505: 0xA9A9, - 0x2506: 0xA9AA, - 0x2507: 0xA9AB, - 0x2508: 0xA9AC, - 0x2509: 0xA9AD, - 0x250A: 0xA9AE, - 0x250B: 0xA9AF, - 0x250C: 0xA9B0, - 0x250D: 0xA9B1, - 0x250E: 0xA9B2, - 0x250F: 0xA9B3, - 0x2510: 0xA9B4, - 0x2511: 0xA9B5, - 0x2512: 0xA9B6, - 0x2513: 0xA9B7, - 0x2514: 0xA9B8, - 0x2515: 0xA9B9, - 0x2516: 0xA9BA, - 0x2517: 0xA9BB, - 0x2518: 0xA9BC, - 0x2519: 0xA9BD, - 0x251A: 0xA9BE, - 0x251B: 0xA9BF, - 0x251C: 0xA9C0, - 0x251D: 0xA9C1, - 0x251E: 0xA9C2, - 0x251F: 0xA9C3, - 0x2520: 0xA9C4, - 0x2521: 0xA9C5, - 0x2522: 0xA9C6, - 0x2523: 0xA9C7, - 0x2524: 0xA9C8, - 0x2525: 0xA9C9, - 0x2526: 0xA9CA, - 0x2527: 0xA9CB, - 0x2528: 0xA9CC, - 0x2529: 0xA9CD, - 0x252A: 0xA9CE, - 0x252B: 0xA9CF, - 0x252C: 0xA9D0, - 0x252D: 0xA9D1, - 0x252E: 0xA9D2, - 0x252F: 0xA9D3, - 0x2530: 0xA9D4, - 0x2531: 0xA9D5, - 0x2532: 0xA9D6, - 0x2533: 0xA9D7, - 0x2534: 0xA9D8, - 0x2535: 0xA9D9, - 0x2536: 0xA9DA, - 0x2537: 0xA9DB, - 0x2538: 0xA9DC, - 0x2539: 0xA9DD, - 0x253A: 0xA9DE, - 0x253B: 0xA9DF, - 0x253C: 0xA9E0, - 0x253D: 0xA9E1, - 0x253E: 0xA9E2, - 0x253F: 0xA9E3, - 0x2540: 0xA9E4, - 0x2541: 0xA9E5, - 0x2542: 0xA9E6, - 0x2543: 0xA9E7, - 0x2544: 0xA9E8, - 0x2545: 0xA9E9, - 0x2546: 0xA9EA, - 0x2547: 0xA9EB, - 0x2548: 0xA9EC, - 0x2549: 0xA9ED, - 0x254A: 0xA9EE, - 0x254B: 0xA9EF, - 0x2550: 0xA854, - 0x2551: 0xA855, - 0x2552: 0xA856, - 0x2553: 0xA857, - 0x2554: 0xA858, - 0x2555: 0xA859, - 0x2556: 0xA85A, - 0x2557: 0xA85B, - 0x2558: 0xA85C, - 0x2559: 0xA85D, - 0x255A: 0xA85E, - 0x255B: 0xA85F, - 0x255C: 0xA860, - 0x255D: 0xA861, - 0x255E: 0xA862, - 0x255F: 0xA863, - 0x2560: 0xA864, - 0x2561: 0xA865, - 0x2562: 0xA866, - 0x2563: 0xA867, - 0x2564: 0xA868, - 0x2565: 0xA869, - 0x2566: 0xA86A, - 0x2567: 0xA86B, - 0x2568: 0xA86C, - 0x2569: 0xA86D, - 0x256A: 0xA86E, - 0x256B: 0xA86F, - 0x256C: 0xA870, - 0x256D: 0xA871, - 0x256E: 0xA872, - 0x256F: 0xA873, - 0x2570: 0xA874, - 0x2571: 0xA875, - 0x2572: 0xA876, - 0x2573: 0xA877, - 0x2581: 0xA878, - 0x2582: 0xA879, - 0x2583: 0xA87A, - 0x2584: 0xA87B, - 0x2585: 0xA87C, - 0x2586: 0xA87D, - 0x2587: 0xA87E, - 0x2588: 0xA880, - 0x2589: 0xA881, - 0x258A: 0xA882, - 0x258B: 0xA883, - 0x258C: 0xA884, - 0x258D: 0xA885, - 0x258E: 0xA886, - 0x258F: 0xA887, - 0x2593: 0xA888, - 0x2594: 0xA889, - 0x2595: 0xA88A, - 0x25A0: 0xA1F6, - 0x25A1: 0xA1F5, - 0x25B2: 0xA1F8, - 0x25B3: 0xA1F7, - 0x25BC: 0xA88B, - 0x25BD: 0xA88C, - 0x25C6: 0xA1F4, - 0x25C7: 0xA1F3, - 0x25CB: 0xA1F0, - 0x25CE: 0xA1F2, - 0x25CF: 0xA1F1, - 0x25E2: 0xA88D, - 0x25E3: 0xA88E, - 0x25E4: 0xA88F, - 0x25E5: 0xA890, - 0x2605: 0xA1EF, - 0x2606: 0xA1EE, - 0x2609: 0xA891, - 0x2640: 0xA1E2, - 0x2642: 0xA1E1, - 0x2E81: 0xFE50, - 0x2E84: 0xFE54, - 0x2E88: 0xFE57, - 0x2E8B: 0xFE58, - 0x2E8C: 0xFE5D, - 0x2E97: 0xFE5E, - 0x2EA7: 0xFE6B, - 0x2EAA: 0xFE6E, - 0x2EAE: 0xFE71, - 0x2EB3: 0xFE73, - 0x2EB6: 0xFE74, - 0x2EB7: 0xFE75, - 0x2EBB: 0xFE79, - 0x2ECA: 0xFE84, - 0x2FF0: 0xA98A, - 0x2FF1: 0xA98B, - 0x2FF2: 0xA98C, - 0x2FF3: 0xA98D, - 0x2FF4: 0xA98E, - 0x2FF5: 0xA98F, - 0x2FF6: 0xA990, - 0x2FF7: 0xA991, - 0x2FF8: 0xA992, - 0x2FF9: 0xA993, - 0x2FFA: 0xA994, - 0x2FFB: 0xA995, - 0x3000: 0xA1A1, - 0x3001: 0xA1A2, - 0x3002: 0xA1A3, - 0x3003: 0xA1A8, - 0x3005: 0xA1A9, - 0x3006: 0xA965, - 0x3007: 0xA996, - 0x3008: 0xA1B4, - 0x3009: 0xA1B5, - 0x300A: 0xA1B6, - 0x300B: 0xA1B7, - 0x300C: 0xA1B8, - 0x300D: 0xA1B9, - 0x300E: 0xA1BA, - 0x300F: 0xA1BB, - 0x3010: 0xA1BE, - 0x3011: 0xA1BF, - 0x3012: 0xA893, - 0x3013: 0xA1FE, - 0x3014: 0xA1B2, - 0x3015: 0xA1B3, - 0x3016: 0xA1BC, - 0x3017: 0xA1BD, - 0x301D: 0xA894, - 0x301E: 0xA895, - 0x3021: 0xA940, - 0x3022: 0xA941, - 0x3023: 0xA942, - 0x3024: 0xA943, - 0x3025: 0xA944, - 0x3026: 0xA945, - 0x3027: 0xA946, - 0x3028: 0xA947, - 0x3029: 0xA948, - 0x303E: 0xA989, - 0x3041: 0xA4A1, - 0x3042: 0xA4A2, - 0x3043: 0xA4A3, - 0x3044: 0xA4A4, - 0x3045: 0xA4A5, - 0x3046: 0xA4A6, - 0x3047: 0xA4A7, - 0x3048: 0xA4A8, - 0x3049: 0xA4A9, - 0x304A: 0xA4AA, - 0x304B: 0xA4AB, - 0x304C: 0xA4AC, - 0x304D: 0xA4AD, - 0x304E: 0xA4AE, - 0x304F: 0xA4AF, - 0x3050: 0xA4B0, - 0x3051: 0xA4B1, - 0x3052: 0xA4B2, - 0x3053: 0xA4B3, - 0x3054: 0xA4B4, - 0x3055: 0xA4B5, - 0x3056: 0xA4B6, - 0x3057: 0xA4B7, - 0x3058: 0xA4B8, - 0x3059: 0xA4B9, - 0x305A: 0xA4BA, - 0x305B: 0xA4BB, - 0x305C: 0xA4BC, - 0x305D: 0xA4BD, - 0x305E: 0xA4BE, - 0x305F: 0xA4BF, - 0x3060: 0xA4C0, - 0x3061: 0xA4C1, - 0x3062: 0xA4C2, - 0x3063: 0xA4C3, - 0x3064: 0xA4C4, - 0x3065: 0xA4C5, - 0x3066: 0xA4C6, - 0x3067: 0xA4C7, - 0x3068: 0xA4C8, - 0x3069: 0xA4C9, - 0x306A: 0xA4CA, - 0x306B: 0xA4CB, - 0x306C: 0xA4CC, - 0x306D: 0xA4CD, - 0x306E: 0xA4CE, - 0x306F: 0xA4CF, - 0x3070: 0xA4D0, - 0x3071: 0xA4D1, - 0x3072: 0xA4D2, - 0x3073: 0xA4D3, - 0x3074: 0xA4D4, - 0x3075: 0xA4D5, - 0x3076: 0xA4D6, - 0x3077: 0xA4D7, - 0x3078: 0xA4D8, - 0x3079: 0xA4D9, - 0x307A: 0xA4DA, - 0x307B: 0xA4DB, - 0x307C: 0xA4DC, - 0x307D: 0xA4DD, - 0x307E: 0xA4DE, - 0x307F: 0xA4DF, - 0x3080: 0xA4E0, - 0x3081: 0xA4E1, - 0x3082: 0xA4E2, - 0x3083: 0xA4E3, - 0x3084: 0xA4E4, - 0x3085: 0xA4E5, - 0x3086: 0xA4E6, - 0x3087: 0xA4E7, - 0x3088: 0xA4E8, - 0x3089: 0xA4E9, - 0x308A: 0xA4EA, - 0x308B: 0xA4EB, - 0x308C: 0xA4EC, - 0x308D: 0xA4ED, - 0x308E: 0xA4EE, - 0x308F: 0xA4EF, - 0x3090: 0xA4F0, - 0x3091: 0xA4F1, - 0x3092: 0xA4F2, - 0x3093: 0xA4F3, - 0x309B: 0xA961, - 0x309C: 0xA962, - 0x309D: 0xA966, - 0x309E: 0xA967, - 0x30A1: 0xA5A1, - 0x30A2: 0xA5A2, - 0x30A3: 0xA5A3, - 0x30A4: 0xA5A4, - 0x30A5: 0xA5A5, - 0x30A6: 0xA5A6, - 0x30A7: 0xA5A7, - 0x30A8: 0xA5A8, - 0x30A9: 0xA5A9, - 0x30AA: 0xA5AA, - 0x30AB: 0xA5AB, - 0x30AC: 0xA5AC, - 0x30AD: 0xA5AD, - 0x30AE: 0xA5AE, - 0x30AF: 0xA5AF, - 0x30B0: 0xA5B0, - 0x30B1: 0xA5B1, - 0x30B2: 0xA5B2, - 0x30B3: 0xA5B3, - 0x30B4: 0xA5B4, - 0x30B5: 0xA5B5, - 0x30B6: 0xA5B6, - 0x30B7: 0xA5B7, - 0x30B8: 0xA5B8, - 0x30B9: 0xA5B9, - 0x30BA: 0xA5BA, - 0x30BB: 0xA5BB, - 0x30BC: 0xA5BC, - 0x30BD: 0xA5BD, - 0x30BE: 0xA5BE, - 0x30BF: 0xA5BF, - 0x30C0: 0xA5C0, - 0x30C1: 0xA5C1, - 0x30C2: 0xA5C2, - 0x30C3: 0xA5C3, - 0x30C4: 0xA5C4, - 0x30C5: 0xA5C5, - 0x30C6: 0xA5C6, - 0x30C7: 0xA5C7, - 0x30C8: 0xA5C8, - 0x30C9: 0xA5C9, - 0x30CA: 0xA5CA, - 0x30CB: 0xA5CB, - 0x30CC: 0xA5CC, - 0x30CD: 0xA5CD, - 0x30CE: 0xA5CE, - 0x30CF: 0xA5CF, - 0x30D0: 0xA5D0, - 0x30D1: 0xA5D1, - 0x30D2: 0xA5D2, - 0x30D3: 0xA5D3, - 0x30D4: 0xA5D4, - 0x30D5: 0xA5D5, - 0x30D6: 0xA5D6, - 0x30D7: 0xA5D7, - 0x30D8: 0xA5D8, - 0x30D9: 0xA5D9, - 0x30DA: 0xA5DA, - 0x30DB: 0xA5DB, - 0x30DC: 0xA5DC, - 0x30DD: 0xA5DD, - 0x30DE: 0xA5DE, - 0x30DF: 0xA5DF, - 0x30E0: 0xA5E0, - 0x30E1: 0xA5E1, - 0x30E2: 0xA5E2, - 0x30E3: 0xA5E3, - 0x30E4: 0xA5E4, - 0x30E5: 0xA5E5, - 0x30E6: 0xA5E6, - 0x30E7: 0xA5E7, - 0x30E8: 0xA5E8, - 0x30E9: 0xA5E9, - 0x30EA: 0xA5EA, - 0x30EB: 0xA5EB, - 0x30EC: 0xA5EC, - 0x30ED: 0xA5ED, - 0x30EE: 0xA5EE, - 0x30EF: 0xA5EF, - 0x30F0: 0xA5F0, - 0x30F1: 0xA5F1, - 0x30F2: 0xA5F2, - 0x30F3: 0xA5F3, - 0x30F4: 0xA5F4, - 0x30F5: 0xA5F5, - 0x30F6: 0xA5F6, - 0x30FC: 0xA960, - 0x30FD: 0xA963, - 0x30FE: 0xA964, - 0x3105: 0xA8C5, - 0x3106: 0xA8C6, - 0x3107: 0xA8C7, - 0x3108: 0xA8C8, - 0x3109: 0xA8C9, - 0x310A: 0xA8CA, - 0x310B: 0xA8CB, - 0x310C: 0xA8CC, - 0x310D: 0xA8CD, - 0x310E: 0xA8CE, - 0x310F: 0xA8CF, - 0x3110: 0xA8D0, - 0x3111: 0xA8D1, - 0x3112: 0xA8D2, - 0x3113: 0xA8D3, - 0x3114: 0xA8D4, - 0x3115: 0xA8D5, - 0x3116: 0xA8D6, - 0x3117: 0xA8D7, - 0x3118: 0xA8D8, - 0x3119: 0xA8D9, - 0x311A: 0xA8DA, - 0x311B: 0xA8DB, - 0x311C: 0xA8DC, - 0x311D: 0xA8DD, - 0x311E: 0xA8DE, - 0x311F: 0xA8DF, - 0x3120: 0xA8E0, - 0x3121: 0xA8E1, - 0x3122: 0xA8E2, - 0x3123: 0xA8E3, - 0x3124: 0xA8E4, - 0x3125: 0xA8E5, - 0x3126: 0xA8E6, - 0x3127: 0xA8E7, - 0x3128: 0xA8E8, - 0x3129: 0xA8E9, - 0x3220: 0xA2E5, - 0x3221: 0xA2E6, - 0x3222: 0xA2E7, - 0x3223: 0xA2E8, - 0x3224: 0xA2E9, - 0x3225: 0xA2EA, - 0x3226: 0xA2EB, - 0x3227: 0xA2EC, - 0x3228: 0xA2ED, - 0x3229: 0xA2EE, - 0x3231: 0xA95A, - 0x32A3: 0xA949, - 0x338E: 0xA94A, - 0x338F: 0xA94B, - 0x339C: 0xA94C, - 0x339D: 0xA94D, - 0x339E: 0xA94E, - 0x33A1: 0xA94F, - 0x33C4: 0xA950, - 0x33CE: 0xA951, - 0x33D1: 0xA952, - 0x33D2: 0xA953, - 0x33D5: 0xA954, - 0x3447: 0xFE56, - 0x3473: 0xFE55, - 0x359E: 0xFE5A, - 0x360E: 0xFE5C, - 0x361A: 0xFE5B, - 0x3918: 0xFE60, - 0x396E: 0xFE5F, - 0x39CF: 0xFE62, - 0x39D0: 0xFE65, - 0x39DF: 0xFE63, - 0x3A73: 0xFE64, - 0x3B4E: 0xFE68, - 0x3C6E: 0xFE69, - 0x3CE0: 0xFE6A, - 0x4056: 0xFE6F, - 0x415F: 0xFE70, - 0x4337: 0xFE72, - 0x43AC: 0xFE78, - 0x43B1: 0xFE77, - 0x43DD: 0xFE7A, - 0x44D6: 0xFE7B, - 0x464C: 0xFE7D, - 0x4661: 0xFE7C, - 0x4723: 0xFE80, - 0x4729: 0xFE81, - 0x477C: 0xFE82, - 0x478D: 0xFE83, - 0x4947: 0xFE85, - 0x497A: 0xFE86, - 0x497D: 0xFE87, - 0x4982: 0xFE88, - 0x4983: 0xFE89, - 0x4985: 0xFE8A, - 0x4986: 0xFE8B, - 0x499B: 0xFE8D, - 0x499F: 0xFE8C, - 0x49B6: 0xFE8F, - 0x49B7: 0xFE8E, - 0x4C77: 0xFE96, - 0x4C9F: 0xFE93, - 0x4CA0: 0xFE94, - 0x4CA1: 0xFE95, - 0x4CA2: 0xFE97, - 0x4CA3: 0xFE92, - 0x4D13: 0xFE98, - 0x4D14: 0xFE99, - 0x4D15: 0xFE9A, - 0x4D16: 0xFE9B, - 0x4D17: 0xFE9C, - 0x4D18: 0xFE9D, - 0x4D19: 0xFE9E, - 0x4DAE: 0xFE9F, - 0x4E00: 0xD2BB, - 0x4E01: 0xB6A1, - 0x4E02: 0x8140, - 0x4E03: 0xC6DF, - 0x4E04: 0x8141, - 0x4E05: 0x8142, - 0x4E06: 0x8143, - 0x4E07: 0xCDF2, - 0x4E08: 0xD5C9, - 0x4E09: 0xC8FD, - 0x4E0A: 0xC9CF, - 0x4E0B: 0xCFC2, - 0x4E0C: 0xD8A2, - 0x4E0D: 0xB2BB, - 0x4E0E: 0xD3EB, - 0x4E0F: 0x8144, - 0x4E10: 0xD8A4, - 0x4E11: 0xB3F3, - 0x4E12: 0x8145, - 0x4E13: 0xD7A8, - 0x4E14: 0xC7D2, - 0x4E15: 0xD8A7, - 0x4E16: 0xCAC0, - 0x4E17: 0x8146, - 0x4E18: 0xC7F0, - 0x4E19: 0xB1FB, - 0x4E1A: 0xD2B5, - 0x4E1B: 0xB4D4, - 0x4E1C: 0xB6AB, - 0x4E1D: 0xCBBF, - 0x4E1E: 0xD8A9, - 0x4E1F: 0x8147, - 0x4E20: 0x8148, - 0x4E21: 0x8149, - 0x4E22: 0xB6AA, - 0x4E23: 0x814A, - 0x4E24: 0xC1BD, - 0x4E25: 0xD1CF, - 0x4E26: 0x814B, - 0x4E27: 0xC9A5, - 0x4E28: 0xD8AD, - 0x4E29: 0x814C, - 0x4E2A: 0xB8F6, - 0x4E2B: 0xD1BE, - 0x4E2C: 0xE3DC, - 0x4E2D: 0xD6D0, - 0x4E2E: 0x814D, - 0x4E2F: 0x814E, - 0x4E30: 0xB7E1, - 0x4E31: 0x814F, - 0x4E32: 0xB4AE, - 0x4E33: 0x8150, - 0x4E34: 0xC1D9, - 0x4E35: 0x8151, - 0x4E36: 0xD8BC, - 0x4E37: 0x8152, - 0x4E38: 0xCDE8, - 0x4E39: 0xB5A4, - 0x4E3A: 0xCEAA, - 0x4E3B: 0xD6F7, - 0x4E3C: 0x8153, - 0x4E3D: 0xC0F6, - 0x4E3E: 0xBED9, - 0x4E3F: 0xD8AF, - 0x4E40: 0x8154, - 0x4E41: 0x8155, - 0x4E42: 0x8156, - 0x4E43: 0xC4CB, - 0x4E44: 0x8157, - 0x4E45: 0xBEC3, - 0x4E46: 0x8158, - 0x4E47: 0xD8B1, - 0x4E48: 0xC3B4, - 0x4E49: 0xD2E5, - 0x4E4A: 0x8159, - 0x4E4B: 0xD6AE, - 0x4E4C: 0xCEDA, - 0x4E4D: 0xD5A7, - 0x4E4E: 0xBAF5, - 0x4E4F: 0xB7A6, - 0x4E50: 0xC0D6, - 0x4E51: 0x815A, - 0x4E52: 0xC6B9, - 0x4E53: 0xC5D2, - 0x4E54: 0xC7C7, - 0x4E55: 0x815B, - 0x4E56: 0xB9D4, - 0x4E57: 0x815C, - 0x4E58: 0xB3CB, - 0x4E59: 0xD2D2, - 0x4E5A: 0x815D, - 0x4E5B: 0x815E, - 0x4E5C: 0xD8BF, - 0x4E5D: 0xBEC5, - 0x4E5E: 0xC6F2, - 0x4E5F: 0xD2B2, - 0x4E60: 0xCFB0, - 0x4E61: 0xCFE7, - 0x4E62: 0x815F, - 0x4E63: 0x8160, - 0x4E64: 0x8161, - 0x4E65: 0x8162, - 0x4E66: 0xCAE9, - 0x4E67: 0x8163, - 0x4E68: 0x8164, - 0x4E69: 0xD8C0, - 0x4E6A: 0x8165, - 0x4E6B: 0x8166, - 0x4E6C: 0x8167, - 0x4E6D: 0x8168, - 0x4E6E: 0x8169, - 0x4E6F: 0x816A, - 0x4E70: 0xC2F2, - 0x4E71: 0xC2D2, - 0x4E72: 0x816B, - 0x4E73: 0xC8E9, - 0x4E74: 0x816C, - 0x4E75: 0x816D, - 0x4E76: 0x816E, - 0x4E77: 0x816F, - 0x4E78: 0x8170, - 0x4E79: 0x8171, - 0x4E7A: 0x8172, - 0x4E7B: 0x8173, - 0x4E7C: 0x8174, - 0x4E7D: 0x8175, - 0x4E7E: 0xC7AC, - 0x4E7F: 0x8176, - 0x4E80: 0x8177, - 0x4E81: 0x8178, - 0x4E82: 0x8179, - 0x4E83: 0x817A, - 0x4E84: 0x817B, - 0x4E85: 0x817C, - 0x4E86: 0xC1CB, - 0x4E87: 0x817D, - 0x4E88: 0xD3E8, - 0x4E89: 0xD5F9, - 0x4E8A: 0x817E, - 0x4E8B: 0xCAC2, - 0x4E8C: 0xB6FE, - 0x4E8D: 0xD8A1, - 0x4E8E: 0xD3DA, - 0x4E8F: 0xBFF7, - 0x4E90: 0x8180, - 0x4E91: 0xD4C6, - 0x4E92: 0xBBA5, - 0x4E93: 0xD8C1, - 0x4E94: 0xCEE5, - 0x4E95: 0xBEAE, - 0x4E96: 0x8181, - 0x4E97: 0x8182, - 0x4E98: 0xD8A8, - 0x4E99: 0x8183, - 0x4E9A: 0xD1C7, - 0x4E9B: 0xD0A9, - 0x4E9C: 0x8184, - 0x4E9D: 0x8185, - 0x4E9E: 0x8186, - 0x4E9F: 0xD8BD, - 0x4EA0: 0xD9EF, - 0x4EA1: 0xCDF6, - 0x4EA2: 0xBFBA, - 0x4EA3: 0x8187, - 0x4EA4: 0xBDBB, - 0x4EA5: 0xBAA5, - 0x4EA6: 0xD2E0, - 0x4EA7: 0xB2FA, - 0x4EA8: 0xBAE0, - 0x4EA9: 0xC4B6, - 0x4EAA: 0x8188, - 0x4EAB: 0xCFED, - 0x4EAC: 0xBEA9, - 0x4EAD: 0xCDA4, - 0x4EAE: 0xC1C1, - 0x4EAF: 0x8189, - 0x4EB0: 0x818A, - 0x4EB1: 0x818B, - 0x4EB2: 0xC7D7, - 0x4EB3: 0xD9F1, - 0x4EB4: 0x818C, - 0x4EB5: 0xD9F4, - 0x4EB6: 0x818D, - 0x4EB7: 0x818E, - 0x4EB8: 0x818F, - 0x4EB9: 0x8190, - 0x4EBA: 0xC8CB, - 0x4EBB: 0xD8E9, - 0x4EBC: 0x8191, - 0x4EBD: 0x8192, - 0x4EBE: 0x8193, - 0x4EBF: 0xD2DA, - 0x4EC0: 0xCAB2, - 0x4EC1: 0xC8CA, - 0x4EC2: 0xD8EC, - 0x4EC3: 0xD8EA, - 0x4EC4: 0xD8C6, - 0x4EC5: 0xBDF6, - 0x4EC6: 0xC6CD, - 0x4EC7: 0xB3F0, - 0x4EC8: 0x8194, - 0x4EC9: 0xD8EB, - 0x4ECA: 0xBDF1, - 0x4ECB: 0xBDE9, - 0x4ECC: 0x8195, - 0x4ECD: 0xC8D4, - 0x4ECE: 0xB4D3, - 0x4ECF: 0x8196, - 0x4ED0: 0x8197, - 0x4ED1: 0xC2D8, - 0x4ED2: 0x8198, - 0x4ED3: 0xB2D6, - 0x4ED4: 0xD7D0, - 0x4ED5: 0xCACB, - 0x4ED6: 0xCBFB, - 0x4ED7: 0xD5CC, - 0x4ED8: 0xB8B6, - 0x4ED9: 0xCFC9, - 0x4EDA: 0x8199, - 0x4EDB: 0x819A, - 0x4EDC: 0x819B, - 0x4EDD: 0xD9DA, - 0x4EDE: 0xD8F0, - 0x4EDF: 0xC7AA, - 0x4EE0: 0x819C, - 0x4EE1: 0xD8EE, - 0x4EE2: 0x819D, - 0x4EE3: 0xB4FA, - 0x4EE4: 0xC1EE, - 0x4EE5: 0xD2D4, - 0x4EE6: 0x819E, - 0x4EE7: 0x819F, - 0x4EE8: 0xD8ED, - 0x4EE9: 0x81A0, - 0x4EEA: 0xD2C7, - 0x4EEB: 0xD8EF, - 0x4EEC: 0xC3C7, - 0x4EED: 0x81A1, - 0x4EEE: 0x81A2, - 0x4EEF: 0x81A3, - 0x4EF0: 0xD1F6, - 0x4EF1: 0x81A4, - 0x4EF2: 0xD6D9, - 0x4EF3: 0xD8F2, - 0x4EF4: 0x81A5, - 0x4EF5: 0xD8F5, - 0x4EF6: 0xBCFE, - 0x4EF7: 0xBCDB, - 0x4EF8: 0x81A6, - 0x4EF9: 0x81A7, - 0x4EFA: 0x81A8, - 0x4EFB: 0xC8CE, - 0x4EFC: 0x81A9, - 0x4EFD: 0xB7DD, - 0x4EFE: 0x81AA, - 0x4EFF: 0xB7C2, - 0x4F00: 0x81AB, - 0x4F01: 0xC6F3, - 0x4F02: 0x81AC, - 0x4F03: 0x81AD, - 0x4F04: 0x81AE, - 0x4F05: 0x81AF, - 0x4F06: 0x81B0, - 0x4F07: 0x81B1, - 0x4F08: 0x81B2, - 0x4F09: 0xD8F8, - 0x4F0A: 0xD2C1, - 0x4F0B: 0x81B3, - 0x4F0C: 0x81B4, - 0x4F0D: 0xCEE9, - 0x4F0E: 0xBCBF, - 0x4F0F: 0xB7FC, - 0x4F10: 0xB7A5, - 0x4F11: 0xD0DD, - 0x4F12: 0x81B5, - 0x4F13: 0x81B6, - 0x4F14: 0x81B7, - 0x4F15: 0x81B8, - 0x4F16: 0x81B9, - 0x4F17: 0xD6DA, - 0x4F18: 0xD3C5, - 0x4F19: 0xBBEF, - 0x4F1A: 0xBBE1, - 0x4F1B: 0xD8F1, - 0x4F1C: 0x81BA, - 0x4F1D: 0x81BB, - 0x4F1E: 0xC9A1, - 0x4F1F: 0xCEB0, - 0x4F20: 0xB4AB, - 0x4F21: 0x81BC, - 0x4F22: 0xD8F3, - 0x4F23: 0x81BD, - 0x4F24: 0xC9CB, - 0x4F25: 0xD8F6, - 0x4F26: 0xC2D7, - 0x4F27: 0xD8F7, - 0x4F28: 0x81BE, - 0x4F29: 0x81BF, - 0x4F2A: 0xCEB1, - 0x4F2B: 0xD8F9, - 0x4F2C: 0x81C0, - 0x4F2D: 0x81C1, - 0x4F2E: 0x81C2, - 0x4F2F: 0xB2AE, - 0x4F30: 0xB9C0, - 0x4F31: 0x81C3, - 0x4F32: 0xD9A3, - 0x4F33: 0x81C4, - 0x4F34: 0xB0E9, - 0x4F35: 0x81C5, - 0x4F36: 0xC1E6, - 0x4F37: 0x81C6, - 0x4F38: 0xC9EC, - 0x4F39: 0x81C7, - 0x4F3A: 0xCBC5, - 0x4F3B: 0x81C8, - 0x4F3C: 0xCBC6, - 0x4F3D: 0xD9A4, - 0x4F3E: 0x81C9, - 0x4F3F: 0x81CA, - 0x4F40: 0x81CB, - 0x4F41: 0x81CC, - 0x4F42: 0x81CD, - 0x4F43: 0xB5E8, - 0x4F44: 0x81CE, - 0x4F45: 0x81CF, - 0x4F46: 0xB5AB, - 0x4F47: 0x81D0, - 0x4F48: 0x81D1, - 0x4F49: 0x81D2, - 0x4F4A: 0x81D3, - 0x4F4B: 0x81D4, - 0x4F4C: 0x81D5, - 0x4F4D: 0xCEBB, - 0x4F4E: 0xB5CD, - 0x4F4F: 0xD7A1, - 0x4F50: 0xD7F4, - 0x4F51: 0xD3D3, - 0x4F52: 0x81D6, - 0x4F53: 0xCCE5, - 0x4F54: 0x81D7, - 0x4F55: 0xBACE, - 0x4F56: 0x81D8, - 0x4F57: 0xD9A2, - 0x4F58: 0xD9DC, - 0x4F59: 0xD3E0, - 0x4F5A: 0xD8FD, - 0x4F5B: 0xB7F0, - 0x4F5C: 0xD7F7, - 0x4F5D: 0xD8FE, - 0x4F5E: 0xD8FA, - 0x4F5F: 0xD9A1, - 0x4F60: 0xC4E3, - 0x4F61: 0x81D9, - 0x4F62: 0x81DA, - 0x4F63: 0xD3B6, - 0x4F64: 0xD8F4, - 0x4F65: 0xD9DD, - 0x4F66: 0x81DB, - 0x4F67: 0xD8FB, - 0x4F68: 0x81DC, - 0x4F69: 0xC5E5, - 0x4F6A: 0x81DD, - 0x4F6B: 0x81DE, - 0x4F6C: 0xC0D0, - 0x4F6D: 0x81DF, - 0x4F6E: 0x81E0, - 0x4F6F: 0xD1F0, - 0x4F70: 0xB0DB, - 0x4F71: 0x81E1, - 0x4F72: 0x81E2, - 0x4F73: 0xBCD1, - 0x4F74: 0xD9A6, - 0x4F75: 0x81E3, - 0x4F76: 0xD9A5, - 0x4F77: 0x81E4, - 0x4F78: 0x81E5, - 0x4F79: 0x81E6, - 0x4F7A: 0x81E7, - 0x4F7B: 0xD9AC, - 0x4F7C: 0xD9AE, - 0x4F7D: 0x81E8, - 0x4F7E: 0xD9AB, - 0x4F7F: 0xCAB9, - 0x4F80: 0x81E9, - 0x4F81: 0x81EA, - 0x4F82: 0x81EB, - 0x4F83: 0xD9A9, - 0x4F84: 0xD6B6, - 0x4F85: 0x81EC, - 0x4F86: 0x81ED, - 0x4F87: 0x81EE, - 0x4F88: 0xB3DE, - 0x4F89: 0xD9A8, - 0x4F8A: 0x81EF, - 0x4F8B: 0xC0FD, - 0x4F8C: 0x81F0, - 0x4F8D: 0xCACC, - 0x4F8E: 0x81F1, - 0x4F8F: 0xD9AA, - 0x4F90: 0x81F2, - 0x4F91: 0xD9A7, - 0x4F92: 0x81F3, - 0x4F93: 0x81F4, - 0x4F94: 0xD9B0, - 0x4F95: 0x81F5, - 0x4F96: 0x81F6, - 0x4F97: 0xB6B1, - 0x4F98: 0x81F7, - 0x4F99: 0x81F8, - 0x4F9A: 0x81F9, - 0x4F9B: 0xB9A9, - 0x4F9C: 0x81FA, - 0x4F9D: 0xD2C0, - 0x4F9E: 0x81FB, - 0x4F9F: 0x81FC, - 0x4FA0: 0xCFC0, - 0x4FA1: 0x81FD, - 0x4FA2: 0x81FE, - 0x4FA3: 0xC2C2, - 0x4FA4: 0x8240, - 0x4FA5: 0xBDC4, - 0x4FA6: 0xD5EC, - 0x4FA7: 0xB2E0, - 0x4FA8: 0xC7C8, - 0x4FA9: 0xBFEB, - 0x4FAA: 0xD9AD, - 0x4FAB: 0x8241, - 0x4FAC: 0xD9AF, - 0x4FAD: 0x8242, - 0x4FAE: 0xCEEA, - 0x4FAF: 0xBAEE, - 0x4FB0: 0x8243, - 0x4FB1: 0x8244, - 0x4FB2: 0x8245, - 0x4FB3: 0x8246, - 0x4FB4: 0x8247, - 0x4FB5: 0xC7D6, - 0x4FB6: 0x8248, - 0x4FB7: 0x8249, - 0x4FB8: 0x824A, - 0x4FB9: 0x824B, - 0x4FBA: 0x824C, - 0x4FBB: 0x824D, - 0x4FBC: 0x824E, - 0x4FBD: 0x824F, - 0x4FBE: 0x8250, - 0x4FBF: 0xB1E3, - 0x4FC0: 0x8251, - 0x4FC1: 0x8252, - 0x4FC2: 0x8253, - 0x4FC3: 0xB4D9, - 0x4FC4: 0xB6ED, - 0x4FC5: 0xD9B4, - 0x4FC6: 0x8254, - 0x4FC7: 0x8255, - 0x4FC8: 0x8256, - 0x4FC9: 0x8257, - 0x4FCA: 0xBFA1, - 0x4FCB: 0x8258, - 0x4FCC: 0x8259, - 0x4FCD: 0x825A, - 0x4FCE: 0xD9DE, - 0x4FCF: 0xC7CE, - 0x4FD0: 0xC0FE, - 0x4FD1: 0xD9B8, - 0x4FD2: 0x825B, - 0x4FD3: 0x825C, - 0x4FD4: 0x825D, - 0x4FD5: 0x825E, - 0x4FD6: 0x825F, - 0x4FD7: 0xCBD7, - 0x4FD8: 0xB7FD, - 0x4FD9: 0x8260, - 0x4FDA: 0xD9B5, - 0x4FDB: 0x8261, - 0x4FDC: 0xD9B7, - 0x4FDD: 0xB1A3, - 0x4FDE: 0xD3E1, - 0x4FDF: 0xD9B9, - 0x4FE0: 0x8262, - 0x4FE1: 0xD0C5, - 0x4FE2: 0x8263, - 0x4FE3: 0xD9B6, - 0x4FE4: 0x8264, - 0x4FE5: 0x8265, - 0x4FE6: 0xD9B1, - 0x4FE7: 0x8266, - 0x4FE8: 0xD9B2, - 0x4FE9: 0xC1A9, - 0x4FEA: 0xD9B3, - 0x4FEB: 0x8267, - 0x4FEC: 0x8268, - 0x4FED: 0xBCF3, - 0x4FEE: 0xD0DE, - 0x4FEF: 0xB8A9, - 0x4FF0: 0x8269, - 0x4FF1: 0xBEE3, - 0x4FF2: 0x826A, - 0x4FF3: 0xD9BD, - 0x4FF4: 0x826B, - 0x4FF5: 0x826C, - 0x4FF6: 0x826D, - 0x4FF7: 0x826E, - 0x4FF8: 0xD9BA, - 0x4FF9: 0x826F, - 0x4FFA: 0xB0B3, - 0x4FFB: 0x8270, - 0x4FFC: 0x8271, - 0x4FFD: 0x8272, - 0x4FFE: 0xD9C2, - 0x4FFF: 0x8273, - 0x5000: 0x8274, - 0x5001: 0x8275, - 0x5002: 0x8276, - 0x5003: 0x8277, - 0x5004: 0x8278, - 0x5005: 0x8279, - 0x5006: 0x827A, - 0x5007: 0x827B, - 0x5008: 0x827C, - 0x5009: 0x827D, - 0x500A: 0x827E, - 0x500B: 0x8280, - 0x500C: 0xD9C4, - 0x500D: 0xB1B6, - 0x500E: 0x8281, - 0x500F: 0xD9BF, - 0x5010: 0x8282, - 0x5011: 0x8283, - 0x5012: 0xB5B9, - 0x5013: 0x8284, - 0x5014: 0xBEF3, - 0x5015: 0x8285, - 0x5016: 0x8286, - 0x5017: 0x8287, - 0x5018: 0xCCC8, - 0x5019: 0xBAF2, - 0x501A: 0xD2D0, - 0x501B: 0x8288, - 0x501C: 0xD9C3, - 0x501D: 0x8289, - 0x501E: 0x828A, - 0x501F: 0xBDE8, - 0x5020: 0x828B, - 0x5021: 0xB3AB, - 0x5022: 0x828C, - 0x5023: 0x828D, - 0x5024: 0x828E, - 0x5025: 0xD9C5, - 0x5026: 0xBEEB, - 0x5027: 0x828F, - 0x5028: 0xD9C6, - 0x5029: 0xD9BB, - 0x502A: 0xC4DF, - 0x502B: 0x8290, - 0x502C: 0xD9BE, - 0x502D: 0xD9C1, - 0x502E: 0xD9C0, - 0x502F: 0x8291, - 0x5030: 0x8292, - 0x5031: 0x8293, - 0x5032: 0x8294, - 0x5033: 0x8295, - 0x5034: 0x8296, - 0x5035: 0x8297, - 0x5036: 0x8298, - 0x5037: 0x8299, - 0x5038: 0x829A, - 0x5039: 0x829B, - 0x503A: 0xD5AE, - 0x503B: 0x829C, - 0x503C: 0xD6B5, - 0x503D: 0x829D, - 0x503E: 0xC7E3, - 0x503F: 0x829E, - 0x5040: 0x829F, - 0x5041: 0x82A0, - 0x5042: 0x82A1, - 0x5043: 0xD9C8, - 0x5044: 0x82A2, - 0x5045: 0x82A3, - 0x5046: 0x82A4, - 0x5047: 0xBCD9, - 0x5048: 0xD9CA, - 0x5049: 0x82A5, - 0x504A: 0x82A6, - 0x504B: 0x82A7, - 0x504C: 0xD9BC, - 0x504D: 0x82A8, - 0x504E: 0xD9CB, - 0x504F: 0xC6AB, - 0x5050: 0x82A9, - 0x5051: 0x82AA, - 0x5052: 0x82AB, - 0x5053: 0x82AC, - 0x5054: 0x82AD, - 0x5055: 0xD9C9, - 0x5056: 0x82AE, - 0x5057: 0x82AF, - 0x5058: 0x82B0, - 0x5059: 0x82B1, - 0x505A: 0xD7F6, - 0x505B: 0x82B2, - 0x505C: 0xCDA3, - 0x505D: 0x82B3, - 0x505E: 0x82B4, - 0x505F: 0x82B5, - 0x5060: 0x82B6, - 0x5061: 0x82B7, - 0x5062: 0x82B8, - 0x5063: 0x82B9, - 0x5064: 0x82BA, - 0x5065: 0xBDA1, - 0x5066: 0x82BB, - 0x5067: 0x82BC, - 0x5068: 0x82BD, - 0x5069: 0x82BE, - 0x506A: 0x82BF, - 0x506B: 0x82C0, - 0x506C: 0xD9CC, - 0x506D: 0x82C1, - 0x506E: 0x82C2, - 0x506F: 0x82C3, - 0x5070: 0x82C4, - 0x5071: 0x82C5, - 0x5072: 0x82C6, - 0x5073: 0x82C7, - 0x5074: 0x82C8, - 0x5075: 0x82C9, - 0x5076: 0xC5BC, - 0x5077: 0xCDB5, - 0x5078: 0x82CA, - 0x5079: 0x82CB, - 0x507A: 0x82CC, - 0x507B: 0xD9CD, - 0x507C: 0x82CD, - 0x507D: 0x82CE, - 0x507E: 0xD9C7, - 0x507F: 0xB3A5, - 0x5080: 0xBFFE, - 0x5081: 0x82CF, - 0x5082: 0x82D0, - 0x5083: 0x82D1, - 0x5084: 0x82D2, - 0x5085: 0xB8B5, - 0x5086: 0x82D3, - 0x5087: 0x82D4, - 0x5088: 0xC0FC, - 0x5089: 0x82D5, - 0x508A: 0x82D6, - 0x508B: 0x82D7, - 0x508C: 0x82D8, - 0x508D: 0xB0F8, - 0x508E: 0x82D9, - 0x508F: 0x82DA, - 0x5090: 0x82DB, - 0x5091: 0x82DC, - 0x5092: 0x82DD, - 0x5093: 0x82DE, - 0x5094: 0x82DF, - 0x5095: 0x82E0, - 0x5096: 0x82E1, - 0x5097: 0x82E2, - 0x5098: 0x82E3, - 0x5099: 0x82E4, - 0x509A: 0x82E5, - 0x509B: 0x82E6, - 0x509C: 0x82E7, - 0x509D: 0x82E8, - 0x509E: 0x82E9, - 0x509F: 0x82EA, - 0x50A0: 0x82EB, - 0x50A1: 0x82EC, - 0x50A2: 0x82ED, - 0x50A3: 0xB4F6, - 0x50A4: 0x82EE, - 0x50A5: 0xD9CE, - 0x50A6: 0x82EF, - 0x50A7: 0xD9CF, - 0x50A8: 0xB4A2, - 0x50A9: 0xD9D0, - 0x50AA: 0x82F0, - 0x50AB: 0x82F1, - 0x50AC: 0xB4DF, - 0x50AD: 0x82F2, - 0x50AE: 0x82F3, - 0x50AF: 0x82F4, - 0x50B0: 0x82F5, - 0x50B1: 0x82F6, - 0x50B2: 0xB0C1, - 0x50B3: 0x82F7, - 0x50B4: 0x82F8, - 0x50B5: 0x82F9, - 0x50B6: 0x82FA, - 0x50B7: 0x82FB, - 0x50B8: 0x82FC, - 0x50B9: 0x82FD, - 0x50BA: 0xD9D1, - 0x50BB: 0xC9B5, - 0x50BC: 0x82FE, - 0x50BD: 0x8340, - 0x50BE: 0x8341, - 0x50BF: 0x8342, - 0x50C0: 0x8343, - 0x50C1: 0x8344, - 0x50C2: 0x8345, - 0x50C3: 0x8346, - 0x50C4: 0x8347, - 0x50C5: 0x8348, - 0x50C6: 0x8349, - 0x50C7: 0x834A, - 0x50C8: 0x834B, - 0x50C9: 0x834C, - 0x50CA: 0x834D, - 0x50CB: 0x834E, - 0x50CC: 0x834F, - 0x50CD: 0x8350, - 0x50CE: 0x8351, - 0x50CF: 0xCFF1, - 0x50D0: 0x8352, - 0x50D1: 0x8353, - 0x50D2: 0x8354, - 0x50D3: 0x8355, - 0x50D4: 0x8356, - 0x50D5: 0x8357, - 0x50D6: 0xD9D2, - 0x50D7: 0x8358, - 0x50D8: 0x8359, - 0x50D9: 0x835A, - 0x50DA: 0xC1C5, - 0x50DB: 0x835B, - 0x50DC: 0x835C, - 0x50DD: 0x835D, - 0x50DE: 0x835E, - 0x50DF: 0x835F, - 0x50E0: 0x8360, - 0x50E1: 0x8361, - 0x50E2: 0x8362, - 0x50E3: 0x8363, - 0x50E4: 0x8364, - 0x50E5: 0x8365, - 0x50E6: 0xD9D6, - 0x50E7: 0xC9AE, - 0x50E8: 0x8366, - 0x50E9: 0x8367, - 0x50EA: 0x8368, - 0x50EB: 0x8369, - 0x50EC: 0xD9D5, - 0x50ED: 0xD9D4, - 0x50EE: 0xD9D7, - 0x50EF: 0x836A, - 0x50F0: 0x836B, - 0x50F1: 0x836C, - 0x50F2: 0x836D, - 0x50F3: 0xCBDB, - 0x50F4: 0x836E, - 0x50F5: 0xBDA9, - 0x50F6: 0x836F, - 0x50F7: 0x8370, - 0x50F8: 0x8371, - 0x50F9: 0x8372, - 0x50FA: 0x8373, - 0x50FB: 0xC6A7, - 0x50FC: 0x8374, - 0x50FD: 0x8375, - 0x50FE: 0x8376, - 0x50FF: 0x8377, - 0x5100: 0x8378, - 0x5101: 0x8379, - 0x5102: 0x837A, - 0x5103: 0x837B, - 0x5104: 0x837C, - 0x5105: 0x837D, - 0x5106: 0xD9D3, - 0x5107: 0xD9D8, - 0x5108: 0x837E, - 0x5109: 0x8380, - 0x510A: 0x8381, - 0x510B: 0xD9D9, - 0x510C: 0x8382, - 0x510D: 0x8383, - 0x510E: 0x8384, - 0x510F: 0x8385, - 0x5110: 0x8386, - 0x5111: 0x8387, - 0x5112: 0xC8E5, - 0x5113: 0x8388, - 0x5114: 0x8389, - 0x5115: 0x838A, - 0x5116: 0x838B, - 0x5117: 0x838C, - 0x5118: 0x838D, - 0x5119: 0x838E, - 0x511A: 0x838F, - 0x511B: 0x8390, - 0x511C: 0x8391, - 0x511D: 0x8392, - 0x511E: 0x8393, - 0x511F: 0x8394, - 0x5120: 0x8395, - 0x5121: 0xC0DC, - 0x5122: 0x8396, - 0x5123: 0x8397, - 0x5124: 0x8398, - 0x5125: 0x8399, - 0x5126: 0x839A, - 0x5127: 0x839B, - 0x5128: 0x839C, - 0x5129: 0x839D, - 0x512A: 0x839E, - 0x512B: 0x839F, - 0x512C: 0x83A0, - 0x512D: 0x83A1, - 0x512E: 0x83A2, - 0x512F: 0x83A3, - 0x5130: 0x83A4, - 0x5131: 0x83A5, - 0x5132: 0x83A6, - 0x5133: 0x83A7, - 0x5134: 0x83A8, - 0x5135: 0x83A9, - 0x5136: 0x83AA, - 0x5137: 0x83AB, - 0x5138: 0x83AC, - 0x5139: 0x83AD, - 0x513A: 0x83AE, - 0x513B: 0x83AF, - 0x513C: 0x83B0, - 0x513D: 0x83B1, - 0x513E: 0x83B2, - 0x513F: 0xB6F9, - 0x5140: 0xD8A3, - 0x5141: 0xD4CA, - 0x5142: 0x83B3, - 0x5143: 0xD4AA, - 0x5144: 0xD0D6, - 0x5145: 0xB3E4, - 0x5146: 0xD5D7, - 0x5147: 0x83B4, - 0x5148: 0xCFC8, - 0x5149: 0xB9E2, - 0x514A: 0x83B5, - 0x514B: 0xBFCB, - 0x514C: 0x83B6, - 0x514D: 0xC3E2, - 0x514E: 0x83B7, - 0x514F: 0x83B8, - 0x5150: 0x83B9, - 0x5151: 0xB6D2, - 0x5152: 0x83BA, - 0x5153: 0x83BB, - 0x5154: 0xCDC3, - 0x5155: 0xD9EE, - 0x5156: 0xD9F0, - 0x5157: 0x83BC, - 0x5158: 0x83BD, - 0x5159: 0x83BE, - 0x515A: 0xB5B3, - 0x515B: 0x83BF, - 0x515C: 0xB6B5, - 0x515D: 0x83C0, - 0x515E: 0x83C1, - 0x515F: 0x83C2, - 0x5160: 0x83C3, - 0x5161: 0x83C4, - 0x5162: 0xBEA4, - 0x5163: 0x83C5, - 0x5164: 0x83C6, - 0x5165: 0xC8EB, - 0x5166: 0x83C7, - 0x5167: 0x83C8, - 0x5168: 0xC8AB, - 0x5169: 0x83C9, - 0x516A: 0x83CA, - 0x516B: 0xB0CB, - 0x516C: 0xB9AB, - 0x516D: 0xC1F9, - 0x516E: 0xD9E2, - 0x516F: 0x83CB, - 0x5170: 0xC0BC, - 0x5171: 0xB9B2, - 0x5172: 0x83CC, - 0x5173: 0xB9D8, - 0x5174: 0xD0CB, - 0x5175: 0xB1F8, - 0x5176: 0xC6E4, - 0x5177: 0xBEDF, - 0x5178: 0xB5E4, - 0x5179: 0xD7C8, - 0x517A: 0x83CD, - 0x517B: 0xD1F8, - 0x517C: 0xBCE6, - 0x517D: 0xCADE, - 0x517E: 0x83CE, - 0x517F: 0x83CF, - 0x5180: 0xBCBD, - 0x5181: 0xD9E6, - 0x5182: 0xD8E7, - 0x5183: 0x83D0, - 0x5184: 0x83D1, - 0x5185: 0xC4DA, - 0x5186: 0x83D2, - 0x5187: 0x83D3, - 0x5188: 0xB8D4, - 0x5189: 0xC8BD, - 0x518A: 0x83D4, - 0x518B: 0x83D5, - 0x518C: 0xB2E1, - 0x518D: 0xD4D9, - 0x518E: 0x83D6, - 0x518F: 0x83D7, - 0x5190: 0x83D8, - 0x5191: 0x83D9, - 0x5192: 0xC3B0, - 0x5193: 0x83DA, - 0x5194: 0x83DB, - 0x5195: 0xC3E1, - 0x5196: 0xDAA2, - 0x5197: 0xC8DF, - 0x5198: 0x83DC, - 0x5199: 0xD0B4, - 0x519A: 0x83DD, - 0x519B: 0xBEFC, - 0x519C: 0xC5A9, - 0x519D: 0x83DE, - 0x519E: 0x83DF, - 0x519F: 0x83E0, - 0x51A0: 0xB9DA, - 0x51A1: 0x83E1, - 0x51A2: 0xDAA3, - 0x51A3: 0x83E2, - 0x51A4: 0xD4A9, - 0x51A5: 0xDAA4, - 0x51A6: 0x83E3, - 0x51A7: 0x83E4, - 0x51A8: 0x83E5, - 0x51A9: 0x83E6, - 0x51AA: 0x83E7, - 0x51AB: 0xD9FB, - 0x51AC: 0xB6AC, - 0x51AD: 0x83E8, - 0x51AE: 0x83E9, - 0x51AF: 0xB7EB, - 0x51B0: 0xB1F9, - 0x51B1: 0xD9FC, - 0x51B2: 0xB3E5, - 0x51B3: 0xBEF6, - 0x51B4: 0x83EA, - 0x51B5: 0xBFF6, - 0x51B6: 0xD2B1, - 0x51B7: 0xC0E4, - 0x51B8: 0x83EB, - 0x51B9: 0x83EC, - 0x51BA: 0x83ED, - 0x51BB: 0xB6B3, - 0x51BC: 0xD9FE, - 0x51BD: 0xD9FD, - 0x51BE: 0x83EE, - 0x51BF: 0x83EF, - 0x51C0: 0xBEBB, - 0x51C1: 0x83F0, - 0x51C2: 0x83F1, - 0x51C3: 0x83F2, - 0x51C4: 0xC6E0, - 0x51C5: 0x83F3, - 0x51C6: 0xD7BC, - 0x51C7: 0xDAA1, - 0x51C8: 0x83F4, - 0x51C9: 0xC1B9, - 0x51CA: 0x83F5, - 0x51CB: 0xB5F2, - 0x51CC: 0xC1E8, - 0x51CD: 0x83F6, - 0x51CE: 0x83F7, - 0x51CF: 0xBCF5, - 0x51D0: 0x83F8, - 0x51D1: 0xB4D5, - 0x51D2: 0x83F9, - 0x51D3: 0x83FA, - 0x51D4: 0x83FB, - 0x51D5: 0x83FC, - 0x51D6: 0x83FD, - 0x51D7: 0x83FE, - 0x51D8: 0x8440, - 0x51D9: 0x8441, - 0x51DA: 0x8442, - 0x51DB: 0xC1DD, - 0x51DC: 0x8443, - 0x51DD: 0xC4FD, - 0x51DE: 0x8444, - 0x51DF: 0x8445, - 0x51E0: 0xBCB8, - 0x51E1: 0xB7B2, - 0x51E2: 0x8446, - 0x51E3: 0x8447, - 0x51E4: 0xB7EF, - 0x51E5: 0x8448, - 0x51E6: 0x8449, - 0x51E7: 0x844A, - 0x51E8: 0x844B, - 0x51E9: 0x844C, - 0x51EA: 0x844D, - 0x51EB: 0xD9EC, - 0x51EC: 0x844E, - 0x51ED: 0xC6BE, - 0x51EE: 0x844F, - 0x51EF: 0xBFAD, - 0x51F0: 0xBBCB, - 0x51F1: 0x8450, - 0x51F2: 0x8451, - 0x51F3: 0xB5CA, - 0x51F4: 0x8452, - 0x51F5: 0xDBC9, - 0x51F6: 0xD0D7, - 0x51F7: 0x8453, - 0x51F8: 0xCDB9, - 0x51F9: 0xB0BC, - 0x51FA: 0xB3F6, - 0x51FB: 0xBBF7, - 0x51FC: 0xDBCA, - 0x51FD: 0xBAAF, - 0x51FE: 0x8454, - 0x51FF: 0xD4E4, - 0x5200: 0xB5B6, - 0x5201: 0xB5F3, - 0x5202: 0xD8D6, - 0x5203: 0xC8D0, - 0x5204: 0x8455, - 0x5205: 0x8456, - 0x5206: 0xB7D6, - 0x5207: 0xC7D0, - 0x5208: 0xD8D7, - 0x5209: 0x8457, - 0x520A: 0xBFAF, - 0x520B: 0x8458, - 0x520C: 0x8459, - 0x520D: 0xDBBB, - 0x520E: 0xD8D8, - 0x520F: 0x845A, - 0x5210: 0x845B, - 0x5211: 0xD0CC, - 0x5212: 0xBBAE, - 0x5213: 0x845C, - 0x5214: 0x845D, - 0x5215: 0x845E, - 0x5216: 0xEBBE, - 0x5217: 0xC1D0, - 0x5218: 0xC1F5, - 0x5219: 0xD4F2, - 0x521A: 0xB8D5, - 0x521B: 0xB4B4, - 0x521C: 0x845F, - 0x521D: 0xB3F5, - 0x521E: 0x8460, - 0x521F: 0x8461, - 0x5220: 0xC9BE, - 0x5221: 0x8462, - 0x5222: 0x8463, - 0x5223: 0x8464, - 0x5224: 0xC5D0, - 0x5225: 0x8465, - 0x5226: 0x8466, - 0x5227: 0x8467, - 0x5228: 0xC5D9, - 0x5229: 0xC0FB, - 0x522A: 0x8468, - 0x522B: 0xB1F0, - 0x522C: 0x8469, - 0x522D: 0xD8D9, - 0x522E: 0xB9CE, - 0x522F: 0x846A, - 0x5230: 0xB5BD, - 0x5231: 0x846B, - 0x5232: 0x846C, - 0x5233: 0xD8DA, - 0x5234: 0x846D, - 0x5235: 0x846E, - 0x5236: 0xD6C6, - 0x5237: 0xCBA2, - 0x5238: 0xC8AF, - 0x5239: 0xC9B2, - 0x523A: 0xB4CC, - 0x523B: 0xBFCC, - 0x523C: 0x846F, - 0x523D: 0xB9F4, - 0x523E: 0x8470, - 0x523F: 0xD8DB, - 0x5240: 0xD8DC, - 0x5241: 0xB6E7, - 0x5242: 0xBCC1, - 0x5243: 0xCCEA, - 0x5244: 0x8471, - 0x5245: 0x8472, - 0x5246: 0x8473, - 0x5247: 0x8474, - 0x5248: 0x8475, - 0x5249: 0x8476, - 0x524A: 0xCFF7, - 0x524B: 0x8477, - 0x524C: 0xD8DD, - 0x524D: 0xC7B0, - 0x524E: 0x8478, - 0x524F: 0x8479, - 0x5250: 0xB9D0, - 0x5251: 0xBDA3, - 0x5252: 0x847A, - 0x5253: 0x847B, - 0x5254: 0xCCDE, - 0x5255: 0x847C, - 0x5256: 0xC6CA, - 0x5257: 0x847D, - 0x5258: 0x847E, - 0x5259: 0x8480, - 0x525A: 0x8481, - 0x525B: 0x8482, - 0x525C: 0xD8E0, - 0x525D: 0x8483, - 0x525E: 0xD8DE, - 0x525F: 0x8484, - 0x5260: 0x8485, - 0x5261: 0xD8DF, - 0x5262: 0x8486, - 0x5263: 0x8487, - 0x5264: 0x8488, - 0x5265: 0xB0FE, - 0x5266: 0x8489, - 0x5267: 0xBEE7, - 0x5268: 0x848A, - 0x5269: 0xCAA3, - 0x526A: 0xBCF4, - 0x526B: 0x848B, - 0x526C: 0x848C, - 0x526D: 0x848D, - 0x526E: 0x848E, - 0x526F: 0xB8B1, - 0x5270: 0x848F, - 0x5271: 0x8490, - 0x5272: 0xB8EE, - 0x5273: 0x8491, - 0x5274: 0x8492, - 0x5275: 0x8493, - 0x5276: 0x8494, - 0x5277: 0x8495, - 0x5278: 0x8496, - 0x5279: 0x8497, - 0x527A: 0x8498, - 0x527B: 0x8499, - 0x527C: 0x849A, - 0x527D: 0xD8E2, - 0x527E: 0x849B, - 0x527F: 0xBDCB, - 0x5280: 0x849C, - 0x5281: 0xD8E4, - 0x5282: 0xD8E3, - 0x5283: 0x849D, - 0x5284: 0x849E, - 0x5285: 0x849F, - 0x5286: 0x84A0, - 0x5287: 0x84A1, - 0x5288: 0xC5FC, - 0x5289: 0x84A2, - 0x528A: 0x84A3, - 0x528B: 0x84A4, - 0x528C: 0x84A5, - 0x528D: 0x84A6, - 0x528E: 0x84A7, - 0x528F: 0x84A8, - 0x5290: 0xD8E5, - 0x5291: 0x84A9, - 0x5292: 0x84AA, - 0x5293: 0xD8E6, - 0x5294: 0x84AB, - 0x5295: 0x84AC, - 0x5296: 0x84AD, - 0x5297: 0x84AE, - 0x5298: 0x84AF, - 0x5299: 0x84B0, - 0x529A: 0x84B1, - 0x529B: 0xC1A6, - 0x529C: 0x84B2, - 0x529D: 0xC8B0, - 0x529E: 0xB0EC, - 0x529F: 0xB9A6, - 0x52A0: 0xBCD3, - 0x52A1: 0xCEF1, - 0x52A2: 0xDBBD, - 0x52A3: 0xC1D3, - 0x52A4: 0x84B3, - 0x52A5: 0x84B4, - 0x52A6: 0x84B5, - 0x52A7: 0x84B6, - 0x52A8: 0xB6AF, - 0x52A9: 0xD6FA, - 0x52AA: 0xC5AC, - 0x52AB: 0xBDD9, - 0x52AC: 0xDBBE, - 0x52AD: 0xDBBF, - 0x52AE: 0x84B7, - 0x52AF: 0x84B8, - 0x52B0: 0x84B9, - 0x52B1: 0xC0F8, - 0x52B2: 0xBEA2, - 0x52B3: 0xC0CD, - 0x52B4: 0x84BA, - 0x52B5: 0x84BB, - 0x52B6: 0x84BC, - 0x52B7: 0x84BD, - 0x52B8: 0x84BE, - 0x52B9: 0x84BF, - 0x52BA: 0x84C0, - 0x52BB: 0x84C1, - 0x52BC: 0x84C2, - 0x52BD: 0x84C3, - 0x52BE: 0xDBC0, - 0x52BF: 0xCAC6, - 0x52C0: 0x84C4, - 0x52C1: 0x84C5, - 0x52C2: 0x84C6, - 0x52C3: 0xB2AA, - 0x52C4: 0x84C7, - 0x52C5: 0x84C8, - 0x52C6: 0x84C9, - 0x52C7: 0xD3C2, - 0x52C8: 0x84CA, - 0x52C9: 0xC3E3, - 0x52CA: 0x84CB, - 0x52CB: 0xD1AB, - 0x52CC: 0x84CC, - 0x52CD: 0x84CD, - 0x52CE: 0x84CE, - 0x52CF: 0x84CF, - 0x52D0: 0xDBC2, - 0x52D1: 0x84D0, - 0x52D2: 0xC0D5, - 0x52D3: 0x84D1, - 0x52D4: 0x84D2, - 0x52D5: 0x84D3, - 0x52D6: 0xDBC3, - 0x52D7: 0x84D4, - 0x52D8: 0xBFB1, - 0x52D9: 0x84D5, - 0x52DA: 0x84D6, - 0x52DB: 0x84D7, - 0x52DC: 0x84D8, - 0x52DD: 0x84D9, - 0x52DE: 0x84DA, - 0x52DF: 0xC4BC, - 0x52E0: 0x84DB, - 0x52E1: 0x84DC, - 0x52E2: 0x84DD, - 0x52E3: 0x84DE, - 0x52E4: 0xC7DA, - 0x52E5: 0x84DF, - 0x52E6: 0x84E0, - 0x52E7: 0x84E1, - 0x52E8: 0x84E2, - 0x52E9: 0x84E3, - 0x52EA: 0x84E4, - 0x52EB: 0x84E5, - 0x52EC: 0x84E6, - 0x52ED: 0x84E7, - 0x52EE: 0x84E8, - 0x52EF: 0x84E9, - 0x52F0: 0xDBC4, - 0x52F1: 0x84EA, - 0x52F2: 0x84EB, - 0x52F3: 0x84EC, - 0x52F4: 0x84ED, - 0x52F5: 0x84EE, - 0x52F6: 0x84EF, - 0x52F7: 0x84F0, - 0x52F8: 0x84F1, - 0x52F9: 0xD9E8, - 0x52FA: 0xC9D7, - 0x52FB: 0x84F2, - 0x52FC: 0x84F3, - 0x52FD: 0x84F4, - 0x52FE: 0xB9B4, - 0x52FF: 0xCEF0, - 0x5300: 0xD4C8, - 0x5301: 0x84F5, - 0x5302: 0x84F6, - 0x5303: 0x84F7, - 0x5304: 0x84F8, - 0x5305: 0xB0FC, - 0x5306: 0xB4D2, - 0x5307: 0x84F9, - 0x5308: 0xD0D9, - 0x5309: 0x84FA, - 0x530A: 0x84FB, - 0x530B: 0x84FC, - 0x530C: 0x84FD, - 0x530D: 0xD9E9, - 0x530E: 0x84FE, - 0x530F: 0xDECB, - 0x5310: 0xD9EB, - 0x5311: 0x8540, - 0x5312: 0x8541, - 0x5313: 0x8542, - 0x5314: 0x8543, - 0x5315: 0xD8B0, - 0x5316: 0xBBAF, - 0x5317: 0xB1B1, - 0x5318: 0x8544, - 0x5319: 0xB3D7, - 0x531A: 0xD8CE, - 0x531B: 0x8545, - 0x531C: 0x8546, - 0x531D: 0xD4D1, - 0x531E: 0x8547, - 0x531F: 0x8548, - 0x5320: 0xBDB3, - 0x5321: 0xBFEF, - 0x5322: 0x8549, - 0x5323: 0xCFBB, - 0x5324: 0x854A, - 0x5325: 0x854B, - 0x5326: 0xD8D0, - 0x5327: 0x854C, - 0x5328: 0x854D, - 0x5329: 0x854E, - 0x532A: 0xB7CB, - 0x532B: 0x854F, - 0x532C: 0x8550, - 0x532D: 0x8551, - 0x532E: 0xD8D1, - 0x532F: 0x8552, - 0x5330: 0x8553, - 0x5331: 0x8554, - 0x5332: 0x8555, - 0x5333: 0x8556, - 0x5334: 0x8557, - 0x5335: 0x8558, - 0x5336: 0x8559, - 0x5337: 0x855A, - 0x5338: 0x855B, - 0x5339: 0xC6A5, - 0x533A: 0xC7F8, - 0x533B: 0xD2BD, - 0x533C: 0x855C, - 0x533D: 0x855D, - 0x533E: 0xD8D2, - 0x533F: 0xC4E4, - 0x5340: 0x855E, - 0x5341: 0xCAAE, - 0x5342: 0x855F, - 0x5343: 0xC7A7, - 0x5344: 0x8560, - 0x5345: 0xD8A6, - 0x5346: 0x8561, - 0x5347: 0xC9FD, - 0x5348: 0xCEE7, - 0x5349: 0xBBDC, - 0x534A: 0xB0EB, - 0x534B: 0x8562, - 0x534C: 0x8563, - 0x534D: 0x8564, - 0x534E: 0xBBAA, - 0x534F: 0xD0AD, - 0x5350: 0x8565, - 0x5351: 0xB1B0, - 0x5352: 0xD7E4, - 0x5353: 0xD7BF, - 0x5354: 0x8566, - 0x5355: 0xB5A5, - 0x5356: 0xC2F4, - 0x5357: 0xC4CF, - 0x5358: 0x8567, - 0x5359: 0x8568, - 0x535A: 0xB2A9, - 0x535B: 0x8569, - 0x535C: 0xB2B7, - 0x535D: 0x856A, - 0x535E: 0xB1E5, - 0x535F: 0xDFB2, - 0x5360: 0xD5BC, - 0x5361: 0xBFA8, - 0x5362: 0xC2AC, - 0x5363: 0xD8D5, - 0x5364: 0xC2B1, - 0x5365: 0x856B, - 0x5366: 0xD8D4, - 0x5367: 0xCED4, - 0x5368: 0x856C, - 0x5369: 0xDAE0, - 0x536A: 0x856D, - 0x536B: 0xCEC0, - 0x536C: 0x856E, - 0x536D: 0x856F, - 0x536E: 0xD8B4, - 0x536F: 0xC3AE, - 0x5370: 0xD3A1, - 0x5371: 0xCEA3, - 0x5372: 0x8570, - 0x5373: 0xBCB4, - 0x5374: 0xC8B4, - 0x5375: 0xC2D1, - 0x5376: 0x8571, - 0x5377: 0xBEED, - 0x5378: 0xD0B6, - 0x5379: 0x8572, - 0x537A: 0xDAE1, - 0x537B: 0x8573, - 0x537C: 0x8574, - 0x537D: 0x8575, - 0x537E: 0x8576, - 0x537F: 0xC7E4, - 0x5380: 0x8577, - 0x5381: 0x8578, - 0x5382: 0xB3A7, - 0x5383: 0x8579, - 0x5384: 0xB6F2, - 0x5385: 0xCCFC, - 0x5386: 0xC0FA, - 0x5387: 0x857A, - 0x5388: 0x857B, - 0x5389: 0xC0F7, - 0x538A: 0x857C, - 0x538B: 0xD1B9, - 0x538C: 0xD1E1, - 0x538D: 0xD8C7, - 0x538E: 0x857D, - 0x538F: 0x857E, - 0x5390: 0x8580, - 0x5391: 0x8581, - 0x5392: 0x8582, - 0x5393: 0x8583, - 0x5394: 0x8584, - 0x5395: 0xB2DE, - 0x5396: 0x8585, - 0x5397: 0x8586, - 0x5398: 0xC0E5, - 0x5399: 0x8587, - 0x539A: 0xBAF1, - 0x539B: 0x8588, - 0x539C: 0x8589, - 0x539D: 0xD8C8, - 0x539E: 0x858A, - 0x539F: 0xD4AD, - 0x53A0: 0x858B, - 0x53A1: 0x858C, - 0x53A2: 0xCFE1, - 0x53A3: 0xD8C9, - 0x53A4: 0x858D, - 0x53A5: 0xD8CA, - 0x53A6: 0xCFC3, - 0x53A7: 0x858E, - 0x53A8: 0xB3F8, - 0x53A9: 0xBEC7, - 0x53AA: 0x858F, - 0x53AB: 0x8590, - 0x53AC: 0x8591, - 0x53AD: 0x8592, - 0x53AE: 0xD8CB, - 0x53AF: 0x8593, - 0x53B0: 0x8594, - 0x53B1: 0x8595, - 0x53B2: 0x8596, - 0x53B3: 0x8597, - 0x53B4: 0x8598, - 0x53B5: 0x8599, - 0x53B6: 0xDBCC, - 0x53B7: 0x859A, - 0x53B8: 0x859B, - 0x53B9: 0x859C, - 0x53BA: 0x859D, - 0x53BB: 0xC8A5, - 0x53BC: 0x859E, - 0x53BD: 0x859F, - 0x53BE: 0x85A0, - 0x53BF: 0xCFD8, - 0x53C0: 0x85A1, - 0x53C1: 0xC8FE, - 0x53C2: 0xB2CE, - 0x53C3: 0x85A2, - 0x53C4: 0x85A3, - 0x53C5: 0x85A4, - 0x53C6: 0x85A5, - 0x53C7: 0x85A6, - 0x53C8: 0xD3D6, - 0x53C9: 0xB2E6, - 0x53CA: 0xBCB0, - 0x53CB: 0xD3D1, - 0x53CC: 0xCBAB, - 0x53CD: 0xB7B4, - 0x53CE: 0x85A7, - 0x53CF: 0x85A8, - 0x53D0: 0x85A9, - 0x53D1: 0xB7A2, - 0x53D2: 0x85AA, - 0x53D3: 0x85AB, - 0x53D4: 0xCAE5, - 0x53D5: 0x85AC, - 0x53D6: 0xC8A1, - 0x53D7: 0xCADC, - 0x53D8: 0xB1E4, - 0x53D9: 0xD0F0, - 0x53DA: 0x85AD, - 0x53DB: 0xC5D1, - 0x53DC: 0x85AE, - 0x53DD: 0x85AF, - 0x53DE: 0x85B0, - 0x53DF: 0xDBC5, - 0x53E0: 0xB5FE, - 0x53E1: 0x85B1, - 0x53E2: 0x85B2, - 0x53E3: 0xBFDA, - 0x53E4: 0xB9C5, - 0x53E5: 0xBEE4, - 0x53E6: 0xC1ED, - 0x53E7: 0x85B3, - 0x53E8: 0xDFB6, - 0x53E9: 0xDFB5, - 0x53EA: 0xD6BB, - 0x53EB: 0xBDD0, - 0x53EC: 0xD5D9, - 0x53ED: 0xB0C8, - 0x53EE: 0xB6A3, - 0x53EF: 0xBFC9, - 0x53F0: 0xCCA8, - 0x53F1: 0xDFB3, - 0x53F2: 0xCAB7, - 0x53F3: 0xD3D2, - 0x53F4: 0x85B4, - 0x53F5: 0xD8CF, - 0x53F6: 0xD2B6, - 0x53F7: 0xBAC5, - 0x53F8: 0xCBBE, - 0x53F9: 0xCCBE, - 0x53FA: 0x85B5, - 0x53FB: 0xDFB7, - 0x53FC: 0xB5F0, - 0x53FD: 0xDFB4, - 0x53FE: 0x85B6, - 0x53FF: 0x85B7, - 0x5400: 0x85B8, - 0x5401: 0xD3F5, - 0x5402: 0x85B9, - 0x5403: 0xB3D4, - 0x5404: 0xB8F7, - 0x5405: 0x85BA, - 0x5406: 0xDFBA, - 0x5407: 0x85BB, - 0x5408: 0xBACF, - 0x5409: 0xBCAA, - 0x540A: 0xB5F5, - 0x540B: 0x85BC, - 0x540C: 0xCDAC, - 0x540D: 0xC3FB, - 0x540E: 0xBAF3, - 0x540F: 0xC0F4, - 0x5410: 0xCDC2, - 0x5411: 0xCFF2, - 0x5412: 0xDFB8, - 0x5413: 0xCFC5, - 0x5414: 0x85BD, - 0x5415: 0xC2C0, - 0x5416: 0xDFB9, - 0x5417: 0xC2F0, - 0x5418: 0x85BE, - 0x5419: 0x85BF, - 0x541A: 0x85C0, - 0x541B: 0xBEFD, - 0x541C: 0x85C1, - 0x541D: 0xC1DF, - 0x541E: 0xCDCC, - 0x541F: 0xD2F7, - 0x5420: 0xB7CD, - 0x5421: 0xDFC1, - 0x5422: 0x85C2, - 0x5423: 0xDFC4, - 0x5424: 0x85C3, - 0x5425: 0x85C4, - 0x5426: 0xB7F1, - 0x5427: 0xB0C9, - 0x5428: 0xB6D6, - 0x5429: 0xB7D4, - 0x542A: 0x85C5, - 0x542B: 0xBAAC, - 0x542C: 0xCCFD, - 0x542D: 0xBFD4, - 0x542E: 0xCBB1, - 0x542F: 0xC6F4, - 0x5430: 0x85C6, - 0x5431: 0xD6A8, - 0x5432: 0xDFC5, - 0x5433: 0x85C7, - 0x5434: 0xCEE2, - 0x5435: 0xB3B3, - 0x5436: 0x85C8, - 0x5437: 0x85C9, - 0x5438: 0xCEFC, - 0x5439: 0xB4B5, - 0x543A: 0x85CA, - 0x543B: 0xCEC7, - 0x543C: 0xBAF0, - 0x543D: 0x85CB, - 0x543E: 0xCEE1, - 0x543F: 0x85CC, - 0x5440: 0xD1BD, - 0x5441: 0x85CD, - 0x5442: 0x85CE, - 0x5443: 0xDFC0, - 0x5444: 0x85CF, - 0x5445: 0x85D0, - 0x5446: 0xB4F4, - 0x5447: 0x85D1, - 0x5448: 0xB3CA, - 0x5449: 0x85D2, - 0x544A: 0xB8E6, - 0x544B: 0xDFBB, - 0x544C: 0x85D3, - 0x544D: 0x85D4, - 0x544E: 0x85D5, - 0x544F: 0x85D6, - 0x5450: 0xC4C5, - 0x5451: 0x85D7, - 0x5452: 0xDFBC, - 0x5453: 0xDFBD, - 0x5454: 0xDFBE, - 0x5455: 0xC5BB, - 0x5456: 0xDFBF, - 0x5457: 0xDFC2, - 0x5458: 0xD4B1, - 0x5459: 0xDFC3, - 0x545A: 0x85D8, - 0x545B: 0xC7BA, - 0x545C: 0xCED8, - 0x545D: 0x85D9, - 0x545E: 0x85DA, - 0x545F: 0x85DB, - 0x5460: 0x85DC, - 0x5461: 0x85DD, - 0x5462: 0xC4D8, - 0x5463: 0x85DE, - 0x5464: 0xDFCA, - 0x5465: 0x85DF, - 0x5466: 0xDFCF, - 0x5467: 0x85E0, - 0x5468: 0xD6DC, - 0x5469: 0x85E1, - 0x546A: 0x85E2, - 0x546B: 0x85E3, - 0x546C: 0x85E4, - 0x546D: 0x85E5, - 0x546E: 0x85E6, - 0x546F: 0x85E7, - 0x5470: 0x85E8, - 0x5471: 0xDFC9, - 0x5472: 0xDFDA, - 0x5473: 0xCEB6, - 0x5474: 0x85E9, - 0x5475: 0xBAC7, - 0x5476: 0xDFCE, - 0x5477: 0xDFC8, - 0x5478: 0xC5DE, - 0x5479: 0x85EA, - 0x547A: 0x85EB, - 0x547B: 0xC9EB, - 0x547C: 0xBAF4, - 0x547D: 0xC3FC, - 0x547E: 0x85EC, - 0x547F: 0x85ED, - 0x5480: 0xBED7, - 0x5481: 0x85EE, - 0x5482: 0xDFC6, - 0x5483: 0x85EF, - 0x5484: 0xDFCD, - 0x5485: 0x85F0, - 0x5486: 0xC5D8, - 0x5487: 0x85F1, - 0x5488: 0x85F2, - 0x5489: 0x85F3, - 0x548A: 0x85F4, - 0x548B: 0xD5A6, - 0x548C: 0xBACD, - 0x548D: 0x85F5, - 0x548E: 0xBECC, - 0x548F: 0xD3BD, - 0x5490: 0xB8C0, - 0x5491: 0x85F6, - 0x5492: 0xD6E4, - 0x5493: 0x85F7, - 0x5494: 0xDFC7, - 0x5495: 0xB9BE, - 0x5496: 0xBFA7, - 0x5497: 0x85F8, - 0x5498: 0x85F9, - 0x5499: 0xC1FC, - 0x549A: 0xDFCB, - 0x549B: 0xDFCC, - 0x549C: 0x85FA, - 0x549D: 0xDFD0, - 0x549E: 0x85FB, - 0x549F: 0x85FC, - 0x54A0: 0x85FD, - 0x54A1: 0x85FE, - 0x54A2: 0x8640, - 0x54A3: 0xDFDB, - 0x54A4: 0xDFE5, - 0x54A5: 0x8641, - 0x54A6: 0xDFD7, - 0x54A7: 0xDFD6, - 0x54A8: 0xD7C9, - 0x54A9: 0xDFE3, - 0x54AA: 0xDFE4, - 0x54AB: 0xE5EB, - 0x54AC: 0xD2A7, - 0x54AD: 0xDFD2, - 0x54AE: 0x8642, - 0x54AF: 0xBFA9, - 0x54B0: 0x8643, - 0x54B1: 0xD4DB, - 0x54B2: 0x8644, - 0x54B3: 0xBFC8, - 0x54B4: 0xDFD4, - 0x54B5: 0x8645, - 0x54B6: 0x8646, - 0x54B7: 0x8647, - 0x54B8: 0xCFCC, - 0x54B9: 0x8648, - 0x54BA: 0x8649, - 0x54BB: 0xDFDD, - 0x54BC: 0x864A, - 0x54BD: 0xD1CA, - 0x54BE: 0x864B, - 0x54BF: 0xDFDE, - 0x54C0: 0xB0A7, - 0x54C1: 0xC6B7, - 0x54C2: 0xDFD3, - 0x54C3: 0x864C, - 0x54C4: 0xBAE5, - 0x54C5: 0x864D, - 0x54C6: 0xB6DF, - 0x54C7: 0xCDDB, - 0x54C8: 0xB9FE, - 0x54C9: 0xD4D5, - 0x54CA: 0x864E, - 0x54CB: 0x864F, - 0x54CC: 0xDFDF, - 0x54CD: 0xCFEC, - 0x54CE: 0xB0A5, - 0x54CF: 0xDFE7, - 0x54D0: 0xDFD1, - 0x54D1: 0xD1C6, - 0x54D2: 0xDFD5, - 0x54D3: 0xDFD8, - 0x54D4: 0xDFD9, - 0x54D5: 0xDFDC, - 0x54D6: 0x8650, - 0x54D7: 0xBBA9, - 0x54D8: 0x8651, - 0x54D9: 0xDFE0, - 0x54DA: 0xDFE1, - 0x54DB: 0x8652, - 0x54DC: 0xDFE2, - 0x54DD: 0xDFE6, - 0x54DE: 0xDFE8, - 0x54DF: 0xD3B4, - 0x54E0: 0x8653, - 0x54E1: 0x8654, - 0x54E2: 0x8655, - 0x54E3: 0x8656, - 0x54E4: 0x8657, - 0x54E5: 0xB8E7, - 0x54E6: 0xC5B6, - 0x54E7: 0xDFEA, - 0x54E8: 0xC9DA, - 0x54E9: 0xC1A8, - 0x54EA: 0xC4C4, - 0x54EB: 0x8658, - 0x54EC: 0x8659, - 0x54ED: 0xBFDE, - 0x54EE: 0xCFF8, - 0x54EF: 0x865A, - 0x54F0: 0x865B, - 0x54F1: 0x865C, - 0x54F2: 0xD5DC, - 0x54F3: 0xDFEE, - 0x54F4: 0x865D, - 0x54F5: 0x865E, - 0x54F6: 0x865F, - 0x54F7: 0x8660, - 0x54F8: 0x8661, - 0x54F9: 0x8662, - 0x54FA: 0xB2B8, - 0x54FB: 0x8663, - 0x54FC: 0xBADF, - 0x54FD: 0xDFEC, - 0x54FE: 0x8664, - 0x54FF: 0xDBC1, - 0x5500: 0x8665, - 0x5501: 0xD1E4, - 0x5502: 0x8666, - 0x5503: 0x8667, - 0x5504: 0x8668, - 0x5505: 0x8669, - 0x5506: 0xCBF4, - 0x5507: 0xB4BD, - 0x5508: 0x866A, - 0x5509: 0xB0A6, - 0x550A: 0x866B, - 0x550B: 0x866C, - 0x550C: 0x866D, - 0x550D: 0x866E, - 0x550E: 0x866F, - 0x550F: 0xDFF1, - 0x5510: 0xCCC6, - 0x5511: 0xDFF2, - 0x5512: 0x8670, - 0x5513: 0x8671, - 0x5514: 0xDFED, - 0x5515: 0x8672, - 0x5516: 0x8673, - 0x5517: 0x8674, - 0x5518: 0x8675, - 0x5519: 0x8676, - 0x551A: 0x8677, - 0x551B: 0xDFE9, - 0x551C: 0x8678, - 0x551D: 0x8679, - 0x551E: 0x867A, - 0x551F: 0x867B, - 0x5520: 0xDFEB, - 0x5521: 0x867C, - 0x5522: 0xDFEF, - 0x5523: 0xDFF0, - 0x5524: 0xBBBD, - 0x5525: 0x867D, - 0x5526: 0x867E, - 0x5527: 0xDFF3, - 0x5528: 0x8680, - 0x5529: 0x8681, - 0x552A: 0xDFF4, - 0x552B: 0x8682, - 0x552C: 0xBBA3, - 0x552D: 0x8683, - 0x552E: 0xCADB, - 0x552F: 0xCEA8, - 0x5530: 0xE0A7, - 0x5531: 0xB3AA, - 0x5532: 0x8684, - 0x5533: 0xE0A6, - 0x5534: 0x8685, - 0x5535: 0x8686, - 0x5536: 0x8687, - 0x5537: 0xE0A1, - 0x5538: 0x8688, - 0x5539: 0x8689, - 0x553A: 0x868A, - 0x553B: 0x868B, - 0x553C: 0xDFFE, - 0x553D: 0x868C, - 0x553E: 0xCDD9, - 0x553F: 0xDFFC, - 0x5540: 0x868D, - 0x5541: 0xDFFA, - 0x5542: 0x868E, - 0x5543: 0xBFD0, - 0x5544: 0xD7C4, - 0x5545: 0x868F, - 0x5546: 0xC9CC, - 0x5547: 0x8690, - 0x5548: 0x8691, - 0x5549: 0xDFF8, - 0x554A: 0xB0A1, - 0x554B: 0x8692, - 0x554C: 0x8693, - 0x554D: 0x8694, - 0x554E: 0x8695, - 0x554F: 0x8696, - 0x5550: 0xDFFD, - 0x5551: 0x8697, - 0x5552: 0x8698, - 0x5553: 0x8699, - 0x5554: 0x869A, - 0x5555: 0xDFFB, - 0x5556: 0xE0A2, - 0x5557: 0x869B, - 0x5558: 0x869C, - 0x5559: 0x869D, - 0x555A: 0x869E, - 0x555B: 0x869F, - 0x555C: 0xE0A8, - 0x555D: 0x86A0, - 0x555E: 0x86A1, - 0x555F: 0x86A2, - 0x5560: 0x86A3, - 0x5561: 0xB7C8, - 0x5562: 0x86A4, - 0x5563: 0x86A5, - 0x5564: 0xC6A1, - 0x5565: 0xC9B6, - 0x5566: 0xC0B2, - 0x5567: 0xDFF5, - 0x5568: 0x86A6, - 0x5569: 0x86A7, - 0x556A: 0xC5BE, - 0x556B: 0x86A8, - 0x556C: 0xD8C4, - 0x556D: 0xDFF9, - 0x556E: 0xC4F6, - 0x556F: 0x86A9, - 0x5570: 0x86AA, - 0x5571: 0x86AB, - 0x5572: 0x86AC, - 0x5573: 0x86AD, - 0x5574: 0x86AE, - 0x5575: 0xE0A3, - 0x5576: 0xE0A4, - 0x5577: 0xE0A5, - 0x5578: 0xD0A5, - 0x5579: 0x86AF, - 0x557A: 0x86B0, - 0x557B: 0xE0B4, - 0x557C: 0xCCE4, - 0x557D: 0x86B1, - 0x557E: 0xE0B1, - 0x557F: 0x86B2, - 0x5580: 0xBFA6, - 0x5581: 0xE0AF, - 0x5582: 0xCEB9, - 0x5583: 0xE0AB, - 0x5584: 0xC9C6, - 0x5585: 0x86B3, - 0x5586: 0x86B4, - 0x5587: 0xC0AE, - 0x5588: 0xE0AE, - 0x5589: 0xBAED, - 0x558A: 0xBAB0, - 0x558B: 0xE0A9, - 0x558C: 0x86B5, - 0x558D: 0x86B6, - 0x558E: 0x86B7, - 0x558F: 0xDFF6, - 0x5590: 0x86B8, - 0x5591: 0xE0B3, - 0x5592: 0x86B9, - 0x5593: 0x86BA, - 0x5594: 0xE0B8, - 0x5595: 0x86BB, - 0x5596: 0x86BC, - 0x5597: 0x86BD, - 0x5598: 0xB4AD, - 0x5599: 0xE0B9, - 0x559A: 0x86BE, - 0x559B: 0x86BF, - 0x559C: 0xCFB2, - 0x559D: 0xBAC8, - 0x559E: 0x86C0, - 0x559F: 0xE0B0, - 0x55A0: 0x86C1, - 0x55A1: 0x86C2, - 0x55A2: 0x86C3, - 0x55A3: 0x86C4, - 0x55A4: 0x86C5, - 0x55A5: 0x86C6, - 0x55A6: 0x86C7, - 0x55A7: 0xD0FA, - 0x55A8: 0x86C8, - 0x55A9: 0x86C9, - 0x55AA: 0x86CA, - 0x55AB: 0x86CB, - 0x55AC: 0x86CC, - 0x55AD: 0x86CD, - 0x55AE: 0x86CE, - 0x55AF: 0x86CF, - 0x55B0: 0x86D0, - 0x55B1: 0xE0AC, - 0x55B2: 0x86D1, - 0x55B3: 0xD4FB, - 0x55B4: 0x86D2, - 0x55B5: 0xDFF7, - 0x55B6: 0x86D3, - 0x55B7: 0xC5E7, - 0x55B8: 0x86D4, - 0x55B9: 0xE0AD, - 0x55BA: 0x86D5, - 0x55BB: 0xD3F7, - 0x55BC: 0x86D6, - 0x55BD: 0xE0B6, - 0x55BE: 0xE0B7, - 0x55BF: 0x86D7, - 0x55C0: 0x86D8, - 0x55C1: 0x86D9, - 0x55C2: 0x86DA, - 0x55C3: 0x86DB, - 0x55C4: 0xE0C4, - 0x55C5: 0xD0E1, - 0x55C6: 0x86DC, - 0x55C7: 0x86DD, - 0x55C8: 0x86DE, - 0x55C9: 0xE0BC, - 0x55CA: 0x86DF, - 0x55CB: 0x86E0, - 0x55CC: 0xE0C9, - 0x55CD: 0xE0CA, - 0x55CE: 0x86E1, - 0x55CF: 0x86E2, - 0x55D0: 0x86E3, - 0x55D1: 0xE0BE, - 0x55D2: 0xE0AA, - 0x55D3: 0xC9A4, - 0x55D4: 0xE0C1, - 0x55D5: 0x86E4, - 0x55D6: 0xE0B2, - 0x55D7: 0x86E5, - 0x55D8: 0x86E6, - 0x55D9: 0x86E7, - 0x55DA: 0x86E8, - 0x55DB: 0x86E9, - 0x55DC: 0xCAC8, - 0x55DD: 0xE0C3, - 0x55DE: 0x86EA, - 0x55DF: 0xE0B5, - 0x55E0: 0x86EB, - 0x55E1: 0xCECB, - 0x55E2: 0x86EC, - 0x55E3: 0xCBC3, - 0x55E4: 0xE0CD, - 0x55E5: 0xE0C6, - 0x55E6: 0xE0C2, - 0x55E7: 0x86ED, - 0x55E8: 0xE0CB, - 0x55E9: 0x86EE, - 0x55EA: 0xE0BA, - 0x55EB: 0xE0BF, - 0x55EC: 0xE0C0, - 0x55ED: 0x86EF, - 0x55EE: 0x86F0, - 0x55EF: 0xE0C5, - 0x55F0: 0x86F1, - 0x55F1: 0x86F2, - 0x55F2: 0xE0C7, - 0x55F3: 0xE0C8, - 0x55F4: 0x86F3, - 0x55F5: 0xE0CC, - 0x55F6: 0x86F4, - 0x55F7: 0xE0BB, - 0x55F8: 0x86F5, - 0x55F9: 0x86F6, - 0x55FA: 0x86F7, - 0x55FB: 0x86F8, - 0x55FC: 0x86F9, - 0x55FD: 0xCBD4, - 0x55FE: 0xE0D5, - 0x55FF: 0x86FA, - 0x5600: 0xE0D6, - 0x5601: 0xE0D2, - 0x5602: 0x86FB, - 0x5603: 0x86FC, - 0x5604: 0x86FD, - 0x5605: 0x86FE, - 0x5606: 0x8740, - 0x5607: 0x8741, - 0x5608: 0xE0D0, - 0x5609: 0xBCCE, - 0x560A: 0x8742, - 0x560B: 0x8743, - 0x560C: 0xE0D1, - 0x560D: 0x8744, - 0x560E: 0xB8C2, - 0x560F: 0xD8C5, - 0x5610: 0x8745, - 0x5611: 0x8746, - 0x5612: 0x8747, - 0x5613: 0x8748, - 0x5614: 0x8749, - 0x5615: 0x874A, - 0x5616: 0x874B, - 0x5617: 0x874C, - 0x5618: 0xD0EA, - 0x5619: 0x874D, - 0x561A: 0x874E, - 0x561B: 0xC2EF, - 0x561C: 0x874F, - 0x561D: 0x8750, - 0x561E: 0xE0CF, - 0x561F: 0xE0BD, - 0x5620: 0x8751, - 0x5621: 0x8752, - 0x5622: 0x8753, - 0x5623: 0xE0D4, - 0x5624: 0xE0D3, - 0x5625: 0x8754, - 0x5626: 0x8755, - 0x5627: 0xE0D7, - 0x5628: 0x8756, - 0x5629: 0x8757, - 0x562A: 0x8758, - 0x562B: 0x8759, - 0x562C: 0xE0DC, - 0x562D: 0xE0D8, - 0x562E: 0x875A, - 0x562F: 0x875B, - 0x5630: 0x875C, - 0x5631: 0xD6F6, - 0x5632: 0xB3B0, - 0x5633: 0x875D, - 0x5634: 0xD7EC, - 0x5635: 0x875E, - 0x5636: 0xCBBB, - 0x5637: 0x875F, - 0x5638: 0x8760, - 0x5639: 0xE0DA, - 0x563A: 0x8761, - 0x563B: 0xCEFB, - 0x563C: 0x8762, - 0x563D: 0x8763, - 0x563E: 0x8764, - 0x563F: 0xBAD9, - 0x5640: 0x8765, - 0x5641: 0x8766, - 0x5642: 0x8767, - 0x5643: 0x8768, - 0x5644: 0x8769, - 0x5645: 0x876A, - 0x5646: 0x876B, - 0x5647: 0x876C, - 0x5648: 0x876D, - 0x5649: 0x876E, - 0x564A: 0x876F, - 0x564B: 0x8770, - 0x564C: 0xE0E1, - 0x564D: 0xE0DD, - 0x564E: 0xD2AD, - 0x564F: 0x8771, - 0x5650: 0x8772, - 0x5651: 0x8773, - 0x5652: 0x8774, - 0x5653: 0x8775, - 0x5654: 0xE0E2, - 0x5655: 0x8776, - 0x5656: 0x8777, - 0x5657: 0xE0DB, - 0x5658: 0xE0D9, - 0x5659: 0xE0DF, - 0x565A: 0x8778, - 0x565B: 0x8779, - 0x565C: 0xE0E0, - 0x565D: 0x877A, - 0x565E: 0x877B, - 0x565F: 0x877C, - 0x5660: 0x877D, - 0x5661: 0x877E, - 0x5662: 0xE0DE, - 0x5663: 0x8780, - 0x5664: 0xE0E4, - 0x5665: 0x8781, - 0x5666: 0x8782, - 0x5667: 0x8783, - 0x5668: 0xC6F7, - 0x5669: 0xD8AC, - 0x566A: 0xD4EB, - 0x566B: 0xE0E6, - 0x566C: 0xCAC9, - 0x566D: 0x8784, - 0x566E: 0x8785, - 0x566F: 0x8786, - 0x5670: 0x8787, - 0x5671: 0xE0E5, - 0x5672: 0x8788, - 0x5673: 0x8789, - 0x5674: 0x878A, - 0x5675: 0x878B, - 0x5676: 0xB8C1, - 0x5677: 0x878C, - 0x5678: 0x878D, - 0x5679: 0x878E, - 0x567A: 0x878F, - 0x567B: 0xE0E7, - 0x567C: 0xE0E8, - 0x567D: 0x8790, - 0x567E: 0x8791, - 0x567F: 0x8792, - 0x5680: 0x8793, - 0x5681: 0x8794, - 0x5682: 0x8795, - 0x5683: 0x8796, - 0x5684: 0x8797, - 0x5685: 0xE0E9, - 0x5686: 0xE0E3, - 0x5687: 0x8798, - 0x5688: 0x8799, - 0x5689: 0x879A, - 0x568A: 0x879B, - 0x568B: 0x879C, - 0x568C: 0x879D, - 0x568D: 0x879E, - 0x568E: 0xBABF, - 0x568F: 0xCCE7, - 0x5690: 0x879F, - 0x5691: 0x87A0, - 0x5692: 0x87A1, - 0x5693: 0xE0EA, - 0x5694: 0x87A2, - 0x5695: 0x87A3, - 0x5696: 0x87A4, - 0x5697: 0x87A5, - 0x5698: 0x87A6, - 0x5699: 0x87A7, - 0x569A: 0x87A8, - 0x569B: 0x87A9, - 0x569C: 0x87AA, - 0x569D: 0x87AB, - 0x569E: 0x87AC, - 0x569F: 0x87AD, - 0x56A0: 0x87AE, - 0x56A1: 0x87AF, - 0x56A2: 0x87B0, - 0x56A3: 0xCFF9, - 0x56A4: 0x87B1, - 0x56A5: 0x87B2, - 0x56A6: 0x87B3, - 0x56A7: 0x87B4, - 0x56A8: 0x87B5, - 0x56A9: 0x87B6, - 0x56AA: 0x87B7, - 0x56AB: 0x87B8, - 0x56AC: 0x87B9, - 0x56AD: 0x87BA, - 0x56AE: 0x87BB, - 0x56AF: 0xE0EB, - 0x56B0: 0x87BC, - 0x56B1: 0x87BD, - 0x56B2: 0x87BE, - 0x56B3: 0x87BF, - 0x56B4: 0x87C0, - 0x56B5: 0x87C1, - 0x56B6: 0x87C2, - 0x56B7: 0xC8C2, - 0x56B8: 0x87C3, - 0x56B9: 0x87C4, - 0x56BA: 0x87C5, - 0x56BB: 0x87C6, - 0x56BC: 0xBDC0, - 0x56BD: 0x87C7, - 0x56BE: 0x87C8, - 0x56BF: 0x87C9, - 0x56C0: 0x87CA, - 0x56C1: 0x87CB, - 0x56C2: 0x87CC, - 0x56C3: 0x87CD, - 0x56C4: 0x87CE, - 0x56C5: 0x87CF, - 0x56C6: 0x87D0, - 0x56C7: 0x87D1, - 0x56C8: 0x87D2, - 0x56C9: 0x87D3, - 0x56CA: 0xC4D2, - 0x56CB: 0x87D4, - 0x56CC: 0x87D5, - 0x56CD: 0x87D6, - 0x56CE: 0x87D7, - 0x56CF: 0x87D8, - 0x56D0: 0x87D9, - 0x56D1: 0x87DA, - 0x56D2: 0x87DB, - 0x56D3: 0x87DC, - 0x56D4: 0xE0EC, - 0x56D5: 0x87DD, - 0x56D6: 0x87DE, - 0x56D7: 0xE0ED, - 0x56D8: 0x87DF, - 0x56D9: 0x87E0, - 0x56DA: 0xC7F4, - 0x56DB: 0xCBC4, - 0x56DC: 0x87E1, - 0x56DD: 0xE0EE, - 0x56DE: 0xBBD8, - 0x56DF: 0xD8B6, - 0x56E0: 0xD2F2, - 0x56E1: 0xE0EF, - 0x56E2: 0xCDC5, - 0x56E3: 0x87E2, - 0x56E4: 0xB6DA, - 0x56E5: 0x87E3, - 0x56E6: 0x87E4, - 0x56E7: 0x87E5, - 0x56E8: 0x87E6, - 0x56E9: 0x87E7, - 0x56EA: 0x87E8, - 0x56EB: 0xE0F1, - 0x56EC: 0x87E9, - 0x56ED: 0xD4B0, - 0x56EE: 0x87EA, - 0x56EF: 0x87EB, - 0x56F0: 0xC0A7, - 0x56F1: 0xB4D1, - 0x56F2: 0x87EC, - 0x56F3: 0x87ED, - 0x56F4: 0xCEA7, - 0x56F5: 0xE0F0, - 0x56F6: 0x87EE, - 0x56F7: 0x87EF, - 0x56F8: 0x87F0, - 0x56F9: 0xE0F2, - 0x56FA: 0xB9CC, - 0x56FB: 0x87F1, - 0x56FC: 0x87F2, - 0x56FD: 0xB9FA, - 0x56FE: 0xCDBC, - 0x56FF: 0xE0F3, - 0x5700: 0x87F3, - 0x5701: 0x87F4, - 0x5702: 0x87F5, - 0x5703: 0xC6D4, - 0x5704: 0xE0F4, - 0x5705: 0x87F6, - 0x5706: 0xD4B2, - 0x5707: 0x87F7, - 0x5708: 0xC8A6, - 0x5709: 0xE0F6, - 0x570A: 0xE0F5, - 0x570B: 0x87F8, - 0x570C: 0x87F9, - 0x570D: 0x87FA, - 0x570E: 0x87FB, - 0x570F: 0x87FC, - 0x5710: 0x87FD, - 0x5711: 0x87FE, - 0x5712: 0x8840, - 0x5713: 0x8841, - 0x5714: 0x8842, - 0x5715: 0x8843, - 0x5716: 0x8844, - 0x5717: 0x8845, - 0x5718: 0x8846, - 0x5719: 0x8847, - 0x571A: 0x8848, - 0x571B: 0x8849, - 0x571C: 0xE0F7, - 0x571D: 0x884A, - 0x571E: 0x884B, - 0x571F: 0xCDC1, - 0x5720: 0x884C, - 0x5721: 0x884D, - 0x5722: 0x884E, - 0x5723: 0xCAA5, - 0x5724: 0x884F, - 0x5725: 0x8850, - 0x5726: 0x8851, - 0x5727: 0x8852, - 0x5728: 0xD4DA, - 0x5729: 0xDBD7, - 0x572A: 0xDBD9, - 0x572B: 0x8853, - 0x572C: 0xDBD8, - 0x572D: 0xB9E7, - 0x572E: 0xDBDC, - 0x572F: 0xDBDD, - 0x5730: 0xB5D8, - 0x5731: 0x8854, - 0x5732: 0x8855, - 0x5733: 0xDBDA, - 0x5734: 0x8856, - 0x5735: 0x8857, - 0x5736: 0x8858, - 0x5737: 0x8859, - 0x5738: 0x885A, - 0x5739: 0xDBDB, - 0x573A: 0xB3A1, - 0x573B: 0xDBDF, - 0x573C: 0x885B, - 0x573D: 0x885C, - 0x573E: 0xBBF8, - 0x573F: 0x885D, - 0x5740: 0xD6B7, - 0x5741: 0x885E, - 0x5742: 0xDBE0, - 0x5743: 0x885F, - 0x5744: 0x8860, - 0x5745: 0x8861, - 0x5746: 0x8862, - 0x5747: 0xBEF9, - 0x5748: 0x8863, - 0x5749: 0x8864, - 0x574A: 0xB7BB, - 0x574B: 0x8865, - 0x574C: 0xDBD0, - 0x574D: 0xCCAE, - 0x574E: 0xBFB2, - 0x574F: 0xBBB5, - 0x5750: 0xD7F8, - 0x5751: 0xBFD3, - 0x5752: 0x8866, - 0x5753: 0x8867, - 0x5754: 0x8868, - 0x5755: 0x8869, - 0x5756: 0x886A, - 0x5757: 0xBFE9, - 0x5758: 0x886B, - 0x5759: 0x886C, - 0x575A: 0xBCE1, - 0x575B: 0xCCB3, - 0x575C: 0xDBDE, - 0x575D: 0xB0D3, - 0x575E: 0xCEEB, - 0x575F: 0xB7D8, - 0x5760: 0xD7B9, - 0x5761: 0xC6C2, - 0x5762: 0x886D, - 0x5763: 0x886E, - 0x5764: 0xC0A4, - 0x5765: 0x886F, - 0x5766: 0xCCB9, - 0x5767: 0x8870, - 0x5768: 0xDBE7, - 0x5769: 0xDBE1, - 0x576A: 0xC6BA, - 0x576B: 0xDBE3, - 0x576C: 0x8871, - 0x576D: 0xDBE8, - 0x576E: 0x8872, - 0x576F: 0xC5F7, - 0x5770: 0x8873, - 0x5771: 0x8874, - 0x5772: 0x8875, - 0x5773: 0xDBEA, - 0x5774: 0x8876, - 0x5775: 0x8877, - 0x5776: 0xDBE9, - 0x5777: 0xBFC0, - 0x5778: 0x8878, - 0x5779: 0x8879, - 0x577A: 0x887A, - 0x577B: 0xDBE6, - 0x577C: 0xDBE5, - 0x577D: 0x887B, - 0x577E: 0x887C, - 0x577F: 0x887D, - 0x5780: 0x887E, - 0x5781: 0x8880, - 0x5782: 0xB4B9, - 0x5783: 0xC0AC, - 0x5784: 0xC2A2, - 0x5785: 0xDBE2, - 0x5786: 0xDBE4, - 0x5787: 0x8881, - 0x5788: 0x8882, - 0x5789: 0x8883, - 0x578A: 0x8884, - 0x578B: 0xD0CD, - 0x578C: 0xDBED, - 0x578D: 0x8885, - 0x578E: 0x8886, - 0x578F: 0x8887, - 0x5790: 0x8888, - 0x5791: 0x8889, - 0x5792: 0xC0DD, - 0x5793: 0xDBF2, - 0x5794: 0x888A, - 0x5795: 0x888B, - 0x5796: 0x888C, - 0x5797: 0x888D, - 0x5798: 0x888E, - 0x5799: 0x888F, - 0x579A: 0x8890, - 0x579B: 0xB6E2, - 0x579C: 0x8891, - 0x579D: 0x8892, - 0x579E: 0x8893, - 0x579F: 0x8894, - 0x57A0: 0xDBF3, - 0x57A1: 0xDBD2, - 0x57A2: 0xB9B8, - 0x57A3: 0xD4AB, - 0x57A4: 0xDBEC, - 0x57A5: 0x8895, - 0x57A6: 0xBFD1, - 0x57A7: 0xDBF0, - 0x57A8: 0x8896, - 0x57A9: 0xDBD1, - 0x57AA: 0x8897, - 0x57AB: 0xB5E6, - 0x57AC: 0x8898, - 0x57AD: 0xDBEB, - 0x57AE: 0xBFE5, - 0x57AF: 0x8899, - 0x57B0: 0x889A, - 0x57B1: 0x889B, - 0x57B2: 0xDBEE, - 0x57B3: 0x889C, - 0x57B4: 0xDBF1, - 0x57B5: 0x889D, - 0x57B6: 0x889E, - 0x57B7: 0x889F, - 0x57B8: 0xDBF9, - 0x57B9: 0x88A0, - 0x57BA: 0x88A1, - 0x57BB: 0x88A2, - 0x57BC: 0x88A3, - 0x57BD: 0x88A4, - 0x57BE: 0x88A5, - 0x57BF: 0x88A6, - 0x57C0: 0x88A7, - 0x57C1: 0x88A8, - 0x57C2: 0xB9A1, - 0x57C3: 0xB0A3, - 0x57C4: 0x88A9, - 0x57C5: 0x88AA, - 0x57C6: 0x88AB, - 0x57C7: 0x88AC, - 0x57C8: 0x88AD, - 0x57C9: 0x88AE, - 0x57CA: 0x88AF, - 0x57CB: 0xC2F1, - 0x57CC: 0x88B0, - 0x57CD: 0x88B1, - 0x57CE: 0xB3C7, - 0x57CF: 0xDBEF, - 0x57D0: 0x88B2, - 0x57D1: 0x88B3, - 0x57D2: 0xDBF8, - 0x57D3: 0x88B4, - 0x57D4: 0xC6D2, - 0x57D5: 0xDBF4, - 0x57D6: 0x88B5, - 0x57D7: 0x88B6, - 0x57D8: 0xDBF5, - 0x57D9: 0xDBF7, - 0x57DA: 0xDBF6, - 0x57DB: 0x88B7, - 0x57DC: 0x88B8, - 0x57DD: 0xDBFE, - 0x57DE: 0x88B9, - 0x57DF: 0xD3F2, - 0x57E0: 0xB2BA, - 0x57E1: 0x88BA, - 0x57E2: 0x88BB, - 0x57E3: 0x88BC, - 0x57E4: 0xDBFD, - 0x57E5: 0x88BD, - 0x57E6: 0x88BE, - 0x57E7: 0x88BF, - 0x57E8: 0x88C0, - 0x57E9: 0x88C1, - 0x57EA: 0x88C2, - 0x57EB: 0x88C3, - 0x57EC: 0x88C4, - 0x57ED: 0xDCA4, - 0x57EE: 0x88C5, - 0x57EF: 0xDBFB, - 0x57F0: 0x88C6, - 0x57F1: 0x88C7, - 0x57F2: 0x88C8, - 0x57F3: 0x88C9, - 0x57F4: 0xDBFA, - 0x57F5: 0x88CA, - 0x57F6: 0x88CB, - 0x57F7: 0x88CC, - 0x57F8: 0xDBFC, - 0x57F9: 0xC5E0, - 0x57FA: 0xBBF9, - 0x57FB: 0x88CD, - 0x57FC: 0x88CE, - 0x57FD: 0xDCA3, - 0x57FE: 0x88CF, - 0x57FF: 0x88D0, - 0x5800: 0xDCA5, - 0x5801: 0x88D1, - 0x5802: 0xCCC3, - 0x5803: 0x88D2, - 0x5804: 0x88D3, - 0x5805: 0x88D4, - 0x5806: 0xB6D1, - 0x5807: 0xDDC0, - 0x5808: 0x88D5, - 0x5809: 0x88D6, - 0x580A: 0x88D7, - 0x580B: 0xDCA1, - 0x580C: 0x88D8, - 0x580D: 0xDCA2, - 0x580E: 0x88D9, - 0x580F: 0x88DA, - 0x5810: 0x88DB, - 0x5811: 0xC7B5, - 0x5812: 0x88DC, - 0x5813: 0x88DD, - 0x5814: 0x88DE, - 0x5815: 0xB6E9, - 0x5816: 0x88DF, - 0x5817: 0x88E0, - 0x5818: 0x88E1, - 0x5819: 0xDCA7, - 0x581A: 0x88E2, - 0x581B: 0x88E3, - 0x581C: 0x88E4, - 0x581D: 0x88E5, - 0x581E: 0xDCA6, - 0x581F: 0x88E6, - 0x5820: 0xDCA9, - 0x5821: 0xB1A4, - 0x5822: 0x88E7, - 0x5823: 0x88E8, - 0x5824: 0xB5CC, - 0x5825: 0x88E9, - 0x5826: 0x88EA, - 0x5827: 0x88EB, - 0x5828: 0x88EC, - 0x5829: 0x88ED, - 0x582A: 0xBFB0, - 0x582B: 0x88EE, - 0x582C: 0x88EF, - 0x582D: 0x88F0, - 0x582E: 0x88F1, - 0x582F: 0x88F2, - 0x5830: 0xD1DF, - 0x5831: 0x88F3, - 0x5832: 0x88F4, - 0x5833: 0x88F5, - 0x5834: 0x88F6, - 0x5835: 0xB6C2, - 0x5836: 0x88F7, - 0x5837: 0x88F8, - 0x5838: 0x88F9, - 0x5839: 0x88FA, - 0x583A: 0x88FB, - 0x583B: 0x88FC, - 0x583C: 0x88FD, - 0x583D: 0x88FE, - 0x583E: 0x8940, - 0x583F: 0x8941, - 0x5840: 0x8942, - 0x5841: 0x8943, - 0x5842: 0x8944, - 0x5843: 0x8945, - 0x5844: 0xDCA8, - 0x5845: 0x8946, - 0x5846: 0x8947, - 0x5847: 0x8948, - 0x5848: 0x8949, - 0x5849: 0x894A, - 0x584A: 0x894B, - 0x584B: 0x894C, - 0x584C: 0xCBFA, - 0x584D: 0xEBF3, - 0x584E: 0x894D, - 0x584F: 0x894E, - 0x5850: 0x894F, - 0x5851: 0xCBDC, - 0x5852: 0x8950, - 0x5853: 0x8951, - 0x5854: 0xCBFE, - 0x5855: 0x8952, - 0x5856: 0x8953, - 0x5857: 0x8954, - 0x5858: 0xCCC1, - 0x5859: 0x8955, - 0x585A: 0x8956, - 0x585B: 0x8957, - 0x585C: 0x8958, - 0x585D: 0x8959, - 0x585E: 0xC8FB, - 0x585F: 0x895A, - 0x5860: 0x895B, - 0x5861: 0x895C, - 0x5862: 0x895D, - 0x5863: 0x895E, - 0x5864: 0x895F, - 0x5865: 0xDCAA, - 0x5866: 0x8960, - 0x5867: 0x8961, - 0x5868: 0x8962, - 0x5869: 0x8963, - 0x586A: 0x8964, - 0x586B: 0xCCEE, - 0x586C: 0xDCAB, - 0x586D: 0x8965, - 0x586E: 0x8966, - 0x586F: 0x8967, - 0x5870: 0x8968, - 0x5871: 0x8969, - 0x5872: 0x896A, - 0x5873: 0x896B, - 0x5874: 0x896C, - 0x5875: 0x896D, - 0x5876: 0x896E, - 0x5877: 0x896F, - 0x5878: 0x8970, - 0x5879: 0x8971, - 0x587A: 0x8972, - 0x587B: 0x8973, - 0x587C: 0x8974, - 0x587D: 0x8975, - 0x587E: 0xDBD3, - 0x587F: 0x8976, - 0x5880: 0xDCAF, - 0x5881: 0xDCAC, - 0x5882: 0x8977, - 0x5883: 0xBEB3, - 0x5884: 0x8978, - 0x5885: 0xCAFB, - 0x5886: 0x8979, - 0x5887: 0x897A, - 0x5888: 0x897B, - 0x5889: 0xDCAD, - 0x588A: 0x897C, - 0x588B: 0x897D, - 0x588C: 0x897E, - 0x588D: 0x8980, - 0x588E: 0x8981, - 0x588F: 0x8982, - 0x5890: 0x8983, - 0x5891: 0x8984, - 0x5892: 0xC9CA, - 0x5893: 0xC4B9, - 0x5894: 0x8985, - 0x5895: 0x8986, - 0x5896: 0x8987, - 0x5897: 0x8988, - 0x5898: 0x8989, - 0x5899: 0xC7BD, - 0x589A: 0xDCAE, - 0x589B: 0x898A, - 0x589C: 0x898B, - 0x589D: 0x898C, - 0x589E: 0xD4F6, - 0x589F: 0xD0E6, - 0x58A0: 0x898D, - 0x58A1: 0x898E, - 0x58A2: 0x898F, - 0x58A3: 0x8990, - 0x58A4: 0x8991, - 0x58A5: 0x8992, - 0x58A6: 0x8993, - 0x58A7: 0x8994, - 0x58A8: 0xC4AB, - 0x58A9: 0xB6D5, - 0x58AA: 0x8995, - 0x58AB: 0x8996, - 0x58AC: 0x8997, - 0x58AD: 0x8998, - 0x58AE: 0x8999, - 0x58AF: 0x899A, - 0x58B0: 0x899B, - 0x58B1: 0x899C, - 0x58B2: 0x899D, - 0x58B3: 0x899E, - 0x58B4: 0x899F, - 0x58B5: 0x89A0, - 0x58B6: 0x89A1, - 0x58B7: 0x89A2, - 0x58B8: 0x89A3, - 0x58B9: 0x89A4, - 0x58BA: 0x89A5, - 0x58BB: 0x89A6, - 0x58BC: 0xDBD4, - 0x58BD: 0x89A7, - 0x58BE: 0x89A8, - 0x58BF: 0x89A9, - 0x58C0: 0x89AA, - 0x58C1: 0xB1DA, - 0x58C2: 0x89AB, - 0x58C3: 0x89AC, - 0x58C4: 0x89AD, - 0x58C5: 0xDBD5, - 0x58C6: 0x89AE, - 0x58C7: 0x89AF, - 0x58C8: 0x89B0, - 0x58C9: 0x89B1, - 0x58CA: 0x89B2, - 0x58CB: 0x89B3, - 0x58CC: 0x89B4, - 0x58CD: 0x89B5, - 0x58CE: 0x89B6, - 0x58CF: 0x89B7, - 0x58D0: 0x89B8, - 0x58D1: 0xDBD6, - 0x58D2: 0x89B9, - 0x58D3: 0x89BA, - 0x58D4: 0x89BB, - 0x58D5: 0xBABE, - 0x58D6: 0x89BC, - 0x58D7: 0x89BD, - 0x58D8: 0x89BE, - 0x58D9: 0x89BF, - 0x58DA: 0x89C0, - 0x58DB: 0x89C1, - 0x58DC: 0x89C2, - 0x58DD: 0x89C3, - 0x58DE: 0x89C4, - 0x58DF: 0x89C5, - 0x58E0: 0x89C6, - 0x58E1: 0x89C7, - 0x58E2: 0x89C8, - 0x58E3: 0x89C9, - 0x58E4: 0xC8C0, - 0x58E5: 0x89CA, - 0x58E6: 0x89CB, - 0x58E7: 0x89CC, - 0x58E8: 0x89CD, - 0x58E9: 0x89CE, - 0x58EA: 0x89CF, - 0x58EB: 0xCABF, - 0x58EC: 0xC8C9, - 0x58ED: 0x89D0, - 0x58EE: 0xD7B3, - 0x58EF: 0x89D1, - 0x58F0: 0xC9F9, - 0x58F1: 0x89D2, - 0x58F2: 0x89D3, - 0x58F3: 0xBFC7, - 0x58F4: 0x89D4, - 0x58F5: 0x89D5, - 0x58F6: 0xBAF8, - 0x58F7: 0x89D6, - 0x58F8: 0x89D7, - 0x58F9: 0xD2BC, - 0x58FA: 0x89D8, - 0x58FB: 0x89D9, - 0x58FC: 0x89DA, - 0x58FD: 0x89DB, - 0x58FE: 0x89DC, - 0x58FF: 0x89DD, - 0x5900: 0x89DE, - 0x5901: 0x89DF, - 0x5902: 0xE2BA, - 0x5903: 0x89E0, - 0x5904: 0xB4A6, - 0x5905: 0x89E1, - 0x5906: 0x89E2, - 0x5907: 0xB1B8, - 0x5908: 0x89E3, - 0x5909: 0x89E4, - 0x590A: 0x89E5, - 0x590B: 0x89E6, - 0x590C: 0x89E7, - 0x590D: 0xB8B4, - 0x590E: 0x89E8, - 0x590F: 0xCFC4, - 0x5910: 0x89E9, - 0x5911: 0x89EA, - 0x5912: 0x89EB, - 0x5913: 0x89EC, - 0x5914: 0xD9E7, - 0x5915: 0xCFA6, - 0x5916: 0xCDE2, - 0x5917: 0x89ED, - 0x5918: 0x89EE, - 0x5919: 0xD9ED, - 0x591A: 0xB6E0, - 0x591B: 0x89EF, - 0x591C: 0xD2B9, - 0x591D: 0x89F0, - 0x591E: 0x89F1, - 0x591F: 0xB9BB, - 0x5920: 0x89F2, - 0x5921: 0x89F3, - 0x5922: 0x89F4, - 0x5923: 0x89F5, - 0x5924: 0xE2B9, - 0x5925: 0xE2B7, - 0x5926: 0x89F6, - 0x5927: 0xB4F3, - 0x5928: 0x89F7, - 0x5929: 0xCCEC, - 0x592A: 0xCCAB, - 0x592B: 0xB7F2, - 0x592C: 0x89F8, - 0x592D: 0xD8B2, - 0x592E: 0xD1EB, - 0x592F: 0xBABB, - 0x5930: 0x89F9, - 0x5931: 0xCAA7, - 0x5932: 0x89FA, - 0x5933: 0x89FB, - 0x5934: 0xCDB7, - 0x5935: 0x89FC, - 0x5936: 0x89FD, - 0x5937: 0xD2C4, - 0x5938: 0xBFE4, - 0x5939: 0xBCD0, - 0x593A: 0xB6E1, - 0x593B: 0x89FE, - 0x593C: 0xDEC5, - 0x593D: 0x8A40, - 0x593E: 0x8A41, - 0x593F: 0x8A42, - 0x5940: 0x8A43, - 0x5941: 0xDEC6, - 0x5942: 0xDBBC, - 0x5943: 0x8A44, - 0x5944: 0xD1D9, - 0x5945: 0x8A45, - 0x5946: 0x8A46, - 0x5947: 0xC6E6, - 0x5948: 0xC4CE, - 0x5949: 0xB7EE, - 0x594A: 0x8A47, - 0x594B: 0xB7DC, - 0x594C: 0x8A48, - 0x594D: 0x8A49, - 0x594E: 0xBFFC, - 0x594F: 0xD7E0, - 0x5950: 0x8A4A, - 0x5951: 0xC6F5, - 0x5952: 0x8A4B, - 0x5953: 0x8A4C, - 0x5954: 0xB1BC, - 0x5955: 0xDEC8, - 0x5956: 0xBDB1, - 0x5957: 0xCCD7, - 0x5958: 0xDECA, - 0x5959: 0x8A4D, - 0x595A: 0xDEC9, - 0x595B: 0x8A4E, - 0x595C: 0x8A4F, - 0x595D: 0x8A50, - 0x595E: 0x8A51, - 0x595F: 0x8A52, - 0x5960: 0xB5EC, - 0x5961: 0x8A53, - 0x5962: 0xC9DD, - 0x5963: 0x8A54, - 0x5964: 0x8A55, - 0x5965: 0xB0C2, - 0x5966: 0x8A56, - 0x5967: 0x8A57, - 0x5968: 0x8A58, - 0x5969: 0x8A59, - 0x596A: 0x8A5A, - 0x596B: 0x8A5B, - 0x596C: 0x8A5C, - 0x596D: 0x8A5D, - 0x596E: 0x8A5E, - 0x596F: 0x8A5F, - 0x5970: 0x8A60, - 0x5971: 0x8A61, - 0x5972: 0x8A62, - 0x5973: 0xC5AE, - 0x5974: 0xC5AB, - 0x5975: 0x8A63, - 0x5976: 0xC4CC, - 0x5977: 0x8A64, - 0x5978: 0xBCE9, - 0x5979: 0xCBFD, - 0x597A: 0x8A65, - 0x597B: 0x8A66, - 0x597C: 0x8A67, - 0x597D: 0xBAC3, - 0x597E: 0x8A68, - 0x597F: 0x8A69, - 0x5980: 0x8A6A, - 0x5981: 0xE5F9, - 0x5982: 0xC8E7, - 0x5983: 0xE5FA, - 0x5984: 0xCDFD, - 0x5985: 0x8A6B, - 0x5986: 0xD7B1, - 0x5987: 0xB8BE, - 0x5988: 0xC2E8, - 0x5989: 0x8A6C, - 0x598A: 0xC8D1, - 0x598B: 0x8A6D, - 0x598C: 0x8A6E, - 0x598D: 0xE5FB, - 0x598E: 0x8A6F, - 0x598F: 0x8A70, - 0x5990: 0x8A71, - 0x5991: 0x8A72, - 0x5992: 0xB6CA, - 0x5993: 0xBCCB, - 0x5994: 0x8A73, - 0x5995: 0x8A74, - 0x5996: 0xD1FD, - 0x5997: 0xE6A1, - 0x5998: 0x8A75, - 0x5999: 0xC3EE, - 0x599A: 0x8A76, - 0x599B: 0x8A77, - 0x599C: 0x8A78, - 0x599D: 0x8A79, - 0x599E: 0xE6A4, - 0x599F: 0x8A7A, - 0x59A0: 0x8A7B, - 0x59A1: 0x8A7C, - 0x59A2: 0x8A7D, - 0x59A3: 0xE5FE, - 0x59A4: 0xE6A5, - 0x59A5: 0xCDD7, - 0x59A6: 0x8A7E, - 0x59A7: 0x8A80, - 0x59A8: 0xB7C1, - 0x59A9: 0xE5FC, - 0x59AA: 0xE5FD, - 0x59AB: 0xE6A3, - 0x59AC: 0x8A81, - 0x59AD: 0x8A82, - 0x59AE: 0xC4DD, - 0x59AF: 0xE6A8, - 0x59B0: 0x8A83, - 0x59B1: 0x8A84, - 0x59B2: 0xE6A7, - 0x59B3: 0x8A85, - 0x59B4: 0x8A86, - 0x59B5: 0x8A87, - 0x59B6: 0x8A88, - 0x59B7: 0x8A89, - 0x59B8: 0x8A8A, - 0x59B9: 0xC3C3, - 0x59BA: 0x8A8B, - 0x59BB: 0xC6DE, - 0x59BC: 0x8A8C, - 0x59BD: 0x8A8D, - 0x59BE: 0xE6AA, - 0x59BF: 0x8A8E, - 0x59C0: 0x8A8F, - 0x59C1: 0x8A90, - 0x59C2: 0x8A91, - 0x59C3: 0x8A92, - 0x59C4: 0x8A93, - 0x59C5: 0x8A94, - 0x59C6: 0xC4B7, - 0x59C7: 0x8A95, - 0x59C8: 0x8A96, - 0x59C9: 0x8A97, - 0x59CA: 0xE6A2, - 0x59CB: 0xCABC, - 0x59CC: 0x8A98, - 0x59CD: 0x8A99, - 0x59CE: 0x8A9A, - 0x59CF: 0x8A9B, - 0x59D0: 0xBDE3, - 0x59D1: 0xB9C3, - 0x59D2: 0xE6A6, - 0x59D3: 0xD0D5, - 0x59D4: 0xCEAF, - 0x59D5: 0x8A9C, - 0x59D6: 0x8A9D, - 0x59D7: 0xE6A9, - 0x59D8: 0xE6B0, - 0x59D9: 0x8A9E, - 0x59DA: 0xD2A6, - 0x59DB: 0x8A9F, - 0x59DC: 0xBDAA, - 0x59DD: 0xE6AD, - 0x59DE: 0x8AA0, - 0x59DF: 0x8AA1, - 0x59E0: 0x8AA2, - 0x59E1: 0x8AA3, - 0x59E2: 0x8AA4, - 0x59E3: 0xE6AF, - 0x59E4: 0x8AA5, - 0x59E5: 0xC0D1, - 0x59E6: 0x8AA6, - 0x59E7: 0x8AA7, - 0x59E8: 0xD2CC, - 0x59E9: 0x8AA8, - 0x59EA: 0x8AA9, - 0x59EB: 0x8AAA, - 0x59EC: 0xBCA7, - 0x59ED: 0x8AAB, - 0x59EE: 0x8AAC, - 0x59EF: 0x8AAD, - 0x59F0: 0x8AAE, - 0x59F1: 0x8AAF, - 0x59F2: 0x8AB0, - 0x59F3: 0x8AB1, - 0x59F4: 0x8AB2, - 0x59F5: 0x8AB3, - 0x59F6: 0x8AB4, - 0x59F7: 0x8AB5, - 0x59F8: 0x8AB6, - 0x59F9: 0xE6B1, - 0x59FA: 0x8AB7, - 0x59FB: 0xD2F6, - 0x59FC: 0x8AB8, - 0x59FD: 0x8AB9, - 0x59FE: 0x8ABA, - 0x59FF: 0xD7CB, - 0x5A00: 0x8ABB, - 0x5A01: 0xCDFE, - 0x5A02: 0x8ABC, - 0x5A03: 0xCDDE, - 0x5A04: 0xC2A6, - 0x5A05: 0xE6AB, - 0x5A06: 0xE6AC, - 0x5A07: 0xBDBF, - 0x5A08: 0xE6AE, - 0x5A09: 0xE6B3, - 0x5A0A: 0x8ABD, - 0x5A0B: 0x8ABE, - 0x5A0C: 0xE6B2, - 0x5A0D: 0x8ABF, - 0x5A0E: 0x8AC0, - 0x5A0F: 0x8AC1, - 0x5A10: 0x8AC2, - 0x5A11: 0xE6B6, - 0x5A12: 0x8AC3, - 0x5A13: 0xE6B8, - 0x5A14: 0x8AC4, - 0x5A15: 0x8AC5, - 0x5A16: 0x8AC6, - 0x5A17: 0x8AC7, - 0x5A18: 0xC4EF, - 0x5A19: 0x8AC8, - 0x5A1A: 0x8AC9, - 0x5A1B: 0x8ACA, - 0x5A1C: 0xC4C8, - 0x5A1D: 0x8ACB, - 0x5A1E: 0x8ACC, - 0x5A1F: 0xBEEA, - 0x5A20: 0xC9EF, - 0x5A21: 0x8ACD, - 0x5A22: 0x8ACE, - 0x5A23: 0xE6B7, - 0x5A24: 0x8ACF, - 0x5A25: 0xB6F0, - 0x5A26: 0x8AD0, - 0x5A27: 0x8AD1, - 0x5A28: 0x8AD2, - 0x5A29: 0xC3E4, - 0x5A2A: 0x8AD3, - 0x5A2B: 0x8AD4, - 0x5A2C: 0x8AD5, - 0x5A2D: 0x8AD6, - 0x5A2E: 0x8AD7, - 0x5A2F: 0x8AD8, - 0x5A30: 0x8AD9, - 0x5A31: 0xD3E9, - 0x5A32: 0xE6B4, - 0x5A33: 0x8ADA, - 0x5A34: 0xE6B5, - 0x5A35: 0x8ADB, - 0x5A36: 0xC8A2, - 0x5A37: 0x8ADC, - 0x5A38: 0x8ADD, - 0x5A39: 0x8ADE, - 0x5A3A: 0x8ADF, - 0x5A3B: 0x8AE0, - 0x5A3C: 0xE6BD, - 0x5A3D: 0x8AE1, - 0x5A3E: 0x8AE2, - 0x5A3F: 0x8AE3, - 0x5A40: 0xE6B9, - 0x5A41: 0x8AE4, - 0x5A42: 0x8AE5, - 0x5A43: 0x8AE6, - 0x5A44: 0x8AE7, - 0x5A45: 0x8AE8, - 0x5A46: 0xC6C5, - 0x5A47: 0x8AE9, - 0x5A48: 0x8AEA, - 0x5A49: 0xCDF1, - 0x5A4A: 0xE6BB, - 0x5A4B: 0x8AEB, - 0x5A4C: 0x8AEC, - 0x5A4D: 0x8AED, - 0x5A4E: 0x8AEE, - 0x5A4F: 0x8AEF, - 0x5A50: 0x8AF0, - 0x5A51: 0x8AF1, - 0x5A52: 0x8AF2, - 0x5A53: 0x8AF3, - 0x5A54: 0x8AF4, - 0x5A55: 0xE6BC, - 0x5A56: 0x8AF5, - 0x5A57: 0x8AF6, - 0x5A58: 0x8AF7, - 0x5A59: 0x8AF8, - 0x5A5A: 0xBBE9, - 0x5A5B: 0x8AF9, - 0x5A5C: 0x8AFA, - 0x5A5D: 0x8AFB, - 0x5A5E: 0x8AFC, - 0x5A5F: 0x8AFD, - 0x5A60: 0x8AFE, - 0x5A61: 0x8B40, - 0x5A62: 0xE6BE, - 0x5A63: 0x8B41, - 0x5A64: 0x8B42, - 0x5A65: 0x8B43, - 0x5A66: 0x8B44, - 0x5A67: 0xE6BA, - 0x5A68: 0x8B45, - 0x5A69: 0x8B46, - 0x5A6A: 0xC0B7, - 0x5A6B: 0x8B47, - 0x5A6C: 0x8B48, - 0x5A6D: 0x8B49, - 0x5A6E: 0x8B4A, - 0x5A6F: 0x8B4B, - 0x5A70: 0x8B4C, - 0x5A71: 0x8B4D, - 0x5A72: 0x8B4E, - 0x5A73: 0x8B4F, - 0x5A74: 0xD3A4, - 0x5A75: 0xE6BF, - 0x5A76: 0xC9F4, - 0x5A77: 0xE6C3, - 0x5A78: 0x8B50, - 0x5A79: 0x8B51, - 0x5A7A: 0xE6C4, - 0x5A7B: 0x8B52, - 0x5A7C: 0x8B53, - 0x5A7D: 0x8B54, - 0x5A7E: 0x8B55, - 0x5A7F: 0xD0F6, - 0x5A80: 0x8B56, - 0x5A81: 0x8B57, - 0x5A82: 0x8B58, - 0x5A83: 0x8B59, - 0x5A84: 0x8B5A, - 0x5A85: 0x8B5B, - 0x5A86: 0x8B5C, - 0x5A87: 0x8B5D, - 0x5A88: 0x8B5E, - 0x5A89: 0x8B5F, - 0x5A8A: 0x8B60, - 0x5A8B: 0x8B61, - 0x5A8C: 0x8B62, - 0x5A8D: 0x8B63, - 0x5A8E: 0x8B64, - 0x5A8F: 0x8B65, - 0x5A90: 0x8B66, - 0x5A91: 0x8B67, - 0x5A92: 0xC3BD, - 0x5A93: 0x8B68, - 0x5A94: 0x8B69, - 0x5A95: 0x8B6A, - 0x5A96: 0x8B6B, - 0x5A97: 0x8B6C, - 0x5A98: 0x8B6D, - 0x5A99: 0x8B6E, - 0x5A9A: 0xC3C4, - 0x5A9B: 0xE6C2, - 0x5A9C: 0x8B6F, - 0x5A9D: 0x8B70, - 0x5A9E: 0x8B71, - 0x5A9F: 0x8B72, - 0x5AA0: 0x8B73, - 0x5AA1: 0x8B74, - 0x5AA2: 0x8B75, - 0x5AA3: 0x8B76, - 0x5AA4: 0x8B77, - 0x5AA5: 0x8B78, - 0x5AA6: 0x8B79, - 0x5AA7: 0x8B7A, - 0x5AA8: 0x8B7B, - 0x5AA9: 0x8B7C, - 0x5AAA: 0xE6C1, - 0x5AAB: 0x8B7D, - 0x5AAC: 0x8B7E, - 0x5AAD: 0x8B80, - 0x5AAE: 0x8B81, - 0x5AAF: 0x8B82, - 0x5AB0: 0x8B83, - 0x5AB1: 0x8B84, - 0x5AB2: 0xE6C7, - 0x5AB3: 0xCFB1, - 0x5AB4: 0x8B85, - 0x5AB5: 0xEBF4, - 0x5AB6: 0x8B86, - 0x5AB7: 0x8B87, - 0x5AB8: 0xE6CA, - 0x5AB9: 0x8B88, - 0x5ABA: 0x8B89, - 0x5ABB: 0x8B8A, - 0x5ABC: 0x8B8B, - 0x5ABD: 0x8B8C, - 0x5ABE: 0xE6C5, - 0x5ABF: 0x8B8D, - 0x5AC0: 0x8B8E, - 0x5AC1: 0xBCDE, - 0x5AC2: 0xC9A9, - 0x5AC3: 0x8B8F, - 0x5AC4: 0x8B90, - 0x5AC5: 0x8B91, - 0x5AC6: 0x8B92, - 0x5AC7: 0x8B93, - 0x5AC8: 0x8B94, - 0x5AC9: 0xBCB5, - 0x5ACA: 0x8B95, - 0x5ACB: 0x8B96, - 0x5ACC: 0xCFD3, - 0x5ACD: 0x8B97, - 0x5ACE: 0x8B98, - 0x5ACF: 0x8B99, - 0x5AD0: 0x8B9A, - 0x5AD1: 0x8B9B, - 0x5AD2: 0xE6C8, - 0x5AD3: 0x8B9C, - 0x5AD4: 0xE6C9, - 0x5AD5: 0x8B9D, - 0x5AD6: 0xE6CE, - 0x5AD7: 0x8B9E, - 0x5AD8: 0xE6D0, - 0x5AD9: 0x8B9F, - 0x5ADA: 0x8BA0, - 0x5ADB: 0x8BA1, - 0x5ADC: 0xE6D1, - 0x5ADD: 0x8BA2, - 0x5ADE: 0x8BA3, - 0x5ADF: 0x8BA4, - 0x5AE0: 0xE6CB, - 0x5AE1: 0xB5D5, - 0x5AE2: 0x8BA5, - 0x5AE3: 0xE6CC, - 0x5AE4: 0x8BA6, - 0x5AE5: 0x8BA7, - 0x5AE6: 0xE6CF, - 0x5AE7: 0x8BA8, - 0x5AE8: 0x8BA9, - 0x5AE9: 0xC4DB, - 0x5AEA: 0x8BAA, - 0x5AEB: 0xE6C6, - 0x5AEC: 0x8BAB, - 0x5AED: 0x8BAC, - 0x5AEE: 0x8BAD, - 0x5AEF: 0x8BAE, - 0x5AF0: 0x8BAF, - 0x5AF1: 0xE6CD, - 0x5AF2: 0x8BB0, - 0x5AF3: 0x8BB1, - 0x5AF4: 0x8BB2, - 0x5AF5: 0x8BB3, - 0x5AF6: 0x8BB4, - 0x5AF7: 0x8BB5, - 0x5AF8: 0x8BB6, - 0x5AF9: 0x8BB7, - 0x5AFA: 0x8BB8, - 0x5AFB: 0x8BB9, - 0x5AFC: 0x8BBA, - 0x5AFD: 0x8BBB, - 0x5AFE: 0x8BBC, - 0x5AFF: 0x8BBD, - 0x5B00: 0x8BBE, - 0x5B01: 0x8BBF, - 0x5B02: 0x8BC0, - 0x5B03: 0x8BC1, - 0x5B04: 0x8BC2, - 0x5B05: 0x8BC3, - 0x5B06: 0x8BC4, - 0x5B07: 0x8BC5, - 0x5B08: 0x8BC6, - 0x5B09: 0xE6D2, - 0x5B0A: 0x8BC7, - 0x5B0B: 0x8BC8, - 0x5B0C: 0x8BC9, - 0x5B0D: 0x8BCA, - 0x5B0E: 0x8BCB, - 0x5B0F: 0x8BCC, - 0x5B10: 0x8BCD, - 0x5B11: 0x8BCE, - 0x5B12: 0x8BCF, - 0x5B13: 0x8BD0, - 0x5B14: 0x8BD1, - 0x5B15: 0x8BD2, - 0x5B16: 0xE6D4, - 0x5B17: 0xE6D3, - 0x5B18: 0x8BD3, - 0x5B19: 0x8BD4, - 0x5B1A: 0x8BD5, - 0x5B1B: 0x8BD6, - 0x5B1C: 0x8BD7, - 0x5B1D: 0x8BD8, - 0x5B1E: 0x8BD9, - 0x5B1F: 0x8BDA, - 0x5B20: 0x8BDB, - 0x5B21: 0x8BDC, - 0x5B22: 0x8BDD, - 0x5B23: 0x8BDE, - 0x5B24: 0x8BDF, - 0x5B25: 0x8BE0, - 0x5B26: 0x8BE1, - 0x5B27: 0x8BE2, - 0x5B28: 0x8BE3, - 0x5B29: 0x8BE4, - 0x5B2A: 0x8BE5, - 0x5B2B: 0x8BE6, - 0x5B2C: 0x8BE7, - 0x5B2D: 0x8BE8, - 0x5B2E: 0x8BE9, - 0x5B2F: 0x8BEA, - 0x5B30: 0x8BEB, - 0x5B31: 0x8BEC, - 0x5B32: 0xE6D5, - 0x5B33: 0x8BED, - 0x5B34: 0xD9F8, - 0x5B35: 0x8BEE, - 0x5B36: 0x8BEF, - 0x5B37: 0xE6D6, - 0x5B38: 0x8BF0, - 0x5B39: 0x8BF1, - 0x5B3A: 0x8BF2, - 0x5B3B: 0x8BF3, - 0x5B3C: 0x8BF4, - 0x5B3D: 0x8BF5, - 0x5B3E: 0x8BF6, - 0x5B3F: 0x8BF7, - 0x5B40: 0xE6D7, - 0x5B41: 0x8BF8, - 0x5B42: 0x8BF9, - 0x5B43: 0x8BFA, - 0x5B44: 0x8BFB, - 0x5B45: 0x8BFC, - 0x5B46: 0x8BFD, - 0x5B47: 0x8BFE, - 0x5B48: 0x8C40, - 0x5B49: 0x8C41, - 0x5B4A: 0x8C42, - 0x5B4B: 0x8C43, - 0x5B4C: 0x8C44, - 0x5B4D: 0x8C45, - 0x5B4E: 0x8C46, - 0x5B4F: 0x8C47, - 0x5B50: 0xD7D3, - 0x5B51: 0xE6DD, - 0x5B52: 0x8C48, - 0x5B53: 0xE6DE, - 0x5B54: 0xBFD7, - 0x5B55: 0xD4D0, - 0x5B56: 0x8C49, - 0x5B57: 0xD7D6, - 0x5B58: 0xB4E6, - 0x5B59: 0xCBEF, - 0x5B5A: 0xE6DA, - 0x5B5B: 0xD8C3, - 0x5B5C: 0xD7CE, - 0x5B5D: 0xD0A2, - 0x5B5E: 0x8C4A, - 0x5B5F: 0xC3CF, - 0x5B60: 0x8C4B, - 0x5B61: 0x8C4C, - 0x5B62: 0xE6DF, - 0x5B63: 0xBCBE, - 0x5B64: 0xB9C2, - 0x5B65: 0xE6DB, - 0x5B66: 0xD1A7, - 0x5B67: 0x8C4D, - 0x5B68: 0x8C4E, - 0x5B69: 0xBAA2, - 0x5B6A: 0xC2CF, - 0x5B6B: 0x8C4F, - 0x5B6C: 0xD8AB, - 0x5B6D: 0x8C50, - 0x5B6E: 0x8C51, - 0x5B6F: 0x8C52, - 0x5B70: 0xCAEB, - 0x5B71: 0xE5EE, - 0x5B72: 0x8C53, - 0x5B73: 0xE6DC, - 0x5B74: 0x8C54, - 0x5B75: 0xB7F5, - 0x5B76: 0x8C55, - 0x5B77: 0x8C56, - 0x5B78: 0x8C57, - 0x5B79: 0x8C58, - 0x5B7A: 0xC8E6, - 0x5B7B: 0x8C59, - 0x5B7C: 0x8C5A, - 0x5B7D: 0xC4F5, - 0x5B7E: 0x8C5B, - 0x5B7F: 0x8C5C, - 0x5B80: 0xE5B2, - 0x5B81: 0xC4FE, - 0x5B82: 0x8C5D, - 0x5B83: 0xCBFC, - 0x5B84: 0xE5B3, - 0x5B85: 0xD5AC, - 0x5B86: 0x8C5E, - 0x5B87: 0xD3EE, - 0x5B88: 0xCAD8, - 0x5B89: 0xB0B2, - 0x5B8A: 0x8C5F, - 0x5B8B: 0xCBCE, - 0x5B8C: 0xCDEA, - 0x5B8D: 0x8C60, - 0x5B8E: 0x8C61, - 0x5B8F: 0xBAEA, - 0x5B90: 0x8C62, - 0x5B91: 0x8C63, - 0x5B92: 0x8C64, - 0x5B93: 0xE5B5, - 0x5B94: 0x8C65, - 0x5B95: 0xE5B4, - 0x5B96: 0x8C66, - 0x5B97: 0xD7DA, - 0x5B98: 0xB9D9, - 0x5B99: 0xD6E6, - 0x5B9A: 0xB6A8, - 0x5B9B: 0xCDF0, - 0x5B9C: 0xD2CB, - 0x5B9D: 0xB1A6, - 0x5B9E: 0xCAB5, - 0x5B9F: 0x8C67, - 0x5BA0: 0xB3E8, - 0x5BA1: 0xC9F3, - 0x5BA2: 0xBFCD, - 0x5BA3: 0xD0FB, - 0x5BA4: 0xCAD2, - 0x5BA5: 0xE5B6, - 0x5BA6: 0xBBC2, - 0x5BA7: 0x8C68, - 0x5BA8: 0x8C69, - 0x5BA9: 0x8C6A, - 0x5BAA: 0xCFDC, - 0x5BAB: 0xB9AC, - 0x5BAC: 0x8C6B, - 0x5BAD: 0x8C6C, - 0x5BAE: 0x8C6D, - 0x5BAF: 0x8C6E, - 0x5BB0: 0xD4D7, - 0x5BB1: 0x8C6F, - 0x5BB2: 0x8C70, - 0x5BB3: 0xBAA6, - 0x5BB4: 0xD1E7, - 0x5BB5: 0xCFFC, - 0x5BB6: 0xBCD2, - 0x5BB7: 0x8C71, - 0x5BB8: 0xE5B7, - 0x5BB9: 0xC8DD, - 0x5BBA: 0x8C72, - 0x5BBB: 0x8C73, - 0x5BBC: 0x8C74, - 0x5BBD: 0xBFED, - 0x5BBE: 0xB1F6, - 0x5BBF: 0xCBDE, - 0x5BC0: 0x8C75, - 0x5BC1: 0x8C76, - 0x5BC2: 0xBCC5, - 0x5BC3: 0x8C77, - 0x5BC4: 0xBCC4, - 0x5BC5: 0xD2FA, - 0x5BC6: 0xC3DC, - 0x5BC7: 0xBFDC, - 0x5BC8: 0x8C78, - 0x5BC9: 0x8C79, - 0x5BCA: 0x8C7A, - 0x5BCB: 0x8C7B, - 0x5BCC: 0xB8BB, - 0x5BCD: 0x8C7C, - 0x5BCE: 0x8C7D, - 0x5BCF: 0x8C7E, - 0x5BD0: 0xC3C2, - 0x5BD1: 0x8C80, - 0x5BD2: 0xBAAE, - 0x5BD3: 0xD4A2, - 0x5BD4: 0x8C81, - 0x5BD5: 0x8C82, - 0x5BD6: 0x8C83, - 0x5BD7: 0x8C84, - 0x5BD8: 0x8C85, - 0x5BD9: 0x8C86, - 0x5BDA: 0x8C87, - 0x5BDB: 0x8C88, - 0x5BDC: 0x8C89, - 0x5BDD: 0xC7DE, - 0x5BDE: 0xC4AF, - 0x5BDF: 0xB2EC, - 0x5BE0: 0x8C8A, - 0x5BE1: 0xB9D1, - 0x5BE2: 0x8C8B, - 0x5BE3: 0x8C8C, - 0x5BE4: 0xE5BB, - 0x5BE5: 0xC1C8, - 0x5BE6: 0x8C8D, - 0x5BE7: 0x8C8E, - 0x5BE8: 0xD5AF, - 0x5BE9: 0x8C8F, - 0x5BEA: 0x8C90, - 0x5BEB: 0x8C91, - 0x5BEC: 0x8C92, - 0x5BED: 0x8C93, - 0x5BEE: 0xE5BC, - 0x5BEF: 0x8C94, - 0x5BF0: 0xE5BE, - 0x5BF1: 0x8C95, - 0x5BF2: 0x8C96, - 0x5BF3: 0x8C97, - 0x5BF4: 0x8C98, - 0x5BF5: 0x8C99, - 0x5BF6: 0x8C9A, - 0x5BF7: 0x8C9B, - 0x5BF8: 0xB4E7, - 0x5BF9: 0xB6D4, - 0x5BFA: 0xCBC2, - 0x5BFB: 0xD1B0, - 0x5BFC: 0xB5BC, - 0x5BFD: 0x8C9C, - 0x5BFE: 0x8C9D, - 0x5BFF: 0xCAD9, - 0x5C00: 0x8C9E, - 0x5C01: 0xB7E2, - 0x5C02: 0x8C9F, - 0x5C03: 0x8CA0, - 0x5C04: 0xC9E4, - 0x5C05: 0x8CA1, - 0x5C06: 0xBDAB, - 0x5C07: 0x8CA2, - 0x5C08: 0x8CA3, - 0x5C09: 0xCEBE, - 0x5C0A: 0xD7F0, - 0x5C0B: 0x8CA4, - 0x5C0C: 0x8CA5, - 0x5C0D: 0x8CA6, - 0x5C0E: 0x8CA7, - 0x5C0F: 0xD0A1, - 0x5C10: 0x8CA8, - 0x5C11: 0xC9D9, - 0x5C12: 0x8CA9, - 0x5C13: 0x8CAA, - 0x5C14: 0xB6FB, - 0x5C15: 0xE6D8, - 0x5C16: 0xBCE2, - 0x5C17: 0x8CAB, - 0x5C18: 0xB3BE, - 0x5C19: 0x8CAC, - 0x5C1A: 0xC9D0, - 0x5C1B: 0x8CAD, - 0x5C1C: 0xE6D9, - 0x5C1D: 0xB3A2, - 0x5C1E: 0x8CAE, - 0x5C1F: 0x8CAF, - 0x5C20: 0x8CB0, - 0x5C21: 0x8CB1, - 0x5C22: 0xDECC, - 0x5C23: 0x8CB2, - 0x5C24: 0xD3C8, - 0x5C25: 0xDECD, - 0x5C26: 0x8CB3, - 0x5C27: 0xD2A2, - 0x5C28: 0x8CB4, - 0x5C29: 0x8CB5, - 0x5C2A: 0x8CB6, - 0x5C2B: 0x8CB7, - 0x5C2C: 0xDECE, - 0x5C2D: 0x8CB8, - 0x5C2E: 0x8CB9, - 0x5C2F: 0x8CBA, - 0x5C30: 0x8CBB, - 0x5C31: 0xBECD, - 0x5C32: 0x8CBC, - 0x5C33: 0x8CBD, - 0x5C34: 0xDECF, - 0x5C35: 0x8CBE, - 0x5C36: 0x8CBF, - 0x5C37: 0x8CC0, - 0x5C38: 0xCAAC, - 0x5C39: 0xD2FC, - 0x5C3A: 0xB3DF, - 0x5C3B: 0xE5EA, - 0x5C3C: 0xC4E1, - 0x5C3D: 0xBEA1, - 0x5C3E: 0xCEB2, - 0x5C3F: 0xC4F2, - 0x5C40: 0xBED6, - 0x5C41: 0xC6A8, - 0x5C42: 0xB2E3, - 0x5C43: 0x8CC1, - 0x5C44: 0x8CC2, - 0x5C45: 0xBED3, - 0x5C46: 0x8CC3, - 0x5C47: 0x8CC4, - 0x5C48: 0xC7FC, - 0x5C49: 0xCCEB, - 0x5C4A: 0xBDEC, - 0x5C4B: 0xCEDD, - 0x5C4C: 0x8CC5, - 0x5C4D: 0x8CC6, - 0x5C4E: 0xCABA, - 0x5C4F: 0xC6C1, - 0x5C50: 0xE5EC, - 0x5C51: 0xD0BC, - 0x5C52: 0x8CC7, - 0x5C53: 0x8CC8, - 0x5C54: 0x8CC9, - 0x5C55: 0xD5B9, - 0x5C56: 0x8CCA, - 0x5C57: 0x8CCB, - 0x5C58: 0x8CCC, - 0x5C59: 0xE5ED, - 0x5C5A: 0x8CCD, - 0x5C5B: 0x8CCE, - 0x5C5C: 0x8CCF, - 0x5C5D: 0x8CD0, - 0x5C5E: 0xCAF4, - 0x5C5F: 0x8CD1, - 0x5C60: 0xCDC0, - 0x5C61: 0xC2C5, - 0x5C62: 0x8CD2, - 0x5C63: 0xE5EF, - 0x5C64: 0x8CD3, - 0x5C65: 0xC2C4, - 0x5C66: 0xE5F0, - 0x5C67: 0x8CD4, - 0x5C68: 0x8CD5, - 0x5C69: 0x8CD6, - 0x5C6A: 0x8CD7, - 0x5C6B: 0x8CD8, - 0x5C6C: 0x8CD9, - 0x5C6D: 0x8CDA, - 0x5C6E: 0xE5F8, - 0x5C6F: 0xCDCD, - 0x5C70: 0x8CDB, - 0x5C71: 0xC9BD, - 0x5C72: 0x8CDC, - 0x5C73: 0x8CDD, - 0x5C74: 0x8CDE, - 0x5C75: 0x8CDF, - 0x5C76: 0x8CE0, - 0x5C77: 0x8CE1, - 0x5C78: 0x8CE2, - 0x5C79: 0xD2D9, - 0x5C7A: 0xE1A8, - 0x5C7B: 0x8CE3, - 0x5C7C: 0x8CE4, - 0x5C7D: 0x8CE5, - 0x5C7E: 0x8CE6, - 0x5C7F: 0xD3EC, - 0x5C80: 0x8CE7, - 0x5C81: 0xCBEA, - 0x5C82: 0xC6F1, - 0x5C83: 0x8CE8, - 0x5C84: 0x8CE9, - 0x5C85: 0x8CEA, - 0x5C86: 0x8CEB, - 0x5C87: 0x8CEC, - 0x5C88: 0xE1AC, - 0x5C89: 0x8CED, - 0x5C8A: 0x8CEE, - 0x5C8B: 0x8CEF, - 0x5C8C: 0xE1A7, - 0x5C8D: 0xE1A9, - 0x5C8E: 0x8CF0, - 0x5C8F: 0x8CF1, - 0x5C90: 0xE1AA, - 0x5C91: 0xE1AF, - 0x5C92: 0x8CF2, - 0x5C93: 0x8CF3, - 0x5C94: 0xB2ED, - 0x5C95: 0x8CF4, - 0x5C96: 0xE1AB, - 0x5C97: 0xB8DA, - 0x5C98: 0xE1AD, - 0x5C99: 0xE1AE, - 0x5C9A: 0xE1B0, - 0x5C9B: 0xB5BA, - 0x5C9C: 0xE1B1, - 0x5C9D: 0x8CF5, - 0x5C9E: 0x8CF6, - 0x5C9F: 0x8CF7, - 0x5CA0: 0x8CF8, - 0x5CA1: 0x8CF9, - 0x5CA2: 0xE1B3, - 0x5CA3: 0xE1B8, - 0x5CA4: 0x8CFA, - 0x5CA5: 0x8CFB, - 0x5CA6: 0x8CFC, - 0x5CA7: 0x8CFD, - 0x5CA8: 0x8CFE, - 0x5CA9: 0xD1D2, - 0x5CAA: 0x8D40, - 0x5CAB: 0xE1B6, - 0x5CAC: 0xE1B5, - 0x5CAD: 0xC1EB, - 0x5CAE: 0x8D41, - 0x5CAF: 0x8D42, - 0x5CB0: 0x8D43, - 0x5CB1: 0xE1B7, - 0x5CB2: 0x8D44, - 0x5CB3: 0xD4C0, - 0x5CB4: 0x8D45, - 0x5CB5: 0xE1B2, - 0x5CB6: 0x8D46, - 0x5CB7: 0xE1BA, - 0x5CB8: 0xB0B6, - 0x5CB9: 0x8D47, - 0x5CBA: 0x8D48, - 0x5CBB: 0x8D49, - 0x5CBC: 0x8D4A, - 0x5CBD: 0xE1B4, - 0x5CBE: 0x8D4B, - 0x5CBF: 0xBFF9, - 0x5CC0: 0x8D4C, - 0x5CC1: 0xE1B9, - 0x5CC2: 0x8D4D, - 0x5CC3: 0x8D4E, - 0x5CC4: 0xE1BB, - 0x5CC5: 0x8D4F, - 0x5CC6: 0x8D50, - 0x5CC7: 0x8D51, - 0x5CC8: 0x8D52, - 0x5CC9: 0x8D53, - 0x5CCA: 0x8D54, - 0x5CCB: 0xE1BE, - 0x5CCC: 0x8D55, - 0x5CCD: 0x8D56, - 0x5CCE: 0x8D57, - 0x5CCF: 0x8D58, - 0x5CD0: 0x8D59, - 0x5CD1: 0x8D5A, - 0x5CD2: 0xE1BC, - 0x5CD3: 0x8D5B, - 0x5CD4: 0x8D5C, - 0x5CD5: 0x8D5D, - 0x5CD6: 0x8D5E, - 0x5CD7: 0x8D5F, - 0x5CD8: 0x8D60, - 0x5CD9: 0xD6C5, - 0x5CDA: 0x8D61, - 0x5CDB: 0x8D62, - 0x5CDC: 0x8D63, - 0x5CDD: 0x8D64, - 0x5CDE: 0x8D65, - 0x5CDF: 0x8D66, - 0x5CE0: 0x8D67, - 0x5CE1: 0xCFBF, - 0x5CE2: 0x8D68, - 0x5CE3: 0x8D69, - 0x5CE4: 0xE1BD, - 0x5CE5: 0xE1BF, - 0x5CE6: 0xC2CD, - 0x5CE7: 0x8D6A, - 0x5CE8: 0xB6EB, - 0x5CE9: 0x8D6B, - 0x5CEA: 0xD3F8, - 0x5CEB: 0x8D6C, - 0x5CEC: 0x8D6D, - 0x5CED: 0xC7CD, - 0x5CEE: 0x8D6E, - 0x5CEF: 0x8D6F, - 0x5CF0: 0xB7E5, - 0x5CF1: 0x8D70, - 0x5CF2: 0x8D71, - 0x5CF3: 0x8D72, - 0x5CF4: 0x8D73, - 0x5CF5: 0x8D74, - 0x5CF6: 0x8D75, - 0x5CF7: 0x8D76, - 0x5CF8: 0x8D77, - 0x5CF9: 0x8D78, - 0x5CFA: 0x8D79, - 0x5CFB: 0xBEFE, - 0x5CFC: 0x8D7A, - 0x5CFD: 0x8D7B, - 0x5CFE: 0x8D7C, - 0x5CFF: 0x8D7D, - 0x5D00: 0x8D7E, - 0x5D01: 0x8D80, - 0x5D02: 0xE1C0, - 0x5D03: 0xE1C1, - 0x5D04: 0x8D81, - 0x5D05: 0x8D82, - 0x5D06: 0xE1C7, - 0x5D07: 0xB3E7, - 0x5D08: 0x8D83, - 0x5D09: 0x8D84, - 0x5D0A: 0x8D85, - 0x5D0B: 0x8D86, - 0x5D0C: 0x8D87, - 0x5D0D: 0x8D88, - 0x5D0E: 0xC6E9, - 0x5D0F: 0x8D89, - 0x5D10: 0x8D8A, - 0x5D11: 0x8D8B, - 0x5D12: 0x8D8C, - 0x5D13: 0x8D8D, - 0x5D14: 0xB4DE, - 0x5D15: 0x8D8E, - 0x5D16: 0xD1C2, - 0x5D17: 0x8D8F, - 0x5D18: 0x8D90, - 0x5D19: 0x8D91, - 0x5D1A: 0x8D92, - 0x5D1B: 0xE1C8, - 0x5D1C: 0x8D93, - 0x5D1D: 0x8D94, - 0x5D1E: 0xE1C6, - 0x5D1F: 0x8D95, - 0x5D20: 0x8D96, - 0x5D21: 0x8D97, - 0x5D22: 0x8D98, - 0x5D23: 0x8D99, - 0x5D24: 0xE1C5, - 0x5D25: 0x8D9A, - 0x5D26: 0xE1C3, - 0x5D27: 0xE1C2, - 0x5D28: 0x8D9B, - 0x5D29: 0xB1C0, - 0x5D2A: 0x8D9C, - 0x5D2B: 0x8D9D, - 0x5D2C: 0x8D9E, - 0x5D2D: 0xD5B8, - 0x5D2E: 0xE1C4, - 0x5D2F: 0x8D9F, - 0x5D30: 0x8DA0, - 0x5D31: 0x8DA1, - 0x5D32: 0x8DA2, - 0x5D33: 0x8DA3, - 0x5D34: 0xE1CB, - 0x5D35: 0x8DA4, - 0x5D36: 0x8DA5, - 0x5D37: 0x8DA6, - 0x5D38: 0x8DA7, - 0x5D39: 0x8DA8, - 0x5D3A: 0x8DA9, - 0x5D3B: 0x8DAA, - 0x5D3C: 0x8DAB, - 0x5D3D: 0xE1CC, - 0x5D3E: 0xE1CA, - 0x5D3F: 0x8DAC, - 0x5D40: 0x8DAD, - 0x5D41: 0x8DAE, - 0x5D42: 0x8DAF, - 0x5D43: 0x8DB0, - 0x5D44: 0x8DB1, - 0x5D45: 0x8DB2, - 0x5D46: 0x8DB3, - 0x5D47: 0xEFFA, - 0x5D48: 0x8DB4, - 0x5D49: 0x8DB5, - 0x5D4A: 0xE1D3, - 0x5D4B: 0xE1D2, - 0x5D4C: 0xC7B6, - 0x5D4D: 0x8DB6, - 0x5D4E: 0x8DB7, - 0x5D4F: 0x8DB8, - 0x5D50: 0x8DB9, - 0x5D51: 0x8DBA, - 0x5D52: 0x8DBB, - 0x5D53: 0x8DBC, - 0x5D54: 0x8DBD, - 0x5D55: 0x8DBE, - 0x5D56: 0x8DBF, - 0x5D57: 0x8DC0, - 0x5D58: 0xE1C9, - 0x5D59: 0x8DC1, - 0x5D5A: 0x8DC2, - 0x5D5B: 0xE1CE, - 0x5D5C: 0x8DC3, - 0x5D5D: 0xE1D0, - 0x5D5E: 0x8DC4, - 0x5D5F: 0x8DC5, - 0x5D60: 0x8DC6, - 0x5D61: 0x8DC7, - 0x5D62: 0x8DC8, - 0x5D63: 0x8DC9, - 0x5D64: 0x8DCA, - 0x5D65: 0x8DCB, - 0x5D66: 0x8DCC, - 0x5D67: 0x8DCD, - 0x5D68: 0x8DCE, - 0x5D69: 0xE1D4, - 0x5D6A: 0x8DCF, - 0x5D6B: 0xE1D1, - 0x5D6C: 0xE1CD, - 0x5D6D: 0x8DD0, - 0x5D6E: 0x8DD1, - 0x5D6F: 0xE1CF, - 0x5D70: 0x8DD2, - 0x5D71: 0x8DD3, - 0x5D72: 0x8DD4, - 0x5D73: 0x8DD5, - 0x5D74: 0xE1D5, - 0x5D75: 0x8DD6, - 0x5D76: 0x8DD7, - 0x5D77: 0x8DD8, - 0x5D78: 0x8DD9, - 0x5D79: 0x8DDA, - 0x5D7A: 0x8DDB, - 0x5D7B: 0x8DDC, - 0x5D7C: 0x8DDD, - 0x5D7D: 0x8DDE, - 0x5D7E: 0x8DDF, - 0x5D7F: 0x8DE0, - 0x5D80: 0x8DE1, - 0x5D81: 0x8DE2, - 0x5D82: 0xE1D6, - 0x5D83: 0x8DE3, - 0x5D84: 0x8DE4, - 0x5D85: 0x8DE5, - 0x5D86: 0x8DE6, - 0x5D87: 0x8DE7, - 0x5D88: 0x8DE8, - 0x5D89: 0x8DE9, - 0x5D8A: 0x8DEA, - 0x5D8B: 0x8DEB, - 0x5D8C: 0x8DEC, - 0x5D8D: 0x8DED, - 0x5D8E: 0x8DEE, - 0x5D8F: 0x8DEF, - 0x5D90: 0x8DF0, - 0x5D91: 0x8DF1, - 0x5D92: 0x8DF2, - 0x5D93: 0x8DF3, - 0x5D94: 0x8DF4, - 0x5D95: 0x8DF5, - 0x5D96: 0x8DF6, - 0x5D97: 0x8DF7, - 0x5D98: 0x8DF8, - 0x5D99: 0xE1D7, - 0x5D9A: 0x8DF9, - 0x5D9B: 0x8DFA, - 0x5D9C: 0x8DFB, - 0x5D9D: 0xE1D8, - 0x5D9E: 0x8DFC, - 0x5D9F: 0x8DFD, - 0x5DA0: 0x8DFE, - 0x5DA1: 0x8E40, - 0x5DA2: 0x8E41, - 0x5DA3: 0x8E42, - 0x5DA4: 0x8E43, - 0x5DA5: 0x8E44, - 0x5DA6: 0x8E45, - 0x5DA7: 0x8E46, - 0x5DA8: 0x8E47, - 0x5DA9: 0x8E48, - 0x5DAA: 0x8E49, - 0x5DAB: 0x8E4A, - 0x5DAC: 0x8E4B, - 0x5DAD: 0x8E4C, - 0x5DAE: 0x8E4D, - 0x5DAF: 0x8E4E, - 0x5DB0: 0x8E4F, - 0x5DB1: 0x8E50, - 0x5DB2: 0x8E51, - 0x5DB3: 0x8E52, - 0x5DB4: 0x8E53, - 0x5DB5: 0x8E54, - 0x5DB6: 0x8E55, - 0x5DB7: 0xE1DA, - 0x5DB8: 0x8E56, - 0x5DB9: 0x8E57, - 0x5DBA: 0x8E58, - 0x5DBB: 0x8E59, - 0x5DBC: 0x8E5A, - 0x5DBD: 0x8E5B, - 0x5DBE: 0x8E5C, - 0x5DBF: 0x8E5D, - 0x5DC0: 0x8E5E, - 0x5DC1: 0x8E5F, - 0x5DC2: 0x8E60, - 0x5DC3: 0x8E61, - 0x5DC4: 0x8E62, - 0x5DC5: 0xE1DB, - 0x5DC6: 0x8E63, - 0x5DC7: 0x8E64, - 0x5DC8: 0x8E65, - 0x5DC9: 0x8E66, - 0x5DCA: 0x8E67, - 0x5DCB: 0x8E68, - 0x5DCC: 0x8E69, - 0x5DCD: 0xCEA1, - 0x5DCE: 0x8E6A, - 0x5DCF: 0x8E6B, - 0x5DD0: 0x8E6C, - 0x5DD1: 0x8E6D, - 0x5DD2: 0x8E6E, - 0x5DD3: 0x8E6F, - 0x5DD4: 0x8E70, - 0x5DD5: 0x8E71, - 0x5DD6: 0x8E72, - 0x5DD7: 0x8E73, - 0x5DD8: 0x8E74, - 0x5DD9: 0x8E75, - 0x5DDA: 0x8E76, - 0x5DDB: 0xE7DD, - 0x5DDC: 0x8E77, - 0x5DDD: 0xB4A8, - 0x5DDE: 0xD6DD, - 0x5DDF: 0x8E78, - 0x5DE0: 0x8E79, - 0x5DE1: 0xD1B2, - 0x5DE2: 0xB3B2, - 0x5DE3: 0x8E7A, - 0x5DE4: 0x8E7B, - 0x5DE5: 0xB9A4, - 0x5DE6: 0xD7F3, - 0x5DE7: 0xC7C9, - 0x5DE8: 0xBEDE, - 0x5DE9: 0xB9AE, - 0x5DEA: 0x8E7C, - 0x5DEB: 0xCED7, - 0x5DEC: 0x8E7D, - 0x5DED: 0x8E7E, - 0x5DEE: 0xB2EE, - 0x5DEF: 0xDBCF, - 0x5DF0: 0x8E80, - 0x5DF1: 0xBCBA, - 0x5DF2: 0xD2D1, - 0x5DF3: 0xCBC8, - 0x5DF4: 0xB0CD, - 0x5DF5: 0x8E81, - 0x5DF6: 0x8E82, - 0x5DF7: 0xCFEF, - 0x5DF8: 0x8E83, - 0x5DF9: 0x8E84, - 0x5DFA: 0x8E85, - 0x5DFB: 0x8E86, - 0x5DFC: 0x8E87, - 0x5DFD: 0xD9E3, - 0x5DFE: 0xBDED, - 0x5DFF: 0x8E88, - 0x5E00: 0x8E89, - 0x5E01: 0xB1D2, - 0x5E02: 0xCAD0, - 0x5E03: 0xB2BC, - 0x5E04: 0x8E8A, - 0x5E05: 0xCBA7, - 0x5E06: 0xB7AB, - 0x5E07: 0x8E8B, - 0x5E08: 0xCAA6, - 0x5E09: 0x8E8C, - 0x5E0A: 0x8E8D, - 0x5E0B: 0x8E8E, - 0x5E0C: 0xCFA3, - 0x5E0D: 0x8E8F, - 0x5E0E: 0x8E90, - 0x5E0F: 0xE0F8, - 0x5E10: 0xD5CA, - 0x5E11: 0xE0FB, - 0x5E12: 0x8E91, - 0x5E13: 0x8E92, - 0x5E14: 0xE0FA, - 0x5E15: 0xC5C1, - 0x5E16: 0xCCFB, - 0x5E17: 0x8E93, - 0x5E18: 0xC1B1, - 0x5E19: 0xE0F9, - 0x5E1A: 0xD6E3, - 0x5E1B: 0xB2AF, - 0x5E1C: 0xD6C4, - 0x5E1D: 0xB5DB, - 0x5E1E: 0x8E94, - 0x5E1F: 0x8E95, - 0x5E20: 0x8E96, - 0x5E21: 0x8E97, - 0x5E22: 0x8E98, - 0x5E23: 0x8E99, - 0x5E24: 0x8E9A, - 0x5E25: 0x8E9B, - 0x5E26: 0xB4F8, - 0x5E27: 0xD6A1, - 0x5E28: 0x8E9C, - 0x5E29: 0x8E9D, - 0x5E2A: 0x8E9E, - 0x5E2B: 0x8E9F, - 0x5E2C: 0x8EA0, - 0x5E2D: 0xCFAF, - 0x5E2E: 0xB0EF, - 0x5E2F: 0x8EA1, - 0x5E30: 0x8EA2, - 0x5E31: 0xE0FC, - 0x5E32: 0x8EA3, - 0x5E33: 0x8EA4, - 0x5E34: 0x8EA5, - 0x5E35: 0x8EA6, - 0x5E36: 0x8EA7, - 0x5E37: 0xE1A1, - 0x5E38: 0xB3A3, - 0x5E39: 0x8EA8, - 0x5E3A: 0x8EA9, - 0x5E3B: 0xE0FD, - 0x5E3C: 0xE0FE, - 0x5E3D: 0xC3B1, - 0x5E3E: 0x8EAA, - 0x5E3F: 0x8EAB, - 0x5E40: 0x8EAC, - 0x5E41: 0x8EAD, - 0x5E42: 0xC3DD, - 0x5E43: 0x8EAE, - 0x5E44: 0xE1A2, - 0x5E45: 0xB7F9, - 0x5E46: 0x8EAF, - 0x5E47: 0x8EB0, - 0x5E48: 0x8EB1, - 0x5E49: 0x8EB2, - 0x5E4A: 0x8EB3, - 0x5E4B: 0x8EB4, - 0x5E4C: 0xBBCF, - 0x5E4D: 0x8EB5, - 0x5E4E: 0x8EB6, - 0x5E4F: 0x8EB7, - 0x5E50: 0x8EB8, - 0x5E51: 0x8EB9, - 0x5E52: 0x8EBA, - 0x5E53: 0x8EBB, - 0x5E54: 0xE1A3, - 0x5E55: 0xC4BB, - 0x5E56: 0x8EBC, - 0x5E57: 0x8EBD, - 0x5E58: 0x8EBE, - 0x5E59: 0x8EBF, - 0x5E5A: 0x8EC0, - 0x5E5B: 0xE1A4, - 0x5E5C: 0x8EC1, - 0x5E5D: 0x8EC2, - 0x5E5E: 0xE1A5, - 0x5E5F: 0x8EC3, - 0x5E60: 0x8EC4, - 0x5E61: 0xE1A6, - 0x5E62: 0xB4B1, - 0x5E63: 0x8EC5, - 0x5E64: 0x8EC6, - 0x5E65: 0x8EC7, - 0x5E66: 0x8EC8, - 0x5E67: 0x8EC9, - 0x5E68: 0x8ECA, - 0x5E69: 0x8ECB, - 0x5E6A: 0x8ECC, - 0x5E6B: 0x8ECD, - 0x5E6C: 0x8ECE, - 0x5E6D: 0x8ECF, - 0x5E6E: 0x8ED0, - 0x5E6F: 0x8ED1, - 0x5E70: 0x8ED2, - 0x5E71: 0x8ED3, - 0x5E72: 0xB8C9, - 0x5E73: 0xC6BD, - 0x5E74: 0xC4EA, - 0x5E75: 0x8ED4, - 0x5E76: 0xB2A2, - 0x5E77: 0x8ED5, - 0x5E78: 0xD0D2, - 0x5E79: 0x8ED6, - 0x5E7A: 0xE7DB, - 0x5E7B: 0xBBC3, - 0x5E7C: 0xD3D7, - 0x5E7D: 0xD3C4, - 0x5E7E: 0x8ED7, - 0x5E7F: 0xB9E3, - 0x5E80: 0xE2CF, - 0x5E81: 0x8ED8, - 0x5E82: 0x8ED9, - 0x5E83: 0x8EDA, - 0x5E84: 0xD7AF, - 0x5E85: 0x8EDB, - 0x5E86: 0xC7EC, - 0x5E87: 0xB1D3, - 0x5E88: 0x8EDC, - 0x5E89: 0x8EDD, - 0x5E8A: 0xB4B2, - 0x5E8B: 0xE2D1, - 0x5E8C: 0x8EDE, - 0x5E8D: 0x8EDF, - 0x5E8E: 0x8EE0, - 0x5E8F: 0xD0F2, - 0x5E90: 0xC2AE, - 0x5E91: 0xE2D0, - 0x5E92: 0x8EE1, - 0x5E93: 0xBFE2, - 0x5E94: 0xD3A6, - 0x5E95: 0xB5D7, - 0x5E96: 0xE2D2, - 0x5E97: 0xB5EA, - 0x5E98: 0x8EE2, - 0x5E99: 0xC3ED, - 0x5E9A: 0xB8FD, - 0x5E9B: 0x8EE3, - 0x5E9C: 0xB8AE, - 0x5E9D: 0x8EE4, - 0x5E9E: 0xC5D3, - 0x5E9F: 0xB7CF, - 0x5EA0: 0xE2D4, - 0x5EA1: 0x8EE5, - 0x5EA2: 0x8EE6, - 0x5EA3: 0x8EE7, - 0x5EA4: 0x8EE8, - 0x5EA5: 0xE2D3, - 0x5EA6: 0xB6C8, - 0x5EA7: 0xD7F9, - 0x5EA8: 0x8EE9, - 0x5EA9: 0x8EEA, - 0x5EAA: 0x8EEB, - 0x5EAB: 0x8EEC, - 0x5EAC: 0x8EED, - 0x5EAD: 0xCDA5, - 0x5EAE: 0x8EEE, - 0x5EAF: 0x8EEF, - 0x5EB0: 0x8EF0, - 0x5EB1: 0x8EF1, - 0x5EB2: 0x8EF2, - 0x5EB3: 0xE2D8, - 0x5EB4: 0x8EF3, - 0x5EB5: 0xE2D6, - 0x5EB6: 0xCAFC, - 0x5EB7: 0xBFB5, - 0x5EB8: 0xD3B9, - 0x5EB9: 0xE2D5, - 0x5EBA: 0x8EF4, - 0x5EBB: 0x8EF5, - 0x5EBC: 0x8EF6, - 0x5EBD: 0x8EF7, - 0x5EBE: 0xE2D7, - 0x5EBF: 0x8EF8, - 0x5EC0: 0x8EF9, - 0x5EC1: 0x8EFA, - 0x5EC2: 0x8EFB, - 0x5EC3: 0x8EFC, - 0x5EC4: 0x8EFD, - 0x5EC5: 0x8EFE, - 0x5EC6: 0x8F40, - 0x5EC7: 0x8F41, - 0x5EC8: 0x8F42, - 0x5EC9: 0xC1AE, - 0x5ECA: 0xC0C8, - 0x5ECB: 0x8F43, - 0x5ECC: 0x8F44, - 0x5ECD: 0x8F45, - 0x5ECE: 0x8F46, - 0x5ECF: 0x8F47, - 0x5ED0: 0x8F48, - 0x5ED1: 0xE2DB, - 0x5ED2: 0xE2DA, - 0x5ED3: 0xC0AA, - 0x5ED4: 0x8F49, - 0x5ED5: 0x8F4A, - 0x5ED6: 0xC1CE, - 0x5ED7: 0x8F4B, - 0x5ED8: 0x8F4C, - 0x5ED9: 0x8F4D, - 0x5EDA: 0x8F4E, - 0x5EDB: 0xE2DC, - 0x5EDC: 0x8F4F, - 0x5EDD: 0x8F50, - 0x5EDE: 0x8F51, - 0x5EDF: 0x8F52, - 0x5EE0: 0x8F53, - 0x5EE1: 0x8F54, - 0x5EE2: 0x8F55, - 0x5EE3: 0x8F56, - 0x5EE4: 0x8F57, - 0x5EE5: 0x8F58, - 0x5EE6: 0x8F59, - 0x5EE7: 0x8F5A, - 0x5EE8: 0xE2DD, - 0x5EE9: 0x8F5B, - 0x5EEA: 0xE2DE, - 0x5EEB: 0x8F5C, - 0x5EEC: 0x8F5D, - 0x5EED: 0x8F5E, - 0x5EEE: 0x8F5F, - 0x5EEF: 0x8F60, - 0x5EF0: 0x8F61, - 0x5EF1: 0x8F62, - 0x5EF2: 0x8F63, - 0x5EF3: 0x8F64, - 0x5EF4: 0xDBC8, - 0x5EF5: 0x8F65, - 0x5EF6: 0xD1D3, - 0x5EF7: 0xCDA2, - 0x5EF8: 0x8F66, - 0x5EF9: 0x8F67, - 0x5EFA: 0xBDA8, - 0x5EFB: 0x8F68, - 0x5EFC: 0x8F69, - 0x5EFD: 0x8F6A, - 0x5EFE: 0xDEC3, - 0x5EFF: 0xD8A5, - 0x5F00: 0xBFAA, - 0x5F01: 0xDBCD, - 0x5F02: 0xD2EC, - 0x5F03: 0xC6FA, - 0x5F04: 0xC5AA, - 0x5F05: 0x8F6B, - 0x5F06: 0x8F6C, - 0x5F07: 0x8F6D, - 0x5F08: 0xDEC4, - 0x5F09: 0x8F6E, - 0x5F0A: 0xB1D7, - 0x5F0B: 0xDFAE, - 0x5F0C: 0x8F6F, - 0x5F0D: 0x8F70, - 0x5F0E: 0x8F71, - 0x5F0F: 0xCABD, - 0x5F10: 0x8F72, - 0x5F11: 0xDFB1, - 0x5F12: 0x8F73, - 0x5F13: 0xB9AD, - 0x5F14: 0x8F74, - 0x5F15: 0xD2FD, - 0x5F16: 0x8F75, - 0x5F17: 0xB8A5, - 0x5F18: 0xBAEB, - 0x5F19: 0x8F76, - 0x5F1A: 0x8F77, - 0x5F1B: 0xB3DA, - 0x5F1C: 0x8F78, - 0x5F1D: 0x8F79, - 0x5F1E: 0x8F7A, - 0x5F1F: 0xB5DC, - 0x5F20: 0xD5C5, - 0x5F21: 0x8F7B, - 0x5F22: 0x8F7C, - 0x5F23: 0x8F7D, - 0x5F24: 0x8F7E, - 0x5F25: 0xC3D6, - 0x5F26: 0xCFD2, - 0x5F27: 0xBBA1, - 0x5F28: 0x8F80, - 0x5F29: 0xE5F3, - 0x5F2A: 0xE5F2, - 0x5F2B: 0x8F81, - 0x5F2C: 0x8F82, - 0x5F2D: 0xE5F4, - 0x5F2E: 0x8F83, - 0x5F2F: 0xCDE4, - 0x5F30: 0x8F84, - 0x5F31: 0xC8F5, - 0x5F32: 0x8F85, - 0x5F33: 0x8F86, - 0x5F34: 0x8F87, - 0x5F35: 0x8F88, - 0x5F36: 0x8F89, - 0x5F37: 0x8F8A, - 0x5F38: 0x8F8B, - 0x5F39: 0xB5AF, - 0x5F3A: 0xC7BF, - 0x5F3B: 0x8F8C, - 0x5F3C: 0xE5F6, - 0x5F3D: 0x8F8D, - 0x5F3E: 0x8F8E, - 0x5F3F: 0x8F8F, - 0x5F40: 0xECB0, - 0x5F41: 0x8F90, - 0x5F42: 0x8F91, - 0x5F43: 0x8F92, - 0x5F44: 0x8F93, - 0x5F45: 0x8F94, - 0x5F46: 0x8F95, - 0x5F47: 0x8F96, - 0x5F48: 0x8F97, - 0x5F49: 0x8F98, - 0x5F4A: 0x8F99, - 0x5F4B: 0x8F9A, - 0x5F4C: 0x8F9B, - 0x5F4D: 0x8F9C, - 0x5F4E: 0x8F9D, - 0x5F4F: 0x8F9E, - 0x5F50: 0xE5E6, - 0x5F51: 0x8F9F, - 0x5F52: 0xB9E9, - 0x5F53: 0xB5B1, - 0x5F54: 0x8FA0, - 0x5F55: 0xC2BC, - 0x5F56: 0xE5E8, - 0x5F57: 0xE5E7, - 0x5F58: 0xE5E9, - 0x5F59: 0x8FA1, - 0x5F5A: 0x8FA2, - 0x5F5B: 0x8FA3, - 0x5F5C: 0x8FA4, - 0x5F5D: 0xD2CD, - 0x5F5E: 0x8FA5, - 0x5F5F: 0x8FA6, - 0x5F60: 0x8FA7, - 0x5F61: 0xE1EA, - 0x5F62: 0xD0CE, - 0x5F63: 0x8FA8, - 0x5F64: 0xCDAE, - 0x5F65: 0x8FA9, - 0x5F66: 0xD1E5, - 0x5F67: 0x8FAA, - 0x5F68: 0x8FAB, - 0x5F69: 0xB2CA, - 0x5F6A: 0xB1EB, - 0x5F6B: 0x8FAC, - 0x5F6C: 0xB1F2, - 0x5F6D: 0xC5ED, - 0x5F6E: 0x8FAD, - 0x5F6F: 0x8FAE, - 0x5F70: 0xD5C3, - 0x5F71: 0xD3B0, - 0x5F72: 0x8FAF, - 0x5F73: 0xE1DC, - 0x5F74: 0x8FB0, - 0x5F75: 0x8FB1, - 0x5F76: 0x8FB2, - 0x5F77: 0xE1DD, - 0x5F78: 0x8FB3, - 0x5F79: 0xD2DB, - 0x5F7A: 0x8FB4, - 0x5F7B: 0xB3B9, - 0x5F7C: 0xB1CB, - 0x5F7D: 0x8FB5, - 0x5F7E: 0x8FB6, - 0x5F7F: 0x8FB7, - 0x5F80: 0xCDF9, - 0x5F81: 0xD5F7, - 0x5F82: 0xE1DE, - 0x5F83: 0x8FB8, - 0x5F84: 0xBEB6, - 0x5F85: 0xB4FD, - 0x5F86: 0x8FB9, - 0x5F87: 0xE1DF, - 0x5F88: 0xBADC, - 0x5F89: 0xE1E0, - 0x5F8A: 0xBBB2, - 0x5F8B: 0xC2C9, - 0x5F8C: 0xE1E1, - 0x5F8D: 0x8FBA, - 0x5F8E: 0x8FBB, - 0x5F8F: 0x8FBC, - 0x5F90: 0xD0EC, - 0x5F91: 0x8FBD, - 0x5F92: 0xCDBD, - 0x5F93: 0x8FBE, - 0x5F94: 0x8FBF, - 0x5F95: 0xE1E2, - 0x5F96: 0x8FC0, - 0x5F97: 0xB5C3, - 0x5F98: 0xC5C7, - 0x5F99: 0xE1E3, - 0x5F9A: 0x8FC1, - 0x5F9B: 0x8FC2, - 0x5F9C: 0xE1E4, - 0x5F9D: 0x8FC3, - 0x5F9E: 0x8FC4, - 0x5F9F: 0x8FC5, - 0x5FA0: 0x8FC6, - 0x5FA1: 0xD3F9, - 0x5FA2: 0x8FC7, - 0x5FA3: 0x8FC8, - 0x5FA4: 0x8FC9, - 0x5FA5: 0x8FCA, - 0x5FA6: 0x8FCB, - 0x5FA7: 0x8FCC, - 0x5FA8: 0xE1E5, - 0x5FA9: 0x8FCD, - 0x5FAA: 0xD1AD, - 0x5FAB: 0x8FCE, - 0x5FAC: 0x8FCF, - 0x5FAD: 0xE1E6, - 0x5FAE: 0xCEA2, - 0x5FAF: 0x8FD0, - 0x5FB0: 0x8FD1, - 0x5FB1: 0x8FD2, - 0x5FB2: 0x8FD3, - 0x5FB3: 0x8FD4, - 0x5FB4: 0x8FD5, - 0x5FB5: 0xE1E7, - 0x5FB6: 0x8FD6, - 0x5FB7: 0xB5C2, - 0x5FB8: 0x8FD7, - 0x5FB9: 0x8FD8, - 0x5FBA: 0x8FD9, - 0x5FBB: 0x8FDA, - 0x5FBC: 0xE1E8, - 0x5FBD: 0xBBD5, - 0x5FBE: 0x8FDB, - 0x5FBF: 0x8FDC, - 0x5FC0: 0x8FDD, - 0x5FC1: 0x8FDE, - 0x5FC2: 0x8FDF, - 0x5FC3: 0xD0C4, - 0x5FC4: 0xE2E0, - 0x5FC5: 0xB1D8, - 0x5FC6: 0xD2E4, - 0x5FC7: 0x8FE0, - 0x5FC8: 0x8FE1, - 0x5FC9: 0xE2E1, - 0x5FCA: 0x8FE2, - 0x5FCB: 0x8FE3, - 0x5FCC: 0xBCC9, - 0x5FCD: 0xC8CC, - 0x5FCE: 0x8FE4, - 0x5FCF: 0xE2E3, - 0x5FD0: 0xECFE, - 0x5FD1: 0xECFD, - 0x5FD2: 0xDFAF, - 0x5FD3: 0x8FE5, - 0x5FD4: 0x8FE6, - 0x5FD5: 0x8FE7, - 0x5FD6: 0xE2E2, - 0x5FD7: 0xD6BE, - 0x5FD8: 0xCDFC, - 0x5FD9: 0xC3A6, - 0x5FDA: 0x8FE8, - 0x5FDB: 0x8FE9, - 0x5FDC: 0x8FEA, - 0x5FDD: 0xE3C3, - 0x5FDE: 0x8FEB, - 0x5FDF: 0x8FEC, - 0x5FE0: 0xD6D2, - 0x5FE1: 0xE2E7, - 0x5FE2: 0x8FED, - 0x5FE3: 0x8FEE, - 0x5FE4: 0xE2E8, - 0x5FE5: 0x8FEF, - 0x5FE6: 0x8FF0, - 0x5FE7: 0xD3C7, - 0x5FE8: 0x8FF1, - 0x5FE9: 0x8FF2, - 0x5FEA: 0xE2EC, - 0x5FEB: 0xBFEC, - 0x5FEC: 0x8FF3, - 0x5FED: 0xE2ED, - 0x5FEE: 0xE2E5, - 0x5FEF: 0x8FF4, - 0x5FF0: 0x8FF5, - 0x5FF1: 0xB3C0, - 0x5FF2: 0x8FF6, - 0x5FF3: 0x8FF7, - 0x5FF4: 0x8FF8, - 0x5FF5: 0xC4EE, - 0x5FF6: 0x8FF9, - 0x5FF7: 0x8FFA, - 0x5FF8: 0xE2EE, - 0x5FF9: 0x8FFB, - 0x5FFA: 0x8FFC, - 0x5FFB: 0xD0C3, - 0x5FFC: 0x8FFD, - 0x5FFD: 0xBAF6, - 0x5FFE: 0xE2E9, - 0x5FFF: 0xB7DE, - 0x6000: 0xBBB3, - 0x6001: 0xCCAC, - 0x6002: 0xCBCB, - 0x6003: 0xE2E4, - 0x6004: 0xE2E6, - 0x6005: 0xE2EA, - 0x6006: 0xE2EB, - 0x6007: 0x8FFE, - 0x6008: 0x9040, - 0x6009: 0x9041, - 0x600A: 0xE2F7, - 0x600B: 0x9042, - 0x600C: 0x9043, - 0x600D: 0xE2F4, - 0x600E: 0xD4F5, - 0x600F: 0xE2F3, - 0x6010: 0x9044, - 0x6011: 0x9045, - 0x6012: 0xC5AD, - 0x6013: 0x9046, - 0x6014: 0xD5FA, - 0x6015: 0xC5C2, - 0x6016: 0xB2C0, - 0x6017: 0x9047, - 0x6018: 0x9048, - 0x6019: 0xE2EF, - 0x601A: 0x9049, - 0x601B: 0xE2F2, - 0x601C: 0xC1AF, - 0x601D: 0xCBBC, - 0x601E: 0x904A, - 0x601F: 0x904B, - 0x6020: 0xB5A1, - 0x6021: 0xE2F9, - 0x6022: 0x904C, - 0x6023: 0x904D, - 0x6024: 0x904E, - 0x6025: 0xBCB1, - 0x6026: 0xE2F1, - 0x6027: 0xD0D4, - 0x6028: 0xD4B9, - 0x6029: 0xE2F5, - 0x602A: 0xB9D6, - 0x602B: 0xE2F6, - 0x602C: 0x904F, - 0x602D: 0x9050, - 0x602E: 0x9051, - 0x602F: 0xC7D3, - 0x6030: 0x9052, - 0x6031: 0x9053, - 0x6032: 0x9054, - 0x6033: 0x9055, - 0x6034: 0x9056, - 0x6035: 0xE2F0, - 0x6036: 0x9057, - 0x6037: 0x9058, - 0x6038: 0x9059, - 0x6039: 0x905A, - 0x603A: 0x905B, - 0x603B: 0xD7DC, - 0x603C: 0xEDA1, - 0x603D: 0x905C, - 0x603E: 0x905D, - 0x603F: 0xE2F8, - 0x6040: 0x905E, - 0x6041: 0xEDA5, - 0x6042: 0xE2FE, - 0x6043: 0xCAD1, - 0x6044: 0x905F, - 0x6045: 0x9060, - 0x6046: 0x9061, - 0x6047: 0x9062, - 0x6048: 0x9063, - 0x6049: 0x9064, - 0x604A: 0x9065, - 0x604B: 0xC1B5, - 0x604C: 0x9066, - 0x604D: 0xBBD0, - 0x604E: 0x9067, - 0x604F: 0x9068, - 0x6050: 0xBFD6, - 0x6051: 0x9069, - 0x6052: 0xBAE3, - 0x6053: 0x906A, - 0x6054: 0x906B, - 0x6055: 0xCBA1, - 0x6056: 0x906C, - 0x6057: 0x906D, - 0x6058: 0x906E, - 0x6059: 0xEDA6, - 0x605A: 0xEDA3, - 0x605B: 0x906F, - 0x605C: 0x9070, - 0x605D: 0xEDA2, - 0x605E: 0x9071, - 0x605F: 0x9072, - 0x6060: 0x9073, - 0x6061: 0x9074, - 0x6062: 0xBBD6, - 0x6063: 0xEDA7, - 0x6064: 0xD0F4, - 0x6065: 0x9075, - 0x6066: 0x9076, - 0x6067: 0xEDA4, - 0x6068: 0xBADE, - 0x6069: 0xB6F7, - 0x606A: 0xE3A1, - 0x606B: 0xB6B2, - 0x606C: 0xCCF1, - 0x606D: 0xB9A7, - 0x606E: 0x9077, - 0x606F: 0xCFA2, - 0x6070: 0xC7A1, - 0x6071: 0x9078, - 0x6072: 0x9079, - 0x6073: 0xBFD2, - 0x6074: 0x907A, - 0x6075: 0x907B, - 0x6076: 0xB6F1, - 0x6077: 0x907C, - 0x6078: 0xE2FA, - 0x6079: 0xE2FB, - 0x607A: 0xE2FD, - 0x607B: 0xE2FC, - 0x607C: 0xC4D5, - 0x607D: 0xE3A2, - 0x607E: 0x907D, - 0x607F: 0xD3C1, - 0x6080: 0x907E, - 0x6081: 0x9080, - 0x6082: 0x9081, - 0x6083: 0xE3A7, - 0x6084: 0xC7C4, - 0x6085: 0x9082, - 0x6086: 0x9083, - 0x6087: 0x9084, - 0x6088: 0x9085, - 0x6089: 0xCFA4, - 0x608A: 0x9086, - 0x608B: 0x9087, - 0x608C: 0xE3A9, - 0x608D: 0xBAB7, - 0x608E: 0x9088, - 0x608F: 0x9089, - 0x6090: 0x908A, - 0x6091: 0x908B, - 0x6092: 0xE3A8, - 0x6093: 0x908C, - 0x6094: 0xBBDA, - 0x6095: 0x908D, - 0x6096: 0xE3A3, - 0x6097: 0x908E, - 0x6098: 0x908F, - 0x6099: 0x9090, - 0x609A: 0xE3A4, - 0x609B: 0xE3AA, - 0x609C: 0x9091, - 0x609D: 0xE3A6, - 0x609E: 0x9092, - 0x609F: 0xCEF2, - 0x60A0: 0xD3C6, - 0x60A1: 0x9093, - 0x60A2: 0x9094, - 0x60A3: 0xBBBC, - 0x60A4: 0x9095, - 0x60A5: 0x9096, - 0x60A6: 0xD4C3, - 0x60A7: 0x9097, - 0x60A8: 0xC4FA, - 0x60A9: 0x9098, - 0x60AA: 0x9099, - 0x60AB: 0xEDA8, - 0x60AC: 0xD0FC, - 0x60AD: 0xE3A5, - 0x60AE: 0x909A, - 0x60AF: 0xC3F5, - 0x60B0: 0x909B, - 0x60B1: 0xE3AD, - 0x60B2: 0xB1AF, - 0x60B3: 0x909C, - 0x60B4: 0xE3B2, - 0x60B5: 0x909D, - 0x60B6: 0x909E, - 0x60B7: 0x909F, - 0x60B8: 0xBCC2, - 0x60B9: 0x90A0, - 0x60BA: 0x90A1, - 0x60BB: 0xE3AC, - 0x60BC: 0xB5BF, - 0x60BD: 0x90A2, - 0x60BE: 0x90A3, - 0x60BF: 0x90A4, - 0x60C0: 0x90A5, - 0x60C1: 0x90A6, - 0x60C2: 0x90A7, - 0x60C3: 0x90A8, - 0x60C4: 0x90A9, - 0x60C5: 0xC7E9, - 0x60C6: 0xE3B0, - 0x60C7: 0x90AA, - 0x60C8: 0x90AB, - 0x60C9: 0x90AC, - 0x60CA: 0xBEAA, - 0x60CB: 0xCDEF, - 0x60CC: 0x90AD, - 0x60CD: 0x90AE, - 0x60CE: 0x90AF, - 0x60CF: 0x90B0, - 0x60D0: 0x90B1, - 0x60D1: 0xBBF3, - 0x60D2: 0x90B2, - 0x60D3: 0x90B3, - 0x60D4: 0x90B4, - 0x60D5: 0xCCE8, - 0x60D6: 0x90B5, - 0x60D7: 0x90B6, - 0x60D8: 0xE3AF, - 0x60D9: 0x90B7, - 0x60DA: 0xE3B1, - 0x60DB: 0x90B8, - 0x60DC: 0xCFA7, - 0x60DD: 0xE3AE, - 0x60DE: 0x90B9, - 0x60DF: 0xCEA9, - 0x60E0: 0xBBDD, - 0x60E1: 0x90BA, - 0x60E2: 0x90BB, - 0x60E3: 0x90BC, - 0x60E4: 0x90BD, - 0x60E5: 0x90BE, - 0x60E6: 0xB5EB, - 0x60E7: 0xBEE5, - 0x60E8: 0xB2D2, - 0x60E9: 0xB3CD, - 0x60EA: 0x90BF, - 0x60EB: 0xB1B9, - 0x60EC: 0xE3AB, - 0x60ED: 0xB2D1, - 0x60EE: 0xB5AC, - 0x60EF: 0xB9DF, - 0x60F0: 0xB6E8, - 0x60F1: 0x90C0, - 0x60F2: 0x90C1, - 0x60F3: 0xCFEB, - 0x60F4: 0xE3B7, - 0x60F5: 0x90C2, - 0x60F6: 0xBBCC, - 0x60F7: 0x90C3, - 0x60F8: 0x90C4, - 0x60F9: 0xC8C7, - 0x60FA: 0xD0CA, - 0x60FB: 0x90C5, - 0x60FC: 0x90C6, - 0x60FD: 0x90C7, - 0x60FE: 0x90C8, - 0x60FF: 0x90C9, - 0x6100: 0xE3B8, - 0x6101: 0xB3EE, - 0x6102: 0x90CA, - 0x6103: 0x90CB, - 0x6104: 0x90CC, - 0x6105: 0x90CD, - 0x6106: 0xEDA9, - 0x6107: 0x90CE, - 0x6108: 0xD3FA, - 0x6109: 0xD3E4, - 0x610A: 0x90CF, - 0x610B: 0x90D0, - 0x610C: 0x90D1, - 0x610D: 0xEDAA, - 0x610E: 0xE3B9, - 0x610F: 0xD2E2, - 0x6110: 0x90D2, - 0x6111: 0x90D3, - 0x6112: 0x90D4, - 0x6113: 0x90D5, - 0x6114: 0x90D6, - 0x6115: 0xE3B5, - 0x6116: 0x90D7, - 0x6117: 0x90D8, - 0x6118: 0x90D9, - 0x6119: 0x90DA, - 0x611A: 0xD3DE, - 0x611B: 0x90DB, - 0x611C: 0x90DC, - 0x611D: 0x90DD, - 0x611E: 0x90DE, - 0x611F: 0xB8D0, - 0x6120: 0xE3B3, - 0x6121: 0x90DF, - 0x6122: 0x90E0, - 0x6123: 0xE3B6, - 0x6124: 0xB7DF, - 0x6125: 0x90E1, - 0x6126: 0xE3B4, - 0x6127: 0xC0A2, - 0x6128: 0x90E2, - 0x6129: 0x90E3, - 0x612A: 0x90E4, - 0x612B: 0xE3BA, - 0x612C: 0x90E5, - 0x612D: 0x90E6, - 0x612E: 0x90E7, - 0x612F: 0x90E8, - 0x6130: 0x90E9, - 0x6131: 0x90EA, - 0x6132: 0x90EB, - 0x6133: 0x90EC, - 0x6134: 0x90ED, - 0x6135: 0x90EE, - 0x6136: 0x90EF, - 0x6137: 0x90F0, - 0x6138: 0x90F1, - 0x6139: 0x90F2, - 0x613A: 0x90F3, - 0x613B: 0x90F4, - 0x613C: 0x90F5, - 0x613D: 0x90F6, - 0x613E: 0x90F7, - 0x613F: 0xD4B8, - 0x6140: 0x90F8, - 0x6141: 0x90F9, - 0x6142: 0x90FA, - 0x6143: 0x90FB, - 0x6144: 0x90FC, - 0x6145: 0x90FD, - 0x6146: 0x90FE, - 0x6147: 0x9140, - 0x6148: 0xB4C8, - 0x6149: 0x9141, - 0x614A: 0xE3BB, - 0x614B: 0x9142, - 0x614C: 0xBBC5, - 0x614D: 0x9143, - 0x614E: 0xC9F7, - 0x614F: 0x9144, - 0x6150: 0x9145, - 0x6151: 0xC9E5, - 0x6152: 0x9146, - 0x6153: 0x9147, - 0x6154: 0x9148, - 0x6155: 0xC4BD, - 0x6156: 0x9149, - 0x6157: 0x914A, - 0x6158: 0x914B, - 0x6159: 0x914C, - 0x615A: 0x914D, - 0x615B: 0x914E, - 0x615C: 0x914F, - 0x615D: 0xEDAB, - 0x615E: 0x9150, - 0x615F: 0x9151, - 0x6160: 0x9152, - 0x6161: 0x9153, - 0x6162: 0xC2FD, - 0x6163: 0x9154, - 0x6164: 0x9155, - 0x6165: 0x9156, - 0x6166: 0x9157, - 0x6167: 0xBBDB, - 0x6168: 0xBFAE, - 0x6169: 0x9158, - 0x616A: 0x9159, - 0x616B: 0x915A, - 0x616C: 0x915B, - 0x616D: 0x915C, - 0x616E: 0x915D, - 0x616F: 0x915E, - 0x6170: 0xCEBF, - 0x6171: 0x915F, - 0x6172: 0x9160, - 0x6173: 0x9161, - 0x6174: 0x9162, - 0x6175: 0xE3BC, - 0x6176: 0x9163, - 0x6177: 0xBFB6, - 0x6178: 0x9164, - 0x6179: 0x9165, - 0x617A: 0x9166, - 0x617B: 0x9167, - 0x617C: 0x9168, - 0x617D: 0x9169, - 0x617E: 0x916A, - 0x617F: 0x916B, - 0x6180: 0x916C, - 0x6181: 0x916D, - 0x6182: 0x916E, - 0x6183: 0x916F, - 0x6184: 0x9170, - 0x6185: 0x9171, - 0x6186: 0x9172, - 0x6187: 0x9173, - 0x6188: 0x9174, - 0x6189: 0x9175, - 0x618A: 0x9176, - 0x618B: 0xB1EF, - 0x618C: 0x9177, - 0x618D: 0x9178, - 0x618E: 0xD4F7, - 0x618F: 0x9179, - 0x6190: 0x917A, - 0x6191: 0x917B, - 0x6192: 0x917C, - 0x6193: 0x917D, - 0x6194: 0xE3BE, - 0x6195: 0x917E, - 0x6196: 0x9180, - 0x6197: 0x9181, - 0x6198: 0x9182, - 0x6199: 0x9183, - 0x619A: 0x9184, - 0x619B: 0x9185, - 0x619C: 0x9186, - 0x619D: 0xEDAD, - 0x619E: 0x9187, - 0x619F: 0x9188, - 0x61A0: 0x9189, - 0x61A1: 0x918A, - 0x61A2: 0x918B, - 0x61A3: 0x918C, - 0x61A4: 0x918D, - 0x61A5: 0x918E, - 0x61A6: 0x918F, - 0x61A7: 0xE3BF, - 0x61A8: 0xBAA9, - 0x61A9: 0xEDAC, - 0x61AA: 0x9190, - 0x61AB: 0x9191, - 0x61AC: 0xE3BD, - 0x61AD: 0x9192, - 0x61AE: 0x9193, - 0x61AF: 0x9194, - 0x61B0: 0x9195, - 0x61B1: 0x9196, - 0x61B2: 0x9197, - 0x61B3: 0x9198, - 0x61B4: 0x9199, - 0x61B5: 0x919A, - 0x61B6: 0x919B, - 0x61B7: 0xE3C0, - 0x61B8: 0x919C, - 0x61B9: 0x919D, - 0x61BA: 0x919E, - 0x61BB: 0x919F, - 0x61BC: 0x91A0, - 0x61BD: 0x91A1, - 0x61BE: 0xBAB6, - 0x61BF: 0x91A2, - 0x61C0: 0x91A3, - 0x61C1: 0x91A4, - 0x61C2: 0xB6AE, - 0x61C3: 0x91A5, - 0x61C4: 0x91A6, - 0x61C5: 0x91A7, - 0x61C6: 0x91A8, - 0x61C7: 0x91A9, - 0x61C8: 0xD0B8, - 0x61C9: 0x91AA, - 0x61CA: 0xB0C3, - 0x61CB: 0xEDAE, - 0x61CC: 0x91AB, - 0x61CD: 0x91AC, - 0x61CE: 0x91AD, - 0x61CF: 0x91AE, - 0x61D0: 0x91AF, - 0x61D1: 0xEDAF, - 0x61D2: 0xC0C1, - 0x61D3: 0x91B0, - 0x61D4: 0xE3C1, - 0x61D5: 0x91B1, - 0x61D6: 0x91B2, - 0x61D7: 0x91B3, - 0x61D8: 0x91B4, - 0x61D9: 0x91B5, - 0x61DA: 0x91B6, - 0x61DB: 0x91B7, - 0x61DC: 0x91B8, - 0x61DD: 0x91B9, - 0x61DE: 0x91BA, - 0x61DF: 0x91BB, - 0x61E0: 0x91BC, - 0x61E1: 0x91BD, - 0x61E2: 0x91BE, - 0x61E3: 0x91BF, - 0x61E4: 0x91C0, - 0x61E5: 0x91C1, - 0x61E6: 0xC5B3, - 0x61E7: 0x91C2, - 0x61E8: 0x91C3, - 0x61E9: 0x91C4, - 0x61EA: 0x91C5, - 0x61EB: 0x91C6, - 0x61EC: 0x91C7, - 0x61ED: 0x91C8, - 0x61EE: 0x91C9, - 0x61EF: 0x91CA, - 0x61F0: 0x91CB, - 0x61F1: 0x91CC, - 0x61F2: 0x91CD, - 0x61F3: 0x91CE, - 0x61F4: 0x91CF, - 0x61F5: 0xE3C2, - 0x61F6: 0x91D0, - 0x61F7: 0x91D1, - 0x61F8: 0x91D2, - 0x61F9: 0x91D3, - 0x61FA: 0x91D4, - 0x61FB: 0x91D5, - 0x61FC: 0x91D6, - 0x61FD: 0x91D7, - 0x61FE: 0x91D8, - 0x61FF: 0xDCB2, - 0x6200: 0x91D9, - 0x6201: 0x91DA, - 0x6202: 0x91DB, - 0x6203: 0x91DC, - 0x6204: 0x91DD, - 0x6205: 0x91DE, - 0x6206: 0xEDB0, - 0x6207: 0x91DF, - 0x6208: 0xB8EA, - 0x6209: 0x91E0, - 0x620A: 0xCEEC, - 0x620B: 0xEAA7, - 0x620C: 0xD0E7, - 0x620D: 0xCAF9, - 0x620E: 0xC8D6, - 0x620F: 0xCFB7, - 0x6210: 0xB3C9, - 0x6211: 0xCED2, - 0x6212: 0xBDE4, - 0x6213: 0x91E1, - 0x6214: 0x91E2, - 0x6215: 0xE3DE, - 0x6216: 0xBBF2, - 0x6217: 0xEAA8, - 0x6218: 0xD5BD, - 0x6219: 0x91E3, - 0x621A: 0xC6DD, - 0x621B: 0xEAA9, - 0x621C: 0x91E4, - 0x621D: 0x91E5, - 0x621E: 0x91E6, - 0x621F: 0xEAAA, - 0x6220: 0x91E7, - 0x6221: 0xEAAC, - 0x6222: 0xEAAB, - 0x6223: 0x91E8, - 0x6224: 0xEAAE, - 0x6225: 0xEAAD, - 0x6226: 0x91E9, - 0x6227: 0x91EA, - 0x6228: 0x91EB, - 0x6229: 0x91EC, - 0x622A: 0xBDD8, - 0x622B: 0x91ED, - 0x622C: 0xEAAF, - 0x622D: 0x91EE, - 0x622E: 0xC2BE, - 0x622F: 0x91EF, - 0x6230: 0x91F0, - 0x6231: 0x91F1, - 0x6232: 0x91F2, - 0x6233: 0xB4C1, - 0x6234: 0xB4F7, - 0x6235: 0x91F3, - 0x6236: 0x91F4, - 0x6237: 0xBBA7, - 0x6238: 0x91F5, - 0x6239: 0x91F6, - 0x623A: 0x91F7, - 0x623B: 0x91F8, - 0x623C: 0x91F9, - 0x623D: 0xECE6, - 0x623E: 0xECE5, - 0x623F: 0xB7BF, - 0x6240: 0xCBF9, - 0x6241: 0xB1E2, - 0x6242: 0x91FA, - 0x6243: 0xECE7, - 0x6244: 0x91FB, - 0x6245: 0x91FC, - 0x6246: 0x91FD, - 0x6247: 0xC9C8, - 0x6248: 0xECE8, - 0x6249: 0xECE9, - 0x624A: 0x91FE, - 0x624B: 0xCAD6, - 0x624C: 0xDED0, - 0x624D: 0xB2C5, - 0x624E: 0xD4FA, - 0x624F: 0x9240, - 0x6250: 0x9241, - 0x6251: 0xC6CB, - 0x6252: 0xB0C7, - 0x6253: 0xB4F2, - 0x6254: 0xC8D3, - 0x6255: 0x9242, - 0x6256: 0x9243, - 0x6257: 0x9244, - 0x6258: 0xCDD0, - 0x6259: 0x9245, - 0x625A: 0x9246, - 0x625B: 0xBFB8, - 0x625C: 0x9247, - 0x625D: 0x9248, - 0x625E: 0x9249, - 0x625F: 0x924A, - 0x6260: 0x924B, - 0x6261: 0x924C, - 0x6262: 0x924D, - 0x6263: 0xBFDB, - 0x6264: 0x924E, - 0x6265: 0x924F, - 0x6266: 0xC7A4, - 0x6267: 0xD6B4, - 0x6268: 0x9250, - 0x6269: 0xC0A9, - 0x626A: 0xDED1, - 0x626B: 0xC9A8, - 0x626C: 0xD1EF, - 0x626D: 0xC5A4, - 0x626E: 0xB0E7, - 0x626F: 0xB3B6, - 0x6270: 0xC8C5, - 0x6271: 0x9251, - 0x6272: 0x9252, - 0x6273: 0xB0E2, - 0x6274: 0x9253, - 0x6275: 0x9254, - 0x6276: 0xB7F6, - 0x6277: 0x9255, - 0x6278: 0x9256, - 0x6279: 0xC5FA, - 0x627A: 0x9257, - 0x627B: 0x9258, - 0x627C: 0xB6F3, - 0x627D: 0x9259, - 0x627E: 0xD5D2, - 0x627F: 0xB3D0, - 0x6280: 0xBCBC, - 0x6281: 0x925A, - 0x6282: 0x925B, - 0x6283: 0x925C, - 0x6284: 0xB3AD, - 0x6285: 0x925D, - 0x6286: 0x925E, - 0x6287: 0x925F, - 0x6288: 0x9260, - 0x6289: 0xBEF1, - 0x628A: 0xB0D1, - 0x628B: 0x9261, - 0x628C: 0x9262, - 0x628D: 0x9263, - 0x628E: 0x9264, - 0x628F: 0x9265, - 0x6290: 0x9266, - 0x6291: 0xD2D6, - 0x6292: 0xCAE3, - 0x6293: 0xD7A5, - 0x6294: 0x9267, - 0x6295: 0xCDB6, - 0x6296: 0xB6B6, - 0x6297: 0xBFB9, - 0x6298: 0xD5DB, - 0x6299: 0x9268, - 0x629A: 0xB8A7, - 0x629B: 0xC5D7, - 0x629C: 0x9269, - 0x629D: 0x926A, - 0x629E: 0x926B, - 0x629F: 0xDED2, - 0x62A0: 0xBFD9, - 0x62A1: 0xC2D5, - 0x62A2: 0xC7C0, - 0x62A3: 0x926C, - 0x62A4: 0xBBA4, - 0x62A5: 0xB1A8, - 0x62A6: 0x926D, - 0x62A7: 0x926E, - 0x62A8: 0xC5EA, - 0x62A9: 0x926F, - 0x62AA: 0x9270, - 0x62AB: 0xC5FB, - 0x62AC: 0xCCA7, - 0x62AD: 0x9271, - 0x62AE: 0x9272, - 0x62AF: 0x9273, - 0x62B0: 0x9274, - 0x62B1: 0xB1A7, - 0x62B2: 0x9275, - 0x62B3: 0x9276, - 0x62B4: 0x9277, - 0x62B5: 0xB5D6, - 0x62B6: 0x9278, - 0x62B7: 0x9279, - 0x62B8: 0x927A, - 0x62B9: 0xC4A8, - 0x62BA: 0x927B, - 0x62BB: 0xDED3, - 0x62BC: 0xD1BA, - 0x62BD: 0xB3E9, - 0x62BE: 0x927C, - 0x62BF: 0xC3F2, - 0x62C0: 0x927D, - 0x62C1: 0x927E, - 0x62C2: 0xB7F7, - 0x62C3: 0x9280, - 0x62C4: 0xD6F4, - 0x62C5: 0xB5A3, - 0x62C6: 0xB2F0, - 0x62C7: 0xC4B4, - 0x62C8: 0xC4E9, - 0x62C9: 0xC0AD, - 0x62CA: 0xDED4, - 0x62CB: 0x9281, - 0x62CC: 0xB0E8, - 0x62CD: 0xC5C4, - 0x62CE: 0xC1E0, - 0x62CF: 0x9282, - 0x62D0: 0xB9D5, - 0x62D1: 0x9283, - 0x62D2: 0xBEDC, - 0x62D3: 0xCDD8, - 0x62D4: 0xB0CE, - 0x62D5: 0x9284, - 0x62D6: 0xCDCF, - 0x62D7: 0xDED6, - 0x62D8: 0xBED0, - 0x62D9: 0xD7BE, - 0x62DA: 0xDED5, - 0x62DB: 0xD5D0, - 0x62DC: 0xB0DD, - 0x62DD: 0x9285, - 0x62DE: 0x9286, - 0x62DF: 0xC4E2, - 0x62E0: 0x9287, - 0x62E1: 0x9288, - 0x62E2: 0xC2A3, - 0x62E3: 0xBCF0, - 0x62E4: 0x9289, - 0x62E5: 0xD3B5, - 0x62E6: 0xC0B9, - 0x62E7: 0xC5A1, - 0x62E8: 0xB2A6, - 0x62E9: 0xD4F1, - 0x62EA: 0x928A, - 0x62EB: 0x928B, - 0x62EC: 0xC0A8, - 0x62ED: 0xCAC3, - 0x62EE: 0xDED7, - 0x62EF: 0xD5FC, - 0x62F0: 0x928C, - 0x62F1: 0xB9B0, - 0x62F2: 0x928D, - 0x62F3: 0xC8AD, - 0x62F4: 0xCBA9, - 0x62F5: 0x928E, - 0x62F6: 0xDED9, - 0x62F7: 0xBFBD, - 0x62F8: 0x928F, - 0x62F9: 0x9290, - 0x62FA: 0x9291, - 0x62FB: 0x9292, - 0x62FC: 0xC6B4, - 0x62FD: 0xD7A7, - 0x62FE: 0xCAB0, - 0x62FF: 0xC4C3, - 0x6300: 0x9293, - 0x6301: 0xB3D6, - 0x6302: 0xB9D2, - 0x6303: 0x9294, - 0x6304: 0x9295, - 0x6305: 0x9296, - 0x6306: 0x9297, - 0x6307: 0xD6B8, - 0x6308: 0xEAFC, - 0x6309: 0xB0B4, - 0x630A: 0x9298, - 0x630B: 0x9299, - 0x630C: 0x929A, - 0x630D: 0x929B, - 0x630E: 0xBFE6, - 0x630F: 0x929C, - 0x6310: 0x929D, - 0x6311: 0xCCF4, - 0x6312: 0x929E, - 0x6313: 0x929F, - 0x6314: 0x92A0, - 0x6315: 0x92A1, - 0x6316: 0xCDDA, - 0x6317: 0x92A2, - 0x6318: 0x92A3, - 0x6319: 0x92A4, - 0x631A: 0xD6BF, - 0x631B: 0xC2CE, - 0x631C: 0x92A5, - 0x631D: 0xCECE, - 0x631E: 0xCCA2, - 0x631F: 0xD0AE, - 0x6320: 0xC4D3, - 0x6321: 0xB5B2, - 0x6322: 0xDED8, - 0x6323: 0xD5F5, - 0x6324: 0xBCB7, - 0x6325: 0xBBD3, - 0x6326: 0x92A6, - 0x6327: 0x92A7, - 0x6328: 0xB0A4, - 0x6329: 0x92A8, - 0x632A: 0xC5B2, - 0x632B: 0xB4EC, - 0x632C: 0x92A9, - 0x632D: 0x92AA, - 0x632E: 0x92AB, - 0x632F: 0xD5F1, - 0x6330: 0x92AC, - 0x6331: 0x92AD, - 0x6332: 0xEAFD, - 0x6333: 0x92AE, - 0x6334: 0x92AF, - 0x6335: 0x92B0, - 0x6336: 0x92B1, - 0x6337: 0x92B2, - 0x6338: 0x92B3, - 0x6339: 0xDEDA, - 0x633A: 0xCDA6, - 0x633B: 0x92B4, - 0x633C: 0x92B5, - 0x633D: 0xCDEC, - 0x633E: 0x92B6, - 0x633F: 0x92B7, - 0x6340: 0x92B8, - 0x6341: 0x92B9, - 0x6342: 0xCEE6, - 0x6343: 0xDEDC, - 0x6344: 0x92BA, - 0x6345: 0xCDB1, - 0x6346: 0xC0A6, - 0x6347: 0x92BB, - 0x6348: 0x92BC, - 0x6349: 0xD7BD, - 0x634A: 0x92BD, - 0x634B: 0xDEDB, - 0x634C: 0xB0C6, - 0x634D: 0xBAB4, - 0x634E: 0xC9D3, - 0x634F: 0xC4F3, - 0x6350: 0xBEE8, - 0x6351: 0x92BE, - 0x6352: 0x92BF, - 0x6353: 0x92C0, - 0x6354: 0x92C1, - 0x6355: 0xB2B6, - 0x6356: 0x92C2, - 0x6357: 0x92C3, - 0x6358: 0x92C4, - 0x6359: 0x92C5, - 0x635A: 0x92C6, - 0x635B: 0x92C7, - 0x635C: 0x92C8, - 0x635D: 0x92C9, - 0x635E: 0xC0CC, - 0x635F: 0xCBF0, - 0x6360: 0x92CA, - 0x6361: 0xBCF1, - 0x6362: 0xBBBB, - 0x6363: 0xB5B7, - 0x6364: 0x92CB, - 0x6365: 0x92CC, - 0x6366: 0x92CD, - 0x6367: 0xC5F5, - 0x6368: 0x92CE, - 0x6369: 0xDEE6, - 0x636A: 0x92CF, - 0x636B: 0x92D0, - 0x636C: 0x92D1, - 0x636D: 0xDEE3, - 0x636E: 0xBEDD, - 0x636F: 0x92D2, - 0x6370: 0x92D3, - 0x6371: 0xDEDF, - 0x6372: 0x92D4, - 0x6373: 0x92D5, - 0x6374: 0x92D6, - 0x6375: 0x92D7, - 0x6376: 0xB4B7, - 0x6377: 0xBDDD, - 0x6378: 0x92D8, - 0x6379: 0x92D9, - 0x637A: 0xDEE0, - 0x637B: 0xC4ED, - 0x637C: 0x92DA, - 0x637D: 0x92DB, - 0x637E: 0x92DC, - 0x637F: 0x92DD, - 0x6380: 0xCFC6, - 0x6381: 0x92DE, - 0x6382: 0xB5E0, - 0x6383: 0x92DF, - 0x6384: 0x92E0, - 0x6385: 0x92E1, - 0x6386: 0x92E2, - 0x6387: 0xB6DE, - 0x6388: 0xCADA, - 0x6389: 0xB5F4, - 0x638A: 0xDEE5, - 0x638B: 0x92E3, - 0x638C: 0xD5C6, - 0x638D: 0x92E4, - 0x638E: 0xDEE1, - 0x638F: 0xCCCD, - 0x6390: 0xC6FE, - 0x6391: 0x92E5, - 0x6392: 0xC5C5, - 0x6393: 0x92E6, - 0x6394: 0x92E7, - 0x6395: 0x92E8, - 0x6396: 0xD2B4, - 0x6397: 0x92E9, - 0x6398: 0xBEF2, - 0x6399: 0x92EA, - 0x639A: 0x92EB, - 0x639B: 0x92EC, - 0x639C: 0x92ED, - 0x639D: 0x92EE, - 0x639E: 0x92EF, - 0x639F: 0x92F0, - 0x63A0: 0xC2D3, - 0x63A1: 0x92F1, - 0x63A2: 0xCCBD, - 0x63A3: 0xB3B8, - 0x63A4: 0x92F2, - 0x63A5: 0xBDD3, - 0x63A6: 0x92F3, - 0x63A7: 0xBFD8, - 0x63A8: 0xCDC6, - 0x63A9: 0xD1DA, - 0x63AA: 0xB4EB, - 0x63AB: 0x92F4, - 0x63AC: 0xDEE4, - 0x63AD: 0xDEDD, - 0x63AE: 0xDEE7, - 0x63AF: 0x92F5, - 0x63B0: 0xEAFE, - 0x63B1: 0x92F6, - 0x63B2: 0x92F7, - 0x63B3: 0xC2B0, - 0x63B4: 0xDEE2, - 0x63B5: 0x92F8, - 0x63B6: 0x92F9, - 0x63B7: 0xD6C0, - 0x63B8: 0xB5A7, - 0x63B9: 0x92FA, - 0x63BA: 0xB2F4, - 0x63BB: 0x92FB, - 0x63BC: 0xDEE8, - 0x63BD: 0x92FC, - 0x63BE: 0xDEF2, - 0x63BF: 0x92FD, - 0x63C0: 0x92FE, - 0x63C1: 0x9340, - 0x63C2: 0x9341, - 0x63C3: 0x9342, - 0x63C4: 0xDEED, - 0x63C5: 0x9343, - 0x63C6: 0xDEF1, - 0x63C7: 0x9344, - 0x63C8: 0x9345, - 0x63C9: 0xC8E0, - 0x63CA: 0x9346, - 0x63CB: 0x9347, - 0x63CC: 0x9348, - 0x63CD: 0xD7E1, - 0x63CE: 0xDEEF, - 0x63CF: 0xC3E8, - 0x63D0: 0xCCE1, - 0x63D1: 0x9349, - 0x63D2: 0xB2E5, - 0x63D3: 0x934A, - 0x63D4: 0x934B, - 0x63D5: 0x934C, - 0x63D6: 0xD2BE, - 0x63D7: 0x934D, - 0x63D8: 0x934E, - 0x63D9: 0x934F, - 0x63DA: 0x9350, - 0x63DB: 0x9351, - 0x63DC: 0x9352, - 0x63DD: 0x9353, - 0x63DE: 0xDEEE, - 0x63DF: 0x9354, - 0x63E0: 0xDEEB, - 0x63E1: 0xCED5, - 0x63E2: 0x9355, - 0x63E3: 0xB4A7, - 0x63E4: 0x9356, - 0x63E5: 0x9357, - 0x63E6: 0x9358, - 0x63E7: 0x9359, - 0x63E8: 0x935A, - 0x63E9: 0xBFAB, - 0x63EA: 0xBEBE, - 0x63EB: 0x935B, - 0x63EC: 0x935C, - 0x63ED: 0xBDD2, - 0x63EE: 0x935D, - 0x63EF: 0x935E, - 0x63F0: 0x935F, - 0x63F1: 0x9360, - 0x63F2: 0xDEE9, - 0x63F3: 0x9361, - 0x63F4: 0xD4AE, - 0x63F5: 0x9362, - 0x63F6: 0xDEDE, - 0x63F7: 0x9363, - 0x63F8: 0xDEEA, - 0x63F9: 0x9364, - 0x63FA: 0x9365, - 0x63FB: 0x9366, - 0x63FC: 0x9367, - 0x63FD: 0xC0BF, - 0x63FE: 0x9368, - 0x63FF: 0xDEEC, - 0x6400: 0xB2F3, - 0x6401: 0xB8E9, - 0x6402: 0xC2A7, - 0x6403: 0x9369, - 0x6404: 0x936A, - 0x6405: 0xBDC1, - 0x6406: 0x936B, - 0x6407: 0x936C, - 0x6408: 0x936D, - 0x6409: 0x936E, - 0x640A: 0x936F, - 0x640B: 0xDEF5, - 0x640C: 0xDEF8, - 0x640D: 0x9370, - 0x640E: 0x9371, - 0x640F: 0xB2AB, - 0x6410: 0xB4A4, - 0x6411: 0x9372, - 0x6412: 0x9373, - 0x6413: 0xB4EA, - 0x6414: 0xC9A6, - 0x6415: 0x9374, - 0x6416: 0x9375, - 0x6417: 0x9376, - 0x6418: 0x9377, - 0x6419: 0x9378, - 0x641A: 0x9379, - 0x641B: 0xDEF6, - 0x641C: 0xCBD1, - 0x641D: 0x937A, - 0x641E: 0xB8E3, - 0x641F: 0x937B, - 0x6420: 0xDEF7, - 0x6421: 0xDEFA, - 0x6422: 0x937C, - 0x6423: 0x937D, - 0x6424: 0x937E, - 0x6425: 0x9380, - 0x6426: 0xDEF9, - 0x6427: 0x9381, - 0x6428: 0x9382, - 0x6429: 0x9383, - 0x642A: 0xCCC2, - 0x642B: 0x9384, - 0x642C: 0xB0E1, - 0x642D: 0xB4EE, - 0x642E: 0x9385, - 0x642F: 0x9386, - 0x6430: 0x9387, - 0x6431: 0x9388, - 0x6432: 0x9389, - 0x6433: 0x938A, - 0x6434: 0xE5BA, - 0x6435: 0x938B, - 0x6436: 0x938C, - 0x6437: 0x938D, - 0x6438: 0x938E, - 0x6439: 0x938F, - 0x643A: 0xD0AF, - 0x643B: 0x9390, - 0x643C: 0x9391, - 0x643D: 0xB2EB, - 0x643E: 0x9392, - 0x643F: 0xEBA1, - 0x6440: 0x9393, - 0x6441: 0xDEF4, - 0x6442: 0x9394, - 0x6443: 0x9395, - 0x6444: 0xC9E3, - 0x6445: 0xDEF3, - 0x6446: 0xB0DA, - 0x6447: 0xD2A1, - 0x6448: 0xB1F7, - 0x6449: 0x9396, - 0x644A: 0xCCAF, - 0x644B: 0x9397, - 0x644C: 0x9398, - 0x644D: 0x9399, - 0x644E: 0x939A, - 0x644F: 0x939B, - 0x6450: 0x939C, - 0x6451: 0x939D, - 0x6452: 0xDEF0, - 0x6453: 0x939E, - 0x6454: 0xCBA4, - 0x6455: 0x939F, - 0x6456: 0x93A0, - 0x6457: 0x93A1, - 0x6458: 0xD5AA, - 0x6459: 0x93A2, - 0x645A: 0x93A3, - 0x645B: 0x93A4, - 0x645C: 0x93A5, - 0x645D: 0x93A6, - 0x645E: 0xDEFB, - 0x645F: 0x93A7, - 0x6460: 0x93A8, - 0x6461: 0x93A9, - 0x6462: 0x93AA, - 0x6463: 0x93AB, - 0x6464: 0x93AC, - 0x6465: 0x93AD, - 0x6466: 0x93AE, - 0x6467: 0xB4DD, - 0x6468: 0x93AF, - 0x6469: 0xC4A6, - 0x646A: 0x93B0, - 0x646B: 0x93B1, - 0x646C: 0x93B2, - 0x646D: 0xDEFD, - 0x646E: 0x93B3, - 0x646F: 0x93B4, - 0x6470: 0x93B5, - 0x6471: 0x93B6, - 0x6472: 0x93B7, - 0x6473: 0x93B8, - 0x6474: 0x93B9, - 0x6475: 0x93BA, - 0x6476: 0x93BB, - 0x6477: 0x93BC, - 0x6478: 0xC3FE, - 0x6479: 0xC4A1, - 0x647A: 0xDFA1, - 0x647B: 0x93BD, - 0x647C: 0x93BE, - 0x647D: 0x93BF, - 0x647E: 0x93C0, - 0x647F: 0x93C1, - 0x6480: 0x93C2, - 0x6481: 0x93C3, - 0x6482: 0xC1CC, - 0x6483: 0x93C4, - 0x6484: 0xDEFC, - 0x6485: 0xBEEF, - 0x6486: 0x93C5, - 0x6487: 0xC6B2, - 0x6488: 0x93C6, - 0x6489: 0x93C7, - 0x648A: 0x93C8, - 0x648B: 0x93C9, - 0x648C: 0x93CA, - 0x648D: 0x93CB, - 0x648E: 0x93CC, - 0x648F: 0x93CD, - 0x6490: 0x93CE, - 0x6491: 0xB3C5, - 0x6492: 0xC8F6, - 0x6493: 0x93CF, - 0x6494: 0x93D0, - 0x6495: 0xCBBA, - 0x6496: 0xDEFE, - 0x6497: 0x93D1, - 0x6498: 0x93D2, - 0x6499: 0xDFA4, - 0x649A: 0x93D3, - 0x649B: 0x93D4, - 0x649C: 0x93D5, - 0x649D: 0x93D6, - 0x649E: 0xD7B2, - 0x649F: 0x93D7, - 0x64A0: 0x93D8, - 0x64A1: 0x93D9, - 0x64A2: 0x93DA, - 0x64A3: 0x93DB, - 0x64A4: 0xB3B7, - 0x64A5: 0x93DC, - 0x64A6: 0x93DD, - 0x64A7: 0x93DE, - 0x64A8: 0x93DF, - 0x64A9: 0xC1C3, - 0x64AA: 0x93E0, - 0x64AB: 0x93E1, - 0x64AC: 0xC7CB, - 0x64AD: 0xB2A5, - 0x64AE: 0xB4E9, - 0x64AF: 0x93E2, - 0x64B0: 0xD7AB, - 0x64B1: 0x93E3, - 0x64B2: 0x93E4, - 0x64B3: 0x93E5, - 0x64B4: 0x93E6, - 0x64B5: 0xC4EC, - 0x64B6: 0x93E7, - 0x64B7: 0xDFA2, - 0x64B8: 0xDFA3, - 0x64B9: 0x93E8, - 0x64BA: 0xDFA5, - 0x64BB: 0x93E9, - 0x64BC: 0xBAB3, - 0x64BD: 0x93EA, - 0x64BE: 0x93EB, - 0x64BF: 0x93EC, - 0x64C0: 0xDFA6, - 0x64C1: 0x93ED, - 0x64C2: 0xC0DE, - 0x64C3: 0x93EE, - 0x64C4: 0x93EF, - 0x64C5: 0xC9C3, - 0x64C6: 0x93F0, - 0x64C7: 0x93F1, - 0x64C8: 0x93F2, - 0x64C9: 0x93F3, - 0x64CA: 0x93F4, - 0x64CB: 0x93F5, - 0x64CC: 0x93F6, - 0x64CD: 0xB2D9, - 0x64CE: 0xC7E6, - 0x64CF: 0x93F7, - 0x64D0: 0xDFA7, - 0x64D1: 0x93F8, - 0x64D2: 0xC7DC, - 0x64D3: 0x93F9, - 0x64D4: 0x93FA, - 0x64D5: 0x93FB, - 0x64D6: 0x93FC, - 0x64D7: 0xDFA8, - 0x64D8: 0xEBA2, - 0x64D9: 0x93FD, - 0x64DA: 0x93FE, - 0x64DB: 0x9440, - 0x64DC: 0x9441, - 0x64DD: 0x9442, - 0x64DE: 0xCBD3, - 0x64DF: 0x9443, - 0x64E0: 0x9444, - 0x64E1: 0x9445, - 0x64E2: 0xDFAA, - 0x64E3: 0x9446, - 0x64E4: 0xDFA9, - 0x64E5: 0x9447, - 0x64E6: 0xB2C1, - 0x64E7: 0x9448, - 0x64E8: 0x9449, - 0x64E9: 0x944A, - 0x64EA: 0x944B, - 0x64EB: 0x944C, - 0x64EC: 0x944D, - 0x64ED: 0x944E, - 0x64EE: 0x944F, - 0x64EF: 0x9450, - 0x64F0: 0x9451, - 0x64F1: 0x9452, - 0x64F2: 0x9453, - 0x64F3: 0x9454, - 0x64F4: 0x9455, - 0x64F5: 0x9456, - 0x64F6: 0x9457, - 0x64F7: 0x9458, - 0x64F8: 0x9459, - 0x64F9: 0x945A, - 0x64FA: 0x945B, - 0x64FB: 0x945C, - 0x64FC: 0x945D, - 0x64FD: 0x945E, - 0x64FE: 0x945F, - 0x64FF: 0x9460, - 0x6500: 0xC5CA, - 0x6501: 0x9461, - 0x6502: 0x9462, - 0x6503: 0x9463, - 0x6504: 0x9464, - 0x6505: 0x9465, - 0x6506: 0x9466, - 0x6507: 0x9467, - 0x6508: 0x9468, - 0x6509: 0xDFAB, - 0x650A: 0x9469, - 0x650B: 0x946A, - 0x650C: 0x946B, - 0x650D: 0x946C, - 0x650E: 0x946D, - 0x650F: 0x946E, - 0x6510: 0x946F, - 0x6511: 0x9470, - 0x6512: 0xD4DC, - 0x6513: 0x9471, - 0x6514: 0x9472, - 0x6515: 0x9473, - 0x6516: 0x9474, - 0x6517: 0x9475, - 0x6518: 0xC8C1, - 0x6519: 0x9476, - 0x651A: 0x9477, - 0x651B: 0x9478, - 0x651C: 0x9479, - 0x651D: 0x947A, - 0x651E: 0x947B, - 0x651F: 0x947C, - 0x6520: 0x947D, - 0x6521: 0x947E, - 0x6522: 0x9480, - 0x6523: 0x9481, - 0x6524: 0x9482, - 0x6525: 0xDFAC, - 0x6526: 0x9483, - 0x6527: 0x9484, - 0x6528: 0x9485, - 0x6529: 0x9486, - 0x652A: 0x9487, - 0x652B: 0xBEF0, - 0x652C: 0x9488, - 0x652D: 0x9489, - 0x652E: 0xDFAD, - 0x652F: 0xD6A7, - 0x6530: 0x948A, - 0x6531: 0x948B, - 0x6532: 0x948C, - 0x6533: 0x948D, - 0x6534: 0xEAB7, - 0x6535: 0xEBB6, - 0x6536: 0xCAD5, - 0x6537: 0x948E, - 0x6538: 0xD8FC, - 0x6539: 0xB8C4, - 0x653A: 0x948F, - 0x653B: 0xB9A5, - 0x653C: 0x9490, - 0x653D: 0x9491, - 0x653E: 0xB7C5, - 0x653F: 0xD5FE, - 0x6540: 0x9492, - 0x6541: 0x9493, - 0x6542: 0x9494, - 0x6543: 0x9495, - 0x6544: 0x9496, - 0x6545: 0xB9CA, - 0x6546: 0x9497, - 0x6547: 0x9498, - 0x6548: 0xD0A7, - 0x6549: 0xF4CD, - 0x654A: 0x9499, - 0x654B: 0x949A, - 0x654C: 0xB5D0, - 0x654D: 0x949B, - 0x654E: 0x949C, - 0x654F: 0xC3F4, - 0x6550: 0x949D, - 0x6551: 0xBEC8, - 0x6552: 0x949E, - 0x6553: 0x949F, - 0x6554: 0x94A0, - 0x6555: 0xEBB7, - 0x6556: 0xB0BD, - 0x6557: 0x94A1, - 0x6558: 0x94A2, - 0x6559: 0xBDCC, - 0x655A: 0x94A3, - 0x655B: 0xC1B2, - 0x655C: 0x94A4, - 0x655D: 0xB1D6, - 0x655E: 0xB3A8, - 0x655F: 0x94A5, - 0x6560: 0x94A6, - 0x6561: 0x94A7, - 0x6562: 0xB8D2, - 0x6563: 0xC9A2, - 0x6564: 0x94A8, - 0x6565: 0x94A9, - 0x6566: 0xB6D8, - 0x6567: 0x94AA, - 0x6568: 0x94AB, - 0x6569: 0x94AC, - 0x656A: 0x94AD, - 0x656B: 0xEBB8, - 0x656C: 0xBEB4, - 0x656D: 0x94AE, - 0x656E: 0x94AF, - 0x656F: 0x94B0, - 0x6570: 0xCAFD, - 0x6571: 0x94B1, - 0x6572: 0xC7C3, - 0x6573: 0x94B2, - 0x6574: 0xD5FB, - 0x6575: 0x94B3, - 0x6576: 0x94B4, - 0x6577: 0xB7F3, - 0x6578: 0x94B5, - 0x6579: 0x94B6, - 0x657A: 0x94B7, - 0x657B: 0x94B8, - 0x657C: 0x94B9, - 0x657D: 0x94BA, - 0x657E: 0x94BB, - 0x657F: 0x94BC, - 0x6580: 0x94BD, - 0x6581: 0x94BE, - 0x6582: 0x94BF, - 0x6583: 0x94C0, - 0x6584: 0x94C1, - 0x6585: 0x94C2, - 0x6586: 0x94C3, - 0x6587: 0xCEC4, - 0x6588: 0x94C4, - 0x6589: 0x94C5, - 0x658A: 0x94C6, - 0x658B: 0xD5AB, - 0x658C: 0xB1F3, - 0x658D: 0x94C7, - 0x658E: 0x94C8, - 0x658F: 0x94C9, - 0x6590: 0xECB3, - 0x6591: 0xB0DF, - 0x6592: 0x94CA, - 0x6593: 0xECB5, - 0x6594: 0x94CB, - 0x6595: 0x94CC, - 0x6596: 0x94CD, - 0x6597: 0xB6B7, - 0x6598: 0x94CE, - 0x6599: 0xC1CF, - 0x659A: 0x94CF, - 0x659B: 0xF5FA, - 0x659C: 0xD0B1, - 0x659D: 0x94D0, - 0x659E: 0x94D1, - 0x659F: 0xD5E5, - 0x65A0: 0x94D2, - 0x65A1: 0xCED3, - 0x65A2: 0x94D3, - 0x65A3: 0x94D4, - 0x65A4: 0xBDEF, - 0x65A5: 0xB3E2, - 0x65A6: 0x94D5, - 0x65A7: 0xB8AB, - 0x65A8: 0x94D6, - 0x65A9: 0xD5B6, - 0x65AA: 0x94D7, - 0x65AB: 0xEDBD, - 0x65AC: 0x94D8, - 0x65AD: 0xB6CF, - 0x65AE: 0x94D9, - 0x65AF: 0xCBB9, - 0x65B0: 0xD0C2, - 0x65B1: 0x94DA, - 0x65B2: 0x94DB, - 0x65B3: 0x94DC, - 0x65B4: 0x94DD, - 0x65B5: 0x94DE, - 0x65B6: 0x94DF, - 0x65B7: 0x94E0, - 0x65B8: 0x94E1, - 0x65B9: 0xB7BD, - 0x65BA: 0x94E2, - 0x65BB: 0x94E3, - 0x65BC: 0xECB6, - 0x65BD: 0xCAA9, - 0x65BE: 0x94E4, - 0x65BF: 0x94E5, - 0x65C0: 0x94E6, - 0x65C1: 0xC5D4, - 0x65C2: 0x94E7, - 0x65C3: 0xECB9, - 0x65C4: 0xECB8, - 0x65C5: 0xC2C3, - 0x65C6: 0xECB7, - 0x65C7: 0x94E8, - 0x65C8: 0x94E9, - 0x65C9: 0x94EA, - 0x65CA: 0x94EB, - 0x65CB: 0xD0FD, - 0x65CC: 0xECBA, - 0x65CD: 0x94EC, - 0x65CE: 0xECBB, - 0x65CF: 0xD7E5, - 0x65D0: 0x94ED, - 0x65D1: 0x94EE, - 0x65D2: 0xECBC, - 0x65D3: 0x94EF, - 0x65D4: 0x94F0, - 0x65D5: 0x94F1, - 0x65D6: 0xECBD, - 0x65D7: 0xC6EC, - 0x65D8: 0x94F2, - 0x65D9: 0x94F3, - 0x65DA: 0x94F4, - 0x65DB: 0x94F5, - 0x65DC: 0x94F6, - 0x65DD: 0x94F7, - 0x65DE: 0x94F8, - 0x65DF: 0x94F9, - 0x65E0: 0xCEDE, - 0x65E1: 0x94FA, - 0x65E2: 0xBCC8, - 0x65E3: 0x94FB, - 0x65E4: 0x94FC, - 0x65E5: 0xC8D5, - 0x65E6: 0xB5A9, - 0x65E7: 0xBEC9, - 0x65E8: 0xD6BC, - 0x65E9: 0xD4E7, - 0x65EA: 0x94FD, - 0x65EB: 0x94FE, - 0x65EC: 0xD1AE, - 0x65ED: 0xD0F1, - 0x65EE: 0xEAB8, - 0x65EF: 0xEAB9, - 0x65F0: 0xEABA, - 0x65F1: 0xBAB5, - 0x65F2: 0x9540, - 0x65F3: 0x9541, - 0x65F4: 0x9542, - 0x65F5: 0x9543, - 0x65F6: 0xCAB1, - 0x65F7: 0xBFF5, - 0x65F8: 0x9544, - 0x65F9: 0x9545, - 0x65FA: 0xCDFA, - 0x65FB: 0x9546, - 0x65FC: 0x9547, - 0x65FD: 0x9548, - 0x65FE: 0x9549, - 0x65FF: 0x954A, - 0x6600: 0xEAC0, - 0x6601: 0x954B, - 0x6602: 0xB0BA, - 0x6603: 0xEABE, - 0x6604: 0x954C, - 0x6605: 0x954D, - 0x6606: 0xC0A5, - 0x6607: 0x954E, - 0x6608: 0x954F, - 0x6609: 0x9550, - 0x660A: 0xEABB, - 0x660B: 0x9551, - 0x660C: 0xB2FD, - 0x660D: 0x9552, - 0x660E: 0xC3F7, - 0x660F: 0xBBE8, - 0x6610: 0x9553, - 0x6611: 0x9554, - 0x6612: 0x9555, - 0x6613: 0xD2D7, - 0x6614: 0xCEF4, - 0x6615: 0xEABF, - 0x6616: 0x9556, - 0x6617: 0x9557, - 0x6618: 0x9558, - 0x6619: 0xEABC, - 0x661A: 0x9559, - 0x661B: 0x955A, - 0x661C: 0x955B, - 0x661D: 0xEAC3, - 0x661E: 0x955C, - 0x661F: 0xD0C7, - 0x6620: 0xD3B3, - 0x6621: 0x955D, - 0x6622: 0x955E, - 0x6623: 0x955F, - 0x6624: 0x9560, - 0x6625: 0xB4BA, - 0x6626: 0x9561, - 0x6627: 0xC3C1, - 0x6628: 0xD7F2, - 0x6629: 0x9562, - 0x662A: 0x9563, - 0x662B: 0x9564, - 0x662C: 0x9565, - 0x662D: 0xD5D1, - 0x662E: 0x9566, - 0x662F: 0xCAC7, - 0x6630: 0x9567, - 0x6631: 0xEAC5, - 0x6632: 0x9568, - 0x6633: 0x9569, - 0x6634: 0xEAC4, - 0x6635: 0xEAC7, - 0x6636: 0xEAC6, - 0x6637: 0x956A, - 0x6638: 0x956B, - 0x6639: 0x956C, - 0x663A: 0x956D, - 0x663B: 0x956E, - 0x663C: 0xD6E7, - 0x663D: 0x956F, - 0x663E: 0xCFD4, - 0x663F: 0x9570, - 0x6640: 0x9571, - 0x6641: 0xEACB, - 0x6642: 0x9572, - 0x6643: 0xBBCE, - 0x6644: 0x9573, - 0x6645: 0x9574, - 0x6646: 0x9575, - 0x6647: 0x9576, - 0x6648: 0x9577, - 0x6649: 0x9578, - 0x664A: 0x9579, - 0x664B: 0xBDFA, - 0x664C: 0xC9CE, - 0x664D: 0x957A, - 0x664E: 0x957B, - 0x664F: 0xEACC, - 0x6650: 0x957C, - 0x6651: 0x957D, - 0x6652: 0xC9B9, - 0x6653: 0xCFFE, - 0x6654: 0xEACA, - 0x6655: 0xD4CE, - 0x6656: 0xEACD, - 0x6657: 0xEACF, - 0x6658: 0x957E, - 0x6659: 0x9580, - 0x665A: 0xCDED, - 0x665B: 0x9581, - 0x665C: 0x9582, - 0x665D: 0x9583, - 0x665E: 0x9584, - 0x665F: 0xEAC9, - 0x6660: 0x9585, - 0x6661: 0xEACE, - 0x6662: 0x9586, - 0x6663: 0x9587, - 0x6664: 0xCEEE, - 0x6665: 0x9588, - 0x6666: 0xBBDE, - 0x6667: 0x9589, - 0x6668: 0xB3BF, - 0x6669: 0x958A, - 0x666A: 0x958B, - 0x666B: 0x958C, - 0x666C: 0x958D, - 0x666D: 0x958E, - 0x666E: 0xC6D5, - 0x666F: 0xBEB0, - 0x6670: 0xCEFA, - 0x6671: 0x958F, - 0x6672: 0x9590, - 0x6673: 0x9591, - 0x6674: 0xC7E7, - 0x6675: 0x9592, - 0x6676: 0xBEA7, - 0x6677: 0xEAD0, - 0x6678: 0x9593, - 0x6679: 0x9594, - 0x667A: 0xD6C7, - 0x667B: 0x9595, - 0x667C: 0x9596, - 0x667D: 0x9597, - 0x667E: 0xC1C0, - 0x667F: 0x9598, - 0x6680: 0x9599, - 0x6681: 0x959A, - 0x6682: 0xD4DD, - 0x6683: 0x959B, - 0x6684: 0xEAD1, - 0x6685: 0x959C, - 0x6686: 0x959D, - 0x6687: 0xCFBE, - 0x6688: 0x959E, - 0x6689: 0x959F, - 0x668A: 0x95A0, - 0x668B: 0x95A1, - 0x668C: 0xEAD2, - 0x668D: 0x95A2, - 0x668E: 0x95A3, - 0x668F: 0x95A4, - 0x6690: 0x95A5, - 0x6691: 0xCAEE, - 0x6692: 0x95A6, - 0x6693: 0x95A7, - 0x6694: 0x95A8, - 0x6695: 0x95A9, - 0x6696: 0xC5AF, - 0x6697: 0xB0B5, - 0x6698: 0x95AA, - 0x6699: 0x95AB, - 0x669A: 0x95AC, - 0x669B: 0x95AD, - 0x669C: 0x95AE, - 0x669D: 0xEAD4, - 0x669E: 0x95AF, - 0x669F: 0x95B0, - 0x66A0: 0x95B1, - 0x66A1: 0x95B2, - 0x66A2: 0x95B3, - 0x66A3: 0x95B4, - 0x66A4: 0x95B5, - 0x66A5: 0x95B6, - 0x66A6: 0x95B7, - 0x66A7: 0xEAD3, - 0x66A8: 0xF4DF, - 0x66A9: 0x95B8, - 0x66AA: 0x95B9, - 0x66AB: 0x95BA, - 0x66AC: 0x95BB, - 0x66AD: 0x95BC, - 0x66AE: 0xC4BA, - 0x66AF: 0x95BD, - 0x66B0: 0x95BE, - 0x66B1: 0x95BF, - 0x66B2: 0x95C0, - 0x66B3: 0x95C1, - 0x66B4: 0xB1A9, - 0x66B5: 0x95C2, - 0x66B6: 0x95C3, - 0x66B7: 0x95C4, - 0x66B8: 0x95C5, - 0x66B9: 0xE5DF, - 0x66BA: 0x95C6, - 0x66BB: 0x95C7, - 0x66BC: 0x95C8, - 0x66BD: 0x95C9, - 0x66BE: 0xEAD5, - 0x66BF: 0x95CA, - 0x66C0: 0x95CB, - 0x66C1: 0x95CC, - 0x66C2: 0x95CD, - 0x66C3: 0x95CE, - 0x66C4: 0x95CF, - 0x66C5: 0x95D0, - 0x66C6: 0x95D1, - 0x66C7: 0x95D2, - 0x66C8: 0x95D3, - 0x66C9: 0x95D4, - 0x66CA: 0x95D5, - 0x66CB: 0x95D6, - 0x66CC: 0x95D7, - 0x66CD: 0x95D8, - 0x66CE: 0x95D9, - 0x66CF: 0x95DA, - 0x66D0: 0x95DB, - 0x66D1: 0x95DC, - 0x66D2: 0x95DD, - 0x66D3: 0x95DE, - 0x66D4: 0x95DF, - 0x66D5: 0x95E0, - 0x66D6: 0x95E1, - 0x66D7: 0x95E2, - 0x66D8: 0x95E3, - 0x66D9: 0xCAEF, - 0x66DA: 0x95E4, - 0x66DB: 0xEAD6, - 0x66DC: 0xEAD7, - 0x66DD: 0xC6D8, - 0x66DE: 0x95E5, - 0x66DF: 0x95E6, - 0x66E0: 0x95E7, - 0x66E1: 0x95E8, - 0x66E2: 0x95E9, - 0x66E3: 0x95EA, - 0x66E4: 0x95EB, - 0x66E5: 0x95EC, - 0x66E6: 0xEAD8, - 0x66E7: 0x95ED, - 0x66E8: 0x95EE, - 0x66E9: 0xEAD9, - 0x66EA: 0x95EF, - 0x66EB: 0x95F0, - 0x66EC: 0x95F1, - 0x66ED: 0x95F2, - 0x66EE: 0x95F3, - 0x66EF: 0x95F4, - 0x66F0: 0xD4BB, - 0x66F1: 0x95F5, - 0x66F2: 0xC7FA, - 0x66F3: 0xD2B7, - 0x66F4: 0xB8FC, - 0x66F5: 0x95F6, - 0x66F6: 0x95F7, - 0x66F7: 0xEAC2, - 0x66F8: 0x95F8, - 0x66F9: 0xB2DC, - 0x66FA: 0x95F9, - 0x66FB: 0x95FA, - 0x66FC: 0xC2FC, - 0x66FD: 0x95FB, - 0x66FE: 0xD4F8, - 0x66FF: 0xCCE6, - 0x6700: 0xD7EE, - 0x6701: 0x95FC, - 0x6702: 0x95FD, - 0x6703: 0x95FE, - 0x6704: 0x9640, - 0x6705: 0x9641, - 0x6706: 0x9642, - 0x6707: 0x9643, - 0x6708: 0xD4C2, - 0x6709: 0xD3D0, - 0x670A: 0xEBC3, - 0x670B: 0xC5F3, - 0x670C: 0x9644, - 0x670D: 0xB7FE, - 0x670E: 0x9645, - 0x670F: 0x9646, - 0x6710: 0xEBD4, - 0x6711: 0x9647, - 0x6712: 0x9648, - 0x6713: 0x9649, - 0x6714: 0xCBB7, - 0x6715: 0xEBDE, - 0x6716: 0x964A, - 0x6717: 0xC0CA, - 0x6718: 0x964B, - 0x6719: 0x964C, - 0x671A: 0x964D, - 0x671B: 0xCDFB, - 0x671C: 0x964E, - 0x671D: 0xB3AF, - 0x671E: 0x964F, - 0x671F: 0xC6DA, - 0x6720: 0x9650, - 0x6721: 0x9651, - 0x6722: 0x9652, - 0x6723: 0x9653, - 0x6724: 0x9654, - 0x6725: 0x9655, - 0x6726: 0xEBFC, - 0x6727: 0x9656, - 0x6728: 0xC4BE, - 0x6729: 0x9657, - 0x672A: 0xCEB4, - 0x672B: 0xC4A9, - 0x672C: 0xB1BE, - 0x672D: 0xD4FD, - 0x672E: 0x9658, - 0x672F: 0xCAF5, - 0x6730: 0x9659, - 0x6731: 0xD6EC, - 0x6732: 0x965A, - 0x6733: 0x965B, - 0x6734: 0xC6D3, - 0x6735: 0xB6E4, - 0x6736: 0x965C, - 0x6737: 0x965D, - 0x6738: 0x965E, - 0x6739: 0x965F, - 0x673A: 0xBBFA, - 0x673B: 0x9660, - 0x673C: 0x9661, - 0x673D: 0xD0E0, - 0x673E: 0x9662, - 0x673F: 0x9663, - 0x6740: 0xC9B1, - 0x6741: 0x9664, - 0x6742: 0xD4D3, - 0x6743: 0xC8A8, - 0x6744: 0x9665, - 0x6745: 0x9666, - 0x6746: 0xB8CB, - 0x6747: 0x9667, - 0x6748: 0xE8BE, - 0x6749: 0xC9BC, - 0x674A: 0x9668, - 0x674B: 0x9669, - 0x674C: 0xE8BB, - 0x674D: 0x966A, - 0x674E: 0xC0EE, - 0x674F: 0xD0D3, - 0x6750: 0xB2C4, - 0x6751: 0xB4E5, - 0x6752: 0x966B, - 0x6753: 0xE8BC, - 0x6754: 0x966C, - 0x6755: 0x966D, - 0x6756: 0xD5C8, - 0x6757: 0x966E, - 0x6758: 0x966F, - 0x6759: 0x9670, - 0x675A: 0x9671, - 0x675B: 0x9672, - 0x675C: 0xB6C5, - 0x675D: 0x9673, - 0x675E: 0xE8BD, - 0x675F: 0xCAF8, - 0x6760: 0xB8DC, - 0x6761: 0xCCF5, - 0x6762: 0x9674, - 0x6763: 0x9675, - 0x6764: 0x9676, - 0x6765: 0xC0B4, - 0x6766: 0x9677, - 0x6767: 0x9678, - 0x6768: 0xD1EE, - 0x6769: 0xE8BF, - 0x676A: 0xE8C2, - 0x676B: 0x9679, - 0x676C: 0x967A, - 0x676D: 0xBABC, - 0x676E: 0x967B, - 0x676F: 0xB1AD, - 0x6770: 0xBDDC, - 0x6771: 0x967C, - 0x6772: 0xEABD, - 0x6773: 0xE8C3, - 0x6774: 0x967D, - 0x6775: 0xE8C6, - 0x6776: 0x967E, - 0x6777: 0xE8CB, - 0x6778: 0x9680, - 0x6779: 0x9681, - 0x677A: 0x9682, - 0x677B: 0x9683, - 0x677C: 0xE8CC, - 0x677D: 0x9684, - 0x677E: 0xCBC9, - 0x677F: 0xB0E5, - 0x6780: 0x9685, - 0x6781: 0xBCAB, - 0x6782: 0x9686, - 0x6783: 0x9687, - 0x6784: 0xB9B9, - 0x6785: 0x9688, - 0x6786: 0x9689, - 0x6787: 0xE8C1, - 0x6788: 0x968A, - 0x6789: 0xCDF7, - 0x678A: 0x968B, - 0x678B: 0xE8CA, - 0x678C: 0x968C, - 0x678D: 0x968D, - 0x678E: 0x968E, - 0x678F: 0x968F, - 0x6790: 0xCEF6, - 0x6791: 0x9690, - 0x6792: 0x9691, - 0x6793: 0x9692, - 0x6794: 0x9693, - 0x6795: 0xD5ED, - 0x6796: 0x9694, - 0x6797: 0xC1D6, - 0x6798: 0xE8C4, - 0x6799: 0x9695, - 0x679A: 0xC3B6, - 0x679B: 0x9696, - 0x679C: 0xB9FB, - 0x679D: 0xD6A6, - 0x679E: 0xE8C8, - 0x679F: 0x9697, - 0x67A0: 0x9698, - 0x67A1: 0x9699, - 0x67A2: 0xCAE0, - 0x67A3: 0xD4E6, - 0x67A4: 0x969A, - 0x67A5: 0xE8C0, - 0x67A6: 0x969B, - 0x67A7: 0xE8C5, - 0x67A8: 0xE8C7, - 0x67A9: 0x969C, - 0x67AA: 0xC7B9, - 0x67AB: 0xB7E3, - 0x67AC: 0x969D, - 0x67AD: 0xE8C9, - 0x67AE: 0x969E, - 0x67AF: 0xBFDD, - 0x67B0: 0xE8D2, - 0x67B1: 0x969F, - 0x67B2: 0x96A0, - 0x67B3: 0xE8D7, - 0x67B4: 0x96A1, - 0x67B5: 0xE8D5, - 0x67B6: 0xBCDC, - 0x67B7: 0xBCCF, - 0x67B8: 0xE8DB, - 0x67B9: 0x96A2, - 0x67BA: 0x96A3, - 0x67BB: 0x96A4, - 0x67BC: 0x96A5, - 0x67BD: 0x96A6, - 0x67BE: 0x96A7, - 0x67BF: 0x96A8, - 0x67C0: 0x96A9, - 0x67C1: 0xE8DE, - 0x67C2: 0x96AA, - 0x67C3: 0xE8DA, - 0x67C4: 0xB1FA, - 0x67C5: 0x96AB, - 0x67C6: 0x96AC, - 0x67C7: 0x96AD, - 0x67C8: 0x96AE, - 0x67C9: 0x96AF, - 0x67CA: 0x96B0, - 0x67CB: 0x96B1, - 0x67CC: 0x96B2, - 0x67CD: 0x96B3, - 0x67CE: 0x96B4, - 0x67CF: 0xB0D8, - 0x67D0: 0xC4B3, - 0x67D1: 0xB8CC, - 0x67D2: 0xC6E2, - 0x67D3: 0xC8BE, - 0x67D4: 0xC8E1, - 0x67D5: 0x96B5, - 0x67D6: 0x96B6, - 0x67D7: 0x96B7, - 0x67D8: 0xE8CF, - 0x67D9: 0xE8D4, - 0x67DA: 0xE8D6, - 0x67DB: 0x96B8, - 0x67DC: 0xB9F1, - 0x67DD: 0xE8D8, - 0x67DE: 0xD7F5, - 0x67DF: 0x96B9, - 0x67E0: 0xC4FB, - 0x67E1: 0x96BA, - 0x67E2: 0xE8DC, - 0x67E3: 0x96BB, - 0x67E4: 0x96BC, - 0x67E5: 0xB2E9, - 0x67E6: 0x96BD, - 0x67E7: 0x96BE, - 0x67E8: 0x96BF, - 0x67E9: 0xE8D1, - 0x67EA: 0x96C0, - 0x67EB: 0x96C1, - 0x67EC: 0xBCED, - 0x67ED: 0x96C2, - 0x67EE: 0x96C3, - 0x67EF: 0xBFC2, - 0x67F0: 0xE8CD, - 0x67F1: 0xD6F9, - 0x67F2: 0x96C4, - 0x67F3: 0xC1F8, - 0x67F4: 0xB2F1, - 0x67F5: 0x96C5, - 0x67F6: 0x96C6, - 0x67F7: 0x96C7, - 0x67F8: 0x96C8, - 0x67F9: 0x96C9, - 0x67FA: 0x96CA, - 0x67FB: 0x96CB, - 0x67FC: 0x96CC, - 0x67FD: 0xE8DF, - 0x67FE: 0x96CD, - 0x67FF: 0xCAC1, - 0x6800: 0xE8D9, - 0x6801: 0x96CE, - 0x6802: 0x96CF, - 0x6803: 0x96D0, - 0x6804: 0x96D1, - 0x6805: 0xD5A4, - 0x6806: 0x96D2, - 0x6807: 0xB1EA, - 0x6808: 0xD5BB, - 0x6809: 0xE8CE, - 0x680A: 0xE8D0, - 0x680B: 0xB6B0, - 0x680C: 0xE8D3, - 0x680D: 0x96D3, - 0x680E: 0xE8DD, - 0x680F: 0xC0B8, - 0x6810: 0x96D4, - 0x6811: 0xCAF7, - 0x6812: 0x96D5, - 0x6813: 0xCBA8, - 0x6814: 0x96D6, - 0x6815: 0x96D7, - 0x6816: 0xC6DC, - 0x6817: 0xC0F5, - 0x6818: 0x96D8, - 0x6819: 0x96D9, - 0x681A: 0x96DA, - 0x681B: 0x96DB, - 0x681C: 0x96DC, - 0x681D: 0xE8E9, - 0x681E: 0x96DD, - 0x681F: 0x96DE, - 0x6820: 0x96DF, - 0x6821: 0xD0A3, - 0x6822: 0x96E0, - 0x6823: 0x96E1, - 0x6824: 0x96E2, - 0x6825: 0x96E3, - 0x6826: 0x96E4, - 0x6827: 0x96E5, - 0x6828: 0x96E6, - 0x6829: 0xE8F2, - 0x682A: 0xD6EA, - 0x682B: 0x96E7, - 0x682C: 0x96E8, - 0x682D: 0x96E9, - 0x682E: 0x96EA, - 0x682F: 0x96EB, - 0x6830: 0x96EC, - 0x6831: 0x96ED, - 0x6832: 0xE8E0, - 0x6833: 0xE8E1, - 0x6834: 0x96EE, - 0x6835: 0x96EF, - 0x6836: 0x96F0, - 0x6837: 0xD1F9, - 0x6838: 0xBACB, - 0x6839: 0xB8F9, - 0x683A: 0x96F1, - 0x683B: 0x96F2, - 0x683C: 0xB8F1, - 0x683D: 0xD4D4, - 0x683E: 0xE8EF, - 0x683F: 0x96F3, - 0x6840: 0xE8EE, - 0x6841: 0xE8EC, - 0x6842: 0xB9F0, - 0x6843: 0xCCD2, - 0x6844: 0xE8E6, - 0x6845: 0xCEA6, - 0x6846: 0xBFF2, - 0x6847: 0x96F4, - 0x6848: 0xB0B8, - 0x6849: 0xE8F1, - 0x684A: 0xE8F0, - 0x684B: 0x96F5, - 0x684C: 0xD7C0, - 0x684D: 0x96F6, - 0x684E: 0xE8E4, - 0x684F: 0x96F7, - 0x6850: 0xCDA9, - 0x6851: 0xC9A3, - 0x6852: 0x96F8, - 0x6853: 0xBBB8, - 0x6854: 0xBDDB, - 0x6855: 0xE8EA, - 0x6856: 0x96F9, - 0x6857: 0x96FA, - 0x6858: 0x96FB, - 0x6859: 0x96FC, - 0x685A: 0x96FD, - 0x685B: 0x96FE, - 0x685C: 0x9740, - 0x685D: 0x9741, - 0x685E: 0x9742, - 0x685F: 0x9743, - 0x6860: 0xE8E2, - 0x6861: 0xE8E3, - 0x6862: 0xE8E5, - 0x6863: 0xB5B5, - 0x6864: 0xE8E7, - 0x6865: 0xC7C5, - 0x6866: 0xE8EB, - 0x6867: 0xE8ED, - 0x6868: 0xBDB0, - 0x6869: 0xD7AE, - 0x686A: 0x9744, - 0x686B: 0xE8F8, - 0x686C: 0x9745, - 0x686D: 0x9746, - 0x686E: 0x9747, - 0x686F: 0x9748, - 0x6870: 0x9749, - 0x6871: 0x974A, - 0x6872: 0x974B, - 0x6873: 0x974C, - 0x6874: 0xE8F5, - 0x6875: 0x974D, - 0x6876: 0xCDB0, - 0x6877: 0xE8F6, - 0x6878: 0x974E, - 0x6879: 0x974F, - 0x687A: 0x9750, - 0x687B: 0x9751, - 0x687C: 0x9752, - 0x687D: 0x9753, - 0x687E: 0x9754, - 0x687F: 0x9755, - 0x6880: 0x9756, - 0x6881: 0xC1BA, - 0x6882: 0x9757, - 0x6883: 0xE8E8, - 0x6884: 0x9758, - 0x6885: 0xC3B7, - 0x6886: 0xB0F0, - 0x6887: 0x9759, - 0x6888: 0x975A, - 0x6889: 0x975B, - 0x688A: 0x975C, - 0x688B: 0x975D, - 0x688C: 0x975E, - 0x688D: 0x975F, - 0x688E: 0x9760, - 0x688F: 0xE8F4, - 0x6890: 0x9761, - 0x6891: 0x9762, - 0x6892: 0x9763, - 0x6893: 0xE8F7, - 0x6894: 0x9764, - 0x6895: 0x9765, - 0x6896: 0x9766, - 0x6897: 0xB9A3, - 0x6898: 0x9767, - 0x6899: 0x9768, - 0x689A: 0x9769, - 0x689B: 0x976A, - 0x689C: 0x976B, - 0x689D: 0x976C, - 0x689E: 0x976D, - 0x689F: 0x976E, - 0x68A0: 0x976F, - 0x68A1: 0x9770, - 0x68A2: 0xC9D2, - 0x68A3: 0x9771, - 0x68A4: 0x9772, - 0x68A5: 0x9773, - 0x68A6: 0xC3CE, - 0x68A7: 0xCEE0, - 0x68A8: 0xC0E6, - 0x68A9: 0x9774, - 0x68AA: 0x9775, - 0x68AB: 0x9776, - 0x68AC: 0x9777, - 0x68AD: 0xCBF3, - 0x68AE: 0x9778, - 0x68AF: 0xCCDD, - 0x68B0: 0xD0B5, - 0x68B1: 0x9779, - 0x68B2: 0x977A, - 0x68B3: 0xCAE1, - 0x68B4: 0x977B, - 0x68B5: 0xE8F3, - 0x68B6: 0x977C, - 0x68B7: 0x977D, - 0x68B8: 0x977E, - 0x68B9: 0x9780, - 0x68BA: 0x9781, - 0x68BB: 0x9782, - 0x68BC: 0x9783, - 0x68BD: 0x9784, - 0x68BE: 0x9785, - 0x68BF: 0x9786, - 0x68C0: 0xBCEC, - 0x68C1: 0x9787, - 0x68C2: 0xE8F9, - 0x68C3: 0x9788, - 0x68C4: 0x9789, - 0x68C5: 0x978A, - 0x68C6: 0x978B, - 0x68C7: 0x978C, - 0x68C8: 0x978D, - 0x68C9: 0xC3DE, - 0x68CA: 0x978E, - 0x68CB: 0xC6E5, - 0x68CC: 0x978F, - 0x68CD: 0xB9F7, - 0x68CE: 0x9790, - 0x68CF: 0x9791, - 0x68D0: 0x9792, - 0x68D1: 0x9793, - 0x68D2: 0xB0F4, - 0x68D3: 0x9794, - 0x68D4: 0x9795, - 0x68D5: 0xD7D8, - 0x68D6: 0x9796, - 0x68D7: 0x9797, - 0x68D8: 0xBCAC, - 0x68D9: 0x9798, - 0x68DA: 0xC5EF, - 0x68DB: 0x9799, - 0x68DC: 0x979A, - 0x68DD: 0x979B, - 0x68DE: 0x979C, - 0x68DF: 0x979D, - 0x68E0: 0xCCC4, - 0x68E1: 0x979E, - 0x68E2: 0x979F, - 0x68E3: 0xE9A6, - 0x68E4: 0x97A0, - 0x68E5: 0x97A1, - 0x68E6: 0x97A2, - 0x68E7: 0x97A3, - 0x68E8: 0x97A4, - 0x68E9: 0x97A5, - 0x68EA: 0x97A6, - 0x68EB: 0x97A7, - 0x68EC: 0x97A8, - 0x68ED: 0x97A9, - 0x68EE: 0xC9AD, - 0x68EF: 0x97AA, - 0x68F0: 0xE9A2, - 0x68F1: 0xC0E2, - 0x68F2: 0x97AB, - 0x68F3: 0x97AC, - 0x68F4: 0x97AD, - 0x68F5: 0xBFC3, - 0x68F6: 0x97AE, - 0x68F7: 0x97AF, - 0x68F8: 0x97B0, - 0x68F9: 0xE8FE, - 0x68FA: 0xB9D7, - 0x68FB: 0x97B1, - 0x68FC: 0xE8FB, - 0x68FD: 0x97B2, - 0x68FE: 0x97B3, - 0x68FF: 0x97B4, - 0x6900: 0x97B5, - 0x6901: 0xE9A4, - 0x6902: 0x97B6, - 0x6903: 0x97B7, - 0x6904: 0x97B8, - 0x6905: 0xD2CE, - 0x6906: 0x97B9, - 0x6907: 0x97BA, - 0x6908: 0x97BB, - 0x6909: 0x97BC, - 0x690A: 0x97BD, - 0x690B: 0xE9A3, - 0x690C: 0x97BE, - 0x690D: 0xD6B2, - 0x690E: 0xD7B5, - 0x690F: 0x97BF, - 0x6910: 0xE9A7, - 0x6911: 0x97C0, - 0x6912: 0xBDB7, - 0x6913: 0x97C1, - 0x6914: 0x97C2, - 0x6915: 0x97C3, - 0x6916: 0x97C4, - 0x6917: 0x97C5, - 0x6918: 0x97C6, - 0x6919: 0x97C7, - 0x691A: 0x97C8, - 0x691B: 0x97C9, - 0x691C: 0x97CA, - 0x691D: 0x97CB, - 0x691E: 0x97CC, - 0x691F: 0xE8FC, - 0x6920: 0xE8FD, - 0x6921: 0x97CD, - 0x6922: 0x97CE, - 0x6923: 0x97CF, - 0x6924: 0xE9A1, - 0x6925: 0x97D0, - 0x6926: 0x97D1, - 0x6927: 0x97D2, - 0x6928: 0x97D3, - 0x6929: 0x97D4, - 0x692A: 0x97D5, - 0x692B: 0x97D6, - 0x692C: 0x97D7, - 0x692D: 0xCDD6, - 0x692E: 0x97D8, - 0x692F: 0x97D9, - 0x6930: 0xD2AC, - 0x6931: 0x97DA, - 0x6932: 0x97DB, - 0x6933: 0x97DC, - 0x6934: 0xE9B2, - 0x6935: 0x97DD, - 0x6936: 0x97DE, - 0x6937: 0x97DF, - 0x6938: 0x97E0, - 0x6939: 0xE9A9, - 0x693A: 0x97E1, - 0x693B: 0x97E2, - 0x693C: 0x97E3, - 0x693D: 0xB4AA, - 0x693E: 0x97E4, - 0x693F: 0xB4BB, - 0x6940: 0x97E5, - 0x6941: 0x97E6, - 0x6942: 0xE9AB, - 0x6943: 0x97E7, - 0x6944: 0x97E8, - 0x6945: 0x97E9, - 0x6946: 0x97EA, - 0x6947: 0x97EB, - 0x6948: 0x97EC, - 0x6949: 0x97ED, - 0x694A: 0x97EE, - 0x694B: 0x97EF, - 0x694C: 0x97F0, - 0x694D: 0x97F1, - 0x694E: 0x97F2, - 0x694F: 0x97F3, - 0x6950: 0x97F4, - 0x6951: 0x97F5, - 0x6952: 0x97F6, - 0x6953: 0x97F7, - 0x6954: 0xD0A8, - 0x6955: 0x97F8, - 0x6956: 0x97F9, - 0x6957: 0xE9A5, - 0x6958: 0x97FA, - 0x6959: 0x97FB, - 0x695A: 0xB3FE, - 0x695B: 0x97FC, - 0x695C: 0x97FD, - 0x695D: 0xE9AC, - 0x695E: 0xC0E3, - 0x695F: 0x97FE, - 0x6960: 0xE9AA, - 0x6961: 0x9840, - 0x6962: 0x9841, - 0x6963: 0xE9B9, - 0x6964: 0x9842, - 0x6965: 0x9843, - 0x6966: 0xE9B8, - 0x6967: 0x9844, - 0x6968: 0x9845, - 0x6969: 0x9846, - 0x696A: 0x9847, - 0x696B: 0xE9AE, - 0x696C: 0x9848, - 0x696D: 0x9849, - 0x696E: 0xE8FA, - 0x696F: 0x984A, - 0x6970: 0x984B, - 0x6971: 0xE9A8, - 0x6972: 0x984C, - 0x6973: 0x984D, - 0x6974: 0x984E, - 0x6975: 0x984F, - 0x6976: 0x9850, - 0x6977: 0xBFAC, - 0x6978: 0xE9B1, - 0x6979: 0xE9BA, - 0x697A: 0x9851, - 0x697B: 0x9852, - 0x697C: 0xC2A5, - 0x697D: 0x9853, - 0x697E: 0x9854, - 0x697F: 0x9855, - 0x6980: 0xE9AF, - 0x6981: 0x9856, - 0x6982: 0xB8C5, - 0x6983: 0x9857, - 0x6984: 0xE9AD, - 0x6985: 0x9858, - 0x6986: 0xD3DC, - 0x6987: 0xE9B4, - 0x6988: 0xE9B5, - 0x6989: 0xE9B7, - 0x698A: 0x9859, - 0x698B: 0x985A, - 0x698C: 0x985B, - 0x698D: 0xE9C7, - 0x698E: 0x985C, - 0x698F: 0x985D, - 0x6990: 0x985E, - 0x6991: 0x985F, - 0x6992: 0x9860, - 0x6993: 0x9861, - 0x6994: 0xC0C6, - 0x6995: 0xE9C5, - 0x6996: 0x9862, - 0x6997: 0x9863, - 0x6998: 0xE9B0, - 0x6999: 0x9864, - 0x699A: 0x9865, - 0x699B: 0xE9BB, - 0x699C: 0xB0F1, - 0x699D: 0x9866, - 0x699E: 0x9867, - 0x699F: 0x9868, - 0x69A0: 0x9869, - 0x69A1: 0x986A, - 0x69A2: 0x986B, - 0x69A3: 0x986C, - 0x69A4: 0x986D, - 0x69A5: 0x986E, - 0x69A6: 0x986F, - 0x69A7: 0xE9BC, - 0x69A8: 0xD5A5, - 0x69A9: 0x9870, - 0x69AA: 0x9871, - 0x69AB: 0xE9BE, - 0x69AC: 0x9872, - 0x69AD: 0xE9BF, - 0x69AE: 0x9873, - 0x69AF: 0x9874, - 0x69B0: 0x9875, - 0x69B1: 0xE9C1, - 0x69B2: 0x9876, - 0x69B3: 0x9877, - 0x69B4: 0xC1F1, - 0x69B5: 0x9878, - 0x69B6: 0x9879, - 0x69B7: 0xC8B6, - 0x69B8: 0x987A, - 0x69B9: 0x987B, - 0x69BA: 0x987C, - 0x69BB: 0xE9BD, - 0x69BC: 0x987D, - 0x69BD: 0x987E, - 0x69BE: 0x9880, - 0x69BF: 0x9881, - 0x69C0: 0x9882, - 0x69C1: 0xE9C2, - 0x69C2: 0x9883, - 0x69C3: 0x9884, - 0x69C4: 0x9885, - 0x69C5: 0x9886, - 0x69C6: 0x9887, - 0x69C7: 0x9888, - 0x69C8: 0x9889, - 0x69C9: 0x988A, - 0x69CA: 0xE9C3, - 0x69CB: 0x988B, - 0x69CC: 0xE9B3, - 0x69CD: 0x988C, - 0x69CE: 0xE9B6, - 0x69CF: 0x988D, - 0x69D0: 0xBBB1, - 0x69D1: 0x988E, - 0x69D2: 0x988F, - 0x69D3: 0x9890, - 0x69D4: 0xE9C0, - 0x69D5: 0x9891, - 0x69D6: 0x9892, - 0x69D7: 0x9893, - 0x69D8: 0x9894, - 0x69D9: 0x9895, - 0x69DA: 0x9896, - 0x69DB: 0xBCF7, - 0x69DC: 0x9897, - 0x69DD: 0x9898, - 0x69DE: 0x9899, - 0x69DF: 0xE9C4, - 0x69E0: 0xE9C6, - 0x69E1: 0x989A, - 0x69E2: 0x989B, - 0x69E3: 0x989C, - 0x69E4: 0x989D, - 0x69E5: 0x989E, - 0x69E6: 0x989F, - 0x69E7: 0x98A0, - 0x69E8: 0x98A1, - 0x69E9: 0x98A2, - 0x69EA: 0x98A3, - 0x69EB: 0x98A4, - 0x69EC: 0x98A5, - 0x69ED: 0xE9CA, - 0x69EE: 0x98A6, - 0x69EF: 0x98A7, - 0x69F0: 0x98A8, - 0x69F1: 0x98A9, - 0x69F2: 0xE9CE, - 0x69F3: 0x98AA, - 0x69F4: 0x98AB, - 0x69F5: 0x98AC, - 0x69F6: 0x98AD, - 0x69F7: 0x98AE, - 0x69F8: 0x98AF, - 0x69F9: 0x98B0, - 0x69FA: 0x98B1, - 0x69FB: 0x98B2, - 0x69FC: 0x98B3, - 0x69FD: 0xB2DB, - 0x69FE: 0x98B4, - 0x69FF: 0xE9C8, - 0x6A00: 0x98B5, - 0x6A01: 0x98B6, - 0x6A02: 0x98B7, - 0x6A03: 0x98B8, - 0x6A04: 0x98B9, - 0x6A05: 0x98BA, - 0x6A06: 0x98BB, - 0x6A07: 0x98BC, - 0x6A08: 0x98BD, - 0x6A09: 0x98BE, - 0x6A0A: 0xB7AE, - 0x6A0B: 0x98BF, - 0x6A0C: 0x98C0, - 0x6A0D: 0x98C1, - 0x6A0E: 0x98C2, - 0x6A0F: 0x98C3, - 0x6A10: 0x98C4, - 0x6A11: 0x98C5, - 0x6A12: 0x98C6, - 0x6A13: 0x98C7, - 0x6A14: 0x98C8, - 0x6A15: 0x98C9, - 0x6A16: 0x98CA, - 0x6A17: 0xE9CB, - 0x6A18: 0xE9CC, - 0x6A19: 0x98CB, - 0x6A1A: 0x98CC, - 0x6A1B: 0x98CD, - 0x6A1C: 0x98CE, - 0x6A1D: 0x98CF, - 0x6A1E: 0x98D0, - 0x6A1F: 0xD5C1, - 0x6A20: 0x98D1, - 0x6A21: 0xC4A3, - 0x6A22: 0x98D2, - 0x6A23: 0x98D3, - 0x6A24: 0x98D4, - 0x6A25: 0x98D5, - 0x6A26: 0x98D6, - 0x6A27: 0x98D7, - 0x6A28: 0xE9D8, - 0x6A29: 0x98D8, - 0x6A2A: 0xBAE1, - 0x6A2B: 0x98D9, - 0x6A2C: 0x98DA, - 0x6A2D: 0x98DB, - 0x6A2E: 0x98DC, - 0x6A2F: 0xE9C9, - 0x6A30: 0x98DD, - 0x6A31: 0xD3A3, - 0x6A32: 0x98DE, - 0x6A33: 0x98DF, - 0x6A34: 0x98E0, - 0x6A35: 0xE9D4, - 0x6A36: 0x98E1, - 0x6A37: 0x98E2, - 0x6A38: 0x98E3, - 0x6A39: 0x98E4, - 0x6A3A: 0x98E5, - 0x6A3B: 0x98E6, - 0x6A3C: 0x98E7, - 0x6A3D: 0xE9D7, - 0x6A3E: 0xE9D0, - 0x6A3F: 0x98E8, - 0x6A40: 0x98E9, - 0x6A41: 0x98EA, - 0x6A42: 0x98EB, - 0x6A43: 0x98EC, - 0x6A44: 0xE9CF, - 0x6A45: 0x98ED, - 0x6A46: 0x98EE, - 0x6A47: 0xC7C1, - 0x6A48: 0x98EF, - 0x6A49: 0x98F0, - 0x6A4A: 0x98F1, - 0x6A4B: 0x98F2, - 0x6A4C: 0x98F3, - 0x6A4D: 0x98F4, - 0x6A4E: 0x98F5, - 0x6A4F: 0x98F6, - 0x6A50: 0xE9D2, - 0x6A51: 0x98F7, - 0x6A52: 0x98F8, - 0x6A53: 0x98F9, - 0x6A54: 0x98FA, - 0x6A55: 0x98FB, - 0x6A56: 0x98FC, - 0x6A57: 0x98FD, - 0x6A58: 0xE9D9, - 0x6A59: 0xB3C8, - 0x6A5A: 0x98FE, - 0x6A5B: 0xE9D3, - 0x6A5C: 0x9940, - 0x6A5D: 0x9941, - 0x6A5E: 0x9942, - 0x6A5F: 0x9943, - 0x6A60: 0x9944, - 0x6A61: 0xCFF0, - 0x6A62: 0x9945, - 0x6A63: 0x9946, - 0x6A64: 0x9947, - 0x6A65: 0xE9CD, - 0x6A66: 0x9948, - 0x6A67: 0x9949, - 0x6A68: 0x994A, - 0x6A69: 0x994B, - 0x6A6A: 0x994C, - 0x6A6B: 0x994D, - 0x6A6C: 0x994E, - 0x6A6D: 0x994F, - 0x6A6E: 0x9950, - 0x6A6F: 0x9951, - 0x6A70: 0x9952, - 0x6A71: 0xB3F7, - 0x6A72: 0x9953, - 0x6A73: 0x9954, - 0x6A74: 0x9955, - 0x6A75: 0x9956, - 0x6A76: 0x9957, - 0x6A77: 0x9958, - 0x6A78: 0x9959, - 0x6A79: 0xE9D6, - 0x6A7A: 0x995A, - 0x6A7B: 0x995B, - 0x6A7C: 0xE9DA, - 0x6A7D: 0x995C, - 0x6A7E: 0x995D, - 0x6A7F: 0x995E, - 0x6A80: 0xCCB4, - 0x6A81: 0x995F, - 0x6A82: 0x9960, - 0x6A83: 0x9961, - 0x6A84: 0xCFAD, - 0x6A85: 0x9962, - 0x6A86: 0x9963, - 0x6A87: 0x9964, - 0x6A88: 0x9965, - 0x6A89: 0x9966, - 0x6A8A: 0x9967, - 0x6A8B: 0x9968, - 0x6A8C: 0x9969, - 0x6A8D: 0x996A, - 0x6A8E: 0xE9D5, - 0x6A8F: 0x996B, - 0x6A90: 0xE9DC, - 0x6A91: 0xE9DB, - 0x6A92: 0x996C, - 0x6A93: 0x996D, - 0x6A94: 0x996E, - 0x6A95: 0x996F, - 0x6A96: 0x9970, - 0x6A97: 0xE9DE, - 0x6A98: 0x9971, - 0x6A99: 0x9972, - 0x6A9A: 0x9973, - 0x6A9B: 0x9974, - 0x6A9C: 0x9975, - 0x6A9D: 0x9976, - 0x6A9E: 0x9977, - 0x6A9F: 0x9978, - 0x6AA0: 0xE9D1, - 0x6AA1: 0x9979, - 0x6AA2: 0x997A, - 0x6AA3: 0x997B, - 0x6AA4: 0x997C, - 0x6AA5: 0x997D, - 0x6AA6: 0x997E, - 0x6AA7: 0x9980, - 0x6AA8: 0x9981, - 0x6AA9: 0xE9DD, - 0x6AAA: 0x9982, - 0x6AAB: 0xE9DF, - 0x6AAC: 0xC3CA, - 0x6AAD: 0x9983, - 0x6AAE: 0x9984, - 0x6AAF: 0x9985, - 0x6AB0: 0x9986, - 0x6AB1: 0x9987, - 0x6AB2: 0x9988, - 0x6AB3: 0x9989, - 0x6AB4: 0x998A, - 0x6AB5: 0x998B, - 0x6AB6: 0x998C, - 0x6AB7: 0x998D, - 0x6AB8: 0x998E, - 0x6AB9: 0x998F, - 0x6ABA: 0x9990, - 0x6ABB: 0x9991, - 0x6ABC: 0x9992, - 0x6ABD: 0x9993, - 0x6ABE: 0x9994, - 0x6ABF: 0x9995, - 0x6AC0: 0x9996, - 0x6AC1: 0x9997, - 0x6AC2: 0x9998, - 0x6AC3: 0x9999, - 0x6AC4: 0x999A, - 0x6AC5: 0x999B, - 0x6AC6: 0x999C, - 0x6AC7: 0x999D, - 0x6AC8: 0x999E, - 0x6AC9: 0x999F, - 0x6ACA: 0x99A0, - 0x6ACB: 0x99A1, - 0x6ACC: 0x99A2, - 0x6ACD: 0x99A3, - 0x6ACE: 0x99A4, - 0x6ACF: 0x99A5, - 0x6AD0: 0x99A6, - 0x6AD1: 0x99A7, - 0x6AD2: 0x99A8, - 0x6AD3: 0x99A9, - 0x6AD4: 0x99AA, - 0x6AD5: 0x99AB, - 0x6AD6: 0x99AC, - 0x6AD7: 0x99AD, - 0x6AD8: 0x99AE, - 0x6AD9: 0x99AF, - 0x6ADA: 0x99B0, - 0x6ADB: 0x99B1, - 0x6ADC: 0x99B2, - 0x6ADD: 0x99B3, - 0x6ADE: 0x99B4, - 0x6ADF: 0x99B5, - 0x6AE0: 0x99B6, - 0x6AE1: 0x99B7, - 0x6AE2: 0x99B8, - 0x6AE3: 0x99B9, - 0x6AE4: 0x99BA, - 0x6AE5: 0x99BB, - 0x6AE6: 0x99BC, - 0x6AE7: 0x99BD, - 0x6AE8: 0x99BE, - 0x6AE9: 0x99BF, - 0x6AEA: 0x99C0, - 0x6AEB: 0x99C1, - 0x6AEC: 0x99C2, - 0x6AED: 0x99C3, - 0x6AEE: 0x99C4, - 0x6AEF: 0x99C5, - 0x6AF0: 0x99C6, - 0x6AF1: 0x99C7, - 0x6AF2: 0x99C8, - 0x6AF3: 0x99C9, - 0x6AF4: 0x99CA, - 0x6AF5: 0x99CB, - 0x6AF6: 0x99CC, - 0x6AF7: 0x99CD, - 0x6AF8: 0x99CE, - 0x6AF9: 0x99CF, - 0x6AFA: 0x99D0, - 0x6AFB: 0x99D1, - 0x6AFC: 0x99D2, - 0x6AFD: 0x99D3, - 0x6AFE: 0x99D4, - 0x6AFF: 0x99D5, - 0x6B00: 0x99D6, - 0x6B01: 0x99D7, - 0x6B02: 0x99D8, - 0x6B03: 0x99D9, - 0x6B04: 0x99DA, - 0x6B05: 0x99DB, - 0x6B06: 0x99DC, - 0x6B07: 0x99DD, - 0x6B08: 0x99DE, - 0x6B09: 0x99DF, - 0x6B0A: 0x99E0, - 0x6B0B: 0x99E1, - 0x6B0C: 0x99E2, - 0x6B0D: 0x99E3, - 0x6B0E: 0x99E4, - 0x6B0F: 0x99E5, - 0x6B10: 0x99E6, - 0x6B11: 0x99E7, - 0x6B12: 0x99E8, - 0x6B13: 0x99E9, - 0x6B14: 0x99EA, - 0x6B15: 0x99EB, - 0x6B16: 0x99EC, - 0x6B17: 0x99ED, - 0x6B18: 0x99EE, - 0x6B19: 0x99EF, - 0x6B1A: 0x99F0, - 0x6B1B: 0x99F1, - 0x6B1C: 0x99F2, - 0x6B1D: 0x99F3, - 0x6B1E: 0x99F4, - 0x6B1F: 0x99F5, - 0x6B20: 0xC7B7, - 0x6B21: 0xB4CE, - 0x6B22: 0xBBB6, - 0x6B23: 0xD0C0, - 0x6B24: 0xECA3, - 0x6B25: 0x99F6, - 0x6B26: 0x99F7, - 0x6B27: 0xC5B7, - 0x6B28: 0x99F8, - 0x6B29: 0x99F9, - 0x6B2A: 0x99FA, - 0x6B2B: 0x99FB, - 0x6B2C: 0x99FC, - 0x6B2D: 0x99FD, - 0x6B2E: 0x99FE, - 0x6B2F: 0x9A40, - 0x6B30: 0x9A41, - 0x6B31: 0x9A42, - 0x6B32: 0xD3FB, - 0x6B33: 0x9A43, - 0x6B34: 0x9A44, - 0x6B35: 0x9A45, - 0x6B36: 0x9A46, - 0x6B37: 0xECA4, - 0x6B38: 0x9A47, - 0x6B39: 0xECA5, - 0x6B3A: 0xC6DB, - 0x6B3B: 0x9A48, - 0x6B3C: 0x9A49, - 0x6B3D: 0x9A4A, - 0x6B3E: 0xBFEE, - 0x6B3F: 0x9A4B, - 0x6B40: 0x9A4C, - 0x6B41: 0x9A4D, - 0x6B42: 0x9A4E, - 0x6B43: 0xECA6, - 0x6B44: 0x9A4F, - 0x6B45: 0x9A50, - 0x6B46: 0xECA7, - 0x6B47: 0xD0AA, - 0x6B48: 0x9A51, - 0x6B49: 0xC7B8, - 0x6B4A: 0x9A52, - 0x6B4B: 0x9A53, - 0x6B4C: 0xB8E8, - 0x6B4D: 0x9A54, - 0x6B4E: 0x9A55, - 0x6B4F: 0x9A56, - 0x6B50: 0x9A57, - 0x6B51: 0x9A58, - 0x6B52: 0x9A59, - 0x6B53: 0x9A5A, - 0x6B54: 0x9A5B, - 0x6B55: 0x9A5C, - 0x6B56: 0x9A5D, - 0x6B57: 0x9A5E, - 0x6B58: 0x9A5F, - 0x6B59: 0xECA8, - 0x6B5A: 0x9A60, - 0x6B5B: 0x9A61, - 0x6B5C: 0x9A62, - 0x6B5D: 0x9A63, - 0x6B5E: 0x9A64, - 0x6B5F: 0x9A65, - 0x6B60: 0x9A66, - 0x6B61: 0x9A67, - 0x6B62: 0xD6B9, - 0x6B63: 0xD5FD, - 0x6B64: 0xB4CB, - 0x6B65: 0xB2BD, - 0x6B66: 0xCEE4, - 0x6B67: 0xC6E7, - 0x6B68: 0x9A68, - 0x6B69: 0x9A69, - 0x6B6A: 0xCDE1, - 0x6B6B: 0x9A6A, - 0x6B6C: 0x9A6B, - 0x6B6D: 0x9A6C, - 0x6B6E: 0x9A6D, - 0x6B6F: 0x9A6E, - 0x6B70: 0x9A6F, - 0x6B71: 0x9A70, - 0x6B72: 0x9A71, - 0x6B73: 0x9A72, - 0x6B74: 0x9A73, - 0x6B75: 0x9A74, - 0x6B76: 0x9A75, - 0x6B77: 0x9A76, - 0x6B78: 0x9A77, - 0x6B79: 0xB4F5, - 0x6B7A: 0x9A78, - 0x6B7B: 0xCBC0, - 0x6B7C: 0xBCDF, - 0x6B7D: 0x9A79, - 0x6B7E: 0x9A7A, - 0x6B7F: 0x9A7B, - 0x6B80: 0x9A7C, - 0x6B81: 0xE9E2, - 0x6B82: 0xE9E3, - 0x6B83: 0xD1EA, - 0x6B84: 0xE9E5, - 0x6B85: 0x9A7D, - 0x6B86: 0xB4F9, - 0x6B87: 0xE9E4, - 0x6B88: 0x9A7E, - 0x6B89: 0xD1B3, - 0x6B8A: 0xCAE2, - 0x6B8B: 0xB2D0, - 0x6B8C: 0x9A80, - 0x6B8D: 0xE9E8, - 0x6B8E: 0x9A81, - 0x6B8F: 0x9A82, - 0x6B90: 0x9A83, - 0x6B91: 0x9A84, - 0x6B92: 0xE9E6, - 0x6B93: 0xE9E7, - 0x6B94: 0x9A85, - 0x6B95: 0x9A86, - 0x6B96: 0xD6B3, - 0x6B97: 0x9A87, - 0x6B98: 0x9A88, - 0x6B99: 0x9A89, - 0x6B9A: 0xE9E9, - 0x6B9B: 0xE9EA, - 0x6B9C: 0x9A8A, - 0x6B9D: 0x9A8B, - 0x6B9E: 0x9A8C, - 0x6B9F: 0x9A8D, - 0x6BA0: 0x9A8E, - 0x6BA1: 0xE9EB, - 0x6BA2: 0x9A8F, - 0x6BA3: 0x9A90, - 0x6BA4: 0x9A91, - 0x6BA5: 0x9A92, - 0x6BA6: 0x9A93, - 0x6BA7: 0x9A94, - 0x6BA8: 0x9A95, - 0x6BA9: 0x9A96, - 0x6BAA: 0xE9EC, - 0x6BAB: 0x9A97, - 0x6BAC: 0x9A98, - 0x6BAD: 0x9A99, - 0x6BAE: 0x9A9A, - 0x6BAF: 0x9A9B, - 0x6BB0: 0x9A9C, - 0x6BB1: 0x9A9D, - 0x6BB2: 0x9A9E, - 0x6BB3: 0xECAF, - 0x6BB4: 0xC5B9, - 0x6BB5: 0xB6CE, - 0x6BB6: 0x9A9F, - 0x6BB7: 0xD2F3, - 0x6BB8: 0x9AA0, - 0x6BB9: 0x9AA1, - 0x6BBA: 0x9AA2, - 0x6BBB: 0x9AA3, - 0x6BBC: 0x9AA4, - 0x6BBD: 0x9AA5, - 0x6BBE: 0x9AA6, - 0x6BBF: 0xB5EE, - 0x6BC0: 0x9AA7, - 0x6BC1: 0xBBD9, - 0x6BC2: 0xECB1, - 0x6BC3: 0x9AA8, - 0x6BC4: 0x9AA9, - 0x6BC5: 0xD2E3, - 0x6BC6: 0x9AAA, - 0x6BC7: 0x9AAB, - 0x6BC8: 0x9AAC, - 0x6BC9: 0x9AAD, - 0x6BCA: 0x9AAE, - 0x6BCB: 0xCEE3, - 0x6BCC: 0x9AAF, - 0x6BCD: 0xC4B8, - 0x6BCE: 0x9AB0, - 0x6BCF: 0xC3BF, - 0x6BD0: 0x9AB1, - 0x6BD1: 0x9AB2, - 0x6BD2: 0xB6BE, - 0x6BD3: 0xD8B9, - 0x6BD4: 0xB1C8, - 0x6BD5: 0xB1CF, - 0x6BD6: 0xB1D1, - 0x6BD7: 0xC5FE, - 0x6BD8: 0x9AB3, - 0x6BD9: 0xB1D0, - 0x6BDA: 0x9AB4, - 0x6BDB: 0xC3AB, - 0x6BDC: 0x9AB5, - 0x6BDD: 0x9AB6, - 0x6BDE: 0x9AB7, - 0x6BDF: 0x9AB8, - 0x6BE0: 0x9AB9, - 0x6BE1: 0xD5B1, - 0x6BE2: 0x9ABA, - 0x6BE3: 0x9ABB, - 0x6BE4: 0x9ABC, - 0x6BE5: 0x9ABD, - 0x6BE6: 0x9ABE, - 0x6BE7: 0x9ABF, - 0x6BE8: 0x9AC0, - 0x6BE9: 0x9AC1, - 0x6BEA: 0xEBA4, - 0x6BEB: 0xBAC1, - 0x6BEC: 0x9AC2, - 0x6BED: 0x9AC3, - 0x6BEE: 0x9AC4, - 0x6BEF: 0xCCBA, - 0x6BF0: 0x9AC5, - 0x6BF1: 0x9AC6, - 0x6BF2: 0x9AC7, - 0x6BF3: 0xEBA5, - 0x6BF4: 0x9AC8, - 0x6BF5: 0xEBA7, - 0x6BF6: 0x9AC9, - 0x6BF7: 0x9ACA, - 0x6BF8: 0x9ACB, - 0x6BF9: 0xEBA8, - 0x6BFA: 0x9ACC, - 0x6BFB: 0x9ACD, - 0x6BFC: 0x9ACE, - 0x6BFD: 0xEBA6, - 0x6BFE: 0x9ACF, - 0x6BFF: 0x9AD0, - 0x6C00: 0x9AD1, - 0x6C01: 0x9AD2, - 0x6C02: 0x9AD3, - 0x6C03: 0x9AD4, - 0x6C04: 0x9AD5, - 0x6C05: 0xEBA9, - 0x6C06: 0xEBAB, - 0x6C07: 0xEBAA, - 0x6C08: 0x9AD6, - 0x6C09: 0x9AD7, - 0x6C0A: 0x9AD8, - 0x6C0B: 0x9AD9, - 0x6C0C: 0x9ADA, - 0x6C0D: 0xEBAC, - 0x6C0E: 0x9ADB, - 0x6C0F: 0xCACF, - 0x6C10: 0xD8B5, - 0x6C11: 0xC3F1, - 0x6C12: 0x9ADC, - 0x6C13: 0xC3A5, - 0x6C14: 0xC6F8, - 0x6C15: 0xEBAD, - 0x6C16: 0xC4CA, - 0x6C17: 0x9ADD, - 0x6C18: 0xEBAE, - 0x6C19: 0xEBAF, - 0x6C1A: 0xEBB0, - 0x6C1B: 0xB7D5, - 0x6C1C: 0x9ADE, - 0x6C1D: 0x9ADF, - 0x6C1E: 0x9AE0, - 0x6C1F: 0xB7FA, - 0x6C20: 0x9AE1, - 0x6C21: 0xEBB1, - 0x6C22: 0xC7E2, - 0x6C23: 0x9AE2, - 0x6C24: 0xEBB3, - 0x6C25: 0x9AE3, - 0x6C26: 0xBAA4, - 0x6C27: 0xD1F5, - 0x6C28: 0xB0B1, - 0x6C29: 0xEBB2, - 0x6C2A: 0xEBB4, - 0x6C2B: 0x9AE4, - 0x6C2C: 0x9AE5, - 0x6C2D: 0x9AE6, - 0x6C2E: 0xB5AA, - 0x6C2F: 0xC2C8, - 0x6C30: 0xC7E8, - 0x6C31: 0x9AE7, - 0x6C32: 0xEBB5, - 0x6C33: 0x9AE8, - 0x6C34: 0xCBAE, - 0x6C35: 0xE3DF, - 0x6C36: 0x9AE9, - 0x6C37: 0x9AEA, - 0x6C38: 0xD3C0, - 0x6C39: 0x9AEB, - 0x6C3A: 0x9AEC, - 0x6C3B: 0x9AED, - 0x6C3C: 0x9AEE, - 0x6C3D: 0xD9DB, - 0x6C3E: 0x9AEF, - 0x6C3F: 0x9AF0, - 0x6C40: 0xCDA1, - 0x6C41: 0xD6AD, - 0x6C42: 0xC7F3, - 0x6C43: 0x9AF1, - 0x6C44: 0x9AF2, - 0x6C45: 0x9AF3, - 0x6C46: 0xD9E0, - 0x6C47: 0xBBE3, - 0x6C48: 0x9AF4, - 0x6C49: 0xBABA, - 0x6C4A: 0xE3E2, - 0x6C4B: 0x9AF5, - 0x6C4C: 0x9AF6, - 0x6C4D: 0x9AF7, - 0x6C4E: 0x9AF8, - 0x6C4F: 0x9AF9, - 0x6C50: 0xCFAB, - 0x6C51: 0x9AFA, - 0x6C52: 0x9AFB, - 0x6C53: 0x9AFC, - 0x6C54: 0xE3E0, - 0x6C55: 0xC9C7, - 0x6C56: 0x9AFD, - 0x6C57: 0xBAB9, - 0x6C58: 0x9AFE, - 0x6C59: 0x9B40, - 0x6C5A: 0x9B41, - 0x6C5B: 0xD1B4, - 0x6C5C: 0xE3E1, - 0x6C5D: 0xC8EA, - 0x6C5E: 0xB9AF, - 0x6C5F: 0xBDAD, - 0x6C60: 0xB3D8, - 0x6C61: 0xCEDB, - 0x6C62: 0x9B42, - 0x6C63: 0x9B43, - 0x6C64: 0xCCC0, - 0x6C65: 0x9B44, - 0x6C66: 0x9B45, - 0x6C67: 0x9B46, - 0x6C68: 0xE3E8, - 0x6C69: 0xE3E9, - 0x6C6A: 0xCDF4, - 0x6C6B: 0x9B47, - 0x6C6C: 0x9B48, - 0x6C6D: 0x9B49, - 0x6C6E: 0x9B4A, - 0x6C6F: 0x9B4B, - 0x6C70: 0xCCAD, - 0x6C71: 0x9B4C, - 0x6C72: 0xBCB3, - 0x6C73: 0x9B4D, - 0x6C74: 0xE3EA, - 0x6C75: 0x9B4E, - 0x6C76: 0xE3EB, - 0x6C77: 0x9B4F, - 0x6C78: 0x9B50, - 0x6C79: 0xD0DA, - 0x6C7A: 0x9B51, - 0x6C7B: 0x9B52, - 0x6C7C: 0x9B53, - 0x6C7D: 0xC6FB, - 0x6C7E: 0xB7DA, - 0x6C7F: 0x9B54, - 0x6C80: 0x9B55, - 0x6C81: 0xC7DF, - 0x6C82: 0xD2CA, - 0x6C83: 0xCED6, - 0x6C84: 0x9B56, - 0x6C85: 0xE3E4, - 0x6C86: 0xE3EC, - 0x6C87: 0x9B57, - 0x6C88: 0xC9F2, - 0x6C89: 0xB3C1, - 0x6C8A: 0x9B58, - 0x6C8B: 0x9B59, - 0x6C8C: 0xE3E7, - 0x6C8D: 0x9B5A, - 0x6C8E: 0x9B5B, - 0x6C8F: 0xC6E3, - 0x6C90: 0xE3E5, - 0x6C91: 0x9B5C, - 0x6C92: 0x9B5D, - 0x6C93: 0xEDB3, - 0x6C94: 0xE3E6, - 0x6C95: 0x9B5E, - 0x6C96: 0x9B5F, - 0x6C97: 0x9B60, - 0x6C98: 0x9B61, - 0x6C99: 0xC9B3, - 0x6C9A: 0x9B62, - 0x6C9B: 0xC5E6, - 0x6C9C: 0x9B63, - 0x6C9D: 0x9B64, - 0x6C9E: 0x9B65, - 0x6C9F: 0xB9B5, - 0x6CA0: 0x9B66, - 0x6CA1: 0xC3BB, - 0x6CA2: 0x9B67, - 0x6CA3: 0xE3E3, - 0x6CA4: 0xC5BD, - 0x6CA5: 0xC1A4, - 0x6CA6: 0xC2D9, - 0x6CA7: 0xB2D7, - 0x6CA8: 0x9B68, - 0x6CA9: 0xE3ED, - 0x6CAA: 0xBBA6, - 0x6CAB: 0xC4AD, - 0x6CAC: 0x9B69, - 0x6CAD: 0xE3F0, - 0x6CAE: 0xBEDA, - 0x6CAF: 0x9B6A, - 0x6CB0: 0x9B6B, - 0x6CB1: 0xE3FB, - 0x6CB2: 0xE3F5, - 0x6CB3: 0xBAD3, - 0x6CB4: 0x9B6C, - 0x6CB5: 0x9B6D, - 0x6CB6: 0x9B6E, - 0x6CB7: 0x9B6F, - 0x6CB8: 0xB7D0, - 0x6CB9: 0xD3CD, - 0x6CBA: 0x9B70, - 0x6CBB: 0xD6CE, - 0x6CBC: 0xD5D3, - 0x6CBD: 0xB9C1, - 0x6CBE: 0xD5B4, - 0x6CBF: 0xD1D8, - 0x6CC0: 0x9B71, - 0x6CC1: 0x9B72, - 0x6CC2: 0x9B73, - 0x6CC3: 0x9B74, - 0x6CC4: 0xD0B9, - 0x6CC5: 0xC7F6, - 0x6CC6: 0x9B75, - 0x6CC7: 0x9B76, - 0x6CC8: 0x9B77, - 0x6CC9: 0xC8AA, - 0x6CCA: 0xB2B4, - 0x6CCB: 0x9B78, - 0x6CCC: 0xC3DA, - 0x6CCD: 0x9B79, - 0x6CCE: 0x9B7A, - 0x6CCF: 0x9B7B, - 0x6CD0: 0xE3EE, - 0x6CD1: 0x9B7C, - 0x6CD2: 0x9B7D, - 0x6CD3: 0xE3FC, - 0x6CD4: 0xE3EF, - 0x6CD5: 0xB7A8, - 0x6CD6: 0xE3F7, - 0x6CD7: 0xE3F4, - 0x6CD8: 0x9B7E, - 0x6CD9: 0x9B80, - 0x6CDA: 0x9B81, - 0x6CDB: 0xB7BA, - 0x6CDC: 0x9B82, - 0x6CDD: 0x9B83, - 0x6CDE: 0xC5A2, - 0x6CDF: 0x9B84, - 0x6CE0: 0xE3F6, - 0x6CE1: 0xC5DD, - 0x6CE2: 0xB2A8, - 0x6CE3: 0xC6FC, - 0x6CE4: 0x9B85, - 0x6CE5: 0xC4E0, - 0x6CE6: 0x9B86, - 0x6CE7: 0x9B87, - 0x6CE8: 0xD7A2, - 0x6CE9: 0x9B88, - 0x6CEA: 0xC0E1, - 0x6CEB: 0xE3F9, - 0x6CEC: 0x9B89, - 0x6CED: 0x9B8A, - 0x6CEE: 0xE3FA, - 0x6CEF: 0xE3FD, - 0x6CF0: 0xCCA9, - 0x6CF1: 0xE3F3, - 0x6CF2: 0x9B8B, - 0x6CF3: 0xD3BE, - 0x6CF4: 0x9B8C, - 0x6CF5: 0xB1C3, - 0x6CF6: 0xEDB4, - 0x6CF7: 0xE3F1, - 0x6CF8: 0xE3F2, - 0x6CF9: 0x9B8D, - 0x6CFA: 0xE3F8, - 0x6CFB: 0xD0BA, - 0x6CFC: 0xC6C3, - 0x6CFD: 0xD4F3, - 0x6CFE: 0xE3FE, - 0x6CFF: 0x9B8E, - 0x6D00: 0x9B8F, - 0x6D01: 0xBDE0, - 0x6D02: 0x9B90, - 0x6D03: 0x9B91, - 0x6D04: 0xE4A7, - 0x6D05: 0x9B92, - 0x6D06: 0x9B93, - 0x6D07: 0xE4A6, - 0x6D08: 0x9B94, - 0x6D09: 0x9B95, - 0x6D0A: 0x9B96, - 0x6D0B: 0xD1F3, - 0x6D0C: 0xE4A3, - 0x6D0D: 0x9B97, - 0x6D0E: 0xE4A9, - 0x6D0F: 0x9B98, - 0x6D10: 0x9B99, - 0x6D11: 0x9B9A, - 0x6D12: 0xC8F7, - 0x6D13: 0x9B9B, - 0x6D14: 0x9B9C, - 0x6D15: 0x9B9D, - 0x6D16: 0x9B9E, - 0x6D17: 0xCFB4, - 0x6D18: 0x9B9F, - 0x6D19: 0xE4A8, - 0x6D1A: 0xE4AE, - 0x6D1B: 0xC2E5, - 0x6D1C: 0x9BA0, - 0x6D1D: 0x9BA1, - 0x6D1E: 0xB6B4, - 0x6D1F: 0x9BA2, - 0x6D20: 0x9BA3, - 0x6D21: 0x9BA4, - 0x6D22: 0x9BA5, - 0x6D23: 0x9BA6, - 0x6D24: 0x9BA7, - 0x6D25: 0xBDF2, - 0x6D26: 0x9BA8, - 0x6D27: 0xE4A2, - 0x6D28: 0x9BA9, - 0x6D29: 0x9BAA, - 0x6D2A: 0xBAE9, - 0x6D2B: 0xE4AA, - 0x6D2C: 0x9BAB, - 0x6D2D: 0x9BAC, - 0x6D2E: 0xE4AC, - 0x6D2F: 0x9BAD, - 0x6D30: 0x9BAE, - 0x6D31: 0xB6FD, - 0x6D32: 0xD6DE, - 0x6D33: 0xE4B2, - 0x6D34: 0x9BAF, - 0x6D35: 0xE4AD, - 0x6D36: 0x9BB0, - 0x6D37: 0x9BB1, - 0x6D38: 0x9BB2, - 0x6D39: 0xE4A1, - 0x6D3A: 0x9BB3, - 0x6D3B: 0xBBEE, - 0x6D3C: 0xCDDD, - 0x6D3D: 0xC7A2, - 0x6D3E: 0xC5C9, - 0x6D3F: 0x9BB4, - 0x6D40: 0x9BB5, - 0x6D41: 0xC1F7, - 0x6D42: 0x9BB6, - 0x6D43: 0xE4A4, - 0x6D44: 0x9BB7, - 0x6D45: 0xC7B3, - 0x6D46: 0xBDAC, - 0x6D47: 0xBDBD, - 0x6D48: 0xE4A5, - 0x6D49: 0x9BB8, - 0x6D4A: 0xD7C7, - 0x6D4B: 0xB2E2, - 0x6D4C: 0x9BB9, - 0x6D4D: 0xE4AB, - 0x6D4E: 0xBCC3, - 0x6D4F: 0xE4AF, - 0x6D50: 0x9BBA, - 0x6D51: 0xBBEB, - 0x6D52: 0xE4B0, - 0x6D53: 0xC5A8, - 0x6D54: 0xE4B1, - 0x6D55: 0x9BBB, - 0x6D56: 0x9BBC, - 0x6D57: 0x9BBD, - 0x6D58: 0x9BBE, - 0x6D59: 0xD5E3, - 0x6D5A: 0xBFA3, - 0x6D5B: 0x9BBF, - 0x6D5C: 0xE4BA, - 0x6D5D: 0x9BC0, - 0x6D5E: 0xE4B7, - 0x6D5F: 0x9BC1, - 0x6D60: 0xE4BB, - 0x6D61: 0x9BC2, - 0x6D62: 0x9BC3, - 0x6D63: 0xE4BD, - 0x6D64: 0x9BC4, - 0x6D65: 0x9BC5, - 0x6D66: 0xC6D6, - 0x6D67: 0x9BC6, - 0x6D68: 0x9BC7, - 0x6D69: 0xBAC6, - 0x6D6A: 0xC0CB, - 0x6D6B: 0x9BC8, - 0x6D6C: 0x9BC9, - 0x6D6D: 0x9BCA, - 0x6D6E: 0xB8A1, - 0x6D6F: 0xE4B4, - 0x6D70: 0x9BCB, - 0x6D71: 0x9BCC, - 0x6D72: 0x9BCD, - 0x6D73: 0x9BCE, - 0x6D74: 0xD4A1, - 0x6D75: 0x9BCF, - 0x6D76: 0x9BD0, - 0x6D77: 0xBAA3, - 0x6D78: 0xBDFE, - 0x6D79: 0x9BD1, - 0x6D7A: 0x9BD2, - 0x6D7B: 0x9BD3, - 0x6D7C: 0xE4BC, - 0x6D7D: 0x9BD4, - 0x6D7E: 0x9BD5, - 0x6D7F: 0x9BD6, - 0x6D80: 0x9BD7, - 0x6D81: 0x9BD8, - 0x6D82: 0xCDBF, - 0x6D83: 0x9BD9, - 0x6D84: 0x9BDA, - 0x6D85: 0xC4F9, - 0x6D86: 0x9BDB, - 0x6D87: 0x9BDC, - 0x6D88: 0xCFFB, - 0x6D89: 0xC9E6, - 0x6D8A: 0x9BDD, - 0x6D8B: 0x9BDE, - 0x6D8C: 0xD3BF, - 0x6D8D: 0x9BDF, - 0x6D8E: 0xCFD1, - 0x6D8F: 0x9BE0, - 0x6D90: 0x9BE1, - 0x6D91: 0xE4B3, - 0x6D92: 0x9BE2, - 0x6D93: 0xE4B8, - 0x6D94: 0xE4B9, - 0x6D95: 0xCCE9, - 0x6D96: 0x9BE3, - 0x6D97: 0x9BE4, - 0x6D98: 0x9BE5, - 0x6D99: 0x9BE6, - 0x6D9A: 0x9BE7, - 0x6D9B: 0xCCCE, - 0x6D9C: 0x9BE8, - 0x6D9D: 0xC0D4, - 0x6D9E: 0xE4B5, - 0x6D9F: 0xC1B0, - 0x6DA0: 0xE4B6, - 0x6DA1: 0xCED0, - 0x6DA2: 0x9BE9, - 0x6DA3: 0xBBC1, - 0x6DA4: 0xB5D3, - 0x6DA5: 0x9BEA, - 0x6DA6: 0xC8F3, - 0x6DA7: 0xBDA7, - 0x6DA8: 0xD5C7, - 0x6DA9: 0xC9AC, - 0x6DAA: 0xB8A2, - 0x6DAB: 0xE4CA, - 0x6DAC: 0x9BEB, - 0x6DAD: 0x9BEC, - 0x6DAE: 0xE4CC, - 0x6DAF: 0xD1C4, - 0x6DB0: 0x9BED, - 0x6DB1: 0x9BEE, - 0x6DB2: 0xD2BA, - 0x6DB3: 0x9BEF, - 0x6DB4: 0x9BF0, - 0x6DB5: 0xBAAD, - 0x6DB6: 0x9BF1, - 0x6DB7: 0x9BF2, - 0x6DB8: 0xBAD4, - 0x6DB9: 0x9BF3, - 0x6DBA: 0x9BF4, - 0x6DBB: 0x9BF5, - 0x6DBC: 0x9BF6, - 0x6DBD: 0x9BF7, - 0x6DBE: 0x9BF8, - 0x6DBF: 0xE4C3, - 0x6DC0: 0xB5ED, - 0x6DC1: 0x9BF9, - 0x6DC2: 0x9BFA, - 0x6DC3: 0x9BFB, - 0x6DC4: 0xD7CD, - 0x6DC5: 0xE4C0, - 0x6DC6: 0xCFFD, - 0x6DC7: 0xE4BF, - 0x6DC8: 0x9BFC, - 0x6DC9: 0x9BFD, - 0x6DCA: 0x9BFE, - 0x6DCB: 0xC1DC, - 0x6DCC: 0xCCCA, - 0x6DCD: 0x9C40, - 0x6DCE: 0x9C41, - 0x6DCF: 0x9C42, - 0x6DD0: 0x9C43, - 0x6DD1: 0xCAE7, - 0x6DD2: 0x9C44, - 0x6DD3: 0x9C45, - 0x6DD4: 0x9C46, - 0x6DD5: 0x9C47, - 0x6DD6: 0xC4D7, - 0x6DD7: 0x9C48, - 0x6DD8: 0xCCD4, - 0x6DD9: 0xE4C8, - 0x6DDA: 0x9C49, - 0x6DDB: 0x9C4A, - 0x6DDC: 0x9C4B, - 0x6DDD: 0xE4C7, - 0x6DDE: 0xE4C1, - 0x6DDF: 0x9C4C, - 0x6DE0: 0xE4C4, - 0x6DE1: 0xB5AD, - 0x6DE2: 0x9C4D, - 0x6DE3: 0x9C4E, - 0x6DE4: 0xD3D9, - 0x6DE5: 0x9C4F, - 0x6DE6: 0xE4C6, - 0x6DE7: 0x9C50, - 0x6DE8: 0x9C51, - 0x6DE9: 0x9C52, - 0x6DEA: 0x9C53, - 0x6DEB: 0xD2F9, - 0x6DEC: 0xB4E3, - 0x6DED: 0x9C54, - 0x6DEE: 0xBBB4, - 0x6DEF: 0x9C55, - 0x6DF0: 0x9C56, - 0x6DF1: 0xC9EE, - 0x6DF2: 0x9C57, - 0x6DF3: 0xB4BE, - 0x6DF4: 0x9C58, - 0x6DF5: 0x9C59, - 0x6DF6: 0x9C5A, - 0x6DF7: 0xBBEC, - 0x6DF8: 0x9C5B, - 0x6DF9: 0xD1CD, - 0x6DFA: 0x9C5C, - 0x6DFB: 0xCCED, - 0x6DFC: 0xEDB5, - 0x6DFD: 0x9C5D, - 0x6DFE: 0x9C5E, - 0x6DFF: 0x9C5F, - 0x6E00: 0x9C60, - 0x6E01: 0x9C61, - 0x6E02: 0x9C62, - 0x6E03: 0x9C63, - 0x6E04: 0x9C64, - 0x6E05: 0xC7E5, - 0x6E06: 0x9C65, - 0x6E07: 0x9C66, - 0x6E08: 0x9C67, - 0x6E09: 0x9C68, - 0x6E0A: 0xD4A8, - 0x6E0B: 0x9C69, - 0x6E0C: 0xE4CB, - 0x6E0D: 0xD7D5, - 0x6E0E: 0xE4C2, - 0x6E0F: 0x9C6A, - 0x6E10: 0xBDA5, - 0x6E11: 0xE4C5, - 0x6E12: 0x9C6B, - 0x6E13: 0x9C6C, - 0x6E14: 0xD3E6, - 0x6E15: 0x9C6D, - 0x6E16: 0xE4C9, - 0x6E17: 0xC9F8, - 0x6E18: 0x9C6E, - 0x6E19: 0x9C6F, - 0x6E1A: 0xE4BE, - 0x6E1B: 0x9C70, - 0x6E1C: 0x9C71, - 0x6E1D: 0xD3E5, - 0x6E1E: 0x9C72, - 0x6E1F: 0x9C73, - 0x6E20: 0xC7FE, - 0x6E21: 0xB6C9, - 0x6E22: 0x9C74, - 0x6E23: 0xD4FC, - 0x6E24: 0xB2B3, - 0x6E25: 0xE4D7, - 0x6E26: 0x9C75, - 0x6E27: 0x9C76, - 0x6E28: 0x9C77, - 0x6E29: 0xCEC2, - 0x6E2A: 0x9C78, - 0x6E2B: 0xE4CD, - 0x6E2C: 0x9C79, - 0x6E2D: 0xCEBC, - 0x6E2E: 0x9C7A, - 0x6E2F: 0xB8DB, - 0x6E30: 0x9C7B, - 0x6E31: 0x9C7C, - 0x6E32: 0xE4D6, - 0x6E33: 0x9C7D, - 0x6E34: 0xBFCA, - 0x6E35: 0x9C7E, - 0x6E36: 0x9C80, - 0x6E37: 0x9C81, - 0x6E38: 0xD3CE, - 0x6E39: 0x9C82, - 0x6E3A: 0xC3EC, - 0x6E3B: 0x9C83, - 0x6E3C: 0x9C84, - 0x6E3D: 0x9C85, - 0x6E3E: 0x9C86, - 0x6E3F: 0x9C87, - 0x6E40: 0x9C88, - 0x6E41: 0x9C89, - 0x6E42: 0x9C8A, - 0x6E43: 0xC5C8, - 0x6E44: 0xE4D8, - 0x6E45: 0x9C8B, - 0x6E46: 0x9C8C, - 0x6E47: 0x9C8D, - 0x6E48: 0x9C8E, - 0x6E49: 0x9C8F, - 0x6E4A: 0x9C90, - 0x6E4B: 0x9C91, - 0x6E4C: 0x9C92, - 0x6E4D: 0xCDC4, - 0x6E4E: 0xE4CF, - 0x6E4F: 0x9C93, - 0x6E50: 0x9C94, - 0x6E51: 0x9C95, - 0x6E52: 0x9C96, - 0x6E53: 0xE4D4, - 0x6E54: 0xE4D5, - 0x6E55: 0x9C97, - 0x6E56: 0xBAFE, - 0x6E57: 0x9C98, - 0x6E58: 0xCFE6, - 0x6E59: 0x9C99, - 0x6E5A: 0x9C9A, - 0x6E5B: 0xD5BF, - 0x6E5C: 0x9C9B, - 0x6E5D: 0x9C9C, - 0x6E5E: 0x9C9D, - 0x6E5F: 0xE4D2, - 0x6E60: 0x9C9E, - 0x6E61: 0x9C9F, - 0x6E62: 0x9CA0, - 0x6E63: 0x9CA1, - 0x6E64: 0x9CA2, - 0x6E65: 0x9CA3, - 0x6E66: 0x9CA4, - 0x6E67: 0x9CA5, - 0x6E68: 0x9CA6, - 0x6E69: 0x9CA7, - 0x6E6A: 0x9CA8, - 0x6E6B: 0xE4D0, - 0x6E6C: 0x9CA9, - 0x6E6D: 0x9CAA, - 0x6E6E: 0xE4CE, - 0x6E6F: 0x9CAB, - 0x6E70: 0x9CAC, - 0x6E71: 0x9CAD, - 0x6E72: 0x9CAE, - 0x6E73: 0x9CAF, - 0x6E74: 0x9CB0, - 0x6E75: 0x9CB1, - 0x6E76: 0x9CB2, - 0x6E77: 0x9CB3, - 0x6E78: 0x9CB4, - 0x6E79: 0x9CB5, - 0x6E7A: 0x9CB6, - 0x6E7B: 0x9CB7, - 0x6E7C: 0x9CB8, - 0x6E7D: 0x9CB9, - 0x6E7E: 0xCDE5, - 0x6E7F: 0xCAAA, - 0x6E80: 0x9CBA, - 0x6E81: 0x9CBB, - 0x6E82: 0x9CBC, - 0x6E83: 0xC0A3, - 0x6E84: 0x9CBD, - 0x6E85: 0xBDA6, - 0x6E86: 0xE4D3, - 0x6E87: 0x9CBE, - 0x6E88: 0x9CBF, - 0x6E89: 0xB8C8, - 0x6E8A: 0x9CC0, - 0x6E8B: 0x9CC1, - 0x6E8C: 0x9CC2, - 0x6E8D: 0x9CC3, - 0x6E8E: 0x9CC4, - 0x6E8F: 0xE4E7, - 0x6E90: 0xD4B4, - 0x6E91: 0x9CC5, - 0x6E92: 0x9CC6, - 0x6E93: 0x9CC7, - 0x6E94: 0x9CC8, - 0x6E95: 0x9CC9, - 0x6E96: 0x9CCA, - 0x6E97: 0x9CCB, - 0x6E98: 0xE4DB, - 0x6E99: 0x9CCC, - 0x6E9A: 0x9CCD, - 0x6E9B: 0x9CCE, - 0x6E9C: 0xC1EF, - 0x6E9D: 0x9CCF, - 0x6E9E: 0x9CD0, - 0x6E9F: 0xE4E9, - 0x6EA0: 0x9CD1, - 0x6EA1: 0x9CD2, - 0x6EA2: 0xD2E7, - 0x6EA3: 0x9CD3, - 0x6EA4: 0x9CD4, - 0x6EA5: 0xE4DF, - 0x6EA6: 0x9CD5, - 0x6EA7: 0xE4E0, - 0x6EA8: 0x9CD6, - 0x6EA9: 0x9CD7, - 0x6EAA: 0xCFAA, - 0x6EAB: 0x9CD8, - 0x6EAC: 0x9CD9, - 0x6EAD: 0x9CDA, - 0x6EAE: 0x9CDB, - 0x6EAF: 0xCBDD, - 0x6EB0: 0x9CDC, - 0x6EB1: 0xE4DA, - 0x6EB2: 0xE4D1, - 0x6EB3: 0x9CDD, - 0x6EB4: 0xE4E5, - 0x6EB5: 0x9CDE, - 0x6EB6: 0xC8DC, - 0x6EB7: 0xE4E3, - 0x6EB8: 0x9CDF, - 0x6EB9: 0x9CE0, - 0x6EBA: 0xC4E7, - 0x6EBB: 0xE4E2, - 0x6EBC: 0x9CE1, - 0x6EBD: 0xE4E1, - 0x6EBE: 0x9CE2, - 0x6EBF: 0x9CE3, - 0x6EC0: 0x9CE4, - 0x6EC1: 0xB3FC, - 0x6EC2: 0xE4E8, - 0x6EC3: 0x9CE5, - 0x6EC4: 0x9CE6, - 0x6EC5: 0x9CE7, - 0x6EC6: 0x9CE8, - 0x6EC7: 0xB5E1, - 0x6EC8: 0x9CE9, - 0x6EC9: 0x9CEA, - 0x6ECA: 0x9CEB, - 0x6ECB: 0xD7CC, - 0x6ECC: 0x9CEC, - 0x6ECD: 0x9CED, - 0x6ECE: 0x9CEE, - 0x6ECF: 0xE4E6, - 0x6ED0: 0x9CEF, - 0x6ED1: 0xBBAC, - 0x6ED2: 0x9CF0, - 0x6ED3: 0xD7D2, - 0x6ED4: 0xCCCF, - 0x6ED5: 0xEBF8, - 0x6ED6: 0x9CF1, - 0x6ED7: 0xE4E4, - 0x6ED8: 0x9CF2, - 0x6ED9: 0x9CF3, - 0x6EDA: 0xB9F6, - 0x6EDB: 0x9CF4, - 0x6EDC: 0x9CF5, - 0x6EDD: 0x9CF6, - 0x6EDE: 0xD6CD, - 0x6EDF: 0xE4D9, - 0x6EE0: 0xE4DC, - 0x6EE1: 0xC2FA, - 0x6EE2: 0xE4DE, - 0x6EE3: 0x9CF7, - 0x6EE4: 0xC2CB, - 0x6EE5: 0xC0C4, - 0x6EE6: 0xC2D0, - 0x6EE7: 0x9CF8, - 0x6EE8: 0xB1F5, - 0x6EE9: 0xCCB2, - 0x6EEA: 0x9CF9, - 0x6EEB: 0x9CFA, - 0x6EEC: 0x9CFB, - 0x6EED: 0x9CFC, - 0x6EEE: 0x9CFD, - 0x6EEF: 0x9CFE, - 0x6EF0: 0x9D40, - 0x6EF1: 0x9D41, - 0x6EF2: 0x9D42, - 0x6EF3: 0x9D43, - 0x6EF4: 0xB5CE, - 0x6EF5: 0x9D44, - 0x6EF6: 0x9D45, - 0x6EF7: 0x9D46, - 0x6EF8: 0x9D47, - 0x6EF9: 0xE4EF, - 0x6EFA: 0x9D48, - 0x6EFB: 0x9D49, - 0x6EFC: 0x9D4A, - 0x6EFD: 0x9D4B, - 0x6EFE: 0x9D4C, - 0x6EFF: 0x9D4D, - 0x6F00: 0x9D4E, - 0x6F01: 0x9D4F, - 0x6F02: 0xC6AF, - 0x6F03: 0x9D50, - 0x6F04: 0x9D51, - 0x6F05: 0x9D52, - 0x6F06: 0xC6E1, - 0x6F07: 0x9D53, - 0x6F08: 0x9D54, - 0x6F09: 0xE4F5, - 0x6F0A: 0x9D55, - 0x6F0B: 0x9D56, - 0x6F0C: 0x9D57, - 0x6F0D: 0x9D58, - 0x6F0E: 0x9D59, - 0x6F0F: 0xC2A9, - 0x6F10: 0x9D5A, - 0x6F11: 0x9D5B, - 0x6F12: 0x9D5C, - 0x6F13: 0xC0EC, - 0x6F14: 0xD1DD, - 0x6F15: 0xE4EE, - 0x6F16: 0x9D5D, - 0x6F17: 0x9D5E, - 0x6F18: 0x9D5F, - 0x6F19: 0x9D60, - 0x6F1A: 0x9D61, - 0x6F1B: 0x9D62, - 0x6F1C: 0x9D63, - 0x6F1D: 0x9D64, - 0x6F1E: 0x9D65, - 0x6F1F: 0x9D66, - 0x6F20: 0xC4AE, - 0x6F21: 0x9D67, - 0x6F22: 0x9D68, - 0x6F23: 0x9D69, - 0x6F24: 0xE4ED, - 0x6F25: 0x9D6A, - 0x6F26: 0x9D6B, - 0x6F27: 0x9D6C, - 0x6F28: 0x9D6D, - 0x6F29: 0xE4F6, - 0x6F2A: 0xE4F4, - 0x6F2B: 0xC2FE, - 0x6F2C: 0x9D6E, - 0x6F2D: 0xE4DD, - 0x6F2E: 0x9D6F, - 0x6F2F: 0xE4F0, - 0x6F30: 0x9D70, - 0x6F31: 0xCAFE, - 0x6F32: 0x9D71, - 0x6F33: 0xD5C4, - 0x6F34: 0x9D72, - 0x6F35: 0x9D73, - 0x6F36: 0xE4F1, - 0x6F37: 0x9D74, - 0x6F38: 0x9D75, - 0x6F39: 0x9D76, - 0x6F3A: 0x9D77, - 0x6F3B: 0x9D78, - 0x6F3C: 0x9D79, - 0x6F3D: 0x9D7A, - 0x6F3E: 0xD1FA, - 0x6F3F: 0x9D7B, - 0x6F40: 0x9D7C, - 0x6F41: 0x9D7D, - 0x6F42: 0x9D7E, - 0x6F43: 0x9D80, - 0x6F44: 0x9D81, - 0x6F45: 0x9D82, - 0x6F46: 0xE4EB, - 0x6F47: 0xE4EC, - 0x6F48: 0x9D83, - 0x6F49: 0x9D84, - 0x6F4A: 0x9D85, - 0x6F4B: 0xE4F2, - 0x6F4C: 0x9D86, - 0x6F4D: 0xCEAB, - 0x6F4E: 0x9D87, - 0x6F4F: 0x9D88, - 0x6F50: 0x9D89, - 0x6F51: 0x9D8A, - 0x6F52: 0x9D8B, - 0x6F53: 0x9D8C, - 0x6F54: 0x9D8D, - 0x6F55: 0x9D8E, - 0x6F56: 0x9D8F, - 0x6F57: 0x9D90, - 0x6F58: 0xC5CB, - 0x6F59: 0x9D91, - 0x6F5A: 0x9D92, - 0x6F5B: 0x9D93, - 0x6F5C: 0xC7B1, - 0x6F5D: 0x9D94, - 0x6F5E: 0xC2BA, - 0x6F5F: 0x9D95, - 0x6F60: 0x9D96, - 0x6F61: 0x9D97, - 0x6F62: 0xE4EA, - 0x6F63: 0x9D98, - 0x6F64: 0x9D99, - 0x6F65: 0x9D9A, - 0x6F66: 0xC1CA, - 0x6F67: 0x9D9B, - 0x6F68: 0x9D9C, - 0x6F69: 0x9D9D, - 0x6F6A: 0x9D9E, - 0x6F6B: 0x9D9F, - 0x6F6C: 0x9DA0, - 0x6F6D: 0xCCB6, - 0x6F6E: 0xB3B1, - 0x6F6F: 0x9DA1, - 0x6F70: 0x9DA2, - 0x6F71: 0x9DA3, - 0x6F72: 0xE4FB, - 0x6F73: 0x9DA4, - 0x6F74: 0xE4F3, - 0x6F75: 0x9DA5, - 0x6F76: 0x9DA6, - 0x6F77: 0x9DA7, - 0x6F78: 0xE4FA, - 0x6F79: 0x9DA8, - 0x6F7A: 0xE4FD, - 0x6F7B: 0x9DA9, - 0x6F7C: 0xE4FC, - 0x6F7D: 0x9DAA, - 0x6F7E: 0x9DAB, - 0x6F7F: 0x9DAC, - 0x6F80: 0x9DAD, - 0x6F81: 0x9DAE, - 0x6F82: 0x9DAF, - 0x6F83: 0x9DB0, - 0x6F84: 0xB3CE, - 0x6F85: 0x9DB1, - 0x6F86: 0x9DB2, - 0x6F87: 0x9DB3, - 0x6F88: 0xB3BA, - 0x6F89: 0xE4F7, - 0x6F8A: 0x9DB4, - 0x6F8B: 0x9DB5, - 0x6F8C: 0xE4F9, - 0x6F8D: 0xE4F8, - 0x6F8E: 0xC5EC, - 0x6F8F: 0x9DB6, - 0x6F90: 0x9DB7, - 0x6F91: 0x9DB8, - 0x6F92: 0x9DB9, - 0x6F93: 0x9DBA, - 0x6F94: 0x9DBB, - 0x6F95: 0x9DBC, - 0x6F96: 0x9DBD, - 0x6F97: 0x9DBE, - 0x6F98: 0x9DBF, - 0x6F99: 0x9DC0, - 0x6F9A: 0x9DC1, - 0x6F9B: 0x9DC2, - 0x6F9C: 0xC0BD, - 0x6F9D: 0x9DC3, - 0x6F9E: 0x9DC4, - 0x6F9F: 0x9DC5, - 0x6FA0: 0x9DC6, - 0x6FA1: 0xD4E8, - 0x6FA2: 0x9DC7, - 0x6FA3: 0x9DC8, - 0x6FA4: 0x9DC9, - 0x6FA5: 0x9DCA, - 0x6FA6: 0x9DCB, - 0x6FA7: 0xE5A2, - 0x6FA8: 0x9DCC, - 0x6FA9: 0x9DCD, - 0x6FAA: 0x9DCE, - 0x6FAB: 0x9DCF, - 0x6FAC: 0x9DD0, - 0x6FAD: 0x9DD1, - 0x6FAE: 0x9DD2, - 0x6FAF: 0x9DD3, - 0x6FB0: 0x9DD4, - 0x6FB1: 0x9DD5, - 0x6FB2: 0x9DD6, - 0x6FB3: 0xB0C4, - 0x6FB4: 0x9DD7, - 0x6FB5: 0x9DD8, - 0x6FB6: 0xE5A4, - 0x6FB7: 0x9DD9, - 0x6FB8: 0x9DDA, - 0x6FB9: 0xE5A3, - 0x6FBA: 0x9DDB, - 0x6FBB: 0x9DDC, - 0x6FBC: 0x9DDD, - 0x6FBD: 0x9DDE, - 0x6FBE: 0x9DDF, - 0x6FBF: 0x9DE0, - 0x6FC0: 0xBCA4, - 0x6FC1: 0x9DE1, - 0x6FC2: 0xE5A5, - 0x6FC3: 0x9DE2, - 0x6FC4: 0x9DE3, - 0x6FC5: 0x9DE4, - 0x6FC6: 0x9DE5, - 0x6FC7: 0x9DE6, - 0x6FC8: 0x9DE7, - 0x6FC9: 0xE5A1, - 0x6FCA: 0x9DE8, - 0x6FCB: 0x9DE9, - 0x6FCC: 0x9DEA, - 0x6FCD: 0x9DEB, - 0x6FCE: 0x9DEC, - 0x6FCF: 0x9DED, - 0x6FD0: 0x9DEE, - 0x6FD1: 0xE4FE, - 0x6FD2: 0xB1F4, - 0x6FD3: 0x9DEF, - 0x6FD4: 0x9DF0, - 0x6FD5: 0x9DF1, - 0x6FD6: 0x9DF2, - 0x6FD7: 0x9DF3, - 0x6FD8: 0x9DF4, - 0x6FD9: 0x9DF5, - 0x6FDA: 0x9DF6, - 0x6FDB: 0x9DF7, - 0x6FDC: 0x9DF8, - 0x6FDD: 0x9DF9, - 0x6FDE: 0xE5A8, - 0x6FDF: 0x9DFA, - 0x6FE0: 0xE5A9, - 0x6FE1: 0xE5A6, - 0x6FE2: 0x9DFB, - 0x6FE3: 0x9DFC, - 0x6FE4: 0x9DFD, - 0x6FE5: 0x9DFE, - 0x6FE6: 0x9E40, - 0x6FE7: 0x9E41, - 0x6FE8: 0x9E42, - 0x6FE9: 0x9E43, - 0x6FEA: 0x9E44, - 0x6FEB: 0x9E45, - 0x6FEC: 0x9E46, - 0x6FED: 0x9E47, - 0x6FEE: 0xE5A7, - 0x6FEF: 0xE5AA, - 0x6FF0: 0x9E48, - 0x6FF1: 0x9E49, - 0x6FF2: 0x9E4A, - 0x6FF3: 0x9E4B, - 0x6FF4: 0x9E4C, - 0x6FF5: 0x9E4D, - 0x6FF6: 0x9E4E, - 0x6FF7: 0x9E4F, - 0x6FF8: 0x9E50, - 0x6FF9: 0x9E51, - 0x6FFA: 0x9E52, - 0x6FFB: 0x9E53, - 0x6FFC: 0x9E54, - 0x6FFD: 0x9E55, - 0x6FFE: 0x9E56, - 0x6FFF: 0x9E57, - 0x7000: 0x9E58, - 0x7001: 0x9E59, - 0x7002: 0x9E5A, - 0x7003: 0x9E5B, - 0x7004: 0x9E5C, - 0x7005: 0x9E5D, - 0x7006: 0x9E5E, - 0x7007: 0x9E5F, - 0x7008: 0x9E60, - 0x7009: 0x9E61, - 0x700A: 0x9E62, - 0x700B: 0x9E63, - 0x700C: 0x9E64, - 0x700D: 0x9E65, - 0x700E: 0x9E66, - 0x700F: 0x9E67, - 0x7010: 0x9E68, - 0x7011: 0xC6D9, - 0x7012: 0x9E69, - 0x7013: 0x9E6A, - 0x7014: 0x9E6B, - 0x7015: 0x9E6C, - 0x7016: 0x9E6D, - 0x7017: 0x9E6E, - 0x7018: 0x9E6F, - 0x7019: 0x9E70, - 0x701A: 0xE5AB, - 0x701B: 0xE5AD, - 0x701C: 0x9E71, - 0x701D: 0x9E72, - 0x701E: 0x9E73, - 0x701F: 0x9E74, - 0x7020: 0x9E75, - 0x7021: 0x9E76, - 0x7022: 0x9E77, - 0x7023: 0xE5AC, - 0x7024: 0x9E78, - 0x7025: 0x9E79, - 0x7026: 0x9E7A, - 0x7027: 0x9E7B, - 0x7028: 0x9E7C, - 0x7029: 0x9E7D, - 0x702A: 0x9E7E, - 0x702B: 0x9E80, - 0x702C: 0x9E81, - 0x702D: 0x9E82, - 0x702E: 0x9E83, - 0x702F: 0x9E84, - 0x7030: 0x9E85, - 0x7031: 0x9E86, - 0x7032: 0x9E87, - 0x7033: 0x9E88, - 0x7034: 0x9E89, - 0x7035: 0xE5AF, - 0x7036: 0x9E8A, - 0x7037: 0x9E8B, - 0x7038: 0x9E8C, - 0x7039: 0xE5AE, - 0x703A: 0x9E8D, - 0x703B: 0x9E8E, - 0x703C: 0x9E8F, - 0x703D: 0x9E90, - 0x703E: 0x9E91, - 0x703F: 0x9E92, - 0x7040: 0x9E93, - 0x7041: 0x9E94, - 0x7042: 0x9E95, - 0x7043: 0x9E96, - 0x7044: 0x9E97, - 0x7045: 0x9E98, - 0x7046: 0x9E99, - 0x7047: 0x9E9A, - 0x7048: 0x9E9B, - 0x7049: 0x9E9C, - 0x704A: 0x9E9D, - 0x704B: 0x9E9E, - 0x704C: 0xB9E0, - 0x704D: 0x9E9F, - 0x704E: 0x9EA0, - 0x704F: 0xE5B0, - 0x7050: 0x9EA1, - 0x7051: 0x9EA2, - 0x7052: 0x9EA3, - 0x7053: 0x9EA4, - 0x7054: 0x9EA5, - 0x7055: 0x9EA6, - 0x7056: 0x9EA7, - 0x7057: 0x9EA8, - 0x7058: 0x9EA9, - 0x7059: 0x9EAA, - 0x705A: 0x9EAB, - 0x705B: 0x9EAC, - 0x705C: 0x9EAD, - 0x705D: 0x9EAE, - 0x705E: 0xE5B1, - 0x705F: 0x9EAF, - 0x7060: 0x9EB0, - 0x7061: 0x9EB1, - 0x7062: 0x9EB2, - 0x7063: 0x9EB3, - 0x7064: 0x9EB4, - 0x7065: 0x9EB5, - 0x7066: 0x9EB6, - 0x7067: 0x9EB7, - 0x7068: 0x9EB8, - 0x7069: 0x9EB9, - 0x706A: 0x9EBA, - 0x706B: 0xBBF0, - 0x706C: 0xECE1, - 0x706D: 0xC3F0, - 0x706E: 0x9EBB, - 0x706F: 0xB5C6, - 0x7070: 0xBBD2, - 0x7071: 0x9EBC, - 0x7072: 0x9EBD, - 0x7073: 0x9EBE, - 0x7074: 0x9EBF, - 0x7075: 0xC1E9, - 0x7076: 0xD4EE, - 0x7077: 0x9EC0, - 0x7078: 0xBEC4, - 0x7079: 0x9EC1, - 0x707A: 0x9EC2, - 0x707B: 0x9EC3, - 0x707C: 0xD7C6, - 0x707D: 0x9EC4, - 0x707E: 0xD4D6, - 0x707F: 0xB2D3, - 0x7080: 0xECBE, - 0x7081: 0x9EC5, - 0x7082: 0x9EC6, - 0x7083: 0x9EC7, - 0x7084: 0x9EC8, - 0x7085: 0xEAC1, - 0x7086: 0x9EC9, - 0x7087: 0x9ECA, - 0x7088: 0x9ECB, - 0x7089: 0xC2AF, - 0x708A: 0xB4B6, - 0x708B: 0x9ECC, - 0x708C: 0x9ECD, - 0x708D: 0x9ECE, - 0x708E: 0xD1D7, - 0x708F: 0x9ECF, - 0x7090: 0x9ED0, - 0x7091: 0x9ED1, - 0x7092: 0xB3B4, - 0x7093: 0x9ED2, - 0x7094: 0xC8B2, - 0x7095: 0xBFBB, - 0x7096: 0xECC0, - 0x7097: 0x9ED3, - 0x7098: 0x9ED4, - 0x7099: 0xD6CB, - 0x709A: 0x9ED5, - 0x709B: 0x9ED6, - 0x709C: 0xECBF, - 0x709D: 0xECC1, - 0x709E: 0x9ED7, - 0x709F: 0x9ED8, - 0x70A0: 0x9ED9, - 0x70A1: 0x9EDA, - 0x70A2: 0x9EDB, - 0x70A3: 0x9EDC, - 0x70A4: 0x9EDD, - 0x70A5: 0x9EDE, - 0x70A6: 0x9EDF, - 0x70A7: 0x9EE0, - 0x70A8: 0x9EE1, - 0x70A9: 0x9EE2, - 0x70AA: 0x9EE3, - 0x70AB: 0xECC5, - 0x70AC: 0xBEE6, - 0x70AD: 0xCCBF, - 0x70AE: 0xC5DA, - 0x70AF: 0xBEBC, - 0x70B0: 0x9EE4, - 0x70B1: 0xECC6, - 0x70B2: 0x9EE5, - 0x70B3: 0xB1FE, - 0x70B4: 0x9EE6, - 0x70B5: 0x9EE7, - 0x70B6: 0x9EE8, - 0x70B7: 0xECC4, - 0x70B8: 0xD5A8, - 0x70B9: 0xB5E3, - 0x70BA: 0x9EE9, - 0x70BB: 0xECC2, - 0x70BC: 0xC1B6, - 0x70BD: 0xB3E3, - 0x70BE: 0x9EEA, - 0x70BF: 0x9EEB, - 0x70C0: 0xECC3, - 0x70C1: 0xCBB8, - 0x70C2: 0xC0C3, - 0x70C3: 0xCCFE, - 0x70C4: 0x9EEC, - 0x70C5: 0x9EED, - 0x70C6: 0x9EEE, - 0x70C7: 0x9EEF, - 0x70C8: 0xC1D2, - 0x70C9: 0x9EF0, - 0x70CA: 0xECC8, - 0x70CB: 0x9EF1, - 0x70CC: 0x9EF2, - 0x70CD: 0x9EF3, - 0x70CE: 0x9EF4, - 0x70CF: 0x9EF5, - 0x70D0: 0x9EF6, - 0x70D1: 0x9EF7, - 0x70D2: 0x9EF8, - 0x70D3: 0x9EF9, - 0x70D4: 0x9EFA, - 0x70D5: 0x9EFB, - 0x70D6: 0x9EFC, - 0x70D7: 0x9EFD, - 0x70D8: 0xBAE6, - 0x70D9: 0xC0D3, - 0x70DA: 0x9EFE, - 0x70DB: 0xD6F2, - 0x70DC: 0x9F40, - 0x70DD: 0x9F41, - 0x70DE: 0x9F42, - 0x70DF: 0xD1CC, - 0x70E0: 0x9F43, - 0x70E1: 0x9F44, - 0x70E2: 0x9F45, - 0x70E3: 0x9F46, - 0x70E4: 0xBFBE, - 0x70E5: 0x9F47, - 0x70E6: 0xB7B3, - 0x70E7: 0xC9D5, - 0x70E8: 0xECC7, - 0x70E9: 0xBBE2, - 0x70EA: 0x9F48, - 0x70EB: 0xCCCC, - 0x70EC: 0xBDFD, - 0x70ED: 0xC8C8, - 0x70EE: 0x9F49, - 0x70EF: 0xCFA9, - 0x70F0: 0x9F4A, - 0x70F1: 0x9F4B, - 0x70F2: 0x9F4C, - 0x70F3: 0x9F4D, - 0x70F4: 0x9F4E, - 0x70F5: 0x9F4F, - 0x70F6: 0x9F50, - 0x70F7: 0xCDE9, - 0x70F8: 0x9F51, - 0x70F9: 0xC5EB, - 0x70FA: 0x9F52, - 0x70FB: 0x9F53, - 0x70FC: 0x9F54, - 0x70FD: 0xB7E9, - 0x70FE: 0x9F55, - 0x70FF: 0x9F56, - 0x7100: 0x9F57, - 0x7101: 0x9F58, - 0x7102: 0x9F59, - 0x7103: 0x9F5A, - 0x7104: 0x9F5B, - 0x7105: 0x9F5C, - 0x7106: 0x9F5D, - 0x7107: 0x9F5E, - 0x7108: 0x9F5F, - 0x7109: 0xD1C9, - 0x710A: 0xBAB8, - 0x710B: 0x9F60, - 0x710C: 0x9F61, - 0x710D: 0x9F62, - 0x710E: 0x9F63, - 0x710F: 0x9F64, - 0x7110: 0xECC9, - 0x7111: 0x9F65, - 0x7112: 0x9F66, - 0x7113: 0xECCA, - 0x7114: 0x9F67, - 0x7115: 0xBBC0, - 0x7116: 0xECCB, - 0x7117: 0x9F68, - 0x7118: 0xECE2, - 0x7119: 0xB1BA, - 0x711A: 0xB7D9, - 0x711B: 0x9F69, - 0x711C: 0x9F6A, - 0x711D: 0x9F6B, - 0x711E: 0x9F6C, - 0x711F: 0x9F6D, - 0x7120: 0x9F6E, - 0x7121: 0x9F6F, - 0x7122: 0x9F70, - 0x7123: 0x9F71, - 0x7124: 0x9F72, - 0x7125: 0x9F73, - 0x7126: 0xBDB9, - 0x7127: 0x9F74, - 0x7128: 0x9F75, - 0x7129: 0x9F76, - 0x712A: 0x9F77, - 0x712B: 0x9F78, - 0x712C: 0x9F79, - 0x712D: 0x9F7A, - 0x712E: 0x9F7B, - 0x712F: 0xECCC, - 0x7130: 0xD1E6, - 0x7131: 0xECCD, - 0x7132: 0x9F7C, - 0x7133: 0x9F7D, - 0x7134: 0x9F7E, - 0x7135: 0x9F80, - 0x7136: 0xC8BB, - 0x7137: 0x9F81, - 0x7138: 0x9F82, - 0x7139: 0x9F83, - 0x713A: 0x9F84, - 0x713B: 0x9F85, - 0x713C: 0x9F86, - 0x713D: 0x9F87, - 0x713E: 0x9F88, - 0x713F: 0x9F89, - 0x7140: 0x9F8A, - 0x7141: 0x9F8B, - 0x7142: 0x9F8C, - 0x7143: 0x9F8D, - 0x7144: 0x9F8E, - 0x7145: 0xECD1, - 0x7146: 0x9F8F, - 0x7147: 0x9F90, - 0x7148: 0x9F91, - 0x7149: 0x9F92, - 0x714A: 0xECD3, - 0x714B: 0x9F93, - 0x714C: 0xBBCD, - 0x714D: 0x9F94, - 0x714E: 0xBCE5, - 0x714F: 0x9F95, - 0x7150: 0x9F96, - 0x7151: 0x9F97, - 0x7152: 0x9F98, - 0x7153: 0x9F99, - 0x7154: 0x9F9A, - 0x7155: 0x9F9B, - 0x7156: 0x9F9C, - 0x7157: 0x9F9D, - 0x7158: 0x9F9E, - 0x7159: 0x9F9F, - 0x715A: 0x9FA0, - 0x715B: 0x9FA1, - 0x715C: 0xECCF, - 0x715D: 0x9FA2, - 0x715E: 0xC9B7, - 0x715F: 0x9FA3, - 0x7160: 0x9FA4, - 0x7161: 0x9FA5, - 0x7162: 0x9FA6, - 0x7163: 0x9FA7, - 0x7164: 0xC3BA, - 0x7165: 0x9FA8, - 0x7166: 0xECE3, - 0x7167: 0xD5D5, - 0x7168: 0xECD0, - 0x7169: 0x9FA9, - 0x716A: 0x9FAA, - 0x716B: 0x9FAB, - 0x716C: 0x9FAC, - 0x716D: 0x9FAD, - 0x716E: 0xD6F3, - 0x716F: 0x9FAE, - 0x7170: 0x9FAF, - 0x7171: 0x9FB0, - 0x7172: 0xECD2, - 0x7173: 0xECCE, - 0x7174: 0x9FB1, - 0x7175: 0x9FB2, - 0x7176: 0x9FB3, - 0x7177: 0x9FB4, - 0x7178: 0xECD4, - 0x7179: 0x9FB5, - 0x717A: 0xECD5, - 0x717B: 0x9FB6, - 0x717C: 0x9FB7, - 0x717D: 0xC9BF, - 0x717E: 0x9FB8, - 0x717F: 0x9FB9, - 0x7180: 0x9FBA, - 0x7181: 0x9FBB, - 0x7182: 0x9FBC, - 0x7183: 0x9FBD, - 0x7184: 0xCFA8, - 0x7185: 0x9FBE, - 0x7186: 0x9FBF, - 0x7187: 0x9FC0, - 0x7188: 0x9FC1, - 0x7189: 0x9FC2, - 0x718A: 0xD0DC, - 0x718B: 0x9FC3, - 0x718C: 0x9FC4, - 0x718D: 0x9FC5, - 0x718E: 0x9FC6, - 0x718F: 0xD1AC, - 0x7190: 0x9FC7, - 0x7191: 0x9FC8, - 0x7192: 0x9FC9, - 0x7193: 0x9FCA, - 0x7194: 0xC8DB, - 0x7195: 0x9FCB, - 0x7196: 0x9FCC, - 0x7197: 0x9FCD, - 0x7198: 0xECD6, - 0x7199: 0xCEF5, - 0x719A: 0x9FCE, - 0x719B: 0x9FCF, - 0x719C: 0x9FD0, - 0x719D: 0x9FD1, - 0x719E: 0x9FD2, - 0x719F: 0xCAEC, - 0x71A0: 0xECDA, - 0x71A1: 0x9FD3, - 0x71A2: 0x9FD4, - 0x71A3: 0x9FD5, - 0x71A4: 0x9FD6, - 0x71A5: 0x9FD7, - 0x71A6: 0x9FD8, - 0x71A7: 0x9FD9, - 0x71A8: 0xECD9, - 0x71A9: 0x9FDA, - 0x71AA: 0x9FDB, - 0x71AB: 0x9FDC, - 0x71AC: 0xB0BE, - 0x71AD: 0x9FDD, - 0x71AE: 0x9FDE, - 0x71AF: 0x9FDF, - 0x71B0: 0x9FE0, - 0x71B1: 0x9FE1, - 0x71B2: 0x9FE2, - 0x71B3: 0xECD7, - 0x71B4: 0x9FE3, - 0x71B5: 0xECD8, - 0x71B6: 0x9FE4, - 0x71B7: 0x9FE5, - 0x71B8: 0x9FE6, - 0x71B9: 0xECE4, - 0x71BA: 0x9FE7, - 0x71BB: 0x9FE8, - 0x71BC: 0x9FE9, - 0x71BD: 0x9FEA, - 0x71BE: 0x9FEB, - 0x71BF: 0x9FEC, - 0x71C0: 0x9FED, - 0x71C1: 0x9FEE, - 0x71C2: 0x9FEF, - 0x71C3: 0xC8BC, - 0x71C4: 0x9FF0, - 0x71C5: 0x9FF1, - 0x71C6: 0x9FF2, - 0x71C7: 0x9FF3, - 0x71C8: 0x9FF4, - 0x71C9: 0x9FF5, - 0x71CA: 0x9FF6, - 0x71CB: 0x9FF7, - 0x71CC: 0x9FF8, - 0x71CD: 0x9FF9, - 0x71CE: 0xC1C7, - 0x71CF: 0x9FFA, - 0x71D0: 0x9FFB, - 0x71D1: 0x9FFC, - 0x71D2: 0x9FFD, - 0x71D3: 0x9FFE, - 0x71D4: 0xECDC, - 0x71D5: 0xD1E0, - 0x71D6: 0xA040, - 0x71D7: 0xA041, - 0x71D8: 0xA042, - 0x71D9: 0xA043, - 0x71DA: 0xA044, - 0x71DB: 0xA045, - 0x71DC: 0xA046, - 0x71DD: 0xA047, - 0x71DE: 0xA048, - 0x71DF: 0xA049, - 0x71E0: 0xECDB, - 0x71E1: 0xA04A, - 0x71E2: 0xA04B, - 0x71E3: 0xA04C, - 0x71E4: 0xA04D, - 0x71E5: 0xD4EF, - 0x71E6: 0xA04E, - 0x71E7: 0xECDD, - 0x71E8: 0xA04F, - 0x71E9: 0xA050, - 0x71EA: 0xA051, - 0x71EB: 0xA052, - 0x71EC: 0xA053, - 0x71ED: 0xA054, - 0x71EE: 0xDBC6, - 0x71EF: 0xA055, - 0x71F0: 0xA056, - 0x71F1: 0xA057, - 0x71F2: 0xA058, - 0x71F3: 0xA059, - 0x71F4: 0xA05A, - 0x71F5: 0xA05B, - 0x71F6: 0xA05C, - 0x71F7: 0xA05D, - 0x71F8: 0xA05E, - 0x71F9: 0xECDE, - 0x71FA: 0xA05F, - 0x71FB: 0xA060, - 0x71FC: 0xA061, - 0x71FD: 0xA062, - 0x71FE: 0xA063, - 0x71FF: 0xA064, - 0x7200: 0xA065, - 0x7201: 0xA066, - 0x7202: 0xA067, - 0x7203: 0xA068, - 0x7204: 0xA069, - 0x7205: 0xA06A, - 0x7206: 0xB1AC, - 0x7207: 0xA06B, - 0x7208: 0xA06C, - 0x7209: 0xA06D, - 0x720A: 0xA06E, - 0x720B: 0xA06F, - 0x720C: 0xA070, - 0x720D: 0xA071, - 0x720E: 0xA072, - 0x720F: 0xA073, - 0x7210: 0xA074, - 0x7211: 0xA075, - 0x7212: 0xA076, - 0x7213: 0xA077, - 0x7214: 0xA078, - 0x7215: 0xA079, - 0x7216: 0xA07A, - 0x7217: 0xA07B, - 0x7218: 0xA07C, - 0x7219: 0xA07D, - 0x721A: 0xA07E, - 0x721B: 0xA080, - 0x721C: 0xA081, - 0x721D: 0xECDF, - 0x721E: 0xA082, - 0x721F: 0xA083, - 0x7220: 0xA084, - 0x7221: 0xA085, - 0x7222: 0xA086, - 0x7223: 0xA087, - 0x7224: 0xA088, - 0x7225: 0xA089, - 0x7226: 0xA08A, - 0x7227: 0xA08B, - 0x7228: 0xECE0, - 0x7229: 0xA08C, - 0x722A: 0xD7A6, - 0x722B: 0xA08D, - 0x722C: 0xC5C0, - 0x722D: 0xA08E, - 0x722E: 0xA08F, - 0x722F: 0xA090, - 0x7230: 0xEBBC, - 0x7231: 0xB0AE, - 0x7232: 0xA091, - 0x7233: 0xA092, - 0x7234: 0xA093, - 0x7235: 0xBEF4, - 0x7236: 0xB8B8, - 0x7237: 0xD2AF, - 0x7238: 0xB0D6, - 0x7239: 0xB5F9, - 0x723A: 0xA094, - 0x723B: 0xD8B3, - 0x723C: 0xA095, - 0x723D: 0xCBAC, - 0x723E: 0xA096, - 0x723F: 0xE3DD, - 0x7240: 0xA097, - 0x7241: 0xA098, - 0x7242: 0xA099, - 0x7243: 0xA09A, - 0x7244: 0xA09B, - 0x7245: 0xA09C, - 0x7246: 0xA09D, - 0x7247: 0xC6AC, - 0x7248: 0xB0E6, - 0x7249: 0xA09E, - 0x724A: 0xA09F, - 0x724B: 0xA0A0, - 0x724C: 0xC5C6, - 0x724D: 0xEBB9, - 0x724E: 0xA0A1, - 0x724F: 0xA0A2, - 0x7250: 0xA0A3, - 0x7251: 0xA0A4, - 0x7252: 0xEBBA, - 0x7253: 0xA0A5, - 0x7254: 0xA0A6, - 0x7255: 0xA0A7, - 0x7256: 0xEBBB, - 0x7257: 0xA0A8, - 0x7258: 0xA0A9, - 0x7259: 0xD1C0, - 0x725A: 0xA0AA, - 0x725B: 0xC5A3, - 0x725C: 0xA0AB, - 0x725D: 0xEAF2, - 0x725E: 0xA0AC, - 0x725F: 0xC4B2, - 0x7260: 0xA0AD, - 0x7261: 0xC4B5, - 0x7262: 0xC0CE, - 0x7263: 0xA0AE, - 0x7264: 0xA0AF, - 0x7265: 0xA0B0, - 0x7266: 0xEAF3, - 0x7267: 0xC4C1, - 0x7268: 0xA0B1, - 0x7269: 0xCEEF, - 0x726A: 0xA0B2, - 0x726B: 0xA0B3, - 0x726C: 0xA0B4, - 0x726D: 0xA0B5, - 0x726E: 0xEAF0, - 0x726F: 0xEAF4, - 0x7270: 0xA0B6, - 0x7271: 0xA0B7, - 0x7272: 0xC9FC, - 0x7273: 0xA0B8, - 0x7274: 0xA0B9, - 0x7275: 0xC7A3, - 0x7276: 0xA0BA, - 0x7277: 0xA0BB, - 0x7278: 0xA0BC, - 0x7279: 0xCCD8, - 0x727A: 0xCEFE, - 0x727B: 0xA0BD, - 0x727C: 0xA0BE, - 0x727D: 0xA0BF, - 0x727E: 0xEAF5, - 0x727F: 0xEAF6, - 0x7280: 0xCFAC, - 0x7281: 0xC0E7, - 0x7282: 0xA0C0, - 0x7283: 0xA0C1, - 0x7284: 0xEAF7, - 0x7285: 0xA0C2, - 0x7286: 0xA0C3, - 0x7287: 0xA0C4, - 0x7288: 0xA0C5, - 0x7289: 0xA0C6, - 0x728A: 0xB6BF, - 0x728B: 0xEAF8, - 0x728C: 0xA0C7, - 0x728D: 0xEAF9, - 0x728E: 0xA0C8, - 0x728F: 0xEAFA, - 0x7290: 0xA0C9, - 0x7291: 0xA0CA, - 0x7292: 0xEAFB, - 0x7293: 0xA0CB, - 0x7294: 0xA0CC, - 0x7295: 0xA0CD, - 0x7296: 0xA0CE, - 0x7297: 0xA0CF, - 0x7298: 0xA0D0, - 0x7299: 0xA0D1, - 0x729A: 0xA0D2, - 0x729B: 0xA0D3, - 0x729C: 0xA0D4, - 0x729D: 0xA0D5, - 0x729E: 0xA0D6, - 0x729F: 0xEAF1, - 0x72A0: 0xA0D7, - 0x72A1: 0xA0D8, - 0x72A2: 0xA0D9, - 0x72A3: 0xA0DA, - 0x72A4: 0xA0DB, - 0x72A5: 0xA0DC, - 0x72A6: 0xA0DD, - 0x72A7: 0xA0DE, - 0x72A8: 0xA0DF, - 0x72A9: 0xA0E0, - 0x72AA: 0xA0E1, - 0x72AB: 0xA0E2, - 0x72AC: 0xC8AE, - 0x72AD: 0xE1EB, - 0x72AE: 0xA0E3, - 0x72AF: 0xB7B8, - 0x72B0: 0xE1EC, - 0x72B1: 0xA0E4, - 0x72B2: 0xA0E5, - 0x72B3: 0xA0E6, - 0x72B4: 0xE1ED, - 0x72B5: 0xA0E7, - 0x72B6: 0xD7B4, - 0x72B7: 0xE1EE, - 0x72B8: 0xE1EF, - 0x72B9: 0xD3CC, - 0x72BA: 0xA0E8, - 0x72BB: 0xA0E9, - 0x72BC: 0xA0EA, - 0x72BD: 0xA0EB, - 0x72BE: 0xA0EC, - 0x72BF: 0xA0ED, - 0x72C0: 0xA0EE, - 0x72C1: 0xE1F1, - 0x72C2: 0xBFF1, - 0x72C3: 0xE1F0, - 0x72C4: 0xB5D2, - 0x72C5: 0xA0EF, - 0x72C6: 0xA0F0, - 0x72C7: 0xA0F1, - 0x72C8: 0xB1B7, - 0x72C9: 0xA0F2, - 0x72CA: 0xA0F3, - 0x72CB: 0xA0F4, - 0x72CC: 0xA0F5, - 0x72CD: 0xE1F3, - 0x72CE: 0xE1F2, - 0x72CF: 0xA0F6, - 0x72D0: 0xBAFC, - 0x72D1: 0xA0F7, - 0x72D2: 0xE1F4, - 0x72D3: 0xA0F8, - 0x72D4: 0xA0F9, - 0x72D5: 0xA0FA, - 0x72D6: 0xA0FB, - 0x72D7: 0xB9B7, - 0x72D8: 0xA0FC, - 0x72D9: 0xBED1, - 0x72DA: 0xA0FD, - 0x72DB: 0xA0FE, - 0x72DC: 0xAA40, - 0x72DD: 0xAA41, - 0x72DE: 0xC4FC, - 0x72DF: 0xAA42, - 0x72E0: 0xBADD, - 0x72E1: 0xBDC6, - 0x72E2: 0xAA43, - 0x72E3: 0xAA44, - 0x72E4: 0xAA45, - 0x72E5: 0xAA46, - 0x72E6: 0xAA47, - 0x72E7: 0xAA48, - 0x72E8: 0xE1F5, - 0x72E9: 0xE1F7, - 0x72EA: 0xAA49, - 0x72EB: 0xAA4A, - 0x72EC: 0xB6C0, - 0x72ED: 0xCFC1, - 0x72EE: 0xCAA8, - 0x72EF: 0xE1F6, - 0x72F0: 0xD5F8, - 0x72F1: 0xD3FC, - 0x72F2: 0xE1F8, - 0x72F3: 0xE1FC, - 0x72F4: 0xE1F9, - 0x72F5: 0xAA4B, - 0x72F6: 0xAA4C, - 0x72F7: 0xE1FA, - 0x72F8: 0xC0EA, - 0x72F9: 0xAA4D, - 0x72FA: 0xE1FE, - 0x72FB: 0xE2A1, - 0x72FC: 0xC0C7, - 0x72FD: 0xAA4E, - 0x72FE: 0xAA4F, - 0x72FF: 0xAA50, - 0x7300: 0xAA51, - 0x7301: 0xE1FB, - 0x7302: 0xAA52, - 0x7303: 0xE1FD, - 0x7304: 0xAA53, - 0x7305: 0xAA54, - 0x7306: 0xAA55, - 0x7307: 0xAA56, - 0x7308: 0xAA57, - 0x7309: 0xAA58, - 0x730A: 0xE2A5, - 0x730B: 0xAA59, - 0x730C: 0xAA5A, - 0x730D: 0xAA5B, - 0x730E: 0xC1D4, - 0x730F: 0xAA5C, - 0x7310: 0xAA5D, - 0x7311: 0xAA5E, - 0x7312: 0xAA5F, - 0x7313: 0xE2A3, - 0x7314: 0xAA60, - 0x7315: 0xE2A8, - 0x7316: 0xB2FE, - 0x7317: 0xE2A2, - 0x7318: 0xAA61, - 0x7319: 0xAA62, - 0x731A: 0xAA63, - 0x731B: 0xC3CD, - 0x731C: 0xB2C2, - 0x731D: 0xE2A7, - 0x731E: 0xE2A6, - 0x731F: 0xAA64, - 0x7320: 0xAA65, - 0x7321: 0xE2A4, - 0x7322: 0xE2A9, - 0x7323: 0xAA66, - 0x7324: 0xAA67, - 0x7325: 0xE2AB, - 0x7326: 0xAA68, - 0x7327: 0xAA69, - 0x7328: 0xAA6A, - 0x7329: 0xD0C9, - 0x732A: 0xD6ED, - 0x732B: 0xC3A8, - 0x732C: 0xE2AC, - 0x732D: 0xAA6B, - 0x732E: 0xCFD7, - 0x732F: 0xAA6C, - 0x7330: 0xAA6D, - 0x7331: 0xE2AE, - 0x7332: 0xAA6E, - 0x7333: 0xAA6F, - 0x7334: 0xBAEF, - 0x7335: 0xAA70, - 0x7336: 0xAA71, - 0x7337: 0xE9E0, - 0x7338: 0xE2AD, - 0x7339: 0xE2AA, - 0x733A: 0xAA72, - 0x733B: 0xAA73, - 0x733C: 0xAA74, - 0x733D: 0xAA75, - 0x733E: 0xBBAB, - 0x733F: 0xD4B3, - 0x7340: 0xAA76, - 0x7341: 0xAA77, - 0x7342: 0xAA78, - 0x7343: 0xAA79, - 0x7344: 0xAA7A, - 0x7345: 0xAA7B, - 0x7346: 0xAA7C, - 0x7347: 0xAA7D, - 0x7348: 0xAA7E, - 0x7349: 0xAA80, - 0x734A: 0xAA81, - 0x734B: 0xAA82, - 0x734C: 0xAA83, - 0x734D: 0xE2B0, - 0x734E: 0xAA84, - 0x734F: 0xAA85, - 0x7350: 0xE2AF, - 0x7351: 0xAA86, - 0x7352: 0xE9E1, - 0x7353: 0xAA87, - 0x7354: 0xAA88, - 0x7355: 0xAA89, - 0x7356: 0xAA8A, - 0x7357: 0xE2B1, - 0x7358: 0xAA8B, - 0x7359: 0xAA8C, - 0x735A: 0xAA8D, - 0x735B: 0xAA8E, - 0x735C: 0xAA8F, - 0x735D: 0xAA90, - 0x735E: 0xAA91, - 0x735F: 0xAA92, - 0x7360: 0xE2B2, - 0x7361: 0xAA93, - 0x7362: 0xAA94, - 0x7363: 0xAA95, - 0x7364: 0xAA96, - 0x7365: 0xAA97, - 0x7366: 0xAA98, - 0x7367: 0xAA99, - 0x7368: 0xAA9A, - 0x7369: 0xAA9B, - 0x736A: 0xAA9C, - 0x736B: 0xAA9D, - 0x736C: 0xE2B3, - 0x736D: 0xCCA1, - 0x736E: 0xAA9E, - 0x736F: 0xE2B4, - 0x7370: 0xAA9F, - 0x7371: 0xAAA0, - 0x7372: 0xAB40, - 0x7373: 0xAB41, - 0x7374: 0xAB42, - 0x7375: 0xAB43, - 0x7376: 0xAB44, - 0x7377: 0xAB45, - 0x7378: 0xAB46, - 0x7379: 0xAB47, - 0x737A: 0xAB48, - 0x737B: 0xAB49, - 0x737C: 0xAB4A, - 0x737D: 0xAB4B, - 0x737E: 0xE2B5, - 0x737F: 0xAB4C, - 0x7380: 0xAB4D, - 0x7381: 0xAB4E, - 0x7382: 0xAB4F, - 0x7383: 0xAB50, - 0x7384: 0xD0FE, - 0x7385: 0xAB51, - 0x7386: 0xAB52, - 0x7387: 0xC2CA, - 0x7388: 0xAB53, - 0x7389: 0xD3F1, - 0x738A: 0xAB54, - 0x738B: 0xCDF5, - 0x738C: 0xAB55, - 0x738D: 0xAB56, - 0x738E: 0xE7E0, - 0x738F: 0xAB57, - 0x7390: 0xAB58, - 0x7391: 0xE7E1, - 0x7392: 0xAB59, - 0x7393: 0xAB5A, - 0x7394: 0xAB5B, - 0x7395: 0xAB5C, - 0x7396: 0xBEC1, - 0x7397: 0xAB5D, - 0x7398: 0xAB5E, - 0x7399: 0xAB5F, - 0x739A: 0xAB60, - 0x739B: 0xC2EA, - 0x739C: 0xAB61, - 0x739D: 0xAB62, - 0x739E: 0xAB63, - 0x739F: 0xE7E4, - 0x73A0: 0xAB64, - 0x73A1: 0xAB65, - 0x73A2: 0xE7E3, - 0x73A3: 0xAB66, - 0x73A4: 0xAB67, - 0x73A5: 0xAB68, - 0x73A6: 0xAB69, - 0x73A7: 0xAB6A, - 0x73A8: 0xAB6B, - 0x73A9: 0xCDE6, - 0x73AA: 0xAB6C, - 0x73AB: 0xC3B5, - 0x73AC: 0xAB6D, - 0x73AD: 0xAB6E, - 0x73AE: 0xE7E2, - 0x73AF: 0xBBB7, - 0x73B0: 0xCFD6, - 0x73B1: 0xAB6F, - 0x73B2: 0xC1E1, - 0x73B3: 0xE7E9, - 0x73B4: 0xAB70, - 0x73B5: 0xAB71, - 0x73B6: 0xAB72, - 0x73B7: 0xE7E8, - 0x73B8: 0xAB73, - 0x73B9: 0xAB74, - 0x73BA: 0xE7F4, - 0x73BB: 0xB2A3, - 0x73BC: 0xAB75, - 0x73BD: 0xAB76, - 0x73BE: 0xAB77, - 0x73BF: 0xAB78, - 0x73C0: 0xE7EA, - 0x73C1: 0xAB79, - 0x73C2: 0xE7E6, - 0x73C3: 0xAB7A, - 0x73C4: 0xAB7B, - 0x73C5: 0xAB7C, - 0x73C6: 0xAB7D, - 0x73C7: 0xAB7E, - 0x73C8: 0xE7EC, - 0x73C9: 0xE7EB, - 0x73CA: 0xC9BA, - 0x73CB: 0xAB80, - 0x73CC: 0xAB81, - 0x73CD: 0xD5E4, - 0x73CE: 0xAB82, - 0x73CF: 0xE7E5, - 0x73D0: 0xB7A9, - 0x73D1: 0xE7E7, - 0x73D2: 0xAB83, - 0x73D3: 0xAB84, - 0x73D4: 0xAB85, - 0x73D5: 0xAB86, - 0x73D6: 0xAB87, - 0x73D7: 0xAB88, - 0x73D8: 0xAB89, - 0x73D9: 0xE7EE, - 0x73DA: 0xAB8A, - 0x73DB: 0xAB8B, - 0x73DC: 0xAB8C, - 0x73DD: 0xAB8D, - 0x73DE: 0xE7F3, - 0x73DF: 0xAB8E, - 0x73E0: 0xD6E9, - 0x73E1: 0xAB8F, - 0x73E2: 0xAB90, - 0x73E3: 0xAB91, - 0x73E4: 0xAB92, - 0x73E5: 0xE7ED, - 0x73E6: 0xAB93, - 0x73E7: 0xE7F2, - 0x73E8: 0xAB94, - 0x73E9: 0xE7F1, - 0x73EA: 0xAB95, - 0x73EB: 0xAB96, - 0x73EC: 0xAB97, - 0x73ED: 0xB0E0, - 0x73EE: 0xAB98, - 0x73EF: 0xAB99, - 0x73F0: 0xAB9A, - 0x73F1: 0xAB9B, - 0x73F2: 0xE7F5, - 0x73F3: 0xAB9C, - 0x73F4: 0xAB9D, - 0x73F5: 0xAB9E, - 0x73F6: 0xAB9F, - 0x73F7: 0xABA0, - 0x73F8: 0xAC40, - 0x73F9: 0xAC41, - 0x73FA: 0xAC42, - 0x73FB: 0xAC43, - 0x73FC: 0xAC44, - 0x73FD: 0xAC45, - 0x73FE: 0xAC46, - 0x73FF: 0xAC47, - 0x7400: 0xAC48, - 0x7401: 0xAC49, - 0x7402: 0xAC4A, - 0x7403: 0xC7F2, - 0x7404: 0xAC4B, - 0x7405: 0xC0C5, - 0x7406: 0xC0ED, - 0x7407: 0xAC4C, - 0x7408: 0xAC4D, - 0x7409: 0xC1F0, - 0x740A: 0xE7F0, - 0x740B: 0xAC4E, - 0x740C: 0xAC4F, - 0x740D: 0xAC50, - 0x740E: 0xAC51, - 0x740F: 0xE7F6, - 0x7410: 0xCBF6, - 0x7411: 0xAC52, - 0x7412: 0xAC53, - 0x7413: 0xAC54, - 0x7414: 0xAC55, - 0x7415: 0xAC56, - 0x7416: 0xAC57, - 0x7417: 0xAC58, - 0x7418: 0xAC59, - 0x7419: 0xAC5A, - 0x741A: 0xE8A2, - 0x741B: 0xE8A1, - 0x741C: 0xAC5B, - 0x741D: 0xAC5C, - 0x741E: 0xAC5D, - 0x741F: 0xAC5E, - 0x7420: 0xAC5F, - 0x7421: 0xAC60, - 0x7422: 0xD7C1, - 0x7423: 0xAC61, - 0x7424: 0xAC62, - 0x7425: 0xE7FA, - 0x7426: 0xE7F9, - 0x7427: 0xAC63, - 0x7428: 0xE7FB, - 0x7429: 0xAC64, - 0x742A: 0xE7F7, - 0x742B: 0xAC65, - 0x742C: 0xE7FE, - 0x742D: 0xAC66, - 0x742E: 0xE7FD, - 0x742F: 0xAC67, - 0x7430: 0xE7FC, - 0x7431: 0xAC68, - 0x7432: 0xAC69, - 0x7433: 0xC1D5, - 0x7434: 0xC7D9, - 0x7435: 0xC5FD, - 0x7436: 0xC5C3, - 0x7437: 0xAC6A, - 0x7438: 0xAC6B, - 0x7439: 0xAC6C, - 0x743A: 0xAC6D, - 0x743B: 0xAC6E, - 0x743C: 0xC7ED, - 0x743D: 0xAC6F, - 0x743E: 0xAC70, - 0x743F: 0xAC71, - 0x7440: 0xAC72, - 0x7441: 0xE8A3, - 0x7442: 0xAC73, - 0x7443: 0xAC74, - 0x7444: 0xAC75, - 0x7445: 0xAC76, - 0x7446: 0xAC77, - 0x7447: 0xAC78, - 0x7448: 0xAC79, - 0x7449: 0xAC7A, - 0x744A: 0xAC7B, - 0x744B: 0xAC7C, - 0x744C: 0xAC7D, - 0x744D: 0xAC7E, - 0x744E: 0xAC80, - 0x744F: 0xAC81, - 0x7450: 0xAC82, - 0x7451: 0xAC83, - 0x7452: 0xAC84, - 0x7453: 0xAC85, - 0x7454: 0xAC86, - 0x7455: 0xE8A6, - 0x7456: 0xAC87, - 0x7457: 0xE8A5, - 0x7458: 0xAC88, - 0x7459: 0xE8A7, - 0x745A: 0xBAF7, - 0x745B: 0xE7F8, - 0x745C: 0xE8A4, - 0x745D: 0xAC89, - 0x745E: 0xC8F0, - 0x745F: 0xC9AA, - 0x7460: 0xAC8A, - 0x7461: 0xAC8B, - 0x7462: 0xAC8C, - 0x7463: 0xAC8D, - 0x7464: 0xAC8E, - 0x7465: 0xAC8F, - 0x7466: 0xAC90, - 0x7467: 0xAC91, - 0x7468: 0xAC92, - 0x7469: 0xAC93, - 0x746A: 0xAC94, - 0x746B: 0xAC95, - 0x746C: 0xAC96, - 0x746D: 0xE8A9, - 0x746E: 0xAC97, - 0x746F: 0xAC98, - 0x7470: 0xB9E5, - 0x7471: 0xAC99, - 0x7472: 0xAC9A, - 0x7473: 0xAC9B, - 0x7474: 0xAC9C, - 0x7475: 0xAC9D, - 0x7476: 0xD1FE, - 0x7477: 0xE8A8, - 0x7478: 0xAC9E, - 0x7479: 0xAC9F, - 0x747A: 0xACA0, - 0x747B: 0xAD40, - 0x747C: 0xAD41, - 0x747D: 0xAD42, - 0x747E: 0xE8AA, - 0x747F: 0xAD43, - 0x7480: 0xE8AD, - 0x7481: 0xE8AE, - 0x7482: 0xAD44, - 0x7483: 0xC1A7, - 0x7484: 0xAD45, - 0x7485: 0xAD46, - 0x7486: 0xAD47, - 0x7487: 0xE8AF, - 0x7488: 0xAD48, - 0x7489: 0xAD49, - 0x748A: 0xAD4A, - 0x748B: 0xE8B0, - 0x748C: 0xAD4B, - 0x748D: 0xAD4C, - 0x748E: 0xE8AC, - 0x748F: 0xAD4D, - 0x7490: 0xE8B4, - 0x7491: 0xAD4E, - 0x7492: 0xAD4F, - 0x7493: 0xAD50, - 0x7494: 0xAD51, - 0x7495: 0xAD52, - 0x7496: 0xAD53, - 0x7497: 0xAD54, - 0x7498: 0xAD55, - 0x7499: 0xAD56, - 0x749A: 0xAD57, - 0x749B: 0xAD58, - 0x749C: 0xE8AB, - 0x749D: 0xAD59, - 0x749E: 0xE8B1, - 0x749F: 0xAD5A, - 0x74A0: 0xAD5B, - 0x74A1: 0xAD5C, - 0x74A2: 0xAD5D, - 0x74A3: 0xAD5E, - 0x74A4: 0xAD5F, - 0x74A5: 0xAD60, - 0x74A6: 0xAD61, - 0x74A7: 0xE8B5, - 0x74A8: 0xE8B2, - 0x74A9: 0xE8B3, - 0x74AA: 0xAD62, - 0x74AB: 0xAD63, - 0x74AC: 0xAD64, - 0x74AD: 0xAD65, - 0x74AE: 0xAD66, - 0x74AF: 0xAD67, - 0x74B0: 0xAD68, - 0x74B1: 0xAD69, - 0x74B2: 0xAD6A, - 0x74B3: 0xAD6B, - 0x74B4: 0xAD6C, - 0x74B5: 0xAD6D, - 0x74B6: 0xAD6E, - 0x74B7: 0xAD6F, - 0x74B8: 0xAD70, - 0x74B9: 0xAD71, - 0x74BA: 0xE8B7, - 0x74BB: 0xAD72, - 0x74BC: 0xAD73, - 0x74BD: 0xAD74, - 0x74BE: 0xAD75, - 0x74BF: 0xAD76, - 0x74C0: 0xAD77, - 0x74C1: 0xAD78, - 0x74C2: 0xAD79, - 0x74C3: 0xAD7A, - 0x74C4: 0xAD7B, - 0x74C5: 0xAD7C, - 0x74C6: 0xAD7D, - 0x74C7: 0xAD7E, - 0x74C8: 0xAD80, - 0x74C9: 0xAD81, - 0x74CA: 0xAD82, - 0x74CB: 0xAD83, - 0x74CC: 0xAD84, - 0x74CD: 0xAD85, - 0x74CE: 0xAD86, - 0x74CF: 0xAD87, - 0x74D0: 0xAD88, - 0x74D1: 0xAD89, - 0x74D2: 0xE8B6, - 0x74D3: 0xAD8A, - 0x74D4: 0xAD8B, - 0x74D5: 0xAD8C, - 0x74D6: 0xAD8D, - 0x74D7: 0xAD8E, - 0x74D8: 0xAD8F, - 0x74D9: 0xAD90, - 0x74DA: 0xAD91, - 0x74DB: 0xAD92, - 0x74DC: 0xB9CF, - 0x74DD: 0xAD93, - 0x74DE: 0xF0AC, - 0x74DF: 0xAD94, - 0x74E0: 0xF0AD, - 0x74E1: 0xAD95, - 0x74E2: 0xC6B0, - 0x74E3: 0xB0EA, - 0x74E4: 0xC8BF, - 0x74E5: 0xAD96, - 0x74E6: 0xCDDF, - 0x74E7: 0xAD97, - 0x74E8: 0xAD98, - 0x74E9: 0xAD99, - 0x74EA: 0xAD9A, - 0x74EB: 0xAD9B, - 0x74EC: 0xAD9C, - 0x74ED: 0xAD9D, - 0x74EE: 0xCECD, - 0x74EF: 0xEAB1, - 0x74F0: 0xAD9E, - 0x74F1: 0xAD9F, - 0x74F2: 0xADA0, - 0x74F3: 0xAE40, - 0x74F4: 0xEAB2, - 0x74F5: 0xAE41, - 0x74F6: 0xC6BF, - 0x74F7: 0xB4C9, - 0x74F8: 0xAE42, - 0x74F9: 0xAE43, - 0x74FA: 0xAE44, - 0x74FB: 0xAE45, - 0x74FC: 0xAE46, - 0x74FD: 0xAE47, - 0x74FE: 0xAE48, - 0x74FF: 0xEAB3, - 0x7500: 0xAE49, - 0x7501: 0xAE4A, - 0x7502: 0xAE4B, - 0x7503: 0xAE4C, - 0x7504: 0xD5E7, - 0x7505: 0xAE4D, - 0x7506: 0xAE4E, - 0x7507: 0xAE4F, - 0x7508: 0xAE50, - 0x7509: 0xAE51, - 0x750A: 0xAE52, - 0x750B: 0xAE53, - 0x750C: 0xAE54, - 0x750D: 0xDDF9, - 0x750E: 0xAE55, - 0x750F: 0xEAB4, - 0x7510: 0xAE56, - 0x7511: 0xEAB5, - 0x7512: 0xAE57, - 0x7513: 0xEAB6, - 0x7514: 0xAE58, - 0x7515: 0xAE59, - 0x7516: 0xAE5A, - 0x7517: 0xAE5B, - 0x7518: 0xB8CA, - 0x7519: 0xDFB0, - 0x751A: 0xC9F5, - 0x751B: 0xAE5C, - 0x751C: 0xCCF0, - 0x751D: 0xAE5D, - 0x751E: 0xAE5E, - 0x751F: 0xC9FA, - 0x7520: 0xAE5F, - 0x7521: 0xAE60, - 0x7522: 0xAE61, - 0x7523: 0xAE62, - 0x7524: 0xAE63, - 0x7525: 0xC9FB, - 0x7526: 0xAE64, - 0x7527: 0xAE65, - 0x7528: 0xD3C3, - 0x7529: 0xCBA6, - 0x752A: 0xAE66, - 0x752B: 0xB8A6, - 0x752C: 0xF0AE, - 0x752D: 0xB1C2, - 0x752E: 0xAE67, - 0x752F: 0xE5B8, - 0x7530: 0xCCEF, - 0x7531: 0xD3C9, - 0x7532: 0xBCD7, - 0x7533: 0xC9EA, - 0x7534: 0xAE68, - 0x7535: 0xB5E7, - 0x7536: 0xAE69, - 0x7537: 0xC4D0, - 0x7538: 0xB5E9, - 0x7539: 0xAE6A, - 0x753A: 0xEEAE, - 0x753B: 0xBBAD, - 0x753C: 0xAE6B, - 0x753D: 0xAE6C, - 0x753E: 0xE7DE, - 0x753F: 0xAE6D, - 0x7540: 0xEEAF, - 0x7541: 0xAE6E, - 0x7542: 0xAE6F, - 0x7543: 0xAE70, - 0x7544: 0xAE71, - 0x7545: 0xB3A9, - 0x7546: 0xAE72, - 0x7547: 0xAE73, - 0x7548: 0xEEB2, - 0x7549: 0xAE74, - 0x754A: 0xAE75, - 0x754B: 0xEEB1, - 0x754C: 0xBDE7, - 0x754D: 0xAE76, - 0x754E: 0xEEB0, - 0x754F: 0xCEB7, - 0x7550: 0xAE77, - 0x7551: 0xAE78, - 0x7552: 0xAE79, - 0x7553: 0xAE7A, - 0x7554: 0xC5CF, - 0x7555: 0xAE7B, - 0x7556: 0xAE7C, - 0x7557: 0xAE7D, - 0x7558: 0xAE7E, - 0x7559: 0xC1F4, - 0x755A: 0xDBCE, - 0x755B: 0xEEB3, - 0x755C: 0xD0F3, - 0x755D: 0xAE80, - 0x755E: 0xAE81, - 0x755F: 0xAE82, - 0x7560: 0xAE83, - 0x7561: 0xAE84, - 0x7562: 0xAE85, - 0x7563: 0xAE86, - 0x7564: 0xAE87, - 0x7565: 0xC2D4, - 0x7566: 0xC6E8, - 0x7567: 0xAE88, - 0x7568: 0xAE89, - 0x7569: 0xAE8A, - 0x756A: 0xB7AC, - 0x756B: 0xAE8B, - 0x756C: 0xAE8C, - 0x756D: 0xAE8D, - 0x756E: 0xAE8E, - 0x756F: 0xAE8F, - 0x7570: 0xAE90, - 0x7571: 0xAE91, - 0x7572: 0xEEB4, - 0x7573: 0xAE92, - 0x7574: 0xB3EB, - 0x7575: 0xAE93, - 0x7576: 0xAE94, - 0x7577: 0xAE95, - 0x7578: 0xBBFB, - 0x7579: 0xEEB5, - 0x757A: 0xAE96, - 0x757B: 0xAE97, - 0x757C: 0xAE98, - 0x757D: 0xAE99, - 0x757E: 0xAE9A, - 0x757F: 0xE7DC, - 0x7580: 0xAE9B, - 0x7581: 0xAE9C, - 0x7582: 0xAE9D, - 0x7583: 0xEEB6, - 0x7584: 0xAE9E, - 0x7585: 0xAE9F, - 0x7586: 0xBDAE, - 0x7587: 0xAEA0, - 0x7588: 0xAF40, - 0x7589: 0xAF41, - 0x758A: 0xAF42, - 0x758B: 0xF1E2, - 0x758C: 0xAF43, - 0x758D: 0xAF44, - 0x758E: 0xAF45, - 0x758F: 0xCAE8, - 0x7590: 0xAF46, - 0x7591: 0xD2C9, - 0x7592: 0xF0DA, - 0x7593: 0xAF47, - 0x7594: 0xF0DB, - 0x7595: 0xAF48, - 0x7596: 0xF0DC, - 0x7597: 0xC1C6, - 0x7598: 0xAF49, - 0x7599: 0xB8ED, - 0x759A: 0xBECE, - 0x759B: 0xAF4A, - 0x759C: 0xAF4B, - 0x759D: 0xF0DE, - 0x759E: 0xAF4C, - 0x759F: 0xC5B1, - 0x75A0: 0xF0DD, - 0x75A1: 0xD1F1, - 0x75A2: 0xAF4D, - 0x75A3: 0xF0E0, - 0x75A4: 0xB0CC, - 0x75A5: 0xBDEA, - 0x75A6: 0xAF4E, - 0x75A7: 0xAF4F, - 0x75A8: 0xAF50, - 0x75A9: 0xAF51, - 0x75AA: 0xAF52, - 0x75AB: 0xD2DF, - 0x75AC: 0xF0DF, - 0x75AD: 0xAF53, - 0x75AE: 0xB4AF, - 0x75AF: 0xB7E8, - 0x75B0: 0xF0E6, - 0x75B1: 0xF0E5, - 0x75B2: 0xC6A3, - 0x75B3: 0xF0E1, - 0x75B4: 0xF0E2, - 0x75B5: 0xB4C3, - 0x75B6: 0xAF54, - 0x75B7: 0xAF55, - 0x75B8: 0xF0E3, - 0x75B9: 0xD5EE, - 0x75BA: 0xAF56, - 0x75BB: 0xAF57, - 0x75BC: 0xCCDB, - 0x75BD: 0xBED2, - 0x75BE: 0xBCB2, - 0x75BF: 0xAF58, - 0x75C0: 0xAF59, - 0x75C1: 0xAF5A, - 0x75C2: 0xF0E8, - 0x75C3: 0xF0E7, - 0x75C4: 0xF0E4, - 0x75C5: 0xB2A1, - 0x75C6: 0xAF5B, - 0x75C7: 0xD6A2, - 0x75C8: 0xD3B8, - 0x75C9: 0xBEB7, - 0x75CA: 0xC8AC, - 0x75CB: 0xAF5C, - 0x75CC: 0xAF5D, - 0x75CD: 0xF0EA, - 0x75CE: 0xAF5E, - 0x75CF: 0xAF5F, - 0x75D0: 0xAF60, - 0x75D1: 0xAF61, - 0x75D2: 0xD1F7, - 0x75D3: 0xAF62, - 0x75D4: 0xD6CC, - 0x75D5: 0xBADB, - 0x75D6: 0xF0E9, - 0x75D7: 0xAF63, - 0x75D8: 0xB6BB, - 0x75D9: 0xAF64, - 0x75DA: 0xAF65, - 0x75DB: 0xCDB4, - 0x75DC: 0xAF66, - 0x75DD: 0xAF67, - 0x75DE: 0xC6A6, - 0x75DF: 0xAF68, - 0x75E0: 0xAF69, - 0x75E1: 0xAF6A, - 0x75E2: 0xC1A1, - 0x75E3: 0xF0EB, - 0x75E4: 0xF0EE, - 0x75E5: 0xAF6B, - 0x75E6: 0xF0ED, - 0x75E7: 0xF0F0, - 0x75E8: 0xF0EC, - 0x75E9: 0xAF6C, - 0x75EA: 0xBBBE, - 0x75EB: 0xF0EF, - 0x75EC: 0xAF6D, - 0x75ED: 0xAF6E, - 0x75EE: 0xAF6F, - 0x75EF: 0xAF70, - 0x75F0: 0xCCB5, - 0x75F1: 0xF0F2, - 0x75F2: 0xAF71, - 0x75F3: 0xAF72, - 0x75F4: 0xB3D5, - 0x75F5: 0xAF73, - 0x75F6: 0xAF74, - 0x75F7: 0xAF75, - 0x75F8: 0xAF76, - 0x75F9: 0xB1D4, - 0x75FA: 0xAF77, - 0x75FB: 0xAF78, - 0x75FC: 0xF0F3, - 0x75FD: 0xAF79, - 0x75FE: 0xAF7A, - 0x75FF: 0xF0F4, - 0x7600: 0xF0F6, - 0x7601: 0xB4E1, - 0x7602: 0xAF7B, - 0x7603: 0xF0F1, - 0x7604: 0xAF7C, - 0x7605: 0xF0F7, - 0x7606: 0xAF7D, - 0x7607: 0xAF7E, - 0x7608: 0xAF80, - 0x7609: 0xAF81, - 0x760A: 0xF0FA, - 0x760B: 0xAF82, - 0x760C: 0xF0F8, - 0x760D: 0xAF83, - 0x760E: 0xAF84, - 0x760F: 0xAF85, - 0x7610: 0xF0F5, - 0x7611: 0xAF86, - 0x7612: 0xAF87, - 0x7613: 0xAF88, - 0x7614: 0xAF89, - 0x7615: 0xF0FD, - 0x7616: 0xAF8A, - 0x7617: 0xF0F9, - 0x7618: 0xF0FC, - 0x7619: 0xF0FE, - 0x761A: 0xAF8B, - 0x761B: 0xF1A1, - 0x761C: 0xAF8C, - 0x761D: 0xAF8D, - 0x761E: 0xAF8E, - 0x761F: 0xCEC1, - 0x7620: 0xF1A4, - 0x7621: 0xAF8F, - 0x7622: 0xF1A3, - 0x7623: 0xAF90, - 0x7624: 0xC1F6, - 0x7625: 0xF0FB, - 0x7626: 0xCADD, - 0x7627: 0xAF91, - 0x7628: 0xAF92, - 0x7629: 0xB4F1, - 0x762A: 0xB1F1, - 0x762B: 0xCCB1, - 0x762C: 0xAF93, - 0x762D: 0xF1A6, - 0x762E: 0xAF94, - 0x762F: 0xAF95, - 0x7630: 0xF1A7, - 0x7631: 0xAF96, - 0x7632: 0xAF97, - 0x7633: 0xF1AC, - 0x7634: 0xD5CE, - 0x7635: 0xF1A9, - 0x7636: 0xAF98, - 0x7637: 0xAF99, - 0x7638: 0xC8B3, - 0x7639: 0xAF9A, - 0x763A: 0xAF9B, - 0x763B: 0xAF9C, - 0x763C: 0xF1A2, - 0x763D: 0xAF9D, - 0x763E: 0xF1AB, - 0x763F: 0xF1A8, - 0x7640: 0xF1A5, - 0x7641: 0xAF9E, - 0x7642: 0xAF9F, - 0x7643: 0xF1AA, - 0x7644: 0xAFA0, - 0x7645: 0xB040, - 0x7646: 0xB041, - 0x7647: 0xB042, - 0x7648: 0xB043, - 0x7649: 0xB044, - 0x764A: 0xB045, - 0x764B: 0xB046, - 0x764C: 0xB0A9, - 0x764D: 0xF1AD, - 0x764E: 0xB047, - 0x764F: 0xB048, - 0x7650: 0xB049, - 0x7651: 0xB04A, - 0x7652: 0xB04B, - 0x7653: 0xB04C, - 0x7654: 0xF1AF, - 0x7655: 0xB04D, - 0x7656: 0xF1B1, - 0x7657: 0xB04E, - 0x7658: 0xB04F, - 0x7659: 0xB050, - 0x765A: 0xB051, - 0x765B: 0xB052, - 0x765C: 0xF1B0, - 0x765D: 0xB053, - 0x765E: 0xF1AE, - 0x765F: 0xB054, - 0x7660: 0xB055, - 0x7661: 0xB056, - 0x7662: 0xB057, - 0x7663: 0xD1A2, - 0x7664: 0xB058, - 0x7665: 0xB059, - 0x7666: 0xB05A, - 0x7667: 0xB05B, - 0x7668: 0xB05C, - 0x7669: 0xB05D, - 0x766A: 0xB05E, - 0x766B: 0xF1B2, - 0x766C: 0xB05F, - 0x766D: 0xB060, - 0x766E: 0xB061, - 0x766F: 0xF1B3, - 0x7670: 0xB062, - 0x7671: 0xB063, - 0x7672: 0xB064, - 0x7673: 0xB065, - 0x7674: 0xB066, - 0x7675: 0xB067, - 0x7676: 0xB068, - 0x7677: 0xB069, - 0x7678: 0xB9EF, - 0x7679: 0xB06A, - 0x767A: 0xB06B, - 0x767B: 0xB5C7, - 0x767C: 0xB06C, - 0x767D: 0xB0D7, - 0x767E: 0xB0D9, - 0x767F: 0xB06D, - 0x7680: 0xB06E, - 0x7681: 0xB06F, - 0x7682: 0xD4ED, - 0x7683: 0xB070, - 0x7684: 0xB5C4, - 0x7685: 0xB071, - 0x7686: 0xBDD4, - 0x7687: 0xBBCA, - 0x7688: 0xF0A7, - 0x7689: 0xB072, - 0x768A: 0xB073, - 0x768B: 0xB8DE, - 0x768C: 0xB074, - 0x768D: 0xB075, - 0x768E: 0xF0A8, - 0x768F: 0xB076, - 0x7690: 0xB077, - 0x7691: 0xB0A8, - 0x7692: 0xB078, - 0x7693: 0xF0A9, - 0x7694: 0xB079, - 0x7695: 0xB07A, - 0x7696: 0xCDEE, - 0x7697: 0xB07B, - 0x7698: 0xB07C, - 0x7699: 0xF0AA, - 0x769A: 0xB07D, - 0x769B: 0xB07E, - 0x769C: 0xB080, - 0x769D: 0xB081, - 0x769E: 0xB082, - 0x769F: 0xB083, - 0x76A0: 0xB084, - 0x76A1: 0xB085, - 0x76A2: 0xB086, - 0x76A3: 0xB087, - 0x76A4: 0xF0AB, - 0x76A5: 0xB088, - 0x76A6: 0xB089, - 0x76A7: 0xB08A, - 0x76A8: 0xB08B, - 0x76A9: 0xB08C, - 0x76AA: 0xB08D, - 0x76AB: 0xB08E, - 0x76AC: 0xB08F, - 0x76AD: 0xB090, - 0x76AE: 0xC6A4, - 0x76AF: 0xB091, - 0x76B0: 0xB092, - 0x76B1: 0xD6E5, - 0x76B2: 0xF1E4, - 0x76B3: 0xB093, - 0x76B4: 0xF1E5, - 0x76B5: 0xB094, - 0x76B6: 0xB095, - 0x76B7: 0xB096, - 0x76B8: 0xB097, - 0x76B9: 0xB098, - 0x76BA: 0xB099, - 0x76BB: 0xB09A, - 0x76BC: 0xB09B, - 0x76BD: 0xB09C, - 0x76BE: 0xB09D, - 0x76BF: 0xC3F3, - 0x76C0: 0xB09E, - 0x76C1: 0xB09F, - 0x76C2: 0xD3DB, - 0x76C3: 0xB0A0, - 0x76C4: 0xB140, - 0x76C5: 0xD6D1, - 0x76C6: 0xC5E8, - 0x76C7: 0xB141, - 0x76C8: 0xD3AF, - 0x76C9: 0xB142, - 0x76CA: 0xD2E6, - 0x76CB: 0xB143, - 0x76CC: 0xB144, - 0x76CD: 0xEEC1, - 0x76CE: 0xB0BB, - 0x76CF: 0xD5B5, - 0x76D0: 0xD1CE, - 0x76D1: 0xBCE0, - 0x76D2: 0xBAD0, - 0x76D3: 0xB145, - 0x76D4: 0xBFF8, - 0x76D5: 0xB146, - 0x76D6: 0xB8C7, - 0x76D7: 0xB5C1, - 0x76D8: 0xC5CC, - 0x76D9: 0xB147, - 0x76DA: 0xB148, - 0x76DB: 0xCAA2, - 0x76DC: 0xB149, - 0x76DD: 0xB14A, - 0x76DE: 0xB14B, - 0x76DF: 0xC3CB, - 0x76E0: 0xB14C, - 0x76E1: 0xB14D, - 0x76E2: 0xB14E, - 0x76E3: 0xB14F, - 0x76E4: 0xB150, - 0x76E5: 0xEEC2, - 0x76E6: 0xB151, - 0x76E7: 0xB152, - 0x76E8: 0xB153, - 0x76E9: 0xB154, - 0x76EA: 0xB155, - 0x76EB: 0xB156, - 0x76EC: 0xB157, - 0x76ED: 0xB158, - 0x76EE: 0xC4BF, - 0x76EF: 0xB6A2, - 0x76F0: 0xB159, - 0x76F1: 0xEDEC, - 0x76F2: 0xC3A4, - 0x76F3: 0xB15A, - 0x76F4: 0xD6B1, - 0x76F5: 0xB15B, - 0x76F6: 0xB15C, - 0x76F7: 0xB15D, - 0x76F8: 0xCFE0, - 0x76F9: 0xEDEF, - 0x76FA: 0xB15E, - 0x76FB: 0xB15F, - 0x76FC: 0xC5CE, - 0x76FD: 0xB160, - 0x76FE: 0xB6DC, - 0x76FF: 0xB161, - 0x7700: 0xB162, - 0x7701: 0xCAA1, - 0x7702: 0xB163, - 0x7703: 0xB164, - 0x7704: 0xEDED, - 0x7705: 0xB165, - 0x7706: 0xB166, - 0x7707: 0xEDF0, - 0x7708: 0xEDF1, - 0x7709: 0xC3BC, - 0x770A: 0xB167, - 0x770B: 0xBFB4, - 0x770C: 0xB168, - 0x770D: 0xEDEE, - 0x770E: 0xB169, - 0x770F: 0xB16A, - 0x7710: 0xB16B, - 0x7711: 0xB16C, - 0x7712: 0xB16D, - 0x7713: 0xB16E, - 0x7714: 0xB16F, - 0x7715: 0xB170, - 0x7716: 0xB171, - 0x7717: 0xB172, - 0x7718: 0xB173, - 0x7719: 0xEDF4, - 0x771A: 0xEDF2, - 0x771B: 0xB174, - 0x771C: 0xB175, - 0x771D: 0xB176, - 0x771E: 0xB177, - 0x771F: 0xD5E6, - 0x7720: 0xC3DF, - 0x7721: 0xB178, - 0x7722: 0xEDF3, - 0x7723: 0xB179, - 0x7724: 0xB17A, - 0x7725: 0xB17B, - 0x7726: 0xEDF6, - 0x7727: 0xB17C, - 0x7728: 0xD5A3, - 0x7729: 0xD1A3, - 0x772A: 0xB17D, - 0x772B: 0xB17E, - 0x772C: 0xB180, - 0x772D: 0xEDF5, - 0x772E: 0xB181, - 0x772F: 0xC3D0, - 0x7730: 0xB182, - 0x7731: 0xB183, - 0x7732: 0xB184, - 0x7733: 0xB185, - 0x7734: 0xB186, - 0x7735: 0xEDF7, - 0x7736: 0xBFF4, - 0x7737: 0xBEEC, - 0x7738: 0xEDF8, - 0x7739: 0xB187, - 0x773A: 0xCCF7, - 0x773B: 0xB188, - 0x773C: 0xD1DB, - 0x773D: 0xB189, - 0x773E: 0xB18A, - 0x773F: 0xB18B, - 0x7740: 0xD7C5, - 0x7741: 0xD5F6, - 0x7742: 0xB18C, - 0x7743: 0xEDFC, - 0x7744: 0xB18D, - 0x7745: 0xB18E, - 0x7746: 0xB18F, - 0x7747: 0xEDFB, - 0x7748: 0xB190, - 0x7749: 0xB191, - 0x774A: 0xB192, - 0x774B: 0xB193, - 0x774C: 0xB194, - 0x774D: 0xB195, - 0x774E: 0xB196, - 0x774F: 0xB197, - 0x7750: 0xEDF9, - 0x7751: 0xEDFA, - 0x7752: 0xB198, - 0x7753: 0xB199, - 0x7754: 0xB19A, - 0x7755: 0xB19B, - 0x7756: 0xB19C, - 0x7757: 0xB19D, - 0x7758: 0xB19E, - 0x7759: 0xB19F, - 0x775A: 0xEDFD, - 0x775B: 0xBEA6, - 0x775C: 0xB1A0, - 0x775D: 0xB240, - 0x775E: 0xB241, - 0x775F: 0xB242, - 0x7760: 0xB243, - 0x7761: 0xCBAF, - 0x7762: 0xEEA1, - 0x7763: 0xB6BD, - 0x7764: 0xB244, - 0x7765: 0xEEA2, - 0x7766: 0xC4C0, - 0x7767: 0xB245, - 0x7768: 0xEDFE, - 0x7769: 0xB246, - 0x776A: 0xB247, - 0x776B: 0xBDDE, - 0x776C: 0xB2C7, - 0x776D: 0xB248, - 0x776E: 0xB249, - 0x776F: 0xB24A, - 0x7770: 0xB24B, - 0x7771: 0xB24C, - 0x7772: 0xB24D, - 0x7773: 0xB24E, - 0x7774: 0xB24F, - 0x7775: 0xB250, - 0x7776: 0xB251, - 0x7777: 0xB252, - 0x7778: 0xB253, - 0x7779: 0xB6C3, - 0x777A: 0xB254, - 0x777B: 0xB255, - 0x777C: 0xB256, - 0x777D: 0xEEA5, - 0x777E: 0xD8BA, - 0x777F: 0xEEA3, - 0x7780: 0xEEA6, - 0x7781: 0xB257, - 0x7782: 0xB258, - 0x7783: 0xB259, - 0x7784: 0xC3E9, - 0x7785: 0xB3F2, - 0x7786: 0xB25A, - 0x7787: 0xB25B, - 0x7788: 0xB25C, - 0x7789: 0xB25D, - 0x778A: 0xB25E, - 0x778B: 0xB25F, - 0x778C: 0xEEA7, - 0x778D: 0xEEA4, - 0x778E: 0xCFB9, - 0x778F: 0xB260, - 0x7790: 0xB261, - 0x7791: 0xEEA8, - 0x7792: 0xC2F7, - 0x7793: 0xB262, - 0x7794: 0xB263, - 0x7795: 0xB264, - 0x7796: 0xB265, - 0x7797: 0xB266, - 0x7798: 0xB267, - 0x7799: 0xB268, - 0x779A: 0xB269, - 0x779B: 0xB26A, - 0x779C: 0xB26B, - 0x779D: 0xB26C, - 0x779E: 0xB26D, - 0x779F: 0xEEA9, - 0x77A0: 0xEEAA, - 0x77A1: 0xB26E, - 0x77A2: 0xDEAB, - 0x77A3: 0xB26F, - 0x77A4: 0xB270, - 0x77A5: 0xC6B3, - 0x77A6: 0xB271, - 0x77A7: 0xC7C6, - 0x77A8: 0xB272, - 0x77A9: 0xD6F5, - 0x77AA: 0xB5C9, - 0x77AB: 0xB273, - 0x77AC: 0xCBB2, - 0x77AD: 0xB274, - 0x77AE: 0xB275, - 0x77AF: 0xB276, - 0x77B0: 0xEEAB, - 0x77B1: 0xB277, - 0x77B2: 0xB278, - 0x77B3: 0xCDAB, - 0x77B4: 0xB279, - 0x77B5: 0xEEAC, - 0x77B6: 0xB27A, - 0x77B7: 0xB27B, - 0x77B8: 0xB27C, - 0x77B9: 0xB27D, - 0x77BA: 0xB27E, - 0x77BB: 0xD5B0, - 0x77BC: 0xB280, - 0x77BD: 0xEEAD, - 0x77BE: 0xB281, - 0x77BF: 0xF6C4, - 0x77C0: 0xB282, - 0x77C1: 0xB283, - 0x77C2: 0xB284, - 0x77C3: 0xB285, - 0x77C4: 0xB286, - 0x77C5: 0xB287, - 0x77C6: 0xB288, - 0x77C7: 0xB289, - 0x77C8: 0xB28A, - 0x77C9: 0xB28B, - 0x77CA: 0xB28C, - 0x77CB: 0xB28D, - 0x77CC: 0xB28E, - 0x77CD: 0xDBC7, - 0x77CE: 0xB28F, - 0x77CF: 0xB290, - 0x77D0: 0xB291, - 0x77D1: 0xB292, - 0x77D2: 0xB293, - 0x77D3: 0xB294, - 0x77D4: 0xB295, - 0x77D5: 0xB296, - 0x77D6: 0xB297, - 0x77D7: 0xB4A3, - 0x77D8: 0xB298, - 0x77D9: 0xB299, - 0x77DA: 0xB29A, - 0x77DB: 0xC3AC, - 0x77DC: 0xF1E6, - 0x77DD: 0xB29B, - 0x77DE: 0xB29C, - 0x77DF: 0xB29D, - 0x77E0: 0xB29E, - 0x77E1: 0xB29F, - 0x77E2: 0xCAB8, - 0x77E3: 0xD2D3, - 0x77E4: 0xB2A0, - 0x77E5: 0xD6AA, - 0x77E6: 0xB340, - 0x77E7: 0xEFF2, - 0x77E8: 0xB341, - 0x77E9: 0xBED8, - 0x77EA: 0xB342, - 0x77EB: 0xBDC3, - 0x77EC: 0xEFF3, - 0x77ED: 0xB6CC, - 0x77EE: 0xB0AB, - 0x77EF: 0xB343, - 0x77F0: 0xB344, - 0x77F1: 0xB345, - 0x77F2: 0xB346, - 0x77F3: 0xCAAF, - 0x77F4: 0xB347, - 0x77F5: 0xB348, - 0x77F6: 0xEDB6, - 0x77F7: 0xB349, - 0x77F8: 0xEDB7, - 0x77F9: 0xB34A, - 0x77FA: 0xB34B, - 0x77FB: 0xB34C, - 0x77FC: 0xB34D, - 0x77FD: 0xCEF9, - 0x77FE: 0xB7AF, - 0x77FF: 0xBFF3, - 0x7800: 0xEDB8, - 0x7801: 0xC2EB, - 0x7802: 0xC9B0, - 0x7803: 0xB34E, - 0x7804: 0xB34F, - 0x7805: 0xB350, - 0x7806: 0xB351, - 0x7807: 0xB352, - 0x7808: 0xB353, - 0x7809: 0xEDB9, - 0x780A: 0xB354, - 0x780B: 0xB355, - 0x780C: 0xC6F6, - 0x780D: 0xBFB3, - 0x780E: 0xB356, - 0x780F: 0xB357, - 0x7810: 0xB358, - 0x7811: 0xEDBC, - 0x7812: 0xC5F8, - 0x7813: 0xB359, - 0x7814: 0xD1D0, - 0x7815: 0xB35A, - 0x7816: 0xD7A9, - 0x7817: 0xEDBA, - 0x7818: 0xEDBB, - 0x7819: 0xB35B, - 0x781A: 0xD1E2, - 0x781B: 0xB35C, - 0x781C: 0xEDBF, - 0x781D: 0xEDC0, - 0x781E: 0xB35D, - 0x781F: 0xEDC4, - 0x7820: 0xB35E, - 0x7821: 0xB35F, - 0x7822: 0xB360, - 0x7823: 0xEDC8, - 0x7824: 0xB361, - 0x7825: 0xEDC6, - 0x7826: 0xEDCE, - 0x7827: 0xD5E8, - 0x7828: 0xB362, - 0x7829: 0xEDC9, - 0x782A: 0xB363, - 0x782B: 0xB364, - 0x782C: 0xEDC7, - 0x782D: 0xEDBE, - 0x782E: 0xB365, - 0x782F: 0xB366, - 0x7830: 0xC5E9, - 0x7831: 0xB367, - 0x7832: 0xB368, - 0x7833: 0xB369, - 0x7834: 0xC6C6, - 0x7835: 0xB36A, - 0x7836: 0xB36B, - 0x7837: 0xC9E9, - 0x7838: 0xD4D2, - 0x7839: 0xEDC1, - 0x783A: 0xEDC2, - 0x783B: 0xEDC3, - 0x783C: 0xEDC5, - 0x783D: 0xB36C, - 0x783E: 0xC0F9, - 0x783F: 0xB36D, - 0x7840: 0xB4A1, - 0x7841: 0xB36E, - 0x7842: 0xB36F, - 0x7843: 0xB370, - 0x7844: 0xB371, - 0x7845: 0xB9E8, - 0x7846: 0xB372, - 0x7847: 0xEDD0, - 0x7848: 0xB373, - 0x7849: 0xB374, - 0x784A: 0xB375, - 0x784B: 0xB376, - 0x784C: 0xEDD1, - 0x784D: 0xB377, - 0x784E: 0xEDCA, - 0x784F: 0xB378, - 0x7850: 0xEDCF, - 0x7851: 0xB379, - 0x7852: 0xCEF8, - 0x7853: 0xB37A, - 0x7854: 0xB37B, - 0x7855: 0xCBB6, - 0x7856: 0xEDCC, - 0x7857: 0xEDCD, - 0x7858: 0xB37C, - 0x7859: 0xB37D, - 0x785A: 0xB37E, - 0x785B: 0xB380, - 0x785C: 0xB381, - 0x785D: 0xCFF5, - 0x785E: 0xB382, - 0x785F: 0xB383, - 0x7860: 0xB384, - 0x7861: 0xB385, - 0x7862: 0xB386, - 0x7863: 0xB387, - 0x7864: 0xB388, - 0x7865: 0xB389, - 0x7866: 0xB38A, - 0x7867: 0xB38B, - 0x7868: 0xB38C, - 0x7869: 0xB38D, - 0x786A: 0xEDD2, - 0x786B: 0xC1F2, - 0x786C: 0xD3B2, - 0x786D: 0xEDCB, - 0x786E: 0xC8B7, - 0x786F: 0xB38E, - 0x7870: 0xB38F, - 0x7871: 0xB390, - 0x7872: 0xB391, - 0x7873: 0xB392, - 0x7874: 0xB393, - 0x7875: 0xB394, - 0x7876: 0xB395, - 0x7877: 0xBCEF, - 0x7878: 0xB396, - 0x7879: 0xB397, - 0x787A: 0xB398, - 0x787B: 0xB399, - 0x787C: 0xC5F0, - 0x787D: 0xB39A, - 0x787E: 0xB39B, - 0x787F: 0xB39C, - 0x7880: 0xB39D, - 0x7881: 0xB39E, - 0x7882: 0xB39F, - 0x7883: 0xB3A0, - 0x7884: 0xB440, - 0x7885: 0xB441, - 0x7886: 0xB442, - 0x7887: 0xEDD6, - 0x7888: 0xB443, - 0x7889: 0xB5EF, - 0x788A: 0xB444, - 0x788B: 0xB445, - 0x788C: 0xC2B5, - 0x788D: 0xB0AD, - 0x788E: 0xCBE9, - 0x788F: 0xB446, - 0x7890: 0xB447, - 0x7891: 0xB1AE, - 0x7892: 0xB448, - 0x7893: 0xEDD4, - 0x7894: 0xB449, - 0x7895: 0xB44A, - 0x7896: 0xB44B, - 0x7897: 0xCDEB, - 0x7898: 0xB5E2, - 0x7899: 0xB44C, - 0x789A: 0xEDD5, - 0x789B: 0xEDD3, - 0x789C: 0xEDD7, - 0x789D: 0xB44D, - 0x789E: 0xB44E, - 0x789F: 0xB5FA, - 0x78A0: 0xB44F, - 0x78A1: 0xEDD8, - 0x78A2: 0xB450, - 0x78A3: 0xEDD9, - 0x78A4: 0xB451, - 0x78A5: 0xEDDC, - 0x78A6: 0xB452, - 0x78A7: 0xB1CC, - 0x78A8: 0xB453, - 0x78A9: 0xB454, - 0x78AA: 0xB455, - 0x78AB: 0xB456, - 0x78AC: 0xB457, - 0x78AD: 0xB458, - 0x78AE: 0xB459, - 0x78AF: 0xB45A, - 0x78B0: 0xC5F6, - 0x78B1: 0xBCEE, - 0x78B2: 0xEDDA, - 0x78B3: 0xCCBC, - 0x78B4: 0xB2EA, - 0x78B5: 0xB45B, - 0x78B6: 0xB45C, - 0x78B7: 0xB45D, - 0x78B8: 0xB45E, - 0x78B9: 0xEDDB, - 0x78BA: 0xB45F, - 0x78BB: 0xB460, - 0x78BC: 0xB461, - 0x78BD: 0xB462, - 0x78BE: 0xC4EB, - 0x78BF: 0xB463, - 0x78C0: 0xB464, - 0x78C1: 0xB4C5, - 0x78C2: 0xB465, - 0x78C3: 0xB466, - 0x78C4: 0xB467, - 0x78C5: 0xB0F5, - 0x78C6: 0xB468, - 0x78C7: 0xB469, - 0x78C8: 0xB46A, - 0x78C9: 0xEDDF, - 0x78CA: 0xC0DA, - 0x78CB: 0xB4E8, - 0x78CC: 0xB46B, - 0x78CD: 0xB46C, - 0x78CE: 0xB46D, - 0x78CF: 0xB46E, - 0x78D0: 0xC5CD, - 0x78D1: 0xB46F, - 0x78D2: 0xB470, - 0x78D3: 0xB471, - 0x78D4: 0xEDDD, - 0x78D5: 0xBFC4, - 0x78D6: 0xB472, - 0x78D7: 0xB473, - 0x78D8: 0xB474, - 0x78D9: 0xEDDE, - 0x78DA: 0xB475, - 0x78DB: 0xB476, - 0x78DC: 0xB477, - 0x78DD: 0xB478, - 0x78DE: 0xB479, - 0x78DF: 0xB47A, - 0x78E0: 0xB47B, - 0x78E1: 0xB47C, - 0x78E2: 0xB47D, - 0x78E3: 0xB47E, - 0x78E4: 0xB480, - 0x78E5: 0xB481, - 0x78E6: 0xB482, - 0x78E7: 0xB483, - 0x78E8: 0xC4A5, - 0x78E9: 0xB484, - 0x78EA: 0xB485, - 0x78EB: 0xB486, - 0x78EC: 0xEDE0, - 0x78ED: 0xB487, - 0x78EE: 0xB488, - 0x78EF: 0xB489, - 0x78F0: 0xB48A, - 0x78F1: 0xB48B, - 0x78F2: 0xEDE1, - 0x78F3: 0xB48C, - 0x78F4: 0xEDE3, - 0x78F5: 0xB48D, - 0x78F6: 0xB48E, - 0x78F7: 0xC1D7, - 0x78F8: 0xB48F, - 0x78F9: 0xB490, - 0x78FA: 0xBBC7, - 0x78FB: 0xB491, - 0x78FC: 0xB492, - 0x78FD: 0xB493, - 0x78FE: 0xB494, - 0x78FF: 0xB495, - 0x7900: 0xB496, - 0x7901: 0xBDB8, - 0x7902: 0xB497, - 0x7903: 0xB498, - 0x7904: 0xB499, - 0x7905: 0xEDE2, - 0x7906: 0xB49A, - 0x7907: 0xB49B, - 0x7908: 0xB49C, - 0x7909: 0xB49D, - 0x790A: 0xB49E, - 0x790B: 0xB49F, - 0x790C: 0xB4A0, - 0x790D: 0xB540, - 0x790E: 0xB541, - 0x790F: 0xB542, - 0x7910: 0xB543, - 0x7911: 0xB544, - 0x7912: 0xB545, - 0x7913: 0xEDE4, - 0x7914: 0xB546, - 0x7915: 0xB547, - 0x7916: 0xB548, - 0x7917: 0xB549, - 0x7918: 0xB54A, - 0x7919: 0xB54B, - 0x791A: 0xB54C, - 0x791B: 0xB54D, - 0x791C: 0xB54E, - 0x791D: 0xB54F, - 0x791E: 0xEDE6, - 0x791F: 0xB550, - 0x7920: 0xB551, - 0x7921: 0xB552, - 0x7922: 0xB553, - 0x7923: 0xB554, - 0x7924: 0xEDE5, - 0x7925: 0xB555, - 0x7926: 0xB556, - 0x7927: 0xB557, - 0x7928: 0xB558, - 0x7929: 0xB559, - 0x792A: 0xB55A, - 0x792B: 0xB55B, - 0x792C: 0xB55C, - 0x792D: 0xB55D, - 0x792E: 0xB55E, - 0x792F: 0xB55F, - 0x7930: 0xB560, - 0x7931: 0xB561, - 0x7932: 0xB562, - 0x7933: 0xB563, - 0x7934: 0xEDE7, - 0x7935: 0xB564, - 0x7936: 0xB565, - 0x7937: 0xB566, - 0x7938: 0xB567, - 0x7939: 0xB568, - 0x793A: 0xCABE, - 0x793B: 0xECEA, - 0x793C: 0xC0F1, - 0x793D: 0xB569, - 0x793E: 0xC9E7, - 0x793F: 0xB56A, - 0x7940: 0xECEB, - 0x7941: 0xC6EE, - 0x7942: 0xB56B, - 0x7943: 0xB56C, - 0x7944: 0xB56D, - 0x7945: 0xB56E, - 0x7946: 0xECEC, - 0x7947: 0xB56F, - 0x7948: 0xC6ED, - 0x7949: 0xECED, - 0x794A: 0xB570, - 0x794B: 0xB571, - 0x794C: 0xB572, - 0x794D: 0xB573, - 0x794E: 0xB574, - 0x794F: 0xB575, - 0x7950: 0xB576, - 0x7951: 0xB577, - 0x7952: 0xB578, - 0x7953: 0xECF0, - 0x7954: 0xB579, - 0x7955: 0xB57A, - 0x7956: 0xD7E6, - 0x7957: 0xECF3, - 0x7958: 0xB57B, - 0x7959: 0xB57C, - 0x795A: 0xECF1, - 0x795B: 0xECEE, - 0x795C: 0xECEF, - 0x795D: 0xD7A3, - 0x795E: 0xC9F1, - 0x795F: 0xCBEE, - 0x7960: 0xECF4, - 0x7961: 0xB57D, - 0x7962: 0xECF2, - 0x7963: 0xB57E, - 0x7964: 0xB580, - 0x7965: 0xCFE9, - 0x7966: 0xB581, - 0x7967: 0xECF6, - 0x7968: 0xC6B1, - 0x7969: 0xB582, - 0x796A: 0xB583, - 0x796B: 0xB584, - 0x796C: 0xB585, - 0x796D: 0xBCC0, - 0x796E: 0xB586, - 0x796F: 0xECF5, - 0x7970: 0xB587, - 0x7971: 0xB588, - 0x7972: 0xB589, - 0x7973: 0xB58A, - 0x7974: 0xB58B, - 0x7975: 0xB58C, - 0x7976: 0xB58D, - 0x7977: 0xB5BB, - 0x7978: 0xBBF6, - 0x7979: 0xB58E, - 0x797A: 0xECF7, - 0x797B: 0xB58F, - 0x797C: 0xB590, - 0x797D: 0xB591, - 0x797E: 0xB592, - 0x797F: 0xB593, - 0x7980: 0xD9F7, - 0x7981: 0xBDFB, - 0x7982: 0xB594, - 0x7983: 0xB595, - 0x7984: 0xC2BB, - 0x7985: 0xECF8, - 0x7986: 0xB596, - 0x7987: 0xB597, - 0x7988: 0xB598, - 0x7989: 0xB599, - 0x798A: 0xECF9, - 0x798B: 0xB59A, - 0x798C: 0xB59B, - 0x798D: 0xB59C, - 0x798E: 0xB59D, - 0x798F: 0xB8A3, - 0x7990: 0xB59E, - 0x7991: 0xB59F, - 0x7992: 0xB5A0, - 0x7993: 0xB640, - 0x7994: 0xB641, - 0x7995: 0xB642, - 0x7996: 0xB643, - 0x7997: 0xB644, - 0x7998: 0xB645, - 0x7999: 0xB646, - 0x799A: 0xECFA, - 0x799B: 0xB647, - 0x799C: 0xB648, - 0x799D: 0xB649, - 0x799E: 0xB64A, - 0x799F: 0xB64B, - 0x79A0: 0xB64C, - 0x79A1: 0xB64D, - 0x79A2: 0xB64E, - 0x79A3: 0xB64F, - 0x79A4: 0xB650, - 0x79A5: 0xB651, - 0x79A6: 0xB652, - 0x79A7: 0xECFB, - 0x79A8: 0xB653, - 0x79A9: 0xB654, - 0x79AA: 0xB655, - 0x79AB: 0xB656, - 0x79AC: 0xB657, - 0x79AD: 0xB658, - 0x79AE: 0xB659, - 0x79AF: 0xB65A, - 0x79B0: 0xB65B, - 0x79B1: 0xB65C, - 0x79B2: 0xB65D, - 0x79B3: 0xECFC, - 0x79B4: 0xB65E, - 0x79B5: 0xB65F, - 0x79B6: 0xB660, - 0x79B7: 0xB661, - 0x79B8: 0xB662, - 0x79B9: 0xD3ED, - 0x79BA: 0xD8AE, - 0x79BB: 0xC0EB, - 0x79BC: 0xB663, - 0x79BD: 0xC7DD, - 0x79BE: 0xBACC, - 0x79BF: 0xB664, - 0x79C0: 0xD0E3, - 0x79C1: 0xCBBD, - 0x79C2: 0xB665, - 0x79C3: 0xCDBA, - 0x79C4: 0xB666, - 0x79C5: 0xB667, - 0x79C6: 0xB8D1, - 0x79C7: 0xB668, - 0x79C8: 0xB669, - 0x79C9: 0xB1FC, - 0x79CA: 0xB66A, - 0x79CB: 0xC7EF, - 0x79CC: 0xB66B, - 0x79CD: 0xD6D6, - 0x79CE: 0xB66C, - 0x79CF: 0xB66D, - 0x79D0: 0xB66E, - 0x79D1: 0xBFC6, - 0x79D2: 0xC3EB, - 0x79D3: 0xB66F, - 0x79D4: 0xB670, - 0x79D5: 0xEFF5, - 0x79D6: 0xB671, - 0x79D7: 0xB672, - 0x79D8: 0xC3D8, - 0x79D9: 0xB673, - 0x79DA: 0xB674, - 0x79DB: 0xB675, - 0x79DC: 0xB676, - 0x79DD: 0xB677, - 0x79DE: 0xB678, - 0x79DF: 0xD7E2, - 0x79E0: 0xB679, - 0x79E1: 0xB67A, - 0x79E2: 0xB67B, - 0x79E3: 0xEFF7, - 0x79E4: 0xB3D3, - 0x79E5: 0xB67C, - 0x79E6: 0xC7D8, - 0x79E7: 0xD1ED, - 0x79E8: 0xB67D, - 0x79E9: 0xD6C8, - 0x79EA: 0xB67E, - 0x79EB: 0xEFF8, - 0x79EC: 0xB680, - 0x79ED: 0xEFF6, - 0x79EE: 0xB681, - 0x79EF: 0xBBFD, - 0x79F0: 0xB3C6, - 0x79F1: 0xB682, - 0x79F2: 0xB683, - 0x79F3: 0xB684, - 0x79F4: 0xB685, - 0x79F5: 0xB686, - 0x79F6: 0xB687, - 0x79F7: 0xB688, - 0x79F8: 0xBDD5, - 0x79F9: 0xB689, - 0x79FA: 0xB68A, - 0x79FB: 0xD2C6, - 0x79FC: 0xB68B, - 0x79FD: 0xBBE0, - 0x79FE: 0xB68C, - 0x79FF: 0xB68D, - 0x7A00: 0xCFA1, - 0x7A01: 0xB68E, - 0x7A02: 0xEFFC, - 0x7A03: 0xEFFB, - 0x7A04: 0xB68F, - 0x7A05: 0xB690, - 0x7A06: 0xEFF9, - 0x7A07: 0xB691, - 0x7A08: 0xB692, - 0x7A09: 0xB693, - 0x7A0A: 0xB694, - 0x7A0B: 0xB3CC, - 0x7A0C: 0xB695, - 0x7A0D: 0xC9D4, - 0x7A0E: 0xCBB0, - 0x7A0F: 0xB696, - 0x7A10: 0xB697, - 0x7A11: 0xB698, - 0x7A12: 0xB699, - 0x7A13: 0xB69A, - 0x7A14: 0xEFFE, - 0x7A15: 0xB69B, - 0x7A16: 0xB69C, - 0x7A17: 0xB0DE, - 0x7A18: 0xB69D, - 0x7A19: 0xB69E, - 0x7A1A: 0xD6C9, - 0x7A1B: 0xB69F, - 0x7A1C: 0xB6A0, - 0x7A1D: 0xB740, - 0x7A1E: 0xEFFD, - 0x7A1F: 0xB741, - 0x7A20: 0xB3ED, - 0x7A21: 0xB742, - 0x7A22: 0xB743, - 0x7A23: 0xF6D5, - 0x7A24: 0xB744, - 0x7A25: 0xB745, - 0x7A26: 0xB746, - 0x7A27: 0xB747, - 0x7A28: 0xB748, - 0x7A29: 0xB749, - 0x7A2A: 0xB74A, - 0x7A2B: 0xB74B, - 0x7A2C: 0xB74C, - 0x7A2D: 0xB74D, - 0x7A2E: 0xB74E, - 0x7A2F: 0xB74F, - 0x7A30: 0xB750, - 0x7A31: 0xB751, - 0x7A32: 0xB752, - 0x7A33: 0xCEC8, - 0x7A34: 0xB753, - 0x7A35: 0xB754, - 0x7A36: 0xB755, - 0x7A37: 0xF0A2, - 0x7A38: 0xB756, - 0x7A39: 0xF0A1, - 0x7A3A: 0xB757, - 0x7A3B: 0xB5BE, - 0x7A3C: 0xBCDA, - 0x7A3D: 0xBBFC, - 0x7A3E: 0xB758, - 0x7A3F: 0xB8E5, - 0x7A40: 0xB759, - 0x7A41: 0xB75A, - 0x7A42: 0xB75B, - 0x7A43: 0xB75C, - 0x7A44: 0xB75D, - 0x7A45: 0xB75E, - 0x7A46: 0xC4C2, - 0x7A47: 0xB75F, - 0x7A48: 0xB760, - 0x7A49: 0xB761, - 0x7A4A: 0xB762, - 0x7A4B: 0xB763, - 0x7A4C: 0xB764, - 0x7A4D: 0xB765, - 0x7A4E: 0xB766, - 0x7A4F: 0xB767, - 0x7A50: 0xB768, - 0x7A51: 0xF0A3, - 0x7A52: 0xB769, - 0x7A53: 0xB76A, - 0x7A54: 0xB76B, - 0x7A55: 0xB76C, - 0x7A56: 0xB76D, - 0x7A57: 0xCBEB, - 0x7A58: 0xB76E, - 0x7A59: 0xB76F, - 0x7A5A: 0xB770, - 0x7A5B: 0xB771, - 0x7A5C: 0xB772, - 0x7A5D: 0xB773, - 0x7A5E: 0xB774, - 0x7A5F: 0xB775, - 0x7A60: 0xB776, - 0x7A61: 0xB777, - 0x7A62: 0xB778, - 0x7A63: 0xB779, - 0x7A64: 0xB77A, - 0x7A65: 0xB77B, - 0x7A66: 0xB77C, - 0x7A67: 0xB77D, - 0x7A68: 0xB77E, - 0x7A69: 0xB780, - 0x7A6A: 0xB781, - 0x7A6B: 0xB782, - 0x7A6C: 0xB783, - 0x7A6D: 0xB784, - 0x7A6E: 0xB785, - 0x7A6F: 0xB786, - 0x7A70: 0xF0A6, - 0x7A71: 0xB787, - 0x7A72: 0xB788, - 0x7A73: 0xB789, - 0x7A74: 0xD1A8, - 0x7A75: 0xB78A, - 0x7A76: 0xBEBF, - 0x7A77: 0xC7EE, - 0x7A78: 0xF1B6, - 0x7A79: 0xF1B7, - 0x7A7A: 0xBFD5, - 0x7A7B: 0xB78B, - 0x7A7C: 0xB78C, - 0x7A7D: 0xB78D, - 0x7A7E: 0xB78E, - 0x7A7F: 0xB4A9, - 0x7A80: 0xF1B8, - 0x7A81: 0xCDBB, - 0x7A82: 0xB78F, - 0x7A83: 0xC7D4, - 0x7A84: 0xD5AD, - 0x7A85: 0xB790, - 0x7A86: 0xF1B9, - 0x7A87: 0xB791, - 0x7A88: 0xF1BA, - 0x7A89: 0xB792, - 0x7A8A: 0xB793, - 0x7A8B: 0xB794, - 0x7A8C: 0xB795, - 0x7A8D: 0xC7CF, - 0x7A8E: 0xB796, - 0x7A8F: 0xB797, - 0x7A90: 0xB798, - 0x7A91: 0xD2A4, - 0x7A92: 0xD6CF, - 0x7A93: 0xB799, - 0x7A94: 0xB79A, - 0x7A95: 0xF1BB, - 0x7A96: 0xBDD1, - 0x7A97: 0xB4B0, - 0x7A98: 0xBEBD, - 0x7A99: 0xB79B, - 0x7A9A: 0xB79C, - 0x7A9B: 0xB79D, - 0x7A9C: 0xB4DC, - 0x7A9D: 0xCED1, - 0x7A9E: 0xB79E, - 0x7A9F: 0xBFDF, - 0x7AA0: 0xF1BD, - 0x7AA1: 0xB79F, - 0x7AA2: 0xB7A0, - 0x7AA3: 0xB840, - 0x7AA4: 0xB841, - 0x7AA5: 0xBFFA, - 0x7AA6: 0xF1BC, - 0x7AA7: 0xB842, - 0x7AA8: 0xF1BF, - 0x7AA9: 0xB843, - 0x7AAA: 0xB844, - 0x7AAB: 0xB845, - 0x7AAC: 0xF1BE, - 0x7AAD: 0xF1C0, - 0x7AAE: 0xB846, - 0x7AAF: 0xB847, - 0x7AB0: 0xB848, - 0x7AB1: 0xB849, - 0x7AB2: 0xB84A, - 0x7AB3: 0xF1C1, - 0x7AB4: 0xB84B, - 0x7AB5: 0xB84C, - 0x7AB6: 0xB84D, - 0x7AB7: 0xB84E, - 0x7AB8: 0xB84F, - 0x7AB9: 0xB850, - 0x7ABA: 0xB851, - 0x7ABB: 0xB852, - 0x7ABC: 0xB853, - 0x7ABD: 0xB854, - 0x7ABE: 0xB855, - 0x7ABF: 0xC1FE, - 0x7AC0: 0xB856, - 0x7AC1: 0xB857, - 0x7AC2: 0xB858, - 0x7AC3: 0xB859, - 0x7AC4: 0xB85A, - 0x7AC5: 0xB85B, - 0x7AC6: 0xB85C, - 0x7AC7: 0xB85D, - 0x7AC8: 0xB85E, - 0x7AC9: 0xB85F, - 0x7ACA: 0xB860, - 0x7ACB: 0xC1A2, - 0x7ACC: 0xB861, - 0x7ACD: 0xB862, - 0x7ACE: 0xB863, - 0x7ACF: 0xB864, - 0x7AD0: 0xB865, - 0x7AD1: 0xB866, - 0x7AD2: 0xB867, - 0x7AD3: 0xB868, - 0x7AD4: 0xB869, - 0x7AD5: 0xB86A, - 0x7AD6: 0xCAFA, - 0x7AD7: 0xB86B, - 0x7AD8: 0xB86C, - 0x7AD9: 0xD5BE, - 0x7ADA: 0xB86D, - 0x7ADB: 0xB86E, - 0x7ADC: 0xB86F, - 0x7ADD: 0xB870, - 0x7ADE: 0xBEBA, - 0x7ADF: 0xBEB9, - 0x7AE0: 0xD5C2, - 0x7AE1: 0xB871, - 0x7AE2: 0xB872, - 0x7AE3: 0xBFA2, - 0x7AE4: 0xB873, - 0x7AE5: 0xCDAF, - 0x7AE6: 0xF1B5, - 0x7AE7: 0xB874, - 0x7AE8: 0xB875, - 0x7AE9: 0xB876, - 0x7AEA: 0xB877, - 0x7AEB: 0xB878, - 0x7AEC: 0xB879, - 0x7AED: 0xBDDF, - 0x7AEE: 0xB87A, - 0x7AEF: 0xB6CB, - 0x7AF0: 0xB87B, - 0x7AF1: 0xB87C, - 0x7AF2: 0xB87D, - 0x7AF3: 0xB87E, - 0x7AF4: 0xB880, - 0x7AF5: 0xB881, - 0x7AF6: 0xB882, - 0x7AF7: 0xB883, - 0x7AF8: 0xB884, - 0x7AF9: 0xD6F1, - 0x7AFA: 0xF3C3, - 0x7AFB: 0xB885, - 0x7AFC: 0xB886, - 0x7AFD: 0xF3C4, - 0x7AFE: 0xB887, - 0x7AFF: 0xB8CD, - 0x7B00: 0xB888, - 0x7B01: 0xB889, - 0x7B02: 0xB88A, - 0x7B03: 0xF3C6, - 0x7B04: 0xF3C7, - 0x7B05: 0xB88B, - 0x7B06: 0xB0CA, - 0x7B07: 0xB88C, - 0x7B08: 0xF3C5, - 0x7B09: 0xB88D, - 0x7B0A: 0xF3C9, - 0x7B0B: 0xCBF1, - 0x7B0C: 0xB88E, - 0x7B0D: 0xB88F, - 0x7B0E: 0xB890, - 0x7B0F: 0xF3CB, - 0x7B10: 0xB891, - 0x7B11: 0xD0A6, - 0x7B12: 0xB892, - 0x7B13: 0xB893, - 0x7B14: 0xB1CA, - 0x7B15: 0xF3C8, - 0x7B16: 0xB894, - 0x7B17: 0xB895, - 0x7B18: 0xB896, - 0x7B19: 0xF3CF, - 0x7B1A: 0xB897, - 0x7B1B: 0xB5D1, - 0x7B1C: 0xB898, - 0x7B1D: 0xB899, - 0x7B1E: 0xF3D7, - 0x7B1F: 0xB89A, - 0x7B20: 0xF3D2, - 0x7B21: 0xB89B, - 0x7B22: 0xB89C, - 0x7B23: 0xB89D, - 0x7B24: 0xF3D4, - 0x7B25: 0xF3D3, - 0x7B26: 0xB7FB, - 0x7B27: 0xB89E, - 0x7B28: 0xB1BF, - 0x7B29: 0xB89F, - 0x7B2A: 0xF3CE, - 0x7B2B: 0xF3CA, - 0x7B2C: 0xB5DA, - 0x7B2D: 0xB8A0, - 0x7B2E: 0xF3D0, - 0x7B2F: 0xB940, - 0x7B30: 0xB941, - 0x7B31: 0xF3D1, - 0x7B32: 0xB942, - 0x7B33: 0xF3D5, - 0x7B34: 0xB943, - 0x7B35: 0xB944, - 0x7B36: 0xB945, - 0x7B37: 0xB946, - 0x7B38: 0xF3CD, - 0x7B39: 0xB947, - 0x7B3A: 0xBCE3, - 0x7B3B: 0xB948, - 0x7B3C: 0xC1FD, - 0x7B3D: 0xB949, - 0x7B3E: 0xF3D6, - 0x7B3F: 0xB94A, - 0x7B40: 0xB94B, - 0x7B41: 0xB94C, - 0x7B42: 0xB94D, - 0x7B43: 0xB94E, - 0x7B44: 0xB94F, - 0x7B45: 0xF3DA, - 0x7B46: 0xB950, - 0x7B47: 0xF3CC, - 0x7B48: 0xB951, - 0x7B49: 0xB5C8, - 0x7B4A: 0xB952, - 0x7B4B: 0xBDEE, - 0x7B4C: 0xF3DC, - 0x7B4D: 0xB953, - 0x7B4E: 0xB954, - 0x7B4F: 0xB7A4, - 0x7B50: 0xBFF0, - 0x7B51: 0xD6FE, - 0x7B52: 0xCDB2, - 0x7B53: 0xB955, - 0x7B54: 0xB4F0, - 0x7B55: 0xB956, - 0x7B56: 0xB2DF, - 0x7B57: 0xB957, - 0x7B58: 0xF3D8, - 0x7B59: 0xB958, - 0x7B5A: 0xF3D9, - 0x7B5B: 0xC9B8, - 0x7B5C: 0xB959, - 0x7B5D: 0xF3DD, - 0x7B5E: 0xB95A, - 0x7B5F: 0xB95B, - 0x7B60: 0xF3DE, - 0x7B61: 0xB95C, - 0x7B62: 0xF3E1, - 0x7B63: 0xB95D, - 0x7B64: 0xB95E, - 0x7B65: 0xB95F, - 0x7B66: 0xB960, - 0x7B67: 0xB961, - 0x7B68: 0xB962, - 0x7B69: 0xB963, - 0x7B6A: 0xB964, - 0x7B6B: 0xB965, - 0x7B6C: 0xB966, - 0x7B6D: 0xB967, - 0x7B6E: 0xF3DF, - 0x7B6F: 0xB968, - 0x7B70: 0xB969, - 0x7B71: 0xF3E3, - 0x7B72: 0xF3E2, - 0x7B73: 0xB96A, - 0x7B74: 0xB96B, - 0x7B75: 0xF3DB, - 0x7B76: 0xB96C, - 0x7B77: 0xBFEA, - 0x7B78: 0xB96D, - 0x7B79: 0xB3EF, - 0x7B7A: 0xB96E, - 0x7B7B: 0xF3E0, - 0x7B7C: 0xB96F, - 0x7B7D: 0xB970, - 0x7B7E: 0xC7A9, - 0x7B7F: 0xB971, - 0x7B80: 0xBCF2, - 0x7B81: 0xB972, - 0x7B82: 0xB973, - 0x7B83: 0xB974, - 0x7B84: 0xB975, - 0x7B85: 0xF3EB, - 0x7B86: 0xB976, - 0x7B87: 0xB977, - 0x7B88: 0xB978, - 0x7B89: 0xB979, - 0x7B8A: 0xB97A, - 0x7B8B: 0xB97B, - 0x7B8C: 0xB97C, - 0x7B8D: 0xB9BF, - 0x7B8E: 0xB97D, - 0x7B8F: 0xB97E, - 0x7B90: 0xF3E4, - 0x7B91: 0xB980, - 0x7B92: 0xB981, - 0x7B93: 0xB982, - 0x7B94: 0xB2AD, - 0x7B95: 0xBBFE, - 0x7B96: 0xB983, - 0x7B97: 0xCBE3, - 0x7B98: 0xB984, - 0x7B99: 0xB985, - 0x7B9A: 0xB986, - 0x7B9B: 0xB987, - 0x7B9C: 0xF3ED, - 0x7B9D: 0xF3E9, - 0x7B9E: 0xB988, - 0x7B9F: 0xB989, - 0x7BA0: 0xB98A, - 0x7BA1: 0xB9DC, - 0x7BA2: 0xF3EE, - 0x7BA3: 0xB98B, - 0x7BA4: 0xB98C, - 0x7BA5: 0xB98D, - 0x7BA6: 0xF3E5, - 0x7BA7: 0xF3E6, - 0x7BA8: 0xF3EA, - 0x7BA9: 0xC2E1, - 0x7BAA: 0xF3EC, - 0x7BAB: 0xF3EF, - 0x7BAC: 0xF3E8, - 0x7BAD: 0xBCFD, - 0x7BAE: 0xB98E, - 0x7BAF: 0xB98F, - 0x7BB0: 0xB990, - 0x7BB1: 0xCFE4, - 0x7BB2: 0xB991, - 0x7BB3: 0xB992, - 0x7BB4: 0xF3F0, - 0x7BB5: 0xB993, - 0x7BB6: 0xB994, - 0x7BB7: 0xB995, - 0x7BB8: 0xF3E7, - 0x7BB9: 0xB996, - 0x7BBA: 0xB997, - 0x7BBB: 0xB998, - 0x7BBC: 0xB999, - 0x7BBD: 0xB99A, - 0x7BBE: 0xB99B, - 0x7BBF: 0xB99C, - 0x7BC0: 0xB99D, - 0x7BC1: 0xF3F2, - 0x7BC2: 0xB99E, - 0x7BC3: 0xB99F, - 0x7BC4: 0xB9A0, - 0x7BC5: 0xBA40, - 0x7BC6: 0xD7AD, - 0x7BC7: 0xC6AA, - 0x7BC8: 0xBA41, - 0x7BC9: 0xBA42, - 0x7BCA: 0xBA43, - 0x7BCB: 0xBA44, - 0x7BCC: 0xF3F3, - 0x7BCD: 0xBA45, - 0x7BCE: 0xBA46, - 0x7BCF: 0xBA47, - 0x7BD0: 0xBA48, - 0x7BD1: 0xF3F1, - 0x7BD2: 0xBA49, - 0x7BD3: 0xC2A8, - 0x7BD4: 0xBA4A, - 0x7BD5: 0xBA4B, - 0x7BD6: 0xBA4C, - 0x7BD7: 0xBA4D, - 0x7BD8: 0xBA4E, - 0x7BD9: 0xB8DD, - 0x7BDA: 0xF3F5, - 0x7BDB: 0xBA4F, - 0x7BDC: 0xBA50, - 0x7BDD: 0xF3F4, - 0x7BDE: 0xBA51, - 0x7BDF: 0xBA52, - 0x7BE0: 0xBA53, - 0x7BE1: 0xB4DB, - 0x7BE2: 0xBA54, - 0x7BE3: 0xBA55, - 0x7BE4: 0xBA56, - 0x7BE5: 0xF3F6, - 0x7BE6: 0xF3F7, - 0x7BE7: 0xBA57, - 0x7BE8: 0xBA58, - 0x7BE9: 0xBA59, - 0x7BEA: 0xF3F8, - 0x7BEB: 0xBA5A, - 0x7BEC: 0xBA5B, - 0x7BED: 0xBA5C, - 0x7BEE: 0xC0BA, - 0x7BEF: 0xBA5D, - 0x7BF0: 0xBA5E, - 0x7BF1: 0xC0E9, - 0x7BF2: 0xBA5F, - 0x7BF3: 0xBA60, - 0x7BF4: 0xBA61, - 0x7BF5: 0xBA62, - 0x7BF6: 0xBA63, - 0x7BF7: 0xC5F1, - 0x7BF8: 0xBA64, - 0x7BF9: 0xBA65, - 0x7BFA: 0xBA66, - 0x7BFB: 0xBA67, - 0x7BFC: 0xF3FB, - 0x7BFD: 0xBA68, - 0x7BFE: 0xF3FA, - 0x7BFF: 0xBA69, - 0x7C00: 0xBA6A, - 0x7C01: 0xBA6B, - 0x7C02: 0xBA6C, - 0x7C03: 0xBA6D, - 0x7C04: 0xBA6E, - 0x7C05: 0xBA6F, - 0x7C06: 0xBA70, - 0x7C07: 0xB4D8, - 0x7C08: 0xBA71, - 0x7C09: 0xBA72, - 0x7C0A: 0xBA73, - 0x7C0B: 0xF3FE, - 0x7C0C: 0xF3F9, - 0x7C0D: 0xBA74, - 0x7C0E: 0xBA75, - 0x7C0F: 0xF3FC, - 0x7C10: 0xBA76, - 0x7C11: 0xBA77, - 0x7C12: 0xBA78, - 0x7C13: 0xBA79, - 0x7C14: 0xBA7A, - 0x7C15: 0xBA7B, - 0x7C16: 0xF3FD, - 0x7C17: 0xBA7C, - 0x7C18: 0xBA7D, - 0x7C19: 0xBA7E, - 0x7C1A: 0xBA80, - 0x7C1B: 0xBA81, - 0x7C1C: 0xBA82, - 0x7C1D: 0xBA83, - 0x7C1E: 0xBA84, - 0x7C1F: 0xF4A1, - 0x7C20: 0xBA85, - 0x7C21: 0xBA86, - 0x7C22: 0xBA87, - 0x7C23: 0xBA88, - 0x7C24: 0xBA89, - 0x7C25: 0xBA8A, - 0x7C26: 0xF4A3, - 0x7C27: 0xBBC9, - 0x7C28: 0xBA8B, - 0x7C29: 0xBA8C, - 0x7C2A: 0xF4A2, - 0x7C2B: 0xBA8D, - 0x7C2C: 0xBA8E, - 0x7C2D: 0xBA8F, - 0x7C2E: 0xBA90, - 0x7C2F: 0xBA91, - 0x7C30: 0xBA92, - 0x7C31: 0xBA93, - 0x7C32: 0xBA94, - 0x7C33: 0xBA95, - 0x7C34: 0xBA96, - 0x7C35: 0xBA97, - 0x7C36: 0xBA98, - 0x7C37: 0xBA99, - 0x7C38: 0xF4A4, - 0x7C39: 0xBA9A, - 0x7C3A: 0xBA9B, - 0x7C3B: 0xBA9C, - 0x7C3C: 0xBA9D, - 0x7C3D: 0xBA9E, - 0x7C3E: 0xBA9F, - 0x7C3F: 0xB2BE, - 0x7C40: 0xF4A6, - 0x7C41: 0xF4A5, - 0x7C42: 0xBAA0, - 0x7C43: 0xBB40, - 0x7C44: 0xBB41, - 0x7C45: 0xBB42, - 0x7C46: 0xBB43, - 0x7C47: 0xBB44, - 0x7C48: 0xBB45, - 0x7C49: 0xBB46, - 0x7C4A: 0xBB47, - 0x7C4B: 0xBB48, - 0x7C4C: 0xBB49, - 0x7C4D: 0xBCAE, - 0x7C4E: 0xBB4A, - 0x7C4F: 0xBB4B, - 0x7C50: 0xBB4C, - 0x7C51: 0xBB4D, - 0x7C52: 0xBB4E, - 0x7C53: 0xBB4F, - 0x7C54: 0xBB50, - 0x7C55: 0xBB51, - 0x7C56: 0xBB52, - 0x7C57: 0xBB53, - 0x7C58: 0xBB54, - 0x7C59: 0xBB55, - 0x7C5A: 0xBB56, - 0x7C5B: 0xBB57, - 0x7C5C: 0xBB58, - 0x7C5D: 0xBB59, - 0x7C5E: 0xBB5A, - 0x7C5F: 0xBB5B, - 0x7C60: 0xBB5C, - 0x7C61: 0xBB5D, - 0x7C62: 0xBB5E, - 0x7C63: 0xBB5F, - 0x7C64: 0xBB60, - 0x7C65: 0xBB61, - 0x7C66: 0xBB62, - 0x7C67: 0xBB63, - 0x7C68: 0xBB64, - 0x7C69: 0xBB65, - 0x7C6A: 0xBB66, - 0x7C6B: 0xBB67, - 0x7C6C: 0xBB68, - 0x7C6D: 0xBB69, - 0x7C6E: 0xBB6A, - 0x7C6F: 0xBB6B, - 0x7C70: 0xBB6C, - 0x7C71: 0xBB6D, - 0x7C72: 0xBB6E, - 0x7C73: 0xC3D7, - 0x7C74: 0xD9E1, - 0x7C75: 0xBB6F, - 0x7C76: 0xBB70, - 0x7C77: 0xBB71, - 0x7C78: 0xBB72, - 0x7C79: 0xBB73, - 0x7C7A: 0xBB74, - 0x7C7B: 0xC0E0, - 0x7C7C: 0xF4CC, - 0x7C7D: 0xD7D1, - 0x7C7E: 0xBB75, - 0x7C7F: 0xBB76, - 0x7C80: 0xBB77, - 0x7C81: 0xBB78, - 0x7C82: 0xBB79, - 0x7C83: 0xBB7A, - 0x7C84: 0xBB7B, - 0x7C85: 0xBB7C, - 0x7C86: 0xBB7D, - 0x7C87: 0xBB7E, - 0x7C88: 0xBB80, - 0x7C89: 0xB7DB, - 0x7C8A: 0xBB81, - 0x7C8B: 0xBB82, - 0x7C8C: 0xBB83, - 0x7C8D: 0xBB84, - 0x7C8E: 0xBB85, - 0x7C8F: 0xBB86, - 0x7C90: 0xBB87, - 0x7C91: 0xF4CE, - 0x7C92: 0xC1A3, - 0x7C93: 0xBB88, - 0x7C94: 0xBB89, - 0x7C95: 0xC6C9, - 0x7C96: 0xBB8A, - 0x7C97: 0xB4D6, - 0x7C98: 0xD5B3, - 0x7C99: 0xBB8B, - 0x7C9A: 0xBB8C, - 0x7C9B: 0xBB8D, - 0x7C9C: 0xF4D0, - 0x7C9D: 0xF4CF, - 0x7C9E: 0xF4D1, - 0x7C9F: 0xCBDA, - 0x7CA0: 0xBB8E, - 0x7CA1: 0xBB8F, - 0x7CA2: 0xF4D2, - 0x7CA3: 0xBB90, - 0x7CA4: 0xD4C1, - 0x7CA5: 0xD6E0, - 0x7CA6: 0xBB91, - 0x7CA7: 0xBB92, - 0x7CA8: 0xBB93, - 0x7CA9: 0xBB94, - 0x7CAA: 0xB7E0, - 0x7CAB: 0xBB95, - 0x7CAC: 0xBB96, - 0x7CAD: 0xBB97, - 0x7CAE: 0xC1B8, - 0x7CAF: 0xBB98, - 0x7CB0: 0xBB99, - 0x7CB1: 0xC1BB, - 0x7CB2: 0xF4D3, - 0x7CB3: 0xBEAC, - 0x7CB4: 0xBB9A, - 0x7CB5: 0xBB9B, - 0x7CB6: 0xBB9C, - 0x7CB7: 0xBB9D, - 0x7CB8: 0xBB9E, - 0x7CB9: 0xB4E2, - 0x7CBA: 0xBB9F, - 0x7CBB: 0xBBA0, - 0x7CBC: 0xF4D4, - 0x7CBD: 0xF4D5, - 0x7CBE: 0xBEAB, - 0x7CBF: 0xBC40, - 0x7CC0: 0xBC41, - 0x7CC1: 0xF4D6, - 0x7CC2: 0xBC42, - 0x7CC3: 0xBC43, - 0x7CC4: 0xBC44, - 0x7CC5: 0xF4DB, - 0x7CC6: 0xBC45, - 0x7CC7: 0xF4D7, - 0x7CC8: 0xF4DA, - 0x7CC9: 0xBC46, - 0x7CCA: 0xBAFD, - 0x7CCB: 0xBC47, - 0x7CCC: 0xF4D8, - 0x7CCD: 0xF4D9, - 0x7CCE: 0xBC48, - 0x7CCF: 0xBC49, - 0x7CD0: 0xBC4A, - 0x7CD1: 0xBC4B, - 0x7CD2: 0xBC4C, - 0x7CD3: 0xBC4D, - 0x7CD4: 0xBC4E, - 0x7CD5: 0xB8E2, - 0x7CD6: 0xCCC7, - 0x7CD7: 0xF4DC, - 0x7CD8: 0xBC4F, - 0x7CD9: 0xB2DA, - 0x7CDA: 0xBC50, - 0x7CDB: 0xBC51, - 0x7CDC: 0xC3D3, - 0x7CDD: 0xBC52, - 0x7CDE: 0xBC53, - 0x7CDF: 0xD4E3, - 0x7CE0: 0xBFB7, - 0x7CE1: 0xBC54, - 0x7CE2: 0xBC55, - 0x7CE3: 0xBC56, - 0x7CE4: 0xBC57, - 0x7CE5: 0xBC58, - 0x7CE6: 0xBC59, - 0x7CE7: 0xBC5A, - 0x7CE8: 0xF4DD, - 0x7CE9: 0xBC5B, - 0x7CEA: 0xBC5C, - 0x7CEB: 0xBC5D, - 0x7CEC: 0xBC5E, - 0x7CED: 0xBC5F, - 0x7CEE: 0xBC60, - 0x7CEF: 0xC5B4, - 0x7CF0: 0xBC61, - 0x7CF1: 0xBC62, - 0x7CF2: 0xBC63, - 0x7CF3: 0xBC64, - 0x7CF4: 0xBC65, - 0x7CF5: 0xBC66, - 0x7CF6: 0xBC67, - 0x7CF7: 0xBC68, - 0x7CF8: 0xF4E9, - 0x7CF9: 0xBC69, - 0x7CFA: 0xBC6A, - 0x7CFB: 0xCFB5, - 0x7CFC: 0xBC6B, - 0x7CFD: 0xBC6C, - 0x7CFE: 0xBC6D, - 0x7CFF: 0xBC6E, - 0x7D00: 0xBC6F, - 0x7D01: 0xBC70, - 0x7D02: 0xBC71, - 0x7D03: 0xBC72, - 0x7D04: 0xBC73, - 0x7D05: 0xBC74, - 0x7D06: 0xBC75, - 0x7D07: 0xBC76, - 0x7D08: 0xBC77, - 0x7D09: 0xBC78, - 0x7D0A: 0xCEC9, - 0x7D0B: 0xBC79, - 0x7D0C: 0xBC7A, - 0x7D0D: 0xBC7B, - 0x7D0E: 0xBC7C, - 0x7D0F: 0xBC7D, - 0x7D10: 0xBC7E, - 0x7D11: 0xBC80, - 0x7D12: 0xBC81, - 0x7D13: 0xBC82, - 0x7D14: 0xBC83, - 0x7D15: 0xBC84, - 0x7D16: 0xBC85, - 0x7D17: 0xBC86, - 0x7D18: 0xBC87, - 0x7D19: 0xBC88, - 0x7D1A: 0xBC89, - 0x7D1B: 0xBC8A, - 0x7D1C: 0xBC8B, - 0x7D1D: 0xBC8C, - 0x7D1E: 0xBC8D, - 0x7D1F: 0xBC8E, - 0x7D20: 0xCBD8, - 0x7D21: 0xBC8F, - 0x7D22: 0xCBF7, - 0x7D23: 0xBC90, - 0x7D24: 0xBC91, - 0x7D25: 0xBC92, - 0x7D26: 0xBC93, - 0x7D27: 0xBDF4, - 0x7D28: 0xBC94, - 0x7D29: 0xBC95, - 0x7D2A: 0xBC96, - 0x7D2B: 0xD7CF, - 0x7D2C: 0xBC97, - 0x7D2D: 0xBC98, - 0x7D2E: 0xBC99, - 0x7D2F: 0xC0DB, - 0x7D30: 0xBC9A, - 0x7D31: 0xBC9B, - 0x7D32: 0xBC9C, - 0x7D33: 0xBC9D, - 0x7D34: 0xBC9E, - 0x7D35: 0xBC9F, - 0x7D36: 0xBCA0, - 0x7D37: 0xBD40, - 0x7D38: 0xBD41, - 0x7D39: 0xBD42, - 0x7D3A: 0xBD43, - 0x7D3B: 0xBD44, - 0x7D3C: 0xBD45, - 0x7D3D: 0xBD46, - 0x7D3E: 0xBD47, - 0x7D3F: 0xBD48, - 0x7D40: 0xBD49, - 0x7D41: 0xBD4A, - 0x7D42: 0xBD4B, - 0x7D43: 0xBD4C, - 0x7D44: 0xBD4D, - 0x7D45: 0xBD4E, - 0x7D46: 0xBD4F, - 0x7D47: 0xBD50, - 0x7D48: 0xBD51, - 0x7D49: 0xBD52, - 0x7D4A: 0xBD53, - 0x7D4B: 0xBD54, - 0x7D4C: 0xBD55, - 0x7D4D: 0xBD56, - 0x7D4E: 0xBD57, - 0x7D4F: 0xBD58, - 0x7D50: 0xBD59, - 0x7D51: 0xBD5A, - 0x7D52: 0xBD5B, - 0x7D53: 0xBD5C, - 0x7D54: 0xBD5D, - 0x7D55: 0xBD5E, - 0x7D56: 0xBD5F, - 0x7D57: 0xBD60, - 0x7D58: 0xBD61, - 0x7D59: 0xBD62, - 0x7D5A: 0xBD63, - 0x7D5B: 0xBD64, - 0x7D5C: 0xBD65, - 0x7D5D: 0xBD66, - 0x7D5E: 0xBD67, - 0x7D5F: 0xBD68, - 0x7D60: 0xBD69, - 0x7D61: 0xBD6A, - 0x7D62: 0xBD6B, - 0x7D63: 0xBD6C, - 0x7D64: 0xBD6D, - 0x7D65: 0xBD6E, - 0x7D66: 0xBD6F, - 0x7D67: 0xBD70, - 0x7D68: 0xBD71, - 0x7D69: 0xBD72, - 0x7D6A: 0xBD73, - 0x7D6B: 0xBD74, - 0x7D6C: 0xBD75, - 0x7D6D: 0xBD76, - 0x7D6E: 0xD0F5, - 0x7D6F: 0xBD77, - 0x7D70: 0xBD78, - 0x7D71: 0xBD79, - 0x7D72: 0xBD7A, - 0x7D73: 0xBD7B, - 0x7D74: 0xBD7C, - 0x7D75: 0xBD7D, - 0x7D76: 0xBD7E, - 0x7D77: 0xF4EA, - 0x7D78: 0xBD80, - 0x7D79: 0xBD81, - 0x7D7A: 0xBD82, - 0x7D7B: 0xBD83, - 0x7D7C: 0xBD84, - 0x7D7D: 0xBD85, - 0x7D7E: 0xBD86, - 0x7D7F: 0xBD87, - 0x7D80: 0xBD88, - 0x7D81: 0xBD89, - 0x7D82: 0xBD8A, - 0x7D83: 0xBD8B, - 0x7D84: 0xBD8C, - 0x7D85: 0xBD8D, - 0x7D86: 0xBD8E, - 0x7D87: 0xBD8F, - 0x7D88: 0xBD90, - 0x7D89: 0xBD91, - 0x7D8A: 0xBD92, - 0x7D8B: 0xBD93, - 0x7D8C: 0xBD94, - 0x7D8D: 0xBD95, - 0x7D8E: 0xBD96, - 0x7D8F: 0xBD97, - 0x7D90: 0xBD98, - 0x7D91: 0xBD99, - 0x7D92: 0xBD9A, - 0x7D93: 0xBD9B, - 0x7D94: 0xBD9C, - 0x7D95: 0xBD9D, - 0x7D96: 0xBD9E, - 0x7D97: 0xBD9F, - 0x7D98: 0xBDA0, - 0x7D99: 0xBE40, - 0x7D9A: 0xBE41, - 0x7D9B: 0xBE42, - 0x7D9C: 0xBE43, - 0x7D9D: 0xBE44, - 0x7D9E: 0xBE45, - 0x7D9F: 0xBE46, - 0x7DA0: 0xBE47, - 0x7DA1: 0xBE48, - 0x7DA2: 0xBE49, - 0x7DA3: 0xBE4A, - 0x7DA4: 0xBE4B, - 0x7DA5: 0xBE4C, - 0x7DA6: 0xF4EB, - 0x7DA7: 0xBE4D, - 0x7DA8: 0xBE4E, - 0x7DA9: 0xBE4F, - 0x7DAA: 0xBE50, - 0x7DAB: 0xBE51, - 0x7DAC: 0xBE52, - 0x7DAD: 0xBE53, - 0x7DAE: 0xF4EC, - 0x7DAF: 0xBE54, - 0x7DB0: 0xBE55, - 0x7DB1: 0xBE56, - 0x7DB2: 0xBE57, - 0x7DB3: 0xBE58, - 0x7DB4: 0xBE59, - 0x7DB5: 0xBE5A, - 0x7DB6: 0xBE5B, - 0x7DB7: 0xBE5C, - 0x7DB8: 0xBE5D, - 0x7DB9: 0xBE5E, - 0x7DBA: 0xBE5F, - 0x7DBB: 0xBE60, - 0x7DBC: 0xBE61, - 0x7DBD: 0xBE62, - 0x7DBE: 0xBE63, - 0x7DBF: 0xBE64, - 0x7DC0: 0xBE65, - 0x7DC1: 0xBE66, - 0x7DC2: 0xBE67, - 0x7DC3: 0xBE68, - 0x7DC4: 0xBE69, - 0x7DC5: 0xBE6A, - 0x7DC6: 0xBE6B, - 0x7DC7: 0xBE6C, - 0x7DC8: 0xBE6D, - 0x7DC9: 0xBE6E, - 0x7DCA: 0xBE6F, - 0x7DCB: 0xBE70, - 0x7DCC: 0xBE71, - 0x7DCD: 0xBE72, - 0x7DCE: 0xBE73, - 0x7DCF: 0xBE74, - 0x7DD0: 0xBE75, - 0x7DD1: 0xBE76, - 0x7DD2: 0xBE77, - 0x7DD3: 0xBE78, - 0x7DD4: 0xBE79, - 0x7DD5: 0xBE7A, - 0x7DD6: 0xBE7B, - 0x7DD7: 0xBE7C, - 0x7DD8: 0xBE7D, - 0x7DD9: 0xBE7E, - 0x7DDA: 0xBE80, - 0x7DDB: 0xBE81, - 0x7DDC: 0xBE82, - 0x7DDD: 0xBE83, - 0x7DDE: 0xBE84, - 0x7DDF: 0xBE85, - 0x7DE0: 0xBE86, - 0x7DE1: 0xBE87, - 0x7DE2: 0xBE88, - 0x7DE3: 0xBE89, - 0x7DE4: 0xBE8A, - 0x7DE5: 0xBE8B, - 0x7DE6: 0xBE8C, - 0x7DE7: 0xBE8D, - 0x7DE8: 0xBE8E, - 0x7DE9: 0xBE8F, - 0x7DEA: 0xBE90, - 0x7DEB: 0xBE91, - 0x7DEC: 0xBE92, - 0x7DED: 0xBE93, - 0x7DEE: 0xBE94, - 0x7DEF: 0xBE95, - 0x7DF0: 0xBE96, - 0x7DF1: 0xBE97, - 0x7DF2: 0xBE98, - 0x7DF3: 0xBE99, - 0x7DF4: 0xBE9A, - 0x7DF5: 0xBE9B, - 0x7DF6: 0xBE9C, - 0x7DF7: 0xBE9D, - 0x7DF8: 0xBE9E, - 0x7DF9: 0xBE9F, - 0x7DFA: 0xBEA0, - 0x7DFB: 0xBF40, - 0x7DFC: 0xBF41, - 0x7DFD: 0xBF42, - 0x7DFE: 0xBF43, - 0x7DFF: 0xBF44, - 0x7E00: 0xBF45, - 0x7E01: 0xBF46, - 0x7E02: 0xBF47, - 0x7E03: 0xBF48, - 0x7E04: 0xBF49, - 0x7E05: 0xBF4A, - 0x7E06: 0xBF4B, - 0x7E07: 0xBF4C, - 0x7E08: 0xBF4D, - 0x7E09: 0xBF4E, - 0x7E0A: 0xBF4F, - 0x7E0B: 0xBF50, - 0x7E0C: 0xBF51, - 0x7E0D: 0xBF52, - 0x7E0E: 0xBF53, - 0x7E0F: 0xBF54, - 0x7E10: 0xBF55, - 0x7E11: 0xBF56, - 0x7E12: 0xBF57, - 0x7E13: 0xBF58, - 0x7E14: 0xBF59, - 0x7E15: 0xBF5A, - 0x7E16: 0xBF5B, - 0x7E17: 0xBF5C, - 0x7E18: 0xBF5D, - 0x7E19: 0xBF5E, - 0x7E1A: 0xBF5F, - 0x7E1B: 0xBF60, - 0x7E1C: 0xBF61, - 0x7E1D: 0xBF62, - 0x7E1E: 0xBF63, - 0x7E1F: 0xBF64, - 0x7E20: 0xBF65, - 0x7E21: 0xBF66, - 0x7E22: 0xBF67, - 0x7E23: 0xBF68, - 0x7E24: 0xBF69, - 0x7E25: 0xBF6A, - 0x7E26: 0xBF6B, - 0x7E27: 0xBF6C, - 0x7E28: 0xBF6D, - 0x7E29: 0xBF6E, - 0x7E2A: 0xBF6F, - 0x7E2B: 0xBF70, - 0x7E2C: 0xBF71, - 0x7E2D: 0xBF72, - 0x7E2E: 0xBF73, - 0x7E2F: 0xBF74, - 0x7E30: 0xBF75, - 0x7E31: 0xBF76, - 0x7E32: 0xBF77, - 0x7E33: 0xBF78, - 0x7E34: 0xBF79, - 0x7E35: 0xBF7A, - 0x7E36: 0xBF7B, - 0x7E37: 0xBF7C, - 0x7E38: 0xBF7D, - 0x7E39: 0xBF7E, - 0x7E3A: 0xBF80, - 0x7E3B: 0xF7E3, - 0x7E3C: 0xBF81, - 0x7E3D: 0xBF82, - 0x7E3E: 0xBF83, - 0x7E3F: 0xBF84, - 0x7E40: 0xBF85, - 0x7E41: 0xB7B1, - 0x7E42: 0xBF86, - 0x7E43: 0xBF87, - 0x7E44: 0xBF88, - 0x7E45: 0xBF89, - 0x7E46: 0xBF8A, - 0x7E47: 0xF4ED, - 0x7E48: 0xBF8B, - 0x7E49: 0xBF8C, - 0x7E4A: 0xBF8D, - 0x7E4B: 0xBF8E, - 0x7E4C: 0xBF8F, - 0x7E4D: 0xBF90, - 0x7E4E: 0xBF91, - 0x7E4F: 0xBF92, - 0x7E50: 0xBF93, - 0x7E51: 0xBF94, - 0x7E52: 0xBF95, - 0x7E53: 0xBF96, - 0x7E54: 0xBF97, - 0x7E55: 0xBF98, - 0x7E56: 0xBF99, - 0x7E57: 0xBF9A, - 0x7E58: 0xBF9B, - 0x7E59: 0xBF9C, - 0x7E5A: 0xBF9D, - 0x7E5B: 0xBF9E, - 0x7E5C: 0xBF9F, - 0x7E5D: 0xBFA0, - 0x7E5E: 0xC040, - 0x7E5F: 0xC041, - 0x7E60: 0xC042, - 0x7E61: 0xC043, - 0x7E62: 0xC044, - 0x7E63: 0xC045, - 0x7E64: 0xC046, - 0x7E65: 0xC047, - 0x7E66: 0xC048, - 0x7E67: 0xC049, - 0x7E68: 0xC04A, - 0x7E69: 0xC04B, - 0x7E6A: 0xC04C, - 0x7E6B: 0xC04D, - 0x7E6C: 0xC04E, - 0x7E6D: 0xC04F, - 0x7E6E: 0xC050, - 0x7E6F: 0xC051, - 0x7E70: 0xC052, - 0x7E71: 0xC053, - 0x7E72: 0xC054, - 0x7E73: 0xC055, - 0x7E74: 0xC056, - 0x7E75: 0xC057, - 0x7E76: 0xC058, - 0x7E77: 0xC059, - 0x7E78: 0xC05A, - 0x7E79: 0xC05B, - 0x7E7A: 0xC05C, - 0x7E7B: 0xC05D, - 0x7E7C: 0xC05E, - 0x7E7D: 0xC05F, - 0x7E7E: 0xC060, - 0x7E7F: 0xC061, - 0x7E80: 0xC062, - 0x7E81: 0xC063, - 0x7E82: 0xD7EB, - 0x7E83: 0xC064, - 0x7E84: 0xC065, - 0x7E85: 0xC066, - 0x7E86: 0xC067, - 0x7E87: 0xC068, - 0x7E88: 0xC069, - 0x7E89: 0xC06A, - 0x7E8A: 0xC06B, - 0x7E8B: 0xC06C, - 0x7E8C: 0xC06D, - 0x7E8D: 0xC06E, - 0x7E8E: 0xC06F, - 0x7E8F: 0xC070, - 0x7E90: 0xC071, - 0x7E91: 0xC072, - 0x7E92: 0xC073, - 0x7E93: 0xC074, - 0x7E94: 0xC075, - 0x7E95: 0xC076, - 0x7E96: 0xC077, - 0x7E97: 0xC078, - 0x7E98: 0xC079, - 0x7E99: 0xC07A, - 0x7E9A: 0xC07B, - 0x7E9B: 0xF4EE, - 0x7E9C: 0xC07C, - 0x7E9D: 0xC07D, - 0x7E9E: 0xC07E, - 0x7E9F: 0xE6F9, - 0x7EA0: 0xBEC0, - 0x7EA1: 0xE6FA, - 0x7EA2: 0xBAEC, - 0x7EA3: 0xE6FB, - 0x7EA4: 0xCFCB, - 0x7EA5: 0xE6FC, - 0x7EA6: 0xD4BC, - 0x7EA7: 0xBCB6, - 0x7EA8: 0xE6FD, - 0x7EA9: 0xE6FE, - 0x7EAA: 0xBCCD, - 0x7EAB: 0xC8D2, - 0x7EAC: 0xCEB3, - 0x7EAD: 0xE7A1, - 0x7EAE: 0xC080, - 0x7EAF: 0xB4BF, - 0x7EB0: 0xE7A2, - 0x7EB1: 0xC9B4, - 0x7EB2: 0xB8D9, - 0x7EB3: 0xC4C9, - 0x7EB4: 0xC081, - 0x7EB5: 0xD7DD, - 0x7EB6: 0xC2DA, - 0x7EB7: 0xB7D7, - 0x7EB8: 0xD6BD, - 0x7EB9: 0xCEC6, - 0x7EBA: 0xB7C4, - 0x7EBB: 0xC082, - 0x7EBC: 0xC083, - 0x7EBD: 0xC5A6, - 0x7EBE: 0xE7A3, - 0x7EBF: 0xCFDF, - 0x7EC0: 0xE7A4, - 0x7EC1: 0xE7A5, - 0x7EC2: 0xE7A6, - 0x7EC3: 0xC1B7, - 0x7EC4: 0xD7E9, - 0x7EC5: 0xC9F0, - 0x7EC6: 0xCFB8, - 0x7EC7: 0xD6AF, - 0x7EC8: 0xD6D5, - 0x7EC9: 0xE7A7, - 0x7ECA: 0xB0ED, - 0x7ECB: 0xE7A8, - 0x7ECC: 0xE7A9, - 0x7ECD: 0xC9DC, - 0x7ECE: 0xD2EF, - 0x7ECF: 0xBEAD, - 0x7ED0: 0xE7AA, - 0x7ED1: 0xB0F3, - 0x7ED2: 0xC8DE, - 0x7ED3: 0xBDE1, - 0x7ED4: 0xE7AB, - 0x7ED5: 0xC8C6, - 0x7ED6: 0xC084, - 0x7ED7: 0xE7AC, - 0x7ED8: 0xBBE6, - 0x7ED9: 0xB8F8, - 0x7EDA: 0xD1A4, - 0x7EDB: 0xE7AD, - 0x7EDC: 0xC2E7, - 0x7EDD: 0xBEF8, - 0x7EDE: 0xBDCA, - 0x7EDF: 0xCDB3, - 0x7EE0: 0xE7AE, - 0x7EE1: 0xE7AF, - 0x7EE2: 0xBEEE, - 0x7EE3: 0xD0E5, - 0x7EE4: 0xC085, - 0x7EE5: 0xCBE7, - 0x7EE6: 0xCCD0, - 0x7EE7: 0xBCCC, - 0x7EE8: 0xE7B0, - 0x7EE9: 0xBCA8, - 0x7EEA: 0xD0F7, - 0x7EEB: 0xE7B1, - 0x7EEC: 0xC086, - 0x7EED: 0xD0F8, - 0x7EEE: 0xE7B2, - 0x7EEF: 0xE7B3, - 0x7EF0: 0xB4C2, - 0x7EF1: 0xE7B4, - 0x7EF2: 0xE7B5, - 0x7EF3: 0xC9FE, - 0x7EF4: 0xCEAC, - 0x7EF5: 0xC3E0, - 0x7EF6: 0xE7B7, - 0x7EF7: 0xB1C1, - 0x7EF8: 0xB3F1, - 0x7EF9: 0xC087, - 0x7EFA: 0xE7B8, - 0x7EFB: 0xE7B9, - 0x7EFC: 0xD7DB, - 0x7EFD: 0xD5C0, - 0x7EFE: 0xE7BA, - 0x7EFF: 0xC2CC, - 0x7F00: 0xD7BA, - 0x7F01: 0xE7BB, - 0x7F02: 0xE7BC, - 0x7F03: 0xE7BD, - 0x7F04: 0xBCEA, - 0x7F05: 0xC3E5, - 0x7F06: 0xC0C2, - 0x7F07: 0xE7BE, - 0x7F08: 0xE7BF, - 0x7F09: 0xBCA9, - 0x7F0A: 0xC088, - 0x7F0B: 0xE7C0, - 0x7F0C: 0xE7C1, - 0x7F0D: 0xE7B6, - 0x7F0E: 0xB6D0, - 0x7F0F: 0xE7C2, - 0x7F10: 0xC089, - 0x7F11: 0xE7C3, - 0x7F12: 0xE7C4, - 0x7F13: 0xBBBA, - 0x7F14: 0xB5DE, - 0x7F15: 0xC2C6, - 0x7F16: 0xB1E0, - 0x7F17: 0xE7C5, - 0x7F18: 0xD4B5, - 0x7F19: 0xE7C6, - 0x7F1A: 0xB8BF, - 0x7F1B: 0xE7C8, - 0x7F1C: 0xE7C7, - 0x7F1D: 0xB7EC, - 0x7F1E: 0xC08A, - 0x7F1F: 0xE7C9, - 0x7F20: 0xB2F8, - 0x7F21: 0xE7CA, - 0x7F22: 0xE7CB, - 0x7F23: 0xE7CC, - 0x7F24: 0xE7CD, - 0x7F25: 0xE7CE, - 0x7F26: 0xE7CF, - 0x7F27: 0xE7D0, - 0x7F28: 0xD3A7, - 0x7F29: 0xCBF5, - 0x7F2A: 0xE7D1, - 0x7F2B: 0xE7D2, - 0x7F2C: 0xE7D3, - 0x7F2D: 0xE7D4, - 0x7F2E: 0xC9C9, - 0x7F2F: 0xE7D5, - 0x7F30: 0xE7D6, - 0x7F31: 0xE7D7, - 0x7F32: 0xE7D8, - 0x7F33: 0xE7D9, - 0x7F34: 0xBDC9, - 0x7F35: 0xE7DA, - 0x7F36: 0xF3BE, - 0x7F37: 0xC08B, - 0x7F38: 0xB8D7, - 0x7F39: 0xC08C, - 0x7F3A: 0xC8B1, - 0x7F3B: 0xC08D, - 0x7F3C: 0xC08E, - 0x7F3D: 0xC08F, - 0x7F3E: 0xC090, - 0x7F3F: 0xC091, - 0x7F40: 0xC092, - 0x7F41: 0xC093, - 0x7F42: 0xF3BF, - 0x7F43: 0xC094, - 0x7F44: 0xF3C0, - 0x7F45: 0xF3C1, - 0x7F46: 0xC095, - 0x7F47: 0xC096, - 0x7F48: 0xC097, - 0x7F49: 0xC098, - 0x7F4A: 0xC099, - 0x7F4B: 0xC09A, - 0x7F4C: 0xC09B, - 0x7F4D: 0xC09C, - 0x7F4E: 0xC09D, - 0x7F4F: 0xC09E, - 0x7F50: 0xB9DE, - 0x7F51: 0xCDF8, - 0x7F52: 0xC09F, - 0x7F53: 0xC0A0, - 0x7F54: 0xD8E8, - 0x7F55: 0xBAB1, - 0x7F56: 0xC140, - 0x7F57: 0xC2DE, - 0x7F58: 0xEEB7, - 0x7F59: 0xC141, - 0x7F5A: 0xB7A3, - 0x7F5B: 0xC142, - 0x7F5C: 0xC143, - 0x7F5D: 0xC144, - 0x7F5E: 0xC145, - 0x7F5F: 0xEEB9, - 0x7F60: 0xC146, - 0x7F61: 0xEEB8, - 0x7F62: 0xB0D5, - 0x7F63: 0xC147, - 0x7F64: 0xC148, - 0x7F65: 0xC149, - 0x7F66: 0xC14A, - 0x7F67: 0xC14B, - 0x7F68: 0xEEBB, - 0x7F69: 0xD5D6, - 0x7F6A: 0xD7EF, - 0x7F6B: 0xC14C, - 0x7F6C: 0xC14D, - 0x7F6D: 0xC14E, - 0x7F6E: 0xD6C3, - 0x7F6F: 0xC14F, - 0x7F70: 0xC150, - 0x7F71: 0xEEBD, - 0x7F72: 0xCAF0, - 0x7F73: 0xC151, - 0x7F74: 0xEEBC, - 0x7F75: 0xC152, - 0x7F76: 0xC153, - 0x7F77: 0xC154, - 0x7F78: 0xC155, - 0x7F79: 0xEEBE, - 0x7F7A: 0xC156, - 0x7F7B: 0xC157, - 0x7F7C: 0xC158, - 0x7F7D: 0xC159, - 0x7F7E: 0xEEC0, - 0x7F7F: 0xC15A, - 0x7F80: 0xC15B, - 0x7F81: 0xEEBF, - 0x7F82: 0xC15C, - 0x7F83: 0xC15D, - 0x7F84: 0xC15E, - 0x7F85: 0xC15F, - 0x7F86: 0xC160, - 0x7F87: 0xC161, - 0x7F88: 0xC162, - 0x7F89: 0xC163, - 0x7F8A: 0xD1F2, - 0x7F8B: 0xC164, - 0x7F8C: 0xC7BC, - 0x7F8D: 0xC165, - 0x7F8E: 0xC3C0, - 0x7F8F: 0xC166, - 0x7F90: 0xC167, - 0x7F91: 0xC168, - 0x7F92: 0xC169, - 0x7F93: 0xC16A, - 0x7F94: 0xB8E1, - 0x7F95: 0xC16B, - 0x7F96: 0xC16C, - 0x7F97: 0xC16D, - 0x7F98: 0xC16E, - 0x7F99: 0xC16F, - 0x7F9A: 0xC1E7, - 0x7F9B: 0xC170, - 0x7F9C: 0xC171, - 0x7F9D: 0xF4C6, - 0x7F9E: 0xD0DF, - 0x7F9F: 0xF4C7, - 0x7FA0: 0xC172, - 0x7FA1: 0xCFDB, - 0x7FA2: 0xC173, - 0x7FA3: 0xC174, - 0x7FA4: 0xC8BA, - 0x7FA5: 0xC175, - 0x7FA6: 0xC176, - 0x7FA7: 0xF4C8, - 0x7FA8: 0xC177, - 0x7FA9: 0xC178, - 0x7FAA: 0xC179, - 0x7FAB: 0xC17A, - 0x7FAC: 0xC17B, - 0x7FAD: 0xC17C, - 0x7FAE: 0xC17D, - 0x7FAF: 0xF4C9, - 0x7FB0: 0xF4CA, - 0x7FB1: 0xC17E, - 0x7FB2: 0xF4CB, - 0x7FB3: 0xC180, - 0x7FB4: 0xC181, - 0x7FB5: 0xC182, - 0x7FB6: 0xC183, - 0x7FB7: 0xC184, - 0x7FB8: 0xD9FA, - 0x7FB9: 0xB8FE, - 0x7FBA: 0xC185, - 0x7FBB: 0xC186, - 0x7FBC: 0xE5F1, - 0x7FBD: 0xD3F0, - 0x7FBE: 0xC187, - 0x7FBF: 0xF4E0, - 0x7FC0: 0xC188, - 0x7FC1: 0xCECC, - 0x7FC2: 0xC189, - 0x7FC3: 0xC18A, - 0x7FC4: 0xC18B, - 0x7FC5: 0xB3E1, - 0x7FC6: 0xC18C, - 0x7FC7: 0xC18D, - 0x7FC8: 0xC18E, - 0x7FC9: 0xC18F, - 0x7FCA: 0xF1B4, - 0x7FCB: 0xC190, - 0x7FCC: 0xD2EE, - 0x7FCD: 0xC191, - 0x7FCE: 0xF4E1, - 0x7FCF: 0xC192, - 0x7FD0: 0xC193, - 0x7FD1: 0xC194, - 0x7FD2: 0xC195, - 0x7FD3: 0xC196, - 0x7FD4: 0xCFE8, - 0x7FD5: 0xF4E2, - 0x7FD6: 0xC197, - 0x7FD7: 0xC198, - 0x7FD8: 0xC7CC, - 0x7FD9: 0xC199, - 0x7FDA: 0xC19A, - 0x7FDB: 0xC19B, - 0x7FDC: 0xC19C, - 0x7FDD: 0xC19D, - 0x7FDE: 0xC19E, - 0x7FDF: 0xB5D4, - 0x7FE0: 0xB4E4, - 0x7FE1: 0xF4E4, - 0x7FE2: 0xC19F, - 0x7FE3: 0xC1A0, - 0x7FE4: 0xC240, - 0x7FE5: 0xF4E3, - 0x7FE6: 0xF4E5, - 0x7FE7: 0xC241, - 0x7FE8: 0xC242, - 0x7FE9: 0xF4E6, - 0x7FEA: 0xC243, - 0x7FEB: 0xC244, - 0x7FEC: 0xC245, - 0x7FED: 0xC246, - 0x7FEE: 0xF4E7, - 0x7FEF: 0xC247, - 0x7FF0: 0xBAB2, - 0x7FF1: 0xB0BF, - 0x7FF2: 0xC248, - 0x7FF3: 0xF4E8, - 0x7FF4: 0xC249, - 0x7FF5: 0xC24A, - 0x7FF6: 0xC24B, - 0x7FF7: 0xC24C, - 0x7FF8: 0xC24D, - 0x7FF9: 0xC24E, - 0x7FFA: 0xC24F, - 0x7FFB: 0xB7AD, - 0x7FFC: 0xD2ED, - 0x7FFD: 0xC250, - 0x7FFE: 0xC251, - 0x7FFF: 0xC252, - 0x8000: 0xD2AB, - 0x8001: 0xC0CF, - 0x8002: 0xC253, - 0x8003: 0xBFBC, - 0x8004: 0xEBA3, - 0x8005: 0xD5DF, - 0x8006: 0xEAC8, - 0x8007: 0xC254, - 0x8008: 0xC255, - 0x8009: 0xC256, - 0x800A: 0xC257, - 0x800B: 0xF1F3, - 0x800C: 0xB6F8, - 0x800D: 0xCBA3, - 0x800E: 0xC258, - 0x800F: 0xC259, - 0x8010: 0xC4CD, - 0x8011: 0xC25A, - 0x8012: 0xF1E7, - 0x8013: 0xC25B, - 0x8014: 0xF1E8, - 0x8015: 0xB8FB, - 0x8016: 0xF1E9, - 0x8017: 0xBAC4, - 0x8018: 0xD4C5, - 0x8019: 0xB0D2, - 0x801A: 0xC25C, - 0x801B: 0xC25D, - 0x801C: 0xF1EA, - 0x801D: 0xC25E, - 0x801E: 0xC25F, - 0x801F: 0xC260, - 0x8020: 0xF1EB, - 0x8021: 0xC261, - 0x8022: 0xF1EC, - 0x8023: 0xC262, - 0x8024: 0xC263, - 0x8025: 0xF1ED, - 0x8026: 0xF1EE, - 0x8027: 0xF1EF, - 0x8028: 0xF1F1, - 0x8029: 0xF1F0, - 0x802A: 0xC5D5, - 0x802B: 0xC264, - 0x802C: 0xC265, - 0x802D: 0xC266, - 0x802E: 0xC267, - 0x802F: 0xC268, - 0x8030: 0xC269, - 0x8031: 0xF1F2, - 0x8032: 0xC26A, - 0x8033: 0xB6FA, - 0x8034: 0xC26B, - 0x8035: 0xF1F4, - 0x8036: 0xD2AE, - 0x8037: 0xDEC7, - 0x8038: 0xCBCA, - 0x8039: 0xC26C, - 0x803A: 0xC26D, - 0x803B: 0xB3DC, - 0x803C: 0xC26E, - 0x803D: 0xB5A2, - 0x803E: 0xC26F, - 0x803F: 0xB9A2, - 0x8040: 0xC270, - 0x8041: 0xC271, - 0x8042: 0xC4F4, - 0x8043: 0xF1F5, - 0x8044: 0xC272, - 0x8045: 0xC273, - 0x8046: 0xF1F6, - 0x8047: 0xC274, - 0x8048: 0xC275, - 0x8049: 0xC276, - 0x804A: 0xC1C4, - 0x804B: 0xC1FB, - 0x804C: 0xD6B0, - 0x804D: 0xF1F7, - 0x804E: 0xC277, - 0x804F: 0xC278, - 0x8050: 0xC279, - 0x8051: 0xC27A, - 0x8052: 0xF1F8, - 0x8053: 0xC27B, - 0x8054: 0xC1AA, - 0x8055: 0xC27C, - 0x8056: 0xC27D, - 0x8057: 0xC27E, - 0x8058: 0xC6B8, - 0x8059: 0xC280, - 0x805A: 0xBEDB, - 0x805B: 0xC281, - 0x805C: 0xC282, - 0x805D: 0xC283, - 0x805E: 0xC284, - 0x805F: 0xC285, - 0x8060: 0xC286, - 0x8061: 0xC287, - 0x8062: 0xC288, - 0x8063: 0xC289, - 0x8064: 0xC28A, - 0x8065: 0xC28B, - 0x8066: 0xC28C, - 0x8067: 0xC28D, - 0x8068: 0xC28E, - 0x8069: 0xF1F9, - 0x806A: 0xB4CF, - 0x806B: 0xC28F, - 0x806C: 0xC290, - 0x806D: 0xC291, - 0x806E: 0xC292, - 0x806F: 0xC293, - 0x8070: 0xC294, - 0x8071: 0xF1FA, - 0x8072: 0xC295, - 0x8073: 0xC296, - 0x8074: 0xC297, - 0x8075: 0xC298, - 0x8076: 0xC299, - 0x8077: 0xC29A, - 0x8078: 0xC29B, - 0x8079: 0xC29C, - 0x807A: 0xC29D, - 0x807B: 0xC29E, - 0x807C: 0xC29F, - 0x807D: 0xC2A0, - 0x807E: 0xC340, - 0x807F: 0xEDB2, - 0x8080: 0xEDB1, - 0x8081: 0xC341, - 0x8082: 0xC342, - 0x8083: 0xCBE0, - 0x8084: 0xD2DE, - 0x8085: 0xC343, - 0x8086: 0xCBC1, - 0x8087: 0xD5D8, - 0x8088: 0xC344, - 0x8089: 0xC8E2, - 0x808A: 0xC345, - 0x808B: 0xC0DF, - 0x808C: 0xBCA1, - 0x808D: 0xC346, - 0x808E: 0xC347, - 0x808F: 0xC348, - 0x8090: 0xC349, - 0x8091: 0xC34A, - 0x8092: 0xC34B, - 0x8093: 0xEBC1, - 0x8094: 0xC34C, - 0x8095: 0xC34D, - 0x8096: 0xD0A4, - 0x8097: 0xC34E, - 0x8098: 0xD6E2, - 0x8099: 0xC34F, - 0x809A: 0xB6C7, - 0x809B: 0xB8D8, - 0x809C: 0xEBC0, - 0x809D: 0xB8CE, - 0x809E: 0xC350, - 0x809F: 0xEBBF, - 0x80A0: 0xB3A6, - 0x80A1: 0xB9C9, - 0x80A2: 0xD6AB, - 0x80A3: 0xC351, - 0x80A4: 0xB7F4, - 0x80A5: 0xB7CA, - 0x80A6: 0xC352, - 0x80A7: 0xC353, - 0x80A8: 0xC354, - 0x80A9: 0xBCE7, - 0x80AA: 0xB7BE, - 0x80AB: 0xEBC6, - 0x80AC: 0xC355, - 0x80AD: 0xEBC7, - 0x80AE: 0xB0B9, - 0x80AF: 0xBFCF, - 0x80B0: 0xC356, - 0x80B1: 0xEBC5, - 0x80B2: 0xD3FD, - 0x80B3: 0xC357, - 0x80B4: 0xEBC8, - 0x80B5: 0xC358, - 0x80B6: 0xC359, - 0x80B7: 0xEBC9, - 0x80B8: 0xC35A, - 0x80B9: 0xC35B, - 0x80BA: 0xB7CE, - 0x80BB: 0xC35C, - 0x80BC: 0xEBC2, - 0x80BD: 0xEBC4, - 0x80BE: 0xC9F6, - 0x80BF: 0xD6D7, - 0x80C0: 0xD5CD, - 0x80C1: 0xD0B2, - 0x80C2: 0xEBCF, - 0x80C3: 0xCEB8, - 0x80C4: 0xEBD0, - 0x80C5: 0xC35D, - 0x80C6: 0xB5A8, - 0x80C7: 0xC35E, - 0x80C8: 0xC35F, - 0x80C9: 0xC360, - 0x80CA: 0xC361, - 0x80CB: 0xC362, - 0x80CC: 0xB1B3, - 0x80CD: 0xEBD2, - 0x80CE: 0xCCA5, - 0x80CF: 0xC363, - 0x80D0: 0xC364, - 0x80D1: 0xC365, - 0x80D2: 0xC366, - 0x80D3: 0xC367, - 0x80D4: 0xC368, - 0x80D5: 0xC369, - 0x80D6: 0xC5D6, - 0x80D7: 0xEBD3, - 0x80D8: 0xC36A, - 0x80D9: 0xEBD1, - 0x80DA: 0xC5DF, - 0x80DB: 0xEBCE, - 0x80DC: 0xCAA4, - 0x80DD: 0xEBD5, - 0x80DE: 0xB0FB, - 0x80DF: 0xC36B, - 0x80E0: 0xC36C, - 0x80E1: 0xBAFA, - 0x80E2: 0xC36D, - 0x80E3: 0xC36E, - 0x80E4: 0xD8B7, - 0x80E5: 0xF1E3, - 0x80E6: 0xC36F, - 0x80E7: 0xEBCA, - 0x80E8: 0xEBCB, - 0x80E9: 0xEBCC, - 0x80EA: 0xEBCD, - 0x80EB: 0xEBD6, - 0x80EC: 0xE6C0, - 0x80ED: 0xEBD9, - 0x80EE: 0xC370, - 0x80EF: 0xBFE8, - 0x80F0: 0xD2C8, - 0x80F1: 0xEBD7, - 0x80F2: 0xEBDC, - 0x80F3: 0xB8EC, - 0x80F4: 0xEBD8, - 0x80F5: 0xC371, - 0x80F6: 0xBDBA, - 0x80F7: 0xC372, - 0x80F8: 0xD0D8, - 0x80F9: 0xC373, - 0x80FA: 0xB0B7, - 0x80FB: 0xC374, - 0x80FC: 0xEBDD, - 0x80FD: 0xC4DC, - 0x80FE: 0xC375, - 0x80FF: 0xC376, - 0x8100: 0xC377, - 0x8101: 0xC378, - 0x8102: 0xD6AC, - 0x8103: 0xC379, - 0x8104: 0xC37A, - 0x8105: 0xC37B, - 0x8106: 0xB4E0, - 0x8107: 0xC37C, - 0x8108: 0xC37D, - 0x8109: 0xC2F6, - 0x810A: 0xBCB9, - 0x810B: 0xC37E, - 0x810C: 0xC380, - 0x810D: 0xEBDA, - 0x810E: 0xEBDB, - 0x810F: 0xD4E0, - 0x8110: 0xC6EA, - 0x8111: 0xC4D4, - 0x8112: 0xEBDF, - 0x8113: 0xC5A7, - 0x8114: 0xD9F5, - 0x8115: 0xC381, - 0x8116: 0xB2B1, - 0x8117: 0xC382, - 0x8118: 0xEBE4, - 0x8119: 0xC383, - 0x811A: 0xBDC5, - 0x811B: 0xC384, - 0x811C: 0xC385, - 0x811D: 0xC386, - 0x811E: 0xEBE2, - 0x811F: 0xC387, - 0x8120: 0xC388, - 0x8121: 0xC389, - 0x8122: 0xC38A, - 0x8123: 0xC38B, - 0x8124: 0xC38C, - 0x8125: 0xC38D, - 0x8126: 0xC38E, - 0x8127: 0xC38F, - 0x8128: 0xC390, - 0x8129: 0xC391, - 0x812A: 0xC392, - 0x812B: 0xC393, - 0x812C: 0xEBE3, - 0x812D: 0xC394, - 0x812E: 0xC395, - 0x812F: 0xB8AC, - 0x8130: 0xC396, - 0x8131: 0xCDD1, - 0x8132: 0xEBE5, - 0x8133: 0xC397, - 0x8134: 0xC398, - 0x8135: 0xC399, - 0x8136: 0xEBE1, - 0x8137: 0xC39A, - 0x8138: 0xC1B3, - 0x8139: 0xC39B, - 0x813A: 0xC39C, - 0x813B: 0xC39D, - 0x813C: 0xC39E, - 0x813D: 0xC39F, - 0x813E: 0xC6A2, - 0x813F: 0xC3A0, - 0x8140: 0xC440, - 0x8141: 0xC441, - 0x8142: 0xC442, - 0x8143: 0xC443, - 0x8144: 0xC444, - 0x8145: 0xC445, - 0x8146: 0xCCF3, - 0x8147: 0xC446, - 0x8148: 0xEBE6, - 0x8149: 0xC447, - 0x814A: 0xC0B0, - 0x814B: 0xD2B8, - 0x814C: 0xEBE7, - 0x814D: 0xC448, - 0x814E: 0xC449, - 0x814F: 0xC44A, - 0x8150: 0xB8AF, - 0x8151: 0xB8AD, - 0x8152: 0xC44B, - 0x8153: 0xEBE8, - 0x8154: 0xC7BB, - 0x8155: 0xCDF3, - 0x8156: 0xC44C, - 0x8157: 0xC44D, - 0x8158: 0xC44E, - 0x8159: 0xEBEA, - 0x815A: 0xEBEB, - 0x815B: 0xC44F, - 0x815C: 0xC450, - 0x815D: 0xC451, - 0x815E: 0xC452, - 0x815F: 0xC453, - 0x8160: 0xEBED, - 0x8161: 0xC454, - 0x8162: 0xC455, - 0x8163: 0xC456, - 0x8164: 0xC457, - 0x8165: 0xD0C8, - 0x8166: 0xC458, - 0x8167: 0xEBF2, - 0x8168: 0xC459, - 0x8169: 0xEBEE, - 0x816A: 0xC45A, - 0x816B: 0xC45B, - 0x816C: 0xC45C, - 0x816D: 0xEBF1, - 0x816E: 0xC8F9, - 0x816F: 0xC45D, - 0x8170: 0xD1FC, - 0x8171: 0xEBEC, - 0x8172: 0xC45E, - 0x8173: 0xC45F, - 0x8174: 0xEBE9, - 0x8175: 0xC460, - 0x8176: 0xC461, - 0x8177: 0xC462, - 0x8178: 0xC463, - 0x8179: 0xB8B9, - 0x817A: 0xCFD9, - 0x817B: 0xC4E5, - 0x817C: 0xEBEF, - 0x817D: 0xEBF0, - 0x817E: 0xCCDA, - 0x817F: 0xCDC8, - 0x8180: 0xB0F2, - 0x8181: 0xC464, - 0x8182: 0xEBF6, - 0x8183: 0xC465, - 0x8184: 0xC466, - 0x8185: 0xC467, - 0x8186: 0xC468, - 0x8187: 0xC469, - 0x8188: 0xEBF5, - 0x8189: 0xC46A, - 0x818A: 0xB2B2, - 0x818B: 0xC46B, - 0x818C: 0xC46C, - 0x818D: 0xC46D, - 0x818E: 0xC46E, - 0x818F: 0xB8E0, - 0x8190: 0xC46F, - 0x8191: 0xEBF7, - 0x8192: 0xC470, - 0x8193: 0xC471, - 0x8194: 0xC472, - 0x8195: 0xC473, - 0x8196: 0xC474, - 0x8197: 0xC475, - 0x8198: 0xB1EC, - 0x8199: 0xC476, - 0x819A: 0xC477, - 0x819B: 0xCCC5, - 0x819C: 0xC4A4, - 0x819D: 0xCFA5, - 0x819E: 0xC478, - 0x819F: 0xC479, - 0x81A0: 0xC47A, - 0x81A1: 0xC47B, - 0x81A2: 0xC47C, - 0x81A3: 0xEBF9, - 0x81A4: 0xC47D, - 0x81A5: 0xC47E, - 0x81A6: 0xECA2, - 0x81A7: 0xC480, - 0x81A8: 0xC5F2, - 0x81A9: 0xC481, - 0x81AA: 0xEBFA, - 0x81AB: 0xC482, - 0x81AC: 0xC483, - 0x81AD: 0xC484, - 0x81AE: 0xC485, - 0x81AF: 0xC486, - 0x81B0: 0xC487, - 0x81B1: 0xC488, - 0x81B2: 0xC489, - 0x81B3: 0xC9C5, - 0x81B4: 0xC48A, - 0x81B5: 0xC48B, - 0x81B6: 0xC48C, - 0x81B7: 0xC48D, - 0x81B8: 0xC48E, - 0x81B9: 0xC48F, - 0x81BA: 0xE2DF, - 0x81BB: 0xEBFE, - 0x81BC: 0xC490, - 0x81BD: 0xC491, - 0x81BE: 0xC492, - 0x81BF: 0xC493, - 0x81C0: 0xCDCE, - 0x81C1: 0xECA1, - 0x81C2: 0xB1DB, - 0x81C3: 0xD3B7, - 0x81C4: 0xC494, - 0x81C5: 0xC495, - 0x81C6: 0xD2DC, - 0x81C7: 0xC496, - 0x81C8: 0xC497, - 0x81C9: 0xC498, - 0x81CA: 0xEBFD, - 0x81CB: 0xC499, - 0x81CC: 0xEBFB, - 0x81CD: 0xC49A, - 0x81CE: 0xC49B, - 0x81CF: 0xC49C, - 0x81D0: 0xC49D, - 0x81D1: 0xC49E, - 0x81D2: 0xC49F, - 0x81D3: 0xC4A0, - 0x81D4: 0xC540, - 0x81D5: 0xC541, - 0x81D6: 0xC542, - 0x81D7: 0xC543, - 0x81D8: 0xC544, - 0x81D9: 0xC545, - 0x81DA: 0xC546, - 0x81DB: 0xC547, - 0x81DC: 0xC548, - 0x81DD: 0xC549, - 0x81DE: 0xC54A, - 0x81DF: 0xC54B, - 0x81E0: 0xC54C, - 0x81E1: 0xC54D, - 0x81E2: 0xC54E, - 0x81E3: 0xB3BC, - 0x81E4: 0xC54F, - 0x81E5: 0xC550, - 0x81E6: 0xC551, - 0x81E7: 0xEAB0, - 0x81E8: 0xC552, - 0x81E9: 0xC553, - 0x81EA: 0xD7D4, - 0x81EB: 0xC554, - 0x81EC: 0xF4AB, - 0x81ED: 0xB3F4, - 0x81EE: 0xC555, - 0x81EF: 0xC556, - 0x81F0: 0xC557, - 0x81F1: 0xC558, - 0x81F2: 0xC559, - 0x81F3: 0xD6C1, - 0x81F4: 0xD6C2, - 0x81F5: 0xC55A, - 0x81F6: 0xC55B, - 0x81F7: 0xC55C, - 0x81F8: 0xC55D, - 0x81F9: 0xC55E, - 0x81FA: 0xC55F, - 0x81FB: 0xD5E9, - 0x81FC: 0xBECA, - 0x81FD: 0xC560, - 0x81FE: 0xF4A7, - 0x81FF: 0xC561, - 0x8200: 0xD2A8, - 0x8201: 0xF4A8, - 0x8202: 0xF4A9, - 0x8203: 0xC562, - 0x8204: 0xF4AA, - 0x8205: 0xBECB, - 0x8206: 0xD3DF, - 0x8207: 0xC563, - 0x8208: 0xC564, - 0x8209: 0xC565, - 0x820A: 0xC566, - 0x820B: 0xC567, - 0x820C: 0xC9E0, - 0x820D: 0xC9E1, - 0x820E: 0xC568, - 0x820F: 0xC569, - 0x8210: 0xF3C2, - 0x8211: 0xC56A, - 0x8212: 0xCAE6, - 0x8213: 0xC56B, - 0x8214: 0xCCF2, - 0x8215: 0xC56C, - 0x8216: 0xC56D, - 0x8217: 0xC56E, - 0x8218: 0xC56F, - 0x8219: 0xC570, - 0x821A: 0xC571, - 0x821B: 0xE2B6, - 0x821C: 0xCBB4, - 0x821D: 0xC572, - 0x821E: 0xCEE8, - 0x821F: 0xD6DB, - 0x8220: 0xC573, - 0x8221: 0xF4AD, - 0x8222: 0xF4AE, - 0x8223: 0xF4AF, - 0x8224: 0xC574, - 0x8225: 0xC575, - 0x8226: 0xC576, - 0x8227: 0xC577, - 0x8228: 0xF4B2, - 0x8229: 0xC578, - 0x822A: 0xBABD, - 0x822B: 0xF4B3, - 0x822C: 0xB0E3, - 0x822D: 0xF4B0, - 0x822E: 0xC579, - 0x822F: 0xF4B1, - 0x8230: 0xBDA2, - 0x8231: 0xB2D5, - 0x8232: 0xC57A, - 0x8233: 0xF4B6, - 0x8234: 0xF4B7, - 0x8235: 0xB6E6, - 0x8236: 0xB2B0, - 0x8237: 0xCFCF, - 0x8238: 0xF4B4, - 0x8239: 0xB4AC, - 0x823A: 0xC57B, - 0x823B: 0xF4B5, - 0x823C: 0xC57C, - 0x823D: 0xC57D, - 0x823E: 0xF4B8, - 0x823F: 0xC57E, - 0x8240: 0xC580, - 0x8241: 0xC581, - 0x8242: 0xC582, - 0x8243: 0xC583, - 0x8244: 0xF4B9, - 0x8245: 0xC584, - 0x8246: 0xC585, - 0x8247: 0xCDA7, - 0x8248: 0xC586, - 0x8249: 0xF4BA, - 0x824A: 0xC587, - 0x824B: 0xF4BB, - 0x824C: 0xC588, - 0x824D: 0xC589, - 0x824E: 0xC58A, - 0x824F: 0xF4BC, - 0x8250: 0xC58B, - 0x8251: 0xC58C, - 0x8252: 0xC58D, - 0x8253: 0xC58E, - 0x8254: 0xC58F, - 0x8255: 0xC590, - 0x8256: 0xC591, - 0x8257: 0xC592, - 0x8258: 0xCBD2, - 0x8259: 0xC593, - 0x825A: 0xF4BD, - 0x825B: 0xC594, - 0x825C: 0xC595, - 0x825D: 0xC596, - 0x825E: 0xC597, - 0x825F: 0xF4BE, - 0x8260: 0xC598, - 0x8261: 0xC599, - 0x8262: 0xC59A, - 0x8263: 0xC59B, - 0x8264: 0xC59C, - 0x8265: 0xC59D, - 0x8266: 0xC59E, - 0x8267: 0xC59F, - 0x8268: 0xF4BF, - 0x8269: 0xC5A0, - 0x826A: 0xC640, - 0x826B: 0xC641, - 0x826C: 0xC642, - 0x826D: 0xC643, - 0x826E: 0xF4DE, - 0x826F: 0xC1BC, - 0x8270: 0xBCE8, - 0x8271: 0xC644, - 0x8272: 0xC9AB, - 0x8273: 0xD1DE, - 0x8274: 0xE5F5, - 0x8275: 0xC645, - 0x8276: 0xC646, - 0x8277: 0xC647, - 0x8278: 0xC648, - 0x8279: 0xDCB3, - 0x827A: 0xD2D5, - 0x827B: 0xC649, - 0x827C: 0xC64A, - 0x827D: 0xDCB4, - 0x827E: 0xB0AC, - 0x827F: 0xDCB5, - 0x8280: 0xC64B, - 0x8281: 0xC64C, - 0x8282: 0xBDDA, - 0x8283: 0xC64D, - 0x8284: 0xDCB9, - 0x8285: 0xC64E, - 0x8286: 0xC64F, - 0x8287: 0xC650, - 0x8288: 0xD8C2, - 0x8289: 0xC651, - 0x828A: 0xDCB7, - 0x828B: 0xD3F3, - 0x828C: 0xC652, - 0x828D: 0xC9D6, - 0x828E: 0xDCBA, - 0x828F: 0xDCB6, - 0x8290: 0xC653, - 0x8291: 0xDCBB, - 0x8292: 0xC3A2, - 0x8293: 0xC654, - 0x8294: 0xC655, - 0x8295: 0xC656, - 0x8296: 0xC657, - 0x8297: 0xDCBC, - 0x8298: 0xDCC5, - 0x8299: 0xDCBD, - 0x829A: 0xC658, - 0x829B: 0xC659, - 0x829C: 0xCEDF, - 0x829D: 0xD6A5, - 0x829E: 0xC65A, - 0x829F: 0xDCCF, - 0x82A0: 0xC65B, - 0x82A1: 0xDCCD, - 0x82A2: 0xC65C, - 0x82A3: 0xC65D, - 0x82A4: 0xDCD2, - 0x82A5: 0xBDE6, - 0x82A6: 0xC2AB, - 0x82A7: 0xC65E, - 0x82A8: 0xDCB8, - 0x82A9: 0xDCCB, - 0x82AA: 0xDCCE, - 0x82AB: 0xDCBE, - 0x82AC: 0xB7D2, - 0x82AD: 0xB0C5, - 0x82AE: 0xDCC7, - 0x82AF: 0xD0BE, - 0x82B0: 0xDCC1, - 0x82B1: 0xBBA8, - 0x82B2: 0xC65F, - 0x82B3: 0xB7BC, - 0x82B4: 0xDCCC, - 0x82B5: 0xC660, - 0x82B6: 0xC661, - 0x82B7: 0xDCC6, - 0x82B8: 0xDCBF, - 0x82B9: 0xC7DB, - 0x82BA: 0xC662, - 0x82BB: 0xC663, - 0x82BC: 0xC664, - 0x82BD: 0xD1BF, - 0x82BE: 0xDCC0, - 0x82BF: 0xC665, - 0x82C0: 0xC666, - 0x82C1: 0xDCCA, - 0x82C2: 0xC667, - 0x82C3: 0xC668, - 0x82C4: 0xDCD0, - 0x82C5: 0xC669, - 0x82C6: 0xC66A, - 0x82C7: 0xCEAD, - 0x82C8: 0xDCC2, - 0x82C9: 0xC66B, - 0x82CA: 0xDCC3, - 0x82CB: 0xDCC8, - 0x82CC: 0xDCC9, - 0x82CD: 0xB2D4, - 0x82CE: 0xDCD1, - 0x82CF: 0xCBD5, - 0x82D0: 0xC66C, - 0x82D1: 0xD4B7, - 0x82D2: 0xDCDB, - 0x82D3: 0xDCDF, - 0x82D4: 0xCCA6, - 0x82D5: 0xDCE6, - 0x82D6: 0xC66D, - 0x82D7: 0xC3E7, - 0x82D8: 0xDCDC, - 0x82D9: 0xC66E, - 0x82DA: 0xC66F, - 0x82DB: 0xBFC1, - 0x82DC: 0xDCD9, - 0x82DD: 0xC670, - 0x82DE: 0xB0FA, - 0x82DF: 0xB9B6, - 0x82E0: 0xDCE5, - 0x82E1: 0xDCD3, - 0x82E2: 0xC671, - 0x82E3: 0xDCC4, - 0x82E4: 0xDCD6, - 0x82E5: 0xC8F4, - 0x82E6: 0xBFE0, - 0x82E7: 0xC672, - 0x82E8: 0xC673, - 0x82E9: 0xC674, - 0x82EA: 0xC675, - 0x82EB: 0xC9BB, - 0x82EC: 0xC676, - 0x82ED: 0xC677, - 0x82EE: 0xC678, - 0x82EF: 0xB1BD, - 0x82F0: 0xC679, - 0x82F1: 0xD3A2, - 0x82F2: 0xC67A, - 0x82F3: 0xC67B, - 0x82F4: 0xDCDA, - 0x82F5: 0xC67C, - 0x82F6: 0xC67D, - 0x82F7: 0xDCD5, - 0x82F8: 0xC67E, - 0x82F9: 0xC6BB, - 0x82FA: 0xC680, - 0x82FB: 0xDCDE, - 0x82FC: 0xC681, - 0x82FD: 0xC682, - 0x82FE: 0xC683, - 0x82FF: 0xC684, - 0x8300: 0xC685, - 0x8301: 0xD7C2, - 0x8302: 0xC3AF, - 0x8303: 0xB7B6, - 0x8304: 0xC7D1, - 0x8305: 0xC3A9, - 0x8306: 0xDCE2, - 0x8307: 0xDCD8, - 0x8308: 0xDCEB, - 0x8309: 0xDCD4, - 0x830A: 0xC686, - 0x830B: 0xC687, - 0x830C: 0xDCDD, - 0x830D: 0xC688, - 0x830E: 0xBEA5, - 0x830F: 0xDCD7, - 0x8310: 0xC689, - 0x8311: 0xDCE0, - 0x8312: 0xC68A, - 0x8313: 0xC68B, - 0x8314: 0xDCE3, - 0x8315: 0xDCE4, - 0x8316: 0xC68C, - 0x8317: 0xDCF8, - 0x8318: 0xC68D, - 0x8319: 0xC68E, - 0x831A: 0xDCE1, - 0x831B: 0xDDA2, - 0x831C: 0xDCE7, - 0x831D: 0xC68F, - 0x831E: 0xC690, - 0x831F: 0xC691, - 0x8320: 0xC692, - 0x8321: 0xC693, - 0x8322: 0xC694, - 0x8323: 0xC695, - 0x8324: 0xC696, - 0x8325: 0xC697, - 0x8326: 0xC698, - 0x8327: 0xBCEB, - 0x8328: 0xB4C4, - 0x8329: 0xC699, - 0x832A: 0xC69A, - 0x832B: 0xC3A3, - 0x832C: 0xB2E7, - 0x832D: 0xDCFA, - 0x832E: 0xC69B, - 0x832F: 0xDCF2, - 0x8330: 0xC69C, - 0x8331: 0xDCEF, - 0x8332: 0xC69D, - 0x8333: 0xDCFC, - 0x8334: 0xDCEE, - 0x8335: 0xD2F0, - 0x8336: 0xB2E8, - 0x8337: 0xC69E, - 0x8338: 0xC8D7, - 0x8339: 0xC8E3, - 0x833A: 0xDCFB, - 0x833B: 0xC69F, - 0x833C: 0xDCED, - 0x833D: 0xC6A0, - 0x833E: 0xC740, - 0x833F: 0xC741, - 0x8340: 0xDCF7, - 0x8341: 0xC742, - 0x8342: 0xC743, - 0x8343: 0xDCF5, - 0x8344: 0xC744, - 0x8345: 0xC745, - 0x8346: 0xBEA3, - 0x8347: 0xDCF4, - 0x8348: 0xC746, - 0x8349: 0xB2DD, - 0x834A: 0xC747, - 0x834B: 0xC748, - 0x834C: 0xC749, - 0x834D: 0xC74A, - 0x834E: 0xC74B, - 0x834F: 0xDCF3, - 0x8350: 0xBCF6, - 0x8351: 0xDCE8, - 0x8352: 0xBBC4, - 0x8353: 0xC74C, - 0x8354: 0xC0F3, - 0x8355: 0xC74D, - 0x8356: 0xC74E, - 0x8357: 0xC74F, - 0x8358: 0xC750, - 0x8359: 0xC751, - 0x835A: 0xBCD4, - 0x835B: 0xDCE9, - 0x835C: 0xDCEA, - 0x835D: 0xC752, - 0x835E: 0xDCF1, - 0x835F: 0xDCF6, - 0x8360: 0xDCF9, - 0x8361: 0xB5B4, - 0x8362: 0xC753, - 0x8363: 0xC8D9, - 0x8364: 0xBBE7, - 0x8365: 0xDCFE, - 0x8366: 0xDCFD, - 0x8367: 0xD3AB, - 0x8368: 0xDDA1, - 0x8369: 0xDDA3, - 0x836A: 0xDDA5, - 0x836B: 0xD2F1, - 0x836C: 0xDDA4, - 0x836D: 0xDDA6, - 0x836E: 0xDDA7, - 0x836F: 0xD2A9, - 0x8370: 0xC754, - 0x8371: 0xC755, - 0x8372: 0xC756, - 0x8373: 0xC757, - 0x8374: 0xC758, - 0x8375: 0xC759, - 0x8376: 0xC75A, - 0x8377: 0xBAC9, - 0x8378: 0xDDA9, - 0x8379: 0xC75B, - 0x837A: 0xC75C, - 0x837B: 0xDDB6, - 0x837C: 0xDDB1, - 0x837D: 0xDDB4, - 0x837E: 0xC75D, - 0x837F: 0xC75E, - 0x8380: 0xC75F, - 0x8381: 0xC760, - 0x8382: 0xC761, - 0x8383: 0xC762, - 0x8384: 0xC763, - 0x8385: 0xDDB0, - 0x8386: 0xC6CE, - 0x8387: 0xC764, - 0x8388: 0xC765, - 0x8389: 0xC0F2, - 0x838A: 0xC766, - 0x838B: 0xC767, - 0x838C: 0xC768, - 0x838D: 0xC769, - 0x838E: 0xC9AF, - 0x838F: 0xC76A, - 0x8390: 0xC76B, - 0x8391: 0xC76C, - 0x8392: 0xDCEC, - 0x8393: 0xDDAE, - 0x8394: 0xC76D, - 0x8395: 0xC76E, - 0x8396: 0xC76F, - 0x8397: 0xC770, - 0x8398: 0xDDB7, - 0x8399: 0xC771, - 0x839A: 0xC772, - 0x839B: 0xDCF0, - 0x839C: 0xDDAF, - 0x839D: 0xC773, - 0x839E: 0xDDB8, - 0x839F: 0xC774, - 0x83A0: 0xDDAC, - 0x83A1: 0xC775, - 0x83A2: 0xC776, - 0x83A3: 0xC777, - 0x83A4: 0xC778, - 0x83A5: 0xC779, - 0x83A6: 0xC77A, - 0x83A7: 0xC77B, - 0x83A8: 0xDDB9, - 0x83A9: 0xDDB3, - 0x83AA: 0xDDAD, - 0x83AB: 0xC4AA, - 0x83AC: 0xC77C, - 0x83AD: 0xC77D, - 0x83AE: 0xC77E, - 0x83AF: 0xC780, - 0x83B0: 0xDDA8, - 0x83B1: 0xC0B3, - 0x83B2: 0xC1AB, - 0x83B3: 0xDDAA, - 0x83B4: 0xDDAB, - 0x83B5: 0xC781, - 0x83B6: 0xDDB2, - 0x83B7: 0xBBF1, - 0x83B8: 0xDDB5, - 0x83B9: 0xD3A8, - 0x83BA: 0xDDBA, - 0x83BB: 0xC782, - 0x83BC: 0xDDBB, - 0x83BD: 0xC3A7, - 0x83BE: 0xC783, - 0x83BF: 0xC784, - 0x83C0: 0xDDD2, - 0x83C1: 0xDDBC, - 0x83C2: 0xC785, - 0x83C3: 0xC786, - 0x83C4: 0xC787, - 0x83C5: 0xDDD1, - 0x83C6: 0xC788, - 0x83C7: 0xB9BD, - 0x83C8: 0xC789, - 0x83C9: 0xC78A, - 0x83CA: 0xBED5, - 0x83CB: 0xC78B, - 0x83CC: 0xBEFA, - 0x83CD: 0xC78C, - 0x83CE: 0xC78D, - 0x83CF: 0xBACA, - 0x83D0: 0xC78E, - 0x83D1: 0xC78F, - 0x83D2: 0xC790, - 0x83D3: 0xC791, - 0x83D4: 0xDDCA, - 0x83D5: 0xC792, - 0x83D6: 0xDDC5, - 0x83D7: 0xC793, - 0x83D8: 0xDDBF, - 0x83D9: 0xC794, - 0x83DA: 0xC795, - 0x83DB: 0xC796, - 0x83DC: 0xB2CB, - 0x83DD: 0xDDC3, - 0x83DE: 0xC797, - 0x83DF: 0xDDCB, - 0x83E0: 0xB2A4, - 0x83E1: 0xDDD5, - 0x83E2: 0xC798, - 0x83E3: 0xC799, - 0x83E4: 0xC79A, - 0x83E5: 0xDDBE, - 0x83E6: 0xC79B, - 0x83E7: 0xC79C, - 0x83E8: 0xC79D, - 0x83E9: 0xC6D0, - 0x83EA: 0xDDD0, - 0x83EB: 0xC79E, - 0x83EC: 0xC79F, - 0x83ED: 0xC7A0, - 0x83EE: 0xC840, - 0x83EF: 0xC841, - 0x83F0: 0xDDD4, - 0x83F1: 0xC1E2, - 0x83F2: 0xB7C6, - 0x83F3: 0xC842, - 0x83F4: 0xC843, - 0x83F5: 0xC844, - 0x83F6: 0xC845, - 0x83F7: 0xC846, - 0x83F8: 0xDDCE, - 0x83F9: 0xDDCF, - 0x83FA: 0xC847, - 0x83FB: 0xC848, - 0x83FC: 0xC849, - 0x83FD: 0xDDC4, - 0x83FE: 0xC84A, - 0x83FF: 0xC84B, - 0x8400: 0xC84C, - 0x8401: 0xDDBD, - 0x8402: 0xC84D, - 0x8403: 0xDDCD, - 0x8404: 0xCCD1, - 0x8405: 0xC84E, - 0x8406: 0xDDC9, - 0x8407: 0xC84F, - 0x8408: 0xC850, - 0x8409: 0xC851, - 0x840A: 0xC852, - 0x840B: 0xDDC2, - 0x840C: 0xC3C8, - 0x840D: 0xC6BC, - 0x840E: 0xCEAE, - 0x840F: 0xDDCC, - 0x8410: 0xC853, - 0x8411: 0xDDC8, - 0x8412: 0xC854, - 0x8413: 0xC855, - 0x8414: 0xC856, - 0x8415: 0xC857, - 0x8416: 0xC858, - 0x8417: 0xC859, - 0x8418: 0xDDC1, - 0x8419: 0xC85A, - 0x841A: 0xC85B, - 0x841B: 0xC85C, - 0x841C: 0xDDC6, - 0x841D: 0xC2DC, - 0x841E: 0xC85D, - 0x841F: 0xC85E, - 0x8420: 0xC85F, - 0x8421: 0xC860, - 0x8422: 0xC861, - 0x8423: 0xC862, - 0x8424: 0xD3A9, - 0x8425: 0xD3AA, - 0x8426: 0xDDD3, - 0x8427: 0xCFF4, - 0x8428: 0xC8F8, - 0x8429: 0xC863, - 0x842A: 0xC864, - 0x842B: 0xC865, - 0x842C: 0xC866, - 0x842D: 0xC867, - 0x842E: 0xC868, - 0x842F: 0xC869, - 0x8430: 0xC86A, - 0x8431: 0xDDE6, - 0x8432: 0xC86B, - 0x8433: 0xC86C, - 0x8434: 0xC86D, - 0x8435: 0xC86E, - 0x8436: 0xC86F, - 0x8437: 0xC870, - 0x8438: 0xDDC7, - 0x8439: 0xC871, - 0x843A: 0xC872, - 0x843B: 0xC873, - 0x843C: 0xDDE0, - 0x843D: 0xC2E4, - 0x843E: 0xC874, - 0x843F: 0xC875, - 0x8440: 0xC876, - 0x8441: 0xC877, - 0x8442: 0xC878, - 0x8443: 0xC879, - 0x8444: 0xC87A, - 0x8445: 0xC87B, - 0x8446: 0xDDE1, - 0x8447: 0xC87C, - 0x8448: 0xC87D, - 0x8449: 0xC87E, - 0x844A: 0xC880, - 0x844B: 0xC881, - 0x844C: 0xC882, - 0x844D: 0xC883, - 0x844E: 0xC884, - 0x844F: 0xC885, - 0x8450: 0xC886, - 0x8451: 0xDDD7, - 0x8452: 0xC887, - 0x8453: 0xC888, - 0x8454: 0xC889, - 0x8455: 0xC88A, - 0x8456: 0xC88B, - 0x8457: 0xD6F8, - 0x8458: 0xC88C, - 0x8459: 0xDDD9, - 0x845A: 0xDDD8, - 0x845B: 0xB8F0, - 0x845C: 0xDDD6, - 0x845D: 0xC88D, - 0x845E: 0xC88E, - 0x845F: 0xC88F, - 0x8460: 0xC890, - 0x8461: 0xC6CF, - 0x8462: 0xC891, - 0x8463: 0xB6AD, - 0x8464: 0xC892, - 0x8465: 0xC893, - 0x8466: 0xC894, - 0x8467: 0xC895, - 0x8468: 0xC896, - 0x8469: 0xDDE2, - 0x846A: 0xC897, - 0x846B: 0xBAF9, - 0x846C: 0xD4E1, - 0x846D: 0xDDE7, - 0x846E: 0xC898, - 0x846F: 0xC899, - 0x8470: 0xC89A, - 0x8471: 0xB4D0, - 0x8472: 0xC89B, - 0x8473: 0xDDDA, - 0x8474: 0xC89C, - 0x8475: 0xBFFB, - 0x8476: 0xDDE3, - 0x8477: 0xC89D, - 0x8478: 0xDDDF, - 0x8479: 0xC89E, - 0x847A: 0xDDDD, - 0x847B: 0xC89F, - 0x847C: 0xC8A0, - 0x847D: 0xC940, - 0x847E: 0xC941, - 0x847F: 0xC942, - 0x8480: 0xC943, - 0x8481: 0xC944, - 0x8482: 0xB5D9, - 0x8483: 0xC945, - 0x8484: 0xC946, - 0x8485: 0xC947, - 0x8486: 0xC948, - 0x8487: 0xDDDB, - 0x8488: 0xDDDC, - 0x8489: 0xDDDE, - 0x848A: 0xC949, - 0x848B: 0xBDAF, - 0x848C: 0xDDE4, - 0x848D: 0xC94A, - 0x848E: 0xDDE5, - 0x848F: 0xC94B, - 0x8490: 0xC94C, - 0x8491: 0xC94D, - 0x8492: 0xC94E, - 0x8493: 0xC94F, - 0x8494: 0xC950, - 0x8495: 0xC951, - 0x8496: 0xC952, - 0x8497: 0xDDF5, - 0x8498: 0xC953, - 0x8499: 0xC3C9, - 0x849A: 0xC954, - 0x849B: 0xC955, - 0x849C: 0xCBE2, - 0x849D: 0xC956, - 0x849E: 0xC957, - 0x849F: 0xC958, - 0x84A0: 0xC959, - 0x84A1: 0xDDF2, - 0x84A2: 0xC95A, - 0x84A3: 0xC95B, - 0x84A4: 0xC95C, - 0x84A5: 0xC95D, - 0x84A6: 0xC95E, - 0x84A7: 0xC95F, - 0x84A8: 0xC960, - 0x84A9: 0xC961, - 0x84AA: 0xC962, - 0x84AB: 0xC963, - 0x84AC: 0xC964, - 0x84AD: 0xC965, - 0x84AE: 0xC966, - 0x84AF: 0xD8E1, - 0x84B0: 0xC967, - 0x84B1: 0xC968, - 0x84B2: 0xC6D1, - 0x84B3: 0xC969, - 0x84B4: 0xDDF4, - 0x84B5: 0xC96A, - 0x84B6: 0xC96B, - 0x84B7: 0xC96C, - 0x84B8: 0xD5F4, - 0x84B9: 0xDDF3, - 0x84BA: 0xDDF0, - 0x84BB: 0xC96D, - 0x84BC: 0xC96E, - 0x84BD: 0xDDEC, - 0x84BE: 0xC96F, - 0x84BF: 0xDDEF, - 0x84C0: 0xC970, - 0x84C1: 0xDDE8, - 0x84C2: 0xC971, - 0x84C3: 0xC972, - 0x84C4: 0xD0EE, - 0x84C5: 0xC973, - 0x84C6: 0xC974, - 0x84C7: 0xC975, - 0x84C8: 0xC976, - 0x84C9: 0xC8D8, - 0x84CA: 0xDDEE, - 0x84CB: 0xC977, - 0x84CC: 0xC978, - 0x84CD: 0xDDE9, - 0x84CE: 0xC979, - 0x84CF: 0xC97A, - 0x84D0: 0xDDEA, - 0x84D1: 0xCBF2, - 0x84D2: 0xC97B, - 0x84D3: 0xDDED, - 0x84D4: 0xC97C, - 0x84D5: 0xC97D, - 0x84D6: 0xB1CD, - 0x84D7: 0xC97E, - 0x84D8: 0xC980, - 0x84D9: 0xC981, - 0x84DA: 0xC982, - 0x84DB: 0xC983, - 0x84DC: 0xC984, - 0x84DD: 0xC0B6, - 0x84DE: 0xC985, - 0x84DF: 0xBCBB, - 0x84E0: 0xDDF1, - 0x84E1: 0xC986, - 0x84E2: 0xC987, - 0x84E3: 0xDDF7, - 0x84E4: 0xC988, - 0x84E5: 0xDDF6, - 0x84E6: 0xDDEB, - 0x84E7: 0xC989, - 0x84E8: 0xC98A, - 0x84E9: 0xC98B, - 0x84EA: 0xC98C, - 0x84EB: 0xC98D, - 0x84EC: 0xC5EE, - 0x84ED: 0xC98E, - 0x84EE: 0xC98F, - 0x84EF: 0xC990, - 0x84F0: 0xDDFB, - 0x84F1: 0xC991, - 0x84F2: 0xC992, - 0x84F3: 0xC993, - 0x84F4: 0xC994, - 0x84F5: 0xC995, - 0x84F6: 0xC996, - 0x84F7: 0xC997, - 0x84F8: 0xC998, - 0x84F9: 0xC999, - 0x84FA: 0xC99A, - 0x84FB: 0xC99B, - 0x84FC: 0xDEA4, - 0x84FD: 0xC99C, - 0x84FE: 0xC99D, - 0x84FF: 0xDEA3, - 0x8500: 0xC99E, - 0x8501: 0xC99F, - 0x8502: 0xC9A0, - 0x8503: 0xCA40, - 0x8504: 0xCA41, - 0x8505: 0xCA42, - 0x8506: 0xCA43, - 0x8507: 0xCA44, - 0x8508: 0xCA45, - 0x8509: 0xCA46, - 0x850A: 0xCA47, - 0x850B: 0xCA48, - 0x850C: 0xDDF8, - 0x850D: 0xCA49, - 0x850E: 0xCA4A, - 0x850F: 0xCA4B, - 0x8510: 0xCA4C, - 0x8511: 0xC3EF, - 0x8512: 0xCA4D, - 0x8513: 0xC2FB, - 0x8514: 0xCA4E, - 0x8515: 0xCA4F, - 0x8516: 0xCA50, - 0x8517: 0xD5E1, - 0x8518: 0xCA51, - 0x8519: 0xCA52, - 0x851A: 0xCEB5, - 0x851B: 0xCA53, - 0x851C: 0xCA54, - 0x851D: 0xCA55, - 0x851E: 0xCA56, - 0x851F: 0xDDFD, - 0x8520: 0xCA57, - 0x8521: 0xB2CC, - 0x8522: 0xCA58, - 0x8523: 0xCA59, - 0x8524: 0xCA5A, - 0x8525: 0xCA5B, - 0x8526: 0xCA5C, - 0x8527: 0xCA5D, - 0x8528: 0xCA5E, - 0x8529: 0xCA5F, - 0x852A: 0xCA60, - 0x852B: 0xC4E8, - 0x852C: 0xCADF, - 0x852D: 0xCA61, - 0x852E: 0xCA62, - 0x852F: 0xCA63, - 0x8530: 0xCA64, - 0x8531: 0xCA65, - 0x8532: 0xCA66, - 0x8533: 0xCA67, - 0x8534: 0xCA68, - 0x8535: 0xCA69, - 0x8536: 0xCA6A, - 0x8537: 0xC7BE, - 0x8538: 0xDDFA, - 0x8539: 0xDDFC, - 0x853A: 0xDDFE, - 0x853B: 0xDEA2, - 0x853C: 0xB0AA, - 0x853D: 0xB1CE, - 0x853E: 0xCA6B, - 0x853F: 0xCA6C, - 0x8540: 0xCA6D, - 0x8541: 0xCA6E, - 0x8542: 0xCA6F, - 0x8543: 0xDEAC, - 0x8544: 0xCA70, - 0x8545: 0xCA71, - 0x8546: 0xCA72, - 0x8547: 0xCA73, - 0x8548: 0xDEA6, - 0x8549: 0xBDB6, - 0x854A: 0xC8EF, - 0x854B: 0xCA74, - 0x854C: 0xCA75, - 0x854D: 0xCA76, - 0x854E: 0xCA77, - 0x854F: 0xCA78, - 0x8550: 0xCA79, - 0x8551: 0xCA7A, - 0x8552: 0xCA7B, - 0x8553: 0xCA7C, - 0x8554: 0xCA7D, - 0x8555: 0xCA7E, - 0x8556: 0xDEA1, - 0x8557: 0xCA80, - 0x8558: 0xCA81, - 0x8559: 0xDEA5, - 0x855A: 0xCA82, - 0x855B: 0xCA83, - 0x855C: 0xCA84, - 0x855D: 0xCA85, - 0x855E: 0xDEA9, - 0x855F: 0xCA86, - 0x8560: 0xCA87, - 0x8561: 0xCA88, - 0x8562: 0xCA89, - 0x8563: 0xCA8A, - 0x8564: 0xDEA8, - 0x8565: 0xCA8B, - 0x8566: 0xCA8C, - 0x8567: 0xCA8D, - 0x8568: 0xDEA7, - 0x8569: 0xCA8E, - 0x856A: 0xCA8F, - 0x856B: 0xCA90, - 0x856C: 0xCA91, - 0x856D: 0xCA92, - 0x856E: 0xCA93, - 0x856F: 0xCA94, - 0x8570: 0xCA95, - 0x8571: 0xCA96, - 0x8572: 0xDEAD, - 0x8573: 0xCA97, - 0x8574: 0xD4CC, - 0x8575: 0xCA98, - 0x8576: 0xCA99, - 0x8577: 0xCA9A, - 0x8578: 0xCA9B, - 0x8579: 0xDEB3, - 0x857A: 0xDEAA, - 0x857B: 0xDEAE, - 0x857C: 0xCA9C, - 0x857D: 0xCA9D, - 0x857E: 0xC0D9, - 0x857F: 0xCA9E, - 0x8580: 0xCA9F, - 0x8581: 0xCAA0, - 0x8582: 0xCB40, - 0x8583: 0xCB41, - 0x8584: 0xB1A1, - 0x8585: 0xDEB6, - 0x8586: 0xCB42, - 0x8587: 0xDEB1, - 0x8588: 0xCB43, - 0x8589: 0xCB44, - 0x858A: 0xCB45, - 0x858B: 0xCB46, - 0x858C: 0xCB47, - 0x858D: 0xCB48, - 0x858E: 0xCB49, - 0x858F: 0xDEB2, - 0x8590: 0xCB4A, - 0x8591: 0xCB4B, - 0x8592: 0xCB4C, - 0x8593: 0xCB4D, - 0x8594: 0xCB4E, - 0x8595: 0xCB4F, - 0x8596: 0xCB50, - 0x8597: 0xCB51, - 0x8598: 0xCB52, - 0x8599: 0xCB53, - 0x859A: 0xCB54, - 0x859B: 0xD1A6, - 0x859C: 0xDEB5, - 0x859D: 0xCB55, - 0x859E: 0xCB56, - 0x859F: 0xCB57, - 0x85A0: 0xCB58, - 0x85A1: 0xCB59, - 0x85A2: 0xCB5A, - 0x85A3: 0xCB5B, - 0x85A4: 0xDEAF, - 0x85A5: 0xCB5C, - 0x85A6: 0xCB5D, - 0x85A7: 0xCB5E, - 0x85A8: 0xDEB0, - 0x85A9: 0xCB5F, - 0x85AA: 0xD0BD, - 0x85AB: 0xCB60, - 0x85AC: 0xCB61, - 0x85AD: 0xCB62, - 0x85AE: 0xDEB4, - 0x85AF: 0xCAED, - 0x85B0: 0xDEB9, - 0x85B1: 0xCB63, - 0x85B2: 0xCB64, - 0x85B3: 0xCB65, - 0x85B4: 0xCB66, - 0x85B5: 0xCB67, - 0x85B6: 0xCB68, - 0x85B7: 0xDEB8, - 0x85B8: 0xCB69, - 0x85B9: 0xDEB7, - 0x85BA: 0xCB6A, - 0x85BB: 0xCB6B, - 0x85BC: 0xCB6C, - 0x85BD: 0xCB6D, - 0x85BE: 0xCB6E, - 0x85BF: 0xCB6F, - 0x85C0: 0xCB70, - 0x85C1: 0xDEBB, - 0x85C2: 0xCB71, - 0x85C3: 0xCB72, - 0x85C4: 0xCB73, - 0x85C5: 0xCB74, - 0x85C6: 0xCB75, - 0x85C7: 0xCB76, - 0x85C8: 0xCB77, - 0x85C9: 0xBDE5, - 0x85CA: 0xCB78, - 0x85CB: 0xCB79, - 0x85CC: 0xCB7A, - 0x85CD: 0xCB7B, - 0x85CE: 0xCB7C, - 0x85CF: 0xB2D8, - 0x85D0: 0xC3EA, - 0x85D1: 0xCB7D, - 0x85D2: 0xCB7E, - 0x85D3: 0xDEBA, - 0x85D4: 0xCB80, - 0x85D5: 0xC5BA, - 0x85D6: 0xCB81, - 0x85D7: 0xCB82, - 0x85D8: 0xCB83, - 0x85D9: 0xCB84, - 0x85DA: 0xCB85, - 0x85DB: 0xCB86, - 0x85DC: 0xDEBC, - 0x85DD: 0xCB87, - 0x85DE: 0xCB88, - 0x85DF: 0xCB89, - 0x85E0: 0xCB8A, - 0x85E1: 0xCB8B, - 0x85E2: 0xCB8C, - 0x85E3: 0xCB8D, - 0x85E4: 0xCCD9, - 0x85E5: 0xCB8E, - 0x85E6: 0xCB8F, - 0x85E7: 0xCB90, - 0x85E8: 0xCB91, - 0x85E9: 0xB7AA, - 0x85EA: 0xCB92, - 0x85EB: 0xCB93, - 0x85EC: 0xCB94, - 0x85ED: 0xCB95, - 0x85EE: 0xCB96, - 0x85EF: 0xCB97, - 0x85F0: 0xCB98, - 0x85F1: 0xCB99, - 0x85F2: 0xCB9A, - 0x85F3: 0xCB9B, - 0x85F4: 0xCB9C, - 0x85F5: 0xCB9D, - 0x85F6: 0xCB9E, - 0x85F7: 0xCB9F, - 0x85F8: 0xCBA0, - 0x85F9: 0xCC40, - 0x85FA: 0xCC41, - 0x85FB: 0xD4E5, - 0x85FC: 0xCC42, - 0x85FD: 0xCC43, - 0x85FE: 0xCC44, - 0x85FF: 0xDEBD, - 0x8600: 0xCC45, - 0x8601: 0xCC46, - 0x8602: 0xCC47, - 0x8603: 0xCC48, - 0x8604: 0xCC49, - 0x8605: 0xDEBF, - 0x8606: 0xCC4A, - 0x8607: 0xCC4B, - 0x8608: 0xCC4C, - 0x8609: 0xCC4D, - 0x860A: 0xCC4E, - 0x860B: 0xCC4F, - 0x860C: 0xCC50, - 0x860D: 0xCC51, - 0x860E: 0xCC52, - 0x860F: 0xCC53, - 0x8610: 0xCC54, - 0x8611: 0xC4A2, - 0x8612: 0xCC55, - 0x8613: 0xCC56, - 0x8614: 0xCC57, - 0x8615: 0xCC58, - 0x8616: 0xDEC1, - 0x8617: 0xCC59, - 0x8618: 0xCC5A, - 0x8619: 0xCC5B, - 0x861A: 0xCC5C, - 0x861B: 0xCC5D, - 0x861C: 0xCC5E, - 0x861D: 0xCC5F, - 0x861E: 0xCC60, - 0x861F: 0xCC61, - 0x8620: 0xCC62, - 0x8621: 0xCC63, - 0x8622: 0xCC64, - 0x8623: 0xCC65, - 0x8624: 0xCC66, - 0x8625: 0xCC67, - 0x8626: 0xCC68, - 0x8627: 0xDEBE, - 0x8628: 0xCC69, - 0x8629: 0xDEC0, - 0x862A: 0xCC6A, - 0x862B: 0xCC6B, - 0x862C: 0xCC6C, - 0x862D: 0xCC6D, - 0x862E: 0xCC6E, - 0x862F: 0xCC6F, - 0x8630: 0xCC70, - 0x8631: 0xCC71, - 0x8632: 0xCC72, - 0x8633: 0xCC73, - 0x8634: 0xCC74, - 0x8635: 0xCC75, - 0x8636: 0xCC76, - 0x8637: 0xCC77, - 0x8638: 0xD5BA, - 0x8639: 0xCC78, - 0x863A: 0xCC79, - 0x863B: 0xCC7A, - 0x863C: 0xDEC2, - 0x863D: 0xCC7B, - 0x863E: 0xCC7C, - 0x863F: 0xCC7D, - 0x8640: 0xCC7E, - 0x8641: 0xCC80, - 0x8642: 0xCC81, - 0x8643: 0xCC82, - 0x8644: 0xCC83, - 0x8645: 0xCC84, - 0x8646: 0xCC85, - 0x8647: 0xCC86, - 0x8648: 0xCC87, - 0x8649: 0xCC88, - 0x864A: 0xCC89, - 0x864B: 0xCC8A, - 0x864C: 0xCC8B, - 0x864D: 0xF2AE, - 0x864E: 0xBBA2, - 0x864F: 0xC2B2, - 0x8650: 0xC5B0, - 0x8651: 0xC2C7, - 0x8652: 0xCC8C, - 0x8653: 0xCC8D, - 0x8654: 0xF2AF, - 0x8655: 0xCC8E, - 0x8656: 0xCC8F, - 0x8657: 0xCC90, - 0x8658: 0xCC91, - 0x8659: 0xCC92, - 0x865A: 0xD0E9, - 0x865B: 0xCC93, - 0x865C: 0xCC94, - 0x865D: 0xCC95, - 0x865E: 0xD3DD, - 0x865F: 0xCC96, - 0x8660: 0xCC97, - 0x8661: 0xCC98, - 0x8662: 0xEBBD, - 0x8663: 0xCC99, - 0x8664: 0xCC9A, - 0x8665: 0xCC9B, - 0x8666: 0xCC9C, - 0x8667: 0xCC9D, - 0x8668: 0xCC9E, - 0x8669: 0xCC9F, - 0x866A: 0xCCA0, - 0x866B: 0xB3E6, - 0x866C: 0xF2B0, - 0x866D: 0xCD40, - 0x866E: 0xF2B1, - 0x866F: 0xCD41, - 0x8670: 0xCD42, - 0x8671: 0xCAAD, - 0x8672: 0xCD43, - 0x8673: 0xCD44, - 0x8674: 0xCD45, - 0x8675: 0xCD46, - 0x8676: 0xCD47, - 0x8677: 0xCD48, - 0x8678: 0xCD49, - 0x8679: 0xBAE7, - 0x867A: 0xF2B3, - 0x867B: 0xF2B5, - 0x867C: 0xF2B4, - 0x867D: 0xCBE4, - 0x867E: 0xCFBA, - 0x867F: 0xF2B2, - 0x8680: 0xCAB4, - 0x8681: 0xD2CF, - 0x8682: 0xC2EC, - 0x8683: 0xCD4A, - 0x8684: 0xCD4B, - 0x8685: 0xCD4C, - 0x8686: 0xCD4D, - 0x8687: 0xCD4E, - 0x8688: 0xCD4F, - 0x8689: 0xCD50, - 0x868A: 0xCEC3, - 0x868B: 0xF2B8, - 0x868C: 0xB0F6, - 0x868D: 0xF2B7, - 0x868E: 0xCD51, - 0x868F: 0xCD52, - 0x8690: 0xCD53, - 0x8691: 0xCD54, - 0x8692: 0xCD55, - 0x8693: 0xF2BE, - 0x8694: 0xCD56, - 0x8695: 0xB2CF, - 0x8696: 0xCD57, - 0x8697: 0xCD58, - 0x8698: 0xCD59, - 0x8699: 0xCD5A, - 0x869A: 0xCD5B, - 0x869B: 0xCD5C, - 0x869C: 0xD1C1, - 0x869D: 0xF2BA, - 0x869E: 0xCD5D, - 0x869F: 0xCD5E, - 0x86A0: 0xCD5F, - 0x86A1: 0xCD60, - 0x86A2: 0xCD61, - 0x86A3: 0xF2BC, - 0x86A4: 0xD4E9, - 0x86A5: 0xCD62, - 0x86A6: 0xCD63, - 0x86A7: 0xF2BB, - 0x86A8: 0xF2B6, - 0x86A9: 0xF2BF, - 0x86AA: 0xF2BD, - 0x86AB: 0xCD64, - 0x86AC: 0xF2B9, - 0x86AD: 0xCD65, - 0x86AE: 0xCD66, - 0x86AF: 0xF2C7, - 0x86B0: 0xF2C4, - 0x86B1: 0xF2C6, - 0x86B2: 0xCD67, - 0x86B3: 0xCD68, - 0x86B4: 0xF2CA, - 0x86B5: 0xF2C2, - 0x86B6: 0xF2C0, - 0x86B7: 0xCD69, - 0x86B8: 0xCD6A, - 0x86B9: 0xCD6B, - 0x86BA: 0xF2C5, - 0x86BB: 0xCD6C, - 0x86BC: 0xCD6D, - 0x86BD: 0xCD6E, - 0x86BE: 0xCD6F, - 0x86BF: 0xCD70, - 0x86C0: 0xD6FB, - 0x86C1: 0xCD71, - 0x86C2: 0xCD72, - 0x86C3: 0xCD73, - 0x86C4: 0xF2C1, - 0x86C5: 0xCD74, - 0x86C6: 0xC7F9, - 0x86C7: 0xC9DF, - 0x86C8: 0xCD75, - 0x86C9: 0xF2C8, - 0x86CA: 0xB9C6, - 0x86CB: 0xB5B0, - 0x86CC: 0xCD76, - 0x86CD: 0xCD77, - 0x86CE: 0xF2C3, - 0x86CF: 0xF2C9, - 0x86D0: 0xF2D0, - 0x86D1: 0xF2D6, - 0x86D2: 0xCD78, - 0x86D3: 0xCD79, - 0x86D4: 0xBBD7, - 0x86D5: 0xCD7A, - 0x86D6: 0xCD7B, - 0x86D7: 0xCD7C, - 0x86D8: 0xF2D5, - 0x86D9: 0xCDDC, - 0x86DA: 0xCD7D, - 0x86DB: 0xD6EB, - 0x86DC: 0xCD7E, - 0x86DD: 0xCD80, - 0x86DE: 0xF2D2, - 0x86DF: 0xF2D4, - 0x86E0: 0xCD81, - 0x86E1: 0xCD82, - 0x86E2: 0xCD83, - 0x86E3: 0xCD84, - 0x86E4: 0xB8F2, - 0x86E5: 0xCD85, - 0x86E6: 0xCD86, - 0x86E7: 0xCD87, - 0x86E8: 0xCD88, - 0x86E9: 0xF2CB, - 0x86EA: 0xCD89, - 0x86EB: 0xCD8A, - 0x86EC: 0xCD8B, - 0x86ED: 0xF2CE, - 0x86EE: 0xC2F9, - 0x86EF: 0xCD8C, - 0x86F0: 0xD5DD, - 0x86F1: 0xF2CC, - 0x86F2: 0xF2CD, - 0x86F3: 0xF2CF, - 0x86F4: 0xF2D3, - 0x86F5: 0xCD8D, - 0x86F6: 0xCD8E, - 0x86F7: 0xCD8F, - 0x86F8: 0xF2D9, - 0x86F9: 0xD3BC, - 0x86FA: 0xCD90, - 0x86FB: 0xCD91, - 0x86FC: 0xCD92, - 0x86FD: 0xCD93, - 0x86FE: 0xB6EA, - 0x86FF: 0xCD94, - 0x8700: 0xCAF1, - 0x8701: 0xCD95, - 0x8702: 0xB7E4, - 0x8703: 0xF2D7, - 0x8704: 0xCD96, - 0x8705: 0xCD97, - 0x8706: 0xCD98, - 0x8707: 0xF2D8, - 0x8708: 0xF2DA, - 0x8709: 0xF2DD, - 0x870A: 0xF2DB, - 0x870B: 0xCD99, - 0x870C: 0xCD9A, - 0x870D: 0xF2DC, - 0x870E: 0xCD9B, - 0x870F: 0xCD9C, - 0x8710: 0xCD9D, - 0x8711: 0xCD9E, - 0x8712: 0xD1D1, - 0x8713: 0xF2D1, - 0x8714: 0xCD9F, - 0x8715: 0xCDC9, - 0x8716: 0xCDA0, - 0x8717: 0xCECF, - 0x8718: 0xD6A9, - 0x8719: 0xCE40, - 0x871A: 0xF2E3, - 0x871B: 0xCE41, - 0x871C: 0xC3DB, - 0x871D: 0xCE42, - 0x871E: 0xF2E0, - 0x871F: 0xCE43, - 0x8720: 0xCE44, - 0x8721: 0xC0AF, - 0x8722: 0xF2EC, - 0x8723: 0xF2DE, - 0x8724: 0xCE45, - 0x8725: 0xF2E1, - 0x8726: 0xCE46, - 0x8727: 0xCE47, - 0x8728: 0xCE48, - 0x8729: 0xF2E8, - 0x872A: 0xCE49, - 0x872B: 0xCE4A, - 0x872C: 0xCE4B, - 0x872D: 0xCE4C, - 0x872E: 0xF2E2, - 0x872F: 0xCE4D, - 0x8730: 0xCE4E, - 0x8731: 0xF2E7, - 0x8732: 0xCE4F, - 0x8733: 0xCE50, - 0x8734: 0xF2E6, - 0x8735: 0xCE51, - 0x8736: 0xCE52, - 0x8737: 0xF2E9, - 0x8738: 0xCE53, - 0x8739: 0xCE54, - 0x873A: 0xCE55, - 0x873B: 0xF2DF, - 0x873C: 0xCE56, - 0x873D: 0xCE57, - 0x873E: 0xF2E4, - 0x873F: 0xF2EA, - 0x8740: 0xCE58, - 0x8741: 0xCE59, - 0x8742: 0xCE5A, - 0x8743: 0xCE5B, - 0x8744: 0xCE5C, - 0x8745: 0xCE5D, - 0x8746: 0xCE5E, - 0x8747: 0xD3AC, - 0x8748: 0xF2E5, - 0x8749: 0xB2F5, - 0x874A: 0xCE5F, - 0x874B: 0xCE60, - 0x874C: 0xF2F2, - 0x874D: 0xCE61, - 0x874E: 0xD0AB, - 0x874F: 0xCE62, - 0x8750: 0xCE63, - 0x8751: 0xCE64, - 0x8752: 0xCE65, - 0x8753: 0xF2F5, - 0x8754: 0xCE66, - 0x8755: 0xCE67, - 0x8756: 0xCE68, - 0x8757: 0xBBC8, - 0x8758: 0xCE69, - 0x8759: 0xF2F9, - 0x875A: 0xCE6A, - 0x875B: 0xCE6B, - 0x875C: 0xCE6C, - 0x875D: 0xCE6D, - 0x875E: 0xCE6E, - 0x875F: 0xCE6F, - 0x8760: 0xF2F0, - 0x8761: 0xCE70, - 0x8762: 0xCE71, - 0x8763: 0xF2F6, - 0x8764: 0xF2F8, - 0x8765: 0xF2FA, - 0x8766: 0xCE72, - 0x8767: 0xCE73, - 0x8768: 0xCE74, - 0x8769: 0xCE75, - 0x876A: 0xCE76, - 0x876B: 0xCE77, - 0x876C: 0xCE78, - 0x876D: 0xCE79, - 0x876E: 0xF2F3, - 0x876F: 0xCE7A, - 0x8770: 0xF2F1, - 0x8771: 0xCE7B, - 0x8772: 0xCE7C, - 0x8773: 0xCE7D, - 0x8774: 0xBAFB, - 0x8775: 0xCE7E, - 0x8776: 0xB5FB, - 0x8777: 0xCE80, - 0x8778: 0xCE81, - 0x8779: 0xCE82, - 0x877A: 0xCE83, - 0x877B: 0xF2EF, - 0x877C: 0xF2F7, - 0x877D: 0xF2ED, - 0x877E: 0xF2EE, - 0x877F: 0xCE84, - 0x8780: 0xCE85, - 0x8781: 0xCE86, - 0x8782: 0xF2EB, - 0x8783: 0xF3A6, - 0x8784: 0xCE87, - 0x8785: 0xF3A3, - 0x8786: 0xCE88, - 0x8787: 0xCE89, - 0x8788: 0xF3A2, - 0x8789: 0xCE8A, - 0x878A: 0xCE8B, - 0x878B: 0xF2F4, - 0x878C: 0xCE8C, - 0x878D: 0xC8DA, - 0x878E: 0xCE8D, - 0x878F: 0xCE8E, - 0x8790: 0xCE8F, - 0x8791: 0xCE90, - 0x8792: 0xCE91, - 0x8793: 0xF2FB, - 0x8794: 0xCE92, - 0x8795: 0xCE93, - 0x8796: 0xCE94, - 0x8797: 0xF3A5, - 0x8798: 0xCE95, - 0x8799: 0xCE96, - 0x879A: 0xCE97, - 0x879B: 0xCE98, - 0x879C: 0xCE99, - 0x879D: 0xCE9A, - 0x879E: 0xCE9B, - 0x879F: 0xC3F8, - 0x87A0: 0xCE9C, - 0x87A1: 0xCE9D, - 0x87A2: 0xCE9E, - 0x87A3: 0xCE9F, - 0x87A4: 0xCEA0, - 0x87A5: 0xCF40, - 0x87A6: 0xCF41, - 0x87A7: 0xCF42, - 0x87A8: 0xF2FD, - 0x87A9: 0xCF43, - 0x87AA: 0xCF44, - 0x87AB: 0xF3A7, - 0x87AC: 0xF3A9, - 0x87AD: 0xF3A4, - 0x87AE: 0xCF45, - 0x87AF: 0xF2FC, - 0x87B0: 0xCF46, - 0x87B1: 0xCF47, - 0x87B2: 0xCF48, - 0x87B3: 0xF3AB, - 0x87B4: 0xCF49, - 0x87B5: 0xF3AA, - 0x87B6: 0xCF4A, - 0x87B7: 0xCF4B, - 0x87B8: 0xCF4C, - 0x87B9: 0xCF4D, - 0x87BA: 0xC2DD, - 0x87BB: 0xCF4E, - 0x87BC: 0xCF4F, - 0x87BD: 0xF3AE, - 0x87BE: 0xCF50, - 0x87BF: 0xCF51, - 0x87C0: 0xF3B0, - 0x87C1: 0xCF52, - 0x87C2: 0xCF53, - 0x87C3: 0xCF54, - 0x87C4: 0xCF55, - 0x87C5: 0xCF56, - 0x87C6: 0xF3A1, - 0x87C7: 0xCF57, - 0x87C8: 0xCF58, - 0x87C9: 0xCF59, - 0x87CA: 0xF3B1, - 0x87CB: 0xF3AC, - 0x87CC: 0xCF5A, - 0x87CD: 0xCF5B, - 0x87CE: 0xCF5C, - 0x87CF: 0xCF5D, - 0x87D0: 0xCF5E, - 0x87D1: 0xF3AF, - 0x87D2: 0xF2FE, - 0x87D3: 0xF3AD, - 0x87D4: 0xCF5F, - 0x87D5: 0xCF60, - 0x87D6: 0xCF61, - 0x87D7: 0xCF62, - 0x87D8: 0xCF63, - 0x87D9: 0xCF64, - 0x87DA: 0xCF65, - 0x87DB: 0xF3B2, - 0x87DC: 0xCF66, - 0x87DD: 0xCF67, - 0x87DE: 0xCF68, - 0x87DF: 0xCF69, - 0x87E0: 0xF3B4, - 0x87E1: 0xCF6A, - 0x87E2: 0xCF6B, - 0x87E3: 0xCF6C, - 0x87E4: 0xCF6D, - 0x87E5: 0xF3A8, - 0x87E6: 0xCF6E, - 0x87E7: 0xCF6F, - 0x87E8: 0xCF70, - 0x87E9: 0xCF71, - 0x87EA: 0xF3B3, - 0x87EB: 0xCF72, - 0x87EC: 0xCF73, - 0x87ED: 0xCF74, - 0x87EE: 0xF3B5, - 0x87EF: 0xCF75, - 0x87F0: 0xCF76, - 0x87F1: 0xCF77, - 0x87F2: 0xCF78, - 0x87F3: 0xCF79, - 0x87F4: 0xCF7A, - 0x87F5: 0xCF7B, - 0x87F6: 0xCF7C, - 0x87F7: 0xCF7D, - 0x87F8: 0xCF7E, - 0x87F9: 0xD0B7, - 0x87FA: 0xCF80, - 0x87FB: 0xCF81, - 0x87FC: 0xCF82, - 0x87FD: 0xCF83, - 0x87FE: 0xF3B8, - 0x87FF: 0xCF84, - 0x8800: 0xCF85, - 0x8801: 0xCF86, - 0x8802: 0xCF87, - 0x8803: 0xD9F9, - 0x8804: 0xCF88, - 0x8805: 0xCF89, - 0x8806: 0xCF8A, - 0x8807: 0xCF8B, - 0x8808: 0xCF8C, - 0x8809: 0xCF8D, - 0x880A: 0xF3B9, - 0x880B: 0xCF8E, - 0x880C: 0xCF8F, - 0x880D: 0xCF90, - 0x880E: 0xCF91, - 0x880F: 0xCF92, - 0x8810: 0xCF93, - 0x8811: 0xCF94, - 0x8812: 0xCF95, - 0x8813: 0xF3B7, - 0x8814: 0xCF96, - 0x8815: 0xC8E4, - 0x8816: 0xF3B6, - 0x8817: 0xCF97, - 0x8818: 0xCF98, - 0x8819: 0xCF99, - 0x881A: 0xCF9A, - 0x881B: 0xF3BA, - 0x881C: 0xCF9B, - 0x881D: 0xCF9C, - 0x881E: 0xCF9D, - 0x881F: 0xCF9E, - 0x8820: 0xCF9F, - 0x8821: 0xF3BB, - 0x8822: 0xB4C0, - 0x8823: 0xCFA0, - 0x8824: 0xD040, - 0x8825: 0xD041, - 0x8826: 0xD042, - 0x8827: 0xD043, - 0x8828: 0xD044, - 0x8829: 0xD045, - 0x882A: 0xD046, - 0x882B: 0xD047, - 0x882C: 0xD048, - 0x882D: 0xD049, - 0x882E: 0xD04A, - 0x882F: 0xD04B, - 0x8830: 0xD04C, - 0x8831: 0xD04D, - 0x8832: 0xEEC3, - 0x8833: 0xD04E, - 0x8834: 0xD04F, - 0x8835: 0xD050, - 0x8836: 0xD051, - 0x8837: 0xD052, - 0x8838: 0xD053, - 0x8839: 0xF3BC, - 0x883A: 0xD054, - 0x883B: 0xD055, - 0x883C: 0xF3BD, - 0x883D: 0xD056, - 0x883E: 0xD057, - 0x883F: 0xD058, - 0x8840: 0xD1AA, - 0x8841: 0xD059, - 0x8842: 0xD05A, - 0x8843: 0xD05B, - 0x8844: 0xF4AC, - 0x8845: 0xD0C6, - 0x8846: 0xD05C, - 0x8847: 0xD05D, - 0x8848: 0xD05E, - 0x8849: 0xD05F, - 0x884A: 0xD060, - 0x884B: 0xD061, - 0x884C: 0xD0D0, - 0x884D: 0xD1DC, - 0x884E: 0xD062, - 0x884F: 0xD063, - 0x8850: 0xD064, - 0x8851: 0xD065, - 0x8852: 0xD066, - 0x8853: 0xD067, - 0x8854: 0xCFCE, - 0x8855: 0xD068, - 0x8856: 0xD069, - 0x8857: 0xBDD6, - 0x8858: 0xD06A, - 0x8859: 0xD1C3, - 0x885A: 0xD06B, - 0x885B: 0xD06C, - 0x885C: 0xD06D, - 0x885D: 0xD06E, - 0x885E: 0xD06F, - 0x885F: 0xD070, - 0x8860: 0xD071, - 0x8861: 0xBAE2, - 0x8862: 0xE1E9, - 0x8863: 0xD2C2, - 0x8864: 0xF1C2, - 0x8865: 0xB2B9, - 0x8866: 0xD072, - 0x8867: 0xD073, - 0x8868: 0xB1ED, - 0x8869: 0xF1C3, - 0x886A: 0xD074, - 0x886B: 0xC9C0, - 0x886C: 0xB3C4, - 0x886D: 0xD075, - 0x886E: 0xD9F2, - 0x886F: 0xD076, - 0x8870: 0xCBA5, - 0x8871: 0xD077, - 0x8872: 0xF1C4, - 0x8873: 0xD078, - 0x8874: 0xD079, - 0x8875: 0xD07A, - 0x8876: 0xD07B, - 0x8877: 0xD6D4, - 0x8878: 0xD07C, - 0x8879: 0xD07D, - 0x887A: 0xD07E, - 0x887B: 0xD080, - 0x887C: 0xD081, - 0x887D: 0xF1C5, - 0x887E: 0xF4C0, - 0x887F: 0xF1C6, - 0x8880: 0xD082, - 0x8881: 0xD4AC, - 0x8882: 0xF1C7, - 0x8883: 0xD083, - 0x8884: 0xB0C0, - 0x8885: 0xF4C1, - 0x8886: 0xD084, - 0x8887: 0xD085, - 0x8888: 0xF4C2, - 0x8889: 0xD086, - 0x888A: 0xD087, - 0x888B: 0xB4FC, - 0x888C: 0xD088, - 0x888D: 0xC5DB, - 0x888E: 0xD089, - 0x888F: 0xD08A, - 0x8890: 0xD08B, - 0x8891: 0xD08C, - 0x8892: 0xCCBB, - 0x8893: 0xD08D, - 0x8894: 0xD08E, - 0x8895: 0xD08F, - 0x8896: 0xD0E4, - 0x8897: 0xD090, - 0x8898: 0xD091, - 0x8899: 0xD092, - 0x889A: 0xD093, - 0x889B: 0xD094, - 0x889C: 0xCDE0, - 0x889D: 0xD095, - 0x889E: 0xD096, - 0x889F: 0xD097, - 0x88A0: 0xD098, - 0x88A1: 0xD099, - 0x88A2: 0xF1C8, - 0x88A3: 0xD09A, - 0x88A4: 0xD9F3, - 0x88A5: 0xD09B, - 0x88A6: 0xD09C, - 0x88A7: 0xD09D, - 0x88A8: 0xD09E, - 0x88A9: 0xD09F, - 0x88AA: 0xD0A0, - 0x88AB: 0xB1BB, - 0x88AC: 0xD140, - 0x88AD: 0xCFAE, - 0x88AE: 0xD141, - 0x88AF: 0xD142, - 0x88B0: 0xD143, - 0x88B1: 0xB8A4, - 0x88B2: 0xD144, - 0x88B3: 0xD145, - 0x88B4: 0xD146, - 0x88B5: 0xD147, - 0x88B6: 0xD148, - 0x88B7: 0xF1CA, - 0x88B8: 0xD149, - 0x88B9: 0xD14A, - 0x88BA: 0xD14B, - 0x88BB: 0xD14C, - 0x88BC: 0xF1CB, - 0x88BD: 0xD14D, - 0x88BE: 0xD14E, - 0x88BF: 0xD14F, - 0x88C0: 0xD150, - 0x88C1: 0xB2C3, - 0x88C2: 0xC1D1, - 0x88C3: 0xD151, - 0x88C4: 0xD152, - 0x88C5: 0xD7B0, - 0x88C6: 0xF1C9, - 0x88C7: 0xD153, - 0x88C8: 0xD154, - 0x88C9: 0xF1CC, - 0x88CA: 0xD155, - 0x88CB: 0xD156, - 0x88CC: 0xD157, - 0x88CD: 0xD158, - 0x88CE: 0xF1CE, - 0x88CF: 0xD159, - 0x88D0: 0xD15A, - 0x88D1: 0xD15B, - 0x88D2: 0xD9F6, - 0x88D3: 0xD15C, - 0x88D4: 0xD2E1, - 0x88D5: 0xD4A3, - 0x88D6: 0xD15D, - 0x88D7: 0xD15E, - 0x88D8: 0xF4C3, - 0x88D9: 0xC8B9, - 0x88DA: 0xD15F, - 0x88DB: 0xD160, - 0x88DC: 0xD161, - 0x88DD: 0xD162, - 0x88DE: 0xD163, - 0x88DF: 0xF4C4, - 0x88E0: 0xD164, - 0x88E1: 0xD165, - 0x88E2: 0xF1CD, - 0x88E3: 0xF1CF, - 0x88E4: 0xBFE3, - 0x88E5: 0xF1D0, - 0x88E6: 0xD166, - 0x88E7: 0xD167, - 0x88E8: 0xF1D4, - 0x88E9: 0xD168, - 0x88EA: 0xD169, - 0x88EB: 0xD16A, - 0x88EC: 0xD16B, - 0x88ED: 0xD16C, - 0x88EE: 0xD16D, - 0x88EF: 0xD16E, - 0x88F0: 0xF1D6, - 0x88F1: 0xF1D1, - 0x88F2: 0xD16F, - 0x88F3: 0xC9D1, - 0x88F4: 0xC5E1, - 0x88F5: 0xD170, - 0x88F6: 0xD171, - 0x88F7: 0xD172, - 0x88F8: 0xC2E3, - 0x88F9: 0xB9FC, - 0x88FA: 0xD173, - 0x88FB: 0xD174, - 0x88FC: 0xF1D3, - 0x88FD: 0xD175, - 0x88FE: 0xF1D5, - 0x88FF: 0xD176, - 0x8900: 0xD177, - 0x8901: 0xD178, - 0x8902: 0xB9D3, - 0x8903: 0xD179, - 0x8904: 0xD17A, - 0x8905: 0xD17B, - 0x8906: 0xD17C, - 0x8907: 0xD17D, - 0x8908: 0xD17E, - 0x8909: 0xD180, - 0x890A: 0xF1DB, - 0x890B: 0xD181, - 0x890C: 0xD182, - 0x890D: 0xD183, - 0x890E: 0xD184, - 0x890F: 0xD185, - 0x8910: 0xBAD6, - 0x8911: 0xD186, - 0x8912: 0xB0FD, - 0x8913: 0xF1D9, - 0x8914: 0xD187, - 0x8915: 0xD188, - 0x8916: 0xD189, - 0x8917: 0xD18A, - 0x8918: 0xD18B, - 0x8919: 0xF1D8, - 0x891A: 0xF1D2, - 0x891B: 0xF1DA, - 0x891C: 0xD18C, - 0x891D: 0xD18D, - 0x891E: 0xD18E, - 0x891F: 0xD18F, - 0x8920: 0xD190, - 0x8921: 0xF1D7, - 0x8922: 0xD191, - 0x8923: 0xD192, - 0x8924: 0xD193, - 0x8925: 0xC8EC, - 0x8926: 0xD194, - 0x8927: 0xD195, - 0x8928: 0xD196, - 0x8929: 0xD197, - 0x892A: 0xCDCA, - 0x892B: 0xF1DD, - 0x892C: 0xD198, - 0x892D: 0xD199, - 0x892E: 0xD19A, - 0x892F: 0xD19B, - 0x8930: 0xE5BD, - 0x8931: 0xD19C, - 0x8932: 0xD19D, - 0x8933: 0xD19E, - 0x8934: 0xF1DC, - 0x8935: 0xD19F, - 0x8936: 0xF1DE, - 0x8937: 0xD1A0, - 0x8938: 0xD240, - 0x8939: 0xD241, - 0x893A: 0xD242, - 0x893B: 0xD243, - 0x893C: 0xD244, - 0x893D: 0xD245, - 0x893E: 0xD246, - 0x893F: 0xD247, - 0x8940: 0xD248, - 0x8941: 0xF1DF, - 0x8942: 0xD249, - 0x8943: 0xD24A, - 0x8944: 0xCFE5, - 0x8945: 0xD24B, - 0x8946: 0xD24C, - 0x8947: 0xD24D, - 0x8948: 0xD24E, - 0x8949: 0xD24F, - 0x894A: 0xD250, - 0x894B: 0xD251, - 0x894C: 0xD252, - 0x894D: 0xD253, - 0x894E: 0xD254, - 0x894F: 0xD255, - 0x8950: 0xD256, - 0x8951: 0xD257, - 0x8952: 0xD258, - 0x8953: 0xD259, - 0x8954: 0xD25A, - 0x8955: 0xD25B, - 0x8956: 0xD25C, - 0x8957: 0xD25D, - 0x8958: 0xD25E, - 0x8959: 0xD25F, - 0x895A: 0xD260, - 0x895B: 0xD261, - 0x895C: 0xD262, - 0x895D: 0xD263, - 0x895E: 0xF4C5, - 0x895F: 0xBDF3, - 0x8960: 0xD264, - 0x8961: 0xD265, - 0x8962: 0xD266, - 0x8963: 0xD267, - 0x8964: 0xD268, - 0x8965: 0xD269, - 0x8966: 0xF1E0, - 0x8967: 0xD26A, - 0x8968: 0xD26B, - 0x8969: 0xD26C, - 0x896A: 0xD26D, - 0x896B: 0xD26E, - 0x896C: 0xD26F, - 0x896D: 0xD270, - 0x896E: 0xD271, - 0x896F: 0xD272, - 0x8970: 0xD273, - 0x8971: 0xD274, - 0x8972: 0xD275, - 0x8973: 0xD276, - 0x8974: 0xD277, - 0x8975: 0xD278, - 0x8976: 0xD279, - 0x8977: 0xD27A, - 0x8978: 0xD27B, - 0x8979: 0xD27C, - 0x897A: 0xD27D, - 0x897B: 0xF1E1, - 0x897C: 0xD27E, - 0x897D: 0xD280, - 0x897E: 0xD281, - 0x897F: 0xCEF7, - 0x8980: 0xD282, - 0x8981: 0xD2AA, - 0x8982: 0xD283, - 0x8983: 0xF1FB, - 0x8984: 0xD284, - 0x8985: 0xD285, - 0x8986: 0xB8B2, - 0x8987: 0xD286, - 0x8988: 0xD287, - 0x8989: 0xD288, - 0x898A: 0xD289, - 0x898B: 0xD28A, - 0x898C: 0xD28B, - 0x898D: 0xD28C, - 0x898E: 0xD28D, - 0x898F: 0xD28E, - 0x8990: 0xD28F, - 0x8991: 0xD290, - 0x8992: 0xD291, - 0x8993: 0xD292, - 0x8994: 0xD293, - 0x8995: 0xD294, - 0x8996: 0xD295, - 0x8997: 0xD296, - 0x8998: 0xD297, - 0x8999: 0xD298, - 0x899A: 0xD299, - 0x899B: 0xD29A, - 0x899C: 0xD29B, - 0x899D: 0xD29C, - 0x899E: 0xD29D, - 0x899F: 0xD29E, - 0x89A0: 0xD29F, - 0x89A1: 0xD2A0, - 0x89A2: 0xD340, - 0x89A3: 0xD341, - 0x89A4: 0xD342, - 0x89A5: 0xD343, - 0x89A6: 0xD344, - 0x89A7: 0xD345, - 0x89A8: 0xD346, - 0x89A9: 0xD347, - 0x89AA: 0xD348, - 0x89AB: 0xD349, - 0x89AC: 0xD34A, - 0x89AD: 0xD34B, - 0x89AE: 0xD34C, - 0x89AF: 0xD34D, - 0x89B0: 0xD34E, - 0x89B1: 0xD34F, - 0x89B2: 0xD350, - 0x89B3: 0xD351, - 0x89B4: 0xD352, - 0x89B5: 0xD353, - 0x89B6: 0xD354, - 0x89B7: 0xD355, - 0x89B8: 0xD356, - 0x89B9: 0xD357, - 0x89BA: 0xD358, - 0x89BB: 0xD359, - 0x89BC: 0xD35A, - 0x89BD: 0xD35B, - 0x89BE: 0xD35C, - 0x89BF: 0xD35D, - 0x89C0: 0xD35E, - 0x89C1: 0xBCFB, - 0x89C2: 0xB9DB, - 0x89C3: 0xD35F, - 0x89C4: 0xB9E6, - 0x89C5: 0xC3D9, - 0x89C6: 0xCAD3, - 0x89C7: 0xEAE8, - 0x89C8: 0xC0C0, - 0x89C9: 0xBEF5, - 0x89CA: 0xEAE9, - 0x89CB: 0xEAEA, - 0x89CC: 0xEAEB, - 0x89CD: 0xD360, - 0x89CE: 0xEAEC, - 0x89CF: 0xEAED, - 0x89D0: 0xEAEE, - 0x89D1: 0xEAEF, - 0x89D2: 0xBDC7, - 0x89D3: 0xD361, - 0x89D4: 0xD362, - 0x89D5: 0xD363, - 0x89D6: 0xF5FB, - 0x89D7: 0xD364, - 0x89D8: 0xD365, - 0x89D9: 0xD366, - 0x89DA: 0xF5FD, - 0x89DB: 0xD367, - 0x89DC: 0xF5FE, - 0x89DD: 0xD368, - 0x89DE: 0xF5FC, - 0x89DF: 0xD369, - 0x89E0: 0xD36A, - 0x89E1: 0xD36B, - 0x89E2: 0xD36C, - 0x89E3: 0xBDE2, - 0x89E4: 0xD36D, - 0x89E5: 0xF6A1, - 0x89E6: 0xB4A5, - 0x89E7: 0xD36E, - 0x89E8: 0xD36F, - 0x89E9: 0xD370, - 0x89EA: 0xD371, - 0x89EB: 0xF6A2, - 0x89EC: 0xD372, - 0x89ED: 0xD373, - 0x89EE: 0xD374, - 0x89EF: 0xF6A3, - 0x89F0: 0xD375, - 0x89F1: 0xD376, - 0x89F2: 0xD377, - 0x89F3: 0xECB2, - 0x89F4: 0xD378, - 0x89F5: 0xD379, - 0x89F6: 0xD37A, - 0x89F7: 0xD37B, - 0x89F8: 0xD37C, - 0x89F9: 0xD37D, - 0x89FA: 0xD37E, - 0x89FB: 0xD380, - 0x89FC: 0xD381, - 0x89FD: 0xD382, - 0x89FE: 0xD383, - 0x89FF: 0xD384, - 0x8A00: 0xD1D4, - 0x8A01: 0xD385, - 0x8A02: 0xD386, - 0x8A03: 0xD387, - 0x8A04: 0xD388, - 0x8A05: 0xD389, - 0x8A06: 0xD38A, - 0x8A07: 0xD9EA, - 0x8A08: 0xD38B, - 0x8A09: 0xD38C, - 0x8A0A: 0xD38D, - 0x8A0B: 0xD38E, - 0x8A0C: 0xD38F, - 0x8A0D: 0xD390, - 0x8A0E: 0xD391, - 0x8A0F: 0xD392, - 0x8A10: 0xD393, - 0x8A11: 0xD394, - 0x8A12: 0xD395, - 0x8A13: 0xD396, - 0x8A14: 0xD397, - 0x8A15: 0xD398, - 0x8A16: 0xD399, - 0x8A17: 0xD39A, - 0x8A18: 0xD39B, - 0x8A19: 0xD39C, - 0x8A1A: 0xD39D, - 0x8A1B: 0xD39E, - 0x8A1C: 0xD39F, - 0x8A1D: 0xD3A0, - 0x8A1E: 0xD440, - 0x8A1F: 0xD441, - 0x8A20: 0xD442, - 0x8A21: 0xD443, - 0x8A22: 0xD444, - 0x8A23: 0xD445, - 0x8A24: 0xD446, - 0x8A25: 0xD447, - 0x8A26: 0xD448, - 0x8A27: 0xD449, - 0x8A28: 0xD44A, - 0x8A29: 0xD44B, - 0x8A2A: 0xD44C, - 0x8A2B: 0xD44D, - 0x8A2C: 0xD44E, - 0x8A2D: 0xD44F, - 0x8A2E: 0xD450, - 0x8A2F: 0xD451, - 0x8A30: 0xD452, - 0x8A31: 0xD453, - 0x8A32: 0xD454, - 0x8A33: 0xD455, - 0x8A34: 0xD456, - 0x8A35: 0xD457, - 0x8A36: 0xD458, - 0x8A37: 0xD459, - 0x8A38: 0xD45A, - 0x8A39: 0xD45B, - 0x8A3A: 0xD45C, - 0x8A3B: 0xD45D, - 0x8A3C: 0xD45E, - 0x8A3D: 0xD45F, - 0x8A3E: 0xF6A4, - 0x8A3F: 0xD460, - 0x8A40: 0xD461, - 0x8A41: 0xD462, - 0x8A42: 0xD463, - 0x8A43: 0xD464, - 0x8A44: 0xD465, - 0x8A45: 0xD466, - 0x8A46: 0xD467, - 0x8A47: 0xD468, - 0x8A48: 0xEEBA, - 0x8A49: 0xD469, - 0x8A4A: 0xD46A, - 0x8A4B: 0xD46B, - 0x8A4C: 0xD46C, - 0x8A4D: 0xD46D, - 0x8A4E: 0xD46E, - 0x8A4F: 0xD46F, - 0x8A50: 0xD470, - 0x8A51: 0xD471, - 0x8A52: 0xD472, - 0x8A53: 0xD473, - 0x8A54: 0xD474, - 0x8A55: 0xD475, - 0x8A56: 0xD476, - 0x8A57: 0xD477, - 0x8A58: 0xD478, - 0x8A59: 0xD479, - 0x8A5A: 0xD47A, - 0x8A5B: 0xD47B, - 0x8A5C: 0xD47C, - 0x8A5D: 0xD47D, - 0x8A5E: 0xD47E, - 0x8A5F: 0xD480, - 0x8A60: 0xD481, - 0x8A61: 0xD482, - 0x8A62: 0xD483, - 0x8A63: 0xD484, - 0x8A64: 0xD485, - 0x8A65: 0xD486, - 0x8A66: 0xD487, - 0x8A67: 0xD488, - 0x8A68: 0xD489, - 0x8A69: 0xD48A, - 0x8A6A: 0xD48B, - 0x8A6B: 0xD48C, - 0x8A6C: 0xD48D, - 0x8A6D: 0xD48E, - 0x8A6E: 0xD48F, - 0x8A6F: 0xD490, - 0x8A70: 0xD491, - 0x8A71: 0xD492, - 0x8A72: 0xD493, - 0x8A73: 0xD494, - 0x8A74: 0xD495, - 0x8A75: 0xD496, - 0x8A76: 0xD497, - 0x8A77: 0xD498, - 0x8A78: 0xD499, - 0x8A79: 0xD5B2, - 0x8A7A: 0xD49A, - 0x8A7B: 0xD49B, - 0x8A7C: 0xD49C, - 0x8A7D: 0xD49D, - 0x8A7E: 0xD49E, - 0x8A7F: 0xD49F, - 0x8A80: 0xD4A0, - 0x8A81: 0xD540, - 0x8A82: 0xD541, - 0x8A83: 0xD542, - 0x8A84: 0xD543, - 0x8A85: 0xD544, - 0x8A86: 0xD545, - 0x8A87: 0xD546, - 0x8A88: 0xD547, - 0x8A89: 0xD3FE, - 0x8A8A: 0xCCDC, - 0x8A8B: 0xD548, - 0x8A8C: 0xD549, - 0x8A8D: 0xD54A, - 0x8A8E: 0xD54B, - 0x8A8F: 0xD54C, - 0x8A90: 0xD54D, - 0x8A91: 0xD54E, - 0x8A92: 0xD54F, - 0x8A93: 0xCAC4, - 0x8A94: 0xD550, - 0x8A95: 0xD551, - 0x8A96: 0xD552, - 0x8A97: 0xD553, - 0x8A98: 0xD554, - 0x8A99: 0xD555, - 0x8A9A: 0xD556, - 0x8A9B: 0xD557, - 0x8A9C: 0xD558, - 0x8A9D: 0xD559, - 0x8A9E: 0xD55A, - 0x8A9F: 0xD55B, - 0x8AA0: 0xD55C, - 0x8AA1: 0xD55D, - 0x8AA2: 0xD55E, - 0x8AA3: 0xD55F, - 0x8AA4: 0xD560, - 0x8AA5: 0xD561, - 0x8AA6: 0xD562, - 0x8AA7: 0xD563, - 0x8AA8: 0xD564, - 0x8AA9: 0xD565, - 0x8AAA: 0xD566, - 0x8AAB: 0xD567, - 0x8AAC: 0xD568, - 0x8AAD: 0xD569, - 0x8AAE: 0xD56A, - 0x8AAF: 0xD56B, - 0x8AB0: 0xD56C, - 0x8AB1: 0xD56D, - 0x8AB2: 0xD56E, - 0x8AB3: 0xD56F, - 0x8AB4: 0xD570, - 0x8AB5: 0xD571, - 0x8AB6: 0xD572, - 0x8AB7: 0xD573, - 0x8AB8: 0xD574, - 0x8AB9: 0xD575, - 0x8ABA: 0xD576, - 0x8ABB: 0xD577, - 0x8ABC: 0xD578, - 0x8ABD: 0xD579, - 0x8ABE: 0xD57A, - 0x8ABF: 0xD57B, - 0x8AC0: 0xD57C, - 0x8AC1: 0xD57D, - 0x8AC2: 0xD57E, - 0x8AC3: 0xD580, - 0x8AC4: 0xD581, - 0x8AC5: 0xD582, - 0x8AC6: 0xD583, - 0x8AC7: 0xD584, - 0x8AC8: 0xD585, - 0x8AC9: 0xD586, - 0x8ACA: 0xD587, - 0x8ACB: 0xD588, - 0x8ACC: 0xD589, - 0x8ACD: 0xD58A, - 0x8ACE: 0xD58B, - 0x8ACF: 0xD58C, - 0x8AD0: 0xD58D, - 0x8AD1: 0xD58E, - 0x8AD2: 0xD58F, - 0x8AD3: 0xD590, - 0x8AD4: 0xD591, - 0x8AD5: 0xD592, - 0x8AD6: 0xD593, - 0x8AD7: 0xD594, - 0x8AD8: 0xD595, - 0x8AD9: 0xD596, - 0x8ADA: 0xD597, - 0x8ADB: 0xD598, - 0x8ADC: 0xD599, - 0x8ADD: 0xD59A, - 0x8ADE: 0xD59B, - 0x8ADF: 0xD59C, - 0x8AE0: 0xD59D, - 0x8AE1: 0xD59E, - 0x8AE2: 0xD59F, - 0x8AE3: 0xD5A0, - 0x8AE4: 0xD640, - 0x8AE5: 0xD641, - 0x8AE6: 0xD642, - 0x8AE7: 0xD643, - 0x8AE8: 0xD644, - 0x8AE9: 0xD645, - 0x8AEA: 0xD646, - 0x8AEB: 0xD647, - 0x8AEC: 0xD648, - 0x8AED: 0xD649, - 0x8AEE: 0xD64A, - 0x8AEF: 0xD64B, - 0x8AF0: 0xD64C, - 0x8AF1: 0xD64D, - 0x8AF2: 0xD64E, - 0x8AF3: 0xD64F, - 0x8AF4: 0xD650, - 0x8AF5: 0xD651, - 0x8AF6: 0xD652, - 0x8AF7: 0xD653, - 0x8AF8: 0xD654, - 0x8AF9: 0xD655, - 0x8AFA: 0xD656, - 0x8AFB: 0xD657, - 0x8AFC: 0xD658, - 0x8AFD: 0xD659, - 0x8AFE: 0xD65A, - 0x8AFF: 0xD65B, - 0x8B00: 0xD65C, - 0x8B01: 0xD65D, - 0x8B02: 0xD65E, - 0x8B03: 0xD65F, - 0x8B04: 0xD660, - 0x8B05: 0xD661, - 0x8B06: 0xD662, - 0x8B07: 0xE5C0, - 0x8B08: 0xD663, - 0x8B09: 0xD664, - 0x8B0A: 0xD665, - 0x8B0B: 0xD666, - 0x8B0C: 0xD667, - 0x8B0D: 0xD668, - 0x8B0E: 0xD669, - 0x8B0F: 0xD66A, - 0x8B10: 0xD66B, - 0x8B11: 0xD66C, - 0x8B12: 0xD66D, - 0x8B13: 0xD66E, - 0x8B14: 0xD66F, - 0x8B15: 0xD670, - 0x8B16: 0xD671, - 0x8B17: 0xD672, - 0x8B18: 0xD673, - 0x8B19: 0xD674, - 0x8B1A: 0xD675, - 0x8B1B: 0xD676, - 0x8B1C: 0xD677, - 0x8B1D: 0xD678, - 0x8B1E: 0xD679, - 0x8B1F: 0xD67A, - 0x8B20: 0xD67B, - 0x8B21: 0xD67C, - 0x8B22: 0xD67D, - 0x8B23: 0xD67E, - 0x8B24: 0xD680, - 0x8B25: 0xD681, - 0x8B26: 0xF6A5, - 0x8B27: 0xD682, - 0x8B28: 0xD683, - 0x8B29: 0xD684, - 0x8B2A: 0xD685, - 0x8B2B: 0xD686, - 0x8B2C: 0xD687, - 0x8B2D: 0xD688, - 0x8B2E: 0xD689, - 0x8B2F: 0xD68A, - 0x8B30: 0xD68B, - 0x8B31: 0xD68C, - 0x8B32: 0xD68D, - 0x8B33: 0xD68E, - 0x8B34: 0xD68F, - 0x8B35: 0xD690, - 0x8B36: 0xD691, - 0x8B37: 0xD692, - 0x8B38: 0xD693, - 0x8B39: 0xD694, - 0x8B3A: 0xD695, - 0x8B3B: 0xD696, - 0x8B3C: 0xD697, - 0x8B3D: 0xD698, - 0x8B3E: 0xD699, - 0x8B3F: 0xD69A, - 0x8B40: 0xD69B, - 0x8B41: 0xD69C, - 0x8B42: 0xD69D, - 0x8B43: 0xD69E, - 0x8B44: 0xD69F, - 0x8B45: 0xD6A0, - 0x8B46: 0xD740, - 0x8B47: 0xD741, - 0x8B48: 0xD742, - 0x8B49: 0xD743, - 0x8B4A: 0xD744, - 0x8B4B: 0xD745, - 0x8B4C: 0xD746, - 0x8B4D: 0xD747, - 0x8B4E: 0xD748, - 0x8B4F: 0xD749, - 0x8B50: 0xD74A, - 0x8B51: 0xD74B, - 0x8B52: 0xD74C, - 0x8B53: 0xD74D, - 0x8B54: 0xD74E, - 0x8B55: 0xD74F, - 0x8B56: 0xD750, - 0x8B57: 0xD751, - 0x8B58: 0xD752, - 0x8B59: 0xD753, - 0x8B5A: 0xD754, - 0x8B5B: 0xD755, - 0x8B5C: 0xD756, - 0x8B5D: 0xD757, - 0x8B5E: 0xD758, - 0x8B5F: 0xD759, - 0x8B60: 0xD75A, - 0x8B61: 0xD75B, - 0x8B62: 0xD75C, - 0x8B63: 0xD75D, - 0x8B64: 0xD75E, - 0x8B65: 0xD75F, - 0x8B66: 0xBEAF, - 0x8B67: 0xD760, - 0x8B68: 0xD761, - 0x8B69: 0xD762, - 0x8B6A: 0xD763, - 0x8B6B: 0xD764, - 0x8B6C: 0xC6A9, - 0x8B6D: 0xD765, - 0x8B6E: 0xD766, - 0x8B6F: 0xD767, - 0x8B70: 0xD768, - 0x8B71: 0xD769, - 0x8B72: 0xD76A, - 0x8B73: 0xD76B, - 0x8B74: 0xD76C, - 0x8B75: 0xD76D, - 0x8B76: 0xD76E, - 0x8B77: 0xD76F, - 0x8B78: 0xD770, - 0x8B79: 0xD771, - 0x8B7A: 0xD772, - 0x8B7B: 0xD773, - 0x8B7C: 0xD774, - 0x8B7D: 0xD775, - 0x8B7E: 0xD776, - 0x8B7F: 0xD777, - 0x8B80: 0xD778, - 0x8B81: 0xD779, - 0x8B82: 0xD77A, - 0x8B83: 0xD77B, - 0x8B84: 0xD77C, - 0x8B85: 0xD77D, - 0x8B86: 0xD77E, - 0x8B87: 0xD780, - 0x8B88: 0xD781, - 0x8B89: 0xD782, - 0x8B8A: 0xD783, - 0x8B8B: 0xD784, - 0x8B8C: 0xD785, - 0x8B8D: 0xD786, - 0x8B8E: 0xD787, - 0x8B8F: 0xD788, - 0x8B90: 0xD789, - 0x8B91: 0xD78A, - 0x8B92: 0xD78B, - 0x8B93: 0xD78C, - 0x8B94: 0xD78D, - 0x8B95: 0xD78E, - 0x8B96: 0xD78F, - 0x8B97: 0xD790, - 0x8B98: 0xD791, - 0x8B99: 0xD792, - 0x8B9A: 0xD793, - 0x8B9B: 0xD794, - 0x8B9C: 0xD795, - 0x8B9D: 0xD796, - 0x8B9E: 0xD797, - 0x8B9F: 0xD798, - 0x8BA0: 0xDAA5, - 0x8BA1: 0xBCC6, - 0x8BA2: 0xB6A9, - 0x8BA3: 0xB8BC, - 0x8BA4: 0xC8CF, - 0x8BA5: 0xBCA5, - 0x8BA6: 0xDAA6, - 0x8BA7: 0xDAA7, - 0x8BA8: 0xCCD6, - 0x8BA9: 0xC8C3, - 0x8BAA: 0xDAA8, - 0x8BAB: 0xC6FD, - 0x8BAC: 0xD799, - 0x8BAD: 0xD1B5, - 0x8BAE: 0xD2E9, - 0x8BAF: 0xD1B6, - 0x8BB0: 0xBCC7, - 0x8BB1: 0xD79A, - 0x8BB2: 0xBDB2, - 0x8BB3: 0xBBE4, - 0x8BB4: 0xDAA9, - 0x8BB5: 0xDAAA, - 0x8BB6: 0xD1C8, - 0x8BB7: 0xDAAB, - 0x8BB8: 0xD0ED, - 0x8BB9: 0xB6EF, - 0x8BBA: 0xC2DB, - 0x8BBB: 0xD79B, - 0x8BBC: 0xCBCF, - 0x8BBD: 0xB7ED, - 0x8BBE: 0xC9E8, - 0x8BBF: 0xB7C3, - 0x8BC0: 0xBEF7, - 0x8BC1: 0xD6A4, - 0x8BC2: 0xDAAC, - 0x8BC3: 0xDAAD, - 0x8BC4: 0xC6C0, - 0x8BC5: 0xD7E7, - 0x8BC6: 0xCAB6, - 0x8BC7: 0xD79C, - 0x8BC8: 0xD5A9, - 0x8BC9: 0xCBDF, - 0x8BCA: 0xD5EF, - 0x8BCB: 0xDAAE, - 0x8BCC: 0xD6DF, - 0x8BCD: 0xB4CA, - 0x8BCE: 0xDAB0, - 0x8BCF: 0xDAAF, - 0x8BD0: 0xD79D, - 0x8BD1: 0xD2EB, - 0x8BD2: 0xDAB1, - 0x8BD3: 0xDAB2, - 0x8BD4: 0xDAB3, - 0x8BD5: 0xCAD4, - 0x8BD6: 0xDAB4, - 0x8BD7: 0xCAAB, - 0x8BD8: 0xDAB5, - 0x8BD9: 0xDAB6, - 0x8BDA: 0xB3CF, - 0x8BDB: 0xD6EF, - 0x8BDC: 0xDAB7, - 0x8BDD: 0xBBB0, - 0x8BDE: 0xB5AE, - 0x8BDF: 0xDAB8, - 0x8BE0: 0xDAB9, - 0x8BE1: 0xB9EE, - 0x8BE2: 0xD1AF, - 0x8BE3: 0xD2E8, - 0x8BE4: 0xDABA, - 0x8BE5: 0xB8C3, - 0x8BE6: 0xCFEA, - 0x8BE7: 0xB2EF, - 0x8BE8: 0xDABB, - 0x8BE9: 0xDABC, - 0x8BEA: 0xD79E, - 0x8BEB: 0xBDEB, - 0x8BEC: 0xCEDC, - 0x8BED: 0xD3EF, - 0x8BEE: 0xDABD, - 0x8BEF: 0xCEF3, - 0x8BF0: 0xDABE, - 0x8BF1: 0xD3D5, - 0x8BF2: 0xBBE5, - 0x8BF3: 0xDABF, - 0x8BF4: 0xCBB5, - 0x8BF5: 0xCBD0, - 0x8BF6: 0xDAC0, - 0x8BF7: 0xC7EB, - 0x8BF8: 0xD6EE, - 0x8BF9: 0xDAC1, - 0x8BFA: 0xC5B5, - 0x8BFB: 0xB6C1, - 0x8BFC: 0xDAC2, - 0x8BFD: 0xB7CC, - 0x8BFE: 0xBFCE, - 0x8BFF: 0xDAC3, - 0x8C00: 0xDAC4, - 0x8C01: 0xCBAD, - 0x8C02: 0xDAC5, - 0x8C03: 0xB5F7, - 0x8C04: 0xDAC6, - 0x8C05: 0xC1C2, - 0x8C06: 0xD7BB, - 0x8C07: 0xDAC7, - 0x8C08: 0xCCB8, - 0x8C09: 0xD79F, - 0x8C0A: 0xD2EA, - 0x8C0B: 0xC4B1, - 0x8C0C: 0xDAC8, - 0x8C0D: 0xB5FD, - 0x8C0E: 0xBBD1, - 0x8C0F: 0xDAC9, - 0x8C10: 0xD0B3, - 0x8C11: 0xDACA, - 0x8C12: 0xDACB, - 0x8C13: 0xCEBD, - 0x8C14: 0xDACC, - 0x8C15: 0xDACD, - 0x8C16: 0xDACE, - 0x8C17: 0xB2F7, - 0x8C18: 0xDAD1, - 0x8C19: 0xDACF, - 0x8C1A: 0xD1E8, - 0x8C1B: 0xDAD0, - 0x8C1C: 0xC3D5, - 0x8C1D: 0xDAD2, - 0x8C1E: 0xD7A0, - 0x8C1F: 0xDAD3, - 0x8C20: 0xDAD4, - 0x8C21: 0xDAD5, - 0x8C22: 0xD0BB, - 0x8C23: 0xD2A5, - 0x8C24: 0xB0F9, - 0x8C25: 0xDAD6, - 0x8C26: 0xC7AB, - 0x8C27: 0xDAD7, - 0x8C28: 0xBDF7, - 0x8C29: 0xC3A1, - 0x8C2A: 0xDAD8, - 0x8C2B: 0xDAD9, - 0x8C2C: 0xC3FD, - 0x8C2D: 0xCCB7, - 0x8C2E: 0xDADA, - 0x8C2F: 0xDADB, - 0x8C30: 0xC0BE, - 0x8C31: 0xC6D7, - 0x8C32: 0xDADC, - 0x8C33: 0xDADD, - 0x8C34: 0xC7B4, - 0x8C35: 0xDADE, - 0x8C36: 0xDADF, - 0x8C37: 0xB9C8, - 0x8C38: 0xD840, - 0x8C39: 0xD841, - 0x8C3A: 0xD842, - 0x8C3B: 0xD843, - 0x8C3C: 0xD844, - 0x8C3D: 0xD845, - 0x8C3E: 0xD846, - 0x8C3F: 0xD847, - 0x8C40: 0xD848, - 0x8C41: 0xBBED, - 0x8C42: 0xD849, - 0x8C43: 0xD84A, - 0x8C44: 0xD84B, - 0x8C45: 0xD84C, - 0x8C46: 0xB6B9, - 0x8C47: 0xF4F8, - 0x8C48: 0xD84D, - 0x8C49: 0xF4F9, - 0x8C4A: 0xD84E, - 0x8C4B: 0xD84F, - 0x8C4C: 0xCDE3, - 0x8C4D: 0xD850, - 0x8C4E: 0xD851, - 0x8C4F: 0xD852, - 0x8C50: 0xD853, - 0x8C51: 0xD854, - 0x8C52: 0xD855, - 0x8C53: 0xD856, - 0x8C54: 0xD857, - 0x8C55: 0xF5B9, - 0x8C56: 0xD858, - 0x8C57: 0xD859, - 0x8C58: 0xD85A, - 0x8C59: 0xD85B, - 0x8C5A: 0xEBE0, - 0x8C5B: 0xD85C, - 0x8C5C: 0xD85D, - 0x8C5D: 0xD85E, - 0x8C5E: 0xD85F, - 0x8C5F: 0xD860, - 0x8C60: 0xD861, - 0x8C61: 0xCFF3, - 0x8C62: 0xBBBF, - 0x8C63: 0xD862, - 0x8C64: 0xD863, - 0x8C65: 0xD864, - 0x8C66: 0xD865, - 0x8C67: 0xD866, - 0x8C68: 0xD867, - 0x8C69: 0xD868, - 0x8C6A: 0xBAC0, - 0x8C6B: 0xD4A5, - 0x8C6C: 0xD869, - 0x8C6D: 0xD86A, - 0x8C6E: 0xD86B, - 0x8C6F: 0xD86C, - 0x8C70: 0xD86D, - 0x8C71: 0xD86E, - 0x8C72: 0xD86F, - 0x8C73: 0xE1D9, - 0x8C74: 0xD870, - 0x8C75: 0xD871, - 0x8C76: 0xD872, - 0x8C77: 0xD873, - 0x8C78: 0xF5F4, - 0x8C79: 0xB1AA, - 0x8C7A: 0xB2F2, - 0x8C7B: 0xD874, - 0x8C7C: 0xD875, - 0x8C7D: 0xD876, - 0x8C7E: 0xD877, - 0x8C7F: 0xD878, - 0x8C80: 0xD879, - 0x8C81: 0xD87A, - 0x8C82: 0xF5F5, - 0x8C83: 0xD87B, - 0x8C84: 0xD87C, - 0x8C85: 0xF5F7, - 0x8C86: 0xD87D, - 0x8C87: 0xD87E, - 0x8C88: 0xD880, - 0x8C89: 0xBAD1, - 0x8C8A: 0xF5F6, - 0x8C8B: 0xD881, - 0x8C8C: 0xC3B2, - 0x8C8D: 0xD882, - 0x8C8E: 0xD883, - 0x8C8F: 0xD884, - 0x8C90: 0xD885, - 0x8C91: 0xD886, - 0x8C92: 0xD887, - 0x8C93: 0xD888, - 0x8C94: 0xF5F9, - 0x8C95: 0xD889, - 0x8C96: 0xD88A, - 0x8C97: 0xD88B, - 0x8C98: 0xF5F8, - 0x8C99: 0xD88C, - 0x8C9A: 0xD88D, - 0x8C9B: 0xD88E, - 0x8C9C: 0xD88F, - 0x8C9D: 0xD890, - 0x8C9E: 0xD891, - 0x8C9F: 0xD892, - 0x8CA0: 0xD893, - 0x8CA1: 0xD894, - 0x8CA2: 0xD895, - 0x8CA3: 0xD896, - 0x8CA4: 0xD897, - 0x8CA5: 0xD898, - 0x8CA6: 0xD899, - 0x8CA7: 0xD89A, - 0x8CA8: 0xD89B, - 0x8CA9: 0xD89C, - 0x8CAA: 0xD89D, - 0x8CAB: 0xD89E, - 0x8CAC: 0xD89F, - 0x8CAD: 0xD8A0, - 0x8CAE: 0xD940, - 0x8CAF: 0xD941, - 0x8CB0: 0xD942, - 0x8CB1: 0xD943, - 0x8CB2: 0xD944, - 0x8CB3: 0xD945, - 0x8CB4: 0xD946, - 0x8CB5: 0xD947, - 0x8CB6: 0xD948, - 0x8CB7: 0xD949, - 0x8CB8: 0xD94A, - 0x8CB9: 0xD94B, - 0x8CBA: 0xD94C, - 0x8CBB: 0xD94D, - 0x8CBC: 0xD94E, - 0x8CBD: 0xD94F, - 0x8CBE: 0xD950, - 0x8CBF: 0xD951, - 0x8CC0: 0xD952, - 0x8CC1: 0xD953, - 0x8CC2: 0xD954, - 0x8CC3: 0xD955, - 0x8CC4: 0xD956, - 0x8CC5: 0xD957, - 0x8CC6: 0xD958, - 0x8CC7: 0xD959, - 0x8CC8: 0xD95A, - 0x8CC9: 0xD95B, - 0x8CCA: 0xD95C, - 0x8CCB: 0xD95D, - 0x8CCC: 0xD95E, - 0x8CCD: 0xD95F, - 0x8CCE: 0xD960, - 0x8CCF: 0xD961, - 0x8CD0: 0xD962, - 0x8CD1: 0xD963, - 0x8CD2: 0xD964, - 0x8CD3: 0xD965, - 0x8CD4: 0xD966, - 0x8CD5: 0xD967, - 0x8CD6: 0xD968, - 0x8CD7: 0xD969, - 0x8CD8: 0xD96A, - 0x8CD9: 0xD96B, - 0x8CDA: 0xD96C, - 0x8CDB: 0xD96D, - 0x8CDC: 0xD96E, - 0x8CDD: 0xD96F, - 0x8CDE: 0xD970, - 0x8CDF: 0xD971, - 0x8CE0: 0xD972, - 0x8CE1: 0xD973, - 0x8CE2: 0xD974, - 0x8CE3: 0xD975, - 0x8CE4: 0xD976, - 0x8CE5: 0xD977, - 0x8CE6: 0xD978, - 0x8CE7: 0xD979, - 0x8CE8: 0xD97A, - 0x8CE9: 0xD97B, - 0x8CEA: 0xD97C, - 0x8CEB: 0xD97D, - 0x8CEC: 0xD97E, - 0x8CED: 0xD980, - 0x8CEE: 0xD981, - 0x8CEF: 0xD982, - 0x8CF0: 0xD983, - 0x8CF1: 0xD984, - 0x8CF2: 0xD985, - 0x8CF3: 0xD986, - 0x8CF4: 0xD987, - 0x8CF5: 0xD988, - 0x8CF6: 0xD989, - 0x8CF7: 0xD98A, - 0x8CF8: 0xD98B, - 0x8CF9: 0xD98C, - 0x8CFA: 0xD98D, - 0x8CFB: 0xD98E, - 0x8CFC: 0xD98F, - 0x8CFD: 0xD990, - 0x8CFE: 0xD991, - 0x8CFF: 0xD992, - 0x8D00: 0xD993, - 0x8D01: 0xD994, - 0x8D02: 0xD995, - 0x8D03: 0xD996, - 0x8D04: 0xD997, - 0x8D05: 0xD998, - 0x8D06: 0xD999, - 0x8D07: 0xD99A, - 0x8D08: 0xD99B, - 0x8D09: 0xD99C, - 0x8D0A: 0xD99D, - 0x8D0B: 0xD99E, - 0x8D0C: 0xD99F, - 0x8D0D: 0xD9A0, - 0x8D0E: 0xDA40, - 0x8D0F: 0xDA41, - 0x8D10: 0xDA42, - 0x8D11: 0xDA43, - 0x8D12: 0xDA44, - 0x8D13: 0xDA45, - 0x8D14: 0xDA46, - 0x8D15: 0xDA47, - 0x8D16: 0xDA48, - 0x8D17: 0xDA49, - 0x8D18: 0xDA4A, - 0x8D19: 0xDA4B, - 0x8D1A: 0xDA4C, - 0x8D1B: 0xDA4D, - 0x8D1C: 0xDA4E, - 0x8D1D: 0xB1B4, - 0x8D1E: 0xD5EA, - 0x8D1F: 0xB8BA, - 0x8D20: 0xDA4F, - 0x8D21: 0xB9B1, - 0x8D22: 0xB2C6, - 0x8D23: 0xD4F0, - 0x8D24: 0xCFCD, - 0x8D25: 0xB0DC, - 0x8D26: 0xD5CB, - 0x8D27: 0xBBF5, - 0x8D28: 0xD6CA, - 0x8D29: 0xB7B7, - 0x8D2A: 0xCCB0, - 0x8D2B: 0xC6B6, - 0x8D2C: 0xB1E1, - 0x8D2D: 0xB9BA, - 0x8D2E: 0xD6FC, - 0x8D2F: 0xB9E1, - 0x8D30: 0xB7A1, - 0x8D31: 0xBCFA, - 0x8D32: 0xEADA, - 0x8D33: 0xEADB, - 0x8D34: 0xCCF9, - 0x8D35: 0xB9F3, - 0x8D36: 0xEADC, - 0x8D37: 0xB4FB, - 0x8D38: 0xC3B3, - 0x8D39: 0xB7D1, - 0x8D3A: 0xBAD8, - 0x8D3B: 0xEADD, - 0x8D3C: 0xD4F4, - 0x8D3D: 0xEADE, - 0x8D3E: 0xBCD6, - 0x8D3F: 0xBBDF, - 0x8D40: 0xEADF, - 0x8D41: 0xC1DE, - 0x8D42: 0xC2B8, - 0x8D43: 0xD4DF, - 0x8D44: 0xD7CA, - 0x8D45: 0xEAE0, - 0x8D46: 0xEAE1, - 0x8D47: 0xEAE4, - 0x8D48: 0xEAE2, - 0x8D49: 0xEAE3, - 0x8D4A: 0xC9DE, - 0x8D4B: 0xB8B3, - 0x8D4C: 0xB6C4, - 0x8D4D: 0xEAE5, - 0x8D4E: 0xCAEA, - 0x8D4F: 0xC9CD, - 0x8D50: 0xB4CD, - 0x8D51: 0xDA50, - 0x8D52: 0xDA51, - 0x8D53: 0xE2D9, - 0x8D54: 0xC5E2, - 0x8D55: 0xEAE6, - 0x8D56: 0xC0B5, - 0x8D57: 0xDA52, - 0x8D58: 0xD7B8, - 0x8D59: 0xEAE7, - 0x8D5A: 0xD7AC, - 0x8D5B: 0xC8FC, - 0x8D5C: 0xD8D3, - 0x8D5D: 0xD8CD, - 0x8D5E: 0xD4DE, - 0x8D5F: 0xDA53, - 0x8D60: 0xD4F9, - 0x8D61: 0xC9C4, - 0x8D62: 0xD3AE, - 0x8D63: 0xB8D3, - 0x8D64: 0xB3E0, - 0x8D65: 0xDA54, - 0x8D66: 0xC9E2, - 0x8D67: 0xF4F6, - 0x8D68: 0xDA55, - 0x8D69: 0xDA56, - 0x8D6A: 0xDA57, - 0x8D6B: 0xBAD5, - 0x8D6C: 0xDA58, - 0x8D6D: 0xF4F7, - 0x8D6E: 0xDA59, - 0x8D6F: 0xDA5A, - 0x8D70: 0xD7DF, - 0x8D71: 0xDA5B, - 0x8D72: 0xDA5C, - 0x8D73: 0xF4F1, - 0x8D74: 0xB8B0, - 0x8D75: 0xD5D4, - 0x8D76: 0xB8CF, - 0x8D77: 0xC6F0, - 0x8D78: 0xDA5D, - 0x8D79: 0xDA5E, - 0x8D7A: 0xDA5F, - 0x8D7B: 0xDA60, - 0x8D7C: 0xDA61, - 0x8D7D: 0xDA62, - 0x8D7E: 0xDA63, - 0x8D7F: 0xDA64, - 0x8D80: 0xDA65, - 0x8D81: 0xB3C3, - 0x8D82: 0xDA66, - 0x8D83: 0xDA67, - 0x8D84: 0xF4F2, - 0x8D85: 0xB3AC, - 0x8D86: 0xDA68, - 0x8D87: 0xDA69, - 0x8D88: 0xDA6A, - 0x8D89: 0xDA6B, - 0x8D8A: 0xD4BD, - 0x8D8B: 0xC7F7, - 0x8D8C: 0xDA6C, - 0x8D8D: 0xDA6D, - 0x8D8E: 0xDA6E, - 0x8D8F: 0xDA6F, - 0x8D90: 0xDA70, - 0x8D91: 0xF4F4, - 0x8D92: 0xDA71, - 0x8D93: 0xDA72, - 0x8D94: 0xF4F3, - 0x8D95: 0xDA73, - 0x8D96: 0xDA74, - 0x8D97: 0xDA75, - 0x8D98: 0xDA76, - 0x8D99: 0xDA77, - 0x8D9A: 0xDA78, - 0x8D9B: 0xDA79, - 0x8D9C: 0xDA7A, - 0x8D9D: 0xDA7B, - 0x8D9E: 0xDA7C, - 0x8D9F: 0xCCCB, - 0x8DA0: 0xDA7D, - 0x8DA1: 0xDA7E, - 0x8DA2: 0xDA80, - 0x8DA3: 0xC8A4, - 0x8DA4: 0xDA81, - 0x8DA5: 0xDA82, - 0x8DA6: 0xDA83, - 0x8DA7: 0xDA84, - 0x8DA8: 0xDA85, - 0x8DA9: 0xDA86, - 0x8DAA: 0xDA87, - 0x8DAB: 0xDA88, - 0x8DAC: 0xDA89, - 0x8DAD: 0xDA8A, - 0x8DAE: 0xDA8B, - 0x8DAF: 0xDA8C, - 0x8DB0: 0xDA8D, - 0x8DB1: 0xF4F5, - 0x8DB2: 0xDA8E, - 0x8DB3: 0xD7E3, - 0x8DB4: 0xC5BF, - 0x8DB5: 0xF5C0, - 0x8DB6: 0xDA8F, - 0x8DB7: 0xDA90, - 0x8DB8: 0xF5BB, - 0x8DB9: 0xDA91, - 0x8DBA: 0xF5C3, - 0x8DBB: 0xDA92, - 0x8DBC: 0xF5C2, - 0x8DBD: 0xDA93, - 0x8DBE: 0xD6BA, - 0x8DBF: 0xF5C1, - 0x8DC0: 0xDA94, - 0x8DC1: 0xDA95, - 0x8DC2: 0xDA96, - 0x8DC3: 0xD4BE, - 0x8DC4: 0xF5C4, - 0x8DC5: 0xDA97, - 0x8DC6: 0xF5CC, - 0x8DC7: 0xDA98, - 0x8DC8: 0xDA99, - 0x8DC9: 0xDA9A, - 0x8DCA: 0xDA9B, - 0x8DCB: 0xB0CF, - 0x8DCC: 0xB5F8, - 0x8DCD: 0xDA9C, - 0x8DCE: 0xF5C9, - 0x8DCF: 0xF5CA, - 0x8DD0: 0xDA9D, - 0x8DD1: 0xC5DC, - 0x8DD2: 0xDA9E, - 0x8DD3: 0xDA9F, - 0x8DD4: 0xDAA0, - 0x8DD5: 0xDB40, - 0x8DD6: 0xF5C5, - 0x8DD7: 0xF5C6, - 0x8DD8: 0xDB41, - 0x8DD9: 0xDB42, - 0x8DDA: 0xF5C7, - 0x8DDB: 0xF5CB, - 0x8DDC: 0xDB43, - 0x8DDD: 0xBEE0, - 0x8DDE: 0xF5C8, - 0x8DDF: 0xB8FA, - 0x8DE0: 0xDB44, - 0x8DE1: 0xDB45, - 0x8DE2: 0xDB46, - 0x8DE3: 0xF5D0, - 0x8DE4: 0xF5D3, - 0x8DE5: 0xDB47, - 0x8DE6: 0xDB48, - 0x8DE7: 0xDB49, - 0x8DE8: 0xBFE7, - 0x8DE9: 0xDB4A, - 0x8DEA: 0xB9F2, - 0x8DEB: 0xF5BC, - 0x8DEC: 0xF5CD, - 0x8DED: 0xDB4B, - 0x8DEE: 0xDB4C, - 0x8DEF: 0xC2B7, - 0x8DF0: 0xDB4D, - 0x8DF1: 0xDB4E, - 0x8DF2: 0xDB4F, - 0x8DF3: 0xCCF8, - 0x8DF4: 0xDB50, - 0x8DF5: 0xBCF9, - 0x8DF6: 0xDB51, - 0x8DF7: 0xF5CE, - 0x8DF8: 0xF5CF, - 0x8DF9: 0xF5D1, - 0x8DFA: 0xB6E5, - 0x8DFB: 0xF5D2, - 0x8DFC: 0xDB52, - 0x8DFD: 0xF5D5, - 0x8DFE: 0xDB53, - 0x8DFF: 0xDB54, - 0x8E00: 0xDB55, - 0x8E01: 0xDB56, - 0x8E02: 0xDB57, - 0x8E03: 0xDB58, - 0x8E04: 0xDB59, - 0x8E05: 0xF5BD, - 0x8E06: 0xDB5A, - 0x8E07: 0xDB5B, - 0x8E08: 0xDB5C, - 0x8E09: 0xF5D4, - 0x8E0A: 0xD3BB, - 0x8E0B: 0xDB5D, - 0x8E0C: 0xB3EC, - 0x8E0D: 0xDB5E, - 0x8E0E: 0xDB5F, - 0x8E0F: 0xCCA4, - 0x8E10: 0xDB60, - 0x8E11: 0xDB61, - 0x8E12: 0xDB62, - 0x8E13: 0xDB63, - 0x8E14: 0xF5D6, - 0x8E15: 0xDB64, - 0x8E16: 0xDB65, - 0x8E17: 0xDB66, - 0x8E18: 0xDB67, - 0x8E19: 0xDB68, - 0x8E1A: 0xDB69, - 0x8E1B: 0xDB6A, - 0x8E1C: 0xDB6B, - 0x8E1D: 0xF5D7, - 0x8E1E: 0xBEE1, - 0x8E1F: 0xF5D8, - 0x8E20: 0xDB6C, - 0x8E21: 0xDB6D, - 0x8E22: 0xCCDF, - 0x8E23: 0xF5DB, - 0x8E24: 0xDB6E, - 0x8E25: 0xDB6F, - 0x8E26: 0xDB70, - 0x8E27: 0xDB71, - 0x8E28: 0xDB72, - 0x8E29: 0xB2C8, - 0x8E2A: 0xD7D9, - 0x8E2B: 0xDB73, - 0x8E2C: 0xF5D9, - 0x8E2D: 0xDB74, - 0x8E2E: 0xF5DA, - 0x8E2F: 0xF5DC, - 0x8E30: 0xDB75, - 0x8E31: 0xF5E2, - 0x8E32: 0xDB76, - 0x8E33: 0xDB77, - 0x8E34: 0xDB78, - 0x8E35: 0xF5E0, - 0x8E36: 0xDB79, - 0x8E37: 0xDB7A, - 0x8E38: 0xDB7B, - 0x8E39: 0xF5DF, - 0x8E3A: 0xF5DD, - 0x8E3B: 0xDB7C, - 0x8E3C: 0xDB7D, - 0x8E3D: 0xF5E1, - 0x8E3E: 0xDB7E, - 0x8E3F: 0xDB80, - 0x8E40: 0xF5DE, - 0x8E41: 0xF5E4, - 0x8E42: 0xF5E5, - 0x8E43: 0xDB81, - 0x8E44: 0xCCE3, - 0x8E45: 0xDB82, - 0x8E46: 0xDB83, - 0x8E47: 0xE5BF, - 0x8E48: 0xB5B8, - 0x8E49: 0xF5E3, - 0x8E4A: 0xF5E8, - 0x8E4B: 0xCCA3, - 0x8E4C: 0xDB84, - 0x8E4D: 0xDB85, - 0x8E4E: 0xDB86, - 0x8E4F: 0xDB87, - 0x8E50: 0xDB88, - 0x8E51: 0xF5E6, - 0x8E52: 0xF5E7, - 0x8E53: 0xDB89, - 0x8E54: 0xDB8A, - 0x8E55: 0xDB8B, - 0x8E56: 0xDB8C, - 0x8E57: 0xDB8D, - 0x8E58: 0xDB8E, - 0x8E59: 0xF5BE, - 0x8E5A: 0xDB8F, - 0x8E5B: 0xDB90, - 0x8E5C: 0xDB91, - 0x8E5D: 0xDB92, - 0x8E5E: 0xDB93, - 0x8E5F: 0xDB94, - 0x8E60: 0xDB95, - 0x8E61: 0xDB96, - 0x8E62: 0xDB97, - 0x8E63: 0xDB98, - 0x8E64: 0xDB99, - 0x8E65: 0xDB9A, - 0x8E66: 0xB1C4, - 0x8E67: 0xDB9B, - 0x8E68: 0xDB9C, - 0x8E69: 0xF5BF, - 0x8E6A: 0xDB9D, - 0x8E6B: 0xDB9E, - 0x8E6C: 0xB5C5, - 0x8E6D: 0xB2E4, - 0x8E6E: 0xDB9F, - 0x8E6F: 0xF5EC, - 0x8E70: 0xF5E9, - 0x8E71: 0xDBA0, - 0x8E72: 0xB6D7, - 0x8E73: 0xDC40, - 0x8E74: 0xF5ED, - 0x8E75: 0xDC41, - 0x8E76: 0xF5EA, - 0x8E77: 0xDC42, - 0x8E78: 0xDC43, - 0x8E79: 0xDC44, - 0x8E7A: 0xDC45, - 0x8E7B: 0xDC46, - 0x8E7C: 0xF5EB, - 0x8E7D: 0xDC47, - 0x8E7E: 0xDC48, - 0x8E7F: 0xB4DA, - 0x8E80: 0xDC49, - 0x8E81: 0xD4EA, - 0x8E82: 0xDC4A, - 0x8E83: 0xDC4B, - 0x8E84: 0xDC4C, - 0x8E85: 0xF5EE, - 0x8E86: 0xDC4D, - 0x8E87: 0xB3F9, - 0x8E88: 0xDC4E, - 0x8E89: 0xDC4F, - 0x8E8A: 0xDC50, - 0x8E8B: 0xDC51, - 0x8E8C: 0xDC52, - 0x8E8D: 0xDC53, - 0x8E8E: 0xDC54, - 0x8E8F: 0xF5EF, - 0x8E90: 0xF5F1, - 0x8E91: 0xDC55, - 0x8E92: 0xDC56, - 0x8E93: 0xDC57, - 0x8E94: 0xF5F0, - 0x8E95: 0xDC58, - 0x8E96: 0xDC59, - 0x8E97: 0xDC5A, - 0x8E98: 0xDC5B, - 0x8E99: 0xDC5C, - 0x8E9A: 0xDC5D, - 0x8E9B: 0xDC5E, - 0x8E9C: 0xF5F2, - 0x8E9D: 0xDC5F, - 0x8E9E: 0xF5F3, - 0x8E9F: 0xDC60, - 0x8EA0: 0xDC61, - 0x8EA1: 0xDC62, - 0x8EA2: 0xDC63, - 0x8EA3: 0xDC64, - 0x8EA4: 0xDC65, - 0x8EA5: 0xDC66, - 0x8EA6: 0xDC67, - 0x8EA7: 0xDC68, - 0x8EA8: 0xDC69, - 0x8EA9: 0xDC6A, - 0x8EAA: 0xDC6B, - 0x8EAB: 0xC9ED, - 0x8EAC: 0xB9AA, - 0x8EAD: 0xDC6C, - 0x8EAE: 0xDC6D, - 0x8EAF: 0xC7FB, - 0x8EB0: 0xDC6E, - 0x8EB1: 0xDC6F, - 0x8EB2: 0xB6E3, - 0x8EB3: 0xDC70, - 0x8EB4: 0xDC71, - 0x8EB5: 0xDC72, - 0x8EB6: 0xDC73, - 0x8EB7: 0xDC74, - 0x8EB8: 0xDC75, - 0x8EB9: 0xDC76, - 0x8EBA: 0xCCC9, - 0x8EBB: 0xDC77, - 0x8EBC: 0xDC78, - 0x8EBD: 0xDC79, - 0x8EBE: 0xDC7A, - 0x8EBF: 0xDC7B, - 0x8EC0: 0xDC7C, - 0x8EC1: 0xDC7D, - 0x8EC2: 0xDC7E, - 0x8EC3: 0xDC80, - 0x8EC4: 0xDC81, - 0x8EC5: 0xDC82, - 0x8EC6: 0xDC83, - 0x8EC7: 0xDC84, - 0x8EC8: 0xDC85, - 0x8EC9: 0xDC86, - 0x8ECA: 0xDC87, - 0x8ECB: 0xDC88, - 0x8ECC: 0xDC89, - 0x8ECD: 0xDC8A, - 0x8ECE: 0xEAA6, - 0x8ECF: 0xDC8B, - 0x8ED0: 0xDC8C, - 0x8ED1: 0xDC8D, - 0x8ED2: 0xDC8E, - 0x8ED3: 0xDC8F, - 0x8ED4: 0xDC90, - 0x8ED5: 0xDC91, - 0x8ED6: 0xDC92, - 0x8ED7: 0xDC93, - 0x8ED8: 0xDC94, - 0x8ED9: 0xDC95, - 0x8EDA: 0xDC96, - 0x8EDB: 0xDC97, - 0x8EDC: 0xDC98, - 0x8EDD: 0xDC99, - 0x8EDE: 0xDC9A, - 0x8EDF: 0xDC9B, - 0x8EE0: 0xDC9C, - 0x8EE1: 0xDC9D, - 0x8EE2: 0xDC9E, - 0x8EE3: 0xDC9F, - 0x8EE4: 0xDCA0, - 0x8EE5: 0xDD40, - 0x8EE6: 0xDD41, - 0x8EE7: 0xDD42, - 0x8EE8: 0xDD43, - 0x8EE9: 0xDD44, - 0x8EEA: 0xDD45, - 0x8EEB: 0xDD46, - 0x8EEC: 0xDD47, - 0x8EED: 0xDD48, - 0x8EEE: 0xDD49, - 0x8EEF: 0xDD4A, - 0x8EF0: 0xDD4B, - 0x8EF1: 0xDD4C, - 0x8EF2: 0xDD4D, - 0x8EF3: 0xDD4E, - 0x8EF4: 0xDD4F, - 0x8EF5: 0xDD50, - 0x8EF6: 0xDD51, - 0x8EF7: 0xDD52, - 0x8EF8: 0xDD53, - 0x8EF9: 0xDD54, - 0x8EFA: 0xDD55, - 0x8EFB: 0xDD56, - 0x8EFC: 0xDD57, - 0x8EFD: 0xDD58, - 0x8EFE: 0xDD59, - 0x8EFF: 0xDD5A, - 0x8F00: 0xDD5B, - 0x8F01: 0xDD5C, - 0x8F02: 0xDD5D, - 0x8F03: 0xDD5E, - 0x8F04: 0xDD5F, - 0x8F05: 0xDD60, - 0x8F06: 0xDD61, - 0x8F07: 0xDD62, - 0x8F08: 0xDD63, - 0x8F09: 0xDD64, - 0x8F0A: 0xDD65, - 0x8F0B: 0xDD66, - 0x8F0C: 0xDD67, - 0x8F0D: 0xDD68, - 0x8F0E: 0xDD69, - 0x8F0F: 0xDD6A, - 0x8F10: 0xDD6B, - 0x8F11: 0xDD6C, - 0x8F12: 0xDD6D, - 0x8F13: 0xDD6E, - 0x8F14: 0xDD6F, - 0x8F15: 0xDD70, - 0x8F16: 0xDD71, - 0x8F17: 0xDD72, - 0x8F18: 0xDD73, - 0x8F19: 0xDD74, - 0x8F1A: 0xDD75, - 0x8F1B: 0xDD76, - 0x8F1C: 0xDD77, - 0x8F1D: 0xDD78, - 0x8F1E: 0xDD79, - 0x8F1F: 0xDD7A, - 0x8F20: 0xDD7B, - 0x8F21: 0xDD7C, - 0x8F22: 0xDD7D, - 0x8F23: 0xDD7E, - 0x8F24: 0xDD80, - 0x8F25: 0xDD81, - 0x8F26: 0xDD82, - 0x8F27: 0xDD83, - 0x8F28: 0xDD84, - 0x8F29: 0xDD85, - 0x8F2A: 0xDD86, - 0x8F2B: 0xDD87, - 0x8F2C: 0xDD88, - 0x8F2D: 0xDD89, - 0x8F2E: 0xDD8A, - 0x8F2F: 0xDD8B, - 0x8F30: 0xDD8C, - 0x8F31: 0xDD8D, - 0x8F32: 0xDD8E, - 0x8F33: 0xDD8F, - 0x8F34: 0xDD90, - 0x8F35: 0xDD91, - 0x8F36: 0xDD92, - 0x8F37: 0xDD93, - 0x8F38: 0xDD94, - 0x8F39: 0xDD95, - 0x8F3A: 0xDD96, - 0x8F3B: 0xDD97, - 0x8F3C: 0xDD98, - 0x8F3D: 0xDD99, - 0x8F3E: 0xDD9A, - 0x8F3F: 0xDD9B, - 0x8F40: 0xDD9C, - 0x8F41: 0xDD9D, - 0x8F42: 0xDD9E, - 0x8F43: 0xDD9F, - 0x8F44: 0xDDA0, - 0x8F45: 0xDE40, - 0x8F46: 0xDE41, - 0x8F47: 0xDE42, - 0x8F48: 0xDE43, - 0x8F49: 0xDE44, - 0x8F4A: 0xDE45, - 0x8F4B: 0xDE46, - 0x8F4C: 0xDE47, - 0x8F4D: 0xDE48, - 0x8F4E: 0xDE49, - 0x8F4F: 0xDE4A, - 0x8F50: 0xDE4B, - 0x8F51: 0xDE4C, - 0x8F52: 0xDE4D, - 0x8F53: 0xDE4E, - 0x8F54: 0xDE4F, - 0x8F55: 0xDE50, - 0x8F56: 0xDE51, - 0x8F57: 0xDE52, - 0x8F58: 0xDE53, - 0x8F59: 0xDE54, - 0x8F5A: 0xDE55, - 0x8F5B: 0xDE56, - 0x8F5C: 0xDE57, - 0x8F5D: 0xDE58, - 0x8F5E: 0xDE59, - 0x8F5F: 0xDE5A, - 0x8F60: 0xDE5B, - 0x8F61: 0xDE5C, - 0x8F62: 0xDE5D, - 0x8F63: 0xDE5E, - 0x8F64: 0xDE5F, - 0x8F65: 0xDE60, - 0x8F66: 0xB3B5, - 0x8F67: 0xD4FE, - 0x8F68: 0xB9EC, - 0x8F69: 0xD0F9, - 0x8F6A: 0xDE61, - 0x8F6B: 0xE9ED, - 0x8F6C: 0xD7AA, - 0x8F6D: 0xE9EE, - 0x8F6E: 0xC2D6, - 0x8F6F: 0xC8ED, - 0x8F70: 0xBAE4, - 0x8F71: 0xE9EF, - 0x8F72: 0xE9F0, - 0x8F73: 0xE9F1, - 0x8F74: 0xD6E1, - 0x8F75: 0xE9F2, - 0x8F76: 0xE9F3, - 0x8F77: 0xE9F5, - 0x8F78: 0xE9F4, - 0x8F79: 0xE9F6, - 0x8F7A: 0xE9F7, - 0x8F7B: 0xC7E1, - 0x8F7C: 0xE9F8, - 0x8F7D: 0xD4D8, - 0x8F7E: 0xE9F9, - 0x8F7F: 0xBDCE, - 0x8F80: 0xDE62, - 0x8F81: 0xE9FA, - 0x8F82: 0xE9FB, - 0x8F83: 0xBDCF, - 0x8F84: 0xE9FC, - 0x8F85: 0xB8A8, - 0x8F86: 0xC1BE, - 0x8F87: 0xE9FD, - 0x8F88: 0xB1B2, - 0x8F89: 0xBBD4, - 0x8F8A: 0xB9F5, - 0x8F8B: 0xE9FE, - 0x8F8C: 0xDE63, - 0x8F8D: 0xEAA1, - 0x8F8E: 0xEAA2, - 0x8F8F: 0xEAA3, - 0x8F90: 0xB7F8, - 0x8F91: 0xBCAD, - 0x8F92: 0xDE64, - 0x8F93: 0xCAE4, - 0x8F94: 0xE0CE, - 0x8F95: 0xD4AF, - 0x8F96: 0xCFBD, - 0x8F97: 0xD5B7, - 0x8F98: 0xEAA4, - 0x8F99: 0xD5DE, - 0x8F9A: 0xEAA5, - 0x8F9B: 0xD0C1, - 0x8F9C: 0xB9BC, - 0x8F9D: 0xDE65, - 0x8F9E: 0xB4C7, - 0x8F9F: 0xB1D9, - 0x8FA0: 0xDE66, - 0x8FA1: 0xDE67, - 0x8FA2: 0xDE68, - 0x8FA3: 0xC0B1, - 0x8FA4: 0xDE69, - 0x8FA5: 0xDE6A, - 0x8FA6: 0xDE6B, - 0x8FA7: 0xDE6C, - 0x8FA8: 0xB1E6, - 0x8FA9: 0xB1E7, - 0x8FAA: 0xDE6D, - 0x8FAB: 0xB1E8, - 0x8FAC: 0xDE6E, - 0x8FAD: 0xDE6F, - 0x8FAE: 0xDE70, - 0x8FAF: 0xDE71, - 0x8FB0: 0xB3BD, - 0x8FB1: 0xC8E8, - 0x8FB2: 0xDE72, - 0x8FB3: 0xDE73, - 0x8FB4: 0xDE74, - 0x8FB5: 0xDE75, - 0x8FB6: 0xE5C1, - 0x8FB7: 0xDE76, - 0x8FB8: 0xDE77, - 0x8FB9: 0xB1DF, - 0x8FBA: 0xDE78, - 0x8FBB: 0xDE79, - 0x8FBC: 0xDE7A, - 0x8FBD: 0xC1C9, - 0x8FBE: 0xB4EF, - 0x8FBF: 0xDE7B, - 0x8FC0: 0xDE7C, - 0x8FC1: 0xC7A8, - 0x8FC2: 0xD3D8, - 0x8FC3: 0xDE7D, - 0x8FC4: 0xC6F9, - 0x8FC5: 0xD1B8, - 0x8FC6: 0xDE7E, - 0x8FC7: 0xB9FD, - 0x8FC8: 0xC2F5, - 0x8FC9: 0xDE80, - 0x8FCA: 0xDE81, - 0x8FCB: 0xDE82, - 0x8FCC: 0xDE83, - 0x8FCD: 0xDE84, - 0x8FCE: 0xD3AD, - 0x8FCF: 0xDE85, - 0x8FD0: 0xD4CB, - 0x8FD1: 0xBDFC, - 0x8FD2: 0xDE86, - 0x8FD3: 0xE5C2, - 0x8FD4: 0xB7B5, - 0x8FD5: 0xE5C3, - 0x8FD6: 0xDE87, - 0x8FD7: 0xDE88, - 0x8FD8: 0xBBB9, - 0x8FD9: 0xD5E2, - 0x8FDA: 0xDE89, - 0x8FDB: 0xBDF8, - 0x8FDC: 0xD4B6, - 0x8FDD: 0xCEA5, - 0x8FDE: 0xC1AC, - 0x8FDF: 0xB3D9, - 0x8FE0: 0xDE8A, - 0x8FE1: 0xDE8B, - 0x8FE2: 0xCCF6, - 0x8FE3: 0xDE8C, - 0x8FE4: 0xE5C6, - 0x8FE5: 0xE5C4, - 0x8FE6: 0xE5C8, - 0x8FE7: 0xDE8D, - 0x8FE8: 0xE5CA, - 0x8FE9: 0xE5C7, - 0x8FEA: 0xB5CF, - 0x8FEB: 0xC6C8, - 0x8FEC: 0xDE8E, - 0x8FED: 0xB5FC, - 0x8FEE: 0xE5C5, - 0x8FEF: 0xDE8F, - 0x8FF0: 0xCAF6, - 0x8FF1: 0xDE90, - 0x8FF2: 0xDE91, - 0x8FF3: 0xE5C9, - 0x8FF4: 0xDE92, - 0x8FF5: 0xDE93, - 0x8FF6: 0xDE94, - 0x8FF7: 0xC3D4, - 0x8FF8: 0xB1C5, - 0x8FF9: 0xBCA3, - 0x8FFA: 0xDE95, - 0x8FFB: 0xDE96, - 0x8FFC: 0xDE97, - 0x8FFD: 0xD7B7, - 0x8FFE: 0xDE98, - 0x8FFF: 0xDE99, - 0x9000: 0xCDCB, - 0x9001: 0xCBCD, - 0x9002: 0xCACA, - 0x9003: 0xCCD3, - 0x9004: 0xE5CC, - 0x9005: 0xE5CB, - 0x9006: 0xC4E6, - 0x9007: 0xDE9A, - 0x9008: 0xDE9B, - 0x9009: 0xD1A1, - 0x900A: 0xD1B7, - 0x900B: 0xE5CD, - 0x900C: 0xDE9C, - 0x900D: 0xE5D0, - 0x900E: 0xDE9D, - 0x900F: 0xCDB8, - 0x9010: 0xD6F0, - 0x9011: 0xE5CF, - 0x9012: 0xB5DD, - 0x9013: 0xDE9E, - 0x9014: 0xCDBE, - 0x9015: 0xDE9F, - 0x9016: 0xE5D1, - 0x9017: 0xB6BA, - 0x9018: 0xDEA0, - 0x9019: 0xDF40, - 0x901A: 0xCDA8, - 0x901B: 0xB9E4, - 0x901C: 0xDF41, - 0x901D: 0xCAC5, - 0x901E: 0xB3D1, - 0x901F: 0xCBD9, - 0x9020: 0xD4EC, - 0x9021: 0xE5D2, - 0x9022: 0xB7EA, - 0x9023: 0xDF42, - 0x9024: 0xDF43, - 0x9025: 0xDF44, - 0x9026: 0xE5CE, - 0x9027: 0xDF45, - 0x9028: 0xDF46, - 0x9029: 0xDF47, - 0x902A: 0xDF48, - 0x902B: 0xDF49, - 0x902C: 0xDF4A, - 0x902D: 0xE5D5, - 0x902E: 0xB4FE, - 0x902F: 0xE5D6, - 0x9030: 0xDF4B, - 0x9031: 0xDF4C, - 0x9032: 0xDF4D, - 0x9033: 0xDF4E, - 0x9034: 0xDF4F, - 0x9035: 0xE5D3, - 0x9036: 0xE5D4, - 0x9037: 0xDF50, - 0x9038: 0xD2DD, - 0x9039: 0xDF51, - 0x903A: 0xDF52, - 0x903B: 0xC2DF, - 0x903C: 0xB1C6, - 0x903D: 0xDF53, - 0x903E: 0xD3E2, - 0x903F: 0xDF54, - 0x9040: 0xDF55, - 0x9041: 0xB6DD, - 0x9042: 0xCBEC, - 0x9043: 0xDF56, - 0x9044: 0xE5D7, - 0x9045: 0xDF57, - 0x9046: 0xDF58, - 0x9047: 0xD3F6, - 0x9048: 0xDF59, - 0x9049: 0xDF5A, - 0x904A: 0xDF5B, - 0x904B: 0xDF5C, - 0x904C: 0xDF5D, - 0x904D: 0xB1E9, - 0x904E: 0xDF5E, - 0x904F: 0xB6F4, - 0x9050: 0xE5DA, - 0x9051: 0xE5D8, - 0x9052: 0xE5D9, - 0x9053: 0xB5C0, - 0x9054: 0xDF5F, - 0x9055: 0xDF60, - 0x9056: 0xDF61, - 0x9057: 0xD2C5, - 0x9058: 0xE5DC, - 0x9059: 0xDF62, - 0x905A: 0xDF63, - 0x905B: 0xE5DE, - 0x905C: 0xDF64, - 0x905D: 0xDF65, - 0x905E: 0xDF66, - 0x905F: 0xDF67, - 0x9060: 0xDF68, - 0x9061: 0xDF69, - 0x9062: 0xE5DD, - 0x9063: 0xC7B2, - 0x9064: 0xDF6A, - 0x9065: 0xD2A3, - 0x9066: 0xDF6B, - 0x9067: 0xDF6C, - 0x9068: 0xE5DB, - 0x9069: 0xDF6D, - 0x906A: 0xDF6E, - 0x906B: 0xDF6F, - 0x906C: 0xDF70, - 0x906D: 0xD4E2, - 0x906E: 0xD5DA, - 0x906F: 0xDF71, - 0x9070: 0xDF72, - 0x9071: 0xDF73, - 0x9072: 0xDF74, - 0x9073: 0xDF75, - 0x9074: 0xE5E0, - 0x9075: 0xD7F1, - 0x9076: 0xDF76, - 0x9077: 0xDF77, - 0x9078: 0xDF78, - 0x9079: 0xDF79, - 0x907A: 0xDF7A, - 0x907B: 0xDF7B, - 0x907C: 0xDF7C, - 0x907D: 0xE5E1, - 0x907E: 0xDF7D, - 0x907F: 0xB1DC, - 0x9080: 0xD1FB, - 0x9081: 0xDF7E, - 0x9082: 0xE5E2, - 0x9083: 0xE5E4, - 0x9084: 0xDF80, - 0x9085: 0xDF81, - 0x9086: 0xDF82, - 0x9087: 0xDF83, - 0x9088: 0xE5E3, - 0x9089: 0xDF84, - 0x908A: 0xDF85, - 0x908B: 0xE5E5, - 0x908C: 0xDF86, - 0x908D: 0xDF87, - 0x908E: 0xDF88, - 0x908F: 0xDF89, - 0x9090: 0xDF8A, - 0x9091: 0xD2D8, - 0x9092: 0xDF8B, - 0x9093: 0xB5CB, - 0x9094: 0xDF8C, - 0x9095: 0xE7DF, - 0x9096: 0xDF8D, - 0x9097: 0xDAF5, - 0x9098: 0xDF8E, - 0x9099: 0xDAF8, - 0x909A: 0xDF8F, - 0x909B: 0xDAF6, - 0x909C: 0xDF90, - 0x909D: 0xDAF7, - 0x909E: 0xDF91, - 0x909F: 0xDF92, - 0x90A0: 0xDF93, - 0x90A1: 0xDAFA, - 0x90A2: 0xD0CF, - 0x90A3: 0xC4C7, - 0x90A4: 0xDF94, - 0x90A5: 0xDF95, - 0x90A6: 0xB0EE, - 0x90A7: 0xDF96, - 0x90A8: 0xDF97, - 0x90A9: 0xDF98, - 0x90AA: 0xD0B0, - 0x90AB: 0xDF99, - 0x90AC: 0xDAF9, - 0x90AD: 0xDF9A, - 0x90AE: 0xD3CA, - 0x90AF: 0xBAAA, - 0x90B0: 0xDBA2, - 0x90B1: 0xC7F1, - 0x90B2: 0xDF9B, - 0x90B3: 0xDAFC, - 0x90B4: 0xDAFB, - 0x90B5: 0xC9DB, - 0x90B6: 0xDAFD, - 0x90B7: 0xDF9C, - 0x90B8: 0xDBA1, - 0x90B9: 0xD7DE, - 0x90BA: 0xDAFE, - 0x90BB: 0xC1DA, - 0x90BC: 0xDF9D, - 0x90BD: 0xDF9E, - 0x90BE: 0xDBA5, - 0x90BF: 0xDF9F, - 0x90C0: 0xDFA0, - 0x90C1: 0xD3F4, - 0x90C2: 0xE040, - 0x90C3: 0xE041, - 0x90C4: 0xDBA7, - 0x90C5: 0xDBA4, - 0x90C6: 0xE042, - 0x90C7: 0xDBA8, - 0x90C8: 0xE043, - 0x90C9: 0xE044, - 0x90CA: 0xBDBC, - 0x90CB: 0xE045, - 0x90CC: 0xE046, - 0x90CD: 0xE047, - 0x90CE: 0xC0C9, - 0x90CF: 0xDBA3, - 0x90D0: 0xDBA6, - 0x90D1: 0xD6A3, - 0x90D2: 0xE048, - 0x90D3: 0xDBA9, - 0x90D4: 0xE049, - 0x90D5: 0xE04A, - 0x90D6: 0xE04B, - 0x90D7: 0xDBAD, - 0x90D8: 0xE04C, - 0x90D9: 0xE04D, - 0x90DA: 0xE04E, - 0x90DB: 0xDBAE, - 0x90DC: 0xDBAC, - 0x90DD: 0xBAC2, - 0x90DE: 0xE04F, - 0x90DF: 0xE050, - 0x90E0: 0xE051, - 0x90E1: 0xBFA4, - 0x90E2: 0xDBAB, - 0x90E3: 0xE052, - 0x90E4: 0xE053, - 0x90E5: 0xE054, - 0x90E6: 0xDBAA, - 0x90E7: 0xD4C7, - 0x90E8: 0xB2BF, - 0x90E9: 0xE055, - 0x90EA: 0xE056, - 0x90EB: 0xDBAF, - 0x90EC: 0xE057, - 0x90ED: 0xB9F9, - 0x90EE: 0xE058, - 0x90EF: 0xDBB0, - 0x90F0: 0xE059, - 0x90F1: 0xE05A, - 0x90F2: 0xE05B, - 0x90F3: 0xE05C, - 0x90F4: 0xB3BB, - 0x90F5: 0xE05D, - 0x90F6: 0xE05E, - 0x90F7: 0xE05F, - 0x90F8: 0xB5A6, - 0x90F9: 0xE060, - 0x90FA: 0xE061, - 0x90FB: 0xE062, - 0x90FC: 0xE063, - 0x90FD: 0xB6BC, - 0x90FE: 0xDBB1, - 0x90FF: 0xE064, - 0x9100: 0xE065, - 0x9101: 0xE066, - 0x9102: 0xB6F5, - 0x9103: 0xE067, - 0x9104: 0xDBB2, - 0x9105: 0xE068, - 0x9106: 0xE069, - 0x9107: 0xE06A, - 0x9108: 0xE06B, - 0x9109: 0xE06C, - 0x910A: 0xE06D, - 0x910B: 0xE06E, - 0x910C: 0xE06F, - 0x910D: 0xE070, - 0x910E: 0xE071, - 0x910F: 0xE072, - 0x9110: 0xE073, - 0x9111: 0xE074, - 0x9112: 0xE075, - 0x9113: 0xE076, - 0x9114: 0xE077, - 0x9115: 0xE078, - 0x9116: 0xE079, - 0x9117: 0xE07A, - 0x9118: 0xE07B, - 0x9119: 0xB1C9, - 0x911A: 0xE07C, - 0x911B: 0xE07D, - 0x911C: 0xE07E, - 0x911D: 0xE080, - 0x911E: 0xDBB4, - 0x911F: 0xE081, - 0x9120: 0xE082, - 0x9121: 0xE083, - 0x9122: 0xDBB3, - 0x9123: 0xDBB5, - 0x9124: 0xE084, - 0x9125: 0xE085, - 0x9126: 0xE086, - 0x9127: 0xE087, - 0x9128: 0xE088, - 0x9129: 0xE089, - 0x912A: 0xE08A, - 0x912B: 0xE08B, - 0x912C: 0xE08C, - 0x912D: 0xE08D, - 0x912E: 0xE08E, - 0x912F: 0xDBB7, - 0x9130: 0xE08F, - 0x9131: 0xDBB6, - 0x9132: 0xE090, - 0x9133: 0xE091, - 0x9134: 0xE092, - 0x9135: 0xE093, - 0x9136: 0xE094, - 0x9137: 0xE095, - 0x9138: 0xE096, - 0x9139: 0xDBB8, - 0x913A: 0xE097, - 0x913B: 0xE098, - 0x913C: 0xE099, - 0x913D: 0xE09A, - 0x913E: 0xE09B, - 0x913F: 0xE09C, - 0x9140: 0xE09D, - 0x9141: 0xE09E, - 0x9142: 0xE09F, - 0x9143: 0xDBB9, - 0x9144: 0xE0A0, - 0x9145: 0xE140, - 0x9146: 0xDBBA, - 0x9147: 0xE141, - 0x9148: 0xE142, - 0x9149: 0xD3CF, - 0x914A: 0xF4FA, - 0x914B: 0xC7F5, - 0x914C: 0xD7C3, - 0x914D: 0xC5E4, - 0x914E: 0xF4FC, - 0x914F: 0xF4FD, - 0x9150: 0xF4FB, - 0x9151: 0xE143, - 0x9152: 0xBEC6, - 0x9153: 0xE144, - 0x9154: 0xE145, - 0x9155: 0xE146, - 0x9156: 0xE147, - 0x9157: 0xD0EF, - 0x9158: 0xE148, - 0x9159: 0xE149, - 0x915A: 0xB7D3, - 0x915B: 0xE14A, - 0x915C: 0xE14B, - 0x915D: 0xD4CD, - 0x915E: 0xCCAA, - 0x915F: 0xE14C, - 0x9160: 0xE14D, - 0x9161: 0xF5A2, - 0x9162: 0xF5A1, - 0x9163: 0xBAA8, - 0x9164: 0xF4FE, - 0x9165: 0xCBD6, - 0x9166: 0xE14E, - 0x9167: 0xE14F, - 0x9168: 0xE150, - 0x9169: 0xF5A4, - 0x916A: 0xC0D2, - 0x916B: 0xE151, - 0x916C: 0xB3EA, - 0x916D: 0xE152, - 0x916E: 0xCDAA, - 0x916F: 0xF5A5, - 0x9170: 0xF5A3, - 0x9171: 0xBDB4, - 0x9172: 0xF5A8, - 0x9173: 0xE153, - 0x9174: 0xF5A9, - 0x9175: 0xBDCD, - 0x9176: 0xC3B8, - 0x9177: 0xBFE1, - 0x9178: 0xCBE1, - 0x9179: 0xF5AA, - 0x917A: 0xE154, - 0x917B: 0xE155, - 0x917C: 0xE156, - 0x917D: 0xF5A6, - 0x917E: 0xF5A7, - 0x917F: 0xC4F0, - 0x9180: 0xE157, - 0x9181: 0xE158, - 0x9182: 0xE159, - 0x9183: 0xE15A, - 0x9184: 0xE15B, - 0x9185: 0xF5AC, - 0x9186: 0xE15C, - 0x9187: 0xB4BC, - 0x9188: 0xE15D, - 0x9189: 0xD7ED, - 0x918A: 0xE15E, - 0x918B: 0xB4D7, - 0x918C: 0xF5AB, - 0x918D: 0xF5AE, - 0x918E: 0xE15F, - 0x918F: 0xE160, - 0x9190: 0xF5AD, - 0x9191: 0xF5AF, - 0x9192: 0xD0D1, - 0x9193: 0xE161, - 0x9194: 0xE162, - 0x9195: 0xE163, - 0x9196: 0xE164, - 0x9197: 0xE165, - 0x9198: 0xE166, - 0x9199: 0xE167, - 0x919A: 0xC3D1, - 0x919B: 0xC8A9, - 0x919C: 0xE168, - 0x919D: 0xE169, - 0x919E: 0xE16A, - 0x919F: 0xE16B, - 0x91A0: 0xE16C, - 0x91A1: 0xE16D, - 0x91A2: 0xF5B0, - 0x91A3: 0xF5B1, - 0x91A4: 0xE16E, - 0x91A5: 0xE16F, - 0x91A6: 0xE170, - 0x91A7: 0xE171, - 0x91A8: 0xE172, - 0x91A9: 0xE173, - 0x91AA: 0xF5B2, - 0x91AB: 0xE174, - 0x91AC: 0xE175, - 0x91AD: 0xF5B3, - 0x91AE: 0xF5B4, - 0x91AF: 0xF5B5, - 0x91B0: 0xE176, - 0x91B1: 0xE177, - 0x91B2: 0xE178, - 0x91B3: 0xE179, - 0x91B4: 0xF5B7, - 0x91B5: 0xF5B6, - 0x91B6: 0xE17A, - 0x91B7: 0xE17B, - 0x91B8: 0xE17C, - 0x91B9: 0xE17D, - 0x91BA: 0xF5B8, - 0x91BB: 0xE17E, - 0x91BC: 0xE180, - 0x91BD: 0xE181, - 0x91BE: 0xE182, - 0x91BF: 0xE183, - 0x91C0: 0xE184, - 0x91C1: 0xE185, - 0x91C2: 0xE186, - 0x91C3: 0xE187, - 0x91C4: 0xE188, - 0x91C5: 0xE189, - 0x91C6: 0xE18A, - 0x91C7: 0xB2C9, - 0x91C8: 0xE18B, - 0x91C9: 0xD3D4, - 0x91CA: 0xCACD, - 0x91CB: 0xE18C, - 0x91CC: 0xC0EF, - 0x91CD: 0xD6D8, - 0x91CE: 0xD2B0, - 0x91CF: 0xC1BF, - 0x91D0: 0xE18D, - 0x91D1: 0xBDF0, - 0x91D2: 0xE18E, - 0x91D3: 0xE18F, - 0x91D4: 0xE190, - 0x91D5: 0xE191, - 0x91D6: 0xE192, - 0x91D7: 0xE193, - 0x91D8: 0xE194, - 0x91D9: 0xE195, - 0x91DA: 0xE196, - 0x91DB: 0xE197, - 0x91DC: 0xB8AA, - 0x91DD: 0xE198, - 0x91DE: 0xE199, - 0x91DF: 0xE19A, - 0x91E0: 0xE19B, - 0x91E1: 0xE19C, - 0x91E2: 0xE19D, - 0x91E3: 0xE19E, - 0x91E4: 0xE19F, - 0x91E5: 0xE1A0, - 0x91E6: 0xE240, - 0x91E7: 0xE241, - 0x91E8: 0xE242, - 0x91E9: 0xE243, - 0x91EA: 0xE244, - 0x91EB: 0xE245, - 0x91EC: 0xE246, - 0x91ED: 0xE247, - 0x91EE: 0xE248, - 0x91EF: 0xE249, - 0x91F0: 0xE24A, - 0x91F1: 0xE24B, - 0x91F2: 0xE24C, - 0x91F3: 0xE24D, - 0x91F4: 0xE24E, - 0x91F5: 0xE24F, - 0x91F6: 0xE250, - 0x91F7: 0xE251, - 0x91F8: 0xE252, - 0x91F9: 0xE253, - 0x91FA: 0xE254, - 0x91FB: 0xE255, - 0x91FC: 0xE256, - 0x91FD: 0xE257, - 0x91FE: 0xE258, - 0x91FF: 0xE259, - 0x9200: 0xE25A, - 0x9201: 0xE25B, - 0x9202: 0xE25C, - 0x9203: 0xE25D, - 0x9204: 0xE25E, - 0x9205: 0xE25F, - 0x9206: 0xE260, - 0x9207: 0xE261, - 0x9208: 0xE262, - 0x9209: 0xE263, - 0x920A: 0xE264, - 0x920B: 0xE265, - 0x920C: 0xE266, - 0x920D: 0xE267, - 0x920E: 0xE268, - 0x920F: 0xE269, - 0x9210: 0xE26A, - 0x9211: 0xE26B, - 0x9212: 0xE26C, - 0x9213: 0xE26D, - 0x9214: 0xE26E, - 0x9215: 0xE26F, - 0x9216: 0xE270, - 0x9217: 0xE271, - 0x9218: 0xE272, - 0x9219: 0xE273, - 0x921A: 0xE274, - 0x921B: 0xE275, - 0x921C: 0xE276, - 0x921D: 0xE277, - 0x921E: 0xE278, - 0x921F: 0xE279, - 0x9220: 0xE27A, - 0x9221: 0xE27B, - 0x9222: 0xE27C, - 0x9223: 0xE27D, - 0x9224: 0xE27E, - 0x9225: 0xE280, - 0x9226: 0xE281, - 0x9227: 0xE282, - 0x9228: 0xE283, - 0x9229: 0xE284, - 0x922A: 0xE285, - 0x922B: 0xE286, - 0x922C: 0xE287, - 0x922D: 0xE288, - 0x922E: 0xE289, - 0x922F: 0xE28A, - 0x9230: 0xE28B, - 0x9231: 0xE28C, - 0x9232: 0xE28D, - 0x9233: 0xE28E, - 0x9234: 0xE28F, - 0x9235: 0xE290, - 0x9236: 0xE291, - 0x9237: 0xE292, - 0x9238: 0xE293, - 0x9239: 0xE294, - 0x923A: 0xE295, - 0x923B: 0xE296, - 0x923C: 0xE297, - 0x923D: 0xE298, - 0x923E: 0xE299, - 0x923F: 0xE29A, - 0x9240: 0xE29B, - 0x9241: 0xE29C, - 0x9242: 0xE29D, - 0x9243: 0xE29E, - 0x9244: 0xE29F, - 0x9245: 0xE2A0, - 0x9246: 0xE340, - 0x9247: 0xE341, - 0x9248: 0xE342, - 0x9249: 0xE343, - 0x924A: 0xE344, - 0x924B: 0xE345, - 0x924C: 0xE346, - 0x924D: 0xE347, - 0x924E: 0xE348, - 0x924F: 0xE349, - 0x9250: 0xE34A, - 0x9251: 0xE34B, - 0x9252: 0xE34C, - 0x9253: 0xE34D, - 0x9254: 0xE34E, - 0x9255: 0xE34F, - 0x9256: 0xE350, - 0x9257: 0xE351, - 0x9258: 0xE352, - 0x9259: 0xE353, - 0x925A: 0xE354, - 0x925B: 0xE355, - 0x925C: 0xE356, - 0x925D: 0xE357, - 0x925E: 0xE358, - 0x925F: 0xE359, - 0x9260: 0xE35A, - 0x9261: 0xE35B, - 0x9262: 0xE35C, - 0x9263: 0xE35D, - 0x9264: 0xE35E, - 0x9265: 0xE35F, - 0x9266: 0xE360, - 0x9267: 0xE361, - 0x9268: 0xE362, - 0x9269: 0xE363, - 0x926A: 0xE364, - 0x926B: 0xE365, - 0x926C: 0xE366, - 0x926D: 0xE367, - 0x926E: 0xE368, - 0x926F: 0xE369, - 0x9270: 0xE36A, - 0x9271: 0xE36B, - 0x9272: 0xE36C, - 0x9273: 0xE36D, - 0x9274: 0xBCF8, - 0x9275: 0xE36E, - 0x9276: 0xE36F, - 0x9277: 0xE370, - 0x9278: 0xE371, - 0x9279: 0xE372, - 0x927A: 0xE373, - 0x927B: 0xE374, - 0x927C: 0xE375, - 0x927D: 0xE376, - 0x927E: 0xE377, - 0x927F: 0xE378, - 0x9280: 0xE379, - 0x9281: 0xE37A, - 0x9282: 0xE37B, - 0x9283: 0xE37C, - 0x9284: 0xE37D, - 0x9285: 0xE37E, - 0x9286: 0xE380, - 0x9287: 0xE381, - 0x9288: 0xE382, - 0x9289: 0xE383, - 0x928A: 0xE384, - 0x928B: 0xE385, - 0x928C: 0xE386, - 0x928D: 0xE387, - 0x928E: 0xF6C6, - 0x928F: 0xE388, - 0x9290: 0xE389, - 0x9291: 0xE38A, - 0x9292: 0xE38B, - 0x9293: 0xE38C, - 0x9294: 0xE38D, - 0x9295: 0xE38E, - 0x9296: 0xE38F, - 0x9297: 0xE390, - 0x9298: 0xE391, - 0x9299: 0xE392, - 0x929A: 0xE393, - 0x929B: 0xE394, - 0x929C: 0xE395, - 0x929D: 0xE396, - 0x929E: 0xE397, - 0x929F: 0xE398, - 0x92A0: 0xE399, - 0x92A1: 0xE39A, - 0x92A2: 0xE39B, - 0x92A3: 0xE39C, - 0x92A4: 0xE39D, - 0x92A5: 0xE39E, - 0x92A6: 0xE39F, - 0x92A7: 0xE3A0, - 0x92A8: 0xE440, - 0x92A9: 0xE441, - 0x92AA: 0xE442, - 0x92AB: 0xE443, - 0x92AC: 0xE444, - 0x92AD: 0xE445, - 0x92AE: 0xF6C7, - 0x92AF: 0xE446, - 0x92B0: 0xE447, - 0x92B1: 0xE448, - 0x92B2: 0xE449, - 0x92B3: 0xE44A, - 0x92B4: 0xE44B, - 0x92B5: 0xE44C, - 0x92B6: 0xE44D, - 0x92B7: 0xE44E, - 0x92B8: 0xE44F, - 0x92B9: 0xE450, - 0x92BA: 0xE451, - 0x92BB: 0xE452, - 0x92BC: 0xE453, - 0x92BD: 0xE454, - 0x92BE: 0xE455, - 0x92BF: 0xE456, - 0x92C0: 0xE457, - 0x92C1: 0xE458, - 0x92C2: 0xE459, - 0x92C3: 0xE45A, - 0x92C4: 0xE45B, - 0x92C5: 0xE45C, - 0x92C6: 0xE45D, - 0x92C7: 0xE45E, - 0x92C8: 0xF6C8, - 0x92C9: 0xE45F, - 0x92CA: 0xE460, - 0x92CB: 0xE461, - 0x92CC: 0xE462, - 0x92CD: 0xE463, - 0x92CE: 0xE464, - 0x92CF: 0xE465, - 0x92D0: 0xE466, - 0x92D1: 0xE467, - 0x92D2: 0xE468, - 0x92D3: 0xE469, - 0x92D4: 0xE46A, - 0x92D5: 0xE46B, - 0x92D6: 0xE46C, - 0x92D7: 0xE46D, - 0x92D8: 0xE46E, - 0x92D9: 0xE46F, - 0x92DA: 0xE470, - 0x92DB: 0xE471, - 0x92DC: 0xE472, - 0x92DD: 0xE473, - 0x92DE: 0xE474, - 0x92DF: 0xE475, - 0x92E0: 0xE476, - 0x92E1: 0xE477, - 0x92E2: 0xE478, - 0x92E3: 0xE479, - 0x92E4: 0xE47A, - 0x92E5: 0xE47B, - 0x92E6: 0xE47C, - 0x92E7: 0xE47D, - 0x92E8: 0xE47E, - 0x92E9: 0xE480, - 0x92EA: 0xE481, - 0x92EB: 0xE482, - 0x92EC: 0xE483, - 0x92ED: 0xE484, - 0x92EE: 0xE485, - 0x92EF: 0xE486, - 0x92F0: 0xE487, - 0x92F1: 0xE488, - 0x92F2: 0xE489, - 0x92F3: 0xE48A, - 0x92F4: 0xE48B, - 0x92F5: 0xE48C, - 0x92F6: 0xE48D, - 0x92F7: 0xE48E, - 0x92F8: 0xE48F, - 0x92F9: 0xE490, - 0x92FA: 0xE491, - 0x92FB: 0xE492, - 0x92FC: 0xE493, - 0x92FD: 0xE494, - 0x92FE: 0xE495, - 0x92FF: 0xE496, - 0x9300: 0xE497, - 0x9301: 0xE498, - 0x9302: 0xE499, - 0x9303: 0xE49A, - 0x9304: 0xE49B, - 0x9305: 0xE49C, - 0x9306: 0xE49D, - 0x9307: 0xE49E, - 0x9308: 0xE49F, - 0x9309: 0xE4A0, - 0x930A: 0xE540, - 0x930B: 0xE541, - 0x930C: 0xE542, - 0x930D: 0xE543, - 0x930E: 0xE544, - 0x930F: 0xE545, - 0x9310: 0xE546, - 0x9311: 0xE547, - 0x9312: 0xE548, - 0x9313: 0xE549, - 0x9314: 0xE54A, - 0x9315: 0xE54B, - 0x9316: 0xE54C, - 0x9317: 0xE54D, - 0x9318: 0xE54E, - 0x9319: 0xE54F, - 0x931A: 0xE550, - 0x931B: 0xE551, - 0x931C: 0xE552, - 0x931D: 0xE553, - 0x931E: 0xE554, - 0x931F: 0xE555, - 0x9320: 0xE556, - 0x9321: 0xE557, - 0x9322: 0xE558, - 0x9323: 0xE559, - 0x9324: 0xE55A, - 0x9325: 0xE55B, - 0x9326: 0xE55C, - 0x9327: 0xE55D, - 0x9328: 0xE55E, - 0x9329: 0xE55F, - 0x932A: 0xE560, - 0x932B: 0xE561, - 0x932C: 0xE562, - 0x932D: 0xE563, - 0x932E: 0xE564, - 0x932F: 0xE565, - 0x9330: 0xE566, - 0x9331: 0xE567, - 0x9332: 0xE568, - 0x9333: 0xE569, - 0x9334: 0xE56A, - 0x9335: 0xE56B, - 0x9336: 0xE56C, - 0x9337: 0xE56D, - 0x9338: 0xE56E, - 0x9339: 0xE56F, - 0x933A: 0xE570, - 0x933B: 0xE571, - 0x933C: 0xE572, - 0x933D: 0xE573, - 0x933E: 0xF6C9, - 0x933F: 0xE574, - 0x9340: 0xE575, - 0x9341: 0xE576, - 0x9342: 0xE577, - 0x9343: 0xE578, - 0x9344: 0xE579, - 0x9345: 0xE57A, - 0x9346: 0xE57B, - 0x9347: 0xE57C, - 0x9348: 0xE57D, - 0x9349: 0xE57E, - 0x934A: 0xE580, - 0x934B: 0xE581, - 0x934C: 0xE582, - 0x934D: 0xE583, - 0x934E: 0xE584, - 0x934F: 0xE585, - 0x9350: 0xE586, - 0x9351: 0xE587, - 0x9352: 0xE588, - 0x9353: 0xE589, - 0x9354: 0xE58A, - 0x9355: 0xE58B, - 0x9356: 0xE58C, - 0x9357: 0xE58D, - 0x9358: 0xE58E, - 0x9359: 0xE58F, - 0x935A: 0xE590, - 0x935B: 0xE591, - 0x935C: 0xE592, - 0x935D: 0xE593, - 0x935E: 0xE594, - 0x935F: 0xE595, - 0x9360: 0xE596, - 0x9361: 0xE597, - 0x9362: 0xE598, - 0x9363: 0xE599, - 0x9364: 0xE59A, - 0x9365: 0xE59B, - 0x9366: 0xE59C, - 0x9367: 0xE59D, - 0x9368: 0xE59E, - 0x9369: 0xE59F, - 0x936A: 0xF6CA, - 0x936B: 0xE5A0, - 0x936C: 0xE640, - 0x936D: 0xE641, - 0x936E: 0xE642, - 0x936F: 0xE643, - 0x9370: 0xE644, - 0x9371: 0xE645, - 0x9372: 0xE646, - 0x9373: 0xE647, - 0x9374: 0xE648, - 0x9375: 0xE649, - 0x9376: 0xE64A, - 0x9377: 0xE64B, - 0x9378: 0xE64C, - 0x9379: 0xE64D, - 0x937A: 0xE64E, - 0x937B: 0xE64F, - 0x937C: 0xE650, - 0x937D: 0xE651, - 0x937E: 0xE652, - 0x937F: 0xE653, - 0x9380: 0xE654, - 0x9381: 0xE655, - 0x9382: 0xE656, - 0x9383: 0xE657, - 0x9384: 0xE658, - 0x9385: 0xE659, - 0x9386: 0xE65A, - 0x9387: 0xE65B, - 0x9388: 0xE65C, - 0x9389: 0xE65D, - 0x938A: 0xE65E, - 0x938B: 0xE65F, - 0x938C: 0xE660, - 0x938D: 0xE661, - 0x938E: 0xE662, - 0x938F: 0xF6CC, - 0x9390: 0xE663, - 0x9391: 0xE664, - 0x9392: 0xE665, - 0x9393: 0xE666, - 0x9394: 0xE667, - 0x9395: 0xE668, - 0x9396: 0xE669, - 0x9397: 0xE66A, - 0x9398: 0xE66B, - 0x9399: 0xE66C, - 0x939A: 0xE66D, - 0x939B: 0xE66E, - 0x939C: 0xE66F, - 0x939D: 0xE670, - 0x939E: 0xE671, - 0x939F: 0xE672, - 0x93A0: 0xE673, - 0x93A1: 0xE674, - 0x93A2: 0xE675, - 0x93A3: 0xE676, - 0x93A4: 0xE677, - 0x93A5: 0xE678, - 0x93A6: 0xE679, - 0x93A7: 0xE67A, - 0x93A8: 0xE67B, - 0x93A9: 0xE67C, - 0x93AA: 0xE67D, - 0x93AB: 0xE67E, - 0x93AC: 0xE680, - 0x93AD: 0xE681, - 0x93AE: 0xE682, - 0x93AF: 0xE683, - 0x93B0: 0xE684, - 0x93B1: 0xE685, - 0x93B2: 0xE686, - 0x93B3: 0xE687, - 0x93B4: 0xE688, - 0x93B5: 0xE689, - 0x93B6: 0xE68A, - 0x93B7: 0xE68B, - 0x93B8: 0xE68C, - 0x93B9: 0xE68D, - 0x93BA: 0xE68E, - 0x93BB: 0xE68F, - 0x93BC: 0xE690, - 0x93BD: 0xE691, - 0x93BE: 0xE692, - 0x93BF: 0xE693, - 0x93C0: 0xE694, - 0x93C1: 0xE695, - 0x93C2: 0xE696, - 0x93C3: 0xE697, - 0x93C4: 0xE698, - 0x93C5: 0xE699, - 0x93C6: 0xE69A, - 0x93C7: 0xE69B, - 0x93C8: 0xE69C, - 0x93C9: 0xE69D, - 0x93CA: 0xF6CB, - 0x93CB: 0xE69E, - 0x93CC: 0xE69F, - 0x93CD: 0xE6A0, - 0x93CE: 0xE740, - 0x93CF: 0xE741, - 0x93D0: 0xE742, - 0x93D1: 0xE743, - 0x93D2: 0xE744, - 0x93D3: 0xE745, - 0x93D4: 0xE746, - 0x93D5: 0xE747, - 0x93D6: 0xF7E9, - 0x93D7: 0xE748, - 0x93D8: 0xE749, - 0x93D9: 0xE74A, - 0x93DA: 0xE74B, - 0x93DB: 0xE74C, - 0x93DC: 0xE74D, - 0x93DD: 0xE74E, - 0x93DE: 0xE74F, - 0x93DF: 0xE750, - 0x93E0: 0xE751, - 0x93E1: 0xE752, - 0x93E2: 0xE753, - 0x93E3: 0xE754, - 0x93E4: 0xE755, - 0x93E5: 0xE756, - 0x93E6: 0xE757, - 0x93E7: 0xE758, - 0x93E8: 0xE759, - 0x93E9: 0xE75A, - 0x93EA: 0xE75B, - 0x93EB: 0xE75C, - 0x93EC: 0xE75D, - 0x93ED: 0xE75E, - 0x93EE: 0xE75F, - 0x93EF: 0xE760, - 0x93F0: 0xE761, - 0x93F1: 0xE762, - 0x93F2: 0xE763, - 0x93F3: 0xE764, - 0x93F4: 0xE765, - 0x93F5: 0xE766, - 0x93F6: 0xE767, - 0x93F7: 0xE768, - 0x93F8: 0xE769, - 0x93F9: 0xE76A, - 0x93FA: 0xE76B, - 0x93FB: 0xE76C, - 0x93FC: 0xE76D, - 0x93FD: 0xE76E, - 0x93FE: 0xE76F, - 0x93FF: 0xE770, - 0x9400: 0xE771, - 0x9401: 0xE772, - 0x9402: 0xE773, - 0x9403: 0xE774, - 0x9404: 0xE775, - 0x9405: 0xE776, - 0x9406: 0xE777, - 0x9407: 0xE778, - 0x9408: 0xE779, - 0x9409: 0xE77A, - 0x940A: 0xE77B, - 0x940B: 0xE77C, - 0x940C: 0xE77D, - 0x940D: 0xE77E, - 0x940E: 0xE780, - 0x940F: 0xE781, - 0x9410: 0xE782, - 0x9411: 0xE783, - 0x9412: 0xE784, - 0x9413: 0xE785, - 0x9414: 0xE786, - 0x9415: 0xE787, - 0x9416: 0xE788, - 0x9417: 0xE789, - 0x9418: 0xE78A, - 0x9419: 0xE78B, - 0x941A: 0xE78C, - 0x941B: 0xE78D, - 0x941C: 0xE78E, - 0x941D: 0xE78F, - 0x941E: 0xE790, - 0x941F: 0xE791, - 0x9420: 0xE792, - 0x9421: 0xE793, - 0x9422: 0xE794, - 0x9423: 0xE795, - 0x9424: 0xE796, - 0x9425: 0xE797, - 0x9426: 0xE798, - 0x9427: 0xE799, - 0x9428: 0xE79A, - 0x9429: 0xE79B, - 0x942A: 0xE79C, - 0x942B: 0xE79D, - 0x942C: 0xE79E, - 0x942D: 0xE79F, - 0x942E: 0xE7A0, - 0x942F: 0xE840, - 0x9430: 0xE841, - 0x9431: 0xE842, - 0x9432: 0xE843, - 0x9433: 0xE844, - 0x9434: 0xE845, - 0x9435: 0xE846, - 0x9436: 0xE847, - 0x9437: 0xE848, - 0x9438: 0xE849, - 0x9439: 0xE84A, - 0x943A: 0xE84B, - 0x943B: 0xE84C, - 0x943C: 0xE84D, - 0x943D: 0xE84E, - 0x943E: 0xF6CD, - 0x943F: 0xE84F, - 0x9440: 0xE850, - 0x9441: 0xE851, - 0x9442: 0xE852, - 0x9443: 0xE853, - 0x9444: 0xE854, - 0x9445: 0xE855, - 0x9446: 0xE856, - 0x9447: 0xE857, - 0x9448: 0xE858, - 0x9449: 0xE859, - 0x944A: 0xE85A, - 0x944B: 0xE85B, - 0x944C: 0xE85C, - 0x944D: 0xE85D, - 0x944E: 0xE85E, - 0x944F: 0xE85F, - 0x9450: 0xE860, - 0x9451: 0xE861, - 0x9452: 0xE862, - 0x9453: 0xE863, - 0x9454: 0xE864, - 0x9455: 0xE865, - 0x9456: 0xE866, - 0x9457: 0xE867, - 0x9458: 0xE868, - 0x9459: 0xE869, - 0x945A: 0xE86A, - 0x945B: 0xE86B, - 0x945C: 0xE86C, - 0x945D: 0xE86D, - 0x945E: 0xE86E, - 0x945F: 0xE86F, - 0x9460: 0xE870, - 0x9461: 0xE871, - 0x9462: 0xE872, - 0x9463: 0xE873, - 0x9464: 0xE874, - 0x9465: 0xE875, - 0x9466: 0xE876, - 0x9467: 0xE877, - 0x9468: 0xE878, - 0x9469: 0xE879, - 0x946A: 0xE87A, - 0x946B: 0xF6CE, - 0x946C: 0xE87B, - 0x946D: 0xE87C, - 0x946E: 0xE87D, - 0x946F: 0xE87E, - 0x9470: 0xE880, - 0x9471: 0xE881, - 0x9472: 0xE882, - 0x9473: 0xE883, - 0x9474: 0xE884, - 0x9475: 0xE885, - 0x9476: 0xE886, - 0x9477: 0xE887, - 0x9478: 0xE888, - 0x9479: 0xE889, - 0x947A: 0xE88A, - 0x947B: 0xE88B, - 0x947C: 0xE88C, - 0x947D: 0xE88D, - 0x947E: 0xE88E, - 0x947F: 0xE88F, - 0x9480: 0xE890, - 0x9481: 0xE891, - 0x9482: 0xE892, - 0x9483: 0xE893, - 0x9484: 0xE894, - 0x9485: 0xEEC4, - 0x9486: 0xEEC5, - 0x9487: 0xEEC6, - 0x9488: 0xD5EB, - 0x9489: 0xB6A4, - 0x948A: 0xEEC8, - 0x948B: 0xEEC7, - 0x948C: 0xEEC9, - 0x948D: 0xEECA, - 0x948E: 0xC7A5, - 0x948F: 0xEECB, - 0x9490: 0xEECC, - 0x9491: 0xE895, - 0x9492: 0xB7B0, - 0x9493: 0xB5F6, - 0x9494: 0xEECD, - 0x9495: 0xEECF, - 0x9496: 0xE896, - 0x9497: 0xEECE, - 0x9498: 0xE897, - 0x9499: 0xB8C6, - 0x949A: 0xEED0, - 0x949B: 0xEED1, - 0x949C: 0xEED2, - 0x949D: 0xB6DB, - 0x949E: 0xB3AE, - 0x949F: 0xD6D3, - 0x94A0: 0xC4C6, - 0x94A1: 0xB1B5, - 0x94A2: 0xB8D6, - 0x94A3: 0xEED3, - 0x94A4: 0xEED4, - 0x94A5: 0xD4BF, - 0x94A6: 0xC7D5, - 0x94A7: 0xBEFB, - 0x94A8: 0xCED9, - 0x94A9: 0xB9B3, - 0x94AA: 0xEED6, - 0x94AB: 0xEED5, - 0x94AC: 0xEED8, - 0x94AD: 0xEED7, - 0x94AE: 0xC5A5, - 0x94AF: 0xEED9, - 0x94B0: 0xEEDA, - 0x94B1: 0xC7AE, - 0x94B2: 0xEEDB, - 0x94B3: 0xC7AF, - 0x94B4: 0xEEDC, - 0x94B5: 0xB2A7, - 0x94B6: 0xEEDD, - 0x94B7: 0xEEDE, - 0x94B8: 0xEEDF, - 0x94B9: 0xEEE0, - 0x94BA: 0xEEE1, - 0x94BB: 0xD7EA, - 0x94BC: 0xEEE2, - 0x94BD: 0xEEE3, - 0x94BE: 0xBCD8, - 0x94BF: 0xEEE4, - 0x94C0: 0xD3CB, - 0x94C1: 0xCCFA, - 0x94C2: 0xB2AC, - 0x94C3: 0xC1E5, - 0x94C4: 0xEEE5, - 0x94C5: 0xC7A6, - 0x94C6: 0xC3AD, - 0x94C7: 0xE898, - 0x94C8: 0xEEE6, - 0x94C9: 0xEEE7, - 0x94CA: 0xEEE8, - 0x94CB: 0xEEE9, - 0x94CC: 0xEEEA, - 0x94CD: 0xEEEB, - 0x94CE: 0xEEEC, - 0x94CF: 0xE899, - 0x94D0: 0xEEED, - 0x94D1: 0xEEEE, - 0x94D2: 0xEEEF, - 0x94D3: 0xE89A, - 0x94D4: 0xE89B, - 0x94D5: 0xEEF0, - 0x94D6: 0xEEF1, - 0x94D7: 0xEEF2, - 0x94D8: 0xEEF4, - 0x94D9: 0xEEF3, - 0x94DA: 0xE89C, - 0x94DB: 0xEEF5, - 0x94DC: 0xCDAD, - 0x94DD: 0xC2C1, - 0x94DE: 0xEEF6, - 0x94DF: 0xEEF7, - 0x94E0: 0xEEF8, - 0x94E1: 0xD5A1, - 0x94E2: 0xEEF9, - 0x94E3: 0xCFB3, - 0x94E4: 0xEEFA, - 0x94E5: 0xEEFB, - 0x94E6: 0xE89D, - 0x94E7: 0xEEFC, - 0x94E8: 0xEEFD, - 0x94E9: 0xEFA1, - 0x94EA: 0xEEFE, - 0x94EB: 0xEFA2, - 0x94EC: 0xB8F5, - 0x94ED: 0xC3FA, - 0x94EE: 0xEFA3, - 0x94EF: 0xEFA4, - 0x94F0: 0xBDC2, - 0x94F1: 0xD2BF, - 0x94F2: 0xB2F9, - 0x94F3: 0xEFA5, - 0x94F4: 0xEFA6, - 0x94F5: 0xEFA7, - 0x94F6: 0xD2F8, - 0x94F7: 0xEFA8, - 0x94F8: 0xD6FD, - 0x94F9: 0xEFA9, - 0x94FA: 0xC6CC, - 0x94FB: 0xE89E, - 0x94FC: 0xEFAA, - 0x94FD: 0xEFAB, - 0x94FE: 0xC1B4, - 0x94FF: 0xEFAC, - 0x9500: 0xCFFA, - 0x9501: 0xCBF8, - 0x9502: 0xEFAE, - 0x9503: 0xEFAD, - 0x9504: 0xB3FA, - 0x9505: 0xB9F8, - 0x9506: 0xEFAF, - 0x9507: 0xEFB0, - 0x9508: 0xD0E2, - 0x9509: 0xEFB1, - 0x950A: 0xEFB2, - 0x950B: 0xB7E6, - 0x950C: 0xD0BF, - 0x950D: 0xEFB3, - 0x950E: 0xEFB4, - 0x950F: 0xEFB5, - 0x9510: 0xC8F1, - 0x9511: 0xCCE0, - 0x9512: 0xEFB6, - 0x9513: 0xEFB7, - 0x9514: 0xEFB8, - 0x9515: 0xEFB9, - 0x9516: 0xEFBA, - 0x9517: 0xD5E0, - 0x9518: 0xEFBB, - 0x9519: 0xB4ED, - 0x951A: 0xC3AA, - 0x951B: 0xEFBC, - 0x951C: 0xE89F, - 0x951D: 0xEFBD, - 0x951E: 0xEFBE, - 0x951F: 0xEFBF, - 0x9520: 0xE8A0, - 0x9521: 0xCEFD, - 0x9522: 0xEFC0, - 0x9523: 0xC2E0, - 0x9524: 0xB4B8, - 0x9525: 0xD7B6, - 0x9526: 0xBDF5, - 0x9527: 0xE940, - 0x9528: 0xCFC7, - 0x9529: 0xEFC3, - 0x952A: 0xEFC1, - 0x952B: 0xEFC2, - 0x952C: 0xEFC4, - 0x952D: 0xB6A7, - 0x952E: 0xBCFC, - 0x952F: 0xBEE2, - 0x9530: 0xC3CC, - 0x9531: 0xEFC5, - 0x9532: 0xEFC6, - 0x9533: 0xE941, - 0x9534: 0xEFC7, - 0x9535: 0xEFCF, - 0x9536: 0xEFC8, - 0x9537: 0xEFC9, - 0x9538: 0xEFCA, - 0x9539: 0xC7C2, - 0x953A: 0xEFF1, - 0x953B: 0xB6CD, - 0x953C: 0xEFCB, - 0x953D: 0xE942, - 0x953E: 0xEFCC, - 0x953F: 0xEFCD, - 0x9540: 0xB6C6, - 0x9541: 0xC3BE, - 0x9542: 0xEFCE, - 0x9543: 0xE943, - 0x9544: 0xEFD0, - 0x9545: 0xEFD1, - 0x9546: 0xEFD2, - 0x9547: 0xD5F2, - 0x9548: 0xE944, - 0x9549: 0xEFD3, - 0x954A: 0xC4F7, - 0x954B: 0xE945, - 0x954C: 0xEFD4, - 0x954D: 0xC4F8, - 0x954E: 0xEFD5, - 0x954F: 0xEFD6, - 0x9550: 0xB8E4, - 0x9551: 0xB0F7, - 0x9552: 0xEFD7, - 0x9553: 0xEFD8, - 0x9554: 0xEFD9, - 0x9555: 0xE946, - 0x9556: 0xEFDA, - 0x9557: 0xEFDB, - 0x9558: 0xEFDC, - 0x9559: 0xEFDD, - 0x955A: 0xE947, - 0x955B: 0xEFDE, - 0x955C: 0xBEB5, - 0x955D: 0xEFE1, - 0x955E: 0xEFDF, - 0x955F: 0xEFE0, - 0x9560: 0xE948, - 0x9561: 0xEFE2, - 0x9562: 0xEFE3, - 0x9563: 0xC1CD, - 0x9564: 0xEFE4, - 0x9565: 0xEFE5, - 0x9566: 0xEFE6, - 0x9567: 0xEFE7, - 0x9568: 0xEFE8, - 0x9569: 0xEFE9, - 0x956A: 0xEFEA, - 0x956B: 0xEFEB, - 0x956C: 0xEFEC, - 0x956D: 0xC0D8, - 0x956E: 0xE949, - 0x956F: 0xEFED, - 0x9570: 0xC1AD, - 0x9571: 0xEFEE, - 0x9572: 0xEFEF, - 0x9573: 0xEFF0, - 0x9574: 0xE94A, - 0x9575: 0xE94B, - 0x9576: 0xCFE2, - 0x9577: 0xE94C, - 0x9578: 0xE94D, - 0x9579: 0xE94E, - 0x957A: 0xE94F, - 0x957B: 0xE950, - 0x957C: 0xE951, - 0x957D: 0xE952, - 0x957E: 0xE953, - 0x957F: 0xB3A4, - 0x9580: 0xE954, - 0x9581: 0xE955, - 0x9582: 0xE956, - 0x9583: 0xE957, - 0x9584: 0xE958, - 0x9585: 0xE959, - 0x9586: 0xE95A, - 0x9587: 0xE95B, - 0x9588: 0xE95C, - 0x9589: 0xE95D, - 0x958A: 0xE95E, - 0x958B: 0xE95F, - 0x958C: 0xE960, - 0x958D: 0xE961, - 0x958E: 0xE962, - 0x958F: 0xE963, - 0x9590: 0xE964, - 0x9591: 0xE965, - 0x9592: 0xE966, - 0x9593: 0xE967, - 0x9594: 0xE968, - 0x9595: 0xE969, - 0x9596: 0xE96A, - 0x9597: 0xE96B, - 0x9598: 0xE96C, - 0x9599: 0xE96D, - 0x959A: 0xE96E, - 0x959B: 0xE96F, - 0x959C: 0xE970, - 0x959D: 0xE971, - 0x959E: 0xE972, - 0x959F: 0xE973, - 0x95A0: 0xE974, - 0x95A1: 0xE975, - 0x95A2: 0xE976, - 0x95A3: 0xE977, - 0x95A4: 0xE978, - 0x95A5: 0xE979, - 0x95A6: 0xE97A, - 0x95A7: 0xE97B, - 0x95A8: 0xE97C, - 0x95A9: 0xE97D, - 0x95AA: 0xE97E, - 0x95AB: 0xE980, - 0x95AC: 0xE981, - 0x95AD: 0xE982, - 0x95AE: 0xE983, - 0x95AF: 0xE984, - 0x95B0: 0xE985, - 0x95B1: 0xE986, - 0x95B2: 0xE987, - 0x95B3: 0xE988, - 0x95B4: 0xE989, - 0x95B5: 0xE98A, - 0x95B6: 0xE98B, - 0x95B7: 0xE98C, - 0x95B8: 0xE98D, - 0x95B9: 0xE98E, - 0x95BA: 0xE98F, - 0x95BB: 0xE990, - 0x95BC: 0xE991, - 0x95BD: 0xE992, - 0x95BE: 0xE993, - 0x95BF: 0xE994, - 0x95C0: 0xE995, - 0x95C1: 0xE996, - 0x95C2: 0xE997, - 0x95C3: 0xE998, - 0x95C4: 0xE999, - 0x95C5: 0xE99A, - 0x95C6: 0xE99B, - 0x95C7: 0xE99C, - 0x95C8: 0xE99D, - 0x95C9: 0xE99E, - 0x95CA: 0xE99F, - 0x95CB: 0xE9A0, - 0x95CC: 0xEA40, - 0x95CD: 0xEA41, - 0x95CE: 0xEA42, - 0x95CF: 0xEA43, - 0x95D0: 0xEA44, - 0x95D1: 0xEA45, - 0x95D2: 0xEA46, - 0x95D3: 0xEA47, - 0x95D4: 0xEA48, - 0x95D5: 0xEA49, - 0x95D6: 0xEA4A, - 0x95D7: 0xEA4B, - 0x95D8: 0xEA4C, - 0x95D9: 0xEA4D, - 0x95DA: 0xEA4E, - 0x95DB: 0xEA4F, - 0x95DC: 0xEA50, - 0x95DD: 0xEA51, - 0x95DE: 0xEA52, - 0x95DF: 0xEA53, - 0x95E0: 0xEA54, - 0x95E1: 0xEA55, - 0x95E2: 0xEA56, - 0x95E3: 0xEA57, - 0x95E4: 0xEA58, - 0x95E5: 0xEA59, - 0x95E6: 0xEA5A, - 0x95E7: 0xEA5B, - 0x95E8: 0xC3C5, - 0x95E9: 0xE3C5, - 0x95EA: 0xC9C1, - 0x95EB: 0xE3C6, - 0x95EC: 0xEA5C, - 0x95ED: 0xB1D5, - 0x95EE: 0xCECA, - 0x95EF: 0xB4B3, - 0x95F0: 0xC8F2, - 0x95F1: 0xE3C7, - 0x95F2: 0xCFD0, - 0x95F3: 0xE3C8, - 0x95F4: 0xBCE4, - 0x95F5: 0xE3C9, - 0x95F6: 0xE3CA, - 0x95F7: 0xC3C6, - 0x95F8: 0xD5A2, - 0x95F9: 0xC4D6, - 0x95FA: 0xB9EB, - 0x95FB: 0xCEC5, - 0x95FC: 0xE3CB, - 0x95FD: 0xC3F6, - 0x95FE: 0xE3CC, - 0x95FF: 0xEA5D, - 0x9600: 0xB7A7, - 0x9601: 0xB8F3, - 0x9602: 0xBAD2, - 0x9603: 0xE3CD, - 0x9604: 0xE3CE, - 0x9605: 0xD4C4, - 0x9606: 0xE3CF, - 0x9607: 0xEA5E, - 0x9608: 0xE3D0, - 0x9609: 0xD1CB, - 0x960A: 0xE3D1, - 0x960B: 0xE3D2, - 0x960C: 0xE3D3, - 0x960D: 0xE3D4, - 0x960E: 0xD1D6, - 0x960F: 0xE3D5, - 0x9610: 0xB2FB, - 0x9611: 0xC0BB, - 0x9612: 0xE3D6, - 0x9613: 0xEA5F, - 0x9614: 0xC0AB, - 0x9615: 0xE3D7, - 0x9616: 0xE3D8, - 0x9617: 0xE3D9, - 0x9618: 0xEA60, - 0x9619: 0xE3DA, - 0x961A: 0xE3DB, - 0x961B: 0xEA61, - 0x961C: 0xB8B7, - 0x961D: 0xDAE2, - 0x961E: 0xEA62, - 0x961F: 0xB6D3, - 0x9620: 0xEA63, - 0x9621: 0xDAE4, - 0x9622: 0xDAE3, - 0x9623: 0xEA64, - 0x9624: 0xEA65, - 0x9625: 0xEA66, - 0x9626: 0xEA67, - 0x9627: 0xEA68, - 0x9628: 0xEA69, - 0x9629: 0xEA6A, - 0x962A: 0xDAE6, - 0x962B: 0xEA6B, - 0x962C: 0xEA6C, - 0x962D: 0xEA6D, - 0x962E: 0xC8EE, - 0x962F: 0xEA6E, - 0x9630: 0xEA6F, - 0x9631: 0xDAE5, - 0x9632: 0xB7C0, - 0x9633: 0xD1F4, - 0x9634: 0xD2F5, - 0x9635: 0xD5F3, - 0x9636: 0xBDD7, - 0x9637: 0xEA70, - 0x9638: 0xEA71, - 0x9639: 0xEA72, - 0x963A: 0xEA73, - 0x963B: 0xD7E8, - 0x963C: 0xDAE8, - 0x963D: 0xDAE7, - 0x963E: 0xEA74, - 0x963F: 0xB0A2, - 0x9640: 0xCDD3, - 0x9641: 0xEA75, - 0x9642: 0xDAE9, - 0x9643: 0xEA76, - 0x9644: 0xB8BD, - 0x9645: 0xBCCA, - 0x9646: 0xC2BD, - 0x9647: 0xC2A4, - 0x9648: 0xB3C2, - 0x9649: 0xDAEA, - 0x964A: 0xEA77, - 0x964B: 0xC2AA, - 0x964C: 0xC4B0, - 0x964D: 0xBDB5, - 0x964E: 0xEA78, - 0x964F: 0xEA79, - 0x9650: 0xCFDE, - 0x9651: 0xEA7A, - 0x9652: 0xEA7B, - 0x9653: 0xEA7C, - 0x9654: 0xDAEB, - 0x9655: 0xC9C2, - 0x9656: 0xEA7D, - 0x9657: 0xEA7E, - 0x9658: 0xEA80, - 0x9659: 0xEA81, - 0x965A: 0xEA82, - 0x965B: 0xB1DD, - 0x965C: 0xEA83, - 0x965D: 0xEA84, - 0x965E: 0xEA85, - 0x965F: 0xDAEC, - 0x9660: 0xEA86, - 0x9661: 0xB6B8, - 0x9662: 0xD4BA, - 0x9663: 0xEA87, - 0x9664: 0xB3FD, - 0x9665: 0xEA88, - 0x9666: 0xEA89, - 0x9667: 0xDAED, - 0x9668: 0xD4C9, - 0x9669: 0xCFD5, - 0x966A: 0xC5E3, - 0x966B: 0xEA8A, - 0x966C: 0xDAEE, - 0x966D: 0xEA8B, - 0x966E: 0xEA8C, - 0x966F: 0xEA8D, - 0x9670: 0xEA8E, - 0x9671: 0xEA8F, - 0x9672: 0xDAEF, - 0x9673: 0xEA90, - 0x9674: 0xDAF0, - 0x9675: 0xC1EA, - 0x9676: 0xCCD5, - 0x9677: 0xCFDD, - 0x9678: 0xEA91, - 0x9679: 0xEA92, - 0x967A: 0xEA93, - 0x967B: 0xEA94, - 0x967C: 0xEA95, - 0x967D: 0xEA96, - 0x967E: 0xEA97, - 0x967F: 0xEA98, - 0x9680: 0xEA99, - 0x9681: 0xEA9A, - 0x9682: 0xEA9B, - 0x9683: 0xEA9C, - 0x9684: 0xEA9D, - 0x9685: 0xD3E7, - 0x9686: 0xC2A1, - 0x9687: 0xEA9E, - 0x9688: 0xDAF1, - 0x9689: 0xEA9F, - 0x968A: 0xEAA0, - 0x968B: 0xCBE5, - 0x968C: 0xEB40, - 0x968D: 0xDAF2, - 0x968E: 0xEB41, - 0x968F: 0xCBE6, - 0x9690: 0xD2FE, - 0x9691: 0xEB42, - 0x9692: 0xEB43, - 0x9693: 0xEB44, - 0x9694: 0xB8F4, - 0x9695: 0xEB45, - 0x9696: 0xEB46, - 0x9697: 0xDAF3, - 0x9698: 0xB0AF, - 0x9699: 0xCFB6, - 0x969A: 0xEB47, - 0x969B: 0xEB48, - 0x969C: 0xD5CF, - 0x969D: 0xEB49, - 0x969E: 0xEB4A, - 0x969F: 0xEB4B, - 0x96A0: 0xEB4C, - 0x96A1: 0xEB4D, - 0x96A2: 0xEB4E, - 0x96A3: 0xEB4F, - 0x96A4: 0xEB50, - 0x96A5: 0xEB51, - 0x96A6: 0xEB52, - 0x96A7: 0xCBED, - 0x96A8: 0xEB53, - 0x96A9: 0xEB54, - 0x96AA: 0xEB55, - 0x96AB: 0xEB56, - 0x96AC: 0xEB57, - 0x96AD: 0xEB58, - 0x96AE: 0xEB59, - 0x96AF: 0xEB5A, - 0x96B0: 0xDAF4, - 0x96B1: 0xEB5B, - 0x96B2: 0xEB5C, - 0x96B3: 0xE3C4, - 0x96B4: 0xEB5D, - 0x96B5: 0xEB5E, - 0x96B6: 0xC1A5, - 0x96B7: 0xEB5F, - 0x96B8: 0xEB60, - 0x96B9: 0xF6BF, - 0x96BA: 0xEB61, - 0x96BB: 0xEB62, - 0x96BC: 0xF6C0, - 0x96BD: 0xF6C1, - 0x96BE: 0xC4D1, - 0x96BF: 0xEB63, - 0x96C0: 0xC8B8, - 0x96C1: 0xD1E3, - 0x96C2: 0xEB64, - 0x96C3: 0xEB65, - 0x96C4: 0xD0DB, - 0x96C5: 0xD1C5, - 0x96C6: 0xBCAF, - 0x96C7: 0xB9CD, - 0x96C8: 0xEB66, - 0x96C9: 0xEFF4, - 0x96CA: 0xEB67, - 0x96CB: 0xEB68, - 0x96CC: 0xB4C6, - 0x96CD: 0xD3BA, - 0x96CE: 0xF6C2, - 0x96CF: 0xB3FB, - 0x96D0: 0xEB69, - 0x96D1: 0xEB6A, - 0x96D2: 0xF6C3, - 0x96D3: 0xEB6B, - 0x96D4: 0xEB6C, - 0x96D5: 0xB5F1, - 0x96D6: 0xEB6D, - 0x96D7: 0xEB6E, - 0x96D8: 0xEB6F, - 0x96D9: 0xEB70, - 0x96DA: 0xEB71, - 0x96DB: 0xEB72, - 0x96DC: 0xEB73, - 0x96DD: 0xEB74, - 0x96DE: 0xEB75, - 0x96DF: 0xEB76, - 0x96E0: 0xF6C5, - 0x96E1: 0xEB77, - 0x96E2: 0xEB78, - 0x96E3: 0xEB79, - 0x96E4: 0xEB7A, - 0x96E5: 0xEB7B, - 0x96E6: 0xEB7C, - 0x96E7: 0xEB7D, - 0x96E8: 0xD3EA, - 0x96E9: 0xF6A7, - 0x96EA: 0xD1A9, - 0x96EB: 0xEB7E, - 0x96EC: 0xEB80, - 0x96ED: 0xEB81, - 0x96EE: 0xEB82, - 0x96EF: 0xF6A9, - 0x96F0: 0xEB83, - 0x96F1: 0xEB84, - 0x96F2: 0xEB85, - 0x96F3: 0xF6A8, - 0x96F4: 0xEB86, - 0x96F5: 0xEB87, - 0x96F6: 0xC1E3, - 0x96F7: 0xC0D7, - 0x96F8: 0xEB88, - 0x96F9: 0xB1A2, - 0x96FA: 0xEB89, - 0x96FB: 0xEB8A, - 0x96FC: 0xEB8B, - 0x96FD: 0xEB8C, - 0x96FE: 0xCEED, - 0x96FF: 0xEB8D, - 0x9700: 0xD0E8, - 0x9701: 0xF6AB, - 0x9702: 0xEB8E, - 0x9703: 0xEB8F, - 0x9704: 0xCFF6, - 0x9705: 0xEB90, - 0x9706: 0xF6AA, - 0x9707: 0xD5F0, - 0x9708: 0xF6AC, - 0x9709: 0xC3B9, - 0x970A: 0xEB91, - 0x970B: 0xEB92, - 0x970C: 0xEB93, - 0x970D: 0xBBF4, - 0x970E: 0xF6AE, - 0x970F: 0xF6AD, - 0x9710: 0xEB94, - 0x9711: 0xEB95, - 0x9712: 0xEB96, - 0x9713: 0xC4DE, - 0x9714: 0xEB97, - 0x9715: 0xEB98, - 0x9716: 0xC1D8, - 0x9717: 0xEB99, - 0x9718: 0xEB9A, - 0x9719: 0xEB9B, - 0x971A: 0xEB9C, - 0x971B: 0xEB9D, - 0x971C: 0xCBAA, - 0x971D: 0xEB9E, - 0x971E: 0xCFBC, - 0x971F: 0xEB9F, - 0x9720: 0xEBA0, - 0x9721: 0xEC40, - 0x9722: 0xEC41, - 0x9723: 0xEC42, - 0x9724: 0xEC43, - 0x9725: 0xEC44, - 0x9726: 0xEC45, - 0x9727: 0xEC46, - 0x9728: 0xEC47, - 0x9729: 0xEC48, - 0x972A: 0xF6AF, - 0x972B: 0xEC49, - 0x972C: 0xEC4A, - 0x972D: 0xF6B0, - 0x972E: 0xEC4B, - 0x972F: 0xEC4C, - 0x9730: 0xF6B1, - 0x9731: 0xEC4D, - 0x9732: 0xC2B6, - 0x9733: 0xEC4E, - 0x9734: 0xEC4F, - 0x9735: 0xEC50, - 0x9736: 0xEC51, - 0x9737: 0xEC52, - 0x9738: 0xB0D4, - 0x9739: 0xC5F9, - 0x973A: 0xEC53, - 0x973B: 0xEC54, - 0x973C: 0xEC55, - 0x973D: 0xEC56, - 0x973E: 0xF6B2, - 0x973F: 0xEC57, - 0x9740: 0xEC58, - 0x9741: 0xEC59, - 0x9742: 0xEC5A, - 0x9743: 0xEC5B, - 0x9744: 0xEC5C, - 0x9745: 0xEC5D, - 0x9746: 0xEC5E, - 0x9747: 0xEC5F, - 0x9748: 0xEC60, - 0x9749: 0xEC61, - 0x974A: 0xEC62, - 0x974B: 0xEC63, - 0x974C: 0xEC64, - 0x974D: 0xEC65, - 0x974E: 0xEC66, - 0x974F: 0xEC67, - 0x9750: 0xEC68, - 0x9751: 0xEC69, - 0x9752: 0xC7E0, - 0x9753: 0xF6A6, - 0x9754: 0xEC6A, - 0x9755: 0xEC6B, - 0x9756: 0xBEB8, - 0x9757: 0xEC6C, - 0x9758: 0xEC6D, - 0x9759: 0xBEB2, - 0x975A: 0xEC6E, - 0x975B: 0xB5E5, - 0x975C: 0xEC6F, - 0x975D: 0xEC70, - 0x975E: 0xB7C7, - 0x975F: 0xEC71, - 0x9760: 0xBFBF, - 0x9761: 0xC3D2, - 0x9762: 0xC3E6, - 0x9763: 0xEC72, - 0x9764: 0xEC73, - 0x9765: 0xD8CC, - 0x9766: 0xEC74, - 0x9767: 0xEC75, - 0x9768: 0xEC76, - 0x9769: 0xB8EF, - 0x976A: 0xEC77, - 0x976B: 0xEC78, - 0x976C: 0xEC79, - 0x976D: 0xEC7A, - 0x976E: 0xEC7B, - 0x976F: 0xEC7C, - 0x9770: 0xEC7D, - 0x9771: 0xEC7E, - 0x9772: 0xEC80, - 0x9773: 0xBDF9, - 0x9774: 0xD1A5, - 0x9775: 0xEC81, - 0x9776: 0xB0D0, - 0x9777: 0xEC82, - 0x9778: 0xEC83, - 0x9779: 0xEC84, - 0x977A: 0xEC85, - 0x977B: 0xEC86, - 0x977C: 0xF7B0, - 0x977D: 0xEC87, - 0x977E: 0xEC88, - 0x977F: 0xEC89, - 0x9780: 0xEC8A, - 0x9781: 0xEC8B, - 0x9782: 0xEC8C, - 0x9783: 0xEC8D, - 0x9784: 0xEC8E, - 0x9785: 0xF7B1, - 0x9786: 0xEC8F, - 0x9787: 0xEC90, - 0x9788: 0xEC91, - 0x9789: 0xEC92, - 0x978A: 0xEC93, - 0x978B: 0xD0AC, - 0x978C: 0xEC94, - 0x978D: 0xB0B0, - 0x978E: 0xEC95, - 0x978F: 0xEC96, - 0x9790: 0xEC97, - 0x9791: 0xF7B2, - 0x9792: 0xF7B3, - 0x9793: 0xEC98, - 0x9794: 0xF7B4, - 0x9795: 0xEC99, - 0x9796: 0xEC9A, - 0x9797: 0xEC9B, - 0x9798: 0xC7CA, - 0x9799: 0xEC9C, - 0x979A: 0xEC9D, - 0x979B: 0xEC9E, - 0x979C: 0xEC9F, - 0x979D: 0xECA0, - 0x979E: 0xED40, - 0x979F: 0xED41, - 0x97A0: 0xBECF, - 0x97A1: 0xED42, - 0x97A2: 0xED43, - 0x97A3: 0xF7B7, - 0x97A4: 0xED44, - 0x97A5: 0xED45, - 0x97A6: 0xED46, - 0x97A7: 0xED47, - 0x97A8: 0xED48, - 0x97A9: 0xED49, - 0x97AA: 0xED4A, - 0x97AB: 0xF7B6, - 0x97AC: 0xED4B, - 0x97AD: 0xB1DE, - 0x97AE: 0xED4C, - 0x97AF: 0xF7B5, - 0x97B0: 0xED4D, - 0x97B1: 0xED4E, - 0x97B2: 0xF7B8, - 0x97B3: 0xED4F, - 0x97B4: 0xF7B9, - 0x97B5: 0xED50, - 0x97B6: 0xED51, - 0x97B7: 0xED52, - 0x97B8: 0xED53, - 0x97B9: 0xED54, - 0x97BA: 0xED55, - 0x97BB: 0xED56, - 0x97BC: 0xED57, - 0x97BD: 0xED58, - 0x97BE: 0xED59, - 0x97BF: 0xED5A, - 0x97C0: 0xED5B, - 0x97C1: 0xED5C, - 0x97C2: 0xED5D, - 0x97C3: 0xED5E, - 0x97C4: 0xED5F, - 0x97C5: 0xED60, - 0x97C6: 0xED61, - 0x97C7: 0xED62, - 0x97C8: 0xED63, - 0x97C9: 0xED64, - 0x97CA: 0xED65, - 0x97CB: 0xED66, - 0x97CC: 0xED67, - 0x97CD: 0xED68, - 0x97CE: 0xED69, - 0x97CF: 0xED6A, - 0x97D0: 0xED6B, - 0x97D1: 0xED6C, - 0x97D2: 0xED6D, - 0x97D3: 0xED6E, - 0x97D4: 0xED6F, - 0x97D5: 0xED70, - 0x97D6: 0xED71, - 0x97D7: 0xED72, - 0x97D8: 0xED73, - 0x97D9: 0xED74, - 0x97DA: 0xED75, - 0x97DB: 0xED76, - 0x97DC: 0xED77, - 0x97DD: 0xED78, - 0x97DE: 0xED79, - 0x97DF: 0xED7A, - 0x97E0: 0xED7B, - 0x97E1: 0xED7C, - 0x97E2: 0xED7D, - 0x97E3: 0xED7E, - 0x97E4: 0xED80, - 0x97E5: 0xED81, - 0x97E6: 0xCEA4, - 0x97E7: 0xC8CD, - 0x97E8: 0xED82, - 0x97E9: 0xBAAB, - 0x97EA: 0xE8B8, - 0x97EB: 0xE8B9, - 0x97EC: 0xE8BA, - 0x97ED: 0xBEC2, - 0x97EE: 0xED83, - 0x97EF: 0xED84, - 0x97F0: 0xED85, - 0x97F1: 0xED86, - 0x97F2: 0xED87, - 0x97F3: 0xD2F4, - 0x97F4: 0xED88, - 0x97F5: 0xD4CF, - 0x97F6: 0xC9D8, - 0x97F7: 0xED89, - 0x97F8: 0xED8A, - 0x97F9: 0xED8B, - 0x97FA: 0xED8C, - 0x97FB: 0xED8D, - 0x97FC: 0xED8E, - 0x97FD: 0xED8F, - 0x97FE: 0xED90, - 0x97FF: 0xED91, - 0x9800: 0xED92, - 0x9801: 0xED93, - 0x9802: 0xED94, - 0x9803: 0xED95, - 0x9804: 0xED96, - 0x9805: 0xED97, - 0x9806: 0xED98, - 0x9807: 0xED99, - 0x9808: 0xED9A, - 0x9809: 0xED9B, - 0x980A: 0xED9C, - 0x980B: 0xED9D, - 0x980C: 0xED9E, - 0x980D: 0xED9F, - 0x980E: 0xEDA0, - 0x980F: 0xEE40, - 0x9810: 0xEE41, - 0x9811: 0xEE42, - 0x9812: 0xEE43, - 0x9813: 0xEE44, - 0x9814: 0xEE45, - 0x9815: 0xEE46, - 0x9816: 0xEE47, - 0x9817: 0xEE48, - 0x9818: 0xEE49, - 0x9819: 0xEE4A, - 0x981A: 0xEE4B, - 0x981B: 0xEE4C, - 0x981C: 0xEE4D, - 0x981D: 0xEE4E, - 0x981E: 0xEE4F, - 0x981F: 0xEE50, - 0x9820: 0xEE51, - 0x9821: 0xEE52, - 0x9822: 0xEE53, - 0x9823: 0xEE54, - 0x9824: 0xEE55, - 0x9825: 0xEE56, - 0x9826: 0xEE57, - 0x9827: 0xEE58, - 0x9828: 0xEE59, - 0x9829: 0xEE5A, - 0x982A: 0xEE5B, - 0x982B: 0xEE5C, - 0x982C: 0xEE5D, - 0x982D: 0xEE5E, - 0x982E: 0xEE5F, - 0x982F: 0xEE60, - 0x9830: 0xEE61, - 0x9831: 0xEE62, - 0x9832: 0xEE63, - 0x9833: 0xEE64, - 0x9834: 0xEE65, - 0x9835: 0xEE66, - 0x9836: 0xEE67, - 0x9837: 0xEE68, - 0x9838: 0xEE69, - 0x9839: 0xEE6A, - 0x983A: 0xEE6B, - 0x983B: 0xEE6C, - 0x983C: 0xEE6D, - 0x983D: 0xEE6E, - 0x983E: 0xEE6F, - 0x983F: 0xEE70, - 0x9840: 0xEE71, - 0x9841: 0xEE72, - 0x9842: 0xEE73, - 0x9843: 0xEE74, - 0x9844: 0xEE75, - 0x9845: 0xEE76, - 0x9846: 0xEE77, - 0x9847: 0xEE78, - 0x9848: 0xEE79, - 0x9849: 0xEE7A, - 0x984A: 0xEE7B, - 0x984B: 0xEE7C, - 0x984C: 0xEE7D, - 0x984D: 0xEE7E, - 0x984E: 0xEE80, - 0x984F: 0xEE81, - 0x9850: 0xEE82, - 0x9851: 0xEE83, - 0x9852: 0xEE84, - 0x9853: 0xEE85, - 0x9854: 0xEE86, - 0x9855: 0xEE87, - 0x9856: 0xEE88, - 0x9857: 0xEE89, - 0x9858: 0xEE8A, - 0x9859: 0xEE8B, - 0x985A: 0xEE8C, - 0x985B: 0xEE8D, - 0x985C: 0xEE8E, - 0x985D: 0xEE8F, - 0x985E: 0xEE90, - 0x985F: 0xEE91, - 0x9860: 0xEE92, - 0x9861: 0xEE93, - 0x9862: 0xEE94, - 0x9863: 0xEE95, - 0x9864: 0xEE96, - 0x9865: 0xEE97, - 0x9866: 0xEE98, - 0x9867: 0xEE99, - 0x9868: 0xEE9A, - 0x9869: 0xEE9B, - 0x986A: 0xEE9C, - 0x986B: 0xEE9D, - 0x986C: 0xEE9E, - 0x986D: 0xEE9F, - 0x986E: 0xEEA0, - 0x986F: 0xEF40, - 0x9870: 0xEF41, - 0x9871: 0xEF42, - 0x9872: 0xEF43, - 0x9873: 0xEF44, - 0x9874: 0xEF45, - 0x9875: 0xD2B3, - 0x9876: 0xB6A5, - 0x9877: 0xC7EA, - 0x9878: 0xF1FC, - 0x9879: 0xCFEE, - 0x987A: 0xCBB3, - 0x987B: 0xD0EB, - 0x987C: 0xE7EF, - 0x987D: 0xCDE7, - 0x987E: 0xB9CB, - 0x987F: 0xB6D9, - 0x9880: 0xF1FD, - 0x9881: 0xB0E4, - 0x9882: 0xCBCC, - 0x9883: 0xF1FE, - 0x9884: 0xD4A4, - 0x9885: 0xC2AD, - 0x9886: 0xC1EC, - 0x9887: 0xC6C4, - 0x9888: 0xBEB1, - 0x9889: 0xF2A1, - 0x988A: 0xBCD5, - 0x988B: 0xEF46, - 0x988C: 0xF2A2, - 0x988D: 0xF2A3, - 0x988E: 0xEF47, - 0x988F: 0xF2A4, - 0x9890: 0xD2C3, - 0x9891: 0xC6B5, - 0x9892: 0xEF48, - 0x9893: 0xCDC7, - 0x9894: 0xF2A5, - 0x9895: 0xEF49, - 0x9896: 0xD3B1, - 0x9897: 0xBFC5, - 0x9898: 0xCCE2, - 0x9899: 0xEF4A, - 0x989A: 0xF2A6, - 0x989B: 0xF2A7, - 0x989C: 0xD1D5, - 0x989D: 0xB6EE, - 0x989E: 0xF2A8, - 0x989F: 0xF2A9, - 0x98A0: 0xB5DF, - 0x98A1: 0xF2AA, - 0x98A2: 0xF2AB, - 0x98A3: 0xEF4B, - 0x98A4: 0xB2FC, - 0x98A5: 0xF2AC, - 0x98A6: 0xF2AD, - 0x98A7: 0xC8A7, - 0x98A8: 0xEF4C, - 0x98A9: 0xEF4D, - 0x98AA: 0xEF4E, - 0x98AB: 0xEF4F, - 0x98AC: 0xEF50, - 0x98AD: 0xEF51, - 0x98AE: 0xEF52, - 0x98AF: 0xEF53, - 0x98B0: 0xEF54, - 0x98B1: 0xEF55, - 0x98B2: 0xEF56, - 0x98B3: 0xEF57, - 0x98B4: 0xEF58, - 0x98B5: 0xEF59, - 0x98B6: 0xEF5A, - 0x98B7: 0xEF5B, - 0x98B8: 0xEF5C, - 0x98B9: 0xEF5D, - 0x98BA: 0xEF5E, - 0x98BB: 0xEF5F, - 0x98BC: 0xEF60, - 0x98BD: 0xEF61, - 0x98BE: 0xEF62, - 0x98BF: 0xEF63, - 0x98C0: 0xEF64, - 0x98C1: 0xEF65, - 0x98C2: 0xEF66, - 0x98C3: 0xEF67, - 0x98C4: 0xEF68, - 0x98C5: 0xEF69, - 0x98C6: 0xEF6A, - 0x98C7: 0xEF6B, - 0x98C8: 0xEF6C, - 0x98C9: 0xEF6D, - 0x98CA: 0xEF6E, - 0x98CB: 0xEF6F, - 0x98CC: 0xEF70, - 0x98CD: 0xEF71, - 0x98CE: 0xB7E7, - 0x98CF: 0xEF72, - 0x98D0: 0xEF73, - 0x98D1: 0xECA9, - 0x98D2: 0xECAA, - 0x98D3: 0xECAB, - 0x98D4: 0xEF74, - 0x98D5: 0xECAC, - 0x98D6: 0xEF75, - 0x98D7: 0xEF76, - 0x98D8: 0xC6AE, - 0x98D9: 0xECAD, - 0x98DA: 0xECAE, - 0x98DB: 0xEF77, - 0x98DC: 0xEF78, - 0x98DD: 0xEF79, - 0x98DE: 0xB7C9, - 0x98DF: 0xCAB3, - 0x98E0: 0xEF7A, - 0x98E1: 0xEF7B, - 0x98E2: 0xEF7C, - 0x98E3: 0xEF7D, - 0x98E4: 0xEF7E, - 0x98E5: 0xEF80, - 0x98E6: 0xEF81, - 0x98E7: 0xE2B8, - 0x98E8: 0xF7CF, - 0x98E9: 0xEF82, - 0x98EA: 0xEF83, - 0x98EB: 0xEF84, - 0x98EC: 0xEF85, - 0x98ED: 0xEF86, - 0x98EE: 0xEF87, - 0x98EF: 0xEF88, - 0x98F0: 0xEF89, - 0x98F1: 0xEF8A, - 0x98F2: 0xEF8B, - 0x98F3: 0xEF8C, - 0x98F4: 0xEF8D, - 0x98F5: 0xEF8E, - 0x98F6: 0xEF8F, - 0x98F7: 0xEF90, - 0x98F8: 0xEF91, - 0x98F9: 0xEF92, - 0x98FA: 0xEF93, - 0x98FB: 0xEF94, - 0x98FC: 0xEF95, - 0x98FD: 0xEF96, - 0x98FE: 0xEF97, - 0x98FF: 0xEF98, - 0x9900: 0xEF99, - 0x9901: 0xEF9A, - 0x9902: 0xEF9B, - 0x9903: 0xEF9C, - 0x9904: 0xEF9D, - 0x9905: 0xEF9E, - 0x9906: 0xEF9F, - 0x9907: 0xEFA0, - 0x9908: 0xF040, - 0x9909: 0xF041, - 0x990A: 0xF042, - 0x990B: 0xF043, - 0x990C: 0xF044, - 0x990D: 0xF7D0, - 0x990E: 0xF045, - 0x990F: 0xF046, - 0x9910: 0xB2CD, - 0x9911: 0xF047, - 0x9912: 0xF048, - 0x9913: 0xF049, - 0x9914: 0xF04A, - 0x9915: 0xF04B, - 0x9916: 0xF04C, - 0x9917: 0xF04D, - 0x9918: 0xF04E, - 0x9919: 0xF04F, - 0x991A: 0xF050, - 0x991B: 0xF051, - 0x991C: 0xF052, - 0x991D: 0xF053, - 0x991E: 0xF054, - 0x991F: 0xF055, - 0x9920: 0xF056, - 0x9921: 0xF057, - 0x9922: 0xF058, - 0x9923: 0xF059, - 0x9924: 0xF05A, - 0x9925: 0xF05B, - 0x9926: 0xF05C, - 0x9927: 0xF05D, - 0x9928: 0xF05E, - 0x9929: 0xF05F, - 0x992A: 0xF060, - 0x992B: 0xF061, - 0x992C: 0xF062, - 0x992D: 0xF063, - 0x992E: 0xF7D1, - 0x992F: 0xF064, - 0x9930: 0xF065, - 0x9931: 0xF066, - 0x9932: 0xF067, - 0x9933: 0xF068, - 0x9934: 0xF069, - 0x9935: 0xF06A, - 0x9936: 0xF06B, - 0x9937: 0xF06C, - 0x9938: 0xF06D, - 0x9939: 0xF06E, - 0x993A: 0xF06F, - 0x993B: 0xF070, - 0x993C: 0xF071, - 0x993D: 0xF072, - 0x993E: 0xF073, - 0x993F: 0xF074, - 0x9940: 0xF075, - 0x9941: 0xF076, - 0x9942: 0xF077, - 0x9943: 0xF078, - 0x9944: 0xF079, - 0x9945: 0xF07A, - 0x9946: 0xF07B, - 0x9947: 0xF07C, - 0x9948: 0xF07D, - 0x9949: 0xF07E, - 0x994A: 0xF080, - 0x994B: 0xF081, - 0x994C: 0xF082, - 0x994D: 0xF083, - 0x994E: 0xF084, - 0x994F: 0xF085, - 0x9950: 0xF086, - 0x9951: 0xF087, - 0x9952: 0xF088, - 0x9953: 0xF089, - 0x9954: 0xF7D3, - 0x9955: 0xF7D2, - 0x9956: 0xF08A, - 0x9957: 0xF08B, - 0x9958: 0xF08C, - 0x9959: 0xF08D, - 0x995A: 0xF08E, - 0x995B: 0xF08F, - 0x995C: 0xF090, - 0x995D: 0xF091, - 0x995E: 0xF092, - 0x995F: 0xF093, - 0x9960: 0xF094, - 0x9961: 0xF095, - 0x9962: 0xF096, - 0x9963: 0xE2BB, - 0x9964: 0xF097, - 0x9965: 0xBCA2, - 0x9966: 0xF098, - 0x9967: 0xE2BC, - 0x9968: 0xE2BD, - 0x9969: 0xE2BE, - 0x996A: 0xE2BF, - 0x996B: 0xE2C0, - 0x996C: 0xE2C1, - 0x996D: 0xB7B9, - 0x996E: 0xD2FB, - 0x996F: 0xBDA4, - 0x9970: 0xCACE, - 0x9971: 0xB1A5, - 0x9972: 0xCBC7, - 0x9973: 0xF099, - 0x9974: 0xE2C2, - 0x9975: 0xB6FC, - 0x9976: 0xC8C4, - 0x9977: 0xE2C3, - 0x9978: 0xF09A, - 0x9979: 0xF09B, - 0x997A: 0xBDC8, - 0x997B: 0xF09C, - 0x997C: 0xB1FD, - 0x997D: 0xE2C4, - 0x997E: 0xF09D, - 0x997F: 0xB6F6, - 0x9980: 0xE2C5, - 0x9981: 0xC4D9, - 0x9982: 0xF09E, - 0x9983: 0xF09F, - 0x9984: 0xE2C6, - 0x9985: 0xCFDA, - 0x9986: 0xB9DD, - 0x9987: 0xE2C7, - 0x9988: 0xC0A1, - 0x9989: 0xF0A0, - 0x998A: 0xE2C8, - 0x998B: 0xB2F6, - 0x998C: 0xF140, - 0x998D: 0xE2C9, - 0x998E: 0xF141, - 0x998F: 0xC1F3, - 0x9990: 0xE2CA, - 0x9991: 0xE2CB, - 0x9992: 0xC2F8, - 0x9993: 0xE2CC, - 0x9994: 0xE2CD, - 0x9995: 0xE2CE, - 0x9996: 0xCAD7, - 0x9997: 0xD8B8, - 0x9998: 0xD9E5, - 0x9999: 0xCFE3, - 0x999A: 0xF142, - 0x999B: 0xF143, - 0x999C: 0xF144, - 0x999D: 0xF145, - 0x999E: 0xF146, - 0x999F: 0xF147, - 0x99A0: 0xF148, - 0x99A1: 0xF149, - 0x99A2: 0xF14A, - 0x99A3: 0xF14B, - 0x99A4: 0xF14C, - 0x99A5: 0xF0A5, - 0x99A6: 0xF14D, - 0x99A7: 0xF14E, - 0x99A8: 0xDCB0, - 0x99A9: 0xF14F, - 0x99AA: 0xF150, - 0x99AB: 0xF151, - 0x99AC: 0xF152, - 0x99AD: 0xF153, - 0x99AE: 0xF154, - 0x99AF: 0xF155, - 0x99B0: 0xF156, - 0x99B1: 0xF157, - 0x99B2: 0xF158, - 0x99B3: 0xF159, - 0x99B4: 0xF15A, - 0x99B5: 0xF15B, - 0x99B6: 0xF15C, - 0x99B7: 0xF15D, - 0x99B8: 0xF15E, - 0x99B9: 0xF15F, - 0x99BA: 0xF160, - 0x99BB: 0xF161, - 0x99BC: 0xF162, - 0x99BD: 0xF163, - 0x99BE: 0xF164, - 0x99BF: 0xF165, - 0x99C0: 0xF166, - 0x99C1: 0xF167, - 0x99C2: 0xF168, - 0x99C3: 0xF169, - 0x99C4: 0xF16A, - 0x99C5: 0xF16B, - 0x99C6: 0xF16C, - 0x99C7: 0xF16D, - 0x99C8: 0xF16E, - 0x99C9: 0xF16F, - 0x99CA: 0xF170, - 0x99CB: 0xF171, - 0x99CC: 0xF172, - 0x99CD: 0xF173, - 0x99CE: 0xF174, - 0x99CF: 0xF175, - 0x99D0: 0xF176, - 0x99D1: 0xF177, - 0x99D2: 0xF178, - 0x99D3: 0xF179, - 0x99D4: 0xF17A, - 0x99D5: 0xF17B, - 0x99D6: 0xF17C, - 0x99D7: 0xF17D, - 0x99D8: 0xF17E, - 0x99D9: 0xF180, - 0x99DA: 0xF181, - 0x99DB: 0xF182, - 0x99DC: 0xF183, - 0x99DD: 0xF184, - 0x99DE: 0xF185, - 0x99DF: 0xF186, - 0x99E0: 0xF187, - 0x99E1: 0xF188, - 0x99E2: 0xF189, - 0x99E3: 0xF18A, - 0x99E4: 0xF18B, - 0x99E5: 0xF18C, - 0x99E6: 0xF18D, - 0x99E7: 0xF18E, - 0x99E8: 0xF18F, - 0x99E9: 0xF190, - 0x99EA: 0xF191, - 0x99EB: 0xF192, - 0x99EC: 0xF193, - 0x99ED: 0xF194, - 0x99EE: 0xF195, - 0x99EF: 0xF196, - 0x99F0: 0xF197, - 0x99F1: 0xF198, - 0x99F2: 0xF199, - 0x99F3: 0xF19A, - 0x99F4: 0xF19B, - 0x99F5: 0xF19C, - 0x99F6: 0xF19D, - 0x99F7: 0xF19E, - 0x99F8: 0xF19F, - 0x99F9: 0xF1A0, - 0x99FA: 0xF240, - 0x99FB: 0xF241, - 0x99FC: 0xF242, - 0x99FD: 0xF243, - 0x99FE: 0xF244, - 0x99FF: 0xF245, - 0x9A00: 0xF246, - 0x9A01: 0xF247, - 0x9A02: 0xF248, - 0x9A03: 0xF249, - 0x9A04: 0xF24A, - 0x9A05: 0xF24B, - 0x9A06: 0xF24C, - 0x9A07: 0xF24D, - 0x9A08: 0xF24E, - 0x9A09: 0xF24F, - 0x9A0A: 0xF250, - 0x9A0B: 0xF251, - 0x9A0C: 0xF252, - 0x9A0D: 0xF253, - 0x9A0E: 0xF254, - 0x9A0F: 0xF255, - 0x9A10: 0xF256, - 0x9A11: 0xF257, - 0x9A12: 0xF258, - 0x9A13: 0xF259, - 0x9A14: 0xF25A, - 0x9A15: 0xF25B, - 0x9A16: 0xF25C, - 0x9A17: 0xF25D, - 0x9A18: 0xF25E, - 0x9A19: 0xF25F, - 0x9A1A: 0xF260, - 0x9A1B: 0xF261, - 0x9A1C: 0xF262, - 0x9A1D: 0xF263, - 0x9A1E: 0xF264, - 0x9A1F: 0xF265, - 0x9A20: 0xF266, - 0x9A21: 0xF267, - 0x9A22: 0xF268, - 0x9A23: 0xF269, - 0x9A24: 0xF26A, - 0x9A25: 0xF26B, - 0x9A26: 0xF26C, - 0x9A27: 0xF26D, - 0x9A28: 0xF26E, - 0x9A29: 0xF26F, - 0x9A2A: 0xF270, - 0x9A2B: 0xF271, - 0x9A2C: 0xF272, - 0x9A2D: 0xF273, - 0x9A2E: 0xF274, - 0x9A2F: 0xF275, - 0x9A30: 0xF276, - 0x9A31: 0xF277, - 0x9A32: 0xF278, - 0x9A33: 0xF279, - 0x9A34: 0xF27A, - 0x9A35: 0xF27B, - 0x9A36: 0xF27C, - 0x9A37: 0xF27D, - 0x9A38: 0xF27E, - 0x9A39: 0xF280, - 0x9A3A: 0xF281, - 0x9A3B: 0xF282, - 0x9A3C: 0xF283, - 0x9A3D: 0xF284, - 0x9A3E: 0xF285, - 0x9A3F: 0xF286, - 0x9A40: 0xF287, - 0x9A41: 0xF288, - 0x9A42: 0xF289, - 0x9A43: 0xF28A, - 0x9A44: 0xF28B, - 0x9A45: 0xF28C, - 0x9A46: 0xF28D, - 0x9A47: 0xF28E, - 0x9A48: 0xF28F, - 0x9A49: 0xF290, - 0x9A4A: 0xF291, - 0x9A4B: 0xF292, - 0x9A4C: 0xF293, - 0x9A4D: 0xF294, - 0x9A4E: 0xF295, - 0x9A4F: 0xF296, - 0x9A50: 0xF297, - 0x9A51: 0xF298, - 0x9A52: 0xF299, - 0x9A53: 0xF29A, - 0x9A54: 0xF29B, - 0x9A55: 0xF29C, - 0x9A56: 0xF29D, - 0x9A57: 0xF29E, - 0x9A58: 0xF29F, - 0x9A59: 0xF2A0, - 0x9A5A: 0xF340, - 0x9A5B: 0xF341, - 0x9A5C: 0xF342, - 0x9A5D: 0xF343, - 0x9A5E: 0xF344, - 0x9A5F: 0xF345, - 0x9A60: 0xF346, - 0x9A61: 0xF347, - 0x9A62: 0xF348, - 0x9A63: 0xF349, - 0x9A64: 0xF34A, - 0x9A65: 0xF34B, - 0x9A66: 0xF34C, - 0x9A67: 0xF34D, - 0x9A68: 0xF34E, - 0x9A69: 0xF34F, - 0x9A6A: 0xF350, - 0x9A6B: 0xF351, - 0x9A6C: 0xC2ED, - 0x9A6D: 0xD4A6, - 0x9A6E: 0xCDD4, - 0x9A6F: 0xD1B1, - 0x9A70: 0xB3DB, - 0x9A71: 0xC7FD, - 0x9A72: 0xF352, - 0x9A73: 0xB2B5, - 0x9A74: 0xC2BF, - 0x9A75: 0xE6E0, - 0x9A76: 0xCABB, - 0x9A77: 0xE6E1, - 0x9A78: 0xE6E2, - 0x9A79: 0xBED4, - 0x9A7A: 0xE6E3, - 0x9A7B: 0xD7A4, - 0x9A7C: 0xCDD5, - 0x9A7D: 0xE6E5, - 0x9A7E: 0xBCDD, - 0x9A7F: 0xE6E4, - 0x9A80: 0xE6E6, - 0x9A81: 0xE6E7, - 0x9A82: 0xC2EE, - 0x9A83: 0xF353, - 0x9A84: 0xBDBE, - 0x9A85: 0xE6E8, - 0x9A86: 0xC2E6, - 0x9A87: 0xBAA7, - 0x9A88: 0xE6E9, - 0x9A89: 0xF354, - 0x9A8A: 0xE6EA, - 0x9A8B: 0xB3D2, - 0x9A8C: 0xD1E9, - 0x9A8D: 0xF355, - 0x9A8E: 0xF356, - 0x9A8F: 0xBFA5, - 0x9A90: 0xE6EB, - 0x9A91: 0xC6EF, - 0x9A92: 0xE6EC, - 0x9A93: 0xE6ED, - 0x9A94: 0xF357, - 0x9A95: 0xF358, - 0x9A96: 0xE6EE, - 0x9A97: 0xC6AD, - 0x9A98: 0xE6EF, - 0x9A99: 0xF359, - 0x9A9A: 0xC9A7, - 0x9A9B: 0xE6F0, - 0x9A9C: 0xE6F1, - 0x9A9D: 0xE6F2, - 0x9A9E: 0xE5B9, - 0x9A9F: 0xE6F3, - 0x9AA0: 0xE6F4, - 0x9AA1: 0xC2E2, - 0x9AA2: 0xE6F5, - 0x9AA3: 0xE6F6, - 0x9AA4: 0xD6E8, - 0x9AA5: 0xE6F7, - 0x9AA6: 0xF35A, - 0x9AA7: 0xE6F8, - 0x9AA8: 0xB9C7, - 0x9AA9: 0xF35B, - 0x9AAA: 0xF35C, - 0x9AAB: 0xF35D, - 0x9AAC: 0xF35E, - 0x9AAD: 0xF35F, - 0x9AAE: 0xF360, - 0x9AAF: 0xF361, - 0x9AB0: 0xF7BB, - 0x9AB1: 0xF7BA, - 0x9AB2: 0xF362, - 0x9AB3: 0xF363, - 0x9AB4: 0xF364, - 0x9AB5: 0xF365, - 0x9AB6: 0xF7BE, - 0x9AB7: 0xF7BC, - 0x9AB8: 0xBAA1, - 0x9AB9: 0xF366, - 0x9ABA: 0xF7BF, - 0x9ABB: 0xF367, - 0x9ABC: 0xF7C0, - 0x9ABD: 0xF368, - 0x9ABE: 0xF369, - 0x9ABF: 0xF36A, - 0x9AC0: 0xF7C2, - 0x9AC1: 0xF7C1, - 0x9AC2: 0xF7C4, - 0x9AC3: 0xF36B, - 0x9AC4: 0xF36C, - 0x9AC5: 0xF7C3, - 0x9AC6: 0xF36D, - 0x9AC7: 0xF36E, - 0x9AC8: 0xF36F, - 0x9AC9: 0xF370, - 0x9ACA: 0xF371, - 0x9ACB: 0xF7C5, - 0x9ACC: 0xF7C6, - 0x9ACD: 0xF372, - 0x9ACE: 0xF373, - 0x9ACF: 0xF374, - 0x9AD0: 0xF375, - 0x9AD1: 0xF7C7, - 0x9AD2: 0xF376, - 0x9AD3: 0xCBE8, - 0x9AD4: 0xF377, - 0x9AD5: 0xF378, - 0x9AD6: 0xF379, - 0x9AD7: 0xF37A, - 0x9AD8: 0xB8DF, - 0x9AD9: 0xF37B, - 0x9ADA: 0xF37C, - 0x9ADB: 0xF37D, - 0x9ADC: 0xF37E, - 0x9ADD: 0xF380, - 0x9ADE: 0xF381, - 0x9ADF: 0xF7D4, - 0x9AE0: 0xF382, - 0x9AE1: 0xF7D5, - 0x9AE2: 0xF383, - 0x9AE3: 0xF384, - 0x9AE4: 0xF385, - 0x9AE5: 0xF386, - 0x9AE6: 0xF7D6, - 0x9AE7: 0xF387, - 0x9AE8: 0xF388, - 0x9AE9: 0xF389, - 0x9AEA: 0xF38A, - 0x9AEB: 0xF7D8, - 0x9AEC: 0xF38B, - 0x9AED: 0xF7DA, - 0x9AEE: 0xF38C, - 0x9AEF: 0xF7D7, - 0x9AF0: 0xF38D, - 0x9AF1: 0xF38E, - 0x9AF2: 0xF38F, - 0x9AF3: 0xF390, - 0x9AF4: 0xF391, - 0x9AF5: 0xF392, - 0x9AF6: 0xF393, - 0x9AF7: 0xF394, - 0x9AF8: 0xF395, - 0x9AF9: 0xF7DB, - 0x9AFA: 0xF396, - 0x9AFB: 0xF7D9, - 0x9AFC: 0xF397, - 0x9AFD: 0xF398, - 0x9AFE: 0xF399, - 0x9AFF: 0xF39A, - 0x9B00: 0xF39B, - 0x9B01: 0xF39C, - 0x9B02: 0xF39D, - 0x9B03: 0xD7D7, - 0x9B04: 0xF39E, - 0x9B05: 0xF39F, - 0x9B06: 0xF3A0, - 0x9B07: 0xF440, - 0x9B08: 0xF7DC, - 0x9B09: 0xF441, - 0x9B0A: 0xF442, - 0x9B0B: 0xF443, - 0x9B0C: 0xF444, - 0x9B0D: 0xF445, - 0x9B0E: 0xF446, - 0x9B0F: 0xF7DD, - 0x9B10: 0xF447, - 0x9B11: 0xF448, - 0x9B12: 0xF449, - 0x9B13: 0xF7DE, - 0x9B14: 0xF44A, - 0x9B15: 0xF44B, - 0x9B16: 0xF44C, - 0x9B17: 0xF44D, - 0x9B18: 0xF44E, - 0x9B19: 0xF44F, - 0x9B1A: 0xF450, - 0x9B1B: 0xF451, - 0x9B1C: 0xF452, - 0x9B1D: 0xF453, - 0x9B1E: 0xF454, - 0x9B1F: 0xF7DF, - 0x9B20: 0xF455, - 0x9B21: 0xF456, - 0x9B22: 0xF457, - 0x9B23: 0xF7E0, - 0x9B24: 0xF458, - 0x9B25: 0xF459, - 0x9B26: 0xF45A, - 0x9B27: 0xF45B, - 0x9B28: 0xF45C, - 0x9B29: 0xF45D, - 0x9B2A: 0xF45E, - 0x9B2B: 0xF45F, - 0x9B2C: 0xF460, - 0x9B2D: 0xF461, - 0x9B2E: 0xF462, - 0x9B2F: 0xDBCB, - 0x9B30: 0xF463, - 0x9B31: 0xF464, - 0x9B32: 0xD8AA, - 0x9B33: 0xF465, - 0x9B34: 0xF466, - 0x9B35: 0xF467, - 0x9B36: 0xF468, - 0x9B37: 0xF469, - 0x9B38: 0xF46A, - 0x9B39: 0xF46B, - 0x9B3A: 0xF46C, - 0x9B3B: 0xE5F7, - 0x9B3C: 0xB9ED, - 0x9B3D: 0xF46D, - 0x9B3E: 0xF46E, - 0x9B3F: 0xF46F, - 0x9B40: 0xF470, - 0x9B41: 0xBFFD, - 0x9B42: 0xBBEA, - 0x9B43: 0xF7C9, - 0x9B44: 0xC6C7, - 0x9B45: 0xF7C8, - 0x9B46: 0xF471, - 0x9B47: 0xF7CA, - 0x9B48: 0xF7CC, - 0x9B49: 0xF7CB, - 0x9B4A: 0xF472, - 0x9B4B: 0xF473, - 0x9B4C: 0xF474, - 0x9B4D: 0xF7CD, - 0x9B4E: 0xF475, - 0x9B4F: 0xCEBA, - 0x9B50: 0xF476, - 0x9B51: 0xF7CE, - 0x9B52: 0xF477, - 0x9B53: 0xF478, - 0x9B54: 0xC4A7, - 0x9B55: 0xF479, - 0x9B56: 0xF47A, - 0x9B57: 0xF47B, - 0x9B58: 0xF47C, - 0x9B59: 0xF47D, - 0x9B5A: 0xF47E, - 0x9B5B: 0xF480, - 0x9B5C: 0xF481, - 0x9B5D: 0xF482, - 0x9B5E: 0xF483, - 0x9B5F: 0xF484, - 0x9B60: 0xF485, - 0x9B61: 0xF486, - 0x9B62: 0xF487, - 0x9B63: 0xF488, - 0x9B64: 0xF489, - 0x9B65: 0xF48A, - 0x9B66: 0xF48B, - 0x9B67: 0xF48C, - 0x9B68: 0xF48D, - 0x9B69: 0xF48E, - 0x9B6A: 0xF48F, - 0x9B6B: 0xF490, - 0x9B6C: 0xF491, - 0x9B6D: 0xF492, - 0x9B6E: 0xF493, - 0x9B6F: 0xF494, - 0x9B70: 0xF495, - 0x9B71: 0xF496, - 0x9B72: 0xF497, - 0x9B73: 0xF498, - 0x9B74: 0xF499, - 0x9B75: 0xF49A, - 0x9B76: 0xF49B, - 0x9B77: 0xF49C, - 0x9B78: 0xF49D, - 0x9B79: 0xF49E, - 0x9B7A: 0xF49F, - 0x9B7B: 0xF4A0, - 0x9B7C: 0xF540, - 0x9B7D: 0xF541, - 0x9B7E: 0xF542, - 0x9B7F: 0xF543, - 0x9B80: 0xF544, - 0x9B81: 0xF545, - 0x9B82: 0xF546, - 0x9B83: 0xF547, - 0x9B84: 0xF548, - 0x9B85: 0xF549, - 0x9B86: 0xF54A, - 0x9B87: 0xF54B, - 0x9B88: 0xF54C, - 0x9B89: 0xF54D, - 0x9B8A: 0xF54E, - 0x9B8B: 0xF54F, - 0x9B8C: 0xF550, - 0x9B8D: 0xF551, - 0x9B8E: 0xF552, - 0x9B8F: 0xF553, - 0x9B90: 0xF554, - 0x9B91: 0xF555, - 0x9B92: 0xF556, - 0x9B93: 0xF557, - 0x9B94: 0xF558, - 0x9B95: 0xF559, - 0x9B96: 0xF55A, - 0x9B97: 0xF55B, - 0x9B98: 0xF55C, - 0x9B99: 0xF55D, - 0x9B9A: 0xF55E, - 0x9B9B: 0xF55F, - 0x9B9C: 0xF560, - 0x9B9D: 0xF561, - 0x9B9E: 0xF562, - 0x9B9F: 0xF563, - 0x9BA0: 0xF564, - 0x9BA1: 0xF565, - 0x9BA2: 0xF566, - 0x9BA3: 0xF567, - 0x9BA4: 0xF568, - 0x9BA5: 0xF569, - 0x9BA6: 0xF56A, - 0x9BA7: 0xF56B, - 0x9BA8: 0xF56C, - 0x9BA9: 0xF56D, - 0x9BAA: 0xF56E, - 0x9BAB: 0xF56F, - 0x9BAC: 0xF570, - 0x9BAD: 0xF571, - 0x9BAE: 0xF572, - 0x9BAF: 0xF573, - 0x9BB0: 0xF574, - 0x9BB1: 0xF575, - 0x9BB2: 0xF576, - 0x9BB3: 0xF577, - 0x9BB4: 0xF578, - 0x9BB5: 0xF579, - 0x9BB6: 0xF57A, - 0x9BB7: 0xF57B, - 0x9BB8: 0xF57C, - 0x9BB9: 0xF57D, - 0x9BBA: 0xF57E, - 0x9BBB: 0xF580, - 0x9BBC: 0xF581, - 0x9BBD: 0xF582, - 0x9BBE: 0xF583, - 0x9BBF: 0xF584, - 0x9BC0: 0xF585, - 0x9BC1: 0xF586, - 0x9BC2: 0xF587, - 0x9BC3: 0xF588, - 0x9BC4: 0xF589, - 0x9BC5: 0xF58A, - 0x9BC6: 0xF58B, - 0x9BC7: 0xF58C, - 0x9BC8: 0xF58D, - 0x9BC9: 0xF58E, - 0x9BCA: 0xF58F, - 0x9BCB: 0xF590, - 0x9BCC: 0xF591, - 0x9BCD: 0xF592, - 0x9BCE: 0xF593, - 0x9BCF: 0xF594, - 0x9BD0: 0xF595, - 0x9BD1: 0xF596, - 0x9BD2: 0xF597, - 0x9BD3: 0xF598, - 0x9BD4: 0xF599, - 0x9BD5: 0xF59A, - 0x9BD6: 0xF59B, - 0x9BD7: 0xF59C, - 0x9BD8: 0xF59D, - 0x9BD9: 0xF59E, - 0x9BDA: 0xF59F, - 0x9BDB: 0xF5A0, - 0x9BDC: 0xF640, - 0x9BDD: 0xF641, - 0x9BDE: 0xF642, - 0x9BDF: 0xF643, - 0x9BE0: 0xF644, - 0x9BE1: 0xF645, - 0x9BE2: 0xF646, - 0x9BE3: 0xF647, - 0x9BE4: 0xF648, - 0x9BE5: 0xF649, - 0x9BE6: 0xF64A, - 0x9BE7: 0xF64B, - 0x9BE8: 0xF64C, - 0x9BE9: 0xF64D, - 0x9BEA: 0xF64E, - 0x9BEB: 0xF64F, - 0x9BEC: 0xF650, - 0x9BED: 0xF651, - 0x9BEE: 0xF652, - 0x9BEF: 0xF653, - 0x9BF0: 0xF654, - 0x9BF1: 0xF655, - 0x9BF2: 0xF656, - 0x9BF3: 0xF657, - 0x9BF4: 0xF658, - 0x9BF5: 0xF659, - 0x9BF6: 0xF65A, - 0x9BF7: 0xF65B, - 0x9BF8: 0xF65C, - 0x9BF9: 0xF65D, - 0x9BFA: 0xF65E, - 0x9BFB: 0xF65F, - 0x9BFC: 0xF660, - 0x9BFD: 0xF661, - 0x9BFE: 0xF662, - 0x9BFF: 0xF663, - 0x9C00: 0xF664, - 0x9C01: 0xF665, - 0x9C02: 0xF666, - 0x9C03: 0xF667, - 0x9C04: 0xF668, - 0x9C05: 0xF669, - 0x9C06: 0xF66A, - 0x9C07: 0xF66B, - 0x9C08: 0xF66C, - 0x9C09: 0xF66D, - 0x9C0A: 0xF66E, - 0x9C0B: 0xF66F, - 0x9C0C: 0xF670, - 0x9C0D: 0xF671, - 0x9C0E: 0xF672, - 0x9C0F: 0xF673, - 0x9C10: 0xF674, - 0x9C11: 0xF675, - 0x9C12: 0xF676, - 0x9C13: 0xF677, - 0x9C14: 0xF678, - 0x9C15: 0xF679, - 0x9C16: 0xF67A, - 0x9C17: 0xF67B, - 0x9C18: 0xF67C, - 0x9C19: 0xF67D, - 0x9C1A: 0xF67E, - 0x9C1B: 0xF680, - 0x9C1C: 0xF681, - 0x9C1D: 0xF682, - 0x9C1E: 0xF683, - 0x9C1F: 0xF684, - 0x9C20: 0xF685, - 0x9C21: 0xF686, - 0x9C22: 0xF687, - 0x9C23: 0xF688, - 0x9C24: 0xF689, - 0x9C25: 0xF68A, - 0x9C26: 0xF68B, - 0x9C27: 0xF68C, - 0x9C28: 0xF68D, - 0x9C29: 0xF68E, - 0x9C2A: 0xF68F, - 0x9C2B: 0xF690, - 0x9C2C: 0xF691, - 0x9C2D: 0xF692, - 0x9C2E: 0xF693, - 0x9C2F: 0xF694, - 0x9C30: 0xF695, - 0x9C31: 0xF696, - 0x9C32: 0xF697, - 0x9C33: 0xF698, - 0x9C34: 0xF699, - 0x9C35: 0xF69A, - 0x9C36: 0xF69B, - 0x9C37: 0xF69C, - 0x9C38: 0xF69D, - 0x9C39: 0xF69E, - 0x9C3A: 0xF69F, - 0x9C3B: 0xF6A0, - 0x9C3C: 0xF740, - 0x9C3D: 0xF741, - 0x9C3E: 0xF742, - 0x9C3F: 0xF743, - 0x9C40: 0xF744, - 0x9C41: 0xF745, - 0x9C42: 0xF746, - 0x9C43: 0xF747, - 0x9C44: 0xF748, - 0x9C45: 0xF749, - 0x9C46: 0xF74A, - 0x9C47: 0xF74B, - 0x9C48: 0xF74C, - 0x9C49: 0xF74D, - 0x9C4A: 0xF74E, - 0x9C4B: 0xF74F, - 0x9C4C: 0xF750, - 0x9C4D: 0xF751, - 0x9C4E: 0xF752, - 0x9C4F: 0xF753, - 0x9C50: 0xF754, - 0x9C51: 0xF755, - 0x9C52: 0xF756, - 0x9C53: 0xF757, - 0x9C54: 0xF758, - 0x9C55: 0xF759, - 0x9C56: 0xF75A, - 0x9C57: 0xF75B, - 0x9C58: 0xF75C, - 0x9C59: 0xF75D, - 0x9C5A: 0xF75E, - 0x9C5B: 0xF75F, - 0x9C5C: 0xF760, - 0x9C5D: 0xF761, - 0x9C5E: 0xF762, - 0x9C5F: 0xF763, - 0x9C60: 0xF764, - 0x9C61: 0xF765, - 0x9C62: 0xF766, - 0x9C63: 0xF767, - 0x9C64: 0xF768, - 0x9C65: 0xF769, - 0x9C66: 0xF76A, - 0x9C67: 0xF76B, - 0x9C68: 0xF76C, - 0x9C69: 0xF76D, - 0x9C6A: 0xF76E, - 0x9C6B: 0xF76F, - 0x9C6C: 0xF770, - 0x9C6D: 0xF771, - 0x9C6E: 0xF772, - 0x9C6F: 0xF773, - 0x9C70: 0xF774, - 0x9C71: 0xF775, - 0x9C72: 0xF776, - 0x9C73: 0xF777, - 0x9C74: 0xF778, - 0x9C75: 0xF779, - 0x9C76: 0xF77A, - 0x9C77: 0xF77B, - 0x9C78: 0xF77C, - 0x9C79: 0xF77D, - 0x9C7A: 0xF77E, - 0x9C7B: 0xF780, - 0x9C7C: 0xD3E3, - 0x9C7D: 0xF781, - 0x9C7E: 0xF782, - 0x9C7F: 0xF6CF, - 0x9C80: 0xF783, - 0x9C81: 0xC2B3, - 0x9C82: 0xF6D0, - 0x9C83: 0xF784, - 0x9C84: 0xF785, - 0x9C85: 0xF6D1, - 0x9C86: 0xF6D2, - 0x9C87: 0xF6D3, - 0x9C88: 0xF6D4, - 0x9C89: 0xF786, - 0x9C8A: 0xF787, - 0x9C8B: 0xF6D6, - 0x9C8C: 0xF788, - 0x9C8D: 0xB1AB, - 0x9C8E: 0xF6D7, - 0x9C8F: 0xF789, - 0x9C90: 0xF6D8, - 0x9C91: 0xF6D9, - 0x9C92: 0xF6DA, - 0x9C93: 0xF78A, - 0x9C94: 0xF6DB, - 0x9C95: 0xF6DC, - 0x9C96: 0xF78B, - 0x9C97: 0xF78C, - 0x9C98: 0xF78D, - 0x9C99: 0xF78E, - 0x9C9A: 0xF6DD, - 0x9C9B: 0xF6DE, - 0x9C9C: 0xCFCA, - 0x9C9D: 0xF78F, - 0x9C9E: 0xF6DF, - 0x9C9F: 0xF6E0, - 0x9CA0: 0xF6E1, - 0x9CA1: 0xF6E2, - 0x9CA2: 0xF6E3, - 0x9CA3: 0xF6E4, - 0x9CA4: 0xC0F0, - 0x9CA5: 0xF6E5, - 0x9CA6: 0xF6E6, - 0x9CA7: 0xF6E7, - 0x9CA8: 0xF6E8, - 0x9CA9: 0xF6E9, - 0x9CAA: 0xF790, - 0x9CAB: 0xF6EA, - 0x9CAC: 0xF791, - 0x9CAD: 0xF6EB, - 0x9CAE: 0xF6EC, - 0x9CAF: 0xF792, - 0x9CB0: 0xF6ED, - 0x9CB1: 0xF6EE, - 0x9CB2: 0xF6EF, - 0x9CB3: 0xF6F0, - 0x9CB4: 0xF6F1, - 0x9CB5: 0xF6F2, - 0x9CB6: 0xF6F3, - 0x9CB7: 0xF6F4, - 0x9CB8: 0xBEA8, - 0x9CB9: 0xF793, - 0x9CBA: 0xF6F5, - 0x9CBB: 0xF6F6, - 0x9CBC: 0xF6F7, - 0x9CBD: 0xF6F8, - 0x9CBE: 0xF794, - 0x9CBF: 0xF795, - 0x9CC0: 0xF796, - 0x9CC1: 0xF797, - 0x9CC2: 0xF798, - 0x9CC3: 0xC8FA, - 0x9CC4: 0xF6F9, - 0x9CC5: 0xF6FA, - 0x9CC6: 0xF6FB, - 0x9CC7: 0xF6FC, - 0x9CC8: 0xF799, - 0x9CC9: 0xF79A, - 0x9CCA: 0xF6FD, - 0x9CCB: 0xF6FE, - 0x9CCC: 0xF7A1, - 0x9CCD: 0xF7A2, - 0x9CCE: 0xF7A3, - 0x9CCF: 0xF7A4, - 0x9CD0: 0xF7A5, - 0x9CD1: 0xF79B, - 0x9CD2: 0xF79C, - 0x9CD3: 0xF7A6, - 0x9CD4: 0xF7A7, - 0x9CD5: 0xF7A8, - 0x9CD6: 0xB1EE, - 0x9CD7: 0xF7A9, - 0x9CD8: 0xF7AA, - 0x9CD9: 0xF7AB, - 0x9CDA: 0xF79D, - 0x9CDB: 0xF79E, - 0x9CDC: 0xF7AC, - 0x9CDD: 0xF7AD, - 0x9CDE: 0xC1DB, - 0x9CDF: 0xF7AE, - 0x9CE0: 0xF79F, - 0x9CE1: 0xF7A0, - 0x9CE2: 0xF7AF, - 0x9CE3: 0xF840, - 0x9CE4: 0xF841, - 0x9CE5: 0xF842, - 0x9CE6: 0xF843, - 0x9CE7: 0xF844, - 0x9CE8: 0xF845, - 0x9CE9: 0xF846, - 0x9CEA: 0xF847, - 0x9CEB: 0xF848, - 0x9CEC: 0xF849, - 0x9CED: 0xF84A, - 0x9CEE: 0xF84B, - 0x9CEF: 0xF84C, - 0x9CF0: 0xF84D, - 0x9CF1: 0xF84E, - 0x9CF2: 0xF84F, - 0x9CF3: 0xF850, - 0x9CF4: 0xF851, - 0x9CF5: 0xF852, - 0x9CF6: 0xF853, - 0x9CF7: 0xF854, - 0x9CF8: 0xF855, - 0x9CF9: 0xF856, - 0x9CFA: 0xF857, - 0x9CFB: 0xF858, - 0x9CFC: 0xF859, - 0x9CFD: 0xF85A, - 0x9CFE: 0xF85B, - 0x9CFF: 0xF85C, - 0x9D00: 0xF85D, - 0x9D01: 0xF85E, - 0x9D02: 0xF85F, - 0x9D03: 0xF860, - 0x9D04: 0xF861, - 0x9D05: 0xF862, - 0x9D06: 0xF863, - 0x9D07: 0xF864, - 0x9D08: 0xF865, - 0x9D09: 0xF866, - 0x9D0A: 0xF867, - 0x9D0B: 0xF868, - 0x9D0C: 0xF869, - 0x9D0D: 0xF86A, - 0x9D0E: 0xF86B, - 0x9D0F: 0xF86C, - 0x9D10: 0xF86D, - 0x9D11: 0xF86E, - 0x9D12: 0xF86F, - 0x9D13: 0xF870, - 0x9D14: 0xF871, - 0x9D15: 0xF872, - 0x9D16: 0xF873, - 0x9D17: 0xF874, - 0x9D18: 0xF875, - 0x9D19: 0xF876, - 0x9D1A: 0xF877, - 0x9D1B: 0xF878, - 0x9D1C: 0xF879, - 0x9D1D: 0xF87A, - 0x9D1E: 0xF87B, - 0x9D1F: 0xF87C, - 0x9D20: 0xF87D, - 0x9D21: 0xF87E, - 0x9D22: 0xF880, - 0x9D23: 0xF881, - 0x9D24: 0xF882, - 0x9D25: 0xF883, - 0x9D26: 0xF884, - 0x9D27: 0xF885, - 0x9D28: 0xF886, - 0x9D29: 0xF887, - 0x9D2A: 0xF888, - 0x9D2B: 0xF889, - 0x9D2C: 0xF88A, - 0x9D2D: 0xF88B, - 0x9D2E: 0xF88C, - 0x9D2F: 0xF88D, - 0x9D30: 0xF88E, - 0x9D31: 0xF88F, - 0x9D32: 0xF890, - 0x9D33: 0xF891, - 0x9D34: 0xF892, - 0x9D35: 0xF893, - 0x9D36: 0xF894, - 0x9D37: 0xF895, - 0x9D38: 0xF896, - 0x9D39: 0xF897, - 0x9D3A: 0xF898, - 0x9D3B: 0xF899, - 0x9D3C: 0xF89A, - 0x9D3D: 0xF89B, - 0x9D3E: 0xF89C, - 0x9D3F: 0xF89D, - 0x9D40: 0xF89E, - 0x9D41: 0xF89F, - 0x9D42: 0xF8A0, - 0x9D43: 0xF940, - 0x9D44: 0xF941, - 0x9D45: 0xF942, - 0x9D46: 0xF943, - 0x9D47: 0xF944, - 0x9D48: 0xF945, - 0x9D49: 0xF946, - 0x9D4A: 0xF947, - 0x9D4B: 0xF948, - 0x9D4C: 0xF949, - 0x9D4D: 0xF94A, - 0x9D4E: 0xF94B, - 0x9D4F: 0xF94C, - 0x9D50: 0xF94D, - 0x9D51: 0xF94E, - 0x9D52: 0xF94F, - 0x9D53: 0xF950, - 0x9D54: 0xF951, - 0x9D55: 0xF952, - 0x9D56: 0xF953, - 0x9D57: 0xF954, - 0x9D58: 0xF955, - 0x9D59: 0xF956, - 0x9D5A: 0xF957, - 0x9D5B: 0xF958, - 0x9D5C: 0xF959, - 0x9D5D: 0xF95A, - 0x9D5E: 0xF95B, - 0x9D5F: 0xF95C, - 0x9D60: 0xF95D, - 0x9D61: 0xF95E, - 0x9D62: 0xF95F, - 0x9D63: 0xF960, - 0x9D64: 0xF961, - 0x9D65: 0xF962, - 0x9D66: 0xF963, - 0x9D67: 0xF964, - 0x9D68: 0xF965, - 0x9D69: 0xF966, - 0x9D6A: 0xF967, - 0x9D6B: 0xF968, - 0x9D6C: 0xF969, - 0x9D6D: 0xF96A, - 0x9D6E: 0xF96B, - 0x9D6F: 0xF96C, - 0x9D70: 0xF96D, - 0x9D71: 0xF96E, - 0x9D72: 0xF96F, - 0x9D73: 0xF970, - 0x9D74: 0xF971, - 0x9D75: 0xF972, - 0x9D76: 0xF973, - 0x9D77: 0xF974, - 0x9D78: 0xF975, - 0x9D79: 0xF976, - 0x9D7A: 0xF977, - 0x9D7B: 0xF978, - 0x9D7C: 0xF979, - 0x9D7D: 0xF97A, - 0x9D7E: 0xF97B, - 0x9D7F: 0xF97C, - 0x9D80: 0xF97D, - 0x9D81: 0xF97E, - 0x9D82: 0xF980, - 0x9D83: 0xF981, - 0x9D84: 0xF982, - 0x9D85: 0xF983, - 0x9D86: 0xF984, - 0x9D87: 0xF985, - 0x9D88: 0xF986, - 0x9D89: 0xF987, - 0x9D8A: 0xF988, - 0x9D8B: 0xF989, - 0x9D8C: 0xF98A, - 0x9D8D: 0xF98B, - 0x9D8E: 0xF98C, - 0x9D8F: 0xF98D, - 0x9D90: 0xF98E, - 0x9D91: 0xF98F, - 0x9D92: 0xF990, - 0x9D93: 0xF991, - 0x9D94: 0xF992, - 0x9D95: 0xF993, - 0x9D96: 0xF994, - 0x9D97: 0xF995, - 0x9D98: 0xF996, - 0x9D99: 0xF997, - 0x9D9A: 0xF998, - 0x9D9B: 0xF999, - 0x9D9C: 0xF99A, - 0x9D9D: 0xF99B, - 0x9D9E: 0xF99C, - 0x9D9F: 0xF99D, - 0x9DA0: 0xF99E, - 0x9DA1: 0xF99F, - 0x9DA2: 0xF9A0, - 0x9DA3: 0xFA40, - 0x9DA4: 0xFA41, - 0x9DA5: 0xFA42, - 0x9DA6: 0xFA43, - 0x9DA7: 0xFA44, - 0x9DA8: 0xFA45, - 0x9DA9: 0xFA46, - 0x9DAA: 0xFA47, - 0x9DAB: 0xFA48, - 0x9DAC: 0xFA49, - 0x9DAD: 0xFA4A, - 0x9DAE: 0xFA4B, - 0x9DAF: 0xFA4C, - 0x9DB0: 0xFA4D, - 0x9DB1: 0xFA4E, - 0x9DB2: 0xFA4F, - 0x9DB3: 0xFA50, - 0x9DB4: 0xFA51, - 0x9DB5: 0xFA52, - 0x9DB6: 0xFA53, - 0x9DB7: 0xFA54, - 0x9DB8: 0xFA55, - 0x9DB9: 0xFA56, - 0x9DBA: 0xFA57, - 0x9DBB: 0xFA58, - 0x9DBC: 0xFA59, - 0x9DBD: 0xFA5A, - 0x9DBE: 0xFA5B, - 0x9DBF: 0xFA5C, - 0x9DC0: 0xFA5D, - 0x9DC1: 0xFA5E, - 0x9DC2: 0xFA5F, - 0x9DC3: 0xFA60, - 0x9DC4: 0xFA61, - 0x9DC5: 0xFA62, - 0x9DC6: 0xFA63, - 0x9DC7: 0xFA64, - 0x9DC8: 0xFA65, - 0x9DC9: 0xFA66, - 0x9DCA: 0xFA67, - 0x9DCB: 0xFA68, - 0x9DCC: 0xFA69, - 0x9DCD: 0xFA6A, - 0x9DCE: 0xFA6B, - 0x9DCF: 0xFA6C, - 0x9DD0: 0xFA6D, - 0x9DD1: 0xFA6E, - 0x9DD2: 0xFA6F, - 0x9DD3: 0xFA70, - 0x9DD4: 0xFA71, - 0x9DD5: 0xFA72, - 0x9DD6: 0xFA73, - 0x9DD7: 0xFA74, - 0x9DD8: 0xFA75, - 0x9DD9: 0xFA76, - 0x9DDA: 0xFA77, - 0x9DDB: 0xFA78, - 0x9DDC: 0xFA79, - 0x9DDD: 0xFA7A, - 0x9DDE: 0xFA7B, - 0x9DDF: 0xFA7C, - 0x9DE0: 0xFA7D, - 0x9DE1: 0xFA7E, - 0x9DE2: 0xFA80, - 0x9DE3: 0xFA81, - 0x9DE4: 0xFA82, - 0x9DE5: 0xFA83, - 0x9DE6: 0xFA84, - 0x9DE7: 0xFA85, - 0x9DE8: 0xFA86, - 0x9DE9: 0xFA87, - 0x9DEA: 0xFA88, - 0x9DEB: 0xFA89, - 0x9DEC: 0xFA8A, - 0x9DED: 0xFA8B, - 0x9DEE: 0xFA8C, - 0x9DEF: 0xFA8D, - 0x9DF0: 0xFA8E, - 0x9DF1: 0xFA8F, - 0x9DF2: 0xFA90, - 0x9DF3: 0xFA91, - 0x9DF4: 0xFA92, - 0x9DF5: 0xFA93, - 0x9DF6: 0xFA94, - 0x9DF7: 0xFA95, - 0x9DF8: 0xFA96, - 0x9DF9: 0xFA97, - 0x9DFA: 0xFA98, - 0x9DFB: 0xFA99, - 0x9DFC: 0xFA9A, - 0x9DFD: 0xFA9B, - 0x9DFE: 0xFA9C, - 0x9DFF: 0xFA9D, - 0x9E00: 0xFA9E, - 0x9E01: 0xFA9F, - 0x9E02: 0xFAA0, - 0x9E03: 0xFB40, - 0x9E04: 0xFB41, - 0x9E05: 0xFB42, - 0x9E06: 0xFB43, - 0x9E07: 0xFB44, - 0x9E08: 0xFB45, - 0x9E09: 0xFB46, - 0x9E0A: 0xFB47, - 0x9E0B: 0xFB48, - 0x9E0C: 0xFB49, - 0x9E0D: 0xFB4A, - 0x9E0E: 0xFB4B, - 0x9E0F: 0xFB4C, - 0x9E10: 0xFB4D, - 0x9E11: 0xFB4E, - 0x9E12: 0xFB4F, - 0x9E13: 0xFB50, - 0x9E14: 0xFB51, - 0x9E15: 0xFB52, - 0x9E16: 0xFB53, - 0x9E17: 0xFB54, - 0x9E18: 0xFB55, - 0x9E19: 0xFB56, - 0x9E1A: 0xFB57, - 0x9E1B: 0xFB58, - 0x9E1C: 0xFB59, - 0x9E1D: 0xFB5A, - 0x9E1E: 0xFB5B, - 0x9E1F: 0xC4F1, - 0x9E20: 0xF0AF, - 0x9E21: 0xBCA6, - 0x9E22: 0xF0B0, - 0x9E23: 0xC3F9, - 0x9E24: 0xFB5C, - 0x9E25: 0xC5B8, - 0x9E26: 0xD1BB, - 0x9E27: 0xFB5D, - 0x9E28: 0xF0B1, - 0x9E29: 0xF0B2, - 0x9E2A: 0xF0B3, - 0x9E2B: 0xF0B4, - 0x9E2C: 0xF0B5, - 0x9E2D: 0xD1BC, - 0x9E2E: 0xFB5E, - 0x9E2F: 0xD1EC, - 0x9E30: 0xFB5F, - 0x9E31: 0xF0B7, - 0x9E32: 0xF0B6, - 0x9E33: 0xD4A7, - 0x9E34: 0xFB60, - 0x9E35: 0xCDD2, - 0x9E36: 0xF0B8, - 0x9E37: 0xF0BA, - 0x9E38: 0xF0B9, - 0x9E39: 0xF0BB, - 0x9E3A: 0xF0BC, - 0x9E3B: 0xFB61, - 0x9E3C: 0xFB62, - 0x9E3D: 0xB8EB, - 0x9E3E: 0xF0BD, - 0x9E3F: 0xBAE8, - 0x9E40: 0xFB63, - 0x9E41: 0xF0BE, - 0x9E42: 0xF0BF, - 0x9E43: 0xBEE9, - 0x9E44: 0xF0C0, - 0x9E45: 0xB6EC, - 0x9E46: 0xF0C1, - 0x9E47: 0xF0C2, - 0x9E48: 0xF0C3, - 0x9E49: 0xF0C4, - 0x9E4A: 0xC8B5, - 0x9E4B: 0xF0C5, - 0x9E4C: 0xF0C6, - 0x9E4D: 0xFB64, - 0x9E4E: 0xF0C7, - 0x9E4F: 0xC5F4, - 0x9E50: 0xFB65, - 0x9E51: 0xF0C8, - 0x9E52: 0xFB66, - 0x9E53: 0xFB67, - 0x9E54: 0xFB68, - 0x9E55: 0xF0C9, - 0x9E56: 0xFB69, - 0x9E57: 0xF0CA, - 0x9E58: 0xF7BD, - 0x9E59: 0xFB6A, - 0x9E5A: 0xF0CB, - 0x9E5B: 0xF0CC, - 0x9E5C: 0xF0CD, - 0x9E5D: 0xFB6B, - 0x9E5E: 0xF0CE, - 0x9E5F: 0xFB6C, - 0x9E60: 0xFB6D, - 0x9E61: 0xFB6E, - 0x9E62: 0xFB6F, - 0x9E63: 0xF0CF, - 0x9E64: 0xBAD7, - 0x9E65: 0xFB70, - 0x9E66: 0xF0D0, - 0x9E67: 0xF0D1, - 0x9E68: 0xF0D2, - 0x9E69: 0xF0D3, - 0x9E6A: 0xF0D4, - 0x9E6B: 0xF0D5, - 0x9E6C: 0xF0D6, - 0x9E6D: 0xF0D8, - 0x9E6E: 0xFB71, - 0x9E6F: 0xFB72, - 0x9E70: 0xD3A5, - 0x9E71: 0xF0D7, - 0x9E72: 0xFB73, - 0x9E73: 0xF0D9, - 0x9E74: 0xFB74, - 0x9E75: 0xFB75, - 0x9E76: 0xFB76, - 0x9E77: 0xFB77, - 0x9E78: 0xFB78, - 0x9E79: 0xFB79, - 0x9E7A: 0xFB7A, - 0x9E7B: 0xFB7B, - 0x9E7C: 0xFB7C, - 0x9E7D: 0xFB7D, - 0x9E7E: 0xF5BA, - 0x9E7F: 0xC2B9, - 0x9E80: 0xFB7E, - 0x9E81: 0xFB80, - 0x9E82: 0xF7E4, - 0x9E83: 0xFB81, - 0x9E84: 0xFB82, - 0x9E85: 0xFB83, - 0x9E86: 0xFB84, - 0x9E87: 0xF7E5, - 0x9E88: 0xF7E6, - 0x9E89: 0xFB85, - 0x9E8A: 0xFB86, - 0x9E8B: 0xF7E7, - 0x9E8C: 0xFB87, - 0x9E8D: 0xFB88, - 0x9E8E: 0xFB89, - 0x9E8F: 0xFB8A, - 0x9E90: 0xFB8B, - 0x9E91: 0xFB8C, - 0x9E92: 0xF7E8, - 0x9E93: 0xC2B4, - 0x9E94: 0xFB8D, - 0x9E95: 0xFB8E, - 0x9E96: 0xFB8F, - 0x9E97: 0xFB90, - 0x9E98: 0xFB91, - 0x9E99: 0xFB92, - 0x9E9A: 0xFB93, - 0x9E9B: 0xFB94, - 0x9E9C: 0xFB95, - 0x9E9D: 0xF7EA, - 0x9E9E: 0xFB96, - 0x9E9F: 0xF7EB, - 0x9EA0: 0xFB97, - 0x9EA1: 0xFB98, - 0x9EA2: 0xFB99, - 0x9EA3: 0xFB9A, - 0x9EA4: 0xFB9B, - 0x9EA5: 0xFB9C, - 0x9EA6: 0xC2F3, - 0x9EA7: 0xFB9D, - 0x9EA8: 0xFB9E, - 0x9EA9: 0xFB9F, - 0x9EAA: 0xFBA0, - 0x9EAB: 0xFC40, - 0x9EAC: 0xFC41, - 0x9EAD: 0xFC42, - 0x9EAE: 0xFC43, - 0x9EAF: 0xFC44, - 0x9EB0: 0xFC45, - 0x9EB1: 0xFC46, - 0x9EB2: 0xFC47, - 0x9EB3: 0xFC48, - 0x9EB4: 0xF4F0, - 0x9EB5: 0xFC49, - 0x9EB6: 0xFC4A, - 0x9EB7: 0xFC4B, - 0x9EB8: 0xF4EF, - 0x9EB9: 0xFC4C, - 0x9EBA: 0xFC4D, - 0x9EBB: 0xC2E9, - 0x9EBC: 0xFC4E, - 0x9EBD: 0xF7E1, - 0x9EBE: 0xF7E2, - 0x9EBF: 0xFC4F, - 0x9EC0: 0xFC50, - 0x9EC1: 0xFC51, - 0x9EC2: 0xFC52, - 0x9EC3: 0xFC53, - 0x9EC4: 0xBBC6, - 0x9EC5: 0xFC54, - 0x9EC6: 0xFC55, - 0x9EC7: 0xFC56, - 0x9EC8: 0xFC57, - 0x9EC9: 0xD9E4, - 0x9ECA: 0xFC58, - 0x9ECB: 0xFC59, - 0x9ECC: 0xFC5A, - 0x9ECD: 0xCAF2, - 0x9ECE: 0xC0E8, - 0x9ECF: 0xF0A4, - 0x9ED0: 0xFC5B, - 0x9ED1: 0xBADA, - 0x9ED2: 0xFC5C, - 0x9ED3: 0xFC5D, - 0x9ED4: 0xC7AD, - 0x9ED5: 0xFC5E, - 0x9ED6: 0xFC5F, - 0x9ED7: 0xFC60, - 0x9ED8: 0xC4AC, - 0x9ED9: 0xFC61, - 0x9EDA: 0xFC62, - 0x9EDB: 0xF7EC, - 0x9EDC: 0xF7ED, - 0x9EDD: 0xF7EE, - 0x9EDE: 0xFC63, - 0x9EDF: 0xF7F0, - 0x9EE0: 0xF7EF, - 0x9EE1: 0xFC64, - 0x9EE2: 0xF7F1, - 0x9EE3: 0xFC65, - 0x9EE4: 0xFC66, - 0x9EE5: 0xF7F4, - 0x9EE6: 0xFC67, - 0x9EE7: 0xF7F3, - 0x9EE8: 0xFC68, - 0x9EE9: 0xF7F2, - 0x9EEA: 0xF7F5, - 0x9EEB: 0xFC69, - 0x9EEC: 0xFC6A, - 0x9EED: 0xFC6B, - 0x9EEE: 0xFC6C, - 0x9EEF: 0xF7F6, - 0x9EF0: 0xFC6D, - 0x9EF1: 0xFC6E, - 0x9EF2: 0xFC6F, - 0x9EF3: 0xFC70, - 0x9EF4: 0xFC71, - 0x9EF5: 0xFC72, - 0x9EF6: 0xFC73, - 0x9EF7: 0xFC74, - 0x9EF8: 0xFC75, - 0x9EF9: 0xEDE9, - 0x9EFA: 0xFC76, - 0x9EFB: 0xEDEA, - 0x9EFC: 0xEDEB, - 0x9EFD: 0xFC77, - 0x9EFE: 0xF6BC, - 0x9EFF: 0xFC78, - 0x9F00: 0xFC79, - 0x9F01: 0xFC7A, - 0x9F02: 0xFC7B, - 0x9F03: 0xFC7C, - 0x9F04: 0xFC7D, - 0x9F05: 0xFC7E, - 0x9F06: 0xFC80, - 0x9F07: 0xFC81, - 0x9F08: 0xFC82, - 0x9F09: 0xFC83, - 0x9F0A: 0xFC84, - 0x9F0B: 0xF6BD, - 0x9F0C: 0xFC85, - 0x9F0D: 0xF6BE, - 0x9F0E: 0xB6A6, - 0x9F0F: 0xFC86, - 0x9F10: 0xD8BE, - 0x9F11: 0xFC87, - 0x9F12: 0xFC88, - 0x9F13: 0xB9C4, - 0x9F14: 0xFC89, - 0x9F15: 0xFC8A, - 0x9F16: 0xFC8B, - 0x9F17: 0xD8BB, - 0x9F18: 0xFC8C, - 0x9F19: 0xDCB1, - 0x9F1A: 0xFC8D, - 0x9F1B: 0xFC8E, - 0x9F1C: 0xFC8F, - 0x9F1D: 0xFC90, - 0x9F1E: 0xFC91, - 0x9F1F: 0xFC92, - 0x9F20: 0xCAF3, - 0x9F21: 0xFC93, - 0x9F22: 0xF7F7, - 0x9F23: 0xFC94, - 0x9F24: 0xFC95, - 0x9F25: 0xFC96, - 0x9F26: 0xFC97, - 0x9F27: 0xFC98, - 0x9F28: 0xFC99, - 0x9F29: 0xFC9A, - 0x9F2A: 0xFC9B, - 0x9F2B: 0xFC9C, - 0x9F2C: 0xF7F8, - 0x9F2D: 0xFC9D, - 0x9F2E: 0xFC9E, - 0x9F2F: 0xF7F9, - 0x9F30: 0xFC9F, - 0x9F31: 0xFCA0, - 0x9F32: 0xFD40, - 0x9F33: 0xFD41, - 0x9F34: 0xFD42, - 0x9F35: 0xFD43, - 0x9F36: 0xFD44, - 0x9F37: 0xF7FB, - 0x9F38: 0xFD45, - 0x9F39: 0xF7FA, - 0x9F3A: 0xFD46, - 0x9F3B: 0xB1C7, - 0x9F3C: 0xFD47, - 0x9F3D: 0xF7FC, - 0x9F3E: 0xF7FD, - 0x9F3F: 0xFD48, - 0x9F40: 0xFD49, - 0x9F41: 0xFD4A, - 0x9F42: 0xFD4B, - 0x9F43: 0xFD4C, - 0x9F44: 0xF7FE, - 0x9F45: 0xFD4D, - 0x9F46: 0xFD4E, - 0x9F47: 0xFD4F, - 0x9F48: 0xFD50, - 0x9F49: 0xFD51, - 0x9F4A: 0xFD52, - 0x9F4B: 0xFD53, - 0x9F4C: 0xFD54, - 0x9F4D: 0xFD55, - 0x9F4E: 0xFD56, - 0x9F4F: 0xFD57, - 0x9F50: 0xC6EB, - 0x9F51: 0xECB4, - 0x9F52: 0xFD58, - 0x9F53: 0xFD59, - 0x9F54: 0xFD5A, - 0x9F55: 0xFD5B, - 0x9F56: 0xFD5C, - 0x9F57: 0xFD5D, - 0x9F58: 0xFD5E, - 0x9F59: 0xFD5F, - 0x9F5A: 0xFD60, - 0x9F5B: 0xFD61, - 0x9F5C: 0xFD62, - 0x9F5D: 0xFD63, - 0x9F5E: 0xFD64, - 0x9F5F: 0xFD65, - 0x9F60: 0xFD66, - 0x9F61: 0xFD67, - 0x9F62: 0xFD68, - 0x9F63: 0xFD69, - 0x9F64: 0xFD6A, - 0x9F65: 0xFD6B, - 0x9F66: 0xFD6C, - 0x9F67: 0xFD6D, - 0x9F68: 0xFD6E, - 0x9F69: 0xFD6F, - 0x9F6A: 0xFD70, - 0x9F6B: 0xFD71, - 0x9F6C: 0xFD72, - 0x9F6D: 0xFD73, - 0x9F6E: 0xFD74, - 0x9F6F: 0xFD75, - 0x9F70: 0xFD76, - 0x9F71: 0xFD77, - 0x9F72: 0xFD78, - 0x9F73: 0xFD79, - 0x9F74: 0xFD7A, - 0x9F75: 0xFD7B, - 0x9F76: 0xFD7C, - 0x9F77: 0xFD7D, - 0x9F78: 0xFD7E, - 0x9F79: 0xFD80, - 0x9F7A: 0xFD81, - 0x9F7B: 0xFD82, - 0x9F7C: 0xFD83, - 0x9F7D: 0xFD84, - 0x9F7E: 0xFD85, - 0x9F7F: 0xB3DD, - 0x9F80: 0xF6B3, - 0x9F81: 0xFD86, - 0x9F82: 0xFD87, - 0x9F83: 0xF6B4, - 0x9F84: 0xC1E4, - 0x9F85: 0xF6B5, - 0x9F86: 0xF6B6, - 0x9F87: 0xF6B7, - 0x9F88: 0xF6B8, - 0x9F89: 0xF6B9, - 0x9F8A: 0xF6BA, - 0x9F8B: 0xC8A3, - 0x9F8C: 0xF6BB, - 0x9F8D: 0xFD88, - 0x9F8E: 0xFD89, - 0x9F8F: 0xFD8A, - 0x9F90: 0xFD8B, - 0x9F91: 0xFD8C, - 0x9F92: 0xFD8D, - 0x9F93: 0xFD8E, - 0x9F94: 0xFD8F, - 0x9F95: 0xFD90, - 0x9F96: 0xFD91, - 0x9F97: 0xFD92, - 0x9F98: 0xFD93, - 0x9F99: 0xC1FA, - 0x9F9A: 0xB9A8, - 0x9F9B: 0xEDE8, - 0x9F9C: 0xFD94, - 0x9F9D: 0xFD95, - 0x9F9E: 0xFD96, - 0x9F9F: 0xB9EA, - 0x9FA0: 0xD9DF, - 0x9FA1: 0xFD97, - 0x9FA2: 0xFD98, - 0x9FA3: 0xFD99, - 0x9FA4: 0xFD9A, - 0x9FA5: 0xFD9B, - 0x9FB4: 0xFE59, - 0x9FB5: 0xFE61, - 0x9FB6: 0xFE66, - 0x9FB7: 0xFE67, - 0x9FB8: 0xFE6D, - 0x9FB9: 0xFE7E, - 0x9FBA: 0xFE90, - 0x9FBB: 0xFEA0, - 0xE000: 0xAAA1, - 0xE001: 0xAAA2, - 0xE002: 0xAAA3, - 0xE003: 0xAAA4, - 0xE004: 0xAAA5, - 0xE005: 0xAAA6, - 0xE006: 0xAAA7, - 0xE007: 0xAAA8, - 0xE008: 0xAAA9, - 0xE009: 0xAAAA, - 0xE00A: 0xAAAB, - 0xE00B: 0xAAAC, - 0xE00C: 0xAAAD, - 0xE00D: 0xAAAE, - 0xE00E: 0xAAAF, - 0xE00F: 0xAAB0, - 0xE010: 0xAAB1, - 0xE011: 0xAAB2, - 0xE012: 0xAAB3, - 0xE013: 0xAAB4, - 0xE014: 0xAAB5, - 0xE015: 0xAAB6, - 0xE016: 0xAAB7, - 0xE017: 0xAAB8, - 0xE018: 0xAAB9, - 0xE019: 0xAABA, - 0xE01A: 0xAABB, - 0xE01B: 0xAABC, - 0xE01C: 0xAABD, - 0xE01D: 0xAABE, - 0xE01E: 0xAABF, - 0xE01F: 0xAAC0, - 0xE020: 0xAAC1, - 0xE021: 0xAAC2, - 0xE022: 0xAAC3, - 0xE023: 0xAAC4, - 0xE024: 0xAAC5, - 0xE025: 0xAAC6, - 0xE026: 0xAAC7, - 0xE027: 0xAAC8, - 0xE028: 0xAAC9, - 0xE029: 0xAACA, - 0xE02A: 0xAACB, - 0xE02B: 0xAACC, - 0xE02C: 0xAACD, - 0xE02D: 0xAACE, - 0xE02E: 0xAACF, - 0xE02F: 0xAAD0, - 0xE030: 0xAAD1, - 0xE031: 0xAAD2, - 0xE032: 0xAAD3, - 0xE033: 0xAAD4, - 0xE034: 0xAAD5, - 0xE035: 0xAAD6, - 0xE036: 0xAAD7, - 0xE037: 0xAAD8, - 0xE038: 0xAAD9, - 0xE039: 0xAADA, - 0xE03A: 0xAADB, - 0xE03B: 0xAADC, - 0xE03C: 0xAADD, - 0xE03D: 0xAADE, - 0xE03E: 0xAADF, - 0xE03F: 0xAAE0, - 0xE040: 0xAAE1, - 0xE041: 0xAAE2, - 0xE042: 0xAAE3, - 0xE043: 0xAAE4, - 0xE044: 0xAAE5, - 0xE045: 0xAAE6, - 0xE046: 0xAAE7, - 0xE047: 0xAAE8, - 0xE048: 0xAAE9, - 0xE049: 0xAAEA, - 0xE04A: 0xAAEB, - 0xE04B: 0xAAEC, - 0xE04C: 0xAAED, - 0xE04D: 0xAAEE, - 0xE04E: 0xAAEF, - 0xE04F: 0xAAF0, - 0xE050: 0xAAF1, - 0xE051: 0xAAF2, - 0xE052: 0xAAF3, - 0xE053: 0xAAF4, - 0xE054: 0xAAF5, - 0xE055: 0xAAF6, - 0xE056: 0xAAF7, - 0xE057: 0xAAF8, - 0xE058: 0xAAF9, - 0xE059: 0xAAFA, - 0xE05A: 0xAAFB, - 0xE05B: 0xAAFC, - 0xE05C: 0xAAFD, - 0xE05D: 0xAAFE, - 0xE05E: 0xABA1, - 0xE05F: 0xABA2, - 0xE060: 0xABA3, - 0xE061: 0xABA4, - 0xE062: 0xABA5, - 0xE063: 0xABA6, - 0xE064: 0xABA7, - 0xE065: 0xABA8, - 0xE066: 0xABA9, - 0xE067: 0xABAA, - 0xE068: 0xABAB, - 0xE069: 0xABAC, - 0xE06A: 0xABAD, - 0xE06B: 0xABAE, - 0xE06C: 0xABAF, - 0xE06D: 0xABB0, - 0xE06E: 0xABB1, - 0xE06F: 0xABB2, - 0xE070: 0xABB3, - 0xE071: 0xABB4, - 0xE072: 0xABB5, - 0xE073: 0xABB6, - 0xE074: 0xABB7, - 0xE075: 0xABB8, - 0xE076: 0xABB9, - 0xE077: 0xABBA, - 0xE078: 0xABBB, - 0xE079: 0xABBC, - 0xE07A: 0xABBD, - 0xE07B: 0xABBE, - 0xE07C: 0xABBF, - 0xE07D: 0xABC0, - 0xE07E: 0xABC1, - 0xE07F: 0xABC2, - 0xE080: 0xABC3, - 0xE081: 0xABC4, - 0xE082: 0xABC5, - 0xE083: 0xABC6, - 0xE084: 0xABC7, - 0xE085: 0xABC8, - 0xE086: 0xABC9, - 0xE087: 0xABCA, - 0xE088: 0xABCB, - 0xE089: 0xABCC, - 0xE08A: 0xABCD, - 0xE08B: 0xABCE, - 0xE08C: 0xABCF, - 0xE08D: 0xABD0, - 0xE08E: 0xABD1, - 0xE08F: 0xABD2, - 0xE090: 0xABD3, - 0xE091: 0xABD4, - 0xE092: 0xABD5, - 0xE093: 0xABD6, - 0xE094: 0xABD7, - 0xE095: 0xABD8, - 0xE096: 0xABD9, - 0xE097: 0xABDA, - 0xE098: 0xABDB, - 0xE099: 0xABDC, - 0xE09A: 0xABDD, - 0xE09B: 0xABDE, - 0xE09C: 0xABDF, - 0xE09D: 0xABE0, - 0xE09E: 0xABE1, - 0xE09F: 0xABE2, - 0xE0A0: 0xABE3, - 0xE0A1: 0xABE4, - 0xE0A2: 0xABE5, - 0xE0A3: 0xABE6, - 0xE0A4: 0xABE7, - 0xE0A5: 0xABE8, - 0xE0A6: 0xABE9, - 0xE0A7: 0xABEA, - 0xE0A8: 0xABEB, - 0xE0A9: 0xABEC, - 0xE0AA: 0xABED, - 0xE0AB: 0xABEE, - 0xE0AC: 0xABEF, - 0xE0AD: 0xABF0, - 0xE0AE: 0xABF1, - 0xE0AF: 0xABF2, - 0xE0B0: 0xABF3, - 0xE0B1: 0xABF4, - 0xE0B2: 0xABF5, - 0xE0B3: 0xABF6, - 0xE0B4: 0xABF7, - 0xE0B5: 0xABF8, - 0xE0B6: 0xABF9, - 0xE0B7: 0xABFA, - 0xE0B8: 0xABFB, - 0xE0B9: 0xABFC, - 0xE0BA: 0xABFD, - 0xE0BB: 0xABFE, - 0xE0BC: 0xACA1, - 0xE0BD: 0xACA2, - 0xE0BE: 0xACA3, - 0xE0BF: 0xACA4, - 0xE0C0: 0xACA5, - 0xE0C1: 0xACA6, - 0xE0C2: 0xACA7, - 0xE0C3: 0xACA8, - 0xE0C4: 0xACA9, - 0xE0C5: 0xACAA, - 0xE0C6: 0xACAB, - 0xE0C7: 0xACAC, - 0xE0C8: 0xACAD, - 0xE0C9: 0xACAE, - 0xE0CA: 0xACAF, - 0xE0CB: 0xACB0, - 0xE0CC: 0xACB1, - 0xE0CD: 0xACB2, - 0xE0CE: 0xACB3, - 0xE0CF: 0xACB4, - 0xE0D0: 0xACB5, - 0xE0D1: 0xACB6, - 0xE0D2: 0xACB7, - 0xE0D3: 0xACB8, - 0xE0D4: 0xACB9, - 0xE0D5: 0xACBA, - 0xE0D6: 0xACBB, - 0xE0D7: 0xACBC, - 0xE0D8: 0xACBD, - 0xE0D9: 0xACBE, - 0xE0DA: 0xACBF, - 0xE0DB: 0xACC0, - 0xE0DC: 0xACC1, - 0xE0DD: 0xACC2, - 0xE0DE: 0xACC3, - 0xE0DF: 0xACC4, - 0xE0E0: 0xACC5, - 0xE0E1: 0xACC6, - 0xE0E2: 0xACC7, - 0xE0E3: 0xACC8, - 0xE0E4: 0xACC9, - 0xE0E5: 0xACCA, - 0xE0E6: 0xACCB, - 0xE0E7: 0xACCC, - 0xE0E8: 0xACCD, - 0xE0E9: 0xACCE, - 0xE0EA: 0xACCF, - 0xE0EB: 0xACD0, - 0xE0EC: 0xACD1, - 0xE0ED: 0xACD2, - 0xE0EE: 0xACD3, - 0xE0EF: 0xACD4, - 0xE0F0: 0xACD5, - 0xE0F1: 0xACD6, - 0xE0F2: 0xACD7, - 0xE0F3: 0xACD8, - 0xE0F4: 0xACD9, - 0xE0F5: 0xACDA, - 0xE0F6: 0xACDB, - 0xE0F7: 0xACDC, - 0xE0F8: 0xACDD, - 0xE0F9: 0xACDE, - 0xE0FA: 0xACDF, - 0xE0FB: 0xACE0, - 0xE0FC: 0xACE1, - 0xE0FD: 0xACE2, - 0xE0FE: 0xACE3, - 0xE0FF: 0xACE4, - 0xE100: 0xACE5, - 0xE101: 0xACE6, - 0xE102: 0xACE7, - 0xE103: 0xACE8, - 0xE104: 0xACE9, - 0xE105: 0xACEA, - 0xE106: 0xACEB, - 0xE107: 0xACEC, - 0xE108: 0xACED, - 0xE109: 0xACEE, - 0xE10A: 0xACEF, - 0xE10B: 0xACF0, - 0xE10C: 0xACF1, - 0xE10D: 0xACF2, - 0xE10E: 0xACF3, - 0xE10F: 0xACF4, - 0xE110: 0xACF5, - 0xE111: 0xACF6, - 0xE112: 0xACF7, - 0xE113: 0xACF8, - 0xE114: 0xACF9, - 0xE115: 0xACFA, - 0xE116: 0xACFB, - 0xE117: 0xACFC, - 0xE118: 0xACFD, - 0xE119: 0xACFE, - 0xE11A: 0xADA1, - 0xE11B: 0xADA2, - 0xE11C: 0xADA3, - 0xE11D: 0xADA4, - 0xE11E: 0xADA5, - 0xE11F: 0xADA6, - 0xE120: 0xADA7, - 0xE121: 0xADA8, - 0xE122: 0xADA9, - 0xE123: 0xADAA, - 0xE124: 0xADAB, - 0xE125: 0xADAC, - 0xE126: 0xADAD, - 0xE127: 0xADAE, - 0xE128: 0xADAF, - 0xE129: 0xADB0, - 0xE12A: 0xADB1, - 0xE12B: 0xADB2, - 0xE12C: 0xADB3, - 0xE12D: 0xADB4, - 0xE12E: 0xADB5, - 0xE12F: 0xADB6, - 0xE130: 0xADB7, - 0xE131: 0xADB8, - 0xE132: 0xADB9, - 0xE133: 0xADBA, - 0xE134: 0xADBB, - 0xE135: 0xADBC, - 0xE136: 0xADBD, - 0xE137: 0xADBE, - 0xE138: 0xADBF, - 0xE139: 0xADC0, - 0xE13A: 0xADC1, - 0xE13B: 0xADC2, - 0xE13C: 0xADC3, - 0xE13D: 0xADC4, - 0xE13E: 0xADC5, - 0xE13F: 0xADC6, - 0xE140: 0xADC7, - 0xE141: 0xADC8, - 0xE142: 0xADC9, - 0xE143: 0xADCA, - 0xE144: 0xADCB, - 0xE145: 0xADCC, - 0xE146: 0xADCD, - 0xE147: 0xADCE, - 0xE148: 0xADCF, - 0xE149: 0xADD0, - 0xE14A: 0xADD1, - 0xE14B: 0xADD2, - 0xE14C: 0xADD3, - 0xE14D: 0xADD4, - 0xE14E: 0xADD5, - 0xE14F: 0xADD6, - 0xE150: 0xADD7, - 0xE151: 0xADD8, - 0xE152: 0xADD9, - 0xE153: 0xADDA, - 0xE154: 0xADDB, - 0xE155: 0xADDC, - 0xE156: 0xADDD, - 0xE157: 0xADDE, - 0xE158: 0xADDF, - 0xE159: 0xADE0, - 0xE15A: 0xADE1, - 0xE15B: 0xADE2, - 0xE15C: 0xADE3, - 0xE15D: 0xADE4, - 0xE15E: 0xADE5, - 0xE15F: 0xADE6, - 0xE160: 0xADE7, - 0xE161: 0xADE8, - 0xE162: 0xADE9, - 0xE163: 0xADEA, - 0xE164: 0xADEB, - 0xE165: 0xADEC, - 0xE166: 0xADED, - 0xE167: 0xADEE, - 0xE168: 0xADEF, - 0xE169: 0xADF0, - 0xE16A: 0xADF1, - 0xE16B: 0xADF2, - 0xE16C: 0xADF3, - 0xE16D: 0xADF4, - 0xE16E: 0xADF5, - 0xE16F: 0xADF6, - 0xE170: 0xADF7, - 0xE171: 0xADF8, - 0xE172: 0xADF9, - 0xE173: 0xADFA, - 0xE174: 0xADFB, - 0xE175: 0xADFC, - 0xE176: 0xADFD, - 0xE177: 0xADFE, - 0xE178: 0xAEA1, - 0xE179: 0xAEA2, - 0xE17A: 0xAEA3, - 0xE17B: 0xAEA4, - 0xE17C: 0xAEA5, - 0xE17D: 0xAEA6, - 0xE17E: 0xAEA7, - 0xE17F: 0xAEA8, - 0xE180: 0xAEA9, - 0xE181: 0xAEAA, - 0xE182: 0xAEAB, - 0xE183: 0xAEAC, - 0xE184: 0xAEAD, - 0xE185: 0xAEAE, - 0xE186: 0xAEAF, - 0xE187: 0xAEB0, - 0xE188: 0xAEB1, - 0xE189: 0xAEB2, - 0xE18A: 0xAEB3, - 0xE18B: 0xAEB4, - 0xE18C: 0xAEB5, - 0xE18D: 0xAEB6, - 0xE18E: 0xAEB7, - 0xE18F: 0xAEB8, - 0xE190: 0xAEB9, - 0xE191: 0xAEBA, - 0xE192: 0xAEBB, - 0xE193: 0xAEBC, - 0xE194: 0xAEBD, - 0xE195: 0xAEBE, - 0xE196: 0xAEBF, - 0xE197: 0xAEC0, - 0xE198: 0xAEC1, - 0xE199: 0xAEC2, - 0xE19A: 0xAEC3, - 0xE19B: 0xAEC4, - 0xE19C: 0xAEC5, - 0xE19D: 0xAEC6, - 0xE19E: 0xAEC7, - 0xE19F: 0xAEC8, - 0xE1A0: 0xAEC9, - 0xE1A1: 0xAECA, - 0xE1A2: 0xAECB, - 0xE1A3: 0xAECC, - 0xE1A4: 0xAECD, - 0xE1A5: 0xAECE, - 0xE1A6: 0xAECF, - 0xE1A7: 0xAED0, - 0xE1A8: 0xAED1, - 0xE1A9: 0xAED2, - 0xE1AA: 0xAED3, - 0xE1AB: 0xAED4, - 0xE1AC: 0xAED5, - 0xE1AD: 0xAED6, - 0xE1AE: 0xAED7, - 0xE1AF: 0xAED8, - 0xE1B0: 0xAED9, - 0xE1B1: 0xAEDA, - 0xE1B2: 0xAEDB, - 0xE1B3: 0xAEDC, - 0xE1B4: 0xAEDD, - 0xE1B5: 0xAEDE, - 0xE1B6: 0xAEDF, - 0xE1B7: 0xAEE0, - 0xE1B8: 0xAEE1, - 0xE1B9: 0xAEE2, - 0xE1BA: 0xAEE3, - 0xE1BB: 0xAEE4, - 0xE1BC: 0xAEE5, - 0xE1BD: 0xAEE6, - 0xE1BE: 0xAEE7, - 0xE1BF: 0xAEE8, - 0xE1C0: 0xAEE9, - 0xE1C1: 0xAEEA, - 0xE1C2: 0xAEEB, - 0xE1C3: 0xAEEC, - 0xE1C4: 0xAEED, - 0xE1C5: 0xAEEE, - 0xE1C6: 0xAEEF, - 0xE1C7: 0xAEF0, - 0xE1C8: 0xAEF1, - 0xE1C9: 0xAEF2, - 0xE1CA: 0xAEF3, - 0xE1CB: 0xAEF4, - 0xE1CC: 0xAEF5, - 0xE1CD: 0xAEF6, - 0xE1CE: 0xAEF7, - 0xE1CF: 0xAEF8, - 0xE1D0: 0xAEF9, - 0xE1D1: 0xAEFA, - 0xE1D2: 0xAEFB, - 0xE1D3: 0xAEFC, - 0xE1D4: 0xAEFD, - 0xE1D5: 0xAEFE, - 0xE1D6: 0xAFA1, - 0xE1D7: 0xAFA2, - 0xE1D8: 0xAFA3, - 0xE1D9: 0xAFA4, - 0xE1DA: 0xAFA5, - 0xE1DB: 0xAFA6, - 0xE1DC: 0xAFA7, - 0xE1DD: 0xAFA8, - 0xE1DE: 0xAFA9, - 0xE1DF: 0xAFAA, - 0xE1E0: 0xAFAB, - 0xE1E1: 0xAFAC, - 0xE1E2: 0xAFAD, - 0xE1E3: 0xAFAE, - 0xE1E4: 0xAFAF, - 0xE1E5: 0xAFB0, - 0xE1E6: 0xAFB1, - 0xE1E7: 0xAFB2, - 0xE1E8: 0xAFB3, - 0xE1E9: 0xAFB4, - 0xE1EA: 0xAFB5, - 0xE1EB: 0xAFB6, - 0xE1EC: 0xAFB7, - 0xE1ED: 0xAFB8, - 0xE1EE: 0xAFB9, - 0xE1EF: 0xAFBA, - 0xE1F0: 0xAFBB, - 0xE1F1: 0xAFBC, - 0xE1F2: 0xAFBD, - 0xE1F3: 0xAFBE, - 0xE1F4: 0xAFBF, - 0xE1F5: 0xAFC0, - 0xE1F6: 0xAFC1, - 0xE1F7: 0xAFC2, - 0xE1F8: 0xAFC3, - 0xE1F9: 0xAFC4, - 0xE1FA: 0xAFC5, - 0xE1FB: 0xAFC6, - 0xE1FC: 0xAFC7, - 0xE1FD: 0xAFC8, - 0xE1FE: 0xAFC9, - 0xE1FF: 0xAFCA, - 0xE200: 0xAFCB, - 0xE201: 0xAFCC, - 0xE202: 0xAFCD, - 0xE203: 0xAFCE, - 0xE204: 0xAFCF, - 0xE205: 0xAFD0, - 0xE206: 0xAFD1, - 0xE207: 0xAFD2, - 0xE208: 0xAFD3, - 0xE209: 0xAFD4, - 0xE20A: 0xAFD5, - 0xE20B: 0xAFD6, - 0xE20C: 0xAFD7, - 0xE20D: 0xAFD8, - 0xE20E: 0xAFD9, - 0xE20F: 0xAFDA, - 0xE210: 0xAFDB, - 0xE211: 0xAFDC, - 0xE212: 0xAFDD, - 0xE213: 0xAFDE, - 0xE214: 0xAFDF, - 0xE215: 0xAFE0, - 0xE216: 0xAFE1, - 0xE217: 0xAFE2, - 0xE218: 0xAFE3, - 0xE219: 0xAFE4, - 0xE21A: 0xAFE5, - 0xE21B: 0xAFE6, - 0xE21C: 0xAFE7, - 0xE21D: 0xAFE8, - 0xE21E: 0xAFE9, - 0xE21F: 0xAFEA, - 0xE220: 0xAFEB, - 0xE221: 0xAFEC, - 0xE222: 0xAFED, - 0xE223: 0xAFEE, - 0xE224: 0xAFEF, - 0xE225: 0xAFF0, - 0xE226: 0xAFF1, - 0xE227: 0xAFF2, - 0xE228: 0xAFF3, - 0xE229: 0xAFF4, - 0xE22A: 0xAFF5, - 0xE22B: 0xAFF6, - 0xE22C: 0xAFF7, - 0xE22D: 0xAFF8, - 0xE22E: 0xAFF9, - 0xE22F: 0xAFFA, - 0xE230: 0xAFFB, - 0xE231: 0xAFFC, - 0xE232: 0xAFFD, - 0xE233: 0xAFFE, - 0xE234: 0xF8A1, - 0xE235: 0xF8A2, - 0xE236: 0xF8A3, - 0xE237: 0xF8A4, - 0xE238: 0xF8A5, - 0xE239: 0xF8A6, - 0xE23A: 0xF8A7, - 0xE23B: 0xF8A8, - 0xE23C: 0xF8A9, - 0xE23D: 0xF8AA, - 0xE23E: 0xF8AB, - 0xE23F: 0xF8AC, - 0xE240: 0xF8AD, - 0xE241: 0xF8AE, - 0xE242: 0xF8AF, - 0xE243: 0xF8B0, - 0xE244: 0xF8B1, - 0xE245: 0xF8B2, - 0xE246: 0xF8B3, - 0xE247: 0xF8B4, - 0xE248: 0xF8B5, - 0xE249: 0xF8B6, - 0xE24A: 0xF8B7, - 0xE24B: 0xF8B8, - 0xE24C: 0xF8B9, - 0xE24D: 0xF8BA, - 0xE24E: 0xF8BB, - 0xE24F: 0xF8BC, - 0xE250: 0xF8BD, - 0xE251: 0xF8BE, - 0xE252: 0xF8BF, - 0xE253: 0xF8C0, - 0xE254: 0xF8C1, - 0xE255: 0xF8C2, - 0xE256: 0xF8C3, - 0xE257: 0xF8C4, - 0xE258: 0xF8C5, - 0xE259: 0xF8C6, - 0xE25A: 0xF8C7, - 0xE25B: 0xF8C8, - 0xE25C: 0xF8C9, - 0xE25D: 0xF8CA, - 0xE25E: 0xF8CB, - 0xE25F: 0xF8CC, - 0xE260: 0xF8CD, - 0xE261: 0xF8CE, - 0xE262: 0xF8CF, - 0xE263: 0xF8D0, - 0xE264: 0xF8D1, - 0xE265: 0xF8D2, - 0xE266: 0xF8D3, - 0xE267: 0xF8D4, - 0xE268: 0xF8D5, - 0xE269: 0xF8D6, - 0xE26A: 0xF8D7, - 0xE26B: 0xF8D8, - 0xE26C: 0xF8D9, - 0xE26D: 0xF8DA, - 0xE26E: 0xF8DB, - 0xE26F: 0xF8DC, - 0xE270: 0xF8DD, - 0xE271: 0xF8DE, - 0xE272: 0xF8DF, - 0xE273: 0xF8E0, - 0xE274: 0xF8E1, - 0xE275: 0xF8E2, - 0xE276: 0xF8E3, - 0xE277: 0xF8E4, - 0xE278: 0xF8E5, - 0xE279: 0xF8E6, - 0xE27A: 0xF8E7, - 0xE27B: 0xF8E8, - 0xE27C: 0xF8E9, - 0xE27D: 0xF8EA, - 0xE27E: 0xF8EB, - 0xE27F: 0xF8EC, - 0xE280: 0xF8ED, - 0xE281: 0xF8EE, - 0xE282: 0xF8EF, - 0xE283: 0xF8F0, - 0xE284: 0xF8F1, - 0xE285: 0xF8F2, - 0xE286: 0xF8F3, - 0xE287: 0xF8F4, - 0xE288: 0xF8F5, - 0xE289: 0xF8F6, - 0xE28A: 0xF8F7, - 0xE28B: 0xF8F8, - 0xE28C: 0xF8F9, - 0xE28D: 0xF8FA, - 0xE28E: 0xF8FB, - 0xE28F: 0xF8FC, - 0xE290: 0xF8FD, - 0xE291: 0xF8FE, - 0xE292: 0xF9A1, - 0xE293: 0xF9A2, - 0xE294: 0xF9A3, - 0xE295: 0xF9A4, - 0xE296: 0xF9A5, - 0xE297: 0xF9A6, - 0xE298: 0xF9A7, - 0xE299: 0xF9A8, - 0xE29A: 0xF9A9, - 0xE29B: 0xF9AA, - 0xE29C: 0xF9AB, - 0xE29D: 0xF9AC, - 0xE29E: 0xF9AD, - 0xE29F: 0xF9AE, - 0xE2A0: 0xF9AF, - 0xE2A1: 0xF9B0, - 0xE2A2: 0xF9B1, - 0xE2A3: 0xF9B2, - 0xE2A4: 0xF9B3, - 0xE2A5: 0xF9B4, - 0xE2A6: 0xF9B5, - 0xE2A7: 0xF9B6, - 0xE2A8: 0xF9B7, - 0xE2A9: 0xF9B8, - 0xE2AA: 0xF9B9, - 0xE2AB: 0xF9BA, - 0xE2AC: 0xF9BB, - 0xE2AD: 0xF9BC, - 0xE2AE: 0xF9BD, - 0xE2AF: 0xF9BE, - 0xE2B0: 0xF9BF, - 0xE2B1: 0xF9C0, - 0xE2B2: 0xF9C1, - 0xE2B3: 0xF9C2, - 0xE2B4: 0xF9C3, - 0xE2B5: 0xF9C4, - 0xE2B6: 0xF9C5, - 0xE2B7: 0xF9C6, - 0xE2B8: 0xF9C7, - 0xE2B9: 0xF9C8, - 0xE2BA: 0xF9C9, - 0xE2BB: 0xF9CA, - 0xE2BC: 0xF9CB, - 0xE2BD: 0xF9CC, - 0xE2BE: 0xF9CD, - 0xE2BF: 0xF9CE, - 0xE2C0: 0xF9CF, - 0xE2C1: 0xF9D0, - 0xE2C2: 0xF9D1, - 0xE2C3: 0xF9D2, - 0xE2C4: 0xF9D3, - 0xE2C5: 0xF9D4, - 0xE2C6: 0xF9D5, - 0xE2C7: 0xF9D6, - 0xE2C8: 0xF9D7, - 0xE2C9: 0xF9D8, - 0xE2CA: 0xF9D9, - 0xE2CB: 0xF9DA, - 0xE2CC: 0xF9DB, - 0xE2CD: 0xF9DC, - 0xE2CE: 0xF9DD, - 0xE2CF: 0xF9DE, - 0xE2D0: 0xF9DF, - 0xE2D1: 0xF9E0, - 0xE2D2: 0xF9E1, - 0xE2D3: 0xF9E2, - 0xE2D4: 0xF9E3, - 0xE2D5: 0xF9E4, - 0xE2D6: 0xF9E5, - 0xE2D7: 0xF9E6, - 0xE2D8: 0xF9E7, - 0xE2D9: 0xF9E8, - 0xE2DA: 0xF9E9, - 0xE2DB: 0xF9EA, - 0xE2DC: 0xF9EB, - 0xE2DD: 0xF9EC, - 0xE2DE: 0xF9ED, - 0xE2DF: 0xF9EE, - 0xE2E0: 0xF9EF, - 0xE2E1: 0xF9F0, - 0xE2E2: 0xF9F1, - 0xE2E3: 0xF9F2, - 0xE2E4: 0xF9F3, - 0xE2E5: 0xF9F4, - 0xE2E6: 0xF9F5, - 0xE2E7: 0xF9F6, - 0xE2E8: 0xF9F7, - 0xE2E9: 0xF9F8, - 0xE2EA: 0xF9F9, - 0xE2EB: 0xF9FA, - 0xE2EC: 0xF9FB, - 0xE2ED: 0xF9FC, - 0xE2EE: 0xF9FD, - 0xE2EF: 0xF9FE, - 0xE2F0: 0xFAA1, - 0xE2F1: 0xFAA2, - 0xE2F2: 0xFAA3, - 0xE2F3: 0xFAA4, - 0xE2F4: 0xFAA5, - 0xE2F5: 0xFAA6, - 0xE2F6: 0xFAA7, - 0xE2F7: 0xFAA8, - 0xE2F8: 0xFAA9, - 0xE2F9: 0xFAAA, - 0xE2FA: 0xFAAB, - 0xE2FB: 0xFAAC, - 0xE2FC: 0xFAAD, - 0xE2FD: 0xFAAE, - 0xE2FE: 0xFAAF, - 0xE2FF: 0xFAB0, - 0xE300: 0xFAB1, - 0xE301: 0xFAB2, - 0xE302: 0xFAB3, - 0xE303: 0xFAB4, - 0xE304: 0xFAB5, - 0xE305: 0xFAB6, - 0xE306: 0xFAB7, - 0xE307: 0xFAB8, - 0xE308: 0xFAB9, - 0xE309: 0xFABA, - 0xE30A: 0xFABB, - 0xE30B: 0xFABC, - 0xE30C: 0xFABD, - 0xE30D: 0xFABE, - 0xE30E: 0xFABF, - 0xE30F: 0xFAC0, - 0xE310: 0xFAC1, - 0xE311: 0xFAC2, - 0xE312: 0xFAC3, - 0xE313: 0xFAC4, - 0xE314: 0xFAC5, - 0xE315: 0xFAC6, - 0xE316: 0xFAC7, - 0xE317: 0xFAC8, - 0xE318: 0xFAC9, - 0xE319: 0xFACA, - 0xE31A: 0xFACB, - 0xE31B: 0xFACC, - 0xE31C: 0xFACD, - 0xE31D: 0xFACE, - 0xE31E: 0xFACF, - 0xE31F: 0xFAD0, - 0xE320: 0xFAD1, - 0xE321: 0xFAD2, - 0xE322: 0xFAD3, - 0xE323: 0xFAD4, - 0xE324: 0xFAD5, - 0xE325: 0xFAD6, - 0xE326: 0xFAD7, - 0xE327: 0xFAD8, - 0xE328: 0xFAD9, - 0xE329: 0xFADA, - 0xE32A: 0xFADB, - 0xE32B: 0xFADC, - 0xE32C: 0xFADD, - 0xE32D: 0xFADE, - 0xE32E: 0xFADF, - 0xE32F: 0xFAE0, - 0xE330: 0xFAE1, - 0xE331: 0xFAE2, - 0xE332: 0xFAE3, - 0xE333: 0xFAE4, - 0xE334: 0xFAE5, - 0xE335: 0xFAE6, - 0xE336: 0xFAE7, - 0xE337: 0xFAE8, - 0xE338: 0xFAE9, - 0xE339: 0xFAEA, - 0xE33A: 0xFAEB, - 0xE33B: 0xFAEC, - 0xE33C: 0xFAED, - 0xE33D: 0xFAEE, - 0xE33E: 0xFAEF, - 0xE33F: 0xFAF0, - 0xE340: 0xFAF1, - 0xE341: 0xFAF2, - 0xE342: 0xFAF3, - 0xE343: 0xFAF4, - 0xE344: 0xFAF5, - 0xE345: 0xFAF6, - 0xE346: 0xFAF7, - 0xE347: 0xFAF8, - 0xE348: 0xFAF9, - 0xE349: 0xFAFA, - 0xE34A: 0xFAFB, - 0xE34B: 0xFAFC, - 0xE34C: 0xFAFD, - 0xE34D: 0xFAFE, - 0xE34E: 0xFBA1, - 0xE34F: 0xFBA2, - 0xE350: 0xFBA3, - 0xE351: 0xFBA4, - 0xE352: 0xFBA5, - 0xE353: 0xFBA6, - 0xE354: 0xFBA7, - 0xE355: 0xFBA8, - 0xE356: 0xFBA9, - 0xE357: 0xFBAA, - 0xE358: 0xFBAB, - 0xE359: 0xFBAC, - 0xE35A: 0xFBAD, - 0xE35B: 0xFBAE, - 0xE35C: 0xFBAF, - 0xE35D: 0xFBB0, - 0xE35E: 0xFBB1, - 0xE35F: 0xFBB2, - 0xE360: 0xFBB3, - 0xE361: 0xFBB4, - 0xE362: 0xFBB5, - 0xE363: 0xFBB6, - 0xE364: 0xFBB7, - 0xE365: 0xFBB8, - 0xE366: 0xFBB9, - 0xE367: 0xFBBA, - 0xE368: 0xFBBB, - 0xE369: 0xFBBC, - 0xE36A: 0xFBBD, - 0xE36B: 0xFBBE, - 0xE36C: 0xFBBF, - 0xE36D: 0xFBC0, - 0xE36E: 0xFBC1, - 0xE36F: 0xFBC2, - 0xE370: 0xFBC3, - 0xE371: 0xFBC4, - 0xE372: 0xFBC5, - 0xE373: 0xFBC6, - 0xE374: 0xFBC7, - 0xE375: 0xFBC8, - 0xE376: 0xFBC9, - 0xE377: 0xFBCA, - 0xE378: 0xFBCB, - 0xE379: 0xFBCC, - 0xE37A: 0xFBCD, - 0xE37B: 0xFBCE, - 0xE37C: 0xFBCF, - 0xE37D: 0xFBD0, - 0xE37E: 0xFBD1, - 0xE37F: 0xFBD2, - 0xE380: 0xFBD3, - 0xE381: 0xFBD4, - 0xE382: 0xFBD5, - 0xE383: 0xFBD6, - 0xE384: 0xFBD7, - 0xE385: 0xFBD8, - 0xE386: 0xFBD9, - 0xE387: 0xFBDA, - 0xE388: 0xFBDB, - 0xE389: 0xFBDC, - 0xE38A: 0xFBDD, - 0xE38B: 0xFBDE, - 0xE38C: 0xFBDF, - 0xE38D: 0xFBE0, - 0xE38E: 0xFBE1, - 0xE38F: 0xFBE2, - 0xE390: 0xFBE3, - 0xE391: 0xFBE4, - 0xE392: 0xFBE5, - 0xE393: 0xFBE6, - 0xE394: 0xFBE7, - 0xE395: 0xFBE8, - 0xE396: 0xFBE9, - 0xE397: 0xFBEA, - 0xE398: 0xFBEB, - 0xE399: 0xFBEC, - 0xE39A: 0xFBED, - 0xE39B: 0xFBEE, - 0xE39C: 0xFBEF, - 0xE39D: 0xFBF0, - 0xE39E: 0xFBF1, - 0xE39F: 0xFBF2, - 0xE3A0: 0xFBF3, - 0xE3A1: 0xFBF4, - 0xE3A2: 0xFBF5, - 0xE3A3: 0xFBF6, - 0xE3A4: 0xFBF7, - 0xE3A5: 0xFBF8, - 0xE3A6: 0xFBF9, - 0xE3A7: 0xFBFA, - 0xE3A8: 0xFBFB, - 0xE3A9: 0xFBFC, - 0xE3AA: 0xFBFD, - 0xE3AB: 0xFBFE, - 0xE3AC: 0xFCA1, - 0xE3AD: 0xFCA2, - 0xE3AE: 0xFCA3, - 0xE3AF: 0xFCA4, - 0xE3B0: 0xFCA5, - 0xE3B1: 0xFCA6, - 0xE3B2: 0xFCA7, - 0xE3B3: 0xFCA8, - 0xE3B4: 0xFCA9, - 0xE3B5: 0xFCAA, - 0xE3B6: 0xFCAB, - 0xE3B7: 0xFCAC, - 0xE3B8: 0xFCAD, - 0xE3B9: 0xFCAE, - 0xE3BA: 0xFCAF, - 0xE3BB: 0xFCB0, - 0xE3BC: 0xFCB1, - 0xE3BD: 0xFCB2, - 0xE3BE: 0xFCB3, - 0xE3BF: 0xFCB4, - 0xE3C0: 0xFCB5, - 0xE3C1: 0xFCB6, - 0xE3C2: 0xFCB7, - 0xE3C3: 0xFCB8, - 0xE3C4: 0xFCB9, - 0xE3C5: 0xFCBA, - 0xE3C6: 0xFCBB, - 0xE3C7: 0xFCBC, - 0xE3C8: 0xFCBD, - 0xE3C9: 0xFCBE, - 0xE3CA: 0xFCBF, - 0xE3CB: 0xFCC0, - 0xE3CC: 0xFCC1, - 0xE3CD: 0xFCC2, - 0xE3CE: 0xFCC3, - 0xE3CF: 0xFCC4, - 0xE3D0: 0xFCC5, - 0xE3D1: 0xFCC6, - 0xE3D2: 0xFCC7, - 0xE3D3: 0xFCC8, - 0xE3D4: 0xFCC9, - 0xE3D5: 0xFCCA, - 0xE3D6: 0xFCCB, - 0xE3D7: 0xFCCC, - 0xE3D8: 0xFCCD, - 0xE3D9: 0xFCCE, - 0xE3DA: 0xFCCF, - 0xE3DB: 0xFCD0, - 0xE3DC: 0xFCD1, - 0xE3DD: 0xFCD2, - 0xE3DE: 0xFCD3, - 0xE3DF: 0xFCD4, - 0xE3E0: 0xFCD5, - 0xE3E1: 0xFCD6, - 0xE3E2: 0xFCD7, - 0xE3E3: 0xFCD8, - 0xE3E4: 0xFCD9, - 0xE3E5: 0xFCDA, - 0xE3E6: 0xFCDB, - 0xE3E7: 0xFCDC, - 0xE3E8: 0xFCDD, - 0xE3E9: 0xFCDE, - 0xE3EA: 0xFCDF, - 0xE3EB: 0xFCE0, - 0xE3EC: 0xFCE1, - 0xE3ED: 0xFCE2, - 0xE3EE: 0xFCE3, - 0xE3EF: 0xFCE4, - 0xE3F0: 0xFCE5, - 0xE3F1: 0xFCE6, - 0xE3F2: 0xFCE7, - 0xE3F3: 0xFCE8, - 0xE3F4: 0xFCE9, - 0xE3F5: 0xFCEA, - 0xE3F6: 0xFCEB, - 0xE3F7: 0xFCEC, - 0xE3F8: 0xFCED, - 0xE3F9: 0xFCEE, - 0xE3FA: 0xFCEF, - 0xE3FB: 0xFCF0, - 0xE3FC: 0xFCF1, - 0xE3FD: 0xFCF2, - 0xE3FE: 0xFCF3, - 0xE3FF: 0xFCF4, - 0xE400: 0xFCF5, - 0xE401: 0xFCF6, - 0xE402: 0xFCF7, - 0xE403: 0xFCF8, - 0xE404: 0xFCF9, - 0xE405: 0xFCFA, - 0xE406: 0xFCFB, - 0xE407: 0xFCFC, - 0xE408: 0xFCFD, - 0xE409: 0xFCFE, - 0xE40A: 0xFDA1, - 0xE40B: 0xFDA2, - 0xE40C: 0xFDA3, - 0xE40D: 0xFDA4, - 0xE40E: 0xFDA5, - 0xE40F: 0xFDA6, - 0xE410: 0xFDA7, - 0xE411: 0xFDA8, - 0xE412: 0xFDA9, - 0xE413: 0xFDAA, - 0xE414: 0xFDAB, - 0xE415: 0xFDAC, - 0xE416: 0xFDAD, - 0xE417: 0xFDAE, - 0xE418: 0xFDAF, - 0xE419: 0xFDB0, - 0xE41A: 0xFDB1, - 0xE41B: 0xFDB2, - 0xE41C: 0xFDB3, - 0xE41D: 0xFDB4, - 0xE41E: 0xFDB5, - 0xE41F: 0xFDB6, - 0xE420: 0xFDB7, - 0xE421: 0xFDB8, - 0xE422: 0xFDB9, - 0xE423: 0xFDBA, - 0xE424: 0xFDBB, - 0xE425: 0xFDBC, - 0xE426: 0xFDBD, - 0xE427: 0xFDBE, - 0xE428: 0xFDBF, - 0xE429: 0xFDC0, - 0xE42A: 0xFDC1, - 0xE42B: 0xFDC2, - 0xE42C: 0xFDC3, - 0xE42D: 0xFDC4, - 0xE42E: 0xFDC5, - 0xE42F: 0xFDC6, - 0xE430: 0xFDC7, - 0xE431: 0xFDC8, - 0xE432: 0xFDC9, - 0xE433: 0xFDCA, - 0xE434: 0xFDCB, - 0xE435: 0xFDCC, - 0xE436: 0xFDCD, - 0xE437: 0xFDCE, - 0xE438: 0xFDCF, - 0xE439: 0xFDD0, - 0xE43A: 0xFDD1, - 0xE43B: 0xFDD2, - 0xE43C: 0xFDD3, - 0xE43D: 0xFDD4, - 0xE43E: 0xFDD5, - 0xE43F: 0xFDD6, - 0xE440: 0xFDD7, - 0xE441: 0xFDD8, - 0xE442: 0xFDD9, - 0xE443: 0xFDDA, - 0xE444: 0xFDDB, - 0xE445: 0xFDDC, - 0xE446: 0xFDDD, - 0xE447: 0xFDDE, - 0xE448: 0xFDDF, - 0xE449: 0xFDE0, - 0xE44A: 0xFDE1, - 0xE44B: 0xFDE2, - 0xE44C: 0xFDE3, - 0xE44D: 0xFDE4, - 0xE44E: 0xFDE5, - 0xE44F: 0xFDE6, - 0xE450: 0xFDE7, - 0xE451: 0xFDE8, - 0xE452: 0xFDE9, - 0xE453: 0xFDEA, - 0xE454: 0xFDEB, - 0xE455: 0xFDEC, - 0xE456: 0xFDED, - 0xE457: 0xFDEE, - 0xE458: 0xFDEF, - 0xE459: 0xFDF0, - 0xE45A: 0xFDF1, - 0xE45B: 0xFDF2, - 0xE45C: 0xFDF3, - 0xE45D: 0xFDF4, - 0xE45E: 0xFDF5, - 0xE45F: 0xFDF6, - 0xE460: 0xFDF7, - 0xE461: 0xFDF8, - 0xE462: 0xFDF9, - 0xE463: 0xFDFA, - 0xE464: 0xFDFB, - 0xE465: 0xFDFC, - 0xE466: 0xFDFD, - 0xE467: 0xFDFE, - 0xE468: 0xFEA1, - 0xE469: 0xFEA2, - 0xE46A: 0xFEA3, - 0xE46B: 0xFEA4, - 0xE46C: 0xFEA5, - 0xE46D: 0xFEA6, - 0xE46E: 0xFEA7, - 0xE46F: 0xFEA8, - 0xE470: 0xFEA9, - 0xE471: 0xFEAA, - 0xE472: 0xFEAB, - 0xE473: 0xFEAC, - 0xE474: 0xFEAD, - 0xE475: 0xFEAE, - 0xE476: 0xFEAF, - 0xE477: 0xFEB0, - 0xE478: 0xFEB1, - 0xE479: 0xFEB2, - 0xE47A: 0xFEB3, - 0xE47B: 0xFEB4, - 0xE47C: 0xFEB5, - 0xE47D: 0xFEB6, - 0xE47E: 0xFEB7, - 0xE47F: 0xFEB8, - 0xE480: 0xFEB9, - 0xE481: 0xFEBA, - 0xE482: 0xFEBB, - 0xE483: 0xFEBC, - 0xE484: 0xFEBD, - 0xE485: 0xFEBE, - 0xE486: 0xFEBF, - 0xE487: 0xFEC0, - 0xE488: 0xFEC1, - 0xE489: 0xFEC2, - 0xE48A: 0xFEC3, - 0xE48B: 0xFEC4, - 0xE48C: 0xFEC5, - 0xE48D: 0xFEC6, - 0xE48E: 0xFEC7, - 0xE48F: 0xFEC8, - 0xE490: 0xFEC9, - 0xE491: 0xFECA, - 0xE492: 0xFECB, - 0xE493: 0xFECC, - 0xE494: 0xFECD, - 0xE495: 0xFECE, - 0xE496: 0xFECF, - 0xE497: 0xFED0, - 0xE498: 0xFED1, - 0xE499: 0xFED2, - 0xE49A: 0xFED3, - 0xE49B: 0xFED4, - 0xE49C: 0xFED5, - 0xE49D: 0xFED6, - 0xE49E: 0xFED7, - 0xE49F: 0xFED8, - 0xE4A0: 0xFED9, - 0xE4A1: 0xFEDA, - 0xE4A2: 0xFEDB, - 0xE4A3: 0xFEDC, - 0xE4A4: 0xFEDD, - 0xE4A5: 0xFEDE, - 0xE4A6: 0xFEDF, - 0xE4A7: 0xFEE0, - 0xE4A8: 0xFEE1, - 0xE4A9: 0xFEE2, - 0xE4AA: 0xFEE3, - 0xE4AB: 0xFEE4, - 0xE4AC: 0xFEE5, - 0xE4AD: 0xFEE6, - 0xE4AE: 0xFEE7, - 0xE4AF: 0xFEE8, - 0xE4B0: 0xFEE9, - 0xE4B1: 0xFEEA, - 0xE4B2: 0xFEEB, - 0xE4B3: 0xFEEC, - 0xE4B4: 0xFEED, - 0xE4B5: 0xFEEE, - 0xE4B6: 0xFEEF, - 0xE4B7: 0xFEF0, - 0xE4B8: 0xFEF1, - 0xE4B9: 0xFEF2, - 0xE4BA: 0xFEF3, - 0xE4BB: 0xFEF4, - 0xE4BC: 0xFEF5, - 0xE4BD: 0xFEF6, - 0xE4BE: 0xFEF7, - 0xE4BF: 0xFEF8, - 0xE4C0: 0xFEF9, - 0xE4C1: 0xFEFA, - 0xE4C2: 0xFEFB, - 0xE4C3: 0xFEFC, - 0xE4C4: 0xFEFD, - 0xE4C5: 0xFEFE, - 0xE4C6: 0xA140, - 0xE4C7: 0xA141, - 0xE4C8: 0xA142, - 0xE4C9: 0xA143, - 0xE4CA: 0xA144, - 0xE4CB: 0xA145, - 0xE4CC: 0xA146, - 0xE4CD: 0xA147, - 0xE4CE: 0xA148, - 0xE4CF: 0xA149, - 0xE4D0: 0xA14A, - 0xE4D1: 0xA14B, - 0xE4D2: 0xA14C, - 0xE4D3: 0xA14D, - 0xE4D4: 0xA14E, - 0xE4D5: 0xA14F, - 0xE4D6: 0xA150, - 0xE4D7: 0xA151, - 0xE4D8: 0xA152, - 0xE4D9: 0xA153, - 0xE4DA: 0xA154, - 0xE4DB: 0xA155, - 0xE4DC: 0xA156, - 0xE4DD: 0xA157, - 0xE4DE: 0xA158, - 0xE4DF: 0xA159, - 0xE4E0: 0xA15A, - 0xE4E1: 0xA15B, - 0xE4E2: 0xA15C, - 0xE4E3: 0xA15D, - 0xE4E4: 0xA15E, - 0xE4E5: 0xA15F, - 0xE4E6: 0xA160, - 0xE4E7: 0xA161, - 0xE4E8: 0xA162, - 0xE4E9: 0xA163, - 0xE4EA: 0xA164, - 0xE4EB: 0xA165, - 0xE4EC: 0xA166, - 0xE4ED: 0xA167, - 0xE4EE: 0xA168, - 0xE4EF: 0xA169, - 0xE4F0: 0xA16A, - 0xE4F1: 0xA16B, - 0xE4F2: 0xA16C, - 0xE4F3: 0xA16D, - 0xE4F4: 0xA16E, - 0xE4F5: 0xA16F, - 0xE4F6: 0xA170, - 0xE4F7: 0xA171, - 0xE4F8: 0xA172, - 0xE4F9: 0xA173, - 0xE4FA: 0xA174, - 0xE4FB: 0xA175, - 0xE4FC: 0xA176, - 0xE4FD: 0xA177, - 0xE4FE: 0xA178, - 0xE4FF: 0xA179, - 0xE500: 0xA17A, - 0xE501: 0xA17B, - 0xE502: 0xA17C, - 0xE503: 0xA17D, - 0xE504: 0xA17E, - 0xE505: 0xA180, - 0xE506: 0xA181, - 0xE507: 0xA182, - 0xE508: 0xA183, - 0xE509: 0xA184, - 0xE50A: 0xA185, - 0xE50B: 0xA186, - 0xE50C: 0xA187, - 0xE50D: 0xA188, - 0xE50E: 0xA189, - 0xE50F: 0xA18A, - 0xE510: 0xA18B, - 0xE511: 0xA18C, - 0xE512: 0xA18D, - 0xE513: 0xA18E, - 0xE514: 0xA18F, - 0xE515: 0xA190, - 0xE516: 0xA191, - 0xE517: 0xA192, - 0xE518: 0xA193, - 0xE519: 0xA194, - 0xE51A: 0xA195, - 0xE51B: 0xA196, - 0xE51C: 0xA197, - 0xE51D: 0xA198, - 0xE51E: 0xA199, - 0xE51F: 0xA19A, - 0xE520: 0xA19B, - 0xE521: 0xA19C, - 0xE522: 0xA19D, - 0xE523: 0xA19E, - 0xE524: 0xA19F, - 0xE525: 0xA1A0, - 0xE526: 0xA240, - 0xE527: 0xA241, - 0xE528: 0xA242, - 0xE529: 0xA243, - 0xE52A: 0xA244, - 0xE52B: 0xA245, - 0xE52C: 0xA246, - 0xE52D: 0xA247, - 0xE52E: 0xA248, - 0xE52F: 0xA249, - 0xE530: 0xA24A, - 0xE531: 0xA24B, - 0xE532: 0xA24C, - 0xE533: 0xA24D, - 0xE534: 0xA24E, - 0xE535: 0xA24F, - 0xE536: 0xA250, - 0xE537: 0xA251, - 0xE538: 0xA252, - 0xE539: 0xA253, - 0xE53A: 0xA254, - 0xE53B: 0xA255, - 0xE53C: 0xA256, - 0xE53D: 0xA257, - 0xE53E: 0xA258, - 0xE53F: 0xA259, - 0xE540: 0xA25A, - 0xE541: 0xA25B, - 0xE542: 0xA25C, - 0xE543: 0xA25D, - 0xE544: 0xA25E, - 0xE545: 0xA25F, - 0xE546: 0xA260, - 0xE547: 0xA261, - 0xE548: 0xA262, - 0xE549: 0xA263, - 0xE54A: 0xA264, - 0xE54B: 0xA265, - 0xE54C: 0xA266, - 0xE54D: 0xA267, - 0xE54E: 0xA268, - 0xE54F: 0xA269, - 0xE550: 0xA26A, - 0xE551: 0xA26B, - 0xE552: 0xA26C, - 0xE553: 0xA26D, - 0xE554: 0xA26E, - 0xE555: 0xA26F, - 0xE556: 0xA270, - 0xE557: 0xA271, - 0xE558: 0xA272, - 0xE559: 0xA273, - 0xE55A: 0xA274, - 0xE55B: 0xA275, - 0xE55C: 0xA276, - 0xE55D: 0xA277, - 0xE55E: 0xA278, - 0xE55F: 0xA279, - 0xE560: 0xA27A, - 0xE561: 0xA27B, - 0xE562: 0xA27C, - 0xE563: 0xA27D, - 0xE564: 0xA27E, - 0xE565: 0xA280, - 0xE566: 0xA281, - 0xE567: 0xA282, - 0xE568: 0xA283, - 0xE569: 0xA284, - 0xE56A: 0xA285, - 0xE56B: 0xA286, - 0xE56C: 0xA287, - 0xE56D: 0xA288, - 0xE56E: 0xA289, - 0xE56F: 0xA28A, - 0xE570: 0xA28B, - 0xE571: 0xA28C, - 0xE572: 0xA28D, - 0xE573: 0xA28E, - 0xE574: 0xA28F, - 0xE575: 0xA290, - 0xE576: 0xA291, - 0xE577: 0xA292, - 0xE578: 0xA293, - 0xE579: 0xA294, - 0xE57A: 0xA295, - 0xE57B: 0xA296, - 0xE57C: 0xA297, - 0xE57D: 0xA298, - 0xE57E: 0xA299, - 0xE57F: 0xA29A, - 0xE580: 0xA29B, - 0xE581: 0xA29C, - 0xE582: 0xA29D, - 0xE583: 0xA29E, - 0xE584: 0xA29F, - 0xE585: 0xA2A0, - 0xE586: 0xA340, - 0xE587: 0xA341, - 0xE588: 0xA342, - 0xE589: 0xA343, - 0xE58A: 0xA344, - 0xE58B: 0xA345, - 0xE58C: 0xA346, - 0xE58D: 0xA347, - 0xE58E: 0xA348, - 0xE58F: 0xA349, - 0xE590: 0xA34A, - 0xE591: 0xA34B, - 0xE592: 0xA34C, - 0xE593: 0xA34D, - 0xE594: 0xA34E, - 0xE595: 0xA34F, - 0xE596: 0xA350, - 0xE597: 0xA351, - 0xE598: 0xA352, - 0xE599: 0xA353, - 0xE59A: 0xA354, - 0xE59B: 0xA355, - 0xE59C: 0xA356, - 0xE59D: 0xA357, - 0xE59E: 0xA358, - 0xE59F: 0xA359, - 0xE5A0: 0xA35A, - 0xE5A1: 0xA35B, - 0xE5A2: 0xA35C, - 0xE5A3: 0xA35D, - 0xE5A4: 0xA35E, - 0xE5A5: 0xA35F, - 0xE5A6: 0xA360, - 0xE5A7: 0xA361, - 0xE5A8: 0xA362, - 0xE5A9: 0xA363, - 0xE5AA: 0xA364, - 0xE5AB: 0xA365, - 0xE5AC: 0xA366, - 0xE5AD: 0xA367, - 0xE5AE: 0xA368, - 0xE5AF: 0xA369, - 0xE5B0: 0xA36A, - 0xE5B1: 0xA36B, - 0xE5B2: 0xA36C, - 0xE5B3: 0xA36D, - 0xE5B4: 0xA36E, - 0xE5B5: 0xA36F, - 0xE5B6: 0xA370, - 0xE5B7: 0xA371, - 0xE5B8: 0xA372, - 0xE5B9: 0xA373, - 0xE5BA: 0xA374, - 0xE5BB: 0xA375, - 0xE5BC: 0xA376, - 0xE5BD: 0xA377, - 0xE5BE: 0xA378, - 0xE5BF: 0xA379, - 0xE5C0: 0xA37A, - 0xE5C1: 0xA37B, - 0xE5C2: 0xA37C, - 0xE5C3: 0xA37D, - 0xE5C4: 0xA37E, - 0xE5C5: 0xA380, - 0xE5C6: 0xA381, - 0xE5C7: 0xA382, - 0xE5C8: 0xA383, - 0xE5C9: 0xA384, - 0xE5CA: 0xA385, - 0xE5CB: 0xA386, - 0xE5CC: 0xA387, - 0xE5CD: 0xA388, - 0xE5CE: 0xA389, - 0xE5CF: 0xA38A, - 0xE5D0: 0xA38B, - 0xE5D1: 0xA38C, - 0xE5D2: 0xA38D, - 0xE5D3: 0xA38E, - 0xE5D4: 0xA38F, - 0xE5D5: 0xA390, - 0xE5D6: 0xA391, - 0xE5D7: 0xA392, - 0xE5D8: 0xA393, - 0xE5D9: 0xA394, - 0xE5DA: 0xA395, - 0xE5DB: 0xA396, - 0xE5DC: 0xA397, - 0xE5DD: 0xA398, - 0xE5DE: 0xA399, - 0xE5DF: 0xA39A, - 0xE5E0: 0xA39B, - 0xE5E1: 0xA39C, - 0xE5E2: 0xA39D, - 0xE5E3: 0xA39E, - 0xE5E4: 0xA39F, - 0xE5E5: 0xA3A0, - 0xE5E6: 0xA440, - 0xE5E7: 0xA441, - 0xE5E8: 0xA442, - 0xE5E9: 0xA443, - 0xE5EA: 0xA444, - 0xE5EB: 0xA445, - 0xE5EC: 0xA446, - 0xE5ED: 0xA447, - 0xE5EE: 0xA448, - 0xE5EF: 0xA449, - 0xE5F0: 0xA44A, - 0xE5F1: 0xA44B, - 0xE5F2: 0xA44C, - 0xE5F3: 0xA44D, - 0xE5F4: 0xA44E, - 0xE5F5: 0xA44F, - 0xE5F6: 0xA450, - 0xE5F7: 0xA451, - 0xE5F8: 0xA452, - 0xE5F9: 0xA453, - 0xE5FA: 0xA454, - 0xE5FB: 0xA455, - 0xE5FC: 0xA456, - 0xE5FD: 0xA457, - 0xE5FE: 0xA458, - 0xE5FF: 0xA459, - 0xE600: 0xA45A, - 0xE601: 0xA45B, - 0xE602: 0xA45C, - 0xE603: 0xA45D, - 0xE604: 0xA45E, - 0xE605: 0xA45F, - 0xE606: 0xA460, - 0xE607: 0xA461, - 0xE608: 0xA462, - 0xE609: 0xA463, - 0xE60A: 0xA464, - 0xE60B: 0xA465, - 0xE60C: 0xA466, - 0xE60D: 0xA467, - 0xE60E: 0xA468, - 0xE60F: 0xA469, - 0xE610: 0xA46A, - 0xE611: 0xA46B, - 0xE612: 0xA46C, - 0xE613: 0xA46D, - 0xE614: 0xA46E, - 0xE615: 0xA46F, - 0xE616: 0xA470, - 0xE617: 0xA471, - 0xE618: 0xA472, - 0xE619: 0xA473, - 0xE61A: 0xA474, - 0xE61B: 0xA475, - 0xE61C: 0xA476, - 0xE61D: 0xA477, - 0xE61E: 0xA478, - 0xE61F: 0xA479, - 0xE620: 0xA47A, - 0xE621: 0xA47B, - 0xE622: 0xA47C, - 0xE623: 0xA47D, - 0xE624: 0xA47E, - 0xE625: 0xA480, - 0xE626: 0xA481, - 0xE627: 0xA482, - 0xE628: 0xA483, - 0xE629: 0xA484, - 0xE62A: 0xA485, - 0xE62B: 0xA486, - 0xE62C: 0xA487, - 0xE62D: 0xA488, - 0xE62E: 0xA489, - 0xE62F: 0xA48A, - 0xE630: 0xA48B, - 0xE631: 0xA48C, - 0xE632: 0xA48D, - 0xE633: 0xA48E, - 0xE634: 0xA48F, - 0xE635: 0xA490, - 0xE636: 0xA491, - 0xE637: 0xA492, - 0xE638: 0xA493, - 0xE639: 0xA494, - 0xE63A: 0xA495, - 0xE63B: 0xA496, - 0xE63C: 0xA497, - 0xE63D: 0xA498, - 0xE63E: 0xA499, - 0xE63F: 0xA49A, - 0xE640: 0xA49B, - 0xE641: 0xA49C, - 0xE642: 0xA49D, - 0xE643: 0xA49E, - 0xE644: 0xA49F, - 0xE645: 0xA4A0, - 0xE646: 0xA540, - 0xE647: 0xA541, - 0xE648: 0xA542, - 0xE649: 0xA543, - 0xE64A: 0xA544, - 0xE64B: 0xA545, - 0xE64C: 0xA546, - 0xE64D: 0xA547, - 0xE64E: 0xA548, - 0xE64F: 0xA549, - 0xE650: 0xA54A, - 0xE651: 0xA54B, - 0xE652: 0xA54C, - 0xE653: 0xA54D, - 0xE654: 0xA54E, - 0xE655: 0xA54F, - 0xE656: 0xA550, - 0xE657: 0xA551, - 0xE658: 0xA552, - 0xE659: 0xA553, - 0xE65A: 0xA554, - 0xE65B: 0xA555, - 0xE65C: 0xA556, - 0xE65D: 0xA557, - 0xE65E: 0xA558, - 0xE65F: 0xA559, - 0xE660: 0xA55A, - 0xE661: 0xA55B, - 0xE662: 0xA55C, - 0xE663: 0xA55D, - 0xE664: 0xA55E, - 0xE665: 0xA55F, - 0xE666: 0xA560, - 0xE667: 0xA561, - 0xE668: 0xA562, - 0xE669: 0xA563, - 0xE66A: 0xA564, - 0xE66B: 0xA565, - 0xE66C: 0xA566, - 0xE66D: 0xA567, - 0xE66E: 0xA568, - 0xE66F: 0xA569, - 0xE670: 0xA56A, - 0xE671: 0xA56B, - 0xE672: 0xA56C, - 0xE673: 0xA56D, - 0xE674: 0xA56E, - 0xE675: 0xA56F, - 0xE676: 0xA570, - 0xE677: 0xA571, - 0xE678: 0xA572, - 0xE679: 0xA573, - 0xE67A: 0xA574, - 0xE67B: 0xA575, - 0xE67C: 0xA576, - 0xE67D: 0xA577, - 0xE67E: 0xA578, - 0xE67F: 0xA579, - 0xE680: 0xA57A, - 0xE681: 0xA57B, - 0xE682: 0xA57C, - 0xE683: 0xA57D, - 0xE684: 0xA57E, - 0xE685: 0xA580, - 0xE686: 0xA581, - 0xE687: 0xA582, - 0xE688: 0xA583, - 0xE689: 0xA584, - 0xE68A: 0xA585, - 0xE68B: 0xA586, - 0xE68C: 0xA587, - 0xE68D: 0xA588, - 0xE68E: 0xA589, - 0xE68F: 0xA58A, - 0xE690: 0xA58B, - 0xE691: 0xA58C, - 0xE692: 0xA58D, - 0xE693: 0xA58E, - 0xE694: 0xA58F, - 0xE695: 0xA590, - 0xE696: 0xA591, - 0xE697: 0xA592, - 0xE698: 0xA593, - 0xE699: 0xA594, - 0xE69A: 0xA595, - 0xE69B: 0xA596, - 0xE69C: 0xA597, - 0xE69D: 0xA598, - 0xE69E: 0xA599, - 0xE69F: 0xA59A, - 0xE6A0: 0xA59B, - 0xE6A1: 0xA59C, - 0xE6A2: 0xA59D, - 0xE6A3: 0xA59E, - 0xE6A4: 0xA59F, - 0xE6A5: 0xA5A0, - 0xE6A6: 0xA640, - 0xE6A7: 0xA641, - 0xE6A8: 0xA642, - 0xE6A9: 0xA643, - 0xE6AA: 0xA644, - 0xE6AB: 0xA645, - 0xE6AC: 0xA646, - 0xE6AD: 0xA647, - 0xE6AE: 0xA648, - 0xE6AF: 0xA649, - 0xE6B0: 0xA64A, - 0xE6B1: 0xA64B, - 0xE6B2: 0xA64C, - 0xE6B3: 0xA64D, - 0xE6B4: 0xA64E, - 0xE6B5: 0xA64F, - 0xE6B6: 0xA650, - 0xE6B7: 0xA651, - 0xE6B8: 0xA652, - 0xE6B9: 0xA653, - 0xE6BA: 0xA654, - 0xE6BB: 0xA655, - 0xE6BC: 0xA656, - 0xE6BD: 0xA657, - 0xE6BE: 0xA658, - 0xE6BF: 0xA659, - 0xE6C0: 0xA65A, - 0xE6C1: 0xA65B, - 0xE6C2: 0xA65C, - 0xE6C3: 0xA65D, - 0xE6C4: 0xA65E, - 0xE6C5: 0xA65F, - 0xE6C6: 0xA660, - 0xE6C7: 0xA661, - 0xE6C8: 0xA662, - 0xE6C9: 0xA663, - 0xE6CA: 0xA664, - 0xE6CB: 0xA665, - 0xE6CC: 0xA666, - 0xE6CD: 0xA667, - 0xE6CE: 0xA668, - 0xE6CF: 0xA669, - 0xE6D0: 0xA66A, - 0xE6D1: 0xA66B, - 0xE6D2: 0xA66C, - 0xE6D3: 0xA66D, - 0xE6D4: 0xA66E, - 0xE6D5: 0xA66F, - 0xE6D6: 0xA670, - 0xE6D7: 0xA671, - 0xE6D8: 0xA672, - 0xE6D9: 0xA673, - 0xE6DA: 0xA674, - 0xE6DB: 0xA675, - 0xE6DC: 0xA676, - 0xE6DD: 0xA677, - 0xE6DE: 0xA678, - 0xE6DF: 0xA679, - 0xE6E0: 0xA67A, - 0xE6E1: 0xA67B, - 0xE6E2: 0xA67C, - 0xE6E3: 0xA67D, - 0xE6E4: 0xA67E, - 0xE6E5: 0xA680, - 0xE6E6: 0xA681, - 0xE6E7: 0xA682, - 0xE6E8: 0xA683, - 0xE6E9: 0xA684, - 0xE6EA: 0xA685, - 0xE6EB: 0xA686, - 0xE6EC: 0xA687, - 0xE6ED: 0xA688, - 0xE6EE: 0xA689, - 0xE6EF: 0xA68A, - 0xE6F0: 0xA68B, - 0xE6F1: 0xA68C, - 0xE6F2: 0xA68D, - 0xE6F3: 0xA68E, - 0xE6F4: 0xA68F, - 0xE6F5: 0xA690, - 0xE6F6: 0xA691, - 0xE6F7: 0xA692, - 0xE6F8: 0xA693, - 0xE6F9: 0xA694, - 0xE6FA: 0xA695, - 0xE6FB: 0xA696, - 0xE6FC: 0xA697, - 0xE6FD: 0xA698, - 0xE6FE: 0xA699, - 0xE6FF: 0xA69A, - 0xE700: 0xA69B, - 0xE701: 0xA69C, - 0xE702: 0xA69D, - 0xE703: 0xA69E, - 0xE704: 0xA69F, - 0xE705: 0xA6A0, - 0xE706: 0xA740, - 0xE707: 0xA741, - 0xE708: 0xA742, - 0xE709: 0xA743, - 0xE70A: 0xA744, - 0xE70B: 0xA745, - 0xE70C: 0xA746, - 0xE70D: 0xA747, - 0xE70E: 0xA748, - 0xE70F: 0xA749, - 0xE710: 0xA74A, - 0xE711: 0xA74B, - 0xE712: 0xA74C, - 0xE713: 0xA74D, - 0xE714: 0xA74E, - 0xE715: 0xA74F, - 0xE716: 0xA750, - 0xE717: 0xA751, - 0xE718: 0xA752, - 0xE719: 0xA753, - 0xE71A: 0xA754, - 0xE71B: 0xA755, - 0xE71C: 0xA756, - 0xE71D: 0xA757, - 0xE71E: 0xA758, - 0xE71F: 0xA759, - 0xE720: 0xA75A, - 0xE721: 0xA75B, - 0xE722: 0xA75C, - 0xE723: 0xA75D, - 0xE724: 0xA75E, - 0xE725: 0xA75F, - 0xE726: 0xA760, - 0xE727: 0xA761, - 0xE728: 0xA762, - 0xE729: 0xA763, - 0xE72A: 0xA764, - 0xE72B: 0xA765, - 0xE72C: 0xA766, - 0xE72D: 0xA767, - 0xE72E: 0xA768, - 0xE72F: 0xA769, - 0xE730: 0xA76A, - 0xE731: 0xA76B, - 0xE732: 0xA76C, - 0xE733: 0xA76D, - 0xE734: 0xA76E, - 0xE735: 0xA76F, - 0xE736: 0xA770, - 0xE737: 0xA771, - 0xE738: 0xA772, - 0xE739: 0xA773, - 0xE73A: 0xA774, - 0xE73B: 0xA775, - 0xE73C: 0xA776, - 0xE73D: 0xA777, - 0xE73E: 0xA778, - 0xE73F: 0xA779, - 0xE740: 0xA77A, - 0xE741: 0xA77B, - 0xE742: 0xA77C, - 0xE743: 0xA77D, - 0xE744: 0xA77E, - 0xE745: 0xA780, - 0xE746: 0xA781, - 0xE747: 0xA782, - 0xE748: 0xA783, - 0xE749: 0xA784, - 0xE74A: 0xA785, - 0xE74B: 0xA786, - 0xE74C: 0xA787, - 0xE74D: 0xA788, - 0xE74E: 0xA789, - 0xE74F: 0xA78A, - 0xE750: 0xA78B, - 0xE751: 0xA78C, - 0xE752: 0xA78D, - 0xE753: 0xA78E, - 0xE754: 0xA78F, - 0xE755: 0xA790, - 0xE756: 0xA791, - 0xE757: 0xA792, - 0xE758: 0xA793, - 0xE759: 0xA794, - 0xE75A: 0xA795, - 0xE75B: 0xA796, - 0xE75C: 0xA797, - 0xE75D: 0xA798, - 0xE75E: 0xA799, - 0xE75F: 0xA79A, - 0xE760: 0xA79B, - 0xE761: 0xA79C, - 0xE762: 0xA79D, - 0xE763: 0xA79E, - 0xE764: 0xA79F, - 0xE765: 0xA7A0, - 0xE766: 0xA2AB, - 0xE767: 0xA2AC, - 0xE768: 0xA2AD, - 0xE769: 0xA2AE, - 0xE76A: 0xA2AF, - 0xE76B: 0xA2B0, - 0xE76D: 0xA2E4, - 0xE76E: 0xA2EF, - 0xE76F: 0xA2F0, - 0xE770: 0xA2FD, - 0xE771: 0xA2FE, - 0xE772: 0xA4F4, - 0xE773: 0xA4F5, - 0xE774: 0xA4F6, - 0xE775: 0xA4F7, - 0xE776: 0xA4F8, - 0xE777: 0xA4F9, - 0xE778: 0xA4FA, - 0xE779: 0xA4FB, - 0xE77A: 0xA4FC, - 0xE77B: 0xA4FD, - 0xE77C: 0xA4FE, - 0xE77D: 0xA5F7, - 0xE77E: 0xA5F8, - 0xE77F: 0xA5F9, - 0xE780: 0xA5FA, - 0xE781: 0xA5FB, - 0xE782: 0xA5FC, - 0xE783: 0xA5FD, - 0xE784: 0xA5FE, - 0xE785: 0xA6B9, - 0xE786: 0xA6BA, - 0xE787: 0xA6BB, - 0xE788: 0xA6BC, - 0xE789: 0xA6BD, - 0xE78A: 0xA6BE, - 0xE78B: 0xA6BF, - 0xE78C: 0xA6C0, - 0xE78D: 0xA6D9, - 0xE78E: 0xA6DA, - 0xE78F: 0xA6DB, - 0xE790: 0xA6DC, - 0xE791: 0xA6DD, - 0xE792: 0xA6DE, - 0xE793: 0xA6DF, - 0xE794: 0xA6EC, - 0xE795: 0xA6ED, - 0xE796: 0xA6F3, - 0xE797: 0xA6F6, - 0xE798: 0xA6F7, - 0xE799: 0xA6F8, - 0xE79A: 0xA6F9, - 0xE79B: 0xA6FA, - 0xE79C: 0xA6FB, - 0xE79D: 0xA6FC, - 0xE79E: 0xA6FD, - 0xE79F: 0xA6FE, - 0xE7A0: 0xA7C2, - 0xE7A1: 0xA7C3, - 0xE7A2: 0xA7C4, - 0xE7A3: 0xA7C5, - 0xE7A4: 0xA7C6, - 0xE7A5: 0xA7C7, - 0xE7A6: 0xA7C8, - 0xE7A7: 0xA7C9, - 0xE7A8: 0xA7CA, - 0xE7A9: 0xA7CB, - 0xE7AA: 0xA7CC, - 0xE7AB: 0xA7CD, - 0xE7AC: 0xA7CE, - 0xE7AD: 0xA7CF, - 0xE7AE: 0xA7D0, - 0xE7AF: 0xA7F2, - 0xE7B0: 0xA7F3, - 0xE7B1: 0xA7F4, - 0xE7B2: 0xA7F5, - 0xE7B3: 0xA7F6, - 0xE7B4: 0xA7F7, - 0xE7B5: 0xA7F8, - 0xE7B6: 0xA7F9, - 0xE7B7: 0xA7FA, - 0xE7B8: 0xA7FB, - 0xE7B9: 0xA7FC, - 0xE7BA: 0xA7FD, - 0xE7BB: 0xA7FE, - 0xE7BC: 0xA896, - 0xE7BD: 0xA897, - 0xE7BE: 0xA898, - 0xE7BF: 0xA899, - 0xE7C0: 0xA89A, - 0xE7C1: 0xA89B, - 0xE7C2: 0xA89C, - 0xE7C3: 0xA89D, - 0xE7C4: 0xA89E, - 0xE7C5: 0xA89F, - 0xE7C6: 0xA8A0, - 0xE7C9: 0xA8C1, - 0xE7CA: 0xA8C2, - 0xE7CB: 0xA8C3, - 0xE7CC: 0xA8C4, - 0xE7CD: 0xA8EA, - 0xE7CE: 0xA8EB, - 0xE7CF: 0xA8EC, - 0xE7D0: 0xA8ED, - 0xE7D1: 0xA8EE, - 0xE7D2: 0xA8EF, - 0xE7D3: 0xA8F0, - 0xE7D4: 0xA8F1, - 0xE7D5: 0xA8F2, - 0xE7D6: 0xA8F3, - 0xE7D7: 0xA8F4, - 0xE7D8: 0xA8F5, - 0xE7D9: 0xA8F6, - 0xE7DA: 0xA8F7, - 0xE7DB: 0xA8F8, - 0xE7DC: 0xA8F9, - 0xE7DD: 0xA8FA, - 0xE7DE: 0xA8FB, - 0xE7DF: 0xA8FC, - 0xE7E0: 0xA8FD, - 0xE7E1: 0xA8FE, - 0xE7E2: 0xA958, - 0xE7E3: 0xA95B, - 0xE7E4: 0xA95D, - 0xE7E5: 0xA95E, - 0xE7E6: 0xA95F, - 0xE7F4: 0xA997, - 0xE7F5: 0xA998, - 0xE7F6: 0xA999, - 0xE7F7: 0xA99A, - 0xE7F8: 0xA99B, - 0xE7F9: 0xA99C, - 0xE7FA: 0xA99D, - 0xE7FB: 0xA99E, - 0xE7FC: 0xA99F, - 0xE7FD: 0xA9A0, - 0xE7FE: 0xA9A1, - 0xE7FF: 0xA9A2, - 0xE800: 0xA9A3, - 0xE801: 0xA9F0, - 0xE802: 0xA9F1, - 0xE803: 0xA9F2, - 0xE804: 0xA9F3, - 0xE805: 0xA9F4, - 0xE806: 0xA9F5, - 0xE807: 0xA9F6, - 0xE808: 0xA9F7, - 0xE809: 0xA9F8, - 0xE80A: 0xA9F9, - 0xE80B: 0xA9FA, - 0xE80C: 0xA9FB, - 0xE80D: 0xA9FC, - 0xE80E: 0xA9FD, - 0xE80F: 0xA9FE, - 0xE810: 0xD7FA, - 0xE811: 0xD7FB, - 0xE812: 0xD7FC, - 0xE813: 0xD7FD, - 0xE814: 0xD7FE, - 0xE816: 0xFE51, - 0xE817: 0xFE52, - 0xE818: 0xFE53, - 0xE81E: 0xFE59, - 0xE826: 0xFE61, - 0xE82B: 0xFE66, - 0xE82C: 0xFE67, - 0xE831: 0xFE6C, - 0xE832: 0xFE6D, - 0xE83B: 0xFE76, - 0xE843: 0xFE7E, - 0xE854: 0xFE90, - 0xE855: 0xFE91, - 0xE864: 0xFEA0, - 0xF92C: 0xFD9C, - 0xF979: 0xFD9D, - 0xF995: 0xFD9E, - 0xF9E7: 0xFD9F, - 0xF9F1: 0xFDA0, - 0xFA0C: 0xFE40, - 0xFA0D: 0xFE41, - 0xFA0E: 0xFE42, - 0xFA0F: 0xFE43, - 0xFA11: 0xFE44, - 0xFA13: 0xFE45, - 0xFA14: 0xFE46, - 0xFA18: 0xFE47, - 0xFA1F: 0xFE48, - 0xFA20: 0xFE49, - 0xFA21: 0xFE4A, - 0xFA23: 0xFE4B, - 0xFA24: 0xFE4C, - 0xFA27: 0xFE4D, - 0xFA28: 0xFE4E, - 0xFA29: 0xFE4F, - 0xFE10: 0xA6D9, - 0xFE11: 0xA6DB, - 0xFE12: 0xA6DA, - 0xFE13: 0xA6DC, - 0xFE14: 0xA6DD, - 0xFE15: 0xA6DE, - 0xFE16: 0xA6DF, - 0xFE17: 0xA6EC, - 0xFE18: 0xA6ED, - 0xFE19: 0xA6F3, - 0xFE30: 0xA955, - 0xFE31: 0xA6F2, - 0xFE33: 0xA6F4, - 0xFE34: 0xA6F5, - 0xFE35: 0xA6E0, - 0xFE36: 0xA6E1, - 0xFE37: 0xA6F0, - 0xFE38: 0xA6F1, - 0xFE39: 0xA6E2, - 0xFE3A: 0xA6E3, - 0xFE3B: 0xA6EE, - 0xFE3C: 0xA6EF, - 0xFE3D: 0xA6E6, - 0xFE3E: 0xA6E7, - 0xFE3F: 0xA6E4, - 0xFE40: 0xA6E5, - 0xFE41: 0xA6E8, - 0xFE42: 0xA6E9, - 0xFE43: 0xA6EA, - 0xFE44: 0xA6EB, - 0xFE49: 0xA968, - 0xFE4A: 0xA969, - 0xFE4B: 0xA96A, - 0xFE4C: 0xA96B, - 0xFE4D: 0xA96C, - 0xFE4E: 0xA96D, - 0xFE4F: 0xA96E, - 0xFE50: 0xA96F, - 0xFE51: 0xA970, - 0xFE52: 0xA971, - 0xFE54: 0xA972, - 0xFE55: 0xA973, - 0xFE56: 0xA974, - 0xFE57: 0xA975, - 0xFE59: 0xA976, - 0xFE5A: 0xA977, - 0xFE5B: 0xA978, - 0xFE5C: 0xA979, - 0xFE5D: 0xA97A, - 0xFE5E: 0xA97B, - 0xFE5F: 0xA97C, - 0xFE60: 0xA97D, - 0xFE61: 0xA97E, - 0xFE62: 0xA980, - 0xFE63: 0xA981, - 0xFE64: 0xA982, - 0xFE65: 0xA983, - 0xFE66: 0xA984, - 0xFE68: 0xA985, - 0xFE69: 0xA986, - 0xFE6A: 0xA987, - 0xFE6B: 0xA988, - 0xFF01: 0xA3A1, - 0xFF02: 0xA3A2, - 0xFF03: 0xA3A3, - 0xFF04: 0xA1E7, - 0xFF05: 0xA3A5, - 0xFF06: 0xA3A6, - 0xFF07: 0xA3A7, - 0xFF08: 0xA3A8, - 0xFF09: 0xA3A9, - 0xFF0A: 0xA3AA, - 0xFF0B: 0xA3AB, - 0xFF0C: 0xA3AC, - 0xFF0D: 0xA3AD, - 0xFF0E: 0xA3AE, - 0xFF0F: 0xA3AF, - 0xFF10: 0xA3B0, - 0xFF11: 0xA3B1, - 0xFF12: 0xA3B2, - 0xFF13: 0xA3B3, - 0xFF14: 0xA3B4, - 0xFF15: 0xA3B5, - 0xFF16: 0xA3B6, - 0xFF17: 0xA3B7, - 0xFF18: 0xA3B8, - 0xFF19: 0xA3B9, - 0xFF1A: 0xA3BA, - 0xFF1B: 0xA3BB, - 0xFF1C: 0xA3BC, - 0xFF1D: 0xA3BD, - 0xFF1E: 0xA3BE, - 0xFF1F: 0xA3BF, - 0xFF20: 0xA3C0, - 0xFF21: 0xA3C1, - 0xFF22: 0xA3C2, - 0xFF23: 0xA3C3, - 0xFF24: 0xA3C4, - 0xFF25: 0xA3C5, - 0xFF26: 0xA3C6, - 0xFF27: 0xA3C7, - 0xFF28: 0xA3C8, - 0xFF29: 0xA3C9, - 0xFF2A: 0xA3CA, - 0xFF2B: 0xA3CB, - 0xFF2C: 0xA3CC, - 0xFF2D: 0xA3CD, - 0xFF2E: 0xA3CE, - 0xFF2F: 0xA3CF, - 0xFF30: 0xA3D0, - 0xFF31: 0xA3D1, - 0xFF32: 0xA3D2, - 0xFF33: 0xA3D3, - 0xFF34: 0xA3D4, - 0xFF35: 0xA3D5, - 0xFF36: 0xA3D6, - 0xFF37: 0xA3D7, - 0xFF38: 0xA3D8, - 0xFF39: 0xA3D9, - 0xFF3A: 0xA3DA, - 0xFF3B: 0xA3DB, - 0xFF3C: 0xA3DC, - 0xFF3D: 0xA3DD, - 0xFF3E: 0xA3DE, - 0xFF3F: 0xA3DF, - 0xFF40: 0xA3E0, - 0xFF41: 0xA3E1, - 0xFF42: 0xA3E2, - 0xFF43: 0xA3E3, - 0xFF44: 0xA3E4, - 0xFF45: 0xA3E5, - 0xFF46: 0xA3E6, - 0xFF47: 0xA3E7, - 0xFF48: 0xA3E8, - 0xFF49: 0xA3E9, - 0xFF4A: 0xA3EA, - 0xFF4B: 0xA3EB, - 0xFF4C: 0xA3EC, - 0xFF4D: 0xA3ED, - 0xFF4E: 0xA3EE, - 0xFF4F: 0xA3EF, - 0xFF50: 0xA3F0, - 0xFF51: 0xA3F1, - 0xFF52: 0xA3F2, - 0xFF53: 0xA3F3, - 0xFF54: 0xA3F4, - 0xFF55: 0xA3F5, - 0xFF56: 0xA3F6, - 0xFF57: 0xA3F7, - 0xFF58: 0xA3F8, - 0xFF59: 0xA3F9, - 0xFF5A: 0xA3FA, - 0xFF5B: 0xA3FB, - 0xFF5C: 0xA3FC, - 0xFF5D: 0xA3FD, - 0xFF5E: 0xA1AB, - 0xFFE0: 0xA1E9, - 0xFFE1: 0xA1EA, - 0xFFE2: 0xA956, - 0xFFE3: 0xA3FE, - 0xFFE4: 0xA957, - 0xFFE5: 0xA3A4, -} - -var gbkToUnicode = [65536]uint16{ - 0x8140: 0x4E02, - 0x8141: 0x4E04, - 0x8142: 0x4E05, - 0x8143: 0x4E06, - 0x8144: 0x4E0F, - 0x8145: 0x4E12, - 0x8146: 0x4E17, - 0x8147: 0x4E1F, - 0x8148: 0x4E20, - 0x8149: 0x4E21, - 0x814A: 0x4E23, - 0x814B: 0x4E26, - 0x814C: 0x4E29, - 0x814D: 0x4E2E, - 0x814E: 0x4E2F, - 0x814F: 0x4E31, - 0x8150: 0x4E33, - 0x8151: 0x4E35, - 0x8152: 0x4E37, - 0x8153: 0x4E3C, - 0x8154: 0x4E40, - 0x8155: 0x4E41, - 0x8156: 0x4E42, - 0x8157: 0x4E44, - 0x8158: 0x4E46, - 0x8159: 0x4E4A, - 0x815A: 0x4E51, - 0x815B: 0x4E55, - 0x815C: 0x4E57, - 0x815D: 0x4E5A, - 0x815E: 0x4E5B, - 0x815F: 0x4E62, - 0x8160: 0x4E63, - 0x8161: 0x4E64, - 0x8162: 0x4E65, - 0x8163: 0x4E67, - 0x8164: 0x4E68, - 0x8165: 0x4E6A, - 0x8166: 0x4E6B, - 0x8167: 0x4E6C, - 0x8168: 0x4E6D, - 0x8169: 0x4E6E, - 0x816A: 0x4E6F, - 0x816B: 0x4E72, - 0x816C: 0x4E74, - 0x816D: 0x4E75, - 0x816E: 0x4E76, - 0x816F: 0x4E77, - 0x8170: 0x4E78, - 0x8171: 0x4E79, - 0x8172: 0x4E7A, - 0x8173: 0x4E7B, - 0x8174: 0x4E7C, - 0x8175: 0x4E7D, - 0x8176: 0x4E7F, - 0x8177: 0x4E80, - 0x8178: 0x4E81, - 0x8179: 0x4E82, - 0x817A: 0x4E83, - 0x817B: 0x4E84, - 0x817C: 0x4E85, - 0x817D: 0x4E87, - 0x817E: 0x4E8A, - 0x8180: 0x4E90, - 0x8181: 0x4E96, - 0x8182: 0x4E97, - 0x8183: 0x4E99, - 0x8184: 0x4E9C, - 0x8185: 0x4E9D, - 0x8186: 0x4E9E, - 0x8187: 0x4EA3, - 0x8188: 0x4EAA, - 0x8189: 0x4EAF, - 0x818A: 0x4EB0, - 0x818B: 0x4EB1, - 0x818C: 0x4EB4, - 0x818D: 0x4EB6, - 0x818E: 0x4EB7, - 0x818F: 0x4EB8, - 0x8190: 0x4EB9, - 0x8191: 0x4EBC, - 0x8192: 0x4EBD, - 0x8193: 0x4EBE, - 0x8194: 0x4EC8, - 0x8195: 0x4ECC, - 0x8196: 0x4ECF, - 0x8197: 0x4ED0, - 0x8198: 0x4ED2, - 0x8199: 0x4EDA, - 0x819A: 0x4EDB, - 0x819B: 0x4EDC, - 0x819C: 0x4EE0, - 0x819D: 0x4EE2, - 0x819E: 0x4EE6, - 0x819F: 0x4EE7, - 0x81A0: 0x4EE9, - 0x81A1: 0x4EED, - 0x81A2: 0x4EEE, - 0x81A3: 0x4EEF, - 0x81A4: 0x4EF1, - 0x81A5: 0x4EF4, - 0x81A6: 0x4EF8, - 0x81A7: 0x4EF9, - 0x81A8: 0x4EFA, - 0x81A9: 0x4EFC, - 0x81AA: 0x4EFE, - 0x81AB: 0x4F00, - 0x81AC: 0x4F02, - 0x81AD: 0x4F03, - 0x81AE: 0x4F04, - 0x81AF: 0x4F05, - 0x81B0: 0x4F06, - 0x81B1: 0x4F07, - 0x81B2: 0x4F08, - 0x81B3: 0x4F0B, - 0x81B4: 0x4F0C, - 0x81B5: 0x4F12, - 0x81B6: 0x4F13, - 0x81B7: 0x4F14, - 0x81B8: 0x4F15, - 0x81B9: 0x4F16, - 0x81BA: 0x4F1C, - 0x81BB: 0x4F1D, - 0x81BC: 0x4F21, - 0x81BD: 0x4F23, - 0x81BE: 0x4F28, - 0x81BF: 0x4F29, - 0x81C0: 0x4F2C, - 0x81C1: 0x4F2D, - 0x81C2: 0x4F2E, - 0x81C3: 0x4F31, - 0x81C4: 0x4F33, - 0x81C5: 0x4F35, - 0x81C6: 0x4F37, - 0x81C7: 0x4F39, - 0x81C8: 0x4F3B, - 0x81C9: 0x4F3E, - 0x81CA: 0x4F3F, - 0x81CB: 0x4F40, - 0x81CC: 0x4F41, - 0x81CD: 0x4F42, - 0x81CE: 0x4F44, - 0x81CF: 0x4F45, - 0x81D0: 0x4F47, - 0x81D1: 0x4F48, - 0x81D2: 0x4F49, - 0x81D3: 0x4F4A, - 0x81D4: 0x4F4B, - 0x81D5: 0x4F4C, - 0x81D6: 0x4F52, - 0x81D7: 0x4F54, - 0x81D8: 0x4F56, - 0x81D9: 0x4F61, - 0x81DA: 0x4F62, - 0x81DB: 0x4F66, - 0x81DC: 0x4F68, - 0x81DD: 0x4F6A, - 0x81DE: 0x4F6B, - 0x81DF: 0x4F6D, - 0x81E0: 0x4F6E, - 0x81E1: 0x4F71, - 0x81E2: 0x4F72, - 0x81E3: 0x4F75, - 0x81E4: 0x4F77, - 0x81E5: 0x4F78, - 0x81E6: 0x4F79, - 0x81E7: 0x4F7A, - 0x81E8: 0x4F7D, - 0x81E9: 0x4F80, - 0x81EA: 0x4F81, - 0x81EB: 0x4F82, - 0x81EC: 0x4F85, - 0x81ED: 0x4F86, - 0x81EE: 0x4F87, - 0x81EF: 0x4F8A, - 0x81F0: 0x4F8C, - 0x81F1: 0x4F8E, - 0x81F2: 0x4F90, - 0x81F3: 0x4F92, - 0x81F4: 0x4F93, - 0x81F5: 0x4F95, - 0x81F6: 0x4F96, - 0x81F7: 0x4F98, - 0x81F8: 0x4F99, - 0x81F9: 0x4F9A, - 0x81FA: 0x4F9C, - 0x81FB: 0x4F9E, - 0x81FC: 0x4F9F, - 0x81FD: 0x4FA1, - 0x81FE: 0x4FA2, - 0x8240: 0x4FA4, - 0x8241: 0x4FAB, - 0x8242: 0x4FAD, - 0x8243: 0x4FB0, - 0x8244: 0x4FB1, - 0x8245: 0x4FB2, - 0x8246: 0x4FB3, - 0x8247: 0x4FB4, - 0x8248: 0x4FB6, - 0x8249: 0x4FB7, - 0x824A: 0x4FB8, - 0x824B: 0x4FB9, - 0x824C: 0x4FBA, - 0x824D: 0x4FBB, - 0x824E: 0x4FBC, - 0x824F: 0x4FBD, - 0x8250: 0x4FBE, - 0x8251: 0x4FC0, - 0x8252: 0x4FC1, - 0x8253: 0x4FC2, - 0x8254: 0x4FC6, - 0x8255: 0x4FC7, - 0x8256: 0x4FC8, - 0x8257: 0x4FC9, - 0x8258: 0x4FCB, - 0x8259: 0x4FCC, - 0x825A: 0x4FCD, - 0x825B: 0x4FD2, - 0x825C: 0x4FD3, - 0x825D: 0x4FD4, - 0x825E: 0x4FD5, - 0x825F: 0x4FD6, - 0x8260: 0x4FD9, - 0x8261: 0x4FDB, - 0x8262: 0x4FE0, - 0x8263: 0x4FE2, - 0x8264: 0x4FE4, - 0x8265: 0x4FE5, - 0x8266: 0x4FE7, - 0x8267: 0x4FEB, - 0x8268: 0x4FEC, - 0x8269: 0x4FF0, - 0x826A: 0x4FF2, - 0x826B: 0x4FF4, - 0x826C: 0x4FF5, - 0x826D: 0x4FF6, - 0x826E: 0x4FF7, - 0x826F: 0x4FF9, - 0x8270: 0x4FFB, - 0x8271: 0x4FFC, - 0x8272: 0x4FFD, - 0x8273: 0x4FFF, - 0x8274: 0x5000, - 0x8275: 0x5001, - 0x8276: 0x5002, - 0x8277: 0x5003, - 0x8278: 0x5004, - 0x8279: 0x5005, - 0x827A: 0x5006, - 0x827B: 0x5007, - 0x827C: 0x5008, - 0x827D: 0x5009, - 0x827E: 0x500A, - 0x8280: 0x500B, - 0x8281: 0x500E, - 0x8282: 0x5010, - 0x8283: 0x5011, - 0x8284: 0x5013, - 0x8285: 0x5015, - 0x8286: 0x5016, - 0x8287: 0x5017, - 0x8288: 0x501B, - 0x8289: 0x501D, - 0x828A: 0x501E, - 0x828B: 0x5020, - 0x828C: 0x5022, - 0x828D: 0x5023, - 0x828E: 0x5024, - 0x828F: 0x5027, - 0x8290: 0x502B, - 0x8291: 0x502F, - 0x8292: 0x5030, - 0x8293: 0x5031, - 0x8294: 0x5032, - 0x8295: 0x5033, - 0x8296: 0x5034, - 0x8297: 0x5035, - 0x8298: 0x5036, - 0x8299: 0x5037, - 0x829A: 0x5038, - 0x829B: 0x5039, - 0x829C: 0x503B, - 0x829D: 0x503D, - 0x829E: 0x503F, - 0x829F: 0x5040, - 0x82A0: 0x5041, - 0x82A1: 0x5042, - 0x82A2: 0x5044, - 0x82A3: 0x5045, - 0x82A4: 0x5046, - 0x82A5: 0x5049, - 0x82A6: 0x504A, - 0x82A7: 0x504B, - 0x82A8: 0x504D, - 0x82A9: 0x5050, - 0x82AA: 0x5051, - 0x82AB: 0x5052, - 0x82AC: 0x5053, - 0x82AD: 0x5054, - 0x82AE: 0x5056, - 0x82AF: 0x5057, - 0x82B0: 0x5058, - 0x82B1: 0x5059, - 0x82B2: 0x505B, - 0x82B3: 0x505D, - 0x82B4: 0x505E, - 0x82B5: 0x505F, - 0x82B6: 0x5060, - 0x82B7: 0x5061, - 0x82B8: 0x5062, - 0x82B9: 0x5063, - 0x82BA: 0x5064, - 0x82BB: 0x5066, - 0x82BC: 0x5067, - 0x82BD: 0x5068, - 0x82BE: 0x5069, - 0x82BF: 0x506A, - 0x82C0: 0x506B, - 0x82C1: 0x506D, - 0x82C2: 0x506E, - 0x82C3: 0x506F, - 0x82C4: 0x5070, - 0x82C5: 0x5071, - 0x82C6: 0x5072, - 0x82C7: 0x5073, - 0x82C8: 0x5074, - 0x82C9: 0x5075, - 0x82CA: 0x5078, - 0x82CB: 0x5079, - 0x82CC: 0x507A, - 0x82CD: 0x507C, - 0x82CE: 0x507D, - 0x82CF: 0x5081, - 0x82D0: 0x5082, - 0x82D1: 0x5083, - 0x82D2: 0x5084, - 0x82D3: 0x5086, - 0x82D4: 0x5087, - 0x82D5: 0x5089, - 0x82D6: 0x508A, - 0x82D7: 0x508B, - 0x82D8: 0x508C, - 0x82D9: 0x508E, - 0x82DA: 0x508F, - 0x82DB: 0x5090, - 0x82DC: 0x5091, - 0x82DD: 0x5092, - 0x82DE: 0x5093, - 0x82DF: 0x5094, - 0x82E0: 0x5095, - 0x82E1: 0x5096, - 0x82E2: 0x5097, - 0x82E3: 0x5098, - 0x82E4: 0x5099, - 0x82E5: 0x509A, - 0x82E6: 0x509B, - 0x82E7: 0x509C, - 0x82E8: 0x509D, - 0x82E9: 0x509E, - 0x82EA: 0x509F, - 0x82EB: 0x50A0, - 0x82EC: 0x50A1, - 0x82ED: 0x50A2, - 0x82EE: 0x50A4, - 0x82EF: 0x50A6, - 0x82F0: 0x50AA, - 0x82F1: 0x50AB, - 0x82F2: 0x50AD, - 0x82F3: 0x50AE, - 0x82F4: 0x50AF, - 0x82F5: 0x50B0, - 0x82F6: 0x50B1, - 0x82F7: 0x50B3, - 0x82F8: 0x50B4, - 0x82F9: 0x50B5, - 0x82FA: 0x50B6, - 0x82FB: 0x50B7, - 0x82FC: 0x50B8, - 0x82FD: 0x50B9, - 0x82FE: 0x50BC, - 0x8340: 0x50BD, - 0x8341: 0x50BE, - 0x8342: 0x50BF, - 0x8343: 0x50C0, - 0x8344: 0x50C1, - 0x8345: 0x50C2, - 0x8346: 0x50C3, - 0x8347: 0x50C4, - 0x8348: 0x50C5, - 0x8349: 0x50C6, - 0x834A: 0x50C7, - 0x834B: 0x50C8, - 0x834C: 0x50C9, - 0x834D: 0x50CA, - 0x834E: 0x50CB, - 0x834F: 0x50CC, - 0x8350: 0x50CD, - 0x8351: 0x50CE, - 0x8352: 0x50D0, - 0x8353: 0x50D1, - 0x8354: 0x50D2, - 0x8355: 0x50D3, - 0x8356: 0x50D4, - 0x8357: 0x50D5, - 0x8358: 0x50D7, - 0x8359: 0x50D8, - 0x835A: 0x50D9, - 0x835B: 0x50DB, - 0x835C: 0x50DC, - 0x835D: 0x50DD, - 0x835E: 0x50DE, - 0x835F: 0x50DF, - 0x8360: 0x50E0, - 0x8361: 0x50E1, - 0x8362: 0x50E2, - 0x8363: 0x50E3, - 0x8364: 0x50E4, - 0x8365: 0x50E5, - 0x8366: 0x50E8, - 0x8367: 0x50E9, - 0x8368: 0x50EA, - 0x8369: 0x50EB, - 0x836A: 0x50EF, - 0x836B: 0x50F0, - 0x836C: 0x50F1, - 0x836D: 0x50F2, - 0x836E: 0x50F4, - 0x836F: 0x50F6, - 0x8370: 0x50F7, - 0x8371: 0x50F8, - 0x8372: 0x50F9, - 0x8373: 0x50FA, - 0x8374: 0x50FC, - 0x8375: 0x50FD, - 0x8376: 0x50FE, - 0x8377: 0x50FF, - 0x8378: 0x5100, - 0x8379: 0x5101, - 0x837A: 0x5102, - 0x837B: 0x5103, - 0x837C: 0x5104, - 0x837D: 0x5105, - 0x837E: 0x5108, - 0x8380: 0x5109, - 0x8381: 0x510A, - 0x8382: 0x510C, - 0x8383: 0x510D, - 0x8384: 0x510E, - 0x8385: 0x510F, - 0x8386: 0x5110, - 0x8387: 0x5111, - 0x8388: 0x5113, - 0x8389: 0x5114, - 0x838A: 0x5115, - 0x838B: 0x5116, - 0x838C: 0x5117, - 0x838D: 0x5118, - 0x838E: 0x5119, - 0x838F: 0x511A, - 0x8390: 0x511B, - 0x8391: 0x511C, - 0x8392: 0x511D, - 0x8393: 0x511E, - 0x8394: 0x511F, - 0x8395: 0x5120, - 0x8396: 0x5122, - 0x8397: 0x5123, - 0x8398: 0x5124, - 0x8399: 0x5125, - 0x839A: 0x5126, - 0x839B: 0x5127, - 0x839C: 0x5128, - 0x839D: 0x5129, - 0x839E: 0x512A, - 0x839F: 0x512B, - 0x83A0: 0x512C, - 0x83A1: 0x512D, - 0x83A2: 0x512E, - 0x83A3: 0x512F, - 0x83A4: 0x5130, - 0x83A5: 0x5131, - 0x83A6: 0x5132, - 0x83A7: 0x5133, - 0x83A8: 0x5134, - 0x83A9: 0x5135, - 0x83AA: 0x5136, - 0x83AB: 0x5137, - 0x83AC: 0x5138, - 0x83AD: 0x5139, - 0x83AE: 0x513A, - 0x83AF: 0x513B, - 0x83B0: 0x513C, - 0x83B1: 0x513D, - 0x83B2: 0x513E, - 0x83B3: 0x5142, - 0x83B4: 0x5147, - 0x83B5: 0x514A, - 0x83B6: 0x514C, - 0x83B7: 0x514E, - 0x83B8: 0x514F, - 0x83B9: 0x5150, - 0x83BA: 0x5152, - 0x83BB: 0x5153, - 0x83BC: 0x5157, - 0x83BD: 0x5158, - 0x83BE: 0x5159, - 0x83BF: 0x515B, - 0x83C0: 0x515D, - 0x83C1: 0x515E, - 0x83C2: 0x515F, - 0x83C3: 0x5160, - 0x83C4: 0x5161, - 0x83C5: 0x5163, - 0x83C6: 0x5164, - 0x83C7: 0x5166, - 0x83C8: 0x5167, - 0x83C9: 0x5169, - 0x83CA: 0x516A, - 0x83CB: 0x516F, - 0x83CC: 0x5172, - 0x83CD: 0x517A, - 0x83CE: 0x517E, - 0x83CF: 0x517F, - 0x83D0: 0x5183, - 0x83D1: 0x5184, - 0x83D2: 0x5186, - 0x83D3: 0x5187, - 0x83D4: 0x518A, - 0x83D5: 0x518B, - 0x83D6: 0x518E, - 0x83D7: 0x518F, - 0x83D8: 0x5190, - 0x83D9: 0x5191, - 0x83DA: 0x5193, - 0x83DB: 0x5194, - 0x83DC: 0x5198, - 0x83DD: 0x519A, - 0x83DE: 0x519D, - 0x83DF: 0x519E, - 0x83E0: 0x519F, - 0x83E1: 0x51A1, - 0x83E2: 0x51A3, - 0x83E3: 0x51A6, - 0x83E4: 0x51A7, - 0x83E5: 0x51A8, - 0x83E6: 0x51A9, - 0x83E7: 0x51AA, - 0x83E8: 0x51AD, - 0x83E9: 0x51AE, - 0x83EA: 0x51B4, - 0x83EB: 0x51B8, - 0x83EC: 0x51B9, - 0x83ED: 0x51BA, - 0x83EE: 0x51BE, - 0x83EF: 0x51BF, - 0x83F0: 0x51C1, - 0x83F1: 0x51C2, - 0x83F2: 0x51C3, - 0x83F3: 0x51C5, - 0x83F4: 0x51C8, - 0x83F5: 0x51CA, - 0x83F6: 0x51CD, - 0x83F7: 0x51CE, - 0x83F8: 0x51D0, - 0x83F9: 0x51D2, - 0x83FA: 0x51D3, - 0x83FB: 0x51D4, - 0x83FC: 0x51D5, - 0x83FD: 0x51D6, - 0x83FE: 0x51D7, - 0x8440: 0x51D8, - 0x8441: 0x51D9, - 0x8442: 0x51DA, - 0x8443: 0x51DC, - 0x8444: 0x51DE, - 0x8445: 0x51DF, - 0x8446: 0x51E2, - 0x8447: 0x51E3, - 0x8448: 0x51E5, - 0x8449: 0x51E6, - 0x844A: 0x51E7, - 0x844B: 0x51E8, - 0x844C: 0x51E9, - 0x844D: 0x51EA, - 0x844E: 0x51EC, - 0x844F: 0x51EE, - 0x8450: 0x51F1, - 0x8451: 0x51F2, - 0x8452: 0x51F4, - 0x8453: 0x51F7, - 0x8454: 0x51FE, - 0x8455: 0x5204, - 0x8456: 0x5205, - 0x8457: 0x5209, - 0x8458: 0x520B, - 0x8459: 0x520C, - 0x845A: 0x520F, - 0x845B: 0x5210, - 0x845C: 0x5213, - 0x845D: 0x5214, - 0x845E: 0x5215, - 0x845F: 0x521C, - 0x8460: 0x521E, - 0x8461: 0x521F, - 0x8462: 0x5221, - 0x8463: 0x5222, - 0x8464: 0x5223, - 0x8465: 0x5225, - 0x8466: 0x5226, - 0x8467: 0x5227, - 0x8468: 0x522A, - 0x8469: 0x522C, - 0x846A: 0x522F, - 0x846B: 0x5231, - 0x846C: 0x5232, - 0x846D: 0x5234, - 0x846E: 0x5235, - 0x846F: 0x523C, - 0x8470: 0x523E, - 0x8471: 0x5244, - 0x8472: 0x5245, - 0x8473: 0x5246, - 0x8474: 0x5247, - 0x8475: 0x5248, - 0x8476: 0x5249, - 0x8477: 0x524B, - 0x8478: 0x524E, - 0x8479: 0x524F, - 0x847A: 0x5252, - 0x847B: 0x5253, - 0x847C: 0x5255, - 0x847D: 0x5257, - 0x847E: 0x5258, - 0x8480: 0x5259, - 0x8481: 0x525A, - 0x8482: 0x525B, - 0x8483: 0x525D, - 0x8484: 0x525F, - 0x8485: 0x5260, - 0x8486: 0x5262, - 0x8487: 0x5263, - 0x8488: 0x5264, - 0x8489: 0x5266, - 0x848A: 0x5268, - 0x848B: 0x526B, - 0x848C: 0x526C, - 0x848D: 0x526D, - 0x848E: 0x526E, - 0x848F: 0x5270, - 0x8490: 0x5271, - 0x8491: 0x5273, - 0x8492: 0x5274, - 0x8493: 0x5275, - 0x8494: 0x5276, - 0x8495: 0x5277, - 0x8496: 0x5278, - 0x8497: 0x5279, - 0x8498: 0x527A, - 0x8499: 0x527B, - 0x849A: 0x527C, - 0x849B: 0x527E, - 0x849C: 0x5280, - 0x849D: 0x5283, - 0x849E: 0x5284, - 0x849F: 0x5285, - 0x84A0: 0x5286, - 0x84A1: 0x5287, - 0x84A2: 0x5289, - 0x84A3: 0x528A, - 0x84A4: 0x528B, - 0x84A5: 0x528C, - 0x84A6: 0x528D, - 0x84A7: 0x528E, - 0x84A8: 0x528F, - 0x84A9: 0x5291, - 0x84AA: 0x5292, - 0x84AB: 0x5294, - 0x84AC: 0x5295, - 0x84AD: 0x5296, - 0x84AE: 0x5297, - 0x84AF: 0x5298, - 0x84B0: 0x5299, - 0x84B1: 0x529A, - 0x84B2: 0x529C, - 0x84B3: 0x52A4, - 0x84B4: 0x52A5, - 0x84B5: 0x52A6, - 0x84B6: 0x52A7, - 0x84B7: 0x52AE, - 0x84B8: 0x52AF, - 0x84B9: 0x52B0, - 0x84BA: 0x52B4, - 0x84BB: 0x52B5, - 0x84BC: 0x52B6, - 0x84BD: 0x52B7, - 0x84BE: 0x52B8, - 0x84BF: 0x52B9, - 0x84C0: 0x52BA, - 0x84C1: 0x52BB, - 0x84C2: 0x52BC, - 0x84C3: 0x52BD, - 0x84C4: 0x52C0, - 0x84C5: 0x52C1, - 0x84C6: 0x52C2, - 0x84C7: 0x52C4, - 0x84C8: 0x52C5, - 0x84C9: 0x52C6, - 0x84CA: 0x52C8, - 0x84CB: 0x52CA, - 0x84CC: 0x52CC, - 0x84CD: 0x52CD, - 0x84CE: 0x52CE, - 0x84CF: 0x52CF, - 0x84D0: 0x52D1, - 0x84D1: 0x52D3, - 0x84D2: 0x52D4, - 0x84D3: 0x52D5, - 0x84D4: 0x52D7, - 0x84D5: 0x52D9, - 0x84D6: 0x52DA, - 0x84D7: 0x52DB, - 0x84D8: 0x52DC, - 0x84D9: 0x52DD, - 0x84DA: 0x52DE, - 0x84DB: 0x52E0, - 0x84DC: 0x52E1, - 0x84DD: 0x52E2, - 0x84DE: 0x52E3, - 0x84DF: 0x52E5, - 0x84E0: 0x52E6, - 0x84E1: 0x52E7, - 0x84E2: 0x52E8, - 0x84E3: 0x52E9, - 0x84E4: 0x52EA, - 0x84E5: 0x52EB, - 0x84E6: 0x52EC, - 0x84E7: 0x52ED, - 0x84E8: 0x52EE, - 0x84E9: 0x52EF, - 0x84EA: 0x52F1, - 0x84EB: 0x52F2, - 0x84EC: 0x52F3, - 0x84ED: 0x52F4, - 0x84EE: 0x52F5, - 0x84EF: 0x52F6, - 0x84F0: 0x52F7, - 0x84F1: 0x52F8, - 0x84F2: 0x52FB, - 0x84F3: 0x52FC, - 0x84F4: 0x52FD, - 0x84F5: 0x5301, - 0x84F6: 0x5302, - 0x84F7: 0x5303, - 0x84F8: 0x5304, - 0x84F9: 0x5307, - 0x84FA: 0x5309, - 0x84FB: 0x530A, - 0x84FC: 0x530B, - 0x84FD: 0x530C, - 0x84FE: 0x530E, - 0x8540: 0x5311, - 0x8541: 0x5312, - 0x8542: 0x5313, - 0x8543: 0x5314, - 0x8544: 0x5318, - 0x8545: 0x531B, - 0x8546: 0x531C, - 0x8547: 0x531E, - 0x8548: 0x531F, - 0x8549: 0x5322, - 0x854A: 0x5324, - 0x854B: 0x5325, - 0x854C: 0x5327, - 0x854D: 0x5328, - 0x854E: 0x5329, - 0x854F: 0x532B, - 0x8550: 0x532C, - 0x8551: 0x532D, - 0x8552: 0x532F, - 0x8553: 0x5330, - 0x8554: 0x5331, - 0x8555: 0x5332, - 0x8556: 0x5333, - 0x8557: 0x5334, - 0x8558: 0x5335, - 0x8559: 0x5336, - 0x855A: 0x5337, - 0x855B: 0x5338, - 0x855C: 0x533C, - 0x855D: 0x533D, - 0x855E: 0x5340, - 0x855F: 0x5342, - 0x8560: 0x5344, - 0x8561: 0x5346, - 0x8562: 0x534B, - 0x8563: 0x534C, - 0x8564: 0x534D, - 0x8565: 0x5350, - 0x8566: 0x5354, - 0x8567: 0x5358, - 0x8568: 0x5359, - 0x8569: 0x535B, - 0x856A: 0x535D, - 0x856B: 0x5365, - 0x856C: 0x5368, - 0x856D: 0x536A, - 0x856E: 0x536C, - 0x856F: 0x536D, - 0x8570: 0x5372, - 0x8571: 0x5376, - 0x8572: 0x5379, - 0x8573: 0x537B, - 0x8574: 0x537C, - 0x8575: 0x537D, - 0x8576: 0x537E, - 0x8577: 0x5380, - 0x8578: 0x5381, - 0x8579: 0x5383, - 0x857A: 0x5387, - 0x857B: 0x5388, - 0x857C: 0x538A, - 0x857D: 0x538E, - 0x857E: 0x538F, - 0x8580: 0x5390, - 0x8581: 0x5391, - 0x8582: 0x5392, - 0x8583: 0x5393, - 0x8584: 0x5394, - 0x8585: 0x5396, - 0x8586: 0x5397, - 0x8587: 0x5399, - 0x8588: 0x539B, - 0x8589: 0x539C, - 0x858A: 0x539E, - 0x858B: 0x53A0, - 0x858C: 0x53A1, - 0x858D: 0x53A4, - 0x858E: 0x53A7, - 0x858F: 0x53AA, - 0x8590: 0x53AB, - 0x8591: 0x53AC, - 0x8592: 0x53AD, - 0x8593: 0x53AF, - 0x8594: 0x53B0, - 0x8595: 0x53B1, - 0x8596: 0x53B2, - 0x8597: 0x53B3, - 0x8598: 0x53B4, - 0x8599: 0x53B5, - 0x859A: 0x53B7, - 0x859B: 0x53B8, - 0x859C: 0x53B9, - 0x859D: 0x53BA, - 0x859E: 0x53BC, - 0x859F: 0x53BD, - 0x85A0: 0x53BE, - 0x85A1: 0x53C0, - 0x85A2: 0x53C3, - 0x85A3: 0x53C4, - 0x85A4: 0x53C5, - 0x85A5: 0x53C6, - 0x85A6: 0x53C7, - 0x85A7: 0x53CE, - 0x85A8: 0x53CF, - 0x85A9: 0x53D0, - 0x85AA: 0x53D2, - 0x85AB: 0x53D3, - 0x85AC: 0x53D5, - 0x85AD: 0x53DA, - 0x85AE: 0x53DC, - 0x85AF: 0x53DD, - 0x85B0: 0x53DE, - 0x85B1: 0x53E1, - 0x85B2: 0x53E2, - 0x85B3: 0x53E7, - 0x85B4: 0x53F4, - 0x85B5: 0x53FA, - 0x85B6: 0x53FE, - 0x85B7: 0x53FF, - 0x85B8: 0x5400, - 0x85B9: 0x5402, - 0x85BA: 0x5405, - 0x85BB: 0x5407, - 0x85BC: 0x540B, - 0x85BD: 0x5414, - 0x85BE: 0x5418, - 0x85BF: 0x5419, - 0x85C0: 0x541A, - 0x85C1: 0x541C, - 0x85C2: 0x5422, - 0x85C3: 0x5424, - 0x85C4: 0x5425, - 0x85C5: 0x542A, - 0x85C6: 0x5430, - 0x85C7: 0x5433, - 0x85C8: 0x5436, - 0x85C9: 0x5437, - 0x85CA: 0x543A, - 0x85CB: 0x543D, - 0x85CC: 0x543F, - 0x85CD: 0x5441, - 0x85CE: 0x5442, - 0x85CF: 0x5444, - 0x85D0: 0x5445, - 0x85D1: 0x5447, - 0x85D2: 0x5449, - 0x85D3: 0x544C, - 0x85D4: 0x544D, - 0x85D5: 0x544E, - 0x85D6: 0x544F, - 0x85D7: 0x5451, - 0x85D8: 0x545A, - 0x85D9: 0x545D, - 0x85DA: 0x545E, - 0x85DB: 0x545F, - 0x85DC: 0x5460, - 0x85DD: 0x5461, - 0x85DE: 0x5463, - 0x85DF: 0x5465, - 0x85E0: 0x5467, - 0x85E1: 0x5469, - 0x85E2: 0x546A, - 0x85E3: 0x546B, - 0x85E4: 0x546C, - 0x85E5: 0x546D, - 0x85E6: 0x546E, - 0x85E7: 0x546F, - 0x85E8: 0x5470, - 0x85E9: 0x5474, - 0x85EA: 0x5479, - 0x85EB: 0x547A, - 0x85EC: 0x547E, - 0x85ED: 0x547F, - 0x85EE: 0x5481, - 0x85EF: 0x5483, - 0x85F0: 0x5485, - 0x85F1: 0x5487, - 0x85F2: 0x5488, - 0x85F3: 0x5489, - 0x85F4: 0x548A, - 0x85F5: 0x548D, - 0x85F6: 0x5491, - 0x85F7: 0x5493, - 0x85F8: 0x5497, - 0x85F9: 0x5498, - 0x85FA: 0x549C, - 0x85FB: 0x549E, - 0x85FC: 0x549F, - 0x85FD: 0x54A0, - 0x85FE: 0x54A1, - 0x8640: 0x54A2, - 0x8641: 0x54A5, - 0x8642: 0x54AE, - 0x8643: 0x54B0, - 0x8644: 0x54B2, - 0x8645: 0x54B5, - 0x8646: 0x54B6, - 0x8647: 0x54B7, - 0x8648: 0x54B9, - 0x8649: 0x54BA, - 0x864A: 0x54BC, - 0x864B: 0x54BE, - 0x864C: 0x54C3, - 0x864D: 0x54C5, - 0x864E: 0x54CA, - 0x864F: 0x54CB, - 0x8650: 0x54D6, - 0x8651: 0x54D8, - 0x8652: 0x54DB, - 0x8653: 0x54E0, - 0x8654: 0x54E1, - 0x8655: 0x54E2, - 0x8656: 0x54E3, - 0x8657: 0x54E4, - 0x8658: 0x54EB, - 0x8659: 0x54EC, - 0x865A: 0x54EF, - 0x865B: 0x54F0, - 0x865C: 0x54F1, - 0x865D: 0x54F4, - 0x865E: 0x54F5, - 0x865F: 0x54F6, - 0x8660: 0x54F7, - 0x8661: 0x54F8, - 0x8662: 0x54F9, - 0x8663: 0x54FB, - 0x8664: 0x54FE, - 0x8665: 0x5500, - 0x8666: 0x5502, - 0x8667: 0x5503, - 0x8668: 0x5504, - 0x8669: 0x5505, - 0x866A: 0x5508, - 0x866B: 0x550A, - 0x866C: 0x550B, - 0x866D: 0x550C, - 0x866E: 0x550D, - 0x866F: 0x550E, - 0x8670: 0x5512, - 0x8671: 0x5513, - 0x8672: 0x5515, - 0x8673: 0x5516, - 0x8674: 0x5517, - 0x8675: 0x5518, - 0x8676: 0x5519, - 0x8677: 0x551A, - 0x8678: 0x551C, - 0x8679: 0x551D, - 0x867A: 0x551E, - 0x867B: 0x551F, - 0x867C: 0x5521, - 0x867D: 0x5525, - 0x867E: 0x5526, - 0x8680: 0x5528, - 0x8681: 0x5529, - 0x8682: 0x552B, - 0x8683: 0x552D, - 0x8684: 0x5532, - 0x8685: 0x5534, - 0x8686: 0x5535, - 0x8687: 0x5536, - 0x8688: 0x5538, - 0x8689: 0x5539, - 0x868A: 0x553A, - 0x868B: 0x553B, - 0x868C: 0x553D, - 0x868D: 0x5540, - 0x868E: 0x5542, - 0x868F: 0x5545, - 0x8690: 0x5547, - 0x8691: 0x5548, - 0x8692: 0x554B, - 0x8693: 0x554C, - 0x8694: 0x554D, - 0x8695: 0x554E, - 0x8696: 0x554F, - 0x8697: 0x5551, - 0x8698: 0x5552, - 0x8699: 0x5553, - 0x869A: 0x5554, - 0x869B: 0x5557, - 0x869C: 0x5558, - 0x869D: 0x5559, - 0x869E: 0x555A, - 0x869F: 0x555B, - 0x86A0: 0x555D, - 0x86A1: 0x555E, - 0x86A2: 0x555F, - 0x86A3: 0x5560, - 0x86A4: 0x5562, - 0x86A5: 0x5563, - 0x86A6: 0x5568, - 0x86A7: 0x5569, - 0x86A8: 0x556B, - 0x86A9: 0x556F, - 0x86AA: 0x5570, - 0x86AB: 0x5571, - 0x86AC: 0x5572, - 0x86AD: 0x5573, - 0x86AE: 0x5574, - 0x86AF: 0x5579, - 0x86B0: 0x557A, - 0x86B1: 0x557D, - 0x86B2: 0x557F, - 0x86B3: 0x5585, - 0x86B4: 0x5586, - 0x86B5: 0x558C, - 0x86B6: 0x558D, - 0x86B7: 0x558E, - 0x86B8: 0x5590, - 0x86B9: 0x5592, - 0x86BA: 0x5593, - 0x86BB: 0x5595, - 0x86BC: 0x5596, - 0x86BD: 0x5597, - 0x86BE: 0x559A, - 0x86BF: 0x559B, - 0x86C0: 0x559E, - 0x86C1: 0x55A0, - 0x86C2: 0x55A1, - 0x86C3: 0x55A2, - 0x86C4: 0x55A3, - 0x86C5: 0x55A4, - 0x86C6: 0x55A5, - 0x86C7: 0x55A6, - 0x86C8: 0x55A8, - 0x86C9: 0x55A9, - 0x86CA: 0x55AA, - 0x86CB: 0x55AB, - 0x86CC: 0x55AC, - 0x86CD: 0x55AD, - 0x86CE: 0x55AE, - 0x86CF: 0x55AF, - 0x86D0: 0x55B0, - 0x86D1: 0x55B2, - 0x86D2: 0x55B4, - 0x86D3: 0x55B6, - 0x86D4: 0x55B8, - 0x86D5: 0x55BA, - 0x86D6: 0x55BC, - 0x86D7: 0x55BF, - 0x86D8: 0x55C0, - 0x86D9: 0x55C1, - 0x86DA: 0x55C2, - 0x86DB: 0x55C3, - 0x86DC: 0x55C6, - 0x86DD: 0x55C7, - 0x86DE: 0x55C8, - 0x86DF: 0x55CA, - 0x86E0: 0x55CB, - 0x86E1: 0x55CE, - 0x86E2: 0x55CF, - 0x86E3: 0x55D0, - 0x86E4: 0x55D5, - 0x86E5: 0x55D7, - 0x86E6: 0x55D8, - 0x86E7: 0x55D9, - 0x86E8: 0x55DA, - 0x86E9: 0x55DB, - 0x86EA: 0x55DE, - 0x86EB: 0x55E0, - 0x86EC: 0x55E2, - 0x86ED: 0x55E7, - 0x86EE: 0x55E9, - 0x86EF: 0x55ED, - 0x86F0: 0x55EE, - 0x86F1: 0x55F0, - 0x86F2: 0x55F1, - 0x86F3: 0x55F4, - 0x86F4: 0x55F6, - 0x86F5: 0x55F8, - 0x86F6: 0x55F9, - 0x86F7: 0x55FA, - 0x86F8: 0x55FB, - 0x86F9: 0x55FC, - 0x86FA: 0x55FF, - 0x86FB: 0x5602, - 0x86FC: 0x5603, - 0x86FD: 0x5604, - 0x86FE: 0x5605, - 0x8740: 0x5606, - 0x8741: 0x5607, - 0x8742: 0x560A, - 0x8743: 0x560B, - 0x8744: 0x560D, - 0x8745: 0x5610, - 0x8746: 0x5611, - 0x8747: 0x5612, - 0x8748: 0x5613, - 0x8749: 0x5614, - 0x874A: 0x5615, - 0x874B: 0x5616, - 0x874C: 0x5617, - 0x874D: 0x5619, - 0x874E: 0x561A, - 0x874F: 0x561C, - 0x8750: 0x561D, - 0x8751: 0x5620, - 0x8752: 0x5621, - 0x8753: 0x5622, - 0x8754: 0x5625, - 0x8755: 0x5626, - 0x8756: 0x5628, - 0x8757: 0x5629, - 0x8758: 0x562A, - 0x8759: 0x562B, - 0x875A: 0x562E, - 0x875B: 0x562F, - 0x875C: 0x5630, - 0x875D: 0x5633, - 0x875E: 0x5635, - 0x875F: 0x5637, - 0x8760: 0x5638, - 0x8761: 0x563A, - 0x8762: 0x563C, - 0x8763: 0x563D, - 0x8764: 0x563E, - 0x8765: 0x5640, - 0x8766: 0x5641, - 0x8767: 0x5642, - 0x8768: 0x5643, - 0x8769: 0x5644, - 0x876A: 0x5645, - 0x876B: 0x5646, - 0x876C: 0x5647, - 0x876D: 0x5648, - 0x876E: 0x5649, - 0x876F: 0x564A, - 0x8770: 0x564B, - 0x8771: 0x564F, - 0x8772: 0x5650, - 0x8773: 0x5651, - 0x8774: 0x5652, - 0x8775: 0x5653, - 0x8776: 0x5655, - 0x8777: 0x5656, - 0x8778: 0x565A, - 0x8779: 0x565B, - 0x877A: 0x565D, - 0x877B: 0x565E, - 0x877C: 0x565F, - 0x877D: 0x5660, - 0x877E: 0x5661, - 0x8780: 0x5663, - 0x8781: 0x5665, - 0x8782: 0x5666, - 0x8783: 0x5667, - 0x8784: 0x566D, - 0x8785: 0x566E, - 0x8786: 0x566F, - 0x8787: 0x5670, - 0x8788: 0x5672, - 0x8789: 0x5673, - 0x878A: 0x5674, - 0x878B: 0x5675, - 0x878C: 0x5677, - 0x878D: 0x5678, - 0x878E: 0x5679, - 0x878F: 0x567A, - 0x8790: 0x567D, - 0x8791: 0x567E, - 0x8792: 0x567F, - 0x8793: 0x5680, - 0x8794: 0x5681, - 0x8795: 0x5682, - 0x8796: 0x5683, - 0x8797: 0x5684, - 0x8798: 0x5687, - 0x8799: 0x5688, - 0x879A: 0x5689, - 0x879B: 0x568A, - 0x879C: 0x568B, - 0x879D: 0x568C, - 0x879E: 0x568D, - 0x879F: 0x5690, - 0x87A0: 0x5691, - 0x87A1: 0x5692, - 0x87A2: 0x5694, - 0x87A3: 0x5695, - 0x87A4: 0x5696, - 0x87A5: 0x5697, - 0x87A6: 0x5698, - 0x87A7: 0x5699, - 0x87A8: 0x569A, - 0x87A9: 0x569B, - 0x87AA: 0x569C, - 0x87AB: 0x569D, - 0x87AC: 0x569E, - 0x87AD: 0x569F, - 0x87AE: 0x56A0, - 0x87AF: 0x56A1, - 0x87B0: 0x56A2, - 0x87B1: 0x56A4, - 0x87B2: 0x56A5, - 0x87B3: 0x56A6, - 0x87B4: 0x56A7, - 0x87B5: 0x56A8, - 0x87B6: 0x56A9, - 0x87B7: 0x56AA, - 0x87B8: 0x56AB, - 0x87B9: 0x56AC, - 0x87BA: 0x56AD, - 0x87BB: 0x56AE, - 0x87BC: 0x56B0, - 0x87BD: 0x56B1, - 0x87BE: 0x56B2, - 0x87BF: 0x56B3, - 0x87C0: 0x56B4, - 0x87C1: 0x56B5, - 0x87C2: 0x56B6, - 0x87C3: 0x56B8, - 0x87C4: 0x56B9, - 0x87C5: 0x56BA, - 0x87C6: 0x56BB, - 0x87C7: 0x56BD, - 0x87C8: 0x56BE, - 0x87C9: 0x56BF, - 0x87CA: 0x56C0, - 0x87CB: 0x56C1, - 0x87CC: 0x56C2, - 0x87CD: 0x56C3, - 0x87CE: 0x56C4, - 0x87CF: 0x56C5, - 0x87D0: 0x56C6, - 0x87D1: 0x56C7, - 0x87D2: 0x56C8, - 0x87D3: 0x56C9, - 0x87D4: 0x56CB, - 0x87D5: 0x56CC, - 0x87D6: 0x56CD, - 0x87D7: 0x56CE, - 0x87D8: 0x56CF, - 0x87D9: 0x56D0, - 0x87DA: 0x56D1, - 0x87DB: 0x56D2, - 0x87DC: 0x56D3, - 0x87DD: 0x56D5, - 0x87DE: 0x56D6, - 0x87DF: 0x56D8, - 0x87E0: 0x56D9, - 0x87E1: 0x56DC, - 0x87E2: 0x56E3, - 0x87E3: 0x56E5, - 0x87E4: 0x56E6, - 0x87E5: 0x56E7, - 0x87E6: 0x56E8, - 0x87E7: 0x56E9, - 0x87E8: 0x56EA, - 0x87E9: 0x56EC, - 0x87EA: 0x56EE, - 0x87EB: 0x56EF, - 0x87EC: 0x56F2, - 0x87ED: 0x56F3, - 0x87EE: 0x56F6, - 0x87EF: 0x56F7, - 0x87F0: 0x56F8, - 0x87F1: 0x56FB, - 0x87F2: 0x56FC, - 0x87F3: 0x5700, - 0x87F4: 0x5701, - 0x87F5: 0x5702, - 0x87F6: 0x5705, - 0x87F7: 0x5707, - 0x87F8: 0x570B, - 0x87F9: 0x570C, - 0x87FA: 0x570D, - 0x87FB: 0x570E, - 0x87FC: 0x570F, - 0x87FD: 0x5710, - 0x87FE: 0x5711, - 0x8840: 0x5712, - 0x8841: 0x5713, - 0x8842: 0x5714, - 0x8843: 0x5715, - 0x8844: 0x5716, - 0x8845: 0x5717, - 0x8846: 0x5718, - 0x8847: 0x5719, - 0x8848: 0x571A, - 0x8849: 0x571B, - 0x884A: 0x571D, - 0x884B: 0x571E, - 0x884C: 0x5720, - 0x884D: 0x5721, - 0x884E: 0x5722, - 0x884F: 0x5724, - 0x8850: 0x5725, - 0x8851: 0x5726, - 0x8852: 0x5727, - 0x8853: 0x572B, - 0x8854: 0x5731, - 0x8855: 0x5732, - 0x8856: 0x5734, - 0x8857: 0x5735, - 0x8858: 0x5736, - 0x8859: 0x5737, - 0x885A: 0x5738, - 0x885B: 0x573C, - 0x885C: 0x573D, - 0x885D: 0x573F, - 0x885E: 0x5741, - 0x885F: 0x5743, - 0x8860: 0x5744, - 0x8861: 0x5745, - 0x8862: 0x5746, - 0x8863: 0x5748, - 0x8864: 0x5749, - 0x8865: 0x574B, - 0x8866: 0x5752, - 0x8867: 0x5753, - 0x8868: 0x5754, - 0x8869: 0x5755, - 0x886A: 0x5756, - 0x886B: 0x5758, - 0x886C: 0x5759, - 0x886D: 0x5762, - 0x886E: 0x5763, - 0x886F: 0x5765, - 0x8870: 0x5767, - 0x8871: 0x576C, - 0x8872: 0x576E, - 0x8873: 0x5770, - 0x8874: 0x5771, - 0x8875: 0x5772, - 0x8876: 0x5774, - 0x8877: 0x5775, - 0x8878: 0x5778, - 0x8879: 0x5779, - 0x887A: 0x577A, - 0x887B: 0x577D, - 0x887C: 0x577E, - 0x887D: 0x577F, - 0x887E: 0x5780, - 0x8880: 0x5781, - 0x8881: 0x5787, - 0x8882: 0x5788, - 0x8883: 0x5789, - 0x8884: 0x578A, - 0x8885: 0x578D, - 0x8886: 0x578E, - 0x8887: 0x578F, - 0x8888: 0x5790, - 0x8889: 0x5791, - 0x888A: 0x5794, - 0x888B: 0x5795, - 0x888C: 0x5796, - 0x888D: 0x5797, - 0x888E: 0x5798, - 0x888F: 0x5799, - 0x8890: 0x579A, - 0x8891: 0x579C, - 0x8892: 0x579D, - 0x8893: 0x579E, - 0x8894: 0x579F, - 0x8895: 0x57A5, - 0x8896: 0x57A8, - 0x8897: 0x57AA, - 0x8898: 0x57AC, - 0x8899: 0x57AF, - 0x889A: 0x57B0, - 0x889B: 0x57B1, - 0x889C: 0x57B3, - 0x889D: 0x57B5, - 0x889E: 0x57B6, - 0x889F: 0x57B7, - 0x88A0: 0x57B9, - 0x88A1: 0x57BA, - 0x88A2: 0x57BB, - 0x88A3: 0x57BC, - 0x88A4: 0x57BD, - 0x88A5: 0x57BE, - 0x88A6: 0x57BF, - 0x88A7: 0x57C0, - 0x88A8: 0x57C1, - 0x88A9: 0x57C4, - 0x88AA: 0x57C5, - 0x88AB: 0x57C6, - 0x88AC: 0x57C7, - 0x88AD: 0x57C8, - 0x88AE: 0x57C9, - 0x88AF: 0x57CA, - 0x88B0: 0x57CC, - 0x88B1: 0x57CD, - 0x88B2: 0x57D0, - 0x88B3: 0x57D1, - 0x88B4: 0x57D3, - 0x88B5: 0x57D6, - 0x88B6: 0x57D7, - 0x88B7: 0x57DB, - 0x88B8: 0x57DC, - 0x88B9: 0x57DE, - 0x88BA: 0x57E1, - 0x88BB: 0x57E2, - 0x88BC: 0x57E3, - 0x88BD: 0x57E5, - 0x88BE: 0x57E6, - 0x88BF: 0x57E7, - 0x88C0: 0x57E8, - 0x88C1: 0x57E9, - 0x88C2: 0x57EA, - 0x88C3: 0x57EB, - 0x88C4: 0x57EC, - 0x88C5: 0x57EE, - 0x88C6: 0x57F0, - 0x88C7: 0x57F1, - 0x88C8: 0x57F2, - 0x88C9: 0x57F3, - 0x88CA: 0x57F5, - 0x88CB: 0x57F6, - 0x88CC: 0x57F7, - 0x88CD: 0x57FB, - 0x88CE: 0x57FC, - 0x88CF: 0x57FE, - 0x88D0: 0x57FF, - 0x88D1: 0x5801, - 0x88D2: 0x5803, - 0x88D3: 0x5804, - 0x88D4: 0x5805, - 0x88D5: 0x5808, - 0x88D6: 0x5809, - 0x88D7: 0x580A, - 0x88D8: 0x580C, - 0x88D9: 0x580E, - 0x88DA: 0x580F, - 0x88DB: 0x5810, - 0x88DC: 0x5812, - 0x88DD: 0x5813, - 0x88DE: 0x5814, - 0x88DF: 0x5816, - 0x88E0: 0x5817, - 0x88E1: 0x5818, - 0x88E2: 0x581A, - 0x88E3: 0x581B, - 0x88E4: 0x581C, - 0x88E5: 0x581D, - 0x88E6: 0x581F, - 0x88E7: 0x5822, - 0x88E8: 0x5823, - 0x88E9: 0x5825, - 0x88EA: 0x5826, - 0x88EB: 0x5827, - 0x88EC: 0x5828, - 0x88ED: 0x5829, - 0x88EE: 0x582B, - 0x88EF: 0x582C, - 0x88F0: 0x582D, - 0x88F1: 0x582E, - 0x88F2: 0x582F, - 0x88F3: 0x5831, - 0x88F4: 0x5832, - 0x88F5: 0x5833, - 0x88F6: 0x5834, - 0x88F7: 0x5836, - 0x88F8: 0x5837, - 0x88F9: 0x5838, - 0x88FA: 0x5839, - 0x88FB: 0x583A, - 0x88FC: 0x583B, - 0x88FD: 0x583C, - 0x88FE: 0x583D, - 0x8940: 0x583E, - 0x8941: 0x583F, - 0x8942: 0x5840, - 0x8943: 0x5841, - 0x8944: 0x5842, - 0x8945: 0x5843, - 0x8946: 0x5845, - 0x8947: 0x5846, - 0x8948: 0x5847, - 0x8949: 0x5848, - 0x894A: 0x5849, - 0x894B: 0x584A, - 0x894C: 0x584B, - 0x894D: 0x584E, - 0x894E: 0x584F, - 0x894F: 0x5850, - 0x8950: 0x5852, - 0x8951: 0x5853, - 0x8952: 0x5855, - 0x8953: 0x5856, - 0x8954: 0x5857, - 0x8955: 0x5859, - 0x8956: 0x585A, - 0x8957: 0x585B, - 0x8958: 0x585C, - 0x8959: 0x585D, - 0x895A: 0x585F, - 0x895B: 0x5860, - 0x895C: 0x5861, - 0x895D: 0x5862, - 0x895E: 0x5863, - 0x895F: 0x5864, - 0x8960: 0x5866, - 0x8961: 0x5867, - 0x8962: 0x5868, - 0x8963: 0x5869, - 0x8964: 0x586A, - 0x8965: 0x586D, - 0x8966: 0x586E, - 0x8967: 0x586F, - 0x8968: 0x5870, - 0x8969: 0x5871, - 0x896A: 0x5872, - 0x896B: 0x5873, - 0x896C: 0x5874, - 0x896D: 0x5875, - 0x896E: 0x5876, - 0x896F: 0x5877, - 0x8970: 0x5878, - 0x8971: 0x5879, - 0x8972: 0x587A, - 0x8973: 0x587B, - 0x8974: 0x587C, - 0x8975: 0x587D, - 0x8976: 0x587F, - 0x8977: 0x5882, - 0x8978: 0x5884, - 0x8979: 0x5886, - 0x897A: 0x5887, - 0x897B: 0x5888, - 0x897C: 0x588A, - 0x897D: 0x588B, - 0x897E: 0x588C, - 0x8980: 0x588D, - 0x8981: 0x588E, - 0x8982: 0x588F, - 0x8983: 0x5890, - 0x8984: 0x5891, - 0x8985: 0x5894, - 0x8986: 0x5895, - 0x8987: 0x5896, - 0x8988: 0x5897, - 0x8989: 0x5898, - 0x898A: 0x589B, - 0x898B: 0x589C, - 0x898C: 0x589D, - 0x898D: 0x58A0, - 0x898E: 0x58A1, - 0x898F: 0x58A2, - 0x8990: 0x58A3, - 0x8991: 0x58A4, - 0x8992: 0x58A5, - 0x8993: 0x58A6, - 0x8994: 0x58A7, - 0x8995: 0x58AA, - 0x8996: 0x58AB, - 0x8997: 0x58AC, - 0x8998: 0x58AD, - 0x8999: 0x58AE, - 0x899A: 0x58AF, - 0x899B: 0x58B0, - 0x899C: 0x58B1, - 0x899D: 0x58B2, - 0x899E: 0x58B3, - 0x899F: 0x58B4, - 0x89A0: 0x58B5, - 0x89A1: 0x58B6, - 0x89A2: 0x58B7, - 0x89A3: 0x58B8, - 0x89A4: 0x58B9, - 0x89A5: 0x58BA, - 0x89A6: 0x58BB, - 0x89A7: 0x58BD, - 0x89A8: 0x58BE, - 0x89A9: 0x58BF, - 0x89AA: 0x58C0, - 0x89AB: 0x58C2, - 0x89AC: 0x58C3, - 0x89AD: 0x58C4, - 0x89AE: 0x58C6, - 0x89AF: 0x58C7, - 0x89B0: 0x58C8, - 0x89B1: 0x58C9, - 0x89B2: 0x58CA, - 0x89B3: 0x58CB, - 0x89B4: 0x58CC, - 0x89B5: 0x58CD, - 0x89B6: 0x58CE, - 0x89B7: 0x58CF, - 0x89B8: 0x58D0, - 0x89B9: 0x58D2, - 0x89BA: 0x58D3, - 0x89BB: 0x58D4, - 0x89BC: 0x58D6, - 0x89BD: 0x58D7, - 0x89BE: 0x58D8, - 0x89BF: 0x58D9, - 0x89C0: 0x58DA, - 0x89C1: 0x58DB, - 0x89C2: 0x58DC, - 0x89C3: 0x58DD, - 0x89C4: 0x58DE, - 0x89C5: 0x58DF, - 0x89C6: 0x58E0, - 0x89C7: 0x58E1, - 0x89C8: 0x58E2, - 0x89C9: 0x58E3, - 0x89CA: 0x58E5, - 0x89CB: 0x58E6, - 0x89CC: 0x58E7, - 0x89CD: 0x58E8, - 0x89CE: 0x58E9, - 0x89CF: 0x58EA, - 0x89D0: 0x58ED, - 0x89D1: 0x58EF, - 0x89D2: 0x58F1, - 0x89D3: 0x58F2, - 0x89D4: 0x58F4, - 0x89D5: 0x58F5, - 0x89D6: 0x58F7, - 0x89D7: 0x58F8, - 0x89D8: 0x58FA, - 0x89D9: 0x58FB, - 0x89DA: 0x58FC, - 0x89DB: 0x58FD, - 0x89DC: 0x58FE, - 0x89DD: 0x58FF, - 0x89DE: 0x5900, - 0x89DF: 0x5901, - 0x89E0: 0x5903, - 0x89E1: 0x5905, - 0x89E2: 0x5906, - 0x89E3: 0x5908, - 0x89E4: 0x5909, - 0x89E5: 0x590A, - 0x89E6: 0x590B, - 0x89E7: 0x590C, - 0x89E8: 0x590E, - 0x89E9: 0x5910, - 0x89EA: 0x5911, - 0x89EB: 0x5912, - 0x89EC: 0x5913, - 0x89ED: 0x5917, - 0x89EE: 0x5918, - 0x89EF: 0x591B, - 0x89F0: 0x591D, - 0x89F1: 0x591E, - 0x89F2: 0x5920, - 0x89F3: 0x5921, - 0x89F4: 0x5922, - 0x89F5: 0x5923, - 0x89F6: 0x5926, - 0x89F7: 0x5928, - 0x89F8: 0x592C, - 0x89F9: 0x5930, - 0x89FA: 0x5932, - 0x89FB: 0x5933, - 0x89FC: 0x5935, - 0x89FD: 0x5936, - 0x89FE: 0x593B, - 0x8A40: 0x593D, - 0x8A41: 0x593E, - 0x8A42: 0x593F, - 0x8A43: 0x5940, - 0x8A44: 0x5943, - 0x8A45: 0x5945, - 0x8A46: 0x5946, - 0x8A47: 0x594A, - 0x8A48: 0x594C, - 0x8A49: 0x594D, - 0x8A4A: 0x5950, - 0x8A4B: 0x5952, - 0x8A4C: 0x5953, - 0x8A4D: 0x5959, - 0x8A4E: 0x595B, - 0x8A4F: 0x595C, - 0x8A50: 0x595D, - 0x8A51: 0x595E, - 0x8A52: 0x595F, - 0x8A53: 0x5961, - 0x8A54: 0x5963, - 0x8A55: 0x5964, - 0x8A56: 0x5966, - 0x8A57: 0x5967, - 0x8A58: 0x5968, - 0x8A59: 0x5969, - 0x8A5A: 0x596A, - 0x8A5B: 0x596B, - 0x8A5C: 0x596C, - 0x8A5D: 0x596D, - 0x8A5E: 0x596E, - 0x8A5F: 0x596F, - 0x8A60: 0x5970, - 0x8A61: 0x5971, - 0x8A62: 0x5972, - 0x8A63: 0x5975, - 0x8A64: 0x5977, - 0x8A65: 0x597A, - 0x8A66: 0x597B, - 0x8A67: 0x597C, - 0x8A68: 0x597E, - 0x8A69: 0x597F, - 0x8A6A: 0x5980, - 0x8A6B: 0x5985, - 0x8A6C: 0x5989, - 0x8A6D: 0x598B, - 0x8A6E: 0x598C, - 0x8A6F: 0x598E, - 0x8A70: 0x598F, - 0x8A71: 0x5990, - 0x8A72: 0x5991, - 0x8A73: 0x5994, - 0x8A74: 0x5995, - 0x8A75: 0x5998, - 0x8A76: 0x599A, - 0x8A77: 0x599B, - 0x8A78: 0x599C, - 0x8A79: 0x599D, - 0x8A7A: 0x599F, - 0x8A7B: 0x59A0, - 0x8A7C: 0x59A1, - 0x8A7D: 0x59A2, - 0x8A7E: 0x59A6, - 0x8A80: 0x59A7, - 0x8A81: 0x59AC, - 0x8A82: 0x59AD, - 0x8A83: 0x59B0, - 0x8A84: 0x59B1, - 0x8A85: 0x59B3, - 0x8A86: 0x59B4, - 0x8A87: 0x59B5, - 0x8A88: 0x59B6, - 0x8A89: 0x59B7, - 0x8A8A: 0x59B8, - 0x8A8B: 0x59BA, - 0x8A8C: 0x59BC, - 0x8A8D: 0x59BD, - 0x8A8E: 0x59BF, - 0x8A8F: 0x59C0, - 0x8A90: 0x59C1, - 0x8A91: 0x59C2, - 0x8A92: 0x59C3, - 0x8A93: 0x59C4, - 0x8A94: 0x59C5, - 0x8A95: 0x59C7, - 0x8A96: 0x59C8, - 0x8A97: 0x59C9, - 0x8A98: 0x59CC, - 0x8A99: 0x59CD, - 0x8A9A: 0x59CE, - 0x8A9B: 0x59CF, - 0x8A9C: 0x59D5, - 0x8A9D: 0x59D6, - 0x8A9E: 0x59D9, - 0x8A9F: 0x59DB, - 0x8AA0: 0x59DE, - 0x8AA1: 0x59DF, - 0x8AA2: 0x59E0, - 0x8AA3: 0x59E1, - 0x8AA4: 0x59E2, - 0x8AA5: 0x59E4, - 0x8AA6: 0x59E6, - 0x8AA7: 0x59E7, - 0x8AA8: 0x59E9, - 0x8AA9: 0x59EA, - 0x8AAA: 0x59EB, - 0x8AAB: 0x59ED, - 0x8AAC: 0x59EE, - 0x8AAD: 0x59EF, - 0x8AAE: 0x59F0, - 0x8AAF: 0x59F1, - 0x8AB0: 0x59F2, - 0x8AB1: 0x59F3, - 0x8AB2: 0x59F4, - 0x8AB3: 0x59F5, - 0x8AB4: 0x59F6, - 0x8AB5: 0x59F7, - 0x8AB6: 0x59F8, - 0x8AB7: 0x59FA, - 0x8AB8: 0x59FC, - 0x8AB9: 0x59FD, - 0x8ABA: 0x59FE, - 0x8ABB: 0x5A00, - 0x8ABC: 0x5A02, - 0x8ABD: 0x5A0A, - 0x8ABE: 0x5A0B, - 0x8ABF: 0x5A0D, - 0x8AC0: 0x5A0E, - 0x8AC1: 0x5A0F, - 0x8AC2: 0x5A10, - 0x8AC3: 0x5A12, - 0x8AC4: 0x5A14, - 0x8AC5: 0x5A15, - 0x8AC6: 0x5A16, - 0x8AC7: 0x5A17, - 0x8AC8: 0x5A19, - 0x8AC9: 0x5A1A, - 0x8ACA: 0x5A1B, - 0x8ACB: 0x5A1D, - 0x8ACC: 0x5A1E, - 0x8ACD: 0x5A21, - 0x8ACE: 0x5A22, - 0x8ACF: 0x5A24, - 0x8AD0: 0x5A26, - 0x8AD1: 0x5A27, - 0x8AD2: 0x5A28, - 0x8AD3: 0x5A2A, - 0x8AD4: 0x5A2B, - 0x8AD5: 0x5A2C, - 0x8AD6: 0x5A2D, - 0x8AD7: 0x5A2E, - 0x8AD8: 0x5A2F, - 0x8AD9: 0x5A30, - 0x8ADA: 0x5A33, - 0x8ADB: 0x5A35, - 0x8ADC: 0x5A37, - 0x8ADD: 0x5A38, - 0x8ADE: 0x5A39, - 0x8ADF: 0x5A3A, - 0x8AE0: 0x5A3B, - 0x8AE1: 0x5A3D, - 0x8AE2: 0x5A3E, - 0x8AE3: 0x5A3F, - 0x8AE4: 0x5A41, - 0x8AE5: 0x5A42, - 0x8AE6: 0x5A43, - 0x8AE7: 0x5A44, - 0x8AE8: 0x5A45, - 0x8AE9: 0x5A47, - 0x8AEA: 0x5A48, - 0x8AEB: 0x5A4B, - 0x8AEC: 0x5A4C, - 0x8AED: 0x5A4D, - 0x8AEE: 0x5A4E, - 0x8AEF: 0x5A4F, - 0x8AF0: 0x5A50, - 0x8AF1: 0x5A51, - 0x8AF2: 0x5A52, - 0x8AF3: 0x5A53, - 0x8AF4: 0x5A54, - 0x8AF5: 0x5A56, - 0x8AF6: 0x5A57, - 0x8AF7: 0x5A58, - 0x8AF8: 0x5A59, - 0x8AF9: 0x5A5B, - 0x8AFA: 0x5A5C, - 0x8AFB: 0x5A5D, - 0x8AFC: 0x5A5E, - 0x8AFD: 0x5A5F, - 0x8AFE: 0x5A60, - 0x8B40: 0x5A61, - 0x8B41: 0x5A63, - 0x8B42: 0x5A64, - 0x8B43: 0x5A65, - 0x8B44: 0x5A66, - 0x8B45: 0x5A68, - 0x8B46: 0x5A69, - 0x8B47: 0x5A6B, - 0x8B48: 0x5A6C, - 0x8B49: 0x5A6D, - 0x8B4A: 0x5A6E, - 0x8B4B: 0x5A6F, - 0x8B4C: 0x5A70, - 0x8B4D: 0x5A71, - 0x8B4E: 0x5A72, - 0x8B4F: 0x5A73, - 0x8B50: 0x5A78, - 0x8B51: 0x5A79, - 0x8B52: 0x5A7B, - 0x8B53: 0x5A7C, - 0x8B54: 0x5A7D, - 0x8B55: 0x5A7E, - 0x8B56: 0x5A80, - 0x8B57: 0x5A81, - 0x8B58: 0x5A82, - 0x8B59: 0x5A83, - 0x8B5A: 0x5A84, - 0x8B5B: 0x5A85, - 0x8B5C: 0x5A86, - 0x8B5D: 0x5A87, - 0x8B5E: 0x5A88, - 0x8B5F: 0x5A89, - 0x8B60: 0x5A8A, - 0x8B61: 0x5A8B, - 0x8B62: 0x5A8C, - 0x8B63: 0x5A8D, - 0x8B64: 0x5A8E, - 0x8B65: 0x5A8F, - 0x8B66: 0x5A90, - 0x8B67: 0x5A91, - 0x8B68: 0x5A93, - 0x8B69: 0x5A94, - 0x8B6A: 0x5A95, - 0x8B6B: 0x5A96, - 0x8B6C: 0x5A97, - 0x8B6D: 0x5A98, - 0x8B6E: 0x5A99, - 0x8B6F: 0x5A9C, - 0x8B70: 0x5A9D, - 0x8B71: 0x5A9E, - 0x8B72: 0x5A9F, - 0x8B73: 0x5AA0, - 0x8B74: 0x5AA1, - 0x8B75: 0x5AA2, - 0x8B76: 0x5AA3, - 0x8B77: 0x5AA4, - 0x8B78: 0x5AA5, - 0x8B79: 0x5AA6, - 0x8B7A: 0x5AA7, - 0x8B7B: 0x5AA8, - 0x8B7C: 0x5AA9, - 0x8B7D: 0x5AAB, - 0x8B7E: 0x5AAC, - 0x8B80: 0x5AAD, - 0x8B81: 0x5AAE, - 0x8B82: 0x5AAF, - 0x8B83: 0x5AB0, - 0x8B84: 0x5AB1, - 0x8B85: 0x5AB4, - 0x8B86: 0x5AB6, - 0x8B87: 0x5AB7, - 0x8B88: 0x5AB9, - 0x8B89: 0x5ABA, - 0x8B8A: 0x5ABB, - 0x8B8B: 0x5ABC, - 0x8B8C: 0x5ABD, - 0x8B8D: 0x5ABF, - 0x8B8E: 0x5AC0, - 0x8B8F: 0x5AC3, - 0x8B90: 0x5AC4, - 0x8B91: 0x5AC5, - 0x8B92: 0x5AC6, - 0x8B93: 0x5AC7, - 0x8B94: 0x5AC8, - 0x8B95: 0x5ACA, - 0x8B96: 0x5ACB, - 0x8B97: 0x5ACD, - 0x8B98: 0x5ACE, - 0x8B99: 0x5ACF, - 0x8B9A: 0x5AD0, - 0x8B9B: 0x5AD1, - 0x8B9C: 0x5AD3, - 0x8B9D: 0x5AD5, - 0x8B9E: 0x5AD7, - 0x8B9F: 0x5AD9, - 0x8BA0: 0x5ADA, - 0x8BA1: 0x5ADB, - 0x8BA2: 0x5ADD, - 0x8BA3: 0x5ADE, - 0x8BA4: 0x5ADF, - 0x8BA5: 0x5AE2, - 0x8BA6: 0x5AE4, - 0x8BA7: 0x5AE5, - 0x8BA8: 0x5AE7, - 0x8BA9: 0x5AE8, - 0x8BAA: 0x5AEA, - 0x8BAB: 0x5AEC, - 0x8BAC: 0x5AED, - 0x8BAD: 0x5AEE, - 0x8BAE: 0x5AEF, - 0x8BAF: 0x5AF0, - 0x8BB0: 0x5AF2, - 0x8BB1: 0x5AF3, - 0x8BB2: 0x5AF4, - 0x8BB3: 0x5AF5, - 0x8BB4: 0x5AF6, - 0x8BB5: 0x5AF7, - 0x8BB6: 0x5AF8, - 0x8BB7: 0x5AF9, - 0x8BB8: 0x5AFA, - 0x8BB9: 0x5AFB, - 0x8BBA: 0x5AFC, - 0x8BBB: 0x5AFD, - 0x8BBC: 0x5AFE, - 0x8BBD: 0x5AFF, - 0x8BBE: 0x5B00, - 0x8BBF: 0x5B01, - 0x8BC0: 0x5B02, - 0x8BC1: 0x5B03, - 0x8BC2: 0x5B04, - 0x8BC3: 0x5B05, - 0x8BC4: 0x5B06, - 0x8BC5: 0x5B07, - 0x8BC6: 0x5B08, - 0x8BC7: 0x5B0A, - 0x8BC8: 0x5B0B, - 0x8BC9: 0x5B0C, - 0x8BCA: 0x5B0D, - 0x8BCB: 0x5B0E, - 0x8BCC: 0x5B0F, - 0x8BCD: 0x5B10, - 0x8BCE: 0x5B11, - 0x8BCF: 0x5B12, - 0x8BD0: 0x5B13, - 0x8BD1: 0x5B14, - 0x8BD2: 0x5B15, - 0x8BD3: 0x5B18, - 0x8BD4: 0x5B19, - 0x8BD5: 0x5B1A, - 0x8BD6: 0x5B1B, - 0x8BD7: 0x5B1C, - 0x8BD8: 0x5B1D, - 0x8BD9: 0x5B1E, - 0x8BDA: 0x5B1F, - 0x8BDB: 0x5B20, - 0x8BDC: 0x5B21, - 0x8BDD: 0x5B22, - 0x8BDE: 0x5B23, - 0x8BDF: 0x5B24, - 0x8BE0: 0x5B25, - 0x8BE1: 0x5B26, - 0x8BE2: 0x5B27, - 0x8BE3: 0x5B28, - 0x8BE4: 0x5B29, - 0x8BE5: 0x5B2A, - 0x8BE6: 0x5B2B, - 0x8BE7: 0x5B2C, - 0x8BE8: 0x5B2D, - 0x8BE9: 0x5B2E, - 0x8BEA: 0x5B2F, - 0x8BEB: 0x5B30, - 0x8BEC: 0x5B31, - 0x8BED: 0x5B33, - 0x8BEE: 0x5B35, - 0x8BEF: 0x5B36, - 0x8BF0: 0x5B38, - 0x8BF1: 0x5B39, - 0x8BF2: 0x5B3A, - 0x8BF3: 0x5B3B, - 0x8BF4: 0x5B3C, - 0x8BF5: 0x5B3D, - 0x8BF6: 0x5B3E, - 0x8BF7: 0x5B3F, - 0x8BF8: 0x5B41, - 0x8BF9: 0x5B42, - 0x8BFA: 0x5B43, - 0x8BFB: 0x5B44, - 0x8BFC: 0x5B45, - 0x8BFD: 0x5B46, - 0x8BFE: 0x5B47, - 0x8C40: 0x5B48, - 0x8C41: 0x5B49, - 0x8C42: 0x5B4A, - 0x8C43: 0x5B4B, - 0x8C44: 0x5B4C, - 0x8C45: 0x5B4D, - 0x8C46: 0x5B4E, - 0x8C47: 0x5B4F, - 0x8C48: 0x5B52, - 0x8C49: 0x5B56, - 0x8C4A: 0x5B5E, - 0x8C4B: 0x5B60, - 0x8C4C: 0x5B61, - 0x8C4D: 0x5B67, - 0x8C4E: 0x5B68, - 0x8C4F: 0x5B6B, - 0x8C50: 0x5B6D, - 0x8C51: 0x5B6E, - 0x8C52: 0x5B6F, - 0x8C53: 0x5B72, - 0x8C54: 0x5B74, - 0x8C55: 0x5B76, - 0x8C56: 0x5B77, - 0x8C57: 0x5B78, - 0x8C58: 0x5B79, - 0x8C59: 0x5B7B, - 0x8C5A: 0x5B7C, - 0x8C5B: 0x5B7E, - 0x8C5C: 0x5B7F, - 0x8C5D: 0x5B82, - 0x8C5E: 0x5B86, - 0x8C5F: 0x5B8A, - 0x8C60: 0x5B8D, - 0x8C61: 0x5B8E, - 0x8C62: 0x5B90, - 0x8C63: 0x5B91, - 0x8C64: 0x5B92, - 0x8C65: 0x5B94, - 0x8C66: 0x5B96, - 0x8C67: 0x5B9F, - 0x8C68: 0x5BA7, - 0x8C69: 0x5BA8, - 0x8C6A: 0x5BA9, - 0x8C6B: 0x5BAC, - 0x8C6C: 0x5BAD, - 0x8C6D: 0x5BAE, - 0x8C6E: 0x5BAF, - 0x8C6F: 0x5BB1, - 0x8C70: 0x5BB2, - 0x8C71: 0x5BB7, - 0x8C72: 0x5BBA, - 0x8C73: 0x5BBB, - 0x8C74: 0x5BBC, - 0x8C75: 0x5BC0, - 0x8C76: 0x5BC1, - 0x8C77: 0x5BC3, - 0x8C78: 0x5BC8, - 0x8C79: 0x5BC9, - 0x8C7A: 0x5BCA, - 0x8C7B: 0x5BCB, - 0x8C7C: 0x5BCD, - 0x8C7D: 0x5BCE, - 0x8C7E: 0x5BCF, - 0x8C80: 0x5BD1, - 0x8C81: 0x5BD4, - 0x8C82: 0x5BD5, - 0x8C83: 0x5BD6, - 0x8C84: 0x5BD7, - 0x8C85: 0x5BD8, - 0x8C86: 0x5BD9, - 0x8C87: 0x5BDA, - 0x8C88: 0x5BDB, - 0x8C89: 0x5BDC, - 0x8C8A: 0x5BE0, - 0x8C8B: 0x5BE2, - 0x8C8C: 0x5BE3, - 0x8C8D: 0x5BE6, - 0x8C8E: 0x5BE7, - 0x8C8F: 0x5BE9, - 0x8C90: 0x5BEA, - 0x8C91: 0x5BEB, - 0x8C92: 0x5BEC, - 0x8C93: 0x5BED, - 0x8C94: 0x5BEF, - 0x8C95: 0x5BF1, - 0x8C96: 0x5BF2, - 0x8C97: 0x5BF3, - 0x8C98: 0x5BF4, - 0x8C99: 0x5BF5, - 0x8C9A: 0x5BF6, - 0x8C9B: 0x5BF7, - 0x8C9C: 0x5BFD, - 0x8C9D: 0x5BFE, - 0x8C9E: 0x5C00, - 0x8C9F: 0x5C02, - 0x8CA0: 0x5C03, - 0x8CA1: 0x5C05, - 0x8CA2: 0x5C07, - 0x8CA3: 0x5C08, - 0x8CA4: 0x5C0B, - 0x8CA5: 0x5C0C, - 0x8CA6: 0x5C0D, - 0x8CA7: 0x5C0E, - 0x8CA8: 0x5C10, - 0x8CA9: 0x5C12, - 0x8CAA: 0x5C13, - 0x8CAB: 0x5C17, - 0x8CAC: 0x5C19, - 0x8CAD: 0x5C1B, - 0x8CAE: 0x5C1E, - 0x8CAF: 0x5C1F, - 0x8CB0: 0x5C20, - 0x8CB1: 0x5C21, - 0x8CB2: 0x5C23, - 0x8CB3: 0x5C26, - 0x8CB4: 0x5C28, - 0x8CB5: 0x5C29, - 0x8CB6: 0x5C2A, - 0x8CB7: 0x5C2B, - 0x8CB8: 0x5C2D, - 0x8CB9: 0x5C2E, - 0x8CBA: 0x5C2F, - 0x8CBB: 0x5C30, - 0x8CBC: 0x5C32, - 0x8CBD: 0x5C33, - 0x8CBE: 0x5C35, - 0x8CBF: 0x5C36, - 0x8CC0: 0x5C37, - 0x8CC1: 0x5C43, - 0x8CC2: 0x5C44, - 0x8CC3: 0x5C46, - 0x8CC4: 0x5C47, - 0x8CC5: 0x5C4C, - 0x8CC6: 0x5C4D, - 0x8CC7: 0x5C52, - 0x8CC8: 0x5C53, - 0x8CC9: 0x5C54, - 0x8CCA: 0x5C56, - 0x8CCB: 0x5C57, - 0x8CCC: 0x5C58, - 0x8CCD: 0x5C5A, - 0x8CCE: 0x5C5B, - 0x8CCF: 0x5C5C, - 0x8CD0: 0x5C5D, - 0x8CD1: 0x5C5F, - 0x8CD2: 0x5C62, - 0x8CD3: 0x5C64, - 0x8CD4: 0x5C67, - 0x8CD5: 0x5C68, - 0x8CD6: 0x5C69, - 0x8CD7: 0x5C6A, - 0x8CD8: 0x5C6B, - 0x8CD9: 0x5C6C, - 0x8CDA: 0x5C6D, - 0x8CDB: 0x5C70, - 0x8CDC: 0x5C72, - 0x8CDD: 0x5C73, - 0x8CDE: 0x5C74, - 0x8CDF: 0x5C75, - 0x8CE0: 0x5C76, - 0x8CE1: 0x5C77, - 0x8CE2: 0x5C78, - 0x8CE3: 0x5C7B, - 0x8CE4: 0x5C7C, - 0x8CE5: 0x5C7D, - 0x8CE6: 0x5C7E, - 0x8CE7: 0x5C80, - 0x8CE8: 0x5C83, - 0x8CE9: 0x5C84, - 0x8CEA: 0x5C85, - 0x8CEB: 0x5C86, - 0x8CEC: 0x5C87, - 0x8CED: 0x5C89, - 0x8CEE: 0x5C8A, - 0x8CEF: 0x5C8B, - 0x8CF0: 0x5C8E, - 0x8CF1: 0x5C8F, - 0x8CF2: 0x5C92, - 0x8CF3: 0x5C93, - 0x8CF4: 0x5C95, - 0x8CF5: 0x5C9D, - 0x8CF6: 0x5C9E, - 0x8CF7: 0x5C9F, - 0x8CF8: 0x5CA0, - 0x8CF9: 0x5CA1, - 0x8CFA: 0x5CA4, - 0x8CFB: 0x5CA5, - 0x8CFC: 0x5CA6, - 0x8CFD: 0x5CA7, - 0x8CFE: 0x5CA8, - 0x8D40: 0x5CAA, - 0x8D41: 0x5CAE, - 0x8D42: 0x5CAF, - 0x8D43: 0x5CB0, - 0x8D44: 0x5CB2, - 0x8D45: 0x5CB4, - 0x8D46: 0x5CB6, - 0x8D47: 0x5CB9, - 0x8D48: 0x5CBA, - 0x8D49: 0x5CBB, - 0x8D4A: 0x5CBC, - 0x8D4B: 0x5CBE, - 0x8D4C: 0x5CC0, - 0x8D4D: 0x5CC2, - 0x8D4E: 0x5CC3, - 0x8D4F: 0x5CC5, - 0x8D50: 0x5CC6, - 0x8D51: 0x5CC7, - 0x8D52: 0x5CC8, - 0x8D53: 0x5CC9, - 0x8D54: 0x5CCA, - 0x8D55: 0x5CCC, - 0x8D56: 0x5CCD, - 0x8D57: 0x5CCE, - 0x8D58: 0x5CCF, - 0x8D59: 0x5CD0, - 0x8D5A: 0x5CD1, - 0x8D5B: 0x5CD3, - 0x8D5C: 0x5CD4, - 0x8D5D: 0x5CD5, - 0x8D5E: 0x5CD6, - 0x8D5F: 0x5CD7, - 0x8D60: 0x5CD8, - 0x8D61: 0x5CDA, - 0x8D62: 0x5CDB, - 0x8D63: 0x5CDC, - 0x8D64: 0x5CDD, - 0x8D65: 0x5CDE, - 0x8D66: 0x5CDF, - 0x8D67: 0x5CE0, - 0x8D68: 0x5CE2, - 0x8D69: 0x5CE3, - 0x8D6A: 0x5CE7, - 0x8D6B: 0x5CE9, - 0x8D6C: 0x5CEB, - 0x8D6D: 0x5CEC, - 0x8D6E: 0x5CEE, - 0x8D6F: 0x5CEF, - 0x8D70: 0x5CF1, - 0x8D71: 0x5CF2, - 0x8D72: 0x5CF3, - 0x8D73: 0x5CF4, - 0x8D74: 0x5CF5, - 0x8D75: 0x5CF6, - 0x8D76: 0x5CF7, - 0x8D77: 0x5CF8, - 0x8D78: 0x5CF9, - 0x8D79: 0x5CFA, - 0x8D7A: 0x5CFC, - 0x8D7B: 0x5CFD, - 0x8D7C: 0x5CFE, - 0x8D7D: 0x5CFF, - 0x8D7E: 0x5D00, - 0x8D80: 0x5D01, - 0x8D81: 0x5D04, - 0x8D82: 0x5D05, - 0x8D83: 0x5D08, - 0x8D84: 0x5D09, - 0x8D85: 0x5D0A, - 0x8D86: 0x5D0B, - 0x8D87: 0x5D0C, - 0x8D88: 0x5D0D, - 0x8D89: 0x5D0F, - 0x8D8A: 0x5D10, - 0x8D8B: 0x5D11, - 0x8D8C: 0x5D12, - 0x8D8D: 0x5D13, - 0x8D8E: 0x5D15, - 0x8D8F: 0x5D17, - 0x8D90: 0x5D18, - 0x8D91: 0x5D19, - 0x8D92: 0x5D1A, - 0x8D93: 0x5D1C, - 0x8D94: 0x5D1D, - 0x8D95: 0x5D1F, - 0x8D96: 0x5D20, - 0x8D97: 0x5D21, - 0x8D98: 0x5D22, - 0x8D99: 0x5D23, - 0x8D9A: 0x5D25, - 0x8D9B: 0x5D28, - 0x8D9C: 0x5D2A, - 0x8D9D: 0x5D2B, - 0x8D9E: 0x5D2C, - 0x8D9F: 0x5D2F, - 0x8DA0: 0x5D30, - 0x8DA1: 0x5D31, - 0x8DA2: 0x5D32, - 0x8DA3: 0x5D33, - 0x8DA4: 0x5D35, - 0x8DA5: 0x5D36, - 0x8DA6: 0x5D37, - 0x8DA7: 0x5D38, - 0x8DA8: 0x5D39, - 0x8DA9: 0x5D3A, - 0x8DAA: 0x5D3B, - 0x8DAB: 0x5D3C, - 0x8DAC: 0x5D3F, - 0x8DAD: 0x5D40, - 0x8DAE: 0x5D41, - 0x8DAF: 0x5D42, - 0x8DB0: 0x5D43, - 0x8DB1: 0x5D44, - 0x8DB2: 0x5D45, - 0x8DB3: 0x5D46, - 0x8DB4: 0x5D48, - 0x8DB5: 0x5D49, - 0x8DB6: 0x5D4D, - 0x8DB7: 0x5D4E, - 0x8DB8: 0x5D4F, - 0x8DB9: 0x5D50, - 0x8DBA: 0x5D51, - 0x8DBB: 0x5D52, - 0x8DBC: 0x5D53, - 0x8DBD: 0x5D54, - 0x8DBE: 0x5D55, - 0x8DBF: 0x5D56, - 0x8DC0: 0x5D57, - 0x8DC1: 0x5D59, - 0x8DC2: 0x5D5A, - 0x8DC3: 0x5D5C, - 0x8DC4: 0x5D5E, - 0x8DC5: 0x5D5F, - 0x8DC6: 0x5D60, - 0x8DC7: 0x5D61, - 0x8DC8: 0x5D62, - 0x8DC9: 0x5D63, - 0x8DCA: 0x5D64, - 0x8DCB: 0x5D65, - 0x8DCC: 0x5D66, - 0x8DCD: 0x5D67, - 0x8DCE: 0x5D68, - 0x8DCF: 0x5D6A, - 0x8DD0: 0x5D6D, - 0x8DD1: 0x5D6E, - 0x8DD2: 0x5D70, - 0x8DD3: 0x5D71, - 0x8DD4: 0x5D72, - 0x8DD5: 0x5D73, - 0x8DD6: 0x5D75, - 0x8DD7: 0x5D76, - 0x8DD8: 0x5D77, - 0x8DD9: 0x5D78, - 0x8DDA: 0x5D79, - 0x8DDB: 0x5D7A, - 0x8DDC: 0x5D7B, - 0x8DDD: 0x5D7C, - 0x8DDE: 0x5D7D, - 0x8DDF: 0x5D7E, - 0x8DE0: 0x5D7F, - 0x8DE1: 0x5D80, - 0x8DE2: 0x5D81, - 0x8DE3: 0x5D83, - 0x8DE4: 0x5D84, - 0x8DE5: 0x5D85, - 0x8DE6: 0x5D86, - 0x8DE7: 0x5D87, - 0x8DE8: 0x5D88, - 0x8DE9: 0x5D89, - 0x8DEA: 0x5D8A, - 0x8DEB: 0x5D8B, - 0x8DEC: 0x5D8C, - 0x8DED: 0x5D8D, - 0x8DEE: 0x5D8E, - 0x8DEF: 0x5D8F, - 0x8DF0: 0x5D90, - 0x8DF1: 0x5D91, - 0x8DF2: 0x5D92, - 0x8DF3: 0x5D93, - 0x8DF4: 0x5D94, - 0x8DF5: 0x5D95, - 0x8DF6: 0x5D96, - 0x8DF7: 0x5D97, - 0x8DF8: 0x5D98, - 0x8DF9: 0x5D9A, - 0x8DFA: 0x5D9B, - 0x8DFB: 0x5D9C, - 0x8DFC: 0x5D9E, - 0x8DFD: 0x5D9F, - 0x8DFE: 0x5DA0, - 0x8E40: 0x5DA1, - 0x8E41: 0x5DA2, - 0x8E42: 0x5DA3, - 0x8E43: 0x5DA4, - 0x8E44: 0x5DA5, - 0x8E45: 0x5DA6, - 0x8E46: 0x5DA7, - 0x8E47: 0x5DA8, - 0x8E48: 0x5DA9, - 0x8E49: 0x5DAA, - 0x8E4A: 0x5DAB, - 0x8E4B: 0x5DAC, - 0x8E4C: 0x5DAD, - 0x8E4D: 0x5DAE, - 0x8E4E: 0x5DAF, - 0x8E4F: 0x5DB0, - 0x8E50: 0x5DB1, - 0x8E51: 0x5DB2, - 0x8E52: 0x5DB3, - 0x8E53: 0x5DB4, - 0x8E54: 0x5DB5, - 0x8E55: 0x5DB6, - 0x8E56: 0x5DB8, - 0x8E57: 0x5DB9, - 0x8E58: 0x5DBA, - 0x8E59: 0x5DBB, - 0x8E5A: 0x5DBC, - 0x8E5B: 0x5DBD, - 0x8E5C: 0x5DBE, - 0x8E5D: 0x5DBF, - 0x8E5E: 0x5DC0, - 0x8E5F: 0x5DC1, - 0x8E60: 0x5DC2, - 0x8E61: 0x5DC3, - 0x8E62: 0x5DC4, - 0x8E63: 0x5DC6, - 0x8E64: 0x5DC7, - 0x8E65: 0x5DC8, - 0x8E66: 0x5DC9, - 0x8E67: 0x5DCA, - 0x8E68: 0x5DCB, - 0x8E69: 0x5DCC, - 0x8E6A: 0x5DCE, - 0x8E6B: 0x5DCF, - 0x8E6C: 0x5DD0, - 0x8E6D: 0x5DD1, - 0x8E6E: 0x5DD2, - 0x8E6F: 0x5DD3, - 0x8E70: 0x5DD4, - 0x8E71: 0x5DD5, - 0x8E72: 0x5DD6, - 0x8E73: 0x5DD7, - 0x8E74: 0x5DD8, - 0x8E75: 0x5DD9, - 0x8E76: 0x5DDA, - 0x8E77: 0x5DDC, - 0x8E78: 0x5DDF, - 0x8E79: 0x5DE0, - 0x8E7A: 0x5DE3, - 0x8E7B: 0x5DE4, - 0x8E7C: 0x5DEA, - 0x8E7D: 0x5DEC, - 0x8E7E: 0x5DED, - 0x8E80: 0x5DF0, - 0x8E81: 0x5DF5, - 0x8E82: 0x5DF6, - 0x8E83: 0x5DF8, - 0x8E84: 0x5DF9, - 0x8E85: 0x5DFA, - 0x8E86: 0x5DFB, - 0x8E87: 0x5DFC, - 0x8E88: 0x5DFF, - 0x8E89: 0x5E00, - 0x8E8A: 0x5E04, - 0x8E8B: 0x5E07, - 0x8E8C: 0x5E09, - 0x8E8D: 0x5E0A, - 0x8E8E: 0x5E0B, - 0x8E8F: 0x5E0D, - 0x8E90: 0x5E0E, - 0x8E91: 0x5E12, - 0x8E92: 0x5E13, - 0x8E93: 0x5E17, - 0x8E94: 0x5E1E, - 0x8E95: 0x5E1F, - 0x8E96: 0x5E20, - 0x8E97: 0x5E21, - 0x8E98: 0x5E22, - 0x8E99: 0x5E23, - 0x8E9A: 0x5E24, - 0x8E9B: 0x5E25, - 0x8E9C: 0x5E28, - 0x8E9D: 0x5E29, - 0x8E9E: 0x5E2A, - 0x8E9F: 0x5E2B, - 0x8EA0: 0x5E2C, - 0x8EA1: 0x5E2F, - 0x8EA2: 0x5E30, - 0x8EA3: 0x5E32, - 0x8EA4: 0x5E33, - 0x8EA5: 0x5E34, - 0x8EA6: 0x5E35, - 0x8EA7: 0x5E36, - 0x8EA8: 0x5E39, - 0x8EA9: 0x5E3A, - 0x8EAA: 0x5E3E, - 0x8EAB: 0x5E3F, - 0x8EAC: 0x5E40, - 0x8EAD: 0x5E41, - 0x8EAE: 0x5E43, - 0x8EAF: 0x5E46, - 0x8EB0: 0x5E47, - 0x8EB1: 0x5E48, - 0x8EB2: 0x5E49, - 0x8EB3: 0x5E4A, - 0x8EB4: 0x5E4B, - 0x8EB5: 0x5E4D, - 0x8EB6: 0x5E4E, - 0x8EB7: 0x5E4F, - 0x8EB8: 0x5E50, - 0x8EB9: 0x5E51, - 0x8EBA: 0x5E52, - 0x8EBB: 0x5E53, - 0x8EBC: 0x5E56, - 0x8EBD: 0x5E57, - 0x8EBE: 0x5E58, - 0x8EBF: 0x5E59, - 0x8EC0: 0x5E5A, - 0x8EC1: 0x5E5C, - 0x8EC2: 0x5E5D, - 0x8EC3: 0x5E5F, - 0x8EC4: 0x5E60, - 0x8EC5: 0x5E63, - 0x8EC6: 0x5E64, - 0x8EC7: 0x5E65, - 0x8EC8: 0x5E66, - 0x8EC9: 0x5E67, - 0x8ECA: 0x5E68, - 0x8ECB: 0x5E69, - 0x8ECC: 0x5E6A, - 0x8ECD: 0x5E6B, - 0x8ECE: 0x5E6C, - 0x8ECF: 0x5E6D, - 0x8ED0: 0x5E6E, - 0x8ED1: 0x5E6F, - 0x8ED2: 0x5E70, - 0x8ED3: 0x5E71, - 0x8ED4: 0x5E75, - 0x8ED5: 0x5E77, - 0x8ED6: 0x5E79, - 0x8ED7: 0x5E7E, - 0x8ED8: 0x5E81, - 0x8ED9: 0x5E82, - 0x8EDA: 0x5E83, - 0x8EDB: 0x5E85, - 0x8EDC: 0x5E88, - 0x8EDD: 0x5E89, - 0x8EDE: 0x5E8C, - 0x8EDF: 0x5E8D, - 0x8EE0: 0x5E8E, - 0x8EE1: 0x5E92, - 0x8EE2: 0x5E98, - 0x8EE3: 0x5E9B, - 0x8EE4: 0x5E9D, - 0x8EE5: 0x5EA1, - 0x8EE6: 0x5EA2, - 0x8EE7: 0x5EA3, - 0x8EE8: 0x5EA4, - 0x8EE9: 0x5EA8, - 0x8EEA: 0x5EA9, - 0x8EEB: 0x5EAA, - 0x8EEC: 0x5EAB, - 0x8EED: 0x5EAC, - 0x8EEE: 0x5EAE, - 0x8EEF: 0x5EAF, - 0x8EF0: 0x5EB0, - 0x8EF1: 0x5EB1, - 0x8EF2: 0x5EB2, - 0x8EF3: 0x5EB4, - 0x8EF4: 0x5EBA, - 0x8EF5: 0x5EBB, - 0x8EF6: 0x5EBC, - 0x8EF7: 0x5EBD, - 0x8EF8: 0x5EBF, - 0x8EF9: 0x5EC0, - 0x8EFA: 0x5EC1, - 0x8EFB: 0x5EC2, - 0x8EFC: 0x5EC3, - 0x8EFD: 0x5EC4, - 0x8EFE: 0x5EC5, - 0x8F40: 0x5EC6, - 0x8F41: 0x5EC7, - 0x8F42: 0x5EC8, - 0x8F43: 0x5ECB, - 0x8F44: 0x5ECC, - 0x8F45: 0x5ECD, - 0x8F46: 0x5ECE, - 0x8F47: 0x5ECF, - 0x8F48: 0x5ED0, - 0x8F49: 0x5ED4, - 0x8F4A: 0x5ED5, - 0x8F4B: 0x5ED7, - 0x8F4C: 0x5ED8, - 0x8F4D: 0x5ED9, - 0x8F4E: 0x5EDA, - 0x8F4F: 0x5EDC, - 0x8F50: 0x5EDD, - 0x8F51: 0x5EDE, - 0x8F52: 0x5EDF, - 0x8F53: 0x5EE0, - 0x8F54: 0x5EE1, - 0x8F55: 0x5EE2, - 0x8F56: 0x5EE3, - 0x8F57: 0x5EE4, - 0x8F58: 0x5EE5, - 0x8F59: 0x5EE6, - 0x8F5A: 0x5EE7, - 0x8F5B: 0x5EE9, - 0x8F5C: 0x5EEB, - 0x8F5D: 0x5EEC, - 0x8F5E: 0x5EED, - 0x8F5F: 0x5EEE, - 0x8F60: 0x5EEF, - 0x8F61: 0x5EF0, - 0x8F62: 0x5EF1, - 0x8F63: 0x5EF2, - 0x8F64: 0x5EF3, - 0x8F65: 0x5EF5, - 0x8F66: 0x5EF8, - 0x8F67: 0x5EF9, - 0x8F68: 0x5EFB, - 0x8F69: 0x5EFC, - 0x8F6A: 0x5EFD, - 0x8F6B: 0x5F05, - 0x8F6C: 0x5F06, - 0x8F6D: 0x5F07, - 0x8F6E: 0x5F09, - 0x8F6F: 0x5F0C, - 0x8F70: 0x5F0D, - 0x8F71: 0x5F0E, - 0x8F72: 0x5F10, - 0x8F73: 0x5F12, - 0x8F74: 0x5F14, - 0x8F75: 0x5F16, - 0x8F76: 0x5F19, - 0x8F77: 0x5F1A, - 0x8F78: 0x5F1C, - 0x8F79: 0x5F1D, - 0x8F7A: 0x5F1E, - 0x8F7B: 0x5F21, - 0x8F7C: 0x5F22, - 0x8F7D: 0x5F23, - 0x8F7E: 0x5F24, - 0x8F80: 0x5F28, - 0x8F81: 0x5F2B, - 0x8F82: 0x5F2C, - 0x8F83: 0x5F2E, - 0x8F84: 0x5F30, - 0x8F85: 0x5F32, - 0x8F86: 0x5F33, - 0x8F87: 0x5F34, - 0x8F88: 0x5F35, - 0x8F89: 0x5F36, - 0x8F8A: 0x5F37, - 0x8F8B: 0x5F38, - 0x8F8C: 0x5F3B, - 0x8F8D: 0x5F3D, - 0x8F8E: 0x5F3E, - 0x8F8F: 0x5F3F, - 0x8F90: 0x5F41, - 0x8F91: 0x5F42, - 0x8F92: 0x5F43, - 0x8F93: 0x5F44, - 0x8F94: 0x5F45, - 0x8F95: 0x5F46, - 0x8F96: 0x5F47, - 0x8F97: 0x5F48, - 0x8F98: 0x5F49, - 0x8F99: 0x5F4A, - 0x8F9A: 0x5F4B, - 0x8F9B: 0x5F4C, - 0x8F9C: 0x5F4D, - 0x8F9D: 0x5F4E, - 0x8F9E: 0x5F4F, - 0x8F9F: 0x5F51, - 0x8FA0: 0x5F54, - 0x8FA1: 0x5F59, - 0x8FA2: 0x5F5A, - 0x8FA3: 0x5F5B, - 0x8FA4: 0x5F5C, - 0x8FA5: 0x5F5E, - 0x8FA6: 0x5F5F, - 0x8FA7: 0x5F60, - 0x8FA8: 0x5F63, - 0x8FA9: 0x5F65, - 0x8FAA: 0x5F67, - 0x8FAB: 0x5F68, - 0x8FAC: 0x5F6B, - 0x8FAD: 0x5F6E, - 0x8FAE: 0x5F6F, - 0x8FAF: 0x5F72, - 0x8FB0: 0x5F74, - 0x8FB1: 0x5F75, - 0x8FB2: 0x5F76, - 0x8FB3: 0x5F78, - 0x8FB4: 0x5F7A, - 0x8FB5: 0x5F7D, - 0x8FB6: 0x5F7E, - 0x8FB7: 0x5F7F, - 0x8FB8: 0x5F83, - 0x8FB9: 0x5F86, - 0x8FBA: 0x5F8D, - 0x8FBB: 0x5F8E, - 0x8FBC: 0x5F8F, - 0x8FBD: 0x5F91, - 0x8FBE: 0x5F93, - 0x8FBF: 0x5F94, - 0x8FC0: 0x5F96, - 0x8FC1: 0x5F9A, - 0x8FC2: 0x5F9B, - 0x8FC3: 0x5F9D, - 0x8FC4: 0x5F9E, - 0x8FC5: 0x5F9F, - 0x8FC6: 0x5FA0, - 0x8FC7: 0x5FA2, - 0x8FC8: 0x5FA3, - 0x8FC9: 0x5FA4, - 0x8FCA: 0x5FA5, - 0x8FCB: 0x5FA6, - 0x8FCC: 0x5FA7, - 0x8FCD: 0x5FA9, - 0x8FCE: 0x5FAB, - 0x8FCF: 0x5FAC, - 0x8FD0: 0x5FAF, - 0x8FD1: 0x5FB0, - 0x8FD2: 0x5FB1, - 0x8FD3: 0x5FB2, - 0x8FD4: 0x5FB3, - 0x8FD5: 0x5FB4, - 0x8FD6: 0x5FB6, - 0x8FD7: 0x5FB8, - 0x8FD8: 0x5FB9, - 0x8FD9: 0x5FBA, - 0x8FDA: 0x5FBB, - 0x8FDB: 0x5FBE, - 0x8FDC: 0x5FBF, - 0x8FDD: 0x5FC0, - 0x8FDE: 0x5FC1, - 0x8FDF: 0x5FC2, - 0x8FE0: 0x5FC7, - 0x8FE1: 0x5FC8, - 0x8FE2: 0x5FCA, - 0x8FE3: 0x5FCB, - 0x8FE4: 0x5FCE, - 0x8FE5: 0x5FD3, - 0x8FE6: 0x5FD4, - 0x8FE7: 0x5FD5, - 0x8FE8: 0x5FDA, - 0x8FE9: 0x5FDB, - 0x8FEA: 0x5FDC, - 0x8FEB: 0x5FDE, - 0x8FEC: 0x5FDF, - 0x8FED: 0x5FE2, - 0x8FEE: 0x5FE3, - 0x8FEF: 0x5FE5, - 0x8FF0: 0x5FE6, - 0x8FF1: 0x5FE8, - 0x8FF2: 0x5FE9, - 0x8FF3: 0x5FEC, - 0x8FF4: 0x5FEF, - 0x8FF5: 0x5FF0, - 0x8FF6: 0x5FF2, - 0x8FF7: 0x5FF3, - 0x8FF8: 0x5FF4, - 0x8FF9: 0x5FF6, - 0x8FFA: 0x5FF7, - 0x8FFB: 0x5FF9, - 0x8FFC: 0x5FFA, - 0x8FFD: 0x5FFC, - 0x8FFE: 0x6007, - 0x9040: 0x6008, - 0x9041: 0x6009, - 0x9042: 0x600B, - 0x9043: 0x600C, - 0x9044: 0x6010, - 0x9045: 0x6011, - 0x9046: 0x6013, - 0x9047: 0x6017, - 0x9048: 0x6018, - 0x9049: 0x601A, - 0x904A: 0x601E, - 0x904B: 0x601F, - 0x904C: 0x6022, - 0x904D: 0x6023, - 0x904E: 0x6024, - 0x904F: 0x602C, - 0x9050: 0x602D, - 0x9051: 0x602E, - 0x9052: 0x6030, - 0x9053: 0x6031, - 0x9054: 0x6032, - 0x9055: 0x6033, - 0x9056: 0x6034, - 0x9057: 0x6036, - 0x9058: 0x6037, - 0x9059: 0x6038, - 0x905A: 0x6039, - 0x905B: 0x603A, - 0x905C: 0x603D, - 0x905D: 0x603E, - 0x905E: 0x6040, - 0x905F: 0x6044, - 0x9060: 0x6045, - 0x9061: 0x6046, - 0x9062: 0x6047, - 0x9063: 0x6048, - 0x9064: 0x6049, - 0x9065: 0x604A, - 0x9066: 0x604C, - 0x9067: 0x604E, - 0x9068: 0x604F, - 0x9069: 0x6051, - 0x906A: 0x6053, - 0x906B: 0x6054, - 0x906C: 0x6056, - 0x906D: 0x6057, - 0x906E: 0x6058, - 0x906F: 0x605B, - 0x9070: 0x605C, - 0x9071: 0x605E, - 0x9072: 0x605F, - 0x9073: 0x6060, - 0x9074: 0x6061, - 0x9075: 0x6065, - 0x9076: 0x6066, - 0x9077: 0x606E, - 0x9078: 0x6071, - 0x9079: 0x6072, - 0x907A: 0x6074, - 0x907B: 0x6075, - 0x907C: 0x6077, - 0x907D: 0x607E, - 0x907E: 0x6080, - 0x9080: 0x6081, - 0x9081: 0x6082, - 0x9082: 0x6085, - 0x9083: 0x6086, - 0x9084: 0x6087, - 0x9085: 0x6088, - 0x9086: 0x608A, - 0x9087: 0x608B, - 0x9088: 0x608E, - 0x9089: 0x608F, - 0x908A: 0x6090, - 0x908B: 0x6091, - 0x908C: 0x6093, - 0x908D: 0x6095, - 0x908E: 0x6097, - 0x908F: 0x6098, - 0x9090: 0x6099, - 0x9091: 0x609C, - 0x9092: 0x609E, - 0x9093: 0x60A1, - 0x9094: 0x60A2, - 0x9095: 0x60A4, - 0x9096: 0x60A5, - 0x9097: 0x60A7, - 0x9098: 0x60A9, - 0x9099: 0x60AA, - 0x909A: 0x60AE, - 0x909B: 0x60B0, - 0x909C: 0x60B3, - 0x909D: 0x60B5, - 0x909E: 0x60B6, - 0x909F: 0x60B7, - 0x90A0: 0x60B9, - 0x90A1: 0x60BA, - 0x90A2: 0x60BD, - 0x90A3: 0x60BE, - 0x90A4: 0x60BF, - 0x90A5: 0x60C0, - 0x90A6: 0x60C1, - 0x90A7: 0x60C2, - 0x90A8: 0x60C3, - 0x90A9: 0x60C4, - 0x90AA: 0x60C7, - 0x90AB: 0x60C8, - 0x90AC: 0x60C9, - 0x90AD: 0x60CC, - 0x90AE: 0x60CD, - 0x90AF: 0x60CE, - 0x90B0: 0x60CF, - 0x90B1: 0x60D0, - 0x90B2: 0x60D2, - 0x90B3: 0x60D3, - 0x90B4: 0x60D4, - 0x90B5: 0x60D6, - 0x90B6: 0x60D7, - 0x90B7: 0x60D9, - 0x90B8: 0x60DB, - 0x90B9: 0x60DE, - 0x90BA: 0x60E1, - 0x90BB: 0x60E2, - 0x90BC: 0x60E3, - 0x90BD: 0x60E4, - 0x90BE: 0x60E5, - 0x90BF: 0x60EA, - 0x90C0: 0x60F1, - 0x90C1: 0x60F2, - 0x90C2: 0x60F5, - 0x90C3: 0x60F7, - 0x90C4: 0x60F8, - 0x90C5: 0x60FB, - 0x90C6: 0x60FC, - 0x90C7: 0x60FD, - 0x90C8: 0x60FE, - 0x90C9: 0x60FF, - 0x90CA: 0x6102, - 0x90CB: 0x6103, - 0x90CC: 0x6104, - 0x90CD: 0x6105, - 0x90CE: 0x6107, - 0x90CF: 0x610A, - 0x90D0: 0x610B, - 0x90D1: 0x610C, - 0x90D2: 0x6110, - 0x90D3: 0x6111, - 0x90D4: 0x6112, - 0x90D5: 0x6113, - 0x90D6: 0x6114, - 0x90D7: 0x6116, - 0x90D8: 0x6117, - 0x90D9: 0x6118, - 0x90DA: 0x6119, - 0x90DB: 0x611B, - 0x90DC: 0x611C, - 0x90DD: 0x611D, - 0x90DE: 0x611E, - 0x90DF: 0x6121, - 0x90E0: 0x6122, - 0x90E1: 0x6125, - 0x90E2: 0x6128, - 0x90E3: 0x6129, - 0x90E4: 0x612A, - 0x90E5: 0x612C, - 0x90E6: 0x612D, - 0x90E7: 0x612E, - 0x90E8: 0x612F, - 0x90E9: 0x6130, - 0x90EA: 0x6131, - 0x90EB: 0x6132, - 0x90EC: 0x6133, - 0x90ED: 0x6134, - 0x90EE: 0x6135, - 0x90EF: 0x6136, - 0x90F0: 0x6137, - 0x90F1: 0x6138, - 0x90F2: 0x6139, - 0x90F3: 0x613A, - 0x90F4: 0x613B, - 0x90F5: 0x613C, - 0x90F6: 0x613D, - 0x90F7: 0x613E, - 0x90F8: 0x6140, - 0x90F9: 0x6141, - 0x90FA: 0x6142, - 0x90FB: 0x6143, - 0x90FC: 0x6144, - 0x90FD: 0x6145, - 0x90FE: 0x6146, - 0x9140: 0x6147, - 0x9141: 0x6149, - 0x9142: 0x614B, - 0x9143: 0x614D, - 0x9144: 0x614F, - 0x9145: 0x6150, - 0x9146: 0x6152, - 0x9147: 0x6153, - 0x9148: 0x6154, - 0x9149: 0x6156, - 0x914A: 0x6157, - 0x914B: 0x6158, - 0x914C: 0x6159, - 0x914D: 0x615A, - 0x914E: 0x615B, - 0x914F: 0x615C, - 0x9150: 0x615E, - 0x9151: 0x615F, - 0x9152: 0x6160, - 0x9153: 0x6161, - 0x9154: 0x6163, - 0x9155: 0x6164, - 0x9156: 0x6165, - 0x9157: 0x6166, - 0x9158: 0x6169, - 0x9159: 0x616A, - 0x915A: 0x616B, - 0x915B: 0x616C, - 0x915C: 0x616D, - 0x915D: 0x616E, - 0x915E: 0x616F, - 0x915F: 0x6171, - 0x9160: 0x6172, - 0x9161: 0x6173, - 0x9162: 0x6174, - 0x9163: 0x6176, - 0x9164: 0x6178, - 0x9165: 0x6179, - 0x9166: 0x617A, - 0x9167: 0x617B, - 0x9168: 0x617C, - 0x9169: 0x617D, - 0x916A: 0x617E, - 0x916B: 0x617F, - 0x916C: 0x6180, - 0x916D: 0x6181, - 0x916E: 0x6182, - 0x916F: 0x6183, - 0x9170: 0x6184, - 0x9171: 0x6185, - 0x9172: 0x6186, - 0x9173: 0x6187, - 0x9174: 0x6188, - 0x9175: 0x6189, - 0x9176: 0x618A, - 0x9177: 0x618C, - 0x9178: 0x618D, - 0x9179: 0x618F, - 0x917A: 0x6190, - 0x917B: 0x6191, - 0x917C: 0x6192, - 0x917D: 0x6193, - 0x917E: 0x6195, - 0x9180: 0x6196, - 0x9181: 0x6197, - 0x9182: 0x6198, - 0x9183: 0x6199, - 0x9184: 0x619A, - 0x9185: 0x619B, - 0x9186: 0x619C, - 0x9187: 0x619E, - 0x9188: 0x619F, - 0x9189: 0x61A0, - 0x918A: 0x61A1, - 0x918B: 0x61A2, - 0x918C: 0x61A3, - 0x918D: 0x61A4, - 0x918E: 0x61A5, - 0x918F: 0x61A6, - 0x9190: 0x61AA, - 0x9191: 0x61AB, - 0x9192: 0x61AD, - 0x9193: 0x61AE, - 0x9194: 0x61AF, - 0x9195: 0x61B0, - 0x9196: 0x61B1, - 0x9197: 0x61B2, - 0x9198: 0x61B3, - 0x9199: 0x61B4, - 0x919A: 0x61B5, - 0x919B: 0x61B6, - 0x919C: 0x61B8, - 0x919D: 0x61B9, - 0x919E: 0x61BA, - 0x919F: 0x61BB, - 0x91A0: 0x61BC, - 0x91A1: 0x61BD, - 0x91A2: 0x61BF, - 0x91A3: 0x61C0, - 0x91A4: 0x61C1, - 0x91A5: 0x61C3, - 0x91A6: 0x61C4, - 0x91A7: 0x61C5, - 0x91A8: 0x61C6, - 0x91A9: 0x61C7, - 0x91AA: 0x61C9, - 0x91AB: 0x61CC, - 0x91AC: 0x61CD, - 0x91AD: 0x61CE, - 0x91AE: 0x61CF, - 0x91AF: 0x61D0, - 0x91B0: 0x61D3, - 0x91B1: 0x61D5, - 0x91B2: 0x61D6, - 0x91B3: 0x61D7, - 0x91B4: 0x61D8, - 0x91B5: 0x61D9, - 0x91B6: 0x61DA, - 0x91B7: 0x61DB, - 0x91B8: 0x61DC, - 0x91B9: 0x61DD, - 0x91BA: 0x61DE, - 0x91BB: 0x61DF, - 0x91BC: 0x61E0, - 0x91BD: 0x61E1, - 0x91BE: 0x61E2, - 0x91BF: 0x61E3, - 0x91C0: 0x61E4, - 0x91C1: 0x61E5, - 0x91C2: 0x61E7, - 0x91C3: 0x61E8, - 0x91C4: 0x61E9, - 0x91C5: 0x61EA, - 0x91C6: 0x61EB, - 0x91C7: 0x61EC, - 0x91C8: 0x61ED, - 0x91C9: 0x61EE, - 0x91CA: 0x61EF, - 0x91CB: 0x61F0, - 0x91CC: 0x61F1, - 0x91CD: 0x61F2, - 0x91CE: 0x61F3, - 0x91CF: 0x61F4, - 0x91D0: 0x61F6, - 0x91D1: 0x61F7, - 0x91D2: 0x61F8, - 0x91D3: 0x61F9, - 0x91D4: 0x61FA, - 0x91D5: 0x61FB, - 0x91D6: 0x61FC, - 0x91D7: 0x61FD, - 0x91D8: 0x61FE, - 0x91D9: 0x6200, - 0x91DA: 0x6201, - 0x91DB: 0x6202, - 0x91DC: 0x6203, - 0x91DD: 0x6204, - 0x91DE: 0x6205, - 0x91DF: 0x6207, - 0x91E0: 0x6209, - 0x91E1: 0x6213, - 0x91E2: 0x6214, - 0x91E3: 0x6219, - 0x91E4: 0x621C, - 0x91E5: 0x621D, - 0x91E6: 0x621E, - 0x91E7: 0x6220, - 0x91E8: 0x6223, - 0x91E9: 0x6226, - 0x91EA: 0x6227, - 0x91EB: 0x6228, - 0x91EC: 0x6229, - 0x91ED: 0x622B, - 0x91EE: 0x622D, - 0x91EF: 0x622F, - 0x91F0: 0x6230, - 0x91F1: 0x6231, - 0x91F2: 0x6232, - 0x91F3: 0x6235, - 0x91F4: 0x6236, - 0x91F5: 0x6238, - 0x91F6: 0x6239, - 0x91F7: 0x623A, - 0x91F8: 0x623B, - 0x91F9: 0x623C, - 0x91FA: 0x6242, - 0x91FB: 0x6244, - 0x91FC: 0x6245, - 0x91FD: 0x6246, - 0x91FE: 0x624A, - 0x9240: 0x624F, - 0x9241: 0x6250, - 0x9242: 0x6255, - 0x9243: 0x6256, - 0x9244: 0x6257, - 0x9245: 0x6259, - 0x9246: 0x625A, - 0x9247: 0x625C, - 0x9248: 0x625D, - 0x9249: 0x625E, - 0x924A: 0x625F, - 0x924B: 0x6260, - 0x924C: 0x6261, - 0x924D: 0x6262, - 0x924E: 0x6264, - 0x924F: 0x6265, - 0x9250: 0x6268, - 0x9251: 0x6271, - 0x9252: 0x6272, - 0x9253: 0x6274, - 0x9254: 0x6275, - 0x9255: 0x6277, - 0x9256: 0x6278, - 0x9257: 0x627A, - 0x9258: 0x627B, - 0x9259: 0x627D, - 0x925A: 0x6281, - 0x925B: 0x6282, - 0x925C: 0x6283, - 0x925D: 0x6285, - 0x925E: 0x6286, - 0x925F: 0x6287, - 0x9260: 0x6288, - 0x9261: 0x628B, - 0x9262: 0x628C, - 0x9263: 0x628D, - 0x9264: 0x628E, - 0x9265: 0x628F, - 0x9266: 0x6290, - 0x9267: 0x6294, - 0x9268: 0x6299, - 0x9269: 0x629C, - 0x926A: 0x629D, - 0x926B: 0x629E, - 0x926C: 0x62A3, - 0x926D: 0x62A6, - 0x926E: 0x62A7, - 0x926F: 0x62A9, - 0x9270: 0x62AA, - 0x9271: 0x62AD, - 0x9272: 0x62AE, - 0x9273: 0x62AF, - 0x9274: 0x62B0, - 0x9275: 0x62B2, - 0x9276: 0x62B3, - 0x9277: 0x62B4, - 0x9278: 0x62B6, - 0x9279: 0x62B7, - 0x927A: 0x62B8, - 0x927B: 0x62BA, - 0x927C: 0x62BE, - 0x927D: 0x62C0, - 0x927E: 0x62C1, - 0x9280: 0x62C3, - 0x9281: 0x62CB, - 0x9282: 0x62CF, - 0x9283: 0x62D1, - 0x9284: 0x62D5, - 0x9285: 0x62DD, - 0x9286: 0x62DE, - 0x9287: 0x62E0, - 0x9288: 0x62E1, - 0x9289: 0x62E4, - 0x928A: 0x62EA, - 0x928B: 0x62EB, - 0x928C: 0x62F0, - 0x928D: 0x62F2, - 0x928E: 0x62F5, - 0x928F: 0x62F8, - 0x9290: 0x62F9, - 0x9291: 0x62FA, - 0x9292: 0x62FB, - 0x9293: 0x6300, - 0x9294: 0x6303, - 0x9295: 0x6304, - 0x9296: 0x6305, - 0x9297: 0x6306, - 0x9298: 0x630A, - 0x9299: 0x630B, - 0x929A: 0x630C, - 0x929B: 0x630D, - 0x929C: 0x630F, - 0x929D: 0x6310, - 0x929E: 0x6312, - 0x929F: 0x6313, - 0x92A0: 0x6314, - 0x92A1: 0x6315, - 0x92A2: 0x6317, - 0x92A3: 0x6318, - 0x92A4: 0x6319, - 0x92A5: 0x631C, - 0x92A6: 0x6326, - 0x92A7: 0x6327, - 0x92A8: 0x6329, - 0x92A9: 0x632C, - 0x92AA: 0x632D, - 0x92AB: 0x632E, - 0x92AC: 0x6330, - 0x92AD: 0x6331, - 0x92AE: 0x6333, - 0x92AF: 0x6334, - 0x92B0: 0x6335, - 0x92B1: 0x6336, - 0x92B2: 0x6337, - 0x92B3: 0x6338, - 0x92B4: 0x633B, - 0x92B5: 0x633C, - 0x92B6: 0x633E, - 0x92B7: 0x633F, - 0x92B8: 0x6340, - 0x92B9: 0x6341, - 0x92BA: 0x6344, - 0x92BB: 0x6347, - 0x92BC: 0x6348, - 0x92BD: 0x634A, - 0x92BE: 0x6351, - 0x92BF: 0x6352, - 0x92C0: 0x6353, - 0x92C1: 0x6354, - 0x92C2: 0x6356, - 0x92C3: 0x6357, - 0x92C4: 0x6358, - 0x92C5: 0x6359, - 0x92C6: 0x635A, - 0x92C7: 0x635B, - 0x92C8: 0x635C, - 0x92C9: 0x635D, - 0x92CA: 0x6360, - 0x92CB: 0x6364, - 0x92CC: 0x6365, - 0x92CD: 0x6366, - 0x92CE: 0x6368, - 0x92CF: 0x636A, - 0x92D0: 0x636B, - 0x92D1: 0x636C, - 0x92D2: 0x636F, - 0x92D3: 0x6370, - 0x92D4: 0x6372, - 0x92D5: 0x6373, - 0x92D6: 0x6374, - 0x92D7: 0x6375, - 0x92D8: 0x6378, - 0x92D9: 0x6379, - 0x92DA: 0x637C, - 0x92DB: 0x637D, - 0x92DC: 0x637E, - 0x92DD: 0x637F, - 0x92DE: 0x6381, - 0x92DF: 0x6383, - 0x92E0: 0x6384, - 0x92E1: 0x6385, - 0x92E2: 0x6386, - 0x92E3: 0x638B, - 0x92E4: 0x638D, - 0x92E5: 0x6391, - 0x92E6: 0x6393, - 0x92E7: 0x6394, - 0x92E8: 0x6395, - 0x92E9: 0x6397, - 0x92EA: 0x6399, - 0x92EB: 0x639A, - 0x92EC: 0x639B, - 0x92ED: 0x639C, - 0x92EE: 0x639D, - 0x92EF: 0x639E, - 0x92F0: 0x639F, - 0x92F1: 0x63A1, - 0x92F2: 0x63A4, - 0x92F3: 0x63A6, - 0x92F4: 0x63AB, - 0x92F5: 0x63AF, - 0x92F6: 0x63B1, - 0x92F7: 0x63B2, - 0x92F8: 0x63B5, - 0x92F9: 0x63B6, - 0x92FA: 0x63B9, - 0x92FB: 0x63BB, - 0x92FC: 0x63BD, - 0x92FD: 0x63BF, - 0x92FE: 0x63C0, - 0x9340: 0x63C1, - 0x9341: 0x63C2, - 0x9342: 0x63C3, - 0x9343: 0x63C5, - 0x9344: 0x63C7, - 0x9345: 0x63C8, - 0x9346: 0x63CA, - 0x9347: 0x63CB, - 0x9348: 0x63CC, - 0x9349: 0x63D1, - 0x934A: 0x63D3, - 0x934B: 0x63D4, - 0x934C: 0x63D5, - 0x934D: 0x63D7, - 0x934E: 0x63D8, - 0x934F: 0x63D9, - 0x9350: 0x63DA, - 0x9351: 0x63DB, - 0x9352: 0x63DC, - 0x9353: 0x63DD, - 0x9354: 0x63DF, - 0x9355: 0x63E2, - 0x9356: 0x63E4, - 0x9357: 0x63E5, - 0x9358: 0x63E6, - 0x9359: 0x63E7, - 0x935A: 0x63E8, - 0x935B: 0x63EB, - 0x935C: 0x63EC, - 0x935D: 0x63EE, - 0x935E: 0x63EF, - 0x935F: 0x63F0, - 0x9360: 0x63F1, - 0x9361: 0x63F3, - 0x9362: 0x63F5, - 0x9363: 0x63F7, - 0x9364: 0x63F9, - 0x9365: 0x63FA, - 0x9366: 0x63FB, - 0x9367: 0x63FC, - 0x9368: 0x63FE, - 0x9369: 0x6403, - 0x936A: 0x6404, - 0x936B: 0x6406, - 0x936C: 0x6407, - 0x936D: 0x6408, - 0x936E: 0x6409, - 0x936F: 0x640A, - 0x9370: 0x640D, - 0x9371: 0x640E, - 0x9372: 0x6411, - 0x9373: 0x6412, - 0x9374: 0x6415, - 0x9375: 0x6416, - 0x9376: 0x6417, - 0x9377: 0x6418, - 0x9378: 0x6419, - 0x9379: 0x641A, - 0x937A: 0x641D, - 0x937B: 0x641F, - 0x937C: 0x6422, - 0x937D: 0x6423, - 0x937E: 0x6424, - 0x9380: 0x6425, - 0x9381: 0x6427, - 0x9382: 0x6428, - 0x9383: 0x6429, - 0x9384: 0x642B, - 0x9385: 0x642E, - 0x9386: 0x642F, - 0x9387: 0x6430, - 0x9388: 0x6431, - 0x9389: 0x6432, - 0x938A: 0x6433, - 0x938B: 0x6435, - 0x938C: 0x6436, - 0x938D: 0x6437, - 0x938E: 0x6438, - 0x938F: 0x6439, - 0x9390: 0x643B, - 0x9391: 0x643C, - 0x9392: 0x643E, - 0x9393: 0x6440, - 0x9394: 0x6442, - 0x9395: 0x6443, - 0x9396: 0x6449, - 0x9397: 0x644B, - 0x9398: 0x644C, - 0x9399: 0x644D, - 0x939A: 0x644E, - 0x939B: 0x644F, - 0x939C: 0x6450, - 0x939D: 0x6451, - 0x939E: 0x6453, - 0x939F: 0x6455, - 0x93A0: 0x6456, - 0x93A1: 0x6457, - 0x93A2: 0x6459, - 0x93A3: 0x645A, - 0x93A4: 0x645B, - 0x93A5: 0x645C, - 0x93A6: 0x645D, - 0x93A7: 0x645F, - 0x93A8: 0x6460, - 0x93A9: 0x6461, - 0x93AA: 0x6462, - 0x93AB: 0x6463, - 0x93AC: 0x6464, - 0x93AD: 0x6465, - 0x93AE: 0x6466, - 0x93AF: 0x6468, - 0x93B0: 0x646A, - 0x93B1: 0x646B, - 0x93B2: 0x646C, - 0x93B3: 0x646E, - 0x93B4: 0x646F, - 0x93B5: 0x6470, - 0x93B6: 0x6471, - 0x93B7: 0x6472, - 0x93B8: 0x6473, - 0x93B9: 0x6474, - 0x93BA: 0x6475, - 0x93BB: 0x6476, - 0x93BC: 0x6477, - 0x93BD: 0x647B, - 0x93BE: 0x647C, - 0x93BF: 0x647D, - 0x93C0: 0x647E, - 0x93C1: 0x647F, - 0x93C2: 0x6480, - 0x93C3: 0x6481, - 0x93C4: 0x6483, - 0x93C5: 0x6486, - 0x93C6: 0x6488, - 0x93C7: 0x6489, - 0x93C8: 0x648A, - 0x93C9: 0x648B, - 0x93CA: 0x648C, - 0x93CB: 0x648D, - 0x93CC: 0x648E, - 0x93CD: 0x648F, - 0x93CE: 0x6490, - 0x93CF: 0x6493, - 0x93D0: 0x6494, - 0x93D1: 0x6497, - 0x93D2: 0x6498, - 0x93D3: 0x649A, - 0x93D4: 0x649B, - 0x93D5: 0x649C, - 0x93D6: 0x649D, - 0x93D7: 0x649F, - 0x93D8: 0x64A0, - 0x93D9: 0x64A1, - 0x93DA: 0x64A2, - 0x93DB: 0x64A3, - 0x93DC: 0x64A5, - 0x93DD: 0x64A6, - 0x93DE: 0x64A7, - 0x93DF: 0x64A8, - 0x93E0: 0x64AA, - 0x93E1: 0x64AB, - 0x93E2: 0x64AF, - 0x93E3: 0x64B1, - 0x93E4: 0x64B2, - 0x93E5: 0x64B3, - 0x93E6: 0x64B4, - 0x93E7: 0x64B6, - 0x93E8: 0x64B9, - 0x93E9: 0x64BB, - 0x93EA: 0x64BD, - 0x93EB: 0x64BE, - 0x93EC: 0x64BF, - 0x93ED: 0x64C1, - 0x93EE: 0x64C3, - 0x93EF: 0x64C4, - 0x93F0: 0x64C6, - 0x93F1: 0x64C7, - 0x93F2: 0x64C8, - 0x93F3: 0x64C9, - 0x93F4: 0x64CA, - 0x93F5: 0x64CB, - 0x93F6: 0x64CC, - 0x93F7: 0x64CF, - 0x93F8: 0x64D1, - 0x93F9: 0x64D3, - 0x93FA: 0x64D4, - 0x93FB: 0x64D5, - 0x93FC: 0x64D6, - 0x93FD: 0x64D9, - 0x93FE: 0x64DA, - 0x9440: 0x64DB, - 0x9441: 0x64DC, - 0x9442: 0x64DD, - 0x9443: 0x64DF, - 0x9444: 0x64E0, - 0x9445: 0x64E1, - 0x9446: 0x64E3, - 0x9447: 0x64E5, - 0x9448: 0x64E7, - 0x9449: 0x64E8, - 0x944A: 0x64E9, - 0x944B: 0x64EA, - 0x944C: 0x64EB, - 0x944D: 0x64EC, - 0x944E: 0x64ED, - 0x944F: 0x64EE, - 0x9450: 0x64EF, - 0x9451: 0x64F0, - 0x9452: 0x64F1, - 0x9453: 0x64F2, - 0x9454: 0x64F3, - 0x9455: 0x64F4, - 0x9456: 0x64F5, - 0x9457: 0x64F6, - 0x9458: 0x64F7, - 0x9459: 0x64F8, - 0x945A: 0x64F9, - 0x945B: 0x64FA, - 0x945C: 0x64FB, - 0x945D: 0x64FC, - 0x945E: 0x64FD, - 0x945F: 0x64FE, - 0x9460: 0x64FF, - 0x9461: 0x6501, - 0x9462: 0x6502, - 0x9463: 0x6503, - 0x9464: 0x6504, - 0x9465: 0x6505, - 0x9466: 0x6506, - 0x9467: 0x6507, - 0x9468: 0x6508, - 0x9469: 0x650A, - 0x946A: 0x650B, - 0x946B: 0x650C, - 0x946C: 0x650D, - 0x946D: 0x650E, - 0x946E: 0x650F, - 0x946F: 0x6510, - 0x9470: 0x6511, - 0x9471: 0x6513, - 0x9472: 0x6514, - 0x9473: 0x6515, - 0x9474: 0x6516, - 0x9475: 0x6517, - 0x9476: 0x6519, - 0x9477: 0x651A, - 0x9478: 0x651B, - 0x9479: 0x651C, - 0x947A: 0x651D, - 0x947B: 0x651E, - 0x947C: 0x651F, - 0x947D: 0x6520, - 0x947E: 0x6521, - 0x9480: 0x6522, - 0x9481: 0x6523, - 0x9482: 0x6524, - 0x9483: 0x6526, - 0x9484: 0x6527, - 0x9485: 0x6528, - 0x9486: 0x6529, - 0x9487: 0x652A, - 0x9488: 0x652C, - 0x9489: 0x652D, - 0x948A: 0x6530, - 0x948B: 0x6531, - 0x948C: 0x6532, - 0x948D: 0x6533, - 0x948E: 0x6537, - 0x948F: 0x653A, - 0x9490: 0x653C, - 0x9491: 0x653D, - 0x9492: 0x6540, - 0x9493: 0x6541, - 0x9494: 0x6542, - 0x9495: 0x6543, - 0x9496: 0x6544, - 0x9497: 0x6546, - 0x9498: 0x6547, - 0x9499: 0x654A, - 0x949A: 0x654B, - 0x949B: 0x654D, - 0x949C: 0x654E, - 0x949D: 0x6550, - 0x949E: 0x6552, - 0x949F: 0x6553, - 0x94A0: 0x6554, - 0x94A1: 0x6557, - 0x94A2: 0x6558, - 0x94A3: 0x655A, - 0x94A4: 0x655C, - 0x94A5: 0x655F, - 0x94A6: 0x6560, - 0x94A7: 0x6561, - 0x94A8: 0x6564, - 0x94A9: 0x6565, - 0x94AA: 0x6567, - 0x94AB: 0x6568, - 0x94AC: 0x6569, - 0x94AD: 0x656A, - 0x94AE: 0x656D, - 0x94AF: 0x656E, - 0x94B0: 0x656F, - 0x94B1: 0x6571, - 0x94B2: 0x6573, - 0x94B3: 0x6575, - 0x94B4: 0x6576, - 0x94B5: 0x6578, - 0x94B6: 0x6579, - 0x94B7: 0x657A, - 0x94B8: 0x657B, - 0x94B9: 0x657C, - 0x94BA: 0x657D, - 0x94BB: 0x657E, - 0x94BC: 0x657F, - 0x94BD: 0x6580, - 0x94BE: 0x6581, - 0x94BF: 0x6582, - 0x94C0: 0x6583, - 0x94C1: 0x6584, - 0x94C2: 0x6585, - 0x94C3: 0x6586, - 0x94C4: 0x6588, - 0x94C5: 0x6589, - 0x94C6: 0x658A, - 0x94C7: 0x658D, - 0x94C8: 0x658E, - 0x94C9: 0x658F, - 0x94CA: 0x6592, - 0x94CB: 0x6594, - 0x94CC: 0x6595, - 0x94CD: 0x6596, - 0x94CE: 0x6598, - 0x94CF: 0x659A, - 0x94D0: 0x659D, - 0x94D1: 0x659E, - 0x94D2: 0x65A0, - 0x94D3: 0x65A2, - 0x94D4: 0x65A3, - 0x94D5: 0x65A6, - 0x94D6: 0x65A8, - 0x94D7: 0x65AA, - 0x94D8: 0x65AC, - 0x94D9: 0x65AE, - 0x94DA: 0x65B1, - 0x94DB: 0x65B2, - 0x94DC: 0x65B3, - 0x94DD: 0x65B4, - 0x94DE: 0x65B5, - 0x94DF: 0x65B6, - 0x94E0: 0x65B7, - 0x94E1: 0x65B8, - 0x94E2: 0x65BA, - 0x94E3: 0x65BB, - 0x94E4: 0x65BE, - 0x94E5: 0x65BF, - 0x94E6: 0x65C0, - 0x94E7: 0x65C2, - 0x94E8: 0x65C7, - 0x94E9: 0x65C8, - 0x94EA: 0x65C9, - 0x94EB: 0x65CA, - 0x94EC: 0x65CD, - 0x94ED: 0x65D0, - 0x94EE: 0x65D1, - 0x94EF: 0x65D3, - 0x94F0: 0x65D4, - 0x94F1: 0x65D5, - 0x94F2: 0x65D8, - 0x94F3: 0x65D9, - 0x94F4: 0x65DA, - 0x94F5: 0x65DB, - 0x94F6: 0x65DC, - 0x94F7: 0x65DD, - 0x94F8: 0x65DE, - 0x94F9: 0x65DF, - 0x94FA: 0x65E1, - 0x94FB: 0x65E3, - 0x94FC: 0x65E4, - 0x94FD: 0x65EA, - 0x94FE: 0x65EB, - 0x9540: 0x65F2, - 0x9541: 0x65F3, - 0x9542: 0x65F4, - 0x9543: 0x65F5, - 0x9544: 0x65F8, - 0x9545: 0x65F9, - 0x9546: 0x65FB, - 0x9547: 0x65FC, - 0x9548: 0x65FD, - 0x9549: 0x65FE, - 0x954A: 0x65FF, - 0x954B: 0x6601, - 0x954C: 0x6604, - 0x954D: 0x6605, - 0x954E: 0x6607, - 0x954F: 0x6608, - 0x9550: 0x6609, - 0x9551: 0x660B, - 0x9552: 0x660D, - 0x9553: 0x6610, - 0x9554: 0x6611, - 0x9555: 0x6612, - 0x9556: 0x6616, - 0x9557: 0x6617, - 0x9558: 0x6618, - 0x9559: 0x661A, - 0x955A: 0x661B, - 0x955B: 0x661C, - 0x955C: 0x661E, - 0x955D: 0x6621, - 0x955E: 0x6622, - 0x955F: 0x6623, - 0x9560: 0x6624, - 0x9561: 0x6626, - 0x9562: 0x6629, - 0x9563: 0x662A, - 0x9564: 0x662B, - 0x9565: 0x662C, - 0x9566: 0x662E, - 0x9567: 0x6630, - 0x9568: 0x6632, - 0x9569: 0x6633, - 0x956A: 0x6637, - 0x956B: 0x6638, - 0x956C: 0x6639, - 0x956D: 0x663A, - 0x956E: 0x663B, - 0x956F: 0x663D, - 0x9570: 0x663F, - 0x9571: 0x6640, - 0x9572: 0x6642, - 0x9573: 0x6644, - 0x9574: 0x6645, - 0x9575: 0x6646, - 0x9576: 0x6647, - 0x9577: 0x6648, - 0x9578: 0x6649, - 0x9579: 0x664A, - 0x957A: 0x664D, - 0x957B: 0x664E, - 0x957C: 0x6650, - 0x957D: 0x6651, - 0x957E: 0x6658, - 0x9580: 0x6659, - 0x9581: 0x665B, - 0x9582: 0x665C, - 0x9583: 0x665D, - 0x9584: 0x665E, - 0x9585: 0x6660, - 0x9586: 0x6662, - 0x9587: 0x6663, - 0x9588: 0x6665, - 0x9589: 0x6667, - 0x958A: 0x6669, - 0x958B: 0x666A, - 0x958C: 0x666B, - 0x958D: 0x666C, - 0x958E: 0x666D, - 0x958F: 0x6671, - 0x9590: 0x6672, - 0x9591: 0x6673, - 0x9592: 0x6675, - 0x9593: 0x6678, - 0x9594: 0x6679, - 0x9595: 0x667B, - 0x9596: 0x667C, - 0x9597: 0x667D, - 0x9598: 0x667F, - 0x9599: 0x6680, - 0x959A: 0x6681, - 0x959B: 0x6683, - 0x959C: 0x6685, - 0x959D: 0x6686, - 0x959E: 0x6688, - 0x959F: 0x6689, - 0x95A0: 0x668A, - 0x95A1: 0x668B, - 0x95A2: 0x668D, - 0x95A3: 0x668E, - 0x95A4: 0x668F, - 0x95A5: 0x6690, - 0x95A6: 0x6692, - 0x95A7: 0x6693, - 0x95A8: 0x6694, - 0x95A9: 0x6695, - 0x95AA: 0x6698, - 0x95AB: 0x6699, - 0x95AC: 0x669A, - 0x95AD: 0x669B, - 0x95AE: 0x669C, - 0x95AF: 0x669E, - 0x95B0: 0x669F, - 0x95B1: 0x66A0, - 0x95B2: 0x66A1, - 0x95B3: 0x66A2, - 0x95B4: 0x66A3, - 0x95B5: 0x66A4, - 0x95B6: 0x66A5, - 0x95B7: 0x66A6, - 0x95B8: 0x66A9, - 0x95B9: 0x66AA, - 0x95BA: 0x66AB, - 0x95BB: 0x66AC, - 0x95BC: 0x66AD, - 0x95BD: 0x66AF, - 0x95BE: 0x66B0, - 0x95BF: 0x66B1, - 0x95C0: 0x66B2, - 0x95C1: 0x66B3, - 0x95C2: 0x66B5, - 0x95C3: 0x66B6, - 0x95C4: 0x66B7, - 0x95C5: 0x66B8, - 0x95C6: 0x66BA, - 0x95C7: 0x66BB, - 0x95C8: 0x66BC, - 0x95C9: 0x66BD, - 0x95CA: 0x66BF, - 0x95CB: 0x66C0, - 0x95CC: 0x66C1, - 0x95CD: 0x66C2, - 0x95CE: 0x66C3, - 0x95CF: 0x66C4, - 0x95D0: 0x66C5, - 0x95D1: 0x66C6, - 0x95D2: 0x66C7, - 0x95D3: 0x66C8, - 0x95D4: 0x66C9, - 0x95D5: 0x66CA, - 0x95D6: 0x66CB, - 0x95D7: 0x66CC, - 0x95D8: 0x66CD, - 0x95D9: 0x66CE, - 0x95DA: 0x66CF, - 0x95DB: 0x66D0, - 0x95DC: 0x66D1, - 0x95DD: 0x66D2, - 0x95DE: 0x66D3, - 0x95DF: 0x66D4, - 0x95E0: 0x66D5, - 0x95E1: 0x66D6, - 0x95E2: 0x66D7, - 0x95E3: 0x66D8, - 0x95E4: 0x66DA, - 0x95E5: 0x66DE, - 0x95E6: 0x66DF, - 0x95E7: 0x66E0, - 0x95E8: 0x66E1, - 0x95E9: 0x66E2, - 0x95EA: 0x66E3, - 0x95EB: 0x66E4, - 0x95EC: 0x66E5, - 0x95ED: 0x66E7, - 0x95EE: 0x66E8, - 0x95EF: 0x66EA, - 0x95F0: 0x66EB, - 0x95F1: 0x66EC, - 0x95F2: 0x66ED, - 0x95F3: 0x66EE, - 0x95F4: 0x66EF, - 0x95F5: 0x66F1, - 0x95F6: 0x66F5, - 0x95F7: 0x66F6, - 0x95F8: 0x66F8, - 0x95F9: 0x66FA, - 0x95FA: 0x66FB, - 0x95FB: 0x66FD, - 0x95FC: 0x6701, - 0x95FD: 0x6702, - 0x95FE: 0x6703, - 0x9640: 0x6704, - 0x9641: 0x6705, - 0x9642: 0x6706, - 0x9643: 0x6707, - 0x9644: 0x670C, - 0x9645: 0x670E, - 0x9646: 0x670F, - 0x9647: 0x6711, - 0x9648: 0x6712, - 0x9649: 0x6713, - 0x964A: 0x6716, - 0x964B: 0x6718, - 0x964C: 0x6719, - 0x964D: 0x671A, - 0x964E: 0x671C, - 0x964F: 0x671E, - 0x9650: 0x6720, - 0x9651: 0x6721, - 0x9652: 0x6722, - 0x9653: 0x6723, - 0x9654: 0x6724, - 0x9655: 0x6725, - 0x9656: 0x6727, - 0x9657: 0x6729, - 0x9658: 0x672E, - 0x9659: 0x6730, - 0x965A: 0x6732, - 0x965B: 0x6733, - 0x965C: 0x6736, - 0x965D: 0x6737, - 0x965E: 0x6738, - 0x965F: 0x6739, - 0x9660: 0x673B, - 0x9661: 0x673C, - 0x9662: 0x673E, - 0x9663: 0x673F, - 0x9664: 0x6741, - 0x9665: 0x6744, - 0x9666: 0x6745, - 0x9667: 0x6747, - 0x9668: 0x674A, - 0x9669: 0x674B, - 0x966A: 0x674D, - 0x966B: 0x6752, - 0x966C: 0x6754, - 0x966D: 0x6755, - 0x966E: 0x6757, - 0x966F: 0x6758, - 0x9670: 0x6759, - 0x9671: 0x675A, - 0x9672: 0x675B, - 0x9673: 0x675D, - 0x9674: 0x6762, - 0x9675: 0x6763, - 0x9676: 0x6764, - 0x9677: 0x6766, - 0x9678: 0x6767, - 0x9679: 0x676B, - 0x967A: 0x676C, - 0x967B: 0x676E, - 0x967C: 0x6771, - 0x967D: 0x6774, - 0x967E: 0x6776, - 0x9680: 0x6778, - 0x9681: 0x6779, - 0x9682: 0x677A, - 0x9683: 0x677B, - 0x9684: 0x677D, - 0x9685: 0x6780, - 0x9686: 0x6782, - 0x9687: 0x6783, - 0x9688: 0x6785, - 0x9689: 0x6786, - 0x968A: 0x6788, - 0x968B: 0x678A, - 0x968C: 0x678C, - 0x968D: 0x678D, - 0x968E: 0x678E, - 0x968F: 0x678F, - 0x9690: 0x6791, - 0x9691: 0x6792, - 0x9692: 0x6793, - 0x9693: 0x6794, - 0x9694: 0x6796, - 0x9695: 0x6799, - 0x9696: 0x679B, - 0x9697: 0x679F, - 0x9698: 0x67A0, - 0x9699: 0x67A1, - 0x969A: 0x67A4, - 0x969B: 0x67A6, - 0x969C: 0x67A9, - 0x969D: 0x67AC, - 0x969E: 0x67AE, - 0x969F: 0x67B1, - 0x96A0: 0x67B2, - 0x96A1: 0x67B4, - 0x96A2: 0x67B9, - 0x96A3: 0x67BA, - 0x96A4: 0x67BB, - 0x96A5: 0x67BC, - 0x96A6: 0x67BD, - 0x96A7: 0x67BE, - 0x96A8: 0x67BF, - 0x96A9: 0x67C0, - 0x96AA: 0x67C2, - 0x96AB: 0x67C5, - 0x96AC: 0x67C6, - 0x96AD: 0x67C7, - 0x96AE: 0x67C8, - 0x96AF: 0x67C9, - 0x96B0: 0x67CA, - 0x96B1: 0x67CB, - 0x96B2: 0x67CC, - 0x96B3: 0x67CD, - 0x96B4: 0x67CE, - 0x96B5: 0x67D5, - 0x96B6: 0x67D6, - 0x96B7: 0x67D7, - 0x96B8: 0x67DB, - 0x96B9: 0x67DF, - 0x96BA: 0x67E1, - 0x96BB: 0x67E3, - 0x96BC: 0x67E4, - 0x96BD: 0x67E6, - 0x96BE: 0x67E7, - 0x96BF: 0x67E8, - 0x96C0: 0x67EA, - 0x96C1: 0x67EB, - 0x96C2: 0x67ED, - 0x96C3: 0x67EE, - 0x96C4: 0x67F2, - 0x96C5: 0x67F5, - 0x96C6: 0x67F6, - 0x96C7: 0x67F7, - 0x96C8: 0x67F8, - 0x96C9: 0x67F9, - 0x96CA: 0x67FA, - 0x96CB: 0x67FB, - 0x96CC: 0x67FC, - 0x96CD: 0x67FE, - 0x96CE: 0x6801, - 0x96CF: 0x6802, - 0x96D0: 0x6803, - 0x96D1: 0x6804, - 0x96D2: 0x6806, - 0x96D3: 0x680D, - 0x96D4: 0x6810, - 0x96D5: 0x6812, - 0x96D6: 0x6814, - 0x96D7: 0x6815, - 0x96D8: 0x6818, - 0x96D9: 0x6819, - 0x96DA: 0x681A, - 0x96DB: 0x681B, - 0x96DC: 0x681C, - 0x96DD: 0x681E, - 0x96DE: 0x681F, - 0x96DF: 0x6820, - 0x96E0: 0x6822, - 0x96E1: 0x6823, - 0x96E2: 0x6824, - 0x96E3: 0x6825, - 0x96E4: 0x6826, - 0x96E5: 0x6827, - 0x96E6: 0x6828, - 0x96E7: 0x682B, - 0x96E8: 0x682C, - 0x96E9: 0x682D, - 0x96EA: 0x682E, - 0x96EB: 0x682F, - 0x96EC: 0x6830, - 0x96ED: 0x6831, - 0x96EE: 0x6834, - 0x96EF: 0x6835, - 0x96F0: 0x6836, - 0x96F1: 0x683A, - 0x96F2: 0x683B, - 0x96F3: 0x683F, - 0x96F4: 0x6847, - 0x96F5: 0x684B, - 0x96F6: 0x684D, - 0x96F7: 0x684F, - 0x96F8: 0x6852, - 0x96F9: 0x6856, - 0x96FA: 0x6857, - 0x96FB: 0x6858, - 0x96FC: 0x6859, - 0x96FD: 0x685A, - 0x96FE: 0x685B, - 0x9740: 0x685C, - 0x9741: 0x685D, - 0x9742: 0x685E, - 0x9743: 0x685F, - 0x9744: 0x686A, - 0x9745: 0x686C, - 0x9746: 0x686D, - 0x9747: 0x686E, - 0x9748: 0x686F, - 0x9749: 0x6870, - 0x974A: 0x6871, - 0x974B: 0x6872, - 0x974C: 0x6873, - 0x974D: 0x6875, - 0x974E: 0x6878, - 0x974F: 0x6879, - 0x9750: 0x687A, - 0x9751: 0x687B, - 0x9752: 0x687C, - 0x9753: 0x687D, - 0x9754: 0x687E, - 0x9755: 0x687F, - 0x9756: 0x6880, - 0x9757: 0x6882, - 0x9758: 0x6884, - 0x9759: 0x6887, - 0x975A: 0x6888, - 0x975B: 0x6889, - 0x975C: 0x688A, - 0x975D: 0x688B, - 0x975E: 0x688C, - 0x975F: 0x688D, - 0x9760: 0x688E, - 0x9761: 0x6890, - 0x9762: 0x6891, - 0x9763: 0x6892, - 0x9764: 0x6894, - 0x9765: 0x6895, - 0x9766: 0x6896, - 0x9767: 0x6898, - 0x9768: 0x6899, - 0x9769: 0x689A, - 0x976A: 0x689B, - 0x976B: 0x689C, - 0x976C: 0x689D, - 0x976D: 0x689E, - 0x976E: 0x689F, - 0x976F: 0x68A0, - 0x9770: 0x68A1, - 0x9771: 0x68A3, - 0x9772: 0x68A4, - 0x9773: 0x68A5, - 0x9774: 0x68A9, - 0x9775: 0x68AA, - 0x9776: 0x68AB, - 0x9777: 0x68AC, - 0x9778: 0x68AE, - 0x9779: 0x68B1, - 0x977A: 0x68B2, - 0x977B: 0x68B4, - 0x977C: 0x68B6, - 0x977D: 0x68B7, - 0x977E: 0x68B8, - 0x9780: 0x68B9, - 0x9781: 0x68BA, - 0x9782: 0x68BB, - 0x9783: 0x68BC, - 0x9784: 0x68BD, - 0x9785: 0x68BE, - 0x9786: 0x68BF, - 0x9787: 0x68C1, - 0x9788: 0x68C3, - 0x9789: 0x68C4, - 0x978A: 0x68C5, - 0x978B: 0x68C6, - 0x978C: 0x68C7, - 0x978D: 0x68C8, - 0x978E: 0x68CA, - 0x978F: 0x68CC, - 0x9790: 0x68CE, - 0x9791: 0x68CF, - 0x9792: 0x68D0, - 0x9793: 0x68D1, - 0x9794: 0x68D3, - 0x9795: 0x68D4, - 0x9796: 0x68D6, - 0x9797: 0x68D7, - 0x9798: 0x68D9, - 0x9799: 0x68DB, - 0x979A: 0x68DC, - 0x979B: 0x68DD, - 0x979C: 0x68DE, - 0x979D: 0x68DF, - 0x979E: 0x68E1, - 0x979F: 0x68E2, - 0x97A0: 0x68E4, - 0x97A1: 0x68E5, - 0x97A2: 0x68E6, - 0x97A3: 0x68E7, - 0x97A4: 0x68E8, - 0x97A5: 0x68E9, - 0x97A6: 0x68EA, - 0x97A7: 0x68EB, - 0x97A8: 0x68EC, - 0x97A9: 0x68ED, - 0x97AA: 0x68EF, - 0x97AB: 0x68F2, - 0x97AC: 0x68F3, - 0x97AD: 0x68F4, - 0x97AE: 0x68F6, - 0x97AF: 0x68F7, - 0x97B0: 0x68F8, - 0x97B1: 0x68FB, - 0x97B2: 0x68FD, - 0x97B3: 0x68FE, - 0x97B4: 0x68FF, - 0x97B5: 0x6900, - 0x97B6: 0x6902, - 0x97B7: 0x6903, - 0x97B8: 0x6904, - 0x97B9: 0x6906, - 0x97BA: 0x6907, - 0x97BB: 0x6908, - 0x97BC: 0x6909, - 0x97BD: 0x690A, - 0x97BE: 0x690C, - 0x97BF: 0x690F, - 0x97C0: 0x6911, - 0x97C1: 0x6913, - 0x97C2: 0x6914, - 0x97C3: 0x6915, - 0x97C4: 0x6916, - 0x97C5: 0x6917, - 0x97C6: 0x6918, - 0x97C7: 0x6919, - 0x97C8: 0x691A, - 0x97C9: 0x691B, - 0x97CA: 0x691C, - 0x97CB: 0x691D, - 0x97CC: 0x691E, - 0x97CD: 0x6921, - 0x97CE: 0x6922, - 0x97CF: 0x6923, - 0x97D0: 0x6925, - 0x97D1: 0x6926, - 0x97D2: 0x6927, - 0x97D3: 0x6928, - 0x97D4: 0x6929, - 0x97D5: 0x692A, - 0x97D6: 0x692B, - 0x97D7: 0x692C, - 0x97D8: 0x692E, - 0x97D9: 0x692F, - 0x97DA: 0x6931, - 0x97DB: 0x6932, - 0x97DC: 0x6933, - 0x97DD: 0x6935, - 0x97DE: 0x6936, - 0x97DF: 0x6937, - 0x97E0: 0x6938, - 0x97E1: 0x693A, - 0x97E2: 0x693B, - 0x97E3: 0x693C, - 0x97E4: 0x693E, - 0x97E5: 0x6940, - 0x97E6: 0x6941, - 0x97E7: 0x6943, - 0x97E8: 0x6944, - 0x97E9: 0x6945, - 0x97EA: 0x6946, - 0x97EB: 0x6947, - 0x97EC: 0x6948, - 0x97ED: 0x6949, - 0x97EE: 0x694A, - 0x97EF: 0x694B, - 0x97F0: 0x694C, - 0x97F1: 0x694D, - 0x97F2: 0x694E, - 0x97F3: 0x694F, - 0x97F4: 0x6950, - 0x97F5: 0x6951, - 0x97F6: 0x6952, - 0x97F7: 0x6953, - 0x97F8: 0x6955, - 0x97F9: 0x6956, - 0x97FA: 0x6958, - 0x97FB: 0x6959, - 0x97FC: 0x695B, - 0x97FD: 0x695C, - 0x97FE: 0x695F, - 0x9840: 0x6961, - 0x9841: 0x6962, - 0x9842: 0x6964, - 0x9843: 0x6965, - 0x9844: 0x6967, - 0x9845: 0x6968, - 0x9846: 0x6969, - 0x9847: 0x696A, - 0x9848: 0x696C, - 0x9849: 0x696D, - 0x984A: 0x696F, - 0x984B: 0x6970, - 0x984C: 0x6972, - 0x984D: 0x6973, - 0x984E: 0x6974, - 0x984F: 0x6975, - 0x9850: 0x6976, - 0x9851: 0x697A, - 0x9852: 0x697B, - 0x9853: 0x697D, - 0x9854: 0x697E, - 0x9855: 0x697F, - 0x9856: 0x6981, - 0x9857: 0x6983, - 0x9858: 0x6985, - 0x9859: 0x698A, - 0x985A: 0x698B, - 0x985B: 0x698C, - 0x985C: 0x698E, - 0x985D: 0x698F, - 0x985E: 0x6990, - 0x985F: 0x6991, - 0x9860: 0x6992, - 0x9861: 0x6993, - 0x9862: 0x6996, - 0x9863: 0x6997, - 0x9864: 0x6999, - 0x9865: 0x699A, - 0x9866: 0x699D, - 0x9867: 0x699E, - 0x9868: 0x699F, - 0x9869: 0x69A0, - 0x986A: 0x69A1, - 0x986B: 0x69A2, - 0x986C: 0x69A3, - 0x986D: 0x69A4, - 0x986E: 0x69A5, - 0x986F: 0x69A6, - 0x9870: 0x69A9, - 0x9871: 0x69AA, - 0x9872: 0x69AC, - 0x9873: 0x69AE, - 0x9874: 0x69AF, - 0x9875: 0x69B0, - 0x9876: 0x69B2, - 0x9877: 0x69B3, - 0x9878: 0x69B5, - 0x9879: 0x69B6, - 0x987A: 0x69B8, - 0x987B: 0x69B9, - 0x987C: 0x69BA, - 0x987D: 0x69BC, - 0x987E: 0x69BD, - 0x9880: 0x69BE, - 0x9881: 0x69BF, - 0x9882: 0x69C0, - 0x9883: 0x69C2, - 0x9884: 0x69C3, - 0x9885: 0x69C4, - 0x9886: 0x69C5, - 0x9887: 0x69C6, - 0x9888: 0x69C7, - 0x9889: 0x69C8, - 0x988A: 0x69C9, - 0x988B: 0x69CB, - 0x988C: 0x69CD, - 0x988D: 0x69CF, - 0x988E: 0x69D1, - 0x988F: 0x69D2, - 0x9890: 0x69D3, - 0x9891: 0x69D5, - 0x9892: 0x69D6, - 0x9893: 0x69D7, - 0x9894: 0x69D8, - 0x9895: 0x69D9, - 0x9896: 0x69DA, - 0x9897: 0x69DC, - 0x9898: 0x69DD, - 0x9899: 0x69DE, - 0x989A: 0x69E1, - 0x989B: 0x69E2, - 0x989C: 0x69E3, - 0x989D: 0x69E4, - 0x989E: 0x69E5, - 0x989F: 0x69E6, - 0x98A0: 0x69E7, - 0x98A1: 0x69E8, - 0x98A2: 0x69E9, - 0x98A3: 0x69EA, - 0x98A4: 0x69EB, - 0x98A5: 0x69EC, - 0x98A6: 0x69EE, - 0x98A7: 0x69EF, - 0x98A8: 0x69F0, - 0x98A9: 0x69F1, - 0x98AA: 0x69F3, - 0x98AB: 0x69F4, - 0x98AC: 0x69F5, - 0x98AD: 0x69F6, - 0x98AE: 0x69F7, - 0x98AF: 0x69F8, - 0x98B0: 0x69F9, - 0x98B1: 0x69FA, - 0x98B2: 0x69FB, - 0x98B3: 0x69FC, - 0x98B4: 0x69FE, - 0x98B5: 0x6A00, - 0x98B6: 0x6A01, - 0x98B7: 0x6A02, - 0x98B8: 0x6A03, - 0x98B9: 0x6A04, - 0x98BA: 0x6A05, - 0x98BB: 0x6A06, - 0x98BC: 0x6A07, - 0x98BD: 0x6A08, - 0x98BE: 0x6A09, - 0x98BF: 0x6A0B, - 0x98C0: 0x6A0C, - 0x98C1: 0x6A0D, - 0x98C2: 0x6A0E, - 0x98C3: 0x6A0F, - 0x98C4: 0x6A10, - 0x98C5: 0x6A11, - 0x98C6: 0x6A12, - 0x98C7: 0x6A13, - 0x98C8: 0x6A14, - 0x98C9: 0x6A15, - 0x98CA: 0x6A16, - 0x98CB: 0x6A19, - 0x98CC: 0x6A1A, - 0x98CD: 0x6A1B, - 0x98CE: 0x6A1C, - 0x98CF: 0x6A1D, - 0x98D0: 0x6A1E, - 0x98D1: 0x6A20, - 0x98D2: 0x6A22, - 0x98D3: 0x6A23, - 0x98D4: 0x6A24, - 0x98D5: 0x6A25, - 0x98D6: 0x6A26, - 0x98D7: 0x6A27, - 0x98D8: 0x6A29, - 0x98D9: 0x6A2B, - 0x98DA: 0x6A2C, - 0x98DB: 0x6A2D, - 0x98DC: 0x6A2E, - 0x98DD: 0x6A30, - 0x98DE: 0x6A32, - 0x98DF: 0x6A33, - 0x98E0: 0x6A34, - 0x98E1: 0x6A36, - 0x98E2: 0x6A37, - 0x98E3: 0x6A38, - 0x98E4: 0x6A39, - 0x98E5: 0x6A3A, - 0x98E6: 0x6A3B, - 0x98E7: 0x6A3C, - 0x98E8: 0x6A3F, - 0x98E9: 0x6A40, - 0x98EA: 0x6A41, - 0x98EB: 0x6A42, - 0x98EC: 0x6A43, - 0x98ED: 0x6A45, - 0x98EE: 0x6A46, - 0x98EF: 0x6A48, - 0x98F0: 0x6A49, - 0x98F1: 0x6A4A, - 0x98F2: 0x6A4B, - 0x98F3: 0x6A4C, - 0x98F4: 0x6A4D, - 0x98F5: 0x6A4E, - 0x98F6: 0x6A4F, - 0x98F7: 0x6A51, - 0x98F8: 0x6A52, - 0x98F9: 0x6A53, - 0x98FA: 0x6A54, - 0x98FB: 0x6A55, - 0x98FC: 0x6A56, - 0x98FD: 0x6A57, - 0x98FE: 0x6A5A, - 0x9940: 0x6A5C, - 0x9941: 0x6A5D, - 0x9942: 0x6A5E, - 0x9943: 0x6A5F, - 0x9944: 0x6A60, - 0x9945: 0x6A62, - 0x9946: 0x6A63, - 0x9947: 0x6A64, - 0x9948: 0x6A66, - 0x9949: 0x6A67, - 0x994A: 0x6A68, - 0x994B: 0x6A69, - 0x994C: 0x6A6A, - 0x994D: 0x6A6B, - 0x994E: 0x6A6C, - 0x994F: 0x6A6D, - 0x9950: 0x6A6E, - 0x9951: 0x6A6F, - 0x9952: 0x6A70, - 0x9953: 0x6A72, - 0x9954: 0x6A73, - 0x9955: 0x6A74, - 0x9956: 0x6A75, - 0x9957: 0x6A76, - 0x9958: 0x6A77, - 0x9959: 0x6A78, - 0x995A: 0x6A7A, - 0x995B: 0x6A7B, - 0x995C: 0x6A7D, - 0x995D: 0x6A7E, - 0x995E: 0x6A7F, - 0x995F: 0x6A81, - 0x9960: 0x6A82, - 0x9961: 0x6A83, - 0x9962: 0x6A85, - 0x9963: 0x6A86, - 0x9964: 0x6A87, - 0x9965: 0x6A88, - 0x9966: 0x6A89, - 0x9967: 0x6A8A, - 0x9968: 0x6A8B, - 0x9969: 0x6A8C, - 0x996A: 0x6A8D, - 0x996B: 0x6A8F, - 0x996C: 0x6A92, - 0x996D: 0x6A93, - 0x996E: 0x6A94, - 0x996F: 0x6A95, - 0x9970: 0x6A96, - 0x9971: 0x6A98, - 0x9972: 0x6A99, - 0x9973: 0x6A9A, - 0x9974: 0x6A9B, - 0x9975: 0x6A9C, - 0x9976: 0x6A9D, - 0x9977: 0x6A9E, - 0x9978: 0x6A9F, - 0x9979: 0x6AA1, - 0x997A: 0x6AA2, - 0x997B: 0x6AA3, - 0x997C: 0x6AA4, - 0x997D: 0x6AA5, - 0x997E: 0x6AA6, - 0x9980: 0x6AA7, - 0x9981: 0x6AA8, - 0x9982: 0x6AAA, - 0x9983: 0x6AAD, - 0x9984: 0x6AAE, - 0x9985: 0x6AAF, - 0x9986: 0x6AB0, - 0x9987: 0x6AB1, - 0x9988: 0x6AB2, - 0x9989: 0x6AB3, - 0x998A: 0x6AB4, - 0x998B: 0x6AB5, - 0x998C: 0x6AB6, - 0x998D: 0x6AB7, - 0x998E: 0x6AB8, - 0x998F: 0x6AB9, - 0x9990: 0x6ABA, - 0x9991: 0x6ABB, - 0x9992: 0x6ABC, - 0x9993: 0x6ABD, - 0x9994: 0x6ABE, - 0x9995: 0x6ABF, - 0x9996: 0x6AC0, - 0x9997: 0x6AC1, - 0x9998: 0x6AC2, - 0x9999: 0x6AC3, - 0x999A: 0x6AC4, - 0x999B: 0x6AC5, - 0x999C: 0x6AC6, - 0x999D: 0x6AC7, - 0x999E: 0x6AC8, - 0x999F: 0x6AC9, - 0x99A0: 0x6ACA, - 0x99A1: 0x6ACB, - 0x99A2: 0x6ACC, - 0x99A3: 0x6ACD, - 0x99A4: 0x6ACE, - 0x99A5: 0x6ACF, - 0x99A6: 0x6AD0, - 0x99A7: 0x6AD1, - 0x99A8: 0x6AD2, - 0x99A9: 0x6AD3, - 0x99AA: 0x6AD4, - 0x99AB: 0x6AD5, - 0x99AC: 0x6AD6, - 0x99AD: 0x6AD7, - 0x99AE: 0x6AD8, - 0x99AF: 0x6AD9, - 0x99B0: 0x6ADA, - 0x99B1: 0x6ADB, - 0x99B2: 0x6ADC, - 0x99B3: 0x6ADD, - 0x99B4: 0x6ADE, - 0x99B5: 0x6ADF, - 0x99B6: 0x6AE0, - 0x99B7: 0x6AE1, - 0x99B8: 0x6AE2, - 0x99B9: 0x6AE3, - 0x99BA: 0x6AE4, - 0x99BB: 0x6AE5, - 0x99BC: 0x6AE6, - 0x99BD: 0x6AE7, - 0x99BE: 0x6AE8, - 0x99BF: 0x6AE9, - 0x99C0: 0x6AEA, - 0x99C1: 0x6AEB, - 0x99C2: 0x6AEC, - 0x99C3: 0x6AED, - 0x99C4: 0x6AEE, - 0x99C5: 0x6AEF, - 0x99C6: 0x6AF0, - 0x99C7: 0x6AF1, - 0x99C8: 0x6AF2, - 0x99C9: 0x6AF3, - 0x99CA: 0x6AF4, - 0x99CB: 0x6AF5, - 0x99CC: 0x6AF6, - 0x99CD: 0x6AF7, - 0x99CE: 0x6AF8, - 0x99CF: 0x6AF9, - 0x99D0: 0x6AFA, - 0x99D1: 0x6AFB, - 0x99D2: 0x6AFC, - 0x99D3: 0x6AFD, - 0x99D4: 0x6AFE, - 0x99D5: 0x6AFF, - 0x99D6: 0x6B00, - 0x99D7: 0x6B01, - 0x99D8: 0x6B02, - 0x99D9: 0x6B03, - 0x99DA: 0x6B04, - 0x99DB: 0x6B05, - 0x99DC: 0x6B06, - 0x99DD: 0x6B07, - 0x99DE: 0x6B08, - 0x99DF: 0x6B09, - 0x99E0: 0x6B0A, - 0x99E1: 0x6B0B, - 0x99E2: 0x6B0C, - 0x99E3: 0x6B0D, - 0x99E4: 0x6B0E, - 0x99E5: 0x6B0F, - 0x99E6: 0x6B10, - 0x99E7: 0x6B11, - 0x99E8: 0x6B12, - 0x99E9: 0x6B13, - 0x99EA: 0x6B14, - 0x99EB: 0x6B15, - 0x99EC: 0x6B16, - 0x99ED: 0x6B17, - 0x99EE: 0x6B18, - 0x99EF: 0x6B19, - 0x99F0: 0x6B1A, - 0x99F1: 0x6B1B, - 0x99F2: 0x6B1C, - 0x99F3: 0x6B1D, - 0x99F4: 0x6B1E, - 0x99F5: 0x6B1F, - 0x99F6: 0x6B25, - 0x99F7: 0x6B26, - 0x99F8: 0x6B28, - 0x99F9: 0x6B29, - 0x99FA: 0x6B2A, - 0x99FB: 0x6B2B, - 0x99FC: 0x6B2C, - 0x99FD: 0x6B2D, - 0x99FE: 0x6B2E, - 0x9A40: 0x6B2F, - 0x9A41: 0x6B30, - 0x9A42: 0x6B31, - 0x9A43: 0x6B33, - 0x9A44: 0x6B34, - 0x9A45: 0x6B35, - 0x9A46: 0x6B36, - 0x9A47: 0x6B38, - 0x9A48: 0x6B3B, - 0x9A49: 0x6B3C, - 0x9A4A: 0x6B3D, - 0x9A4B: 0x6B3F, - 0x9A4C: 0x6B40, - 0x9A4D: 0x6B41, - 0x9A4E: 0x6B42, - 0x9A4F: 0x6B44, - 0x9A50: 0x6B45, - 0x9A51: 0x6B48, - 0x9A52: 0x6B4A, - 0x9A53: 0x6B4B, - 0x9A54: 0x6B4D, - 0x9A55: 0x6B4E, - 0x9A56: 0x6B4F, - 0x9A57: 0x6B50, - 0x9A58: 0x6B51, - 0x9A59: 0x6B52, - 0x9A5A: 0x6B53, - 0x9A5B: 0x6B54, - 0x9A5C: 0x6B55, - 0x9A5D: 0x6B56, - 0x9A5E: 0x6B57, - 0x9A5F: 0x6B58, - 0x9A60: 0x6B5A, - 0x9A61: 0x6B5B, - 0x9A62: 0x6B5C, - 0x9A63: 0x6B5D, - 0x9A64: 0x6B5E, - 0x9A65: 0x6B5F, - 0x9A66: 0x6B60, - 0x9A67: 0x6B61, - 0x9A68: 0x6B68, - 0x9A69: 0x6B69, - 0x9A6A: 0x6B6B, - 0x9A6B: 0x6B6C, - 0x9A6C: 0x6B6D, - 0x9A6D: 0x6B6E, - 0x9A6E: 0x6B6F, - 0x9A6F: 0x6B70, - 0x9A70: 0x6B71, - 0x9A71: 0x6B72, - 0x9A72: 0x6B73, - 0x9A73: 0x6B74, - 0x9A74: 0x6B75, - 0x9A75: 0x6B76, - 0x9A76: 0x6B77, - 0x9A77: 0x6B78, - 0x9A78: 0x6B7A, - 0x9A79: 0x6B7D, - 0x9A7A: 0x6B7E, - 0x9A7B: 0x6B7F, - 0x9A7C: 0x6B80, - 0x9A7D: 0x6B85, - 0x9A7E: 0x6B88, - 0x9A80: 0x6B8C, - 0x9A81: 0x6B8E, - 0x9A82: 0x6B8F, - 0x9A83: 0x6B90, - 0x9A84: 0x6B91, - 0x9A85: 0x6B94, - 0x9A86: 0x6B95, - 0x9A87: 0x6B97, - 0x9A88: 0x6B98, - 0x9A89: 0x6B99, - 0x9A8A: 0x6B9C, - 0x9A8B: 0x6B9D, - 0x9A8C: 0x6B9E, - 0x9A8D: 0x6B9F, - 0x9A8E: 0x6BA0, - 0x9A8F: 0x6BA2, - 0x9A90: 0x6BA3, - 0x9A91: 0x6BA4, - 0x9A92: 0x6BA5, - 0x9A93: 0x6BA6, - 0x9A94: 0x6BA7, - 0x9A95: 0x6BA8, - 0x9A96: 0x6BA9, - 0x9A97: 0x6BAB, - 0x9A98: 0x6BAC, - 0x9A99: 0x6BAD, - 0x9A9A: 0x6BAE, - 0x9A9B: 0x6BAF, - 0x9A9C: 0x6BB0, - 0x9A9D: 0x6BB1, - 0x9A9E: 0x6BB2, - 0x9A9F: 0x6BB6, - 0x9AA0: 0x6BB8, - 0x9AA1: 0x6BB9, - 0x9AA2: 0x6BBA, - 0x9AA3: 0x6BBB, - 0x9AA4: 0x6BBC, - 0x9AA5: 0x6BBD, - 0x9AA6: 0x6BBE, - 0x9AA7: 0x6BC0, - 0x9AA8: 0x6BC3, - 0x9AA9: 0x6BC4, - 0x9AAA: 0x6BC6, - 0x9AAB: 0x6BC7, - 0x9AAC: 0x6BC8, - 0x9AAD: 0x6BC9, - 0x9AAE: 0x6BCA, - 0x9AAF: 0x6BCC, - 0x9AB0: 0x6BCE, - 0x9AB1: 0x6BD0, - 0x9AB2: 0x6BD1, - 0x9AB3: 0x6BD8, - 0x9AB4: 0x6BDA, - 0x9AB5: 0x6BDC, - 0x9AB6: 0x6BDD, - 0x9AB7: 0x6BDE, - 0x9AB8: 0x6BDF, - 0x9AB9: 0x6BE0, - 0x9ABA: 0x6BE2, - 0x9ABB: 0x6BE3, - 0x9ABC: 0x6BE4, - 0x9ABD: 0x6BE5, - 0x9ABE: 0x6BE6, - 0x9ABF: 0x6BE7, - 0x9AC0: 0x6BE8, - 0x9AC1: 0x6BE9, - 0x9AC2: 0x6BEC, - 0x9AC3: 0x6BED, - 0x9AC4: 0x6BEE, - 0x9AC5: 0x6BF0, - 0x9AC6: 0x6BF1, - 0x9AC7: 0x6BF2, - 0x9AC8: 0x6BF4, - 0x9AC9: 0x6BF6, - 0x9ACA: 0x6BF7, - 0x9ACB: 0x6BF8, - 0x9ACC: 0x6BFA, - 0x9ACD: 0x6BFB, - 0x9ACE: 0x6BFC, - 0x9ACF: 0x6BFE, - 0x9AD0: 0x6BFF, - 0x9AD1: 0x6C00, - 0x9AD2: 0x6C01, - 0x9AD3: 0x6C02, - 0x9AD4: 0x6C03, - 0x9AD5: 0x6C04, - 0x9AD6: 0x6C08, - 0x9AD7: 0x6C09, - 0x9AD8: 0x6C0A, - 0x9AD9: 0x6C0B, - 0x9ADA: 0x6C0C, - 0x9ADB: 0x6C0E, - 0x9ADC: 0x6C12, - 0x9ADD: 0x6C17, - 0x9ADE: 0x6C1C, - 0x9ADF: 0x6C1D, - 0x9AE0: 0x6C1E, - 0x9AE1: 0x6C20, - 0x9AE2: 0x6C23, - 0x9AE3: 0x6C25, - 0x9AE4: 0x6C2B, - 0x9AE5: 0x6C2C, - 0x9AE6: 0x6C2D, - 0x9AE7: 0x6C31, - 0x9AE8: 0x6C33, - 0x9AE9: 0x6C36, - 0x9AEA: 0x6C37, - 0x9AEB: 0x6C39, - 0x9AEC: 0x6C3A, - 0x9AED: 0x6C3B, - 0x9AEE: 0x6C3C, - 0x9AEF: 0x6C3E, - 0x9AF0: 0x6C3F, - 0x9AF1: 0x6C43, - 0x9AF2: 0x6C44, - 0x9AF3: 0x6C45, - 0x9AF4: 0x6C48, - 0x9AF5: 0x6C4B, - 0x9AF6: 0x6C4C, - 0x9AF7: 0x6C4D, - 0x9AF8: 0x6C4E, - 0x9AF9: 0x6C4F, - 0x9AFA: 0x6C51, - 0x9AFB: 0x6C52, - 0x9AFC: 0x6C53, - 0x9AFD: 0x6C56, - 0x9AFE: 0x6C58, - 0x9B40: 0x6C59, - 0x9B41: 0x6C5A, - 0x9B42: 0x6C62, - 0x9B43: 0x6C63, - 0x9B44: 0x6C65, - 0x9B45: 0x6C66, - 0x9B46: 0x6C67, - 0x9B47: 0x6C6B, - 0x9B48: 0x6C6C, - 0x9B49: 0x6C6D, - 0x9B4A: 0x6C6E, - 0x9B4B: 0x6C6F, - 0x9B4C: 0x6C71, - 0x9B4D: 0x6C73, - 0x9B4E: 0x6C75, - 0x9B4F: 0x6C77, - 0x9B50: 0x6C78, - 0x9B51: 0x6C7A, - 0x9B52: 0x6C7B, - 0x9B53: 0x6C7C, - 0x9B54: 0x6C7F, - 0x9B55: 0x6C80, - 0x9B56: 0x6C84, - 0x9B57: 0x6C87, - 0x9B58: 0x6C8A, - 0x9B59: 0x6C8B, - 0x9B5A: 0x6C8D, - 0x9B5B: 0x6C8E, - 0x9B5C: 0x6C91, - 0x9B5D: 0x6C92, - 0x9B5E: 0x6C95, - 0x9B5F: 0x6C96, - 0x9B60: 0x6C97, - 0x9B61: 0x6C98, - 0x9B62: 0x6C9A, - 0x9B63: 0x6C9C, - 0x9B64: 0x6C9D, - 0x9B65: 0x6C9E, - 0x9B66: 0x6CA0, - 0x9B67: 0x6CA2, - 0x9B68: 0x6CA8, - 0x9B69: 0x6CAC, - 0x9B6A: 0x6CAF, - 0x9B6B: 0x6CB0, - 0x9B6C: 0x6CB4, - 0x9B6D: 0x6CB5, - 0x9B6E: 0x6CB6, - 0x9B6F: 0x6CB7, - 0x9B70: 0x6CBA, - 0x9B71: 0x6CC0, - 0x9B72: 0x6CC1, - 0x9B73: 0x6CC2, - 0x9B74: 0x6CC3, - 0x9B75: 0x6CC6, - 0x9B76: 0x6CC7, - 0x9B77: 0x6CC8, - 0x9B78: 0x6CCB, - 0x9B79: 0x6CCD, - 0x9B7A: 0x6CCE, - 0x9B7B: 0x6CCF, - 0x9B7C: 0x6CD1, - 0x9B7D: 0x6CD2, - 0x9B7E: 0x6CD8, - 0x9B80: 0x6CD9, - 0x9B81: 0x6CDA, - 0x9B82: 0x6CDC, - 0x9B83: 0x6CDD, - 0x9B84: 0x6CDF, - 0x9B85: 0x6CE4, - 0x9B86: 0x6CE6, - 0x9B87: 0x6CE7, - 0x9B88: 0x6CE9, - 0x9B89: 0x6CEC, - 0x9B8A: 0x6CED, - 0x9B8B: 0x6CF2, - 0x9B8C: 0x6CF4, - 0x9B8D: 0x6CF9, - 0x9B8E: 0x6CFF, - 0x9B8F: 0x6D00, - 0x9B90: 0x6D02, - 0x9B91: 0x6D03, - 0x9B92: 0x6D05, - 0x9B93: 0x6D06, - 0x9B94: 0x6D08, - 0x9B95: 0x6D09, - 0x9B96: 0x6D0A, - 0x9B97: 0x6D0D, - 0x9B98: 0x6D0F, - 0x9B99: 0x6D10, - 0x9B9A: 0x6D11, - 0x9B9B: 0x6D13, - 0x9B9C: 0x6D14, - 0x9B9D: 0x6D15, - 0x9B9E: 0x6D16, - 0x9B9F: 0x6D18, - 0x9BA0: 0x6D1C, - 0x9BA1: 0x6D1D, - 0x9BA2: 0x6D1F, - 0x9BA3: 0x6D20, - 0x9BA4: 0x6D21, - 0x9BA5: 0x6D22, - 0x9BA6: 0x6D23, - 0x9BA7: 0x6D24, - 0x9BA8: 0x6D26, - 0x9BA9: 0x6D28, - 0x9BAA: 0x6D29, - 0x9BAB: 0x6D2C, - 0x9BAC: 0x6D2D, - 0x9BAD: 0x6D2F, - 0x9BAE: 0x6D30, - 0x9BAF: 0x6D34, - 0x9BB0: 0x6D36, - 0x9BB1: 0x6D37, - 0x9BB2: 0x6D38, - 0x9BB3: 0x6D3A, - 0x9BB4: 0x6D3F, - 0x9BB5: 0x6D40, - 0x9BB6: 0x6D42, - 0x9BB7: 0x6D44, - 0x9BB8: 0x6D49, - 0x9BB9: 0x6D4C, - 0x9BBA: 0x6D50, - 0x9BBB: 0x6D55, - 0x9BBC: 0x6D56, - 0x9BBD: 0x6D57, - 0x9BBE: 0x6D58, - 0x9BBF: 0x6D5B, - 0x9BC0: 0x6D5D, - 0x9BC1: 0x6D5F, - 0x9BC2: 0x6D61, - 0x9BC3: 0x6D62, - 0x9BC4: 0x6D64, - 0x9BC5: 0x6D65, - 0x9BC6: 0x6D67, - 0x9BC7: 0x6D68, - 0x9BC8: 0x6D6B, - 0x9BC9: 0x6D6C, - 0x9BCA: 0x6D6D, - 0x9BCB: 0x6D70, - 0x9BCC: 0x6D71, - 0x9BCD: 0x6D72, - 0x9BCE: 0x6D73, - 0x9BCF: 0x6D75, - 0x9BD0: 0x6D76, - 0x9BD1: 0x6D79, - 0x9BD2: 0x6D7A, - 0x9BD3: 0x6D7B, - 0x9BD4: 0x6D7D, - 0x9BD5: 0x6D7E, - 0x9BD6: 0x6D7F, - 0x9BD7: 0x6D80, - 0x9BD8: 0x6D81, - 0x9BD9: 0x6D83, - 0x9BDA: 0x6D84, - 0x9BDB: 0x6D86, - 0x9BDC: 0x6D87, - 0x9BDD: 0x6D8A, - 0x9BDE: 0x6D8B, - 0x9BDF: 0x6D8D, - 0x9BE0: 0x6D8F, - 0x9BE1: 0x6D90, - 0x9BE2: 0x6D92, - 0x9BE3: 0x6D96, - 0x9BE4: 0x6D97, - 0x9BE5: 0x6D98, - 0x9BE6: 0x6D99, - 0x9BE7: 0x6D9A, - 0x9BE8: 0x6D9C, - 0x9BE9: 0x6DA2, - 0x9BEA: 0x6DA5, - 0x9BEB: 0x6DAC, - 0x9BEC: 0x6DAD, - 0x9BED: 0x6DB0, - 0x9BEE: 0x6DB1, - 0x9BEF: 0x6DB3, - 0x9BF0: 0x6DB4, - 0x9BF1: 0x6DB6, - 0x9BF2: 0x6DB7, - 0x9BF3: 0x6DB9, - 0x9BF4: 0x6DBA, - 0x9BF5: 0x6DBB, - 0x9BF6: 0x6DBC, - 0x9BF7: 0x6DBD, - 0x9BF8: 0x6DBE, - 0x9BF9: 0x6DC1, - 0x9BFA: 0x6DC2, - 0x9BFB: 0x6DC3, - 0x9BFC: 0x6DC8, - 0x9BFD: 0x6DC9, - 0x9BFE: 0x6DCA, - 0x9C40: 0x6DCD, - 0x9C41: 0x6DCE, - 0x9C42: 0x6DCF, - 0x9C43: 0x6DD0, - 0x9C44: 0x6DD2, - 0x9C45: 0x6DD3, - 0x9C46: 0x6DD4, - 0x9C47: 0x6DD5, - 0x9C48: 0x6DD7, - 0x9C49: 0x6DDA, - 0x9C4A: 0x6DDB, - 0x9C4B: 0x6DDC, - 0x9C4C: 0x6DDF, - 0x9C4D: 0x6DE2, - 0x9C4E: 0x6DE3, - 0x9C4F: 0x6DE5, - 0x9C50: 0x6DE7, - 0x9C51: 0x6DE8, - 0x9C52: 0x6DE9, - 0x9C53: 0x6DEA, - 0x9C54: 0x6DED, - 0x9C55: 0x6DEF, - 0x9C56: 0x6DF0, - 0x9C57: 0x6DF2, - 0x9C58: 0x6DF4, - 0x9C59: 0x6DF5, - 0x9C5A: 0x6DF6, - 0x9C5B: 0x6DF8, - 0x9C5C: 0x6DFA, - 0x9C5D: 0x6DFD, - 0x9C5E: 0x6DFE, - 0x9C5F: 0x6DFF, - 0x9C60: 0x6E00, - 0x9C61: 0x6E01, - 0x9C62: 0x6E02, - 0x9C63: 0x6E03, - 0x9C64: 0x6E04, - 0x9C65: 0x6E06, - 0x9C66: 0x6E07, - 0x9C67: 0x6E08, - 0x9C68: 0x6E09, - 0x9C69: 0x6E0B, - 0x9C6A: 0x6E0F, - 0x9C6B: 0x6E12, - 0x9C6C: 0x6E13, - 0x9C6D: 0x6E15, - 0x9C6E: 0x6E18, - 0x9C6F: 0x6E19, - 0x9C70: 0x6E1B, - 0x9C71: 0x6E1C, - 0x9C72: 0x6E1E, - 0x9C73: 0x6E1F, - 0x9C74: 0x6E22, - 0x9C75: 0x6E26, - 0x9C76: 0x6E27, - 0x9C77: 0x6E28, - 0x9C78: 0x6E2A, - 0x9C79: 0x6E2C, - 0x9C7A: 0x6E2E, - 0x9C7B: 0x6E30, - 0x9C7C: 0x6E31, - 0x9C7D: 0x6E33, - 0x9C7E: 0x6E35, - 0x9C80: 0x6E36, - 0x9C81: 0x6E37, - 0x9C82: 0x6E39, - 0x9C83: 0x6E3B, - 0x9C84: 0x6E3C, - 0x9C85: 0x6E3D, - 0x9C86: 0x6E3E, - 0x9C87: 0x6E3F, - 0x9C88: 0x6E40, - 0x9C89: 0x6E41, - 0x9C8A: 0x6E42, - 0x9C8B: 0x6E45, - 0x9C8C: 0x6E46, - 0x9C8D: 0x6E47, - 0x9C8E: 0x6E48, - 0x9C8F: 0x6E49, - 0x9C90: 0x6E4A, - 0x9C91: 0x6E4B, - 0x9C92: 0x6E4C, - 0x9C93: 0x6E4F, - 0x9C94: 0x6E50, - 0x9C95: 0x6E51, - 0x9C96: 0x6E52, - 0x9C97: 0x6E55, - 0x9C98: 0x6E57, - 0x9C99: 0x6E59, - 0x9C9A: 0x6E5A, - 0x9C9B: 0x6E5C, - 0x9C9C: 0x6E5D, - 0x9C9D: 0x6E5E, - 0x9C9E: 0x6E60, - 0x9C9F: 0x6E61, - 0x9CA0: 0x6E62, - 0x9CA1: 0x6E63, - 0x9CA2: 0x6E64, - 0x9CA3: 0x6E65, - 0x9CA4: 0x6E66, - 0x9CA5: 0x6E67, - 0x9CA6: 0x6E68, - 0x9CA7: 0x6E69, - 0x9CA8: 0x6E6A, - 0x9CA9: 0x6E6C, - 0x9CAA: 0x6E6D, - 0x9CAB: 0x6E6F, - 0x9CAC: 0x6E70, - 0x9CAD: 0x6E71, - 0x9CAE: 0x6E72, - 0x9CAF: 0x6E73, - 0x9CB0: 0x6E74, - 0x9CB1: 0x6E75, - 0x9CB2: 0x6E76, - 0x9CB3: 0x6E77, - 0x9CB4: 0x6E78, - 0x9CB5: 0x6E79, - 0x9CB6: 0x6E7A, - 0x9CB7: 0x6E7B, - 0x9CB8: 0x6E7C, - 0x9CB9: 0x6E7D, - 0x9CBA: 0x6E80, - 0x9CBB: 0x6E81, - 0x9CBC: 0x6E82, - 0x9CBD: 0x6E84, - 0x9CBE: 0x6E87, - 0x9CBF: 0x6E88, - 0x9CC0: 0x6E8A, - 0x9CC1: 0x6E8B, - 0x9CC2: 0x6E8C, - 0x9CC3: 0x6E8D, - 0x9CC4: 0x6E8E, - 0x9CC5: 0x6E91, - 0x9CC6: 0x6E92, - 0x9CC7: 0x6E93, - 0x9CC8: 0x6E94, - 0x9CC9: 0x6E95, - 0x9CCA: 0x6E96, - 0x9CCB: 0x6E97, - 0x9CCC: 0x6E99, - 0x9CCD: 0x6E9A, - 0x9CCE: 0x6E9B, - 0x9CCF: 0x6E9D, - 0x9CD0: 0x6E9E, - 0x9CD1: 0x6EA0, - 0x9CD2: 0x6EA1, - 0x9CD3: 0x6EA3, - 0x9CD4: 0x6EA4, - 0x9CD5: 0x6EA6, - 0x9CD6: 0x6EA8, - 0x9CD7: 0x6EA9, - 0x9CD8: 0x6EAB, - 0x9CD9: 0x6EAC, - 0x9CDA: 0x6EAD, - 0x9CDB: 0x6EAE, - 0x9CDC: 0x6EB0, - 0x9CDD: 0x6EB3, - 0x9CDE: 0x6EB5, - 0x9CDF: 0x6EB8, - 0x9CE0: 0x6EB9, - 0x9CE1: 0x6EBC, - 0x9CE2: 0x6EBE, - 0x9CE3: 0x6EBF, - 0x9CE4: 0x6EC0, - 0x9CE5: 0x6EC3, - 0x9CE6: 0x6EC4, - 0x9CE7: 0x6EC5, - 0x9CE8: 0x6EC6, - 0x9CE9: 0x6EC8, - 0x9CEA: 0x6EC9, - 0x9CEB: 0x6ECA, - 0x9CEC: 0x6ECC, - 0x9CED: 0x6ECD, - 0x9CEE: 0x6ECE, - 0x9CEF: 0x6ED0, - 0x9CF0: 0x6ED2, - 0x9CF1: 0x6ED6, - 0x9CF2: 0x6ED8, - 0x9CF3: 0x6ED9, - 0x9CF4: 0x6EDB, - 0x9CF5: 0x6EDC, - 0x9CF6: 0x6EDD, - 0x9CF7: 0x6EE3, - 0x9CF8: 0x6EE7, - 0x9CF9: 0x6EEA, - 0x9CFA: 0x6EEB, - 0x9CFB: 0x6EEC, - 0x9CFC: 0x6EED, - 0x9CFD: 0x6EEE, - 0x9CFE: 0x6EEF, - 0x9D40: 0x6EF0, - 0x9D41: 0x6EF1, - 0x9D42: 0x6EF2, - 0x9D43: 0x6EF3, - 0x9D44: 0x6EF5, - 0x9D45: 0x6EF6, - 0x9D46: 0x6EF7, - 0x9D47: 0x6EF8, - 0x9D48: 0x6EFA, - 0x9D49: 0x6EFB, - 0x9D4A: 0x6EFC, - 0x9D4B: 0x6EFD, - 0x9D4C: 0x6EFE, - 0x9D4D: 0x6EFF, - 0x9D4E: 0x6F00, - 0x9D4F: 0x6F01, - 0x9D50: 0x6F03, - 0x9D51: 0x6F04, - 0x9D52: 0x6F05, - 0x9D53: 0x6F07, - 0x9D54: 0x6F08, - 0x9D55: 0x6F0A, - 0x9D56: 0x6F0B, - 0x9D57: 0x6F0C, - 0x9D58: 0x6F0D, - 0x9D59: 0x6F0E, - 0x9D5A: 0x6F10, - 0x9D5B: 0x6F11, - 0x9D5C: 0x6F12, - 0x9D5D: 0x6F16, - 0x9D5E: 0x6F17, - 0x9D5F: 0x6F18, - 0x9D60: 0x6F19, - 0x9D61: 0x6F1A, - 0x9D62: 0x6F1B, - 0x9D63: 0x6F1C, - 0x9D64: 0x6F1D, - 0x9D65: 0x6F1E, - 0x9D66: 0x6F1F, - 0x9D67: 0x6F21, - 0x9D68: 0x6F22, - 0x9D69: 0x6F23, - 0x9D6A: 0x6F25, - 0x9D6B: 0x6F26, - 0x9D6C: 0x6F27, - 0x9D6D: 0x6F28, - 0x9D6E: 0x6F2C, - 0x9D6F: 0x6F2E, - 0x9D70: 0x6F30, - 0x9D71: 0x6F32, - 0x9D72: 0x6F34, - 0x9D73: 0x6F35, - 0x9D74: 0x6F37, - 0x9D75: 0x6F38, - 0x9D76: 0x6F39, - 0x9D77: 0x6F3A, - 0x9D78: 0x6F3B, - 0x9D79: 0x6F3C, - 0x9D7A: 0x6F3D, - 0x9D7B: 0x6F3F, - 0x9D7C: 0x6F40, - 0x9D7D: 0x6F41, - 0x9D7E: 0x6F42, - 0x9D80: 0x6F43, - 0x9D81: 0x6F44, - 0x9D82: 0x6F45, - 0x9D83: 0x6F48, - 0x9D84: 0x6F49, - 0x9D85: 0x6F4A, - 0x9D86: 0x6F4C, - 0x9D87: 0x6F4E, - 0x9D88: 0x6F4F, - 0x9D89: 0x6F50, - 0x9D8A: 0x6F51, - 0x9D8B: 0x6F52, - 0x9D8C: 0x6F53, - 0x9D8D: 0x6F54, - 0x9D8E: 0x6F55, - 0x9D8F: 0x6F56, - 0x9D90: 0x6F57, - 0x9D91: 0x6F59, - 0x9D92: 0x6F5A, - 0x9D93: 0x6F5B, - 0x9D94: 0x6F5D, - 0x9D95: 0x6F5F, - 0x9D96: 0x6F60, - 0x9D97: 0x6F61, - 0x9D98: 0x6F63, - 0x9D99: 0x6F64, - 0x9D9A: 0x6F65, - 0x9D9B: 0x6F67, - 0x9D9C: 0x6F68, - 0x9D9D: 0x6F69, - 0x9D9E: 0x6F6A, - 0x9D9F: 0x6F6B, - 0x9DA0: 0x6F6C, - 0x9DA1: 0x6F6F, - 0x9DA2: 0x6F70, - 0x9DA3: 0x6F71, - 0x9DA4: 0x6F73, - 0x9DA5: 0x6F75, - 0x9DA6: 0x6F76, - 0x9DA7: 0x6F77, - 0x9DA8: 0x6F79, - 0x9DA9: 0x6F7B, - 0x9DAA: 0x6F7D, - 0x9DAB: 0x6F7E, - 0x9DAC: 0x6F7F, - 0x9DAD: 0x6F80, - 0x9DAE: 0x6F81, - 0x9DAF: 0x6F82, - 0x9DB0: 0x6F83, - 0x9DB1: 0x6F85, - 0x9DB2: 0x6F86, - 0x9DB3: 0x6F87, - 0x9DB4: 0x6F8A, - 0x9DB5: 0x6F8B, - 0x9DB6: 0x6F8F, - 0x9DB7: 0x6F90, - 0x9DB8: 0x6F91, - 0x9DB9: 0x6F92, - 0x9DBA: 0x6F93, - 0x9DBB: 0x6F94, - 0x9DBC: 0x6F95, - 0x9DBD: 0x6F96, - 0x9DBE: 0x6F97, - 0x9DBF: 0x6F98, - 0x9DC0: 0x6F99, - 0x9DC1: 0x6F9A, - 0x9DC2: 0x6F9B, - 0x9DC3: 0x6F9D, - 0x9DC4: 0x6F9E, - 0x9DC5: 0x6F9F, - 0x9DC6: 0x6FA0, - 0x9DC7: 0x6FA2, - 0x9DC8: 0x6FA3, - 0x9DC9: 0x6FA4, - 0x9DCA: 0x6FA5, - 0x9DCB: 0x6FA6, - 0x9DCC: 0x6FA8, - 0x9DCD: 0x6FA9, - 0x9DCE: 0x6FAA, - 0x9DCF: 0x6FAB, - 0x9DD0: 0x6FAC, - 0x9DD1: 0x6FAD, - 0x9DD2: 0x6FAE, - 0x9DD3: 0x6FAF, - 0x9DD4: 0x6FB0, - 0x9DD5: 0x6FB1, - 0x9DD6: 0x6FB2, - 0x9DD7: 0x6FB4, - 0x9DD8: 0x6FB5, - 0x9DD9: 0x6FB7, - 0x9DDA: 0x6FB8, - 0x9DDB: 0x6FBA, - 0x9DDC: 0x6FBB, - 0x9DDD: 0x6FBC, - 0x9DDE: 0x6FBD, - 0x9DDF: 0x6FBE, - 0x9DE0: 0x6FBF, - 0x9DE1: 0x6FC1, - 0x9DE2: 0x6FC3, - 0x9DE3: 0x6FC4, - 0x9DE4: 0x6FC5, - 0x9DE5: 0x6FC6, - 0x9DE6: 0x6FC7, - 0x9DE7: 0x6FC8, - 0x9DE8: 0x6FCA, - 0x9DE9: 0x6FCB, - 0x9DEA: 0x6FCC, - 0x9DEB: 0x6FCD, - 0x9DEC: 0x6FCE, - 0x9DED: 0x6FCF, - 0x9DEE: 0x6FD0, - 0x9DEF: 0x6FD3, - 0x9DF0: 0x6FD4, - 0x9DF1: 0x6FD5, - 0x9DF2: 0x6FD6, - 0x9DF3: 0x6FD7, - 0x9DF4: 0x6FD8, - 0x9DF5: 0x6FD9, - 0x9DF6: 0x6FDA, - 0x9DF7: 0x6FDB, - 0x9DF8: 0x6FDC, - 0x9DF9: 0x6FDD, - 0x9DFA: 0x6FDF, - 0x9DFB: 0x6FE2, - 0x9DFC: 0x6FE3, - 0x9DFD: 0x6FE4, - 0x9DFE: 0x6FE5, - 0x9E40: 0x6FE6, - 0x9E41: 0x6FE7, - 0x9E42: 0x6FE8, - 0x9E43: 0x6FE9, - 0x9E44: 0x6FEA, - 0x9E45: 0x6FEB, - 0x9E46: 0x6FEC, - 0x9E47: 0x6FED, - 0x9E48: 0x6FF0, - 0x9E49: 0x6FF1, - 0x9E4A: 0x6FF2, - 0x9E4B: 0x6FF3, - 0x9E4C: 0x6FF4, - 0x9E4D: 0x6FF5, - 0x9E4E: 0x6FF6, - 0x9E4F: 0x6FF7, - 0x9E50: 0x6FF8, - 0x9E51: 0x6FF9, - 0x9E52: 0x6FFA, - 0x9E53: 0x6FFB, - 0x9E54: 0x6FFC, - 0x9E55: 0x6FFD, - 0x9E56: 0x6FFE, - 0x9E57: 0x6FFF, - 0x9E58: 0x7000, - 0x9E59: 0x7001, - 0x9E5A: 0x7002, - 0x9E5B: 0x7003, - 0x9E5C: 0x7004, - 0x9E5D: 0x7005, - 0x9E5E: 0x7006, - 0x9E5F: 0x7007, - 0x9E60: 0x7008, - 0x9E61: 0x7009, - 0x9E62: 0x700A, - 0x9E63: 0x700B, - 0x9E64: 0x700C, - 0x9E65: 0x700D, - 0x9E66: 0x700E, - 0x9E67: 0x700F, - 0x9E68: 0x7010, - 0x9E69: 0x7012, - 0x9E6A: 0x7013, - 0x9E6B: 0x7014, - 0x9E6C: 0x7015, - 0x9E6D: 0x7016, - 0x9E6E: 0x7017, - 0x9E6F: 0x7018, - 0x9E70: 0x7019, - 0x9E71: 0x701C, - 0x9E72: 0x701D, - 0x9E73: 0x701E, - 0x9E74: 0x701F, - 0x9E75: 0x7020, - 0x9E76: 0x7021, - 0x9E77: 0x7022, - 0x9E78: 0x7024, - 0x9E79: 0x7025, - 0x9E7A: 0x7026, - 0x9E7B: 0x7027, - 0x9E7C: 0x7028, - 0x9E7D: 0x7029, - 0x9E7E: 0x702A, - 0x9E80: 0x702B, - 0x9E81: 0x702C, - 0x9E82: 0x702D, - 0x9E83: 0x702E, - 0x9E84: 0x702F, - 0x9E85: 0x7030, - 0x9E86: 0x7031, - 0x9E87: 0x7032, - 0x9E88: 0x7033, - 0x9E89: 0x7034, - 0x9E8A: 0x7036, - 0x9E8B: 0x7037, - 0x9E8C: 0x7038, - 0x9E8D: 0x703A, - 0x9E8E: 0x703B, - 0x9E8F: 0x703C, - 0x9E90: 0x703D, - 0x9E91: 0x703E, - 0x9E92: 0x703F, - 0x9E93: 0x7040, - 0x9E94: 0x7041, - 0x9E95: 0x7042, - 0x9E96: 0x7043, - 0x9E97: 0x7044, - 0x9E98: 0x7045, - 0x9E99: 0x7046, - 0x9E9A: 0x7047, - 0x9E9B: 0x7048, - 0x9E9C: 0x7049, - 0x9E9D: 0x704A, - 0x9E9E: 0x704B, - 0x9E9F: 0x704D, - 0x9EA0: 0x704E, - 0x9EA1: 0x7050, - 0x9EA2: 0x7051, - 0x9EA3: 0x7052, - 0x9EA4: 0x7053, - 0x9EA5: 0x7054, - 0x9EA6: 0x7055, - 0x9EA7: 0x7056, - 0x9EA8: 0x7057, - 0x9EA9: 0x7058, - 0x9EAA: 0x7059, - 0x9EAB: 0x705A, - 0x9EAC: 0x705B, - 0x9EAD: 0x705C, - 0x9EAE: 0x705D, - 0x9EAF: 0x705F, - 0x9EB0: 0x7060, - 0x9EB1: 0x7061, - 0x9EB2: 0x7062, - 0x9EB3: 0x7063, - 0x9EB4: 0x7064, - 0x9EB5: 0x7065, - 0x9EB6: 0x7066, - 0x9EB7: 0x7067, - 0x9EB8: 0x7068, - 0x9EB9: 0x7069, - 0x9EBA: 0x706A, - 0x9EBB: 0x706E, - 0x9EBC: 0x7071, - 0x9EBD: 0x7072, - 0x9EBE: 0x7073, - 0x9EBF: 0x7074, - 0x9EC0: 0x7077, - 0x9EC1: 0x7079, - 0x9EC2: 0x707A, - 0x9EC3: 0x707B, - 0x9EC4: 0x707D, - 0x9EC5: 0x7081, - 0x9EC6: 0x7082, - 0x9EC7: 0x7083, - 0x9EC8: 0x7084, - 0x9EC9: 0x7086, - 0x9ECA: 0x7087, - 0x9ECB: 0x7088, - 0x9ECC: 0x708B, - 0x9ECD: 0x708C, - 0x9ECE: 0x708D, - 0x9ECF: 0x708F, - 0x9ED0: 0x7090, - 0x9ED1: 0x7091, - 0x9ED2: 0x7093, - 0x9ED3: 0x7097, - 0x9ED4: 0x7098, - 0x9ED5: 0x709A, - 0x9ED6: 0x709B, - 0x9ED7: 0x709E, - 0x9ED8: 0x709F, - 0x9ED9: 0x70A0, - 0x9EDA: 0x70A1, - 0x9EDB: 0x70A2, - 0x9EDC: 0x70A3, - 0x9EDD: 0x70A4, - 0x9EDE: 0x70A5, - 0x9EDF: 0x70A6, - 0x9EE0: 0x70A7, - 0x9EE1: 0x70A8, - 0x9EE2: 0x70A9, - 0x9EE3: 0x70AA, - 0x9EE4: 0x70B0, - 0x9EE5: 0x70B2, - 0x9EE6: 0x70B4, - 0x9EE7: 0x70B5, - 0x9EE8: 0x70B6, - 0x9EE9: 0x70BA, - 0x9EEA: 0x70BE, - 0x9EEB: 0x70BF, - 0x9EEC: 0x70C4, - 0x9EED: 0x70C5, - 0x9EEE: 0x70C6, - 0x9EEF: 0x70C7, - 0x9EF0: 0x70C9, - 0x9EF1: 0x70CB, - 0x9EF2: 0x70CC, - 0x9EF3: 0x70CD, - 0x9EF4: 0x70CE, - 0x9EF5: 0x70CF, - 0x9EF6: 0x70D0, - 0x9EF7: 0x70D1, - 0x9EF8: 0x70D2, - 0x9EF9: 0x70D3, - 0x9EFA: 0x70D4, - 0x9EFB: 0x70D5, - 0x9EFC: 0x70D6, - 0x9EFD: 0x70D7, - 0x9EFE: 0x70DA, - 0x9F40: 0x70DC, - 0x9F41: 0x70DD, - 0x9F42: 0x70DE, - 0x9F43: 0x70E0, - 0x9F44: 0x70E1, - 0x9F45: 0x70E2, - 0x9F46: 0x70E3, - 0x9F47: 0x70E5, - 0x9F48: 0x70EA, - 0x9F49: 0x70EE, - 0x9F4A: 0x70F0, - 0x9F4B: 0x70F1, - 0x9F4C: 0x70F2, - 0x9F4D: 0x70F3, - 0x9F4E: 0x70F4, - 0x9F4F: 0x70F5, - 0x9F50: 0x70F6, - 0x9F51: 0x70F8, - 0x9F52: 0x70FA, - 0x9F53: 0x70FB, - 0x9F54: 0x70FC, - 0x9F55: 0x70FE, - 0x9F56: 0x70FF, - 0x9F57: 0x7100, - 0x9F58: 0x7101, - 0x9F59: 0x7102, - 0x9F5A: 0x7103, - 0x9F5B: 0x7104, - 0x9F5C: 0x7105, - 0x9F5D: 0x7106, - 0x9F5E: 0x7107, - 0x9F5F: 0x7108, - 0x9F60: 0x710B, - 0x9F61: 0x710C, - 0x9F62: 0x710D, - 0x9F63: 0x710E, - 0x9F64: 0x710F, - 0x9F65: 0x7111, - 0x9F66: 0x7112, - 0x9F67: 0x7114, - 0x9F68: 0x7117, - 0x9F69: 0x711B, - 0x9F6A: 0x711C, - 0x9F6B: 0x711D, - 0x9F6C: 0x711E, - 0x9F6D: 0x711F, - 0x9F6E: 0x7120, - 0x9F6F: 0x7121, - 0x9F70: 0x7122, - 0x9F71: 0x7123, - 0x9F72: 0x7124, - 0x9F73: 0x7125, - 0x9F74: 0x7127, - 0x9F75: 0x7128, - 0x9F76: 0x7129, - 0x9F77: 0x712A, - 0x9F78: 0x712B, - 0x9F79: 0x712C, - 0x9F7A: 0x712D, - 0x9F7B: 0x712E, - 0x9F7C: 0x7132, - 0x9F7D: 0x7133, - 0x9F7E: 0x7134, - 0x9F80: 0x7135, - 0x9F81: 0x7137, - 0x9F82: 0x7138, - 0x9F83: 0x7139, - 0x9F84: 0x713A, - 0x9F85: 0x713B, - 0x9F86: 0x713C, - 0x9F87: 0x713D, - 0x9F88: 0x713E, - 0x9F89: 0x713F, - 0x9F8A: 0x7140, - 0x9F8B: 0x7141, - 0x9F8C: 0x7142, - 0x9F8D: 0x7143, - 0x9F8E: 0x7144, - 0x9F8F: 0x7146, - 0x9F90: 0x7147, - 0x9F91: 0x7148, - 0x9F92: 0x7149, - 0x9F93: 0x714B, - 0x9F94: 0x714D, - 0x9F95: 0x714F, - 0x9F96: 0x7150, - 0x9F97: 0x7151, - 0x9F98: 0x7152, - 0x9F99: 0x7153, - 0x9F9A: 0x7154, - 0x9F9B: 0x7155, - 0x9F9C: 0x7156, - 0x9F9D: 0x7157, - 0x9F9E: 0x7158, - 0x9F9F: 0x7159, - 0x9FA0: 0x715A, - 0x9FA1: 0x715B, - 0x9FA2: 0x715D, - 0x9FA3: 0x715F, - 0x9FA4: 0x7160, - 0x9FA5: 0x7161, - 0x9FA6: 0x7162, - 0x9FA7: 0x7163, - 0x9FA8: 0x7165, - 0x9FA9: 0x7169, - 0x9FAA: 0x716A, - 0x9FAB: 0x716B, - 0x9FAC: 0x716C, - 0x9FAD: 0x716D, - 0x9FAE: 0x716F, - 0x9FAF: 0x7170, - 0x9FB0: 0x7171, - 0x9FB1: 0x7174, - 0x9FB2: 0x7175, - 0x9FB3: 0x7176, - 0x9FB4: 0x7177, - 0x9FB5: 0x7179, - 0x9FB6: 0x717B, - 0x9FB7: 0x717C, - 0x9FB8: 0x717E, - 0x9FB9: 0x717F, - 0x9FBA: 0x7180, - 0x9FBB: 0x7181, - 0x9FBC: 0x7182, - 0x9FBD: 0x7183, - 0x9FBE: 0x7185, - 0x9FBF: 0x7186, - 0x9FC0: 0x7187, - 0x9FC1: 0x7188, - 0x9FC2: 0x7189, - 0x9FC3: 0x718B, - 0x9FC4: 0x718C, - 0x9FC5: 0x718D, - 0x9FC6: 0x718E, - 0x9FC7: 0x7190, - 0x9FC8: 0x7191, - 0x9FC9: 0x7192, - 0x9FCA: 0x7193, - 0x9FCB: 0x7195, - 0x9FCC: 0x7196, - 0x9FCD: 0x7197, - 0x9FCE: 0x719A, - 0x9FCF: 0x719B, - 0x9FD0: 0x719C, - 0x9FD1: 0x719D, - 0x9FD2: 0x719E, - 0x9FD3: 0x71A1, - 0x9FD4: 0x71A2, - 0x9FD5: 0x71A3, - 0x9FD6: 0x71A4, - 0x9FD7: 0x71A5, - 0x9FD8: 0x71A6, - 0x9FD9: 0x71A7, - 0x9FDA: 0x71A9, - 0x9FDB: 0x71AA, - 0x9FDC: 0x71AB, - 0x9FDD: 0x71AD, - 0x9FDE: 0x71AE, - 0x9FDF: 0x71AF, - 0x9FE0: 0x71B0, - 0x9FE1: 0x71B1, - 0x9FE2: 0x71B2, - 0x9FE3: 0x71B4, - 0x9FE4: 0x71B6, - 0x9FE5: 0x71B7, - 0x9FE6: 0x71B8, - 0x9FE7: 0x71BA, - 0x9FE8: 0x71BB, - 0x9FE9: 0x71BC, - 0x9FEA: 0x71BD, - 0x9FEB: 0x71BE, - 0x9FEC: 0x71BF, - 0x9FED: 0x71C0, - 0x9FEE: 0x71C1, - 0x9FEF: 0x71C2, - 0x9FF0: 0x71C4, - 0x9FF1: 0x71C5, - 0x9FF2: 0x71C6, - 0x9FF3: 0x71C7, - 0x9FF4: 0x71C8, - 0x9FF5: 0x71C9, - 0x9FF6: 0x71CA, - 0x9FF7: 0x71CB, - 0x9FF8: 0x71CC, - 0x9FF9: 0x71CD, - 0x9FFA: 0x71CF, - 0x9FFB: 0x71D0, - 0x9FFC: 0x71D1, - 0x9FFD: 0x71D2, - 0x9FFE: 0x71D3, - 0xA040: 0x71D6, - 0xA041: 0x71D7, - 0xA042: 0x71D8, - 0xA043: 0x71D9, - 0xA044: 0x71DA, - 0xA045: 0x71DB, - 0xA046: 0x71DC, - 0xA047: 0x71DD, - 0xA048: 0x71DE, - 0xA049: 0x71DF, - 0xA04A: 0x71E1, - 0xA04B: 0x71E2, - 0xA04C: 0x71E3, - 0xA04D: 0x71E4, - 0xA04E: 0x71E6, - 0xA04F: 0x71E8, - 0xA050: 0x71E9, - 0xA051: 0x71EA, - 0xA052: 0x71EB, - 0xA053: 0x71EC, - 0xA054: 0x71ED, - 0xA055: 0x71EF, - 0xA056: 0x71F0, - 0xA057: 0x71F1, - 0xA058: 0x71F2, - 0xA059: 0x71F3, - 0xA05A: 0x71F4, - 0xA05B: 0x71F5, - 0xA05C: 0x71F6, - 0xA05D: 0x71F7, - 0xA05E: 0x71F8, - 0xA05F: 0x71FA, - 0xA060: 0x71FB, - 0xA061: 0x71FC, - 0xA062: 0x71FD, - 0xA063: 0x71FE, - 0xA064: 0x71FF, - 0xA065: 0x7200, - 0xA066: 0x7201, - 0xA067: 0x7202, - 0xA068: 0x7203, - 0xA069: 0x7204, - 0xA06A: 0x7205, - 0xA06B: 0x7207, - 0xA06C: 0x7208, - 0xA06D: 0x7209, - 0xA06E: 0x720A, - 0xA06F: 0x720B, - 0xA070: 0x720C, - 0xA071: 0x720D, - 0xA072: 0x720E, - 0xA073: 0x720F, - 0xA074: 0x7210, - 0xA075: 0x7211, - 0xA076: 0x7212, - 0xA077: 0x7213, - 0xA078: 0x7214, - 0xA079: 0x7215, - 0xA07A: 0x7216, - 0xA07B: 0x7217, - 0xA07C: 0x7218, - 0xA07D: 0x7219, - 0xA07E: 0x721A, - 0xA080: 0x721B, - 0xA081: 0x721C, - 0xA082: 0x721E, - 0xA083: 0x721F, - 0xA084: 0x7220, - 0xA085: 0x7221, - 0xA086: 0x7222, - 0xA087: 0x7223, - 0xA088: 0x7224, - 0xA089: 0x7225, - 0xA08A: 0x7226, - 0xA08B: 0x7227, - 0xA08C: 0x7229, - 0xA08D: 0x722B, - 0xA08E: 0x722D, - 0xA08F: 0x722E, - 0xA090: 0x722F, - 0xA091: 0x7232, - 0xA092: 0x7233, - 0xA093: 0x7234, - 0xA094: 0x723A, - 0xA095: 0x723C, - 0xA096: 0x723E, - 0xA097: 0x7240, - 0xA098: 0x7241, - 0xA099: 0x7242, - 0xA09A: 0x7243, - 0xA09B: 0x7244, - 0xA09C: 0x7245, - 0xA09D: 0x7246, - 0xA09E: 0x7249, - 0xA09F: 0x724A, - 0xA0A0: 0x724B, - 0xA0A1: 0x724E, - 0xA0A2: 0x724F, - 0xA0A3: 0x7250, - 0xA0A4: 0x7251, - 0xA0A5: 0x7253, - 0xA0A6: 0x7254, - 0xA0A7: 0x7255, - 0xA0A8: 0x7257, - 0xA0A9: 0x7258, - 0xA0AA: 0x725A, - 0xA0AB: 0x725C, - 0xA0AC: 0x725E, - 0xA0AD: 0x7260, - 0xA0AE: 0x7263, - 0xA0AF: 0x7264, - 0xA0B0: 0x7265, - 0xA0B1: 0x7268, - 0xA0B2: 0x726A, - 0xA0B3: 0x726B, - 0xA0B4: 0x726C, - 0xA0B5: 0x726D, - 0xA0B6: 0x7270, - 0xA0B7: 0x7271, - 0xA0B8: 0x7273, - 0xA0B9: 0x7274, - 0xA0BA: 0x7276, - 0xA0BB: 0x7277, - 0xA0BC: 0x7278, - 0xA0BD: 0x727B, - 0xA0BE: 0x727C, - 0xA0BF: 0x727D, - 0xA0C0: 0x7282, - 0xA0C1: 0x7283, - 0xA0C2: 0x7285, - 0xA0C3: 0x7286, - 0xA0C4: 0x7287, - 0xA0C5: 0x7288, - 0xA0C6: 0x7289, - 0xA0C7: 0x728C, - 0xA0C8: 0x728E, - 0xA0C9: 0x7290, - 0xA0CA: 0x7291, - 0xA0CB: 0x7293, - 0xA0CC: 0x7294, - 0xA0CD: 0x7295, - 0xA0CE: 0x7296, - 0xA0CF: 0x7297, - 0xA0D0: 0x7298, - 0xA0D1: 0x7299, - 0xA0D2: 0x729A, - 0xA0D3: 0x729B, - 0xA0D4: 0x729C, - 0xA0D5: 0x729D, - 0xA0D6: 0x729E, - 0xA0D7: 0x72A0, - 0xA0D8: 0x72A1, - 0xA0D9: 0x72A2, - 0xA0DA: 0x72A3, - 0xA0DB: 0x72A4, - 0xA0DC: 0x72A5, - 0xA0DD: 0x72A6, - 0xA0DE: 0x72A7, - 0xA0DF: 0x72A8, - 0xA0E0: 0x72A9, - 0xA0E1: 0x72AA, - 0xA0E2: 0x72AB, - 0xA0E3: 0x72AE, - 0xA0E4: 0x72B1, - 0xA0E5: 0x72B2, - 0xA0E6: 0x72B3, - 0xA0E7: 0x72B5, - 0xA0E8: 0x72BA, - 0xA0E9: 0x72BB, - 0xA0EA: 0x72BC, - 0xA0EB: 0x72BD, - 0xA0EC: 0x72BE, - 0xA0ED: 0x72BF, - 0xA0EE: 0x72C0, - 0xA0EF: 0x72C5, - 0xA0F0: 0x72C6, - 0xA0F1: 0x72C7, - 0xA0F2: 0x72C9, - 0xA0F3: 0x72CA, - 0xA0F4: 0x72CB, - 0xA0F5: 0x72CC, - 0xA0F6: 0x72CF, - 0xA0F7: 0x72D1, - 0xA0F8: 0x72D3, - 0xA0F9: 0x72D4, - 0xA0FA: 0x72D5, - 0xA0FB: 0x72D6, - 0xA0FC: 0x72D8, - 0xA0FD: 0x72DA, - 0xA0FE: 0x72DB, - 0xA140: 0xE4C6, - 0xA141: 0xE4C7, - 0xA142: 0xE4C8, - 0xA143: 0xE4C9, - 0xA144: 0xE4CA, - 0xA145: 0xE4CB, - 0xA146: 0xE4CC, - 0xA147: 0xE4CD, - 0xA148: 0xE4CE, - 0xA149: 0xE4CF, - 0xA14A: 0xE4D0, - 0xA14B: 0xE4D1, - 0xA14C: 0xE4D2, - 0xA14D: 0xE4D3, - 0xA14E: 0xE4D4, - 0xA14F: 0xE4D5, - 0xA150: 0xE4D6, - 0xA151: 0xE4D7, - 0xA152: 0xE4D8, - 0xA153: 0xE4D9, - 0xA154: 0xE4DA, - 0xA155: 0xE4DB, - 0xA156: 0xE4DC, - 0xA157: 0xE4DD, - 0xA158: 0xE4DE, - 0xA159: 0xE4DF, - 0xA15A: 0xE4E0, - 0xA15B: 0xE4E1, - 0xA15C: 0xE4E2, - 0xA15D: 0xE4E3, - 0xA15E: 0xE4E4, - 0xA15F: 0xE4E5, - 0xA160: 0xE4E6, - 0xA161: 0xE4E7, - 0xA162: 0xE4E8, - 0xA163: 0xE4E9, - 0xA164: 0xE4EA, - 0xA165: 0xE4EB, - 0xA166: 0xE4EC, - 0xA167: 0xE4ED, - 0xA168: 0xE4EE, - 0xA169: 0xE4EF, - 0xA16A: 0xE4F0, - 0xA16B: 0xE4F1, - 0xA16C: 0xE4F2, - 0xA16D: 0xE4F3, - 0xA16E: 0xE4F4, - 0xA16F: 0xE4F5, - 0xA170: 0xE4F6, - 0xA171: 0xE4F7, - 0xA172: 0xE4F8, - 0xA173: 0xE4F9, - 0xA174: 0xE4FA, - 0xA175: 0xE4FB, - 0xA176: 0xE4FC, - 0xA177: 0xE4FD, - 0xA178: 0xE4FE, - 0xA179: 0xE4FF, - 0xA17A: 0xE500, - 0xA17B: 0xE501, - 0xA17C: 0xE502, - 0xA17D: 0xE503, - 0xA17E: 0xE504, - 0xA180: 0xE505, - 0xA181: 0xE506, - 0xA182: 0xE507, - 0xA183: 0xE508, - 0xA184: 0xE509, - 0xA185: 0xE50A, - 0xA186: 0xE50B, - 0xA187: 0xE50C, - 0xA188: 0xE50D, - 0xA189: 0xE50E, - 0xA18A: 0xE50F, - 0xA18B: 0xE510, - 0xA18C: 0xE511, - 0xA18D: 0xE512, - 0xA18E: 0xE513, - 0xA18F: 0xE514, - 0xA190: 0xE515, - 0xA191: 0xE516, - 0xA192: 0xE517, - 0xA193: 0xE518, - 0xA194: 0xE519, - 0xA195: 0xE51A, - 0xA196: 0xE51B, - 0xA197: 0xE51C, - 0xA198: 0xE51D, - 0xA199: 0xE51E, - 0xA19A: 0xE51F, - 0xA19B: 0xE520, - 0xA19C: 0xE521, - 0xA19D: 0xE522, - 0xA19E: 0xE523, - 0xA19F: 0xE524, - 0xA1A0: 0xE525, - 0xA1A1: 0x3000, - 0xA1A2: 0x3001, - 0xA1A3: 0x3002, - 0xA1A4: 0x00B7, - 0xA1A5: 0x02C9, - 0xA1A6: 0x02C7, - 0xA1A7: 0x00A8, - 0xA1A8: 0x3003, - 0xA1A9: 0x3005, - 0xA1AA: 0x2014, - 0xA1AB: 0xFF5E, - 0xA1AC: 0x2016, - 0xA1AD: 0x2026, - 0xA1AE: 0x2018, - 0xA1AF: 0x2019, - 0xA1B0: 0x201C, - 0xA1B1: 0x201D, - 0xA1B2: 0x3014, - 0xA1B3: 0x3015, - 0xA1B4: 0x3008, - 0xA1B5: 0x3009, - 0xA1B6: 0x300A, - 0xA1B7: 0x300B, - 0xA1B8: 0x300C, - 0xA1B9: 0x300D, - 0xA1BA: 0x300E, - 0xA1BB: 0x300F, - 0xA1BC: 0x3016, - 0xA1BD: 0x3017, - 0xA1BE: 0x3010, - 0xA1BF: 0x3011, - 0xA1C0: 0x00B1, - 0xA1C1: 0x00D7, - 0xA1C2: 0x00F7, - 0xA1C3: 0x2236, - 0xA1C4: 0x2227, - 0xA1C5: 0x2228, - 0xA1C6: 0x2211, - 0xA1C7: 0x220F, - 0xA1C8: 0x222A, - 0xA1C9: 0x2229, - 0xA1CA: 0x2208, - 0xA1CB: 0x2237, - 0xA1CC: 0x221A, - 0xA1CD: 0x22A5, - 0xA1CE: 0x2225, - 0xA1CF: 0x2220, - 0xA1D0: 0x2312, - 0xA1D1: 0x2299, - 0xA1D2: 0x222B, - 0xA1D3: 0x222E, - 0xA1D4: 0x2261, - 0xA1D5: 0x224C, - 0xA1D6: 0x2248, - 0xA1D7: 0x223D, - 0xA1D8: 0x221D, - 0xA1D9: 0x2260, - 0xA1DA: 0x226E, - 0xA1DB: 0x226F, - 0xA1DC: 0x2264, - 0xA1DD: 0x2265, - 0xA1DE: 0x221E, - 0xA1DF: 0x2235, - 0xA1E0: 0x2234, - 0xA1E1: 0x2642, - 0xA1E2: 0x2640, - 0xA1E3: 0x00B0, - 0xA1E4: 0x2032, - 0xA1E5: 0x2033, - 0xA1E6: 0x2103, - 0xA1E7: 0xFF04, - 0xA1E8: 0x00A4, - 0xA1E9: 0xFFE0, - 0xA1EA: 0xFFE1, - 0xA1EB: 0x2030, - 0xA1EC: 0x00A7, - 0xA1ED: 0x2116, - 0xA1EE: 0x2606, - 0xA1EF: 0x2605, - 0xA1F0: 0x25CB, - 0xA1F1: 0x25CF, - 0xA1F2: 0x25CE, - 0xA1F3: 0x25C7, - 0xA1F4: 0x25C6, - 0xA1F5: 0x25A1, - 0xA1F6: 0x25A0, - 0xA1F7: 0x25B3, - 0xA1F8: 0x25B2, - 0xA1F9: 0x203B, - 0xA1FA: 0x2192, - 0xA1FB: 0x2190, - 0xA1FC: 0x2191, - 0xA1FD: 0x2193, - 0xA1FE: 0x3013, - 0xA240: 0xE526, - 0xA241: 0xE527, - 0xA242: 0xE528, - 0xA243: 0xE529, - 0xA244: 0xE52A, - 0xA245: 0xE52B, - 0xA246: 0xE52C, - 0xA247: 0xE52D, - 0xA248: 0xE52E, - 0xA249: 0xE52F, - 0xA24A: 0xE530, - 0xA24B: 0xE531, - 0xA24C: 0xE532, - 0xA24D: 0xE533, - 0xA24E: 0xE534, - 0xA24F: 0xE535, - 0xA250: 0xE536, - 0xA251: 0xE537, - 0xA252: 0xE538, - 0xA253: 0xE539, - 0xA254: 0xE53A, - 0xA255: 0xE53B, - 0xA256: 0xE53C, - 0xA257: 0xE53D, - 0xA258: 0xE53E, - 0xA259: 0xE53F, - 0xA25A: 0xE540, - 0xA25B: 0xE541, - 0xA25C: 0xE542, - 0xA25D: 0xE543, - 0xA25E: 0xE544, - 0xA25F: 0xE545, - 0xA260: 0xE546, - 0xA261: 0xE547, - 0xA262: 0xE548, - 0xA263: 0xE549, - 0xA264: 0xE54A, - 0xA265: 0xE54B, - 0xA266: 0xE54C, - 0xA267: 0xE54D, - 0xA268: 0xE54E, - 0xA269: 0xE54F, - 0xA26A: 0xE550, - 0xA26B: 0xE551, - 0xA26C: 0xE552, - 0xA26D: 0xE553, - 0xA26E: 0xE554, - 0xA26F: 0xE555, - 0xA270: 0xE556, - 0xA271: 0xE557, - 0xA272: 0xE558, - 0xA273: 0xE559, - 0xA274: 0xE55A, - 0xA275: 0xE55B, - 0xA276: 0xE55C, - 0xA277: 0xE55D, - 0xA278: 0xE55E, - 0xA279: 0xE55F, - 0xA27A: 0xE560, - 0xA27B: 0xE561, - 0xA27C: 0xE562, - 0xA27D: 0xE563, - 0xA27E: 0xE564, - 0xA280: 0xE565, - 0xA281: 0xE566, - 0xA282: 0xE567, - 0xA283: 0xE568, - 0xA284: 0xE569, - 0xA285: 0xE56A, - 0xA286: 0xE56B, - 0xA287: 0xE56C, - 0xA288: 0xE56D, - 0xA289: 0xE56E, - 0xA28A: 0xE56F, - 0xA28B: 0xE570, - 0xA28C: 0xE571, - 0xA28D: 0xE572, - 0xA28E: 0xE573, - 0xA28F: 0xE574, - 0xA290: 0xE575, - 0xA291: 0xE576, - 0xA292: 0xE577, - 0xA293: 0xE578, - 0xA294: 0xE579, - 0xA295: 0xE57A, - 0xA296: 0xE57B, - 0xA297: 0xE57C, - 0xA298: 0xE57D, - 0xA299: 0xE57E, - 0xA29A: 0xE57F, - 0xA29B: 0xE580, - 0xA29C: 0xE581, - 0xA29D: 0xE582, - 0xA29E: 0xE583, - 0xA29F: 0xE584, - 0xA2A0: 0xE585, - 0xA2A1: 0x2170, - 0xA2A2: 0x2171, - 0xA2A3: 0x2172, - 0xA2A4: 0x2173, - 0xA2A5: 0x2174, - 0xA2A6: 0x2175, - 0xA2A7: 0x2176, - 0xA2A8: 0x2177, - 0xA2A9: 0x2178, - 0xA2AA: 0x2179, - 0xA2AB: 0xE766, - 0xA2AC: 0xE767, - 0xA2AD: 0xE768, - 0xA2AE: 0xE769, - 0xA2AF: 0xE76A, - 0xA2B0: 0xE76B, - 0xA2B1: 0x2488, - 0xA2B2: 0x2489, - 0xA2B3: 0x248A, - 0xA2B4: 0x248B, - 0xA2B5: 0x248C, - 0xA2B6: 0x248D, - 0xA2B7: 0x248E, - 0xA2B8: 0x248F, - 0xA2B9: 0x2490, - 0xA2BA: 0x2491, - 0xA2BB: 0x2492, - 0xA2BC: 0x2493, - 0xA2BD: 0x2494, - 0xA2BE: 0x2495, - 0xA2BF: 0x2496, - 0xA2C0: 0x2497, - 0xA2C1: 0x2498, - 0xA2C2: 0x2499, - 0xA2C3: 0x249A, - 0xA2C4: 0x249B, - 0xA2C5: 0x2474, - 0xA2C6: 0x2475, - 0xA2C7: 0x2476, - 0xA2C8: 0x2477, - 0xA2C9: 0x2478, - 0xA2CA: 0x2479, - 0xA2CB: 0x247A, - 0xA2CC: 0x247B, - 0xA2CD: 0x247C, - 0xA2CE: 0x247D, - 0xA2CF: 0x247E, - 0xA2D0: 0x247F, - 0xA2D1: 0x2480, - 0xA2D2: 0x2481, - 0xA2D3: 0x2482, - 0xA2D4: 0x2483, - 0xA2D5: 0x2484, - 0xA2D6: 0x2485, - 0xA2D7: 0x2486, - 0xA2D8: 0x2487, - 0xA2D9: 0x2460, - 0xA2DA: 0x2461, - 0xA2DB: 0x2462, - 0xA2DC: 0x2463, - 0xA2DD: 0x2464, - 0xA2DE: 0x2465, - 0xA2DF: 0x2466, - 0xA2E0: 0x2467, - 0xA2E1: 0x2468, - 0xA2E2: 0x2469, - 0xA2E3: 0x20AC, - 0xA2E4: 0xE76D, - 0xA2E5: 0x3220, - 0xA2E6: 0x3221, - 0xA2E7: 0x3222, - 0xA2E8: 0x3223, - 0xA2E9: 0x3224, - 0xA2EA: 0x3225, - 0xA2EB: 0x3226, - 0xA2EC: 0x3227, - 0xA2ED: 0x3228, - 0xA2EE: 0x3229, - 0xA2EF: 0xE76E, - 0xA2F0: 0xE76F, - 0xA2F1: 0x2160, - 0xA2F2: 0x2161, - 0xA2F3: 0x2162, - 0xA2F4: 0x2163, - 0xA2F5: 0x2164, - 0xA2F6: 0x2165, - 0xA2F7: 0x2166, - 0xA2F8: 0x2167, - 0xA2F9: 0x2168, - 0xA2FA: 0x2169, - 0xA2FB: 0x216A, - 0xA2FC: 0x216B, - 0xA2FD: 0xE770, - 0xA2FE: 0xE771, - 0xA340: 0xE586, - 0xA341: 0xE587, - 0xA342: 0xE588, - 0xA343: 0xE589, - 0xA344: 0xE58A, - 0xA345: 0xE58B, - 0xA346: 0xE58C, - 0xA347: 0xE58D, - 0xA348: 0xE58E, - 0xA349: 0xE58F, - 0xA34A: 0xE590, - 0xA34B: 0xE591, - 0xA34C: 0xE592, - 0xA34D: 0xE593, - 0xA34E: 0xE594, - 0xA34F: 0xE595, - 0xA350: 0xE596, - 0xA351: 0xE597, - 0xA352: 0xE598, - 0xA353: 0xE599, - 0xA354: 0xE59A, - 0xA355: 0xE59B, - 0xA356: 0xE59C, - 0xA357: 0xE59D, - 0xA358: 0xE59E, - 0xA359: 0xE59F, - 0xA35A: 0xE5A0, - 0xA35B: 0xE5A1, - 0xA35C: 0xE5A2, - 0xA35D: 0xE5A3, - 0xA35E: 0xE5A4, - 0xA35F: 0xE5A5, - 0xA360: 0xE5A6, - 0xA361: 0xE5A7, - 0xA362: 0xE5A8, - 0xA363: 0xE5A9, - 0xA364: 0xE5AA, - 0xA365: 0xE5AB, - 0xA366: 0xE5AC, - 0xA367: 0xE5AD, - 0xA368: 0xE5AE, - 0xA369: 0xE5AF, - 0xA36A: 0xE5B0, - 0xA36B: 0xE5B1, - 0xA36C: 0xE5B2, - 0xA36D: 0xE5B3, - 0xA36E: 0xE5B4, - 0xA36F: 0xE5B5, - 0xA370: 0xE5B6, - 0xA371: 0xE5B7, - 0xA372: 0xE5B8, - 0xA373: 0xE5B9, - 0xA374: 0xE5BA, - 0xA375: 0xE5BB, - 0xA376: 0xE5BC, - 0xA377: 0xE5BD, - 0xA378: 0xE5BE, - 0xA379: 0xE5BF, - 0xA37A: 0xE5C0, - 0xA37B: 0xE5C1, - 0xA37C: 0xE5C2, - 0xA37D: 0xE5C3, - 0xA37E: 0xE5C4, - 0xA380: 0xE5C5, - 0xA381: 0xE5C6, - 0xA382: 0xE5C7, - 0xA383: 0xE5C8, - 0xA384: 0xE5C9, - 0xA385: 0xE5CA, - 0xA386: 0xE5CB, - 0xA387: 0xE5CC, - 0xA388: 0xE5CD, - 0xA389: 0xE5CE, - 0xA38A: 0xE5CF, - 0xA38B: 0xE5D0, - 0xA38C: 0xE5D1, - 0xA38D: 0xE5D2, - 0xA38E: 0xE5D3, - 0xA38F: 0xE5D4, - 0xA390: 0xE5D5, - 0xA391: 0xE5D6, - 0xA392: 0xE5D7, - 0xA393: 0xE5D8, - 0xA394: 0xE5D9, - 0xA395: 0xE5DA, - 0xA396: 0xE5DB, - 0xA397: 0xE5DC, - 0xA398: 0xE5DD, - 0xA399: 0xE5DE, - 0xA39A: 0xE5DF, - 0xA39B: 0xE5E0, - 0xA39C: 0xE5E1, - 0xA39D: 0xE5E2, - 0xA39E: 0xE5E3, - 0xA39F: 0xE5E4, - 0xA3A0: 0xE5E5, - 0xA3A1: 0xFF01, - 0xA3A2: 0xFF02, - 0xA3A3: 0xFF03, - 0xA3A4: 0xFFE5, - 0xA3A5: 0xFF05, - 0xA3A6: 0xFF06, - 0xA3A7: 0xFF07, - 0xA3A8: 0xFF08, - 0xA3A9: 0xFF09, - 0xA3AA: 0xFF0A, - 0xA3AB: 0xFF0B, - 0xA3AC: 0xFF0C, - 0xA3AD: 0xFF0D, - 0xA3AE: 0xFF0E, - 0xA3AF: 0xFF0F, - 0xA3B0: 0xFF10, - 0xA3B1: 0xFF11, - 0xA3B2: 0xFF12, - 0xA3B3: 0xFF13, - 0xA3B4: 0xFF14, - 0xA3B5: 0xFF15, - 0xA3B6: 0xFF16, - 0xA3B7: 0xFF17, - 0xA3B8: 0xFF18, - 0xA3B9: 0xFF19, - 0xA3BA: 0xFF1A, - 0xA3BB: 0xFF1B, - 0xA3BC: 0xFF1C, - 0xA3BD: 0xFF1D, - 0xA3BE: 0xFF1E, - 0xA3BF: 0xFF1F, - 0xA3C0: 0xFF20, - 0xA3C1: 0xFF21, - 0xA3C2: 0xFF22, - 0xA3C3: 0xFF23, - 0xA3C4: 0xFF24, - 0xA3C5: 0xFF25, - 0xA3C6: 0xFF26, - 0xA3C7: 0xFF27, - 0xA3C8: 0xFF28, - 0xA3C9: 0xFF29, - 0xA3CA: 0xFF2A, - 0xA3CB: 0xFF2B, - 0xA3CC: 0xFF2C, - 0xA3CD: 0xFF2D, - 0xA3CE: 0xFF2E, - 0xA3CF: 0xFF2F, - 0xA3D0: 0xFF30, - 0xA3D1: 0xFF31, - 0xA3D2: 0xFF32, - 0xA3D3: 0xFF33, - 0xA3D4: 0xFF34, - 0xA3D5: 0xFF35, - 0xA3D6: 0xFF36, - 0xA3D7: 0xFF37, - 0xA3D8: 0xFF38, - 0xA3D9: 0xFF39, - 0xA3DA: 0xFF3A, - 0xA3DB: 0xFF3B, - 0xA3DC: 0xFF3C, - 0xA3DD: 0xFF3D, - 0xA3DE: 0xFF3E, - 0xA3DF: 0xFF3F, - 0xA3E0: 0xFF40, - 0xA3E1: 0xFF41, - 0xA3E2: 0xFF42, - 0xA3E3: 0xFF43, - 0xA3E4: 0xFF44, - 0xA3E5: 0xFF45, - 0xA3E6: 0xFF46, - 0xA3E7: 0xFF47, - 0xA3E8: 0xFF48, - 0xA3E9: 0xFF49, - 0xA3EA: 0xFF4A, - 0xA3EB: 0xFF4B, - 0xA3EC: 0xFF4C, - 0xA3ED: 0xFF4D, - 0xA3EE: 0xFF4E, - 0xA3EF: 0xFF4F, - 0xA3F0: 0xFF50, - 0xA3F1: 0xFF51, - 0xA3F2: 0xFF52, - 0xA3F3: 0xFF53, - 0xA3F4: 0xFF54, - 0xA3F5: 0xFF55, - 0xA3F6: 0xFF56, - 0xA3F7: 0xFF57, - 0xA3F8: 0xFF58, - 0xA3F9: 0xFF59, - 0xA3FA: 0xFF5A, - 0xA3FB: 0xFF5B, - 0xA3FC: 0xFF5C, - 0xA3FD: 0xFF5D, - 0xA3FE: 0xFFE3, - 0xA440: 0xE5E6, - 0xA441: 0xE5E7, - 0xA442: 0xE5E8, - 0xA443: 0xE5E9, - 0xA444: 0xE5EA, - 0xA445: 0xE5EB, - 0xA446: 0xE5EC, - 0xA447: 0xE5ED, - 0xA448: 0xE5EE, - 0xA449: 0xE5EF, - 0xA44A: 0xE5F0, - 0xA44B: 0xE5F1, - 0xA44C: 0xE5F2, - 0xA44D: 0xE5F3, - 0xA44E: 0xE5F4, - 0xA44F: 0xE5F5, - 0xA450: 0xE5F6, - 0xA451: 0xE5F7, - 0xA452: 0xE5F8, - 0xA453: 0xE5F9, - 0xA454: 0xE5FA, - 0xA455: 0xE5FB, - 0xA456: 0xE5FC, - 0xA457: 0xE5FD, - 0xA458: 0xE5FE, - 0xA459: 0xE5FF, - 0xA45A: 0xE600, - 0xA45B: 0xE601, - 0xA45C: 0xE602, - 0xA45D: 0xE603, - 0xA45E: 0xE604, - 0xA45F: 0xE605, - 0xA460: 0xE606, - 0xA461: 0xE607, - 0xA462: 0xE608, - 0xA463: 0xE609, - 0xA464: 0xE60A, - 0xA465: 0xE60B, - 0xA466: 0xE60C, - 0xA467: 0xE60D, - 0xA468: 0xE60E, - 0xA469: 0xE60F, - 0xA46A: 0xE610, - 0xA46B: 0xE611, - 0xA46C: 0xE612, - 0xA46D: 0xE613, - 0xA46E: 0xE614, - 0xA46F: 0xE615, - 0xA470: 0xE616, - 0xA471: 0xE617, - 0xA472: 0xE618, - 0xA473: 0xE619, - 0xA474: 0xE61A, - 0xA475: 0xE61B, - 0xA476: 0xE61C, - 0xA477: 0xE61D, - 0xA478: 0xE61E, - 0xA479: 0xE61F, - 0xA47A: 0xE620, - 0xA47B: 0xE621, - 0xA47C: 0xE622, - 0xA47D: 0xE623, - 0xA47E: 0xE624, - 0xA480: 0xE625, - 0xA481: 0xE626, - 0xA482: 0xE627, - 0xA483: 0xE628, - 0xA484: 0xE629, - 0xA485: 0xE62A, - 0xA486: 0xE62B, - 0xA487: 0xE62C, - 0xA488: 0xE62D, - 0xA489: 0xE62E, - 0xA48A: 0xE62F, - 0xA48B: 0xE630, - 0xA48C: 0xE631, - 0xA48D: 0xE632, - 0xA48E: 0xE633, - 0xA48F: 0xE634, - 0xA490: 0xE635, - 0xA491: 0xE636, - 0xA492: 0xE637, - 0xA493: 0xE638, - 0xA494: 0xE639, - 0xA495: 0xE63A, - 0xA496: 0xE63B, - 0xA497: 0xE63C, - 0xA498: 0xE63D, - 0xA499: 0xE63E, - 0xA49A: 0xE63F, - 0xA49B: 0xE640, - 0xA49C: 0xE641, - 0xA49D: 0xE642, - 0xA49E: 0xE643, - 0xA49F: 0xE644, - 0xA4A0: 0xE645, - 0xA4A1: 0x3041, - 0xA4A2: 0x3042, - 0xA4A3: 0x3043, - 0xA4A4: 0x3044, - 0xA4A5: 0x3045, - 0xA4A6: 0x3046, - 0xA4A7: 0x3047, - 0xA4A8: 0x3048, - 0xA4A9: 0x3049, - 0xA4AA: 0x304A, - 0xA4AB: 0x304B, - 0xA4AC: 0x304C, - 0xA4AD: 0x304D, - 0xA4AE: 0x304E, - 0xA4AF: 0x304F, - 0xA4B0: 0x3050, - 0xA4B1: 0x3051, - 0xA4B2: 0x3052, - 0xA4B3: 0x3053, - 0xA4B4: 0x3054, - 0xA4B5: 0x3055, - 0xA4B6: 0x3056, - 0xA4B7: 0x3057, - 0xA4B8: 0x3058, - 0xA4B9: 0x3059, - 0xA4BA: 0x305A, - 0xA4BB: 0x305B, - 0xA4BC: 0x305C, - 0xA4BD: 0x305D, - 0xA4BE: 0x305E, - 0xA4BF: 0x305F, - 0xA4C0: 0x3060, - 0xA4C1: 0x3061, - 0xA4C2: 0x3062, - 0xA4C3: 0x3063, - 0xA4C4: 0x3064, - 0xA4C5: 0x3065, - 0xA4C6: 0x3066, - 0xA4C7: 0x3067, - 0xA4C8: 0x3068, - 0xA4C9: 0x3069, - 0xA4CA: 0x306A, - 0xA4CB: 0x306B, - 0xA4CC: 0x306C, - 0xA4CD: 0x306D, - 0xA4CE: 0x306E, - 0xA4CF: 0x306F, - 0xA4D0: 0x3070, - 0xA4D1: 0x3071, - 0xA4D2: 0x3072, - 0xA4D3: 0x3073, - 0xA4D4: 0x3074, - 0xA4D5: 0x3075, - 0xA4D6: 0x3076, - 0xA4D7: 0x3077, - 0xA4D8: 0x3078, - 0xA4D9: 0x3079, - 0xA4DA: 0x307A, - 0xA4DB: 0x307B, - 0xA4DC: 0x307C, - 0xA4DD: 0x307D, - 0xA4DE: 0x307E, - 0xA4DF: 0x307F, - 0xA4E0: 0x3080, - 0xA4E1: 0x3081, - 0xA4E2: 0x3082, - 0xA4E3: 0x3083, - 0xA4E4: 0x3084, - 0xA4E5: 0x3085, - 0xA4E6: 0x3086, - 0xA4E7: 0x3087, - 0xA4E8: 0x3088, - 0xA4E9: 0x3089, - 0xA4EA: 0x308A, - 0xA4EB: 0x308B, - 0xA4EC: 0x308C, - 0xA4ED: 0x308D, - 0xA4EE: 0x308E, - 0xA4EF: 0x308F, - 0xA4F0: 0x3090, - 0xA4F1: 0x3091, - 0xA4F2: 0x3092, - 0xA4F3: 0x3093, - 0xA4F4: 0xE772, - 0xA4F5: 0xE773, - 0xA4F6: 0xE774, - 0xA4F7: 0xE775, - 0xA4F8: 0xE776, - 0xA4F9: 0xE777, - 0xA4FA: 0xE778, - 0xA4FB: 0xE779, - 0xA4FC: 0xE77A, - 0xA4FD: 0xE77B, - 0xA4FE: 0xE77C, - 0xA540: 0xE646, - 0xA541: 0xE647, - 0xA542: 0xE648, - 0xA543: 0xE649, - 0xA544: 0xE64A, - 0xA545: 0xE64B, - 0xA546: 0xE64C, - 0xA547: 0xE64D, - 0xA548: 0xE64E, - 0xA549: 0xE64F, - 0xA54A: 0xE650, - 0xA54B: 0xE651, - 0xA54C: 0xE652, - 0xA54D: 0xE653, - 0xA54E: 0xE654, - 0xA54F: 0xE655, - 0xA550: 0xE656, - 0xA551: 0xE657, - 0xA552: 0xE658, - 0xA553: 0xE659, - 0xA554: 0xE65A, - 0xA555: 0xE65B, - 0xA556: 0xE65C, - 0xA557: 0xE65D, - 0xA558: 0xE65E, - 0xA559: 0xE65F, - 0xA55A: 0xE660, - 0xA55B: 0xE661, - 0xA55C: 0xE662, - 0xA55D: 0xE663, - 0xA55E: 0xE664, - 0xA55F: 0xE665, - 0xA560: 0xE666, - 0xA561: 0xE667, - 0xA562: 0xE668, - 0xA563: 0xE669, - 0xA564: 0xE66A, - 0xA565: 0xE66B, - 0xA566: 0xE66C, - 0xA567: 0xE66D, - 0xA568: 0xE66E, - 0xA569: 0xE66F, - 0xA56A: 0xE670, - 0xA56B: 0xE671, - 0xA56C: 0xE672, - 0xA56D: 0xE673, - 0xA56E: 0xE674, - 0xA56F: 0xE675, - 0xA570: 0xE676, - 0xA571: 0xE677, - 0xA572: 0xE678, - 0xA573: 0xE679, - 0xA574: 0xE67A, - 0xA575: 0xE67B, - 0xA576: 0xE67C, - 0xA577: 0xE67D, - 0xA578: 0xE67E, - 0xA579: 0xE67F, - 0xA57A: 0xE680, - 0xA57B: 0xE681, - 0xA57C: 0xE682, - 0xA57D: 0xE683, - 0xA57E: 0xE684, - 0xA580: 0xE685, - 0xA581: 0xE686, - 0xA582: 0xE687, - 0xA583: 0xE688, - 0xA584: 0xE689, - 0xA585: 0xE68A, - 0xA586: 0xE68B, - 0xA587: 0xE68C, - 0xA588: 0xE68D, - 0xA589: 0xE68E, - 0xA58A: 0xE68F, - 0xA58B: 0xE690, - 0xA58C: 0xE691, - 0xA58D: 0xE692, - 0xA58E: 0xE693, - 0xA58F: 0xE694, - 0xA590: 0xE695, - 0xA591: 0xE696, - 0xA592: 0xE697, - 0xA593: 0xE698, - 0xA594: 0xE699, - 0xA595: 0xE69A, - 0xA596: 0xE69B, - 0xA597: 0xE69C, - 0xA598: 0xE69D, - 0xA599: 0xE69E, - 0xA59A: 0xE69F, - 0xA59B: 0xE6A0, - 0xA59C: 0xE6A1, - 0xA59D: 0xE6A2, - 0xA59E: 0xE6A3, - 0xA59F: 0xE6A4, - 0xA5A0: 0xE6A5, - 0xA5A1: 0x30A1, - 0xA5A2: 0x30A2, - 0xA5A3: 0x30A3, - 0xA5A4: 0x30A4, - 0xA5A5: 0x30A5, - 0xA5A6: 0x30A6, - 0xA5A7: 0x30A7, - 0xA5A8: 0x30A8, - 0xA5A9: 0x30A9, - 0xA5AA: 0x30AA, - 0xA5AB: 0x30AB, - 0xA5AC: 0x30AC, - 0xA5AD: 0x30AD, - 0xA5AE: 0x30AE, - 0xA5AF: 0x30AF, - 0xA5B0: 0x30B0, - 0xA5B1: 0x30B1, - 0xA5B2: 0x30B2, - 0xA5B3: 0x30B3, - 0xA5B4: 0x30B4, - 0xA5B5: 0x30B5, - 0xA5B6: 0x30B6, - 0xA5B7: 0x30B7, - 0xA5B8: 0x30B8, - 0xA5B9: 0x30B9, - 0xA5BA: 0x30BA, - 0xA5BB: 0x30BB, - 0xA5BC: 0x30BC, - 0xA5BD: 0x30BD, - 0xA5BE: 0x30BE, - 0xA5BF: 0x30BF, - 0xA5C0: 0x30C0, - 0xA5C1: 0x30C1, - 0xA5C2: 0x30C2, - 0xA5C3: 0x30C3, - 0xA5C4: 0x30C4, - 0xA5C5: 0x30C5, - 0xA5C6: 0x30C6, - 0xA5C7: 0x30C7, - 0xA5C8: 0x30C8, - 0xA5C9: 0x30C9, - 0xA5CA: 0x30CA, - 0xA5CB: 0x30CB, - 0xA5CC: 0x30CC, - 0xA5CD: 0x30CD, - 0xA5CE: 0x30CE, - 0xA5CF: 0x30CF, - 0xA5D0: 0x30D0, - 0xA5D1: 0x30D1, - 0xA5D2: 0x30D2, - 0xA5D3: 0x30D3, - 0xA5D4: 0x30D4, - 0xA5D5: 0x30D5, - 0xA5D6: 0x30D6, - 0xA5D7: 0x30D7, - 0xA5D8: 0x30D8, - 0xA5D9: 0x30D9, - 0xA5DA: 0x30DA, - 0xA5DB: 0x30DB, - 0xA5DC: 0x30DC, - 0xA5DD: 0x30DD, - 0xA5DE: 0x30DE, - 0xA5DF: 0x30DF, - 0xA5E0: 0x30E0, - 0xA5E1: 0x30E1, - 0xA5E2: 0x30E2, - 0xA5E3: 0x30E3, - 0xA5E4: 0x30E4, - 0xA5E5: 0x30E5, - 0xA5E6: 0x30E6, - 0xA5E7: 0x30E7, - 0xA5E8: 0x30E8, - 0xA5E9: 0x30E9, - 0xA5EA: 0x30EA, - 0xA5EB: 0x30EB, - 0xA5EC: 0x30EC, - 0xA5ED: 0x30ED, - 0xA5EE: 0x30EE, - 0xA5EF: 0x30EF, - 0xA5F0: 0x30F0, - 0xA5F1: 0x30F1, - 0xA5F2: 0x30F2, - 0xA5F3: 0x30F3, - 0xA5F4: 0x30F4, - 0xA5F5: 0x30F5, - 0xA5F6: 0x30F6, - 0xA5F7: 0xE77D, - 0xA5F8: 0xE77E, - 0xA5F9: 0xE77F, - 0xA5FA: 0xE780, - 0xA5FB: 0xE781, - 0xA5FC: 0xE782, - 0xA5FD: 0xE783, - 0xA5FE: 0xE784, - 0xA640: 0xE6A6, - 0xA641: 0xE6A7, - 0xA642: 0xE6A8, - 0xA643: 0xE6A9, - 0xA644: 0xE6AA, - 0xA645: 0xE6AB, - 0xA646: 0xE6AC, - 0xA647: 0xE6AD, - 0xA648: 0xE6AE, - 0xA649: 0xE6AF, - 0xA64A: 0xE6B0, - 0xA64B: 0xE6B1, - 0xA64C: 0xE6B2, - 0xA64D: 0xE6B3, - 0xA64E: 0xE6B4, - 0xA64F: 0xE6B5, - 0xA650: 0xE6B6, - 0xA651: 0xE6B7, - 0xA652: 0xE6B8, - 0xA653: 0xE6B9, - 0xA654: 0xE6BA, - 0xA655: 0xE6BB, - 0xA656: 0xE6BC, - 0xA657: 0xE6BD, - 0xA658: 0xE6BE, - 0xA659: 0xE6BF, - 0xA65A: 0xE6C0, - 0xA65B: 0xE6C1, - 0xA65C: 0xE6C2, - 0xA65D: 0xE6C3, - 0xA65E: 0xE6C4, - 0xA65F: 0xE6C5, - 0xA660: 0xE6C6, - 0xA661: 0xE6C7, - 0xA662: 0xE6C8, - 0xA663: 0xE6C9, - 0xA664: 0xE6CA, - 0xA665: 0xE6CB, - 0xA666: 0xE6CC, - 0xA667: 0xE6CD, - 0xA668: 0xE6CE, - 0xA669: 0xE6CF, - 0xA66A: 0xE6D0, - 0xA66B: 0xE6D1, - 0xA66C: 0xE6D2, - 0xA66D: 0xE6D3, - 0xA66E: 0xE6D4, - 0xA66F: 0xE6D5, - 0xA670: 0xE6D6, - 0xA671: 0xE6D7, - 0xA672: 0xE6D8, - 0xA673: 0xE6D9, - 0xA674: 0xE6DA, - 0xA675: 0xE6DB, - 0xA676: 0xE6DC, - 0xA677: 0xE6DD, - 0xA678: 0xE6DE, - 0xA679: 0xE6DF, - 0xA67A: 0xE6E0, - 0xA67B: 0xE6E1, - 0xA67C: 0xE6E2, - 0xA67D: 0xE6E3, - 0xA67E: 0xE6E4, - 0xA680: 0xE6E5, - 0xA681: 0xE6E6, - 0xA682: 0xE6E7, - 0xA683: 0xE6E8, - 0xA684: 0xE6E9, - 0xA685: 0xE6EA, - 0xA686: 0xE6EB, - 0xA687: 0xE6EC, - 0xA688: 0xE6ED, - 0xA689: 0xE6EE, - 0xA68A: 0xE6EF, - 0xA68B: 0xE6F0, - 0xA68C: 0xE6F1, - 0xA68D: 0xE6F2, - 0xA68E: 0xE6F3, - 0xA68F: 0xE6F4, - 0xA690: 0xE6F5, - 0xA691: 0xE6F6, - 0xA692: 0xE6F7, - 0xA693: 0xE6F8, - 0xA694: 0xE6F9, - 0xA695: 0xE6FA, - 0xA696: 0xE6FB, - 0xA697: 0xE6FC, - 0xA698: 0xE6FD, - 0xA699: 0xE6FE, - 0xA69A: 0xE6FF, - 0xA69B: 0xE700, - 0xA69C: 0xE701, - 0xA69D: 0xE702, - 0xA69E: 0xE703, - 0xA69F: 0xE704, - 0xA6A0: 0xE705, - 0xA6A1: 0x0391, - 0xA6A2: 0x0392, - 0xA6A3: 0x0393, - 0xA6A4: 0x0394, - 0xA6A5: 0x0395, - 0xA6A6: 0x0396, - 0xA6A7: 0x0397, - 0xA6A8: 0x0398, - 0xA6A9: 0x0399, - 0xA6AA: 0x039A, - 0xA6AB: 0x039B, - 0xA6AC: 0x039C, - 0xA6AD: 0x039D, - 0xA6AE: 0x039E, - 0xA6AF: 0x039F, - 0xA6B0: 0x03A0, - 0xA6B1: 0x03A1, - 0xA6B2: 0x03A3, - 0xA6B3: 0x03A4, - 0xA6B4: 0x03A5, - 0xA6B5: 0x03A6, - 0xA6B6: 0x03A7, - 0xA6B7: 0x03A8, - 0xA6B8: 0x03A9, - 0xA6B9: 0xE785, - 0xA6BA: 0xE786, - 0xA6BB: 0xE787, - 0xA6BC: 0xE788, - 0xA6BD: 0xE789, - 0xA6BE: 0xE78A, - 0xA6BF: 0xE78B, - 0xA6C0: 0xE78C, - 0xA6C1: 0x03B1, - 0xA6C2: 0x03B2, - 0xA6C3: 0x03B3, - 0xA6C4: 0x03B4, - 0xA6C5: 0x03B5, - 0xA6C6: 0x03B6, - 0xA6C7: 0x03B7, - 0xA6C8: 0x03B8, - 0xA6C9: 0x03B9, - 0xA6CA: 0x03BA, - 0xA6CB: 0x03BB, - 0xA6CC: 0x03BC, - 0xA6CD: 0x03BD, - 0xA6CE: 0x03BE, - 0xA6CF: 0x03BF, - 0xA6D0: 0x03C0, - 0xA6D1: 0x03C1, - 0xA6D2: 0x03C3, - 0xA6D3: 0x03C4, - 0xA6D4: 0x03C5, - 0xA6D5: 0x03C6, - 0xA6D6: 0x03C7, - 0xA6D7: 0x03C8, - 0xA6D8: 0x03C9, - 0xA6D9: 0xFE10, - 0xA6DA: 0xFE12, - 0xA6DB: 0xFE11, - 0xA6DC: 0xFE13, - 0xA6DD: 0xFE14, - 0xA6DE: 0xFE15, - 0xA6DF: 0xFE16, - 0xA6E0: 0xFE35, - 0xA6E1: 0xFE36, - 0xA6E2: 0xFE39, - 0xA6E3: 0xFE3A, - 0xA6E4: 0xFE3F, - 0xA6E5: 0xFE40, - 0xA6E6: 0xFE3D, - 0xA6E7: 0xFE3E, - 0xA6E8: 0xFE41, - 0xA6E9: 0xFE42, - 0xA6EA: 0xFE43, - 0xA6EB: 0xFE44, - 0xA6EC: 0xFE17, - 0xA6ED: 0xFE18, - 0xA6EE: 0xFE3B, - 0xA6EF: 0xFE3C, - 0xA6F0: 0xFE37, - 0xA6F1: 0xFE38, - 0xA6F2: 0xFE31, - 0xA6F3: 0xFE19, - 0xA6F4: 0xFE33, - 0xA6F5: 0xFE34, - 0xA6F6: 0xE797, - 0xA6F7: 0xE798, - 0xA6F8: 0xE799, - 0xA6F9: 0xE79A, - 0xA6FA: 0xE79B, - 0xA6FB: 0xE79C, - 0xA6FC: 0xE79D, - 0xA6FD: 0xE79E, - 0xA6FE: 0xE79F, - 0xA740: 0xE706, - 0xA741: 0xE707, - 0xA742: 0xE708, - 0xA743: 0xE709, - 0xA744: 0xE70A, - 0xA745: 0xE70B, - 0xA746: 0xE70C, - 0xA747: 0xE70D, - 0xA748: 0xE70E, - 0xA749: 0xE70F, - 0xA74A: 0xE710, - 0xA74B: 0xE711, - 0xA74C: 0xE712, - 0xA74D: 0xE713, - 0xA74E: 0xE714, - 0xA74F: 0xE715, - 0xA750: 0xE716, - 0xA751: 0xE717, - 0xA752: 0xE718, - 0xA753: 0xE719, - 0xA754: 0xE71A, - 0xA755: 0xE71B, - 0xA756: 0xE71C, - 0xA757: 0xE71D, - 0xA758: 0xE71E, - 0xA759: 0xE71F, - 0xA75A: 0xE720, - 0xA75B: 0xE721, - 0xA75C: 0xE722, - 0xA75D: 0xE723, - 0xA75E: 0xE724, - 0xA75F: 0xE725, - 0xA760: 0xE726, - 0xA761: 0xE727, - 0xA762: 0xE728, - 0xA763: 0xE729, - 0xA764: 0xE72A, - 0xA765: 0xE72B, - 0xA766: 0xE72C, - 0xA767: 0xE72D, - 0xA768: 0xE72E, - 0xA769: 0xE72F, - 0xA76A: 0xE730, - 0xA76B: 0xE731, - 0xA76C: 0xE732, - 0xA76D: 0xE733, - 0xA76E: 0xE734, - 0xA76F: 0xE735, - 0xA770: 0xE736, - 0xA771: 0xE737, - 0xA772: 0xE738, - 0xA773: 0xE739, - 0xA774: 0xE73A, - 0xA775: 0xE73B, - 0xA776: 0xE73C, - 0xA777: 0xE73D, - 0xA778: 0xE73E, - 0xA779: 0xE73F, - 0xA77A: 0xE740, - 0xA77B: 0xE741, - 0xA77C: 0xE742, - 0xA77D: 0xE743, - 0xA77E: 0xE744, - 0xA780: 0xE745, - 0xA781: 0xE746, - 0xA782: 0xE747, - 0xA783: 0xE748, - 0xA784: 0xE749, - 0xA785: 0xE74A, - 0xA786: 0xE74B, - 0xA787: 0xE74C, - 0xA788: 0xE74D, - 0xA789: 0xE74E, - 0xA78A: 0xE74F, - 0xA78B: 0xE750, - 0xA78C: 0xE751, - 0xA78D: 0xE752, - 0xA78E: 0xE753, - 0xA78F: 0xE754, - 0xA790: 0xE755, - 0xA791: 0xE756, - 0xA792: 0xE757, - 0xA793: 0xE758, - 0xA794: 0xE759, - 0xA795: 0xE75A, - 0xA796: 0xE75B, - 0xA797: 0xE75C, - 0xA798: 0xE75D, - 0xA799: 0xE75E, - 0xA79A: 0xE75F, - 0xA79B: 0xE760, - 0xA79C: 0xE761, - 0xA79D: 0xE762, - 0xA79E: 0xE763, - 0xA79F: 0xE764, - 0xA7A0: 0xE765, - 0xA7A1: 0x0410, - 0xA7A2: 0x0411, - 0xA7A3: 0x0412, - 0xA7A4: 0x0413, - 0xA7A5: 0x0414, - 0xA7A6: 0x0415, - 0xA7A7: 0x0401, - 0xA7A8: 0x0416, - 0xA7A9: 0x0417, - 0xA7AA: 0x0418, - 0xA7AB: 0x0419, - 0xA7AC: 0x041A, - 0xA7AD: 0x041B, - 0xA7AE: 0x041C, - 0xA7AF: 0x041D, - 0xA7B0: 0x041E, - 0xA7B1: 0x041F, - 0xA7B2: 0x0420, - 0xA7B3: 0x0421, - 0xA7B4: 0x0422, - 0xA7B5: 0x0423, - 0xA7B6: 0x0424, - 0xA7B7: 0x0425, - 0xA7B8: 0x0426, - 0xA7B9: 0x0427, - 0xA7BA: 0x0428, - 0xA7BB: 0x0429, - 0xA7BC: 0x042A, - 0xA7BD: 0x042B, - 0xA7BE: 0x042C, - 0xA7BF: 0x042D, - 0xA7C0: 0x042E, - 0xA7C1: 0x042F, - 0xA7C2: 0xE7A0, - 0xA7C3: 0xE7A1, - 0xA7C4: 0xE7A2, - 0xA7C5: 0xE7A3, - 0xA7C6: 0xE7A4, - 0xA7C7: 0xE7A5, - 0xA7C8: 0xE7A6, - 0xA7C9: 0xE7A7, - 0xA7CA: 0xE7A8, - 0xA7CB: 0xE7A9, - 0xA7CC: 0xE7AA, - 0xA7CD: 0xE7AB, - 0xA7CE: 0xE7AC, - 0xA7CF: 0xE7AD, - 0xA7D0: 0xE7AE, - 0xA7D1: 0x0430, - 0xA7D2: 0x0431, - 0xA7D3: 0x0432, - 0xA7D4: 0x0433, - 0xA7D5: 0x0434, - 0xA7D6: 0x0435, - 0xA7D7: 0x0451, - 0xA7D8: 0x0436, - 0xA7D9: 0x0437, - 0xA7DA: 0x0438, - 0xA7DB: 0x0439, - 0xA7DC: 0x043A, - 0xA7DD: 0x043B, - 0xA7DE: 0x043C, - 0xA7DF: 0x043D, - 0xA7E0: 0x043E, - 0xA7E1: 0x043F, - 0xA7E2: 0x0440, - 0xA7E3: 0x0441, - 0xA7E4: 0x0442, - 0xA7E5: 0x0443, - 0xA7E6: 0x0444, - 0xA7E7: 0x0445, - 0xA7E8: 0x0446, - 0xA7E9: 0x0447, - 0xA7EA: 0x0448, - 0xA7EB: 0x0449, - 0xA7EC: 0x044A, - 0xA7ED: 0x044B, - 0xA7EE: 0x044C, - 0xA7EF: 0x044D, - 0xA7F0: 0x044E, - 0xA7F1: 0x044F, - 0xA7F2: 0xE7AF, - 0xA7F3: 0xE7B0, - 0xA7F4: 0xE7B1, - 0xA7F5: 0xE7B2, - 0xA7F6: 0xE7B3, - 0xA7F7: 0xE7B4, - 0xA7F8: 0xE7B5, - 0xA7F9: 0xE7B6, - 0xA7FA: 0xE7B7, - 0xA7FB: 0xE7B8, - 0xA7FC: 0xE7B9, - 0xA7FD: 0xE7BA, - 0xA7FE: 0xE7BB, - 0xA840: 0x02CA, - 0xA841: 0x02CB, - 0xA842: 0x02D9, - 0xA843: 0x2013, - 0xA844: 0x2015, - 0xA845: 0x2025, - 0xA846: 0x2035, - 0xA847: 0x2105, - 0xA848: 0x2109, - 0xA849: 0x2196, - 0xA84A: 0x2197, - 0xA84B: 0x2198, - 0xA84C: 0x2199, - 0xA84D: 0x2215, - 0xA84E: 0x221F, - 0xA84F: 0x2223, - 0xA850: 0x2252, - 0xA851: 0x2266, - 0xA852: 0x2267, - 0xA853: 0x22BF, - 0xA854: 0x2550, - 0xA855: 0x2551, - 0xA856: 0x2552, - 0xA857: 0x2553, - 0xA858: 0x2554, - 0xA859: 0x2555, - 0xA85A: 0x2556, - 0xA85B: 0x2557, - 0xA85C: 0x2558, - 0xA85D: 0x2559, - 0xA85E: 0x255A, - 0xA85F: 0x255B, - 0xA860: 0x255C, - 0xA861: 0x255D, - 0xA862: 0x255E, - 0xA863: 0x255F, - 0xA864: 0x2560, - 0xA865: 0x2561, - 0xA866: 0x2562, - 0xA867: 0x2563, - 0xA868: 0x2564, - 0xA869: 0x2565, - 0xA86A: 0x2566, - 0xA86B: 0x2567, - 0xA86C: 0x2568, - 0xA86D: 0x2569, - 0xA86E: 0x256A, - 0xA86F: 0x256B, - 0xA870: 0x256C, - 0xA871: 0x256D, - 0xA872: 0x256E, - 0xA873: 0x256F, - 0xA874: 0x2570, - 0xA875: 0x2571, - 0xA876: 0x2572, - 0xA877: 0x2573, - 0xA878: 0x2581, - 0xA879: 0x2582, - 0xA87A: 0x2583, - 0xA87B: 0x2584, - 0xA87C: 0x2585, - 0xA87D: 0x2586, - 0xA87E: 0x2587, - 0xA880: 0x2588, - 0xA881: 0x2589, - 0xA882: 0x258A, - 0xA883: 0x258B, - 0xA884: 0x258C, - 0xA885: 0x258D, - 0xA886: 0x258E, - 0xA887: 0x258F, - 0xA888: 0x2593, - 0xA889: 0x2594, - 0xA88A: 0x2595, - 0xA88B: 0x25BC, - 0xA88C: 0x25BD, - 0xA88D: 0x25E2, - 0xA88E: 0x25E3, - 0xA88F: 0x25E4, - 0xA890: 0x25E5, - 0xA891: 0x2609, - 0xA892: 0x2295, - 0xA893: 0x3012, - 0xA894: 0x301D, - 0xA895: 0x301E, - 0xA896: 0xE7BC, - 0xA897: 0xE7BD, - 0xA898: 0xE7BE, - 0xA899: 0xE7BF, - 0xA89A: 0xE7C0, - 0xA89B: 0xE7C1, - 0xA89C: 0xE7C2, - 0xA89D: 0xE7C3, - 0xA89E: 0xE7C4, - 0xA89F: 0xE7C5, - 0xA8A0: 0xE7C6, - 0xA8A1: 0x0101, - 0xA8A2: 0x00E1, - 0xA8A3: 0x01CE, - 0xA8A4: 0x00E0, - 0xA8A5: 0x0113, - 0xA8A6: 0x00E9, - 0xA8A7: 0x011B, - 0xA8A8: 0x00E8, - 0xA8A9: 0x012B, - 0xA8AA: 0x00ED, - 0xA8AB: 0x01D0, - 0xA8AC: 0x00EC, - 0xA8AD: 0x014D, - 0xA8AE: 0x00F3, - 0xA8AF: 0x01D2, - 0xA8B0: 0x00F2, - 0xA8B1: 0x016B, - 0xA8B2: 0x00FA, - 0xA8B3: 0x01D4, - 0xA8B4: 0x00F9, - 0xA8B5: 0x01D6, - 0xA8B6: 0x01D8, - 0xA8B7: 0x01DA, - 0xA8B8: 0x01DC, - 0xA8B9: 0x00FC, - 0xA8BA: 0x00EA, - 0xA8BB: 0x0251, - 0xA8BC: 0x1E3F, - 0xA8BD: 0x0144, - 0xA8BE: 0x0148, - 0xA8BF: 0x01F9, - 0xA8C0: 0x0261, - 0xA8C1: 0xE7C9, - 0xA8C2: 0xE7CA, - 0xA8C3: 0xE7CB, - 0xA8C4: 0xE7CC, - 0xA8C5: 0x3105, - 0xA8C6: 0x3106, - 0xA8C7: 0x3107, - 0xA8C8: 0x3108, - 0xA8C9: 0x3109, - 0xA8CA: 0x310A, - 0xA8CB: 0x310B, - 0xA8CC: 0x310C, - 0xA8CD: 0x310D, - 0xA8CE: 0x310E, - 0xA8CF: 0x310F, - 0xA8D0: 0x3110, - 0xA8D1: 0x3111, - 0xA8D2: 0x3112, - 0xA8D3: 0x3113, - 0xA8D4: 0x3114, - 0xA8D5: 0x3115, - 0xA8D6: 0x3116, - 0xA8D7: 0x3117, - 0xA8D8: 0x3118, - 0xA8D9: 0x3119, - 0xA8DA: 0x311A, - 0xA8DB: 0x311B, - 0xA8DC: 0x311C, - 0xA8DD: 0x311D, - 0xA8DE: 0x311E, - 0xA8DF: 0x311F, - 0xA8E0: 0x3120, - 0xA8E1: 0x3121, - 0xA8E2: 0x3122, - 0xA8E3: 0x3123, - 0xA8E4: 0x3124, - 0xA8E5: 0x3125, - 0xA8E6: 0x3126, - 0xA8E7: 0x3127, - 0xA8E8: 0x3128, - 0xA8E9: 0x3129, - 0xA8EA: 0xE7CD, - 0xA8EB: 0xE7CE, - 0xA8EC: 0xE7CF, - 0xA8ED: 0xE7D0, - 0xA8EE: 0xE7D1, - 0xA8EF: 0xE7D2, - 0xA8F0: 0xE7D3, - 0xA8F1: 0xE7D4, - 0xA8F2: 0xE7D5, - 0xA8F3: 0xE7D6, - 0xA8F4: 0xE7D7, - 0xA8F5: 0xE7D8, - 0xA8F6: 0xE7D9, - 0xA8F7: 0xE7DA, - 0xA8F8: 0xE7DB, - 0xA8F9: 0xE7DC, - 0xA8FA: 0xE7DD, - 0xA8FB: 0xE7DE, - 0xA8FC: 0xE7DF, - 0xA8FD: 0xE7E0, - 0xA8FE: 0xE7E1, - 0xA940: 0x3021, - 0xA941: 0x3022, - 0xA942: 0x3023, - 0xA943: 0x3024, - 0xA944: 0x3025, - 0xA945: 0x3026, - 0xA946: 0x3027, - 0xA947: 0x3028, - 0xA948: 0x3029, - 0xA949: 0x32A3, - 0xA94A: 0x338E, - 0xA94B: 0x338F, - 0xA94C: 0x339C, - 0xA94D: 0x339D, - 0xA94E: 0x339E, - 0xA94F: 0x33A1, - 0xA950: 0x33C4, - 0xA951: 0x33CE, - 0xA952: 0x33D1, - 0xA953: 0x33D2, - 0xA954: 0x33D5, - 0xA955: 0xFE30, - 0xA956: 0xFFE2, - 0xA957: 0xFFE4, - 0xA958: 0xE7E2, - 0xA959: 0x2121, - 0xA95A: 0x3231, - 0xA95B: 0xE7E3, - 0xA95C: 0x2010, - 0xA95D: 0xE7E4, - 0xA95E: 0xE7E5, - 0xA95F: 0xE7E6, - 0xA960: 0x30FC, - 0xA961: 0x309B, - 0xA962: 0x309C, - 0xA963: 0x30FD, - 0xA964: 0x30FE, - 0xA965: 0x3006, - 0xA966: 0x309D, - 0xA967: 0x309E, - 0xA968: 0xFE49, - 0xA969: 0xFE4A, - 0xA96A: 0xFE4B, - 0xA96B: 0xFE4C, - 0xA96C: 0xFE4D, - 0xA96D: 0xFE4E, - 0xA96E: 0xFE4F, - 0xA96F: 0xFE50, - 0xA970: 0xFE51, - 0xA971: 0xFE52, - 0xA972: 0xFE54, - 0xA973: 0xFE55, - 0xA974: 0xFE56, - 0xA975: 0xFE57, - 0xA976: 0xFE59, - 0xA977: 0xFE5A, - 0xA978: 0xFE5B, - 0xA979: 0xFE5C, - 0xA97A: 0xFE5D, - 0xA97B: 0xFE5E, - 0xA97C: 0xFE5F, - 0xA97D: 0xFE60, - 0xA97E: 0xFE61, - 0xA980: 0xFE62, - 0xA981: 0xFE63, - 0xA982: 0xFE64, - 0xA983: 0xFE65, - 0xA984: 0xFE66, - 0xA985: 0xFE68, - 0xA986: 0xFE69, - 0xA987: 0xFE6A, - 0xA988: 0xFE6B, - 0xA989: 0x303E, - 0xA98A: 0x2FF0, - 0xA98B: 0x2FF1, - 0xA98C: 0x2FF2, - 0xA98D: 0x2FF3, - 0xA98E: 0x2FF4, - 0xA98F: 0x2FF5, - 0xA990: 0x2FF6, - 0xA991: 0x2FF7, - 0xA992: 0x2FF8, - 0xA993: 0x2FF9, - 0xA994: 0x2FFA, - 0xA995: 0x2FFB, - 0xA996: 0x3007, - 0xA997: 0xE7F4, - 0xA998: 0xE7F5, - 0xA999: 0xE7F6, - 0xA99A: 0xE7F7, - 0xA99B: 0xE7F8, - 0xA99C: 0xE7F9, - 0xA99D: 0xE7FA, - 0xA99E: 0xE7FB, - 0xA99F: 0xE7FC, - 0xA9A0: 0xE7FD, - 0xA9A1: 0xE7FE, - 0xA9A2: 0xE7FF, - 0xA9A3: 0xE800, - 0xA9A4: 0x2500, - 0xA9A5: 0x2501, - 0xA9A6: 0x2502, - 0xA9A7: 0x2503, - 0xA9A8: 0x2504, - 0xA9A9: 0x2505, - 0xA9AA: 0x2506, - 0xA9AB: 0x2507, - 0xA9AC: 0x2508, - 0xA9AD: 0x2509, - 0xA9AE: 0x250A, - 0xA9AF: 0x250B, - 0xA9B0: 0x250C, - 0xA9B1: 0x250D, - 0xA9B2: 0x250E, - 0xA9B3: 0x250F, - 0xA9B4: 0x2510, - 0xA9B5: 0x2511, - 0xA9B6: 0x2512, - 0xA9B7: 0x2513, - 0xA9B8: 0x2514, - 0xA9B9: 0x2515, - 0xA9BA: 0x2516, - 0xA9BB: 0x2517, - 0xA9BC: 0x2518, - 0xA9BD: 0x2519, - 0xA9BE: 0x251A, - 0xA9BF: 0x251B, - 0xA9C0: 0x251C, - 0xA9C1: 0x251D, - 0xA9C2: 0x251E, - 0xA9C3: 0x251F, - 0xA9C4: 0x2520, - 0xA9C5: 0x2521, - 0xA9C6: 0x2522, - 0xA9C7: 0x2523, - 0xA9C8: 0x2524, - 0xA9C9: 0x2525, - 0xA9CA: 0x2526, - 0xA9CB: 0x2527, - 0xA9CC: 0x2528, - 0xA9CD: 0x2529, - 0xA9CE: 0x252A, - 0xA9CF: 0x252B, - 0xA9D0: 0x252C, - 0xA9D1: 0x252D, - 0xA9D2: 0x252E, - 0xA9D3: 0x252F, - 0xA9D4: 0x2530, - 0xA9D5: 0x2531, - 0xA9D6: 0x2532, - 0xA9D7: 0x2533, - 0xA9D8: 0x2534, - 0xA9D9: 0x2535, - 0xA9DA: 0x2536, - 0xA9DB: 0x2537, - 0xA9DC: 0x2538, - 0xA9DD: 0x2539, - 0xA9DE: 0x253A, - 0xA9DF: 0x253B, - 0xA9E0: 0x253C, - 0xA9E1: 0x253D, - 0xA9E2: 0x253E, - 0xA9E3: 0x253F, - 0xA9E4: 0x2540, - 0xA9E5: 0x2541, - 0xA9E6: 0x2542, - 0xA9E7: 0x2543, - 0xA9E8: 0x2544, - 0xA9E9: 0x2545, - 0xA9EA: 0x2546, - 0xA9EB: 0x2547, - 0xA9EC: 0x2548, - 0xA9ED: 0x2549, - 0xA9EE: 0x254A, - 0xA9EF: 0x254B, - 0xA9F0: 0xE801, - 0xA9F1: 0xE802, - 0xA9F2: 0xE803, - 0xA9F3: 0xE804, - 0xA9F4: 0xE805, - 0xA9F5: 0xE806, - 0xA9F6: 0xE807, - 0xA9F7: 0xE808, - 0xA9F8: 0xE809, - 0xA9F9: 0xE80A, - 0xA9FA: 0xE80B, - 0xA9FB: 0xE80C, - 0xA9FC: 0xE80D, - 0xA9FD: 0xE80E, - 0xA9FE: 0xE80F, - 0xAA40: 0x72DC, - 0xAA41: 0x72DD, - 0xAA42: 0x72DF, - 0xAA43: 0x72E2, - 0xAA44: 0x72E3, - 0xAA45: 0x72E4, - 0xAA46: 0x72E5, - 0xAA47: 0x72E6, - 0xAA48: 0x72E7, - 0xAA49: 0x72EA, - 0xAA4A: 0x72EB, - 0xAA4B: 0x72F5, - 0xAA4C: 0x72F6, - 0xAA4D: 0x72F9, - 0xAA4E: 0x72FD, - 0xAA4F: 0x72FE, - 0xAA50: 0x72FF, - 0xAA51: 0x7300, - 0xAA52: 0x7302, - 0xAA53: 0x7304, - 0xAA54: 0x7305, - 0xAA55: 0x7306, - 0xAA56: 0x7307, - 0xAA57: 0x7308, - 0xAA58: 0x7309, - 0xAA59: 0x730B, - 0xAA5A: 0x730C, - 0xAA5B: 0x730D, - 0xAA5C: 0x730F, - 0xAA5D: 0x7310, - 0xAA5E: 0x7311, - 0xAA5F: 0x7312, - 0xAA60: 0x7314, - 0xAA61: 0x7318, - 0xAA62: 0x7319, - 0xAA63: 0x731A, - 0xAA64: 0x731F, - 0xAA65: 0x7320, - 0xAA66: 0x7323, - 0xAA67: 0x7324, - 0xAA68: 0x7326, - 0xAA69: 0x7327, - 0xAA6A: 0x7328, - 0xAA6B: 0x732D, - 0xAA6C: 0x732F, - 0xAA6D: 0x7330, - 0xAA6E: 0x7332, - 0xAA6F: 0x7333, - 0xAA70: 0x7335, - 0xAA71: 0x7336, - 0xAA72: 0x733A, - 0xAA73: 0x733B, - 0xAA74: 0x733C, - 0xAA75: 0x733D, - 0xAA76: 0x7340, - 0xAA77: 0x7341, - 0xAA78: 0x7342, - 0xAA79: 0x7343, - 0xAA7A: 0x7344, - 0xAA7B: 0x7345, - 0xAA7C: 0x7346, - 0xAA7D: 0x7347, - 0xAA7E: 0x7348, - 0xAA80: 0x7349, - 0xAA81: 0x734A, - 0xAA82: 0x734B, - 0xAA83: 0x734C, - 0xAA84: 0x734E, - 0xAA85: 0x734F, - 0xAA86: 0x7351, - 0xAA87: 0x7353, - 0xAA88: 0x7354, - 0xAA89: 0x7355, - 0xAA8A: 0x7356, - 0xAA8B: 0x7358, - 0xAA8C: 0x7359, - 0xAA8D: 0x735A, - 0xAA8E: 0x735B, - 0xAA8F: 0x735C, - 0xAA90: 0x735D, - 0xAA91: 0x735E, - 0xAA92: 0x735F, - 0xAA93: 0x7361, - 0xAA94: 0x7362, - 0xAA95: 0x7363, - 0xAA96: 0x7364, - 0xAA97: 0x7365, - 0xAA98: 0x7366, - 0xAA99: 0x7367, - 0xAA9A: 0x7368, - 0xAA9B: 0x7369, - 0xAA9C: 0x736A, - 0xAA9D: 0x736B, - 0xAA9E: 0x736E, - 0xAA9F: 0x7370, - 0xAAA0: 0x7371, - 0xAAA1: 0xE000, - 0xAAA2: 0xE001, - 0xAAA3: 0xE002, - 0xAAA4: 0xE003, - 0xAAA5: 0xE004, - 0xAAA6: 0xE005, - 0xAAA7: 0xE006, - 0xAAA8: 0xE007, - 0xAAA9: 0xE008, - 0xAAAA: 0xE009, - 0xAAAB: 0xE00A, - 0xAAAC: 0xE00B, - 0xAAAD: 0xE00C, - 0xAAAE: 0xE00D, - 0xAAAF: 0xE00E, - 0xAAB0: 0xE00F, - 0xAAB1: 0xE010, - 0xAAB2: 0xE011, - 0xAAB3: 0xE012, - 0xAAB4: 0xE013, - 0xAAB5: 0xE014, - 0xAAB6: 0xE015, - 0xAAB7: 0xE016, - 0xAAB8: 0xE017, - 0xAAB9: 0xE018, - 0xAABA: 0xE019, - 0xAABB: 0xE01A, - 0xAABC: 0xE01B, - 0xAABD: 0xE01C, - 0xAABE: 0xE01D, - 0xAABF: 0xE01E, - 0xAAC0: 0xE01F, - 0xAAC1: 0xE020, - 0xAAC2: 0xE021, - 0xAAC3: 0xE022, - 0xAAC4: 0xE023, - 0xAAC5: 0xE024, - 0xAAC6: 0xE025, - 0xAAC7: 0xE026, - 0xAAC8: 0xE027, - 0xAAC9: 0xE028, - 0xAACA: 0xE029, - 0xAACB: 0xE02A, - 0xAACC: 0xE02B, - 0xAACD: 0xE02C, - 0xAACE: 0xE02D, - 0xAACF: 0xE02E, - 0xAAD0: 0xE02F, - 0xAAD1: 0xE030, - 0xAAD2: 0xE031, - 0xAAD3: 0xE032, - 0xAAD4: 0xE033, - 0xAAD5: 0xE034, - 0xAAD6: 0xE035, - 0xAAD7: 0xE036, - 0xAAD8: 0xE037, - 0xAAD9: 0xE038, - 0xAADA: 0xE039, - 0xAADB: 0xE03A, - 0xAADC: 0xE03B, - 0xAADD: 0xE03C, - 0xAADE: 0xE03D, - 0xAADF: 0xE03E, - 0xAAE0: 0xE03F, - 0xAAE1: 0xE040, - 0xAAE2: 0xE041, - 0xAAE3: 0xE042, - 0xAAE4: 0xE043, - 0xAAE5: 0xE044, - 0xAAE6: 0xE045, - 0xAAE7: 0xE046, - 0xAAE8: 0xE047, - 0xAAE9: 0xE048, - 0xAAEA: 0xE049, - 0xAAEB: 0xE04A, - 0xAAEC: 0xE04B, - 0xAAED: 0xE04C, - 0xAAEE: 0xE04D, - 0xAAEF: 0xE04E, - 0xAAF0: 0xE04F, - 0xAAF1: 0xE050, - 0xAAF2: 0xE051, - 0xAAF3: 0xE052, - 0xAAF4: 0xE053, - 0xAAF5: 0xE054, - 0xAAF6: 0xE055, - 0xAAF7: 0xE056, - 0xAAF8: 0xE057, - 0xAAF9: 0xE058, - 0xAAFA: 0xE059, - 0xAAFB: 0xE05A, - 0xAAFC: 0xE05B, - 0xAAFD: 0xE05C, - 0xAAFE: 0xE05D, - 0xAB40: 0x7372, - 0xAB41: 0x7373, - 0xAB42: 0x7374, - 0xAB43: 0x7375, - 0xAB44: 0x7376, - 0xAB45: 0x7377, - 0xAB46: 0x7378, - 0xAB47: 0x7379, - 0xAB48: 0x737A, - 0xAB49: 0x737B, - 0xAB4A: 0x737C, - 0xAB4B: 0x737D, - 0xAB4C: 0x737F, - 0xAB4D: 0x7380, - 0xAB4E: 0x7381, - 0xAB4F: 0x7382, - 0xAB50: 0x7383, - 0xAB51: 0x7385, - 0xAB52: 0x7386, - 0xAB53: 0x7388, - 0xAB54: 0x738A, - 0xAB55: 0x738C, - 0xAB56: 0x738D, - 0xAB57: 0x738F, - 0xAB58: 0x7390, - 0xAB59: 0x7392, - 0xAB5A: 0x7393, - 0xAB5B: 0x7394, - 0xAB5C: 0x7395, - 0xAB5D: 0x7397, - 0xAB5E: 0x7398, - 0xAB5F: 0x7399, - 0xAB60: 0x739A, - 0xAB61: 0x739C, - 0xAB62: 0x739D, - 0xAB63: 0x739E, - 0xAB64: 0x73A0, - 0xAB65: 0x73A1, - 0xAB66: 0x73A3, - 0xAB67: 0x73A4, - 0xAB68: 0x73A5, - 0xAB69: 0x73A6, - 0xAB6A: 0x73A7, - 0xAB6B: 0x73A8, - 0xAB6C: 0x73AA, - 0xAB6D: 0x73AC, - 0xAB6E: 0x73AD, - 0xAB6F: 0x73B1, - 0xAB70: 0x73B4, - 0xAB71: 0x73B5, - 0xAB72: 0x73B6, - 0xAB73: 0x73B8, - 0xAB74: 0x73B9, - 0xAB75: 0x73BC, - 0xAB76: 0x73BD, - 0xAB77: 0x73BE, - 0xAB78: 0x73BF, - 0xAB79: 0x73C1, - 0xAB7A: 0x73C3, - 0xAB7B: 0x73C4, - 0xAB7C: 0x73C5, - 0xAB7D: 0x73C6, - 0xAB7E: 0x73C7, - 0xAB80: 0x73CB, - 0xAB81: 0x73CC, - 0xAB82: 0x73CE, - 0xAB83: 0x73D2, - 0xAB84: 0x73D3, - 0xAB85: 0x73D4, - 0xAB86: 0x73D5, - 0xAB87: 0x73D6, - 0xAB88: 0x73D7, - 0xAB89: 0x73D8, - 0xAB8A: 0x73DA, - 0xAB8B: 0x73DB, - 0xAB8C: 0x73DC, - 0xAB8D: 0x73DD, - 0xAB8E: 0x73DF, - 0xAB8F: 0x73E1, - 0xAB90: 0x73E2, - 0xAB91: 0x73E3, - 0xAB92: 0x73E4, - 0xAB93: 0x73E6, - 0xAB94: 0x73E8, - 0xAB95: 0x73EA, - 0xAB96: 0x73EB, - 0xAB97: 0x73EC, - 0xAB98: 0x73EE, - 0xAB99: 0x73EF, - 0xAB9A: 0x73F0, - 0xAB9B: 0x73F1, - 0xAB9C: 0x73F3, - 0xAB9D: 0x73F4, - 0xAB9E: 0x73F5, - 0xAB9F: 0x73F6, - 0xABA0: 0x73F7, - 0xABA1: 0xE05E, - 0xABA2: 0xE05F, - 0xABA3: 0xE060, - 0xABA4: 0xE061, - 0xABA5: 0xE062, - 0xABA6: 0xE063, - 0xABA7: 0xE064, - 0xABA8: 0xE065, - 0xABA9: 0xE066, - 0xABAA: 0xE067, - 0xABAB: 0xE068, - 0xABAC: 0xE069, - 0xABAD: 0xE06A, - 0xABAE: 0xE06B, - 0xABAF: 0xE06C, - 0xABB0: 0xE06D, - 0xABB1: 0xE06E, - 0xABB2: 0xE06F, - 0xABB3: 0xE070, - 0xABB4: 0xE071, - 0xABB5: 0xE072, - 0xABB6: 0xE073, - 0xABB7: 0xE074, - 0xABB8: 0xE075, - 0xABB9: 0xE076, - 0xABBA: 0xE077, - 0xABBB: 0xE078, - 0xABBC: 0xE079, - 0xABBD: 0xE07A, - 0xABBE: 0xE07B, - 0xABBF: 0xE07C, - 0xABC0: 0xE07D, - 0xABC1: 0xE07E, - 0xABC2: 0xE07F, - 0xABC3: 0xE080, - 0xABC4: 0xE081, - 0xABC5: 0xE082, - 0xABC6: 0xE083, - 0xABC7: 0xE084, - 0xABC8: 0xE085, - 0xABC9: 0xE086, - 0xABCA: 0xE087, - 0xABCB: 0xE088, - 0xABCC: 0xE089, - 0xABCD: 0xE08A, - 0xABCE: 0xE08B, - 0xABCF: 0xE08C, - 0xABD0: 0xE08D, - 0xABD1: 0xE08E, - 0xABD2: 0xE08F, - 0xABD3: 0xE090, - 0xABD4: 0xE091, - 0xABD5: 0xE092, - 0xABD6: 0xE093, - 0xABD7: 0xE094, - 0xABD8: 0xE095, - 0xABD9: 0xE096, - 0xABDA: 0xE097, - 0xABDB: 0xE098, - 0xABDC: 0xE099, - 0xABDD: 0xE09A, - 0xABDE: 0xE09B, - 0xABDF: 0xE09C, - 0xABE0: 0xE09D, - 0xABE1: 0xE09E, - 0xABE2: 0xE09F, - 0xABE3: 0xE0A0, - 0xABE4: 0xE0A1, - 0xABE5: 0xE0A2, - 0xABE6: 0xE0A3, - 0xABE7: 0xE0A4, - 0xABE8: 0xE0A5, - 0xABE9: 0xE0A6, - 0xABEA: 0xE0A7, - 0xABEB: 0xE0A8, - 0xABEC: 0xE0A9, - 0xABED: 0xE0AA, - 0xABEE: 0xE0AB, - 0xABEF: 0xE0AC, - 0xABF0: 0xE0AD, - 0xABF1: 0xE0AE, - 0xABF2: 0xE0AF, - 0xABF3: 0xE0B0, - 0xABF4: 0xE0B1, - 0xABF5: 0xE0B2, - 0xABF6: 0xE0B3, - 0xABF7: 0xE0B4, - 0xABF8: 0xE0B5, - 0xABF9: 0xE0B6, - 0xABFA: 0xE0B7, - 0xABFB: 0xE0B8, - 0xABFC: 0xE0B9, - 0xABFD: 0xE0BA, - 0xABFE: 0xE0BB, - 0xAC40: 0x73F8, - 0xAC41: 0x73F9, - 0xAC42: 0x73FA, - 0xAC43: 0x73FB, - 0xAC44: 0x73FC, - 0xAC45: 0x73FD, - 0xAC46: 0x73FE, - 0xAC47: 0x73FF, - 0xAC48: 0x7400, - 0xAC49: 0x7401, - 0xAC4A: 0x7402, - 0xAC4B: 0x7404, - 0xAC4C: 0x7407, - 0xAC4D: 0x7408, - 0xAC4E: 0x740B, - 0xAC4F: 0x740C, - 0xAC50: 0x740D, - 0xAC51: 0x740E, - 0xAC52: 0x7411, - 0xAC53: 0x7412, - 0xAC54: 0x7413, - 0xAC55: 0x7414, - 0xAC56: 0x7415, - 0xAC57: 0x7416, - 0xAC58: 0x7417, - 0xAC59: 0x7418, - 0xAC5A: 0x7419, - 0xAC5B: 0x741C, - 0xAC5C: 0x741D, - 0xAC5D: 0x741E, - 0xAC5E: 0x741F, - 0xAC5F: 0x7420, - 0xAC60: 0x7421, - 0xAC61: 0x7423, - 0xAC62: 0x7424, - 0xAC63: 0x7427, - 0xAC64: 0x7429, - 0xAC65: 0x742B, - 0xAC66: 0x742D, - 0xAC67: 0x742F, - 0xAC68: 0x7431, - 0xAC69: 0x7432, - 0xAC6A: 0x7437, - 0xAC6B: 0x7438, - 0xAC6C: 0x7439, - 0xAC6D: 0x743A, - 0xAC6E: 0x743B, - 0xAC6F: 0x743D, - 0xAC70: 0x743E, - 0xAC71: 0x743F, - 0xAC72: 0x7440, - 0xAC73: 0x7442, - 0xAC74: 0x7443, - 0xAC75: 0x7444, - 0xAC76: 0x7445, - 0xAC77: 0x7446, - 0xAC78: 0x7447, - 0xAC79: 0x7448, - 0xAC7A: 0x7449, - 0xAC7B: 0x744A, - 0xAC7C: 0x744B, - 0xAC7D: 0x744C, - 0xAC7E: 0x744D, - 0xAC80: 0x744E, - 0xAC81: 0x744F, - 0xAC82: 0x7450, - 0xAC83: 0x7451, - 0xAC84: 0x7452, - 0xAC85: 0x7453, - 0xAC86: 0x7454, - 0xAC87: 0x7456, - 0xAC88: 0x7458, - 0xAC89: 0x745D, - 0xAC8A: 0x7460, - 0xAC8B: 0x7461, - 0xAC8C: 0x7462, - 0xAC8D: 0x7463, - 0xAC8E: 0x7464, - 0xAC8F: 0x7465, - 0xAC90: 0x7466, - 0xAC91: 0x7467, - 0xAC92: 0x7468, - 0xAC93: 0x7469, - 0xAC94: 0x746A, - 0xAC95: 0x746B, - 0xAC96: 0x746C, - 0xAC97: 0x746E, - 0xAC98: 0x746F, - 0xAC99: 0x7471, - 0xAC9A: 0x7472, - 0xAC9B: 0x7473, - 0xAC9C: 0x7474, - 0xAC9D: 0x7475, - 0xAC9E: 0x7478, - 0xAC9F: 0x7479, - 0xACA0: 0x747A, - 0xACA1: 0xE0BC, - 0xACA2: 0xE0BD, - 0xACA3: 0xE0BE, - 0xACA4: 0xE0BF, - 0xACA5: 0xE0C0, - 0xACA6: 0xE0C1, - 0xACA7: 0xE0C2, - 0xACA8: 0xE0C3, - 0xACA9: 0xE0C4, - 0xACAA: 0xE0C5, - 0xACAB: 0xE0C6, - 0xACAC: 0xE0C7, - 0xACAD: 0xE0C8, - 0xACAE: 0xE0C9, - 0xACAF: 0xE0CA, - 0xACB0: 0xE0CB, - 0xACB1: 0xE0CC, - 0xACB2: 0xE0CD, - 0xACB3: 0xE0CE, - 0xACB4: 0xE0CF, - 0xACB5: 0xE0D0, - 0xACB6: 0xE0D1, - 0xACB7: 0xE0D2, - 0xACB8: 0xE0D3, - 0xACB9: 0xE0D4, - 0xACBA: 0xE0D5, - 0xACBB: 0xE0D6, - 0xACBC: 0xE0D7, - 0xACBD: 0xE0D8, - 0xACBE: 0xE0D9, - 0xACBF: 0xE0DA, - 0xACC0: 0xE0DB, - 0xACC1: 0xE0DC, - 0xACC2: 0xE0DD, - 0xACC3: 0xE0DE, - 0xACC4: 0xE0DF, - 0xACC5: 0xE0E0, - 0xACC6: 0xE0E1, - 0xACC7: 0xE0E2, - 0xACC8: 0xE0E3, - 0xACC9: 0xE0E4, - 0xACCA: 0xE0E5, - 0xACCB: 0xE0E6, - 0xACCC: 0xE0E7, - 0xACCD: 0xE0E8, - 0xACCE: 0xE0E9, - 0xACCF: 0xE0EA, - 0xACD0: 0xE0EB, - 0xACD1: 0xE0EC, - 0xACD2: 0xE0ED, - 0xACD3: 0xE0EE, - 0xACD4: 0xE0EF, - 0xACD5: 0xE0F0, - 0xACD6: 0xE0F1, - 0xACD7: 0xE0F2, - 0xACD8: 0xE0F3, - 0xACD9: 0xE0F4, - 0xACDA: 0xE0F5, - 0xACDB: 0xE0F6, - 0xACDC: 0xE0F7, - 0xACDD: 0xE0F8, - 0xACDE: 0xE0F9, - 0xACDF: 0xE0FA, - 0xACE0: 0xE0FB, - 0xACE1: 0xE0FC, - 0xACE2: 0xE0FD, - 0xACE3: 0xE0FE, - 0xACE4: 0xE0FF, - 0xACE5: 0xE100, - 0xACE6: 0xE101, - 0xACE7: 0xE102, - 0xACE8: 0xE103, - 0xACE9: 0xE104, - 0xACEA: 0xE105, - 0xACEB: 0xE106, - 0xACEC: 0xE107, - 0xACED: 0xE108, - 0xACEE: 0xE109, - 0xACEF: 0xE10A, - 0xACF0: 0xE10B, - 0xACF1: 0xE10C, - 0xACF2: 0xE10D, - 0xACF3: 0xE10E, - 0xACF4: 0xE10F, - 0xACF5: 0xE110, - 0xACF6: 0xE111, - 0xACF7: 0xE112, - 0xACF8: 0xE113, - 0xACF9: 0xE114, - 0xACFA: 0xE115, - 0xACFB: 0xE116, - 0xACFC: 0xE117, - 0xACFD: 0xE118, - 0xACFE: 0xE119, - 0xAD40: 0x747B, - 0xAD41: 0x747C, - 0xAD42: 0x747D, - 0xAD43: 0x747F, - 0xAD44: 0x7482, - 0xAD45: 0x7484, - 0xAD46: 0x7485, - 0xAD47: 0x7486, - 0xAD48: 0x7488, - 0xAD49: 0x7489, - 0xAD4A: 0x748A, - 0xAD4B: 0x748C, - 0xAD4C: 0x748D, - 0xAD4D: 0x748F, - 0xAD4E: 0x7491, - 0xAD4F: 0x7492, - 0xAD50: 0x7493, - 0xAD51: 0x7494, - 0xAD52: 0x7495, - 0xAD53: 0x7496, - 0xAD54: 0x7497, - 0xAD55: 0x7498, - 0xAD56: 0x7499, - 0xAD57: 0x749A, - 0xAD58: 0x749B, - 0xAD59: 0x749D, - 0xAD5A: 0x749F, - 0xAD5B: 0x74A0, - 0xAD5C: 0x74A1, - 0xAD5D: 0x74A2, - 0xAD5E: 0x74A3, - 0xAD5F: 0x74A4, - 0xAD60: 0x74A5, - 0xAD61: 0x74A6, - 0xAD62: 0x74AA, - 0xAD63: 0x74AB, - 0xAD64: 0x74AC, - 0xAD65: 0x74AD, - 0xAD66: 0x74AE, - 0xAD67: 0x74AF, - 0xAD68: 0x74B0, - 0xAD69: 0x74B1, - 0xAD6A: 0x74B2, - 0xAD6B: 0x74B3, - 0xAD6C: 0x74B4, - 0xAD6D: 0x74B5, - 0xAD6E: 0x74B6, - 0xAD6F: 0x74B7, - 0xAD70: 0x74B8, - 0xAD71: 0x74B9, - 0xAD72: 0x74BB, - 0xAD73: 0x74BC, - 0xAD74: 0x74BD, - 0xAD75: 0x74BE, - 0xAD76: 0x74BF, - 0xAD77: 0x74C0, - 0xAD78: 0x74C1, - 0xAD79: 0x74C2, - 0xAD7A: 0x74C3, - 0xAD7B: 0x74C4, - 0xAD7C: 0x74C5, - 0xAD7D: 0x74C6, - 0xAD7E: 0x74C7, - 0xAD80: 0x74C8, - 0xAD81: 0x74C9, - 0xAD82: 0x74CA, - 0xAD83: 0x74CB, - 0xAD84: 0x74CC, - 0xAD85: 0x74CD, - 0xAD86: 0x74CE, - 0xAD87: 0x74CF, - 0xAD88: 0x74D0, - 0xAD89: 0x74D1, - 0xAD8A: 0x74D3, - 0xAD8B: 0x74D4, - 0xAD8C: 0x74D5, - 0xAD8D: 0x74D6, - 0xAD8E: 0x74D7, - 0xAD8F: 0x74D8, - 0xAD90: 0x74D9, - 0xAD91: 0x74DA, - 0xAD92: 0x74DB, - 0xAD93: 0x74DD, - 0xAD94: 0x74DF, - 0xAD95: 0x74E1, - 0xAD96: 0x74E5, - 0xAD97: 0x74E7, - 0xAD98: 0x74E8, - 0xAD99: 0x74E9, - 0xAD9A: 0x74EA, - 0xAD9B: 0x74EB, - 0xAD9C: 0x74EC, - 0xAD9D: 0x74ED, - 0xAD9E: 0x74F0, - 0xAD9F: 0x74F1, - 0xADA0: 0x74F2, - 0xADA1: 0xE11A, - 0xADA2: 0xE11B, - 0xADA3: 0xE11C, - 0xADA4: 0xE11D, - 0xADA5: 0xE11E, - 0xADA6: 0xE11F, - 0xADA7: 0xE120, - 0xADA8: 0xE121, - 0xADA9: 0xE122, - 0xADAA: 0xE123, - 0xADAB: 0xE124, - 0xADAC: 0xE125, - 0xADAD: 0xE126, - 0xADAE: 0xE127, - 0xADAF: 0xE128, - 0xADB0: 0xE129, - 0xADB1: 0xE12A, - 0xADB2: 0xE12B, - 0xADB3: 0xE12C, - 0xADB4: 0xE12D, - 0xADB5: 0xE12E, - 0xADB6: 0xE12F, - 0xADB7: 0xE130, - 0xADB8: 0xE131, - 0xADB9: 0xE132, - 0xADBA: 0xE133, - 0xADBB: 0xE134, - 0xADBC: 0xE135, - 0xADBD: 0xE136, - 0xADBE: 0xE137, - 0xADBF: 0xE138, - 0xADC0: 0xE139, - 0xADC1: 0xE13A, - 0xADC2: 0xE13B, - 0xADC3: 0xE13C, - 0xADC4: 0xE13D, - 0xADC5: 0xE13E, - 0xADC6: 0xE13F, - 0xADC7: 0xE140, - 0xADC8: 0xE141, - 0xADC9: 0xE142, - 0xADCA: 0xE143, - 0xADCB: 0xE144, - 0xADCC: 0xE145, - 0xADCD: 0xE146, - 0xADCE: 0xE147, - 0xADCF: 0xE148, - 0xADD0: 0xE149, - 0xADD1: 0xE14A, - 0xADD2: 0xE14B, - 0xADD3: 0xE14C, - 0xADD4: 0xE14D, - 0xADD5: 0xE14E, - 0xADD6: 0xE14F, - 0xADD7: 0xE150, - 0xADD8: 0xE151, - 0xADD9: 0xE152, - 0xADDA: 0xE153, - 0xADDB: 0xE154, - 0xADDC: 0xE155, - 0xADDD: 0xE156, - 0xADDE: 0xE157, - 0xADDF: 0xE158, - 0xADE0: 0xE159, - 0xADE1: 0xE15A, - 0xADE2: 0xE15B, - 0xADE3: 0xE15C, - 0xADE4: 0xE15D, - 0xADE5: 0xE15E, - 0xADE6: 0xE15F, - 0xADE7: 0xE160, - 0xADE8: 0xE161, - 0xADE9: 0xE162, - 0xADEA: 0xE163, - 0xADEB: 0xE164, - 0xADEC: 0xE165, - 0xADED: 0xE166, - 0xADEE: 0xE167, - 0xADEF: 0xE168, - 0xADF0: 0xE169, - 0xADF1: 0xE16A, - 0xADF2: 0xE16B, - 0xADF3: 0xE16C, - 0xADF4: 0xE16D, - 0xADF5: 0xE16E, - 0xADF6: 0xE16F, - 0xADF7: 0xE170, - 0xADF8: 0xE171, - 0xADF9: 0xE172, - 0xADFA: 0xE173, - 0xADFB: 0xE174, - 0xADFC: 0xE175, - 0xADFD: 0xE176, - 0xADFE: 0xE177, - 0xAE40: 0x74F3, - 0xAE41: 0x74F5, - 0xAE42: 0x74F8, - 0xAE43: 0x74F9, - 0xAE44: 0x74FA, - 0xAE45: 0x74FB, - 0xAE46: 0x74FC, - 0xAE47: 0x74FD, - 0xAE48: 0x74FE, - 0xAE49: 0x7500, - 0xAE4A: 0x7501, - 0xAE4B: 0x7502, - 0xAE4C: 0x7503, - 0xAE4D: 0x7505, - 0xAE4E: 0x7506, - 0xAE4F: 0x7507, - 0xAE50: 0x7508, - 0xAE51: 0x7509, - 0xAE52: 0x750A, - 0xAE53: 0x750B, - 0xAE54: 0x750C, - 0xAE55: 0x750E, - 0xAE56: 0x7510, - 0xAE57: 0x7512, - 0xAE58: 0x7514, - 0xAE59: 0x7515, - 0xAE5A: 0x7516, - 0xAE5B: 0x7517, - 0xAE5C: 0x751B, - 0xAE5D: 0x751D, - 0xAE5E: 0x751E, - 0xAE5F: 0x7520, - 0xAE60: 0x7521, - 0xAE61: 0x7522, - 0xAE62: 0x7523, - 0xAE63: 0x7524, - 0xAE64: 0x7526, - 0xAE65: 0x7527, - 0xAE66: 0x752A, - 0xAE67: 0x752E, - 0xAE68: 0x7534, - 0xAE69: 0x7536, - 0xAE6A: 0x7539, - 0xAE6B: 0x753C, - 0xAE6C: 0x753D, - 0xAE6D: 0x753F, - 0xAE6E: 0x7541, - 0xAE6F: 0x7542, - 0xAE70: 0x7543, - 0xAE71: 0x7544, - 0xAE72: 0x7546, - 0xAE73: 0x7547, - 0xAE74: 0x7549, - 0xAE75: 0x754A, - 0xAE76: 0x754D, - 0xAE77: 0x7550, - 0xAE78: 0x7551, - 0xAE79: 0x7552, - 0xAE7A: 0x7553, - 0xAE7B: 0x7555, - 0xAE7C: 0x7556, - 0xAE7D: 0x7557, - 0xAE7E: 0x7558, - 0xAE80: 0x755D, - 0xAE81: 0x755E, - 0xAE82: 0x755F, - 0xAE83: 0x7560, - 0xAE84: 0x7561, - 0xAE85: 0x7562, - 0xAE86: 0x7563, - 0xAE87: 0x7564, - 0xAE88: 0x7567, - 0xAE89: 0x7568, - 0xAE8A: 0x7569, - 0xAE8B: 0x756B, - 0xAE8C: 0x756C, - 0xAE8D: 0x756D, - 0xAE8E: 0x756E, - 0xAE8F: 0x756F, - 0xAE90: 0x7570, - 0xAE91: 0x7571, - 0xAE92: 0x7573, - 0xAE93: 0x7575, - 0xAE94: 0x7576, - 0xAE95: 0x7577, - 0xAE96: 0x757A, - 0xAE97: 0x757B, - 0xAE98: 0x757C, - 0xAE99: 0x757D, - 0xAE9A: 0x757E, - 0xAE9B: 0x7580, - 0xAE9C: 0x7581, - 0xAE9D: 0x7582, - 0xAE9E: 0x7584, - 0xAE9F: 0x7585, - 0xAEA0: 0x7587, - 0xAEA1: 0xE178, - 0xAEA2: 0xE179, - 0xAEA3: 0xE17A, - 0xAEA4: 0xE17B, - 0xAEA5: 0xE17C, - 0xAEA6: 0xE17D, - 0xAEA7: 0xE17E, - 0xAEA8: 0xE17F, - 0xAEA9: 0xE180, - 0xAEAA: 0xE181, - 0xAEAB: 0xE182, - 0xAEAC: 0xE183, - 0xAEAD: 0xE184, - 0xAEAE: 0xE185, - 0xAEAF: 0xE186, - 0xAEB0: 0xE187, - 0xAEB1: 0xE188, - 0xAEB2: 0xE189, - 0xAEB3: 0xE18A, - 0xAEB4: 0xE18B, - 0xAEB5: 0xE18C, - 0xAEB6: 0xE18D, - 0xAEB7: 0xE18E, - 0xAEB8: 0xE18F, - 0xAEB9: 0xE190, - 0xAEBA: 0xE191, - 0xAEBB: 0xE192, - 0xAEBC: 0xE193, - 0xAEBD: 0xE194, - 0xAEBE: 0xE195, - 0xAEBF: 0xE196, - 0xAEC0: 0xE197, - 0xAEC1: 0xE198, - 0xAEC2: 0xE199, - 0xAEC3: 0xE19A, - 0xAEC4: 0xE19B, - 0xAEC5: 0xE19C, - 0xAEC6: 0xE19D, - 0xAEC7: 0xE19E, - 0xAEC8: 0xE19F, - 0xAEC9: 0xE1A0, - 0xAECA: 0xE1A1, - 0xAECB: 0xE1A2, - 0xAECC: 0xE1A3, - 0xAECD: 0xE1A4, - 0xAECE: 0xE1A5, - 0xAECF: 0xE1A6, - 0xAED0: 0xE1A7, - 0xAED1: 0xE1A8, - 0xAED2: 0xE1A9, - 0xAED3: 0xE1AA, - 0xAED4: 0xE1AB, - 0xAED5: 0xE1AC, - 0xAED6: 0xE1AD, - 0xAED7: 0xE1AE, - 0xAED8: 0xE1AF, - 0xAED9: 0xE1B0, - 0xAEDA: 0xE1B1, - 0xAEDB: 0xE1B2, - 0xAEDC: 0xE1B3, - 0xAEDD: 0xE1B4, - 0xAEDE: 0xE1B5, - 0xAEDF: 0xE1B6, - 0xAEE0: 0xE1B7, - 0xAEE1: 0xE1B8, - 0xAEE2: 0xE1B9, - 0xAEE3: 0xE1BA, - 0xAEE4: 0xE1BB, - 0xAEE5: 0xE1BC, - 0xAEE6: 0xE1BD, - 0xAEE7: 0xE1BE, - 0xAEE8: 0xE1BF, - 0xAEE9: 0xE1C0, - 0xAEEA: 0xE1C1, - 0xAEEB: 0xE1C2, - 0xAEEC: 0xE1C3, - 0xAEED: 0xE1C4, - 0xAEEE: 0xE1C5, - 0xAEEF: 0xE1C6, - 0xAEF0: 0xE1C7, - 0xAEF1: 0xE1C8, - 0xAEF2: 0xE1C9, - 0xAEF3: 0xE1CA, - 0xAEF4: 0xE1CB, - 0xAEF5: 0xE1CC, - 0xAEF6: 0xE1CD, - 0xAEF7: 0xE1CE, - 0xAEF8: 0xE1CF, - 0xAEF9: 0xE1D0, - 0xAEFA: 0xE1D1, - 0xAEFB: 0xE1D2, - 0xAEFC: 0xE1D3, - 0xAEFD: 0xE1D4, - 0xAEFE: 0xE1D5, - 0xAF40: 0x7588, - 0xAF41: 0x7589, - 0xAF42: 0x758A, - 0xAF43: 0x758C, - 0xAF44: 0x758D, - 0xAF45: 0x758E, - 0xAF46: 0x7590, - 0xAF47: 0x7593, - 0xAF48: 0x7595, - 0xAF49: 0x7598, - 0xAF4A: 0x759B, - 0xAF4B: 0x759C, - 0xAF4C: 0x759E, - 0xAF4D: 0x75A2, - 0xAF4E: 0x75A6, - 0xAF4F: 0x75A7, - 0xAF50: 0x75A8, - 0xAF51: 0x75A9, - 0xAF52: 0x75AA, - 0xAF53: 0x75AD, - 0xAF54: 0x75B6, - 0xAF55: 0x75B7, - 0xAF56: 0x75BA, - 0xAF57: 0x75BB, - 0xAF58: 0x75BF, - 0xAF59: 0x75C0, - 0xAF5A: 0x75C1, - 0xAF5B: 0x75C6, - 0xAF5C: 0x75CB, - 0xAF5D: 0x75CC, - 0xAF5E: 0x75CE, - 0xAF5F: 0x75CF, - 0xAF60: 0x75D0, - 0xAF61: 0x75D1, - 0xAF62: 0x75D3, - 0xAF63: 0x75D7, - 0xAF64: 0x75D9, - 0xAF65: 0x75DA, - 0xAF66: 0x75DC, - 0xAF67: 0x75DD, - 0xAF68: 0x75DF, - 0xAF69: 0x75E0, - 0xAF6A: 0x75E1, - 0xAF6B: 0x75E5, - 0xAF6C: 0x75E9, - 0xAF6D: 0x75EC, - 0xAF6E: 0x75ED, - 0xAF6F: 0x75EE, - 0xAF70: 0x75EF, - 0xAF71: 0x75F2, - 0xAF72: 0x75F3, - 0xAF73: 0x75F5, - 0xAF74: 0x75F6, - 0xAF75: 0x75F7, - 0xAF76: 0x75F8, - 0xAF77: 0x75FA, - 0xAF78: 0x75FB, - 0xAF79: 0x75FD, - 0xAF7A: 0x75FE, - 0xAF7B: 0x7602, - 0xAF7C: 0x7604, - 0xAF7D: 0x7606, - 0xAF7E: 0x7607, - 0xAF80: 0x7608, - 0xAF81: 0x7609, - 0xAF82: 0x760B, - 0xAF83: 0x760D, - 0xAF84: 0x760E, - 0xAF85: 0x760F, - 0xAF86: 0x7611, - 0xAF87: 0x7612, - 0xAF88: 0x7613, - 0xAF89: 0x7614, - 0xAF8A: 0x7616, - 0xAF8B: 0x761A, - 0xAF8C: 0x761C, - 0xAF8D: 0x761D, - 0xAF8E: 0x761E, - 0xAF8F: 0x7621, - 0xAF90: 0x7623, - 0xAF91: 0x7627, - 0xAF92: 0x7628, - 0xAF93: 0x762C, - 0xAF94: 0x762E, - 0xAF95: 0x762F, - 0xAF96: 0x7631, - 0xAF97: 0x7632, - 0xAF98: 0x7636, - 0xAF99: 0x7637, - 0xAF9A: 0x7639, - 0xAF9B: 0x763A, - 0xAF9C: 0x763B, - 0xAF9D: 0x763D, - 0xAF9E: 0x7641, - 0xAF9F: 0x7642, - 0xAFA0: 0x7644, - 0xAFA1: 0xE1D6, - 0xAFA2: 0xE1D7, - 0xAFA3: 0xE1D8, - 0xAFA4: 0xE1D9, - 0xAFA5: 0xE1DA, - 0xAFA6: 0xE1DB, - 0xAFA7: 0xE1DC, - 0xAFA8: 0xE1DD, - 0xAFA9: 0xE1DE, - 0xAFAA: 0xE1DF, - 0xAFAB: 0xE1E0, - 0xAFAC: 0xE1E1, - 0xAFAD: 0xE1E2, - 0xAFAE: 0xE1E3, - 0xAFAF: 0xE1E4, - 0xAFB0: 0xE1E5, - 0xAFB1: 0xE1E6, - 0xAFB2: 0xE1E7, - 0xAFB3: 0xE1E8, - 0xAFB4: 0xE1E9, - 0xAFB5: 0xE1EA, - 0xAFB6: 0xE1EB, - 0xAFB7: 0xE1EC, - 0xAFB8: 0xE1ED, - 0xAFB9: 0xE1EE, - 0xAFBA: 0xE1EF, - 0xAFBB: 0xE1F0, - 0xAFBC: 0xE1F1, - 0xAFBD: 0xE1F2, - 0xAFBE: 0xE1F3, - 0xAFBF: 0xE1F4, - 0xAFC0: 0xE1F5, - 0xAFC1: 0xE1F6, - 0xAFC2: 0xE1F7, - 0xAFC3: 0xE1F8, - 0xAFC4: 0xE1F9, - 0xAFC5: 0xE1FA, - 0xAFC6: 0xE1FB, - 0xAFC7: 0xE1FC, - 0xAFC8: 0xE1FD, - 0xAFC9: 0xE1FE, - 0xAFCA: 0xE1FF, - 0xAFCB: 0xE200, - 0xAFCC: 0xE201, - 0xAFCD: 0xE202, - 0xAFCE: 0xE203, - 0xAFCF: 0xE204, - 0xAFD0: 0xE205, - 0xAFD1: 0xE206, - 0xAFD2: 0xE207, - 0xAFD3: 0xE208, - 0xAFD4: 0xE209, - 0xAFD5: 0xE20A, - 0xAFD6: 0xE20B, - 0xAFD7: 0xE20C, - 0xAFD8: 0xE20D, - 0xAFD9: 0xE20E, - 0xAFDA: 0xE20F, - 0xAFDB: 0xE210, - 0xAFDC: 0xE211, - 0xAFDD: 0xE212, - 0xAFDE: 0xE213, - 0xAFDF: 0xE214, - 0xAFE0: 0xE215, - 0xAFE1: 0xE216, - 0xAFE2: 0xE217, - 0xAFE3: 0xE218, - 0xAFE4: 0xE219, - 0xAFE5: 0xE21A, - 0xAFE6: 0xE21B, - 0xAFE7: 0xE21C, - 0xAFE8: 0xE21D, - 0xAFE9: 0xE21E, - 0xAFEA: 0xE21F, - 0xAFEB: 0xE220, - 0xAFEC: 0xE221, - 0xAFED: 0xE222, - 0xAFEE: 0xE223, - 0xAFEF: 0xE224, - 0xAFF0: 0xE225, - 0xAFF1: 0xE226, - 0xAFF2: 0xE227, - 0xAFF3: 0xE228, - 0xAFF4: 0xE229, - 0xAFF5: 0xE22A, - 0xAFF6: 0xE22B, - 0xAFF7: 0xE22C, - 0xAFF8: 0xE22D, - 0xAFF9: 0xE22E, - 0xAFFA: 0xE22F, - 0xAFFB: 0xE230, - 0xAFFC: 0xE231, - 0xAFFD: 0xE232, - 0xAFFE: 0xE233, - 0xB040: 0x7645, - 0xB041: 0x7646, - 0xB042: 0x7647, - 0xB043: 0x7648, - 0xB044: 0x7649, - 0xB045: 0x764A, - 0xB046: 0x764B, - 0xB047: 0x764E, - 0xB048: 0x764F, - 0xB049: 0x7650, - 0xB04A: 0x7651, - 0xB04B: 0x7652, - 0xB04C: 0x7653, - 0xB04D: 0x7655, - 0xB04E: 0x7657, - 0xB04F: 0x7658, - 0xB050: 0x7659, - 0xB051: 0x765A, - 0xB052: 0x765B, - 0xB053: 0x765D, - 0xB054: 0x765F, - 0xB055: 0x7660, - 0xB056: 0x7661, - 0xB057: 0x7662, - 0xB058: 0x7664, - 0xB059: 0x7665, - 0xB05A: 0x7666, - 0xB05B: 0x7667, - 0xB05C: 0x7668, - 0xB05D: 0x7669, - 0xB05E: 0x766A, - 0xB05F: 0x766C, - 0xB060: 0x766D, - 0xB061: 0x766E, - 0xB062: 0x7670, - 0xB063: 0x7671, - 0xB064: 0x7672, - 0xB065: 0x7673, - 0xB066: 0x7674, - 0xB067: 0x7675, - 0xB068: 0x7676, - 0xB069: 0x7677, - 0xB06A: 0x7679, - 0xB06B: 0x767A, - 0xB06C: 0x767C, - 0xB06D: 0x767F, - 0xB06E: 0x7680, - 0xB06F: 0x7681, - 0xB070: 0x7683, - 0xB071: 0x7685, - 0xB072: 0x7689, - 0xB073: 0x768A, - 0xB074: 0x768C, - 0xB075: 0x768D, - 0xB076: 0x768F, - 0xB077: 0x7690, - 0xB078: 0x7692, - 0xB079: 0x7694, - 0xB07A: 0x7695, - 0xB07B: 0x7697, - 0xB07C: 0x7698, - 0xB07D: 0x769A, - 0xB07E: 0x769B, - 0xB080: 0x769C, - 0xB081: 0x769D, - 0xB082: 0x769E, - 0xB083: 0x769F, - 0xB084: 0x76A0, - 0xB085: 0x76A1, - 0xB086: 0x76A2, - 0xB087: 0x76A3, - 0xB088: 0x76A5, - 0xB089: 0x76A6, - 0xB08A: 0x76A7, - 0xB08B: 0x76A8, - 0xB08C: 0x76A9, - 0xB08D: 0x76AA, - 0xB08E: 0x76AB, - 0xB08F: 0x76AC, - 0xB090: 0x76AD, - 0xB091: 0x76AF, - 0xB092: 0x76B0, - 0xB093: 0x76B3, - 0xB094: 0x76B5, - 0xB095: 0x76B6, - 0xB096: 0x76B7, - 0xB097: 0x76B8, - 0xB098: 0x76B9, - 0xB099: 0x76BA, - 0xB09A: 0x76BB, - 0xB09B: 0x76BC, - 0xB09C: 0x76BD, - 0xB09D: 0x76BE, - 0xB09E: 0x76C0, - 0xB09F: 0x76C1, - 0xB0A0: 0x76C3, - 0xB0A1: 0x554A, - 0xB0A2: 0x963F, - 0xB0A3: 0x57C3, - 0xB0A4: 0x6328, - 0xB0A5: 0x54CE, - 0xB0A6: 0x5509, - 0xB0A7: 0x54C0, - 0xB0A8: 0x7691, - 0xB0A9: 0x764C, - 0xB0AA: 0x853C, - 0xB0AB: 0x77EE, - 0xB0AC: 0x827E, - 0xB0AD: 0x788D, - 0xB0AE: 0x7231, - 0xB0AF: 0x9698, - 0xB0B0: 0x978D, - 0xB0B1: 0x6C28, - 0xB0B2: 0x5B89, - 0xB0B3: 0x4FFA, - 0xB0B4: 0x6309, - 0xB0B5: 0x6697, - 0xB0B6: 0x5CB8, - 0xB0B7: 0x80FA, - 0xB0B8: 0x6848, - 0xB0B9: 0x80AE, - 0xB0BA: 0x6602, - 0xB0BB: 0x76CE, - 0xB0BC: 0x51F9, - 0xB0BD: 0x6556, - 0xB0BE: 0x71AC, - 0xB0BF: 0x7FF1, - 0xB0C0: 0x8884, - 0xB0C1: 0x50B2, - 0xB0C2: 0x5965, - 0xB0C3: 0x61CA, - 0xB0C4: 0x6FB3, - 0xB0C5: 0x82AD, - 0xB0C6: 0x634C, - 0xB0C7: 0x6252, - 0xB0C8: 0x53ED, - 0xB0C9: 0x5427, - 0xB0CA: 0x7B06, - 0xB0CB: 0x516B, - 0xB0CC: 0x75A4, - 0xB0CD: 0x5DF4, - 0xB0CE: 0x62D4, - 0xB0CF: 0x8DCB, - 0xB0D0: 0x9776, - 0xB0D1: 0x628A, - 0xB0D2: 0x8019, - 0xB0D3: 0x575D, - 0xB0D4: 0x9738, - 0xB0D5: 0x7F62, - 0xB0D6: 0x7238, - 0xB0D7: 0x767D, - 0xB0D8: 0x67CF, - 0xB0D9: 0x767E, - 0xB0DA: 0x6446, - 0xB0DB: 0x4F70, - 0xB0DC: 0x8D25, - 0xB0DD: 0x62DC, - 0xB0DE: 0x7A17, - 0xB0DF: 0x6591, - 0xB0E0: 0x73ED, - 0xB0E1: 0x642C, - 0xB0E2: 0x6273, - 0xB0E3: 0x822C, - 0xB0E4: 0x9881, - 0xB0E5: 0x677F, - 0xB0E6: 0x7248, - 0xB0E7: 0x626E, - 0xB0E8: 0x62CC, - 0xB0E9: 0x4F34, - 0xB0EA: 0x74E3, - 0xB0EB: 0x534A, - 0xB0EC: 0x529E, - 0xB0ED: 0x7ECA, - 0xB0EE: 0x90A6, - 0xB0EF: 0x5E2E, - 0xB0F0: 0x6886, - 0xB0F1: 0x699C, - 0xB0F2: 0x8180, - 0xB0F3: 0x7ED1, - 0xB0F4: 0x68D2, - 0xB0F5: 0x78C5, - 0xB0F6: 0x868C, - 0xB0F7: 0x9551, - 0xB0F8: 0x508D, - 0xB0F9: 0x8C24, - 0xB0FA: 0x82DE, - 0xB0FB: 0x80DE, - 0xB0FC: 0x5305, - 0xB0FD: 0x8912, - 0xB0FE: 0x5265, - 0xB140: 0x76C4, - 0xB141: 0x76C7, - 0xB142: 0x76C9, - 0xB143: 0x76CB, - 0xB144: 0x76CC, - 0xB145: 0x76D3, - 0xB146: 0x76D5, - 0xB147: 0x76D9, - 0xB148: 0x76DA, - 0xB149: 0x76DC, - 0xB14A: 0x76DD, - 0xB14B: 0x76DE, - 0xB14C: 0x76E0, - 0xB14D: 0x76E1, - 0xB14E: 0x76E2, - 0xB14F: 0x76E3, - 0xB150: 0x76E4, - 0xB151: 0x76E6, - 0xB152: 0x76E7, - 0xB153: 0x76E8, - 0xB154: 0x76E9, - 0xB155: 0x76EA, - 0xB156: 0x76EB, - 0xB157: 0x76EC, - 0xB158: 0x76ED, - 0xB159: 0x76F0, - 0xB15A: 0x76F3, - 0xB15B: 0x76F5, - 0xB15C: 0x76F6, - 0xB15D: 0x76F7, - 0xB15E: 0x76FA, - 0xB15F: 0x76FB, - 0xB160: 0x76FD, - 0xB161: 0x76FF, - 0xB162: 0x7700, - 0xB163: 0x7702, - 0xB164: 0x7703, - 0xB165: 0x7705, - 0xB166: 0x7706, - 0xB167: 0x770A, - 0xB168: 0x770C, - 0xB169: 0x770E, - 0xB16A: 0x770F, - 0xB16B: 0x7710, - 0xB16C: 0x7711, - 0xB16D: 0x7712, - 0xB16E: 0x7713, - 0xB16F: 0x7714, - 0xB170: 0x7715, - 0xB171: 0x7716, - 0xB172: 0x7717, - 0xB173: 0x7718, - 0xB174: 0x771B, - 0xB175: 0x771C, - 0xB176: 0x771D, - 0xB177: 0x771E, - 0xB178: 0x7721, - 0xB179: 0x7723, - 0xB17A: 0x7724, - 0xB17B: 0x7725, - 0xB17C: 0x7727, - 0xB17D: 0x772A, - 0xB17E: 0x772B, - 0xB180: 0x772C, - 0xB181: 0x772E, - 0xB182: 0x7730, - 0xB183: 0x7731, - 0xB184: 0x7732, - 0xB185: 0x7733, - 0xB186: 0x7734, - 0xB187: 0x7739, - 0xB188: 0x773B, - 0xB189: 0x773D, - 0xB18A: 0x773E, - 0xB18B: 0x773F, - 0xB18C: 0x7742, - 0xB18D: 0x7744, - 0xB18E: 0x7745, - 0xB18F: 0x7746, - 0xB190: 0x7748, - 0xB191: 0x7749, - 0xB192: 0x774A, - 0xB193: 0x774B, - 0xB194: 0x774C, - 0xB195: 0x774D, - 0xB196: 0x774E, - 0xB197: 0x774F, - 0xB198: 0x7752, - 0xB199: 0x7753, - 0xB19A: 0x7754, - 0xB19B: 0x7755, - 0xB19C: 0x7756, - 0xB19D: 0x7757, - 0xB19E: 0x7758, - 0xB19F: 0x7759, - 0xB1A0: 0x775C, - 0xB1A1: 0x8584, - 0xB1A2: 0x96F9, - 0xB1A3: 0x4FDD, - 0xB1A4: 0x5821, - 0xB1A5: 0x9971, - 0xB1A6: 0x5B9D, - 0xB1A7: 0x62B1, - 0xB1A8: 0x62A5, - 0xB1A9: 0x66B4, - 0xB1AA: 0x8C79, - 0xB1AB: 0x9C8D, - 0xB1AC: 0x7206, - 0xB1AD: 0x676F, - 0xB1AE: 0x7891, - 0xB1AF: 0x60B2, - 0xB1B0: 0x5351, - 0xB1B1: 0x5317, - 0xB1B2: 0x8F88, - 0xB1B3: 0x80CC, - 0xB1B4: 0x8D1D, - 0xB1B5: 0x94A1, - 0xB1B6: 0x500D, - 0xB1B7: 0x72C8, - 0xB1B8: 0x5907, - 0xB1B9: 0x60EB, - 0xB1BA: 0x7119, - 0xB1BB: 0x88AB, - 0xB1BC: 0x5954, - 0xB1BD: 0x82EF, - 0xB1BE: 0x672C, - 0xB1BF: 0x7B28, - 0xB1C0: 0x5D29, - 0xB1C1: 0x7EF7, - 0xB1C2: 0x752D, - 0xB1C3: 0x6CF5, - 0xB1C4: 0x8E66, - 0xB1C5: 0x8FF8, - 0xB1C6: 0x903C, - 0xB1C7: 0x9F3B, - 0xB1C8: 0x6BD4, - 0xB1C9: 0x9119, - 0xB1CA: 0x7B14, - 0xB1CB: 0x5F7C, - 0xB1CC: 0x78A7, - 0xB1CD: 0x84D6, - 0xB1CE: 0x853D, - 0xB1CF: 0x6BD5, - 0xB1D0: 0x6BD9, - 0xB1D1: 0x6BD6, - 0xB1D2: 0x5E01, - 0xB1D3: 0x5E87, - 0xB1D4: 0x75F9, - 0xB1D5: 0x95ED, - 0xB1D6: 0x655D, - 0xB1D7: 0x5F0A, - 0xB1D8: 0x5FC5, - 0xB1D9: 0x8F9F, - 0xB1DA: 0x58C1, - 0xB1DB: 0x81C2, - 0xB1DC: 0x907F, - 0xB1DD: 0x965B, - 0xB1DE: 0x97AD, - 0xB1DF: 0x8FB9, - 0xB1E0: 0x7F16, - 0xB1E1: 0x8D2C, - 0xB1E2: 0x6241, - 0xB1E3: 0x4FBF, - 0xB1E4: 0x53D8, - 0xB1E5: 0x535E, - 0xB1E6: 0x8FA8, - 0xB1E7: 0x8FA9, - 0xB1E8: 0x8FAB, - 0xB1E9: 0x904D, - 0xB1EA: 0x6807, - 0xB1EB: 0x5F6A, - 0xB1EC: 0x8198, - 0xB1ED: 0x8868, - 0xB1EE: 0x9CD6, - 0xB1EF: 0x618B, - 0xB1F0: 0x522B, - 0xB1F1: 0x762A, - 0xB1F2: 0x5F6C, - 0xB1F3: 0x658C, - 0xB1F4: 0x6FD2, - 0xB1F5: 0x6EE8, - 0xB1F6: 0x5BBE, - 0xB1F7: 0x6448, - 0xB1F8: 0x5175, - 0xB1F9: 0x51B0, - 0xB1FA: 0x67C4, - 0xB1FB: 0x4E19, - 0xB1FC: 0x79C9, - 0xB1FD: 0x997C, - 0xB1FE: 0x70B3, - 0xB240: 0x775D, - 0xB241: 0x775E, - 0xB242: 0x775F, - 0xB243: 0x7760, - 0xB244: 0x7764, - 0xB245: 0x7767, - 0xB246: 0x7769, - 0xB247: 0x776A, - 0xB248: 0x776D, - 0xB249: 0x776E, - 0xB24A: 0x776F, - 0xB24B: 0x7770, - 0xB24C: 0x7771, - 0xB24D: 0x7772, - 0xB24E: 0x7773, - 0xB24F: 0x7774, - 0xB250: 0x7775, - 0xB251: 0x7776, - 0xB252: 0x7777, - 0xB253: 0x7778, - 0xB254: 0x777A, - 0xB255: 0x777B, - 0xB256: 0x777C, - 0xB257: 0x7781, - 0xB258: 0x7782, - 0xB259: 0x7783, - 0xB25A: 0x7786, - 0xB25B: 0x7787, - 0xB25C: 0x7788, - 0xB25D: 0x7789, - 0xB25E: 0x778A, - 0xB25F: 0x778B, - 0xB260: 0x778F, - 0xB261: 0x7790, - 0xB262: 0x7793, - 0xB263: 0x7794, - 0xB264: 0x7795, - 0xB265: 0x7796, - 0xB266: 0x7797, - 0xB267: 0x7798, - 0xB268: 0x7799, - 0xB269: 0x779A, - 0xB26A: 0x779B, - 0xB26B: 0x779C, - 0xB26C: 0x779D, - 0xB26D: 0x779E, - 0xB26E: 0x77A1, - 0xB26F: 0x77A3, - 0xB270: 0x77A4, - 0xB271: 0x77A6, - 0xB272: 0x77A8, - 0xB273: 0x77AB, - 0xB274: 0x77AD, - 0xB275: 0x77AE, - 0xB276: 0x77AF, - 0xB277: 0x77B1, - 0xB278: 0x77B2, - 0xB279: 0x77B4, - 0xB27A: 0x77B6, - 0xB27B: 0x77B7, - 0xB27C: 0x77B8, - 0xB27D: 0x77B9, - 0xB27E: 0x77BA, - 0xB280: 0x77BC, - 0xB281: 0x77BE, - 0xB282: 0x77C0, - 0xB283: 0x77C1, - 0xB284: 0x77C2, - 0xB285: 0x77C3, - 0xB286: 0x77C4, - 0xB287: 0x77C5, - 0xB288: 0x77C6, - 0xB289: 0x77C7, - 0xB28A: 0x77C8, - 0xB28B: 0x77C9, - 0xB28C: 0x77CA, - 0xB28D: 0x77CB, - 0xB28E: 0x77CC, - 0xB28F: 0x77CE, - 0xB290: 0x77CF, - 0xB291: 0x77D0, - 0xB292: 0x77D1, - 0xB293: 0x77D2, - 0xB294: 0x77D3, - 0xB295: 0x77D4, - 0xB296: 0x77D5, - 0xB297: 0x77D6, - 0xB298: 0x77D8, - 0xB299: 0x77D9, - 0xB29A: 0x77DA, - 0xB29B: 0x77DD, - 0xB29C: 0x77DE, - 0xB29D: 0x77DF, - 0xB29E: 0x77E0, - 0xB29F: 0x77E1, - 0xB2A0: 0x77E4, - 0xB2A1: 0x75C5, - 0xB2A2: 0x5E76, - 0xB2A3: 0x73BB, - 0xB2A4: 0x83E0, - 0xB2A5: 0x64AD, - 0xB2A6: 0x62E8, - 0xB2A7: 0x94B5, - 0xB2A8: 0x6CE2, - 0xB2A9: 0x535A, - 0xB2AA: 0x52C3, - 0xB2AB: 0x640F, - 0xB2AC: 0x94C2, - 0xB2AD: 0x7B94, - 0xB2AE: 0x4F2F, - 0xB2AF: 0x5E1B, - 0xB2B0: 0x8236, - 0xB2B1: 0x8116, - 0xB2B2: 0x818A, - 0xB2B3: 0x6E24, - 0xB2B4: 0x6CCA, - 0xB2B5: 0x9A73, - 0xB2B6: 0x6355, - 0xB2B7: 0x535C, - 0xB2B8: 0x54FA, - 0xB2B9: 0x8865, - 0xB2BA: 0x57E0, - 0xB2BB: 0x4E0D, - 0xB2BC: 0x5E03, - 0xB2BD: 0x6B65, - 0xB2BE: 0x7C3F, - 0xB2BF: 0x90E8, - 0xB2C0: 0x6016, - 0xB2C1: 0x64E6, - 0xB2C2: 0x731C, - 0xB2C3: 0x88C1, - 0xB2C4: 0x6750, - 0xB2C5: 0x624D, - 0xB2C6: 0x8D22, - 0xB2C7: 0x776C, - 0xB2C8: 0x8E29, - 0xB2C9: 0x91C7, - 0xB2CA: 0x5F69, - 0xB2CB: 0x83DC, - 0xB2CC: 0x8521, - 0xB2CD: 0x9910, - 0xB2CE: 0x53C2, - 0xB2CF: 0x8695, - 0xB2D0: 0x6B8B, - 0xB2D1: 0x60ED, - 0xB2D2: 0x60E8, - 0xB2D3: 0x707F, - 0xB2D4: 0x82CD, - 0xB2D5: 0x8231, - 0xB2D6: 0x4ED3, - 0xB2D7: 0x6CA7, - 0xB2D8: 0x85CF, - 0xB2D9: 0x64CD, - 0xB2DA: 0x7CD9, - 0xB2DB: 0x69FD, - 0xB2DC: 0x66F9, - 0xB2DD: 0x8349, - 0xB2DE: 0x5395, - 0xB2DF: 0x7B56, - 0xB2E0: 0x4FA7, - 0xB2E1: 0x518C, - 0xB2E2: 0x6D4B, - 0xB2E3: 0x5C42, - 0xB2E4: 0x8E6D, - 0xB2E5: 0x63D2, - 0xB2E6: 0x53C9, - 0xB2E7: 0x832C, - 0xB2E8: 0x8336, - 0xB2E9: 0x67E5, - 0xB2EA: 0x78B4, - 0xB2EB: 0x643D, - 0xB2EC: 0x5BDF, - 0xB2ED: 0x5C94, - 0xB2EE: 0x5DEE, - 0xB2EF: 0x8BE7, - 0xB2F0: 0x62C6, - 0xB2F1: 0x67F4, - 0xB2F2: 0x8C7A, - 0xB2F3: 0x6400, - 0xB2F4: 0x63BA, - 0xB2F5: 0x8749, - 0xB2F6: 0x998B, - 0xB2F7: 0x8C17, - 0xB2F8: 0x7F20, - 0xB2F9: 0x94F2, - 0xB2FA: 0x4EA7, - 0xB2FB: 0x9610, - 0xB2FC: 0x98A4, - 0xB2FD: 0x660C, - 0xB2FE: 0x7316, - 0xB340: 0x77E6, - 0xB341: 0x77E8, - 0xB342: 0x77EA, - 0xB343: 0x77EF, - 0xB344: 0x77F0, - 0xB345: 0x77F1, - 0xB346: 0x77F2, - 0xB347: 0x77F4, - 0xB348: 0x77F5, - 0xB349: 0x77F7, - 0xB34A: 0x77F9, - 0xB34B: 0x77FA, - 0xB34C: 0x77FB, - 0xB34D: 0x77FC, - 0xB34E: 0x7803, - 0xB34F: 0x7804, - 0xB350: 0x7805, - 0xB351: 0x7806, - 0xB352: 0x7807, - 0xB353: 0x7808, - 0xB354: 0x780A, - 0xB355: 0x780B, - 0xB356: 0x780E, - 0xB357: 0x780F, - 0xB358: 0x7810, - 0xB359: 0x7813, - 0xB35A: 0x7815, - 0xB35B: 0x7819, - 0xB35C: 0x781B, - 0xB35D: 0x781E, - 0xB35E: 0x7820, - 0xB35F: 0x7821, - 0xB360: 0x7822, - 0xB361: 0x7824, - 0xB362: 0x7828, - 0xB363: 0x782A, - 0xB364: 0x782B, - 0xB365: 0x782E, - 0xB366: 0x782F, - 0xB367: 0x7831, - 0xB368: 0x7832, - 0xB369: 0x7833, - 0xB36A: 0x7835, - 0xB36B: 0x7836, - 0xB36C: 0x783D, - 0xB36D: 0x783F, - 0xB36E: 0x7841, - 0xB36F: 0x7842, - 0xB370: 0x7843, - 0xB371: 0x7844, - 0xB372: 0x7846, - 0xB373: 0x7848, - 0xB374: 0x7849, - 0xB375: 0x784A, - 0xB376: 0x784B, - 0xB377: 0x784D, - 0xB378: 0x784F, - 0xB379: 0x7851, - 0xB37A: 0x7853, - 0xB37B: 0x7854, - 0xB37C: 0x7858, - 0xB37D: 0x7859, - 0xB37E: 0x785A, - 0xB380: 0x785B, - 0xB381: 0x785C, - 0xB382: 0x785E, - 0xB383: 0x785F, - 0xB384: 0x7860, - 0xB385: 0x7861, - 0xB386: 0x7862, - 0xB387: 0x7863, - 0xB388: 0x7864, - 0xB389: 0x7865, - 0xB38A: 0x7866, - 0xB38B: 0x7867, - 0xB38C: 0x7868, - 0xB38D: 0x7869, - 0xB38E: 0x786F, - 0xB38F: 0x7870, - 0xB390: 0x7871, - 0xB391: 0x7872, - 0xB392: 0x7873, - 0xB393: 0x7874, - 0xB394: 0x7875, - 0xB395: 0x7876, - 0xB396: 0x7878, - 0xB397: 0x7879, - 0xB398: 0x787A, - 0xB399: 0x787B, - 0xB39A: 0x787D, - 0xB39B: 0x787E, - 0xB39C: 0x787F, - 0xB39D: 0x7880, - 0xB39E: 0x7881, - 0xB39F: 0x7882, - 0xB3A0: 0x7883, - 0xB3A1: 0x573A, - 0xB3A2: 0x5C1D, - 0xB3A3: 0x5E38, - 0xB3A4: 0x957F, - 0xB3A5: 0x507F, - 0xB3A6: 0x80A0, - 0xB3A7: 0x5382, - 0xB3A8: 0x655E, - 0xB3A9: 0x7545, - 0xB3AA: 0x5531, - 0xB3AB: 0x5021, - 0xB3AC: 0x8D85, - 0xB3AD: 0x6284, - 0xB3AE: 0x949E, - 0xB3AF: 0x671D, - 0xB3B0: 0x5632, - 0xB3B1: 0x6F6E, - 0xB3B2: 0x5DE2, - 0xB3B3: 0x5435, - 0xB3B4: 0x7092, - 0xB3B5: 0x8F66, - 0xB3B6: 0x626F, - 0xB3B7: 0x64A4, - 0xB3B8: 0x63A3, - 0xB3B9: 0x5F7B, - 0xB3BA: 0x6F88, - 0xB3BB: 0x90F4, - 0xB3BC: 0x81E3, - 0xB3BD: 0x8FB0, - 0xB3BE: 0x5C18, - 0xB3BF: 0x6668, - 0xB3C0: 0x5FF1, - 0xB3C1: 0x6C89, - 0xB3C2: 0x9648, - 0xB3C3: 0x8D81, - 0xB3C4: 0x886C, - 0xB3C5: 0x6491, - 0xB3C6: 0x79F0, - 0xB3C7: 0x57CE, - 0xB3C8: 0x6A59, - 0xB3C9: 0x6210, - 0xB3CA: 0x5448, - 0xB3CB: 0x4E58, - 0xB3CC: 0x7A0B, - 0xB3CD: 0x60E9, - 0xB3CE: 0x6F84, - 0xB3CF: 0x8BDA, - 0xB3D0: 0x627F, - 0xB3D1: 0x901E, - 0xB3D2: 0x9A8B, - 0xB3D3: 0x79E4, - 0xB3D4: 0x5403, - 0xB3D5: 0x75F4, - 0xB3D6: 0x6301, - 0xB3D7: 0x5319, - 0xB3D8: 0x6C60, - 0xB3D9: 0x8FDF, - 0xB3DA: 0x5F1B, - 0xB3DB: 0x9A70, - 0xB3DC: 0x803B, - 0xB3DD: 0x9F7F, - 0xB3DE: 0x4F88, - 0xB3DF: 0x5C3A, - 0xB3E0: 0x8D64, - 0xB3E1: 0x7FC5, - 0xB3E2: 0x65A5, - 0xB3E3: 0x70BD, - 0xB3E4: 0x5145, - 0xB3E5: 0x51B2, - 0xB3E6: 0x866B, - 0xB3E7: 0x5D07, - 0xB3E8: 0x5BA0, - 0xB3E9: 0x62BD, - 0xB3EA: 0x916C, - 0xB3EB: 0x7574, - 0xB3EC: 0x8E0C, - 0xB3ED: 0x7A20, - 0xB3EE: 0x6101, - 0xB3EF: 0x7B79, - 0xB3F0: 0x4EC7, - 0xB3F1: 0x7EF8, - 0xB3F2: 0x7785, - 0xB3F3: 0x4E11, - 0xB3F4: 0x81ED, - 0xB3F5: 0x521D, - 0xB3F6: 0x51FA, - 0xB3F7: 0x6A71, - 0xB3F8: 0x53A8, - 0xB3F9: 0x8E87, - 0xB3FA: 0x9504, - 0xB3FB: 0x96CF, - 0xB3FC: 0x6EC1, - 0xB3FD: 0x9664, - 0xB3FE: 0x695A, - 0xB440: 0x7884, - 0xB441: 0x7885, - 0xB442: 0x7886, - 0xB443: 0x7888, - 0xB444: 0x788A, - 0xB445: 0x788B, - 0xB446: 0x788F, - 0xB447: 0x7890, - 0xB448: 0x7892, - 0xB449: 0x7894, - 0xB44A: 0x7895, - 0xB44B: 0x7896, - 0xB44C: 0x7899, - 0xB44D: 0x789D, - 0xB44E: 0x789E, - 0xB44F: 0x78A0, - 0xB450: 0x78A2, - 0xB451: 0x78A4, - 0xB452: 0x78A6, - 0xB453: 0x78A8, - 0xB454: 0x78A9, - 0xB455: 0x78AA, - 0xB456: 0x78AB, - 0xB457: 0x78AC, - 0xB458: 0x78AD, - 0xB459: 0x78AE, - 0xB45A: 0x78AF, - 0xB45B: 0x78B5, - 0xB45C: 0x78B6, - 0xB45D: 0x78B7, - 0xB45E: 0x78B8, - 0xB45F: 0x78BA, - 0xB460: 0x78BB, - 0xB461: 0x78BC, - 0xB462: 0x78BD, - 0xB463: 0x78BF, - 0xB464: 0x78C0, - 0xB465: 0x78C2, - 0xB466: 0x78C3, - 0xB467: 0x78C4, - 0xB468: 0x78C6, - 0xB469: 0x78C7, - 0xB46A: 0x78C8, - 0xB46B: 0x78CC, - 0xB46C: 0x78CD, - 0xB46D: 0x78CE, - 0xB46E: 0x78CF, - 0xB46F: 0x78D1, - 0xB470: 0x78D2, - 0xB471: 0x78D3, - 0xB472: 0x78D6, - 0xB473: 0x78D7, - 0xB474: 0x78D8, - 0xB475: 0x78DA, - 0xB476: 0x78DB, - 0xB477: 0x78DC, - 0xB478: 0x78DD, - 0xB479: 0x78DE, - 0xB47A: 0x78DF, - 0xB47B: 0x78E0, - 0xB47C: 0x78E1, - 0xB47D: 0x78E2, - 0xB47E: 0x78E3, - 0xB480: 0x78E4, - 0xB481: 0x78E5, - 0xB482: 0x78E6, - 0xB483: 0x78E7, - 0xB484: 0x78E9, - 0xB485: 0x78EA, - 0xB486: 0x78EB, - 0xB487: 0x78ED, - 0xB488: 0x78EE, - 0xB489: 0x78EF, - 0xB48A: 0x78F0, - 0xB48B: 0x78F1, - 0xB48C: 0x78F3, - 0xB48D: 0x78F5, - 0xB48E: 0x78F6, - 0xB48F: 0x78F8, - 0xB490: 0x78F9, - 0xB491: 0x78FB, - 0xB492: 0x78FC, - 0xB493: 0x78FD, - 0xB494: 0x78FE, - 0xB495: 0x78FF, - 0xB496: 0x7900, - 0xB497: 0x7902, - 0xB498: 0x7903, - 0xB499: 0x7904, - 0xB49A: 0x7906, - 0xB49B: 0x7907, - 0xB49C: 0x7908, - 0xB49D: 0x7909, - 0xB49E: 0x790A, - 0xB49F: 0x790B, - 0xB4A0: 0x790C, - 0xB4A1: 0x7840, - 0xB4A2: 0x50A8, - 0xB4A3: 0x77D7, - 0xB4A4: 0x6410, - 0xB4A5: 0x89E6, - 0xB4A6: 0x5904, - 0xB4A7: 0x63E3, - 0xB4A8: 0x5DDD, - 0xB4A9: 0x7A7F, - 0xB4AA: 0x693D, - 0xB4AB: 0x4F20, - 0xB4AC: 0x8239, - 0xB4AD: 0x5598, - 0xB4AE: 0x4E32, - 0xB4AF: 0x75AE, - 0xB4B0: 0x7A97, - 0xB4B1: 0x5E62, - 0xB4B2: 0x5E8A, - 0xB4B3: 0x95EF, - 0xB4B4: 0x521B, - 0xB4B5: 0x5439, - 0xB4B6: 0x708A, - 0xB4B7: 0x6376, - 0xB4B8: 0x9524, - 0xB4B9: 0x5782, - 0xB4BA: 0x6625, - 0xB4BB: 0x693F, - 0xB4BC: 0x9187, - 0xB4BD: 0x5507, - 0xB4BE: 0x6DF3, - 0xB4BF: 0x7EAF, - 0xB4C0: 0x8822, - 0xB4C1: 0x6233, - 0xB4C2: 0x7EF0, - 0xB4C3: 0x75B5, - 0xB4C4: 0x8328, - 0xB4C5: 0x78C1, - 0xB4C6: 0x96CC, - 0xB4C7: 0x8F9E, - 0xB4C8: 0x6148, - 0xB4C9: 0x74F7, - 0xB4CA: 0x8BCD, - 0xB4CB: 0x6B64, - 0xB4CC: 0x523A, - 0xB4CD: 0x8D50, - 0xB4CE: 0x6B21, - 0xB4CF: 0x806A, - 0xB4D0: 0x8471, - 0xB4D1: 0x56F1, - 0xB4D2: 0x5306, - 0xB4D3: 0x4ECE, - 0xB4D4: 0x4E1B, - 0xB4D5: 0x51D1, - 0xB4D6: 0x7C97, - 0xB4D7: 0x918B, - 0xB4D8: 0x7C07, - 0xB4D9: 0x4FC3, - 0xB4DA: 0x8E7F, - 0xB4DB: 0x7BE1, - 0xB4DC: 0x7A9C, - 0xB4DD: 0x6467, - 0xB4DE: 0x5D14, - 0xB4DF: 0x50AC, - 0xB4E0: 0x8106, - 0xB4E1: 0x7601, - 0xB4E2: 0x7CB9, - 0xB4E3: 0x6DEC, - 0xB4E4: 0x7FE0, - 0xB4E5: 0x6751, - 0xB4E6: 0x5B58, - 0xB4E7: 0x5BF8, - 0xB4E8: 0x78CB, - 0xB4E9: 0x64AE, - 0xB4EA: 0x6413, - 0xB4EB: 0x63AA, - 0xB4EC: 0x632B, - 0xB4ED: 0x9519, - 0xB4EE: 0x642D, - 0xB4EF: 0x8FBE, - 0xB4F0: 0x7B54, - 0xB4F1: 0x7629, - 0xB4F2: 0x6253, - 0xB4F3: 0x5927, - 0xB4F4: 0x5446, - 0xB4F5: 0x6B79, - 0xB4F6: 0x50A3, - 0xB4F7: 0x6234, - 0xB4F8: 0x5E26, - 0xB4F9: 0x6B86, - 0xB4FA: 0x4EE3, - 0xB4FB: 0x8D37, - 0xB4FC: 0x888B, - 0xB4FD: 0x5F85, - 0xB4FE: 0x902E, - 0xB540: 0x790D, - 0xB541: 0x790E, - 0xB542: 0x790F, - 0xB543: 0x7910, - 0xB544: 0x7911, - 0xB545: 0x7912, - 0xB546: 0x7914, - 0xB547: 0x7915, - 0xB548: 0x7916, - 0xB549: 0x7917, - 0xB54A: 0x7918, - 0xB54B: 0x7919, - 0xB54C: 0x791A, - 0xB54D: 0x791B, - 0xB54E: 0x791C, - 0xB54F: 0x791D, - 0xB550: 0x791F, - 0xB551: 0x7920, - 0xB552: 0x7921, - 0xB553: 0x7922, - 0xB554: 0x7923, - 0xB555: 0x7925, - 0xB556: 0x7926, - 0xB557: 0x7927, - 0xB558: 0x7928, - 0xB559: 0x7929, - 0xB55A: 0x792A, - 0xB55B: 0x792B, - 0xB55C: 0x792C, - 0xB55D: 0x792D, - 0xB55E: 0x792E, - 0xB55F: 0x792F, - 0xB560: 0x7930, - 0xB561: 0x7931, - 0xB562: 0x7932, - 0xB563: 0x7933, - 0xB564: 0x7935, - 0xB565: 0x7936, - 0xB566: 0x7937, - 0xB567: 0x7938, - 0xB568: 0x7939, - 0xB569: 0x793D, - 0xB56A: 0x793F, - 0xB56B: 0x7942, - 0xB56C: 0x7943, - 0xB56D: 0x7944, - 0xB56E: 0x7945, - 0xB56F: 0x7947, - 0xB570: 0x794A, - 0xB571: 0x794B, - 0xB572: 0x794C, - 0xB573: 0x794D, - 0xB574: 0x794E, - 0xB575: 0x794F, - 0xB576: 0x7950, - 0xB577: 0x7951, - 0xB578: 0x7952, - 0xB579: 0x7954, - 0xB57A: 0x7955, - 0xB57B: 0x7958, - 0xB57C: 0x7959, - 0xB57D: 0x7961, - 0xB57E: 0x7963, - 0xB580: 0x7964, - 0xB581: 0x7966, - 0xB582: 0x7969, - 0xB583: 0x796A, - 0xB584: 0x796B, - 0xB585: 0x796C, - 0xB586: 0x796E, - 0xB587: 0x7970, - 0xB588: 0x7971, - 0xB589: 0x7972, - 0xB58A: 0x7973, - 0xB58B: 0x7974, - 0xB58C: 0x7975, - 0xB58D: 0x7976, - 0xB58E: 0x7979, - 0xB58F: 0x797B, - 0xB590: 0x797C, - 0xB591: 0x797D, - 0xB592: 0x797E, - 0xB593: 0x797F, - 0xB594: 0x7982, - 0xB595: 0x7983, - 0xB596: 0x7986, - 0xB597: 0x7987, - 0xB598: 0x7988, - 0xB599: 0x7989, - 0xB59A: 0x798B, - 0xB59B: 0x798C, - 0xB59C: 0x798D, - 0xB59D: 0x798E, - 0xB59E: 0x7990, - 0xB59F: 0x7991, - 0xB5A0: 0x7992, - 0xB5A1: 0x6020, - 0xB5A2: 0x803D, - 0xB5A3: 0x62C5, - 0xB5A4: 0x4E39, - 0xB5A5: 0x5355, - 0xB5A6: 0x90F8, - 0xB5A7: 0x63B8, - 0xB5A8: 0x80C6, - 0xB5A9: 0x65E6, - 0xB5AA: 0x6C2E, - 0xB5AB: 0x4F46, - 0xB5AC: 0x60EE, - 0xB5AD: 0x6DE1, - 0xB5AE: 0x8BDE, - 0xB5AF: 0x5F39, - 0xB5B0: 0x86CB, - 0xB5B1: 0x5F53, - 0xB5B2: 0x6321, - 0xB5B3: 0x515A, - 0xB5B4: 0x8361, - 0xB5B5: 0x6863, - 0xB5B6: 0x5200, - 0xB5B7: 0x6363, - 0xB5B8: 0x8E48, - 0xB5B9: 0x5012, - 0xB5BA: 0x5C9B, - 0xB5BB: 0x7977, - 0xB5BC: 0x5BFC, - 0xB5BD: 0x5230, - 0xB5BE: 0x7A3B, - 0xB5BF: 0x60BC, - 0xB5C0: 0x9053, - 0xB5C1: 0x76D7, - 0xB5C2: 0x5FB7, - 0xB5C3: 0x5F97, - 0xB5C4: 0x7684, - 0xB5C5: 0x8E6C, - 0xB5C6: 0x706F, - 0xB5C7: 0x767B, - 0xB5C8: 0x7B49, - 0xB5C9: 0x77AA, - 0xB5CA: 0x51F3, - 0xB5CB: 0x9093, - 0xB5CC: 0x5824, - 0xB5CD: 0x4F4E, - 0xB5CE: 0x6EF4, - 0xB5CF: 0x8FEA, - 0xB5D0: 0x654C, - 0xB5D1: 0x7B1B, - 0xB5D2: 0x72C4, - 0xB5D3: 0x6DA4, - 0xB5D4: 0x7FDF, - 0xB5D5: 0x5AE1, - 0xB5D6: 0x62B5, - 0xB5D7: 0x5E95, - 0xB5D8: 0x5730, - 0xB5D9: 0x8482, - 0xB5DA: 0x7B2C, - 0xB5DB: 0x5E1D, - 0xB5DC: 0x5F1F, - 0xB5DD: 0x9012, - 0xB5DE: 0x7F14, - 0xB5DF: 0x98A0, - 0xB5E0: 0x6382, - 0xB5E1: 0x6EC7, - 0xB5E2: 0x7898, - 0xB5E3: 0x70B9, - 0xB5E4: 0x5178, - 0xB5E5: 0x975B, - 0xB5E6: 0x57AB, - 0xB5E7: 0x7535, - 0xB5E8: 0x4F43, - 0xB5E9: 0x7538, - 0xB5EA: 0x5E97, - 0xB5EB: 0x60E6, - 0xB5EC: 0x5960, - 0xB5ED: 0x6DC0, - 0xB5EE: 0x6BBF, - 0xB5EF: 0x7889, - 0xB5F0: 0x53FC, - 0xB5F1: 0x96D5, - 0xB5F2: 0x51CB, - 0xB5F3: 0x5201, - 0xB5F4: 0x6389, - 0xB5F5: 0x540A, - 0xB5F6: 0x9493, - 0xB5F7: 0x8C03, - 0xB5F8: 0x8DCC, - 0xB5F9: 0x7239, - 0xB5FA: 0x789F, - 0xB5FB: 0x8776, - 0xB5FC: 0x8FED, - 0xB5FD: 0x8C0D, - 0xB5FE: 0x53E0, - 0xB640: 0x7993, - 0xB641: 0x7994, - 0xB642: 0x7995, - 0xB643: 0x7996, - 0xB644: 0x7997, - 0xB645: 0x7998, - 0xB646: 0x7999, - 0xB647: 0x799B, - 0xB648: 0x799C, - 0xB649: 0x799D, - 0xB64A: 0x799E, - 0xB64B: 0x799F, - 0xB64C: 0x79A0, - 0xB64D: 0x79A1, - 0xB64E: 0x79A2, - 0xB64F: 0x79A3, - 0xB650: 0x79A4, - 0xB651: 0x79A5, - 0xB652: 0x79A6, - 0xB653: 0x79A8, - 0xB654: 0x79A9, - 0xB655: 0x79AA, - 0xB656: 0x79AB, - 0xB657: 0x79AC, - 0xB658: 0x79AD, - 0xB659: 0x79AE, - 0xB65A: 0x79AF, - 0xB65B: 0x79B0, - 0xB65C: 0x79B1, - 0xB65D: 0x79B2, - 0xB65E: 0x79B4, - 0xB65F: 0x79B5, - 0xB660: 0x79B6, - 0xB661: 0x79B7, - 0xB662: 0x79B8, - 0xB663: 0x79BC, - 0xB664: 0x79BF, - 0xB665: 0x79C2, - 0xB666: 0x79C4, - 0xB667: 0x79C5, - 0xB668: 0x79C7, - 0xB669: 0x79C8, - 0xB66A: 0x79CA, - 0xB66B: 0x79CC, - 0xB66C: 0x79CE, - 0xB66D: 0x79CF, - 0xB66E: 0x79D0, - 0xB66F: 0x79D3, - 0xB670: 0x79D4, - 0xB671: 0x79D6, - 0xB672: 0x79D7, - 0xB673: 0x79D9, - 0xB674: 0x79DA, - 0xB675: 0x79DB, - 0xB676: 0x79DC, - 0xB677: 0x79DD, - 0xB678: 0x79DE, - 0xB679: 0x79E0, - 0xB67A: 0x79E1, - 0xB67B: 0x79E2, - 0xB67C: 0x79E5, - 0xB67D: 0x79E8, - 0xB67E: 0x79EA, - 0xB680: 0x79EC, - 0xB681: 0x79EE, - 0xB682: 0x79F1, - 0xB683: 0x79F2, - 0xB684: 0x79F3, - 0xB685: 0x79F4, - 0xB686: 0x79F5, - 0xB687: 0x79F6, - 0xB688: 0x79F7, - 0xB689: 0x79F9, - 0xB68A: 0x79FA, - 0xB68B: 0x79FC, - 0xB68C: 0x79FE, - 0xB68D: 0x79FF, - 0xB68E: 0x7A01, - 0xB68F: 0x7A04, - 0xB690: 0x7A05, - 0xB691: 0x7A07, - 0xB692: 0x7A08, - 0xB693: 0x7A09, - 0xB694: 0x7A0A, - 0xB695: 0x7A0C, - 0xB696: 0x7A0F, - 0xB697: 0x7A10, - 0xB698: 0x7A11, - 0xB699: 0x7A12, - 0xB69A: 0x7A13, - 0xB69B: 0x7A15, - 0xB69C: 0x7A16, - 0xB69D: 0x7A18, - 0xB69E: 0x7A19, - 0xB69F: 0x7A1B, - 0xB6A0: 0x7A1C, - 0xB6A1: 0x4E01, - 0xB6A2: 0x76EF, - 0xB6A3: 0x53EE, - 0xB6A4: 0x9489, - 0xB6A5: 0x9876, - 0xB6A6: 0x9F0E, - 0xB6A7: 0x952D, - 0xB6A8: 0x5B9A, - 0xB6A9: 0x8BA2, - 0xB6AA: 0x4E22, - 0xB6AB: 0x4E1C, - 0xB6AC: 0x51AC, - 0xB6AD: 0x8463, - 0xB6AE: 0x61C2, - 0xB6AF: 0x52A8, - 0xB6B0: 0x680B, - 0xB6B1: 0x4F97, - 0xB6B2: 0x606B, - 0xB6B3: 0x51BB, - 0xB6B4: 0x6D1E, - 0xB6B5: 0x515C, - 0xB6B6: 0x6296, - 0xB6B7: 0x6597, - 0xB6B8: 0x9661, - 0xB6B9: 0x8C46, - 0xB6BA: 0x9017, - 0xB6BB: 0x75D8, - 0xB6BC: 0x90FD, - 0xB6BD: 0x7763, - 0xB6BE: 0x6BD2, - 0xB6BF: 0x728A, - 0xB6C0: 0x72EC, - 0xB6C1: 0x8BFB, - 0xB6C2: 0x5835, - 0xB6C3: 0x7779, - 0xB6C4: 0x8D4C, - 0xB6C5: 0x675C, - 0xB6C6: 0x9540, - 0xB6C7: 0x809A, - 0xB6C8: 0x5EA6, - 0xB6C9: 0x6E21, - 0xB6CA: 0x5992, - 0xB6CB: 0x7AEF, - 0xB6CC: 0x77ED, - 0xB6CD: 0x953B, - 0xB6CE: 0x6BB5, - 0xB6CF: 0x65AD, - 0xB6D0: 0x7F0E, - 0xB6D1: 0x5806, - 0xB6D2: 0x5151, - 0xB6D3: 0x961F, - 0xB6D4: 0x5BF9, - 0xB6D5: 0x58A9, - 0xB6D6: 0x5428, - 0xB6D7: 0x8E72, - 0xB6D8: 0x6566, - 0xB6D9: 0x987F, - 0xB6DA: 0x56E4, - 0xB6DB: 0x949D, - 0xB6DC: 0x76FE, - 0xB6DD: 0x9041, - 0xB6DE: 0x6387, - 0xB6DF: 0x54C6, - 0xB6E0: 0x591A, - 0xB6E1: 0x593A, - 0xB6E2: 0x579B, - 0xB6E3: 0x8EB2, - 0xB6E4: 0x6735, - 0xB6E5: 0x8DFA, - 0xB6E6: 0x8235, - 0xB6E7: 0x5241, - 0xB6E8: 0x60F0, - 0xB6E9: 0x5815, - 0xB6EA: 0x86FE, - 0xB6EB: 0x5CE8, - 0xB6EC: 0x9E45, - 0xB6ED: 0x4FC4, - 0xB6EE: 0x989D, - 0xB6EF: 0x8BB9, - 0xB6F0: 0x5A25, - 0xB6F1: 0x6076, - 0xB6F2: 0x5384, - 0xB6F3: 0x627C, - 0xB6F4: 0x904F, - 0xB6F5: 0x9102, - 0xB6F6: 0x997F, - 0xB6F7: 0x6069, - 0xB6F8: 0x800C, - 0xB6F9: 0x513F, - 0xB6FA: 0x8033, - 0xB6FB: 0x5C14, - 0xB6FC: 0x9975, - 0xB6FD: 0x6D31, - 0xB6FE: 0x4E8C, - 0xB740: 0x7A1D, - 0xB741: 0x7A1F, - 0xB742: 0x7A21, - 0xB743: 0x7A22, - 0xB744: 0x7A24, - 0xB745: 0x7A25, - 0xB746: 0x7A26, - 0xB747: 0x7A27, - 0xB748: 0x7A28, - 0xB749: 0x7A29, - 0xB74A: 0x7A2A, - 0xB74B: 0x7A2B, - 0xB74C: 0x7A2C, - 0xB74D: 0x7A2D, - 0xB74E: 0x7A2E, - 0xB74F: 0x7A2F, - 0xB750: 0x7A30, - 0xB751: 0x7A31, - 0xB752: 0x7A32, - 0xB753: 0x7A34, - 0xB754: 0x7A35, - 0xB755: 0x7A36, - 0xB756: 0x7A38, - 0xB757: 0x7A3A, - 0xB758: 0x7A3E, - 0xB759: 0x7A40, - 0xB75A: 0x7A41, - 0xB75B: 0x7A42, - 0xB75C: 0x7A43, - 0xB75D: 0x7A44, - 0xB75E: 0x7A45, - 0xB75F: 0x7A47, - 0xB760: 0x7A48, - 0xB761: 0x7A49, - 0xB762: 0x7A4A, - 0xB763: 0x7A4B, - 0xB764: 0x7A4C, - 0xB765: 0x7A4D, - 0xB766: 0x7A4E, - 0xB767: 0x7A4F, - 0xB768: 0x7A50, - 0xB769: 0x7A52, - 0xB76A: 0x7A53, - 0xB76B: 0x7A54, - 0xB76C: 0x7A55, - 0xB76D: 0x7A56, - 0xB76E: 0x7A58, - 0xB76F: 0x7A59, - 0xB770: 0x7A5A, - 0xB771: 0x7A5B, - 0xB772: 0x7A5C, - 0xB773: 0x7A5D, - 0xB774: 0x7A5E, - 0xB775: 0x7A5F, - 0xB776: 0x7A60, - 0xB777: 0x7A61, - 0xB778: 0x7A62, - 0xB779: 0x7A63, - 0xB77A: 0x7A64, - 0xB77B: 0x7A65, - 0xB77C: 0x7A66, - 0xB77D: 0x7A67, - 0xB77E: 0x7A68, - 0xB780: 0x7A69, - 0xB781: 0x7A6A, - 0xB782: 0x7A6B, - 0xB783: 0x7A6C, - 0xB784: 0x7A6D, - 0xB785: 0x7A6E, - 0xB786: 0x7A6F, - 0xB787: 0x7A71, - 0xB788: 0x7A72, - 0xB789: 0x7A73, - 0xB78A: 0x7A75, - 0xB78B: 0x7A7B, - 0xB78C: 0x7A7C, - 0xB78D: 0x7A7D, - 0xB78E: 0x7A7E, - 0xB78F: 0x7A82, - 0xB790: 0x7A85, - 0xB791: 0x7A87, - 0xB792: 0x7A89, - 0xB793: 0x7A8A, - 0xB794: 0x7A8B, - 0xB795: 0x7A8C, - 0xB796: 0x7A8E, - 0xB797: 0x7A8F, - 0xB798: 0x7A90, - 0xB799: 0x7A93, - 0xB79A: 0x7A94, - 0xB79B: 0x7A99, - 0xB79C: 0x7A9A, - 0xB79D: 0x7A9B, - 0xB79E: 0x7A9E, - 0xB79F: 0x7AA1, - 0xB7A0: 0x7AA2, - 0xB7A1: 0x8D30, - 0xB7A2: 0x53D1, - 0xB7A3: 0x7F5A, - 0xB7A4: 0x7B4F, - 0xB7A5: 0x4F10, - 0xB7A6: 0x4E4F, - 0xB7A7: 0x9600, - 0xB7A8: 0x6CD5, - 0xB7A9: 0x73D0, - 0xB7AA: 0x85E9, - 0xB7AB: 0x5E06, - 0xB7AC: 0x756A, - 0xB7AD: 0x7FFB, - 0xB7AE: 0x6A0A, - 0xB7AF: 0x77FE, - 0xB7B0: 0x9492, - 0xB7B1: 0x7E41, - 0xB7B2: 0x51E1, - 0xB7B3: 0x70E6, - 0xB7B4: 0x53CD, - 0xB7B5: 0x8FD4, - 0xB7B6: 0x8303, - 0xB7B7: 0x8D29, - 0xB7B8: 0x72AF, - 0xB7B9: 0x996D, - 0xB7BA: 0x6CDB, - 0xB7BB: 0x574A, - 0xB7BC: 0x82B3, - 0xB7BD: 0x65B9, - 0xB7BE: 0x80AA, - 0xB7BF: 0x623F, - 0xB7C0: 0x9632, - 0xB7C1: 0x59A8, - 0xB7C2: 0x4EFF, - 0xB7C3: 0x8BBF, - 0xB7C4: 0x7EBA, - 0xB7C5: 0x653E, - 0xB7C6: 0x83F2, - 0xB7C7: 0x975E, - 0xB7C8: 0x5561, - 0xB7C9: 0x98DE, - 0xB7CA: 0x80A5, - 0xB7CB: 0x532A, - 0xB7CC: 0x8BFD, - 0xB7CD: 0x5420, - 0xB7CE: 0x80BA, - 0xB7CF: 0x5E9F, - 0xB7D0: 0x6CB8, - 0xB7D1: 0x8D39, - 0xB7D2: 0x82AC, - 0xB7D3: 0x915A, - 0xB7D4: 0x5429, - 0xB7D5: 0x6C1B, - 0xB7D6: 0x5206, - 0xB7D7: 0x7EB7, - 0xB7D8: 0x575F, - 0xB7D9: 0x711A, - 0xB7DA: 0x6C7E, - 0xB7DB: 0x7C89, - 0xB7DC: 0x594B, - 0xB7DD: 0x4EFD, - 0xB7DE: 0x5FFF, - 0xB7DF: 0x6124, - 0xB7E0: 0x7CAA, - 0xB7E1: 0x4E30, - 0xB7E2: 0x5C01, - 0xB7E3: 0x67AB, - 0xB7E4: 0x8702, - 0xB7E5: 0x5CF0, - 0xB7E6: 0x950B, - 0xB7E7: 0x98CE, - 0xB7E8: 0x75AF, - 0xB7E9: 0x70FD, - 0xB7EA: 0x9022, - 0xB7EB: 0x51AF, - 0xB7EC: 0x7F1D, - 0xB7ED: 0x8BBD, - 0xB7EE: 0x5949, - 0xB7EF: 0x51E4, - 0xB7F0: 0x4F5B, - 0xB7F1: 0x5426, - 0xB7F2: 0x592B, - 0xB7F3: 0x6577, - 0xB7F4: 0x80A4, - 0xB7F5: 0x5B75, - 0xB7F6: 0x6276, - 0xB7F7: 0x62C2, - 0xB7F8: 0x8F90, - 0xB7F9: 0x5E45, - 0xB7FA: 0x6C1F, - 0xB7FB: 0x7B26, - 0xB7FC: 0x4F0F, - 0xB7FD: 0x4FD8, - 0xB7FE: 0x670D, - 0xB840: 0x7AA3, - 0xB841: 0x7AA4, - 0xB842: 0x7AA7, - 0xB843: 0x7AA9, - 0xB844: 0x7AAA, - 0xB845: 0x7AAB, - 0xB846: 0x7AAE, - 0xB847: 0x7AAF, - 0xB848: 0x7AB0, - 0xB849: 0x7AB1, - 0xB84A: 0x7AB2, - 0xB84B: 0x7AB4, - 0xB84C: 0x7AB5, - 0xB84D: 0x7AB6, - 0xB84E: 0x7AB7, - 0xB84F: 0x7AB8, - 0xB850: 0x7AB9, - 0xB851: 0x7ABA, - 0xB852: 0x7ABB, - 0xB853: 0x7ABC, - 0xB854: 0x7ABD, - 0xB855: 0x7ABE, - 0xB856: 0x7AC0, - 0xB857: 0x7AC1, - 0xB858: 0x7AC2, - 0xB859: 0x7AC3, - 0xB85A: 0x7AC4, - 0xB85B: 0x7AC5, - 0xB85C: 0x7AC6, - 0xB85D: 0x7AC7, - 0xB85E: 0x7AC8, - 0xB85F: 0x7AC9, - 0xB860: 0x7ACA, - 0xB861: 0x7ACC, - 0xB862: 0x7ACD, - 0xB863: 0x7ACE, - 0xB864: 0x7ACF, - 0xB865: 0x7AD0, - 0xB866: 0x7AD1, - 0xB867: 0x7AD2, - 0xB868: 0x7AD3, - 0xB869: 0x7AD4, - 0xB86A: 0x7AD5, - 0xB86B: 0x7AD7, - 0xB86C: 0x7AD8, - 0xB86D: 0x7ADA, - 0xB86E: 0x7ADB, - 0xB86F: 0x7ADC, - 0xB870: 0x7ADD, - 0xB871: 0x7AE1, - 0xB872: 0x7AE2, - 0xB873: 0x7AE4, - 0xB874: 0x7AE7, - 0xB875: 0x7AE8, - 0xB876: 0x7AE9, - 0xB877: 0x7AEA, - 0xB878: 0x7AEB, - 0xB879: 0x7AEC, - 0xB87A: 0x7AEE, - 0xB87B: 0x7AF0, - 0xB87C: 0x7AF1, - 0xB87D: 0x7AF2, - 0xB87E: 0x7AF3, - 0xB880: 0x7AF4, - 0xB881: 0x7AF5, - 0xB882: 0x7AF6, - 0xB883: 0x7AF7, - 0xB884: 0x7AF8, - 0xB885: 0x7AFB, - 0xB886: 0x7AFC, - 0xB887: 0x7AFE, - 0xB888: 0x7B00, - 0xB889: 0x7B01, - 0xB88A: 0x7B02, - 0xB88B: 0x7B05, - 0xB88C: 0x7B07, - 0xB88D: 0x7B09, - 0xB88E: 0x7B0C, - 0xB88F: 0x7B0D, - 0xB890: 0x7B0E, - 0xB891: 0x7B10, - 0xB892: 0x7B12, - 0xB893: 0x7B13, - 0xB894: 0x7B16, - 0xB895: 0x7B17, - 0xB896: 0x7B18, - 0xB897: 0x7B1A, - 0xB898: 0x7B1C, - 0xB899: 0x7B1D, - 0xB89A: 0x7B1F, - 0xB89B: 0x7B21, - 0xB89C: 0x7B22, - 0xB89D: 0x7B23, - 0xB89E: 0x7B27, - 0xB89F: 0x7B29, - 0xB8A0: 0x7B2D, - 0xB8A1: 0x6D6E, - 0xB8A2: 0x6DAA, - 0xB8A3: 0x798F, - 0xB8A4: 0x88B1, - 0xB8A5: 0x5F17, - 0xB8A6: 0x752B, - 0xB8A7: 0x629A, - 0xB8A8: 0x8F85, - 0xB8A9: 0x4FEF, - 0xB8AA: 0x91DC, - 0xB8AB: 0x65A7, - 0xB8AC: 0x812F, - 0xB8AD: 0x8151, - 0xB8AE: 0x5E9C, - 0xB8AF: 0x8150, - 0xB8B0: 0x8D74, - 0xB8B1: 0x526F, - 0xB8B2: 0x8986, - 0xB8B3: 0x8D4B, - 0xB8B4: 0x590D, - 0xB8B5: 0x5085, - 0xB8B6: 0x4ED8, - 0xB8B7: 0x961C, - 0xB8B8: 0x7236, - 0xB8B9: 0x8179, - 0xB8BA: 0x8D1F, - 0xB8BB: 0x5BCC, - 0xB8BC: 0x8BA3, - 0xB8BD: 0x9644, - 0xB8BE: 0x5987, - 0xB8BF: 0x7F1A, - 0xB8C0: 0x5490, - 0xB8C1: 0x5676, - 0xB8C2: 0x560E, - 0xB8C3: 0x8BE5, - 0xB8C4: 0x6539, - 0xB8C5: 0x6982, - 0xB8C6: 0x9499, - 0xB8C7: 0x76D6, - 0xB8C8: 0x6E89, - 0xB8C9: 0x5E72, - 0xB8CA: 0x7518, - 0xB8CB: 0x6746, - 0xB8CC: 0x67D1, - 0xB8CD: 0x7AFF, - 0xB8CE: 0x809D, - 0xB8CF: 0x8D76, - 0xB8D0: 0x611F, - 0xB8D1: 0x79C6, - 0xB8D2: 0x6562, - 0xB8D3: 0x8D63, - 0xB8D4: 0x5188, - 0xB8D5: 0x521A, - 0xB8D6: 0x94A2, - 0xB8D7: 0x7F38, - 0xB8D8: 0x809B, - 0xB8D9: 0x7EB2, - 0xB8DA: 0x5C97, - 0xB8DB: 0x6E2F, - 0xB8DC: 0x6760, - 0xB8DD: 0x7BD9, - 0xB8DE: 0x768B, - 0xB8DF: 0x9AD8, - 0xB8E0: 0x818F, - 0xB8E1: 0x7F94, - 0xB8E2: 0x7CD5, - 0xB8E3: 0x641E, - 0xB8E4: 0x9550, - 0xB8E5: 0x7A3F, - 0xB8E6: 0x544A, - 0xB8E7: 0x54E5, - 0xB8E8: 0x6B4C, - 0xB8E9: 0x6401, - 0xB8EA: 0x6208, - 0xB8EB: 0x9E3D, - 0xB8EC: 0x80F3, - 0xB8ED: 0x7599, - 0xB8EE: 0x5272, - 0xB8EF: 0x9769, - 0xB8F0: 0x845B, - 0xB8F1: 0x683C, - 0xB8F2: 0x86E4, - 0xB8F3: 0x9601, - 0xB8F4: 0x9694, - 0xB8F5: 0x94EC, - 0xB8F6: 0x4E2A, - 0xB8F7: 0x5404, - 0xB8F8: 0x7ED9, - 0xB8F9: 0x6839, - 0xB8FA: 0x8DDF, - 0xB8FB: 0x8015, - 0xB8FC: 0x66F4, - 0xB8FD: 0x5E9A, - 0xB8FE: 0x7FB9, - 0xB940: 0x7B2F, - 0xB941: 0x7B30, - 0xB942: 0x7B32, - 0xB943: 0x7B34, - 0xB944: 0x7B35, - 0xB945: 0x7B36, - 0xB946: 0x7B37, - 0xB947: 0x7B39, - 0xB948: 0x7B3B, - 0xB949: 0x7B3D, - 0xB94A: 0x7B3F, - 0xB94B: 0x7B40, - 0xB94C: 0x7B41, - 0xB94D: 0x7B42, - 0xB94E: 0x7B43, - 0xB94F: 0x7B44, - 0xB950: 0x7B46, - 0xB951: 0x7B48, - 0xB952: 0x7B4A, - 0xB953: 0x7B4D, - 0xB954: 0x7B4E, - 0xB955: 0x7B53, - 0xB956: 0x7B55, - 0xB957: 0x7B57, - 0xB958: 0x7B59, - 0xB959: 0x7B5C, - 0xB95A: 0x7B5E, - 0xB95B: 0x7B5F, - 0xB95C: 0x7B61, - 0xB95D: 0x7B63, - 0xB95E: 0x7B64, - 0xB95F: 0x7B65, - 0xB960: 0x7B66, - 0xB961: 0x7B67, - 0xB962: 0x7B68, - 0xB963: 0x7B69, - 0xB964: 0x7B6A, - 0xB965: 0x7B6B, - 0xB966: 0x7B6C, - 0xB967: 0x7B6D, - 0xB968: 0x7B6F, - 0xB969: 0x7B70, - 0xB96A: 0x7B73, - 0xB96B: 0x7B74, - 0xB96C: 0x7B76, - 0xB96D: 0x7B78, - 0xB96E: 0x7B7A, - 0xB96F: 0x7B7C, - 0xB970: 0x7B7D, - 0xB971: 0x7B7F, - 0xB972: 0x7B81, - 0xB973: 0x7B82, - 0xB974: 0x7B83, - 0xB975: 0x7B84, - 0xB976: 0x7B86, - 0xB977: 0x7B87, - 0xB978: 0x7B88, - 0xB979: 0x7B89, - 0xB97A: 0x7B8A, - 0xB97B: 0x7B8B, - 0xB97C: 0x7B8C, - 0xB97D: 0x7B8E, - 0xB97E: 0x7B8F, - 0xB980: 0x7B91, - 0xB981: 0x7B92, - 0xB982: 0x7B93, - 0xB983: 0x7B96, - 0xB984: 0x7B98, - 0xB985: 0x7B99, - 0xB986: 0x7B9A, - 0xB987: 0x7B9B, - 0xB988: 0x7B9E, - 0xB989: 0x7B9F, - 0xB98A: 0x7BA0, - 0xB98B: 0x7BA3, - 0xB98C: 0x7BA4, - 0xB98D: 0x7BA5, - 0xB98E: 0x7BAE, - 0xB98F: 0x7BAF, - 0xB990: 0x7BB0, - 0xB991: 0x7BB2, - 0xB992: 0x7BB3, - 0xB993: 0x7BB5, - 0xB994: 0x7BB6, - 0xB995: 0x7BB7, - 0xB996: 0x7BB9, - 0xB997: 0x7BBA, - 0xB998: 0x7BBB, - 0xB999: 0x7BBC, - 0xB99A: 0x7BBD, - 0xB99B: 0x7BBE, - 0xB99C: 0x7BBF, - 0xB99D: 0x7BC0, - 0xB99E: 0x7BC2, - 0xB99F: 0x7BC3, - 0xB9A0: 0x7BC4, - 0xB9A1: 0x57C2, - 0xB9A2: 0x803F, - 0xB9A3: 0x6897, - 0xB9A4: 0x5DE5, - 0xB9A5: 0x653B, - 0xB9A6: 0x529F, - 0xB9A7: 0x606D, - 0xB9A8: 0x9F9A, - 0xB9A9: 0x4F9B, - 0xB9AA: 0x8EAC, - 0xB9AB: 0x516C, - 0xB9AC: 0x5BAB, - 0xB9AD: 0x5F13, - 0xB9AE: 0x5DE9, - 0xB9AF: 0x6C5E, - 0xB9B0: 0x62F1, - 0xB9B1: 0x8D21, - 0xB9B2: 0x5171, - 0xB9B3: 0x94A9, - 0xB9B4: 0x52FE, - 0xB9B5: 0x6C9F, - 0xB9B6: 0x82DF, - 0xB9B7: 0x72D7, - 0xB9B8: 0x57A2, - 0xB9B9: 0x6784, - 0xB9BA: 0x8D2D, - 0xB9BB: 0x591F, - 0xB9BC: 0x8F9C, - 0xB9BD: 0x83C7, - 0xB9BE: 0x5495, - 0xB9BF: 0x7B8D, - 0xB9C0: 0x4F30, - 0xB9C1: 0x6CBD, - 0xB9C2: 0x5B64, - 0xB9C3: 0x59D1, - 0xB9C4: 0x9F13, - 0xB9C5: 0x53E4, - 0xB9C6: 0x86CA, - 0xB9C7: 0x9AA8, - 0xB9C8: 0x8C37, - 0xB9C9: 0x80A1, - 0xB9CA: 0x6545, - 0xB9CB: 0x987E, - 0xB9CC: 0x56FA, - 0xB9CD: 0x96C7, - 0xB9CE: 0x522E, - 0xB9CF: 0x74DC, - 0xB9D0: 0x5250, - 0xB9D1: 0x5BE1, - 0xB9D2: 0x6302, - 0xB9D3: 0x8902, - 0xB9D4: 0x4E56, - 0xB9D5: 0x62D0, - 0xB9D6: 0x602A, - 0xB9D7: 0x68FA, - 0xB9D8: 0x5173, - 0xB9D9: 0x5B98, - 0xB9DA: 0x51A0, - 0xB9DB: 0x89C2, - 0xB9DC: 0x7BA1, - 0xB9DD: 0x9986, - 0xB9DE: 0x7F50, - 0xB9DF: 0x60EF, - 0xB9E0: 0x704C, - 0xB9E1: 0x8D2F, - 0xB9E2: 0x5149, - 0xB9E3: 0x5E7F, - 0xB9E4: 0x901B, - 0xB9E5: 0x7470, - 0xB9E6: 0x89C4, - 0xB9E7: 0x572D, - 0xB9E8: 0x7845, - 0xB9E9: 0x5F52, - 0xB9EA: 0x9F9F, - 0xB9EB: 0x95FA, - 0xB9EC: 0x8F68, - 0xB9ED: 0x9B3C, - 0xB9EE: 0x8BE1, - 0xB9EF: 0x7678, - 0xB9F0: 0x6842, - 0xB9F1: 0x67DC, - 0xB9F2: 0x8DEA, - 0xB9F3: 0x8D35, - 0xB9F4: 0x523D, - 0xB9F5: 0x8F8A, - 0xB9F6: 0x6EDA, - 0xB9F7: 0x68CD, - 0xB9F8: 0x9505, - 0xB9F9: 0x90ED, - 0xB9FA: 0x56FD, - 0xB9FB: 0x679C, - 0xB9FC: 0x88F9, - 0xB9FD: 0x8FC7, - 0xB9FE: 0x54C8, - 0xBA40: 0x7BC5, - 0xBA41: 0x7BC8, - 0xBA42: 0x7BC9, - 0xBA43: 0x7BCA, - 0xBA44: 0x7BCB, - 0xBA45: 0x7BCD, - 0xBA46: 0x7BCE, - 0xBA47: 0x7BCF, - 0xBA48: 0x7BD0, - 0xBA49: 0x7BD2, - 0xBA4A: 0x7BD4, - 0xBA4B: 0x7BD5, - 0xBA4C: 0x7BD6, - 0xBA4D: 0x7BD7, - 0xBA4E: 0x7BD8, - 0xBA4F: 0x7BDB, - 0xBA50: 0x7BDC, - 0xBA51: 0x7BDE, - 0xBA52: 0x7BDF, - 0xBA53: 0x7BE0, - 0xBA54: 0x7BE2, - 0xBA55: 0x7BE3, - 0xBA56: 0x7BE4, - 0xBA57: 0x7BE7, - 0xBA58: 0x7BE8, - 0xBA59: 0x7BE9, - 0xBA5A: 0x7BEB, - 0xBA5B: 0x7BEC, - 0xBA5C: 0x7BED, - 0xBA5D: 0x7BEF, - 0xBA5E: 0x7BF0, - 0xBA5F: 0x7BF2, - 0xBA60: 0x7BF3, - 0xBA61: 0x7BF4, - 0xBA62: 0x7BF5, - 0xBA63: 0x7BF6, - 0xBA64: 0x7BF8, - 0xBA65: 0x7BF9, - 0xBA66: 0x7BFA, - 0xBA67: 0x7BFB, - 0xBA68: 0x7BFD, - 0xBA69: 0x7BFF, - 0xBA6A: 0x7C00, - 0xBA6B: 0x7C01, - 0xBA6C: 0x7C02, - 0xBA6D: 0x7C03, - 0xBA6E: 0x7C04, - 0xBA6F: 0x7C05, - 0xBA70: 0x7C06, - 0xBA71: 0x7C08, - 0xBA72: 0x7C09, - 0xBA73: 0x7C0A, - 0xBA74: 0x7C0D, - 0xBA75: 0x7C0E, - 0xBA76: 0x7C10, - 0xBA77: 0x7C11, - 0xBA78: 0x7C12, - 0xBA79: 0x7C13, - 0xBA7A: 0x7C14, - 0xBA7B: 0x7C15, - 0xBA7C: 0x7C17, - 0xBA7D: 0x7C18, - 0xBA7E: 0x7C19, - 0xBA80: 0x7C1A, - 0xBA81: 0x7C1B, - 0xBA82: 0x7C1C, - 0xBA83: 0x7C1D, - 0xBA84: 0x7C1E, - 0xBA85: 0x7C20, - 0xBA86: 0x7C21, - 0xBA87: 0x7C22, - 0xBA88: 0x7C23, - 0xBA89: 0x7C24, - 0xBA8A: 0x7C25, - 0xBA8B: 0x7C28, - 0xBA8C: 0x7C29, - 0xBA8D: 0x7C2B, - 0xBA8E: 0x7C2C, - 0xBA8F: 0x7C2D, - 0xBA90: 0x7C2E, - 0xBA91: 0x7C2F, - 0xBA92: 0x7C30, - 0xBA93: 0x7C31, - 0xBA94: 0x7C32, - 0xBA95: 0x7C33, - 0xBA96: 0x7C34, - 0xBA97: 0x7C35, - 0xBA98: 0x7C36, - 0xBA99: 0x7C37, - 0xBA9A: 0x7C39, - 0xBA9B: 0x7C3A, - 0xBA9C: 0x7C3B, - 0xBA9D: 0x7C3C, - 0xBA9E: 0x7C3D, - 0xBA9F: 0x7C3E, - 0xBAA0: 0x7C42, - 0xBAA1: 0x9AB8, - 0xBAA2: 0x5B69, - 0xBAA3: 0x6D77, - 0xBAA4: 0x6C26, - 0xBAA5: 0x4EA5, - 0xBAA6: 0x5BB3, - 0xBAA7: 0x9A87, - 0xBAA8: 0x9163, - 0xBAA9: 0x61A8, - 0xBAAA: 0x90AF, - 0xBAAB: 0x97E9, - 0xBAAC: 0x542B, - 0xBAAD: 0x6DB5, - 0xBAAE: 0x5BD2, - 0xBAAF: 0x51FD, - 0xBAB0: 0x558A, - 0xBAB1: 0x7F55, - 0xBAB2: 0x7FF0, - 0xBAB3: 0x64BC, - 0xBAB4: 0x634D, - 0xBAB5: 0x65F1, - 0xBAB6: 0x61BE, - 0xBAB7: 0x608D, - 0xBAB8: 0x710A, - 0xBAB9: 0x6C57, - 0xBABA: 0x6C49, - 0xBABB: 0x592F, - 0xBABC: 0x676D, - 0xBABD: 0x822A, - 0xBABE: 0x58D5, - 0xBABF: 0x568E, - 0xBAC0: 0x8C6A, - 0xBAC1: 0x6BEB, - 0xBAC2: 0x90DD, - 0xBAC3: 0x597D, - 0xBAC4: 0x8017, - 0xBAC5: 0x53F7, - 0xBAC6: 0x6D69, - 0xBAC7: 0x5475, - 0xBAC8: 0x559D, - 0xBAC9: 0x8377, - 0xBACA: 0x83CF, - 0xBACB: 0x6838, - 0xBACC: 0x79BE, - 0xBACD: 0x548C, - 0xBACE: 0x4F55, - 0xBACF: 0x5408, - 0xBAD0: 0x76D2, - 0xBAD1: 0x8C89, - 0xBAD2: 0x9602, - 0xBAD3: 0x6CB3, - 0xBAD4: 0x6DB8, - 0xBAD5: 0x8D6B, - 0xBAD6: 0x8910, - 0xBAD7: 0x9E64, - 0xBAD8: 0x8D3A, - 0xBAD9: 0x563F, - 0xBADA: 0x9ED1, - 0xBADB: 0x75D5, - 0xBADC: 0x5F88, - 0xBADD: 0x72E0, - 0xBADE: 0x6068, - 0xBADF: 0x54FC, - 0xBAE0: 0x4EA8, - 0xBAE1: 0x6A2A, - 0xBAE2: 0x8861, - 0xBAE3: 0x6052, - 0xBAE4: 0x8F70, - 0xBAE5: 0x54C4, - 0xBAE6: 0x70D8, - 0xBAE7: 0x8679, - 0xBAE8: 0x9E3F, - 0xBAE9: 0x6D2A, - 0xBAEA: 0x5B8F, - 0xBAEB: 0x5F18, - 0xBAEC: 0x7EA2, - 0xBAED: 0x5589, - 0xBAEE: 0x4FAF, - 0xBAEF: 0x7334, - 0xBAF0: 0x543C, - 0xBAF1: 0x539A, - 0xBAF2: 0x5019, - 0xBAF3: 0x540E, - 0xBAF4: 0x547C, - 0xBAF5: 0x4E4E, - 0xBAF6: 0x5FFD, - 0xBAF7: 0x745A, - 0xBAF8: 0x58F6, - 0xBAF9: 0x846B, - 0xBAFA: 0x80E1, - 0xBAFB: 0x8774, - 0xBAFC: 0x72D0, - 0xBAFD: 0x7CCA, - 0xBAFE: 0x6E56, - 0xBB40: 0x7C43, - 0xBB41: 0x7C44, - 0xBB42: 0x7C45, - 0xBB43: 0x7C46, - 0xBB44: 0x7C47, - 0xBB45: 0x7C48, - 0xBB46: 0x7C49, - 0xBB47: 0x7C4A, - 0xBB48: 0x7C4B, - 0xBB49: 0x7C4C, - 0xBB4A: 0x7C4E, - 0xBB4B: 0x7C4F, - 0xBB4C: 0x7C50, - 0xBB4D: 0x7C51, - 0xBB4E: 0x7C52, - 0xBB4F: 0x7C53, - 0xBB50: 0x7C54, - 0xBB51: 0x7C55, - 0xBB52: 0x7C56, - 0xBB53: 0x7C57, - 0xBB54: 0x7C58, - 0xBB55: 0x7C59, - 0xBB56: 0x7C5A, - 0xBB57: 0x7C5B, - 0xBB58: 0x7C5C, - 0xBB59: 0x7C5D, - 0xBB5A: 0x7C5E, - 0xBB5B: 0x7C5F, - 0xBB5C: 0x7C60, - 0xBB5D: 0x7C61, - 0xBB5E: 0x7C62, - 0xBB5F: 0x7C63, - 0xBB60: 0x7C64, - 0xBB61: 0x7C65, - 0xBB62: 0x7C66, - 0xBB63: 0x7C67, - 0xBB64: 0x7C68, - 0xBB65: 0x7C69, - 0xBB66: 0x7C6A, - 0xBB67: 0x7C6B, - 0xBB68: 0x7C6C, - 0xBB69: 0x7C6D, - 0xBB6A: 0x7C6E, - 0xBB6B: 0x7C6F, - 0xBB6C: 0x7C70, - 0xBB6D: 0x7C71, - 0xBB6E: 0x7C72, - 0xBB6F: 0x7C75, - 0xBB70: 0x7C76, - 0xBB71: 0x7C77, - 0xBB72: 0x7C78, - 0xBB73: 0x7C79, - 0xBB74: 0x7C7A, - 0xBB75: 0x7C7E, - 0xBB76: 0x7C7F, - 0xBB77: 0x7C80, - 0xBB78: 0x7C81, - 0xBB79: 0x7C82, - 0xBB7A: 0x7C83, - 0xBB7B: 0x7C84, - 0xBB7C: 0x7C85, - 0xBB7D: 0x7C86, - 0xBB7E: 0x7C87, - 0xBB80: 0x7C88, - 0xBB81: 0x7C8A, - 0xBB82: 0x7C8B, - 0xBB83: 0x7C8C, - 0xBB84: 0x7C8D, - 0xBB85: 0x7C8E, - 0xBB86: 0x7C8F, - 0xBB87: 0x7C90, - 0xBB88: 0x7C93, - 0xBB89: 0x7C94, - 0xBB8A: 0x7C96, - 0xBB8B: 0x7C99, - 0xBB8C: 0x7C9A, - 0xBB8D: 0x7C9B, - 0xBB8E: 0x7CA0, - 0xBB8F: 0x7CA1, - 0xBB90: 0x7CA3, - 0xBB91: 0x7CA6, - 0xBB92: 0x7CA7, - 0xBB93: 0x7CA8, - 0xBB94: 0x7CA9, - 0xBB95: 0x7CAB, - 0xBB96: 0x7CAC, - 0xBB97: 0x7CAD, - 0xBB98: 0x7CAF, - 0xBB99: 0x7CB0, - 0xBB9A: 0x7CB4, - 0xBB9B: 0x7CB5, - 0xBB9C: 0x7CB6, - 0xBB9D: 0x7CB7, - 0xBB9E: 0x7CB8, - 0xBB9F: 0x7CBA, - 0xBBA0: 0x7CBB, - 0xBBA1: 0x5F27, - 0xBBA2: 0x864E, - 0xBBA3: 0x552C, - 0xBBA4: 0x62A4, - 0xBBA5: 0x4E92, - 0xBBA6: 0x6CAA, - 0xBBA7: 0x6237, - 0xBBA8: 0x82B1, - 0xBBA9: 0x54D7, - 0xBBAA: 0x534E, - 0xBBAB: 0x733E, - 0xBBAC: 0x6ED1, - 0xBBAD: 0x753B, - 0xBBAE: 0x5212, - 0xBBAF: 0x5316, - 0xBBB0: 0x8BDD, - 0xBBB1: 0x69D0, - 0xBBB2: 0x5F8A, - 0xBBB3: 0x6000, - 0xBBB4: 0x6DEE, - 0xBBB5: 0x574F, - 0xBBB6: 0x6B22, - 0xBBB7: 0x73AF, - 0xBBB8: 0x6853, - 0xBBB9: 0x8FD8, - 0xBBBA: 0x7F13, - 0xBBBB: 0x6362, - 0xBBBC: 0x60A3, - 0xBBBD: 0x5524, - 0xBBBE: 0x75EA, - 0xBBBF: 0x8C62, - 0xBBC0: 0x7115, - 0xBBC1: 0x6DA3, - 0xBBC2: 0x5BA6, - 0xBBC3: 0x5E7B, - 0xBBC4: 0x8352, - 0xBBC5: 0x614C, - 0xBBC6: 0x9EC4, - 0xBBC7: 0x78FA, - 0xBBC8: 0x8757, - 0xBBC9: 0x7C27, - 0xBBCA: 0x7687, - 0xBBCB: 0x51F0, - 0xBBCC: 0x60F6, - 0xBBCD: 0x714C, - 0xBBCE: 0x6643, - 0xBBCF: 0x5E4C, - 0xBBD0: 0x604D, - 0xBBD1: 0x8C0E, - 0xBBD2: 0x7070, - 0xBBD3: 0x6325, - 0xBBD4: 0x8F89, - 0xBBD5: 0x5FBD, - 0xBBD6: 0x6062, - 0xBBD7: 0x86D4, - 0xBBD8: 0x56DE, - 0xBBD9: 0x6BC1, - 0xBBDA: 0x6094, - 0xBBDB: 0x6167, - 0xBBDC: 0x5349, - 0xBBDD: 0x60E0, - 0xBBDE: 0x6666, - 0xBBDF: 0x8D3F, - 0xBBE0: 0x79FD, - 0xBBE1: 0x4F1A, - 0xBBE2: 0x70E9, - 0xBBE3: 0x6C47, - 0xBBE4: 0x8BB3, - 0xBBE5: 0x8BF2, - 0xBBE6: 0x7ED8, - 0xBBE7: 0x8364, - 0xBBE8: 0x660F, - 0xBBE9: 0x5A5A, - 0xBBEA: 0x9B42, - 0xBBEB: 0x6D51, - 0xBBEC: 0x6DF7, - 0xBBED: 0x8C41, - 0xBBEE: 0x6D3B, - 0xBBEF: 0x4F19, - 0xBBF0: 0x706B, - 0xBBF1: 0x83B7, - 0xBBF2: 0x6216, - 0xBBF3: 0x60D1, - 0xBBF4: 0x970D, - 0xBBF5: 0x8D27, - 0xBBF6: 0x7978, - 0xBBF7: 0x51FB, - 0xBBF8: 0x573E, - 0xBBF9: 0x57FA, - 0xBBFA: 0x673A, - 0xBBFB: 0x7578, - 0xBBFC: 0x7A3D, - 0xBBFD: 0x79EF, - 0xBBFE: 0x7B95, - 0xBC40: 0x7CBF, - 0xBC41: 0x7CC0, - 0xBC42: 0x7CC2, - 0xBC43: 0x7CC3, - 0xBC44: 0x7CC4, - 0xBC45: 0x7CC6, - 0xBC46: 0x7CC9, - 0xBC47: 0x7CCB, - 0xBC48: 0x7CCE, - 0xBC49: 0x7CCF, - 0xBC4A: 0x7CD0, - 0xBC4B: 0x7CD1, - 0xBC4C: 0x7CD2, - 0xBC4D: 0x7CD3, - 0xBC4E: 0x7CD4, - 0xBC4F: 0x7CD8, - 0xBC50: 0x7CDA, - 0xBC51: 0x7CDB, - 0xBC52: 0x7CDD, - 0xBC53: 0x7CDE, - 0xBC54: 0x7CE1, - 0xBC55: 0x7CE2, - 0xBC56: 0x7CE3, - 0xBC57: 0x7CE4, - 0xBC58: 0x7CE5, - 0xBC59: 0x7CE6, - 0xBC5A: 0x7CE7, - 0xBC5B: 0x7CE9, - 0xBC5C: 0x7CEA, - 0xBC5D: 0x7CEB, - 0xBC5E: 0x7CEC, - 0xBC5F: 0x7CED, - 0xBC60: 0x7CEE, - 0xBC61: 0x7CF0, - 0xBC62: 0x7CF1, - 0xBC63: 0x7CF2, - 0xBC64: 0x7CF3, - 0xBC65: 0x7CF4, - 0xBC66: 0x7CF5, - 0xBC67: 0x7CF6, - 0xBC68: 0x7CF7, - 0xBC69: 0x7CF9, - 0xBC6A: 0x7CFA, - 0xBC6B: 0x7CFC, - 0xBC6C: 0x7CFD, - 0xBC6D: 0x7CFE, - 0xBC6E: 0x7CFF, - 0xBC6F: 0x7D00, - 0xBC70: 0x7D01, - 0xBC71: 0x7D02, - 0xBC72: 0x7D03, - 0xBC73: 0x7D04, - 0xBC74: 0x7D05, - 0xBC75: 0x7D06, - 0xBC76: 0x7D07, - 0xBC77: 0x7D08, - 0xBC78: 0x7D09, - 0xBC79: 0x7D0B, - 0xBC7A: 0x7D0C, - 0xBC7B: 0x7D0D, - 0xBC7C: 0x7D0E, - 0xBC7D: 0x7D0F, - 0xBC7E: 0x7D10, - 0xBC80: 0x7D11, - 0xBC81: 0x7D12, - 0xBC82: 0x7D13, - 0xBC83: 0x7D14, - 0xBC84: 0x7D15, - 0xBC85: 0x7D16, - 0xBC86: 0x7D17, - 0xBC87: 0x7D18, - 0xBC88: 0x7D19, - 0xBC89: 0x7D1A, - 0xBC8A: 0x7D1B, - 0xBC8B: 0x7D1C, - 0xBC8C: 0x7D1D, - 0xBC8D: 0x7D1E, - 0xBC8E: 0x7D1F, - 0xBC8F: 0x7D21, - 0xBC90: 0x7D23, - 0xBC91: 0x7D24, - 0xBC92: 0x7D25, - 0xBC93: 0x7D26, - 0xBC94: 0x7D28, - 0xBC95: 0x7D29, - 0xBC96: 0x7D2A, - 0xBC97: 0x7D2C, - 0xBC98: 0x7D2D, - 0xBC99: 0x7D2E, - 0xBC9A: 0x7D30, - 0xBC9B: 0x7D31, - 0xBC9C: 0x7D32, - 0xBC9D: 0x7D33, - 0xBC9E: 0x7D34, - 0xBC9F: 0x7D35, - 0xBCA0: 0x7D36, - 0xBCA1: 0x808C, - 0xBCA2: 0x9965, - 0xBCA3: 0x8FF9, - 0xBCA4: 0x6FC0, - 0xBCA5: 0x8BA5, - 0xBCA6: 0x9E21, - 0xBCA7: 0x59EC, - 0xBCA8: 0x7EE9, - 0xBCA9: 0x7F09, - 0xBCAA: 0x5409, - 0xBCAB: 0x6781, - 0xBCAC: 0x68D8, - 0xBCAD: 0x8F91, - 0xBCAE: 0x7C4D, - 0xBCAF: 0x96C6, - 0xBCB0: 0x53CA, - 0xBCB1: 0x6025, - 0xBCB2: 0x75BE, - 0xBCB3: 0x6C72, - 0xBCB4: 0x5373, - 0xBCB5: 0x5AC9, - 0xBCB6: 0x7EA7, - 0xBCB7: 0x6324, - 0xBCB8: 0x51E0, - 0xBCB9: 0x810A, - 0xBCBA: 0x5DF1, - 0xBCBB: 0x84DF, - 0xBCBC: 0x6280, - 0xBCBD: 0x5180, - 0xBCBE: 0x5B63, - 0xBCBF: 0x4F0E, - 0xBCC0: 0x796D, - 0xBCC1: 0x5242, - 0xBCC2: 0x60B8, - 0xBCC3: 0x6D4E, - 0xBCC4: 0x5BC4, - 0xBCC5: 0x5BC2, - 0xBCC6: 0x8BA1, - 0xBCC7: 0x8BB0, - 0xBCC8: 0x65E2, - 0xBCC9: 0x5FCC, - 0xBCCA: 0x9645, - 0xBCCB: 0x5993, - 0xBCCC: 0x7EE7, - 0xBCCD: 0x7EAA, - 0xBCCE: 0x5609, - 0xBCCF: 0x67B7, - 0xBCD0: 0x5939, - 0xBCD1: 0x4F73, - 0xBCD2: 0x5BB6, - 0xBCD3: 0x52A0, - 0xBCD4: 0x835A, - 0xBCD5: 0x988A, - 0xBCD6: 0x8D3E, - 0xBCD7: 0x7532, - 0xBCD8: 0x94BE, - 0xBCD9: 0x5047, - 0xBCDA: 0x7A3C, - 0xBCDB: 0x4EF7, - 0xBCDC: 0x67B6, - 0xBCDD: 0x9A7E, - 0xBCDE: 0x5AC1, - 0xBCDF: 0x6B7C, - 0xBCE0: 0x76D1, - 0xBCE1: 0x575A, - 0xBCE2: 0x5C16, - 0xBCE3: 0x7B3A, - 0xBCE4: 0x95F4, - 0xBCE5: 0x714E, - 0xBCE6: 0x517C, - 0xBCE7: 0x80A9, - 0xBCE8: 0x8270, - 0xBCE9: 0x5978, - 0xBCEA: 0x7F04, - 0xBCEB: 0x8327, - 0xBCEC: 0x68C0, - 0xBCED: 0x67EC, - 0xBCEE: 0x78B1, - 0xBCEF: 0x7877, - 0xBCF0: 0x62E3, - 0xBCF1: 0x6361, - 0xBCF2: 0x7B80, - 0xBCF3: 0x4FED, - 0xBCF4: 0x526A, - 0xBCF5: 0x51CF, - 0xBCF6: 0x8350, - 0xBCF7: 0x69DB, - 0xBCF8: 0x9274, - 0xBCF9: 0x8DF5, - 0xBCFA: 0x8D31, - 0xBCFB: 0x89C1, - 0xBCFC: 0x952E, - 0xBCFD: 0x7BAD, - 0xBCFE: 0x4EF6, - 0xBD40: 0x7D37, - 0xBD41: 0x7D38, - 0xBD42: 0x7D39, - 0xBD43: 0x7D3A, - 0xBD44: 0x7D3B, - 0xBD45: 0x7D3C, - 0xBD46: 0x7D3D, - 0xBD47: 0x7D3E, - 0xBD48: 0x7D3F, - 0xBD49: 0x7D40, - 0xBD4A: 0x7D41, - 0xBD4B: 0x7D42, - 0xBD4C: 0x7D43, - 0xBD4D: 0x7D44, - 0xBD4E: 0x7D45, - 0xBD4F: 0x7D46, - 0xBD50: 0x7D47, - 0xBD51: 0x7D48, - 0xBD52: 0x7D49, - 0xBD53: 0x7D4A, - 0xBD54: 0x7D4B, - 0xBD55: 0x7D4C, - 0xBD56: 0x7D4D, - 0xBD57: 0x7D4E, - 0xBD58: 0x7D4F, - 0xBD59: 0x7D50, - 0xBD5A: 0x7D51, - 0xBD5B: 0x7D52, - 0xBD5C: 0x7D53, - 0xBD5D: 0x7D54, - 0xBD5E: 0x7D55, - 0xBD5F: 0x7D56, - 0xBD60: 0x7D57, - 0xBD61: 0x7D58, - 0xBD62: 0x7D59, - 0xBD63: 0x7D5A, - 0xBD64: 0x7D5B, - 0xBD65: 0x7D5C, - 0xBD66: 0x7D5D, - 0xBD67: 0x7D5E, - 0xBD68: 0x7D5F, - 0xBD69: 0x7D60, - 0xBD6A: 0x7D61, - 0xBD6B: 0x7D62, - 0xBD6C: 0x7D63, - 0xBD6D: 0x7D64, - 0xBD6E: 0x7D65, - 0xBD6F: 0x7D66, - 0xBD70: 0x7D67, - 0xBD71: 0x7D68, - 0xBD72: 0x7D69, - 0xBD73: 0x7D6A, - 0xBD74: 0x7D6B, - 0xBD75: 0x7D6C, - 0xBD76: 0x7D6D, - 0xBD77: 0x7D6F, - 0xBD78: 0x7D70, - 0xBD79: 0x7D71, - 0xBD7A: 0x7D72, - 0xBD7B: 0x7D73, - 0xBD7C: 0x7D74, - 0xBD7D: 0x7D75, - 0xBD7E: 0x7D76, - 0xBD80: 0x7D78, - 0xBD81: 0x7D79, - 0xBD82: 0x7D7A, - 0xBD83: 0x7D7B, - 0xBD84: 0x7D7C, - 0xBD85: 0x7D7D, - 0xBD86: 0x7D7E, - 0xBD87: 0x7D7F, - 0xBD88: 0x7D80, - 0xBD89: 0x7D81, - 0xBD8A: 0x7D82, - 0xBD8B: 0x7D83, - 0xBD8C: 0x7D84, - 0xBD8D: 0x7D85, - 0xBD8E: 0x7D86, - 0xBD8F: 0x7D87, - 0xBD90: 0x7D88, - 0xBD91: 0x7D89, - 0xBD92: 0x7D8A, - 0xBD93: 0x7D8B, - 0xBD94: 0x7D8C, - 0xBD95: 0x7D8D, - 0xBD96: 0x7D8E, - 0xBD97: 0x7D8F, - 0xBD98: 0x7D90, - 0xBD99: 0x7D91, - 0xBD9A: 0x7D92, - 0xBD9B: 0x7D93, - 0xBD9C: 0x7D94, - 0xBD9D: 0x7D95, - 0xBD9E: 0x7D96, - 0xBD9F: 0x7D97, - 0xBDA0: 0x7D98, - 0xBDA1: 0x5065, - 0xBDA2: 0x8230, - 0xBDA3: 0x5251, - 0xBDA4: 0x996F, - 0xBDA5: 0x6E10, - 0xBDA6: 0x6E85, - 0xBDA7: 0x6DA7, - 0xBDA8: 0x5EFA, - 0xBDA9: 0x50F5, - 0xBDAA: 0x59DC, - 0xBDAB: 0x5C06, - 0xBDAC: 0x6D46, - 0xBDAD: 0x6C5F, - 0xBDAE: 0x7586, - 0xBDAF: 0x848B, - 0xBDB0: 0x6868, - 0xBDB1: 0x5956, - 0xBDB2: 0x8BB2, - 0xBDB3: 0x5320, - 0xBDB4: 0x9171, - 0xBDB5: 0x964D, - 0xBDB6: 0x8549, - 0xBDB7: 0x6912, - 0xBDB8: 0x7901, - 0xBDB9: 0x7126, - 0xBDBA: 0x80F6, - 0xBDBB: 0x4EA4, - 0xBDBC: 0x90CA, - 0xBDBD: 0x6D47, - 0xBDBE: 0x9A84, - 0xBDBF: 0x5A07, - 0xBDC0: 0x56BC, - 0xBDC1: 0x6405, - 0xBDC2: 0x94F0, - 0xBDC3: 0x77EB, - 0xBDC4: 0x4FA5, - 0xBDC5: 0x811A, - 0xBDC6: 0x72E1, - 0xBDC7: 0x89D2, - 0xBDC8: 0x997A, - 0xBDC9: 0x7F34, - 0xBDCA: 0x7EDE, - 0xBDCB: 0x527F, - 0xBDCC: 0x6559, - 0xBDCD: 0x9175, - 0xBDCE: 0x8F7F, - 0xBDCF: 0x8F83, - 0xBDD0: 0x53EB, - 0xBDD1: 0x7A96, - 0xBDD2: 0x63ED, - 0xBDD3: 0x63A5, - 0xBDD4: 0x7686, - 0xBDD5: 0x79F8, - 0xBDD6: 0x8857, - 0xBDD7: 0x9636, - 0xBDD8: 0x622A, - 0xBDD9: 0x52AB, - 0xBDDA: 0x8282, - 0xBDDB: 0x6854, - 0xBDDC: 0x6770, - 0xBDDD: 0x6377, - 0xBDDE: 0x776B, - 0xBDDF: 0x7AED, - 0xBDE0: 0x6D01, - 0xBDE1: 0x7ED3, - 0xBDE2: 0x89E3, - 0xBDE3: 0x59D0, - 0xBDE4: 0x6212, - 0xBDE5: 0x85C9, - 0xBDE6: 0x82A5, - 0xBDE7: 0x754C, - 0xBDE8: 0x501F, - 0xBDE9: 0x4ECB, - 0xBDEA: 0x75A5, - 0xBDEB: 0x8BEB, - 0xBDEC: 0x5C4A, - 0xBDED: 0x5DFE, - 0xBDEE: 0x7B4B, - 0xBDEF: 0x65A4, - 0xBDF0: 0x91D1, - 0xBDF1: 0x4ECA, - 0xBDF2: 0x6D25, - 0xBDF3: 0x895F, - 0xBDF4: 0x7D27, - 0xBDF5: 0x9526, - 0xBDF6: 0x4EC5, - 0xBDF7: 0x8C28, - 0xBDF8: 0x8FDB, - 0xBDF9: 0x9773, - 0xBDFA: 0x664B, - 0xBDFB: 0x7981, - 0xBDFC: 0x8FD1, - 0xBDFD: 0x70EC, - 0xBDFE: 0x6D78, - 0xBE40: 0x7D99, - 0xBE41: 0x7D9A, - 0xBE42: 0x7D9B, - 0xBE43: 0x7D9C, - 0xBE44: 0x7D9D, - 0xBE45: 0x7D9E, - 0xBE46: 0x7D9F, - 0xBE47: 0x7DA0, - 0xBE48: 0x7DA1, - 0xBE49: 0x7DA2, - 0xBE4A: 0x7DA3, - 0xBE4B: 0x7DA4, - 0xBE4C: 0x7DA5, - 0xBE4D: 0x7DA7, - 0xBE4E: 0x7DA8, - 0xBE4F: 0x7DA9, - 0xBE50: 0x7DAA, - 0xBE51: 0x7DAB, - 0xBE52: 0x7DAC, - 0xBE53: 0x7DAD, - 0xBE54: 0x7DAF, - 0xBE55: 0x7DB0, - 0xBE56: 0x7DB1, - 0xBE57: 0x7DB2, - 0xBE58: 0x7DB3, - 0xBE59: 0x7DB4, - 0xBE5A: 0x7DB5, - 0xBE5B: 0x7DB6, - 0xBE5C: 0x7DB7, - 0xBE5D: 0x7DB8, - 0xBE5E: 0x7DB9, - 0xBE5F: 0x7DBA, - 0xBE60: 0x7DBB, - 0xBE61: 0x7DBC, - 0xBE62: 0x7DBD, - 0xBE63: 0x7DBE, - 0xBE64: 0x7DBF, - 0xBE65: 0x7DC0, - 0xBE66: 0x7DC1, - 0xBE67: 0x7DC2, - 0xBE68: 0x7DC3, - 0xBE69: 0x7DC4, - 0xBE6A: 0x7DC5, - 0xBE6B: 0x7DC6, - 0xBE6C: 0x7DC7, - 0xBE6D: 0x7DC8, - 0xBE6E: 0x7DC9, - 0xBE6F: 0x7DCA, - 0xBE70: 0x7DCB, - 0xBE71: 0x7DCC, - 0xBE72: 0x7DCD, - 0xBE73: 0x7DCE, - 0xBE74: 0x7DCF, - 0xBE75: 0x7DD0, - 0xBE76: 0x7DD1, - 0xBE77: 0x7DD2, - 0xBE78: 0x7DD3, - 0xBE79: 0x7DD4, - 0xBE7A: 0x7DD5, - 0xBE7B: 0x7DD6, - 0xBE7C: 0x7DD7, - 0xBE7D: 0x7DD8, - 0xBE7E: 0x7DD9, - 0xBE80: 0x7DDA, - 0xBE81: 0x7DDB, - 0xBE82: 0x7DDC, - 0xBE83: 0x7DDD, - 0xBE84: 0x7DDE, - 0xBE85: 0x7DDF, - 0xBE86: 0x7DE0, - 0xBE87: 0x7DE1, - 0xBE88: 0x7DE2, - 0xBE89: 0x7DE3, - 0xBE8A: 0x7DE4, - 0xBE8B: 0x7DE5, - 0xBE8C: 0x7DE6, - 0xBE8D: 0x7DE7, - 0xBE8E: 0x7DE8, - 0xBE8F: 0x7DE9, - 0xBE90: 0x7DEA, - 0xBE91: 0x7DEB, - 0xBE92: 0x7DEC, - 0xBE93: 0x7DED, - 0xBE94: 0x7DEE, - 0xBE95: 0x7DEF, - 0xBE96: 0x7DF0, - 0xBE97: 0x7DF1, - 0xBE98: 0x7DF2, - 0xBE99: 0x7DF3, - 0xBE9A: 0x7DF4, - 0xBE9B: 0x7DF5, - 0xBE9C: 0x7DF6, - 0xBE9D: 0x7DF7, - 0xBE9E: 0x7DF8, - 0xBE9F: 0x7DF9, - 0xBEA0: 0x7DFA, - 0xBEA1: 0x5C3D, - 0xBEA2: 0x52B2, - 0xBEA3: 0x8346, - 0xBEA4: 0x5162, - 0xBEA5: 0x830E, - 0xBEA6: 0x775B, - 0xBEA7: 0x6676, - 0xBEA8: 0x9CB8, - 0xBEA9: 0x4EAC, - 0xBEAA: 0x60CA, - 0xBEAB: 0x7CBE, - 0xBEAC: 0x7CB3, - 0xBEAD: 0x7ECF, - 0xBEAE: 0x4E95, - 0xBEAF: 0x8B66, - 0xBEB0: 0x666F, - 0xBEB1: 0x9888, - 0xBEB2: 0x9759, - 0xBEB3: 0x5883, - 0xBEB4: 0x656C, - 0xBEB5: 0x955C, - 0xBEB6: 0x5F84, - 0xBEB7: 0x75C9, - 0xBEB8: 0x9756, - 0xBEB9: 0x7ADF, - 0xBEBA: 0x7ADE, - 0xBEBB: 0x51C0, - 0xBEBC: 0x70AF, - 0xBEBD: 0x7A98, - 0xBEBE: 0x63EA, - 0xBEBF: 0x7A76, - 0xBEC0: 0x7EA0, - 0xBEC1: 0x7396, - 0xBEC2: 0x97ED, - 0xBEC3: 0x4E45, - 0xBEC4: 0x7078, - 0xBEC5: 0x4E5D, - 0xBEC6: 0x9152, - 0xBEC7: 0x53A9, - 0xBEC8: 0x6551, - 0xBEC9: 0x65E7, - 0xBECA: 0x81FC, - 0xBECB: 0x8205, - 0xBECC: 0x548E, - 0xBECD: 0x5C31, - 0xBECE: 0x759A, - 0xBECF: 0x97A0, - 0xBED0: 0x62D8, - 0xBED1: 0x72D9, - 0xBED2: 0x75BD, - 0xBED3: 0x5C45, - 0xBED4: 0x9A79, - 0xBED5: 0x83CA, - 0xBED6: 0x5C40, - 0xBED7: 0x5480, - 0xBED8: 0x77E9, - 0xBED9: 0x4E3E, - 0xBEDA: 0x6CAE, - 0xBEDB: 0x805A, - 0xBEDC: 0x62D2, - 0xBEDD: 0x636E, - 0xBEDE: 0x5DE8, - 0xBEDF: 0x5177, - 0xBEE0: 0x8DDD, - 0xBEE1: 0x8E1E, - 0xBEE2: 0x952F, - 0xBEE3: 0x4FF1, - 0xBEE4: 0x53E5, - 0xBEE5: 0x60E7, - 0xBEE6: 0x70AC, - 0xBEE7: 0x5267, - 0xBEE8: 0x6350, - 0xBEE9: 0x9E43, - 0xBEEA: 0x5A1F, - 0xBEEB: 0x5026, - 0xBEEC: 0x7737, - 0xBEED: 0x5377, - 0xBEEE: 0x7EE2, - 0xBEEF: 0x6485, - 0xBEF0: 0x652B, - 0xBEF1: 0x6289, - 0xBEF2: 0x6398, - 0xBEF3: 0x5014, - 0xBEF4: 0x7235, - 0xBEF5: 0x89C9, - 0xBEF6: 0x51B3, - 0xBEF7: 0x8BC0, - 0xBEF8: 0x7EDD, - 0xBEF9: 0x5747, - 0xBEFA: 0x83CC, - 0xBEFB: 0x94A7, - 0xBEFC: 0x519B, - 0xBEFD: 0x541B, - 0xBEFE: 0x5CFB, - 0xBF40: 0x7DFB, - 0xBF41: 0x7DFC, - 0xBF42: 0x7DFD, - 0xBF43: 0x7DFE, - 0xBF44: 0x7DFF, - 0xBF45: 0x7E00, - 0xBF46: 0x7E01, - 0xBF47: 0x7E02, - 0xBF48: 0x7E03, - 0xBF49: 0x7E04, - 0xBF4A: 0x7E05, - 0xBF4B: 0x7E06, - 0xBF4C: 0x7E07, - 0xBF4D: 0x7E08, - 0xBF4E: 0x7E09, - 0xBF4F: 0x7E0A, - 0xBF50: 0x7E0B, - 0xBF51: 0x7E0C, - 0xBF52: 0x7E0D, - 0xBF53: 0x7E0E, - 0xBF54: 0x7E0F, - 0xBF55: 0x7E10, - 0xBF56: 0x7E11, - 0xBF57: 0x7E12, - 0xBF58: 0x7E13, - 0xBF59: 0x7E14, - 0xBF5A: 0x7E15, - 0xBF5B: 0x7E16, - 0xBF5C: 0x7E17, - 0xBF5D: 0x7E18, - 0xBF5E: 0x7E19, - 0xBF5F: 0x7E1A, - 0xBF60: 0x7E1B, - 0xBF61: 0x7E1C, - 0xBF62: 0x7E1D, - 0xBF63: 0x7E1E, - 0xBF64: 0x7E1F, - 0xBF65: 0x7E20, - 0xBF66: 0x7E21, - 0xBF67: 0x7E22, - 0xBF68: 0x7E23, - 0xBF69: 0x7E24, - 0xBF6A: 0x7E25, - 0xBF6B: 0x7E26, - 0xBF6C: 0x7E27, - 0xBF6D: 0x7E28, - 0xBF6E: 0x7E29, - 0xBF6F: 0x7E2A, - 0xBF70: 0x7E2B, - 0xBF71: 0x7E2C, - 0xBF72: 0x7E2D, - 0xBF73: 0x7E2E, - 0xBF74: 0x7E2F, - 0xBF75: 0x7E30, - 0xBF76: 0x7E31, - 0xBF77: 0x7E32, - 0xBF78: 0x7E33, - 0xBF79: 0x7E34, - 0xBF7A: 0x7E35, - 0xBF7B: 0x7E36, - 0xBF7C: 0x7E37, - 0xBF7D: 0x7E38, - 0xBF7E: 0x7E39, - 0xBF80: 0x7E3A, - 0xBF81: 0x7E3C, - 0xBF82: 0x7E3D, - 0xBF83: 0x7E3E, - 0xBF84: 0x7E3F, - 0xBF85: 0x7E40, - 0xBF86: 0x7E42, - 0xBF87: 0x7E43, - 0xBF88: 0x7E44, - 0xBF89: 0x7E45, - 0xBF8A: 0x7E46, - 0xBF8B: 0x7E48, - 0xBF8C: 0x7E49, - 0xBF8D: 0x7E4A, - 0xBF8E: 0x7E4B, - 0xBF8F: 0x7E4C, - 0xBF90: 0x7E4D, - 0xBF91: 0x7E4E, - 0xBF92: 0x7E4F, - 0xBF93: 0x7E50, - 0xBF94: 0x7E51, - 0xBF95: 0x7E52, - 0xBF96: 0x7E53, - 0xBF97: 0x7E54, - 0xBF98: 0x7E55, - 0xBF99: 0x7E56, - 0xBF9A: 0x7E57, - 0xBF9B: 0x7E58, - 0xBF9C: 0x7E59, - 0xBF9D: 0x7E5A, - 0xBF9E: 0x7E5B, - 0xBF9F: 0x7E5C, - 0xBFA0: 0x7E5D, - 0xBFA1: 0x4FCA, - 0xBFA2: 0x7AE3, - 0xBFA3: 0x6D5A, - 0xBFA4: 0x90E1, - 0xBFA5: 0x9A8F, - 0xBFA6: 0x5580, - 0xBFA7: 0x5496, - 0xBFA8: 0x5361, - 0xBFA9: 0x54AF, - 0xBFAA: 0x5F00, - 0xBFAB: 0x63E9, - 0xBFAC: 0x6977, - 0xBFAD: 0x51EF, - 0xBFAE: 0x6168, - 0xBFAF: 0x520A, - 0xBFB0: 0x582A, - 0xBFB1: 0x52D8, - 0xBFB2: 0x574E, - 0xBFB3: 0x780D, - 0xBFB4: 0x770B, - 0xBFB5: 0x5EB7, - 0xBFB6: 0x6177, - 0xBFB7: 0x7CE0, - 0xBFB8: 0x625B, - 0xBFB9: 0x6297, - 0xBFBA: 0x4EA2, - 0xBFBB: 0x7095, - 0xBFBC: 0x8003, - 0xBFBD: 0x62F7, - 0xBFBE: 0x70E4, - 0xBFBF: 0x9760, - 0xBFC0: 0x5777, - 0xBFC1: 0x82DB, - 0xBFC2: 0x67EF, - 0xBFC3: 0x68F5, - 0xBFC4: 0x78D5, - 0xBFC5: 0x9897, - 0xBFC6: 0x79D1, - 0xBFC7: 0x58F3, - 0xBFC8: 0x54B3, - 0xBFC9: 0x53EF, - 0xBFCA: 0x6E34, - 0xBFCB: 0x514B, - 0xBFCC: 0x523B, - 0xBFCD: 0x5BA2, - 0xBFCE: 0x8BFE, - 0xBFCF: 0x80AF, - 0xBFD0: 0x5543, - 0xBFD1: 0x57A6, - 0xBFD2: 0x6073, - 0xBFD3: 0x5751, - 0xBFD4: 0x542D, - 0xBFD5: 0x7A7A, - 0xBFD6: 0x6050, - 0xBFD7: 0x5B54, - 0xBFD8: 0x63A7, - 0xBFD9: 0x62A0, - 0xBFDA: 0x53E3, - 0xBFDB: 0x6263, - 0xBFDC: 0x5BC7, - 0xBFDD: 0x67AF, - 0xBFDE: 0x54ED, - 0xBFDF: 0x7A9F, - 0xBFE0: 0x82E6, - 0xBFE1: 0x9177, - 0xBFE2: 0x5E93, - 0xBFE3: 0x88E4, - 0xBFE4: 0x5938, - 0xBFE5: 0x57AE, - 0xBFE6: 0x630E, - 0xBFE7: 0x8DE8, - 0xBFE8: 0x80EF, - 0xBFE9: 0x5757, - 0xBFEA: 0x7B77, - 0xBFEB: 0x4FA9, - 0xBFEC: 0x5FEB, - 0xBFED: 0x5BBD, - 0xBFEE: 0x6B3E, - 0xBFEF: 0x5321, - 0xBFF0: 0x7B50, - 0xBFF1: 0x72C2, - 0xBFF2: 0x6846, - 0xBFF3: 0x77FF, - 0xBFF4: 0x7736, - 0xBFF5: 0x65F7, - 0xBFF6: 0x51B5, - 0xBFF7: 0x4E8F, - 0xBFF8: 0x76D4, - 0xBFF9: 0x5CBF, - 0xBFFA: 0x7AA5, - 0xBFFB: 0x8475, - 0xBFFC: 0x594E, - 0xBFFD: 0x9B41, - 0xBFFE: 0x5080, - 0xC040: 0x7E5E, - 0xC041: 0x7E5F, - 0xC042: 0x7E60, - 0xC043: 0x7E61, - 0xC044: 0x7E62, - 0xC045: 0x7E63, - 0xC046: 0x7E64, - 0xC047: 0x7E65, - 0xC048: 0x7E66, - 0xC049: 0x7E67, - 0xC04A: 0x7E68, - 0xC04B: 0x7E69, - 0xC04C: 0x7E6A, - 0xC04D: 0x7E6B, - 0xC04E: 0x7E6C, - 0xC04F: 0x7E6D, - 0xC050: 0x7E6E, - 0xC051: 0x7E6F, - 0xC052: 0x7E70, - 0xC053: 0x7E71, - 0xC054: 0x7E72, - 0xC055: 0x7E73, - 0xC056: 0x7E74, - 0xC057: 0x7E75, - 0xC058: 0x7E76, - 0xC059: 0x7E77, - 0xC05A: 0x7E78, - 0xC05B: 0x7E79, - 0xC05C: 0x7E7A, - 0xC05D: 0x7E7B, - 0xC05E: 0x7E7C, - 0xC05F: 0x7E7D, - 0xC060: 0x7E7E, - 0xC061: 0x7E7F, - 0xC062: 0x7E80, - 0xC063: 0x7E81, - 0xC064: 0x7E83, - 0xC065: 0x7E84, - 0xC066: 0x7E85, - 0xC067: 0x7E86, - 0xC068: 0x7E87, - 0xC069: 0x7E88, - 0xC06A: 0x7E89, - 0xC06B: 0x7E8A, - 0xC06C: 0x7E8B, - 0xC06D: 0x7E8C, - 0xC06E: 0x7E8D, - 0xC06F: 0x7E8E, - 0xC070: 0x7E8F, - 0xC071: 0x7E90, - 0xC072: 0x7E91, - 0xC073: 0x7E92, - 0xC074: 0x7E93, - 0xC075: 0x7E94, - 0xC076: 0x7E95, - 0xC077: 0x7E96, - 0xC078: 0x7E97, - 0xC079: 0x7E98, - 0xC07A: 0x7E99, - 0xC07B: 0x7E9A, - 0xC07C: 0x7E9C, - 0xC07D: 0x7E9D, - 0xC07E: 0x7E9E, - 0xC080: 0x7EAE, - 0xC081: 0x7EB4, - 0xC082: 0x7EBB, - 0xC083: 0x7EBC, - 0xC084: 0x7ED6, - 0xC085: 0x7EE4, - 0xC086: 0x7EEC, - 0xC087: 0x7EF9, - 0xC088: 0x7F0A, - 0xC089: 0x7F10, - 0xC08A: 0x7F1E, - 0xC08B: 0x7F37, - 0xC08C: 0x7F39, - 0xC08D: 0x7F3B, - 0xC08E: 0x7F3C, - 0xC08F: 0x7F3D, - 0xC090: 0x7F3E, - 0xC091: 0x7F3F, - 0xC092: 0x7F40, - 0xC093: 0x7F41, - 0xC094: 0x7F43, - 0xC095: 0x7F46, - 0xC096: 0x7F47, - 0xC097: 0x7F48, - 0xC098: 0x7F49, - 0xC099: 0x7F4A, - 0xC09A: 0x7F4B, - 0xC09B: 0x7F4C, - 0xC09C: 0x7F4D, - 0xC09D: 0x7F4E, - 0xC09E: 0x7F4F, - 0xC09F: 0x7F52, - 0xC0A0: 0x7F53, - 0xC0A1: 0x9988, - 0xC0A2: 0x6127, - 0xC0A3: 0x6E83, - 0xC0A4: 0x5764, - 0xC0A5: 0x6606, - 0xC0A6: 0x6346, - 0xC0A7: 0x56F0, - 0xC0A8: 0x62EC, - 0xC0A9: 0x6269, - 0xC0AA: 0x5ED3, - 0xC0AB: 0x9614, - 0xC0AC: 0x5783, - 0xC0AD: 0x62C9, - 0xC0AE: 0x5587, - 0xC0AF: 0x8721, - 0xC0B0: 0x814A, - 0xC0B1: 0x8FA3, - 0xC0B2: 0x5566, - 0xC0B3: 0x83B1, - 0xC0B4: 0x6765, - 0xC0B5: 0x8D56, - 0xC0B6: 0x84DD, - 0xC0B7: 0x5A6A, - 0xC0B8: 0x680F, - 0xC0B9: 0x62E6, - 0xC0BA: 0x7BEE, - 0xC0BB: 0x9611, - 0xC0BC: 0x5170, - 0xC0BD: 0x6F9C, - 0xC0BE: 0x8C30, - 0xC0BF: 0x63FD, - 0xC0C0: 0x89C8, - 0xC0C1: 0x61D2, - 0xC0C2: 0x7F06, - 0xC0C3: 0x70C2, - 0xC0C4: 0x6EE5, - 0xC0C5: 0x7405, - 0xC0C6: 0x6994, - 0xC0C7: 0x72FC, - 0xC0C8: 0x5ECA, - 0xC0C9: 0x90CE, - 0xC0CA: 0x6717, - 0xC0CB: 0x6D6A, - 0xC0CC: 0x635E, - 0xC0CD: 0x52B3, - 0xC0CE: 0x7262, - 0xC0CF: 0x8001, - 0xC0D0: 0x4F6C, - 0xC0D1: 0x59E5, - 0xC0D2: 0x916A, - 0xC0D3: 0x70D9, - 0xC0D4: 0x6D9D, - 0xC0D5: 0x52D2, - 0xC0D6: 0x4E50, - 0xC0D7: 0x96F7, - 0xC0D8: 0x956D, - 0xC0D9: 0x857E, - 0xC0DA: 0x78CA, - 0xC0DB: 0x7D2F, - 0xC0DC: 0x5121, - 0xC0DD: 0x5792, - 0xC0DE: 0x64C2, - 0xC0DF: 0x808B, - 0xC0E0: 0x7C7B, - 0xC0E1: 0x6CEA, - 0xC0E2: 0x68F1, - 0xC0E3: 0x695E, - 0xC0E4: 0x51B7, - 0xC0E5: 0x5398, - 0xC0E6: 0x68A8, - 0xC0E7: 0x7281, - 0xC0E8: 0x9ECE, - 0xC0E9: 0x7BF1, - 0xC0EA: 0x72F8, - 0xC0EB: 0x79BB, - 0xC0EC: 0x6F13, - 0xC0ED: 0x7406, - 0xC0EE: 0x674E, - 0xC0EF: 0x91CC, - 0xC0F0: 0x9CA4, - 0xC0F1: 0x793C, - 0xC0F2: 0x8389, - 0xC0F3: 0x8354, - 0xC0F4: 0x540F, - 0xC0F5: 0x6817, - 0xC0F6: 0x4E3D, - 0xC0F7: 0x5389, - 0xC0F8: 0x52B1, - 0xC0F9: 0x783E, - 0xC0FA: 0x5386, - 0xC0FB: 0x5229, - 0xC0FC: 0x5088, - 0xC0FD: 0x4F8B, - 0xC0FE: 0x4FD0, - 0xC140: 0x7F56, - 0xC141: 0x7F59, - 0xC142: 0x7F5B, - 0xC143: 0x7F5C, - 0xC144: 0x7F5D, - 0xC145: 0x7F5E, - 0xC146: 0x7F60, - 0xC147: 0x7F63, - 0xC148: 0x7F64, - 0xC149: 0x7F65, - 0xC14A: 0x7F66, - 0xC14B: 0x7F67, - 0xC14C: 0x7F6B, - 0xC14D: 0x7F6C, - 0xC14E: 0x7F6D, - 0xC14F: 0x7F6F, - 0xC150: 0x7F70, - 0xC151: 0x7F73, - 0xC152: 0x7F75, - 0xC153: 0x7F76, - 0xC154: 0x7F77, - 0xC155: 0x7F78, - 0xC156: 0x7F7A, - 0xC157: 0x7F7B, - 0xC158: 0x7F7C, - 0xC159: 0x7F7D, - 0xC15A: 0x7F7F, - 0xC15B: 0x7F80, - 0xC15C: 0x7F82, - 0xC15D: 0x7F83, - 0xC15E: 0x7F84, - 0xC15F: 0x7F85, - 0xC160: 0x7F86, - 0xC161: 0x7F87, - 0xC162: 0x7F88, - 0xC163: 0x7F89, - 0xC164: 0x7F8B, - 0xC165: 0x7F8D, - 0xC166: 0x7F8F, - 0xC167: 0x7F90, - 0xC168: 0x7F91, - 0xC169: 0x7F92, - 0xC16A: 0x7F93, - 0xC16B: 0x7F95, - 0xC16C: 0x7F96, - 0xC16D: 0x7F97, - 0xC16E: 0x7F98, - 0xC16F: 0x7F99, - 0xC170: 0x7F9B, - 0xC171: 0x7F9C, - 0xC172: 0x7FA0, - 0xC173: 0x7FA2, - 0xC174: 0x7FA3, - 0xC175: 0x7FA5, - 0xC176: 0x7FA6, - 0xC177: 0x7FA8, - 0xC178: 0x7FA9, - 0xC179: 0x7FAA, - 0xC17A: 0x7FAB, - 0xC17B: 0x7FAC, - 0xC17C: 0x7FAD, - 0xC17D: 0x7FAE, - 0xC17E: 0x7FB1, - 0xC180: 0x7FB3, - 0xC181: 0x7FB4, - 0xC182: 0x7FB5, - 0xC183: 0x7FB6, - 0xC184: 0x7FB7, - 0xC185: 0x7FBA, - 0xC186: 0x7FBB, - 0xC187: 0x7FBE, - 0xC188: 0x7FC0, - 0xC189: 0x7FC2, - 0xC18A: 0x7FC3, - 0xC18B: 0x7FC4, - 0xC18C: 0x7FC6, - 0xC18D: 0x7FC7, - 0xC18E: 0x7FC8, - 0xC18F: 0x7FC9, - 0xC190: 0x7FCB, - 0xC191: 0x7FCD, - 0xC192: 0x7FCF, - 0xC193: 0x7FD0, - 0xC194: 0x7FD1, - 0xC195: 0x7FD2, - 0xC196: 0x7FD3, - 0xC197: 0x7FD6, - 0xC198: 0x7FD7, - 0xC199: 0x7FD9, - 0xC19A: 0x7FDA, - 0xC19B: 0x7FDB, - 0xC19C: 0x7FDC, - 0xC19D: 0x7FDD, - 0xC19E: 0x7FDE, - 0xC19F: 0x7FE2, - 0xC1A0: 0x7FE3, - 0xC1A1: 0x75E2, - 0xC1A2: 0x7ACB, - 0xC1A3: 0x7C92, - 0xC1A4: 0x6CA5, - 0xC1A5: 0x96B6, - 0xC1A6: 0x529B, - 0xC1A7: 0x7483, - 0xC1A8: 0x54E9, - 0xC1A9: 0x4FE9, - 0xC1AA: 0x8054, - 0xC1AB: 0x83B2, - 0xC1AC: 0x8FDE, - 0xC1AD: 0x9570, - 0xC1AE: 0x5EC9, - 0xC1AF: 0x601C, - 0xC1B0: 0x6D9F, - 0xC1B1: 0x5E18, - 0xC1B2: 0x655B, - 0xC1B3: 0x8138, - 0xC1B4: 0x94FE, - 0xC1B5: 0x604B, - 0xC1B6: 0x70BC, - 0xC1B7: 0x7EC3, - 0xC1B8: 0x7CAE, - 0xC1B9: 0x51C9, - 0xC1BA: 0x6881, - 0xC1BB: 0x7CB1, - 0xC1BC: 0x826F, - 0xC1BD: 0x4E24, - 0xC1BE: 0x8F86, - 0xC1BF: 0x91CF, - 0xC1C0: 0x667E, - 0xC1C1: 0x4EAE, - 0xC1C2: 0x8C05, - 0xC1C3: 0x64A9, - 0xC1C4: 0x804A, - 0xC1C5: 0x50DA, - 0xC1C6: 0x7597, - 0xC1C7: 0x71CE, - 0xC1C8: 0x5BE5, - 0xC1C9: 0x8FBD, - 0xC1CA: 0x6F66, - 0xC1CB: 0x4E86, - 0xC1CC: 0x6482, - 0xC1CD: 0x9563, - 0xC1CE: 0x5ED6, - 0xC1CF: 0x6599, - 0xC1D0: 0x5217, - 0xC1D1: 0x88C2, - 0xC1D2: 0x70C8, - 0xC1D3: 0x52A3, - 0xC1D4: 0x730E, - 0xC1D5: 0x7433, - 0xC1D6: 0x6797, - 0xC1D7: 0x78F7, - 0xC1D8: 0x9716, - 0xC1D9: 0x4E34, - 0xC1DA: 0x90BB, - 0xC1DB: 0x9CDE, - 0xC1DC: 0x6DCB, - 0xC1DD: 0x51DB, - 0xC1DE: 0x8D41, - 0xC1DF: 0x541D, - 0xC1E0: 0x62CE, - 0xC1E1: 0x73B2, - 0xC1E2: 0x83F1, - 0xC1E3: 0x96F6, - 0xC1E4: 0x9F84, - 0xC1E5: 0x94C3, - 0xC1E6: 0x4F36, - 0xC1E7: 0x7F9A, - 0xC1E8: 0x51CC, - 0xC1E9: 0x7075, - 0xC1EA: 0x9675, - 0xC1EB: 0x5CAD, - 0xC1EC: 0x9886, - 0xC1ED: 0x53E6, - 0xC1EE: 0x4EE4, - 0xC1EF: 0x6E9C, - 0xC1F0: 0x7409, - 0xC1F1: 0x69B4, - 0xC1F2: 0x786B, - 0xC1F3: 0x998F, - 0xC1F4: 0x7559, - 0xC1F5: 0x5218, - 0xC1F6: 0x7624, - 0xC1F7: 0x6D41, - 0xC1F8: 0x67F3, - 0xC1F9: 0x516D, - 0xC1FA: 0x9F99, - 0xC1FB: 0x804B, - 0xC1FC: 0x5499, - 0xC1FD: 0x7B3C, - 0xC1FE: 0x7ABF, - 0xC240: 0x7FE4, - 0xC241: 0x7FE7, - 0xC242: 0x7FE8, - 0xC243: 0x7FEA, - 0xC244: 0x7FEB, - 0xC245: 0x7FEC, - 0xC246: 0x7FED, - 0xC247: 0x7FEF, - 0xC248: 0x7FF2, - 0xC249: 0x7FF4, - 0xC24A: 0x7FF5, - 0xC24B: 0x7FF6, - 0xC24C: 0x7FF7, - 0xC24D: 0x7FF8, - 0xC24E: 0x7FF9, - 0xC24F: 0x7FFA, - 0xC250: 0x7FFD, - 0xC251: 0x7FFE, - 0xC252: 0x7FFF, - 0xC253: 0x8002, - 0xC254: 0x8007, - 0xC255: 0x8008, - 0xC256: 0x8009, - 0xC257: 0x800A, - 0xC258: 0x800E, - 0xC259: 0x800F, - 0xC25A: 0x8011, - 0xC25B: 0x8013, - 0xC25C: 0x801A, - 0xC25D: 0x801B, - 0xC25E: 0x801D, - 0xC25F: 0x801E, - 0xC260: 0x801F, - 0xC261: 0x8021, - 0xC262: 0x8023, - 0xC263: 0x8024, - 0xC264: 0x802B, - 0xC265: 0x802C, - 0xC266: 0x802D, - 0xC267: 0x802E, - 0xC268: 0x802F, - 0xC269: 0x8030, - 0xC26A: 0x8032, - 0xC26B: 0x8034, - 0xC26C: 0x8039, - 0xC26D: 0x803A, - 0xC26E: 0x803C, - 0xC26F: 0x803E, - 0xC270: 0x8040, - 0xC271: 0x8041, - 0xC272: 0x8044, - 0xC273: 0x8045, - 0xC274: 0x8047, - 0xC275: 0x8048, - 0xC276: 0x8049, - 0xC277: 0x804E, - 0xC278: 0x804F, - 0xC279: 0x8050, - 0xC27A: 0x8051, - 0xC27B: 0x8053, - 0xC27C: 0x8055, - 0xC27D: 0x8056, - 0xC27E: 0x8057, - 0xC280: 0x8059, - 0xC281: 0x805B, - 0xC282: 0x805C, - 0xC283: 0x805D, - 0xC284: 0x805E, - 0xC285: 0x805F, - 0xC286: 0x8060, - 0xC287: 0x8061, - 0xC288: 0x8062, - 0xC289: 0x8063, - 0xC28A: 0x8064, - 0xC28B: 0x8065, - 0xC28C: 0x8066, - 0xC28D: 0x8067, - 0xC28E: 0x8068, - 0xC28F: 0x806B, - 0xC290: 0x806C, - 0xC291: 0x806D, - 0xC292: 0x806E, - 0xC293: 0x806F, - 0xC294: 0x8070, - 0xC295: 0x8072, - 0xC296: 0x8073, - 0xC297: 0x8074, - 0xC298: 0x8075, - 0xC299: 0x8076, - 0xC29A: 0x8077, - 0xC29B: 0x8078, - 0xC29C: 0x8079, - 0xC29D: 0x807A, - 0xC29E: 0x807B, - 0xC29F: 0x807C, - 0xC2A0: 0x807D, - 0xC2A1: 0x9686, - 0xC2A2: 0x5784, - 0xC2A3: 0x62E2, - 0xC2A4: 0x9647, - 0xC2A5: 0x697C, - 0xC2A6: 0x5A04, - 0xC2A7: 0x6402, - 0xC2A8: 0x7BD3, - 0xC2A9: 0x6F0F, - 0xC2AA: 0x964B, - 0xC2AB: 0x82A6, - 0xC2AC: 0x5362, - 0xC2AD: 0x9885, - 0xC2AE: 0x5E90, - 0xC2AF: 0x7089, - 0xC2B0: 0x63B3, - 0xC2B1: 0x5364, - 0xC2B2: 0x864F, - 0xC2B3: 0x9C81, - 0xC2B4: 0x9E93, - 0xC2B5: 0x788C, - 0xC2B6: 0x9732, - 0xC2B7: 0x8DEF, - 0xC2B8: 0x8D42, - 0xC2B9: 0x9E7F, - 0xC2BA: 0x6F5E, - 0xC2BB: 0x7984, - 0xC2BC: 0x5F55, - 0xC2BD: 0x9646, - 0xC2BE: 0x622E, - 0xC2BF: 0x9A74, - 0xC2C0: 0x5415, - 0xC2C1: 0x94DD, - 0xC2C2: 0x4FA3, - 0xC2C3: 0x65C5, - 0xC2C4: 0x5C65, - 0xC2C5: 0x5C61, - 0xC2C6: 0x7F15, - 0xC2C7: 0x8651, - 0xC2C8: 0x6C2F, - 0xC2C9: 0x5F8B, - 0xC2CA: 0x7387, - 0xC2CB: 0x6EE4, - 0xC2CC: 0x7EFF, - 0xC2CD: 0x5CE6, - 0xC2CE: 0x631B, - 0xC2CF: 0x5B6A, - 0xC2D0: 0x6EE6, - 0xC2D1: 0x5375, - 0xC2D2: 0x4E71, - 0xC2D3: 0x63A0, - 0xC2D4: 0x7565, - 0xC2D5: 0x62A1, - 0xC2D6: 0x8F6E, - 0xC2D7: 0x4F26, - 0xC2D8: 0x4ED1, - 0xC2D9: 0x6CA6, - 0xC2DA: 0x7EB6, - 0xC2DB: 0x8BBA, - 0xC2DC: 0x841D, - 0xC2DD: 0x87BA, - 0xC2DE: 0x7F57, - 0xC2DF: 0x903B, - 0xC2E0: 0x9523, - 0xC2E1: 0x7BA9, - 0xC2E2: 0x9AA1, - 0xC2E3: 0x88F8, - 0xC2E4: 0x843D, - 0xC2E5: 0x6D1B, - 0xC2E6: 0x9A86, - 0xC2E7: 0x7EDC, - 0xC2E8: 0x5988, - 0xC2E9: 0x9EBB, - 0xC2EA: 0x739B, - 0xC2EB: 0x7801, - 0xC2EC: 0x8682, - 0xC2ED: 0x9A6C, - 0xC2EE: 0x9A82, - 0xC2EF: 0x561B, - 0xC2F0: 0x5417, - 0xC2F1: 0x57CB, - 0xC2F2: 0x4E70, - 0xC2F3: 0x9EA6, - 0xC2F4: 0x5356, - 0xC2F5: 0x8FC8, - 0xC2F6: 0x8109, - 0xC2F7: 0x7792, - 0xC2F8: 0x9992, - 0xC2F9: 0x86EE, - 0xC2FA: 0x6EE1, - 0xC2FB: 0x8513, - 0xC2FC: 0x66FC, - 0xC2FD: 0x6162, - 0xC2FE: 0x6F2B, - 0xC340: 0x807E, - 0xC341: 0x8081, - 0xC342: 0x8082, - 0xC343: 0x8085, - 0xC344: 0x8088, - 0xC345: 0x808A, - 0xC346: 0x808D, - 0xC347: 0x808E, - 0xC348: 0x808F, - 0xC349: 0x8090, - 0xC34A: 0x8091, - 0xC34B: 0x8092, - 0xC34C: 0x8094, - 0xC34D: 0x8095, - 0xC34E: 0x8097, - 0xC34F: 0x8099, - 0xC350: 0x809E, - 0xC351: 0x80A3, - 0xC352: 0x80A6, - 0xC353: 0x80A7, - 0xC354: 0x80A8, - 0xC355: 0x80AC, - 0xC356: 0x80B0, - 0xC357: 0x80B3, - 0xC358: 0x80B5, - 0xC359: 0x80B6, - 0xC35A: 0x80B8, - 0xC35B: 0x80B9, - 0xC35C: 0x80BB, - 0xC35D: 0x80C5, - 0xC35E: 0x80C7, - 0xC35F: 0x80C8, - 0xC360: 0x80C9, - 0xC361: 0x80CA, - 0xC362: 0x80CB, - 0xC363: 0x80CF, - 0xC364: 0x80D0, - 0xC365: 0x80D1, - 0xC366: 0x80D2, - 0xC367: 0x80D3, - 0xC368: 0x80D4, - 0xC369: 0x80D5, - 0xC36A: 0x80D8, - 0xC36B: 0x80DF, - 0xC36C: 0x80E0, - 0xC36D: 0x80E2, - 0xC36E: 0x80E3, - 0xC36F: 0x80E6, - 0xC370: 0x80EE, - 0xC371: 0x80F5, - 0xC372: 0x80F7, - 0xC373: 0x80F9, - 0xC374: 0x80FB, - 0xC375: 0x80FE, - 0xC376: 0x80FF, - 0xC377: 0x8100, - 0xC378: 0x8101, - 0xC379: 0x8103, - 0xC37A: 0x8104, - 0xC37B: 0x8105, - 0xC37C: 0x8107, - 0xC37D: 0x8108, - 0xC37E: 0x810B, - 0xC380: 0x810C, - 0xC381: 0x8115, - 0xC382: 0x8117, - 0xC383: 0x8119, - 0xC384: 0x811B, - 0xC385: 0x811C, - 0xC386: 0x811D, - 0xC387: 0x811F, - 0xC388: 0x8120, - 0xC389: 0x8121, - 0xC38A: 0x8122, - 0xC38B: 0x8123, - 0xC38C: 0x8124, - 0xC38D: 0x8125, - 0xC38E: 0x8126, - 0xC38F: 0x8127, - 0xC390: 0x8128, - 0xC391: 0x8129, - 0xC392: 0x812A, - 0xC393: 0x812B, - 0xC394: 0x812D, - 0xC395: 0x812E, - 0xC396: 0x8130, - 0xC397: 0x8133, - 0xC398: 0x8134, - 0xC399: 0x8135, - 0xC39A: 0x8137, - 0xC39B: 0x8139, - 0xC39C: 0x813A, - 0xC39D: 0x813B, - 0xC39E: 0x813C, - 0xC39F: 0x813D, - 0xC3A0: 0x813F, - 0xC3A1: 0x8C29, - 0xC3A2: 0x8292, - 0xC3A3: 0x832B, - 0xC3A4: 0x76F2, - 0xC3A5: 0x6C13, - 0xC3A6: 0x5FD9, - 0xC3A7: 0x83BD, - 0xC3A8: 0x732B, - 0xC3A9: 0x8305, - 0xC3AA: 0x951A, - 0xC3AB: 0x6BDB, - 0xC3AC: 0x77DB, - 0xC3AD: 0x94C6, - 0xC3AE: 0x536F, - 0xC3AF: 0x8302, - 0xC3B0: 0x5192, - 0xC3B1: 0x5E3D, - 0xC3B2: 0x8C8C, - 0xC3B3: 0x8D38, - 0xC3B4: 0x4E48, - 0xC3B5: 0x73AB, - 0xC3B6: 0x679A, - 0xC3B7: 0x6885, - 0xC3B8: 0x9176, - 0xC3B9: 0x9709, - 0xC3BA: 0x7164, - 0xC3BB: 0x6CA1, - 0xC3BC: 0x7709, - 0xC3BD: 0x5A92, - 0xC3BE: 0x9541, - 0xC3BF: 0x6BCF, - 0xC3C0: 0x7F8E, - 0xC3C1: 0x6627, - 0xC3C2: 0x5BD0, - 0xC3C3: 0x59B9, - 0xC3C4: 0x5A9A, - 0xC3C5: 0x95E8, - 0xC3C6: 0x95F7, - 0xC3C7: 0x4EEC, - 0xC3C8: 0x840C, - 0xC3C9: 0x8499, - 0xC3CA: 0x6AAC, - 0xC3CB: 0x76DF, - 0xC3CC: 0x9530, - 0xC3CD: 0x731B, - 0xC3CE: 0x68A6, - 0xC3CF: 0x5B5F, - 0xC3D0: 0x772F, - 0xC3D1: 0x919A, - 0xC3D2: 0x9761, - 0xC3D3: 0x7CDC, - 0xC3D4: 0x8FF7, - 0xC3D5: 0x8C1C, - 0xC3D6: 0x5F25, - 0xC3D7: 0x7C73, - 0xC3D8: 0x79D8, - 0xC3D9: 0x89C5, - 0xC3DA: 0x6CCC, - 0xC3DB: 0x871C, - 0xC3DC: 0x5BC6, - 0xC3DD: 0x5E42, - 0xC3DE: 0x68C9, - 0xC3DF: 0x7720, - 0xC3E0: 0x7EF5, - 0xC3E1: 0x5195, - 0xC3E2: 0x514D, - 0xC3E3: 0x52C9, - 0xC3E4: 0x5A29, - 0xC3E5: 0x7F05, - 0xC3E6: 0x9762, - 0xC3E7: 0x82D7, - 0xC3E8: 0x63CF, - 0xC3E9: 0x7784, - 0xC3EA: 0x85D0, - 0xC3EB: 0x79D2, - 0xC3EC: 0x6E3A, - 0xC3ED: 0x5E99, - 0xC3EE: 0x5999, - 0xC3EF: 0x8511, - 0xC3F0: 0x706D, - 0xC3F1: 0x6C11, - 0xC3F2: 0x62BF, - 0xC3F3: 0x76BF, - 0xC3F4: 0x654F, - 0xC3F5: 0x60AF, - 0xC3F6: 0x95FD, - 0xC3F7: 0x660E, - 0xC3F8: 0x879F, - 0xC3F9: 0x9E23, - 0xC3FA: 0x94ED, - 0xC3FB: 0x540D, - 0xC3FC: 0x547D, - 0xC3FD: 0x8C2C, - 0xC3FE: 0x6478, - 0xC440: 0x8140, - 0xC441: 0x8141, - 0xC442: 0x8142, - 0xC443: 0x8143, - 0xC444: 0x8144, - 0xC445: 0x8145, - 0xC446: 0x8147, - 0xC447: 0x8149, - 0xC448: 0x814D, - 0xC449: 0x814E, - 0xC44A: 0x814F, - 0xC44B: 0x8152, - 0xC44C: 0x8156, - 0xC44D: 0x8157, - 0xC44E: 0x8158, - 0xC44F: 0x815B, - 0xC450: 0x815C, - 0xC451: 0x815D, - 0xC452: 0x815E, - 0xC453: 0x815F, - 0xC454: 0x8161, - 0xC455: 0x8162, - 0xC456: 0x8163, - 0xC457: 0x8164, - 0xC458: 0x8166, - 0xC459: 0x8168, - 0xC45A: 0x816A, - 0xC45B: 0x816B, - 0xC45C: 0x816C, - 0xC45D: 0x816F, - 0xC45E: 0x8172, - 0xC45F: 0x8173, - 0xC460: 0x8175, - 0xC461: 0x8176, - 0xC462: 0x8177, - 0xC463: 0x8178, - 0xC464: 0x8181, - 0xC465: 0x8183, - 0xC466: 0x8184, - 0xC467: 0x8185, - 0xC468: 0x8186, - 0xC469: 0x8187, - 0xC46A: 0x8189, - 0xC46B: 0x818B, - 0xC46C: 0x818C, - 0xC46D: 0x818D, - 0xC46E: 0x818E, - 0xC46F: 0x8190, - 0xC470: 0x8192, - 0xC471: 0x8193, - 0xC472: 0x8194, - 0xC473: 0x8195, - 0xC474: 0x8196, - 0xC475: 0x8197, - 0xC476: 0x8199, - 0xC477: 0x819A, - 0xC478: 0x819E, - 0xC479: 0x819F, - 0xC47A: 0x81A0, - 0xC47B: 0x81A1, - 0xC47C: 0x81A2, - 0xC47D: 0x81A4, - 0xC47E: 0x81A5, - 0xC480: 0x81A7, - 0xC481: 0x81A9, - 0xC482: 0x81AB, - 0xC483: 0x81AC, - 0xC484: 0x81AD, - 0xC485: 0x81AE, - 0xC486: 0x81AF, - 0xC487: 0x81B0, - 0xC488: 0x81B1, - 0xC489: 0x81B2, - 0xC48A: 0x81B4, - 0xC48B: 0x81B5, - 0xC48C: 0x81B6, - 0xC48D: 0x81B7, - 0xC48E: 0x81B8, - 0xC48F: 0x81B9, - 0xC490: 0x81BC, - 0xC491: 0x81BD, - 0xC492: 0x81BE, - 0xC493: 0x81BF, - 0xC494: 0x81C4, - 0xC495: 0x81C5, - 0xC496: 0x81C7, - 0xC497: 0x81C8, - 0xC498: 0x81C9, - 0xC499: 0x81CB, - 0xC49A: 0x81CD, - 0xC49B: 0x81CE, - 0xC49C: 0x81CF, - 0xC49D: 0x81D0, - 0xC49E: 0x81D1, - 0xC49F: 0x81D2, - 0xC4A0: 0x81D3, - 0xC4A1: 0x6479, - 0xC4A2: 0x8611, - 0xC4A3: 0x6A21, - 0xC4A4: 0x819C, - 0xC4A5: 0x78E8, - 0xC4A6: 0x6469, - 0xC4A7: 0x9B54, - 0xC4A8: 0x62B9, - 0xC4A9: 0x672B, - 0xC4AA: 0x83AB, - 0xC4AB: 0x58A8, - 0xC4AC: 0x9ED8, - 0xC4AD: 0x6CAB, - 0xC4AE: 0x6F20, - 0xC4AF: 0x5BDE, - 0xC4B0: 0x964C, - 0xC4B1: 0x8C0B, - 0xC4B2: 0x725F, - 0xC4B3: 0x67D0, - 0xC4B4: 0x62C7, - 0xC4B5: 0x7261, - 0xC4B6: 0x4EA9, - 0xC4B7: 0x59C6, - 0xC4B8: 0x6BCD, - 0xC4B9: 0x5893, - 0xC4BA: 0x66AE, - 0xC4BB: 0x5E55, - 0xC4BC: 0x52DF, - 0xC4BD: 0x6155, - 0xC4BE: 0x6728, - 0xC4BF: 0x76EE, - 0xC4C0: 0x7766, - 0xC4C1: 0x7267, - 0xC4C2: 0x7A46, - 0xC4C3: 0x62FF, - 0xC4C4: 0x54EA, - 0xC4C5: 0x5450, - 0xC4C6: 0x94A0, - 0xC4C7: 0x90A3, - 0xC4C8: 0x5A1C, - 0xC4C9: 0x7EB3, - 0xC4CA: 0x6C16, - 0xC4CB: 0x4E43, - 0xC4CC: 0x5976, - 0xC4CD: 0x8010, - 0xC4CE: 0x5948, - 0xC4CF: 0x5357, - 0xC4D0: 0x7537, - 0xC4D1: 0x96BE, - 0xC4D2: 0x56CA, - 0xC4D3: 0x6320, - 0xC4D4: 0x8111, - 0xC4D5: 0x607C, - 0xC4D6: 0x95F9, - 0xC4D7: 0x6DD6, - 0xC4D8: 0x5462, - 0xC4D9: 0x9981, - 0xC4DA: 0x5185, - 0xC4DB: 0x5AE9, - 0xC4DC: 0x80FD, - 0xC4DD: 0x59AE, - 0xC4DE: 0x9713, - 0xC4DF: 0x502A, - 0xC4E0: 0x6CE5, - 0xC4E1: 0x5C3C, - 0xC4E2: 0x62DF, - 0xC4E3: 0x4F60, - 0xC4E4: 0x533F, - 0xC4E5: 0x817B, - 0xC4E6: 0x9006, - 0xC4E7: 0x6EBA, - 0xC4E8: 0x852B, - 0xC4E9: 0x62C8, - 0xC4EA: 0x5E74, - 0xC4EB: 0x78BE, - 0xC4EC: 0x64B5, - 0xC4ED: 0x637B, - 0xC4EE: 0x5FF5, - 0xC4EF: 0x5A18, - 0xC4F0: 0x917F, - 0xC4F1: 0x9E1F, - 0xC4F2: 0x5C3F, - 0xC4F3: 0x634F, - 0xC4F4: 0x8042, - 0xC4F5: 0x5B7D, - 0xC4F6: 0x556E, - 0xC4F7: 0x954A, - 0xC4F8: 0x954D, - 0xC4F9: 0x6D85, - 0xC4FA: 0x60A8, - 0xC4FB: 0x67E0, - 0xC4FC: 0x72DE, - 0xC4FD: 0x51DD, - 0xC4FE: 0x5B81, - 0xC540: 0x81D4, - 0xC541: 0x81D5, - 0xC542: 0x81D6, - 0xC543: 0x81D7, - 0xC544: 0x81D8, - 0xC545: 0x81D9, - 0xC546: 0x81DA, - 0xC547: 0x81DB, - 0xC548: 0x81DC, - 0xC549: 0x81DD, - 0xC54A: 0x81DE, - 0xC54B: 0x81DF, - 0xC54C: 0x81E0, - 0xC54D: 0x81E1, - 0xC54E: 0x81E2, - 0xC54F: 0x81E4, - 0xC550: 0x81E5, - 0xC551: 0x81E6, - 0xC552: 0x81E8, - 0xC553: 0x81E9, - 0xC554: 0x81EB, - 0xC555: 0x81EE, - 0xC556: 0x81EF, - 0xC557: 0x81F0, - 0xC558: 0x81F1, - 0xC559: 0x81F2, - 0xC55A: 0x81F5, - 0xC55B: 0x81F6, - 0xC55C: 0x81F7, - 0xC55D: 0x81F8, - 0xC55E: 0x81F9, - 0xC55F: 0x81FA, - 0xC560: 0x81FD, - 0xC561: 0x81FF, - 0xC562: 0x8203, - 0xC563: 0x8207, - 0xC564: 0x8208, - 0xC565: 0x8209, - 0xC566: 0x820A, - 0xC567: 0x820B, - 0xC568: 0x820E, - 0xC569: 0x820F, - 0xC56A: 0x8211, - 0xC56B: 0x8213, - 0xC56C: 0x8215, - 0xC56D: 0x8216, - 0xC56E: 0x8217, - 0xC56F: 0x8218, - 0xC570: 0x8219, - 0xC571: 0x821A, - 0xC572: 0x821D, - 0xC573: 0x8220, - 0xC574: 0x8224, - 0xC575: 0x8225, - 0xC576: 0x8226, - 0xC577: 0x8227, - 0xC578: 0x8229, - 0xC579: 0x822E, - 0xC57A: 0x8232, - 0xC57B: 0x823A, - 0xC57C: 0x823C, - 0xC57D: 0x823D, - 0xC57E: 0x823F, - 0xC580: 0x8240, - 0xC581: 0x8241, - 0xC582: 0x8242, - 0xC583: 0x8243, - 0xC584: 0x8245, - 0xC585: 0x8246, - 0xC586: 0x8248, - 0xC587: 0x824A, - 0xC588: 0x824C, - 0xC589: 0x824D, - 0xC58A: 0x824E, - 0xC58B: 0x8250, - 0xC58C: 0x8251, - 0xC58D: 0x8252, - 0xC58E: 0x8253, - 0xC58F: 0x8254, - 0xC590: 0x8255, - 0xC591: 0x8256, - 0xC592: 0x8257, - 0xC593: 0x8259, - 0xC594: 0x825B, - 0xC595: 0x825C, - 0xC596: 0x825D, - 0xC597: 0x825E, - 0xC598: 0x8260, - 0xC599: 0x8261, - 0xC59A: 0x8262, - 0xC59B: 0x8263, - 0xC59C: 0x8264, - 0xC59D: 0x8265, - 0xC59E: 0x8266, - 0xC59F: 0x8267, - 0xC5A0: 0x8269, - 0xC5A1: 0x62E7, - 0xC5A2: 0x6CDE, - 0xC5A3: 0x725B, - 0xC5A4: 0x626D, - 0xC5A5: 0x94AE, - 0xC5A6: 0x7EBD, - 0xC5A7: 0x8113, - 0xC5A8: 0x6D53, - 0xC5A9: 0x519C, - 0xC5AA: 0x5F04, - 0xC5AB: 0x5974, - 0xC5AC: 0x52AA, - 0xC5AD: 0x6012, - 0xC5AE: 0x5973, - 0xC5AF: 0x6696, - 0xC5B0: 0x8650, - 0xC5B1: 0x759F, - 0xC5B2: 0x632A, - 0xC5B3: 0x61E6, - 0xC5B4: 0x7CEF, - 0xC5B5: 0x8BFA, - 0xC5B6: 0x54E6, - 0xC5B7: 0x6B27, - 0xC5B8: 0x9E25, - 0xC5B9: 0x6BB4, - 0xC5BA: 0x85D5, - 0xC5BB: 0x5455, - 0xC5BC: 0x5076, - 0xC5BD: 0x6CA4, - 0xC5BE: 0x556A, - 0xC5BF: 0x8DB4, - 0xC5C0: 0x722C, - 0xC5C1: 0x5E15, - 0xC5C2: 0x6015, - 0xC5C3: 0x7436, - 0xC5C4: 0x62CD, - 0xC5C5: 0x6392, - 0xC5C6: 0x724C, - 0xC5C7: 0x5F98, - 0xC5C8: 0x6E43, - 0xC5C9: 0x6D3E, - 0xC5CA: 0x6500, - 0xC5CB: 0x6F58, - 0xC5CC: 0x76D8, - 0xC5CD: 0x78D0, - 0xC5CE: 0x76FC, - 0xC5CF: 0x7554, - 0xC5D0: 0x5224, - 0xC5D1: 0x53DB, - 0xC5D2: 0x4E53, - 0xC5D3: 0x5E9E, - 0xC5D4: 0x65C1, - 0xC5D5: 0x802A, - 0xC5D6: 0x80D6, - 0xC5D7: 0x629B, - 0xC5D8: 0x5486, - 0xC5D9: 0x5228, - 0xC5DA: 0x70AE, - 0xC5DB: 0x888D, - 0xC5DC: 0x8DD1, - 0xC5DD: 0x6CE1, - 0xC5DE: 0x5478, - 0xC5DF: 0x80DA, - 0xC5E0: 0x57F9, - 0xC5E1: 0x88F4, - 0xC5E2: 0x8D54, - 0xC5E3: 0x966A, - 0xC5E4: 0x914D, - 0xC5E5: 0x4F69, - 0xC5E6: 0x6C9B, - 0xC5E7: 0x55B7, - 0xC5E8: 0x76C6, - 0xC5E9: 0x7830, - 0xC5EA: 0x62A8, - 0xC5EB: 0x70F9, - 0xC5EC: 0x6F8E, - 0xC5ED: 0x5F6D, - 0xC5EE: 0x84EC, - 0xC5EF: 0x68DA, - 0xC5F0: 0x787C, - 0xC5F1: 0x7BF7, - 0xC5F2: 0x81A8, - 0xC5F3: 0x670B, - 0xC5F4: 0x9E4F, - 0xC5F5: 0x6367, - 0xC5F6: 0x78B0, - 0xC5F7: 0x576F, - 0xC5F8: 0x7812, - 0xC5F9: 0x9739, - 0xC5FA: 0x6279, - 0xC5FB: 0x62AB, - 0xC5FC: 0x5288, - 0xC5FD: 0x7435, - 0xC5FE: 0x6BD7, - 0xC640: 0x826A, - 0xC641: 0x826B, - 0xC642: 0x826C, - 0xC643: 0x826D, - 0xC644: 0x8271, - 0xC645: 0x8275, - 0xC646: 0x8276, - 0xC647: 0x8277, - 0xC648: 0x8278, - 0xC649: 0x827B, - 0xC64A: 0x827C, - 0xC64B: 0x8280, - 0xC64C: 0x8281, - 0xC64D: 0x8283, - 0xC64E: 0x8285, - 0xC64F: 0x8286, - 0xC650: 0x8287, - 0xC651: 0x8289, - 0xC652: 0x828C, - 0xC653: 0x8290, - 0xC654: 0x8293, - 0xC655: 0x8294, - 0xC656: 0x8295, - 0xC657: 0x8296, - 0xC658: 0x829A, - 0xC659: 0x829B, - 0xC65A: 0x829E, - 0xC65B: 0x82A0, - 0xC65C: 0x82A2, - 0xC65D: 0x82A3, - 0xC65E: 0x82A7, - 0xC65F: 0x82B2, - 0xC660: 0x82B5, - 0xC661: 0x82B6, - 0xC662: 0x82BA, - 0xC663: 0x82BB, - 0xC664: 0x82BC, - 0xC665: 0x82BF, - 0xC666: 0x82C0, - 0xC667: 0x82C2, - 0xC668: 0x82C3, - 0xC669: 0x82C5, - 0xC66A: 0x82C6, - 0xC66B: 0x82C9, - 0xC66C: 0x82D0, - 0xC66D: 0x82D6, - 0xC66E: 0x82D9, - 0xC66F: 0x82DA, - 0xC670: 0x82DD, - 0xC671: 0x82E2, - 0xC672: 0x82E7, - 0xC673: 0x82E8, - 0xC674: 0x82E9, - 0xC675: 0x82EA, - 0xC676: 0x82EC, - 0xC677: 0x82ED, - 0xC678: 0x82EE, - 0xC679: 0x82F0, - 0xC67A: 0x82F2, - 0xC67B: 0x82F3, - 0xC67C: 0x82F5, - 0xC67D: 0x82F6, - 0xC67E: 0x82F8, - 0xC680: 0x82FA, - 0xC681: 0x82FC, - 0xC682: 0x82FD, - 0xC683: 0x82FE, - 0xC684: 0x82FF, - 0xC685: 0x8300, - 0xC686: 0x830A, - 0xC687: 0x830B, - 0xC688: 0x830D, - 0xC689: 0x8310, - 0xC68A: 0x8312, - 0xC68B: 0x8313, - 0xC68C: 0x8316, - 0xC68D: 0x8318, - 0xC68E: 0x8319, - 0xC68F: 0x831D, - 0xC690: 0x831E, - 0xC691: 0x831F, - 0xC692: 0x8320, - 0xC693: 0x8321, - 0xC694: 0x8322, - 0xC695: 0x8323, - 0xC696: 0x8324, - 0xC697: 0x8325, - 0xC698: 0x8326, - 0xC699: 0x8329, - 0xC69A: 0x832A, - 0xC69B: 0x832E, - 0xC69C: 0x8330, - 0xC69D: 0x8332, - 0xC69E: 0x8337, - 0xC69F: 0x833B, - 0xC6A0: 0x833D, - 0xC6A1: 0x5564, - 0xC6A2: 0x813E, - 0xC6A3: 0x75B2, - 0xC6A4: 0x76AE, - 0xC6A5: 0x5339, - 0xC6A6: 0x75DE, - 0xC6A7: 0x50FB, - 0xC6A8: 0x5C41, - 0xC6A9: 0x8B6C, - 0xC6AA: 0x7BC7, - 0xC6AB: 0x504F, - 0xC6AC: 0x7247, - 0xC6AD: 0x9A97, - 0xC6AE: 0x98D8, - 0xC6AF: 0x6F02, - 0xC6B0: 0x74E2, - 0xC6B1: 0x7968, - 0xC6B2: 0x6487, - 0xC6B3: 0x77A5, - 0xC6B4: 0x62FC, - 0xC6B5: 0x9891, - 0xC6B6: 0x8D2B, - 0xC6B7: 0x54C1, - 0xC6B8: 0x8058, - 0xC6B9: 0x4E52, - 0xC6BA: 0x576A, - 0xC6BB: 0x82F9, - 0xC6BC: 0x840D, - 0xC6BD: 0x5E73, - 0xC6BE: 0x51ED, - 0xC6BF: 0x74F6, - 0xC6C0: 0x8BC4, - 0xC6C1: 0x5C4F, - 0xC6C2: 0x5761, - 0xC6C3: 0x6CFC, - 0xC6C4: 0x9887, - 0xC6C5: 0x5A46, - 0xC6C6: 0x7834, - 0xC6C7: 0x9B44, - 0xC6C8: 0x8FEB, - 0xC6C9: 0x7C95, - 0xC6CA: 0x5256, - 0xC6CB: 0x6251, - 0xC6CC: 0x94FA, - 0xC6CD: 0x4EC6, - 0xC6CE: 0x8386, - 0xC6CF: 0x8461, - 0xC6D0: 0x83E9, - 0xC6D1: 0x84B2, - 0xC6D2: 0x57D4, - 0xC6D3: 0x6734, - 0xC6D4: 0x5703, - 0xC6D5: 0x666E, - 0xC6D6: 0x6D66, - 0xC6D7: 0x8C31, - 0xC6D8: 0x66DD, - 0xC6D9: 0x7011, - 0xC6DA: 0x671F, - 0xC6DB: 0x6B3A, - 0xC6DC: 0x6816, - 0xC6DD: 0x621A, - 0xC6DE: 0x59BB, - 0xC6DF: 0x4E03, - 0xC6E0: 0x51C4, - 0xC6E1: 0x6F06, - 0xC6E2: 0x67D2, - 0xC6E3: 0x6C8F, - 0xC6E4: 0x5176, - 0xC6E5: 0x68CB, - 0xC6E6: 0x5947, - 0xC6E7: 0x6B67, - 0xC6E8: 0x7566, - 0xC6E9: 0x5D0E, - 0xC6EA: 0x8110, - 0xC6EB: 0x9F50, - 0xC6EC: 0x65D7, - 0xC6ED: 0x7948, - 0xC6EE: 0x7941, - 0xC6EF: 0x9A91, - 0xC6F0: 0x8D77, - 0xC6F1: 0x5C82, - 0xC6F2: 0x4E5E, - 0xC6F3: 0x4F01, - 0xC6F4: 0x542F, - 0xC6F5: 0x5951, - 0xC6F6: 0x780C, - 0xC6F7: 0x5668, - 0xC6F8: 0x6C14, - 0xC6F9: 0x8FC4, - 0xC6FA: 0x5F03, - 0xC6FB: 0x6C7D, - 0xC6FC: 0x6CE3, - 0xC6FD: 0x8BAB, - 0xC6FE: 0x6390, - 0xC740: 0x833E, - 0xC741: 0x833F, - 0xC742: 0x8341, - 0xC743: 0x8342, - 0xC744: 0x8344, - 0xC745: 0x8345, - 0xC746: 0x8348, - 0xC747: 0x834A, - 0xC748: 0x834B, - 0xC749: 0x834C, - 0xC74A: 0x834D, - 0xC74B: 0x834E, - 0xC74C: 0x8353, - 0xC74D: 0x8355, - 0xC74E: 0x8356, - 0xC74F: 0x8357, - 0xC750: 0x8358, - 0xC751: 0x8359, - 0xC752: 0x835D, - 0xC753: 0x8362, - 0xC754: 0x8370, - 0xC755: 0x8371, - 0xC756: 0x8372, - 0xC757: 0x8373, - 0xC758: 0x8374, - 0xC759: 0x8375, - 0xC75A: 0x8376, - 0xC75B: 0x8379, - 0xC75C: 0x837A, - 0xC75D: 0x837E, - 0xC75E: 0x837F, - 0xC75F: 0x8380, - 0xC760: 0x8381, - 0xC761: 0x8382, - 0xC762: 0x8383, - 0xC763: 0x8384, - 0xC764: 0x8387, - 0xC765: 0x8388, - 0xC766: 0x838A, - 0xC767: 0x838B, - 0xC768: 0x838C, - 0xC769: 0x838D, - 0xC76A: 0x838F, - 0xC76B: 0x8390, - 0xC76C: 0x8391, - 0xC76D: 0x8394, - 0xC76E: 0x8395, - 0xC76F: 0x8396, - 0xC770: 0x8397, - 0xC771: 0x8399, - 0xC772: 0x839A, - 0xC773: 0x839D, - 0xC774: 0x839F, - 0xC775: 0x83A1, - 0xC776: 0x83A2, - 0xC777: 0x83A3, - 0xC778: 0x83A4, - 0xC779: 0x83A5, - 0xC77A: 0x83A6, - 0xC77B: 0x83A7, - 0xC77C: 0x83AC, - 0xC77D: 0x83AD, - 0xC77E: 0x83AE, - 0xC780: 0x83AF, - 0xC781: 0x83B5, - 0xC782: 0x83BB, - 0xC783: 0x83BE, - 0xC784: 0x83BF, - 0xC785: 0x83C2, - 0xC786: 0x83C3, - 0xC787: 0x83C4, - 0xC788: 0x83C6, - 0xC789: 0x83C8, - 0xC78A: 0x83C9, - 0xC78B: 0x83CB, - 0xC78C: 0x83CD, - 0xC78D: 0x83CE, - 0xC78E: 0x83D0, - 0xC78F: 0x83D1, - 0xC790: 0x83D2, - 0xC791: 0x83D3, - 0xC792: 0x83D5, - 0xC793: 0x83D7, - 0xC794: 0x83D9, - 0xC795: 0x83DA, - 0xC796: 0x83DB, - 0xC797: 0x83DE, - 0xC798: 0x83E2, - 0xC799: 0x83E3, - 0xC79A: 0x83E4, - 0xC79B: 0x83E6, - 0xC79C: 0x83E7, - 0xC79D: 0x83E8, - 0xC79E: 0x83EB, - 0xC79F: 0x83EC, - 0xC7A0: 0x83ED, - 0xC7A1: 0x6070, - 0xC7A2: 0x6D3D, - 0xC7A3: 0x7275, - 0xC7A4: 0x6266, - 0xC7A5: 0x948E, - 0xC7A6: 0x94C5, - 0xC7A7: 0x5343, - 0xC7A8: 0x8FC1, - 0xC7A9: 0x7B7E, - 0xC7AA: 0x4EDF, - 0xC7AB: 0x8C26, - 0xC7AC: 0x4E7E, - 0xC7AD: 0x9ED4, - 0xC7AE: 0x94B1, - 0xC7AF: 0x94B3, - 0xC7B0: 0x524D, - 0xC7B1: 0x6F5C, - 0xC7B2: 0x9063, - 0xC7B3: 0x6D45, - 0xC7B4: 0x8C34, - 0xC7B5: 0x5811, - 0xC7B6: 0x5D4C, - 0xC7B7: 0x6B20, - 0xC7B8: 0x6B49, - 0xC7B9: 0x67AA, - 0xC7BA: 0x545B, - 0xC7BB: 0x8154, - 0xC7BC: 0x7F8C, - 0xC7BD: 0x5899, - 0xC7BE: 0x8537, - 0xC7BF: 0x5F3A, - 0xC7C0: 0x62A2, - 0xC7C1: 0x6A47, - 0xC7C2: 0x9539, - 0xC7C3: 0x6572, - 0xC7C4: 0x6084, - 0xC7C5: 0x6865, - 0xC7C6: 0x77A7, - 0xC7C7: 0x4E54, - 0xC7C8: 0x4FA8, - 0xC7C9: 0x5DE7, - 0xC7CA: 0x9798, - 0xC7CB: 0x64AC, - 0xC7CC: 0x7FD8, - 0xC7CD: 0x5CED, - 0xC7CE: 0x4FCF, - 0xC7CF: 0x7A8D, - 0xC7D0: 0x5207, - 0xC7D1: 0x8304, - 0xC7D2: 0x4E14, - 0xC7D3: 0x602F, - 0xC7D4: 0x7A83, - 0xC7D5: 0x94A6, - 0xC7D6: 0x4FB5, - 0xC7D7: 0x4EB2, - 0xC7D8: 0x79E6, - 0xC7D9: 0x7434, - 0xC7DA: 0x52E4, - 0xC7DB: 0x82B9, - 0xC7DC: 0x64D2, - 0xC7DD: 0x79BD, - 0xC7DE: 0x5BDD, - 0xC7DF: 0x6C81, - 0xC7E0: 0x9752, - 0xC7E1: 0x8F7B, - 0xC7E2: 0x6C22, - 0xC7E3: 0x503E, - 0xC7E4: 0x537F, - 0xC7E5: 0x6E05, - 0xC7E6: 0x64CE, - 0xC7E7: 0x6674, - 0xC7E8: 0x6C30, - 0xC7E9: 0x60C5, - 0xC7EA: 0x9877, - 0xC7EB: 0x8BF7, - 0xC7EC: 0x5E86, - 0xC7ED: 0x743C, - 0xC7EE: 0x7A77, - 0xC7EF: 0x79CB, - 0xC7F0: 0x4E18, - 0xC7F1: 0x90B1, - 0xC7F2: 0x7403, - 0xC7F3: 0x6C42, - 0xC7F4: 0x56DA, - 0xC7F5: 0x914B, - 0xC7F6: 0x6CC5, - 0xC7F7: 0x8D8B, - 0xC7F8: 0x533A, - 0xC7F9: 0x86C6, - 0xC7FA: 0x66F2, - 0xC7FB: 0x8EAF, - 0xC7FC: 0x5C48, - 0xC7FD: 0x9A71, - 0xC7FE: 0x6E20, - 0xC840: 0x83EE, - 0xC841: 0x83EF, - 0xC842: 0x83F3, - 0xC843: 0x83F4, - 0xC844: 0x83F5, - 0xC845: 0x83F6, - 0xC846: 0x83F7, - 0xC847: 0x83FA, - 0xC848: 0x83FB, - 0xC849: 0x83FC, - 0xC84A: 0x83FE, - 0xC84B: 0x83FF, - 0xC84C: 0x8400, - 0xC84D: 0x8402, - 0xC84E: 0x8405, - 0xC84F: 0x8407, - 0xC850: 0x8408, - 0xC851: 0x8409, - 0xC852: 0x840A, - 0xC853: 0x8410, - 0xC854: 0x8412, - 0xC855: 0x8413, - 0xC856: 0x8414, - 0xC857: 0x8415, - 0xC858: 0x8416, - 0xC859: 0x8417, - 0xC85A: 0x8419, - 0xC85B: 0x841A, - 0xC85C: 0x841B, - 0xC85D: 0x841E, - 0xC85E: 0x841F, - 0xC85F: 0x8420, - 0xC860: 0x8421, - 0xC861: 0x8422, - 0xC862: 0x8423, - 0xC863: 0x8429, - 0xC864: 0x842A, - 0xC865: 0x842B, - 0xC866: 0x842C, - 0xC867: 0x842D, - 0xC868: 0x842E, - 0xC869: 0x842F, - 0xC86A: 0x8430, - 0xC86B: 0x8432, - 0xC86C: 0x8433, - 0xC86D: 0x8434, - 0xC86E: 0x8435, - 0xC86F: 0x8436, - 0xC870: 0x8437, - 0xC871: 0x8439, - 0xC872: 0x843A, - 0xC873: 0x843B, - 0xC874: 0x843E, - 0xC875: 0x843F, - 0xC876: 0x8440, - 0xC877: 0x8441, - 0xC878: 0x8442, - 0xC879: 0x8443, - 0xC87A: 0x8444, - 0xC87B: 0x8445, - 0xC87C: 0x8447, - 0xC87D: 0x8448, - 0xC87E: 0x8449, - 0xC880: 0x844A, - 0xC881: 0x844B, - 0xC882: 0x844C, - 0xC883: 0x844D, - 0xC884: 0x844E, - 0xC885: 0x844F, - 0xC886: 0x8450, - 0xC887: 0x8452, - 0xC888: 0x8453, - 0xC889: 0x8454, - 0xC88A: 0x8455, - 0xC88B: 0x8456, - 0xC88C: 0x8458, - 0xC88D: 0x845D, - 0xC88E: 0x845E, - 0xC88F: 0x845F, - 0xC890: 0x8460, - 0xC891: 0x8462, - 0xC892: 0x8464, - 0xC893: 0x8465, - 0xC894: 0x8466, - 0xC895: 0x8467, - 0xC896: 0x8468, - 0xC897: 0x846A, - 0xC898: 0x846E, - 0xC899: 0x846F, - 0xC89A: 0x8470, - 0xC89B: 0x8472, - 0xC89C: 0x8474, - 0xC89D: 0x8477, - 0xC89E: 0x8479, - 0xC89F: 0x847B, - 0xC8A0: 0x847C, - 0xC8A1: 0x53D6, - 0xC8A2: 0x5A36, - 0xC8A3: 0x9F8B, - 0xC8A4: 0x8DA3, - 0xC8A5: 0x53BB, - 0xC8A6: 0x5708, - 0xC8A7: 0x98A7, - 0xC8A8: 0x6743, - 0xC8A9: 0x919B, - 0xC8AA: 0x6CC9, - 0xC8AB: 0x5168, - 0xC8AC: 0x75CA, - 0xC8AD: 0x62F3, - 0xC8AE: 0x72AC, - 0xC8AF: 0x5238, - 0xC8B0: 0x529D, - 0xC8B1: 0x7F3A, - 0xC8B2: 0x7094, - 0xC8B3: 0x7638, - 0xC8B4: 0x5374, - 0xC8B5: 0x9E4A, - 0xC8B6: 0x69B7, - 0xC8B7: 0x786E, - 0xC8B8: 0x96C0, - 0xC8B9: 0x88D9, - 0xC8BA: 0x7FA4, - 0xC8BB: 0x7136, - 0xC8BC: 0x71C3, - 0xC8BD: 0x5189, - 0xC8BE: 0x67D3, - 0xC8BF: 0x74E4, - 0xC8C0: 0x58E4, - 0xC8C1: 0x6518, - 0xC8C2: 0x56B7, - 0xC8C3: 0x8BA9, - 0xC8C4: 0x9976, - 0xC8C5: 0x6270, - 0xC8C6: 0x7ED5, - 0xC8C7: 0x60F9, - 0xC8C8: 0x70ED, - 0xC8C9: 0x58EC, - 0xC8CA: 0x4EC1, - 0xC8CB: 0x4EBA, - 0xC8CC: 0x5FCD, - 0xC8CD: 0x97E7, - 0xC8CE: 0x4EFB, - 0xC8CF: 0x8BA4, - 0xC8D0: 0x5203, - 0xC8D1: 0x598A, - 0xC8D2: 0x7EAB, - 0xC8D3: 0x6254, - 0xC8D4: 0x4ECD, - 0xC8D5: 0x65E5, - 0xC8D6: 0x620E, - 0xC8D7: 0x8338, - 0xC8D8: 0x84C9, - 0xC8D9: 0x8363, - 0xC8DA: 0x878D, - 0xC8DB: 0x7194, - 0xC8DC: 0x6EB6, - 0xC8DD: 0x5BB9, - 0xC8DE: 0x7ED2, - 0xC8DF: 0x5197, - 0xC8E0: 0x63C9, - 0xC8E1: 0x67D4, - 0xC8E2: 0x8089, - 0xC8E3: 0x8339, - 0xC8E4: 0x8815, - 0xC8E5: 0x5112, - 0xC8E6: 0x5B7A, - 0xC8E7: 0x5982, - 0xC8E8: 0x8FB1, - 0xC8E9: 0x4E73, - 0xC8EA: 0x6C5D, - 0xC8EB: 0x5165, - 0xC8EC: 0x8925, - 0xC8ED: 0x8F6F, - 0xC8EE: 0x962E, - 0xC8EF: 0x854A, - 0xC8F0: 0x745E, - 0xC8F1: 0x9510, - 0xC8F2: 0x95F0, - 0xC8F3: 0x6DA6, - 0xC8F4: 0x82E5, - 0xC8F5: 0x5F31, - 0xC8F6: 0x6492, - 0xC8F7: 0x6D12, - 0xC8F8: 0x8428, - 0xC8F9: 0x816E, - 0xC8FA: 0x9CC3, - 0xC8FB: 0x585E, - 0xC8FC: 0x8D5B, - 0xC8FD: 0x4E09, - 0xC8FE: 0x53C1, - 0xC940: 0x847D, - 0xC941: 0x847E, - 0xC942: 0x847F, - 0xC943: 0x8480, - 0xC944: 0x8481, - 0xC945: 0x8483, - 0xC946: 0x8484, - 0xC947: 0x8485, - 0xC948: 0x8486, - 0xC949: 0x848A, - 0xC94A: 0x848D, - 0xC94B: 0x848F, - 0xC94C: 0x8490, - 0xC94D: 0x8491, - 0xC94E: 0x8492, - 0xC94F: 0x8493, - 0xC950: 0x8494, - 0xC951: 0x8495, - 0xC952: 0x8496, - 0xC953: 0x8498, - 0xC954: 0x849A, - 0xC955: 0x849B, - 0xC956: 0x849D, - 0xC957: 0x849E, - 0xC958: 0x849F, - 0xC959: 0x84A0, - 0xC95A: 0x84A2, - 0xC95B: 0x84A3, - 0xC95C: 0x84A4, - 0xC95D: 0x84A5, - 0xC95E: 0x84A6, - 0xC95F: 0x84A7, - 0xC960: 0x84A8, - 0xC961: 0x84A9, - 0xC962: 0x84AA, - 0xC963: 0x84AB, - 0xC964: 0x84AC, - 0xC965: 0x84AD, - 0xC966: 0x84AE, - 0xC967: 0x84B0, - 0xC968: 0x84B1, - 0xC969: 0x84B3, - 0xC96A: 0x84B5, - 0xC96B: 0x84B6, - 0xC96C: 0x84B7, - 0xC96D: 0x84BB, - 0xC96E: 0x84BC, - 0xC96F: 0x84BE, - 0xC970: 0x84C0, - 0xC971: 0x84C2, - 0xC972: 0x84C3, - 0xC973: 0x84C5, - 0xC974: 0x84C6, - 0xC975: 0x84C7, - 0xC976: 0x84C8, - 0xC977: 0x84CB, - 0xC978: 0x84CC, - 0xC979: 0x84CE, - 0xC97A: 0x84CF, - 0xC97B: 0x84D2, - 0xC97C: 0x84D4, - 0xC97D: 0x84D5, - 0xC97E: 0x84D7, - 0xC980: 0x84D8, - 0xC981: 0x84D9, - 0xC982: 0x84DA, - 0xC983: 0x84DB, - 0xC984: 0x84DC, - 0xC985: 0x84DE, - 0xC986: 0x84E1, - 0xC987: 0x84E2, - 0xC988: 0x84E4, - 0xC989: 0x84E7, - 0xC98A: 0x84E8, - 0xC98B: 0x84E9, - 0xC98C: 0x84EA, - 0xC98D: 0x84EB, - 0xC98E: 0x84ED, - 0xC98F: 0x84EE, - 0xC990: 0x84EF, - 0xC991: 0x84F1, - 0xC992: 0x84F2, - 0xC993: 0x84F3, - 0xC994: 0x84F4, - 0xC995: 0x84F5, - 0xC996: 0x84F6, - 0xC997: 0x84F7, - 0xC998: 0x84F8, - 0xC999: 0x84F9, - 0xC99A: 0x84FA, - 0xC99B: 0x84FB, - 0xC99C: 0x84FD, - 0xC99D: 0x84FE, - 0xC99E: 0x8500, - 0xC99F: 0x8501, - 0xC9A0: 0x8502, - 0xC9A1: 0x4F1E, - 0xC9A2: 0x6563, - 0xC9A3: 0x6851, - 0xC9A4: 0x55D3, - 0xC9A5: 0x4E27, - 0xC9A6: 0x6414, - 0xC9A7: 0x9A9A, - 0xC9A8: 0x626B, - 0xC9A9: 0x5AC2, - 0xC9AA: 0x745F, - 0xC9AB: 0x8272, - 0xC9AC: 0x6DA9, - 0xC9AD: 0x68EE, - 0xC9AE: 0x50E7, - 0xC9AF: 0x838E, - 0xC9B0: 0x7802, - 0xC9B1: 0x6740, - 0xC9B2: 0x5239, - 0xC9B3: 0x6C99, - 0xC9B4: 0x7EB1, - 0xC9B5: 0x50BB, - 0xC9B6: 0x5565, - 0xC9B7: 0x715E, - 0xC9B8: 0x7B5B, - 0xC9B9: 0x6652, - 0xC9BA: 0x73CA, - 0xC9BB: 0x82EB, - 0xC9BC: 0x6749, - 0xC9BD: 0x5C71, - 0xC9BE: 0x5220, - 0xC9BF: 0x717D, - 0xC9C0: 0x886B, - 0xC9C1: 0x95EA, - 0xC9C2: 0x9655, - 0xC9C3: 0x64C5, - 0xC9C4: 0x8D61, - 0xC9C5: 0x81B3, - 0xC9C6: 0x5584, - 0xC9C7: 0x6C55, - 0xC9C8: 0x6247, - 0xC9C9: 0x7F2E, - 0xC9CA: 0x5892, - 0xC9CB: 0x4F24, - 0xC9CC: 0x5546, - 0xC9CD: 0x8D4F, - 0xC9CE: 0x664C, - 0xC9CF: 0x4E0A, - 0xC9D0: 0x5C1A, - 0xC9D1: 0x88F3, - 0xC9D2: 0x68A2, - 0xC9D3: 0x634E, - 0xC9D4: 0x7A0D, - 0xC9D5: 0x70E7, - 0xC9D6: 0x828D, - 0xC9D7: 0x52FA, - 0xC9D8: 0x97F6, - 0xC9D9: 0x5C11, - 0xC9DA: 0x54E8, - 0xC9DB: 0x90B5, - 0xC9DC: 0x7ECD, - 0xC9DD: 0x5962, - 0xC9DE: 0x8D4A, - 0xC9DF: 0x86C7, - 0xC9E0: 0x820C, - 0xC9E1: 0x820D, - 0xC9E2: 0x8D66, - 0xC9E3: 0x6444, - 0xC9E4: 0x5C04, - 0xC9E5: 0x6151, - 0xC9E6: 0x6D89, - 0xC9E7: 0x793E, - 0xC9E8: 0x8BBE, - 0xC9E9: 0x7837, - 0xC9EA: 0x7533, - 0xC9EB: 0x547B, - 0xC9EC: 0x4F38, - 0xC9ED: 0x8EAB, - 0xC9EE: 0x6DF1, - 0xC9EF: 0x5A20, - 0xC9F0: 0x7EC5, - 0xC9F1: 0x795E, - 0xC9F2: 0x6C88, - 0xC9F3: 0x5BA1, - 0xC9F4: 0x5A76, - 0xC9F5: 0x751A, - 0xC9F6: 0x80BE, - 0xC9F7: 0x614E, - 0xC9F8: 0x6E17, - 0xC9F9: 0x58F0, - 0xC9FA: 0x751F, - 0xC9FB: 0x7525, - 0xC9FC: 0x7272, - 0xC9FD: 0x5347, - 0xC9FE: 0x7EF3, - 0xCA40: 0x8503, - 0xCA41: 0x8504, - 0xCA42: 0x8505, - 0xCA43: 0x8506, - 0xCA44: 0x8507, - 0xCA45: 0x8508, - 0xCA46: 0x8509, - 0xCA47: 0x850A, - 0xCA48: 0x850B, - 0xCA49: 0x850D, - 0xCA4A: 0x850E, - 0xCA4B: 0x850F, - 0xCA4C: 0x8510, - 0xCA4D: 0x8512, - 0xCA4E: 0x8514, - 0xCA4F: 0x8515, - 0xCA50: 0x8516, - 0xCA51: 0x8518, - 0xCA52: 0x8519, - 0xCA53: 0x851B, - 0xCA54: 0x851C, - 0xCA55: 0x851D, - 0xCA56: 0x851E, - 0xCA57: 0x8520, - 0xCA58: 0x8522, - 0xCA59: 0x8523, - 0xCA5A: 0x8524, - 0xCA5B: 0x8525, - 0xCA5C: 0x8526, - 0xCA5D: 0x8527, - 0xCA5E: 0x8528, - 0xCA5F: 0x8529, - 0xCA60: 0x852A, - 0xCA61: 0x852D, - 0xCA62: 0x852E, - 0xCA63: 0x852F, - 0xCA64: 0x8530, - 0xCA65: 0x8531, - 0xCA66: 0x8532, - 0xCA67: 0x8533, - 0xCA68: 0x8534, - 0xCA69: 0x8535, - 0xCA6A: 0x8536, - 0xCA6B: 0x853E, - 0xCA6C: 0x853F, - 0xCA6D: 0x8540, - 0xCA6E: 0x8541, - 0xCA6F: 0x8542, - 0xCA70: 0x8544, - 0xCA71: 0x8545, - 0xCA72: 0x8546, - 0xCA73: 0x8547, - 0xCA74: 0x854B, - 0xCA75: 0x854C, - 0xCA76: 0x854D, - 0xCA77: 0x854E, - 0xCA78: 0x854F, - 0xCA79: 0x8550, - 0xCA7A: 0x8551, - 0xCA7B: 0x8552, - 0xCA7C: 0x8553, - 0xCA7D: 0x8554, - 0xCA7E: 0x8555, - 0xCA80: 0x8557, - 0xCA81: 0x8558, - 0xCA82: 0x855A, - 0xCA83: 0x855B, - 0xCA84: 0x855C, - 0xCA85: 0x855D, - 0xCA86: 0x855F, - 0xCA87: 0x8560, - 0xCA88: 0x8561, - 0xCA89: 0x8562, - 0xCA8A: 0x8563, - 0xCA8B: 0x8565, - 0xCA8C: 0x8566, - 0xCA8D: 0x8567, - 0xCA8E: 0x8569, - 0xCA8F: 0x856A, - 0xCA90: 0x856B, - 0xCA91: 0x856C, - 0xCA92: 0x856D, - 0xCA93: 0x856E, - 0xCA94: 0x856F, - 0xCA95: 0x8570, - 0xCA96: 0x8571, - 0xCA97: 0x8573, - 0xCA98: 0x8575, - 0xCA99: 0x8576, - 0xCA9A: 0x8577, - 0xCA9B: 0x8578, - 0xCA9C: 0x857C, - 0xCA9D: 0x857D, - 0xCA9E: 0x857F, - 0xCA9F: 0x8580, - 0xCAA0: 0x8581, - 0xCAA1: 0x7701, - 0xCAA2: 0x76DB, - 0xCAA3: 0x5269, - 0xCAA4: 0x80DC, - 0xCAA5: 0x5723, - 0xCAA6: 0x5E08, - 0xCAA7: 0x5931, - 0xCAA8: 0x72EE, - 0xCAA9: 0x65BD, - 0xCAAA: 0x6E7F, - 0xCAAB: 0x8BD7, - 0xCAAC: 0x5C38, - 0xCAAD: 0x8671, - 0xCAAE: 0x5341, - 0xCAAF: 0x77F3, - 0xCAB0: 0x62FE, - 0xCAB1: 0x65F6, - 0xCAB2: 0x4EC0, - 0xCAB3: 0x98DF, - 0xCAB4: 0x8680, - 0xCAB5: 0x5B9E, - 0xCAB6: 0x8BC6, - 0xCAB7: 0x53F2, - 0xCAB8: 0x77E2, - 0xCAB9: 0x4F7F, - 0xCABA: 0x5C4E, - 0xCABB: 0x9A76, - 0xCABC: 0x59CB, - 0xCABD: 0x5F0F, - 0xCABE: 0x793A, - 0xCABF: 0x58EB, - 0xCAC0: 0x4E16, - 0xCAC1: 0x67FF, - 0xCAC2: 0x4E8B, - 0xCAC3: 0x62ED, - 0xCAC4: 0x8A93, - 0xCAC5: 0x901D, - 0xCAC6: 0x52BF, - 0xCAC7: 0x662F, - 0xCAC8: 0x55DC, - 0xCAC9: 0x566C, - 0xCACA: 0x9002, - 0xCACB: 0x4ED5, - 0xCACC: 0x4F8D, - 0xCACD: 0x91CA, - 0xCACE: 0x9970, - 0xCACF: 0x6C0F, - 0xCAD0: 0x5E02, - 0xCAD1: 0x6043, - 0xCAD2: 0x5BA4, - 0xCAD3: 0x89C6, - 0xCAD4: 0x8BD5, - 0xCAD5: 0x6536, - 0xCAD6: 0x624B, - 0xCAD7: 0x9996, - 0xCAD8: 0x5B88, - 0xCAD9: 0x5BFF, - 0xCADA: 0x6388, - 0xCADB: 0x552E, - 0xCADC: 0x53D7, - 0xCADD: 0x7626, - 0xCADE: 0x517D, - 0xCADF: 0x852C, - 0xCAE0: 0x67A2, - 0xCAE1: 0x68B3, - 0xCAE2: 0x6B8A, - 0xCAE3: 0x6292, - 0xCAE4: 0x8F93, - 0xCAE5: 0x53D4, - 0xCAE6: 0x8212, - 0xCAE7: 0x6DD1, - 0xCAE8: 0x758F, - 0xCAE9: 0x4E66, - 0xCAEA: 0x8D4E, - 0xCAEB: 0x5B70, - 0xCAEC: 0x719F, - 0xCAED: 0x85AF, - 0xCAEE: 0x6691, - 0xCAEF: 0x66D9, - 0xCAF0: 0x7F72, - 0xCAF1: 0x8700, - 0xCAF2: 0x9ECD, - 0xCAF3: 0x9F20, - 0xCAF4: 0x5C5E, - 0xCAF5: 0x672F, - 0xCAF6: 0x8FF0, - 0xCAF7: 0x6811, - 0xCAF8: 0x675F, - 0xCAF9: 0x620D, - 0xCAFA: 0x7AD6, - 0xCAFB: 0x5885, - 0xCAFC: 0x5EB6, - 0xCAFD: 0x6570, - 0xCAFE: 0x6F31, - 0xCB40: 0x8582, - 0xCB41: 0x8583, - 0xCB42: 0x8586, - 0xCB43: 0x8588, - 0xCB44: 0x8589, - 0xCB45: 0x858A, - 0xCB46: 0x858B, - 0xCB47: 0x858C, - 0xCB48: 0x858D, - 0xCB49: 0x858E, - 0xCB4A: 0x8590, - 0xCB4B: 0x8591, - 0xCB4C: 0x8592, - 0xCB4D: 0x8593, - 0xCB4E: 0x8594, - 0xCB4F: 0x8595, - 0xCB50: 0x8596, - 0xCB51: 0x8597, - 0xCB52: 0x8598, - 0xCB53: 0x8599, - 0xCB54: 0x859A, - 0xCB55: 0x859D, - 0xCB56: 0x859E, - 0xCB57: 0x859F, - 0xCB58: 0x85A0, - 0xCB59: 0x85A1, - 0xCB5A: 0x85A2, - 0xCB5B: 0x85A3, - 0xCB5C: 0x85A5, - 0xCB5D: 0x85A6, - 0xCB5E: 0x85A7, - 0xCB5F: 0x85A9, - 0xCB60: 0x85AB, - 0xCB61: 0x85AC, - 0xCB62: 0x85AD, - 0xCB63: 0x85B1, - 0xCB64: 0x85B2, - 0xCB65: 0x85B3, - 0xCB66: 0x85B4, - 0xCB67: 0x85B5, - 0xCB68: 0x85B6, - 0xCB69: 0x85B8, - 0xCB6A: 0x85BA, - 0xCB6B: 0x85BB, - 0xCB6C: 0x85BC, - 0xCB6D: 0x85BD, - 0xCB6E: 0x85BE, - 0xCB6F: 0x85BF, - 0xCB70: 0x85C0, - 0xCB71: 0x85C2, - 0xCB72: 0x85C3, - 0xCB73: 0x85C4, - 0xCB74: 0x85C5, - 0xCB75: 0x85C6, - 0xCB76: 0x85C7, - 0xCB77: 0x85C8, - 0xCB78: 0x85CA, - 0xCB79: 0x85CB, - 0xCB7A: 0x85CC, - 0xCB7B: 0x85CD, - 0xCB7C: 0x85CE, - 0xCB7D: 0x85D1, - 0xCB7E: 0x85D2, - 0xCB80: 0x85D4, - 0xCB81: 0x85D6, - 0xCB82: 0x85D7, - 0xCB83: 0x85D8, - 0xCB84: 0x85D9, - 0xCB85: 0x85DA, - 0xCB86: 0x85DB, - 0xCB87: 0x85DD, - 0xCB88: 0x85DE, - 0xCB89: 0x85DF, - 0xCB8A: 0x85E0, - 0xCB8B: 0x85E1, - 0xCB8C: 0x85E2, - 0xCB8D: 0x85E3, - 0xCB8E: 0x85E5, - 0xCB8F: 0x85E6, - 0xCB90: 0x85E7, - 0xCB91: 0x85E8, - 0xCB92: 0x85EA, - 0xCB93: 0x85EB, - 0xCB94: 0x85EC, - 0xCB95: 0x85ED, - 0xCB96: 0x85EE, - 0xCB97: 0x85EF, - 0xCB98: 0x85F0, - 0xCB99: 0x85F1, - 0xCB9A: 0x85F2, - 0xCB9B: 0x85F3, - 0xCB9C: 0x85F4, - 0xCB9D: 0x85F5, - 0xCB9E: 0x85F6, - 0xCB9F: 0x85F7, - 0xCBA0: 0x85F8, - 0xCBA1: 0x6055, - 0xCBA2: 0x5237, - 0xCBA3: 0x800D, - 0xCBA4: 0x6454, - 0xCBA5: 0x8870, - 0xCBA6: 0x7529, - 0xCBA7: 0x5E05, - 0xCBA8: 0x6813, - 0xCBA9: 0x62F4, - 0xCBAA: 0x971C, - 0xCBAB: 0x53CC, - 0xCBAC: 0x723D, - 0xCBAD: 0x8C01, - 0xCBAE: 0x6C34, - 0xCBAF: 0x7761, - 0xCBB0: 0x7A0E, - 0xCBB1: 0x542E, - 0xCBB2: 0x77AC, - 0xCBB3: 0x987A, - 0xCBB4: 0x821C, - 0xCBB5: 0x8BF4, - 0xCBB6: 0x7855, - 0xCBB7: 0x6714, - 0xCBB8: 0x70C1, - 0xCBB9: 0x65AF, - 0xCBBA: 0x6495, - 0xCBBB: 0x5636, - 0xCBBC: 0x601D, - 0xCBBD: 0x79C1, - 0xCBBE: 0x53F8, - 0xCBBF: 0x4E1D, - 0xCBC0: 0x6B7B, - 0xCBC1: 0x8086, - 0xCBC2: 0x5BFA, - 0xCBC3: 0x55E3, - 0xCBC4: 0x56DB, - 0xCBC5: 0x4F3A, - 0xCBC6: 0x4F3C, - 0xCBC7: 0x9972, - 0xCBC8: 0x5DF3, - 0xCBC9: 0x677E, - 0xCBCA: 0x8038, - 0xCBCB: 0x6002, - 0xCBCC: 0x9882, - 0xCBCD: 0x9001, - 0xCBCE: 0x5B8B, - 0xCBCF: 0x8BBC, - 0xCBD0: 0x8BF5, - 0xCBD1: 0x641C, - 0xCBD2: 0x8258, - 0xCBD3: 0x64DE, - 0xCBD4: 0x55FD, - 0xCBD5: 0x82CF, - 0xCBD6: 0x9165, - 0xCBD7: 0x4FD7, - 0xCBD8: 0x7D20, - 0xCBD9: 0x901F, - 0xCBDA: 0x7C9F, - 0xCBDB: 0x50F3, - 0xCBDC: 0x5851, - 0xCBDD: 0x6EAF, - 0xCBDE: 0x5BBF, - 0xCBDF: 0x8BC9, - 0xCBE0: 0x8083, - 0xCBE1: 0x9178, - 0xCBE2: 0x849C, - 0xCBE3: 0x7B97, - 0xCBE4: 0x867D, - 0xCBE5: 0x968B, - 0xCBE6: 0x968F, - 0xCBE7: 0x7EE5, - 0xCBE8: 0x9AD3, - 0xCBE9: 0x788E, - 0xCBEA: 0x5C81, - 0xCBEB: 0x7A57, - 0xCBEC: 0x9042, - 0xCBED: 0x96A7, - 0xCBEE: 0x795F, - 0xCBEF: 0x5B59, - 0xCBF0: 0x635F, - 0xCBF1: 0x7B0B, - 0xCBF2: 0x84D1, - 0xCBF3: 0x68AD, - 0xCBF4: 0x5506, - 0xCBF5: 0x7F29, - 0xCBF6: 0x7410, - 0xCBF7: 0x7D22, - 0xCBF8: 0x9501, - 0xCBF9: 0x6240, - 0xCBFA: 0x584C, - 0xCBFB: 0x4ED6, - 0xCBFC: 0x5B83, - 0xCBFD: 0x5979, - 0xCBFE: 0x5854, - 0xCC40: 0x85F9, - 0xCC41: 0x85FA, - 0xCC42: 0x85FC, - 0xCC43: 0x85FD, - 0xCC44: 0x85FE, - 0xCC45: 0x8600, - 0xCC46: 0x8601, - 0xCC47: 0x8602, - 0xCC48: 0x8603, - 0xCC49: 0x8604, - 0xCC4A: 0x8606, - 0xCC4B: 0x8607, - 0xCC4C: 0x8608, - 0xCC4D: 0x8609, - 0xCC4E: 0x860A, - 0xCC4F: 0x860B, - 0xCC50: 0x860C, - 0xCC51: 0x860D, - 0xCC52: 0x860E, - 0xCC53: 0x860F, - 0xCC54: 0x8610, - 0xCC55: 0x8612, - 0xCC56: 0x8613, - 0xCC57: 0x8614, - 0xCC58: 0x8615, - 0xCC59: 0x8617, - 0xCC5A: 0x8618, - 0xCC5B: 0x8619, - 0xCC5C: 0x861A, - 0xCC5D: 0x861B, - 0xCC5E: 0x861C, - 0xCC5F: 0x861D, - 0xCC60: 0x861E, - 0xCC61: 0x861F, - 0xCC62: 0x8620, - 0xCC63: 0x8621, - 0xCC64: 0x8622, - 0xCC65: 0x8623, - 0xCC66: 0x8624, - 0xCC67: 0x8625, - 0xCC68: 0x8626, - 0xCC69: 0x8628, - 0xCC6A: 0x862A, - 0xCC6B: 0x862B, - 0xCC6C: 0x862C, - 0xCC6D: 0x862D, - 0xCC6E: 0x862E, - 0xCC6F: 0x862F, - 0xCC70: 0x8630, - 0xCC71: 0x8631, - 0xCC72: 0x8632, - 0xCC73: 0x8633, - 0xCC74: 0x8634, - 0xCC75: 0x8635, - 0xCC76: 0x8636, - 0xCC77: 0x8637, - 0xCC78: 0x8639, - 0xCC79: 0x863A, - 0xCC7A: 0x863B, - 0xCC7B: 0x863D, - 0xCC7C: 0x863E, - 0xCC7D: 0x863F, - 0xCC7E: 0x8640, - 0xCC80: 0x8641, - 0xCC81: 0x8642, - 0xCC82: 0x8643, - 0xCC83: 0x8644, - 0xCC84: 0x8645, - 0xCC85: 0x8646, - 0xCC86: 0x8647, - 0xCC87: 0x8648, - 0xCC88: 0x8649, - 0xCC89: 0x864A, - 0xCC8A: 0x864B, - 0xCC8B: 0x864C, - 0xCC8C: 0x8652, - 0xCC8D: 0x8653, - 0xCC8E: 0x8655, - 0xCC8F: 0x8656, - 0xCC90: 0x8657, - 0xCC91: 0x8658, - 0xCC92: 0x8659, - 0xCC93: 0x865B, - 0xCC94: 0x865C, - 0xCC95: 0x865D, - 0xCC96: 0x865F, - 0xCC97: 0x8660, - 0xCC98: 0x8661, - 0xCC99: 0x8663, - 0xCC9A: 0x8664, - 0xCC9B: 0x8665, - 0xCC9C: 0x8666, - 0xCC9D: 0x8667, - 0xCC9E: 0x8668, - 0xCC9F: 0x8669, - 0xCCA0: 0x866A, - 0xCCA1: 0x736D, - 0xCCA2: 0x631E, - 0xCCA3: 0x8E4B, - 0xCCA4: 0x8E0F, - 0xCCA5: 0x80CE, - 0xCCA6: 0x82D4, - 0xCCA7: 0x62AC, - 0xCCA8: 0x53F0, - 0xCCA9: 0x6CF0, - 0xCCAA: 0x915E, - 0xCCAB: 0x592A, - 0xCCAC: 0x6001, - 0xCCAD: 0x6C70, - 0xCCAE: 0x574D, - 0xCCAF: 0x644A, - 0xCCB0: 0x8D2A, - 0xCCB1: 0x762B, - 0xCCB2: 0x6EE9, - 0xCCB3: 0x575B, - 0xCCB4: 0x6A80, - 0xCCB5: 0x75F0, - 0xCCB6: 0x6F6D, - 0xCCB7: 0x8C2D, - 0xCCB8: 0x8C08, - 0xCCB9: 0x5766, - 0xCCBA: 0x6BEF, - 0xCCBB: 0x8892, - 0xCCBC: 0x78B3, - 0xCCBD: 0x63A2, - 0xCCBE: 0x53F9, - 0xCCBF: 0x70AD, - 0xCCC0: 0x6C64, - 0xCCC1: 0x5858, - 0xCCC2: 0x642A, - 0xCCC3: 0x5802, - 0xCCC4: 0x68E0, - 0xCCC5: 0x819B, - 0xCCC6: 0x5510, - 0xCCC7: 0x7CD6, - 0xCCC8: 0x5018, - 0xCCC9: 0x8EBA, - 0xCCCA: 0x6DCC, - 0xCCCB: 0x8D9F, - 0xCCCC: 0x70EB, - 0xCCCD: 0x638F, - 0xCCCE: 0x6D9B, - 0xCCCF: 0x6ED4, - 0xCCD0: 0x7EE6, - 0xCCD1: 0x8404, - 0xCCD2: 0x6843, - 0xCCD3: 0x9003, - 0xCCD4: 0x6DD8, - 0xCCD5: 0x9676, - 0xCCD6: 0x8BA8, - 0xCCD7: 0x5957, - 0xCCD8: 0x7279, - 0xCCD9: 0x85E4, - 0xCCDA: 0x817E, - 0xCCDB: 0x75BC, - 0xCCDC: 0x8A8A, - 0xCCDD: 0x68AF, - 0xCCDE: 0x5254, - 0xCCDF: 0x8E22, - 0xCCE0: 0x9511, - 0xCCE1: 0x63D0, - 0xCCE2: 0x9898, - 0xCCE3: 0x8E44, - 0xCCE4: 0x557C, - 0xCCE5: 0x4F53, - 0xCCE6: 0x66FF, - 0xCCE7: 0x568F, - 0xCCE8: 0x60D5, - 0xCCE9: 0x6D95, - 0xCCEA: 0x5243, - 0xCCEB: 0x5C49, - 0xCCEC: 0x5929, - 0xCCED: 0x6DFB, - 0xCCEE: 0x586B, - 0xCCEF: 0x7530, - 0xCCF0: 0x751C, - 0xCCF1: 0x606C, - 0xCCF2: 0x8214, - 0xCCF3: 0x8146, - 0xCCF4: 0x6311, - 0xCCF5: 0x6761, - 0xCCF6: 0x8FE2, - 0xCCF7: 0x773A, - 0xCCF8: 0x8DF3, - 0xCCF9: 0x8D34, - 0xCCFA: 0x94C1, - 0xCCFB: 0x5E16, - 0xCCFC: 0x5385, - 0xCCFD: 0x542C, - 0xCCFE: 0x70C3, - 0xCD40: 0x866D, - 0xCD41: 0x866F, - 0xCD42: 0x8670, - 0xCD43: 0x8672, - 0xCD44: 0x8673, - 0xCD45: 0x8674, - 0xCD46: 0x8675, - 0xCD47: 0x8676, - 0xCD48: 0x8677, - 0xCD49: 0x8678, - 0xCD4A: 0x8683, - 0xCD4B: 0x8684, - 0xCD4C: 0x8685, - 0xCD4D: 0x8686, - 0xCD4E: 0x8687, - 0xCD4F: 0x8688, - 0xCD50: 0x8689, - 0xCD51: 0x868E, - 0xCD52: 0x868F, - 0xCD53: 0x8690, - 0xCD54: 0x8691, - 0xCD55: 0x8692, - 0xCD56: 0x8694, - 0xCD57: 0x8696, - 0xCD58: 0x8697, - 0xCD59: 0x8698, - 0xCD5A: 0x8699, - 0xCD5B: 0x869A, - 0xCD5C: 0x869B, - 0xCD5D: 0x869E, - 0xCD5E: 0x869F, - 0xCD5F: 0x86A0, - 0xCD60: 0x86A1, - 0xCD61: 0x86A2, - 0xCD62: 0x86A5, - 0xCD63: 0x86A6, - 0xCD64: 0x86AB, - 0xCD65: 0x86AD, - 0xCD66: 0x86AE, - 0xCD67: 0x86B2, - 0xCD68: 0x86B3, - 0xCD69: 0x86B7, - 0xCD6A: 0x86B8, - 0xCD6B: 0x86B9, - 0xCD6C: 0x86BB, - 0xCD6D: 0x86BC, - 0xCD6E: 0x86BD, - 0xCD6F: 0x86BE, - 0xCD70: 0x86BF, - 0xCD71: 0x86C1, - 0xCD72: 0x86C2, - 0xCD73: 0x86C3, - 0xCD74: 0x86C5, - 0xCD75: 0x86C8, - 0xCD76: 0x86CC, - 0xCD77: 0x86CD, - 0xCD78: 0x86D2, - 0xCD79: 0x86D3, - 0xCD7A: 0x86D5, - 0xCD7B: 0x86D6, - 0xCD7C: 0x86D7, - 0xCD7D: 0x86DA, - 0xCD7E: 0x86DC, - 0xCD80: 0x86DD, - 0xCD81: 0x86E0, - 0xCD82: 0x86E1, - 0xCD83: 0x86E2, - 0xCD84: 0x86E3, - 0xCD85: 0x86E5, - 0xCD86: 0x86E6, - 0xCD87: 0x86E7, - 0xCD88: 0x86E8, - 0xCD89: 0x86EA, - 0xCD8A: 0x86EB, - 0xCD8B: 0x86EC, - 0xCD8C: 0x86EF, - 0xCD8D: 0x86F5, - 0xCD8E: 0x86F6, - 0xCD8F: 0x86F7, - 0xCD90: 0x86FA, - 0xCD91: 0x86FB, - 0xCD92: 0x86FC, - 0xCD93: 0x86FD, - 0xCD94: 0x86FF, - 0xCD95: 0x8701, - 0xCD96: 0x8704, - 0xCD97: 0x8705, - 0xCD98: 0x8706, - 0xCD99: 0x870B, - 0xCD9A: 0x870C, - 0xCD9B: 0x870E, - 0xCD9C: 0x870F, - 0xCD9D: 0x8710, - 0xCD9E: 0x8711, - 0xCD9F: 0x8714, - 0xCDA0: 0x8716, - 0xCDA1: 0x6C40, - 0xCDA2: 0x5EF7, - 0xCDA3: 0x505C, - 0xCDA4: 0x4EAD, - 0xCDA5: 0x5EAD, - 0xCDA6: 0x633A, - 0xCDA7: 0x8247, - 0xCDA8: 0x901A, - 0xCDA9: 0x6850, - 0xCDAA: 0x916E, - 0xCDAB: 0x77B3, - 0xCDAC: 0x540C, - 0xCDAD: 0x94DC, - 0xCDAE: 0x5F64, - 0xCDAF: 0x7AE5, - 0xCDB0: 0x6876, - 0xCDB1: 0x6345, - 0xCDB2: 0x7B52, - 0xCDB3: 0x7EDF, - 0xCDB4: 0x75DB, - 0xCDB5: 0x5077, - 0xCDB6: 0x6295, - 0xCDB7: 0x5934, - 0xCDB8: 0x900F, - 0xCDB9: 0x51F8, - 0xCDBA: 0x79C3, - 0xCDBB: 0x7A81, - 0xCDBC: 0x56FE, - 0xCDBD: 0x5F92, - 0xCDBE: 0x9014, - 0xCDBF: 0x6D82, - 0xCDC0: 0x5C60, - 0xCDC1: 0x571F, - 0xCDC2: 0x5410, - 0xCDC3: 0x5154, - 0xCDC4: 0x6E4D, - 0xCDC5: 0x56E2, - 0xCDC6: 0x63A8, - 0xCDC7: 0x9893, - 0xCDC8: 0x817F, - 0xCDC9: 0x8715, - 0xCDCA: 0x892A, - 0xCDCB: 0x9000, - 0xCDCC: 0x541E, - 0xCDCD: 0x5C6F, - 0xCDCE: 0x81C0, - 0xCDCF: 0x62D6, - 0xCDD0: 0x6258, - 0xCDD1: 0x8131, - 0xCDD2: 0x9E35, - 0xCDD3: 0x9640, - 0xCDD4: 0x9A6E, - 0xCDD5: 0x9A7C, - 0xCDD6: 0x692D, - 0xCDD7: 0x59A5, - 0xCDD8: 0x62D3, - 0xCDD9: 0x553E, - 0xCDDA: 0x6316, - 0xCDDB: 0x54C7, - 0xCDDC: 0x86D9, - 0xCDDD: 0x6D3C, - 0xCDDE: 0x5A03, - 0xCDDF: 0x74E6, - 0xCDE0: 0x889C, - 0xCDE1: 0x6B6A, - 0xCDE2: 0x5916, - 0xCDE3: 0x8C4C, - 0xCDE4: 0x5F2F, - 0xCDE5: 0x6E7E, - 0xCDE6: 0x73A9, - 0xCDE7: 0x987D, - 0xCDE8: 0x4E38, - 0xCDE9: 0x70F7, - 0xCDEA: 0x5B8C, - 0xCDEB: 0x7897, - 0xCDEC: 0x633D, - 0xCDED: 0x665A, - 0xCDEE: 0x7696, - 0xCDEF: 0x60CB, - 0xCDF0: 0x5B9B, - 0xCDF1: 0x5A49, - 0xCDF2: 0x4E07, - 0xCDF3: 0x8155, - 0xCDF4: 0x6C6A, - 0xCDF5: 0x738B, - 0xCDF6: 0x4EA1, - 0xCDF7: 0x6789, - 0xCDF8: 0x7F51, - 0xCDF9: 0x5F80, - 0xCDFA: 0x65FA, - 0xCDFB: 0x671B, - 0xCDFC: 0x5FD8, - 0xCDFD: 0x5984, - 0xCDFE: 0x5A01, - 0xCE40: 0x8719, - 0xCE41: 0x871B, - 0xCE42: 0x871D, - 0xCE43: 0x871F, - 0xCE44: 0x8720, - 0xCE45: 0x8724, - 0xCE46: 0x8726, - 0xCE47: 0x8727, - 0xCE48: 0x8728, - 0xCE49: 0x872A, - 0xCE4A: 0x872B, - 0xCE4B: 0x872C, - 0xCE4C: 0x872D, - 0xCE4D: 0x872F, - 0xCE4E: 0x8730, - 0xCE4F: 0x8732, - 0xCE50: 0x8733, - 0xCE51: 0x8735, - 0xCE52: 0x8736, - 0xCE53: 0x8738, - 0xCE54: 0x8739, - 0xCE55: 0x873A, - 0xCE56: 0x873C, - 0xCE57: 0x873D, - 0xCE58: 0x8740, - 0xCE59: 0x8741, - 0xCE5A: 0x8742, - 0xCE5B: 0x8743, - 0xCE5C: 0x8744, - 0xCE5D: 0x8745, - 0xCE5E: 0x8746, - 0xCE5F: 0x874A, - 0xCE60: 0x874B, - 0xCE61: 0x874D, - 0xCE62: 0x874F, - 0xCE63: 0x8750, - 0xCE64: 0x8751, - 0xCE65: 0x8752, - 0xCE66: 0x8754, - 0xCE67: 0x8755, - 0xCE68: 0x8756, - 0xCE69: 0x8758, - 0xCE6A: 0x875A, - 0xCE6B: 0x875B, - 0xCE6C: 0x875C, - 0xCE6D: 0x875D, - 0xCE6E: 0x875E, - 0xCE6F: 0x875F, - 0xCE70: 0x8761, - 0xCE71: 0x8762, - 0xCE72: 0x8766, - 0xCE73: 0x8767, - 0xCE74: 0x8768, - 0xCE75: 0x8769, - 0xCE76: 0x876A, - 0xCE77: 0x876B, - 0xCE78: 0x876C, - 0xCE79: 0x876D, - 0xCE7A: 0x876F, - 0xCE7B: 0x8771, - 0xCE7C: 0x8772, - 0xCE7D: 0x8773, - 0xCE7E: 0x8775, - 0xCE80: 0x8777, - 0xCE81: 0x8778, - 0xCE82: 0x8779, - 0xCE83: 0x877A, - 0xCE84: 0x877F, - 0xCE85: 0x8780, - 0xCE86: 0x8781, - 0xCE87: 0x8784, - 0xCE88: 0x8786, - 0xCE89: 0x8787, - 0xCE8A: 0x8789, - 0xCE8B: 0x878A, - 0xCE8C: 0x878C, - 0xCE8D: 0x878E, - 0xCE8E: 0x878F, - 0xCE8F: 0x8790, - 0xCE90: 0x8791, - 0xCE91: 0x8792, - 0xCE92: 0x8794, - 0xCE93: 0x8795, - 0xCE94: 0x8796, - 0xCE95: 0x8798, - 0xCE96: 0x8799, - 0xCE97: 0x879A, - 0xCE98: 0x879B, - 0xCE99: 0x879C, - 0xCE9A: 0x879D, - 0xCE9B: 0x879E, - 0xCE9C: 0x87A0, - 0xCE9D: 0x87A1, - 0xCE9E: 0x87A2, - 0xCE9F: 0x87A3, - 0xCEA0: 0x87A4, - 0xCEA1: 0x5DCD, - 0xCEA2: 0x5FAE, - 0xCEA3: 0x5371, - 0xCEA4: 0x97E6, - 0xCEA5: 0x8FDD, - 0xCEA6: 0x6845, - 0xCEA7: 0x56F4, - 0xCEA8: 0x552F, - 0xCEA9: 0x60DF, - 0xCEAA: 0x4E3A, - 0xCEAB: 0x6F4D, - 0xCEAC: 0x7EF4, - 0xCEAD: 0x82C7, - 0xCEAE: 0x840E, - 0xCEAF: 0x59D4, - 0xCEB0: 0x4F1F, - 0xCEB1: 0x4F2A, - 0xCEB2: 0x5C3E, - 0xCEB3: 0x7EAC, - 0xCEB4: 0x672A, - 0xCEB5: 0x851A, - 0xCEB6: 0x5473, - 0xCEB7: 0x754F, - 0xCEB8: 0x80C3, - 0xCEB9: 0x5582, - 0xCEBA: 0x9B4F, - 0xCEBB: 0x4F4D, - 0xCEBC: 0x6E2D, - 0xCEBD: 0x8C13, - 0xCEBE: 0x5C09, - 0xCEBF: 0x6170, - 0xCEC0: 0x536B, - 0xCEC1: 0x761F, - 0xCEC2: 0x6E29, - 0xCEC3: 0x868A, - 0xCEC4: 0x6587, - 0xCEC5: 0x95FB, - 0xCEC6: 0x7EB9, - 0xCEC7: 0x543B, - 0xCEC8: 0x7A33, - 0xCEC9: 0x7D0A, - 0xCECA: 0x95EE, - 0xCECB: 0x55E1, - 0xCECC: 0x7FC1, - 0xCECD: 0x74EE, - 0xCECE: 0x631D, - 0xCECF: 0x8717, - 0xCED0: 0x6DA1, - 0xCED1: 0x7A9D, - 0xCED2: 0x6211, - 0xCED3: 0x65A1, - 0xCED4: 0x5367, - 0xCED5: 0x63E1, - 0xCED6: 0x6C83, - 0xCED7: 0x5DEB, - 0xCED8: 0x545C, - 0xCED9: 0x94A8, - 0xCEDA: 0x4E4C, - 0xCEDB: 0x6C61, - 0xCEDC: 0x8BEC, - 0xCEDD: 0x5C4B, - 0xCEDE: 0x65E0, - 0xCEDF: 0x829C, - 0xCEE0: 0x68A7, - 0xCEE1: 0x543E, - 0xCEE2: 0x5434, - 0xCEE3: 0x6BCB, - 0xCEE4: 0x6B66, - 0xCEE5: 0x4E94, - 0xCEE6: 0x6342, - 0xCEE7: 0x5348, - 0xCEE8: 0x821E, - 0xCEE9: 0x4F0D, - 0xCEEA: 0x4FAE, - 0xCEEB: 0x575E, - 0xCEEC: 0x620A, - 0xCEED: 0x96FE, - 0xCEEE: 0x6664, - 0xCEEF: 0x7269, - 0xCEF0: 0x52FF, - 0xCEF1: 0x52A1, - 0xCEF2: 0x609F, - 0xCEF3: 0x8BEF, - 0xCEF4: 0x6614, - 0xCEF5: 0x7199, - 0xCEF6: 0x6790, - 0xCEF7: 0x897F, - 0xCEF8: 0x7852, - 0xCEF9: 0x77FD, - 0xCEFA: 0x6670, - 0xCEFB: 0x563B, - 0xCEFC: 0x5438, - 0xCEFD: 0x9521, - 0xCEFE: 0x727A, - 0xCF40: 0x87A5, - 0xCF41: 0x87A6, - 0xCF42: 0x87A7, - 0xCF43: 0x87A9, - 0xCF44: 0x87AA, - 0xCF45: 0x87AE, - 0xCF46: 0x87B0, - 0xCF47: 0x87B1, - 0xCF48: 0x87B2, - 0xCF49: 0x87B4, - 0xCF4A: 0x87B6, - 0xCF4B: 0x87B7, - 0xCF4C: 0x87B8, - 0xCF4D: 0x87B9, - 0xCF4E: 0x87BB, - 0xCF4F: 0x87BC, - 0xCF50: 0x87BE, - 0xCF51: 0x87BF, - 0xCF52: 0x87C1, - 0xCF53: 0x87C2, - 0xCF54: 0x87C3, - 0xCF55: 0x87C4, - 0xCF56: 0x87C5, - 0xCF57: 0x87C7, - 0xCF58: 0x87C8, - 0xCF59: 0x87C9, - 0xCF5A: 0x87CC, - 0xCF5B: 0x87CD, - 0xCF5C: 0x87CE, - 0xCF5D: 0x87CF, - 0xCF5E: 0x87D0, - 0xCF5F: 0x87D4, - 0xCF60: 0x87D5, - 0xCF61: 0x87D6, - 0xCF62: 0x87D7, - 0xCF63: 0x87D8, - 0xCF64: 0x87D9, - 0xCF65: 0x87DA, - 0xCF66: 0x87DC, - 0xCF67: 0x87DD, - 0xCF68: 0x87DE, - 0xCF69: 0x87DF, - 0xCF6A: 0x87E1, - 0xCF6B: 0x87E2, - 0xCF6C: 0x87E3, - 0xCF6D: 0x87E4, - 0xCF6E: 0x87E6, - 0xCF6F: 0x87E7, - 0xCF70: 0x87E8, - 0xCF71: 0x87E9, - 0xCF72: 0x87EB, - 0xCF73: 0x87EC, - 0xCF74: 0x87ED, - 0xCF75: 0x87EF, - 0xCF76: 0x87F0, - 0xCF77: 0x87F1, - 0xCF78: 0x87F2, - 0xCF79: 0x87F3, - 0xCF7A: 0x87F4, - 0xCF7B: 0x87F5, - 0xCF7C: 0x87F6, - 0xCF7D: 0x87F7, - 0xCF7E: 0x87F8, - 0xCF80: 0x87FA, - 0xCF81: 0x87FB, - 0xCF82: 0x87FC, - 0xCF83: 0x87FD, - 0xCF84: 0x87FF, - 0xCF85: 0x8800, - 0xCF86: 0x8801, - 0xCF87: 0x8802, - 0xCF88: 0x8804, - 0xCF89: 0x8805, - 0xCF8A: 0x8806, - 0xCF8B: 0x8807, - 0xCF8C: 0x8808, - 0xCF8D: 0x8809, - 0xCF8E: 0x880B, - 0xCF8F: 0x880C, - 0xCF90: 0x880D, - 0xCF91: 0x880E, - 0xCF92: 0x880F, - 0xCF93: 0x8810, - 0xCF94: 0x8811, - 0xCF95: 0x8812, - 0xCF96: 0x8814, - 0xCF97: 0x8817, - 0xCF98: 0x8818, - 0xCF99: 0x8819, - 0xCF9A: 0x881A, - 0xCF9B: 0x881C, - 0xCF9C: 0x881D, - 0xCF9D: 0x881E, - 0xCF9E: 0x881F, - 0xCF9F: 0x8820, - 0xCFA0: 0x8823, - 0xCFA1: 0x7A00, - 0xCFA2: 0x606F, - 0xCFA3: 0x5E0C, - 0xCFA4: 0x6089, - 0xCFA5: 0x819D, - 0xCFA6: 0x5915, - 0xCFA7: 0x60DC, - 0xCFA8: 0x7184, - 0xCFA9: 0x70EF, - 0xCFAA: 0x6EAA, - 0xCFAB: 0x6C50, - 0xCFAC: 0x7280, - 0xCFAD: 0x6A84, - 0xCFAE: 0x88AD, - 0xCFAF: 0x5E2D, - 0xCFB0: 0x4E60, - 0xCFB1: 0x5AB3, - 0xCFB2: 0x559C, - 0xCFB3: 0x94E3, - 0xCFB4: 0x6D17, - 0xCFB5: 0x7CFB, - 0xCFB6: 0x9699, - 0xCFB7: 0x620F, - 0xCFB8: 0x7EC6, - 0xCFB9: 0x778E, - 0xCFBA: 0x867E, - 0xCFBB: 0x5323, - 0xCFBC: 0x971E, - 0xCFBD: 0x8F96, - 0xCFBE: 0x6687, - 0xCFBF: 0x5CE1, - 0xCFC0: 0x4FA0, - 0xCFC1: 0x72ED, - 0xCFC2: 0x4E0B, - 0xCFC3: 0x53A6, - 0xCFC4: 0x590F, - 0xCFC5: 0x5413, - 0xCFC6: 0x6380, - 0xCFC7: 0x9528, - 0xCFC8: 0x5148, - 0xCFC9: 0x4ED9, - 0xCFCA: 0x9C9C, - 0xCFCB: 0x7EA4, - 0xCFCC: 0x54B8, - 0xCFCD: 0x8D24, - 0xCFCE: 0x8854, - 0xCFCF: 0x8237, - 0xCFD0: 0x95F2, - 0xCFD1: 0x6D8E, - 0xCFD2: 0x5F26, - 0xCFD3: 0x5ACC, - 0xCFD4: 0x663E, - 0xCFD5: 0x9669, - 0xCFD6: 0x73B0, - 0xCFD7: 0x732E, - 0xCFD8: 0x53BF, - 0xCFD9: 0x817A, - 0xCFDA: 0x9985, - 0xCFDB: 0x7FA1, - 0xCFDC: 0x5BAA, - 0xCFDD: 0x9677, - 0xCFDE: 0x9650, - 0xCFDF: 0x7EBF, - 0xCFE0: 0x76F8, - 0xCFE1: 0x53A2, - 0xCFE2: 0x9576, - 0xCFE3: 0x9999, - 0xCFE4: 0x7BB1, - 0xCFE5: 0x8944, - 0xCFE6: 0x6E58, - 0xCFE7: 0x4E61, - 0xCFE8: 0x7FD4, - 0xCFE9: 0x7965, - 0xCFEA: 0x8BE6, - 0xCFEB: 0x60F3, - 0xCFEC: 0x54CD, - 0xCFED: 0x4EAB, - 0xCFEE: 0x9879, - 0xCFEF: 0x5DF7, - 0xCFF0: 0x6A61, - 0xCFF1: 0x50CF, - 0xCFF2: 0x5411, - 0xCFF3: 0x8C61, - 0xCFF4: 0x8427, - 0xCFF5: 0x785D, - 0xCFF6: 0x9704, - 0xCFF7: 0x524A, - 0xCFF8: 0x54EE, - 0xCFF9: 0x56A3, - 0xCFFA: 0x9500, - 0xCFFB: 0x6D88, - 0xCFFC: 0x5BB5, - 0xCFFD: 0x6DC6, - 0xCFFE: 0x6653, - 0xD040: 0x8824, - 0xD041: 0x8825, - 0xD042: 0x8826, - 0xD043: 0x8827, - 0xD044: 0x8828, - 0xD045: 0x8829, - 0xD046: 0x882A, - 0xD047: 0x882B, - 0xD048: 0x882C, - 0xD049: 0x882D, - 0xD04A: 0x882E, - 0xD04B: 0x882F, - 0xD04C: 0x8830, - 0xD04D: 0x8831, - 0xD04E: 0x8833, - 0xD04F: 0x8834, - 0xD050: 0x8835, - 0xD051: 0x8836, - 0xD052: 0x8837, - 0xD053: 0x8838, - 0xD054: 0x883A, - 0xD055: 0x883B, - 0xD056: 0x883D, - 0xD057: 0x883E, - 0xD058: 0x883F, - 0xD059: 0x8841, - 0xD05A: 0x8842, - 0xD05B: 0x8843, - 0xD05C: 0x8846, - 0xD05D: 0x8847, - 0xD05E: 0x8848, - 0xD05F: 0x8849, - 0xD060: 0x884A, - 0xD061: 0x884B, - 0xD062: 0x884E, - 0xD063: 0x884F, - 0xD064: 0x8850, - 0xD065: 0x8851, - 0xD066: 0x8852, - 0xD067: 0x8853, - 0xD068: 0x8855, - 0xD069: 0x8856, - 0xD06A: 0x8858, - 0xD06B: 0x885A, - 0xD06C: 0x885B, - 0xD06D: 0x885C, - 0xD06E: 0x885D, - 0xD06F: 0x885E, - 0xD070: 0x885F, - 0xD071: 0x8860, - 0xD072: 0x8866, - 0xD073: 0x8867, - 0xD074: 0x886A, - 0xD075: 0x886D, - 0xD076: 0x886F, - 0xD077: 0x8871, - 0xD078: 0x8873, - 0xD079: 0x8874, - 0xD07A: 0x8875, - 0xD07B: 0x8876, - 0xD07C: 0x8878, - 0xD07D: 0x8879, - 0xD07E: 0x887A, - 0xD080: 0x887B, - 0xD081: 0x887C, - 0xD082: 0x8880, - 0xD083: 0x8883, - 0xD084: 0x8886, - 0xD085: 0x8887, - 0xD086: 0x8889, - 0xD087: 0x888A, - 0xD088: 0x888C, - 0xD089: 0x888E, - 0xD08A: 0x888F, - 0xD08B: 0x8890, - 0xD08C: 0x8891, - 0xD08D: 0x8893, - 0xD08E: 0x8894, - 0xD08F: 0x8895, - 0xD090: 0x8897, - 0xD091: 0x8898, - 0xD092: 0x8899, - 0xD093: 0x889A, - 0xD094: 0x889B, - 0xD095: 0x889D, - 0xD096: 0x889E, - 0xD097: 0x889F, - 0xD098: 0x88A0, - 0xD099: 0x88A1, - 0xD09A: 0x88A3, - 0xD09B: 0x88A5, - 0xD09C: 0x88A6, - 0xD09D: 0x88A7, - 0xD09E: 0x88A8, - 0xD09F: 0x88A9, - 0xD0A0: 0x88AA, - 0xD0A1: 0x5C0F, - 0xD0A2: 0x5B5D, - 0xD0A3: 0x6821, - 0xD0A4: 0x8096, - 0xD0A5: 0x5578, - 0xD0A6: 0x7B11, - 0xD0A7: 0x6548, - 0xD0A8: 0x6954, - 0xD0A9: 0x4E9B, - 0xD0AA: 0x6B47, - 0xD0AB: 0x874E, - 0xD0AC: 0x978B, - 0xD0AD: 0x534F, - 0xD0AE: 0x631F, - 0xD0AF: 0x643A, - 0xD0B0: 0x90AA, - 0xD0B1: 0x659C, - 0xD0B2: 0x80C1, - 0xD0B3: 0x8C10, - 0xD0B4: 0x5199, - 0xD0B5: 0x68B0, - 0xD0B6: 0x5378, - 0xD0B7: 0x87F9, - 0xD0B8: 0x61C8, - 0xD0B9: 0x6CC4, - 0xD0BA: 0x6CFB, - 0xD0BB: 0x8C22, - 0xD0BC: 0x5C51, - 0xD0BD: 0x85AA, - 0xD0BE: 0x82AF, - 0xD0BF: 0x950C, - 0xD0C0: 0x6B23, - 0xD0C1: 0x8F9B, - 0xD0C2: 0x65B0, - 0xD0C3: 0x5FFB, - 0xD0C4: 0x5FC3, - 0xD0C5: 0x4FE1, - 0xD0C6: 0x8845, - 0xD0C7: 0x661F, - 0xD0C8: 0x8165, - 0xD0C9: 0x7329, - 0xD0CA: 0x60FA, - 0xD0CB: 0x5174, - 0xD0CC: 0x5211, - 0xD0CD: 0x578B, - 0xD0CE: 0x5F62, - 0xD0CF: 0x90A2, - 0xD0D0: 0x884C, - 0xD0D1: 0x9192, - 0xD0D2: 0x5E78, - 0xD0D3: 0x674F, - 0xD0D4: 0x6027, - 0xD0D5: 0x59D3, - 0xD0D6: 0x5144, - 0xD0D7: 0x51F6, - 0xD0D8: 0x80F8, - 0xD0D9: 0x5308, - 0xD0DA: 0x6C79, - 0xD0DB: 0x96C4, - 0xD0DC: 0x718A, - 0xD0DD: 0x4F11, - 0xD0DE: 0x4FEE, - 0xD0DF: 0x7F9E, - 0xD0E0: 0x673D, - 0xD0E1: 0x55C5, - 0xD0E2: 0x9508, - 0xD0E3: 0x79C0, - 0xD0E4: 0x8896, - 0xD0E5: 0x7EE3, - 0xD0E6: 0x589F, - 0xD0E7: 0x620C, - 0xD0E8: 0x9700, - 0xD0E9: 0x865A, - 0xD0EA: 0x5618, - 0xD0EB: 0x987B, - 0xD0EC: 0x5F90, - 0xD0ED: 0x8BB8, - 0xD0EE: 0x84C4, - 0xD0EF: 0x9157, - 0xD0F0: 0x53D9, - 0xD0F1: 0x65ED, - 0xD0F2: 0x5E8F, - 0xD0F3: 0x755C, - 0xD0F4: 0x6064, - 0xD0F5: 0x7D6E, - 0xD0F6: 0x5A7F, - 0xD0F7: 0x7EEA, - 0xD0F8: 0x7EED, - 0xD0F9: 0x8F69, - 0xD0FA: 0x55A7, - 0xD0FB: 0x5BA3, - 0xD0FC: 0x60AC, - 0xD0FD: 0x65CB, - 0xD0FE: 0x7384, - 0xD140: 0x88AC, - 0xD141: 0x88AE, - 0xD142: 0x88AF, - 0xD143: 0x88B0, - 0xD144: 0x88B2, - 0xD145: 0x88B3, - 0xD146: 0x88B4, - 0xD147: 0x88B5, - 0xD148: 0x88B6, - 0xD149: 0x88B8, - 0xD14A: 0x88B9, - 0xD14B: 0x88BA, - 0xD14C: 0x88BB, - 0xD14D: 0x88BD, - 0xD14E: 0x88BE, - 0xD14F: 0x88BF, - 0xD150: 0x88C0, - 0xD151: 0x88C3, - 0xD152: 0x88C4, - 0xD153: 0x88C7, - 0xD154: 0x88C8, - 0xD155: 0x88CA, - 0xD156: 0x88CB, - 0xD157: 0x88CC, - 0xD158: 0x88CD, - 0xD159: 0x88CF, - 0xD15A: 0x88D0, - 0xD15B: 0x88D1, - 0xD15C: 0x88D3, - 0xD15D: 0x88D6, - 0xD15E: 0x88D7, - 0xD15F: 0x88DA, - 0xD160: 0x88DB, - 0xD161: 0x88DC, - 0xD162: 0x88DD, - 0xD163: 0x88DE, - 0xD164: 0x88E0, - 0xD165: 0x88E1, - 0xD166: 0x88E6, - 0xD167: 0x88E7, - 0xD168: 0x88E9, - 0xD169: 0x88EA, - 0xD16A: 0x88EB, - 0xD16B: 0x88EC, - 0xD16C: 0x88ED, - 0xD16D: 0x88EE, - 0xD16E: 0x88EF, - 0xD16F: 0x88F2, - 0xD170: 0x88F5, - 0xD171: 0x88F6, - 0xD172: 0x88F7, - 0xD173: 0x88FA, - 0xD174: 0x88FB, - 0xD175: 0x88FD, - 0xD176: 0x88FF, - 0xD177: 0x8900, - 0xD178: 0x8901, - 0xD179: 0x8903, - 0xD17A: 0x8904, - 0xD17B: 0x8905, - 0xD17C: 0x8906, - 0xD17D: 0x8907, - 0xD17E: 0x8908, - 0xD180: 0x8909, - 0xD181: 0x890B, - 0xD182: 0x890C, - 0xD183: 0x890D, - 0xD184: 0x890E, - 0xD185: 0x890F, - 0xD186: 0x8911, - 0xD187: 0x8914, - 0xD188: 0x8915, - 0xD189: 0x8916, - 0xD18A: 0x8917, - 0xD18B: 0x8918, - 0xD18C: 0x891C, - 0xD18D: 0x891D, - 0xD18E: 0x891E, - 0xD18F: 0x891F, - 0xD190: 0x8920, - 0xD191: 0x8922, - 0xD192: 0x8923, - 0xD193: 0x8924, - 0xD194: 0x8926, - 0xD195: 0x8927, - 0xD196: 0x8928, - 0xD197: 0x8929, - 0xD198: 0x892C, - 0xD199: 0x892D, - 0xD19A: 0x892E, - 0xD19B: 0x892F, - 0xD19C: 0x8931, - 0xD19D: 0x8932, - 0xD19E: 0x8933, - 0xD19F: 0x8935, - 0xD1A0: 0x8937, - 0xD1A1: 0x9009, - 0xD1A2: 0x7663, - 0xD1A3: 0x7729, - 0xD1A4: 0x7EDA, - 0xD1A5: 0x9774, - 0xD1A6: 0x859B, - 0xD1A7: 0x5B66, - 0xD1A8: 0x7A74, - 0xD1A9: 0x96EA, - 0xD1AA: 0x8840, - 0xD1AB: 0x52CB, - 0xD1AC: 0x718F, - 0xD1AD: 0x5FAA, - 0xD1AE: 0x65EC, - 0xD1AF: 0x8BE2, - 0xD1B0: 0x5BFB, - 0xD1B1: 0x9A6F, - 0xD1B2: 0x5DE1, - 0xD1B3: 0x6B89, - 0xD1B4: 0x6C5B, - 0xD1B5: 0x8BAD, - 0xD1B6: 0x8BAF, - 0xD1B7: 0x900A, - 0xD1B8: 0x8FC5, - 0xD1B9: 0x538B, - 0xD1BA: 0x62BC, - 0xD1BB: 0x9E26, - 0xD1BC: 0x9E2D, - 0xD1BD: 0x5440, - 0xD1BE: 0x4E2B, - 0xD1BF: 0x82BD, - 0xD1C0: 0x7259, - 0xD1C1: 0x869C, - 0xD1C2: 0x5D16, - 0xD1C3: 0x8859, - 0xD1C4: 0x6DAF, - 0xD1C5: 0x96C5, - 0xD1C6: 0x54D1, - 0xD1C7: 0x4E9A, - 0xD1C8: 0x8BB6, - 0xD1C9: 0x7109, - 0xD1CA: 0x54BD, - 0xD1CB: 0x9609, - 0xD1CC: 0x70DF, - 0xD1CD: 0x6DF9, - 0xD1CE: 0x76D0, - 0xD1CF: 0x4E25, - 0xD1D0: 0x7814, - 0xD1D1: 0x8712, - 0xD1D2: 0x5CA9, - 0xD1D3: 0x5EF6, - 0xD1D4: 0x8A00, - 0xD1D5: 0x989C, - 0xD1D6: 0x960E, - 0xD1D7: 0x708E, - 0xD1D8: 0x6CBF, - 0xD1D9: 0x5944, - 0xD1DA: 0x63A9, - 0xD1DB: 0x773C, - 0xD1DC: 0x884D, - 0xD1DD: 0x6F14, - 0xD1DE: 0x8273, - 0xD1DF: 0x5830, - 0xD1E0: 0x71D5, - 0xD1E1: 0x538C, - 0xD1E2: 0x781A, - 0xD1E3: 0x96C1, - 0xD1E4: 0x5501, - 0xD1E5: 0x5F66, - 0xD1E6: 0x7130, - 0xD1E7: 0x5BB4, - 0xD1E8: 0x8C1A, - 0xD1E9: 0x9A8C, - 0xD1EA: 0x6B83, - 0xD1EB: 0x592E, - 0xD1EC: 0x9E2F, - 0xD1ED: 0x79E7, - 0xD1EE: 0x6768, - 0xD1EF: 0x626C, - 0xD1F0: 0x4F6F, - 0xD1F1: 0x75A1, - 0xD1F2: 0x7F8A, - 0xD1F3: 0x6D0B, - 0xD1F4: 0x9633, - 0xD1F5: 0x6C27, - 0xD1F6: 0x4EF0, - 0xD1F7: 0x75D2, - 0xD1F8: 0x517B, - 0xD1F9: 0x6837, - 0xD1FA: 0x6F3E, - 0xD1FB: 0x9080, - 0xD1FC: 0x8170, - 0xD1FD: 0x5996, - 0xD1FE: 0x7476, - 0xD240: 0x8938, - 0xD241: 0x8939, - 0xD242: 0x893A, - 0xD243: 0x893B, - 0xD244: 0x893C, - 0xD245: 0x893D, - 0xD246: 0x893E, - 0xD247: 0x893F, - 0xD248: 0x8940, - 0xD249: 0x8942, - 0xD24A: 0x8943, - 0xD24B: 0x8945, - 0xD24C: 0x8946, - 0xD24D: 0x8947, - 0xD24E: 0x8948, - 0xD24F: 0x8949, - 0xD250: 0x894A, - 0xD251: 0x894B, - 0xD252: 0x894C, - 0xD253: 0x894D, - 0xD254: 0x894E, - 0xD255: 0x894F, - 0xD256: 0x8950, - 0xD257: 0x8951, - 0xD258: 0x8952, - 0xD259: 0x8953, - 0xD25A: 0x8954, - 0xD25B: 0x8955, - 0xD25C: 0x8956, - 0xD25D: 0x8957, - 0xD25E: 0x8958, - 0xD25F: 0x8959, - 0xD260: 0x895A, - 0xD261: 0x895B, - 0xD262: 0x895C, - 0xD263: 0x895D, - 0xD264: 0x8960, - 0xD265: 0x8961, - 0xD266: 0x8962, - 0xD267: 0x8963, - 0xD268: 0x8964, - 0xD269: 0x8965, - 0xD26A: 0x8967, - 0xD26B: 0x8968, - 0xD26C: 0x8969, - 0xD26D: 0x896A, - 0xD26E: 0x896B, - 0xD26F: 0x896C, - 0xD270: 0x896D, - 0xD271: 0x896E, - 0xD272: 0x896F, - 0xD273: 0x8970, - 0xD274: 0x8971, - 0xD275: 0x8972, - 0xD276: 0x8973, - 0xD277: 0x8974, - 0xD278: 0x8975, - 0xD279: 0x8976, - 0xD27A: 0x8977, - 0xD27B: 0x8978, - 0xD27C: 0x8979, - 0xD27D: 0x897A, - 0xD27E: 0x897C, - 0xD280: 0x897D, - 0xD281: 0x897E, - 0xD282: 0x8980, - 0xD283: 0x8982, - 0xD284: 0x8984, - 0xD285: 0x8985, - 0xD286: 0x8987, - 0xD287: 0x8988, - 0xD288: 0x8989, - 0xD289: 0x898A, - 0xD28A: 0x898B, - 0xD28B: 0x898C, - 0xD28C: 0x898D, - 0xD28D: 0x898E, - 0xD28E: 0x898F, - 0xD28F: 0x8990, - 0xD290: 0x8991, - 0xD291: 0x8992, - 0xD292: 0x8993, - 0xD293: 0x8994, - 0xD294: 0x8995, - 0xD295: 0x8996, - 0xD296: 0x8997, - 0xD297: 0x8998, - 0xD298: 0x8999, - 0xD299: 0x899A, - 0xD29A: 0x899B, - 0xD29B: 0x899C, - 0xD29C: 0x899D, - 0xD29D: 0x899E, - 0xD29E: 0x899F, - 0xD29F: 0x89A0, - 0xD2A0: 0x89A1, - 0xD2A1: 0x6447, - 0xD2A2: 0x5C27, - 0xD2A3: 0x9065, - 0xD2A4: 0x7A91, - 0xD2A5: 0x8C23, - 0xD2A6: 0x59DA, - 0xD2A7: 0x54AC, - 0xD2A8: 0x8200, - 0xD2A9: 0x836F, - 0xD2AA: 0x8981, - 0xD2AB: 0x8000, - 0xD2AC: 0x6930, - 0xD2AD: 0x564E, - 0xD2AE: 0x8036, - 0xD2AF: 0x7237, - 0xD2B0: 0x91CE, - 0xD2B1: 0x51B6, - 0xD2B2: 0x4E5F, - 0xD2B3: 0x9875, - 0xD2B4: 0x6396, - 0xD2B5: 0x4E1A, - 0xD2B6: 0x53F6, - 0xD2B7: 0x66F3, - 0xD2B8: 0x814B, - 0xD2B9: 0x591C, - 0xD2BA: 0x6DB2, - 0xD2BB: 0x4E00, - 0xD2BC: 0x58F9, - 0xD2BD: 0x533B, - 0xD2BE: 0x63D6, - 0xD2BF: 0x94F1, - 0xD2C0: 0x4F9D, - 0xD2C1: 0x4F0A, - 0xD2C2: 0x8863, - 0xD2C3: 0x9890, - 0xD2C4: 0x5937, - 0xD2C5: 0x9057, - 0xD2C6: 0x79FB, - 0xD2C7: 0x4EEA, - 0xD2C8: 0x80F0, - 0xD2C9: 0x7591, - 0xD2CA: 0x6C82, - 0xD2CB: 0x5B9C, - 0xD2CC: 0x59E8, - 0xD2CD: 0x5F5D, - 0xD2CE: 0x6905, - 0xD2CF: 0x8681, - 0xD2D0: 0x501A, - 0xD2D1: 0x5DF2, - 0xD2D2: 0x4E59, - 0xD2D3: 0x77E3, - 0xD2D4: 0x4EE5, - 0xD2D5: 0x827A, - 0xD2D6: 0x6291, - 0xD2D7: 0x6613, - 0xD2D8: 0x9091, - 0xD2D9: 0x5C79, - 0xD2DA: 0x4EBF, - 0xD2DB: 0x5F79, - 0xD2DC: 0x81C6, - 0xD2DD: 0x9038, - 0xD2DE: 0x8084, - 0xD2DF: 0x75AB, - 0xD2E0: 0x4EA6, - 0xD2E1: 0x88D4, - 0xD2E2: 0x610F, - 0xD2E3: 0x6BC5, - 0xD2E4: 0x5FC6, - 0xD2E5: 0x4E49, - 0xD2E6: 0x76CA, - 0xD2E7: 0x6EA2, - 0xD2E8: 0x8BE3, - 0xD2E9: 0x8BAE, - 0xD2EA: 0x8C0A, - 0xD2EB: 0x8BD1, - 0xD2EC: 0x5F02, - 0xD2ED: 0x7FFC, - 0xD2EE: 0x7FCC, - 0xD2EF: 0x7ECE, - 0xD2F0: 0x8335, - 0xD2F1: 0x836B, - 0xD2F2: 0x56E0, - 0xD2F3: 0x6BB7, - 0xD2F4: 0x97F3, - 0xD2F5: 0x9634, - 0xD2F6: 0x59FB, - 0xD2F7: 0x541F, - 0xD2F8: 0x94F6, - 0xD2F9: 0x6DEB, - 0xD2FA: 0x5BC5, - 0xD2FB: 0x996E, - 0xD2FC: 0x5C39, - 0xD2FD: 0x5F15, - 0xD2FE: 0x9690, - 0xD340: 0x89A2, - 0xD341: 0x89A3, - 0xD342: 0x89A4, - 0xD343: 0x89A5, - 0xD344: 0x89A6, - 0xD345: 0x89A7, - 0xD346: 0x89A8, - 0xD347: 0x89A9, - 0xD348: 0x89AA, - 0xD349: 0x89AB, - 0xD34A: 0x89AC, - 0xD34B: 0x89AD, - 0xD34C: 0x89AE, - 0xD34D: 0x89AF, - 0xD34E: 0x89B0, - 0xD34F: 0x89B1, - 0xD350: 0x89B2, - 0xD351: 0x89B3, - 0xD352: 0x89B4, - 0xD353: 0x89B5, - 0xD354: 0x89B6, - 0xD355: 0x89B7, - 0xD356: 0x89B8, - 0xD357: 0x89B9, - 0xD358: 0x89BA, - 0xD359: 0x89BB, - 0xD35A: 0x89BC, - 0xD35B: 0x89BD, - 0xD35C: 0x89BE, - 0xD35D: 0x89BF, - 0xD35E: 0x89C0, - 0xD35F: 0x89C3, - 0xD360: 0x89CD, - 0xD361: 0x89D3, - 0xD362: 0x89D4, - 0xD363: 0x89D5, - 0xD364: 0x89D7, - 0xD365: 0x89D8, - 0xD366: 0x89D9, - 0xD367: 0x89DB, - 0xD368: 0x89DD, - 0xD369: 0x89DF, - 0xD36A: 0x89E0, - 0xD36B: 0x89E1, - 0xD36C: 0x89E2, - 0xD36D: 0x89E4, - 0xD36E: 0x89E7, - 0xD36F: 0x89E8, - 0xD370: 0x89E9, - 0xD371: 0x89EA, - 0xD372: 0x89EC, - 0xD373: 0x89ED, - 0xD374: 0x89EE, - 0xD375: 0x89F0, - 0xD376: 0x89F1, - 0xD377: 0x89F2, - 0xD378: 0x89F4, - 0xD379: 0x89F5, - 0xD37A: 0x89F6, - 0xD37B: 0x89F7, - 0xD37C: 0x89F8, - 0xD37D: 0x89F9, - 0xD37E: 0x89FA, - 0xD380: 0x89FB, - 0xD381: 0x89FC, - 0xD382: 0x89FD, - 0xD383: 0x89FE, - 0xD384: 0x89FF, - 0xD385: 0x8A01, - 0xD386: 0x8A02, - 0xD387: 0x8A03, - 0xD388: 0x8A04, - 0xD389: 0x8A05, - 0xD38A: 0x8A06, - 0xD38B: 0x8A08, - 0xD38C: 0x8A09, - 0xD38D: 0x8A0A, - 0xD38E: 0x8A0B, - 0xD38F: 0x8A0C, - 0xD390: 0x8A0D, - 0xD391: 0x8A0E, - 0xD392: 0x8A0F, - 0xD393: 0x8A10, - 0xD394: 0x8A11, - 0xD395: 0x8A12, - 0xD396: 0x8A13, - 0xD397: 0x8A14, - 0xD398: 0x8A15, - 0xD399: 0x8A16, - 0xD39A: 0x8A17, - 0xD39B: 0x8A18, - 0xD39C: 0x8A19, - 0xD39D: 0x8A1A, - 0xD39E: 0x8A1B, - 0xD39F: 0x8A1C, - 0xD3A0: 0x8A1D, - 0xD3A1: 0x5370, - 0xD3A2: 0x82F1, - 0xD3A3: 0x6A31, - 0xD3A4: 0x5A74, - 0xD3A5: 0x9E70, - 0xD3A6: 0x5E94, - 0xD3A7: 0x7F28, - 0xD3A8: 0x83B9, - 0xD3A9: 0x8424, - 0xD3AA: 0x8425, - 0xD3AB: 0x8367, - 0xD3AC: 0x8747, - 0xD3AD: 0x8FCE, - 0xD3AE: 0x8D62, - 0xD3AF: 0x76C8, - 0xD3B0: 0x5F71, - 0xD3B1: 0x9896, - 0xD3B2: 0x786C, - 0xD3B3: 0x6620, - 0xD3B4: 0x54DF, - 0xD3B5: 0x62E5, - 0xD3B6: 0x4F63, - 0xD3B7: 0x81C3, - 0xD3B8: 0x75C8, - 0xD3B9: 0x5EB8, - 0xD3BA: 0x96CD, - 0xD3BB: 0x8E0A, - 0xD3BC: 0x86F9, - 0xD3BD: 0x548F, - 0xD3BE: 0x6CF3, - 0xD3BF: 0x6D8C, - 0xD3C0: 0x6C38, - 0xD3C1: 0x607F, - 0xD3C2: 0x52C7, - 0xD3C3: 0x7528, - 0xD3C4: 0x5E7D, - 0xD3C5: 0x4F18, - 0xD3C6: 0x60A0, - 0xD3C7: 0x5FE7, - 0xD3C8: 0x5C24, - 0xD3C9: 0x7531, - 0xD3CA: 0x90AE, - 0xD3CB: 0x94C0, - 0xD3CC: 0x72B9, - 0xD3CD: 0x6CB9, - 0xD3CE: 0x6E38, - 0xD3CF: 0x9149, - 0xD3D0: 0x6709, - 0xD3D1: 0x53CB, - 0xD3D2: 0x53F3, - 0xD3D3: 0x4F51, - 0xD3D4: 0x91C9, - 0xD3D5: 0x8BF1, - 0xD3D6: 0x53C8, - 0xD3D7: 0x5E7C, - 0xD3D8: 0x8FC2, - 0xD3D9: 0x6DE4, - 0xD3DA: 0x4E8E, - 0xD3DB: 0x76C2, - 0xD3DC: 0x6986, - 0xD3DD: 0x865E, - 0xD3DE: 0x611A, - 0xD3DF: 0x8206, - 0xD3E0: 0x4F59, - 0xD3E1: 0x4FDE, - 0xD3E2: 0x903E, - 0xD3E3: 0x9C7C, - 0xD3E4: 0x6109, - 0xD3E5: 0x6E1D, - 0xD3E6: 0x6E14, - 0xD3E7: 0x9685, - 0xD3E8: 0x4E88, - 0xD3E9: 0x5A31, - 0xD3EA: 0x96E8, - 0xD3EB: 0x4E0E, - 0xD3EC: 0x5C7F, - 0xD3ED: 0x79B9, - 0xD3EE: 0x5B87, - 0xD3EF: 0x8BED, - 0xD3F0: 0x7FBD, - 0xD3F1: 0x7389, - 0xD3F2: 0x57DF, - 0xD3F3: 0x828B, - 0xD3F4: 0x90C1, - 0xD3F5: 0x5401, - 0xD3F6: 0x9047, - 0xD3F7: 0x55BB, - 0xD3F8: 0x5CEA, - 0xD3F9: 0x5FA1, - 0xD3FA: 0x6108, - 0xD3FB: 0x6B32, - 0xD3FC: 0x72F1, - 0xD3FD: 0x80B2, - 0xD3FE: 0x8A89, - 0xD440: 0x8A1E, - 0xD441: 0x8A1F, - 0xD442: 0x8A20, - 0xD443: 0x8A21, - 0xD444: 0x8A22, - 0xD445: 0x8A23, - 0xD446: 0x8A24, - 0xD447: 0x8A25, - 0xD448: 0x8A26, - 0xD449: 0x8A27, - 0xD44A: 0x8A28, - 0xD44B: 0x8A29, - 0xD44C: 0x8A2A, - 0xD44D: 0x8A2B, - 0xD44E: 0x8A2C, - 0xD44F: 0x8A2D, - 0xD450: 0x8A2E, - 0xD451: 0x8A2F, - 0xD452: 0x8A30, - 0xD453: 0x8A31, - 0xD454: 0x8A32, - 0xD455: 0x8A33, - 0xD456: 0x8A34, - 0xD457: 0x8A35, - 0xD458: 0x8A36, - 0xD459: 0x8A37, - 0xD45A: 0x8A38, - 0xD45B: 0x8A39, - 0xD45C: 0x8A3A, - 0xD45D: 0x8A3B, - 0xD45E: 0x8A3C, - 0xD45F: 0x8A3D, - 0xD460: 0x8A3F, - 0xD461: 0x8A40, - 0xD462: 0x8A41, - 0xD463: 0x8A42, - 0xD464: 0x8A43, - 0xD465: 0x8A44, - 0xD466: 0x8A45, - 0xD467: 0x8A46, - 0xD468: 0x8A47, - 0xD469: 0x8A49, - 0xD46A: 0x8A4A, - 0xD46B: 0x8A4B, - 0xD46C: 0x8A4C, - 0xD46D: 0x8A4D, - 0xD46E: 0x8A4E, - 0xD46F: 0x8A4F, - 0xD470: 0x8A50, - 0xD471: 0x8A51, - 0xD472: 0x8A52, - 0xD473: 0x8A53, - 0xD474: 0x8A54, - 0xD475: 0x8A55, - 0xD476: 0x8A56, - 0xD477: 0x8A57, - 0xD478: 0x8A58, - 0xD479: 0x8A59, - 0xD47A: 0x8A5A, - 0xD47B: 0x8A5B, - 0xD47C: 0x8A5C, - 0xD47D: 0x8A5D, - 0xD47E: 0x8A5E, - 0xD480: 0x8A5F, - 0xD481: 0x8A60, - 0xD482: 0x8A61, - 0xD483: 0x8A62, - 0xD484: 0x8A63, - 0xD485: 0x8A64, - 0xD486: 0x8A65, - 0xD487: 0x8A66, - 0xD488: 0x8A67, - 0xD489: 0x8A68, - 0xD48A: 0x8A69, - 0xD48B: 0x8A6A, - 0xD48C: 0x8A6B, - 0xD48D: 0x8A6C, - 0xD48E: 0x8A6D, - 0xD48F: 0x8A6E, - 0xD490: 0x8A6F, - 0xD491: 0x8A70, - 0xD492: 0x8A71, - 0xD493: 0x8A72, - 0xD494: 0x8A73, - 0xD495: 0x8A74, - 0xD496: 0x8A75, - 0xD497: 0x8A76, - 0xD498: 0x8A77, - 0xD499: 0x8A78, - 0xD49A: 0x8A7A, - 0xD49B: 0x8A7B, - 0xD49C: 0x8A7C, - 0xD49D: 0x8A7D, - 0xD49E: 0x8A7E, - 0xD49F: 0x8A7F, - 0xD4A0: 0x8A80, - 0xD4A1: 0x6D74, - 0xD4A2: 0x5BD3, - 0xD4A3: 0x88D5, - 0xD4A4: 0x9884, - 0xD4A5: 0x8C6B, - 0xD4A6: 0x9A6D, - 0xD4A7: 0x9E33, - 0xD4A8: 0x6E0A, - 0xD4A9: 0x51A4, - 0xD4AA: 0x5143, - 0xD4AB: 0x57A3, - 0xD4AC: 0x8881, - 0xD4AD: 0x539F, - 0xD4AE: 0x63F4, - 0xD4AF: 0x8F95, - 0xD4B0: 0x56ED, - 0xD4B1: 0x5458, - 0xD4B2: 0x5706, - 0xD4B3: 0x733F, - 0xD4B4: 0x6E90, - 0xD4B5: 0x7F18, - 0xD4B6: 0x8FDC, - 0xD4B7: 0x82D1, - 0xD4B8: 0x613F, - 0xD4B9: 0x6028, - 0xD4BA: 0x9662, - 0xD4BB: 0x66F0, - 0xD4BC: 0x7EA6, - 0xD4BD: 0x8D8A, - 0xD4BE: 0x8DC3, - 0xD4BF: 0x94A5, - 0xD4C0: 0x5CB3, - 0xD4C1: 0x7CA4, - 0xD4C2: 0x6708, - 0xD4C3: 0x60A6, - 0xD4C4: 0x9605, - 0xD4C5: 0x8018, - 0xD4C6: 0x4E91, - 0xD4C7: 0x90E7, - 0xD4C8: 0x5300, - 0xD4C9: 0x9668, - 0xD4CA: 0x5141, - 0xD4CB: 0x8FD0, - 0xD4CC: 0x8574, - 0xD4CD: 0x915D, - 0xD4CE: 0x6655, - 0xD4CF: 0x97F5, - 0xD4D0: 0x5B55, - 0xD4D1: 0x531D, - 0xD4D2: 0x7838, - 0xD4D3: 0x6742, - 0xD4D4: 0x683D, - 0xD4D5: 0x54C9, - 0xD4D6: 0x707E, - 0xD4D7: 0x5BB0, - 0xD4D8: 0x8F7D, - 0xD4D9: 0x518D, - 0xD4DA: 0x5728, - 0xD4DB: 0x54B1, - 0xD4DC: 0x6512, - 0xD4DD: 0x6682, - 0xD4DE: 0x8D5E, - 0xD4DF: 0x8D43, - 0xD4E0: 0x810F, - 0xD4E1: 0x846C, - 0xD4E2: 0x906D, - 0xD4E3: 0x7CDF, - 0xD4E4: 0x51FF, - 0xD4E5: 0x85FB, - 0xD4E6: 0x67A3, - 0xD4E7: 0x65E9, - 0xD4E8: 0x6FA1, - 0xD4E9: 0x86A4, - 0xD4EA: 0x8E81, - 0xD4EB: 0x566A, - 0xD4EC: 0x9020, - 0xD4ED: 0x7682, - 0xD4EE: 0x7076, - 0xD4EF: 0x71E5, - 0xD4F0: 0x8D23, - 0xD4F1: 0x62E9, - 0xD4F2: 0x5219, - 0xD4F3: 0x6CFD, - 0xD4F4: 0x8D3C, - 0xD4F5: 0x600E, - 0xD4F6: 0x589E, - 0xD4F7: 0x618E, - 0xD4F8: 0x66FE, - 0xD4F9: 0x8D60, - 0xD4FA: 0x624E, - 0xD4FB: 0x55B3, - 0xD4FC: 0x6E23, - 0xD4FD: 0x672D, - 0xD4FE: 0x8F67, - 0xD540: 0x8A81, - 0xD541: 0x8A82, - 0xD542: 0x8A83, - 0xD543: 0x8A84, - 0xD544: 0x8A85, - 0xD545: 0x8A86, - 0xD546: 0x8A87, - 0xD547: 0x8A88, - 0xD548: 0x8A8B, - 0xD549: 0x8A8C, - 0xD54A: 0x8A8D, - 0xD54B: 0x8A8E, - 0xD54C: 0x8A8F, - 0xD54D: 0x8A90, - 0xD54E: 0x8A91, - 0xD54F: 0x8A92, - 0xD550: 0x8A94, - 0xD551: 0x8A95, - 0xD552: 0x8A96, - 0xD553: 0x8A97, - 0xD554: 0x8A98, - 0xD555: 0x8A99, - 0xD556: 0x8A9A, - 0xD557: 0x8A9B, - 0xD558: 0x8A9C, - 0xD559: 0x8A9D, - 0xD55A: 0x8A9E, - 0xD55B: 0x8A9F, - 0xD55C: 0x8AA0, - 0xD55D: 0x8AA1, - 0xD55E: 0x8AA2, - 0xD55F: 0x8AA3, - 0xD560: 0x8AA4, - 0xD561: 0x8AA5, - 0xD562: 0x8AA6, - 0xD563: 0x8AA7, - 0xD564: 0x8AA8, - 0xD565: 0x8AA9, - 0xD566: 0x8AAA, - 0xD567: 0x8AAB, - 0xD568: 0x8AAC, - 0xD569: 0x8AAD, - 0xD56A: 0x8AAE, - 0xD56B: 0x8AAF, - 0xD56C: 0x8AB0, - 0xD56D: 0x8AB1, - 0xD56E: 0x8AB2, - 0xD56F: 0x8AB3, - 0xD570: 0x8AB4, - 0xD571: 0x8AB5, - 0xD572: 0x8AB6, - 0xD573: 0x8AB7, - 0xD574: 0x8AB8, - 0xD575: 0x8AB9, - 0xD576: 0x8ABA, - 0xD577: 0x8ABB, - 0xD578: 0x8ABC, - 0xD579: 0x8ABD, - 0xD57A: 0x8ABE, - 0xD57B: 0x8ABF, - 0xD57C: 0x8AC0, - 0xD57D: 0x8AC1, - 0xD57E: 0x8AC2, - 0xD580: 0x8AC3, - 0xD581: 0x8AC4, - 0xD582: 0x8AC5, - 0xD583: 0x8AC6, - 0xD584: 0x8AC7, - 0xD585: 0x8AC8, - 0xD586: 0x8AC9, - 0xD587: 0x8ACA, - 0xD588: 0x8ACB, - 0xD589: 0x8ACC, - 0xD58A: 0x8ACD, - 0xD58B: 0x8ACE, - 0xD58C: 0x8ACF, - 0xD58D: 0x8AD0, - 0xD58E: 0x8AD1, - 0xD58F: 0x8AD2, - 0xD590: 0x8AD3, - 0xD591: 0x8AD4, - 0xD592: 0x8AD5, - 0xD593: 0x8AD6, - 0xD594: 0x8AD7, - 0xD595: 0x8AD8, - 0xD596: 0x8AD9, - 0xD597: 0x8ADA, - 0xD598: 0x8ADB, - 0xD599: 0x8ADC, - 0xD59A: 0x8ADD, - 0xD59B: 0x8ADE, - 0xD59C: 0x8ADF, - 0xD59D: 0x8AE0, - 0xD59E: 0x8AE1, - 0xD59F: 0x8AE2, - 0xD5A0: 0x8AE3, - 0xD5A1: 0x94E1, - 0xD5A2: 0x95F8, - 0xD5A3: 0x7728, - 0xD5A4: 0x6805, - 0xD5A5: 0x69A8, - 0xD5A6: 0x548B, - 0xD5A7: 0x4E4D, - 0xD5A8: 0x70B8, - 0xD5A9: 0x8BC8, - 0xD5AA: 0x6458, - 0xD5AB: 0x658B, - 0xD5AC: 0x5B85, - 0xD5AD: 0x7A84, - 0xD5AE: 0x503A, - 0xD5AF: 0x5BE8, - 0xD5B0: 0x77BB, - 0xD5B1: 0x6BE1, - 0xD5B2: 0x8A79, - 0xD5B3: 0x7C98, - 0xD5B4: 0x6CBE, - 0xD5B5: 0x76CF, - 0xD5B6: 0x65A9, - 0xD5B7: 0x8F97, - 0xD5B8: 0x5D2D, - 0xD5B9: 0x5C55, - 0xD5BA: 0x8638, - 0xD5BB: 0x6808, - 0xD5BC: 0x5360, - 0xD5BD: 0x6218, - 0xD5BE: 0x7AD9, - 0xD5BF: 0x6E5B, - 0xD5C0: 0x7EFD, - 0xD5C1: 0x6A1F, - 0xD5C2: 0x7AE0, - 0xD5C3: 0x5F70, - 0xD5C4: 0x6F33, - 0xD5C5: 0x5F20, - 0xD5C6: 0x638C, - 0xD5C7: 0x6DA8, - 0xD5C8: 0x6756, - 0xD5C9: 0x4E08, - 0xD5CA: 0x5E10, - 0xD5CB: 0x8D26, - 0xD5CC: 0x4ED7, - 0xD5CD: 0x80C0, - 0xD5CE: 0x7634, - 0xD5CF: 0x969C, - 0xD5D0: 0x62DB, - 0xD5D1: 0x662D, - 0xD5D2: 0x627E, - 0xD5D3: 0x6CBC, - 0xD5D4: 0x8D75, - 0xD5D5: 0x7167, - 0xD5D6: 0x7F69, - 0xD5D7: 0x5146, - 0xD5D8: 0x8087, - 0xD5D9: 0x53EC, - 0xD5DA: 0x906E, - 0xD5DB: 0x6298, - 0xD5DC: 0x54F2, - 0xD5DD: 0x86F0, - 0xD5DE: 0x8F99, - 0xD5DF: 0x8005, - 0xD5E0: 0x9517, - 0xD5E1: 0x8517, - 0xD5E2: 0x8FD9, - 0xD5E3: 0x6D59, - 0xD5E4: 0x73CD, - 0xD5E5: 0x659F, - 0xD5E6: 0x771F, - 0xD5E7: 0x7504, - 0xD5E8: 0x7827, - 0xD5E9: 0x81FB, - 0xD5EA: 0x8D1E, - 0xD5EB: 0x9488, - 0xD5EC: 0x4FA6, - 0xD5ED: 0x6795, - 0xD5EE: 0x75B9, - 0xD5EF: 0x8BCA, - 0xD5F0: 0x9707, - 0xD5F1: 0x632F, - 0xD5F2: 0x9547, - 0xD5F3: 0x9635, - 0xD5F4: 0x84B8, - 0xD5F5: 0x6323, - 0xD5F6: 0x7741, - 0xD5F7: 0x5F81, - 0xD5F8: 0x72F0, - 0xD5F9: 0x4E89, - 0xD5FA: 0x6014, - 0xD5FB: 0x6574, - 0xD5FC: 0x62EF, - 0xD5FD: 0x6B63, - 0xD5FE: 0x653F, - 0xD640: 0x8AE4, - 0xD641: 0x8AE5, - 0xD642: 0x8AE6, - 0xD643: 0x8AE7, - 0xD644: 0x8AE8, - 0xD645: 0x8AE9, - 0xD646: 0x8AEA, - 0xD647: 0x8AEB, - 0xD648: 0x8AEC, - 0xD649: 0x8AED, - 0xD64A: 0x8AEE, - 0xD64B: 0x8AEF, - 0xD64C: 0x8AF0, - 0xD64D: 0x8AF1, - 0xD64E: 0x8AF2, - 0xD64F: 0x8AF3, - 0xD650: 0x8AF4, - 0xD651: 0x8AF5, - 0xD652: 0x8AF6, - 0xD653: 0x8AF7, - 0xD654: 0x8AF8, - 0xD655: 0x8AF9, - 0xD656: 0x8AFA, - 0xD657: 0x8AFB, - 0xD658: 0x8AFC, - 0xD659: 0x8AFD, - 0xD65A: 0x8AFE, - 0xD65B: 0x8AFF, - 0xD65C: 0x8B00, - 0xD65D: 0x8B01, - 0xD65E: 0x8B02, - 0xD65F: 0x8B03, - 0xD660: 0x8B04, - 0xD661: 0x8B05, - 0xD662: 0x8B06, - 0xD663: 0x8B08, - 0xD664: 0x8B09, - 0xD665: 0x8B0A, - 0xD666: 0x8B0B, - 0xD667: 0x8B0C, - 0xD668: 0x8B0D, - 0xD669: 0x8B0E, - 0xD66A: 0x8B0F, - 0xD66B: 0x8B10, - 0xD66C: 0x8B11, - 0xD66D: 0x8B12, - 0xD66E: 0x8B13, - 0xD66F: 0x8B14, - 0xD670: 0x8B15, - 0xD671: 0x8B16, - 0xD672: 0x8B17, - 0xD673: 0x8B18, - 0xD674: 0x8B19, - 0xD675: 0x8B1A, - 0xD676: 0x8B1B, - 0xD677: 0x8B1C, - 0xD678: 0x8B1D, - 0xD679: 0x8B1E, - 0xD67A: 0x8B1F, - 0xD67B: 0x8B20, - 0xD67C: 0x8B21, - 0xD67D: 0x8B22, - 0xD67E: 0x8B23, - 0xD680: 0x8B24, - 0xD681: 0x8B25, - 0xD682: 0x8B27, - 0xD683: 0x8B28, - 0xD684: 0x8B29, - 0xD685: 0x8B2A, - 0xD686: 0x8B2B, - 0xD687: 0x8B2C, - 0xD688: 0x8B2D, - 0xD689: 0x8B2E, - 0xD68A: 0x8B2F, - 0xD68B: 0x8B30, - 0xD68C: 0x8B31, - 0xD68D: 0x8B32, - 0xD68E: 0x8B33, - 0xD68F: 0x8B34, - 0xD690: 0x8B35, - 0xD691: 0x8B36, - 0xD692: 0x8B37, - 0xD693: 0x8B38, - 0xD694: 0x8B39, - 0xD695: 0x8B3A, - 0xD696: 0x8B3B, - 0xD697: 0x8B3C, - 0xD698: 0x8B3D, - 0xD699: 0x8B3E, - 0xD69A: 0x8B3F, - 0xD69B: 0x8B40, - 0xD69C: 0x8B41, - 0xD69D: 0x8B42, - 0xD69E: 0x8B43, - 0xD69F: 0x8B44, - 0xD6A0: 0x8B45, - 0xD6A1: 0x5E27, - 0xD6A2: 0x75C7, - 0xD6A3: 0x90D1, - 0xD6A4: 0x8BC1, - 0xD6A5: 0x829D, - 0xD6A6: 0x679D, - 0xD6A7: 0x652F, - 0xD6A8: 0x5431, - 0xD6A9: 0x8718, - 0xD6AA: 0x77E5, - 0xD6AB: 0x80A2, - 0xD6AC: 0x8102, - 0xD6AD: 0x6C41, - 0xD6AE: 0x4E4B, - 0xD6AF: 0x7EC7, - 0xD6B0: 0x804C, - 0xD6B1: 0x76F4, - 0xD6B2: 0x690D, - 0xD6B3: 0x6B96, - 0xD6B4: 0x6267, - 0xD6B5: 0x503C, - 0xD6B6: 0x4F84, - 0xD6B7: 0x5740, - 0xD6B8: 0x6307, - 0xD6B9: 0x6B62, - 0xD6BA: 0x8DBE, - 0xD6BB: 0x53EA, - 0xD6BC: 0x65E8, - 0xD6BD: 0x7EB8, - 0xD6BE: 0x5FD7, - 0xD6BF: 0x631A, - 0xD6C0: 0x63B7, - 0xD6C1: 0x81F3, - 0xD6C2: 0x81F4, - 0xD6C3: 0x7F6E, - 0xD6C4: 0x5E1C, - 0xD6C5: 0x5CD9, - 0xD6C6: 0x5236, - 0xD6C7: 0x667A, - 0xD6C8: 0x79E9, - 0xD6C9: 0x7A1A, - 0xD6CA: 0x8D28, - 0xD6CB: 0x7099, - 0xD6CC: 0x75D4, - 0xD6CD: 0x6EDE, - 0xD6CE: 0x6CBB, - 0xD6CF: 0x7A92, - 0xD6D0: 0x4E2D, - 0xD6D1: 0x76C5, - 0xD6D2: 0x5FE0, - 0xD6D3: 0x949F, - 0xD6D4: 0x8877, - 0xD6D5: 0x7EC8, - 0xD6D6: 0x79CD, - 0xD6D7: 0x80BF, - 0xD6D8: 0x91CD, - 0xD6D9: 0x4EF2, - 0xD6DA: 0x4F17, - 0xD6DB: 0x821F, - 0xD6DC: 0x5468, - 0xD6DD: 0x5DDE, - 0xD6DE: 0x6D32, - 0xD6DF: 0x8BCC, - 0xD6E0: 0x7CA5, - 0xD6E1: 0x8F74, - 0xD6E2: 0x8098, - 0xD6E3: 0x5E1A, - 0xD6E4: 0x5492, - 0xD6E5: 0x76B1, - 0xD6E6: 0x5B99, - 0xD6E7: 0x663C, - 0xD6E8: 0x9AA4, - 0xD6E9: 0x73E0, - 0xD6EA: 0x682A, - 0xD6EB: 0x86DB, - 0xD6EC: 0x6731, - 0xD6ED: 0x732A, - 0xD6EE: 0x8BF8, - 0xD6EF: 0x8BDB, - 0xD6F0: 0x9010, - 0xD6F1: 0x7AF9, - 0xD6F2: 0x70DB, - 0xD6F3: 0x716E, - 0xD6F4: 0x62C4, - 0xD6F5: 0x77A9, - 0xD6F6: 0x5631, - 0xD6F7: 0x4E3B, - 0xD6F8: 0x8457, - 0xD6F9: 0x67F1, - 0xD6FA: 0x52A9, - 0xD6FB: 0x86C0, - 0xD6FC: 0x8D2E, - 0xD6FD: 0x94F8, - 0xD6FE: 0x7B51, - 0xD740: 0x8B46, - 0xD741: 0x8B47, - 0xD742: 0x8B48, - 0xD743: 0x8B49, - 0xD744: 0x8B4A, - 0xD745: 0x8B4B, - 0xD746: 0x8B4C, - 0xD747: 0x8B4D, - 0xD748: 0x8B4E, - 0xD749: 0x8B4F, - 0xD74A: 0x8B50, - 0xD74B: 0x8B51, - 0xD74C: 0x8B52, - 0xD74D: 0x8B53, - 0xD74E: 0x8B54, - 0xD74F: 0x8B55, - 0xD750: 0x8B56, - 0xD751: 0x8B57, - 0xD752: 0x8B58, - 0xD753: 0x8B59, - 0xD754: 0x8B5A, - 0xD755: 0x8B5B, - 0xD756: 0x8B5C, - 0xD757: 0x8B5D, - 0xD758: 0x8B5E, - 0xD759: 0x8B5F, - 0xD75A: 0x8B60, - 0xD75B: 0x8B61, - 0xD75C: 0x8B62, - 0xD75D: 0x8B63, - 0xD75E: 0x8B64, - 0xD75F: 0x8B65, - 0xD760: 0x8B67, - 0xD761: 0x8B68, - 0xD762: 0x8B69, - 0xD763: 0x8B6A, - 0xD764: 0x8B6B, - 0xD765: 0x8B6D, - 0xD766: 0x8B6E, - 0xD767: 0x8B6F, - 0xD768: 0x8B70, - 0xD769: 0x8B71, - 0xD76A: 0x8B72, - 0xD76B: 0x8B73, - 0xD76C: 0x8B74, - 0xD76D: 0x8B75, - 0xD76E: 0x8B76, - 0xD76F: 0x8B77, - 0xD770: 0x8B78, - 0xD771: 0x8B79, - 0xD772: 0x8B7A, - 0xD773: 0x8B7B, - 0xD774: 0x8B7C, - 0xD775: 0x8B7D, - 0xD776: 0x8B7E, - 0xD777: 0x8B7F, - 0xD778: 0x8B80, - 0xD779: 0x8B81, - 0xD77A: 0x8B82, - 0xD77B: 0x8B83, - 0xD77C: 0x8B84, - 0xD77D: 0x8B85, - 0xD77E: 0x8B86, - 0xD780: 0x8B87, - 0xD781: 0x8B88, - 0xD782: 0x8B89, - 0xD783: 0x8B8A, - 0xD784: 0x8B8B, - 0xD785: 0x8B8C, - 0xD786: 0x8B8D, - 0xD787: 0x8B8E, - 0xD788: 0x8B8F, - 0xD789: 0x8B90, - 0xD78A: 0x8B91, - 0xD78B: 0x8B92, - 0xD78C: 0x8B93, - 0xD78D: 0x8B94, - 0xD78E: 0x8B95, - 0xD78F: 0x8B96, - 0xD790: 0x8B97, - 0xD791: 0x8B98, - 0xD792: 0x8B99, - 0xD793: 0x8B9A, - 0xD794: 0x8B9B, - 0xD795: 0x8B9C, - 0xD796: 0x8B9D, - 0xD797: 0x8B9E, - 0xD798: 0x8B9F, - 0xD799: 0x8BAC, - 0xD79A: 0x8BB1, - 0xD79B: 0x8BBB, - 0xD79C: 0x8BC7, - 0xD79D: 0x8BD0, - 0xD79E: 0x8BEA, - 0xD79F: 0x8C09, - 0xD7A0: 0x8C1E, - 0xD7A1: 0x4F4F, - 0xD7A2: 0x6CE8, - 0xD7A3: 0x795D, - 0xD7A4: 0x9A7B, - 0xD7A5: 0x6293, - 0xD7A6: 0x722A, - 0xD7A7: 0x62FD, - 0xD7A8: 0x4E13, - 0xD7A9: 0x7816, - 0xD7AA: 0x8F6C, - 0xD7AB: 0x64B0, - 0xD7AC: 0x8D5A, - 0xD7AD: 0x7BC6, - 0xD7AE: 0x6869, - 0xD7AF: 0x5E84, - 0xD7B0: 0x88C5, - 0xD7B1: 0x5986, - 0xD7B2: 0x649E, - 0xD7B3: 0x58EE, - 0xD7B4: 0x72B6, - 0xD7B5: 0x690E, - 0xD7B6: 0x9525, - 0xD7B7: 0x8FFD, - 0xD7B8: 0x8D58, - 0xD7B9: 0x5760, - 0xD7BA: 0x7F00, - 0xD7BB: 0x8C06, - 0xD7BC: 0x51C6, - 0xD7BD: 0x6349, - 0xD7BE: 0x62D9, - 0xD7BF: 0x5353, - 0xD7C0: 0x684C, - 0xD7C1: 0x7422, - 0xD7C2: 0x8301, - 0xD7C3: 0x914C, - 0xD7C4: 0x5544, - 0xD7C5: 0x7740, - 0xD7C6: 0x707C, - 0xD7C7: 0x6D4A, - 0xD7C8: 0x5179, - 0xD7C9: 0x54A8, - 0xD7CA: 0x8D44, - 0xD7CB: 0x59FF, - 0xD7CC: 0x6ECB, - 0xD7CD: 0x6DC4, - 0xD7CE: 0x5B5C, - 0xD7CF: 0x7D2B, - 0xD7D0: 0x4ED4, - 0xD7D1: 0x7C7D, - 0xD7D2: 0x6ED3, - 0xD7D3: 0x5B50, - 0xD7D4: 0x81EA, - 0xD7D5: 0x6E0D, - 0xD7D6: 0x5B57, - 0xD7D7: 0x9B03, - 0xD7D8: 0x68D5, - 0xD7D9: 0x8E2A, - 0xD7DA: 0x5B97, - 0xD7DB: 0x7EFC, - 0xD7DC: 0x603B, - 0xD7DD: 0x7EB5, - 0xD7DE: 0x90B9, - 0xD7DF: 0x8D70, - 0xD7E0: 0x594F, - 0xD7E1: 0x63CD, - 0xD7E2: 0x79DF, - 0xD7E3: 0x8DB3, - 0xD7E4: 0x5352, - 0xD7E5: 0x65CF, - 0xD7E6: 0x7956, - 0xD7E7: 0x8BC5, - 0xD7E8: 0x963B, - 0xD7E9: 0x7EC4, - 0xD7EA: 0x94BB, - 0xD7EB: 0x7E82, - 0xD7EC: 0x5634, - 0xD7ED: 0x9189, - 0xD7EE: 0x6700, - 0xD7EF: 0x7F6A, - 0xD7F0: 0x5C0A, - 0xD7F1: 0x9075, - 0xD7F2: 0x6628, - 0xD7F3: 0x5DE6, - 0xD7F4: 0x4F50, - 0xD7F5: 0x67DE, - 0xD7F6: 0x505A, - 0xD7F7: 0x4F5C, - 0xD7F8: 0x5750, - 0xD7F9: 0x5EA7, - 0xD7FA: 0xE810, - 0xD7FB: 0xE811, - 0xD7FC: 0xE812, - 0xD7FD: 0xE813, - 0xD7FE: 0xE814, - 0xD840: 0x8C38, - 0xD841: 0x8C39, - 0xD842: 0x8C3A, - 0xD843: 0x8C3B, - 0xD844: 0x8C3C, - 0xD845: 0x8C3D, - 0xD846: 0x8C3E, - 0xD847: 0x8C3F, - 0xD848: 0x8C40, - 0xD849: 0x8C42, - 0xD84A: 0x8C43, - 0xD84B: 0x8C44, - 0xD84C: 0x8C45, - 0xD84D: 0x8C48, - 0xD84E: 0x8C4A, - 0xD84F: 0x8C4B, - 0xD850: 0x8C4D, - 0xD851: 0x8C4E, - 0xD852: 0x8C4F, - 0xD853: 0x8C50, - 0xD854: 0x8C51, - 0xD855: 0x8C52, - 0xD856: 0x8C53, - 0xD857: 0x8C54, - 0xD858: 0x8C56, - 0xD859: 0x8C57, - 0xD85A: 0x8C58, - 0xD85B: 0x8C59, - 0xD85C: 0x8C5B, - 0xD85D: 0x8C5C, - 0xD85E: 0x8C5D, - 0xD85F: 0x8C5E, - 0xD860: 0x8C5F, - 0xD861: 0x8C60, - 0xD862: 0x8C63, - 0xD863: 0x8C64, - 0xD864: 0x8C65, - 0xD865: 0x8C66, - 0xD866: 0x8C67, - 0xD867: 0x8C68, - 0xD868: 0x8C69, - 0xD869: 0x8C6C, - 0xD86A: 0x8C6D, - 0xD86B: 0x8C6E, - 0xD86C: 0x8C6F, - 0xD86D: 0x8C70, - 0xD86E: 0x8C71, - 0xD86F: 0x8C72, - 0xD870: 0x8C74, - 0xD871: 0x8C75, - 0xD872: 0x8C76, - 0xD873: 0x8C77, - 0xD874: 0x8C7B, - 0xD875: 0x8C7C, - 0xD876: 0x8C7D, - 0xD877: 0x8C7E, - 0xD878: 0x8C7F, - 0xD879: 0x8C80, - 0xD87A: 0x8C81, - 0xD87B: 0x8C83, - 0xD87C: 0x8C84, - 0xD87D: 0x8C86, - 0xD87E: 0x8C87, - 0xD880: 0x8C88, - 0xD881: 0x8C8B, - 0xD882: 0x8C8D, - 0xD883: 0x8C8E, - 0xD884: 0x8C8F, - 0xD885: 0x8C90, - 0xD886: 0x8C91, - 0xD887: 0x8C92, - 0xD888: 0x8C93, - 0xD889: 0x8C95, - 0xD88A: 0x8C96, - 0xD88B: 0x8C97, - 0xD88C: 0x8C99, - 0xD88D: 0x8C9A, - 0xD88E: 0x8C9B, - 0xD88F: 0x8C9C, - 0xD890: 0x8C9D, - 0xD891: 0x8C9E, - 0xD892: 0x8C9F, - 0xD893: 0x8CA0, - 0xD894: 0x8CA1, - 0xD895: 0x8CA2, - 0xD896: 0x8CA3, - 0xD897: 0x8CA4, - 0xD898: 0x8CA5, - 0xD899: 0x8CA6, - 0xD89A: 0x8CA7, - 0xD89B: 0x8CA8, - 0xD89C: 0x8CA9, - 0xD89D: 0x8CAA, - 0xD89E: 0x8CAB, - 0xD89F: 0x8CAC, - 0xD8A0: 0x8CAD, - 0xD8A1: 0x4E8D, - 0xD8A2: 0x4E0C, - 0xD8A3: 0x5140, - 0xD8A4: 0x4E10, - 0xD8A5: 0x5EFF, - 0xD8A6: 0x5345, - 0xD8A7: 0x4E15, - 0xD8A8: 0x4E98, - 0xD8A9: 0x4E1E, - 0xD8AA: 0x9B32, - 0xD8AB: 0x5B6C, - 0xD8AC: 0x5669, - 0xD8AD: 0x4E28, - 0xD8AE: 0x79BA, - 0xD8AF: 0x4E3F, - 0xD8B0: 0x5315, - 0xD8B1: 0x4E47, - 0xD8B2: 0x592D, - 0xD8B3: 0x723B, - 0xD8B4: 0x536E, - 0xD8B5: 0x6C10, - 0xD8B6: 0x56DF, - 0xD8B7: 0x80E4, - 0xD8B8: 0x9997, - 0xD8B9: 0x6BD3, - 0xD8BA: 0x777E, - 0xD8BB: 0x9F17, - 0xD8BC: 0x4E36, - 0xD8BD: 0x4E9F, - 0xD8BE: 0x9F10, - 0xD8BF: 0x4E5C, - 0xD8C0: 0x4E69, - 0xD8C1: 0x4E93, - 0xD8C2: 0x8288, - 0xD8C3: 0x5B5B, - 0xD8C4: 0x556C, - 0xD8C5: 0x560F, - 0xD8C6: 0x4EC4, - 0xD8C7: 0x538D, - 0xD8C8: 0x539D, - 0xD8C9: 0x53A3, - 0xD8CA: 0x53A5, - 0xD8CB: 0x53AE, - 0xD8CC: 0x9765, - 0xD8CD: 0x8D5D, - 0xD8CE: 0x531A, - 0xD8CF: 0x53F5, - 0xD8D0: 0x5326, - 0xD8D1: 0x532E, - 0xD8D2: 0x533E, - 0xD8D3: 0x8D5C, - 0xD8D4: 0x5366, - 0xD8D5: 0x5363, - 0xD8D6: 0x5202, - 0xD8D7: 0x5208, - 0xD8D8: 0x520E, - 0xD8D9: 0x522D, - 0xD8DA: 0x5233, - 0xD8DB: 0x523F, - 0xD8DC: 0x5240, - 0xD8DD: 0x524C, - 0xD8DE: 0x525E, - 0xD8DF: 0x5261, - 0xD8E0: 0x525C, - 0xD8E1: 0x84AF, - 0xD8E2: 0x527D, - 0xD8E3: 0x5282, - 0xD8E4: 0x5281, - 0xD8E5: 0x5290, - 0xD8E6: 0x5293, - 0xD8E7: 0x5182, - 0xD8E8: 0x7F54, - 0xD8E9: 0x4EBB, - 0xD8EA: 0x4EC3, - 0xD8EB: 0x4EC9, - 0xD8EC: 0x4EC2, - 0xD8ED: 0x4EE8, - 0xD8EE: 0x4EE1, - 0xD8EF: 0x4EEB, - 0xD8F0: 0x4EDE, - 0xD8F1: 0x4F1B, - 0xD8F2: 0x4EF3, - 0xD8F3: 0x4F22, - 0xD8F4: 0x4F64, - 0xD8F5: 0x4EF5, - 0xD8F6: 0x4F25, - 0xD8F7: 0x4F27, - 0xD8F8: 0x4F09, - 0xD8F9: 0x4F2B, - 0xD8FA: 0x4F5E, - 0xD8FB: 0x4F67, - 0xD8FC: 0x6538, - 0xD8FD: 0x4F5A, - 0xD8FE: 0x4F5D, - 0xD940: 0x8CAE, - 0xD941: 0x8CAF, - 0xD942: 0x8CB0, - 0xD943: 0x8CB1, - 0xD944: 0x8CB2, - 0xD945: 0x8CB3, - 0xD946: 0x8CB4, - 0xD947: 0x8CB5, - 0xD948: 0x8CB6, - 0xD949: 0x8CB7, - 0xD94A: 0x8CB8, - 0xD94B: 0x8CB9, - 0xD94C: 0x8CBA, - 0xD94D: 0x8CBB, - 0xD94E: 0x8CBC, - 0xD94F: 0x8CBD, - 0xD950: 0x8CBE, - 0xD951: 0x8CBF, - 0xD952: 0x8CC0, - 0xD953: 0x8CC1, - 0xD954: 0x8CC2, - 0xD955: 0x8CC3, - 0xD956: 0x8CC4, - 0xD957: 0x8CC5, - 0xD958: 0x8CC6, - 0xD959: 0x8CC7, - 0xD95A: 0x8CC8, - 0xD95B: 0x8CC9, - 0xD95C: 0x8CCA, - 0xD95D: 0x8CCB, - 0xD95E: 0x8CCC, - 0xD95F: 0x8CCD, - 0xD960: 0x8CCE, - 0xD961: 0x8CCF, - 0xD962: 0x8CD0, - 0xD963: 0x8CD1, - 0xD964: 0x8CD2, - 0xD965: 0x8CD3, - 0xD966: 0x8CD4, - 0xD967: 0x8CD5, - 0xD968: 0x8CD6, - 0xD969: 0x8CD7, - 0xD96A: 0x8CD8, - 0xD96B: 0x8CD9, - 0xD96C: 0x8CDA, - 0xD96D: 0x8CDB, - 0xD96E: 0x8CDC, - 0xD96F: 0x8CDD, - 0xD970: 0x8CDE, - 0xD971: 0x8CDF, - 0xD972: 0x8CE0, - 0xD973: 0x8CE1, - 0xD974: 0x8CE2, - 0xD975: 0x8CE3, - 0xD976: 0x8CE4, - 0xD977: 0x8CE5, - 0xD978: 0x8CE6, - 0xD979: 0x8CE7, - 0xD97A: 0x8CE8, - 0xD97B: 0x8CE9, - 0xD97C: 0x8CEA, - 0xD97D: 0x8CEB, - 0xD97E: 0x8CEC, - 0xD980: 0x8CED, - 0xD981: 0x8CEE, - 0xD982: 0x8CEF, - 0xD983: 0x8CF0, - 0xD984: 0x8CF1, - 0xD985: 0x8CF2, - 0xD986: 0x8CF3, - 0xD987: 0x8CF4, - 0xD988: 0x8CF5, - 0xD989: 0x8CF6, - 0xD98A: 0x8CF7, - 0xD98B: 0x8CF8, - 0xD98C: 0x8CF9, - 0xD98D: 0x8CFA, - 0xD98E: 0x8CFB, - 0xD98F: 0x8CFC, - 0xD990: 0x8CFD, - 0xD991: 0x8CFE, - 0xD992: 0x8CFF, - 0xD993: 0x8D00, - 0xD994: 0x8D01, - 0xD995: 0x8D02, - 0xD996: 0x8D03, - 0xD997: 0x8D04, - 0xD998: 0x8D05, - 0xD999: 0x8D06, - 0xD99A: 0x8D07, - 0xD99B: 0x8D08, - 0xD99C: 0x8D09, - 0xD99D: 0x8D0A, - 0xD99E: 0x8D0B, - 0xD99F: 0x8D0C, - 0xD9A0: 0x8D0D, - 0xD9A1: 0x4F5F, - 0xD9A2: 0x4F57, - 0xD9A3: 0x4F32, - 0xD9A4: 0x4F3D, - 0xD9A5: 0x4F76, - 0xD9A6: 0x4F74, - 0xD9A7: 0x4F91, - 0xD9A8: 0x4F89, - 0xD9A9: 0x4F83, - 0xD9AA: 0x4F8F, - 0xD9AB: 0x4F7E, - 0xD9AC: 0x4F7B, - 0xD9AD: 0x4FAA, - 0xD9AE: 0x4F7C, - 0xD9AF: 0x4FAC, - 0xD9B0: 0x4F94, - 0xD9B1: 0x4FE6, - 0xD9B2: 0x4FE8, - 0xD9B3: 0x4FEA, - 0xD9B4: 0x4FC5, - 0xD9B5: 0x4FDA, - 0xD9B6: 0x4FE3, - 0xD9B7: 0x4FDC, - 0xD9B8: 0x4FD1, - 0xD9B9: 0x4FDF, - 0xD9BA: 0x4FF8, - 0xD9BB: 0x5029, - 0xD9BC: 0x504C, - 0xD9BD: 0x4FF3, - 0xD9BE: 0x502C, - 0xD9BF: 0x500F, - 0xD9C0: 0x502E, - 0xD9C1: 0x502D, - 0xD9C2: 0x4FFE, - 0xD9C3: 0x501C, - 0xD9C4: 0x500C, - 0xD9C5: 0x5025, - 0xD9C6: 0x5028, - 0xD9C7: 0x507E, - 0xD9C8: 0x5043, - 0xD9C9: 0x5055, - 0xD9CA: 0x5048, - 0xD9CB: 0x504E, - 0xD9CC: 0x506C, - 0xD9CD: 0x507B, - 0xD9CE: 0x50A5, - 0xD9CF: 0x50A7, - 0xD9D0: 0x50A9, - 0xD9D1: 0x50BA, - 0xD9D2: 0x50D6, - 0xD9D3: 0x5106, - 0xD9D4: 0x50ED, - 0xD9D5: 0x50EC, - 0xD9D6: 0x50E6, - 0xD9D7: 0x50EE, - 0xD9D8: 0x5107, - 0xD9D9: 0x510B, - 0xD9DA: 0x4EDD, - 0xD9DB: 0x6C3D, - 0xD9DC: 0x4F58, - 0xD9DD: 0x4F65, - 0xD9DE: 0x4FCE, - 0xD9DF: 0x9FA0, - 0xD9E0: 0x6C46, - 0xD9E1: 0x7C74, - 0xD9E2: 0x516E, - 0xD9E3: 0x5DFD, - 0xD9E4: 0x9EC9, - 0xD9E5: 0x9998, - 0xD9E6: 0x5181, - 0xD9E7: 0x5914, - 0xD9E8: 0x52F9, - 0xD9E9: 0x530D, - 0xD9EA: 0x8A07, - 0xD9EB: 0x5310, - 0xD9EC: 0x51EB, - 0xD9ED: 0x5919, - 0xD9EE: 0x5155, - 0xD9EF: 0x4EA0, - 0xD9F0: 0x5156, - 0xD9F1: 0x4EB3, - 0xD9F2: 0x886E, - 0xD9F3: 0x88A4, - 0xD9F4: 0x4EB5, - 0xD9F5: 0x8114, - 0xD9F6: 0x88D2, - 0xD9F7: 0x7980, - 0xD9F8: 0x5B34, - 0xD9F9: 0x8803, - 0xD9FA: 0x7FB8, - 0xD9FB: 0x51AB, - 0xD9FC: 0x51B1, - 0xD9FD: 0x51BD, - 0xD9FE: 0x51BC, - 0xDA40: 0x8D0E, - 0xDA41: 0x8D0F, - 0xDA42: 0x8D10, - 0xDA43: 0x8D11, - 0xDA44: 0x8D12, - 0xDA45: 0x8D13, - 0xDA46: 0x8D14, - 0xDA47: 0x8D15, - 0xDA48: 0x8D16, - 0xDA49: 0x8D17, - 0xDA4A: 0x8D18, - 0xDA4B: 0x8D19, - 0xDA4C: 0x8D1A, - 0xDA4D: 0x8D1B, - 0xDA4E: 0x8D1C, - 0xDA4F: 0x8D20, - 0xDA50: 0x8D51, - 0xDA51: 0x8D52, - 0xDA52: 0x8D57, - 0xDA53: 0x8D5F, - 0xDA54: 0x8D65, - 0xDA55: 0x8D68, - 0xDA56: 0x8D69, - 0xDA57: 0x8D6A, - 0xDA58: 0x8D6C, - 0xDA59: 0x8D6E, - 0xDA5A: 0x8D6F, - 0xDA5B: 0x8D71, - 0xDA5C: 0x8D72, - 0xDA5D: 0x8D78, - 0xDA5E: 0x8D79, - 0xDA5F: 0x8D7A, - 0xDA60: 0x8D7B, - 0xDA61: 0x8D7C, - 0xDA62: 0x8D7D, - 0xDA63: 0x8D7E, - 0xDA64: 0x8D7F, - 0xDA65: 0x8D80, - 0xDA66: 0x8D82, - 0xDA67: 0x8D83, - 0xDA68: 0x8D86, - 0xDA69: 0x8D87, - 0xDA6A: 0x8D88, - 0xDA6B: 0x8D89, - 0xDA6C: 0x8D8C, - 0xDA6D: 0x8D8D, - 0xDA6E: 0x8D8E, - 0xDA6F: 0x8D8F, - 0xDA70: 0x8D90, - 0xDA71: 0x8D92, - 0xDA72: 0x8D93, - 0xDA73: 0x8D95, - 0xDA74: 0x8D96, - 0xDA75: 0x8D97, - 0xDA76: 0x8D98, - 0xDA77: 0x8D99, - 0xDA78: 0x8D9A, - 0xDA79: 0x8D9B, - 0xDA7A: 0x8D9C, - 0xDA7B: 0x8D9D, - 0xDA7C: 0x8D9E, - 0xDA7D: 0x8DA0, - 0xDA7E: 0x8DA1, - 0xDA80: 0x8DA2, - 0xDA81: 0x8DA4, - 0xDA82: 0x8DA5, - 0xDA83: 0x8DA6, - 0xDA84: 0x8DA7, - 0xDA85: 0x8DA8, - 0xDA86: 0x8DA9, - 0xDA87: 0x8DAA, - 0xDA88: 0x8DAB, - 0xDA89: 0x8DAC, - 0xDA8A: 0x8DAD, - 0xDA8B: 0x8DAE, - 0xDA8C: 0x8DAF, - 0xDA8D: 0x8DB0, - 0xDA8E: 0x8DB2, - 0xDA8F: 0x8DB6, - 0xDA90: 0x8DB7, - 0xDA91: 0x8DB9, - 0xDA92: 0x8DBB, - 0xDA93: 0x8DBD, - 0xDA94: 0x8DC0, - 0xDA95: 0x8DC1, - 0xDA96: 0x8DC2, - 0xDA97: 0x8DC5, - 0xDA98: 0x8DC7, - 0xDA99: 0x8DC8, - 0xDA9A: 0x8DC9, - 0xDA9B: 0x8DCA, - 0xDA9C: 0x8DCD, - 0xDA9D: 0x8DD0, - 0xDA9E: 0x8DD2, - 0xDA9F: 0x8DD3, - 0xDAA0: 0x8DD4, - 0xDAA1: 0x51C7, - 0xDAA2: 0x5196, - 0xDAA3: 0x51A2, - 0xDAA4: 0x51A5, - 0xDAA5: 0x8BA0, - 0xDAA6: 0x8BA6, - 0xDAA7: 0x8BA7, - 0xDAA8: 0x8BAA, - 0xDAA9: 0x8BB4, - 0xDAAA: 0x8BB5, - 0xDAAB: 0x8BB7, - 0xDAAC: 0x8BC2, - 0xDAAD: 0x8BC3, - 0xDAAE: 0x8BCB, - 0xDAAF: 0x8BCF, - 0xDAB0: 0x8BCE, - 0xDAB1: 0x8BD2, - 0xDAB2: 0x8BD3, - 0xDAB3: 0x8BD4, - 0xDAB4: 0x8BD6, - 0xDAB5: 0x8BD8, - 0xDAB6: 0x8BD9, - 0xDAB7: 0x8BDC, - 0xDAB8: 0x8BDF, - 0xDAB9: 0x8BE0, - 0xDABA: 0x8BE4, - 0xDABB: 0x8BE8, - 0xDABC: 0x8BE9, - 0xDABD: 0x8BEE, - 0xDABE: 0x8BF0, - 0xDABF: 0x8BF3, - 0xDAC0: 0x8BF6, - 0xDAC1: 0x8BF9, - 0xDAC2: 0x8BFC, - 0xDAC3: 0x8BFF, - 0xDAC4: 0x8C00, - 0xDAC5: 0x8C02, - 0xDAC6: 0x8C04, - 0xDAC7: 0x8C07, - 0xDAC8: 0x8C0C, - 0xDAC9: 0x8C0F, - 0xDACA: 0x8C11, - 0xDACB: 0x8C12, - 0xDACC: 0x8C14, - 0xDACD: 0x8C15, - 0xDACE: 0x8C16, - 0xDACF: 0x8C19, - 0xDAD0: 0x8C1B, - 0xDAD1: 0x8C18, - 0xDAD2: 0x8C1D, - 0xDAD3: 0x8C1F, - 0xDAD4: 0x8C20, - 0xDAD5: 0x8C21, - 0xDAD6: 0x8C25, - 0xDAD7: 0x8C27, - 0xDAD8: 0x8C2A, - 0xDAD9: 0x8C2B, - 0xDADA: 0x8C2E, - 0xDADB: 0x8C2F, - 0xDADC: 0x8C32, - 0xDADD: 0x8C33, - 0xDADE: 0x8C35, - 0xDADF: 0x8C36, - 0xDAE0: 0x5369, - 0xDAE1: 0x537A, - 0xDAE2: 0x961D, - 0xDAE3: 0x9622, - 0xDAE4: 0x9621, - 0xDAE5: 0x9631, - 0xDAE6: 0x962A, - 0xDAE7: 0x963D, - 0xDAE8: 0x963C, - 0xDAE9: 0x9642, - 0xDAEA: 0x9649, - 0xDAEB: 0x9654, - 0xDAEC: 0x965F, - 0xDAED: 0x9667, - 0xDAEE: 0x966C, - 0xDAEF: 0x9672, - 0xDAF0: 0x9674, - 0xDAF1: 0x9688, - 0xDAF2: 0x968D, - 0xDAF3: 0x9697, - 0xDAF4: 0x96B0, - 0xDAF5: 0x9097, - 0xDAF6: 0x909B, - 0xDAF7: 0x909D, - 0xDAF8: 0x9099, - 0xDAF9: 0x90AC, - 0xDAFA: 0x90A1, - 0xDAFB: 0x90B4, - 0xDAFC: 0x90B3, - 0xDAFD: 0x90B6, - 0xDAFE: 0x90BA, - 0xDB40: 0x8DD5, - 0xDB41: 0x8DD8, - 0xDB42: 0x8DD9, - 0xDB43: 0x8DDC, - 0xDB44: 0x8DE0, - 0xDB45: 0x8DE1, - 0xDB46: 0x8DE2, - 0xDB47: 0x8DE5, - 0xDB48: 0x8DE6, - 0xDB49: 0x8DE7, - 0xDB4A: 0x8DE9, - 0xDB4B: 0x8DED, - 0xDB4C: 0x8DEE, - 0xDB4D: 0x8DF0, - 0xDB4E: 0x8DF1, - 0xDB4F: 0x8DF2, - 0xDB50: 0x8DF4, - 0xDB51: 0x8DF6, - 0xDB52: 0x8DFC, - 0xDB53: 0x8DFE, - 0xDB54: 0x8DFF, - 0xDB55: 0x8E00, - 0xDB56: 0x8E01, - 0xDB57: 0x8E02, - 0xDB58: 0x8E03, - 0xDB59: 0x8E04, - 0xDB5A: 0x8E06, - 0xDB5B: 0x8E07, - 0xDB5C: 0x8E08, - 0xDB5D: 0x8E0B, - 0xDB5E: 0x8E0D, - 0xDB5F: 0x8E0E, - 0xDB60: 0x8E10, - 0xDB61: 0x8E11, - 0xDB62: 0x8E12, - 0xDB63: 0x8E13, - 0xDB64: 0x8E15, - 0xDB65: 0x8E16, - 0xDB66: 0x8E17, - 0xDB67: 0x8E18, - 0xDB68: 0x8E19, - 0xDB69: 0x8E1A, - 0xDB6A: 0x8E1B, - 0xDB6B: 0x8E1C, - 0xDB6C: 0x8E20, - 0xDB6D: 0x8E21, - 0xDB6E: 0x8E24, - 0xDB6F: 0x8E25, - 0xDB70: 0x8E26, - 0xDB71: 0x8E27, - 0xDB72: 0x8E28, - 0xDB73: 0x8E2B, - 0xDB74: 0x8E2D, - 0xDB75: 0x8E30, - 0xDB76: 0x8E32, - 0xDB77: 0x8E33, - 0xDB78: 0x8E34, - 0xDB79: 0x8E36, - 0xDB7A: 0x8E37, - 0xDB7B: 0x8E38, - 0xDB7C: 0x8E3B, - 0xDB7D: 0x8E3C, - 0xDB7E: 0x8E3E, - 0xDB80: 0x8E3F, - 0xDB81: 0x8E43, - 0xDB82: 0x8E45, - 0xDB83: 0x8E46, - 0xDB84: 0x8E4C, - 0xDB85: 0x8E4D, - 0xDB86: 0x8E4E, - 0xDB87: 0x8E4F, - 0xDB88: 0x8E50, - 0xDB89: 0x8E53, - 0xDB8A: 0x8E54, - 0xDB8B: 0x8E55, - 0xDB8C: 0x8E56, - 0xDB8D: 0x8E57, - 0xDB8E: 0x8E58, - 0xDB8F: 0x8E5A, - 0xDB90: 0x8E5B, - 0xDB91: 0x8E5C, - 0xDB92: 0x8E5D, - 0xDB93: 0x8E5E, - 0xDB94: 0x8E5F, - 0xDB95: 0x8E60, - 0xDB96: 0x8E61, - 0xDB97: 0x8E62, - 0xDB98: 0x8E63, - 0xDB99: 0x8E64, - 0xDB9A: 0x8E65, - 0xDB9B: 0x8E67, - 0xDB9C: 0x8E68, - 0xDB9D: 0x8E6A, - 0xDB9E: 0x8E6B, - 0xDB9F: 0x8E6E, - 0xDBA0: 0x8E71, - 0xDBA1: 0x90B8, - 0xDBA2: 0x90B0, - 0xDBA3: 0x90CF, - 0xDBA4: 0x90C5, - 0xDBA5: 0x90BE, - 0xDBA6: 0x90D0, - 0xDBA7: 0x90C4, - 0xDBA8: 0x90C7, - 0xDBA9: 0x90D3, - 0xDBAA: 0x90E6, - 0xDBAB: 0x90E2, - 0xDBAC: 0x90DC, - 0xDBAD: 0x90D7, - 0xDBAE: 0x90DB, - 0xDBAF: 0x90EB, - 0xDBB0: 0x90EF, - 0xDBB1: 0x90FE, - 0xDBB2: 0x9104, - 0xDBB3: 0x9122, - 0xDBB4: 0x911E, - 0xDBB5: 0x9123, - 0xDBB6: 0x9131, - 0xDBB7: 0x912F, - 0xDBB8: 0x9139, - 0xDBB9: 0x9143, - 0xDBBA: 0x9146, - 0xDBBB: 0x520D, - 0xDBBC: 0x5942, - 0xDBBD: 0x52A2, - 0xDBBE: 0x52AC, - 0xDBBF: 0x52AD, - 0xDBC0: 0x52BE, - 0xDBC1: 0x54FF, - 0xDBC2: 0x52D0, - 0xDBC3: 0x52D6, - 0xDBC4: 0x52F0, - 0xDBC5: 0x53DF, - 0xDBC6: 0x71EE, - 0xDBC7: 0x77CD, - 0xDBC8: 0x5EF4, - 0xDBC9: 0x51F5, - 0xDBCA: 0x51FC, - 0xDBCB: 0x9B2F, - 0xDBCC: 0x53B6, - 0xDBCD: 0x5F01, - 0xDBCE: 0x755A, - 0xDBCF: 0x5DEF, - 0xDBD0: 0x574C, - 0xDBD1: 0x57A9, - 0xDBD2: 0x57A1, - 0xDBD3: 0x587E, - 0xDBD4: 0x58BC, - 0xDBD5: 0x58C5, - 0xDBD6: 0x58D1, - 0xDBD7: 0x5729, - 0xDBD8: 0x572C, - 0xDBD9: 0x572A, - 0xDBDA: 0x5733, - 0xDBDB: 0x5739, - 0xDBDC: 0x572E, - 0xDBDD: 0x572F, - 0xDBDE: 0x575C, - 0xDBDF: 0x573B, - 0xDBE0: 0x5742, - 0xDBE1: 0x5769, - 0xDBE2: 0x5785, - 0xDBE3: 0x576B, - 0xDBE4: 0x5786, - 0xDBE5: 0x577C, - 0xDBE6: 0x577B, - 0xDBE7: 0x5768, - 0xDBE8: 0x576D, - 0xDBE9: 0x5776, - 0xDBEA: 0x5773, - 0xDBEB: 0x57AD, - 0xDBEC: 0x57A4, - 0xDBED: 0x578C, - 0xDBEE: 0x57B2, - 0xDBEF: 0x57CF, - 0xDBF0: 0x57A7, - 0xDBF1: 0x57B4, - 0xDBF2: 0x5793, - 0xDBF3: 0x57A0, - 0xDBF4: 0x57D5, - 0xDBF5: 0x57D8, - 0xDBF6: 0x57DA, - 0xDBF7: 0x57D9, - 0xDBF8: 0x57D2, - 0xDBF9: 0x57B8, - 0xDBFA: 0x57F4, - 0xDBFB: 0x57EF, - 0xDBFC: 0x57F8, - 0xDBFD: 0x57E4, - 0xDBFE: 0x57DD, - 0xDC40: 0x8E73, - 0xDC41: 0x8E75, - 0xDC42: 0x8E77, - 0xDC43: 0x8E78, - 0xDC44: 0x8E79, - 0xDC45: 0x8E7A, - 0xDC46: 0x8E7B, - 0xDC47: 0x8E7D, - 0xDC48: 0x8E7E, - 0xDC49: 0x8E80, - 0xDC4A: 0x8E82, - 0xDC4B: 0x8E83, - 0xDC4C: 0x8E84, - 0xDC4D: 0x8E86, - 0xDC4E: 0x8E88, - 0xDC4F: 0x8E89, - 0xDC50: 0x8E8A, - 0xDC51: 0x8E8B, - 0xDC52: 0x8E8C, - 0xDC53: 0x8E8D, - 0xDC54: 0x8E8E, - 0xDC55: 0x8E91, - 0xDC56: 0x8E92, - 0xDC57: 0x8E93, - 0xDC58: 0x8E95, - 0xDC59: 0x8E96, - 0xDC5A: 0x8E97, - 0xDC5B: 0x8E98, - 0xDC5C: 0x8E99, - 0xDC5D: 0x8E9A, - 0xDC5E: 0x8E9B, - 0xDC5F: 0x8E9D, - 0xDC60: 0x8E9F, - 0xDC61: 0x8EA0, - 0xDC62: 0x8EA1, - 0xDC63: 0x8EA2, - 0xDC64: 0x8EA3, - 0xDC65: 0x8EA4, - 0xDC66: 0x8EA5, - 0xDC67: 0x8EA6, - 0xDC68: 0x8EA7, - 0xDC69: 0x8EA8, - 0xDC6A: 0x8EA9, - 0xDC6B: 0x8EAA, - 0xDC6C: 0x8EAD, - 0xDC6D: 0x8EAE, - 0xDC6E: 0x8EB0, - 0xDC6F: 0x8EB1, - 0xDC70: 0x8EB3, - 0xDC71: 0x8EB4, - 0xDC72: 0x8EB5, - 0xDC73: 0x8EB6, - 0xDC74: 0x8EB7, - 0xDC75: 0x8EB8, - 0xDC76: 0x8EB9, - 0xDC77: 0x8EBB, - 0xDC78: 0x8EBC, - 0xDC79: 0x8EBD, - 0xDC7A: 0x8EBE, - 0xDC7B: 0x8EBF, - 0xDC7C: 0x8EC0, - 0xDC7D: 0x8EC1, - 0xDC7E: 0x8EC2, - 0xDC80: 0x8EC3, - 0xDC81: 0x8EC4, - 0xDC82: 0x8EC5, - 0xDC83: 0x8EC6, - 0xDC84: 0x8EC7, - 0xDC85: 0x8EC8, - 0xDC86: 0x8EC9, - 0xDC87: 0x8ECA, - 0xDC88: 0x8ECB, - 0xDC89: 0x8ECC, - 0xDC8A: 0x8ECD, - 0xDC8B: 0x8ECF, - 0xDC8C: 0x8ED0, - 0xDC8D: 0x8ED1, - 0xDC8E: 0x8ED2, - 0xDC8F: 0x8ED3, - 0xDC90: 0x8ED4, - 0xDC91: 0x8ED5, - 0xDC92: 0x8ED6, - 0xDC93: 0x8ED7, - 0xDC94: 0x8ED8, - 0xDC95: 0x8ED9, - 0xDC96: 0x8EDA, - 0xDC97: 0x8EDB, - 0xDC98: 0x8EDC, - 0xDC99: 0x8EDD, - 0xDC9A: 0x8EDE, - 0xDC9B: 0x8EDF, - 0xDC9C: 0x8EE0, - 0xDC9D: 0x8EE1, - 0xDC9E: 0x8EE2, - 0xDC9F: 0x8EE3, - 0xDCA0: 0x8EE4, - 0xDCA1: 0x580B, - 0xDCA2: 0x580D, - 0xDCA3: 0x57FD, - 0xDCA4: 0x57ED, - 0xDCA5: 0x5800, - 0xDCA6: 0x581E, - 0xDCA7: 0x5819, - 0xDCA8: 0x5844, - 0xDCA9: 0x5820, - 0xDCAA: 0x5865, - 0xDCAB: 0x586C, - 0xDCAC: 0x5881, - 0xDCAD: 0x5889, - 0xDCAE: 0x589A, - 0xDCAF: 0x5880, - 0xDCB0: 0x99A8, - 0xDCB1: 0x9F19, - 0xDCB2: 0x61FF, - 0xDCB3: 0x8279, - 0xDCB4: 0x827D, - 0xDCB5: 0x827F, - 0xDCB6: 0x828F, - 0xDCB7: 0x828A, - 0xDCB8: 0x82A8, - 0xDCB9: 0x8284, - 0xDCBA: 0x828E, - 0xDCBB: 0x8291, - 0xDCBC: 0x8297, - 0xDCBD: 0x8299, - 0xDCBE: 0x82AB, - 0xDCBF: 0x82B8, - 0xDCC0: 0x82BE, - 0xDCC1: 0x82B0, - 0xDCC2: 0x82C8, - 0xDCC3: 0x82CA, - 0xDCC4: 0x82E3, - 0xDCC5: 0x8298, - 0xDCC6: 0x82B7, - 0xDCC7: 0x82AE, - 0xDCC8: 0x82CB, - 0xDCC9: 0x82CC, - 0xDCCA: 0x82C1, - 0xDCCB: 0x82A9, - 0xDCCC: 0x82B4, - 0xDCCD: 0x82A1, - 0xDCCE: 0x82AA, - 0xDCCF: 0x829F, - 0xDCD0: 0x82C4, - 0xDCD1: 0x82CE, - 0xDCD2: 0x82A4, - 0xDCD3: 0x82E1, - 0xDCD4: 0x8309, - 0xDCD5: 0x82F7, - 0xDCD6: 0x82E4, - 0xDCD7: 0x830F, - 0xDCD8: 0x8307, - 0xDCD9: 0x82DC, - 0xDCDA: 0x82F4, - 0xDCDB: 0x82D2, - 0xDCDC: 0x82D8, - 0xDCDD: 0x830C, - 0xDCDE: 0x82FB, - 0xDCDF: 0x82D3, - 0xDCE0: 0x8311, - 0xDCE1: 0x831A, - 0xDCE2: 0x8306, - 0xDCE3: 0x8314, - 0xDCE4: 0x8315, - 0xDCE5: 0x82E0, - 0xDCE6: 0x82D5, - 0xDCE7: 0x831C, - 0xDCE8: 0x8351, - 0xDCE9: 0x835B, - 0xDCEA: 0x835C, - 0xDCEB: 0x8308, - 0xDCEC: 0x8392, - 0xDCED: 0x833C, - 0xDCEE: 0x8334, - 0xDCEF: 0x8331, - 0xDCF0: 0x839B, - 0xDCF1: 0x835E, - 0xDCF2: 0x832F, - 0xDCF3: 0x834F, - 0xDCF4: 0x8347, - 0xDCF5: 0x8343, - 0xDCF6: 0x835F, - 0xDCF7: 0x8340, - 0xDCF8: 0x8317, - 0xDCF9: 0x8360, - 0xDCFA: 0x832D, - 0xDCFB: 0x833A, - 0xDCFC: 0x8333, - 0xDCFD: 0x8366, - 0xDCFE: 0x8365, - 0xDD40: 0x8EE5, - 0xDD41: 0x8EE6, - 0xDD42: 0x8EE7, - 0xDD43: 0x8EE8, - 0xDD44: 0x8EE9, - 0xDD45: 0x8EEA, - 0xDD46: 0x8EEB, - 0xDD47: 0x8EEC, - 0xDD48: 0x8EED, - 0xDD49: 0x8EEE, - 0xDD4A: 0x8EEF, - 0xDD4B: 0x8EF0, - 0xDD4C: 0x8EF1, - 0xDD4D: 0x8EF2, - 0xDD4E: 0x8EF3, - 0xDD4F: 0x8EF4, - 0xDD50: 0x8EF5, - 0xDD51: 0x8EF6, - 0xDD52: 0x8EF7, - 0xDD53: 0x8EF8, - 0xDD54: 0x8EF9, - 0xDD55: 0x8EFA, - 0xDD56: 0x8EFB, - 0xDD57: 0x8EFC, - 0xDD58: 0x8EFD, - 0xDD59: 0x8EFE, - 0xDD5A: 0x8EFF, - 0xDD5B: 0x8F00, - 0xDD5C: 0x8F01, - 0xDD5D: 0x8F02, - 0xDD5E: 0x8F03, - 0xDD5F: 0x8F04, - 0xDD60: 0x8F05, - 0xDD61: 0x8F06, - 0xDD62: 0x8F07, - 0xDD63: 0x8F08, - 0xDD64: 0x8F09, - 0xDD65: 0x8F0A, - 0xDD66: 0x8F0B, - 0xDD67: 0x8F0C, - 0xDD68: 0x8F0D, - 0xDD69: 0x8F0E, - 0xDD6A: 0x8F0F, - 0xDD6B: 0x8F10, - 0xDD6C: 0x8F11, - 0xDD6D: 0x8F12, - 0xDD6E: 0x8F13, - 0xDD6F: 0x8F14, - 0xDD70: 0x8F15, - 0xDD71: 0x8F16, - 0xDD72: 0x8F17, - 0xDD73: 0x8F18, - 0xDD74: 0x8F19, - 0xDD75: 0x8F1A, - 0xDD76: 0x8F1B, - 0xDD77: 0x8F1C, - 0xDD78: 0x8F1D, - 0xDD79: 0x8F1E, - 0xDD7A: 0x8F1F, - 0xDD7B: 0x8F20, - 0xDD7C: 0x8F21, - 0xDD7D: 0x8F22, - 0xDD7E: 0x8F23, - 0xDD80: 0x8F24, - 0xDD81: 0x8F25, - 0xDD82: 0x8F26, - 0xDD83: 0x8F27, - 0xDD84: 0x8F28, - 0xDD85: 0x8F29, - 0xDD86: 0x8F2A, - 0xDD87: 0x8F2B, - 0xDD88: 0x8F2C, - 0xDD89: 0x8F2D, - 0xDD8A: 0x8F2E, - 0xDD8B: 0x8F2F, - 0xDD8C: 0x8F30, - 0xDD8D: 0x8F31, - 0xDD8E: 0x8F32, - 0xDD8F: 0x8F33, - 0xDD90: 0x8F34, - 0xDD91: 0x8F35, - 0xDD92: 0x8F36, - 0xDD93: 0x8F37, - 0xDD94: 0x8F38, - 0xDD95: 0x8F39, - 0xDD96: 0x8F3A, - 0xDD97: 0x8F3B, - 0xDD98: 0x8F3C, - 0xDD99: 0x8F3D, - 0xDD9A: 0x8F3E, - 0xDD9B: 0x8F3F, - 0xDD9C: 0x8F40, - 0xDD9D: 0x8F41, - 0xDD9E: 0x8F42, - 0xDD9F: 0x8F43, - 0xDDA0: 0x8F44, - 0xDDA1: 0x8368, - 0xDDA2: 0x831B, - 0xDDA3: 0x8369, - 0xDDA4: 0x836C, - 0xDDA5: 0x836A, - 0xDDA6: 0x836D, - 0xDDA7: 0x836E, - 0xDDA8: 0x83B0, - 0xDDA9: 0x8378, - 0xDDAA: 0x83B3, - 0xDDAB: 0x83B4, - 0xDDAC: 0x83A0, - 0xDDAD: 0x83AA, - 0xDDAE: 0x8393, - 0xDDAF: 0x839C, - 0xDDB0: 0x8385, - 0xDDB1: 0x837C, - 0xDDB2: 0x83B6, - 0xDDB3: 0x83A9, - 0xDDB4: 0x837D, - 0xDDB5: 0x83B8, - 0xDDB6: 0x837B, - 0xDDB7: 0x8398, - 0xDDB8: 0x839E, - 0xDDB9: 0x83A8, - 0xDDBA: 0x83BA, - 0xDDBB: 0x83BC, - 0xDDBC: 0x83C1, - 0xDDBD: 0x8401, - 0xDDBE: 0x83E5, - 0xDDBF: 0x83D8, - 0xDDC0: 0x5807, - 0xDDC1: 0x8418, - 0xDDC2: 0x840B, - 0xDDC3: 0x83DD, - 0xDDC4: 0x83FD, - 0xDDC5: 0x83D6, - 0xDDC6: 0x841C, - 0xDDC7: 0x8438, - 0xDDC8: 0x8411, - 0xDDC9: 0x8406, - 0xDDCA: 0x83D4, - 0xDDCB: 0x83DF, - 0xDDCC: 0x840F, - 0xDDCD: 0x8403, - 0xDDCE: 0x83F8, - 0xDDCF: 0x83F9, - 0xDDD0: 0x83EA, - 0xDDD1: 0x83C5, - 0xDDD2: 0x83C0, - 0xDDD3: 0x8426, - 0xDDD4: 0x83F0, - 0xDDD5: 0x83E1, - 0xDDD6: 0x845C, - 0xDDD7: 0x8451, - 0xDDD8: 0x845A, - 0xDDD9: 0x8459, - 0xDDDA: 0x8473, - 0xDDDB: 0x8487, - 0xDDDC: 0x8488, - 0xDDDD: 0x847A, - 0xDDDE: 0x8489, - 0xDDDF: 0x8478, - 0xDDE0: 0x843C, - 0xDDE1: 0x8446, - 0xDDE2: 0x8469, - 0xDDE3: 0x8476, - 0xDDE4: 0x848C, - 0xDDE5: 0x848E, - 0xDDE6: 0x8431, - 0xDDE7: 0x846D, - 0xDDE8: 0x84C1, - 0xDDE9: 0x84CD, - 0xDDEA: 0x84D0, - 0xDDEB: 0x84E6, - 0xDDEC: 0x84BD, - 0xDDED: 0x84D3, - 0xDDEE: 0x84CA, - 0xDDEF: 0x84BF, - 0xDDF0: 0x84BA, - 0xDDF1: 0x84E0, - 0xDDF2: 0x84A1, - 0xDDF3: 0x84B9, - 0xDDF4: 0x84B4, - 0xDDF5: 0x8497, - 0xDDF6: 0x84E5, - 0xDDF7: 0x84E3, - 0xDDF8: 0x850C, - 0xDDF9: 0x750D, - 0xDDFA: 0x8538, - 0xDDFB: 0x84F0, - 0xDDFC: 0x8539, - 0xDDFD: 0x851F, - 0xDDFE: 0x853A, - 0xDE40: 0x8F45, - 0xDE41: 0x8F46, - 0xDE42: 0x8F47, - 0xDE43: 0x8F48, - 0xDE44: 0x8F49, - 0xDE45: 0x8F4A, - 0xDE46: 0x8F4B, - 0xDE47: 0x8F4C, - 0xDE48: 0x8F4D, - 0xDE49: 0x8F4E, - 0xDE4A: 0x8F4F, - 0xDE4B: 0x8F50, - 0xDE4C: 0x8F51, - 0xDE4D: 0x8F52, - 0xDE4E: 0x8F53, - 0xDE4F: 0x8F54, - 0xDE50: 0x8F55, - 0xDE51: 0x8F56, - 0xDE52: 0x8F57, - 0xDE53: 0x8F58, - 0xDE54: 0x8F59, - 0xDE55: 0x8F5A, - 0xDE56: 0x8F5B, - 0xDE57: 0x8F5C, - 0xDE58: 0x8F5D, - 0xDE59: 0x8F5E, - 0xDE5A: 0x8F5F, - 0xDE5B: 0x8F60, - 0xDE5C: 0x8F61, - 0xDE5D: 0x8F62, - 0xDE5E: 0x8F63, - 0xDE5F: 0x8F64, - 0xDE60: 0x8F65, - 0xDE61: 0x8F6A, - 0xDE62: 0x8F80, - 0xDE63: 0x8F8C, - 0xDE64: 0x8F92, - 0xDE65: 0x8F9D, - 0xDE66: 0x8FA0, - 0xDE67: 0x8FA1, - 0xDE68: 0x8FA2, - 0xDE69: 0x8FA4, - 0xDE6A: 0x8FA5, - 0xDE6B: 0x8FA6, - 0xDE6C: 0x8FA7, - 0xDE6D: 0x8FAA, - 0xDE6E: 0x8FAC, - 0xDE6F: 0x8FAD, - 0xDE70: 0x8FAE, - 0xDE71: 0x8FAF, - 0xDE72: 0x8FB2, - 0xDE73: 0x8FB3, - 0xDE74: 0x8FB4, - 0xDE75: 0x8FB5, - 0xDE76: 0x8FB7, - 0xDE77: 0x8FB8, - 0xDE78: 0x8FBA, - 0xDE79: 0x8FBB, - 0xDE7A: 0x8FBC, - 0xDE7B: 0x8FBF, - 0xDE7C: 0x8FC0, - 0xDE7D: 0x8FC3, - 0xDE7E: 0x8FC6, - 0xDE80: 0x8FC9, - 0xDE81: 0x8FCA, - 0xDE82: 0x8FCB, - 0xDE83: 0x8FCC, - 0xDE84: 0x8FCD, - 0xDE85: 0x8FCF, - 0xDE86: 0x8FD2, - 0xDE87: 0x8FD6, - 0xDE88: 0x8FD7, - 0xDE89: 0x8FDA, - 0xDE8A: 0x8FE0, - 0xDE8B: 0x8FE1, - 0xDE8C: 0x8FE3, - 0xDE8D: 0x8FE7, - 0xDE8E: 0x8FEC, - 0xDE8F: 0x8FEF, - 0xDE90: 0x8FF1, - 0xDE91: 0x8FF2, - 0xDE92: 0x8FF4, - 0xDE93: 0x8FF5, - 0xDE94: 0x8FF6, - 0xDE95: 0x8FFA, - 0xDE96: 0x8FFB, - 0xDE97: 0x8FFC, - 0xDE98: 0x8FFE, - 0xDE99: 0x8FFF, - 0xDE9A: 0x9007, - 0xDE9B: 0x9008, - 0xDE9C: 0x900C, - 0xDE9D: 0x900E, - 0xDE9E: 0x9013, - 0xDE9F: 0x9015, - 0xDEA0: 0x9018, - 0xDEA1: 0x8556, - 0xDEA2: 0x853B, - 0xDEA3: 0x84FF, - 0xDEA4: 0x84FC, - 0xDEA5: 0x8559, - 0xDEA6: 0x8548, - 0xDEA7: 0x8568, - 0xDEA8: 0x8564, - 0xDEA9: 0x855E, - 0xDEAA: 0x857A, - 0xDEAB: 0x77A2, - 0xDEAC: 0x8543, - 0xDEAD: 0x8572, - 0xDEAE: 0x857B, - 0xDEAF: 0x85A4, - 0xDEB0: 0x85A8, - 0xDEB1: 0x8587, - 0xDEB2: 0x858F, - 0xDEB3: 0x8579, - 0xDEB4: 0x85AE, - 0xDEB5: 0x859C, - 0xDEB6: 0x8585, - 0xDEB7: 0x85B9, - 0xDEB8: 0x85B7, - 0xDEB9: 0x85B0, - 0xDEBA: 0x85D3, - 0xDEBB: 0x85C1, - 0xDEBC: 0x85DC, - 0xDEBD: 0x85FF, - 0xDEBE: 0x8627, - 0xDEBF: 0x8605, - 0xDEC0: 0x8629, - 0xDEC1: 0x8616, - 0xDEC2: 0x863C, - 0xDEC3: 0x5EFE, - 0xDEC4: 0x5F08, - 0xDEC5: 0x593C, - 0xDEC6: 0x5941, - 0xDEC7: 0x8037, - 0xDEC8: 0x5955, - 0xDEC9: 0x595A, - 0xDECA: 0x5958, - 0xDECB: 0x530F, - 0xDECC: 0x5C22, - 0xDECD: 0x5C25, - 0xDECE: 0x5C2C, - 0xDECF: 0x5C34, - 0xDED0: 0x624C, - 0xDED1: 0x626A, - 0xDED2: 0x629F, - 0xDED3: 0x62BB, - 0xDED4: 0x62CA, - 0xDED5: 0x62DA, - 0xDED6: 0x62D7, - 0xDED7: 0x62EE, - 0xDED8: 0x6322, - 0xDED9: 0x62F6, - 0xDEDA: 0x6339, - 0xDEDB: 0x634B, - 0xDEDC: 0x6343, - 0xDEDD: 0x63AD, - 0xDEDE: 0x63F6, - 0xDEDF: 0x6371, - 0xDEE0: 0x637A, - 0xDEE1: 0x638E, - 0xDEE2: 0x63B4, - 0xDEE3: 0x636D, - 0xDEE4: 0x63AC, - 0xDEE5: 0x638A, - 0xDEE6: 0x6369, - 0xDEE7: 0x63AE, - 0xDEE8: 0x63BC, - 0xDEE9: 0x63F2, - 0xDEEA: 0x63F8, - 0xDEEB: 0x63E0, - 0xDEEC: 0x63FF, - 0xDEED: 0x63C4, - 0xDEEE: 0x63DE, - 0xDEEF: 0x63CE, - 0xDEF0: 0x6452, - 0xDEF1: 0x63C6, - 0xDEF2: 0x63BE, - 0xDEF3: 0x6445, - 0xDEF4: 0x6441, - 0xDEF5: 0x640B, - 0xDEF6: 0x641B, - 0xDEF7: 0x6420, - 0xDEF8: 0x640C, - 0xDEF9: 0x6426, - 0xDEFA: 0x6421, - 0xDEFB: 0x645E, - 0xDEFC: 0x6484, - 0xDEFD: 0x646D, - 0xDEFE: 0x6496, - 0xDF40: 0x9019, - 0xDF41: 0x901C, - 0xDF42: 0x9023, - 0xDF43: 0x9024, - 0xDF44: 0x9025, - 0xDF45: 0x9027, - 0xDF46: 0x9028, - 0xDF47: 0x9029, - 0xDF48: 0x902A, - 0xDF49: 0x902B, - 0xDF4A: 0x902C, - 0xDF4B: 0x9030, - 0xDF4C: 0x9031, - 0xDF4D: 0x9032, - 0xDF4E: 0x9033, - 0xDF4F: 0x9034, - 0xDF50: 0x9037, - 0xDF51: 0x9039, - 0xDF52: 0x903A, - 0xDF53: 0x903D, - 0xDF54: 0x903F, - 0xDF55: 0x9040, - 0xDF56: 0x9043, - 0xDF57: 0x9045, - 0xDF58: 0x9046, - 0xDF59: 0x9048, - 0xDF5A: 0x9049, - 0xDF5B: 0x904A, - 0xDF5C: 0x904B, - 0xDF5D: 0x904C, - 0xDF5E: 0x904E, - 0xDF5F: 0x9054, - 0xDF60: 0x9055, - 0xDF61: 0x9056, - 0xDF62: 0x9059, - 0xDF63: 0x905A, - 0xDF64: 0x905C, - 0xDF65: 0x905D, - 0xDF66: 0x905E, - 0xDF67: 0x905F, - 0xDF68: 0x9060, - 0xDF69: 0x9061, - 0xDF6A: 0x9064, - 0xDF6B: 0x9066, - 0xDF6C: 0x9067, - 0xDF6D: 0x9069, - 0xDF6E: 0x906A, - 0xDF6F: 0x906B, - 0xDF70: 0x906C, - 0xDF71: 0x906F, - 0xDF72: 0x9070, - 0xDF73: 0x9071, - 0xDF74: 0x9072, - 0xDF75: 0x9073, - 0xDF76: 0x9076, - 0xDF77: 0x9077, - 0xDF78: 0x9078, - 0xDF79: 0x9079, - 0xDF7A: 0x907A, - 0xDF7B: 0x907B, - 0xDF7C: 0x907C, - 0xDF7D: 0x907E, - 0xDF7E: 0x9081, - 0xDF80: 0x9084, - 0xDF81: 0x9085, - 0xDF82: 0x9086, - 0xDF83: 0x9087, - 0xDF84: 0x9089, - 0xDF85: 0x908A, - 0xDF86: 0x908C, - 0xDF87: 0x908D, - 0xDF88: 0x908E, - 0xDF89: 0x908F, - 0xDF8A: 0x9090, - 0xDF8B: 0x9092, - 0xDF8C: 0x9094, - 0xDF8D: 0x9096, - 0xDF8E: 0x9098, - 0xDF8F: 0x909A, - 0xDF90: 0x909C, - 0xDF91: 0x909E, - 0xDF92: 0x909F, - 0xDF93: 0x90A0, - 0xDF94: 0x90A4, - 0xDF95: 0x90A5, - 0xDF96: 0x90A7, - 0xDF97: 0x90A8, - 0xDF98: 0x90A9, - 0xDF99: 0x90AB, - 0xDF9A: 0x90AD, - 0xDF9B: 0x90B2, - 0xDF9C: 0x90B7, - 0xDF9D: 0x90BC, - 0xDF9E: 0x90BD, - 0xDF9F: 0x90BF, - 0xDFA0: 0x90C0, - 0xDFA1: 0x647A, - 0xDFA2: 0x64B7, - 0xDFA3: 0x64B8, - 0xDFA4: 0x6499, - 0xDFA5: 0x64BA, - 0xDFA6: 0x64C0, - 0xDFA7: 0x64D0, - 0xDFA8: 0x64D7, - 0xDFA9: 0x64E4, - 0xDFAA: 0x64E2, - 0xDFAB: 0x6509, - 0xDFAC: 0x6525, - 0xDFAD: 0x652E, - 0xDFAE: 0x5F0B, - 0xDFAF: 0x5FD2, - 0xDFB0: 0x7519, - 0xDFB1: 0x5F11, - 0xDFB2: 0x535F, - 0xDFB3: 0x53F1, - 0xDFB4: 0x53FD, - 0xDFB5: 0x53E9, - 0xDFB6: 0x53E8, - 0xDFB7: 0x53FB, - 0xDFB8: 0x5412, - 0xDFB9: 0x5416, - 0xDFBA: 0x5406, - 0xDFBB: 0x544B, - 0xDFBC: 0x5452, - 0xDFBD: 0x5453, - 0xDFBE: 0x5454, - 0xDFBF: 0x5456, - 0xDFC0: 0x5443, - 0xDFC1: 0x5421, - 0xDFC2: 0x5457, - 0xDFC3: 0x5459, - 0xDFC4: 0x5423, - 0xDFC5: 0x5432, - 0xDFC6: 0x5482, - 0xDFC7: 0x5494, - 0xDFC8: 0x5477, - 0xDFC9: 0x5471, - 0xDFCA: 0x5464, - 0xDFCB: 0x549A, - 0xDFCC: 0x549B, - 0xDFCD: 0x5484, - 0xDFCE: 0x5476, - 0xDFCF: 0x5466, - 0xDFD0: 0x549D, - 0xDFD1: 0x54D0, - 0xDFD2: 0x54AD, - 0xDFD3: 0x54C2, - 0xDFD4: 0x54B4, - 0xDFD5: 0x54D2, - 0xDFD6: 0x54A7, - 0xDFD7: 0x54A6, - 0xDFD8: 0x54D3, - 0xDFD9: 0x54D4, - 0xDFDA: 0x5472, - 0xDFDB: 0x54A3, - 0xDFDC: 0x54D5, - 0xDFDD: 0x54BB, - 0xDFDE: 0x54BF, - 0xDFDF: 0x54CC, - 0xDFE0: 0x54D9, - 0xDFE1: 0x54DA, - 0xDFE2: 0x54DC, - 0xDFE3: 0x54A9, - 0xDFE4: 0x54AA, - 0xDFE5: 0x54A4, - 0xDFE6: 0x54DD, - 0xDFE7: 0x54CF, - 0xDFE8: 0x54DE, - 0xDFE9: 0x551B, - 0xDFEA: 0x54E7, - 0xDFEB: 0x5520, - 0xDFEC: 0x54FD, - 0xDFED: 0x5514, - 0xDFEE: 0x54F3, - 0xDFEF: 0x5522, - 0xDFF0: 0x5523, - 0xDFF1: 0x550F, - 0xDFF2: 0x5511, - 0xDFF3: 0x5527, - 0xDFF4: 0x552A, - 0xDFF5: 0x5567, - 0xDFF6: 0x558F, - 0xDFF7: 0x55B5, - 0xDFF8: 0x5549, - 0xDFF9: 0x556D, - 0xDFFA: 0x5541, - 0xDFFB: 0x5555, - 0xDFFC: 0x553F, - 0xDFFD: 0x5550, - 0xDFFE: 0x553C, - 0xE040: 0x90C2, - 0xE041: 0x90C3, - 0xE042: 0x90C6, - 0xE043: 0x90C8, - 0xE044: 0x90C9, - 0xE045: 0x90CB, - 0xE046: 0x90CC, - 0xE047: 0x90CD, - 0xE048: 0x90D2, - 0xE049: 0x90D4, - 0xE04A: 0x90D5, - 0xE04B: 0x90D6, - 0xE04C: 0x90D8, - 0xE04D: 0x90D9, - 0xE04E: 0x90DA, - 0xE04F: 0x90DE, - 0xE050: 0x90DF, - 0xE051: 0x90E0, - 0xE052: 0x90E3, - 0xE053: 0x90E4, - 0xE054: 0x90E5, - 0xE055: 0x90E9, - 0xE056: 0x90EA, - 0xE057: 0x90EC, - 0xE058: 0x90EE, - 0xE059: 0x90F0, - 0xE05A: 0x90F1, - 0xE05B: 0x90F2, - 0xE05C: 0x90F3, - 0xE05D: 0x90F5, - 0xE05E: 0x90F6, - 0xE05F: 0x90F7, - 0xE060: 0x90F9, - 0xE061: 0x90FA, - 0xE062: 0x90FB, - 0xE063: 0x90FC, - 0xE064: 0x90FF, - 0xE065: 0x9100, - 0xE066: 0x9101, - 0xE067: 0x9103, - 0xE068: 0x9105, - 0xE069: 0x9106, - 0xE06A: 0x9107, - 0xE06B: 0x9108, - 0xE06C: 0x9109, - 0xE06D: 0x910A, - 0xE06E: 0x910B, - 0xE06F: 0x910C, - 0xE070: 0x910D, - 0xE071: 0x910E, - 0xE072: 0x910F, - 0xE073: 0x9110, - 0xE074: 0x9111, - 0xE075: 0x9112, - 0xE076: 0x9113, - 0xE077: 0x9114, - 0xE078: 0x9115, - 0xE079: 0x9116, - 0xE07A: 0x9117, - 0xE07B: 0x9118, - 0xE07C: 0x911A, - 0xE07D: 0x911B, - 0xE07E: 0x911C, - 0xE080: 0x911D, - 0xE081: 0x911F, - 0xE082: 0x9120, - 0xE083: 0x9121, - 0xE084: 0x9124, - 0xE085: 0x9125, - 0xE086: 0x9126, - 0xE087: 0x9127, - 0xE088: 0x9128, - 0xE089: 0x9129, - 0xE08A: 0x912A, - 0xE08B: 0x912B, - 0xE08C: 0x912C, - 0xE08D: 0x912D, - 0xE08E: 0x912E, - 0xE08F: 0x9130, - 0xE090: 0x9132, - 0xE091: 0x9133, - 0xE092: 0x9134, - 0xE093: 0x9135, - 0xE094: 0x9136, - 0xE095: 0x9137, - 0xE096: 0x9138, - 0xE097: 0x913A, - 0xE098: 0x913B, - 0xE099: 0x913C, - 0xE09A: 0x913D, - 0xE09B: 0x913E, - 0xE09C: 0x913F, - 0xE09D: 0x9140, - 0xE09E: 0x9141, - 0xE09F: 0x9142, - 0xE0A0: 0x9144, - 0xE0A1: 0x5537, - 0xE0A2: 0x5556, - 0xE0A3: 0x5575, - 0xE0A4: 0x5576, - 0xE0A5: 0x5577, - 0xE0A6: 0x5533, - 0xE0A7: 0x5530, - 0xE0A8: 0x555C, - 0xE0A9: 0x558B, - 0xE0AA: 0x55D2, - 0xE0AB: 0x5583, - 0xE0AC: 0x55B1, - 0xE0AD: 0x55B9, - 0xE0AE: 0x5588, - 0xE0AF: 0x5581, - 0xE0B0: 0x559F, - 0xE0B1: 0x557E, - 0xE0B2: 0x55D6, - 0xE0B3: 0x5591, - 0xE0B4: 0x557B, - 0xE0B5: 0x55DF, - 0xE0B6: 0x55BD, - 0xE0B7: 0x55BE, - 0xE0B8: 0x5594, - 0xE0B9: 0x5599, - 0xE0BA: 0x55EA, - 0xE0BB: 0x55F7, - 0xE0BC: 0x55C9, - 0xE0BD: 0x561F, - 0xE0BE: 0x55D1, - 0xE0BF: 0x55EB, - 0xE0C0: 0x55EC, - 0xE0C1: 0x55D4, - 0xE0C2: 0x55E6, - 0xE0C3: 0x55DD, - 0xE0C4: 0x55C4, - 0xE0C5: 0x55EF, - 0xE0C6: 0x55E5, - 0xE0C7: 0x55F2, - 0xE0C8: 0x55F3, - 0xE0C9: 0x55CC, - 0xE0CA: 0x55CD, - 0xE0CB: 0x55E8, - 0xE0CC: 0x55F5, - 0xE0CD: 0x55E4, - 0xE0CE: 0x8F94, - 0xE0CF: 0x561E, - 0xE0D0: 0x5608, - 0xE0D1: 0x560C, - 0xE0D2: 0x5601, - 0xE0D3: 0x5624, - 0xE0D4: 0x5623, - 0xE0D5: 0x55FE, - 0xE0D6: 0x5600, - 0xE0D7: 0x5627, - 0xE0D8: 0x562D, - 0xE0D9: 0x5658, - 0xE0DA: 0x5639, - 0xE0DB: 0x5657, - 0xE0DC: 0x562C, - 0xE0DD: 0x564D, - 0xE0DE: 0x5662, - 0xE0DF: 0x5659, - 0xE0E0: 0x565C, - 0xE0E1: 0x564C, - 0xE0E2: 0x5654, - 0xE0E3: 0x5686, - 0xE0E4: 0x5664, - 0xE0E5: 0x5671, - 0xE0E6: 0x566B, - 0xE0E7: 0x567B, - 0xE0E8: 0x567C, - 0xE0E9: 0x5685, - 0xE0EA: 0x5693, - 0xE0EB: 0x56AF, - 0xE0EC: 0x56D4, - 0xE0ED: 0x56D7, - 0xE0EE: 0x56DD, - 0xE0EF: 0x56E1, - 0xE0F0: 0x56F5, - 0xE0F1: 0x56EB, - 0xE0F2: 0x56F9, - 0xE0F3: 0x56FF, - 0xE0F4: 0x5704, - 0xE0F5: 0x570A, - 0xE0F6: 0x5709, - 0xE0F7: 0x571C, - 0xE0F8: 0x5E0F, - 0xE0F9: 0x5E19, - 0xE0FA: 0x5E14, - 0xE0FB: 0x5E11, - 0xE0FC: 0x5E31, - 0xE0FD: 0x5E3B, - 0xE0FE: 0x5E3C, - 0xE140: 0x9145, - 0xE141: 0x9147, - 0xE142: 0x9148, - 0xE143: 0x9151, - 0xE144: 0x9153, - 0xE145: 0x9154, - 0xE146: 0x9155, - 0xE147: 0x9156, - 0xE148: 0x9158, - 0xE149: 0x9159, - 0xE14A: 0x915B, - 0xE14B: 0x915C, - 0xE14C: 0x915F, - 0xE14D: 0x9160, - 0xE14E: 0x9166, - 0xE14F: 0x9167, - 0xE150: 0x9168, - 0xE151: 0x916B, - 0xE152: 0x916D, - 0xE153: 0x9173, - 0xE154: 0x917A, - 0xE155: 0x917B, - 0xE156: 0x917C, - 0xE157: 0x9180, - 0xE158: 0x9181, - 0xE159: 0x9182, - 0xE15A: 0x9183, - 0xE15B: 0x9184, - 0xE15C: 0x9186, - 0xE15D: 0x9188, - 0xE15E: 0x918A, - 0xE15F: 0x918E, - 0xE160: 0x918F, - 0xE161: 0x9193, - 0xE162: 0x9194, - 0xE163: 0x9195, - 0xE164: 0x9196, - 0xE165: 0x9197, - 0xE166: 0x9198, - 0xE167: 0x9199, - 0xE168: 0x919C, - 0xE169: 0x919D, - 0xE16A: 0x919E, - 0xE16B: 0x919F, - 0xE16C: 0x91A0, - 0xE16D: 0x91A1, - 0xE16E: 0x91A4, - 0xE16F: 0x91A5, - 0xE170: 0x91A6, - 0xE171: 0x91A7, - 0xE172: 0x91A8, - 0xE173: 0x91A9, - 0xE174: 0x91AB, - 0xE175: 0x91AC, - 0xE176: 0x91B0, - 0xE177: 0x91B1, - 0xE178: 0x91B2, - 0xE179: 0x91B3, - 0xE17A: 0x91B6, - 0xE17B: 0x91B7, - 0xE17C: 0x91B8, - 0xE17D: 0x91B9, - 0xE17E: 0x91BB, - 0xE180: 0x91BC, - 0xE181: 0x91BD, - 0xE182: 0x91BE, - 0xE183: 0x91BF, - 0xE184: 0x91C0, - 0xE185: 0x91C1, - 0xE186: 0x91C2, - 0xE187: 0x91C3, - 0xE188: 0x91C4, - 0xE189: 0x91C5, - 0xE18A: 0x91C6, - 0xE18B: 0x91C8, - 0xE18C: 0x91CB, - 0xE18D: 0x91D0, - 0xE18E: 0x91D2, - 0xE18F: 0x91D3, - 0xE190: 0x91D4, - 0xE191: 0x91D5, - 0xE192: 0x91D6, - 0xE193: 0x91D7, - 0xE194: 0x91D8, - 0xE195: 0x91D9, - 0xE196: 0x91DA, - 0xE197: 0x91DB, - 0xE198: 0x91DD, - 0xE199: 0x91DE, - 0xE19A: 0x91DF, - 0xE19B: 0x91E0, - 0xE19C: 0x91E1, - 0xE19D: 0x91E2, - 0xE19E: 0x91E3, - 0xE19F: 0x91E4, - 0xE1A0: 0x91E5, - 0xE1A1: 0x5E37, - 0xE1A2: 0x5E44, - 0xE1A3: 0x5E54, - 0xE1A4: 0x5E5B, - 0xE1A5: 0x5E5E, - 0xE1A6: 0x5E61, - 0xE1A7: 0x5C8C, - 0xE1A8: 0x5C7A, - 0xE1A9: 0x5C8D, - 0xE1AA: 0x5C90, - 0xE1AB: 0x5C96, - 0xE1AC: 0x5C88, - 0xE1AD: 0x5C98, - 0xE1AE: 0x5C99, - 0xE1AF: 0x5C91, - 0xE1B0: 0x5C9A, - 0xE1B1: 0x5C9C, - 0xE1B2: 0x5CB5, - 0xE1B3: 0x5CA2, - 0xE1B4: 0x5CBD, - 0xE1B5: 0x5CAC, - 0xE1B6: 0x5CAB, - 0xE1B7: 0x5CB1, - 0xE1B8: 0x5CA3, - 0xE1B9: 0x5CC1, - 0xE1BA: 0x5CB7, - 0xE1BB: 0x5CC4, - 0xE1BC: 0x5CD2, - 0xE1BD: 0x5CE4, - 0xE1BE: 0x5CCB, - 0xE1BF: 0x5CE5, - 0xE1C0: 0x5D02, - 0xE1C1: 0x5D03, - 0xE1C2: 0x5D27, - 0xE1C3: 0x5D26, - 0xE1C4: 0x5D2E, - 0xE1C5: 0x5D24, - 0xE1C6: 0x5D1E, - 0xE1C7: 0x5D06, - 0xE1C8: 0x5D1B, - 0xE1C9: 0x5D58, - 0xE1CA: 0x5D3E, - 0xE1CB: 0x5D34, - 0xE1CC: 0x5D3D, - 0xE1CD: 0x5D6C, - 0xE1CE: 0x5D5B, - 0xE1CF: 0x5D6F, - 0xE1D0: 0x5D5D, - 0xE1D1: 0x5D6B, - 0xE1D2: 0x5D4B, - 0xE1D3: 0x5D4A, - 0xE1D4: 0x5D69, - 0xE1D5: 0x5D74, - 0xE1D6: 0x5D82, - 0xE1D7: 0x5D99, - 0xE1D8: 0x5D9D, - 0xE1D9: 0x8C73, - 0xE1DA: 0x5DB7, - 0xE1DB: 0x5DC5, - 0xE1DC: 0x5F73, - 0xE1DD: 0x5F77, - 0xE1DE: 0x5F82, - 0xE1DF: 0x5F87, - 0xE1E0: 0x5F89, - 0xE1E1: 0x5F8C, - 0xE1E2: 0x5F95, - 0xE1E3: 0x5F99, - 0xE1E4: 0x5F9C, - 0xE1E5: 0x5FA8, - 0xE1E6: 0x5FAD, - 0xE1E7: 0x5FB5, - 0xE1E8: 0x5FBC, - 0xE1E9: 0x8862, - 0xE1EA: 0x5F61, - 0xE1EB: 0x72AD, - 0xE1EC: 0x72B0, - 0xE1ED: 0x72B4, - 0xE1EE: 0x72B7, - 0xE1EF: 0x72B8, - 0xE1F0: 0x72C3, - 0xE1F1: 0x72C1, - 0xE1F2: 0x72CE, - 0xE1F3: 0x72CD, - 0xE1F4: 0x72D2, - 0xE1F5: 0x72E8, - 0xE1F6: 0x72EF, - 0xE1F7: 0x72E9, - 0xE1F8: 0x72F2, - 0xE1F9: 0x72F4, - 0xE1FA: 0x72F7, - 0xE1FB: 0x7301, - 0xE1FC: 0x72F3, - 0xE1FD: 0x7303, - 0xE1FE: 0x72FA, - 0xE240: 0x91E6, - 0xE241: 0x91E7, - 0xE242: 0x91E8, - 0xE243: 0x91E9, - 0xE244: 0x91EA, - 0xE245: 0x91EB, - 0xE246: 0x91EC, - 0xE247: 0x91ED, - 0xE248: 0x91EE, - 0xE249: 0x91EF, - 0xE24A: 0x91F0, - 0xE24B: 0x91F1, - 0xE24C: 0x91F2, - 0xE24D: 0x91F3, - 0xE24E: 0x91F4, - 0xE24F: 0x91F5, - 0xE250: 0x91F6, - 0xE251: 0x91F7, - 0xE252: 0x91F8, - 0xE253: 0x91F9, - 0xE254: 0x91FA, - 0xE255: 0x91FB, - 0xE256: 0x91FC, - 0xE257: 0x91FD, - 0xE258: 0x91FE, - 0xE259: 0x91FF, - 0xE25A: 0x9200, - 0xE25B: 0x9201, - 0xE25C: 0x9202, - 0xE25D: 0x9203, - 0xE25E: 0x9204, - 0xE25F: 0x9205, - 0xE260: 0x9206, - 0xE261: 0x9207, - 0xE262: 0x9208, - 0xE263: 0x9209, - 0xE264: 0x920A, - 0xE265: 0x920B, - 0xE266: 0x920C, - 0xE267: 0x920D, - 0xE268: 0x920E, - 0xE269: 0x920F, - 0xE26A: 0x9210, - 0xE26B: 0x9211, - 0xE26C: 0x9212, - 0xE26D: 0x9213, - 0xE26E: 0x9214, - 0xE26F: 0x9215, - 0xE270: 0x9216, - 0xE271: 0x9217, - 0xE272: 0x9218, - 0xE273: 0x9219, - 0xE274: 0x921A, - 0xE275: 0x921B, - 0xE276: 0x921C, - 0xE277: 0x921D, - 0xE278: 0x921E, - 0xE279: 0x921F, - 0xE27A: 0x9220, - 0xE27B: 0x9221, - 0xE27C: 0x9222, - 0xE27D: 0x9223, - 0xE27E: 0x9224, - 0xE280: 0x9225, - 0xE281: 0x9226, - 0xE282: 0x9227, - 0xE283: 0x9228, - 0xE284: 0x9229, - 0xE285: 0x922A, - 0xE286: 0x922B, - 0xE287: 0x922C, - 0xE288: 0x922D, - 0xE289: 0x922E, - 0xE28A: 0x922F, - 0xE28B: 0x9230, - 0xE28C: 0x9231, - 0xE28D: 0x9232, - 0xE28E: 0x9233, - 0xE28F: 0x9234, - 0xE290: 0x9235, - 0xE291: 0x9236, - 0xE292: 0x9237, - 0xE293: 0x9238, - 0xE294: 0x9239, - 0xE295: 0x923A, - 0xE296: 0x923B, - 0xE297: 0x923C, - 0xE298: 0x923D, - 0xE299: 0x923E, - 0xE29A: 0x923F, - 0xE29B: 0x9240, - 0xE29C: 0x9241, - 0xE29D: 0x9242, - 0xE29E: 0x9243, - 0xE29F: 0x9244, - 0xE2A0: 0x9245, - 0xE2A1: 0x72FB, - 0xE2A2: 0x7317, - 0xE2A3: 0x7313, - 0xE2A4: 0x7321, - 0xE2A5: 0x730A, - 0xE2A6: 0x731E, - 0xE2A7: 0x731D, - 0xE2A8: 0x7315, - 0xE2A9: 0x7322, - 0xE2AA: 0x7339, - 0xE2AB: 0x7325, - 0xE2AC: 0x732C, - 0xE2AD: 0x7338, - 0xE2AE: 0x7331, - 0xE2AF: 0x7350, - 0xE2B0: 0x734D, - 0xE2B1: 0x7357, - 0xE2B2: 0x7360, - 0xE2B3: 0x736C, - 0xE2B4: 0x736F, - 0xE2B5: 0x737E, - 0xE2B6: 0x821B, - 0xE2B7: 0x5925, - 0xE2B8: 0x98E7, - 0xE2B9: 0x5924, - 0xE2BA: 0x5902, - 0xE2BB: 0x9963, - 0xE2BC: 0x9967, - 0xE2BD: 0x9968, - 0xE2BE: 0x9969, - 0xE2BF: 0x996A, - 0xE2C0: 0x996B, - 0xE2C1: 0x996C, - 0xE2C2: 0x9974, - 0xE2C3: 0x9977, - 0xE2C4: 0x997D, - 0xE2C5: 0x9980, - 0xE2C6: 0x9984, - 0xE2C7: 0x9987, - 0xE2C8: 0x998A, - 0xE2C9: 0x998D, - 0xE2CA: 0x9990, - 0xE2CB: 0x9991, - 0xE2CC: 0x9993, - 0xE2CD: 0x9994, - 0xE2CE: 0x9995, - 0xE2CF: 0x5E80, - 0xE2D0: 0x5E91, - 0xE2D1: 0x5E8B, - 0xE2D2: 0x5E96, - 0xE2D3: 0x5EA5, - 0xE2D4: 0x5EA0, - 0xE2D5: 0x5EB9, - 0xE2D6: 0x5EB5, - 0xE2D7: 0x5EBE, - 0xE2D8: 0x5EB3, - 0xE2D9: 0x8D53, - 0xE2DA: 0x5ED2, - 0xE2DB: 0x5ED1, - 0xE2DC: 0x5EDB, - 0xE2DD: 0x5EE8, - 0xE2DE: 0x5EEA, - 0xE2DF: 0x81BA, - 0xE2E0: 0x5FC4, - 0xE2E1: 0x5FC9, - 0xE2E2: 0x5FD6, - 0xE2E3: 0x5FCF, - 0xE2E4: 0x6003, - 0xE2E5: 0x5FEE, - 0xE2E6: 0x6004, - 0xE2E7: 0x5FE1, - 0xE2E8: 0x5FE4, - 0xE2E9: 0x5FFE, - 0xE2EA: 0x6005, - 0xE2EB: 0x6006, - 0xE2EC: 0x5FEA, - 0xE2ED: 0x5FED, - 0xE2EE: 0x5FF8, - 0xE2EF: 0x6019, - 0xE2F0: 0x6035, - 0xE2F1: 0x6026, - 0xE2F2: 0x601B, - 0xE2F3: 0x600F, - 0xE2F4: 0x600D, - 0xE2F5: 0x6029, - 0xE2F6: 0x602B, - 0xE2F7: 0x600A, - 0xE2F8: 0x603F, - 0xE2F9: 0x6021, - 0xE2FA: 0x6078, - 0xE2FB: 0x6079, - 0xE2FC: 0x607B, - 0xE2FD: 0x607A, - 0xE2FE: 0x6042, - 0xE340: 0x9246, - 0xE341: 0x9247, - 0xE342: 0x9248, - 0xE343: 0x9249, - 0xE344: 0x924A, - 0xE345: 0x924B, - 0xE346: 0x924C, - 0xE347: 0x924D, - 0xE348: 0x924E, - 0xE349: 0x924F, - 0xE34A: 0x9250, - 0xE34B: 0x9251, - 0xE34C: 0x9252, - 0xE34D: 0x9253, - 0xE34E: 0x9254, - 0xE34F: 0x9255, - 0xE350: 0x9256, - 0xE351: 0x9257, - 0xE352: 0x9258, - 0xE353: 0x9259, - 0xE354: 0x925A, - 0xE355: 0x925B, - 0xE356: 0x925C, - 0xE357: 0x925D, - 0xE358: 0x925E, - 0xE359: 0x925F, - 0xE35A: 0x9260, - 0xE35B: 0x9261, - 0xE35C: 0x9262, - 0xE35D: 0x9263, - 0xE35E: 0x9264, - 0xE35F: 0x9265, - 0xE360: 0x9266, - 0xE361: 0x9267, - 0xE362: 0x9268, - 0xE363: 0x9269, - 0xE364: 0x926A, - 0xE365: 0x926B, - 0xE366: 0x926C, - 0xE367: 0x926D, - 0xE368: 0x926E, - 0xE369: 0x926F, - 0xE36A: 0x9270, - 0xE36B: 0x9271, - 0xE36C: 0x9272, - 0xE36D: 0x9273, - 0xE36E: 0x9275, - 0xE36F: 0x9276, - 0xE370: 0x9277, - 0xE371: 0x9278, - 0xE372: 0x9279, - 0xE373: 0x927A, - 0xE374: 0x927B, - 0xE375: 0x927C, - 0xE376: 0x927D, - 0xE377: 0x927E, - 0xE378: 0x927F, - 0xE379: 0x9280, - 0xE37A: 0x9281, - 0xE37B: 0x9282, - 0xE37C: 0x9283, - 0xE37D: 0x9284, - 0xE37E: 0x9285, - 0xE380: 0x9286, - 0xE381: 0x9287, - 0xE382: 0x9288, - 0xE383: 0x9289, - 0xE384: 0x928A, - 0xE385: 0x928B, - 0xE386: 0x928C, - 0xE387: 0x928D, - 0xE388: 0x928F, - 0xE389: 0x9290, - 0xE38A: 0x9291, - 0xE38B: 0x9292, - 0xE38C: 0x9293, - 0xE38D: 0x9294, - 0xE38E: 0x9295, - 0xE38F: 0x9296, - 0xE390: 0x9297, - 0xE391: 0x9298, - 0xE392: 0x9299, - 0xE393: 0x929A, - 0xE394: 0x929B, - 0xE395: 0x929C, - 0xE396: 0x929D, - 0xE397: 0x929E, - 0xE398: 0x929F, - 0xE399: 0x92A0, - 0xE39A: 0x92A1, - 0xE39B: 0x92A2, - 0xE39C: 0x92A3, - 0xE39D: 0x92A4, - 0xE39E: 0x92A5, - 0xE39F: 0x92A6, - 0xE3A0: 0x92A7, - 0xE3A1: 0x606A, - 0xE3A2: 0x607D, - 0xE3A3: 0x6096, - 0xE3A4: 0x609A, - 0xE3A5: 0x60AD, - 0xE3A6: 0x609D, - 0xE3A7: 0x6083, - 0xE3A8: 0x6092, - 0xE3A9: 0x608C, - 0xE3AA: 0x609B, - 0xE3AB: 0x60EC, - 0xE3AC: 0x60BB, - 0xE3AD: 0x60B1, - 0xE3AE: 0x60DD, - 0xE3AF: 0x60D8, - 0xE3B0: 0x60C6, - 0xE3B1: 0x60DA, - 0xE3B2: 0x60B4, - 0xE3B3: 0x6120, - 0xE3B4: 0x6126, - 0xE3B5: 0x6115, - 0xE3B6: 0x6123, - 0xE3B7: 0x60F4, - 0xE3B8: 0x6100, - 0xE3B9: 0x610E, - 0xE3BA: 0x612B, - 0xE3BB: 0x614A, - 0xE3BC: 0x6175, - 0xE3BD: 0x61AC, - 0xE3BE: 0x6194, - 0xE3BF: 0x61A7, - 0xE3C0: 0x61B7, - 0xE3C1: 0x61D4, - 0xE3C2: 0x61F5, - 0xE3C3: 0x5FDD, - 0xE3C4: 0x96B3, - 0xE3C5: 0x95E9, - 0xE3C6: 0x95EB, - 0xE3C7: 0x95F1, - 0xE3C8: 0x95F3, - 0xE3C9: 0x95F5, - 0xE3CA: 0x95F6, - 0xE3CB: 0x95FC, - 0xE3CC: 0x95FE, - 0xE3CD: 0x9603, - 0xE3CE: 0x9604, - 0xE3CF: 0x9606, - 0xE3D0: 0x9608, - 0xE3D1: 0x960A, - 0xE3D2: 0x960B, - 0xE3D3: 0x960C, - 0xE3D4: 0x960D, - 0xE3D5: 0x960F, - 0xE3D6: 0x9612, - 0xE3D7: 0x9615, - 0xE3D8: 0x9616, - 0xE3D9: 0x9617, - 0xE3DA: 0x9619, - 0xE3DB: 0x961A, - 0xE3DC: 0x4E2C, - 0xE3DD: 0x723F, - 0xE3DE: 0x6215, - 0xE3DF: 0x6C35, - 0xE3E0: 0x6C54, - 0xE3E1: 0x6C5C, - 0xE3E2: 0x6C4A, - 0xE3E3: 0x6CA3, - 0xE3E4: 0x6C85, - 0xE3E5: 0x6C90, - 0xE3E6: 0x6C94, - 0xE3E7: 0x6C8C, - 0xE3E8: 0x6C68, - 0xE3E9: 0x6C69, - 0xE3EA: 0x6C74, - 0xE3EB: 0x6C76, - 0xE3EC: 0x6C86, - 0xE3ED: 0x6CA9, - 0xE3EE: 0x6CD0, - 0xE3EF: 0x6CD4, - 0xE3F0: 0x6CAD, - 0xE3F1: 0x6CF7, - 0xE3F2: 0x6CF8, - 0xE3F3: 0x6CF1, - 0xE3F4: 0x6CD7, - 0xE3F5: 0x6CB2, - 0xE3F6: 0x6CE0, - 0xE3F7: 0x6CD6, - 0xE3F8: 0x6CFA, - 0xE3F9: 0x6CEB, - 0xE3FA: 0x6CEE, - 0xE3FB: 0x6CB1, - 0xE3FC: 0x6CD3, - 0xE3FD: 0x6CEF, - 0xE3FE: 0x6CFE, - 0xE440: 0x92A8, - 0xE441: 0x92A9, - 0xE442: 0x92AA, - 0xE443: 0x92AB, - 0xE444: 0x92AC, - 0xE445: 0x92AD, - 0xE446: 0x92AF, - 0xE447: 0x92B0, - 0xE448: 0x92B1, - 0xE449: 0x92B2, - 0xE44A: 0x92B3, - 0xE44B: 0x92B4, - 0xE44C: 0x92B5, - 0xE44D: 0x92B6, - 0xE44E: 0x92B7, - 0xE44F: 0x92B8, - 0xE450: 0x92B9, - 0xE451: 0x92BA, - 0xE452: 0x92BB, - 0xE453: 0x92BC, - 0xE454: 0x92BD, - 0xE455: 0x92BE, - 0xE456: 0x92BF, - 0xE457: 0x92C0, - 0xE458: 0x92C1, - 0xE459: 0x92C2, - 0xE45A: 0x92C3, - 0xE45B: 0x92C4, - 0xE45C: 0x92C5, - 0xE45D: 0x92C6, - 0xE45E: 0x92C7, - 0xE45F: 0x92C9, - 0xE460: 0x92CA, - 0xE461: 0x92CB, - 0xE462: 0x92CC, - 0xE463: 0x92CD, - 0xE464: 0x92CE, - 0xE465: 0x92CF, - 0xE466: 0x92D0, - 0xE467: 0x92D1, - 0xE468: 0x92D2, - 0xE469: 0x92D3, - 0xE46A: 0x92D4, - 0xE46B: 0x92D5, - 0xE46C: 0x92D6, - 0xE46D: 0x92D7, - 0xE46E: 0x92D8, - 0xE46F: 0x92D9, - 0xE470: 0x92DA, - 0xE471: 0x92DB, - 0xE472: 0x92DC, - 0xE473: 0x92DD, - 0xE474: 0x92DE, - 0xE475: 0x92DF, - 0xE476: 0x92E0, - 0xE477: 0x92E1, - 0xE478: 0x92E2, - 0xE479: 0x92E3, - 0xE47A: 0x92E4, - 0xE47B: 0x92E5, - 0xE47C: 0x92E6, - 0xE47D: 0x92E7, - 0xE47E: 0x92E8, - 0xE480: 0x92E9, - 0xE481: 0x92EA, - 0xE482: 0x92EB, - 0xE483: 0x92EC, - 0xE484: 0x92ED, - 0xE485: 0x92EE, - 0xE486: 0x92EF, - 0xE487: 0x92F0, - 0xE488: 0x92F1, - 0xE489: 0x92F2, - 0xE48A: 0x92F3, - 0xE48B: 0x92F4, - 0xE48C: 0x92F5, - 0xE48D: 0x92F6, - 0xE48E: 0x92F7, - 0xE48F: 0x92F8, - 0xE490: 0x92F9, - 0xE491: 0x92FA, - 0xE492: 0x92FB, - 0xE493: 0x92FC, - 0xE494: 0x92FD, - 0xE495: 0x92FE, - 0xE496: 0x92FF, - 0xE497: 0x9300, - 0xE498: 0x9301, - 0xE499: 0x9302, - 0xE49A: 0x9303, - 0xE49B: 0x9304, - 0xE49C: 0x9305, - 0xE49D: 0x9306, - 0xE49E: 0x9307, - 0xE49F: 0x9308, - 0xE4A0: 0x9309, - 0xE4A1: 0x6D39, - 0xE4A2: 0x6D27, - 0xE4A3: 0x6D0C, - 0xE4A4: 0x6D43, - 0xE4A5: 0x6D48, - 0xE4A6: 0x6D07, - 0xE4A7: 0x6D04, - 0xE4A8: 0x6D19, - 0xE4A9: 0x6D0E, - 0xE4AA: 0x6D2B, - 0xE4AB: 0x6D4D, - 0xE4AC: 0x6D2E, - 0xE4AD: 0x6D35, - 0xE4AE: 0x6D1A, - 0xE4AF: 0x6D4F, - 0xE4B0: 0x6D52, - 0xE4B1: 0x6D54, - 0xE4B2: 0x6D33, - 0xE4B3: 0x6D91, - 0xE4B4: 0x6D6F, - 0xE4B5: 0x6D9E, - 0xE4B6: 0x6DA0, - 0xE4B7: 0x6D5E, - 0xE4B8: 0x6D93, - 0xE4B9: 0x6D94, - 0xE4BA: 0x6D5C, - 0xE4BB: 0x6D60, - 0xE4BC: 0x6D7C, - 0xE4BD: 0x6D63, - 0xE4BE: 0x6E1A, - 0xE4BF: 0x6DC7, - 0xE4C0: 0x6DC5, - 0xE4C1: 0x6DDE, - 0xE4C2: 0x6E0E, - 0xE4C3: 0x6DBF, - 0xE4C4: 0x6DE0, - 0xE4C5: 0x6E11, - 0xE4C6: 0x6DE6, - 0xE4C7: 0x6DDD, - 0xE4C8: 0x6DD9, - 0xE4C9: 0x6E16, - 0xE4CA: 0x6DAB, - 0xE4CB: 0x6E0C, - 0xE4CC: 0x6DAE, - 0xE4CD: 0x6E2B, - 0xE4CE: 0x6E6E, - 0xE4CF: 0x6E4E, - 0xE4D0: 0x6E6B, - 0xE4D1: 0x6EB2, - 0xE4D2: 0x6E5F, - 0xE4D3: 0x6E86, - 0xE4D4: 0x6E53, - 0xE4D5: 0x6E54, - 0xE4D6: 0x6E32, - 0xE4D7: 0x6E25, - 0xE4D8: 0x6E44, - 0xE4D9: 0x6EDF, - 0xE4DA: 0x6EB1, - 0xE4DB: 0x6E98, - 0xE4DC: 0x6EE0, - 0xE4DD: 0x6F2D, - 0xE4DE: 0x6EE2, - 0xE4DF: 0x6EA5, - 0xE4E0: 0x6EA7, - 0xE4E1: 0x6EBD, - 0xE4E2: 0x6EBB, - 0xE4E3: 0x6EB7, - 0xE4E4: 0x6ED7, - 0xE4E5: 0x6EB4, - 0xE4E6: 0x6ECF, - 0xE4E7: 0x6E8F, - 0xE4E8: 0x6EC2, - 0xE4E9: 0x6E9F, - 0xE4EA: 0x6F62, - 0xE4EB: 0x6F46, - 0xE4EC: 0x6F47, - 0xE4ED: 0x6F24, - 0xE4EE: 0x6F15, - 0xE4EF: 0x6EF9, - 0xE4F0: 0x6F2F, - 0xE4F1: 0x6F36, - 0xE4F2: 0x6F4B, - 0xE4F3: 0x6F74, - 0xE4F4: 0x6F2A, - 0xE4F5: 0x6F09, - 0xE4F6: 0x6F29, - 0xE4F7: 0x6F89, - 0xE4F8: 0x6F8D, - 0xE4F9: 0x6F8C, - 0xE4FA: 0x6F78, - 0xE4FB: 0x6F72, - 0xE4FC: 0x6F7C, - 0xE4FD: 0x6F7A, - 0xE4FE: 0x6FD1, - 0xE540: 0x930A, - 0xE541: 0x930B, - 0xE542: 0x930C, - 0xE543: 0x930D, - 0xE544: 0x930E, - 0xE545: 0x930F, - 0xE546: 0x9310, - 0xE547: 0x9311, - 0xE548: 0x9312, - 0xE549: 0x9313, - 0xE54A: 0x9314, - 0xE54B: 0x9315, - 0xE54C: 0x9316, - 0xE54D: 0x9317, - 0xE54E: 0x9318, - 0xE54F: 0x9319, - 0xE550: 0x931A, - 0xE551: 0x931B, - 0xE552: 0x931C, - 0xE553: 0x931D, - 0xE554: 0x931E, - 0xE555: 0x931F, - 0xE556: 0x9320, - 0xE557: 0x9321, - 0xE558: 0x9322, - 0xE559: 0x9323, - 0xE55A: 0x9324, - 0xE55B: 0x9325, - 0xE55C: 0x9326, - 0xE55D: 0x9327, - 0xE55E: 0x9328, - 0xE55F: 0x9329, - 0xE560: 0x932A, - 0xE561: 0x932B, - 0xE562: 0x932C, - 0xE563: 0x932D, - 0xE564: 0x932E, - 0xE565: 0x932F, - 0xE566: 0x9330, - 0xE567: 0x9331, - 0xE568: 0x9332, - 0xE569: 0x9333, - 0xE56A: 0x9334, - 0xE56B: 0x9335, - 0xE56C: 0x9336, - 0xE56D: 0x9337, - 0xE56E: 0x9338, - 0xE56F: 0x9339, - 0xE570: 0x933A, - 0xE571: 0x933B, - 0xE572: 0x933C, - 0xE573: 0x933D, - 0xE574: 0x933F, - 0xE575: 0x9340, - 0xE576: 0x9341, - 0xE577: 0x9342, - 0xE578: 0x9343, - 0xE579: 0x9344, - 0xE57A: 0x9345, - 0xE57B: 0x9346, - 0xE57C: 0x9347, - 0xE57D: 0x9348, - 0xE57E: 0x9349, - 0xE580: 0x934A, - 0xE581: 0x934B, - 0xE582: 0x934C, - 0xE583: 0x934D, - 0xE584: 0x934E, - 0xE585: 0x934F, - 0xE586: 0x9350, - 0xE587: 0x9351, - 0xE588: 0x9352, - 0xE589: 0x9353, - 0xE58A: 0x9354, - 0xE58B: 0x9355, - 0xE58C: 0x9356, - 0xE58D: 0x9357, - 0xE58E: 0x9358, - 0xE58F: 0x9359, - 0xE590: 0x935A, - 0xE591: 0x935B, - 0xE592: 0x935C, - 0xE593: 0x935D, - 0xE594: 0x935E, - 0xE595: 0x935F, - 0xE596: 0x9360, - 0xE597: 0x9361, - 0xE598: 0x9362, - 0xE599: 0x9363, - 0xE59A: 0x9364, - 0xE59B: 0x9365, - 0xE59C: 0x9366, - 0xE59D: 0x9367, - 0xE59E: 0x9368, - 0xE59F: 0x9369, - 0xE5A0: 0x936B, - 0xE5A1: 0x6FC9, - 0xE5A2: 0x6FA7, - 0xE5A3: 0x6FB9, - 0xE5A4: 0x6FB6, - 0xE5A5: 0x6FC2, - 0xE5A6: 0x6FE1, - 0xE5A7: 0x6FEE, - 0xE5A8: 0x6FDE, - 0xE5A9: 0x6FE0, - 0xE5AA: 0x6FEF, - 0xE5AB: 0x701A, - 0xE5AC: 0x7023, - 0xE5AD: 0x701B, - 0xE5AE: 0x7039, - 0xE5AF: 0x7035, - 0xE5B0: 0x704F, - 0xE5B1: 0x705E, - 0xE5B2: 0x5B80, - 0xE5B3: 0x5B84, - 0xE5B4: 0x5B95, - 0xE5B5: 0x5B93, - 0xE5B6: 0x5BA5, - 0xE5B7: 0x5BB8, - 0xE5B8: 0x752F, - 0xE5B9: 0x9A9E, - 0xE5BA: 0x6434, - 0xE5BB: 0x5BE4, - 0xE5BC: 0x5BEE, - 0xE5BD: 0x8930, - 0xE5BE: 0x5BF0, - 0xE5BF: 0x8E47, - 0xE5C0: 0x8B07, - 0xE5C1: 0x8FB6, - 0xE5C2: 0x8FD3, - 0xE5C3: 0x8FD5, - 0xE5C4: 0x8FE5, - 0xE5C5: 0x8FEE, - 0xE5C6: 0x8FE4, - 0xE5C7: 0x8FE9, - 0xE5C8: 0x8FE6, - 0xE5C9: 0x8FF3, - 0xE5CA: 0x8FE8, - 0xE5CB: 0x9005, - 0xE5CC: 0x9004, - 0xE5CD: 0x900B, - 0xE5CE: 0x9026, - 0xE5CF: 0x9011, - 0xE5D0: 0x900D, - 0xE5D1: 0x9016, - 0xE5D2: 0x9021, - 0xE5D3: 0x9035, - 0xE5D4: 0x9036, - 0xE5D5: 0x902D, - 0xE5D6: 0x902F, - 0xE5D7: 0x9044, - 0xE5D8: 0x9051, - 0xE5D9: 0x9052, - 0xE5DA: 0x9050, - 0xE5DB: 0x9068, - 0xE5DC: 0x9058, - 0xE5DD: 0x9062, - 0xE5DE: 0x905B, - 0xE5DF: 0x66B9, - 0xE5E0: 0x9074, - 0xE5E1: 0x907D, - 0xE5E2: 0x9082, - 0xE5E3: 0x9088, - 0xE5E4: 0x9083, - 0xE5E5: 0x908B, - 0xE5E6: 0x5F50, - 0xE5E7: 0x5F57, - 0xE5E8: 0x5F56, - 0xE5E9: 0x5F58, - 0xE5EA: 0x5C3B, - 0xE5EB: 0x54AB, - 0xE5EC: 0x5C50, - 0xE5ED: 0x5C59, - 0xE5EE: 0x5B71, - 0xE5EF: 0x5C63, - 0xE5F0: 0x5C66, - 0xE5F1: 0x7FBC, - 0xE5F2: 0x5F2A, - 0xE5F3: 0x5F29, - 0xE5F4: 0x5F2D, - 0xE5F5: 0x8274, - 0xE5F6: 0x5F3C, - 0xE5F7: 0x9B3B, - 0xE5F8: 0x5C6E, - 0xE5F9: 0x5981, - 0xE5FA: 0x5983, - 0xE5FB: 0x598D, - 0xE5FC: 0x59A9, - 0xE5FD: 0x59AA, - 0xE5FE: 0x59A3, - 0xE640: 0x936C, - 0xE641: 0x936D, - 0xE642: 0x936E, - 0xE643: 0x936F, - 0xE644: 0x9370, - 0xE645: 0x9371, - 0xE646: 0x9372, - 0xE647: 0x9373, - 0xE648: 0x9374, - 0xE649: 0x9375, - 0xE64A: 0x9376, - 0xE64B: 0x9377, - 0xE64C: 0x9378, - 0xE64D: 0x9379, - 0xE64E: 0x937A, - 0xE64F: 0x937B, - 0xE650: 0x937C, - 0xE651: 0x937D, - 0xE652: 0x937E, - 0xE653: 0x937F, - 0xE654: 0x9380, - 0xE655: 0x9381, - 0xE656: 0x9382, - 0xE657: 0x9383, - 0xE658: 0x9384, - 0xE659: 0x9385, - 0xE65A: 0x9386, - 0xE65B: 0x9387, - 0xE65C: 0x9388, - 0xE65D: 0x9389, - 0xE65E: 0x938A, - 0xE65F: 0x938B, - 0xE660: 0x938C, - 0xE661: 0x938D, - 0xE662: 0x938E, - 0xE663: 0x9390, - 0xE664: 0x9391, - 0xE665: 0x9392, - 0xE666: 0x9393, - 0xE667: 0x9394, - 0xE668: 0x9395, - 0xE669: 0x9396, - 0xE66A: 0x9397, - 0xE66B: 0x9398, - 0xE66C: 0x9399, - 0xE66D: 0x939A, - 0xE66E: 0x939B, - 0xE66F: 0x939C, - 0xE670: 0x939D, - 0xE671: 0x939E, - 0xE672: 0x939F, - 0xE673: 0x93A0, - 0xE674: 0x93A1, - 0xE675: 0x93A2, - 0xE676: 0x93A3, - 0xE677: 0x93A4, - 0xE678: 0x93A5, - 0xE679: 0x93A6, - 0xE67A: 0x93A7, - 0xE67B: 0x93A8, - 0xE67C: 0x93A9, - 0xE67D: 0x93AA, - 0xE67E: 0x93AB, - 0xE680: 0x93AC, - 0xE681: 0x93AD, - 0xE682: 0x93AE, - 0xE683: 0x93AF, - 0xE684: 0x93B0, - 0xE685: 0x93B1, - 0xE686: 0x93B2, - 0xE687: 0x93B3, - 0xE688: 0x93B4, - 0xE689: 0x93B5, - 0xE68A: 0x93B6, - 0xE68B: 0x93B7, - 0xE68C: 0x93B8, - 0xE68D: 0x93B9, - 0xE68E: 0x93BA, - 0xE68F: 0x93BB, - 0xE690: 0x93BC, - 0xE691: 0x93BD, - 0xE692: 0x93BE, - 0xE693: 0x93BF, - 0xE694: 0x93C0, - 0xE695: 0x93C1, - 0xE696: 0x93C2, - 0xE697: 0x93C3, - 0xE698: 0x93C4, - 0xE699: 0x93C5, - 0xE69A: 0x93C6, - 0xE69B: 0x93C7, - 0xE69C: 0x93C8, - 0xE69D: 0x93C9, - 0xE69E: 0x93CB, - 0xE69F: 0x93CC, - 0xE6A0: 0x93CD, - 0xE6A1: 0x5997, - 0xE6A2: 0x59CA, - 0xE6A3: 0x59AB, - 0xE6A4: 0x599E, - 0xE6A5: 0x59A4, - 0xE6A6: 0x59D2, - 0xE6A7: 0x59B2, - 0xE6A8: 0x59AF, - 0xE6A9: 0x59D7, - 0xE6AA: 0x59BE, - 0xE6AB: 0x5A05, - 0xE6AC: 0x5A06, - 0xE6AD: 0x59DD, - 0xE6AE: 0x5A08, - 0xE6AF: 0x59E3, - 0xE6B0: 0x59D8, - 0xE6B1: 0x59F9, - 0xE6B2: 0x5A0C, - 0xE6B3: 0x5A09, - 0xE6B4: 0x5A32, - 0xE6B5: 0x5A34, - 0xE6B6: 0x5A11, - 0xE6B7: 0x5A23, - 0xE6B8: 0x5A13, - 0xE6B9: 0x5A40, - 0xE6BA: 0x5A67, - 0xE6BB: 0x5A4A, - 0xE6BC: 0x5A55, - 0xE6BD: 0x5A3C, - 0xE6BE: 0x5A62, - 0xE6BF: 0x5A75, - 0xE6C0: 0x80EC, - 0xE6C1: 0x5AAA, - 0xE6C2: 0x5A9B, - 0xE6C3: 0x5A77, - 0xE6C4: 0x5A7A, - 0xE6C5: 0x5ABE, - 0xE6C6: 0x5AEB, - 0xE6C7: 0x5AB2, - 0xE6C8: 0x5AD2, - 0xE6C9: 0x5AD4, - 0xE6CA: 0x5AB8, - 0xE6CB: 0x5AE0, - 0xE6CC: 0x5AE3, - 0xE6CD: 0x5AF1, - 0xE6CE: 0x5AD6, - 0xE6CF: 0x5AE6, - 0xE6D0: 0x5AD8, - 0xE6D1: 0x5ADC, - 0xE6D2: 0x5B09, - 0xE6D3: 0x5B17, - 0xE6D4: 0x5B16, - 0xE6D5: 0x5B32, - 0xE6D6: 0x5B37, - 0xE6D7: 0x5B40, - 0xE6D8: 0x5C15, - 0xE6D9: 0x5C1C, - 0xE6DA: 0x5B5A, - 0xE6DB: 0x5B65, - 0xE6DC: 0x5B73, - 0xE6DD: 0x5B51, - 0xE6DE: 0x5B53, - 0xE6DF: 0x5B62, - 0xE6E0: 0x9A75, - 0xE6E1: 0x9A77, - 0xE6E2: 0x9A78, - 0xE6E3: 0x9A7A, - 0xE6E4: 0x9A7F, - 0xE6E5: 0x9A7D, - 0xE6E6: 0x9A80, - 0xE6E7: 0x9A81, - 0xE6E8: 0x9A85, - 0xE6E9: 0x9A88, - 0xE6EA: 0x9A8A, - 0xE6EB: 0x9A90, - 0xE6EC: 0x9A92, - 0xE6ED: 0x9A93, - 0xE6EE: 0x9A96, - 0xE6EF: 0x9A98, - 0xE6F0: 0x9A9B, - 0xE6F1: 0x9A9C, - 0xE6F2: 0x9A9D, - 0xE6F3: 0x9A9F, - 0xE6F4: 0x9AA0, - 0xE6F5: 0x9AA2, - 0xE6F6: 0x9AA3, - 0xE6F7: 0x9AA5, - 0xE6F8: 0x9AA7, - 0xE6F9: 0x7E9F, - 0xE6FA: 0x7EA1, - 0xE6FB: 0x7EA3, - 0xE6FC: 0x7EA5, - 0xE6FD: 0x7EA8, - 0xE6FE: 0x7EA9, - 0xE740: 0x93CE, - 0xE741: 0x93CF, - 0xE742: 0x93D0, - 0xE743: 0x93D1, - 0xE744: 0x93D2, - 0xE745: 0x93D3, - 0xE746: 0x93D4, - 0xE747: 0x93D5, - 0xE748: 0x93D7, - 0xE749: 0x93D8, - 0xE74A: 0x93D9, - 0xE74B: 0x93DA, - 0xE74C: 0x93DB, - 0xE74D: 0x93DC, - 0xE74E: 0x93DD, - 0xE74F: 0x93DE, - 0xE750: 0x93DF, - 0xE751: 0x93E0, - 0xE752: 0x93E1, - 0xE753: 0x93E2, - 0xE754: 0x93E3, - 0xE755: 0x93E4, - 0xE756: 0x93E5, - 0xE757: 0x93E6, - 0xE758: 0x93E7, - 0xE759: 0x93E8, - 0xE75A: 0x93E9, - 0xE75B: 0x93EA, - 0xE75C: 0x93EB, - 0xE75D: 0x93EC, - 0xE75E: 0x93ED, - 0xE75F: 0x93EE, - 0xE760: 0x93EF, - 0xE761: 0x93F0, - 0xE762: 0x93F1, - 0xE763: 0x93F2, - 0xE764: 0x93F3, - 0xE765: 0x93F4, - 0xE766: 0x93F5, - 0xE767: 0x93F6, - 0xE768: 0x93F7, - 0xE769: 0x93F8, - 0xE76A: 0x93F9, - 0xE76B: 0x93FA, - 0xE76C: 0x93FB, - 0xE76D: 0x93FC, - 0xE76E: 0x93FD, - 0xE76F: 0x93FE, - 0xE770: 0x93FF, - 0xE771: 0x9400, - 0xE772: 0x9401, - 0xE773: 0x9402, - 0xE774: 0x9403, - 0xE775: 0x9404, - 0xE776: 0x9405, - 0xE777: 0x9406, - 0xE778: 0x9407, - 0xE779: 0x9408, - 0xE77A: 0x9409, - 0xE77B: 0x940A, - 0xE77C: 0x940B, - 0xE77D: 0x940C, - 0xE77E: 0x940D, - 0xE780: 0x940E, - 0xE781: 0x940F, - 0xE782: 0x9410, - 0xE783: 0x9411, - 0xE784: 0x9412, - 0xE785: 0x9413, - 0xE786: 0x9414, - 0xE787: 0x9415, - 0xE788: 0x9416, - 0xE789: 0x9417, - 0xE78A: 0x9418, - 0xE78B: 0x9419, - 0xE78C: 0x941A, - 0xE78D: 0x941B, - 0xE78E: 0x941C, - 0xE78F: 0x941D, - 0xE790: 0x941E, - 0xE791: 0x941F, - 0xE792: 0x9420, - 0xE793: 0x9421, - 0xE794: 0x9422, - 0xE795: 0x9423, - 0xE796: 0x9424, - 0xE797: 0x9425, - 0xE798: 0x9426, - 0xE799: 0x9427, - 0xE79A: 0x9428, - 0xE79B: 0x9429, - 0xE79C: 0x942A, - 0xE79D: 0x942B, - 0xE79E: 0x942C, - 0xE79F: 0x942D, - 0xE7A0: 0x942E, - 0xE7A1: 0x7EAD, - 0xE7A2: 0x7EB0, - 0xE7A3: 0x7EBE, - 0xE7A4: 0x7EC0, - 0xE7A5: 0x7EC1, - 0xE7A6: 0x7EC2, - 0xE7A7: 0x7EC9, - 0xE7A8: 0x7ECB, - 0xE7A9: 0x7ECC, - 0xE7AA: 0x7ED0, - 0xE7AB: 0x7ED4, - 0xE7AC: 0x7ED7, - 0xE7AD: 0x7EDB, - 0xE7AE: 0x7EE0, - 0xE7AF: 0x7EE1, - 0xE7B0: 0x7EE8, - 0xE7B1: 0x7EEB, - 0xE7B2: 0x7EEE, - 0xE7B3: 0x7EEF, - 0xE7B4: 0x7EF1, - 0xE7B5: 0x7EF2, - 0xE7B6: 0x7F0D, - 0xE7B7: 0x7EF6, - 0xE7B8: 0x7EFA, - 0xE7B9: 0x7EFB, - 0xE7BA: 0x7EFE, - 0xE7BB: 0x7F01, - 0xE7BC: 0x7F02, - 0xE7BD: 0x7F03, - 0xE7BE: 0x7F07, - 0xE7BF: 0x7F08, - 0xE7C0: 0x7F0B, - 0xE7C1: 0x7F0C, - 0xE7C2: 0x7F0F, - 0xE7C3: 0x7F11, - 0xE7C4: 0x7F12, - 0xE7C5: 0x7F17, - 0xE7C6: 0x7F19, - 0xE7C7: 0x7F1C, - 0xE7C8: 0x7F1B, - 0xE7C9: 0x7F1F, - 0xE7CA: 0x7F21, - 0xE7CB: 0x7F22, - 0xE7CC: 0x7F23, - 0xE7CD: 0x7F24, - 0xE7CE: 0x7F25, - 0xE7CF: 0x7F26, - 0xE7D0: 0x7F27, - 0xE7D1: 0x7F2A, - 0xE7D2: 0x7F2B, - 0xE7D3: 0x7F2C, - 0xE7D4: 0x7F2D, - 0xE7D5: 0x7F2F, - 0xE7D6: 0x7F30, - 0xE7D7: 0x7F31, - 0xE7D8: 0x7F32, - 0xE7D9: 0x7F33, - 0xE7DA: 0x7F35, - 0xE7DB: 0x5E7A, - 0xE7DC: 0x757F, - 0xE7DD: 0x5DDB, - 0xE7DE: 0x753E, - 0xE7DF: 0x9095, - 0xE7E0: 0x738E, - 0xE7E1: 0x7391, - 0xE7E2: 0x73AE, - 0xE7E3: 0x73A2, - 0xE7E4: 0x739F, - 0xE7E5: 0x73CF, - 0xE7E6: 0x73C2, - 0xE7E7: 0x73D1, - 0xE7E8: 0x73B7, - 0xE7E9: 0x73B3, - 0xE7EA: 0x73C0, - 0xE7EB: 0x73C9, - 0xE7EC: 0x73C8, - 0xE7ED: 0x73E5, - 0xE7EE: 0x73D9, - 0xE7EF: 0x987C, - 0xE7F0: 0x740A, - 0xE7F1: 0x73E9, - 0xE7F2: 0x73E7, - 0xE7F3: 0x73DE, - 0xE7F4: 0x73BA, - 0xE7F5: 0x73F2, - 0xE7F6: 0x740F, - 0xE7F7: 0x742A, - 0xE7F8: 0x745B, - 0xE7F9: 0x7426, - 0xE7FA: 0x7425, - 0xE7FB: 0x7428, - 0xE7FC: 0x7430, - 0xE7FD: 0x742E, - 0xE7FE: 0x742C, - 0xE840: 0x942F, - 0xE841: 0x9430, - 0xE842: 0x9431, - 0xE843: 0x9432, - 0xE844: 0x9433, - 0xE845: 0x9434, - 0xE846: 0x9435, - 0xE847: 0x9436, - 0xE848: 0x9437, - 0xE849: 0x9438, - 0xE84A: 0x9439, - 0xE84B: 0x943A, - 0xE84C: 0x943B, - 0xE84D: 0x943C, - 0xE84E: 0x943D, - 0xE84F: 0x943F, - 0xE850: 0x9440, - 0xE851: 0x9441, - 0xE852: 0x9442, - 0xE853: 0x9443, - 0xE854: 0x9444, - 0xE855: 0x9445, - 0xE856: 0x9446, - 0xE857: 0x9447, - 0xE858: 0x9448, - 0xE859: 0x9449, - 0xE85A: 0x944A, - 0xE85B: 0x944B, - 0xE85C: 0x944C, - 0xE85D: 0x944D, - 0xE85E: 0x944E, - 0xE85F: 0x944F, - 0xE860: 0x9450, - 0xE861: 0x9451, - 0xE862: 0x9452, - 0xE863: 0x9453, - 0xE864: 0x9454, - 0xE865: 0x9455, - 0xE866: 0x9456, - 0xE867: 0x9457, - 0xE868: 0x9458, - 0xE869: 0x9459, - 0xE86A: 0x945A, - 0xE86B: 0x945B, - 0xE86C: 0x945C, - 0xE86D: 0x945D, - 0xE86E: 0x945E, - 0xE86F: 0x945F, - 0xE870: 0x9460, - 0xE871: 0x9461, - 0xE872: 0x9462, - 0xE873: 0x9463, - 0xE874: 0x9464, - 0xE875: 0x9465, - 0xE876: 0x9466, - 0xE877: 0x9467, - 0xE878: 0x9468, - 0xE879: 0x9469, - 0xE87A: 0x946A, - 0xE87B: 0x946C, - 0xE87C: 0x946D, - 0xE87D: 0x946E, - 0xE87E: 0x946F, - 0xE880: 0x9470, - 0xE881: 0x9471, - 0xE882: 0x9472, - 0xE883: 0x9473, - 0xE884: 0x9474, - 0xE885: 0x9475, - 0xE886: 0x9476, - 0xE887: 0x9477, - 0xE888: 0x9478, - 0xE889: 0x9479, - 0xE88A: 0x947A, - 0xE88B: 0x947B, - 0xE88C: 0x947C, - 0xE88D: 0x947D, - 0xE88E: 0x947E, - 0xE88F: 0x947F, - 0xE890: 0x9480, - 0xE891: 0x9481, - 0xE892: 0x9482, - 0xE893: 0x9483, - 0xE894: 0x9484, - 0xE895: 0x9491, - 0xE896: 0x9496, - 0xE897: 0x9498, - 0xE898: 0x94C7, - 0xE899: 0x94CF, - 0xE89A: 0x94D3, - 0xE89B: 0x94D4, - 0xE89C: 0x94DA, - 0xE89D: 0x94E6, - 0xE89E: 0x94FB, - 0xE89F: 0x951C, - 0xE8A0: 0x9520, - 0xE8A1: 0x741B, - 0xE8A2: 0x741A, - 0xE8A3: 0x7441, - 0xE8A4: 0x745C, - 0xE8A5: 0x7457, - 0xE8A6: 0x7455, - 0xE8A7: 0x7459, - 0xE8A8: 0x7477, - 0xE8A9: 0x746D, - 0xE8AA: 0x747E, - 0xE8AB: 0x749C, - 0xE8AC: 0x748E, - 0xE8AD: 0x7480, - 0xE8AE: 0x7481, - 0xE8AF: 0x7487, - 0xE8B0: 0x748B, - 0xE8B1: 0x749E, - 0xE8B2: 0x74A8, - 0xE8B3: 0x74A9, - 0xE8B4: 0x7490, - 0xE8B5: 0x74A7, - 0xE8B6: 0x74D2, - 0xE8B7: 0x74BA, - 0xE8B8: 0x97EA, - 0xE8B9: 0x97EB, - 0xE8BA: 0x97EC, - 0xE8BB: 0x674C, - 0xE8BC: 0x6753, - 0xE8BD: 0x675E, - 0xE8BE: 0x6748, - 0xE8BF: 0x6769, - 0xE8C0: 0x67A5, - 0xE8C1: 0x6787, - 0xE8C2: 0x676A, - 0xE8C3: 0x6773, - 0xE8C4: 0x6798, - 0xE8C5: 0x67A7, - 0xE8C6: 0x6775, - 0xE8C7: 0x67A8, - 0xE8C8: 0x679E, - 0xE8C9: 0x67AD, - 0xE8CA: 0x678B, - 0xE8CB: 0x6777, - 0xE8CC: 0x677C, - 0xE8CD: 0x67F0, - 0xE8CE: 0x6809, - 0xE8CF: 0x67D8, - 0xE8D0: 0x680A, - 0xE8D1: 0x67E9, - 0xE8D2: 0x67B0, - 0xE8D3: 0x680C, - 0xE8D4: 0x67D9, - 0xE8D5: 0x67B5, - 0xE8D6: 0x67DA, - 0xE8D7: 0x67B3, - 0xE8D8: 0x67DD, - 0xE8D9: 0x6800, - 0xE8DA: 0x67C3, - 0xE8DB: 0x67B8, - 0xE8DC: 0x67E2, - 0xE8DD: 0x680E, - 0xE8DE: 0x67C1, - 0xE8DF: 0x67FD, - 0xE8E0: 0x6832, - 0xE8E1: 0x6833, - 0xE8E2: 0x6860, - 0xE8E3: 0x6861, - 0xE8E4: 0x684E, - 0xE8E5: 0x6862, - 0xE8E6: 0x6844, - 0xE8E7: 0x6864, - 0xE8E8: 0x6883, - 0xE8E9: 0x681D, - 0xE8EA: 0x6855, - 0xE8EB: 0x6866, - 0xE8EC: 0x6841, - 0xE8ED: 0x6867, - 0xE8EE: 0x6840, - 0xE8EF: 0x683E, - 0xE8F0: 0x684A, - 0xE8F1: 0x6849, - 0xE8F2: 0x6829, - 0xE8F3: 0x68B5, - 0xE8F4: 0x688F, - 0xE8F5: 0x6874, - 0xE8F6: 0x6877, - 0xE8F7: 0x6893, - 0xE8F8: 0x686B, - 0xE8F9: 0x68C2, - 0xE8FA: 0x696E, - 0xE8FB: 0x68FC, - 0xE8FC: 0x691F, - 0xE8FD: 0x6920, - 0xE8FE: 0x68F9, - 0xE940: 0x9527, - 0xE941: 0x9533, - 0xE942: 0x953D, - 0xE943: 0x9543, - 0xE944: 0x9548, - 0xE945: 0x954B, - 0xE946: 0x9555, - 0xE947: 0x955A, - 0xE948: 0x9560, - 0xE949: 0x956E, - 0xE94A: 0x9574, - 0xE94B: 0x9575, - 0xE94C: 0x9577, - 0xE94D: 0x9578, - 0xE94E: 0x9579, - 0xE94F: 0x957A, - 0xE950: 0x957B, - 0xE951: 0x957C, - 0xE952: 0x957D, - 0xE953: 0x957E, - 0xE954: 0x9580, - 0xE955: 0x9581, - 0xE956: 0x9582, - 0xE957: 0x9583, - 0xE958: 0x9584, - 0xE959: 0x9585, - 0xE95A: 0x9586, - 0xE95B: 0x9587, - 0xE95C: 0x9588, - 0xE95D: 0x9589, - 0xE95E: 0x958A, - 0xE95F: 0x958B, - 0xE960: 0x958C, - 0xE961: 0x958D, - 0xE962: 0x958E, - 0xE963: 0x958F, - 0xE964: 0x9590, - 0xE965: 0x9591, - 0xE966: 0x9592, - 0xE967: 0x9593, - 0xE968: 0x9594, - 0xE969: 0x9595, - 0xE96A: 0x9596, - 0xE96B: 0x9597, - 0xE96C: 0x9598, - 0xE96D: 0x9599, - 0xE96E: 0x959A, - 0xE96F: 0x959B, - 0xE970: 0x959C, - 0xE971: 0x959D, - 0xE972: 0x959E, - 0xE973: 0x959F, - 0xE974: 0x95A0, - 0xE975: 0x95A1, - 0xE976: 0x95A2, - 0xE977: 0x95A3, - 0xE978: 0x95A4, - 0xE979: 0x95A5, - 0xE97A: 0x95A6, - 0xE97B: 0x95A7, - 0xE97C: 0x95A8, - 0xE97D: 0x95A9, - 0xE97E: 0x95AA, - 0xE980: 0x95AB, - 0xE981: 0x95AC, - 0xE982: 0x95AD, - 0xE983: 0x95AE, - 0xE984: 0x95AF, - 0xE985: 0x95B0, - 0xE986: 0x95B1, - 0xE987: 0x95B2, - 0xE988: 0x95B3, - 0xE989: 0x95B4, - 0xE98A: 0x95B5, - 0xE98B: 0x95B6, - 0xE98C: 0x95B7, - 0xE98D: 0x95B8, - 0xE98E: 0x95B9, - 0xE98F: 0x95BA, - 0xE990: 0x95BB, - 0xE991: 0x95BC, - 0xE992: 0x95BD, - 0xE993: 0x95BE, - 0xE994: 0x95BF, - 0xE995: 0x95C0, - 0xE996: 0x95C1, - 0xE997: 0x95C2, - 0xE998: 0x95C3, - 0xE999: 0x95C4, - 0xE99A: 0x95C5, - 0xE99B: 0x95C6, - 0xE99C: 0x95C7, - 0xE99D: 0x95C8, - 0xE99E: 0x95C9, - 0xE99F: 0x95CA, - 0xE9A0: 0x95CB, - 0xE9A1: 0x6924, - 0xE9A2: 0x68F0, - 0xE9A3: 0x690B, - 0xE9A4: 0x6901, - 0xE9A5: 0x6957, - 0xE9A6: 0x68E3, - 0xE9A7: 0x6910, - 0xE9A8: 0x6971, - 0xE9A9: 0x6939, - 0xE9AA: 0x6960, - 0xE9AB: 0x6942, - 0xE9AC: 0x695D, - 0xE9AD: 0x6984, - 0xE9AE: 0x696B, - 0xE9AF: 0x6980, - 0xE9B0: 0x6998, - 0xE9B1: 0x6978, - 0xE9B2: 0x6934, - 0xE9B3: 0x69CC, - 0xE9B4: 0x6987, - 0xE9B5: 0x6988, - 0xE9B6: 0x69CE, - 0xE9B7: 0x6989, - 0xE9B8: 0x6966, - 0xE9B9: 0x6963, - 0xE9BA: 0x6979, - 0xE9BB: 0x699B, - 0xE9BC: 0x69A7, - 0xE9BD: 0x69BB, - 0xE9BE: 0x69AB, - 0xE9BF: 0x69AD, - 0xE9C0: 0x69D4, - 0xE9C1: 0x69B1, - 0xE9C2: 0x69C1, - 0xE9C3: 0x69CA, - 0xE9C4: 0x69DF, - 0xE9C5: 0x6995, - 0xE9C6: 0x69E0, - 0xE9C7: 0x698D, - 0xE9C8: 0x69FF, - 0xE9C9: 0x6A2F, - 0xE9CA: 0x69ED, - 0xE9CB: 0x6A17, - 0xE9CC: 0x6A18, - 0xE9CD: 0x6A65, - 0xE9CE: 0x69F2, - 0xE9CF: 0x6A44, - 0xE9D0: 0x6A3E, - 0xE9D1: 0x6AA0, - 0xE9D2: 0x6A50, - 0xE9D3: 0x6A5B, - 0xE9D4: 0x6A35, - 0xE9D5: 0x6A8E, - 0xE9D6: 0x6A79, - 0xE9D7: 0x6A3D, - 0xE9D8: 0x6A28, - 0xE9D9: 0x6A58, - 0xE9DA: 0x6A7C, - 0xE9DB: 0x6A91, - 0xE9DC: 0x6A90, - 0xE9DD: 0x6AA9, - 0xE9DE: 0x6A97, - 0xE9DF: 0x6AAB, - 0xE9E0: 0x7337, - 0xE9E1: 0x7352, - 0xE9E2: 0x6B81, - 0xE9E3: 0x6B82, - 0xE9E4: 0x6B87, - 0xE9E5: 0x6B84, - 0xE9E6: 0x6B92, - 0xE9E7: 0x6B93, - 0xE9E8: 0x6B8D, - 0xE9E9: 0x6B9A, - 0xE9EA: 0x6B9B, - 0xE9EB: 0x6BA1, - 0xE9EC: 0x6BAA, - 0xE9ED: 0x8F6B, - 0xE9EE: 0x8F6D, - 0xE9EF: 0x8F71, - 0xE9F0: 0x8F72, - 0xE9F1: 0x8F73, - 0xE9F2: 0x8F75, - 0xE9F3: 0x8F76, - 0xE9F4: 0x8F78, - 0xE9F5: 0x8F77, - 0xE9F6: 0x8F79, - 0xE9F7: 0x8F7A, - 0xE9F8: 0x8F7C, - 0xE9F9: 0x8F7E, - 0xE9FA: 0x8F81, - 0xE9FB: 0x8F82, - 0xE9FC: 0x8F84, - 0xE9FD: 0x8F87, - 0xE9FE: 0x8F8B, - 0xEA40: 0x95CC, - 0xEA41: 0x95CD, - 0xEA42: 0x95CE, - 0xEA43: 0x95CF, - 0xEA44: 0x95D0, - 0xEA45: 0x95D1, - 0xEA46: 0x95D2, - 0xEA47: 0x95D3, - 0xEA48: 0x95D4, - 0xEA49: 0x95D5, - 0xEA4A: 0x95D6, - 0xEA4B: 0x95D7, - 0xEA4C: 0x95D8, - 0xEA4D: 0x95D9, - 0xEA4E: 0x95DA, - 0xEA4F: 0x95DB, - 0xEA50: 0x95DC, - 0xEA51: 0x95DD, - 0xEA52: 0x95DE, - 0xEA53: 0x95DF, - 0xEA54: 0x95E0, - 0xEA55: 0x95E1, - 0xEA56: 0x95E2, - 0xEA57: 0x95E3, - 0xEA58: 0x95E4, - 0xEA59: 0x95E5, - 0xEA5A: 0x95E6, - 0xEA5B: 0x95E7, - 0xEA5C: 0x95EC, - 0xEA5D: 0x95FF, - 0xEA5E: 0x9607, - 0xEA5F: 0x9613, - 0xEA60: 0x9618, - 0xEA61: 0x961B, - 0xEA62: 0x961E, - 0xEA63: 0x9620, - 0xEA64: 0x9623, - 0xEA65: 0x9624, - 0xEA66: 0x9625, - 0xEA67: 0x9626, - 0xEA68: 0x9627, - 0xEA69: 0x9628, - 0xEA6A: 0x9629, - 0xEA6B: 0x962B, - 0xEA6C: 0x962C, - 0xEA6D: 0x962D, - 0xEA6E: 0x962F, - 0xEA6F: 0x9630, - 0xEA70: 0x9637, - 0xEA71: 0x9638, - 0xEA72: 0x9639, - 0xEA73: 0x963A, - 0xEA74: 0x963E, - 0xEA75: 0x9641, - 0xEA76: 0x9643, - 0xEA77: 0x964A, - 0xEA78: 0x964E, - 0xEA79: 0x964F, - 0xEA7A: 0x9651, - 0xEA7B: 0x9652, - 0xEA7C: 0x9653, - 0xEA7D: 0x9656, - 0xEA7E: 0x9657, - 0xEA80: 0x9658, - 0xEA81: 0x9659, - 0xEA82: 0x965A, - 0xEA83: 0x965C, - 0xEA84: 0x965D, - 0xEA85: 0x965E, - 0xEA86: 0x9660, - 0xEA87: 0x9663, - 0xEA88: 0x9665, - 0xEA89: 0x9666, - 0xEA8A: 0x966B, - 0xEA8B: 0x966D, - 0xEA8C: 0x966E, - 0xEA8D: 0x966F, - 0xEA8E: 0x9670, - 0xEA8F: 0x9671, - 0xEA90: 0x9673, - 0xEA91: 0x9678, - 0xEA92: 0x9679, - 0xEA93: 0x967A, - 0xEA94: 0x967B, - 0xEA95: 0x967C, - 0xEA96: 0x967D, - 0xEA97: 0x967E, - 0xEA98: 0x967F, - 0xEA99: 0x9680, - 0xEA9A: 0x9681, - 0xEA9B: 0x9682, - 0xEA9C: 0x9683, - 0xEA9D: 0x9684, - 0xEA9E: 0x9687, - 0xEA9F: 0x9689, - 0xEAA0: 0x968A, - 0xEAA1: 0x8F8D, - 0xEAA2: 0x8F8E, - 0xEAA3: 0x8F8F, - 0xEAA4: 0x8F98, - 0xEAA5: 0x8F9A, - 0xEAA6: 0x8ECE, - 0xEAA7: 0x620B, - 0xEAA8: 0x6217, - 0xEAA9: 0x621B, - 0xEAAA: 0x621F, - 0xEAAB: 0x6222, - 0xEAAC: 0x6221, - 0xEAAD: 0x6225, - 0xEAAE: 0x6224, - 0xEAAF: 0x622C, - 0xEAB0: 0x81E7, - 0xEAB1: 0x74EF, - 0xEAB2: 0x74F4, - 0xEAB3: 0x74FF, - 0xEAB4: 0x750F, - 0xEAB5: 0x7511, - 0xEAB6: 0x7513, - 0xEAB7: 0x6534, - 0xEAB8: 0x65EE, - 0xEAB9: 0x65EF, - 0xEABA: 0x65F0, - 0xEABB: 0x660A, - 0xEABC: 0x6619, - 0xEABD: 0x6772, - 0xEABE: 0x6603, - 0xEABF: 0x6615, - 0xEAC0: 0x6600, - 0xEAC1: 0x7085, - 0xEAC2: 0x66F7, - 0xEAC3: 0x661D, - 0xEAC4: 0x6634, - 0xEAC5: 0x6631, - 0xEAC6: 0x6636, - 0xEAC7: 0x6635, - 0xEAC8: 0x8006, - 0xEAC9: 0x665F, - 0xEACA: 0x6654, - 0xEACB: 0x6641, - 0xEACC: 0x664F, - 0xEACD: 0x6656, - 0xEACE: 0x6661, - 0xEACF: 0x6657, - 0xEAD0: 0x6677, - 0xEAD1: 0x6684, - 0xEAD2: 0x668C, - 0xEAD3: 0x66A7, - 0xEAD4: 0x669D, - 0xEAD5: 0x66BE, - 0xEAD6: 0x66DB, - 0xEAD7: 0x66DC, - 0xEAD8: 0x66E6, - 0xEAD9: 0x66E9, - 0xEADA: 0x8D32, - 0xEADB: 0x8D33, - 0xEADC: 0x8D36, - 0xEADD: 0x8D3B, - 0xEADE: 0x8D3D, - 0xEADF: 0x8D40, - 0xEAE0: 0x8D45, - 0xEAE1: 0x8D46, - 0xEAE2: 0x8D48, - 0xEAE3: 0x8D49, - 0xEAE4: 0x8D47, - 0xEAE5: 0x8D4D, - 0xEAE6: 0x8D55, - 0xEAE7: 0x8D59, - 0xEAE8: 0x89C7, - 0xEAE9: 0x89CA, - 0xEAEA: 0x89CB, - 0xEAEB: 0x89CC, - 0xEAEC: 0x89CE, - 0xEAED: 0x89CF, - 0xEAEE: 0x89D0, - 0xEAEF: 0x89D1, - 0xEAF0: 0x726E, - 0xEAF1: 0x729F, - 0xEAF2: 0x725D, - 0xEAF3: 0x7266, - 0xEAF4: 0x726F, - 0xEAF5: 0x727E, - 0xEAF6: 0x727F, - 0xEAF7: 0x7284, - 0xEAF8: 0x728B, - 0xEAF9: 0x728D, - 0xEAFA: 0x728F, - 0xEAFB: 0x7292, - 0xEAFC: 0x6308, - 0xEAFD: 0x6332, - 0xEAFE: 0x63B0, - 0xEB40: 0x968C, - 0xEB41: 0x968E, - 0xEB42: 0x9691, - 0xEB43: 0x9692, - 0xEB44: 0x9693, - 0xEB45: 0x9695, - 0xEB46: 0x9696, - 0xEB47: 0x969A, - 0xEB48: 0x969B, - 0xEB49: 0x969D, - 0xEB4A: 0x969E, - 0xEB4B: 0x969F, - 0xEB4C: 0x96A0, - 0xEB4D: 0x96A1, - 0xEB4E: 0x96A2, - 0xEB4F: 0x96A3, - 0xEB50: 0x96A4, - 0xEB51: 0x96A5, - 0xEB52: 0x96A6, - 0xEB53: 0x96A8, - 0xEB54: 0x96A9, - 0xEB55: 0x96AA, - 0xEB56: 0x96AB, - 0xEB57: 0x96AC, - 0xEB58: 0x96AD, - 0xEB59: 0x96AE, - 0xEB5A: 0x96AF, - 0xEB5B: 0x96B1, - 0xEB5C: 0x96B2, - 0xEB5D: 0x96B4, - 0xEB5E: 0x96B5, - 0xEB5F: 0x96B7, - 0xEB60: 0x96B8, - 0xEB61: 0x96BA, - 0xEB62: 0x96BB, - 0xEB63: 0x96BF, - 0xEB64: 0x96C2, - 0xEB65: 0x96C3, - 0xEB66: 0x96C8, - 0xEB67: 0x96CA, - 0xEB68: 0x96CB, - 0xEB69: 0x96D0, - 0xEB6A: 0x96D1, - 0xEB6B: 0x96D3, - 0xEB6C: 0x96D4, - 0xEB6D: 0x96D6, - 0xEB6E: 0x96D7, - 0xEB6F: 0x96D8, - 0xEB70: 0x96D9, - 0xEB71: 0x96DA, - 0xEB72: 0x96DB, - 0xEB73: 0x96DC, - 0xEB74: 0x96DD, - 0xEB75: 0x96DE, - 0xEB76: 0x96DF, - 0xEB77: 0x96E1, - 0xEB78: 0x96E2, - 0xEB79: 0x96E3, - 0xEB7A: 0x96E4, - 0xEB7B: 0x96E5, - 0xEB7C: 0x96E6, - 0xEB7D: 0x96E7, - 0xEB7E: 0x96EB, - 0xEB80: 0x96EC, - 0xEB81: 0x96ED, - 0xEB82: 0x96EE, - 0xEB83: 0x96F0, - 0xEB84: 0x96F1, - 0xEB85: 0x96F2, - 0xEB86: 0x96F4, - 0xEB87: 0x96F5, - 0xEB88: 0x96F8, - 0xEB89: 0x96FA, - 0xEB8A: 0x96FB, - 0xEB8B: 0x96FC, - 0xEB8C: 0x96FD, - 0xEB8D: 0x96FF, - 0xEB8E: 0x9702, - 0xEB8F: 0x9703, - 0xEB90: 0x9705, - 0xEB91: 0x970A, - 0xEB92: 0x970B, - 0xEB93: 0x970C, - 0xEB94: 0x9710, - 0xEB95: 0x9711, - 0xEB96: 0x9712, - 0xEB97: 0x9714, - 0xEB98: 0x9715, - 0xEB99: 0x9717, - 0xEB9A: 0x9718, - 0xEB9B: 0x9719, - 0xEB9C: 0x971A, - 0xEB9D: 0x971B, - 0xEB9E: 0x971D, - 0xEB9F: 0x971F, - 0xEBA0: 0x9720, - 0xEBA1: 0x643F, - 0xEBA2: 0x64D8, - 0xEBA3: 0x8004, - 0xEBA4: 0x6BEA, - 0xEBA5: 0x6BF3, - 0xEBA6: 0x6BFD, - 0xEBA7: 0x6BF5, - 0xEBA8: 0x6BF9, - 0xEBA9: 0x6C05, - 0xEBAA: 0x6C07, - 0xEBAB: 0x6C06, - 0xEBAC: 0x6C0D, - 0xEBAD: 0x6C15, - 0xEBAE: 0x6C18, - 0xEBAF: 0x6C19, - 0xEBB0: 0x6C1A, - 0xEBB1: 0x6C21, - 0xEBB2: 0x6C29, - 0xEBB3: 0x6C24, - 0xEBB4: 0x6C2A, - 0xEBB5: 0x6C32, - 0xEBB6: 0x6535, - 0xEBB7: 0x6555, - 0xEBB8: 0x656B, - 0xEBB9: 0x724D, - 0xEBBA: 0x7252, - 0xEBBB: 0x7256, - 0xEBBC: 0x7230, - 0xEBBD: 0x8662, - 0xEBBE: 0x5216, - 0xEBBF: 0x809F, - 0xEBC0: 0x809C, - 0xEBC1: 0x8093, - 0xEBC2: 0x80BC, - 0xEBC3: 0x670A, - 0xEBC4: 0x80BD, - 0xEBC5: 0x80B1, - 0xEBC6: 0x80AB, - 0xEBC7: 0x80AD, - 0xEBC8: 0x80B4, - 0xEBC9: 0x80B7, - 0xEBCA: 0x80E7, - 0xEBCB: 0x80E8, - 0xEBCC: 0x80E9, - 0xEBCD: 0x80EA, - 0xEBCE: 0x80DB, - 0xEBCF: 0x80C2, - 0xEBD0: 0x80C4, - 0xEBD1: 0x80D9, - 0xEBD2: 0x80CD, - 0xEBD3: 0x80D7, - 0xEBD4: 0x6710, - 0xEBD5: 0x80DD, - 0xEBD6: 0x80EB, - 0xEBD7: 0x80F1, - 0xEBD8: 0x80F4, - 0xEBD9: 0x80ED, - 0xEBDA: 0x810D, - 0xEBDB: 0x810E, - 0xEBDC: 0x80F2, - 0xEBDD: 0x80FC, - 0xEBDE: 0x6715, - 0xEBDF: 0x8112, - 0xEBE0: 0x8C5A, - 0xEBE1: 0x8136, - 0xEBE2: 0x811E, - 0xEBE3: 0x812C, - 0xEBE4: 0x8118, - 0xEBE5: 0x8132, - 0xEBE6: 0x8148, - 0xEBE7: 0x814C, - 0xEBE8: 0x8153, - 0xEBE9: 0x8174, - 0xEBEA: 0x8159, - 0xEBEB: 0x815A, - 0xEBEC: 0x8171, - 0xEBED: 0x8160, - 0xEBEE: 0x8169, - 0xEBEF: 0x817C, - 0xEBF0: 0x817D, - 0xEBF1: 0x816D, - 0xEBF2: 0x8167, - 0xEBF3: 0x584D, - 0xEBF4: 0x5AB5, - 0xEBF5: 0x8188, - 0xEBF6: 0x8182, - 0xEBF7: 0x8191, - 0xEBF8: 0x6ED5, - 0xEBF9: 0x81A3, - 0xEBFA: 0x81AA, - 0xEBFB: 0x81CC, - 0xEBFC: 0x6726, - 0xEBFD: 0x81CA, - 0xEBFE: 0x81BB, - 0xEC40: 0x9721, - 0xEC41: 0x9722, - 0xEC42: 0x9723, - 0xEC43: 0x9724, - 0xEC44: 0x9725, - 0xEC45: 0x9726, - 0xEC46: 0x9727, - 0xEC47: 0x9728, - 0xEC48: 0x9729, - 0xEC49: 0x972B, - 0xEC4A: 0x972C, - 0xEC4B: 0x972E, - 0xEC4C: 0x972F, - 0xEC4D: 0x9731, - 0xEC4E: 0x9733, - 0xEC4F: 0x9734, - 0xEC50: 0x9735, - 0xEC51: 0x9736, - 0xEC52: 0x9737, - 0xEC53: 0x973A, - 0xEC54: 0x973B, - 0xEC55: 0x973C, - 0xEC56: 0x973D, - 0xEC57: 0x973F, - 0xEC58: 0x9740, - 0xEC59: 0x9741, - 0xEC5A: 0x9742, - 0xEC5B: 0x9743, - 0xEC5C: 0x9744, - 0xEC5D: 0x9745, - 0xEC5E: 0x9746, - 0xEC5F: 0x9747, - 0xEC60: 0x9748, - 0xEC61: 0x9749, - 0xEC62: 0x974A, - 0xEC63: 0x974B, - 0xEC64: 0x974C, - 0xEC65: 0x974D, - 0xEC66: 0x974E, - 0xEC67: 0x974F, - 0xEC68: 0x9750, - 0xEC69: 0x9751, - 0xEC6A: 0x9754, - 0xEC6B: 0x9755, - 0xEC6C: 0x9757, - 0xEC6D: 0x9758, - 0xEC6E: 0x975A, - 0xEC6F: 0x975C, - 0xEC70: 0x975D, - 0xEC71: 0x975F, - 0xEC72: 0x9763, - 0xEC73: 0x9764, - 0xEC74: 0x9766, - 0xEC75: 0x9767, - 0xEC76: 0x9768, - 0xEC77: 0x976A, - 0xEC78: 0x976B, - 0xEC79: 0x976C, - 0xEC7A: 0x976D, - 0xEC7B: 0x976E, - 0xEC7C: 0x976F, - 0xEC7D: 0x9770, - 0xEC7E: 0x9771, - 0xEC80: 0x9772, - 0xEC81: 0x9775, - 0xEC82: 0x9777, - 0xEC83: 0x9778, - 0xEC84: 0x9779, - 0xEC85: 0x977A, - 0xEC86: 0x977B, - 0xEC87: 0x977D, - 0xEC88: 0x977E, - 0xEC89: 0x977F, - 0xEC8A: 0x9780, - 0xEC8B: 0x9781, - 0xEC8C: 0x9782, - 0xEC8D: 0x9783, - 0xEC8E: 0x9784, - 0xEC8F: 0x9786, - 0xEC90: 0x9787, - 0xEC91: 0x9788, - 0xEC92: 0x9789, - 0xEC93: 0x978A, - 0xEC94: 0x978C, - 0xEC95: 0x978E, - 0xEC96: 0x978F, - 0xEC97: 0x9790, - 0xEC98: 0x9793, - 0xEC99: 0x9795, - 0xEC9A: 0x9796, - 0xEC9B: 0x9797, - 0xEC9C: 0x9799, - 0xEC9D: 0x979A, - 0xEC9E: 0x979B, - 0xEC9F: 0x979C, - 0xECA0: 0x979D, - 0xECA1: 0x81C1, - 0xECA2: 0x81A6, - 0xECA3: 0x6B24, - 0xECA4: 0x6B37, - 0xECA5: 0x6B39, - 0xECA6: 0x6B43, - 0xECA7: 0x6B46, - 0xECA8: 0x6B59, - 0xECA9: 0x98D1, - 0xECAA: 0x98D2, - 0xECAB: 0x98D3, - 0xECAC: 0x98D5, - 0xECAD: 0x98D9, - 0xECAE: 0x98DA, - 0xECAF: 0x6BB3, - 0xECB0: 0x5F40, - 0xECB1: 0x6BC2, - 0xECB2: 0x89F3, - 0xECB3: 0x6590, - 0xECB4: 0x9F51, - 0xECB5: 0x6593, - 0xECB6: 0x65BC, - 0xECB7: 0x65C6, - 0xECB8: 0x65C4, - 0xECB9: 0x65C3, - 0xECBA: 0x65CC, - 0xECBB: 0x65CE, - 0xECBC: 0x65D2, - 0xECBD: 0x65D6, - 0xECBE: 0x7080, - 0xECBF: 0x709C, - 0xECC0: 0x7096, - 0xECC1: 0x709D, - 0xECC2: 0x70BB, - 0xECC3: 0x70C0, - 0xECC4: 0x70B7, - 0xECC5: 0x70AB, - 0xECC6: 0x70B1, - 0xECC7: 0x70E8, - 0xECC8: 0x70CA, - 0xECC9: 0x7110, - 0xECCA: 0x7113, - 0xECCB: 0x7116, - 0xECCC: 0x712F, - 0xECCD: 0x7131, - 0xECCE: 0x7173, - 0xECCF: 0x715C, - 0xECD0: 0x7168, - 0xECD1: 0x7145, - 0xECD2: 0x7172, - 0xECD3: 0x714A, - 0xECD4: 0x7178, - 0xECD5: 0x717A, - 0xECD6: 0x7198, - 0xECD7: 0x71B3, - 0xECD8: 0x71B5, - 0xECD9: 0x71A8, - 0xECDA: 0x71A0, - 0xECDB: 0x71E0, - 0xECDC: 0x71D4, - 0xECDD: 0x71E7, - 0xECDE: 0x71F9, - 0xECDF: 0x721D, - 0xECE0: 0x7228, - 0xECE1: 0x706C, - 0xECE2: 0x7118, - 0xECE3: 0x7166, - 0xECE4: 0x71B9, - 0xECE5: 0x623E, - 0xECE6: 0x623D, - 0xECE7: 0x6243, - 0xECE8: 0x6248, - 0xECE9: 0x6249, - 0xECEA: 0x793B, - 0xECEB: 0x7940, - 0xECEC: 0x7946, - 0xECED: 0x7949, - 0xECEE: 0x795B, - 0xECEF: 0x795C, - 0xECF0: 0x7953, - 0xECF1: 0x795A, - 0xECF2: 0x7962, - 0xECF3: 0x7957, - 0xECF4: 0x7960, - 0xECF5: 0x796F, - 0xECF6: 0x7967, - 0xECF7: 0x797A, - 0xECF8: 0x7985, - 0xECF9: 0x798A, - 0xECFA: 0x799A, - 0xECFB: 0x79A7, - 0xECFC: 0x79B3, - 0xECFD: 0x5FD1, - 0xECFE: 0x5FD0, - 0xED40: 0x979E, - 0xED41: 0x979F, - 0xED42: 0x97A1, - 0xED43: 0x97A2, - 0xED44: 0x97A4, - 0xED45: 0x97A5, - 0xED46: 0x97A6, - 0xED47: 0x97A7, - 0xED48: 0x97A8, - 0xED49: 0x97A9, - 0xED4A: 0x97AA, - 0xED4B: 0x97AC, - 0xED4C: 0x97AE, - 0xED4D: 0x97B0, - 0xED4E: 0x97B1, - 0xED4F: 0x97B3, - 0xED50: 0x97B5, - 0xED51: 0x97B6, - 0xED52: 0x97B7, - 0xED53: 0x97B8, - 0xED54: 0x97B9, - 0xED55: 0x97BA, - 0xED56: 0x97BB, - 0xED57: 0x97BC, - 0xED58: 0x97BD, - 0xED59: 0x97BE, - 0xED5A: 0x97BF, - 0xED5B: 0x97C0, - 0xED5C: 0x97C1, - 0xED5D: 0x97C2, - 0xED5E: 0x97C3, - 0xED5F: 0x97C4, - 0xED60: 0x97C5, - 0xED61: 0x97C6, - 0xED62: 0x97C7, - 0xED63: 0x97C8, - 0xED64: 0x97C9, - 0xED65: 0x97CA, - 0xED66: 0x97CB, - 0xED67: 0x97CC, - 0xED68: 0x97CD, - 0xED69: 0x97CE, - 0xED6A: 0x97CF, - 0xED6B: 0x97D0, - 0xED6C: 0x97D1, - 0xED6D: 0x97D2, - 0xED6E: 0x97D3, - 0xED6F: 0x97D4, - 0xED70: 0x97D5, - 0xED71: 0x97D6, - 0xED72: 0x97D7, - 0xED73: 0x97D8, - 0xED74: 0x97D9, - 0xED75: 0x97DA, - 0xED76: 0x97DB, - 0xED77: 0x97DC, - 0xED78: 0x97DD, - 0xED79: 0x97DE, - 0xED7A: 0x97DF, - 0xED7B: 0x97E0, - 0xED7C: 0x97E1, - 0xED7D: 0x97E2, - 0xED7E: 0x97E3, - 0xED80: 0x97E4, - 0xED81: 0x97E5, - 0xED82: 0x97E8, - 0xED83: 0x97EE, - 0xED84: 0x97EF, - 0xED85: 0x97F0, - 0xED86: 0x97F1, - 0xED87: 0x97F2, - 0xED88: 0x97F4, - 0xED89: 0x97F7, - 0xED8A: 0x97F8, - 0xED8B: 0x97F9, - 0xED8C: 0x97FA, - 0xED8D: 0x97FB, - 0xED8E: 0x97FC, - 0xED8F: 0x97FD, - 0xED90: 0x97FE, - 0xED91: 0x97FF, - 0xED92: 0x9800, - 0xED93: 0x9801, - 0xED94: 0x9802, - 0xED95: 0x9803, - 0xED96: 0x9804, - 0xED97: 0x9805, - 0xED98: 0x9806, - 0xED99: 0x9807, - 0xED9A: 0x9808, - 0xED9B: 0x9809, - 0xED9C: 0x980A, - 0xED9D: 0x980B, - 0xED9E: 0x980C, - 0xED9F: 0x980D, - 0xEDA0: 0x980E, - 0xEDA1: 0x603C, - 0xEDA2: 0x605D, - 0xEDA3: 0x605A, - 0xEDA4: 0x6067, - 0xEDA5: 0x6041, - 0xEDA6: 0x6059, - 0xEDA7: 0x6063, - 0xEDA8: 0x60AB, - 0xEDA9: 0x6106, - 0xEDAA: 0x610D, - 0xEDAB: 0x615D, - 0xEDAC: 0x61A9, - 0xEDAD: 0x619D, - 0xEDAE: 0x61CB, - 0xEDAF: 0x61D1, - 0xEDB0: 0x6206, - 0xEDB1: 0x8080, - 0xEDB2: 0x807F, - 0xEDB3: 0x6C93, - 0xEDB4: 0x6CF6, - 0xEDB5: 0x6DFC, - 0xEDB6: 0x77F6, - 0xEDB7: 0x77F8, - 0xEDB8: 0x7800, - 0xEDB9: 0x7809, - 0xEDBA: 0x7817, - 0xEDBB: 0x7818, - 0xEDBC: 0x7811, - 0xEDBD: 0x65AB, - 0xEDBE: 0x782D, - 0xEDBF: 0x781C, - 0xEDC0: 0x781D, - 0xEDC1: 0x7839, - 0xEDC2: 0x783A, - 0xEDC3: 0x783B, - 0xEDC4: 0x781F, - 0xEDC5: 0x783C, - 0xEDC6: 0x7825, - 0xEDC7: 0x782C, - 0xEDC8: 0x7823, - 0xEDC9: 0x7829, - 0xEDCA: 0x784E, - 0xEDCB: 0x786D, - 0xEDCC: 0x7856, - 0xEDCD: 0x7857, - 0xEDCE: 0x7826, - 0xEDCF: 0x7850, - 0xEDD0: 0x7847, - 0xEDD1: 0x784C, - 0xEDD2: 0x786A, - 0xEDD3: 0x789B, - 0xEDD4: 0x7893, - 0xEDD5: 0x789A, - 0xEDD6: 0x7887, - 0xEDD7: 0x789C, - 0xEDD8: 0x78A1, - 0xEDD9: 0x78A3, - 0xEDDA: 0x78B2, - 0xEDDB: 0x78B9, - 0xEDDC: 0x78A5, - 0xEDDD: 0x78D4, - 0xEDDE: 0x78D9, - 0xEDDF: 0x78C9, - 0xEDE0: 0x78EC, - 0xEDE1: 0x78F2, - 0xEDE2: 0x7905, - 0xEDE3: 0x78F4, - 0xEDE4: 0x7913, - 0xEDE5: 0x7924, - 0xEDE6: 0x791E, - 0xEDE7: 0x7934, - 0xEDE8: 0x9F9B, - 0xEDE9: 0x9EF9, - 0xEDEA: 0x9EFB, - 0xEDEB: 0x9EFC, - 0xEDEC: 0x76F1, - 0xEDED: 0x7704, - 0xEDEE: 0x770D, - 0xEDEF: 0x76F9, - 0xEDF0: 0x7707, - 0xEDF1: 0x7708, - 0xEDF2: 0x771A, - 0xEDF3: 0x7722, - 0xEDF4: 0x7719, - 0xEDF5: 0x772D, - 0xEDF6: 0x7726, - 0xEDF7: 0x7735, - 0xEDF8: 0x7738, - 0xEDF9: 0x7750, - 0xEDFA: 0x7751, - 0xEDFB: 0x7747, - 0xEDFC: 0x7743, - 0xEDFD: 0x775A, - 0xEDFE: 0x7768, - 0xEE40: 0x980F, - 0xEE41: 0x9810, - 0xEE42: 0x9811, - 0xEE43: 0x9812, - 0xEE44: 0x9813, - 0xEE45: 0x9814, - 0xEE46: 0x9815, - 0xEE47: 0x9816, - 0xEE48: 0x9817, - 0xEE49: 0x9818, - 0xEE4A: 0x9819, - 0xEE4B: 0x981A, - 0xEE4C: 0x981B, - 0xEE4D: 0x981C, - 0xEE4E: 0x981D, - 0xEE4F: 0x981E, - 0xEE50: 0x981F, - 0xEE51: 0x9820, - 0xEE52: 0x9821, - 0xEE53: 0x9822, - 0xEE54: 0x9823, - 0xEE55: 0x9824, - 0xEE56: 0x9825, - 0xEE57: 0x9826, - 0xEE58: 0x9827, - 0xEE59: 0x9828, - 0xEE5A: 0x9829, - 0xEE5B: 0x982A, - 0xEE5C: 0x982B, - 0xEE5D: 0x982C, - 0xEE5E: 0x982D, - 0xEE5F: 0x982E, - 0xEE60: 0x982F, - 0xEE61: 0x9830, - 0xEE62: 0x9831, - 0xEE63: 0x9832, - 0xEE64: 0x9833, - 0xEE65: 0x9834, - 0xEE66: 0x9835, - 0xEE67: 0x9836, - 0xEE68: 0x9837, - 0xEE69: 0x9838, - 0xEE6A: 0x9839, - 0xEE6B: 0x983A, - 0xEE6C: 0x983B, - 0xEE6D: 0x983C, - 0xEE6E: 0x983D, - 0xEE6F: 0x983E, - 0xEE70: 0x983F, - 0xEE71: 0x9840, - 0xEE72: 0x9841, - 0xEE73: 0x9842, - 0xEE74: 0x9843, - 0xEE75: 0x9844, - 0xEE76: 0x9845, - 0xEE77: 0x9846, - 0xEE78: 0x9847, - 0xEE79: 0x9848, - 0xEE7A: 0x9849, - 0xEE7B: 0x984A, - 0xEE7C: 0x984B, - 0xEE7D: 0x984C, - 0xEE7E: 0x984D, - 0xEE80: 0x984E, - 0xEE81: 0x984F, - 0xEE82: 0x9850, - 0xEE83: 0x9851, - 0xEE84: 0x9852, - 0xEE85: 0x9853, - 0xEE86: 0x9854, - 0xEE87: 0x9855, - 0xEE88: 0x9856, - 0xEE89: 0x9857, - 0xEE8A: 0x9858, - 0xEE8B: 0x9859, - 0xEE8C: 0x985A, - 0xEE8D: 0x985B, - 0xEE8E: 0x985C, - 0xEE8F: 0x985D, - 0xEE90: 0x985E, - 0xEE91: 0x985F, - 0xEE92: 0x9860, - 0xEE93: 0x9861, - 0xEE94: 0x9862, - 0xEE95: 0x9863, - 0xEE96: 0x9864, - 0xEE97: 0x9865, - 0xEE98: 0x9866, - 0xEE99: 0x9867, - 0xEE9A: 0x9868, - 0xEE9B: 0x9869, - 0xEE9C: 0x986A, - 0xEE9D: 0x986B, - 0xEE9E: 0x986C, - 0xEE9F: 0x986D, - 0xEEA0: 0x986E, - 0xEEA1: 0x7762, - 0xEEA2: 0x7765, - 0xEEA3: 0x777F, - 0xEEA4: 0x778D, - 0xEEA5: 0x777D, - 0xEEA6: 0x7780, - 0xEEA7: 0x778C, - 0xEEA8: 0x7791, - 0xEEA9: 0x779F, - 0xEEAA: 0x77A0, - 0xEEAB: 0x77B0, - 0xEEAC: 0x77B5, - 0xEEAD: 0x77BD, - 0xEEAE: 0x753A, - 0xEEAF: 0x7540, - 0xEEB0: 0x754E, - 0xEEB1: 0x754B, - 0xEEB2: 0x7548, - 0xEEB3: 0x755B, - 0xEEB4: 0x7572, - 0xEEB5: 0x7579, - 0xEEB6: 0x7583, - 0xEEB7: 0x7F58, - 0xEEB8: 0x7F61, - 0xEEB9: 0x7F5F, - 0xEEBA: 0x8A48, - 0xEEBB: 0x7F68, - 0xEEBC: 0x7F74, - 0xEEBD: 0x7F71, - 0xEEBE: 0x7F79, - 0xEEBF: 0x7F81, - 0xEEC0: 0x7F7E, - 0xEEC1: 0x76CD, - 0xEEC2: 0x76E5, - 0xEEC3: 0x8832, - 0xEEC4: 0x9485, - 0xEEC5: 0x9486, - 0xEEC6: 0x9487, - 0xEEC7: 0x948B, - 0xEEC8: 0x948A, - 0xEEC9: 0x948C, - 0xEECA: 0x948D, - 0xEECB: 0x948F, - 0xEECC: 0x9490, - 0xEECD: 0x9494, - 0xEECE: 0x9497, - 0xEECF: 0x9495, - 0xEED0: 0x949A, - 0xEED1: 0x949B, - 0xEED2: 0x949C, - 0xEED3: 0x94A3, - 0xEED4: 0x94A4, - 0xEED5: 0x94AB, - 0xEED6: 0x94AA, - 0xEED7: 0x94AD, - 0xEED8: 0x94AC, - 0xEED9: 0x94AF, - 0xEEDA: 0x94B0, - 0xEEDB: 0x94B2, - 0xEEDC: 0x94B4, - 0xEEDD: 0x94B6, - 0xEEDE: 0x94B7, - 0xEEDF: 0x94B8, - 0xEEE0: 0x94B9, - 0xEEE1: 0x94BA, - 0xEEE2: 0x94BC, - 0xEEE3: 0x94BD, - 0xEEE4: 0x94BF, - 0xEEE5: 0x94C4, - 0xEEE6: 0x94C8, - 0xEEE7: 0x94C9, - 0xEEE8: 0x94CA, - 0xEEE9: 0x94CB, - 0xEEEA: 0x94CC, - 0xEEEB: 0x94CD, - 0xEEEC: 0x94CE, - 0xEEED: 0x94D0, - 0xEEEE: 0x94D1, - 0xEEEF: 0x94D2, - 0xEEF0: 0x94D5, - 0xEEF1: 0x94D6, - 0xEEF2: 0x94D7, - 0xEEF3: 0x94D9, - 0xEEF4: 0x94D8, - 0xEEF5: 0x94DB, - 0xEEF6: 0x94DE, - 0xEEF7: 0x94DF, - 0xEEF8: 0x94E0, - 0xEEF9: 0x94E2, - 0xEEFA: 0x94E4, - 0xEEFB: 0x94E5, - 0xEEFC: 0x94E7, - 0xEEFD: 0x94E8, - 0xEEFE: 0x94EA, - 0xEF40: 0x986F, - 0xEF41: 0x9870, - 0xEF42: 0x9871, - 0xEF43: 0x9872, - 0xEF44: 0x9873, - 0xEF45: 0x9874, - 0xEF46: 0x988B, - 0xEF47: 0x988E, - 0xEF48: 0x9892, - 0xEF49: 0x9895, - 0xEF4A: 0x9899, - 0xEF4B: 0x98A3, - 0xEF4C: 0x98A8, - 0xEF4D: 0x98A9, - 0xEF4E: 0x98AA, - 0xEF4F: 0x98AB, - 0xEF50: 0x98AC, - 0xEF51: 0x98AD, - 0xEF52: 0x98AE, - 0xEF53: 0x98AF, - 0xEF54: 0x98B0, - 0xEF55: 0x98B1, - 0xEF56: 0x98B2, - 0xEF57: 0x98B3, - 0xEF58: 0x98B4, - 0xEF59: 0x98B5, - 0xEF5A: 0x98B6, - 0xEF5B: 0x98B7, - 0xEF5C: 0x98B8, - 0xEF5D: 0x98B9, - 0xEF5E: 0x98BA, - 0xEF5F: 0x98BB, - 0xEF60: 0x98BC, - 0xEF61: 0x98BD, - 0xEF62: 0x98BE, - 0xEF63: 0x98BF, - 0xEF64: 0x98C0, - 0xEF65: 0x98C1, - 0xEF66: 0x98C2, - 0xEF67: 0x98C3, - 0xEF68: 0x98C4, - 0xEF69: 0x98C5, - 0xEF6A: 0x98C6, - 0xEF6B: 0x98C7, - 0xEF6C: 0x98C8, - 0xEF6D: 0x98C9, - 0xEF6E: 0x98CA, - 0xEF6F: 0x98CB, - 0xEF70: 0x98CC, - 0xEF71: 0x98CD, - 0xEF72: 0x98CF, - 0xEF73: 0x98D0, - 0xEF74: 0x98D4, - 0xEF75: 0x98D6, - 0xEF76: 0x98D7, - 0xEF77: 0x98DB, - 0xEF78: 0x98DC, - 0xEF79: 0x98DD, - 0xEF7A: 0x98E0, - 0xEF7B: 0x98E1, - 0xEF7C: 0x98E2, - 0xEF7D: 0x98E3, - 0xEF7E: 0x98E4, - 0xEF80: 0x98E5, - 0xEF81: 0x98E6, - 0xEF82: 0x98E9, - 0xEF83: 0x98EA, - 0xEF84: 0x98EB, - 0xEF85: 0x98EC, - 0xEF86: 0x98ED, - 0xEF87: 0x98EE, - 0xEF88: 0x98EF, - 0xEF89: 0x98F0, - 0xEF8A: 0x98F1, - 0xEF8B: 0x98F2, - 0xEF8C: 0x98F3, - 0xEF8D: 0x98F4, - 0xEF8E: 0x98F5, - 0xEF8F: 0x98F6, - 0xEF90: 0x98F7, - 0xEF91: 0x98F8, - 0xEF92: 0x98F9, - 0xEF93: 0x98FA, - 0xEF94: 0x98FB, - 0xEF95: 0x98FC, - 0xEF96: 0x98FD, - 0xEF97: 0x98FE, - 0xEF98: 0x98FF, - 0xEF99: 0x9900, - 0xEF9A: 0x9901, - 0xEF9B: 0x9902, - 0xEF9C: 0x9903, - 0xEF9D: 0x9904, - 0xEF9E: 0x9905, - 0xEF9F: 0x9906, - 0xEFA0: 0x9907, - 0xEFA1: 0x94E9, - 0xEFA2: 0x94EB, - 0xEFA3: 0x94EE, - 0xEFA4: 0x94EF, - 0xEFA5: 0x94F3, - 0xEFA6: 0x94F4, - 0xEFA7: 0x94F5, - 0xEFA8: 0x94F7, - 0xEFA9: 0x94F9, - 0xEFAA: 0x94FC, - 0xEFAB: 0x94FD, - 0xEFAC: 0x94FF, - 0xEFAD: 0x9503, - 0xEFAE: 0x9502, - 0xEFAF: 0x9506, - 0xEFB0: 0x9507, - 0xEFB1: 0x9509, - 0xEFB2: 0x950A, - 0xEFB3: 0x950D, - 0xEFB4: 0x950E, - 0xEFB5: 0x950F, - 0xEFB6: 0x9512, - 0xEFB7: 0x9513, - 0xEFB8: 0x9514, - 0xEFB9: 0x9515, - 0xEFBA: 0x9516, - 0xEFBB: 0x9518, - 0xEFBC: 0x951B, - 0xEFBD: 0x951D, - 0xEFBE: 0x951E, - 0xEFBF: 0x951F, - 0xEFC0: 0x9522, - 0xEFC1: 0x952A, - 0xEFC2: 0x952B, - 0xEFC3: 0x9529, - 0xEFC4: 0x952C, - 0xEFC5: 0x9531, - 0xEFC6: 0x9532, - 0xEFC7: 0x9534, - 0xEFC8: 0x9536, - 0xEFC9: 0x9537, - 0xEFCA: 0x9538, - 0xEFCB: 0x953C, - 0xEFCC: 0x953E, - 0xEFCD: 0x953F, - 0xEFCE: 0x9542, - 0xEFCF: 0x9535, - 0xEFD0: 0x9544, - 0xEFD1: 0x9545, - 0xEFD2: 0x9546, - 0xEFD3: 0x9549, - 0xEFD4: 0x954C, - 0xEFD5: 0x954E, - 0xEFD6: 0x954F, - 0xEFD7: 0x9552, - 0xEFD8: 0x9553, - 0xEFD9: 0x9554, - 0xEFDA: 0x9556, - 0xEFDB: 0x9557, - 0xEFDC: 0x9558, - 0xEFDD: 0x9559, - 0xEFDE: 0x955B, - 0xEFDF: 0x955E, - 0xEFE0: 0x955F, - 0xEFE1: 0x955D, - 0xEFE2: 0x9561, - 0xEFE3: 0x9562, - 0xEFE4: 0x9564, - 0xEFE5: 0x9565, - 0xEFE6: 0x9566, - 0xEFE7: 0x9567, - 0xEFE8: 0x9568, - 0xEFE9: 0x9569, - 0xEFEA: 0x956A, - 0xEFEB: 0x956B, - 0xEFEC: 0x956C, - 0xEFED: 0x956F, - 0xEFEE: 0x9571, - 0xEFEF: 0x9572, - 0xEFF0: 0x9573, - 0xEFF1: 0x953A, - 0xEFF2: 0x77E7, - 0xEFF3: 0x77EC, - 0xEFF4: 0x96C9, - 0xEFF5: 0x79D5, - 0xEFF6: 0x79ED, - 0xEFF7: 0x79E3, - 0xEFF8: 0x79EB, - 0xEFF9: 0x7A06, - 0xEFFA: 0x5D47, - 0xEFFB: 0x7A03, - 0xEFFC: 0x7A02, - 0xEFFD: 0x7A1E, - 0xEFFE: 0x7A14, - 0xF040: 0x9908, - 0xF041: 0x9909, - 0xF042: 0x990A, - 0xF043: 0x990B, - 0xF044: 0x990C, - 0xF045: 0x990E, - 0xF046: 0x990F, - 0xF047: 0x9911, - 0xF048: 0x9912, - 0xF049: 0x9913, - 0xF04A: 0x9914, - 0xF04B: 0x9915, - 0xF04C: 0x9916, - 0xF04D: 0x9917, - 0xF04E: 0x9918, - 0xF04F: 0x9919, - 0xF050: 0x991A, - 0xF051: 0x991B, - 0xF052: 0x991C, - 0xF053: 0x991D, - 0xF054: 0x991E, - 0xF055: 0x991F, - 0xF056: 0x9920, - 0xF057: 0x9921, - 0xF058: 0x9922, - 0xF059: 0x9923, - 0xF05A: 0x9924, - 0xF05B: 0x9925, - 0xF05C: 0x9926, - 0xF05D: 0x9927, - 0xF05E: 0x9928, - 0xF05F: 0x9929, - 0xF060: 0x992A, - 0xF061: 0x992B, - 0xF062: 0x992C, - 0xF063: 0x992D, - 0xF064: 0x992F, - 0xF065: 0x9930, - 0xF066: 0x9931, - 0xF067: 0x9932, - 0xF068: 0x9933, - 0xF069: 0x9934, - 0xF06A: 0x9935, - 0xF06B: 0x9936, - 0xF06C: 0x9937, - 0xF06D: 0x9938, - 0xF06E: 0x9939, - 0xF06F: 0x993A, - 0xF070: 0x993B, - 0xF071: 0x993C, - 0xF072: 0x993D, - 0xF073: 0x993E, - 0xF074: 0x993F, - 0xF075: 0x9940, - 0xF076: 0x9941, - 0xF077: 0x9942, - 0xF078: 0x9943, - 0xF079: 0x9944, - 0xF07A: 0x9945, - 0xF07B: 0x9946, - 0xF07C: 0x9947, - 0xF07D: 0x9948, - 0xF07E: 0x9949, - 0xF080: 0x994A, - 0xF081: 0x994B, - 0xF082: 0x994C, - 0xF083: 0x994D, - 0xF084: 0x994E, - 0xF085: 0x994F, - 0xF086: 0x9950, - 0xF087: 0x9951, - 0xF088: 0x9952, - 0xF089: 0x9953, - 0xF08A: 0x9956, - 0xF08B: 0x9957, - 0xF08C: 0x9958, - 0xF08D: 0x9959, - 0xF08E: 0x995A, - 0xF08F: 0x995B, - 0xF090: 0x995C, - 0xF091: 0x995D, - 0xF092: 0x995E, - 0xF093: 0x995F, - 0xF094: 0x9960, - 0xF095: 0x9961, - 0xF096: 0x9962, - 0xF097: 0x9964, - 0xF098: 0x9966, - 0xF099: 0x9973, - 0xF09A: 0x9978, - 0xF09B: 0x9979, - 0xF09C: 0x997B, - 0xF09D: 0x997E, - 0xF09E: 0x9982, - 0xF09F: 0x9983, - 0xF0A0: 0x9989, - 0xF0A1: 0x7A39, - 0xF0A2: 0x7A37, - 0xF0A3: 0x7A51, - 0xF0A4: 0x9ECF, - 0xF0A5: 0x99A5, - 0xF0A6: 0x7A70, - 0xF0A7: 0x7688, - 0xF0A8: 0x768E, - 0xF0A9: 0x7693, - 0xF0AA: 0x7699, - 0xF0AB: 0x76A4, - 0xF0AC: 0x74DE, - 0xF0AD: 0x74E0, - 0xF0AE: 0x752C, - 0xF0AF: 0x9E20, - 0xF0B0: 0x9E22, - 0xF0B1: 0x9E28, - 0xF0B2: 0x9E29, - 0xF0B3: 0x9E2A, - 0xF0B4: 0x9E2B, - 0xF0B5: 0x9E2C, - 0xF0B6: 0x9E32, - 0xF0B7: 0x9E31, - 0xF0B8: 0x9E36, - 0xF0B9: 0x9E38, - 0xF0BA: 0x9E37, - 0xF0BB: 0x9E39, - 0xF0BC: 0x9E3A, - 0xF0BD: 0x9E3E, - 0xF0BE: 0x9E41, - 0xF0BF: 0x9E42, - 0xF0C0: 0x9E44, - 0xF0C1: 0x9E46, - 0xF0C2: 0x9E47, - 0xF0C3: 0x9E48, - 0xF0C4: 0x9E49, - 0xF0C5: 0x9E4B, - 0xF0C6: 0x9E4C, - 0xF0C7: 0x9E4E, - 0xF0C8: 0x9E51, - 0xF0C9: 0x9E55, - 0xF0CA: 0x9E57, - 0xF0CB: 0x9E5A, - 0xF0CC: 0x9E5B, - 0xF0CD: 0x9E5C, - 0xF0CE: 0x9E5E, - 0xF0CF: 0x9E63, - 0xF0D0: 0x9E66, - 0xF0D1: 0x9E67, - 0xF0D2: 0x9E68, - 0xF0D3: 0x9E69, - 0xF0D4: 0x9E6A, - 0xF0D5: 0x9E6B, - 0xF0D6: 0x9E6C, - 0xF0D7: 0x9E71, - 0xF0D8: 0x9E6D, - 0xF0D9: 0x9E73, - 0xF0DA: 0x7592, - 0xF0DB: 0x7594, - 0xF0DC: 0x7596, - 0xF0DD: 0x75A0, - 0xF0DE: 0x759D, - 0xF0DF: 0x75AC, - 0xF0E0: 0x75A3, - 0xF0E1: 0x75B3, - 0xF0E2: 0x75B4, - 0xF0E3: 0x75B8, - 0xF0E4: 0x75C4, - 0xF0E5: 0x75B1, - 0xF0E6: 0x75B0, - 0xF0E7: 0x75C3, - 0xF0E8: 0x75C2, - 0xF0E9: 0x75D6, - 0xF0EA: 0x75CD, - 0xF0EB: 0x75E3, - 0xF0EC: 0x75E8, - 0xF0ED: 0x75E6, - 0xF0EE: 0x75E4, - 0xF0EF: 0x75EB, - 0xF0F0: 0x75E7, - 0xF0F1: 0x7603, - 0xF0F2: 0x75F1, - 0xF0F3: 0x75FC, - 0xF0F4: 0x75FF, - 0xF0F5: 0x7610, - 0xF0F6: 0x7600, - 0xF0F7: 0x7605, - 0xF0F8: 0x760C, - 0xF0F9: 0x7617, - 0xF0FA: 0x760A, - 0xF0FB: 0x7625, - 0xF0FC: 0x7618, - 0xF0FD: 0x7615, - 0xF0FE: 0x7619, - 0xF140: 0x998C, - 0xF141: 0x998E, - 0xF142: 0x999A, - 0xF143: 0x999B, - 0xF144: 0x999C, - 0xF145: 0x999D, - 0xF146: 0x999E, - 0xF147: 0x999F, - 0xF148: 0x99A0, - 0xF149: 0x99A1, - 0xF14A: 0x99A2, - 0xF14B: 0x99A3, - 0xF14C: 0x99A4, - 0xF14D: 0x99A6, - 0xF14E: 0x99A7, - 0xF14F: 0x99A9, - 0xF150: 0x99AA, - 0xF151: 0x99AB, - 0xF152: 0x99AC, - 0xF153: 0x99AD, - 0xF154: 0x99AE, - 0xF155: 0x99AF, - 0xF156: 0x99B0, - 0xF157: 0x99B1, - 0xF158: 0x99B2, - 0xF159: 0x99B3, - 0xF15A: 0x99B4, - 0xF15B: 0x99B5, - 0xF15C: 0x99B6, - 0xF15D: 0x99B7, - 0xF15E: 0x99B8, - 0xF15F: 0x99B9, - 0xF160: 0x99BA, - 0xF161: 0x99BB, - 0xF162: 0x99BC, - 0xF163: 0x99BD, - 0xF164: 0x99BE, - 0xF165: 0x99BF, - 0xF166: 0x99C0, - 0xF167: 0x99C1, - 0xF168: 0x99C2, - 0xF169: 0x99C3, - 0xF16A: 0x99C4, - 0xF16B: 0x99C5, - 0xF16C: 0x99C6, - 0xF16D: 0x99C7, - 0xF16E: 0x99C8, - 0xF16F: 0x99C9, - 0xF170: 0x99CA, - 0xF171: 0x99CB, - 0xF172: 0x99CC, - 0xF173: 0x99CD, - 0xF174: 0x99CE, - 0xF175: 0x99CF, - 0xF176: 0x99D0, - 0xF177: 0x99D1, - 0xF178: 0x99D2, - 0xF179: 0x99D3, - 0xF17A: 0x99D4, - 0xF17B: 0x99D5, - 0xF17C: 0x99D6, - 0xF17D: 0x99D7, - 0xF17E: 0x99D8, - 0xF180: 0x99D9, - 0xF181: 0x99DA, - 0xF182: 0x99DB, - 0xF183: 0x99DC, - 0xF184: 0x99DD, - 0xF185: 0x99DE, - 0xF186: 0x99DF, - 0xF187: 0x99E0, - 0xF188: 0x99E1, - 0xF189: 0x99E2, - 0xF18A: 0x99E3, - 0xF18B: 0x99E4, - 0xF18C: 0x99E5, - 0xF18D: 0x99E6, - 0xF18E: 0x99E7, - 0xF18F: 0x99E8, - 0xF190: 0x99E9, - 0xF191: 0x99EA, - 0xF192: 0x99EB, - 0xF193: 0x99EC, - 0xF194: 0x99ED, - 0xF195: 0x99EE, - 0xF196: 0x99EF, - 0xF197: 0x99F0, - 0xF198: 0x99F1, - 0xF199: 0x99F2, - 0xF19A: 0x99F3, - 0xF19B: 0x99F4, - 0xF19C: 0x99F5, - 0xF19D: 0x99F6, - 0xF19E: 0x99F7, - 0xF19F: 0x99F8, - 0xF1A0: 0x99F9, - 0xF1A1: 0x761B, - 0xF1A2: 0x763C, - 0xF1A3: 0x7622, - 0xF1A4: 0x7620, - 0xF1A5: 0x7640, - 0xF1A6: 0x762D, - 0xF1A7: 0x7630, - 0xF1A8: 0x763F, - 0xF1A9: 0x7635, - 0xF1AA: 0x7643, - 0xF1AB: 0x763E, - 0xF1AC: 0x7633, - 0xF1AD: 0x764D, - 0xF1AE: 0x765E, - 0xF1AF: 0x7654, - 0xF1B0: 0x765C, - 0xF1B1: 0x7656, - 0xF1B2: 0x766B, - 0xF1B3: 0x766F, - 0xF1B4: 0x7FCA, - 0xF1B5: 0x7AE6, - 0xF1B6: 0x7A78, - 0xF1B7: 0x7A79, - 0xF1B8: 0x7A80, - 0xF1B9: 0x7A86, - 0xF1BA: 0x7A88, - 0xF1BB: 0x7A95, - 0xF1BC: 0x7AA6, - 0xF1BD: 0x7AA0, - 0xF1BE: 0x7AAC, - 0xF1BF: 0x7AA8, - 0xF1C0: 0x7AAD, - 0xF1C1: 0x7AB3, - 0xF1C2: 0x8864, - 0xF1C3: 0x8869, - 0xF1C4: 0x8872, - 0xF1C5: 0x887D, - 0xF1C6: 0x887F, - 0xF1C7: 0x8882, - 0xF1C8: 0x88A2, - 0xF1C9: 0x88C6, - 0xF1CA: 0x88B7, - 0xF1CB: 0x88BC, - 0xF1CC: 0x88C9, - 0xF1CD: 0x88E2, - 0xF1CE: 0x88CE, - 0xF1CF: 0x88E3, - 0xF1D0: 0x88E5, - 0xF1D1: 0x88F1, - 0xF1D2: 0x891A, - 0xF1D3: 0x88FC, - 0xF1D4: 0x88E8, - 0xF1D5: 0x88FE, - 0xF1D6: 0x88F0, - 0xF1D7: 0x8921, - 0xF1D8: 0x8919, - 0xF1D9: 0x8913, - 0xF1DA: 0x891B, - 0xF1DB: 0x890A, - 0xF1DC: 0x8934, - 0xF1DD: 0x892B, - 0xF1DE: 0x8936, - 0xF1DF: 0x8941, - 0xF1E0: 0x8966, - 0xF1E1: 0x897B, - 0xF1E2: 0x758B, - 0xF1E3: 0x80E5, - 0xF1E4: 0x76B2, - 0xF1E5: 0x76B4, - 0xF1E6: 0x77DC, - 0xF1E7: 0x8012, - 0xF1E8: 0x8014, - 0xF1E9: 0x8016, - 0xF1EA: 0x801C, - 0xF1EB: 0x8020, - 0xF1EC: 0x8022, - 0xF1ED: 0x8025, - 0xF1EE: 0x8026, - 0xF1EF: 0x8027, - 0xF1F0: 0x8029, - 0xF1F1: 0x8028, - 0xF1F2: 0x8031, - 0xF1F3: 0x800B, - 0xF1F4: 0x8035, - 0xF1F5: 0x8043, - 0xF1F6: 0x8046, - 0xF1F7: 0x804D, - 0xF1F8: 0x8052, - 0xF1F9: 0x8069, - 0xF1FA: 0x8071, - 0xF1FB: 0x8983, - 0xF1FC: 0x9878, - 0xF1FD: 0x9880, - 0xF1FE: 0x9883, - 0xF240: 0x99FA, - 0xF241: 0x99FB, - 0xF242: 0x99FC, - 0xF243: 0x99FD, - 0xF244: 0x99FE, - 0xF245: 0x99FF, - 0xF246: 0x9A00, - 0xF247: 0x9A01, - 0xF248: 0x9A02, - 0xF249: 0x9A03, - 0xF24A: 0x9A04, - 0xF24B: 0x9A05, - 0xF24C: 0x9A06, - 0xF24D: 0x9A07, - 0xF24E: 0x9A08, - 0xF24F: 0x9A09, - 0xF250: 0x9A0A, - 0xF251: 0x9A0B, - 0xF252: 0x9A0C, - 0xF253: 0x9A0D, - 0xF254: 0x9A0E, - 0xF255: 0x9A0F, - 0xF256: 0x9A10, - 0xF257: 0x9A11, - 0xF258: 0x9A12, - 0xF259: 0x9A13, - 0xF25A: 0x9A14, - 0xF25B: 0x9A15, - 0xF25C: 0x9A16, - 0xF25D: 0x9A17, - 0xF25E: 0x9A18, - 0xF25F: 0x9A19, - 0xF260: 0x9A1A, - 0xF261: 0x9A1B, - 0xF262: 0x9A1C, - 0xF263: 0x9A1D, - 0xF264: 0x9A1E, - 0xF265: 0x9A1F, - 0xF266: 0x9A20, - 0xF267: 0x9A21, - 0xF268: 0x9A22, - 0xF269: 0x9A23, - 0xF26A: 0x9A24, - 0xF26B: 0x9A25, - 0xF26C: 0x9A26, - 0xF26D: 0x9A27, - 0xF26E: 0x9A28, - 0xF26F: 0x9A29, - 0xF270: 0x9A2A, - 0xF271: 0x9A2B, - 0xF272: 0x9A2C, - 0xF273: 0x9A2D, - 0xF274: 0x9A2E, - 0xF275: 0x9A2F, - 0xF276: 0x9A30, - 0xF277: 0x9A31, - 0xF278: 0x9A32, - 0xF279: 0x9A33, - 0xF27A: 0x9A34, - 0xF27B: 0x9A35, - 0xF27C: 0x9A36, - 0xF27D: 0x9A37, - 0xF27E: 0x9A38, - 0xF280: 0x9A39, - 0xF281: 0x9A3A, - 0xF282: 0x9A3B, - 0xF283: 0x9A3C, - 0xF284: 0x9A3D, - 0xF285: 0x9A3E, - 0xF286: 0x9A3F, - 0xF287: 0x9A40, - 0xF288: 0x9A41, - 0xF289: 0x9A42, - 0xF28A: 0x9A43, - 0xF28B: 0x9A44, - 0xF28C: 0x9A45, - 0xF28D: 0x9A46, - 0xF28E: 0x9A47, - 0xF28F: 0x9A48, - 0xF290: 0x9A49, - 0xF291: 0x9A4A, - 0xF292: 0x9A4B, - 0xF293: 0x9A4C, - 0xF294: 0x9A4D, - 0xF295: 0x9A4E, - 0xF296: 0x9A4F, - 0xF297: 0x9A50, - 0xF298: 0x9A51, - 0xF299: 0x9A52, - 0xF29A: 0x9A53, - 0xF29B: 0x9A54, - 0xF29C: 0x9A55, - 0xF29D: 0x9A56, - 0xF29E: 0x9A57, - 0xF29F: 0x9A58, - 0xF2A0: 0x9A59, - 0xF2A1: 0x9889, - 0xF2A2: 0x988C, - 0xF2A3: 0x988D, - 0xF2A4: 0x988F, - 0xF2A5: 0x9894, - 0xF2A6: 0x989A, - 0xF2A7: 0x989B, - 0xF2A8: 0x989E, - 0xF2A9: 0x989F, - 0xF2AA: 0x98A1, - 0xF2AB: 0x98A2, - 0xF2AC: 0x98A5, - 0xF2AD: 0x98A6, - 0xF2AE: 0x864D, - 0xF2AF: 0x8654, - 0xF2B0: 0x866C, - 0xF2B1: 0x866E, - 0xF2B2: 0x867F, - 0xF2B3: 0x867A, - 0xF2B4: 0x867C, - 0xF2B5: 0x867B, - 0xF2B6: 0x86A8, - 0xF2B7: 0x868D, - 0xF2B8: 0x868B, - 0xF2B9: 0x86AC, - 0xF2BA: 0x869D, - 0xF2BB: 0x86A7, - 0xF2BC: 0x86A3, - 0xF2BD: 0x86AA, - 0xF2BE: 0x8693, - 0xF2BF: 0x86A9, - 0xF2C0: 0x86B6, - 0xF2C1: 0x86C4, - 0xF2C2: 0x86B5, - 0xF2C3: 0x86CE, - 0xF2C4: 0x86B0, - 0xF2C5: 0x86BA, - 0xF2C6: 0x86B1, - 0xF2C7: 0x86AF, - 0xF2C8: 0x86C9, - 0xF2C9: 0x86CF, - 0xF2CA: 0x86B4, - 0xF2CB: 0x86E9, - 0xF2CC: 0x86F1, - 0xF2CD: 0x86F2, - 0xF2CE: 0x86ED, - 0xF2CF: 0x86F3, - 0xF2D0: 0x86D0, - 0xF2D1: 0x8713, - 0xF2D2: 0x86DE, - 0xF2D3: 0x86F4, - 0xF2D4: 0x86DF, - 0xF2D5: 0x86D8, - 0xF2D6: 0x86D1, - 0xF2D7: 0x8703, - 0xF2D8: 0x8707, - 0xF2D9: 0x86F8, - 0xF2DA: 0x8708, - 0xF2DB: 0x870A, - 0xF2DC: 0x870D, - 0xF2DD: 0x8709, - 0xF2DE: 0x8723, - 0xF2DF: 0x873B, - 0xF2E0: 0x871E, - 0xF2E1: 0x8725, - 0xF2E2: 0x872E, - 0xF2E3: 0x871A, - 0xF2E4: 0x873E, - 0xF2E5: 0x8748, - 0xF2E6: 0x8734, - 0xF2E7: 0x8731, - 0xF2E8: 0x8729, - 0xF2E9: 0x8737, - 0xF2EA: 0x873F, - 0xF2EB: 0x8782, - 0xF2EC: 0x8722, - 0xF2ED: 0x877D, - 0xF2EE: 0x877E, - 0xF2EF: 0x877B, - 0xF2F0: 0x8760, - 0xF2F1: 0x8770, - 0xF2F2: 0x874C, - 0xF2F3: 0x876E, - 0xF2F4: 0x878B, - 0xF2F5: 0x8753, - 0xF2F6: 0x8763, - 0xF2F7: 0x877C, - 0xF2F8: 0x8764, - 0xF2F9: 0x8759, - 0xF2FA: 0x8765, - 0xF2FB: 0x8793, - 0xF2FC: 0x87AF, - 0xF2FD: 0x87A8, - 0xF2FE: 0x87D2, - 0xF340: 0x9A5A, - 0xF341: 0x9A5B, - 0xF342: 0x9A5C, - 0xF343: 0x9A5D, - 0xF344: 0x9A5E, - 0xF345: 0x9A5F, - 0xF346: 0x9A60, - 0xF347: 0x9A61, - 0xF348: 0x9A62, - 0xF349: 0x9A63, - 0xF34A: 0x9A64, - 0xF34B: 0x9A65, - 0xF34C: 0x9A66, - 0xF34D: 0x9A67, - 0xF34E: 0x9A68, - 0xF34F: 0x9A69, - 0xF350: 0x9A6A, - 0xF351: 0x9A6B, - 0xF352: 0x9A72, - 0xF353: 0x9A83, - 0xF354: 0x9A89, - 0xF355: 0x9A8D, - 0xF356: 0x9A8E, - 0xF357: 0x9A94, - 0xF358: 0x9A95, - 0xF359: 0x9A99, - 0xF35A: 0x9AA6, - 0xF35B: 0x9AA9, - 0xF35C: 0x9AAA, - 0xF35D: 0x9AAB, - 0xF35E: 0x9AAC, - 0xF35F: 0x9AAD, - 0xF360: 0x9AAE, - 0xF361: 0x9AAF, - 0xF362: 0x9AB2, - 0xF363: 0x9AB3, - 0xF364: 0x9AB4, - 0xF365: 0x9AB5, - 0xF366: 0x9AB9, - 0xF367: 0x9ABB, - 0xF368: 0x9ABD, - 0xF369: 0x9ABE, - 0xF36A: 0x9ABF, - 0xF36B: 0x9AC3, - 0xF36C: 0x9AC4, - 0xF36D: 0x9AC6, - 0xF36E: 0x9AC7, - 0xF36F: 0x9AC8, - 0xF370: 0x9AC9, - 0xF371: 0x9ACA, - 0xF372: 0x9ACD, - 0xF373: 0x9ACE, - 0xF374: 0x9ACF, - 0xF375: 0x9AD0, - 0xF376: 0x9AD2, - 0xF377: 0x9AD4, - 0xF378: 0x9AD5, - 0xF379: 0x9AD6, - 0xF37A: 0x9AD7, - 0xF37B: 0x9AD9, - 0xF37C: 0x9ADA, - 0xF37D: 0x9ADB, - 0xF37E: 0x9ADC, - 0xF380: 0x9ADD, - 0xF381: 0x9ADE, - 0xF382: 0x9AE0, - 0xF383: 0x9AE2, - 0xF384: 0x9AE3, - 0xF385: 0x9AE4, - 0xF386: 0x9AE5, - 0xF387: 0x9AE7, - 0xF388: 0x9AE8, - 0xF389: 0x9AE9, - 0xF38A: 0x9AEA, - 0xF38B: 0x9AEC, - 0xF38C: 0x9AEE, - 0xF38D: 0x9AF0, - 0xF38E: 0x9AF1, - 0xF38F: 0x9AF2, - 0xF390: 0x9AF3, - 0xF391: 0x9AF4, - 0xF392: 0x9AF5, - 0xF393: 0x9AF6, - 0xF394: 0x9AF7, - 0xF395: 0x9AF8, - 0xF396: 0x9AFA, - 0xF397: 0x9AFC, - 0xF398: 0x9AFD, - 0xF399: 0x9AFE, - 0xF39A: 0x9AFF, - 0xF39B: 0x9B00, - 0xF39C: 0x9B01, - 0xF39D: 0x9B02, - 0xF39E: 0x9B04, - 0xF39F: 0x9B05, - 0xF3A0: 0x9B06, - 0xF3A1: 0x87C6, - 0xF3A2: 0x8788, - 0xF3A3: 0x8785, - 0xF3A4: 0x87AD, - 0xF3A5: 0x8797, - 0xF3A6: 0x8783, - 0xF3A7: 0x87AB, - 0xF3A8: 0x87E5, - 0xF3A9: 0x87AC, - 0xF3AA: 0x87B5, - 0xF3AB: 0x87B3, - 0xF3AC: 0x87CB, - 0xF3AD: 0x87D3, - 0xF3AE: 0x87BD, - 0xF3AF: 0x87D1, - 0xF3B0: 0x87C0, - 0xF3B1: 0x87CA, - 0xF3B2: 0x87DB, - 0xF3B3: 0x87EA, - 0xF3B4: 0x87E0, - 0xF3B5: 0x87EE, - 0xF3B6: 0x8816, - 0xF3B7: 0x8813, - 0xF3B8: 0x87FE, - 0xF3B9: 0x880A, - 0xF3BA: 0x881B, - 0xF3BB: 0x8821, - 0xF3BC: 0x8839, - 0xF3BD: 0x883C, - 0xF3BE: 0x7F36, - 0xF3BF: 0x7F42, - 0xF3C0: 0x7F44, - 0xF3C1: 0x7F45, - 0xF3C2: 0x8210, - 0xF3C3: 0x7AFA, - 0xF3C4: 0x7AFD, - 0xF3C5: 0x7B08, - 0xF3C6: 0x7B03, - 0xF3C7: 0x7B04, - 0xF3C8: 0x7B15, - 0xF3C9: 0x7B0A, - 0xF3CA: 0x7B2B, - 0xF3CB: 0x7B0F, - 0xF3CC: 0x7B47, - 0xF3CD: 0x7B38, - 0xF3CE: 0x7B2A, - 0xF3CF: 0x7B19, - 0xF3D0: 0x7B2E, - 0xF3D1: 0x7B31, - 0xF3D2: 0x7B20, - 0xF3D3: 0x7B25, - 0xF3D4: 0x7B24, - 0xF3D5: 0x7B33, - 0xF3D6: 0x7B3E, - 0xF3D7: 0x7B1E, - 0xF3D8: 0x7B58, - 0xF3D9: 0x7B5A, - 0xF3DA: 0x7B45, - 0xF3DB: 0x7B75, - 0xF3DC: 0x7B4C, - 0xF3DD: 0x7B5D, - 0xF3DE: 0x7B60, - 0xF3DF: 0x7B6E, - 0xF3E0: 0x7B7B, - 0xF3E1: 0x7B62, - 0xF3E2: 0x7B72, - 0xF3E3: 0x7B71, - 0xF3E4: 0x7B90, - 0xF3E5: 0x7BA6, - 0xF3E6: 0x7BA7, - 0xF3E7: 0x7BB8, - 0xF3E8: 0x7BAC, - 0xF3E9: 0x7B9D, - 0xF3EA: 0x7BA8, - 0xF3EB: 0x7B85, - 0xF3EC: 0x7BAA, - 0xF3ED: 0x7B9C, - 0xF3EE: 0x7BA2, - 0xF3EF: 0x7BAB, - 0xF3F0: 0x7BB4, - 0xF3F1: 0x7BD1, - 0xF3F2: 0x7BC1, - 0xF3F3: 0x7BCC, - 0xF3F4: 0x7BDD, - 0xF3F5: 0x7BDA, - 0xF3F6: 0x7BE5, - 0xF3F7: 0x7BE6, - 0xF3F8: 0x7BEA, - 0xF3F9: 0x7C0C, - 0xF3FA: 0x7BFE, - 0xF3FB: 0x7BFC, - 0xF3FC: 0x7C0F, - 0xF3FD: 0x7C16, - 0xF3FE: 0x7C0B, - 0xF440: 0x9B07, - 0xF441: 0x9B09, - 0xF442: 0x9B0A, - 0xF443: 0x9B0B, - 0xF444: 0x9B0C, - 0xF445: 0x9B0D, - 0xF446: 0x9B0E, - 0xF447: 0x9B10, - 0xF448: 0x9B11, - 0xF449: 0x9B12, - 0xF44A: 0x9B14, - 0xF44B: 0x9B15, - 0xF44C: 0x9B16, - 0xF44D: 0x9B17, - 0xF44E: 0x9B18, - 0xF44F: 0x9B19, - 0xF450: 0x9B1A, - 0xF451: 0x9B1B, - 0xF452: 0x9B1C, - 0xF453: 0x9B1D, - 0xF454: 0x9B1E, - 0xF455: 0x9B20, - 0xF456: 0x9B21, - 0xF457: 0x9B22, - 0xF458: 0x9B24, - 0xF459: 0x9B25, - 0xF45A: 0x9B26, - 0xF45B: 0x9B27, - 0xF45C: 0x9B28, - 0xF45D: 0x9B29, - 0xF45E: 0x9B2A, - 0xF45F: 0x9B2B, - 0xF460: 0x9B2C, - 0xF461: 0x9B2D, - 0xF462: 0x9B2E, - 0xF463: 0x9B30, - 0xF464: 0x9B31, - 0xF465: 0x9B33, - 0xF466: 0x9B34, - 0xF467: 0x9B35, - 0xF468: 0x9B36, - 0xF469: 0x9B37, - 0xF46A: 0x9B38, - 0xF46B: 0x9B39, - 0xF46C: 0x9B3A, - 0xF46D: 0x9B3D, - 0xF46E: 0x9B3E, - 0xF46F: 0x9B3F, - 0xF470: 0x9B40, - 0xF471: 0x9B46, - 0xF472: 0x9B4A, - 0xF473: 0x9B4B, - 0xF474: 0x9B4C, - 0xF475: 0x9B4E, - 0xF476: 0x9B50, - 0xF477: 0x9B52, - 0xF478: 0x9B53, - 0xF479: 0x9B55, - 0xF47A: 0x9B56, - 0xF47B: 0x9B57, - 0xF47C: 0x9B58, - 0xF47D: 0x9B59, - 0xF47E: 0x9B5A, - 0xF480: 0x9B5B, - 0xF481: 0x9B5C, - 0xF482: 0x9B5D, - 0xF483: 0x9B5E, - 0xF484: 0x9B5F, - 0xF485: 0x9B60, - 0xF486: 0x9B61, - 0xF487: 0x9B62, - 0xF488: 0x9B63, - 0xF489: 0x9B64, - 0xF48A: 0x9B65, - 0xF48B: 0x9B66, - 0xF48C: 0x9B67, - 0xF48D: 0x9B68, - 0xF48E: 0x9B69, - 0xF48F: 0x9B6A, - 0xF490: 0x9B6B, - 0xF491: 0x9B6C, - 0xF492: 0x9B6D, - 0xF493: 0x9B6E, - 0xF494: 0x9B6F, - 0xF495: 0x9B70, - 0xF496: 0x9B71, - 0xF497: 0x9B72, - 0xF498: 0x9B73, - 0xF499: 0x9B74, - 0xF49A: 0x9B75, - 0xF49B: 0x9B76, - 0xF49C: 0x9B77, - 0xF49D: 0x9B78, - 0xF49E: 0x9B79, - 0xF49F: 0x9B7A, - 0xF4A0: 0x9B7B, - 0xF4A1: 0x7C1F, - 0xF4A2: 0x7C2A, - 0xF4A3: 0x7C26, - 0xF4A4: 0x7C38, - 0xF4A5: 0x7C41, - 0xF4A6: 0x7C40, - 0xF4A7: 0x81FE, - 0xF4A8: 0x8201, - 0xF4A9: 0x8202, - 0xF4AA: 0x8204, - 0xF4AB: 0x81EC, - 0xF4AC: 0x8844, - 0xF4AD: 0x8221, - 0xF4AE: 0x8222, - 0xF4AF: 0x8223, - 0xF4B0: 0x822D, - 0xF4B1: 0x822F, - 0xF4B2: 0x8228, - 0xF4B3: 0x822B, - 0xF4B4: 0x8238, - 0xF4B5: 0x823B, - 0xF4B6: 0x8233, - 0xF4B7: 0x8234, - 0xF4B8: 0x823E, - 0xF4B9: 0x8244, - 0xF4BA: 0x8249, - 0xF4BB: 0x824B, - 0xF4BC: 0x824F, - 0xF4BD: 0x825A, - 0xF4BE: 0x825F, - 0xF4BF: 0x8268, - 0xF4C0: 0x887E, - 0xF4C1: 0x8885, - 0xF4C2: 0x8888, - 0xF4C3: 0x88D8, - 0xF4C4: 0x88DF, - 0xF4C5: 0x895E, - 0xF4C6: 0x7F9D, - 0xF4C7: 0x7F9F, - 0xF4C8: 0x7FA7, - 0xF4C9: 0x7FAF, - 0xF4CA: 0x7FB0, - 0xF4CB: 0x7FB2, - 0xF4CC: 0x7C7C, - 0xF4CD: 0x6549, - 0xF4CE: 0x7C91, - 0xF4CF: 0x7C9D, - 0xF4D0: 0x7C9C, - 0xF4D1: 0x7C9E, - 0xF4D2: 0x7CA2, - 0xF4D3: 0x7CB2, - 0xF4D4: 0x7CBC, - 0xF4D5: 0x7CBD, - 0xF4D6: 0x7CC1, - 0xF4D7: 0x7CC7, - 0xF4D8: 0x7CCC, - 0xF4D9: 0x7CCD, - 0xF4DA: 0x7CC8, - 0xF4DB: 0x7CC5, - 0xF4DC: 0x7CD7, - 0xF4DD: 0x7CE8, - 0xF4DE: 0x826E, - 0xF4DF: 0x66A8, - 0xF4E0: 0x7FBF, - 0xF4E1: 0x7FCE, - 0xF4E2: 0x7FD5, - 0xF4E3: 0x7FE5, - 0xF4E4: 0x7FE1, - 0xF4E5: 0x7FE6, - 0xF4E6: 0x7FE9, - 0xF4E7: 0x7FEE, - 0xF4E8: 0x7FF3, - 0xF4E9: 0x7CF8, - 0xF4EA: 0x7D77, - 0xF4EB: 0x7DA6, - 0xF4EC: 0x7DAE, - 0xF4ED: 0x7E47, - 0xF4EE: 0x7E9B, - 0xF4EF: 0x9EB8, - 0xF4F0: 0x9EB4, - 0xF4F1: 0x8D73, - 0xF4F2: 0x8D84, - 0xF4F3: 0x8D94, - 0xF4F4: 0x8D91, - 0xF4F5: 0x8DB1, - 0xF4F6: 0x8D67, - 0xF4F7: 0x8D6D, - 0xF4F8: 0x8C47, - 0xF4F9: 0x8C49, - 0xF4FA: 0x914A, - 0xF4FB: 0x9150, - 0xF4FC: 0x914E, - 0xF4FD: 0x914F, - 0xF4FE: 0x9164, - 0xF540: 0x9B7C, - 0xF541: 0x9B7D, - 0xF542: 0x9B7E, - 0xF543: 0x9B7F, - 0xF544: 0x9B80, - 0xF545: 0x9B81, - 0xF546: 0x9B82, - 0xF547: 0x9B83, - 0xF548: 0x9B84, - 0xF549: 0x9B85, - 0xF54A: 0x9B86, - 0xF54B: 0x9B87, - 0xF54C: 0x9B88, - 0xF54D: 0x9B89, - 0xF54E: 0x9B8A, - 0xF54F: 0x9B8B, - 0xF550: 0x9B8C, - 0xF551: 0x9B8D, - 0xF552: 0x9B8E, - 0xF553: 0x9B8F, - 0xF554: 0x9B90, - 0xF555: 0x9B91, - 0xF556: 0x9B92, - 0xF557: 0x9B93, - 0xF558: 0x9B94, - 0xF559: 0x9B95, - 0xF55A: 0x9B96, - 0xF55B: 0x9B97, - 0xF55C: 0x9B98, - 0xF55D: 0x9B99, - 0xF55E: 0x9B9A, - 0xF55F: 0x9B9B, - 0xF560: 0x9B9C, - 0xF561: 0x9B9D, - 0xF562: 0x9B9E, - 0xF563: 0x9B9F, - 0xF564: 0x9BA0, - 0xF565: 0x9BA1, - 0xF566: 0x9BA2, - 0xF567: 0x9BA3, - 0xF568: 0x9BA4, - 0xF569: 0x9BA5, - 0xF56A: 0x9BA6, - 0xF56B: 0x9BA7, - 0xF56C: 0x9BA8, - 0xF56D: 0x9BA9, - 0xF56E: 0x9BAA, - 0xF56F: 0x9BAB, - 0xF570: 0x9BAC, - 0xF571: 0x9BAD, - 0xF572: 0x9BAE, - 0xF573: 0x9BAF, - 0xF574: 0x9BB0, - 0xF575: 0x9BB1, - 0xF576: 0x9BB2, - 0xF577: 0x9BB3, - 0xF578: 0x9BB4, - 0xF579: 0x9BB5, - 0xF57A: 0x9BB6, - 0xF57B: 0x9BB7, - 0xF57C: 0x9BB8, - 0xF57D: 0x9BB9, - 0xF57E: 0x9BBA, - 0xF580: 0x9BBB, - 0xF581: 0x9BBC, - 0xF582: 0x9BBD, - 0xF583: 0x9BBE, - 0xF584: 0x9BBF, - 0xF585: 0x9BC0, - 0xF586: 0x9BC1, - 0xF587: 0x9BC2, - 0xF588: 0x9BC3, - 0xF589: 0x9BC4, - 0xF58A: 0x9BC5, - 0xF58B: 0x9BC6, - 0xF58C: 0x9BC7, - 0xF58D: 0x9BC8, - 0xF58E: 0x9BC9, - 0xF58F: 0x9BCA, - 0xF590: 0x9BCB, - 0xF591: 0x9BCC, - 0xF592: 0x9BCD, - 0xF593: 0x9BCE, - 0xF594: 0x9BCF, - 0xF595: 0x9BD0, - 0xF596: 0x9BD1, - 0xF597: 0x9BD2, - 0xF598: 0x9BD3, - 0xF599: 0x9BD4, - 0xF59A: 0x9BD5, - 0xF59B: 0x9BD6, - 0xF59C: 0x9BD7, - 0xF59D: 0x9BD8, - 0xF59E: 0x9BD9, - 0xF59F: 0x9BDA, - 0xF5A0: 0x9BDB, - 0xF5A1: 0x9162, - 0xF5A2: 0x9161, - 0xF5A3: 0x9170, - 0xF5A4: 0x9169, - 0xF5A5: 0x916F, - 0xF5A6: 0x917D, - 0xF5A7: 0x917E, - 0xF5A8: 0x9172, - 0xF5A9: 0x9174, - 0xF5AA: 0x9179, - 0xF5AB: 0x918C, - 0xF5AC: 0x9185, - 0xF5AD: 0x9190, - 0xF5AE: 0x918D, - 0xF5AF: 0x9191, - 0xF5B0: 0x91A2, - 0xF5B1: 0x91A3, - 0xF5B2: 0x91AA, - 0xF5B3: 0x91AD, - 0xF5B4: 0x91AE, - 0xF5B5: 0x91AF, - 0xF5B6: 0x91B5, - 0xF5B7: 0x91B4, - 0xF5B8: 0x91BA, - 0xF5B9: 0x8C55, - 0xF5BA: 0x9E7E, - 0xF5BB: 0x8DB8, - 0xF5BC: 0x8DEB, - 0xF5BD: 0x8E05, - 0xF5BE: 0x8E59, - 0xF5BF: 0x8E69, - 0xF5C0: 0x8DB5, - 0xF5C1: 0x8DBF, - 0xF5C2: 0x8DBC, - 0xF5C3: 0x8DBA, - 0xF5C4: 0x8DC4, - 0xF5C5: 0x8DD6, - 0xF5C6: 0x8DD7, - 0xF5C7: 0x8DDA, - 0xF5C8: 0x8DDE, - 0xF5C9: 0x8DCE, - 0xF5CA: 0x8DCF, - 0xF5CB: 0x8DDB, - 0xF5CC: 0x8DC6, - 0xF5CD: 0x8DEC, - 0xF5CE: 0x8DF7, - 0xF5CF: 0x8DF8, - 0xF5D0: 0x8DE3, - 0xF5D1: 0x8DF9, - 0xF5D2: 0x8DFB, - 0xF5D3: 0x8DE4, - 0xF5D4: 0x8E09, - 0xF5D5: 0x8DFD, - 0xF5D6: 0x8E14, - 0xF5D7: 0x8E1D, - 0xF5D8: 0x8E1F, - 0xF5D9: 0x8E2C, - 0xF5DA: 0x8E2E, - 0xF5DB: 0x8E23, - 0xF5DC: 0x8E2F, - 0xF5DD: 0x8E3A, - 0xF5DE: 0x8E40, - 0xF5DF: 0x8E39, - 0xF5E0: 0x8E35, - 0xF5E1: 0x8E3D, - 0xF5E2: 0x8E31, - 0xF5E3: 0x8E49, - 0xF5E4: 0x8E41, - 0xF5E5: 0x8E42, - 0xF5E6: 0x8E51, - 0xF5E7: 0x8E52, - 0xF5E8: 0x8E4A, - 0xF5E9: 0x8E70, - 0xF5EA: 0x8E76, - 0xF5EB: 0x8E7C, - 0xF5EC: 0x8E6F, - 0xF5ED: 0x8E74, - 0xF5EE: 0x8E85, - 0xF5EF: 0x8E8F, - 0xF5F0: 0x8E94, - 0xF5F1: 0x8E90, - 0xF5F2: 0x8E9C, - 0xF5F3: 0x8E9E, - 0xF5F4: 0x8C78, - 0xF5F5: 0x8C82, - 0xF5F6: 0x8C8A, - 0xF5F7: 0x8C85, - 0xF5F8: 0x8C98, - 0xF5F9: 0x8C94, - 0xF5FA: 0x659B, - 0xF5FB: 0x89D6, - 0xF5FC: 0x89DE, - 0xF5FD: 0x89DA, - 0xF5FE: 0x89DC, - 0xF640: 0x9BDC, - 0xF641: 0x9BDD, - 0xF642: 0x9BDE, - 0xF643: 0x9BDF, - 0xF644: 0x9BE0, - 0xF645: 0x9BE1, - 0xF646: 0x9BE2, - 0xF647: 0x9BE3, - 0xF648: 0x9BE4, - 0xF649: 0x9BE5, - 0xF64A: 0x9BE6, - 0xF64B: 0x9BE7, - 0xF64C: 0x9BE8, - 0xF64D: 0x9BE9, - 0xF64E: 0x9BEA, - 0xF64F: 0x9BEB, - 0xF650: 0x9BEC, - 0xF651: 0x9BED, - 0xF652: 0x9BEE, - 0xF653: 0x9BEF, - 0xF654: 0x9BF0, - 0xF655: 0x9BF1, - 0xF656: 0x9BF2, - 0xF657: 0x9BF3, - 0xF658: 0x9BF4, - 0xF659: 0x9BF5, - 0xF65A: 0x9BF6, - 0xF65B: 0x9BF7, - 0xF65C: 0x9BF8, - 0xF65D: 0x9BF9, - 0xF65E: 0x9BFA, - 0xF65F: 0x9BFB, - 0xF660: 0x9BFC, - 0xF661: 0x9BFD, - 0xF662: 0x9BFE, - 0xF663: 0x9BFF, - 0xF664: 0x9C00, - 0xF665: 0x9C01, - 0xF666: 0x9C02, - 0xF667: 0x9C03, - 0xF668: 0x9C04, - 0xF669: 0x9C05, - 0xF66A: 0x9C06, - 0xF66B: 0x9C07, - 0xF66C: 0x9C08, - 0xF66D: 0x9C09, - 0xF66E: 0x9C0A, - 0xF66F: 0x9C0B, - 0xF670: 0x9C0C, - 0xF671: 0x9C0D, - 0xF672: 0x9C0E, - 0xF673: 0x9C0F, - 0xF674: 0x9C10, - 0xF675: 0x9C11, - 0xF676: 0x9C12, - 0xF677: 0x9C13, - 0xF678: 0x9C14, - 0xF679: 0x9C15, - 0xF67A: 0x9C16, - 0xF67B: 0x9C17, - 0xF67C: 0x9C18, - 0xF67D: 0x9C19, - 0xF67E: 0x9C1A, - 0xF680: 0x9C1B, - 0xF681: 0x9C1C, - 0xF682: 0x9C1D, - 0xF683: 0x9C1E, - 0xF684: 0x9C1F, - 0xF685: 0x9C20, - 0xF686: 0x9C21, - 0xF687: 0x9C22, - 0xF688: 0x9C23, - 0xF689: 0x9C24, - 0xF68A: 0x9C25, - 0xF68B: 0x9C26, - 0xF68C: 0x9C27, - 0xF68D: 0x9C28, - 0xF68E: 0x9C29, - 0xF68F: 0x9C2A, - 0xF690: 0x9C2B, - 0xF691: 0x9C2C, - 0xF692: 0x9C2D, - 0xF693: 0x9C2E, - 0xF694: 0x9C2F, - 0xF695: 0x9C30, - 0xF696: 0x9C31, - 0xF697: 0x9C32, - 0xF698: 0x9C33, - 0xF699: 0x9C34, - 0xF69A: 0x9C35, - 0xF69B: 0x9C36, - 0xF69C: 0x9C37, - 0xF69D: 0x9C38, - 0xF69E: 0x9C39, - 0xF69F: 0x9C3A, - 0xF6A0: 0x9C3B, - 0xF6A1: 0x89E5, - 0xF6A2: 0x89EB, - 0xF6A3: 0x89EF, - 0xF6A4: 0x8A3E, - 0xF6A5: 0x8B26, - 0xF6A6: 0x9753, - 0xF6A7: 0x96E9, - 0xF6A8: 0x96F3, - 0xF6A9: 0x96EF, - 0xF6AA: 0x9706, - 0xF6AB: 0x9701, - 0xF6AC: 0x9708, - 0xF6AD: 0x970F, - 0xF6AE: 0x970E, - 0xF6AF: 0x972A, - 0xF6B0: 0x972D, - 0xF6B1: 0x9730, - 0xF6B2: 0x973E, - 0xF6B3: 0x9F80, - 0xF6B4: 0x9F83, - 0xF6B5: 0x9F85, - 0xF6B6: 0x9F86, - 0xF6B7: 0x9F87, - 0xF6B8: 0x9F88, - 0xF6B9: 0x9F89, - 0xF6BA: 0x9F8A, - 0xF6BB: 0x9F8C, - 0xF6BC: 0x9EFE, - 0xF6BD: 0x9F0B, - 0xF6BE: 0x9F0D, - 0xF6BF: 0x96B9, - 0xF6C0: 0x96BC, - 0xF6C1: 0x96BD, - 0xF6C2: 0x96CE, - 0xF6C3: 0x96D2, - 0xF6C4: 0x77BF, - 0xF6C5: 0x96E0, - 0xF6C6: 0x928E, - 0xF6C7: 0x92AE, - 0xF6C8: 0x92C8, - 0xF6C9: 0x933E, - 0xF6CA: 0x936A, - 0xF6CB: 0x93CA, - 0xF6CC: 0x938F, - 0xF6CD: 0x943E, - 0xF6CE: 0x946B, - 0xF6CF: 0x9C7F, - 0xF6D0: 0x9C82, - 0xF6D1: 0x9C85, - 0xF6D2: 0x9C86, - 0xF6D3: 0x9C87, - 0xF6D4: 0x9C88, - 0xF6D5: 0x7A23, - 0xF6D6: 0x9C8B, - 0xF6D7: 0x9C8E, - 0xF6D8: 0x9C90, - 0xF6D9: 0x9C91, - 0xF6DA: 0x9C92, - 0xF6DB: 0x9C94, - 0xF6DC: 0x9C95, - 0xF6DD: 0x9C9A, - 0xF6DE: 0x9C9B, - 0xF6DF: 0x9C9E, - 0xF6E0: 0x9C9F, - 0xF6E1: 0x9CA0, - 0xF6E2: 0x9CA1, - 0xF6E3: 0x9CA2, - 0xF6E4: 0x9CA3, - 0xF6E5: 0x9CA5, - 0xF6E6: 0x9CA6, - 0xF6E7: 0x9CA7, - 0xF6E8: 0x9CA8, - 0xF6E9: 0x9CA9, - 0xF6EA: 0x9CAB, - 0xF6EB: 0x9CAD, - 0xF6EC: 0x9CAE, - 0xF6ED: 0x9CB0, - 0xF6EE: 0x9CB1, - 0xF6EF: 0x9CB2, - 0xF6F0: 0x9CB3, - 0xF6F1: 0x9CB4, - 0xF6F2: 0x9CB5, - 0xF6F3: 0x9CB6, - 0xF6F4: 0x9CB7, - 0xF6F5: 0x9CBA, - 0xF6F6: 0x9CBB, - 0xF6F7: 0x9CBC, - 0xF6F8: 0x9CBD, - 0xF6F9: 0x9CC4, - 0xF6FA: 0x9CC5, - 0xF6FB: 0x9CC6, - 0xF6FC: 0x9CC7, - 0xF6FD: 0x9CCA, - 0xF6FE: 0x9CCB, - 0xF740: 0x9C3C, - 0xF741: 0x9C3D, - 0xF742: 0x9C3E, - 0xF743: 0x9C3F, - 0xF744: 0x9C40, - 0xF745: 0x9C41, - 0xF746: 0x9C42, - 0xF747: 0x9C43, - 0xF748: 0x9C44, - 0xF749: 0x9C45, - 0xF74A: 0x9C46, - 0xF74B: 0x9C47, - 0xF74C: 0x9C48, - 0xF74D: 0x9C49, - 0xF74E: 0x9C4A, - 0xF74F: 0x9C4B, - 0xF750: 0x9C4C, - 0xF751: 0x9C4D, - 0xF752: 0x9C4E, - 0xF753: 0x9C4F, - 0xF754: 0x9C50, - 0xF755: 0x9C51, - 0xF756: 0x9C52, - 0xF757: 0x9C53, - 0xF758: 0x9C54, - 0xF759: 0x9C55, - 0xF75A: 0x9C56, - 0xF75B: 0x9C57, - 0xF75C: 0x9C58, - 0xF75D: 0x9C59, - 0xF75E: 0x9C5A, - 0xF75F: 0x9C5B, - 0xF760: 0x9C5C, - 0xF761: 0x9C5D, - 0xF762: 0x9C5E, - 0xF763: 0x9C5F, - 0xF764: 0x9C60, - 0xF765: 0x9C61, - 0xF766: 0x9C62, - 0xF767: 0x9C63, - 0xF768: 0x9C64, - 0xF769: 0x9C65, - 0xF76A: 0x9C66, - 0xF76B: 0x9C67, - 0xF76C: 0x9C68, - 0xF76D: 0x9C69, - 0xF76E: 0x9C6A, - 0xF76F: 0x9C6B, - 0xF770: 0x9C6C, - 0xF771: 0x9C6D, - 0xF772: 0x9C6E, - 0xF773: 0x9C6F, - 0xF774: 0x9C70, - 0xF775: 0x9C71, - 0xF776: 0x9C72, - 0xF777: 0x9C73, - 0xF778: 0x9C74, - 0xF779: 0x9C75, - 0xF77A: 0x9C76, - 0xF77B: 0x9C77, - 0xF77C: 0x9C78, - 0xF77D: 0x9C79, - 0xF77E: 0x9C7A, - 0xF780: 0x9C7B, - 0xF781: 0x9C7D, - 0xF782: 0x9C7E, - 0xF783: 0x9C80, - 0xF784: 0x9C83, - 0xF785: 0x9C84, - 0xF786: 0x9C89, - 0xF787: 0x9C8A, - 0xF788: 0x9C8C, - 0xF789: 0x9C8F, - 0xF78A: 0x9C93, - 0xF78B: 0x9C96, - 0xF78C: 0x9C97, - 0xF78D: 0x9C98, - 0xF78E: 0x9C99, - 0xF78F: 0x9C9D, - 0xF790: 0x9CAA, - 0xF791: 0x9CAC, - 0xF792: 0x9CAF, - 0xF793: 0x9CB9, - 0xF794: 0x9CBE, - 0xF795: 0x9CBF, - 0xF796: 0x9CC0, - 0xF797: 0x9CC1, - 0xF798: 0x9CC2, - 0xF799: 0x9CC8, - 0xF79A: 0x9CC9, - 0xF79B: 0x9CD1, - 0xF79C: 0x9CD2, - 0xF79D: 0x9CDA, - 0xF79E: 0x9CDB, - 0xF79F: 0x9CE0, - 0xF7A0: 0x9CE1, - 0xF7A1: 0x9CCC, - 0xF7A2: 0x9CCD, - 0xF7A3: 0x9CCE, - 0xF7A4: 0x9CCF, - 0xF7A5: 0x9CD0, - 0xF7A6: 0x9CD3, - 0xF7A7: 0x9CD4, - 0xF7A8: 0x9CD5, - 0xF7A9: 0x9CD7, - 0xF7AA: 0x9CD8, - 0xF7AB: 0x9CD9, - 0xF7AC: 0x9CDC, - 0xF7AD: 0x9CDD, - 0xF7AE: 0x9CDF, - 0xF7AF: 0x9CE2, - 0xF7B0: 0x977C, - 0xF7B1: 0x9785, - 0xF7B2: 0x9791, - 0xF7B3: 0x9792, - 0xF7B4: 0x9794, - 0xF7B5: 0x97AF, - 0xF7B6: 0x97AB, - 0xF7B7: 0x97A3, - 0xF7B8: 0x97B2, - 0xF7B9: 0x97B4, - 0xF7BA: 0x9AB1, - 0xF7BB: 0x9AB0, - 0xF7BC: 0x9AB7, - 0xF7BD: 0x9E58, - 0xF7BE: 0x9AB6, - 0xF7BF: 0x9ABA, - 0xF7C0: 0x9ABC, - 0xF7C1: 0x9AC1, - 0xF7C2: 0x9AC0, - 0xF7C3: 0x9AC5, - 0xF7C4: 0x9AC2, - 0xF7C5: 0x9ACB, - 0xF7C6: 0x9ACC, - 0xF7C7: 0x9AD1, - 0xF7C8: 0x9B45, - 0xF7C9: 0x9B43, - 0xF7CA: 0x9B47, - 0xF7CB: 0x9B49, - 0xF7CC: 0x9B48, - 0xF7CD: 0x9B4D, - 0xF7CE: 0x9B51, - 0xF7CF: 0x98E8, - 0xF7D0: 0x990D, - 0xF7D1: 0x992E, - 0xF7D2: 0x9955, - 0xF7D3: 0x9954, - 0xF7D4: 0x9ADF, - 0xF7D5: 0x9AE1, - 0xF7D6: 0x9AE6, - 0xF7D7: 0x9AEF, - 0xF7D8: 0x9AEB, - 0xF7D9: 0x9AFB, - 0xF7DA: 0x9AED, - 0xF7DB: 0x9AF9, - 0xF7DC: 0x9B08, - 0xF7DD: 0x9B0F, - 0xF7DE: 0x9B13, - 0xF7DF: 0x9B1F, - 0xF7E0: 0x9B23, - 0xF7E1: 0x9EBD, - 0xF7E2: 0x9EBE, - 0xF7E3: 0x7E3B, - 0xF7E4: 0x9E82, - 0xF7E5: 0x9E87, - 0xF7E6: 0x9E88, - 0xF7E7: 0x9E8B, - 0xF7E8: 0x9E92, - 0xF7E9: 0x93D6, - 0xF7EA: 0x9E9D, - 0xF7EB: 0x9E9F, - 0xF7EC: 0x9EDB, - 0xF7ED: 0x9EDC, - 0xF7EE: 0x9EDD, - 0xF7EF: 0x9EE0, - 0xF7F0: 0x9EDF, - 0xF7F1: 0x9EE2, - 0xF7F2: 0x9EE9, - 0xF7F3: 0x9EE7, - 0xF7F4: 0x9EE5, - 0xF7F5: 0x9EEA, - 0xF7F6: 0x9EEF, - 0xF7F7: 0x9F22, - 0xF7F8: 0x9F2C, - 0xF7F9: 0x9F2F, - 0xF7FA: 0x9F39, - 0xF7FB: 0x9F37, - 0xF7FC: 0x9F3D, - 0xF7FD: 0x9F3E, - 0xF7FE: 0x9F44, - 0xF840: 0x9CE3, - 0xF841: 0x9CE4, - 0xF842: 0x9CE5, - 0xF843: 0x9CE6, - 0xF844: 0x9CE7, - 0xF845: 0x9CE8, - 0xF846: 0x9CE9, - 0xF847: 0x9CEA, - 0xF848: 0x9CEB, - 0xF849: 0x9CEC, - 0xF84A: 0x9CED, - 0xF84B: 0x9CEE, - 0xF84C: 0x9CEF, - 0xF84D: 0x9CF0, - 0xF84E: 0x9CF1, - 0xF84F: 0x9CF2, - 0xF850: 0x9CF3, - 0xF851: 0x9CF4, - 0xF852: 0x9CF5, - 0xF853: 0x9CF6, - 0xF854: 0x9CF7, - 0xF855: 0x9CF8, - 0xF856: 0x9CF9, - 0xF857: 0x9CFA, - 0xF858: 0x9CFB, - 0xF859: 0x9CFC, - 0xF85A: 0x9CFD, - 0xF85B: 0x9CFE, - 0xF85C: 0x9CFF, - 0xF85D: 0x9D00, - 0xF85E: 0x9D01, - 0xF85F: 0x9D02, - 0xF860: 0x9D03, - 0xF861: 0x9D04, - 0xF862: 0x9D05, - 0xF863: 0x9D06, - 0xF864: 0x9D07, - 0xF865: 0x9D08, - 0xF866: 0x9D09, - 0xF867: 0x9D0A, - 0xF868: 0x9D0B, - 0xF869: 0x9D0C, - 0xF86A: 0x9D0D, - 0xF86B: 0x9D0E, - 0xF86C: 0x9D0F, - 0xF86D: 0x9D10, - 0xF86E: 0x9D11, - 0xF86F: 0x9D12, - 0xF870: 0x9D13, - 0xF871: 0x9D14, - 0xF872: 0x9D15, - 0xF873: 0x9D16, - 0xF874: 0x9D17, - 0xF875: 0x9D18, - 0xF876: 0x9D19, - 0xF877: 0x9D1A, - 0xF878: 0x9D1B, - 0xF879: 0x9D1C, - 0xF87A: 0x9D1D, - 0xF87B: 0x9D1E, - 0xF87C: 0x9D1F, - 0xF87D: 0x9D20, - 0xF87E: 0x9D21, - 0xF880: 0x9D22, - 0xF881: 0x9D23, - 0xF882: 0x9D24, - 0xF883: 0x9D25, - 0xF884: 0x9D26, - 0xF885: 0x9D27, - 0xF886: 0x9D28, - 0xF887: 0x9D29, - 0xF888: 0x9D2A, - 0xF889: 0x9D2B, - 0xF88A: 0x9D2C, - 0xF88B: 0x9D2D, - 0xF88C: 0x9D2E, - 0xF88D: 0x9D2F, - 0xF88E: 0x9D30, - 0xF88F: 0x9D31, - 0xF890: 0x9D32, - 0xF891: 0x9D33, - 0xF892: 0x9D34, - 0xF893: 0x9D35, - 0xF894: 0x9D36, - 0xF895: 0x9D37, - 0xF896: 0x9D38, - 0xF897: 0x9D39, - 0xF898: 0x9D3A, - 0xF899: 0x9D3B, - 0xF89A: 0x9D3C, - 0xF89B: 0x9D3D, - 0xF89C: 0x9D3E, - 0xF89D: 0x9D3F, - 0xF89E: 0x9D40, - 0xF89F: 0x9D41, - 0xF8A0: 0x9D42, - 0xF8A1: 0xE234, - 0xF8A2: 0xE235, - 0xF8A3: 0xE236, - 0xF8A4: 0xE237, - 0xF8A5: 0xE238, - 0xF8A6: 0xE239, - 0xF8A7: 0xE23A, - 0xF8A8: 0xE23B, - 0xF8A9: 0xE23C, - 0xF8AA: 0xE23D, - 0xF8AB: 0xE23E, - 0xF8AC: 0xE23F, - 0xF8AD: 0xE240, - 0xF8AE: 0xE241, - 0xF8AF: 0xE242, - 0xF8B0: 0xE243, - 0xF8B1: 0xE244, - 0xF8B2: 0xE245, - 0xF8B3: 0xE246, - 0xF8B4: 0xE247, - 0xF8B5: 0xE248, - 0xF8B6: 0xE249, - 0xF8B7: 0xE24A, - 0xF8B8: 0xE24B, - 0xF8B9: 0xE24C, - 0xF8BA: 0xE24D, - 0xF8BB: 0xE24E, - 0xF8BC: 0xE24F, - 0xF8BD: 0xE250, - 0xF8BE: 0xE251, - 0xF8BF: 0xE252, - 0xF8C0: 0xE253, - 0xF8C1: 0xE254, - 0xF8C2: 0xE255, - 0xF8C3: 0xE256, - 0xF8C4: 0xE257, - 0xF8C5: 0xE258, - 0xF8C6: 0xE259, - 0xF8C7: 0xE25A, - 0xF8C8: 0xE25B, - 0xF8C9: 0xE25C, - 0xF8CA: 0xE25D, - 0xF8CB: 0xE25E, - 0xF8CC: 0xE25F, - 0xF8CD: 0xE260, - 0xF8CE: 0xE261, - 0xF8CF: 0xE262, - 0xF8D0: 0xE263, - 0xF8D1: 0xE264, - 0xF8D2: 0xE265, - 0xF8D3: 0xE266, - 0xF8D4: 0xE267, - 0xF8D5: 0xE268, - 0xF8D6: 0xE269, - 0xF8D7: 0xE26A, - 0xF8D8: 0xE26B, - 0xF8D9: 0xE26C, - 0xF8DA: 0xE26D, - 0xF8DB: 0xE26E, - 0xF8DC: 0xE26F, - 0xF8DD: 0xE270, - 0xF8DE: 0xE271, - 0xF8DF: 0xE272, - 0xF8E0: 0xE273, - 0xF8E1: 0xE274, - 0xF8E2: 0xE275, - 0xF8E3: 0xE276, - 0xF8E4: 0xE277, - 0xF8E5: 0xE278, - 0xF8E6: 0xE279, - 0xF8E7: 0xE27A, - 0xF8E8: 0xE27B, - 0xF8E9: 0xE27C, - 0xF8EA: 0xE27D, - 0xF8EB: 0xE27E, - 0xF8EC: 0xE27F, - 0xF8ED: 0xE280, - 0xF8EE: 0xE281, - 0xF8EF: 0xE282, - 0xF8F0: 0xE283, - 0xF8F1: 0xE284, - 0xF8F2: 0xE285, - 0xF8F3: 0xE286, - 0xF8F4: 0xE287, - 0xF8F5: 0xE288, - 0xF8F6: 0xE289, - 0xF8F7: 0xE28A, - 0xF8F8: 0xE28B, - 0xF8F9: 0xE28C, - 0xF8FA: 0xE28D, - 0xF8FB: 0xE28E, - 0xF8FC: 0xE28F, - 0xF8FD: 0xE290, - 0xF8FE: 0xE291, - 0xF940: 0x9D43, - 0xF941: 0x9D44, - 0xF942: 0x9D45, - 0xF943: 0x9D46, - 0xF944: 0x9D47, - 0xF945: 0x9D48, - 0xF946: 0x9D49, - 0xF947: 0x9D4A, - 0xF948: 0x9D4B, - 0xF949: 0x9D4C, - 0xF94A: 0x9D4D, - 0xF94B: 0x9D4E, - 0xF94C: 0x9D4F, - 0xF94D: 0x9D50, - 0xF94E: 0x9D51, - 0xF94F: 0x9D52, - 0xF950: 0x9D53, - 0xF951: 0x9D54, - 0xF952: 0x9D55, - 0xF953: 0x9D56, - 0xF954: 0x9D57, - 0xF955: 0x9D58, - 0xF956: 0x9D59, - 0xF957: 0x9D5A, - 0xF958: 0x9D5B, - 0xF959: 0x9D5C, - 0xF95A: 0x9D5D, - 0xF95B: 0x9D5E, - 0xF95C: 0x9D5F, - 0xF95D: 0x9D60, - 0xF95E: 0x9D61, - 0xF95F: 0x9D62, - 0xF960: 0x9D63, - 0xF961: 0x9D64, - 0xF962: 0x9D65, - 0xF963: 0x9D66, - 0xF964: 0x9D67, - 0xF965: 0x9D68, - 0xF966: 0x9D69, - 0xF967: 0x9D6A, - 0xF968: 0x9D6B, - 0xF969: 0x9D6C, - 0xF96A: 0x9D6D, - 0xF96B: 0x9D6E, - 0xF96C: 0x9D6F, - 0xF96D: 0x9D70, - 0xF96E: 0x9D71, - 0xF96F: 0x9D72, - 0xF970: 0x9D73, - 0xF971: 0x9D74, - 0xF972: 0x9D75, - 0xF973: 0x9D76, - 0xF974: 0x9D77, - 0xF975: 0x9D78, - 0xF976: 0x9D79, - 0xF977: 0x9D7A, - 0xF978: 0x9D7B, - 0xF979: 0x9D7C, - 0xF97A: 0x9D7D, - 0xF97B: 0x9D7E, - 0xF97C: 0x9D7F, - 0xF97D: 0x9D80, - 0xF97E: 0x9D81, - 0xF980: 0x9D82, - 0xF981: 0x9D83, - 0xF982: 0x9D84, - 0xF983: 0x9D85, - 0xF984: 0x9D86, - 0xF985: 0x9D87, - 0xF986: 0x9D88, - 0xF987: 0x9D89, - 0xF988: 0x9D8A, - 0xF989: 0x9D8B, - 0xF98A: 0x9D8C, - 0xF98B: 0x9D8D, - 0xF98C: 0x9D8E, - 0xF98D: 0x9D8F, - 0xF98E: 0x9D90, - 0xF98F: 0x9D91, - 0xF990: 0x9D92, - 0xF991: 0x9D93, - 0xF992: 0x9D94, - 0xF993: 0x9D95, - 0xF994: 0x9D96, - 0xF995: 0x9D97, - 0xF996: 0x9D98, - 0xF997: 0x9D99, - 0xF998: 0x9D9A, - 0xF999: 0x9D9B, - 0xF99A: 0x9D9C, - 0xF99B: 0x9D9D, - 0xF99C: 0x9D9E, - 0xF99D: 0x9D9F, - 0xF99E: 0x9DA0, - 0xF99F: 0x9DA1, - 0xF9A0: 0x9DA2, - 0xF9A1: 0xE292, - 0xF9A2: 0xE293, - 0xF9A3: 0xE294, - 0xF9A4: 0xE295, - 0xF9A5: 0xE296, - 0xF9A6: 0xE297, - 0xF9A7: 0xE298, - 0xF9A8: 0xE299, - 0xF9A9: 0xE29A, - 0xF9AA: 0xE29B, - 0xF9AB: 0xE29C, - 0xF9AC: 0xE29D, - 0xF9AD: 0xE29E, - 0xF9AE: 0xE29F, - 0xF9AF: 0xE2A0, - 0xF9B0: 0xE2A1, - 0xF9B1: 0xE2A2, - 0xF9B2: 0xE2A3, - 0xF9B3: 0xE2A4, - 0xF9B4: 0xE2A5, - 0xF9B5: 0xE2A6, - 0xF9B6: 0xE2A7, - 0xF9B7: 0xE2A8, - 0xF9B8: 0xE2A9, - 0xF9B9: 0xE2AA, - 0xF9BA: 0xE2AB, - 0xF9BB: 0xE2AC, - 0xF9BC: 0xE2AD, - 0xF9BD: 0xE2AE, - 0xF9BE: 0xE2AF, - 0xF9BF: 0xE2B0, - 0xF9C0: 0xE2B1, - 0xF9C1: 0xE2B2, - 0xF9C2: 0xE2B3, - 0xF9C3: 0xE2B4, - 0xF9C4: 0xE2B5, - 0xF9C5: 0xE2B6, - 0xF9C6: 0xE2B7, - 0xF9C7: 0xE2B8, - 0xF9C8: 0xE2B9, - 0xF9C9: 0xE2BA, - 0xF9CA: 0xE2BB, - 0xF9CB: 0xE2BC, - 0xF9CC: 0xE2BD, - 0xF9CD: 0xE2BE, - 0xF9CE: 0xE2BF, - 0xF9CF: 0xE2C0, - 0xF9D0: 0xE2C1, - 0xF9D1: 0xE2C2, - 0xF9D2: 0xE2C3, - 0xF9D3: 0xE2C4, - 0xF9D4: 0xE2C5, - 0xF9D5: 0xE2C6, - 0xF9D6: 0xE2C7, - 0xF9D7: 0xE2C8, - 0xF9D8: 0xE2C9, - 0xF9D9: 0xE2CA, - 0xF9DA: 0xE2CB, - 0xF9DB: 0xE2CC, - 0xF9DC: 0xE2CD, - 0xF9DD: 0xE2CE, - 0xF9DE: 0xE2CF, - 0xF9DF: 0xE2D0, - 0xF9E0: 0xE2D1, - 0xF9E1: 0xE2D2, - 0xF9E2: 0xE2D3, - 0xF9E3: 0xE2D4, - 0xF9E4: 0xE2D5, - 0xF9E5: 0xE2D6, - 0xF9E6: 0xE2D7, - 0xF9E7: 0xE2D8, - 0xF9E8: 0xE2D9, - 0xF9E9: 0xE2DA, - 0xF9EA: 0xE2DB, - 0xF9EB: 0xE2DC, - 0xF9EC: 0xE2DD, - 0xF9ED: 0xE2DE, - 0xF9EE: 0xE2DF, - 0xF9EF: 0xE2E0, - 0xF9F0: 0xE2E1, - 0xF9F1: 0xE2E2, - 0xF9F2: 0xE2E3, - 0xF9F3: 0xE2E4, - 0xF9F4: 0xE2E5, - 0xF9F5: 0xE2E6, - 0xF9F6: 0xE2E7, - 0xF9F7: 0xE2E8, - 0xF9F8: 0xE2E9, - 0xF9F9: 0xE2EA, - 0xF9FA: 0xE2EB, - 0xF9FB: 0xE2EC, - 0xF9FC: 0xE2ED, - 0xF9FD: 0xE2EE, - 0xF9FE: 0xE2EF, - 0xFA40: 0x9DA3, - 0xFA41: 0x9DA4, - 0xFA42: 0x9DA5, - 0xFA43: 0x9DA6, - 0xFA44: 0x9DA7, - 0xFA45: 0x9DA8, - 0xFA46: 0x9DA9, - 0xFA47: 0x9DAA, - 0xFA48: 0x9DAB, - 0xFA49: 0x9DAC, - 0xFA4A: 0x9DAD, - 0xFA4B: 0x9DAE, - 0xFA4C: 0x9DAF, - 0xFA4D: 0x9DB0, - 0xFA4E: 0x9DB1, - 0xFA4F: 0x9DB2, - 0xFA50: 0x9DB3, - 0xFA51: 0x9DB4, - 0xFA52: 0x9DB5, - 0xFA53: 0x9DB6, - 0xFA54: 0x9DB7, - 0xFA55: 0x9DB8, - 0xFA56: 0x9DB9, - 0xFA57: 0x9DBA, - 0xFA58: 0x9DBB, - 0xFA59: 0x9DBC, - 0xFA5A: 0x9DBD, - 0xFA5B: 0x9DBE, - 0xFA5C: 0x9DBF, - 0xFA5D: 0x9DC0, - 0xFA5E: 0x9DC1, - 0xFA5F: 0x9DC2, - 0xFA60: 0x9DC3, - 0xFA61: 0x9DC4, - 0xFA62: 0x9DC5, - 0xFA63: 0x9DC6, - 0xFA64: 0x9DC7, - 0xFA65: 0x9DC8, - 0xFA66: 0x9DC9, - 0xFA67: 0x9DCA, - 0xFA68: 0x9DCB, - 0xFA69: 0x9DCC, - 0xFA6A: 0x9DCD, - 0xFA6B: 0x9DCE, - 0xFA6C: 0x9DCF, - 0xFA6D: 0x9DD0, - 0xFA6E: 0x9DD1, - 0xFA6F: 0x9DD2, - 0xFA70: 0x9DD3, - 0xFA71: 0x9DD4, - 0xFA72: 0x9DD5, - 0xFA73: 0x9DD6, - 0xFA74: 0x9DD7, - 0xFA75: 0x9DD8, - 0xFA76: 0x9DD9, - 0xFA77: 0x9DDA, - 0xFA78: 0x9DDB, - 0xFA79: 0x9DDC, - 0xFA7A: 0x9DDD, - 0xFA7B: 0x9DDE, - 0xFA7C: 0x9DDF, - 0xFA7D: 0x9DE0, - 0xFA7E: 0x9DE1, - 0xFA80: 0x9DE2, - 0xFA81: 0x9DE3, - 0xFA82: 0x9DE4, - 0xFA83: 0x9DE5, - 0xFA84: 0x9DE6, - 0xFA85: 0x9DE7, - 0xFA86: 0x9DE8, - 0xFA87: 0x9DE9, - 0xFA88: 0x9DEA, - 0xFA89: 0x9DEB, - 0xFA8A: 0x9DEC, - 0xFA8B: 0x9DED, - 0xFA8C: 0x9DEE, - 0xFA8D: 0x9DEF, - 0xFA8E: 0x9DF0, - 0xFA8F: 0x9DF1, - 0xFA90: 0x9DF2, - 0xFA91: 0x9DF3, - 0xFA92: 0x9DF4, - 0xFA93: 0x9DF5, - 0xFA94: 0x9DF6, - 0xFA95: 0x9DF7, - 0xFA96: 0x9DF8, - 0xFA97: 0x9DF9, - 0xFA98: 0x9DFA, - 0xFA99: 0x9DFB, - 0xFA9A: 0x9DFC, - 0xFA9B: 0x9DFD, - 0xFA9C: 0x9DFE, - 0xFA9D: 0x9DFF, - 0xFA9E: 0x9E00, - 0xFA9F: 0x9E01, - 0xFAA0: 0x9E02, - 0xFAA1: 0xE2F0, - 0xFAA2: 0xE2F1, - 0xFAA3: 0xE2F2, - 0xFAA4: 0xE2F3, - 0xFAA5: 0xE2F4, - 0xFAA6: 0xE2F5, - 0xFAA7: 0xE2F6, - 0xFAA8: 0xE2F7, - 0xFAA9: 0xE2F8, - 0xFAAA: 0xE2F9, - 0xFAAB: 0xE2FA, - 0xFAAC: 0xE2FB, - 0xFAAD: 0xE2FC, - 0xFAAE: 0xE2FD, - 0xFAAF: 0xE2FE, - 0xFAB0: 0xE2FF, - 0xFAB1: 0xE300, - 0xFAB2: 0xE301, - 0xFAB3: 0xE302, - 0xFAB4: 0xE303, - 0xFAB5: 0xE304, - 0xFAB6: 0xE305, - 0xFAB7: 0xE306, - 0xFAB8: 0xE307, - 0xFAB9: 0xE308, - 0xFABA: 0xE309, - 0xFABB: 0xE30A, - 0xFABC: 0xE30B, - 0xFABD: 0xE30C, - 0xFABE: 0xE30D, - 0xFABF: 0xE30E, - 0xFAC0: 0xE30F, - 0xFAC1: 0xE310, - 0xFAC2: 0xE311, - 0xFAC3: 0xE312, - 0xFAC4: 0xE313, - 0xFAC5: 0xE314, - 0xFAC6: 0xE315, - 0xFAC7: 0xE316, - 0xFAC8: 0xE317, - 0xFAC9: 0xE318, - 0xFACA: 0xE319, - 0xFACB: 0xE31A, - 0xFACC: 0xE31B, - 0xFACD: 0xE31C, - 0xFACE: 0xE31D, - 0xFACF: 0xE31E, - 0xFAD0: 0xE31F, - 0xFAD1: 0xE320, - 0xFAD2: 0xE321, - 0xFAD3: 0xE322, - 0xFAD4: 0xE323, - 0xFAD5: 0xE324, - 0xFAD6: 0xE325, - 0xFAD7: 0xE326, - 0xFAD8: 0xE327, - 0xFAD9: 0xE328, - 0xFADA: 0xE329, - 0xFADB: 0xE32A, - 0xFADC: 0xE32B, - 0xFADD: 0xE32C, - 0xFADE: 0xE32D, - 0xFADF: 0xE32E, - 0xFAE0: 0xE32F, - 0xFAE1: 0xE330, - 0xFAE2: 0xE331, - 0xFAE3: 0xE332, - 0xFAE4: 0xE333, - 0xFAE5: 0xE334, - 0xFAE6: 0xE335, - 0xFAE7: 0xE336, - 0xFAE8: 0xE337, - 0xFAE9: 0xE338, - 0xFAEA: 0xE339, - 0xFAEB: 0xE33A, - 0xFAEC: 0xE33B, - 0xFAED: 0xE33C, - 0xFAEE: 0xE33D, - 0xFAEF: 0xE33E, - 0xFAF0: 0xE33F, - 0xFAF1: 0xE340, - 0xFAF2: 0xE341, - 0xFAF3: 0xE342, - 0xFAF4: 0xE343, - 0xFAF5: 0xE344, - 0xFAF6: 0xE345, - 0xFAF7: 0xE346, - 0xFAF8: 0xE347, - 0xFAF9: 0xE348, - 0xFAFA: 0xE349, - 0xFAFB: 0xE34A, - 0xFAFC: 0xE34B, - 0xFAFD: 0xE34C, - 0xFAFE: 0xE34D, - 0xFB40: 0x9E03, - 0xFB41: 0x9E04, - 0xFB42: 0x9E05, - 0xFB43: 0x9E06, - 0xFB44: 0x9E07, - 0xFB45: 0x9E08, - 0xFB46: 0x9E09, - 0xFB47: 0x9E0A, - 0xFB48: 0x9E0B, - 0xFB49: 0x9E0C, - 0xFB4A: 0x9E0D, - 0xFB4B: 0x9E0E, - 0xFB4C: 0x9E0F, - 0xFB4D: 0x9E10, - 0xFB4E: 0x9E11, - 0xFB4F: 0x9E12, - 0xFB50: 0x9E13, - 0xFB51: 0x9E14, - 0xFB52: 0x9E15, - 0xFB53: 0x9E16, - 0xFB54: 0x9E17, - 0xFB55: 0x9E18, - 0xFB56: 0x9E19, - 0xFB57: 0x9E1A, - 0xFB58: 0x9E1B, - 0xFB59: 0x9E1C, - 0xFB5A: 0x9E1D, - 0xFB5B: 0x9E1E, - 0xFB5C: 0x9E24, - 0xFB5D: 0x9E27, - 0xFB5E: 0x9E2E, - 0xFB5F: 0x9E30, - 0xFB60: 0x9E34, - 0xFB61: 0x9E3B, - 0xFB62: 0x9E3C, - 0xFB63: 0x9E40, - 0xFB64: 0x9E4D, - 0xFB65: 0x9E50, - 0xFB66: 0x9E52, - 0xFB67: 0x9E53, - 0xFB68: 0x9E54, - 0xFB69: 0x9E56, - 0xFB6A: 0x9E59, - 0xFB6B: 0x9E5D, - 0xFB6C: 0x9E5F, - 0xFB6D: 0x9E60, - 0xFB6E: 0x9E61, - 0xFB6F: 0x9E62, - 0xFB70: 0x9E65, - 0xFB71: 0x9E6E, - 0xFB72: 0x9E6F, - 0xFB73: 0x9E72, - 0xFB74: 0x9E74, - 0xFB75: 0x9E75, - 0xFB76: 0x9E76, - 0xFB77: 0x9E77, - 0xFB78: 0x9E78, - 0xFB79: 0x9E79, - 0xFB7A: 0x9E7A, - 0xFB7B: 0x9E7B, - 0xFB7C: 0x9E7C, - 0xFB7D: 0x9E7D, - 0xFB7E: 0x9E80, - 0xFB80: 0x9E81, - 0xFB81: 0x9E83, - 0xFB82: 0x9E84, - 0xFB83: 0x9E85, - 0xFB84: 0x9E86, - 0xFB85: 0x9E89, - 0xFB86: 0x9E8A, - 0xFB87: 0x9E8C, - 0xFB88: 0x9E8D, - 0xFB89: 0x9E8E, - 0xFB8A: 0x9E8F, - 0xFB8B: 0x9E90, - 0xFB8C: 0x9E91, - 0xFB8D: 0x9E94, - 0xFB8E: 0x9E95, - 0xFB8F: 0x9E96, - 0xFB90: 0x9E97, - 0xFB91: 0x9E98, - 0xFB92: 0x9E99, - 0xFB93: 0x9E9A, - 0xFB94: 0x9E9B, - 0xFB95: 0x9E9C, - 0xFB96: 0x9E9E, - 0xFB97: 0x9EA0, - 0xFB98: 0x9EA1, - 0xFB99: 0x9EA2, - 0xFB9A: 0x9EA3, - 0xFB9B: 0x9EA4, - 0xFB9C: 0x9EA5, - 0xFB9D: 0x9EA7, - 0xFB9E: 0x9EA8, - 0xFB9F: 0x9EA9, - 0xFBA0: 0x9EAA, - 0xFBA1: 0xE34E, - 0xFBA2: 0xE34F, - 0xFBA3: 0xE350, - 0xFBA4: 0xE351, - 0xFBA5: 0xE352, - 0xFBA6: 0xE353, - 0xFBA7: 0xE354, - 0xFBA8: 0xE355, - 0xFBA9: 0xE356, - 0xFBAA: 0xE357, - 0xFBAB: 0xE358, - 0xFBAC: 0xE359, - 0xFBAD: 0xE35A, - 0xFBAE: 0xE35B, - 0xFBAF: 0xE35C, - 0xFBB0: 0xE35D, - 0xFBB1: 0xE35E, - 0xFBB2: 0xE35F, - 0xFBB3: 0xE360, - 0xFBB4: 0xE361, - 0xFBB5: 0xE362, - 0xFBB6: 0xE363, - 0xFBB7: 0xE364, - 0xFBB8: 0xE365, - 0xFBB9: 0xE366, - 0xFBBA: 0xE367, - 0xFBBB: 0xE368, - 0xFBBC: 0xE369, - 0xFBBD: 0xE36A, - 0xFBBE: 0xE36B, - 0xFBBF: 0xE36C, - 0xFBC0: 0xE36D, - 0xFBC1: 0xE36E, - 0xFBC2: 0xE36F, - 0xFBC3: 0xE370, - 0xFBC4: 0xE371, - 0xFBC5: 0xE372, - 0xFBC6: 0xE373, - 0xFBC7: 0xE374, - 0xFBC8: 0xE375, - 0xFBC9: 0xE376, - 0xFBCA: 0xE377, - 0xFBCB: 0xE378, - 0xFBCC: 0xE379, - 0xFBCD: 0xE37A, - 0xFBCE: 0xE37B, - 0xFBCF: 0xE37C, - 0xFBD0: 0xE37D, - 0xFBD1: 0xE37E, - 0xFBD2: 0xE37F, - 0xFBD3: 0xE380, - 0xFBD4: 0xE381, - 0xFBD5: 0xE382, - 0xFBD6: 0xE383, - 0xFBD7: 0xE384, - 0xFBD8: 0xE385, - 0xFBD9: 0xE386, - 0xFBDA: 0xE387, - 0xFBDB: 0xE388, - 0xFBDC: 0xE389, - 0xFBDD: 0xE38A, - 0xFBDE: 0xE38B, - 0xFBDF: 0xE38C, - 0xFBE0: 0xE38D, - 0xFBE1: 0xE38E, - 0xFBE2: 0xE38F, - 0xFBE3: 0xE390, - 0xFBE4: 0xE391, - 0xFBE5: 0xE392, - 0xFBE6: 0xE393, - 0xFBE7: 0xE394, - 0xFBE8: 0xE395, - 0xFBE9: 0xE396, - 0xFBEA: 0xE397, - 0xFBEB: 0xE398, - 0xFBEC: 0xE399, - 0xFBED: 0xE39A, - 0xFBEE: 0xE39B, - 0xFBEF: 0xE39C, - 0xFBF0: 0xE39D, - 0xFBF1: 0xE39E, - 0xFBF2: 0xE39F, - 0xFBF3: 0xE3A0, - 0xFBF4: 0xE3A1, - 0xFBF5: 0xE3A2, - 0xFBF6: 0xE3A3, - 0xFBF7: 0xE3A4, - 0xFBF8: 0xE3A5, - 0xFBF9: 0xE3A6, - 0xFBFA: 0xE3A7, - 0xFBFB: 0xE3A8, - 0xFBFC: 0xE3A9, - 0xFBFD: 0xE3AA, - 0xFBFE: 0xE3AB, - 0xFC40: 0x9EAB, - 0xFC41: 0x9EAC, - 0xFC42: 0x9EAD, - 0xFC43: 0x9EAE, - 0xFC44: 0x9EAF, - 0xFC45: 0x9EB0, - 0xFC46: 0x9EB1, - 0xFC47: 0x9EB2, - 0xFC48: 0x9EB3, - 0xFC49: 0x9EB5, - 0xFC4A: 0x9EB6, - 0xFC4B: 0x9EB7, - 0xFC4C: 0x9EB9, - 0xFC4D: 0x9EBA, - 0xFC4E: 0x9EBC, - 0xFC4F: 0x9EBF, - 0xFC50: 0x9EC0, - 0xFC51: 0x9EC1, - 0xFC52: 0x9EC2, - 0xFC53: 0x9EC3, - 0xFC54: 0x9EC5, - 0xFC55: 0x9EC6, - 0xFC56: 0x9EC7, - 0xFC57: 0x9EC8, - 0xFC58: 0x9ECA, - 0xFC59: 0x9ECB, - 0xFC5A: 0x9ECC, - 0xFC5B: 0x9ED0, - 0xFC5C: 0x9ED2, - 0xFC5D: 0x9ED3, - 0xFC5E: 0x9ED5, - 0xFC5F: 0x9ED6, - 0xFC60: 0x9ED7, - 0xFC61: 0x9ED9, - 0xFC62: 0x9EDA, - 0xFC63: 0x9EDE, - 0xFC64: 0x9EE1, - 0xFC65: 0x9EE3, - 0xFC66: 0x9EE4, - 0xFC67: 0x9EE6, - 0xFC68: 0x9EE8, - 0xFC69: 0x9EEB, - 0xFC6A: 0x9EEC, - 0xFC6B: 0x9EED, - 0xFC6C: 0x9EEE, - 0xFC6D: 0x9EF0, - 0xFC6E: 0x9EF1, - 0xFC6F: 0x9EF2, - 0xFC70: 0x9EF3, - 0xFC71: 0x9EF4, - 0xFC72: 0x9EF5, - 0xFC73: 0x9EF6, - 0xFC74: 0x9EF7, - 0xFC75: 0x9EF8, - 0xFC76: 0x9EFA, - 0xFC77: 0x9EFD, - 0xFC78: 0x9EFF, - 0xFC79: 0x9F00, - 0xFC7A: 0x9F01, - 0xFC7B: 0x9F02, - 0xFC7C: 0x9F03, - 0xFC7D: 0x9F04, - 0xFC7E: 0x9F05, - 0xFC80: 0x9F06, - 0xFC81: 0x9F07, - 0xFC82: 0x9F08, - 0xFC83: 0x9F09, - 0xFC84: 0x9F0A, - 0xFC85: 0x9F0C, - 0xFC86: 0x9F0F, - 0xFC87: 0x9F11, - 0xFC88: 0x9F12, - 0xFC89: 0x9F14, - 0xFC8A: 0x9F15, - 0xFC8B: 0x9F16, - 0xFC8C: 0x9F18, - 0xFC8D: 0x9F1A, - 0xFC8E: 0x9F1B, - 0xFC8F: 0x9F1C, - 0xFC90: 0x9F1D, - 0xFC91: 0x9F1E, - 0xFC92: 0x9F1F, - 0xFC93: 0x9F21, - 0xFC94: 0x9F23, - 0xFC95: 0x9F24, - 0xFC96: 0x9F25, - 0xFC97: 0x9F26, - 0xFC98: 0x9F27, - 0xFC99: 0x9F28, - 0xFC9A: 0x9F29, - 0xFC9B: 0x9F2A, - 0xFC9C: 0x9F2B, - 0xFC9D: 0x9F2D, - 0xFC9E: 0x9F2E, - 0xFC9F: 0x9F30, - 0xFCA0: 0x9F31, - 0xFCA1: 0xE3AC, - 0xFCA2: 0xE3AD, - 0xFCA3: 0xE3AE, - 0xFCA4: 0xE3AF, - 0xFCA5: 0xE3B0, - 0xFCA6: 0xE3B1, - 0xFCA7: 0xE3B2, - 0xFCA8: 0xE3B3, - 0xFCA9: 0xE3B4, - 0xFCAA: 0xE3B5, - 0xFCAB: 0xE3B6, - 0xFCAC: 0xE3B7, - 0xFCAD: 0xE3B8, - 0xFCAE: 0xE3B9, - 0xFCAF: 0xE3BA, - 0xFCB0: 0xE3BB, - 0xFCB1: 0xE3BC, - 0xFCB2: 0xE3BD, - 0xFCB3: 0xE3BE, - 0xFCB4: 0xE3BF, - 0xFCB5: 0xE3C0, - 0xFCB6: 0xE3C1, - 0xFCB7: 0xE3C2, - 0xFCB8: 0xE3C3, - 0xFCB9: 0xE3C4, - 0xFCBA: 0xE3C5, - 0xFCBB: 0xE3C6, - 0xFCBC: 0xE3C7, - 0xFCBD: 0xE3C8, - 0xFCBE: 0xE3C9, - 0xFCBF: 0xE3CA, - 0xFCC0: 0xE3CB, - 0xFCC1: 0xE3CC, - 0xFCC2: 0xE3CD, - 0xFCC3: 0xE3CE, - 0xFCC4: 0xE3CF, - 0xFCC5: 0xE3D0, - 0xFCC6: 0xE3D1, - 0xFCC7: 0xE3D2, - 0xFCC8: 0xE3D3, - 0xFCC9: 0xE3D4, - 0xFCCA: 0xE3D5, - 0xFCCB: 0xE3D6, - 0xFCCC: 0xE3D7, - 0xFCCD: 0xE3D8, - 0xFCCE: 0xE3D9, - 0xFCCF: 0xE3DA, - 0xFCD0: 0xE3DB, - 0xFCD1: 0xE3DC, - 0xFCD2: 0xE3DD, - 0xFCD3: 0xE3DE, - 0xFCD4: 0xE3DF, - 0xFCD5: 0xE3E0, - 0xFCD6: 0xE3E1, - 0xFCD7: 0xE3E2, - 0xFCD8: 0xE3E3, - 0xFCD9: 0xE3E4, - 0xFCDA: 0xE3E5, - 0xFCDB: 0xE3E6, - 0xFCDC: 0xE3E7, - 0xFCDD: 0xE3E8, - 0xFCDE: 0xE3E9, - 0xFCDF: 0xE3EA, - 0xFCE0: 0xE3EB, - 0xFCE1: 0xE3EC, - 0xFCE2: 0xE3ED, - 0xFCE3: 0xE3EE, - 0xFCE4: 0xE3EF, - 0xFCE5: 0xE3F0, - 0xFCE6: 0xE3F1, - 0xFCE7: 0xE3F2, - 0xFCE8: 0xE3F3, - 0xFCE9: 0xE3F4, - 0xFCEA: 0xE3F5, - 0xFCEB: 0xE3F6, - 0xFCEC: 0xE3F7, - 0xFCED: 0xE3F8, - 0xFCEE: 0xE3F9, - 0xFCEF: 0xE3FA, - 0xFCF0: 0xE3FB, - 0xFCF1: 0xE3FC, - 0xFCF2: 0xE3FD, - 0xFCF3: 0xE3FE, - 0xFCF4: 0xE3FF, - 0xFCF5: 0xE400, - 0xFCF6: 0xE401, - 0xFCF7: 0xE402, - 0xFCF8: 0xE403, - 0xFCF9: 0xE404, - 0xFCFA: 0xE405, - 0xFCFB: 0xE406, - 0xFCFC: 0xE407, - 0xFCFD: 0xE408, - 0xFCFE: 0xE409, - 0xFD40: 0x9F32, - 0xFD41: 0x9F33, - 0xFD42: 0x9F34, - 0xFD43: 0x9F35, - 0xFD44: 0x9F36, - 0xFD45: 0x9F38, - 0xFD46: 0x9F3A, - 0xFD47: 0x9F3C, - 0xFD48: 0x9F3F, - 0xFD49: 0x9F40, - 0xFD4A: 0x9F41, - 0xFD4B: 0x9F42, - 0xFD4C: 0x9F43, - 0xFD4D: 0x9F45, - 0xFD4E: 0x9F46, - 0xFD4F: 0x9F47, - 0xFD50: 0x9F48, - 0xFD51: 0x9F49, - 0xFD52: 0x9F4A, - 0xFD53: 0x9F4B, - 0xFD54: 0x9F4C, - 0xFD55: 0x9F4D, - 0xFD56: 0x9F4E, - 0xFD57: 0x9F4F, - 0xFD58: 0x9F52, - 0xFD59: 0x9F53, - 0xFD5A: 0x9F54, - 0xFD5B: 0x9F55, - 0xFD5C: 0x9F56, - 0xFD5D: 0x9F57, - 0xFD5E: 0x9F58, - 0xFD5F: 0x9F59, - 0xFD60: 0x9F5A, - 0xFD61: 0x9F5B, - 0xFD62: 0x9F5C, - 0xFD63: 0x9F5D, - 0xFD64: 0x9F5E, - 0xFD65: 0x9F5F, - 0xFD66: 0x9F60, - 0xFD67: 0x9F61, - 0xFD68: 0x9F62, - 0xFD69: 0x9F63, - 0xFD6A: 0x9F64, - 0xFD6B: 0x9F65, - 0xFD6C: 0x9F66, - 0xFD6D: 0x9F67, - 0xFD6E: 0x9F68, - 0xFD6F: 0x9F69, - 0xFD70: 0x9F6A, - 0xFD71: 0x9F6B, - 0xFD72: 0x9F6C, - 0xFD73: 0x9F6D, - 0xFD74: 0x9F6E, - 0xFD75: 0x9F6F, - 0xFD76: 0x9F70, - 0xFD77: 0x9F71, - 0xFD78: 0x9F72, - 0xFD79: 0x9F73, - 0xFD7A: 0x9F74, - 0xFD7B: 0x9F75, - 0xFD7C: 0x9F76, - 0xFD7D: 0x9F77, - 0xFD7E: 0x9F78, - 0xFD80: 0x9F79, - 0xFD81: 0x9F7A, - 0xFD82: 0x9F7B, - 0xFD83: 0x9F7C, - 0xFD84: 0x9F7D, - 0xFD85: 0x9F7E, - 0xFD86: 0x9F81, - 0xFD87: 0x9F82, - 0xFD88: 0x9F8D, - 0xFD89: 0x9F8E, - 0xFD8A: 0x9F8F, - 0xFD8B: 0x9F90, - 0xFD8C: 0x9F91, - 0xFD8D: 0x9F92, - 0xFD8E: 0x9F93, - 0xFD8F: 0x9F94, - 0xFD90: 0x9F95, - 0xFD91: 0x9F96, - 0xFD92: 0x9F97, - 0xFD93: 0x9F98, - 0xFD94: 0x9F9C, - 0xFD95: 0x9F9D, - 0xFD96: 0x9F9E, - 0xFD97: 0x9FA1, - 0xFD98: 0x9FA2, - 0xFD99: 0x9FA3, - 0xFD9A: 0x9FA4, - 0xFD9B: 0x9FA5, - 0xFD9C: 0xF92C, - 0xFD9D: 0xF979, - 0xFD9E: 0xF995, - 0xFD9F: 0xF9E7, - 0xFDA0: 0xF9F1, - 0xFDA1: 0xE40A, - 0xFDA2: 0xE40B, - 0xFDA3: 0xE40C, - 0xFDA4: 0xE40D, - 0xFDA5: 0xE40E, - 0xFDA6: 0xE40F, - 0xFDA7: 0xE410, - 0xFDA8: 0xE411, - 0xFDA9: 0xE412, - 0xFDAA: 0xE413, - 0xFDAB: 0xE414, - 0xFDAC: 0xE415, - 0xFDAD: 0xE416, - 0xFDAE: 0xE417, - 0xFDAF: 0xE418, - 0xFDB0: 0xE419, - 0xFDB1: 0xE41A, - 0xFDB2: 0xE41B, - 0xFDB3: 0xE41C, - 0xFDB4: 0xE41D, - 0xFDB5: 0xE41E, - 0xFDB6: 0xE41F, - 0xFDB7: 0xE420, - 0xFDB8: 0xE421, - 0xFDB9: 0xE422, - 0xFDBA: 0xE423, - 0xFDBB: 0xE424, - 0xFDBC: 0xE425, - 0xFDBD: 0xE426, - 0xFDBE: 0xE427, - 0xFDBF: 0xE428, - 0xFDC0: 0xE429, - 0xFDC1: 0xE42A, - 0xFDC2: 0xE42B, - 0xFDC3: 0xE42C, - 0xFDC4: 0xE42D, - 0xFDC5: 0xE42E, - 0xFDC6: 0xE42F, - 0xFDC7: 0xE430, - 0xFDC8: 0xE431, - 0xFDC9: 0xE432, - 0xFDCA: 0xE433, - 0xFDCB: 0xE434, - 0xFDCC: 0xE435, - 0xFDCD: 0xE436, - 0xFDCE: 0xE437, - 0xFDCF: 0xE438, - 0xFDD0: 0xE439, - 0xFDD1: 0xE43A, - 0xFDD2: 0xE43B, - 0xFDD3: 0xE43C, - 0xFDD4: 0xE43D, - 0xFDD5: 0xE43E, - 0xFDD6: 0xE43F, - 0xFDD7: 0xE440, - 0xFDD8: 0xE441, - 0xFDD9: 0xE442, - 0xFDDA: 0xE443, - 0xFDDB: 0xE444, - 0xFDDC: 0xE445, - 0xFDDD: 0xE446, - 0xFDDE: 0xE447, - 0xFDDF: 0xE448, - 0xFDE0: 0xE449, - 0xFDE1: 0xE44A, - 0xFDE2: 0xE44B, - 0xFDE3: 0xE44C, - 0xFDE4: 0xE44D, - 0xFDE5: 0xE44E, - 0xFDE6: 0xE44F, - 0xFDE7: 0xE450, - 0xFDE8: 0xE451, - 0xFDE9: 0xE452, - 0xFDEA: 0xE453, - 0xFDEB: 0xE454, - 0xFDEC: 0xE455, - 0xFDED: 0xE456, - 0xFDEE: 0xE457, - 0xFDEF: 0xE458, - 0xFDF0: 0xE459, - 0xFDF1: 0xE45A, - 0xFDF2: 0xE45B, - 0xFDF3: 0xE45C, - 0xFDF4: 0xE45D, - 0xFDF5: 0xE45E, - 0xFDF6: 0xE45F, - 0xFDF7: 0xE460, - 0xFDF8: 0xE461, - 0xFDF9: 0xE462, - 0xFDFA: 0xE463, - 0xFDFB: 0xE464, - 0xFDFC: 0xE465, - 0xFDFD: 0xE466, - 0xFDFE: 0xE467, - 0xFE40: 0xFA0C, - 0xFE41: 0xFA0D, - 0xFE42: 0xFA0E, - 0xFE43: 0xFA0F, - 0xFE44: 0xFA11, - 0xFE45: 0xFA13, - 0xFE46: 0xFA14, - 0xFE47: 0xFA18, - 0xFE48: 0xFA1F, - 0xFE49: 0xFA20, - 0xFE4A: 0xFA21, - 0xFE4B: 0xFA23, - 0xFE4C: 0xFA24, - 0xFE4D: 0xFA27, - 0xFE4E: 0xFA28, - 0xFE4F: 0xFA29, - 0xFE50: 0x2E81, - 0xFE54: 0x2E84, - 0xFE55: 0x3473, - 0xFE56: 0x3447, - 0xFE57: 0x2E88, - 0xFE58: 0x2E8B, - 0xFE59: 0x9FB4, - 0xFE5A: 0x359E, - 0xFE5B: 0x361A, - 0xFE5C: 0x360E, - 0xFE5D: 0x2E8C, - 0xFE5E: 0x2E97, - 0xFE5F: 0x396E, - 0xFE60: 0x3918, - 0xFE61: 0x9FB5, - 0xFE62: 0x39CF, - 0xFE63: 0x39DF, - 0xFE64: 0x3A73, - 0xFE65: 0x39D0, - 0xFE66: 0x9FB6, - 0xFE67: 0x9FB7, - 0xFE68: 0x3B4E, - 0xFE69: 0x3C6E, - 0xFE6A: 0x3CE0, - 0xFE6B: 0x2EA7, - 0xFE6D: 0x9FB8, - 0xFE6E: 0x2EAA, - 0xFE6F: 0x4056, - 0xFE70: 0x415F, - 0xFE71: 0x2EAE, - 0xFE72: 0x4337, - 0xFE73: 0x2EB3, - 0xFE74: 0x2EB6, - 0xFE75: 0x2EB7, - 0xFE77: 0x43B1, - 0xFE78: 0x43AC, - 0xFE79: 0x2EBB, - 0xFE7A: 0x43DD, - 0xFE7B: 0x44D6, - 0xFE7C: 0x4661, - 0xFE7D: 0x464C, - 0xFE7E: 0x9FB9, - 0xFE80: 0x4723, - 0xFE81: 0x4729, - 0xFE82: 0x477C, - 0xFE83: 0x478D, - 0xFE84: 0x2ECA, - 0xFE85: 0x4947, - 0xFE86: 0x497A, - 0xFE87: 0x497D, - 0xFE88: 0x4982, - 0xFE89: 0x4983, - 0xFE8A: 0x4985, - 0xFE8B: 0x4986, - 0xFE8C: 0x499F, - 0xFE8D: 0x499B, - 0xFE8E: 0x49B7, - 0xFE8F: 0x49B6, - 0xFE90: 0x9FBA, - 0xFE92: 0x4CA3, - 0xFE93: 0x4C9F, - 0xFE94: 0x4CA0, - 0xFE95: 0x4CA1, - 0xFE96: 0x4C77, - 0xFE97: 0x4CA2, - 0xFE98: 0x4D13, - 0xFE99: 0x4D14, - 0xFE9A: 0x4D15, - 0xFE9B: 0x4D16, - 0xFE9C: 0x4D17, - 0xFE9D: 0x4D18, - 0xFE9E: 0x4D19, - 0xFE9F: 0x4DAE, - 0xFEA0: 0x9FBB, - 0xFEA1: 0xE468, - 0xFEA2: 0xE469, - 0xFEA3: 0xE46A, - 0xFEA4: 0xE46B, - 0xFEA5: 0xE46C, - 0xFEA6: 0xE46D, - 0xFEA7: 0xE46E, - 0xFEA8: 0xE46F, - 0xFEA9: 0xE470, - 0xFEAA: 0xE471, - 0xFEAB: 0xE472, - 0xFEAC: 0xE473, - 0xFEAD: 0xE474, - 0xFEAE: 0xE475, - 0xFEAF: 0xE476, - 0xFEB0: 0xE477, - 0xFEB1: 0xE478, - 0xFEB2: 0xE479, - 0xFEB3: 0xE47A, - 0xFEB4: 0xE47B, - 0xFEB5: 0xE47C, - 0xFEB6: 0xE47D, - 0xFEB7: 0xE47E, - 0xFEB8: 0xE47F, - 0xFEB9: 0xE480, - 0xFEBA: 0xE481, - 0xFEBB: 0xE482, - 0xFEBC: 0xE483, - 0xFEBD: 0xE484, - 0xFEBE: 0xE485, - 0xFEBF: 0xE486, - 0xFEC0: 0xE487, - 0xFEC1: 0xE488, - 0xFEC2: 0xE489, - 0xFEC3: 0xE48A, - 0xFEC4: 0xE48B, - 0xFEC5: 0xE48C, - 0xFEC6: 0xE48D, - 0xFEC7: 0xE48E, - 0xFEC8: 0xE48F, - 0xFEC9: 0xE490, - 0xFECA: 0xE491, - 0xFECB: 0xE492, - 0xFECC: 0xE493, - 0xFECD: 0xE494, - 0xFECE: 0xE495, - 0xFECF: 0xE496, - 0xFED0: 0xE497, - 0xFED1: 0xE498, - 0xFED2: 0xE499, - 0xFED3: 0xE49A, - 0xFED4: 0xE49B, - 0xFED5: 0xE49C, - 0xFED6: 0xE49D, - 0xFED7: 0xE49E, - 0xFED8: 0xE49F, - 0xFED9: 0xE4A0, - 0xFEDA: 0xE4A1, - 0xFEDB: 0xE4A2, - 0xFEDC: 0xE4A3, - 0xFEDD: 0xE4A4, - 0xFEDE: 0xE4A5, - 0xFEDF: 0xE4A6, - 0xFEE0: 0xE4A7, - 0xFEE1: 0xE4A8, - 0xFEE2: 0xE4A9, - 0xFEE3: 0xE4AA, - 0xFEE4: 0xE4AB, - 0xFEE5: 0xE4AC, - 0xFEE6: 0xE4AD, - 0xFEE7: 0xE4AE, - 0xFEE8: 0xE4AF, - 0xFEE9: 0xE4B0, - 0xFEEA: 0xE4B1, - 0xFEEB: 0xE4B2, - 0xFEEC: 0xE4B3, - 0xFEED: 0xE4B4, - 0xFEEE: 0xE4B5, - 0xFEEF: 0xE4B6, - 0xFEF0: 0xE4B7, - 0xFEF1: 0xE4B8, - 0xFEF2: 0xE4B9, - 0xFEF3: 0xE4BA, - 0xFEF4: 0xE4BB, - 0xFEF5: 0xE4BC, - 0xFEF6: 0xE4BD, - 0xFEF7: 0xE4BE, - 0xFEF8: 0xE4BF, - 0xFEF9: 0xE4C0, - 0xFEFA: 0xE4C1, - 0xFEFB: 0xE4C2, - 0xFEFC: 0xE4C3, - 0xFEFD: 0xE4C4, - 0xFEFE: 0xE4C5, -} diff --git a/vendor/github.com/Tang-RoseChild/mahonia/gbk.go b/vendor/github.com/Tang-RoseChild/mahonia/gbk.go deleted file mode 100644 index ffb13b286..000000000 --- a/vendor/github.com/Tang-RoseChild/mahonia/gbk.go +++ /dev/null @@ -1,78 +0,0 @@ -package mahonia - -// Converters for GBK encoding. - -func init() { - RegisterCharset(&Charset{ - Name: "GBK", - Aliases: []string{"GB2312"}, // GBK is a superset of GB2312. - NewDecoder: func() Decoder { - return decodeGBKRune - }, - NewEncoder: func() Encoder { - return encodeGBKRune - }, - }) -} - -func decodeGBKRune(p []byte) (r rune, size int, status Status) { - if len(p) == 0 { - status = NO_ROOM - return - } - - b := p[0] - if b < 128 { - return rune(b), 1, SUCCESS - } - - if len(p) < 2 { - status = NO_ROOM - return - } - - c := uint16(p[0])<<8 + uint16(p[1]) - r = rune(gbkToUnicode[c]) - if r == 0 { - r = gbkToUnicodeExtra[c] - } - - if r != 0 { - return r, 2, SUCCESS - } - - return 0xfffd, 1, INVALID_CHAR -} - -func encodeGBKRune(p []byte, r rune) (size int, status Status) { - if len(p) == 0 { - status = NO_ROOM - return - } - - if r < 128 { - p[0] = byte(r) - return 1, SUCCESS - } - - if len(p) < 2 { - status = NO_ROOM - return - } - - var c uint16 - if r < 0x10000 { - c = unicodeToGBK[r] - } else { - c = unicodeToGBKExtra[r] - } - - if c != 0 { - p[0] = byte(c >> 8) - p[1] = byte(c) - return 2, SUCCESS - } - - p[0] = 0x1a - return 1, INVALID_CHAR -} diff --git a/vendor/github.com/Tang-RoseChild/mahonia/iso2022jp.go b/vendor/github.com/Tang-RoseChild/mahonia/iso2022jp.go deleted file mode 100644 index c8de6fc8f..000000000 --- a/vendor/github.com/Tang-RoseChild/mahonia/iso2022jp.go +++ /dev/null @@ -1,124 +0,0 @@ -package mahonia - -import ( - "unicode/utf8" -) - -// converters for ISO-2022-JP encoding - -const esc = 27 - -func init() { - type jpEncoding int - const ( - ascii jpEncoding = iota - jisX0201Roman - jisX0208 - ) - - RegisterCharset(&Charset{ - Name: "ISO-2022-JP", - NewDecoder: func() Decoder { - encoding := ascii - return func(p []byte) (c rune, size int, status Status) { - if len(p) == 0 { - return 0, 0, NO_ROOM - } - - b := p[0] - if b == esc { - if len(p) < 3 { - return 0, 0, NO_ROOM - } - switch p[1] { - case '(': - switch p[2] { - case 'B': - encoding = ascii - return 0, 3, STATE_ONLY - - case 'J': - encoding = jisX0201Roman - return 0, 3, STATE_ONLY - } - - case '$': - switch p[2] { - case '@', 'B': - encoding = jisX0208 - return 0, 3, STATE_ONLY - } - } - } - - switch encoding { - case ascii: - if b > 127 { - return utf8.RuneError, 1, INVALID_CHAR - } - return rune(b), 1, SUCCESS - - case jisX0201Roman: - if b > 127 { - return utf8.RuneError, 1, INVALID_CHAR - } - switch b { - case '\\': - return 0xA5, 1, SUCCESS - case '~': - return 0x203E, 1, SUCCESS - } - return rune(b), 1, SUCCESS - - case jisX0208: - return jis0208Table.DecodeLow(p) - } - panic("unreachable") - } - }, - NewEncoder: func() Encoder { - jis0208Table.Reverse() - encoding := ascii - return func(p []byte, c rune) (size int, status Status) { - if len(p) == 0 { - return 0, NO_ROOM - } - - if c < 128 { - if encoding != ascii { - if len(p) < 4 { - return 0, NO_ROOM - } - p[0], p[1], p[2] = esc, '(', 'B' - p[3] = byte(c) - encoding = ascii - return 4, SUCCESS - } - p[0] = byte(c) - return 1, SUCCESS - } - - if c > 65535 { - return 0, INVALID_CHAR - } - jis := jis0208Table.FromUnicode[c] - if jis == [2]byte{0, 0} && c != rune(jis0208Table.Data[0][0]) { - return 0, INVALID_CHAR - } - - if encoding != jisX0208 { - if len(p) < 3 { - return 0, NO_ROOM - } - p[0], p[1], p[2] = esc, '$', 'B' - encoding = jisX0208 - return 3, STATE_ONLY - } - - p[0] = jis[0] + 0x21 - p[1] = jis[1] + 0x21 - return 2, SUCCESS - } - }, - }) -} diff --git a/vendor/github.com/Tang-RoseChild/mahonia/jis0201-data.go b/vendor/github.com/Tang-RoseChild/mahonia/jis0201-data.go deleted file mode 100644 index e46a3adf5..000000000 --- a/vendor/github.com/Tang-RoseChild/mahonia/jis0201-data.go +++ /dev/null @@ -1,162 +0,0 @@ -package mahonia - -var jis0201ToUnicode = [256]uint16{ - 0x20: 0x0020, // SPACE - 0x21: 0x0021, // EXCLAMATION MARK - 0x22: 0x0022, // QUOTATION MARK - 0x23: 0x0023, // NUMBER SIGN - 0x24: 0x0024, // DOLLAR SIGN - 0x25: 0x0025, // PERCENT SIGN - 0x26: 0x0026, // AMPERSAND - 0x27: 0x0027, // APOSTROPHE - 0x28: 0x0028, // LEFT PARENTHESIS - 0x29: 0x0029, // RIGHT PARENTHESIS - 0x2A: 0x002A, // ASTERISK - 0x2B: 0x002B, // PLUS SIGN - 0x2C: 0x002C, // COMMA - 0x2D: 0x002D, // HYPHEN-MINUS - 0x2E: 0x002E, // FULL STOP - 0x2F: 0x002F, // SOLIDUS - 0x30: 0x0030, // DIGIT ZERO - 0x31: 0x0031, // DIGIT ONE - 0x32: 0x0032, // DIGIT TWO - 0x33: 0x0033, // DIGIT THREE - 0x34: 0x0034, // DIGIT FOUR - 0x35: 0x0035, // DIGIT FIVE - 0x36: 0x0036, // DIGIT SIX - 0x37: 0x0037, // DIGIT SEVEN - 0x38: 0x0038, // DIGIT EIGHT - 0x39: 0x0039, // DIGIT NINE - 0x3A: 0x003A, // COLON - 0x3B: 0x003B, // SEMICOLON - 0x3C: 0x003C, // LESS-THAN SIGN - 0x3D: 0x003D, // EQUALS SIGN - 0x3E: 0x003E, // GREATER-THAN SIGN - 0x3F: 0x003F, // QUESTION MARK - 0x40: 0x0040, // COMMERCIAL AT - 0x41: 0x0041, // LATIN CAPITAL LETTER A - 0x42: 0x0042, // LATIN CAPITAL LETTER B - 0x43: 0x0043, // LATIN CAPITAL LETTER C - 0x44: 0x0044, // LATIN CAPITAL LETTER D - 0x45: 0x0045, // LATIN CAPITAL LETTER E - 0x46: 0x0046, // LATIN CAPITAL LETTER F - 0x47: 0x0047, // LATIN CAPITAL LETTER G - 0x48: 0x0048, // LATIN CAPITAL LETTER H - 0x49: 0x0049, // LATIN CAPITAL LETTER I - 0x4A: 0x004A, // LATIN CAPITAL LETTER J - 0x4B: 0x004B, // LATIN CAPITAL LETTER K - 0x4C: 0x004C, // LATIN CAPITAL LETTER L - 0x4D: 0x004D, // LATIN CAPITAL LETTER M - 0x4E: 0x004E, // LATIN CAPITAL LETTER N - 0x4F: 0x004F, // LATIN CAPITAL LETTER O - 0x50: 0x0050, // LATIN CAPITAL LETTER P - 0x51: 0x0051, // LATIN CAPITAL LETTER Q - 0x52: 0x0052, // LATIN CAPITAL LETTER R - 0x53: 0x0053, // LATIN CAPITAL LETTER S - 0x54: 0x0054, // LATIN CAPITAL LETTER T - 0x55: 0x0055, // LATIN CAPITAL LETTER U - 0x56: 0x0056, // LATIN CAPITAL LETTER V - 0x57: 0x0057, // LATIN CAPITAL LETTER W - 0x58: 0x0058, // LATIN CAPITAL LETTER X - 0x59: 0x0059, // LATIN CAPITAL LETTER Y - 0x5A: 0x005A, // LATIN CAPITAL LETTER Z - 0x5B: 0x005B, // LEFT SQUARE BRACKET - 0x5C: 0x00A5, // YEN SIGN - 0x5D: 0x005D, // RIGHT SQUARE BRACKET - 0x5E: 0x005E, // CIRCUMFLEX ACCENT - 0x5F: 0x005F, // LOW LINE - 0x60: 0x0060, // GRAVE ACCENT - 0x61: 0x0061, // LATIN SMALL LETTER A - 0x62: 0x0062, // LATIN SMALL LETTER B - 0x63: 0x0063, // LATIN SMALL LETTER C - 0x64: 0x0064, // LATIN SMALL LETTER D - 0x65: 0x0065, // LATIN SMALL LETTER E - 0x66: 0x0066, // LATIN SMALL LETTER F - 0x67: 0x0067, // LATIN SMALL LETTER G - 0x68: 0x0068, // LATIN SMALL LETTER H - 0x69: 0x0069, // LATIN SMALL LETTER I - 0x6A: 0x006A, // LATIN SMALL LETTER J - 0x6B: 0x006B, // LATIN SMALL LETTER K - 0x6C: 0x006C, // LATIN SMALL LETTER L - 0x6D: 0x006D, // LATIN SMALL LETTER M - 0x6E: 0x006E, // LATIN SMALL LETTER N - 0x6F: 0x006F, // LATIN SMALL LETTER O - 0x70: 0x0070, // LATIN SMALL LETTER P - 0x71: 0x0071, // LATIN SMALL LETTER Q - 0x72: 0x0072, // LATIN SMALL LETTER R - 0x73: 0x0073, // LATIN SMALL LETTER S - 0x74: 0x0074, // LATIN SMALL LETTER T - 0x75: 0x0075, // LATIN SMALL LETTER U - 0x76: 0x0076, // LATIN SMALL LETTER V - 0x77: 0x0077, // LATIN SMALL LETTER W - 0x78: 0x0078, // LATIN SMALL LETTER X - 0x79: 0x0079, // LATIN SMALL LETTER Y - 0x7A: 0x007A, // LATIN SMALL LETTER Z - 0x7B: 0x007B, // LEFT CURLY BRACKET - 0x7C: 0x007C, // VERTICAL LINE - 0x7D: 0x007D, // RIGHT CURLY BRACKET - 0x7E: 0x203E, // OVERLINE - 0xA1: 0xFF61, // HALFWIDTH IDEOGRAPHIC FULL STOP - 0xA2: 0xFF62, // HALFWIDTH LEFT CORNER BRACKET - 0xA3: 0xFF63, // HALFWIDTH RIGHT CORNER BRACKET - 0xA4: 0xFF64, // HALFWIDTH IDEOGRAPHIC COMMA - 0xA5: 0xFF65, // HALFWIDTH KATAKANA MIDDLE DOT - 0xA6: 0xFF66, // HALFWIDTH KATAKANA LETTER WO - 0xA7: 0xFF67, // HALFWIDTH KATAKANA LETTER SMALL A - 0xA8: 0xFF68, // HALFWIDTH KATAKANA LETTER SMALL I - 0xA9: 0xFF69, // HALFWIDTH KATAKANA LETTER SMALL U - 0xAA: 0xFF6A, // HALFWIDTH KATAKANA LETTER SMALL E - 0xAB: 0xFF6B, // HALFWIDTH KATAKANA LETTER SMALL O - 0xAC: 0xFF6C, // HALFWIDTH KATAKANA LETTER SMALL YA - 0xAD: 0xFF6D, // HALFWIDTH KATAKANA LETTER SMALL YU - 0xAE: 0xFF6E, // HALFWIDTH KATAKANA LETTER SMALL YO - 0xAF: 0xFF6F, // HALFWIDTH KATAKANA LETTER SMALL TU - 0xB0: 0xFF70, // HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK - 0xB1: 0xFF71, // HALFWIDTH KATAKANA LETTER A - 0xB2: 0xFF72, // HALFWIDTH KATAKANA LETTER I - 0xB3: 0xFF73, // HALFWIDTH KATAKANA LETTER U - 0xB4: 0xFF74, // HALFWIDTH KATAKANA LETTER E - 0xB5: 0xFF75, // HALFWIDTH KATAKANA LETTER O - 0xB6: 0xFF76, // HALFWIDTH KATAKANA LETTER KA - 0xB7: 0xFF77, // HALFWIDTH KATAKANA LETTER KI - 0xB8: 0xFF78, // HALFWIDTH KATAKANA LETTER KU - 0xB9: 0xFF79, // HALFWIDTH KATAKANA LETTER KE - 0xBA: 0xFF7A, // HALFWIDTH KATAKANA LETTER KO - 0xBB: 0xFF7B, // HALFWIDTH KATAKANA LETTER SA - 0xBC: 0xFF7C, // HALFWIDTH KATAKANA LETTER SI - 0xBD: 0xFF7D, // HALFWIDTH KATAKANA LETTER SU - 0xBE: 0xFF7E, // HALFWIDTH KATAKANA LETTER SE - 0xBF: 0xFF7F, // HALFWIDTH KATAKANA LETTER SO - 0xC0: 0xFF80, // HALFWIDTH KATAKANA LETTER TA - 0xC1: 0xFF81, // HALFWIDTH KATAKANA LETTER TI - 0xC2: 0xFF82, // HALFWIDTH KATAKANA LETTER TU - 0xC3: 0xFF83, // HALFWIDTH KATAKANA LETTER TE - 0xC4: 0xFF84, // HALFWIDTH KATAKANA LETTER TO - 0xC5: 0xFF85, // HALFWIDTH KATAKANA LETTER NA - 0xC6: 0xFF86, // HALFWIDTH KATAKANA LETTER NI - 0xC7: 0xFF87, // HALFWIDTH KATAKANA LETTER NU - 0xC8: 0xFF88, // HALFWIDTH KATAKANA LETTER NE - 0xC9: 0xFF89, // HALFWIDTH KATAKANA LETTER NO - 0xCA: 0xFF8A, // HALFWIDTH KATAKANA LETTER HA - 0xCB: 0xFF8B, // HALFWIDTH KATAKANA LETTER HI - 0xCC: 0xFF8C, // HALFWIDTH KATAKANA LETTER HU - 0xCD: 0xFF8D, // HALFWIDTH KATAKANA LETTER HE - 0xCE: 0xFF8E, // HALFWIDTH KATAKANA LETTER HO - 0xCF: 0xFF8F, // HALFWIDTH KATAKANA LETTER MA - 0xD0: 0xFF90, // HALFWIDTH KATAKANA LETTER MI - 0xD1: 0xFF91, // HALFWIDTH KATAKANA LETTER MU - 0xD2: 0xFF92, // HALFWIDTH KATAKANA LETTER ME - 0xD3: 0xFF93, // HALFWIDTH KATAKANA LETTER MO - 0xD4: 0xFF94, // HALFWIDTH KATAKANA LETTER YA - 0xD5: 0xFF95, // HALFWIDTH KATAKANA LETTER YU - 0xD6: 0xFF96, // HALFWIDTH KATAKANA LETTER YO - 0xD7: 0xFF97, // HALFWIDTH KATAKANA LETTER RA - 0xD8: 0xFF98, // HALFWIDTH KATAKANA LETTER RI - 0xD9: 0xFF99, // HALFWIDTH KATAKANA LETTER RU - 0xDA: 0xFF9A, // HALFWIDTH KATAKANA LETTER RE - 0xDB: 0xFF9B, // HALFWIDTH KATAKANA LETTER RO - 0xDC: 0xFF9C, // HALFWIDTH KATAKANA LETTER WA - 0xDD: 0xFF9D, // HALFWIDTH KATAKANA LETTER N - 0xDE: 0xFF9E, // HALFWIDTH KATAKANA VOICED SOUND MARK - 0xDF: 0xFF9F, // HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK -} diff --git a/vendor/github.com/Tang-RoseChild/mahonia/jis0208-data.go b/vendor/github.com/Tang-RoseChild/mahonia/jis0208-data.go deleted file mode 100644 index 749b50a6c..000000000 --- a/vendor/github.com/Tang-RoseChild/mahonia/jis0208-data.go +++ /dev/null @@ -1,7039 +0,0 @@ -package mahonia - -var jis0208Table = kutenTable{ - Data: [94][94]uint16{ - 0x00: [94]uint16{ - 0x00: 0x3000, - 0x01: 0x3001, - 0x02: 0x3002, - 0x03: 0xff0c, - 0x04: 0xff0e, - 0x05: 0x30fb, - 0x06: 0xff1a, - 0x07: 0xff1b, - 0x08: 0xff1f, - 0x09: 0xff01, - 0x0a: 0x309b, - 0x0b: 0x309c, - 0x0c: 0x00b4, - 0x0d: 0xff40, - 0x0e: 0x00a8, - 0x0f: 0xff3e, - 0x10: 0xffe3, - 0x11: 0xff3f, - 0x12: 0x30fd, - 0x13: 0x30fe, - 0x14: 0x309d, - 0x15: 0x309e, - 0x16: 0x3003, - 0x17: 0x4edd, - 0x18: 0x3005, - 0x19: 0x3006, - 0x1a: 0x3007, - 0x1b: 0x30fc, - 0x1c: 0x2015, - 0x1d: 0x2010, - 0x1e: 0xff0f, - 0x1f: 0x005c, - 0x20: 0x301c, - 0x21: 0x2016, - 0x22: 0xff5c, - 0x23: 0x2026, - 0x24: 0x2025, - 0x25: 0x2018, - 0x26: 0x2019, - 0x27: 0x201c, - 0x28: 0x201d, - 0x29: 0xff08, - 0x2a: 0xff09, - 0x2b: 0x3014, - 0x2c: 0x3015, - 0x2d: 0xff3b, - 0x2e: 0xff3d, - 0x2f: 0xff5b, - 0x30: 0xff5d, - 0x31: 0x3008, - 0x32: 0x3009, - 0x33: 0x300a, - 0x34: 0x300b, - 0x35: 0x300c, - 0x36: 0x300d, - 0x37: 0x300e, - 0x38: 0x300f, - 0x39: 0x3010, - 0x3a: 0x3011, - 0x3b: 0xff0b, - 0x3c: 0x2212, - 0x3d: 0x00b1, - 0x3e: 0x00d7, - 0x3f: 0x00f7, - 0x40: 0xff1d, - 0x41: 0x2260, - 0x42: 0xff1c, - 0x43: 0xff1e, - 0x44: 0x2266, - 0x45: 0x2267, - 0x46: 0x221e, - 0x47: 0x2234, - 0x48: 0x2642, - 0x49: 0x2640, - 0x4a: 0x00b0, - 0x4b: 0x2032, - 0x4c: 0x2033, - 0x4d: 0x2103, - 0x4e: 0xffe5, - 0x4f: 0xff04, - 0x50: 0x00a2, - 0x51: 0x00a3, - 0x52: 0xff05, - 0x53: 0xff03, - 0x54: 0xff06, - 0x55: 0xff0a, - 0x56: 0xff20, - 0x57: 0x00a7, - 0x58: 0x2606, - 0x59: 0x2605, - 0x5a: 0x25cb, - 0x5b: 0x25cf, - 0x5c: 0x25ce, - 0x5d: 0x25c7, - }, - 0x01: [94]uint16{ - 0x00: 0x25c6, - 0x01: 0x25a1, - 0x02: 0x25a0, - 0x03: 0x25b3, - 0x04: 0x25b2, - 0x05: 0x25bd, - 0x06: 0x25bc, - 0x07: 0x203b, - 0x08: 0x3012, - 0x09: 0x2192, - 0x0a: 0x2190, - 0x0b: 0x2191, - 0x0c: 0x2193, - 0x0d: 0x3013, - 0x19: 0x2208, - 0x1a: 0x220b, - 0x1b: 0x2286, - 0x1c: 0x2287, - 0x1d: 0x2282, - 0x1e: 0x2283, - 0x1f: 0x222a, - 0x20: 0x2229, - 0x29: 0x2227, - 0x2a: 0x2228, - 0x2b: 0x00ac, - 0x2c: 0x21d2, - 0x2d: 0x21d4, - 0x2e: 0x2200, - 0x2f: 0x2203, - 0x3b: 0x2220, - 0x3c: 0x22a5, - 0x3d: 0x2312, - 0x3e: 0x2202, - 0x3f: 0x2207, - 0x40: 0x2261, - 0x41: 0x2252, - 0x42: 0x226a, - 0x43: 0x226b, - 0x44: 0x221a, - 0x45: 0x223d, - 0x46: 0x221d, - 0x47: 0x2235, - 0x48: 0x222b, - 0x49: 0x222c, - 0x51: 0x212b, - 0x52: 0x2030, - 0x53: 0x266f, - 0x54: 0x266d, - 0x55: 0x266a, - 0x56: 0x2020, - 0x57: 0x2021, - 0x58: 0x00b6, - 0x5d: 0x25ef, - }, - 0x02: [94]uint16{ - 0x0f: 0xff10, - 0x10: 0xff11, - 0x11: 0xff12, - 0x12: 0xff13, - 0x13: 0xff14, - 0x14: 0xff15, - 0x15: 0xff16, - 0x16: 0xff17, - 0x17: 0xff18, - 0x18: 0xff19, - 0x20: 0xff21, - 0x21: 0xff22, - 0x22: 0xff23, - 0x23: 0xff24, - 0x24: 0xff25, - 0x25: 0xff26, - 0x26: 0xff27, - 0x27: 0xff28, - 0x28: 0xff29, - 0x29: 0xff2a, - 0x2a: 0xff2b, - 0x2b: 0xff2c, - 0x2c: 0xff2d, - 0x2d: 0xff2e, - 0x2e: 0xff2f, - 0x2f: 0xff30, - 0x30: 0xff31, - 0x31: 0xff32, - 0x32: 0xff33, - 0x33: 0xff34, - 0x34: 0xff35, - 0x35: 0xff36, - 0x36: 0xff37, - 0x37: 0xff38, - 0x38: 0xff39, - 0x39: 0xff3a, - 0x40: 0xff41, - 0x41: 0xff42, - 0x42: 0xff43, - 0x43: 0xff44, - 0x44: 0xff45, - 0x45: 0xff46, - 0x46: 0xff47, - 0x47: 0xff48, - 0x48: 0xff49, - 0x49: 0xff4a, - 0x4a: 0xff4b, - 0x4b: 0xff4c, - 0x4c: 0xff4d, - 0x4d: 0xff4e, - 0x4e: 0xff4f, - 0x4f: 0xff50, - 0x50: 0xff51, - 0x51: 0xff52, - 0x52: 0xff53, - 0x53: 0xff54, - 0x54: 0xff55, - 0x55: 0xff56, - 0x56: 0xff57, - 0x57: 0xff58, - 0x58: 0xff59, - 0x59: 0xff5a, - }, - 0x03: [94]uint16{ - 0x00: 0x3041, - 0x01: 0x3042, - 0x02: 0x3043, - 0x03: 0x3044, - 0x04: 0x3045, - 0x05: 0x3046, - 0x06: 0x3047, - 0x07: 0x3048, - 0x08: 0x3049, - 0x09: 0x304a, - 0x0a: 0x304b, - 0x0b: 0x304c, - 0x0c: 0x304d, - 0x0d: 0x304e, - 0x0e: 0x304f, - 0x0f: 0x3050, - 0x10: 0x3051, - 0x11: 0x3052, - 0x12: 0x3053, - 0x13: 0x3054, - 0x14: 0x3055, - 0x15: 0x3056, - 0x16: 0x3057, - 0x17: 0x3058, - 0x18: 0x3059, - 0x19: 0x305a, - 0x1a: 0x305b, - 0x1b: 0x305c, - 0x1c: 0x305d, - 0x1d: 0x305e, - 0x1e: 0x305f, - 0x1f: 0x3060, - 0x20: 0x3061, - 0x21: 0x3062, - 0x22: 0x3063, - 0x23: 0x3064, - 0x24: 0x3065, - 0x25: 0x3066, - 0x26: 0x3067, - 0x27: 0x3068, - 0x28: 0x3069, - 0x29: 0x306a, - 0x2a: 0x306b, - 0x2b: 0x306c, - 0x2c: 0x306d, - 0x2d: 0x306e, - 0x2e: 0x306f, - 0x2f: 0x3070, - 0x30: 0x3071, - 0x31: 0x3072, - 0x32: 0x3073, - 0x33: 0x3074, - 0x34: 0x3075, - 0x35: 0x3076, - 0x36: 0x3077, - 0x37: 0x3078, - 0x38: 0x3079, - 0x39: 0x307a, - 0x3a: 0x307b, - 0x3b: 0x307c, - 0x3c: 0x307d, - 0x3d: 0x307e, - 0x3e: 0x307f, - 0x3f: 0x3080, - 0x40: 0x3081, - 0x41: 0x3082, - 0x42: 0x3083, - 0x43: 0x3084, - 0x44: 0x3085, - 0x45: 0x3086, - 0x46: 0x3087, - 0x47: 0x3088, - 0x48: 0x3089, - 0x49: 0x308a, - 0x4a: 0x308b, - 0x4b: 0x308c, - 0x4c: 0x308d, - 0x4d: 0x308e, - 0x4e: 0x308f, - 0x4f: 0x3090, - 0x50: 0x3091, - 0x51: 0x3092, - 0x52: 0x3093, - }, - 0x04: [94]uint16{ - 0x00: 0x30a1, - 0x01: 0x30a2, - 0x02: 0x30a3, - 0x03: 0x30a4, - 0x04: 0x30a5, - 0x05: 0x30a6, - 0x06: 0x30a7, - 0x07: 0x30a8, - 0x08: 0x30a9, - 0x09: 0x30aa, - 0x0a: 0x30ab, - 0x0b: 0x30ac, - 0x0c: 0x30ad, - 0x0d: 0x30ae, - 0x0e: 0x30af, - 0x0f: 0x30b0, - 0x10: 0x30b1, - 0x11: 0x30b2, - 0x12: 0x30b3, - 0x13: 0x30b4, - 0x14: 0x30b5, - 0x15: 0x30b6, - 0x16: 0x30b7, - 0x17: 0x30b8, - 0x18: 0x30b9, - 0x19: 0x30ba, - 0x1a: 0x30bb, - 0x1b: 0x30bc, - 0x1c: 0x30bd, - 0x1d: 0x30be, - 0x1e: 0x30bf, - 0x1f: 0x30c0, - 0x20: 0x30c1, - 0x21: 0x30c2, - 0x22: 0x30c3, - 0x23: 0x30c4, - 0x24: 0x30c5, - 0x25: 0x30c6, - 0x26: 0x30c7, - 0x27: 0x30c8, - 0x28: 0x30c9, - 0x29: 0x30ca, - 0x2a: 0x30cb, - 0x2b: 0x30cc, - 0x2c: 0x30cd, - 0x2d: 0x30ce, - 0x2e: 0x30cf, - 0x2f: 0x30d0, - 0x30: 0x30d1, - 0x31: 0x30d2, - 0x32: 0x30d3, - 0x33: 0x30d4, - 0x34: 0x30d5, - 0x35: 0x30d6, - 0x36: 0x30d7, - 0x37: 0x30d8, - 0x38: 0x30d9, - 0x39: 0x30da, - 0x3a: 0x30db, - 0x3b: 0x30dc, - 0x3c: 0x30dd, - 0x3d: 0x30de, - 0x3e: 0x30df, - 0x3f: 0x30e0, - 0x40: 0x30e1, - 0x41: 0x30e2, - 0x42: 0x30e3, - 0x43: 0x30e4, - 0x44: 0x30e5, - 0x45: 0x30e6, - 0x46: 0x30e7, - 0x47: 0x30e8, - 0x48: 0x30e9, - 0x49: 0x30ea, - 0x4a: 0x30eb, - 0x4b: 0x30ec, - 0x4c: 0x30ed, - 0x4d: 0x30ee, - 0x4e: 0x30ef, - 0x4f: 0x30f0, - 0x50: 0x30f1, - 0x51: 0x30f2, - 0x52: 0x30f3, - 0x53: 0x30f4, - 0x54: 0x30f5, - 0x55: 0x30f6, - }, - 0x05: [94]uint16{ - 0x00: 0x0391, - 0x01: 0x0392, - 0x02: 0x0393, - 0x03: 0x0394, - 0x04: 0x0395, - 0x05: 0x0396, - 0x06: 0x0397, - 0x07: 0x0398, - 0x08: 0x0399, - 0x09: 0x039a, - 0x0a: 0x039b, - 0x0b: 0x039c, - 0x0c: 0x039d, - 0x0d: 0x039e, - 0x0e: 0x039f, - 0x0f: 0x03a0, - 0x10: 0x03a1, - 0x11: 0x03a3, - 0x12: 0x03a4, - 0x13: 0x03a5, - 0x14: 0x03a6, - 0x15: 0x03a7, - 0x16: 0x03a8, - 0x17: 0x03a9, - 0x20: 0x03b1, - 0x21: 0x03b2, - 0x22: 0x03b3, - 0x23: 0x03b4, - 0x24: 0x03b5, - 0x25: 0x03b6, - 0x26: 0x03b7, - 0x27: 0x03b8, - 0x28: 0x03b9, - 0x29: 0x03ba, - 0x2a: 0x03bb, - 0x2b: 0x03bc, - 0x2c: 0x03bd, - 0x2d: 0x03be, - 0x2e: 0x03bf, - 0x2f: 0x03c0, - 0x30: 0x03c1, - 0x31: 0x03c3, - 0x32: 0x03c4, - 0x33: 0x03c5, - 0x34: 0x03c6, - 0x35: 0x03c7, - 0x36: 0x03c8, - 0x37: 0x03c9, - }, - 0x06: [94]uint16{ - 0x00: 0x0410, - 0x01: 0x0411, - 0x02: 0x0412, - 0x03: 0x0413, - 0x04: 0x0414, - 0x05: 0x0415, - 0x06: 0x0401, - 0x07: 0x0416, - 0x08: 0x0417, - 0x09: 0x0418, - 0x0a: 0x0419, - 0x0b: 0x041a, - 0x0c: 0x041b, - 0x0d: 0x041c, - 0x0e: 0x041d, - 0x0f: 0x041e, - 0x10: 0x041f, - 0x11: 0x0420, - 0x12: 0x0421, - 0x13: 0x0422, - 0x14: 0x0423, - 0x15: 0x0424, - 0x16: 0x0425, - 0x17: 0x0426, - 0x18: 0x0427, - 0x19: 0x0428, - 0x1a: 0x0429, - 0x1b: 0x042a, - 0x1c: 0x042b, - 0x1d: 0x042c, - 0x1e: 0x042d, - 0x1f: 0x042e, - 0x20: 0x042f, - 0x30: 0x0430, - 0x31: 0x0431, - 0x32: 0x0432, - 0x33: 0x0433, - 0x34: 0x0434, - 0x35: 0x0435, - 0x36: 0x0451, - 0x37: 0x0436, - 0x38: 0x0437, - 0x39: 0x0438, - 0x3a: 0x0439, - 0x3b: 0x043a, - 0x3c: 0x043b, - 0x3d: 0x043c, - 0x3e: 0x043d, - 0x3f: 0x043e, - 0x40: 0x043f, - 0x41: 0x0440, - 0x42: 0x0441, - 0x43: 0x0442, - 0x44: 0x0443, - 0x45: 0x0444, - 0x46: 0x0445, - 0x47: 0x0446, - 0x48: 0x0447, - 0x49: 0x0448, - 0x4a: 0x0449, - 0x4b: 0x044a, - 0x4c: 0x044b, - 0x4d: 0x044c, - 0x4e: 0x044d, - 0x4f: 0x044e, - 0x50: 0x044f, - }, - 0x07: [94]uint16{ - 0x00: 0x2500, - 0x01: 0x2502, - 0x02: 0x250c, - 0x03: 0x2510, - 0x04: 0x2518, - 0x05: 0x2514, - 0x06: 0x251c, - 0x07: 0x252c, - 0x08: 0x2524, - 0x09: 0x2534, - 0x0a: 0x253c, - 0x0b: 0x2501, - 0x0c: 0x2503, - 0x0d: 0x250f, - 0x0e: 0x2513, - 0x0f: 0x251b, - 0x10: 0x2517, - 0x11: 0x2523, - 0x12: 0x2533, - 0x13: 0x252b, - 0x14: 0x253b, - 0x15: 0x254b, - 0x16: 0x2520, - 0x17: 0x252f, - 0x18: 0x2528, - 0x19: 0x2537, - 0x1a: 0x253f, - 0x1b: 0x251d, - 0x1c: 0x2530, - 0x1d: 0x2525, - 0x1e: 0x2538, - 0x1f: 0x2542, - }, - 0x0f: [94]uint16{ - 0x00: 0x4e9c, - 0x01: 0x5516, - 0x02: 0x5a03, - 0x03: 0x963f, - 0x04: 0x54c0, - 0x05: 0x611b, - 0x06: 0x6328, - 0x07: 0x59f6, - 0x08: 0x9022, - 0x09: 0x8475, - 0x0a: 0x831c, - 0x0b: 0x7a50, - 0x0c: 0x60aa, - 0x0d: 0x63e1, - 0x0e: 0x6e25, - 0x0f: 0x65ed, - 0x10: 0x8466, - 0x11: 0x82a6, - 0x12: 0x9bf5, - 0x13: 0x6893, - 0x14: 0x5727, - 0x15: 0x65a1, - 0x16: 0x6271, - 0x17: 0x5b9b, - 0x18: 0x59d0, - 0x19: 0x867b, - 0x1a: 0x98f4, - 0x1b: 0x7d62, - 0x1c: 0x7dbe, - 0x1d: 0x9b8e, - 0x1e: 0x6216, - 0x1f: 0x7c9f, - 0x20: 0x88b7, - 0x21: 0x5b89, - 0x22: 0x5eb5, - 0x23: 0x6309, - 0x24: 0x6697, - 0x25: 0x6848, - 0x26: 0x95c7, - 0x27: 0x978d, - 0x28: 0x674f, - 0x29: 0x4ee5, - 0x2a: 0x4f0a, - 0x2b: 0x4f4d, - 0x2c: 0x4f9d, - 0x2d: 0x5049, - 0x2e: 0x56f2, - 0x2f: 0x5937, - 0x30: 0x59d4, - 0x31: 0x5a01, - 0x32: 0x5c09, - 0x33: 0x60df, - 0x34: 0x610f, - 0x35: 0x6170, - 0x36: 0x6613, - 0x37: 0x6905, - 0x38: 0x70ba, - 0x39: 0x754f, - 0x3a: 0x7570, - 0x3b: 0x79fb, - 0x3c: 0x7dad, - 0x3d: 0x7def, - 0x3e: 0x80c3, - 0x3f: 0x840e, - 0x40: 0x8863, - 0x41: 0x8b02, - 0x42: 0x9055, - 0x43: 0x907a, - 0x44: 0x533b, - 0x45: 0x4e95, - 0x46: 0x4ea5, - 0x47: 0x57df, - 0x48: 0x80b2, - 0x49: 0x90c1, - 0x4a: 0x78ef, - 0x4b: 0x4e00, - 0x4c: 0x58f1, - 0x4d: 0x6ea2, - 0x4e: 0x9038, - 0x4f: 0x7a32, - 0x50: 0x8328, - 0x51: 0x828b, - 0x52: 0x9c2f, - 0x53: 0x5141, - 0x54: 0x5370, - 0x55: 0x54bd, - 0x56: 0x54e1, - 0x57: 0x56e0, - 0x58: 0x59fb, - 0x59: 0x5f15, - 0x5a: 0x98f2, - 0x5b: 0x6deb, - 0x5c: 0x80e4, - 0x5d: 0x852d, - }, - 0x10: [94]uint16{ - 0x00: 0x9662, - 0x01: 0x9670, - 0x02: 0x96a0, - 0x03: 0x97fb, - 0x04: 0x540b, - 0x05: 0x53f3, - 0x06: 0x5b87, - 0x07: 0x70cf, - 0x08: 0x7fbd, - 0x09: 0x8fc2, - 0x0a: 0x96e8, - 0x0b: 0x536f, - 0x0c: 0x9d5c, - 0x0d: 0x7aba, - 0x0e: 0x4e11, - 0x0f: 0x7893, - 0x10: 0x81fc, - 0x11: 0x6e26, - 0x12: 0x5618, - 0x13: 0x5504, - 0x14: 0x6b1d, - 0x15: 0x851a, - 0x16: 0x9c3b, - 0x17: 0x59e5, - 0x18: 0x53a9, - 0x19: 0x6d66, - 0x1a: 0x74dc, - 0x1b: 0x958f, - 0x1c: 0x5642, - 0x1d: 0x4e91, - 0x1e: 0x904b, - 0x1f: 0x96f2, - 0x20: 0x834f, - 0x21: 0x990c, - 0x22: 0x53e1, - 0x23: 0x55b6, - 0x24: 0x5b30, - 0x25: 0x5f71, - 0x26: 0x6620, - 0x27: 0x66f3, - 0x28: 0x6804, - 0x29: 0x6c38, - 0x2a: 0x6cf3, - 0x2b: 0x6d29, - 0x2c: 0x745b, - 0x2d: 0x76c8, - 0x2e: 0x7a4e, - 0x2f: 0x9834, - 0x30: 0x82f1, - 0x31: 0x885b, - 0x32: 0x8a60, - 0x33: 0x92ed, - 0x34: 0x6db2, - 0x35: 0x75ab, - 0x36: 0x76ca, - 0x37: 0x99c5, - 0x38: 0x60a6, - 0x39: 0x8b01, - 0x3a: 0x8d8a, - 0x3b: 0x95b2, - 0x3c: 0x698e, - 0x3d: 0x53ad, - 0x3e: 0x5186, - 0x3f: 0x5712, - 0x40: 0x5830, - 0x41: 0x5944, - 0x42: 0x5bb4, - 0x43: 0x5ef6, - 0x44: 0x6028, - 0x45: 0x63a9, - 0x46: 0x63f4, - 0x47: 0x6cbf, - 0x48: 0x6f14, - 0x49: 0x708e, - 0x4a: 0x7114, - 0x4b: 0x7159, - 0x4c: 0x71d5, - 0x4d: 0x733f, - 0x4e: 0x7e01, - 0x4f: 0x8276, - 0x50: 0x82d1, - 0x51: 0x8597, - 0x52: 0x9060, - 0x53: 0x925b, - 0x54: 0x9d1b, - 0x55: 0x5869, - 0x56: 0x65bc, - 0x57: 0x6c5a, - 0x58: 0x7525, - 0x59: 0x51f9, - 0x5a: 0x592e, - 0x5b: 0x5965, - 0x5c: 0x5f80, - 0x5d: 0x5fdc, - }, - 0x11: [94]uint16{ - 0x00: 0x62bc, - 0x01: 0x65fa, - 0x02: 0x6a2a, - 0x03: 0x6b27, - 0x04: 0x6bb4, - 0x05: 0x738b, - 0x06: 0x7fc1, - 0x07: 0x8956, - 0x08: 0x9d2c, - 0x09: 0x9d0e, - 0x0a: 0x9ec4, - 0x0b: 0x5ca1, - 0x0c: 0x6c96, - 0x0d: 0x837b, - 0x0e: 0x5104, - 0x0f: 0x5c4b, - 0x10: 0x61b6, - 0x11: 0x81c6, - 0x12: 0x6876, - 0x13: 0x7261, - 0x14: 0x4e59, - 0x15: 0x4ffa, - 0x16: 0x5378, - 0x17: 0x6069, - 0x18: 0x6e29, - 0x19: 0x7a4f, - 0x1a: 0x97f3, - 0x1b: 0x4e0b, - 0x1c: 0x5316, - 0x1d: 0x4eee, - 0x1e: 0x4f55, - 0x1f: 0x4f3d, - 0x20: 0x4fa1, - 0x21: 0x4f73, - 0x22: 0x52a0, - 0x23: 0x53ef, - 0x24: 0x5609, - 0x25: 0x590f, - 0x26: 0x5ac1, - 0x27: 0x5bb6, - 0x28: 0x5be1, - 0x29: 0x79d1, - 0x2a: 0x6687, - 0x2b: 0x679c, - 0x2c: 0x67b6, - 0x2d: 0x6b4c, - 0x2e: 0x6cb3, - 0x2f: 0x706b, - 0x30: 0x73c2, - 0x31: 0x798d, - 0x32: 0x79be, - 0x33: 0x7a3c, - 0x34: 0x7b87, - 0x35: 0x82b1, - 0x36: 0x82db, - 0x37: 0x8304, - 0x38: 0x8377, - 0x39: 0x83ef, - 0x3a: 0x83d3, - 0x3b: 0x8766, - 0x3c: 0x8ab2, - 0x3d: 0x5629, - 0x3e: 0x8ca8, - 0x3f: 0x8fe6, - 0x40: 0x904e, - 0x41: 0x971e, - 0x42: 0x868a, - 0x43: 0x4fc4, - 0x44: 0x5ce8, - 0x45: 0x6211, - 0x46: 0x7259, - 0x47: 0x753b, - 0x48: 0x81e5, - 0x49: 0x82bd, - 0x4a: 0x86fe, - 0x4b: 0x8cc0, - 0x4c: 0x96c5, - 0x4d: 0x9913, - 0x4e: 0x99d5, - 0x4f: 0x4ecb, - 0x50: 0x4f1a, - 0x51: 0x89e3, - 0x52: 0x56de, - 0x53: 0x584a, - 0x54: 0x58ca, - 0x55: 0x5efb, - 0x56: 0x5feb, - 0x57: 0x602a, - 0x58: 0x6094, - 0x59: 0x6062, - 0x5a: 0x61d0, - 0x5b: 0x6212, - 0x5c: 0x62d0, - 0x5d: 0x6539, - }, - 0x12: [94]uint16{ - 0x00: 0x9b41, - 0x01: 0x6666, - 0x02: 0x68b0, - 0x03: 0x6d77, - 0x04: 0x7070, - 0x05: 0x754c, - 0x06: 0x7686, - 0x07: 0x7d75, - 0x08: 0x82a5, - 0x09: 0x87f9, - 0x0a: 0x958b, - 0x0b: 0x968e, - 0x0c: 0x8c9d, - 0x0d: 0x51f1, - 0x0e: 0x52be, - 0x0f: 0x5916, - 0x10: 0x54b3, - 0x11: 0x5bb3, - 0x12: 0x5d16, - 0x13: 0x6168, - 0x14: 0x6982, - 0x15: 0x6daf, - 0x16: 0x788d, - 0x17: 0x84cb, - 0x18: 0x8857, - 0x19: 0x8a72, - 0x1a: 0x93a7, - 0x1b: 0x9ab8, - 0x1c: 0x6d6c, - 0x1d: 0x99a8, - 0x1e: 0x86d9, - 0x1f: 0x57a3, - 0x20: 0x67ff, - 0x21: 0x86ce, - 0x22: 0x920e, - 0x23: 0x5283, - 0x24: 0x5687, - 0x25: 0x5404, - 0x26: 0x5ed3, - 0x27: 0x62e1, - 0x28: 0x64b9, - 0x29: 0x683c, - 0x2a: 0x6838, - 0x2b: 0x6bbb, - 0x2c: 0x7372, - 0x2d: 0x78ba, - 0x2e: 0x7a6b, - 0x2f: 0x899a, - 0x30: 0x89d2, - 0x31: 0x8d6b, - 0x32: 0x8f03, - 0x33: 0x90ed, - 0x34: 0x95a3, - 0x35: 0x9694, - 0x36: 0x9769, - 0x37: 0x5b66, - 0x38: 0x5cb3, - 0x39: 0x697d, - 0x3a: 0x984d, - 0x3b: 0x984e, - 0x3c: 0x639b, - 0x3d: 0x7b20, - 0x3e: 0x6a2b, - 0x3f: 0x6a7f, - 0x40: 0x68b6, - 0x41: 0x9c0d, - 0x42: 0x6f5f, - 0x43: 0x5272, - 0x44: 0x559d, - 0x45: 0x6070, - 0x46: 0x62ec, - 0x47: 0x6d3b, - 0x48: 0x6e07, - 0x49: 0x6ed1, - 0x4a: 0x845b, - 0x4b: 0x8910, - 0x4c: 0x8f44, - 0x4d: 0x4e14, - 0x4e: 0x9c39, - 0x4f: 0x53f6, - 0x50: 0x691b, - 0x51: 0x6a3a, - 0x52: 0x9784, - 0x53: 0x682a, - 0x54: 0x515c, - 0x55: 0x7ac3, - 0x56: 0x84b2, - 0x57: 0x91dc, - 0x58: 0x938c, - 0x59: 0x565b, - 0x5a: 0x9d28, - 0x5b: 0x6822, - 0x5c: 0x8305, - 0x5d: 0x8431, - }, - 0x13: [94]uint16{ - 0x00: 0x7ca5, - 0x01: 0x5208, - 0x02: 0x82c5, - 0x03: 0x74e6, - 0x04: 0x4e7e, - 0x05: 0x4f83, - 0x06: 0x51a0, - 0x07: 0x5bd2, - 0x08: 0x520a, - 0x09: 0x52d8, - 0x0a: 0x52e7, - 0x0b: 0x5dfb, - 0x0c: 0x559a, - 0x0d: 0x582a, - 0x0e: 0x59e6, - 0x0f: 0x5b8c, - 0x10: 0x5b98, - 0x11: 0x5bdb, - 0x12: 0x5e72, - 0x13: 0x5e79, - 0x14: 0x60a3, - 0x15: 0x611f, - 0x16: 0x6163, - 0x17: 0x61be, - 0x18: 0x63db, - 0x19: 0x6562, - 0x1a: 0x67d1, - 0x1b: 0x6853, - 0x1c: 0x68fa, - 0x1d: 0x6b3e, - 0x1e: 0x6b53, - 0x1f: 0x6c57, - 0x20: 0x6f22, - 0x21: 0x6f97, - 0x22: 0x6f45, - 0x23: 0x74b0, - 0x24: 0x7518, - 0x25: 0x76e3, - 0x26: 0x770b, - 0x27: 0x7aff, - 0x28: 0x7ba1, - 0x29: 0x7c21, - 0x2a: 0x7de9, - 0x2b: 0x7f36, - 0x2c: 0x7ff0, - 0x2d: 0x809d, - 0x2e: 0x8266, - 0x2f: 0x839e, - 0x30: 0x89b3, - 0x31: 0x8acc, - 0x32: 0x8cab, - 0x33: 0x9084, - 0x34: 0x9451, - 0x35: 0x9593, - 0x36: 0x9591, - 0x37: 0x95a2, - 0x38: 0x9665, - 0x39: 0x97d3, - 0x3a: 0x9928, - 0x3b: 0x8218, - 0x3c: 0x4e38, - 0x3d: 0x542b, - 0x3e: 0x5cb8, - 0x3f: 0x5dcc, - 0x40: 0x73a9, - 0x41: 0x764c, - 0x42: 0x773c, - 0x43: 0x5ca9, - 0x44: 0x7feb, - 0x45: 0x8d0b, - 0x46: 0x96c1, - 0x47: 0x9811, - 0x48: 0x9854, - 0x49: 0x9858, - 0x4a: 0x4f01, - 0x4b: 0x4f0e, - 0x4c: 0x5371, - 0x4d: 0x559c, - 0x4e: 0x5668, - 0x4f: 0x57fa, - 0x50: 0x5947, - 0x51: 0x5b09, - 0x52: 0x5bc4, - 0x53: 0x5c90, - 0x54: 0x5e0c, - 0x55: 0x5e7e, - 0x56: 0x5fcc, - 0x57: 0x63ee, - 0x58: 0x673a, - 0x59: 0x65d7, - 0x5a: 0x65e2, - 0x5b: 0x671f, - 0x5c: 0x68cb, - 0x5d: 0x68c4, - }, - 0x14: [94]uint16{ - 0x00: 0x6a5f, - 0x01: 0x5e30, - 0x02: 0x6bc5, - 0x03: 0x6c17, - 0x04: 0x6c7d, - 0x05: 0x757f, - 0x06: 0x7948, - 0x07: 0x5b63, - 0x08: 0x7a00, - 0x09: 0x7d00, - 0x0a: 0x5fbd, - 0x0b: 0x898f, - 0x0c: 0x8a18, - 0x0d: 0x8cb4, - 0x0e: 0x8d77, - 0x0f: 0x8ecc, - 0x10: 0x8f1d, - 0x11: 0x98e2, - 0x12: 0x9a0e, - 0x13: 0x9b3c, - 0x14: 0x4e80, - 0x15: 0x507d, - 0x16: 0x5100, - 0x17: 0x5993, - 0x18: 0x5b9c, - 0x19: 0x622f, - 0x1a: 0x6280, - 0x1b: 0x64ec, - 0x1c: 0x6b3a, - 0x1d: 0x72a0, - 0x1e: 0x7591, - 0x1f: 0x7947, - 0x20: 0x7fa9, - 0x21: 0x87fb, - 0x22: 0x8abc, - 0x23: 0x8b70, - 0x24: 0x63ac, - 0x25: 0x83ca, - 0x26: 0x97a0, - 0x27: 0x5409, - 0x28: 0x5403, - 0x29: 0x55ab, - 0x2a: 0x6854, - 0x2b: 0x6a58, - 0x2c: 0x8a70, - 0x2d: 0x7827, - 0x2e: 0x6775, - 0x2f: 0x9ecd, - 0x30: 0x5374, - 0x31: 0x5ba2, - 0x32: 0x811a, - 0x33: 0x8650, - 0x34: 0x9006, - 0x35: 0x4e18, - 0x36: 0x4e45, - 0x37: 0x4ec7, - 0x38: 0x4f11, - 0x39: 0x53ca, - 0x3a: 0x5438, - 0x3b: 0x5bae, - 0x3c: 0x5f13, - 0x3d: 0x6025, - 0x3e: 0x6551, - 0x3f: 0x673d, - 0x40: 0x6c42, - 0x41: 0x6c72, - 0x42: 0x6ce3, - 0x43: 0x7078, - 0x44: 0x7403, - 0x45: 0x7a76, - 0x46: 0x7aae, - 0x47: 0x7b08, - 0x48: 0x7d1a, - 0x49: 0x7cfe, - 0x4a: 0x7d66, - 0x4b: 0x65e7, - 0x4c: 0x725b, - 0x4d: 0x53bb, - 0x4e: 0x5c45, - 0x4f: 0x5de8, - 0x50: 0x62d2, - 0x51: 0x62e0, - 0x52: 0x6319, - 0x53: 0x6e20, - 0x54: 0x865a, - 0x55: 0x8a31, - 0x56: 0x8ddd, - 0x57: 0x92f8, - 0x58: 0x6f01, - 0x59: 0x79a6, - 0x5a: 0x9b5a, - 0x5b: 0x4ea8, - 0x5c: 0x4eab, - 0x5d: 0x4eac, - }, - 0x15: [94]uint16{ - 0x00: 0x4f9b, - 0x01: 0x4fa0, - 0x02: 0x50d1, - 0x03: 0x5147, - 0x04: 0x7af6, - 0x05: 0x5171, - 0x06: 0x51f6, - 0x07: 0x5354, - 0x08: 0x5321, - 0x09: 0x537f, - 0x0a: 0x53eb, - 0x0b: 0x55ac, - 0x0c: 0x5883, - 0x0d: 0x5ce1, - 0x0e: 0x5f37, - 0x0f: 0x5f4a, - 0x10: 0x602f, - 0x11: 0x6050, - 0x12: 0x606d, - 0x13: 0x631f, - 0x14: 0x6559, - 0x15: 0x6a4b, - 0x16: 0x6cc1, - 0x17: 0x72c2, - 0x18: 0x72ed, - 0x19: 0x77ef, - 0x1a: 0x80f8, - 0x1b: 0x8105, - 0x1c: 0x8208, - 0x1d: 0x854e, - 0x1e: 0x90f7, - 0x1f: 0x93e1, - 0x20: 0x97ff, - 0x21: 0x9957, - 0x22: 0x9a5a, - 0x23: 0x4ef0, - 0x24: 0x51dd, - 0x25: 0x5c2d, - 0x26: 0x6681, - 0x27: 0x696d, - 0x28: 0x5c40, - 0x29: 0x66f2, - 0x2a: 0x6975, - 0x2b: 0x7389, - 0x2c: 0x6850, - 0x2d: 0x7c81, - 0x2e: 0x50c5, - 0x2f: 0x52e4, - 0x30: 0x5747, - 0x31: 0x5dfe, - 0x32: 0x9326, - 0x33: 0x65a4, - 0x34: 0x6b23, - 0x35: 0x6b3d, - 0x36: 0x7434, - 0x37: 0x7981, - 0x38: 0x79bd, - 0x39: 0x7b4b, - 0x3a: 0x7dca, - 0x3b: 0x82b9, - 0x3c: 0x83cc, - 0x3d: 0x887f, - 0x3e: 0x895f, - 0x3f: 0x8b39, - 0x40: 0x8fd1, - 0x41: 0x91d1, - 0x42: 0x541f, - 0x43: 0x9280, - 0x44: 0x4e5d, - 0x45: 0x5036, - 0x46: 0x53e5, - 0x47: 0x533a, - 0x48: 0x72d7, - 0x49: 0x7396, - 0x4a: 0x77e9, - 0x4b: 0x82e6, - 0x4c: 0x8eaf, - 0x4d: 0x99c6, - 0x4e: 0x99c8, - 0x4f: 0x99d2, - 0x50: 0x5177, - 0x51: 0x611a, - 0x52: 0x865e, - 0x53: 0x55b0, - 0x54: 0x7a7a, - 0x55: 0x5076, - 0x56: 0x5bd3, - 0x57: 0x9047, - 0x58: 0x9685, - 0x59: 0x4e32, - 0x5a: 0x6adb, - 0x5b: 0x91e7, - 0x5c: 0x5c51, - 0x5d: 0x5c48, - }, - 0x16: [94]uint16{ - 0x00: 0x6398, - 0x01: 0x7a9f, - 0x02: 0x6c93, - 0x03: 0x9774, - 0x04: 0x8f61, - 0x05: 0x7aaa, - 0x06: 0x718a, - 0x07: 0x9688, - 0x08: 0x7c82, - 0x09: 0x6817, - 0x0a: 0x7e70, - 0x0b: 0x6851, - 0x0c: 0x936c, - 0x0d: 0x52f2, - 0x0e: 0x541b, - 0x0f: 0x85ab, - 0x10: 0x8a13, - 0x11: 0x7fa4, - 0x12: 0x8ecd, - 0x13: 0x90e1, - 0x14: 0x5366, - 0x15: 0x8888, - 0x16: 0x7941, - 0x17: 0x4fc2, - 0x18: 0x50be, - 0x19: 0x5211, - 0x1a: 0x5144, - 0x1b: 0x5553, - 0x1c: 0x572d, - 0x1d: 0x73ea, - 0x1e: 0x578b, - 0x1f: 0x5951, - 0x20: 0x5f62, - 0x21: 0x5f84, - 0x22: 0x6075, - 0x23: 0x6176, - 0x24: 0x6167, - 0x25: 0x61a9, - 0x26: 0x63b2, - 0x27: 0x643a, - 0x28: 0x656c, - 0x29: 0x666f, - 0x2a: 0x6842, - 0x2b: 0x6e13, - 0x2c: 0x7566, - 0x2d: 0x7a3d, - 0x2e: 0x7cfb, - 0x2f: 0x7d4c, - 0x30: 0x7d99, - 0x31: 0x7e4b, - 0x32: 0x7f6b, - 0x33: 0x830e, - 0x34: 0x834a, - 0x35: 0x86cd, - 0x36: 0x8a08, - 0x37: 0x8a63, - 0x38: 0x8b66, - 0x39: 0x8efd, - 0x3a: 0x981a, - 0x3b: 0x9d8f, - 0x3c: 0x82b8, - 0x3d: 0x8fce, - 0x3e: 0x9be8, - 0x3f: 0x5287, - 0x40: 0x621f, - 0x41: 0x6483, - 0x42: 0x6fc0, - 0x43: 0x9699, - 0x44: 0x6841, - 0x45: 0x5091, - 0x46: 0x6b20, - 0x47: 0x6c7a, - 0x48: 0x6f54, - 0x49: 0x7a74, - 0x4a: 0x7d50, - 0x4b: 0x8840, - 0x4c: 0x8a23, - 0x4d: 0x6708, - 0x4e: 0x4ef6, - 0x4f: 0x5039, - 0x50: 0x5026, - 0x51: 0x5065, - 0x52: 0x517c, - 0x53: 0x5238, - 0x54: 0x5263, - 0x55: 0x55a7, - 0x56: 0x570f, - 0x57: 0x5805, - 0x58: 0x5acc, - 0x59: 0x5efa, - 0x5a: 0x61b2, - 0x5b: 0x61f8, - 0x5c: 0x62f3, - 0x5d: 0x6372, - }, - 0x17: [94]uint16{ - 0x00: 0x691c, - 0x01: 0x6a29, - 0x02: 0x727d, - 0x03: 0x72ac, - 0x04: 0x732e, - 0x05: 0x7814, - 0x06: 0x786f, - 0x07: 0x7d79, - 0x08: 0x770c, - 0x09: 0x80a9, - 0x0a: 0x898b, - 0x0b: 0x8b19, - 0x0c: 0x8ce2, - 0x0d: 0x8ed2, - 0x0e: 0x9063, - 0x0f: 0x9375, - 0x10: 0x967a, - 0x11: 0x9855, - 0x12: 0x9a13, - 0x13: 0x9e78, - 0x14: 0x5143, - 0x15: 0x539f, - 0x16: 0x53b3, - 0x17: 0x5e7b, - 0x18: 0x5f26, - 0x19: 0x6e1b, - 0x1a: 0x6e90, - 0x1b: 0x7384, - 0x1c: 0x73fe, - 0x1d: 0x7d43, - 0x1e: 0x8237, - 0x1f: 0x8a00, - 0x20: 0x8afa, - 0x21: 0x9650, - 0x22: 0x4e4e, - 0x23: 0x500b, - 0x24: 0x53e4, - 0x25: 0x547c, - 0x26: 0x56fa, - 0x27: 0x59d1, - 0x28: 0x5b64, - 0x29: 0x5df1, - 0x2a: 0x5eab, - 0x2b: 0x5f27, - 0x2c: 0x6238, - 0x2d: 0x6545, - 0x2e: 0x67af, - 0x2f: 0x6e56, - 0x30: 0x72d0, - 0x31: 0x7cca, - 0x32: 0x88b4, - 0x33: 0x80a1, - 0x34: 0x80e1, - 0x35: 0x83f0, - 0x36: 0x864e, - 0x37: 0x8a87, - 0x38: 0x8de8, - 0x39: 0x9237, - 0x3a: 0x96c7, - 0x3b: 0x9867, - 0x3c: 0x9f13, - 0x3d: 0x4e94, - 0x3e: 0x4e92, - 0x3f: 0x4f0d, - 0x40: 0x5348, - 0x41: 0x5449, - 0x42: 0x543e, - 0x43: 0x5a2f, - 0x44: 0x5f8c, - 0x45: 0x5fa1, - 0x46: 0x609f, - 0x47: 0x68a7, - 0x48: 0x6a8e, - 0x49: 0x745a, - 0x4a: 0x7881, - 0x4b: 0x8a9e, - 0x4c: 0x8aa4, - 0x4d: 0x8b77, - 0x4e: 0x9190, - 0x4f: 0x4e5e, - 0x50: 0x9bc9, - 0x51: 0x4ea4, - 0x52: 0x4f7c, - 0x53: 0x4faf, - 0x54: 0x5019, - 0x55: 0x5016, - 0x56: 0x5149, - 0x57: 0x516c, - 0x58: 0x529f, - 0x59: 0x52b9, - 0x5a: 0x52fe, - 0x5b: 0x539a, - 0x5c: 0x53e3, - 0x5d: 0x5411, - }, - 0x18: [94]uint16{ - 0x00: 0x540e, - 0x01: 0x5589, - 0x02: 0x5751, - 0x03: 0x57a2, - 0x04: 0x597d, - 0x05: 0x5b54, - 0x06: 0x5b5d, - 0x07: 0x5b8f, - 0x08: 0x5de5, - 0x09: 0x5de7, - 0x0a: 0x5df7, - 0x0b: 0x5e78, - 0x0c: 0x5e83, - 0x0d: 0x5e9a, - 0x0e: 0x5eb7, - 0x0f: 0x5f18, - 0x10: 0x6052, - 0x11: 0x614c, - 0x12: 0x6297, - 0x13: 0x62d8, - 0x14: 0x63a7, - 0x15: 0x653b, - 0x16: 0x6602, - 0x17: 0x6643, - 0x18: 0x66f4, - 0x19: 0x676d, - 0x1a: 0x6821, - 0x1b: 0x6897, - 0x1c: 0x69cb, - 0x1d: 0x6c5f, - 0x1e: 0x6d2a, - 0x1f: 0x6d69, - 0x20: 0x6e2f, - 0x21: 0x6e9d, - 0x22: 0x7532, - 0x23: 0x7687, - 0x24: 0x786c, - 0x25: 0x7a3f, - 0x26: 0x7ce0, - 0x27: 0x7d05, - 0x28: 0x7d18, - 0x29: 0x7d5e, - 0x2a: 0x7db1, - 0x2b: 0x8015, - 0x2c: 0x8003, - 0x2d: 0x80af, - 0x2e: 0x80b1, - 0x2f: 0x8154, - 0x30: 0x818f, - 0x31: 0x822a, - 0x32: 0x8352, - 0x33: 0x884c, - 0x34: 0x8861, - 0x35: 0x8b1b, - 0x36: 0x8ca2, - 0x37: 0x8cfc, - 0x38: 0x90ca, - 0x39: 0x9175, - 0x3a: 0x9271, - 0x3b: 0x783f, - 0x3c: 0x92fc, - 0x3d: 0x95a4, - 0x3e: 0x964d, - 0x3f: 0x9805, - 0x40: 0x9999, - 0x41: 0x9ad8, - 0x42: 0x9d3b, - 0x43: 0x525b, - 0x44: 0x52ab, - 0x45: 0x53f7, - 0x46: 0x5408, - 0x47: 0x58d5, - 0x48: 0x62f7, - 0x49: 0x6fe0, - 0x4a: 0x8c6a, - 0x4b: 0x8f5f, - 0x4c: 0x9eb9, - 0x4d: 0x514b, - 0x4e: 0x523b, - 0x4f: 0x544a, - 0x50: 0x56fd, - 0x51: 0x7a40, - 0x52: 0x9177, - 0x53: 0x9d60, - 0x54: 0x9ed2, - 0x55: 0x7344, - 0x56: 0x6f09, - 0x57: 0x8170, - 0x58: 0x7511, - 0x59: 0x5ffd, - 0x5a: 0x60da, - 0x5b: 0x9aa8, - 0x5c: 0x72db, - 0x5d: 0x8fbc, - }, - 0x19: [94]uint16{ - 0x00: 0x6b64, - 0x01: 0x9803, - 0x02: 0x4eca, - 0x03: 0x56f0, - 0x04: 0x5764, - 0x05: 0x58be, - 0x06: 0x5a5a, - 0x07: 0x6068, - 0x08: 0x61c7, - 0x09: 0x660f, - 0x0a: 0x6606, - 0x0b: 0x6839, - 0x0c: 0x68b1, - 0x0d: 0x6df7, - 0x0e: 0x75d5, - 0x0f: 0x7d3a, - 0x10: 0x826e, - 0x11: 0x9b42, - 0x12: 0x4e9b, - 0x13: 0x4f50, - 0x14: 0x53c9, - 0x15: 0x5506, - 0x16: 0x5d6f, - 0x17: 0x5de6, - 0x18: 0x5dee, - 0x19: 0x67fb, - 0x1a: 0x6c99, - 0x1b: 0x7473, - 0x1c: 0x7802, - 0x1d: 0x8a50, - 0x1e: 0x9396, - 0x1f: 0x88df, - 0x20: 0x5750, - 0x21: 0x5ea7, - 0x22: 0x632b, - 0x23: 0x50b5, - 0x24: 0x50ac, - 0x25: 0x518d, - 0x26: 0x6700, - 0x27: 0x54c9, - 0x28: 0x585e, - 0x29: 0x59bb, - 0x2a: 0x5bb0, - 0x2b: 0x5f69, - 0x2c: 0x624d, - 0x2d: 0x63a1, - 0x2e: 0x683d, - 0x2f: 0x6b73, - 0x30: 0x6e08, - 0x31: 0x707d, - 0x32: 0x91c7, - 0x33: 0x7280, - 0x34: 0x7815, - 0x35: 0x7826, - 0x36: 0x796d, - 0x37: 0x658e, - 0x38: 0x7d30, - 0x39: 0x83dc, - 0x3a: 0x88c1, - 0x3b: 0x8f09, - 0x3c: 0x969b, - 0x3d: 0x5264, - 0x3e: 0x5728, - 0x3f: 0x6750, - 0x40: 0x7f6a, - 0x41: 0x8ca1, - 0x42: 0x51b4, - 0x43: 0x5742, - 0x44: 0x962a, - 0x45: 0x583a, - 0x46: 0x698a, - 0x47: 0x80b4, - 0x48: 0x54b2, - 0x49: 0x5d0e, - 0x4a: 0x57fc, - 0x4b: 0x7895, - 0x4c: 0x9dfa, - 0x4d: 0x4f5c, - 0x4e: 0x524a, - 0x4f: 0x548b, - 0x50: 0x643e, - 0x51: 0x6628, - 0x52: 0x6714, - 0x53: 0x67f5, - 0x54: 0x7a84, - 0x55: 0x7b56, - 0x56: 0x7d22, - 0x57: 0x932f, - 0x58: 0x685c, - 0x59: 0x9bad, - 0x5a: 0x7b39, - 0x5b: 0x5319, - 0x5c: 0x518a, - 0x5d: 0x5237, - }, - 0x1a: [94]uint16{ - 0x00: 0x5bdf, - 0x01: 0x62f6, - 0x02: 0x64ae, - 0x03: 0x64e6, - 0x04: 0x672d, - 0x05: 0x6bba, - 0x06: 0x85a9, - 0x07: 0x96d1, - 0x08: 0x7690, - 0x09: 0x9bd6, - 0x0a: 0x634c, - 0x0b: 0x9306, - 0x0c: 0x9bab, - 0x0d: 0x76bf, - 0x0e: 0x6652, - 0x0f: 0x4e09, - 0x10: 0x5098, - 0x11: 0x53c2, - 0x12: 0x5c71, - 0x13: 0x60e8, - 0x14: 0x6492, - 0x15: 0x6563, - 0x16: 0x685f, - 0x17: 0x71e6, - 0x18: 0x73ca, - 0x19: 0x7523, - 0x1a: 0x7b97, - 0x1b: 0x7e82, - 0x1c: 0x8695, - 0x1d: 0x8b83, - 0x1e: 0x8cdb, - 0x1f: 0x9178, - 0x20: 0x9910, - 0x21: 0x65ac, - 0x22: 0x66ab, - 0x23: 0x6b8b, - 0x24: 0x4ed5, - 0x25: 0x4ed4, - 0x26: 0x4f3a, - 0x27: 0x4f7f, - 0x28: 0x523a, - 0x29: 0x53f8, - 0x2a: 0x53f2, - 0x2b: 0x55e3, - 0x2c: 0x56db, - 0x2d: 0x58eb, - 0x2e: 0x59cb, - 0x2f: 0x59c9, - 0x30: 0x59ff, - 0x31: 0x5b50, - 0x32: 0x5c4d, - 0x33: 0x5e02, - 0x34: 0x5e2b, - 0x35: 0x5fd7, - 0x36: 0x601d, - 0x37: 0x6307, - 0x38: 0x652f, - 0x39: 0x5b5c, - 0x3a: 0x65af, - 0x3b: 0x65bd, - 0x3c: 0x65e8, - 0x3d: 0x679d, - 0x3e: 0x6b62, - 0x3f: 0x6b7b, - 0x40: 0x6c0f, - 0x41: 0x7345, - 0x42: 0x7949, - 0x43: 0x79c1, - 0x44: 0x7cf8, - 0x45: 0x7d19, - 0x46: 0x7d2b, - 0x47: 0x80a2, - 0x48: 0x8102, - 0x49: 0x81f3, - 0x4a: 0x8996, - 0x4b: 0x8a5e, - 0x4c: 0x8a69, - 0x4d: 0x8a66, - 0x4e: 0x8a8c, - 0x4f: 0x8aee, - 0x50: 0x8cc7, - 0x51: 0x8cdc, - 0x52: 0x96cc, - 0x53: 0x98fc, - 0x54: 0x6b6f, - 0x55: 0x4e8b, - 0x56: 0x4f3c, - 0x57: 0x4f8d, - 0x58: 0x5150, - 0x59: 0x5b57, - 0x5a: 0x5bfa, - 0x5b: 0x6148, - 0x5c: 0x6301, - 0x5d: 0x6642, - }, - 0x1b: [94]uint16{ - 0x00: 0x6b21, - 0x01: 0x6ecb, - 0x02: 0x6cbb, - 0x03: 0x723e, - 0x04: 0x74bd, - 0x05: 0x75d4, - 0x06: 0x78c1, - 0x07: 0x793a, - 0x08: 0x800c, - 0x09: 0x8033, - 0x0a: 0x81ea, - 0x0b: 0x8494, - 0x0c: 0x8f9e, - 0x0d: 0x6c50, - 0x0e: 0x9e7f, - 0x0f: 0x5f0f, - 0x10: 0x8b58, - 0x11: 0x9d2b, - 0x12: 0x7afa, - 0x13: 0x8ef8, - 0x14: 0x5b8d, - 0x15: 0x96eb, - 0x16: 0x4e03, - 0x17: 0x53f1, - 0x18: 0x57f7, - 0x19: 0x5931, - 0x1a: 0x5ac9, - 0x1b: 0x5ba4, - 0x1c: 0x6089, - 0x1d: 0x6e7f, - 0x1e: 0x6f06, - 0x1f: 0x75be, - 0x20: 0x8cea, - 0x21: 0x5b9f, - 0x22: 0x8500, - 0x23: 0x7be0, - 0x24: 0x5072, - 0x25: 0x67f4, - 0x26: 0x829d, - 0x27: 0x5c61, - 0x28: 0x854a, - 0x29: 0x7e1e, - 0x2a: 0x820e, - 0x2b: 0x5199, - 0x2c: 0x5c04, - 0x2d: 0x6368, - 0x2e: 0x8d66, - 0x2f: 0x659c, - 0x30: 0x716e, - 0x31: 0x793e, - 0x32: 0x7d17, - 0x33: 0x8005, - 0x34: 0x8b1d, - 0x35: 0x8eca, - 0x36: 0x906e, - 0x37: 0x86c7, - 0x38: 0x90aa, - 0x39: 0x501f, - 0x3a: 0x52fa, - 0x3b: 0x5c3a, - 0x3c: 0x6753, - 0x3d: 0x707c, - 0x3e: 0x7235, - 0x3f: 0x914c, - 0x40: 0x91c8, - 0x41: 0x932b, - 0x42: 0x82e5, - 0x43: 0x5bc2, - 0x44: 0x5f31, - 0x45: 0x60f9, - 0x46: 0x4e3b, - 0x47: 0x53d6, - 0x48: 0x5b88, - 0x49: 0x624b, - 0x4a: 0x6731, - 0x4b: 0x6b8a, - 0x4c: 0x72e9, - 0x4d: 0x73e0, - 0x4e: 0x7a2e, - 0x4f: 0x816b, - 0x50: 0x8da3, - 0x51: 0x9152, - 0x52: 0x9996, - 0x53: 0x5112, - 0x54: 0x53d7, - 0x55: 0x546a, - 0x56: 0x5bff, - 0x57: 0x6388, - 0x58: 0x6a39, - 0x59: 0x7dac, - 0x5a: 0x9700, - 0x5b: 0x56da, - 0x5c: 0x53ce, - 0x5d: 0x5468, - }, - 0x1c: [94]uint16{ - 0x00: 0x5b97, - 0x01: 0x5c31, - 0x02: 0x5dde, - 0x03: 0x4fee, - 0x04: 0x6101, - 0x05: 0x62fe, - 0x06: 0x6d32, - 0x07: 0x79c0, - 0x08: 0x79cb, - 0x09: 0x7d42, - 0x0a: 0x7e4d, - 0x0b: 0x7fd2, - 0x0c: 0x81ed, - 0x0d: 0x821f, - 0x0e: 0x8490, - 0x0f: 0x8846, - 0x10: 0x8972, - 0x11: 0x8b90, - 0x12: 0x8e74, - 0x13: 0x8f2f, - 0x14: 0x9031, - 0x15: 0x914b, - 0x16: 0x916c, - 0x17: 0x96c6, - 0x18: 0x919c, - 0x19: 0x4ec0, - 0x1a: 0x4f4f, - 0x1b: 0x5145, - 0x1c: 0x5341, - 0x1d: 0x5f93, - 0x1e: 0x620e, - 0x1f: 0x67d4, - 0x20: 0x6c41, - 0x21: 0x6e0b, - 0x22: 0x7363, - 0x23: 0x7e26, - 0x24: 0x91cd, - 0x25: 0x9283, - 0x26: 0x53d4, - 0x27: 0x5919, - 0x28: 0x5bbf, - 0x29: 0x6dd1, - 0x2a: 0x795d, - 0x2b: 0x7e2e, - 0x2c: 0x7c9b, - 0x2d: 0x587e, - 0x2e: 0x719f, - 0x2f: 0x51fa, - 0x30: 0x8853, - 0x31: 0x8ff0, - 0x32: 0x4fca, - 0x33: 0x5cfb, - 0x34: 0x6625, - 0x35: 0x77ac, - 0x36: 0x7ae3, - 0x37: 0x821c, - 0x38: 0x99ff, - 0x39: 0x51c6, - 0x3a: 0x5faa, - 0x3b: 0x65ec, - 0x3c: 0x696f, - 0x3d: 0x6b89, - 0x3e: 0x6df3, - 0x3f: 0x6e96, - 0x40: 0x6f64, - 0x41: 0x76fe, - 0x42: 0x7d14, - 0x43: 0x5de1, - 0x44: 0x9075, - 0x45: 0x9187, - 0x46: 0x9806, - 0x47: 0x51e6, - 0x48: 0x521d, - 0x49: 0x6240, - 0x4a: 0x6691, - 0x4b: 0x66d9, - 0x4c: 0x6e1a, - 0x4d: 0x5eb6, - 0x4e: 0x7dd2, - 0x4f: 0x7f72, - 0x50: 0x66f8, - 0x51: 0x85af, - 0x52: 0x85f7, - 0x53: 0x8af8, - 0x54: 0x52a9, - 0x55: 0x53d9, - 0x56: 0x5973, - 0x57: 0x5e8f, - 0x58: 0x5f90, - 0x59: 0x6055, - 0x5a: 0x92e4, - 0x5b: 0x9664, - 0x5c: 0x50b7, - 0x5d: 0x511f, - }, - 0x1d: [94]uint16{ - 0x00: 0x52dd, - 0x01: 0x5320, - 0x02: 0x5347, - 0x03: 0x53ec, - 0x04: 0x54e8, - 0x05: 0x5546, - 0x06: 0x5531, - 0x07: 0x5617, - 0x08: 0x5968, - 0x09: 0x59be, - 0x0a: 0x5a3c, - 0x0b: 0x5bb5, - 0x0c: 0x5c06, - 0x0d: 0x5c0f, - 0x0e: 0x5c11, - 0x0f: 0x5c1a, - 0x10: 0x5e84, - 0x11: 0x5e8a, - 0x12: 0x5ee0, - 0x13: 0x5f70, - 0x14: 0x627f, - 0x15: 0x6284, - 0x16: 0x62db, - 0x17: 0x638c, - 0x18: 0x6377, - 0x19: 0x6607, - 0x1a: 0x660c, - 0x1b: 0x662d, - 0x1c: 0x6676, - 0x1d: 0x677e, - 0x1e: 0x68a2, - 0x1f: 0x6a1f, - 0x20: 0x6a35, - 0x21: 0x6cbc, - 0x22: 0x6d88, - 0x23: 0x6e09, - 0x24: 0x6e58, - 0x25: 0x713c, - 0x26: 0x7126, - 0x27: 0x7167, - 0x28: 0x75c7, - 0x29: 0x7701, - 0x2a: 0x785d, - 0x2b: 0x7901, - 0x2c: 0x7965, - 0x2d: 0x79f0, - 0x2e: 0x7ae0, - 0x2f: 0x7b11, - 0x30: 0x7ca7, - 0x31: 0x7d39, - 0x32: 0x8096, - 0x33: 0x83d6, - 0x34: 0x848b, - 0x35: 0x8549, - 0x36: 0x885d, - 0x37: 0x88f3, - 0x38: 0x8a1f, - 0x39: 0x8a3c, - 0x3a: 0x8a54, - 0x3b: 0x8a73, - 0x3c: 0x8c61, - 0x3d: 0x8cde, - 0x3e: 0x91a4, - 0x3f: 0x9266, - 0x40: 0x937e, - 0x41: 0x9418, - 0x42: 0x969c, - 0x43: 0x9798, - 0x44: 0x4e0a, - 0x45: 0x4e08, - 0x46: 0x4e1e, - 0x47: 0x4e57, - 0x48: 0x5197, - 0x49: 0x5270, - 0x4a: 0x57ce, - 0x4b: 0x5834, - 0x4c: 0x58cc, - 0x4d: 0x5b22, - 0x4e: 0x5e38, - 0x4f: 0x60c5, - 0x50: 0x64fe, - 0x51: 0x6761, - 0x52: 0x6756, - 0x53: 0x6d44, - 0x54: 0x72b6, - 0x55: 0x7573, - 0x56: 0x7a63, - 0x57: 0x84b8, - 0x58: 0x8b72, - 0x59: 0x91b8, - 0x5a: 0x9320, - 0x5b: 0x5631, - 0x5c: 0x57f4, - 0x5d: 0x98fe, - }, - 0x1e: [94]uint16{ - 0x00: 0x62ed, - 0x01: 0x690d, - 0x02: 0x6b96, - 0x03: 0x71ed, - 0x04: 0x7e54, - 0x05: 0x8077, - 0x06: 0x8272, - 0x07: 0x89e6, - 0x08: 0x98df, - 0x09: 0x8755, - 0x0a: 0x8fb1, - 0x0b: 0x5c3b, - 0x0c: 0x4f38, - 0x0d: 0x4fe1, - 0x0e: 0x4fb5, - 0x0f: 0x5507, - 0x10: 0x5a20, - 0x11: 0x5bdd, - 0x12: 0x5be9, - 0x13: 0x5fc3, - 0x14: 0x614e, - 0x15: 0x632f, - 0x16: 0x65b0, - 0x17: 0x664b, - 0x18: 0x68ee, - 0x19: 0x699b, - 0x1a: 0x6d78, - 0x1b: 0x6df1, - 0x1c: 0x7533, - 0x1d: 0x75b9, - 0x1e: 0x771f, - 0x1f: 0x795e, - 0x20: 0x79e6, - 0x21: 0x7d33, - 0x22: 0x81e3, - 0x23: 0x82af, - 0x24: 0x85aa, - 0x25: 0x89aa, - 0x26: 0x8a3a, - 0x27: 0x8eab, - 0x28: 0x8f9b, - 0x29: 0x9032, - 0x2a: 0x91dd, - 0x2b: 0x9707, - 0x2c: 0x4eba, - 0x2d: 0x4ec1, - 0x2e: 0x5203, - 0x2f: 0x5875, - 0x30: 0x58ec, - 0x31: 0x5c0b, - 0x32: 0x751a, - 0x33: 0x5c3d, - 0x34: 0x814e, - 0x35: 0x8a0a, - 0x36: 0x8fc5, - 0x37: 0x9663, - 0x38: 0x976d, - 0x39: 0x7b25, - 0x3a: 0x8acf, - 0x3b: 0x9808, - 0x3c: 0x9162, - 0x3d: 0x56f3, - 0x3e: 0x53a8, - 0x3f: 0x9017, - 0x40: 0x5439, - 0x41: 0x5782, - 0x42: 0x5e25, - 0x43: 0x63a8, - 0x44: 0x6c34, - 0x45: 0x708a, - 0x46: 0x7761, - 0x47: 0x7c8b, - 0x48: 0x7fe0, - 0x49: 0x8870, - 0x4a: 0x9042, - 0x4b: 0x9154, - 0x4c: 0x9310, - 0x4d: 0x9318, - 0x4e: 0x968f, - 0x4f: 0x745e, - 0x50: 0x9ac4, - 0x51: 0x5d07, - 0x52: 0x5d69, - 0x53: 0x6570, - 0x54: 0x67a2, - 0x55: 0x8da8, - 0x56: 0x96db, - 0x57: 0x636e, - 0x58: 0x6749, - 0x59: 0x6919, - 0x5a: 0x83c5, - 0x5b: 0x9817, - 0x5c: 0x96c0, - 0x5d: 0x88fe, - }, - 0x1f: [94]uint16{ - 0x00: 0x6f84, - 0x01: 0x647a, - 0x02: 0x5bf8, - 0x03: 0x4e16, - 0x04: 0x702c, - 0x05: 0x755d, - 0x06: 0x662f, - 0x07: 0x51c4, - 0x08: 0x5236, - 0x09: 0x52e2, - 0x0a: 0x59d3, - 0x0b: 0x5f81, - 0x0c: 0x6027, - 0x0d: 0x6210, - 0x0e: 0x653f, - 0x0f: 0x6574, - 0x10: 0x661f, - 0x11: 0x6674, - 0x12: 0x68f2, - 0x13: 0x6816, - 0x14: 0x6b63, - 0x15: 0x6e05, - 0x16: 0x7272, - 0x17: 0x751f, - 0x18: 0x76db, - 0x19: 0x7cbe, - 0x1a: 0x8056, - 0x1b: 0x58f0, - 0x1c: 0x88fd, - 0x1d: 0x897f, - 0x1e: 0x8aa0, - 0x1f: 0x8a93, - 0x20: 0x8acb, - 0x21: 0x901d, - 0x22: 0x9192, - 0x23: 0x9752, - 0x24: 0x9759, - 0x25: 0x6589, - 0x26: 0x7a0e, - 0x27: 0x8106, - 0x28: 0x96bb, - 0x29: 0x5e2d, - 0x2a: 0x60dc, - 0x2b: 0x621a, - 0x2c: 0x65a5, - 0x2d: 0x6614, - 0x2e: 0x6790, - 0x2f: 0x77f3, - 0x30: 0x7a4d, - 0x31: 0x7c4d, - 0x32: 0x7e3e, - 0x33: 0x810a, - 0x34: 0x8cac, - 0x35: 0x8d64, - 0x36: 0x8de1, - 0x37: 0x8e5f, - 0x38: 0x78a9, - 0x39: 0x5207, - 0x3a: 0x62d9, - 0x3b: 0x63a5, - 0x3c: 0x6442, - 0x3d: 0x6298, - 0x3e: 0x8a2d, - 0x3f: 0x7a83, - 0x40: 0x7bc0, - 0x41: 0x8aac, - 0x42: 0x96ea, - 0x43: 0x7d76, - 0x44: 0x820c, - 0x45: 0x8749, - 0x46: 0x4ed9, - 0x47: 0x5148, - 0x48: 0x5343, - 0x49: 0x5360, - 0x4a: 0x5ba3, - 0x4b: 0x5c02, - 0x4c: 0x5c16, - 0x4d: 0x5ddd, - 0x4e: 0x6226, - 0x4f: 0x6247, - 0x50: 0x64b0, - 0x51: 0x6813, - 0x52: 0x6834, - 0x53: 0x6cc9, - 0x54: 0x6d45, - 0x55: 0x6d17, - 0x56: 0x67d3, - 0x57: 0x6f5c, - 0x58: 0x714e, - 0x59: 0x717d, - 0x5a: 0x65cb, - 0x5b: 0x7a7f, - 0x5c: 0x7bad, - 0x5d: 0x7dda, - }, - 0x20: [94]uint16{ - 0x00: 0x7e4a, - 0x01: 0x7fa8, - 0x02: 0x817a, - 0x03: 0x821b, - 0x04: 0x8239, - 0x05: 0x85a6, - 0x06: 0x8a6e, - 0x07: 0x8cce, - 0x08: 0x8df5, - 0x09: 0x9078, - 0x0a: 0x9077, - 0x0b: 0x92ad, - 0x0c: 0x9291, - 0x0d: 0x9583, - 0x0e: 0x9bae, - 0x0f: 0x524d, - 0x10: 0x5584, - 0x11: 0x6f38, - 0x12: 0x7136, - 0x13: 0x5168, - 0x14: 0x7985, - 0x15: 0x7e55, - 0x16: 0x81b3, - 0x17: 0x7cce, - 0x18: 0x564c, - 0x19: 0x5851, - 0x1a: 0x5ca8, - 0x1b: 0x63aa, - 0x1c: 0x66fe, - 0x1d: 0x66fd, - 0x1e: 0x695a, - 0x1f: 0x72d9, - 0x20: 0x758f, - 0x21: 0x758e, - 0x22: 0x790e, - 0x23: 0x7956, - 0x24: 0x79df, - 0x25: 0x7c97, - 0x26: 0x7d20, - 0x27: 0x7d44, - 0x28: 0x8607, - 0x29: 0x8a34, - 0x2a: 0x963b, - 0x2b: 0x9061, - 0x2c: 0x9f20, - 0x2d: 0x50e7, - 0x2e: 0x5275, - 0x2f: 0x53cc, - 0x30: 0x53e2, - 0x31: 0x5009, - 0x32: 0x55aa, - 0x33: 0x58ee, - 0x34: 0x594f, - 0x35: 0x723d, - 0x36: 0x5b8b, - 0x37: 0x5c64, - 0x38: 0x531d, - 0x39: 0x60e3, - 0x3a: 0x60f3, - 0x3b: 0x635c, - 0x3c: 0x6383, - 0x3d: 0x633f, - 0x3e: 0x63bb, - 0x3f: 0x64cd, - 0x40: 0x65e9, - 0x41: 0x66f9, - 0x42: 0x5de3, - 0x43: 0x69cd, - 0x44: 0x69fd, - 0x45: 0x6f15, - 0x46: 0x71e5, - 0x47: 0x4e89, - 0x48: 0x75e9, - 0x49: 0x76f8, - 0x4a: 0x7a93, - 0x4b: 0x7cdf, - 0x4c: 0x7dcf, - 0x4d: 0x7d9c, - 0x4e: 0x8061, - 0x4f: 0x8349, - 0x50: 0x8358, - 0x51: 0x846c, - 0x52: 0x84bc, - 0x53: 0x85fb, - 0x54: 0x88c5, - 0x55: 0x8d70, - 0x56: 0x9001, - 0x57: 0x906d, - 0x58: 0x9397, - 0x59: 0x971c, - 0x5a: 0x9a12, - 0x5b: 0x50cf, - 0x5c: 0x5897, - 0x5d: 0x618e, - }, - 0x21: [94]uint16{ - 0x00: 0x81d3, - 0x01: 0x8535, - 0x02: 0x8d08, - 0x03: 0x9020, - 0x04: 0x4fc3, - 0x05: 0x5074, - 0x06: 0x5247, - 0x07: 0x5373, - 0x08: 0x606f, - 0x09: 0x6349, - 0x0a: 0x675f, - 0x0b: 0x6e2c, - 0x0c: 0x8db3, - 0x0d: 0x901f, - 0x0e: 0x4fd7, - 0x0f: 0x5c5e, - 0x10: 0x8cca, - 0x11: 0x65cf, - 0x12: 0x7d9a, - 0x13: 0x5352, - 0x14: 0x8896, - 0x15: 0x5176, - 0x16: 0x63c3, - 0x17: 0x5b58, - 0x18: 0x5b6b, - 0x19: 0x5c0a, - 0x1a: 0x640d, - 0x1b: 0x6751, - 0x1c: 0x905c, - 0x1d: 0x4ed6, - 0x1e: 0x591a, - 0x1f: 0x592a, - 0x20: 0x6c70, - 0x21: 0x8a51, - 0x22: 0x553e, - 0x23: 0x5815, - 0x24: 0x59a5, - 0x25: 0x60f0, - 0x26: 0x6253, - 0x27: 0x67c1, - 0x28: 0x8235, - 0x29: 0x6955, - 0x2a: 0x9640, - 0x2b: 0x99c4, - 0x2c: 0x9a28, - 0x2d: 0x4f53, - 0x2e: 0x5806, - 0x2f: 0x5bfe, - 0x30: 0x8010, - 0x31: 0x5cb1, - 0x32: 0x5e2f, - 0x33: 0x5f85, - 0x34: 0x6020, - 0x35: 0x614b, - 0x36: 0x6234, - 0x37: 0x66ff, - 0x38: 0x6cf0, - 0x39: 0x6ede, - 0x3a: 0x80ce, - 0x3b: 0x817f, - 0x3c: 0x82d4, - 0x3d: 0x888b, - 0x3e: 0x8cb8, - 0x3f: 0x9000, - 0x40: 0x902e, - 0x41: 0x968a, - 0x42: 0x9edb, - 0x43: 0x9bdb, - 0x44: 0x4ee3, - 0x45: 0x53f0, - 0x46: 0x5927, - 0x47: 0x7b2c, - 0x48: 0x918d, - 0x49: 0x984c, - 0x4a: 0x9df9, - 0x4b: 0x6edd, - 0x4c: 0x7027, - 0x4d: 0x5353, - 0x4e: 0x5544, - 0x4f: 0x5b85, - 0x50: 0x6258, - 0x51: 0x629e, - 0x52: 0x62d3, - 0x53: 0x6ca2, - 0x54: 0x6fef, - 0x55: 0x7422, - 0x56: 0x8a17, - 0x57: 0x9438, - 0x58: 0x6fc1, - 0x59: 0x8afe, - 0x5a: 0x8338, - 0x5b: 0x51e7, - 0x5c: 0x86f8, - 0x5d: 0x53ea, - }, - 0x22: [94]uint16{ - 0x00: 0x53e9, - 0x01: 0x4f46, - 0x02: 0x9054, - 0x03: 0x8fb0, - 0x04: 0x596a, - 0x05: 0x8131, - 0x06: 0x5dfd, - 0x07: 0x7aea, - 0x08: 0x8fbf, - 0x09: 0x68da, - 0x0a: 0x8c37, - 0x0b: 0x72f8, - 0x0c: 0x9c48, - 0x0d: 0x6a3d, - 0x0e: 0x8ab0, - 0x0f: 0x4e39, - 0x10: 0x5358, - 0x11: 0x5606, - 0x12: 0x5766, - 0x13: 0x62c5, - 0x14: 0x63a2, - 0x15: 0x65e6, - 0x16: 0x6b4e, - 0x17: 0x6de1, - 0x18: 0x6e5b, - 0x19: 0x70ad, - 0x1a: 0x77ed, - 0x1b: 0x7aef, - 0x1c: 0x7baa, - 0x1d: 0x7dbb, - 0x1e: 0x803d, - 0x1f: 0x80c6, - 0x20: 0x86cb, - 0x21: 0x8a95, - 0x22: 0x935b, - 0x23: 0x56e3, - 0x24: 0x58c7, - 0x25: 0x5f3e, - 0x26: 0x65ad, - 0x27: 0x6696, - 0x28: 0x6a80, - 0x29: 0x6bb5, - 0x2a: 0x7537, - 0x2b: 0x8ac7, - 0x2c: 0x5024, - 0x2d: 0x77e5, - 0x2e: 0x5730, - 0x2f: 0x5f1b, - 0x30: 0x6065, - 0x31: 0x667a, - 0x32: 0x6c60, - 0x33: 0x75f4, - 0x34: 0x7a1a, - 0x35: 0x7f6e, - 0x36: 0x81f4, - 0x37: 0x8718, - 0x38: 0x9045, - 0x39: 0x99b3, - 0x3a: 0x7bc9, - 0x3b: 0x755c, - 0x3c: 0x7af9, - 0x3d: 0x7b51, - 0x3e: 0x84c4, - 0x3f: 0x9010, - 0x40: 0x79e9, - 0x41: 0x7a92, - 0x42: 0x8336, - 0x43: 0x5ae1, - 0x44: 0x7740, - 0x45: 0x4e2d, - 0x46: 0x4ef2, - 0x47: 0x5b99, - 0x48: 0x5fe0, - 0x49: 0x62bd, - 0x4a: 0x663c, - 0x4b: 0x67f1, - 0x4c: 0x6ce8, - 0x4d: 0x866b, - 0x4e: 0x8877, - 0x4f: 0x8a3b, - 0x50: 0x914e, - 0x51: 0x92f3, - 0x52: 0x99d0, - 0x53: 0x6a17, - 0x54: 0x7026, - 0x55: 0x732a, - 0x56: 0x82e7, - 0x57: 0x8457, - 0x58: 0x8caf, - 0x59: 0x4e01, - 0x5a: 0x5146, - 0x5b: 0x51cb, - 0x5c: 0x558b, - 0x5d: 0x5bf5, - }, - 0x23: [94]uint16{ - 0x00: 0x5e16, - 0x01: 0x5e33, - 0x02: 0x5e81, - 0x03: 0x5f14, - 0x04: 0x5f35, - 0x05: 0x5f6b, - 0x06: 0x5fb4, - 0x07: 0x61f2, - 0x08: 0x6311, - 0x09: 0x66a2, - 0x0a: 0x671d, - 0x0b: 0x6f6e, - 0x0c: 0x7252, - 0x0d: 0x753a, - 0x0e: 0x773a, - 0x0f: 0x8074, - 0x10: 0x8139, - 0x11: 0x8178, - 0x12: 0x8776, - 0x13: 0x8abf, - 0x14: 0x8adc, - 0x15: 0x8d85, - 0x16: 0x8df3, - 0x17: 0x929a, - 0x18: 0x9577, - 0x19: 0x9802, - 0x1a: 0x9ce5, - 0x1b: 0x52c5, - 0x1c: 0x6357, - 0x1d: 0x76f4, - 0x1e: 0x6715, - 0x1f: 0x6c88, - 0x20: 0x73cd, - 0x21: 0x8cc3, - 0x22: 0x93ae, - 0x23: 0x9673, - 0x24: 0x6d25, - 0x25: 0x589c, - 0x26: 0x690e, - 0x27: 0x69cc, - 0x28: 0x8ffd, - 0x29: 0x939a, - 0x2a: 0x75db, - 0x2b: 0x901a, - 0x2c: 0x585a, - 0x2d: 0x6802, - 0x2e: 0x63b4, - 0x2f: 0x69fb, - 0x30: 0x4f43, - 0x31: 0x6f2c, - 0x32: 0x67d8, - 0x33: 0x8fbb, - 0x34: 0x8526, - 0x35: 0x7db4, - 0x36: 0x9354, - 0x37: 0x693f, - 0x38: 0x6f70, - 0x39: 0x576a, - 0x3a: 0x58f7, - 0x3b: 0x5b2c, - 0x3c: 0x7d2c, - 0x3d: 0x722a, - 0x3e: 0x540a, - 0x3f: 0x91e3, - 0x40: 0x9db4, - 0x41: 0x4ead, - 0x42: 0x4f4e, - 0x43: 0x505c, - 0x44: 0x5075, - 0x45: 0x5243, - 0x46: 0x8c9e, - 0x47: 0x5448, - 0x48: 0x5824, - 0x49: 0x5b9a, - 0x4a: 0x5e1d, - 0x4b: 0x5e95, - 0x4c: 0x5ead, - 0x4d: 0x5ef7, - 0x4e: 0x5f1f, - 0x4f: 0x608c, - 0x50: 0x62b5, - 0x51: 0x633a, - 0x52: 0x63d0, - 0x53: 0x68af, - 0x54: 0x6c40, - 0x55: 0x7887, - 0x56: 0x798e, - 0x57: 0x7a0b, - 0x58: 0x7de0, - 0x59: 0x8247, - 0x5a: 0x8a02, - 0x5b: 0x8ae6, - 0x5c: 0x8e44, - 0x5d: 0x9013, - }, - 0x24: [94]uint16{ - 0x00: 0x90b8, - 0x01: 0x912d, - 0x02: 0x91d8, - 0x03: 0x9f0e, - 0x04: 0x6ce5, - 0x05: 0x6458, - 0x06: 0x64e2, - 0x07: 0x6575, - 0x08: 0x6ef4, - 0x09: 0x7684, - 0x0a: 0x7b1b, - 0x0b: 0x9069, - 0x0c: 0x93d1, - 0x0d: 0x6eba, - 0x0e: 0x54f2, - 0x0f: 0x5fb9, - 0x10: 0x64a4, - 0x11: 0x8f4d, - 0x12: 0x8fed, - 0x13: 0x9244, - 0x14: 0x5178, - 0x15: 0x586b, - 0x16: 0x5929, - 0x17: 0x5c55, - 0x18: 0x5e97, - 0x19: 0x6dfb, - 0x1a: 0x7e8f, - 0x1b: 0x751c, - 0x1c: 0x8cbc, - 0x1d: 0x8ee2, - 0x1e: 0x985b, - 0x1f: 0x70b9, - 0x20: 0x4f1d, - 0x21: 0x6bbf, - 0x22: 0x6fb1, - 0x23: 0x7530, - 0x24: 0x96fb, - 0x25: 0x514e, - 0x26: 0x5410, - 0x27: 0x5835, - 0x28: 0x5857, - 0x29: 0x59ac, - 0x2a: 0x5c60, - 0x2b: 0x5f92, - 0x2c: 0x6597, - 0x2d: 0x675c, - 0x2e: 0x6e21, - 0x2f: 0x767b, - 0x30: 0x83df, - 0x31: 0x8ced, - 0x32: 0x9014, - 0x33: 0x90fd, - 0x34: 0x934d, - 0x35: 0x7825, - 0x36: 0x783a, - 0x37: 0x52aa, - 0x38: 0x5ea6, - 0x39: 0x571f, - 0x3a: 0x5974, - 0x3b: 0x6012, - 0x3c: 0x5012, - 0x3d: 0x515a, - 0x3e: 0x51ac, - 0x3f: 0x51cd, - 0x40: 0x5200, - 0x41: 0x5510, - 0x42: 0x5854, - 0x43: 0x5858, - 0x44: 0x5957, - 0x45: 0x5b95, - 0x46: 0x5cf6, - 0x47: 0x5d8b, - 0x48: 0x60bc, - 0x49: 0x6295, - 0x4a: 0x642d, - 0x4b: 0x6771, - 0x4c: 0x6843, - 0x4d: 0x68bc, - 0x4e: 0x68df, - 0x4f: 0x76d7, - 0x50: 0x6dd8, - 0x51: 0x6e6f, - 0x52: 0x6d9b, - 0x53: 0x706f, - 0x54: 0x71c8, - 0x55: 0x5f53, - 0x56: 0x75d8, - 0x57: 0x7977, - 0x58: 0x7b49, - 0x59: 0x7b54, - 0x5a: 0x7b52, - 0x5b: 0x7cd6, - 0x5c: 0x7d71, - 0x5d: 0x5230, - }, - 0x25: [94]uint16{ - 0x00: 0x8463, - 0x01: 0x8569, - 0x02: 0x85e4, - 0x03: 0x8a0e, - 0x04: 0x8b04, - 0x05: 0x8c46, - 0x06: 0x8e0f, - 0x07: 0x9003, - 0x08: 0x900f, - 0x09: 0x9419, - 0x0a: 0x9676, - 0x0b: 0x982d, - 0x0c: 0x9a30, - 0x0d: 0x95d8, - 0x0e: 0x50cd, - 0x0f: 0x52d5, - 0x10: 0x540c, - 0x11: 0x5802, - 0x12: 0x5c0e, - 0x13: 0x61a7, - 0x14: 0x649e, - 0x15: 0x6d1e, - 0x16: 0x77b3, - 0x17: 0x7ae5, - 0x18: 0x80f4, - 0x19: 0x8404, - 0x1a: 0x9053, - 0x1b: 0x9285, - 0x1c: 0x5ce0, - 0x1d: 0x9d07, - 0x1e: 0x533f, - 0x1f: 0x5f97, - 0x20: 0x5fb3, - 0x21: 0x6d9c, - 0x22: 0x7279, - 0x23: 0x7763, - 0x24: 0x79bf, - 0x25: 0x7be4, - 0x26: 0x6bd2, - 0x27: 0x72ec, - 0x28: 0x8aad, - 0x29: 0x6803, - 0x2a: 0x6a61, - 0x2b: 0x51f8, - 0x2c: 0x7a81, - 0x2d: 0x6934, - 0x2e: 0x5c4a, - 0x2f: 0x9cf6, - 0x30: 0x82eb, - 0x31: 0x5bc5, - 0x32: 0x9149, - 0x33: 0x701e, - 0x34: 0x5678, - 0x35: 0x5c6f, - 0x36: 0x60c7, - 0x37: 0x6566, - 0x38: 0x6c8c, - 0x39: 0x8c5a, - 0x3a: 0x9041, - 0x3b: 0x9813, - 0x3c: 0x5451, - 0x3d: 0x66c7, - 0x3e: 0x920d, - 0x3f: 0x5948, - 0x40: 0x90a3, - 0x41: 0x5185, - 0x42: 0x4e4d, - 0x43: 0x51ea, - 0x44: 0x8599, - 0x45: 0x8b0e, - 0x46: 0x7058, - 0x47: 0x637a, - 0x48: 0x934b, - 0x49: 0x6962, - 0x4a: 0x99b4, - 0x4b: 0x7e04, - 0x4c: 0x7577, - 0x4d: 0x5357, - 0x4e: 0x6960, - 0x4f: 0x8edf, - 0x50: 0x96e3, - 0x51: 0x6c5d, - 0x52: 0x4e8c, - 0x53: 0x5c3c, - 0x54: 0x5f10, - 0x55: 0x8fe9, - 0x56: 0x5302, - 0x57: 0x8cd1, - 0x58: 0x8089, - 0x59: 0x8679, - 0x5a: 0x5eff, - 0x5b: 0x65e5, - 0x5c: 0x4e73, - 0x5d: 0x5165, - }, - 0x26: [94]uint16{ - 0x00: 0x5982, - 0x01: 0x5c3f, - 0x02: 0x97ee, - 0x03: 0x4efb, - 0x04: 0x598a, - 0x05: 0x5fcd, - 0x06: 0x8a8d, - 0x07: 0x6fe1, - 0x08: 0x79b0, - 0x09: 0x7962, - 0x0a: 0x5be7, - 0x0b: 0x8471, - 0x0c: 0x732b, - 0x0d: 0x71b1, - 0x0e: 0x5e74, - 0x0f: 0x5ff5, - 0x10: 0x637b, - 0x11: 0x649a, - 0x12: 0x71c3, - 0x13: 0x7c98, - 0x14: 0x4e43, - 0x15: 0x5efc, - 0x16: 0x4e4b, - 0x17: 0x57dc, - 0x18: 0x56a2, - 0x19: 0x60a9, - 0x1a: 0x6fc3, - 0x1b: 0x7d0d, - 0x1c: 0x80fd, - 0x1d: 0x8133, - 0x1e: 0x81bf, - 0x1f: 0x8fb2, - 0x20: 0x8997, - 0x21: 0x86a4, - 0x22: 0x5df4, - 0x23: 0x628a, - 0x24: 0x64ad, - 0x25: 0x8987, - 0x26: 0x6777, - 0x27: 0x6ce2, - 0x28: 0x6d3e, - 0x29: 0x7436, - 0x2a: 0x7834, - 0x2b: 0x5a46, - 0x2c: 0x7f75, - 0x2d: 0x82ad, - 0x2e: 0x99ac, - 0x2f: 0x4ff3, - 0x30: 0x5ec3, - 0x31: 0x62dd, - 0x32: 0x6392, - 0x33: 0x6557, - 0x34: 0x676f, - 0x35: 0x76c3, - 0x36: 0x724c, - 0x37: 0x80cc, - 0x38: 0x80ba, - 0x39: 0x8f29, - 0x3a: 0x914d, - 0x3b: 0x500d, - 0x3c: 0x57f9, - 0x3d: 0x5a92, - 0x3e: 0x6885, - 0x3f: 0x6973, - 0x40: 0x7164, - 0x41: 0x72fd, - 0x42: 0x8cb7, - 0x43: 0x58f2, - 0x44: 0x8ce0, - 0x45: 0x966a, - 0x46: 0x9019, - 0x47: 0x877f, - 0x48: 0x79e4, - 0x49: 0x77e7, - 0x4a: 0x8429, - 0x4b: 0x4f2f, - 0x4c: 0x5265, - 0x4d: 0x535a, - 0x4e: 0x62cd, - 0x4f: 0x67cf, - 0x50: 0x6cca, - 0x51: 0x767d, - 0x52: 0x7b94, - 0x53: 0x7c95, - 0x54: 0x8236, - 0x55: 0x8584, - 0x56: 0x8feb, - 0x57: 0x66dd, - 0x58: 0x6f20, - 0x59: 0x7206, - 0x5a: 0x7e1b, - 0x5b: 0x83ab, - 0x5c: 0x99c1, - 0x5d: 0x9ea6, - }, - 0x27: [94]uint16{ - 0x00: 0x51fd, - 0x01: 0x7bb1, - 0x02: 0x7872, - 0x03: 0x7bb8, - 0x04: 0x8087, - 0x05: 0x7b48, - 0x06: 0x6ae8, - 0x07: 0x5e61, - 0x08: 0x808c, - 0x09: 0x7551, - 0x0a: 0x7560, - 0x0b: 0x516b, - 0x0c: 0x9262, - 0x0d: 0x6e8c, - 0x0e: 0x767a, - 0x0f: 0x9197, - 0x10: 0x9aea, - 0x11: 0x4f10, - 0x12: 0x7f70, - 0x13: 0x629c, - 0x14: 0x7b4f, - 0x15: 0x95a5, - 0x16: 0x9ce9, - 0x17: 0x567a, - 0x18: 0x5859, - 0x19: 0x86e4, - 0x1a: 0x96bc, - 0x1b: 0x4f34, - 0x1c: 0x5224, - 0x1d: 0x534a, - 0x1e: 0x53cd, - 0x1f: 0x53db, - 0x20: 0x5e06, - 0x21: 0x642c, - 0x22: 0x6591, - 0x23: 0x677f, - 0x24: 0x6c3e, - 0x25: 0x6c4e, - 0x26: 0x7248, - 0x27: 0x72af, - 0x28: 0x73ed, - 0x29: 0x7554, - 0x2a: 0x7e41, - 0x2b: 0x822c, - 0x2c: 0x85e9, - 0x2d: 0x8ca9, - 0x2e: 0x7bc4, - 0x2f: 0x91c6, - 0x30: 0x7169, - 0x31: 0x9812, - 0x32: 0x98ef, - 0x33: 0x633d, - 0x34: 0x6669, - 0x35: 0x756a, - 0x36: 0x76e4, - 0x37: 0x78d0, - 0x38: 0x8543, - 0x39: 0x86ee, - 0x3a: 0x532a, - 0x3b: 0x5351, - 0x3c: 0x5426, - 0x3d: 0x5983, - 0x3e: 0x5e87, - 0x3f: 0x5f7c, - 0x40: 0x60b2, - 0x41: 0x6249, - 0x42: 0x6279, - 0x43: 0x62ab, - 0x44: 0x6590, - 0x45: 0x6bd4, - 0x46: 0x6ccc, - 0x47: 0x75b2, - 0x48: 0x76ae, - 0x49: 0x7891, - 0x4a: 0x79d8, - 0x4b: 0x7dcb, - 0x4c: 0x7f77, - 0x4d: 0x80a5, - 0x4e: 0x88ab, - 0x4f: 0x8ab9, - 0x50: 0x8cbb, - 0x51: 0x907f, - 0x52: 0x975e, - 0x53: 0x98db, - 0x54: 0x6a0b, - 0x55: 0x7c38, - 0x56: 0x5099, - 0x57: 0x5c3e, - 0x58: 0x5fae, - 0x59: 0x6787, - 0x5a: 0x6bd8, - 0x5b: 0x7435, - 0x5c: 0x7709, - 0x5d: 0x7f8e, - }, - 0x28: [94]uint16{ - 0x00: 0x9f3b, - 0x01: 0x67ca, - 0x02: 0x7a17, - 0x03: 0x5339, - 0x04: 0x758b, - 0x05: 0x9aed, - 0x06: 0x5f66, - 0x07: 0x819d, - 0x08: 0x83f1, - 0x09: 0x8098, - 0x0a: 0x5f3c, - 0x0b: 0x5fc5, - 0x0c: 0x7562, - 0x0d: 0x7b46, - 0x0e: 0x903c, - 0x0f: 0x6867, - 0x10: 0x59eb, - 0x11: 0x5a9b, - 0x12: 0x7d10, - 0x13: 0x767e, - 0x14: 0x8b2c, - 0x15: 0x4ff5, - 0x16: 0x5f6a, - 0x17: 0x6a19, - 0x18: 0x6c37, - 0x19: 0x6f02, - 0x1a: 0x74e2, - 0x1b: 0x7968, - 0x1c: 0x8868, - 0x1d: 0x8a55, - 0x1e: 0x8c79, - 0x1f: 0x5edf, - 0x20: 0x63cf, - 0x21: 0x75c5, - 0x22: 0x79d2, - 0x23: 0x82d7, - 0x24: 0x9328, - 0x25: 0x92f2, - 0x26: 0x849c, - 0x27: 0x86ed, - 0x28: 0x9c2d, - 0x29: 0x54c1, - 0x2a: 0x5f6c, - 0x2b: 0x658c, - 0x2c: 0x6d5c, - 0x2d: 0x7015, - 0x2e: 0x8ca7, - 0x2f: 0x8cd3, - 0x30: 0x983b, - 0x31: 0x654f, - 0x32: 0x74f6, - 0x33: 0x4e0d, - 0x34: 0x4ed8, - 0x35: 0x57e0, - 0x36: 0x592b, - 0x37: 0x5a66, - 0x38: 0x5bcc, - 0x39: 0x51a8, - 0x3a: 0x5e03, - 0x3b: 0x5e9c, - 0x3c: 0x6016, - 0x3d: 0x6276, - 0x3e: 0x6577, - 0x3f: 0x65a7, - 0x40: 0x666e, - 0x41: 0x6d6e, - 0x42: 0x7236, - 0x43: 0x7b26, - 0x44: 0x8150, - 0x45: 0x819a, - 0x46: 0x8299, - 0x47: 0x8b5c, - 0x48: 0x8ca0, - 0x49: 0x8ce6, - 0x4a: 0x8d74, - 0x4b: 0x961c, - 0x4c: 0x9644, - 0x4d: 0x4fae, - 0x4e: 0x64ab, - 0x4f: 0x6b66, - 0x50: 0x821e, - 0x51: 0x8461, - 0x52: 0x856a, - 0x53: 0x90e8, - 0x54: 0x5c01, - 0x55: 0x6953, - 0x56: 0x98a8, - 0x57: 0x847a, - 0x58: 0x8557, - 0x59: 0x4f0f, - 0x5a: 0x526f, - 0x5b: 0x5fa9, - 0x5c: 0x5e45, - 0x5d: 0x670d, - }, - 0x29: [94]uint16{ - 0x00: 0x798f, - 0x01: 0x8179, - 0x02: 0x8907, - 0x03: 0x8986, - 0x04: 0x6df5, - 0x05: 0x5f17, - 0x06: 0x6255, - 0x07: 0x6cb8, - 0x08: 0x4ecf, - 0x09: 0x7269, - 0x0a: 0x9b92, - 0x0b: 0x5206, - 0x0c: 0x543b, - 0x0d: 0x5674, - 0x0e: 0x58b3, - 0x0f: 0x61a4, - 0x10: 0x626e, - 0x11: 0x711a, - 0x12: 0x596e, - 0x13: 0x7c89, - 0x14: 0x7cde, - 0x15: 0x7d1b, - 0x16: 0x96f0, - 0x17: 0x6587, - 0x18: 0x805e, - 0x19: 0x4e19, - 0x1a: 0x4f75, - 0x1b: 0x5175, - 0x1c: 0x5840, - 0x1d: 0x5e63, - 0x1e: 0x5e73, - 0x1f: 0x5f0a, - 0x20: 0x67c4, - 0x21: 0x4e26, - 0x22: 0x853d, - 0x23: 0x9589, - 0x24: 0x965b, - 0x25: 0x7c73, - 0x26: 0x9801, - 0x27: 0x50fb, - 0x28: 0x58c1, - 0x29: 0x7656, - 0x2a: 0x78a7, - 0x2b: 0x5225, - 0x2c: 0x77a5, - 0x2d: 0x8511, - 0x2e: 0x7b86, - 0x2f: 0x504f, - 0x30: 0x5909, - 0x31: 0x7247, - 0x32: 0x7bc7, - 0x33: 0x7de8, - 0x34: 0x8fba, - 0x35: 0x8fd4, - 0x36: 0x904d, - 0x37: 0x4fbf, - 0x38: 0x52c9, - 0x39: 0x5a29, - 0x3a: 0x5f01, - 0x3b: 0x97ad, - 0x3c: 0x4fdd, - 0x3d: 0x8217, - 0x3e: 0x92ea, - 0x3f: 0x5703, - 0x40: 0x6355, - 0x41: 0x6b69, - 0x42: 0x752b, - 0x43: 0x88dc, - 0x44: 0x8f14, - 0x45: 0x7a42, - 0x46: 0x52df, - 0x47: 0x5893, - 0x48: 0x6155, - 0x49: 0x620a, - 0x4a: 0x66ae, - 0x4b: 0x6bcd, - 0x4c: 0x7c3f, - 0x4d: 0x83e9, - 0x4e: 0x5023, - 0x4f: 0x4ff8, - 0x50: 0x5305, - 0x51: 0x5446, - 0x52: 0x5831, - 0x53: 0x5949, - 0x54: 0x5b9d, - 0x55: 0x5cf0, - 0x56: 0x5cef, - 0x57: 0x5d29, - 0x58: 0x5e96, - 0x59: 0x62b1, - 0x5a: 0x6367, - 0x5b: 0x653e, - 0x5c: 0x65b9, - 0x5d: 0x670b, - }, - 0x2a: [94]uint16{ - 0x00: 0x6cd5, - 0x01: 0x6ce1, - 0x02: 0x70f9, - 0x03: 0x7832, - 0x04: 0x7e2b, - 0x05: 0x80de, - 0x06: 0x82b3, - 0x07: 0x840c, - 0x08: 0x84ec, - 0x09: 0x8702, - 0x0a: 0x8912, - 0x0b: 0x8a2a, - 0x0c: 0x8c4a, - 0x0d: 0x90a6, - 0x0e: 0x92d2, - 0x0f: 0x98fd, - 0x10: 0x9cf3, - 0x11: 0x9d6c, - 0x12: 0x4e4f, - 0x13: 0x4ea1, - 0x14: 0x508d, - 0x15: 0x5256, - 0x16: 0x574a, - 0x17: 0x59a8, - 0x18: 0x5e3d, - 0x19: 0x5fd8, - 0x1a: 0x5fd9, - 0x1b: 0x623f, - 0x1c: 0x66b4, - 0x1d: 0x671b, - 0x1e: 0x67d0, - 0x1f: 0x68d2, - 0x20: 0x5192, - 0x21: 0x7d21, - 0x22: 0x80aa, - 0x23: 0x81a8, - 0x24: 0x8b00, - 0x25: 0x8c8c, - 0x26: 0x8cbf, - 0x27: 0x927e, - 0x28: 0x9632, - 0x29: 0x5420, - 0x2a: 0x982c, - 0x2b: 0x5317, - 0x2c: 0x50d5, - 0x2d: 0x535c, - 0x2e: 0x58a8, - 0x2f: 0x64b2, - 0x30: 0x6734, - 0x31: 0x7267, - 0x32: 0x7766, - 0x33: 0x7a46, - 0x34: 0x91e6, - 0x35: 0x52c3, - 0x36: 0x6ca1, - 0x37: 0x6b86, - 0x38: 0x5800, - 0x39: 0x5e4c, - 0x3a: 0x5954, - 0x3b: 0x672c, - 0x3c: 0x7ffb, - 0x3d: 0x51e1, - 0x3e: 0x76c6, - 0x3f: 0x6469, - 0x40: 0x78e8, - 0x41: 0x9b54, - 0x42: 0x9ebb, - 0x43: 0x57cb, - 0x44: 0x59b9, - 0x45: 0x6627, - 0x46: 0x679a, - 0x47: 0x6bce, - 0x48: 0x54e9, - 0x49: 0x69d9, - 0x4a: 0x5e55, - 0x4b: 0x819c, - 0x4c: 0x6795, - 0x4d: 0x9baa, - 0x4e: 0x67fe, - 0x4f: 0x9c52, - 0x50: 0x685d, - 0x51: 0x4ea6, - 0x52: 0x4fe3, - 0x53: 0x53c8, - 0x54: 0x62b9, - 0x55: 0x672b, - 0x56: 0x6cab, - 0x57: 0x8fc4, - 0x58: 0x4fad, - 0x59: 0x7e6d, - 0x5a: 0x9ebf, - 0x5b: 0x4e07, - 0x5c: 0x6162, - 0x5d: 0x6e80, - }, - 0x2b: [94]uint16{ - 0x00: 0x6f2b, - 0x01: 0x8513, - 0x02: 0x5473, - 0x03: 0x672a, - 0x04: 0x9b45, - 0x05: 0x5df3, - 0x06: 0x7b95, - 0x07: 0x5cac, - 0x08: 0x5bc6, - 0x09: 0x871c, - 0x0a: 0x6e4a, - 0x0b: 0x84d1, - 0x0c: 0x7a14, - 0x0d: 0x8108, - 0x0e: 0x5999, - 0x0f: 0x7c8d, - 0x10: 0x6c11, - 0x11: 0x7720, - 0x12: 0x52d9, - 0x13: 0x5922, - 0x14: 0x7121, - 0x15: 0x725f, - 0x16: 0x77db, - 0x17: 0x9727, - 0x18: 0x9d61, - 0x19: 0x690b, - 0x1a: 0x5a7f, - 0x1b: 0x5a18, - 0x1c: 0x51a5, - 0x1d: 0x540d, - 0x1e: 0x547d, - 0x1f: 0x660e, - 0x20: 0x76df, - 0x21: 0x8ff7, - 0x22: 0x9298, - 0x23: 0x9cf4, - 0x24: 0x59ea, - 0x25: 0x725d, - 0x26: 0x6ec5, - 0x27: 0x514d, - 0x28: 0x68c9, - 0x29: 0x7dbf, - 0x2a: 0x7dec, - 0x2b: 0x9762, - 0x2c: 0x9eba, - 0x2d: 0x6478, - 0x2e: 0x6a21, - 0x2f: 0x8302, - 0x30: 0x5984, - 0x31: 0x5b5f, - 0x32: 0x6bdb, - 0x33: 0x731b, - 0x34: 0x76f2, - 0x35: 0x7db2, - 0x36: 0x8017, - 0x37: 0x8499, - 0x38: 0x5132, - 0x39: 0x6728, - 0x3a: 0x9ed9, - 0x3b: 0x76ee, - 0x3c: 0x6762, - 0x3d: 0x52ff, - 0x3e: 0x9905, - 0x3f: 0x5c24, - 0x40: 0x623b, - 0x41: 0x7c7e, - 0x42: 0x8cb0, - 0x43: 0x554f, - 0x44: 0x60b6, - 0x45: 0x7d0b, - 0x46: 0x9580, - 0x47: 0x5301, - 0x48: 0x4e5f, - 0x49: 0x51b6, - 0x4a: 0x591c, - 0x4b: 0x723a, - 0x4c: 0x8036, - 0x4d: 0x91ce, - 0x4e: 0x5f25, - 0x4f: 0x77e2, - 0x50: 0x5384, - 0x51: 0x5f79, - 0x52: 0x7d04, - 0x53: 0x85ac, - 0x54: 0x8a33, - 0x55: 0x8e8d, - 0x56: 0x9756, - 0x57: 0x67f3, - 0x58: 0x85ae, - 0x59: 0x9453, - 0x5a: 0x6109, - 0x5b: 0x6108, - 0x5c: 0x6cb9, - 0x5d: 0x7652, - }, - 0x2c: [94]uint16{ - 0x00: 0x8aed, - 0x01: 0x8f38, - 0x02: 0x552f, - 0x03: 0x4f51, - 0x04: 0x512a, - 0x05: 0x52c7, - 0x06: 0x53cb, - 0x07: 0x5ba5, - 0x08: 0x5e7d, - 0x09: 0x60a0, - 0x0a: 0x6182, - 0x0b: 0x63d6, - 0x0c: 0x6709, - 0x0d: 0x67da, - 0x0e: 0x6e67, - 0x0f: 0x6d8c, - 0x10: 0x7336, - 0x11: 0x7337, - 0x12: 0x7531, - 0x13: 0x7950, - 0x14: 0x88d5, - 0x15: 0x8a98, - 0x16: 0x904a, - 0x17: 0x9091, - 0x18: 0x90f5, - 0x19: 0x96c4, - 0x1a: 0x878d, - 0x1b: 0x5915, - 0x1c: 0x4e88, - 0x1d: 0x4f59, - 0x1e: 0x4e0e, - 0x1f: 0x8a89, - 0x20: 0x8f3f, - 0x21: 0x9810, - 0x22: 0x50ad, - 0x23: 0x5e7c, - 0x24: 0x5996, - 0x25: 0x5bb9, - 0x26: 0x5eb8, - 0x27: 0x63da, - 0x28: 0x63fa, - 0x29: 0x64c1, - 0x2a: 0x66dc, - 0x2b: 0x694a, - 0x2c: 0x69d8, - 0x2d: 0x6d0b, - 0x2e: 0x6eb6, - 0x2f: 0x7194, - 0x30: 0x7528, - 0x31: 0x7aaf, - 0x32: 0x7f8a, - 0x33: 0x8000, - 0x34: 0x8449, - 0x35: 0x84c9, - 0x36: 0x8981, - 0x37: 0x8b21, - 0x38: 0x8e0a, - 0x39: 0x9065, - 0x3a: 0x967d, - 0x3b: 0x990a, - 0x3c: 0x617e, - 0x3d: 0x6291, - 0x3e: 0x6b32, - 0x3f: 0x6c83, - 0x40: 0x6d74, - 0x41: 0x7fcc, - 0x42: 0x7ffc, - 0x43: 0x6dc0, - 0x44: 0x7f85, - 0x45: 0x87ba, - 0x46: 0x88f8, - 0x47: 0x6765, - 0x48: 0x83b1, - 0x49: 0x983c, - 0x4a: 0x96f7, - 0x4b: 0x6d1b, - 0x4c: 0x7d61, - 0x4d: 0x843d, - 0x4e: 0x916a, - 0x4f: 0x4e71, - 0x50: 0x5375, - 0x51: 0x5d50, - 0x52: 0x6b04, - 0x53: 0x6feb, - 0x54: 0x85cd, - 0x55: 0x862d, - 0x56: 0x89a7, - 0x57: 0x5229, - 0x58: 0x540f, - 0x59: 0x5c65, - 0x5a: 0x674e, - 0x5b: 0x68a8, - 0x5c: 0x7406, - 0x5d: 0x7483, - }, - 0x2d: [94]uint16{ - 0x00: 0x75e2, - 0x01: 0x88cf, - 0x02: 0x88e1, - 0x03: 0x91cc, - 0x04: 0x96e2, - 0x05: 0x9678, - 0x06: 0x5f8b, - 0x07: 0x7387, - 0x08: 0x7acb, - 0x09: 0x844e, - 0x0a: 0x63a0, - 0x0b: 0x7565, - 0x0c: 0x5289, - 0x0d: 0x6d41, - 0x0e: 0x6e9c, - 0x0f: 0x7409, - 0x10: 0x7559, - 0x11: 0x786b, - 0x12: 0x7c92, - 0x13: 0x9686, - 0x14: 0x7adc, - 0x15: 0x9f8d, - 0x16: 0x4fb6, - 0x17: 0x616e, - 0x18: 0x65c5, - 0x19: 0x865c, - 0x1a: 0x4e86, - 0x1b: 0x4eae, - 0x1c: 0x50da, - 0x1d: 0x4e21, - 0x1e: 0x51cc, - 0x1f: 0x5bee, - 0x20: 0x6599, - 0x21: 0x6881, - 0x22: 0x6dbc, - 0x23: 0x731f, - 0x24: 0x7642, - 0x25: 0x77ad, - 0x26: 0x7a1c, - 0x27: 0x7ce7, - 0x28: 0x826f, - 0x29: 0x8ad2, - 0x2a: 0x907c, - 0x2b: 0x91cf, - 0x2c: 0x9675, - 0x2d: 0x9818, - 0x2e: 0x529b, - 0x2f: 0x7dd1, - 0x30: 0x502b, - 0x31: 0x5398, - 0x32: 0x6797, - 0x33: 0x6dcb, - 0x34: 0x71d0, - 0x35: 0x7433, - 0x36: 0x81e8, - 0x37: 0x8f2a, - 0x38: 0x96a3, - 0x39: 0x9c57, - 0x3a: 0x9e9f, - 0x3b: 0x7460, - 0x3c: 0x5841, - 0x3d: 0x6d99, - 0x3e: 0x7d2f, - 0x3f: 0x985e, - 0x40: 0x4ee4, - 0x41: 0x4f36, - 0x42: 0x4f8b, - 0x43: 0x51b7, - 0x44: 0x52b1, - 0x45: 0x5dba, - 0x46: 0x601c, - 0x47: 0x73b2, - 0x48: 0x793c, - 0x49: 0x82d3, - 0x4a: 0x9234, - 0x4b: 0x96b7, - 0x4c: 0x96f6, - 0x4d: 0x970a, - 0x4e: 0x9e97, - 0x4f: 0x9f62, - 0x50: 0x66a6, - 0x51: 0x6b74, - 0x52: 0x5217, - 0x53: 0x52a3, - 0x54: 0x70c8, - 0x55: 0x88c2, - 0x56: 0x5ec9, - 0x57: 0x604b, - 0x58: 0x6190, - 0x59: 0x6f23, - 0x5a: 0x7149, - 0x5b: 0x7c3e, - 0x5c: 0x7df4, - 0x5d: 0x806f, - }, - 0x2e: [94]uint16{ - 0x00: 0x84ee, - 0x01: 0x9023, - 0x02: 0x932c, - 0x03: 0x5442, - 0x04: 0x9b6f, - 0x05: 0x6ad3, - 0x06: 0x7089, - 0x07: 0x8cc2, - 0x08: 0x8def, - 0x09: 0x9732, - 0x0a: 0x52b4, - 0x0b: 0x5a41, - 0x0c: 0x5eca, - 0x0d: 0x5f04, - 0x0e: 0x6717, - 0x0f: 0x697c, - 0x10: 0x6994, - 0x11: 0x6d6a, - 0x12: 0x6f0f, - 0x13: 0x7262, - 0x14: 0x72fc, - 0x15: 0x7bed, - 0x16: 0x8001, - 0x17: 0x807e, - 0x18: 0x874b, - 0x19: 0x90ce, - 0x1a: 0x516d, - 0x1b: 0x9e93, - 0x1c: 0x7984, - 0x1d: 0x808b, - 0x1e: 0x9332, - 0x1f: 0x8ad6, - 0x20: 0x502d, - 0x21: 0x548c, - 0x22: 0x8a71, - 0x23: 0x6b6a, - 0x24: 0x8cc4, - 0x25: 0x8107, - 0x26: 0x60d1, - 0x27: 0x67a0, - 0x28: 0x9df2, - 0x29: 0x4e99, - 0x2a: 0x4e98, - 0x2b: 0x9c10, - 0x2c: 0x8a6b, - 0x2d: 0x85c1, - 0x2e: 0x8568, - 0x2f: 0x6900, - 0x30: 0x6e7e, - 0x31: 0x7897, - 0x32: 0x8155, - }, - 0x2f: [94]uint16{ - 0x00: 0x5f0c, - 0x01: 0x4e10, - 0x02: 0x4e15, - 0x03: 0x4e2a, - 0x04: 0x4e31, - 0x05: 0x4e36, - 0x06: 0x4e3c, - 0x07: 0x4e3f, - 0x08: 0x4e42, - 0x09: 0x4e56, - 0x0a: 0x4e58, - 0x0b: 0x4e82, - 0x0c: 0x4e85, - 0x0d: 0x8c6b, - 0x0e: 0x4e8a, - 0x0f: 0x8212, - 0x10: 0x5f0d, - 0x11: 0x4e8e, - 0x12: 0x4e9e, - 0x13: 0x4e9f, - 0x14: 0x4ea0, - 0x15: 0x4ea2, - 0x16: 0x4eb0, - 0x17: 0x4eb3, - 0x18: 0x4eb6, - 0x19: 0x4ece, - 0x1a: 0x4ecd, - 0x1b: 0x4ec4, - 0x1c: 0x4ec6, - 0x1d: 0x4ec2, - 0x1e: 0x4ed7, - 0x1f: 0x4ede, - 0x20: 0x4eed, - 0x21: 0x4edf, - 0x22: 0x4ef7, - 0x23: 0x4f09, - 0x24: 0x4f5a, - 0x25: 0x4f30, - 0x26: 0x4f5b, - 0x27: 0x4f5d, - 0x28: 0x4f57, - 0x29: 0x4f47, - 0x2a: 0x4f76, - 0x2b: 0x4f88, - 0x2c: 0x4f8f, - 0x2d: 0x4f98, - 0x2e: 0x4f7b, - 0x2f: 0x4f69, - 0x30: 0x4f70, - 0x31: 0x4f91, - 0x32: 0x4f6f, - 0x33: 0x4f86, - 0x34: 0x4f96, - 0x35: 0x5118, - 0x36: 0x4fd4, - 0x37: 0x4fdf, - 0x38: 0x4fce, - 0x39: 0x4fd8, - 0x3a: 0x4fdb, - 0x3b: 0x4fd1, - 0x3c: 0x4fda, - 0x3d: 0x4fd0, - 0x3e: 0x4fe4, - 0x3f: 0x4fe5, - 0x40: 0x501a, - 0x41: 0x5028, - 0x42: 0x5014, - 0x43: 0x502a, - 0x44: 0x5025, - 0x45: 0x5005, - 0x46: 0x4f1c, - 0x47: 0x4ff6, - 0x48: 0x5021, - 0x49: 0x5029, - 0x4a: 0x502c, - 0x4b: 0x4ffe, - 0x4c: 0x4fef, - 0x4d: 0x5011, - 0x4e: 0x5006, - 0x4f: 0x5043, - 0x50: 0x5047, - 0x51: 0x6703, - 0x52: 0x5055, - 0x53: 0x5050, - 0x54: 0x5048, - 0x55: 0x505a, - 0x56: 0x5056, - 0x57: 0x506c, - 0x58: 0x5078, - 0x59: 0x5080, - 0x5a: 0x509a, - 0x5b: 0x5085, - 0x5c: 0x50b4, - 0x5d: 0x50b2, - }, - 0x30: [94]uint16{ - 0x00: 0x50c9, - 0x01: 0x50ca, - 0x02: 0x50b3, - 0x03: 0x50c2, - 0x04: 0x50d6, - 0x05: 0x50de, - 0x06: 0x50e5, - 0x07: 0x50ed, - 0x08: 0x50e3, - 0x09: 0x50ee, - 0x0a: 0x50f9, - 0x0b: 0x50f5, - 0x0c: 0x5109, - 0x0d: 0x5101, - 0x0e: 0x5102, - 0x0f: 0x5116, - 0x10: 0x5115, - 0x11: 0x5114, - 0x12: 0x511a, - 0x13: 0x5121, - 0x14: 0x513a, - 0x15: 0x5137, - 0x16: 0x513c, - 0x17: 0x513b, - 0x18: 0x513f, - 0x19: 0x5140, - 0x1a: 0x5152, - 0x1b: 0x514c, - 0x1c: 0x5154, - 0x1d: 0x5162, - 0x1e: 0x7af8, - 0x1f: 0x5169, - 0x20: 0x516a, - 0x21: 0x516e, - 0x22: 0x5180, - 0x23: 0x5182, - 0x24: 0x56d8, - 0x25: 0x518c, - 0x26: 0x5189, - 0x27: 0x518f, - 0x28: 0x5191, - 0x29: 0x5193, - 0x2a: 0x5195, - 0x2b: 0x5196, - 0x2c: 0x51a4, - 0x2d: 0x51a6, - 0x2e: 0x51a2, - 0x2f: 0x51a9, - 0x30: 0x51aa, - 0x31: 0x51ab, - 0x32: 0x51b3, - 0x33: 0x51b1, - 0x34: 0x51b2, - 0x35: 0x51b0, - 0x36: 0x51b5, - 0x37: 0x51bd, - 0x38: 0x51c5, - 0x39: 0x51c9, - 0x3a: 0x51db, - 0x3b: 0x51e0, - 0x3c: 0x8655, - 0x3d: 0x51e9, - 0x3e: 0x51ed, - 0x3f: 0x51f0, - 0x40: 0x51f5, - 0x41: 0x51fe, - 0x42: 0x5204, - 0x43: 0x520b, - 0x44: 0x5214, - 0x45: 0x520e, - 0x46: 0x5227, - 0x47: 0x522a, - 0x48: 0x522e, - 0x49: 0x5233, - 0x4a: 0x5239, - 0x4b: 0x524f, - 0x4c: 0x5244, - 0x4d: 0x524b, - 0x4e: 0x524c, - 0x4f: 0x525e, - 0x50: 0x5254, - 0x51: 0x526a, - 0x52: 0x5274, - 0x53: 0x5269, - 0x54: 0x5273, - 0x55: 0x527f, - 0x56: 0x527d, - 0x57: 0x528d, - 0x58: 0x5294, - 0x59: 0x5292, - 0x5a: 0x5271, - 0x5b: 0x5288, - 0x5c: 0x5291, - 0x5d: 0x8fa8, - }, - 0x31: [94]uint16{ - 0x00: 0x8fa7, - 0x01: 0x52ac, - 0x02: 0x52ad, - 0x03: 0x52bc, - 0x04: 0x52b5, - 0x05: 0x52c1, - 0x06: 0x52cd, - 0x07: 0x52d7, - 0x08: 0x52de, - 0x09: 0x52e3, - 0x0a: 0x52e6, - 0x0b: 0x98ed, - 0x0c: 0x52e0, - 0x0d: 0x52f3, - 0x0e: 0x52f5, - 0x0f: 0x52f8, - 0x10: 0x52f9, - 0x11: 0x5306, - 0x12: 0x5308, - 0x13: 0x7538, - 0x14: 0x530d, - 0x15: 0x5310, - 0x16: 0x530f, - 0x17: 0x5315, - 0x18: 0x531a, - 0x19: 0x5323, - 0x1a: 0x532f, - 0x1b: 0x5331, - 0x1c: 0x5333, - 0x1d: 0x5338, - 0x1e: 0x5340, - 0x1f: 0x5346, - 0x20: 0x5345, - 0x21: 0x4e17, - 0x22: 0x5349, - 0x23: 0x534d, - 0x24: 0x51d6, - 0x25: 0x535e, - 0x26: 0x5369, - 0x27: 0x536e, - 0x28: 0x5918, - 0x29: 0x537b, - 0x2a: 0x5377, - 0x2b: 0x5382, - 0x2c: 0x5396, - 0x2d: 0x53a0, - 0x2e: 0x53a6, - 0x2f: 0x53a5, - 0x30: 0x53ae, - 0x31: 0x53b0, - 0x32: 0x53b6, - 0x33: 0x53c3, - 0x34: 0x7c12, - 0x35: 0x96d9, - 0x36: 0x53df, - 0x37: 0x66fc, - 0x38: 0x71ee, - 0x39: 0x53ee, - 0x3a: 0x53e8, - 0x3b: 0x53ed, - 0x3c: 0x53fa, - 0x3d: 0x5401, - 0x3e: 0x543d, - 0x3f: 0x5440, - 0x40: 0x542c, - 0x41: 0x542d, - 0x42: 0x543c, - 0x43: 0x542e, - 0x44: 0x5436, - 0x45: 0x5429, - 0x46: 0x541d, - 0x47: 0x544e, - 0x48: 0x548f, - 0x49: 0x5475, - 0x4a: 0x548e, - 0x4b: 0x545f, - 0x4c: 0x5471, - 0x4d: 0x5477, - 0x4e: 0x5470, - 0x4f: 0x5492, - 0x50: 0x547b, - 0x51: 0x5480, - 0x52: 0x5476, - 0x53: 0x5484, - 0x54: 0x5490, - 0x55: 0x5486, - 0x56: 0x54c7, - 0x57: 0x54a2, - 0x58: 0x54b8, - 0x59: 0x54a5, - 0x5a: 0x54ac, - 0x5b: 0x54c4, - 0x5c: 0x54c8, - 0x5d: 0x54a8, - }, - 0x32: [94]uint16{ - 0x00: 0x54ab, - 0x01: 0x54c2, - 0x02: 0x54a4, - 0x03: 0x54be, - 0x04: 0x54bc, - 0x05: 0x54d8, - 0x06: 0x54e5, - 0x07: 0x54e6, - 0x08: 0x550f, - 0x09: 0x5514, - 0x0a: 0x54fd, - 0x0b: 0x54ee, - 0x0c: 0x54ed, - 0x0d: 0x54fa, - 0x0e: 0x54e2, - 0x0f: 0x5539, - 0x10: 0x5540, - 0x11: 0x5563, - 0x12: 0x554c, - 0x13: 0x552e, - 0x14: 0x555c, - 0x15: 0x5545, - 0x16: 0x5556, - 0x17: 0x5557, - 0x18: 0x5538, - 0x19: 0x5533, - 0x1a: 0x555d, - 0x1b: 0x5599, - 0x1c: 0x5580, - 0x1d: 0x54af, - 0x1e: 0x558a, - 0x1f: 0x559f, - 0x20: 0x557b, - 0x21: 0x557e, - 0x22: 0x5598, - 0x23: 0x559e, - 0x24: 0x55ae, - 0x25: 0x557c, - 0x26: 0x5583, - 0x27: 0x55a9, - 0x28: 0x5587, - 0x29: 0x55a8, - 0x2a: 0x55da, - 0x2b: 0x55c5, - 0x2c: 0x55df, - 0x2d: 0x55c4, - 0x2e: 0x55dc, - 0x2f: 0x55e4, - 0x30: 0x55d4, - 0x31: 0x5614, - 0x32: 0x55f7, - 0x33: 0x5616, - 0x34: 0x55fe, - 0x35: 0x55fd, - 0x36: 0x561b, - 0x37: 0x55f9, - 0x38: 0x564e, - 0x39: 0x5650, - 0x3a: 0x71df, - 0x3b: 0x5634, - 0x3c: 0x5636, - 0x3d: 0x5632, - 0x3e: 0x5638, - 0x3f: 0x566b, - 0x40: 0x5664, - 0x41: 0x562f, - 0x42: 0x566c, - 0x43: 0x566a, - 0x44: 0x5686, - 0x45: 0x5680, - 0x46: 0x568a, - 0x47: 0x56a0, - 0x48: 0x5694, - 0x49: 0x568f, - 0x4a: 0x56a5, - 0x4b: 0x56ae, - 0x4c: 0x56b6, - 0x4d: 0x56b4, - 0x4e: 0x56c2, - 0x4f: 0x56bc, - 0x50: 0x56c1, - 0x51: 0x56c3, - 0x52: 0x56c0, - 0x53: 0x56c8, - 0x54: 0x56ce, - 0x55: 0x56d1, - 0x56: 0x56d3, - 0x57: 0x56d7, - 0x58: 0x56ee, - 0x59: 0x56f9, - 0x5a: 0x5700, - 0x5b: 0x56ff, - 0x5c: 0x5704, - 0x5d: 0x5709, - }, - 0x33: [94]uint16{ - 0x00: 0x5708, - 0x01: 0x570b, - 0x02: 0x570d, - 0x03: 0x5713, - 0x04: 0x5718, - 0x05: 0x5716, - 0x06: 0x55c7, - 0x07: 0x571c, - 0x08: 0x5726, - 0x09: 0x5737, - 0x0a: 0x5738, - 0x0b: 0x574e, - 0x0c: 0x573b, - 0x0d: 0x5740, - 0x0e: 0x574f, - 0x0f: 0x5769, - 0x10: 0x57c0, - 0x11: 0x5788, - 0x12: 0x5761, - 0x13: 0x577f, - 0x14: 0x5789, - 0x15: 0x5793, - 0x16: 0x57a0, - 0x17: 0x57b3, - 0x18: 0x57a4, - 0x19: 0x57aa, - 0x1a: 0x57b0, - 0x1b: 0x57c3, - 0x1c: 0x57c6, - 0x1d: 0x57d4, - 0x1e: 0x57d2, - 0x1f: 0x57d3, - 0x20: 0x580a, - 0x21: 0x57d6, - 0x22: 0x57e3, - 0x23: 0x580b, - 0x24: 0x5819, - 0x25: 0x581d, - 0x26: 0x5872, - 0x27: 0x5821, - 0x28: 0x5862, - 0x29: 0x584b, - 0x2a: 0x5870, - 0x2b: 0x6bc0, - 0x2c: 0x5852, - 0x2d: 0x583d, - 0x2e: 0x5879, - 0x2f: 0x5885, - 0x30: 0x58b9, - 0x31: 0x589f, - 0x32: 0x58ab, - 0x33: 0x58ba, - 0x34: 0x58de, - 0x35: 0x58bb, - 0x36: 0x58b8, - 0x37: 0x58ae, - 0x38: 0x58c5, - 0x39: 0x58d3, - 0x3a: 0x58d1, - 0x3b: 0x58d7, - 0x3c: 0x58d9, - 0x3d: 0x58d8, - 0x3e: 0x58e5, - 0x3f: 0x58dc, - 0x40: 0x58e4, - 0x41: 0x58df, - 0x42: 0x58ef, - 0x43: 0x58fa, - 0x44: 0x58f9, - 0x45: 0x58fb, - 0x46: 0x58fc, - 0x47: 0x58fd, - 0x48: 0x5902, - 0x49: 0x590a, - 0x4a: 0x5910, - 0x4b: 0x591b, - 0x4c: 0x68a6, - 0x4d: 0x5925, - 0x4e: 0x592c, - 0x4f: 0x592d, - 0x50: 0x5932, - 0x51: 0x5938, - 0x52: 0x593e, - 0x53: 0x7ad2, - 0x54: 0x5955, - 0x55: 0x5950, - 0x56: 0x594e, - 0x57: 0x595a, - 0x58: 0x5958, - 0x59: 0x5962, - 0x5a: 0x5960, - 0x5b: 0x5967, - 0x5c: 0x596c, - 0x5d: 0x5969, - }, - 0x34: [94]uint16{ - 0x00: 0x5978, - 0x01: 0x5981, - 0x02: 0x599d, - 0x03: 0x4f5e, - 0x04: 0x4fab, - 0x05: 0x59a3, - 0x06: 0x59b2, - 0x07: 0x59c6, - 0x08: 0x59e8, - 0x09: 0x59dc, - 0x0a: 0x598d, - 0x0b: 0x59d9, - 0x0c: 0x59da, - 0x0d: 0x5a25, - 0x0e: 0x5a1f, - 0x0f: 0x5a11, - 0x10: 0x5a1c, - 0x11: 0x5a09, - 0x12: 0x5a1a, - 0x13: 0x5a40, - 0x14: 0x5a6c, - 0x15: 0x5a49, - 0x16: 0x5a35, - 0x17: 0x5a36, - 0x18: 0x5a62, - 0x19: 0x5a6a, - 0x1a: 0x5a9a, - 0x1b: 0x5abc, - 0x1c: 0x5abe, - 0x1d: 0x5acb, - 0x1e: 0x5ac2, - 0x1f: 0x5abd, - 0x20: 0x5ae3, - 0x21: 0x5ad7, - 0x22: 0x5ae6, - 0x23: 0x5ae9, - 0x24: 0x5ad6, - 0x25: 0x5afa, - 0x26: 0x5afb, - 0x27: 0x5b0c, - 0x28: 0x5b0b, - 0x29: 0x5b16, - 0x2a: 0x5b32, - 0x2b: 0x5ad0, - 0x2c: 0x5b2a, - 0x2d: 0x5b36, - 0x2e: 0x5b3e, - 0x2f: 0x5b43, - 0x30: 0x5b45, - 0x31: 0x5b40, - 0x32: 0x5b51, - 0x33: 0x5b55, - 0x34: 0x5b5a, - 0x35: 0x5b5b, - 0x36: 0x5b65, - 0x37: 0x5b69, - 0x38: 0x5b70, - 0x39: 0x5b73, - 0x3a: 0x5b75, - 0x3b: 0x5b78, - 0x3c: 0x6588, - 0x3d: 0x5b7a, - 0x3e: 0x5b80, - 0x3f: 0x5b83, - 0x40: 0x5ba6, - 0x41: 0x5bb8, - 0x42: 0x5bc3, - 0x43: 0x5bc7, - 0x44: 0x5bc9, - 0x45: 0x5bd4, - 0x46: 0x5bd0, - 0x47: 0x5be4, - 0x48: 0x5be6, - 0x49: 0x5be2, - 0x4a: 0x5bde, - 0x4b: 0x5be5, - 0x4c: 0x5beb, - 0x4d: 0x5bf0, - 0x4e: 0x5bf6, - 0x4f: 0x5bf3, - 0x50: 0x5c05, - 0x51: 0x5c07, - 0x52: 0x5c08, - 0x53: 0x5c0d, - 0x54: 0x5c13, - 0x55: 0x5c20, - 0x56: 0x5c22, - 0x57: 0x5c28, - 0x58: 0x5c38, - 0x59: 0x5c39, - 0x5a: 0x5c41, - 0x5b: 0x5c46, - 0x5c: 0x5c4e, - 0x5d: 0x5c53, - }, - 0x35: [94]uint16{ - 0x00: 0x5c50, - 0x01: 0x5c4f, - 0x02: 0x5b71, - 0x03: 0x5c6c, - 0x04: 0x5c6e, - 0x05: 0x4e62, - 0x06: 0x5c76, - 0x07: 0x5c79, - 0x08: 0x5c8c, - 0x09: 0x5c91, - 0x0a: 0x5c94, - 0x0b: 0x599b, - 0x0c: 0x5cab, - 0x0d: 0x5cbb, - 0x0e: 0x5cb6, - 0x0f: 0x5cbc, - 0x10: 0x5cb7, - 0x11: 0x5cc5, - 0x12: 0x5cbe, - 0x13: 0x5cc7, - 0x14: 0x5cd9, - 0x15: 0x5ce9, - 0x16: 0x5cfd, - 0x17: 0x5cfa, - 0x18: 0x5ced, - 0x19: 0x5d8c, - 0x1a: 0x5cea, - 0x1b: 0x5d0b, - 0x1c: 0x5d15, - 0x1d: 0x5d17, - 0x1e: 0x5d5c, - 0x1f: 0x5d1f, - 0x20: 0x5d1b, - 0x21: 0x5d11, - 0x22: 0x5d14, - 0x23: 0x5d22, - 0x24: 0x5d1a, - 0x25: 0x5d19, - 0x26: 0x5d18, - 0x27: 0x5d4c, - 0x28: 0x5d52, - 0x29: 0x5d4e, - 0x2a: 0x5d4b, - 0x2b: 0x5d6c, - 0x2c: 0x5d73, - 0x2d: 0x5d76, - 0x2e: 0x5d87, - 0x2f: 0x5d84, - 0x30: 0x5d82, - 0x31: 0x5da2, - 0x32: 0x5d9d, - 0x33: 0x5dac, - 0x34: 0x5dae, - 0x35: 0x5dbd, - 0x36: 0x5d90, - 0x37: 0x5db7, - 0x38: 0x5dbc, - 0x39: 0x5dc9, - 0x3a: 0x5dcd, - 0x3b: 0x5dd3, - 0x3c: 0x5dd2, - 0x3d: 0x5dd6, - 0x3e: 0x5ddb, - 0x3f: 0x5deb, - 0x40: 0x5df2, - 0x41: 0x5df5, - 0x42: 0x5e0b, - 0x43: 0x5e1a, - 0x44: 0x5e19, - 0x45: 0x5e11, - 0x46: 0x5e1b, - 0x47: 0x5e36, - 0x48: 0x5e37, - 0x49: 0x5e44, - 0x4a: 0x5e43, - 0x4b: 0x5e40, - 0x4c: 0x5e4e, - 0x4d: 0x5e57, - 0x4e: 0x5e54, - 0x4f: 0x5e5f, - 0x50: 0x5e62, - 0x51: 0x5e64, - 0x52: 0x5e47, - 0x53: 0x5e75, - 0x54: 0x5e76, - 0x55: 0x5e7a, - 0x56: 0x9ebc, - 0x57: 0x5e7f, - 0x58: 0x5ea0, - 0x59: 0x5ec1, - 0x5a: 0x5ec2, - 0x5b: 0x5ec8, - 0x5c: 0x5ed0, - 0x5d: 0x5ecf, - }, - 0x36: [94]uint16{ - 0x00: 0x5ed6, - 0x01: 0x5ee3, - 0x02: 0x5edd, - 0x03: 0x5eda, - 0x04: 0x5edb, - 0x05: 0x5ee2, - 0x06: 0x5ee1, - 0x07: 0x5ee8, - 0x08: 0x5ee9, - 0x09: 0x5eec, - 0x0a: 0x5ef1, - 0x0b: 0x5ef3, - 0x0c: 0x5ef0, - 0x0d: 0x5ef4, - 0x0e: 0x5ef8, - 0x0f: 0x5efe, - 0x10: 0x5f03, - 0x11: 0x5f09, - 0x12: 0x5f5d, - 0x13: 0x5f5c, - 0x14: 0x5f0b, - 0x15: 0x5f11, - 0x16: 0x5f16, - 0x17: 0x5f29, - 0x18: 0x5f2d, - 0x19: 0x5f38, - 0x1a: 0x5f41, - 0x1b: 0x5f48, - 0x1c: 0x5f4c, - 0x1d: 0x5f4e, - 0x1e: 0x5f2f, - 0x1f: 0x5f51, - 0x20: 0x5f56, - 0x21: 0x5f57, - 0x22: 0x5f59, - 0x23: 0x5f61, - 0x24: 0x5f6d, - 0x25: 0x5f73, - 0x26: 0x5f77, - 0x27: 0x5f83, - 0x28: 0x5f82, - 0x29: 0x5f7f, - 0x2a: 0x5f8a, - 0x2b: 0x5f88, - 0x2c: 0x5f91, - 0x2d: 0x5f87, - 0x2e: 0x5f9e, - 0x2f: 0x5f99, - 0x30: 0x5f98, - 0x31: 0x5fa0, - 0x32: 0x5fa8, - 0x33: 0x5fad, - 0x34: 0x5fbc, - 0x35: 0x5fd6, - 0x36: 0x5ffb, - 0x37: 0x5fe4, - 0x38: 0x5ff8, - 0x39: 0x5ff1, - 0x3a: 0x5fdd, - 0x3b: 0x60b3, - 0x3c: 0x5fff, - 0x3d: 0x6021, - 0x3e: 0x6060, - 0x3f: 0x6019, - 0x40: 0x6010, - 0x41: 0x6029, - 0x42: 0x600e, - 0x43: 0x6031, - 0x44: 0x601b, - 0x45: 0x6015, - 0x46: 0x602b, - 0x47: 0x6026, - 0x48: 0x600f, - 0x49: 0x603a, - 0x4a: 0x605a, - 0x4b: 0x6041, - 0x4c: 0x606a, - 0x4d: 0x6077, - 0x4e: 0x605f, - 0x4f: 0x604a, - 0x50: 0x6046, - 0x51: 0x604d, - 0x52: 0x6063, - 0x53: 0x6043, - 0x54: 0x6064, - 0x55: 0x6042, - 0x56: 0x606c, - 0x57: 0x606b, - 0x58: 0x6059, - 0x59: 0x6081, - 0x5a: 0x608d, - 0x5b: 0x60e7, - 0x5c: 0x6083, - 0x5d: 0x609a, - }, - 0x37: [94]uint16{ - 0x00: 0x6084, - 0x01: 0x609b, - 0x02: 0x6096, - 0x03: 0x6097, - 0x04: 0x6092, - 0x05: 0x60a7, - 0x06: 0x608b, - 0x07: 0x60e1, - 0x08: 0x60b8, - 0x09: 0x60e0, - 0x0a: 0x60d3, - 0x0b: 0x60b4, - 0x0c: 0x5ff0, - 0x0d: 0x60bd, - 0x0e: 0x60c6, - 0x0f: 0x60b5, - 0x10: 0x60d8, - 0x11: 0x614d, - 0x12: 0x6115, - 0x13: 0x6106, - 0x14: 0x60f6, - 0x15: 0x60f7, - 0x16: 0x6100, - 0x17: 0x60f4, - 0x18: 0x60fa, - 0x19: 0x6103, - 0x1a: 0x6121, - 0x1b: 0x60fb, - 0x1c: 0x60f1, - 0x1d: 0x610d, - 0x1e: 0x610e, - 0x1f: 0x6147, - 0x20: 0x613e, - 0x21: 0x6128, - 0x22: 0x6127, - 0x23: 0x614a, - 0x24: 0x613f, - 0x25: 0x613c, - 0x26: 0x612c, - 0x27: 0x6134, - 0x28: 0x613d, - 0x29: 0x6142, - 0x2a: 0x6144, - 0x2b: 0x6173, - 0x2c: 0x6177, - 0x2d: 0x6158, - 0x2e: 0x6159, - 0x2f: 0x615a, - 0x30: 0x616b, - 0x31: 0x6174, - 0x32: 0x616f, - 0x33: 0x6165, - 0x34: 0x6171, - 0x35: 0x615f, - 0x36: 0x615d, - 0x37: 0x6153, - 0x38: 0x6175, - 0x39: 0x6199, - 0x3a: 0x6196, - 0x3b: 0x6187, - 0x3c: 0x61ac, - 0x3d: 0x6194, - 0x3e: 0x619a, - 0x3f: 0x618a, - 0x40: 0x6191, - 0x41: 0x61ab, - 0x42: 0x61ae, - 0x43: 0x61cc, - 0x44: 0x61ca, - 0x45: 0x61c9, - 0x46: 0x61f7, - 0x47: 0x61c8, - 0x48: 0x61c3, - 0x49: 0x61c6, - 0x4a: 0x61ba, - 0x4b: 0x61cb, - 0x4c: 0x7f79, - 0x4d: 0x61cd, - 0x4e: 0x61e6, - 0x4f: 0x61e3, - 0x50: 0x61f6, - 0x51: 0x61fa, - 0x52: 0x61f4, - 0x53: 0x61ff, - 0x54: 0x61fd, - 0x55: 0x61fc, - 0x56: 0x61fe, - 0x57: 0x6200, - 0x58: 0x6208, - 0x59: 0x6209, - 0x5a: 0x620d, - 0x5b: 0x620c, - 0x5c: 0x6214, - 0x5d: 0x621b, - }, - 0x38: [94]uint16{ - 0x00: 0x621e, - 0x01: 0x6221, - 0x02: 0x622a, - 0x03: 0x622e, - 0x04: 0x6230, - 0x05: 0x6232, - 0x06: 0x6233, - 0x07: 0x6241, - 0x08: 0x624e, - 0x09: 0x625e, - 0x0a: 0x6263, - 0x0b: 0x625b, - 0x0c: 0x6260, - 0x0d: 0x6268, - 0x0e: 0x627c, - 0x0f: 0x6282, - 0x10: 0x6289, - 0x11: 0x627e, - 0x12: 0x6292, - 0x13: 0x6293, - 0x14: 0x6296, - 0x15: 0x62d4, - 0x16: 0x6283, - 0x17: 0x6294, - 0x18: 0x62d7, - 0x19: 0x62d1, - 0x1a: 0x62bb, - 0x1b: 0x62cf, - 0x1c: 0x62ff, - 0x1d: 0x62c6, - 0x1e: 0x64d4, - 0x1f: 0x62c8, - 0x20: 0x62dc, - 0x21: 0x62cc, - 0x22: 0x62ca, - 0x23: 0x62c2, - 0x24: 0x62c7, - 0x25: 0x629b, - 0x26: 0x62c9, - 0x27: 0x630c, - 0x28: 0x62ee, - 0x29: 0x62f1, - 0x2a: 0x6327, - 0x2b: 0x6302, - 0x2c: 0x6308, - 0x2d: 0x62ef, - 0x2e: 0x62f5, - 0x2f: 0x6350, - 0x30: 0x633e, - 0x31: 0x634d, - 0x32: 0x641c, - 0x33: 0x634f, - 0x34: 0x6396, - 0x35: 0x638e, - 0x36: 0x6380, - 0x37: 0x63ab, - 0x38: 0x6376, - 0x39: 0x63a3, - 0x3a: 0x638f, - 0x3b: 0x6389, - 0x3c: 0x639f, - 0x3d: 0x63b5, - 0x3e: 0x636b, - 0x3f: 0x6369, - 0x40: 0x63be, - 0x41: 0x63e9, - 0x42: 0x63c0, - 0x43: 0x63c6, - 0x44: 0x63e3, - 0x45: 0x63c9, - 0x46: 0x63d2, - 0x47: 0x63f6, - 0x48: 0x63c4, - 0x49: 0x6416, - 0x4a: 0x6434, - 0x4b: 0x6406, - 0x4c: 0x6413, - 0x4d: 0x6426, - 0x4e: 0x6436, - 0x4f: 0x651d, - 0x50: 0x6417, - 0x51: 0x6428, - 0x52: 0x640f, - 0x53: 0x6467, - 0x54: 0x646f, - 0x55: 0x6476, - 0x56: 0x644e, - 0x57: 0x652a, - 0x58: 0x6495, - 0x59: 0x6493, - 0x5a: 0x64a5, - 0x5b: 0x64a9, - 0x5c: 0x6488, - 0x5d: 0x64bc, - }, - 0x39: [94]uint16{ - 0x00: 0x64da, - 0x01: 0x64d2, - 0x02: 0x64c5, - 0x03: 0x64c7, - 0x04: 0x64bb, - 0x05: 0x64d8, - 0x06: 0x64c2, - 0x07: 0x64f1, - 0x08: 0x64e7, - 0x09: 0x8209, - 0x0a: 0x64e0, - 0x0b: 0x64e1, - 0x0c: 0x62ac, - 0x0d: 0x64e3, - 0x0e: 0x64ef, - 0x0f: 0x652c, - 0x10: 0x64f6, - 0x11: 0x64f4, - 0x12: 0x64f2, - 0x13: 0x64fa, - 0x14: 0x6500, - 0x15: 0x64fd, - 0x16: 0x6518, - 0x17: 0x651c, - 0x18: 0x6505, - 0x19: 0x6524, - 0x1a: 0x6523, - 0x1b: 0x652b, - 0x1c: 0x6534, - 0x1d: 0x6535, - 0x1e: 0x6537, - 0x1f: 0x6536, - 0x20: 0x6538, - 0x21: 0x754b, - 0x22: 0x6548, - 0x23: 0x6556, - 0x24: 0x6555, - 0x25: 0x654d, - 0x26: 0x6558, - 0x27: 0x655e, - 0x28: 0x655d, - 0x29: 0x6572, - 0x2a: 0x6578, - 0x2b: 0x6582, - 0x2c: 0x6583, - 0x2d: 0x8b8a, - 0x2e: 0x659b, - 0x2f: 0x659f, - 0x30: 0x65ab, - 0x31: 0x65b7, - 0x32: 0x65c3, - 0x33: 0x65c6, - 0x34: 0x65c1, - 0x35: 0x65c4, - 0x36: 0x65cc, - 0x37: 0x65d2, - 0x38: 0x65db, - 0x39: 0x65d9, - 0x3a: 0x65e0, - 0x3b: 0x65e1, - 0x3c: 0x65f1, - 0x3d: 0x6772, - 0x3e: 0x660a, - 0x3f: 0x6603, - 0x40: 0x65fb, - 0x41: 0x6773, - 0x42: 0x6635, - 0x43: 0x6636, - 0x44: 0x6634, - 0x45: 0x661c, - 0x46: 0x664f, - 0x47: 0x6644, - 0x48: 0x6649, - 0x49: 0x6641, - 0x4a: 0x665e, - 0x4b: 0x665d, - 0x4c: 0x6664, - 0x4d: 0x6667, - 0x4e: 0x6668, - 0x4f: 0x665f, - 0x50: 0x6662, - 0x51: 0x6670, - 0x52: 0x6683, - 0x53: 0x6688, - 0x54: 0x668e, - 0x55: 0x6689, - 0x56: 0x6684, - 0x57: 0x6698, - 0x58: 0x669d, - 0x59: 0x66c1, - 0x5a: 0x66b9, - 0x5b: 0x66c9, - 0x5c: 0x66be, - 0x5d: 0x66bc, - }, - 0x3a: [94]uint16{ - 0x00: 0x66c4, - 0x01: 0x66b8, - 0x02: 0x66d6, - 0x03: 0x66da, - 0x04: 0x66e0, - 0x05: 0x663f, - 0x06: 0x66e6, - 0x07: 0x66e9, - 0x08: 0x66f0, - 0x09: 0x66f5, - 0x0a: 0x66f7, - 0x0b: 0x670f, - 0x0c: 0x6716, - 0x0d: 0x671e, - 0x0e: 0x6726, - 0x0f: 0x6727, - 0x10: 0x9738, - 0x11: 0x672e, - 0x12: 0x673f, - 0x13: 0x6736, - 0x14: 0x6741, - 0x15: 0x6738, - 0x16: 0x6737, - 0x17: 0x6746, - 0x18: 0x675e, - 0x19: 0x6760, - 0x1a: 0x6759, - 0x1b: 0x6763, - 0x1c: 0x6764, - 0x1d: 0x6789, - 0x1e: 0x6770, - 0x1f: 0x67a9, - 0x20: 0x677c, - 0x21: 0x676a, - 0x22: 0x678c, - 0x23: 0x678b, - 0x24: 0x67a6, - 0x25: 0x67a1, - 0x26: 0x6785, - 0x27: 0x67b7, - 0x28: 0x67ef, - 0x29: 0x67b4, - 0x2a: 0x67ec, - 0x2b: 0x67b3, - 0x2c: 0x67e9, - 0x2d: 0x67b8, - 0x2e: 0x67e4, - 0x2f: 0x67de, - 0x30: 0x67dd, - 0x31: 0x67e2, - 0x32: 0x67ee, - 0x33: 0x67b9, - 0x34: 0x67ce, - 0x35: 0x67c6, - 0x36: 0x67e7, - 0x37: 0x6a9c, - 0x38: 0x681e, - 0x39: 0x6846, - 0x3a: 0x6829, - 0x3b: 0x6840, - 0x3c: 0x684d, - 0x3d: 0x6832, - 0x3e: 0x684e, - 0x3f: 0x68b3, - 0x40: 0x682b, - 0x41: 0x6859, - 0x42: 0x6863, - 0x43: 0x6877, - 0x44: 0x687f, - 0x45: 0x689f, - 0x46: 0x688f, - 0x47: 0x68ad, - 0x48: 0x6894, - 0x49: 0x689d, - 0x4a: 0x689b, - 0x4b: 0x6883, - 0x4c: 0x6aae, - 0x4d: 0x68b9, - 0x4e: 0x6874, - 0x4f: 0x68b5, - 0x50: 0x68a0, - 0x51: 0x68ba, - 0x52: 0x690f, - 0x53: 0x688d, - 0x54: 0x687e, - 0x55: 0x6901, - 0x56: 0x68ca, - 0x57: 0x6908, - 0x58: 0x68d8, - 0x59: 0x6922, - 0x5a: 0x6926, - 0x5b: 0x68e1, - 0x5c: 0x690c, - 0x5d: 0x68cd, - }, - 0x3b: [94]uint16{ - 0x00: 0x68d4, - 0x01: 0x68e7, - 0x02: 0x68d5, - 0x03: 0x6936, - 0x04: 0x6912, - 0x05: 0x6904, - 0x06: 0x68d7, - 0x07: 0x68e3, - 0x08: 0x6925, - 0x09: 0x68f9, - 0x0a: 0x68e0, - 0x0b: 0x68ef, - 0x0c: 0x6928, - 0x0d: 0x692a, - 0x0e: 0x691a, - 0x0f: 0x6923, - 0x10: 0x6921, - 0x11: 0x68c6, - 0x12: 0x6979, - 0x13: 0x6977, - 0x14: 0x695c, - 0x15: 0x6978, - 0x16: 0x696b, - 0x17: 0x6954, - 0x18: 0x697e, - 0x19: 0x696e, - 0x1a: 0x6939, - 0x1b: 0x6974, - 0x1c: 0x693d, - 0x1d: 0x6959, - 0x1e: 0x6930, - 0x1f: 0x6961, - 0x20: 0x695e, - 0x21: 0x695d, - 0x22: 0x6981, - 0x23: 0x696a, - 0x24: 0x69b2, - 0x25: 0x69ae, - 0x26: 0x69d0, - 0x27: 0x69bf, - 0x28: 0x69c1, - 0x29: 0x69d3, - 0x2a: 0x69be, - 0x2b: 0x69ce, - 0x2c: 0x5be8, - 0x2d: 0x69ca, - 0x2e: 0x69dd, - 0x2f: 0x69bb, - 0x30: 0x69c3, - 0x31: 0x69a7, - 0x32: 0x6a2e, - 0x33: 0x6991, - 0x34: 0x69a0, - 0x35: 0x699c, - 0x36: 0x6995, - 0x37: 0x69b4, - 0x38: 0x69de, - 0x39: 0x69e8, - 0x3a: 0x6a02, - 0x3b: 0x6a1b, - 0x3c: 0x69ff, - 0x3d: 0x6b0a, - 0x3e: 0x69f9, - 0x3f: 0x69f2, - 0x40: 0x69e7, - 0x41: 0x6a05, - 0x42: 0x69b1, - 0x43: 0x6a1e, - 0x44: 0x69ed, - 0x45: 0x6a14, - 0x46: 0x69eb, - 0x47: 0x6a0a, - 0x48: 0x6a12, - 0x49: 0x6ac1, - 0x4a: 0x6a23, - 0x4b: 0x6a13, - 0x4c: 0x6a44, - 0x4d: 0x6a0c, - 0x4e: 0x6a72, - 0x4f: 0x6a36, - 0x50: 0x6a78, - 0x51: 0x6a47, - 0x52: 0x6a62, - 0x53: 0x6a59, - 0x54: 0x6a66, - 0x55: 0x6a48, - 0x56: 0x6a38, - 0x57: 0x6a22, - 0x58: 0x6a90, - 0x59: 0x6a8d, - 0x5a: 0x6aa0, - 0x5b: 0x6a84, - 0x5c: 0x6aa2, - 0x5d: 0x6aa3, - }, - 0x3c: [94]uint16{ - 0x00: 0x6a97, - 0x01: 0x8617, - 0x02: 0x6abb, - 0x03: 0x6ac3, - 0x04: 0x6ac2, - 0x05: 0x6ab8, - 0x06: 0x6ab3, - 0x07: 0x6aac, - 0x08: 0x6ade, - 0x09: 0x6ad1, - 0x0a: 0x6adf, - 0x0b: 0x6aaa, - 0x0c: 0x6ada, - 0x0d: 0x6aea, - 0x0e: 0x6afb, - 0x0f: 0x6b05, - 0x10: 0x8616, - 0x11: 0x6afa, - 0x12: 0x6b12, - 0x13: 0x6b16, - 0x14: 0x9b31, - 0x15: 0x6b1f, - 0x16: 0x6b38, - 0x17: 0x6b37, - 0x18: 0x76dc, - 0x19: 0x6b39, - 0x1a: 0x98ee, - 0x1b: 0x6b47, - 0x1c: 0x6b43, - 0x1d: 0x6b49, - 0x1e: 0x6b50, - 0x1f: 0x6b59, - 0x20: 0x6b54, - 0x21: 0x6b5b, - 0x22: 0x6b5f, - 0x23: 0x6b61, - 0x24: 0x6b78, - 0x25: 0x6b79, - 0x26: 0x6b7f, - 0x27: 0x6b80, - 0x28: 0x6b84, - 0x29: 0x6b83, - 0x2a: 0x6b8d, - 0x2b: 0x6b98, - 0x2c: 0x6b95, - 0x2d: 0x6b9e, - 0x2e: 0x6ba4, - 0x2f: 0x6baa, - 0x30: 0x6bab, - 0x31: 0x6baf, - 0x32: 0x6bb2, - 0x33: 0x6bb1, - 0x34: 0x6bb3, - 0x35: 0x6bb7, - 0x36: 0x6bbc, - 0x37: 0x6bc6, - 0x38: 0x6bcb, - 0x39: 0x6bd3, - 0x3a: 0x6bdf, - 0x3b: 0x6bec, - 0x3c: 0x6beb, - 0x3d: 0x6bf3, - 0x3e: 0x6bef, - 0x3f: 0x9ebe, - 0x40: 0x6c08, - 0x41: 0x6c13, - 0x42: 0x6c14, - 0x43: 0x6c1b, - 0x44: 0x6c24, - 0x45: 0x6c23, - 0x46: 0x6c5e, - 0x47: 0x6c55, - 0x48: 0x6c62, - 0x49: 0x6c6a, - 0x4a: 0x6c82, - 0x4b: 0x6c8d, - 0x4c: 0x6c9a, - 0x4d: 0x6c81, - 0x4e: 0x6c9b, - 0x4f: 0x6c7e, - 0x50: 0x6c68, - 0x51: 0x6c73, - 0x52: 0x6c92, - 0x53: 0x6c90, - 0x54: 0x6cc4, - 0x55: 0x6cf1, - 0x56: 0x6cd3, - 0x57: 0x6cbd, - 0x58: 0x6cd7, - 0x59: 0x6cc5, - 0x5a: 0x6cdd, - 0x5b: 0x6cae, - 0x5c: 0x6cb1, - 0x5d: 0x6cbe, - }, - 0x3d: [94]uint16{ - 0x00: 0x6cba, - 0x01: 0x6cdb, - 0x02: 0x6cef, - 0x03: 0x6cd9, - 0x04: 0x6cea, - 0x05: 0x6d1f, - 0x06: 0x884d, - 0x07: 0x6d36, - 0x08: 0x6d2b, - 0x09: 0x6d3d, - 0x0a: 0x6d38, - 0x0b: 0x6d19, - 0x0c: 0x6d35, - 0x0d: 0x6d33, - 0x0e: 0x6d12, - 0x0f: 0x6d0c, - 0x10: 0x6d63, - 0x11: 0x6d93, - 0x12: 0x6d64, - 0x13: 0x6d5a, - 0x14: 0x6d79, - 0x15: 0x6d59, - 0x16: 0x6d8e, - 0x17: 0x6d95, - 0x18: 0x6fe4, - 0x19: 0x6d85, - 0x1a: 0x6df9, - 0x1b: 0x6e15, - 0x1c: 0x6e0a, - 0x1d: 0x6db5, - 0x1e: 0x6dc7, - 0x1f: 0x6de6, - 0x20: 0x6db8, - 0x21: 0x6dc6, - 0x22: 0x6dec, - 0x23: 0x6dde, - 0x24: 0x6dcc, - 0x25: 0x6de8, - 0x26: 0x6dd2, - 0x27: 0x6dc5, - 0x28: 0x6dfa, - 0x29: 0x6dd9, - 0x2a: 0x6de4, - 0x2b: 0x6dd5, - 0x2c: 0x6dea, - 0x2d: 0x6dee, - 0x2e: 0x6e2d, - 0x2f: 0x6e6e, - 0x30: 0x6e2e, - 0x31: 0x6e19, - 0x32: 0x6e72, - 0x33: 0x6e5f, - 0x34: 0x6e3e, - 0x35: 0x6e23, - 0x36: 0x6e6b, - 0x37: 0x6e2b, - 0x38: 0x6e76, - 0x39: 0x6e4d, - 0x3a: 0x6e1f, - 0x3b: 0x6e43, - 0x3c: 0x6e3a, - 0x3d: 0x6e4e, - 0x3e: 0x6e24, - 0x3f: 0x6eff, - 0x40: 0x6e1d, - 0x41: 0x6e38, - 0x42: 0x6e82, - 0x43: 0x6eaa, - 0x44: 0x6e98, - 0x45: 0x6ec9, - 0x46: 0x6eb7, - 0x47: 0x6ed3, - 0x48: 0x6ebd, - 0x49: 0x6eaf, - 0x4a: 0x6ec4, - 0x4b: 0x6eb2, - 0x4c: 0x6ed4, - 0x4d: 0x6ed5, - 0x4e: 0x6e8f, - 0x4f: 0x6ea5, - 0x50: 0x6ec2, - 0x51: 0x6e9f, - 0x52: 0x6f41, - 0x53: 0x6f11, - 0x54: 0x704c, - 0x55: 0x6eec, - 0x56: 0x6ef8, - 0x57: 0x6efe, - 0x58: 0x6f3f, - 0x59: 0x6ef2, - 0x5a: 0x6f31, - 0x5b: 0x6eef, - 0x5c: 0x6f32, - 0x5d: 0x6ecc, - }, - 0x3e: [94]uint16{ - 0x00: 0x6f3e, - 0x01: 0x6f13, - 0x02: 0x6ef7, - 0x03: 0x6f86, - 0x04: 0x6f7a, - 0x05: 0x6f78, - 0x06: 0x6f81, - 0x07: 0x6f80, - 0x08: 0x6f6f, - 0x09: 0x6f5b, - 0x0a: 0x6ff3, - 0x0b: 0x6f6d, - 0x0c: 0x6f82, - 0x0d: 0x6f7c, - 0x0e: 0x6f58, - 0x0f: 0x6f8e, - 0x10: 0x6f91, - 0x11: 0x6fc2, - 0x12: 0x6f66, - 0x13: 0x6fb3, - 0x14: 0x6fa3, - 0x15: 0x6fa1, - 0x16: 0x6fa4, - 0x17: 0x6fb9, - 0x18: 0x6fc6, - 0x19: 0x6faa, - 0x1a: 0x6fdf, - 0x1b: 0x6fd5, - 0x1c: 0x6fec, - 0x1d: 0x6fd4, - 0x1e: 0x6fd8, - 0x1f: 0x6ff1, - 0x20: 0x6fee, - 0x21: 0x6fdb, - 0x22: 0x7009, - 0x23: 0x700b, - 0x24: 0x6ffa, - 0x25: 0x7011, - 0x26: 0x7001, - 0x27: 0x700f, - 0x28: 0x6ffe, - 0x29: 0x701b, - 0x2a: 0x701a, - 0x2b: 0x6f74, - 0x2c: 0x701d, - 0x2d: 0x7018, - 0x2e: 0x701f, - 0x2f: 0x7030, - 0x30: 0x703e, - 0x31: 0x7032, - 0x32: 0x7051, - 0x33: 0x7063, - 0x34: 0x7099, - 0x35: 0x7092, - 0x36: 0x70af, - 0x37: 0x70f1, - 0x38: 0x70ac, - 0x39: 0x70b8, - 0x3a: 0x70b3, - 0x3b: 0x70ae, - 0x3c: 0x70df, - 0x3d: 0x70cb, - 0x3e: 0x70dd, - 0x3f: 0x70d9, - 0x40: 0x7109, - 0x41: 0x70fd, - 0x42: 0x711c, - 0x43: 0x7119, - 0x44: 0x7165, - 0x45: 0x7155, - 0x46: 0x7188, - 0x47: 0x7166, - 0x48: 0x7162, - 0x49: 0x714c, - 0x4a: 0x7156, - 0x4b: 0x716c, - 0x4c: 0x718f, - 0x4d: 0x71fb, - 0x4e: 0x7184, - 0x4f: 0x7195, - 0x50: 0x71a8, - 0x51: 0x71ac, - 0x52: 0x71d7, - 0x53: 0x71b9, - 0x54: 0x71be, - 0x55: 0x71d2, - 0x56: 0x71c9, - 0x57: 0x71d4, - 0x58: 0x71ce, - 0x59: 0x71e0, - 0x5a: 0x71ec, - 0x5b: 0x71e7, - 0x5c: 0x71f5, - 0x5d: 0x71fc, - }, - 0x3f: [94]uint16{ - 0x00: 0x71f9, - 0x01: 0x71ff, - 0x02: 0x720d, - 0x03: 0x7210, - 0x04: 0x721b, - 0x05: 0x7228, - 0x06: 0x722d, - 0x07: 0x722c, - 0x08: 0x7230, - 0x09: 0x7232, - 0x0a: 0x723b, - 0x0b: 0x723c, - 0x0c: 0x723f, - 0x0d: 0x7240, - 0x0e: 0x7246, - 0x0f: 0x724b, - 0x10: 0x7258, - 0x11: 0x7274, - 0x12: 0x727e, - 0x13: 0x7282, - 0x14: 0x7281, - 0x15: 0x7287, - 0x16: 0x7292, - 0x17: 0x7296, - 0x18: 0x72a2, - 0x19: 0x72a7, - 0x1a: 0x72b9, - 0x1b: 0x72b2, - 0x1c: 0x72c3, - 0x1d: 0x72c6, - 0x1e: 0x72c4, - 0x1f: 0x72ce, - 0x20: 0x72d2, - 0x21: 0x72e2, - 0x22: 0x72e0, - 0x23: 0x72e1, - 0x24: 0x72f9, - 0x25: 0x72f7, - 0x26: 0x500f, - 0x27: 0x7317, - 0x28: 0x730a, - 0x29: 0x731c, - 0x2a: 0x7316, - 0x2b: 0x731d, - 0x2c: 0x7334, - 0x2d: 0x732f, - 0x2e: 0x7329, - 0x2f: 0x7325, - 0x30: 0x733e, - 0x31: 0x734e, - 0x32: 0x734f, - 0x33: 0x9ed8, - 0x34: 0x7357, - 0x35: 0x736a, - 0x36: 0x7368, - 0x37: 0x7370, - 0x38: 0x7378, - 0x39: 0x7375, - 0x3a: 0x737b, - 0x3b: 0x737a, - 0x3c: 0x73c8, - 0x3d: 0x73b3, - 0x3e: 0x73ce, - 0x3f: 0x73bb, - 0x40: 0x73c0, - 0x41: 0x73e5, - 0x42: 0x73ee, - 0x43: 0x73de, - 0x44: 0x74a2, - 0x45: 0x7405, - 0x46: 0x746f, - 0x47: 0x7425, - 0x48: 0x73f8, - 0x49: 0x7432, - 0x4a: 0x743a, - 0x4b: 0x7455, - 0x4c: 0x743f, - 0x4d: 0x745f, - 0x4e: 0x7459, - 0x4f: 0x7441, - 0x50: 0x745c, - 0x51: 0x7469, - 0x52: 0x7470, - 0x53: 0x7463, - 0x54: 0x746a, - 0x55: 0x7476, - 0x56: 0x747e, - 0x57: 0x748b, - 0x58: 0x749e, - 0x59: 0x74a7, - 0x5a: 0x74ca, - 0x5b: 0x74cf, - 0x5c: 0x74d4, - 0x5d: 0x73f1, - }, - 0x40: [94]uint16{ - 0x00: 0x74e0, - 0x01: 0x74e3, - 0x02: 0x74e7, - 0x03: 0x74e9, - 0x04: 0x74ee, - 0x05: 0x74f2, - 0x06: 0x74f0, - 0x07: 0x74f1, - 0x08: 0x74f8, - 0x09: 0x74f7, - 0x0a: 0x7504, - 0x0b: 0x7503, - 0x0c: 0x7505, - 0x0d: 0x750c, - 0x0e: 0x750e, - 0x0f: 0x750d, - 0x10: 0x7515, - 0x11: 0x7513, - 0x12: 0x751e, - 0x13: 0x7526, - 0x14: 0x752c, - 0x15: 0x753c, - 0x16: 0x7544, - 0x17: 0x754d, - 0x18: 0x754a, - 0x19: 0x7549, - 0x1a: 0x755b, - 0x1b: 0x7546, - 0x1c: 0x755a, - 0x1d: 0x7569, - 0x1e: 0x7564, - 0x1f: 0x7567, - 0x20: 0x756b, - 0x21: 0x756d, - 0x22: 0x7578, - 0x23: 0x7576, - 0x24: 0x7586, - 0x25: 0x7587, - 0x26: 0x7574, - 0x27: 0x758a, - 0x28: 0x7589, - 0x29: 0x7582, - 0x2a: 0x7594, - 0x2b: 0x759a, - 0x2c: 0x759d, - 0x2d: 0x75a5, - 0x2e: 0x75a3, - 0x2f: 0x75c2, - 0x30: 0x75b3, - 0x31: 0x75c3, - 0x32: 0x75b5, - 0x33: 0x75bd, - 0x34: 0x75b8, - 0x35: 0x75bc, - 0x36: 0x75b1, - 0x37: 0x75cd, - 0x38: 0x75ca, - 0x39: 0x75d2, - 0x3a: 0x75d9, - 0x3b: 0x75e3, - 0x3c: 0x75de, - 0x3d: 0x75fe, - 0x3e: 0x75ff, - 0x3f: 0x75fc, - 0x40: 0x7601, - 0x41: 0x75f0, - 0x42: 0x75fa, - 0x43: 0x75f2, - 0x44: 0x75f3, - 0x45: 0x760b, - 0x46: 0x760d, - 0x47: 0x7609, - 0x48: 0x761f, - 0x49: 0x7627, - 0x4a: 0x7620, - 0x4b: 0x7621, - 0x4c: 0x7622, - 0x4d: 0x7624, - 0x4e: 0x7634, - 0x4f: 0x7630, - 0x50: 0x763b, - 0x51: 0x7647, - 0x52: 0x7648, - 0x53: 0x7646, - 0x54: 0x765c, - 0x55: 0x7658, - 0x56: 0x7661, - 0x57: 0x7662, - 0x58: 0x7668, - 0x59: 0x7669, - 0x5a: 0x766a, - 0x5b: 0x7667, - 0x5c: 0x766c, - 0x5d: 0x7670, - }, - 0x41: [94]uint16{ - 0x00: 0x7672, - 0x01: 0x7676, - 0x02: 0x7678, - 0x03: 0x767c, - 0x04: 0x7680, - 0x05: 0x7683, - 0x06: 0x7688, - 0x07: 0x768b, - 0x08: 0x768e, - 0x09: 0x7696, - 0x0a: 0x7693, - 0x0b: 0x7699, - 0x0c: 0x769a, - 0x0d: 0x76b0, - 0x0e: 0x76b4, - 0x0f: 0x76b8, - 0x10: 0x76b9, - 0x11: 0x76ba, - 0x12: 0x76c2, - 0x13: 0x76cd, - 0x14: 0x76d6, - 0x15: 0x76d2, - 0x16: 0x76de, - 0x17: 0x76e1, - 0x18: 0x76e5, - 0x19: 0x76e7, - 0x1a: 0x76ea, - 0x1b: 0x862f, - 0x1c: 0x76fb, - 0x1d: 0x7708, - 0x1e: 0x7707, - 0x1f: 0x7704, - 0x20: 0x7729, - 0x21: 0x7724, - 0x22: 0x771e, - 0x23: 0x7725, - 0x24: 0x7726, - 0x25: 0x771b, - 0x26: 0x7737, - 0x27: 0x7738, - 0x28: 0x7747, - 0x29: 0x775a, - 0x2a: 0x7768, - 0x2b: 0x776b, - 0x2c: 0x775b, - 0x2d: 0x7765, - 0x2e: 0x777f, - 0x2f: 0x777e, - 0x30: 0x7779, - 0x31: 0x778e, - 0x32: 0x778b, - 0x33: 0x7791, - 0x34: 0x77a0, - 0x35: 0x779e, - 0x36: 0x77b0, - 0x37: 0x77b6, - 0x38: 0x77b9, - 0x39: 0x77bf, - 0x3a: 0x77bc, - 0x3b: 0x77bd, - 0x3c: 0x77bb, - 0x3d: 0x77c7, - 0x3e: 0x77cd, - 0x3f: 0x77d7, - 0x40: 0x77da, - 0x41: 0x77dc, - 0x42: 0x77e3, - 0x43: 0x77ee, - 0x44: 0x77fc, - 0x45: 0x780c, - 0x46: 0x7812, - 0x47: 0x7926, - 0x48: 0x7820, - 0x49: 0x792a, - 0x4a: 0x7845, - 0x4b: 0x788e, - 0x4c: 0x7874, - 0x4d: 0x7886, - 0x4e: 0x787c, - 0x4f: 0x789a, - 0x50: 0x788c, - 0x51: 0x78a3, - 0x52: 0x78b5, - 0x53: 0x78aa, - 0x54: 0x78af, - 0x55: 0x78d1, - 0x56: 0x78c6, - 0x57: 0x78cb, - 0x58: 0x78d4, - 0x59: 0x78be, - 0x5a: 0x78bc, - 0x5b: 0x78c5, - 0x5c: 0x78ca, - 0x5d: 0x78ec, - }, - 0x42: [94]uint16{ - 0x00: 0x78e7, - 0x01: 0x78da, - 0x02: 0x78fd, - 0x03: 0x78f4, - 0x04: 0x7907, - 0x05: 0x7912, - 0x06: 0x7911, - 0x07: 0x7919, - 0x08: 0x792c, - 0x09: 0x792b, - 0x0a: 0x7940, - 0x0b: 0x7960, - 0x0c: 0x7957, - 0x0d: 0x795f, - 0x0e: 0x795a, - 0x0f: 0x7955, - 0x10: 0x7953, - 0x11: 0x797a, - 0x12: 0x797f, - 0x13: 0x798a, - 0x14: 0x799d, - 0x15: 0x79a7, - 0x16: 0x9f4b, - 0x17: 0x79aa, - 0x18: 0x79ae, - 0x19: 0x79b3, - 0x1a: 0x79b9, - 0x1b: 0x79ba, - 0x1c: 0x79c9, - 0x1d: 0x79d5, - 0x1e: 0x79e7, - 0x1f: 0x79ec, - 0x20: 0x79e1, - 0x21: 0x79e3, - 0x22: 0x7a08, - 0x23: 0x7a0d, - 0x24: 0x7a18, - 0x25: 0x7a19, - 0x26: 0x7a20, - 0x27: 0x7a1f, - 0x28: 0x7980, - 0x29: 0x7a31, - 0x2a: 0x7a3b, - 0x2b: 0x7a3e, - 0x2c: 0x7a37, - 0x2d: 0x7a43, - 0x2e: 0x7a57, - 0x2f: 0x7a49, - 0x30: 0x7a61, - 0x31: 0x7a62, - 0x32: 0x7a69, - 0x33: 0x9f9d, - 0x34: 0x7a70, - 0x35: 0x7a79, - 0x36: 0x7a7d, - 0x37: 0x7a88, - 0x38: 0x7a97, - 0x39: 0x7a95, - 0x3a: 0x7a98, - 0x3b: 0x7a96, - 0x3c: 0x7aa9, - 0x3d: 0x7ac8, - 0x3e: 0x7ab0, - 0x3f: 0x7ab6, - 0x40: 0x7ac5, - 0x41: 0x7ac4, - 0x42: 0x7abf, - 0x43: 0x9083, - 0x44: 0x7ac7, - 0x45: 0x7aca, - 0x46: 0x7acd, - 0x47: 0x7acf, - 0x48: 0x7ad5, - 0x49: 0x7ad3, - 0x4a: 0x7ad9, - 0x4b: 0x7ada, - 0x4c: 0x7add, - 0x4d: 0x7ae1, - 0x4e: 0x7ae2, - 0x4f: 0x7ae6, - 0x50: 0x7aed, - 0x51: 0x7af0, - 0x52: 0x7b02, - 0x53: 0x7b0f, - 0x54: 0x7b0a, - 0x55: 0x7b06, - 0x56: 0x7b33, - 0x57: 0x7b18, - 0x58: 0x7b19, - 0x59: 0x7b1e, - 0x5a: 0x7b35, - 0x5b: 0x7b28, - 0x5c: 0x7b36, - 0x5d: 0x7b50, - }, - 0x43: [94]uint16{ - 0x00: 0x7b7a, - 0x01: 0x7b04, - 0x02: 0x7b4d, - 0x03: 0x7b0b, - 0x04: 0x7b4c, - 0x05: 0x7b45, - 0x06: 0x7b75, - 0x07: 0x7b65, - 0x08: 0x7b74, - 0x09: 0x7b67, - 0x0a: 0x7b70, - 0x0b: 0x7b71, - 0x0c: 0x7b6c, - 0x0d: 0x7b6e, - 0x0e: 0x7b9d, - 0x0f: 0x7b98, - 0x10: 0x7b9f, - 0x11: 0x7b8d, - 0x12: 0x7b9c, - 0x13: 0x7b9a, - 0x14: 0x7b8b, - 0x15: 0x7b92, - 0x16: 0x7b8f, - 0x17: 0x7b5d, - 0x18: 0x7b99, - 0x19: 0x7bcb, - 0x1a: 0x7bc1, - 0x1b: 0x7bcc, - 0x1c: 0x7bcf, - 0x1d: 0x7bb4, - 0x1e: 0x7bc6, - 0x1f: 0x7bdd, - 0x20: 0x7be9, - 0x21: 0x7c11, - 0x22: 0x7c14, - 0x23: 0x7be6, - 0x24: 0x7be5, - 0x25: 0x7c60, - 0x26: 0x7c00, - 0x27: 0x7c07, - 0x28: 0x7c13, - 0x29: 0x7bf3, - 0x2a: 0x7bf7, - 0x2b: 0x7c17, - 0x2c: 0x7c0d, - 0x2d: 0x7bf6, - 0x2e: 0x7c23, - 0x2f: 0x7c27, - 0x30: 0x7c2a, - 0x31: 0x7c1f, - 0x32: 0x7c37, - 0x33: 0x7c2b, - 0x34: 0x7c3d, - 0x35: 0x7c4c, - 0x36: 0x7c43, - 0x37: 0x7c54, - 0x38: 0x7c4f, - 0x39: 0x7c40, - 0x3a: 0x7c50, - 0x3b: 0x7c58, - 0x3c: 0x7c5f, - 0x3d: 0x7c64, - 0x3e: 0x7c56, - 0x3f: 0x7c65, - 0x40: 0x7c6c, - 0x41: 0x7c75, - 0x42: 0x7c83, - 0x43: 0x7c90, - 0x44: 0x7ca4, - 0x45: 0x7cad, - 0x46: 0x7ca2, - 0x47: 0x7cab, - 0x48: 0x7ca1, - 0x49: 0x7ca8, - 0x4a: 0x7cb3, - 0x4b: 0x7cb2, - 0x4c: 0x7cb1, - 0x4d: 0x7cae, - 0x4e: 0x7cb9, - 0x4f: 0x7cbd, - 0x50: 0x7cc0, - 0x51: 0x7cc5, - 0x52: 0x7cc2, - 0x53: 0x7cd8, - 0x54: 0x7cd2, - 0x55: 0x7cdc, - 0x56: 0x7ce2, - 0x57: 0x9b3b, - 0x58: 0x7cef, - 0x59: 0x7cf2, - 0x5a: 0x7cf4, - 0x5b: 0x7cf6, - 0x5c: 0x7cfa, - 0x5d: 0x7d06, - }, - 0x44: [94]uint16{ - 0x00: 0x7d02, - 0x01: 0x7d1c, - 0x02: 0x7d15, - 0x03: 0x7d0a, - 0x04: 0x7d45, - 0x05: 0x7d4b, - 0x06: 0x7d2e, - 0x07: 0x7d32, - 0x08: 0x7d3f, - 0x09: 0x7d35, - 0x0a: 0x7d46, - 0x0b: 0x7d73, - 0x0c: 0x7d56, - 0x0d: 0x7d4e, - 0x0e: 0x7d72, - 0x0f: 0x7d68, - 0x10: 0x7d6e, - 0x11: 0x7d4f, - 0x12: 0x7d63, - 0x13: 0x7d93, - 0x14: 0x7d89, - 0x15: 0x7d5b, - 0x16: 0x7d8f, - 0x17: 0x7d7d, - 0x18: 0x7d9b, - 0x19: 0x7dba, - 0x1a: 0x7dae, - 0x1b: 0x7da3, - 0x1c: 0x7db5, - 0x1d: 0x7dc7, - 0x1e: 0x7dbd, - 0x1f: 0x7dab, - 0x20: 0x7e3d, - 0x21: 0x7da2, - 0x22: 0x7daf, - 0x23: 0x7ddc, - 0x24: 0x7db8, - 0x25: 0x7d9f, - 0x26: 0x7db0, - 0x27: 0x7dd8, - 0x28: 0x7ddd, - 0x29: 0x7de4, - 0x2a: 0x7dde, - 0x2b: 0x7dfb, - 0x2c: 0x7df2, - 0x2d: 0x7de1, - 0x2e: 0x7e05, - 0x2f: 0x7e0a, - 0x30: 0x7e23, - 0x31: 0x7e21, - 0x32: 0x7e12, - 0x33: 0x7e31, - 0x34: 0x7e1f, - 0x35: 0x7e09, - 0x36: 0x7e0b, - 0x37: 0x7e22, - 0x38: 0x7e46, - 0x39: 0x7e66, - 0x3a: 0x7e3b, - 0x3b: 0x7e35, - 0x3c: 0x7e39, - 0x3d: 0x7e43, - 0x3e: 0x7e37, - 0x3f: 0x7e32, - 0x40: 0x7e3a, - 0x41: 0x7e67, - 0x42: 0x7e5d, - 0x43: 0x7e56, - 0x44: 0x7e5e, - 0x45: 0x7e59, - 0x46: 0x7e5a, - 0x47: 0x7e79, - 0x48: 0x7e6a, - 0x49: 0x7e69, - 0x4a: 0x7e7c, - 0x4b: 0x7e7b, - 0x4c: 0x7e83, - 0x4d: 0x7dd5, - 0x4e: 0x7e7d, - 0x4f: 0x8fae, - 0x50: 0x7e7f, - 0x51: 0x7e88, - 0x52: 0x7e89, - 0x53: 0x7e8c, - 0x54: 0x7e92, - 0x55: 0x7e90, - 0x56: 0x7e93, - 0x57: 0x7e94, - 0x58: 0x7e96, - 0x59: 0x7e8e, - 0x5a: 0x7e9b, - 0x5b: 0x7e9c, - 0x5c: 0x7f38, - 0x5d: 0x7f3a, - }, - 0x45: [94]uint16{ - 0x00: 0x7f45, - 0x01: 0x7f4c, - 0x02: 0x7f4d, - 0x03: 0x7f4e, - 0x04: 0x7f50, - 0x05: 0x7f51, - 0x06: 0x7f55, - 0x07: 0x7f54, - 0x08: 0x7f58, - 0x09: 0x7f5f, - 0x0a: 0x7f60, - 0x0b: 0x7f68, - 0x0c: 0x7f69, - 0x0d: 0x7f67, - 0x0e: 0x7f78, - 0x0f: 0x7f82, - 0x10: 0x7f86, - 0x11: 0x7f83, - 0x12: 0x7f88, - 0x13: 0x7f87, - 0x14: 0x7f8c, - 0x15: 0x7f94, - 0x16: 0x7f9e, - 0x17: 0x7f9d, - 0x18: 0x7f9a, - 0x19: 0x7fa3, - 0x1a: 0x7faf, - 0x1b: 0x7fb2, - 0x1c: 0x7fb9, - 0x1d: 0x7fae, - 0x1e: 0x7fb6, - 0x1f: 0x7fb8, - 0x20: 0x8b71, - 0x21: 0x7fc5, - 0x22: 0x7fc6, - 0x23: 0x7fca, - 0x24: 0x7fd5, - 0x25: 0x7fd4, - 0x26: 0x7fe1, - 0x27: 0x7fe6, - 0x28: 0x7fe9, - 0x29: 0x7ff3, - 0x2a: 0x7ff9, - 0x2b: 0x98dc, - 0x2c: 0x8006, - 0x2d: 0x8004, - 0x2e: 0x800b, - 0x2f: 0x8012, - 0x30: 0x8018, - 0x31: 0x8019, - 0x32: 0x801c, - 0x33: 0x8021, - 0x34: 0x8028, - 0x35: 0x803f, - 0x36: 0x803b, - 0x37: 0x804a, - 0x38: 0x8046, - 0x39: 0x8052, - 0x3a: 0x8058, - 0x3b: 0x805a, - 0x3c: 0x805f, - 0x3d: 0x8062, - 0x3e: 0x8068, - 0x3f: 0x8073, - 0x40: 0x8072, - 0x41: 0x8070, - 0x42: 0x8076, - 0x43: 0x8079, - 0x44: 0x807d, - 0x45: 0x807f, - 0x46: 0x8084, - 0x47: 0x8086, - 0x48: 0x8085, - 0x49: 0x809b, - 0x4a: 0x8093, - 0x4b: 0x809a, - 0x4c: 0x80ad, - 0x4d: 0x5190, - 0x4e: 0x80ac, - 0x4f: 0x80db, - 0x50: 0x80e5, - 0x51: 0x80d9, - 0x52: 0x80dd, - 0x53: 0x80c4, - 0x54: 0x80da, - 0x55: 0x80d6, - 0x56: 0x8109, - 0x57: 0x80ef, - 0x58: 0x80f1, - 0x59: 0x811b, - 0x5a: 0x8129, - 0x5b: 0x8123, - 0x5c: 0x812f, - 0x5d: 0x814b, - }, - 0x46: [94]uint16{ - 0x00: 0x968b, - 0x01: 0x8146, - 0x02: 0x813e, - 0x03: 0x8153, - 0x04: 0x8151, - 0x05: 0x80fc, - 0x06: 0x8171, - 0x07: 0x816e, - 0x08: 0x8165, - 0x09: 0x8166, - 0x0a: 0x8174, - 0x0b: 0x8183, - 0x0c: 0x8188, - 0x0d: 0x818a, - 0x0e: 0x8180, - 0x0f: 0x8182, - 0x10: 0x81a0, - 0x11: 0x8195, - 0x12: 0x81a4, - 0x13: 0x81a3, - 0x14: 0x815f, - 0x15: 0x8193, - 0x16: 0x81a9, - 0x17: 0x81b0, - 0x18: 0x81b5, - 0x19: 0x81be, - 0x1a: 0x81b8, - 0x1b: 0x81bd, - 0x1c: 0x81c0, - 0x1d: 0x81c2, - 0x1e: 0x81ba, - 0x1f: 0x81c9, - 0x20: 0x81cd, - 0x21: 0x81d1, - 0x22: 0x81d9, - 0x23: 0x81d8, - 0x24: 0x81c8, - 0x25: 0x81da, - 0x26: 0x81df, - 0x27: 0x81e0, - 0x28: 0x81e7, - 0x29: 0x81fa, - 0x2a: 0x81fb, - 0x2b: 0x81fe, - 0x2c: 0x8201, - 0x2d: 0x8202, - 0x2e: 0x8205, - 0x2f: 0x8207, - 0x30: 0x820a, - 0x31: 0x820d, - 0x32: 0x8210, - 0x33: 0x8216, - 0x34: 0x8229, - 0x35: 0x822b, - 0x36: 0x8238, - 0x37: 0x8233, - 0x38: 0x8240, - 0x39: 0x8259, - 0x3a: 0x8258, - 0x3b: 0x825d, - 0x3c: 0x825a, - 0x3d: 0x825f, - 0x3e: 0x8264, - 0x3f: 0x8262, - 0x40: 0x8268, - 0x41: 0x826a, - 0x42: 0x826b, - 0x43: 0x822e, - 0x44: 0x8271, - 0x45: 0x8277, - 0x46: 0x8278, - 0x47: 0x827e, - 0x48: 0x828d, - 0x49: 0x8292, - 0x4a: 0x82ab, - 0x4b: 0x829f, - 0x4c: 0x82bb, - 0x4d: 0x82ac, - 0x4e: 0x82e1, - 0x4f: 0x82e3, - 0x50: 0x82df, - 0x51: 0x82d2, - 0x52: 0x82f4, - 0x53: 0x82f3, - 0x54: 0x82fa, - 0x55: 0x8393, - 0x56: 0x8303, - 0x57: 0x82fb, - 0x58: 0x82f9, - 0x59: 0x82de, - 0x5a: 0x8306, - 0x5b: 0x82dc, - 0x5c: 0x8309, - 0x5d: 0x82d9, - }, - 0x47: [94]uint16{ - 0x00: 0x8335, - 0x01: 0x8334, - 0x02: 0x8316, - 0x03: 0x8332, - 0x04: 0x8331, - 0x05: 0x8340, - 0x06: 0x8339, - 0x07: 0x8350, - 0x08: 0x8345, - 0x09: 0x832f, - 0x0a: 0x832b, - 0x0b: 0x8317, - 0x0c: 0x8318, - 0x0d: 0x8385, - 0x0e: 0x839a, - 0x0f: 0x83aa, - 0x10: 0x839f, - 0x11: 0x83a2, - 0x12: 0x8396, - 0x13: 0x8323, - 0x14: 0x838e, - 0x15: 0x8387, - 0x16: 0x838a, - 0x17: 0x837c, - 0x18: 0x83b5, - 0x19: 0x8373, - 0x1a: 0x8375, - 0x1b: 0x83a0, - 0x1c: 0x8389, - 0x1d: 0x83a8, - 0x1e: 0x83f4, - 0x1f: 0x8413, - 0x20: 0x83eb, - 0x21: 0x83ce, - 0x22: 0x83fd, - 0x23: 0x8403, - 0x24: 0x83d8, - 0x25: 0x840b, - 0x26: 0x83c1, - 0x27: 0x83f7, - 0x28: 0x8407, - 0x29: 0x83e0, - 0x2a: 0x83f2, - 0x2b: 0x840d, - 0x2c: 0x8422, - 0x2d: 0x8420, - 0x2e: 0x83bd, - 0x2f: 0x8438, - 0x30: 0x8506, - 0x31: 0x83fb, - 0x32: 0x846d, - 0x33: 0x842a, - 0x34: 0x843c, - 0x35: 0x855a, - 0x36: 0x8484, - 0x37: 0x8477, - 0x38: 0x846b, - 0x39: 0x84ad, - 0x3a: 0x846e, - 0x3b: 0x8482, - 0x3c: 0x8469, - 0x3d: 0x8446, - 0x3e: 0x842c, - 0x3f: 0x846f, - 0x40: 0x8479, - 0x41: 0x8435, - 0x42: 0x84ca, - 0x43: 0x8462, - 0x44: 0x84b9, - 0x45: 0x84bf, - 0x46: 0x849f, - 0x47: 0x84d9, - 0x48: 0x84cd, - 0x49: 0x84bb, - 0x4a: 0x84da, - 0x4b: 0x84d0, - 0x4c: 0x84c1, - 0x4d: 0x84c6, - 0x4e: 0x84d6, - 0x4f: 0x84a1, - 0x50: 0x8521, - 0x51: 0x84ff, - 0x52: 0x84f4, - 0x53: 0x8517, - 0x54: 0x8518, - 0x55: 0x852c, - 0x56: 0x851f, - 0x57: 0x8515, - 0x58: 0x8514, - 0x59: 0x84fc, - 0x5a: 0x8540, - 0x5b: 0x8563, - 0x5c: 0x8558, - 0x5d: 0x8548, - }, - 0x48: [94]uint16{ - 0x00: 0x8541, - 0x01: 0x8602, - 0x02: 0x854b, - 0x03: 0x8555, - 0x04: 0x8580, - 0x05: 0x85a4, - 0x06: 0x8588, - 0x07: 0x8591, - 0x08: 0x858a, - 0x09: 0x85a8, - 0x0a: 0x856d, - 0x0b: 0x8594, - 0x0c: 0x859b, - 0x0d: 0x85ea, - 0x0e: 0x8587, - 0x0f: 0x859c, - 0x10: 0x8577, - 0x11: 0x857e, - 0x12: 0x8590, - 0x13: 0x85c9, - 0x14: 0x85ba, - 0x15: 0x85cf, - 0x16: 0x85b9, - 0x17: 0x85d0, - 0x18: 0x85d5, - 0x19: 0x85dd, - 0x1a: 0x85e5, - 0x1b: 0x85dc, - 0x1c: 0x85f9, - 0x1d: 0x860a, - 0x1e: 0x8613, - 0x1f: 0x860b, - 0x20: 0x85fe, - 0x21: 0x85fa, - 0x22: 0x8606, - 0x23: 0x8622, - 0x24: 0x861a, - 0x25: 0x8630, - 0x26: 0x863f, - 0x27: 0x864d, - 0x28: 0x4e55, - 0x29: 0x8654, - 0x2a: 0x865f, - 0x2b: 0x8667, - 0x2c: 0x8671, - 0x2d: 0x8693, - 0x2e: 0x86a3, - 0x2f: 0x86a9, - 0x30: 0x86aa, - 0x31: 0x868b, - 0x32: 0x868c, - 0x33: 0x86b6, - 0x34: 0x86af, - 0x35: 0x86c4, - 0x36: 0x86c6, - 0x37: 0x86b0, - 0x38: 0x86c9, - 0x39: 0x8823, - 0x3a: 0x86ab, - 0x3b: 0x86d4, - 0x3c: 0x86de, - 0x3d: 0x86e9, - 0x3e: 0x86ec, - 0x3f: 0x86df, - 0x40: 0x86db, - 0x41: 0x86ef, - 0x42: 0x8712, - 0x43: 0x8706, - 0x44: 0x8708, - 0x45: 0x8700, - 0x46: 0x8703, - 0x47: 0x86fb, - 0x48: 0x8711, - 0x49: 0x8709, - 0x4a: 0x870d, - 0x4b: 0x86f9, - 0x4c: 0x870a, - 0x4d: 0x8734, - 0x4e: 0x873f, - 0x4f: 0x8737, - 0x50: 0x873b, - 0x51: 0x8725, - 0x52: 0x8729, - 0x53: 0x871a, - 0x54: 0x8760, - 0x55: 0x875f, - 0x56: 0x8778, - 0x57: 0x874c, - 0x58: 0x874e, - 0x59: 0x8774, - 0x5a: 0x8757, - 0x5b: 0x8768, - 0x5c: 0x876e, - 0x5d: 0x8759, - }, - 0x49: [94]uint16{ - 0x00: 0x8753, - 0x01: 0x8763, - 0x02: 0x876a, - 0x03: 0x8805, - 0x04: 0x87a2, - 0x05: 0x879f, - 0x06: 0x8782, - 0x07: 0x87af, - 0x08: 0x87cb, - 0x09: 0x87bd, - 0x0a: 0x87c0, - 0x0b: 0x87d0, - 0x0c: 0x96d6, - 0x0d: 0x87ab, - 0x0e: 0x87c4, - 0x0f: 0x87b3, - 0x10: 0x87c7, - 0x11: 0x87c6, - 0x12: 0x87bb, - 0x13: 0x87ef, - 0x14: 0x87f2, - 0x15: 0x87e0, - 0x16: 0x880f, - 0x17: 0x880d, - 0x18: 0x87fe, - 0x19: 0x87f6, - 0x1a: 0x87f7, - 0x1b: 0x880e, - 0x1c: 0x87d2, - 0x1d: 0x8811, - 0x1e: 0x8816, - 0x1f: 0x8815, - 0x20: 0x8822, - 0x21: 0x8821, - 0x22: 0x8831, - 0x23: 0x8836, - 0x24: 0x8839, - 0x25: 0x8827, - 0x26: 0x883b, - 0x27: 0x8844, - 0x28: 0x8842, - 0x29: 0x8852, - 0x2a: 0x8859, - 0x2b: 0x885e, - 0x2c: 0x8862, - 0x2d: 0x886b, - 0x2e: 0x8881, - 0x2f: 0x887e, - 0x30: 0x889e, - 0x31: 0x8875, - 0x32: 0x887d, - 0x33: 0x88b5, - 0x34: 0x8872, - 0x35: 0x8882, - 0x36: 0x8897, - 0x37: 0x8892, - 0x38: 0x88ae, - 0x39: 0x8899, - 0x3a: 0x88a2, - 0x3b: 0x888d, - 0x3c: 0x88a4, - 0x3d: 0x88b0, - 0x3e: 0x88bf, - 0x3f: 0x88b1, - 0x40: 0x88c3, - 0x41: 0x88c4, - 0x42: 0x88d4, - 0x43: 0x88d8, - 0x44: 0x88d9, - 0x45: 0x88dd, - 0x46: 0x88f9, - 0x47: 0x8902, - 0x48: 0x88fc, - 0x49: 0x88f4, - 0x4a: 0x88e8, - 0x4b: 0x88f2, - 0x4c: 0x8904, - 0x4d: 0x890c, - 0x4e: 0x890a, - 0x4f: 0x8913, - 0x50: 0x8943, - 0x51: 0x891e, - 0x52: 0x8925, - 0x53: 0x892a, - 0x54: 0x892b, - 0x55: 0x8941, - 0x56: 0x8944, - 0x57: 0x893b, - 0x58: 0x8936, - 0x59: 0x8938, - 0x5a: 0x894c, - 0x5b: 0x891d, - 0x5c: 0x8960, - 0x5d: 0x895e, - }, - 0x4a: [94]uint16{ - 0x00: 0x8966, - 0x01: 0x8964, - 0x02: 0x896d, - 0x03: 0x896a, - 0x04: 0x896f, - 0x05: 0x8974, - 0x06: 0x8977, - 0x07: 0x897e, - 0x08: 0x8983, - 0x09: 0x8988, - 0x0a: 0x898a, - 0x0b: 0x8993, - 0x0c: 0x8998, - 0x0d: 0x89a1, - 0x0e: 0x89a9, - 0x0f: 0x89a6, - 0x10: 0x89ac, - 0x11: 0x89af, - 0x12: 0x89b2, - 0x13: 0x89ba, - 0x14: 0x89bd, - 0x15: 0x89bf, - 0x16: 0x89c0, - 0x17: 0x89da, - 0x18: 0x89dc, - 0x19: 0x89dd, - 0x1a: 0x89e7, - 0x1b: 0x89f4, - 0x1c: 0x89f8, - 0x1d: 0x8a03, - 0x1e: 0x8a16, - 0x1f: 0x8a10, - 0x20: 0x8a0c, - 0x21: 0x8a1b, - 0x22: 0x8a1d, - 0x23: 0x8a25, - 0x24: 0x8a36, - 0x25: 0x8a41, - 0x26: 0x8a5b, - 0x27: 0x8a52, - 0x28: 0x8a46, - 0x29: 0x8a48, - 0x2a: 0x8a7c, - 0x2b: 0x8a6d, - 0x2c: 0x8a6c, - 0x2d: 0x8a62, - 0x2e: 0x8a85, - 0x2f: 0x8a82, - 0x30: 0x8a84, - 0x31: 0x8aa8, - 0x32: 0x8aa1, - 0x33: 0x8a91, - 0x34: 0x8aa5, - 0x35: 0x8aa6, - 0x36: 0x8a9a, - 0x37: 0x8aa3, - 0x38: 0x8ac4, - 0x39: 0x8acd, - 0x3a: 0x8ac2, - 0x3b: 0x8ada, - 0x3c: 0x8aeb, - 0x3d: 0x8af3, - 0x3e: 0x8ae7, - 0x3f: 0x8ae4, - 0x40: 0x8af1, - 0x41: 0x8b14, - 0x42: 0x8ae0, - 0x43: 0x8ae2, - 0x44: 0x8af7, - 0x45: 0x8ade, - 0x46: 0x8adb, - 0x47: 0x8b0c, - 0x48: 0x8b07, - 0x49: 0x8b1a, - 0x4a: 0x8ae1, - 0x4b: 0x8b16, - 0x4c: 0x8b10, - 0x4d: 0x8b17, - 0x4e: 0x8b20, - 0x4f: 0x8b33, - 0x50: 0x97ab, - 0x51: 0x8b26, - 0x52: 0x8b2b, - 0x53: 0x8b3e, - 0x54: 0x8b28, - 0x55: 0x8b41, - 0x56: 0x8b4c, - 0x57: 0x8b4f, - 0x58: 0x8b4e, - 0x59: 0x8b49, - 0x5a: 0x8b56, - 0x5b: 0x8b5b, - 0x5c: 0x8b5a, - 0x5d: 0x8b6b, - }, - 0x4b: [94]uint16{ - 0x00: 0x8b5f, - 0x01: 0x8b6c, - 0x02: 0x8b6f, - 0x03: 0x8b74, - 0x04: 0x8b7d, - 0x05: 0x8b80, - 0x06: 0x8b8c, - 0x07: 0x8b8e, - 0x08: 0x8b92, - 0x09: 0x8b93, - 0x0a: 0x8b96, - 0x0b: 0x8b99, - 0x0c: 0x8b9a, - 0x0d: 0x8c3a, - 0x0e: 0x8c41, - 0x0f: 0x8c3f, - 0x10: 0x8c48, - 0x11: 0x8c4c, - 0x12: 0x8c4e, - 0x13: 0x8c50, - 0x14: 0x8c55, - 0x15: 0x8c62, - 0x16: 0x8c6c, - 0x17: 0x8c78, - 0x18: 0x8c7a, - 0x19: 0x8c82, - 0x1a: 0x8c89, - 0x1b: 0x8c85, - 0x1c: 0x8c8a, - 0x1d: 0x8c8d, - 0x1e: 0x8c8e, - 0x1f: 0x8c94, - 0x20: 0x8c7c, - 0x21: 0x8c98, - 0x22: 0x621d, - 0x23: 0x8cad, - 0x24: 0x8caa, - 0x25: 0x8cbd, - 0x26: 0x8cb2, - 0x27: 0x8cb3, - 0x28: 0x8cae, - 0x29: 0x8cb6, - 0x2a: 0x8cc8, - 0x2b: 0x8cc1, - 0x2c: 0x8ce4, - 0x2d: 0x8ce3, - 0x2e: 0x8cda, - 0x2f: 0x8cfd, - 0x30: 0x8cfa, - 0x31: 0x8cfb, - 0x32: 0x8d04, - 0x33: 0x8d05, - 0x34: 0x8d0a, - 0x35: 0x8d07, - 0x36: 0x8d0f, - 0x37: 0x8d0d, - 0x38: 0x8d10, - 0x39: 0x9f4e, - 0x3a: 0x8d13, - 0x3b: 0x8ccd, - 0x3c: 0x8d14, - 0x3d: 0x8d16, - 0x3e: 0x8d67, - 0x3f: 0x8d6d, - 0x40: 0x8d71, - 0x41: 0x8d73, - 0x42: 0x8d81, - 0x43: 0x8d99, - 0x44: 0x8dc2, - 0x45: 0x8dbe, - 0x46: 0x8dba, - 0x47: 0x8dcf, - 0x48: 0x8dda, - 0x49: 0x8dd6, - 0x4a: 0x8dcc, - 0x4b: 0x8ddb, - 0x4c: 0x8dcb, - 0x4d: 0x8dea, - 0x4e: 0x8deb, - 0x4f: 0x8ddf, - 0x50: 0x8de3, - 0x51: 0x8dfc, - 0x52: 0x8e08, - 0x53: 0x8e09, - 0x54: 0x8dff, - 0x55: 0x8e1d, - 0x56: 0x8e1e, - 0x57: 0x8e10, - 0x58: 0x8e1f, - 0x59: 0x8e42, - 0x5a: 0x8e35, - 0x5b: 0x8e30, - 0x5c: 0x8e34, - 0x5d: 0x8e4a, - }, - 0x4c: [94]uint16{ - 0x00: 0x8e47, - 0x01: 0x8e49, - 0x02: 0x8e4c, - 0x03: 0x8e50, - 0x04: 0x8e48, - 0x05: 0x8e59, - 0x06: 0x8e64, - 0x07: 0x8e60, - 0x08: 0x8e2a, - 0x09: 0x8e63, - 0x0a: 0x8e55, - 0x0b: 0x8e76, - 0x0c: 0x8e72, - 0x0d: 0x8e7c, - 0x0e: 0x8e81, - 0x0f: 0x8e87, - 0x10: 0x8e85, - 0x11: 0x8e84, - 0x12: 0x8e8b, - 0x13: 0x8e8a, - 0x14: 0x8e93, - 0x15: 0x8e91, - 0x16: 0x8e94, - 0x17: 0x8e99, - 0x18: 0x8eaa, - 0x19: 0x8ea1, - 0x1a: 0x8eac, - 0x1b: 0x8eb0, - 0x1c: 0x8ec6, - 0x1d: 0x8eb1, - 0x1e: 0x8ebe, - 0x1f: 0x8ec5, - 0x20: 0x8ec8, - 0x21: 0x8ecb, - 0x22: 0x8edb, - 0x23: 0x8ee3, - 0x24: 0x8efc, - 0x25: 0x8efb, - 0x26: 0x8eeb, - 0x27: 0x8efe, - 0x28: 0x8f0a, - 0x29: 0x8f05, - 0x2a: 0x8f15, - 0x2b: 0x8f12, - 0x2c: 0x8f19, - 0x2d: 0x8f13, - 0x2e: 0x8f1c, - 0x2f: 0x8f1f, - 0x30: 0x8f1b, - 0x31: 0x8f0c, - 0x32: 0x8f26, - 0x33: 0x8f33, - 0x34: 0x8f3b, - 0x35: 0x8f39, - 0x36: 0x8f45, - 0x37: 0x8f42, - 0x38: 0x8f3e, - 0x39: 0x8f4c, - 0x3a: 0x8f49, - 0x3b: 0x8f46, - 0x3c: 0x8f4e, - 0x3d: 0x8f57, - 0x3e: 0x8f5c, - 0x3f: 0x8f62, - 0x40: 0x8f63, - 0x41: 0x8f64, - 0x42: 0x8f9c, - 0x43: 0x8f9f, - 0x44: 0x8fa3, - 0x45: 0x8fad, - 0x46: 0x8faf, - 0x47: 0x8fb7, - 0x48: 0x8fda, - 0x49: 0x8fe5, - 0x4a: 0x8fe2, - 0x4b: 0x8fea, - 0x4c: 0x8fef, - 0x4d: 0x9087, - 0x4e: 0x8ff4, - 0x4f: 0x9005, - 0x50: 0x8ff9, - 0x51: 0x8ffa, - 0x52: 0x9011, - 0x53: 0x9015, - 0x54: 0x9021, - 0x55: 0x900d, - 0x56: 0x901e, - 0x57: 0x9016, - 0x58: 0x900b, - 0x59: 0x9027, - 0x5a: 0x9036, - 0x5b: 0x9035, - 0x5c: 0x9039, - 0x5d: 0x8ff8, - }, - 0x4d: [94]uint16{ - 0x00: 0x904f, - 0x01: 0x9050, - 0x02: 0x9051, - 0x03: 0x9052, - 0x04: 0x900e, - 0x05: 0x9049, - 0x06: 0x903e, - 0x07: 0x9056, - 0x08: 0x9058, - 0x09: 0x905e, - 0x0a: 0x9068, - 0x0b: 0x906f, - 0x0c: 0x9076, - 0x0d: 0x96a8, - 0x0e: 0x9072, - 0x0f: 0x9082, - 0x10: 0x907d, - 0x11: 0x9081, - 0x12: 0x9080, - 0x13: 0x908a, - 0x14: 0x9089, - 0x15: 0x908f, - 0x16: 0x90a8, - 0x17: 0x90af, - 0x18: 0x90b1, - 0x19: 0x90b5, - 0x1a: 0x90e2, - 0x1b: 0x90e4, - 0x1c: 0x6248, - 0x1d: 0x90db, - 0x1e: 0x9102, - 0x1f: 0x9112, - 0x20: 0x9119, - 0x21: 0x9132, - 0x22: 0x9130, - 0x23: 0x914a, - 0x24: 0x9156, - 0x25: 0x9158, - 0x26: 0x9163, - 0x27: 0x9165, - 0x28: 0x9169, - 0x29: 0x9173, - 0x2a: 0x9172, - 0x2b: 0x918b, - 0x2c: 0x9189, - 0x2d: 0x9182, - 0x2e: 0x91a2, - 0x2f: 0x91ab, - 0x30: 0x91af, - 0x31: 0x91aa, - 0x32: 0x91b5, - 0x33: 0x91b4, - 0x34: 0x91ba, - 0x35: 0x91c0, - 0x36: 0x91c1, - 0x37: 0x91c9, - 0x38: 0x91cb, - 0x39: 0x91d0, - 0x3a: 0x91d6, - 0x3b: 0x91df, - 0x3c: 0x91e1, - 0x3d: 0x91db, - 0x3e: 0x91fc, - 0x3f: 0x91f5, - 0x40: 0x91f6, - 0x41: 0x921e, - 0x42: 0x91ff, - 0x43: 0x9214, - 0x44: 0x922c, - 0x45: 0x9215, - 0x46: 0x9211, - 0x47: 0x925e, - 0x48: 0x9257, - 0x49: 0x9245, - 0x4a: 0x9249, - 0x4b: 0x9264, - 0x4c: 0x9248, - 0x4d: 0x9295, - 0x4e: 0x923f, - 0x4f: 0x924b, - 0x50: 0x9250, - 0x51: 0x929c, - 0x52: 0x9296, - 0x53: 0x9293, - 0x54: 0x929b, - 0x55: 0x925a, - 0x56: 0x92cf, - 0x57: 0x92b9, - 0x58: 0x92b7, - 0x59: 0x92e9, - 0x5a: 0x930f, - 0x5b: 0x92fa, - 0x5c: 0x9344, - 0x5d: 0x932e, - }, - 0x4e: [94]uint16{ - 0x00: 0x9319, - 0x01: 0x9322, - 0x02: 0x931a, - 0x03: 0x9323, - 0x04: 0x933a, - 0x05: 0x9335, - 0x06: 0x933b, - 0x07: 0x935c, - 0x08: 0x9360, - 0x09: 0x937c, - 0x0a: 0x936e, - 0x0b: 0x9356, - 0x0c: 0x93b0, - 0x0d: 0x93ac, - 0x0e: 0x93ad, - 0x0f: 0x9394, - 0x10: 0x93b9, - 0x11: 0x93d6, - 0x12: 0x93d7, - 0x13: 0x93e8, - 0x14: 0x93e5, - 0x15: 0x93d8, - 0x16: 0x93c3, - 0x17: 0x93dd, - 0x18: 0x93d0, - 0x19: 0x93c8, - 0x1a: 0x93e4, - 0x1b: 0x941a, - 0x1c: 0x9414, - 0x1d: 0x9413, - 0x1e: 0x9403, - 0x1f: 0x9407, - 0x20: 0x9410, - 0x21: 0x9436, - 0x22: 0x942b, - 0x23: 0x9435, - 0x24: 0x9421, - 0x25: 0x943a, - 0x26: 0x9441, - 0x27: 0x9452, - 0x28: 0x9444, - 0x29: 0x945b, - 0x2a: 0x9460, - 0x2b: 0x9462, - 0x2c: 0x945e, - 0x2d: 0x946a, - 0x2e: 0x9229, - 0x2f: 0x9470, - 0x30: 0x9475, - 0x31: 0x9477, - 0x32: 0x947d, - 0x33: 0x945a, - 0x34: 0x947c, - 0x35: 0x947e, - 0x36: 0x9481, - 0x37: 0x947f, - 0x38: 0x9582, - 0x39: 0x9587, - 0x3a: 0x958a, - 0x3b: 0x9594, - 0x3c: 0x9596, - 0x3d: 0x9598, - 0x3e: 0x9599, - 0x3f: 0x95a0, - 0x40: 0x95a8, - 0x41: 0x95a7, - 0x42: 0x95ad, - 0x43: 0x95bc, - 0x44: 0x95bb, - 0x45: 0x95b9, - 0x46: 0x95be, - 0x47: 0x95ca, - 0x48: 0x6ff6, - 0x49: 0x95c3, - 0x4a: 0x95cd, - 0x4b: 0x95cc, - 0x4c: 0x95d5, - 0x4d: 0x95d4, - 0x4e: 0x95d6, - 0x4f: 0x95dc, - 0x50: 0x95e1, - 0x51: 0x95e5, - 0x52: 0x95e2, - 0x53: 0x9621, - 0x54: 0x9628, - 0x55: 0x962e, - 0x56: 0x962f, - 0x57: 0x9642, - 0x58: 0x964c, - 0x59: 0x964f, - 0x5a: 0x964b, - 0x5b: 0x9677, - 0x5c: 0x965c, - 0x5d: 0x965e, - }, - 0x4f: [94]uint16{ - 0x00: 0x965d, - 0x01: 0x965f, - 0x02: 0x9666, - 0x03: 0x9672, - 0x04: 0x966c, - 0x05: 0x968d, - 0x06: 0x9698, - 0x07: 0x9695, - 0x08: 0x9697, - 0x09: 0x96aa, - 0x0a: 0x96a7, - 0x0b: 0x96b1, - 0x0c: 0x96b2, - 0x0d: 0x96b0, - 0x0e: 0x96b4, - 0x0f: 0x96b6, - 0x10: 0x96b8, - 0x11: 0x96b9, - 0x12: 0x96ce, - 0x13: 0x96cb, - 0x14: 0x96c9, - 0x15: 0x96cd, - 0x16: 0x894d, - 0x17: 0x96dc, - 0x18: 0x970d, - 0x19: 0x96d5, - 0x1a: 0x96f9, - 0x1b: 0x9704, - 0x1c: 0x9706, - 0x1d: 0x9708, - 0x1e: 0x9713, - 0x1f: 0x970e, - 0x20: 0x9711, - 0x21: 0x970f, - 0x22: 0x9716, - 0x23: 0x9719, - 0x24: 0x9724, - 0x25: 0x972a, - 0x26: 0x9730, - 0x27: 0x9739, - 0x28: 0x973d, - 0x29: 0x973e, - 0x2a: 0x9744, - 0x2b: 0x9746, - 0x2c: 0x9748, - 0x2d: 0x9742, - 0x2e: 0x9749, - 0x2f: 0x975c, - 0x30: 0x9760, - 0x31: 0x9764, - 0x32: 0x9766, - 0x33: 0x9768, - 0x34: 0x52d2, - 0x35: 0x976b, - 0x36: 0x9771, - 0x37: 0x9779, - 0x38: 0x9785, - 0x39: 0x977c, - 0x3a: 0x9781, - 0x3b: 0x977a, - 0x3c: 0x9786, - 0x3d: 0x978b, - 0x3e: 0x978f, - 0x3f: 0x9790, - 0x40: 0x979c, - 0x41: 0x97a8, - 0x42: 0x97a6, - 0x43: 0x97a3, - 0x44: 0x97b3, - 0x45: 0x97b4, - 0x46: 0x97c3, - 0x47: 0x97c6, - 0x48: 0x97c8, - 0x49: 0x97cb, - 0x4a: 0x97dc, - 0x4b: 0x97ed, - 0x4c: 0x9f4f, - 0x4d: 0x97f2, - 0x4e: 0x7adf, - 0x4f: 0x97f6, - 0x50: 0x97f5, - 0x51: 0x980f, - 0x52: 0x980c, - 0x53: 0x9838, - 0x54: 0x9824, - 0x55: 0x9821, - 0x56: 0x9837, - 0x57: 0x983d, - 0x58: 0x9846, - 0x59: 0x984f, - 0x5a: 0x984b, - 0x5b: 0x986b, - 0x5c: 0x986f, - 0x5d: 0x9870, - }, - 0x50: [94]uint16{ - 0x00: 0x9871, - 0x01: 0x9874, - 0x02: 0x9873, - 0x03: 0x98aa, - 0x04: 0x98af, - 0x05: 0x98b1, - 0x06: 0x98b6, - 0x07: 0x98c4, - 0x08: 0x98c3, - 0x09: 0x98c6, - 0x0a: 0x98e9, - 0x0b: 0x98eb, - 0x0c: 0x9903, - 0x0d: 0x9909, - 0x0e: 0x9912, - 0x0f: 0x9914, - 0x10: 0x9918, - 0x11: 0x9921, - 0x12: 0x991d, - 0x13: 0x991e, - 0x14: 0x9924, - 0x15: 0x9920, - 0x16: 0x992c, - 0x17: 0x992e, - 0x18: 0x993d, - 0x19: 0x993e, - 0x1a: 0x9942, - 0x1b: 0x9949, - 0x1c: 0x9945, - 0x1d: 0x9950, - 0x1e: 0x994b, - 0x1f: 0x9951, - 0x20: 0x9952, - 0x21: 0x994c, - 0x22: 0x9955, - 0x23: 0x9997, - 0x24: 0x9998, - 0x25: 0x99a5, - 0x26: 0x99ad, - 0x27: 0x99ae, - 0x28: 0x99bc, - 0x29: 0x99df, - 0x2a: 0x99db, - 0x2b: 0x99dd, - 0x2c: 0x99d8, - 0x2d: 0x99d1, - 0x2e: 0x99ed, - 0x2f: 0x99ee, - 0x30: 0x99f1, - 0x31: 0x99f2, - 0x32: 0x99fb, - 0x33: 0x99f8, - 0x34: 0x9a01, - 0x35: 0x9a0f, - 0x36: 0x9a05, - 0x37: 0x99e2, - 0x38: 0x9a19, - 0x39: 0x9a2b, - 0x3a: 0x9a37, - 0x3b: 0x9a45, - 0x3c: 0x9a42, - 0x3d: 0x9a40, - 0x3e: 0x9a43, - 0x3f: 0x9a3e, - 0x40: 0x9a55, - 0x41: 0x9a4d, - 0x42: 0x9a5b, - 0x43: 0x9a57, - 0x44: 0x9a5f, - 0x45: 0x9a62, - 0x46: 0x9a65, - 0x47: 0x9a64, - 0x48: 0x9a69, - 0x49: 0x9a6b, - 0x4a: 0x9a6a, - 0x4b: 0x9aad, - 0x4c: 0x9ab0, - 0x4d: 0x9abc, - 0x4e: 0x9ac0, - 0x4f: 0x9acf, - 0x50: 0x9ad1, - 0x51: 0x9ad3, - 0x52: 0x9ad4, - 0x53: 0x9ade, - 0x54: 0x9adf, - 0x55: 0x9ae2, - 0x56: 0x9ae3, - 0x57: 0x9ae6, - 0x58: 0x9aef, - 0x59: 0x9aeb, - 0x5a: 0x9aee, - 0x5b: 0x9af4, - 0x5c: 0x9af1, - 0x5d: 0x9af7, - }, - 0x51: [94]uint16{ - 0x00: 0x9afb, - 0x01: 0x9b06, - 0x02: 0x9b18, - 0x03: 0x9b1a, - 0x04: 0x9b1f, - 0x05: 0x9b22, - 0x06: 0x9b23, - 0x07: 0x9b25, - 0x08: 0x9b27, - 0x09: 0x9b28, - 0x0a: 0x9b29, - 0x0b: 0x9b2a, - 0x0c: 0x9b2e, - 0x0d: 0x9b2f, - 0x0e: 0x9b32, - 0x0f: 0x9b44, - 0x10: 0x9b43, - 0x11: 0x9b4f, - 0x12: 0x9b4d, - 0x13: 0x9b4e, - 0x14: 0x9b51, - 0x15: 0x9b58, - 0x16: 0x9b74, - 0x17: 0x9b93, - 0x18: 0x9b83, - 0x19: 0x9b91, - 0x1a: 0x9b96, - 0x1b: 0x9b97, - 0x1c: 0x9b9f, - 0x1d: 0x9ba0, - 0x1e: 0x9ba8, - 0x1f: 0x9bb4, - 0x20: 0x9bc0, - 0x21: 0x9bca, - 0x22: 0x9bb9, - 0x23: 0x9bc6, - 0x24: 0x9bcf, - 0x25: 0x9bd1, - 0x26: 0x9bd2, - 0x27: 0x9be3, - 0x28: 0x9be2, - 0x29: 0x9be4, - 0x2a: 0x9bd4, - 0x2b: 0x9be1, - 0x2c: 0x9c3a, - 0x2d: 0x9bf2, - 0x2e: 0x9bf1, - 0x2f: 0x9bf0, - 0x30: 0x9c15, - 0x31: 0x9c14, - 0x32: 0x9c09, - 0x33: 0x9c13, - 0x34: 0x9c0c, - 0x35: 0x9c06, - 0x36: 0x9c08, - 0x37: 0x9c12, - 0x38: 0x9c0a, - 0x39: 0x9c04, - 0x3a: 0x9c2e, - 0x3b: 0x9c1b, - 0x3c: 0x9c25, - 0x3d: 0x9c24, - 0x3e: 0x9c21, - 0x3f: 0x9c30, - 0x40: 0x9c47, - 0x41: 0x9c32, - 0x42: 0x9c46, - 0x43: 0x9c3e, - 0x44: 0x9c5a, - 0x45: 0x9c60, - 0x46: 0x9c67, - 0x47: 0x9c76, - 0x48: 0x9c78, - 0x49: 0x9ce7, - 0x4a: 0x9cec, - 0x4b: 0x9cf0, - 0x4c: 0x9d09, - 0x4d: 0x9d08, - 0x4e: 0x9ceb, - 0x4f: 0x9d03, - 0x50: 0x9d06, - 0x51: 0x9d2a, - 0x52: 0x9d26, - 0x53: 0x9daf, - 0x54: 0x9d23, - 0x55: 0x9d1f, - 0x56: 0x9d44, - 0x57: 0x9d15, - 0x58: 0x9d12, - 0x59: 0x9d41, - 0x5a: 0x9d3f, - 0x5b: 0x9d3e, - 0x5c: 0x9d46, - 0x5d: 0x9d48, - }, - 0x52: [94]uint16{ - 0x00: 0x9d5d, - 0x01: 0x9d5e, - 0x02: 0x9d64, - 0x03: 0x9d51, - 0x04: 0x9d50, - 0x05: 0x9d59, - 0x06: 0x9d72, - 0x07: 0x9d89, - 0x08: 0x9d87, - 0x09: 0x9dab, - 0x0a: 0x9d6f, - 0x0b: 0x9d7a, - 0x0c: 0x9d9a, - 0x0d: 0x9da4, - 0x0e: 0x9da9, - 0x0f: 0x9db2, - 0x10: 0x9dc4, - 0x11: 0x9dc1, - 0x12: 0x9dbb, - 0x13: 0x9db8, - 0x14: 0x9dba, - 0x15: 0x9dc6, - 0x16: 0x9dcf, - 0x17: 0x9dc2, - 0x18: 0x9dd9, - 0x19: 0x9dd3, - 0x1a: 0x9df8, - 0x1b: 0x9de6, - 0x1c: 0x9ded, - 0x1d: 0x9def, - 0x1e: 0x9dfd, - 0x1f: 0x9e1a, - 0x20: 0x9e1b, - 0x21: 0x9e1e, - 0x22: 0x9e75, - 0x23: 0x9e79, - 0x24: 0x9e7d, - 0x25: 0x9e81, - 0x26: 0x9e88, - 0x27: 0x9e8b, - 0x28: 0x9e8c, - 0x29: 0x9e92, - 0x2a: 0x9e95, - 0x2b: 0x9e91, - 0x2c: 0x9e9d, - 0x2d: 0x9ea5, - 0x2e: 0x9ea9, - 0x2f: 0x9eb8, - 0x30: 0x9eaa, - 0x31: 0x9ead, - 0x32: 0x9761, - 0x33: 0x9ecc, - 0x34: 0x9ece, - 0x35: 0x9ecf, - 0x36: 0x9ed0, - 0x37: 0x9ed4, - 0x38: 0x9edc, - 0x39: 0x9ede, - 0x3a: 0x9edd, - 0x3b: 0x9ee0, - 0x3c: 0x9ee5, - 0x3d: 0x9ee8, - 0x3e: 0x9eef, - 0x3f: 0x9ef4, - 0x40: 0x9ef6, - 0x41: 0x9ef7, - 0x42: 0x9ef9, - 0x43: 0x9efb, - 0x44: 0x9efc, - 0x45: 0x9efd, - 0x46: 0x9f07, - 0x47: 0x9f08, - 0x48: 0x76b7, - 0x49: 0x9f15, - 0x4a: 0x9f21, - 0x4b: 0x9f2c, - 0x4c: 0x9f3e, - 0x4d: 0x9f4a, - 0x4e: 0x9f52, - 0x4f: 0x9f54, - 0x50: 0x9f63, - 0x51: 0x9f5f, - 0x52: 0x9f60, - 0x53: 0x9f61, - 0x54: 0x9f66, - 0x55: 0x9f67, - 0x56: 0x9f6c, - 0x57: 0x9f6a, - 0x58: 0x9f77, - 0x59: 0x9f72, - 0x5a: 0x9f76, - 0x5b: 0x9f95, - 0x5c: 0x9f9c, - 0x5d: 0x9fa0, - }, - 0x53: [94]uint16{ - 0x00: 0x582f, - 0x01: 0x69c7, - 0x02: 0x9059, - 0x03: 0x7464, - 0x04: 0x51dc, - 0x05: 0x7199, - }, - }, -} diff --git a/vendor/github.com/Tang-RoseChild/mahonia/jis0212-data.go b/vendor/github.com/Tang-RoseChild/mahonia/jis0212-data.go deleted file mode 100644 index 0e521f615..000000000 --- a/vendor/github.com/Tang-RoseChild/mahonia/jis0212-data.go +++ /dev/null @@ -1,6209 +0,0 @@ -package mahonia - -var jis0212Table = kutenTable{ - Data: [94][94]uint16{ - 0x01: [94]uint16{ - 0x0e: 0x02d8, - 0x0f: 0x02c7, - 0x10: 0x00b8, - 0x11: 0x02d9, - 0x12: 0x02dd, - 0x13: 0x00af, - 0x14: 0x02db, - 0x15: 0x02da, - 0x16: 0x007e, - 0x17: 0x0384, - 0x18: 0x0385, - 0x21: 0x00a1, - 0x22: 0x00a6, - 0x23: 0x00bf, - 0x4a: 0x00ba, - 0x4b: 0x00aa, - 0x4c: 0x00a9, - 0x4d: 0x00ae, - 0x4e: 0x2122, - 0x4f: 0x00a4, - 0x50: 0x2116, - }, - 0x05: [94]uint16{ - 0x40: 0x0386, - 0x41: 0x0388, - 0x42: 0x0389, - 0x43: 0x038a, - 0x44: 0x03aa, - 0x46: 0x038c, - 0x48: 0x038e, - 0x49: 0x03ab, - 0x4b: 0x038f, - 0x50: 0x03ac, - 0x51: 0x03ad, - 0x52: 0x03ae, - 0x53: 0x03af, - 0x54: 0x03ca, - 0x55: 0x0390, - 0x56: 0x03cc, - 0x57: 0x03c2, - 0x58: 0x03cd, - 0x59: 0x03cb, - 0x5a: 0x03b0, - 0x5b: 0x03ce, - }, - 0x06: [94]uint16{ - 0x21: 0x0402, - 0x22: 0x0403, - 0x23: 0x0404, - 0x24: 0x0405, - 0x25: 0x0406, - 0x26: 0x0407, - 0x27: 0x0408, - 0x28: 0x0409, - 0x29: 0x040a, - 0x2a: 0x040b, - 0x2b: 0x040c, - 0x2c: 0x040e, - 0x2d: 0x040f, - 0x51: 0x0452, - 0x52: 0x0453, - 0x53: 0x0454, - 0x54: 0x0455, - 0x55: 0x0456, - 0x56: 0x0457, - 0x57: 0x0458, - 0x58: 0x0459, - 0x59: 0x045a, - 0x5a: 0x045b, - 0x5b: 0x045c, - 0x5c: 0x045e, - 0x5d: 0x045f, - }, - 0x08: [94]uint16{ - 0x00: 0x00c6, - 0x01: 0x0110, - 0x03: 0x0126, - 0x05: 0x0132, - 0x07: 0x0141, - 0x08: 0x013f, - 0x0a: 0x014a, - 0x0b: 0x00d8, - 0x0c: 0x0152, - 0x0e: 0x0166, - 0x0f: 0x00de, - 0x20: 0x00e6, - 0x21: 0x0111, - 0x22: 0x00f0, - 0x23: 0x0127, - 0x24: 0x0131, - 0x25: 0x0133, - 0x26: 0x0138, - 0x27: 0x0142, - 0x28: 0x0140, - 0x29: 0x0149, - 0x2a: 0x014b, - 0x2b: 0x00f8, - 0x2c: 0x0153, - 0x2d: 0x00df, - 0x2e: 0x0167, - 0x2f: 0x00fe, - }, - 0x09: [94]uint16{ - 0x00: 0x00c1, - 0x01: 0x00c0, - 0x02: 0x00c4, - 0x03: 0x00c2, - 0x04: 0x0102, - 0x05: 0x01cd, - 0x06: 0x0100, - 0x07: 0x0104, - 0x08: 0x00c5, - 0x09: 0x00c3, - 0x0a: 0x0106, - 0x0b: 0x0108, - 0x0c: 0x010c, - 0x0d: 0x00c7, - 0x0e: 0x010a, - 0x0f: 0x010e, - 0x10: 0x00c9, - 0x11: 0x00c8, - 0x12: 0x00cb, - 0x13: 0x00ca, - 0x14: 0x011a, - 0x15: 0x0116, - 0x16: 0x0112, - 0x17: 0x0118, - 0x19: 0x011c, - 0x1a: 0x011e, - 0x1b: 0x0122, - 0x1c: 0x0120, - 0x1d: 0x0124, - 0x1e: 0x00cd, - 0x1f: 0x00cc, - 0x20: 0x00cf, - 0x21: 0x00ce, - 0x22: 0x01cf, - 0x23: 0x0130, - 0x24: 0x012a, - 0x25: 0x012e, - 0x26: 0x0128, - 0x27: 0x0134, - 0x28: 0x0136, - 0x29: 0x0139, - 0x2a: 0x013d, - 0x2b: 0x013b, - 0x2c: 0x0143, - 0x2d: 0x0147, - 0x2e: 0x0145, - 0x2f: 0x00d1, - 0x30: 0x00d3, - 0x31: 0x00d2, - 0x32: 0x00d6, - 0x33: 0x00d4, - 0x34: 0x01d1, - 0x35: 0x0150, - 0x36: 0x014c, - 0x37: 0x00d5, - 0x38: 0x0154, - 0x39: 0x0158, - 0x3a: 0x0156, - 0x3b: 0x015a, - 0x3c: 0x015c, - 0x3d: 0x0160, - 0x3e: 0x015e, - 0x3f: 0x0164, - 0x40: 0x0162, - 0x41: 0x00da, - 0x42: 0x00d9, - 0x43: 0x00dc, - 0x44: 0x00db, - 0x45: 0x016c, - 0x46: 0x01d3, - 0x47: 0x0170, - 0x48: 0x016a, - 0x49: 0x0172, - 0x4a: 0x016e, - 0x4b: 0x0168, - 0x4c: 0x01d7, - 0x4d: 0x01db, - 0x4e: 0x01d9, - 0x4f: 0x01d5, - 0x50: 0x0174, - 0x51: 0x00dd, - 0x52: 0x0178, - 0x53: 0x0176, - 0x54: 0x0179, - 0x55: 0x017d, - 0x56: 0x017b, - }, - 0x0a: [94]uint16{ - 0x00: 0x00e1, - 0x01: 0x00e0, - 0x02: 0x00e4, - 0x03: 0x00e2, - 0x04: 0x0103, - 0x05: 0x01ce, - 0x06: 0x0101, - 0x07: 0x0105, - 0x08: 0x00e5, - 0x09: 0x00e3, - 0x0a: 0x0107, - 0x0b: 0x0109, - 0x0c: 0x010d, - 0x0d: 0x00e7, - 0x0e: 0x010b, - 0x0f: 0x010f, - 0x10: 0x00e9, - 0x11: 0x00e8, - 0x12: 0x00eb, - 0x13: 0x00ea, - 0x14: 0x011b, - 0x15: 0x0117, - 0x16: 0x0113, - 0x17: 0x0119, - 0x18: 0x01f5, - 0x19: 0x011d, - 0x1a: 0x011f, - 0x1c: 0x0121, - 0x1d: 0x0125, - 0x1e: 0x00ed, - 0x1f: 0x00ec, - 0x20: 0x00ef, - 0x21: 0x00ee, - 0x22: 0x01d0, - 0x24: 0x012b, - 0x25: 0x012f, - 0x26: 0x0129, - 0x27: 0x0135, - 0x28: 0x0137, - 0x29: 0x013a, - 0x2a: 0x013e, - 0x2b: 0x013c, - 0x2c: 0x0144, - 0x2d: 0x0148, - 0x2e: 0x0146, - 0x2f: 0x00f1, - 0x30: 0x00f3, - 0x31: 0x00f2, - 0x32: 0x00f6, - 0x33: 0x00f4, - 0x34: 0x01d2, - 0x35: 0x0151, - 0x36: 0x014d, - 0x37: 0x00f5, - 0x38: 0x0155, - 0x39: 0x0159, - 0x3a: 0x0157, - 0x3b: 0x015b, - 0x3c: 0x015d, - 0x3d: 0x0161, - 0x3e: 0x015f, - 0x3f: 0x0165, - 0x40: 0x0163, - 0x41: 0x00fa, - 0x42: 0x00f9, - 0x43: 0x00fc, - 0x44: 0x00fb, - 0x45: 0x016d, - 0x46: 0x01d4, - 0x47: 0x0171, - 0x48: 0x016b, - 0x49: 0x0173, - 0x4a: 0x016f, - 0x4b: 0x0169, - 0x4c: 0x01d8, - 0x4d: 0x01dc, - 0x4e: 0x01da, - 0x4f: 0x01d6, - 0x50: 0x0175, - 0x51: 0x00fd, - 0x52: 0x00ff, - 0x53: 0x0177, - 0x54: 0x017a, - 0x55: 0x017e, - 0x56: 0x017c, - }, - 0x0f: [94]uint16{ - 0x00: 0x4e02, - 0x01: 0x4e04, - 0x02: 0x4e05, - 0x03: 0x4e0c, - 0x04: 0x4e12, - 0x05: 0x4e1f, - 0x06: 0x4e23, - 0x07: 0x4e24, - 0x08: 0x4e28, - 0x09: 0x4e2b, - 0x0a: 0x4e2e, - 0x0b: 0x4e2f, - 0x0c: 0x4e30, - 0x0d: 0x4e35, - 0x0e: 0x4e40, - 0x0f: 0x4e41, - 0x10: 0x4e44, - 0x11: 0x4e47, - 0x12: 0x4e51, - 0x13: 0x4e5a, - 0x14: 0x4e5c, - 0x15: 0x4e63, - 0x16: 0x4e68, - 0x17: 0x4e69, - 0x18: 0x4e74, - 0x19: 0x4e75, - 0x1a: 0x4e79, - 0x1b: 0x4e7f, - 0x1c: 0x4e8d, - 0x1d: 0x4e96, - 0x1e: 0x4e97, - 0x1f: 0x4e9d, - 0x20: 0x4eaf, - 0x21: 0x4eb9, - 0x22: 0x4ec3, - 0x23: 0x4ed0, - 0x24: 0x4eda, - 0x25: 0x4edb, - 0x26: 0x4ee0, - 0x27: 0x4ee1, - 0x28: 0x4ee2, - 0x29: 0x4ee8, - 0x2a: 0x4eef, - 0x2b: 0x4ef1, - 0x2c: 0x4ef3, - 0x2d: 0x4ef5, - 0x2e: 0x4efd, - 0x2f: 0x4efe, - 0x30: 0x4eff, - 0x31: 0x4f00, - 0x32: 0x4f02, - 0x33: 0x4f03, - 0x34: 0x4f08, - 0x35: 0x4f0b, - 0x36: 0x4f0c, - 0x37: 0x4f12, - 0x38: 0x4f15, - 0x39: 0x4f16, - 0x3a: 0x4f17, - 0x3b: 0x4f19, - 0x3c: 0x4f2e, - 0x3d: 0x4f31, - 0x3e: 0x4f60, - 0x3f: 0x4f33, - 0x40: 0x4f35, - 0x41: 0x4f37, - 0x42: 0x4f39, - 0x43: 0x4f3b, - 0x44: 0x4f3e, - 0x45: 0x4f40, - 0x46: 0x4f42, - 0x47: 0x4f48, - 0x48: 0x4f49, - 0x49: 0x4f4b, - 0x4a: 0x4f4c, - 0x4b: 0x4f52, - 0x4c: 0x4f54, - 0x4d: 0x4f56, - 0x4e: 0x4f58, - 0x4f: 0x4f5f, - 0x50: 0x4f63, - 0x51: 0x4f6a, - 0x52: 0x4f6c, - 0x53: 0x4f6e, - 0x54: 0x4f71, - 0x55: 0x4f77, - 0x56: 0x4f78, - 0x57: 0x4f79, - 0x58: 0x4f7a, - 0x59: 0x4f7d, - 0x5a: 0x4f7e, - 0x5b: 0x4f81, - 0x5c: 0x4f82, - 0x5d: 0x4f84, - }, - 0x10: [94]uint16{ - 0x00: 0x4f85, - 0x01: 0x4f89, - 0x02: 0x4f8a, - 0x03: 0x4f8c, - 0x04: 0x4f8e, - 0x05: 0x4f90, - 0x06: 0x4f92, - 0x07: 0x4f93, - 0x08: 0x4f94, - 0x09: 0x4f97, - 0x0a: 0x4f99, - 0x0b: 0x4f9a, - 0x0c: 0x4f9e, - 0x0d: 0x4f9f, - 0x0e: 0x4fb2, - 0x0f: 0x4fb7, - 0x10: 0x4fb9, - 0x11: 0x4fbb, - 0x12: 0x4fbc, - 0x13: 0x4fbd, - 0x14: 0x4fbe, - 0x15: 0x4fc0, - 0x16: 0x4fc1, - 0x17: 0x4fc5, - 0x18: 0x4fc6, - 0x19: 0x4fc8, - 0x1a: 0x4fc9, - 0x1b: 0x4fcb, - 0x1c: 0x4fcc, - 0x1d: 0x4fcd, - 0x1e: 0x4fcf, - 0x1f: 0x4fd2, - 0x20: 0x4fdc, - 0x21: 0x4fe0, - 0x22: 0x4fe2, - 0x23: 0x4ff0, - 0x24: 0x4ff2, - 0x25: 0x4ffc, - 0x26: 0x4ffd, - 0x27: 0x4fff, - 0x28: 0x5000, - 0x29: 0x5001, - 0x2a: 0x5004, - 0x2b: 0x5007, - 0x2c: 0x500a, - 0x2d: 0x500c, - 0x2e: 0x500e, - 0x2f: 0x5010, - 0x30: 0x5013, - 0x31: 0x5017, - 0x32: 0x5018, - 0x33: 0x501b, - 0x34: 0x501c, - 0x35: 0x501d, - 0x36: 0x501e, - 0x37: 0x5022, - 0x38: 0x5027, - 0x39: 0x502e, - 0x3a: 0x5030, - 0x3b: 0x5032, - 0x3c: 0x5033, - 0x3d: 0x5035, - 0x3e: 0x5040, - 0x3f: 0x5041, - 0x40: 0x5042, - 0x41: 0x5045, - 0x42: 0x5046, - 0x43: 0x504a, - 0x44: 0x504c, - 0x45: 0x504e, - 0x46: 0x5051, - 0x47: 0x5052, - 0x48: 0x5053, - 0x49: 0x5057, - 0x4a: 0x5059, - 0x4b: 0x505f, - 0x4c: 0x5060, - 0x4d: 0x5062, - 0x4e: 0x5063, - 0x4f: 0x5066, - 0x50: 0x5067, - 0x51: 0x506a, - 0x52: 0x506d, - 0x53: 0x5070, - 0x54: 0x5071, - 0x55: 0x503b, - 0x56: 0x5081, - 0x57: 0x5083, - 0x58: 0x5084, - 0x59: 0x5086, - 0x5a: 0x508a, - 0x5b: 0x508e, - 0x5c: 0x508f, - 0x5d: 0x5090, - }, - 0x11: [94]uint16{ - 0x00: 0x5092, - 0x01: 0x5093, - 0x02: 0x5094, - 0x03: 0x5096, - 0x04: 0x509b, - 0x05: 0x509c, - 0x06: 0x509e, - 0x07: 0x509f, - 0x08: 0x50a0, - 0x09: 0x50a1, - 0x0a: 0x50a2, - 0x0b: 0x50aa, - 0x0c: 0x50af, - 0x0d: 0x50b0, - 0x0e: 0x50b9, - 0x0f: 0x50ba, - 0x10: 0x50bd, - 0x11: 0x50c0, - 0x12: 0x50c3, - 0x13: 0x50c4, - 0x14: 0x50c7, - 0x15: 0x50cc, - 0x16: 0x50ce, - 0x17: 0x50d0, - 0x18: 0x50d3, - 0x19: 0x50d4, - 0x1a: 0x50d8, - 0x1b: 0x50dc, - 0x1c: 0x50dd, - 0x1d: 0x50df, - 0x1e: 0x50e2, - 0x1f: 0x50e4, - 0x20: 0x50e6, - 0x21: 0x50e8, - 0x22: 0x50e9, - 0x23: 0x50ef, - 0x24: 0x50f1, - 0x25: 0x50f6, - 0x26: 0x50fa, - 0x27: 0x50fe, - 0x28: 0x5103, - 0x29: 0x5106, - 0x2a: 0x5107, - 0x2b: 0x5108, - 0x2c: 0x510b, - 0x2d: 0x510c, - 0x2e: 0x510d, - 0x2f: 0x510e, - 0x30: 0x50f2, - 0x31: 0x5110, - 0x32: 0x5117, - 0x33: 0x5119, - 0x34: 0x511b, - 0x35: 0x511c, - 0x36: 0x511d, - 0x37: 0x511e, - 0x38: 0x5123, - 0x39: 0x5127, - 0x3a: 0x5128, - 0x3b: 0x512c, - 0x3c: 0x512d, - 0x3d: 0x512f, - 0x3e: 0x5131, - 0x3f: 0x5133, - 0x40: 0x5134, - 0x41: 0x5135, - 0x42: 0x5138, - 0x43: 0x5139, - 0x44: 0x5142, - 0x45: 0x514a, - 0x46: 0x514f, - 0x47: 0x5153, - 0x48: 0x5155, - 0x49: 0x5157, - 0x4a: 0x5158, - 0x4b: 0x515f, - 0x4c: 0x5164, - 0x4d: 0x5166, - 0x4e: 0x517e, - 0x4f: 0x5183, - 0x50: 0x5184, - 0x51: 0x518b, - 0x52: 0x518e, - 0x53: 0x5198, - 0x54: 0x519d, - 0x55: 0x51a1, - 0x56: 0x51a3, - 0x57: 0x51ad, - 0x58: 0x51b8, - 0x59: 0x51ba, - 0x5a: 0x51bc, - 0x5b: 0x51be, - 0x5c: 0x51bf, - 0x5d: 0x51c2, - }, - 0x12: [94]uint16{ - 0x00: 0x51c8, - 0x01: 0x51cf, - 0x02: 0x51d1, - 0x03: 0x51d2, - 0x04: 0x51d3, - 0x05: 0x51d5, - 0x06: 0x51d8, - 0x07: 0x51de, - 0x08: 0x51e2, - 0x09: 0x51e5, - 0x0a: 0x51ee, - 0x0b: 0x51f2, - 0x0c: 0x51f3, - 0x0d: 0x51f4, - 0x0e: 0x51f7, - 0x0f: 0x5201, - 0x10: 0x5202, - 0x11: 0x5205, - 0x12: 0x5212, - 0x13: 0x5213, - 0x14: 0x5215, - 0x15: 0x5216, - 0x16: 0x5218, - 0x17: 0x5222, - 0x18: 0x5228, - 0x19: 0x5231, - 0x1a: 0x5232, - 0x1b: 0x5235, - 0x1c: 0x523c, - 0x1d: 0x5245, - 0x1e: 0x5249, - 0x1f: 0x5255, - 0x20: 0x5257, - 0x21: 0x5258, - 0x22: 0x525a, - 0x23: 0x525c, - 0x24: 0x525f, - 0x25: 0x5260, - 0x26: 0x5261, - 0x27: 0x5266, - 0x28: 0x526e, - 0x29: 0x5277, - 0x2a: 0x5278, - 0x2b: 0x5279, - 0x2c: 0x5280, - 0x2d: 0x5282, - 0x2e: 0x5285, - 0x2f: 0x528a, - 0x30: 0x528c, - 0x31: 0x5293, - 0x32: 0x5295, - 0x33: 0x5296, - 0x34: 0x5297, - 0x35: 0x5298, - 0x36: 0x529a, - 0x37: 0x529c, - 0x38: 0x52a4, - 0x39: 0x52a5, - 0x3a: 0x52a6, - 0x3b: 0x52a7, - 0x3c: 0x52af, - 0x3d: 0x52b0, - 0x3e: 0x52b6, - 0x3f: 0x52b7, - 0x40: 0x52b8, - 0x41: 0x52ba, - 0x42: 0x52bb, - 0x43: 0x52bd, - 0x44: 0x52c0, - 0x45: 0x52c4, - 0x46: 0x52c6, - 0x47: 0x52c8, - 0x48: 0x52cc, - 0x49: 0x52cf, - 0x4a: 0x52d1, - 0x4b: 0x52d4, - 0x4c: 0x52d6, - 0x4d: 0x52db, - 0x4e: 0x52dc, - 0x4f: 0x52e1, - 0x50: 0x52e5, - 0x51: 0x52e8, - 0x52: 0x52e9, - 0x53: 0x52ea, - 0x54: 0x52ec, - 0x55: 0x52f0, - 0x56: 0x52f1, - 0x57: 0x52f4, - 0x58: 0x52f6, - 0x59: 0x52f7, - 0x5a: 0x5300, - 0x5b: 0x5303, - 0x5c: 0x530a, - 0x5d: 0x530b, - }, - 0x13: [94]uint16{ - 0x00: 0x530c, - 0x01: 0x5311, - 0x02: 0x5313, - 0x03: 0x5318, - 0x04: 0x531b, - 0x05: 0x531c, - 0x06: 0x531e, - 0x07: 0x531f, - 0x08: 0x5325, - 0x09: 0x5327, - 0x0a: 0x5328, - 0x0b: 0x5329, - 0x0c: 0x532b, - 0x0d: 0x532c, - 0x0e: 0x532d, - 0x0f: 0x5330, - 0x10: 0x5332, - 0x11: 0x5335, - 0x12: 0x533c, - 0x13: 0x533d, - 0x14: 0x533e, - 0x15: 0x5342, - 0x16: 0x534c, - 0x17: 0x534b, - 0x18: 0x5359, - 0x19: 0x535b, - 0x1a: 0x5361, - 0x1b: 0x5363, - 0x1c: 0x5365, - 0x1d: 0x536c, - 0x1e: 0x536d, - 0x1f: 0x5372, - 0x20: 0x5379, - 0x21: 0x537e, - 0x22: 0x5383, - 0x23: 0x5387, - 0x24: 0x5388, - 0x25: 0x538e, - 0x26: 0x5393, - 0x27: 0x5394, - 0x28: 0x5399, - 0x29: 0x539d, - 0x2a: 0x53a1, - 0x2b: 0x53a4, - 0x2c: 0x53aa, - 0x2d: 0x53ab, - 0x2e: 0x53af, - 0x2f: 0x53b2, - 0x30: 0x53b4, - 0x31: 0x53b5, - 0x32: 0x53b7, - 0x33: 0x53b8, - 0x34: 0x53ba, - 0x35: 0x53bd, - 0x36: 0x53c0, - 0x37: 0x53c5, - 0x38: 0x53cf, - 0x39: 0x53d2, - 0x3a: 0x53d3, - 0x3b: 0x53d5, - 0x3c: 0x53da, - 0x3d: 0x53dd, - 0x3e: 0x53de, - 0x3f: 0x53e0, - 0x40: 0x53e6, - 0x41: 0x53e7, - 0x42: 0x53f5, - 0x43: 0x5402, - 0x44: 0x5413, - 0x45: 0x541a, - 0x46: 0x5421, - 0x47: 0x5427, - 0x48: 0x5428, - 0x49: 0x542a, - 0x4a: 0x542f, - 0x4b: 0x5431, - 0x4c: 0x5434, - 0x4d: 0x5435, - 0x4e: 0x5443, - 0x4f: 0x5444, - 0x50: 0x5447, - 0x51: 0x544d, - 0x52: 0x544f, - 0x53: 0x545e, - 0x54: 0x5462, - 0x55: 0x5464, - 0x56: 0x5466, - 0x57: 0x5467, - 0x58: 0x5469, - 0x59: 0x546b, - 0x5a: 0x546d, - 0x5b: 0x546e, - 0x5c: 0x5474, - 0x5d: 0x547f, - }, - 0x14: [94]uint16{ - 0x00: 0x5481, - 0x01: 0x5483, - 0x02: 0x5485, - 0x03: 0x5488, - 0x04: 0x5489, - 0x05: 0x548d, - 0x06: 0x5491, - 0x07: 0x5495, - 0x08: 0x5496, - 0x09: 0x549c, - 0x0a: 0x549f, - 0x0b: 0x54a1, - 0x0c: 0x54a6, - 0x0d: 0x54a7, - 0x0e: 0x54a9, - 0x0f: 0x54aa, - 0x10: 0x54ad, - 0x11: 0x54ae, - 0x12: 0x54b1, - 0x13: 0x54b7, - 0x14: 0x54b9, - 0x15: 0x54ba, - 0x16: 0x54bb, - 0x17: 0x54bf, - 0x18: 0x54c6, - 0x19: 0x54ca, - 0x1a: 0x54cd, - 0x1b: 0x54ce, - 0x1c: 0x54e0, - 0x1d: 0x54ea, - 0x1e: 0x54ec, - 0x1f: 0x54ef, - 0x20: 0x54f6, - 0x21: 0x54fc, - 0x22: 0x54fe, - 0x23: 0x54ff, - 0x24: 0x5500, - 0x25: 0x5501, - 0x26: 0x5505, - 0x27: 0x5508, - 0x28: 0x5509, - 0x29: 0x550c, - 0x2a: 0x550d, - 0x2b: 0x550e, - 0x2c: 0x5515, - 0x2d: 0x552a, - 0x2e: 0x552b, - 0x2f: 0x5532, - 0x30: 0x5535, - 0x31: 0x5536, - 0x32: 0x553b, - 0x33: 0x553c, - 0x34: 0x553d, - 0x35: 0x5541, - 0x36: 0x5547, - 0x37: 0x5549, - 0x38: 0x554a, - 0x39: 0x554d, - 0x3a: 0x5550, - 0x3b: 0x5551, - 0x3c: 0x5558, - 0x3d: 0x555a, - 0x3e: 0x555b, - 0x3f: 0x555e, - 0x40: 0x5560, - 0x41: 0x5561, - 0x42: 0x5564, - 0x43: 0x5566, - 0x44: 0x557f, - 0x45: 0x5581, - 0x46: 0x5582, - 0x47: 0x5586, - 0x48: 0x5588, - 0x49: 0x558e, - 0x4a: 0x558f, - 0x4b: 0x5591, - 0x4c: 0x5592, - 0x4d: 0x5593, - 0x4e: 0x5594, - 0x4f: 0x5597, - 0x50: 0x55a3, - 0x51: 0x55a4, - 0x52: 0x55ad, - 0x53: 0x55b2, - 0x54: 0x55bf, - 0x55: 0x55c1, - 0x56: 0x55c3, - 0x57: 0x55c6, - 0x58: 0x55c9, - 0x59: 0x55cb, - 0x5a: 0x55cc, - 0x5b: 0x55ce, - 0x5c: 0x55d1, - 0x5d: 0x55d2, - }, - 0x15: [94]uint16{ - 0x00: 0x55d3, - 0x01: 0x55d7, - 0x02: 0x55d8, - 0x03: 0x55db, - 0x04: 0x55de, - 0x05: 0x55e2, - 0x06: 0x55e9, - 0x07: 0x55f6, - 0x08: 0x55ff, - 0x09: 0x5605, - 0x0a: 0x5608, - 0x0b: 0x560a, - 0x0c: 0x560d, - 0x0d: 0x560e, - 0x0e: 0x560f, - 0x0f: 0x5610, - 0x10: 0x5611, - 0x11: 0x5612, - 0x12: 0x5619, - 0x13: 0x562c, - 0x14: 0x5630, - 0x15: 0x5633, - 0x16: 0x5635, - 0x17: 0x5637, - 0x18: 0x5639, - 0x19: 0x563b, - 0x1a: 0x563c, - 0x1b: 0x563d, - 0x1c: 0x563f, - 0x1d: 0x5640, - 0x1e: 0x5641, - 0x1f: 0x5643, - 0x20: 0x5644, - 0x21: 0x5646, - 0x22: 0x5649, - 0x23: 0x564b, - 0x24: 0x564d, - 0x25: 0x564f, - 0x26: 0x5654, - 0x27: 0x565e, - 0x28: 0x5660, - 0x29: 0x5661, - 0x2a: 0x5662, - 0x2b: 0x5663, - 0x2c: 0x5666, - 0x2d: 0x5669, - 0x2e: 0x566d, - 0x2f: 0x566f, - 0x30: 0x5671, - 0x31: 0x5672, - 0x32: 0x5675, - 0x33: 0x5684, - 0x34: 0x5685, - 0x35: 0x5688, - 0x36: 0x568b, - 0x37: 0x568c, - 0x38: 0x5695, - 0x39: 0x5699, - 0x3a: 0x569a, - 0x3b: 0x569d, - 0x3c: 0x569e, - 0x3d: 0x569f, - 0x3e: 0x56a6, - 0x3f: 0x56a7, - 0x40: 0x56a8, - 0x41: 0x56a9, - 0x42: 0x56ab, - 0x43: 0x56ac, - 0x44: 0x56ad, - 0x45: 0x56b1, - 0x46: 0x56b3, - 0x47: 0x56b7, - 0x48: 0x56be, - 0x49: 0x56c5, - 0x4a: 0x56c9, - 0x4b: 0x56ca, - 0x4c: 0x56cb, - 0x4d: 0x56cf, - 0x4e: 0x56d0, - 0x4f: 0x56cc, - 0x50: 0x56cd, - 0x51: 0x56d9, - 0x52: 0x56dc, - 0x53: 0x56dd, - 0x54: 0x56df, - 0x55: 0x56e1, - 0x56: 0x56e4, - 0x57: 0x56e5, - 0x58: 0x56e6, - 0x59: 0x56e7, - 0x5a: 0x56e8, - 0x5b: 0x56f1, - 0x5c: 0x56eb, - 0x5d: 0x56ed, - }, - 0x16: [94]uint16{ - 0x00: 0x56f6, - 0x01: 0x56f7, - 0x02: 0x5701, - 0x03: 0x5702, - 0x04: 0x5707, - 0x05: 0x570a, - 0x06: 0x570c, - 0x07: 0x5711, - 0x08: 0x5715, - 0x09: 0x571a, - 0x0a: 0x571b, - 0x0b: 0x571d, - 0x0c: 0x5720, - 0x0d: 0x5722, - 0x0e: 0x5723, - 0x0f: 0x5724, - 0x10: 0x5725, - 0x11: 0x5729, - 0x12: 0x572a, - 0x13: 0x572c, - 0x14: 0x572e, - 0x15: 0x572f, - 0x16: 0x5733, - 0x17: 0x5734, - 0x18: 0x573d, - 0x19: 0x573e, - 0x1a: 0x573f, - 0x1b: 0x5745, - 0x1c: 0x5746, - 0x1d: 0x574c, - 0x1e: 0x574d, - 0x1f: 0x5752, - 0x20: 0x5762, - 0x21: 0x5765, - 0x22: 0x5767, - 0x23: 0x5768, - 0x24: 0x576b, - 0x25: 0x576d, - 0x26: 0x576e, - 0x27: 0x576f, - 0x28: 0x5770, - 0x29: 0x5771, - 0x2a: 0x5773, - 0x2b: 0x5774, - 0x2c: 0x5775, - 0x2d: 0x5777, - 0x2e: 0x5779, - 0x2f: 0x577a, - 0x30: 0x577b, - 0x31: 0x577c, - 0x32: 0x577e, - 0x33: 0x5781, - 0x34: 0x5783, - 0x35: 0x578c, - 0x36: 0x5794, - 0x37: 0x5797, - 0x38: 0x5799, - 0x39: 0x579a, - 0x3a: 0x579c, - 0x3b: 0x579d, - 0x3c: 0x579e, - 0x3d: 0x579f, - 0x3e: 0x57a1, - 0x3f: 0x5795, - 0x40: 0x57a7, - 0x41: 0x57a8, - 0x42: 0x57a9, - 0x43: 0x57ac, - 0x44: 0x57b8, - 0x45: 0x57bd, - 0x46: 0x57c7, - 0x47: 0x57c8, - 0x48: 0x57cc, - 0x49: 0x57cf, - 0x4a: 0x57d5, - 0x4b: 0x57dd, - 0x4c: 0x57de, - 0x4d: 0x57e4, - 0x4e: 0x57e6, - 0x4f: 0x57e7, - 0x50: 0x57e9, - 0x51: 0x57ed, - 0x52: 0x57f0, - 0x53: 0x57f5, - 0x54: 0x57f6, - 0x55: 0x57f8, - 0x56: 0x57fd, - 0x57: 0x57fe, - 0x58: 0x57ff, - 0x59: 0x5803, - 0x5a: 0x5804, - 0x5b: 0x5808, - 0x5c: 0x5809, - 0x5d: 0x57e1, - }, - 0x17: [94]uint16{ - 0x00: 0x580c, - 0x01: 0x580d, - 0x02: 0x581b, - 0x03: 0x581e, - 0x04: 0x581f, - 0x05: 0x5820, - 0x06: 0x5826, - 0x07: 0x5827, - 0x08: 0x582d, - 0x09: 0x5832, - 0x0a: 0x5839, - 0x0b: 0x583f, - 0x0c: 0x5849, - 0x0d: 0x584c, - 0x0e: 0x584d, - 0x0f: 0x584f, - 0x10: 0x5850, - 0x11: 0x5855, - 0x12: 0x585f, - 0x13: 0x5861, - 0x14: 0x5864, - 0x15: 0x5867, - 0x16: 0x5868, - 0x17: 0x5878, - 0x18: 0x587c, - 0x19: 0x587f, - 0x1a: 0x5880, - 0x1b: 0x5881, - 0x1c: 0x5887, - 0x1d: 0x5888, - 0x1e: 0x5889, - 0x1f: 0x588a, - 0x20: 0x588c, - 0x21: 0x588d, - 0x22: 0x588f, - 0x23: 0x5890, - 0x24: 0x5894, - 0x25: 0x5896, - 0x26: 0x589d, - 0x27: 0x58a0, - 0x28: 0x58a1, - 0x29: 0x58a2, - 0x2a: 0x58a6, - 0x2b: 0x58a9, - 0x2c: 0x58b1, - 0x2d: 0x58b2, - 0x2e: 0x58c4, - 0x2f: 0x58bc, - 0x30: 0x58c2, - 0x31: 0x58c8, - 0x32: 0x58cd, - 0x33: 0x58ce, - 0x34: 0x58d0, - 0x35: 0x58d2, - 0x36: 0x58d4, - 0x37: 0x58d6, - 0x38: 0x58da, - 0x39: 0x58dd, - 0x3a: 0x58e1, - 0x3b: 0x58e2, - 0x3c: 0x58e9, - 0x3d: 0x58f3, - 0x3e: 0x5905, - 0x3f: 0x5906, - 0x40: 0x590b, - 0x41: 0x590c, - 0x42: 0x5912, - 0x43: 0x5913, - 0x44: 0x5914, - 0x45: 0x8641, - 0x46: 0x591d, - 0x47: 0x5921, - 0x48: 0x5923, - 0x49: 0x5924, - 0x4a: 0x5928, - 0x4b: 0x592f, - 0x4c: 0x5930, - 0x4d: 0x5933, - 0x4e: 0x5935, - 0x4f: 0x5936, - 0x50: 0x593f, - 0x51: 0x5943, - 0x52: 0x5946, - 0x53: 0x5952, - 0x54: 0x5953, - 0x55: 0x5959, - 0x56: 0x595b, - 0x57: 0x595d, - 0x58: 0x595e, - 0x59: 0x595f, - 0x5a: 0x5961, - 0x5b: 0x5963, - 0x5c: 0x596b, - 0x5d: 0x596d, - }, - 0x18: [94]uint16{ - 0x00: 0x596f, - 0x01: 0x5972, - 0x02: 0x5975, - 0x03: 0x5976, - 0x04: 0x5979, - 0x05: 0x597b, - 0x06: 0x597c, - 0x07: 0x598b, - 0x08: 0x598c, - 0x09: 0x598e, - 0x0a: 0x5992, - 0x0b: 0x5995, - 0x0c: 0x5997, - 0x0d: 0x599f, - 0x0e: 0x59a4, - 0x0f: 0x59a7, - 0x10: 0x59ad, - 0x11: 0x59ae, - 0x12: 0x59af, - 0x13: 0x59b0, - 0x14: 0x59b3, - 0x15: 0x59b7, - 0x16: 0x59ba, - 0x17: 0x59bc, - 0x18: 0x59c1, - 0x19: 0x59c3, - 0x1a: 0x59c4, - 0x1b: 0x59c8, - 0x1c: 0x59ca, - 0x1d: 0x59cd, - 0x1e: 0x59d2, - 0x1f: 0x59dd, - 0x20: 0x59de, - 0x21: 0x59df, - 0x22: 0x59e3, - 0x23: 0x59e4, - 0x24: 0x59e7, - 0x25: 0x59ee, - 0x26: 0x59ef, - 0x27: 0x59f1, - 0x28: 0x59f2, - 0x29: 0x59f4, - 0x2a: 0x59f7, - 0x2b: 0x5a00, - 0x2c: 0x5a04, - 0x2d: 0x5a0c, - 0x2e: 0x5a0d, - 0x2f: 0x5a0e, - 0x30: 0x5a12, - 0x31: 0x5a13, - 0x32: 0x5a1e, - 0x33: 0x5a23, - 0x34: 0x5a24, - 0x35: 0x5a27, - 0x36: 0x5a28, - 0x37: 0x5a2a, - 0x38: 0x5a2d, - 0x39: 0x5a30, - 0x3a: 0x5a44, - 0x3b: 0x5a45, - 0x3c: 0x5a47, - 0x3d: 0x5a48, - 0x3e: 0x5a4c, - 0x3f: 0x5a50, - 0x40: 0x5a55, - 0x41: 0x5a5e, - 0x42: 0x5a63, - 0x43: 0x5a65, - 0x44: 0x5a67, - 0x45: 0x5a6d, - 0x46: 0x5a77, - 0x47: 0x5a7a, - 0x48: 0x5a7b, - 0x49: 0x5a7e, - 0x4a: 0x5a8b, - 0x4b: 0x5a90, - 0x4c: 0x5a93, - 0x4d: 0x5a96, - 0x4e: 0x5a99, - 0x4f: 0x5a9c, - 0x50: 0x5a9e, - 0x51: 0x5a9f, - 0x52: 0x5aa0, - 0x53: 0x5aa2, - 0x54: 0x5aa7, - 0x55: 0x5aac, - 0x56: 0x5ab1, - 0x57: 0x5ab2, - 0x58: 0x5ab3, - 0x59: 0x5ab5, - 0x5a: 0x5ab8, - 0x5b: 0x5aba, - 0x5c: 0x5abb, - 0x5d: 0x5abf, - }, - 0x19: [94]uint16{ - 0x00: 0x5ac4, - 0x01: 0x5ac6, - 0x02: 0x5ac8, - 0x03: 0x5acf, - 0x04: 0x5ada, - 0x05: 0x5adc, - 0x06: 0x5ae0, - 0x07: 0x5ae5, - 0x08: 0x5aea, - 0x09: 0x5aee, - 0x0a: 0x5af5, - 0x0b: 0x5af6, - 0x0c: 0x5afd, - 0x0d: 0x5b00, - 0x0e: 0x5b01, - 0x0f: 0x5b08, - 0x10: 0x5b17, - 0x11: 0x5b34, - 0x12: 0x5b19, - 0x13: 0x5b1b, - 0x14: 0x5b1d, - 0x15: 0x5b21, - 0x16: 0x5b25, - 0x17: 0x5b2d, - 0x18: 0x5b38, - 0x19: 0x5b41, - 0x1a: 0x5b4b, - 0x1b: 0x5b4c, - 0x1c: 0x5b52, - 0x1d: 0x5b56, - 0x1e: 0x5b5e, - 0x1f: 0x5b68, - 0x20: 0x5b6e, - 0x21: 0x5b6f, - 0x22: 0x5b7c, - 0x23: 0x5b7d, - 0x24: 0x5b7e, - 0x25: 0x5b7f, - 0x26: 0x5b81, - 0x27: 0x5b84, - 0x28: 0x5b86, - 0x29: 0x5b8a, - 0x2a: 0x5b8e, - 0x2b: 0x5b90, - 0x2c: 0x5b91, - 0x2d: 0x5b93, - 0x2e: 0x5b94, - 0x2f: 0x5b96, - 0x30: 0x5ba8, - 0x31: 0x5ba9, - 0x32: 0x5bac, - 0x33: 0x5bad, - 0x34: 0x5baf, - 0x35: 0x5bb1, - 0x36: 0x5bb2, - 0x37: 0x5bb7, - 0x38: 0x5bba, - 0x39: 0x5bbc, - 0x3a: 0x5bc0, - 0x3b: 0x5bc1, - 0x3c: 0x5bcd, - 0x3d: 0x5bcf, - 0x3e: 0x5bd6, - 0x3f: 0x5bd7, - 0x40: 0x5bd8, - 0x41: 0x5bd9, - 0x42: 0x5bda, - 0x43: 0x5be0, - 0x44: 0x5bef, - 0x45: 0x5bf1, - 0x46: 0x5bf4, - 0x47: 0x5bfd, - 0x48: 0x5c0c, - 0x49: 0x5c17, - 0x4a: 0x5c1e, - 0x4b: 0x5c1f, - 0x4c: 0x5c23, - 0x4d: 0x5c26, - 0x4e: 0x5c29, - 0x4f: 0x5c2b, - 0x50: 0x5c2c, - 0x51: 0x5c2e, - 0x52: 0x5c30, - 0x53: 0x5c32, - 0x54: 0x5c35, - 0x55: 0x5c36, - 0x56: 0x5c59, - 0x57: 0x5c5a, - 0x58: 0x5c5c, - 0x59: 0x5c62, - 0x5a: 0x5c63, - 0x5b: 0x5c67, - 0x5c: 0x5c68, - 0x5d: 0x5c69, - }, - 0x1a: [94]uint16{ - 0x00: 0x5c6d, - 0x01: 0x5c70, - 0x02: 0x5c74, - 0x03: 0x5c75, - 0x04: 0x5c7a, - 0x05: 0x5c7b, - 0x06: 0x5c7c, - 0x07: 0x5c7d, - 0x08: 0x5c87, - 0x09: 0x5c88, - 0x0a: 0x5c8a, - 0x0b: 0x5c8f, - 0x0c: 0x5c92, - 0x0d: 0x5c9d, - 0x0e: 0x5c9f, - 0x0f: 0x5ca0, - 0x10: 0x5ca2, - 0x11: 0x5ca3, - 0x12: 0x5ca6, - 0x13: 0x5caa, - 0x14: 0x5cb2, - 0x15: 0x5cb4, - 0x16: 0x5cb5, - 0x17: 0x5cba, - 0x18: 0x5cc9, - 0x19: 0x5ccb, - 0x1a: 0x5cd2, - 0x1b: 0x5cdd, - 0x1c: 0x5cd7, - 0x1d: 0x5cee, - 0x1e: 0x5cf1, - 0x1f: 0x5cf2, - 0x20: 0x5cf4, - 0x21: 0x5d01, - 0x22: 0x5d06, - 0x23: 0x5d0d, - 0x24: 0x5d12, - 0x25: 0x5d2b, - 0x26: 0x5d23, - 0x27: 0x5d24, - 0x28: 0x5d26, - 0x29: 0x5d27, - 0x2a: 0x5d31, - 0x2b: 0x5d34, - 0x2c: 0x5d39, - 0x2d: 0x5d3d, - 0x2e: 0x5d3f, - 0x2f: 0x5d42, - 0x30: 0x5d43, - 0x31: 0x5d46, - 0x32: 0x5d48, - 0x33: 0x5d55, - 0x34: 0x5d51, - 0x35: 0x5d59, - 0x36: 0x5d4a, - 0x37: 0x5d5f, - 0x38: 0x5d60, - 0x39: 0x5d61, - 0x3a: 0x5d62, - 0x3b: 0x5d64, - 0x3c: 0x5d6a, - 0x3d: 0x5d6d, - 0x3e: 0x5d70, - 0x3f: 0x5d79, - 0x40: 0x5d7a, - 0x41: 0x5d7e, - 0x42: 0x5d7f, - 0x43: 0x5d81, - 0x44: 0x5d83, - 0x45: 0x5d88, - 0x46: 0x5d8a, - 0x47: 0x5d92, - 0x48: 0x5d93, - 0x49: 0x5d94, - 0x4a: 0x5d95, - 0x4b: 0x5d99, - 0x4c: 0x5d9b, - 0x4d: 0x5d9f, - 0x4e: 0x5da0, - 0x4f: 0x5da7, - 0x50: 0x5dab, - 0x51: 0x5db0, - 0x52: 0x5db4, - 0x53: 0x5db8, - 0x54: 0x5db9, - 0x55: 0x5dc3, - 0x56: 0x5dc7, - 0x57: 0x5dcb, - 0x58: 0x5dd0, - 0x59: 0x5dce, - 0x5a: 0x5dd8, - 0x5b: 0x5dd9, - 0x5c: 0x5de0, - 0x5d: 0x5de4, - }, - 0x1b: [94]uint16{ - 0x00: 0x5de9, - 0x01: 0x5df8, - 0x02: 0x5df9, - 0x03: 0x5e00, - 0x04: 0x5e07, - 0x05: 0x5e0d, - 0x06: 0x5e12, - 0x07: 0x5e14, - 0x08: 0x5e15, - 0x09: 0x5e18, - 0x0a: 0x5e1f, - 0x0b: 0x5e20, - 0x0c: 0x5e2e, - 0x0d: 0x5e28, - 0x0e: 0x5e32, - 0x0f: 0x5e35, - 0x10: 0x5e3e, - 0x11: 0x5e4b, - 0x12: 0x5e50, - 0x13: 0x5e49, - 0x14: 0x5e51, - 0x15: 0x5e56, - 0x16: 0x5e58, - 0x17: 0x5e5b, - 0x18: 0x5e5c, - 0x19: 0x5e5e, - 0x1a: 0x5e68, - 0x1b: 0x5e6a, - 0x1c: 0x5e6b, - 0x1d: 0x5e6c, - 0x1e: 0x5e6d, - 0x1f: 0x5e6e, - 0x20: 0x5e70, - 0x21: 0x5e80, - 0x22: 0x5e8b, - 0x23: 0x5e8e, - 0x24: 0x5ea2, - 0x25: 0x5ea4, - 0x26: 0x5ea5, - 0x27: 0x5ea8, - 0x28: 0x5eaa, - 0x29: 0x5eac, - 0x2a: 0x5eb1, - 0x2b: 0x5eb3, - 0x2c: 0x5ebd, - 0x2d: 0x5ebe, - 0x2e: 0x5ebf, - 0x2f: 0x5ec6, - 0x30: 0x5ecc, - 0x31: 0x5ecb, - 0x32: 0x5ece, - 0x33: 0x5ed1, - 0x34: 0x5ed2, - 0x35: 0x5ed4, - 0x36: 0x5ed5, - 0x37: 0x5edc, - 0x38: 0x5ede, - 0x39: 0x5ee5, - 0x3a: 0x5eeb, - 0x3b: 0x5f02, - 0x3c: 0x5f06, - 0x3d: 0x5f07, - 0x3e: 0x5f08, - 0x3f: 0x5f0e, - 0x40: 0x5f19, - 0x41: 0x5f1c, - 0x42: 0x5f1d, - 0x43: 0x5f21, - 0x44: 0x5f22, - 0x45: 0x5f23, - 0x46: 0x5f24, - 0x47: 0x5f28, - 0x48: 0x5f2b, - 0x49: 0x5f2c, - 0x4a: 0x5f2e, - 0x4b: 0x5f30, - 0x4c: 0x5f34, - 0x4d: 0x5f36, - 0x4e: 0x5f3b, - 0x4f: 0x5f3d, - 0x50: 0x5f3f, - 0x51: 0x5f40, - 0x52: 0x5f44, - 0x53: 0x5f45, - 0x54: 0x5f47, - 0x55: 0x5f4d, - 0x56: 0x5f50, - 0x57: 0x5f54, - 0x58: 0x5f58, - 0x59: 0x5f5b, - 0x5a: 0x5f60, - 0x5b: 0x5f63, - 0x5c: 0x5f64, - 0x5d: 0x5f67, - }, - 0x1c: [94]uint16{ - 0x00: 0x5f6f, - 0x01: 0x5f72, - 0x02: 0x5f74, - 0x03: 0x5f75, - 0x04: 0x5f78, - 0x05: 0x5f7a, - 0x06: 0x5f7d, - 0x07: 0x5f7e, - 0x08: 0x5f89, - 0x09: 0x5f8d, - 0x0a: 0x5f8f, - 0x0b: 0x5f96, - 0x0c: 0x5f9c, - 0x0d: 0x5f9d, - 0x0e: 0x5fa2, - 0x0f: 0x5fa7, - 0x10: 0x5fab, - 0x11: 0x5fa4, - 0x12: 0x5fac, - 0x13: 0x5faf, - 0x14: 0x5fb0, - 0x15: 0x5fb1, - 0x16: 0x5fb8, - 0x17: 0x5fc4, - 0x18: 0x5fc7, - 0x19: 0x5fc8, - 0x1a: 0x5fc9, - 0x1b: 0x5fcb, - 0x1c: 0x5fd0, - 0x1d: 0x5fd1, - 0x1e: 0x5fd2, - 0x1f: 0x5fd3, - 0x20: 0x5fd4, - 0x21: 0x5fde, - 0x22: 0x5fe1, - 0x23: 0x5fe2, - 0x24: 0x5fe8, - 0x25: 0x5fe9, - 0x26: 0x5fea, - 0x27: 0x5fec, - 0x28: 0x5fed, - 0x29: 0x5fee, - 0x2a: 0x5fef, - 0x2b: 0x5ff2, - 0x2c: 0x5ff3, - 0x2d: 0x5ff6, - 0x2e: 0x5ffa, - 0x2f: 0x5ffc, - 0x30: 0x6007, - 0x31: 0x600a, - 0x32: 0x600d, - 0x33: 0x6013, - 0x34: 0x6014, - 0x35: 0x6017, - 0x36: 0x6018, - 0x37: 0x601a, - 0x38: 0x601f, - 0x39: 0x6024, - 0x3a: 0x602d, - 0x3b: 0x6033, - 0x3c: 0x6035, - 0x3d: 0x6040, - 0x3e: 0x6047, - 0x3f: 0x6048, - 0x40: 0x6049, - 0x41: 0x604c, - 0x42: 0x6051, - 0x43: 0x6054, - 0x44: 0x6056, - 0x45: 0x6057, - 0x46: 0x605d, - 0x47: 0x6061, - 0x48: 0x6067, - 0x49: 0x6071, - 0x4a: 0x607e, - 0x4b: 0x607f, - 0x4c: 0x6082, - 0x4d: 0x6086, - 0x4e: 0x6088, - 0x4f: 0x608a, - 0x50: 0x608e, - 0x51: 0x6091, - 0x52: 0x6093, - 0x53: 0x6095, - 0x54: 0x6098, - 0x55: 0x609d, - 0x56: 0x609e, - 0x57: 0x60a2, - 0x58: 0x60a4, - 0x59: 0x60a5, - 0x5a: 0x60a8, - 0x5b: 0x60b0, - 0x5c: 0x60b1, - 0x5d: 0x60b7, - }, - 0x1d: [94]uint16{ - 0x00: 0x60bb, - 0x01: 0x60be, - 0x02: 0x60c2, - 0x03: 0x60c4, - 0x04: 0x60c8, - 0x05: 0x60c9, - 0x06: 0x60ca, - 0x07: 0x60cb, - 0x08: 0x60ce, - 0x09: 0x60cf, - 0x0a: 0x60d4, - 0x0b: 0x60d5, - 0x0c: 0x60d9, - 0x0d: 0x60db, - 0x0e: 0x60dd, - 0x0f: 0x60de, - 0x10: 0x60e2, - 0x11: 0x60e5, - 0x12: 0x60f2, - 0x13: 0x60f5, - 0x14: 0x60f8, - 0x15: 0x60fc, - 0x16: 0x60fd, - 0x17: 0x6102, - 0x18: 0x6107, - 0x19: 0x610a, - 0x1a: 0x610c, - 0x1b: 0x6110, - 0x1c: 0x6111, - 0x1d: 0x6112, - 0x1e: 0x6113, - 0x1f: 0x6114, - 0x20: 0x6116, - 0x21: 0x6117, - 0x22: 0x6119, - 0x23: 0x611c, - 0x24: 0x611e, - 0x25: 0x6122, - 0x26: 0x612a, - 0x27: 0x612b, - 0x28: 0x6130, - 0x29: 0x6131, - 0x2a: 0x6135, - 0x2b: 0x6136, - 0x2c: 0x6137, - 0x2d: 0x6139, - 0x2e: 0x6141, - 0x2f: 0x6145, - 0x30: 0x6146, - 0x31: 0x6149, - 0x32: 0x615e, - 0x33: 0x6160, - 0x34: 0x616c, - 0x35: 0x6172, - 0x36: 0x6178, - 0x37: 0x617b, - 0x38: 0x617c, - 0x39: 0x617f, - 0x3a: 0x6180, - 0x3b: 0x6181, - 0x3c: 0x6183, - 0x3d: 0x6184, - 0x3e: 0x618b, - 0x3f: 0x618d, - 0x40: 0x6192, - 0x41: 0x6193, - 0x42: 0x6197, - 0x43: 0x6198, - 0x44: 0x619c, - 0x45: 0x619d, - 0x46: 0x619f, - 0x47: 0x61a0, - 0x48: 0x61a5, - 0x49: 0x61a8, - 0x4a: 0x61aa, - 0x4b: 0x61ad, - 0x4c: 0x61b8, - 0x4d: 0x61b9, - 0x4e: 0x61bc, - 0x4f: 0x61c0, - 0x50: 0x61c1, - 0x51: 0x61c2, - 0x52: 0x61ce, - 0x53: 0x61cf, - 0x54: 0x61d5, - 0x55: 0x61dc, - 0x56: 0x61dd, - 0x57: 0x61de, - 0x58: 0x61df, - 0x59: 0x61e1, - 0x5a: 0x61e2, - 0x5b: 0x61e7, - 0x5c: 0x61e9, - 0x5d: 0x61e5, - }, - 0x1e: [94]uint16{ - 0x00: 0x61ec, - 0x01: 0x61ed, - 0x02: 0x61ef, - 0x03: 0x6201, - 0x04: 0x6203, - 0x05: 0x6204, - 0x06: 0x6207, - 0x07: 0x6213, - 0x08: 0x6215, - 0x09: 0x621c, - 0x0a: 0x6220, - 0x0b: 0x6222, - 0x0c: 0x6223, - 0x0d: 0x6227, - 0x0e: 0x6229, - 0x0f: 0x622b, - 0x10: 0x6239, - 0x11: 0x623d, - 0x12: 0x6242, - 0x13: 0x6243, - 0x14: 0x6244, - 0x15: 0x6246, - 0x16: 0x624c, - 0x17: 0x6250, - 0x18: 0x6251, - 0x19: 0x6252, - 0x1a: 0x6254, - 0x1b: 0x6256, - 0x1c: 0x625a, - 0x1d: 0x625c, - 0x1e: 0x6264, - 0x1f: 0x626d, - 0x20: 0x626f, - 0x21: 0x6273, - 0x22: 0x627a, - 0x23: 0x627d, - 0x24: 0x628d, - 0x25: 0x628e, - 0x26: 0x628f, - 0x27: 0x6290, - 0x28: 0x62a6, - 0x29: 0x62a8, - 0x2a: 0x62b3, - 0x2b: 0x62b6, - 0x2c: 0x62b7, - 0x2d: 0x62ba, - 0x2e: 0x62be, - 0x2f: 0x62bf, - 0x30: 0x62c4, - 0x31: 0x62ce, - 0x32: 0x62d5, - 0x33: 0x62d6, - 0x34: 0x62da, - 0x35: 0x62ea, - 0x36: 0x62f2, - 0x37: 0x62f4, - 0x38: 0x62fc, - 0x39: 0x62fd, - 0x3a: 0x6303, - 0x3b: 0x6304, - 0x3c: 0x630a, - 0x3d: 0x630b, - 0x3e: 0x630d, - 0x3f: 0x6310, - 0x40: 0x6313, - 0x41: 0x6316, - 0x42: 0x6318, - 0x43: 0x6329, - 0x44: 0x632a, - 0x45: 0x632d, - 0x46: 0x6335, - 0x47: 0x6336, - 0x48: 0x6339, - 0x49: 0x633c, - 0x4a: 0x6341, - 0x4b: 0x6342, - 0x4c: 0x6343, - 0x4d: 0x6344, - 0x4e: 0x6346, - 0x4f: 0x634a, - 0x50: 0x634b, - 0x51: 0x634e, - 0x52: 0x6352, - 0x53: 0x6353, - 0x54: 0x6354, - 0x55: 0x6358, - 0x56: 0x635b, - 0x57: 0x6365, - 0x58: 0x6366, - 0x59: 0x636c, - 0x5a: 0x636d, - 0x5b: 0x6371, - 0x5c: 0x6374, - 0x5d: 0x6375, - }, - 0x1f: [94]uint16{ - 0x00: 0x6378, - 0x01: 0x637c, - 0x02: 0x637d, - 0x03: 0x637f, - 0x04: 0x6382, - 0x05: 0x6384, - 0x06: 0x6387, - 0x07: 0x638a, - 0x08: 0x6390, - 0x09: 0x6394, - 0x0a: 0x6395, - 0x0b: 0x6399, - 0x0c: 0x639a, - 0x0d: 0x639e, - 0x0e: 0x63a4, - 0x0f: 0x63a6, - 0x10: 0x63ad, - 0x11: 0x63ae, - 0x12: 0x63af, - 0x13: 0x63bd, - 0x14: 0x63c1, - 0x15: 0x63c5, - 0x16: 0x63c8, - 0x17: 0x63ce, - 0x18: 0x63d1, - 0x19: 0x63d3, - 0x1a: 0x63d4, - 0x1b: 0x63d5, - 0x1c: 0x63dc, - 0x1d: 0x63e0, - 0x1e: 0x63e5, - 0x1f: 0x63ea, - 0x20: 0x63ec, - 0x21: 0x63f2, - 0x22: 0x63f3, - 0x23: 0x63f5, - 0x24: 0x63f8, - 0x25: 0x63f9, - 0x26: 0x6409, - 0x27: 0x640a, - 0x28: 0x6410, - 0x29: 0x6412, - 0x2a: 0x6414, - 0x2b: 0x6418, - 0x2c: 0x641e, - 0x2d: 0x6420, - 0x2e: 0x6422, - 0x2f: 0x6424, - 0x30: 0x6425, - 0x31: 0x6429, - 0x32: 0x642a, - 0x33: 0x642f, - 0x34: 0x6430, - 0x35: 0x6435, - 0x36: 0x643d, - 0x37: 0x643f, - 0x38: 0x644b, - 0x39: 0x644f, - 0x3a: 0x6451, - 0x3b: 0x6452, - 0x3c: 0x6453, - 0x3d: 0x6454, - 0x3e: 0x645a, - 0x3f: 0x645b, - 0x40: 0x645c, - 0x41: 0x645d, - 0x42: 0x645f, - 0x43: 0x6460, - 0x44: 0x6461, - 0x45: 0x6463, - 0x46: 0x646d, - 0x47: 0x6473, - 0x48: 0x6474, - 0x49: 0x647b, - 0x4a: 0x647d, - 0x4b: 0x6485, - 0x4c: 0x6487, - 0x4d: 0x648f, - 0x4e: 0x6490, - 0x4f: 0x6491, - 0x50: 0x6498, - 0x51: 0x6499, - 0x52: 0x649b, - 0x53: 0x649d, - 0x54: 0x649f, - 0x55: 0x64a1, - 0x56: 0x64a3, - 0x57: 0x64a6, - 0x58: 0x64a8, - 0x59: 0x64ac, - 0x5a: 0x64b3, - 0x5b: 0x64bd, - 0x5c: 0x64be, - 0x5d: 0x64bf, - }, - 0x20: [94]uint16{ - 0x00: 0x64c4, - 0x01: 0x64c9, - 0x02: 0x64ca, - 0x03: 0x64cb, - 0x04: 0x64cc, - 0x05: 0x64ce, - 0x06: 0x64d0, - 0x07: 0x64d1, - 0x08: 0x64d5, - 0x09: 0x64d7, - 0x0a: 0x64e4, - 0x0b: 0x64e5, - 0x0c: 0x64e9, - 0x0d: 0x64ea, - 0x0e: 0x64ed, - 0x0f: 0x64f0, - 0x10: 0x64f5, - 0x11: 0x64f7, - 0x12: 0x64fb, - 0x13: 0x64ff, - 0x14: 0x6501, - 0x15: 0x6504, - 0x16: 0x6508, - 0x17: 0x6509, - 0x18: 0x650a, - 0x19: 0x650f, - 0x1a: 0x6513, - 0x1b: 0x6514, - 0x1c: 0x6516, - 0x1d: 0x6519, - 0x1e: 0x651b, - 0x1f: 0x651e, - 0x20: 0x651f, - 0x21: 0x6522, - 0x22: 0x6526, - 0x23: 0x6529, - 0x24: 0x652e, - 0x25: 0x6531, - 0x26: 0x653a, - 0x27: 0x653c, - 0x28: 0x653d, - 0x29: 0x6543, - 0x2a: 0x6547, - 0x2b: 0x6549, - 0x2c: 0x6550, - 0x2d: 0x6552, - 0x2e: 0x6554, - 0x2f: 0x655f, - 0x30: 0x6560, - 0x31: 0x6567, - 0x32: 0x656b, - 0x33: 0x657a, - 0x34: 0x657d, - 0x35: 0x6581, - 0x36: 0x6585, - 0x37: 0x658a, - 0x38: 0x6592, - 0x39: 0x6595, - 0x3a: 0x6598, - 0x3b: 0x659d, - 0x3c: 0x65a0, - 0x3d: 0x65a3, - 0x3e: 0x65a6, - 0x3f: 0x65ae, - 0x40: 0x65b2, - 0x41: 0x65b3, - 0x42: 0x65b4, - 0x43: 0x65bf, - 0x44: 0x65c2, - 0x45: 0x65c8, - 0x46: 0x65c9, - 0x47: 0x65ce, - 0x48: 0x65d0, - 0x49: 0x65d4, - 0x4a: 0x65d6, - 0x4b: 0x65d8, - 0x4c: 0x65df, - 0x4d: 0x65f0, - 0x4e: 0x65f2, - 0x4f: 0x65f4, - 0x50: 0x65f5, - 0x51: 0x65f9, - 0x52: 0x65fe, - 0x53: 0x65ff, - 0x54: 0x6600, - 0x55: 0x6604, - 0x56: 0x6608, - 0x57: 0x6609, - 0x58: 0x660d, - 0x59: 0x6611, - 0x5a: 0x6612, - 0x5b: 0x6615, - 0x5c: 0x6616, - 0x5d: 0x661d, - }, - 0x21: [94]uint16{ - 0x00: 0x661e, - 0x01: 0x6621, - 0x02: 0x6622, - 0x03: 0x6623, - 0x04: 0x6624, - 0x05: 0x6626, - 0x06: 0x6629, - 0x07: 0x662a, - 0x08: 0x662b, - 0x09: 0x662c, - 0x0a: 0x662e, - 0x0b: 0x6630, - 0x0c: 0x6631, - 0x0d: 0x6633, - 0x0e: 0x6639, - 0x0f: 0x6637, - 0x10: 0x6640, - 0x11: 0x6645, - 0x12: 0x6646, - 0x13: 0x664a, - 0x14: 0x664c, - 0x15: 0x6651, - 0x16: 0x664e, - 0x17: 0x6657, - 0x18: 0x6658, - 0x19: 0x6659, - 0x1a: 0x665b, - 0x1b: 0x665c, - 0x1c: 0x6660, - 0x1d: 0x6661, - 0x1e: 0x66fb, - 0x1f: 0x666a, - 0x20: 0x666b, - 0x21: 0x666c, - 0x22: 0x667e, - 0x23: 0x6673, - 0x24: 0x6675, - 0x25: 0x667f, - 0x26: 0x6677, - 0x27: 0x6678, - 0x28: 0x6679, - 0x29: 0x667b, - 0x2a: 0x6680, - 0x2b: 0x667c, - 0x2c: 0x668b, - 0x2d: 0x668c, - 0x2e: 0x668d, - 0x2f: 0x6690, - 0x30: 0x6692, - 0x31: 0x6699, - 0x32: 0x669a, - 0x33: 0x669b, - 0x34: 0x669c, - 0x35: 0x669f, - 0x36: 0x66a0, - 0x37: 0x66a4, - 0x38: 0x66ad, - 0x39: 0x66b1, - 0x3a: 0x66b2, - 0x3b: 0x66b5, - 0x3c: 0x66bb, - 0x3d: 0x66bf, - 0x3e: 0x66c0, - 0x3f: 0x66c2, - 0x40: 0x66c3, - 0x41: 0x66c8, - 0x42: 0x66cc, - 0x43: 0x66ce, - 0x44: 0x66cf, - 0x45: 0x66d4, - 0x46: 0x66db, - 0x47: 0x66df, - 0x48: 0x66e8, - 0x49: 0x66eb, - 0x4a: 0x66ec, - 0x4b: 0x66ee, - 0x4c: 0x66fa, - 0x4d: 0x6705, - 0x4e: 0x6707, - 0x4f: 0x670e, - 0x50: 0x6713, - 0x51: 0x6719, - 0x52: 0x671c, - 0x53: 0x6720, - 0x54: 0x6722, - 0x55: 0x6733, - 0x56: 0x673e, - 0x57: 0x6745, - 0x58: 0x6747, - 0x59: 0x6748, - 0x5a: 0x674c, - 0x5b: 0x6754, - 0x5c: 0x6755, - 0x5d: 0x675d, - }, - 0x22: [94]uint16{ - 0x00: 0x6766, - 0x01: 0x676c, - 0x02: 0x676e, - 0x03: 0x6774, - 0x04: 0x6776, - 0x05: 0x677b, - 0x06: 0x6781, - 0x07: 0x6784, - 0x08: 0x678e, - 0x09: 0x678f, - 0x0a: 0x6791, - 0x0b: 0x6793, - 0x0c: 0x6796, - 0x0d: 0x6798, - 0x0e: 0x6799, - 0x0f: 0x679b, - 0x10: 0x67b0, - 0x11: 0x67b1, - 0x12: 0x67b2, - 0x13: 0x67b5, - 0x14: 0x67bb, - 0x15: 0x67bc, - 0x16: 0x67bd, - 0x17: 0x67f9, - 0x18: 0x67c0, - 0x19: 0x67c2, - 0x1a: 0x67c3, - 0x1b: 0x67c5, - 0x1c: 0x67c8, - 0x1d: 0x67c9, - 0x1e: 0x67d2, - 0x1f: 0x67d7, - 0x20: 0x67d9, - 0x21: 0x67dc, - 0x22: 0x67e1, - 0x23: 0x67e6, - 0x24: 0x67f0, - 0x25: 0x67f2, - 0x26: 0x67f6, - 0x27: 0x67f7, - 0x28: 0x6852, - 0x29: 0x6814, - 0x2a: 0x6819, - 0x2b: 0x681d, - 0x2c: 0x681f, - 0x2d: 0x6828, - 0x2e: 0x6827, - 0x2f: 0x682c, - 0x30: 0x682d, - 0x31: 0x682f, - 0x32: 0x6830, - 0x33: 0x6831, - 0x34: 0x6833, - 0x35: 0x683b, - 0x36: 0x683f, - 0x37: 0x6844, - 0x38: 0x6845, - 0x39: 0x684a, - 0x3a: 0x684c, - 0x3b: 0x6855, - 0x3c: 0x6857, - 0x3d: 0x6858, - 0x3e: 0x685b, - 0x3f: 0x686b, - 0x40: 0x686e, - 0x41: 0x686f, - 0x42: 0x6870, - 0x43: 0x6871, - 0x44: 0x6872, - 0x45: 0x6875, - 0x46: 0x6879, - 0x47: 0x687a, - 0x48: 0x687b, - 0x49: 0x687c, - 0x4a: 0x6882, - 0x4b: 0x6884, - 0x4c: 0x6886, - 0x4d: 0x6888, - 0x4e: 0x6896, - 0x4f: 0x6898, - 0x50: 0x689a, - 0x51: 0x689c, - 0x52: 0x68a1, - 0x53: 0x68a3, - 0x54: 0x68a5, - 0x55: 0x68a9, - 0x56: 0x68aa, - 0x57: 0x68ae, - 0x58: 0x68b2, - 0x59: 0x68bb, - 0x5a: 0x68c5, - 0x5b: 0x68c8, - 0x5c: 0x68cc, - 0x5d: 0x68cf, - }, - 0x23: [94]uint16{ - 0x00: 0x68d0, - 0x01: 0x68d1, - 0x02: 0x68d3, - 0x03: 0x68d6, - 0x04: 0x68d9, - 0x05: 0x68dc, - 0x06: 0x68dd, - 0x07: 0x68e5, - 0x08: 0x68e8, - 0x09: 0x68ea, - 0x0a: 0x68eb, - 0x0b: 0x68ec, - 0x0c: 0x68ed, - 0x0d: 0x68f0, - 0x0e: 0x68f1, - 0x0f: 0x68f5, - 0x10: 0x68f6, - 0x11: 0x68fb, - 0x12: 0x68fc, - 0x13: 0x68fd, - 0x14: 0x6906, - 0x15: 0x6909, - 0x16: 0x690a, - 0x17: 0x6910, - 0x18: 0x6911, - 0x19: 0x6913, - 0x1a: 0x6916, - 0x1b: 0x6917, - 0x1c: 0x6931, - 0x1d: 0x6933, - 0x1e: 0x6935, - 0x1f: 0x6938, - 0x20: 0x693b, - 0x21: 0x6942, - 0x22: 0x6945, - 0x23: 0x6949, - 0x24: 0x694e, - 0x25: 0x6957, - 0x26: 0x695b, - 0x27: 0x6963, - 0x28: 0x6964, - 0x29: 0x6965, - 0x2a: 0x6966, - 0x2b: 0x6968, - 0x2c: 0x6969, - 0x2d: 0x696c, - 0x2e: 0x6970, - 0x2f: 0x6971, - 0x30: 0x6972, - 0x31: 0x697a, - 0x32: 0x697b, - 0x33: 0x697f, - 0x34: 0x6980, - 0x35: 0x698d, - 0x36: 0x6992, - 0x37: 0x6996, - 0x38: 0x6998, - 0x39: 0x69a1, - 0x3a: 0x69a5, - 0x3b: 0x69a6, - 0x3c: 0x69a8, - 0x3d: 0x69ab, - 0x3e: 0x69ad, - 0x3f: 0x69af, - 0x40: 0x69b7, - 0x41: 0x69b8, - 0x42: 0x69ba, - 0x43: 0x69bc, - 0x44: 0x69c5, - 0x45: 0x69c8, - 0x46: 0x69d1, - 0x47: 0x69d6, - 0x48: 0x69d7, - 0x49: 0x69e2, - 0x4a: 0x69e5, - 0x4b: 0x69ee, - 0x4c: 0x69ef, - 0x4d: 0x69f1, - 0x4e: 0x69f3, - 0x4f: 0x69f5, - 0x50: 0x69fe, - 0x51: 0x6a00, - 0x52: 0x6a01, - 0x53: 0x6a03, - 0x54: 0x6a0f, - 0x55: 0x6a11, - 0x56: 0x6a15, - 0x57: 0x6a1a, - 0x58: 0x6a1d, - 0x59: 0x6a20, - 0x5a: 0x6a24, - 0x5b: 0x6a28, - 0x5c: 0x6a30, - 0x5d: 0x6a32, - }, - 0x24: [94]uint16{ - 0x00: 0x6a34, - 0x01: 0x6a37, - 0x02: 0x6a3b, - 0x03: 0x6a3e, - 0x04: 0x6a3f, - 0x05: 0x6a45, - 0x06: 0x6a46, - 0x07: 0x6a49, - 0x08: 0x6a4a, - 0x09: 0x6a4e, - 0x0a: 0x6a50, - 0x0b: 0x6a51, - 0x0c: 0x6a52, - 0x0d: 0x6a55, - 0x0e: 0x6a56, - 0x0f: 0x6a5b, - 0x10: 0x6a64, - 0x11: 0x6a67, - 0x12: 0x6a6a, - 0x13: 0x6a71, - 0x14: 0x6a73, - 0x15: 0x6a7e, - 0x16: 0x6a81, - 0x17: 0x6a83, - 0x18: 0x6a86, - 0x19: 0x6a87, - 0x1a: 0x6a89, - 0x1b: 0x6a8b, - 0x1c: 0x6a91, - 0x1d: 0x6a9b, - 0x1e: 0x6a9d, - 0x1f: 0x6a9e, - 0x20: 0x6a9f, - 0x21: 0x6aa5, - 0x22: 0x6aab, - 0x23: 0x6aaf, - 0x24: 0x6ab0, - 0x25: 0x6ab1, - 0x26: 0x6ab4, - 0x27: 0x6abd, - 0x28: 0x6abe, - 0x29: 0x6abf, - 0x2a: 0x6ac6, - 0x2b: 0x6ac9, - 0x2c: 0x6ac8, - 0x2d: 0x6acc, - 0x2e: 0x6ad0, - 0x2f: 0x6ad4, - 0x30: 0x6ad5, - 0x31: 0x6ad6, - 0x32: 0x6adc, - 0x33: 0x6add, - 0x34: 0x6ae4, - 0x35: 0x6ae7, - 0x36: 0x6aec, - 0x37: 0x6af0, - 0x38: 0x6af1, - 0x39: 0x6af2, - 0x3a: 0x6afc, - 0x3b: 0x6afd, - 0x3c: 0x6b02, - 0x3d: 0x6b03, - 0x3e: 0x6b06, - 0x3f: 0x6b07, - 0x40: 0x6b09, - 0x41: 0x6b0f, - 0x42: 0x6b10, - 0x43: 0x6b11, - 0x44: 0x6b17, - 0x45: 0x6b1b, - 0x46: 0x6b1e, - 0x47: 0x6b24, - 0x48: 0x6b28, - 0x49: 0x6b2b, - 0x4a: 0x6b2c, - 0x4b: 0x6b2f, - 0x4c: 0x6b35, - 0x4d: 0x6b36, - 0x4e: 0x6b3b, - 0x4f: 0x6b3f, - 0x50: 0x6b46, - 0x51: 0x6b4a, - 0x52: 0x6b4d, - 0x53: 0x6b52, - 0x54: 0x6b56, - 0x55: 0x6b58, - 0x56: 0x6b5d, - 0x57: 0x6b60, - 0x58: 0x6b67, - 0x59: 0x6b6b, - 0x5a: 0x6b6e, - 0x5b: 0x6b70, - 0x5c: 0x6b75, - 0x5d: 0x6b7d, - }, - 0x25: [94]uint16{ - 0x00: 0x6b7e, - 0x01: 0x6b82, - 0x02: 0x6b85, - 0x03: 0x6b97, - 0x04: 0x6b9b, - 0x05: 0x6b9f, - 0x06: 0x6ba0, - 0x07: 0x6ba2, - 0x08: 0x6ba3, - 0x09: 0x6ba8, - 0x0a: 0x6ba9, - 0x0b: 0x6bac, - 0x0c: 0x6bad, - 0x0d: 0x6bae, - 0x0e: 0x6bb0, - 0x0f: 0x6bb8, - 0x10: 0x6bb9, - 0x11: 0x6bbd, - 0x12: 0x6bbe, - 0x13: 0x6bc3, - 0x14: 0x6bc4, - 0x15: 0x6bc9, - 0x16: 0x6bcc, - 0x17: 0x6bd6, - 0x18: 0x6bda, - 0x19: 0x6be1, - 0x1a: 0x6be3, - 0x1b: 0x6be6, - 0x1c: 0x6be7, - 0x1d: 0x6bee, - 0x1e: 0x6bf1, - 0x1f: 0x6bf7, - 0x20: 0x6bf9, - 0x21: 0x6bff, - 0x22: 0x6c02, - 0x23: 0x6c04, - 0x24: 0x6c05, - 0x25: 0x6c09, - 0x26: 0x6c0d, - 0x27: 0x6c0e, - 0x28: 0x6c10, - 0x29: 0x6c12, - 0x2a: 0x6c19, - 0x2b: 0x6c1f, - 0x2c: 0x6c26, - 0x2d: 0x6c27, - 0x2e: 0x6c28, - 0x2f: 0x6c2c, - 0x30: 0x6c2e, - 0x31: 0x6c33, - 0x32: 0x6c35, - 0x33: 0x6c36, - 0x34: 0x6c3a, - 0x35: 0x6c3b, - 0x36: 0x6c3f, - 0x37: 0x6c4a, - 0x38: 0x6c4b, - 0x39: 0x6c4d, - 0x3a: 0x6c4f, - 0x3b: 0x6c52, - 0x3c: 0x6c54, - 0x3d: 0x6c59, - 0x3e: 0x6c5b, - 0x3f: 0x6c5c, - 0x40: 0x6c6b, - 0x41: 0x6c6d, - 0x42: 0x6c6f, - 0x43: 0x6c74, - 0x44: 0x6c76, - 0x45: 0x6c78, - 0x46: 0x6c79, - 0x47: 0x6c7b, - 0x48: 0x6c85, - 0x49: 0x6c86, - 0x4a: 0x6c87, - 0x4b: 0x6c89, - 0x4c: 0x6c94, - 0x4d: 0x6c95, - 0x4e: 0x6c97, - 0x4f: 0x6c98, - 0x50: 0x6c9c, - 0x51: 0x6c9f, - 0x52: 0x6cb0, - 0x53: 0x6cb2, - 0x54: 0x6cb4, - 0x55: 0x6cc2, - 0x56: 0x6cc6, - 0x57: 0x6ccd, - 0x58: 0x6ccf, - 0x59: 0x6cd0, - 0x5a: 0x6cd1, - 0x5b: 0x6cd2, - 0x5c: 0x6cd4, - 0x5d: 0x6cd6, - }, - 0x26: [94]uint16{ - 0x00: 0x6cda, - 0x01: 0x6cdc, - 0x02: 0x6ce0, - 0x03: 0x6ce7, - 0x04: 0x6ce9, - 0x05: 0x6ceb, - 0x06: 0x6cec, - 0x07: 0x6cee, - 0x08: 0x6cf2, - 0x09: 0x6cf4, - 0x0a: 0x6d04, - 0x0b: 0x6d07, - 0x0c: 0x6d0a, - 0x0d: 0x6d0e, - 0x0e: 0x6d0f, - 0x0f: 0x6d11, - 0x10: 0x6d13, - 0x11: 0x6d1a, - 0x12: 0x6d26, - 0x13: 0x6d27, - 0x14: 0x6d28, - 0x15: 0x6c67, - 0x16: 0x6d2e, - 0x17: 0x6d2f, - 0x18: 0x6d31, - 0x19: 0x6d39, - 0x1a: 0x6d3c, - 0x1b: 0x6d3f, - 0x1c: 0x6d57, - 0x1d: 0x6d5e, - 0x1e: 0x6d5f, - 0x1f: 0x6d61, - 0x20: 0x6d65, - 0x21: 0x6d67, - 0x22: 0x6d6f, - 0x23: 0x6d70, - 0x24: 0x6d7c, - 0x25: 0x6d82, - 0x26: 0x6d87, - 0x27: 0x6d91, - 0x28: 0x6d92, - 0x29: 0x6d94, - 0x2a: 0x6d96, - 0x2b: 0x6d97, - 0x2c: 0x6d98, - 0x2d: 0x6daa, - 0x2e: 0x6dac, - 0x2f: 0x6db4, - 0x30: 0x6db7, - 0x31: 0x6db9, - 0x32: 0x6dbd, - 0x33: 0x6dbf, - 0x34: 0x6dc4, - 0x35: 0x6dc8, - 0x36: 0x6dca, - 0x37: 0x6dce, - 0x38: 0x6dcf, - 0x39: 0x6dd6, - 0x3a: 0x6ddb, - 0x3b: 0x6ddd, - 0x3c: 0x6ddf, - 0x3d: 0x6de0, - 0x3e: 0x6de2, - 0x3f: 0x6de5, - 0x40: 0x6de9, - 0x41: 0x6def, - 0x42: 0x6df0, - 0x43: 0x6df4, - 0x44: 0x6df6, - 0x45: 0x6dfc, - 0x46: 0x6e00, - 0x47: 0x6e04, - 0x48: 0x6e1e, - 0x49: 0x6e22, - 0x4a: 0x6e27, - 0x4b: 0x6e32, - 0x4c: 0x6e36, - 0x4d: 0x6e39, - 0x4e: 0x6e3b, - 0x4f: 0x6e3c, - 0x50: 0x6e44, - 0x51: 0x6e45, - 0x52: 0x6e48, - 0x53: 0x6e49, - 0x54: 0x6e4b, - 0x55: 0x6e4f, - 0x56: 0x6e51, - 0x57: 0x6e52, - 0x58: 0x6e53, - 0x59: 0x6e54, - 0x5a: 0x6e57, - 0x5b: 0x6e5c, - 0x5c: 0x6e5d, - 0x5d: 0x6e5e, - }, - 0x27: [94]uint16{ - 0x00: 0x6e62, - 0x01: 0x6e63, - 0x02: 0x6e68, - 0x03: 0x6e73, - 0x04: 0x6e7b, - 0x05: 0x6e7d, - 0x06: 0x6e8d, - 0x07: 0x6e93, - 0x08: 0x6e99, - 0x09: 0x6ea0, - 0x0a: 0x6ea7, - 0x0b: 0x6ead, - 0x0c: 0x6eae, - 0x0d: 0x6eb1, - 0x0e: 0x6eb3, - 0x0f: 0x6ebb, - 0x10: 0x6ebf, - 0x11: 0x6ec0, - 0x12: 0x6ec1, - 0x13: 0x6ec3, - 0x14: 0x6ec7, - 0x15: 0x6ec8, - 0x16: 0x6eca, - 0x17: 0x6ecd, - 0x18: 0x6ece, - 0x19: 0x6ecf, - 0x1a: 0x6eeb, - 0x1b: 0x6eed, - 0x1c: 0x6eee, - 0x1d: 0x6ef9, - 0x1e: 0x6efb, - 0x1f: 0x6efd, - 0x20: 0x6f04, - 0x21: 0x6f08, - 0x22: 0x6f0a, - 0x23: 0x6f0c, - 0x24: 0x6f0d, - 0x25: 0x6f16, - 0x26: 0x6f18, - 0x27: 0x6f1a, - 0x28: 0x6f1b, - 0x29: 0x6f26, - 0x2a: 0x6f29, - 0x2b: 0x6f2a, - 0x2c: 0x6f2f, - 0x2d: 0x6f30, - 0x2e: 0x6f33, - 0x2f: 0x6f36, - 0x30: 0x6f3b, - 0x31: 0x6f3c, - 0x32: 0x6f2d, - 0x33: 0x6f4f, - 0x34: 0x6f51, - 0x35: 0x6f52, - 0x36: 0x6f53, - 0x37: 0x6f57, - 0x38: 0x6f59, - 0x39: 0x6f5a, - 0x3a: 0x6f5d, - 0x3b: 0x6f5e, - 0x3c: 0x6f61, - 0x3d: 0x6f62, - 0x3e: 0x6f68, - 0x3f: 0x6f6c, - 0x40: 0x6f7d, - 0x41: 0x6f7e, - 0x42: 0x6f83, - 0x43: 0x6f87, - 0x44: 0x6f88, - 0x45: 0x6f8b, - 0x46: 0x6f8c, - 0x47: 0x6f8d, - 0x48: 0x6f90, - 0x49: 0x6f92, - 0x4a: 0x6f93, - 0x4b: 0x6f94, - 0x4c: 0x6f96, - 0x4d: 0x6f9a, - 0x4e: 0x6f9f, - 0x4f: 0x6fa0, - 0x50: 0x6fa5, - 0x51: 0x6fa6, - 0x52: 0x6fa7, - 0x53: 0x6fa8, - 0x54: 0x6fae, - 0x55: 0x6faf, - 0x56: 0x6fb0, - 0x57: 0x6fb5, - 0x58: 0x6fb6, - 0x59: 0x6fbc, - 0x5a: 0x6fc5, - 0x5b: 0x6fc7, - 0x5c: 0x6fc8, - 0x5d: 0x6fca, - }, - 0x28: [94]uint16{ - 0x00: 0x6fda, - 0x01: 0x6fde, - 0x02: 0x6fe8, - 0x03: 0x6fe9, - 0x04: 0x6ff0, - 0x05: 0x6ff5, - 0x06: 0x6ff9, - 0x07: 0x6ffc, - 0x08: 0x6ffd, - 0x09: 0x7000, - 0x0a: 0x7005, - 0x0b: 0x7006, - 0x0c: 0x7007, - 0x0d: 0x700d, - 0x0e: 0x7017, - 0x0f: 0x7020, - 0x10: 0x7023, - 0x11: 0x702f, - 0x12: 0x7034, - 0x13: 0x7037, - 0x14: 0x7039, - 0x15: 0x703c, - 0x16: 0x7043, - 0x17: 0x7044, - 0x18: 0x7048, - 0x19: 0x7049, - 0x1a: 0x704a, - 0x1b: 0x704b, - 0x1c: 0x7054, - 0x1d: 0x7055, - 0x1e: 0x705d, - 0x1f: 0x705e, - 0x20: 0x704e, - 0x21: 0x7064, - 0x22: 0x7065, - 0x23: 0x706c, - 0x24: 0x706e, - 0x25: 0x7075, - 0x26: 0x7076, - 0x27: 0x707e, - 0x28: 0x7081, - 0x29: 0x7085, - 0x2a: 0x7086, - 0x2b: 0x7094, - 0x2c: 0x7095, - 0x2d: 0x7096, - 0x2e: 0x7097, - 0x2f: 0x7098, - 0x30: 0x709b, - 0x31: 0x70a4, - 0x32: 0x70ab, - 0x33: 0x70b0, - 0x34: 0x70b1, - 0x35: 0x70b4, - 0x36: 0x70b7, - 0x37: 0x70ca, - 0x38: 0x70d1, - 0x39: 0x70d3, - 0x3a: 0x70d4, - 0x3b: 0x70d5, - 0x3c: 0x70d6, - 0x3d: 0x70d8, - 0x3e: 0x70dc, - 0x3f: 0x70e4, - 0x40: 0x70fa, - 0x41: 0x7103, - 0x42: 0x7104, - 0x43: 0x7105, - 0x44: 0x7106, - 0x45: 0x7107, - 0x46: 0x710b, - 0x47: 0x710c, - 0x48: 0x710f, - 0x49: 0x711e, - 0x4a: 0x7120, - 0x4b: 0x712b, - 0x4c: 0x712d, - 0x4d: 0x712f, - 0x4e: 0x7130, - 0x4f: 0x7131, - 0x50: 0x7138, - 0x51: 0x7141, - 0x52: 0x7145, - 0x53: 0x7146, - 0x54: 0x7147, - 0x55: 0x714a, - 0x56: 0x714b, - 0x57: 0x7150, - 0x58: 0x7152, - 0x59: 0x7157, - 0x5a: 0x715a, - 0x5b: 0x715c, - 0x5c: 0x715e, - 0x5d: 0x7160, - }, - 0x29: [94]uint16{ - 0x00: 0x7168, - 0x01: 0x7179, - 0x02: 0x7180, - 0x03: 0x7185, - 0x04: 0x7187, - 0x05: 0x718c, - 0x06: 0x7192, - 0x07: 0x719a, - 0x08: 0x719b, - 0x09: 0x71a0, - 0x0a: 0x71a2, - 0x0b: 0x71af, - 0x0c: 0x71b0, - 0x0d: 0x71b2, - 0x0e: 0x71b3, - 0x0f: 0x71ba, - 0x10: 0x71bf, - 0x11: 0x71c0, - 0x12: 0x71c1, - 0x13: 0x71c4, - 0x14: 0x71cb, - 0x15: 0x71cc, - 0x16: 0x71d3, - 0x17: 0x71d6, - 0x18: 0x71d9, - 0x19: 0x71da, - 0x1a: 0x71dc, - 0x1b: 0x71f8, - 0x1c: 0x71fe, - 0x1d: 0x7200, - 0x1e: 0x7207, - 0x1f: 0x7208, - 0x20: 0x7209, - 0x21: 0x7213, - 0x22: 0x7217, - 0x23: 0x721a, - 0x24: 0x721d, - 0x25: 0x721f, - 0x26: 0x7224, - 0x27: 0x722b, - 0x28: 0x722f, - 0x29: 0x7234, - 0x2a: 0x7238, - 0x2b: 0x7239, - 0x2c: 0x7241, - 0x2d: 0x7242, - 0x2e: 0x7243, - 0x2f: 0x7245, - 0x30: 0x724e, - 0x31: 0x724f, - 0x32: 0x7250, - 0x33: 0x7253, - 0x34: 0x7255, - 0x35: 0x7256, - 0x36: 0x725a, - 0x37: 0x725c, - 0x38: 0x725e, - 0x39: 0x7260, - 0x3a: 0x7263, - 0x3b: 0x7268, - 0x3c: 0x726b, - 0x3d: 0x726e, - 0x3e: 0x726f, - 0x3f: 0x7271, - 0x40: 0x7277, - 0x41: 0x7278, - 0x42: 0x727b, - 0x43: 0x727c, - 0x44: 0x727f, - 0x45: 0x7284, - 0x46: 0x7289, - 0x47: 0x728d, - 0x48: 0x728e, - 0x49: 0x7293, - 0x4a: 0x729b, - 0x4b: 0x72a8, - 0x4c: 0x72ad, - 0x4d: 0x72ae, - 0x4e: 0x72b1, - 0x4f: 0x72b4, - 0x50: 0x72be, - 0x51: 0x72c1, - 0x52: 0x72c7, - 0x53: 0x72c9, - 0x54: 0x72cc, - 0x55: 0x72d5, - 0x56: 0x72d6, - 0x57: 0x72d8, - 0x58: 0x72df, - 0x59: 0x72e5, - 0x5a: 0x72f3, - 0x5b: 0x72f4, - 0x5c: 0x72fa, - 0x5d: 0x72fb, - }, - 0x2a: [94]uint16{ - 0x00: 0x72fe, - 0x01: 0x7302, - 0x02: 0x7304, - 0x03: 0x7305, - 0x04: 0x7307, - 0x05: 0x730b, - 0x06: 0x730d, - 0x07: 0x7312, - 0x08: 0x7313, - 0x09: 0x7318, - 0x0a: 0x7319, - 0x0b: 0x731e, - 0x0c: 0x7322, - 0x0d: 0x7324, - 0x0e: 0x7327, - 0x0f: 0x7328, - 0x10: 0x732c, - 0x11: 0x7331, - 0x12: 0x7332, - 0x13: 0x7335, - 0x14: 0x733a, - 0x15: 0x733b, - 0x16: 0x733d, - 0x17: 0x7343, - 0x18: 0x734d, - 0x19: 0x7350, - 0x1a: 0x7352, - 0x1b: 0x7356, - 0x1c: 0x7358, - 0x1d: 0x735d, - 0x1e: 0x735e, - 0x1f: 0x735f, - 0x20: 0x7360, - 0x21: 0x7366, - 0x22: 0x7367, - 0x23: 0x7369, - 0x24: 0x736b, - 0x25: 0x736c, - 0x26: 0x736e, - 0x27: 0x736f, - 0x28: 0x7371, - 0x29: 0x7377, - 0x2a: 0x7379, - 0x2b: 0x737c, - 0x2c: 0x7380, - 0x2d: 0x7381, - 0x2e: 0x7383, - 0x2f: 0x7385, - 0x30: 0x7386, - 0x31: 0x738e, - 0x32: 0x7390, - 0x33: 0x7393, - 0x34: 0x7395, - 0x35: 0x7397, - 0x36: 0x7398, - 0x37: 0x739c, - 0x38: 0x739e, - 0x39: 0x739f, - 0x3a: 0x73a0, - 0x3b: 0x73a2, - 0x3c: 0x73a5, - 0x3d: 0x73a6, - 0x3e: 0x73aa, - 0x3f: 0x73ab, - 0x40: 0x73ad, - 0x41: 0x73b5, - 0x42: 0x73b7, - 0x43: 0x73b9, - 0x44: 0x73bc, - 0x45: 0x73bd, - 0x46: 0x73bf, - 0x47: 0x73c5, - 0x48: 0x73c6, - 0x49: 0x73c9, - 0x4a: 0x73cb, - 0x4b: 0x73cc, - 0x4c: 0x73cf, - 0x4d: 0x73d2, - 0x4e: 0x73d3, - 0x4f: 0x73d6, - 0x50: 0x73d9, - 0x51: 0x73dd, - 0x52: 0x73e1, - 0x53: 0x73e3, - 0x54: 0x73e6, - 0x55: 0x73e7, - 0x56: 0x73e9, - 0x57: 0x73f4, - 0x58: 0x73f5, - 0x59: 0x73f7, - 0x5a: 0x73f9, - 0x5b: 0x73fa, - 0x5c: 0x73fb, - 0x5d: 0x73fd, - }, - 0x2b: [94]uint16{ - 0x00: 0x73ff, - 0x01: 0x7400, - 0x02: 0x7401, - 0x03: 0x7404, - 0x04: 0x7407, - 0x05: 0x740a, - 0x06: 0x7411, - 0x07: 0x741a, - 0x08: 0x741b, - 0x09: 0x7424, - 0x0a: 0x7426, - 0x0b: 0x7428, - 0x0c: 0x7429, - 0x0d: 0x742a, - 0x0e: 0x742b, - 0x0f: 0x742c, - 0x10: 0x742d, - 0x11: 0x742e, - 0x12: 0x742f, - 0x13: 0x7430, - 0x14: 0x7431, - 0x15: 0x7439, - 0x16: 0x7440, - 0x17: 0x7443, - 0x18: 0x7444, - 0x19: 0x7446, - 0x1a: 0x7447, - 0x1b: 0x744b, - 0x1c: 0x744d, - 0x1d: 0x7451, - 0x1e: 0x7452, - 0x1f: 0x7457, - 0x20: 0x745d, - 0x21: 0x7462, - 0x22: 0x7466, - 0x23: 0x7467, - 0x24: 0x7468, - 0x25: 0x746b, - 0x26: 0x746d, - 0x27: 0x746e, - 0x28: 0x7471, - 0x29: 0x7472, - 0x2a: 0x7480, - 0x2b: 0x7481, - 0x2c: 0x7485, - 0x2d: 0x7486, - 0x2e: 0x7487, - 0x2f: 0x7489, - 0x30: 0x748f, - 0x31: 0x7490, - 0x32: 0x7491, - 0x33: 0x7492, - 0x34: 0x7498, - 0x35: 0x7499, - 0x36: 0x749a, - 0x37: 0x749c, - 0x38: 0x749f, - 0x39: 0x74a0, - 0x3a: 0x74a1, - 0x3b: 0x74a3, - 0x3c: 0x74a6, - 0x3d: 0x74a8, - 0x3e: 0x74a9, - 0x3f: 0x74aa, - 0x40: 0x74ab, - 0x41: 0x74ae, - 0x42: 0x74af, - 0x43: 0x74b1, - 0x44: 0x74b2, - 0x45: 0x74b5, - 0x46: 0x74b9, - 0x47: 0x74bb, - 0x48: 0x74bf, - 0x49: 0x74c8, - 0x4a: 0x74c9, - 0x4b: 0x74cc, - 0x4c: 0x74d0, - 0x4d: 0x74d3, - 0x4e: 0x74d8, - 0x4f: 0x74da, - 0x50: 0x74db, - 0x51: 0x74de, - 0x52: 0x74df, - 0x53: 0x74e4, - 0x54: 0x74e8, - 0x55: 0x74ea, - 0x56: 0x74eb, - 0x57: 0x74ef, - 0x58: 0x74f4, - 0x59: 0x74fa, - 0x5a: 0x74fb, - 0x5b: 0x74fc, - 0x5c: 0x74ff, - 0x5d: 0x7506, - }, - 0x2c: [94]uint16{ - 0x00: 0x7512, - 0x01: 0x7516, - 0x02: 0x7517, - 0x03: 0x7520, - 0x04: 0x7521, - 0x05: 0x7524, - 0x06: 0x7527, - 0x07: 0x7529, - 0x08: 0x752a, - 0x09: 0x752f, - 0x0a: 0x7536, - 0x0b: 0x7539, - 0x0c: 0x753d, - 0x0d: 0x753e, - 0x0e: 0x753f, - 0x0f: 0x7540, - 0x10: 0x7543, - 0x11: 0x7547, - 0x12: 0x7548, - 0x13: 0x754e, - 0x14: 0x7550, - 0x15: 0x7552, - 0x16: 0x7557, - 0x17: 0x755e, - 0x18: 0x755f, - 0x19: 0x7561, - 0x1a: 0x756f, - 0x1b: 0x7571, - 0x1c: 0x7579, - 0x1d: 0x757a, - 0x1e: 0x757b, - 0x1f: 0x757c, - 0x20: 0x757d, - 0x21: 0x757e, - 0x22: 0x7581, - 0x23: 0x7585, - 0x24: 0x7590, - 0x25: 0x7592, - 0x26: 0x7593, - 0x27: 0x7595, - 0x28: 0x7599, - 0x29: 0x759c, - 0x2a: 0x75a2, - 0x2b: 0x75a4, - 0x2c: 0x75b4, - 0x2d: 0x75ba, - 0x2e: 0x75bf, - 0x2f: 0x75c0, - 0x30: 0x75c1, - 0x31: 0x75c4, - 0x32: 0x75c6, - 0x33: 0x75cc, - 0x34: 0x75ce, - 0x35: 0x75cf, - 0x36: 0x75d7, - 0x37: 0x75dc, - 0x38: 0x75df, - 0x39: 0x75e0, - 0x3a: 0x75e1, - 0x3b: 0x75e4, - 0x3c: 0x75e7, - 0x3d: 0x75ec, - 0x3e: 0x75ee, - 0x3f: 0x75ef, - 0x40: 0x75f1, - 0x41: 0x75f9, - 0x42: 0x7600, - 0x43: 0x7602, - 0x44: 0x7603, - 0x45: 0x7604, - 0x46: 0x7607, - 0x47: 0x7608, - 0x48: 0x760a, - 0x49: 0x760c, - 0x4a: 0x760f, - 0x4b: 0x7612, - 0x4c: 0x7613, - 0x4d: 0x7615, - 0x4e: 0x7616, - 0x4f: 0x7619, - 0x50: 0x761b, - 0x51: 0x761c, - 0x52: 0x761d, - 0x53: 0x761e, - 0x54: 0x7623, - 0x55: 0x7625, - 0x56: 0x7626, - 0x57: 0x7629, - 0x58: 0x762d, - 0x59: 0x7632, - 0x5a: 0x7633, - 0x5b: 0x7635, - 0x5c: 0x7638, - 0x5d: 0x7639, - }, - 0x2d: [94]uint16{ - 0x00: 0x763a, - 0x01: 0x763c, - 0x02: 0x764a, - 0x03: 0x7640, - 0x04: 0x7641, - 0x05: 0x7643, - 0x06: 0x7644, - 0x07: 0x7645, - 0x08: 0x7649, - 0x09: 0x764b, - 0x0a: 0x7655, - 0x0b: 0x7659, - 0x0c: 0x765f, - 0x0d: 0x7664, - 0x0e: 0x7665, - 0x0f: 0x766d, - 0x10: 0x766e, - 0x11: 0x766f, - 0x12: 0x7671, - 0x13: 0x7674, - 0x14: 0x7681, - 0x15: 0x7685, - 0x16: 0x768c, - 0x17: 0x768d, - 0x18: 0x7695, - 0x19: 0x769b, - 0x1a: 0x769c, - 0x1b: 0x769d, - 0x1c: 0x769f, - 0x1d: 0x76a0, - 0x1e: 0x76a2, - 0x1f: 0x76a3, - 0x20: 0x76a4, - 0x21: 0x76a5, - 0x22: 0x76a6, - 0x23: 0x76a7, - 0x24: 0x76a8, - 0x25: 0x76aa, - 0x26: 0x76ad, - 0x27: 0x76bd, - 0x28: 0x76c1, - 0x29: 0x76c5, - 0x2a: 0x76c9, - 0x2b: 0x76cb, - 0x2c: 0x76cc, - 0x2d: 0x76ce, - 0x2e: 0x76d4, - 0x2f: 0x76d9, - 0x30: 0x76e0, - 0x31: 0x76e6, - 0x32: 0x76e8, - 0x33: 0x76ec, - 0x34: 0x76f0, - 0x35: 0x76f1, - 0x36: 0x76f6, - 0x37: 0x76f9, - 0x38: 0x76fc, - 0x39: 0x7700, - 0x3a: 0x7706, - 0x3b: 0x770a, - 0x3c: 0x770e, - 0x3d: 0x7712, - 0x3e: 0x7714, - 0x3f: 0x7715, - 0x40: 0x7717, - 0x41: 0x7719, - 0x42: 0x771a, - 0x43: 0x771c, - 0x44: 0x7722, - 0x45: 0x7728, - 0x46: 0x772d, - 0x47: 0x772e, - 0x48: 0x772f, - 0x49: 0x7734, - 0x4a: 0x7735, - 0x4b: 0x7736, - 0x4c: 0x7739, - 0x4d: 0x773d, - 0x4e: 0x773e, - 0x4f: 0x7742, - 0x50: 0x7745, - 0x51: 0x7746, - 0x52: 0x774a, - 0x53: 0x774d, - 0x54: 0x774e, - 0x55: 0x774f, - 0x56: 0x7752, - 0x57: 0x7756, - 0x58: 0x7757, - 0x59: 0x775c, - 0x5a: 0x775e, - 0x5b: 0x775f, - 0x5c: 0x7760, - 0x5d: 0x7762, - }, - 0x2e: [94]uint16{ - 0x00: 0x7764, - 0x01: 0x7767, - 0x02: 0x776a, - 0x03: 0x776c, - 0x04: 0x7770, - 0x05: 0x7772, - 0x06: 0x7773, - 0x07: 0x7774, - 0x08: 0x777a, - 0x09: 0x777d, - 0x0a: 0x7780, - 0x0b: 0x7784, - 0x0c: 0x778c, - 0x0d: 0x778d, - 0x0e: 0x7794, - 0x0f: 0x7795, - 0x10: 0x7796, - 0x11: 0x779a, - 0x12: 0x779f, - 0x13: 0x77a2, - 0x14: 0x77a7, - 0x15: 0x77aa, - 0x16: 0x77ae, - 0x17: 0x77af, - 0x18: 0x77b1, - 0x19: 0x77b5, - 0x1a: 0x77be, - 0x1b: 0x77c3, - 0x1c: 0x77c9, - 0x1d: 0x77d1, - 0x1e: 0x77d2, - 0x1f: 0x77d5, - 0x20: 0x77d9, - 0x21: 0x77de, - 0x22: 0x77df, - 0x23: 0x77e0, - 0x24: 0x77e4, - 0x25: 0x77e6, - 0x26: 0x77ea, - 0x27: 0x77ec, - 0x28: 0x77f0, - 0x29: 0x77f1, - 0x2a: 0x77f4, - 0x2b: 0x77f8, - 0x2c: 0x77fb, - 0x2d: 0x7805, - 0x2e: 0x7806, - 0x2f: 0x7809, - 0x30: 0x780d, - 0x31: 0x780e, - 0x32: 0x7811, - 0x33: 0x781d, - 0x34: 0x7821, - 0x35: 0x7822, - 0x36: 0x7823, - 0x37: 0x782d, - 0x38: 0x782e, - 0x39: 0x7830, - 0x3a: 0x7835, - 0x3b: 0x7837, - 0x3c: 0x7843, - 0x3d: 0x7844, - 0x3e: 0x7847, - 0x3f: 0x7848, - 0x40: 0x784c, - 0x41: 0x784e, - 0x42: 0x7852, - 0x43: 0x785c, - 0x44: 0x785e, - 0x45: 0x7860, - 0x46: 0x7861, - 0x47: 0x7863, - 0x48: 0x7864, - 0x49: 0x7868, - 0x4a: 0x786a, - 0x4b: 0x786e, - 0x4c: 0x787a, - 0x4d: 0x787e, - 0x4e: 0x788a, - 0x4f: 0x788f, - 0x50: 0x7894, - 0x51: 0x7898, - 0x52: 0x78a1, - 0x53: 0x789d, - 0x54: 0x789e, - 0x55: 0x789f, - 0x56: 0x78a4, - 0x57: 0x78a8, - 0x58: 0x78ac, - 0x59: 0x78ad, - 0x5a: 0x78b0, - 0x5b: 0x78b1, - 0x5c: 0x78b2, - 0x5d: 0x78b3, - }, - 0x2f: [94]uint16{ - 0x00: 0x78bb, - 0x01: 0x78bd, - 0x02: 0x78bf, - 0x03: 0x78c7, - 0x04: 0x78c8, - 0x05: 0x78c9, - 0x06: 0x78cc, - 0x07: 0x78ce, - 0x08: 0x78d2, - 0x09: 0x78d3, - 0x0a: 0x78d5, - 0x0b: 0x78d6, - 0x0c: 0x78e4, - 0x0d: 0x78db, - 0x0e: 0x78df, - 0x0f: 0x78e0, - 0x10: 0x78e1, - 0x11: 0x78e6, - 0x12: 0x78ea, - 0x13: 0x78f2, - 0x14: 0x78f3, - 0x15: 0x7900, - 0x16: 0x78f6, - 0x17: 0x78f7, - 0x18: 0x78fa, - 0x19: 0x78fb, - 0x1a: 0x78ff, - 0x1b: 0x7906, - 0x1c: 0x790c, - 0x1d: 0x7910, - 0x1e: 0x791a, - 0x1f: 0x791c, - 0x20: 0x791e, - 0x21: 0x791f, - 0x22: 0x7920, - 0x23: 0x7925, - 0x24: 0x7927, - 0x25: 0x7929, - 0x26: 0x792d, - 0x27: 0x7931, - 0x28: 0x7934, - 0x29: 0x7935, - 0x2a: 0x793b, - 0x2b: 0x793d, - 0x2c: 0x793f, - 0x2d: 0x7944, - 0x2e: 0x7945, - 0x2f: 0x7946, - 0x30: 0x794a, - 0x31: 0x794b, - 0x32: 0x794f, - 0x33: 0x7951, - 0x34: 0x7954, - 0x35: 0x7958, - 0x36: 0x795b, - 0x37: 0x795c, - 0x38: 0x7967, - 0x39: 0x7969, - 0x3a: 0x796b, - 0x3b: 0x7972, - 0x3c: 0x7979, - 0x3d: 0x797b, - 0x3e: 0x797c, - 0x3f: 0x797e, - 0x40: 0x798b, - 0x41: 0x798c, - 0x42: 0x7991, - 0x43: 0x7993, - 0x44: 0x7994, - 0x45: 0x7995, - 0x46: 0x7996, - 0x47: 0x7998, - 0x48: 0x799b, - 0x49: 0x799c, - 0x4a: 0x79a1, - 0x4b: 0x79a8, - 0x4c: 0x79a9, - 0x4d: 0x79ab, - 0x4e: 0x79af, - 0x4f: 0x79b1, - 0x50: 0x79b4, - 0x51: 0x79b8, - 0x52: 0x79bb, - 0x53: 0x79c2, - 0x54: 0x79c4, - 0x55: 0x79c7, - 0x56: 0x79c8, - 0x57: 0x79ca, - 0x58: 0x79cf, - 0x59: 0x79d4, - 0x5a: 0x79d6, - 0x5b: 0x79da, - 0x5c: 0x79dd, - 0x5d: 0x79de, - }, - 0x30: [94]uint16{ - 0x00: 0x79e0, - 0x01: 0x79e2, - 0x02: 0x79e5, - 0x03: 0x79ea, - 0x04: 0x79eb, - 0x05: 0x79ed, - 0x06: 0x79f1, - 0x07: 0x79f8, - 0x08: 0x79fc, - 0x09: 0x7a02, - 0x0a: 0x7a03, - 0x0b: 0x7a07, - 0x0c: 0x7a09, - 0x0d: 0x7a0a, - 0x0e: 0x7a0c, - 0x0f: 0x7a11, - 0x10: 0x7a15, - 0x11: 0x7a1b, - 0x12: 0x7a1e, - 0x13: 0x7a21, - 0x14: 0x7a27, - 0x15: 0x7a2b, - 0x16: 0x7a2d, - 0x17: 0x7a2f, - 0x18: 0x7a30, - 0x19: 0x7a34, - 0x1a: 0x7a35, - 0x1b: 0x7a38, - 0x1c: 0x7a39, - 0x1d: 0x7a3a, - 0x1e: 0x7a44, - 0x1f: 0x7a45, - 0x20: 0x7a47, - 0x21: 0x7a48, - 0x22: 0x7a4c, - 0x23: 0x7a55, - 0x24: 0x7a56, - 0x25: 0x7a59, - 0x26: 0x7a5c, - 0x27: 0x7a5d, - 0x28: 0x7a5f, - 0x29: 0x7a60, - 0x2a: 0x7a65, - 0x2b: 0x7a67, - 0x2c: 0x7a6a, - 0x2d: 0x7a6d, - 0x2e: 0x7a75, - 0x2f: 0x7a78, - 0x30: 0x7a7e, - 0x31: 0x7a80, - 0x32: 0x7a82, - 0x33: 0x7a85, - 0x34: 0x7a86, - 0x35: 0x7a8a, - 0x36: 0x7a8b, - 0x37: 0x7a90, - 0x38: 0x7a91, - 0x39: 0x7a94, - 0x3a: 0x7a9e, - 0x3b: 0x7aa0, - 0x3c: 0x7aa3, - 0x3d: 0x7aac, - 0x3e: 0x7ab3, - 0x3f: 0x7ab5, - 0x40: 0x7ab9, - 0x41: 0x7abb, - 0x42: 0x7abc, - 0x43: 0x7ac6, - 0x44: 0x7ac9, - 0x45: 0x7acc, - 0x46: 0x7ace, - 0x47: 0x7ad1, - 0x48: 0x7adb, - 0x49: 0x7ae8, - 0x4a: 0x7ae9, - 0x4b: 0x7aeb, - 0x4c: 0x7aec, - 0x4d: 0x7af1, - 0x4e: 0x7af4, - 0x4f: 0x7afb, - 0x50: 0x7afd, - 0x51: 0x7afe, - 0x52: 0x7b07, - 0x53: 0x7b14, - 0x54: 0x7b1f, - 0x55: 0x7b23, - 0x56: 0x7b27, - 0x57: 0x7b29, - 0x58: 0x7b2a, - 0x59: 0x7b2b, - 0x5a: 0x7b2d, - 0x5b: 0x7b2e, - 0x5c: 0x7b2f, - 0x5d: 0x7b30, - }, - 0x31: [94]uint16{ - 0x00: 0x7b31, - 0x01: 0x7b34, - 0x02: 0x7b3d, - 0x03: 0x7b3f, - 0x04: 0x7b40, - 0x05: 0x7b41, - 0x06: 0x7b47, - 0x07: 0x7b4e, - 0x08: 0x7b55, - 0x09: 0x7b60, - 0x0a: 0x7b64, - 0x0b: 0x7b66, - 0x0c: 0x7b69, - 0x0d: 0x7b6a, - 0x0e: 0x7b6d, - 0x0f: 0x7b6f, - 0x10: 0x7b72, - 0x11: 0x7b73, - 0x12: 0x7b77, - 0x13: 0x7b84, - 0x14: 0x7b89, - 0x15: 0x7b8e, - 0x16: 0x7b90, - 0x17: 0x7b91, - 0x18: 0x7b96, - 0x19: 0x7b9b, - 0x1a: 0x7b9e, - 0x1b: 0x7ba0, - 0x1c: 0x7ba5, - 0x1d: 0x7bac, - 0x1e: 0x7baf, - 0x1f: 0x7bb0, - 0x20: 0x7bb2, - 0x21: 0x7bb5, - 0x22: 0x7bb6, - 0x23: 0x7bba, - 0x24: 0x7bbb, - 0x25: 0x7bbc, - 0x26: 0x7bbd, - 0x27: 0x7bc2, - 0x28: 0x7bc5, - 0x29: 0x7bc8, - 0x2a: 0x7bca, - 0x2b: 0x7bd4, - 0x2c: 0x7bd6, - 0x2d: 0x7bd7, - 0x2e: 0x7bd9, - 0x2f: 0x7bda, - 0x30: 0x7bdb, - 0x31: 0x7be8, - 0x32: 0x7bea, - 0x33: 0x7bf2, - 0x34: 0x7bf4, - 0x35: 0x7bf5, - 0x36: 0x7bf8, - 0x37: 0x7bf9, - 0x38: 0x7bfa, - 0x39: 0x7bfc, - 0x3a: 0x7bfe, - 0x3b: 0x7c01, - 0x3c: 0x7c02, - 0x3d: 0x7c03, - 0x3e: 0x7c04, - 0x3f: 0x7c06, - 0x40: 0x7c09, - 0x41: 0x7c0b, - 0x42: 0x7c0c, - 0x43: 0x7c0e, - 0x44: 0x7c0f, - 0x45: 0x7c19, - 0x46: 0x7c1b, - 0x47: 0x7c20, - 0x48: 0x7c25, - 0x49: 0x7c26, - 0x4a: 0x7c28, - 0x4b: 0x7c2c, - 0x4c: 0x7c31, - 0x4d: 0x7c33, - 0x4e: 0x7c34, - 0x4f: 0x7c36, - 0x50: 0x7c39, - 0x51: 0x7c3a, - 0x52: 0x7c46, - 0x53: 0x7c4a, - 0x54: 0x7c55, - 0x55: 0x7c51, - 0x56: 0x7c52, - 0x57: 0x7c53, - 0x58: 0x7c59, - 0x59: 0x7c5a, - 0x5a: 0x7c5b, - 0x5b: 0x7c5c, - 0x5c: 0x7c5d, - 0x5d: 0x7c5e, - }, - 0x32: [94]uint16{ - 0x00: 0x7c61, - 0x01: 0x7c63, - 0x02: 0x7c67, - 0x03: 0x7c69, - 0x04: 0x7c6d, - 0x05: 0x7c6e, - 0x06: 0x7c70, - 0x07: 0x7c72, - 0x08: 0x7c79, - 0x09: 0x7c7c, - 0x0a: 0x7c7d, - 0x0b: 0x7c86, - 0x0c: 0x7c87, - 0x0d: 0x7c8f, - 0x0e: 0x7c94, - 0x0f: 0x7c9e, - 0x10: 0x7ca0, - 0x11: 0x7ca6, - 0x12: 0x7cb0, - 0x13: 0x7cb6, - 0x14: 0x7cb7, - 0x15: 0x7cba, - 0x16: 0x7cbb, - 0x17: 0x7cbc, - 0x18: 0x7cbf, - 0x19: 0x7cc4, - 0x1a: 0x7cc7, - 0x1b: 0x7cc8, - 0x1c: 0x7cc9, - 0x1d: 0x7ccd, - 0x1e: 0x7ccf, - 0x1f: 0x7cd3, - 0x20: 0x7cd4, - 0x21: 0x7cd5, - 0x22: 0x7cd7, - 0x23: 0x7cd9, - 0x24: 0x7cda, - 0x25: 0x7cdd, - 0x26: 0x7ce6, - 0x27: 0x7ce9, - 0x28: 0x7ceb, - 0x29: 0x7cf5, - 0x2a: 0x7d03, - 0x2b: 0x7d07, - 0x2c: 0x7d08, - 0x2d: 0x7d09, - 0x2e: 0x7d0f, - 0x2f: 0x7d11, - 0x30: 0x7d12, - 0x31: 0x7d13, - 0x32: 0x7d16, - 0x33: 0x7d1d, - 0x34: 0x7d1e, - 0x35: 0x7d23, - 0x36: 0x7d26, - 0x37: 0x7d2a, - 0x38: 0x7d2d, - 0x39: 0x7d31, - 0x3a: 0x7d3c, - 0x3b: 0x7d3d, - 0x3c: 0x7d3e, - 0x3d: 0x7d40, - 0x3e: 0x7d41, - 0x3f: 0x7d47, - 0x40: 0x7d48, - 0x41: 0x7d4d, - 0x42: 0x7d51, - 0x43: 0x7d53, - 0x44: 0x7d57, - 0x45: 0x7d59, - 0x46: 0x7d5a, - 0x47: 0x7d5c, - 0x48: 0x7d5d, - 0x49: 0x7d65, - 0x4a: 0x7d67, - 0x4b: 0x7d6a, - 0x4c: 0x7d70, - 0x4d: 0x7d78, - 0x4e: 0x7d7a, - 0x4f: 0x7d7b, - 0x50: 0x7d7f, - 0x51: 0x7d81, - 0x52: 0x7d82, - 0x53: 0x7d83, - 0x54: 0x7d85, - 0x55: 0x7d86, - 0x56: 0x7d88, - 0x57: 0x7d8b, - 0x58: 0x7d8c, - 0x59: 0x7d8d, - 0x5a: 0x7d91, - 0x5b: 0x7d96, - 0x5c: 0x7d97, - 0x5d: 0x7d9d, - }, - 0x33: [94]uint16{ - 0x00: 0x7d9e, - 0x01: 0x7da6, - 0x02: 0x7da7, - 0x03: 0x7daa, - 0x04: 0x7db3, - 0x05: 0x7db6, - 0x06: 0x7db7, - 0x07: 0x7db9, - 0x08: 0x7dc2, - 0x09: 0x7dc3, - 0x0a: 0x7dc4, - 0x0b: 0x7dc5, - 0x0c: 0x7dc6, - 0x0d: 0x7dcc, - 0x0e: 0x7dcd, - 0x0f: 0x7dce, - 0x10: 0x7dd7, - 0x11: 0x7dd9, - 0x12: 0x7e00, - 0x13: 0x7de2, - 0x14: 0x7de5, - 0x15: 0x7de6, - 0x16: 0x7dea, - 0x17: 0x7deb, - 0x18: 0x7ded, - 0x19: 0x7df1, - 0x1a: 0x7df5, - 0x1b: 0x7df6, - 0x1c: 0x7df9, - 0x1d: 0x7dfa, - 0x1e: 0x7e08, - 0x1f: 0x7e10, - 0x20: 0x7e11, - 0x21: 0x7e15, - 0x22: 0x7e17, - 0x23: 0x7e1c, - 0x24: 0x7e1d, - 0x25: 0x7e20, - 0x26: 0x7e27, - 0x27: 0x7e28, - 0x28: 0x7e2c, - 0x29: 0x7e2d, - 0x2a: 0x7e2f, - 0x2b: 0x7e33, - 0x2c: 0x7e36, - 0x2d: 0x7e3f, - 0x2e: 0x7e44, - 0x2f: 0x7e45, - 0x30: 0x7e47, - 0x31: 0x7e4e, - 0x32: 0x7e50, - 0x33: 0x7e52, - 0x34: 0x7e58, - 0x35: 0x7e5f, - 0x36: 0x7e61, - 0x37: 0x7e62, - 0x38: 0x7e65, - 0x39: 0x7e6b, - 0x3a: 0x7e6e, - 0x3b: 0x7e6f, - 0x3c: 0x7e73, - 0x3d: 0x7e78, - 0x3e: 0x7e7e, - 0x3f: 0x7e81, - 0x40: 0x7e86, - 0x41: 0x7e87, - 0x42: 0x7e8a, - 0x43: 0x7e8d, - 0x44: 0x7e91, - 0x45: 0x7e95, - 0x46: 0x7e98, - 0x47: 0x7e9a, - 0x48: 0x7e9d, - 0x49: 0x7e9e, - 0x4a: 0x7f3c, - 0x4b: 0x7f3b, - 0x4c: 0x7f3d, - 0x4d: 0x7f3e, - 0x4e: 0x7f3f, - 0x4f: 0x7f43, - 0x50: 0x7f44, - 0x51: 0x7f47, - 0x52: 0x7f4f, - 0x53: 0x7f52, - 0x54: 0x7f53, - 0x55: 0x7f5b, - 0x56: 0x7f5c, - 0x57: 0x7f5d, - 0x58: 0x7f61, - 0x59: 0x7f63, - 0x5a: 0x7f64, - 0x5b: 0x7f65, - 0x5c: 0x7f66, - 0x5d: 0x7f6d, - }, - 0x34: [94]uint16{ - 0x00: 0x7f71, - 0x01: 0x7f7d, - 0x02: 0x7f7e, - 0x03: 0x7f7f, - 0x04: 0x7f80, - 0x05: 0x7f8b, - 0x06: 0x7f8d, - 0x07: 0x7f8f, - 0x08: 0x7f90, - 0x09: 0x7f91, - 0x0a: 0x7f96, - 0x0b: 0x7f97, - 0x0c: 0x7f9c, - 0x0d: 0x7fa1, - 0x0e: 0x7fa2, - 0x0f: 0x7fa6, - 0x10: 0x7faa, - 0x11: 0x7fad, - 0x12: 0x7fb4, - 0x13: 0x7fbc, - 0x14: 0x7fbf, - 0x15: 0x7fc0, - 0x16: 0x7fc3, - 0x17: 0x7fc8, - 0x18: 0x7fce, - 0x19: 0x7fcf, - 0x1a: 0x7fdb, - 0x1b: 0x7fdf, - 0x1c: 0x7fe3, - 0x1d: 0x7fe5, - 0x1e: 0x7fe8, - 0x1f: 0x7fec, - 0x20: 0x7fee, - 0x21: 0x7fef, - 0x22: 0x7ff2, - 0x23: 0x7ffa, - 0x24: 0x7ffd, - 0x25: 0x7ffe, - 0x26: 0x7fff, - 0x27: 0x8007, - 0x28: 0x8008, - 0x29: 0x800a, - 0x2a: 0x800d, - 0x2b: 0x800e, - 0x2c: 0x800f, - 0x2d: 0x8011, - 0x2e: 0x8013, - 0x2f: 0x8014, - 0x30: 0x8016, - 0x31: 0x801d, - 0x32: 0x801e, - 0x33: 0x801f, - 0x34: 0x8020, - 0x35: 0x8024, - 0x36: 0x8026, - 0x37: 0x802c, - 0x38: 0x802e, - 0x39: 0x8030, - 0x3a: 0x8034, - 0x3b: 0x8035, - 0x3c: 0x8037, - 0x3d: 0x8039, - 0x3e: 0x803a, - 0x3f: 0x803c, - 0x40: 0x803e, - 0x41: 0x8040, - 0x42: 0x8044, - 0x43: 0x8060, - 0x44: 0x8064, - 0x45: 0x8066, - 0x46: 0x806d, - 0x47: 0x8071, - 0x48: 0x8075, - 0x49: 0x8081, - 0x4a: 0x8088, - 0x4b: 0x808e, - 0x4c: 0x809c, - 0x4d: 0x809e, - 0x4e: 0x80a6, - 0x4f: 0x80a7, - 0x50: 0x80ab, - 0x51: 0x80b8, - 0x52: 0x80b9, - 0x53: 0x80c8, - 0x54: 0x80cd, - 0x55: 0x80cf, - 0x56: 0x80d2, - 0x57: 0x80d4, - 0x58: 0x80d5, - 0x59: 0x80d7, - 0x5a: 0x80d8, - 0x5b: 0x80e0, - 0x5c: 0x80ed, - 0x5d: 0x80ee, - }, - 0x35: [94]uint16{ - 0x00: 0x80f0, - 0x01: 0x80f2, - 0x02: 0x80f3, - 0x03: 0x80f6, - 0x04: 0x80f9, - 0x05: 0x80fa, - 0x06: 0x80fe, - 0x07: 0x8103, - 0x08: 0x810b, - 0x09: 0x8116, - 0x0a: 0x8117, - 0x0b: 0x8118, - 0x0c: 0x811c, - 0x0d: 0x811e, - 0x0e: 0x8120, - 0x0f: 0x8124, - 0x10: 0x8127, - 0x11: 0x812c, - 0x12: 0x8130, - 0x13: 0x8135, - 0x14: 0x813a, - 0x15: 0x813c, - 0x16: 0x8145, - 0x17: 0x8147, - 0x18: 0x814a, - 0x19: 0x814c, - 0x1a: 0x8152, - 0x1b: 0x8157, - 0x1c: 0x8160, - 0x1d: 0x8161, - 0x1e: 0x8167, - 0x1f: 0x8168, - 0x20: 0x8169, - 0x21: 0x816d, - 0x22: 0x816f, - 0x23: 0x8177, - 0x24: 0x8181, - 0x25: 0x8190, - 0x26: 0x8184, - 0x27: 0x8185, - 0x28: 0x8186, - 0x29: 0x818b, - 0x2a: 0x818e, - 0x2b: 0x8196, - 0x2c: 0x8198, - 0x2d: 0x819b, - 0x2e: 0x819e, - 0x2f: 0x81a2, - 0x30: 0x81ae, - 0x31: 0x81b2, - 0x32: 0x81b4, - 0x33: 0x81bb, - 0x34: 0x81cb, - 0x35: 0x81c3, - 0x36: 0x81c5, - 0x37: 0x81ca, - 0x38: 0x81ce, - 0x39: 0x81cf, - 0x3a: 0x81d5, - 0x3b: 0x81d7, - 0x3c: 0x81db, - 0x3d: 0x81dd, - 0x3e: 0x81de, - 0x3f: 0x81e1, - 0x40: 0x81e4, - 0x41: 0x81eb, - 0x42: 0x81ec, - 0x43: 0x81f0, - 0x44: 0x81f1, - 0x45: 0x81f2, - 0x46: 0x81f5, - 0x47: 0x81f6, - 0x48: 0x81f8, - 0x49: 0x81f9, - 0x4a: 0x81fd, - 0x4b: 0x81ff, - 0x4c: 0x8200, - 0x4d: 0x8203, - 0x4e: 0x820f, - 0x4f: 0x8213, - 0x50: 0x8214, - 0x51: 0x8219, - 0x52: 0x821a, - 0x53: 0x821d, - 0x54: 0x8221, - 0x55: 0x8222, - 0x56: 0x8228, - 0x57: 0x8232, - 0x58: 0x8234, - 0x59: 0x823a, - 0x5a: 0x8243, - 0x5b: 0x8244, - 0x5c: 0x8245, - 0x5d: 0x8246, - }, - 0x36: [94]uint16{ - 0x00: 0x824b, - 0x01: 0x824e, - 0x02: 0x824f, - 0x03: 0x8251, - 0x04: 0x8256, - 0x05: 0x825c, - 0x06: 0x8260, - 0x07: 0x8263, - 0x08: 0x8267, - 0x09: 0x826d, - 0x0a: 0x8274, - 0x0b: 0x827b, - 0x0c: 0x827d, - 0x0d: 0x827f, - 0x0e: 0x8280, - 0x0f: 0x8281, - 0x10: 0x8283, - 0x11: 0x8284, - 0x12: 0x8287, - 0x13: 0x8289, - 0x14: 0x828a, - 0x15: 0x828e, - 0x16: 0x8291, - 0x17: 0x8294, - 0x18: 0x8296, - 0x19: 0x8298, - 0x1a: 0x829a, - 0x1b: 0x829b, - 0x1c: 0x82a0, - 0x1d: 0x82a1, - 0x1e: 0x82a3, - 0x1f: 0x82a4, - 0x20: 0x82a7, - 0x21: 0x82a8, - 0x22: 0x82a9, - 0x23: 0x82aa, - 0x24: 0x82ae, - 0x25: 0x82b0, - 0x26: 0x82b2, - 0x27: 0x82b4, - 0x28: 0x82b7, - 0x29: 0x82ba, - 0x2a: 0x82bc, - 0x2b: 0x82be, - 0x2c: 0x82bf, - 0x2d: 0x82c6, - 0x2e: 0x82d0, - 0x2f: 0x82d5, - 0x30: 0x82da, - 0x31: 0x82e0, - 0x32: 0x82e2, - 0x33: 0x82e4, - 0x34: 0x82e8, - 0x35: 0x82ea, - 0x36: 0x82ed, - 0x37: 0x82ef, - 0x38: 0x82f6, - 0x39: 0x82f7, - 0x3a: 0x82fd, - 0x3b: 0x82fe, - 0x3c: 0x8300, - 0x3d: 0x8301, - 0x3e: 0x8307, - 0x3f: 0x8308, - 0x40: 0x830a, - 0x41: 0x830b, - 0x42: 0x8354, - 0x43: 0x831b, - 0x44: 0x831d, - 0x45: 0x831e, - 0x46: 0x831f, - 0x47: 0x8321, - 0x48: 0x8322, - 0x49: 0x832c, - 0x4a: 0x832d, - 0x4b: 0x832e, - 0x4c: 0x8330, - 0x4d: 0x8333, - 0x4e: 0x8337, - 0x4f: 0x833a, - 0x50: 0x833c, - 0x51: 0x833d, - 0x52: 0x8342, - 0x53: 0x8343, - 0x54: 0x8344, - 0x55: 0x8347, - 0x56: 0x834d, - 0x57: 0x834e, - 0x58: 0x8351, - 0x59: 0x8355, - 0x5a: 0x8356, - 0x5b: 0x8357, - 0x5c: 0x8370, - 0x5d: 0x8378, - }, - 0x37: [94]uint16{ - 0x00: 0x837d, - 0x01: 0x837f, - 0x02: 0x8380, - 0x03: 0x8382, - 0x04: 0x8384, - 0x05: 0x8386, - 0x06: 0x838d, - 0x07: 0x8392, - 0x08: 0x8394, - 0x09: 0x8395, - 0x0a: 0x8398, - 0x0b: 0x8399, - 0x0c: 0x839b, - 0x0d: 0x839c, - 0x0e: 0x839d, - 0x0f: 0x83a6, - 0x10: 0x83a7, - 0x11: 0x83a9, - 0x12: 0x83ac, - 0x13: 0x83be, - 0x14: 0x83bf, - 0x15: 0x83c0, - 0x16: 0x83c7, - 0x17: 0x83c9, - 0x18: 0x83cf, - 0x19: 0x83d0, - 0x1a: 0x83d1, - 0x1b: 0x83d4, - 0x1c: 0x83dd, - 0x1d: 0x8353, - 0x1e: 0x83e8, - 0x1f: 0x83ea, - 0x20: 0x83f6, - 0x21: 0x83f8, - 0x22: 0x83f9, - 0x23: 0x83fc, - 0x24: 0x8401, - 0x25: 0x8406, - 0x26: 0x840a, - 0x27: 0x840f, - 0x28: 0x8411, - 0x29: 0x8415, - 0x2a: 0x8419, - 0x2b: 0x83ad, - 0x2c: 0x842f, - 0x2d: 0x8439, - 0x2e: 0x8445, - 0x2f: 0x8447, - 0x30: 0x8448, - 0x31: 0x844a, - 0x32: 0x844d, - 0x33: 0x844f, - 0x34: 0x8451, - 0x35: 0x8452, - 0x36: 0x8456, - 0x37: 0x8458, - 0x38: 0x8459, - 0x39: 0x845a, - 0x3a: 0x845c, - 0x3b: 0x8460, - 0x3c: 0x8464, - 0x3d: 0x8465, - 0x3e: 0x8467, - 0x3f: 0x846a, - 0x40: 0x8470, - 0x41: 0x8473, - 0x42: 0x8474, - 0x43: 0x8476, - 0x44: 0x8478, - 0x45: 0x847c, - 0x46: 0x847d, - 0x47: 0x8481, - 0x48: 0x8485, - 0x49: 0x8492, - 0x4a: 0x8493, - 0x4b: 0x8495, - 0x4c: 0x849e, - 0x4d: 0x84a6, - 0x4e: 0x84a8, - 0x4f: 0x84a9, - 0x50: 0x84aa, - 0x51: 0x84af, - 0x52: 0x84b1, - 0x53: 0x84b4, - 0x54: 0x84ba, - 0x55: 0x84bd, - 0x56: 0x84be, - 0x57: 0x84c0, - 0x58: 0x84c2, - 0x59: 0x84c7, - 0x5a: 0x84c8, - 0x5b: 0x84cc, - 0x5c: 0x84cf, - 0x5d: 0x84d3, - }, - 0x38: [94]uint16{ - 0x00: 0x84dc, - 0x01: 0x84e7, - 0x02: 0x84ea, - 0x03: 0x84ef, - 0x04: 0x84f0, - 0x05: 0x84f1, - 0x06: 0x84f2, - 0x07: 0x84f7, - 0x08: 0x8532, - 0x09: 0x84fa, - 0x0a: 0x84fb, - 0x0b: 0x84fd, - 0x0c: 0x8502, - 0x0d: 0x8503, - 0x0e: 0x8507, - 0x0f: 0x850c, - 0x10: 0x850e, - 0x11: 0x8510, - 0x12: 0x851c, - 0x13: 0x851e, - 0x14: 0x8522, - 0x15: 0x8523, - 0x16: 0x8524, - 0x17: 0x8525, - 0x18: 0x8527, - 0x19: 0x852a, - 0x1a: 0x852b, - 0x1b: 0x852f, - 0x1c: 0x8533, - 0x1d: 0x8534, - 0x1e: 0x8536, - 0x1f: 0x853f, - 0x20: 0x8546, - 0x21: 0x854f, - 0x22: 0x8550, - 0x23: 0x8551, - 0x24: 0x8552, - 0x25: 0x8553, - 0x26: 0x8556, - 0x27: 0x8559, - 0x28: 0x855c, - 0x29: 0x855d, - 0x2a: 0x855e, - 0x2b: 0x855f, - 0x2c: 0x8560, - 0x2d: 0x8561, - 0x2e: 0x8562, - 0x2f: 0x8564, - 0x30: 0x856b, - 0x31: 0x856f, - 0x32: 0x8579, - 0x33: 0x857a, - 0x34: 0x857b, - 0x35: 0x857d, - 0x36: 0x857f, - 0x37: 0x8581, - 0x38: 0x8585, - 0x39: 0x8586, - 0x3a: 0x8589, - 0x3b: 0x858b, - 0x3c: 0x858c, - 0x3d: 0x858f, - 0x3e: 0x8593, - 0x3f: 0x8598, - 0x40: 0x859d, - 0x41: 0x859f, - 0x42: 0x85a0, - 0x43: 0x85a2, - 0x44: 0x85a5, - 0x45: 0x85a7, - 0x46: 0x85b4, - 0x47: 0x85b6, - 0x48: 0x85b7, - 0x49: 0x85b8, - 0x4a: 0x85bc, - 0x4b: 0x85bd, - 0x4c: 0x85be, - 0x4d: 0x85bf, - 0x4e: 0x85c2, - 0x4f: 0x85c7, - 0x50: 0x85ca, - 0x51: 0x85cb, - 0x52: 0x85ce, - 0x53: 0x85ad, - 0x54: 0x85d8, - 0x55: 0x85da, - 0x56: 0x85df, - 0x57: 0x85e0, - 0x58: 0x85e6, - 0x59: 0x85e8, - 0x5a: 0x85ed, - 0x5b: 0x85f3, - 0x5c: 0x85f6, - 0x5d: 0x85fc, - }, - 0x39: [94]uint16{ - 0x00: 0x85ff, - 0x01: 0x8600, - 0x02: 0x8604, - 0x03: 0x8605, - 0x04: 0x860d, - 0x05: 0x860e, - 0x06: 0x8610, - 0x07: 0x8611, - 0x08: 0x8612, - 0x09: 0x8618, - 0x0a: 0x8619, - 0x0b: 0x861b, - 0x0c: 0x861e, - 0x0d: 0x8621, - 0x0e: 0x8627, - 0x0f: 0x8629, - 0x10: 0x8636, - 0x11: 0x8638, - 0x12: 0x863a, - 0x13: 0x863c, - 0x14: 0x863d, - 0x15: 0x8640, - 0x16: 0x8642, - 0x17: 0x8646, - 0x18: 0x8652, - 0x19: 0x8653, - 0x1a: 0x8656, - 0x1b: 0x8657, - 0x1c: 0x8658, - 0x1d: 0x8659, - 0x1e: 0x865d, - 0x1f: 0x8660, - 0x20: 0x8661, - 0x21: 0x8662, - 0x22: 0x8663, - 0x23: 0x8664, - 0x24: 0x8669, - 0x25: 0x866c, - 0x26: 0x866f, - 0x27: 0x8675, - 0x28: 0x8676, - 0x29: 0x8677, - 0x2a: 0x867a, - 0x2b: 0x868d, - 0x2c: 0x8691, - 0x2d: 0x8696, - 0x2e: 0x8698, - 0x2f: 0x869a, - 0x30: 0x869c, - 0x31: 0x86a1, - 0x32: 0x86a6, - 0x33: 0x86a7, - 0x34: 0x86a8, - 0x35: 0x86ad, - 0x36: 0x86b1, - 0x37: 0x86b3, - 0x38: 0x86b4, - 0x39: 0x86b5, - 0x3a: 0x86b7, - 0x3b: 0x86b8, - 0x3c: 0x86b9, - 0x3d: 0x86bf, - 0x3e: 0x86c0, - 0x3f: 0x86c1, - 0x40: 0x86c3, - 0x41: 0x86c5, - 0x42: 0x86d1, - 0x43: 0x86d2, - 0x44: 0x86d5, - 0x45: 0x86d7, - 0x46: 0x86da, - 0x47: 0x86dc, - 0x48: 0x86e0, - 0x49: 0x86e3, - 0x4a: 0x86e5, - 0x4b: 0x86e7, - 0x4c: 0x8688, - 0x4d: 0x86fa, - 0x4e: 0x86fc, - 0x4f: 0x86fd, - 0x50: 0x8704, - 0x51: 0x8705, - 0x52: 0x8707, - 0x53: 0x870b, - 0x54: 0x870e, - 0x55: 0x870f, - 0x56: 0x8710, - 0x57: 0x8713, - 0x58: 0x8714, - 0x59: 0x8719, - 0x5a: 0x871e, - 0x5b: 0x871f, - 0x5c: 0x8721, - 0x5d: 0x8723, - }, - 0x3a: [94]uint16{ - 0x00: 0x8728, - 0x01: 0x872e, - 0x02: 0x872f, - 0x03: 0x8731, - 0x04: 0x8732, - 0x05: 0x8739, - 0x06: 0x873a, - 0x07: 0x873c, - 0x08: 0x873d, - 0x09: 0x873e, - 0x0a: 0x8740, - 0x0b: 0x8743, - 0x0c: 0x8745, - 0x0d: 0x874d, - 0x0e: 0x8758, - 0x0f: 0x875d, - 0x10: 0x8761, - 0x11: 0x8764, - 0x12: 0x8765, - 0x13: 0x876f, - 0x14: 0x8771, - 0x15: 0x8772, - 0x16: 0x877b, - 0x17: 0x8783, - 0x18: 0x8784, - 0x19: 0x8785, - 0x1a: 0x8786, - 0x1b: 0x8787, - 0x1c: 0x8788, - 0x1d: 0x8789, - 0x1e: 0x878b, - 0x1f: 0x878c, - 0x20: 0x8790, - 0x21: 0x8793, - 0x22: 0x8795, - 0x23: 0x8797, - 0x24: 0x8798, - 0x25: 0x8799, - 0x26: 0x879e, - 0x27: 0x87a0, - 0x28: 0x87a3, - 0x29: 0x87a7, - 0x2a: 0x87ac, - 0x2b: 0x87ad, - 0x2c: 0x87ae, - 0x2d: 0x87b1, - 0x2e: 0x87b5, - 0x2f: 0x87be, - 0x30: 0x87bf, - 0x31: 0x87c1, - 0x32: 0x87c8, - 0x33: 0x87c9, - 0x34: 0x87ca, - 0x35: 0x87ce, - 0x36: 0x87d5, - 0x37: 0x87d6, - 0x38: 0x87d9, - 0x39: 0x87da, - 0x3a: 0x87dc, - 0x3b: 0x87df, - 0x3c: 0x87e2, - 0x3d: 0x87e3, - 0x3e: 0x87e4, - 0x3f: 0x87ea, - 0x40: 0x87eb, - 0x41: 0x87ed, - 0x42: 0x87f1, - 0x43: 0x87f3, - 0x44: 0x87f8, - 0x45: 0x87fa, - 0x46: 0x87ff, - 0x47: 0x8801, - 0x48: 0x8803, - 0x49: 0x8806, - 0x4a: 0x8809, - 0x4b: 0x880a, - 0x4c: 0x880b, - 0x4d: 0x8810, - 0x4e: 0x8819, - 0x4f: 0x8812, - 0x50: 0x8813, - 0x51: 0x8814, - 0x52: 0x8818, - 0x53: 0x881a, - 0x54: 0x881b, - 0x55: 0x881c, - 0x56: 0x881e, - 0x57: 0x881f, - 0x58: 0x8828, - 0x59: 0x882d, - 0x5a: 0x882e, - 0x5b: 0x8830, - 0x5c: 0x8832, - 0x5d: 0x8835, - }, - 0x3b: [94]uint16{ - 0x00: 0x883a, - 0x01: 0x883c, - 0x02: 0x8841, - 0x03: 0x8843, - 0x04: 0x8845, - 0x05: 0x8848, - 0x06: 0x8849, - 0x07: 0x884a, - 0x08: 0x884b, - 0x09: 0x884e, - 0x0a: 0x8851, - 0x0b: 0x8855, - 0x0c: 0x8856, - 0x0d: 0x8858, - 0x0e: 0x885a, - 0x0f: 0x885c, - 0x10: 0x885f, - 0x11: 0x8860, - 0x12: 0x8864, - 0x13: 0x8869, - 0x14: 0x8871, - 0x15: 0x8879, - 0x16: 0x887b, - 0x17: 0x8880, - 0x18: 0x8898, - 0x19: 0x889a, - 0x1a: 0x889b, - 0x1b: 0x889c, - 0x1c: 0x889f, - 0x1d: 0x88a0, - 0x1e: 0x88a8, - 0x1f: 0x88aa, - 0x20: 0x88ba, - 0x21: 0x88bd, - 0x22: 0x88be, - 0x23: 0x88c0, - 0x24: 0x88ca, - 0x25: 0x88cb, - 0x26: 0x88cc, - 0x27: 0x88cd, - 0x28: 0x88ce, - 0x29: 0x88d1, - 0x2a: 0x88d2, - 0x2b: 0x88d3, - 0x2c: 0x88db, - 0x2d: 0x88de, - 0x2e: 0x88e7, - 0x2f: 0x88ef, - 0x30: 0x88f0, - 0x31: 0x88f1, - 0x32: 0x88f5, - 0x33: 0x88f7, - 0x34: 0x8901, - 0x35: 0x8906, - 0x36: 0x890d, - 0x37: 0x890e, - 0x38: 0x890f, - 0x39: 0x8915, - 0x3a: 0x8916, - 0x3b: 0x8918, - 0x3c: 0x8919, - 0x3d: 0x891a, - 0x3e: 0x891c, - 0x3f: 0x8920, - 0x40: 0x8926, - 0x41: 0x8927, - 0x42: 0x8928, - 0x43: 0x8930, - 0x44: 0x8931, - 0x45: 0x8932, - 0x46: 0x8935, - 0x47: 0x8939, - 0x48: 0x893a, - 0x49: 0x893e, - 0x4a: 0x8940, - 0x4b: 0x8942, - 0x4c: 0x8945, - 0x4d: 0x8946, - 0x4e: 0x8949, - 0x4f: 0x894f, - 0x50: 0x8952, - 0x51: 0x8957, - 0x52: 0x895a, - 0x53: 0x895b, - 0x54: 0x895c, - 0x55: 0x8961, - 0x56: 0x8962, - 0x57: 0x8963, - 0x58: 0x896b, - 0x59: 0x896e, - 0x5a: 0x8970, - 0x5b: 0x8973, - 0x5c: 0x8975, - 0x5d: 0x897a, - }, - 0x3c: [94]uint16{ - 0x00: 0x897b, - 0x01: 0x897c, - 0x02: 0x897d, - 0x03: 0x8989, - 0x04: 0x898d, - 0x05: 0x8990, - 0x06: 0x8994, - 0x07: 0x8995, - 0x08: 0x899b, - 0x09: 0x899c, - 0x0a: 0x899f, - 0x0b: 0x89a0, - 0x0c: 0x89a5, - 0x0d: 0x89b0, - 0x0e: 0x89b4, - 0x0f: 0x89b5, - 0x10: 0x89b6, - 0x11: 0x89b7, - 0x12: 0x89bc, - 0x13: 0x89d4, - 0x14: 0x89d5, - 0x15: 0x89d6, - 0x16: 0x89d7, - 0x17: 0x89d8, - 0x18: 0x89e5, - 0x19: 0x89e9, - 0x1a: 0x89eb, - 0x1b: 0x89ed, - 0x1c: 0x89f1, - 0x1d: 0x89f3, - 0x1e: 0x89f6, - 0x1f: 0x89f9, - 0x20: 0x89fd, - 0x21: 0x89ff, - 0x22: 0x8a04, - 0x23: 0x8a05, - 0x24: 0x8a07, - 0x25: 0x8a0f, - 0x26: 0x8a11, - 0x27: 0x8a12, - 0x28: 0x8a14, - 0x29: 0x8a15, - 0x2a: 0x8a1e, - 0x2b: 0x8a20, - 0x2c: 0x8a22, - 0x2d: 0x8a24, - 0x2e: 0x8a26, - 0x2f: 0x8a2b, - 0x30: 0x8a2c, - 0x31: 0x8a2f, - 0x32: 0x8a35, - 0x33: 0x8a37, - 0x34: 0x8a3d, - 0x35: 0x8a3e, - 0x36: 0x8a40, - 0x37: 0x8a43, - 0x38: 0x8a45, - 0x39: 0x8a47, - 0x3a: 0x8a49, - 0x3b: 0x8a4d, - 0x3c: 0x8a4e, - 0x3d: 0x8a53, - 0x3e: 0x8a56, - 0x3f: 0x8a57, - 0x40: 0x8a58, - 0x41: 0x8a5c, - 0x42: 0x8a5d, - 0x43: 0x8a61, - 0x44: 0x8a65, - 0x45: 0x8a67, - 0x46: 0x8a75, - 0x47: 0x8a76, - 0x48: 0x8a77, - 0x49: 0x8a79, - 0x4a: 0x8a7a, - 0x4b: 0x8a7b, - 0x4c: 0x8a7e, - 0x4d: 0x8a7f, - 0x4e: 0x8a80, - 0x4f: 0x8a83, - 0x50: 0x8a86, - 0x51: 0x8a8b, - 0x52: 0x8a8f, - 0x53: 0x8a90, - 0x54: 0x8a92, - 0x55: 0x8a96, - 0x56: 0x8a97, - 0x57: 0x8a99, - 0x58: 0x8a9f, - 0x59: 0x8aa7, - 0x5a: 0x8aa9, - 0x5b: 0x8aae, - 0x5c: 0x8aaf, - 0x5d: 0x8ab3, - }, - 0x3d: [94]uint16{ - 0x00: 0x8ab6, - 0x01: 0x8ab7, - 0x02: 0x8abb, - 0x03: 0x8abe, - 0x04: 0x8ac3, - 0x05: 0x8ac6, - 0x06: 0x8ac8, - 0x07: 0x8ac9, - 0x08: 0x8aca, - 0x09: 0x8ad1, - 0x0a: 0x8ad3, - 0x0b: 0x8ad4, - 0x0c: 0x8ad5, - 0x0d: 0x8ad7, - 0x0e: 0x8add, - 0x0f: 0x8adf, - 0x10: 0x8aec, - 0x11: 0x8af0, - 0x12: 0x8af4, - 0x13: 0x8af5, - 0x14: 0x8af6, - 0x15: 0x8afc, - 0x16: 0x8aff, - 0x17: 0x8b05, - 0x18: 0x8b06, - 0x19: 0x8b0b, - 0x1a: 0x8b11, - 0x1b: 0x8b1c, - 0x1c: 0x8b1e, - 0x1d: 0x8b1f, - 0x1e: 0x8b0a, - 0x1f: 0x8b2d, - 0x20: 0x8b30, - 0x21: 0x8b37, - 0x22: 0x8b3c, - 0x23: 0x8b42, - 0x24: 0x8b43, - 0x25: 0x8b44, - 0x26: 0x8b45, - 0x27: 0x8b46, - 0x28: 0x8b48, - 0x29: 0x8b52, - 0x2a: 0x8b53, - 0x2b: 0x8b54, - 0x2c: 0x8b59, - 0x2d: 0x8b4d, - 0x2e: 0x8b5e, - 0x2f: 0x8b63, - 0x30: 0x8b6d, - 0x31: 0x8b76, - 0x32: 0x8b78, - 0x33: 0x8b79, - 0x34: 0x8b7c, - 0x35: 0x8b7e, - 0x36: 0x8b81, - 0x37: 0x8b84, - 0x38: 0x8b85, - 0x39: 0x8b8b, - 0x3a: 0x8b8d, - 0x3b: 0x8b8f, - 0x3c: 0x8b94, - 0x3d: 0x8b95, - 0x3e: 0x8b9c, - 0x3f: 0x8b9e, - 0x40: 0x8b9f, - 0x41: 0x8c38, - 0x42: 0x8c39, - 0x43: 0x8c3d, - 0x44: 0x8c3e, - 0x45: 0x8c45, - 0x46: 0x8c47, - 0x47: 0x8c49, - 0x48: 0x8c4b, - 0x49: 0x8c4f, - 0x4a: 0x8c51, - 0x4b: 0x8c53, - 0x4c: 0x8c54, - 0x4d: 0x8c57, - 0x4e: 0x8c58, - 0x4f: 0x8c5b, - 0x50: 0x8c5d, - 0x51: 0x8c59, - 0x52: 0x8c63, - 0x53: 0x8c64, - 0x54: 0x8c66, - 0x55: 0x8c68, - 0x56: 0x8c69, - 0x57: 0x8c6d, - 0x58: 0x8c73, - 0x59: 0x8c75, - 0x5a: 0x8c76, - 0x5b: 0x8c7b, - 0x5c: 0x8c7e, - 0x5d: 0x8c86, - }, - 0x3e: [94]uint16{ - 0x00: 0x8c87, - 0x01: 0x8c8b, - 0x02: 0x8c90, - 0x03: 0x8c92, - 0x04: 0x8c93, - 0x05: 0x8c99, - 0x06: 0x8c9b, - 0x07: 0x8c9c, - 0x08: 0x8ca4, - 0x09: 0x8cb9, - 0x0a: 0x8cba, - 0x0b: 0x8cc5, - 0x0c: 0x8cc6, - 0x0d: 0x8cc9, - 0x0e: 0x8ccb, - 0x0f: 0x8ccf, - 0x10: 0x8cd6, - 0x11: 0x8cd5, - 0x12: 0x8cd9, - 0x13: 0x8cdd, - 0x14: 0x8ce1, - 0x15: 0x8ce8, - 0x16: 0x8cec, - 0x17: 0x8cef, - 0x18: 0x8cf0, - 0x19: 0x8cf2, - 0x1a: 0x8cf5, - 0x1b: 0x8cf7, - 0x1c: 0x8cf8, - 0x1d: 0x8cfe, - 0x1e: 0x8cff, - 0x1f: 0x8d01, - 0x20: 0x8d03, - 0x21: 0x8d09, - 0x22: 0x8d12, - 0x23: 0x8d17, - 0x24: 0x8d1b, - 0x25: 0x8d65, - 0x26: 0x8d69, - 0x27: 0x8d6c, - 0x28: 0x8d6e, - 0x29: 0x8d7f, - 0x2a: 0x8d82, - 0x2b: 0x8d84, - 0x2c: 0x8d88, - 0x2d: 0x8d8d, - 0x2e: 0x8d90, - 0x2f: 0x8d91, - 0x30: 0x8d95, - 0x31: 0x8d9e, - 0x32: 0x8d9f, - 0x33: 0x8da0, - 0x34: 0x8da6, - 0x35: 0x8dab, - 0x36: 0x8dac, - 0x37: 0x8daf, - 0x38: 0x8db2, - 0x39: 0x8db5, - 0x3a: 0x8db7, - 0x3b: 0x8db9, - 0x3c: 0x8dbb, - 0x3d: 0x8dc0, - 0x3e: 0x8dc5, - 0x3f: 0x8dc6, - 0x40: 0x8dc7, - 0x41: 0x8dc8, - 0x42: 0x8dca, - 0x43: 0x8dce, - 0x44: 0x8dd1, - 0x45: 0x8dd4, - 0x46: 0x8dd5, - 0x47: 0x8dd7, - 0x48: 0x8dd9, - 0x49: 0x8de4, - 0x4a: 0x8de5, - 0x4b: 0x8de7, - 0x4c: 0x8dec, - 0x4d: 0x8df0, - 0x4e: 0x8dbc, - 0x4f: 0x8df1, - 0x50: 0x8df2, - 0x51: 0x8df4, - 0x52: 0x8dfd, - 0x53: 0x8e01, - 0x54: 0x8e04, - 0x55: 0x8e05, - 0x56: 0x8e06, - 0x57: 0x8e0b, - 0x58: 0x8e11, - 0x59: 0x8e14, - 0x5a: 0x8e16, - 0x5b: 0x8e20, - 0x5c: 0x8e21, - 0x5d: 0x8e22, - }, - 0x3f: [94]uint16{ - 0x00: 0x8e23, - 0x01: 0x8e26, - 0x02: 0x8e27, - 0x03: 0x8e31, - 0x04: 0x8e33, - 0x05: 0x8e36, - 0x06: 0x8e37, - 0x07: 0x8e38, - 0x08: 0x8e39, - 0x09: 0x8e3d, - 0x0a: 0x8e40, - 0x0b: 0x8e41, - 0x0c: 0x8e4b, - 0x0d: 0x8e4d, - 0x0e: 0x8e4e, - 0x0f: 0x8e4f, - 0x10: 0x8e54, - 0x11: 0x8e5b, - 0x12: 0x8e5c, - 0x13: 0x8e5d, - 0x14: 0x8e5e, - 0x15: 0x8e61, - 0x16: 0x8e62, - 0x17: 0x8e69, - 0x18: 0x8e6c, - 0x19: 0x8e6d, - 0x1a: 0x8e6f, - 0x1b: 0x8e70, - 0x1c: 0x8e71, - 0x1d: 0x8e79, - 0x1e: 0x8e7a, - 0x1f: 0x8e7b, - 0x20: 0x8e82, - 0x21: 0x8e83, - 0x22: 0x8e89, - 0x23: 0x8e90, - 0x24: 0x8e92, - 0x25: 0x8e95, - 0x26: 0x8e9a, - 0x27: 0x8e9b, - 0x28: 0x8e9d, - 0x29: 0x8e9e, - 0x2a: 0x8ea2, - 0x2b: 0x8ea7, - 0x2c: 0x8ea9, - 0x2d: 0x8ead, - 0x2e: 0x8eae, - 0x2f: 0x8eb3, - 0x30: 0x8eb5, - 0x31: 0x8eba, - 0x32: 0x8ebb, - 0x33: 0x8ec0, - 0x34: 0x8ec1, - 0x35: 0x8ec3, - 0x36: 0x8ec4, - 0x37: 0x8ec7, - 0x38: 0x8ecf, - 0x39: 0x8ed1, - 0x3a: 0x8ed4, - 0x3b: 0x8edc, - 0x3c: 0x8ee8, - 0x3d: 0x8eee, - 0x3e: 0x8ef0, - 0x3f: 0x8ef1, - 0x40: 0x8ef7, - 0x41: 0x8ef9, - 0x42: 0x8efa, - 0x43: 0x8eed, - 0x44: 0x8f00, - 0x45: 0x8f02, - 0x46: 0x8f07, - 0x47: 0x8f08, - 0x48: 0x8f0f, - 0x49: 0x8f10, - 0x4a: 0x8f16, - 0x4b: 0x8f17, - 0x4c: 0x8f18, - 0x4d: 0x8f1e, - 0x4e: 0x8f20, - 0x4f: 0x8f21, - 0x50: 0x8f23, - 0x51: 0x8f25, - 0x52: 0x8f27, - 0x53: 0x8f28, - 0x54: 0x8f2c, - 0x55: 0x8f2d, - 0x56: 0x8f2e, - 0x57: 0x8f34, - 0x58: 0x8f35, - 0x59: 0x8f36, - 0x5a: 0x8f37, - 0x5b: 0x8f3a, - 0x5c: 0x8f40, - 0x5d: 0x8f41, - }, - 0x40: [94]uint16{ - 0x00: 0x8f43, - 0x01: 0x8f47, - 0x02: 0x8f4f, - 0x03: 0x8f51, - 0x04: 0x8f52, - 0x05: 0x8f53, - 0x06: 0x8f54, - 0x07: 0x8f55, - 0x08: 0x8f58, - 0x09: 0x8f5d, - 0x0a: 0x8f5e, - 0x0b: 0x8f65, - 0x0c: 0x8f9d, - 0x0d: 0x8fa0, - 0x0e: 0x8fa1, - 0x0f: 0x8fa4, - 0x10: 0x8fa5, - 0x11: 0x8fa6, - 0x12: 0x8fb5, - 0x13: 0x8fb6, - 0x14: 0x8fb8, - 0x15: 0x8fbe, - 0x16: 0x8fc0, - 0x17: 0x8fc1, - 0x18: 0x8fc6, - 0x19: 0x8fca, - 0x1a: 0x8fcb, - 0x1b: 0x8fcd, - 0x1c: 0x8fd0, - 0x1d: 0x8fd2, - 0x1e: 0x8fd3, - 0x1f: 0x8fd5, - 0x20: 0x8fe0, - 0x21: 0x8fe3, - 0x22: 0x8fe4, - 0x23: 0x8fe8, - 0x24: 0x8fee, - 0x25: 0x8ff1, - 0x26: 0x8ff5, - 0x27: 0x8ff6, - 0x28: 0x8ffb, - 0x29: 0x8ffe, - 0x2a: 0x9002, - 0x2b: 0x9004, - 0x2c: 0x9008, - 0x2d: 0x900c, - 0x2e: 0x9018, - 0x2f: 0x901b, - 0x30: 0x9028, - 0x31: 0x9029, - 0x32: 0x902f, - 0x33: 0x902a, - 0x34: 0x902c, - 0x35: 0x902d, - 0x36: 0x9033, - 0x37: 0x9034, - 0x38: 0x9037, - 0x39: 0x903f, - 0x3a: 0x9043, - 0x3b: 0x9044, - 0x3c: 0x904c, - 0x3d: 0x905b, - 0x3e: 0x905d, - 0x3f: 0x9062, - 0x40: 0x9066, - 0x41: 0x9067, - 0x42: 0x906c, - 0x43: 0x9070, - 0x44: 0x9074, - 0x45: 0x9079, - 0x46: 0x9085, - 0x47: 0x9088, - 0x48: 0x908b, - 0x49: 0x908c, - 0x4a: 0x908e, - 0x4b: 0x9090, - 0x4c: 0x9095, - 0x4d: 0x9097, - 0x4e: 0x9098, - 0x4f: 0x9099, - 0x50: 0x909b, - 0x51: 0x90a0, - 0x52: 0x90a1, - 0x53: 0x90a2, - 0x54: 0x90a5, - 0x55: 0x90b0, - 0x56: 0x90b2, - 0x57: 0x90b3, - 0x58: 0x90b4, - 0x59: 0x90b6, - 0x5a: 0x90bd, - 0x5b: 0x90cc, - 0x5c: 0x90be, - 0x5d: 0x90c3, - }, - 0x41: [94]uint16{ - 0x00: 0x90c4, - 0x01: 0x90c5, - 0x02: 0x90c7, - 0x03: 0x90c8, - 0x04: 0x90d5, - 0x05: 0x90d7, - 0x06: 0x90d8, - 0x07: 0x90d9, - 0x08: 0x90dc, - 0x09: 0x90dd, - 0x0a: 0x90df, - 0x0b: 0x90e5, - 0x0c: 0x90d2, - 0x0d: 0x90f6, - 0x0e: 0x90eb, - 0x0f: 0x90ef, - 0x10: 0x90f0, - 0x11: 0x90f4, - 0x12: 0x90fe, - 0x13: 0x90ff, - 0x14: 0x9100, - 0x15: 0x9104, - 0x16: 0x9105, - 0x17: 0x9106, - 0x18: 0x9108, - 0x19: 0x910d, - 0x1a: 0x9110, - 0x1b: 0x9114, - 0x1c: 0x9116, - 0x1d: 0x9117, - 0x1e: 0x9118, - 0x1f: 0x911a, - 0x20: 0x911c, - 0x21: 0x911e, - 0x22: 0x9120, - 0x23: 0x9125, - 0x24: 0x9122, - 0x25: 0x9123, - 0x26: 0x9127, - 0x27: 0x9129, - 0x28: 0x912e, - 0x29: 0x912f, - 0x2a: 0x9131, - 0x2b: 0x9134, - 0x2c: 0x9136, - 0x2d: 0x9137, - 0x2e: 0x9139, - 0x2f: 0x913a, - 0x30: 0x913c, - 0x31: 0x913d, - 0x32: 0x9143, - 0x33: 0x9147, - 0x34: 0x9148, - 0x35: 0x914f, - 0x36: 0x9153, - 0x37: 0x9157, - 0x38: 0x9159, - 0x39: 0x915a, - 0x3a: 0x915b, - 0x3b: 0x9161, - 0x3c: 0x9164, - 0x3d: 0x9167, - 0x3e: 0x916d, - 0x3f: 0x9174, - 0x40: 0x9179, - 0x41: 0x917a, - 0x42: 0x917b, - 0x43: 0x9181, - 0x44: 0x9183, - 0x45: 0x9185, - 0x46: 0x9186, - 0x47: 0x918a, - 0x48: 0x918e, - 0x49: 0x9191, - 0x4a: 0x9193, - 0x4b: 0x9194, - 0x4c: 0x9195, - 0x4d: 0x9198, - 0x4e: 0x919e, - 0x4f: 0x91a1, - 0x50: 0x91a6, - 0x51: 0x91a8, - 0x52: 0x91ac, - 0x53: 0x91ad, - 0x54: 0x91ae, - 0x55: 0x91b0, - 0x56: 0x91b1, - 0x57: 0x91b2, - 0x58: 0x91b3, - 0x59: 0x91b6, - 0x5a: 0x91bb, - 0x5b: 0x91bc, - 0x5c: 0x91bd, - 0x5d: 0x91bf, - }, - 0x42: [94]uint16{ - 0x00: 0x91c2, - 0x01: 0x91c3, - 0x02: 0x91c5, - 0x03: 0x91d3, - 0x04: 0x91d4, - 0x05: 0x91d7, - 0x06: 0x91d9, - 0x07: 0x91da, - 0x08: 0x91de, - 0x09: 0x91e4, - 0x0a: 0x91e5, - 0x0b: 0x91e9, - 0x0c: 0x91ea, - 0x0d: 0x91ec, - 0x0e: 0x91ed, - 0x0f: 0x91ee, - 0x10: 0x91ef, - 0x11: 0x91f0, - 0x12: 0x91f1, - 0x13: 0x91f7, - 0x14: 0x91f9, - 0x15: 0x91fb, - 0x16: 0x91fd, - 0x17: 0x9200, - 0x18: 0x9201, - 0x19: 0x9204, - 0x1a: 0x9205, - 0x1b: 0x9206, - 0x1c: 0x9207, - 0x1d: 0x9209, - 0x1e: 0x920a, - 0x1f: 0x920c, - 0x20: 0x9210, - 0x21: 0x9212, - 0x22: 0x9213, - 0x23: 0x9216, - 0x24: 0x9218, - 0x25: 0x921c, - 0x26: 0x921d, - 0x27: 0x9223, - 0x28: 0x9224, - 0x29: 0x9225, - 0x2a: 0x9226, - 0x2b: 0x9228, - 0x2c: 0x922e, - 0x2d: 0x922f, - 0x2e: 0x9230, - 0x2f: 0x9233, - 0x30: 0x9235, - 0x31: 0x9236, - 0x32: 0x9238, - 0x33: 0x9239, - 0x34: 0x923a, - 0x35: 0x923c, - 0x36: 0x923e, - 0x37: 0x9240, - 0x38: 0x9242, - 0x39: 0x9243, - 0x3a: 0x9246, - 0x3b: 0x9247, - 0x3c: 0x924a, - 0x3d: 0x924d, - 0x3e: 0x924e, - 0x3f: 0x924f, - 0x40: 0x9251, - 0x41: 0x9258, - 0x42: 0x9259, - 0x43: 0x925c, - 0x44: 0x925d, - 0x45: 0x9260, - 0x46: 0x9261, - 0x47: 0x9265, - 0x48: 0x9267, - 0x49: 0x9268, - 0x4a: 0x9269, - 0x4b: 0x926e, - 0x4c: 0x926f, - 0x4d: 0x9270, - 0x4e: 0x9275, - 0x4f: 0x9276, - 0x50: 0x9277, - 0x51: 0x9278, - 0x52: 0x9279, - 0x53: 0x927b, - 0x54: 0x927c, - 0x55: 0x927d, - 0x56: 0x927f, - 0x57: 0x9288, - 0x58: 0x9289, - 0x59: 0x928a, - 0x5a: 0x928d, - 0x5b: 0x928e, - 0x5c: 0x9292, - 0x5d: 0x9297, - }, - 0x43: [94]uint16{ - 0x00: 0x9299, - 0x01: 0x929f, - 0x02: 0x92a0, - 0x03: 0x92a4, - 0x04: 0x92a5, - 0x05: 0x92a7, - 0x06: 0x92a8, - 0x07: 0x92ab, - 0x08: 0x92af, - 0x09: 0x92b2, - 0x0a: 0x92b6, - 0x0b: 0x92b8, - 0x0c: 0x92ba, - 0x0d: 0x92bb, - 0x0e: 0x92bc, - 0x0f: 0x92bd, - 0x10: 0x92bf, - 0x11: 0x92c0, - 0x12: 0x92c1, - 0x13: 0x92c2, - 0x14: 0x92c3, - 0x15: 0x92c5, - 0x16: 0x92c6, - 0x17: 0x92c7, - 0x18: 0x92c8, - 0x19: 0x92cb, - 0x1a: 0x92cc, - 0x1b: 0x92cd, - 0x1c: 0x92ce, - 0x1d: 0x92d0, - 0x1e: 0x92d3, - 0x1f: 0x92d5, - 0x20: 0x92d7, - 0x21: 0x92d8, - 0x22: 0x92d9, - 0x23: 0x92dc, - 0x24: 0x92dd, - 0x25: 0x92df, - 0x26: 0x92e0, - 0x27: 0x92e1, - 0x28: 0x92e3, - 0x29: 0x92e5, - 0x2a: 0x92e7, - 0x2b: 0x92e8, - 0x2c: 0x92ec, - 0x2d: 0x92ee, - 0x2e: 0x92f0, - 0x2f: 0x92f9, - 0x30: 0x92fb, - 0x31: 0x92ff, - 0x32: 0x9300, - 0x33: 0x9302, - 0x34: 0x9308, - 0x35: 0x930d, - 0x36: 0x9311, - 0x37: 0x9314, - 0x38: 0x9315, - 0x39: 0x931c, - 0x3a: 0x931d, - 0x3b: 0x931e, - 0x3c: 0x931f, - 0x3d: 0x9321, - 0x3e: 0x9324, - 0x3f: 0x9325, - 0x40: 0x9327, - 0x41: 0x9329, - 0x42: 0x932a, - 0x43: 0x9333, - 0x44: 0x9334, - 0x45: 0x9336, - 0x46: 0x9337, - 0x47: 0x9347, - 0x48: 0x9348, - 0x49: 0x9349, - 0x4a: 0x9350, - 0x4b: 0x9351, - 0x4c: 0x9352, - 0x4d: 0x9355, - 0x4e: 0x9357, - 0x4f: 0x9358, - 0x50: 0x935a, - 0x51: 0x935e, - 0x52: 0x9364, - 0x53: 0x9365, - 0x54: 0x9367, - 0x55: 0x9369, - 0x56: 0x936a, - 0x57: 0x936d, - 0x58: 0x936f, - 0x59: 0x9370, - 0x5a: 0x9371, - 0x5b: 0x9373, - 0x5c: 0x9374, - 0x5d: 0x9376, - }, - 0x44: [94]uint16{ - 0x00: 0x937a, - 0x01: 0x937d, - 0x02: 0x937f, - 0x03: 0x9380, - 0x04: 0x9381, - 0x05: 0x9382, - 0x06: 0x9388, - 0x07: 0x938a, - 0x08: 0x938b, - 0x09: 0x938d, - 0x0a: 0x938f, - 0x0b: 0x9392, - 0x0c: 0x9395, - 0x0d: 0x9398, - 0x0e: 0x939b, - 0x0f: 0x939e, - 0x10: 0x93a1, - 0x11: 0x93a3, - 0x12: 0x93a4, - 0x13: 0x93a6, - 0x14: 0x93a8, - 0x15: 0x93ab, - 0x16: 0x93b4, - 0x17: 0x93b5, - 0x18: 0x93b6, - 0x19: 0x93ba, - 0x1a: 0x93a9, - 0x1b: 0x93c1, - 0x1c: 0x93c4, - 0x1d: 0x93c5, - 0x1e: 0x93c6, - 0x1f: 0x93c7, - 0x20: 0x93c9, - 0x21: 0x93ca, - 0x22: 0x93cb, - 0x23: 0x93cc, - 0x24: 0x93cd, - 0x25: 0x93d3, - 0x26: 0x93d9, - 0x27: 0x93dc, - 0x28: 0x93de, - 0x29: 0x93df, - 0x2a: 0x93e2, - 0x2b: 0x93e6, - 0x2c: 0x93e7, - 0x2d: 0x93f9, - 0x2e: 0x93f7, - 0x2f: 0x93f8, - 0x30: 0x93fa, - 0x31: 0x93fb, - 0x32: 0x93fd, - 0x33: 0x9401, - 0x34: 0x9402, - 0x35: 0x9404, - 0x36: 0x9408, - 0x37: 0x9409, - 0x38: 0x940d, - 0x39: 0x940e, - 0x3a: 0x940f, - 0x3b: 0x9415, - 0x3c: 0x9416, - 0x3d: 0x9417, - 0x3e: 0x941f, - 0x3f: 0x942e, - 0x40: 0x942f, - 0x41: 0x9431, - 0x42: 0x9432, - 0x43: 0x9433, - 0x44: 0x9434, - 0x45: 0x943b, - 0x46: 0x943f, - 0x47: 0x943d, - 0x48: 0x9443, - 0x49: 0x9445, - 0x4a: 0x9448, - 0x4b: 0x944a, - 0x4c: 0x944c, - 0x4d: 0x9455, - 0x4e: 0x9459, - 0x4f: 0x945c, - 0x50: 0x945f, - 0x51: 0x9461, - 0x52: 0x9463, - 0x53: 0x9468, - 0x54: 0x946b, - 0x55: 0x946d, - 0x56: 0x946e, - 0x57: 0x946f, - 0x58: 0x9471, - 0x59: 0x9472, - 0x5a: 0x9484, - 0x5b: 0x9483, - 0x5c: 0x9578, - 0x5d: 0x9579, - }, - 0x45: [94]uint16{ - 0x00: 0x957e, - 0x01: 0x9584, - 0x02: 0x9588, - 0x03: 0x958c, - 0x04: 0x958d, - 0x05: 0x958e, - 0x06: 0x959d, - 0x07: 0x959e, - 0x08: 0x959f, - 0x09: 0x95a1, - 0x0a: 0x95a6, - 0x0b: 0x95a9, - 0x0c: 0x95ab, - 0x0d: 0x95ac, - 0x0e: 0x95b4, - 0x0f: 0x95b6, - 0x10: 0x95ba, - 0x11: 0x95bd, - 0x12: 0x95bf, - 0x13: 0x95c6, - 0x14: 0x95c8, - 0x15: 0x95c9, - 0x16: 0x95cb, - 0x17: 0x95d0, - 0x18: 0x95d1, - 0x19: 0x95d2, - 0x1a: 0x95d3, - 0x1b: 0x95d9, - 0x1c: 0x95da, - 0x1d: 0x95dd, - 0x1e: 0x95de, - 0x1f: 0x95df, - 0x20: 0x95e0, - 0x21: 0x95e4, - 0x22: 0x95e6, - 0x23: 0x961d, - 0x24: 0x961e, - 0x25: 0x9622, - 0x26: 0x9624, - 0x27: 0x9625, - 0x28: 0x9626, - 0x29: 0x962c, - 0x2a: 0x9631, - 0x2b: 0x9633, - 0x2c: 0x9637, - 0x2d: 0x9638, - 0x2e: 0x9639, - 0x2f: 0x963a, - 0x30: 0x963c, - 0x31: 0x963d, - 0x32: 0x9641, - 0x33: 0x9652, - 0x34: 0x9654, - 0x35: 0x9656, - 0x36: 0x9657, - 0x37: 0x9658, - 0x38: 0x9661, - 0x39: 0x966e, - 0x3a: 0x9674, - 0x3b: 0x967b, - 0x3c: 0x967c, - 0x3d: 0x967e, - 0x3e: 0x967f, - 0x3f: 0x9681, - 0x40: 0x9682, - 0x41: 0x9683, - 0x42: 0x9684, - 0x43: 0x9689, - 0x44: 0x9691, - 0x45: 0x9696, - 0x46: 0x969a, - 0x47: 0x969d, - 0x48: 0x969f, - 0x49: 0x96a4, - 0x4a: 0x96a5, - 0x4b: 0x96a6, - 0x4c: 0x96a9, - 0x4d: 0x96ae, - 0x4e: 0x96af, - 0x4f: 0x96b3, - 0x50: 0x96ba, - 0x51: 0x96ca, - 0x52: 0x96d2, - 0x53: 0x5db2, - 0x54: 0x96d8, - 0x55: 0x96da, - 0x56: 0x96dd, - 0x57: 0x96de, - 0x58: 0x96df, - 0x59: 0x96e9, - 0x5a: 0x96ef, - 0x5b: 0x96f1, - 0x5c: 0x96fa, - 0x5d: 0x9702, - }, - 0x46: [94]uint16{ - 0x00: 0x9703, - 0x01: 0x9705, - 0x02: 0x9709, - 0x03: 0x971a, - 0x04: 0x971b, - 0x05: 0x971d, - 0x06: 0x9721, - 0x07: 0x9722, - 0x08: 0x9723, - 0x09: 0x9728, - 0x0a: 0x9731, - 0x0b: 0x9733, - 0x0c: 0x9741, - 0x0d: 0x9743, - 0x0e: 0x974a, - 0x0f: 0x974e, - 0x10: 0x974f, - 0x11: 0x9755, - 0x12: 0x9757, - 0x13: 0x9758, - 0x14: 0x975a, - 0x15: 0x975b, - 0x16: 0x9763, - 0x17: 0x9767, - 0x18: 0x976a, - 0x19: 0x976e, - 0x1a: 0x9773, - 0x1b: 0x9776, - 0x1c: 0x9777, - 0x1d: 0x9778, - 0x1e: 0x977b, - 0x1f: 0x977d, - 0x20: 0x977f, - 0x21: 0x9780, - 0x22: 0x9789, - 0x23: 0x9795, - 0x24: 0x9796, - 0x25: 0x9797, - 0x26: 0x9799, - 0x27: 0x979a, - 0x28: 0x979e, - 0x29: 0x979f, - 0x2a: 0x97a2, - 0x2b: 0x97ac, - 0x2c: 0x97ae, - 0x2d: 0x97b1, - 0x2e: 0x97b2, - 0x2f: 0x97b5, - 0x30: 0x97b6, - 0x31: 0x97b8, - 0x32: 0x97b9, - 0x33: 0x97ba, - 0x34: 0x97bc, - 0x35: 0x97be, - 0x36: 0x97bf, - 0x37: 0x97c1, - 0x38: 0x97c4, - 0x39: 0x97c5, - 0x3a: 0x97c7, - 0x3b: 0x97c9, - 0x3c: 0x97ca, - 0x3d: 0x97cc, - 0x3e: 0x97cd, - 0x3f: 0x97ce, - 0x40: 0x97d0, - 0x41: 0x97d1, - 0x42: 0x97d4, - 0x43: 0x97d7, - 0x44: 0x97d8, - 0x45: 0x97d9, - 0x46: 0x97dd, - 0x47: 0x97de, - 0x48: 0x97e0, - 0x49: 0x97db, - 0x4a: 0x97e1, - 0x4b: 0x97e4, - 0x4c: 0x97ef, - 0x4d: 0x97f1, - 0x4e: 0x97f4, - 0x4f: 0x97f7, - 0x50: 0x97f8, - 0x51: 0x97fa, - 0x52: 0x9807, - 0x53: 0x980a, - 0x54: 0x9819, - 0x55: 0x980d, - 0x56: 0x980e, - 0x57: 0x9814, - 0x58: 0x9816, - 0x59: 0x981c, - 0x5a: 0x981e, - 0x5b: 0x9820, - 0x5c: 0x9823, - 0x5d: 0x9826, - }, - 0x47: [94]uint16{ - 0x00: 0x982b, - 0x01: 0x982e, - 0x02: 0x982f, - 0x03: 0x9830, - 0x04: 0x9832, - 0x05: 0x9833, - 0x06: 0x9835, - 0x07: 0x9825, - 0x08: 0x983e, - 0x09: 0x9844, - 0x0a: 0x9847, - 0x0b: 0x984a, - 0x0c: 0x9851, - 0x0d: 0x9852, - 0x0e: 0x9853, - 0x0f: 0x9856, - 0x10: 0x9857, - 0x11: 0x9859, - 0x12: 0x985a, - 0x13: 0x9862, - 0x14: 0x9863, - 0x15: 0x9865, - 0x16: 0x9866, - 0x17: 0x986a, - 0x18: 0x986c, - 0x19: 0x98ab, - 0x1a: 0x98ad, - 0x1b: 0x98ae, - 0x1c: 0x98b0, - 0x1d: 0x98b4, - 0x1e: 0x98b7, - 0x1f: 0x98b8, - 0x20: 0x98ba, - 0x21: 0x98bb, - 0x22: 0x98bf, - 0x23: 0x98c2, - 0x24: 0x98c5, - 0x25: 0x98c8, - 0x26: 0x98cc, - 0x27: 0x98e1, - 0x28: 0x98e3, - 0x29: 0x98e5, - 0x2a: 0x98e6, - 0x2b: 0x98e7, - 0x2c: 0x98ea, - 0x2d: 0x98f3, - 0x2e: 0x98f6, - 0x2f: 0x9902, - 0x30: 0x9907, - 0x31: 0x9908, - 0x32: 0x9911, - 0x33: 0x9915, - 0x34: 0x9916, - 0x35: 0x9917, - 0x36: 0x991a, - 0x37: 0x991b, - 0x38: 0x991c, - 0x39: 0x991f, - 0x3a: 0x9922, - 0x3b: 0x9926, - 0x3c: 0x9927, - 0x3d: 0x992b, - 0x3e: 0x9931, - 0x3f: 0x9932, - 0x40: 0x9933, - 0x41: 0x9934, - 0x42: 0x9935, - 0x43: 0x9939, - 0x44: 0x993a, - 0x45: 0x993b, - 0x46: 0x993c, - 0x47: 0x9940, - 0x48: 0x9941, - 0x49: 0x9946, - 0x4a: 0x9947, - 0x4b: 0x9948, - 0x4c: 0x994d, - 0x4d: 0x994e, - 0x4e: 0x9954, - 0x4f: 0x9958, - 0x50: 0x9959, - 0x51: 0x995b, - 0x52: 0x995c, - 0x53: 0x995e, - 0x54: 0x995f, - 0x55: 0x9960, - 0x56: 0x999b, - 0x57: 0x999d, - 0x58: 0x999f, - 0x59: 0x99a6, - 0x5a: 0x99b0, - 0x5b: 0x99b1, - 0x5c: 0x99b2, - 0x5d: 0x99b5, - }, - 0x48: [94]uint16{ - 0x00: 0x99b9, - 0x01: 0x99ba, - 0x02: 0x99bd, - 0x03: 0x99bf, - 0x04: 0x99c3, - 0x05: 0x99c9, - 0x06: 0x99d3, - 0x07: 0x99d4, - 0x08: 0x99d9, - 0x09: 0x99da, - 0x0a: 0x99dc, - 0x0b: 0x99de, - 0x0c: 0x99e7, - 0x0d: 0x99ea, - 0x0e: 0x99eb, - 0x0f: 0x99ec, - 0x10: 0x99f0, - 0x11: 0x99f4, - 0x12: 0x99f5, - 0x13: 0x99f9, - 0x14: 0x99fd, - 0x15: 0x99fe, - 0x16: 0x9a02, - 0x17: 0x9a03, - 0x18: 0x9a04, - 0x19: 0x9a0b, - 0x1a: 0x9a0c, - 0x1b: 0x9a10, - 0x1c: 0x9a11, - 0x1d: 0x9a16, - 0x1e: 0x9a1e, - 0x1f: 0x9a20, - 0x20: 0x9a22, - 0x21: 0x9a23, - 0x22: 0x9a24, - 0x23: 0x9a27, - 0x24: 0x9a2d, - 0x25: 0x9a2e, - 0x26: 0x9a33, - 0x27: 0x9a35, - 0x28: 0x9a36, - 0x29: 0x9a38, - 0x2a: 0x9a47, - 0x2b: 0x9a41, - 0x2c: 0x9a44, - 0x2d: 0x9a4a, - 0x2e: 0x9a4b, - 0x2f: 0x9a4c, - 0x30: 0x9a4e, - 0x31: 0x9a51, - 0x32: 0x9a54, - 0x33: 0x9a56, - 0x34: 0x9a5d, - 0x35: 0x9aaa, - 0x36: 0x9aac, - 0x37: 0x9aae, - 0x38: 0x9aaf, - 0x39: 0x9ab2, - 0x3a: 0x9ab4, - 0x3b: 0x9ab5, - 0x3c: 0x9ab6, - 0x3d: 0x9ab9, - 0x3e: 0x9abb, - 0x3f: 0x9abe, - 0x40: 0x9abf, - 0x41: 0x9ac1, - 0x42: 0x9ac3, - 0x43: 0x9ac6, - 0x44: 0x9ac8, - 0x45: 0x9ace, - 0x46: 0x9ad0, - 0x47: 0x9ad2, - 0x48: 0x9ad5, - 0x49: 0x9ad6, - 0x4a: 0x9ad7, - 0x4b: 0x9adb, - 0x4c: 0x9adc, - 0x4d: 0x9ae0, - 0x4e: 0x9ae4, - 0x4f: 0x9ae5, - 0x50: 0x9ae7, - 0x51: 0x9ae9, - 0x52: 0x9aec, - 0x53: 0x9af2, - 0x54: 0x9af3, - 0x55: 0x9af5, - 0x56: 0x9af9, - 0x57: 0x9afa, - 0x58: 0x9afd, - 0x59: 0x9aff, - 0x5a: 0x9b00, - 0x5b: 0x9b01, - 0x5c: 0x9b02, - 0x5d: 0x9b03, - }, - 0x49: [94]uint16{ - 0x00: 0x9b04, - 0x01: 0x9b05, - 0x02: 0x9b08, - 0x03: 0x9b09, - 0x04: 0x9b0b, - 0x05: 0x9b0c, - 0x06: 0x9b0d, - 0x07: 0x9b0e, - 0x08: 0x9b10, - 0x09: 0x9b12, - 0x0a: 0x9b16, - 0x0b: 0x9b19, - 0x0c: 0x9b1b, - 0x0d: 0x9b1c, - 0x0e: 0x9b20, - 0x0f: 0x9b26, - 0x10: 0x9b2b, - 0x11: 0x9b2d, - 0x12: 0x9b33, - 0x13: 0x9b34, - 0x14: 0x9b35, - 0x15: 0x9b37, - 0x16: 0x9b39, - 0x17: 0x9b3a, - 0x18: 0x9b3d, - 0x19: 0x9b48, - 0x1a: 0x9b4b, - 0x1b: 0x9b4c, - 0x1c: 0x9b55, - 0x1d: 0x9b56, - 0x1e: 0x9b57, - 0x1f: 0x9b5b, - 0x20: 0x9b5e, - 0x21: 0x9b61, - 0x22: 0x9b63, - 0x23: 0x9b65, - 0x24: 0x9b66, - 0x25: 0x9b68, - 0x26: 0x9b6a, - 0x27: 0x9b6b, - 0x28: 0x9b6c, - 0x29: 0x9b6d, - 0x2a: 0x9b6e, - 0x2b: 0x9b73, - 0x2c: 0x9b75, - 0x2d: 0x9b77, - 0x2e: 0x9b78, - 0x2f: 0x9b79, - 0x30: 0x9b7f, - 0x31: 0x9b80, - 0x32: 0x9b84, - 0x33: 0x9b85, - 0x34: 0x9b86, - 0x35: 0x9b87, - 0x36: 0x9b89, - 0x37: 0x9b8a, - 0x38: 0x9b8b, - 0x39: 0x9b8d, - 0x3a: 0x9b8f, - 0x3b: 0x9b90, - 0x3c: 0x9b94, - 0x3d: 0x9b9a, - 0x3e: 0x9b9d, - 0x3f: 0x9b9e, - 0x40: 0x9ba6, - 0x41: 0x9ba7, - 0x42: 0x9ba9, - 0x43: 0x9bac, - 0x44: 0x9bb0, - 0x45: 0x9bb1, - 0x46: 0x9bb2, - 0x47: 0x9bb7, - 0x48: 0x9bb8, - 0x49: 0x9bbb, - 0x4a: 0x9bbc, - 0x4b: 0x9bbe, - 0x4c: 0x9bbf, - 0x4d: 0x9bc1, - 0x4e: 0x9bc7, - 0x4f: 0x9bc8, - 0x50: 0x9bce, - 0x51: 0x9bd0, - 0x52: 0x9bd7, - 0x53: 0x9bd8, - 0x54: 0x9bdd, - 0x55: 0x9bdf, - 0x56: 0x9be5, - 0x57: 0x9be7, - 0x58: 0x9bea, - 0x59: 0x9beb, - 0x5a: 0x9bef, - 0x5b: 0x9bf3, - 0x5c: 0x9bf7, - 0x5d: 0x9bf8, - }, - 0x4a: [94]uint16{ - 0x00: 0x9bf9, - 0x01: 0x9bfa, - 0x02: 0x9bfd, - 0x03: 0x9bff, - 0x04: 0x9c00, - 0x05: 0x9c02, - 0x06: 0x9c0b, - 0x07: 0x9c0f, - 0x08: 0x9c11, - 0x09: 0x9c16, - 0x0a: 0x9c18, - 0x0b: 0x9c19, - 0x0c: 0x9c1a, - 0x0d: 0x9c1c, - 0x0e: 0x9c1e, - 0x0f: 0x9c22, - 0x10: 0x9c23, - 0x11: 0x9c26, - 0x12: 0x9c27, - 0x13: 0x9c28, - 0x14: 0x9c29, - 0x15: 0x9c2a, - 0x16: 0x9c31, - 0x17: 0x9c35, - 0x18: 0x9c36, - 0x19: 0x9c37, - 0x1a: 0x9c3d, - 0x1b: 0x9c41, - 0x1c: 0x9c43, - 0x1d: 0x9c44, - 0x1e: 0x9c45, - 0x1f: 0x9c49, - 0x20: 0x9c4a, - 0x21: 0x9c4e, - 0x22: 0x9c4f, - 0x23: 0x9c50, - 0x24: 0x9c53, - 0x25: 0x9c54, - 0x26: 0x9c56, - 0x27: 0x9c58, - 0x28: 0x9c5b, - 0x29: 0x9c5d, - 0x2a: 0x9c5e, - 0x2b: 0x9c5f, - 0x2c: 0x9c63, - 0x2d: 0x9c69, - 0x2e: 0x9c6a, - 0x2f: 0x9c5c, - 0x30: 0x9c6b, - 0x31: 0x9c68, - 0x32: 0x9c6e, - 0x33: 0x9c70, - 0x34: 0x9c72, - 0x35: 0x9c75, - 0x36: 0x9c77, - 0x37: 0x9c7b, - 0x38: 0x9ce6, - 0x39: 0x9cf2, - 0x3a: 0x9cf7, - 0x3b: 0x9cf9, - 0x3c: 0x9d0b, - 0x3d: 0x9d02, - 0x3e: 0x9d11, - 0x3f: 0x9d17, - 0x40: 0x9d18, - 0x41: 0x9d1c, - 0x42: 0x9d1d, - 0x43: 0x9d1e, - 0x44: 0x9d2f, - 0x45: 0x9d30, - 0x46: 0x9d32, - 0x47: 0x9d33, - 0x48: 0x9d34, - 0x49: 0x9d3a, - 0x4a: 0x9d3c, - 0x4b: 0x9d45, - 0x4c: 0x9d3d, - 0x4d: 0x9d42, - 0x4e: 0x9d43, - 0x4f: 0x9d47, - 0x50: 0x9d4a, - 0x51: 0x9d53, - 0x52: 0x9d54, - 0x53: 0x9d5f, - 0x54: 0x9d63, - 0x55: 0x9d62, - 0x56: 0x9d65, - 0x57: 0x9d69, - 0x58: 0x9d6a, - 0x59: 0x9d6b, - 0x5a: 0x9d70, - 0x5b: 0x9d76, - 0x5c: 0x9d77, - 0x5d: 0x9d7b, - }, - 0x4b: [94]uint16{ - 0x00: 0x9d7c, - 0x01: 0x9d7e, - 0x02: 0x9d83, - 0x03: 0x9d84, - 0x04: 0x9d86, - 0x05: 0x9d8a, - 0x06: 0x9d8d, - 0x07: 0x9d8e, - 0x08: 0x9d92, - 0x09: 0x9d93, - 0x0a: 0x9d95, - 0x0b: 0x9d96, - 0x0c: 0x9d97, - 0x0d: 0x9d98, - 0x0e: 0x9da1, - 0x0f: 0x9daa, - 0x10: 0x9dac, - 0x11: 0x9dae, - 0x12: 0x9db1, - 0x13: 0x9db5, - 0x14: 0x9db9, - 0x15: 0x9dbc, - 0x16: 0x9dbf, - 0x17: 0x9dc3, - 0x18: 0x9dc7, - 0x19: 0x9dc9, - 0x1a: 0x9dca, - 0x1b: 0x9dd4, - 0x1c: 0x9dd5, - 0x1d: 0x9dd6, - 0x1e: 0x9dd7, - 0x1f: 0x9dda, - 0x20: 0x9dde, - 0x21: 0x9ddf, - 0x22: 0x9de0, - 0x23: 0x9de5, - 0x24: 0x9de7, - 0x25: 0x9de9, - 0x26: 0x9deb, - 0x27: 0x9dee, - 0x28: 0x9df0, - 0x29: 0x9df3, - 0x2a: 0x9df4, - 0x2b: 0x9dfe, - 0x2c: 0x9e0a, - 0x2d: 0x9e02, - 0x2e: 0x9e07, - 0x2f: 0x9e0e, - 0x30: 0x9e10, - 0x31: 0x9e11, - 0x32: 0x9e12, - 0x33: 0x9e15, - 0x34: 0x9e16, - 0x35: 0x9e19, - 0x36: 0x9e1c, - 0x37: 0x9e1d, - 0x38: 0x9e7a, - 0x39: 0x9e7b, - 0x3a: 0x9e7c, - 0x3b: 0x9e80, - 0x3c: 0x9e82, - 0x3d: 0x9e83, - 0x3e: 0x9e84, - 0x3f: 0x9e85, - 0x40: 0x9e87, - 0x41: 0x9e8e, - 0x42: 0x9e8f, - 0x43: 0x9e96, - 0x44: 0x9e98, - 0x45: 0x9e9b, - 0x46: 0x9e9e, - 0x47: 0x9ea4, - 0x48: 0x9ea8, - 0x49: 0x9eac, - 0x4a: 0x9eae, - 0x4b: 0x9eaf, - 0x4c: 0x9eb0, - 0x4d: 0x9eb3, - 0x4e: 0x9eb4, - 0x4f: 0x9eb5, - 0x50: 0x9ec6, - 0x51: 0x9ec8, - 0x52: 0x9ecb, - 0x53: 0x9ed5, - 0x54: 0x9edf, - 0x55: 0x9ee4, - 0x56: 0x9ee7, - 0x57: 0x9eec, - 0x58: 0x9eed, - 0x59: 0x9eee, - 0x5a: 0x9ef0, - 0x5b: 0x9ef1, - 0x5c: 0x9ef2, - 0x5d: 0x9ef5, - }, - 0x4c: [94]uint16{ - 0x00: 0x9ef8, - 0x01: 0x9eff, - 0x02: 0x9f02, - 0x03: 0x9f03, - 0x04: 0x9f09, - 0x05: 0x9f0f, - 0x06: 0x9f10, - 0x07: 0x9f11, - 0x08: 0x9f12, - 0x09: 0x9f14, - 0x0a: 0x9f16, - 0x0b: 0x9f17, - 0x0c: 0x9f19, - 0x0d: 0x9f1a, - 0x0e: 0x9f1b, - 0x0f: 0x9f1f, - 0x10: 0x9f22, - 0x11: 0x9f26, - 0x12: 0x9f2a, - 0x13: 0x9f2b, - 0x14: 0x9f2f, - 0x15: 0x9f31, - 0x16: 0x9f32, - 0x17: 0x9f34, - 0x18: 0x9f37, - 0x19: 0x9f39, - 0x1a: 0x9f3a, - 0x1b: 0x9f3c, - 0x1c: 0x9f3d, - 0x1d: 0x9f3f, - 0x1e: 0x9f41, - 0x1f: 0x9f43, - 0x20: 0x9f44, - 0x21: 0x9f45, - 0x22: 0x9f46, - 0x23: 0x9f47, - 0x24: 0x9f53, - 0x25: 0x9f55, - 0x26: 0x9f56, - 0x27: 0x9f57, - 0x28: 0x9f58, - 0x29: 0x9f5a, - 0x2a: 0x9f5d, - 0x2b: 0x9f5e, - 0x2c: 0x9f68, - 0x2d: 0x9f69, - 0x2e: 0x9f6d, - 0x2f: 0x9f6e, - 0x30: 0x9f6f, - 0x31: 0x9f70, - 0x32: 0x9f71, - 0x33: 0x9f73, - 0x34: 0x9f75, - 0x35: 0x9f7a, - 0x36: 0x9f7d, - 0x37: 0x9f8f, - 0x38: 0x9f90, - 0x39: 0x9f91, - 0x3a: 0x9f92, - 0x3b: 0x9f94, - 0x3c: 0x9f96, - 0x3d: 0x9f97, - 0x3e: 0x9f9e, - 0x3f: 0x9fa1, - 0x40: 0x9fa2, - 0x41: 0x9fa3, - 0x42: 0x9fa5, - }, - }, -} diff --git a/vendor/github.com/Tang-RoseChild/mahonia/kuten.go b/vendor/github.com/Tang-RoseChild/mahonia/kuten.go deleted file mode 100644 index 249296662..000000000 --- a/vendor/github.com/Tang-RoseChild/mahonia/kuten.go +++ /dev/null @@ -1,88 +0,0 @@ -package mahonia - -import ( - "sync" - "unicode/utf8" -) - -// A kutenTable holds the data for a double-byte character set, arranged by ku -// (区, zone) and ten (点, position). These can be converted to various actual -// encoding schemes. -type kutenTable struct { - // Data[ku][ten] is the unicode value for the character at that zone and - // position. - Data [94][94]uint16 - - // FromUnicode holds the ku and ten for each Unicode code point. - // It is not available until Reverse() has been called. - FromUnicode [][2]byte - - // once is used to synchronize the generation of FromUnicode. - once sync.Once -} - -// Reverse generates FromUnicode. -func (t *kutenTable) Reverse() { - t.once.Do(func() { - t.FromUnicode = make([][2]byte, 65536) - for ku := range t.Data { - for ten, unicode := range t.Data[ku] { - t.FromUnicode[unicode] = [2]byte{byte(ku), byte(ten)} - } - } - }) -} - -// DecodeLow decodes a character from an encoding that does not have the high -// bit set. -func (t *kutenTable) DecodeLow(p []byte) (c rune, size int, status Status) { - if len(p) < 2 { - return 0, 0, NO_ROOM - } - ku := p[0] - 0x21 - ten := p[1] - 0x21 - if ku > 93 || ten > 93 { - return utf8.RuneError, 1, INVALID_CHAR - } - u := t.Data[ku][ten] - if u == 0 { - return utf8.RuneError, 1, INVALID_CHAR - } - return rune(u), 2, SUCCESS -} - -// DecodeHigh decodes a character from an encoding that has the high bit set. -func (t *kutenTable) DecodeHigh(p []byte) (c rune, size int, status Status) { - if len(p) < 2 { - return 0, 0, NO_ROOM - } - ku := p[0] - 0xa1 - ten := p[1] - 0xa1 - if ku > 93 || ten > 93 { - return utf8.RuneError, 1, INVALID_CHAR - } - u := t.Data[ku][ten] - if u == 0 { - return utf8.RuneError, 1, INVALID_CHAR - } - return rune(u), 2, SUCCESS -} - -// EncodeHigh encodes a character in an encoding that has the high bit set. -func (t *kutenTable) EncodeHigh(p []byte, c rune) (size int, status Status) { - if len(p) < 2 { - return 0, NO_ROOM - } - if c > 0xffff { - p[0] = '?' - return 1, INVALID_CHAR - } - kuten := t.FromUnicode[c] - if kuten == [2]byte{0, 0} && c != rune(t.Data[0][0]) { - p[0] = '?' - return 1, INVALID_CHAR - } - p[0] = kuten[0] + 0xa1 - p[1] = kuten[1] + 0xa1 - return 2, SUCCESS -} diff --git a/vendor/github.com/Tang-RoseChild/mahonia/mbcs.go b/vendor/github.com/Tang-RoseChild/mahonia/mbcs.go deleted file mode 100644 index 306dd5de1..000000000 --- a/vendor/github.com/Tang-RoseChild/mahonia/mbcs.go +++ /dev/null @@ -1,92 +0,0 @@ -package mahonia - -// Generic converters for multibyte character sets. - -// An mbcsTrie contains the data to convert from the character set to Unicode. -// If a character would be encoded as "\x01\x02\x03", its unicode value would be found at t.children[1].children[2].children[3].rune -// children either is nil or has 256 elements. -type mbcsTrie struct { - // For leaf nodes, the Unicode character that is represented. - char rune - - // For non-leaf nodes, the trie to decode the remainder of the character. - children []mbcsTrie -} - -// A MBCSTable holds the data to convert to and from Unicode. -type MBCSTable struct { - toUnicode mbcsTrie - fromUnicode map[rune]string -} - -// AddCharacter adds a character to the table. rune is its Unicode code point, -// and bytes contains the bytes used to encode it in the character set. -func (table *MBCSTable) AddCharacter(c rune, bytes string) { - if table.fromUnicode == nil { - table.fromUnicode = make(map[rune]string) - } - - table.fromUnicode[c] = bytes - - trie := &table.toUnicode - for i := 0; i < len(bytes); i++ { - if trie.children == nil { - trie.children = make([]mbcsTrie, 256) - } - - b := bytes[i] - trie = &trie.children[b] - } - - trie.char = c -} - -func (table *MBCSTable) Decoder() Decoder { - return func(p []byte) (c rune, size int, status Status) { - if len(p) == 0 { - status = NO_ROOM - return - } - - if p[0] == 0 { - return 0, 1, SUCCESS - } - - trie := &table.toUnicode - for trie.char == 0 { - if trie.children == nil { - return 0xfffd, 1, INVALID_CHAR - } - if len(p) < size+1 { - return 0, 0, NO_ROOM - } - - trie = &trie.children[p[size]] - size++ - } - - c = trie.char - status = SUCCESS - return - } -} - -func (table *MBCSTable) Encoder() Encoder { - return func(p []byte, c rune) (size int, status Status) { - bytes := table.fromUnicode[c] - if bytes == "" { - if len(p) > 0 { - p[0] = '?' - return 1, INVALID_CHAR - } else { - return 0, NO_ROOM - } - } - - if len(p) < len(bytes) { - return 0, NO_ROOM - } - - return copy(p, bytes), SUCCESS - } -} diff --git a/vendor/github.com/Tang-RoseChild/mahonia/ms-jis-data.go b/vendor/github.com/Tang-RoseChild/mahonia/ms-jis-data.go deleted file mode 100644 index 2330884d7..000000000 --- a/vendor/github.com/Tang-RoseChild/mahonia/ms-jis-data.go +++ /dev/null @@ -1,7497 +0,0 @@ -package mahonia - -// msJISTable contains Microsoft's extended version of JIS X 0208. -var msJISTable = kutenTable{ - Data: [94][94]uint16{ - 0x00: [94]uint16{ - 0x00: 0x3000, - 0x01: 0x3001, - 0x02: 0x3002, - 0x03: 0xff0c, - 0x04: 0xff0e, - 0x05: 0x30fb, - 0x06: 0xff1a, - 0x07: 0xff1b, - 0x08: 0xff1f, - 0x09: 0xff01, - 0x0a: 0x309b, - 0x0b: 0x309c, - 0x0c: 0x00b4, - 0x0d: 0xff40, - 0x0e: 0x00a8, - 0x0f: 0xff3e, - 0x10: 0xffe3, - 0x11: 0xff3f, - 0x12: 0x30fd, - 0x13: 0x30fe, - 0x14: 0x309d, - 0x15: 0x309e, - 0x16: 0x3003, - 0x17: 0x4edd, - 0x18: 0x3005, - 0x19: 0x3006, - 0x1a: 0x3007, - 0x1b: 0x30fc, - 0x1c: 0x2015, - 0x1d: 0x2010, - 0x1e: 0xff0f, - 0x1f: 0xff3c, - 0x20: 0xff5e, - 0x21: 0x2225, - 0x22: 0xff5c, - 0x23: 0x2026, - 0x24: 0x2025, - 0x25: 0x2018, - 0x26: 0x2019, - 0x27: 0x201c, - 0x28: 0x201d, - 0x29: 0xff08, - 0x2a: 0xff09, - 0x2b: 0x3014, - 0x2c: 0x3015, - 0x2d: 0xff3b, - 0x2e: 0xff3d, - 0x2f: 0xff5b, - 0x30: 0xff5d, - 0x31: 0x3008, - 0x32: 0x3009, - 0x33: 0x300a, - 0x34: 0x300b, - 0x35: 0x300c, - 0x36: 0x300d, - 0x37: 0x300e, - 0x38: 0x300f, - 0x39: 0x3010, - 0x3a: 0x3011, - 0x3b: 0xff0b, - 0x3c: 0xff0d, - 0x3d: 0x00b1, - 0x3e: 0x00d7, - 0x3f: 0x00f7, - 0x40: 0xff1d, - 0x41: 0x2260, - 0x42: 0xff1c, - 0x43: 0xff1e, - 0x44: 0x2266, - 0x45: 0x2267, - 0x46: 0x221e, - 0x47: 0x2234, - 0x48: 0x2642, - 0x49: 0x2640, - 0x4a: 0x00b0, - 0x4b: 0x2032, - 0x4c: 0x2033, - 0x4d: 0x2103, - 0x4e: 0xffe5, - 0x4f: 0xff04, - 0x50: 0xffe0, - 0x51: 0xffe1, - 0x52: 0xff05, - 0x53: 0xff03, - 0x54: 0xff06, - 0x55: 0xff0a, - 0x56: 0xff20, - 0x57: 0x00a7, - 0x58: 0x2606, - 0x59: 0x2605, - 0x5a: 0x25cb, - 0x5b: 0x25cf, - 0x5c: 0x25ce, - 0x5d: 0x25c7, - }, - 0x01: [94]uint16{ - 0x00: 0x25c6, - 0x01: 0x25a1, - 0x02: 0x25a0, - 0x03: 0x25b3, - 0x04: 0x25b2, - 0x05: 0x25bd, - 0x06: 0x25bc, - 0x07: 0x203b, - 0x08: 0x3012, - 0x09: 0x2192, - 0x0a: 0x2190, - 0x0b: 0x2191, - 0x0c: 0x2193, - 0x0d: 0x3013, - 0x19: 0x2208, - 0x1a: 0x220b, - 0x1b: 0x2286, - 0x1c: 0x2287, - 0x1d: 0x2282, - 0x1e: 0x2283, - 0x1f: 0x222a, - 0x20: 0x2229, - 0x29: 0x2227, - 0x2a: 0x2228, - 0x2b: 0xffe2, - 0x2c: 0x21d2, - 0x2d: 0x21d4, - 0x2e: 0x2200, - 0x2f: 0x2203, - 0x3b: 0x2220, - 0x3c: 0x22a5, - 0x3d: 0x2312, - 0x3e: 0x2202, - 0x3f: 0x2207, - 0x40: 0x2261, - 0x41: 0x2252, - 0x42: 0x226a, - 0x43: 0x226b, - 0x44: 0x221a, - 0x45: 0x223d, - 0x46: 0x221d, - 0x47: 0x2235, - 0x48: 0x222b, - 0x49: 0x222c, - 0x51: 0x212b, - 0x52: 0x2030, - 0x53: 0x266f, - 0x54: 0x266d, - 0x55: 0x266a, - 0x56: 0x2020, - 0x57: 0x2021, - 0x58: 0x00b6, - 0x5d: 0x25ef, - }, - 0x02: [94]uint16{ - 0x0f: 0xff10, - 0x10: 0xff11, - 0x11: 0xff12, - 0x12: 0xff13, - 0x13: 0xff14, - 0x14: 0xff15, - 0x15: 0xff16, - 0x16: 0xff17, - 0x17: 0xff18, - 0x18: 0xff19, - 0x20: 0xff21, - 0x21: 0xff22, - 0x22: 0xff23, - 0x23: 0xff24, - 0x24: 0xff25, - 0x25: 0xff26, - 0x26: 0xff27, - 0x27: 0xff28, - 0x28: 0xff29, - 0x29: 0xff2a, - 0x2a: 0xff2b, - 0x2b: 0xff2c, - 0x2c: 0xff2d, - 0x2d: 0xff2e, - 0x2e: 0xff2f, - 0x2f: 0xff30, - 0x30: 0xff31, - 0x31: 0xff32, - 0x32: 0xff33, - 0x33: 0xff34, - 0x34: 0xff35, - 0x35: 0xff36, - 0x36: 0xff37, - 0x37: 0xff38, - 0x38: 0xff39, - 0x39: 0xff3a, - 0x40: 0xff41, - 0x41: 0xff42, - 0x42: 0xff43, - 0x43: 0xff44, - 0x44: 0xff45, - 0x45: 0xff46, - 0x46: 0xff47, - 0x47: 0xff48, - 0x48: 0xff49, - 0x49: 0xff4a, - 0x4a: 0xff4b, - 0x4b: 0xff4c, - 0x4c: 0xff4d, - 0x4d: 0xff4e, - 0x4e: 0xff4f, - 0x4f: 0xff50, - 0x50: 0xff51, - 0x51: 0xff52, - 0x52: 0xff53, - 0x53: 0xff54, - 0x54: 0xff55, - 0x55: 0xff56, - 0x56: 0xff57, - 0x57: 0xff58, - 0x58: 0xff59, - 0x59: 0xff5a, - }, - 0x03: [94]uint16{ - 0x00: 0x3041, - 0x01: 0x3042, - 0x02: 0x3043, - 0x03: 0x3044, - 0x04: 0x3045, - 0x05: 0x3046, - 0x06: 0x3047, - 0x07: 0x3048, - 0x08: 0x3049, - 0x09: 0x304a, - 0x0a: 0x304b, - 0x0b: 0x304c, - 0x0c: 0x304d, - 0x0d: 0x304e, - 0x0e: 0x304f, - 0x0f: 0x3050, - 0x10: 0x3051, - 0x11: 0x3052, - 0x12: 0x3053, - 0x13: 0x3054, - 0x14: 0x3055, - 0x15: 0x3056, - 0x16: 0x3057, - 0x17: 0x3058, - 0x18: 0x3059, - 0x19: 0x305a, - 0x1a: 0x305b, - 0x1b: 0x305c, - 0x1c: 0x305d, - 0x1d: 0x305e, - 0x1e: 0x305f, - 0x1f: 0x3060, - 0x20: 0x3061, - 0x21: 0x3062, - 0x22: 0x3063, - 0x23: 0x3064, - 0x24: 0x3065, - 0x25: 0x3066, - 0x26: 0x3067, - 0x27: 0x3068, - 0x28: 0x3069, - 0x29: 0x306a, - 0x2a: 0x306b, - 0x2b: 0x306c, - 0x2c: 0x306d, - 0x2d: 0x306e, - 0x2e: 0x306f, - 0x2f: 0x3070, - 0x30: 0x3071, - 0x31: 0x3072, - 0x32: 0x3073, - 0x33: 0x3074, - 0x34: 0x3075, - 0x35: 0x3076, - 0x36: 0x3077, - 0x37: 0x3078, - 0x38: 0x3079, - 0x39: 0x307a, - 0x3a: 0x307b, - 0x3b: 0x307c, - 0x3c: 0x307d, - 0x3d: 0x307e, - 0x3e: 0x307f, - 0x3f: 0x3080, - 0x40: 0x3081, - 0x41: 0x3082, - 0x42: 0x3083, - 0x43: 0x3084, - 0x44: 0x3085, - 0x45: 0x3086, - 0x46: 0x3087, - 0x47: 0x3088, - 0x48: 0x3089, - 0x49: 0x308a, - 0x4a: 0x308b, - 0x4b: 0x308c, - 0x4c: 0x308d, - 0x4d: 0x308e, - 0x4e: 0x308f, - 0x4f: 0x3090, - 0x50: 0x3091, - 0x51: 0x3092, - 0x52: 0x3093, - }, - 0x04: [94]uint16{ - 0x00: 0x30a1, - 0x01: 0x30a2, - 0x02: 0x30a3, - 0x03: 0x30a4, - 0x04: 0x30a5, - 0x05: 0x30a6, - 0x06: 0x30a7, - 0x07: 0x30a8, - 0x08: 0x30a9, - 0x09: 0x30aa, - 0x0a: 0x30ab, - 0x0b: 0x30ac, - 0x0c: 0x30ad, - 0x0d: 0x30ae, - 0x0e: 0x30af, - 0x0f: 0x30b0, - 0x10: 0x30b1, - 0x11: 0x30b2, - 0x12: 0x30b3, - 0x13: 0x30b4, - 0x14: 0x30b5, - 0x15: 0x30b6, - 0x16: 0x30b7, - 0x17: 0x30b8, - 0x18: 0x30b9, - 0x19: 0x30ba, - 0x1a: 0x30bb, - 0x1b: 0x30bc, - 0x1c: 0x30bd, - 0x1d: 0x30be, - 0x1e: 0x30bf, - 0x1f: 0x30c0, - 0x20: 0x30c1, - 0x21: 0x30c2, - 0x22: 0x30c3, - 0x23: 0x30c4, - 0x24: 0x30c5, - 0x25: 0x30c6, - 0x26: 0x30c7, - 0x27: 0x30c8, - 0x28: 0x30c9, - 0x29: 0x30ca, - 0x2a: 0x30cb, - 0x2b: 0x30cc, - 0x2c: 0x30cd, - 0x2d: 0x30ce, - 0x2e: 0x30cf, - 0x2f: 0x30d0, - 0x30: 0x30d1, - 0x31: 0x30d2, - 0x32: 0x30d3, - 0x33: 0x30d4, - 0x34: 0x30d5, - 0x35: 0x30d6, - 0x36: 0x30d7, - 0x37: 0x30d8, - 0x38: 0x30d9, - 0x39: 0x30da, - 0x3a: 0x30db, - 0x3b: 0x30dc, - 0x3c: 0x30dd, - 0x3d: 0x30de, - 0x3e: 0x30df, - 0x3f: 0x30e0, - 0x40: 0x30e1, - 0x41: 0x30e2, - 0x42: 0x30e3, - 0x43: 0x30e4, - 0x44: 0x30e5, - 0x45: 0x30e6, - 0x46: 0x30e7, - 0x47: 0x30e8, - 0x48: 0x30e9, - 0x49: 0x30ea, - 0x4a: 0x30eb, - 0x4b: 0x30ec, - 0x4c: 0x30ed, - 0x4d: 0x30ee, - 0x4e: 0x30ef, - 0x4f: 0x30f0, - 0x50: 0x30f1, - 0x51: 0x30f2, - 0x52: 0x30f3, - 0x53: 0x30f4, - 0x54: 0x30f5, - 0x55: 0x30f6, - }, - 0x05: [94]uint16{ - 0x00: 0x0391, - 0x01: 0x0392, - 0x02: 0x0393, - 0x03: 0x0394, - 0x04: 0x0395, - 0x05: 0x0396, - 0x06: 0x0397, - 0x07: 0x0398, - 0x08: 0x0399, - 0x09: 0x039a, - 0x0a: 0x039b, - 0x0b: 0x039c, - 0x0c: 0x039d, - 0x0d: 0x039e, - 0x0e: 0x039f, - 0x0f: 0x03a0, - 0x10: 0x03a1, - 0x11: 0x03a3, - 0x12: 0x03a4, - 0x13: 0x03a5, - 0x14: 0x03a6, - 0x15: 0x03a7, - 0x16: 0x03a8, - 0x17: 0x03a9, - 0x20: 0x03b1, - 0x21: 0x03b2, - 0x22: 0x03b3, - 0x23: 0x03b4, - 0x24: 0x03b5, - 0x25: 0x03b6, - 0x26: 0x03b7, - 0x27: 0x03b8, - 0x28: 0x03b9, - 0x29: 0x03ba, - 0x2a: 0x03bb, - 0x2b: 0x03bc, - 0x2c: 0x03bd, - 0x2d: 0x03be, - 0x2e: 0x03bf, - 0x2f: 0x03c0, - 0x30: 0x03c1, - 0x31: 0x03c3, - 0x32: 0x03c4, - 0x33: 0x03c5, - 0x34: 0x03c6, - 0x35: 0x03c7, - 0x36: 0x03c8, - 0x37: 0x03c9, - }, - 0x06: [94]uint16{ - 0x00: 0x0410, - 0x01: 0x0411, - 0x02: 0x0412, - 0x03: 0x0413, - 0x04: 0x0414, - 0x05: 0x0415, - 0x06: 0x0401, - 0x07: 0x0416, - 0x08: 0x0417, - 0x09: 0x0418, - 0x0a: 0x0419, - 0x0b: 0x041a, - 0x0c: 0x041b, - 0x0d: 0x041c, - 0x0e: 0x041d, - 0x0f: 0x041e, - 0x10: 0x041f, - 0x11: 0x0420, - 0x12: 0x0421, - 0x13: 0x0422, - 0x14: 0x0423, - 0x15: 0x0424, - 0x16: 0x0425, - 0x17: 0x0426, - 0x18: 0x0427, - 0x19: 0x0428, - 0x1a: 0x0429, - 0x1b: 0x042a, - 0x1c: 0x042b, - 0x1d: 0x042c, - 0x1e: 0x042d, - 0x1f: 0x042e, - 0x20: 0x042f, - 0x30: 0x0430, - 0x31: 0x0431, - 0x32: 0x0432, - 0x33: 0x0433, - 0x34: 0x0434, - 0x35: 0x0435, - 0x36: 0x0451, - 0x37: 0x0436, - 0x38: 0x0437, - 0x39: 0x0438, - 0x3a: 0x0439, - 0x3b: 0x043a, - 0x3c: 0x043b, - 0x3d: 0x043c, - 0x3e: 0x043d, - 0x3f: 0x043e, - 0x40: 0x043f, - 0x41: 0x0440, - 0x42: 0x0441, - 0x43: 0x0442, - 0x44: 0x0443, - 0x45: 0x0444, - 0x46: 0x0445, - 0x47: 0x0446, - 0x48: 0x0447, - 0x49: 0x0448, - 0x4a: 0x0449, - 0x4b: 0x044a, - 0x4c: 0x044b, - 0x4d: 0x044c, - 0x4e: 0x044d, - 0x4f: 0x044e, - 0x50: 0x044f, - }, - 0x07: [94]uint16{ - 0x00: 0x2500, - 0x01: 0x2502, - 0x02: 0x250c, - 0x03: 0x2510, - 0x04: 0x2518, - 0x05: 0x2514, - 0x06: 0x251c, - 0x07: 0x252c, - 0x08: 0x2524, - 0x09: 0x2534, - 0x0a: 0x253c, - 0x0b: 0x2501, - 0x0c: 0x2503, - 0x0d: 0x250f, - 0x0e: 0x2513, - 0x0f: 0x251b, - 0x10: 0x2517, - 0x11: 0x2523, - 0x12: 0x2533, - 0x13: 0x252b, - 0x14: 0x253b, - 0x15: 0x254b, - 0x16: 0x2520, - 0x17: 0x252f, - 0x18: 0x2528, - 0x19: 0x2537, - 0x1a: 0x253f, - 0x1b: 0x251d, - 0x1c: 0x2530, - 0x1d: 0x2525, - 0x1e: 0x2538, - 0x1f: 0x2542, - }, - 0x0c: [94]uint16{ - 0x00: 0x2460, - 0x01: 0x2461, - 0x02: 0x2462, - 0x03: 0x2463, - 0x04: 0x2464, - 0x05: 0x2465, - 0x06: 0x2466, - 0x07: 0x2467, - 0x08: 0x2468, - 0x09: 0x2469, - 0x0a: 0x246a, - 0x0b: 0x246b, - 0x0c: 0x246c, - 0x0d: 0x246d, - 0x0e: 0x246e, - 0x0f: 0x246f, - 0x10: 0x2470, - 0x11: 0x2471, - 0x12: 0x2472, - 0x13: 0x2473, - 0x14: 0x2160, - 0x15: 0x2161, - 0x16: 0x2162, - 0x17: 0x2163, - 0x18: 0x2164, - 0x19: 0x2165, - 0x1a: 0x2166, - 0x1b: 0x2167, - 0x1c: 0x2168, - 0x1d: 0x2169, - 0x1f: 0x3349, - 0x20: 0x3314, - 0x21: 0x3322, - 0x22: 0x334d, - 0x23: 0x3318, - 0x24: 0x3327, - 0x25: 0x3303, - 0x26: 0x3336, - 0x27: 0x3351, - 0x28: 0x3357, - 0x29: 0x330d, - 0x2a: 0x3326, - 0x2b: 0x3323, - 0x2c: 0x332b, - 0x2d: 0x334a, - 0x2e: 0x333b, - 0x2f: 0x339c, - 0x30: 0x339d, - 0x31: 0x339e, - 0x32: 0x338e, - 0x33: 0x338f, - 0x34: 0x33c4, - 0x35: 0x33a1, - 0x3e: 0x337b, - 0x3f: 0x301d, - 0x40: 0x301f, - 0x41: 0x2116, - 0x42: 0x33cd, - 0x43: 0x2121, - 0x44: 0x32a4, - 0x45: 0x32a5, - 0x46: 0x32a6, - 0x47: 0x32a7, - 0x48: 0x32a8, - 0x49: 0x3231, - 0x4a: 0x3232, - 0x4b: 0x3239, - 0x4c: 0x337e, - 0x4d: 0x337d, - 0x4e: 0x337c, - 0x52: 0x222e, - 0x53: 0x2211, - 0x57: 0x221f, - 0x58: 0x22bf, - }, - 0x0f: [94]uint16{ - 0x00: 0x4e9c, - 0x01: 0x5516, - 0x02: 0x5a03, - 0x03: 0x963f, - 0x04: 0x54c0, - 0x05: 0x611b, - 0x06: 0x6328, - 0x07: 0x59f6, - 0x08: 0x9022, - 0x09: 0x8475, - 0x0a: 0x831c, - 0x0b: 0x7a50, - 0x0c: 0x60aa, - 0x0d: 0x63e1, - 0x0e: 0x6e25, - 0x0f: 0x65ed, - 0x10: 0x8466, - 0x11: 0x82a6, - 0x12: 0x9bf5, - 0x13: 0x6893, - 0x14: 0x5727, - 0x15: 0x65a1, - 0x16: 0x6271, - 0x17: 0x5b9b, - 0x18: 0x59d0, - 0x19: 0x867b, - 0x1a: 0x98f4, - 0x1b: 0x7d62, - 0x1c: 0x7dbe, - 0x1d: 0x9b8e, - 0x1e: 0x6216, - 0x1f: 0x7c9f, - 0x20: 0x88b7, - 0x21: 0x5b89, - 0x22: 0x5eb5, - 0x23: 0x6309, - 0x24: 0x6697, - 0x25: 0x6848, - 0x26: 0x95c7, - 0x27: 0x978d, - 0x28: 0x674f, - 0x29: 0x4ee5, - 0x2a: 0x4f0a, - 0x2b: 0x4f4d, - 0x2c: 0x4f9d, - 0x2d: 0x5049, - 0x2e: 0x56f2, - 0x2f: 0x5937, - 0x30: 0x59d4, - 0x31: 0x5a01, - 0x32: 0x5c09, - 0x33: 0x60df, - 0x34: 0x610f, - 0x35: 0x6170, - 0x36: 0x6613, - 0x37: 0x6905, - 0x38: 0x70ba, - 0x39: 0x754f, - 0x3a: 0x7570, - 0x3b: 0x79fb, - 0x3c: 0x7dad, - 0x3d: 0x7def, - 0x3e: 0x80c3, - 0x3f: 0x840e, - 0x40: 0x8863, - 0x41: 0x8b02, - 0x42: 0x9055, - 0x43: 0x907a, - 0x44: 0x533b, - 0x45: 0x4e95, - 0x46: 0x4ea5, - 0x47: 0x57df, - 0x48: 0x80b2, - 0x49: 0x90c1, - 0x4a: 0x78ef, - 0x4b: 0x4e00, - 0x4c: 0x58f1, - 0x4d: 0x6ea2, - 0x4e: 0x9038, - 0x4f: 0x7a32, - 0x50: 0x8328, - 0x51: 0x828b, - 0x52: 0x9c2f, - 0x53: 0x5141, - 0x54: 0x5370, - 0x55: 0x54bd, - 0x56: 0x54e1, - 0x57: 0x56e0, - 0x58: 0x59fb, - 0x59: 0x5f15, - 0x5a: 0x98f2, - 0x5b: 0x6deb, - 0x5c: 0x80e4, - 0x5d: 0x852d, - }, - 0x10: [94]uint16{ - 0x00: 0x9662, - 0x01: 0x9670, - 0x02: 0x96a0, - 0x03: 0x97fb, - 0x04: 0x540b, - 0x05: 0x53f3, - 0x06: 0x5b87, - 0x07: 0x70cf, - 0x08: 0x7fbd, - 0x09: 0x8fc2, - 0x0a: 0x96e8, - 0x0b: 0x536f, - 0x0c: 0x9d5c, - 0x0d: 0x7aba, - 0x0e: 0x4e11, - 0x0f: 0x7893, - 0x10: 0x81fc, - 0x11: 0x6e26, - 0x12: 0x5618, - 0x13: 0x5504, - 0x14: 0x6b1d, - 0x15: 0x851a, - 0x16: 0x9c3b, - 0x17: 0x59e5, - 0x18: 0x53a9, - 0x19: 0x6d66, - 0x1a: 0x74dc, - 0x1b: 0x958f, - 0x1c: 0x5642, - 0x1d: 0x4e91, - 0x1e: 0x904b, - 0x1f: 0x96f2, - 0x20: 0x834f, - 0x21: 0x990c, - 0x22: 0x53e1, - 0x23: 0x55b6, - 0x24: 0x5b30, - 0x25: 0x5f71, - 0x26: 0x6620, - 0x27: 0x66f3, - 0x28: 0x6804, - 0x29: 0x6c38, - 0x2a: 0x6cf3, - 0x2b: 0x6d29, - 0x2c: 0x745b, - 0x2d: 0x76c8, - 0x2e: 0x7a4e, - 0x2f: 0x9834, - 0x30: 0x82f1, - 0x31: 0x885b, - 0x32: 0x8a60, - 0x33: 0x92ed, - 0x34: 0x6db2, - 0x35: 0x75ab, - 0x36: 0x76ca, - 0x37: 0x99c5, - 0x38: 0x60a6, - 0x39: 0x8b01, - 0x3a: 0x8d8a, - 0x3b: 0x95b2, - 0x3c: 0x698e, - 0x3d: 0x53ad, - 0x3e: 0x5186, - 0x3f: 0x5712, - 0x40: 0x5830, - 0x41: 0x5944, - 0x42: 0x5bb4, - 0x43: 0x5ef6, - 0x44: 0x6028, - 0x45: 0x63a9, - 0x46: 0x63f4, - 0x47: 0x6cbf, - 0x48: 0x6f14, - 0x49: 0x708e, - 0x4a: 0x7114, - 0x4b: 0x7159, - 0x4c: 0x71d5, - 0x4d: 0x733f, - 0x4e: 0x7e01, - 0x4f: 0x8276, - 0x50: 0x82d1, - 0x51: 0x8597, - 0x52: 0x9060, - 0x53: 0x925b, - 0x54: 0x9d1b, - 0x55: 0x5869, - 0x56: 0x65bc, - 0x57: 0x6c5a, - 0x58: 0x7525, - 0x59: 0x51f9, - 0x5a: 0x592e, - 0x5b: 0x5965, - 0x5c: 0x5f80, - 0x5d: 0x5fdc, - }, - 0x11: [94]uint16{ - 0x00: 0x62bc, - 0x01: 0x65fa, - 0x02: 0x6a2a, - 0x03: 0x6b27, - 0x04: 0x6bb4, - 0x05: 0x738b, - 0x06: 0x7fc1, - 0x07: 0x8956, - 0x08: 0x9d2c, - 0x09: 0x9d0e, - 0x0a: 0x9ec4, - 0x0b: 0x5ca1, - 0x0c: 0x6c96, - 0x0d: 0x837b, - 0x0e: 0x5104, - 0x0f: 0x5c4b, - 0x10: 0x61b6, - 0x11: 0x81c6, - 0x12: 0x6876, - 0x13: 0x7261, - 0x14: 0x4e59, - 0x15: 0x4ffa, - 0x16: 0x5378, - 0x17: 0x6069, - 0x18: 0x6e29, - 0x19: 0x7a4f, - 0x1a: 0x97f3, - 0x1b: 0x4e0b, - 0x1c: 0x5316, - 0x1d: 0x4eee, - 0x1e: 0x4f55, - 0x1f: 0x4f3d, - 0x20: 0x4fa1, - 0x21: 0x4f73, - 0x22: 0x52a0, - 0x23: 0x53ef, - 0x24: 0x5609, - 0x25: 0x590f, - 0x26: 0x5ac1, - 0x27: 0x5bb6, - 0x28: 0x5be1, - 0x29: 0x79d1, - 0x2a: 0x6687, - 0x2b: 0x679c, - 0x2c: 0x67b6, - 0x2d: 0x6b4c, - 0x2e: 0x6cb3, - 0x2f: 0x706b, - 0x30: 0x73c2, - 0x31: 0x798d, - 0x32: 0x79be, - 0x33: 0x7a3c, - 0x34: 0x7b87, - 0x35: 0x82b1, - 0x36: 0x82db, - 0x37: 0x8304, - 0x38: 0x8377, - 0x39: 0x83ef, - 0x3a: 0x83d3, - 0x3b: 0x8766, - 0x3c: 0x8ab2, - 0x3d: 0x5629, - 0x3e: 0x8ca8, - 0x3f: 0x8fe6, - 0x40: 0x904e, - 0x41: 0x971e, - 0x42: 0x868a, - 0x43: 0x4fc4, - 0x44: 0x5ce8, - 0x45: 0x6211, - 0x46: 0x7259, - 0x47: 0x753b, - 0x48: 0x81e5, - 0x49: 0x82bd, - 0x4a: 0x86fe, - 0x4b: 0x8cc0, - 0x4c: 0x96c5, - 0x4d: 0x9913, - 0x4e: 0x99d5, - 0x4f: 0x4ecb, - 0x50: 0x4f1a, - 0x51: 0x89e3, - 0x52: 0x56de, - 0x53: 0x584a, - 0x54: 0x58ca, - 0x55: 0x5efb, - 0x56: 0x5feb, - 0x57: 0x602a, - 0x58: 0x6094, - 0x59: 0x6062, - 0x5a: 0x61d0, - 0x5b: 0x6212, - 0x5c: 0x62d0, - 0x5d: 0x6539, - }, - 0x12: [94]uint16{ - 0x00: 0x9b41, - 0x01: 0x6666, - 0x02: 0x68b0, - 0x03: 0x6d77, - 0x04: 0x7070, - 0x05: 0x754c, - 0x06: 0x7686, - 0x07: 0x7d75, - 0x08: 0x82a5, - 0x09: 0x87f9, - 0x0a: 0x958b, - 0x0b: 0x968e, - 0x0c: 0x8c9d, - 0x0d: 0x51f1, - 0x0e: 0x52be, - 0x0f: 0x5916, - 0x10: 0x54b3, - 0x11: 0x5bb3, - 0x12: 0x5d16, - 0x13: 0x6168, - 0x14: 0x6982, - 0x15: 0x6daf, - 0x16: 0x788d, - 0x17: 0x84cb, - 0x18: 0x8857, - 0x19: 0x8a72, - 0x1a: 0x93a7, - 0x1b: 0x9ab8, - 0x1c: 0x6d6c, - 0x1d: 0x99a8, - 0x1e: 0x86d9, - 0x1f: 0x57a3, - 0x20: 0x67ff, - 0x21: 0x86ce, - 0x22: 0x920e, - 0x23: 0x5283, - 0x24: 0x5687, - 0x25: 0x5404, - 0x26: 0x5ed3, - 0x27: 0x62e1, - 0x28: 0x64b9, - 0x29: 0x683c, - 0x2a: 0x6838, - 0x2b: 0x6bbb, - 0x2c: 0x7372, - 0x2d: 0x78ba, - 0x2e: 0x7a6b, - 0x2f: 0x899a, - 0x30: 0x89d2, - 0x31: 0x8d6b, - 0x32: 0x8f03, - 0x33: 0x90ed, - 0x34: 0x95a3, - 0x35: 0x9694, - 0x36: 0x9769, - 0x37: 0x5b66, - 0x38: 0x5cb3, - 0x39: 0x697d, - 0x3a: 0x984d, - 0x3b: 0x984e, - 0x3c: 0x639b, - 0x3d: 0x7b20, - 0x3e: 0x6a2b, - 0x3f: 0x6a7f, - 0x40: 0x68b6, - 0x41: 0x9c0d, - 0x42: 0x6f5f, - 0x43: 0x5272, - 0x44: 0x559d, - 0x45: 0x6070, - 0x46: 0x62ec, - 0x47: 0x6d3b, - 0x48: 0x6e07, - 0x49: 0x6ed1, - 0x4a: 0x845b, - 0x4b: 0x8910, - 0x4c: 0x8f44, - 0x4d: 0x4e14, - 0x4e: 0x9c39, - 0x4f: 0x53f6, - 0x50: 0x691b, - 0x51: 0x6a3a, - 0x52: 0x9784, - 0x53: 0x682a, - 0x54: 0x515c, - 0x55: 0x7ac3, - 0x56: 0x84b2, - 0x57: 0x91dc, - 0x58: 0x938c, - 0x59: 0x565b, - 0x5a: 0x9d28, - 0x5b: 0x6822, - 0x5c: 0x8305, - 0x5d: 0x8431, - }, - 0x13: [94]uint16{ - 0x00: 0x7ca5, - 0x01: 0x5208, - 0x02: 0x82c5, - 0x03: 0x74e6, - 0x04: 0x4e7e, - 0x05: 0x4f83, - 0x06: 0x51a0, - 0x07: 0x5bd2, - 0x08: 0x520a, - 0x09: 0x52d8, - 0x0a: 0x52e7, - 0x0b: 0x5dfb, - 0x0c: 0x559a, - 0x0d: 0x582a, - 0x0e: 0x59e6, - 0x0f: 0x5b8c, - 0x10: 0x5b98, - 0x11: 0x5bdb, - 0x12: 0x5e72, - 0x13: 0x5e79, - 0x14: 0x60a3, - 0x15: 0x611f, - 0x16: 0x6163, - 0x17: 0x61be, - 0x18: 0x63db, - 0x19: 0x6562, - 0x1a: 0x67d1, - 0x1b: 0x6853, - 0x1c: 0x68fa, - 0x1d: 0x6b3e, - 0x1e: 0x6b53, - 0x1f: 0x6c57, - 0x20: 0x6f22, - 0x21: 0x6f97, - 0x22: 0x6f45, - 0x23: 0x74b0, - 0x24: 0x7518, - 0x25: 0x76e3, - 0x26: 0x770b, - 0x27: 0x7aff, - 0x28: 0x7ba1, - 0x29: 0x7c21, - 0x2a: 0x7de9, - 0x2b: 0x7f36, - 0x2c: 0x7ff0, - 0x2d: 0x809d, - 0x2e: 0x8266, - 0x2f: 0x839e, - 0x30: 0x89b3, - 0x31: 0x8acc, - 0x32: 0x8cab, - 0x33: 0x9084, - 0x34: 0x9451, - 0x35: 0x9593, - 0x36: 0x9591, - 0x37: 0x95a2, - 0x38: 0x9665, - 0x39: 0x97d3, - 0x3a: 0x9928, - 0x3b: 0x8218, - 0x3c: 0x4e38, - 0x3d: 0x542b, - 0x3e: 0x5cb8, - 0x3f: 0x5dcc, - 0x40: 0x73a9, - 0x41: 0x764c, - 0x42: 0x773c, - 0x43: 0x5ca9, - 0x44: 0x7feb, - 0x45: 0x8d0b, - 0x46: 0x96c1, - 0x47: 0x9811, - 0x48: 0x9854, - 0x49: 0x9858, - 0x4a: 0x4f01, - 0x4b: 0x4f0e, - 0x4c: 0x5371, - 0x4d: 0x559c, - 0x4e: 0x5668, - 0x4f: 0x57fa, - 0x50: 0x5947, - 0x51: 0x5b09, - 0x52: 0x5bc4, - 0x53: 0x5c90, - 0x54: 0x5e0c, - 0x55: 0x5e7e, - 0x56: 0x5fcc, - 0x57: 0x63ee, - 0x58: 0x673a, - 0x59: 0x65d7, - 0x5a: 0x65e2, - 0x5b: 0x671f, - 0x5c: 0x68cb, - 0x5d: 0x68c4, - }, - 0x14: [94]uint16{ - 0x00: 0x6a5f, - 0x01: 0x5e30, - 0x02: 0x6bc5, - 0x03: 0x6c17, - 0x04: 0x6c7d, - 0x05: 0x757f, - 0x06: 0x7948, - 0x07: 0x5b63, - 0x08: 0x7a00, - 0x09: 0x7d00, - 0x0a: 0x5fbd, - 0x0b: 0x898f, - 0x0c: 0x8a18, - 0x0d: 0x8cb4, - 0x0e: 0x8d77, - 0x0f: 0x8ecc, - 0x10: 0x8f1d, - 0x11: 0x98e2, - 0x12: 0x9a0e, - 0x13: 0x9b3c, - 0x14: 0x4e80, - 0x15: 0x507d, - 0x16: 0x5100, - 0x17: 0x5993, - 0x18: 0x5b9c, - 0x19: 0x622f, - 0x1a: 0x6280, - 0x1b: 0x64ec, - 0x1c: 0x6b3a, - 0x1d: 0x72a0, - 0x1e: 0x7591, - 0x1f: 0x7947, - 0x20: 0x7fa9, - 0x21: 0x87fb, - 0x22: 0x8abc, - 0x23: 0x8b70, - 0x24: 0x63ac, - 0x25: 0x83ca, - 0x26: 0x97a0, - 0x27: 0x5409, - 0x28: 0x5403, - 0x29: 0x55ab, - 0x2a: 0x6854, - 0x2b: 0x6a58, - 0x2c: 0x8a70, - 0x2d: 0x7827, - 0x2e: 0x6775, - 0x2f: 0x9ecd, - 0x30: 0x5374, - 0x31: 0x5ba2, - 0x32: 0x811a, - 0x33: 0x8650, - 0x34: 0x9006, - 0x35: 0x4e18, - 0x36: 0x4e45, - 0x37: 0x4ec7, - 0x38: 0x4f11, - 0x39: 0x53ca, - 0x3a: 0x5438, - 0x3b: 0x5bae, - 0x3c: 0x5f13, - 0x3d: 0x6025, - 0x3e: 0x6551, - 0x3f: 0x673d, - 0x40: 0x6c42, - 0x41: 0x6c72, - 0x42: 0x6ce3, - 0x43: 0x7078, - 0x44: 0x7403, - 0x45: 0x7a76, - 0x46: 0x7aae, - 0x47: 0x7b08, - 0x48: 0x7d1a, - 0x49: 0x7cfe, - 0x4a: 0x7d66, - 0x4b: 0x65e7, - 0x4c: 0x725b, - 0x4d: 0x53bb, - 0x4e: 0x5c45, - 0x4f: 0x5de8, - 0x50: 0x62d2, - 0x51: 0x62e0, - 0x52: 0x6319, - 0x53: 0x6e20, - 0x54: 0x865a, - 0x55: 0x8a31, - 0x56: 0x8ddd, - 0x57: 0x92f8, - 0x58: 0x6f01, - 0x59: 0x79a6, - 0x5a: 0x9b5a, - 0x5b: 0x4ea8, - 0x5c: 0x4eab, - 0x5d: 0x4eac, - }, - 0x15: [94]uint16{ - 0x00: 0x4f9b, - 0x01: 0x4fa0, - 0x02: 0x50d1, - 0x03: 0x5147, - 0x04: 0x7af6, - 0x05: 0x5171, - 0x06: 0x51f6, - 0x07: 0x5354, - 0x08: 0x5321, - 0x09: 0x537f, - 0x0a: 0x53eb, - 0x0b: 0x55ac, - 0x0c: 0x5883, - 0x0d: 0x5ce1, - 0x0e: 0x5f37, - 0x0f: 0x5f4a, - 0x10: 0x602f, - 0x11: 0x6050, - 0x12: 0x606d, - 0x13: 0x631f, - 0x14: 0x6559, - 0x15: 0x6a4b, - 0x16: 0x6cc1, - 0x17: 0x72c2, - 0x18: 0x72ed, - 0x19: 0x77ef, - 0x1a: 0x80f8, - 0x1b: 0x8105, - 0x1c: 0x8208, - 0x1d: 0x854e, - 0x1e: 0x90f7, - 0x1f: 0x93e1, - 0x20: 0x97ff, - 0x21: 0x9957, - 0x22: 0x9a5a, - 0x23: 0x4ef0, - 0x24: 0x51dd, - 0x25: 0x5c2d, - 0x26: 0x6681, - 0x27: 0x696d, - 0x28: 0x5c40, - 0x29: 0x66f2, - 0x2a: 0x6975, - 0x2b: 0x7389, - 0x2c: 0x6850, - 0x2d: 0x7c81, - 0x2e: 0x50c5, - 0x2f: 0x52e4, - 0x30: 0x5747, - 0x31: 0x5dfe, - 0x32: 0x9326, - 0x33: 0x65a4, - 0x34: 0x6b23, - 0x35: 0x6b3d, - 0x36: 0x7434, - 0x37: 0x7981, - 0x38: 0x79bd, - 0x39: 0x7b4b, - 0x3a: 0x7dca, - 0x3b: 0x82b9, - 0x3c: 0x83cc, - 0x3d: 0x887f, - 0x3e: 0x895f, - 0x3f: 0x8b39, - 0x40: 0x8fd1, - 0x41: 0x91d1, - 0x42: 0x541f, - 0x43: 0x9280, - 0x44: 0x4e5d, - 0x45: 0x5036, - 0x46: 0x53e5, - 0x47: 0x533a, - 0x48: 0x72d7, - 0x49: 0x7396, - 0x4a: 0x77e9, - 0x4b: 0x82e6, - 0x4c: 0x8eaf, - 0x4d: 0x99c6, - 0x4e: 0x99c8, - 0x4f: 0x99d2, - 0x50: 0x5177, - 0x51: 0x611a, - 0x52: 0x865e, - 0x53: 0x55b0, - 0x54: 0x7a7a, - 0x55: 0x5076, - 0x56: 0x5bd3, - 0x57: 0x9047, - 0x58: 0x9685, - 0x59: 0x4e32, - 0x5a: 0x6adb, - 0x5b: 0x91e7, - 0x5c: 0x5c51, - 0x5d: 0x5c48, - }, - 0x16: [94]uint16{ - 0x00: 0x6398, - 0x01: 0x7a9f, - 0x02: 0x6c93, - 0x03: 0x9774, - 0x04: 0x8f61, - 0x05: 0x7aaa, - 0x06: 0x718a, - 0x07: 0x9688, - 0x08: 0x7c82, - 0x09: 0x6817, - 0x0a: 0x7e70, - 0x0b: 0x6851, - 0x0c: 0x936c, - 0x0d: 0x52f2, - 0x0e: 0x541b, - 0x0f: 0x85ab, - 0x10: 0x8a13, - 0x11: 0x7fa4, - 0x12: 0x8ecd, - 0x13: 0x90e1, - 0x14: 0x5366, - 0x15: 0x8888, - 0x16: 0x7941, - 0x17: 0x4fc2, - 0x18: 0x50be, - 0x19: 0x5211, - 0x1a: 0x5144, - 0x1b: 0x5553, - 0x1c: 0x572d, - 0x1d: 0x73ea, - 0x1e: 0x578b, - 0x1f: 0x5951, - 0x20: 0x5f62, - 0x21: 0x5f84, - 0x22: 0x6075, - 0x23: 0x6176, - 0x24: 0x6167, - 0x25: 0x61a9, - 0x26: 0x63b2, - 0x27: 0x643a, - 0x28: 0x656c, - 0x29: 0x666f, - 0x2a: 0x6842, - 0x2b: 0x6e13, - 0x2c: 0x7566, - 0x2d: 0x7a3d, - 0x2e: 0x7cfb, - 0x2f: 0x7d4c, - 0x30: 0x7d99, - 0x31: 0x7e4b, - 0x32: 0x7f6b, - 0x33: 0x830e, - 0x34: 0x834a, - 0x35: 0x86cd, - 0x36: 0x8a08, - 0x37: 0x8a63, - 0x38: 0x8b66, - 0x39: 0x8efd, - 0x3a: 0x981a, - 0x3b: 0x9d8f, - 0x3c: 0x82b8, - 0x3d: 0x8fce, - 0x3e: 0x9be8, - 0x3f: 0x5287, - 0x40: 0x621f, - 0x41: 0x6483, - 0x42: 0x6fc0, - 0x43: 0x9699, - 0x44: 0x6841, - 0x45: 0x5091, - 0x46: 0x6b20, - 0x47: 0x6c7a, - 0x48: 0x6f54, - 0x49: 0x7a74, - 0x4a: 0x7d50, - 0x4b: 0x8840, - 0x4c: 0x8a23, - 0x4d: 0x6708, - 0x4e: 0x4ef6, - 0x4f: 0x5039, - 0x50: 0x5026, - 0x51: 0x5065, - 0x52: 0x517c, - 0x53: 0x5238, - 0x54: 0x5263, - 0x55: 0x55a7, - 0x56: 0x570f, - 0x57: 0x5805, - 0x58: 0x5acc, - 0x59: 0x5efa, - 0x5a: 0x61b2, - 0x5b: 0x61f8, - 0x5c: 0x62f3, - 0x5d: 0x6372, - }, - 0x17: [94]uint16{ - 0x00: 0x691c, - 0x01: 0x6a29, - 0x02: 0x727d, - 0x03: 0x72ac, - 0x04: 0x732e, - 0x05: 0x7814, - 0x06: 0x786f, - 0x07: 0x7d79, - 0x08: 0x770c, - 0x09: 0x80a9, - 0x0a: 0x898b, - 0x0b: 0x8b19, - 0x0c: 0x8ce2, - 0x0d: 0x8ed2, - 0x0e: 0x9063, - 0x0f: 0x9375, - 0x10: 0x967a, - 0x11: 0x9855, - 0x12: 0x9a13, - 0x13: 0x9e78, - 0x14: 0x5143, - 0x15: 0x539f, - 0x16: 0x53b3, - 0x17: 0x5e7b, - 0x18: 0x5f26, - 0x19: 0x6e1b, - 0x1a: 0x6e90, - 0x1b: 0x7384, - 0x1c: 0x73fe, - 0x1d: 0x7d43, - 0x1e: 0x8237, - 0x1f: 0x8a00, - 0x20: 0x8afa, - 0x21: 0x9650, - 0x22: 0x4e4e, - 0x23: 0x500b, - 0x24: 0x53e4, - 0x25: 0x547c, - 0x26: 0x56fa, - 0x27: 0x59d1, - 0x28: 0x5b64, - 0x29: 0x5df1, - 0x2a: 0x5eab, - 0x2b: 0x5f27, - 0x2c: 0x6238, - 0x2d: 0x6545, - 0x2e: 0x67af, - 0x2f: 0x6e56, - 0x30: 0x72d0, - 0x31: 0x7cca, - 0x32: 0x88b4, - 0x33: 0x80a1, - 0x34: 0x80e1, - 0x35: 0x83f0, - 0x36: 0x864e, - 0x37: 0x8a87, - 0x38: 0x8de8, - 0x39: 0x9237, - 0x3a: 0x96c7, - 0x3b: 0x9867, - 0x3c: 0x9f13, - 0x3d: 0x4e94, - 0x3e: 0x4e92, - 0x3f: 0x4f0d, - 0x40: 0x5348, - 0x41: 0x5449, - 0x42: 0x543e, - 0x43: 0x5a2f, - 0x44: 0x5f8c, - 0x45: 0x5fa1, - 0x46: 0x609f, - 0x47: 0x68a7, - 0x48: 0x6a8e, - 0x49: 0x745a, - 0x4a: 0x7881, - 0x4b: 0x8a9e, - 0x4c: 0x8aa4, - 0x4d: 0x8b77, - 0x4e: 0x9190, - 0x4f: 0x4e5e, - 0x50: 0x9bc9, - 0x51: 0x4ea4, - 0x52: 0x4f7c, - 0x53: 0x4faf, - 0x54: 0x5019, - 0x55: 0x5016, - 0x56: 0x5149, - 0x57: 0x516c, - 0x58: 0x529f, - 0x59: 0x52b9, - 0x5a: 0x52fe, - 0x5b: 0x539a, - 0x5c: 0x53e3, - 0x5d: 0x5411, - }, - 0x18: [94]uint16{ - 0x00: 0x540e, - 0x01: 0x5589, - 0x02: 0x5751, - 0x03: 0x57a2, - 0x04: 0x597d, - 0x05: 0x5b54, - 0x06: 0x5b5d, - 0x07: 0x5b8f, - 0x08: 0x5de5, - 0x09: 0x5de7, - 0x0a: 0x5df7, - 0x0b: 0x5e78, - 0x0c: 0x5e83, - 0x0d: 0x5e9a, - 0x0e: 0x5eb7, - 0x0f: 0x5f18, - 0x10: 0x6052, - 0x11: 0x614c, - 0x12: 0x6297, - 0x13: 0x62d8, - 0x14: 0x63a7, - 0x15: 0x653b, - 0x16: 0x6602, - 0x17: 0x6643, - 0x18: 0x66f4, - 0x19: 0x676d, - 0x1a: 0x6821, - 0x1b: 0x6897, - 0x1c: 0x69cb, - 0x1d: 0x6c5f, - 0x1e: 0x6d2a, - 0x1f: 0x6d69, - 0x20: 0x6e2f, - 0x21: 0x6e9d, - 0x22: 0x7532, - 0x23: 0x7687, - 0x24: 0x786c, - 0x25: 0x7a3f, - 0x26: 0x7ce0, - 0x27: 0x7d05, - 0x28: 0x7d18, - 0x29: 0x7d5e, - 0x2a: 0x7db1, - 0x2b: 0x8015, - 0x2c: 0x8003, - 0x2d: 0x80af, - 0x2e: 0x80b1, - 0x2f: 0x8154, - 0x30: 0x818f, - 0x31: 0x822a, - 0x32: 0x8352, - 0x33: 0x884c, - 0x34: 0x8861, - 0x35: 0x8b1b, - 0x36: 0x8ca2, - 0x37: 0x8cfc, - 0x38: 0x90ca, - 0x39: 0x9175, - 0x3a: 0x9271, - 0x3b: 0x783f, - 0x3c: 0x92fc, - 0x3d: 0x95a4, - 0x3e: 0x964d, - 0x3f: 0x9805, - 0x40: 0x9999, - 0x41: 0x9ad8, - 0x42: 0x9d3b, - 0x43: 0x525b, - 0x44: 0x52ab, - 0x45: 0x53f7, - 0x46: 0x5408, - 0x47: 0x58d5, - 0x48: 0x62f7, - 0x49: 0x6fe0, - 0x4a: 0x8c6a, - 0x4b: 0x8f5f, - 0x4c: 0x9eb9, - 0x4d: 0x514b, - 0x4e: 0x523b, - 0x4f: 0x544a, - 0x50: 0x56fd, - 0x51: 0x7a40, - 0x52: 0x9177, - 0x53: 0x9d60, - 0x54: 0x9ed2, - 0x55: 0x7344, - 0x56: 0x6f09, - 0x57: 0x8170, - 0x58: 0x7511, - 0x59: 0x5ffd, - 0x5a: 0x60da, - 0x5b: 0x9aa8, - 0x5c: 0x72db, - 0x5d: 0x8fbc, - }, - 0x19: [94]uint16{ - 0x00: 0x6b64, - 0x01: 0x9803, - 0x02: 0x4eca, - 0x03: 0x56f0, - 0x04: 0x5764, - 0x05: 0x58be, - 0x06: 0x5a5a, - 0x07: 0x6068, - 0x08: 0x61c7, - 0x09: 0x660f, - 0x0a: 0x6606, - 0x0b: 0x6839, - 0x0c: 0x68b1, - 0x0d: 0x6df7, - 0x0e: 0x75d5, - 0x0f: 0x7d3a, - 0x10: 0x826e, - 0x11: 0x9b42, - 0x12: 0x4e9b, - 0x13: 0x4f50, - 0x14: 0x53c9, - 0x15: 0x5506, - 0x16: 0x5d6f, - 0x17: 0x5de6, - 0x18: 0x5dee, - 0x19: 0x67fb, - 0x1a: 0x6c99, - 0x1b: 0x7473, - 0x1c: 0x7802, - 0x1d: 0x8a50, - 0x1e: 0x9396, - 0x1f: 0x88df, - 0x20: 0x5750, - 0x21: 0x5ea7, - 0x22: 0x632b, - 0x23: 0x50b5, - 0x24: 0x50ac, - 0x25: 0x518d, - 0x26: 0x6700, - 0x27: 0x54c9, - 0x28: 0x585e, - 0x29: 0x59bb, - 0x2a: 0x5bb0, - 0x2b: 0x5f69, - 0x2c: 0x624d, - 0x2d: 0x63a1, - 0x2e: 0x683d, - 0x2f: 0x6b73, - 0x30: 0x6e08, - 0x31: 0x707d, - 0x32: 0x91c7, - 0x33: 0x7280, - 0x34: 0x7815, - 0x35: 0x7826, - 0x36: 0x796d, - 0x37: 0x658e, - 0x38: 0x7d30, - 0x39: 0x83dc, - 0x3a: 0x88c1, - 0x3b: 0x8f09, - 0x3c: 0x969b, - 0x3d: 0x5264, - 0x3e: 0x5728, - 0x3f: 0x6750, - 0x40: 0x7f6a, - 0x41: 0x8ca1, - 0x42: 0x51b4, - 0x43: 0x5742, - 0x44: 0x962a, - 0x45: 0x583a, - 0x46: 0x698a, - 0x47: 0x80b4, - 0x48: 0x54b2, - 0x49: 0x5d0e, - 0x4a: 0x57fc, - 0x4b: 0x7895, - 0x4c: 0x9dfa, - 0x4d: 0x4f5c, - 0x4e: 0x524a, - 0x4f: 0x548b, - 0x50: 0x643e, - 0x51: 0x6628, - 0x52: 0x6714, - 0x53: 0x67f5, - 0x54: 0x7a84, - 0x55: 0x7b56, - 0x56: 0x7d22, - 0x57: 0x932f, - 0x58: 0x685c, - 0x59: 0x9bad, - 0x5a: 0x7b39, - 0x5b: 0x5319, - 0x5c: 0x518a, - 0x5d: 0x5237, - }, - 0x1a: [94]uint16{ - 0x00: 0x5bdf, - 0x01: 0x62f6, - 0x02: 0x64ae, - 0x03: 0x64e6, - 0x04: 0x672d, - 0x05: 0x6bba, - 0x06: 0x85a9, - 0x07: 0x96d1, - 0x08: 0x7690, - 0x09: 0x9bd6, - 0x0a: 0x634c, - 0x0b: 0x9306, - 0x0c: 0x9bab, - 0x0d: 0x76bf, - 0x0e: 0x6652, - 0x0f: 0x4e09, - 0x10: 0x5098, - 0x11: 0x53c2, - 0x12: 0x5c71, - 0x13: 0x60e8, - 0x14: 0x6492, - 0x15: 0x6563, - 0x16: 0x685f, - 0x17: 0x71e6, - 0x18: 0x73ca, - 0x19: 0x7523, - 0x1a: 0x7b97, - 0x1b: 0x7e82, - 0x1c: 0x8695, - 0x1d: 0x8b83, - 0x1e: 0x8cdb, - 0x1f: 0x9178, - 0x20: 0x9910, - 0x21: 0x65ac, - 0x22: 0x66ab, - 0x23: 0x6b8b, - 0x24: 0x4ed5, - 0x25: 0x4ed4, - 0x26: 0x4f3a, - 0x27: 0x4f7f, - 0x28: 0x523a, - 0x29: 0x53f8, - 0x2a: 0x53f2, - 0x2b: 0x55e3, - 0x2c: 0x56db, - 0x2d: 0x58eb, - 0x2e: 0x59cb, - 0x2f: 0x59c9, - 0x30: 0x59ff, - 0x31: 0x5b50, - 0x32: 0x5c4d, - 0x33: 0x5e02, - 0x34: 0x5e2b, - 0x35: 0x5fd7, - 0x36: 0x601d, - 0x37: 0x6307, - 0x38: 0x652f, - 0x39: 0x5b5c, - 0x3a: 0x65af, - 0x3b: 0x65bd, - 0x3c: 0x65e8, - 0x3d: 0x679d, - 0x3e: 0x6b62, - 0x3f: 0x6b7b, - 0x40: 0x6c0f, - 0x41: 0x7345, - 0x42: 0x7949, - 0x43: 0x79c1, - 0x44: 0x7cf8, - 0x45: 0x7d19, - 0x46: 0x7d2b, - 0x47: 0x80a2, - 0x48: 0x8102, - 0x49: 0x81f3, - 0x4a: 0x8996, - 0x4b: 0x8a5e, - 0x4c: 0x8a69, - 0x4d: 0x8a66, - 0x4e: 0x8a8c, - 0x4f: 0x8aee, - 0x50: 0x8cc7, - 0x51: 0x8cdc, - 0x52: 0x96cc, - 0x53: 0x98fc, - 0x54: 0x6b6f, - 0x55: 0x4e8b, - 0x56: 0x4f3c, - 0x57: 0x4f8d, - 0x58: 0x5150, - 0x59: 0x5b57, - 0x5a: 0x5bfa, - 0x5b: 0x6148, - 0x5c: 0x6301, - 0x5d: 0x6642, - }, - 0x1b: [94]uint16{ - 0x00: 0x6b21, - 0x01: 0x6ecb, - 0x02: 0x6cbb, - 0x03: 0x723e, - 0x04: 0x74bd, - 0x05: 0x75d4, - 0x06: 0x78c1, - 0x07: 0x793a, - 0x08: 0x800c, - 0x09: 0x8033, - 0x0a: 0x81ea, - 0x0b: 0x8494, - 0x0c: 0x8f9e, - 0x0d: 0x6c50, - 0x0e: 0x9e7f, - 0x0f: 0x5f0f, - 0x10: 0x8b58, - 0x11: 0x9d2b, - 0x12: 0x7afa, - 0x13: 0x8ef8, - 0x14: 0x5b8d, - 0x15: 0x96eb, - 0x16: 0x4e03, - 0x17: 0x53f1, - 0x18: 0x57f7, - 0x19: 0x5931, - 0x1a: 0x5ac9, - 0x1b: 0x5ba4, - 0x1c: 0x6089, - 0x1d: 0x6e7f, - 0x1e: 0x6f06, - 0x1f: 0x75be, - 0x20: 0x8cea, - 0x21: 0x5b9f, - 0x22: 0x8500, - 0x23: 0x7be0, - 0x24: 0x5072, - 0x25: 0x67f4, - 0x26: 0x829d, - 0x27: 0x5c61, - 0x28: 0x854a, - 0x29: 0x7e1e, - 0x2a: 0x820e, - 0x2b: 0x5199, - 0x2c: 0x5c04, - 0x2d: 0x6368, - 0x2e: 0x8d66, - 0x2f: 0x659c, - 0x30: 0x716e, - 0x31: 0x793e, - 0x32: 0x7d17, - 0x33: 0x8005, - 0x34: 0x8b1d, - 0x35: 0x8eca, - 0x36: 0x906e, - 0x37: 0x86c7, - 0x38: 0x90aa, - 0x39: 0x501f, - 0x3a: 0x52fa, - 0x3b: 0x5c3a, - 0x3c: 0x6753, - 0x3d: 0x707c, - 0x3e: 0x7235, - 0x3f: 0x914c, - 0x40: 0x91c8, - 0x41: 0x932b, - 0x42: 0x82e5, - 0x43: 0x5bc2, - 0x44: 0x5f31, - 0x45: 0x60f9, - 0x46: 0x4e3b, - 0x47: 0x53d6, - 0x48: 0x5b88, - 0x49: 0x624b, - 0x4a: 0x6731, - 0x4b: 0x6b8a, - 0x4c: 0x72e9, - 0x4d: 0x73e0, - 0x4e: 0x7a2e, - 0x4f: 0x816b, - 0x50: 0x8da3, - 0x51: 0x9152, - 0x52: 0x9996, - 0x53: 0x5112, - 0x54: 0x53d7, - 0x55: 0x546a, - 0x56: 0x5bff, - 0x57: 0x6388, - 0x58: 0x6a39, - 0x59: 0x7dac, - 0x5a: 0x9700, - 0x5b: 0x56da, - 0x5c: 0x53ce, - 0x5d: 0x5468, - }, - 0x1c: [94]uint16{ - 0x00: 0x5b97, - 0x01: 0x5c31, - 0x02: 0x5dde, - 0x03: 0x4fee, - 0x04: 0x6101, - 0x05: 0x62fe, - 0x06: 0x6d32, - 0x07: 0x79c0, - 0x08: 0x79cb, - 0x09: 0x7d42, - 0x0a: 0x7e4d, - 0x0b: 0x7fd2, - 0x0c: 0x81ed, - 0x0d: 0x821f, - 0x0e: 0x8490, - 0x0f: 0x8846, - 0x10: 0x8972, - 0x11: 0x8b90, - 0x12: 0x8e74, - 0x13: 0x8f2f, - 0x14: 0x9031, - 0x15: 0x914b, - 0x16: 0x916c, - 0x17: 0x96c6, - 0x18: 0x919c, - 0x19: 0x4ec0, - 0x1a: 0x4f4f, - 0x1b: 0x5145, - 0x1c: 0x5341, - 0x1d: 0x5f93, - 0x1e: 0x620e, - 0x1f: 0x67d4, - 0x20: 0x6c41, - 0x21: 0x6e0b, - 0x22: 0x7363, - 0x23: 0x7e26, - 0x24: 0x91cd, - 0x25: 0x9283, - 0x26: 0x53d4, - 0x27: 0x5919, - 0x28: 0x5bbf, - 0x29: 0x6dd1, - 0x2a: 0x795d, - 0x2b: 0x7e2e, - 0x2c: 0x7c9b, - 0x2d: 0x587e, - 0x2e: 0x719f, - 0x2f: 0x51fa, - 0x30: 0x8853, - 0x31: 0x8ff0, - 0x32: 0x4fca, - 0x33: 0x5cfb, - 0x34: 0x6625, - 0x35: 0x77ac, - 0x36: 0x7ae3, - 0x37: 0x821c, - 0x38: 0x99ff, - 0x39: 0x51c6, - 0x3a: 0x5faa, - 0x3b: 0x65ec, - 0x3c: 0x696f, - 0x3d: 0x6b89, - 0x3e: 0x6df3, - 0x3f: 0x6e96, - 0x40: 0x6f64, - 0x41: 0x76fe, - 0x42: 0x7d14, - 0x43: 0x5de1, - 0x44: 0x9075, - 0x45: 0x9187, - 0x46: 0x9806, - 0x47: 0x51e6, - 0x48: 0x521d, - 0x49: 0x6240, - 0x4a: 0x6691, - 0x4b: 0x66d9, - 0x4c: 0x6e1a, - 0x4d: 0x5eb6, - 0x4e: 0x7dd2, - 0x4f: 0x7f72, - 0x50: 0x66f8, - 0x51: 0x85af, - 0x52: 0x85f7, - 0x53: 0x8af8, - 0x54: 0x52a9, - 0x55: 0x53d9, - 0x56: 0x5973, - 0x57: 0x5e8f, - 0x58: 0x5f90, - 0x59: 0x6055, - 0x5a: 0x92e4, - 0x5b: 0x9664, - 0x5c: 0x50b7, - 0x5d: 0x511f, - }, - 0x1d: [94]uint16{ - 0x00: 0x52dd, - 0x01: 0x5320, - 0x02: 0x5347, - 0x03: 0x53ec, - 0x04: 0x54e8, - 0x05: 0x5546, - 0x06: 0x5531, - 0x07: 0x5617, - 0x08: 0x5968, - 0x09: 0x59be, - 0x0a: 0x5a3c, - 0x0b: 0x5bb5, - 0x0c: 0x5c06, - 0x0d: 0x5c0f, - 0x0e: 0x5c11, - 0x0f: 0x5c1a, - 0x10: 0x5e84, - 0x11: 0x5e8a, - 0x12: 0x5ee0, - 0x13: 0x5f70, - 0x14: 0x627f, - 0x15: 0x6284, - 0x16: 0x62db, - 0x17: 0x638c, - 0x18: 0x6377, - 0x19: 0x6607, - 0x1a: 0x660c, - 0x1b: 0x662d, - 0x1c: 0x6676, - 0x1d: 0x677e, - 0x1e: 0x68a2, - 0x1f: 0x6a1f, - 0x20: 0x6a35, - 0x21: 0x6cbc, - 0x22: 0x6d88, - 0x23: 0x6e09, - 0x24: 0x6e58, - 0x25: 0x713c, - 0x26: 0x7126, - 0x27: 0x7167, - 0x28: 0x75c7, - 0x29: 0x7701, - 0x2a: 0x785d, - 0x2b: 0x7901, - 0x2c: 0x7965, - 0x2d: 0x79f0, - 0x2e: 0x7ae0, - 0x2f: 0x7b11, - 0x30: 0x7ca7, - 0x31: 0x7d39, - 0x32: 0x8096, - 0x33: 0x83d6, - 0x34: 0x848b, - 0x35: 0x8549, - 0x36: 0x885d, - 0x37: 0x88f3, - 0x38: 0x8a1f, - 0x39: 0x8a3c, - 0x3a: 0x8a54, - 0x3b: 0x8a73, - 0x3c: 0x8c61, - 0x3d: 0x8cde, - 0x3e: 0x91a4, - 0x3f: 0x9266, - 0x40: 0x937e, - 0x41: 0x9418, - 0x42: 0x969c, - 0x43: 0x9798, - 0x44: 0x4e0a, - 0x45: 0x4e08, - 0x46: 0x4e1e, - 0x47: 0x4e57, - 0x48: 0x5197, - 0x49: 0x5270, - 0x4a: 0x57ce, - 0x4b: 0x5834, - 0x4c: 0x58cc, - 0x4d: 0x5b22, - 0x4e: 0x5e38, - 0x4f: 0x60c5, - 0x50: 0x64fe, - 0x51: 0x6761, - 0x52: 0x6756, - 0x53: 0x6d44, - 0x54: 0x72b6, - 0x55: 0x7573, - 0x56: 0x7a63, - 0x57: 0x84b8, - 0x58: 0x8b72, - 0x59: 0x91b8, - 0x5a: 0x9320, - 0x5b: 0x5631, - 0x5c: 0x57f4, - 0x5d: 0x98fe, - }, - 0x1e: [94]uint16{ - 0x00: 0x62ed, - 0x01: 0x690d, - 0x02: 0x6b96, - 0x03: 0x71ed, - 0x04: 0x7e54, - 0x05: 0x8077, - 0x06: 0x8272, - 0x07: 0x89e6, - 0x08: 0x98df, - 0x09: 0x8755, - 0x0a: 0x8fb1, - 0x0b: 0x5c3b, - 0x0c: 0x4f38, - 0x0d: 0x4fe1, - 0x0e: 0x4fb5, - 0x0f: 0x5507, - 0x10: 0x5a20, - 0x11: 0x5bdd, - 0x12: 0x5be9, - 0x13: 0x5fc3, - 0x14: 0x614e, - 0x15: 0x632f, - 0x16: 0x65b0, - 0x17: 0x664b, - 0x18: 0x68ee, - 0x19: 0x699b, - 0x1a: 0x6d78, - 0x1b: 0x6df1, - 0x1c: 0x7533, - 0x1d: 0x75b9, - 0x1e: 0x771f, - 0x1f: 0x795e, - 0x20: 0x79e6, - 0x21: 0x7d33, - 0x22: 0x81e3, - 0x23: 0x82af, - 0x24: 0x85aa, - 0x25: 0x89aa, - 0x26: 0x8a3a, - 0x27: 0x8eab, - 0x28: 0x8f9b, - 0x29: 0x9032, - 0x2a: 0x91dd, - 0x2b: 0x9707, - 0x2c: 0x4eba, - 0x2d: 0x4ec1, - 0x2e: 0x5203, - 0x2f: 0x5875, - 0x30: 0x58ec, - 0x31: 0x5c0b, - 0x32: 0x751a, - 0x33: 0x5c3d, - 0x34: 0x814e, - 0x35: 0x8a0a, - 0x36: 0x8fc5, - 0x37: 0x9663, - 0x38: 0x976d, - 0x39: 0x7b25, - 0x3a: 0x8acf, - 0x3b: 0x9808, - 0x3c: 0x9162, - 0x3d: 0x56f3, - 0x3e: 0x53a8, - 0x3f: 0x9017, - 0x40: 0x5439, - 0x41: 0x5782, - 0x42: 0x5e25, - 0x43: 0x63a8, - 0x44: 0x6c34, - 0x45: 0x708a, - 0x46: 0x7761, - 0x47: 0x7c8b, - 0x48: 0x7fe0, - 0x49: 0x8870, - 0x4a: 0x9042, - 0x4b: 0x9154, - 0x4c: 0x9310, - 0x4d: 0x9318, - 0x4e: 0x968f, - 0x4f: 0x745e, - 0x50: 0x9ac4, - 0x51: 0x5d07, - 0x52: 0x5d69, - 0x53: 0x6570, - 0x54: 0x67a2, - 0x55: 0x8da8, - 0x56: 0x96db, - 0x57: 0x636e, - 0x58: 0x6749, - 0x59: 0x6919, - 0x5a: 0x83c5, - 0x5b: 0x9817, - 0x5c: 0x96c0, - 0x5d: 0x88fe, - }, - 0x1f: [94]uint16{ - 0x00: 0x6f84, - 0x01: 0x647a, - 0x02: 0x5bf8, - 0x03: 0x4e16, - 0x04: 0x702c, - 0x05: 0x755d, - 0x06: 0x662f, - 0x07: 0x51c4, - 0x08: 0x5236, - 0x09: 0x52e2, - 0x0a: 0x59d3, - 0x0b: 0x5f81, - 0x0c: 0x6027, - 0x0d: 0x6210, - 0x0e: 0x653f, - 0x0f: 0x6574, - 0x10: 0x661f, - 0x11: 0x6674, - 0x12: 0x68f2, - 0x13: 0x6816, - 0x14: 0x6b63, - 0x15: 0x6e05, - 0x16: 0x7272, - 0x17: 0x751f, - 0x18: 0x76db, - 0x19: 0x7cbe, - 0x1a: 0x8056, - 0x1b: 0x58f0, - 0x1c: 0x88fd, - 0x1d: 0x897f, - 0x1e: 0x8aa0, - 0x1f: 0x8a93, - 0x20: 0x8acb, - 0x21: 0x901d, - 0x22: 0x9192, - 0x23: 0x9752, - 0x24: 0x9759, - 0x25: 0x6589, - 0x26: 0x7a0e, - 0x27: 0x8106, - 0x28: 0x96bb, - 0x29: 0x5e2d, - 0x2a: 0x60dc, - 0x2b: 0x621a, - 0x2c: 0x65a5, - 0x2d: 0x6614, - 0x2e: 0x6790, - 0x2f: 0x77f3, - 0x30: 0x7a4d, - 0x31: 0x7c4d, - 0x32: 0x7e3e, - 0x33: 0x810a, - 0x34: 0x8cac, - 0x35: 0x8d64, - 0x36: 0x8de1, - 0x37: 0x8e5f, - 0x38: 0x78a9, - 0x39: 0x5207, - 0x3a: 0x62d9, - 0x3b: 0x63a5, - 0x3c: 0x6442, - 0x3d: 0x6298, - 0x3e: 0x8a2d, - 0x3f: 0x7a83, - 0x40: 0x7bc0, - 0x41: 0x8aac, - 0x42: 0x96ea, - 0x43: 0x7d76, - 0x44: 0x820c, - 0x45: 0x8749, - 0x46: 0x4ed9, - 0x47: 0x5148, - 0x48: 0x5343, - 0x49: 0x5360, - 0x4a: 0x5ba3, - 0x4b: 0x5c02, - 0x4c: 0x5c16, - 0x4d: 0x5ddd, - 0x4e: 0x6226, - 0x4f: 0x6247, - 0x50: 0x64b0, - 0x51: 0x6813, - 0x52: 0x6834, - 0x53: 0x6cc9, - 0x54: 0x6d45, - 0x55: 0x6d17, - 0x56: 0x67d3, - 0x57: 0x6f5c, - 0x58: 0x714e, - 0x59: 0x717d, - 0x5a: 0x65cb, - 0x5b: 0x7a7f, - 0x5c: 0x7bad, - 0x5d: 0x7dda, - }, - 0x20: [94]uint16{ - 0x00: 0x7e4a, - 0x01: 0x7fa8, - 0x02: 0x817a, - 0x03: 0x821b, - 0x04: 0x8239, - 0x05: 0x85a6, - 0x06: 0x8a6e, - 0x07: 0x8cce, - 0x08: 0x8df5, - 0x09: 0x9078, - 0x0a: 0x9077, - 0x0b: 0x92ad, - 0x0c: 0x9291, - 0x0d: 0x9583, - 0x0e: 0x9bae, - 0x0f: 0x524d, - 0x10: 0x5584, - 0x11: 0x6f38, - 0x12: 0x7136, - 0x13: 0x5168, - 0x14: 0x7985, - 0x15: 0x7e55, - 0x16: 0x81b3, - 0x17: 0x7cce, - 0x18: 0x564c, - 0x19: 0x5851, - 0x1a: 0x5ca8, - 0x1b: 0x63aa, - 0x1c: 0x66fe, - 0x1d: 0x66fd, - 0x1e: 0x695a, - 0x1f: 0x72d9, - 0x20: 0x758f, - 0x21: 0x758e, - 0x22: 0x790e, - 0x23: 0x7956, - 0x24: 0x79df, - 0x25: 0x7c97, - 0x26: 0x7d20, - 0x27: 0x7d44, - 0x28: 0x8607, - 0x29: 0x8a34, - 0x2a: 0x963b, - 0x2b: 0x9061, - 0x2c: 0x9f20, - 0x2d: 0x50e7, - 0x2e: 0x5275, - 0x2f: 0x53cc, - 0x30: 0x53e2, - 0x31: 0x5009, - 0x32: 0x55aa, - 0x33: 0x58ee, - 0x34: 0x594f, - 0x35: 0x723d, - 0x36: 0x5b8b, - 0x37: 0x5c64, - 0x38: 0x531d, - 0x39: 0x60e3, - 0x3a: 0x60f3, - 0x3b: 0x635c, - 0x3c: 0x6383, - 0x3d: 0x633f, - 0x3e: 0x63bb, - 0x3f: 0x64cd, - 0x40: 0x65e9, - 0x41: 0x66f9, - 0x42: 0x5de3, - 0x43: 0x69cd, - 0x44: 0x69fd, - 0x45: 0x6f15, - 0x46: 0x71e5, - 0x47: 0x4e89, - 0x48: 0x75e9, - 0x49: 0x76f8, - 0x4a: 0x7a93, - 0x4b: 0x7cdf, - 0x4c: 0x7dcf, - 0x4d: 0x7d9c, - 0x4e: 0x8061, - 0x4f: 0x8349, - 0x50: 0x8358, - 0x51: 0x846c, - 0x52: 0x84bc, - 0x53: 0x85fb, - 0x54: 0x88c5, - 0x55: 0x8d70, - 0x56: 0x9001, - 0x57: 0x906d, - 0x58: 0x9397, - 0x59: 0x971c, - 0x5a: 0x9a12, - 0x5b: 0x50cf, - 0x5c: 0x5897, - 0x5d: 0x618e, - }, - 0x21: [94]uint16{ - 0x00: 0x81d3, - 0x01: 0x8535, - 0x02: 0x8d08, - 0x03: 0x9020, - 0x04: 0x4fc3, - 0x05: 0x5074, - 0x06: 0x5247, - 0x07: 0x5373, - 0x08: 0x606f, - 0x09: 0x6349, - 0x0a: 0x675f, - 0x0b: 0x6e2c, - 0x0c: 0x8db3, - 0x0d: 0x901f, - 0x0e: 0x4fd7, - 0x0f: 0x5c5e, - 0x10: 0x8cca, - 0x11: 0x65cf, - 0x12: 0x7d9a, - 0x13: 0x5352, - 0x14: 0x8896, - 0x15: 0x5176, - 0x16: 0x63c3, - 0x17: 0x5b58, - 0x18: 0x5b6b, - 0x19: 0x5c0a, - 0x1a: 0x640d, - 0x1b: 0x6751, - 0x1c: 0x905c, - 0x1d: 0x4ed6, - 0x1e: 0x591a, - 0x1f: 0x592a, - 0x20: 0x6c70, - 0x21: 0x8a51, - 0x22: 0x553e, - 0x23: 0x5815, - 0x24: 0x59a5, - 0x25: 0x60f0, - 0x26: 0x6253, - 0x27: 0x67c1, - 0x28: 0x8235, - 0x29: 0x6955, - 0x2a: 0x9640, - 0x2b: 0x99c4, - 0x2c: 0x9a28, - 0x2d: 0x4f53, - 0x2e: 0x5806, - 0x2f: 0x5bfe, - 0x30: 0x8010, - 0x31: 0x5cb1, - 0x32: 0x5e2f, - 0x33: 0x5f85, - 0x34: 0x6020, - 0x35: 0x614b, - 0x36: 0x6234, - 0x37: 0x66ff, - 0x38: 0x6cf0, - 0x39: 0x6ede, - 0x3a: 0x80ce, - 0x3b: 0x817f, - 0x3c: 0x82d4, - 0x3d: 0x888b, - 0x3e: 0x8cb8, - 0x3f: 0x9000, - 0x40: 0x902e, - 0x41: 0x968a, - 0x42: 0x9edb, - 0x43: 0x9bdb, - 0x44: 0x4ee3, - 0x45: 0x53f0, - 0x46: 0x5927, - 0x47: 0x7b2c, - 0x48: 0x918d, - 0x49: 0x984c, - 0x4a: 0x9df9, - 0x4b: 0x6edd, - 0x4c: 0x7027, - 0x4d: 0x5353, - 0x4e: 0x5544, - 0x4f: 0x5b85, - 0x50: 0x6258, - 0x51: 0x629e, - 0x52: 0x62d3, - 0x53: 0x6ca2, - 0x54: 0x6fef, - 0x55: 0x7422, - 0x56: 0x8a17, - 0x57: 0x9438, - 0x58: 0x6fc1, - 0x59: 0x8afe, - 0x5a: 0x8338, - 0x5b: 0x51e7, - 0x5c: 0x86f8, - 0x5d: 0x53ea, - }, - 0x22: [94]uint16{ - 0x00: 0x53e9, - 0x01: 0x4f46, - 0x02: 0x9054, - 0x03: 0x8fb0, - 0x04: 0x596a, - 0x05: 0x8131, - 0x06: 0x5dfd, - 0x07: 0x7aea, - 0x08: 0x8fbf, - 0x09: 0x68da, - 0x0a: 0x8c37, - 0x0b: 0x72f8, - 0x0c: 0x9c48, - 0x0d: 0x6a3d, - 0x0e: 0x8ab0, - 0x0f: 0x4e39, - 0x10: 0x5358, - 0x11: 0x5606, - 0x12: 0x5766, - 0x13: 0x62c5, - 0x14: 0x63a2, - 0x15: 0x65e6, - 0x16: 0x6b4e, - 0x17: 0x6de1, - 0x18: 0x6e5b, - 0x19: 0x70ad, - 0x1a: 0x77ed, - 0x1b: 0x7aef, - 0x1c: 0x7baa, - 0x1d: 0x7dbb, - 0x1e: 0x803d, - 0x1f: 0x80c6, - 0x20: 0x86cb, - 0x21: 0x8a95, - 0x22: 0x935b, - 0x23: 0x56e3, - 0x24: 0x58c7, - 0x25: 0x5f3e, - 0x26: 0x65ad, - 0x27: 0x6696, - 0x28: 0x6a80, - 0x29: 0x6bb5, - 0x2a: 0x7537, - 0x2b: 0x8ac7, - 0x2c: 0x5024, - 0x2d: 0x77e5, - 0x2e: 0x5730, - 0x2f: 0x5f1b, - 0x30: 0x6065, - 0x31: 0x667a, - 0x32: 0x6c60, - 0x33: 0x75f4, - 0x34: 0x7a1a, - 0x35: 0x7f6e, - 0x36: 0x81f4, - 0x37: 0x8718, - 0x38: 0x9045, - 0x39: 0x99b3, - 0x3a: 0x7bc9, - 0x3b: 0x755c, - 0x3c: 0x7af9, - 0x3d: 0x7b51, - 0x3e: 0x84c4, - 0x3f: 0x9010, - 0x40: 0x79e9, - 0x41: 0x7a92, - 0x42: 0x8336, - 0x43: 0x5ae1, - 0x44: 0x7740, - 0x45: 0x4e2d, - 0x46: 0x4ef2, - 0x47: 0x5b99, - 0x48: 0x5fe0, - 0x49: 0x62bd, - 0x4a: 0x663c, - 0x4b: 0x67f1, - 0x4c: 0x6ce8, - 0x4d: 0x866b, - 0x4e: 0x8877, - 0x4f: 0x8a3b, - 0x50: 0x914e, - 0x51: 0x92f3, - 0x52: 0x99d0, - 0x53: 0x6a17, - 0x54: 0x7026, - 0x55: 0x732a, - 0x56: 0x82e7, - 0x57: 0x8457, - 0x58: 0x8caf, - 0x59: 0x4e01, - 0x5a: 0x5146, - 0x5b: 0x51cb, - 0x5c: 0x558b, - 0x5d: 0x5bf5, - }, - 0x23: [94]uint16{ - 0x00: 0x5e16, - 0x01: 0x5e33, - 0x02: 0x5e81, - 0x03: 0x5f14, - 0x04: 0x5f35, - 0x05: 0x5f6b, - 0x06: 0x5fb4, - 0x07: 0x61f2, - 0x08: 0x6311, - 0x09: 0x66a2, - 0x0a: 0x671d, - 0x0b: 0x6f6e, - 0x0c: 0x7252, - 0x0d: 0x753a, - 0x0e: 0x773a, - 0x0f: 0x8074, - 0x10: 0x8139, - 0x11: 0x8178, - 0x12: 0x8776, - 0x13: 0x8abf, - 0x14: 0x8adc, - 0x15: 0x8d85, - 0x16: 0x8df3, - 0x17: 0x929a, - 0x18: 0x9577, - 0x19: 0x9802, - 0x1a: 0x9ce5, - 0x1b: 0x52c5, - 0x1c: 0x6357, - 0x1d: 0x76f4, - 0x1e: 0x6715, - 0x1f: 0x6c88, - 0x20: 0x73cd, - 0x21: 0x8cc3, - 0x22: 0x93ae, - 0x23: 0x9673, - 0x24: 0x6d25, - 0x25: 0x589c, - 0x26: 0x690e, - 0x27: 0x69cc, - 0x28: 0x8ffd, - 0x29: 0x939a, - 0x2a: 0x75db, - 0x2b: 0x901a, - 0x2c: 0x585a, - 0x2d: 0x6802, - 0x2e: 0x63b4, - 0x2f: 0x69fb, - 0x30: 0x4f43, - 0x31: 0x6f2c, - 0x32: 0x67d8, - 0x33: 0x8fbb, - 0x34: 0x8526, - 0x35: 0x7db4, - 0x36: 0x9354, - 0x37: 0x693f, - 0x38: 0x6f70, - 0x39: 0x576a, - 0x3a: 0x58f7, - 0x3b: 0x5b2c, - 0x3c: 0x7d2c, - 0x3d: 0x722a, - 0x3e: 0x540a, - 0x3f: 0x91e3, - 0x40: 0x9db4, - 0x41: 0x4ead, - 0x42: 0x4f4e, - 0x43: 0x505c, - 0x44: 0x5075, - 0x45: 0x5243, - 0x46: 0x8c9e, - 0x47: 0x5448, - 0x48: 0x5824, - 0x49: 0x5b9a, - 0x4a: 0x5e1d, - 0x4b: 0x5e95, - 0x4c: 0x5ead, - 0x4d: 0x5ef7, - 0x4e: 0x5f1f, - 0x4f: 0x608c, - 0x50: 0x62b5, - 0x51: 0x633a, - 0x52: 0x63d0, - 0x53: 0x68af, - 0x54: 0x6c40, - 0x55: 0x7887, - 0x56: 0x798e, - 0x57: 0x7a0b, - 0x58: 0x7de0, - 0x59: 0x8247, - 0x5a: 0x8a02, - 0x5b: 0x8ae6, - 0x5c: 0x8e44, - 0x5d: 0x9013, - }, - 0x24: [94]uint16{ - 0x00: 0x90b8, - 0x01: 0x912d, - 0x02: 0x91d8, - 0x03: 0x9f0e, - 0x04: 0x6ce5, - 0x05: 0x6458, - 0x06: 0x64e2, - 0x07: 0x6575, - 0x08: 0x6ef4, - 0x09: 0x7684, - 0x0a: 0x7b1b, - 0x0b: 0x9069, - 0x0c: 0x93d1, - 0x0d: 0x6eba, - 0x0e: 0x54f2, - 0x0f: 0x5fb9, - 0x10: 0x64a4, - 0x11: 0x8f4d, - 0x12: 0x8fed, - 0x13: 0x9244, - 0x14: 0x5178, - 0x15: 0x586b, - 0x16: 0x5929, - 0x17: 0x5c55, - 0x18: 0x5e97, - 0x19: 0x6dfb, - 0x1a: 0x7e8f, - 0x1b: 0x751c, - 0x1c: 0x8cbc, - 0x1d: 0x8ee2, - 0x1e: 0x985b, - 0x1f: 0x70b9, - 0x20: 0x4f1d, - 0x21: 0x6bbf, - 0x22: 0x6fb1, - 0x23: 0x7530, - 0x24: 0x96fb, - 0x25: 0x514e, - 0x26: 0x5410, - 0x27: 0x5835, - 0x28: 0x5857, - 0x29: 0x59ac, - 0x2a: 0x5c60, - 0x2b: 0x5f92, - 0x2c: 0x6597, - 0x2d: 0x675c, - 0x2e: 0x6e21, - 0x2f: 0x767b, - 0x30: 0x83df, - 0x31: 0x8ced, - 0x32: 0x9014, - 0x33: 0x90fd, - 0x34: 0x934d, - 0x35: 0x7825, - 0x36: 0x783a, - 0x37: 0x52aa, - 0x38: 0x5ea6, - 0x39: 0x571f, - 0x3a: 0x5974, - 0x3b: 0x6012, - 0x3c: 0x5012, - 0x3d: 0x515a, - 0x3e: 0x51ac, - 0x3f: 0x51cd, - 0x40: 0x5200, - 0x41: 0x5510, - 0x42: 0x5854, - 0x43: 0x5858, - 0x44: 0x5957, - 0x45: 0x5b95, - 0x46: 0x5cf6, - 0x47: 0x5d8b, - 0x48: 0x60bc, - 0x49: 0x6295, - 0x4a: 0x642d, - 0x4b: 0x6771, - 0x4c: 0x6843, - 0x4d: 0x68bc, - 0x4e: 0x68df, - 0x4f: 0x76d7, - 0x50: 0x6dd8, - 0x51: 0x6e6f, - 0x52: 0x6d9b, - 0x53: 0x706f, - 0x54: 0x71c8, - 0x55: 0x5f53, - 0x56: 0x75d8, - 0x57: 0x7977, - 0x58: 0x7b49, - 0x59: 0x7b54, - 0x5a: 0x7b52, - 0x5b: 0x7cd6, - 0x5c: 0x7d71, - 0x5d: 0x5230, - }, - 0x25: [94]uint16{ - 0x00: 0x8463, - 0x01: 0x8569, - 0x02: 0x85e4, - 0x03: 0x8a0e, - 0x04: 0x8b04, - 0x05: 0x8c46, - 0x06: 0x8e0f, - 0x07: 0x9003, - 0x08: 0x900f, - 0x09: 0x9419, - 0x0a: 0x9676, - 0x0b: 0x982d, - 0x0c: 0x9a30, - 0x0d: 0x95d8, - 0x0e: 0x50cd, - 0x0f: 0x52d5, - 0x10: 0x540c, - 0x11: 0x5802, - 0x12: 0x5c0e, - 0x13: 0x61a7, - 0x14: 0x649e, - 0x15: 0x6d1e, - 0x16: 0x77b3, - 0x17: 0x7ae5, - 0x18: 0x80f4, - 0x19: 0x8404, - 0x1a: 0x9053, - 0x1b: 0x9285, - 0x1c: 0x5ce0, - 0x1d: 0x9d07, - 0x1e: 0x533f, - 0x1f: 0x5f97, - 0x20: 0x5fb3, - 0x21: 0x6d9c, - 0x22: 0x7279, - 0x23: 0x7763, - 0x24: 0x79bf, - 0x25: 0x7be4, - 0x26: 0x6bd2, - 0x27: 0x72ec, - 0x28: 0x8aad, - 0x29: 0x6803, - 0x2a: 0x6a61, - 0x2b: 0x51f8, - 0x2c: 0x7a81, - 0x2d: 0x6934, - 0x2e: 0x5c4a, - 0x2f: 0x9cf6, - 0x30: 0x82eb, - 0x31: 0x5bc5, - 0x32: 0x9149, - 0x33: 0x701e, - 0x34: 0x5678, - 0x35: 0x5c6f, - 0x36: 0x60c7, - 0x37: 0x6566, - 0x38: 0x6c8c, - 0x39: 0x8c5a, - 0x3a: 0x9041, - 0x3b: 0x9813, - 0x3c: 0x5451, - 0x3d: 0x66c7, - 0x3e: 0x920d, - 0x3f: 0x5948, - 0x40: 0x90a3, - 0x41: 0x5185, - 0x42: 0x4e4d, - 0x43: 0x51ea, - 0x44: 0x8599, - 0x45: 0x8b0e, - 0x46: 0x7058, - 0x47: 0x637a, - 0x48: 0x934b, - 0x49: 0x6962, - 0x4a: 0x99b4, - 0x4b: 0x7e04, - 0x4c: 0x7577, - 0x4d: 0x5357, - 0x4e: 0x6960, - 0x4f: 0x8edf, - 0x50: 0x96e3, - 0x51: 0x6c5d, - 0x52: 0x4e8c, - 0x53: 0x5c3c, - 0x54: 0x5f10, - 0x55: 0x8fe9, - 0x56: 0x5302, - 0x57: 0x8cd1, - 0x58: 0x8089, - 0x59: 0x8679, - 0x5a: 0x5eff, - 0x5b: 0x65e5, - 0x5c: 0x4e73, - 0x5d: 0x5165, - }, - 0x26: [94]uint16{ - 0x00: 0x5982, - 0x01: 0x5c3f, - 0x02: 0x97ee, - 0x03: 0x4efb, - 0x04: 0x598a, - 0x05: 0x5fcd, - 0x06: 0x8a8d, - 0x07: 0x6fe1, - 0x08: 0x79b0, - 0x09: 0x7962, - 0x0a: 0x5be7, - 0x0b: 0x8471, - 0x0c: 0x732b, - 0x0d: 0x71b1, - 0x0e: 0x5e74, - 0x0f: 0x5ff5, - 0x10: 0x637b, - 0x11: 0x649a, - 0x12: 0x71c3, - 0x13: 0x7c98, - 0x14: 0x4e43, - 0x15: 0x5efc, - 0x16: 0x4e4b, - 0x17: 0x57dc, - 0x18: 0x56a2, - 0x19: 0x60a9, - 0x1a: 0x6fc3, - 0x1b: 0x7d0d, - 0x1c: 0x80fd, - 0x1d: 0x8133, - 0x1e: 0x81bf, - 0x1f: 0x8fb2, - 0x20: 0x8997, - 0x21: 0x86a4, - 0x22: 0x5df4, - 0x23: 0x628a, - 0x24: 0x64ad, - 0x25: 0x8987, - 0x26: 0x6777, - 0x27: 0x6ce2, - 0x28: 0x6d3e, - 0x29: 0x7436, - 0x2a: 0x7834, - 0x2b: 0x5a46, - 0x2c: 0x7f75, - 0x2d: 0x82ad, - 0x2e: 0x99ac, - 0x2f: 0x4ff3, - 0x30: 0x5ec3, - 0x31: 0x62dd, - 0x32: 0x6392, - 0x33: 0x6557, - 0x34: 0x676f, - 0x35: 0x76c3, - 0x36: 0x724c, - 0x37: 0x80cc, - 0x38: 0x80ba, - 0x39: 0x8f29, - 0x3a: 0x914d, - 0x3b: 0x500d, - 0x3c: 0x57f9, - 0x3d: 0x5a92, - 0x3e: 0x6885, - 0x3f: 0x6973, - 0x40: 0x7164, - 0x41: 0x72fd, - 0x42: 0x8cb7, - 0x43: 0x58f2, - 0x44: 0x8ce0, - 0x45: 0x966a, - 0x46: 0x9019, - 0x47: 0x877f, - 0x48: 0x79e4, - 0x49: 0x77e7, - 0x4a: 0x8429, - 0x4b: 0x4f2f, - 0x4c: 0x5265, - 0x4d: 0x535a, - 0x4e: 0x62cd, - 0x4f: 0x67cf, - 0x50: 0x6cca, - 0x51: 0x767d, - 0x52: 0x7b94, - 0x53: 0x7c95, - 0x54: 0x8236, - 0x55: 0x8584, - 0x56: 0x8feb, - 0x57: 0x66dd, - 0x58: 0x6f20, - 0x59: 0x7206, - 0x5a: 0x7e1b, - 0x5b: 0x83ab, - 0x5c: 0x99c1, - 0x5d: 0x9ea6, - }, - 0x27: [94]uint16{ - 0x00: 0x51fd, - 0x01: 0x7bb1, - 0x02: 0x7872, - 0x03: 0x7bb8, - 0x04: 0x8087, - 0x05: 0x7b48, - 0x06: 0x6ae8, - 0x07: 0x5e61, - 0x08: 0x808c, - 0x09: 0x7551, - 0x0a: 0x7560, - 0x0b: 0x516b, - 0x0c: 0x9262, - 0x0d: 0x6e8c, - 0x0e: 0x767a, - 0x0f: 0x9197, - 0x10: 0x9aea, - 0x11: 0x4f10, - 0x12: 0x7f70, - 0x13: 0x629c, - 0x14: 0x7b4f, - 0x15: 0x95a5, - 0x16: 0x9ce9, - 0x17: 0x567a, - 0x18: 0x5859, - 0x19: 0x86e4, - 0x1a: 0x96bc, - 0x1b: 0x4f34, - 0x1c: 0x5224, - 0x1d: 0x534a, - 0x1e: 0x53cd, - 0x1f: 0x53db, - 0x20: 0x5e06, - 0x21: 0x642c, - 0x22: 0x6591, - 0x23: 0x677f, - 0x24: 0x6c3e, - 0x25: 0x6c4e, - 0x26: 0x7248, - 0x27: 0x72af, - 0x28: 0x73ed, - 0x29: 0x7554, - 0x2a: 0x7e41, - 0x2b: 0x822c, - 0x2c: 0x85e9, - 0x2d: 0x8ca9, - 0x2e: 0x7bc4, - 0x2f: 0x91c6, - 0x30: 0x7169, - 0x31: 0x9812, - 0x32: 0x98ef, - 0x33: 0x633d, - 0x34: 0x6669, - 0x35: 0x756a, - 0x36: 0x76e4, - 0x37: 0x78d0, - 0x38: 0x8543, - 0x39: 0x86ee, - 0x3a: 0x532a, - 0x3b: 0x5351, - 0x3c: 0x5426, - 0x3d: 0x5983, - 0x3e: 0x5e87, - 0x3f: 0x5f7c, - 0x40: 0x60b2, - 0x41: 0x6249, - 0x42: 0x6279, - 0x43: 0x62ab, - 0x44: 0x6590, - 0x45: 0x6bd4, - 0x46: 0x6ccc, - 0x47: 0x75b2, - 0x48: 0x76ae, - 0x49: 0x7891, - 0x4a: 0x79d8, - 0x4b: 0x7dcb, - 0x4c: 0x7f77, - 0x4d: 0x80a5, - 0x4e: 0x88ab, - 0x4f: 0x8ab9, - 0x50: 0x8cbb, - 0x51: 0x907f, - 0x52: 0x975e, - 0x53: 0x98db, - 0x54: 0x6a0b, - 0x55: 0x7c38, - 0x56: 0x5099, - 0x57: 0x5c3e, - 0x58: 0x5fae, - 0x59: 0x6787, - 0x5a: 0x6bd8, - 0x5b: 0x7435, - 0x5c: 0x7709, - 0x5d: 0x7f8e, - }, - 0x28: [94]uint16{ - 0x00: 0x9f3b, - 0x01: 0x67ca, - 0x02: 0x7a17, - 0x03: 0x5339, - 0x04: 0x758b, - 0x05: 0x9aed, - 0x06: 0x5f66, - 0x07: 0x819d, - 0x08: 0x83f1, - 0x09: 0x8098, - 0x0a: 0x5f3c, - 0x0b: 0x5fc5, - 0x0c: 0x7562, - 0x0d: 0x7b46, - 0x0e: 0x903c, - 0x0f: 0x6867, - 0x10: 0x59eb, - 0x11: 0x5a9b, - 0x12: 0x7d10, - 0x13: 0x767e, - 0x14: 0x8b2c, - 0x15: 0x4ff5, - 0x16: 0x5f6a, - 0x17: 0x6a19, - 0x18: 0x6c37, - 0x19: 0x6f02, - 0x1a: 0x74e2, - 0x1b: 0x7968, - 0x1c: 0x8868, - 0x1d: 0x8a55, - 0x1e: 0x8c79, - 0x1f: 0x5edf, - 0x20: 0x63cf, - 0x21: 0x75c5, - 0x22: 0x79d2, - 0x23: 0x82d7, - 0x24: 0x9328, - 0x25: 0x92f2, - 0x26: 0x849c, - 0x27: 0x86ed, - 0x28: 0x9c2d, - 0x29: 0x54c1, - 0x2a: 0x5f6c, - 0x2b: 0x658c, - 0x2c: 0x6d5c, - 0x2d: 0x7015, - 0x2e: 0x8ca7, - 0x2f: 0x8cd3, - 0x30: 0x983b, - 0x31: 0x654f, - 0x32: 0x74f6, - 0x33: 0x4e0d, - 0x34: 0x4ed8, - 0x35: 0x57e0, - 0x36: 0x592b, - 0x37: 0x5a66, - 0x38: 0x5bcc, - 0x39: 0x51a8, - 0x3a: 0x5e03, - 0x3b: 0x5e9c, - 0x3c: 0x6016, - 0x3d: 0x6276, - 0x3e: 0x6577, - 0x3f: 0x65a7, - 0x40: 0x666e, - 0x41: 0x6d6e, - 0x42: 0x7236, - 0x43: 0x7b26, - 0x44: 0x8150, - 0x45: 0x819a, - 0x46: 0x8299, - 0x47: 0x8b5c, - 0x48: 0x8ca0, - 0x49: 0x8ce6, - 0x4a: 0x8d74, - 0x4b: 0x961c, - 0x4c: 0x9644, - 0x4d: 0x4fae, - 0x4e: 0x64ab, - 0x4f: 0x6b66, - 0x50: 0x821e, - 0x51: 0x8461, - 0x52: 0x856a, - 0x53: 0x90e8, - 0x54: 0x5c01, - 0x55: 0x6953, - 0x56: 0x98a8, - 0x57: 0x847a, - 0x58: 0x8557, - 0x59: 0x4f0f, - 0x5a: 0x526f, - 0x5b: 0x5fa9, - 0x5c: 0x5e45, - 0x5d: 0x670d, - }, - 0x29: [94]uint16{ - 0x00: 0x798f, - 0x01: 0x8179, - 0x02: 0x8907, - 0x03: 0x8986, - 0x04: 0x6df5, - 0x05: 0x5f17, - 0x06: 0x6255, - 0x07: 0x6cb8, - 0x08: 0x4ecf, - 0x09: 0x7269, - 0x0a: 0x9b92, - 0x0b: 0x5206, - 0x0c: 0x543b, - 0x0d: 0x5674, - 0x0e: 0x58b3, - 0x0f: 0x61a4, - 0x10: 0x626e, - 0x11: 0x711a, - 0x12: 0x596e, - 0x13: 0x7c89, - 0x14: 0x7cde, - 0x15: 0x7d1b, - 0x16: 0x96f0, - 0x17: 0x6587, - 0x18: 0x805e, - 0x19: 0x4e19, - 0x1a: 0x4f75, - 0x1b: 0x5175, - 0x1c: 0x5840, - 0x1d: 0x5e63, - 0x1e: 0x5e73, - 0x1f: 0x5f0a, - 0x20: 0x67c4, - 0x21: 0x4e26, - 0x22: 0x853d, - 0x23: 0x9589, - 0x24: 0x965b, - 0x25: 0x7c73, - 0x26: 0x9801, - 0x27: 0x50fb, - 0x28: 0x58c1, - 0x29: 0x7656, - 0x2a: 0x78a7, - 0x2b: 0x5225, - 0x2c: 0x77a5, - 0x2d: 0x8511, - 0x2e: 0x7b86, - 0x2f: 0x504f, - 0x30: 0x5909, - 0x31: 0x7247, - 0x32: 0x7bc7, - 0x33: 0x7de8, - 0x34: 0x8fba, - 0x35: 0x8fd4, - 0x36: 0x904d, - 0x37: 0x4fbf, - 0x38: 0x52c9, - 0x39: 0x5a29, - 0x3a: 0x5f01, - 0x3b: 0x97ad, - 0x3c: 0x4fdd, - 0x3d: 0x8217, - 0x3e: 0x92ea, - 0x3f: 0x5703, - 0x40: 0x6355, - 0x41: 0x6b69, - 0x42: 0x752b, - 0x43: 0x88dc, - 0x44: 0x8f14, - 0x45: 0x7a42, - 0x46: 0x52df, - 0x47: 0x5893, - 0x48: 0x6155, - 0x49: 0x620a, - 0x4a: 0x66ae, - 0x4b: 0x6bcd, - 0x4c: 0x7c3f, - 0x4d: 0x83e9, - 0x4e: 0x5023, - 0x4f: 0x4ff8, - 0x50: 0x5305, - 0x51: 0x5446, - 0x52: 0x5831, - 0x53: 0x5949, - 0x54: 0x5b9d, - 0x55: 0x5cf0, - 0x56: 0x5cef, - 0x57: 0x5d29, - 0x58: 0x5e96, - 0x59: 0x62b1, - 0x5a: 0x6367, - 0x5b: 0x653e, - 0x5c: 0x65b9, - 0x5d: 0x670b, - }, - 0x2a: [94]uint16{ - 0x00: 0x6cd5, - 0x01: 0x6ce1, - 0x02: 0x70f9, - 0x03: 0x7832, - 0x04: 0x7e2b, - 0x05: 0x80de, - 0x06: 0x82b3, - 0x07: 0x840c, - 0x08: 0x84ec, - 0x09: 0x8702, - 0x0a: 0x8912, - 0x0b: 0x8a2a, - 0x0c: 0x8c4a, - 0x0d: 0x90a6, - 0x0e: 0x92d2, - 0x0f: 0x98fd, - 0x10: 0x9cf3, - 0x11: 0x9d6c, - 0x12: 0x4e4f, - 0x13: 0x4ea1, - 0x14: 0x508d, - 0x15: 0x5256, - 0x16: 0x574a, - 0x17: 0x59a8, - 0x18: 0x5e3d, - 0x19: 0x5fd8, - 0x1a: 0x5fd9, - 0x1b: 0x623f, - 0x1c: 0x66b4, - 0x1d: 0x671b, - 0x1e: 0x67d0, - 0x1f: 0x68d2, - 0x20: 0x5192, - 0x21: 0x7d21, - 0x22: 0x80aa, - 0x23: 0x81a8, - 0x24: 0x8b00, - 0x25: 0x8c8c, - 0x26: 0x8cbf, - 0x27: 0x927e, - 0x28: 0x9632, - 0x29: 0x5420, - 0x2a: 0x982c, - 0x2b: 0x5317, - 0x2c: 0x50d5, - 0x2d: 0x535c, - 0x2e: 0x58a8, - 0x2f: 0x64b2, - 0x30: 0x6734, - 0x31: 0x7267, - 0x32: 0x7766, - 0x33: 0x7a46, - 0x34: 0x91e6, - 0x35: 0x52c3, - 0x36: 0x6ca1, - 0x37: 0x6b86, - 0x38: 0x5800, - 0x39: 0x5e4c, - 0x3a: 0x5954, - 0x3b: 0x672c, - 0x3c: 0x7ffb, - 0x3d: 0x51e1, - 0x3e: 0x76c6, - 0x3f: 0x6469, - 0x40: 0x78e8, - 0x41: 0x9b54, - 0x42: 0x9ebb, - 0x43: 0x57cb, - 0x44: 0x59b9, - 0x45: 0x6627, - 0x46: 0x679a, - 0x47: 0x6bce, - 0x48: 0x54e9, - 0x49: 0x69d9, - 0x4a: 0x5e55, - 0x4b: 0x819c, - 0x4c: 0x6795, - 0x4d: 0x9baa, - 0x4e: 0x67fe, - 0x4f: 0x9c52, - 0x50: 0x685d, - 0x51: 0x4ea6, - 0x52: 0x4fe3, - 0x53: 0x53c8, - 0x54: 0x62b9, - 0x55: 0x672b, - 0x56: 0x6cab, - 0x57: 0x8fc4, - 0x58: 0x4fad, - 0x59: 0x7e6d, - 0x5a: 0x9ebf, - 0x5b: 0x4e07, - 0x5c: 0x6162, - 0x5d: 0x6e80, - }, - 0x2b: [94]uint16{ - 0x00: 0x6f2b, - 0x01: 0x8513, - 0x02: 0x5473, - 0x03: 0x672a, - 0x04: 0x9b45, - 0x05: 0x5df3, - 0x06: 0x7b95, - 0x07: 0x5cac, - 0x08: 0x5bc6, - 0x09: 0x871c, - 0x0a: 0x6e4a, - 0x0b: 0x84d1, - 0x0c: 0x7a14, - 0x0d: 0x8108, - 0x0e: 0x5999, - 0x0f: 0x7c8d, - 0x10: 0x6c11, - 0x11: 0x7720, - 0x12: 0x52d9, - 0x13: 0x5922, - 0x14: 0x7121, - 0x15: 0x725f, - 0x16: 0x77db, - 0x17: 0x9727, - 0x18: 0x9d61, - 0x19: 0x690b, - 0x1a: 0x5a7f, - 0x1b: 0x5a18, - 0x1c: 0x51a5, - 0x1d: 0x540d, - 0x1e: 0x547d, - 0x1f: 0x660e, - 0x20: 0x76df, - 0x21: 0x8ff7, - 0x22: 0x9298, - 0x23: 0x9cf4, - 0x24: 0x59ea, - 0x25: 0x725d, - 0x26: 0x6ec5, - 0x27: 0x514d, - 0x28: 0x68c9, - 0x29: 0x7dbf, - 0x2a: 0x7dec, - 0x2b: 0x9762, - 0x2c: 0x9eba, - 0x2d: 0x6478, - 0x2e: 0x6a21, - 0x2f: 0x8302, - 0x30: 0x5984, - 0x31: 0x5b5f, - 0x32: 0x6bdb, - 0x33: 0x731b, - 0x34: 0x76f2, - 0x35: 0x7db2, - 0x36: 0x8017, - 0x37: 0x8499, - 0x38: 0x5132, - 0x39: 0x6728, - 0x3a: 0x9ed9, - 0x3b: 0x76ee, - 0x3c: 0x6762, - 0x3d: 0x52ff, - 0x3e: 0x9905, - 0x3f: 0x5c24, - 0x40: 0x623b, - 0x41: 0x7c7e, - 0x42: 0x8cb0, - 0x43: 0x554f, - 0x44: 0x60b6, - 0x45: 0x7d0b, - 0x46: 0x9580, - 0x47: 0x5301, - 0x48: 0x4e5f, - 0x49: 0x51b6, - 0x4a: 0x591c, - 0x4b: 0x723a, - 0x4c: 0x8036, - 0x4d: 0x91ce, - 0x4e: 0x5f25, - 0x4f: 0x77e2, - 0x50: 0x5384, - 0x51: 0x5f79, - 0x52: 0x7d04, - 0x53: 0x85ac, - 0x54: 0x8a33, - 0x55: 0x8e8d, - 0x56: 0x9756, - 0x57: 0x67f3, - 0x58: 0x85ae, - 0x59: 0x9453, - 0x5a: 0x6109, - 0x5b: 0x6108, - 0x5c: 0x6cb9, - 0x5d: 0x7652, - }, - 0x2c: [94]uint16{ - 0x00: 0x8aed, - 0x01: 0x8f38, - 0x02: 0x552f, - 0x03: 0x4f51, - 0x04: 0x512a, - 0x05: 0x52c7, - 0x06: 0x53cb, - 0x07: 0x5ba5, - 0x08: 0x5e7d, - 0x09: 0x60a0, - 0x0a: 0x6182, - 0x0b: 0x63d6, - 0x0c: 0x6709, - 0x0d: 0x67da, - 0x0e: 0x6e67, - 0x0f: 0x6d8c, - 0x10: 0x7336, - 0x11: 0x7337, - 0x12: 0x7531, - 0x13: 0x7950, - 0x14: 0x88d5, - 0x15: 0x8a98, - 0x16: 0x904a, - 0x17: 0x9091, - 0x18: 0x90f5, - 0x19: 0x96c4, - 0x1a: 0x878d, - 0x1b: 0x5915, - 0x1c: 0x4e88, - 0x1d: 0x4f59, - 0x1e: 0x4e0e, - 0x1f: 0x8a89, - 0x20: 0x8f3f, - 0x21: 0x9810, - 0x22: 0x50ad, - 0x23: 0x5e7c, - 0x24: 0x5996, - 0x25: 0x5bb9, - 0x26: 0x5eb8, - 0x27: 0x63da, - 0x28: 0x63fa, - 0x29: 0x64c1, - 0x2a: 0x66dc, - 0x2b: 0x694a, - 0x2c: 0x69d8, - 0x2d: 0x6d0b, - 0x2e: 0x6eb6, - 0x2f: 0x7194, - 0x30: 0x7528, - 0x31: 0x7aaf, - 0x32: 0x7f8a, - 0x33: 0x8000, - 0x34: 0x8449, - 0x35: 0x84c9, - 0x36: 0x8981, - 0x37: 0x8b21, - 0x38: 0x8e0a, - 0x39: 0x9065, - 0x3a: 0x967d, - 0x3b: 0x990a, - 0x3c: 0x617e, - 0x3d: 0x6291, - 0x3e: 0x6b32, - 0x3f: 0x6c83, - 0x40: 0x6d74, - 0x41: 0x7fcc, - 0x42: 0x7ffc, - 0x43: 0x6dc0, - 0x44: 0x7f85, - 0x45: 0x87ba, - 0x46: 0x88f8, - 0x47: 0x6765, - 0x48: 0x83b1, - 0x49: 0x983c, - 0x4a: 0x96f7, - 0x4b: 0x6d1b, - 0x4c: 0x7d61, - 0x4d: 0x843d, - 0x4e: 0x916a, - 0x4f: 0x4e71, - 0x50: 0x5375, - 0x51: 0x5d50, - 0x52: 0x6b04, - 0x53: 0x6feb, - 0x54: 0x85cd, - 0x55: 0x862d, - 0x56: 0x89a7, - 0x57: 0x5229, - 0x58: 0x540f, - 0x59: 0x5c65, - 0x5a: 0x674e, - 0x5b: 0x68a8, - 0x5c: 0x7406, - 0x5d: 0x7483, - }, - 0x2d: [94]uint16{ - 0x00: 0x75e2, - 0x01: 0x88cf, - 0x02: 0x88e1, - 0x03: 0x91cc, - 0x04: 0x96e2, - 0x05: 0x9678, - 0x06: 0x5f8b, - 0x07: 0x7387, - 0x08: 0x7acb, - 0x09: 0x844e, - 0x0a: 0x63a0, - 0x0b: 0x7565, - 0x0c: 0x5289, - 0x0d: 0x6d41, - 0x0e: 0x6e9c, - 0x0f: 0x7409, - 0x10: 0x7559, - 0x11: 0x786b, - 0x12: 0x7c92, - 0x13: 0x9686, - 0x14: 0x7adc, - 0x15: 0x9f8d, - 0x16: 0x4fb6, - 0x17: 0x616e, - 0x18: 0x65c5, - 0x19: 0x865c, - 0x1a: 0x4e86, - 0x1b: 0x4eae, - 0x1c: 0x50da, - 0x1d: 0x4e21, - 0x1e: 0x51cc, - 0x1f: 0x5bee, - 0x20: 0x6599, - 0x21: 0x6881, - 0x22: 0x6dbc, - 0x23: 0x731f, - 0x24: 0x7642, - 0x25: 0x77ad, - 0x26: 0x7a1c, - 0x27: 0x7ce7, - 0x28: 0x826f, - 0x29: 0x8ad2, - 0x2a: 0x907c, - 0x2b: 0x91cf, - 0x2c: 0x9675, - 0x2d: 0x9818, - 0x2e: 0x529b, - 0x2f: 0x7dd1, - 0x30: 0x502b, - 0x31: 0x5398, - 0x32: 0x6797, - 0x33: 0x6dcb, - 0x34: 0x71d0, - 0x35: 0x7433, - 0x36: 0x81e8, - 0x37: 0x8f2a, - 0x38: 0x96a3, - 0x39: 0x9c57, - 0x3a: 0x9e9f, - 0x3b: 0x7460, - 0x3c: 0x5841, - 0x3d: 0x6d99, - 0x3e: 0x7d2f, - 0x3f: 0x985e, - 0x40: 0x4ee4, - 0x41: 0x4f36, - 0x42: 0x4f8b, - 0x43: 0x51b7, - 0x44: 0x52b1, - 0x45: 0x5dba, - 0x46: 0x601c, - 0x47: 0x73b2, - 0x48: 0x793c, - 0x49: 0x82d3, - 0x4a: 0x9234, - 0x4b: 0x96b7, - 0x4c: 0x96f6, - 0x4d: 0x970a, - 0x4e: 0x9e97, - 0x4f: 0x9f62, - 0x50: 0x66a6, - 0x51: 0x6b74, - 0x52: 0x5217, - 0x53: 0x52a3, - 0x54: 0x70c8, - 0x55: 0x88c2, - 0x56: 0x5ec9, - 0x57: 0x604b, - 0x58: 0x6190, - 0x59: 0x6f23, - 0x5a: 0x7149, - 0x5b: 0x7c3e, - 0x5c: 0x7df4, - 0x5d: 0x806f, - }, - 0x2e: [94]uint16{ - 0x00: 0x84ee, - 0x01: 0x9023, - 0x02: 0x932c, - 0x03: 0x5442, - 0x04: 0x9b6f, - 0x05: 0x6ad3, - 0x06: 0x7089, - 0x07: 0x8cc2, - 0x08: 0x8def, - 0x09: 0x9732, - 0x0a: 0x52b4, - 0x0b: 0x5a41, - 0x0c: 0x5eca, - 0x0d: 0x5f04, - 0x0e: 0x6717, - 0x0f: 0x697c, - 0x10: 0x6994, - 0x11: 0x6d6a, - 0x12: 0x6f0f, - 0x13: 0x7262, - 0x14: 0x72fc, - 0x15: 0x7bed, - 0x16: 0x8001, - 0x17: 0x807e, - 0x18: 0x874b, - 0x19: 0x90ce, - 0x1a: 0x516d, - 0x1b: 0x9e93, - 0x1c: 0x7984, - 0x1d: 0x808b, - 0x1e: 0x9332, - 0x1f: 0x8ad6, - 0x20: 0x502d, - 0x21: 0x548c, - 0x22: 0x8a71, - 0x23: 0x6b6a, - 0x24: 0x8cc4, - 0x25: 0x8107, - 0x26: 0x60d1, - 0x27: 0x67a0, - 0x28: 0x9df2, - 0x29: 0x4e99, - 0x2a: 0x4e98, - 0x2b: 0x9c10, - 0x2c: 0x8a6b, - 0x2d: 0x85c1, - 0x2e: 0x8568, - 0x2f: 0x6900, - 0x30: 0x6e7e, - 0x31: 0x7897, - 0x32: 0x8155, - }, - 0x2f: [94]uint16{ - 0x00: 0x5f0c, - 0x01: 0x4e10, - 0x02: 0x4e15, - 0x03: 0x4e2a, - 0x04: 0x4e31, - 0x05: 0x4e36, - 0x06: 0x4e3c, - 0x07: 0x4e3f, - 0x08: 0x4e42, - 0x09: 0x4e56, - 0x0a: 0x4e58, - 0x0b: 0x4e82, - 0x0c: 0x4e85, - 0x0d: 0x8c6b, - 0x0e: 0x4e8a, - 0x0f: 0x8212, - 0x10: 0x5f0d, - 0x11: 0x4e8e, - 0x12: 0x4e9e, - 0x13: 0x4e9f, - 0x14: 0x4ea0, - 0x15: 0x4ea2, - 0x16: 0x4eb0, - 0x17: 0x4eb3, - 0x18: 0x4eb6, - 0x19: 0x4ece, - 0x1a: 0x4ecd, - 0x1b: 0x4ec4, - 0x1c: 0x4ec6, - 0x1d: 0x4ec2, - 0x1e: 0x4ed7, - 0x1f: 0x4ede, - 0x20: 0x4eed, - 0x21: 0x4edf, - 0x22: 0x4ef7, - 0x23: 0x4f09, - 0x24: 0x4f5a, - 0x25: 0x4f30, - 0x26: 0x4f5b, - 0x27: 0x4f5d, - 0x28: 0x4f57, - 0x29: 0x4f47, - 0x2a: 0x4f76, - 0x2b: 0x4f88, - 0x2c: 0x4f8f, - 0x2d: 0x4f98, - 0x2e: 0x4f7b, - 0x2f: 0x4f69, - 0x30: 0x4f70, - 0x31: 0x4f91, - 0x32: 0x4f6f, - 0x33: 0x4f86, - 0x34: 0x4f96, - 0x35: 0x5118, - 0x36: 0x4fd4, - 0x37: 0x4fdf, - 0x38: 0x4fce, - 0x39: 0x4fd8, - 0x3a: 0x4fdb, - 0x3b: 0x4fd1, - 0x3c: 0x4fda, - 0x3d: 0x4fd0, - 0x3e: 0x4fe4, - 0x3f: 0x4fe5, - 0x40: 0x501a, - 0x41: 0x5028, - 0x42: 0x5014, - 0x43: 0x502a, - 0x44: 0x5025, - 0x45: 0x5005, - 0x46: 0x4f1c, - 0x47: 0x4ff6, - 0x48: 0x5021, - 0x49: 0x5029, - 0x4a: 0x502c, - 0x4b: 0x4ffe, - 0x4c: 0x4fef, - 0x4d: 0x5011, - 0x4e: 0x5006, - 0x4f: 0x5043, - 0x50: 0x5047, - 0x51: 0x6703, - 0x52: 0x5055, - 0x53: 0x5050, - 0x54: 0x5048, - 0x55: 0x505a, - 0x56: 0x5056, - 0x57: 0x506c, - 0x58: 0x5078, - 0x59: 0x5080, - 0x5a: 0x509a, - 0x5b: 0x5085, - 0x5c: 0x50b4, - 0x5d: 0x50b2, - }, - 0x30: [94]uint16{ - 0x00: 0x50c9, - 0x01: 0x50ca, - 0x02: 0x50b3, - 0x03: 0x50c2, - 0x04: 0x50d6, - 0x05: 0x50de, - 0x06: 0x50e5, - 0x07: 0x50ed, - 0x08: 0x50e3, - 0x09: 0x50ee, - 0x0a: 0x50f9, - 0x0b: 0x50f5, - 0x0c: 0x5109, - 0x0d: 0x5101, - 0x0e: 0x5102, - 0x0f: 0x5116, - 0x10: 0x5115, - 0x11: 0x5114, - 0x12: 0x511a, - 0x13: 0x5121, - 0x14: 0x513a, - 0x15: 0x5137, - 0x16: 0x513c, - 0x17: 0x513b, - 0x18: 0x513f, - 0x19: 0x5140, - 0x1a: 0x5152, - 0x1b: 0x514c, - 0x1c: 0x5154, - 0x1d: 0x5162, - 0x1e: 0x7af8, - 0x1f: 0x5169, - 0x20: 0x516a, - 0x21: 0x516e, - 0x22: 0x5180, - 0x23: 0x5182, - 0x24: 0x56d8, - 0x25: 0x518c, - 0x26: 0x5189, - 0x27: 0x518f, - 0x28: 0x5191, - 0x29: 0x5193, - 0x2a: 0x5195, - 0x2b: 0x5196, - 0x2c: 0x51a4, - 0x2d: 0x51a6, - 0x2e: 0x51a2, - 0x2f: 0x51a9, - 0x30: 0x51aa, - 0x31: 0x51ab, - 0x32: 0x51b3, - 0x33: 0x51b1, - 0x34: 0x51b2, - 0x35: 0x51b0, - 0x36: 0x51b5, - 0x37: 0x51bd, - 0x38: 0x51c5, - 0x39: 0x51c9, - 0x3a: 0x51db, - 0x3b: 0x51e0, - 0x3c: 0x8655, - 0x3d: 0x51e9, - 0x3e: 0x51ed, - 0x3f: 0x51f0, - 0x40: 0x51f5, - 0x41: 0x51fe, - 0x42: 0x5204, - 0x43: 0x520b, - 0x44: 0x5214, - 0x45: 0x520e, - 0x46: 0x5227, - 0x47: 0x522a, - 0x48: 0x522e, - 0x49: 0x5233, - 0x4a: 0x5239, - 0x4b: 0x524f, - 0x4c: 0x5244, - 0x4d: 0x524b, - 0x4e: 0x524c, - 0x4f: 0x525e, - 0x50: 0x5254, - 0x51: 0x526a, - 0x52: 0x5274, - 0x53: 0x5269, - 0x54: 0x5273, - 0x55: 0x527f, - 0x56: 0x527d, - 0x57: 0x528d, - 0x58: 0x5294, - 0x59: 0x5292, - 0x5a: 0x5271, - 0x5b: 0x5288, - 0x5c: 0x5291, - 0x5d: 0x8fa8, - }, - 0x31: [94]uint16{ - 0x00: 0x8fa7, - 0x01: 0x52ac, - 0x02: 0x52ad, - 0x03: 0x52bc, - 0x04: 0x52b5, - 0x05: 0x52c1, - 0x06: 0x52cd, - 0x07: 0x52d7, - 0x08: 0x52de, - 0x09: 0x52e3, - 0x0a: 0x52e6, - 0x0b: 0x98ed, - 0x0c: 0x52e0, - 0x0d: 0x52f3, - 0x0e: 0x52f5, - 0x0f: 0x52f8, - 0x10: 0x52f9, - 0x11: 0x5306, - 0x12: 0x5308, - 0x13: 0x7538, - 0x14: 0x530d, - 0x15: 0x5310, - 0x16: 0x530f, - 0x17: 0x5315, - 0x18: 0x531a, - 0x19: 0x5323, - 0x1a: 0x532f, - 0x1b: 0x5331, - 0x1c: 0x5333, - 0x1d: 0x5338, - 0x1e: 0x5340, - 0x1f: 0x5346, - 0x20: 0x5345, - 0x21: 0x4e17, - 0x22: 0x5349, - 0x23: 0x534d, - 0x24: 0x51d6, - 0x25: 0x535e, - 0x26: 0x5369, - 0x27: 0x536e, - 0x28: 0x5918, - 0x29: 0x537b, - 0x2a: 0x5377, - 0x2b: 0x5382, - 0x2c: 0x5396, - 0x2d: 0x53a0, - 0x2e: 0x53a6, - 0x2f: 0x53a5, - 0x30: 0x53ae, - 0x31: 0x53b0, - 0x32: 0x53b6, - 0x33: 0x53c3, - 0x34: 0x7c12, - 0x35: 0x96d9, - 0x36: 0x53df, - 0x37: 0x66fc, - 0x38: 0x71ee, - 0x39: 0x53ee, - 0x3a: 0x53e8, - 0x3b: 0x53ed, - 0x3c: 0x53fa, - 0x3d: 0x5401, - 0x3e: 0x543d, - 0x3f: 0x5440, - 0x40: 0x542c, - 0x41: 0x542d, - 0x42: 0x543c, - 0x43: 0x542e, - 0x44: 0x5436, - 0x45: 0x5429, - 0x46: 0x541d, - 0x47: 0x544e, - 0x48: 0x548f, - 0x49: 0x5475, - 0x4a: 0x548e, - 0x4b: 0x545f, - 0x4c: 0x5471, - 0x4d: 0x5477, - 0x4e: 0x5470, - 0x4f: 0x5492, - 0x50: 0x547b, - 0x51: 0x5480, - 0x52: 0x5476, - 0x53: 0x5484, - 0x54: 0x5490, - 0x55: 0x5486, - 0x56: 0x54c7, - 0x57: 0x54a2, - 0x58: 0x54b8, - 0x59: 0x54a5, - 0x5a: 0x54ac, - 0x5b: 0x54c4, - 0x5c: 0x54c8, - 0x5d: 0x54a8, - }, - 0x32: [94]uint16{ - 0x00: 0x54ab, - 0x01: 0x54c2, - 0x02: 0x54a4, - 0x03: 0x54be, - 0x04: 0x54bc, - 0x05: 0x54d8, - 0x06: 0x54e5, - 0x07: 0x54e6, - 0x08: 0x550f, - 0x09: 0x5514, - 0x0a: 0x54fd, - 0x0b: 0x54ee, - 0x0c: 0x54ed, - 0x0d: 0x54fa, - 0x0e: 0x54e2, - 0x0f: 0x5539, - 0x10: 0x5540, - 0x11: 0x5563, - 0x12: 0x554c, - 0x13: 0x552e, - 0x14: 0x555c, - 0x15: 0x5545, - 0x16: 0x5556, - 0x17: 0x5557, - 0x18: 0x5538, - 0x19: 0x5533, - 0x1a: 0x555d, - 0x1b: 0x5599, - 0x1c: 0x5580, - 0x1d: 0x54af, - 0x1e: 0x558a, - 0x1f: 0x559f, - 0x20: 0x557b, - 0x21: 0x557e, - 0x22: 0x5598, - 0x23: 0x559e, - 0x24: 0x55ae, - 0x25: 0x557c, - 0x26: 0x5583, - 0x27: 0x55a9, - 0x28: 0x5587, - 0x29: 0x55a8, - 0x2a: 0x55da, - 0x2b: 0x55c5, - 0x2c: 0x55df, - 0x2d: 0x55c4, - 0x2e: 0x55dc, - 0x2f: 0x55e4, - 0x30: 0x55d4, - 0x31: 0x5614, - 0x32: 0x55f7, - 0x33: 0x5616, - 0x34: 0x55fe, - 0x35: 0x55fd, - 0x36: 0x561b, - 0x37: 0x55f9, - 0x38: 0x564e, - 0x39: 0x5650, - 0x3a: 0x71df, - 0x3b: 0x5634, - 0x3c: 0x5636, - 0x3d: 0x5632, - 0x3e: 0x5638, - 0x3f: 0x566b, - 0x40: 0x5664, - 0x41: 0x562f, - 0x42: 0x566c, - 0x43: 0x566a, - 0x44: 0x5686, - 0x45: 0x5680, - 0x46: 0x568a, - 0x47: 0x56a0, - 0x48: 0x5694, - 0x49: 0x568f, - 0x4a: 0x56a5, - 0x4b: 0x56ae, - 0x4c: 0x56b6, - 0x4d: 0x56b4, - 0x4e: 0x56c2, - 0x4f: 0x56bc, - 0x50: 0x56c1, - 0x51: 0x56c3, - 0x52: 0x56c0, - 0x53: 0x56c8, - 0x54: 0x56ce, - 0x55: 0x56d1, - 0x56: 0x56d3, - 0x57: 0x56d7, - 0x58: 0x56ee, - 0x59: 0x56f9, - 0x5a: 0x5700, - 0x5b: 0x56ff, - 0x5c: 0x5704, - 0x5d: 0x5709, - }, - 0x33: [94]uint16{ - 0x00: 0x5708, - 0x01: 0x570b, - 0x02: 0x570d, - 0x03: 0x5713, - 0x04: 0x5718, - 0x05: 0x5716, - 0x06: 0x55c7, - 0x07: 0x571c, - 0x08: 0x5726, - 0x09: 0x5737, - 0x0a: 0x5738, - 0x0b: 0x574e, - 0x0c: 0x573b, - 0x0d: 0x5740, - 0x0e: 0x574f, - 0x0f: 0x5769, - 0x10: 0x57c0, - 0x11: 0x5788, - 0x12: 0x5761, - 0x13: 0x577f, - 0x14: 0x5789, - 0x15: 0x5793, - 0x16: 0x57a0, - 0x17: 0x57b3, - 0x18: 0x57a4, - 0x19: 0x57aa, - 0x1a: 0x57b0, - 0x1b: 0x57c3, - 0x1c: 0x57c6, - 0x1d: 0x57d4, - 0x1e: 0x57d2, - 0x1f: 0x57d3, - 0x20: 0x580a, - 0x21: 0x57d6, - 0x22: 0x57e3, - 0x23: 0x580b, - 0x24: 0x5819, - 0x25: 0x581d, - 0x26: 0x5872, - 0x27: 0x5821, - 0x28: 0x5862, - 0x29: 0x584b, - 0x2a: 0x5870, - 0x2b: 0x6bc0, - 0x2c: 0x5852, - 0x2d: 0x583d, - 0x2e: 0x5879, - 0x2f: 0x5885, - 0x30: 0x58b9, - 0x31: 0x589f, - 0x32: 0x58ab, - 0x33: 0x58ba, - 0x34: 0x58de, - 0x35: 0x58bb, - 0x36: 0x58b8, - 0x37: 0x58ae, - 0x38: 0x58c5, - 0x39: 0x58d3, - 0x3a: 0x58d1, - 0x3b: 0x58d7, - 0x3c: 0x58d9, - 0x3d: 0x58d8, - 0x3e: 0x58e5, - 0x3f: 0x58dc, - 0x40: 0x58e4, - 0x41: 0x58df, - 0x42: 0x58ef, - 0x43: 0x58fa, - 0x44: 0x58f9, - 0x45: 0x58fb, - 0x46: 0x58fc, - 0x47: 0x58fd, - 0x48: 0x5902, - 0x49: 0x590a, - 0x4a: 0x5910, - 0x4b: 0x591b, - 0x4c: 0x68a6, - 0x4d: 0x5925, - 0x4e: 0x592c, - 0x4f: 0x592d, - 0x50: 0x5932, - 0x51: 0x5938, - 0x52: 0x593e, - 0x53: 0x7ad2, - 0x54: 0x5955, - 0x55: 0x5950, - 0x56: 0x594e, - 0x57: 0x595a, - 0x58: 0x5958, - 0x59: 0x5962, - 0x5a: 0x5960, - 0x5b: 0x5967, - 0x5c: 0x596c, - 0x5d: 0x5969, - }, - 0x34: [94]uint16{ - 0x00: 0x5978, - 0x01: 0x5981, - 0x02: 0x599d, - 0x03: 0x4f5e, - 0x04: 0x4fab, - 0x05: 0x59a3, - 0x06: 0x59b2, - 0x07: 0x59c6, - 0x08: 0x59e8, - 0x09: 0x59dc, - 0x0a: 0x598d, - 0x0b: 0x59d9, - 0x0c: 0x59da, - 0x0d: 0x5a25, - 0x0e: 0x5a1f, - 0x0f: 0x5a11, - 0x10: 0x5a1c, - 0x11: 0x5a09, - 0x12: 0x5a1a, - 0x13: 0x5a40, - 0x14: 0x5a6c, - 0x15: 0x5a49, - 0x16: 0x5a35, - 0x17: 0x5a36, - 0x18: 0x5a62, - 0x19: 0x5a6a, - 0x1a: 0x5a9a, - 0x1b: 0x5abc, - 0x1c: 0x5abe, - 0x1d: 0x5acb, - 0x1e: 0x5ac2, - 0x1f: 0x5abd, - 0x20: 0x5ae3, - 0x21: 0x5ad7, - 0x22: 0x5ae6, - 0x23: 0x5ae9, - 0x24: 0x5ad6, - 0x25: 0x5afa, - 0x26: 0x5afb, - 0x27: 0x5b0c, - 0x28: 0x5b0b, - 0x29: 0x5b16, - 0x2a: 0x5b32, - 0x2b: 0x5ad0, - 0x2c: 0x5b2a, - 0x2d: 0x5b36, - 0x2e: 0x5b3e, - 0x2f: 0x5b43, - 0x30: 0x5b45, - 0x31: 0x5b40, - 0x32: 0x5b51, - 0x33: 0x5b55, - 0x34: 0x5b5a, - 0x35: 0x5b5b, - 0x36: 0x5b65, - 0x37: 0x5b69, - 0x38: 0x5b70, - 0x39: 0x5b73, - 0x3a: 0x5b75, - 0x3b: 0x5b78, - 0x3c: 0x6588, - 0x3d: 0x5b7a, - 0x3e: 0x5b80, - 0x3f: 0x5b83, - 0x40: 0x5ba6, - 0x41: 0x5bb8, - 0x42: 0x5bc3, - 0x43: 0x5bc7, - 0x44: 0x5bc9, - 0x45: 0x5bd4, - 0x46: 0x5bd0, - 0x47: 0x5be4, - 0x48: 0x5be6, - 0x49: 0x5be2, - 0x4a: 0x5bde, - 0x4b: 0x5be5, - 0x4c: 0x5beb, - 0x4d: 0x5bf0, - 0x4e: 0x5bf6, - 0x4f: 0x5bf3, - 0x50: 0x5c05, - 0x51: 0x5c07, - 0x52: 0x5c08, - 0x53: 0x5c0d, - 0x54: 0x5c13, - 0x55: 0x5c20, - 0x56: 0x5c22, - 0x57: 0x5c28, - 0x58: 0x5c38, - 0x59: 0x5c39, - 0x5a: 0x5c41, - 0x5b: 0x5c46, - 0x5c: 0x5c4e, - 0x5d: 0x5c53, - }, - 0x35: [94]uint16{ - 0x00: 0x5c50, - 0x01: 0x5c4f, - 0x02: 0x5b71, - 0x03: 0x5c6c, - 0x04: 0x5c6e, - 0x05: 0x4e62, - 0x06: 0x5c76, - 0x07: 0x5c79, - 0x08: 0x5c8c, - 0x09: 0x5c91, - 0x0a: 0x5c94, - 0x0b: 0x599b, - 0x0c: 0x5cab, - 0x0d: 0x5cbb, - 0x0e: 0x5cb6, - 0x0f: 0x5cbc, - 0x10: 0x5cb7, - 0x11: 0x5cc5, - 0x12: 0x5cbe, - 0x13: 0x5cc7, - 0x14: 0x5cd9, - 0x15: 0x5ce9, - 0x16: 0x5cfd, - 0x17: 0x5cfa, - 0x18: 0x5ced, - 0x19: 0x5d8c, - 0x1a: 0x5cea, - 0x1b: 0x5d0b, - 0x1c: 0x5d15, - 0x1d: 0x5d17, - 0x1e: 0x5d5c, - 0x1f: 0x5d1f, - 0x20: 0x5d1b, - 0x21: 0x5d11, - 0x22: 0x5d14, - 0x23: 0x5d22, - 0x24: 0x5d1a, - 0x25: 0x5d19, - 0x26: 0x5d18, - 0x27: 0x5d4c, - 0x28: 0x5d52, - 0x29: 0x5d4e, - 0x2a: 0x5d4b, - 0x2b: 0x5d6c, - 0x2c: 0x5d73, - 0x2d: 0x5d76, - 0x2e: 0x5d87, - 0x2f: 0x5d84, - 0x30: 0x5d82, - 0x31: 0x5da2, - 0x32: 0x5d9d, - 0x33: 0x5dac, - 0x34: 0x5dae, - 0x35: 0x5dbd, - 0x36: 0x5d90, - 0x37: 0x5db7, - 0x38: 0x5dbc, - 0x39: 0x5dc9, - 0x3a: 0x5dcd, - 0x3b: 0x5dd3, - 0x3c: 0x5dd2, - 0x3d: 0x5dd6, - 0x3e: 0x5ddb, - 0x3f: 0x5deb, - 0x40: 0x5df2, - 0x41: 0x5df5, - 0x42: 0x5e0b, - 0x43: 0x5e1a, - 0x44: 0x5e19, - 0x45: 0x5e11, - 0x46: 0x5e1b, - 0x47: 0x5e36, - 0x48: 0x5e37, - 0x49: 0x5e44, - 0x4a: 0x5e43, - 0x4b: 0x5e40, - 0x4c: 0x5e4e, - 0x4d: 0x5e57, - 0x4e: 0x5e54, - 0x4f: 0x5e5f, - 0x50: 0x5e62, - 0x51: 0x5e64, - 0x52: 0x5e47, - 0x53: 0x5e75, - 0x54: 0x5e76, - 0x55: 0x5e7a, - 0x56: 0x9ebc, - 0x57: 0x5e7f, - 0x58: 0x5ea0, - 0x59: 0x5ec1, - 0x5a: 0x5ec2, - 0x5b: 0x5ec8, - 0x5c: 0x5ed0, - 0x5d: 0x5ecf, - }, - 0x36: [94]uint16{ - 0x00: 0x5ed6, - 0x01: 0x5ee3, - 0x02: 0x5edd, - 0x03: 0x5eda, - 0x04: 0x5edb, - 0x05: 0x5ee2, - 0x06: 0x5ee1, - 0x07: 0x5ee8, - 0x08: 0x5ee9, - 0x09: 0x5eec, - 0x0a: 0x5ef1, - 0x0b: 0x5ef3, - 0x0c: 0x5ef0, - 0x0d: 0x5ef4, - 0x0e: 0x5ef8, - 0x0f: 0x5efe, - 0x10: 0x5f03, - 0x11: 0x5f09, - 0x12: 0x5f5d, - 0x13: 0x5f5c, - 0x14: 0x5f0b, - 0x15: 0x5f11, - 0x16: 0x5f16, - 0x17: 0x5f29, - 0x18: 0x5f2d, - 0x19: 0x5f38, - 0x1a: 0x5f41, - 0x1b: 0x5f48, - 0x1c: 0x5f4c, - 0x1d: 0x5f4e, - 0x1e: 0x5f2f, - 0x1f: 0x5f51, - 0x20: 0x5f56, - 0x21: 0x5f57, - 0x22: 0x5f59, - 0x23: 0x5f61, - 0x24: 0x5f6d, - 0x25: 0x5f73, - 0x26: 0x5f77, - 0x27: 0x5f83, - 0x28: 0x5f82, - 0x29: 0x5f7f, - 0x2a: 0x5f8a, - 0x2b: 0x5f88, - 0x2c: 0x5f91, - 0x2d: 0x5f87, - 0x2e: 0x5f9e, - 0x2f: 0x5f99, - 0x30: 0x5f98, - 0x31: 0x5fa0, - 0x32: 0x5fa8, - 0x33: 0x5fad, - 0x34: 0x5fbc, - 0x35: 0x5fd6, - 0x36: 0x5ffb, - 0x37: 0x5fe4, - 0x38: 0x5ff8, - 0x39: 0x5ff1, - 0x3a: 0x5fdd, - 0x3b: 0x60b3, - 0x3c: 0x5fff, - 0x3d: 0x6021, - 0x3e: 0x6060, - 0x3f: 0x6019, - 0x40: 0x6010, - 0x41: 0x6029, - 0x42: 0x600e, - 0x43: 0x6031, - 0x44: 0x601b, - 0x45: 0x6015, - 0x46: 0x602b, - 0x47: 0x6026, - 0x48: 0x600f, - 0x49: 0x603a, - 0x4a: 0x605a, - 0x4b: 0x6041, - 0x4c: 0x606a, - 0x4d: 0x6077, - 0x4e: 0x605f, - 0x4f: 0x604a, - 0x50: 0x6046, - 0x51: 0x604d, - 0x52: 0x6063, - 0x53: 0x6043, - 0x54: 0x6064, - 0x55: 0x6042, - 0x56: 0x606c, - 0x57: 0x606b, - 0x58: 0x6059, - 0x59: 0x6081, - 0x5a: 0x608d, - 0x5b: 0x60e7, - 0x5c: 0x6083, - 0x5d: 0x609a, - }, - 0x37: [94]uint16{ - 0x00: 0x6084, - 0x01: 0x609b, - 0x02: 0x6096, - 0x03: 0x6097, - 0x04: 0x6092, - 0x05: 0x60a7, - 0x06: 0x608b, - 0x07: 0x60e1, - 0x08: 0x60b8, - 0x09: 0x60e0, - 0x0a: 0x60d3, - 0x0b: 0x60b4, - 0x0c: 0x5ff0, - 0x0d: 0x60bd, - 0x0e: 0x60c6, - 0x0f: 0x60b5, - 0x10: 0x60d8, - 0x11: 0x614d, - 0x12: 0x6115, - 0x13: 0x6106, - 0x14: 0x60f6, - 0x15: 0x60f7, - 0x16: 0x6100, - 0x17: 0x60f4, - 0x18: 0x60fa, - 0x19: 0x6103, - 0x1a: 0x6121, - 0x1b: 0x60fb, - 0x1c: 0x60f1, - 0x1d: 0x610d, - 0x1e: 0x610e, - 0x1f: 0x6147, - 0x20: 0x613e, - 0x21: 0x6128, - 0x22: 0x6127, - 0x23: 0x614a, - 0x24: 0x613f, - 0x25: 0x613c, - 0x26: 0x612c, - 0x27: 0x6134, - 0x28: 0x613d, - 0x29: 0x6142, - 0x2a: 0x6144, - 0x2b: 0x6173, - 0x2c: 0x6177, - 0x2d: 0x6158, - 0x2e: 0x6159, - 0x2f: 0x615a, - 0x30: 0x616b, - 0x31: 0x6174, - 0x32: 0x616f, - 0x33: 0x6165, - 0x34: 0x6171, - 0x35: 0x615f, - 0x36: 0x615d, - 0x37: 0x6153, - 0x38: 0x6175, - 0x39: 0x6199, - 0x3a: 0x6196, - 0x3b: 0x6187, - 0x3c: 0x61ac, - 0x3d: 0x6194, - 0x3e: 0x619a, - 0x3f: 0x618a, - 0x40: 0x6191, - 0x41: 0x61ab, - 0x42: 0x61ae, - 0x43: 0x61cc, - 0x44: 0x61ca, - 0x45: 0x61c9, - 0x46: 0x61f7, - 0x47: 0x61c8, - 0x48: 0x61c3, - 0x49: 0x61c6, - 0x4a: 0x61ba, - 0x4b: 0x61cb, - 0x4c: 0x7f79, - 0x4d: 0x61cd, - 0x4e: 0x61e6, - 0x4f: 0x61e3, - 0x50: 0x61f6, - 0x51: 0x61fa, - 0x52: 0x61f4, - 0x53: 0x61ff, - 0x54: 0x61fd, - 0x55: 0x61fc, - 0x56: 0x61fe, - 0x57: 0x6200, - 0x58: 0x6208, - 0x59: 0x6209, - 0x5a: 0x620d, - 0x5b: 0x620c, - 0x5c: 0x6214, - 0x5d: 0x621b, - }, - 0x38: [94]uint16{ - 0x00: 0x621e, - 0x01: 0x6221, - 0x02: 0x622a, - 0x03: 0x622e, - 0x04: 0x6230, - 0x05: 0x6232, - 0x06: 0x6233, - 0x07: 0x6241, - 0x08: 0x624e, - 0x09: 0x625e, - 0x0a: 0x6263, - 0x0b: 0x625b, - 0x0c: 0x6260, - 0x0d: 0x6268, - 0x0e: 0x627c, - 0x0f: 0x6282, - 0x10: 0x6289, - 0x11: 0x627e, - 0x12: 0x6292, - 0x13: 0x6293, - 0x14: 0x6296, - 0x15: 0x62d4, - 0x16: 0x6283, - 0x17: 0x6294, - 0x18: 0x62d7, - 0x19: 0x62d1, - 0x1a: 0x62bb, - 0x1b: 0x62cf, - 0x1c: 0x62ff, - 0x1d: 0x62c6, - 0x1e: 0x64d4, - 0x1f: 0x62c8, - 0x20: 0x62dc, - 0x21: 0x62cc, - 0x22: 0x62ca, - 0x23: 0x62c2, - 0x24: 0x62c7, - 0x25: 0x629b, - 0x26: 0x62c9, - 0x27: 0x630c, - 0x28: 0x62ee, - 0x29: 0x62f1, - 0x2a: 0x6327, - 0x2b: 0x6302, - 0x2c: 0x6308, - 0x2d: 0x62ef, - 0x2e: 0x62f5, - 0x2f: 0x6350, - 0x30: 0x633e, - 0x31: 0x634d, - 0x32: 0x641c, - 0x33: 0x634f, - 0x34: 0x6396, - 0x35: 0x638e, - 0x36: 0x6380, - 0x37: 0x63ab, - 0x38: 0x6376, - 0x39: 0x63a3, - 0x3a: 0x638f, - 0x3b: 0x6389, - 0x3c: 0x639f, - 0x3d: 0x63b5, - 0x3e: 0x636b, - 0x3f: 0x6369, - 0x40: 0x63be, - 0x41: 0x63e9, - 0x42: 0x63c0, - 0x43: 0x63c6, - 0x44: 0x63e3, - 0x45: 0x63c9, - 0x46: 0x63d2, - 0x47: 0x63f6, - 0x48: 0x63c4, - 0x49: 0x6416, - 0x4a: 0x6434, - 0x4b: 0x6406, - 0x4c: 0x6413, - 0x4d: 0x6426, - 0x4e: 0x6436, - 0x4f: 0x651d, - 0x50: 0x6417, - 0x51: 0x6428, - 0x52: 0x640f, - 0x53: 0x6467, - 0x54: 0x646f, - 0x55: 0x6476, - 0x56: 0x644e, - 0x57: 0x652a, - 0x58: 0x6495, - 0x59: 0x6493, - 0x5a: 0x64a5, - 0x5b: 0x64a9, - 0x5c: 0x6488, - 0x5d: 0x64bc, - }, - 0x39: [94]uint16{ - 0x00: 0x64da, - 0x01: 0x64d2, - 0x02: 0x64c5, - 0x03: 0x64c7, - 0x04: 0x64bb, - 0x05: 0x64d8, - 0x06: 0x64c2, - 0x07: 0x64f1, - 0x08: 0x64e7, - 0x09: 0x8209, - 0x0a: 0x64e0, - 0x0b: 0x64e1, - 0x0c: 0x62ac, - 0x0d: 0x64e3, - 0x0e: 0x64ef, - 0x0f: 0x652c, - 0x10: 0x64f6, - 0x11: 0x64f4, - 0x12: 0x64f2, - 0x13: 0x64fa, - 0x14: 0x6500, - 0x15: 0x64fd, - 0x16: 0x6518, - 0x17: 0x651c, - 0x18: 0x6505, - 0x19: 0x6524, - 0x1a: 0x6523, - 0x1b: 0x652b, - 0x1c: 0x6534, - 0x1d: 0x6535, - 0x1e: 0x6537, - 0x1f: 0x6536, - 0x20: 0x6538, - 0x21: 0x754b, - 0x22: 0x6548, - 0x23: 0x6556, - 0x24: 0x6555, - 0x25: 0x654d, - 0x26: 0x6558, - 0x27: 0x655e, - 0x28: 0x655d, - 0x29: 0x6572, - 0x2a: 0x6578, - 0x2b: 0x6582, - 0x2c: 0x6583, - 0x2d: 0x8b8a, - 0x2e: 0x659b, - 0x2f: 0x659f, - 0x30: 0x65ab, - 0x31: 0x65b7, - 0x32: 0x65c3, - 0x33: 0x65c6, - 0x34: 0x65c1, - 0x35: 0x65c4, - 0x36: 0x65cc, - 0x37: 0x65d2, - 0x38: 0x65db, - 0x39: 0x65d9, - 0x3a: 0x65e0, - 0x3b: 0x65e1, - 0x3c: 0x65f1, - 0x3d: 0x6772, - 0x3e: 0x660a, - 0x3f: 0x6603, - 0x40: 0x65fb, - 0x41: 0x6773, - 0x42: 0x6635, - 0x43: 0x6636, - 0x44: 0x6634, - 0x45: 0x661c, - 0x46: 0x664f, - 0x47: 0x6644, - 0x48: 0x6649, - 0x49: 0x6641, - 0x4a: 0x665e, - 0x4b: 0x665d, - 0x4c: 0x6664, - 0x4d: 0x6667, - 0x4e: 0x6668, - 0x4f: 0x665f, - 0x50: 0x6662, - 0x51: 0x6670, - 0x52: 0x6683, - 0x53: 0x6688, - 0x54: 0x668e, - 0x55: 0x6689, - 0x56: 0x6684, - 0x57: 0x6698, - 0x58: 0x669d, - 0x59: 0x66c1, - 0x5a: 0x66b9, - 0x5b: 0x66c9, - 0x5c: 0x66be, - 0x5d: 0x66bc, - }, - 0x3a: [94]uint16{ - 0x00: 0x66c4, - 0x01: 0x66b8, - 0x02: 0x66d6, - 0x03: 0x66da, - 0x04: 0x66e0, - 0x05: 0x663f, - 0x06: 0x66e6, - 0x07: 0x66e9, - 0x08: 0x66f0, - 0x09: 0x66f5, - 0x0a: 0x66f7, - 0x0b: 0x670f, - 0x0c: 0x6716, - 0x0d: 0x671e, - 0x0e: 0x6726, - 0x0f: 0x6727, - 0x10: 0x9738, - 0x11: 0x672e, - 0x12: 0x673f, - 0x13: 0x6736, - 0x14: 0x6741, - 0x15: 0x6738, - 0x16: 0x6737, - 0x17: 0x6746, - 0x18: 0x675e, - 0x19: 0x6760, - 0x1a: 0x6759, - 0x1b: 0x6763, - 0x1c: 0x6764, - 0x1d: 0x6789, - 0x1e: 0x6770, - 0x1f: 0x67a9, - 0x20: 0x677c, - 0x21: 0x676a, - 0x22: 0x678c, - 0x23: 0x678b, - 0x24: 0x67a6, - 0x25: 0x67a1, - 0x26: 0x6785, - 0x27: 0x67b7, - 0x28: 0x67ef, - 0x29: 0x67b4, - 0x2a: 0x67ec, - 0x2b: 0x67b3, - 0x2c: 0x67e9, - 0x2d: 0x67b8, - 0x2e: 0x67e4, - 0x2f: 0x67de, - 0x30: 0x67dd, - 0x31: 0x67e2, - 0x32: 0x67ee, - 0x33: 0x67b9, - 0x34: 0x67ce, - 0x35: 0x67c6, - 0x36: 0x67e7, - 0x37: 0x6a9c, - 0x38: 0x681e, - 0x39: 0x6846, - 0x3a: 0x6829, - 0x3b: 0x6840, - 0x3c: 0x684d, - 0x3d: 0x6832, - 0x3e: 0x684e, - 0x3f: 0x68b3, - 0x40: 0x682b, - 0x41: 0x6859, - 0x42: 0x6863, - 0x43: 0x6877, - 0x44: 0x687f, - 0x45: 0x689f, - 0x46: 0x688f, - 0x47: 0x68ad, - 0x48: 0x6894, - 0x49: 0x689d, - 0x4a: 0x689b, - 0x4b: 0x6883, - 0x4c: 0x6aae, - 0x4d: 0x68b9, - 0x4e: 0x6874, - 0x4f: 0x68b5, - 0x50: 0x68a0, - 0x51: 0x68ba, - 0x52: 0x690f, - 0x53: 0x688d, - 0x54: 0x687e, - 0x55: 0x6901, - 0x56: 0x68ca, - 0x57: 0x6908, - 0x58: 0x68d8, - 0x59: 0x6922, - 0x5a: 0x6926, - 0x5b: 0x68e1, - 0x5c: 0x690c, - 0x5d: 0x68cd, - }, - 0x3b: [94]uint16{ - 0x00: 0x68d4, - 0x01: 0x68e7, - 0x02: 0x68d5, - 0x03: 0x6936, - 0x04: 0x6912, - 0x05: 0x6904, - 0x06: 0x68d7, - 0x07: 0x68e3, - 0x08: 0x6925, - 0x09: 0x68f9, - 0x0a: 0x68e0, - 0x0b: 0x68ef, - 0x0c: 0x6928, - 0x0d: 0x692a, - 0x0e: 0x691a, - 0x0f: 0x6923, - 0x10: 0x6921, - 0x11: 0x68c6, - 0x12: 0x6979, - 0x13: 0x6977, - 0x14: 0x695c, - 0x15: 0x6978, - 0x16: 0x696b, - 0x17: 0x6954, - 0x18: 0x697e, - 0x19: 0x696e, - 0x1a: 0x6939, - 0x1b: 0x6974, - 0x1c: 0x693d, - 0x1d: 0x6959, - 0x1e: 0x6930, - 0x1f: 0x6961, - 0x20: 0x695e, - 0x21: 0x695d, - 0x22: 0x6981, - 0x23: 0x696a, - 0x24: 0x69b2, - 0x25: 0x69ae, - 0x26: 0x69d0, - 0x27: 0x69bf, - 0x28: 0x69c1, - 0x29: 0x69d3, - 0x2a: 0x69be, - 0x2b: 0x69ce, - 0x2c: 0x5be8, - 0x2d: 0x69ca, - 0x2e: 0x69dd, - 0x2f: 0x69bb, - 0x30: 0x69c3, - 0x31: 0x69a7, - 0x32: 0x6a2e, - 0x33: 0x6991, - 0x34: 0x69a0, - 0x35: 0x699c, - 0x36: 0x6995, - 0x37: 0x69b4, - 0x38: 0x69de, - 0x39: 0x69e8, - 0x3a: 0x6a02, - 0x3b: 0x6a1b, - 0x3c: 0x69ff, - 0x3d: 0x6b0a, - 0x3e: 0x69f9, - 0x3f: 0x69f2, - 0x40: 0x69e7, - 0x41: 0x6a05, - 0x42: 0x69b1, - 0x43: 0x6a1e, - 0x44: 0x69ed, - 0x45: 0x6a14, - 0x46: 0x69eb, - 0x47: 0x6a0a, - 0x48: 0x6a12, - 0x49: 0x6ac1, - 0x4a: 0x6a23, - 0x4b: 0x6a13, - 0x4c: 0x6a44, - 0x4d: 0x6a0c, - 0x4e: 0x6a72, - 0x4f: 0x6a36, - 0x50: 0x6a78, - 0x51: 0x6a47, - 0x52: 0x6a62, - 0x53: 0x6a59, - 0x54: 0x6a66, - 0x55: 0x6a48, - 0x56: 0x6a38, - 0x57: 0x6a22, - 0x58: 0x6a90, - 0x59: 0x6a8d, - 0x5a: 0x6aa0, - 0x5b: 0x6a84, - 0x5c: 0x6aa2, - 0x5d: 0x6aa3, - }, - 0x3c: [94]uint16{ - 0x00: 0x6a97, - 0x01: 0x8617, - 0x02: 0x6abb, - 0x03: 0x6ac3, - 0x04: 0x6ac2, - 0x05: 0x6ab8, - 0x06: 0x6ab3, - 0x07: 0x6aac, - 0x08: 0x6ade, - 0x09: 0x6ad1, - 0x0a: 0x6adf, - 0x0b: 0x6aaa, - 0x0c: 0x6ada, - 0x0d: 0x6aea, - 0x0e: 0x6afb, - 0x0f: 0x6b05, - 0x10: 0x8616, - 0x11: 0x6afa, - 0x12: 0x6b12, - 0x13: 0x6b16, - 0x14: 0x9b31, - 0x15: 0x6b1f, - 0x16: 0x6b38, - 0x17: 0x6b37, - 0x18: 0x76dc, - 0x19: 0x6b39, - 0x1a: 0x98ee, - 0x1b: 0x6b47, - 0x1c: 0x6b43, - 0x1d: 0x6b49, - 0x1e: 0x6b50, - 0x1f: 0x6b59, - 0x20: 0x6b54, - 0x21: 0x6b5b, - 0x22: 0x6b5f, - 0x23: 0x6b61, - 0x24: 0x6b78, - 0x25: 0x6b79, - 0x26: 0x6b7f, - 0x27: 0x6b80, - 0x28: 0x6b84, - 0x29: 0x6b83, - 0x2a: 0x6b8d, - 0x2b: 0x6b98, - 0x2c: 0x6b95, - 0x2d: 0x6b9e, - 0x2e: 0x6ba4, - 0x2f: 0x6baa, - 0x30: 0x6bab, - 0x31: 0x6baf, - 0x32: 0x6bb2, - 0x33: 0x6bb1, - 0x34: 0x6bb3, - 0x35: 0x6bb7, - 0x36: 0x6bbc, - 0x37: 0x6bc6, - 0x38: 0x6bcb, - 0x39: 0x6bd3, - 0x3a: 0x6bdf, - 0x3b: 0x6bec, - 0x3c: 0x6beb, - 0x3d: 0x6bf3, - 0x3e: 0x6bef, - 0x3f: 0x9ebe, - 0x40: 0x6c08, - 0x41: 0x6c13, - 0x42: 0x6c14, - 0x43: 0x6c1b, - 0x44: 0x6c24, - 0x45: 0x6c23, - 0x46: 0x6c5e, - 0x47: 0x6c55, - 0x48: 0x6c62, - 0x49: 0x6c6a, - 0x4a: 0x6c82, - 0x4b: 0x6c8d, - 0x4c: 0x6c9a, - 0x4d: 0x6c81, - 0x4e: 0x6c9b, - 0x4f: 0x6c7e, - 0x50: 0x6c68, - 0x51: 0x6c73, - 0x52: 0x6c92, - 0x53: 0x6c90, - 0x54: 0x6cc4, - 0x55: 0x6cf1, - 0x56: 0x6cd3, - 0x57: 0x6cbd, - 0x58: 0x6cd7, - 0x59: 0x6cc5, - 0x5a: 0x6cdd, - 0x5b: 0x6cae, - 0x5c: 0x6cb1, - 0x5d: 0x6cbe, - }, - 0x3d: [94]uint16{ - 0x00: 0x6cba, - 0x01: 0x6cdb, - 0x02: 0x6cef, - 0x03: 0x6cd9, - 0x04: 0x6cea, - 0x05: 0x6d1f, - 0x06: 0x884d, - 0x07: 0x6d36, - 0x08: 0x6d2b, - 0x09: 0x6d3d, - 0x0a: 0x6d38, - 0x0b: 0x6d19, - 0x0c: 0x6d35, - 0x0d: 0x6d33, - 0x0e: 0x6d12, - 0x0f: 0x6d0c, - 0x10: 0x6d63, - 0x11: 0x6d93, - 0x12: 0x6d64, - 0x13: 0x6d5a, - 0x14: 0x6d79, - 0x15: 0x6d59, - 0x16: 0x6d8e, - 0x17: 0x6d95, - 0x18: 0x6fe4, - 0x19: 0x6d85, - 0x1a: 0x6df9, - 0x1b: 0x6e15, - 0x1c: 0x6e0a, - 0x1d: 0x6db5, - 0x1e: 0x6dc7, - 0x1f: 0x6de6, - 0x20: 0x6db8, - 0x21: 0x6dc6, - 0x22: 0x6dec, - 0x23: 0x6dde, - 0x24: 0x6dcc, - 0x25: 0x6de8, - 0x26: 0x6dd2, - 0x27: 0x6dc5, - 0x28: 0x6dfa, - 0x29: 0x6dd9, - 0x2a: 0x6de4, - 0x2b: 0x6dd5, - 0x2c: 0x6dea, - 0x2d: 0x6dee, - 0x2e: 0x6e2d, - 0x2f: 0x6e6e, - 0x30: 0x6e2e, - 0x31: 0x6e19, - 0x32: 0x6e72, - 0x33: 0x6e5f, - 0x34: 0x6e3e, - 0x35: 0x6e23, - 0x36: 0x6e6b, - 0x37: 0x6e2b, - 0x38: 0x6e76, - 0x39: 0x6e4d, - 0x3a: 0x6e1f, - 0x3b: 0x6e43, - 0x3c: 0x6e3a, - 0x3d: 0x6e4e, - 0x3e: 0x6e24, - 0x3f: 0x6eff, - 0x40: 0x6e1d, - 0x41: 0x6e38, - 0x42: 0x6e82, - 0x43: 0x6eaa, - 0x44: 0x6e98, - 0x45: 0x6ec9, - 0x46: 0x6eb7, - 0x47: 0x6ed3, - 0x48: 0x6ebd, - 0x49: 0x6eaf, - 0x4a: 0x6ec4, - 0x4b: 0x6eb2, - 0x4c: 0x6ed4, - 0x4d: 0x6ed5, - 0x4e: 0x6e8f, - 0x4f: 0x6ea5, - 0x50: 0x6ec2, - 0x51: 0x6e9f, - 0x52: 0x6f41, - 0x53: 0x6f11, - 0x54: 0x704c, - 0x55: 0x6eec, - 0x56: 0x6ef8, - 0x57: 0x6efe, - 0x58: 0x6f3f, - 0x59: 0x6ef2, - 0x5a: 0x6f31, - 0x5b: 0x6eef, - 0x5c: 0x6f32, - 0x5d: 0x6ecc, - }, - 0x3e: [94]uint16{ - 0x00: 0x6f3e, - 0x01: 0x6f13, - 0x02: 0x6ef7, - 0x03: 0x6f86, - 0x04: 0x6f7a, - 0x05: 0x6f78, - 0x06: 0x6f81, - 0x07: 0x6f80, - 0x08: 0x6f6f, - 0x09: 0x6f5b, - 0x0a: 0x6ff3, - 0x0b: 0x6f6d, - 0x0c: 0x6f82, - 0x0d: 0x6f7c, - 0x0e: 0x6f58, - 0x0f: 0x6f8e, - 0x10: 0x6f91, - 0x11: 0x6fc2, - 0x12: 0x6f66, - 0x13: 0x6fb3, - 0x14: 0x6fa3, - 0x15: 0x6fa1, - 0x16: 0x6fa4, - 0x17: 0x6fb9, - 0x18: 0x6fc6, - 0x19: 0x6faa, - 0x1a: 0x6fdf, - 0x1b: 0x6fd5, - 0x1c: 0x6fec, - 0x1d: 0x6fd4, - 0x1e: 0x6fd8, - 0x1f: 0x6ff1, - 0x20: 0x6fee, - 0x21: 0x6fdb, - 0x22: 0x7009, - 0x23: 0x700b, - 0x24: 0x6ffa, - 0x25: 0x7011, - 0x26: 0x7001, - 0x27: 0x700f, - 0x28: 0x6ffe, - 0x29: 0x701b, - 0x2a: 0x701a, - 0x2b: 0x6f74, - 0x2c: 0x701d, - 0x2d: 0x7018, - 0x2e: 0x701f, - 0x2f: 0x7030, - 0x30: 0x703e, - 0x31: 0x7032, - 0x32: 0x7051, - 0x33: 0x7063, - 0x34: 0x7099, - 0x35: 0x7092, - 0x36: 0x70af, - 0x37: 0x70f1, - 0x38: 0x70ac, - 0x39: 0x70b8, - 0x3a: 0x70b3, - 0x3b: 0x70ae, - 0x3c: 0x70df, - 0x3d: 0x70cb, - 0x3e: 0x70dd, - 0x3f: 0x70d9, - 0x40: 0x7109, - 0x41: 0x70fd, - 0x42: 0x711c, - 0x43: 0x7119, - 0x44: 0x7165, - 0x45: 0x7155, - 0x46: 0x7188, - 0x47: 0x7166, - 0x48: 0x7162, - 0x49: 0x714c, - 0x4a: 0x7156, - 0x4b: 0x716c, - 0x4c: 0x718f, - 0x4d: 0x71fb, - 0x4e: 0x7184, - 0x4f: 0x7195, - 0x50: 0x71a8, - 0x51: 0x71ac, - 0x52: 0x71d7, - 0x53: 0x71b9, - 0x54: 0x71be, - 0x55: 0x71d2, - 0x56: 0x71c9, - 0x57: 0x71d4, - 0x58: 0x71ce, - 0x59: 0x71e0, - 0x5a: 0x71ec, - 0x5b: 0x71e7, - 0x5c: 0x71f5, - 0x5d: 0x71fc, - }, - 0x3f: [94]uint16{ - 0x00: 0x71f9, - 0x01: 0x71ff, - 0x02: 0x720d, - 0x03: 0x7210, - 0x04: 0x721b, - 0x05: 0x7228, - 0x06: 0x722d, - 0x07: 0x722c, - 0x08: 0x7230, - 0x09: 0x7232, - 0x0a: 0x723b, - 0x0b: 0x723c, - 0x0c: 0x723f, - 0x0d: 0x7240, - 0x0e: 0x7246, - 0x0f: 0x724b, - 0x10: 0x7258, - 0x11: 0x7274, - 0x12: 0x727e, - 0x13: 0x7282, - 0x14: 0x7281, - 0x15: 0x7287, - 0x16: 0x7292, - 0x17: 0x7296, - 0x18: 0x72a2, - 0x19: 0x72a7, - 0x1a: 0x72b9, - 0x1b: 0x72b2, - 0x1c: 0x72c3, - 0x1d: 0x72c6, - 0x1e: 0x72c4, - 0x1f: 0x72ce, - 0x20: 0x72d2, - 0x21: 0x72e2, - 0x22: 0x72e0, - 0x23: 0x72e1, - 0x24: 0x72f9, - 0x25: 0x72f7, - 0x26: 0x500f, - 0x27: 0x7317, - 0x28: 0x730a, - 0x29: 0x731c, - 0x2a: 0x7316, - 0x2b: 0x731d, - 0x2c: 0x7334, - 0x2d: 0x732f, - 0x2e: 0x7329, - 0x2f: 0x7325, - 0x30: 0x733e, - 0x31: 0x734e, - 0x32: 0x734f, - 0x33: 0x9ed8, - 0x34: 0x7357, - 0x35: 0x736a, - 0x36: 0x7368, - 0x37: 0x7370, - 0x38: 0x7378, - 0x39: 0x7375, - 0x3a: 0x737b, - 0x3b: 0x737a, - 0x3c: 0x73c8, - 0x3d: 0x73b3, - 0x3e: 0x73ce, - 0x3f: 0x73bb, - 0x40: 0x73c0, - 0x41: 0x73e5, - 0x42: 0x73ee, - 0x43: 0x73de, - 0x44: 0x74a2, - 0x45: 0x7405, - 0x46: 0x746f, - 0x47: 0x7425, - 0x48: 0x73f8, - 0x49: 0x7432, - 0x4a: 0x743a, - 0x4b: 0x7455, - 0x4c: 0x743f, - 0x4d: 0x745f, - 0x4e: 0x7459, - 0x4f: 0x7441, - 0x50: 0x745c, - 0x51: 0x7469, - 0x52: 0x7470, - 0x53: 0x7463, - 0x54: 0x746a, - 0x55: 0x7476, - 0x56: 0x747e, - 0x57: 0x748b, - 0x58: 0x749e, - 0x59: 0x74a7, - 0x5a: 0x74ca, - 0x5b: 0x74cf, - 0x5c: 0x74d4, - 0x5d: 0x73f1, - }, - 0x40: [94]uint16{ - 0x00: 0x74e0, - 0x01: 0x74e3, - 0x02: 0x74e7, - 0x03: 0x74e9, - 0x04: 0x74ee, - 0x05: 0x74f2, - 0x06: 0x74f0, - 0x07: 0x74f1, - 0x08: 0x74f8, - 0x09: 0x74f7, - 0x0a: 0x7504, - 0x0b: 0x7503, - 0x0c: 0x7505, - 0x0d: 0x750c, - 0x0e: 0x750e, - 0x0f: 0x750d, - 0x10: 0x7515, - 0x11: 0x7513, - 0x12: 0x751e, - 0x13: 0x7526, - 0x14: 0x752c, - 0x15: 0x753c, - 0x16: 0x7544, - 0x17: 0x754d, - 0x18: 0x754a, - 0x19: 0x7549, - 0x1a: 0x755b, - 0x1b: 0x7546, - 0x1c: 0x755a, - 0x1d: 0x7569, - 0x1e: 0x7564, - 0x1f: 0x7567, - 0x20: 0x756b, - 0x21: 0x756d, - 0x22: 0x7578, - 0x23: 0x7576, - 0x24: 0x7586, - 0x25: 0x7587, - 0x26: 0x7574, - 0x27: 0x758a, - 0x28: 0x7589, - 0x29: 0x7582, - 0x2a: 0x7594, - 0x2b: 0x759a, - 0x2c: 0x759d, - 0x2d: 0x75a5, - 0x2e: 0x75a3, - 0x2f: 0x75c2, - 0x30: 0x75b3, - 0x31: 0x75c3, - 0x32: 0x75b5, - 0x33: 0x75bd, - 0x34: 0x75b8, - 0x35: 0x75bc, - 0x36: 0x75b1, - 0x37: 0x75cd, - 0x38: 0x75ca, - 0x39: 0x75d2, - 0x3a: 0x75d9, - 0x3b: 0x75e3, - 0x3c: 0x75de, - 0x3d: 0x75fe, - 0x3e: 0x75ff, - 0x3f: 0x75fc, - 0x40: 0x7601, - 0x41: 0x75f0, - 0x42: 0x75fa, - 0x43: 0x75f2, - 0x44: 0x75f3, - 0x45: 0x760b, - 0x46: 0x760d, - 0x47: 0x7609, - 0x48: 0x761f, - 0x49: 0x7627, - 0x4a: 0x7620, - 0x4b: 0x7621, - 0x4c: 0x7622, - 0x4d: 0x7624, - 0x4e: 0x7634, - 0x4f: 0x7630, - 0x50: 0x763b, - 0x51: 0x7647, - 0x52: 0x7648, - 0x53: 0x7646, - 0x54: 0x765c, - 0x55: 0x7658, - 0x56: 0x7661, - 0x57: 0x7662, - 0x58: 0x7668, - 0x59: 0x7669, - 0x5a: 0x766a, - 0x5b: 0x7667, - 0x5c: 0x766c, - 0x5d: 0x7670, - }, - 0x41: [94]uint16{ - 0x00: 0x7672, - 0x01: 0x7676, - 0x02: 0x7678, - 0x03: 0x767c, - 0x04: 0x7680, - 0x05: 0x7683, - 0x06: 0x7688, - 0x07: 0x768b, - 0x08: 0x768e, - 0x09: 0x7696, - 0x0a: 0x7693, - 0x0b: 0x7699, - 0x0c: 0x769a, - 0x0d: 0x76b0, - 0x0e: 0x76b4, - 0x0f: 0x76b8, - 0x10: 0x76b9, - 0x11: 0x76ba, - 0x12: 0x76c2, - 0x13: 0x76cd, - 0x14: 0x76d6, - 0x15: 0x76d2, - 0x16: 0x76de, - 0x17: 0x76e1, - 0x18: 0x76e5, - 0x19: 0x76e7, - 0x1a: 0x76ea, - 0x1b: 0x862f, - 0x1c: 0x76fb, - 0x1d: 0x7708, - 0x1e: 0x7707, - 0x1f: 0x7704, - 0x20: 0x7729, - 0x21: 0x7724, - 0x22: 0x771e, - 0x23: 0x7725, - 0x24: 0x7726, - 0x25: 0x771b, - 0x26: 0x7737, - 0x27: 0x7738, - 0x28: 0x7747, - 0x29: 0x775a, - 0x2a: 0x7768, - 0x2b: 0x776b, - 0x2c: 0x775b, - 0x2d: 0x7765, - 0x2e: 0x777f, - 0x2f: 0x777e, - 0x30: 0x7779, - 0x31: 0x778e, - 0x32: 0x778b, - 0x33: 0x7791, - 0x34: 0x77a0, - 0x35: 0x779e, - 0x36: 0x77b0, - 0x37: 0x77b6, - 0x38: 0x77b9, - 0x39: 0x77bf, - 0x3a: 0x77bc, - 0x3b: 0x77bd, - 0x3c: 0x77bb, - 0x3d: 0x77c7, - 0x3e: 0x77cd, - 0x3f: 0x77d7, - 0x40: 0x77da, - 0x41: 0x77dc, - 0x42: 0x77e3, - 0x43: 0x77ee, - 0x44: 0x77fc, - 0x45: 0x780c, - 0x46: 0x7812, - 0x47: 0x7926, - 0x48: 0x7820, - 0x49: 0x792a, - 0x4a: 0x7845, - 0x4b: 0x788e, - 0x4c: 0x7874, - 0x4d: 0x7886, - 0x4e: 0x787c, - 0x4f: 0x789a, - 0x50: 0x788c, - 0x51: 0x78a3, - 0x52: 0x78b5, - 0x53: 0x78aa, - 0x54: 0x78af, - 0x55: 0x78d1, - 0x56: 0x78c6, - 0x57: 0x78cb, - 0x58: 0x78d4, - 0x59: 0x78be, - 0x5a: 0x78bc, - 0x5b: 0x78c5, - 0x5c: 0x78ca, - 0x5d: 0x78ec, - }, - 0x42: [94]uint16{ - 0x00: 0x78e7, - 0x01: 0x78da, - 0x02: 0x78fd, - 0x03: 0x78f4, - 0x04: 0x7907, - 0x05: 0x7912, - 0x06: 0x7911, - 0x07: 0x7919, - 0x08: 0x792c, - 0x09: 0x792b, - 0x0a: 0x7940, - 0x0b: 0x7960, - 0x0c: 0x7957, - 0x0d: 0x795f, - 0x0e: 0x795a, - 0x0f: 0x7955, - 0x10: 0x7953, - 0x11: 0x797a, - 0x12: 0x797f, - 0x13: 0x798a, - 0x14: 0x799d, - 0x15: 0x79a7, - 0x16: 0x9f4b, - 0x17: 0x79aa, - 0x18: 0x79ae, - 0x19: 0x79b3, - 0x1a: 0x79b9, - 0x1b: 0x79ba, - 0x1c: 0x79c9, - 0x1d: 0x79d5, - 0x1e: 0x79e7, - 0x1f: 0x79ec, - 0x20: 0x79e1, - 0x21: 0x79e3, - 0x22: 0x7a08, - 0x23: 0x7a0d, - 0x24: 0x7a18, - 0x25: 0x7a19, - 0x26: 0x7a20, - 0x27: 0x7a1f, - 0x28: 0x7980, - 0x29: 0x7a31, - 0x2a: 0x7a3b, - 0x2b: 0x7a3e, - 0x2c: 0x7a37, - 0x2d: 0x7a43, - 0x2e: 0x7a57, - 0x2f: 0x7a49, - 0x30: 0x7a61, - 0x31: 0x7a62, - 0x32: 0x7a69, - 0x33: 0x9f9d, - 0x34: 0x7a70, - 0x35: 0x7a79, - 0x36: 0x7a7d, - 0x37: 0x7a88, - 0x38: 0x7a97, - 0x39: 0x7a95, - 0x3a: 0x7a98, - 0x3b: 0x7a96, - 0x3c: 0x7aa9, - 0x3d: 0x7ac8, - 0x3e: 0x7ab0, - 0x3f: 0x7ab6, - 0x40: 0x7ac5, - 0x41: 0x7ac4, - 0x42: 0x7abf, - 0x43: 0x9083, - 0x44: 0x7ac7, - 0x45: 0x7aca, - 0x46: 0x7acd, - 0x47: 0x7acf, - 0x48: 0x7ad5, - 0x49: 0x7ad3, - 0x4a: 0x7ad9, - 0x4b: 0x7ada, - 0x4c: 0x7add, - 0x4d: 0x7ae1, - 0x4e: 0x7ae2, - 0x4f: 0x7ae6, - 0x50: 0x7aed, - 0x51: 0x7af0, - 0x52: 0x7b02, - 0x53: 0x7b0f, - 0x54: 0x7b0a, - 0x55: 0x7b06, - 0x56: 0x7b33, - 0x57: 0x7b18, - 0x58: 0x7b19, - 0x59: 0x7b1e, - 0x5a: 0x7b35, - 0x5b: 0x7b28, - 0x5c: 0x7b36, - 0x5d: 0x7b50, - }, - 0x43: [94]uint16{ - 0x00: 0x7b7a, - 0x01: 0x7b04, - 0x02: 0x7b4d, - 0x03: 0x7b0b, - 0x04: 0x7b4c, - 0x05: 0x7b45, - 0x06: 0x7b75, - 0x07: 0x7b65, - 0x08: 0x7b74, - 0x09: 0x7b67, - 0x0a: 0x7b70, - 0x0b: 0x7b71, - 0x0c: 0x7b6c, - 0x0d: 0x7b6e, - 0x0e: 0x7b9d, - 0x0f: 0x7b98, - 0x10: 0x7b9f, - 0x11: 0x7b8d, - 0x12: 0x7b9c, - 0x13: 0x7b9a, - 0x14: 0x7b8b, - 0x15: 0x7b92, - 0x16: 0x7b8f, - 0x17: 0x7b5d, - 0x18: 0x7b99, - 0x19: 0x7bcb, - 0x1a: 0x7bc1, - 0x1b: 0x7bcc, - 0x1c: 0x7bcf, - 0x1d: 0x7bb4, - 0x1e: 0x7bc6, - 0x1f: 0x7bdd, - 0x20: 0x7be9, - 0x21: 0x7c11, - 0x22: 0x7c14, - 0x23: 0x7be6, - 0x24: 0x7be5, - 0x25: 0x7c60, - 0x26: 0x7c00, - 0x27: 0x7c07, - 0x28: 0x7c13, - 0x29: 0x7bf3, - 0x2a: 0x7bf7, - 0x2b: 0x7c17, - 0x2c: 0x7c0d, - 0x2d: 0x7bf6, - 0x2e: 0x7c23, - 0x2f: 0x7c27, - 0x30: 0x7c2a, - 0x31: 0x7c1f, - 0x32: 0x7c37, - 0x33: 0x7c2b, - 0x34: 0x7c3d, - 0x35: 0x7c4c, - 0x36: 0x7c43, - 0x37: 0x7c54, - 0x38: 0x7c4f, - 0x39: 0x7c40, - 0x3a: 0x7c50, - 0x3b: 0x7c58, - 0x3c: 0x7c5f, - 0x3d: 0x7c64, - 0x3e: 0x7c56, - 0x3f: 0x7c65, - 0x40: 0x7c6c, - 0x41: 0x7c75, - 0x42: 0x7c83, - 0x43: 0x7c90, - 0x44: 0x7ca4, - 0x45: 0x7cad, - 0x46: 0x7ca2, - 0x47: 0x7cab, - 0x48: 0x7ca1, - 0x49: 0x7ca8, - 0x4a: 0x7cb3, - 0x4b: 0x7cb2, - 0x4c: 0x7cb1, - 0x4d: 0x7cae, - 0x4e: 0x7cb9, - 0x4f: 0x7cbd, - 0x50: 0x7cc0, - 0x51: 0x7cc5, - 0x52: 0x7cc2, - 0x53: 0x7cd8, - 0x54: 0x7cd2, - 0x55: 0x7cdc, - 0x56: 0x7ce2, - 0x57: 0x9b3b, - 0x58: 0x7cef, - 0x59: 0x7cf2, - 0x5a: 0x7cf4, - 0x5b: 0x7cf6, - 0x5c: 0x7cfa, - 0x5d: 0x7d06, - }, - 0x44: [94]uint16{ - 0x00: 0x7d02, - 0x01: 0x7d1c, - 0x02: 0x7d15, - 0x03: 0x7d0a, - 0x04: 0x7d45, - 0x05: 0x7d4b, - 0x06: 0x7d2e, - 0x07: 0x7d32, - 0x08: 0x7d3f, - 0x09: 0x7d35, - 0x0a: 0x7d46, - 0x0b: 0x7d73, - 0x0c: 0x7d56, - 0x0d: 0x7d4e, - 0x0e: 0x7d72, - 0x0f: 0x7d68, - 0x10: 0x7d6e, - 0x11: 0x7d4f, - 0x12: 0x7d63, - 0x13: 0x7d93, - 0x14: 0x7d89, - 0x15: 0x7d5b, - 0x16: 0x7d8f, - 0x17: 0x7d7d, - 0x18: 0x7d9b, - 0x19: 0x7dba, - 0x1a: 0x7dae, - 0x1b: 0x7da3, - 0x1c: 0x7db5, - 0x1d: 0x7dc7, - 0x1e: 0x7dbd, - 0x1f: 0x7dab, - 0x20: 0x7e3d, - 0x21: 0x7da2, - 0x22: 0x7daf, - 0x23: 0x7ddc, - 0x24: 0x7db8, - 0x25: 0x7d9f, - 0x26: 0x7db0, - 0x27: 0x7dd8, - 0x28: 0x7ddd, - 0x29: 0x7de4, - 0x2a: 0x7dde, - 0x2b: 0x7dfb, - 0x2c: 0x7df2, - 0x2d: 0x7de1, - 0x2e: 0x7e05, - 0x2f: 0x7e0a, - 0x30: 0x7e23, - 0x31: 0x7e21, - 0x32: 0x7e12, - 0x33: 0x7e31, - 0x34: 0x7e1f, - 0x35: 0x7e09, - 0x36: 0x7e0b, - 0x37: 0x7e22, - 0x38: 0x7e46, - 0x39: 0x7e66, - 0x3a: 0x7e3b, - 0x3b: 0x7e35, - 0x3c: 0x7e39, - 0x3d: 0x7e43, - 0x3e: 0x7e37, - 0x3f: 0x7e32, - 0x40: 0x7e3a, - 0x41: 0x7e67, - 0x42: 0x7e5d, - 0x43: 0x7e56, - 0x44: 0x7e5e, - 0x45: 0x7e59, - 0x46: 0x7e5a, - 0x47: 0x7e79, - 0x48: 0x7e6a, - 0x49: 0x7e69, - 0x4a: 0x7e7c, - 0x4b: 0x7e7b, - 0x4c: 0x7e83, - 0x4d: 0x7dd5, - 0x4e: 0x7e7d, - 0x4f: 0x8fae, - 0x50: 0x7e7f, - 0x51: 0x7e88, - 0x52: 0x7e89, - 0x53: 0x7e8c, - 0x54: 0x7e92, - 0x55: 0x7e90, - 0x56: 0x7e93, - 0x57: 0x7e94, - 0x58: 0x7e96, - 0x59: 0x7e8e, - 0x5a: 0x7e9b, - 0x5b: 0x7e9c, - 0x5c: 0x7f38, - 0x5d: 0x7f3a, - }, - 0x45: [94]uint16{ - 0x00: 0x7f45, - 0x01: 0x7f4c, - 0x02: 0x7f4d, - 0x03: 0x7f4e, - 0x04: 0x7f50, - 0x05: 0x7f51, - 0x06: 0x7f55, - 0x07: 0x7f54, - 0x08: 0x7f58, - 0x09: 0x7f5f, - 0x0a: 0x7f60, - 0x0b: 0x7f68, - 0x0c: 0x7f69, - 0x0d: 0x7f67, - 0x0e: 0x7f78, - 0x0f: 0x7f82, - 0x10: 0x7f86, - 0x11: 0x7f83, - 0x12: 0x7f88, - 0x13: 0x7f87, - 0x14: 0x7f8c, - 0x15: 0x7f94, - 0x16: 0x7f9e, - 0x17: 0x7f9d, - 0x18: 0x7f9a, - 0x19: 0x7fa3, - 0x1a: 0x7faf, - 0x1b: 0x7fb2, - 0x1c: 0x7fb9, - 0x1d: 0x7fae, - 0x1e: 0x7fb6, - 0x1f: 0x7fb8, - 0x20: 0x8b71, - 0x21: 0x7fc5, - 0x22: 0x7fc6, - 0x23: 0x7fca, - 0x24: 0x7fd5, - 0x25: 0x7fd4, - 0x26: 0x7fe1, - 0x27: 0x7fe6, - 0x28: 0x7fe9, - 0x29: 0x7ff3, - 0x2a: 0x7ff9, - 0x2b: 0x98dc, - 0x2c: 0x8006, - 0x2d: 0x8004, - 0x2e: 0x800b, - 0x2f: 0x8012, - 0x30: 0x8018, - 0x31: 0x8019, - 0x32: 0x801c, - 0x33: 0x8021, - 0x34: 0x8028, - 0x35: 0x803f, - 0x36: 0x803b, - 0x37: 0x804a, - 0x38: 0x8046, - 0x39: 0x8052, - 0x3a: 0x8058, - 0x3b: 0x805a, - 0x3c: 0x805f, - 0x3d: 0x8062, - 0x3e: 0x8068, - 0x3f: 0x8073, - 0x40: 0x8072, - 0x41: 0x8070, - 0x42: 0x8076, - 0x43: 0x8079, - 0x44: 0x807d, - 0x45: 0x807f, - 0x46: 0x8084, - 0x47: 0x8086, - 0x48: 0x8085, - 0x49: 0x809b, - 0x4a: 0x8093, - 0x4b: 0x809a, - 0x4c: 0x80ad, - 0x4d: 0x5190, - 0x4e: 0x80ac, - 0x4f: 0x80db, - 0x50: 0x80e5, - 0x51: 0x80d9, - 0x52: 0x80dd, - 0x53: 0x80c4, - 0x54: 0x80da, - 0x55: 0x80d6, - 0x56: 0x8109, - 0x57: 0x80ef, - 0x58: 0x80f1, - 0x59: 0x811b, - 0x5a: 0x8129, - 0x5b: 0x8123, - 0x5c: 0x812f, - 0x5d: 0x814b, - }, - 0x46: [94]uint16{ - 0x00: 0x968b, - 0x01: 0x8146, - 0x02: 0x813e, - 0x03: 0x8153, - 0x04: 0x8151, - 0x05: 0x80fc, - 0x06: 0x8171, - 0x07: 0x816e, - 0x08: 0x8165, - 0x09: 0x8166, - 0x0a: 0x8174, - 0x0b: 0x8183, - 0x0c: 0x8188, - 0x0d: 0x818a, - 0x0e: 0x8180, - 0x0f: 0x8182, - 0x10: 0x81a0, - 0x11: 0x8195, - 0x12: 0x81a4, - 0x13: 0x81a3, - 0x14: 0x815f, - 0x15: 0x8193, - 0x16: 0x81a9, - 0x17: 0x81b0, - 0x18: 0x81b5, - 0x19: 0x81be, - 0x1a: 0x81b8, - 0x1b: 0x81bd, - 0x1c: 0x81c0, - 0x1d: 0x81c2, - 0x1e: 0x81ba, - 0x1f: 0x81c9, - 0x20: 0x81cd, - 0x21: 0x81d1, - 0x22: 0x81d9, - 0x23: 0x81d8, - 0x24: 0x81c8, - 0x25: 0x81da, - 0x26: 0x81df, - 0x27: 0x81e0, - 0x28: 0x81e7, - 0x29: 0x81fa, - 0x2a: 0x81fb, - 0x2b: 0x81fe, - 0x2c: 0x8201, - 0x2d: 0x8202, - 0x2e: 0x8205, - 0x2f: 0x8207, - 0x30: 0x820a, - 0x31: 0x820d, - 0x32: 0x8210, - 0x33: 0x8216, - 0x34: 0x8229, - 0x35: 0x822b, - 0x36: 0x8238, - 0x37: 0x8233, - 0x38: 0x8240, - 0x39: 0x8259, - 0x3a: 0x8258, - 0x3b: 0x825d, - 0x3c: 0x825a, - 0x3d: 0x825f, - 0x3e: 0x8264, - 0x3f: 0x8262, - 0x40: 0x8268, - 0x41: 0x826a, - 0x42: 0x826b, - 0x43: 0x822e, - 0x44: 0x8271, - 0x45: 0x8277, - 0x46: 0x8278, - 0x47: 0x827e, - 0x48: 0x828d, - 0x49: 0x8292, - 0x4a: 0x82ab, - 0x4b: 0x829f, - 0x4c: 0x82bb, - 0x4d: 0x82ac, - 0x4e: 0x82e1, - 0x4f: 0x82e3, - 0x50: 0x82df, - 0x51: 0x82d2, - 0x52: 0x82f4, - 0x53: 0x82f3, - 0x54: 0x82fa, - 0x55: 0x8393, - 0x56: 0x8303, - 0x57: 0x82fb, - 0x58: 0x82f9, - 0x59: 0x82de, - 0x5a: 0x8306, - 0x5b: 0x82dc, - 0x5c: 0x8309, - 0x5d: 0x82d9, - }, - 0x47: [94]uint16{ - 0x00: 0x8335, - 0x01: 0x8334, - 0x02: 0x8316, - 0x03: 0x8332, - 0x04: 0x8331, - 0x05: 0x8340, - 0x06: 0x8339, - 0x07: 0x8350, - 0x08: 0x8345, - 0x09: 0x832f, - 0x0a: 0x832b, - 0x0b: 0x8317, - 0x0c: 0x8318, - 0x0d: 0x8385, - 0x0e: 0x839a, - 0x0f: 0x83aa, - 0x10: 0x839f, - 0x11: 0x83a2, - 0x12: 0x8396, - 0x13: 0x8323, - 0x14: 0x838e, - 0x15: 0x8387, - 0x16: 0x838a, - 0x17: 0x837c, - 0x18: 0x83b5, - 0x19: 0x8373, - 0x1a: 0x8375, - 0x1b: 0x83a0, - 0x1c: 0x8389, - 0x1d: 0x83a8, - 0x1e: 0x83f4, - 0x1f: 0x8413, - 0x20: 0x83eb, - 0x21: 0x83ce, - 0x22: 0x83fd, - 0x23: 0x8403, - 0x24: 0x83d8, - 0x25: 0x840b, - 0x26: 0x83c1, - 0x27: 0x83f7, - 0x28: 0x8407, - 0x29: 0x83e0, - 0x2a: 0x83f2, - 0x2b: 0x840d, - 0x2c: 0x8422, - 0x2d: 0x8420, - 0x2e: 0x83bd, - 0x2f: 0x8438, - 0x30: 0x8506, - 0x31: 0x83fb, - 0x32: 0x846d, - 0x33: 0x842a, - 0x34: 0x843c, - 0x35: 0x855a, - 0x36: 0x8484, - 0x37: 0x8477, - 0x38: 0x846b, - 0x39: 0x84ad, - 0x3a: 0x846e, - 0x3b: 0x8482, - 0x3c: 0x8469, - 0x3d: 0x8446, - 0x3e: 0x842c, - 0x3f: 0x846f, - 0x40: 0x8479, - 0x41: 0x8435, - 0x42: 0x84ca, - 0x43: 0x8462, - 0x44: 0x84b9, - 0x45: 0x84bf, - 0x46: 0x849f, - 0x47: 0x84d9, - 0x48: 0x84cd, - 0x49: 0x84bb, - 0x4a: 0x84da, - 0x4b: 0x84d0, - 0x4c: 0x84c1, - 0x4d: 0x84c6, - 0x4e: 0x84d6, - 0x4f: 0x84a1, - 0x50: 0x8521, - 0x51: 0x84ff, - 0x52: 0x84f4, - 0x53: 0x8517, - 0x54: 0x8518, - 0x55: 0x852c, - 0x56: 0x851f, - 0x57: 0x8515, - 0x58: 0x8514, - 0x59: 0x84fc, - 0x5a: 0x8540, - 0x5b: 0x8563, - 0x5c: 0x8558, - 0x5d: 0x8548, - }, - 0x48: [94]uint16{ - 0x00: 0x8541, - 0x01: 0x8602, - 0x02: 0x854b, - 0x03: 0x8555, - 0x04: 0x8580, - 0x05: 0x85a4, - 0x06: 0x8588, - 0x07: 0x8591, - 0x08: 0x858a, - 0x09: 0x85a8, - 0x0a: 0x856d, - 0x0b: 0x8594, - 0x0c: 0x859b, - 0x0d: 0x85ea, - 0x0e: 0x8587, - 0x0f: 0x859c, - 0x10: 0x8577, - 0x11: 0x857e, - 0x12: 0x8590, - 0x13: 0x85c9, - 0x14: 0x85ba, - 0x15: 0x85cf, - 0x16: 0x85b9, - 0x17: 0x85d0, - 0x18: 0x85d5, - 0x19: 0x85dd, - 0x1a: 0x85e5, - 0x1b: 0x85dc, - 0x1c: 0x85f9, - 0x1d: 0x860a, - 0x1e: 0x8613, - 0x1f: 0x860b, - 0x20: 0x85fe, - 0x21: 0x85fa, - 0x22: 0x8606, - 0x23: 0x8622, - 0x24: 0x861a, - 0x25: 0x8630, - 0x26: 0x863f, - 0x27: 0x864d, - 0x28: 0x4e55, - 0x29: 0x8654, - 0x2a: 0x865f, - 0x2b: 0x8667, - 0x2c: 0x8671, - 0x2d: 0x8693, - 0x2e: 0x86a3, - 0x2f: 0x86a9, - 0x30: 0x86aa, - 0x31: 0x868b, - 0x32: 0x868c, - 0x33: 0x86b6, - 0x34: 0x86af, - 0x35: 0x86c4, - 0x36: 0x86c6, - 0x37: 0x86b0, - 0x38: 0x86c9, - 0x39: 0x8823, - 0x3a: 0x86ab, - 0x3b: 0x86d4, - 0x3c: 0x86de, - 0x3d: 0x86e9, - 0x3e: 0x86ec, - 0x3f: 0x86df, - 0x40: 0x86db, - 0x41: 0x86ef, - 0x42: 0x8712, - 0x43: 0x8706, - 0x44: 0x8708, - 0x45: 0x8700, - 0x46: 0x8703, - 0x47: 0x86fb, - 0x48: 0x8711, - 0x49: 0x8709, - 0x4a: 0x870d, - 0x4b: 0x86f9, - 0x4c: 0x870a, - 0x4d: 0x8734, - 0x4e: 0x873f, - 0x4f: 0x8737, - 0x50: 0x873b, - 0x51: 0x8725, - 0x52: 0x8729, - 0x53: 0x871a, - 0x54: 0x8760, - 0x55: 0x875f, - 0x56: 0x8778, - 0x57: 0x874c, - 0x58: 0x874e, - 0x59: 0x8774, - 0x5a: 0x8757, - 0x5b: 0x8768, - 0x5c: 0x876e, - 0x5d: 0x8759, - }, - 0x49: [94]uint16{ - 0x00: 0x8753, - 0x01: 0x8763, - 0x02: 0x876a, - 0x03: 0x8805, - 0x04: 0x87a2, - 0x05: 0x879f, - 0x06: 0x8782, - 0x07: 0x87af, - 0x08: 0x87cb, - 0x09: 0x87bd, - 0x0a: 0x87c0, - 0x0b: 0x87d0, - 0x0c: 0x96d6, - 0x0d: 0x87ab, - 0x0e: 0x87c4, - 0x0f: 0x87b3, - 0x10: 0x87c7, - 0x11: 0x87c6, - 0x12: 0x87bb, - 0x13: 0x87ef, - 0x14: 0x87f2, - 0x15: 0x87e0, - 0x16: 0x880f, - 0x17: 0x880d, - 0x18: 0x87fe, - 0x19: 0x87f6, - 0x1a: 0x87f7, - 0x1b: 0x880e, - 0x1c: 0x87d2, - 0x1d: 0x8811, - 0x1e: 0x8816, - 0x1f: 0x8815, - 0x20: 0x8822, - 0x21: 0x8821, - 0x22: 0x8831, - 0x23: 0x8836, - 0x24: 0x8839, - 0x25: 0x8827, - 0x26: 0x883b, - 0x27: 0x8844, - 0x28: 0x8842, - 0x29: 0x8852, - 0x2a: 0x8859, - 0x2b: 0x885e, - 0x2c: 0x8862, - 0x2d: 0x886b, - 0x2e: 0x8881, - 0x2f: 0x887e, - 0x30: 0x889e, - 0x31: 0x8875, - 0x32: 0x887d, - 0x33: 0x88b5, - 0x34: 0x8872, - 0x35: 0x8882, - 0x36: 0x8897, - 0x37: 0x8892, - 0x38: 0x88ae, - 0x39: 0x8899, - 0x3a: 0x88a2, - 0x3b: 0x888d, - 0x3c: 0x88a4, - 0x3d: 0x88b0, - 0x3e: 0x88bf, - 0x3f: 0x88b1, - 0x40: 0x88c3, - 0x41: 0x88c4, - 0x42: 0x88d4, - 0x43: 0x88d8, - 0x44: 0x88d9, - 0x45: 0x88dd, - 0x46: 0x88f9, - 0x47: 0x8902, - 0x48: 0x88fc, - 0x49: 0x88f4, - 0x4a: 0x88e8, - 0x4b: 0x88f2, - 0x4c: 0x8904, - 0x4d: 0x890c, - 0x4e: 0x890a, - 0x4f: 0x8913, - 0x50: 0x8943, - 0x51: 0x891e, - 0x52: 0x8925, - 0x53: 0x892a, - 0x54: 0x892b, - 0x55: 0x8941, - 0x56: 0x8944, - 0x57: 0x893b, - 0x58: 0x8936, - 0x59: 0x8938, - 0x5a: 0x894c, - 0x5b: 0x891d, - 0x5c: 0x8960, - 0x5d: 0x895e, - }, - 0x4a: [94]uint16{ - 0x00: 0x8966, - 0x01: 0x8964, - 0x02: 0x896d, - 0x03: 0x896a, - 0x04: 0x896f, - 0x05: 0x8974, - 0x06: 0x8977, - 0x07: 0x897e, - 0x08: 0x8983, - 0x09: 0x8988, - 0x0a: 0x898a, - 0x0b: 0x8993, - 0x0c: 0x8998, - 0x0d: 0x89a1, - 0x0e: 0x89a9, - 0x0f: 0x89a6, - 0x10: 0x89ac, - 0x11: 0x89af, - 0x12: 0x89b2, - 0x13: 0x89ba, - 0x14: 0x89bd, - 0x15: 0x89bf, - 0x16: 0x89c0, - 0x17: 0x89da, - 0x18: 0x89dc, - 0x19: 0x89dd, - 0x1a: 0x89e7, - 0x1b: 0x89f4, - 0x1c: 0x89f8, - 0x1d: 0x8a03, - 0x1e: 0x8a16, - 0x1f: 0x8a10, - 0x20: 0x8a0c, - 0x21: 0x8a1b, - 0x22: 0x8a1d, - 0x23: 0x8a25, - 0x24: 0x8a36, - 0x25: 0x8a41, - 0x26: 0x8a5b, - 0x27: 0x8a52, - 0x28: 0x8a46, - 0x29: 0x8a48, - 0x2a: 0x8a7c, - 0x2b: 0x8a6d, - 0x2c: 0x8a6c, - 0x2d: 0x8a62, - 0x2e: 0x8a85, - 0x2f: 0x8a82, - 0x30: 0x8a84, - 0x31: 0x8aa8, - 0x32: 0x8aa1, - 0x33: 0x8a91, - 0x34: 0x8aa5, - 0x35: 0x8aa6, - 0x36: 0x8a9a, - 0x37: 0x8aa3, - 0x38: 0x8ac4, - 0x39: 0x8acd, - 0x3a: 0x8ac2, - 0x3b: 0x8ada, - 0x3c: 0x8aeb, - 0x3d: 0x8af3, - 0x3e: 0x8ae7, - 0x3f: 0x8ae4, - 0x40: 0x8af1, - 0x41: 0x8b14, - 0x42: 0x8ae0, - 0x43: 0x8ae2, - 0x44: 0x8af7, - 0x45: 0x8ade, - 0x46: 0x8adb, - 0x47: 0x8b0c, - 0x48: 0x8b07, - 0x49: 0x8b1a, - 0x4a: 0x8ae1, - 0x4b: 0x8b16, - 0x4c: 0x8b10, - 0x4d: 0x8b17, - 0x4e: 0x8b20, - 0x4f: 0x8b33, - 0x50: 0x97ab, - 0x51: 0x8b26, - 0x52: 0x8b2b, - 0x53: 0x8b3e, - 0x54: 0x8b28, - 0x55: 0x8b41, - 0x56: 0x8b4c, - 0x57: 0x8b4f, - 0x58: 0x8b4e, - 0x59: 0x8b49, - 0x5a: 0x8b56, - 0x5b: 0x8b5b, - 0x5c: 0x8b5a, - 0x5d: 0x8b6b, - }, - 0x4b: [94]uint16{ - 0x00: 0x8b5f, - 0x01: 0x8b6c, - 0x02: 0x8b6f, - 0x03: 0x8b74, - 0x04: 0x8b7d, - 0x05: 0x8b80, - 0x06: 0x8b8c, - 0x07: 0x8b8e, - 0x08: 0x8b92, - 0x09: 0x8b93, - 0x0a: 0x8b96, - 0x0b: 0x8b99, - 0x0c: 0x8b9a, - 0x0d: 0x8c3a, - 0x0e: 0x8c41, - 0x0f: 0x8c3f, - 0x10: 0x8c48, - 0x11: 0x8c4c, - 0x12: 0x8c4e, - 0x13: 0x8c50, - 0x14: 0x8c55, - 0x15: 0x8c62, - 0x16: 0x8c6c, - 0x17: 0x8c78, - 0x18: 0x8c7a, - 0x19: 0x8c82, - 0x1a: 0x8c89, - 0x1b: 0x8c85, - 0x1c: 0x8c8a, - 0x1d: 0x8c8d, - 0x1e: 0x8c8e, - 0x1f: 0x8c94, - 0x20: 0x8c7c, - 0x21: 0x8c98, - 0x22: 0x621d, - 0x23: 0x8cad, - 0x24: 0x8caa, - 0x25: 0x8cbd, - 0x26: 0x8cb2, - 0x27: 0x8cb3, - 0x28: 0x8cae, - 0x29: 0x8cb6, - 0x2a: 0x8cc8, - 0x2b: 0x8cc1, - 0x2c: 0x8ce4, - 0x2d: 0x8ce3, - 0x2e: 0x8cda, - 0x2f: 0x8cfd, - 0x30: 0x8cfa, - 0x31: 0x8cfb, - 0x32: 0x8d04, - 0x33: 0x8d05, - 0x34: 0x8d0a, - 0x35: 0x8d07, - 0x36: 0x8d0f, - 0x37: 0x8d0d, - 0x38: 0x8d10, - 0x39: 0x9f4e, - 0x3a: 0x8d13, - 0x3b: 0x8ccd, - 0x3c: 0x8d14, - 0x3d: 0x8d16, - 0x3e: 0x8d67, - 0x3f: 0x8d6d, - 0x40: 0x8d71, - 0x41: 0x8d73, - 0x42: 0x8d81, - 0x43: 0x8d99, - 0x44: 0x8dc2, - 0x45: 0x8dbe, - 0x46: 0x8dba, - 0x47: 0x8dcf, - 0x48: 0x8dda, - 0x49: 0x8dd6, - 0x4a: 0x8dcc, - 0x4b: 0x8ddb, - 0x4c: 0x8dcb, - 0x4d: 0x8dea, - 0x4e: 0x8deb, - 0x4f: 0x8ddf, - 0x50: 0x8de3, - 0x51: 0x8dfc, - 0x52: 0x8e08, - 0x53: 0x8e09, - 0x54: 0x8dff, - 0x55: 0x8e1d, - 0x56: 0x8e1e, - 0x57: 0x8e10, - 0x58: 0x8e1f, - 0x59: 0x8e42, - 0x5a: 0x8e35, - 0x5b: 0x8e30, - 0x5c: 0x8e34, - 0x5d: 0x8e4a, - }, - 0x4c: [94]uint16{ - 0x00: 0x8e47, - 0x01: 0x8e49, - 0x02: 0x8e4c, - 0x03: 0x8e50, - 0x04: 0x8e48, - 0x05: 0x8e59, - 0x06: 0x8e64, - 0x07: 0x8e60, - 0x08: 0x8e2a, - 0x09: 0x8e63, - 0x0a: 0x8e55, - 0x0b: 0x8e76, - 0x0c: 0x8e72, - 0x0d: 0x8e7c, - 0x0e: 0x8e81, - 0x0f: 0x8e87, - 0x10: 0x8e85, - 0x11: 0x8e84, - 0x12: 0x8e8b, - 0x13: 0x8e8a, - 0x14: 0x8e93, - 0x15: 0x8e91, - 0x16: 0x8e94, - 0x17: 0x8e99, - 0x18: 0x8eaa, - 0x19: 0x8ea1, - 0x1a: 0x8eac, - 0x1b: 0x8eb0, - 0x1c: 0x8ec6, - 0x1d: 0x8eb1, - 0x1e: 0x8ebe, - 0x1f: 0x8ec5, - 0x20: 0x8ec8, - 0x21: 0x8ecb, - 0x22: 0x8edb, - 0x23: 0x8ee3, - 0x24: 0x8efc, - 0x25: 0x8efb, - 0x26: 0x8eeb, - 0x27: 0x8efe, - 0x28: 0x8f0a, - 0x29: 0x8f05, - 0x2a: 0x8f15, - 0x2b: 0x8f12, - 0x2c: 0x8f19, - 0x2d: 0x8f13, - 0x2e: 0x8f1c, - 0x2f: 0x8f1f, - 0x30: 0x8f1b, - 0x31: 0x8f0c, - 0x32: 0x8f26, - 0x33: 0x8f33, - 0x34: 0x8f3b, - 0x35: 0x8f39, - 0x36: 0x8f45, - 0x37: 0x8f42, - 0x38: 0x8f3e, - 0x39: 0x8f4c, - 0x3a: 0x8f49, - 0x3b: 0x8f46, - 0x3c: 0x8f4e, - 0x3d: 0x8f57, - 0x3e: 0x8f5c, - 0x3f: 0x8f62, - 0x40: 0x8f63, - 0x41: 0x8f64, - 0x42: 0x8f9c, - 0x43: 0x8f9f, - 0x44: 0x8fa3, - 0x45: 0x8fad, - 0x46: 0x8faf, - 0x47: 0x8fb7, - 0x48: 0x8fda, - 0x49: 0x8fe5, - 0x4a: 0x8fe2, - 0x4b: 0x8fea, - 0x4c: 0x8fef, - 0x4d: 0x9087, - 0x4e: 0x8ff4, - 0x4f: 0x9005, - 0x50: 0x8ff9, - 0x51: 0x8ffa, - 0x52: 0x9011, - 0x53: 0x9015, - 0x54: 0x9021, - 0x55: 0x900d, - 0x56: 0x901e, - 0x57: 0x9016, - 0x58: 0x900b, - 0x59: 0x9027, - 0x5a: 0x9036, - 0x5b: 0x9035, - 0x5c: 0x9039, - 0x5d: 0x8ff8, - }, - 0x4d: [94]uint16{ - 0x00: 0x904f, - 0x01: 0x9050, - 0x02: 0x9051, - 0x03: 0x9052, - 0x04: 0x900e, - 0x05: 0x9049, - 0x06: 0x903e, - 0x07: 0x9056, - 0x08: 0x9058, - 0x09: 0x905e, - 0x0a: 0x9068, - 0x0b: 0x906f, - 0x0c: 0x9076, - 0x0d: 0x96a8, - 0x0e: 0x9072, - 0x0f: 0x9082, - 0x10: 0x907d, - 0x11: 0x9081, - 0x12: 0x9080, - 0x13: 0x908a, - 0x14: 0x9089, - 0x15: 0x908f, - 0x16: 0x90a8, - 0x17: 0x90af, - 0x18: 0x90b1, - 0x19: 0x90b5, - 0x1a: 0x90e2, - 0x1b: 0x90e4, - 0x1c: 0x6248, - 0x1d: 0x90db, - 0x1e: 0x9102, - 0x1f: 0x9112, - 0x20: 0x9119, - 0x21: 0x9132, - 0x22: 0x9130, - 0x23: 0x914a, - 0x24: 0x9156, - 0x25: 0x9158, - 0x26: 0x9163, - 0x27: 0x9165, - 0x28: 0x9169, - 0x29: 0x9173, - 0x2a: 0x9172, - 0x2b: 0x918b, - 0x2c: 0x9189, - 0x2d: 0x9182, - 0x2e: 0x91a2, - 0x2f: 0x91ab, - 0x30: 0x91af, - 0x31: 0x91aa, - 0x32: 0x91b5, - 0x33: 0x91b4, - 0x34: 0x91ba, - 0x35: 0x91c0, - 0x36: 0x91c1, - 0x37: 0x91c9, - 0x38: 0x91cb, - 0x39: 0x91d0, - 0x3a: 0x91d6, - 0x3b: 0x91df, - 0x3c: 0x91e1, - 0x3d: 0x91db, - 0x3e: 0x91fc, - 0x3f: 0x91f5, - 0x40: 0x91f6, - 0x41: 0x921e, - 0x42: 0x91ff, - 0x43: 0x9214, - 0x44: 0x922c, - 0x45: 0x9215, - 0x46: 0x9211, - 0x47: 0x925e, - 0x48: 0x9257, - 0x49: 0x9245, - 0x4a: 0x9249, - 0x4b: 0x9264, - 0x4c: 0x9248, - 0x4d: 0x9295, - 0x4e: 0x923f, - 0x4f: 0x924b, - 0x50: 0x9250, - 0x51: 0x929c, - 0x52: 0x9296, - 0x53: 0x9293, - 0x54: 0x929b, - 0x55: 0x925a, - 0x56: 0x92cf, - 0x57: 0x92b9, - 0x58: 0x92b7, - 0x59: 0x92e9, - 0x5a: 0x930f, - 0x5b: 0x92fa, - 0x5c: 0x9344, - 0x5d: 0x932e, - }, - 0x4e: [94]uint16{ - 0x00: 0x9319, - 0x01: 0x9322, - 0x02: 0x931a, - 0x03: 0x9323, - 0x04: 0x933a, - 0x05: 0x9335, - 0x06: 0x933b, - 0x07: 0x935c, - 0x08: 0x9360, - 0x09: 0x937c, - 0x0a: 0x936e, - 0x0b: 0x9356, - 0x0c: 0x93b0, - 0x0d: 0x93ac, - 0x0e: 0x93ad, - 0x0f: 0x9394, - 0x10: 0x93b9, - 0x11: 0x93d6, - 0x12: 0x93d7, - 0x13: 0x93e8, - 0x14: 0x93e5, - 0x15: 0x93d8, - 0x16: 0x93c3, - 0x17: 0x93dd, - 0x18: 0x93d0, - 0x19: 0x93c8, - 0x1a: 0x93e4, - 0x1b: 0x941a, - 0x1c: 0x9414, - 0x1d: 0x9413, - 0x1e: 0x9403, - 0x1f: 0x9407, - 0x20: 0x9410, - 0x21: 0x9436, - 0x22: 0x942b, - 0x23: 0x9435, - 0x24: 0x9421, - 0x25: 0x943a, - 0x26: 0x9441, - 0x27: 0x9452, - 0x28: 0x9444, - 0x29: 0x945b, - 0x2a: 0x9460, - 0x2b: 0x9462, - 0x2c: 0x945e, - 0x2d: 0x946a, - 0x2e: 0x9229, - 0x2f: 0x9470, - 0x30: 0x9475, - 0x31: 0x9477, - 0x32: 0x947d, - 0x33: 0x945a, - 0x34: 0x947c, - 0x35: 0x947e, - 0x36: 0x9481, - 0x37: 0x947f, - 0x38: 0x9582, - 0x39: 0x9587, - 0x3a: 0x958a, - 0x3b: 0x9594, - 0x3c: 0x9596, - 0x3d: 0x9598, - 0x3e: 0x9599, - 0x3f: 0x95a0, - 0x40: 0x95a8, - 0x41: 0x95a7, - 0x42: 0x95ad, - 0x43: 0x95bc, - 0x44: 0x95bb, - 0x45: 0x95b9, - 0x46: 0x95be, - 0x47: 0x95ca, - 0x48: 0x6ff6, - 0x49: 0x95c3, - 0x4a: 0x95cd, - 0x4b: 0x95cc, - 0x4c: 0x95d5, - 0x4d: 0x95d4, - 0x4e: 0x95d6, - 0x4f: 0x95dc, - 0x50: 0x95e1, - 0x51: 0x95e5, - 0x52: 0x95e2, - 0x53: 0x9621, - 0x54: 0x9628, - 0x55: 0x962e, - 0x56: 0x962f, - 0x57: 0x9642, - 0x58: 0x964c, - 0x59: 0x964f, - 0x5a: 0x964b, - 0x5b: 0x9677, - 0x5c: 0x965c, - 0x5d: 0x965e, - }, - 0x4f: [94]uint16{ - 0x00: 0x965d, - 0x01: 0x965f, - 0x02: 0x9666, - 0x03: 0x9672, - 0x04: 0x966c, - 0x05: 0x968d, - 0x06: 0x9698, - 0x07: 0x9695, - 0x08: 0x9697, - 0x09: 0x96aa, - 0x0a: 0x96a7, - 0x0b: 0x96b1, - 0x0c: 0x96b2, - 0x0d: 0x96b0, - 0x0e: 0x96b4, - 0x0f: 0x96b6, - 0x10: 0x96b8, - 0x11: 0x96b9, - 0x12: 0x96ce, - 0x13: 0x96cb, - 0x14: 0x96c9, - 0x15: 0x96cd, - 0x16: 0x894d, - 0x17: 0x96dc, - 0x18: 0x970d, - 0x19: 0x96d5, - 0x1a: 0x96f9, - 0x1b: 0x9704, - 0x1c: 0x9706, - 0x1d: 0x9708, - 0x1e: 0x9713, - 0x1f: 0x970e, - 0x20: 0x9711, - 0x21: 0x970f, - 0x22: 0x9716, - 0x23: 0x9719, - 0x24: 0x9724, - 0x25: 0x972a, - 0x26: 0x9730, - 0x27: 0x9739, - 0x28: 0x973d, - 0x29: 0x973e, - 0x2a: 0x9744, - 0x2b: 0x9746, - 0x2c: 0x9748, - 0x2d: 0x9742, - 0x2e: 0x9749, - 0x2f: 0x975c, - 0x30: 0x9760, - 0x31: 0x9764, - 0x32: 0x9766, - 0x33: 0x9768, - 0x34: 0x52d2, - 0x35: 0x976b, - 0x36: 0x9771, - 0x37: 0x9779, - 0x38: 0x9785, - 0x39: 0x977c, - 0x3a: 0x9781, - 0x3b: 0x977a, - 0x3c: 0x9786, - 0x3d: 0x978b, - 0x3e: 0x978f, - 0x3f: 0x9790, - 0x40: 0x979c, - 0x41: 0x97a8, - 0x42: 0x97a6, - 0x43: 0x97a3, - 0x44: 0x97b3, - 0x45: 0x97b4, - 0x46: 0x97c3, - 0x47: 0x97c6, - 0x48: 0x97c8, - 0x49: 0x97cb, - 0x4a: 0x97dc, - 0x4b: 0x97ed, - 0x4c: 0x9f4f, - 0x4d: 0x97f2, - 0x4e: 0x7adf, - 0x4f: 0x97f6, - 0x50: 0x97f5, - 0x51: 0x980f, - 0x52: 0x980c, - 0x53: 0x9838, - 0x54: 0x9824, - 0x55: 0x9821, - 0x56: 0x9837, - 0x57: 0x983d, - 0x58: 0x9846, - 0x59: 0x984f, - 0x5a: 0x984b, - 0x5b: 0x986b, - 0x5c: 0x986f, - 0x5d: 0x9870, - }, - 0x50: [94]uint16{ - 0x00: 0x9871, - 0x01: 0x9874, - 0x02: 0x9873, - 0x03: 0x98aa, - 0x04: 0x98af, - 0x05: 0x98b1, - 0x06: 0x98b6, - 0x07: 0x98c4, - 0x08: 0x98c3, - 0x09: 0x98c6, - 0x0a: 0x98e9, - 0x0b: 0x98eb, - 0x0c: 0x9903, - 0x0d: 0x9909, - 0x0e: 0x9912, - 0x0f: 0x9914, - 0x10: 0x9918, - 0x11: 0x9921, - 0x12: 0x991d, - 0x13: 0x991e, - 0x14: 0x9924, - 0x15: 0x9920, - 0x16: 0x992c, - 0x17: 0x992e, - 0x18: 0x993d, - 0x19: 0x993e, - 0x1a: 0x9942, - 0x1b: 0x9949, - 0x1c: 0x9945, - 0x1d: 0x9950, - 0x1e: 0x994b, - 0x1f: 0x9951, - 0x20: 0x9952, - 0x21: 0x994c, - 0x22: 0x9955, - 0x23: 0x9997, - 0x24: 0x9998, - 0x25: 0x99a5, - 0x26: 0x99ad, - 0x27: 0x99ae, - 0x28: 0x99bc, - 0x29: 0x99df, - 0x2a: 0x99db, - 0x2b: 0x99dd, - 0x2c: 0x99d8, - 0x2d: 0x99d1, - 0x2e: 0x99ed, - 0x2f: 0x99ee, - 0x30: 0x99f1, - 0x31: 0x99f2, - 0x32: 0x99fb, - 0x33: 0x99f8, - 0x34: 0x9a01, - 0x35: 0x9a0f, - 0x36: 0x9a05, - 0x37: 0x99e2, - 0x38: 0x9a19, - 0x39: 0x9a2b, - 0x3a: 0x9a37, - 0x3b: 0x9a45, - 0x3c: 0x9a42, - 0x3d: 0x9a40, - 0x3e: 0x9a43, - 0x3f: 0x9a3e, - 0x40: 0x9a55, - 0x41: 0x9a4d, - 0x42: 0x9a5b, - 0x43: 0x9a57, - 0x44: 0x9a5f, - 0x45: 0x9a62, - 0x46: 0x9a65, - 0x47: 0x9a64, - 0x48: 0x9a69, - 0x49: 0x9a6b, - 0x4a: 0x9a6a, - 0x4b: 0x9aad, - 0x4c: 0x9ab0, - 0x4d: 0x9abc, - 0x4e: 0x9ac0, - 0x4f: 0x9acf, - 0x50: 0x9ad1, - 0x51: 0x9ad3, - 0x52: 0x9ad4, - 0x53: 0x9ade, - 0x54: 0x9adf, - 0x55: 0x9ae2, - 0x56: 0x9ae3, - 0x57: 0x9ae6, - 0x58: 0x9aef, - 0x59: 0x9aeb, - 0x5a: 0x9aee, - 0x5b: 0x9af4, - 0x5c: 0x9af1, - 0x5d: 0x9af7, - }, - 0x51: [94]uint16{ - 0x00: 0x9afb, - 0x01: 0x9b06, - 0x02: 0x9b18, - 0x03: 0x9b1a, - 0x04: 0x9b1f, - 0x05: 0x9b22, - 0x06: 0x9b23, - 0x07: 0x9b25, - 0x08: 0x9b27, - 0x09: 0x9b28, - 0x0a: 0x9b29, - 0x0b: 0x9b2a, - 0x0c: 0x9b2e, - 0x0d: 0x9b2f, - 0x0e: 0x9b32, - 0x0f: 0x9b44, - 0x10: 0x9b43, - 0x11: 0x9b4f, - 0x12: 0x9b4d, - 0x13: 0x9b4e, - 0x14: 0x9b51, - 0x15: 0x9b58, - 0x16: 0x9b74, - 0x17: 0x9b93, - 0x18: 0x9b83, - 0x19: 0x9b91, - 0x1a: 0x9b96, - 0x1b: 0x9b97, - 0x1c: 0x9b9f, - 0x1d: 0x9ba0, - 0x1e: 0x9ba8, - 0x1f: 0x9bb4, - 0x20: 0x9bc0, - 0x21: 0x9bca, - 0x22: 0x9bb9, - 0x23: 0x9bc6, - 0x24: 0x9bcf, - 0x25: 0x9bd1, - 0x26: 0x9bd2, - 0x27: 0x9be3, - 0x28: 0x9be2, - 0x29: 0x9be4, - 0x2a: 0x9bd4, - 0x2b: 0x9be1, - 0x2c: 0x9c3a, - 0x2d: 0x9bf2, - 0x2e: 0x9bf1, - 0x2f: 0x9bf0, - 0x30: 0x9c15, - 0x31: 0x9c14, - 0x32: 0x9c09, - 0x33: 0x9c13, - 0x34: 0x9c0c, - 0x35: 0x9c06, - 0x36: 0x9c08, - 0x37: 0x9c12, - 0x38: 0x9c0a, - 0x39: 0x9c04, - 0x3a: 0x9c2e, - 0x3b: 0x9c1b, - 0x3c: 0x9c25, - 0x3d: 0x9c24, - 0x3e: 0x9c21, - 0x3f: 0x9c30, - 0x40: 0x9c47, - 0x41: 0x9c32, - 0x42: 0x9c46, - 0x43: 0x9c3e, - 0x44: 0x9c5a, - 0x45: 0x9c60, - 0x46: 0x9c67, - 0x47: 0x9c76, - 0x48: 0x9c78, - 0x49: 0x9ce7, - 0x4a: 0x9cec, - 0x4b: 0x9cf0, - 0x4c: 0x9d09, - 0x4d: 0x9d08, - 0x4e: 0x9ceb, - 0x4f: 0x9d03, - 0x50: 0x9d06, - 0x51: 0x9d2a, - 0x52: 0x9d26, - 0x53: 0x9daf, - 0x54: 0x9d23, - 0x55: 0x9d1f, - 0x56: 0x9d44, - 0x57: 0x9d15, - 0x58: 0x9d12, - 0x59: 0x9d41, - 0x5a: 0x9d3f, - 0x5b: 0x9d3e, - 0x5c: 0x9d46, - 0x5d: 0x9d48, - }, - 0x52: [94]uint16{ - 0x00: 0x9d5d, - 0x01: 0x9d5e, - 0x02: 0x9d64, - 0x03: 0x9d51, - 0x04: 0x9d50, - 0x05: 0x9d59, - 0x06: 0x9d72, - 0x07: 0x9d89, - 0x08: 0x9d87, - 0x09: 0x9dab, - 0x0a: 0x9d6f, - 0x0b: 0x9d7a, - 0x0c: 0x9d9a, - 0x0d: 0x9da4, - 0x0e: 0x9da9, - 0x0f: 0x9db2, - 0x10: 0x9dc4, - 0x11: 0x9dc1, - 0x12: 0x9dbb, - 0x13: 0x9db8, - 0x14: 0x9dba, - 0x15: 0x9dc6, - 0x16: 0x9dcf, - 0x17: 0x9dc2, - 0x18: 0x9dd9, - 0x19: 0x9dd3, - 0x1a: 0x9df8, - 0x1b: 0x9de6, - 0x1c: 0x9ded, - 0x1d: 0x9def, - 0x1e: 0x9dfd, - 0x1f: 0x9e1a, - 0x20: 0x9e1b, - 0x21: 0x9e1e, - 0x22: 0x9e75, - 0x23: 0x9e79, - 0x24: 0x9e7d, - 0x25: 0x9e81, - 0x26: 0x9e88, - 0x27: 0x9e8b, - 0x28: 0x9e8c, - 0x29: 0x9e92, - 0x2a: 0x9e95, - 0x2b: 0x9e91, - 0x2c: 0x9e9d, - 0x2d: 0x9ea5, - 0x2e: 0x9ea9, - 0x2f: 0x9eb8, - 0x30: 0x9eaa, - 0x31: 0x9ead, - 0x32: 0x9761, - 0x33: 0x9ecc, - 0x34: 0x9ece, - 0x35: 0x9ecf, - 0x36: 0x9ed0, - 0x37: 0x9ed4, - 0x38: 0x9edc, - 0x39: 0x9ede, - 0x3a: 0x9edd, - 0x3b: 0x9ee0, - 0x3c: 0x9ee5, - 0x3d: 0x9ee8, - 0x3e: 0x9eef, - 0x3f: 0x9ef4, - 0x40: 0x9ef6, - 0x41: 0x9ef7, - 0x42: 0x9ef9, - 0x43: 0x9efb, - 0x44: 0x9efc, - 0x45: 0x9efd, - 0x46: 0x9f07, - 0x47: 0x9f08, - 0x48: 0x76b7, - 0x49: 0x9f15, - 0x4a: 0x9f21, - 0x4b: 0x9f2c, - 0x4c: 0x9f3e, - 0x4d: 0x9f4a, - 0x4e: 0x9f52, - 0x4f: 0x9f54, - 0x50: 0x9f63, - 0x51: 0x9f5f, - 0x52: 0x9f60, - 0x53: 0x9f61, - 0x54: 0x9f66, - 0x55: 0x9f67, - 0x56: 0x9f6c, - 0x57: 0x9f6a, - 0x58: 0x9f77, - 0x59: 0x9f72, - 0x5a: 0x9f76, - 0x5b: 0x9f95, - 0x5c: 0x9f9c, - 0x5d: 0x9fa0, - }, - 0x53: [94]uint16{ - 0x00: 0x582f, - 0x01: 0x69c7, - 0x02: 0x9059, - 0x03: 0x7464, - 0x04: 0x51dc, - 0x05: 0x7199, - }, - 0x58: [94]uint16{ - 0x00: 0x7e8a, - 0x01: 0x891c, - 0x02: 0x9348, - 0x03: 0x9288, - 0x04: 0x84dc, - 0x05: 0x4fc9, - 0x06: 0x70bb, - 0x07: 0x6631, - 0x08: 0x68c8, - 0x09: 0x92f9, - 0x0a: 0x66fb, - 0x0b: 0x5f45, - 0x0c: 0x4e28, - 0x0d: 0x4ee1, - 0x0e: 0x4efc, - 0x0f: 0x4f00, - 0x10: 0x4f03, - 0x11: 0x4f39, - 0x12: 0x4f56, - 0x13: 0x4f92, - 0x14: 0x4f8a, - 0x15: 0x4f9a, - 0x16: 0x4f94, - 0x17: 0x4fcd, - 0x18: 0x5040, - 0x19: 0x5022, - 0x1a: 0x4fff, - 0x1b: 0x501e, - 0x1c: 0x5046, - 0x1d: 0x5070, - 0x1e: 0x5042, - 0x1f: 0x5094, - 0x20: 0x50f4, - 0x21: 0x50d8, - 0x22: 0x514a, - 0x23: 0x5164, - 0x24: 0x519d, - 0x25: 0x51be, - 0x26: 0x51ec, - 0x27: 0x5215, - 0x28: 0x529c, - 0x29: 0x52a6, - 0x2a: 0x52c0, - 0x2b: 0x52db, - 0x2c: 0x5300, - 0x2d: 0x5307, - 0x2e: 0x5324, - 0x2f: 0x5372, - 0x30: 0x5393, - 0x31: 0x53b2, - 0x32: 0x53dd, - 0x33: 0xfa0e, - 0x34: 0x549c, - 0x35: 0x548a, - 0x36: 0x54a9, - 0x37: 0x54ff, - 0x38: 0x5586, - 0x39: 0x5759, - 0x3a: 0x5765, - 0x3b: 0x57ac, - 0x3c: 0x57c8, - 0x3d: 0x57c7, - 0x3e: 0xfa0f, - 0x3f: 0xfa10, - 0x40: 0x589e, - 0x41: 0x58b2, - 0x42: 0x590b, - 0x43: 0x5953, - 0x44: 0x595b, - 0x45: 0x595d, - 0x46: 0x5963, - 0x47: 0x59a4, - 0x48: 0x59ba, - 0x49: 0x5b56, - 0x4a: 0x5bc0, - 0x4b: 0x752f, - 0x4c: 0x5bd8, - 0x4d: 0x5bec, - 0x4e: 0x5c1e, - 0x4f: 0x5ca6, - 0x50: 0x5cba, - 0x51: 0x5cf5, - 0x52: 0x5d27, - 0x53: 0x5d53, - 0x54: 0xfa11, - 0x55: 0x5d42, - 0x56: 0x5d6d, - 0x57: 0x5db8, - 0x58: 0x5db9, - 0x59: 0x5dd0, - 0x5a: 0x5f21, - 0x5b: 0x5f34, - 0x5c: 0x5f67, - 0x5d: 0x5fb7, - }, - 0x59: [94]uint16{ - 0x00: 0x5fde, - 0x01: 0x605d, - 0x02: 0x6085, - 0x03: 0x608a, - 0x04: 0x60de, - 0x05: 0x60d5, - 0x06: 0x6120, - 0x07: 0x60f2, - 0x08: 0x6111, - 0x09: 0x6137, - 0x0a: 0x6130, - 0x0b: 0x6198, - 0x0c: 0x6213, - 0x0d: 0x62a6, - 0x0e: 0x63f5, - 0x0f: 0x6460, - 0x10: 0x649d, - 0x11: 0x64ce, - 0x12: 0x654e, - 0x13: 0x6600, - 0x14: 0x6615, - 0x15: 0x663b, - 0x16: 0x6609, - 0x17: 0x662e, - 0x18: 0x661e, - 0x19: 0x6624, - 0x1a: 0x6665, - 0x1b: 0x6657, - 0x1c: 0x6659, - 0x1d: 0xfa12, - 0x1e: 0x6673, - 0x1f: 0x6699, - 0x20: 0x66a0, - 0x21: 0x66b2, - 0x22: 0x66bf, - 0x23: 0x66fa, - 0x24: 0x670e, - 0x25: 0xf929, - 0x26: 0x6766, - 0x27: 0x67bb, - 0x28: 0x6852, - 0x29: 0x67c0, - 0x2a: 0x6801, - 0x2b: 0x6844, - 0x2c: 0x68cf, - 0x2d: 0xfa13, - 0x2e: 0x6968, - 0x2f: 0xfa14, - 0x30: 0x6998, - 0x31: 0x69e2, - 0x32: 0x6a30, - 0x33: 0x6a6b, - 0x34: 0x6a46, - 0x35: 0x6a73, - 0x36: 0x6a7e, - 0x37: 0x6ae2, - 0x38: 0x6ae4, - 0x39: 0x6bd6, - 0x3a: 0x6c3f, - 0x3b: 0x6c5c, - 0x3c: 0x6c86, - 0x3d: 0x6c6f, - 0x3e: 0x6cda, - 0x3f: 0x6d04, - 0x40: 0x6d87, - 0x41: 0x6d6f, - 0x42: 0x6d96, - 0x43: 0x6dac, - 0x44: 0x6dcf, - 0x45: 0x6df8, - 0x46: 0x6df2, - 0x47: 0x6dfc, - 0x48: 0x6e39, - 0x49: 0x6e5c, - 0x4a: 0x6e27, - 0x4b: 0x6e3c, - 0x4c: 0x6ebf, - 0x4d: 0x6f88, - 0x4e: 0x6fb5, - 0x4f: 0x6ff5, - 0x50: 0x7005, - 0x51: 0x7007, - 0x52: 0x7028, - 0x53: 0x7085, - 0x54: 0x70ab, - 0x55: 0x710f, - 0x56: 0x7104, - 0x57: 0x715c, - 0x58: 0x7146, - 0x59: 0x7147, - 0x5a: 0xfa15, - 0x5b: 0x71c1, - 0x5c: 0x71fe, - 0x5d: 0x72b1, - }, - 0x5a: [94]uint16{ - 0x00: 0x72be, - 0x01: 0x7324, - 0x02: 0xfa16, - 0x03: 0x7377, - 0x04: 0x73bd, - 0x05: 0x73c9, - 0x06: 0x73d6, - 0x07: 0x73e3, - 0x08: 0x73d2, - 0x09: 0x7407, - 0x0a: 0x73f5, - 0x0b: 0x7426, - 0x0c: 0x742a, - 0x0d: 0x7429, - 0x0e: 0x742e, - 0x0f: 0x7462, - 0x10: 0x7489, - 0x11: 0x749f, - 0x12: 0x7501, - 0x13: 0x756f, - 0x14: 0x7682, - 0x15: 0x769c, - 0x16: 0x769e, - 0x17: 0x769b, - 0x18: 0x76a6, - 0x19: 0xfa17, - 0x1a: 0x7746, - 0x1b: 0x52af, - 0x1c: 0x7821, - 0x1d: 0x784e, - 0x1e: 0x7864, - 0x1f: 0x787a, - 0x20: 0x7930, - 0x21: 0xfa18, - 0x22: 0xfa19, - 0x23: 0xfa1a, - 0x24: 0x7994, - 0x25: 0xfa1b, - 0x26: 0x799b, - 0x27: 0x7ad1, - 0x28: 0x7ae7, - 0x29: 0xfa1c, - 0x2a: 0x7aeb, - 0x2b: 0x7b9e, - 0x2c: 0xfa1d, - 0x2d: 0x7d48, - 0x2e: 0x7d5c, - 0x2f: 0x7db7, - 0x30: 0x7da0, - 0x31: 0x7dd6, - 0x32: 0x7e52, - 0x33: 0x7f47, - 0x34: 0x7fa1, - 0x35: 0xfa1e, - 0x36: 0x8301, - 0x37: 0x8362, - 0x38: 0x837f, - 0x39: 0x83c7, - 0x3a: 0x83f6, - 0x3b: 0x8448, - 0x3c: 0x84b4, - 0x3d: 0x8553, - 0x3e: 0x8559, - 0x3f: 0x856b, - 0x40: 0xfa1f, - 0x41: 0x85b0, - 0x42: 0xfa20, - 0x43: 0xfa21, - 0x44: 0x8807, - 0x45: 0x88f5, - 0x46: 0x8a12, - 0x47: 0x8a37, - 0x48: 0x8a79, - 0x49: 0x8aa7, - 0x4a: 0x8abe, - 0x4b: 0x8adf, - 0x4c: 0xfa22, - 0x4d: 0x8af6, - 0x4e: 0x8b53, - 0x4f: 0x8b7f, - 0x50: 0x8cf0, - 0x51: 0x8cf4, - 0x52: 0x8d12, - 0x53: 0x8d76, - 0x54: 0xfa23, - 0x55: 0x8ecf, - 0x56: 0xfa24, - 0x57: 0xfa25, - 0x58: 0x9067, - 0x59: 0x90de, - 0x5a: 0xfa26, - 0x5b: 0x9115, - 0x5c: 0x9127, - 0x5d: 0x91da, - }, - 0x5b: [94]uint16{ - 0x00: 0x91d7, - 0x01: 0x91de, - 0x02: 0x91ed, - 0x03: 0x91ee, - 0x04: 0x91e4, - 0x05: 0x91e5, - 0x06: 0x9206, - 0x07: 0x9210, - 0x08: 0x920a, - 0x09: 0x923a, - 0x0a: 0x9240, - 0x0b: 0x923c, - 0x0c: 0x924e, - 0x0d: 0x9259, - 0x0e: 0x9251, - 0x0f: 0x9239, - 0x10: 0x9267, - 0x11: 0x92a7, - 0x12: 0x9277, - 0x13: 0x9278, - 0x14: 0x92e7, - 0x15: 0x92d7, - 0x16: 0x92d9, - 0x17: 0x92d0, - 0x18: 0xfa27, - 0x19: 0x92d5, - 0x1a: 0x92e0, - 0x1b: 0x92d3, - 0x1c: 0x9325, - 0x1d: 0x9321, - 0x1e: 0x92fb, - 0x1f: 0xfa28, - 0x20: 0x931e, - 0x21: 0x92ff, - 0x22: 0x931d, - 0x23: 0x9302, - 0x24: 0x9370, - 0x25: 0x9357, - 0x26: 0x93a4, - 0x27: 0x93c6, - 0x28: 0x93de, - 0x29: 0x93f8, - 0x2a: 0x9431, - 0x2b: 0x9445, - 0x2c: 0x9448, - 0x2d: 0x9592, - 0x2e: 0xf9dc, - 0x2f: 0xfa29, - 0x30: 0x969d, - 0x31: 0x96af, - 0x32: 0x9733, - 0x33: 0x973b, - 0x34: 0x9743, - 0x35: 0x974d, - 0x36: 0x974f, - 0x37: 0x9751, - 0x38: 0x9755, - 0x39: 0x9857, - 0x3a: 0x9865, - 0x3b: 0xfa2a, - 0x3c: 0xfa2b, - 0x3d: 0x9927, - 0x3e: 0xfa2c, - 0x3f: 0x999e, - 0x40: 0x9a4e, - 0x41: 0x9ad9, - 0x42: 0x9adc, - 0x43: 0x9b75, - 0x44: 0x9b72, - 0x45: 0x9b8f, - 0x46: 0x9bb1, - 0x47: 0x9bbb, - 0x48: 0x9c00, - 0x49: 0x9d70, - 0x4a: 0x9d6b, - 0x4b: 0xfa2d, - 0x4c: 0x9e19, - 0x4d: 0x9ed1, - 0x50: 0x2170, - 0x51: 0x2171, - 0x52: 0x2172, - 0x53: 0x2173, - 0x54: 0x2174, - 0x55: 0x2175, - 0x56: 0x2176, - 0x57: 0x2177, - 0x58: 0x2178, - 0x59: 0x2179, - 0x5b: 0xffe4, - 0x5c: 0xff07, - 0x5d: 0xff02, - }, - }, -} diff --git a/vendor/github.com/Tang-RoseChild/mahonia/reader.go b/vendor/github.com/Tang-RoseChild/mahonia/reader.go deleted file mode 100644 index 3514b95b8..000000000 --- a/vendor/github.com/Tang-RoseChild/mahonia/reader.go +++ /dev/null @@ -1,151 +0,0 @@ -package mahonia - -// This file is based on bufio.Reader in the Go standard library, -// which has the following copyright notice: - -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -import ( - "io" - "unicode/utf8" -) - -const ( - defaultBufSize = 4096 -) - -// Reader implements character-set decoding for an io.Reader object. -type Reader struct { - buf []byte - rd io.Reader - decode Decoder - r, w int - err error -} - -// NewReader creates a new Reader that uses the receiver to decode text. -func (d Decoder) NewReader(rd io.Reader) *Reader { - b := new(Reader) - b.buf = make([]byte, defaultBufSize) - b.rd = rd - b.decode = d - return b -} - -// fill reads a new chunk into the buffer. -func (b *Reader) fill() { - // Slide existing data to beginning. - if b.r > 0 { - copy(b.buf, b.buf[b.r:b.w]) - b.w -= b.r - b.r = 0 - } - - // Read new data. - n, e := b.rd.Read(b.buf[b.w:]) - b.w += n - if e != nil { - b.err = e - } -} - -// Read reads data into p. -// It returns the number of bytes read into p. -// It calls Read at most once on the underlying Reader, -// hence n may be less than len(p). -// At EOF, the count will be zero and err will be os.EOF. -func (b *Reader) Read(p []byte) (n int, err error) { - n = len(p) - filled := false - if n == 0 { - return 0, b.err - } - if b.w == b.r { - if b.err != nil { - return 0, b.err - } - if n > len(b.buf) { - // Large read, empty buffer. - // Allocate a larger buffer for efficiency. - b.buf = make([]byte, n) - } - b.fill() - filled = true - if b.w == b.r { - return 0, b.err - } - } - - i := 0 - for i < n { - rune, size, status := b.decode(b.buf[b.r:b.w]) - - if status == STATE_ONLY { - b.r += size - continue - } - - if status == NO_ROOM { - if b.err != nil { - rune = 0xfffd - size = b.w - b.r - if size == 0 { - break - } - status = INVALID_CHAR - } else if filled { - break - } else { - b.fill() - filled = true - continue - } - } - - if i+utf8.RuneLen(rune) > n { - break - } - - b.r += size - if rune < 128 { - p[i] = byte(rune) - i++ - } else { - i += utf8.EncodeRune(p[i:], rune) - } - } - - return i, nil -} - -// ReadRune reads a single Unicode character and returns the -// rune and its size in bytes. -func (b *Reader) ReadRune() (c rune, size int, err error) { -read: - c, size, status := b.decode(b.buf[b.r:b.w]) - - if status == NO_ROOM && b.err == nil { - b.fill() - goto read - } - - if status == STATE_ONLY { - b.r += size - goto read - } - - if b.r == b.w { - return 0, 0, b.err - } - - if status == NO_ROOM { - c = 0xfffd - size = b.w - b.r - status = INVALID_CHAR - } - - b.r += size - return c, size, nil -} diff --git a/vendor/github.com/Tang-RoseChild/mahonia/shiftjis-data.go b/vendor/github.com/Tang-RoseChild/mahonia/shiftjis-data.go deleted file mode 100644 index e3751e39a..000000000 --- a/vendor/github.com/Tang-RoseChild/mahonia/shiftjis-data.go +++ /dev/null @@ -1,7748 +0,0 @@ -package mahonia - -import ( - "sync" -) - -var shiftJISOnce sync.Once - -var unicodeToShiftJIS []uint16 - -func reverseShiftJISTable() { - unicodeToShiftJIS = make([]uint16, 65536) - for jis, unicode := range shiftJISToUnicode { - if unicode != 0 { - unicodeToShiftJIS[unicode] = uint16(jis) - } - } -} - -// shiftJISToUnicode contains the double-byte mappings from -// http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP932.TXT -// CP932 is a Microsoft's version of Shift-JIS. -var shiftJISToUnicode = [65536]uint16{ - 0x8140: 0x3000, - 0x8141: 0x3001, - 0x8142: 0x3002, - 0x8143: 0xFF0C, - 0x8144: 0xFF0E, - 0x8145: 0x30FB, - 0x8146: 0xFF1A, - 0x8147: 0xFF1B, - 0x8148: 0xFF1F, - 0x8149: 0xFF01, - 0x814A: 0x309B, - 0x814B: 0x309C, - 0x814C: 0x00B4, - 0x814D: 0xFF40, - 0x814E: 0x00A8, - 0x814F: 0xFF3E, - 0x8150: 0xFFE3, - 0x8151: 0xFF3F, - 0x8152: 0x30FD, - 0x8153: 0x30FE, - 0x8154: 0x309D, - 0x8155: 0x309E, - 0x8156: 0x3003, - 0x8157: 0x4EDD, - 0x8158: 0x3005, - 0x8159: 0x3006, - 0x815A: 0x3007, - 0x815B: 0x30FC, - 0x815C: 0x2015, - 0x815D: 0x2010, - 0x815E: 0xFF0F, - 0x815F: 0xFF3C, - 0x8160: 0xFF5E, - 0x8161: 0x2225, - 0x8162: 0xFF5C, - 0x8163: 0x2026, - 0x8164: 0x2025, - 0x8165: 0x2018, - 0x8166: 0x2019, - 0x8167: 0x201C, - 0x8168: 0x201D, - 0x8169: 0xFF08, - 0x816A: 0xFF09, - 0x816B: 0x3014, - 0x816C: 0x3015, - 0x816D: 0xFF3B, - 0x816E: 0xFF3D, - 0x816F: 0xFF5B, - 0x8170: 0xFF5D, - 0x8171: 0x3008, - 0x8172: 0x3009, - 0x8173: 0x300A, - 0x8174: 0x300B, - 0x8175: 0x300C, - 0x8176: 0x300D, - 0x8177: 0x300E, - 0x8178: 0x300F, - 0x8179: 0x3010, - 0x817A: 0x3011, - 0x817B: 0xFF0B, - 0x817C: 0xFF0D, - 0x817D: 0x00B1, - 0x817E: 0x00D7, - 0x8180: 0x00F7, - 0x8181: 0xFF1D, - 0x8182: 0x2260, - 0x8183: 0xFF1C, - 0x8184: 0xFF1E, - 0x8185: 0x2266, - 0x8186: 0x2267, - 0x8187: 0x221E, - 0x8188: 0x2234, - 0x8189: 0x2642, - 0x818A: 0x2640, - 0x818B: 0x00B0, - 0x818C: 0x2032, - 0x818D: 0x2033, - 0x818E: 0x2103, - 0x818F: 0xFFE5, - 0x8190: 0xFF04, - 0x8191: 0xFFE0, - 0x8192: 0xFFE1, - 0x8193: 0xFF05, - 0x8194: 0xFF03, - 0x8195: 0xFF06, - 0x8196: 0xFF0A, - 0x8197: 0xFF20, - 0x8198: 0x00A7, - 0x8199: 0x2606, - 0x819A: 0x2605, - 0x819B: 0x25CB, - 0x819C: 0x25CF, - 0x819D: 0x25CE, - 0x819E: 0x25C7, - 0x819F: 0x25C6, - 0x81A0: 0x25A1, - 0x81A1: 0x25A0, - 0x81A2: 0x25B3, - 0x81A3: 0x25B2, - 0x81A4: 0x25BD, - 0x81A5: 0x25BC, - 0x81A6: 0x203B, - 0x81A7: 0x3012, - 0x81A8: 0x2192, - 0x81A9: 0x2190, - 0x81AA: 0x2191, - 0x81AB: 0x2193, - 0x81AC: 0x3013, - 0x81B8: 0x2208, - 0x81B9: 0x220B, - 0x81BA: 0x2286, - 0x81BB: 0x2287, - 0x81BC: 0x2282, - 0x81BD: 0x2283, - 0x81BE: 0x222A, - 0x81BF: 0x2229, - 0x81C8: 0x2227, - 0x81C9: 0x2228, - 0x81CA: 0xFFE2, - 0x81CB: 0x21D2, - 0x81CC: 0x21D4, - 0x81CD: 0x2200, - 0x81CE: 0x2203, - 0x81DA: 0x2220, - 0x81DB: 0x22A5, - 0x81DC: 0x2312, - 0x81DD: 0x2202, - 0x81DE: 0x2207, - 0x81DF: 0x2261, - 0x81E0: 0x2252, - 0x81E1: 0x226A, - 0x81E2: 0x226B, - 0x81E3: 0x221A, - 0x81E4: 0x223D, - 0x81E5: 0x221D, - 0x81E6: 0x2235, - 0x81E7: 0x222B, - 0x81E8: 0x222C, - 0x81F0: 0x212B, - 0x81F1: 0x2030, - 0x81F2: 0x266F, - 0x81F3: 0x266D, - 0x81F4: 0x266A, - 0x81F5: 0x2020, - 0x81F6: 0x2021, - 0x81F7: 0x00B6, - 0x81FC: 0x25EF, - 0x824F: 0xFF10, - 0x8250: 0xFF11, - 0x8251: 0xFF12, - 0x8252: 0xFF13, - 0x8253: 0xFF14, - 0x8254: 0xFF15, - 0x8255: 0xFF16, - 0x8256: 0xFF17, - 0x8257: 0xFF18, - 0x8258: 0xFF19, - 0x8260: 0xFF21, - 0x8261: 0xFF22, - 0x8262: 0xFF23, - 0x8263: 0xFF24, - 0x8264: 0xFF25, - 0x8265: 0xFF26, - 0x8266: 0xFF27, - 0x8267: 0xFF28, - 0x8268: 0xFF29, - 0x8269: 0xFF2A, - 0x826A: 0xFF2B, - 0x826B: 0xFF2C, - 0x826C: 0xFF2D, - 0x826D: 0xFF2E, - 0x826E: 0xFF2F, - 0x826F: 0xFF30, - 0x8270: 0xFF31, - 0x8271: 0xFF32, - 0x8272: 0xFF33, - 0x8273: 0xFF34, - 0x8274: 0xFF35, - 0x8275: 0xFF36, - 0x8276: 0xFF37, - 0x8277: 0xFF38, - 0x8278: 0xFF39, - 0x8279: 0xFF3A, - 0x8281: 0xFF41, - 0x8282: 0xFF42, - 0x8283: 0xFF43, - 0x8284: 0xFF44, - 0x8285: 0xFF45, - 0x8286: 0xFF46, - 0x8287: 0xFF47, - 0x8288: 0xFF48, - 0x8289: 0xFF49, - 0x828A: 0xFF4A, - 0x828B: 0xFF4B, - 0x828C: 0xFF4C, - 0x828D: 0xFF4D, - 0x828E: 0xFF4E, - 0x828F: 0xFF4F, - 0x8290: 0xFF50, - 0x8291: 0xFF51, - 0x8292: 0xFF52, - 0x8293: 0xFF53, - 0x8294: 0xFF54, - 0x8295: 0xFF55, - 0x8296: 0xFF56, - 0x8297: 0xFF57, - 0x8298: 0xFF58, - 0x8299: 0xFF59, - 0x829A: 0xFF5A, - 0x829F: 0x3041, - 0x82A0: 0x3042, - 0x82A1: 0x3043, - 0x82A2: 0x3044, - 0x82A3: 0x3045, - 0x82A4: 0x3046, - 0x82A5: 0x3047, - 0x82A6: 0x3048, - 0x82A7: 0x3049, - 0x82A8: 0x304A, - 0x82A9: 0x304B, - 0x82AA: 0x304C, - 0x82AB: 0x304D, - 0x82AC: 0x304E, - 0x82AD: 0x304F, - 0x82AE: 0x3050, - 0x82AF: 0x3051, - 0x82B0: 0x3052, - 0x82B1: 0x3053, - 0x82B2: 0x3054, - 0x82B3: 0x3055, - 0x82B4: 0x3056, - 0x82B5: 0x3057, - 0x82B6: 0x3058, - 0x82B7: 0x3059, - 0x82B8: 0x305A, - 0x82B9: 0x305B, - 0x82BA: 0x305C, - 0x82BB: 0x305D, - 0x82BC: 0x305E, - 0x82BD: 0x305F, - 0x82BE: 0x3060, - 0x82BF: 0x3061, - 0x82C0: 0x3062, - 0x82C1: 0x3063, - 0x82C2: 0x3064, - 0x82C3: 0x3065, - 0x82C4: 0x3066, - 0x82C5: 0x3067, - 0x82C6: 0x3068, - 0x82C7: 0x3069, - 0x82C8: 0x306A, - 0x82C9: 0x306B, - 0x82CA: 0x306C, - 0x82CB: 0x306D, - 0x82CC: 0x306E, - 0x82CD: 0x306F, - 0x82CE: 0x3070, - 0x82CF: 0x3071, - 0x82D0: 0x3072, - 0x82D1: 0x3073, - 0x82D2: 0x3074, - 0x82D3: 0x3075, - 0x82D4: 0x3076, - 0x82D5: 0x3077, - 0x82D6: 0x3078, - 0x82D7: 0x3079, - 0x82D8: 0x307A, - 0x82D9: 0x307B, - 0x82DA: 0x307C, - 0x82DB: 0x307D, - 0x82DC: 0x307E, - 0x82DD: 0x307F, - 0x82DE: 0x3080, - 0x82DF: 0x3081, - 0x82E0: 0x3082, - 0x82E1: 0x3083, - 0x82E2: 0x3084, - 0x82E3: 0x3085, - 0x82E4: 0x3086, - 0x82E5: 0x3087, - 0x82E6: 0x3088, - 0x82E7: 0x3089, - 0x82E8: 0x308A, - 0x82E9: 0x308B, - 0x82EA: 0x308C, - 0x82EB: 0x308D, - 0x82EC: 0x308E, - 0x82ED: 0x308F, - 0x82EE: 0x3090, - 0x82EF: 0x3091, - 0x82F0: 0x3092, - 0x82F1: 0x3093, - 0x8340: 0x30A1, - 0x8341: 0x30A2, - 0x8342: 0x30A3, - 0x8343: 0x30A4, - 0x8344: 0x30A5, - 0x8345: 0x30A6, - 0x8346: 0x30A7, - 0x8347: 0x30A8, - 0x8348: 0x30A9, - 0x8349: 0x30AA, - 0x834A: 0x30AB, - 0x834B: 0x30AC, - 0x834C: 0x30AD, - 0x834D: 0x30AE, - 0x834E: 0x30AF, - 0x834F: 0x30B0, - 0x8350: 0x30B1, - 0x8351: 0x30B2, - 0x8352: 0x30B3, - 0x8353: 0x30B4, - 0x8354: 0x30B5, - 0x8355: 0x30B6, - 0x8356: 0x30B7, - 0x8357: 0x30B8, - 0x8358: 0x30B9, - 0x8359: 0x30BA, - 0x835A: 0x30BB, - 0x835B: 0x30BC, - 0x835C: 0x30BD, - 0x835D: 0x30BE, - 0x835E: 0x30BF, - 0x835F: 0x30C0, - 0x8360: 0x30C1, - 0x8361: 0x30C2, - 0x8362: 0x30C3, - 0x8363: 0x30C4, - 0x8364: 0x30C5, - 0x8365: 0x30C6, - 0x8366: 0x30C7, - 0x8367: 0x30C8, - 0x8368: 0x30C9, - 0x8369: 0x30CA, - 0x836A: 0x30CB, - 0x836B: 0x30CC, - 0x836C: 0x30CD, - 0x836D: 0x30CE, - 0x836E: 0x30CF, - 0x836F: 0x30D0, - 0x8370: 0x30D1, - 0x8371: 0x30D2, - 0x8372: 0x30D3, - 0x8373: 0x30D4, - 0x8374: 0x30D5, - 0x8375: 0x30D6, - 0x8376: 0x30D7, - 0x8377: 0x30D8, - 0x8378: 0x30D9, - 0x8379: 0x30DA, - 0x837A: 0x30DB, - 0x837B: 0x30DC, - 0x837C: 0x30DD, - 0x837D: 0x30DE, - 0x837E: 0x30DF, - 0x8380: 0x30E0, - 0x8381: 0x30E1, - 0x8382: 0x30E2, - 0x8383: 0x30E3, - 0x8384: 0x30E4, - 0x8385: 0x30E5, - 0x8386: 0x30E6, - 0x8387: 0x30E7, - 0x8388: 0x30E8, - 0x8389: 0x30E9, - 0x838A: 0x30EA, - 0x838B: 0x30EB, - 0x838C: 0x30EC, - 0x838D: 0x30ED, - 0x838E: 0x30EE, - 0x838F: 0x30EF, - 0x8390: 0x30F0, - 0x8391: 0x30F1, - 0x8392: 0x30F2, - 0x8393: 0x30F3, - 0x8394: 0x30F4, - 0x8395: 0x30F5, - 0x8396: 0x30F6, - 0x839F: 0x0391, - 0x83A0: 0x0392, - 0x83A1: 0x0393, - 0x83A2: 0x0394, - 0x83A3: 0x0395, - 0x83A4: 0x0396, - 0x83A5: 0x0397, - 0x83A6: 0x0398, - 0x83A7: 0x0399, - 0x83A8: 0x039A, - 0x83A9: 0x039B, - 0x83AA: 0x039C, - 0x83AB: 0x039D, - 0x83AC: 0x039E, - 0x83AD: 0x039F, - 0x83AE: 0x03A0, - 0x83AF: 0x03A1, - 0x83B0: 0x03A3, - 0x83B1: 0x03A4, - 0x83B2: 0x03A5, - 0x83B3: 0x03A6, - 0x83B4: 0x03A7, - 0x83B5: 0x03A8, - 0x83B6: 0x03A9, - 0x83BF: 0x03B1, - 0x83C0: 0x03B2, - 0x83C1: 0x03B3, - 0x83C2: 0x03B4, - 0x83C3: 0x03B5, - 0x83C4: 0x03B6, - 0x83C5: 0x03B7, - 0x83C6: 0x03B8, - 0x83C7: 0x03B9, - 0x83C8: 0x03BA, - 0x83C9: 0x03BB, - 0x83CA: 0x03BC, - 0x83CB: 0x03BD, - 0x83CC: 0x03BE, - 0x83CD: 0x03BF, - 0x83CE: 0x03C0, - 0x83CF: 0x03C1, - 0x83D0: 0x03C3, - 0x83D1: 0x03C4, - 0x83D2: 0x03C5, - 0x83D3: 0x03C6, - 0x83D4: 0x03C7, - 0x83D5: 0x03C8, - 0x83D6: 0x03C9, - 0x8440: 0x0410, - 0x8441: 0x0411, - 0x8442: 0x0412, - 0x8443: 0x0413, - 0x8444: 0x0414, - 0x8445: 0x0415, - 0x8446: 0x0401, - 0x8447: 0x0416, - 0x8448: 0x0417, - 0x8449: 0x0418, - 0x844A: 0x0419, - 0x844B: 0x041A, - 0x844C: 0x041B, - 0x844D: 0x041C, - 0x844E: 0x041D, - 0x844F: 0x041E, - 0x8450: 0x041F, - 0x8451: 0x0420, - 0x8452: 0x0421, - 0x8453: 0x0422, - 0x8454: 0x0423, - 0x8455: 0x0424, - 0x8456: 0x0425, - 0x8457: 0x0426, - 0x8458: 0x0427, - 0x8459: 0x0428, - 0x845A: 0x0429, - 0x845B: 0x042A, - 0x845C: 0x042B, - 0x845D: 0x042C, - 0x845E: 0x042D, - 0x845F: 0x042E, - 0x8460: 0x042F, - 0x8470: 0x0430, - 0x8471: 0x0431, - 0x8472: 0x0432, - 0x8473: 0x0433, - 0x8474: 0x0434, - 0x8475: 0x0435, - 0x8476: 0x0451, - 0x8477: 0x0436, - 0x8478: 0x0437, - 0x8479: 0x0438, - 0x847A: 0x0439, - 0x847B: 0x043A, - 0x847C: 0x043B, - 0x847D: 0x043C, - 0x847E: 0x043D, - 0x8480: 0x043E, - 0x8481: 0x043F, - 0x8482: 0x0440, - 0x8483: 0x0441, - 0x8484: 0x0442, - 0x8485: 0x0443, - 0x8486: 0x0444, - 0x8487: 0x0445, - 0x8488: 0x0446, - 0x8489: 0x0447, - 0x848A: 0x0448, - 0x848B: 0x0449, - 0x848C: 0x044A, - 0x848D: 0x044B, - 0x848E: 0x044C, - 0x848F: 0x044D, - 0x8490: 0x044E, - 0x8491: 0x044F, - 0x849F: 0x2500, - 0x84A0: 0x2502, - 0x84A1: 0x250C, - 0x84A2: 0x2510, - 0x84A3: 0x2518, - 0x84A4: 0x2514, - 0x84A5: 0x251C, - 0x84A6: 0x252C, - 0x84A7: 0x2524, - 0x84A8: 0x2534, - 0x84A9: 0x253C, - 0x84AA: 0x2501, - 0x84AB: 0x2503, - 0x84AC: 0x250F, - 0x84AD: 0x2513, - 0x84AE: 0x251B, - 0x84AF: 0x2517, - 0x84B0: 0x2523, - 0x84B1: 0x2533, - 0x84B2: 0x252B, - 0x84B3: 0x253B, - 0x84B4: 0x254B, - 0x84B5: 0x2520, - 0x84B6: 0x252F, - 0x84B7: 0x2528, - 0x84B8: 0x2537, - 0x84B9: 0x253F, - 0x84BA: 0x251D, - 0x84BB: 0x2530, - 0x84BC: 0x2525, - 0x84BD: 0x2538, - 0x84BE: 0x2542, - 0x8740: 0x2460, - 0x8741: 0x2461, - 0x8742: 0x2462, - 0x8743: 0x2463, - 0x8744: 0x2464, - 0x8745: 0x2465, - 0x8746: 0x2466, - 0x8747: 0x2467, - 0x8748: 0x2468, - 0x8749: 0x2469, - 0x874A: 0x246A, - 0x874B: 0x246B, - 0x874C: 0x246C, - 0x874D: 0x246D, - 0x874E: 0x246E, - 0x874F: 0x246F, - 0x8750: 0x2470, - 0x8751: 0x2471, - 0x8752: 0x2472, - 0x8753: 0x2473, - 0x8754: 0x2160, - 0x8755: 0x2161, - 0x8756: 0x2162, - 0x8757: 0x2163, - 0x8758: 0x2164, - 0x8759: 0x2165, - 0x875A: 0x2166, - 0x875B: 0x2167, - 0x875C: 0x2168, - 0x875D: 0x2169, - 0x875F: 0x3349, - 0x8760: 0x3314, - 0x8761: 0x3322, - 0x8762: 0x334D, - 0x8763: 0x3318, - 0x8764: 0x3327, - 0x8765: 0x3303, - 0x8766: 0x3336, - 0x8767: 0x3351, - 0x8768: 0x3357, - 0x8769: 0x330D, - 0x876A: 0x3326, - 0x876B: 0x3323, - 0x876C: 0x332B, - 0x876D: 0x334A, - 0x876E: 0x333B, - 0x876F: 0x339C, - 0x8770: 0x339D, - 0x8771: 0x339E, - 0x8772: 0x338E, - 0x8773: 0x338F, - 0x8774: 0x33C4, - 0x8775: 0x33A1, - 0x877E: 0x337B, - 0x8780: 0x301D, - 0x8781: 0x301F, - 0x8782: 0x2116, - 0x8783: 0x33CD, - 0x8784: 0x2121, - 0x8785: 0x32A4, - 0x8786: 0x32A5, - 0x8787: 0x32A6, - 0x8788: 0x32A7, - 0x8789: 0x32A8, - 0x878A: 0x3231, - 0x878B: 0x3232, - 0x878C: 0x3239, - 0x878D: 0x337E, - 0x878E: 0x337D, - 0x878F: 0x337C, - 0x8790: 0x2252, - 0x8791: 0x2261, - 0x8792: 0x222B, - 0x8793: 0x222E, - 0x8794: 0x2211, - 0x8795: 0x221A, - 0x8796: 0x22A5, - 0x8797: 0x2220, - 0x8798: 0x221F, - 0x8799: 0x22BF, - 0x879A: 0x2235, - 0x879B: 0x2229, - 0x879C: 0x222A, - 0x889F: 0x4E9C, - 0x88A0: 0x5516, - 0x88A1: 0x5A03, - 0x88A2: 0x963F, - 0x88A3: 0x54C0, - 0x88A4: 0x611B, - 0x88A5: 0x6328, - 0x88A6: 0x59F6, - 0x88A7: 0x9022, - 0x88A8: 0x8475, - 0x88A9: 0x831C, - 0x88AA: 0x7A50, - 0x88AB: 0x60AA, - 0x88AC: 0x63E1, - 0x88AD: 0x6E25, - 0x88AE: 0x65ED, - 0x88AF: 0x8466, - 0x88B0: 0x82A6, - 0x88B1: 0x9BF5, - 0x88B2: 0x6893, - 0x88B3: 0x5727, - 0x88B4: 0x65A1, - 0x88B5: 0x6271, - 0x88B6: 0x5B9B, - 0x88B7: 0x59D0, - 0x88B8: 0x867B, - 0x88B9: 0x98F4, - 0x88BA: 0x7D62, - 0x88BB: 0x7DBE, - 0x88BC: 0x9B8E, - 0x88BD: 0x6216, - 0x88BE: 0x7C9F, - 0x88BF: 0x88B7, - 0x88C0: 0x5B89, - 0x88C1: 0x5EB5, - 0x88C2: 0x6309, - 0x88C3: 0x6697, - 0x88C4: 0x6848, - 0x88C5: 0x95C7, - 0x88C6: 0x978D, - 0x88C7: 0x674F, - 0x88C8: 0x4EE5, - 0x88C9: 0x4F0A, - 0x88CA: 0x4F4D, - 0x88CB: 0x4F9D, - 0x88CC: 0x5049, - 0x88CD: 0x56F2, - 0x88CE: 0x5937, - 0x88CF: 0x59D4, - 0x88D0: 0x5A01, - 0x88D1: 0x5C09, - 0x88D2: 0x60DF, - 0x88D3: 0x610F, - 0x88D4: 0x6170, - 0x88D5: 0x6613, - 0x88D6: 0x6905, - 0x88D7: 0x70BA, - 0x88D8: 0x754F, - 0x88D9: 0x7570, - 0x88DA: 0x79FB, - 0x88DB: 0x7DAD, - 0x88DC: 0x7DEF, - 0x88DD: 0x80C3, - 0x88DE: 0x840E, - 0x88DF: 0x8863, - 0x88E0: 0x8B02, - 0x88E1: 0x9055, - 0x88E2: 0x907A, - 0x88E3: 0x533B, - 0x88E4: 0x4E95, - 0x88E5: 0x4EA5, - 0x88E6: 0x57DF, - 0x88E7: 0x80B2, - 0x88E8: 0x90C1, - 0x88E9: 0x78EF, - 0x88EA: 0x4E00, - 0x88EB: 0x58F1, - 0x88EC: 0x6EA2, - 0x88ED: 0x9038, - 0x88EE: 0x7A32, - 0x88EF: 0x8328, - 0x88F0: 0x828B, - 0x88F1: 0x9C2F, - 0x88F2: 0x5141, - 0x88F3: 0x5370, - 0x88F4: 0x54BD, - 0x88F5: 0x54E1, - 0x88F6: 0x56E0, - 0x88F7: 0x59FB, - 0x88F8: 0x5F15, - 0x88F9: 0x98F2, - 0x88FA: 0x6DEB, - 0x88FB: 0x80E4, - 0x88FC: 0x852D, - 0x8940: 0x9662, - 0x8941: 0x9670, - 0x8942: 0x96A0, - 0x8943: 0x97FB, - 0x8944: 0x540B, - 0x8945: 0x53F3, - 0x8946: 0x5B87, - 0x8947: 0x70CF, - 0x8948: 0x7FBD, - 0x8949: 0x8FC2, - 0x894A: 0x96E8, - 0x894B: 0x536F, - 0x894C: 0x9D5C, - 0x894D: 0x7ABA, - 0x894E: 0x4E11, - 0x894F: 0x7893, - 0x8950: 0x81FC, - 0x8951: 0x6E26, - 0x8952: 0x5618, - 0x8953: 0x5504, - 0x8954: 0x6B1D, - 0x8955: 0x851A, - 0x8956: 0x9C3B, - 0x8957: 0x59E5, - 0x8958: 0x53A9, - 0x8959: 0x6D66, - 0x895A: 0x74DC, - 0x895B: 0x958F, - 0x895C: 0x5642, - 0x895D: 0x4E91, - 0x895E: 0x904B, - 0x895F: 0x96F2, - 0x8960: 0x834F, - 0x8961: 0x990C, - 0x8962: 0x53E1, - 0x8963: 0x55B6, - 0x8964: 0x5B30, - 0x8965: 0x5F71, - 0x8966: 0x6620, - 0x8967: 0x66F3, - 0x8968: 0x6804, - 0x8969: 0x6C38, - 0x896A: 0x6CF3, - 0x896B: 0x6D29, - 0x896C: 0x745B, - 0x896D: 0x76C8, - 0x896E: 0x7A4E, - 0x896F: 0x9834, - 0x8970: 0x82F1, - 0x8971: 0x885B, - 0x8972: 0x8A60, - 0x8973: 0x92ED, - 0x8974: 0x6DB2, - 0x8975: 0x75AB, - 0x8976: 0x76CA, - 0x8977: 0x99C5, - 0x8978: 0x60A6, - 0x8979: 0x8B01, - 0x897A: 0x8D8A, - 0x897B: 0x95B2, - 0x897C: 0x698E, - 0x897D: 0x53AD, - 0x897E: 0x5186, - 0x8980: 0x5712, - 0x8981: 0x5830, - 0x8982: 0x5944, - 0x8983: 0x5BB4, - 0x8984: 0x5EF6, - 0x8985: 0x6028, - 0x8986: 0x63A9, - 0x8987: 0x63F4, - 0x8988: 0x6CBF, - 0x8989: 0x6F14, - 0x898A: 0x708E, - 0x898B: 0x7114, - 0x898C: 0x7159, - 0x898D: 0x71D5, - 0x898E: 0x733F, - 0x898F: 0x7E01, - 0x8990: 0x8276, - 0x8991: 0x82D1, - 0x8992: 0x8597, - 0x8993: 0x9060, - 0x8994: 0x925B, - 0x8995: 0x9D1B, - 0x8996: 0x5869, - 0x8997: 0x65BC, - 0x8998: 0x6C5A, - 0x8999: 0x7525, - 0x899A: 0x51F9, - 0x899B: 0x592E, - 0x899C: 0x5965, - 0x899D: 0x5F80, - 0x899E: 0x5FDC, - 0x899F: 0x62BC, - 0x89A0: 0x65FA, - 0x89A1: 0x6A2A, - 0x89A2: 0x6B27, - 0x89A3: 0x6BB4, - 0x89A4: 0x738B, - 0x89A5: 0x7FC1, - 0x89A6: 0x8956, - 0x89A7: 0x9D2C, - 0x89A8: 0x9D0E, - 0x89A9: 0x9EC4, - 0x89AA: 0x5CA1, - 0x89AB: 0x6C96, - 0x89AC: 0x837B, - 0x89AD: 0x5104, - 0x89AE: 0x5C4B, - 0x89AF: 0x61B6, - 0x89B0: 0x81C6, - 0x89B1: 0x6876, - 0x89B2: 0x7261, - 0x89B3: 0x4E59, - 0x89B4: 0x4FFA, - 0x89B5: 0x5378, - 0x89B6: 0x6069, - 0x89B7: 0x6E29, - 0x89B8: 0x7A4F, - 0x89B9: 0x97F3, - 0x89BA: 0x4E0B, - 0x89BB: 0x5316, - 0x89BC: 0x4EEE, - 0x89BD: 0x4F55, - 0x89BE: 0x4F3D, - 0x89BF: 0x4FA1, - 0x89C0: 0x4F73, - 0x89C1: 0x52A0, - 0x89C2: 0x53EF, - 0x89C3: 0x5609, - 0x89C4: 0x590F, - 0x89C5: 0x5AC1, - 0x89C6: 0x5BB6, - 0x89C7: 0x5BE1, - 0x89C8: 0x79D1, - 0x89C9: 0x6687, - 0x89CA: 0x679C, - 0x89CB: 0x67B6, - 0x89CC: 0x6B4C, - 0x89CD: 0x6CB3, - 0x89CE: 0x706B, - 0x89CF: 0x73C2, - 0x89D0: 0x798D, - 0x89D1: 0x79BE, - 0x89D2: 0x7A3C, - 0x89D3: 0x7B87, - 0x89D4: 0x82B1, - 0x89D5: 0x82DB, - 0x89D6: 0x8304, - 0x89D7: 0x8377, - 0x89D8: 0x83EF, - 0x89D9: 0x83D3, - 0x89DA: 0x8766, - 0x89DB: 0x8AB2, - 0x89DC: 0x5629, - 0x89DD: 0x8CA8, - 0x89DE: 0x8FE6, - 0x89DF: 0x904E, - 0x89E0: 0x971E, - 0x89E1: 0x868A, - 0x89E2: 0x4FC4, - 0x89E3: 0x5CE8, - 0x89E4: 0x6211, - 0x89E5: 0x7259, - 0x89E6: 0x753B, - 0x89E7: 0x81E5, - 0x89E8: 0x82BD, - 0x89E9: 0x86FE, - 0x89EA: 0x8CC0, - 0x89EB: 0x96C5, - 0x89EC: 0x9913, - 0x89ED: 0x99D5, - 0x89EE: 0x4ECB, - 0x89EF: 0x4F1A, - 0x89F0: 0x89E3, - 0x89F1: 0x56DE, - 0x89F2: 0x584A, - 0x89F3: 0x58CA, - 0x89F4: 0x5EFB, - 0x89F5: 0x5FEB, - 0x89F6: 0x602A, - 0x89F7: 0x6094, - 0x89F8: 0x6062, - 0x89F9: 0x61D0, - 0x89FA: 0x6212, - 0x89FB: 0x62D0, - 0x89FC: 0x6539, - 0x8A40: 0x9B41, - 0x8A41: 0x6666, - 0x8A42: 0x68B0, - 0x8A43: 0x6D77, - 0x8A44: 0x7070, - 0x8A45: 0x754C, - 0x8A46: 0x7686, - 0x8A47: 0x7D75, - 0x8A48: 0x82A5, - 0x8A49: 0x87F9, - 0x8A4A: 0x958B, - 0x8A4B: 0x968E, - 0x8A4C: 0x8C9D, - 0x8A4D: 0x51F1, - 0x8A4E: 0x52BE, - 0x8A4F: 0x5916, - 0x8A50: 0x54B3, - 0x8A51: 0x5BB3, - 0x8A52: 0x5D16, - 0x8A53: 0x6168, - 0x8A54: 0x6982, - 0x8A55: 0x6DAF, - 0x8A56: 0x788D, - 0x8A57: 0x84CB, - 0x8A58: 0x8857, - 0x8A59: 0x8A72, - 0x8A5A: 0x93A7, - 0x8A5B: 0x9AB8, - 0x8A5C: 0x6D6C, - 0x8A5D: 0x99A8, - 0x8A5E: 0x86D9, - 0x8A5F: 0x57A3, - 0x8A60: 0x67FF, - 0x8A61: 0x86CE, - 0x8A62: 0x920E, - 0x8A63: 0x5283, - 0x8A64: 0x5687, - 0x8A65: 0x5404, - 0x8A66: 0x5ED3, - 0x8A67: 0x62E1, - 0x8A68: 0x64B9, - 0x8A69: 0x683C, - 0x8A6A: 0x6838, - 0x8A6B: 0x6BBB, - 0x8A6C: 0x7372, - 0x8A6D: 0x78BA, - 0x8A6E: 0x7A6B, - 0x8A6F: 0x899A, - 0x8A70: 0x89D2, - 0x8A71: 0x8D6B, - 0x8A72: 0x8F03, - 0x8A73: 0x90ED, - 0x8A74: 0x95A3, - 0x8A75: 0x9694, - 0x8A76: 0x9769, - 0x8A77: 0x5B66, - 0x8A78: 0x5CB3, - 0x8A79: 0x697D, - 0x8A7A: 0x984D, - 0x8A7B: 0x984E, - 0x8A7C: 0x639B, - 0x8A7D: 0x7B20, - 0x8A7E: 0x6A2B, - 0x8A80: 0x6A7F, - 0x8A81: 0x68B6, - 0x8A82: 0x9C0D, - 0x8A83: 0x6F5F, - 0x8A84: 0x5272, - 0x8A85: 0x559D, - 0x8A86: 0x6070, - 0x8A87: 0x62EC, - 0x8A88: 0x6D3B, - 0x8A89: 0x6E07, - 0x8A8A: 0x6ED1, - 0x8A8B: 0x845B, - 0x8A8C: 0x8910, - 0x8A8D: 0x8F44, - 0x8A8E: 0x4E14, - 0x8A8F: 0x9C39, - 0x8A90: 0x53F6, - 0x8A91: 0x691B, - 0x8A92: 0x6A3A, - 0x8A93: 0x9784, - 0x8A94: 0x682A, - 0x8A95: 0x515C, - 0x8A96: 0x7AC3, - 0x8A97: 0x84B2, - 0x8A98: 0x91DC, - 0x8A99: 0x938C, - 0x8A9A: 0x565B, - 0x8A9B: 0x9D28, - 0x8A9C: 0x6822, - 0x8A9D: 0x8305, - 0x8A9E: 0x8431, - 0x8A9F: 0x7CA5, - 0x8AA0: 0x5208, - 0x8AA1: 0x82C5, - 0x8AA2: 0x74E6, - 0x8AA3: 0x4E7E, - 0x8AA4: 0x4F83, - 0x8AA5: 0x51A0, - 0x8AA6: 0x5BD2, - 0x8AA7: 0x520A, - 0x8AA8: 0x52D8, - 0x8AA9: 0x52E7, - 0x8AAA: 0x5DFB, - 0x8AAB: 0x559A, - 0x8AAC: 0x582A, - 0x8AAD: 0x59E6, - 0x8AAE: 0x5B8C, - 0x8AAF: 0x5B98, - 0x8AB0: 0x5BDB, - 0x8AB1: 0x5E72, - 0x8AB2: 0x5E79, - 0x8AB3: 0x60A3, - 0x8AB4: 0x611F, - 0x8AB5: 0x6163, - 0x8AB6: 0x61BE, - 0x8AB7: 0x63DB, - 0x8AB8: 0x6562, - 0x8AB9: 0x67D1, - 0x8ABA: 0x6853, - 0x8ABB: 0x68FA, - 0x8ABC: 0x6B3E, - 0x8ABD: 0x6B53, - 0x8ABE: 0x6C57, - 0x8ABF: 0x6F22, - 0x8AC0: 0x6F97, - 0x8AC1: 0x6F45, - 0x8AC2: 0x74B0, - 0x8AC3: 0x7518, - 0x8AC4: 0x76E3, - 0x8AC5: 0x770B, - 0x8AC6: 0x7AFF, - 0x8AC7: 0x7BA1, - 0x8AC8: 0x7C21, - 0x8AC9: 0x7DE9, - 0x8ACA: 0x7F36, - 0x8ACB: 0x7FF0, - 0x8ACC: 0x809D, - 0x8ACD: 0x8266, - 0x8ACE: 0x839E, - 0x8ACF: 0x89B3, - 0x8AD0: 0x8ACC, - 0x8AD1: 0x8CAB, - 0x8AD2: 0x9084, - 0x8AD3: 0x9451, - 0x8AD4: 0x9593, - 0x8AD5: 0x9591, - 0x8AD6: 0x95A2, - 0x8AD7: 0x9665, - 0x8AD8: 0x97D3, - 0x8AD9: 0x9928, - 0x8ADA: 0x8218, - 0x8ADB: 0x4E38, - 0x8ADC: 0x542B, - 0x8ADD: 0x5CB8, - 0x8ADE: 0x5DCC, - 0x8ADF: 0x73A9, - 0x8AE0: 0x764C, - 0x8AE1: 0x773C, - 0x8AE2: 0x5CA9, - 0x8AE3: 0x7FEB, - 0x8AE4: 0x8D0B, - 0x8AE5: 0x96C1, - 0x8AE6: 0x9811, - 0x8AE7: 0x9854, - 0x8AE8: 0x9858, - 0x8AE9: 0x4F01, - 0x8AEA: 0x4F0E, - 0x8AEB: 0x5371, - 0x8AEC: 0x559C, - 0x8AED: 0x5668, - 0x8AEE: 0x57FA, - 0x8AEF: 0x5947, - 0x8AF0: 0x5B09, - 0x8AF1: 0x5BC4, - 0x8AF2: 0x5C90, - 0x8AF3: 0x5E0C, - 0x8AF4: 0x5E7E, - 0x8AF5: 0x5FCC, - 0x8AF6: 0x63EE, - 0x8AF7: 0x673A, - 0x8AF8: 0x65D7, - 0x8AF9: 0x65E2, - 0x8AFA: 0x671F, - 0x8AFB: 0x68CB, - 0x8AFC: 0x68C4, - 0x8B40: 0x6A5F, - 0x8B41: 0x5E30, - 0x8B42: 0x6BC5, - 0x8B43: 0x6C17, - 0x8B44: 0x6C7D, - 0x8B45: 0x757F, - 0x8B46: 0x7948, - 0x8B47: 0x5B63, - 0x8B48: 0x7A00, - 0x8B49: 0x7D00, - 0x8B4A: 0x5FBD, - 0x8B4B: 0x898F, - 0x8B4C: 0x8A18, - 0x8B4D: 0x8CB4, - 0x8B4E: 0x8D77, - 0x8B4F: 0x8ECC, - 0x8B50: 0x8F1D, - 0x8B51: 0x98E2, - 0x8B52: 0x9A0E, - 0x8B53: 0x9B3C, - 0x8B54: 0x4E80, - 0x8B55: 0x507D, - 0x8B56: 0x5100, - 0x8B57: 0x5993, - 0x8B58: 0x5B9C, - 0x8B59: 0x622F, - 0x8B5A: 0x6280, - 0x8B5B: 0x64EC, - 0x8B5C: 0x6B3A, - 0x8B5D: 0x72A0, - 0x8B5E: 0x7591, - 0x8B5F: 0x7947, - 0x8B60: 0x7FA9, - 0x8B61: 0x87FB, - 0x8B62: 0x8ABC, - 0x8B63: 0x8B70, - 0x8B64: 0x63AC, - 0x8B65: 0x83CA, - 0x8B66: 0x97A0, - 0x8B67: 0x5409, - 0x8B68: 0x5403, - 0x8B69: 0x55AB, - 0x8B6A: 0x6854, - 0x8B6B: 0x6A58, - 0x8B6C: 0x8A70, - 0x8B6D: 0x7827, - 0x8B6E: 0x6775, - 0x8B6F: 0x9ECD, - 0x8B70: 0x5374, - 0x8B71: 0x5BA2, - 0x8B72: 0x811A, - 0x8B73: 0x8650, - 0x8B74: 0x9006, - 0x8B75: 0x4E18, - 0x8B76: 0x4E45, - 0x8B77: 0x4EC7, - 0x8B78: 0x4F11, - 0x8B79: 0x53CA, - 0x8B7A: 0x5438, - 0x8B7B: 0x5BAE, - 0x8B7C: 0x5F13, - 0x8B7D: 0x6025, - 0x8B7E: 0x6551, - 0x8B80: 0x673D, - 0x8B81: 0x6C42, - 0x8B82: 0x6C72, - 0x8B83: 0x6CE3, - 0x8B84: 0x7078, - 0x8B85: 0x7403, - 0x8B86: 0x7A76, - 0x8B87: 0x7AAE, - 0x8B88: 0x7B08, - 0x8B89: 0x7D1A, - 0x8B8A: 0x7CFE, - 0x8B8B: 0x7D66, - 0x8B8C: 0x65E7, - 0x8B8D: 0x725B, - 0x8B8E: 0x53BB, - 0x8B8F: 0x5C45, - 0x8B90: 0x5DE8, - 0x8B91: 0x62D2, - 0x8B92: 0x62E0, - 0x8B93: 0x6319, - 0x8B94: 0x6E20, - 0x8B95: 0x865A, - 0x8B96: 0x8A31, - 0x8B97: 0x8DDD, - 0x8B98: 0x92F8, - 0x8B99: 0x6F01, - 0x8B9A: 0x79A6, - 0x8B9B: 0x9B5A, - 0x8B9C: 0x4EA8, - 0x8B9D: 0x4EAB, - 0x8B9E: 0x4EAC, - 0x8B9F: 0x4F9B, - 0x8BA0: 0x4FA0, - 0x8BA1: 0x50D1, - 0x8BA2: 0x5147, - 0x8BA3: 0x7AF6, - 0x8BA4: 0x5171, - 0x8BA5: 0x51F6, - 0x8BA6: 0x5354, - 0x8BA7: 0x5321, - 0x8BA8: 0x537F, - 0x8BA9: 0x53EB, - 0x8BAA: 0x55AC, - 0x8BAB: 0x5883, - 0x8BAC: 0x5CE1, - 0x8BAD: 0x5F37, - 0x8BAE: 0x5F4A, - 0x8BAF: 0x602F, - 0x8BB0: 0x6050, - 0x8BB1: 0x606D, - 0x8BB2: 0x631F, - 0x8BB3: 0x6559, - 0x8BB4: 0x6A4B, - 0x8BB5: 0x6CC1, - 0x8BB6: 0x72C2, - 0x8BB7: 0x72ED, - 0x8BB8: 0x77EF, - 0x8BB9: 0x80F8, - 0x8BBA: 0x8105, - 0x8BBB: 0x8208, - 0x8BBC: 0x854E, - 0x8BBD: 0x90F7, - 0x8BBE: 0x93E1, - 0x8BBF: 0x97FF, - 0x8BC0: 0x9957, - 0x8BC1: 0x9A5A, - 0x8BC2: 0x4EF0, - 0x8BC3: 0x51DD, - 0x8BC4: 0x5C2D, - 0x8BC5: 0x6681, - 0x8BC6: 0x696D, - 0x8BC7: 0x5C40, - 0x8BC8: 0x66F2, - 0x8BC9: 0x6975, - 0x8BCA: 0x7389, - 0x8BCB: 0x6850, - 0x8BCC: 0x7C81, - 0x8BCD: 0x50C5, - 0x8BCE: 0x52E4, - 0x8BCF: 0x5747, - 0x8BD0: 0x5DFE, - 0x8BD1: 0x9326, - 0x8BD2: 0x65A4, - 0x8BD3: 0x6B23, - 0x8BD4: 0x6B3D, - 0x8BD5: 0x7434, - 0x8BD6: 0x7981, - 0x8BD7: 0x79BD, - 0x8BD8: 0x7B4B, - 0x8BD9: 0x7DCA, - 0x8BDA: 0x82B9, - 0x8BDB: 0x83CC, - 0x8BDC: 0x887F, - 0x8BDD: 0x895F, - 0x8BDE: 0x8B39, - 0x8BDF: 0x8FD1, - 0x8BE0: 0x91D1, - 0x8BE1: 0x541F, - 0x8BE2: 0x9280, - 0x8BE3: 0x4E5D, - 0x8BE4: 0x5036, - 0x8BE5: 0x53E5, - 0x8BE6: 0x533A, - 0x8BE7: 0x72D7, - 0x8BE8: 0x7396, - 0x8BE9: 0x77E9, - 0x8BEA: 0x82E6, - 0x8BEB: 0x8EAF, - 0x8BEC: 0x99C6, - 0x8BED: 0x99C8, - 0x8BEE: 0x99D2, - 0x8BEF: 0x5177, - 0x8BF0: 0x611A, - 0x8BF1: 0x865E, - 0x8BF2: 0x55B0, - 0x8BF3: 0x7A7A, - 0x8BF4: 0x5076, - 0x8BF5: 0x5BD3, - 0x8BF6: 0x9047, - 0x8BF7: 0x9685, - 0x8BF8: 0x4E32, - 0x8BF9: 0x6ADB, - 0x8BFA: 0x91E7, - 0x8BFB: 0x5C51, - 0x8BFC: 0x5C48, - 0x8C40: 0x6398, - 0x8C41: 0x7A9F, - 0x8C42: 0x6C93, - 0x8C43: 0x9774, - 0x8C44: 0x8F61, - 0x8C45: 0x7AAA, - 0x8C46: 0x718A, - 0x8C47: 0x9688, - 0x8C48: 0x7C82, - 0x8C49: 0x6817, - 0x8C4A: 0x7E70, - 0x8C4B: 0x6851, - 0x8C4C: 0x936C, - 0x8C4D: 0x52F2, - 0x8C4E: 0x541B, - 0x8C4F: 0x85AB, - 0x8C50: 0x8A13, - 0x8C51: 0x7FA4, - 0x8C52: 0x8ECD, - 0x8C53: 0x90E1, - 0x8C54: 0x5366, - 0x8C55: 0x8888, - 0x8C56: 0x7941, - 0x8C57: 0x4FC2, - 0x8C58: 0x50BE, - 0x8C59: 0x5211, - 0x8C5A: 0x5144, - 0x8C5B: 0x5553, - 0x8C5C: 0x572D, - 0x8C5D: 0x73EA, - 0x8C5E: 0x578B, - 0x8C5F: 0x5951, - 0x8C60: 0x5F62, - 0x8C61: 0x5F84, - 0x8C62: 0x6075, - 0x8C63: 0x6176, - 0x8C64: 0x6167, - 0x8C65: 0x61A9, - 0x8C66: 0x63B2, - 0x8C67: 0x643A, - 0x8C68: 0x656C, - 0x8C69: 0x666F, - 0x8C6A: 0x6842, - 0x8C6B: 0x6E13, - 0x8C6C: 0x7566, - 0x8C6D: 0x7A3D, - 0x8C6E: 0x7CFB, - 0x8C6F: 0x7D4C, - 0x8C70: 0x7D99, - 0x8C71: 0x7E4B, - 0x8C72: 0x7F6B, - 0x8C73: 0x830E, - 0x8C74: 0x834A, - 0x8C75: 0x86CD, - 0x8C76: 0x8A08, - 0x8C77: 0x8A63, - 0x8C78: 0x8B66, - 0x8C79: 0x8EFD, - 0x8C7A: 0x981A, - 0x8C7B: 0x9D8F, - 0x8C7C: 0x82B8, - 0x8C7D: 0x8FCE, - 0x8C7E: 0x9BE8, - 0x8C80: 0x5287, - 0x8C81: 0x621F, - 0x8C82: 0x6483, - 0x8C83: 0x6FC0, - 0x8C84: 0x9699, - 0x8C85: 0x6841, - 0x8C86: 0x5091, - 0x8C87: 0x6B20, - 0x8C88: 0x6C7A, - 0x8C89: 0x6F54, - 0x8C8A: 0x7A74, - 0x8C8B: 0x7D50, - 0x8C8C: 0x8840, - 0x8C8D: 0x8A23, - 0x8C8E: 0x6708, - 0x8C8F: 0x4EF6, - 0x8C90: 0x5039, - 0x8C91: 0x5026, - 0x8C92: 0x5065, - 0x8C93: 0x517C, - 0x8C94: 0x5238, - 0x8C95: 0x5263, - 0x8C96: 0x55A7, - 0x8C97: 0x570F, - 0x8C98: 0x5805, - 0x8C99: 0x5ACC, - 0x8C9A: 0x5EFA, - 0x8C9B: 0x61B2, - 0x8C9C: 0x61F8, - 0x8C9D: 0x62F3, - 0x8C9E: 0x6372, - 0x8C9F: 0x691C, - 0x8CA0: 0x6A29, - 0x8CA1: 0x727D, - 0x8CA2: 0x72AC, - 0x8CA3: 0x732E, - 0x8CA4: 0x7814, - 0x8CA5: 0x786F, - 0x8CA6: 0x7D79, - 0x8CA7: 0x770C, - 0x8CA8: 0x80A9, - 0x8CA9: 0x898B, - 0x8CAA: 0x8B19, - 0x8CAB: 0x8CE2, - 0x8CAC: 0x8ED2, - 0x8CAD: 0x9063, - 0x8CAE: 0x9375, - 0x8CAF: 0x967A, - 0x8CB0: 0x9855, - 0x8CB1: 0x9A13, - 0x8CB2: 0x9E78, - 0x8CB3: 0x5143, - 0x8CB4: 0x539F, - 0x8CB5: 0x53B3, - 0x8CB6: 0x5E7B, - 0x8CB7: 0x5F26, - 0x8CB8: 0x6E1B, - 0x8CB9: 0x6E90, - 0x8CBA: 0x7384, - 0x8CBB: 0x73FE, - 0x8CBC: 0x7D43, - 0x8CBD: 0x8237, - 0x8CBE: 0x8A00, - 0x8CBF: 0x8AFA, - 0x8CC0: 0x9650, - 0x8CC1: 0x4E4E, - 0x8CC2: 0x500B, - 0x8CC3: 0x53E4, - 0x8CC4: 0x547C, - 0x8CC5: 0x56FA, - 0x8CC6: 0x59D1, - 0x8CC7: 0x5B64, - 0x8CC8: 0x5DF1, - 0x8CC9: 0x5EAB, - 0x8CCA: 0x5F27, - 0x8CCB: 0x6238, - 0x8CCC: 0x6545, - 0x8CCD: 0x67AF, - 0x8CCE: 0x6E56, - 0x8CCF: 0x72D0, - 0x8CD0: 0x7CCA, - 0x8CD1: 0x88B4, - 0x8CD2: 0x80A1, - 0x8CD3: 0x80E1, - 0x8CD4: 0x83F0, - 0x8CD5: 0x864E, - 0x8CD6: 0x8A87, - 0x8CD7: 0x8DE8, - 0x8CD8: 0x9237, - 0x8CD9: 0x96C7, - 0x8CDA: 0x9867, - 0x8CDB: 0x9F13, - 0x8CDC: 0x4E94, - 0x8CDD: 0x4E92, - 0x8CDE: 0x4F0D, - 0x8CDF: 0x5348, - 0x8CE0: 0x5449, - 0x8CE1: 0x543E, - 0x8CE2: 0x5A2F, - 0x8CE3: 0x5F8C, - 0x8CE4: 0x5FA1, - 0x8CE5: 0x609F, - 0x8CE6: 0x68A7, - 0x8CE7: 0x6A8E, - 0x8CE8: 0x745A, - 0x8CE9: 0x7881, - 0x8CEA: 0x8A9E, - 0x8CEB: 0x8AA4, - 0x8CEC: 0x8B77, - 0x8CED: 0x9190, - 0x8CEE: 0x4E5E, - 0x8CEF: 0x9BC9, - 0x8CF0: 0x4EA4, - 0x8CF1: 0x4F7C, - 0x8CF2: 0x4FAF, - 0x8CF3: 0x5019, - 0x8CF4: 0x5016, - 0x8CF5: 0x5149, - 0x8CF6: 0x516C, - 0x8CF7: 0x529F, - 0x8CF8: 0x52B9, - 0x8CF9: 0x52FE, - 0x8CFA: 0x539A, - 0x8CFB: 0x53E3, - 0x8CFC: 0x5411, - 0x8D40: 0x540E, - 0x8D41: 0x5589, - 0x8D42: 0x5751, - 0x8D43: 0x57A2, - 0x8D44: 0x597D, - 0x8D45: 0x5B54, - 0x8D46: 0x5B5D, - 0x8D47: 0x5B8F, - 0x8D48: 0x5DE5, - 0x8D49: 0x5DE7, - 0x8D4A: 0x5DF7, - 0x8D4B: 0x5E78, - 0x8D4C: 0x5E83, - 0x8D4D: 0x5E9A, - 0x8D4E: 0x5EB7, - 0x8D4F: 0x5F18, - 0x8D50: 0x6052, - 0x8D51: 0x614C, - 0x8D52: 0x6297, - 0x8D53: 0x62D8, - 0x8D54: 0x63A7, - 0x8D55: 0x653B, - 0x8D56: 0x6602, - 0x8D57: 0x6643, - 0x8D58: 0x66F4, - 0x8D59: 0x676D, - 0x8D5A: 0x6821, - 0x8D5B: 0x6897, - 0x8D5C: 0x69CB, - 0x8D5D: 0x6C5F, - 0x8D5E: 0x6D2A, - 0x8D5F: 0x6D69, - 0x8D60: 0x6E2F, - 0x8D61: 0x6E9D, - 0x8D62: 0x7532, - 0x8D63: 0x7687, - 0x8D64: 0x786C, - 0x8D65: 0x7A3F, - 0x8D66: 0x7CE0, - 0x8D67: 0x7D05, - 0x8D68: 0x7D18, - 0x8D69: 0x7D5E, - 0x8D6A: 0x7DB1, - 0x8D6B: 0x8015, - 0x8D6C: 0x8003, - 0x8D6D: 0x80AF, - 0x8D6E: 0x80B1, - 0x8D6F: 0x8154, - 0x8D70: 0x818F, - 0x8D71: 0x822A, - 0x8D72: 0x8352, - 0x8D73: 0x884C, - 0x8D74: 0x8861, - 0x8D75: 0x8B1B, - 0x8D76: 0x8CA2, - 0x8D77: 0x8CFC, - 0x8D78: 0x90CA, - 0x8D79: 0x9175, - 0x8D7A: 0x9271, - 0x8D7B: 0x783F, - 0x8D7C: 0x92FC, - 0x8D7D: 0x95A4, - 0x8D7E: 0x964D, - 0x8D80: 0x9805, - 0x8D81: 0x9999, - 0x8D82: 0x9AD8, - 0x8D83: 0x9D3B, - 0x8D84: 0x525B, - 0x8D85: 0x52AB, - 0x8D86: 0x53F7, - 0x8D87: 0x5408, - 0x8D88: 0x58D5, - 0x8D89: 0x62F7, - 0x8D8A: 0x6FE0, - 0x8D8B: 0x8C6A, - 0x8D8C: 0x8F5F, - 0x8D8D: 0x9EB9, - 0x8D8E: 0x514B, - 0x8D8F: 0x523B, - 0x8D90: 0x544A, - 0x8D91: 0x56FD, - 0x8D92: 0x7A40, - 0x8D93: 0x9177, - 0x8D94: 0x9D60, - 0x8D95: 0x9ED2, - 0x8D96: 0x7344, - 0x8D97: 0x6F09, - 0x8D98: 0x8170, - 0x8D99: 0x7511, - 0x8D9A: 0x5FFD, - 0x8D9B: 0x60DA, - 0x8D9C: 0x9AA8, - 0x8D9D: 0x72DB, - 0x8D9E: 0x8FBC, - 0x8D9F: 0x6B64, - 0x8DA0: 0x9803, - 0x8DA1: 0x4ECA, - 0x8DA2: 0x56F0, - 0x8DA3: 0x5764, - 0x8DA4: 0x58BE, - 0x8DA5: 0x5A5A, - 0x8DA6: 0x6068, - 0x8DA7: 0x61C7, - 0x8DA8: 0x660F, - 0x8DA9: 0x6606, - 0x8DAA: 0x6839, - 0x8DAB: 0x68B1, - 0x8DAC: 0x6DF7, - 0x8DAD: 0x75D5, - 0x8DAE: 0x7D3A, - 0x8DAF: 0x826E, - 0x8DB0: 0x9B42, - 0x8DB1: 0x4E9B, - 0x8DB2: 0x4F50, - 0x8DB3: 0x53C9, - 0x8DB4: 0x5506, - 0x8DB5: 0x5D6F, - 0x8DB6: 0x5DE6, - 0x8DB7: 0x5DEE, - 0x8DB8: 0x67FB, - 0x8DB9: 0x6C99, - 0x8DBA: 0x7473, - 0x8DBB: 0x7802, - 0x8DBC: 0x8A50, - 0x8DBD: 0x9396, - 0x8DBE: 0x88DF, - 0x8DBF: 0x5750, - 0x8DC0: 0x5EA7, - 0x8DC1: 0x632B, - 0x8DC2: 0x50B5, - 0x8DC3: 0x50AC, - 0x8DC4: 0x518D, - 0x8DC5: 0x6700, - 0x8DC6: 0x54C9, - 0x8DC7: 0x585E, - 0x8DC8: 0x59BB, - 0x8DC9: 0x5BB0, - 0x8DCA: 0x5F69, - 0x8DCB: 0x624D, - 0x8DCC: 0x63A1, - 0x8DCD: 0x683D, - 0x8DCE: 0x6B73, - 0x8DCF: 0x6E08, - 0x8DD0: 0x707D, - 0x8DD1: 0x91C7, - 0x8DD2: 0x7280, - 0x8DD3: 0x7815, - 0x8DD4: 0x7826, - 0x8DD5: 0x796D, - 0x8DD6: 0x658E, - 0x8DD7: 0x7D30, - 0x8DD8: 0x83DC, - 0x8DD9: 0x88C1, - 0x8DDA: 0x8F09, - 0x8DDB: 0x969B, - 0x8DDC: 0x5264, - 0x8DDD: 0x5728, - 0x8DDE: 0x6750, - 0x8DDF: 0x7F6A, - 0x8DE0: 0x8CA1, - 0x8DE1: 0x51B4, - 0x8DE2: 0x5742, - 0x8DE3: 0x962A, - 0x8DE4: 0x583A, - 0x8DE5: 0x698A, - 0x8DE6: 0x80B4, - 0x8DE7: 0x54B2, - 0x8DE8: 0x5D0E, - 0x8DE9: 0x57FC, - 0x8DEA: 0x7895, - 0x8DEB: 0x9DFA, - 0x8DEC: 0x4F5C, - 0x8DED: 0x524A, - 0x8DEE: 0x548B, - 0x8DEF: 0x643E, - 0x8DF0: 0x6628, - 0x8DF1: 0x6714, - 0x8DF2: 0x67F5, - 0x8DF3: 0x7A84, - 0x8DF4: 0x7B56, - 0x8DF5: 0x7D22, - 0x8DF6: 0x932F, - 0x8DF7: 0x685C, - 0x8DF8: 0x9BAD, - 0x8DF9: 0x7B39, - 0x8DFA: 0x5319, - 0x8DFB: 0x518A, - 0x8DFC: 0x5237, - 0x8E40: 0x5BDF, - 0x8E41: 0x62F6, - 0x8E42: 0x64AE, - 0x8E43: 0x64E6, - 0x8E44: 0x672D, - 0x8E45: 0x6BBA, - 0x8E46: 0x85A9, - 0x8E47: 0x96D1, - 0x8E48: 0x7690, - 0x8E49: 0x9BD6, - 0x8E4A: 0x634C, - 0x8E4B: 0x9306, - 0x8E4C: 0x9BAB, - 0x8E4D: 0x76BF, - 0x8E4E: 0x6652, - 0x8E4F: 0x4E09, - 0x8E50: 0x5098, - 0x8E51: 0x53C2, - 0x8E52: 0x5C71, - 0x8E53: 0x60E8, - 0x8E54: 0x6492, - 0x8E55: 0x6563, - 0x8E56: 0x685F, - 0x8E57: 0x71E6, - 0x8E58: 0x73CA, - 0x8E59: 0x7523, - 0x8E5A: 0x7B97, - 0x8E5B: 0x7E82, - 0x8E5C: 0x8695, - 0x8E5D: 0x8B83, - 0x8E5E: 0x8CDB, - 0x8E5F: 0x9178, - 0x8E60: 0x9910, - 0x8E61: 0x65AC, - 0x8E62: 0x66AB, - 0x8E63: 0x6B8B, - 0x8E64: 0x4ED5, - 0x8E65: 0x4ED4, - 0x8E66: 0x4F3A, - 0x8E67: 0x4F7F, - 0x8E68: 0x523A, - 0x8E69: 0x53F8, - 0x8E6A: 0x53F2, - 0x8E6B: 0x55E3, - 0x8E6C: 0x56DB, - 0x8E6D: 0x58EB, - 0x8E6E: 0x59CB, - 0x8E6F: 0x59C9, - 0x8E70: 0x59FF, - 0x8E71: 0x5B50, - 0x8E72: 0x5C4D, - 0x8E73: 0x5E02, - 0x8E74: 0x5E2B, - 0x8E75: 0x5FD7, - 0x8E76: 0x601D, - 0x8E77: 0x6307, - 0x8E78: 0x652F, - 0x8E79: 0x5B5C, - 0x8E7A: 0x65AF, - 0x8E7B: 0x65BD, - 0x8E7C: 0x65E8, - 0x8E7D: 0x679D, - 0x8E7E: 0x6B62, - 0x8E80: 0x6B7B, - 0x8E81: 0x6C0F, - 0x8E82: 0x7345, - 0x8E83: 0x7949, - 0x8E84: 0x79C1, - 0x8E85: 0x7CF8, - 0x8E86: 0x7D19, - 0x8E87: 0x7D2B, - 0x8E88: 0x80A2, - 0x8E89: 0x8102, - 0x8E8A: 0x81F3, - 0x8E8B: 0x8996, - 0x8E8C: 0x8A5E, - 0x8E8D: 0x8A69, - 0x8E8E: 0x8A66, - 0x8E8F: 0x8A8C, - 0x8E90: 0x8AEE, - 0x8E91: 0x8CC7, - 0x8E92: 0x8CDC, - 0x8E93: 0x96CC, - 0x8E94: 0x98FC, - 0x8E95: 0x6B6F, - 0x8E96: 0x4E8B, - 0x8E97: 0x4F3C, - 0x8E98: 0x4F8D, - 0x8E99: 0x5150, - 0x8E9A: 0x5B57, - 0x8E9B: 0x5BFA, - 0x8E9C: 0x6148, - 0x8E9D: 0x6301, - 0x8E9E: 0x6642, - 0x8E9F: 0x6B21, - 0x8EA0: 0x6ECB, - 0x8EA1: 0x6CBB, - 0x8EA2: 0x723E, - 0x8EA3: 0x74BD, - 0x8EA4: 0x75D4, - 0x8EA5: 0x78C1, - 0x8EA6: 0x793A, - 0x8EA7: 0x800C, - 0x8EA8: 0x8033, - 0x8EA9: 0x81EA, - 0x8EAA: 0x8494, - 0x8EAB: 0x8F9E, - 0x8EAC: 0x6C50, - 0x8EAD: 0x9E7F, - 0x8EAE: 0x5F0F, - 0x8EAF: 0x8B58, - 0x8EB0: 0x9D2B, - 0x8EB1: 0x7AFA, - 0x8EB2: 0x8EF8, - 0x8EB3: 0x5B8D, - 0x8EB4: 0x96EB, - 0x8EB5: 0x4E03, - 0x8EB6: 0x53F1, - 0x8EB7: 0x57F7, - 0x8EB8: 0x5931, - 0x8EB9: 0x5AC9, - 0x8EBA: 0x5BA4, - 0x8EBB: 0x6089, - 0x8EBC: 0x6E7F, - 0x8EBD: 0x6F06, - 0x8EBE: 0x75BE, - 0x8EBF: 0x8CEA, - 0x8EC0: 0x5B9F, - 0x8EC1: 0x8500, - 0x8EC2: 0x7BE0, - 0x8EC3: 0x5072, - 0x8EC4: 0x67F4, - 0x8EC5: 0x829D, - 0x8EC6: 0x5C61, - 0x8EC7: 0x854A, - 0x8EC8: 0x7E1E, - 0x8EC9: 0x820E, - 0x8ECA: 0x5199, - 0x8ECB: 0x5C04, - 0x8ECC: 0x6368, - 0x8ECD: 0x8D66, - 0x8ECE: 0x659C, - 0x8ECF: 0x716E, - 0x8ED0: 0x793E, - 0x8ED1: 0x7D17, - 0x8ED2: 0x8005, - 0x8ED3: 0x8B1D, - 0x8ED4: 0x8ECA, - 0x8ED5: 0x906E, - 0x8ED6: 0x86C7, - 0x8ED7: 0x90AA, - 0x8ED8: 0x501F, - 0x8ED9: 0x52FA, - 0x8EDA: 0x5C3A, - 0x8EDB: 0x6753, - 0x8EDC: 0x707C, - 0x8EDD: 0x7235, - 0x8EDE: 0x914C, - 0x8EDF: 0x91C8, - 0x8EE0: 0x932B, - 0x8EE1: 0x82E5, - 0x8EE2: 0x5BC2, - 0x8EE3: 0x5F31, - 0x8EE4: 0x60F9, - 0x8EE5: 0x4E3B, - 0x8EE6: 0x53D6, - 0x8EE7: 0x5B88, - 0x8EE8: 0x624B, - 0x8EE9: 0x6731, - 0x8EEA: 0x6B8A, - 0x8EEB: 0x72E9, - 0x8EEC: 0x73E0, - 0x8EED: 0x7A2E, - 0x8EEE: 0x816B, - 0x8EEF: 0x8DA3, - 0x8EF0: 0x9152, - 0x8EF1: 0x9996, - 0x8EF2: 0x5112, - 0x8EF3: 0x53D7, - 0x8EF4: 0x546A, - 0x8EF5: 0x5BFF, - 0x8EF6: 0x6388, - 0x8EF7: 0x6A39, - 0x8EF8: 0x7DAC, - 0x8EF9: 0x9700, - 0x8EFA: 0x56DA, - 0x8EFB: 0x53CE, - 0x8EFC: 0x5468, - 0x8F40: 0x5B97, - 0x8F41: 0x5C31, - 0x8F42: 0x5DDE, - 0x8F43: 0x4FEE, - 0x8F44: 0x6101, - 0x8F45: 0x62FE, - 0x8F46: 0x6D32, - 0x8F47: 0x79C0, - 0x8F48: 0x79CB, - 0x8F49: 0x7D42, - 0x8F4A: 0x7E4D, - 0x8F4B: 0x7FD2, - 0x8F4C: 0x81ED, - 0x8F4D: 0x821F, - 0x8F4E: 0x8490, - 0x8F4F: 0x8846, - 0x8F50: 0x8972, - 0x8F51: 0x8B90, - 0x8F52: 0x8E74, - 0x8F53: 0x8F2F, - 0x8F54: 0x9031, - 0x8F55: 0x914B, - 0x8F56: 0x916C, - 0x8F57: 0x96C6, - 0x8F58: 0x919C, - 0x8F59: 0x4EC0, - 0x8F5A: 0x4F4F, - 0x8F5B: 0x5145, - 0x8F5C: 0x5341, - 0x8F5D: 0x5F93, - 0x8F5E: 0x620E, - 0x8F5F: 0x67D4, - 0x8F60: 0x6C41, - 0x8F61: 0x6E0B, - 0x8F62: 0x7363, - 0x8F63: 0x7E26, - 0x8F64: 0x91CD, - 0x8F65: 0x9283, - 0x8F66: 0x53D4, - 0x8F67: 0x5919, - 0x8F68: 0x5BBF, - 0x8F69: 0x6DD1, - 0x8F6A: 0x795D, - 0x8F6B: 0x7E2E, - 0x8F6C: 0x7C9B, - 0x8F6D: 0x587E, - 0x8F6E: 0x719F, - 0x8F6F: 0x51FA, - 0x8F70: 0x8853, - 0x8F71: 0x8FF0, - 0x8F72: 0x4FCA, - 0x8F73: 0x5CFB, - 0x8F74: 0x6625, - 0x8F75: 0x77AC, - 0x8F76: 0x7AE3, - 0x8F77: 0x821C, - 0x8F78: 0x99FF, - 0x8F79: 0x51C6, - 0x8F7A: 0x5FAA, - 0x8F7B: 0x65EC, - 0x8F7C: 0x696F, - 0x8F7D: 0x6B89, - 0x8F7E: 0x6DF3, - 0x8F80: 0x6E96, - 0x8F81: 0x6F64, - 0x8F82: 0x76FE, - 0x8F83: 0x7D14, - 0x8F84: 0x5DE1, - 0x8F85: 0x9075, - 0x8F86: 0x9187, - 0x8F87: 0x9806, - 0x8F88: 0x51E6, - 0x8F89: 0x521D, - 0x8F8A: 0x6240, - 0x8F8B: 0x6691, - 0x8F8C: 0x66D9, - 0x8F8D: 0x6E1A, - 0x8F8E: 0x5EB6, - 0x8F8F: 0x7DD2, - 0x8F90: 0x7F72, - 0x8F91: 0x66F8, - 0x8F92: 0x85AF, - 0x8F93: 0x85F7, - 0x8F94: 0x8AF8, - 0x8F95: 0x52A9, - 0x8F96: 0x53D9, - 0x8F97: 0x5973, - 0x8F98: 0x5E8F, - 0x8F99: 0x5F90, - 0x8F9A: 0x6055, - 0x8F9B: 0x92E4, - 0x8F9C: 0x9664, - 0x8F9D: 0x50B7, - 0x8F9E: 0x511F, - 0x8F9F: 0x52DD, - 0x8FA0: 0x5320, - 0x8FA1: 0x5347, - 0x8FA2: 0x53EC, - 0x8FA3: 0x54E8, - 0x8FA4: 0x5546, - 0x8FA5: 0x5531, - 0x8FA6: 0x5617, - 0x8FA7: 0x5968, - 0x8FA8: 0x59BE, - 0x8FA9: 0x5A3C, - 0x8FAA: 0x5BB5, - 0x8FAB: 0x5C06, - 0x8FAC: 0x5C0F, - 0x8FAD: 0x5C11, - 0x8FAE: 0x5C1A, - 0x8FAF: 0x5E84, - 0x8FB0: 0x5E8A, - 0x8FB1: 0x5EE0, - 0x8FB2: 0x5F70, - 0x8FB3: 0x627F, - 0x8FB4: 0x6284, - 0x8FB5: 0x62DB, - 0x8FB6: 0x638C, - 0x8FB7: 0x6377, - 0x8FB8: 0x6607, - 0x8FB9: 0x660C, - 0x8FBA: 0x662D, - 0x8FBB: 0x6676, - 0x8FBC: 0x677E, - 0x8FBD: 0x68A2, - 0x8FBE: 0x6A1F, - 0x8FBF: 0x6A35, - 0x8FC0: 0x6CBC, - 0x8FC1: 0x6D88, - 0x8FC2: 0x6E09, - 0x8FC3: 0x6E58, - 0x8FC4: 0x713C, - 0x8FC5: 0x7126, - 0x8FC6: 0x7167, - 0x8FC7: 0x75C7, - 0x8FC8: 0x7701, - 0x8FC9: 0x785D, - 0x8FCA: 0x7901, - 0x8FCB: 0x7965, - 0x8FCC: 0x79F0, - 0x8FCD: 0x7AE0, - 0x8FCE: 0x7B11, - 0x8FCF: 0x7CA7, - 0x8FD0: 0x7D39, - 0x8FD1: 0x8096, - 0x8FD2: 0x83D6, - 0x8FD3: 0x848B, - 0x8FD4: 0x8549, - 0x8FD5: 0x885D, - 0x8FD6: 0x88F3, - 0x8FD7: 0x8A1F, - 0x8FD8: 0x8A3C, - 0x8FD9: 0x8A54, - 0x8FDA: 0x8A73, - 0x8FDB: 0x8C61, - 0x8FDC: 0x8CDE, - 0x8FDD: 0x91A4, - 0x8FDE: 0x9266, - 0x8FDF: 0x937E, - 0x8FE0: 0x9418, - 0x8FE1: 0x969C, - 0x8FE2: 0x9798, - 0x8FE3: 0x4E0A, - 0x8FE4: 0x4E08, - 0x8FE5: 0x4E1E, - 0x8FE6: 0x4E57, - 0x8FE7: 0x5197, - 0x8FE8: 0x5270, - 0x8FE9: 0x57CE, - 0x8FEA: 0x5834, - 0x8FEB: 0x58CC, - 0x8FEC: 0x5B22, - 0x8FED: 0x5E38, - 0x8FEE: 0x60C5, - 0x8FEF: 0x64FE, - 0x8FF0: 0x6761, - 0x8FF1: 0x6756, - 0x8FF2: 0x6D44, - 0x8FF3: 0x72B6, - 0x8FF4: 0x7573, - 0x8FF5: 0x7A63, - 0x8FF6: 0x84B8, - 0x8FF7: 0x8B72, - 0x8FF8: 0x91B8, - 0x8FF9: 0x9320, - 0x8FFA: 0x5631, - 0x8FFB: 0x57F4, - 0x8FFC: 0x98FE, - 0x9040: 0x62ED, - 0x9041: 0x690D, - 0x9042: 0x6B96, - 0x9043: 0x71ED, - 0x9044: 0x7E54, - 0x9045: 0x8077, - 0x9046: 0x8272, - 0x9047: 0x89E6, - 0x9048: 0x98DF, - 0x9049: 0x8755, - 0x904A: 0x8FB1, - 0x904B: 0x5C3B, - 0x904C: 0x4F38, - 0x904D: 0x4FE1, - 0x904E: 0x4FB5, - 0x904F: 0x5507, - 0x9050: 0x5A20, - 0x9051: 0x5BDD, - 0x9052: 0x5BE9, - 0x9053: 0x5FC3, - 0x9054: 0x614E, - 0x9055: 0x632F, - 0x9056: 0x65B0, - 0x9057: 0x664B, - 0x9058: 0x68EE, - 0x9059: 0x699B, - 0x905A: 0x6D78, - 0x905B: 0x6DF1, - 0x905C: 0x7533, - 0x905D: 0x75B9, - 0x905E: 0x771F, - 0x905F: 0x795E, - 0x9060: 0x79E6, - 0x9061: 0x7D33, - 0x9062: 0x81E3, - 0x9063: 0x82AF, - 0x9064: 0x85AA, - 0x9065: 0x89AA, - 0x9066: 0x8A3A, - 0x9067: 0x8EAB, - 0x9068: 0x8F9B, - 0x9069: 0x9032, - 0x906A: 0x91DD, - 0x906B: 0x9707, - 0x906C: 0x4EBA, - 0x906D: 0x4EC1, - 0x906E: 0x5203, - 0x906F: 0x5875, - 0x9070: 0x58EC, - 0x9071: 0x5C0B, - 0x9072: 0x751A, - 0x9073: 0x5C3D, - 0x9074: 0x814E, - 0x9075: 0x8A0A, - 0x9076: 0x8FC5, - 0x9077: 0x9663, - 0x9078: 0x976D, - 0x9079: 0x7B25, - 0x907A: 0x8ACF, - 0x907B: 0x9808, - 0x907C: 0x9162, - 0x907D: 0x56F3, - 0x907E: 0x53A8, - 0x9080: 0x9017, - 0x9081: 0x5439, - 0x9082: 0x5782, - 0x9083: 0x5E25, - 0x9084: 0x63A8, - 0x9085: 0x6C34, - 0x9086: 0x708A, - 0x9087: 0x7761, - 0x9088: 0x7C8B, - 0x9089: 0x7FE0, - 0x908A: 0x8870, - 0x908B: 0x9042, - 0x908C: 0x9154, - 0x908D: 0x9310, - 0x908E: 0x9318, - 0x908F: 0x968F, - 0x9090: 0x745E, - 0x9091: 0x9AC4, - 0x9092: 0x5D07, - 0x9093: 0x5D69, - 0x9094: 0x6570, - 0x9095: 0x67A2, - 0x9096: 0x8DA8, - 0x9097: 0x96DB, - 0x9098: 0x636E, - 0x9099: 0x6749, - 0x909A: 0x6919, - 0x909B: 0x83C5, - 0x909C: 0x9817, - 0x909D: 0x96C0, - 0x909E: 0x88FE, - 0x909F: 0x6F84, - 0x90A0: 0x647A, - 0x90A1: 0x5BF8, - 0x90A2: 0x4E16, - 0x90A3: 0x702C, - 0x90A4: 0x755D, - 0x90A5: 0x662F, - 0x90A6: 0x51C4, - 0x90A7: 0x5236, - 0x90A8: 0x52E2, - 0x90A9: 0x59D3, - 0x90AA: 0x5F81, - 0x90AB: 0x6027, - 0x90AC: 0x6210, - 0x90AD: 0x653F, - 0x90AE: 0x6574, - 0x90AF: 0x661F, - 0x90B0: 0x6674, - 0x90B1: 0x68F2, - 0x90B2: 0x6816, - 0x90B3: 0x6B63, - 0x90B4: 0x6E05, - 0x90B5: 0x7272, - 0x90B6: 0x751F, - 0x90B7: 0x76DB, - 0x90B8: 0x7CBE, - 0x90B9: 0x8056, - 0x90BA: 0x58F0, - 0x90BB: 0x88FD, - 0x90BC: 0x897F, - 0x90BD: 0x8AA0, - 0x90BE: 0x8A93, - 0x90BF: 0x8ACB, - 0x90C0: 0x901D, - 0x90C1: 0x9192, - 0x90C2: 0x9752, - 0x90C3: 0x9759, - 0x90C4: 0x6589, - 0x90C5: 0x7A0E, - 0x90C6: 0x8106, - 0x90C7: 0x96BB, - 0x90C8: 0x5E2D, - 0x90C9: 0x60DC, - 0x90CA: 0x621A, - 0x90CB: 0x65A5, - 0x90CC: 0x6614, - 0x90CD: 0x6790, - 0x90CE: 0x77F3, - 0x90CF: 0x7A4D, - 0x90D0: 0x7C4D, - 0x90D1: 0x7E3E, - 0x90D2: 0x810A, - 0x90D3: 0x8CAC, - 0x90D4: 0x8D64, - 0x90D5: 0x8DE1, - 0x90D6: 0x8E5F, - 0x90D7: 0x78A9, - 0x90D8: 0x5207, - 0x90D9: 0x62D9, - 0x90DA: 0x63A5, - 0x90DB: 0x6442, - 0x90DC: 0x6298, - 0x90DD: 0x8A2D, - 0x90DE: 0x7A83, - 0x90DF: 0x7BC0, - 0x90E0: 0x8AAC, - 0x90E1: 0x96EA, - 0x90E2: 0x7D76, - 0x90E3: 0x820C, - 0x90E4: 0x8749, - 0x90E5: 0x4ED9, - 0x90E6: 0x5148, - 0x90E7: 0x5343, - 0x90E8: 0x5360, - 0x90E9: 0x5BA3, - 0x90EA: 0x5C02, - 0x90EB: 0x5C16, - 0x90EC: 0x5DDD, - 0x90ED: 0x6226, - 0x90EE: 0x6247, - 0x90EF: 0x64B0, - 0x90F0: 0x6813, - 0x90F1: 0x6834, - 0x90F2: 0x6CC9, - 0x90F3: 0x6D45, - 0x90F4: 0x6D17, - 0x90F5: 0x67D3, - 0x90F6: 0x6F5C, - 0x90F7: 0x714E, - 0x90F8: 0x717D, - 0x90F9: 0x65CB, - 0x90FA: 0x7A7F, - 0x90FB: 0x7BAD, - 0x90FC: 0x7DDA, - 0x9140: 0x7E4A, - 0x9141: 0x7FA8, - 0x9142: 0x817A, - 0x9143: 0x821B, - 0x9144: 0x8239, - 0x9145: 0x85A6, - 0x9146: 0x8A6E, - 0x9147: 0x8CCE, - 0x9148: 0x8DF5, - 0x9149: 0x9078, - 0x914A: 0x9077, - 0x914B: 0x92AD, - 0x914C: 0x9291, - 0x914D: 0x9583, - 0x914E: 0x9BAE, - 0x914F: 0x524D, - 0x9150: 0x5584, - 0x9151: 0x6F38, - 0x9152: 0x7136, - 0x9153: 0x5168, - 0x9154: 0x7985, - 0x9155: 0x7E55, - 0x9156: 0x81B3, - 0x9157: 0x7CCE, - 0x9158: 0x564C, - 0x9159: 0x5851, - 0x915A: 0x5CA8, - 0x915B: 0x63AA, - 0x915C: 0x66FE, - 0x915D: 0x66FD, - 0x915E: 0x695A, - 0x915F: 0x72D9, - 0x9160: 0x758F, - 0x9161: 0x758E, - 0x9162: 0x790E, - 0x9163: 0x7956, - 0x9164: 0x79DF, - 0x9165: 0x7C97, - 0x9166: 0x7D20, - 0x9167: 0x7D44, - 0x9168: 0x8607, - 0x9169: 0x8A34, - 0x916A: 0x963B, - 0x916B: 0x9061, - 0x916C: 0x9F20, - 0x916D: 0x50E7, - 0x916E: 0x5275, - 0x916F: 0x53CC, - 0x9170: 0x53E2, - 0x9171: 0x5009, - 0x9172: 0x55AA, - 0x9173: 0x58EE, - 0x9174: 0x594F, - 0x9175: 0x723D, - 0x9176: 0x5B8B, - 0x9177: 0x5C64, - 0x9178: 0x531D, - 0x9179: 0x60E3, - 0x917A: 0x60F3, - 0x917B: 0x635C, - 0x917C: 0x6383, - 0x917D: 0x633F, - 0x917E: 0x63BB, - 0x9180: 0x64CD, - 0x9181: 0x65E9, - 0x9182: 0x66F9, - 0x9183: 0x5DE3, - 0x9184: 0x69CD, - 0x9185: 0x69FD, - 0x9186: 0x6F15, - 0x9187: 0x71E5, - 0x9188: 0x4E89, - 0x9189: 0x75E9, - 0x918A: 0x76F8, - 0x918B: 0x7A93, - 0x918C: 0x7CDF, - 0x918D: 0x7DCF, - 0x918E: 0x7D9C, - 0x918F: 0x8061, - 0x9190: 0x8349, - 0x9191: 0x8358, - 0x9192: 0x846C, - 0x9193: 0x84BC, - 0x9194: 0x85FB, - 0x9195: 0x88C5, - 0x9196: 0x8D70, - 0x9197: 0x9001, - 0x9198: 0x906D, - 0x9199: 0x9397, - 0x919A: 0x971C, - 0x919B: 0x9A12, - 0x919C: 0x50CF, - 0x919D: 0x5897, - 0x919E: 0x618E, - 0x919F: 0x81D3, - 0x91A0: 0x8535, - 0x91A1: 0x8D08, - 0x91A2: 0x9020, - 0x91A3: 0x4FC3, - 0x91A4: 0x5074, - 0x91A5: 0x5247, - 0x91A6: 0x5373, - 0x91A7: 0x606F, - 0x91A8: 0x6349, - 0x91A9: 0x675F, - 0x91AA: 0x6E2C, - 0x91AB: 0x8DB3, - 0x91AC: 0x901F, - 0x91AD: 0x4FD7, - 0x91AE: 0x5C5E, - 0x91AF: 0x8CCA, - 0x91B0: 0x65CF, - 0x91B1: 0x7D9A, - 0x91B2: 0x5352, - 0x91B3: 0x8896, - 0x91B4: 0x5176, - 0x91B5: 0x63C3, - 0x91B6: 0x5B58, - 0x91B7: 0x5B6B, - 0x91B8: 0x5C0A, - 0x91B9: 0x640D, - 0x91BA: 0x6751, - 0x91BB: 0x905C, - 0x91BC: 0x4ED6, - 0x91BD: 0x591A, - 0x91BE: 0x592A, - 0x91BF: 0x6C70, - 0x91C0: 0x8A51, - 0x91C1: 0x553E, - 0x91C2: 0x5815, - 0x91C3: 0x59A5, - 0x91C4: 0x60F0, - 0x91C5: 0x6253, - 0x91C6: 0x67C1, - 0x91C7: 0x8235, - 0x91C8: 0x6955, - 0x91C9: 0x9640, - 0x91CA: 0x99C4, - 0x91CB: 0x9A28, - 0x91CC: 0x4F53, - 0x91CD: 0x5806, - 0x91CE: 0x5BFE, - 0x91CF: 0x8010, - 0x91D0: 0x5CB1, - 0x91D1: 0x5E2F, - 0x91D2: 0x5F85, - 0x91D3: 0x6020, - 0x91D4: 0x614B, - 0x91D5: 0x6234, - 0x91D6: 0x66FF, - 0x91D7: 0x6CF0, - 0x91D8: 0x6EDE, - 0x91D9: 0x80CE, - 0x91DA: 0x817F, - 0x91DB: 0x82D4, - 0x91DC: 0x888B, - 0x91DD: 0x8CB8, - 0x91DE: 0x9000, - 0x91DF: 0x902E, - 0x91E0: 0x968A, - 0x91E1: 0x9EDB, - 0x91E2: 0x9BDB, - 0x91E3: 0x4EE3, - 0x91E4: 0x53F0, - 0x91E5: 0x5927, - 0x91E6: 0x7B2C, - 0x91E7: 0x918D, - 0x91E8: 0x984C, - 0x91E9: 0x9DF9, - 0x91EA: 0x6EDD, - 0x91EB: 0x7027, - 0x91EC: 0x5353, - 0x91ED: 0x5544, - 0x91EE: 0x5B85, - 0x91EF: 0x6258, - 0x91F0: 0x629E, - 0x91F1: 0x62D3, - 0x91F2: 0x6CA2, - 0x91F3: 0x6FEF, - 0x91F4: 0x7422, - 0x91F5: 0x8A17, - 0x91F6: 0x9438, - 0x91F7: 0x6FC1, - 0x91F8: 0x8AFE, - 0x91F9: 0x8338, - 0x91FA: 0x51E7, - 0x91FB: 0x86F8, - 0x91FC: 0x53EA, - 0x9240: 0x53E9, - 0x9241: 0x4F46, - 0x9242: 0x9054, - 0x9243: 0x8FB0, - 0x9244: 0x596A, - 0x9245: 0x8131, - 0x9246: 0x5DFD, - 0x9247: 0x7AEA, - 0x9248: 0x8FBF, - 0x9249: 0x68DA, - 0x924A: 0x8C37, - 0x924B: 0x72F8, - 0x924C: 0x9C48, - 0x924D: 0x6A3D, - 0x924E: 0x8AB0, - 0x924F: 0x4E39, - 0x9250: 0x5358, - 0x9251: 0x5606, - 0x9252: 0x5766, - 0x9253: 0x62C5, - 0x9254: 0x63A2, - 0x9255: 0x65E6, - 0x9256: 0x6B4E, - 0x9257: 0x6DE1, - 0x9258: 0x6E5B, - 0x9259: 0x70AD, - 0x925A: 0x77ED, - 0x925B: 0x7AEF, - 0x925C: 0x7BAA, - 0x925D: 0x7DBB, - 0x925E: 0x803D, - 0x925F: 0x80C6, - 0x9260: 0x86CB, - 0x9261: 0x8A95, - 0x9262: 0x935B, - 0x9263: 0x56E3, - 0x9264: 0x58C7, - 0x9265: 0x5F3E, - 0x9266: 0x65AD, - 0x9267: 0x6696, - 0x9268: 0x6A80, - 0x9269: 0x6BB5, - 0x926A: 0x7537, - 0x926B: 0x8AC7, - 0x926C: 0x5024, - 0x926D: 0x77E5, - 0x926E: 0x5730, - 0x926F: 0x5F1B, - 0x9270: 0x6065, - 0x9271: 0x667A, - 0x9272: 0x6C60, - 0x9273: 0x75F4, - 0x9274: 0x7A1A, - 0x9275: 0x7F6E, - 0x9276: 0x81F4, - 0x9277: 0x8718, - 0x9278: 0x9045, - 0x9279: 0x99B3, - 0x927A: 0x7BC9, - 0x927B: 0x755C, - 0x927C: 0x7AF9, - 0x927D: 0x7B51, - 0x927E: 0x84C4, - 0x9280: 0x9010, - 0x9281: 0x79E9, - 0x9282: 0x7A92, - 0x9283: 0x8336, - 0x9284: 0x5AE1, - 0x9285: 0x7740, - 0x9286: 0x4E2D, - 0x9287: 0x4EF2, - 0x9288: 0x5B99, - 0x9289: 0x5FE0, - 0x928A: 0x62BD, - 0x928B: 0x663C, - 0x928C: 0x67F1, - 0x928D: 0x6CE8, - 0x928E: 0x866B, - 0x928F: 0x8877, - 0x9290: 0x8A3B, - 0x9291: 0x914E, - 0x9292: 0x92F3, - 0x9293: 0x99D0, - 0x9294: 0x6A17, - 0x9295: 0x7026, - 0x9296: 0x732A, - 0x9297: 0x82E7, - 0x9298: 0x8457, - 0x9299: 0x8CAF, - 0x929A: 0x4E01, - 0x929B: 0x5146, - 0x929C: 0x51CB, - 0x929D: 0x558B, - 0x929E: 0x5BF5, - 0x929F: 0x5E16, - 0x92A0: 0x5E33, - 0x92A1: 0x5E81, - 0x92A2: 0x5F14, - 0x92A3: 0x5F35, - 0x92A4: 0x5F6B, - 0x92A5: 0x5FB4, - 0x92A6: 0x61F2, - 0x92A7: 0x6311, - 0x92A8: 0x66A2, - 0x92A9: 0x671D, - 0x92AA: 0x6F6E, - 0x92AB: 0x7252, - 0x92AC: 0x753A, - 0x92AD: 0x773A, - 0x92AE: 0x8074, - 0x92AF: 0x8139, - 0x92B0: 0x8178, - 0x92B1: 0x8776, - 0x92B2: 0x8ABF, - 0x92B3: 0x8ADC, - 0x92B4: 0x8D85, - 0x92B5: 0x8DF3, - 0x92B6: 0x929A, - 0x92B7: 0x9577, - 0x92B8: 0x9802, - 0x92B9: 0x9CE5, - 0x92BA: 0x52C5, - 0x92BB: 0x6357, - 0x92BC: 0x76F4, - 0x92BD: 0x6715, - 0x92BE: 0x6C88, - 0x92BF: 0x73CD, - 0x92C0: 0x8CC3, - 0x92C1: 0x93AE, - 0x92C2: 0x9673, - 0x92C3: 0x6D25, - 0x92C4: 0x589C, - 0x92C5: 0x690E, - 0x92C6: 0x69CC, - 0x92C7: 0x8FFD, - 0x92C8: 0x939A, - 0x92C9: 0x75DB, - 0x92CA: 0x901A, - 0x92CB: 0x585A, - 0x92CC: 0x6802, - 0x92CD: 0x63B4, - 0x92CE: 0x69FB, - 0x92CF: 0x4F43, - 0x92D0: 0x6F2C, - 0x92D1: 0x67D8, - 0x92D2: 0x8FBB, - 0x92D3: 0x8526, - 0x92D4: 0x7DB4, - 0x92D5: 0x9354, - 0x92D6: 0x693F, - 0x92D7: 0x6F70, - 0x92D8: 0x576A, - 0x92D9: 0x58F7, - 0x92DA: 0x5B2C, - 0x92DB: 0x7D2C, - 0x92DC: 0x722A, - 0x92DD: 0x540A, - 0x92DE: 0x91E3, - 0x92DF: 0x9DB4, - 0x92E0: 0x4EAD, - 0x92E1: 0x4F4E, - 0x92E2: 0x505C, - 0x92E3: 0x5075, - 0x92E4: 0x5243, - 0x92E5: 0x8C9E, - 0x92E6: 0x5448, - 0x92E7: 0x5824, - 0x92E8: 0x5B9A, - 0x92E9: 0x5E1D, - 0x92EA: 0x5E95, - 0x92EB: 0x5EAD, - 0x92EC: 0x5EF7, - 0x92ED: 0x5F1F, - 0x92EE: 0x608C, - 0x92EF: 0x62B5, - 0x92F0: 0x633A, - 0x92F1: 0x63D0, - 0x92F2: 0x68AF, - 0x92F3: 0x6C40, - 0x92F4: 0x7887, - 0x92F5: 0x798E, - 0x92F6: 0x7A0B, - 0x92F7: 0x7DE0, - 0x92F8: 0x8247, - 0x92F9: 0x8A02, - 0x92FA: 0x8AE6, - 0x92FB: 0x8E44, - 0x92FC: 0x9013, - 0x9340: 0x90B8, - 0x9341: 0x912D, - 0x9342: 0x91D8, - 0x9343: 0x9F0E, - 0x9344: 0x6CE5, - 0x9345: 0x6458, - 0x9346: 0x64E2, - 0x9347: 0x6575, - 0x9348: 0x6EF4, - 0x9349: 0x7684, - 0x934A: 0x7B1B, - 0x934B: 0x9069, - 0x934C: 0x93D1, - 0x934D: 0x6EBA, - 0x934E: 0x54F2, - 0x934F: 0x5FB9, - 0x9350: 0x64A4, - 0x9351: 0x8F4D, - 0x9352: 0x8FED, - 0x9353: 0x9244, - 0x9354: 0x5178, - 0x9355: 0x586B, - 0x9356: 0x5929, - 0x9357: 0x5C55, - 0x9358: 0x5E97, - 0x9359: 0x6DFB, - 0x935A: 0x7E8F, - 0x935B: 0x751C, - 0x935C: 0x8CBC, - 0x935D: 0x8EE2, - 0x935E: 0x985B, - 0x935F: 0x70B9, - 0x9360: 0x4F1D, - 0x9361: 0x6BBF, - 0x9362: 0x6FB1, - 0x9363: 0x7530, - 0x9364: 0x96FB, - 0x9365: 0x514E, - 0x9366: 0x5410, - 0x9367: 0x5835, - 0x9368: 0x5857, - 0x9369: 0x59AC, - 0x936A: 0x5C60, - 0x936B: 0x5F92, - 0x936C: 0x6597, - 0x936D: 0x675C, - 0x936E: 0x6E21, - 0x936F: 0x767B, - 0x9370: 0x83DF, - 0x9371: 0x8CED, - 0x9372: 0x9014, - 0x9373: 0x90FD, - 0x9374: 0x934D, - 0x9375: 0x7825, - 0x9376: 0x783A, - 0x9377: 0x52AA, - 0x9378: 0x5EA6, - 0x9379: 0x571F, - 0x937A: 0x5974, - 0x937B: 0x6012, - 0x937C: 0x5012, - 0x937D: 0x515A, - 0x937E: 0x51AC, - 0x9380: 0x51CD, - 0x9381: 0x5200, - 0x9382: 0x5510, - 0x9383: 0x5854, - 0x9384: 0x5858, - 0x9385: 0x5957, - 0x9386: 0x5B95, - 0x9387: 0x5CF6, - 0x9388: 0x5D8B, - 0x9389: 0x60BC, - 0x938A: 0x6295, - 0x938B: 0x642D, - 0x938C: 0x6771, - 0x938D: 0x6843, - 0x938E: 0x68BC, - 0x938F: 0x68DF, - 0x9390: 0x76D7, - 0x9391: 0x6DD8, - 0x9392: 0x6E6F, - 0x9393: 0x6D9B, - 0x9394: 0x706F, - 0x9395: 0x71C8, - 0x9396: 0x5F53, - 0x9397: 0x75D8, - 0x9398: 0x7977, - 0x9399: 0x7B49, - 0x939A: 0x7B54, - 0x939B: 0x7B52, - 0x939C: 0x7CD6, - 0x939D: 0x7D71, - 0x939E: 0x5230, - 0x939F: 0x8463, - 0x93A0: 0x8569, - 0x93A1: 0x85E4, - 0x93A2: 0x8A0E, - 0x93A3: 0x8B04, - 0x93A4: 0x8C46, - 0x93A5: 0x8E0F, - 0x93A6: 0x9003, - 0x93A7: 0x900F, - 0x93A8: 0x9419, - 0x93A9: 0x9676, - 0x93AA: 0x982D, - 0x93AB: 0x9A30, - 0x93AC: 0x95D8, - 0x93AD: 0x50CD, - 0x93AE: 0x52D5, - 0x93AF: 0x540C, - 0x93B0: 0x5802, - 0x93B1: 0x5C0E, - 0x93B2: 0x61A7, - 0x93B3: 0x649E, - 0x93B4: 0x6D1E, - 0x93B5: 0x77B3, - 0x93B6: 0x7AE5, - 0x93B7: 0x80F4, - 0x93B8: 0x8404, - 0x93B9: 0x9053, - 0x93BA: 0x9285, - 0x93BB: 0x5CE0, - 0x93BC: 0x9D07, - 0x93BD: 0x533F, - 0x93BE: 0x5F97, - 0x93BF: 0x5FB3, - 0x93C0: 0x6D9C, - 0x93C1: 0x7279, - 0x93C2: 0x7763, - 0x93C3: 0x79BF, - 0x93C4: 0x7BE4, - 0x93C5: 0x6BD2, - 0x93C6: 0x72EC, - 0x93C7: 0x8AAD, - 0x93C8: 0x6803, - 0x93C9: 0x6A61, - 0x93CA: 0x51F8, - 0x93CB: 0x7A81, - 0x93CC: 0x6934, - 0x93CD: 0x5C4A, - 0x93CE: 0x9CF6, - 0x93CF: 0x82EB, - 0x93D0: 0x5BC5, - 0x93D1: 0x9149, - 0x93D2: 0x701E, - 0x93D3: 0x5678, - 0x93D4: 0x5C6F, - 0x93D5: 0x60C7, - 0x93D6: 0x6566, - 0x93D7: 0x6C8C, - 0x93D8: 0x8C5A, - 0x93D9: 0x9041, - 0x93DA: 0x9813, - 0x93DB: 0x5451, - 0x93DC: 0x66C7, - 0x93DD: 0x920D, - 0x93DE: 0x5948, - 0x93DF: 0x90A3, - 0x93E0: 0x5185, - 0x93E1: 0x4E4D, - 0x93E2: 0x51EA, - 0x93E3: 0x8599, - 0x93E4: 0x8B0E, - 0x93E5: 0x7058, - 0x93E6: 0x637A, - 0x93E7: 0x934B, - 0x93E8: 0x6962, - 0x93E9: 0x99B4, - 0x93EA: 0x7E04, - 0x93EB: 0x7577, - 0x93EC: 0x5357, - 0x93ED: 0x6960, - 0x93EE: 0x8EDF, - 0x93EF: 0x96E3, - 0x93F0: 0x6C5D, - 0x93F1: 0x4E8C, - 0x93F2: 0x5C3C, - 0x93F3: 0x5F10, - 0x93F4: 0x8FE9, - 0x93F5: 0x5302, - 0x93F6: 0x8CD1, - 0x93F7: 0x8089, - 0x93F8: 0x8679, - 0x93F9: 0x5EFF, - 0x93FA: 0x65E5, - 0x93FB: 0x4E73, - 0x93FC: 0x5165, - 0x9440: 0x5982, - 0x9441: 0x5C3F, - 0x9442: 0x97EE, - 0x9443: 0x4EFB, - 0x9444: 0x598A, - 0x9445: 0x5FCD, - 0x9446: 0x8A8D, - 0x9447: 0x6FE1, - 0x9448: 0x79B0, - 0x9449: 0x7962, - 0x944A: 0x5BE7, - 0x944B: 0x8471, - 0x944C: 0x732B, - 0x944D: 0x71B1, - 0x944E: 0x5E74, - 0x944F: 0x5FF5, - 0x9450: 0x637B, - 0x9451: 0x649A, - 0x9452: 0x71C3, - 0x9453: 0x7C98, - 0x9454: 0x4E43, - 0x9455: 0x5EFC, - 0x9456: 0x4E4B, - 0x9457: 0x57DC, - 0x9458: 0x56A2, - 0x9459: 0x60A9, - 0x945A: 0x6FC3, - 0x945B: 0x7D0D, - 0x945C: 0x80FD, - 0x945D: 0x8133, - 0x945E: 0x81BF, - 0x945F: 0x8FB2, - 0x9460: 0x8997, - 0x9461: 0x86A4, - 0x9462: 0x5DF4, - 0x9463: 0x628A, - 0x9464: 0x64AD, - 0x9465: 0x8987, - 0x9466: 0x6777, - 0x9467: 0x6CE2, - 0x9468: 0x6D3E, - 0x9469: 0x7436, - 0x946A: 0x7834, - 0x946B: 0x5A46, - 0x946C: 0x7F75, - 0x946D: 0x82AD, - 0x946E: 0x99AC, - 0x946F: 0x4FF3, - 0x9470: 0x5EC3, - 0x9471: 0x62DD, - 0x9472: 0x6392, - 0x9473: 0x6557, - 0x9474: 0x676F, - 0x9475: 0x76C3, - 0x9476: 0x724C, - 0x9477: 0x80CC, - 0x9478: 0x80BA, - 0x9479: 0x8F29, - 0x947A: 0x914D, - 0x947B: 0x500D, - 0x947C: 0x57F9, - 0x947D: 0x5A92, - 0x947E: 0x6885, - 0x9480: 0x6973, - 0x9481: 0x7164, - 0x9482: 0x72FD, - 0x9483: 0x8CB7, - 0x9484: 0x58F2, - 0x9485: 0x8CE0, - 0x9486: 0x966A, - 0x9487: 0x9019, - 0x9488: 0x877F, - 0x9489: 0x79E4, - 0x948A: 0x77E7, - 0x948B: 0x8429, - 0x948C: 0x4F2F, - 0x948D: 0x5265, - 0x948E: 0x535A, - 0x948F: 0x62CD, - 0x9490: 0x67CF, - 0x9491: 0x6CCA, - 0x9492: 0x767D, - 0x9493: 0x7B94, - 0x9494: 0x7C95, - 0x9495: 0x8236, - 0x9496: 0x8584, - 0x9497: 0x8FEB, - 0x9498: 0x66DD, - 0x9499: 0x6F20, - 0x949A: 0x7206, - 0x949B: 0x7E1B, - 0x949C: 0x83AB, - 0x949D: 0x99C1, - 0x949E: 0x9EA6, - 0x949F: 0x51FD, - 0x94A0: 0x7BB1, - 0x94A1: 0x7872, - 0x94A2: 0x7BB8, - 0x94A3: 0x8087, - 0x94A4: 0x7B48, - 0x94A5: 0x6AE8, - 0x94A6: 0x5E61, - 0x94A7: 0x808C, - 0x94A8: 0x7551, - 0x94A9: 0x7560, - 0x94AA: 0x516B, - 0x94AB: 0x9262, - 0x94AC: 0x6E8C, - 0x94AD: 0x767A, - 0x94AE: 0x9197, - 0x94AF: 0x9AEA, - 0x94B0: 0x4F10, - 0x94B1: 0x7F70, - 0x94B2: 0x629C, - 0x94B3: 0x7B4F, - 0x94B4: 0x95A5, - 0x94B5: 0x9CE9, - 0x94B6: 0x567A, - 0x94B7: 0x5859, - 0x94B8: 0x86E4, - 0x94B9: 0x96BC, - 0x94BA: 0x4F34, - 0x94BB: 0x5224, - 0x94BC: 0x534A, - 0x94BD: 0x53CD, - 0x94BE: 0x53DB, - 0x94BF: 0x5E06, - 0x94C0: 0x642C, - 0x94C1: 0x6591, - 0x94C2: 0x677F, - 0x94C3: 0x6C3E, - 0x94C4: 0x6C4E, - 0x94C5: 0x7248, - 0x94C6: 0x72AF, - 0x94C7: 0x73ED, - 0x94C8: 0x7554, - 0x94C9: 0x7E41, - 0x94CA: 0x822C, - 0x94CB: 0x85E9, - 0x94CC: 0x8CA9, - 0x94CD: 0x7BC4, - 0x94CE: 0x91C6, - 0x94CF: 0x7169, - 0x94D0: 0x9812, - 0x94D1: 0x98EF, - 0x94D2: 0x633D, - 0x94D3: 0x6669, - 0x94D4: 0x756A, - 0x94D5: 0x76E4, - 0x94D6: 0x78D0, - 0x94D7: 0x8543, - 0x94D8: 0x86EE, - 0x94D9: 0x532A, - 0x94DA: 0x5351, - 0x94DB: 0x5426, - 0x94DC: 0x5983, - 0x94DD: 0x5E87, - 0x94DE: 0x5F7C, - 0x94DF: 0x60B2, - 0x94E0: 0x6249, - 0x94E1: 0x6279, - 0x94E2: 0x62AB, - 0x94E3: 0x6590, - 0x94E4: 0x6BD4, - 0x94E5: 0x6CCC, - 0x94E6: 0x75B2, - 0x94E7: 0x76AE, - 0x94E8: 0x7891, - 0x94E9: 0x79D8, - 0x94EA: 0x7DCB, - 0x94EB: 0x7F77, - 0x94EC: 0x80A5, - 0x94ED: 0x88AB, - 0x94EE: 0x8AB9, - 0x94EF: 0x8CBB, - 0x94F0: 0x907F, - 0x94F1: 0x975E, - 0x94F2: 0x98DB, - 0x94F3: 0x6A0B, - 0x94F4: 0x7C38, - 0x94F5: 0x5099, - 0x94F6: 0x5C3E, - 0x94F7: 0x5FAE, - 0x94F8: 0x6787, - 0x94F9: 0x6BD8, - 0x94FA: 0x7435, - 0x94FB: 0x7709, - 0x94FC: 0x7F8E, - 0x9540: 0x9F3B, - 0x9541: 0x67CA, - 0x9542: 0x7A17, - 0x9543: 0x5339, - 0x9544: 0x758B, - 0x9545: 0x9AED, - 0x9546: 0x5F66, - 0x9547: 0x819D, - 0x9548: 0x83F1, - 0x9549: 0x8098, - 0x954A: 0x5F3C, - 0x954B: 0x5FC5, - 0x954C: 0x7562, - 0x954D: 0x7B46, - 0x954E: 0x903C, - 0x954F: 0x6867, - 0x9550: 0x59EB, - 0x9551: 0x5A9B, - 0x9552: 0x7D10, - 0x9553: 0x767E, - 0x9554: 0x8B2C, - 0x9555: 0x4FF5, - 0x9556: 0x5F6A, - 0x9557: 0x6A19, - 0x9558: 0x6C37, - 0x9559: 0x6F02, - 0x955A: 0x74E2, - 0x955B: 0x7968, - 0x955C: 0x8868, - 0x955D: 0x8A55, - 0x955E: 0x8C79, - 0x955F: 0x5EDF, - 0x9560: 0x63CF, - 0x9561: 0x75C5, - 0x9562: 0x79D2, - 0x9563: 0x82D7, - 0x9564: 0x9328, - 0x9565: 0x92F2, - 0x9566: 0x849C, - 0x9567: 0x86ED, - 0x9568: 0x9C2D, - 0x9569: 0x54C1, - 0x956A: 0x5F6C, - 0x956B: 0x658C, - 0x956C: 0x6D5C, - 0x956D: 0x7015, - 0x956E: 0x8CA7, - 0x956F: 0x8CD3, - 0x9570: 0x983B, - 0x9571: 0x654F, - 0x9572: 0x74F6, - 0x9573: 0x4E0D, - 0x9574: 0x4ED8, - 0x9575: 0x57E0, - 0x9576: 0x592B, - 0x9577: 0x5A66, - 0x9578: 0x5BCC, - 0x9579: 0x51A8, - 0x957A: 0x5E03, - 0x957B: 0x5E9C, - 0x957C: 0x6016, - 0x957D: 0x6276, - 0x957E: 0x6577, - 0x9580: 0x65A7, - 0x9581: 0x666E, - 0x9582: 0x6D6E, - 0x9583: 0x7236, - 0x9584: 0x7B26, - 0x9585: 0x8150, - 0x9586: 0x819A, - 0x9587: 0x8299, - 0x9588: 0x8B5C, - 0x9589: 0x8CA0, - 0x958A: 0x8CE6, - 0x958B: 0x8D74, - 0x958C: 0x961C, - 0x958D: 0x9644, - 0x958E: 0x4FAE, - 0x958F: 0x64AB, - 0x9590: 0x6B66, - 0x9591: 0x821E, - 0x9592: 0x8461, - 0x9593: 0x856A, - 0x9594: 0x90E8, - 0x9595: 0x5C01, - 0x9596: 0x6953, - 0x9597: 0x98A8, - 0x9598: 0x847A, - 0x9599: 0x8557, - 0x959A: 0x4F0F, - 0x959B: 0x526F, - 0x959C: 0x5FA9, - 0x959D: 0x5E45, - 0x959E: 0x670D, - 0x959F: 0x798F, - 0x95A0: 0x8179, - 0x95A1: 0x8907, - 0x95A2: 0x8986, - 0x95A3: 0x6DF5, - 0x95A4: 0x5F17, - 0x95A5: 0x6255, - 0x95A6: 0x6CB8, - 0x95A7: 0x4ECF, - 0x95A8: 0x7269, - 0x95A9: 0x9B92, - 0x95AA: 0x5206, - 0x95AB: 0x543B, - 0x95AC: 0x5674, - 0x95AD: 0x58B3, - 0x95AE: 0x61A4, - 0x95AF: 0x626E, - 0x95B0: 0x711A, - 0x95B1: 0x596E, - 0x95B2: 0x7C89, - 0x95B3: 0x7CDE, - 0x95B4: 0x7D1B, - 0x95B5: 0x96F0, - 0x95B6: 0x6587, - 0x95B7: 0x805E, - 0x95B8: 0x4E19, - 0x95B9: 0x4F75, - 0x95BA: 0x5175, - 0x95BB: 0x5840, - 0x95BC: 0x5E63, - 0x95BD: 0x5E73, - 0x95BE: 0x5F0A, - 0x95BF: 0x67C4, - 0x95C0: 0x4E26, - 0x95C1: 0x853D, - 0x95C2: 0x9589, - 0x95C3: 0x965B, - 0x95C4: 0x7C73, - 0x95C5: 0x9801, - 0x95C6: 0x50FB, - 0x95C7: 0x58C1, - 0x95C8: 0x7656, - 0x95C9: 0x78A7, - 0x95CA: 0x5225, - 0x95CB: 0x77A5, - 0x95CC: 0x8511, - 0x95CD: 0x7B86, - 0x95CE: 0x504F, - 0x95CF: 0x5909, - 0x95D0: 0x7247, - 0x95D1: 0x7BC7, - 0x95D2: 0x7DE8, - 0x95D3: 0x8FBA, - 0x95D4: 0x8FD4, - 0x95D5: 0x904D, - 0x95D6: 0x4FBF, - 0x95D7: 0x52C9, - 0x95D8: 0x5A29, - 0x95D9: 0x5F01, - 0x95DA: 0x97AD, - 0x95DB: 0x4FDD, - 0x95DC: 0x8217, - 0x95DD: 0x92EA, - 0x95DE: 0x5703, - 0x95DF: 0x6355, - 0x95E0: 0x6B69, - 0x95E1: 0x752B, - 0x95E2: 0x88DC, - 0x95E3: 0x8F14, - 0x95E4: 0x7A42, - 0x95E5: 0x52DF, - 0x95E6: 0x5893, - 0x95E7: 0x6155, - 0x95E8: 0x620A, - 0x95E9: 0x66AE, - 0x95EA: 0x6BCD, - 0x95EB: 0x7C3F, - 0x95EC: 0x83E9, - 0x95ED: 0x5023, - 0x95EE: 0x4FF8, - 0x95EF: 0x5305, - 0x95F0: 0x5446, - 0x95F1: 0x5831, - 0x95F2: 0x5949, - 0x95F3: 0x5B9D, - 0x95F4: 0x5CF0, - 0x95F5: 0x5CEF, - 0x95F6: 0x5D29, - 0x95F7: 0x5E96, - 0x95F8: 0x62B1, - 0x95F9: 0x6367, - 0x95FA: 0x653E, - 0x95FB: 0x65B9, - 0x95FC: 0x670B, - 0x9640: 0x6CD5, - 0x9641: 0x6CE1, - 0x9642: 0x70F9, - 0x9643: 0x7832, - 0x9644: 0x7E2B, - 0x9645: 0x80DE, - 0x9646: 0x82B3, - 0x9647: 0x840C, - 0x9648: 0x84EC, - 0x9649: 0x8702, - 0x964A: 0x8912, - 0x964B: 0x8A2A, - 0x964C: 0x8C4A, - 0x964D: 0x90A6, - 0x964E: 0x92D2, - 0x964F: 0x98FD, - 0x9650: 0x9CF3, - 0x9651: 0x9D6C, - 0x9652: 0x4E4F, - 0x9653: 0x4EA1, - 0x9654: 0x508D, - 0x9655: 0x5256, - 0x9656: 0x574A, - 0x9657: 0x59A8, - 0x9658: 0x5E3D, - 0x9659: 0x5FD8, - 0x965A: 0x5FD9, - 0x965B: 0x623F, - 0x965C: 0x66B4, - 0x965D: 0x671B, - 0x965E: 0x67D0, - 0x965F: 0x68D2, - 0x9660: 0x5192, - 0x9661: 0x7D21, - 0x9662: 0x80AA, - 0x9663: 0x81A8, - 0x9664: 0x8B00, - 0x9665: 0x8C8C, - 0x9666: 0x8CBF, - 0x9667: 0x927E, - 0x9668: 0x9632, - 0x9669: 0x5420, - 0x966A: 0x982C, - 0x966B: 0x5317, - 0x966C: 0x50D5, - 0x966D: 0x535C, - 0x966E: 0x58A8, - 0x966F: 0x64B2, - 0x9670: 0x6734, - 0x9671: 0x7267, - 0x9672: 0x7766, - 0x9673: 0x7A46, - 0x9674: 0x91E6, - 0x9675: 0x52C3, - 0x9676: 0x6CA1, - 0x9677: 0x6B86, - 0x9678: 0x5800, - 0x9679: 0x5E4C, - 0x967A: 0x5954, - 0x967B: 0x672C, - 0x967C: 0x7FFB, - 0x967D: 0x51E1, - 0x967E: 0x76C6, - 0x9680: 0x6469, - 0x9681: 0x78E8, - 0x9682: 0x9B54, - 0x9683: 0x9EBB, - 0x9684: 0x57CB, - 0x9685: 0x59B9, - 0x9686: 0x6627, - 0x9687: 0x679A, - 0x9688: 0x6BCE, - 0x9689: 0x54E9, - 0x968A: 0x69D9, - 0x968B: 0x5E55, - 0x968C: 0x819C, - 0x968D: 0x6795, - 0x968E: 0x9BAA, - 0x968F: 0x67FE, - 0x9690: 0x9C52, - 0x9691: 0x685D, - 0x9692: 0x4EA6, - 0x9693: 0x4FE3, - 0x9694: 0x53C8, - 0x9695: 0x62B9, - 0x9696: 0x672B, - 0x9697: 0x6CAB, - 0x9698: 0x8FC4, - 0x9699: 0x4FAD, - 0x969A: 0x7E6D, - 0x969B: 0x9EBF, - 0x969C: 0x4E07, - 0x969D: 0x6162, - 0x969E: 0x6E80, - 0x969F: 0x6F2B, - 0x96A0: 0x8513, - 0x96A1: 0x5473, - 0x96A2: 0x672A, - 0x96A3: 0x9B45, - 0x96A4: 0x5DF3, - 0x96A5: 0x7B95, - 0x96A6: 0x5CAC, - 0x96A7: 0x5BC6, - 0x96A8: 0x871C, - 0x96A9: 0x6E4A, - 0x96AA: 0x84D1, - 0x96AB: 0x7A14, - 0x96AC: 0x8108, - 0x96AD: 0x5999, - 0x96AE: 0x7C8D, - 0x96AF: 0x6C11, - 0x96B0: 0x7720, - 0x96B1: 0x52D9, - 0x96B2: 0x5922, - 0x96B3: 0x7121, - 0x96B4: 0x725F, - 0x96B5: 0x77DB, - 0x96B6: 0x9727, - 0x96B7: 0x9D61, - 0x96B8: 0x690B, - 0x96B9: 0x5A7F, - 0x96BA: 0x5A18, - 0x96BB: 0x51A5, - 0x96BC: 0x540D, - 0x96BD: 0x547D, - 0x96BE: 0x660E, - 0x96BF: 0x76DF, - 0x96C0: 0x8FF7, - 0x96C1: 0x9298, - 0x96C2: 0x9CF4, - 0x96C3: 0x59EA, - 0x96C4: 0x725D, - 0x96C5: 0x6EC5, - 0x96C6: 0x514D, - 0x96C7: 0x68C9, - 0x96C8: 0x7DBF, - 0x96C9: 0x7DEC, - 0x96CA: 0x9762, - 0x96CB: 0x9EBA, - 0x96CC: 0x6478, - 0x96CD: 0x6A21, - 0x96CE: 0x8302, - 0x96CF: 0x5984, - 0x96D0: 0x5B5F, - 0x96D1: 0x6BDB, - 0x96D2: 0x731B, - 0x96D3: 0x76F2, - 0x96D4: 0x7DB2, - 0x96D5: 0x8017, - 0x96D6: 0x8499, - 0x96D7: 0x5132, - 0x96D8: 0x6728, - 0x96D9: 0x9ED9, - 0x96DA: 0x76EE, - 0x96DB: 0x6762, - 0x96DC: 0x52FF, - 0x96DD: 0x9905, - 0x96DE: 0x5C24, - 0x96DF: 0x623B, - 0x96E0: 0x7C7E, - 0x96E1: 0x8CB0, - 0x96E2: 0x554F, - 0x96E3: 0x60B6, - 0x96E4: 0x7D0B, - 0x96E5: 0x9580, - 0x96E6: 0x5301, - 0x96E7: 0x4E5F, - 0x96E8: 0x51B6, - 0x96E9: 0x591C, - 0x96EA: 0x723A, - 0x96EB: 0x8036, - 0x96EC: 0x91CE, - 0x96ED: 0x5F25, - 0x96EE: 0x77E2, - 0x96EF: 0x5384, - 0x96F0: 0x5F79, - 0x96F1: 0x7D04, - 0x96F2: 0x85AC, - 0x96F3: 0x8A33, - 0x96F4: 0x8E8D, - 0x96F5: 0x9756, - 0x96F6: 0x67F3, - 0x96F7: 0x85AE, - 0x96F8: 0x9453, - 0x96F9: 0x6109, - 0x96FA: 0x6108, - 0x96FB: 0x6CB9, - 0x96FC: 0x7652, - 0x9740: 0x8AED, - 0x9741: 0x8F38, - 0x9742: 0x552F, - 0x9743: 0x4F51, - 0x9744: 0x512A, - 0x9745: 0x52C7, - 0x9746: 0x53CB, - 0x9747: 0x5BA5, - 0x9748: 0x5E7D, - 0x9749: 0x60A0, - 0x974A: 0x6182, - 0x974B: 0x63D6, - 0x974C: 0x6709, - 0x974D: 0x67DA, - 0x974E: 0x6E67, - 0x974F: 0x6D8C, - 0x9750: 0x7336, - 0x9751: 0x7337, - 0x9752: 0x7531, - 0x9753: 0x7950, - 0x9754: 0x88D5, - 0x9755: 0x8A98, - 0x9756: 0x904A, - 0x9757: 0x9091, - 0x9758: 0x90F5, - 0x9759: 0x96C4, - 0x975A: 0x878D, - 0x975B: 0x5915, - 0x975C: 0x4E88, - 0x975D: 0x4F59, - 0x975E: 0x4E0E, - 0x975F: 0x8A89, - 0x9760: 0x8F3F, - 0x9761: 0x9810, - 0x9762: 0x50AD, - 0x9763: 0x5E7C, - 0x9764: 0x5996, - 0x9765: 0x5BB9, - 0x9766: 0x5EB8, - 0x9767: 0x63DA, - 0x9768: 0x63FA, - 0x9769: 0x64C1, - 0x976A: 0x66DC, - 0x976B: 0x694A, - 0x976C: 0x69D8, - 0x976D: 0x6D0B, - 0x976E: 0x6EB6, - 0x976F: 0x7194, - 0x9770: 0x7528, - 0x9771: 0x7AAF, - 0x9772: 0x7F8A, - 0x9773: 0x8000, - 0x9774: 0x8449, - 0x9775: 0x84C9, - 0x9776: 0x8981, - 0x9777: 0x8B21, - 0x9778: 0x8E0A, - 0x9779: 0x9065, - 0x977A: 0x967D, - 0x977B: 0x990A, - 0x977C: 0x617E, - 0x977D: 0x6291, - 0x977E: 0x6B32, - 0x9780: 0x6C83, - 0x9781: 0x6D74, - 0x9782: 0x7FCC, - 0x9783: 0x7FFC, - 0x9784: 0x6DC0, - 0x9785: 0x7F85, - 0x9786: 0x87BA, - 0x9787: 0x88F8, - 0x9788: 0x6765, - 0x9789: 0x83B1, - 0x978A: 0x983C, - 0x978B: 0x96F7, - 0x978C: 0x6D1B, - 0x978D: 0x7D61, - 0x978E: 0x843D, - 0x978F: 0x916A, - 0x9790: 0x4E71, - 0x9791: 0x5375, - 0x9792: 0x5D50, - 0x9793: 0x6B04, - 0x9794: 0x6FEB, - 0x9795: 0x85CD, - 0x9796: 0x862D, - 0x9797: 0x89A7, - 0x9798: 0x5229, - 0x9799: 0x540F, - 0x979A: 0x5C65, - 0x979B: 0x674E, - 0x979C: 0x68A8, - 0x979D: 0x7406, - 0x979E: 0x7483, - 0x979F: 0x75E2, - 0x97A0: 0x88CF, - 0x97A1: 0x88E1, - 0x97A2: 0x91CC, - 0x97A3: 0x96E2, - 0x97A4: 0x9678, - 0x97A5: 0x5F8B, - 0x97A6: 0x7387, - 0x97A7: 0x7ACB, - 0x97A8: 0x844E, - 0x97A9: 0x63A0, - 0x97AA: 0x7565, - 0x97AB: 0x5289, - 0x97AC: 0x6D41, - 0x97AD: 0x6E9C, - 0x97AE: 0x7409, - 0x97AF: 0x7559, - 0x97B0: 0x786B, - 0x97B1: 0x7C92, - 0x97B2: 0x9686, - 0x97B3: 0x7ADC, - 0x97B4: 0x9F8D, - 0x97B5: 0x4FB6, - 0x97B6: 0x616E, - 0x97B7: 0x65C5, - 0x97B8: 0x865C, - 0x97B9: 0x4E86, - 0x97BA: 0x4EAE, - 0x97BB: 0x50DA, - 0x97BC: 0x4E21, - 0x97BD: 0x51CC, - 0x97BE: 0x5BEE, - 0x97BF: 0x6599, - 0x97C0: 0x6881, - 0x97C1: 0x6DBC, - 0x97C2: 0x731F, - 0x97C3: 0x7642, - 0x97C4: 0x77AD, - 0x97C5: 0x7A1C, - 0x97C6: 0x7CE7, - 0x97C7: 0x826F, - 0x97C8: 0x8AD2, - 0x97C9: 0x907C, - 0x97CA: 0x91CF, - 0x97CB: 0x9675, - 0x97CC: 0x9818, - 0x97CD: 0x529B, - 0x97CE: 0x7DD1, - 0x97CF: 0x502B, - 0x97D0: 0x5398, - 0x97D1: 0x6797, - 0x97D2: 0x6DCB, - 0x97D3: 0x71D0, - 0x97D4: 0x7433, - 0x97D5: 0x81E8, - 0x97D6: 0x8F2A, - 0x97D7: 0x96A3, - 0x97D8: 0x9C57, - 0x97D9: 0x9E9F, - 0x97DA: 0x7460, - 0x97DB: 0x5841, - 0x97DC: 0x6D99, - 0x97DD: 0x7D2F, - 0x97DE: 0x985E, - 0x97DF: 0x4EE4, - 0x97E0: 0x4F36, - 0x97E1: 0x4F8B, - 0x97E2: 0x51B7, - 0x97E3: 0x52B1, - 0x97E4: 0x5DBA, - 0x97E5: 0x601C, - 0x97E6: 0x73B2, - 0x97E7: 0x793C, - 0x97E8: 0x82D3, - 0x97E9: 0x9234, - 0x97EA: 0x96B7, - 0x97EB: 0x96F6, - 0x97EC: 0x970A, - 0x97ED: 0x9E97, - 0x97EE: 0x9F62, - 0x97EF: 0x66A6, - 0x97F0: 0x6B74, - 0x97F1: 0x5217, - 0x97F2: 0x52A3, - 0x97F3: 0x70C8, - 0x97F4: 0x88C2, - 0x97F5: 0x5EC9, - 0x97F6: 0x604B, - 0x97F7: 0x6190, - 0x97F8: 0x6F23, - 0x97F9: 0x7149, - 0x97FA: 0x7C3E, - 0x97FB: 0x7DF4, - 0x97FC: 0x806F, - 0x9840: 0x84EE, - 0x9841: 0x9023, - 0x9842: 0x932C, - 0x9843: 0x5442, - 0x9844: 0x9B6F, - 0x9845: 0x6AD3, - 0x9846: 0x7089, - 0x9847: 0x8CC2, - 0x9848: 0x8DEF, - 0x9849: 0x9732, - 0x984A: 0x52B4, - 0x984B: 0x5A41, - 0x984C: 0x5ECA, - 0x984D: 0x5F04, - 0x984E: 0x6717, - 0x984F: 0x697C, - 0x9850: 0x6994, - 0x9851: 0x6D6A, - 0x9852: 0x6F0F, - 0x9853: 0x7262, - 0x9854: 0x72FC, - 0x9855: 0x7BED, - 0x9856: 0x8001, - 0x9857: 0x807E, - 0x9858: 0x874B, - 0x9859: 0x90CE, - 0x985A: 0x516D, - 0x985B: 0x9E93, - 0x985C: 0x7984, - 0x985D: 0x808B, - 0x985E: 0x9332, - 0x985F: 0x8AD6, - 0x9860: 0x502D, - 0x9861: 0x548C, - 0x9862: 0x8A71, - 0x9863: 0x6B6A, - 0x9864: 0x8CC4, - 0x9865: 0x8107, - 0x9866: 0x60D1, - 0x9867: 0x67A0, - 0x9868: 0x9DF2, - 0x9869: 0x4E99, - 0x986A: 0x4E98, - 0x986B: 0x9C10, - 0x986C: 0x8A6B, - 0x986D: 0x85C1, - 0x986E: 0x8568, - 0x986F: 0x6900, - 0x9870: 0x6E7E, - 0x9871: 0x7897, - 0x9872: 0x8155, - 0x989F: 0x5F0C, - 0x98A0: 0x4E10, - 0x98A1: 0x4E15, - 0x98A2: 0x4E2A, - 0x98A3: 0x4E31, - 0x98A4: 0x4E36, - 0x98A5: 0x4E3C, - 0x98A6: 0x4E3F, - 0x98A7: 0x4E42, - 0x98A8: 0x4E56, - 0x98A9: 0x4E58, - 0x98AA: 0x4E82, - 0x98AB: 0x4E85, - 0x98AC: 0x8C6B, - 0x98AD: 0x4E8A, - 0x98AE: 0x8212, - 0x98AF: 0x5F0D, - 0x98B0: 0x4E8E, - 0x98B1: 0x4E9E, - 0x98B2: 0x4E9F, - 0x98B3: 0x4EA0, - 0x98B4: 0x4EA2, - 0x98B5: 0x4EB0, - 0x98B6: 0x4EB3, - 0x98B7: 0x4EB6, - 0x98B8: 0x4ECE, - 0x98B9: 0x4ECD, - 0x98BA: 0x4EC4, - 0x98BB: 0x4EC6, - 0x98BC: 0x4EC2, - 0x98BD: 0x4ED7, - 0x98BE: 0x4EDE, - 0x98BF: 0x4EED, - 0x98C0: 0x4EDF, - 0x98C1: 0x4EF7, - 0x98C2: 0x4F09, - 0x98C3: 0x4F5A, - 0x98C4: 0x4F30, - 0x98C5: 0x4F5B, - 0x98C6: 0x4F5D, - 0x98C7: 0x4F57, - 0x98C8: 0x4F47, - 0x98C9: 0x4F76, - 0x98CA: 0x4F88, - 0x98CB: 0x4F8F, - 0x98CC: 0x4F98, - 0x98CD: 0x4F7B, - 0x98CE: 0x4F69, - 0x98CF: 0x4F70, - 0x98D0: 0x4F91, - 0x98D1: 0x4F6F, - 0x98D2: 0x4F86, - 0x98D3: 0x4F96, - 0x98D4: 0x5118, - 0x98D5: 0x4FD4, - 0x98D6: 0x4FDF, - 0x98D7: 0x4FCE, - 0x98D8: 0x4FD8, - 0x98D9: 0x4FDB, - 0x98DA: 0x4FD1, - 0x98DB: 0x4FDA, - 0x98DC: 0x4FD0, - 0x98DD: 0x4FE4, - 0x98DE: 0x4FE5, - 0x98DF: 0x501A, - 0x98E0: 0x5028, - 0x98E1: 0x5014, - 0x98E2: 0x502A, - 0x98E3: 0x5025, - 0x98E4: 0x5005, - 0x98E5: 0x4F1C, - 0x98E6: 0x4FF6, - 0x98E7: 0x5021, - 0x98E8: 0x5029, - 0x98E9: 0x502C, - 0x98EA: 0x4FFE, - 0x98EB: 0x4FEF, - 0x98EC: 0x5011, - 0x98ED: 0x5006, - 0x98EE: 0x5043, - 0x98EF: 0x5047, - 0x98F0: 0x6703, - 0x98F1: 0x5055, - 0x98F2: 0x5050, - 0x98F3: 0x5048, - 0x98F4: 0x505A, - 0x98F5: 0x5056, - 0x98F6: 0x506C, - 0x98F7: 0x5078, - 0x98F8: 0x5080, - 0x98F9: 0x509A, - 0x98FA: 0x5085, - 0x98FB: 0x50B4, - 0x98FC: 0x50B2, - 0x9940: 0x50C9, - 0x9941: 0x50CA, - 0x9942: 0x50B3, - 0x9943: 0x50C2, - 0x9944: 0x50D6, - 0x9945: 0x50DE, - 0x9946: 0x50E5, - 0x9947: 0x50ED, - 0x9948: 0x50E3, - 0x9949: 0x50EE, - 0x994A: 0x50F9, - 0x994B: 0x50F5, - 0x994C: 0x5109, - 0x994D: 0x5101, - 0x994E: 0x5102, - 0x994F: 0x5116, - 0x9950: 0x5115, - 0x9951: 0x5114, - 0x9952: 0x511A, - 0x9953: 0x5121, - 0x9954: 0x513A, - 0x9955: 0x5137, - 0x9956: 0x513C, - 0x9957: 0x513B, - 0x9958: 0x513F, - 0x9959: 0x5140, - 0x995A: 0x5152, - 0x995B: 0x514C, - 0x995C: 0x5154, - 0x995D: 0x5162, - 0x995E: 0x7AF8, - 0x995F: 0x5169, - 0x9960: 0x516A, - 0x9961: 0x516E, - 0x9962: 0x5180, - 0x9963: 0x5182, - 0x9964: 0x56D8, - 0x9965: 0x518C, - 0x9966: 0x5189, - 0x9967: 0x518F, - 0x9968: 0x5191, - 0x9969: 0x5193, - 0x996A: 0x5195, - 0x996B: 0x5196, - 0x996C: 0x51A4, - 0x996D: 0x51A6, - 0x996E: 0x51A2, - 0x996F: 0x51A9, - 0x9970: 0x51AA, - 0x9971: 0x51AB, - 0x9972: 0x51B3, - 0x9973: 0x51B1, - 0x9974: 0x51B2, - 0x9975: 0x51B0, - 0x9976: 0x51B5, - 0x9977: 0x51BD, - 0x9978: 0x51C5, - 0x9979: 0x51C9, - 0x997A: 0x51DB, - 0x997B: 0x51E0, - 0x997C: 0x8655, - 0x997D: 0x51E9, - 0x997E: 0x51ED, - 0x9980: 0x51F0, - 0x9981: 0x51F5, - 0x9982: 0x51FE, - 0x9983: 0x5204, - 0x9984: 0x520B, - 0x9985: 0x5214, - 0x9986: 0x520E, - 0x9987: 0x5227, - 0x9988: 0x522A, - 0x9989: 0x522E, - 0x998A: 0x5233, - 0x998B: 0x5239, - 0x998C: 0x524F, - 0x998D: 0x5244, - 0x998E: 0x524B, - 0x998F: 0x524C, - 0x9990: 0x525E, - 0x9991: 0x5254, - 0x9992: 0x526A, - 0x9993: 0x5274, - 0x9994: 0x5269, - 0x9995: 0x5273, - 0x9996: 0x527F, - 0x9997: 0x527D, - 0x9998: 0x528D, - 0x9999: 0x5294, - 0x999A: 0x5292, - 0x999B: 0x5271, - 0x999C: 0x5288, - 0x999D: 0x5291, - 0x999E: 0x8FA8, - 0x999F: 0x8FA7, - 0x99A0: 0x52AC, - 0x99A1: 0x52AD, - 0x99A2: 0x52BC, - 0x99A3: 0x52B5, - 0x99A4: 0x52C1, - 0x99A5: 0x52CD, - 0x99A6: 0x52D7, - 0x99A7: 0x52DE, - 0x99A8: 0x52E3, - 0x99A9: 0x52E6, - 0x99AA: 0x98ED, - 0x99AB: 0x52E0, - 0x99AC: 0x52F3, - 0x99AD: 0x52F5, - 0x99AE: 0x52F8, - 0x99AF: 0x52F9, - 0x99B0: 0x5306, - 0x99B1: 0x5308, - 0x99B2: 0x7538, - 0x99B3: 0x530D, - 0x99B4: 0x5310, - 0x99B5: 0x530F, - 0x99B6: 0x5315, - 0x99B7: 0x531A, - 0x99B8: 0x5323, - 0x99B9: 0x532F, - 0x99BA: 0x5331, - 0x99BB: 0x5333, - 0x99BC: 0x5338, - 0x99BD: 0x5340, - 0x99BE: 0x5346, - 0x99BF: 0x5345, - 0x99C0: 0x4E17, - 0x99C1: 0x5349, - 0x99C2: 0x534D, - 0x99C3: 0x51D6, - 0x99C4: 0x535E, - 0x99C5: 0x5369, - 0x99C6: 0x536E, - 0x99C7: 0x5918, - 0x99C8: 0x537B, - 0x99C9: 0x5377, - 0x99CA: 0x5382, - 0x99CB: 0x5396, - 0x99CC: 0x53A0, - 0x99CD: 0x53A6, - 0x99CE: 0x53A5, - 0x99CF: 0x53AE, - 0x99D0: 0x53B0, - 0x99D1: 0x53B6, - 0x99D2: 0x53C3, - 0x99D3: 0x7C12, - 0x99D4: 0x96D9, - 0x99D5: 0x53DF, - 0x99D6: 0x66FC, - 0x99D7: 0x71EE, - 0x99D8: 0x53EE, - 0x99D9: 0x53E8, - 0x99DA: 0x53ED, - 0x99DB: 0x53FA, - 0x99DC: 0x5401, - 0x99DD: 0x543D, - 0x99DE: 0x5440, - 0x99DF: 0x542C, - 0x99E0: 0x542D, - 0x99E1: 0x543C, - 0x99E2: 0x542E, - 0x99E3: 0x5436, - 0x99E4: 0x5429, - 0x99E5: 0x541D, - 0x99E6: 0x544E, - 0x99E7: 0x548F, - 0x99E8: 0x5475, - 0x99E9: 0x548E, - 0x99EA: 0x545F, - 0x99EB: 0x5471, - 0x99EC: 0x5477, - 0x99ED: 0x5470, - 0x99EE: 0x5492, - 0x99EF: 0x547B, - 0x99F0: 0x5480, - 0x99F1: 0x5476, - 0x99F2: 0x5484, - 0x99F3: 0x5490, - 0x99F4: 0x5486, - 0x99F5: 0x54C7, - 0x99F6: 0x54A2, - 0x99F7: 0x54B8, - 0x99F8: 0x54A5, - 0x99F9: 0x54AC, - 0x99FA: 0x54C4, - 0x99FB: 0x54C8, - 0x99FC: 0x54A8, - 0x9A40: 0x54AB, - 0x9A41: 0x54C2, - 0x9A42: 0x54A4, - 0x9A43: 0x54BE, - 0x9A44: 0x54BC, - 0x9A45: 0x54D8, - 0x9A46: 0x54E5, - 0x9A47: 0x54E6, - 0x9A48: 0x550F, - 0x9A49: 0x5514, - 0x9A4A: 0x54FD, - 0x9A4B: 0x54EE, - 0x9A4C: 0x54ED, - 0x9A4D: 0x54FA, - 0x9A4E: 0x54E2, - 0x9A4F: 0x5539, - 0x9A50: 0x5540, - 0x9A51: 0x5563, - 0x9A52: 0x554C, - 0x9A53: 0x552E, - 0x9A54: 0x555C, - 0x9A55: 0x5545, - 0x9A56: 0x5556, - 0x9A57: 0x5557, - 0x9A58: 0x5538, - 0x9A59: 0x5533, - 0x9A5A: 0x555D, - 0x9A5B: 0x5599, - 0x9A5C: 0x5580, - 0x9A5D: 0x54AF, - 0x9A5E: 0x558A, - 0x9A5F: 0x559F, - 0x9A60: 0x557B, - 0x9A61: 0x557E, - 0x9A62: 0x5598, - 0x9A63: 0x559E, - 0x9A64: 0x55AE, - 0x9A65: 0x557C, - 0x9A66: 0x5583, - 0x9A67: 0x55A9, - 0x9A68: 0x5587, - 0x9A69: 0x55A8, - 0x9A6A: 0x55DA, - 0x9A6B: 0x55C5, - 0x9A6C: 0x55DF, - 0x9A6D: 0x55C4, - 0x9A6E: 0x55DC, - 0x9A6F: 0x55E4, - 0x9A70: 0x55D4, - 0x9A71: 0x5614, - 0x9A72: 0x55F7, - 0x9A73: 0x5616, - 0x9A74: 0x55FE, - 0x9A75: 0x55FD, - 0x9A76: 0x561B, - 0x9A77: 0x55F9, - 0x9A78: 0x564E, - 0x9A79: 0x5650, - 0x9A7A: 0x71DF, - 0x9A7B: 0x5634, - 0x9A7C: 0x5636, - 0x9A7D: 0x5632, - 0x9A7E: 0x5638, - 0x9A80: 0x566B, - 0x9A81: 0x5664, - 0x9A82: 0x562F, - 0x9A83: 0x566C, - 0x9A84: 0x566A, - 0x9A85: 0x5686, - 0x9A86: 0x5680, - 0x9A87: 0x568A, - 0x9A88: 0x56A0, - 0x9A89: 0x5694, - 0x9A8A: 0x568F, - 0x9A8B: 0x56A5, - 0x9A8C: 0x56AE, - 0x9A8D: 0x56B6, - 0x9A8E: 0x56B4, - 0x9A8F: 0x56C2, - 0x9A90: 0x56BC, - 0x9A91: 0x56C1, - 0x9A92: 0x56C3, - 0x9A93: 0x56C0, - 0x9A94: 0x56C8, - 0x9A95: 0x56CE, - 0x9A96: 0x56D1, - 0x9A97: 0x56D3, - 0x9A98: 0x56D7, - 0x9A99: 0x56EE, - 0x9A9A: 0x56F9, - 0x9A9B: 0x5700, - 0x9A9C: 0x56FF, - 0x9A9D: 0x5704, - 0x9A9E: 0x5709, - 0x9A9F: 0x5708, - 0x9AA0: 0x570B, - 0x9AA1: 0x570D, - 0x9AA2: 0x5713, - 0x9AA3: 0x5718, - 0x9AA4: 0x5716, - 0x9AA5: 0x55C7, - 0x9AA6: 0x571C, - 0x9AA7: 0x5726, - 0x9AA8: 0x5737, - 0x9AA9: 0x5738, - 0x9AAA: 0x574E, - 0x9AAB: 0x573B, - 0x9AAC: 0x5740, - 0x9AAD: 0x574F, - 0x9AAE: 0x5769, - 0x9AAF: 0x57C0, - 0x9AB0: 0x5788, - 0x9AB1: 0x5761, - 0x9AB2: 0x577F, - 0x9AB3: 0x5789, - 0x9AB4: 0x5793, - 0x9AB5: 0x57A0, - 0x9AB6: 0x57B3, - 0x9AB7: 0x57A4, - 0x9AB8: 0x57AA, - 0x9AB9: 0x57B0, - 0x9ABA: 0x57C3, - 0x9ABB: 0x57C6, - 0x9ABC: 0x57D4, - 0x9ABD: 0x57D2, - 0x9ABE: 0x57D3, - 0x9ABF: 0x580A, - 0x9AC0: 0x57D6, - 0x9AC1: 0x57E3, - 0x9AC2: 0x580B, - 0x9AC3: 0x5819, - 0x9AC4: 0x581D, - 0x9AC5: 0x5872, - 0x9AC6: 0x5821, - 0x9AC7: 0x5862, - 0x9AC8: 0x584B, - 0x9AC9: 0x5870, - 0x9ACA: 0x6BC0, - 0x9ACB: 0x5852, - 0x9ACC: 0x583D, - 0x9ACD: 0x5879, - 0x9ACE: 0x5885, - 0x9ACF: 0x58B9, - 0x9AD0: 0x589F, - 0x9AD1: 0x58AB, - 0x9AD2: 0x58BA, - 0x9AD3: 0x58DE, - 0x9AD4: 0x58BB, - 0x9AD5: 0x58B8, - 0x9AD6: 0x58AE, - 0x9AD7: 0x58C5, - 0x9AD8: 0x58D3, - 0x9AD9: 0x58D1, - 0x9ADA: 0x58D7, - 0x9ADB: 0x58D9, - 0x9ADC: 0x58D8, - 0x9ADD: 0x58E5, - 0x9ADE: 0x58DC, - 0x9ADF: 0x58E4, - 0x9AE0: 0x58DF, - 0x9AE1: 0x58EF, - 0x9AE2: 0x58FA, - 0x9AE3: 0x58F9, - 0x9AE4: 0x58FB, - 0x9AE5: 0x58FC, - 0x9AE6: 0x58FD, - 0x9AE7: 0x5902, - 0x9AE8: 0x590A, - 0x9AE9: 0x5910, - 0x9AEA: 0x591B, - 0x9AEB: 0x68A6, - 0x9AEC: 0x5925, - 0x9AED: 0x592C, - 0x9AEE: 0x592D, - 0x9AEF: 0x5932, - 0x9AF0: 0x5938, - 0x9AF1: 0x593E, - 0x9AF2: 0x7AD2, - 0x9AF3: 0x5955, - 0x9AF4: 0x5950, - 0x9AF5: 0x594E, - 0x9AF6: 0x595A, - 0x9AF7: 0x5958, - 0x9AF8: 0x5962, - 0x9AF9: 0x5960, - 0x9AFA: 0x5967, - 0x9AFB: 0x596C, - 0x9AFC: 0x5969, - 0x9B40: 0x5978, - 0x9B41: 0x5981, - 0x9B42: 0x599D, - 0x9B43: 0x4F5E, - 0x9B44: 0x4FAB, - 0x9B45: 0x59A3, - 0x9B46: 0x59B2, - 0x9B47: 0x59C6, - 0x9B48: 0x59E8, - 0x9B49: 0x59DC, - 0x9B4A: 0x598D, - 0x9B4B: 0x59D9, - 0x9B4C: 0x59DA, - 0x9B4D: 0x5A25, - 0x9B4E: 0x5A1F, - 0x9B4F: 0x5A11, - 0x9B50: 0x5A1C, - 0x9B51: 0x5A09, - 0x9B52: 0x5A1A, - 0x9B53: 0x5A40, - 0x9B54: 0x5A6C, - 0x9B55: 0x5A49, - 0x9B56: 0x5A35, - 0x9B57: 0x5A36, - 0x9B58: 0x5A62, - 0x9B59: 0x5A6A, - 0x9B5A: 0x5A9A, - 0x9B5B: 0x5ABC, - 0x9B5C: 0x5ABE, - 0x9B5D: 0x5ACB, - 0x9B5E: 0x5AC2, - 0x9B5F: 0x5ABD, - 0x9B60: 0x5AE3, - 0x9B61: 0x5AD7, - 0x9B62: 0x5AE6, - 0x9B63: 0x5AE9, - 0x9B64: 0x5AD6, - 0x9B65: 0x5AFA, - 0x9B66: 0x5AFB, - 0x9B67: 0x5B0C, - 0x9B68: 0x5B0B, - 0x9B69: 0x5B16, - 0x9B6A: 0x5B32, - 0x9B6B: 0x5AD0, - 0x9B6C: 0x5B2A, - 0x9B6D: 0x5B36, - 0x9B6E: 0x5B3E, - 0x9B6F: 0x5B43, - 0x9B70: 0x5B45, - 0x9B71: 0x5B40, - 0x9B72: 0x5B51, - 0x9B73: 0x5B55, - 0x9B74: 0x5B5A, - 0x9B75: 0x5B5B, - 0x9B76: 0x5B65, - 0x9B77: 0x5B69, - 0x9B78: 0x5B70, - 0x9B79: 0x5B73, - 0x9B7A: 0x5B75, - 0x9B7B: 0x5B78, - 0x9B7C: 0x6588, - 0x9B7D: 0x5B7A, - 0x9B7E: 0x5B80, - 0x9B80: 0x5B83, - 0x9B81: 0x5BA6, - 0x9B82: 0x5BB8, - 0x9B83: 0x5BC3, - 0x9B84: 0x5BC7, - 0x9B85: 0x5BC9, - 0x9B86: 0x5BD4, - 0x9B87: 0x5BD0, - 0x9B88: 0x5BE4, - 0x9B89: 0x5BE6, - 0x9B8A: 0x5BE2, - 0x9B8B: 0x5BDE, - 0x9B8C: 0x5BE5, - 0x9B8D: 0x5BEB, - 0x9B8E: 0x5BF0, - 0x9B8F: 0x5BF6, - 0x9B90: 0x5BF3, - 0x9B91: 0x5C05, - 0x9B92: 0x5C07, - 0x9B93: 0x5C08, - 0x9B94: 0x5C0D, - 0x9B95: 0x5C13, - 0x9B96: 0x5C20, - 0x9B97: 0x5C22, - 0x9B98: 0x5C28, - 0x9B99: 0x5C38, - 0x9B9A: 0x5C39, - 0x9B9B: 0x5C41, - 0x9B9C: 0x5C46, - 0x9B9D: 0x5C4E, - 0x9B9E: 0x5C53, - 0x9B9F: 0x5C50, - 0x9BA0: 0x5C4F, - 0x9BA1: 0x5B71, - 0x9BA2: 0x5C6C, - 0x9BA3: 0x5C6E, - 0x9BA4: 0x4E62, - 0x9BA5: 0x5C76, - 0x9BA6: 0x5C79, - 0x9BA7: 0x5C8C, - 0x9BA8: 0x5C91, - 0x9BA9: 0x5C94, - 0x9BAA: 0x599B, - 0x9BAB: 0x5CAB, - 0x9BAC: 0x5CBB, - 0x9BAD: 0x5CB6, - 0x9BAE: 0x5CBC, - 0x9BAF: 0x5CB7, - 0x9BB0: 0x5CC5, - 0x9BB1: 0x5CBE, - 0x9BB2: 0x5CC7, - 0x9BB3: 0x5CD9, - 0x9BB4: 0x5CE9, - 0x9BB5: 0x5CFD, - 0x9BB6: 0x5CFA, - 0x9BB7: 0x5CED, - 0x9BB8: 0x5D8C, - 0x9BB9: 0x5CEA, - 0x9BBA: 0x5D0B, - 0x9BBB: 0x5D15, - 0x9BBC: 0x5D17, - 0x9BBD: 0x5D5C, - 0x9BBE: 0x5D1F, - 0x9BBF: 0x5D1B, - 0x9BC0: 0x5D11, - 0x9BC1: 0x5D14, - 0x9BC2: 0x5D22, - 0x9BC3: 0x5D1A, - 0x9BC4: 0x5D19, - 0x9BC5: 0x5D18, - 0x9BC6: 0x5D4C, - 0x9BC7: 0x5D52, - 0x9BC8: 0x5D4E, - 0x9BC9: 0x5D4B, - 0x9BCA: 0x5D6C, - 0x9BCB: 0x5D73, - 0x9BCC: 0x5D76, - 0x9BCD: 0x5D87, - 0x9BCE: 0x5D84, - 0x9BCF: 0x5D82, - 0x9BD0: 0x5DA2, - 0x9BD1: 0x5D9D, - 0x9BD2: 0x5DAC, - 0x9BD3: 0x5DAE, - 0x9BD4: 0x5DBD, - 0x9BD5: 0x5D90, - 0x9BD6: 0x5DB7, - 0x9BD7: 0x5DBC, - 0x9BD8: 0x5DC9, - 0x9BD9: 0x5DCD, - 0x9BDA: 0x5DD3, - 0x9BDB: 0x5DD2, - 0x9BDC: 0x5DD6, - 0x9BDD: 0x5DDB, - 0x9BDE: 0x5DEB, - 0x9BDF: 0x5DF2, - 0x9BE0: 0x5DF5, - 0x9BE1: 0x5E0B, - 0x9BE2: 0x5E1A, - 0x9BE3: 0x5E19, - 0x9BE4: 0x5E11, - 0x9BE5: 0x5E1B, - 0x9BE6: 0x5E36, - 0x9BE7: 0x5E37, - 0x9BE8: 0x5E44, - 0x9BE9: 0x5E43, - 0x9BEA: 0x5E40, - 0x9BEB: 0x5E4E, - 0x9BEC: 0x5E57, - 0x9BED: 0x5E54, - 0x9BEE: 0x5E5F, - 0x9BEF: 0x5E62, - 0x9BF0: 0x5E64, - 0x9BF1: 0x5E47, - 0x9BF2: 0x5E75, - 0x9BF3: 0x5E76, - 0x9BF4: 0x5E7A, - 0x9BF5: 0x9EBC, - 0x9BF6: 0x5E7F, - 0x9BF7: 0x5EA0, - 0x9BF8: 0x5EC1, - 0x9BF9: 0x5EC2, - 0x9BFA: 0x5EC8, - 0x9BFB: 0x5ED0, - 0x9BFC: 0x5ECF, - 0x9C40: 0x5ED6, - 0x9C41: 0x5EE3, - 0x9C42: 0x5EDD, - 0x9C43: 0x5EDA, - 0x9C44: 0x5EDB, - 0x9C45: 0x5EE2, - 0x9C46: 0x5EE1, - 0x9C47: 0x5EE8, - 0x9C48: 0x5EE9, - 0x9C49: 0x5EEC, - 0x9C4A: 0x5EF1, - 0x9C4B: 0x5EF3, - 0x9C4C: 0x5EF0, - 0x9C4D: 0x5EF4, - 0x9C4E: 0x5EF8, - 0x9C4F: 0x5EFE, - 0x9C50: 0x5F03, - 0x9C51: 0x5F09, - 0x9C52: 0x5F5D, - 0x9C53: 0x5F5C, - 0x9C54: 0x5F0B, - 0x9C55: 0x5F11, - 0x9C56: 0x5F16, - 0x9C57: 0x5F29, - 0x9C58: 0x5F2D, - 0x9C59: 0x5F38, - 0x9C5A: 0x5F41, - 0x9C5B: 0x5F48, - 0x9C5C: 0x5F4C, - 0x9C5D: 0x5F4E, - 0x9C5E: 0x5F2F, - 0x9C5F: 0x5F51, - 0x9C60: 0x5F56, - 0x9C61: 0x5F57, - 0x9C62: 0x5F59, - 0x9C63: 0x5F61, - 0x9C64: 0x5F6D, - 0x9C65: 0x5F73, - 0x9C66: 0x5F77, - 0x9C67: 0x5F83, - 0x9C68: 0x5F82, - 0x9C69: 0x5F7F, - 0x9C6A: 0x5F8A, - 0x9C6B: 0x5F88, - 0x9C6C: 0x5F91, - 0x9C6D: 0x5F87, - 0x9C6E: 0x5F9E, - 0x9C6F: 0x5F99, - 0x9C70: 0x5F98, - 0x9C71: 0x5FA0, - 0x9C72: 0x5FA8, - 0x9C73: 0x5FAD, - 0x9C74: 0x5FBC, - 0x9C75: 0x5FD6, - 0x9C76: 0x5FFB, - 0x9C77: 0x5FE4, - 0x9C78: 0x5FF8, - 0x9C79: 0x5FF1, - 0x9C7A: 0x5FDD, - 0x9C7B: 0x60B3, - 0x9C7C: 0x5FFF, - 0x9C7D: 0x6021, - 0x9C7E: 0x6060, - 0x9C80: 0x6019, - 0x9C81: 0x6010, - 0x9C82: 0x6029, - 0x9C83: 0x600E, - 0x9C84: 0x6031, - 0x9C85: 0x601B, - 0x9C86: 0x6015, - 0x9C87: 0x602B, - 0x9C88: 0x6026, - 0x9C89: 0x600F, - 0x9C8A: 0x603A, - 0x9C8B: 0x605A, - 0x9C8C: 0x6041, - 0x9C8D: 0x606A, - 0x9C8E: 0x6077, - 0x9C8F: 0x605F, - 0x9C90: 0x604A, - 0x9C91: 0x6046, - 0x9C92: 0x604D, - 0x9C93: 0x6063, - 0x9C94: 0x6043, - 0x9C95: 0x6064, - 0x9C96: 0x6042, - 0x9C97: 0x606C, - 0x9C98: 0x606B, - 0x9C99: 0x6059, - 0x9C9A: 0x6081, - 0x9C9B: 0x608D, - 0x9C9C: 0x60E7, - 0x9C9D: 0x6083, - 0x9C9E: 0x609A, - 0x9C9F: 0x6084, - 0x9CA0: 0x609B, - 0x9CA1: 0x6096, - 0x9CA2: 0x6097, - 0x9CA3: 0x6092, - 0x9CA4: 0x60A7, - 0x9CA5: 0x608B, - 0x9CA6: 0x60E1, - 0x9CA7: 0x60B8, - 0x9CA8: 0x60E0, - 0x9CA9: 0x60D3, - 0x9CAA: 0x60B4, - 0x9CAB: 0x5FF0, - 0x9CAC: 0x60BD, - 0x9CAD: 0x60C6, - 0x9CAE: 0x60B5, - 0x9CAF: 0x60D8, - 0x9CB0: 0x614D, - 0x9CB1: 0x6115, - 0x9CB2: 0x6106, - 0x9CB3: 0x60F6, - 0x9CB4: 0x60F7, - 0x9CB5: 0x6100, - 0x9CB6: 0x60F4, - 0x9CB7: 0x60FA, - 0x9CB8: 0x6103, - 0x9CB9: 0x6121, - 0x9CBA: 0x60FB, - 0x9CBB: 0x60F1, - 0x9CBC: 0x610D, - 0x9CBD: 0x610E, - 0x9CBE: 0x6147, - 0x9CBF: 0x613E, - 0x9CC0: 0x6128, - 0x9CC1: 0x6127, - 0x9CC2: 0x614A, - 0x9CC3: 0x613F, - 0x9CC4: 0x613C, - 0x9CC5: 0x612C, - 0x9CC6: 0x6134, - 0x9CC7: 0x613D, - 0x9CC8: 0x6142, - 0x9CC9: 0x6144, - 0x9CCA: 0x6173, - 0x9CCB: 0x6177, - 0x9CCC: 0x6158, - 0x9CCD: 0x6159, - 0x9CCE: 0x615A, - 0x9CCF: 0x616B, - 0x9CD0: 0x6174, - 0x9CD1: 0x616F, - 0x9CD2: 0x6165, - 0x9CD3: 0x6171, - 0x9CD4: 0x615F, - 0x9CD5: 0x615D, - 0x9CD6: 0x6153, - 0x9CD7: 0x6175, - 0x9CD8: 0x6199, - 0x9CD9: 0x6196, - 0x9CDA: 0x6187, - 0x9CDB: 0x61AC, - 0x9CDC: 0x6194, - 0x9CDD: 0x619A, - 0x9CDE: 0x618A, - 0x9CDF: 0x6191, - 0x9CE0: 0x61AB, - 0x9CE1: 0x61AE, - 0x9CE2: 0x61CC, - 0x9CE3: 0x61CA, - 0x9CE4: 0x61C9, - 0x9CE5: 0x61F7, - 0x9CE6: 0x61C8, - 0x9CE7: 0x61C3, - 0x9CE8: 0x61C6, - 0x9CE9: 0x61BA, - 0x9CEA: 0x61CB, - 0x9CEB: 0x7F79, - 0x9CEC: 0x61CD, - 0x9CED: 0x61E6, - 0x9CEE: 0x61E3, - 0x9CEF: 0x61F6, - 0x9CF0: 0x61FA, - 0x9CF1: 0x61F4, - 0x9CF2: 0x61FF, - 0x9CF3: 0x61FD, - 0x9CF4: 0x61FC, - 0x9CF5: 0x61FE, - 0x9CF6: 0x6200, - 0x9CF7: 0x6208, - 0x9CF8: 0x6209, - 0x9CF9: 0x620D, - 0x9CFA: 0x620C, - 0x9CFB: 0x6214, - 0x9CFC: 0x621B, - 0x9D40: 0x621E, - 0x9D41: 0x6221, - 0x9D42: 0x622A, - 0x9D43: 0x622E, - 0x9D44: 0x6230, - 0x9D45: 0x6232, - 0x9D46: 0x6233, - 0x9D47: 0x6241, - 0x9D48: 0x624E, - 0x9D49: 0x625E, - 0x9D4A: 0x6263, - 0x9D4B: 0x625B, - 0x9D4C: 0x6260, - 0x9D4D: 0x6268, - 0x9D4E: 0x627C, - 0x9D4F: 0x6282, - 0x9D50: 0x6289, - 0x9D51: 0x627E, - 0x9D52: 0x6292, - 0x9D53: 0x6293, - 0x9D54: 0x6296, - 0x9D55: 0x62D4, - 0x9D56: 0x6283, - 0x9D57: 0x6294, - 0x9D58: 0x62D7, - 0x9D59: 0x62D1, - 0x9D5A: 0x62BB, - 0x9D5B: 0x62CF, - 0x9D5C: 0x62FF, - 0x9D5D: 0x62C6, - 0x9D5E: 0x64D4, - 0x9D5F: 0x62C8, - 0x9D60: 0x62DC, - 0x9D61: 0x62CC, - 0x9D62: 0x62CA, - 0x9D63: 0x62C2, - 0x9D64: 0x62C7, - 0x9D65: 0x629B, - 0x9D66: 0x62C9, - 0x9D67: 0x630C, - 0x9D68: 0x62EE, - 0x9D69: 0x62F1, - 0x9D6A: 0x6327, - 0x9D6B: 0x6302, - 0x9D6C: 0x6308, - 0x9D6D: 0x62EF, - 0x9D6E: 0x62F5, - 0x9D6F: 0x6350, - 0x9D70: 0x633E, - 0x9D71: 0x634D, - 0x9D72: 0x641C, - 0x9D73: 0x634F, - 0x9D74: 0x6396, - 0x9D75: 0x638E, - 0x9D76: 0x6380, - 0x9D77: 0x63AB, - 0x9D78: 0x6376, - 0x9D79: 0x63A3, - 0x9D7A: 0x638F, - 0x9D7B: 0x6389, - 0x9D7C: 0x639F, - 0x9D7D: 0x63B5, - 0x9D7E: 0x636B, - 0x9D80: 0x6369, - 0x9D81: 0x63BE, - 0x9D82: 0x63E9, - 0x9D83: 0x63C0, - 0x9D84: 0x63C6, - 0x9D85: 0x63E3, - 0x9D86: 0x63C9, - 0x9D87: 0x63D2, - 0x9D88: 0x63F6, - 0x9D89: 0x63C4, - 0x9D8A: 0x6416, - 0x9D8B: 0x6434, - 0x9D8C: 0x6406, - 0x9D8D: 0x6413, - 0x9D8E: 0x6426, - 0x9D8F: 0x6436, - 0x9D90: 0x651D, - 0x9D91: 0x6417, - 0x9D92: 0x6428, - 0x9D93: 0x640F, - 0x9D94: 0x6467, - 0x9D95: 0x646F, - 0x9D96: 0x6476, - 0x9D97: 0x644E, - 0x9D98: 0x652A, - 0x9D99: 0x6495, - 0x9D9A: 0x6493, - 0x9D9B: 0x64A5, - 0x9D9C: 0x64A9, - 0x9D9D: 0x6488, - 0x9D9E: 0x64BC, - 0x9D9F: 0x64DA, - 0x9DA0: 0x64D2, - 0x9DA1: 0x64C5, - 0x9DA2: 0x64C7, - 0x9DA3: 0x64BB, - 0x9DA4: 0x64D8, - 0x9DA5: 0x64C2, - 0x9DA6: 0x64F1, - 0x9DA7: 0x64E7, - 0x9DA8: 0x8209, - 0x9DA9: 0x64E0, - 0x9DAA: 0x64E1, - 0x9DAB: 0x62AC, - 0x9DAC: 0x64E3, - 0x9DAD: 0x64EF, - 0x9DAE: 0x652C, - 0x9DAF: 0x64F6, - 0x9DB0: 0x64F4, - 0x9DB1: 0x64F2, - 0x9DB2: 0x64FA, - 0x9DB3: 0x6500, - 0x9DB4: 0x64FD, - 0x9DB5: 0x6518, - 0x9DB6: 0x651C, - 0x9DB7: 0x6505, - 0x9DB8: 0x6524, - 0x9DB9: 0x6523, - 0x9DBA: 0x652B, - 0x9DBB: 0x6534, - 0x9DBC: 0x6535, - 0x9DBD: 0x6537, - 0x9DBE: 0x6536, - 0x9DBF: 0x6538, - 0x9DC0: 0x754B, - 0x9DC1: 0x6548, - 0x9DC2: 0x6556, - 0x9DC3: 0x6555, - 0x9DC4: 0x654D, - 0x9DC5: 0x6558, - 0x9DC6: 0x655E, - 0x9DC7: 0x655D, - 0x9DC8: 0x6572, - 0x9DC9: 0x6578, - 0x9DCA: 0x6582, - 0x9DCB: 0x6583, - 0x9DCC: 0x8B8A, - 0x9DCD: 0x659B, - 0x9DCE: 0x659F, - 0x9DCF: 0x65AB, - 0x9DD0: 0x65B7, - 0x9DD1: 0x65C3, - 0x9DD2: 0x65C6, - 0x9DD3: 0x65C1, - 0x9DD4: 0x65C4, - 0x9DD5: 0x65CC, - 0x9DD6: 0x65D2, - 0x9DD7: 0x65DB, - 0x9DD8: 0x65D9, - 0x9DD9: 0x65E0, - 0x9DDA: 0x65E1, - 0x9DDB: 0x65F1, - 0x9DDC: 0x6772, - 0x9DDD: 0x660A, - 0x9DDE: 0x6603, - 0x9DDF: 0x65FB, - 0x9DE0: 0x6773, - 0x9DE1: 0x6635, - 0x9DE2: 0x6636, - 0x9DE3: 0x6634, - 0x9DE4: 0x661C, - 0x9DE5: 0x664F, - 0x9DE6: 0x6644, - 0x9DE7: 0x6649, - 0x9DE8: 0x6641, - 0x9DE9: 0x665E, - 0x9DEA: 0x665D, - 0x9DEB: 0x6664, - 0x9DEC: 0x6667, - 0x9DED: 0x6668, - 0x9DEE: 0x665F, - 0x9DEF: 0x6662, - 0x9DF0: 0x6670, - 0x9DF1: 0x6683, - 0x9DF2: 0x6688, - 0x9DF3: 0x668E, - 0x9DF4: 0x6689, - 0x9DF5: 0x6684, - 0x9DF6: 0x6698, - 0x9DF7: 0x669D, - 0x9DF8: 0x66C1, - 0x9DF9: 0x66B9, - 0x9DFA: 0x66C9, - 0x9DFB: 0x66BE, - 0x9DFC: 0x66BC, - 0x9E40: 0x66C4, - 0x9E41: 0x66B8, - 0x9E42: 0x66D6, - 0x9E43: 0x66DA, - 0x9E44: 0x66E0, - 0x9E45: 0x663F, - 0x9E46: 0x66E6, - 0x9E47: 0x66E9, - 0x9E48: 0x66F0, - 0x9E49: 0x66F5, - 0x9E4A: 0x66F7, - 0x9E4B: 0x670F, - 0x9E4C: 0x6716, - 0x9E4D: 0x671E, - 0x9E4E: 0x6726, - 0x9E4F: 0x6727, - 0x9E50: 0x9738, - 0x9E51: 0x672E, - 0x9E52: 0x673F, - 0x9E53: 0x6736, - 0x9E54: 0x6741, - 0x9E55: 0x6738, - 0x9E56: 0x6737, - 0x9E57: 0x6746, - 0x9E58: 0x675E, - 0x9E59: 0x6760, - 0x9E5A: 0x6759, - 0x9E5B: 0x6763, - 0x9E5C: 0x6764, - 0x9E5D: 0x6789, - 0x9E5E: 0x6770, - 0x9E5F: 0x67A9, - 0x9E60: 0x677C, - 0x9E61: 0x676A, - 0x9E62: 0x678C, - 0x9E63: 0x678B, - 0x9E64: 0x67A6, - 0x9E65: 0x67A1, - 0x9E66: 0x6785, - 0x9E67: 0x67B7, - 0x9E68: 0x67EF, - 0x9E69: 0x67B4, - 0x9E6A: 0x67EC, - 0x9E6B: 0x67B3, - 0x9E6C: 0x67E9, - 0x9E6D: 0x67B8, - 0x9E6E: 0x67E4, - 0x9E6F: 0x67DE, - 0x9E70: 0x67DD, - 0x9E71: 0x67E2, - 0x9E72: 0x67EE, - 0x9E73: 0x67B9, - 0x9E74: 0x67CE, - 0x9E75: 0x67C6, - 0x9E76: 0x67E7, - 0x9E77: 0x6A9C, - 0x9E78: 0x681E, - 0x9E79: 0x6846, - 0x9E7A: 0x6829, - 0x9E7B: 0x6840, - 0x9E7C: 0x684D, - 0x9E7D: 0x6832, - 0x9E7E: 0x684E, - 0x9E80: 0x68B3, - 0x9E81: 0x682B, - 0x9E82: 0x6859, - 0x9E83: 0x6863, - 0x9E84: 0x6877, - 0x9E85: 0x687F, - 0x9E86: 0x689F, - 0x9E87: 0x688F, - 0x9E88: 0x68AD, - 0x9E89: 0x6894, - 0x9E8A: 0x689D, - 0x9E8B: 0x689B, - 0x9E8C: 0x6883, - 0x9E8D: 0x6AAE, - 0x9E8E: 0x68B9, - 0x9E8F: 0x6874, - 0x9E90: 0x68B5, - 0x9E91: 0x68A0, - 0x9E92: 0x68BA, - 0x9E93: 0x690F, - 0x9E94: 0x688D, - 0x9E95: 0x687E, - 0x9E96: 0x6901, - 0x9E97: 0x68CA, - 0x9E98: 0x6908, - 0x9E99: 0x68D8, - 0x9E9A: 0x6922, - 0x9E9B: 0x6926, - 0x9E9C: 0x68E1, - 0x9E9D: 0x690C, - 0x9E9E: 0x68CD, - 0x9E9F: 0x68D4, - 0x9EA0: 0x68E7, - 0x9EA1: 0x68D5, - 0x9EA2: 0x6936, - 0x9EA3: 0x6912, - 0x9EA4: 0x6904, - 0x9EA5: 0x68D7, - 0x9EA6: 0x68E3, - 0x9EA7: 0x6925, - 0x9EA8: 0x68F9, - 0x9EA9: 0x68E0, - 0x9EAA: 0x68EF, - 0x9EAB: 0x6928, - 0x9EAC: 0x692A, - 0x9EAD: 0x691A, - 0x9EAE: 0x6923, - 0x9EAF: 0x6921, - 0x9EB0: 0x68C6, - 0x9EB1: 0x6979, - 0x9EB2: 0x6977, - 0x9EB3: 0x695C, - 0x9EB4: 0x6978, - 0x9EB5: 0x696B, - 0x9EB6: 0x6954, - 0x9EB7: 0x697E, - 0x9EB8: 0x696E, - 0x9EB9: 0x6939, - 0x9EBA: 0x6974, - 0x9EBB: 0x693D, - 0x9EBC: 0x6959, - 0x9EBD: 0x6930, - 0x9EBE: 0x6961, - 0x9EBF: 0x695E, - 0x9EC0: 0x695D, - 0x9EC1: 0x6981, - 0x9EC2: 0x696A, - 0x9EC3: 0x69B2, - 0x9EC4: 0x69AE, - 0x9EC5: 0x69D0, - 0x9EC6: 0x69BF, - 0x9EC7: 0x69C1, - 0x9EC8: 0x69D3, - 0x9EC9: 0x69BE, - 0x9ECA: 0x69CE, - 0x9ECB: 0x5BE8, - 0x9ECC: 0x69CA, - 0x9ECD: 0x69DD, - 0x9ECE: 0x69BB, - 0x9ECF: 0x69C3, - 0x9ED0: 0x69A7, - 0x9ED1: 0x6A2E, - 0x9ED2: 0x6991, - 0x9ED3: 0x69A0, - 0x9ED4: 0x699C, - 0x9ED5: 0x6995, - 0x9ED6: 0x69B4, - 0x9ED7: 0x69DE, - 0x9ED8: 0x69E8, - 0x9ED9: 0x6A02, - 0x9EDA: 0x6A1B, - 0x9EDB: 0x69FF, - 0x9EDC: 0x6B0A, - 0x9EDD: 0x69F9, - 0x9EDE: 0x69F2, - 0x9EDF: 0x69E7, - 0x9EE0: 0x6A05, - 0x9EE1: 0x69B1, - 0x9EE2: 0x6A1E, - 0x9EE3: 0x69ED, - 0x9EE4: 0x6A14, - 0x9EE5: 0x69EB, - 0x9EE6: 0x6A0A, - 0x9EE7: 0x6A12, - 0x9EE8: 0x6AC1, - 0x9EE9: 0x6A23, - 0x9EEA: 0x6A13, - 0x9EEB: 0x6A44, - 0x9EEC: 0x6A0C, - 0x9EED: 0x6A72, - 0x9EEE: 0x6A36, - 0x9EEF: 0x6A78, - 0x9EF0: 0x6A47, - 0x9EF1: 0x6A62, - 0x9EF2: 0x6A59, - 0x9EF3: 0x6A66, - 0x9EF4: 0x6A48, - 0x9EF5: 0x6A38, - 0x9EF6: 0x6A22, - 0x9EF7: 0x6A90, - 0x9EF8: 0x6A8D, - 0x9EF9: 0x6AA0, - 0x9EFA: 0x6A84, - 0x9EFB: 0x6AA2, - 0x9EFC: 0x6AA3, - 0x9F40: 0x6A97, - 0x9F41: 0x8617, - 0x9F42: 0x6ABB, - 0x9F43: 0x6AC3, - 0x9F44: 0x6AC2, - 0x9F45: 0x6AB8, - 0x9F46: 0x6AB3, - 0x9F47: 0x6AAC, - 0x9F48: 0x6ADE, - 0x9F49: 0x6AD1, - 0x9F4A: 0x6ADF, - 0x9F4B: 0x6AAA, - 0x9F4C: 0x6ADA, - 0x9F4D: 0x6AEA, - 0x9F4E: 0x6AFB, - 0x9F4F: 0x6B05, - 0x9F50: 0x8616, - 0x9F51: 0x6AFA, - 0x9F52: 0x6B12, - 0x9F53: 0x6B16, - 0x9F54: 0x9B31, - 0x9F55: 0x6B1F, - 0x9F56: 0x6B38, - 0x9F57: 0x6B37, - 0x9F58: 0x76DC, - 0x9F59: 0x6B39, - 0x9F5A: 0x98EE, - 0x9F5B: 0x6B47, - 0x9F5C: 0x6B43, - 0x9F5D: 0x6B49, - 0x9F5E: 0x6B50, - 0x9F5F: 0x6B59, - 0x9F60: 0x6B54, - 0x9F61: 0x6B5B, - 0x9F62: 0x6B5F, - 0x9F63: 0x6B61, - 0x9F64: 0x6B78, - 0x9F65: 0x6B79, - 0x9F66: 0x6B7F, - 0x9F67: 0x6B80, - 0x9F68: 0x6B84, - 0x9F69: 0x6B83, - 0x9F6A: 0x6B8D, - 0x9F6B: 0x6B98, - 0x9F6C: 0x6B95, - 0x9F6D: 0x6B9E, - 0x9F6E: 0x6BA4, - 0x9F6F: 0x6BAA, - 0x9F70: 0x6BAB, - 0x9F71: 0x6BAF, - 0x9F72: 0x6BB2, - 0x9F73: 0x6BB1, - 0x9F74: 0x6BB3, - 0x9F75: 0x6BB7, - 0x9F76: 0x6BBC, - 0x9F77: 0x6BC6, - 0x9F78: 0x6BCB, - 0x9F79: 0x6BD3, - 0x9F7A: 0x6BDF, - 0x9F7B: 0x6BEC, - 0x9F7C: 0x6BEB, - 0x9F7D: 0x6BF3, - 0x9F7E: 0x6BEF, - 0x9F80: 0x9EBE, - 0x9F81: 0x6C08, - 0x9F82: 0x6C13, - 0x9F83: 0x6C14, - 0x9F84: 0x6C1B, - 0x9F85: 0x6C24, - 0x9F86: 0x6C23, - 0x9F87: 0x6C5E, - 0x9F88: 0x6C55, - 0x9F89: 0x6C62, - 0x9F8A: 0x6C6A, - 0x9F8B: 0x6C82, - 0x9F8C: 0x6C8D, - 0x9F8D: 0x6C9A, - 0x9F8E: 0x6C81, - 0x9F8F: 0x6C9B, - 0x9F90: 0x6C7E, - 0x9F91: 0x6C68, - 0x9F92: 0x6C73, - 0x9F93: 0x6C92, - 0x9F94: 0x6C90, - 0x9F95: 0x6CC4, - 0x9F96: 0x6CF1, - 0x9F97: 0x6CD3, - 0x9F98: 0x6CBD, - 0x9F99: 0x6CD7, - 0x9F9A: 0x6CC5, - 0x9F9B: 0x6CDD, - 0x9F9C: 0x6CAE, - 0x9F9D: 0x6CB1, - 0x9F9E: 0x6CBE, - 0x9F9F: 0x6CBA, - 0x9FA0: 0x6CDB, - 0x9FA1: 0x6CEF, - 0x9FA2: 0x6CD9, - 0x9FA3: 0x6CEA, - 0x9FA4: 0x6D1F, - 0x9FA5: 0x884D, - 0x9FA6: 0x6D36, - 0x9FA7: 0x6D2B, - 0x9FA8: 0x6D3D, - 0x9FA9: 0x6D38, - 0x9FAA: 0x6D19, - 0x9FAB: 0x6D35, - 0x9FAC: 0x6D33, - 0x9FAD: 0x6D12, - 0x9FAE: 0x6D0C, - 0x9FAF: 0x6D63, - 0x9FB0: 0x6D93, - 0x9FB1: 0x6D64, - 0x9FB2: 0x6D5A, - 0x9FB3: 0x6D79, - 0x9FB4: 0x6D59, - 0x9FB5: 0x6D8E, - 0x9FB6: 0x6D95, - 0x9FB7: 0x6FE4, - 0x9FB8: 0x6D85, - 0x9FB9: 0x6DF9, - 0x9FBA: 0x6E15, - 0x9FBB: 0x6E0A, - 0x9FBC: 0x6DB5, - 0x9FBD: 0x6DC7, - 0x9FBE: 0x6DE6, - 0x9FBF: 0x6DB8, - 0x9FC0: 0x6DC6, - 0x9FC1: 0x6DEC, - 0x9FC2: 0x6DDE, - 0x9FC3: 0x6DCC, - 0x9FC4: 0x6DE8, - 0x9FC5: 0x6DD2, - 0x9FC6: 0x6DC5, - 0x9FC7: 0x6DFA, - 0x9FC8: 0x6DD9, - 0x9FC9: 0x6DE4, - 0x9FCA: 0x6DD5, - 0x9FCB: 0x6DEA, - 0x9FCC: 0x6DEE, - 0x9FCD: 0x6E2D, - 0x9FCE: 0x6E6E, - 0x9FCF: 0x6E2E, - 0x9FD0: 0x6E19, - 0x9FD1: 0x6E72, - 0x9FD2: 0x6E5F, - 0x9FD3: 0x6E3E, - 0x9FD4: 0x6E23, - 0x9FD5: 0x6E6B, - 0x9FD6: 0x6E2B, - 0x9FD7: 0x6E76, - 0x9FD8: 0x6E4D, - 0x9FD9: 0x6E1F, - 0x9FDA: 0x6E43, - 0x9FDB: 0x6E3A, - 0x9FDC: 0x6E4E, - 0x9FDD: 0x6E24, - 0x9FDE: 0x6EFF, - 0x9FDF: 0x6E1D, - 0x9FE0: 0x6E38, - 0x9FE1: 0x6E82, - 0x9FE2: 0x6EAA, - 0x9FE3: 0x6E98, - 0x9FE4: 0x6EC9, - 0x9FE5: 0x6EB7, - 0x9FE6: 0x6ED3, - 0x9FE7: 0x6EBD, - 0x9FE8: 0x6EAF, - 0x9FE9: 0x6EC4, - 0x9FEA: 0x6EB2, - 0x9FEB: 0x6ED4, - 0x9FEC: 0x6ED5, - 0x9FED: 0x6E8F, - 0x9FEE: 0x6EA5, - 0x9FEF: 0x6EC2, - 0x9FF0: 0x6E9F, - 0x9FF1: 0x6F41, - 0x9FF2: 0x6F11, - 0x9FF3: 0x704C, - 0x9FF4: 0x6EEC, - 0x9FF5: 0x6EF8, - 0x9FF6: 0x6EFE, - 0x9FF7: 0x6F3F, - 0x9FF8: 0x6EF2, - 0x9FF9: 0x6F31, - 0x9FFA: 0x6EEF, - 0x9FFB: 0x6F32, - 0x9FFC: 0x6ECC, - 0xE040: 0x6F3E, - 0xE041: 0x6F13, - 0xE042: 0x6EF7, - 0xE043: 0x6F86, - 0xE044: 0x6F7A, - 0xE045: 0x6F78, - 0xE046: 0x6F81, - 0xE047: 0x6F80, - 0xE048: 0x6F6F, - 0xE049: 0x6F5B, - 0xE04A: 0x6FF3, - 0xE04B: 0x6F6D, - 0xE04C: 0x6F82, - 0xE04D: 0x6F7C, - 0xE04E: 0x6F58, - 0xE04F: 0x6F8E, - 0xE050: 0x6F91, - 0xE051: 0x6FC2, - 0xE052: 0x6F66, - 0xE053: 0x6FB3, - 0xE054: 0x6FA3, - 0xE055: 0x6FA1, - 0xE056: 0x6FA4, - 0xE057: 0x6FB9, - 0xE058: 0x6FC6, - 0xE059: 0x6FAA, - 0xE05A: 0x6FDF, - 0xE05B: 0x6FD5, - 0xE05C: 0x6FEC, - 0xE05D: 0x6FD4, - 0xE05E: 0x6FD8, - 0xE05F: 0x6FF1, - 0xE060: 0x6FEE, - 0xE061: 0x6FDB, - 0xE062: 0x7009, - 0xE063: 0x700B, - 0xE064: 0x6FFA, - 0xE065: 0x7011, - 0xE066: 0x7001, - 0xE067: 0x700F, - 0xE068: 0x6FFE, - 0xE069: 0x701B, - 0xE06A: 0x701A, - 0xE06B: 0x6F74, - 0xE06C: 0x701D, - 0xE06D: 0x7018, - 0xE06E: 0x701F, - 0xE06F: 0x7030, - 0xE070: 0x703E, - 0xE071: 0x7032, - 0xE072: 0x7051, - 0xE073: 0x7063, - 0xE074: 0x7099, - 0xE075: 0x7092, - 0xE076: 0x70AF, - 0xE077: 0x70F1, - 0xE078: 0x70AC, - 0xE079: 0x70B8, - 0xE07A: 0x70B3, - 0xE07B: 0x70AE, - 0xE07C: 0x70DF, - 0xE07D: 0x70CB, - 0xE07E: 0x70DD, - 0xE080: 0x70D9, - 0xE081: 0x7109, - 0xE082: 0x70FD, - 0xE083: 0x711C, - 0xE084: 0x7119, - 0xE085: 0x7165, - 0xE086: 0x7155, - 0xE087: 0x7188, - 0xE088: 0x7166, - 0xE089: 0x7162, - 0xE08A: 0x714C, - 0xE08B: 0x7156, - 0xE08C: 0x716C, - 0xE08D: 0x718F, - 0xE08E: 0x71FB, - 0xE08F: 0x7184, - 0xE090: 0x7195, - 0xE091: 0x71A8, - 0xE092: 0x71AC, - 0xE093: 0x71D7, - 0xE094: 0x71B9, - 0xE095: 0x71BE, - 0xE096: 0x71D2, - 0xE097: 0x71C9, - 0xE098: 0x71D4, - 0xE099: 0x71CE, - 0xE09A: 0x71E0, - 0xE09B: 0x71EC, - 0xE09C: 0x71E7, - 0xE09D: 0x71F5, - 0xE09E: 0x71FC, - 0xE09F: 0x71F9, - 0xE0A0: 0x71FF, - 0xE0A1: 0x720D, - 0xE0A2: 0x7210, - 0xE0A3: 0x721B, - 0xE0A4: 0x7228, - 0xE0A5: 0x722D, - 0xE0A6: 0x722C, - 0xE0A7: 0x7230, - 0xE0A8: 0x7232, - 0xE0A9: 0x723B, - 0xE0AA: 0x723C, - 0xE0AB: 0x723F, - 0xE0AC: 0x7240, - 0xE0AD: 0x7246, - 0xE0AE: 0x724B, - 0xE0AF: 0x7258, - 0xE0B0: 0x7274, - 0xE0B1: 0x727E, - 0xE0B2: 0x7282, - 0xE0B3: 0x7281, - 0xE0B4: 0x7287, - 0xE0B5: 0x7292, - 0xE0B6: 0x7296, - 0xE0B7: 0x72A2, - 0xE0B8: 0x72A7, - 0xE0B9: 0x72B9, - 0xE0BA: 0x72B2, - 0xE0BB: 0x72C3, - 0xE0BC: 0x72C6, - 0xE0BD: 0x72C4, - 0xE0BE: 0x72CE, - 0xE0BF: 0x72D2, - 0xE0C0: 0x72E2, - 0xE0C1: 0x72E0, - 0xE0C2: 0x72E1, - 0xE0C3: 0x72F9, - 0xE0C4: 0x72F7, - 0xE0C5: 0x500F, - 0xE0C6: 0x7317, - 0xE0C7: 0x730A, - 0xE0C8: 0x731C, - 0xE0C9: 0x7316, - 0xE0CA: 0x731D, - 0xE0CB: 0x7334, - 0xE0CC: 0x732F, - 0xE0CD: 0x7329, - 0xE0CE: 0x7325, - 0xE0CF: 0x733E, - 0xE0D0: 0x734E, - 0xE0D1: 0x734F, - 0xE0D2: 0x9ED8, - 0xE0D3: 0x7357, - 0xE0D4: 0x736A, - 0xE0D5: 0x7368, - 0xE0D6: 0x7370, - 0xE0D7: 0x7378, - 0xE0D8: 0x7375, - 0xE0D9: 0x737B, - 0xE0DA: 0x737A, - 0xE0DB: 0x73C8, - 0xE0DC: 0x73B3, - 0xE0DD: 0x73CE, - 0xE0DE: 0x73BB, - 0xE0DF: 0x73C0, - 0xE0E0: 0x73E5, - 0xE0E1: 0x73EE, - 0xE0E2: 0x73DE, - 0xE0E3: 0x74A2, - 0xE0E4: 0x7405, - 0xE0E5: 0x746F, - 0xE0E6: 0x7425, - 0xE0E7: 0x73F8, - 0xE0E8: 0x7432, - 0xE0E9: 0x743A, - 0xE0EA: 0x7455, - 0xE0EB: 0x743F, - 0xE0EC: 0x745F, - 0xE0ED: 0x7459, - 0xE0EE: 0x7441, - 0xE0EF: 0x745C, - 0xE0F0: 0x7469, - 0xE0F1: 0x7470, - 0xE0F2: 0x7463, - 0xE0F3: 0x746A, - 0xE0F4: 0x7476, - 0xE0F5: 0x747E, - 0xE0F6: 0x748B, - 0xE0F7: 0x749E, - 0xE0F8: 0x74A7, - 0xE0F9: 0x74CA, - 0xE0FA: 0x74CF, - 0xE0FB: 0x74D4, - 0xE0FC: 0x73F1, - 0xE140: 0x74E0, - 0xE141: 0x74E3, - 0xE142: 0x74E7, - 0xE143: 0x74E9, - 0xE144: 0x74EE, - 0xE145: 0x74F2, - 0xE146: 0x74F0, - 0xE147: 0x74F1, - 0xE148: 0x74F8, - 0xE149: 0x74F7, - 0xE14A: 0x7504, - 0xE14B: 0x7503, - 0xE14C: 0x7505, - 0xE14D: 0x750C, - 0xE14E: 0x750E, - 0xE14F: 0x750D, - 0xE150: 0x7515, - 0xE151: 0x7513, - 0xE152: 0x751E, - 0xE153: 0x7526, - 0xE154: 0x752C, - 0xE155: 0x753C, - 0xE156: 0x7544, - 0xE157: 0x754D, - 0xE158: 0x754A, - 0xE159: 0x7549, - 0xE15A: 0x755B, - 0xE15B: 0x7546, - 0xE15C: 0x755A, - 0xE15D: 0x7569, - 0xE15E: 0x7564, - 0xE15F: 0x7567, - 0xE160: 0x756B, - 0xE161: 0x756D, - 0xE162: 0x7578, - 0xE163: 0x7576, - 0xE164: 0x7586, - 0xE165: 0x7587, - 0xE166: 0x7574, - 0xE167: 0x758A, - 0xE168: 0x7589, - 0xE169: 0x7582, - 0xE16A: 0x7594, - 0xE16B: 0x759A, - 0xE16C: 0x759D, - 0xE16D: 0x75A5, - 0xE16E: 0x75A3, - 0xE16F: 0x75C2, - 0xE170: 0x75B3, - 0xE171: 0x75C3, - 0xE172: 0x75B5, - 0xE173: 0x75BD, - 0xE174: 0x75B8, - 0xE175: 0x75BC, - 0xE176: 0x75B1, - 0xE177: 0x75CD, - 0xE178: 0x75CA, - 0xE179: 0x75D2, - 0xE17A: 0x75D9, - 0xE17B: 0x75E3, - 0xE17C: 0x75DE, - 0xE17D: 0x75FE, - 0xE17E: 0x75FF, - 0xE180: 0x75FC, - 0xE181: 0x7601, - 0xE182: 0x75F0, - 0xE183: 0x75FA, - 0xE184: 0x75F2, - 0xE185: 0x75F3, - 0xE186: 0x760B, - 0xE187: 0x760D, - 0xE188: 0x7609, - 0xE189: 0x761F, - 0xE18A: 0x7627, - 0xE18B: 0x7620, - 0xE18C: 0x7621, - 0xE18D: 0x7622, - 0xE18E: 0x7624, - 0xE18F: 0x7634, - 0xE190: 0x7630, - 0xE191: 0x763B, - 0xE192: 0x7647, - 0xE193: 0x7648, - 0xE194: 0x7646, - 0xE195: 0x765C, - 0xE196: 0x7658, - 0xE197: 0x7661, - 0xE198: 0x7662, - 0xE199: 0x7668, - 0xE19A: 0x7669, - 0xE19B: 0x766A, - 0xE19C: 0x7667, - 0xE19D: 0x766C, - 0xE19E: 0x7670, - 0xE19F: 0x7672, - 0xE1A0: 0x7676, - 0xE1A1: 0x7678, - 0xE1A2: 0x767C, - 0xE1A3: 0x7680, - 0xE1A4: 0x7683, - 0xE1A5: 0x7688, - 0xE1A6: 0x768B, - 0xE1A7: 0x768E, - 0xE1A8: 0x7696, - 0xE1A9: 0x7693, - 0xE1AA: 0x7699, - 0xE1AB: 0x769A, - 0xE1AC: 0x76B0, - 0xE1AD: 0x76B4, - 0xE1AE: 0x76B8, - 0xE1AF: 0x76B9, - 0xE1B0: 0x76BA, - 0xE1B1: 0x76C2, - 0xE1B2: 0x76CD, - 0xE1B3: 0x76D6, - 0xE1B4: 0x76D2, - 0xE1B5: 0x76DE, - 0xE1B6: 0x76E1, - 0xE1B7: 0x76E5, - 0xE1B8: 0x76E7, - 0xE1B9: 0x76EA, - 0xE1BA: 0x862F, - 0xE1BB: 0x76FB, - 0xE1BC: 0x7708, - 0xE1BD: 0x7707, - 0xE1BE: 0x7704, - 0xE1BF: 0x7729, - 0xE1C0: 0x7724, - 0xE1C1: 0x771E, - 0xE1C2: 0x7725, - 0xE1C3: 0x7726, - 0xE1C4: 0x771B, - 0xE1C5: 0x7737, - 0xE1C6: 0x7738, - 0xE1C7: 0x7747, - 0xE1C8: 0x775A, - 0xE1C9: 0x7768, - 0xE1CA: 0x776B, - 0xE1CB: 0x775B, - 0xE1CC: 0x7765, - 0xE1CD: 0x777F, - 0xE1CE: 0x777E, - 0xE1CF: 0x7779, - 0xE1D0: 0x778E, - 0xE1D1: 0x778B, - 0xE1D2: 0x7791, - 0xE1D3: 0x77A0, - 0xE1D4: 0x779E, - 0xE1D5: 0x77B0, - 0xE1D6: 0x77B6, - 0xE1D7: 0x77B9, - 0xE1D8: 0x77BF, - 0xE1D9: 0x77BC, - 0xE1DA: 0x77BD, - 0xE1DB: 0x77BB, - 0xE1DC: 0x77C7, - 0xE1DD: 0x77CD, - 0xE1DE: 0x77D7, - 0xE1DF: 0x77DA, - 0xE1E0: 0x77DC, - 0xE1E1: 0x77E3, - 0xE1E2: 0x77EE, - 0xE1E3: 0x77FC, - 0xE1E4: 0x780C, - 0xE1E5: 0x7812, - 0xE1E6: 0x7926, - 0xE1E7: 0x7820, - 0xE1E8: 0x792A, - 0xE1E9: 0x7845, - 0xE1EA: 0x788E, - 0xE1EB: 0x7874, - 0xE1EC: 0x7886, - 0xE1ED: 0x787C, - 0xE1EE: 0x789A, - 0xE1EF: 0x788C, - 0xE1F0: 0x78A3, - 0xE1F1: 0x78B5, - 0xE1F2: 0x78AA, - 0xE1F3: 0x78AF, - 0xE1F4: 0x78D1, - 0xE1F5: 0x78C6, - 0xE1F6: 0x78CB, - 0xE1F7: 0x78D4, - 0xE1F8: 0x78BE, - 0xE1F9: 0x78BC, - 0xE1FA: 0x78C5, - 0xE1FB: 0x78CA, - 0xE1FC: 0x78EC, - 0xE240: 0x78E7, - 0xE241: 0x78DA, - 0xE242: 0x78FD, - 0xE243: 0x78F4, - 0xE244: 0x7907, - 0xE245: 0x7912, - 0xE246: 0x7911, - 0xE247: 0x7919, - 0xE248: 0x792C, - 0xE249: 0x792B, - 0xE24A: 0x7940, - 0xE24B: 0x7960, - 0xE24C: 0x7957, - 0xE24D: 0x795F, - 0xE24E: 0x795A, - 0xE24F: 0x7955, - 0xE250: 0x7953, - 0xE251: 0x797A, - 0xE252: 0x797F, - 0xE253: 0x798A, - 0xE254: 0x799D, - 0xE255: 0x79A7, - 0xE256: 0x9F4B, - 0xE257: 0x79AA, - 0xE258: 0x79AE, - 0xE259: 0x79B3, - 0xE25A: 0x79B9, - 0xE25B: 0x79BA, - 0xE25C: 0x79C9, - 0xE25D: 0x79D5, - 0xE25E: 0x79E7, - 0xE25F: 0x79EC, - 0xE260: 0x79E1, - 0xE261: 0x79E3, - 0xE262: 0x7A08, - 0xE263: 0x7A0D, - 0xE264: 0x7A18, - 0xE265: 0x7A19, - 0xE266: 0x7A20, - 0xE267: 0x7A1F, - 0xE268: 0x7980, - 0xE269: 0x7A31, - 0xE26A: 0x7A3B, - 0xE26B: 0x7A3E, - 0xE26C: 0x7A37, - 0xE26D: 0x7A43, - 0xE26E: 0x7A57, - 0xE26F: 0x7A49, - 0xE270: 0x7A61, - 0xE271: 0x7A62, - 0xE272: 0x7A69, - 0xE273: 0x9F9D, - 0xE274: 0x7A70, - 0xE275: 0x7A79, - 0xE276: 0x7A7D, - 0xE277: 0x7A88, - 0xE278: 0x7A97, - 0xE279: 0x7A95, - 0xE27A: 0x7A98, - 0xE27B: 0x7A96, - 0xE27C: 0x7AA9, - 0xE27D: 0x7AC8, - 0xE27E: 0x7AB0, - 0xE280: 0x7AB6, - 0xE281: 0x7AC5, - 0xE282: 0x7AC4, - 0xE283: 0x7ABF, - 0xE284: 0x9083, - 0xE285: 0x7AC7, - 0xE286: 0x7ACA, - 0xE287: 0x7ACD, - 0xE288: 0x7ACF, - 0xE289: 0x7AD5, - 0xE28A: 0x7AD3, - 0xE28B: 0x7AD9, - 0xE28C: 0x7ADA, - 0xE28D: 0x7ADD, - 0xE28E: 0x7AE1, - 0xE28F: 0x7AE2, - 0xE290: 0x7AE6, - 0xE291: 0x7AED, - 0xE292: 0x7AF0, - 0xE293: 0x7B02, - 0xE294: 0x7B0F, - 0xE295: 0x7B0A, - 0xE296: 0x7B06, - 0xE297: 0x7B33, - 0xE298: 0x7B18, - 0xE299: 0x7B19, - 0xE29A: 0x7B1E, - 0xE29B: 0x7B35, - 0xE29C: 0x7B28, - 0xE29D: 0x7B36, - 0xE29E: 0x7B50, - 0xE29F: 0x7B7A, - 0xE2A0: 0x7B04, - 0xE2A1: 0x7B4D, - 0xE2A2: 0x7B0B, - 0xE2A3: 0x7B4C, - 0xE2A4: 0x7B45, - 0xE2A5: 0x7B75, - 0xE2A6: 0x7B65, - 0xE2A7: 0x7B74, - 0xE2A8: 0x7B67, - 0xE2A9: 0x7B70, - 0xE2AA: 0x7B71, - 0xE2AB: 0x7B6C, - 0xE2AC: 0x7B6E, - 0xE2AD: 0x7B9D, - 0xE2AE: 0x7B98, - 0xE2AF: 0x7B9F, - 0xE2B0: 0x7B8D, - 0xE2B1: 0x7B9C, - 0xE2B2: 0x7B9A, - 0xE2B3: 0x7B8B, - 0xE2B4: 0x7B92, - 0xE2B5: 0x7B8F, - 0xE2B6: 0x7B5D, - 0xE2B7: 0x7B99, - 0xE2B8: 0x7BCB, - 0xE2B9: 0x7BC1, - 0xE2BA: 0x7BCC, - 0xE2BB: 0x7BCF, - 0xE2BC: 0x7BB4, - 0xE2BD: 0x7BC6, - 0xE2BE: 0x7BDD, - 0xE2BF: 0x7BE9, - 0xE2C0: 0x7C11, - 0xE2C1: 0x7C14, - 0xE2C2: 0x7BE6, - 0xE2C3: 0x7BE5, - 0xE2C4: 0x7C60, - 0xE2C5: 0x7C00, - 0xE2C6: 0x7C07, - 0xE2C7: 0x7C13, - 0xE2C8: 0x7BF3, - 0xE2C9: 0x7BF7, - 0xE2CA: 0x7C17, - 0xE2CB: 0x7C0D, - 0xE2CC: 0x7BF6, - 0xE2CD: 0x7C23, - 0xE2CE: 0x7C27, - 0xE2CF: 0x7C2A, - 0xE2D0: 0x7C1F, - 0xE2D1: 0x7C37, - 0xE2D2: 0x7C2B, - 0xE2D3: 0x7C3D, - 0xE2D4: 0x7C4C, - 0xE2D5: 0x7C43, - 0xE2D6: 0x7C54, - 0xE2D7: 0x7C4F, - 0xE2D8: 0x7C40, - 0xE2D9: 0x7C50, - 0xE2DA: 0x7C58, - 0xE2DB: 0x7C5F, - 0xE2DC: 0x7C64, - 0xE2DD: 0x7C56, - 0xE2DE: 0x7C65, - 0xE2DF: 0x7C6C, - 0xE2E0: 0x7C75, - 0xE2E1: 0x7C83, - 0xE2E2: 0x7C90, - 0xE2E3: 0x7CA4, - 0xE2E4: 0x7CAD, - 0xE2E5: 0x7CA2, - 0xE2E6: 0x7CAB, - 0xE2E7: 0x7CA1, - 0xE2E8: 0x7CA8, - 0xE2E9: 0x7CB3, - 0xE2EA: 0x7CB2, - 0xE2EB: 0x7CB1, - 0xE2EC: 0x7CAE, - 0xE2ED: 0x7CB9, - 0xE2EE: 0x7CBD, - 0xE2EF: 0x7CC0, - 0xE2F0: 0x7CC5, - 0xE2F1: 0x7CC2, - 0xE2F2: 0x7CD8, - 0xE2F3: 0x7CD2, - 0xE2F4: 0x7CDC, - 0xE2F5: 0x7CE2, - 0xE2F6: 0x9B3B, - 0xE2F7: 0x7CEF, - 0xE2F8: 0x7CF2, - 0xE2F9: 0x7CF4, - 0xE2FA: 0x7CF6, - 0xE2FB: 0x7CFA, - 0xE2FC: 0x7D06, - 0xE340: 0x7D02, - 0xE341: 0x7D1C, - 0xE342: 0x7D15, - 0xE343: 0x7D0A, - 0xE344: 0x7D45, - 0xE345: 0x7D4B, - 0xE346: 0x7D2E, - 0xE347: 0x7D32, - 0xE348: 0x7D3F, - 0xE349: 0x7D35, - 0xE34A: 0x7D46, - 0xE34B: 0x7D73, - 0xE34C: 0x7D56, - 0xE34D: 0x7D4E, - 0xE34E: 0x7D72, - 0xE34F: 0x7D68, - 0xE350: 0x7D6E, - 0xE351: 0x7D4F, - 0xE352: 0x7D63, - 0xE353: 0x7D93, - 0xE354: 0x7D89, - 0xE355: 0x7D5B, - 0xE356: 0x7D8F, - 0xE357: 0x7D7D, - 0xE358: 0x7D9B, - 0xE359: 0x7DBA, - 0xE35A: 0x7DAE, - 0xE35B: 0x7DA3, - 0xE35C: 0x7DB5, - 0xE35D: 0x7DC7, - 0xE35E: 0x7DBD, - 0xE35F: 0x7DAB, - 0xE360: 0x7E3D, - 0xE361: 0x7DA2, - 0xE362: 0x7DAF, - 0xE363: 0x7DDC, - 0xE364: 0x7DB8, - 0xE365: 0x7D9F, - 0xE366: 0x7DB0, - 0xE367: 0x7DD8, - 0xE368: 0x7DDD, - 0xE369: 0x7DE4, - 0xE36A: 0x7DDE, - 0xE36B: 0x7DFB, - 0xE36C: 0x7DF2, - 0xE36D: 0x7DE1, - 0xE36E: 0x7E05, - 0xE36F: 0x7E0A, - 0xE370: 0x7E23, - 0xE371: 0x7E21, - 0xE372: 0x7E12, - 0xE373: 0x7E31, - 0xE374: 0x7E1F, - 0xE375: 0x7E09, - 0xE376: 0x7E0B, - 0xE377: 0x7E22, - 0xE378: 0x7E46, - 0xE379: 0x7E66, - 0xE37A: 0x7E3B, - 0xE37B: 0x7E35, - 0xE37C: 0x7E39, - 0xE37D: 0x7E43, - 0xE37E: 0x7E37, - 0xE380: 0x7E32, - 0xE381: 0x7E3A, - 0xE382: 0x7E67, - 0xE383: 0x7E5D, - 0xE384: 0x7E56, - 0xE385: 0x7E5E, - 0xE386: 0x7E59, - 0xE387: 0x7E5A, - 0xE388: 0x7E79, - 0xE389: 0x7E6A, - 0xE38A: 0x7E69, - 0xE38B: 0x7E7C, - 0xE38C: 0x7E7B, - 0xE38D: 0x7E83, - 0xE38E: 0x7DD5, - 0xE38F: 0x7E7D, - 0xE390: 0x8FAE, - 0xE391: 0x7E7F, - 0xE392: 0x7E88, - 0xE393: 0x7E89, - 0xE394: 0x7E8C, - 0xE395: 0x7E92, - 0xE396: 0x7E90, - 0xE397: 0x7E93, - 0xE398: 0x7E94, - 0xE399: 0x7E96, - 0xE39A: 0x7E8E, - 0xE39B: 0x7E9B, - 0xE39C: 0x7E9C, - 0xE39D: 0x7F38, - 0xE39E: 0x7F3A, - 0xE39F: 0x7F45, - 0xE3A0: 0x7F4C, - 0xE3A1: 0x7F4D, - 0xE3A2: 0x7F4E, - 0xE3A3: 0x7F50, - 0xE3A4: 0x7F51, - 0xE3A5: 0x7F55, - 0xE3A6: 0x7F54, - 0xE3A7: 0x7F58, - 0xE3A8: 0x7F5F, - 0xE3A9: 0x7F60, - 0xE3AA: 0x7F68, - 0xE3AB: 0x7F69, - 0xE3AC: 0x7F67, - 0xE3AD: 0x7F78, - 0xE3AE: 0x7F82, - 0xE3AF: 0x7F86, - 0xE3B0: 0x7F83, - 0xE3B1: 0x7F88, - 0xE3B2: 0x7F87, - 0xE3B3: 0x7F8C, - 0xE3B4: 0x7F94, - 0xE3B5: 0x7F9E, - 0xE3B6: 0x7F9D, - 0xE3B7: 0x7F9A, - 0xE3B8: 0x7FA3, - 0xE3B9: 0x7FAF, - 0xE3BA: 0x7FB2, - 0xE3BB: 0x7FB9, - 0xE3BC: 0x7FAE, - 0xE3BD: 0x7FB6, - 0xE3BE: 0x7FB8, - 0xE3BF: 0x8B71, - 0xE3C0: 0x7FC5, - 0xE3C1: 0x7FC6, - 0xE3C2: 0x7FCA, - 0xE3C3: 0x7FD5, - 0xE3C4: 0x7FD4, - 0xE3C5: 0x7FE1, - 0xE3C6: 0x7FE6, - 0xE3C7: 0x7FE9, - 0xE3C8: 0x7FF3, - 0xE3C9: 0x7FF9, - 0xE3CA: 0x98DC, - 0xE3CB: 0x8006, - 0xE3CC: 0x8004, - 0xE3CD: 0x800B, - 0xE3CE: 0x8012, - 0xE3CF: 0x8018, - 0xE3D0: 0x8019, - 0xE3D1: 0x801C, - 0xE3D2: 0x8021, - 0xE3D3: 0x8028, - 0xE3D4: 0x803F, - 0xE3D5: 0x803B, - 0xE3D6: 0x804A, - 0xE3D7: 0x8046, - 0xE3D8: 0x8052, - 0xE3D9: 0x8058, - 0xE3DA: 0x805A, - 0xE3DB: 0x805F, - 0xE3DC: 0x8062, - 0xE3DD: 0x8068, - 0xE3DE: 0x8073, - 0xE3DF: 0x8072, - 0xE3E0: 0x8070, - 0xE3E1: 0x8076, - 0xE3E2: 0x8079, - 0xE3E3: 0x807D, - 0xE3E4: 0x807F, - 0xE3E5: 0x8084, - 0xE3E6: 0x8086, - 0xE3E7: 0x8085, - 0xE3E8: 0x809B, - 0xE3E9: 0x8093, - 0xE3EA: 0x809A, - 0xE3EB: 0x80AD, - 0xE3EC: 0x5190, - 0xE3ED: 0x80AC, - 0xE3EE: 0x80DB, - 0xE3EF: 0x80E5, - 0xE3F0: 0x80D9, - 0xE3F1: 0x80DD, - 0xE3F2: 0x80C4, - 0xE3F3: 0x80DA, - 0xE3F4: 0x80D6, - 0xE3F5: 0x8109, - 0xE3F6: 0x80EF, - 0xE3F7: 0x80F1, - 0xE3F8: 0x811B, - 0xE3F9: 0x8129, - 0xE3FA: 0x8123, - 0xE3FB: 0x812F, - 0xE3FC: 0x814B, - 0xE440: 0x968B, - 0xE441: 0x8146, - 0xE442: 0x813E, - 0xE443: 0x8153, - 0xE444: 0x8151, - 0xE445: 0x80FC, - 0xE446: 0x8171, - 0xE447: 0x816E, - 0xE448: 0x8165, - 0xE449: 0x8166, - 0xE44A: 0x8174, - 0xE44B: 0x8183, - 0xE44C: 0x8188, - 0xE44D: 0x818A, - 0xE44E: 0x8180, - 0xE44F: 0x8182, - 0xE450: 0x81A0, - 0xE451: 0x8195, - 0xE452: 0x81A4, - 0xE453: 0x81A3, - 0xE454: 0x815F, - 0xE455: 0x8193, - 0xE456: 0x81A9, - 0xE457: 0x81B0, - 0xE458: 0x81B5, - 0xE459: 0x81BE, - 0xE45A: 0x81B8, - 0xE45B: 0x81BD, - 0xE45C: 0x81C0, - 0xE45D: 0x81C2, - 0xE45E: 0x81BA, - 0xE45F: 0x81C9, - 0xE460: 0x81CD, - 0xE461: 0x81D1, - 0xE462: 0x81D9, - 0xE463: 0x81D8, - 0xE464: 0x81C8, - 0xE465: 0x81DA, - 0xE466: 0x81DF, - 0xE467: 0x81E0, - 0xE468: 0x81E7, - 0xE469: 0x81FA, - 0xE46A: 0x81FB, - 0xE46B: 0x81FE, - 0xE46C: 0x8201, - 0xE46D: 0x8202, - 0xE46E: 0x8205, - 0xE46F: 0x8207, - 0xE470: 0x820A, - 0xE471: 0x820D, - 0xE472: 0x8210, - 0xE473: 0x8216, - 0xE474: 0x8229, - 0xE475: 0x822B, - 0xE476: 0x8238, - 0xE477: 0x8233, - 0xE478: 0x8240, - 0xE479: 0x8259, - 0xE47A: 0x8258, - 0xE47B: 0x825D, - 0xE47C: 0x825A, - 0xE47D: 0x825F, - 0xE47E: 0x8264, - 0xE480: 0x8262, - 0xE481: 0x8268, - 0xE482: 0x826A, - 0xE483: 0x826B, - 0xE484: 0x822E, - 0xE485: 0x8271, - 0xE486: 0x8277, - 0xE487: 0x8278, - 0xE488: 0x827E, - 0xE489: 0x828D, - 0xE48A: 0x8292, - 0xE48B: 0x82AB, - 0xE48C: 0x829F, - 0xE48D: 0x82BB, - 0xE48E: 0x82AC, - 0xE48F: 0x82E1, - 0xE490: 0x82E3, - 0xE491: 0x82DF, - 0xE492: 0x82D2, - 0xE493: 0x82F4, - 0xE494: 0x82F3, - 0xE495: 0x82FA, - 0xE496: 0x8393, - 0xE497: 0x8303, - 0xE498: 0x82FB, - 0xE499: 0x82F9, - 0xE49A: 0x82DE, - 0xE49B: 0x8306, - 0xE49C: 0x82DC, - 0xE49D: 0x8309, - 0xE49E: 0x82D9, - 0xE49F: 0x8335, - 0xE4A0: 0x8334, - 0xE4A1: 0x8316, - 0xE4A2: 0x8332, - 0xE4A3: 0x8331, - 0xE4A4: 0x8340, - 0xE4A5: 0x8339, - 0xE4A6: 0x8350, - 0xE4A7: 0x8345, - 0xE4A8: 0x832F, - 0xE4A9: 0x832B, - 0xE4AA: 0x8317, - 0xE4AB: 0x8318, - 0xE4AC: 0x8385, - 0xE4AD: 0x839A, - 0xE4AE: 0x83AA, - 0xE4AF: 0x839F, - 0xE4B0: 0x83A2, - 0xE4B1: 0x8396, - 0xE4B2: 0x8323, - 0xE4B3: 0x838E, - 0xE4B4: 0x8387, - 0xE4B5: 0x838A, - 0xE4B6: 0x837C, - 0xE4B7: 0x83B5, - 0xE4B8: 0x8373, - 0xE4B9: 0x8375, - 0xE4BA: 0x83A0, - 0xE4BB: 0x8389, - 0xE4BC: 0x83A8, - 0xE4BD: 0x83F4, - 0xE4BE: 0x8413, - 0xE4BF: 0x83EB, - 0xE4C0: 0x83CE, - 0xE4C1: 0x83FD, - 0xE4C2: 0x8403, - 0xE4C3: 0x83D8, - 0xE4C4: 0x840B, - 0xE4C5: 0x83C1, - 0xE4C6: 0x83F7, - 0xE4C7: 0x8407, - 0xE4C8: 0x83E0, - 0xE4C9: 0x83F2, - 0xE4CA: 0x840D, - 0xE4CB: 0x8422, - 0xE4CC: 0x8420, - 0xE4CD: 0x83BD, - 0xE4CE: 0x8438, - 0xE4CF: 0x8506, - 0xE4D0: 0x83FB, - 0xE4D1: 0x846D, - 0xE4D2: 0x842A, - 0xE4D3: 0x843C, - 0xE4D4: 0x855A, - 0xE4D5: 0x8484, - 0xE4D6: 0x8477, - 0xE4D7: 0x846B, - 0xE4D8: 0x84AD, - 0xE4D9: 0x846E, - 0xE4DA: 0x8482, - 0xE4DB: 0x8469, - 0xE4DC: 0x8446, - 0xE4DD: 0x842C, - 0xE4DE: 0x846F, - 0xE4DF: 0x8479, - 0xE4E0: 0x8435, - 0xE4E1: 0x84CA, - 0xE4E2: 0x8462, - 0xE4E3: 0x84B9, - 0xE4E4: 0x84BF, - 0xE4E5: 0x849F, - 0xE4E6: 0x84D9, - 0xE4E7: 0x84CD, - 0xE4E8: 0x84BB, - 0xE4E9: 0x84DA, - 0xE4EA: 0x84D0, - 0xE4EB: 0x84C1, - 0xE4EC: 0x84C6, - 0xE4ED: 0x84D6, - 0xE4EE: 0x84A1, - 0xE4EF: 0x8521, - 0xE4F0: 0x84FF, - 0xE4F1: 0x84F4, - 0xE4F2: 0x8517, - 0xE4F3: 0x8518, - 0xE4F4: 0x852C, - 0xE4F5: 0x851F, - 0xE4F6: 0x8515, - 0xE4F7: 0x8514, - 0xE4F8: 0x84FC, - 0xE4F9: 0x8540, - 0xE4FA: 0x8563, - 0xE4FB: 0x8558, - 0xE4FC: 0x8548, - 0xE540: 0x8541, - 0xE541: 0x8602, - 0xE542: 0x854B, - 0xE543: 0x8555, - 0xE544: 0x8580, - 0xE545: 0x85A4, - 0xE546: 0x8588, - 0xE547: 0x8591, - 0xE548: 0x858A, - 0xE549: 0x85A8, - 0xE54A: 0x856D, - 0xE54B: 0x8594, - 0xE54C: 0x859B, - 0xE54D: 0x85EA, - 0xE54E: 0x8587, - 0xE54F: 0x859C, - 0xE550: 0x8577, - 0xE551: 0x857E, - 0xE552: 0x8590, - 0xE553: 0x85C9, - 0xE554: 0x85BA, - 0xE555: 0x85CF, - 0xE556: 0x85B9, - 0xE557: 0x85D0, - 0xE558: 0x85D5, - 0xE559: 0x85DD, - 0xE55A: 0x85E5, - 0xE55B: 0x85DC, - 0xE55C: 0x85F9, - 0xE55D: 0x860A, - 0xE55E: 0x8613, - 0xE55F: 0x860B, - 0xE560: 0x85FE, - 0xE561: 0x85FA, - 0xE562: 0x8606, - 0xE563: 0x8622, - 0xE564: 0x861A, - 0xE565: 0x8630, - 0xE566: 0x863F, - 0xE567: 0x864D, - 0xE568: 0x4E55, - 0xE569: 0x8654, - 0xE56A: 0x865F, - 0xE56B: 0x8667, - 0xE56C: 0x8671, - 0xE56D: 0x8693, - 0xE56E: 0x86A3, - 0xE56F: 0x86A9, - 0xE570: 0x86AA, - 0xE571: 0x868B, - 0xE572: 0x868C, - 0xE573: 0x86B6, - 0xE574: 0x86AF, - 0xE575: 0x86C4, - 0xE576: 0x86C6, - 0xE577: 0x86B0, - 0xE578: 0x86C9, - 0xE579: 0x8823, - 0xE57A: 0x86AB, - 0xE57B: 0x86D4, - 0xE57C: 0x86DE, - 0xE57D: 0x86E9, - 0xE57E: 0x86EC, - 0xE580: 0x86DF, - 0xE581: 0x86DB, - 0xE582: 0x86EF, - 0xE583: 0x8712, - 0xE584: 0x8706, - 0xE585: 0x8708, - 0xE586: 0x8700, - 0xE587: 0x8703, - 0xE588: 0x86FB, - 0xE589: 0x8711, - 0xE58A: 0x8709, - 0xE58B: 0x870D, - 0xE58C: 0x86F9, - 0xE58D: 0x870A, - 0xE58E: 0x8734, - 0xE58F: 0x873F, - 0xE590: 0x8737, - 0xE591: 0x873B, - 0xE592: 0x8725, - 0xE593: 0x8729, - 0xE594: 0x871A, - 0xE595: 0x8760, - 0xE596: 0x875F, - 0xE597: 0x8778, - 0xE598: 0x874C, - 0xE599: 0x874E, - 0xE59A: 0x8774, - 0xE59B: 0x8757, - 0xE59C: 0x8768, - 0xE59D: 0x876E, - 0xE59E: 0x8759, - 0xE59F: 0x8753, - 0xE5A0: 0x8763, - 0xE5A1: 0x876A, - 0xE5A2: 0x8805, - 0xE5A3: 0x87A2, - 0xE5A4: 0x879F, - 0xE5A5: 0x8782, - 0xE5A6: 0x87AF, - 0xE5A7: 0x87CB, - 0xE5A8: 0x87BD, - 0xE5A9: 0x87C0, - 0xE5AA: 0x87D0, - 0xE5AB: 0x96D6, - 0xE5AC: 0x87AB, - 0xE5AD: 0x87C4, - 0xE5AE: 0x87B3, - 0xE5AF: 0x87C7, - 0xE5B0: 0x87C6, - 0xE5B1: 0x87BB, - 0xE5B2: 0x87EF, - 0xE5B3: 0x87F2, - 0xE5B4: 0x87E0, - 0xE5B5: 0x880F, - 0xE5B6: 0x880D, - 0xE5B7: 0x87FE, - 0xE5B8: 0x87F6, - 0xE5B9: 0x87F7, - 0xE5BA: 0x880E, - 0xE5BB: 0x87D2, - 0xE5BC: 0x8811, - 0xE5BD: 0x8816, - 0xE5BE: 0x8815, - 0xE5BF: 0x8822, - 0xE5C0: 0x8821, - 0xE5C1: 0x8831, - 0xE5C2: 0x8836, - 0xE5C3: 0x8839, - 0xE5C4: 0x8827, - 0xE5C5: 0x883B, - 0xE5C6: 0x8844, - 0xE5C7: 0x8842, - 0xE5C8: 0x8852, - 0xE5C9: 0x8859, - 0xE5CA: 0x885E, - 0xE5CB: 0x8862, - 0xE5CC: 0x886B, - 0xE5CD: 0x8881, - 0xE5CE: 0x887E, - 0xE5CF: 0x889E, - 0xE5D0: 0x8875, - 0xE5D1: 0x887D, - 0xE5D2: 0x88B5, - 0xE5D3: 0x8872, - 0xE5D4: 0x8882, - 0xE5D5: 0x8897, - 0xE5D6: 0x8892, - 0xE5D7: 0x88AE, - 0xE5D8: 0x8899, - 0xE5D9: 0x88A2, - 0xE5DA: 0x888D, - 0xE5DB: 0x88A4, - 0xE5DC: 0x88B0, - 0xE5DD: 0x88BF, - 0xE5DE: 0x88B1, - 0xE5DF: 0x88C3, - 0xE5E0: 0x88C4, - 0xE5E1: 0x88D4, - 0xE5E2: 0x88D8, - 0xE5E3: 0x88D9, - 0xE5E4: 0x88DD, - 0xE5E5: 0x88F9, - 0xE5E6: 0x8902, - 0xE5E7: 0x88FC, - 0xE5E8: 0x88F4, - 0xE5E9: 0x88E8, - 0xE5EA: 0x88F2, - 0xE5EB: 0x8904, - 0xE5EC: 0x890C, - 0xE5ED: 0x890A, - 0xE5EE: 0x8913, - 0xE5EF: 0x8943, - 0xE5F0: 0x891E, - 0xE5F1: 0x8925, - 0xE5F2: 0x892A, - 0xE5F3: 0x892B, - 0xE5F4: 0x8941, - 0xE5F5: 0x8944, - 0xE5F6: 0x893B, - 0xE5F7: 0x8936, - 0xE5F8: 0x8938, - 0xE5F9: 0x894C, - 0xE5FA: 0x891D, - 0xE5FB: 0x8960, - 0xE5FC: 0x895E, - 0xE640: 0x8966, - 0xE641: 0x8964, - 0xE642: 0x896D, - 0xE643: 0x896A, - 0xE644: 0x896F, - 0xE645: 0x8974, - 0xE646: 0x8977, - 0xE647: 0x897E, - 0xE648: 0x8983, - 0xE649: 0x8988, - 0xE64A: 0x898A, - 0xE64B: 0x8993, - 0xE64C: 0x8998, - 0xE64D: 0x89A1, - 0xE64E: 0x89A9, - 0xE64F: 0x89A6, - 0xE650: 0x89AC, - 0xE651: 0x89AF, - 0xE652: 0x89B2, - 0xE653: 0x89BA, - 0xE654: 0x89BD, - 0xE655: 0x89BF, - 0xE656: 0x89C0, - 0xE657: 0x89DA, - 0xE658: 0x89DC, - 0xE659: 0x89DD, - 0xE65A: 0x89E7, - 0xE65B: 0x89F4, - 0xE65C: 0x89F8, - 0xE65D: 0x8A03, - 0xE65E: 0x8A16, - 0xE65F: 0x8A10, - 0xE660: 0x8A0C, - 0xE661: 0x8A1B, - 0xE662: 0x8A1D, - 0xE663: 0x8A25, - 0xE664: 0x8A36, - 0xE665: 0x8A41, - 0xE666: 0x8A5B, - 0xE667: 0x8A52, - 0xE668: 0x8A46, - 0xE669: 0x8A48, - 0xE66A: 0x8A7C, - 0xE66B: 0x8A6D, - 0xE66C: 0x8A6C, - 0xE66D: 0x8A62, - 0xE66E: 0x8A85, - 0xE66F: 0x8A82, - 0xE670: 0x8A84, - 0xE671: 0x8AA8, - 0xE672: 0x8AA1, - 0xE673: 0x8A91, - 0xE674: 0x8AA5, - 0xE675: 0x8AA6, - 0xE676: 0x8A9A, - 0xE677: 0x8AA3, - 0xE678: 0x8AC4, - 0xE679: 0x8ACD, - 0xE67A: 0x8AC2, - 0xE67B: 0x8ADA, - 0xE67C: 0x8AEB, - 0xE67D: 0x8AF3, - 0xE67E: 0x8AE7, - 0xE680: 0x8AE4, - 0xE681: 0x8AF1, - 0xE682: 0x8B14, - 0xE683: 0x8AE0, - 0xE684: 0x8AE2, - 0xE685: 0x8AF7, - 0xE686: 0x8ADE, - 0xE687: 0x8ADB, - 0xE688: 0x8B0C, - 0xE689: 0x8B07, - 0xE68A: 0x8B1A, - 0xE68B: 0x8AE1, - 0xE68C: 0x8B16, - 0xE68D: 0x8B10, - 0xE68E: 0x8B17, - 0xE68F: 0x8B20, - 0xE690: 0x8B33, - 0xE691: 0x97AB, - 0xE692: 0x8B26, - 0xE693: 0x8B2B, - 0xE694: 0x8B3E, - 0xE695: 0x8B28, - 0xE696: 0x8B41, - 0xE697: 0x8B4C, - 0xE698: 0x8B4F, - 0xE699: 0x8B4E, - 0xE69A: 0x8B49, - 0xE69B: 0x8B56, - 0xE69C: 0x8B5B, - 0xE69D: 0x8B5A, - 0xE69E: 0x8B6B, - 0xE69F: 0x8B5F, - 0xE6A0: 0x8B6C, - 0xE6A1: 0x8B6F, - 0xE6A2: 0x8B74, - 0xE6A3: 0x8B7D, - 0xE6A4: 0x8B80, - 0xE6A5: 0x8B8C, - 0xE6A6: 0x8B8E, - 0xE6A7: 0x8B92, - 0xE6A8: 0x8B93, - 0xE6A9: 0x8B96, - 0xE6AA: 0x8B99, - 0xE6AB: 0x8B9A, - 0xE6AC: 0x8C3A, - 0xE6AD: 0x8C41, - 0xE6AE: 0x8C3F, - 0xE6AF: 0x8C48, - 0xE6B0: 0x8C4C, - 0xE6B1: 0x8C4E, - 0xE6B2: 0x8C50, - 0xE6B3: 0x8C55, - 0xE6B4: 0x8C62, - 0xE6B5: 0x8C6C, - 0xE6B6: 0x8C78, - 0xE6B7: 0x8C7A, - 0xE6B8: 0x8C82, - 0xE6B9: 0x8C89, - 0xE6BA: 0x8C85, - 0xE6BB: 0x8C8A, - 0xE6BC: 0x8C8D, - 0xE6BD: 0x8C8E, - 0xE6BE: 0x8C94, - 0xE6BF: 0x8C7C, - 0xE6C0: 0x8C98, - 0xE6C1: 0x621D, - 0xE6C2: 0x8CAD, - 0xE6C3: 0x8CAA, - 0xE6C4: 0x8CBD, - 0xE6C5: 0x8CB2, - 0xE6C6: 0x8CB3, - 0xE6C7: 0x8CAE, - 0xE6C8: 0x8CB6, - 0xE6C9: 0x8CC8, - 0xE6CA: 0x8CC1, - 0xE6CB: 0x8CE4, - 0xE6CC: 0x8CE3, - 0xE6CD: 0x8CDA, - 0xE6CE: 0x8CFD, - 0xE6CF: 0x8CFA, - 0xE6D0: 0x8CFB, - 0xE6D1: 0x8D04, - 0xE6D2: 0x8D05, - 0xE6D3: 0x8D0A, - 0xE6D4: 0x8D07, - 0xE6D5: 0x8D0F, - 0xE6D6: 0x8D0D, - 0xE6D7: 0x8D10, - 0xE6D8: 0x9F4E, - 0xE6D9: 0x8D13, - 0xE6DA: 0x8CCD, - 0xE6DB: 0x8D14, - 0xE6DC: 0x8D16, - 0xE6DD: 0x8D67, - 0xE6DE: 0x8D6D, - 0xE6DF: 0x8D71, - 0xE6E0: 0x8D73, - 0xE6E1: 0x8D81, - 0xE6E2: 0x8D99, - 0xE6E3: 0x8DC2, - 0xE6E4: 0x8DBE, - 0xE6E5: 0x8DBA, - 0xE6E6: 0x8DCF, - 0xE6E7: 0x8DDA, - 0xE6E8: 0x8DD6, - 0xE6E9: 0x8DCC, - 0xE6EA: 0x8DDB, - 0xE6EB: 0x8DCB, - 0xE6EC: 0x8DEA, - 0xE6ED: 0x8DEB, - 0xE6EE: 0x8DDF, - 0xE6EF: 0x8DE3, - 0xE6F0: 0x8DFC, - 0xE6F1: 0x8E08, - 0xE6F2: 0x8E09, - 0xE6F3: 0x8DFF, - 0xE6F4: 0x8E1D, - 0xE6F5: 0x8E1E, - 0xE6F6: 0x8E10, - 0xE6F7: 0x8E1F, - 0xE6F8: 0x8E42, - 0xE6F9: 0x8E35, - 0xE6FA: 0x8E30, - 0xE6FB: 0x8E34, - 0xE6FC: 0x8E4A, - 0xE740: 0x8E47, - 0xE741: 0x8E49, - 0xE742: 0x8E4C, - 0xE743: 0x8E50, - 0xE744: 0x8E48, - 0xE745: 0x8E59, - 0xE746: 0x8E64, - 0xE747: 0x8E60, - 0xE748: 0x8E2A, - 0xE749: 0x8E63, - 0xE74A: 0x8E55, - 0xE74B: 0x8E76, - 0xE74C: 0x8E72, - 0xE74D: 0x8E7C, - 0xE74E: 0x8E81, - 0xE74F: 0x8E87, - 0xE750: 0x8E85, - 0xE751: 0x8E84, - 0xE752: 0x8E8B, - 0xE753: 0x8E8A, - 0xE754: 0x8E93, - 0xE755: 0x8E91, - 0xE756: 0x8E94, - 0xE757: 0x8E99, - 0xE758: 0x8EAA, - 0xE759: 0x8EA1, - 0xE75A: 0x8EAC, - 0xE75B: 0x8EB0, - 0xE75C: 0x8EC6, - 0xE75D: 0x8EB1, - 0xE75E: 0x8EBE, - 0xE75F: 0x8EC5, - 0xE760: 0x8EC8, - 0xE761: 0x8ECB, - 0xE762: 0x8EDB, - 0xE763: 0x8EE3, - 0xE764: 0x8EFC, - 0xE765: 0x8EFB, - 0xE766: 0x8EEB, - 0xE767: 0x8EFE, - 0xE768: 0x8F0A, - 0xE769: 0x8F05, - 0xE76A: 0x8F15, - 0xE76B: 0x8F12, - 0xE76C: 0x8F19, - 0xE76D: 0x8F13, - 0xE76E: 0x8F1C, - 0xE76F: 0x8F1F, - 0xE770: 0x8F1B, - 0xE771: 0x8F0C, - 0xE772: 0x8F26, - 0xE773: 0x8F33, - 0xE774: 0x8F3B, - 0xE775: 0x8F39, - 0xE776: 0x8F45, - 0xE777: 0x8F42, - 0xE778: 0x8F3E, - 0xE779: 0x8F4C, - 0xE77A: 0x8F49, - 0xE77B: 0x8F46, - 0xE77C: 0x8F4E, - 0xE77D: 0x8F57, - 0xE77E: 0x8F5C, - 0xE780: 0x8F62, - 0xE781: 0x8F63, - 0xE782: 0x8F64, - 0xE783: 0x8F9C, - 0xE784: 0x8F9F, - 0xE785: 0x8FA3, - 0xE786: 0x8FAD, - 0xE787: 0x8FAF, - 0xE788: 0x8FB7, - 0xE789: 0x8FDA, - 0xE78A: 0x8FE5, - 0xE78B: 0x8FE2, - 0xE78C: 0x8FEA, - 0xE78D: 0x8FEF, - 0xE78E: 0x9087, - 0xE78F: 0x8FF4, - 0xE790: 0x9005, - 0xE791: 0x8FF9, - 0xE792: 0x8FFA, - 0xE793: 0x9011, - 0xE794: 0x9015, - 0xE795: 0x9021, - 0xE796: 0x900D, - 0xE797: 0x901E, - 0xE798: 0x9016, - 0xE799: 0x900B, - 0xE79A: 0x9027, - 0xE79B: 0x9036, - 0xE79C: 0x9035, - 0xE79D: 0x9039, - 0xE79E: 0x8FF8, - 0xE79F: 0x904F, - 0xE7A0: 0x9050, - 0xE7A1: 0x9051, - 0xE7A2: 0x9052, - 0xE7A3: 0x900E, - 0xE7A4: 0x9049, - 0xE7A5: 0x903E, - 0xE7A6: 0x9056, - 0xE7A7: 0x9058, - 0xE7A8: 0x905E, - 0xE7A9: 0x9068, - 0xE7AA: 0x906F, - 0xE7AB: 0x9076, - 0xE7AC: 0x96A8, - 0xE7AD: 0x9072, - 0xE7AE: 0x9082, - 0xE7AF: 0x907D, - 0xE7B0: 0x9081, - 0xE7B1: 0x9080, - 0xE7B2: 0x908A, - 0xE7B3: 0x9089, - 0xE7B4: 0x908F, - 0xE7B5: 0x90A8, - 0xE7B6: 0x90AF, - 0xE7B7: 0x90B1, - 0xE7B8: 0x90B5, - 0xE7B9: 0x90E2, - 0xE7BA: 0x90E4, - 0xE7BB: 0x6248, - 0xE7BC: 0x90DB, - 0xE7BD: 0x9102, - 0xE7BE: 0x9112, - 0xE7BF: 0x9119, - 0xE7C0: 0x9132, - 0xE7C1: 0x9130, - 0xE7C2: 0x914A, - 0xE7C3: 0x9156, - 0xE7C4: 0x9158, - 0xE7C5: 0x9163, - 0xE7C6: 0x9165, - 0xE7C7: 0x9169, - 0xE7C8: 0x9173, - 0xE7C9: 0x9172, - 0xE7CA: 0x918B, - 0xE7CB: 0x9189, - 0xE7CC: 0x9182, - 0xE7CD: 0x91A2, - 0xE7CE: 0x91AB, - 0xE7CF: 0x91AF, - 0xE7D0: 0x91AA, - 0xE7D1: 0x91B5, - 0xE7D2: 0x91B4, - 0xE7D3: 0x91BA, - 0xE7D4: 0x91C0, - 0xE7D5: 0x91C1, - 0xE7D6: 0x91C9, - 0xE7D7: 0x91CB, - 0xE7D8: 0x91D0, - 0xE7D9: 0x91D6, - 0xE7DA: 0x91DF, - 0xE7DB: 0x91E1, - 0xE7DC: 0x91DB, - 0xE7DD: 0x91FC, - 0xE7DE: 0x91F5, - 0xE7DF: 0x91F6, - 0xE7E0: 0x921E, - 0xE7E1: 0x91FF, - 0xE7E2: 0x9214, - 0xE7E3: 0x922C, - 0xE7E4: 0x9215, - 0xE7E5: 0x9211, - 0xE7E6: 0x925E, - 0xE7E7: 0x9257, - 0xE7E8: 0x9245, - 0xE7E9: 0x9249, - 0xE7EA: 0x9264, - 0xE7EB: 0x9248, - 0xE7EC: 0x9295, - 0xE7ED: 0x923F, - 0xE7EE: 0x924B, - 0xE7EF: 0x9250, - 0xE7F0: 0x929C, - 0xE7F1: 0x9296, - 0xE7F2: 0x9293, - 0xE7F3: 0x929B, - 0xE7F4: 0x925A, - 0xE7F5: 0x92CF, - 0xE7F6: 0x92B9, - 0xE7F7: 0x92B7, - 0xE7F8: 0x92E9, - 0xE7F9: 0x930F, - 0xE7FA: 0x92FA, - 0xE7FB: 0x9344, - 0xE7FC: 0x932E, - 0xE840: 0x9319, - 0xE841: 0x9322, - 0xE842: 0x931A, - 0xE843: 0x9323, - 0xE844: 0x933A, - 0xE845: 0x9335, - 0xE846: 0x933B, - 0xE847: 0x935C, - 0xE848: 0x9360, - 0xE849: 0x937C, - 0xE84A: 0x936E, - 0xE84B: 0x9356, - 0xE84C: 0x93B0, - 0xE84D: 0x93AC, - 0xE84E: 0x93AD, - 0xE84F: 0x9394, - 0xE850: 0x93B9, - 0xE851: 0x93D6, - 0xE852: 0x93D7, - 0xE853: 0x93E8, - 0xE854: 0x93E5, - 0xE855: 0x93D8, - 0xE856: 0x93C3, - 0xE857: 0x93DD, - 0xE858: 0x93D0, - 0xE859: 0x93C8, - 0xE85A: 0x93E4, - 0xE85B: 0x941A, - 0xE85C: 0x9414, - 0xE85D: 0x9413, - 0xE85E: 0x9403, - 0xE85F: 0x9407, - 0xE860: 0x9410, - 0xE861: 0x9436, - 0xE862: 0x942B, - 0xE863: 0x9435, - 0xE864: 0x9421, - 0xE865: 0x943A, - 0xE866: 0x9441, - 0xE867: 0x9452, - 0xE868: 0x9444, - 0xE869: 0x945B, - 0xE86A: 0x9460, - 0xE86B: 0x9462, - 0xE86C: 0x945E, - 0xE86D: 0x946A, - 0xE86E: 0x9229, - 0xE86F: 0x9470, - 0xE870: 0x9475, - 0xE871: 0x9477, - 0xE872: 0x947D, - 0xE873: 0x945A, - 0xE874: 0x947C, - 0xE875: 0x947E, - 0xE876: 0x9481, - 0xE877: 0x947F, - 0xE878: 0x9582, - 0xE879: 0x9587, - 0xE87A: 0x958A, - 0xE87B: 0x9594, - 0xE87C: 0x9596, - 0xE87D: 0x9598, - 0xE87E: 0x9599, - 0xE880: 0x95A0, - 0xE881: 0x95A8, - 0xE882: 0x95A7, - 0xE883: 0x95AD, - 0xE884: 0x95BC, - 0xE885: 0x95BB, - 0xE886: 0x95B9, - 0xE887: 0x95BE, - 0xE888: 0x95CA, - 0xE889: 0x6FF6, - 0xE88A: 0x95C3, - 0xE88B: 0x95CD, - 0xE88C: 0x95CC, - 0xE88D: 0x95D5, - 0xE88E: 0x95D4, - 0xE88F: 0x95D6, - 0xE890: 0x95DC, - 0xE891: 0x95E1, - 0xE892: 0x95E5, - 0xE893: 0x95E2, - 0xE894: 0x9621, - 0xE895: 0x9628, - 0xE896: 0x962E, - 0xE897: 0x962F, - 0xE898: 0x9642, - 0xE899: 0x964C, - 0xE89A: 0x964F, - 0xE89B: 0x964B, - 0xE89C: 0x9677, - 0xE89D: 0x965C, - 0xE89E: 0x965E, - 0xE89F: 0x965D, - 0xE8A0: 0x965F, - 0xE8A1: 0x9666, - 0xE8A2: 0x9672, - 0xE8A3: 0x966C, - 0xE8A4: 0x968D, - 0xE8A5: 0x9698, - 0xE8A6: 0x9695, - 0xE8A7: 0x9697, - 0xE8A8: 0x96AA, - 0xE8A9: 0x96A7, - 0xE8AA: 0x96B1, - 0xE8AB: 0x96B2, - 0xE8AC: 0x96B0, - 0xE8AD: 0x96B4, - 0xE8AE: 0x96B6, - 0xE8AF: 0x96B8, - 0xE8B0: 0x96B9, - 0xE8B1: 0x96CE, - 0xE8B2: 0x96CB, - 0xE8B3: 0x96C9, - 0xE8B4: 0x96CD, - 0xE8B5: 0x894D, - 0xE8B6: 0x96DC, - 0xE8B7: 0x970D, - 0xE8B8: 0x96D5, - 0xE8B9: 0x96F9, - 0xE8BA: 0x9704, - 0xE8BB: 0x9706, - 0xE8BC: 0x9708, - 0xE8BD: 0x9713, - 0xE8BE: 0x970E, - 0xE8BF: 0x9711, - 0xE8C0: 0x970F, - 0xE8C1: 0x9716, - 0xE8C2: 0x9719, - 0xE8C3: 0x9724, - 0xE8C4: 0x972A, - 0xE8C5: 0x9730, - 0xE8C6: 0x9739, - 0xE8C7: 0x973D, - 0xE8C8: 0x973E, - 0xE8C9: 0x9744, - 0xE8CA: 0x9746, - 0xE8CB: 0x9748, - 0xE8CC: 0x9742, - 0xE8CD: 0x9749, - 0xE8CE: 0x975C, - 0xE8CF: 0x9760, - 0xE8D0: 0x9764, - 0xE8D1: 0x9766, - 0xE8D2: 0x9768, - 0xE8D3: 0x52D2, - 0xE8D4: 0x976B, - 0xE8D5: 0x9771, - 0xE8D6: 0x9779, - 0xE8D7: 0x9785, - 0xE8D8: 0x977C, - 0xE8D9: 0x9781, - 0xE8DA: 0x977A, - 0xE8DB: 0x9786, - 0xE8DC: 0x978B, - 0xE8DD: 0x978F, - 0xE8DE: 0x9790, - 0xE8DF: 0x979C, - 0xE8E0: 0x97A8, - 0xE8E1: 0x97A6, - 0xE8E2: 0x97A3, - 0xE8E3: 0x97B3, - 0xE8E4: 0x97B4, - 0xE8E5: 0x97C3, - 0xE8E6: 0x97C6, - 0xE8E7: 0x97C8, - 0xE8E8: 0x97CB, - 0xE8E9: 0x97DC, - 0xE8EA: 0x97ED, - 0xE8EB: 0x9F4F, - 0xE8EC: 0x97F2, - 0xE8ED: 0x7ADF, - 0xE8EE: 0x97F6, - 0xE8EF: 0x97F5, - 0xE8F0: 0x980F, - 0xE8F1: 0x980C, - 0xE8F2: 0x9838, - 0xE8F3: 0x9824, - 0xE8F4: 0x9821, - 0xE8F5: 0x9837, - 0xE8F6: 0x983D, - 0xE8F7: 0x9846, - 0xE8F8: 0x984F, - 0xE8F9: 0x984B, - 0xE8FA: 0x986B, - 0xE8FB: 0x986F, - 0xE8FC: 0x9870, - 0xE940: 0x9871, - 0xE941: 0x9874, - 0xE942: 0x9873, - 0xE943: 0x98AA, - 0xE944: 0x98AF, - 0xE945: 0x98B1, - 0xE946: 0x98B6, - 0xE947: 0x98C4, - 0xE948: 0x98C3, - 0xE949: 0x98C6, - 0xE94A: 0x98E9, - 0xE94B: 0x98EB, - 0xE94C: 0x9903, - 0xE94D: 0x9909, - 0xE94E: 0x9912, - 0xE94F: 0x9914, - 0xE950: 0x9918, - 0xE951: 0x9921, - 0xE952: 0x991D, - 0xE953: 0x991E, - 0xE954: 0x9924, - 0xE955: 0x9920, - 0xE956: 0x992C, - 0xE957: 0x992E, - 0xE958: 0x993D, - 0xE959: 0x993E, - 0xE95A: 0x9942, - 0xE95B: 0x9949, - 0xE95C: 0x9945, - 0xE95D: 0x9950, - 0xE95E: 0x994B, - 0xE95F: 0x9951, - 0xE960: 0x9952, - 0xE961: 0x994C, - 0xE962: 0x9955, - 0xE963: 0x9997, - 0xE964: 0x9998, - 0xE965: 0x99A5, - 0xE966: 0x99AD, - 0xE967: 0x99AE, - 0xE968: 0x99BC, - 0xE969: 0x99DF, - 0xE96A: 0x99DB, - 0xE96B: 0x99DD, - 0xE96C: 0x99D8, - 0xE96D: 0x99D1, - 0xE96E: 0x99ED, - 0xE96F: 0x99EE, - 0xE970: 0x99F1, - 0xE971: 0x99F2, - 0xE972: 0x99FB, - 0xE973: 0x99F8, - 0xE974: 0x9A01, - 0xE975: 0x9A0F, - 0xE976: 0x9A05, - 0xE977: 0x99E2, - 0xE978: 0x9A19, - 0xE979: 0x9A2B, - 0xE97A: 0x9A37, - 0xE97B: 0x9A45, - 0xE97C: 0x9A42, - 0xE97D: 0x9A40, - 0xE97E: 0x9A43, - 0xE980: 0x9A3E, - 0xE981: 0x9A55, - 0xE982: 0x9A4D, - 0xE983: 0x9A5B, - 0xE984: 0x9A57, - 0xE985: 0x9A5F, - 0xE986: 0x9A62, - 0xE987: 0x9A65, - 0xE988: 0x9A64, - 0xE989: 0x9A69, - 0xE98A: 0x9A6B, - 0xE98B: 0x9A6A, - 0xE98C: 0x9AAD, - 0xE98D: 0x9AB0, - 0xE98E: 0x9ABC, - 0xE98F: 0x9AC0, - 0xE990: 0x9ACF, - 0xE991: 0x9AD1, - 0xE992: 0x9AD3, - 0xE993: 0x9AD4, - 0xE994: 0x9ADE, - 0xE995: 0x9ADF, - 0xE996: 0x9AE2, - 0xE997: 0x9AE3, - 0xE998: 0x9AE6, - 0xE999: 0x9AEF, - 0xE99A: 0x9AEB, - 0xE99B: 0x9AEE, - 0xE99C: 0x9AF4, - 0xE99D: 0x9AF1, - 0xE99E: 0x9AF7, - 0xE99F: 0x9AFB, - 0xE9A0: 0x9B06, - 0xE9A1: 0x9B18, - 0xE9A2: 0x9B1A, - 0xE9A3: 0x9B1F, - 0xE9A4: 0x9B22, - 0xE9A5: 0x9B23, - 0xE9A6: 0x9B25, - 0xE9A7: 0x9B27, - 0xE9A8: 0x9B28, - 0xE9A9: 0x9B29, - 0xE9AA: 0x9B2A, - 0xE9AB: 0x9B2E, - 0xE9AC: 0x9B2F, - 0xE9AD: 0x9B32, - 0xE9AE: 0x9B44, - 0xE9AF: 0x9B43, - 0xE9B0: 0x9B4F, - 0xE9B1: 0x9B4D, - 0xE9B2: 0x9B4E, - 0xE9B3: 0x9B51, - 0xE9B4: 0x9B58, - 0xE9B5: 0x9B74, - 0xE9B6: 0x9B93, - 0xE9B7: 0x9B83, - 0xE9B8: 0x9B91, - 0xE9B9: 0x9B96, - 0xE9BA: 0x9B97, - 0xE9BB: 0x9B9F, - 0xE9BC: 0x9BA0, - 0xE9BD: 0x9BA8, - 0xE9BE: 0x9BB4, - 0xE9BF: 0x9BC0, - 0xE9C0: 0x9BCA, - 0xE9C1: 0x9BB9, - 0xE9C2: 0x9BC6, - 0xE9C3: 0x9BCF, - 0xE9C4: 0x9BD1, - 0xE9C5: 0x9BD2, - 0xE9C6: 0x9BE3, - 0xE9C7: 0x9BE2, - 0xE9C8: 0x9BE4, - 0xE9C9: 0x9BD4, - 0xE9CA: 0x9BE1, - 0xE9CB: 0x9C3A, - 0xE9CC: 0x9BF2, - 0xE9CD: 0x9BF1, - 0xE9CE: 0x9BF0, - 0xE9CF: 0x9C15, - 0xE9D0: 0x9C14, - 0xE9D1: 0x9C09, - 0xE9D2: 0x9C13, - 0xE9D3: 0x9C0C, - 0xE9D4: 0x9C06, - 0xE9D5: 0x9C08, - 0xE9D6: 0x9C12, - 0xE9D7: 0x9C0A, - 0xE9D8: 0x9C04, - 0xE9D9: 0x9C2E, - 0xE9DA: 0x9C1B, - 0xE9DB: 0x9C25, - 0xE9DC: 0x9C24, - 0xE9DD: 0x9C21, - 0xE9DE: 0x9C30, - 0xE9DF: 0x9C47, - 0xE9E0: 0x9C32, - 0xE9E1: 0x9C46, - 0xE9E2: 0x9C3E, - 0xE9E3: 0x9C5A, - 0xE9E4: 0x9C60, - 0xE9E5: 0x9C67, - 0xE9E6: 0x9C76, - 0xE9E7: 0x9C78, - 0xE9E8: 0x9CE7, - 0xE9E9: 0x9CEC, - 0xE9EA: 0x9CF0, - 0xE9EB: 0x9D09, - 0xE9EC: 0x9D08, - 0xE9ED: 0x9CEB, - 0xE9EE: 0x9D03, - 0xE9EF: 0x9D06, - 0xE9F0: 0x9D2A, - 0xE9F1: 0x9D26, - 0xE9F2: 0x9DAF, - 0xE9F3: 0x9D23, - 0xE9F4: 0x9D1F, - 0xE9F5: 0x9D44, - 0xE9F6: 0x9D15, - 0xE9F7: 0x9D12, - 0xE9F8: 0x9D41, - 0xE9F9: 0x9D3F, - 0xE9FA: 0x9D3E, - 0xE9FB: 0x9D46, - 0xE9FC: 0x9D48, - 0xEA40: 0x9D5D, - 0xEA41: 0x9D5E, - 0xEA42: 0x9D64, - 0xEA43: 0x9D51, - 0xEA44: 0x9D50, - 0xEA45: 0x9D59, - 0xEA46: 0x9D72, - 0xEA47: 0x9D89, - 0xEA48: 0x9D87, - 0xEA49: 0x9DAB, - 0xEA4A: 0x9D6F, - 0xEA4B: 0x9D7A, - 0xEA4C: 0x9D9A, - 0xEA4D: 0x9DA4, - 0xEA4E: 0x9DA9, - 0xEA4F: 0x9DB2, - 0xEA50: 0x9DC4, - 0xEA51: 0x9DC1, - 0xEA52: 0x9DBB, - 0xEA53: 0x9DB8, - 0xEA54: 0x9DBA, - 0xEA55: 0x9DC6, - 0xEA56: 0x9DCF, - 0xEA57: 0x9DC2, - 0xEA58: 0x9DD9, - 0xEA59: 0x9DD3, - 0xEA5A: 0x9DF8, - 0xEA5B: 0x9DE6, - 0xEA5C: 0x9DED, - 0xEA5D: 0x9DEF, - 0xEA5E: 0x9DFD, - 0xEA5F: 0x9E1A, - 0xEA60: 0x9E1B, - 0xEA61: 0x9E1E, - 0xEA62: 0x9E75, - 0xEA63: 0x9E79, - 0xEA64: 0x9E7D, - 0xEA65: 0x9E81, - 0xEA66: 0x9E88, - 0xEA67: 0x9E8B, - 0xEA68: 0x9E8C, - 0xEA69: 0x9E92, - 0xEA6A: 0x9E95, - 0xEA6B: 0x9E91, - 0xEA6C: 0x9E9D, - 0xEA6D: 0x9EA5, - 0xEA6E: 0x9EA9, - 0xEA6F: 0x9EB8, - 0xEA70: 0x9EAA, - 0xEA71: 0x9EAD, - 0xEA72: 0x9761, - 0xEA73: 0x9ECC, - 0xEA74: 0x9ECE, - 0xEA75: 0x9ECF, - 0xEA76: 0x9ED0, - 0xEA77: 0x9ED4, - 0xEA78: 0x9EDC, - 0xEA79: 0x9EDE, - 0xEA7A: 0x9EDD, - 0xEA7B: 0x9EE0, - 0xEA7C: 0x9EE5, - 0xEA7D: 0x9EE8, - 0xEA7E: 0x9EEF, - 0xEA80: 0x9EF4, - 0xEA81: 0x9EF6, - 0xEA82: 0x9EF7, - 0xEA83: 0x9EF9, - 0xEA84: 0x9EFB, - 0xEA85: 0x9EFC, - 0xEA86: 0x9EFD, - 0xEA87: 0x9F07, - 0xEA88: 0x9F08, - 0xEA89: 0x76B7, - 0xEA8A: 0x9F15, - 0xEA8B: 0x9F21, - 0xEA8C: 0x9F2C, - 0xEA8D: 0x9F3E, - 0xEA8E: 0x9F4A, - 0xEA8F: 0x9F52, - 0xEA90: 0x9F54, - 0xEA91: 0x9F63, - 0xEA92: 0x9F5F, - 0xEA93: 0x9F60, - 0xEA94: 0x9F61, - 0xEA95: 0x9F66, - 0xEA96: 0x9F67, - 0xEA97: 0x9F6C, - 0xEA98: 0x9F6A, - 0xEA99: 0x9F77, - 0xEA9A: 0x9F72, - 0xEA9B: 0x9F76, - 0xEA9C: 0x9F95, - 0xEA9D: 0x9F9C, - 0xEA9E: 0x9FA0, - 0xEA9F: 0x582F, - 0xEAA0: 0x69C7, - 0xEAA1: 0x9059, - 0xEAA2: 0x7464, - 0xEAA3: 0x51DC, - 0xEAA4: 0x7199, - 0xED40: 0x7E8A, - 0xED41: 0x891C, - 0xED42: 0x9348, - 0xED43: 0x9288, - 0xED44: 0x84DC, - 0xED45: 0x4FC9, - 0xED46: 0x70BB, - 0xED47: 0x6631, - 0xED48: 0x68C8, - 0xED49: 0x92F9, - 0xED4A: 0x66FB, - 0xED4B: 0x5F45, - 0xED4C: 0x4E28, - 0xED4D: 0x4EE1, - 0xED4E: 0x4EFC, - 0xED4F: 0x4F00, - 0xED50: 0x4F03, - 0xED51: 0x4F39, - 0xED52: 0x4F56, - 0xED53: 0x4F92, - 0xED54: 0x4F8A, - 0xED55: 0x4F9A, - 0xED56: 0x4F94, - 0xED57: 0x4FCD, - 0xED58: 0x5040, - 0xED59: 0x5022, - 0xED5A: 0x4FFF, - 0xED5B: 0x501E, - 0xED5C: 0x5046, - 0xED5D: 0x5070, - 0xED5E: 0x5042, - 0xED5F: 0x5094, - 0xED60: 0x50F4, - 0xED61: 0x50D8, - 0xED62: 0x514A, - 0xED63: 0x5164, - 0xED64: 0x519D, - 0xED65: 0x51BE, - 0xED66: 0x51EC, - 0xED67: 0x5215, - 0xED68: 0x529C, - 0xED69: 0x52A6, - 0xED6A: 0x52C0, - 0xED6B: 0x52DB, - 0xED6C: 0x5300, - 0xED6D: 0x5307, - 0xED6E: 0x5324, - 0xED6F: 0x5372, - 0xED70: 0x5393, - 0xED71: 0x53B2, - 0xED72: 0x53DD, - 0xED73: 0xFA0E, - 0xED74: 0x549C, - 0xED75: 0x548A, - 0xED76: 0x54A9, - 0xED77: 0x54FF, - 0xED78: 0x5586, - 0xED79: 0x5759, - 0xED7A: 0x5765, - 0xED7B: 0x57AC, - 0xED7C: 0x57C8, - 0xED7D: 0x57C7, - 0xED7E: 0xFA0F, - 0xED80: 0xFA10, - 0xED81: 0x589E, - 0xED82: 0x58B2, - 0xED83: 0x590B, - 0xED84: 0x5953, - 0xED85: 0x595B, - 0xED86: 0x595D, - 0xED87: 0x5963, - 0xED88: 0x59A4, - 0xED89: 0x59BA, - 0xED8A: 0x5B56, - 0xED8B: 0x5BC0, - 0xED8C: 0x752F, - 0xED8D: 0x5BD8, - 0xED8E: 0x5BEC, - 0xED8F: 0x5C1E, - 0xED90: 0x5CA6, - 0xED91: 0x5CBA, - 0xED92: 0x5CF5, - 0xED93: 0x5D27, - 0xED94: 0x5D53, - 0xED95: 0xFA11, - 0xED96: 0x5D42, - 0xED97: 0x5D6D, - 0xED98: 0x5DB8, - 0xED99: 0x5DB9, - 0xED9A: 0x5DD0, - 0xED9B: 0x5F21, - 0xED9C: 0x5F34, - 0xED9D: 0x5F67, - 0xED9E: 0x5FB7, - 0xED9F: 0x5FDE, - 0xEDA0: 0x605D, - 0xEDA1: 0x6085, - 0xEDA2: 0x608A, - 0xEDA3: 0x60DE, - 0xEDA4: 0x60D5, - 0xEDA5: 0x6120, - 0xEDA6: 0x60F2, - 0xEDA7: 0x6111, - 0xEDA8: 0x6137, - 0xEDA9: 0x6130, - 0xEDAA: 0x6198, - 0xEDAB: 0x6213, - 0xEDAC: 0x62A6, - 0xEDAD: 0x63F5, - 0xEDAE: 0x6460, - 0xEDAF: 0x649D, - 0xEDB0: 0x64CE, - 0xEDB1: 0x654E, - 0xEDB2: 0x6600, - 0xEDB3: 0x6615, - 0xEDB4: 0x663B, - 0xEDB5: 0x6609, - 0xEDB6: 0x662E, - 0xEDB7: 0x661E, - 0xEDB8: 0x6624, - 0xEDB9: 0x6665, - 0xEDBA: 0x6657, - 0xEDBB: 0x6659, - 0xEDBC: 0xFA12, - 0xEDBD: 0x6673, - 0xEDBE: 0x6699, - 0xEDBF: 0x66A0, - 0xEDC0: 0x66B2, - 0xEDC1: 0x66BF, - 0xEDC2: 0x66FA, - 0xEDC3: 0x670E, - 0xEDC4: 0xF929, - 0xEDC5: 0x6766, - 0xEDC6: 0x67BB, - 0xEDC7: 0x6852, - 0xEDC8: 0x67C0, - 0xEDC9: 0x6801, - 0xEDCA: 0x6844, - 0xEDCB: 0x68CF, - 0xEDCC: 0xFA13, - 0xEDCD: 0x6968, - 0xEDCE: 0xFA14, - 0xEDCF: 0x6998, - 0xEDD0: 0x69E2, - 0xEDD1: 0x6A30, - 0xEDD2: 0x6A6B, - 0xEDD3: 0x6A46, - 0xEDD4: 0x6A73, - 0xEDD5: 0x6A7E, - 0xEDD6: 0x6AE2, - 0xEDD7: 0x6AE4, - 0xEDD8: 0x6BD6, - 0xEDD9: 0x6C3F, - 0xEDDA: 0x6C5C, - 0xEDDB: 0x6C86, - 0xEDDC: 0x6C6F, - 0xEDDD: 0x6CDA, - 0xEDDE: 0x6D04, - 0xEDDF: 0x6D87, - 0xEDE0: 0x6D6F, - 0xEDE1: 0x6D96, - 0xEDE2: 0x6DAC, - 0xEDE3: 0x6DCF, - 0xEDE4: 0x6DF8, - 0xEDE5: 0x6DF2, - 0xEDE6: 0x6DFC, - 0xEDE7: 0x6E39, - 0xEDE8: 0x6E5C, - 0xEDE9: 0x6E27, - 0xEDEA: 0x6E3C, - 0xEDEB: 0x6EBF, - 0xEDEC: 0x6F88, - 0xEDED: 0x6FB5, - 0xEDEE: 0x6FF5, - 0xEDEF: 0x7005, - 0xEDF0: 0x7007, - 0xEDF1: 0x7028, - 0xEDF2: 0x7085, - 0xEDF3: 0x70AB, - 0xEDF4: 0x710F, - 0xEDF5: 0x7104, - 0xEDF6: 0x715C, - 0xEDF7: 0x7146, - 0xEDF8: 0x7147, - 0xEDF9: 0xFA15, - 0xEDFA: 0x71C1, - 0xEDFB: 0x71FE, - 0xEDFC: 0x72B1, - 0xEE40: 0x72BE, - 0xEE41: 0x7324, - 0xEE42: 0xFA16, - 0xEE43: 0x7377, - 0xEE44: 0x73BD, - 0xEE45: 0x73C9, - 0xEE46: 0x73D6, - 0xEE47: 0x73E3, - 0xEE48: 0x73D2, - 0xEE49: 0x7407, - 0xEE4A: 0x73F5, - 0xEE4B: 0x7426, - 0xEE4C: 0x742A, - 0xEE4D: 0x7429, - 0xEE4E: 0x742E, - 0xEE4F: 0x7462, - 0xEE50: 0x7489, - 0xEE51: 0x749F, - 0xEE52: 0x7501, - 0xEE53: 0x756F, - 0xEE54: 0x7682, - 0xEE55: 0x769C, - 0xEE56: 0x769E, - 0xEE57: 0x769B, - 0xEE58: 0x76A6, - 0xEE59: 0xFA17, - 0xEE5A: 0x7746, - 0xEE5B: 0x52AF, - 0xEE5C: 0x7821, - 0xEE5D: 0x784E, - 0xEE5E: 0x7864, - 0xEE5F: 0x787A, - 0xEE60: 0x7930, - 0xEE61: 0xFA18, - 0xEE62: 0xFA19, - 0xEE63: 0xFA1A, - 0xEE64: 0x7994, - 0xEE65: 0xFA1B, - 0xEE66: 0x799B, - 0xEE67: 0x7AD1, - 0xEE68: 0x7AE7, - 0xEE69: 0xFA1C, - 0xEE6A: 0x7AEB, - 0xEE6B: 0x7B9E, - 0xEE6C: 0xFA1D, - 0xEE6D: 0x7D48, - 0xEE6E: 0x7D5C, - 0xEE6F: 0x7DB7, - 0xEE70: 0x7DA0, - 0xEE71: 0x7DD6, - 0xEE72: 0x7E52, - 0xEE73: 0x7F47, - 0xEE74: 0x7FA1, - 0xEE75: 0xFA1E, - 0xEE76: 0x8301, - 0xEE77: 0x8362, - 0xEE78: 0x837F, - 0xEE79: 0x83C7, - 0xEE7A: 0x83F6, - 0xEE7B: 0x8448, - 0xEE7C: 0x84B4, - 0xEE7D: 0x8553, - 0xEE7E: 0x8559, - 0xEE80: 0x856B, - 0xEE81: 0xFA1F, - 0xEE82: 0x85B0, - 0xEE83: 0xFA20, - 0xEE84: 0xFA21, - 0xEE85: 0x8807, - 0xEE86: 0x88F5, - 0xEE87: 0x8A12, - 0xEE88: 0x8A37, - 0xEE89: 0x8A79, - 0xEE8A: 0x8AA7, - 0xEE8B: 0x8ABE, - 0xEE8C: 0x8ADF, - 0xEE8D: 0xFA22, - 0xEE8E: 0x8AF6, - 0xEE8F: 0x8B53, - 0xEE90: 0x8B7F, - 0xEE91: 0x8CF0, - 0xEE92: 0x8CF4, - 0xEE93: 0x8D12, - 0xEE94: 0x8D76, - 0xEE95: 0xFA23, - 0xEE96: 0x8ECF, - 0xEE97: 0xFA24, - 0xEE98: 0xFA25, - 0xEE99: 0x9067, - 0xEE9A: 0x90DE, - 0xEE9B: 0xFA26, - 0xEE9C: 0x9115, - 0xEE9D: 0x9127, - 0xEE9E: 0x91DA, - 0xEE9F: 0x91D7, - 0xEEA0: 0x91DE, - 0xEEA1: 0x91ED, - 0xEEA2: 0x91EE, - 0xEEA3: 0x91E4, - 0xEEA4: 0x91E5, - 0xEEA5: 0x9206, - 0xEEA6: 0x9210, - 0xEEA7: 0x920A, - 0xEEA8: 0x923A, - 0xEEA9: 0x9240, - 0xEEAA: 0x923C, - 0xEEAB: 0x924E, - 0xEEAC: 0x9259, - 0xEEAD: 0x9251, - 0xEEAE: 0x9239, - 0xEEAF: 0x9267, - 0xEEB0: 0x92A7, - 0xEEB1: 0x9277, - 0xEEB2: 0x9278, - 0xEEB3: 0x92E7, - 0xEEB4: 0x92D7, - 0xEEB5: 0x92D9, - 0xEEB6: 0x92D0, - 0xEEB7: 0xFA27, - 0xEEB8: 0x92D5, - 0xEEB9: 0x92E0, - 0xEEBA: 0x92D3, - 0xEEBB: 0x9325, - 0xEEBC: 0x9321, - 0xEEBD: 0x92FB, - 0xEEBE: 0xFA28, - 0xEEBF: 0x931E, - 0xEEC0: 0x92FF, - 0xEEC1: 0x931D, - 0xEEC2: 0x9302, - 0xEEC3: 0x9370, - 0xEEC4: 0x9357, - 0xEEC5: 0x93A4, - 0xEEC6: 0x93C6, - 0xEEC7: 0x93DE, - 0xEEC8: 0x93F8, - 0xEEC9: 0x9431, - 0xEECA: 0x9445, - 0xEECB: 0x9448, - 0xEECC: 0x9592, - 0xEECD: 0xF9DC, - 0xEECE: 0xFA29, - 0xEECF: 0x969D, - 0xEED0: 0x96AF, - 0xEED1: 0x9733, - 0xEED2: 0x973B, - 0xEED3: 0x9743, - 0xEED4: 0x974D, - 0xEED5: 0x974F, - 0xEED6: 0x9751, - 0xEED7: 0x9755, - 0xEED8: 0x9857, - 0xEED9: 0x9865, - 0xEEDA: 0xFA2A, - 0xEEDB: 0xFA2B, - 0xEEDC: 0x9927, - 0xEEDD: 0xFA2C, - 0xEEDE: 0x999E, - 0xEEDF: 0x9A4E, - 0xEEE0: 0x9AD9, - 0xEEE1: 0x9ADC, - 0xEEE2: 0x9B75, - 0xEEE3: 0x9B72, - 0xEEE4: 0x9B8F, - 0xEEE5: 0x9BB1, - 0xEEE6: 0x9BBB, - 0xEEE7: 0x9C00, - 0xEEE8: 0x9D70, - 0xEEE9: 0x9D6B, - 0xEEEA: 0xFA2D, - 0xEEEB: 0x9E19, - 0xEEEC: 0x9ED1, - 0xEEEF: 0x2170, - 0xEEF0: 0x2171, - 0xEEF1: 0x2172, - 0xEEF2: 0x2173, - 0xEEF3: 0x2174, - 0xEEF4: 0x2175, - 0xEEF5: 0x2176, - 0xEEF6: 0x2177, - 0xEEF7: 0x2178, - 0xEEF8: 0x2179, - 0xEEF9: 0xFFE2, - 0xEEFA: 0xFFE4, - 0xEEFB: 0xFF07, - 0xEEFC: 0xFF02, - 0xFA40: 0x2170, - 0xFA41: 0x2171, - 0xFA42: 0x2172, - 0xFA43: 0x2173, - 0xFA44: 0x2174, - 0xFA45: 0x2175, - 0xFA46: 0x2176, - 0xFA47: 0x2177, - 0xFA48: 0x2178, - 0xFA49: 0x2179, - 0xFA4A: 0x2160, - 0xFA4B: 0x2161, - 0xFA4C: 0x2162, - 0xFA4D: 0x2163, - 0xFA4E: 0x2164, - 0xFA4F: 0x2165, - 0xFA50: 0x2166, - 0xFA51: 0x2167, - 0xFA52: 0x2168, - 0xFA53: 0x2169, - 0xFA54: 0xFFE2, - 0xFA55: 0xFFE4, - 0xFA56: 0xFF07, - 0xFA57: 0xFF02, - 0xFA58: 0x3231, - 0xFA59: 0x2116, - 0xFA5A: 0x2121, - 0xFA5B: 0x2235, - 0xFA5C: 0x7E8A, - 0xFA5D: 0x891C, - 0xFA5E: 0x9348, - 0xFA5F: 0x9288, - 0xFA60: 0x84DC, - 0xFA61: 0x4FC9, - 0xFA62: 0x70BB, - 0xFA63: 0x6631, - 0xFA64: 0x68C8, - 0xFA65: 0x92F9, - 0xFA66: 0x66FB, - 0xFA67: 0x5F45, - 0xFA68: 0x4E28, - 0xFA69: 0x4EE1, - 0xFA6A: 0x4EFC, - 0xFA6B: 0x4F00, - 0xFA6C: 0x4F03, - 0xFA6D: 0x4F39, - 0xFA6E: 0x4F56, - 0xFA6F: 0x4F92, - 0xFA70: 0x4F8A, - 0xFA71: 0x4F9A, - 0xFA72: 0x4F94, - 0xFA73: 0x4FCD, - 0xFA74: 0x5040, - 0xFA75: 0x5022, - 0xFA76: 0x4FFF, - 0xFA77: 0x501E, - 0xFA78: 0x5046, - 0xFA79: 0x5070, - 0xFA7A: 0x5042, - 0xFA7B: 0x5094, - 0xFA7C: 0x50F4, - 0xFA7D: 0x50D8, - 0xFA7E: 0x514A, - 0xFA80: 0x5164, - 0xFA81: 0x519D, - 0xFA82: 0x51BE, - 0xFA83: 0x51EC, - 0xFA84: 0x5215, - 0xFA85: 0x529C, - 0xFA86: 0x52A6, - 0xFA87: 0x52C0, - 0xFA88: 0x52DB, - 0xFA89: 0x5300, - 0xFA8A: 0x5307, - 0xFA8B: 0x5324, - 0xFA8C: 0x5372, - 0xFA8D: 0x5393, - 0xFA8E: 0x53B2, - 0xFA8F: 0x53DD, - 0xFA90: 0xFA0E, - 0xFA91: 0x549C, - 0xFA92: 0x548A, - 0xFA93: 0x54A9, - 0xFA94: 0x54FF, - 0xFA95: 0x5586, - 0xFA96: 0x5759, - 0xFA97: 0x5765, - 0xFA98: 0x57AC, - 0xFA99: 0x57C8, - 0xFA9A: 0x57C7, - 0xFA9B: 0xFA0F, - 0xFA9C: 0xFA10, - 0xFA9D: 0x589E, - 0xFA9E: 0x58B2, - 0xFA9F: 0x590B, - 0xFAA0: 0x5953, - 0xFAA1: 0x595B, - 0xFAA2: 0x595D, - 0xFAA3: 0x5963, - 0xFAA4: 0x59A4, - 0xFAA5: 0x59BA, - 0xFAA6: 0x5B56, - 0xFAA7: 0x5BC0, - 0xFAA8: 0x752F, - 0xFAA9: 0x5BD8, - 0xFAAA: 0x5BEC, - 0xFAAB: 0x5C1E, - 0xFAAC: 0x5CA6, - 0xFAAD: 0x5CBA, - 0xFAAE: 0x5CF5, - 0xFAAF: 0x5D27, - 0xFAB0: 0x5D53, - 0xFAB1: 0xFA11, - 0xFAB2: 0x5D42, - 0xFAB3: 0x5D6D, - 0xFAB4: 0x5DB8, - 0xFAB5: 0x5DB9, - 0xFAB6: 0x5DD0, - 0xFAB7: 0x5F21, - 0xFAB8: 0x5F34, - 0xFAB9: 0x5F67, - 0xFABA: 0x5FB7, - 0xFABB: 0x5FDE, - 0xFABC: 0x605D, - 0xFABD: 0x6085, - 0xFABE: 0x608A, - 0xFABF: 0x60DE, - 0xFAC0: 0x60D5, - 0xFAC1: 0x6120, - 0xFAC2: 0x60F2, - 0xFAC3: 0x6111, - 0xFAC4: 0x6137, - 0xFAC5: 0x6130, - 0xFAC6: 0x6198, - 0xFAC7: 0x6213, - 0xFAC8: 0x62A6, - 0xFAC9: 0x63F5, - 0xFACA: 0x6460, - 0xFACB: 0x649D, - 0xFACC: 0x64CE, - 0xFACD: 0x654E, - 0xFACE: 0x6600, - 0xFACF: 0x6615, - 0xFAD0: 0x663B, - 0xFAD1: 0x6609, - 0xFAD2: 0x662E, - 0xFAD3: 0x661E, - 0xFAD4: 0x6624, - 0xFAD5: 0x6665, - 0xFAD6: 0x6657, - 0xFAD7: 0x6659, - 0xFAD8: 0xFA12, - 0xFAD9: 0x6673, - 0xFADA: 0x6699, - 0xFADB: 0x66A0, - 0xFADC: 0x66B2, - 0xFADD: 0x66BF, - 0xFADE: 0x66FA, - 0xFADF: 0x670E, - 0xFAE0: 0xF929, - 0xFAE1: 0x6766, - 0xFAE2: 0x67BB, - 0xFAE3: 0x6852, - 0xFAE4: 0x67C0, - 0xFAE5: 0x6801, - 0xFAE6: 0x6844, - 0xFAE7: 0x68CF, - 0xFAE8: 0xFA13, - 0xFAE9: 0x6968, - 0xFAEA: 0xFA14, - 0xFAEB: 0x6998, - 0xFAEC: 0x69E2, - 0xFAED: 0x6A30, - 0xFAEE: 0x6A6B, - 0xFAEF: 0x6A46, - 0xFAF0: 0x6A73, - 0xFAF1: 0x6A7E, - 0xFAF2: 0x6AE2, - 0xFAF3: 0x6AE4, - 0xFAF4: 0x6BD6, - 0xFAF5: 0x6C3F, - 0xFAF6: 0x6C5C, - 0xFAF7: 0x6C86, - 0xFAF8: 0x6C6F, - 0xFAF9: 0x6CDA, - 0xFAFA: 0x6D04, - 0xFAFB: 0x6D87, - 0xFAFC: 0x6D6F, - 0xFB40: 0x6D96, - 0xFB41: 0x6DAC, - 0xFB42: 0x6DCF, - 0xFB43: 0x6DF8, - 0xFB44: 0x6DF2, - 0xFB45: 0x6DFC, - 0xFB46: 0x6E39, - 0xFB47: 0x6E5C, - 0xFB48: 0x6E27, - 0xFB49: 0x6E3C, - 0xFB4A: 0x6EBF, - 0xFB4B: 0x6F88, - 0xFB4C: 0x6FB5, - 0xFB4D: 0x6FF5, - 0xFB4E: 0x7005, - 0xFB4F: 0x7007, - 0xFB50: 0x7028, - 0xFB51: 0x7085, - 0xFB52: 0x70AB, - 0xFB53: 0x710F, - 0xFB54: 0x7104, - 0xFB55: 0x715C, - 0xFB56: 0x7146, - 0xFB57: 0x7147, - 0xFB58: 0xFA15, - 0xFB59: 0x71C1, - 0xFB5A: 0x71FE, - 0xFB5B: 0x72B1, - 0xFB5C: 0x72BE, - 0xFB5D: 0x7324, - 0xFB5E: 0xFA16, - 0xFB5F: 0x7377, - 0xFB60: 0x73BD, - 0xFB61: 0x73C9, - 0xFB62: 0x73D6, - 0xFB63: 0x73E3, - 0xFB64: 0x73D2, - 0xFB65: 0x7407, - 0xFB66: 0x73F5, - 0xFB67: 0x7426, - 0xFB68: 0x742A, - 0xFB69: 0x7429, - 0xFB6A: 0x742E, - 0xFB6B: 0x7462, - 0xFB6C: 0x7489, - 0xFB6D: 0x749F, - 0xFB6E: 0x7501, - 0xFB6F: 0x756F, - 0xFB70: 0x7682, - 0xFB71: 0x769C, - 0xFB72: 0x769E, - 0xFB73: 0x769B, - 0xFB74: 0x76A6, - 0xFB75: 0xFA17, - 0xFB76: 0x7746, - 0xFB77: 0x52AF, - 0xFB78: 0x7821, - 0xFB79: 0x784E, - 0xFB7A: 0x7864, - 0xFB7B: 0x787A, - 0xFB7C: 0x7930, - 0xFB7D: 0xFA18, - 0xFB7E: 0xFA19, - 0xFB80: 0xFA1A, - 0xFB81: 0x7994, - 0xFB82: 0xFA1B, - 0xFB83: 0x799B, - 0xFB84: 0x7AD1, - 0xFB85: 0x7AE7, - 0xFB86: 0xFA1C, - 0xFB87: 0x7AEB, - 0xFB88: 0x7B9E, - 0xFB89: 0xFA1D, - 0xFB8A: 0x7D48, - 0xFB8B: 0x7D5C, - 0xFB8C: 0x7DB7, - 0xFB8D: 0x7DA0, - 0xFB8E: 0x7DD6, - 0xFB8F: 0x7E52, - 0xFB90: 0x7F47, - 0xFB91: 0x7FA1, - 0xFB92: 0xFA1E, - 0xFB93: 0x8301, - 0xFB94: 0x8362, - 0xFB95: 0x837F, - 0xFB96: 0x83C7, - 0xFB97: 0x83F6, - 0xFB98: 0x8448, - 0xFB99: 0x84B4, - 0xFB9A: 0x8553, - 0xFB9B: 0x8559, - 0xFB9C: 0x856B, - 0xFB9D: 0xFA1F, - 0xFB9E: 0x85B0, - 0xFB9F: 0xFA20, - 0xFBA0: 0xFA21, - 0xFBA1: 0x8807, - 0xFBA2: 0x88F5, - 0xFBA3: 0x8A12, - 0xFBA4: 0x8A37, - 0xFBA5: 0x8A79, - 0xFBA6: 0x8AA7, - 0xFBA7: 0x8ABE, - 0xFBA8: 0x8ADF, - 0xFBA9: 0xFA22, - 0xFBAA: 0x8AF6, - 0xFBAB: 0x8B53, - 0xFBAC: 0x8B7F, - 0xFBAD: 0x8CF0, - 0xFBAE: 0x8CF4, - 0xFBAF: 0x8D12, - 0xFBB0: 0x8D76, - 0xFBB1: 0xFA23, - 0xFBB2: 0x8ECF, - 0xFBB3: 0xFA24, - 0xFBB4: 0xFA25, - 0xFBB5: 0x9067, - 0xFBB6: 0x90DE, - 0xFBB7: 0xFA26, - 0xFBB8: 0x9115, - 0xFBB9: 0x9127, - 0xFBBA: 0x91DA, - 0xFBBB: 0x91D7, - 0xFBBC: 0x91DE, - 0xFBBD: 0x91ED, - 0xFBBE: 0x91EE, - 0xFBBF: 0x91E4, - 0xFBC0: 0x91E5, - 0xFBC1: 0x9206, - 0xFBC2: 0x9210, - 0xFBC3: 0x920A, - 0xFBC4: 0x923A, - 0xFBC5: 0x9240, - 0xFBC6: 0x923C, - 0xFBC7: 0x924E, - 0xFBC8: 0x9259, - 0xFBC9: 0x9251, - 0xFBCA: 0x9239, - 0xFBCB: 0x9267, - 0xFBCC: 0x92A7, - 0xFBCD: 0x9277, - 0xFBCE: 0x9278, - 0xFBCF: 0x92E7, - 0xFBD0: 0x92D7, - 0xFBD1: 0x92D9, - 0xFBD2: 0x92D0, - 0xFBD3: 0xFA27, - 0xFBD4: 0x92D5, - 0xFBD5: 0x92E0, - 0xFBD6: 0x92D3, - 0xFBD7: 0x9325, - 0xFBD8: 0x9321, - 0xFBD9: 0x92FB, - 0xFBDA: 0xFA28, - 0xFBDB: 0x931E, - 0xFBDC: 0x92FF, - 0xFBDD: 0x931D, - 0xFBDE: 0x9302, - 0xFBDF: 0x9370, - 0xFBE0: 0x9357, - 0xFBE1: 0x93A4, - 0xFBE2: 0x93C6, - 0xFBE3: 0x93DE, - 0xFBE4: 0x93F8, - 0xFBE5: 0x9431, - 0xFBE6: 0x9445, - 0xFBE7: 0x9448, - 0xFBE8: 0x9592, - 0xFBE9: 0xF9DC, - 0xFBEA: 0xFA29, - 0xFBEB: 0x969D, - 0xFBEC: 0x96AF, - 0xFBED: 0x9733, - 0xFBEE: 0x973B, - 0xFBEF: 0x9743, - 0xFBF0: 0x974D, - 0xFBF1: 0x974F, - 0xFBF2: 0x9751, - 0xFBF3: 0x9755, - 0xFBF4: 0x9857, - 0xFBF5: 0x9865, - 0xFBF6: 0xFA2A, - 0xFBF7: 0xFA2B, - 0xFBF8: 0x9927, - 0xFBF9: 0xFA2C, - 0xFBFA: 0x999E, - 0xFBFB: 0x9A4E, - 0xFBFC: 0x9AD9, - 0xFC40: 0x9ADC, - 0xFC41: 0x9B75, - 0xFC42: 0x9B72, - 0xFC43: 0x9B8F, - 0xFC44: 0x9BB1, - 0xFC45: 0x9BBB, - 0xFC46: 0x9C00, - 0xFC47: 0x9D70, - 0xFC48: 0x9D6B, - 0xFC49: 0xFA2D, - 0xFC4A: 0x9E19, - 0xFC4B: 0x9ED1, -} diff --git a/vendor/github.com/Tang-RoseChild/mahonia/shiftjis.go b/vendor/github.com/Tang-RoseChild/mahonia/shiftjis.go deleted file mode 100644 index d0b4cbc04..000000000 --- a/vendor/github.com/Tang-RoseChild/mahonia/shiftjis.go +++ /dev/null @@ -1,88 +0,0 @@ -package mahonia - -// Converters for the Shift-JIS encoding. - -import ( - "unicode/utf8" -) - -func init() { - RegisterCharset(&Charset{ - Name: "Shift_JIS", - Aliases: []string{"MS_Kanji", "csShiftJIS", "SJIS", "ibm-943", "windows-31j", "cp932", "windows-932"}, - NewDecoder: func() Decoder { - return decodeSJIS - }, - NewEncoder: func() Encoder { - shiftJISOnce.Do(reverseShiftJISTable) - return encodeSJIS - }, - }) -} - -func decodeSJIS(p []byte) (c rune, size int, status Status) { - if len(p) == 0 { - return 0, 0, NO_ROOM - } - - b := p[0] - if b < 0x80 { - return rune(b), 1, SUCCESS - } - - if 0xa1 <= b && b <= 0xdf { - return rune(b) + (0xff61 - 0xa1), 1, SUCCESS - } - - if b == 0x80 || b == 0xa0 { - return utf8.RuneError, 1, INVALID_CHAR - } - - if len(p) < 2 { - return 0, 0, NO_ROOM - } - - jis := int(b)<<8 + int(p[1]) - c = rune(shiftJISToUnicode[jis]) - - if c == 0 { - return utf8.RuneError, 2, INVALID_CHAR - } - return c, 2, SUCCESS -} - -func encodeSJIS(p []byte, c rune) (size int, status Status) { - if len(p) == 0 { - return 0, NO_ROOM - } - - if c < 0x80 { - p[0] = byte(c) - return 1, SUCCESS - } - - if 0xff61 <= c && c <= 0xff9f { - // half-width katakana - p[0] = byte(c - (0xff61 - 0xa1)) - return 1, SUCCESS - } - - if len(p) < 2 { - return 0, NO_ROOM - } - - if c > 0xffff { - p[0] = '?' - return 1, INVALID_CHAR - } - - jis := unicodeToShiftJIS[c] - if jis == 0 { - p[0] = '?' - return 1, INVALID_CHAR - } - - p[0] = byte(jis >> 8) - p[1] = byte(jis) - return 2, SUCCESS -} diff --git a/vendor/github.com/Tang-RoseChild/mahonia/tcvn3.go b/vendor/github.com/Tang-RoseChild/mahonia/tcvn3.go deleted file mode 100644 index 7d033d0b9..000000000 --- a/vendor/github.com/Tang-RoseChild/mahonia/tcvn3.go +++ /dev/null @@ -1,228 +0,0 @@ -package mahonia - -// Converters for TCVN3 encoding. - -import ( - "sync" -) - -var ( - onceTCVN3 sync.Once - dataTCVN3 = struct { - UnicodeToWord map[rune][2]byte - WordToUnicode [256]struct { - r rune - m *[256]rune - } - }{} -) - -func init() { - p := new(Charset) - p.Name = "TCVN3" - p.NewDecoder = func() Decoder { - onceTCVN3.Do(buildTCVN3Tables) - return decodeTCVN3 - } - p.NewEncoder = func() Encoder { - onceTCVN3.Do(buildTCVN3Tables) - return encodeTCVN3 - } - RegisterCharset(p) -} - -func decodeTCVN3(p []byte) (rune, int, Status) { - if len(p) == 0 { - return 0, 0, NO_ROOM - } - item := &dataTCVN3.WordToUnicode[p[0]] - if item.m != nil && len(p) > 1 { - if r := item.m[p[1]]; r != 0 { - return r, 2, SUCCESS - } - } - if item.r != 0 { - return item.r, 1, SUCCESS - } - if p[0] < 0x80 { - return rune(p[0]), 1, SUCCESS - } - return '?', 1, INVALID_CHAR -} - -func encodeTCVN3(p []byte, c rune) (int, Status) { - if len(p) == 0 { - return 0, NO_ROOM - } - if c < rune(0x80) { - p[0] = byte(c) - return 1, SUCCESS - } - if v, ok := dataTCVN3.UnicodeToWord[c]; ok { - if v[1] != 0 { - if len(p) < 2 { - return 0, NO_ROOM - } - p[0] = v[0] - p[1] = v[1] - return 2, SUCCESS - } else { - p[0] = v[0] - return 1, SUCCESS - } - } - p[0] = '?' - return 1, INVALID_CHAR -} - -func buildTCVN3Tables() { - dataTCVN3.UnicodeToWord = map[rune][2]byte{ - // one byte - 0x00C2: {0xA2, 0x00}, - 0x00CA: {0xA3, 0x00}, - 0x00D4: {0xA4, 0x00}, - 0x00E0: {0xB5, 0x00}, - 0x00E1: {0xB8, 0x00}, - 0x00E2: {0xA9, 0x00}, - 0x00E3: {0xB7, 0x00}, - 0x00E8: {0xCC, 0x00}, - 0x00E9: {0xD0, 0x00}, - 0x00EA: {0xAA, 0x00}, - 0x00EC: {0xD7, 0x00}, - 0x00ED: {0xDD, 0x00}, - 0x00F2: {0xDF, 0x00}, - 0x00F3: {0xE3, 0x00}, - 0x00F4: {0xAB, 0x00}, - 0x00F5: {0xE2, 0x00}, - 0x00F9: {0xEF, 0x00}, - 0x00FA: {0xF3, 0x00}, - 0x00FD: {0xFD, 0x00}, - 0x0102: {0xA1, 0x00}, - 0x0103: {0xA8, 0x00}, - 0x0110: {0xA7, 0x00}, - 0x0111: {0xAE, 0x00}, - 0x0129: {0xDC, 0x00}, - 0x0169: {0xF2, 0x00}, - 0x01A0: {0xA5, 0x00}, - 0x01A1: {0xAC, 0x00}, - 0x01AF: {0xA6, 0x00}, - 0x01B0: {0xAD, 0x00}, - 0x1EA1: {0xB9, 0x00}, - 0x1EA3: {0xB6, 0x00}, - 0x1EA5: {0xCA, 0x00}, - 0x1EA7: {0xC7, 0x00}, - 0x1EA9: {0xC8, 0x00}, - 0x1EAB: {0xC9, 0x00}, - 0x1EAD: {0xCB, 0x00}, - 0x1EAF: {0xBE, 0x00}, - 0x1EB1: {0xBB, 0x00}, - 0x1EB3: {0xBC, 0x00}, - 0x1EB5: {0xBD, 0x00}, - 0x1EB7: {0xC6, 0x00}, - 0x1EB9: {0xD1, 0x00}, - 0x1EBB: {0xCE, 0x00}, - 0x1EBD: {0xCF, 0x00}, - 0x1EBF: {0xD5, 0x00}, - 0x1EC1: {0xD2, 0x00}, - 0x1EC3: {0xD3, 0x00}, - 0x1EC5: {0xD4, 0x00}, - 0x1EC7: {0xD6, 0x00}, - 0x1EC9: {0xD8, 0x00}, - 0x1ECB: {0xDE, 0x00}, - 0x1ECD: {0xE4, 0x00}, - 0x1ECF: {0xE1, 0x00}, - 0x1ED1: {0xE8, 0x00}, - 0x1ED3: {0xE5, 0x00}, - 0x1ED5: {0xE6, 0x00}, - 0x1ED7: {0xE7, 0x00}, - 0x1ED9: {0xE9, 0x00}, - 0x1EDB: {0xED, 0x00}, - 0x1EDD: {0xEA, 0x00}, - 0x1EDF: {0xEB, 0x00}, - 0x1EE1: {0xEC, 0x00}, - 0x1EE3: {0xEE, 0x00}, - 0x1EE5: {0xF4, 0x00}, - 0x1EE7: {0xF1, 0x00}, - 0x1EE9: {0xF8, 0x00}, - 0x1EEB: {0xF5, 0x00}, - 0x1EED: {0xF6, 0x00}, - 0x1EEF: {0xF7, 0x00}, - 0x1EF1: {0xF9, 0x00}, - 0x1EF3: {0xFA, 0x00}, - 0x1EF5: {0xFE, 0x00}, - 0x1EF7: {0xFB, 0x00}, - 0x1EF9: {0xFC, 0x00}, - // two bytes - 0x00C0: {0x41, 0xB5}, - 0x00C1: {0x41, 0xB8}, - 0x00C3: {0x41, 0xB7}, - 0x00C8: {0x45, 0xCC}, - 0x00C9: {0x45, 0xD0}, - 0x00CC: {0x49, 0xD7}, - 0x00CD: {0x49, 0xDD}, - 0x00D2: {0x4F, 0xDF}, - 0x00D3: {0x4F, 0xE3}, - 0x00D5: {0x4F, 0xE2}, - 0x00D9: {0x55, 0xEF}, - 0x00DA: {0x55, 0xF3}, - 0x00DD: {0x59, 0xFD}, - 0x0128: {0x49, 0xDC}, - 0x0168: {0x55, 0xF2}, - 0x1EA0: {0x41, 0xB9}, - 0x1EA2: {0x41, 0xB6}, - 0x1EA4: {0xA2, 0xCA}, - 0x1EA6: {0xA2, 0xC7}, - 0x1EA8: {0xA2, 0xC8}, - 0x1EAA: {0xA2, 0xC9}, - 0x1EAC: {0xA2, 0xCB}, - 0x1EAE: {0xA1, 0xBE}, - 0x1EB0: {0xA1, 0xBB}, - 0x1EB2: {0xA1, 0xBC}, - 0x1EB4: {0xA1, 0xBD}, - 0x1EB6: {0xA1, 0xC6}, - 0x1EB8: {0x45, 0xD1}, - 0x1EBA: {0x45, 0xCE}, - 0x1EBC: {0x45, 0xCF}, - 0x1EBE: {0xA3, 0xD5}, - 0x1EC0: {0xA3, 0xD2}, - 0x1EC2: {0xA3, 0xD3}, - 0x1EC4: {0xA3, 0xD4}, - 0x1EC6: {0xA3, 0xD6}, - 0x1EC8: {0x49, 0xD8}, - 0x1ECA: {0x49, 0xDE}, - 0x1ECC: {0x4F, 0xE4}, - 0x1ECE: {0x4F, 0xE1}, - 0x1ED0: {0xA4, 0xE8}, - 0x1ED2: {0xA4, 0xE5}, - 0x1ED4: {0xA4, 0xE6}, - 0x1ED6: {0xA4, 0xE7}, - 0x1ED8: {0xA4, 0xE9}, - 0x1EDA: {0xA5, 0xED}, - 0x1EDC: {0xA5, 0xEA}, - 0x1EDE: {0xA5, 0xEB}, - 0x1EE0: {0xA5, 0xEC}, - 0x1EE2: {0xA5, 0xEE}, - 0x1EE4: {0x55, 0xF4}, - 0x1EE6: {0x55, 0xF1}, - 0x1EE8: {0xA6, 0xF8}, - 0x1EEA: {0xA6, 0xF5}, - 0x1EEC: {0xA6, 0xF6}, - 0x1EEE: {0xA6, 0xF7}, - 0x1EF0: {0xA6, 0xF9}, - 0x1EF2: {0x59, 0xFA}, - 0x1EF4: {0x59, 0xFE}, - 0x1EF6: {0x59, 0xFB}, - 0x1EF8: {0x59, 0xFC}, - } - for r, b := range dataTCVN3.UnicodeToWord { - item := &dataTCVN3.WordToUnicode[b[0]] - if b[1] == 0 { - item.r = r - } else { - if item.m == nil { - item.m = new([256]rune) - } - item.m[b[1]] = r - } - } -} diff --git a/vendor/github.com/Tang-RoseChild/mahonia/translate.go b/vendor/github.com/Tang-RoseChild/mahonia/translate.go deleted file mode 100644 index ea4158448..000000000 --- a/vendor/github.com/Tang-RoseChild/mahonia/translate.go +++ /dev/null @@ -1,50 +0,0 @@ -package mahonia - -import "unicode/utf8" - -// Translate enables a Decoder to implement go-charset's Translator interface. -func (d Decoder) Translate(data []byte, eof bool) (n int, cdata []byte, err error) { - cdata = make([]byte, len(data)+1) - destPos := 0 - - for n < len(data) { - rune, size, status := d(data[n:]) - - switch status { - case STATE_ONLY: - n += size - continue - - case NO_ROOM: - if !eof { - return n, cdata[:destPos], nil - } - rune = 0xfffd - n = len(data) - - default: - n += size - } - - if rune < 128 { - if destPos >= len(cdata) { - cdata = doubleLength(cdata) - } - cdata[destPos] = byte(rune) - destPos++ - } else { - if destPos+utf8.RuneLen(rune) > len(cdata) { - cdata = doubleLength(cdata) - } - destPos += utf8.EncodeRune(cdata[destPos:], rune) - } - } - - return n, cdata[:destPos], nil -} - -func doubleLength(b []byte) []byte { - b2 := make([]byte, 2*len(b)) - copy(b2, b) - return b2 -} diff --git a/vendor/github.com/Tang-RoseChild/mahonia/utf16.go b/vendor/github.com/Tang-RoseChild/mahonia/utf16.go deleted file mode 100644 index 3ec7b7702..000000000 --- a/vendor/github.com/Tang-RoseChild/mahonia/utf16.go +++ /dev/null @@ -1,170 +0,0 @@ -package mahonia - -import ( - "unicode/utf16" -) - -func init() { - for i := 0; i < len(utf16Charsets); i++ { - RegisterCharset(&utf16Charsets[i]) - } -} - -var utf16Charsets = []Charset{ - { - Name: "UTF-16", - NewDecoder: func() Decoder { - var decodeRune Decoder - return func(p []byte) (c rune, size int, status Status) { - if decodeRune == nil { - // haven't read the BOM yet - if len(p) < 2 { - status = NO_ROOM - return - } - - switch { - case p[0] == 0xfe && p[1] == 0xff: - decodeRune = decodeUTF16beRune - return 0, 2, STATE_ONLY - case p[0] == 0xff && p[1] == 0xfe: - decodeRune = decodeUTF16leRune - return 0, 2, STATE_ONLY - default: - decodeRune = decodeUTF16beRune - } - } - - return decodeRune(p) - } - }, - NewEncoder: func() Encoder { - wroteBOM := false - return func(p []byte, c rune) (size int, status Status) { - if !wroteBOM { - if len(p) < 2 { - status = NO_ROOM - return - } - - p[0] = 0xfe - p[1] = 0xff - wroteBOM = true - return 2, STATE_ONLY - } - - return encodeUTF16beRune(p, c) - } - }, - }, - { - Name: "UTF-16BE", - NewDecoder: func() Decoder { return decodeUTF16beRune }, - NewEncoder: func() Encoder { return encodeUTF16beRune }, - }, - { - Name: "UTF-16LE", - NewDecoder: func() Decoder { return decodeUTF16leRune }, - NewEncoder: func() Encoder { return encodeUTF16leRune }, - }, -} - -func decodeUTF16beRune(p []byte) (r rune, size int, status Status) { - if len(p) < 2 { - status = NO_ROOM - return - } - - c := rune(p[0])<<8 + rune(p[1]) - - if utf16.IsSurrogate(c) { - if len(p) < 4 { - status = NO_ROOM - return - } - - c2 := rune(p[2])<<8 + rune(p[3]) - c = utf16.DecodeRune(c, c2) - - if c == 0xfffd { - return c, 2, INVALID_CHAR - } else { - return c, 4, SUCCESS - } - } - - return c, 2, SUCCESS -} - -func encodeUTF16beRune(p []byte, c rune) (size int, status Status) { - if c < 0x10000 { - if len(p) < 2 { - status = NO_ROOM - return - } - p[0] = byte(c >> 8) - p[1] = byte(c) - return 2, SUCCESS - } - - if len(p) < 4 { - status = NO_ROOM - return - } - s1, s2 := utf16.EncodeRune(c) - p[0] = byte(s1 >> 8) - p[1] = byte(s1) - p[2] = byte(s2 >> 8) - p[3] = byte(s2) - return 4, SUCCESS -} - -func decodeUTF16leRune(p []byte) (r rune, size int, status Status) { - if len(p) < 2 { - status = NO_ROOM - return - } - - c := rune(p[1])<<8 + rune(p[0]) - - if utf16.IsSurrogate(c) { - if len(p) < 4 { - status = NO_ROOM - return - } - - c2 := rune(p[3])<<8 + rune(p[2]) - c = utf16.DecodeRune(c, c2) - - if c == 0xfffd { - return c, 2, INVALID_CHAR - } else { - return c, 4, SUCCESS - } - } - - return c, 2, SUCCESS -} - -func encodeUTF16leRune(p []byte, c rune) (size int, status Status) { - if c < 0x10000 { - if len(p) < 2 { - status = NO_ROOM - return - } - p[1] = byte(c >> 8) - p[0] = byte(c) - return 2, SUCCESS - } - - if len(p) < 4 { - status = NO_ROOM - return - } - s1, s2 := utf16.EncodeRune(c) - p[1] = byte(s1 >> 8) - p[0] = byte(s1) - p[3] = byte(s2 >> 8) - p[2] = byte(s2) - return 4, SUCCESS -} diff --git a/vendor/github.com/Tang-RoseChild/mahonia/utf8.go b/vendor/github.com/Tang-RoseChild/mahonia/utf8.go deleted file mode 100644 index b14010911..000000000 --- a/vendor/github.com/Tang-RoseChild/mahonia/utf8.go +++ /dev/null @@ -1,45 +0,0 @@ -package mahonia - -import "unicode/utf8" - -func init() { - RegisterCharset(&Charset{ - Name: "UTF-8", - NewDecoder: func() Decoder { return decodeUTF8Rune }, - NewEncoder: func() Encoder { return encodeUTF8Rune }, - }) -} - -func decodeUTF8Rune(p []byte) (c rune, size int, status Status) { - if len(p) == 0 { - status = NO_ROOM - return - } - - if p[0] < 128 { - return rune(p[0]), 1, SUCCESS - } - - c, size = utf8.DecodeRune(p) - - if c == 0xfffd { - if utf8.FullRune(p) { - status = INVALID_CHAR - return - } - - return 0, 0, NO_ROOM - } - - status = SUCCESS - return -} - -func encodeUTF8Rune(p []byte, c rune) (size int, status Status) { - size = utf8.RuneLen(c) - if size > len(p) { - return 0, NO_ROOM - } - - return utf8.EncodeRune(p, c), SUCCESS -} diff --git a/vendor/github.com/Tang-RoseChild/mahonia/writer.go b/vendor/github.com/Tang-RoseChild/mahonia/writer.go deleted file mode 100644 index bdeb519c0..000000000 --- a/vendor/github.com/Tang-RoseChild/mahonia/writer.go +++ /dev/null @@ -1,108 +0,0 @@ -package mahonia - -import ( - "io" - "unicode/utf8" -) - -// Writer implements character-set encoding for an io.Writer object. -type Writer struct { - wr io.Writer - encode Encoder - inbuf []byte - outbuf []byte -} - -// NewWriter creates a new Writer that uses the receiver to encode text. -func (e Encoder) NewWriter(wr io.Writer) *Writer { - w := new(Writer) - w.wr = wr - w.encode = e - return w -} - -// Write encodes and writes the data from p. -func (w *Writer) Write(p []byte) (n int, err error) { - n = len(p) - - if len(w.inbuf) > 0 { - w.inbuf = append(w.inbuf, p...) - p = w.inbuf - } - - if len(w.outbuf) < len(p) { - w.outbuf = make([]byte, len(p)+10) - } - - outpos := 0 - - for len(p) > 0 { - rune, size := utf8.DecodeRune(p) - if rune == 0xfffd && !utf8.FullRune(p) { - break - } - - p = p[size:] - - retry: - size, status := w.encode(w.outbuf[outpos:], rune) - - if status == NO_ROOM { - newDest := make([]byte, len(w.outbuf)*2) - copy(newDest, w.outbuf) - w.outbuf = newDest - goto retry - } - - if status == STATE_ONLY { - outpos += size - goto retry - } - - outpos += size - } - - w.inbuf = w.inbuf[:0] - if len(p) > 0 { - w.inbuf = append(w.inbuf, p...) - } - - n1, err := w.wr.Write(w.outbuf[0:outpos]) - - if err != nil && n1 < n { - n = n1 - } - - return -} - -func (w *Writer) WriteRune(c rune) (size int, err error) { - if len(w.inbuf) > 0 { - // There are leftover bytes, a partial UTF-8 sequence. - w.inbuf = w.inbuf[:0] - w.WriteRune(0xfffd) - } - - if w.outbuf == nil { - w.outbuf = make([]byte, 16) - } - - outpos := 0 - -retry: - size, status := w.encode(w.outbuf[outpos:], c) - - if status == NO_ROOM { - w.outbuf = make([]byte, len(w.outbuf)*2) - goto retry - } - - if status == STATE_ONLY { - outpos += size - goto retry - } - - outpos += size - - return w.wr.Write(w.outbuf[0:outpos]) -} diff --git a/vendor/github.com/Unknwon/com/LICENSE b/vendor/github.com/Unknwon/com/LICENSE deleted file mode 100644 index 8405e89a0..000000000 --- a/vendor/github.com/Unknwon/com/LICENSE +++ /dev/null @@ -1,191 +0,0 @@ -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and -distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright -owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities -that control, are controlled by, or are under common control with that entity. -For the purposes of this definition, "control" means (i) the power, direct or -indirect, to cause the direction or management of such entity, whether by -contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the -outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising -permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including -but not limited to software source code, documentation source, and configuration -files. - -"Object" form shall mean any form resulting from mechanical transformation or -translation of a Source form, including but not limited to compiled object code, -generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made -available under the License, as indicated by a copyright notice that is included -in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that -is based on (or derived from) the Work and for which the editorial revisions, -annotations, elaborations, or other modifications represent, as a whole, an -original work of authorship. For the purposes of this License, Derivative Works -shall not include works that remain separable from, or merely link (or bind by -name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version -of the Work and any modifications or additions to that Work or Derivative Works -thereof, that is intentionally submitted to Licensor for inclusion in the Work -by the copyright owner or by an individual or Legal Entity authorized to submit -on behalf of the copyright owner. For the purposes of this definition, -"submitted" means any form of electronic, verbal, or written communication sent -to the Licensor or its representatives, including but not limited to -communication on electronic mailing lists, source code control systems, and -issue tracking systems that are managed by, or on behalf of, the Licensor for -the purpose of discussing and improving the Work, but excluding communication -that is conspicuously marked or otherwise designated in writing by the copyright -owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf -of whom a Contribution has been received by Licensor and subsequently -incorporated within the Work. - -2. Grant of Copyright License. - -Subject to the terms and conditions of this License, each Contributor hereby -grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, -irrevocable copyright license to reproduce, prepare Derivative Works of, -publicly display, publicly perform, sublicense, and distribute the Work and such -Derivative Works in Source or Object form. - -3. Grant of Patent License. - -Subject to the terms and conditions of this License, each Contributor hereby -grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, -irrevocable (except as stated in this section) patent license to make, have -made, use, offer to sell, sell, import, and otherwise transfer the Work, where -such license applies only to those patent claims licensable by such Contributor -that are necessarily infringed by their Contribution(s) alone or by combination -of their Contribution(s) with the Work to which such Contribution(s) was -submitted. If You institute patent litigation against any entity (including a -cross-claim or counterclaim in a lawsuit) alleging that the Work or a -Contribution incorporated within the Work constitutes direct or contributory -patent infringement, then any patent licenses granted to You under this License -for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. - -You may reproduce and distribute copies of the Work or Derivative Works thereof -in any medium, with or without modifications, and in Source or Object form, -provided that You meet the following conditions: - -You must give any other recipients of the Work or Derivative Works a copy of -this License; and -You must cause any modified files to carry prominent notices stating that You -changed the files; and -You must retain, in the Source form of any Derivative Works that You distribute, -all copyright, patent, trademark, and attribution notices from the Source form -of the Work, excluding those notices that do not pertain to any part of the -Derivative Works; and -If the Work includes a "NOTICE" text file as part of its distribution, then any -Derivative Works that You distribute must include a readable copy of the -attribution notices contained within such NOTICE file, excluding those notices -that do not pertain to any part of the Derivative Works, in at least one of the -following places: within a NOTICE text file distributed as part of the -Derivative Works; within the Source form or documentation, if provided along -with the Derivative Works; or, within a display generated by the Derivative -Works, if and wherever such third-party notices normally appear. The contents of -the NOTICE file are for informational purposes only and do not modify the -License. You may add Your own attribution notices within Derivative Works that -You distribute, alongside or as an addendum to the NOTICE text from the Work, -provided that such additional attribution notices cannot be construed as -modifying the License. -You may add Your own copyright statement to Your modifications and may provide -additional or different license terms and conditions for use, reproduction, or -distribution of Your modifications, or for any such Derivative Works as a whole, -provided Your use, reproduction, and distribution of the Work otherwise complies -with the conditions stated in this License. - -5. Submission of Contributions. - -Unless You explicitly state otherwise, any Contribution intentionally submitted -for inclusion in the Work by You to the Licensor shall be under the terms and -conditions of this License, without any additional terms or conditions. -Notwithstanding the above, nothing herein shall supersede or modify the terms of -any separate license agreement you may have executed with Licensor regarding -such Contributions. - -6. Trademarks. - -This License does not grant permission to use the trade names, trademarks, -service marks, or product names of the Licensor, except as required for -reasonable and customary use in describing the origin of the Work and -reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. - -Unless required by applicable law or agreed to in writing, Licensor provides the -Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, -including, without limitation, any warranties or conditions of TITLE, -NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are -solely responsible for determining the appropriateness of using or -redistributing the Work and assume any risks associated with Your exercise of -permissions under this License. - -8. Limitation of Liability. - -In no event and under no legal theory, whether in tort (including negligence), -contract, or otherwise, unless required by applicable law (such as deliberate -and grossly negligent acts) or agreed to in writing, shall any Contributor be -liable to You for damages, including any direct, indirect, special, incidental, -or consequential damages of any character arising as a result of this License or -out of the use or inability to use the Work (including but not limited to -damages for loss of goodwill, work stoppage, computer failure or malfunction, or -any and all other commercial damages or losses), even if such Contributor has -been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. - -While redistributing the Work or Derivative Works thereof, You may choose to -offer, and charge a fee for, acceptance of support, warranty, indemnity, or -other liability obligations and/or rights consistent with this License. However, -in accepting such obligations, You may act only on Your own behalf and on Your -sole responsibility, not on behalf of any other Contributor, and only if You -agree to indemnify, defend, and hold each Contributor harmless for any liability -incurred by, or claims asserted against, such Contributor by reason of your -accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work - -To apply the Apache License to your work, attach the following boilerplate -notice, with the fields enclosed by brackets "[]" replaced with your own -identifying information. (Don't include the brackets!) The text should be -enclosed in the appropriate comment syntax for the file format. We also -recommend that a file or class name and description of purpose be included on -the same "printed page" as the copyright notice for easier identification within -third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file diff --git a/vendor/github.com/Unknwon/com/README.md b/vendor/github.com/Unknwon/com/README.md deleted file mode 100644 index 8d821abd6..000000000 --- a/vendor/github.com/Unknwon/com/README.md +++ /dev/null @@ -1,20 +0,0 @@ -Common Functions -================ - -[![Build Status](https://travis-ci.org/Unknwon/com.svg)](https://travis-ci.org/Unknwon/com) [![Go Walker](http://gowalker.org/api/v1/badge)](http://gowalker.org/github.com/Unknwon/com) - -This is an open source project for commonly used functions for the Go programming language. - -This package need >= **go 1.2** - -Code Convention: based on [Go Code Convention](https://github.com/Unknwon/go-code-convention). - -## Contribute - -Your contribute is welcome, but you have to check following steps after you added some functions and commit them: - -1. Make sure you wrote user-friendly comments for **all functions** . -2. Make sure you wrote test cases with any possible condition for **all functions** in file `*_test.go`. -3. Make sure you wrote benchmarks for **all functions** in file `*_test.go`. -4. Make sure you wrote useful examples for **all functions** in file `example_test.go`. -5. Make sure you ran `go test` and got **PASS** . diff --git a/vendor/github.com/Unknwon/com/cmd.go b/vendor/github.com/Unknwon/com/cmd.go deleted file mode 100644 index dc7086d8f..000000000 --- a/vendor/github.com/Unknwon/com/cmd.go +++ /dev/null @@ -1,161 +0,0 @@ -// +build go1.2 - -// Copyright 2013 com authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -// Package com is an open source project for commonly used functions for the Go programming language. -package com - -import ( - "bytes" - "fmt" - "os/exec" - "runtime" - "strings" -) - -// ExecCmdDirBytes executes system command in given directory -// and return stdout, stderr in bytes type, along with possible error. -func ExecCmdDirBytes(dir, cmdName string, args ...string) ([]byte, []byte, error) { - bufOut := new(bytes.Buffer) - bufErr := new(bytes.Buffer) - - cmd := exec.Command(cmdName, args...) - cmd.Dir = dir - cmd.Stdout = bufOut - cmd.Stderr = bufErr - - err := cmd.Run() - return bufOut.Bytes(), bufErr.Bytes(), err -} - -// ExecCmdBytes executes system command -// and return stdout, stderr in bytes type, along with possible error. -func ExecCmdBytes(cmdName string, args ...string) ([]byte, []byte, error) { - return ExecCmdDirBytes("", cmdName, args...) -} - -// ExecCmdDir executes system command in given directory -// and return stdout, stderr in string type, along with possible error. -func ExecCmdDir(dir, cmdName string, args ...string) (string, string, error) { - bufOut, bufErr, err := ExecCmdDirBytes(dir, cmdName, args...) - return string(bufOut), string(bufErr), err -} - -// ExecCmd executes system command -// and return stdout, stderr in string type, along with possible error. -func ExecCmd(cmdName string, args ...string) (string, string, error) { - return ExecCmdDir("", cmdName, args...) -} - -// _________ .__ .____ -// \_ ___ \ ____ | | ___________ | | ____ ____ -// / \ \/ / _ \| | / _ \_ __ \ | | / _ \ / ___\ -// \ \___( <_> ) |_( <_> ) | \/ | |__( <_> ) /_/ > -// \______ /\____/|____/\____/|__| |_______ \____/\___ / -// \/ \/ /_____/ - -// Color number constants. -const ( - Gray = uint8(iota + 90) - Red - Green - Yellow - Blue - Magenta - //NRed = uint8(31) // Normal - EndColor = "\033[0m" -) - -// getColorLevel returns colored level string by given level. -func getColorLevel(level string) string { - level = strings.ToUpper(level) - switch level { - case "TRAC": - return fmt.Sprintf("\033[%dm%s\033[0m", Blue, level) - case "ERRO": - return fmt.Sprintf("\033[%dm%s\033[0m", Red, level) - case "WARN": - return fmt.Sprintf("\033[%dm%s\033[0m", Magenta, level) - case "SUCC": - return fmt.Sprintf("\033[%dm%s\033[0m", Green, level) - default: - return level - } -} - -// ColorLogS colors log and return colored content. -// Log format: [ error ]. -// Level: TRAC -> blue; ERRO -> red; WARN -> Magenta; SUCC -> green; others -> default. -// Content: default; path: yellow; error -> red. -// Level has to be surrounded by "[" and "]". -// Highlights have to be surrounded by "# " and " #"(space), "#" will be deleted. -// Paths have to be surrounded by "( " and " )"(space). -// Errors have to be surrounded by "[ " and " ]"(space). -// Note: it hasn't support windows yet, contribute is welcome. -func ColorLogS(format string, a ...interface{}) string { - log := fmt.Sprintf(format, a...) - - var clog string - - if runtime.GOOS != "windows" { - // Level. - i := strings.Index(log, "]") - if log[0] == '[' && i > -1 { - clog += "[" + getColorLevel(log[1:i]) + "]" - } - - log = log[i+1:] - - // Error. - log = strings.Replace(log, "[ ", fmt.Sprintf("[\033[%dm", Red), -1) - log = strings.Replace(log, " ]", EndColor+"]", -1) - - // Path. - log = strings.Replace(log, "( ", fmt.Sprintf("(\033[%dm", Yellow), -1) - log = strings.Replace(log, " )", EndColor+")", -1) - - // Highlights. - log = strings.Replace(log, "# ", fmt.Sprintf("\033[%dm", Gray), -1) - log = strings.Replace(log, " #", EndColor, -1) - - } else { - // Level. - i := strings.Index(log, "]") - if log[0] == '[' && i > -1 { - clog += "[" + log[1:i] + "]" - } - - log = log[i+1:] - - // Error. - log = strings.Replace(log, "[ ", "[", -1) - log = strings.Replace(log, " ]", "]", -1) - - // Path. - log = strings.Replace(log, "( ", "(", -1) - log = strings.Replace(log, " )", ")", -1) - - // Highlights. - log = strings.Replace(log, "# ", "", -1) - log = strings.Replace(log, " #", "", -1) - } - return clog + log -} - -// ColorLog prints colored log to stdout. -// See color rules in function 'ColorLogS'. -func ColorLog(format string, a ...interface{}) { - fmt.Print(ColorLogS(format, a...)) -} diff --git a/vendor/github.com/Unknwon/com/convert.go b/vendor/github.com/Unknwon/com/convert.go deleted file mode 100644 index 25b3e0e56..000000000 --- a/vendor/github.com/Unknwon/com/convert.go +++ /dev/null @@ -1,157 +0,0 @@ -// Copyright 2014 com authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package com - -import ( - "fmt" - "strconv" -) - -// Convert string to specify type. -type StrTo string - -func (f StrTo) Exist() bool { - return string(f) != string(0x1E) -} - -func (f StrTo) Uint8() (uint8, error) { - v, err := strconv.ParseUint(f.String(), 10, 8) - return uint8(v), err -} - -func (f StrTo) Int() (int, error) { - v, err := strconv.ParseInt(f.String(), 10, 0) - return int(v), err -} - -func (f StrTo) Int64() (int64, error) { - v, err := strconv.ParseInt(f.String(), 10, 64) - return int64(v), err -} - -func (f StrTo) MustUint8() uint8 { - v, _ := f.Uint8() - return v -} - -func (f StrTo) MustInt() int { - v, _ := f.Int() - return v -} - -func (f StrTo) MustInt64() int64 { - v, _ := f.Int64() - return v -} - -func (f StrTo) String() string { - if f.Exist() { - return string(f) - } - return "" -} - -// Convert any type to string. -func ToStr(value interface{}, args ...int) (s string) { - switch v := value.(type) { - case bool: - s = strconv.FormatBool(v) - case float32: - s = strconv.FormatFloat(float64(v), 'f', argInt(args).Get(0, -1), argInt(args).Get(1, 32)) - case float64: - s = strconv.FormatFloat(v, 'f', argInt(args).Get(0, -1), argInt(args).Get(1, 64)) - case int: - s = strconv.FormatInt(int64(v), argInt(args).Get(0, 10)) - case int8: - s = strconv.FormatInt(int64(v), argInt(args).Get(0, 10)) - case int16: - s = strconv.FormatInt(int64(v), argInt(args).Get(0, 10)) - case int32: - s = strconv.FormatInt(int64(v), argInt(args).Get(0, 10)) - case int64: - s = strconv.FormatInt(v, argInt(args).Get(0, 10)) - case uint: - s = strconv.FormatUint(uint64(v), argInt(args).Get(0, 10)) - case uint8: - s = strconv.FormatUint(uint64(v), argInt(args).Get(0, 10)) - case uint16: - s = strconv.FormatUint(uint64(v), argInt(args).Get(0, 10)) - case uint32: - s = strconv.FormatUint(uint64(v), argInt(args).Get(0, 10)) - case uint64: - s = strconv.FormatUint(v, argInt(args).Get(0, 10)) - case string: - s = v - case []byte: - s = string(v) - default: - s = fmt.Sprintf("%v", v) - } - return s -} - -type argInt []int - -func (a argInt) Get(i int, args ...int) (r int) { - if i >= 0 && i < len(a) { - r = a[i] - } else if len(args) > 0 { - r = args[0] - } - return -} - -// HexStr2int converts hex format string to decimal number. -func HexStr2int(hexStr string) (int, error) { - num := 0 - length := len(hexStr) - for i := 0; i < length; i++ { - char := hexStr[length-i-1] - factor := -1 - - switch { - case char >= '0' && char <= '9': - factor = int(char) - '0' - case char >= 'a' && char <= 'f': - factor = int(char) - 'a' + 10 - default: - return -1, fmt.Errorf("invalid hex: %s", string(char)) - } - - num += factor * PowInt(16, i) - } - return num, nil -} - -// Int2HexStr converts decimal number to hex format string. -func Int2HexStr(num int) (hex string) { - if num == 0 { - return "0" - } - - for num > 0 { - r := num % 16 - - c := "?" - if r >= 0 && r <= 9 { - c = string(r + '0') - } else { - c = string(r + 'a' - 10) - } - hex = c + hex - num = num / 16 - } - return hex -} diff --git a/vendor/github.com/Unknwon/com/dir.go b/vendor/github.com/Unknwon/com/dir.go deleted file mode 100644 index c126d79da..000000000 --- a/vendor/github.com/Unknwon/com/dir.go +++ /dev/null @@ -1,173 +0,0 @@ -// Copyright 2013 com authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package com - -import ( - "errors" - "fmt" - "os" - "path" - "strings" -) - -// IsDir returns true if given path is a directory, -// or returns false when it's a file or does not exist. -func IsDir(dir string) bool { - f, e := os.Stat(dir) - if e != nil { - return false - } - return f.IsDir() -} - -func statDir(dirPath, recPath string, includeDir, isDirOnly bool) ([]string, error) { - dir, err := os.Open(dirPath) - if err != nil { - return nil, err - } - defer dir.Close() - - fis, err := dir.Readdir(0) - if err != nil { - return nil, err - } - - statList := make([]string, 0) - for _, fi := range fis { - if strings.Contains(fi.Name(), ".DS_Store") { - continue - } - - relPath := path.Join(recPath, fi.Name()) - curPath := path.Join(dirPath, fi.Name()) - if fi.IsDir() { - if includeDir { - statList = append(statList, relPath+"/") - } - s, err := statDir(curPath, relPath, includeDir, isDirOnly) - if err != nil { - return nil, err - } - statList = append(statList, s...) - } else if !isDirOnly { - statList = append(statList, relPath) - } - } - return statList, nil -} - -// StatDir gathers information of given directory by depth-first. -// It returns slice of file list and includes subdirectories if enabled; -// it returns error and nil slice when error occurs in underlying functions, -// or given path is not a directory or does not exist. -// -// Slice does not include given path itself. -// If subdirectories is enabled, they will have suffix '/'. -func StatDir(rootPath string, includeDir ...bool) ([]string, error) { - if !IsDir(rootPath) { - return nil, errors.New("not a directory or does not exist: " + rootPath) - } - - isIncludeDir := false - if len(includeDir) >= 1 { - isIncludeDir = includeDir[0] - } - return statDir(rootPath, "", isIncludeDir, false) -} - -// GetAllSubDirs returns all subdirectories of given root path. -// Slice does not include given path itself. -func GetAllSubDirs(rootPath string) ([]string, error) { - if !IsDir(rootPath) { - return nil, errors.New("not a directory or does not exist: " + rootPath) - } - return statDir(rootPath, "", true, true) -} - -// GetFileListBySuffix returns an ordered list of file paths. -// It recognize if given path is a file, and don't do recursive find. -func GetFileListBySuffix(dirPath, suffix string) ([]string, error) { - if !IsExist(dirPath) { - return nil, fmt.Errorf("given path does not exist: %s", dirPath) - } else if IsFile(dirPath) { - return []string{dirPath}, nil - } - - // Given path is a directory. - dir, err := os.Open(dirPath) - if err != nil { - return nil, err - } - - fis, err := dir.Readdir(0) - if err != nil { - return nil, err - } - - files := make([]string, 0, len(fis)) - for _, fi := range fis { - if strings.HasSuffix(fi.Name(), suffix) { - files = append(files, path.Join(dirPath, fi.Name())) - } - } - - return files, nil -} - -// CopyDir copy files recursively from source to target directory. -// -// The filter accepts a function that process the path info. -// and should return true for need to filter. -// -// It returns error when error occurs in underlying functions. -func CopyDir(srcPath, destPath string, filters ...func(filePath string) bool) error { - // Check if target directory exists. - if IsExist(destPath) { - return errors.New("file or directory alreay exists: " + destPath) - } - - err := os.MkdirAll(destPath, os.ModePerm) - if err != nil { - return err - } - - // Gather directory info. - infos, err := StatDir(srcPath, true) - if err != nil { - return err - } - - var filter func(filePath string) bool - if len(filters) > 0 { - filter = filters[0] - } - - for _, info := range infos { - if filter != nil && filter(info) { - continue - } - - curPath := path.Join(destPath, info) - if strings.HasSuffix(info, "/") { - err = os.MkdirAll(curPath, os.ModePerm) - } else { - err = Copy(path.Join(srcPath, info), curPath) - } - if err != nil { - return err - } - } - return nil -} diff --git a/vendor/github.com/Unknwon/com/file.go b/vendor/github.com/Unknwon/com/file.go deleted file mode 100644 index b51502c91..000000000 --- a/vendor/github.com/Unknwon/com/file.go +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright 2013 com authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package com - -import ( - "fmt" - "io" - "io/ioutil" - "math" - "os" - "path" -) - -// Storage unit constants. -const ( - Byte = 1 - KByte = Byte * 1024 - MByte = KByte * 1024 - GByte = MByte * 1024 - TByte = GByte * 1024 - PByte = TByte * 1024 - EByte = PByte * 1024 -) - -func logn(n, b float64) float64 { - return math.Log(n) / math.Log(b) -} - -func humanateBytes(s uint64, base float64, sizes []string) string { - if s < 10 { - return fmt.Sprintf("%dB", s) - } - e := math.Floor(logn(float64(s), base)) - suffix := sizes[int(e)] - val := float64(s) / math.Pow(base, math.Floor(e)) - f := "%.0f" - if val < 10 { - f = "%.1f" - } - - return fmt.Sprintf(f+"%s", val, suffix) -} - -// HumaneFileSize calculates the file size and generate user-friendly string. -func HumaneFileSize(s uint64) string { - sizes := []string{"B", "KB", "MB", "GB", "TB", "PB", "EB"} - return humanateBytes(s, 1024, sizes) -} - -// FileMTime returns file modified time and possible error. -func FileMTime(file string) (int64, error) { - f, err := os.Stat(file) - if err != nil { - return 0, err - } - return f.ModTime().Unix(), nil -} - -// FileSize returns file size in bytes and possible error. -func FileSize(file string) (int64, error) { - f, err := os.Stat(file) - if err != nil { - return 0, err - } - return f.Size(), nil -} - -// Copy copies file from source to target path. -func Copy(src, dest string) error { - // Gather file information to set back later. - si, err := os.Lstat(src) - if err != nil { - return err - } - - // Handle symbolic link. - if si.Mode()&os.ModeSymlink != 0 { - target, err := os.Readlink(src) - if err != nil { - return err - } - // NOTE: os.Chmod and os.Chtimes don't recoganize symbolic link, - // which will lead "no such file or directory" error. - return os.Symlink(target, dest) - } - - sr, err := os.Open(src) - if err != nil { - return err - } - defer sr.Close() - - dw, err := os.Create(dest) - if err != nil { - return err - } - defer dw.Close() - - if _, err = io.Copy(dw, sr); err != nil { - return err - } - - // Set back file information. - if err = os.Chtimes(dest, si.ModTime(), si.ModTime()); err != nil { - return err - } - return os.Chmod(dest, si.Mode()) -} - -// WriteFile writes data to a file named by filename. -// If the file does not exist, WriteFile creates it -// and its upper level paths. -func WriteFile(filename string, data []byte) error { - os.MkdirAll(path.Dir(filename), os.ModePerm) - return ioutil.WriteFile(filename, data, 0655) -} - -// IsFile returns true if given path is a file, -// or returns false when it's a directory or does not exist. -func IsFile(filePath string) bool { - f, e := os.Stat(filePath) - if e != nil { - return false - } - return !f.IsDir() -} - -// IsExist checks whether a file or directory exists. -// It returns false when the file or directory does not exist. -func IsExist(path string) bool { - _, err := os.Stat(path) - return err == nil || os.IsExist(err) -} diff --git a/vendor/github.com/Unknwon/com/html.go b/vendor/github.com/Unknwon/com/html.go deleted file mode 100644 index 762d94b05..000000000 --- a/vendor/github.com/Unknwon/com/html.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2013 com authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package com - -import ( - "html" - "regexp" - "strings" -) - -// Html2JS converts []byte type of HTML content into JS format. -func Html2JS(data []byte) []byte { - s := string(data) - s = strings.Replace(s, `\`, `\\`, -1) - s = strings.Replace(s, "\n", `\n`, -1) - s = strings.Replace(s, "\r", "", -1) - s = strings.Replace(s, "\"", `\"`, -1) - s = strings.Replace(s, "", "<table>", -1) - return []byte(s) -} - -// encode html chars to string -func HtmlEncode(str string) string { - return html.EscapeString(str) -} - -// decode string to html chars -func HtmlDecode(str string) string { - return html.UnescapeString(str) -} - -// strip tags in html string -func StripTags(src string) string { - //去除style,script,html tag - re := regexp.MustCompile(`(?s)<(?:style|script)[^<>]*>.*?|]*>|`) - src = re.ReplaceAllString(src, "") - - //trim all spaces(2+) into \n - re = regexp.MustCompile(`\s{2,}`) - src = re.ReplaceAllString(src, "\n") - - return strings.TrimSpace(src) -} - -// change \n to
-func Nl2br(str string) string { - return strings.Replace(str, "\n", "
", -1) -} diff --git a/vendor/github.com/Unknwon/com/http.go b/vendor/github.com/Unknwon/com/http.go deleted file mode 100644 index 3415059ae..000000000 --- a/vendor/github.com/Unknwon/com/http.go +++ /dev/null @@ -1,201 +0,0 @@ -// Copyright 2013 com authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package com - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "io/ioutil" - "net/http" - "os" - "path" -) - -type NotFoundError struct { - Message string -} - -func (e NotFoundError) Error() string { - return e.Message -} - -type RemoteError struct { - Host string - Err error -} - -func (e *RemoteError) Error() string { - return e.Err.Error() -} - -var UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1541.0 Safari/537.36" - -// HttpCall makes HTTP method call. -func HttpCall(client *http.Client, method, url string, header http.Header, body io.Reader) (io.ReadCloser, error) { - req, err := http.NewRequest(method, url, body) - if err != nil { - return nil, err - } - req.Header.Set("User-Agent", UserAgent) - for k, vs := range header { - req.Header[k] = vs - } - resp, err := client.Do(req) - if err != nil { - return nil, err - } - if resp.StatusCode == 200 { - return resp.Body, nil - } - resp.Body.Close() - if resp.StatusCode == 404 { // 403 can be rate limit error. || resp.StatusCode == 403 { - err = fmt.Errorf("resource not found: %s", url) - } else { - err = fmt.Errorf("%s %s -> %d", method, url, resp.StatusCode) - } - return nil, err -} - -// HttpGet gets the specified resource. -// ErrNotFound is returned if the server responds with status 404. -func HttpGet(client *http.Client, url string, header http.Header) (io.ReadCloser, error) { - return HttpCall(client, "GET", url, header, nil) -} - -// HttpPost posts the specified resource. -// ErrNotFound is returned if the server responds with status 404. -func HttpPost(client *http.Client, url string, header http.Header, body []byte) (io.ReadCloser, error) { - return HttpCall(client, "POST", url, header, bytes.NewBuffer(body)) -} - -// HttpGetToFile gets the specified resource and writes to file. -// ErrNotFound is returned if the server responds with status 404. -func HttpGetToFile(client *http.Client, url string, header http.Header, fileName string) error { - rc, err := HttpGet(client, url, header) - if err != nil { - return err - } - defer rc.Close() - - os.MkdirAll(path.Dir(fileName), os.ModePerm) - f, err := os.Create(fileName) - if err != nil { - return err - } - defer f.Close() - _, err = io.Copy(f, rc) - return err -} - -// HttpGetBytes gets the specified resource. ErrNotFound is returned if the server -// responds with status 404. -func HttpGetBytes(client *http.Client, url string, header http.Header) ([]byte, error) { - rc, err := HttpGet(client, url, header) - if err != nil { - return nil, err - } - defer rc.Close() - return ioutil.ReadAll(rc) -} - -// HttpGetJSON gets the specified resource and mapping to struct. -// ErrNotFound is returned if the server responds with status 404. -func HttpGetJSON(client *http.Client, url string, v interface{}) error { - rc, err := HttpGet(client, url, nil) - if err != nil { - return err - } - defer rc.Close() - err = json.NewDecoder(rc).Decode(v) - if _, ok := err.(*json.SyntaxError); ok { - return fmt.Errorf("JSON syntax error at %s", url) - } - return nil -} - -// HttpPostJSON posts the specified resource with struct values, -// and maps results to struct. -// ErrNotFound is returned if the server responds with status 404. -func HttpPostJSON(client *http.Client, url string, body, v interface{}) error { - data, err := json.Marshal(body) - if err != nil { - return err - } - rc, err := HttpPost(client, url, http.Header{"content-type": []string{"application/json"}}, data) - if err != nil { - return err - } - defer rc.Close() - err = json.NewDecoder(rc).Decode(v) - if _, ok := err.(*json.SyntaxError); ok { - return fmt.Errorf("JSON syntax error at %s", url) - } - return nil -} - -// A RawFile describes a file that can be downloaded. -type RawFile interface { - Name() string - RawUrl() string - Data() []byte - SetData([]byte) -} - -// FetchFiles fetches files specified by the rawURL field in parallel. -func FetchFiles(client *http.Client, files []RawFile, header http.Header) error { - ch := make(chan error, len(files)) - for i := range files { - go func(i int) { - p, err := HttpGetBytes(client, files[i].RawUrl(), nil) - if err != nil { - ch <- err - return - } - files[i].SetData(p) - ch <- nil - }(i) - } - for _ = range files { - if err := <-ch; err != nil { - return err - } - } - return nil -} - -// FetchFiles uses command `curl` to fetch files specified by the rawURL field in parallel. -func FetchFilesCurl(files []RawFile, curlOptions ...string) error { - ch := make(chan error, len(files)) - for i := range files { - go func(i int) { - stdout, _, err := ExecCmd("curl", append(curlOptions, files[i].RawUrl())...) - if err != nil { - ch <- err - return - } - - files[i].SetData([]byte(stdout)) - ch <- nil - }(i) - } - for _ = range files { - if err := <-ch; err != nil { - return err - } - } - return nil -} diff --git a/vendor/github.com/Unknwon/com/math.go b/vendor/github.com/Unknwon/com/math.go deleted file mode 100644 index 62b77e87c..000000000 --- a/vendor/github.com/Unknwon/com/math.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2014 com authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package com - -// PowInt is int type of math.Pow function. -func PowInt(x int, y int) int { - if y <= 0 { - return 1 - } else { - if y%2 == 0 { - sqrt := PowInt(x, y/2) - return sqrt * sqrt - } else { - return PowInt(x, y-1) * x - } - } -} diff --git a/vendor/github.com/Unknwon/com/path.go b/vendor/github.com/Unknwon/com/path.go deleted file mode 100644 index b1e860def..000000000 --- a/vendor/github.com/Unknwon/com/path.go +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright 2013 com authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package com - -import ( - "errors" - "os" - "path/filepath" - "runtime" - "strings" -) - -// GetGOPATHs returns all paths in GOPATH variable. -func GetGOPATHs() []string { - gopath := os.Getenv("GOPATH") - var paths []string - if runtime.GOOS == "windows" { - gopath = strings.Replace(gopath, "\\", "/", -1) - paths = strings.Split(gopath, ";") - } else { - paths = strings.Split(gopath, ":") - } - return paths -} - -// GetSrcPath returns app. source code path. -// It only works when you have src. folder in GOPATH, -// it returns error not able to locate source folder path. -func GetSrcPath(importPath string) (appPath string, err error) { - paths := GetGOPATHs() - for _, p := range paths { - if IsExist(p + "/src/" + importPath + "/") { - appPath = p + "/src/" + importPath + "/" - break - } - } - - if len(appPath) == 0 { - return "", errors.New("Unable to locate source folder path") - } - - appPath = filepath.Dir(appPath) + "/" - if runtime.GOOS == "windows" { - // Replace all '\' to '/'. - appPath = strings.Replace(appPath, "\\", "/", -1) - } - - return appPath, nil -} - -// HomeDir returns path of '~'(in Linux) on Windows, -// it returns error when the variable does not exist. -func HomeDir() (home string, err error) { - if runtime.GOOS == "windows" { - home = os.Getenv("USERPROFILE") - if len(home) == 0 { - home = os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH") - } - } else { - home = os.Getenv("HOME") - } - - if len(home) == 0 { - return "", errors.New("Cannot specify home directory because it's empty") - } - - return home, nil -} diff --git a/vendor/github.com/Unknwon/com/regex.go b/vendor/github.com/Unknwon/com/regex.go deleted file mode 100644 index 765bfc431..000000000 --- a/vendor/github.com/Unknwon/com/regex.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2013 com authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package com - -import "regexp" - -const ( - regex_email_pattern = `(?i)[A-Z0-9._%+-]+@(?:[A-Z0-9-]+\.)+[A-Z]{2,6}` - regex_strict_email_pattern = `(?i)[A-Z0-9!#$%&'*+/=?^_{|}~-]+` + - `(?:\.[A-Z0-9!#$%&'*+/=?^_{|}~-]+)*` + - `@(?:[A-Z0-9](?:[A-Z0-9-]*[A-Z0-9])?\.)+` + - `[A-Z0-9](?:[A-Z0-9-]*[A-Z0-9])?` - regex_url_pattern = `(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?` -) - -var ( - regex_email *regexp.Regexp - regex_strict_email *regexp.Regexp - regex_url *regexp.Regexp -) - -func init() { - regex_email = regexp.MustCompile(regex_email_pattern) - regex_strict_email = regexp.MustCompile(regex_strict_email_pattern) - regex_url = regexp.MustCompile(regex_url_pattern) -} - -// validate string is an email address, if not return false -// basically validation can match 99% cases -func IsEmail(email string) bool { - return regex_email.MatchString(email) -} - -// validate string is an email address, if not return false -// this validation omits RFC 2822 -func IsEmailRFC(email string) bool { - return regex_strict_email.MatchString(email) -} - -// validate string is a url link, if not return false -// simple validation can match 99% cases -func IsUrl(url string) bool { - return regex_url.MatchString(url) -} diff --git a/vendor/github.com/Unknwon/com/slice.go b/vendor/github.com/Unknwon/com/slice.go deleted file mode 100644 index 27801a4d7..000000000 --- a/vendor/github.com/Unknwon/com/slice.go +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright 2013 com authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package com - -import ( - "strings" -) - -// AppendStr appends string to slice with no duplicates. -func AppendStr(strs []string, str string) []string { - for _, s := range strs { - if s == str { - return strs - } - } - return append(strs, str) -} - -// CompareSliceStr compares two 'string' type slices. -// It returns true if elements and order are both the same. -func CompareSliceStr(s1, s2 []string) bool { - if len(s1) != len(s2) { - return false - } - - for i := range s1 { - if s1[i] != s2[i] { - return false - } - } - - return true -} - -// CompareSliceStr compares two 'string' type slices. -// It returns true if elements are the same, and ignores the order. -func CompareSliceStrU(s1, s2 []string) bool { - if len(s1) != len(s2) { - return false - } - - for i := range s1 { - for j := len(s2) - 1; j >= 0; j-- { - if s1[i] == s2[j] { - s2 = append(s2[:j], s2[j+1:]...) - break - } - } - } - if len(s2) > 0 { - return false - } - return true -} - -// IsSliceContainsStr returns true if the string exists in given slice, ignore case. -func IsSliceContainsStr(sl []string, str string) bool { - str = strings.ToLower(str) - for _, s := range sl { - if strings.ToLower(s) == str { - return true - } - } - return false -} - -// IsSliceContainsInt64 returns true if the int64 exists in given slice. -func IsSliceContainsInt64(sl []int64, i int64) bool { - for _, s := range sl { - if s == i { - return true - } - } - return false -} diff --git a/vendor/github.com/Unknwon/com/string.go b/vendor/github.com/Unknwon/com/string.go deleted file mode 100644 index 7080d174a..000000000 --- a/vendor/github.com/Unknwon/com/string.go +++ /dev/null @@ -1,253 +0,0 @@ -// Copyright 2013 com authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package com - -import ( - "bytes" - "crypto/aes" - "crypto/cipher" - "crypto/rand" - "errors" - r "math/rand" - "strconv" - "strings" - "time" - "unicode" - "unicode/utf8" -) - -// AESGCMEncrypt encrypts plaintext with the given key using AES in GCM mode. -func AESGCMEncrypt(key, plaintext []byte) ([]byte, error) { - block, err := aes.NewCipher(key) - if err != nil { - return nil, err - } - - gcm, err := cipher.NewGCM(block) - if err != nil { - return nil, err - } - - nonce := make([]byte, gcm.NonceSize()) - if _, err := rand.Read(nonce); err != nil { - return nil, err - } - - ciphertext := gcm.Seal(nil, nonce, plaintext, nil) - return append(nonce, ciphertext...), nil -} - -// AESGCMDecrypt decrypts ciphertext with the given key using AES in GCM mode. -func AESGCMDecrypt(key, ciphertext []byte) ([]byte, error) { - block, err := aes.NewCipher(key) - if err != nil { - return nil, err - } - - gcm, err := cipher.NewGCM(block) - if err != nil { - return nil, err - } - - size := gcm.NonceSize() - if len(ciphertext)-size <= 0 { - return nil, errors.New("Ciphertext is empty") - } - - nonce := ciphertext[:size] - ciphertext = ciphertext[size:] - - plainText, err := gcm.Open(nil, nonce, ciphertext, nil) - if err != nil { - return nil, err - } - - return plainText, nil -} - -// IsLetter returns true if the 'l' is an English letter. -func IsLetter(l uint8) bool { - n := (l | 0x20) - 'a' - if n >= 0 && n < 26 { - return true - } - return false -} - -// Expand replaces {k} in template with match[k] or subs[atoi(k)] if k is not in match. -func Expand(template string, match map[string]string, subs ...string) string { - var p []byte - var i int - for { - i = strings.Index(template, "{") - if i < 0 { - break - } - p = append(p, template[:i]...) - template = template[i+1:] - i = strings.Index(template, "}") - if s, ok := match[template[:i]]; ok { - p = append(p, s...) - } else { - j, _ := strconv.Atoi(template[:i]) - if j >= len(subs) { - p = append(p, []byte("Missing")...) - } else { - p = append(p, subs[j]...) - } - } - template = template[i+1:] - } - p = append(p, template...) - return string(p) -} - -// Reverse s string, support unicode -func Reverse(s string) string { - n := len(s) - runes := make([]rune, n) - for _, rune := range s { - n-- - runes[n] = rune - } - return string(runes[n:]) -} - -// RandomCreateBytes generate random []byte by specify chars. -func RandomCreateBytes(n int, alphabets ...byte) []byte { - const alphanum = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" - var bytes = make([]byte, n) - var randby bool - if num, err := rand.Read(bytes); num != n || err != nil { - r.Seed(time.Now().UnixNano()) - randby = true - } - for i, b := range bytes { - if len(alphabets) == 0 { - if randby { - bytes[i] = alphanum[r.Intn(len(alphanum))] - } else { - bytes[i] = alphanum[b%byte(len(alphanum))] - } - } else { - if randby { - bytes[i] = alphabets[r.Intn(len(alphabets))] - } else { - bytes[i] = alphabets[b%byte(len(alphabets))] - } - } - } - return bytes -} - -// ToSnakeCase can convert all upper case characters in a string to -// underscore format. -// -// Some samples. -// "FirstName" => "first_name" -// "HTTPServer" => "http_server" -// "NoHTTPS" => "no_https" -// "GO_PATH" => "go_path" -// "GO PATH" => "go_path" // space is converted to underscore. -// "GO-PATH" => "go_path" // hyphen is converted to underscore. -// -// From https://github.com/huandu/xstrings -func ToSnakeCase(str string) string { - if len(str) == 0 { - return "" - } - - buf := &bytes.Buffer{} - var prev, r0, r1 rune - var size int - - r0 = '_' - - for len(str) > 0 { - prev = r0 - r0, size = utf8.DecodeRuneInString(str) - str = str[size:] - - switch { - case r0 == utf8.RuneError: - buf.WriteByte(byte(str[0])) - - case unicode.IsUpper(r0): - if prev != '_' { - buf.WriteRune('_') - } - - buf.WriteRune(unicode.ToLower(r0)) - - if len(str) == 0 { - break - } - - r0, size = utf8.DecodeRuneInString(str) - str = str[size:] - - if !unicode.IsUpper(r0) { - buf.WriteRune(r0) - break - } - - // find next non-upper-case character and insert `_` properly. - // it's designed to convert `HTTPServer` to `http_server`. - // if there are more than 2 adjacent upper case characters in a word, - // treat them as an abbreviation plus a normal word. - for len(str) > 0 { - r1 = r0 - r0, size = utf8.DecodeRuneInString(str) - str = str[size:] - - if r0 == utf8.RuneError { - buf.WriteRune(unicode.ToLower(r1)) - buf.WriteByte(byte(str[0])) - break - } - - if !unicode.IsUpper(r0) { - if r0 == '_' || r0 == ' ' || r0 == '-' { - r0 = '_' - - buf.WriteRune(unicode.ToLower(r1)) - } else { - buf.WriteRune('_') - buf.WriteRune(unicode.ToLower(r1)) - buf.WriteRune(r0) - } - - break - } - - buf.WriteRune(unicode.ToLower(r1)) - } - - if len(str) == 0 || r0 == '_' { - buf.WriteRune(unicode.ToLower(r0)) - break - } - - default: - if r0 == ' ' || r0 == '-' { - r0 = '_' - } - - buf.WriteRune(r0) - } - } - - return buf.String() -} diff --git a/vendor/github.com/Unknwon/com/time.go b/vendor/github.com/Unknwon/com/time.go deleted file mode 100644 index dd1cdbcf2..000000000 --- a/vendor/github.com/Unknwon/com/time.go +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright 2013 com authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package com - -import ( - "fmt" - "strconv" - "strings" - "time" -) - -// Format unix time int64 to string -func Date(ti int64, format string) string { - t := time.Unix(int64(ti), 0) - return DateT(t, format) -} - -// Format unix time string to string -func DateS(ts string, format string) string { - i, _ := strconv.ParseInt(ts, 10, 64) - return Date(i, format) -} - -// Format time.Time struct to string -// MM - month - 01 -// M - month - 1, single bit -// DD - day - 02 -// D - day 2 -// YYYY - year - 2006 -// YY - year - 06 -// HH - 24 hours - 03 -// H - 24 hours - 3 -// hh - 12 hours - 03 -// h - 12 hours - 3 -// mm - minute - 04 -// m - minute - 4 -// ss - second - 05 -// s - second = 5 -func DateT(t time.Time, format string) string { - res := strings.Replace(format, "MM", t.Format("01"), -1) - res = strings.Replace(res, "M", t.Format("1"), -1) - res = strings.Replace(res, "DD", t.Format("02"), -1) - res = strings.Replace(res, "D", t.Format("2"), -1) - res = strings.Replace(res, "YYYY", t.Format("2006"), -1) - res = strings.Replace(res, "YY", t.Format("06"), -1) - res = strings.Replace(res, "HH", fmt.Sprintf("%02d", t.Hour()), -1) - res = strings.Replace(res, "H", fmt.Sprintf("%d", t.Hour()), -1) - res = strings.Replace(res, "hh", t.Format("03"), -1) - res = strings.Replace(res, "h", t.Format("3"), -1) - res = strings.Replace(res, "mm", t.Format("04"), -1) - res = strings.Replace(res, "m", t.Format("4"), -1) - res = strings.Replace(res, "ss", t.Format("05"), -1) - res = strings.Replace(res, "s", t.Format("5"), -1) - return res -} - -// DateFormat pattern rules. -var datePatterns = []string{ - // year - "Y", "2006", // A full numeric representation of a year, 4 digits Examples: 1999 or 2003 - "y", "06", //A two digit representation of a year Examples: 99 or 03 - - // month - "m", "01", // Numeric representation of a month, with leading zeros 01 through 12 - "n", "1", // Numeric representation of a month, without leading zeros 1 through 12 - "M", "Jan", // A short textual representation of a month, three letters Jan through Dec - "F", "January", // A full textual representation of a month, such as January or March January through December - - // day - "d", "02", // Day of the month, 2 digits with leading zeros 01 to 31 - "j", "2", // Day of the month without leading zeros 1 to 31 - - // week - "D", "Mon", // A textual representation of a day, three letters Mon through Sun - "l", "Monday", // A full textual representation of the day of the week Sunday through Saturday - - // time - "g", "3", // 12-hour format of an hour without leading zeros 1 through 12 - "G", "15", // 24-hour format of an hour without leading zeros 0 through 23 - "h", "03", // 12-hour format of an hour with leading zeros 01 through 12 - "H", "15", // 24-hour format of an hour with leading zeros 00 through 23 - - "a", "pm", // Lowercase Ante meridiem and Post meridiem am or pm - "A", "PM", // Uppercase Ante meridiem and Post meridiem AM or PM - - "i", "04", // Minutes with leading zeros 00 to 59 - "s", "05", // Seconds, with leading zeros 00 through 59 - - // time zone - "T", "MST", - "P", "-07:00", - "O", "-0700", - - // RFC 2822 - "r", time.RFC1123Z, -} - -// Parse Date use PHP time format. -func DateParse(dateString, format string) (time.Time, error) { - replacer := strings.NewReplacer(datePatterns...) - format = replacer.Replace(format) - return time.ParseInLocation(format, dateString, time.Local) -} diff --git a/vendor/github.com/Unknwon/com/url.go b/vendor/github.com/Unknwon/com/url.go deleted file mode 100644 index b0b7c0e12..000000000 --- a/vendor/github.com/Unknwon/com/url.go +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2013 com authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package com - -import ( - "encoding/base64" - "net/url" -) - -// url encode string, is + not %20 -func UrlEncode(str string) string { - return url.QueryEscape(str) -} - -// url decode string -func UrlDecode(str string) (string, error) { - return url.QueryUnescape(str) -} - -// base64 encode -func Base64Encode(str string) string { - return base64.StdEncoding.EncodeToString([]byte(str)) -} - -// base64 decode -func Base64Decode(str string) (string, error) { - s, e := base64.StdEncoding.DecodeString(str) - return string(s), e -} diff --git a/vendor/github.com/cihub/seelog/LICENSE.txt b/vendor/github.com/cihub/seelog/LICENSE.txt deleted file mode 100644 index 8c7068141..000000000 --- a/vendor/github.com/cihub/seelog/LICENSE.txt +++ /dev/null @@ -1,24 +0,0 @@ -Copyright (c) 2012, Cloud Instruments Co., Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Cloud Instruments Co., Ltd. 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 COPYRIGHT HOLDERS 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 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. diff --git a/vendor/github.com/cihub/seelog/README.markdown b/vendor/github.com/cihub/seelog/README.markdown deleted file mode 100644 index 7dd1ab353..000000000 --- a/vendor/github.com/cihub/seelog/README.markdown +++ /dev/null @@ -1,116 +0,0 @@ -Seelog -======= - -Seelog is a powerful and easy-to-learn logging framework that provides functionality for flexible dispatching, filtering, and formatting log messages. -It is natively written in the [Go](http://golang.org/) programming language. - -[![Build Status](https://drone.io/github.com/cihub/seelog/status.png)](https://drone.io/github.com/cihub/seelog/latest) - -Features ------------------- - -* Xml configuring to be able to change logger parameters without recompilation -* Changing configurations on the fly without app restart -* Possibility to set different log configurations for different project files and functions -* Adjustable message formatting -* Simultaneous log output to multiple streams -* Choosing logger priority strategy to minimize performance hit -* Different output writers - * Console writer - * File writer - * Buffered writer (Chunk writer) - * Rolling log writer (Logging with rotation) - * SMTP writer - * Others... (See [Wiki](https://github.com/cihub/seelog/wiki)) -* Log message wrappers (JSON, XML, etc.) -* Global variables and functions for easy usage in standalone apps -* Functions for flexible usage in libraries - -Quick-start ------------ - -```go -package main - -import log "github.com/cihub/seelog" - -func main() { - defer log.Flush() - log.Info("Hello from Seelog!") -} -``` - -Installation ------------- - -If you don't have the Go development environment installed, visit the -[Getting Started](http://golang.org/doc/install.html) document and follow the instructions. Once you're ready, execute the following command: - -``` -go get -u github.com/cihub/seelog -``` - -*IMPORTANT*: If you are not using the latest release version of Go, check out this [wiki page](https://github.com/cihub/seelog/wiki/Notes-on-'go-get') - -Documentation ---------------- - -Seelog has github wiki pages, which contain detailed how-tos references: https://github.com/cihub/seelog/wiki - -Examples ---------------- - -Seelog examples can be found here: [seelog-examples](https://github.com/cihub/seelog-examples) - -Issues ---------------- - -Feel free to push issues that could make Seelog better: https://github.com/cihub/seelog/issues - -Changelog ---------------- -* **v2.6** : Config using code and custom formatters - * Configuration using code in addition to xml (All internal receiver/dispatcher/logger types are now exported). - * Custom formatters. Check [wiki](https://github.com/cihub/seelog/wiki/Custom-formatters) - * Bugfixes and internal improvements. -* **v2.5** : Interaction with other systems. Part 2: custom receivers - * Finished custom receivers feature. Check [wiki](https://github.com/cihub/seelog/wiki/custom-receivers) - * Added 'LoggerFromCustomReceiver' - * Added 'LoggerFromWriterWithMinLevelAndFormat' - * Added 'LoggerFromCustomReceiver' - * Added 'LoggerFromParamConfigAs...' -* **v2.4** : Interaction with other systems. Part 1: wrapping seelog - * Added configurable caller stack skip logic - * Added 'SetAdditionalStackDepth' to 'LoggerInterface' -* **v2.3** : Rethinking 'rolling' receiver - * Reimplemented 'rolling' receiver - * Added 'Max rolls' feature for 'rolling' receiver with type='date' - * Fixed 'rolling' receiver issue: renaming on Windows -* **v2.2** : go1.0 compatibility point [go1.0 tag] - * Fixed internal bugs - * Added 'ANSI n [;k]' format identifier: %EscN - * Made current release go1 compatible -* **v2.1** : Some new features - * Rolling receiver archiving option. - * Added format identifier: %Line - * Smtp: added paths to PEM files directories - * Added format identifier: %FuncShort - * Warn, Error and Critical methods now return an error -* **v2.0** : Second major release. BREAKING CHANGES. - * Support of binaries with stripped symbols - * Added log strategy: adaptive - * Critical message now forces Flush() - * Added predefined formats: xml-debug, xml-debug-short, xml, xml-short, json-debug, json-debug-short, json, json-short, debug, debug-short, fast - * Added receiver: conn (network connection writer) - * BREAKING CHANGE: added Tracef, Debugf, Infof, etc. to satisfy the print/printf principle - * Bug fixes -* **v1.0** : Initial release. Features: - * Xml config - * Changing configurations on the fly without app restart - * Contraints and exceptions - * Formatting - * Log strategies: sync, async loop, async timer - * Receivers: buffered, console, file, rolling, smtp - - - diff --git a/vendor/github.com/cihub/seelog/archive/archive.go b/vendor/github.com/cihub/seelog/archive/archive.go deleted file mode 100644 index 923036f25..000000000 --- a/vendor/github.com/cihub/seelog/archive/archive.go +++ /dev/null @@ -1,198 +0,0 @@ -package archive - -import ( - "archive/tar" - "archive/zip" - "fmt" - "io" - "io/ioutil" - "os" - "time" - - "github.com/cihub/seelog/archive/gzip" -) - -// Reader is the interface for reading files from an archive. -type Reader interface { - NextFile() (name string, err error) - io.Reader -} - -// ReadCloser is the interface that groups Reader with the Close method. -type ReadCloser interface { - Reader - io.Closer -} - -// Writer is the interface for writing files to an archived format. -type Writer interface { - NextFile(name string, fi os.FileInfo) error - io.Writer -} - -// WriteCloser is the interface that groups Writer with the Close method. -type WriteCloser interface { - Writer - io.Closer -} - -type nopCloser struct{ Reader } - -func (nopCloser) Close() error { return nil } - -// NopCloser returns a ReadCloser with a no-op Close method wrapping the -// provided Reader r. -func NopCloser(r Reader) ReadCloser { - return nopCloser{r} -} - -// Copy copies from src to dest until either EOF is reached on src or an error -// occurs. -// -// When the archive format of src matches that of dst, Copy streams the files -// directly into dst. Otherwise, copy buffers the contents to disk to compute -// headers before writing to dst. -func Copy(dst Writer, src Reader) error { - switch src := src.(type) { - case tarReader: - if dst, ok := dst.(tarWriter); ok { - return copyTar(dst, src) - } - case zipReader: - if dst, ok := dst.(zipWriter); ok { - return copyZip(dst, src) - } - // Switch on concrete type because gzip has no special methods - case *gzip.Reader: - if dst, ok := dst.(*gzip.Writer); ok { - _, err := io.Copy(dst, src) - return err - } - } - - return copyBuffer(dst, src) -} - -func copyBuffer(dst Writer, src Reader) (err error) { - const defaultFileMode = 0666 - - buf, err := ioutil.TempFile("", "archive_copy_buffer") - if err != nil { - return err - } - defer os.Remove(buf.Name()) // Do not care about failure removing temp - defer buf.Close() // Do not care about failure closing temp - for { - // Handle the next file - name, err := src.NextFile() - switch err { - case io.EOF: // Done copying - return nil - default: // Failed to write: bail out - return err - case nil: // Proceed below - } - - // Buffer the file - if _, err := io.Copy(buf, src); err != nil { - return fmt.Errorf("buffer to disk: %v", err) - } - - // Seek to the start of the file for full file copy - if _, err := buf.Seek(0, os.SEEK_SET); err != nil { - return err - } - - // Set desired file permissions - if err := os.Chmod(buf.Name(), defaultFileMode); err != nil { - return err - } - fi, err := buf.Stat() - if err != nil { - return err - } - - // Write the buffered file - if err := dst.NextFile(name, fi); err != nil { - return err - } - if _, err := io.Copy(dst, buf); err != nil { - return fmt.Errorf("copy to dst: %v", err) - } - if err := buf.Truncate(0); err != nil { - return err - } - if _, err := buf.Seek(0, os.SEEK_SET); err != nil { - return err - } - } -} - -type tarReader interface { - Next() (*tar.Header, error) - io.Reader -} - -type tarWriter interface { - WriteHeader(hdr *tar.Header) error - io.Writer -} - -type zipReader interface { - Files() []*zip.File -} - -type zipWriter interface { - CreateHeader(fh *zip.FileHeader) (io.Writer, error) -} - -func copyTar(w tarWriter, r tarReader) error { - for { - hdr, err := r.Next() - switch err { - case io.EOF: - return nil - default: // Handle error - return err - case nil: // Proceed below - } - - info := hdr.FileInfo() - // Skip directories - if info.IsDir() { - continue - } - if err := w.WriteHeader(hdr); err != nil { - return err - } - if _, err := io.Copy(w, r); err != nil { - return err - } - } -} - -func copyZip(zw zipWriter, r zipReader) error { - for _, f := range r.Files() { - if err := copyZipFile(zw, f); err != nil { - return err - } - } - return nil -} - -func copyZipFile(zw zipWriter, f *zip.File) error { - rc, err := f.Open() - if err != nil { - return err - } - defer rc.Close() // Read-only - - hdr := f.FileHeader - hdr.SetModTime(time.Now()) - w, err := zw.CreateHeader(&hdr) - if err != nil { - return err - } - _, err = io.Copy(w, rc) - return err -} diff --git a/vendor/github.com/cihub/seelog/archive/gzip/gzip.go b/vendor/github.com/cihub/seelog/archive/gzip/gzip.go deleted file mode 100644 index ea121018a..000000000 --- a/vendor/github.com/cihub/seelog/archive/gzip/gzip.go +++ /dev/null @@ -1,64 +0,0 @@ -// Package gzip implements reading and writing of gzip format compressed files. -// See the compress/gzip package for more details. -package gzip - -import ( - "compress/gzip" - "fmt" - "io" - "os" -) - -// Reader is an io.Reader that can be read to retrieve uncompressed data from a -// gzip-format compressed file. -type Reader struct { - gzip.Reader - name string - isEOF bool -} - -// NewReader creates a new Reader reading the given reader. -func NewReader(r io.Reader, name string) (*Reader, error) { - gr, err := gzip.NewReader(r) - if err != nil { - return nil, err - } - return &Reader{ - Reader: *gr, - name: name, - }, nil -} - -// NextFile returns the file name. Calls subsequent to the first call will -// return EOF. -func (r *Reader) NextFile() (name string, err error) { - if r.isEOF { - return "", io.EOF - } - - r.isEOF = true - return r.name, nil -} - -// Writer is an io.WriteCloser. Writes to a Writer are compressed and written to w. -type Writer struct { - gzip.Writer - name string - noMoreFiles bool -} - -// NextFile never returns a next file, and should not be called more than once. -func (w *Writer) NextFile(name string, _ os.FileInfo) error { - if w.noMoreFiles { - return fmt.Errorf("gzip: only accepts one file: already received %q and now %q", w.name, name) - } - w.noMoreFiles = true - w.name = name - return nil -} - -// NewWriter returns a new Writer. Writes to the returned writer are compressed -// and written to w. -func NewWriter(w io.Writer) *Writer { - return &Writer{Writer: *gzip.NewWriter(w)} -} diff --git a/vendor/github.com/cihub/seelog/archive/tar/tar.go b/vendor/github.com/cihub/seelog/archive/tar/tar.go deleted file mode 100644 index 8dd87f573..000000000 --- a/vendor/github.com/cihub/seelog/archive/tar/tar.go +++ /dev/null @@ -1,72 +0,0 @@ -package tar - -import ( - "archive/tar" - "io" - "os" -) - -// Reader provides sequential access to the contents of a tar archive. -type Reader struct { - tar.Reader -} - -// NewReader creates a new Reader reading from r. -func NewReader(r io.Reader) *Reader { - return &Reader{Reader: *tar.NewReader(r)} -} - -// NextFile advances to the next file in the tar archive. -func (r *Reader) NextFile() (name string, err error) { - hdr, err := r.Next() - if err != nil { - return "", err - } - return hdr.Name, nil -} - -// Writer provides sequential writing of a tar archive in POSIX.1 format. -type Writer struct { - tar.Writer - closers []io.Closer -} - -// NewWriter creates a new Writer writing to w. -func NewWriter(w io.Writer) *Writer { - return &Writer{Writer: *tar.NewWriter(w)} -} - -// NewWriteMultiCloser creates a new Writer writing to w that also closes all -// closers in order on close. -func NewWriteMultiCloser(w io.WriteCloser, closers ...io.Closer) *Writer { - return &Writer{ - Writer: *tar.NewWriter(w), - closers: closers, - } -} - -// NextFile computes and writes a header and prepares to accept the file's -// contents. -func (w *Writer) NextFile(name string, fi os.FileInfo) error { - if name == "" { - name = fi.Name() - } - hdr, err := tar.FileInfoHeader(fi, name) - if err != nil { - return err - } - hdr.Name = name - return w.WriteHeader(hdr) -} - -// Close closes the tar archive and all other closers, flushing any unwritten -// data to the underlying writer. -func (w *Writer) Close() error { - err := w.Writer.Close() - for _, c := range w.closers { - if cerr := c.Close(); cerr != nil && err == nil { - err = cerr - } - } - return err -} diff --git a/vendor/github.com/cihub/seelog/archive/zip/zip.go b/vendor/github.com/cihub/seelog/archive/zip/zip.go deleted file mode 100644 index 4210b03b9..000000000 --- a/vendor/github.com/cihub/seelog/archive/zip/zip.go +++ /dev/null @@ -1,89 +0,0 @@ -package zip - -import ( - "archive/zip" - "io" - "os" -) - -// Reader provides sequential access to the contents of a zip archive. -type Reader struct { - zip.Reader - unread []*zip.File - rc io.ReadCloser -} - -// NewReader returns a new Reader reading from r, which is assumed to have the -// given size in bytes. -func NewReader(r io.ReaderAt, size int64) (*Reader, error) { - zr, err := zip.NewReader(r, size) - if err != nil { - return nil, err - } - return &Reader{Reader: *zr}, nil -} - -// NextFile advances to the next file in the zip archive. -func (r *Reader) NextFile() (name string, err error) { - // Initialize unread - if r.unread == nil { - r.unread = r.Files()[:] - } - - // Close previous file - if r.rc != nil { - r.rc.Close() // Read-only - } - - if len(r.unread) == 0 { - return "", io.EOF - } - - // Open and return next unread - f := r.unread[0] - name, r.unread = f.Name, r.unread[1:] - r.rc, err = f.Open() - if err != nil { - return "", err - } - return name, nil -} - -func (r *Reader) Read(p []byte) (n int, err error) { - return r.rc.Read(p) -} - -// Files returns the full list of files in the zip archive. -func (r *Reader) Files() []*zip.File { - return r.File -} - -// Writer provides sequential writing of a zip archive.1 format. -type Writer struct { - zip.Writer - w io.Writer -} - -// NewWriter returns a new Writer writing to w. -func NewWriter(w io.Writer) *Writer { - return &Writer{Writer: *zip.NewWriter(w)} -} - -// NextFile computes and writes a header and prepares to accept the file's -// contents. -func (w *Writer) NextFile(name string, fi os.FileInfo) error { - if name == "" { - name = fi.Name() - } - hdr, err := zip.FileInfoHeader(fi) - if err != nil { - return err - } - hdr.Name = name - w.w, err = w.CreateHeader(hdr) - return err -} - -func (w *Writer) Write(p []byte) (n int, err error) { - return w.w.Write(p) -} diff --git a/vendor/github.com/cihub/seelog/behavior_adaptivelogger.go b/vendor/github.com/cihub/seelog/behavior_adaptivelogger.go deleted file mode 100644 index 0c640caeb..000000000 --- a/vendor/github.com/cihub/seelog/behavior_adaptivelogger.go +++ /dev/null @@ -1,129 +0,0 @@ -// Copyright (c) 2012 - Cloud Instruments Co., Ltd. -// -// 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. - -package seelog - -import ( - "errors" - "fmt" - "math" - "time" -) - -var ( - adaptiveLoggerMaxInterval = time.Minute - adaptiveLoggerMaxCriticalMsgCount = uint32(1000) -) - -// asyncAdaptiveLogger represents asynchronous adaptive logger which acts like -// an async timer logger, but its interval depends on the current message count -// in the queue. -// -// Interval = I, minInterval = m, maxInterval = M, criticalMsgCount = C, msgCount = c: -// I = m + (C - Min(c, C)) / C * (M - m) -type asyncAdaptiveLogger struct { - asyncLogger - minInterval time.Duration - criticalMsgCount uint32 - maxInterval time.Duration -} - -// NewAsyncLoopLogger creates a new asynchronous adaptive logger -func NewAsyncAdaptiveLogger( - config *logConfig, - minInterval time.Duration, - maxInterval time.Duration, - criticalMsgCount uint32) (*asyncAdaptiveLogger, error) { - - if minInterval <= 0 { - return nil, errors.New("async adaptive logger min interval should be > 0") - } - - if maxInterval > adaptiveLoggerMaxInterval { - return nil, fmt.Errorf("async adaptive logger max interval should be <= %s", - adaptiveLoggerMaxInterval) - } - - if criticalMsgCount <= 0 { - return nil, errors.New("async adaptive logger critical msg count should be > 0") - } - - if criticalMsgCount > adaptiveLoggerMaxCriticalMsgCount { - return nil, fmt.Errorf("async adaptive logger critical msg count should be <= %s", - adaptiveLoggerMaxInterval) - } - - asnAdaptiveLogger := new(asyncAdaptiveLogger) - - asnAdaptiveLogger.asyncLogger = *newAsyncLogger(config) - asnAdaptiveLogger.minInterval = minInterval - asnAdaptiveLogger.maxInterval = maxInterval - asnAdaptiveLogger.criticalMsgCount = criticalMsgCount - - go asnAdaptiveLogger.processQueue() - - return asnAdaptiveLogger, nil -} - -func (asnAdaptiveLogger *asyncAdaptiveLogger) processItem() (closed bool, itemCount int) { - asnAdaptiveLogger.queueHasElements.L.Lock() - defer asnAdaptiveLogger.queueHasElements.L.Unlock() - - for asnAdaptiveLogger.msgQueue.Len() == 0 && !asnAdaptiveLogger.Closed() { - asnAdaptiveLogger.queueHasElements.Wait() - } - - if asnAdaptiveLogger.Closed() { - return true, asnAdaptiveLogger.msgQueue.Len() - } - - asnAdaptiveLogger.processQueueElement() - return false, asnAdaptiveLogger.msgQueue.Len() - 1 -} - -// I = m + (C - Min(c, C)) / C * (M - m) => -// I = m + cDiff * mDiff, -// cDiff = (C - Min(c, C)) / C) -// mDiff = (M - m) -func (asnAdaptiveLogger *asyncAdaptiveLogger) calcAdaptiveInterval(msgCount int) time.Duration { - critCountF := float64(asnAdaptiveLogger.criticalMsgCount) - cDiff := (critCountF - math.Min(float64(msgCount), critCountF)) / critCountF - mDiff := float64(asnAdaptiveLogger.maxInterval - asnAdaptiveLogger.minInterval) - - return asnAdaptiveLogger.minInterval + time.Duration(cDiff*mDiff) -} - -func (asnAdaptiveLogger *asyncAdaptiveLogger) processQueue() { - for !asnAdaptiveLogger.Closed() { - closed, itemCount := asnAdaptiveLogger.processItem() - - if closed { - break - } - - interval := asnAdaptiveLogger.calcAdaptiveInterval(itemCount) - - <-time.After(interval) - } -} diff --git a/vendor/github.com/cihub/seelog/behavior_asynclogger.go b/vendor/github.com/cihub/seelog/behavior_asynclogger.go deleted file mode 100644 index 75231067b..000000000 --- a/vendor/github.com/cihub/seelog/behavior_asynclogger.go +++ /dev/null @@ -1,142 +0,0 @@ -// Copyright (c) 2012 - Cloud Instruments Co., Ltd. -// -// 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. - -package seelog - -import ( - "container/list" - "fmt" - "sync" -) - -// MaxQueueSize is the critical number of messages in the queue that result in an immediate flush. -const ( - MaxQueueSize = 10000 -) - -type msgQueueItem struct { - level LogLevel - context LogContextInterface - message fmt.Stringer -} - -// asyncLogger represents common data for all asynchronous loggers -type asyncLogger struct { - commonLogger - msgQueue *list.List - queueHasElements *sync.Cond -} - -// newAsyncLogger creates a new asynchronous logger -func newAsyncLogger(config *logConfig) *asyncLogger { - asnLogger := new(asyncLogger) - - asnLogger.msgQueue = list.New() - asnLogger.queueHasElements = sync.NewCond(new(sync.Mutex)) - - asnLogger.commonLogger = *newCommonLogger(config, asnLogger) - - return asnLogger -} - -func (asnLogger *asyncLogger) innerLog( - level LogLevel, - context LogContextInterface, - message fmt.Stringer) { - - asnLogger.addMsgToQueue(level, context, message) -} - -func (asnLogger *asyncLogger) Close() { - asnLogger.m.Lock() - defer asnLogger.m.Unlock() - - if !asnLogger.Closed() { - asnLogger.flushQueue(true) - asnLogger.config.RootDispatcher.Flush() - - if err := asnLogger.config.RootDispatcher.Close(); err != nil { - reportInternalError(err) - } - - asnLogger.closedM.Lock() - asnLogger.closed = true - asnLogger.closedM.Unlock() - asnLogger.queueHasElements.Broadcast() - } -} - -func (asnLogger *asyncLogger) Flush() { - asnLogger.m.Lock() - defer asnLogger.m.Unlock() - - if !asnLogger.Closed() { - asnLogger.flushQueue(true) - asnLogger.config.RootDispatcher.Flush() - } -} - -func (asnLogger *asyncLogger) flushQueue(lockNeeded bool) { - if lockNeeded { - asnLogger.queueHasElements.L.Lock() - defer asnLogger.queueHasElements.L.Unlock() - } - - for asnLogger.msgQueue.Len() > 0 { - asnLogger.processQueueElement() - } -} - -func (asnLogger *asyncLogger) processQueueElement() { - if asnLogger.msgQueue.Len() > 0 { - backElement := asnLogger.msgQueue.Front() - msg, _ := backElement.Value.(msgQueueItem) - asnLogger.processLogMsg(msg.level, msg.message, msg.context) - asnLogger.msgQueue.Remove(backElement) - } -} - -func (asnLogger *asyncLogger) addMsgToQueue( - level LogLevel, - context LogContextInterface, - message fmt.Stringer) { - - if !asnLogger.Closed() { - asnLogger.queueHasElements.L.Lock() - defer asnLogger.queueHasElements.L.Unlock() - - if asnLogger.msgQueue.Len() >= MaxQueueSize { - fmt.Printf("Seelog queue overflow: more than %v messages in the queue. Flushing.\n", MaxQueueSize) - asnLogger.flushQueue(false) - } - - queueItem := msgQueueItem{level, context, message} - - asnLogger.msgQueue.PushBack(queueItem) - asnLogger.queueHasElements.Broadcast() - } else { - err := fmt.Errorf("queue closed! Cannot process element: %d %#v", level, message) - reportInternalError(err) - } -} diff --git a/vendor/github.com/cihub/seelog/behavior_asynclooplogger.go b/vendor/github.com/cihub/seelog/behavior_asynclooplogger.go deleted file mode 100644 index 972467b3f..000000000 --- a/vendor/github.com/cihub/seelog/behavior_asynclooplogger.go +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright (c) 2012 - Cloud Instruments Co., Ltd. -// -// 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. - -package seelog - -// asyncLoopLogger represents asynchronous logger which processes the log queue in -// a 'for' loop -type asyncLoopLogger struct { - asyncLogger -} - -// NewAsyncLoopLogger creates a new asynchronous loop logger -func NewAsyncLoopLogger(config *logConfig) *asyncLoopLogger { - - asnLoopLogger := new(asyncLoopLogger) - - asnLoopLogger.asyncLogger = *newAsyncLogger(config) - - go asnLoopLogger.processQueue() - - return asnLoopLogger -} - -func (asnLoopLogger *asyncLoopLogger) processItem() (closed bool) { - asnLoopLogger.queueHasElements.L.Lock() - defer asnLoopLogger.queueHasElements.L.Unlock() - - for asnLoopLogger.msgQueue.Len() == 0 && !asnLoopLogger.Closed() { - asnLoopLogger.queueHasElements.Wait() - } - - if asnLoopLogger.Closed() { - return true - } - - asnLoopLogger.processQueueElement() - return false -} - -func (asnLoopLogger *asyncLoopLogger) processQueue() { - for !asnLoopLogger.Closed() { - closed := asnLoopLogger.processItem() - - if closed { - break - } - } -} diff --git a/vendor/github.com/cihub/seelog/behavior_asynctimerlogger.go b/vendor/github.com/cihub/seelog/behavior_asynctimerlogger.go deleted file mode 100644 index 8118f2050..000000000 --- a/vendor/github.com/cihub/seelog/behavior_asynctimerlogger.go +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright (c) 2012 - Cloud Instruments Co., Ltd. -// -// 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. - -package seelog - -import ( - "errors" - "time" -) - -// asyncTimerLogger represents asynchronous logger which processes the log queue each -// 'duration' nanoseconds -type asyncTimerLogger struct { - asyncLogger - interval time.Duration -} - -// NewAsyncLoopLogger creates a new asynchronous loop logger -func NewAsyncTimerLogger(config *logConfig, interval time.Duration) (*asyncTimerLogger, error) { - - if interval <= 0 { - return nil, errors.New("async logger interval should be > 0") - } - - asnTimerLogger := new(asyncTimerLogger) - - asnTimerLogger.asyncLogger = *newAsyncLogger(config) - asnTimerLogger.interval = interval - - go asnTimerLogger.processQueue() - - return asnTimerLogger, nil -} - -func (asnTimerLogger *asyncTimerLogger) processItem() (closed bool) { - asnTimerLogger.queueHasElements.L.Lock() - defer asnTimerLogger.queueHasElements.L.Unlock() - - for asnTimerLogger.msgQueue.Len() == 0 && !asnTimerLogger.Closed() { - asnTimerLogger.queueHasElements.Wait() - } - - if asnTimerLogger.Closed() { - return true - } - - asnTimerLogger.processQueueElement() - return false -} - -func (asnTimerLogger *asyncTimerLogger) processQueue() { - for !asnTimerLogger.Closed() { - closed := asnTimerLogger.processItem() - - if closed { - break - } - - <-time.After(asnTimerLogger.interval) - } -} diff --git a/vendor/github.com/cihub/seelog/behavior_synclogger.go b/vendor/github.com/cihub/seelog/behavior_synclogger.go deleted file mode 100644 index 5a022ebc6..000000000 --- a/vendor/github.com/cihub/seelog/behavior_synclogger.go +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright (c) 2012 - Cloud Instruments Co., Ltd. -// -// 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. - -package seelog - -import ( - "fmt" -) - -// syncLogger performs logging in the same goroutine where 'Trace/Debug/...' -// func was called -type syncLogger struct { - commonLogger -} - -// NewSyncLogger creates a new synchronous logger -func NewSyncLogger(config *logConfig) *syncLogger { - syncLogger := new(syncLogger) - - syncLogger.commonLogger = *newCommonLogger(config, syncLogger) - - return syncLogger -} - -func (syncLogger *syncLogger) innerLog( - level LogLevel, - context LogContextInterface, - message fmt.Stringer) { - - syncLogger.processLogMsg(level, message, context) -} - -func (syncLogger *syncLogger) Close() { - syncLogger.m.Lock() - defer syncLogger.m.Unlock() - - if !syncLogger.Closed() { - if err := syncLogger.config.RootDispatcher.Close(); err != nil { - reportInternalError(err) - } - syncLogger.closedM.Lock() - syncLogger.closed = true - syncLogger.closedM.Unlock() - } -} - -func (syncLogger *syncLogger) Flush() { - syncLogger.m.Lock() - defer syncLogger.m.Unlock() - - if !syncLogger.Closed() { - syncLogger.config.RootDispatcher.Flush() - } -} diff --git a/vendor/github.com/cihub/seelog/cfg_config.go b/vendor/github.com/cihub/seelog/cfg_config.go deleted file mode 100644 index 76554fca0..000000000 --- a/vendor/github.com/cihub/seelog/cfg_config.go +++ /dev/null @@ -1,212 +0,0 @@ -// Copyright (c) 2012 - Cloud Instruments Co., Ltd. -// -// 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. - -package seelog - -import ( - "bytes" - "encoding/xml" - "fmt" - "io" - "os" -) - -// LoggerFromConfigAsFile creates logger with config from file. File should contain valid seelog xml. -func LoggerFromConfigAsFile(fileName string) (LoggerInterface, error) { - file, err := os.Open(fileName) - if err != nil { - return nil, err - } - defer file.Close() - - conf, err := configFromReader(file) - if err != nil { - return nil, err - } - - return createLoggerFromFullConfig(conf) -} - -// LoggerFromConfigAsBytes creates a logger with config from bytes stream. Bytes should contain valid seelog xml. -func LoggerFromConfigAsBytes(data []byte) (LoggerInterface, error) { - conf, err := configFromReader(bytes.NewBuffer(data)) - if err != nil { - return nil, err - } - - return createLoggerFromFullConfig(conf) -} - -// LoggerFromConfigAsString creates a logger with config from a string. String should contain valid seelog xml. -func LoggerFromConfigAsString(data string) (LoggerInterface, error) { - return LoggerFromConfigAsBytes([]byte(data)) -} - -// LoggerFromParamConfigAsFile does the same as LoggerFromConfigAsFile, but includes special parser options. -// See 'CfgParseParams' comments. -func LoggerFromParamConfigAsFile(fileName string, parserParams *CfgParseParams) (LoggerInterface, error) { - file, err := os.Open(fileName) - if err != nil { - return nil, err - } - defer file.Close() - - conf, err := configFromReaderWithConfig(file, parserParams) - if err != nil { - return nil, err - } - - return createLoggerFromFullConfig(conf) -} - -// LoggerFromParamConfigAsBytes does the same as LoggerFromConfigAsBytes, but includes special parser options. -// See 'CfgParseParams' comments. -func LoggerFromParamConfigAsBytes(data []byte, parserParams *CfgParseParams) (LoggerInterface, error) { - conf, err := configFromReaderWithConfig(bytes.NewBuffer(data), parserParams) - if err != nil { - return nil, err - } - - return createLoggerFromFullConfig(conf) -} - -// LoggerFromParamConfigAsString does the same as LoggerFromConfigAsString, but includes special parser options. -// See 'CfgParseParams' comments. -func LoggerFromParamConfigAsString(data string, parserParams *CfgParseParams) (LoggerInterface, error) { - return LoggerFromParamConfigAsBytes([]byte(data), parserParams) -} - -// LoggerFromWriterWithMinLevel is shortcut for LoggerFromWriterWithMinLevelAndFormat(output, minLevel, DefaultMsgFormat) -func LoggerFromWriterWithMinLevel(output io.Writer, minLevel LogLevel) (LoggerInterface, error) { - return LoggerFromWriterWithMinLevelAndFormat(output, minLevel, DefaultMsgFormat) -} - -// LoggerFromWriterWithMinLevelAndFormat creates a proxy logger that uses io.Writer as the -// receiver with minimal level = minLevel and with specified format. -// -// All messages with level more or equal to minLevel will be written to output and -// formatted using the default seelog format. -// -// Can be called for usage with non-Seelog systems -func LoggerFromWriterWithMinLevelAndFormat(output io.Writer, minLevel LogLevel, format string) (LoggerInterface, error) { - constraints, err := NewMinMaxConstraints(minLevel, CriticalLvl) - if err != nil { - return nil, err - } - formatter, err := NewFormatter(format) - if err != nil { - return nil, err - } - dispatcher, err := NewSplitDispatcher(formatter, []interface{}{output}) - if err != nil { - return nil, err - } - - conf, err := newFullLoggerConfig(constraints, make([]*LogLevelException, 0), dispatcher, syncloggerTypeFromString, nil, nil) - if err != nil { - return nil, err - } - - return createLoggerFromFullConfig(conf) -} - -// LoggerFromXMLDecoder creates logger with config from a XML decoder starting from a specific node. -// It should contain valid seelog xml, except for root node name. -func LoggerFromXMLDecoder(xmlParser *xml.Decoder, rootNode xml.Token) (LoggerInterface, error) { - conf, err := configFromXMLDecoder(xmlParser, rootNode) - if err != nil { - return nil, err - } - - return createLoggerFromFullConfig(conf) -} - -// LoggerFromCustomReceiver creates a proxy logger that uses a CustomReceiver as the -// receiver. -// -// All messages will be sent to the specified custom receiver without additional -// formatting ('%Msg' format is used). -// -// Check CustomReceiver, RegisterReceiver for additional info. -// -// NOTE 1: CustomReceiver.AfterParse is only called when a receiver is instantiated -// by the config parser while parsing config. So, if you are not planning to use the -// same CustomReceiver for both proxying (via LoggerFromCustomReceiver call) and -// loading from config, just leave AfterParse implementation empty. -// -// NOTE 2: Unlike RegisterReceiver, LoggerFromCustomReceiver takes an already initialized -// instance that implements CustomReceiver. So, fill it with data and perform any initialization -// logic before calling this func and it won't be lost. -// -// So: -// * RegisterReceiver takes value just to get the reflect.Type from it and then -// instantiate it as many times as config is reloaded. -// -// * LoggerFromCustomReceiver takes value and uses it without modification and -// reinstantiation, directy passing it to the dispatcher tree. -func LoggerFromCustomReceiver(receiver CustomReceiver) (LoggerInterface, error) { - constraints, err := NewMinMaxConstraints(TraceLvl, CriticalLvl) - if err != nil { - return nil, err - } - - output, err := NewCustomReceiverDispatcherByValue(msgonlyformatter, receiver, "user-proxy", CustomReceiverInitArgs{}) - if err != nil { - return nil, err - } - dispatcher, err := NewSplitDispatcher(msgonlyformatter, []interface{}{output}) - if err != nil { - return nil, err - } - - conf, err := newFullLoggerConfig(constraints, make([]*LogLevelException, 0), dispatcher, syncloggerTypeFromString, nil, nil) - if err != nil { - return nil, err - } - - return createLoggerFromFullConfig(conf) -} - -func CloneLogger(logger LoggerInterface) (LoggerInterface, error) { - switch logger := logger.(type) { - default: - return nil, fmt.Errorf("unexpected type %T", logger) - case *asyncAdaptiveLogger: - clone, err := NewAsyncAdaptiveLogger(logger.commonLogger.config, logger.minInterval, logger.maxInterval, logger.criticalMsgCount) - if err != nil { - return nil, err - } - return clone, nil - case *asyncLoopLogger: - return NewAsyncLoopLogger(logger.commonLogger.config), nil - case *asyncTimerLogger: - clone, err := NewAsyncTimerLogger(logger.commonLogger.config, logger.interval) - if err != nil { - return nil, err - } - return clone, nil - case *syncLogger: - return NewSyncLogger(logger.commonLogger.config), nil - } -} diff --git a/vendor/github.com/cihub/seelog/cfg_errors.go b/vendor/github.com/cihub/seelog/cfg_errors.go deleted file mode 100644 index c1fb4d101..000000000 --- a/vendor/github.com/cihub/seelog/cfg_errors.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright (c) 2012 - Cloud Instruments Co., Ltd. -// -// 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. - -package seelog - -import ( - "errors" -) - -var ( - errNodeMustHaveChildren = errors.New("node must have children") - errNodeCannotHaveChildren = errors.New("node cannot have children") -) - -type unexpectedChildElementError struct { - baseError -} - -func newUnexpectedChildElementError(msg string) *unexpectedChildElementError { - custmsg := "Unexpected child element: " + msg - return &unexpectedChildElementError{baseError{message: custmsg}} -} - -type missingArgumentError struct { - baseError -} - -func newMissingArgumentError(nodeName, attrName string) *missingArgumentError { - custmsg := "Output '" + nodeName + "' has no '" + attrName + "' attribute" - return &missingArgumentError{baseError{message: custmsg}} -} - -type unexpectedAttributeError struct { - baseError -} - -func newUnexpectedAttributeError(nodeName, attr string) *unexpectedAttributeError { - custmsg := nodeName + " has unexpected attribute: " + attr - return &unexpectedAttributeError{baseError{message: custmsg}} -} diff --git a/vendor/github.com/cihub/seelog/cfg_logconfig.go b/vendor/github.com/cihub/seelog/cfg_logconfig.go deleted file mode 100644 index 6ba6f9a94..000000000 --- a/vendor/github.com/cihub/seelog/cfg_logconfig.go +++ /dev/null @@ -1,141 +0,0 @@ -// Copyright (c) 2012 - Cloud Instruments Co., Ltd. -// -// 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. - -package seelog - -import ( - "errors" -) - -type loggerTypeFromString uint8 - -const ( - syncloggerTypeFromString = iota - asyncLooploggerTypeFromString - asyncTimerloggerTypeFromString - adaptiveLoggerTypeFromString - defaultloggerTypeFromString = asyncLooploggerTypeFromString -) - -const ( - syncloggerTypeFromStringStr = "sync" - asyncloggerTypeFromStringStr = "asyncloop" - asyncTimerloggerTypeFromStringStr = "asynctimer" - adaptiveLoggerTypeFromStringStr = "adaptive" -) - -// asyncTimerLoggerData represents specific data for async timer logger -type asyncTimerLoggerData struct { - AsyncInterval uint32 -} - -// adaptiveLoggerData represents specific data for adaptive timer logger -type adaptiveLoggerData struct { - MinInterval uint32 - MaxInterval uint32 - CriticalMsgCount uint32 -} - -var loggerTypeToStringRepresentations = map[loggerTypeFromString]string{ - syncloggerTypeFromString: syncloggerTypeFromStringStr, - asyncLooploggerTypeFromString: asyncloggerTypeFromStringStr, - asyncTimerloggerTypeFromString: asyncTimerloggerTypeFromStringStr, - adaptiveLoggerTypeFromString: adaptiveLoggerTypeFromStringStr, -} - -// getLoggerTypeFromString parses a string and returns a corresponding logger type, if successful. -func getLoggerTypeFromString(logTypeString string) (level loggerTypeFromString, found bool) { - for logType, logTypeStr := range loggerTypeToStringRepresentations { - if logTypeStr == logTypeString { - return logType, true - } - } - - return 0, false -} - -// logConfig stores logging configuration. Contains messages dispatcher, allowed log level rules -// (general constraints and exceptions) -type logConfig struct { - Constraints logLevelConstraints // General log level rules (>min and ' element. It takes the 'name' attribute - // of the element and tries to find a match in two places: - // 1) CfgParseParams.CustomReceiverProducers map - // 2) Global type map, filled by RegisterReceiver - // - // If a match is found in the CustomReceiverProducers map, parser calls the corresponding producer func - // passing the init args to it. The func takes exactly the same args as CustomReceiver.AfterParse. - // The producer func must return a correct receiver or an error. If case of error, seelog will behave - // in the same way as with any other config error. - // - // You may use this param to set custom producers in case you need to pass some context when instantiating - // a custom receiver or if you frequently change custom receivers with different parameters or in any other - // situation where package-level registering (RegisterReceiver) is not an option for you. - CustomReceiverProducers map[string]CustomReceiverProducer -} - -func (cfg *CfgParseParams) String() string { - return fmt.Sprintf("CfgParams: {custom_recs=%d}", len(cfg.CustomReceiverProducers)) -} - -type elementMapEntry struct { - constructor func(node *xmlNode, formatFromParent *formatter, formats map[string]*formatter, cfg *CfgParseParams) (interface{}, error) -} - -var elementMap map[string]elementMapEntry -var predefinedFormats map[string]*formatter - -func init() { - elementMap = map[string]elementMapEntry{ - fileWriterID: {createfileWriter}, - splitterDispatcherID: {createSplitter}, - customReceiverID: {createCustomReceiver}, - filterDispatcherID: {createFilter}, - consoleWriterID: {createConsoleWriter}, - rollingfileWriterID: {createRollingFileWriter}, - bufferedWriterID: {createbufferedWriter}, - smtpWriterID: {createSMTPWriter}, - connWriterID: {createconnWriter}, - } - - err := fillPredefinedFormats() - if err != nil { - panic(fmt.Sprintf("Seelog couldn't start: predefined formats creation failed. Error: %s", err.Error())) - } -} - -func fillPredefinedFormats() error { - predefinedFormatsWithoutPrefix := map[string]string{ - "xml-debug": `%Lev%Msg%RelFile%Func%Line`, - "xml-debug-short": `%Ns%l%Msg

%RelFile

%Func`, - "xml": `%Lev%Msg`, - "xml-short": `%Ns%l%Msg`, - - "json-debug": `{"time":%Ns,"lev":"%Lev","msg":"%Msg","path":"%RelFile","func":"%Func","line":"%Line"}`, - "json-debug-short": `{"t":%Ns,"l":"%Lev","m":"%Msg","p":"%RelFile","f":"%Func"}`, - "json": `{"time":%Ns,"lev":"%Lev","msg":"%Msg"}`, - "json-short": `{"t":%Ns,"l":"%Lev","m":"%Msg"}`, - - "debug": `[%LEVEL] %RelFile:%Func.%Line %Date %Time %Msg%n`, - "debug-short": `[%LEVEL] %Date %Time %Msg%n`, - "fast": `%Ns %l %Msg%n`, - } - - predefinedFormats = make(map[string]*formatter) - - for formatKey, format := range predefinedFormatsWithoutPrefix { - formatter, err := NewFormatter(format) - if err != nil { - return err - } - - predefinedFormats[predefinedPrefix+formatKey] = formatter - } - - return nil -} - -// configFromXMLDecoder parses data from a given XML decoder. -// Returns parsed config which can be used to create logger in case no errors occured. -// Returns error if format is incorrect or anything happened. -func configFromXMLDecoder(xmlParser *xml.Decoder, rootNode xml.Token) (*configForParsing, error) { - return configFromXMLDecoderWithConfig(xmlParser, rootNode, nil) -} - -// configFromXMLDecoderWithConfig parses data from a given XML decoder. -// Returns parsed config which can be used to create logger in case no errors occured. -// Returns error if format is incorrect or anything happened. -func configFromXMLDecoderWithConfig(xmlParser *xml.Decoder, rootNode xml.Token, cfg *CfgParseParams) (*configForParsing, error) { - _, ok := rootNode.(xml.StartElement) - if !ok { - return nil, errors.New("rootNode must be XML startElement") - } - - config, err := unmarshalNode(xmlParser, rootNode) - if err != nil { - return nil, err - } - if config == nil { - return nil, errors.New("xml has no content") - } - - return configFromXMLNodeWithConfig(config, cfg) -} - -// configFromReader parses data from a given reader. -// Returns parsed config which can be used to create logger in case no errors occured. -// Returns error if format is incorrect or anything happened. -func configFromReader(reader io.Reader) (*configForParsing, error) { - return configFromReaderWithConfig(reader, nil) -} - -// configFromReaderWithConfig parses data from a given reader. -// Returns parsed config which can be used to create logger in case no errors occured. -// Returns error if format is incorrect or anything happened. -func configFromReaderWithConfig(reader io.Reader, cfg *CfgParseParams) (*configForParsing, error) { - config, err := unmarshalConfig(reader) - if err != nil { - return nil, err - } - - if config.name != seelogConfigID { - return nil, errors.New("root xml tag must be '" + seelogConfigID + "'") - } - - return configFromXMLNodeWithConfig(config, cfg) -} - -func configFromXMLNodeWithConfig(config *xmlNode, cfg *CfgParseParams) (*configForParsing, error) { - err := checkUnexpectedAttribute( - config, - minLevelID, - maxLevelID, - levelsID, - loggerTypeFromStringAttr, - asyncLoggerIntervalAttr, - adaptLoggerMinIntervalAttr, - adaptLoggerMaxIntervalAttr, - adaptLoggerCriticalMsgCountAttr, - ) - if err != nil { - return nil, err - } - - err = checkExpectedElements(config, optionalElement(outputsID), optionalElement(formatsID), optionalElement(exceptionsID)) - if err != nil { - return nil, err - } - - constraints, err := getConstraints(config) - if err != nil { - return nil, err - } - - exceptions, err := getExceptions(config) - if err != nil { - return nil, err - } - err = checkDistinctExceptions(exceptions) - if err != nil { - return nil, err - } - - formats, err := getFormats(config) - if err != nil { - return nil, err - } - - dispatcher, err := getOutputsTree(config, formats, cfg) - if err != nil { - // If we open several files, but then fail to parse the config, we should close - // those files before reporting that config is invalid. - if dispatcher != nil { - dispatcher.Close() - } - - return nil, err - } - - loggerType, logData, err := getloggerTypeFromStringData(config) - if err != nil { - return nil, err - } - - return newFullLoggerConfig(constraints, exceptions, dispatcher, loggerType, logData, cfg) -} - -func getConstraints(node *xmlNode) (logLevelConstraints, error) { - minLevelStr, isMinLevel := node.attributes[minLevelID] - maxLevelStr, isMaxLevel := node.attributes[maxLevelID] - levelsStr, isLevels := node.attributes[levelsID] - - if isLevels && (isMinLevel && isMaxLevel) { - return nil, errors.New("for level declaration use '" + levelsID + "'' OR '" + minLevelID + - "', '" + maxLevelID + "'") - } - - offString := LogLevel(Off).String() - - if (isLevels && strings.TrimSpace(levelsStr) == offString) || - (isMinLevel && !isMaxLevel && minLevelStr == offString) { - - return NewOffConstraints() - } - - if isLevels { - levels, err := parseLevels(levelsStr) - if err != nil { - return nil, err - } - return NewListConstraints(levels) - } - - var minLevel = LogLevel(TraceLvl) - if isMinLevel { - found := true - minLevel, found = LogLevelFromString(minLevelStr) - if !found { - return nil, errors.New("declared " + minLevelID + " not found: " + minLevelStr) - } - } - - var maxLevel = LogLevel(CriticalLvl) - if isMaxLevel { - found := true - maxLevel, found = LogLevelFromString(maxLevelStr) - if !found { - return nil, errors.New("declared " + maxLevelID + " not found: " + maxLevelStr) - } - } - - return NewMinMaxConstraints(minLevel, maxLevel) -} - -func parseLevels(str string) ([]LogLevel, error) { - levelsStrArr := strings.Split(strings.Replace(str, " ", "", -1), ",") - var levels []LogLevel - for _, levelStr := range levelsStrArr { - level, found := LogLevelFromString(levelStr) - if !found { - return nil, errors.New("declared level not found: " + levelStr) - } - - levels = append(levels, level) - } - - return levels, nil -} - -func getExceptions(config *xmlNode) ([]*LogLevelException, error) { - var exceptions []*LogLevelException - - var exceptionsNode *xmlNode - for _, child := range config.children { - if child.name == exceptionsID { - exceptionsNode = child - break - } - } - - if exceptionsNode == nil { - return exceptions, nil - } - - err := checkUnexpectedAttribute(exceptionsNode) - if err != nil { - return nil, err - } - - err = checkExpectedElements(exceptionsNode, multipleMandatoryElements("exception")) - if err != nil { - return nil, err - } - - for _, exceptionNode := range exceptionsNode.children { - if exceptionNode.name != exceptionID { - return nil, errors.New("incorrect nested element in exceptions section: " + exceptionNode.name) - } - - err := checkUnexpectedAttribute(exceptionNode, minLevelID, maxLevelID, levelsID, funcPatternID, filePatternID) - if err != nil { - return nil, err - } - - constraints, err := getConstraints(exceptionNode) - if err != nil { - return nil, errors.New("incorrect " + exceptionsID + " node: " + err.Error()) - } - - funcPattern, isFuncPattern := exceptionNode.attributes[funcPatternID] - filePattern, isFilePattern := exceptionNode.attributes[filePatternID] - if !isFuncPattern { - funcPattern = "*" - } - if !isFilePattern { - filePattern = "*" - } - - exception, err := NewLogLevelException(funcPattern, filePattern, constraints) - if err != nil { - return nil, errors.New("incorrect exception node: " + err.Error()) - } - - exceptions = append(exceptions, exception) - } - - return exceptions, nil -} - -func checkDistinctExceptions(exceptions []*LogLevelException) error { - for i, exception := range exceptions { - for j, exception1 := range exceptions { - if i == j { - continue - } - - if exception.FuncPattern() == exception1.FuncPattern() && - exception.FilePattern() == exception1.FilePattern() { - - return fmt.Errorf("there are two or more duplicate exceptions. Func: %v, file %v", - exception.FuncPattern(), exception.FilePattern()) - } - } - } - - return nil -} - -func getFormats(config *xmlNode) (map[string]*formatter, error) { - formats := make(map[string]*formatter, 0) - - var formatsNode *xmlNode - for _, child := range config.children { - if child.name == formatsID { - formatsNode = child - break - } - } - - if formatsNode == nil { - return formats, nil - } - - err := checkUnexpectedAttribute(formatsNode) - if err != nil { - return nil, err - } - - err = checkExpectedElements(formatsNode, multipleMandatoryElements("format")) - if err != nil { - return nil, err - } - - for _, formatNode := range formatsNode.children { - if formatNode.name != formatID { - return nil, errors.New("incorrect nested element in " + formatsID + " section: " + formatNode.name) - } - - err := checkUnexpectedAttribute(formatNode, formatKeyAttrID, formatID) - if err != nil { - return nil, err - } - - id, isID := formatNode.attributes[formatKeyAttrID] - formatStr, isFormat := formatNode.attributes[formatAttrID] - if !isID { - return nil, errors.New("format has no '" + formatKeyAttrID + "' attribute") - } - if !isFormat { - return nil, errors.New("format[" + id + "] has no '" + formatAttrID + "' attribute") - } - - formatter, err := NewFormatter(formatStr) - if err != nil { - return nil, err - } - - formats[id] = formatter - } - - return formats, nil -} - -func getloggerTypeFromStringData(config *xmlNode) (logType loggerTypeFromString, logData interface{}, err error) { - logTypeStr, loggerTypeExists := config.attributes[loggerTypeFromStringAttr] - - if !loggerTypeExists { - return defaultloggerTypeFromString, nil, nil - } - - logType, found := getLoggerTypeFromString(logTypeStr) - - if !found { - return 0, nil, fmt.Errorf("unknown logger type: %s", logTypeStr) - } - - if logType == asyncTimerloggerTypeFromString { - intervalStr, intervalExists := config.attributes[asyncLoggerIntervalAttr] - if !intervalExists { - return 0, nil, newMissingArgumentError(config.name, asyncLoggerIntervalAttr) - } - - interval, err := strconv.ParseUint(intervalStr, 10, 32) - if err != nil { - return 0, nil, err - } - - logData = asyncTimerLoggerData{uint32(interval)} - } else if logType == adaptiveLoggerTypeFromString { - - // Min interval - minIntStr, minIntExists := config.attributes[adaptLoggerMinIntervalAttr] - if !minIntExists { - return 0, nil, newMissingArgumentError(config.name, adaptLoggerMinIntervalAttr) - } - minInterval, err := strconv.ParseUint(minIntStr, 10, 32) - if err != nil { - return 0, nil, err - } - - // Max interval - maxIntStr, maxIntExists := config.attributes[adaptLoggerMaxIntervalAttr] - if !maxIntExists { - return 0, nil, newMissingArgumentError(config.name, adaptLoggerMaxIntervalAttr) - } - maxInterval, err := strconv.ParseUint(maxIntStr, 10, 32) - if err != nil { - return 0, nil, err - } - - // Critical msg count - criticalMsgCountStr, criticalMsgCountExists := config.attributes[adaptLoggerCriticalMsgCountAttr] - if !criticalMsgCountExists { - return 0, nil, newMissingArgumentError(config.name, adaptLoggerCriticalMsgCountAttr) - } - criticalMsgCount, err := strconv.ParseUint(criticalMsgCountStr, 10, 32) - if err != nil { - return 0, nil, err - } - - logData = adaptiveLoggerData{uint32(minInterval), uint32(maxInterval), uint32(criticalMsgCount)} - } - - return logType, logData, nil -} - -func getOutputsTree(config *xmlNode, formats map[string]*formatter, cfg *CfgParseParams) (dispatcherInterface, error) { - var outputsNode *xmlNode - for _, child := range config.children { - if child.name == outputsID { - outputsNode = child - break - } - } - - if outputsNode != nil { - err := checkUnexpectedAttribute(outputsNode, outputFormatID) - if err != nil { - return nil, err - } - - formatter, err := getCurrentFormat(outputsNode, DefaultFormatter, formats) - if err != nil { - return nil, err - } - - output, err := createSplitter(outputsNode, formatter, formats, cfg) - if err != nil { - return nil, err - } - - dispatcher, ok := output.(dispatcherInterface) - if ok { - return dispatcher, nil - } - } - - console, err := NewConsoleWriter() - if err != nil { - return nil, err - } - return NewSplitDispatcher(DefaultFormatter, []interface{}{console}) -} - -func getCurrentFormat(node *xmlNode, formatFromParent *formatter, formats map[string]*formatter) (*formatter, error) { - formatID, isFormatID := node.attributes[outputFormatID] - if !isFormatID { - return formatFromParent, nil - } - - format, ok := formats[formatID] - if ok { - return format, nil - } - - // Test for predefined format match - pdFormat, pdOk := predefinedFormats[formatID] - - if !pdOk { - return nil, errors.New("formatid = '" + formatID + "' doesn't exist") - } - - return pdFormat, nil -} - -func createInnerReceivers(node *xmlNode, format *formatter, formats map[string]*formatter, cfg *CfgParseParams) ([]interface{}, error) { - var outputs []interface{} - for _, childNode := range node.children { - entry, ok := elementMap[childNode.name] - if !ok { - return nil, errors.New("unnknown tag '" + childNode.name + "' in outputs section") - } - - output, err := entry.constructor(childNode, format, formats, cfg) - if err != nil { - return nil, err - } - - outputs = append(outputs, output) - } - - return outputs, nil -} - -func createSplitter(node *xmlNode, formatFromParent *formatter, formats map[string]*formatter, cfg *CfgParseParams) (interface{}, error) { - err := checkUnexpectedAttribute(node, outputFormatID) - if err != nil { - return nil, err - } - - if !node.hasChildren() { - return nil, errNodeMustHaveChildren - } - - currentFormat, err := getCurrentFormat(node, formatFromParent, formats) - if err != nil { - return nil, err - } - - receivers, err := createInnerReceivers(node, currentFormat, formats, cfg) - if err != nil { - return nil, err - } - - return NewSplitDispatcher(currentFormat, receivers) -} - -func createCustomReceiver(node *xmlNode, formatFromParent *formatter, formats map[string]*formatter, cfg *CfgParseParams) (interface{}, error) { - dataCustomPrefixes := make(map[string]string) - // Expecting only 'formatid', 'name' and 'data-' attrs - for attr, attrval := range node.attributes { - isExpected := false - if attr == outputFormatID || - attr == customNameAttrID { - isExpected = true - } - if strings.HasPrefix(attr, customNameDataAttrPrefix) { - dataCustomPrefixes[attr[len(customNameDataAttrPrefix):]] = attrval - isExpected = true - } - if !isExpected { - return nil, newUnexpectedAttributeError(node.name, attr) - } - } - - if node.hasChildren() { - return nil, errNodeCannotHaveChildren - } - customName, hasCustomName := node.attributes[customNameAttrID] - if !hasCustomName { - return nil, newMissingArgumentError(node.name, customNameAttrID) - } - currentFormat, err := getCurrentFormat(node, formatFromParent, formats) - if err != nil { - return nil, err - } - args := CustomReceiverInitArgs{ - XmlCustomAttrs: dataCustomPrefixes, - } - - if cfg != nil && cfg.CustomReceiverProducers != nil { - if prod, ok := cfg.CustomReceiverProducers[customName]; ok { - rec, err := prod(args) - if err != nil { - return nil, err - } - creceiver, err := NewCustomReceiverDispatcherByValue(currentFormat, rec, customName, args) - if err != nil { - return nil, err - } - err = rec.AfterParse(args) - if err != nil { - return nil, err - } - return creceiver, nil - } - } - - return NewCustomReceiverDispatcher(currentFormat, customName, args) -} - -func createFilter(node *xmlNode, formatFromParent *formatter, formats map[string]*formatter, cfg *CfgParseParams) (interface{}, error) { - err := checkUnexpectedAttribute(node, outputFormatID, filterLevelsAttrID) - if err != nil { - return nil, err - } - - if !node.hasChildren() { - return nil, errNodeMustHaveChildren - } - - currentFormat, err := getCurrentFormat(node, formatFromParent, formats) - if err != nil { - return nil, err - } - - levelsStr, isLevels := node.attributes[filterLevelsAttrID] - if !isLevels { - return nil, newMissingArgumentError(node.name, filterLevelsAttrID) - } - - levels, err := parseLevels(levelsStr) - if err != nil { - return nil, err - } - - receivers, err := createInnerReceivers(node, currentFormat, formats, cfg) - if err != nil { - return nil, err - } - - return NewFilterDispatcher(currentFormat, receivers, levels...) -} - -func createfileWriter(node *xmlNode, formatFromParent *formatter, formats map[string]*formatter, cfg *CfgParseParams) (interface{}, error) { - err := checkUnexpectedAttribute(node, outputFormatID, pathID) - if err != nil { - return nil, err - } - - if node.hasChildren() { - return nil, errNodeCannotHaveChildren - } - - currentFormat, err := getCurrentFormat(node, formatFromParent, formats) - if err != nil { - return nil, err - } - - path, isPath := node.attributes[pathID] - if !isPath { - return nil, newMissingArgumentError(node.name, pathID) - } - - fileWriter, err := NewFileWriter(path) - if err != nil { - return nil, err - } - - return NewFormattedWriter(fileWriter, currentFormat) -} - -// Creates new SMTP writer if encountered in the config file. -func createSMTPWriter(node *xmlNode, formatFromParent *formatter, formats map[string]*formatter, cfg *CfgParseParams) (interface{}, error) { - err := checkUnexpectedAttribute(node, outputFormatID, senderaddressID, senderNameID, hostNameID, hostPortID, userNameID, userPassID, subjectID) - if err != nil { - return nil, err - } - // Node must have children. - if !node.hasChildren() { - return nil, errNodeMustHaveChildren - } - currentFormat, err := getCurrentFormat(node, formatFromParent, formats) - if err != nil { - return nil, err - } - senderAddress, ok := node.attributes[senderaddressID] - if !ok { - return nil, newMissingArgumentError(node.name, senderaddressID) - } - senderName, ok := node.attributes[senderNameID] - if !ok { - return nil, newMissingArgumentError(node.name, senderNameID) - } - // Process child nodes scanning for recipient email addresses and/or CA certificate paths. - var recipientAddresses []string - var caCertDirPaths []string - var mailHeaders []string - for _, childNode := range node.children { - switch childNode.name { - // Extract recipient address from child nodes. - case recipientID: - address, ok := childNode.attributes[addressID] - if !ok { - return nil, newMissingArgumentError(childNode.name, addressID) - } - recipientAddresses = append(recipientAddresses, address) - // Extract CA certificate file path from child nodes. - case cACertDirpathID: - path, ok := childNode.attributes[pathID] - if !ok { - return nil, newMissingArgumentError(childNode.name, pathID) - } - caCertDirPaths = append(caCertDirPaths, path) - - // Extract email headers from child nodes. - case mailHeaderID: - headerName, ok := childNode.attributes[mailHeaderNameID] - if !ok { - return nil, newMissingArgumentError(childNode.name, mailHeaderNameID) - } - - headerValue, ok := childNode.attributes[mailHeaderValueID] - if !ok { - return nil, newMissingArgumentError(childNode.name, mailHeaderValueID) - } - - // Build header line - mailHeaders = append(mailHeaders, fmt.Sprintf("%s: %s", headerName, headerValue)) - default: - return nil, newUnexpectedChildElementError(childNode.name) - } - } - hostName, ok := node.attributes[hostNameID] - if !ok { - return nil, newMissingArgumentError(node.name, hostNameID) - } - - hostPort, ok := node.attributes[hostPortID] - if !ok { - return nil, newMissingArgumentError(node.name, hostPortID) - } - - // Check if the string can really be converted into int. - if _, err := strconv.Atoi(hostPort); err != nil { - return nil, errors.New("invalid host port number") - } - - userName, ok := node.attributes[userNameID] - if !ok { - return nil, newMissingArgumentError(node.name, userNameID) - } - - userPass, ok := node.attributes[userPassID] - if !ok { - return nil, newMissingArgumentError(node.name, userPassID) - } - - // subject is optionally set by configuration. - // default value is defined by DefaultSubjectPhrase constant in the writers_smtpwriter.go - var subjectPhrase = DefaultSubjectPhrase - - subject, ok := node.attributes[subjectID] - if ok { - subjectPhrase = subject - } - - smtpWriter := NewSMTPWriter( - senderAddress, - senderName, - recipientAddresses, - hostName, - hostPort, - userName, - userPass, - caCertDirPaths, - subjectPhrase, - mailHeaders, - ) - - return NewFormattedWriter(smtpWriter, currentFormat) -} - -func createConsoleWriter(node *xmlNode, formatFromParent *formatter, formats map[string]*formatter, cfg *CfgParseParams) (interface{}, error) { - err := checkUnexpectedAttribute(node, outputFormatID) - if err != nil { - return nil, err - } - - if node.hasChildren() { - return nil, errNodeCannotHaveChildren - } - - currentFormat, err := getCurrentFormat(node, formatFromParent, formats) - if err != nil { - return nil, err - } - - consoleWriter, err := NewConsoleWriter() - if err != nil { - return nil, err - } - - return NewFormattedWriter(consoleWriter, currentFormat) -} - -func createconnWriter(node *xmlNode, formatFromParent *formatter, formats map[string]*formatter, cfg *CfgParseParams) (interface{}, error) { - if node.hasChildren() { - return nil, errNodeCannotHaveChildren - } - - err := checkUnexpectedAttribute(node, outputFormatID, connWriterAddrAttr, connWriterNetAttr, connWriterReconnectOnMsgAttr, connWriterUseTLSAttr, connWriterInsecureSkipVerifyAttr) - if err != nil { - return nil, err - } - - currentFormat, err := getCurrentFormat(node, formatFromParent, formats) - if err != nil { - return nil, err - } - - addr, isAddr := node.attributes[connWriterAddrAttr] - if !isAddr { - return nil, newMissingArgumentError(node.name, connWriterAddrAttr) - } - - net, isNet := node.attributes[connWriterNetAttr] - if !isNet { - return nil, newMissingArgumentError(node.name, connWriterNetAttr) - } - - reconnectOnMsg := false - reconnectOnMsgStr, isReconnectOnMsgStr := node.attributes[connWriterReconnectOnMsgAttr] - if isReconnectOnMsgStr { - if reconnectOnMsgStr == "true" { - reconnectOnMsg = true - } else if reconnectOnMsgStr == "false" { - reconnectOnMsg = false - } else { - return nil, errors.New("node '" + node.name + "' has incorrect '" + connWriterReconnectOnMsgAttr + "' attribute value") - } - } - - useTLS := false - useTLSStr, isUseTLSStr := node.attributes[connWriterUseTLSAttr] - if isUseTLSStr { - if useTLSStr == "true" { - useTLS = true - } else if useTLSStr == "false" { - useTLS = false - } else { - return nil, errors.New("node '" + node.name + "' has incorrect '" + connWriterUseTLSAttr + "' attribute value") - } - if useTLS { - insecureSkipVerify := false - insecureSkipVerifyStr, isInsecureSkipVerify := node.attributes[connWriterInsecureSkipVerifyAttr] - if isInsecureSkipVerify { - if insecureSkipVerifyStr == "true" { - insecureSkipVerify = true - } else if insecureSkipVerifyStr == "false" { - insecureSkipVerify = false - } else { - return nil, errors.New("node '" + node.name + "' has incorrect '" + connWriterInsecureSkipVerifyAttr + "' attribute value") - } - } - config := tls.Config{InsecureSkipVerify: insecureSkipVerify} - connWriter := newTLSWriter(net, addr, reconnectOnMsg, &config) - return NewFormattedWriter(connWriter, currentFormat) - } - } - - connWriter := NewConnWriter(net, addr, reconnectOnMsg) - - return NewFormattedWriter(connWriter, currentFormat) -} - -func createRollingFileWriter(node *xmlNode, formatFromParent *formatter, formats map[string]*formatter, cfg *CfgParseParams) (interface{}, error) { - if node.hasChildren() { - return nil, errNodeCannotHaveChildren - } - - rollingTypeStr, isRollingType := node.attributes[rollingFileTypeAttr] - if !isRollingType { - return nil, newMissingArgumentError(node.name, rollingFileTypeAttr) - } - - rollingType, ok := rollingTypeFromString(rollingTypeStr) - if !ok { - return nil, errors.New("unknown rolling file type: " + rollingTypeStr) - } - - currentFormat, err := getCurrentFormat(node, formatFromParent, formats) - if err != nil { - return nil, err - } - - path, isPath := node.attributes[rollingFilePathAttr] - if !isPath { - return nil, newMissingArgumentError(node.name, rollingFilePathAttr) - } - - rollingArchiveStr, archiveAttrExists := node.attributes[rollingFileArchiveAttr] - - var rArchiveType rollingArchiveType - var rArchivePath string - var rArchiveExploded bool = false - if !archiveAttrExists { - rArchiveType = rollingArchiveNone - rArchivePath = "" - } else { - rArchiveType, ok = rollingArchiveTypeFromString(rollingArchiveStr) - if !ok { - return nil, errors.New("unknown rolling archive type: " + rollingArchiveStr) - } - - if rArchiveType == rollingArchiveNone { - rArchivePath = "" - } else { - if rArchiveExplodedAttr, ok := node.attributes[rollingFileArchiveExplodedAttr]; ok { - if rArchiveExploded, err = strconv.ParseBool(rArchiveExplodedAttr); err != nil { - return nil, fmt.Errorf("archive exploded should be true or false, but was %v", - rArchiveExploded) - } - } - - rArchivePath, ok = node.attributes[rollingFileArchivePathAttr] - if ok { - if rArchivePath == "" { - return nil, fmt.Errorf("empty archive path is not supported") - } - } else { - if rArchiveExploded { - rArchivePath = rollingArchiveDefaultExplodedName - - } else { - rArchivePath, err = rollingArchiveTypeDefaultName(rArchiveType, false) - if err != nil { - return nil, err - } - } - } - } - } - - nameMode := rollingNameMode(rollingNameModePostfix) - nameModeStr, ok := node.attributes[rollingFileNameModeAttr] - if ok { - mode, found := rollingNameModeFromString(nameModeStr) - if !found { - return nil, errors.New("unknown rolling filename mode: " + nameModeStr) - } else { - nameMode = mode - } - } - - if rollingType == rollingTypeSize { - err := checkUnexpectedAttribute(node, outputFormatID, rollingFileTypeAttr, rollingFilePathAttr, - rollingFileMaxSizeAttr, rollingFileMaxRollsAttr, rollingFileArchiveAttr, - rollingFileArchivePathAttr, rollingFileArchiveExplodedAttr, rollingFileNameModeAttr) - if err != nil { - return nil, err - } - - maxSizeStr, ok := node.attributes[rollingFileMaxSizeAttr] - if !ok { - return nil, newMissingArgumentError(node.name, rollingFileMaxSizeAttr) - } - - maxSize, err := strconv.ParseInt(maxSizeStr, 10, 64) - if err != nil { - return nil, err - } - - maxRolls := 0 - maxRollsStr, ok := node.attributes[rollingFileMaxRollsAttr] - if ok { - maxRolls, err = strconv.Atoi(maxRollsStr) - if err != nil { - return nil, err - } - } - - rollingWriter, err := NewRollingFileWriterSize(path, rArchiveType, rArchivePath, maxSize, maxRolls, nameMode, rArchiveExploded) - if err != nil { - return nil, err - } - - return NewFormattedWriter(rollingWriter, currentFormat) - - } else if rollingType == rollingTypeTime { - err := checkUnexpectedAttribute(node, outputFormatID, rollingFileTypeAttr, rollingFilePathAttr, - rollingFileDataPatternAttr, rollingFileArchiveAttr, rollingFileMaxRollsAttr, - rollingFileArchivePathAttr, rollingFileArchiveExplodedAttr, rollingFileNameModeAttr, - rollingFileFullNameAttr) - if err != nil { - return nil, err - } - - maxRolls := 0 - maxRollsStr, ok := node.attributes[rollingFileMaxRollsAttr] - if ok { - maxRolls, err = strconv.Atoi(maxRollsStr) - if err != nil { - return nil, err - } - } - - fullName := false - fn, ok := node.attributes[rollingFileFullNameAttr] - if ok { - if fn == "true" { - fullName = true - } else if fn == "false" { - fullName = false - } else { - return nil, errors.New("node '" + node.name + "' has incorrect '" + rollingFileFullNameAttr + "' attribute value") - } - } - - dataPattern, ok := node.attributes[rollingFileDataPatternAttr] - if !ok { - return nil, newMissingArgumentError(node.name, rollingFileDataPatternAttr) - } - - rollingWriter, err := NewRollingFileWriterTime(path, rArchiveType, rArchivePath, maxRolls, dataPattern, nameMode, rArchiveExploded, fullName) - if err != nil { - return nil, err - } - - return NewFormattedWriter(rollingWriter, currentFormat) - } - - return nil, errors.New("incorrect rolling writer type " + rollingTypeStr) -} - -func createbufferedWriter(node *xmlNode, formatFromParent *formatter, formats map[string]*formatter, cfg *CfgParseParams) (interface{}, error) { - err := checkUnexpectedAttribute(node, outputFormatID, bufferedSizeAttr, bufferedFlushPeriodAttr) - if err != nil { - return nil, err - } - - if !node.hasChildren() { - return nil, errNodeMustHaveChildren - } - - currentFormat, err := getCurrentFormat(node, formatFromParent, formats) - if err != nil { - return nil, err - } - - sizeStr, isSize := node.attributes[bufferedSizeAttr] - if !isSize { - return nil, newMissingArgumentError(node.name, bufferedSizeAttr) - } - - size, err := strconv.Atoi(sizeStr) - if err != nil { - return nil, err - } - - flushPeriod := 0 - flushPeriodStr, isFlushPeriod := node.attributes[bufferedFlushPeriodAttr] - if isFlushPeriod { - flushPeriod, err = strconv.Atoi(flushPeriodStr) - if err != nil { - return nil, err - } - } - - // Inner writer couldn't have its own format, so we pass 'currentFormat' as its parent format - receivers, err := createInnerReceivers(node, currentFormat, formats, cfg) - if err != nil { - return nil, err - } - - formattedWriter, ok := receivers[0].(*formattedWriter) - if !ok { - return nil, errors.New("buffered writer's child is not writer") - } - - // ... and then we check that it hasn't changed - if formattedWriter.Format() != currentFormat { - return nil, errors.New("inner writer cannot have his own format") - } - - bufferedWriter, err := NewBufferedWriter(formattedWriter.Writer(), size, time.Duration(flushPeriod)) - if err != nil { - return nil, err - } - - return NewFormattedWriter(bufferedWriter, currentFormat) -} - -// Returns an error if node has any attributes not listed in expectedAttrs. -func checkUnexpectedAttribute(node *xmlNode, expectedAttrs ...string) error { - for attr := range node.attributes { - isExpected := false - for _, expected := range expectedAttrs { - if attr == expected { - isExpected = true - break - } - } - if !isExpected { - return newUnexpectedAttributeError(node.name, attr) - } - } - - return nil -} - -type expectedElementInfo struct { - name string - mandatory bool - multiple bool -} - -func optionalElement(name string) expectedElementInfo { - return expectedElementInfo{name, false, false} -} -func mandatoryElement(name string) expectedElementInfo { - return expectedElementInfo{name, true, false} -} -func multipleElements(name string) expectedElementInfo { - return expectedElementInfo{name, false, true} -} -func multipleMandatoryElements(name string) expectedElementInfo { - return expectedElementInfo{name, true, true} -} - -func checkExpectedElements(node *xmlNode, elements ...expectedElementInfo) error { - for _, element := range elements { - count := 0 - for _, child := range node.children { - if child.name == element.name { - count++ - } - } - - if count == 0 && element.mandatory { - return errors.New(node.name + " does not have mandatory subnode - " + element.name) - } - if count > 1 && !element.multiple { - return errors.New(node.name + " has more then one subnode - " + element.name) - } - } - - for _, child := range node.children { - isExpected := false - for _, element := range elements { - if child.name == element.name { - isExpected = true - } - } - - if !isExpected { - return errors.New(node.name + " has unexpected child: " + child.name) - } - } - - return nil -} diff --git a/vendor/github.com/cihub/seelog/common_closer.go b/vendor/github.com/cihub/seelog/common_closer.go deleted file mode 100644 index 1319c2217..000000000 --- a/vendor/github.com/cihub/seelog/common_closer.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) 2012 - Cloud Instruments Co., Ltd. -// -// 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. - -package seelog diff --git a/vendor/github.com/cihub/seelog/common_constraints.go b/vendor/github.com/cihub/seelog/common_constraints.go deleted file mode 100644 index 7ec2fe5b1..000000000 --- a/vendor/github.com/cihub/seelog/common_constraints.go +++ /dev/null @@ -1,162 +0,0 @@ -// Copyright (c) 2012 - Cloud Instruments Co., Ltd. -// -// 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. - -package seelog - -import ( - "errors" - "fmt" - "strings" -) - -// Represents constraints which form a general rule for log levels selection -type logLevelConstraints interface { - IsAllowed(level LogLevel) bool -} - -// A minMaxConstraints represents constraints which use minimal and maximal allowed log levels. -type minMaxConstraints struct { - min LogLevel - max LogLevel -} - -// NewMinMaxConstraints creates a new minMaxConstraints struct with the specified min and max levels. -func NewMinMaxConstraints(min LogLevel, max LogLevel) (*minMaxConstraints, error) { - if min > max { - return nil, fmt.Errorf("min level can't be greater than max. Got min: %d, max: %d", min, max) - } - if min < TraceLvl || min > CriticalLvl { - return nil, fmt.Errorf("min level can't be less than Trace or greater than Critical. Got min: %d", min) - } - if max < TraceLvl || max > CriticalLvl { - return nil, fmt.Errorf("max level can't be less than Trace or greater than Critical. Got max: %d", max) - } - - return &minMaxConstraints{min, max}, nil -} - -// IsAllowed returns true, if log level is in [min, max] range (inclusive). -func (minMaxConstr *minMaxConstraints) IsAllowed(level LogLevel) bool { - return level >= minMaxConstr.min && level <= minMaxConstr.max -} - -func (minMaxConstr *minMaxConstraints) String() string { - return fmt.Sprintf("Min: %s. Max: %s", minMaxConstr.min, minMaxConstr.max) -} - -//======================================================= - -// A listConstraints represents constraints which use allowed log levels list. -type listConstraints struct { - allowedLevels map[LogLevel]bool -} - -// NewListConstraints creates a new listConstraints struct with the specified allowed levels. -func NewListConstraints(allowList []LogLevel) (*listConstraints, error) { - if allowList == nil { - return nil, errors.New("list can't be nil") - } - - allowLevels, err := createMapFromList(allowList) - if err != nil { - return nil, err - } - err = validateOffLevel(allowLevels) - if err != nil { - return nil, err - } - - return &listConstraints{allowLevels}, nil -} - -func (listConstr *listConstraints) String() string { - allowedList := "List: " - - listLevel := make([]string, len(listConstr.allowedLevels)) - - var logLevel LogLevel - i := 0 - for logLevel = TraceLvl; logLevel <= Off; logLevel++ { - if listConstr.allowedLevels[logLevel] { - listLevel[i] = logLevel.String() - i++ - } - } - - allowedList += strings.Join(listLevel, ",") - - return allowedList -} - -func createMapFromList(allowedList []LogLevel) (map[LogLevel]bool, error) { - allowedLevels := make(map[LogLevel]bool, 0) - for _, level := range allowedList { - if level < TraceLvl || level > Off { - return nil, fmt.Errorf("level can't be less than Trace or greater than Critical. Got level: %d", level) - } - allowedLevels[level] = true - } - return allowedLevels, nil -} -func validateOffLevel(allowedLevels map[LogLevel]bool) error { - if _, ok := allowedLevels[Off]; ok && len(allowedLevels) > 1 { - return errors.New("logLevel Off cant be mixed with other levels") - } - - return nil -} - -// IsAllowed returns true, if log level is in allowed log levels list. -// If the list contains the only item 'common.Off' then IsAllowed will always return false for any input values. -func (listConstr *listConstraints) IsAllowed(level LogLevel) bool { - for l := range listConstr.allowedLevels { - if l == level && level != Off { - return true - } - } - - return false -} - -// AllowedLevels returns allowed levels configuration as a map. -func (listConstr *listConstraints) AllowedLevels() map[LogLevel]bool { - return listConstr.allowedLevels -} - -//======================================================= - -type offConstraints struct { -} - -func NewOffConstraints() (*offConstraints, error) { - return &offConstraints{}, nil -} - -func (offConstr *offConstraints) IsAllowed(level LogLevel) bool { - return false -} - -func (offConstr *offConstraints) String() string { - return "Off constraint" -} diff --git a/vendor/github.com/cihub/seelog/common_context.go b/vendor/github.com/cihub/seelog/common_context.go deleted file mode 100644 index 230a76ca1..000000000 --- a/vendor/github.com/cihub/seelog/common_context.go +++ /dev/null @@ -1,234 +0,0 @@ -// Copyright (c) 2012 - Cloud Instruments Co., Ltd. -// -// 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. - -package seelog - -import ( - "errors" - "fmt" - "os" - "path/filepath" - "runtime" - "strings" - "sync" - "time" -) - -var ( - workingDir = "/" - stackCache map[uintptr]*logContext - stackCacheLock sync.RWMutex -) - -func init() { - wd, err := os.Getwd() - if err == nil { - workingDir = filepath.ToSlash(wd) + "/" - } - stackCache = make(map[uintptr]*logContext) -} - -// Represents runtime caller context. -type LogContextInterface interface { - // Caller's function name. - Func() string - // Caller's line number. - Line() int - // Caller's file short path (in slashed form). - ShortPath() string - // Caller's file full path (in slashed form). - FullPath() string - // Caller's file name (without path). - FileName() string - // True if the context is correct and may be used. - // If false, then an error in context evaluation occurred and - // all its other data may be corrupted. - IsValid() bool - // Time when log function was called. - CallTime() time.Time - // Custom context that can be set by calling logger.SetContext - CustomContext() interface{} -} - -// Returns context of the caller -func currentContext(custom interface{}) (LogContextInterface, error) { - return specifyContext(1, custom) -} - -func extractCallerInfo(skip int) (*logContext, error) { - var stack [1]uintptr - if runtime.Callers(skip+1, stack[:]) != 1 { - return nil, errors.New("error during runtime.Callers") - } - pc := stack[0] - - // do we have a cache entry? - stackCacheLock.RLock() - ctx, ok := stackCache[pc] - stackCacheLock.RUnlock() - if ok { - return ctx, nil - } - - // look up the details of the given caller - funcInfo := runtime.FuncForPC(pc) - if funcInfo == nil { - return nil, errors.New("error during runtime.FuncForPC") - } - - var shortPath string - fullPath, line := funcInfo.FileLine(pc) - if strings.HasPrefix(fullPath, workingDir) { - shortPath = fullPath[len(workingDir):] - } else { - shortPath = fullPath - } - funcName := funcInfo.Name() - if strings.HasPrefix(funcName, workingDir) { - funcName = funcName[len(workingDir):] - } - - ctx = &logContext{ - funcName: funcName, - line: line, - shortPath: shortPath, - fullPath: fullPath, - fileName: filepath.Base(fullPath), - } - - // save the details in the cache; note that it's possible we might - // have written an entry into the map in between the test above and - // this section, but the behaviour is still correct - stackCacheLock.Lock() - stackCache[pc] = ctx - stackCacheLock.Unlock() - return ctx, nil -} - -// Returns context of the function with placed "skip" stack frames of the caller -// If skip == 0 then behaves like currentContext -// Context is returned in any situation, even if error occurs. But, if an error -// occurs, the returned context is an error context, which contains no paths -// or names, but states that they can't be extracted. -func specifyContext(skip int, custom interface{}) (LogContextInterface, error) { - callTime := time.Now() - if skip < 0 { - err := fmt.Errorf("can not skip negative stack frames") - return &errorContext{callTime, err}, err - } - caller, err := extractCallerInfo(skip + 2) - if err != nil { - return &errorContext{callTime, err}, err - } - ctx := new(logContext) - *ctx = *caller - ctx.callTime = callTime - ctx.custom = custom - return ctx, nil -} - -// Represents a normal runtime caller context. -type logContext struct { - funcName string - line int - shortPath string - fullPath string - fileName string - callTime time.Time - custom interface{} -} - -func (context *logContext) IsValid() bool { - return true -} - -func (context *logContext) Func() string { - return context.funcName -} - -func (context *logContext) Line() int { - return context.line -} - -func (context *logContext) ShortPath() string { - return context.shortPath -} - -func (context *logContext) FullPath() string { - return context.fullPath -} - -func (context *logContext) FileName() string { - return context.fileName -} - -func (context *logContext) CallTime() time.Time { - return context.callTime -} - -func (context *logContext) CustomContext() interface{} { - return context.custom -} - -// Represents an error context -type errorContext struct { - errorTime time.Time - err error -} - -func (errContext *errorContext) getErrorText(prefix string) string { - return fmt.Sprintf("%s() error: %s", prefix, errContext.err) -} - -func (errContext *errorContext) IsValid() bool { - return false -} - -func (errContext *errorContext) Line() int { - return -1 -} - -func (errContext *errorContext) Func() string { - return errContext.getErrorText("Func") -} - -func (errContext *errorContext) ShortPath() string { - return errContext.getErrorText("ShortPath") -} - -func (errContext *errorContext) FullPath() string { - return errContext.getErrorText("FullPath") -} - -func (errContext *errorContext) FileName() string { - return errContext.getErrorText("FileName") -} - -func (errContext *errorContext) CallTime() time.Time { - return errContext.errorTime -} - -func (errContext *errorContext) CustomContext() interface{} { - return nil -} diff --git a/vendor/github.com/cihub/seelog/common_exception.go b/vendor/github.com/cihub/seelog/common_exception.go deleted file mode 100644 index 9acc27507..000000000 --- a/vendor/github.com/cihub/seelog/common_exception.go +++ /dev/null @@ -1,194 +0,0 @@ -// Copyright (c) 2012 - Cloud Instruments Co., Ltd. -// -// 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. - -package seelog - -import ( - "errors" - "fmt" - "regexp" - "strings" -) - -// Used in rules creation to validate input file and func filters -var ( - fileFormatValidator = regexp.MustCompile(`[a-zA-Z0-9\\/ _\*\.]*`) - funcFormatValidator = regexp.MustCompile(`[a-zA-Z0-9_\*\.]*`) -) - -// LogLevelException represents an exceptional case used when you need some specific files or funcs to -// override general constraints and to use their own. -type LogLevelException struct { - funcPatternParts []string - filePatternParts []string - - funcPattern string - filePattern string - - constraints logLevelConstraints -} - -// NewLogLevelException creates a new exception. -func NewLogLevelException(funcPattern string, filePattern string, constraints logLevelConstraints) (*LogLevelException, error) { - if constraints == nil { - return nil, errors.New("constraints can not be nil") - } - - exception := new(LogLevelException) - - err := exception.initFuncPatternParts(funcPattern) - if err != nil { - return nil, err - } - exception.funcPattern = strings.Join(exception.funcPatternParts, "") - - err = exception.initFilePatternParts(filePattern) - if err != nil { - return nil, err - } - exception.filePattern = strings.Join(exception.filePatternParts, "") - - exception.constraints = constraints - - return exception, nil -} - -// MatchesContext returns true if context matches the patterns of this LogLevelException -func (logLevelEx *LogLevelException) MatchesContext(context LogContextInterface) bool { - return logLevelEx.match(context.Func(), context.FullPath()) -} - -// IsAllowed returns true if log level is allowed according to the constraints of this LogLevelException -func (logLevelEx *LogLevelException) IsAllowed(level LogLevel) bool { - return logLevelEx.constraints.IsAllowed(level) -} - -// FuncPattern returns the function pattern of a exception -func (logLevelEx *LogLevelException) FuncPattern() string { - return logLevelEx.funcPattern -} - -// FuncPattern returns the file pattern of a exception -func (logLevelEx *LogLevelException) FilePattern() string { - return logLevelEx.filePattern -} - -// initFuncPatternParts checks whether the func filter has a correct format and splits funcPattern on parts -func (logLevelEx *LogLevelException) initFuncPatternParts(funcPattern string) (err error) { - - if funcFormatValidator.FindString(funcPattern) != funcPattern { - return errors.New("func path \"" + funcPattern + "\" contains incorrect symbols. Only a-z A-Z 0-9 _ * . allowed)") - } - - logLevelEx.funcPatternParts = splitPattern(funcPattern) - return nil -} - -// Checks whether the file filter has a correct format and splits file patterns using splitPattern. -func (logLevelEx *LogLevelException) initFilePatternParts(filePattern string) (err error) { - - if fileFormatValidator.FindString(filePattern) != filePattern { - return errors.New("file path \"" + filePattern + "\" contains incorrect symbols. Only a-z A-Z 0-9 \\ / _ * . allowed)") - } - - logLevelEx.filePatternParts = splitPattern(filePattern) - return err -} - -func (logLevelEx *LogLevelException) match(funcPath string, filePath string) bool { - if !stringMatchesPattern(logLevelEx.funcPatternParts, funcPath) { - return false - } - return stringMatchesPattern(logLevelEx.filePatternParts, filePath) -} - -func (logLevelEx *LogLevelException) String() string { - str := fmt.Sprintf("Func: %s File: %s", logLevelEx.funcPattern, logLevelEx.filePattern) - - if logLevelEx.constraints != nil { - str += fmt.Sprintf("Constr: %s", logLevelEx.constraints) - } else { - str += "nil" - } - - return str -} - -// splitPattern splits pattern into strings and asterisks. Example: "ab*cde**f" -> ["ab", "*", "cde", "*", "f"] -func splitPattern(pattern string) []string { - var patternParts []string - var lastChar rune - for _, char := range pattern { - if char == '*' { - if lastChar != '*' { - patternParts = append(patternParts, "*") - } - } else { - if len(patternParts) != 0 && lastChar != '*' { - patternParts[len(patternParts)-1] += string(char) - } else { - patternParts = append(patternParts, string(char)) - } - } - lastChar = char - } - - return patternParts -} - -// stringMatchesPattern check whether testString matches pattern with asterisks. -// Standard regexp functionality is not used here because of performance issues. -func stringMatchesPattern(patternparts []string, testString string) bool { - if len(patternparts) == 0 { - return len(testString) == 0 - } - - part := patternparts[0] - if part != "*" { - index := strings.Index(testString, part) - if index == 0 { - return stringMatchesPattern(patternparts[1:], testString[len(part):]) - } - } else { - if len(patternparts) == 1 { - return true - } - - newTestString := testString - part = patternparts[1] - for { - index := strings.Index(newTestString, part) - if index == -1 { - break - } - - newTestString = newTestString[index+len(part):] - result := stringMatchesPattern(patternparts[2:], newTestString) - if result { - return true - } - } - } - return false -} diff --git a/vendor/github.com/cihub/seelog/common_flusher.go b/vendor/github.com/cihub/seelog/common_flusher.go deleted file mode 100644 index 0ef077c8d..000000000 --- a/vendor/github.com/cihub/seelog/common_flusher.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) 2012 - Cloud Instruments Co., Ltd. -// -// 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. - -package seelog - -// flusherInterface represents all objects that have to do cleanup -// at certain moments of time (e.g. before app shutdown to avoid data loss) -type flusherInterface interface { - Flush() -} diff --git a/vendor/github.com/cihub/seelog/common_loglevel.go b/vendor/github.com/cihub/seelog/common_loglevel.go deleted file mode 100644 index d54ecf270..000000000 --- a/vendor/github.com/cihub/seelog/common_loglevel.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright (c) 2012 - Cloud Instruments Co., Ltd. -// -// 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. - -package seelog - -// Log level type -type LogLevel uint8 - -// Log levels -const ( - TraceLvl = iota - DebugLvl - InfoLvl - WarnLvl - ErrorLvl - CriticalLvl - Off -) - -// Log level string representations (used in configuration files) -const ( - TraceStr = "trace" - DebugStr = "debug" - InfoStr = "info" - WarnStr = "warn" - ErrorStr = "error" - CriticalStr = "critical" - OffStr = "off" -) - -var levelToStringRepresentations = map[LogLevel]string{ - TraceLvl: TraceStr, - DebugLvl: DebugStr, - InfoLvl: InfoStr, - WarnLvl: WarnStr, - ErrorLvl: ErrorStr, - CriticalLvl: CriticalStr, - Off: OffStr, -} - -// LogLevelFromString parses a string and returns a corresponding log level, if sucessfull. -func LogLevelFromString(levelStr string) (level LogLevel, found bool) { - for lvl, lvlStr := range levelToStringRepresentations { - if lvlStr == levelStr { - return lvl, true - } - } - - return 0, false -} - -// LogLevelToString returns seelog string representation for a specified level. Returns "" for invalid log levels. -func (level LogLevel) String() string { - levelStr, ok := levelToStringRepresentations[level] - if ok { - return levelStr - } - - return "" -} diff --git a/vendor/github.com/cihub/seelog/dispatch_custom.go b/vendor/github.com/cihub/seelog/dispatch_custom.go deleted file mode 100644 index 383a77058..000000000 --- a/vendor/github.com/cihub/seelog/dispatch_custom.go +++ /dev/null @@ -1,242 +0,0 @@ -// Copyright (c) 2013 - Cloud Instruments Co., Ltd. -// -// 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. - -package seelog - -import ( - "errors" - "fmt" - "reflect" - "sort" -) - -var registeredReceivers = make(map[string]reflect.Type) - -// RegisterReceiver records a custom receiver type, identified by a value -// of that type (second argument), under the specified name. Registered -// names can be used in the "name" attribute of config items. -// -// RegisterReceiver takes the type of the receiver argument, without taking -// the value into the account. So do NOT enter any data to the second argument -// and only call it like: -// RegisterReceiver("somename", &MyReceiverType{}) -// -// After that, when a '' config tag with this name is used, -// a receiver of the specified type would be instantiated. Check -// CustomReceiver comments for interface details. -// -// NOTE 1: RegisterReceiver fails if you attempt to register different types -// with the same name. -// -// NOTE 2: RegisterReceiver registers those receivers that must be used in -// the configuration files ( items). Basically it is just the way -// you tell seelog config parser what should it do when it meets a -// tag with a specific name and data attributes. -// -// But If you are only using seelog as a proxy to an already instantiated -// CustomReceiver (via LoggerFromCustomReceiver func), you should not call RegisterReceiver. -func RegisterReceiver(name string, receiver CustomReceiver) { - newType := reflect.TypeOf(reflect.ValueOf(receiver).Elem().Interface()) - if t, ok := registeredReceivers[name]; ok && t != newType { - panic(fmt.Sprintf("duplicate types for %s: %s != %s", name, t, newType)) - } - registeredReceivers[name] = newType -} - -func customReceiverByName(name string) (creceiver CustomReceiver, err error) { - rt, ok := registeredReceivers[name] - if !ok { - return nil, fmt.Errorf("custom receiver name not registered: '%s'", name) - } - v, ok := reflect.New(rt).Interface().(CustomReceiver) - if !ok { - return nil, fmt.Errorf("cannot instantiate receiver with name='%s'", name) - } - return v, nil -} - -// CustomReceiverInitArgs represent arguments passed to the CustomReceiver.Init -// func when custom receiver is being initialized. -type CustomReceiverInitArgs struct { - // XmlCustomAttrs represent '' xml config item attributes that - // start with "data-". Map keys will be the attribute names without the "data-". - // Map values will the those attribute values. - // - // E.g. if you have a '' - // you will get map with 2 key-value pairs: "attr1"->"a1", "attr2"->"a2" - // - // Note that in custom items you can only use allowed attributes, like "name" and - // your custom attributes, starting with "data-". Any other will lead to a - // parsing error. - XmlCustomAttrs map[string]string -} - -// CustomReceiver is the interface that external custom seelog message receivers -// must implement in order to be able to process seelog messages. Those receivers -// are set in the xml config file using the tag. Check receivers reference -// wiki section on that. -// -// Use seelog.RegisterReceiver on the receiver type before using it. -type CustomReceiver interface { - // ReceiveMessage is called when the custom receiver gets seelog message from - // a parent dispatcher. - // - // Message, level and context args represent all data that was included in the seelog - // message at the time it was logged. - // - // The formatting is already applied to the message and depends on the config - // like with any other receiver. - // - // If you would like to inform seelog of an error that happened during the handling of - // the message, return a non-nil error. This way you'll end up seeing your error like - // any other internal seelog error. - ReceiveMessage(message string, level LogLevel, context LogContextInterface) error - - // AfterParse is called immediately after your custom receiver is instantiated by - // the xml config parser. So, if you need to do any startup logic after config parsing, - // like opening file or allocating any resources after the receiver is instantiated, do it here. - // - // If this func returns a non-nil error, then the loading procedure will fail. E.g. - // if you are loading a seelog xml config, the parser would not finish the loading - // procedure and inform about an error like with any other config error. - // - // If your custom logger needs some configuration, you can use custom attributes in - // your config. Check CustomReceiverInitArgs.XmlCustomAttrs comments. - // - // IMPORTANT: This func is NOT called when the LoggerFromCustomReceiver func is used - // to create seelog proxy logger using the custom receiver. This func is only called when - // receiver is instantiated from a config. - AfterParse(initArgs CustomReceiverInitArgs) error - - // Flush is called when the custom receiver gets a 'flush' directive from a - // parent receiver. If custom receiver implements some kind of buffering or - // queing, then the appropriate reaction on a flush message is synchronous - // flushing of all those queues/buffers. If custom receiver doesn't have - // such mechanisms, then flush implementation may be left empty. - Flush() - - // Close is called when the custom receiver gets a 'close' directive from a - // parent receiver. This happens when a top-level seelog dispatcher is sending - // 'close' to all child nodes and it means that current seelog logger is being closed. - // If you need to do any cleanup after your custom receiver is done, you should do - // it here. - Close() error -} - -type customReceiverDispatcher struct { - formatter *formatter - innerReceiver CustomReceiver - customReceiverName string - usedArgs CustomReceiverInitArgs -} - -// NewCustomReceiverDispatcher creates a customReceiverDispatcher which dispatches data to a specific receiver created -// using a tag in the config file. -func NewCustomReceiverDispatcher(formatter *formatter, customReceiverName string, cArgs CustomReceiverInitArgs) (*customReceiverDispatcher, error) { - if formatter == nil { - return nil, errors.New("formatter cannot be nil") - } - if len(customReceiverName) == 0 { - return nil, errors.New("custom receiver name cannot be empty") - } - - creceiver, err := customReceiverByName(customReceiverName) - if err != nil { - return nil, err - } - err = creceiver.AfterParse(cArgs) - if err != nil { - return nil, err - } - disp := &customReceiverDispatcher{formatter, creceiver, customReceiverName, cArgs} - - return disp, nil -} - -// NewCustomReceiverDispatcherByValue is basically the same as NewCustomReceiverDispatcher, but using -// a specific CustomReceiver value instead of instantiating a new one by type. -func NewCustomReceiverDispatcherByValue(formatter *formatter, customReceiver CustomReceiver, name string, cArgs CustomReceiverInitArgs) (*customReceiverDispatcher, error) { - if formatter == nil { - return nil, errors.New("formatter cannot be nil") - } - if customReceiver == nil { - return nil, errors.New("customReceiver cannot be nil") - } - disp := &customReceiverDispatcher{formatter, customReceiver, name, cArgs} - - return disp, nil -} - -// CustomReceiver implementation. Check CustomReceiver comments. -func (disp *customReceiverDispatcher) Dispatch( - message string, - level LogLevel, - context LogContextInterface, - errorFunc func(err error)) { - - defer func() { - if err := recover(); err != nil { - errorFunc(fmt.Errorf("panic in custom receiver '%s'.Dispatch: %s", reflect.TypeOf(disp.innerReceiver), err)) - } - }() - - err := disp.innerReceiver.ReceiveMessage(disp.formatter.Format(message, level, context), level, context) - if err != nil { - errorFunc(err) - } -} - -// CustomReceiver implementation. Check CustomReceiver comments. -func (disp *customReceiverDispatcher) Flush() { - disp.innerReceiver.Flush() -} - -// CustomReceiver implementation. Check CustomReceiver comments. -func (disp *customReceiverDispatcher) Close() error { - disp.innerReceiver.Flush() - - err := disp.innerReceiver.Close() - if err != nil { - return err - } - - return nil -} - -func (disp *customReceiverDispatcher) String() string { - datas := "" - skeys := make([]string, 0, len(disp.usedArgs.XmlCustomAttrs)) - for i := range disp.usedArgs.XmlCustomAttrs { - skeys = append(skeys, i) - } - sort.Strings(skeys) - for _, key := range skeys { - datas += fmt.Sprintf("<%s, %s> ", key, disp.usedArgs.XmlCustomAttrs[key]) - } - - str := fmt.Sprintf("Custom receiver %s [fmt='%s'],[data='%s'],[inner='%s']\n", - disp.customReceiverName, disp.formatter.String(), datas, disp.innerReceiver) - - return str -} diff --git a/vendor/github.com/cihub/seelog/dispatch_dispatcher.go b/vendor/github.com/cihub/seelog/dispatch_dispatcher.go deleted file mode 100644 index 2bd3b4a4c..000000000 --- a/vendor/github.com/cihub/seelog/dispatch_dispatcher.go +++ /dev/null @@ -1,189 +0,0 @@ -// Copyright (c) 2012 - Cloud Instruments Co., Ltd. -// -// 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. - -package seelog - -import ( - "errors" - "fmt" - "io" -) - -// A dispatcherInterface is used to dispatch message to all underlying receivers. -// Dispatch logic depends on given context and log level. Any errors are reported using errorFunc. -// Also, as underlying receivers may have a state, dispatcher has a ShuttingDown method which performs -// an immediate cleanup of all data that is stored in the receivers -type dispatcherInterface interface { - flusherInterface - io.Closer - Dispatch(message string, level LogLevel, context LogContextInterface, errorFunc func(err error)) -} - -type dispatcher struct { - formatter *formatter - writers []*formattedWriter - dispatchers []dispatcherInterface -} - -// Creates a dispatcher which dispatches data to a list of receivers. -// Each receiver should be either a Dispatcher or io.Writer, otherwise an error will be returned -func createDispatcher(formatter *formatter, receivers []interface{}) (*dispatcher, error) { - if formatter == nil { - return nil, errors.New("formatter cannot be nil") - } - if receivers == nil || len(receivers) == 0 { - return nil, errors.New("receivers cannot be nil or empty") - } - - disp := &dispatcher{formatter, make([]*formattedWriter, 0), make([]dispatcherInterface, 0)} - for _, receiver := range receivers { - writer, ok := receiver.(*formattedWriter) - if ok { - disp.writers = append(disp.writers, writer) - continue - } - - ioWriter, ok := receiver.(io.Writer) - if ok { - writer, err := NewFormattedWriter(ioWriter, disp.formatter) - if err != nil { - return nil, err - } - disp.writers = append(disp.writers, writer) - continue - } - - dispInterface, ok := receiver.(dispatcherInterface) - if ok { - disp.dispatchers = append(disp.dispatchers, dispInterface) - continue - } - - return nil, errors.New("method can receive either io.Writer or dispatcherInterface") - } - - return disp, nil -} - -func (disp *dispatcher) Dispatch( - message string, - level LogLevel, - context LogContextInterface, - errorFunc func(err error)) { - - for _, writer := range disp.writers { - err := writer.Write(message, level, context) - if err != nil { - errorFunc(err) - } - } - - for _, dispInterface := range disp.dispatchers { - dispInterface.Dispatch(message, level, context, errorFunc) - } -} - -// Flush goes through all underlying writers which implement flusherInterface interface -// and closes them. Recursively performs the same action for underlying dispatchers -func (disp *dispatcher) Flush() { - for _, disp := range disp.Dispatchers() { - disp.Flush() - } - - for _, formatWriter := range disp.Writers() { - flusher, ok := formatWriter.Writer().(flusherInterface) - if ok { - flusher.Flush() - } - } -} - -// Close goes through all underlying writers which implement io.Closer interface -// and closes them. Recursively performs the same action for underlying dispatchers -// Before closing, writers are flushed to prevent loss of any buffered data, so -// a call to Flush() func before Close() is not necessary -func (disp *dispatcher) Close() error { - for _, disp := range disp.Dispatchers() { - disp.Flush() - err := disp.Close() - if err != nil { - return err - } - } - - for _, formatWriter := range disp.Writers() { - flusher, ok := formatWriter.Writer().(flusherInterface) - if ok { - flusher.Flush() - } - - closer, ok := formatWriter.Writer().(io.Closer) - if ok { - err := closer.Close() - if err != nil { - return err - } - } - } - - return nil -} - -func (disp *dispatcher) Writers() []*formattedWriter { - return disp.writers -} - -func (disp *dispatcher) Dispatchers() []dispatcherInterface { - return disp.dispatchers -} - -func (disp *dispatcher) String() string { - str := "formatter: " + disp.formatter.String() + "\n" - - str += " ->Dispatchers:" - - if len(disp.dispatchers) == 0 { - str += "none\n" - } else { - str += "\n" - - for _, disp := range disp.dispatchers { - str += fmt.Sprintf(" ->%s", disp) - } - } - - str += " ->Writers:" - - if len(disp.writers) == 0 { - str += "none\n" - } else { - str += "\n" - - for _, writer := range disp.writers { - str += fmt.Sprintf(" ->%s\n", writer) - } - } - - return str -} diff --git a/vendor/github.com/cihub/seelog/dispatch_filterdispatcher.go b/vendor/github.com/cihub/seelog/dispatch_filterdispatcher.go deleted file mode 100644 index 9de8a7225..000000000 --- a/vendor/github.com/cihub/seelog/dispatch_filterdispatcher.go +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright (c) 2012 - Cloud Instruments Co., Ltd. -// -// 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. - -package seelog - -import ( - "fmt" -) - -// A filterDispatcher writes the given message to underlying receivers only if message log level -// is in the allowed list. -type filterDispatcher struct { - *dispatcher - allowList map[LogLevel]bool -} - -// NewFilterDispatcher creates a new filterDispatcher using a list of allowed levels. -func NewFilterDispatcher(formatter *formatter, receivers []interface{}, allowList ...LogLevel) (*filterDispatcher, error) { - disp, err := createDispatcher(formatter, receivers) - if err != nil { - return nil, err - } - - allows := make(map[LogLevel]bool) - for _, allowLevel := range allowList { - allows[allowLevel] = true - } - - return &filterDispatcher{disp, allows}, nil -} - -func (filter *filterDispatcher) Dispatch( - message string, - level LogLevel, - context LogContextInterface, - errorFunc func(err error)) { - isAllowed, ok := filter.allowList[level] - if ok && isAllowed { - filter.dispatcher.Dispatch(message, level, context, errorFunc) - } -} - -func (filter *filterDispatcher) String() string { - return fmt.Sprintf("filterDispatcher ->\n%s", filter.dispatcher) -} diff --git a/vendor/github.com/cihub/seelog/dispatch_splitdispatcher.go b/vendor/github.com/cihub/seelog/dispatch_splitdispatcher.go deleted file mode 100644 index 1d0fe7eac..000000000 --- a/vendor/github.com/cihub/seelog/dispatch_splitdispatcher.go +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) 2012 - Cloud Instruments Co., Ltd. -// -// 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. - -package seelog - -import ( - "fmt" -) - -// A splitDispatcher just writes the given message to underlying receivers. (Splits the message stream.) -type splitDispatcher struct { - *dispatcher -} - -func NewSplitDispatcher(formatter *formatter, receivers []interface{}) (*splitDispatcher, error) { - disp, err := createDispatcher(formatter, receivers) - if err != nil { - return nil, err - } - - return &splitDispatcher{disp}, nil -} - -func (splitter *splitDispatcher) String() string { - return fmt.Sprintf("splitDispatcher ->\n%s", splitter.dispatcher.String()) -} diff --git a/vendor/github.com/cihub/seelog/doc.go b/vendor/github.com/cihub/seelog/doc.go deleted file mode 100644 index 2734c9cbb..000000000 --- a/vendor/github.com/cihub/seelog/doc.go +++ /dev/null @@ -1,175 +0,0 @@ -// Copyright (c) 2014 - Cloud Instruments Co., Ltd. -// -// 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. - -/* -Package seelog implements logging functionality with flexible dispatching, filtering, and formatting. - -Creation - -To create a logger, use one of the following constructors: - func LoggerFromConfigAsBytes - func LoggerFromConfigAsFile - func LoggerFromConfigAsString - func LoggerFromWriterWithMinLevel - func LoggerFromWriterWithMinLevelAndFormat - func LoggerFromCustomReceiver (check https://github.com/cihub/seelog/wiki/Custom-receivers) -Example: - import log "github.com/cihub/seelog" - - func main() { - logger, err := log.LoggerFromConfigAsFile("seelog.xml") - if err != nil { - panic(err) - } - defer logger.Flush() - ... use logger ... - } -The "defer" line is important because if you are using asynchronous logger behavior, without this line you may end up losing some -messages when you close your application because they are processed in another non-blocking goroutine. To avoid that you -explicitly defer flushing all messages before closing. - -Usage - -Logger created using one of the LoggerFrom* funcs can be used directly by calling one of the main log funcs. -Example: - import log "github.com/cihub/seelog" - - func main() { - logger, err := log.LoggerFromConfigAsFile("seelog.xml") - if err != nil { - panic(err) - } - defer logger.Flush() - logger.Trace("test") - logger.Debugf("var = %s", "abc") - } - -Having loggers as variables is convenient if you are writing your own package with internal logging or if you have -several loggers with different options. -But for most standalone apps it is more convenient to use package level funcs and vars. There is a package level -var 'Current' made for it. You can replace it with another logger using 'ReplaceLogger' and then use package level funcs: - import log "github.com/cihub/seelog" - - func main() { - logger, err := log.LoggerFromConfigAsFile("seelog.xml") - if err != nil { - panic(err) - } - log.ReplaceLogger(logger) - defer log.Flush() - log.Trace("test") - log.Debugf("var = %s", "abc") - } -Last lines - log.Trace("test") - log.Debugf("var = %s", "abc") -do the same as - log.Current.Trace("test") - log.Current.Debugf("var = %s", "abc") -In this example the 'Current' logger was replaced using a 'ReplaceLogger' call and became equal to 'logger' variable created from config. -This way you are able to use package level funcs instead of passing the logger variable. - -Configuration - -Main seelog point is to configure logger via config files and not the code. -The configuration is read by LoggerFrom* funcs. These funcs read xml configuration from different sources and try -to create a logger using it. - -All the configuration features are covered in detail in the official wiki: https://github.com/cihub/seelog/wiki. -There are many sections covering different aspects of seelog, but the most important for understanding configs are: - https://github.com/cihub/seelog/wiki/Constraints-and-exceptions - https://github.com/cihub/seelog/wiki/Dispatchers-and-receivers - https://github.com/cihub/seelog/wiki/Formatting - https://github.com/cihub/seelog/wiki/Logger-types -After you understand these concepts, check the 'Reference' section on the main wiki page to get the up-to-date -list of dispatchers, receivers, formats, and logger types. - -Here is an example config with all these features: - - - - - - - - - - - - - - - - - - - - - -This config represents a logger with adaptive timeout between log messages (check logger types reference) which -logs to console, all.log, and errors.log depending on the log level. Its output formats also depend on log level. This logger will only -use log level 'debug' and higher (minlevel is set) for all files with names that don't start with 'test'. For files starting with 'test' -this logger prohibits all levels below 'error'. - -Configuration using code - -Although configuration using code is not recommended, it is sometimes needed and it is possible to do with seelog. Basically, what -you need to do to get started is to create constraints, exceptions and a dispatcher tree (same as with config). Most of the New* -functions in this package are used to provide such capabilities. - -Here is an example of configuration in code, that demonstrates an async loop logger that logs to a simple split dispatcher with -a console receiver using a specified format and is filtered using a top-level min-max constraints and one expection for -the 'main.go' file. So, this is basically a demonstration of configuration of most of the features: - - package main - - import log "github.com/cihub/seelog" - - func main() { - defer log.Flush() - log.Info("Hello from Seelog!") - - consoleWriter, _ := log.NewConsoleWriter() - formatter, _ := log.NewFormatter("%Level %Msg %File%n") - root, _ := log.NewSplitDispatcher(formatter, []interface{}{consoleWriter}) - constraints, _ := log.NewMinMaxConstraints(log.TraceLvl, log.CriticalLvl) - specificConstraints, _ := log.NewListConstraints([]log.LogLevel{log.InfoLvl, log.ErrorLvl}) - ex, _ := log.NewLogLevelException("*", "*main.go", specificConstraints) - exceptions := []*log.LogLevelException{ex} - - logger := log.NewAsyncLoopLogger(log.NewLoggerConfig(constraints, exceptions, root)) - log.ReplaceLogger(logger) - - log.Trace("This should not be seen") - log.Debug("This should not be seen") - log.Info("Test") - log.Error("Test2") - } - -Examples - -To learn seelog features faster you should check the examples package: https://github.com/cihub/seelog-examples -It contains many example configs and usecases. -*/ -package seelog diff --git a/vendor/github.com/cihub/seelog/format.go b/vendor/github.com/cihub/seelog/format.go deleted file mode 100644 index ec47b4570..000000000 --- a/vendor/github.com/cihub/seelog/format.go +++ /dev/null @@ -1,466 +0,0 @@ -// Copyright (c) 2012 - Cloud Instruments Co., Ltd. -// -// 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. - -package seelog - -import ( - "bytes" - "errors" - "fmt" - "strconv" - "strings" - "unicode" - "unicode/utf8" -) - -// FormatterSymbol is a special symbol used in config files to mark special format aliases. -const ( - FormatterSymbol = '%' -) - -const ( - formatterParameterStart = '(' - formatterParameterEnd = ')' -) - -// Time and date formats used for %Date and %Time aliases. -const ( - DateDefaultFormat = "2006-01-02" - TimeFormat = "15:04:05" -) - -var DefaultMsgFormat = "%Ns [%Level] %Msg%n" - -var ( - DefaultFormatter *formatter - msgonlyformatter *formatter -) - -func init() { - var err error - if DefaultFormatter, err = NewFormatter(DefaultMsgFormat); err != nil { - reportInternalError(fmt.Errorf("error during creating DefaultFormatter: %s", err)) - } - if msgonlyformatter, err = NewFormatter("%Msg"); err != nil { - reportInternalError(fmt.Errorf("error during creating msgonlyformatter: %s", err)) - } -} - -// FormatterFunc represents one formatter object that starts with '%' sign in the 'format' attribute -// of the 'format' config item. These special symbols are replaced with context values or special -// strings when message is written to byte receiver. -// -// Check https://github.com/cihub/seelog/wiki/Formatting for details. -// Full list (with descriptions) of formatters: https://github.com/cihub/seelog/wiki/Format-reference -// -// FormatterFunc takes raw log message, level, log context and returns a string, number (of any type) or any object -// that can be evaluated as string. -type FormatterFunc func(message string, level LogLevel, context LogContextInterface) interface{} - -// FormatterFuncCreator is a factory of FormatterFunc objects. It is used to generate parameterized -// formatters (such as %Date or %EscM) and custom user formatters. -type FormatterFuncCreator func(param string) FormatterFunc - -var formatterFuncs = map[string]FormatterFunc{ - "Level": formatterLevel, - "Lev": formatterLev, - "LEVEL": formatterLEVEL, - "LEV": formatterLEV, - "l": formatterl, - "Msg": formatterMsg, - "FullPath": formatterFullPath, - "File": formatterFile, - "RelFile": formatterRelFile, - "Func": FormatterFunction, - "FuncShort": FormatterFunctionShort, - "Line": formatterLine, - "Time": formatterTime, - "UTCTime": formatterUTCTime, - "Ns": formatterNs, - "UTCNs": formatterUTCNs, - "r": formatterr, - "n": formattern, - "t": formattert, -} - -var formatterFuncsParameterized = map[string]FormatterFuncCreator{ - "Date": createDateTimeFormatterFunc, - "UTCDate": createUTCDateTimeFormatterFunc, - "EscM": createANSIEscapeFunc, -} - -func errorAliasReserved(name string) error { - return fmt.Errorf("cannot use '%s' as custom formatter name. Name is reserved", name) -} - -// RegisterCustomFormatter registers a new custom formatter factory with a given name. If returned error is nil, -// then this name (prepended by '%' symbol) can be used in 'format' attributes in configuration and -// it will be treated like the standard parameterized formatter identifiers. -// -// RegisterCustomFormatter needs to be called before creating a logger for it to take effect. The general recommendation -// is to call it once in 'init' func of your application or any initializer func. -// -// For usage examples, check https://github.com/cihub/seelog/wiki/Custom-formatters. -// -// Name must only consist of letters (unicode.IsLetter). -// -// Name must not be one of the already registered standard formatter names -// (https://github.com/cihub/seelog/wiki/Format-reference) and previously registered -// custom format names. To avoid any potential name conflicts (in future releases), it is recommended -// to start your custom formatter name with a namespace (e.g. 'MyCompanySomething') or a 'Custom' keyword. -func RegisterCustomFormatter(name string, creator FormatterFuncCreator) error { - if _, ok := formatterFuncs[name]; ok { - return errorAliasReserved(name) - } - if _, ok := formatterFuncsParameterized[name]; ok { - return errorAliasReserved(name) - } - formatterFuncsParameterized[name] = creator - return nil -} - -// formatter is used to write messages in a specific format, inserting such additional data -// as log level, date/time, etc. -type formatter struct { - fmtStringOriginal string - fmtString string - formatterFuncs []FormatterFunc -} - -// NewFormatter creates a new formatter using a format string -func NewFormatter(formatString string) (*formatter, error) { - fmtr := new(formatter) - fmtr.fmtStringOriginal = formatString - if err := buildFormatterFuncs(fmtr); err != nil { - return nil, err - } - return fmtr, nil -} - -func buildFormatterFuncs(formatter *formatter) error { - var ( - fsbuf = new(bytes.Buffer) - fsolm1 = len(formatter.fmtStringOriginal) - 1 - ) - for i := 0; i <= fsolm1; i++ { - if char := formatter.fmtStringOriginal[i]; char != FormatterSymbol { - fsbuf.WriteByte(char) - continue - } - // Check if the index is at the end of the string. - if i == fsolm1 { - return fmt.Errorf("format error: %c cannot be last symbol", FormatterSymbol) - } - // Check if the formatter symbol is doubled and skip it as nonmatching. - if formatter.fmtStringOriginal[i+1] == FormatterSymbol { - fsbuf.WriteRune(FormatterSymbol) - i++ - continue - } - function, ni, err := formatter.extractFormatterFunc(i + 1) - if err != nil { - return err - } - // Append formatting string "%v". - fsbuf.Write([]byte{37, 118}) - i = ni - formatter.formatterFuncs = append(formatter.formatterFuncs, function) - } - formatter.fmtString = fsbuf.String() - return nil -} - -func (formatter *formatter) extractFormatterFunc(index int) (FormatterFunc, int, error) { - letterSequence := formatter.extractLetterSequence(index) - if len(letterSequence) == 0 { - return nil, 0, fmt.Errorf("format error: lack of formatter after %c at %d", FormatterSymbol, index) - } - - function, formatterLength, ok := formatter.findFormatterFunc(letterSequence) - if ok { - return function, index + formatterLength - 1, nil - } - - function, formatterLength, ok, err := formatter.findFormatterFuncParametrized(letterSequence, index) - if err != nil { - return nil, 0, err - } - if ok { - return function, index + formatterLength - 1, nil - } - - return nil, 0, errors.New("format error: unrecognized formatter at " + strconv.Itoa(index) + ": " + letterSequence) -} - -func (formatter *formatter) extractLetterSequence(index int) string { - letters := "" - - bytesToParse := []byte(formatter.fmtStringOriginal[index:]) - runeCount := utf8.RuneCount(bytesToParse) - for i := 0; i < runeCount; i++ { - rune, runeSize := utf8.DecodeRune(bytesToParse) - bytesToParse = bytesToParse[runeSize:] - - if unicode.IsLetter(rune) { - letters += string(rune) - } else { - break - } - } - return letters -} - -func (formatter *formatter) findFormatterFunc(letters string) (FormatterFunc, int, bool) { - currentVerb := letters - for i := 0; i < len(letters); i++ { - function, ok := formatterFuncs[currentVerb] - if ok { - return function, len(currentVerb), ok - } - currentVerb = currentVerb[:len(currentVerb)-1] - } - - return nil, 0, false -} - -func (formatter *formatter) findFormatterFuncParametrized(letters string, lettersStartIndex int) (FormatterFunc, int, bool, error) { - currentVerb := letters - for i := 0; i < len(letters); i++ { - functionCreator, ok := formatterFuncsParameterized[currentVerb] - if ok { - parameter := "" - parameterLen := 0 - isVerbEqualsLetters := i == 0 // if not, then letter goes after formatter, and formatter is parameterless - if isVerbEqualsLetters { - userParameter := "" - var err error - userParameter, parameterLen, ok, err = formatter.findparameter(lettersStartIndex + len(currentVerb)) - if ok { - parameter = userParameter - } else if err != nil { - return nil, 0, false, err - } - } - - return functionCreator(parameter), len(currentVerb) + parameterLen, true, nil - } - - currentVerb = currentVerb[:len(currentVerb)-1] - } - - return nil, 0, false, nil -} - -func (formatter *formatter) findparameter(startIndex int) (string, int, bool, error) { - if len(formatter.fmtStringOriginal) == startIndex || formatter.fmtStringOriginal[startIndex] != formatterParameterStart { - return "", 0, false, nil - } - - endIndex := strings.Index(formatter.fmtStringOriginal[startIndex:], string(formatterParameterEnd)) - if endIndex == -1 { - return "", 0, false, fmt.Errorf("Unmatched parenthesis or invalid parameter at %d: %s", - startIndex, formatter.fmtStringOriginal[startIndex:]) - } - endIndex += startIndex - - length := endIndex - startIndex + 1 - - return formatter.fmtStringOriginal[startIndex+1 : endIndex], length, true, nil -} - -// Format processes a message with special formatters, log level, and context. Returns formatted string -// with all formatter identifiers changed to appropriate values. -func (formatter *formatter) Format(message string, level LogLevel, context LogContextInterface) string { - if len(formatter.formatterFuncs) == 0 { - return formatter.fmtString - } - - params := make([]interface{}, len(formatter.formatterFuncs)) - for i, function := range formatter.formatterFuncs { - params[i] = function(message, level, context) - } - - return fmt.Sprintf(formatter.fmtString, params...) -} - -func (formatter *formatter) String() string { - return formatter.fmtStringOriginal -} - -//===================================================== - -const ( - wrongLogLevel = "WRONG_LOGLEVEL" - wrongEscapeCode = "WRONG_ESCAPE" -) - -var levelToString = map[LogLevel]string{ - TraceLvl: "Trace", - DebugLvl: "Debug", - InfoLvl: "Info", - WarnLvl: "Warn", - ErrorLvl: "Error", - CriticalLvl: "Critical", - Off: "Off", -} - -var levelToShortString = map[LogLevel]string{ - TraceLvl: "Trc", - DebugLvl: "Dbg", - InfoLvl: "Inf", - WarnLvl: "Wrn", - ErrorLvl: "Err", - CriticalLvl: "Crt", - Off: "Off", -} - -var levelToShortestString = map[LogLevel]string{ - TraceLvl: "t", - DebugLvl: "d", - InfoLvl: "i", - WarnLvl: "w", - ErrorLvl: "e", - CriticalLvl: "c", - Off: "o", -} - -func formatterLevel(message string, level LogLevel, context LogContextInterface) interface{} { - levelStr, ok := levelToString[level] - if !ok { - return wrongLogLevel - } - return levelStr -} - -func formatterLev(message string, level LogLevel, context LogContextInterface) interface{} { - levelStr, ok := levelToShortString[level] - if !ok { - return wrongLogLevel - } - return levelStr -} - -func formatterLEVEL(message string, level LogLevel, context LogContextInterface) interface{} { - return strings.ToTitle(formatterLevel(message, level, context).(string)) -} - -func formatterLEV(message string, level LogLevel, context LogContextInterface) interface{} { - return strings.ToTitle(formatterLev(message, level, context).(string)) -} - -func formatterl(message string, level LogLevel, context LogContextInterface) interface{} { - levelStr, ok := levelToShortestString[level] - if !ok { - return wrongLogLevel - } - return levelStr -} - -func formatterMsg(message string, level LogLevel, context LogContextInterface) interface{} { - return message -} - -func formatterFullPath(message string, level LogLevel, context LogContextInterface) interface{} { - return context.FullPath() -} - -func formatterFile(message string, level LogLevel, context LogContextInterface) interface{} { - return context.FileName() -} - -func formatterRelFile(message string, level LogLevel, context LogContextInterface) interface{} { - return context.ShortPath() -} - -func FormatterFunction(message string, level LogLevel, context LogContextInterface) interface{} { - return context.Func() -} - -func FormatterFunctionShort(message string, level LogLevel, context LogContextInterface) interface{} { - f := context.Func() - spl := strings.Split(f, ".") - return spl[len(spl)-1] -} - -func formatterLine(message string, level LogLevel, context LogContextInterface) interface{} { - return context.Line() -} - -func formatterTime(message string, level LogLevel, context LogContextInterface) interface{} { - return context.CallTime().Format(TimeFormat) -} - -func formatterUTCTime(message string, level LogLevel, context LogContextInterface) interface{} { - return context.CallTime().UTC().Format(TimeFormat) -} - -func formatterNs(message string, level LogLevel, context LogContextInterface) interface{} { - return context.CallTime().UnixNano() -} - -func formatterUTCNs(message string, level LogLevel, context LogContextInterface) interface{} { - return context.CallTime().UTC().UnixNano() -} - -func formatterr(message string, level LogLevel, context LogContextInterface) interface{} { - return "\r" -} - -func formattern(message string, level LogLevel, context LogContextInterface) interface{} { - return "\n" -} - -func formattert(message string, level LogLevel, context LogContextInterface) interface{} { - return "\t" -} - -func createDateTimeFormatterFunc(dateTimeFormat string) FormatterFunc { - format := dateTimeFormat - if format == "" { - format = DateDefaultFormat - } - return func(message string, level LogLevel, context LogContextInterface) interface{} { - return context.CallTime().Format(format) - } -} - -func createUTCDateTimeFormatterFunc(dateTimeFormat string) FormatterFunc { - format := dateTimeFormat - if format == "" { - format = DateDefaultFormat - } - return func(message string, level LogLevel, context LogContextInterface) interface{} { - return context.CallTime().UTC().Format(format) - } -} - -func createANSIEscapeFunc(escapeCodeString string) FormatterFunc { - return func(message string, level LogLevel, context LogContextInterface) interface{} { - if len(escapeCodeString) == 0 { - return wrongEscapeCode - } - - return fmt.Sprintf("%c[%sm", 0x1B, escapeCodeString) - } -} diff --git a/vendor/github.com/cihub/seelog/internals_baseerror.go b/vendor/github.com/cihub/seelog/internals_baseerror.go deleted file mode 100644 index c0b271d7d..000000000 --- a/vendor/github.com/cihub/seelog/internals_baseerror.go +++ /dev/null @@ -1,10 +0,0 @@ -package seelog - -// Base struct for custom errors. -type baseError struct { - message string -} - -func (be baseError) Error() string { - return be.message -} diff --git a/vendor/github.com/cihub/seelog/internals_fsutils.go b/vendor/github.com/cihub/seelog/internals_fsutils.go deleted file mode 100644 index c0a0e0e46..000000000 --- a/vendor/github.com/cihub/seelog/internals_fsutils.go +++ /dev/null @@ -1,320 +0,0 @@ -package seelog - -import ( - "fmt" - "io" - "os" - "path/filepath" - "sync" -) - -// File and directory permitions. -const ( - defaultFilePermissions = 0666 - defaultDirectoryPermissions = 0767 -) - -const ( - // Max number of directories can be read asynchronously. - maxDirNumberReadAsync = 1000 -) - -type cannotOpenFileError struct { - baseError -} - -func newCannotOpenFileError(fname string) *cannotOpenFileError { - return &cannotOpenFileError{baseError{message: "Cannot open file: " + fname}} -} - -type notDirectoryError struct { - baseError -} - -func newNotDirectoryError(dname string) *notDirectoryError { - return ¬DirectoryError{baseError{message: dname + " is not directory"}} -} - -// fileFilter is a filtering criteria function for '*os.File'. -// Must return 'false' to set aside the given file. -type fileFilter func(os.FileInfo, *os.File) bool - -// filePathFilter is a filtering creteria function for file path. -// Must return 'false' to set aside the given file. -type filePathFilter func(filePath string) bool - -// GetSubdirNames returns a list of directories found in -// the given one with dirPath. -func getSubdirNames(dirPath string) ([]string, error) { - fi, err := os.Stat(dirPath) - if err != nil { - return nil, err - } - if !fi.IsDir() { - return nil, newNotDirectoryError(dirPath) - } - dd, err := os.Open(dirPath) - // Cannot open file. - if err != nil { - if dd != nil { - dd.Close() - } - return nil, err - } - defer dd.Close() - // TODO: Improve performance by buffering reading. - allEntities, err := dd.Readdir(-1) - if err != nil { - return nil, err - } - subDirs := []string{} - for _, entity := range allEntities { - if entity.IsDir() { - subDirs = append(subDirs, entity.Name()) - } - } - return subDirs, nil -} - -// getSubdirAbsPaths recursively visit all the subdirectories -// starting from the given directory and returns absolute paths for them. -func getAllSubdirAbsPaths(dirPath string) (res []string, err error) { - dps, err := getSubdirAbsPaths(dirPath) - if err != nil { - res = []string{} - return - } - res = append(res, dps...) - for _, dp := range dps { - sdps, err := getAllSubdirAbsPaths(dp) - if err != nil { - return []string{}, err - } - res = append(res, sdps...) - } - return -} - -// getSubdirAbsPaths supplies absolute paths for all subdirectiries in a given directory. -// Input: (I1) dirPath - absolute path of a directory in question. -// Out: (O1) - slice of subdir asbolute paths; (O2) - error of the operation. -// Remark: If error (O2) is non-nil then (O1) is nil and vice versa. -func getSubdirAbsPaths(dirPath string) ([]string, error) { - sdns, err := getSubdirNames(dirPath) - if err != nil { - return nil, err - } - rsdns := []string{} - for _, sdn := range sdns { - rsdns = append(rsdns, filepath.Join(dirPath, sdn)) - } - return rsdns, nil -} - -// getOpenFilesInDir supplies a slice of os.File pointers to files located in the directory. -// Remark: Ignores files for which fileFilter returns false -func getOpenFilesInDir(dirPath string, fFilter fileFilter) ([]*os.File, error) { - dfi, err := os.Open(dirPath) - if err != nil { - return nil, newCannotOpenFileError("Cannot open directory " + dirPath) - } - defer dfi.Close() - // Size of read buffer (i.e. chunk of items read at a time). - rbs := 64 - resFiles := []*os.File{} -L: - for { - // Read directory entities by reasonable chuncks - // to prevent overflows on big number of files. - fis, e := dfi.Readdir(rbs) - switch e { - // It's OK. - case nil: - // Do nothing, just continue cycle. - case io.EOF: - break L - // Something went wrong. - default: - return nil, e - } - // THINK: Maybe, use async running. - for _, fi := range fis { - // NB: On Linux this could be a problem as - // there are lots of file types available. - if !fi.IsDir() { - f, e := os.Open(filepath.Join(dirPath, fi.Name())) - if e != nil { - if f != nil { - f.Close() - } - // THINK: Add nil as indicator that a problem occurred. - resFiles = append(resFiles, nil) - continue - } - // Check filter condition. - if fFilter != nil && !fFilter(fi, f) { - continue - } - resFiles = append(resFiles, f) - } - } - } - return resFiles, nil -} - -func isRegular(m os.FileMode) bool { - return m&os.ModeType == 0 -} - -// getDirFilePaths return full paths of the files located in the directory. -// Remark: Ignores files for which fileFilter returns false. -func getDirFilePaths(dirPath string, fpFilter filePathFilter, pathIsName bool) ([]string, error) { - dfi, err := os.Open(dirPath) - if err != nil { - return nil, newCannotOpenFileError("Cannot open directory " + dirPath) - } - defer dfi.Close() - - var absDirPath string - if !filepath.IsAbs(dirPath) { - absDirPath, err = filepath.Abs(dirPath) - if err != nil { - return nil, fmt.Errorf("cannot get absolute path of directory: %s", err.Error()) - } - } else { - absDirPath = dirPath - } - - // TODO: check if dirPath is really directory. - // Size of read buffer (i.e. chunk of items read at a time). - rbs := 2 << 5 - filePaths := []string{} - - var fp string -L: - for { - // Read directory entities by reasonable chuncks - // to prevent overflows on big number of files. - fis, e := dfi.Readdir(rbs) - switch e { - // It's OK. - case nil: - // Do nothing, just continue cycle. - case io.EOF: - break L - // Indicate that something went wrong. - default: - return nil, e - } - // THINK: Maybe, use async running. - for _, fi := range fis { - // NB: Should work on every Windows and non-Windows OS. - if isRegular(fi.Mode()) { - if pathIsName { - fp = fi.Name() - } else { - // Build full path of a file. - fp = filepath.Join(absDirPath, fi.Name()) - } - // Check filter condition. - if fpFilter != nil && !fpFilter(fp) { - continue - } - filePaths = append(filePaths, fp) - } - } - } - return filePaths, nil -} - -// getOpenFilesByDirectoryAsync runs async reading directories 'dirPaths' and inserts pairs -// in map 'filesInDirMap': Key - directory name, value - *os.File slice. -func getOpenFilesByDirectoryAsync( - dirPaths []string, - fFilter fileFilter, - filesInDirMap map[string][]*os.File, -) error { - n := len(dirPaths) - if n > maxDirNumberReadAsync { - return fmt.Errorf("number of input directories to be read exceeded max value %d", maxDirNumberReadAsync) - } - type filesInDirResult struct { - DirName string - Files []*os.File - Error error - } - dirFilesChan := make(chan *filesInDirResult, n) - var wg sync.WaitGroup - // Register n goroutines which are going to do work. - wg.Add(n) - for i := 0; i < n; i++ { - // Launch asynchronously the piece of work. - go func(dirPath string) { - fs, e := getOpenFilesInDir(dirPath, fFilter) - dirFilesChan <- &filesInDirResult{filepath.Base(dirPath), fs, e} - // Mark the current goroutine as finished (work is done). - wg.Done() - }(dirPaths[i]) - } - // Wait for all goroutines to finish their work. - wg.Wait() - // Close the error channel to let for-range clause - // get all the buffered values without blocking and quit in the end. - close(dirFilesChan) - for fidr := range dirFilesChan { - if fidr.Error == nil { - // THINK: What will happen if the key is already present? - filesInDirMap[fidr.DirName] = fidr.Files - } else { - return fidr.Error - } - } - return nil -} - -// fileExists return flag whether a given file exists -// and operation error if an unclassified failure occurs. -func fileExists(path string) (bool, error) { - _, err := os.Stat(path) - if err != nil { - if os.IsNotExist(err) { - return false, nil - } - return false, err - } - return true, nil -} - -// createDirectory makes directory with a given name -// making all parent directories if necessary. -func createDirectory(dirPath string) error { - var dPath string - var err error - if !filepath.IsAbs(dirPath) { - dPath, err = filepath.Abs(dirPath) - if err != nil { - return err - } - } else { - dPath = dirPath - } - exists, err := fileExists(dPath) - if err != nil { - return err - } - if exists { - return nil - } - return os.MkdirAll(dPath, os.ModeDir) -} - -// tryRemoveFile gives a try removing the file -// only ignoring an error when the file does not exist. -func tryRemoveFile(filePath string) (err error) { - err = os.Remove(filePath) - if os.IsNotExist(err) { - err = nil - return - } - return -} diff --git a/vendor/github.com/cihub/seelog/internals_xmlnode.go b/vendor/github.com/cihub/seelog/internals_xmlnode.go deleted file mode 100644 index 985884933..000000000 --- a/vendor/github.com/cihub/seelog/internals_xmlnode.go +++ /dev/null @@ -1,175 +0,0 @@ -// Copyright (c) 2012 - Cloud Instruments Co., Ltd. -// -// 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. - -package seelog - -import ( - "encoding/xml" - "errors" - "fmt" - "io" - "strings" -) - -type xmlNode struct { - name string - attributes map[string]string - children []*xmlNode - value string -} - -func newNode() *xmlNode { - node := new(xmlNode) - node.children = make([]*xmlNode, 0) - node.attributes = make(map[string]string) - return node -} - -func (node *xmlNode) String() string { - str := fmt.Sprintf("<%s", node.name) - - for attrName, attrVal := range node.attributes { - str += fmt.Sprintf(" %s=\"%s\"", attrName, attrVal) - } - - str += ">" - str += node.value - - if len(node.children) != 0 { - for _, child := range node.children { - str += fmt.Sprintf("%s", child) - } - } - - str += fmt.Sprintf("", node.name) - - return str -} - -func (node *xmlNode) unmarshal(startEl xml.StartElement) error { - node.name = startEl.Name.Local - - for _, v := range startEl.Attr { - _, alreadyExists := node.attributes[v.Name.Local] - if alreadyExists { - return errors.New("tag '" + node.name + "' has duplicated attribute: '" + v.Name.Local + "'") - } - node.attributes[v.Name.Local] = v.Value - } - - return nil -} - -func (node *xmlNode) add(child *xmlNode) { - if node.children == nil { - node.children = make([]*xmlNode, 0) - } - - node.children = append(node.children, child) -} - -func (node *xmlNode) hasChildren() bool { - return node.children != nil && len(node.children) > 0 -} - -//============================================= - -func unmarshalConfig(reader io.Reader) (*xmlNode, error) { - xmlParser := xml.NewDecoder(reader) - - config, err := unmarshalNode(xmlParser, nil) - if err != nil { - return nil, err - } - if config == nil { - return nil, errors.New("xml has no content") - } - - nextConfigEntry, err := unmarshalNode(xmlParser, nil) - if nextConfigEntry != nil { - return nil, errors.New("xml contains more than one root element") - } - - return config, nil -} - -func unmarshalNode(xmlParser *xml.Decoder, curToken xml.Token) (node *xmlNode, err error) { - firstLoop := true - for { - var tok xml.Token - if firstLoop && curToken != nil { - tok = curToken - firstLoop = false - } else { - tok, err = getNextToken(xmlParser) - if err != nil || tok == nil { - return - } - } - - switch tt := tok.(type) { - case xml.SyntaxError: - err = errors.New(tt.Error()) - return - case xml.CharData: - value := strings.TrimSpace(string([]byte(tt))) - if node != nil { - node.value += value - } - case xml.StartElement: - if node == nil { - node = newNode() - err := node.unmarshal(tt) - if err != nil { - return nil, err - } - } else { - childNode, childErr := unmarshalNode(xmlParser, tok) - if childErr != nil { - return nil, childErr - } - - if childNode != nil { - node.add(childNode) - } else { - return - } - } - case xml.EndElement: - return - } - } -} - -func getNextToken(xmlParser *xml.Decoder) (tok xml.Token, err error) { - if tok, err = xmlParser.Token(); err != nil { - if err == io.EOF { - err = nil - return - } - return - } - - return -} diff --git a/vendor/github.com/cihub/seelog/log.go b/vendor/github.com/cihub/seelog/log.go deleted file mode 100644 index f775e1fdb..000000000 --- a/vendor/github.com/cihub/seelog/log.go +++ /dev/null @@ -1,307 +0,0 @@ -// Copyright (c) 2012 - Cloud Instruments Co., Ltd. -// -// 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. - -package seelog - -import ( - "errors" - "fmt" - "sync" - "time" -) - -const ( - staticFuncCallDepth = 3 // See 'commonLogger.log' method comments - loggerFuncCallDepth = 3 -) - -// Current is the logger used in all package level convenience funcs like 'Trace', 'Debug', 'Flush', etc. -var Current LoggerInterface - -// Default logger that is created from an empty config: "". It is not closed by a ReplaceLogger call. -var Default LoggerInterface - -// Disabled logger that doesn't produce any output in any circumstances. It is neither closed nor flushed by a ReplaceLogger call. -var Disabled LoggerInterface - -var pkgOperationsMutex *sync.Mutex - -func init() { - pkgOperationsMutex = new(sync.Mutex) - var err error - - if Default == nil { - Default, err = LoggerFromConfigAsBytes([]byte("")) - } - - if Disabled == nil { - Disabled, err = LoggerFromConfigAsBytes([]byte("")) - } - - if err != nil { - panic(fmt.Sprintf("Seelog couldn't start. Error: %s", err.Error())) - } - - Current = Default -} - -func createLoggerFromFullConfig(config *configForParsing) (LoggerInterface, error) { - if config.LogType == syncloggerTypeFromString { - return NewSyncLogger(&config.logConfig), nil - } else if config.LogType == asyncLooploggerTypeFromString { - return NewAsyncLoopLogger(&config.logConfig), nil - } else if config.LogType == asyncTimerloggerTypeFromString { - logData := config.LoggerData - if logData == nil { - return nil, errors.New("async timer data not set") - } - - asyncInt, ok := logData.(asyncTimerLoggerData) - if !ok { - return nil, errors.New("invalid async timer data") - } - - logger, err := NewAsyncTimerLogger(&config.logConfig, time.Duration(asyncInt.AsyncInterval)) - if !ok { - return nil, err - } - - return logger, nil - } else if config.LogType == adaptiveLoggerTypeFromString { - logData := config.LoggerData - if logData == nil { - return nil, errors.New("adaptive logger parameters not set") - } - - adaptData, ok := logData.(adaptiveLoggerData) - if !ok { - return nil, errors.New("invalid adaptive logger parameters") - } - - logger, err := NewAsyncAdaptiveLogger( - &config.logConfig, - time.Duration(adaptData.MinInterval), - time.Duration(adaptData.MaxInterval), - adaptData.CriticalMsgCount, - ) - if err != nil { - return nil, err - } - - return logger, nil - } - return nil, errors.New("invalid config log type/data") -} - -// UseLogger sets the 'Current' package level logger variable to the specified value. -// This variable is used in all Trace/Debug/... package level convenience funcs. -// -// Example: -// -// after calling -// seelog.UseLogger(somelogger) -// the following: -// seelog.Debug("abc") -// will be equal to -// somelogger.Debug("abc") -// -// IMPORTANT: UseLogger do NOT close the previous logger (only flushes it). So if -// you constantly use it to replace loggers and don't close them in other code, you'll -// end up having memory leaks. -// -// To safely replace loggers, use ReplaceLogger. -func UseLogger(logger LoggerInterface) error { - if logger == nil { - return errors.New("logger can not be nil") - } - - pkgOperationsMutex.Lock() - defer pkgOperationsMutex.Unlock() - - oldLogger := Current - Current = logger - - if oldLogger != nil { - oldLogger.Flush() - } - - return nil -} - -// ReplaceLogger acts as UseLogger but the logger that was previously -// used is disposed (except Default and Disabled loggers). -// -// Example: -// import log "github.com/cihub/seelog" -// -// func main() { -// logger, err := log.LoggerFromConfigAsFile("seelog.xml") -// -// if err != nil { -// panic(err) -// } -// -// log.ReplaceLogger(logger) -// defer log.Flush() -// -// log.Trace("test") -// log.Debugf("var = %s", "abc") -// } -func ReplaceLogger(logger LoggerInterface) error { - if logger == nil { - return errors.New("logger can not be nil") - } - - pkgOperationsMutex.Lock() - defer pkgOperationsMutex.Unlock() - - defer func() { - if err := recover(); err != nil { - reportInternalError(fmt.Errorf("recovered from panic during ReplaceLogger: %s", err)) - } - }() - - if Current == Default { - Current.Flush() - } else if Current != nil && !Current.Closed() && Current != Disabled { - Current.Flush() - Current.Close() - } - - Current = logger - - return nil -} - -// Tracef formats message according to format specifier -// and writes to default logger with log level = Trace. -func Tracef(format string, params ...interface{}) { - pkgOperationsMutex.Lock() - defer pkgOperationsMutex.Unlock() - Current.traceWithCallDepth(staticFuncCallDepth, newLogFormattedMessage(format, params)) -} - -// Debugf formats message according to format specifier -// and writes to default logger with log level = Debug. -func Debugf(format string, params ...interface{}) { - pkgOperationsMutex.Lock() - defer pkgOperationsMutex.Unlock() - Current.debugWithCallDepth(staticFuncCallDepth, newLogFormattedMessage(format, params)) -} - -// Infof formats message according to format specifier -// and writes to default logger with log level = Info. -func Infof(format string, params ...interface{}) { - pkgOperationsMutex.Lock() - defer pkgOperationsMutex.Unlock() - Current.infoWithCallDepth(staticFuncCallDepth, newLogFormattedMessage(format, params)) -} - -// Warnf formats message according to format specifier and writes to default logger with log level = Warn -func Warnf(format string, params ...interface{}) error { - pkgOperationsMutex.Lock() - defer pkgOperationsMutex.Unlock() - message := newLogFormattedMessage(format, params) - Current.warnWithCallDepth(staticFuncCallDepth, message) - return errors.New(message.String()) -} - -// Errorf formats message according to format specifier and writes to default logger with log level = Error -func Errorf(format string, params ...interface{}) error { - pkgOperationsMutex.Lock() - defer pkgOperationsMutex.Unlock() - message := newLogFormattedMessage(format, params) - Current.errorWithCallDepth(staticFuncCallDepth, message) - return errors.New(message.String()) -} - -// Criticalf formats message according to format specifier and writes to default logger with log level = Critical -func Criticalf(format string, params ...interface{}) error { - pkgOperationsMutex.Lock() - defer pkgOperationsMutex.Unlock() - message := newLogFormattedMessage(format, params) - Current.criticalWithCallDepth(staticFuncCallDepth, message) - return errors.New(message.String()) -} - -// Trace formats message using the default formats for its operands and writes to default logger with log level = Trace -func Trace(v ...interface{}) { - pkgOperationsMutex.Lock() - defer pkgOperationsMutex.Unlock() - Current.traceWithCallDepth(staticFuncCallDepth, newLogMessage(v)) -} - -// Debug formats message using the default formats for its operands and writes to default logger with log level = Debug -func Debug(v ...interface{}) { - pkgOperationsMutex.Lock() - defer pkgOperationsMutex.Unlock() - Current.debugWithCallDepth(staticFuncCallDepth, newLogMessage(v)) -} - -// Info formats message using the default formats for its operands and writes to default logger with log level = Info -func Info(v ...interface{}) { - pkgOperationsMutex.Lock() - defer pkgOperationsMutex.Unlock() - Current.infoWithCallDepth(staticFuncCallDepth, newLogMessage(v)) -} - -// Warn formats message using the default formats for its operands and writes to default logger with log level = Warn -func Warn(v ...interface{}) error { - pkgOperationsMutex.Lock() - defer pkgOperationsMutex.Unlock() - message := newLogMessage(v) - Current.warnWithCallDepth(staticFuncCallDepth, message) - return errors.New(message.String()) -} - -// Error formats message using the default formats for its operands and writes to default logger with log level = Error -func Error(v ...interface{}) error { - pkgOperationsMutex.Lock() - defer pkgOperationsMutex.Unlock() - message := newLogMessage(v) - Current.errorWithCallDepth(staticFuncCallDepth, message) - return errors.New(message.String()) -} - -// Critical formats message using the default formats for its operands and writes to default logger with log level = Critical -func Critical(v ...interface{}) error { - pkgOperationsMutex.Lock() - defer pkgOperationsMutex.Unlock() - message := newLogMessage(v) - Current.criticalWithCallDepth(staticFuncCallDepth, message) - return errors.New(message.String()) -} - -// Flush immediately processes all currently queued messages and all currently buffered messages. -// It is a blocking call which returns only after the queue is empty and all the buffers are empty. -// -// If Flush is called for a synchronous logger (type='sync'), it only flushes buffers (e.g. '' receivers) -// , because there is no queue. -// -// Call this method when your app is going to shut down not to lose any log messages. -func Flush() { - pkgOperationsMutex.Lock() - defer pkgOperationsMutex.Unlock() - Current.Flush() -} diff --git a/vendor/github.com/cihub/seelog/logger.go b/vendor/github.com/cihub/seelog/logger.go deleted file mode 100644 index fc96aed49..000000000 --- a/vendor/github.com/cihub/seelog/logger.go +++ /dev/null @@ -1,370 +0,0 @@ -// Copyright (c) 2012 - Cloud Instruments Co., Ltd. -// -// 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. - -package seelog - -import ( - "errors" - "fmt" - "os" - "sync" -) - -func reportInternalError(err error) { - fmt.Fprintf(os.Stderr, "seelog internal error: %s\n", err) -} - -// LoggerInterface represents structs capable of logging Seelog messages -type LoggerInterface interface { - - // Tracef formats message according to format specifier - // and writes to log with level = Trace. - Tracef(format string, params ...interface{}) - - // Debugf formats message according to format specifier - // and writes to log with level = Debug. - Debugf(format string, params ...interface{}) - - // Infof formats message according to format specifier - // and writes to log with level = Info. - Infof(format string, params ...interface{}) - - // Warnf formats message according to format specifier - // and writes to log with level = Warn. - Warnf(format string, params ...interface{}) error - - // Errorf formats message according to format specifier - // and writes to log with level = Error. - Errorf(format string, params ...interface{}) error - - // Criticalf formats message according to format specifier - // and writes to log with level = Critical. - Criticalf(format string, params ...interface{}) error - - // Trace formats message using the default formats for its operands - // and writes to log with level = Trace - Trace(v ...interface{}) - - // Debug formats message using the default formats for its operands - // and writes to log with level = Debug - Debug(v ...interface{}) - - // Info formats message using the default formats for its operands - // and writes to log with level = Info - Info(v ...interface{}) - - // Warn formats message using the default formats for its operands - // and writes to log with level = Warn - Warn(v ...interface{}) error - - // Error formats message using the default formats for its operands - // and writes to log with level = Error - Error(v ...interface{}) error - - // Critical formats message using the default formats for its operands - // and writes to log with level = Critical - Critical(v ...interface{}) error - - traceWithCallDepth(callDepth int, message fmt.Stringer) - debugWithCallDepth(callDepth int, message fmt.Stringer) - infoWithCallDepth(callDepth int, message fmt.Stringer) - warnWithCallDepth(callDepth int, message fmt.Stringer) - errorWithCallDepth(callDepth int, message fmt.Stringer) - criticalWithCallDepth(callDepth int, message fmt.Stringer) - - // Close flushes all the messages in the logger and closes it. It cannot be used after this operation. - Close() - - // Flush flushes all the messages in the logger. - Flush() - - // Closed returns true if the logger was previously closed. - Closed() bool - - // SetAdditionalStackDepth sets the additional number of frames to skip by runtime.Caller - // when getting function information needed to print seelog format identifiers such as %Func or %File. - // - // This func may be used when you wrap seelog funcs and want to print caller info of you own - // wrappers instead of seelog func callers. In this case you should set depth = 1. If you then - // wrap your wrapper, you should set depth = 2, etc. - // - // NOTE: Incorrect depth value may lead to errors in runtime.Caller evaluation or incorrect - // function/file names in log files. Do not use it if you are not going to wrap seelog funcs. - // You may reset the value to default using a SetAdditionalStackDepth(0) call. - SetAdditionalStackDepth(depth int) error - - // Sets logger context that can be used in formatter funcs and custom receivers - SetContext(context interface{}) -} - -// innerLoggerInterface is an internal logging interface -type innerLoggerInterface interface { - innerLog(level LogLevel, context LogContextInterface, message fmt.Stringer) - Flush() -} - -// [file path][func name][level] -> [allowed] -type allowedContextCache map[string]map[string]map[LogLevel]bool - -// commonLogger contains all common data needed for logging and contains methods used to log messages. -type commonLogger struct { - config *logConfig // Config used for logging - contextCache allowedContextCache // Caches whether log is enabled for specific "full path-func name-level" sets - closed bool // 'true' when all writers are closed, all data is flushed, logger is unusable. Must be accessed while holding closedM - closedM sync.RWMutex - m sync.Mutex // Mutex for main operations - unusedLevels []bool - innerLogger innerLoggerInterface - addStackDepth int // Additional stack depth needed for correct seelog caller context detection - customContext interface{} -} - -func newCommonLogger(config *logConfig, internalLogger innerLoggerInterface) *commonLogger { - cLogger := new(commonLogger) - - cLogger.config = config - cLogger.contextCache = make(allowedContextCache) - cLogger.unusedLevels = make([]bool, Off) - cLogger.fillUnusedLevels() - cLogger.innerLogger = internalLogger - - return cLogger -} - -func (cLogger *commonLogger) SetAdditionalStackDepth(depth int) error { - if depth < 0 { - return fmt.Errorf("negative depth: %d", depth) - } - cLogger.m.Lock() - cLogger.addStackDepth = depth - cLogger.m.Unlock() - return nil -} - -func (cLogger *commonLogger) Tracef(format string, params ...interface{}) { - cLogger.traceWithCallDepth(loggerFuncCallDepth, newLogFormattedMessage(format, params)) -} - -func (cLogger *commonLogger) Debugf(format string, params ...interface{}) { - cLogger.debugWithCallDepth(loggerFuncCallDepth, newLogFormattedMessage(format, params)) -} - -func (cLogger *commonLogger) Infof(format string, params ...interface{}) { - cLogger.infoWithCallDepth(loggerFuncCallDepth, newLogFormattedMessage(format, params)) -} - -func (cLogger *commonLogger) Warnf(format string, params ...interface{}) error { - message := newLogFormattedMessage(format, params) - cLogger.warnWithCallDepth(loggerFuncCallDepth, message) - return errors.New(message.String()) -} - -func (cLogger *commonLogger) Errorf(format string, params ...interface{}) error { - message := newLogFormattedMessage(format, params) - cLogger.errorWithCallDepth(loggerFuncCallDepth, message) - return errors.New(message.String()) -} - -func (cLogger *commonLogger) Criticalf(format string, params ...interface{}) error { - message := newLogFormattedMessage(format, params) - cLogger.criticalWithCallDepth(loggerFuncCallDepth, message) - return errors.New(message.String()) -} - -func (cLogger *commonLogger) Trace(v ...interface{}) { - cLogger.traceWithCallDepth(loggerFuncCallDepth, newLogMessage(v)) -} - -func (cLogger *commonLogger) Debug(v ...interface{}) { - cLogger.debugWithCallDepth(loggerFuncCallDepth, newLogMessage(v)) -} - -func (cLogger *commonLogger) Info(v ...interface{}) { - cLogger.infoWithCallDepth(loggerFuncCallDepth, newLogMessage(v)) -} - -func (cLogger *commonLogger) Warn(v ...interface{}) error { - message := newLogMessage(v) - cLogger.warnWithCallDepth(loggerFuncCallDepth, message) - return errors.New(message.String()) -} - -func (cLogger *commonLogger) Error(v ...interface{}) error { - message := newLogMessage(v) - cLogger.errorWithCallDepth(loggerFuncCallDepth, message) - return errors.New(message.String()) -} - -func (cLogger *commonLogger) Critical(v ...interface{}) error { - message := newLogMessage(v) - cLogger.criticalWithCallDepth(loggerFuncCallDepth, message) - return errors.New(message.String()) -} - -func (cLogger *commonLogger) SetContext(c interface{}) { - cLogger.customContext = c -} - -func (cLogger *commonLogger) traceWithCallDepth(callDepth int, message fmt.Stringer) { - cLogger.log(TraceLvl, message, callDepth) -} - -func (cLogger *commonLogger) debugWithCallDepth(callDepth int, message fmt.Stringer) { - cLogger.log(DebugLvl, message, callDepth) -} - -func (cLogger *commonLogger) infoWithCallDepth(callDepth int, message fmt.Stringer) { - cLogger.log(InfoLvl, message, callDepth) -} - -func (cLogger *commonLogger) warnWithCallDepth(callDepth int, message fmt.Stringer) { - cLogger.log(WarnLvl, message, callDepth) -} - -func (cLogger *commonLogger) errorWithCallDepth(callDepth int, message fmt.Stringer) { - cLogger.log(ErrorLvl, message, callDepth) -} - -func (cLogger *commonLogger) criticalWithCallDepth(callDepth int, message fmt.Stringer) { - cLogger.log(CriticalLvl, message, callDepth) - cLogger.innerLogger.Flush() -} - -func (cLogger *commonLogger) Closed() bool { - cLogger.closedM.RLock() - defer cLogger.closedM.RUnlock() - return cLogger.closed -} - -func (cLogger *commonLogger) fillUnusedLevels() { - for i := 0; i < len(cLogger.unusedLevels); i++ { - cLogger.unusedLevels[i] = true - } - - cLogger.fillUnusedLevelsByContraint(cLogger.config.Constraints) - - for _, exception := range cLogger.config.Exceptions { - cLogger.fillUnusedLevelsByContraint(exception) - } -} - -func (cLogger *commonLogger) fillUnusedLevelsByContraint(constraint logLevelConstraints) { - for i := 0; i < len(cLogger.unusedLevels); i++ { - if constraint.IsAllowed(LogLevel(i)) { - cLogger.unusedLevels[i] = false - } - } -} - -// stackCallDepth is used to indicate the call depth of 'log' func. -// This depth level is used in the runtime.Caller(...) call. See -// common_context.go -> specifyContext, extractCallerInfo for details. -func (cLogger *commonLogger) log(level LogLevel, message fmt.Stringer, stackCallDepth int) { - if cLogger.unusedLevels[level] { - return - } - cLogger.m.Lock() - defer cLogger.m.Unlock() - - if cLogger.Closed() { - return - } - context, _ := specifyContext(stackCallDepth+cLogger.addStackDepth, cLogger.customContext) - // Context errors are not reported because there are situations - // in which context errors are normal Seelog usage cases. For - // example in executables with stripped symbols. - // Error contexts are returned instead. See common_context.go. - /*if err != nil { - reportInternalError(err) - return - }*/ - cLogger.innerLogger.innerLog(level, context, message) -} - -func (cLogger *commonLogger) processLogMsg(level LogLevel, message fmt.Stringer, context LogContextInterface) { - defer func() { - if err := recover(); err != nil { - reportInternalError(fmt.Errorf("recovered from panic during message processing: %s", err)) - } - }() - if cLogger.config.IsAllowed(level, context) { - cLogger.config.RootDispatcher.Dispatch(message.String(), level, context, reportInternalError) - } -} - -func (cLogger *commonLogger) isAllowed(level LogLevel, context LogContextInterface) bool { - funcMap, ok := cLogger.contextCache[context.FullPath()] - if !ok { - funcMap = make(map[string]map[LogLevel]bool, 0) - cLogger.contextCache[context.FullPath()] = funcMap - } - - levelMap, ok := funcMap[context.Func()] - if !ok { - levelMap = make(map[LogLevel]bool, 0) - funcMap[context.Func()] = levelMap - } - - isAllowValue, ok := levelMap[level] - if !ok { - isAllowValue = cLogger.config.IsAllowed(level, context) - levelMap[level] = isAllowValue - } - - return isAllowValue -} - -type logMessage struct { - params []interface{} -} - -type logFormattedMessage struct { - format string - params []interface{} -} - -func newLogMessage(params []interface{}) fmt.Stringer { - message := new(logMessage) - - message.params = params - - return message -} - -func newLogFormattedMessage(format string, params []interface{}) *logFormattedMessage { - message := new(logFormattedMessage) - - message.params = params - message.format = format - - return message -} - -func (message *logMessage) String() string { - return fmt.Sprint(message.params...) -} - -func (message *logFormattedMessage) String() string { - return fmt.Sprintf(message.format, message.params...) -} diff --git a/vendor/github.com/cihub/seelog/writers_bufferedwriter.go b/vendor/github.com/cihub/seelog/writers_bufferedwriter.go deleted file mode 100644 index 37d75c82e..000000000 --- a/vendor/github.com/cihub/seelog/writers_bufferedwriter.go +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright (c) 2012 - Cloud Instruments Co., Ltd. -// -// 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. - -package seelog - -import ( - "bufio" - "errors" - "fmt" - "io" - "sync" - "time" -) - -// bufferedWriter stores data in memory and flushes it every flushPeriod or when buffer is full -type bufferedWriter struct { - flushPeriod time.Duration // data flushes interval (in microseconds) - bufferMutex *sync.Mutex // mutex for buffer operations syncronization - innerWriter io.Writer // inner writer - buffer *bufio.Writer // buffered wrapper for inner writer - bufferSize int // max size of data chunk in bytes -} - -// NewBufferedWriter creates a new buffered writer struct. -// bufferSize -- size of memory buffer in bytes -// flushPeriod -- period in which data flushes from memory buffer in milliseconds. 0 - turn off this functionality -func NewBufferedWriter(innerWriter io.Writer, bufferSize int, flushPeriod time.Duration) (*bufferedWriter, error) { - - if innerWriter == nil { - return nil, errors.New("argument is nil: innerWriter") - } - if flushPeriod < 0 { - return nil, fmt.Errorf("flushPeriod can not be less than 0. Got: %d", flushPeriod) - } - - if bufferSize <= 0 { - return nil, fmt.Errorf("bufferSize can not be less or equal to 0. Got: %d", bufferSize) - } - - buffer := bufio.NewWriterSize(innerWriter, bufferSize) - - /*if err != nil { - return nil, err - }*/ - - newWriter := new(bufferedWriter) - - newWriter.innerWriter = innerWriter - newWriter.buffer = buffer - newWriter.bufferSize = bufferSize - newWriter.flushPeriod = flushPeriod * 1e6 - newWriter.bufferMutex = new(sync.Mutex) - - if flushPeriod != 0 { - go newWriter.flushPeriodically() - } - - return newWriter, nil -} - -func (bufWriter *bufferedWriter) writeBigChunk(bytes []byte) (n int, err error) { - bufferedLen := bufWriter.buffer.Buffered() - - n, err = bufWriter.flushInner() - if err != nil { - return - } - - written, writeErr := bufWriter.innerWriter.Write(bytes) - return bufferedLen + written, writeErr -} - -// Sends data to buffer manager. Waits until all buffers are full. -func (bufWriter *bufferedWriter) Write(bytes []byte) (n int, err error) { - - bufWriter.bufferMutex.Lock() - defer bufWriter.bufferMutex.Unlock() - - bytesLen := len(bytes) - - if bytesLen > bufWriter.bufferSize { - return bufWriter.writeBigChunk(bytes) - } - - if bytesLen > bufWriter.buffer.Available() { - n, err = bufWriter.flushInner() - if err != nil { - return - } - } - - bufWriter.buffer.Write(bytes) - - return len(bytes), nil -} - -func (bufWriter *bufferedWriter) Close() error { - closer, ok := bufWriter.innerWriter.(io.Closer) - if ok { - return closer.Close() - } - - return nil -} - -func (bufWriter *bufferedWriter) Flush() { - - bufWriter.bufferMutex.Lock() - defer bufWriter.bufferMutex.Unlock() - - bufWriter.flushInner() -} - -func (bufWriter *bufferedWriter) flushInner() (n int, err error) { - bufferedLen := bufWriter.buffer.Buffered() - flushErr := bufWriter.buffer.Flush() - - return bufWriter.buffer.Buffered() - bufferedLen, flushErr -} - -func (bufWriter *bufferedWriter) flushBuffer() { - bufWriter.bufferMutex.Lock() - defer bufWriter.bufferMutex.Unlock() - - bufWriter.buffer.Flush() -} - -func (bufWriter *bufferedWriter) flushPeriodically() { - if bufWriter.flushPeriod > 0 { - ticker := time.NewTicker(bufWriter.flushPeriod) - for { - <-ticker.C - bufWriter.flushBuffer() - } - } -} - -func (bufWriter *bufferedWriter) String() string { - return fmt.Sprintf("bufferedWriter size: %d, flushPeriod: %d", bufWriter.bufferSize, bufWriter.flushPeriod) -} diff --git a/vendor/github.com/cihub/seelog/writers_connwriter.go b/vendor/github.com/cihub/seelog/writers_connwriter.go deleted file mode 100644 index d199894e7..000000000 --- a/vendor/github.com/cihub/seelog/writers_connwriter.go +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright (c) 2012 - Cloud Instruments Co., Ltd. -// -// 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. - -package seelog - -import ( - "crypto/tls" - "fmt" - "io" - "net" -) - -// connWriter is used to write to a stream-oriented network connection. -type connWriter struct { - innerWriter io.WriteCloser - reconnectOnMsg bool - reconnect bool - net string - addr string - useTLS bool - configTLS *tls.Config -} - -// Creates writer to the address addr on the network netName. -// Connection will be opened on each write if reconnectOnMsg = true -func NewConnWriter(netName string, addr string, reconnectOnMsg bool) *connWriter { - newWriter := new(connWriter) - - newWriter.net = netName - newWriter.addr = addr - newWriter.reconnectOnMsg = reconnectOnMsg - - return newWriter -} - -// Creates a writer that uses SSL/TLS -func newTLSWriter(netName string, addr string, reconnectOnMsg bool, config *tls.Config) *connWriter { - newWriter := new(connWriter) - - newWriter.net = netName - newWriter.addr = addr - newWriter.reconnectOnMsg = reconnectOnMsg - newWriter.useTLS = true - newWriter.configTLS = config - - return newWriter -} - -func (connWriter *connWriter) Close() error { - if connWriter.innerWriter == nil { - return nil - } - - return connWriter.innerWriter.Close() -} - -func (connWriter *connWriter) Write(bytes []byte) (n int, err error) { - if connWriter.neededConnectOnMsg() { - err = connWriter.connect() - if err != nil { - return 0, err - } - } - - if connWriter.reconnectOnMsg { - defer connWriter.innerWriter.Close() - } - - n, err = connWriter.innerWriter.Write(bytes) - if err != nil { - connWriter.reconnect = true - } - - return -} - -func (connWriter *connWriter) String() string { - return fmt.Sprintf("Conn writer: [%s, %s, %v]", connWriter.net, connWriter.addr, connWriter.reconnectOnMsg) -} - -func (connWriter *connWriter) connect() error { - if connWriter.innerWriter != nil { - connWriter.innerWriter.Close() - connWriter.innerWriter = nil - } - - if connWriter.useTLS { - conn, err := tls.Dial(connWriter.net, connWriter.addr, connWriter.configTLS) - if err != nil { - return err - } - connWriter.innerWriter = conn - - return nil - } - - conn, err := net.Dial(connWriter.net, connWriter.addr) - if err != nil { - return err - } - - tcpConn, ok := conn.(*net.TCPConn) - if ok { - tcpConn.SetKeepAlive(true) - } - - connWriter.innerWriter = conn - - return nil -} - -func (connWriter *connWriter) neededConnectOnMsg() bool { - if connWriter.reconnect { - connWriter.reconnect = false - return true - } - - if connWriter.innerWriter == nil { - return true - } - - return connWriter.reconnectOnMsg -} diff --git a/vendor/github.com/cihub/seelog/writers_consolewriter.go b/vendor/github.com/cihub/seelog/writers_consolewriter.go deleted file mode 100644 index 3eb79afa9..000000000 --- a/vendor/github.com/cihub/seelog/writers_consolewriter.go +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) 2012 - Cloud Instruments Co., Ltd. -// -// 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. - -package seelog - -import "fmt" - -// consoleWriter is used to write to console -type consoleWriter struct { -} - -// Creates a new console writer. Returns error, if the console writer couldn't be created. -func NewConsoleWriter() (writer *consoleWriter, err error) { - newWriter := new(consoleWriter) - - return newWriter, nil -} - -// Create folder and file on WriteLog/Write first call -func (console *consoleWriter) Write(bytes []byte) (int, error) { - return fmt.Print(string(bytes)) -} - -func (console *consoleWriter) String() string { - return "Console writer" -} diff --git a/vendor/github.com/cihub/seelog/writers_filewriter.go b/vendor/github.com/cihub/seelog/writers_filewriter.go deleted file mode 100644 index 8d3ae270e..000000000 --- a/vendor/github.com/cihub/seelog/writers_filewriter.go +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright (c) 2012 - Cloud Instruments Co., Ltd. -// -// 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. - -package seelog - -import ( - "fmt" - "io" - "os" - "path/filepath" -) - -// fileWriter is used to write to a file. -type fileWriter struct { - innerWriter io.WriteCloser - fileName string -} - -// Creates a new file and a corresponding writer. Returns error, if the file couldn't be created. -func NewFileWriter(fileName string) (writer *fileWriter, err error) { - newWriter := new(fileWriter) - newWriter.fileName = fileName - - return newWriter, nil -} - -func (fw *fileWriter) Close() error { - if fw.innerWriter != nil { - err := fw.innerWriter.Close() - if err != nil { - return err - } - fw.innerWriter = nil - } - return nil -} - -// Create folder and file on WriteLog/Write first call -func (fw *fileWriter) Write(bytes []byte) (n int, err error) { - if fw.innerWriter == nil { - if err := fw.createFile(); err != nil { - return 0, err - } - } - return fw.innerWriter.Write(bytes) -} - -func (fw *fileWriter) createFile() error { - folder, _ := filepath.Split(fw.fileName) - var err error - - if 0 != len(folder) { - err = os.MkdirAll(folder, defaultDirectoryPermissions) - if err != nil { - return err - } - } - - // If exists - fw.innerWriter, err = os.OpenFile(fw.fileName, os.O_WRONLY|os.O_APPEND|os.O_CREATE, defaultFilePermissions) - - if err != nil { - return err - } - - return nil -} - -func (fw *fileWriter) String() string { - return fmt.Sprintf("File writer: %s", fw.fileName) -} diff --git a/vendor/github.com/cihub/seelog/writers_formattedwriter.go b/vendor/github.com/cihub/seelog/writers_formattedwriter.go deleted file mode 100644 index bf44a4103..000000000 --- a/vendor/github.com/cihub/seelog/writers_formattedwriter.go +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright (c) 2012 - Cloud Instruments Co., Ltd. -// -// 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. - -package seelog - -import ( - "errors" - "fmt" - "io" -) - -type formattedWriter struct { - writer io.Writer - formatter *formatter -} - -func NewFormattedWriter(writer io.Writer, formatter *formatter) (*formattedWriter, error) { - if formatter == nil { - return nil, errors.New("formatter can not be nil") - } - - return &formattedWriter{writer, formatter}, nil -} - -func (formattedWriter *formattedWriter) Write(message string, level LogLevel, context LogContextInterface) error { - str := formattedWriter.formatter.Format(message, level, context) - _, err := formattedWriter.writer.Write([]byte(str)) - return err -} - -func (formattedWriter *formattedWriter) String() string { - return fmt.Sprintf("writer: %s, format: %s", formattedWriter.writer, formattedWriter.formatter) -} - -func (formattedWriter *formattedWriter) Writer() io.Writer { - return formattedWriter.writer -} - -func (formattedWriter *formattedWriter) Format() *formatter { - return formattedWriter.formatter -} diff --git a/vendor/github.com/cihub/seelog/writers_rollingfilewriter.go b/vendor/github.com/cihub/seelog/writers_rollingfilewriter.go deleted file mode 100644 index 9535a5798..000000000 --- a/vendor/github.com/cihub/seelog/writers_rollingfilewriter.go +++ /dev/null @@ -1,763 +0,0 @@ -// Copyright (c) 2013 - Cloud Instruments Co., Ltd. -// -// 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. - -package seelog - -import ( - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "sort" - "strconv" - "strings" - "sync" - "time" - - "github.com/cihub/seelog/archive" - "github.com/cihub/seelog/archive/gzip" - "github.com/cihub/seelog/archive/tar" - "github.com/cihub/seelog/archive/zip" -) - -// Common constants -const ( - rollingLogHistoryDelimiter = "." -) - -// Types of the rolling writer: roll by date, by time, etc. -type rollingType uint8 - -const ( - rollingTypeSize = iota - rollingTypeTime -) - -// Types of the rolled file naming mode: prefix, postfix, etc. -type rollingNameMode uint8 - -const ( - rollingNameModePostfix = iota - rollingNameModePrefix -) - -var rollingNameModesStringRepresentation = map[rollingNameMode]string{ - rollingNameModePostfix: "postfix", - rollingNameModePrefix: "prefix", -} - -func rollingNameModeFromString(rollingNameStr string) (rollingNameMode, bool) { - for tp, tpStr := range rollingNameModesStringRepresentation { - if tpStr == rollingNameStr { - return tp, true - } - } - - return 0, false -} - -var rollingTypesStringRepresentation = map[rollingType]string{ - rollingTypeSize: "size", - rollingTypeTime: "date", -} - -func rollingTypeFromString(rollingTypeStr string) (rollingType, bool) { - for tp, tpStr := range rollingTypesStringRepresentation { - if tpStr == rollingTypeStr { - return tp, true - } - } - - return 0, false -} - -// Old logs archivation type. -type rollingArchiveType uint8 - -const ( - rollingArchiveNone = iota - rollingArchiveZip - rollingArchiveGzip -) - -var rollingArchiveTypesStringRepresentation = map[rollingArchiveType]string{ - rollingArchiveNone: "none", - rollingArchiveZip: "zip", - rollingArchiveGzip: "gzip", -} - -type archiver func(f *os.File, exploded bool) archive.WriteCloser - -type unarchiver func(f *os.File) (archive.ReadCloser, error) - -type compressionType struct { - extension string - handleMultipleEntries bool - archiver archiver - unarchiver unarchiver -} - -var compressionTypes = map[rollingArchiveType]compressionType{ - rollingArchiveZip: { - extension: ".zip", - handleMultipleEntries: true, - archiver: func(f *os.File, _ bool) archive.WriteCloser { - return zip.NewWriter(f) - }, - unarchiver: func(f *os.File) (archive.ReadCloser, error) { - fi, err := f.Stat() - if err != nil { - return nil, err - } - r, err := zip.NewReader(f, fi.Size()) - if err != nil { - return nil, err - } - return archive.NopCloser(r), nil - }, - }, - rollingArchiveGzip: { - extension: ".gz", - handleMultipleEntries: false, - archiver: func(f *os.File, exploded bool) archive.WriteCloser { - gw := gzip.NewWriter(f) - if exploded { - return gw - } - return tar.NewWriteMultiCloser(gw, gw) - }, - unarchiver: func(f *os.File) (archive.ReadCloser, error) { - gr, err := gzip.NewReader(f, f.Name()) - if err != nil { - return nil, err - } - - // Determine if the gzip is a tar - tr := tar.NewReader(gr) - _, err = tr.Next() - isTar := err == nil - - // Reset to beginning of file - if _, err := f.Seek(0, os.SEEK_SET); err != nil { - return nil, err - } - gr.Reset(f) - - if isTar { - return archive.NopCloser(tar.NewReader(gr)), nil - } - return gr, nil - }, - }, -} - -func (compressionType *compressionType) rollingArchiveTypeName(name string, exploded bool) string { - if !compressionType.handleMultipleEntries && !exploded { - return name + ".tar" + compressionType.extension - } else { - return name + compressionType.extension - } - -} - -func rollingArchiveTypeFromString(rollingArchiveTypeStr string) (rollingArchiveType, bool) { - for tp, tpStr := range rollingArchiveTypesStringRepresentation { - if tpStr == rollingArchiveTypeStr { - return tp, true - } - } - - return 0, false -} - -// Default names for different archive types -var rollingArchiveDefaultExplodedName = "old" - -func rollingArchiveTypeDefaultName(archiveType rollingArchiveType, exploded bool) (string, error) { - compressionType, ok := compressionTypes[archiveType] - if !ok { - return "", fmt.Errorf("cannot get default filename for archive type = %v", archiveType) - } - return compressionType.rollingArchiveTypeName("log", exploded), nil -} - -// rollerVirtual is an interface that represents all virtual funcs that are -// called in different rolling writer subtypes. -type rollerVirtual interface { - needsToRoll() bool // Returns true if needs to switch to another file. - isFileRollNameValid(rname string) bool // Returns true if logger roll file name (postfix/prefix/etc.) is ok. - sortFileRollNamesAsc(fs []string) ([]string, error) // Sorts logger roll file names in ascending order of their creation by logger. - - // getNewHistoryRollFileName is called whenever we are about to roll the - // current log file. It returns the name the current log file should be - // rolled to. - getNewHistoryRollFileName(otherHistoryFiles []string) string - - getCurrentFileName() string -} - -// rollingFileWriter writes received messages to a file, until time interval passes -// or file exceeds a specified limit. After that the current log file is renamed -// and writer starts to log into a new file. You can set a limit for such renamed -// files count, if you want, and then the rolling writer would delete older ones when -// the files count exceed the specified limit. -type rollingFileWriter struct { - fileName string // log file name - currentDirPath string - currentFile *os.File - currentName string - currentFileSize int64 - rollingType rollingType // Rolling mode (Files roll by size/date/...) - archiveType rollingArchiveType - archivePath string - archiveExploded bool - fullName bool - maxRolls int - nameMode rollingNameMode - self rollerVirtual // Used for virtual calls - rollLock sync.Mutex -} - -func newRollingFileWriter(fpath string, rtype rollingType, atype rollingArchiveType, apath string, maxr int, namemode rollingNameMode, - archiveExploded bool, fullName bool) (*rollingFileWriter, error) { - rw := new(rollingFileWriter) - rw.currentDirPath, rw.fileName = filepath.Split(fpath) - if len(rw.currentDirPath) == 0 { - rw.currentDirPath = "." - } - - rw.rollingType = rtype - rw.archiveType = atype - rw.archivePath = apath - rw.nameMode = namemode - rw.maxRolls = maxr - rw.archiveExploded = archiveExploded - rw.fullName = fullName - return rw, nil -} - -func (rw *rollingFileWriter) hasRollName(file string) bool { - switch rw.nameMode { - case rollingNameModePostfix: - rname := rw.fileName + rollingLogHistoryDelimiter - return strings.HasPrefix(file, rname) - case rollingNameModePrefix: - rname := rollingLogHistoryDelimiter + rw.fileName - return strings.HasSuffix(file, rname) - } - return false -} - -func (rw *rollingFileWriter) createFullFileName(originalName, rollname string) string { - switch rw.nameMode { - case rollingNameModePostfix: - return originalName + rollingLogHistoryDelimiter + rollname - case rollingNameModePrefix: - return rollname + rollingLogHistoryDelimiter + originalName - } - return "" -} - -func (rw *rollingFileWriter) getSortedLogHistory() ([]string, error) { - files, err := getDirFilePaths(rw.currentDirPath, nil, true) - if err != nil { - return nil, err - } - var validRollNames []string - for _, file := range files { - if rw.hasRollName(file) { - rname := rw.getFileRollName(file) - if rw.self.isFileRollNameValid(rname) { - validRollNames = append(validRollNames, rname) - } - } - } - sortedTails, err := rw.self.sortFileRollNamesAsc(validRollNames) - if err != nil { - return nil, err - } - validSortedFiles := make([]string, len(sortedTails)) - for i, v := range sortedTails { - validSortedFiles[i] = rw.createFullFileName(rw.fileName, v) - } - return validSortedFiles, nil -} - -func (rw *rollingFileWriter) createFileAndFolderIfNeeded(first bool) error { - var err error - - if len(rw.currentDirPath) != 0 { - err = os.MkdirAll(rw.currentDirPath, defaultDirectoryPermissions) - - if err != nil { - return err - } - } - rw.currentName = rw.self.getCurrentFileName() - filePath := filepath.Join(rw.currentDirPath, rw.currentName) - - // This will either open the existing file (without truncating it) or - // create if necessary. Append mode avoids any race conditions. - rw.currentFile, err = os.OpenFile(filePath, os.O_WRONLY|os.O_APPEND|os.O_CREATE, defaultFilePermissions) - if err != nil { - return err - } - - stat, err := rw.currentFile.Stat() - if err != nil { - rw.currentFile.Close() - rw.currentFile = nil - return err - } - - rw.currentFileSize = stat.Size() - return nil -} - -func (rw *rollingFileWriter) archiveExplodedLogs(logFilename string, compressionType compressionType) (err error) { - closeWithError := func(c io.Closer) { - if cerr := c.Close(); cerr != nil && err == nil { - err = cerr - } - } - - rollPath := filepath.Join(rw.currentDirPath, logFilename) - src, err := os.Open(rollPath) - if err != nil { - return err - } - defer src.Close() // Read-only - - // Buffer to a temporary file on the same partition - // Note: archivePath is a path to a directory when handling exploded logs - dst, err := rw.tempArchiveFile(rw.archivePath) - if err != nil { - return err - } - defer func() { - closeWithError(dst) - if err != nil { - os.Remove(dst.Name()) // Can't do anything when we fail to remove temp file - return - } - - // Finalize archive by swapping the buffered archive into place - err = os.Rename(dst.Name(), filepath.Join(rw.archivePath, - compressionType.rollingArchiveTypeName(logFilename, true))) - }() - - // archive entry - w := compressionType.archiver(dst, true) - defer closeWithError(w) - fi, err := src.Stat() - if err != nil { - return err - } - if err := w.NextFile(logFilename, fi); err != nil { - return err - } - _, err = io.Copy(w, src) - return err -} - -func (rw *rollingFileWriter) archiveUnexplodedLogs(compressionType compressionType, rollsToDelete int, history []string) (err error) { - closeWithError := func(c io.Closer) { - if cerr := c.Close(); cerr != nil && err == nil { - err = cerr - } - } - - // Buffer to a temporary file on the same partition - // Note: archivePath is a path to a file when handling unexploded logs - dst, err := rw.tempArchiveFile(filepath.Dir(rw.archivePath)) - if err != nil { - return err - } - defer func() { - closeWithError(dst) - if err != nil { - os.Remove(dst.Name()) // Can't do anything when we fail to remove temp file - return - } - - // Finalize archive by moving the buffered archive into place - err = os.Rename(dst.Name(), rw.archivePath) - }() - - w := compressionType.archiver(dst, false) - defer closeWithError(w) - - src, err := os.Open(rw.archivePath) - switch { - // Archive exists - case err == nil: - defer src.Close() // Read-only - - r, err := compressionType.unarchiver(src) - if err != nil { - return err - } - defer r.Close() // Read-only - - if err := archive.Copy(w, r); err != nil { - return err - } - - // Failed to stat - case !os.IsNotExist(err): - return err - } - - // Add new files to the archive - for i := 0; i < rollsToDelete; i++ { - rollPath := filepath.Join(rw.currentDirPath, history[i]) - src, err := os.Open(rollPath) - if err != nil { - return err - } - defer src.Close() // Read-only - fi, err := src.Stat() - if err != nil { - return err - } - if err := w.NextFile(src.Name(), fi); err != nil { - return err - } - if _, err := io.Copy(w, src); err != nil { - return err - } - } - return nil -} - -func (rw *rollingFileWriter) deleteOldRolls(history []string) error { - if rw.maxRolls <= 0 { - return nil - } - - rollsToDelete := len(history) - rw.maxRolls - if rollsToDelete <= 0 { - return nil - } - - if rw.archiveType != rollingArchiveNone { - if rw.archiveExploded { - os.MkdirAll(rw.archivePath, defaultDirectoryPermissions) - - // Archive logs - for i := 0; i < rollsToDelete; i++ { - rw.archiveExplodedLogs(history[i], compressionTypes[rw.archiveType]) - } - } else { - os.MkdirAll(filepath.Dir(rw.archivePath), defaultDirectoryPermissions) - - rw.archiveUnexplodedLogs(compressionTypes[rw.archiveType], rollsToDelete, history) - } - } - - var err error - // In all cases (archive files or not) the files should be deleted. - for i := 0; i < rollsToDelete; i++ { - // Try best to delete files without breaking the loop. - if err = tryRemoveFile(filepath.Join(rw.currentDirPath, history[i])); err != nil { - reportInternalError(err) - } - } - - return nil -} - -func (rw *rollingFileWriter) getFileRollName(fileName string) string { - switch rw.nameMode { - case rollingNameModePostfix: - return fileName[len(rw.fileName+rollingLogHistoryDelimiter):] - case rollingNameModePrefix: - return fileName[:len(fileName)-len(rw.fileName+rollingLogHistoryDelimiter)] - } - return "" -} - -func (rw *rollingFileWriter) roll() error { - // First, close current file. - err := rw.currentFile.Close() - if err != nil { - return err - } - rw.currentFile = nil - - // Current history of all previous log files. - // For file roller it may be like this: - // * ... - // * file.log.4 - // * file.log.5 - // * file.log.6 - // - // For date roller it may look like this: - // * ... - // * file.log.11.Aug.13 - // * file.log.15.Aug.13 - // * file.log.16.Aug.13 - // Sorted log history does NOT include current file. - history, err := rw.getSortedLogHistory() - if err != nil { - return err - } - // Renames current file to create a new roll history entry - // For file roller it may be like this: - // * ... - // * file.log.4 - // * file.log.5 - // * file.log.6 - // n file.log.7 <---- RENAMED (from file.log) - newHistoryName := rw.createFullFileName(rw.fileName, - rw.self.getNewHistoryRollFileName(history)) - - err = os.Rename(filepath.Join(rw.currentDirPath, rw.currentName), filepath.Join(rw.currentDirPath, newHistoryName)) - if err != nil { - return err - } - - // Finally, add the newly added history file to the history archive - // and, if after that the archive exceeds the allowed max limit, older rolls - // must the removed/archived. - history = append(history, newHistoryName) - if len(history) > rw.maxRolls { - err = rw.deleteOldRolls(history) - if err != nil { - return err - } - } - - return nil -} - -func (rw *rollingFileWriter) Write(bytes []byte) (n int, err error) { - rw.rollLock.Lock() - defer rw.rollLock.Unlock() - - if rw.self.needsToRoll() { - if err := rw.roll(); err != nil { - return 0, err - } - } - - if rw.currentFile == nil { - err := rw.createFileAndFolderIfNeeded(true) - if err != nil { - return 0, err - } - } - - n, err = rw.currentFile.Write(bytes) - rw.currentFileSize += int64(n) - return n, err -} - -func (rw *rollingFileWriter) Close() error { - if rw.currentFile != nil { - e := rw.currentFile.Close() - if e != nil { - return e - } - rw.currentFile = nil - } - return nil -} - -func (rw *rollingFileWriter) tempArchiveFile(archiveDir string) (*os.File, error) { - tmp := filepath.Join(archiveDir, ".seelog_tmp") - if err := os.MkdirAll(tmp, defaultDirectoryPermissions); err != nil { - return nil, err - } - return ioutil.TempFile(tmp, "archived_logs") -} - -// ============================================================================================= -// Different types of rolling writers -// ============================================================================================= - -// -------------------------------------------------- -// Rolling writer by SIZE -// -------------------------------------------------- - -// rollingFileWriterSize performs roll when file exceeds a specified limit. -type rollingFileWriterSize struct { - *rollingFileWriter - maxFileSize int64 -} - -func NewRollingFileWriterSize(fpath string, atype rollingArchiveType, apath string, maxSize int64, maxRolls int, namemode rollingNameMode, archiveExploded bool) (*rollingFileWriterSize, error) { - rw, err := newRollingFileWriter(fpath, rollingTypeSize, atype, apath, maxRolls, namemode, archiveExploded, false) - if err != nil { - return nil, err - } - rws := &rollingFileWriterSize{rw, maxSize} - rws.self = rws - return rws, nil -} - -func (rws *rollingFileWriterSize) needsToRoll() bool { - return rws.currentFileSize >= rws.maxFileSize -} - -func (rws *rollingFileWriterSize) isFileRollNameValid(rname string) bool { - if len(rname) == 0 { - return false - } - _, err := strconv.Atoi(rname) - return err == nil -} - -type rollSizeFileTailsSlice []string - -func (p rollSizeFileTailsSlice) Len() int { - return len(p) -} -func (p rollSizeFileTailsSlice) Less(i, j int) bool { - v1, _ := strconv.Atoi(p[i]) - v2, _ := strconv.Atoi(p[j]) - return v1 < v2 -} -func (p rollSizeFileTailsSlice) Swap(i, j int) { - p[i], p[j] = p[j], p[i] -} - -func (rws *rollingFileWriterSize) sortFileRollNamesAsc(fs []string) ([]string, error) { - ss := rollSizeFileTailsSlice(fs) - sort.Sort(ss) - return ss, nil -} - -func (rws *rollingFileWriterSize) getNewHistoryRollFileName(otherLogFiles []string) string { - v := 0 - if len(otherLogFiles) != 0 { - latest := otherLogFiles[len(otherLogFiles)-1] - v, _ = strconv.Atoi(rws.getFileRollName(latest)) - } - return fmt.Sprintf("%d", v+1) -} - -func (rws *rollingFileWriterSize) getCurrentFileName() string { - return rws.fileName -} - -func (rws *rollingFileWriterSize) String() string { - return fmt.Sprintf("Rolling file writer (By SIZE): filename: %s, archive: %s, archivefile: %s, maxFileSize: %v, maxRolls: %v", - rws.fileName, - rollingArchiveTypesStringRepresentation[rws.archiveType], - rws.archivePath, - rws.maxFileSize, - rws.maxRolls) -} - -// -------------------------------------------------- -// Rolling writer by TIME -// -------------------------------------------------- - -// rollingFileWriterTime performs roll when a specified time interval has passed. -type rollingFileWriterTime struct { - *rollingFileWriter - timePattern string - currentTimeFileName string -} - -func NewRollingFileWriterTime(fpath string, atype rollingArchiveType, apath string, maxr int, - timePattern string, namemode rollingNameMode, archiveExploded bool, fullName bool) (*rollingFileWriterTime, error) { - - rw, err := newRollingFileWriter(fpath, rollingTypeTime, atype, apath, maxr, namemode, archiveExploded, fullName) - if err != nil { - return nil, err - } - rws := &rollingFileWriterTime{rw, timePattern, ""} - rws.self = rws - return rws, nil -} - -func (rwt *rollingFileWriterTime) needsToRoll() bool { - newName := time.Now().Format(rwt.timePattern) - - if rwt.currentTimeFileName == "" { - // first run; capture the current name - rwt.currentTimeFileName = newName - return false - } - - return newName != rwt.currentTimeFileName -} - -func (rwt *rollingFileWriterTime) isFileRollNameValid(rname string) bool { - if len(rname) == 0 { - return false - } - _, err := time.ParseInLocation(rwt.timePattern, rname, time.Local) - return err == nil -} - -type rollTimeFileTailsSlice struct { - data []string - pattern string -} - -func (p rollTimeFileTailsSlice) Len() int { - return len(p.data) -} - -func (p rollTimeFileTailsSlice) Less(i, j int) bool { - t1, _ := time.ParseInLocation(p.pattern, p.data[i], time.Local) - t2, _ := time.ParseInLocation(p.pattern, p.data[j], time.Local) - return t1.Before(t2) -} - -func (p rollTimeFileTailsSlice) Swap(i, j int) { - p.data[i], p.data[j] = p.data[j], p.data[i] -} - -func (rwt *rollingFileWriterTime) sortFileRollNamesAsc(fs []string) ([]string, error) { - ss := rollTimeFileTailsSlice{data: fs, pattern: rwt.timePattern} - sort.Sort(ss) - return ss.data, nil -} - -func (rwt *rollingFileWriterTime) getNewHistoryRollFileName(_ []string) string { - newFileName := rwt.currentTimeFileName - rwt.currentTimeFileName = time.Now().Format(rwt.timePattern) - return newFileName -} - -func (rwt *rollingFileWriterTime) getCurrentFileName() string { - if rwt.fullName { - return rwt.createFullFileName(rwt.fileName, time.Now().Format(rwt.timePattern)) - } - return rwt.fileName -} - -func (rwt *rollingFileWriterTime) String() string { - return fmt.Sprintf("Rolling file writer (By TIME): filename: %s, archive: %s, archivefile: %s, pattern: %s, maxRolls: %v", - rwt.fileName, - rollingArchiveTypesStringRepresentation[rwt.archiveType], - rwt.archivePath, - rwt.timePattern, - rwt.maxRolls) -} diff --git a/vendor/github.com/cihub/seelog/writers_smtpwriter.go b/vendor/github.com/cihub/seelog/writers_smtpwriter.go deleted file mode 100644 index 31b794383..000000000 --- a/vendor/github.com/cihub/seelog/writers_smtpwriter.go +++ /dev/null @@ -1,214 +0,0 @@ -// Copyright (c) 2012 - Cloud Instruments Co., Ltd. -// -// 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. - -package seelog - -import ( - "crypto/tls" - "crypto/x509" - "errors" - "fmt" - "io/ioutil" - "net/smtp" - "path/filepath" - "strings" -) - -const ( - // Default subject phrase for sending emails. - DefaultSubjectPhrase = "Diagnostic message from server: " - - // Message subject pattern composed according to RFC 5321. - rfc5321SubjectPattern = "From: %s <%s>\nSubject: %s\n\n" -) - -// smtpWriter is used to send emails via given SMTP-server. -type smtpWriter struct { - auth smtp.Auth - hostName string - hostPort string - hostNameWithPort string - senderAddress string - senderName string - recipientAddresses []string - caCertDirPaths []string - mailHeaders []string - subject string -} - -// NewSMTPWriter returns a new SMTP-writer. -func NewSMTPWriter(sa, sn string, ras []string, hn, hp, un, pwd string, cacdps []string, subj string, headers []string) *smtpWriter { - return &smtpWriter{ - auth: smtp.PlainAuth("", un, pwd, hn), - hostName: hn, - hostPort: hp, - hostNameWithPort: fmt.Sprintf("%s:%s", hn, hp), - senderAddress: sa, - senderName: sn, - recipientAddresses: ras, - caCertDirPaths: cacdps, - subject: subj, - mailHeaders: headers, - } -} - -func prepareMessage(senderAddr, senderName, subject string, body []byte, headers []string) []byte { - headerLines := fmt.Sprintf(rfc5321SubjectPattern, senderName, senderAddr, subject) - // Build header lines if configured. - if headers != nil && len(headers) > 0 { - headerLines += strings.Join(headers, "\n") - headerLines += "\n" - } - return append([]byte(headerLines), body...) -} - -// getTLSConfig gets paths of PEM files with certificates, -// host server name and tries to create an appropriate TLS.Config. -func getTLSConfig(pemFileDirPaths []string, hostName string) (config *tls.Config, err error) { - if pemFileDirPaths == nil || len(pemFileDirPaths) == 0 { - err = errors.New("invalid PEM file paths") - return - } - pemEncodedContent := []byte{} - var ( - e error - bytes []byte - ) - // Create a file-filter-by-extension, set aside non-pem files. - pemFilePathFilter := func(fp string) bool { - if filepath.Ext(fp) == ".pem" { - return true - } - return false - } - for _, pemFileDirPath := range pemFileDirPaths { - pemFilePaths, err := getDirFilePaths(pemFileDirPath, pemFilePathFilter, false) - if err != nil { - return nil, err - } - - // Put together all the PEM files to decode them as a whole byte slice. - for _, pfp := range pemFilePaths { - if bytes, e = ioutil.ReadFile(pfp); e == nil { - pemEncodedContent = append(pemEncodedContent, bytes...) - } else { - return nil, fmt.Errorf("cannot read file: %s: %s", pfp, e.Error()) - } - } - } - config = &tls.Config{RootCAs: x509.NewCertPool(), ServerName: hostName} - isAppended := config.RootCAs.AppendCertsFromPEM(pemEncodedContent) - if !isAppended { - // Extract this into a separate error. - err = errors.New("invalid PEM content") - return - } - return -} - -// SendMail accepts TLS configuration, connects to the server at addr, -// switches to TLS if possible, authenticates with mechanism a if possible, -// and then sends an email from address from, to addresses to, with message msg. -func sendMailWithTLSConfig(config *tls.Config, addr string, a smtp.Auth, from string, to []string, msg []byte) error { - c, err := smtp.Dial(addr) - if err != nil { - return err - } - // Check if the server supports STARTTLS extension. - if ok, _ := c.Extension("STARTTLS"); ok { - if err = c.StartTLS(config); err != nil { - return err - } - } - // Check if the server supports AUTH extension and use given smtp.Auth. - if a != nil { - if isSupported, _ := c.Extension("AUTH"); isSupported { - if err = c.Auth(a); err != nil { - return err - } - } - } - // Portion of code from the official smtp.SendMail function, - // see http://golang.org/src/pkg/net/smtp/smtp.go. - if err = c.Mail(from); err != nil { - return err - } - for _, addr := range to { - if err = c.Rcpt(addr); err != nil { - return err - } - } - w, err := c.Data() - if err != nil { - return err - } - _, err = w.Write(msg) - if err != nil { - return err - } - err = w.Close() - if err != nil { - return err - } - return c.Quit() -} - -// Write pushes a text message properly composed according to RFC 5321 -// to a post server, which sends it to the recipients. -func (smtpw *smtpWriter) Write(data []byte) (int, error) { - var err error - - if smtpw.caCertDirPaths == nil { - err = smtp.SendMail( - smtpw.hostNameWithPort, - smtpw.auth, - smtpw.senderAddress, - smtpw.recipientAddresses, - prepareMessage(smtpw.senderAddress, smtpw.senderName, smtpw.subject, data, smtpw.mailHeaders), - ) - } else { - config, e := getTLSConfig(smtpw.caCertDirPaths, smtpw.hostName) - if e != nil { - return 0, e - } - err = sendMailWithTLSConfig( - config, - smtpw.hostNameWithPort, - smtpw.auth, - smtpw.senderAddress, - smtpw.recipientAddresses, - prepareMessage(smtpw.senderAddress, smtpw.senderName, smtpw.subject, data, smtpw.mailHeaders), - ) - } - if err != nil { - return 0, err - } - return len(data), nil -} - -// Close closes down SMTP-connection. -func (smtpw *smtpWriter) Close() error { - // Do nothing as Write method opens and closes connection automatically. - return nil -} diff --git a/vendor/github.com/dgrijalva/jwt-go/LICENSE b/vendor/github.com/dgrijalva/jwt-go/LICENSE deleted file mode 100644 index df83a9c2f..000000000 --- a/vendor/github.com/dgrijalva/jwt-go/LICENSE +++ /dev/null @@ -1,8 +0,0 @@ -Copyright (c) 2012 Dave Grijalva - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/vendor/github.com/dgrijalva/jwt-go/MIGRATION_GUIDE.md b/vendor/github.com/dgrijalva/jwt-go/MIGRATION_GUIDE.md deleted file mode 100644 index 7fc1f793c..000000000 --- a/vendor/github.com/dgrijalva/jwt-go/MIGRATION_GUIDE.md +++ /dev/null @@ -1,97 +0,0 @@ -## Migration Guide from v2 -> v3 - -Version 3 adds several new, frequently requested features. To do so, it introduces a few breaking changes. We've worked to keep these as minimal as possible. This guide explains the breaking changes and how you can quickly update your code. - -### `Token.Claims` is now an interface type - -The most requested feature from the 2.0 verison of this library was the ability to provide a custom type to the JSON parser for claims. This was implemented by introducing a new interface, `Claims`, to replace `map[string]interface{}`. We also included two concrete implementations of `Claims`: `MapClaims` and `StandardClaims`. - -`MapClaims` is an alias for `map[string]interface{}` with built in validation behavior. It is the default claims type when using `Parse`. The usage is unchanged except you must type cast the claims property. - -The old example for parsing a token looked like this.. - -```go - if token, err := jwt.Parse(tokenString, keyLookupFunc); err == nil { - fmt.Printf("Token for user %v expires %v", token.Claims["user"], token.Claims["exp"]) - } -``` - -is now directly mapped to... - -```go - if token, err := jwt.Parse(tokenString, keyLookupFunc); err == nil { - claims := token.Claims.(jwt.MapClaims) - fmt.Printf("Token for user %v expires %v", claims["user"], claims["exp"]) - } -``` - -`StandardClaims` is designed to be embedded in your custom type. You can supply a custom claims type with the new `ParseWithClaims` function. Here's an example of using a custom claims type. - -```go - type MyCustomClaims struct { - User string - *StandardClaims - } - - if token, err := jwt.ParseWithClaims(tokenString, &MyCustomClaims{}, keyLookupFunc); err == nil { - claims := token.Claims.(*MyCustomClaims) - fmt.Printf("Token for user %v expires %v", claims.User, claims.StandardClaims.ExpiresAt) - } -``` - -### `ParseFromRequest` has been moved - -To keep this library focused on the tokens without becoming overburdened with complex request processing logic, `ParseFromRequest` and its new companion `ParseFromRequestWithClaims` have been moved to a subpackage, `request`. The method signatues have also been augmented to receive a new argument: `Extractor`. - -`Extractors` do the work of picking the token string out of a request. The interface is simple and composable. - -This simple parsing example: - -```go - if token, err := jwt.ParseFromRequest(tokenString, req, keyLookupFunc); err == nil { - fmt.Printf("Token for user %v expires %v", token.Claims["user"], token.Claims["exp"]) - } -``` - -is directly mapped to: - -```go - if token, err := request.ParseFromRequest(req, request.OAuth2Extractor, keyLookupFunc); err == nil { - claims := token.Claims.(jwt.MapClaims) - fmt.Printf("Token for user %v expires %v", claims["user"], claims["exp"]) - } -``` - -There are several concrete `Extractor` types provided for your convenience: - -* `HeaderExtractor` will search a list of headers until one contains content. -* `ArgumentExtractor` will search a list of keys in request query and form arguments until one contains content. -* `MultiExtractor` will try a list of `Extractors` in order until one returns content. -* `AuthorizationHeaderExtractor` will look in the `Authorization` header for a `Bearer` token. -* `OAuth2Extractor` searches the places an OAuth2 token would be specified (per the spec): `Authorization` header and `access_token` argument -* `PostExtractionFilter` wraps an `Extractor`, allowing you to process the content before it's parsed. A simple example is stripping the `Bearer ` text from a header - - -### RSA signing methods no longer accept `[]byte` keys - -Due to a [critical vulnerability](https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/), we've decided the convenience of accepting `[]byte` instead of `rsa.PublicKey` or `rsa.PrivateKey` isn't worth the risk of misuse. - -To replace this behavior, we've added two helper methods: `ParseRSAPrivateKeyFromPEM(key []byte) (*rsa.PrivateKey, error)` and `ParseRSAPublicKeyFromPEM(key []byte) (*rsa.PublicKey, error)`. These are just simple helpers for unpacking PEM encoded PKCS1 and PKCS8 keys. If your keys are encoded any other way, all you need to do is convert them to the `crypto/rsa` package's types. - -```go - func keyLookupFunc(*Token) (interface{}, error) { - // Don't forget to validate the alg is what you expect: - if _, ok := token.Method.(*jwt.SigningMethodRSA); !ok { - return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"]) - } - - // Look up key - key, err := lookupPublicKey(token.Header["kid"]) - if err != nil { - return nil, err - } - - // Unpack key from PEM encoded PKCS8 - return jwt.ParseRSAPublicKeyFromPEM(key) - } -``` diff --git a/vendor/github.com/dgrijalva/jwt-go/README.md b/vendor/github.com/dgrijalva/jwt-go/README.md deleted file mode 100644 index d358d881b..000000000 --- a/vendor/github.com/dgrijalva/jwt-go/README.md +++ /dev/null @@ -1,100 +0,0 @@ -# jwt-go - -[![Build Status](https://travis-ci.org/dgrijalva/jwt-go.svg?branch=master)](https://travis-ci.org/dgrijalva/jwt-go) -[![GoDoc](https://godoc.org/github.com/dgrijalva/jwt-go?status.svg)](https://godoc.org/github.com/dgrijalva/jwt-go) - -A [go](http://www.golang.org) (or 'golang' for search engine friendliness) implementation of [JSON Web Tokens](http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html) - -**NEW VERSION COMING:** There have been a lot of improvements suggested since the version 3.0.0 released in 2016. I'm working now on cutting two different releases: 3.2.0 will contain any non-breaking changes or enhancements. 4.0.0 will follow shortly which will include breaking changes. See the 4.0.0 milestone to get an idea of what's coming. If you have other ideas, or would like to participate in 4.0.0, now's the time. If you depend on this library and don't want to be interrupted, I recommend you use your dependency mangement tool to pin to version 3. - -**SECURITY NOTICE:** Some older versions of Go have a security issue in the cryotp/elliptic. Recommendation is to upgrade to at least 1.8.3. See issue #216 for more detail. - -**SECURITY NOTICE:** It's important that you [validate the `alg` presented is what you expect](https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/). This library attempts to make it easy to do the right thing by requiring key types match the expected alg, but you should take the extra step to verify it in your usage. See the examples provided. - -## What the heck is a JWT? - -JWT.io has [a great introduction](https://jwt.io/introduction) to JSON Web Tokens. - -In short, it's a signed JSON object that does something useful (for example, authentication). It's commonly used for `Bearer` tokens in Oauth 2. A token is made of three parts, separated by `.`'s. The first two parts are JSON objects, that have been [base64url](http://tools.ietf.org/html/rfc4648) encoded. The last part is the signature, encoded the same way. - -The first part is called the header. It contains the necessary information for verifying the last part, the signature. For example, which encryption method was used for signing and what key was used. - -The part in the middle is the interesting bit. It's called the Claims and contains the actual stuff you care about. Refer to [the RFC](http://self-issued.info/docs/draft-jones-json-web-token.html) for information about reserved keys and the proper way to add your own. - -## What's in the box? - -This library supports the parsing and verification as well as the generation and signing of JWTs. Current supported signing algorithms are HMAC SHA, RSA, RSA-PSS, and ECDSA, though hooks are present for adding your own. - -## Examples - -See [the project documentation](https://godoc.org/github.com/dgrijalva/jwt-go) for examples of usage: - -* [Simple example of parsing and validating a token](https://godoc.org/github.com/dgrijalva/jwt-go#example-Parse--Hmac) -* [Simple example of building and signing a token](https://godoc.org/github.com/dgrijalva/jwt-go#example-New--Hmac) -* [Directory of Examples](https://godoc.org/github.com/dgrijalva/jwt-go#pkg-examples) - -## Extensions - -This library publishes all the necessary components for adding your own signing methods. Simply implement the `SigningMethod` interface and register a factory method using `RegisterSigningMethod`. - -Here's an example of an extension that integrates with the Google App Engine signing tools: https://github.com/someone1/gcp-jwt-go - -## Compliance - -This library was last reviewed to comply with [RTF 7519](http://www.rfc-editor.org/info/rfc7519) dated May 2015 with a few notable differences: - -* In order to protect against accidental use of [Unsecured JWTs](http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html#UnsecuredJWT), tokens using `alg=none` will only be accepted if the constant `jwt.UnsafeAllowNoneSignatureType` is provided as the key. - -## Project Status & Versioning - -This library is considered production ready. Feedback and feature requests are appreciated. The API should be considered stable. There should be very few backwards-incompatible changes outside of major version updates (and only with good reason). - -This project uses [Semantic Versioning 2.0.0](http://semver.org). Accepted pull requests will land on `master`. Periodically, versions will be tagged from `master`. You can find all the releases on [the project releases page](https://github.com/dgrijalva/jwt-go/releases). - -While we try to make it obvious when we make breaking changes, there isn't a great mechanism for pushing announcements out to users. You may want to use this alternative package include: `gopkg.in/dgrijalva/jwt-go.v3`. It will do the right thing WRT semantic versioning. - -**BREAKING CHANGES:*** -* Version 3.0.0 includes _a lot_ of changes from the 2.x line, including a few that break the API. We've tried to break as few things as possible, so there should just be a few type signature changes. A full list of breaking changes is available in `VERSION_HISTORY.md`. See `MIGRATION_GUIDE.md` for more information on updating your code. - -## Usage Tips - -### Signing vs Encryption - -A token is simply a JSON object that is signed by its author. this tells you exactly two things about the data: - -* The author of the token was in the possession of the signing secret -* The data has not been modified since it was signed - -It's important to know that JWT does not provide encryption, which means anyone who has access to the token can read its contents. If you need to protect (encrypt) the data, there is a companion spec, `JWE`, that provides this functionality. JWE is currently outside the scope of this library. - -### Choosing a Signing Method - -There are several signing methods available, and you should probably take the time to learn about the various options before choosing one. The principal design decision is most likely going to be symmetric vs asymmetric. - -Symmetric signing methods, such as HSA, use only a single secret. This is probably the simplest signing method to use since any `[]byte` can be used as a valid secret. They are also slightly computationally faster to use, though this rarely is enough to matter. Symmetric signing methods work the best when both producers and consumers of tokens are trusted, or even the same system. Since the same secret is used to both sign and validate tokens, you can't easily distribute the key for validation. - -Asymmetric signing methods, such as RSA, use different keys for signing and verifying tokens. This makes it possible to produce tokens with a private key, and allow any consumer to access the public key for verification. - -### Signing Methods and Key Types - -Each signing method expects a different object type for its signing keys. See the package documentation for details. Here are the most common ones: - -* The [HMAC signing method](https://godoc.org/github.com/dgrijalva/jwt-go#SigningMethodHMAC) (`HS256`,`HS384`,`HS512`) expect `[]byte` values for signing and validation -* The [RSA signing method](https://godoc.org/github.com/dgrijalva/jwt-go#SigningMethodRSA) (`RS256`,`RS384`,`RS512`) expect `*rsa.PrivateKey` for signing and `*rsa.PublicKey` for validation -* The [ECDSA signing method](https://godoc.org/github.com/dgrijalva/jwt-go#SigningMethodECDSA) (`ES256`,`ES384`,`ES512`) expect `*ecdsa.PrivateKey` for signing and `*ecdsa.PublicKey` for validation - -### JWT and OAuth - -It's worth mentioning that OAuth and JWT are not the same thing. A JWT token is simply a signed JSON object. It can be used anywhere such a thing is useful. There is some confusion, though, as JWT is the most common type of bearer token used in OAuth2 authentication. - -Without going too far down the rabbit hole, here's a description of the interaction of these technologies: - -* OAuth is a protocol for allowing an identity provider to be separate from the service a user is logging in to. For example, whenever you use Facebook to log into a different service (Yelp, Spotify, etc), you are using OAuth. -* OAuth defines several options for passing around authentication data. One popular method is called a "bearer token". A bearer token is simply a string that _should_ only be held by an authenticated user. Thus, simply presenting this token proves your identity. You can probably derive from here why a JWT might make a good bearer token. -* Because bearer tokens are used for authentication, it's important they're kept secret. This is why transactions that use bearer tokens typically happen over SSL. - -## More - -Documentation can be found [on godoc.org](http://godoc.org/github.com/dgrijalva/jwt-go). - -The command line utility included in this project (cmd/jwt) provides a straightforward example of token creation and parsing as well as a useful tool for debugging your own integration. You'll also find several implementation examples in the documentation. diff --git a/vendor/github.com/dgrijalva/jwt-go/VERSION_HISTORY.md b/vendor/github.com/dgrijalva/jwt-go/VERSION_HISTORY.md deleted file mode 100644 index 637029831..000000000 --- a/vendor/github.com/dgrijalva/jwt-go/VERSION_HISTORY.md +++ /dev/null @@ -1,118 +0,0 @@ -## `jwt-go` Version History - -#### 3.2.0 - -* Added method `ParseUnverified` to allow users to split up the tasks of parsing and validation -* HMAC signing method returns `ErrInvalidKeyType` instead of `ErrInvalidKey` where appropriate -* Added options to `request.ParseFromRequest`, which allows for an arbitrary list of modifiers to parsing behavior. Initial set include `WithClaims` and `WithParser`. Existing usage of this function will continue to work as before. -* Deprecated `ParseFromRequestWithClaims` to simplify API in the future. - -#### 3.1.0 - -* Improvements to `jwt` command line tool -* Added `SkipClaimsValidation` option to `Parser` -* Documentation updates - -#### 3.0.0 - -* **Compatibility Breaking Changes**: See MIGRATION_GUIDE.md for tips on updating your code - * Dropped support for `[]byte` keys when using RSA signing methods. This convenience feature could contribute to security vulnerabilities involving mismatched key types with signing methods. - * `ParseFromRequest` has been moved to `request` subpackage and usage has changed - * The `Claims` property on `Token` is now type `Claims` instead of `map[string]interface{}`. The default value is type `MapClaims`, which is an alias to `map[string]interface{}`. This makes it possible to use a custom type when decoding claims. -* Other Additions and Changes - * Added `Claims` interface type to allow users to decode the claims into a custom type - * Added `ParseWithClaims`, which takes a third argument of type `Claims`. Use this function instead of `Parse` if you have a custom type you'd like to decode into. - * Dramatically improved the functionality and flexibility of `ParseFromRequest`, which is now in the `request` subpackage - * Added `ParseFromRequestWithClaims` which is the `FromRequest` equivalent of `ParseWithClaims` - * Added new interface type `Extractor`, which is used for extracting JWT strings from http requests. Used with `ParseFromRequest` and `ParseFromRequestWithClaims`. - * Added several new, more specific, validation errors to error type bitmask - * Moved examples from README to executable example files - * Signing method registry is now thread safe - * Added new property to `ValidationError`, which contains the raw error returned by calls made by parse/verify (such as those returned by keyfunc or json parser) - -#### 2.7.0 - -This will likely be the last backwards compatible release before 3.0.0, excluding essential bug fixes. - -* Added new option `-show` to the `jwt` command that will just output the decoded token without verifying -* Error text for expired tokens includes how long it's been expired -* Fixed incorrect error returned from `ParseRSAPublicKeyFromPEM` -* Documentation updates - -#### 2.6.0 - -* Exposed inner error within ValidationError -* Fixed validation errors when using UseJSONNumber flag -* Added several unit tests - -#### 2.5.0 - -* Added support for signing method none. You shouldn't use this. The API tries to make this clear. -* Updated/fixed some documentation -* Added more helpful error message when trying to parse tokens that begin with `BEARER ` - -#### 2.4.0 - -* Added new type, Parser, to allow for configuration of various parsing parameters - * You can now specify a list of valid signing methods. Anything outside this set will be rejected. - * You can now opt to use the `json.Number` type instead of `float64` when parsing token JSON -* Added support for [Travis CI](https://travis-ci.org/dgrijalva/jwt-go) -* Fixed some bugs with ECDSA parsing - -#### 2.3.0 - -* Added support for ECDSA signing methods -* Added support for RSA PSS signing methods (requires go v1.4) - -#### 2.2.0 - -* Gracefully handle a `nil` `Keyfunc` being passed to `Parse`. Result will now be the parsed token and an error, instead of a panic. - -#### 2.1.0 - -Backwards compatible API change that was missed in 2.0.0. - -* The `SignedString` method on `Token` now takes `interface{}` instead of `[]byte` - -#### 2.0.0 - -There were two major reasons for breaking backwards compatibility with this update. The first was a refactor required to expand the width of the RSA and HMAC-SHA signing implementations. There will likely be no required code changes to support this change. - -The second update, while unfortunately requiring a small change in integration, is required to open up this library to other signing methods. Not all keys used for all signing methods have a single standard on-disk representation. Requiring `[]byte` as the type for all keys proved too limiting. Additionally, this implementation allows for pre-parsed tokens to be reused, which might matter in an application that parses a high volume of tokens with a small set of keys. Backwards compatibilty has been maintained for passing `[]byte` to the RSA signing methods, but they will also accept `*rsa.PublicKey` and `*rsa.PrivateKey`. - -It is likely the only integration change required here will be to change `func(t *jwt.Token) ([]byte, error)` to `func(t *jwt.Token) (interface{}, error)` when calling `Parse`. - -* **Compatibility Breaking Changes** - * `SigningMethodHS256` is now `*SigningMethodHMAC` instead of `type struct` - * `SigningMethodRS256` is now `*SigningMethodRSA` instead of `type struct` - * `KeyFunc` now returns `interface{}` instead of `[]byte` - * `SigningMethod.Sign` now takes `interface{}` instead of `[]byte` for the key - * `SigningMethod.Verify` now takes `interface{}` instead of `[]byte` for the key -* Renamed type `SigningMethodHS256` to `SigningMethodHMAC`. Specific sizes are now just instances of this type. - * Added public package global `SigningMethodHS256` - * Added public package global `SigningMethodHS384` - * Added public package global `SigningMethodHS512` -* Renamed type `SigningMethodRS256` to `SigningMethodRSA`. Specific sizes are now just instances of this type. - * Added public package global `SigningMethodRS256` - * Added public package global `SigningMethodRS384` - * Added public package global `SigningMethodRS512` -* Moved sample private key for HMAC tests from an inline value to a file on disk. Value is unchanged. -* Refactored the RSA implementation to be easier to read -* Exposed helper methods `ParseRSAPrivateKeyFromPEM` and `ParseRSAPublicKeyFromPEM` - -#### 1.0.2 - -* Fixed bug in parsing public keys from certificates -* Added more tests around the parsing of keys for RS256 -* Code refactoring in RS256 implementation. No functional changes - -#### 1.0.1 - -* Fixed panic if RS256 signing method was passed an invalid key - -#### 1.0.0 - -* First versioned release -* API stabilized -* Supports creating, signing, parsing, and validating JWT tokens -* Supports RS256 and HS256 signing methods \ No newline at end of file diff --git a/vendor/github.com/dgrijalva/jwt-go/claims.go b/vendor/github.com/dgrijalva/jwt-go/claims.go deleted file mode 100644 index f0228f02e..000000000 --- a/vendor/github.com/dgrijalva/jwt-go/claims.go +++ /dev/null @@ -1,134 +0,0 @@ -package jwt - -import ( - "crypto/subtle" - "fmt" - "time" -) - -// For a type to be a Claims object, it must just have a Valid method that determines -// if the token is invalid for any supported reason -type Claims interface { - Valid() error -} - -// Structured version of Claims Section, as referenced at -// https://tools.ietf.org/html/rfc7519#section-4.1 -// See examples for how to use this with your own claim types -type StandardClaims struct { - Audience string `json:"aud,omitempty"` - ExpiresAt int64 `json:"exp,omitempty"` - Id string `json:"jti,omitempty"` - IssuedAt int64 `json:"iat,omitempty"` - Issuer string `json:"iss,omitempty"` - NotBefore int64 `json:"nbf,omitempty"` - Subject string `json:"sub,omitempty"` -} - -// Validates time based claims "exp, iat, nbf". -// There is no accounting for clock skew. -// As well, if any of the above claims are not in the token, it will still -// be considered a valid claim. -func (c StandardClaims) Valid() error { - vErr := new(ValidationError) - now := TimeFunc().Unix() - - // The claims below are optional, by default, so if they are set to the - // default value in Go, let's not fail the verification for them. - if c.VerifyExpiresAt(now, false) == false { - delta := time.Unix(now, 0).Sub(time.Unix(c.ExpiresAt, 0)) - vErr.Inner = fmt.Errorf("token is expired by %v", delta) - vErr.Errors |= ValidationErrorExpired - } - - if c.VerifyIssuedAt(now, false) == false { - vErr.Inner = fmt.Errorf("Token used before issued") - vErr.Errors |= ValidationErrorIssuedAt - } - - if c.VerifyNotBefore(now, false) == false { - vErr.Inner = fmt.Errorf("token is not valid yet") - vErr.Errors |= ValidationErrorNotValidYet - } - - if vErr.valid() { - return nil - } - - return vErr -} - -// Compares the aud claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (c *StandardClaims) VerifyAudience(cmp string, req bool) bool { - return verifyAud(c.Audience, cmp, req) -} - -// Compares the exp claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (c *StandardClaims) VerifyExpiresAt(cmp int64, req bool) bool { - return verifyExp(c.ExpiresAt, cmp, req) -} - -// Compares the iat claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (c *StandardClaims) VerifyIssuedAt(cmp int64, req bool) bool { - return verifyIat(c.IssuedAt, cmp, req) -} - -// Compares the iss claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (c *StandardClaims) VerifyIssuer(cmp string, req bool) bool { - return verifyIss(c.Issuer, cmp, req) -} - -// Compares the nbf claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (c *StandardClaims) VerifyNotBefore(cmp int64, req bool) bool { - return verifyNbf(c.NotBefore, cmp, req) -} - -// ----- helpers - -func verifyAud(aud string, cmp string, required bool) bool { - if aud == "" { - return !required - } - if subtle.ConstantTimeCompare([]byte(aud), []byte(cmp)) != 0 { - return true - } else { - return false - } -} - -func verifyExp(exp int64, now int64, required bool) bool { - if exp == 0 { - return !required - } - return now <= exp -} - -func verifyIat(iat int64, now int64, required bool) bool { - if iat == 0 { - return !required - } - return now >= iat -} - -func verifyIss(iss string, cmp string, required bool) bool { - if iss == "" { - return !required - } - if subtle.ConstantTimeCompare([]byte(iss), []byte(cmp)) != 0 { - return true - } else { - return false - } -} - -func verifyNbf(nbf int64, now int64, required bool) bool { - if nbf == 0 { - return !required - } - return now >= nbf -} diff --git a/vendor/github.com/dgrijalva/jwt-go/doc.go b/vendor/github.com/dgrijalva/jwt-go/doc.go deleted file mode 100644 index a86dc1a3b..000000000 --- a/vendor/github.com/dgrijalva/jwt-go/doc.go +++ /dev/null @@ -1,4 +0,0 @@ -// Package jwt is a Go implementation of JSON Web Tokens: http://self-issued.info/docs/draft-jones-json-web-token.html -// -// See README.md for more info. -package jwt diff --git a/vendor/github.com/dgrijalva/jwt-go/ecdsa.go b/vendor/github.com/dgrijalva/jwt-go/ecdsa.go deleted file mode 100644 index f97738124..000000000 --- a/vendor/github.com/dgrijalva/jwt-go/ecdsa.go +++ /dev/null @@ -1,148 +0,0 @@ -package jwt - -import ( - "crypto" - "crypto/ecdsa" - "crypto/rand" - "errors" - "math/big" -) - -var ( - // Sadly this is missing from crypto/ecdsa compared to crypto/rsa - ErrECDSAVerification = errors.New("crypto/ecdsa: verification error") -) - -// Implements the ECDSA family of signing methods signing methods -// Expects *ecdsa.PrivateKey for signing and *ecdsa.PublicKey for verification -type SigningMethodECDSA struct { - Name string - Hash crypto.Hash - KeySize int - CurveBits int -} - -// Specific instances for EC256 and company -var ( - SigningMethodES256 *SigningMethodECDSA - SigningMethodES384 *SigningMethodECDSA - SigningMethodES512 *SigningMethodECDSA -) - -func init() { - // ES256 - SigningMethodES256 = &SigningMethodECDSA{"ES256", crypto.SHA256, 32, 256} - RegisterSigningMethod(SigningMethodES256.Alg(), func() SigningMethod { - return SigningMethodES256 - }) - - // ES384 - SigningMethodES384 = &SigningMethodECDSA{"ES384", crypto.SHA384, 48, 384} - RegisterSigningMethod(SigningMethodES384.Alg(), func() SigningMethod { - return SigningMethodES384 - }) - - // ES512 - SigningMethodES512 = &SigningMethodECDSA{"ES512", crypto.SHA512, 66, 521} - RegisterSigningMethod(SigningMethodES512.Alg(), func() SigningMethod { - return SigningMethodES512 - }) -} - -func (m *SigningMethodECDSA) Alg() string { - return m.Name -} - -// Implements the Verify method from SigningMethod -// For this verify method, key must be an ecdsa.PublicKey struct -func (m *SigningMethodECDSA) Verify(signingString, signature string, key interface{}) error { - var err error - - // Decode the signature - var sig []byte - if sig, err = DecodeSegment(signature); err != nil { - return err - } - - // Get the key - var ecdsaKey *ecdsa.PublicKey - switch k := key.(type) { - case *ecdsa.PublicKey: - ecdsaKey = k - default: - return ErrInvalidKeyType - } - - if len(sig) != 2*m.KeySize { - return ErrECDSAVerification - } - - r := big.NewInt(0).SetBytes(sig[:m.KeySize]) - s := big.NewInt(0).SetBytes(sig[m.KeySize:]) - - // Create hasher - if !m.Hash.Available() { - return ErrHashUnavailable - } - hasher := m.Hash.New() - hasher.Write([]byte(signingString)) - - // Verify the signature - if verifystatus := ecdsa.Verify(ecdsaKey, hasher.Sum(nil), r, s); verifystatus == true { - return nil - } else { - return ErrECDSAVerification - } -} - -// Implements the Sign method from SigningMethod -// For this signing method, key must be an ecdsa.PrivateKey struct -func (m *SigningMethodECDSA) Sign(signingString string, key interface{}) (string, error) { - // Get the key - var ecdsaKey *ecdsa.PrivateKey - switch k := key.(type) { - case *ecdsa.PrivateKey: - ecdsaKey = k - default: - return "", ErrInvalidKeyType - } - - // Create the hasher - if !m.Hash.Available() { - return "", ErrHashUnavailable - } - - hasher := m.Hash.New() - hasher.Write([]byte(signingString)) - - // Sign the string and return r, s - if r, s, err := ecdsa.Sign(rand.Reader, ecdsaKey, hasher.Sum(nil)); err == nil { - curveBits := ecdsaKey.Curve.Params().BitSize - - if m.CurveBits != curveBits { - return "", ErrInvalidKey - } - - keyBytes := curveBits / 8 - if curveBits%8 > 0 { - keyBytes += 1 - } - - // We serialize the outpus (r and s) into big-endian byte arrays and pad - // them with zeros on the left to make sure the sizes work out. Both arrays - // must be keyBytes long, and the output must be 2*keyBytes long. - rBytes := r.Bytes() - rBytesPadded := make([]byte, keyBytes) - copy(rBytesPadded[keyBytes-len(rBytes):], rBytes) - - sBytes := s.Bytes() - sBytesPadded := make([]byte, keyBytes) - copy(sBytesPadded[keyBytes-len(sBytes):], sBytes) - - out := append(rBytesPadded, sBytesPadded...) - - return EncodeSegment(out), nil - } else { - return "", err - } -} diff --git a/vendor/github.com/dgrijalva/jwt-go/ecdsa_utils.go b/vendor/github.com/dgrijalva/jwt-go/ecdsa_utils.go deleted file mode 100644 index d19624b72..000000000 --- a/vendor/github.com/dgrijalva/jwt-go/ecdsa_utils.go +++ /dev/null @@ -1,67 +0,0 @@ -package jwt - -import ( - "crypto/ecdsa" - "crypto/x509" - "encoding/pem" - "errors" -) - -var ( - ErrNotECPublicKey = errors.New("Key is not a valid ECDSA public key") - ErrNotECPrivateKey = errors.New("Key is not a valid ECDSA private key") -) - -// Parse PEM encoded Elliptic Curve Private Key Structure -func ParseECPrivateKeyFromPEM(key []byte) (*ecdsa.PrivateKey, error) { - var err error - - // Parse PEM block - var block *pem.Block - if block, _ = pem.Decode(key); block == nil { - return nil, ErrKeyMustBePEMEncoded - } - - // Parse the key - var parsedKey interface{} - if parsedKey, err = x509.ParseECPrivateKey(block.Bytes); err != nil { - return nil, err - } - - var pkey *ecdsa.PrivateKey - var ok bool - if pkey, ok = parsedKey.(*ecdsa.PrivateKey); !ok { - return nil, ErrNotECPrivateKey - } - - return pkey, nil -} - -// Parse PEM encoded PKCS1 or PKCS8 public key -func ParseECPublicKeyFromPEM(key []byte) (*ecdsa.PublicKey, error) { - var err error - - // Parse PEM block - var block *pem.Block - if block, _ = pem.Decode(key); block == nil { - return nil, ErrKeyMustBePEMEncoded - } - - // Parse the key - var parsedKey interface{} - if parsedKey, err = x509.ParsePKIXPublicKey(block.Bytes); err != nil { - if cert, err := x509.ParseCertificate(block.Bytes); err == nil { - parsedKey = cert.PublicKey - } else { - return nil, err - } - } - - var pkey *ecdsa.PublicKey - var ok bool - if pkey, ok = parsedKey.(*ecdsa.PublicKey); !ok { - return nil, ErrNotECPublicKey - } - - return pkey, nil -} diff --git a/vendor/github.com/dgrijalva/jwt-go/errors.go b/vendor/github.com/dgrijalva/jwt-go/errors.go deleted file mode 100644 index 1c93024aa..000000000 --- a/vendor/github.com/dgrijalva/jwt-go/errors.go +++ /dev/null @@ -1,59 +0,0 @@ -package jwt - -import ( - "errors" -) - -// Error constants -var ( - ErrInvalidKey = errors.New("key is invalid") - ErrInvalidKeyType = errors.New("key is of invalid type") - ErrHashUnavailable = errors.New("the requested hash function is unavailable") -) - -// The errors that might occur when parsing and validating a token -const ( - ValidationErrorMalformed uint32 = 1 << iota // Token is malformed - ValidationErrorUnverifiable // Token could not be verified because of signing problems - ValidationErrorSignatureInvalid // Signature validation failed - - // Standard Claim validation errors - ValidationErrorAudience // AUD validation failed - ValidationErrorExpired // EXP validation failed - ValidationErrorIssuedAt // IAT validation failed - ValidationErrorIssuer // ISS validation failed - ValidationErrorNotValidYet // NBF validation failed - ValidationErrorId // JTI validation failed - ValidationErrorClaimsInvalid // Generic claims validation error -) - -// Helper for constructing a ValidationError with a string error message -func NewValidationError(errorText string, errorFlags uint32) *ValidationError { - return &ValidationError{ - text: errorText, - Errors: errorFlags, - } -} - -// The error from Parse if token is not valid -type ValidationError struct { - Inner error // stores the error returned by external dependencies, i.e.: KeyFunc - Errors uint32 // bitfield. see ValidationError... constants - text string // errors that do not have a valid error just have text -} - -// Validation error is an error type -func (e ValidationError) Error() string { - if e.Inner != nil { - return e.Inner.Error() - } else if e.text != "" { - return e.text - } else { - return "token is invalid" - } -} - -// No errors -func (e *ValidationError) valid() bool { - return e.Errors == 0 -} diff --git a/vendor/github.com/dgrijalva/jwt-go/hmac.go b/vendor/github.com/dgrijalva/jwt-go/hmac.go deleted file mode 100644 index addbe5d40..000000000 --- a/vendor/github.com/dgrijalva/jwt-go/hmac.go +++ /dev/null @@ -1,95 +0,0 @@ -package jwt - -import ( - "crypto" - "crypto/hmac" - "errors" -) - -// Implements the HMAC-SHA family of signing methods signing methods -// Expects key type of []byte for both signing and validation -type SigningMethodHMAC struct { - Name string - Hash crypto.Hash -} - -// Specific instances for HS256 and company -var ( - SigningMethodHS256 *SigningMethodHMAC - SigningMethodHS384 *SigningMethodHMAC - SigningMethodHS512 *SigningMethodHMAC - ErrSignatureInvalid = errors.New("signature is invalid") -) - -func init() { - // HS256 - SigningMethodHS256 = &SigningMethodHMAC{"HS256", crypto.SHA256} - RegisterSigningMethod(SigningMethodHS256.Alg(), func() SigningMethod { - return SigningMethodHS256 - }) - - // HS384 - SigningMethodHS384 = &SigningMethodHMAC{"HS384", crypto.SHA384} - RegisterSigningMethod(SigningMethodHS384.Alg(), func() SigningMethod { - return SigningMethodHS384 - }) - - // HS512 - SigningMethodHS512 = &SigningMethodHMAC{"HS512", crypto.SHA512} - RegisterSigningMethod(SigningMethodHS512.Alg(), func() SigningMethod { - return SigningMethodHS512 - }) -} - -func (m *SigningMethodHMAC) Alg() string { - return m.Name -} - -// Verify the signature of HSXXX tokens. Returns nil if the signature is valid. -func (m *SigningMethodHMAC) Verify(signingString, signature string, key interface{}) error { - // Verify the key is the right type - keyBytes, ok := key.([]byte) - if !ok { - return ErrInvalidKeyType - } - - // Decode signature, for comparison - sig, err := DecodeSegment(signature) - if err != nil { - return err - } - - // Can we use the specified hashing method? - if !m.Hash.Available() { - return ErrHashUnavailable - } - - // This signing method is symmetric, so we validate the signature - // by reproducing the signature from the signing string and key, then - // comparing that against the provided signature. - hasher := hmac.New(m.Hash.New, keyBytes) - hasher.Write([]byte(signingString)) - if !hmac.Equal(sig, hasher.Sum(nil)) { - return ErrSignatureInvalid - } - - // No validation errors. Signature is good. - return nil -} - -// Implements the Sign method from SigningMethod for this signing method. -// Key must be []byte -func (m *SigningMethodHMAC) Sign(signingString string, key interface{}) (string, error) { - if keyBytes, ok := key.([]byte); ok { - if !m.Hash.Available() { - return "", ErrHashUnavailable - } - - hasher := hmac.New(m.Hash.New, keyBytes) - hasher.Write([]byte(signingString)) - - return EncodeSegment(hasher.Sum(nil)), nil - } - - return "", ErrInvalidKeyType -} diff --git a/vendor/github.com/dgrijalva/jwt-go/map_claims.go b/vendor/github.com/dgrijalva/jwt-go/map_claims.go deleted file mode 100644 index 291213c46..000000000 --- a/vendor/github.com/dgrijalva/jwt-go/map_claims.go +++ /dev/null @@ -1,94 +0,0 @@ -package jwt - -import ( - "encoding/json" - "errors" - // "fmt" -) - -// Claims type that uses the map[string]interface{} for JSON decoding -// This is the default claims type if you don't supply one -type MapClaims map[string]interface{} - -// Compares the aud claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (m MapClaims) VerifyAudience(cmp string, req bool) bool { - aud, _ := m["aud"].(string) - return verifyAud(aud, cmp, req) -} - -// Compares the exp claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (m MapClaims) VerifyExpiresAt(cmp int64, req bool) bool { - switch exp := m["exp"].(type) { - case float64: - return verifyExp(int64(exp), cmp, req) - case json.Number: - v, _ := exp.Int64() - return verifyExp(v, cmp, req) - } - return req == false -} - -// Compares the iat claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (m MapClaims) VerifyIssuedAt(cmp int64, req bool) bool { - switch iat := m["iat"].(type) { - case float64: - return verifyIat(int64(iat), cmp, req) - case json.Number: - v, _ := iat.Int64() - return verifyIat(v, cmp, req) - } - return req == false -} - -// Compares the iss claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (m MapClaims) VerifyIssuer(cmp string, req bool) bool { - iss, _ := m["iss"].(string) - return verifyIss(iss, cmp, req) -} - -// Compares the nbf claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (m MapClaims) VerifyNotBefore(cmp int64, req bool) bool { - switch nbf := m["nbf"].(type) { - case float64: - return verifyNbf(int64(nbf), cmp, req) - case json.Number: - v, _ := nbf.Int64() - return verifyNbf(v, cmp, req) - } - return req == false -} - -// Validates time based claims "exp, iat, nbf". -// There is no accounting for clock skew. -// As well, if any of the above claims are not in the token, it will still -// be considered a valid claim. -func (m MapClaims) Valid() error { - vErr := new(ValidationError) - now := TimeFunc().Unix() - - if m.VerifyExpiresAt(now, false) == false { - vErr.Inner = errors.New("Token is expired") - vErr.Errors |= ValidationErrorExpired - } - - if m.VerifyIssuedAt(now, false) == false { - vErr.Inner = errors.New("Token used before issued") - vErr.Errors |= ValidationErrorIssuedAt - } - - if m.VerifyNotBefore(now, false) == false { - vErr.Inner = errors.New("Token is not valid yet") - vErr.Errors |= ValidationErrorNotValidYet - } - - if vErr.valid() { - return nil - } - - return vErr -} diff --git a/vendor/github.com/dgrijalva/jwt-go/none.go b/vendor/github.com/dgrijalva/jwt-go/none.go deleted file mode 100644 index f04d189d0..000000000 --- a/vendor/github.com/dgrijalva/jwt-go/none.go +++ /dev/null @@ -1,52 +0,0 @@ -package jwt - -// Implements the none signing method. This is required by the spec -// but you probably should never use it. -var SigningMethodNone *signingMethodNone - -const UnsafeAllowNoneSignatureType unsafeNoneMagicConstant = "none signing method allowed" - -var NoneSignatureTypeDisallowedError error - -type signingMethodNone struct{} -type unsafeNoneMagicConstant string - -func init() { - SigningMethodNone = &signingMethodNone{} - NoneSignatureTypeDisallowedError = NewValidationError("'none' signature type is not allowed", ValidationErrorSignatureInvalid) - - RegisterSigningMethod(SigningMethodNone.Alg(), func() SigningMethod { - return SigningMethodNone - }) -} - -func (m *signingMethodNone) Alg() string { - return "none" -} - -// Only allow 'none' alg type if UnsafeAllowNoneSignatureType is specified as the key -func (m *signingMethodNone) Verify(signingString, signature string, key interface{}) (err error) { - // Key must be UnsafeAllowNoneSignatureType to prevent accidentally - // accepting 'none' signing method - if _, ok := key.(unsafeNoneMagicConstant); !ok { - return NoneSignatureTypeDisallowedError - } - // If signing method is none, signature must be an empty string - if signature != "" { - return NewValidationError( - "'none' signing method with non-empty signature", - ValidationErrorSignatureInvalid, - ) - } - - // Accept 'none' signing method. - return nil -} - -// Only allow 'none' signing if UnsafeAllowNoneSignatureType is specified as the key -func (m *signingMethodNone) Sign(signingString string, key interface{}) (string, error) { - if _, ok := key.(unsafeNoneMagicConstant); ok { - return "", nil - } - return "", NoneSignatureTypeDisallowedError -} diff --git a/vendor/github.com/dgrijalva/jwt-go/parser.go b/vendor/github.com/dgrijalva/jwt-go/parser.go deleted file mode 100644 index d6901d9ad..000000000 --- a/vendor/github.com/dgrijalva/jwt-go/parser.go +++ /dev/null @@ -1,148 +0,0 @@ -package jwt - -import ( - "bytes" - "encoding/json" - "fmt" - "strings" -) - -type Parser struct { - ValidMethods []string // If populated, only these methods will be considered valid - UseJSONNumber bool // Use JSON Number format in JSON decoder - SkipClaimsValidation bool // Skip claims validation during token parsing -} - -// Parse, validate, and return a token. -// keyFunc will receive the parsed token and should return the key for validating. -// If everything is kosher, err will be nil -func (p *Parser) Parse(tokenString string, keyFunc Keyfunc) (*Token, error) { - return p.ParseWithClaims(tokenString, MapClaims{}, keyFunc) -} - -func (p *Parser) ParseWithClaims(tokenString string, claims Claims, keyFunc Keyfunc) (*Token, error) { - token, parts, err := p.ParseUnverified(tokenString, claims) - if err != nil { - return token, err - } - - // Verify signing method is in the required set - if p.ValidMethods != nil { - var signingMethodValid = false - var alg = token.Method.Alg() - for _, m := range p.ValidMethods { - if m == alg { - signingMethodValid = true - break - } - } - if !signingMethodValid { - // signing method is not in the listed set - return token, NewValidationError(fmt.Sprintf("signing method %v is invalid", alg), ValidationErrorSignatureInvalid) - } - } - - // Lookup key - var key interface{} - if keyFunc == nil { - // keyFunc was not provided. short circuiting validation - return token, NewValidationError("no Keyfunc was provided.", ValidationErrorUnverifiable) - } - if key, err = keyFunc(token); err != nil { - // keyFunc returned an error - if ve, ok := err.(*ValidationError); ok { - return token, ve - } - return token, &ValidationError{Inner: err, Errors: ValidationErrorUnverifiable} - } - - vErr := &ValidationError{} - - // Validate Claims - if !p.SkipClaimsValidation { - if err := token.Claims.Valid(); err != nil { - - // If the Claims Valid returned an error, check if it is a validation error, - // If it was another error type, create a ValidationError with a generic ClaimsInvalid flag set - if e, ok := err.(*ValidationError); !ok { - vErr = &ValidationError{Inner: err, Errors: ValidationErrorClaimsInvalid} - } else { - vErr = e - } - } - } - - // Perform validation - token.Signature = parts[2] - if err = token.Method.Verify(strings.Join(parts[0:2], "."), token.Signature, key); err != nil { - vErr.Inner = err - vErr.Errors |= ValidationErrorSignatureInvalid - } - - if vErr.valid() { - token.Valid = true - return token, nil - } - - return token, vErr -} - -// WARNING: Don't use this method unless you know what you're doing -// -// This method parses the token but doesn't validate the signature. It's only -// ever useful in cases where you know the signature is valid (because it has -// been checked previously in the stack) and you want to extract values from -// it. -func (p *Parser) ParseUnverified(tokenString string, claims Claims) (token *Token, parts []string, err error) { - parts = strings.Split(tokenString, ".") - if len(parts) != 3 { - return nil, parts, NewValidationError("token contains an invalid number of segments", ValidationErrorMalformed) - } - - token = &Token{Raw: tokenString} - - // parse Header - var headerBytes []byte - if headerBytes, err = DecodeSegment(parts[0]); err != nil { - if strings.HasPrefix(strings.ToLower(tokenString), "bearer ") { - return token, parts, NewValidationError("tokenstring should not contain 'bearer '", ValidationErrorMalformed) - } - return token, parts, &ValidationError{Inner: err, Errors: ValidationErrorMalformed} - } - if err = json.Unmarshal(headerBytes, &token.Header); err != nil { - return token, parts, &ValidationError{Inner: err, Errors: ValidationErrorMalformed} - } - - // parse Claims - var claimBytes []byte - token.Claims = claims - - if claimBytes, err = DecodeSegment(parts[1]); err != nil { - return token, parts, &ValidationError{Inner: err, Errors: ValidationErrorMalformed} - } - dec := json.NewDecoder(bytes.NewBuffer(claimBytes)) - if p.UseJSONNumber { - dec.UseNumber() - } - // JSON Decode. Special case for map type to avoid weird pointer behavior - if c, ok := token.Claims.(MapClaims); ok { - err = dec.Decode(&c) - } else { - err = dec.Decode(&claims) - } - // Handle decode error - if err != nil { - return token, parts, &ValidationError{Inner: err, Errors: ValidationErrorMalformed} - } - - // Lookup signature method - if method, ok := token.Header["alg"].(string); ok { - if token.Method = GetSigningMethod(method); token.Method == nil { - return token, parts, NewValidationError("signing method (alg) is unavailable.", ValidationErrorUnverifiable) - } - } else { - return token, parts, NewValidationError("signing method (alg) is unspecified.", ValidationErrorUnverifiable) - } - - return token, parts, nil -} diff --git a/vendor/github.com/dgrijalva/jwt-go/rsa.go b/vendor/github.com/dgrijalva/jwt-go/rsa.go deleted file mode 100644 index e4caf1ca4..000000000 --- a/vendor/github.com/dgrijalva/jwt-go/rsa.go +++ /dev/null @@ -1,101 +0,0 @@ -package jwt - -import ( - "crypto" - "crypto/rand" - "crypto/rsa" -) - -// Implements the RSA family of signing methods signing methods -// Expects *rsa.PrivateKey for signing and *rsa.PublicKey for validation -type SigningMethodRSA struct { - Name string - Hash crypto.Hash -} - -// Specific instances for RS256 and company -var ( - SigningMethodRS256 *SigningMethodRSA - SigningMethodRS384 *SigningMethodRSA - SigningMethodRS512 *SigningMethodRSA -) - -func init() { - // RS256 - SigningMethodRS256 = &SigningMethodRSA{"RS256", crypto.SHA256} - RegisterSigningMethod(SigningMethodRS256.Alg(), func() SigningMethod { - return SigningMethodRS256 - }) - - // RS384 - SigningMethodRS384 = &SigningMethodRSA{"RS384", crypto.SHA384} - RegisterSigningMethod(SigningMethodRS384.Alg(), func() SigningMethod { - return SigningMethodRS384 - }) - - // RS512 - SigningMethodRS512 = &SigningMethodRSA{"RS512", crypto.SHA512} - RegisterSigningMethod(SigningMethodRS512.Alg(), func() SigningMethod { - return SigningMethodRS512 - }) -} - -func (m *SigningMethodRSA) Alg() string { - return m.Name -} - -// Implements the Verify method from SigningMethod -// For this signing method, must be an *rsa.PublicKey structure. -func (m *SigningMethodRSA) Verify(signingString, signature string, key interface{}) error { - var err error - - // Decode the signature - var sig []byte - if sig, err = DecodeSegment(signature); err != nil { - return err - } - - var rsaKey *rsa.PublicKey - var ok bool - - if rsaKey, ok = key.(*rsa.PublicKey); !ok { - return ErrInvalidKeyType - } - - // Create hasher - if !m.Hash.Available() { - return ErrHashUnavailable - } - hasher := m.Hash.New() - hasher.Write([]byte(signingString)) - - // Verify the signature - return rsa.VerifyPKCS1v15(rsaKey, m.Hash, hasher.Sum(nil), sig) -} - -// Implements the Sign method from SigningMethod -// For this signing method, must be an *rsa.PrivateKey structure. -func (m *SigningMethodRSA) Sign(signingString string, key interface{}) (string, error) { - var rsaKey *rsa.PrivateKey - var ok bool - - // Validate type of key - if rsaKey, ok = key.(*rsa.PrivateKey); !ok { - return "", ErrInvalidKey - } - - // Create the hasher - if !m.Hash.Available() { - return "", ErrHashUnavailable - } - - hasher := m.Hash.New() - hasher.Write([]byte(signingString)) - - // Sign the string and return the encoded bytes - if sigBytes, err := rsa.SignPKCS1v15(rand.Reader, rsaKey, m.Hash, hasher.Sum(nil)); err == nil { - return EncodeSegment(sigBytes), nil - } else { - return "", err - } -} diff --git a/vendor/github.com/dgrijalva/jwt-go/rsa_pss.go b/vendor/github.com/dgrijalva/jwt-go/rsa_pss.go deleted file mode 100644 index 10ee9db8a..000000000 --- a/vendor/github.com/dgrijalva/jwt-go/rsa_pss.go +++ /dev/null @@ -1,126 +0,0 @@ -// +build go1.4 - -package jwt - -import ( - "crypto" - "crypto/rand" - "crypto/rsa" -) - -// Implements the RSAPSS family of signing methods signing methods -type SigningMethodRSAPSS struct { - *SigningMethodRSA - Options *rsa.PSSOptions -} - -// Specific instances for RS/PS and company -var ( - SigningMethodPS256 *SigningMethodRSAPSS - SigningMethodPS384 *SigningMethodRSAPSS - SigningMethodPS512 *SigningMethodRSAPSS -) - -func init() { - // PS256 - SigningMethodPS256 = &SigningMethodRSAPSS{ - &SigningMethodRSA{ - Name: "PS256", - Hash: crypto.SHA256, - }, - &rsa.PSSOptions{ - SaltLength: rsa.PSSSaltLengthAuto, - Hash: crypto.SHA256, - }, - } - RegisterSigningMethod(SigningMethodPS256.Alg(), func() SigningMethod { - return SigningMethodPS256 - }) - - // PS384 - SigningMethodPS384 = &SigningMethodRSAPSS{ - &SigningMethodRSA{ - Name: "PS384", - Hash: crypto.SHA384, - }, - &rsa.PSSOptions{ - SaltLength: rsa.PSSSaltLengthAuto, - Hash: crypto.SHA384, - }, - } - RegisterSigningMethod(SigningMethodPS384.Alg(), func() SigningMethod { - return SigningMethodPS384 - }) - - // PS512 - SigningMethodPS512 = &SigningMethodRSAPSS{ - &SigningMethodRSA{ - Name: "PS512", - Hash: crypto.SHA512, - }, - &rsa.PSSOptions{ - SaltLength: rsa.PSSSaltLengthAuto, - Hash: crypto.SHA512, - }, - } - RegisterSigningMethod(SigningMethodPS512.Alg(), func() SigningMethod { - return SigningMethodPS512 - }) -} - -// Implements the Verify method from SigningMethod -// For this verify method, key must be an rsa.PublicKey struct -func (m *SigningMethodRSAPSS) Verify(signingString, signature string, key interface{}) error { - var err error - - // Decode the signature - var sig []byte - if sig, err = DecodeSegment(signature); err != nil { - return err - } - - var rsaKey *rsa.PublicKey - switch k := key.(type) { - case *rsa.PublicKey: - rsaKey = k - default: - return ErrInvalidKey - } - - // Create hasher - if !m.Hash.Available() { - return ErrHashUnavailable - } - hasher := m.Hash.New() - hasher.Write([]byte(signingString)) - - return rsa.VerifyPSS(rsaKey, m.Hash, hasher.Sum(nil), sig, m.Options) -} - -// Implements the Sign method from SigningMethod -// For this signing method, key must be an rsa.PrivateKey struct -func (m *SigningMethodRSAPSS) Sign(signingString string, key interface{}) (string, error) { - var rsaKey *rsa.PrivateKey - - switch k := key.(type) { - case *rsa.PrivateKey: - rsaKey = k - default: - return "", ErrInvalidKeyType - } - - // Create the hasher - if !m.Hash.Available() { - return "", ErrHashUnavailable - } - - hasher := m.Hash.New() - hasher.Write([]byte(signingString)) - - // Sign the string and return the encoded bytes - if sigBytes, err := rsa.SignPSS(rand.Reader, rsaKey, m.Hash, hasher.Sum(nil), m.Options); err == nil { - return EncodeSegment(sigBytes), nil - } else { - return "", err - } -} diff --git a/vendor/github.com/dgrijalva/jwt-go/rsa_utils.go b/vendor/github.com/dgrijalva/jwt-go/rsa_utils.go deleted file mode 100644 index a5ababf95..000000000 --- a/vendor/github.com/dgrijalva/jwt-go/rsa_utils.go +++ /dev/null @@ -1,101 +0,0 @@ -package jwt - -import ( - "crypto/rsa" - "crypto/x509" - "encoding/pem" - "errors" -) - -var ( - ErrKeyMustBePEMEncoded = errors.New("Invalid Key: Key must be PEM encoded PKCS1 or PKCS8 private key") - ErrNotRSAPrivateKey = errors.New("Key is not a valid RSA private key") - ErrNotRSAPublicKey = errors.New("Key is not a valid RSA public key") -) - -// Parse PEM encoded PKCS1 or PKCS8 private key -func ParseRSAPrivateKeyFromPEM(key []byte) (*rsa.PrivateKey, error) { - var err error - - // Parse PEM block - var block *pem.Block - if block, _ = pem.Decode(key); block == nil { - return nil, ErrKeyMustBePEMEncoded - } - - var parsedKey interface{} - if parsedKey, err = x509.ParsePKCS1PrivateKey(block.Bytes); err != nil { - if parsedKey, err = x509.ParsePKCS8PrivateKey(block.Bytes); err != nil { - return nil, err - } - } - - var pkey *rsa.PrivateKey - var ok bool - if pkey, ok = parsedKey.(*rsa.PrivateKey); !ok { - return nil, ErrNotRSAPrivateKey - } - - return pkey, nil -} - -// Parse PEM encoded PKCS1 or PKCS8 private key protected with password -func ParseRSAPrivateKeyFromPEMWithPassword(key []byte, password string) (*rsa.PrivateKey, error) { - var err error - - // Parse PEM block - var block *pem.Block - if block, _ = pem.Decode(key); block == nil { - return nil, ErrKeyMustBePEMEncoded - } - - var parsedKey interface{} - - var blockDecrypted []byte - if blockDecrypted, err = x509.DecryptPEMBlock(block, []byte(password)); err != nil { - return nil, err - } - - if parsedKey, err = x509.ParsePKCS1PrivateKey(blockDecrypted); err != nil { - if parsedKey, err = x509.ParsePKCS8PrivateKey(blockDecrypted); err != nil { - return nil, err - } - } - - var pkey *rsa.PrivateKey - var ok bool - if pkey, ok = parsedKey.(*rsa.PrivateKey); !ok { - return nil, ErrNotRSAPrivateKey - } - - return pkey, nil -} - -// Parse PEM encoded PKCS1 or PKCS8 public key -func ParseRSAPublicKeyFromPEM(key []byte) (*rsa.PublicKey, error) { - var err error - - // Parse PEM block - var block *pem.Block - if block, _ = pem.Decode(key); block == nil { - return nil, ErrKeyMustBePEMEncoded - } - - // Parse the key - var parsedKey interface{} - if parsedKey, err = x509.ParsePKIXPublicKey(block.Bytes); err != nil { - if cert, err := x509.ParseCertificate(block.Bytes); err == nil { - parsedKey = cert.PublicKey - } else { - return nil, err - } - } - - var pkey *rsa.PublicKey - var ok bool - if pkey, ok = parsedKey.(*rsa.PublicKey); !ok { - return nil, ErrNotRSAPublicKey - } - - return pkey, nil -} diff --git a/vendor/github.com/dgrijalva/jwt-go/signing_method.go b/vendor/github.com/dgrijalva/jwt-go/signing_method.go deleted file mode 100644 index ed1f212b2..000000000 --- a/vendor/github.com/dgrijalva/jwt-go/signing_method.go +++ /dev/null @@ -1,35 +0,0 @@ -package jwt - -import ( - "sync" -) - -var signingMethods = map[string]func() SigningMethod{} -var signingMethodLock = new(sync.RWMutex) - -// Implement SigningMethod to add new methods for signing or verifying tokens. -type SigningMethod interface { - Verify(signingString, signature string, key interface{}) error // Returns nil if signature is valid - Sign(signingString string, key interface{}) (string, error) // Returns encoded signature or error - Alg() string // returns the alg identifier for this method (example: 'HS256') -} - -// Register the "alg" name and a factory function for signing method. -// This is typically done during init() in the method's implementation -func RegisterSigningMethod(alg string, f func() SigningMethod) { - signingMethodLock.Lock() - defer signingMethodLock.Unlock() - - signingMethods[alg] = f -} - -// Get a signing method from an "alg" string -func GetSigningMethod(alg string) (method SigningMethod) { - signingMethodLock.RLock() - defer signingMethodLock.RUnlock() - - if methodF, ok := signingMethods[alg]; ok { - method = methodF() - } - return -} diff --git a/vendor/github.com/dgrijalva/jwt-go/token.go b/vendor/github.com/dgrijalva/jwt-go/token.go deleted file mode 100644 index d637e0867..000000000 --- a/vendor/github.com/dgrijalva/jwt-go/token.go +++ /dev/null @@ -1,108 +0,0 @@ -package jwt - -import ( - "encoding/base64" - "encoding/json" - "strings" - "time" -) - -// TimeFunc provides the current time when parsing token to validate "exp" claim (expiration time). -// You can override it to use another time value. This is useful for testing or if your -// server uses a different time zone than your tokens. -var TimeFunc = time.Now - -// Parse methods use this callback function to supply -// the key for verification. The function receives the parsed, -// but unverified Token. This allows you to use properties in the -// Header of the token (such as `kid`) to identify which key to use. -type Keyfunc func(*Token) (interface{}, error) - -// A JWT Token. Different fields will be used depending on whether you're -// creating or parsing/verifying a token. -type Token struct { - Raw string // The raw token. Populated when you Parse a token - Method SigningMethod // The signing method used or to be used - Header map[string]interface{} // The first segment of the token - Claims Claims // The second segment of the token - Signature string // The third segment of the token. Populated when you Parse a token - Valid bool // Is the token valid? Populated when you Parse/Verify a token -} - -// Create a new Token. Takes a signing method -func New(method SigningMethod) *Token { - return NewWithClaims(method, MapClaims{}) -} - -func NewWithClaims(method SigningMethod, claims Claims) *Token { - return &Token{ - Header: map[string]interface{}{ - "typ": "JWT", - "alg": method.Alg(), - }, - Claims: claims, - Method: method, - } -} - -// Get the complete, signed token -func (t *Token) SignedString(key interface{}) (string, error) { - var sig, sstr string - var err error - if sstr, err = t.SigningString(); err != nil { - return "", err - } - if sig, err = t.Method.Sign(sstr, key); err != nil { - return "", err - } - return strings.Join([]string{sstr, sig}, "."), nil -} - -// Generate the signing string. This is the -// most expensive part of the whole deal. Unless you -// need this for something special, just go straight for -// the SignedString. -func (t *Token) SigningString() (string, error) { - var err error - parts := make([]string, 2) - for i, _ := range parts { - var jsonValue []byte - if i == 0 { - if jsonValue, err = json.Marshal(t.Header); err != nil { - return "", err - } - } else { - if jsonValue, err = json.Marshal(t.Claims); err != nil { - return "", err - } - } - - parts[i] = EncodeSegment(jsonValue) - } - return strings.Join(parts, "."), nil -} - -// Parse, validate, and return a token. -// keyFunc will receive the parsed token and should return the key for validating. -// If everything is kosher, err will be nil -func Parse(tokenString string, keyFunc Keyfunc) (*Token, error) { - return new(Parser).Parse(tokenString, keyFunc) -} - -func ParseWithClaims(tokenString string, claims Claims, keyFunc Keyfunc) (*Token, error) { - return new(Parser).ParseWithClaims(tokenString, claims, keyFunc) -} - -// Encode JWT specific base64url encoding with padding stripped -func EncodeSegment(seg []byte) string { - return strings.TrimRight(base64.URLEncoding.EncodeToString(seg), "=") -} - -// Decode JWT specific base64url encoding with padding stripped -func DecodeSegment(seg string) ([]byte, error) { - if l := len(seg) % 4; l > 0 { - seg += strings.Repeat("=", 4-l) - } - - return base64.URLEncoding.DecodeString(seg) -} diff --git a/vendor/github.com/donnie4w/go-logger/readme.txt b/vendor/github.com/donnie4w/go-logger/readme.txt deleted file mode 100644 index fec42e0ba..000000000 --- a/vendor/github.com/donnie4w/go-logger/readme.txt +++ /dev/null @@ -1,50 +0,0 @@ -go-logger golang ־ ڶgolanglogķװ -÷java־߰log4j - -ӡ־5 DebugInfoWarn, Error ,Fatal ־ɵ͵ - -־ķΪlogger.SetLevel() 磺logger.SetLevel(logger.WARN) -logger.Debug(....),logger.Info(...) ־ - logger.Warn(...),logger.Error(...),logger.Fatal(...)־ -־IJ7ֱΪALLDEBUGINFOWARNERRORFATALOFF - ALLʾеôӡ־ķOFFʾ - - -־ļиͣ1Ϊз֡2Ϊ־Сз֡ -зʱÿһ־ļ׺Ϊ .yyyy-MM-dd -0ǰһ챸ļ - -СзҪ31ΪļС2Ϊλ3Ϊļ -ļֵָʱɱļβΪεȻ -ļָʱɵ־ļǰɵͬı־ļ - -ʾ - - //ָǷ̨ӡĬΪtrue - logger.SetConsole(true) - //ָ־ļݷʽΪļСķʽ - //һΪ־ļĿ¼ - //ڶΪ־ļ - //Ϊļ - //ĸΪļС - //ΪļСĵλ KBMBGB TB - //logger.SetRollingFile("d:/logtest", "test.log", 10, 5, logger.KB) - - //ָ־ļݷʽΪڵķʽ - //һΪ־ļĿ¼ - //ڶΪ־ļ - logger.SetRollingDaily("d:/logtest", "test.log") - - //ָ־ ALLDEBUGINFOWARNERRORFATALOFF ɵ͵ - //һϰDzԽ׶ΪdebugɻΪinfo - logger.SetLevel(logger.DEBUG) - - -ӡ־ -func log(i int) { - logger.Debug("Debug>>>>>>>>>>>>>>>>>>>>>>" + strconv.Itoa(i)) - logger.Info("Info>>>>>>>>>>>>>>>>>>>>>>>>>" + strconv.Itoa(i)) - logger.Warn("Warn>>>>>>>>>>>>>>>>>>>>>>>>>" + strconv.Itoa(i)) - logger.Error("Error>>>>>>>>>>>>>>>>>>>>>>>>>" + strconv.Itoa(i)) - logger.Fatal("Fatal>>>>>>>>>>>>>>>>>>>>>>>>>" + strconv.Itoa(i)) -} \ No newline at end of file diff --git a/vendor/github.com/go-gomail/gomail/CHANGELOG.md b/vendor/github.com/go-gomail/gomail/CHANGELOG.md deleted file mode 100644 index a797ab4c0..000000000 --- a/vendor/github.com/go-gomail/gomail/CHANGELOG.md +++ /dev/null @@ -1,20 +0,0 @@ -# Change Log -All notable changes to this project will be documented in this file. -This project adheres to [Semantic Versioning](http://semver.org/). - -## [2.0.0] - 2015-09-02 - -- Mailer has been removed. It has been replaced by Dialer and Sender. -- `File` type and the `CreateFile` and `OpenFile` functions have been removed. -- `Message.Attach` and `Message.Embed` have a new signature. -- `Message.GetBodyWriter` has been removed. Use `Message.AddAlternativeWriter` -instead. -- `Message.Export` has been removed. `Message.WriteTo` can be used instead. -- `Message.DelHeader` has been removed. -- The `Bcc` header field is no longer sent. It is far more simpler and -efficient: the same message is sent to all recipients instead of sending a -different email to each Bcc address. -- LoginAuth has been removed. `NewPlainDialer` now implements the LOGIN -authentication mechanism when needed. -- Go 1.2 is now required instead of Go 1.3. No external dependency are used when -using Go 1.5. diff --git a/vendor/github.com/go-gomail/gomail/CONTRIBUTING.md b/vendor/github.com/go-gomail/gomail/CONTRIBUTING.md deleted file mode 100644 index d5601c257..000000000 --- a/vendor/github.com/go-gomail/gomail/CONTRIBUTING.md +++ /dev/null @@ -1,20 +0,0 @@ -Thank you for contributing to Gomail! Here are a few guidelines: - -## Bugs - -If you think you found a bug, create an issue and supply the minimum amount -of code triggering the bug so it can be reproduced. - - -## Fixing a bug - -If you want to fix a bug, you can send a pull request. It should contains a -new test or update an existing one to cover that bug. - - -## New feature proposal - -If you think Gomail lacks a feature, you can open an issue or send a pull -request. I want to keep Gomail code and API as simple as possible so please -describe your needs so we can discuss whether this feature should be added to -Gomail or not. diff --git a/vendor/github.com/go-gomail/gomail/LICENSE b/vendor/github.com/go-gomail/gomail/LICENSE deleted file mode 100644 index 5f5c12af7..000000000 --- a/vendor/github.com/go-gomail/gomail/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Alexandre Cesaro - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/go-gomail/gomail/README.md b/vendor/github.com/go-gomail/gomail/README.md deleted file mode 100644 index b3be9e146..000000000 --- a/vendor/github.com/go-gomail/gomail/README.md +++ /dev/null @@ -1,92 +0,0 @@ -# Gomail -[![Build Status](https://travis-ci.org/go-gomail/gomail.svg?branch=v2)](https://travis-ci.org/go-gomail/gomail) [![Code Coverage](http://gocover.io/_badge/gopkg.in/gomail.v2)](http://gocover.io/gopkg.in/gomail.v2) [![Documentation](https://godoc.org/gopkg.in/gomail.v2?status.svg)](https://godoc.org/gopkg.in/gomail.v2) - -## Introduction - -Gomail is a simple and efficient package to send emails. It is well tested and -documented. - -Gomail can only send emails using an SMTP server. But the API is flexible and it -is easy to implement other methods for sending emails using a local Postfix, an -API, etc. - -It is versioned using [gopkg.in](https://gopkg.in) so I promise -there will never be backward incompatible changes within each version. - -It requires Go 1.2 or newer. With Go 1.5, no external dependencies are used. - - -## Features - -Gomail supports: -- Attachments -- Embedded images -- HTML and text templates -- Automatic encoding of special characters -- SSL and TLS -- Sending multiple emails with the same SMTP connection - - -## Documentation - -https://godoc.org/gopkg.in/gomail.v2 - - -## Download - - go get gopkg.in/gomail.v2 - - -## Examples - -See the [examples in the documentation](https://godoc.org/gopkg.in/gomail.v2#example-package). - - -## FAQ - -### x509: certificate signed by unknown authority - -If you get this error it means the certificate used by the SMTP server is not -considered valid by the client running Gomail. As a quick workaround you can -bypass the verification of the server's certificate chain and host name by using -`SetTLSConfig`: - - package main - - import ( - "crypto/tls" - - "gopkg.in/gomail.v2" - ) - - func main() { - d := gomail.NewDialer("smtp.example.com", 587, "user", "123456") - d.TLSConfig = &tls.Config{InsecureSkipVerify: true} - - // Send emails using d. - } - -Note, however, that this is insecure and should not be used in production. - - -## Contribute - -Contributions are more than welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for -more info. - - -## Change log - -See [CHANGELOG.md](CHANGELOG.md). - - -## License - -[MIT](LICENSE) - - -## Contact - -You can ask questions on the [Gomail -thread](https://groups.google.com/d/topic/golang-nuts/jMxZHzvvEVg/discussion) -in the Go mailing-list. diff --git a/vendor/github.com/go-gomail/gomail/auth.go b/vendor/github.com/go-gomail/gomail/auth.go deleted file mode 100644 index d28b83ab7..000000000 --- a/vendor/github.com/go-gomail/gomail/auth.go +++ /dev/null @@ -1,49 +0,0 @@ -package gomail - -import ( - "bytes" - "errors" - "fmt" - "net/smtp" -) - -// loginAuth is an smtp.Auth that implements the LOGIN authentication mechanism. -type loginAuth struct { - username string - password string - host string -} - -func (a *loginAuth) Start(server *smtp.ServerInfo) (string, []byte, error) { - if !server.TLS { - advertised := false - for _, mechanism := range server.Auth { - if mechanism == "LOGIN" { - advertised = true - break - } - } - if !advertised { - return "", nil, errors.New("gomail: unencrypted connection") - } - } - if server.Name != a.host { - return "", nil, errors.New("gomail: wrong host name") - } - return "LOGIN", nil, nil -} - -func (a *loginAuth) Next(fromServer []byte, more bool) ([]byte, error) { - if !more { - return nil, nil - } - - switch { - case bytes.Equal(fromServer, []byte("Username:")): - return []byte(a.username), nil - case bytes.Equal(fromServer, []byte("Password:")): - return []byte(a.password), nil - default: - return nil, fmt.Errorf("gomail: unexpected server challenge: %s", fromServer) - } -} diff --git a/vendor/github.com/go-gomail/gomail/doc.go b/vendor/github.com/go-gomail/gomail/doc.go deleted file mode 100644 index a8f5091f5..000000000 --- a/vendor/github.com/go-gomail/gomail/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -// Package gomail provides a simple interface to compose emails and to mail them -// efficiently. -// -// More info on Github: https://github.com/go-gomail/gomail -package gomail diff --git a/vendor/github.com/go-gomail/gomail/message.go b/vendor/github.com/go-gomail/gomail/message.go deleted file mode 100644 index 4bffb1e7f..000000000 --- a/vendor/github.com/go-gomail/gomail/message.go +++ /dev/null @@ -1,322 +0,0 @@ -package gomail - -import ( - "bytes" - "io" - "os" - "path/filepath" - "time" -) - -// Message represents an email. -type Message struct { - header header - parts []*part - attachments []*file - embedded []*file - charset string - encoding Encoding - hEncoder mimeEncoder - buf bytes.Buffer -} - -type header map[string][]string - -type part struct { - contentType string - copier func(io.Writer) error - encoding Encoding -} - -// NewMessage creates a new message. It uses UTF-8 and quoted-printable encoding -// by default. -func NewMessage(settings ...MessageSetting) *Message { - m := &Message{ - header: make(header), - charset: "UTF-8", - encoding: QuotedPrintable, - } - - m.applySettings(settings) - - if m.encoding == Base64 { - m.hEncoder = bEncoding - } else { - m.hEncoder = qEncoding - } - - return m -} - -// Reset resets the message so it can be reused. The message keeps its previous -// settings so it is in the same state that after a call to NewMessage. -func (m *Message) Reset() { - for k := range m.header { - delete(m.header, k) - } - m.parts = nil - m.attachments = nil - m.embedded = nil -} - -func (m *Message) applySettings(settings []MessageSetting) { - for _, s := range settings { - s(m) - } -} - -// A MessageSetting can be used as an argument in NewMessage to configure an -// email. -type MessageSetting func(m *Message) - -// SetCharset is a message setting to set the charset of the email. -func SetCharset(charset string) MessageSetting { - return func(m *Message) { - m.charset = charset - } -} - -// SetEncoding is a message setting to set the encoding of the email. -func SetEncoding(enc Encoding) MessageSetting { - return func(m *Message) { - m.encoding = enc - } -} - -// Encoding represents a MIME encoding scheme like quoted-printable or base64. -type Encoding string - -const ( - // QuotedPrintable represents the quoted-printable encoding as defined in - // RFC 2045. - QuotedPrintable Encoding = "quoted-printable" - // Base64 represents the base64 encoding as defined in RFC 2045. - Base64 Encoding = "base64" - // Unencoded can be used to avoid encoding the body of an email. The headers - // will still be encoded using quoted-printable encoding. - Unencoded Encoding = "8bit" -) - -// SetHeader sets a value to the given header field. -func (m *Message) SetHeader(field string, value ...string) { - m.encodeHeader(value) - m.header[field] = value -} - -func (m *Message) encodeHeader(values []string) { - for i := range values { - values[i] = m.encodeString(values[i]) - } -} - -func (m *Message) encodeString(value string) string { - return m.hEncoder.Encode(m.charset, value) -} - -// SetHeaders sets the message headers. -func (m *Message) SetHeaders(h map[string][]string) { - for k, v := range h { - m.SetHeader(k, v...) - } -} - -// SetAddressHeader sets an address to the given header field. -func (m *Message) SetAddressHeader(field, address, name string) { - m.header[field] = []string{m.FormatAddress(address, name)} -} - -// FormatAddress formats an address and a name as a valid RFC 5322 address. -func (m *Message) FormatAddress(address, name string) string { - if name == "" { - return address - } - - enc := m.encodeString(name) - if enc == name { - m.buf.WriteByte('"') - for i := 0; i < len(name); i++ { - b := name[i] - if b == '\\' || b == '"' { - m.buf.WriteByte('\\') - } - m.buf.WriteByte(b) - } - m.buf.WriteByte('"') - } else if hasSpecials(name) { - m.buf.WriteString(bEncoding.Encode(m.charset, name)) - } else { - m.buf.WriteString(enc) - } - m.buf.WriteString(" <") - m.buf.WriteString(address) - m.buf.WriteByte('>') - - addr := m.buf.String() - m.buf.Reset() - return addr -} - -func hasSpecials(text string) bool { - for i := 0; i < len(text); i++ { - switch c := text[i]; c { - case '(', ')', '<', '>', '[', ']', ':', ';', '@', '\\', ',', '.', '"': - return true - } - } - - return false -} - -// SetDateHeader sets a date to the given header field. -func (m *Message) SetDateHeader(field string, date time.Time) { - m.header[field] = []string{m.FormatDate(date)} -} - -// FormatDate formats a date as a valid RFC 5322 date. -func (m *Message) FormatDate(date time.Time) string { - return date.Format(time.RFC1123Z) -} - -// GetHeader gets a header field. -func (m *Message) GetHeader(field string) []string { - return m.header[field] -} - -// SetBody sets the body of the message. It replaces any content previously set -// by SetBody, AddAlternative or AddAlternativeWriter. -func (m *Message) SetBody(contentType, body string, settings ...PartSetting) { - m.parts = []*part{m.newPart(contentType, newCopier(body), settings)} -} - -// AddAlternative adds an alternative part to the message. -// -// It is commonly used to send HTML emails that default to the plain text -// version for backward compatibility. AddAlternative appends the new part to -// the end of the message. So the plain text part should be added before the -// HTML part. See http://en.wikipedia.org/wiki/MIME#Alternative -func (m *Message) AddAlternative(contentType, body string, settings ...PartSetting) { - m.AddAlternativeWriter(contentType, newCopier(body), settings...) -} - -func newCopier(s string) func(io.Writer) error { - return func(w io.Writer) error { - _, err := io.WriteString(w, s) - return err - } -} - -// AddAlternativeWriter adds an alternative part to the message. It can be -// useful with the text/template or html/template packages. -func (m *Message) AddAlternativeWriter(contentType string, f func(io.Writer) error, settings ...PartSetting) { - m.parts = append(m.parts, m.newPart(contentType, f, settings)) -} - -func (m *Message) newPart(contentType string, f func(io.Writer) error, settings []PartSetting) *part { - p := &part{ - contentType: contentType, - copier: f, - encoding: m.encoding, - } - - for _, s := range settings { - s(p) - } - - return p -} - -// A PartSetting can be used as an argument in Message.SetBody, -// Message.AddAlternative or Message.AddAlternativeWriter to configure the part -// added to a message. -type PartSetting func(*part) - -// SetPartEncoding sets the encoding of the part added to the message. By -// default, parts use the same encoding than the message. -func SetPartEncoding(e Encoding) PartSetting { - return PartSetting(func(p *part) { - p.encoding = e - }) -} - -type file struct { - Name string - Header map[string][]string - CopyFunc func(w io.Writer) error -} - -func (f *file) setHeader(field, value string) { - f.Header[field] = []string{value} -} - -// A FileSetting can be used as an argument in Message.Attach or Message.Embed. -type FileSetting func(*file) - -// SetHeader is a file setting to set the MIME header of the message part that -// contains the file content. -// -// Mandatory headers are automatically added if they are not set when sending -// the email. -func SetHeader(h map[string][]string) FileSetting { - return func(f *file) { - for k, v := range h { - f.Header[k] = v - } - } -} - -// Rename is a file setting to set the name of the attachment if the name is -// different than the filename on disk. -func Rename(name string) FileSetting { - return func(f *file) { - f.Name = name - } -} - -// SetCopyFunc is a file setting to replace the function that runs when the -// message is sent. It should copy the content of the file to the io.Writer. -// -// The default copy function opens the file with the given filename, and copy -// its content to the io.Writer. -func SetCopyFunc(f func(io.Writer) error) FileSetting { - return func(fi *file) { - fi.CopyFunc = f - } -} - -func (m *Message) appendFile(list []*file, name string, settings []FileSetting) []*file { - f := &file{ - Name: filepath.Base(name), - Header: make(map[string][]string), - CopyFunc: func(w io.Writer) error { - h, err := os.Open(name) - if err != nil { - return err - } - if _, err := io.Copy(w, h); err != nil { - h.Close() - return err - } - return h.Close() - }, - } - - for _, s := range settings { - s(f) - } - - if list == nil { - return []*file{f} - } - - return append(list, f) -} - -// Attach attaches the files to the email. -func (m *Message) Attach(filename string, settings ...FileSetting) { - m.attachments = m.appendFile(m.attachments, filename, settings) -} - -// Embed embeds the images to the email. -func (m *Message) Embed(filename string, settings ...FileSetting) { - m.embedded = m.appendFile(m.embedded, filename, settings) -} diff --git a/vendor/github.com/go-gomail/gomail/mime.go b/vendor/github.com/go-gomail/gomail/mime.go deleted file mode 100644 index 194d4a769..000000000 --- a/vendor/github.com/go-gomail/gomail/mime.go +++ /dev/null @@ -1,21 +0,0 @@ -// +build go1.5 - -package gomail - -import ( - "mime" - "mime/quotedprintable" - "strings" -) - -var newQPWriter = quotedprintable.NewWriter - -type mimeEncoder struct { - mime.WordEncoder -} - -var ( - bEncoding = mimeEncoder{mime.BEncoding} - qEncoding = mimeEncoder{mime.QEncoding} - lastIndexByte = strings.LastIndexByte -) diff --git a/vendor/github.com/go-gomail/gomail/mime_go14.go b/vendor/github.com/go-gomail/gomail/mime_go14.go deleted file mode 100644 index 3dc26aa2a..000000000 --- a/vendor/github.com/go-gomail/gomail/mime_go14.go +++ /dev/null @@ -1,25 +0,0 @@ -// +build !go1.5 - -package gomail - -import "gopkg.in/alexcesaro/quotedprintable.v3" - -var newQPWriter = quotedprintable.NewWriter - -type mimeEncoder struct { - quotedprintable.WordEncoder -} - -var ( - bEncoding = mimeEncoder{quotedprintable.BEncoding} - qEncoding = mimeEncoder{quotedprintable.QEncoding} - lastIndexByte = func(s string, c byte) int { - for i := len(s) - 1; i >= 0; i-- { - - if s[i] == c { - return i - } - } - return -1 - } -) diff --git a/vendor/github.com/go-gomail/gomail/send.go b/vendor/github.com/go-gomail/gomail/send.go deleted file mode 100644 index 9115ebe72..000000000 --- a/vendor/github.com/go-gomail/gomail/send.go +++ /dev/null @@ -1,116 +0,0 @@ -package gomail - -import ( - "errors" - "fmt" - "io" - "net/mail" -) - -// Sender is the interface that wraps the Send method. -// -// Send sends an email to the given addresses. -type Sender interface { - Send(from string, to []string, msg io.WriterTo) error -} - -// SendCloser is the interface that groups the Send and Close methods. -type SendCloser interface { - Sender - Close() error -} - -// A SendFunc is a function that sends emails to the given addresses. -// -// The SendFunc type is an adapter to allow the use of ordinary functions as -// email senders. If f is a function with the appropriate signature, SendFunc(f) -// is a Sender object that calls f. -type SendFunc func(from string, to []string, msg io.WriterTo) error - -// Send calls f(from, to, msg). -func (f SendFunc) Send(from string, to []string, msg io.WriterTo) error { - return f(from, to, msg) -} - -// Send sends emails using the given Sender. -func Send(s Sender, msg ...*Message) error { - for i, m := range msg { - if err := send(s, m); err != nil { - return fmt.Errorf("gomail: could not send email %d: %v", i+1, err) - } - } - - return nil -} - -func send(s Sender, m *Message) error { - from, err := m.getFrom() - if err != nil { - return err - } - - to, err := m.getRecipients() - if err != nil { - return err - } - - if err := s.Send(from, to, m); err != nil { - return err - } - - return nil -} - -func (m *Message) getFrom() (string, error) { - from := m.header["Sender"] - if len(from) == 0 { - from = m.header["From"] - if len(from) == 0 { - return "", errors.New(`gomail: invalid message, "From" field is absent`) - } - } - - return parseAddress(from[0]) -} - -func (m *Message) getRecipients() ([]string, error) { - n := 0 - for _, field := range []string{"To", "Cc", "Bcc"} { - if addresses, ok := m.header[field]; ok { - n += len(addresses) - } - } - list := make([]string, 0, n) - - for _, field := range []string{"To", "Cc", "Bcc"} { - if addresses, ok := m.header[field]; ok { - for _, a := range addresses { - addr, err := parseAddress(a) - if err != nil { - return nil, err - } - list = addAddress(list, addr) - } - } - } - - return list, nil -} - -func addAddress(list []string, addr string) []string { - for _, a := range list { - if addr == a { - return list - } - } - - return append(list, addr) -} - -func parseAddress(field string) (string, error) { - addr, err := mail.ParseAddress(field) - if err != nil { - return "", fmt.Errorf("gomail: invalid address %q: %v", field, err) - } - return addr.Address, nil -} diff --git a/vendor/github.com/go-gomail/gomail/smtp.go b/vendor/github.com/go-gomail/gomail/smtp.go deleted file mode 100644 index 2aa49c8b6..000000000 --- a/vendor/github.com/go-gomail/gomail/smtp.go +++ /dev/null @@ -1,202 +0,0 @@ -package gomail - -import ( - "crypto/tls" - "fmt" - "io" - "net" - "net/smtp" - "strings" - "time" -) - -// A Dialer is a dialer to an SMTP server. -type Dialer struct { - // Host represents the host of the SMTP server. - Host string - // Port represents the port of the SMTP server. - Port int - // Username is the username to use to authenticate to the SMTP server. - Username string - // Password is the password to use to authenticate to the SMTP server. - Password string - // Auth represents the authentication mechanism used to authenticate to the - // SMTP server. - Auth smtp.Auth - // SSL defines whether an SSL connection is used. It should be false in - // most cases since the authentication mechanism should use the STARTTLS - // extension instead. - SSL bool - // TSLConfig represents the TLS configuration used for the TLS (when the - // STARTTLS extension is used) or SSL connection. - TLSConfig *tls.Config - // LocalName is the hostname sent to the SMTP server with the HELO command. - // By default, "localhost" is sent. - LocalName string -} - -// NewDialer returns a new SMTP Dialer. The given parameters are used to connect -// to the SMTP server. -func NewDialer(host string, port int, username, password string) *Dialer { - return &Dialer{ - Host: host, - Port: port, - Username: username, - Password: password, - SSL: port == 465, - } -} - -// NewPlainDialer returns a new SMTP Dialer. The given parameters are used to -// connect to the SMTP server. -// -// Deprecated: Use NewDialer instead. -func NewPlainDialer(host string, port int, username, password string) *Dialer { - return NewDialer(host, port, username, password) -} - -// Dial dials and authenticates to an SMTP server. The returned SendCloser -// should be closed when done using it. -func (d *Dialer) Dial() (SendCloser, error) { - conn, err := netDialTimeout("tcp", addr(d.Host, d.Port), 10*time.Second) - if err != nil { - return nil, err - } - - if d.SSL { - conn = tlsClient(conn, d.tlsConfig()) - } - - c, err := smtpNewClient(conn, d.Host) - if err != nil { - return nil, err - } - - if d.LocalName != "" { - if err := c.Hello(d.LocalName); err != nil { - return nil, err - } - } - - if !d.SSL { - if ok, _ := c.Extension("STARTTLS"); ok { - if err := c.StartTLS(d.tlsConfig()); err != nil { - c.Close() - return nil, err - } - } - } - - if d.Auth == nil && d.Username != "" { - if ok, auths := c.Extension("AUTH"); ok { - if strings.Contains(auths, "CRAM-MD5") { - d.Auth = smtp.CRAMMD5Auth(d.Username, d.Password) - } else if strings.Contains(auths, "LOGIN") && - !strings.Contains(auths, "PLAIN") { - d.Auth = &loginAuth{ - username: d.Username, - password: d.Password, - host: d.Host, - } - } else { - d.Auth = smtp.PlainAuth("", d.Username, d.Password, d.Host) - } - } - } - - if d.Auth != nil { - if err = c.Auth(d.Auth); err != nil { - c.Close() - return nil, err - } - } - - return &smtpSender{c, d}, nil -} - -func (d *Dialer) tlsConfig() *tls.Config { - if d.TLSConfig == nil { - return &tls.Config{ServerName: d.Host} - } - return d.TLSConfig -} - -func addr(host string, port int) string { - return fmt.Sprintf("%s:%d", host, port) -} - -// DialAndSend opens a connection to the SMTP server, sends the given emails and -// closes the connection. -func (d *Dialer) DialAndSend(m ...*Message) error { - s, err := d.Dial() - if err != nil { - return err - } - defer s.Close() - - return Send(s, m...) -} - -type smtpSender struct { - smtpClient - d *Dialer -} - -func (c *smtpSender) Send(from string, to []string, msg io.WriterTo) error { - if err := c.Mail(from); err != nil { - if err == io.EOF { - // This is probably due to a timeout, so reconnect and try again. - sc, derr := c.d.Dial() - if derr == nil { - if s, ok := sc.(*smtpSender); ok { - *c = *s - return c.Send(from, to, msg) - } - } - } - return err - } - - for _, addr := range to { - if err := c.Rcpt(addr); err != nil { - return err - } - } - - w, err := c.Data() - if err != nil { - return err - } - - if _, err = msg.WriteTo(w); err != nil { - w.Close() - return err - } - - return w.Close() -} - -func (c *smtpSender) Close() error { - return c.Quit() -} - -// Stubbed out for tests. -var ( - netDialTimeout = net.DialTimeout - tlsClient = tls.Client - smtpNewClient = func(conn net.Conn, host string) (smtpClient, error) { - return smtp.NewClient(conn, host) - } -) - -type smtpClient interface { - Hello(string) error - Extension(string) (bool, string) - StartTLS(*tls.Config) error - Auth(smtp.Auth) error - Mail(string) error - Rcpt(string) error - Data() (io.WriteCloser, error) - Quit() error - Close() error -} diff --git a/vendor/github.com/go-gomail/gomail/writeto.go b/vendor/github.com/go-gomail/gomail/writeto.go deleted file mode 100644 index 9fb6b86e8..000000000 --- a/vendor/github.com/go-gomail/gomail/writeto.go +++ /dev/null @@ -1,306 +0,0 @@ -package gomail - -import ( - "encoding/base64" - "errors" - "io" - "mime" - "mime/multipart" - "path/filepath" - "strings" - "time" -) - -// WriteTo implements io.WriterTo. It dumps the whole message into w. -func (m *Message) WriteTo(w io.Writer) (int64, error) { - mw := &messageWriter{w: w} - mw.writeMessage(m) - return mw.n, mw.err -} - -func (w *messageWriter) writeMessage(m *Message) { - if _, ok := m.header["Mime-Version"]; !ok { - w.writeString("Mime-Version: 1.0\r\n") - } - if _, ok := m.header["Date"]; !ok { - w.writeHeader("Date", m.FormatDate(now())) - } - w.writeHeaders(m.header) - - if m.hasMixedPart() { - w.openMultipart("mixed") - } - - if m.hasRelatedPart() { - w.openMultipart("related") - } - - if m.hasAlternativePart() { - w.openMultipart("alternative") - } - for _, part := range m.parts { - w.writePart(part, m.charset) - } - if m.hasAlternativePart() { - w.closeMultipart() - } - - w.addFiles(m.embedded, false) - if m.hasRelatedPart() { - w.closeMultipart() - } - - w.addFiles(m.attachments, true) - if m.hasMixedPart() { - w.closeMultipart() - } -} - -func (m *Message) hasMixedPart() bool { - return (len(m.parts) > 0 && len(m.attachments) > 0) || len(m.attachments) > 1 -} - -func (m *Message) hasRelatedPart() bool { - return (len(m.parts) > 0 && len(m.embedded) > 0) || len(m.embedded) > 1 -} - -func (m *Message) hasAlternativePart() bool { - return len(m.parts) > 1 -} - -type messageWriter struct { - w io.Writer - n int64 - writers [3]*multipart.Writer - partWriter io.Writer - depth uint8 - err error -} - -func (w *messageWriter) openMultipart(mimeType string) { - mw := multipart.NewWriter(w) - contentType := "multipart/" + mimeType + ";\r\n boundary=" + mw.Boundary() - w.writers[w.depth] = mw - - if w.depth == 0 { - w.writeHeader("Content-Type", contentType) - w.writeString("\r\n") - } else { - w.createPart(map[string][]string{ - "Content-Type": {contentType}, - }) - } - w.depth++ -} - -func (w *messageWriter) createPart(h map[string][]string) { - w.partWriter, w.err = w.writers[w.depth-1].CreatePart(h) -} - -func (w *messageWriter) closeMultipart() { - if w.depth > 0 { - w.writers[w.depth-1].Close() - w.depth-- - } -} - -func (w *messageWriter) writePart(p *part, charset string) { - w.writeHeaders(map[string][]string{ - "Content-Type": {p.contentType + "; charset=" + charset}, - "Content-Transfer-Encoding": {string(p.encoding)}, - }) - w.writeBody(p.copier, p.encoding) -} - -func (w *messageWriter) addFiles(files []*file, isAttachment bool) { - for _, f := range files { - if _, ok := f.Header["Content-Type"]; !ok { - mediaType := mime.TypeByExtension(filepath.Ext(f.Name)) - if mediaType == "" { - mediaType = "application/octet-stream" - } - f.setHeader("Content-Type", mediaType+`; name="`+f.Name+`"`) - } - - if _, ok := f.Header["Content-Transfer-Encoding"]; !ok { - f.setHeader("Content-Transfer-Encoding", string(Base64)) - } - - if _, ok := f.Header["Content-Disposition"]; !ok { - var disp string - if isAttachment { - disp = "attachment" - } else { - disp = "inline" - } - f.setHeader("Content-Disposition", disp+`; filename="`+f.Name+`"`) - } - - if !isAttachment { - if _, ok := f.Header["Content-ID"]; !ok { - f.setHeader("Content-ID", "<"+f.Name+">") - } - } - w.writeHeaders(f.Header) - w.writeBody(f.CopyFunc, Base64) - } -} - -func (w *messageWriter) Write(p []byte) (int, error) { - if w.err != nil { - return 0, errors.New("gomail: cannot write as writer is in error") - } - - var n int - n, w.err = w.w.Write(p) - w.n += int64(n) - return n, w.err -} - -func (w *messageWriter) writeString(s string) { - n, _ := io.WriteString(w.w, s) - w.n += int64(n) -} - -func (w *messageWriter) writeHeader(k string, v ...string) { - w.writeString(k) - if len(v) == 0 { - w.writeString(":\r\n") - return - } - w.writeString(": ") - - // Max header line length is 78 characters in RFC 5322 and 76 characters - // in RFC 2047. So for the sake of simplicity we use the 76 characters - // limit. - charsLeft := 76 - len(k) - len(": ") - - for i, s := range v { - // If the line is already too long, insert a newline right away. - if charsLeft < 1 { - if i == 0 { - w.writeString("\r\n ") - } else { - w.writeString(",\r\n ") - } - charsLeft = 75 - } else if i != 0 { - w.writeString(", ") - charsLeft -= 2 - } - - // While the header content is too long, fold it by inserting a newline. - for len(s) > charsLeft { - s = w.writeLine(s, charsLeft) - charsLeft = 75 - } - w.writeString(s) - if i := lastIndexByte(s, '\n'); i != -1 { - charsLeft = 75 - (len(s) - i - 1) - } else { - charsLeft -= len(s) - } - } - w.writeString("\r\n") -} - -func (w *messageWriter) writeLine(s string, charsLeft int) string { - // If there is already a newline before the limit. Write the line. - if i := strings.IndexByte(s, '\n'); i != -1 && i < charsLeft { - w.writeString(s[:i+1]) - return s[i+1:] - } - - for i := charsLeft - 1; i >= 0; i-- { - if s[i] == ' ' { - w.writeString(s[:i]) - w.writeString("\r\n ") - return s[i+1:] - } - } - - // We could not insert a newline cleanly so look for a space or a newline - // even if it is after the limit. - for i := 75; i < len(s); i++ { - if s[i] == ' ' { - w.writeString(s[:i]) - w.writeString("\r\n ") - return s[i+1:] - } - if s[i] == '\n' { - w.writeString(s[:i+1]) - return s[i+1:] - } - } - - // Too bad, no space or newline in the whole string. Just write everything. - w.writeString(s) - return "" -} - -func (w *messageWriter) writeHeaders(h map[string][]string) { - if w.depth == 0 { - for k, v := range h { - if k != "Bcc" { - w.writeHeader(k, v...) - } - } - } else { - w.createPart(h) - } -} - -func (w *messageWriter) writeBody(f func(io.Writer) error, enc Encoding) { - var subWriter io.Writer - if w.depth == 0 { - w.writeString("\r\n") - subWriter = w.w - } else { - subWriter = w.partWriter - } - - if enc == Base64 { - wc := base64.NewEncoder(base64.StdEncoding, newBase64LineWriter(subWriter)) - w.err = f(wc) - wc.Close() - } else if enc == Unencoded { - w.err = f(subWriter) - } else { - wc := newQPWriter(subWriter) - w.err = f(wc) - wc.Close() - } -} - -// As required by RFC 2045, 6.7. (page 21) for quoted-printable, and -// RFC 2045, 6.8. (page 25) for base64. -const maxLineLen = 76 - -// base64LineWriter limits text encoded in base64 to 76 characters per line -type base64LineWriter struct { - w io.Writer - lineLen int -} - -func newBase64LineWriter(w io.Writer) *base64LineWriter { - return &base64LineWriter{w: w} -} - -func (w *base64LineWriter) Write(p []byte) (int, error) { - n := 0 - for len(p)+w.lineLen > maxLineLen { - w.w.Write(p[:maxLineLen-w.lineLen]) - w.w.Write([]byte("\r\n")) - p = p[maxLineLen-w.lineLen:] - n += maxLineLen - w.lineLen - w.lineLen = 0 - } - - w.w.Write(p) - w.lineLen += len(p) - - return n + len(p), nil -} - -// Stubbed out for testing. -var now = time.Now diff --git a/vendor/github.com/go-macaron/binding/LICENSE b/vendor/github.com/go-macaron/binding/LICENSE deleted file mode 100644 index 8405e89a0..000000000 --- a/vendor/github.com/go-macaron/binding/LICENSE +++ /dev/null @@ -1,191 +0,0 @@ -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and -distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright -owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities -that control, are controlled by, or are under common control with that entity. -For the purposes of this definition, "control" means (i) the power, direct or -indirect, to cause the direction or management of such entity, whether by -contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the -outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising -permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including -but not limited to software source code, documentation source, and configuration -files. - -"Object" form shall mean any form resulting from mechanical transformation or -translation of a Source form, including but not limited to compiled object code, -generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made -available under the License, as indicated by a copyright notice that is included -in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that -is based on (or derived from) the Work and for which the editorial revisions, -annotations, elaborations, or other modifications represent, as a whole, an -original work of authorship. For the purposes of this License, Derivative Works -shall not include works that remain separable from, or merely link (or bind by -name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version -of the Work and any modifications or additions to that Work or Derivative Works -thereof, that is intentionally submitted to Licensor for inclusion in the Work -by the copyright owner or by an individual or Legal Entity authorized to submit -on behalf of the copyright owner. For the purposes of this definition, -"submitted" means any form of electronic, verbal, or written communication sent -to the Licensor or its representatives, including but not limited to -communication on electronic mailing lists, source code control systems, and -issue tracking systems that are managed by, or on behalf of, the Licensor for -the purpose of discussing and improving the Work, but excluding communication -that is conspicuously marked or otherwise designated in writing by the copyright -owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf -of whom a Contribution has been received by Licensor and subsequently -incorporated within the Work. - -2. Grant of Copyright License. - -Subject to the terms and conditions of this License, each Contributor hereby -grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, -irrevocable copyright license to reproduce, prepare Derivative Works of, -publicly display, publicly perform, sublicense, and distribute the Work and such -Derivative Works in Source or Object form. - -3. Grant of Patent License. - -Subject to the terms and conditions of this License, each Contributor hereby -grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, -irrevocable (except as stated in this section) patent license to make, have -made, use, offer to sell, sell, import, and otherwise transfer the Work, where -such license applies only to those patent claims licensable by such Contributor -that are necessarily infringed by their Contribution(s) alone or by combination -of their Contribution(s) with the Work to which such Contribution(s) was -submitted. If You institute patent litigation against any entity (including a -cross-claim or counterclaim in a lawsuit) alleging that the Work or a -Contribution incorporated within the Work constitutes direct or contributory -patent infringement, then any patent licenses granted to You under this License -for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. - -You may reproduce and distribute copies of the Work or Derivative Works thereof -in any medium, with or without modifications, and in Source or Object form, -provided that You meet the following conditions: - -You must give any other recipients of the Work or Derivative Works a copy of -this License; and -You must cause any modified files to carry prominent notices stating that You -changed the files; and -You must retain, in the Source form of any Derivative Works that You distribute, -all copyright, patent, trademark, and attribution notices from the Source form -of the Work, excluding those notices that do not pertain to any part of the -Derivative Works; and -If the Work includes a "NOTICE" text file as part of its distribution, then any -Derivative Works that You distribute must include a readable copy of the -attribution notices contained within such NOTICE file, excluding those notices -that do not pertain to any part of the Derivative Works, in at least one of the -following places: within a NOTICE text file distributed as part of the -Derivative Works; within the Source form or documentation, if provided along -with the Derivative Works; or, within a display generated by the Derivative -Works, if and wherever such third-party notices normally appear. The contents of -the NOTICE file are for informational purposes only and do not modify the -License. You may add Your own attribution notices within Derivative Works that -You distribute, alongside or as an addendum to the NOTICE text from the Work, -provided that such additional attribution notices cannot be construed as -modifying the License. -You may add Your own copyright statement to Your modifications and may provide -additional or different license terms and conditions for use, reproduction, or -distribution of Your modifications, or for any such Derivative Works as a whole, -provided Your use, reproduction, and distribution of the Work otherwise complies -with the conditions stated in this License. - -5. Submission of Contributions. - -Unless You explicitly state otherwise, any Contribution intentionally submitted -for inclusion in the Work by You to the Licensor shall be under the terms and -conditions of this License, without any additional terms or conditions. -Notwithstanding the above, nothing herein shall supersede or modify the terms of -any separate license agreement you may have executed with Licensor regarding -such Contributions. - -6. Trademarks. - -This License does not grant permission to use the trade names, trademarks, -service marks, or product names of the Licensor, except as required for -reasonable and customary use in describing the origin of the Work and -reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. - -Unless required by applicable law or agreed to in writing, Licensor provides the -Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, -including, without limitation, any warranties or conditions of TITLE, -NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are -solely responsible for determining the appropriateness of using or -redistributing the Work and assume any risks associated with Your exercise of -permissions under this License. - -8. Limitation of Liability. - -In no event and under no legal theory, whether in tort (including negligence), -contract, or otherwise, unless required by applicable law (such as deliberate -and grossly negligent acts) or agreed to in writing, shall any Contributor be -liable to You for damages, including any direct, indirect, special, incidental, -or consequential damages of any character arising as a result of this License or -out of the use or inability to use the Work (including but not limited to -damages for loss of goodwill, work stoppage, computer failure or malfunction, or -any and all other commercial damages or losses), even if such Contributor has -been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. - -While redistributing the Work or Derivative Works thereof, You may choose to -offer, and charge a fee for, acceptance of support, warranty, indemnity, or -other liability obligations and/or rights consistent with this License. However, -in accepting such obligations, You may act only on Your own behalf and on Your -sole responsibility, not on behalf of any other Contributor, and only if You -agree to indemnify, defend, and hold each Contributor harmless for any liability -incurred by, or claims asserted against, such Contributor by reason of your -accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work - -To apply the Apache License to your work, attach the following boilerplate -notice, with the fields enclosed by brackets "[]" replaced with your own -identifying information. (Don't include the brackets!) The text should be -enclosed in the appropriate comment syntax for the file format. We also -recommend that a file or class name and description of purpose be included on -the same "printed page" as the copyright notice for easier identification within -third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file diff --git a/vendor/github.com/go-macaron/binding/README.md b/vendor/github.com/go-macaron/binding/README.md deleted file mode 100644 index a6748b57a..000000000 --- a/vendor/github.com/go-macaron/binding/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# binding [![Build Status](https://travis-ci.org/go-macaron/binding.svg?branch=master)](https://travis-ci.org/go-macaron/binding) [![](http://gocover.io/_badge/github.com/go-macaron/binding)](http://gocover.io/github.com/go-macaron/binding) - -Middleware binding provides request data binding and validation for [Macaron](https://github.com/go-macaron/macaron). - -### Installation - - go get github.com/go-macaron/binding - -## Getting Help - -- [API Reference](https://gowalker.org/github.com/go-macaron/binding) -- [Documentation](http://go-macaron.com/docs/middlewares/binding) - -## Credits - -This package is a modified version of [martini-contrib/binding](https://github.com/martini-contrib/binding). - -## License - -This project is under the Apache License, Version 2.0. See the [LICENSE](LICENSE) file for the full license text. \ No newline at end of file diff --git a/vendor/github.com/go-macaron/binding/binding.go b/vendor/github.com/go-macaron/binding/binding.go deleted file mode 100644 index dbd7beb45..000000000 --- a/vendor/github.com/go-macaron/binding/binding.go +++ /dev/null @@ -1,671 +0,0 @@ -// Copyright 2014 Martini Authors -// Copyright 2014 The Macaron Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -// Package binding is a middleware that provides request data binding and validation for Macaron. -package binding - -import ( - "encoding/json" - "fmt" - "io" - "mime/multipart" - "net/http" - "reflect" - "regexp" - "strconv" - "strings" - "unicode/utf8" - - "github.com/Unknwon/com" - "gopkg.in/macaron.v1" -) - -const _VERSION = "0.3.2" - -func Version() string { - return _VERSION -} - -func bind(ctx *macaron.Context, obj interface{}, ifacePtr ...interface{}) { - contentType := ctx.Req.Header.Get("Content-Type") - if ctx.Req.Method == "POST" || ctx.Req.Method == "PUT" || len(contentType) > 0 { - switch { - case strings.Contains(contentType, "form-urlencoded"): - ctx.Invoke(Form(obj, ifacePtr...)) - case strings.Contains(contentType, "multipart/form-data"): - ctx.Invoke(MultipartForm(obj, ifacePtr...)) - case strings.Contains(contentType, "json"): - ctx.Invoke(Json(obj, ifacePtr...)) - default: - var errors Errors - if contentType == "" { - errors.Add([]string{}, ERR_CONTENT_TYPE, "Empty Content-Type") - } else { - errors.Add([]string{}, ERR_CONTENT_TYPE, "Unsupported Content-Type") - } - ctx.Map(errors) - ctx.Map(obj) // Map a fake struct so handler won't panic. - } - } else { - ctx.Invoke(Form(obj, ifacePtr...)) - } -} - -const ( - _JSON_CONTENT_TYPE = "application/json; charset=utf-8" - STATUS_UNPROCESSABLE_ENTITY = 422 -) - -// errorHandler simply counts the number of errors in the -// context and, if more than 0, writes a response with an -// error code and a JSON payload describing the errors. -// The response will have a JSON content-type. -// Middleware remaining on the stack will not even see the request -// if, by this point, there are any errors. -// This is a "default" handler, of sorts, and you are -// welcome to use your own instead. The Bind middleware -// invokes this automatically for convenience. -func errorHandler(errs Errors, rw http.ResponseWriter) { - if len(errs) > 0 { - rw.Header().Set("Content-Type", _JSON_CONTENT_TYPE) - if errs.Has(ERR_DESERIALIZATION) { - rw.WriteHeader(http.StatusBadRequest) - } else if errs.Has(ERR_CONTENT_TYPE) { - rw.WriteHeader(http.StatusUnsupportedMediaType) - } else { - rw.WriteHeader(STATUS_UNPROCESSABLE_ENTITY) - } - errOutput, _ := json.Marshal(errs) - rw.Write(errOutput) - return - } -} - -// Bind wraps up the functionality of the Form and Json middleware -// according to the Content-Type and verb of the request. -// A Content-Type is required for POST and PUT requests. -// Bind invokes the ErrorHandler middleware to bail out if errors -// occurred. If you want to perform your own error handling, use -// Form or Json middleware directly. An interface pointer can -// be added as a second argument in order to map the struct to -// a specific interface. -func Bind(obj interface{}, ifacePtr ...interface{}) macaron.Handler { - return func(ctx *macaron.Context) { - bind(ctx, obj, ifacePtr...) - if handler, ok := obj.(ErrorHandler); ok { - ctx.Invoke(handler.Error) - } else { - ctx.Invoke(errorHandler) - } - } -} - -// BindIgnErr will do the exactly same thing as Bind but without any -// error handling, which user has freedom to deal with them. -// This allows user take advantages of validation. -func BindIgnErr(obj interface{}, ifacePtr ...interface{}) macaron.Handler { - return func(ctx *macaron.Context) { - bind(ctx, obj, ifacePtr...) - } -} - -// Form is middleware to deserialize form-urlencoded data from the request. -// It gets data from the form-urlencoded body, if present, or from the -// query string. It uses the http.Request.ParseForm() method -// to perform deserialization, then reflection is used to map each field -// into the struct with the proper type. Structs with primitive slice types -// (bool, float, int, string) can support deserialization of repeated form -// keys, for example: key=val1&key=val2&key=val3 -// An interface pointer can be added as a second argument in order -// to map the struct to a specific interface. -func Form(formStruct interface{}, ifacePtr ...interface{}) macaron.Handler { - return func(ctx *macaron.Context) { - var errors Errors - - ensureNotPointer(formStruct) - formStruct := reflect.New(reflect.TypeOf(formStruct)) - parseErr := ctx.Req.ParseForm() - - // Format validation of the request body or the URL would add considerable overhead, - // and ParseForm does not complain when URL encoding is off. - // Because an empty request body or url can also mean absence of all needed values, - // it is not in all cases a bad request, so let's return 422. - if parseErr != nil { - errors.Add([]string{}, ERR_DESERIALIZATION, parseErr.Error()) - } - errors = mapForm(formStruct, ctx.Req.Form, nil, errors) - validateAndMap(formStruct, ctx, errors, ifacePtr...) - } -} - -// Maximum amount of memory to use when parsing a multipart form. -// Set this to whatever value you prefer; default is 10 MB. -var MaxMemory = int64(1024 * 1024 * 10) - -// MultipartForm works much like Form, except it can parse multipart forms -// and handle file uploads. Like the other deserialization middleware handlers, -// you can pass in an interface to make the interface available for injection -// into other handlers later. -func MultipartForm(formStruct interface{}, ifacePtr ...interface{}) macaron.Handler { - return func(ctx *macaron.Context) { - var errors Errors - ensureNotPointer(formStruct) - formStruct := reflect.New(reflect.TypeOf(formStruct)) - // This if check is necessary due to https://github.com/martini-contrib/csrf/issues/6 - if ctx.Req.MultipartForm == nil { - // Workaround for multipart forms returning nil instead of an error - // when content is not multipart; see https://code.google.com/p/go/issues/detail?id=6334 - if multipartReader, err := ctx.Req.MultipartReader(); err != nil { - errors.Add([]string{}, ERR_DESERIALIZATION, err.Error()) - } else { - form, parseErr := multipartReader.ReadForm(MaxMemory) - if parseErr != nil { - errors.Add([]string{}, ERR_DESERIALIZATION, parseErr.Error()) - } - - if ctx.Req.Form == nil { - ctx.Req.ParseForm() - } - for k, v := range form.Value { - ctx.Req.Form[k] = append(ctx.Req.Form[k], v...) - } - - ctx.Req.MultipartForm = form - } - } - errors = mapForm(formStruct, ctx.Req.MultipartForm.Value, ctx.Req.MultipartForm.File, errors) - validateAndMap(formStruct, ctx, errors, ifacePtr...) - } -} - -// Json is middleware to deserialize a JSON payload from the request -// into the struct that is passed in. The resulting struct is then -// validated, but no error handling is actually performed here. -// An interface pointer can be added as a second argument in order -// to map the struct to a specific interface. -func Json(jsonStruct interface{}, ifacePtr ...interface{}) macaron.Handler { - return func(ctx *macaron.Context) { - var errors Errors - ensureNotPointer(jsonStruct) - jsonStruct := reflect.New(reflect.TypeOf(jsonStruct)) - if ctx.Req.Request.Body != nil { - defer ctx.Req.Request.Body.Close() - err := json.NewDecoder(ctx.Req.Request.Body).Decode(jsonStruct.Interface()) - if err != nil && err != io.EOF { - errors.Add([]string{}, ERR_DESERIALIZATION, err.Error()) - } - } - validateAndMap(jsonStruct, ctx, errors, ifacePtr...) - } -} - -// Validate is middleware to enforce required fields. If the struct -// passed in implements Validator, then the user-defined Validate method -// is executed, and its errors are mapped to the context. This middleware -// performs no error handling: it merely detects errors and maps them. -func Validate(obj interface{}) macaron.Handler { - return func(ctx *macaron.Context) { - var errors Errors - v := reflect.ValueOf(obj) - k := v.Kind() - if k == reflect.Interface || k == reflect.Ptr { - v = v.Elem() - k = v.Kind() - } - if k == reflect.Slice || k == reflect.Array { - for i := 0; i < v.Len(); i++ { - e := v.Index(i).Interface() - errors = validateStruct(errors, e) - if validator, ok := e.(Validator); ok { - errors = validator.Validate(ctx, errors) - } - } - } else { - errors = validateStruct(errors, obj) - if validator, ok := obj.(Validator); ok { - errors = validator.Validate(ctx, errors) - } - } - ctx.Map(errors) - } -} - -var ( - AlphaDashPattern = regexp.MustCompile("[^\\d\\w-_]") - AlphaDashDotPattern = regexp.MustCompile("[^\\d\\w-_\\.]") - EmailPattern = regexp.MustCompile("[\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\\w](?:[\\w-]*[\\w])?\\.)+[a-zA-Z0-9](?:[\\w-]*[\\w])?") - URLPattern = regexp.MustCompile(`(http|https):\/\/(?:\\S+(?::\\S*)?@)?[\w\-_]+(\.[\w\-_]+)*([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?`) -) - -type ( - // Rule represents a validation rule. - Rule struct { - // IsMatch checks if rule matches. - IsMatch func(string) bool - // IsValid applies validation rule to condition. - IsValid func(Errors, string, interface{}) (bool, Errors) - } - // RuleMapper represents a validation rule mapper, - // it allwos users to add custom validation rules. - RuleMapper []*Rule -) - -var ruleMapper RuleMapper - -// AddRule adds new validation rule. -func AddRule(r *Rule) { - ruleMapper = append(ruleMapper, r) -} - -func in(fieldValue interface{}, arr string) bool { - val := fmt.Sprintf("%v", fieldValue) - vals := strings.Split(arr, ",") - isIn := false - for _, v := range vals { - if v == val { - isIn = true - break - } - } - return isIn -} - -func parseFormName(raw, actual string) string { - if len(actual) > 0 { - return actual - } - return nameMapper(raw) -} - -// Performs required field checking on a struct -func validateStruct(errors Errors, obj interface{}) Errors { - typ := reflect.TypeOf(obj) - val := reflect.ValueOf(obj) - - if typ.Kind() == reflect.Ptr { - typ = typ.Elem() - val = val.Elem() - } - - for i := 0; i < typ.NumField(); i++ { - field := typ.Field(i) - - // Allow ignored fields in the struct - if field.Tag.Get("form") == "-" || !val.Field(i).CanInterface() { - continue - } - - fieldVal := val.Field(i) - fieldValue := fieldVal.Interface() - zero := reflect.Zero(field.Type).Interface() - - // Validate nested and embedded structs (if pointer, only do so if not nil) - if field.Type.Kind() == reflect.Struct || - (field.Type.Kind() == reflect.Ptr && !reflect.DeepEqual(zero, fieldValue) && - field.Type.Elem().Kind() == reflect.Struct) { - errors = validateStruct(errors, fieldValue) - } - errors = validateField(errors, zero, field, fieldVal, fieldValue) - } - return errors -} - -func validateField(errors Errors, zero interface{}, field reflect.StructField, fieldVal reflect.Value, fieldValue interface{}) Errors { - if fieldVal.Kind() == reflect.Slice { - for i := 0; i < fieldVal.Len(); i++ { - sliceVal := fieldVal.Index(i) - if sliceVal.Kind() == reflect.Ptr { - sliceVal = sliceVal.Elem() - } - - sliceValue := sliceVal.Interface() - zero := reflect.Zero(sliceVal.Type()).Interface() - if sliceVal.Kind() == reflect.Struct || - (sliceVal.Kind() == reflect.Ptr && !reflect.DeepEqual(zero, sliceValue) && - sliceVal.Elem().Kind() == reflect.Struct) { - errors = validateStruct(errors, sliceValue) - } - /* Apply validation rules to each item in a slice. ISSUE #3 - else { - errors = validateField(errors, zero, field, sliceVal, sliceValue) - }*/ - } - } - -VALIDATE_RULES: - for _, rule := range strings.Split(field.Tag.Get("binding"), ";") { - if len(rule) == 0 { - continue - } - - switch { - case rule == "OmitEmpty": - if reflect.DeepEqual(zero, fieldValue) { - break VALIDATE_RULES - } - case rule == "Required": - if reflect.DeepEqual(zero, fieldValue) { - errors.Add([]string{field.Name}, ERR_REQUIRED, "Required") - break VALIDATE_RULES - } - case rule == "AlphaDash": - if AlphaDashPattern.MatchString(fmt.Sprintf("%v", fieldValue)) { - errors.Add([]string{field.Name}, ERR_ALPHA_DASH, "AlphaDash") - break VALIDATE_RULES - } - case rule == "AlphaDashDot": - if AlphaDashDotPattern.MatchString(fmt.Sprintf("%v", fieldValue)) { - errors.Add([]string{field.Name}, ERR_ALPHA_DASH_DOT, "AlphaDashDot") - break VALIDATE_RULES - } - case strings.HasPrefix(rule, "Size("): - size, _ := strconv.Atoi(rule[5 : len(rule)-1]) - if str, ok := fieldValue.(string); ok && utf8.RuneCountInString(str) != size { - errors.Add([]string{field.Name}, ERR_SIZE, "Size") - break VALIDATE_RULES - } - v := reflect.ValueOf(fieldValue) - if v.Kind() == reflect.Slice && v.Len() != size { - errors.Add([]string{field.Name}, ERR_SIZE, "Size") - break VALIDATE_RULES - } - case strings.HasPrefix(rule, "MinSize("): - min, _ := strconv.Atoi(rule[8 : len(rule)-1]) - if str, ok := fieldValue.(string); ok && utf8.RuneCountInString(str) < min { - errors.Add([]string{field.Name}, ERR_MIN_SIZE, "MinSize") - break VALIDATE_RULES - } - v := reflect.ValueOf(fieldValue) - if v.Kind() == reflect.Slice && v.Len() < min { - errors.Add([]string{field.Name}, ERR_MIN_SIZE, "MinSize") - break VALIDATE_RULES - } - case strings.HasPrefix(rule, "MaxSize("): - max, _ := strconv.Atoi(rule[8 : len(rule)-1]) - if str, ok := fieldValue.(string); ok && utf8.RuneCountInString(str) > max { - errors.Add([]string{field.Name}, ERR_MAX_SIZE, "MaxSize") - break VALIDATE_RULES - } - v := reflect.ValueOf(fieldValue) - if v.Kind() == reflect.Slice && v.Len() > max { - errors.Add([]string{field.Name}, ERR_MAX_SIZE, "MaxSize") - break VALIDATE_RULES - } - case strings.HasPrefix(rule, "Range("): - nums := strings.Split(rule[6:len(rule)-1], ",") - if len(nums) != 2 { - break VALIDATE_RULES - } - val := com.StrTo(fmt.Sprintf("%v", fieldValue)).MustInt() - if val < com.StrTo(nums[0]).MustInt() || val > com.StrTo(nums[1]).MustInt() { - errors.Add([]string{field.Name}, ERR_RANGE, "Range") - break VALIDATE_RULES - } - case rule == "Email": - if !EmailPattern.MatchString(fmt.Sprintf("%v", fieldValue)) { - errors.Add([]string{field.Name}, ERR_EMAIL, "Email") - break VALIDATE_RULES - } - case rule == "Url": - str := fmt.Sprintf("%v", fieldValue) - if len(str) == 0 { - continue - } else if !URLPattern.MatchString(str) { - errors.Add([]string{field.Name}, ERR_URL, "Url") - break VALIDATE_RULES - } - case strings.HasPrefix(rule, "In("): - if !in(fieldValue, rule[3:len(rule)-1]) { - errors.Add([]string{field.Name}, ERR_IN, "In") - break VALIDATE_RULES - } - case strings.HasPrefix(rule, "NotIn("): - if in(fieldValue, rule[6:len(rule)-1]) { - errors.Add([]string{field.Name}, ERR_NOT_INT, "NotIn") - break VALIDATE_RULES - } - case strings.HasPrefix(rule, "Include("): - if !strings.Contains(fmt.Sprintf("%v", fieldValue), rule[8:len(rule)-1]) { - errors.Add([]string{field.Name}, ERR_INCLUDE, "Include") - break VALIDATE_RULES - } - case strings.HasPrefix(rule, "Exclude("): - if strings.Contains(fmt.Sprintf("%v", fieldValue), rule[8:len(rule)-1]) { - errors.Add([]string{field.Name}, ERR_EXCLUDE, "Exclude") - break VALIDATE_RULES - } - case strings.HasPrefix(rule, "Default("): - if reflect.DeepEqual(zero, fieldValue) { - if fieldVal.CanAddr() { - errors = setWithProperType(field.Type.Kind(), rule[8:len(rule)-1], fieldVal, field.Tag.Get("form"), errors) - } else { - errors.Add([]string{field.Name}, ERR_EXCLUDE, "Default") - break VALIDATE_RULES - } - } - default: - // Apply custom validation rules. - var isValid bool - for i := range ruleMapper { - if ruleMapper[i].IsMatch(rule) { - isValid, errors = ruleMapper[i].IsValid(errors, field.Name, fieldValue) - if !isValid { - break VALIDATE_RULES - } - } - } - } - } - return errors -} - -// NameMapper represents a form tag name mapper. -type NameMapper func(string) string - -var ( - nameMapper = func(field string) string { - newstr := make([]rune, 0, len(field)) - for i, chr := range field { - if isUpper := 'A' <= chr && chr <= 'Z'; isUpper { - if i > 0 { - newstr = append(newstr, '_') - } - chr -= ('A' - 'a') - } - newstr = append(newstr, chr) - } - return string(newstr) - } -) - -// SetNameMapper sets name mapper. -func SetNameMapper(nm NameMapper) { - nameMapper = nm -} - -// Takes values from the form data and puts them into a struct -func mapForm(formStruct reflect.Value, form map[string][]string, - formfile map[string][]*multipart.FileHeader, errors Errors) Errors { - - if formStruct.Kind() == reflect.Ptr { - formStruct = formStruct.Elem() - } - typ := formStruct.Type() - - for i := 0; i < typ.NumField(); i++ { - typeField := typ.Field(i) - structField := formStruct.Field(i) - - if typeField.Type.Kind() == reflect.Ptr && typeField.Anonymous { - structField.Set(reflect.New(typeField.Type.Elem())) - errors = mapForm(structField.Elem(), form, formfile, errors) - if reflect.DeepEqual(structField.Elem().Interface(), reflect.Zero(structField.Elem().Type()).Interface()) { - structField.Set(reflect.Zero(structField.Type())) - } - } else if typeField.Type.Kind() == reflect.Struct { - errors = mapForm(structField, form, formfile, errors) - } - - inputFieldName := parseFormName(typeField.Name, typeField.Tag.Get("form")) - if len(inputFieldName) == 0 || !structField.CanSet() { - continue - } - - inputValue, exists := form[inputFieldName] - if exists { - numElems := len(inputValue) - if structField.Kind() == reflect.Slice && numElems > 0 { - sliceOf := structField.Type().Elem().Kind() - slice := reflect.MakeSlice(structField.Type(), numElems, numElems) - for i := 0; i < numElems; i++ { - errors = setWithProperType(sliceOf, inputValue[i], slice.Index(i), inputFieldName, errors) - } - formStruct.Field(i).Set(slice) - } else { - errors = setWithProperType(typeField.Type.Kind(), inputValue[0], structField, inputFieldName, errors) - } - continue - } - - inputFile, exists := formfile[inputFieldName] - if !exists { - continue - } - fhType := reflect.TypeOf((*multipart.FileHeader)(nil)) - numElems := len(inputFile) - if structField.Kind() == reflect.Slice && numElems > 0 && structField.Type().Elem() == fhType { - slice := reflect.MakeSlice(structField.Type(), numElems, numElems) - for i := 0; i < numElems; i++ { - slice.Index(i).Set(reflect.ValueOf(inputFile[i])) - } - structField.Set(slice) - } else if structField.Type() == fhType { - structField.Set(reflect.ValueOf(inputFile[0])) - } - } - return errors -} - -// This sets the value in a struct of an indeterminate type to the -// matching value from the request (via Form middleware) in the -// same type, so that not all deserialized values have to be strings. -// Supported types are string, int, float, and bool. -func setWithProperType(valueKind reflect.Kind, val string, structField reflect.Value, nameInTag string, errors Errors) Errors { - switch valueKind { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - if val == "" { - val = "0" - } - intVal, err := strconv.ParseInt(val, 10, 64) - if err != nil { - errors.Add([]string{nameInTag}, ERR_INTERGER_TYPE, "Value could not be parsed as integer") - } else { - structField.SetInt(intVal) - } - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - if val == "" { - val = "0" - } - uintVal, err := strconv.ParseUint(val, 10, 64) - if err != nil { - errors.Add([]string{nameInTag}, ERR_INTERGER_TYPE, "Value could not be parsed as unsigned integer") - } else { - structField.SetUint(uintVal) - } - case reflect.Bool: - if val == "on" { - structField.SetBool(true) - break - } - - if val == "" { - val = "false" - } - boolVal, err := strconv.ParseBool(val) - if err != nil { - errors.Add([]string{nameInTag}, ERR_BOOLEAN_TYPE, "Value could not be parsed as boolean") - } else if boolVal { - structField.SetBool(true) - } - case reflect.Float32: - if val == "" { - val = "0.0" - } - floatVal, err := strconv.ParseFloat(val, 32) - if err != nil { - errors.Add([]string{nameInTag}, ERR_FLOAT_TYPE, "Value could not be parsed as 32-bit float") - } else { - structField.SetFloat(floatVal) - } - case reflect.Float64: - if val == "" { - val = "0.0" - } - floatVal, err := strconv.ParseFloat(val, 64) - if err != nil { - errors.Add([]string{nameInTag}, ERR_FLOAT_TYPE, "Value could not be parsed as 64-bit float") - } else { - structField.SetFloat(floatVal) - } - case reflect.String: - structField.SetString(val) - } - return errors -} - -// Don't pass in pointers to bind to. Can lead to bugs. -func ensureNotPointer(obj interface{}) { - if reflect.TypeOf(obj).Kind() == reflect.Ptr { - panic("Pointers are not accepted as binding models") - } -} - -// Performs validation and combines errors from validation -// with errors from deserialization, then maps both the -// resulting struct and the errors to the context. -func validateAndMap(obj reflect.Value, ctx *macaron.Context, errors Errors, ifacePtr ...interface{}) { - ctx.Invoke(Validate(obj.Interface())) - errors = append(errors, getErrors(ctx)...) - ctx.Map(errors) - ctx.Map(obj.Elem().Interface()) - if len(ifacePtr) > 0 { - ctx.MapTo(obj.Elem().Interface(), ifacePtr[0]) - } -} - -// getErrors simply gets the errors from the context (it's kind of a chore) -func getErrors(ctx *macaron.Context) Errors { - return ctx.GetVal(reflect.TypeOf(Errors{})).Interface().(Errors) -} - -type ( - // ErrorHandler is the interface that has custom error handling process. - ErrorHandler interface { - // Error handles validation errors with custom process. - Error(*macaron.Context, Errors) - } - - // Validator is the interface that handles some rudimentary - // request validation logic so your application doesn't have to. - Validator interface { - // Validate validates that the request is OK. It is recommended - // that validation be limited to checking values for syntax and - // semantics, enough to know that you can make sense of the request - // in your application. For example, you might verify that a credit - // card number matches a valid pattern, but you probably wouldn't - // perform an actual credit card authorization here. - Validate(*macaron.Context, Errors) Errors - } -) diff --git a/vendor/github.com/go-macaron/binding/errors.go b/vendor/github.com/go-macaron/binding/errors.go deleted file mode 100644 index 8cbe44a9d..000000000 --- a/vendor/github.com/go-macaron/binding/errors.go +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright 2014 Martini Authors -// Copyright 2014 The Macaron Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package binding - -const ( - // Type mismatch errors. - ERR_CONTENT_TYPE = "ContentTypeError" - ERR_DESERIALIZATION = "DeserializationError" - ERR_INTERGER_TYPE = "IntegerTypeError" - ERR_BOOLEAN_TYPE = "BooleanTypeError" - ERR_FLOAT_TYPE = "FloatTypeError" - - // Validation errors. - ERR_REQUIRED = "RequiredError" - ERR_ALPHA_DASH = "AlphaDashError" - ERR_ALPHA_DASH_DOT = "AlphaDashDotError" - ERR_SIZE = "SizeError" - ERR_MIN_SIZE = "MinSizeError" - ERR_MAX_SIZE = "MaxSizeError" - ERR_RANGE = "RangeError" - ERR_EMAIL = "EmailError" - ERR_URL = "UrlError" - ERR_IN = "InError" - ERR_NOT_INT = "NotInError" - ERR_INCLUDE = "IncludeError" - ERR_EXCLUDE = "ExcludeError" - ERR_DEFAULT = "DefaultError" -) - -type ( - // Errors may be generated during deserialization, binding, - // or validation. This type is mapped to the context so you - // can inject it into your own handlers and use it in your - // application if you want all your errors to look the same. - Errors []Error - - Error struct { - // An error supports zero or more field names, because an - // error can morph three ways: (1) it can indicate something - // wrong with the request as a whole, (2) it can point to a - // specific problem with a particular input field, or (3) it - // can span multiple related input fields. - FieldNames []string `json:"fieldNames,omitempty"` - - // The classification is like an error code, convenient to - // use when processing or categorizing an error programmatically. - // It may also be called the "kind" of error. - Classification string `json:"classification,omitempty"` - - // Message should be human-readable and detailed enough to - // pinpoint and resolve the problem, but it should be brief. For - // example, a payload of 100 objects in a JSON array might have - // an error in the 41st object. The message should help the - // end user find and fix the error with their request. - Message string `json:"message,omitempty"` - } -) - -// Add adds an error associated with the fields indicated -// by fieldNames, with the given classification and message. -func (e *Errors) Add(fieldNames []string, classification, message string) { - *e = append(*e, Error{ - FieldNames: fieldNames, - Classification: classification, - Message: message, - }) -} - -// Len returns the number of errors. -func (e *Errors) Len() int { - return len(*e) -} - -// Has determines whether an Errors slice has an Error with -// a given classification in it; it does not search on messages -// or field names. -func (e *Errors) Has(class string) bool { - for _, err := range *e { - if err.Kind() == class { - return true - } - } - return false -} - -/* -// WithClass gets a copy of errors that are classified by the -// the given classification. -func (e *Errors) WithClass(classification string) Errors { - var errs Errors - for _, err := range *e { - if err.Kind() == classification { - errs = append(errs, err) - } - } - return errs -} - -// ForField gets a copy of errors that are associated with the -// field by the given name. -func (e *Errors) ForField(name string) Errors { - var errs Errors - for _, err := range *e { - for _, fieldName := range err.Fields() { - if fieldName == name { - errs = append(errs, err) - break - } - } - } - return errs -} - -// Get gets errors of a particular class for the specified -// field name. -func (e *Errors) Get(class, fieldName string) Errors { - var errs Errors - for _, err := range *e { - if err.Kind() == class { - for _, nameOfField := range err.Fields() { - if nameOfField == fieldName { - errs = append(errs, err) - break - } - } - } - } - return errs -} -*/ - -// Fields returns the list of field names this error is -// associated with. -func (e Error) Fields() []string { - return e.FieldNames -} - -// Kind returns this error's classification. -func (e Error) Kind() string { - return e.Classification -} - -// Error returns this error's message. -func (e Error) Error() string { - return e.Message -} diff --git a/vendor/github.com/go-macaron/gzip/LICENSE b/vendor/github.com/go-macaron/gzip/LICENSE deleted file mode 100644 index 37ec93a14..000000000 --- a/vendor/github.com/go-macaron/gzip/LICENSE +++ /dev/null @@ -1,191 +0,0 @@ -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and -distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright -owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities -that control, are controlled by, or are under common control with that entity. -For the purposes of this definition, "control" means (i) the power, direct or -indirect, to cause the direction or management of such entity, whether by -contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the -outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising -permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including -but not limited to software source code, documentation source, and configuration -files. - -"Object" form shall mean any form resulting from mechanical transformation or -translation of a Source form, including but not limited to compiled object code, -generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made -available under the License, as indicated by a copyright notice that is included -in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that -is based on (or derived from) the Work and for which the editorial revisions, -annotations, elaborations, or other modifications represent, as a whole, an -original work of authorship. For the purposes of this License, Derivative Works -shall not include works that remain separable from, or merely link (or bind by -name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version -of the Work and any modifications or additions to that Work or Derivative Works -thereof, that is intentionally submitted to Licensor for inclusion in the Work -by the copyright owner or by an individual or Legal Entity authorized to submit -on behalf of the copyright owner. For the purposes of this definition, -"submitted" means any form of electronic, verbal, or written communication sent -to the Licensor or its representatives, including but not limited to -communication on electronic mailing lists, source code control systems, and -issue tracking systems that are managed by, or on behalf of, the Licensor for -the purpose of discussing and improving the Work, but excluding communication -that is conspicuously marked or otherwise designated in writing by the copyright -owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf -of whom a Contribution has been received by Licensor and subsequently -incorporated within the Work. - -2. Grant of Copyright License. - -Subject to the terms and conditions of this License, each Contributor hereby -grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, -irrevocable copyright license to reproduce, prepare Derivative Works of, -publicly display, publicly perform, sublicense, and distribute the Work and such -Derivative Works in Source or Object form. - -3. Grant of Patent License. - -Subject to the terms and conditions of this License, each Contributor hereby -grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, -irrevocable (except as stated in this section) patent license to make, have -made, use, offer to sell, sell, import, and otherwise transfer the Work, where -such license applies only to those patent claims licensable by such Contributor -that are necessarily infringed by their Contribution(s) alone or by combination -of their Contribution(s) with the Work to which such Contribution(s) was -submitted. If You institute patent litigation against any entity (including a -cross-claim or counterclaim in a lawsuit) alleging that the Work or a -Contribution incorporated within the Work constitutes direct or contributory -patent infringement, then any patent licenses granted to You under this License -for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. - -You may reproduce and distribute copies of the Work or Derivative Works thereof -in any medium, with or without modifications, and in Source or Object form, -provided that You meet the following conditions: - -You must give any other recipients of the Work or Derivative Works a copy of -this License; and -You must cause any modified files to carry prominent notices stating that You -changed the files; and -You must retain, in the Source form of any Derivative Works that You distribute, -all copyright, patent, trademark, and attribution notices from the Source form -of the Work, excluding those notices that do not pertain to any part of the -Derivative Works; and -If the Work includes a "NOTICE" text file as part of its distribution, then any -Derivative Works that You distribute must include a readable copy of the -attribution notices contained within such NOTICE file, excluding those notices -that do not pertain to any part of the Derivative Works, in at least one of the -following places: within a NOTICE text file distributed as part of the -Derivative Works; within the Source form or documentation, if provided along -with the Derivative Works; or, within a display generated by the Derivative -Works, if and wherever such third-party notices normally appear. The contents of -the NOTICE file are for informational purposes only and do not modify the -License. You may add Your own attribution notices within Derivative Works that -You distribute, alongside or as an addendum to the NOTICE text from the Work, -provided that such additional attribution notices cannot be construed as -modifying the License. -You may add Your own copyright statement to Your modifications and may provide -additional or different license terms and conditions for use, reproduction, or -distribution of Your modifications, or for any such Derivative Works as a whole, -provided Your use, reproduction, and distribution of the Work otherwise complies -with the conditions stated in this License. - -5. Submission of Contributions. - -Unless You explicitly state otherwise, any Contribution intentionally submitted -for inclusion in the Work by You to the Licensor shall be under the terms and -conditions of this License, without any additional terms or conditions. -Notwithstanding the above, nothing herein shall supersede or modify the terms of -any separate license agreement you may have executed with Licensor regarding -such Contributions. - -6. Trademarks. - -This License does not grant permission to use the trade names, trademarks, -service marks, or product names of the Licensor, except as required for -reasonable and customary use in describing the origin of the Work and -reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. - -Unless required by applicable law or agreed to in writing, Licensor provides the -Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, -including, without limitation, any warranties or conditions of TITLE, -NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are -solely responsible for determining the appropriateness of using or -redistributing the Work and assume any risks associated with Your exercise of -permissions under this License. - -8. Limitation of Liability. - -In no event and under no legal theory, whether in tort (including negligence), -contract, or otherwise, unless required by applicable law (such as deliberate -and grossly negligent acts) or agreed to in writing, shall any Contributor be -liable to You for damages, including any direct, indirect, special, incidental, -or consequential damages of any character arising as a result of this License or -out of the use or inability to use the Work (including but not limited to -damages for loss of goodwill, work stoppage, computer failure or malfunction, or -any and all other commercial damages or losses), even if such Contributor has -been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. - -While redistributing the Work or Derivative Works thereof, You may choose to -offer, and charge a fee for, acceptance of support, warranty, indemnity, or -other liability obligations and/or rights consistent with this License. However, -in accepting such obligations, You may act only on Your own behalf and on Your -sole responsibility, not on behalf of any other Contributor, and only if You -agree to indemnify, defend, and hold each Contributor harmless for any liability -incurred by, or claims asserted against, such Contributor by reason of your -accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work - -To apply the Apache License to your work, attach the following boilerplate -notice, with the fields enclosed by brackets "[]" replaced with your own -identifying information. (Don't include the brackets!) The text should be -enclosed in the appropriate comment syntax for the file format. We also -recommend that a file or class name and description of purpose be included on -the same "printed page" as the copyright notice for easier identification within -third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/github.com/go-macaron/gzip/README.md b/vendor/github.com/go-macaron/gzip/README.md deleted file mode 100644 index 0c438a720..000000000 --- a/vendor/github.com/go-macaron/gzip/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# gzip [![Build Status](https://travis-ci.org/go-macaron/gzip.svg?branch=master)](https://travis-ci.org/go-macaron/gzip) [![](http://gocover.io/_badge/github.com/go-macaron/gzip)](http://gocover.io/github.com/go-macaron/gzip) - -Middleware gzip provides compress to responses for [Macaron](https://github.com/go-macaron/macaron). - -### Installation - - go get github.com/go-macaron/gzip - -## Getting Help - -- [API Reference](https://gowalker.org/github.com/go-macaron/gzip) -- [Documentation](http://go-macaron.com/docs/middlewares/gzip) - -## Credits - -This package is a modified version of [martini-contrib/gzip](https://github.com/martini-contrib/gzip). - -## License - -This project is under the Apache License, Version 2.0. See the [LICENSE](LICENSE) file for the full license text. \ No newline at end of file diff --git a/vendor/github.com/go-macaron/gzip/gzip.go b/vendor/github.com/go-macaron/gzip/gzip.go deleted file mode 100644 index 296c0e38b..000000000 --- a/vendor/github.com/go-macaron/gzip/gzip.go +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright 2013 Martini Authors -// Copyright 2015 The Macaron Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package gzip - -import ( - "bufio" - "fmt" - "net" - "net/http" - "strings" - - "github.com/klauspost/compress/gzip" - "gopkg.in/macaron.v1" -) - -const ( - _HEADER_ACCEPT_ENCODING = "Accept-Encoding" - _HEADER_CONTENT_ENCODING = "Content-Encoding" - _HEADER_CONTENT_LENGTH = "Content-Length" - _HEADER_CONTENT_TYPE = "Content-Type" - _HEADER_VARY = "Vary" -) - -// Options represents a struct for specifying configuration options for the GZip middleware. -type Options struct { - // Compression level. Can be DefaultCompression(-1), ConstantCompression(-2) - // or any integer value between BestSpeed(1) and BestCompression(9) inclusive. - CompressionLevel int -} - -func isCompressionLevelValid(level int) bool { - return level == gzip.DefaultCompression || - level == gzip.ConstantCompression || - (level >= gzip.BestSpeed && level <= gzip.BestCompression) -} - -func prepareOptions(options []Options) Options { - var opt Options - if len(options) > 0 { - opt = options[0] - } - - if !isCompressionLevelValid(opt.CompressionLevel) { - // For web content, level 4 seems to be a sweet spot. - opt.CompressionLevel = 4 - } - return opt -} - -// Gziper returns a Handler that adds gzip compression to all requests. -// Make sure to include the Gzip middleware above other middleware -// that alter the response body (like the render middleware). -func Gziper(options ...Options) macaron.Handler { - opt := prepareOptions(options) - - return func(ctx *macaron.Context) { - if !strings.Contains(ctx.Req.Header.Get(_HEADER_ACCEPT_ENCODING), "gzip") { - return - } - - headers := ctx.Resp.Header() - headers.Set(_HEADER_CONTENT_ENCODING, "gzip") - headers.Set(_HEADER_VARY, _HEADER_ACCEPT_ENCODING) - - // We've made sure compression level is valid in prepareGzipOptions, - // no need to check same error again. - gz, err := gzip.NewWriterLevel(ctx.Resp, opt.CompressionLevel) - if err != nil { - panic(err.Error()) - } - defer gz.Close() - - gzw := gzipResponseWriter{gz, ctx.Resp} - ctx.Resp = gzw - ctx.MapTo(gzw, (*http.ResponseWriter)(nil)) - - // Check if render middleware has been registered, - // if yes, we need to modify ResponseWriter for it as well. - if _, ok := ctx.Render.(*macaron.DummyRender); !ok { - ctx.Render.SetResponseWriter(gzw) - } - - ctx.Next() - - // delete content length after we know we have been written to - gzw.Header().Del("Content-Length") - } -} - -type gzipResponseWriter struct { - w *gzip.Writer - macaron.ResponseWriter -} - -func (grw gzipResponseWriter) Write(p []byte) (int, error) { - if len(grw.Header().Get(_HEADER_CONTENT_TYPE)) == 0 { - grw.Header().Set(_HEADER_CONTENT_TYPE, http.DetectContentType(p)) - } - return grw.w.Write(p) -} - -func (grw gzipResponseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) { - hijacker, ok := grw.ResponseWriter.(http.Hijacker) - if !ok { - return nil, nil, fmt.Errorf("the ResponseWriter doesn't support the Hijacker interface") - } - return hijacker.Hijack() -} diff --git a/vendor/github.com/go-macaron/inject/LICENSE b/vendor/github.com/go-macaron/inject/LICENSE deleted file mode 100644 index 37ec93a14..000000000 --- a/vendor/github.com/go-macaron/inject/LICENSE +++ /dev/null @@ -1,191 +0,0 @@ -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and -distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright -owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities -that control, are controlled by, or are under common control with that entity. -For the purposes of this definition, "control" means (i) the power, direct or -indirect, to cause the direction or management of such entity, whether by -contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the -outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising -permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including -but not limited to software source code, documentation source, and configuration -files. - -"Object" form shall mean any form resulting from mechanical transformation or -translation of a Source form, including but not limited to compiled object code, -generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made -available under the License, as indicated by a copyright notice that is included -in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that -is based on (or derived from) the Work and for which the editorial revisions, -annotations, elaborations, or other modifications represent, as a whole, an -original work of authorship. For the purposes of this License, Derivative Works -shall not include works that remain separable from, or merely link (or bind by -name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version -of the Work and any modifications or additions to that Work or Derivative Works -thereof, that is intentionally submitted to Licensor for inclusion in the Work -by the copyright owner or by an individual or Legal Entity authorized to submit -on behalf of the copyright owner. For the purposes of this definition, -"submitted" means any form of electronic, verbal, or written communication sent -to the Licensor or its representatives, including but not limited to -communication on electronic mailing lists, source code control systems, and -issue tracking systems that are managed by, or on behalf of, the Licensor for -the purpose of discussing and improving the Work, but excluding communication -that is conspicuously marked or otherwise designated in writing by the copyright -owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf -of whom a Contribution has been received by Licensor and subsequently -incorporated within the Work. - -2. Grant of Copyright License. - -Subject to the terms and conditions of this License, each Contributor hereby -grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, -irrevocable copyright license to reproduce, prepare Derivative Works of, -publicly display, publicly perform, sublicense, and distribute the Work and such -Derivative Works in Source or Object form. - -3. Grant of Patent License. - -Subject to the terms and conditions of this License, each Contributor hereby -grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, -irrevocable (except as stated in this section) patent license to make, have -made, use, offer to sell, sell, import, and otherwise transfer the Work, where -such license applies only to those patent claims licensable by such Contributor -that are necessarily infringed by their Contribution(s) alone or by combination -of their Contribution(s) with the Work to which such Contribution(s) was -submitted. If You institute patent litigation against any entity (including a -cross-claim or counterclaim in a lawsuit) alleging that the Work or a -Contribution incorporated within the Work constitutes direct or contributory -patent infringement, then any patent licenses granted to You under this License -for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. - -You may reproduce and distribute copies of the Work or Derivative Works thereof -in any medium, with or without modifications, and in Source or Object form, -provided that You meet the following conditions: - -You must give any other recipients of the Work or Derivative Works a copy of -this License; and -You must cause any modified files to carry prominent notices stating that You -changed the files; and -You must retain, in the Source form of any Derivative Works that You distribute, -all copyright, patent, trademark, and attribution notices from the Source form -of the Work, excluding those notices that do not pertain to any part of the -Derivative Works; and -If the Work includes a "NOTICE" text file as part of its distribution, then any -Derivative Works that You distribute must include a readable copy of the -attribution notices contained within such NOTICE file, excluding those notices -that do not pertain to any part of the Derivative Works, in at least one of the -following places: within a NOTICE text file distributed as part of the -Derivative Works; within the Source form or documentation, if provided along -with the Derivative Works; or, within a display generated by the Derivative -Works, if and wherever such third-party notices normally appear. The contents of -the NOTICE file are for informational purposes only and do not modify the -License. You may add Your own attribution notices within Derivative Works that -You distribute, alongside or as an addendum to the NOTICE text from the Work, -provided that such additional attribution notices cannot be construed as -modifying the License. -You may add Your own copyright statement to Your modifications and may provide -additional or different license terms and conditions for use, reproduction, or -distribution of Your modifications, or for any such Derivative Works as a whole, -provided Your use, reproduction, and distribution of the Work otherwise complies -with the conditions stated in this License. - -5. Submission of Contributions. - -Unless You explicitly state otherwise, any Contribution intentionally submitted -for inclusion in the Work by You to the Licensor shall be under the terms and -conditions of this License, without any additional terms or conditions. -Notwithstanding the above, nothing herein shall supersede or modify the terms of -any separate license agreement you may have executed with Licensor regarding -such Contributions. - -6. Trademarks. - -This License does not grant permission to use the trade names, trademarks, -service marks, or product names of the Licensor, except as required for -reasonable and customary use in describing the origin of the Work and -reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. - -Unless required by applicable law or agreed to in writing, Licensor provides the -Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, -including, without limitation, any warranties or conditions of TITLE, -NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are -solely responsible for determining the appropriateness of using or -redistributing the Work and assume any risks associated with Your exercise of -permissions under this License. - -8. Limitation of Liability. - -In no event and under no legal theory, whether in tort (including negligence), -contract, or otherwise, unless required by applicable law (such as deliberate -and grossly negligent acts) or agreed to in writing, shall any Contributor be -liable to You for damages, including any direct, indirect, special, incidental, -or consequential damages of any character arising as a result of this License or -out of the use or inability to use the Work (including but not limited to -damages for loss of goodwill, work stoppage, computer failure or malfunction, or -any and all other commercial damages or losses), even if such Contributor has -been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. - -While redistributing the Work or Derivative Works thereof, You may choose to -offer, and charge a fee for, acceptance of support, warranty, indemnity, or -other liability obligations and/or rights consistent with this License. However, -in accepting such obligations, You may act only on Your own behalf and on Your -sole responsibility, not on behalf of any other Contributor, and only if You -agree to indemnify, defend, and hold each Contributor harmless for any liability -incurred by, or claims asserted against, such Contributor by reason of your -accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work - -To apply the Apache License to your work, attach the following boilerplate -notice, with the fields enclosed by brackets "[]" replaced with your own -identifying information. (Don't include the brackets!) The text should be -enclosed in the appropriate comment syntax for the file format. We also -recommend that a file or class name and description of purpose be included on -the same "printed page" as the copyright notice for easier identification within -third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/github.com/go-macaron/inject/README.md b/vendor/github.com/go-macaron/inject/README.md deleted file mode 100644 index c65c76955..000000000 --- a/vendor/github.com/go-macaron/inject/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# inject [![Build Status](https://travis-ci.org/go-macaron/inject.svg?branch=master)](https://travis-ci.org/go-macaron/inject) [![](http://gocover.io/_badge/github.com/go-macaron/inject)](http://gocover.io/github.com/go-macaron/inject) - -Package inject provides utilities for mapping and injecting dependencies in various ways. - -**This a modified version of [codegangsta/inject](https://github.com/codegangsta/inject) for special purpose of Macaron** - -**Please use the original version if you need dependency injection feature** - -## License - -This project is under the Apache License, Version 2.0. See the [LICENSE](LICENSE) file for the full license text. \ No newline at end of file diff --git a/vendor/github.com/go-macaron/inject/inject.go b/vendor/github.com/go-macaron/inject/inject.go deleted file mode 100644 index 1c1f98eaa..000000000 --- a/vendor/github.com/go-macaron/inject/inject.go +++ /dev/null @@ -1,262 +0,0 @@ -// Copyright 2013 Jeremy Saenz -// Copyright 2015 The Macaron Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -// Package inject provides utilities for mapping and injecting dependencies in various ways. -package inject - -import ( - "fmt" - "reflect" -) - -// Injector represents an interface for mapping and injecting dependencies into structs -// and function arguments. -type Injector interface { - Applicator - Invoker - TypeMapper - // SetParent sets the parent of the injector. If the injector cannot find a - // dependency in its Type map it will check its parent before returning an - // error. - SetParent(Injector) -} - -// Applicator represents an interface for mapping dependencies to a struct. -type Applicator interface { - // Maps dependencies in the Type map to each field in the struct - // that is tagged with 'inject'. Returns an error if the injection - // fails. - Apply(interface{}) error -} - -// Invoker represents an interface for calling functions via reflection. -type Invoker interface { - // Invoke attempts to call the interface{} provided as a function, - // providing dependencies for function arguments based on Type. Returns - // a slice of reflect.Value representing the returned values of the function. - // Returns an error if the injection fails. - Invoke(interface{}) ([]reflect.Value, error) -} - -// FastInvoker represents an interface in order to avoid the calling function via reflection. -// -// example: -// type handlerFuncHandler func(http.ResponseWriter, *http.Request) error -// func (f handlerFuncHandler)Invoke([]interface{}) ([]reflect.Value, error){ -// ret := f(p[0].(http.ResponseWriter), p[1].(*http.Request)) -// return []reflect.Value{reflect.ValueOf(ret)}, nil -// } -// -// type funcHandler func(int, string) -// func (f funcHandler)Invoke([]interface{}) ([]reflect.Value, error){ -// f(p[0].(int), p[1].(string)) -// return nil, nil -// } -type FastInvoker interface { - // Invoke attempts to call the ordinary functions. If f is a function - // with the appropriate signature, f.Invoke([]interface{}) is a Call that calls f. - // Returns a slice of reflect.Value representing the returned values of the function. - // Returns an error if the injection fails. - Invoke([]interface{}) ([]reflect.Value, error) -} - -// IsFastInvoker check interface is FastInvoker -func IsFastInvoker(h interface{}) bool { - _, ok := h.(FastInvoker) - return ok -} - -// TypeMapper represents an interface for mapping interface{} values based on type. -type TypeMapper interface { - // Maps the interface{} value based on its immediate type from reflect.TypeOf. - Map(interface{}) TypeMapper - // Maps the interface{} value based on the pointer of an Interface provided. - // This is really only useful for mapping a value as an interface, as interfaces - // cannot at this time be referenced directly without a pointer. - MapTo(interface{}, interface{}) TypeMapper - // Provides a possibility to directly insert a mapping based on type and value. - // This makes it possible to directly map type arguments not possible to instantiate - // with reflect like unidirectional channels. - Set(reflect.Type, reflect.Value) TypeMapper - // Returns the Value that is mapped to the current type. Returns a zeroed Value if - // the Type has not been mapped. - GetVal(reflect.Type) reflect.Value -} - -type injector struct { - values map[reflect.Type]reflect.Value - parent Injector -} - -// InterfaceOf dereferences a pointer to an Interface type. -// It panics if value is not an pointer to an interface. -func InterfaceOf(value interface{}) reflect.Type { - t := reflect.TypeOf(value) - - for t.Kind() == reflect.Ptr { - t = t.Elem() - } - - if t.Kind() != reflect.Interface { - panic("Called inject.InterfaceOf with a value that is not a pointer to an interface. (*MyInterface)(nil)") - } - - return t -} - -// New returns a new Injector. -func New() Injector { - return &injector{ - values: make(map[reflect.Type]reflect.Value), - } -} - -// Invoke attempts to call the interface{} provided as a function, -// providing dependencies for function arguments based on Type. -// Returns a slice of reflect.Value representing the returned values of the function. -// Returns an error if the injection fails. -// It panics if f is not a function -func (inj *injector) Invoke(f interface{}) ([]reflect.Value, error) { - t := reflect.TypeOf(f) - switch v := f.(type) { - case FastInvoker: - return inj.fastInvoke(v, t, t.NumIn()) - default: - return inj.callInvoke(f, t, t.NumIn()) - } -} - -func (inj *injector) fastInvoke(f FastInvoker, t reflect.Type, numIn int) ([]reflect.Value, error) { - var in []interface{} - if numIn > 0 { - in = make([]interface{}, numIn) // Panic if t is not kind of Func - var argType reflect.Type - var val reflect.Value - for i := 0; i < numIn; i++ { - argType = t.In(i) - val = inj.GetVal(argType) - if !val.IsValid() { - return nil, fmt.Errorf("Value not found for type %v", argType) - } - - in[i] = val.Interface() - } - } - return f.Invoke(in) -} - -// callInvoke reflect.Value.Call -func (inj *injector) callInvoke(f interface{}, t reflect.Type, numIn int) ([]reflect.Value, error) { - var in []reflect.Value - if numIn > 0 { - in = make([]reflect.Value, numIn) - var argType reflect.Type - var val reflect.Value - for i := 0; i < numIn; i++ { - argType = t.In(i) - val = inj.GetVal(argType) - if !val.IsValid() { - return nil, fmt.Errorf("Value not found for type %v", argType) - } - - in[i] = val - } - } - return reflect.ValueOf(f).Call(in), nil -} - -// Maps dependencies in the Type map to each field in the struct -// that is tagged with 'inject'. -// Returns an error if the injection fails. -func (inj *injector) Apply(val interface{}) error { - v := reflect.ValueOf(val) - - for v.Kind() == reflect.Ptr { - v = v.Elem() - } - - if v.Kind() != reflect.Struct { - return nil // Should not panic here ? - } - - t := v.Type() - - for i := 0; i < v.NumField(); i++ { - f := v.Field(i) - structField := t.Field(i) - if f.CanSet() && (structField.Tag == "inject" || structField.Tag.Get("inject") != "") { - ft := f.Type() - v := inj.GetVal(ft) - if !v.IsValid() { - return fmt.Errorf("Value not found for type %v", ft) - } - - f.Set(v) - } - - } - - return nil -} - -// Maps the concrete value of val to its dynamic type using reflect.TypeOf, -// It returns the TypeMapper registered in. -func (i *injector) Map(val interface{}) TypeMapper { - i.values[reflect.TypeOf(val)] = reflect.ValueOf(val) - return i -} - -func (i *injector) MapTo(val interface{}, ifacePtr interface{}) TypeMapper { - i.values[InterfaceOf(ifacePtr)] = reflect.ValueOf(val) - return i -} - -// Maps the given reflect.Type to the given reflect.Value and returns -// the Typemapper the mapping has been registered in. -func (i *injector) Set(typ reflect.Type, val reflect.Value) TypeMapper { - i.values[typ] = val - return i -} - -func (i *injector) GetVal(t reflect.Type) reflect.Value { - val := i.values[t] - - if val.IsValid() { - return val - } - - // no concrete types found, try to find implementors - // if t is an interface - if t.Kind() == reflect.Interface { - for k, v := range i.values { - if k.Implements(t) { - val = v - break - } - } - } - - // Still no type found, try to look it up on the parent - if !val.IsValid() && i.parent != nil { - val = i.parent.GetVal(t) - } - - return val - -} - -func (i *injector) SetParent(parent Injector) { - i.parent = parent -} diff --git a/vendor/github.com/go-macaron/toolbox/LICENSE b/vendor/github.com/go-macaron/toolbox/LICENSE deleted file mode 100644 index 8405e89a0..000000000 --- a/vendor/github.com/go-macaron/toolbox/LICENSE +++ /dev/null @@ -1,191 +0,0 @@ -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and -distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright -owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities -that control, are controlled by, or are under common control with that entity. -For the purposes of this definition, "control" means (i) the power, direct or -indirect, to cause the direction or management of such entity, whether by -contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the -outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising -permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including -but not limited to software source code, documentation source, and configuration -files. - -"Object" form shall mean any form resulting from mechanical transformation or -translation of a Source form, including but not limited to compiled object code, -generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made -available under the License, as indicated by a copyright notice that is included -in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that -is based on (or derived from) the Work and for which the editorial revisions, -annotations, elaborations, or other modifications represent, as a whole, an -original work of authorship. For the purposes of this License, Derivative Works -shall not include works that remain separable from, or merely link (or bind by -name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version -of the Work and any modifications or additions to that Work or Derivative Works -thereof, that is intentionally submitted to Licensor for inclusion in the Work -by the copyright owner or by an individual or Legal Entity authorized to submit -on behalf of the copyright owner. For the purposes of this definition, -"submitted" means any form of electronic, verbal, or written communication sent -to the Licensor or its representatives, including but not limited to -communication on electronic mailing lists, source code control systems, and -issue tracking systems that are managed by, or on behalf of, the Licensor for -the purpose of discussing and improving the Work, but excluding communication -that is conspicuously marked or otherwise designated in writing by the copyright -owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf -of whom a Contribution has been received by Licensor and subsequently -incorporated within the Work. - -2. Grant of Copyright License. - -Subject to the terms and conditions of this License, each Contributor hereby -grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, -irrevocable copyright license to reproduce, prepare Derivative Works of, -publicly display, publicly perform, sublicense, and distribute the Work and such -Derivative Works in Source or Object form. - -3. Grant of Patent License. - -Subject to the terms and conditions of this License, each Contributor hereby -grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, -irrevocable (except as stated in this section) patent license to make, have -made, use, offer to sell, sell, import, and otherwise transfer the Work, where -such license applies only to those patent claims licensable by such Contributor -that are necessarily infringed by their Contribution(s) alone or by combination -of their Contribution(s) with the Work to which such Contribution(s) was -submitted. If You institute patent litigation against any entity (including a -cross-claim or counterclaim in a lawsuit) alleging that the Work or a -Contribution incorporated within the Work constitutes direct or contributory -patent infringement, then any patent licenses granted to You under this License -for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. - -You may reproduce and distribute copies of the Work or Derivative Works thereof -in any medium, with or without modifications, and in Source or Object form, -provided that You meet the following conditions: - -You must give any other recipients of the Work or Derivative Works a copy of -this License; and -You must cause any modified files to carry prominent notices stating that You -changed the files; and -You must retain, in the Source form of any Derivative Works that You distribute, -all copyright, patent, trademark, and attribution notices from the Source form -of the Work, excluding those notices that do not pertain to any part of the -Derivative Works; and -If the Work includes a "NOTICE" text file as part of its distribution, then any -Derivative Works that You distribute must include a readable copy of the -attribution notices contained within such NOTICE file, excluding those notices -that do not pertain to any part of the Derivative Works, in at least one of the -following places: within a NOTICE text file distributed as part of the -Derivative Works; within the Source form or documentation, if provided along -with the Derivative Works; or, within a display generated by the Derivative -Works, if and wherever such third-party notices normally appear. The contents of -the NOTICE file are for informational purposes only and do not modify the -License. You may add Your own attribution notices within Derivative Works that -You distribute, alongside or as an addendum to the NOTICE text from the Work, -provided that such additional attribution notices cannot be construed as -modifying the License. -You may add Your own copyright statement to Your modifications and may provide -additional or different license terms and conditions for use, reproduction, or -distribution of Your modifications, or for any such Derivative Works as a whole, -provided Your use, reproduction, and distribution of the Work otherwise complies -with the conditions stated in this License. - -5. Submission of Contributions. - -Unless You explicitly state otherwise, any Contribution intentionally submitted -for inclusion in the Work by You to the Licensor shall be under the terms and -conditions of this License, without any additional terms or conditions. -Notwithstanding the above, nothing herein shall supersede or modify the terms of -any separate license agreement you may have executed with Licensor regarding -such Contributions. - -6. Trademarks. - -This License does not grant permission to use the trade names, trademarks, -service marks, or product names of the Licensor, except as required for -reasonable and customary use in describing the origin of the Work and -reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. - -Unless required by applicable law or agreed to in writing, Licensor provides the -Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, -including, without limitation, any warranties or conditions of TITLE, -NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are -solely responsible for determining the appropriateness of using or -redistributing the Work and assume any risks associated with Your exercise of -permissions under this License. - -8. Limitation of Liability. - -In no event and under no legal theory, whether in tort (including negligence), -contract, or otherwise, unless required by applicable law (such as deliberate -and grossly negligent acts) or agreed to in writing, shall any Contributor be -liable to You for damages, including any direct, indirect, special, incidental, -or consequential damages of any character arising as a result of this License or -out of the use or inability to use the Work (including but not limited to -damages for loss of goodwill, work stoppage, computer failure or malfunction, or -any and all other commercial damages or losses), even if such Contributor has -been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. - -While redistributing the Work or Derivative Works thereof, You may choose to -offer, and charge a fee for, acceptance of support, warranty, indemnity, or -other liability obligations and/or rights consistent with this License. However, -in accepting such obligations, You may act only on Your own behalf and on Your -sole responsibility, not on behalf of any other Contributor, and only if You -agree to indemnify, defend, and hold each Contributor harmless for any liability -incurred by, or claims asserted against, such Contributor by reason of your -accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work - -To apply the Apache License to your work, attach the following boilerplate -notice, with the fields enclosed by brackets "[]" replaced with your own -identifying information. (Don't include the brackets!) The text should be -enclosed in the appropriate comment syntax for the file format. We also -recommend that a file or class name and description of purpose be included on -the same "printed page" as the copyright notice for easier identification within -third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file diff --git a/vendor/github.com/go-macaron/toolbox/README.md b/vendor/github.com/go-macaron/toolbox/README.md deleted file mode 100644 index 2142cc55e..000000000 --- a/vendor/github.com/go-macaron/toolbox/README.md +++ /dev/null @@ -1,110 +0,0 @@ -toolbox -======= - -Middleware toolbox provides health chcek, pprof, profile and statistic services for [Macaron](https://github.com/go-macaron/macaron). - -[API Reference](https://gowalker.org/github.com/go-macaron/toolbox) - -### Installation - - go get github.com/go-macaron/toolbox - -## Usage - -```go -// main.go -import ( - "gopkg.in/macaron.v1" - "github.com/go-macaron/toolbox" -) - -func main() { - m := macaron.Classic() - m.Use(toolbox.Toolboxer(m)) - m.Run() -} -``` - -Open your browser and visit `http://localhost:4000/debug` to see the effects. - -## Options - -`toolbox.Toolboxer` comes with a variety of configuration options: - -```go -type dummyChecker struct { -} - -func (dc *dummyChecker) Desc() string { - return "Dummy checker" -} - -func (dc *dummyChecker) Check() error { - return nil -} - -// ... -m.Use(toolbox.Toolboxer(m, toolbox.Options{ - URLPrefix: "/debug", // URL prefix for toolbox dashboard. - HealthCheckURL: "/healthcheck", // URL for health check request. - HealthCheckers: []HealthChecker{ - new(dummyChecker), - }, // Health checkers. - HealthCheckFuncs: []*toolbox.HealthCheckFuncDesc{ - &toolbox.HealthCheckFuncDesc{ - Desc: "Database connection", - Func: func() error { return "OK" }, - }, - }, // Health check functions. - PprofURLPrefix: "/debug/pprof/", // URL prefix of pprof. - ProfileURLPrefix: "/debug/profile/", // URL prefix of profile. - ProfilePath: "profile", // Path store profile files. -})) -// ... -``` - -## Route Statistic - -Toolbox also comes with a route call statistic functionality: - -```go -import ( - "os" - "time" - //... - "github.com/go-macaron/toolbox" -) - -func main() { - //... - m.Get("/", func(t toolbox.Toolbox) { - start := time.Now() - - // Other operations. - - t.AddStatistics("GET", "/", time.Since(start)) - }) - - m.Get("/dump", func(t toolbox.Toolbox) { - t.GetMap(os.Stdout) - }) -} -``` - -Output take from test: - -``` -+---------------------------------------------------+------------+------------------+------------------+------------------+------------------+------------------+ -| Request URL | Method | Times | Total Used(s) | Max Used(μs) | Min Used(μs) | Avg Used(μs) | -+---------------------------------------------------+------------+------------------+------------------+------------------+------------------+------------------+ -| /api/user | POST | 2 | 0.000122 | 120.000000 | 2.000000 | 61.000000 | -| /api/user | GET | 1 | 0.000013 | 13.000000 | 13.000000 | 13.000000 | -| /api/user | DELETE | 1 | 0.000001 | 1.400000 | 1.400000 | 1.400000 | -| /api/admin | POST | 1 | 0.000014 | 14.000000 | 14.000000 | 14.000000 | -| /api/user/unknwon | POST | 1 | 0.000012 | 12.000000 | 12.000000 | 12.000000 | -+---------------------------------------------------+------------+------------------+------------------+------------------+------------------+------------------+ -``` - -## License - -This project is under Apache v2 License. See the [LICENSE](LICENSE) file for the full license text. \ No newline at end of file diff --git a/vendor/github.com/go-macaron/toolbox/healthcheck.go b/vendor/github.com/go-macaron/toolbox/healthcheck.go deleted file mode 100644 index 25b5bdfe2..000000000 --- a/vendor/github.com/go-macaron/toolbox/healthcheck.go +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright 2013 Beego Authors -// Copyright 2014 The Macaron Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package toolbox - -import ( - "bytes" -) - -// HealthChecker represents a health check instance. -type HealthChecker interface { - Desc() string - Check() error -} - -// HealthCheckFunc represents a callable function for health check. -type HealthCheckFunc func() error - -// HealthCheckFunc represents a callable function for health check with description. -type HealthCheckFuncDesc struct { - Desc string - Func HealthCheckFunc -} - -type healthCheck struct { - desc string - HealthChecker - check HealthCheckFunc // Not nil if add job as a function. -} - -// AddHealthCheck adds new health check job. -func (t *toolbox) AddHealthCheck(hc HealthChecker) { - t.healthCheckJobs = append(t.healthCheckJobs, &healthCheck{ - HealthChecker: hc, - }) -} - -// AddHealthCheckFunc adds a function as a new health check job. -func (t *toolbox) AddHealthCheckFunc(desc string, fn HealthCheckFunc) { - t.healthCheckJobs = append(t.healthCheckJobs, &healthCheck{ - desc: desc, - check: fn, - }) -} - -func (t *toolbox) handleHealthCheck() string { - if len(t.healthCheckJobs) == 0 { - return "no health check jobs" - } - - var buf bytes.Buffer - var err error - for _, job := range t.healthCheckJobs { - buf.WriteString("* ") - if job.check != nil { - buf.WriteString(job.desc) - err = job.check() - } else { - buf.WriteString(job.Desc()) - err = job.Check() - } - buf.WriteString(": ") - if err == nil { - buf.WriteString("OK") - } else { - buf.WriteString(err.Error()) - } - buf.WriteString("\n") - } - return buf.String() -} diff --git a/vendor/github.com/go-macaron/toolbox/profile.go b/vendor/github.com/go-macaron/toolbox/profile.go deleted file mode 100644 index 1eb2cdfe5..000000000 --- a/vendor/github.com/go-macaron/toolbox/profile.go +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright 2013 Beego Authors -// Copyright 2014 The Macaron Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package toolbox - -import ( - "bytes" - "errors" - "fmt" - "io" - "os" - "path" - "runtime" - "runtime/debug" - "runtime/pprof" - "time" - - "github.com/Unknwon/com" - "gopkg.in/macaron.v1" -) - -var ( - profilePath string - pid int - startTime = time.Now() - inCPUProfile bool -) - -// StartCPUProfile starts CPU profile monitor. -func StartCPUProfile() error { - if inCPUProfile { - return errors.New("CPU profile has alreday been started!") - } - inCPUProfile = true - - os.MkdirAll(profilePath, os.ModePerm) - f, err := os.Create(path.Join(profilePath, "cpu-"+com.ToStr(pid)+".pprof")) - if err != nil { - panic("fail to record CPU profile: " + err.Error()) - } - pprof.StartCPUProfile(f) - return nil -} - -// StopCPUProfile stops CPU profile monitor. -func StopCPUProfile() error { - if !inCPUProfile { - return errors.New("CPU profile hasn't been started!") - } - pprof.StopCPUProfile() - inCPUProfile = false - return nil -} - -func init() { - pid = os.Getpid() -} - -// DumpMemProf dumps memory profile in pprof. -func DumpMemProf(w io.Writer) { - pprof.WriteHeapProfile(w) -} - -func dumpMemProf() { - os.MkdirAll(profilePath, os.ModePerm) - f, err := os.Create(path.Join(profilePath, "mem-"+com.ToStr(pid)+".memprof")) - if err != nil { - panic("fail to record memory profile: " + err.Error()) - } - runtime.GC() - DumpMemProf(f) - f.Close() -} - -func avg(items []time.Duration) time.Duration { - var sum time.Duration - for _, item := range items { - sum += item - } - return time.Duration(int64(sum) / int64(len(items))) -} - -func dumpGC(memStats *runtime.MemStats, gcstats *debug.GCStats, w io.Writer) { - - if gcstats.NumGC > 0 { - lastPause := gcstats.Pause[0] - elapsed := time.Now().Sub(startTime) - overhead := float64(gcstats.PauseTotal) / float64(elapsed) * 100 - allocatedRate := float64(memStats.TotalAlloc) / elapsed.Seconds() - - fmt.Fprintf(w, "NumGC:%d Pause:%s Pause(Avg):%s Overhead:%3.2f%% Alloc:%s Sys:%s Alloc(Rate):%s/s Histogram:%s %s %s \n", - gcstats.NumGC, - com.ToStr(lastPause), - com.ToStr(avg(gcstats.Pause)), - overhead, - com.HumaneFileSize(memStats.Alloc), - com.HumaneFileSize(memStats.Sys), - com.HumaneFileSize(uint64(allocatedRate)), - com.ToStr(gcstats.PauseQuantiles[94]), - com.ToStr(gcstats.PauseQuantiles[98]), - com.ToStr(gcstats.PauseQuantiles[99])) - } else { - // while GC has disabled - elapsed := time.Now().Sub(startTime) - allocatedRate := float64(memStats.TotalAlloc) / elapsed.Seconds() - - fmt.Fprintf(w, "Alloc:%s Sys:%s Alloc(Rate):%s/s\n", - com.HumaneFileSize(memStats.Alloc), - com.HumaneFileSize(memStats.Sys), - com.HumaneFileSize(uint64(allocatedRate))) - } -} - -// DumpGCSummary dumps GC information to io.Writer -func DumpGCSummary(w io.Writer) { - memStats := &runtime.MemStats{} - runtime.ReadMemStats(memStats) - gcstats := &debug.GCStats{PauseQuantiles: make([]time.Duration, 100)} - debug.ReadGCStats(gcstats) - - dumpGC(memStats, gcstats, w) -} - -func handleProfile(ctx *macaron.Context) string { - switch ctx.Query("op") { - case "startcpu": - if err := StartCPUProfile(); err != nil { - return err.Error() - } - case "stopcpu": - if err := StopCPUProfile(); err != nil { - return err.Error() - } - case "mem": - dumpMemProf() - case "gc": - var buf bytes.Buffer - DumpGCSummary(&buf) - return string(buf.Bytes()) - default: - return fmt.Sprintf(`

Available operations:

-
    -
  1. Start CPU profile
  2. -
  3. Stop CPU profile
  4. -
  5. Dump memory profile
  6. -
  7. Dump GC summary
  8. -
`, opt.ProfileURLPrefix) - } - ctx.Redirect(opt.ProfileURLPrefix) - return "" -} diff --git a/vendor/github.com/go-macaron/toolbox/statistic.go b/vendor/github.com/go-macaron/toolbox/statistic.go deleted file mode 100644 index 47e6ab23e..000000000 --- a/vendor/github.com/go-macaron/toolbox/statistic.go +++ /dev/null @@ -1,138 +0,0 @@ -// Copyright 2013 Beego Authors -// Copyright 2014 The Macaron Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package toolbox - -import ( - "encoding/json" - "fmt" - "io" - "strings" - "sync" - "time" -) - -// Statistics struct -type Statistics struct { - RequestUrl string - RequestNum int64 - MinTime time.Duration - MaxTime time.Duration - TotalTime time.Duration -} - -// UrlMap contains several statistics struct to log different data -type UrlMap struct { - lock sync.RWMutex - LengthLimit int // limit the urlmap's length if it's equal to 0 there's no limit - urlmap map[string]map[string]*Statistics -} - -// add statistics task. -// it needs request method, request url and statistics time duration -func (m *UrlMap) AddStatistics(requestMethod, requestUrl string, requesttime time.Duration) { - m.lock.Lock() - defer m.lock.Unlock() - - if method, ok := m.urlmap[requestUrl]; ok { - if s, ok := method[requestMethod]; ok { - s.RequestNum += 1 - if s.MaxTime < requesttime { - s.MaxTime = requesttime - } - if s.MinTime > requesttime { - s.MinTime = requesttime - } - s.TotalTime += requesttime - } else { - nb := &Statistics{ - RequestUrl: requestUrl, - RequestNum: 1, - MinTime: requesttime, - MaxTime: requesttime, - TotalTime: requesttime, - } - m.urlmap[requestUrl][requestMethod] = nb - } - - } else { - if m.LengthLimit > 0 && m.LengthLimit <= len(m.urlmap) { - return - } - methodmap := make(map[string]*Statistics) - nb := &Statistics{ - RequestUrl: requestUrl, - RequestNum: 1, - MinTime: requesttime, - MaxTime: requesttime, - TotalTime: requesttime, - } - methodmap[requestMethod] = nb - m.urlmap[requestUrl] = methodmap - } -} - -// put url statistics result in io.Writer -func (m *UrlMap) GetMap(w io.Writer) { - m.lock.RLock() - defer m.lock.RUnlock() - - sep := fmt.Sprintf("+%s+%s+%s+%s+%s+%s+%s+\n", strings.Repeat("-", 51), strings.Repeat("-", 12), - strings.Repeat("-", 18), strings.Repeat("-", 18), strings.Repeat("-", 18), strings.Repeat("-", 18), strings.Repeat("-", 18)) - fmt.Fprintf(w, sep) - fmt.Fprintf(w, "| % -50s| % -10s | % -16s | % -16s | % -16s | % -16s | % -16s |\n", "Request URL", "Method", "Times", "Total Used(s)", "Max Used(μs)", "Min Used(μs)", "Avg Used(μs)") - fmt.Fprintf(w, sep) - - for k, v := range m.urlmap { - for kk, vv := range v { - fmt.Fprintf(w, "| % -50s| % -10s | % 16d | % 16f | % 16.6f | % 16.6f | % 16.6f |\n", k, - kk, vv.RequestNum, vv.TotalTime.Seconds(), float64(vv.MaxTime.Nanoseconds())/1000, - float64(vv.MinTime.Nanoseconds())/1000, float64(time.Duration(int64(vv.TotalTime)/vv.RequestNum).Nanoseconds())/1000, - ) - } - } - fmt.Fprintf(w, sep) -} - -type URLMapInfo struct { - URL string `json:"url"` - Method string `json:"method"` - Times int64 `json:"times"` - TotalUsed float64 `json:"total_used"` - MaxUsed float64 `json:"max_used"` - MinUsed float64 `json:"min_used"` - AvgUsed float64 `json:"avg_used"` -} - -func (m *UrlMap) JSON(w io.Writer) { - infos := make([]*URLMapInfo, 0, len(m.urlmap)) - for k, v := range m.urlmap { - for kk, vv := range v { - infos = append(infos, &URLMapInfo{ - URL: k, - Method: kk, - Times: vv.RequestNum, - TotalUsed: vv.TotalTime.Seconds(), - MaxUsed: float64(vv.MaxTime.Nanoseconds()) / 1000, - MinUsed: float64(vv.MinTime.Nanoseconds()) / 1000, - AvgUsed: float64(time.Duration(int64(vv.TotalTime)/vv.RequestNum).Nanoseconds()) / 1000, - }) - } - } - - if err := json.NewEncoder(w).Encode(infos); err != nil { - panic("URLMap.JSON: " + err.Error()) - } -} diff --git a/vendor/github.com/go-macaron/toolbox/toolbox.go b/vendor/github.com/go-macaron/toolbox/toolbox.go deleted file mode 100644 index 46783c447..000000000 --- a/vendor/github.com/go-macaron/toolbox/toolbox.go +++ /dev/null @@ -1,154 +0,0 @@ -// Copyright 2014 The Macaron Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -// Package toolbox is a middleware that provides health check, pprof, profile and statistic services for Macaron. -package toolbox - -import ( - "fmt" - "io" - "net/http" - "net/http/pprof" - "path" - "time" - - "gopkg.in/macaron.v1" -) - -const _VERSION = "0.1.3" - -func Version() string { - return _VERSION -} - -// Toolbox represents a tool box service for Macaron instance. -type Toolbox interface { - AddHealthCheck(HealthChecker) - AddHealthCheckFunc(string, HealthCheckFunc) - AddStatistics(string, string, time.Duration) - GetMap(io.Writer) - JSON(io.Writer) -} - -type toolbox struct { - *UrlMap - healthCheckJobs []*healthCheck -} - -// Options represents a struct for specifying configuration options for the Toolbox middleware. -type Options struct { - // URL prefix for toolbox dashboard. Default is "/debug". - URLPrefix string - // URL for health check request. Default is "/healthcheck". - HealthCheckURL string - // Health checkers. - HealthCheckers []HealthChecker - // Health check functions. - HealthCheckFuncs []*HealthCheckFuncDesc - // URL for URL map json. Default is "/urlmap.json". - URLMapPrefix string - // URL prefix of pprof. Default is "/debug/pprof/". - PprofURLPrefix string - // URL prefix of profile. Default is "/debug/profile/". - ProfileURLPrefix string - // Path store profile files. Default is "profile". - ProfilePath string -} - -var opt Options - -func prepareOptions(options []Options) { - if len(options) > 0 { - opt = options[0] - } - - // Defaults. - if len(opt.URLPrefix) == 0 { - opt.URLPrefix = "/debug" - } - if len(opt.HealthCheckURL) == 0 { - opt.HealthCheckURL = "/healthcheck" - } - if len(opt.URLMapPrefix) == 0 { - opt.URLMapPrefix = "/urlmap.json" - } - if len(opt.PprofURLPrefix) == 0 { - opt.PprofURLPrefix = "/debug/pprof/" - } else if opt.PprofURLPrefix[len(opt.PprofURLPrefix)-1] != '/' { - opt.PprofURLPrefix += "/" - } - if len(opt.ProfileURLPrefix) == 0 { - opt.ProfileURLPrefix = "/debug/profile/" - } else if opt.ProfileURLPrefix[len(opt.ProfileURLPrefix)-1] != '/' { - opt.ProfileURLPrefix += "/" - } - if len(opt.ProfilePath) == 0 { - opt.ProfilePath = path.Join(macaron.Root, "profile") - } -} - -func dashboard(ctx *macaron.Context) string { - return fmt.Sprintf(`

Toolbox Index:

-
    -
  1. Pprof Information
  2. -
  3. Profile Operations
  4. -
`, opt.PprofURLPrefix, opt.ProfileURLPrefix) -} - -var _ Toolbox = &toolbox{} - -// Toolboxer is a middleware provides health check, pprof, profile and statistic services for your application. -func Toolboxer(m *macaron.Macaron, options ...Options) macaron.Handler { - prepareOptions(options) - t := &toolbox{ - healthCheckJobs: make([]*healthCheck, 0, len(opt.HealthCheckers)+len(opt.HealthCheckFuncs)), - } - - // Dashboard. - m.Get(opt.URLPrefix, dashboard) - - // Health check. - for _, hc := range opt.HealthCheckers { - t.AddHealthCheck(hc) - } - for _, fd := range opt.HealthCheckFuncs { - t.AddHealthCheckFunc(fd.Desc, fd.Func) - } - m.Route(opt.HealthCheckURL, "HEAD,GET", t.handleHealthCheck) - - // URL map. - m.Get(opt.URLMapPrefix, func(rw http.ResponseWriter) { - t.JSON(rw) - }) - - // Pprof. - m.Any(path.Join(opt.PprofURLPrefix, "cmdline"), pprof.Cmdline) - m.Any(path.Join(opt.PprofURLPrefix, "profile"), pprof.Profile) - m.Any(path.Join(opt.PprofURLPrefix, "symbol"), pprof.Symbol) - m.Any(opt.PprofURLPrefix, pprof.Index) - m.Any(path.Join(opt.PprofURLPrefix, "*"), pprof.Index) - - // Profile. - profilePath = opt.ProfilePath - m.Get(opt.ProfileURLPrefix, handleProfile) - - // Routes statistic. - t.UrlMap = &UrlMap{ - urlmap: make(map[string]map[string]*Statistics), - } - - return func(ctx *macaron.Context) { - ctx.MapTo(t, (*Toolbox)(nil)) - } -} diff --git a/vendor/github.com/go-sql-driver/mysql/AUTHORS b/vendor/github.com/go-sql-driver/mysql/AUTHORS deleted file mode 100644 index 100370758..000000000 --- a/vendor/github.com/go-sql-driver/mysql/AUTHORS +++ /dev/null @@ -1,57 +0,0 @@ -# This is the official list of Go-MySQL-Driver authors for copyright purposes. - -# If you are submitting a patch, please add your name or the name of the -# organization which holds the copyright to this list in alphabetical order. - -# Names should be added to this file as -# Name -# The email address is not required for organizations. -# Please keep the list sorted. - - -# Individual Persons - -Aaron Hopkins -Arne Hormann -Carlos Nieto -Chris Moos -Daniel Nichter -Daniël van Eeden -DisposaBoy -Egor Smolyakov -Frederick Mayle -Gustavo Kristic -Hanno Braun -Henri Yandell -Hirotaka Yamamoto -INADA Naoki -James Harr -Jian Zhen -Joshua Prunier -Julien Lefevre -Julien Schmidt -Kamil Dziedzic -Kevin Malachowski -Lennart Rudolph -Leonardo YongUk Kim -Luca Looz -Lucas Liu -Luke Scott -Michael Woolnough -Nicola Peduzzi -Olivier Mengué -Paul Bonser -Runrioter Wung -Soroush Pour -Stan Putrya -Stanley Gunawan -Xiangyu Hu -Xiaobing Jiang -Xiuming Chen -Zhenye Xie - -# Organizations - -Barracuda Networks, Inc. -Google Inc. -Stripe Inc. diff --git a/vendor/github.com/go-sql-driver/mysql/CHANGELOG.md b/vendor/github.com/go-sql-driver/mysql/CHANGELOG.md deleted file mode 100644 index 6bcad7eaa..000000000 --- a/vendor/github.com/go-sql-driver/mysql/CHANGELOG.md +++ /dev/null @@ -1,119 +0,0 @@ -## Version 1.3 (2016-12-01) - -Changes: - - - Go 1.1 is no longer supported - - Use decimals fields in MySQL to format time types (#249) - - Buffer optimizations (#269) - - TLS ServerName defaults to the host (#283) - - Refactoring (#400, #410, #437) - - Adjusted documentation for second generation CloudSQL (#485) - - Documented DSN system var quoting rules (#502) - - Made statement.Close() calls idempotent to avoid errors in Go 1.6+ (#512) - -New Features: - - - Enable microsecond resolution on TIME, DATETIME and TIMESTAMP (#249) - - Support for returning table alias on Columns() (#289, #359, #382) - - Placeholder interpolation, can be actived with the DSN parameter `interpolateParams=true` (#309, #318, #490) - - Support for uint64 parameters with high bit set (#332, #345) - - Cleartext authentication plugin support (#327) - - Exported ParseDSN function and the Config struct (#403, #419, #429) - - Read / Write timeouts (#401) - - Support for JSON field type (#414) - - Support for multi-statements and multi-results (#411, #431) - - DSN parameter to set the driver-side max_allowed_packet value manually (#489) - - Native password authentication plugin support (#494, #524) - -Bugfixes: - - - Fixed handling of queries without columns and rows (#255) - - Fixed a panic when SetKeepAlive() failed (#298) - - Handle ERR packets while reading rows (#321) - - Fixed reading NULL length-encoded integers in MySQL 5.6+ (#349) - - Fixed absolute paths support in LOAD LOCAL DATA INFILE (#356) - - Actually zero out bytes in handshake response (#378) - - Fixed race condition in registering LOAD DATA INFILE handler (#383) - - Fixed tests with MySQL 5.7.9+ (#380) - - QueryUnescape TLS config names (#397) - - Fixed "broken pipe" error by writing to closed socket (#390) - - Fixed LOAD LOCAL DATA INFILE buffering (#424) - - Fixed parsing of floats into float64 when placeholders are used (#434) - - Fixed DSN tests with Go 1.7+ (#459) - - Handle ERR packets while waiting for EOF (#473) - - Invalidate connection on error while discarding additional results (#513) - - Allow terminating packets of length 0 (#516) - - -## Version 1.2 (2014-06-03) - -Changes: - - - We switched back to a "rolling release". `go get` installs the current master branch again - - Version v1 of the driver will not be maintained anymore. Go 1.0 is no longer supported by this driver - - Exported errors to allow easy checking from application code - - Enabled TCP Keepalives on TCP connections - - Optimized INFILE handling (better buffer size calculation, lazy init, ...) - - The DSN parser also checks for a missing separating slash - - Faster binary date / datetime to string formatting - - Also exported the MySQLWarning type - - mysqlConn.Close returns the first error encountered instead of ignoring all errors - - writePacket() automatically writes the packet size to the header - - readPacket() uses an iterative approach instead of the recursive approach to merge splitted packets - -New Features: - - - `RegisterDial` allows the usage of a custom dial function to establish the network connection - - Setting the connection collation is possible with the `collation` DSN parameter. This parameter should be preferred over the `charset` parameter - - Logging of critical errors is configurable with `SetLogger` - - Google CloudSQL support - -Bugfixes: - - - Allow more than 32 parameters in prepared statements - - Various old_password fixes - - Fixed TestConcurrent test to pass Go's race detection - - Fixed appendLengthEncodedInteger for large numbers - - Renamed readLengthEnodedString to readLengthEncodedString and skipLengthEnodedString to skipLengthEncodedString (fixed typo) - - -## Version 1.1 (2013-11-02) - -Changes: - - - Go-MySQL-Driver now requires Go 1.1 - - Connections now use the collation `utf8_general_ci` by default. Adding `&charset=UTF8` to the DSN should not be necessary anymore - - Made closing rows and connections error tolerant. This allows for example deferring rows.Close() without checking for errors - - `[]byte(nil)` is now treated as a NULL value. Before, it was treated like an empty string / `[]byte("")` - - DSN parameter values must now be url.QueryEscape'ed. This allows text values to contain special characters, such as '&'. - - Use the IO buffer also for writing. This results in zero allocations (by the driver) for most queries - - Optimized the buffer for reading - - stmt.Query now caches column metadata - - New Logo - - Changed the copyright header to include all contributors - - Improved the LOAD INFILE documentation - - The driver struct is now exported to make the driver directly accessible - - Refactored the driver tests - - Added more benchmarks and moved all to a separate file - - Other small refactoring - -New Features: - - - Added *old_passwords* support: Required in some cases, but must be enabled by adding `allowOldPasswords=true` to the DSN since it is insecure - - Added a `clientFoundRows` parameter: Return the number of matching rows instead of the number of rows changed on UPDATEs - - Added TLS/SSL support: Use a TLS/SSL encrypted connection to the server. Custom TLS configs can be registered and used - -Bugfixes: - - - Fixed MySQL 4.1 support: MySQL 4.1 sends packets with lengths which differ from the specification - - Convert to DB timezone when inserting `time.Time` - - Splitted packets (more than 16MB) are now merged correctly - - Fixed false positive `io.EOF` errors when the data was fully read - - Avoid panics on reuse of closed connections - - Fixed empty string producing false nil values - - Fixed sign byte for positive TIME fields - - -## Version 1.0 (2013-05-14) - -Initial Release diff --git a/vendor/github.com/go-sql-driver/mysql/CONTRIBUTING.md b/vendor/github.com/go-sql-driver/mysql/CONTRIBUTING.md deleted file mode 100644 index 8fe16bcb4..000000000 --- a/vendor/github.com/go-sql-driver/mysql/CONTRIBUTING.md +++ /dev/null @@ -1,23 +0,0 @@ -# Contributing Guidelines - -## Reporting Issues - -Before creating a new Issue, please check first if a similar Issue [already exists](https://github.com/go-sql-driver/mysql/issues?state=open) or was [recently closed](https://github.com/go-sql-driver/mysql/issues?direction=desc&page=1&sort=updated&state=closed). - -## Contributing Code - -By contributing to this project, you share your code under the Mozilla Public License 2, as specified in the LICENSE file. -Don't forget to add yourself to the AUTHORS file. - -### Code Review - -Everyone is invited to review and comment on pull requests. -If it looks fine to you, comment with "LGTM" (Looks good to me). - -If changes are required, notice the reviewers with "PTAL" (Please take another look) after committing the fixes. - -Before merging the Pull Request, at least one [team member](https://github.com/go-sql-driver?tab=members) must have commented with "LGTM". - -## Development Ideas - -If you are looking for ideas for code contributions, please check our [Development Ideas](https://github.com/go-sql-driver/mysql/wiki/Development-Ideas) Wiki page. diff --git a/vendor/github.com/go-sql-driver/mysql/LICENSE b/vendor/github.com/go-sql-driver/mysql/LICENSE deleted file mode 100644 index 14e2f777f..000000000 --- a/vendor/github.com/go-sql-driver/mysql/LICENSE +++ /dev/null @@ -1,373 +0,0 @@ -Mozilla Public License Version 2.0 -================================== - -1. Definitions --------------- - -1.1. "Contributor" - means each individual or legal entity that creates, contributes to - the creation of, or owns Covered Software. - -1.2. "Contributor Version" - means the combination of the Contributions of others (if any) used - by a Contributor and that particular Contributor's Contribution. - -1.3. "Contribution" - means Covered Software of a particular Contributor. - -1.4. "Covered Software" - means Source Code Form to which the initial Contributor has attached - the notice in Exhibit A, the Executable Form of such Source Code - Form, and Modifications of such Source Code Form, in each case - including portions thereof. - -1.5. "Incompatible With Secondary Licenses" - means - - (a) that the initial Contributor has attached the notice described - in Exhibit B to the Covered Software; or - - (b) that the Covered Software was made available under the terms of - version 1.1 or earlier of the License, but not also under the - terms of a Secondary License. - -1.6. "Executable Form" - means any form of the work other than Source Code Form. - -1.7. "Larger Work" - means a work that combines Covered Software with other material, in - a separate file or files, that is not Covered Software. - -1.8. "License" - means this document. - -1.9. "Licensable" - means having the right to grant, to the maximum extent possible, - whether at the time of the initial grant or subsequently, any and - all of the rights conveyed by this License. - -1.10. "Modifications" - means any of the following: - - (a) any file in Source Code Form that results from an addition to, - deletion from, or modification of the contents of Covered - Software; or - - (b) any new file in Source Code Form that contains any Covered - Software. - -1.11. "Patent Claims" of a Contributor - means any patent claim(s), including without limitation, method, - process, and apparatus claims, in any patent Licensable by such - Contributor that would be infringed, but for the grant of the - License, by the making, using, selling, offering for sale, having - made, import, or transfer of either its Contributions or its - Contributor Version. - -1.12. "Secondary License" - means either the GNU General Public License, Version 2.0, the GNU - Lesser General Public License, Version 2.1, the GNU Affero General - Public License, Version 3.0, or any later versions of those - licenses. - -1.13. "Source Code Form" - means the form of the work preferred for making modifications. - -1.14. "You" (or "Your") - means an individual or a legal entity exercising rights under this - License. For legal entities, "You" includes any entity that - controls, is controlled by, or is under common control with You. For - purposes of this definition, "control" means (a) the power, direct - or indirect, to cause the direction or management of such entity, - whether by contract or otherwise, or (b) ownership of more than - fifty percent (50%) of the outstanding shares or beneficial - ownership of such entity. - -2. License Grants and Conditions --------------------------------- - -2.1. Grants - -Each Contributor hereby grants You a world-wide, royalty-free, -non-exclusive license: - -(a) under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or - as part of a Larger Work; and - -(b) under Patent Claims of such Contributor to make, use, sell, offer - for sale, have made, import, and otherwise transfer either its - Contributions or its Contributor Version. - -2.2. Effective Date - -The licenses granted in Section 2.1 with respect to any Contribution -become effective for each Contribution on the date the Contributor first -distributes such Contribution. - -2.3. Limitations on Grant Scope - -The licenses granted in this Section 2 are the only rights granted under -this License. No additional rights or licenses will be implied from the -distribution or licensing of Covered Software under this License. -Notwithstanding Section 2.1(b) above, no patent license is granted by a -Contributor: - -(a) for any code that a Contributor has removed from Covered Software; - or - -(b) for infringements caused by: (i) Your and any other third party's - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - -(c) under Patent Claims infringed by Covered Software in the absence of - its Contributions. - -This License does not grant any rights in the trademarks, service marks, -or logos of any Contributor (except as may be necessary to comply with -the notice requirements in Section 3.4). - -2.4. Subsequent Licenses - -No Contributor makes additional grants as a result of Your choice to -distribute the Covered Software under a subsequent version of this -License (see Section 10.2) or under the terms of a Secondary License (if -permitted under the terms of Section 3.3). - -2.5. Representation - -Each Contributor represents that the Contributor believes its -Contributions are its original creation(s) or it has sufficient rights -to grant the rights to its Contributions conveyed by this License. - -2.6. Fair Use - -This License is not intended to limit any rights You have under -applicable copyright doctrines of fair use, fair dealing, or other -equivalents. - -2.7. Conditions - -Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted -in Section 2.1. - -3. Responsibilities -------------------- - -3.1. Distribution of Source Form - -All distribution of Covered Software in Source Code Form, including any -Modifications that You create or to which You contribute, must be under -the terms of this License. You must inform recipients that the Source -Code Form of the Covered Software is governed by the terms of this -License, and how they can obtain a copy of this License. You may not -attempt to alter or restrict the recipients' rights in the Source Code -Form. - -3.2. Distribution of Executable Form - -If You distribute Covered Software in Executable Form then: - -(a) such Covered Software must also be made available in Source Code - Form, as described in Section 3.1, and You must inform recipients of - the Executable Form how they can obtain a copy of such Source Code - Form by reasonable means in a timely manner, at a charge no more - than the cost of distribution to the recipient; and - -(b) You may distribute such Executable Form under the terms of this - License, or sublicense it under different terms, provided that the - license for the Executable Form does not attempt to limit or alter - the recipients' rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - -You may create and distribute a Larger Work under terms of Your choice, -provided that You also comply with the requirements of this License for -the Covered Software. If the Larger Work is a combination of Covered -Software with a work governed by one or more Secondary Licenses, and the -Covered Software is not Incompatible With Secondary Licenses, this -License permits You to additionally distribute such Covered Software -under the terms of such Secondary License(s), so that the recipient of -the Larger Work may, at their option, further distribute the Covered -Software under the terms of either this License or such Secondary -License(s). - -3.4. Notices - -You may not remove or alter the substance of any license notices -(including copyright notices, patent notices, disclaimers of warranty, -or limitations of liability) contained within the Source Code Form of -the Covered Software, except that You may alter any license notices to -the extent required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - -You may choose to offer, and to charge a fee for, warranty, support, -indemnity or liability obligations to one or more recipients of Covered -Software. However, You may do so only on Your own behalf, and not on -behalf of any Contributor. You must make it absolutely clear that any -such warranty, support, indemnity, or liability obligation is offered by -You alone, and You hereby agree to indemnify every Contributor for any -liability incurred by such Contributor as a result of warranty, support, -indemnity or liability terms You offer. You may include additional -disclaimers of warranty and limitations of liability specific to any -jurisdiction. - -4. Inability to Comply Due to Statute or Regulation ---------------------------------------------------- - -If it is impossible for You to comply with any of the terms of this -License with respect to some or all of the Covered Software due to -statute, judicial order, or regulation then You must: (a) comply with -the terms of this License to the maximum extent possible; and (b) -describe the limitations and the code they affect. Such description must -be placed in a text file included with all distributions of the Covered -Software under this License. Except to the extent prohibited by statute -or regulation, such description must be sufficiently detailed for a -recipient of ordinary skill to be able to understand it. - -5. Termination --------------- - -5.1. The rights granted under this License will terminate automatically -if You fail to comply with any of its terms. However, if You become -compliant, then the rights granted under this License from a particular -Contributor are reinstated (a) provisionally, unless and until such -Contributor explicitly and finally terminates Your grants, and (b) on an -ongoing basis, if such Contributor fails to notify You of the -non-compliance by some reasonable means prior to 60 days after You have -come back into compliance. Moreover, Your grants from a particular -Contributor are reinstated on an ongoing basis if such Contributor -notifies You of the non-compliance by some reasonable means, this is the -first time You have received notice of non-compliance with this License -from such Contributor, and You become compliant prior to 30 days after -Your receipt of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent -infringement claim (excluding declaratory judgment actions, -counter-claims, and cross-claims) alleging that a Contributor Version -directly or indirectly infringes any patent, then the rights granted to -You by any and all Contributors for the Covered Software under Section -2.1 of this License shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all -end user license agreements (excluding distributors and resellers) which -have been validly granted by You or Your distributors under this License -prior to termination shall survive termination. - -************************************************************************ -* * -* 6. Disclaimer of Warranty * -* ------------------------- * -* * -* Covered Software is provided under this License on an "as is" * -* basis, without warranty of any kind, either expressed, implied, or * -* statutory, including, without limitation, warranties that the * -* Covered Software is free of defects, merchantable, fit for a * -* particular purpose or non-infringing. The entire risk as to the * -* quality and performance of the Covered Software is with You. * -* Should any Covered Software prove defective in any respect, You * -* (not any Contributor) assume the cost of any necessary servicing, * -* repair, or correction. This disclaimer of warranty constitutes an * -* essential part of this License. No use of any Covered Software is * -* authorized under this License except under this disclaimer. * -* * -************************************************************************ - -************************************************************************ -* * -* 7. Limitation of Liability * -* -------------------------- * -* * -* Under no circumstances and under no legal theory, whether tort * -* (including negligence), contract, or otherwise, shall any * -* Contributor, or anyone who distributes Covered Software as * -* permitted above, be liable to You for any direct, indirect, * -* special, incidental, or consequential damages of any character * -* including, without limitation, damages for lost profits, loss of * -* goodwill, work stoppage, computer failure or malfunction, or any * -* and all other commercial damages or losses, even if such party * -* shall have been informed of the possibility of such damages. This * -* limitation of liability shall not apply to liability for death or * -* personal injury resulting from such party's negligence to the * -* extent applicable law prohibits such limitation. Some * -* jurisdictions do not allow the exclusion or limitation of * -* incidental or consequential damages, so this exclusion and * -* limitation may not apply to You. * -* * -************************************************************************ - -8. Litigation -------------- - -Any litigation relating to this License may be brought only in the -courts of a jurisdiction where the defendant maintains its principal -place of business and such litigation shall be governed by laws of that -jurisdiction, without reference to its conflict-of-law provisions. -Nothing in this Section shall prevent a party's ability to bring -cross-claims or counter-claims. - -9. Miscellaneous ----------------- - -This License represents the complete agreement concerning the subject -matter hereof. If any provision of this License is held to be -unenforceable, such provision shall be reformed only to the extent -necessary to make it enforceable. Any law or regulation which provides -that the language of a contract shall be construed against the drafter -shall not be used to construe this License against a Contributor. - -10. Versions of the License ---------------------------- - -10.1. New Versions - -Mozilla Foundation is the license steward. Except as provided in Section -10.3, no one other than the license steward has the right to modify or -publish new versions of this License. Each version will be given a -distinguishing version number. - -10.2. Effect of New Versions - -You may distribute the Covered Software under the terms of the version -of the License under which You originally received the Covered Software, -or under the terms of any subsequent version published by the license -steward. - -10.3. Modified Versions - -If you create software not governed by this License, and you want to -create a new license for such software, you may create and use a -modified version of this License if you rename the license and remove -any references to the name of the license steward (except to note that -such modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary -Licenses - -If You choose to distribute Source Code Form that is Incompatible With -Secondary Licenses under the terms of this version of the License, the -notice described in Exhibit B of this License must be attached. - -Exhibit A - Source Code Form License Notice -------------------------------------------- - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular -file, then You may include the notice in a location (such as a LICENSE -file in a relevant directory) where a recipient would be likely to look -for such a notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - "Incompatible With Secondary Licenses" Notice ---------------------------------------------------------- - - This Source Code Form is "Incompatible With Secondary Licenses", as - defined by the Mozilla Public License, v. 2.0. diff --git a/vendor/github.com/go-sql-driver/mysql/README.md b/vendor/github.com/go-sql-driver/mysql/README.md deleted file mode 100644 index 645203850..000000000 --- a/vendor/github.com/go-sql-driver/mysql/README.md +++ /dev/null @@ -1,443 +0,0 @@ -# Go-MySQL-Driver - -A MySQL-Driver for Go's [database/sql](https://golang.org/pkg/database/sql/) package - -![Go-MySQL-Driver logo](https://raw.github.com/wiki/go-sql-driver/mysql/gomysql_m.png "Golang Gopher holding the MySQL Dolphin") - ---------------------------------------- - * [Features](#features) - * [Requirements](#requirements) - * [Installation](#installation) - * [Usage](#usage) - * [DSN (Data Source Name)](#dsn-data-source-name) - * [Password](#password) - * [Protocol](#protocol) - * [Address](#address) - * [Parameters](#parameters) - * [Examples](#examples) - * [LOAD DATA LOCAL INFILE support](#load-data-local-infile-support) - * [time.Time support](#timetime-support) - * [Unicode support](#unicode-support) - * [Testing / Development](#testing--development) - * [License](#license) - ---------------------------------------- - -## Features - * Lightweight and [fast](https://github.com/go-sql-driver/sql-benchmark "golang MySQL-Driver performance") - * Native Go implementation. No C-bindings, just pure Go - * Connections over TCP/IPv4, TCP/IPv6, Unix domain sockets or [custom protocols](https://godoc.org/github.com/go-sql-driver/mysql#DialFunc) - * Automatic handling of broken connections - * Automatic Connection Pooling *(by database/sql package)* - * Supports queries larger than 16MB - * Full [`sql.RawBytes`](https://golang.org/pkg/database/sql/#RawBytes) support. - * Intelligent `LONG DATA` handling in prepared statements - * Secure `LOAD DATA LOCAL INFILE` support with file Whitelisting and `io.Reader` support - * Optional `time.Time` parsing - * Optional placeholder interpolation - -## Requirements - * Go 1.2 or higher - * MySQL (4.1+), MariaDB, Percona Server, Google CloudSQL or Sphinx (2.2.3+) - ---------------------------------------- - -## Installation -Simple install the package to your [$GOPATH](https://github.com/golang/go/wiki/GOPATH "GOPATH") with the [go tool](https://golang.org/cmd/go/ "go command") from shell: -```bash -$ go get github.com/go-sql-driver/mysql -``` -Make sure [Git is installed](https://git-scm.com/downloads) on your machine and in your system's `PATH`. - -## Usage -_Go MySQL Driver_ is an implementation of Go's `database/sql/driver` interface. You only need to import the driver and can use the full [`database/sql`](https://golang.org/pkg/database/sql/) API then. - -Use `mysql` as `driverName` and a valid [DSN](#dsn-data-source-name) as `dataSourceName`: -```go -import "database/sql" -import _ "github.com/go-sql-driver/mysql" - -db, err := sql.Open("mysql", "user:password@/dbname") -``` - -[Examples are available in our Wiki](https://github.com/go-sql-driver/mysql/wiki/Examples "Go-MySQL-Driver Examples"). - - -### DSN (Data Source Name) - -The Data Source Name has a common format, like e.g. [PEAR DB](http://pear.php.net/manual/en/package.database.db.intro-dsn.php) uses it, but without type-prefix (optional parts marked by squared brackets): -``` -[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...¶mN=valueN] -``` - -A DSN in its fullest form: -``` -username:password@protocol(address)/dbname?param=value -``` - -Except for the databasename, all values are optional. So the minimal DSN is: -``` -/dbname -``` - -If you do not want to preselect a database, leave `dbname` empty: -``` -/ -``` -This has the same effect as an empty DSN string: -``` - -``` - -Alternatively, [Config.FormatDSN](https://godoc.org/github.com/go-sql-driver/mysql#Config.FormatDSN) can be used to create a DSN string by filling a struct. - -#### Password -Passwords can consist of any character. Escaping is **not** necessary. - -#### Protocol -See [net.Dial](https://golang.org/pkg/net/#Dial) for more information which networks are available. -In general you should use an Unix domain socket if available and TCP otherwise for best performance. - -#### Address -For TCP and UDP networks, addresses have the form `host:port`. -If `host` is a literal IPv6 address, it must be enclosed in square brackets. -The functions [net.JoinHostPort](https://golang.org/pkg/net/#JoinHostPort) and [net.SplitHostPort](https://golang.org/pkg/net/#SplitHostPort) manipulate addresses in this form. - -For Unix domain sockets the address is the absolute path to the MySQL-Server-socket, e.g. `/var/run/mysqld/mysqld.sock` or `/tmp/mysql.sock`. - -#### Parameters -*Parameters are case-sensitive!* - -Notice that any of `true`, `TRUE`, `True` or `1` is accepted to stand for a true boolean value. Not surprisingly, false can be specified as any of: `false`, `FALSE`, `False` or `0`. - -##### `allowAllFiles` - -``` -Type: bool -Valid Values: true, false -Default: false -``` - -`allowAllFiles=true` disables the file Whitelist for `LOAD DATA LOCAL INFILE` and allows *all* files. -[*Might be insecure!*](http://dev.mysql.com/doc/refman/5.7/en/load-data-local.html) - -##### `allowCleartextPasswords` - -``` -Type: bool -Valid Values: true, false -Default: false -``` - -`allowCleartextPasswords=true` allows using the [cleartext client side plugin](http://dev.mysql.com/doc/en/cleartext-authentication-plugin.html) if required by an account, such as one defined with the [PAM authentication plugin](http://dev.mysql.com/doc/en/pam-authentication-plugin.html). Sending passwords in clear text may be a security problem in some configurations. To avoid problems if there is any possibility that the password would be intercepted, clients should connect to MySQL Server using a method that protects the password. Possibilities include [TLS / SSL](#tls), IPsec, or a private network. - -##### `allowNativePasswords` - -``` -Type: bool -Valid Values: true, false -Default: false -``` -`allowNativePasswords=true` allows the usage of the mysql native password method. - -##### `allowOldPasswords` - -``` -Type: bool -Valid Values: true, false -Default: false -``` -`allowOldPasswords=true` allows the usage of the insecure old password method. This should be avoided, but is necessary in some cases. See also [the old_passwords wiki page](https://github.com/go-sql-driver/mysql/wiki/old_passwords). - -##### `charset` - -``` -Type: string -Valid Values: -Default: none -``` - -Sets the charset used for client-server interaction (`"SET NAMES "`). If multiple charsets are set (separated by a comma), the following charset is used if setting the charset failes. This enables for example support for `utf8mb4` ([introduced in MySQL 5.5.3](http://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html)) with fallback to `utf8` for older servers (`charset=utf8mb4,utf8`). - -Usage of the `charset` parameter is discouraged because it issues additional queries to the server. -Unless you need the fallback behavior, please use `collation` instead. - -##### `collation` - -``` -Type: string -Valid Values: -Default: utf8_general_ci -``` - -Sets the collation used for client-server interaction on connection. In contrast to `charset`, `collation` does not issue additional queries. If the specified collation is unavailable on the target server, the connection will fail. - -A list of valid charsets for a server is retrievable with `SHOW COLLATION`. - -##### `clientFoundRows` - -``` -Type: bool -Valid Values: true, false -Default: false -``` - -`clientFoundRows=true` causes an UPDATE to return the number of matching rows instead of the number of rows changed. - -##### `columnsWithAlias` - -``` -Type: bool -Valid Values: true, false -Default: false -``` - -When `columnsWithAlias` is true, calls to `sql.Rows.Columns()` will return the table alias and the column name separated by a dot. For example: - -``` -SELECT u.id FROM users as u -``` - -will return `u.id` instead of just `id` if `columnsWithAlias=true`. - -##### `interpolateParams` - -``` -Type: bool -Valid Values: true, false -Default: false -``` - -If `interpolateParams` is true, placeholders (`?`) in calls to `db.Query()` and `db.Exec()` are interpolated into a single query string with given parameters. This reduces the number of roundtrips, since the driver has to prepare a statement, execute it with given parameters and close the statement again with `interpolateParams=false`. - -*This can not be used together with the multibyte encodings BIG5, CP932, GB2312, GBK or SJIS. These are blacklisted as they may [introduce a SQL injection vulnerability](http://stackoverflow.com/a/12118602/3430118)!* - -##### `loc` - -``` -Type: string -Valid Values: -Default: UTC -``` - -Sets the location for time.Time values (when using `parseTime=true`). *"Local"* sets the system's location. See [time.LoadLocation](https://golang.org/pkg/time/#LoadLocation) for details. - -Note that this sets the location for time.Time values but does not change MySQL's [time_zone setting](https://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html). For that see the [time_zone system variable](#system-variables), which can also be set as a DSN parameter. - -Please keep in mind, that param values must be [url.QueryEscape](https://golang.org/pkg/net/url/#QueryEscape)'ed. Alternatively you can manually replace the `/` with `%2F`. For example `US/Pacific` would be `loc=US%2FPacific`. - -##### `maxAllowedPacket` -``` -Type: decimal number -Default: 0 -``` - -Max packet size allowed in bytes. Use `maxAllowedPacket=0` to automatically fetch the `max_allowed_packet` variable from server. - -##### `multiStatements` - -``` -Type: bool -Valid Values: true, false -Default: false -``` - -Allow multiple statements in one query. While this allows batch queries, it also greatly increases the risk of SQL injections. Only the result of the first query is returned, all other results are silently discarded. - -When `multiStatements` is used, `?` parameters must only be used in the first statement. - -##### `parseTime` - -``` -Type: bool -Valid Values: true, false -Default: false -``` - -`parseTime=true` changes the output type of `DATE` and `DATETIME` values to `time.Time` instead of `[]byte` / `string` - - -##### `readTimeout` - -``` -Type: decimal number -Default: 0 -``` - -I/O read timeout. The value must be a decimal number with an unit suffix ( *"ms"*, *"s"*, *"m"*, *"h"* ), such as *"30s"*, *"0.5m"* or *"1m30s"*. - -##### `strict` - -``` -Type: bool -Valid Values: true, false -Default: false -``` - -`strict=true` enables a driver-side strict mode in which MySQL warnings are treated as errors. This mode should not be used in production as it may lead to data corruption in certain situations. - -A server-side strict mode, which is safe for production use, can be set via the [`sql_mode`](https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html) system variable. - -By default MySQL also treats notes as warnings. Use [`sql_notes=false`](http://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_sql_notes) to ignore notes. - -##### `timeout` - -``` -Type: decimal number -Default: OS default -``` - -*Driver* side connection timeout. The value must be a decimal number with an unit suffix ( *"ms"*, *"s"*, *"m"*, *"h"* ), such as *"30s"*, *"0.5m"* or *"1m30s"*. To set a server side timeout, use the parameter [`wait_timeout`](http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_wait_timeout). - -##### `tls` - -``` -Type: bool / string -Valid Values: true, false, skip-verify, -Default: false -``` - -`tls=true` enables TLS / SSL encrypted connection to the server. Use `skip-verify` if you want to use a self-signed or invalid certificate (server side). Use a custom value registered with [`mysql.RegisterTLSConfig`](https://godoc.org/github.com/go-sql-driver/mysql#RegisterTLSConfig). - -##### `writeTimeout` - -``` -Type: decimal number -Default: 0 -``` - -I/O write timeout. The value must be a decimal number with an unit suffix ( *"ms"*, *"s"*, *"m"*, *"h"* ), such as *"30s"*, *"0.5m"* or *"1m30s"*. - - -##### System Variables - -Any other parameters are interpreted as system variables: - * `=`: `SET =` - * `=`: `SET =` - * `=%27%27`: `SET =''` - -Rules: -* The values for string variables must be quoted with ' -* The values must also be [url.QueryEscape](http://golang.org/pkg/net/url/#QueryEscape)'ed! - (which implies values of string variables must be wrapped with `%27`) - -Examples: - * `autocommit=1`: `SET autocommit=1` - * [`time_zone=%27Europe%2FParis%27`](https://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html): `SET time_zone='Europe/Paris'` - * [`tx_isolation=%27REPEATABLE-READ%27`](https://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_tx_isolation): `SET tx_isolation='REPEATABLE-READ'` - - -#### Examples -``` -user@unix(/path/to/socket)/dbname -``` - -``` -root:pw@unix(/tmp/mysql.sock)/myDatabase?loc=Local -``` - -``` -user:password@tcp(localhost:5555)/dbname?tls=skip-verify&autocommit=true -``` - -Treat warnings as errors by setting the system variable [`sql_mode`](https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html): -``` -user:password@/dbname?sql_mode=TRADITIONAL -``` - -TCP via IPv6: -``` -user:password@tcp([de:ad:be:ef::ca:fe]:80)/dbname?timeout=90s&collation=utf8mb4_unicode_ci -``` - -TCP on a remote host, e.g. Amazon RDS: -``` -id:password@tcp(your-amazonaws-uri.com:3306)/dbname -``` - -Google Cloud SQL on App Engine (First Generation MySQL Server): -``` -user@cloudsql(project-id:instance-name)/dbname -``` - -Google Cloud SQL on App Engine (Second Generation MySQL Server): -``` -user@cloudsql(project-id:regionname:instance-name)/dbname -``` - -TCP using default port (3306) on localhost: -``` -user:password@tcp/dbname?charset=utf8mb4,utf8&sys_var=esc%40ped -``` - -Use the default protocol (tcp) and host (localhost:3306): -``` -user:password@/dbname -``` - -No Database preselected: -``` -user:password@/ -``` - -### `LOAD DATA LOCAL INFILE` support -For this feature you need direct access to the package. Therefore you must change the import path (no `_`): -```go -import "github.com/go-sql-driver/mysql" -``` - -Files must be whitelisted by registering them with `mysql.RegisterLocalFile(filepath)` (recommended) or the Whitelist check must be deactivated by using the DSN parameter `allowAllFiles=true` ([*Might be insecure!*](http://dev.mysql.com/doc/refman/5.7/en/load-data-local.html)). - -To use a `io.Reader` a handler function must be registered with `mysql.RegisterReaderHandler(name, handler)` which returns a `io.Reader` or `io.ReadCloser`. The Reader is available with the filepath `Reader::` then. Choose different names for different handlers and `DeregisterReaderHandler` when you don't need it anymore. - -See the [godoc of Go-MySQL-Driver](https://godoc.org/github.com/go-sql-driver/mysql "golang mysql driver documentation") for details. - - -### `time.Time` support -The default internal output type of MySQL `DATE` and `DATETIME` values is `[]byte` which allows you to scan the value into a `[]byte`, `string` or `sql.RawBytes` variable in your programm. - -However, many want to scan MySQL `DATE` and `DATETIME` values into `time.Time` variables, which is the logical opposite in Go to `DATE` and `DATETIME` in MySQL. You can do that by changing the internal output type from `[]byte` to `time.Time` with the DSN parameter `parseTime=true`. You can set the default [`time.Time` location](https://golang.org/pkg/time/#Location) with the `loc` DSN parameter. - -**Caution:** As of Go 1.1, this makes `time.Time` the only variable type you can scan `DATE` and `DATETIME` values into. This breaks for example [`sql.RawBytes` support](https://github.com/go-sql-driver/mysql/wiki/Examples#rawbytes). - -Alternatively you can use the [`NullTime`](https://godoc.org/github.com/go-sql-driver/mysql#NullTime) type as the scan destination, which works with both `time.Time` and `string` / `[]byte`. - - -### Unicode support -Since version 1.1 Go-MySQL-Driver automatically uses the collation `utf8_general_ci` by default. - -Other collations / charsets can be set using the [`collation`](#collation) DSN parameter. - -Version 1.0 of the driver recommended adding `&charset=utf8` (alias for `SET NAMES utf8`) to the DSN to enable proper UTF-8 support. This is not necessary anymore. The [`collation`](#collation) parameter should be preferred to set another collation / charset than the default. - -See http://dev.mysql.com/doc/refman/5.7/en/charset-unicode.html for more details on MySQL's Unicode support. - - -## Testing / Development -To run the driver tests you may need to adjust the configuration. See the [Testing Wiki-Page](https://github.com/go-sql-driver/mysql/wiki/Testing "Testing") for details. - -Go-MySQL-Driver is not feature-complete yet. Your help is very appreciated. -If you want to contribute, you can work on an [open issue](https://github.com/go-sql-driver/mysql/issues?state=open) or review a [pull request](https://github.com/go-sql-driver/mysql/pulls). - -See the [Contribution Guidelines](https://github.com/go-sql-driver/mysql/blob/master/CONTRIBUTING.md) for details. - ---------------------------------------- - -## License -Go-MySQL-Driver is licensed under the [Mozilla Public License Version 2.0](https://raw.github.com/go-sql-driver/mysql/master/LICENSE) - -Mozilla summarizes the license scope as follows: -> MPL: The copyleft applies to any files containing MPLed code. - - -That means: - * You can **use** the **unchanged** source code both in private and commercially - * When distributing, you **must publish** the source code of any **changed files** licensed under the MPL 2.0 under a) the MPL 2.0 itself or b) a compatible license (e.g. GPL 3.0 or Apache License 2.0) - * You **needn't publish** the source code of your library as long as the files licensed under the MPL 2.0 are **unchanged** - -Please read the [MPL 2.0 FAQ](https://www.mozilla.org/en-US/MPL/2.0/FAQ/) if you have further questions regarding the license. - -You can read the full terms here: [LICENSE](https://raw.github.com/go-sql-driver/mysql/master/LICENSE) - -![Go Gopher and MySQL Dolphin](https://raw.github.com/wiki/go-sql-driver/mysql/go-mysql-driver_m.jpg "Golang Gopher transporting the MySQL Dolphin in a wheelbarrow") - diff --git a/vendor/github.com/go-sql-driver/mysql/appengine.go b/vendor/github.com/go-sql-driver/mysql/appengine.go deleted file mode 100644 index 565614eef..000000000 --- a/vendor/github.com/go-sql-driver/mysql/appengine.go +++ /dev/null @@ -1,19 +0,0 @@ -// Go MySQL Driver - A MySQL-Driver for Go's database/sql package -// -// Copyright 2013 The Go-MySQL-Driver Authors. All rights reserved. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at http://mozilla.org/MPL/2.0/. - -// +build appengine - -package mysql - -import ( - "appengine/cloudsql" -) - -func init() { - RegisterDial("cloudsql", cloudsql.Dial) -} diff --git a/vendor/github.com/go-sql-driver/mysql/buffer.go b/vendor/github.com/go-sql-driver/mysql/buffer.go deleted file mode 100644 index 2001feacd..000000000 --- a/vendor/github.com/go-sql-driver/mysql/buffer.go +++ /dev/null @@ -1,147 +0,0 @@ -// Go MySQL Driver - A MySQL-Driver for Go's database/sql package -// -// Copyright 2013 The Go-MySQL-Driver Authors. All rights reserved. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at http://mozilla.org/MPL/2.0/. - -package mysql - -import ( - "io" - "net" - "time" -) - -const defaultBufSize = 4096 - -// A buffer which is used for both reading and writing. -// This is possible since communication on each connection is synchronous. -// In other words, we can't write and read simultaneously on the same connection. -// The buffer is similar to bufio.Reader / Writer but zero-copy-ish -// Also highly optimized for this particular use case. -type buffer struct { - buf []byte - nc net.Conn - idx int - length int - timeout time.Duration -} - -func newBuffer(nc net.Conn) buffer { - var b [defaultBufSize]byte - return buffer{ - buf: b[:], - nc: nc, - } -} - -// fill reads into the buffer until at least _need_ bytes are in it -func (b *buffer) fill(need int) error { - n := b.length - - // move existing data to the beginning - if n > 0 && b.idx > 0 { - copy(b.buf[0:n], b.buf[b.idx:]) - } - - // grow buffer if necessary - // TODO: let the buffer shrink again at some point - // Maybe keep the org buf slice and swap back? - if need > len(b.buf) { - // Round up to the next multiple of the default size - newBuf := make([]byte, ((need/defaultBufSize)+1)*defaultBufSize) - copy(newBuf, b.buf) - b.buf = newBuf - } - - b.idx = 0 - - for { - if b.timeout > 0 { - if err := b.nc.SetReadDeadline(time.Now().Add(b.timeout)); err != nil { - return err - } - } - - nn, err := b.nc.Read(b.buf[n:]) - n += nn - - switch err { - case nil: - if n < need { - continue - } - b.length = n - return nil - - case io.EOF: - if n >= need { - b.length = n - return nil - } - return io.ErrUnexpectedEOF - - default: - return err - } - } -} - -// returns next N bytes from buffer. -// The returned slice is only guaranteed to be valid until the next read -func (b *buffer) readNext(need int) ([]byte, error) { - if b.length < need { - // refill - if err := b.fill(need); err != nil { - return nil, err - } - } - - offset := b.idx - b.idx += need - b.length -= need - return b.buf[offset:b.idx], nil -} - -// returns a buffer with the requested size. -// If possible, a slice from the existing buffer is returned. -// Otherwise a bigger buffer is made. -// Only one buffer (total) can be used at a time. -func (b *buffer) takeBuffer(length int) []byte { - if b.length > 0 { - return nil - } - - // test (cheap) general case first - if length <= defaultBufSize || length <= cap(b.buf) { - return b.buf[:length] - } - - if length < maxPacketSize { - b.buf = make([]byte, length) - return b.buf - } - return make([]byte, length) -} - -// shortcut which can be used if the requested buffer is guaranteed to be -// smaller than defaultBufSize -// Only one buffer (total) can be used at a time. -func (b *buffer) takeSmallBuffer(length int) []byte { - if b.length == 0 { - return b.buf[:length] - } - return nil -} - -// takeCompleteBuffer returns the complete existing buffer. -// This can be used if the necessary buffer size is unknown. -// Only one buffer (total) can be used at a time. -func (b *buffer) takeCompleteBuffer() []byte { - if b.length == 0 { - return b.buf - } - return nil -} diff --git a/vendor/github.com/go-sql-driver/mysql/collations.go b/vendor/github.com/go-sql-driver/mysql/collations.go deleted file mode 100644 index 82079cfb9..000000000 --- a/vendor/github.com/go-sql-driver/mysql/collations.go +++ /dev/null @@ -1,250 +0,0 @@ -// Go MySQL Driver - A MySQL-Driver for Go's database/sql package -// -// Copyright 2014 The Go-MySQL-Driver Authors. All rights reserved. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at http://mozilla.org/MPL/2.0/. - -package mysql - -const defaultCollation = "utf8_general_ci" - -// A list of available collations mapped to the internal ID. -// To update this map use the following MySQL query: -// SELECT COLLATION_NAME, ID FROM information_schema.COLLATIONS -var collations = map[string]byte{ - "big5_chinese_ci": 1, - "latin2_czech_cs": 2, - "dec8_swedish_ci": 3, - "cp850_general_ci": 4, - "latin1_german1_ci": 5, - "hp8_english_ci": 6, - "koi8r_general_ci": 7, - "latin1_swedish_ci": 8, - "latin2_general_ci": 9, - "swe7_swedish_ci": 10, - "ascii_general_ci": 11, - "ujis_japanese_ci": 12, - "sjis_japanese_ci": 13, - "cp1251_bulgarian_ci": 14, - "latin1_danish_ci": 15, - "hebrew_general_ci": 16, - "tis620_thai_ci": 18, - "euckr_korean_ci": 19, - "latin7_estonian_cs": 20, - "latin2_hungarian_ci": 21, - "koi8u_general_ci": 22, - "cp1251_ukrainian_ci": 23, - "gb2312_chinese_ci": 24, - "greek_general_ci": 25, - "cp1250_general_ci": 26, - "latin2_croatian_ci": 27, - "gbk_chinese_ci": 28, - "cp1257_lithuanian_ci": 29, - "latin5_turkish_ci": 30, - "latin1_german2_ci": 31, - "armscii8_general_ci": 32, - "utf8_general_ci": 33, - "cp1250_czech_cs": 34, - "ucs2_general_ci": 35, - "cp866_general_ci": 36, - "keybcs2_general_ci": 37, - "macce_general_ci": 38, - "macroman_general_ci": 39, - "cp852_general_ci": 40, - "latin7_general_ci": 41, - "latin7_general_cs": 42, - "macce_bin": 43, - "cp1250_croatian_ci": 44, - "utf8mb4_general_ci": 45, - "utf8mb4_bin": 46, - "latin1_bin": 47, - "latin1_general_ci": 48, - "latin1_general_cs": 49, - "cp1251_bin": 50, - "cp1251_general_ci": 51, - "cp1251_general_cs": 52, - "macroman_bin": 53, - "utf16_general_ci": 54, - "utf16_bin": 55, - "utf16le_general_ci": 56, - "cp1256_general_ci": 57, - "cp1257_bin": 58, - "cp1257_general_ci": 59, - "utf32_general_ci": 60, - "utf32_bin": 61, - "utf16le_bin": 62, - "binary": 63, - "armscii8_bin": 64, - "ascii_bin": 65, - "cp1250_bin": 66, - "cp1256_bin": 67, - "cp866_bin": 68, - "dec8_bin": 69, - "greek_bin": 70, - "hebrew_bin": 71, - "hp8_bin": 72, - "keybcs2_bin": 73, - "koi8r_bin": 74, - "koi8u_bin": 75, - "latin2_bin": 77, - "latin5_bin": 78, - "latin7_bin": 79, - "cp850_bin": 80, - "cp852_bin": 81, - "swe7_bin": 82, - "utf8_bin": 83, - "big5_bin": 84, - "euckr_bin": 85, - "gb2312_bin": 86, - "gbk_bin": 87, - "sjis_bin": 88, - "tis620_bin": 89, - "ucs2_bin": 90, - "ujis_bin": 91, - "geostd8_general_ci": 92, - "geostd8_bin": 93, - "latin1_spanish_ci": 94, - "cp932_japanese_ci": 95, - "cp932_bin": 96, - "eucjpms_japanese_ci": 97, - "eucjpms_bin": 98, - "cp1250_polish_ci": 99, - "utf16_unicode_ci": 101, - "utf16_icelandic_ci": 102, - "utf16_latvian_ci": 103, - "utf16_romanian_ci": 104, - "utf16_slovenian_ci": 105, - "utf16_polish_ci": 106, - "utf16_estonian_ci": 107, - "utf16_spanish_ci": 108, - "utf16_swedish_ci": 109, - "utf16_turkish_ci": 110, - "utf16_czech_ci": 111, - "utf16_danish_ci": 112, - "utf16_lithuanian_ci": 113, - "utf16_slovak_ci": 114, - "utf16_spanish2_ci": 115, - "utf16_roman_ci": 116, - "utf16_persian_ci": 117, - "utf16_esperanto_ci": 118, - "utf16_hungarian_ci": 119, - "utf16_sinhala_ci": 120, - "utf16_german2_ci": 121, - "utf16_croatian_ci": 122, - "utf16_unicode_520_ci": 123, - "utf16_vietnamese_ci": 124, - "ucs2_unicode_ci": 128, - "ucs2_icelandic_ci": 129, - "ucs2_latvian_ci": 130, - "ucs2_romanian_ci": 131, - "ucs2_slovenian_ci": 132, - "ucs2_polish_ci": 133, - "ucs2_estonian_ci": 134, - "ucs2_spanish_ci": 135, - "ucs2_swedish_ci": 136, - "ucs2_turkish_ci": 137, - "ucs2_czech_ci": 138, - "ucs2_danish_ci": 139, - "ucs2_lithuanian_ci": 140, - "ucs2_slovak_ci": 141, - "ucs2_spanish2_ci": 142, - "ucs2_roman_ci": 143, - "ucs2_persian_ci": 144, - "ucs2_esperanto_ci": 145, - "ucs2_hungarian_ci": 146, - "ucs2_sinhala_ci": 147, - "ucs2_german2_ci": 148, - "ucs2_croatian_ci": 149, - "ucs2_unicode_520_ci": 150, - "ucs2_vietnamese_ci": 151, - "ucs2_general_mysql500_ci": 159, - "utf32_unicode_ci": 160, - "utf32_icelandic_ci": 161, - "utf32_latvian_ci": 162, - "utf32_romanian_ci": 163, - "utf32_slovenian_ci": 164, - "utf32_polish_ci": 165, - "utf32_estonian_ci": 166, - "utf32_spanish_ci": 167, - "utf32_swedish_ci": 168, - "utf32_turkish_ci": 169, - "utf32_czech_ci": 170, - "utf32_danish_ci": 171, - "utf32_lithuanian_ci": 172, - "utf32_slovak_ci": 173, - "utf32_spanish2_ci": 174, - "utf32_roman_ci": 175, - "utf32_persian_ci": 176, - "utf32_esperanto_ci": 177, - "utf32_hungarian_ci": 178, - "utf32_sinhala_ci": 179, - "utf32_german2_ci": 180, - "utf32_croatian_ci": 181, - "utf32_unicode_520_ci": 182, - "utf32_vietnamese_ci": 183, - "utf8_unicode_ci": 192, - "utf8_icelandic_ci": 193, - "utf8_latvian_ci": 194, - "utf8_romanian_ci": 195, - "utf8_slovenian_ci": 196, - "utf8_polish_ci": 197, - "utf8_estonian_ci": 198, - "utf8_spanish_ci": 199, - "utf8_swedish_ci": 200, - "utf8_turkish_ci": 201, - "utf8_czech_ci": 202, - "utf8_danish_ci": 203, - "utf8_lithuanian_ci": 204, - "utf8_slovak_ci": 205, - "utf8_spanish2_ci": 206, - "utf8_roman_ci": 207, - "utf8_persian_ci": 208, - "utf8_esperanto_ci": 209, - "utf8_hungarian_ci": 210, - "utf8_sinhala_ci": 211, - "utf8_german2_ci": 212, - "utf8_croatian_ci": 213, - "utf8_unicode_520_ci": 214, - "utf8_vietnamese_ci": 215, - "utf8_general_mysql500_ci": 223, - "utf8mb4_unicode_ci": 224, - "utf8mb4_icelandic_ci": 225, - "utf8mb4_latvian_ci": 226, - "utf8mb4_romanian_ci": 227, - "utf8mb4_slovenian_ci": 228, - "utf8mb4_polish_ci": 229, - "utf8mb4_estonian_ci": 230, - "utf8mb4_spanish_ci": 231, - "utf8mb4_swedish_ci": 232, - "utf8mb4_turkish_ci": 233, - "utf8mb4_czech_ci": 234, - "utf8mb4_danish_ci": 235, - "utf8mb4_lithuanian_ci": 236, - "utf8mb4_slovak_ci": 237, - "utf8mb4_spanish2_ci": 238, - "utf8mb4_roman_ci": 239, - "utf8mb4_persian_ci": 240, - "utf8mb4_esperanto_ci": 241, - "utf8mb4_hungarian_ci": 242, - "utf8mb4_sinhala_ci": 243, - "utf8mb4_german2_ci": 244, - "utf8mb4_croatian_ci": 245, - "utf8mb4_unicode_520_ci": 246, - "utf8mb4_vietnamese_ci": 247, -} - -// A blacklist of collations which is unsafe to interpolate parameters. -// These multibyte encodings may contains 0x5c (`\`) in their trailing bytes. -var unsafeCollations = map[string]bool{ - "big5_chinese_ci": true, - "sjis_japanese_ci": true, - "gbk_chinese_ci": true, - "big5_bin": true, - "gb2312_bin": true, - "gbk_bin": true, - "sjis_bin": true, - "cp932_japanese_ci": true, - "cp932_bin": true, -} diff --git a/vendor/github.com/go-sql-driver/mysql/connection.go b/vendor/github.com/go-sql-driver/mysql/connection.go deleted file mode 100644 index d82c728f3..000000000 --- a/vendor/github.com/go-sql-driver/mysql/connection.go +++ /dev/null @@ -1,377 +0,0 @@ -// Go MySQL Driver - A MySQL-Driver for Go's database/sql package -// -// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at http://mozilla.org/MPL/2.0/. - -package mysql - -import ( - "database/sql/driver" - "net" - "strconv" - "strings" - "time" -) - -type mysqlConn struct { - buf buffer - netConn net.Conn - affectedRows uint64 - insertId uint64 - cfg *Config - maxAllowedPacket int - maxWriteSize int - writeTimeout time.Duration - flags clientFlag - status statusFlag - sequence uint8 - parseTime bool - strict bool -} - -// Handles parameters set in DSN after the connection is established -func (mc *mysqlConn) handleParams() (err error) { - for param, val := range mc.cfg.Params { - switch param { - // Charset - case "charset": - charsets := strings.Split(val, ",") - for i := range charsets { - // ignore errors here - a charset may not exist - err = mc.exec("SET NAMES " + charsets[i]) - if err == nil { - break - } - } - if err != nil { - return - } - - // System Vars - default: - err = mc.exec("SET " + param + "=" + val + "") - if err != nil { - return - } - } - } - - return -} - -func (mc *mysqlConn) Begin() (driver.Tx, error) { - if mc.netConn == nil { - errLog.Print(ErrInvalidConn) - return nil, driver.ErrBadConn - } - err := mc.exec("START TRANSACTION") - if err == nil { - return &mysqlTx{mc}, err - } - - return nil, err -} - -func (mc *mysqlConn) Close() (err error) { - // Makes Close idempotent - if mc.netConn != nil { - err = mc.writeCommandPacket(comQuit) - } - - mc.cleanup() - - return -} - -// Closes the network connection and unsets internal variables. Do not call this -// function after successfully authentication, call Close instead. This function -// is called before auth or on auth failure because MySQL will have already -// closed the network connection. -func (mc *mysqlConn) cleanup() { - // Makes cleanup idempotent - if mc.netConn != nil { - if err := mc.netConn.Close(); err != nil { - errLog.Print(err) - } - mc.netConn = nil - } - mc.cfg = nil - mc.buf.nc = nil -} - -func (mc *mysqlConn) Prepare(query string) (driver.Stmt, error) { - if mc.netConn == nil { - errLog.Print(ErrInvalidConn) - return nil, driver.ErrBadConn - } - // Send command - err := mc.writeCommandPacketStr(comStmtPrepare, query) - if err != nil { - return nil, err - } - - stmt := &mysqlStmt{ - mc: mc, - } - - // Read Result - columnCount, err := stmt.readPrepareResultPacket() - if err == nil { - if stmt.paramCount > 0 { - if err = mc.readUntilEOF(); err != nil { - return nil, err - } - } - - if columnCount > 0 { - err = mc.readUntilEOF() - } - } - - return stmt, err -} - -func (mc *mysqlConn) interpolateParams(query string, args []driver.Value) (string, error) { - // Number of ? should be same to len(args) - if strings.Count(query, "?") != len(args) { - return "", driver.ErrSkip - } - - buf := mc.buf.takeCompleteBuffer() - if buf == nil { - // can not take the buffer. Something must be wrong with the connection - errLog.Print(ErrBusyBuffer) - return "", driver.ErrBadConn - } - buf = buf[:0] - argPos := 0 - - for i := 0; i < len(query); i++ { - q := strings.IndexByte(query[i:], '?') - if q == -1 { - buf = append(buf, query[i:]...) - break - } - buf = append(buf, query[i:i+q]...) - i += q - - arg := args[argPos] - argPos++ - - if arg == nil { - buf = append(buf, "NULL"...) - continue - } - - switch v := arg.(type) { - case int64: - buf = strconv.AppendInt(buf, v, 10) - case float64: - buf = strconv.AppendFloat(buf, v, 'g', -1, 64) - case bool: - if v { - buf = append(buf, '1') - } else { - buf = append(buf, '0') - } - case time.Time: - if v.IsZero() { - buf = append(buf, "'0000-00-00'"...) - } else { - v := v.In(mc.cfg.Loc) - v = v.Add(time.Nanosecond * 500) // To round under microsecond - year := v.Year() - year100 := year / 100 - year1 := year % 100 - month := v.Month() - day := v.Day() - hour := v.Hour() - minute := v.Minute() - second := v.Second() - micro := v.Nanosecond() / 1000 - - buf = append(buf, []byte{ - '\'', - digits10[year100], digits01[year100], - digits10[year1], digits01[year1], - '-', - digits10[month], digits01[month], - '-', - digits10[day], digits01[day], - ' ', - digits10[hour], digits01[hour], - ':', - digits10[minute], digits01[minute], - ':', - digits10[second], digits01[second], - }...) - - if micro != 0 { - micro10000 := micro / 10000 - micro100 := micro / 100 % 100 - micro1 := micro % 100 - buf = append(buf, []byte{ - '.', - digits10[micro10000], digits01[micro10000], - digits10[micro100], digits01[micro100], - digits10[micro1], digits01[micro1], - }...) - } - buf = append(buf, '\'') - } - case []byte: - if v == nil { - buf = append(buf, "NULL"...) - } else { - buf = append(buf, "_binary'"...) - if mc.status&statusNoBackslashEscapes == 0 { - buf = escapeBytesBackslash(buf, v) - } else { - buf = escapeBytesQuotes(buf, v) - } - buf = append(buf, '\'') - } - case string: - buf = append(buf, '\'') - if mc.status&statusNoBackslashEscapes == 0 { - buf = escapeStringBackslash(buf, v) - } else { - buf = escapeStringQuotes(buf, v) - } - buf = append(buf, '\'') - default: - return "", driver.ErrSkip - } - - if len(buf)+4 > mc.maxAllowedPacket { - return "", driver.ErrSkip - } - } - if argPos != len(args) { - return "", driver.ErrSkip - } - return string(buf), nil -} - -func (mc *mysqlConn) Exec(query string, args []driver.Value) (driver.Result, error) { - if mc.netConn == nil { - errLog.Print(ErrInvalidConn) - return nil, driver.ErrBadConn - } - if len(args) != 0 { - if !mc.cfg.InterpolateParams { - return nil, driver.ErrSkip - } - // try to interpolate the parameters to save extra roundtrips for preparing and closing a statement - prepared, err := mc.interpolateParams(query, args) - if err != nil { - return nil, err - } - query = prepared - args = nil - } - mc.affectedRows = 0 - mc.insertId = 0 - - err := mc.exec(query) - if err == nil { - return &mysqlResult{ - affectedRows: int64(mc.affectedRows), - insertId: int64(mc.insertId), - }, err - } - return nil, err -} - -// Internal function to execute commands -func (mc *mysqlConn) exec(query string) error { - // Send command - err := mc.writeCommandPacketStr(comQuery, query) - if err != nil { - return err - } - - // Read Result - resLen, err := mc.readResultSetHeaderPacket() - if err == nil && resLen > 0 { - if err = mc.readUntilEOF(); err != nil { - return err - } - - err = mc.readUntilEOF() - } - - return err -} - -func (mc *mysqlConn) Query(query string, args []driver.Value) (driver.Rows, error) { - if mc.netConn == nil { - errLog.Print(ErrInvalidConn) - return nil, driver.ErrBadConn - } - if len(args) != 0 { - if !mc.cfg.InterpolateParams { - return nil, driver.ErrSkip - } - // try client-side prepare to reduce roundtrip - prepared, err := mc.interpolateParams(query, args) - if err != nil { - return nil, err - } - query = prepared - args = nil - } - // Send command - err := mc.writeCommandPacketStr(comQuery, query) - if err == nil { - // Read Result - var resLen int - resLen, err = mc.readResultSetHeaderPacket() - if err == nil { - rows := new(textRows) - rows.mc = mc - - if resLen == 0 { - // no columns, no more data - return emptyRows{}, nil - } - // Columns - rows.columns, err = mc.readColumns(resLen) - return rows, err - } - } - return nil, err -} - -// Gets the value of the given MySQL System Variable -// The returned byte slice is only valid until the next read -func (mc *mysqlConn) getSystemVar(name string) ([]byte, error) { - // Send command - if err := mc.writeCommandPacketStr(comQuery, "SELECT @@"+name); err != nil { - return nil, err - } - - // Read Result - resLen, err := mc.readResultSetHeaderPacket() - if err == nil { - rows := new(textRows) - rows.mc = mc - rows.columns = []mysqlField{{fieldType: fieldTypeVarChar}} - - if resLen > 0 { - // Columns - if err := mc.readUntilEOF(); err != nil { - return nil, err - } - } - - dest := make([]driver.Value, resLen) - if err = rows.readRow(dest); err == nil { - return dest[0].([]byte), mc.readUntilEOF() - } - } - return nil, err -} diff --git a/vendor/github.com/go-sql-driver/mysql/const.go b/vendor/github.com/go-sql-driver/mysql/const.go deleted file mode 100644 index 88cfff3fd..000000000 --- a/vendor/github.com/go-sql-driver/mysql/const.go +++ /dev/null @@ -1,163 +0,0 @@ -// Go MySQL Driver - A MySQL-Driver for Go's database/sql package -// -// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at http://mozilla.org/MPL/2.0/. - -package mysql - -const ( - minProtocolVersion byte = 10 - maxPacketSize = 1<<24 - 1 - timeFormat = "2006-01-02 15:04:05.999999" -) - -// MySQL constants documentation: -// http://dev.mysql.com/doc/internals/en/client-server-protocol.html - -const ( - iOK byte = 0x00 - iLocalInFile byte = 0xfb - iEOF byte = 0xfe - iERR byte = 0xff -) - -// https://dev.mysql.com/doc/internals/en/capability-flags.html#packet-Protocol::CapabilityFlags -type clientFlag uint32 - -const ( - clientLongPassword clientFlag = 1 << iota - clientFoundRows - clientLongFlag - clientConnectWithDB - clientNoSchema - clientCompress - clientODBC - clientLocalFiles - clientIgnoreSpace - clientProtocol41 - clientInteractive - clientSSL - clientIgnoreSIGPIPE - clientTransactions - clientReserved - clientSecureConn - clientMultiStatements - clientMultiResults - clientPSMultiResults - clientPluginAuth - clientConnectAttrs - clientPluginAuthLenEncClientData - clientCanHandleExpiredPasswords - clientSessionTrack - clientDeprecateEOF -) - -const ( - comQuit byte = iota + 1 - comInitDB - comQuery - comFieldList - comCreateDB - comDropDB - comRefresh - comShutdown - comStatistics - comProcessInfo - comConnect - comProcessKill - comDebug - comPing - comTime - comDelayedInsert - comChangeUser - comBinlogDump - comTableDump - comConnectOut - comRegisterSlave - comStmtPrepare - comStmtExecute - comStmtSendLongData - comStmtClose - comStmtReset - comSetOption - comStmtFetch -) - -// https://dev.mysql.com/doc/internals/en/com-query-response.html#packet-Protocol::ColumnType -const ( - fieldTypeDecimal byte = iota - fieldTypeTiny - fieldTypeShort - fieldTypeLong - fieldTypeFloat - fieldTypeDouble - fieldTypeNULL - fieldTypeTimestamp - fieldTypeLongLong - fieldTypeInt24 - fieldTypeDate - fieldTypeTime - fieldTypeDateTime - fieldTypeYear - fieldTypeNewDate - fieldTypeVarChar - fieldTypeBit -) -const ( - fieldTypeJSON byte = iota + 0xf5 - fieldTypeNewDecimal - fieldTypeEnum - fieldTypeSet - fieldTypeTinyBLOB - fieldTypeMediumBLOB - fieldTypeLongBLOB - fieldTypeBLOB - fieldTypeVarString - fieldTypeString - fieldTypeGeometry -) - -type fieldFlag uint16 - -const ( - flagNotNULL fieldFlag = 1 << iota - flagPriKey - flagUniqueKey - flagMultipleKey - flagBLOB - flagUnsigned - flagZeroFill - flagBinary - flagEnum - flagAutoIncrement - flagTimestamp - flagSet - flagUnknown1 - flagUnknown2 - flagUnknown3 - flagUnknown4 -) - -// http://dev.mysql.com/doc/internals/en/status-flags.html -type statusFlag uint16 - -const ( - statusInTrans statusFlag = 1 << iota - statusInAutocommit - statusReserved // Not in documentation - statusMoreResultsExists - statusNoGoodIndexUsed - statusNoIndexUsed - statusCursorExists - statusLastRowSent - statusDbDropped - statusNoBackslashEscapes - statusMetadataChanged - statusQueryWasSlow - statusPsOutParams - statusInTransReadonly - statusSessionStateChanged -) diff --git a/vendor/github.com/go-sql-driver/mysql/driver.go b/vendor/github.com/go-sql-driver/mysql/driver.go deleted file mode 100644 index 0022d1f1e..000000000 --- a/vendor/github.com/go-sql-driver/mysql/driver.go +++ /dev/null @@ -1,183 +0,0 @@ -// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at http://mozilla.org/MPL/2.0/. - -// Package mysql provides a MySQL driver for Go's database/sql package -// -// The driver should be used via the database/sql package: -// -// import "database/sql" -// import _ "github.com/go-sql-driver/mysql" -// -// db, err := sql.Open("mysql", "user:password@/dbname") -// -// See https://github.com/go-sql-driver/mysql#usage for details -package mysql - -import ( - "database/sql" - "database/sql/driver" - "net" -) - -// MySQLDriver is exported to make the driver directly accessible. -// In general the driver is used via the database/sql package. -type MySQLDriver struct{} - -// DialFunc is a function which can be used to establish the network connection. -// Custom dial functions must be registered with RegisterDial -type DialFunc func(addr string) (net.Conn, error) - -var dials map[string]DialFunc - -// RegisterDial registers a custom dial function. It can then be used by the -// network address mynet(addr), where mynet is the registered new network. -// addr is passed as a parameter to the dial function. -func RegisterDial(net string, dial DialFunc) { - if dials == nil { - dials = make(map[string]DialFunc) - } - dials[net] = dial -} - -// Open new Connection. -// See https://github.com/go-sql-driver/mysql#dsn-data-source-name for how -// the DSN string is formated -func (d MySQLDriver) Open(dsn string) (driver.Conn, error) { - var err error - - // New mysqlConn - mc := &mysqlConn{ - maxAllowedPacket: maxPacketSize, - maxWriteSize: maxPacketSize - 1, - } - mc.cfg, err = ParseDSN(dsn) - if err != nil { - return nil, err - } - mc.parseTime = mc.cfg.ParseTime - mc.strict = mc.cfg.Strict - - // Connect to Server - if dial, ok := dials[mc.cfg.Net]; ok { - mc.netConn, err = dial(mc.cfg.Addr) - } else { - nd := net.Dialer{Timeout: mc.cfg.Timeout} - mc.netConn, err = nd.Dial(mc.cfg.Net, mc.cfg.Addr) - } - if err != nil { - return nil, err - } - - // Enable TCP Keepalives on TCP connections - if tc, ok := mc.netConn.(*net.TCPConn); ok { - if err := tc.SetKeepAlive(true); err != nil { - // Don't send COM_QUIT before handshake. - mc.netConn.Close() - mc.netConn = nil - return nil, err - } - } - - mc.buf = newBuffer(mc.netConn) - - // Set I/O timeouts - mc.buf.timeout = mc.cfg.ReadTimeout - mc.writeTimeout = mc.cfg.WriteTimeout - - // Reading Handshake Initialization Packet - cipher, err := mc.readInitPacket() - if err != nil { - mc.cleanup() - return nil, err - } - - // Send Client Authentication Packet - if err = mc.writeAuthPacket(cipher); err != nil { - mc.cleanup() - return nil, err - } - - // Handle response to auth packet, switch methods if possible - if err = handleAuthResult(mc, cipher); err != nil { - // Authentication failed and MySQL has already closed the connection - // (https://dev.mysql.com/doc/internals/en/authentication-fails.html). - // Do not send COM_QUIT, just cleanup and return the error. - mc.cleanup() - return nil, err - } - - if mc.cfg.MaxAllowedPacket > 0 { - mc.maxAllowedPacket = mc.cfg.MaxAllowedPacket - } else { - // Get max allowed packet size - maxap, err := mc.getSystemVar("max_allowed_packet") - if err != nil { - mc.Close() - return nil, err - } - mc.maxAllowedPacket = stringToInt(maxap) - 1 - } - if mc.maxAllowedPacket < maxPacketSize { - mc.maxWriteSize = mc.maxAllowedPacket - } - - // Handle DSN Params - err = mc.handleParams() - if err != nil { - mc.Close() - return nil, err - } - - return mc, nil -} - -func handleAuthResult(mc *mysqlConn, oldCipher []byte) error { - // Read Result Packet - cipher, err := mc.readResultOK() - if err == nil { - return nil // auth successful - } - - if mc.cfg == nil { - return err // auth failed and retry not possible - } - - // Retry auth if configured to do so. - if mc.cfg.AllowOldPasswords && err == ErrOldPassword { - // Retry with old authentication method. Note: there are edge cases - // where this should work but doesn't; this is currently "wontfix": - // https://github.com/go-sql-driver/mysql/issues/184 - - // If CLIENT_PLUGIN_AUTH capability is not supported, no new cipher is - // sent and we have to keep using the cipher sent in the init packet. - if cipher == nil { - cipher = oldCipher - } - - if err = mc.writeOldAuthPacket(cipher); err != nil { - return err - } - _, err = mc.readResultOK() - } else if mc.cfg.AllowCleartextPasswords && err == ErrCleartextPassword { - // Retry with clear text password for - // http://dev.mysql.com/doc/refman/5.7/en/cleartext-authentication-plugin.html - // http://dev.mysql.com/doc/refman/5.7/en/pam-authentication-plugin.html - if err = mc.writeClearAuthPacket(); err != nil { - return err - } - _, err = mc.readResultOK() - } else if mc.cfg.AllowNativePasswords && err == ErrNativePassword { - if err = mc.writeNativeAuthPacket(cipher); err != nil { - return err - } - _, err = mc.readResultOK() - } - return err -} - -func init() { - sql.Register("mysql", &MySQLDriver{}) -} diff --git a/vendor/github.com/go-sql-driver/mysql/dsn.go b/vendor/github.com/go-sql-driver/mysql/dsn.go deleted file mode 100644 index ac00dcedd..000000000 --- a/vendor/github.com/go-sql-driver/mysql/dsn.go +++ /dev/null @@ -1,548 +0,0 @@ -// Go MySQL Driver - A MySQL-Driver for Go's database/sql package -// -// Copyright 2016 The Go-MySQL-Driver Authors. All rights reserved. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at http://mozilla.org/MPL/2.0/. - -package mysql - -import ( - "bytes" - "crypto/tls" - "errors" - "fmt" - "net" - "net/url" - "strconv" - "strings" - "time" -) - -var ( - errInvalidDSNUnescaped = errors.New("invalid DSN: did you forget to escape a param value?") - errInvalidDSNAddr = errors.New("invalid DSN: network address not terminated (missing closing brace)") - errInvalidDSNNoSlash = errors.New("invalid DSN: missing the slash separating the database name") - errInvalidDSNUnsafeCollation = errors.New("invalid DSN: interpolateParams can not be used with unsafe collations") -) - -// Config is a configuration parsed from a DSN string -type Config struct { - User string // Username - Passwd string // Password (requires User) - Net string // Network type - Addr string // Network address (requires Net) - DBName string // Database name - Params map[string]string // Connection parameters - Collation string // Connection collation - Loc *time.Location // Location for time.Time values - MaxAllowedPacket int // Max packet size allowed - TLSConfig string // TLS configuration name - tls *tls.Config // TLS configuration - Timeout time.Duration // Dial timeout - ReadTimeout time.Duration // I/O read timeout - WriteTimeout time.Duration // I/O write timeout - - AllowAllFiles bool // Allow all files to be used with LOAD DATA LOCAL INFILE - AllowCleartextPasswords bool // Allows the cleartext client side plugin - AllowNativePasswords bool // Allows the native password authentication method - AllowOldPasswords bool // Allows the old insecure password method - ClientFoundRows bool // Return number of matching rows instead of rows changed - ColumnsWithAlias bool // Prepend table alias to column names - InterpolateParams bool // Interpolate placeholders into query string - MultiStatements bool // Allow multiple statements in one query - ParseTime bool // Parse time values to time.Time - Strict bool // Return warnings as errors -} - -// FormatDSN formats the given Config into a DSN string which can be passed to -// the driver. -func (cfg *Config) FormatDSN() string { - var buf bytes.Buffer - - // [username[:password]@] - if len(cfg.User) > 0 { - buf.WriteString(cfg.User) - if len(cfg.Passwd) > 0 { - buf.WriteByte(':') - buf.WriteString(cfg.Passwd) - } - buf.WriteByte('@') - } - - // [protocol[(address)]] - if len(cfg.Net) > 0 { - buf.WriteString(cfg.Net) - if len(cfg.Addr) > 0 { - buf.WriteByte('(') - buf.WriteString(cfg.Addr) - buf.WriteByte(')') - } - } - - // /dbname - buf.WriteByte('/') - buf.WriteString(cfg.DBName) - - // [?param1=value1&...¶mN=valueN] - hasParam := false - - if cfg.AllowAllFiles { - hasParam = true - buf.WriteString("?allowAllFiles=true") - } - - if cfg.AllowCleartextPasswords { - if hasParam { - buf.WriteString("&allowCleartextPasswords=true") - } else { - hasParam = true - buf.WriteString("?allowCleartextPasswords=true") - } - } - - if cfg.AllowNativePasswords { - if hasParam { - buf.WriteString("&allowNativePasswords=true") - } else { - hasParam = true - buf.WriteString("?allowNativePasswords=true") - } - } - - if cfg.AllowOldPasswords { - if hasParam { - buf.WriteString("&allowOldPasswords=true") - } else { - hasParam = true - buf.WriteString("?allowOldPasswords=true") - } - } - - if cfg.ClientFoundRows { - if hasParam { - buf.WriteString("&clientFoundRows=true") - } else { - hasParam = true - buf.WriteString("?clientFoundRows=true") - } - } - - if col := cfg.Collation; col != defaultCollation && len(col) > 0 { - if hasParam { - buf.WriteString("&collation=") - } else { - hasParam = true - buf.WriteString("?collation=") - } - buf.WriteString(col) - } - - if cfg.ColumnsWithAlias { - if hasParam { - buf.WriteString("&columnsWithAlias=true") - } else { - hasParam = true - buf.WriteString("?columnsWithAlias=true") - } - } - - if cfg.InterpolateParams { - if hasParam { - buf.WriteString("&interpolateParams=true") - } else { - hasParam = true - buf.WriteString("?interpolateParams=true") - } - } - - if cfg.Loc != time.UTC && cfg.Loc != nil { - if hasParam { - buf.WriteString("&loc=") - } else { - hasParam = true - buf.WriteString("?loc=") - } - buf.WriteString(url.QueryEscape(cfg.Loc.String())) - } - - if cfg.MultiStatements { - if hasParam { - buf.WriteString("&multiStatements=true") - } else { - hasParam = true - buf.WriteString("?multiStatements=true") - } - } - - if cfg.ParseTime { - if hasParam { - buf.WriteString("&parseTime=true") - } else { - hasParam = true - buf.WriteString("?parseTime=true") - } - } - - if cfg.ReadTimeout > 0 { - if hasParam { - buf.WriteString("&readTimeout=") - } else { - hasParam = true - buf.WriteString("?readTimeout=") - } - buf.WriteString(cfg.ReadTimeout.String()) - } - - if cfg.Strict { - if hasParam { - buf.WriteString("&strict=true") - } else { - hasParam = true - buf.WriteString("?strict=true") - } - } - - if cfg.Timeout > 0 { - if hasParam { - buf.WriteString("&timeout=") - } else { - hasParam = true - buf.WriteString("?timeout=") - } - buf.WriteString(cfg.Timeout.String()) - } - - if len(cfg.TLSConfig) > 0 { - if hasParam { - buf.WriteString("&tls=") - } else { - hasParam = true - buf.WriteString("?tls=") - } - buf.WriteString(url.QueryEscape(cfg.TLSConfig)) - } - - if cfg.WriteTimeout > 0 { - if hasParam { - buf.WriteString("&writeTimeout=") - } else { - hasParam = true - buf.WriteString("?writeTimeout=") - } - buf.WriteString(cfg.WriteTimeout.String()) - } - - if cfg.MaxAllowedPacket > 0 { - if hasParam { - buf.WriteString("&maxAllowedPacket=") - } else { - hasParam = true - buf.WriteString("?maxAllowedPacket=") - } - buf.WriteString(strconv.Itoa(cfg.MaxAllowedPacket)) - - } - - // other params - if cfg.Params != nil { - for param, value := range cfg.Params { - if hasParam { - buf.WriteByte('&') - } else { - hasParam = true - buf.WriteByte('?') - } - - buf.WriteString(param) - buf.WriteByte('=') - buf.WriteString(url.QueryEscape(value)) - } - } - - return buf.String() -} - -// ParseDSN parses the DSN string to a Config -func ParseDSN(dsn string) (cfg *Config, err error) { - // New config with some default values - cfg = &Config{ - Loc: time.UTC, - Collation: defaultCollation, - } - - // [user[:password]@][net[(addr)]]/dbname[?param1=value1¶mN=valueN] - // Find the last '/' (since the password or the net addr might contain a '/') - foundSlash := false - for i := len(dsn) - 1; i >= 0; i-- { - if dsn[i] == '/' { - foundSlash = true - var j, k int - - // left part is empty if i <= 0 - if i > 0 { - // [username[:password]@][protocol[(address)]] - // Find the last '@' in dsn[:i] - for j = i; j >= 0; j-- { - if dsn[j] == '@' { - // username[:password] - // Find the first ':' in dsn[:j] - for k = 0; k < j; k++ { - if dsn[k] == ':' { - cfg.Passwd = dsn[k+1 : j] - break - } - } - cfg.User = dsn[:k] - - break - } - } - - // [protocol[(address)]] - // Find the first '(' in dsn[j+1:i] - for k = j + 1; k < i; k++ { - if dsn[k] == '(' { - // dsn[i-1] must be == ')' if an address is specified - if dsn[i-1] != ')' { - if strings.ContainsRune(dsn[k+1:i], ')') { - return nil, errInvalidDSNUnescaped - } - return nil, errInvalidDSNAddr - } - cfg.Addr = dsn[k+1 : i-1] - break - } - } - cfg.Net = dsn[j+1 : k] - } - - // dbname[?param1=value1&...¶mN=valueN] - // Find the first '?' in dsn[i+1:] - for j = i + 1; j < len(dsn); j++ { - if dsn[j] == '?' { - if err = parseDSNParams(cfg, dsn[j+1:]); err != nil { - return - } - break - } - } - cfg.DBName = dsn[i+1 : j] - - break - } - } - - if !foundSlash && len(dsn) > 0 { - return nil, errInvalidDSNNoSlash - } - - if cfg.InterpolateParams && unsafeCollations[cfg.Collation] { - return nil, errInvalidDSNUnsafeCollation - } - - // Set default network if empty - if cfg.Net == "" { - cfg.Net = "tcp" - } - - // Set default address if empty - if cfg.Addr == "" { - switch cfg.Net { - case "tcp": - cfg.Addr = "127.0.0.1:3306" - case "unix": - cfg.Addr = "/tmp/mysql.sock" - default: - return nil, errors.New("default addr for network '" + cfg.Net + "' unknown") - } - - } - - return -} - -// parseDSNParams parses the DSN "query string" -// Values must be url.QueryEscape'ed -func parseDSNParams(cfg *Config, params string) (err error) { - for _, v := range strings.Split(params, "&") { - param := strings.SplitN(v, "=", 2) - if len(param) != 2 { - continue - } - - // cfg params - switch value := param[1]; param[0] { - - // Disable INFILE whitelist / enable all files - case "allowAllFiles": - var isBool bool - cfg.AllowAllFiles, isBool = readBool(value) - if !isBool { - return errors.New("invalid bool value: " + value) - } - - // Use cleartext authentication mode (MySQL 5.5.10+) - case "allowCleartextPasswords": - var isBool bool - cfg.AllowCleartextPasswords, isBool = readBool(value) - if !isBool { - return errors.New("invalid bool value: " + value) - } - - // Use native password authentication - case "allowNativePasswords": - var isBool bool - cfg.AllowNativePasswords, isBool = readBool(value) - if !isBool { - return errors.New("invalid bool value: " + value) - } - - // Use old authentication mode (pre MySQL 4.1) - case "allowOldPasswords": - var isBool bool - cfg.AllowOldPasswords, isBool = readBool(value) - if !isBool { - return errors.New("invalid bool value: " + value) - } - - // Switch "rowsAffected" mode - case "clientFoundRows": - var isBool bool - cfg.ClientFoundRows, isBool = readBool(value) - if !isBool { - return errors.New("invalid bool value: " + value) - } - - // Collation - case "collation": - cfg.Collation = value - break - - case "columnsWithAlias": - var isBool bool - cfg.ColumnsWithAlias, isBool = readBool(value) - if !isBool { - return errors.New("invalid bool value: " + value) - } - - // Compression - case "compress": - return errors.New("compression not implemented yet") - - // Enable client side placeholder substitution - case "interpolateParams": - var isBool bool - cfg.InterpolateParams, isBool = readBool(value) - if !isBool { - return errors.New("invalid bool value: " + value) - } - - // Time Location - case "loc": - if value, err = url.QueryUnescape(value); err != nil { - return - } - cfg.Loc, err = time.LoadLocation(value) - if err != nil { - return - } - - // multiple statements in one query - case "multiStatements": - var isBool bool - cfg.MultiStatements, isBool = readBool(value) - if !isBool { - return errors.New("invalid bool value: " + value) - } - - // time.Time parsing - case "parseTime": - var isBool bool - cfg.ParseTime, isBool = readBool(value) - if !isBool { - return errors.New("invalid bool value: " + value) - } - - // I/O read Timeout - case "readTimeout": - cfg.ReadTimeout, err = time.ParseDuration(value) - if err != nil { - return - } - - // Strict mode - case "strict": - var isBool bool - cfg.Strict, isBool = readBool(value) - if !isBool { - return errors.New("invalid bool value: " + value) - } - - // Dial Timeout - case "timeout": - cfg.Timeout, err = time.ParseDuration(value) - if err != nil { - return - } - - // TLS-Encryption - case "tls": - boolValue, isBool := readBool(value) - if isBool { - if boolValue { - cfg.TLSConfig = "true" - cfg.tls = &tls.Config{} - } else { - cfg.TLSConfig = "false" - } - } else if vl := strings.ToLower(value); vl == "skip-verify" { - cfg.TLSConfig = vl - cfg.tls = &tls.Config{InsecureSkipVerify: true} - } else { - name, err := url.QueryUnescape(value) - if err != nil { - return fmt.Errorf("invalid value for TLS config name: %v", err) - } - - if tlsConfig, ok := tlsConfigRegister[name]; ok { - if len(tlsConfig.ServerName) == 0 && !tlsConfig.InsecureSkipVerify { - host, _, err := net.SplitHostPort(cfg.Addr) - if err == nil { - tlsConfig.ServerName = host - } - } - - cfg.TLSConfig = name - cfg.tls = tlsConfig - } else { - return errors.New("invalid value / unknown config name: " + name) - } - } - - // I/O write Timeout - case "writeTimeout": - cfg.WriteTimeout, err = time.ParseDuration(value) - if err != nil { - return - } - case "maxAllowedPacket": - cfg.MaxAllowedPacket, err = strconv.Atoi(value) - if err != nil { - return - } - default: - // lazy init - if cfg.Params == nil { - cfg.Params = make(map[string]string) - } - - if cfg.Params[param[0]], err = url.QueryUnescape(value); err != nil { - return - } - } - } - - return -} diff --git a/vendor/github.com/go-sql-driver/mysql/errors.go b/vendor/github.com/go-sql-driver/mysql/errors.go deleted file mode 100644 index 857854e14..000000000 --- a/vendor/github.com/go-sql-driver/mysql/errors.go +++ /dev/null @@ -1,132 +0,0 @@ -// Go MySQL Driver - A MySQL-Driver for Go's database/sql package -// -// Copyright 2013 The Go-MySQL-Driver Authors. All rights reserved. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at http://mozilla.org/MPL/2.0/. - -package mysql - -import ( - "database/sql/driver" - "errors" - "fmt" - "io" - "log" - "os" -) - -// Various errors the driver might return. Can change between driver versions. -var ( - ErrInvalidConn = errors.New("invalid connection") - ErrMalformPkt = errors.New("malformed packet") - ErrNoTLS = errors.New("TLS requested but server does not support TLS") - ErrCleartextPassword = errors.New("this user requires clear text authentication. If you still want to use it, please add 'allowCleartextPasswords=1' to your DSN") - ErrNativePassword = errors.New("this user requires mysql native password authentication.") - ErrOldPassword = errors.New("this user requires old password authentication. If you still want to use it, please add 'allowOldPasswords=1' to your DSN. See also https://github.com/go-sql-driver/mysql/wiki/old_passwords") - ErrUnknownPlugin = errors.New("this authentication plugin is not supported") - ErrOldProtocol = errors.New("MySQL server does not support required protocol 41+") - ErrPktSync = errors.New("commands out of sync. You can't run this command now") - ErrPktSyncMul = errors.New("commands out of sync. Did you run multiple statements at once?") - ErrPktTooLarge = errors.New("packet for query is too large. Try adjusting the 'max_allowed_packet' variable on the server") - ErrBusyBuffer = errors.New("busy buffer") -) - -var errLog = Logger(log.New(os.Stderr, "[mysql] ", log.Ldate|log.Ltime|log.Lshortfile)) - -// Logger is used to log critical error messages. -type Logger interface { - Print(v ...interface{}) -} - -// SetLogger is used to set the logger for critical errors. -// The initial logger is os.Stderr. -func SetLogger(logger Logger) error { - if logger == nil { - return errors.New("logger is nil") - } - errLog = logger - return nil -} - -// MySQLError is an error type which represents a single MySQL error -type MySQLError struct { - Number uint16 - Message string -} - -func (me *MySQLError) Error() string { - return fmt.Sprintf("Error %d: %s", me.Number, me.Message) -} - -// MySQLWarnings is an error type which represents a group of one or more MySQL -// warnings -type MySQLWarnings []MySQLWarning - -func (mws MySQLWarnings) Error() string { - var msg string - for i, warning := range mws { - if i > 0 { - msg += "\r\n" - } - msg += fmt.Sprintf( - "%s %s: %s", - warning.Level, - warning.Code, - warning.Message, - ) - } - return msg -} - -// MySQLWarning is an error type which represents a single MySQL warning. -// Warnings are returned in groups only. See MySQLWarnings -type MySQLWarning struct { - Level string - Code string - Message string -} - -func (mc *mysqlConn) getWarnings() (err error) { - rows, err := mc.Query("SHOW WARNINGS", nil) - if err != nil { - return - } - - var warnings = MySQLWarnings{} - var values = make([]driver.Value, 3) - - for { - err = rows.Next(values) - switch err { - case nil: - warning := MySQLWarning{} - - if raw, ok := values[0].([]byte); ok { - warning.Level = string(raw) - } else { - warning.Level = fmt.Sprintf("%s", values[0]) - } - if raw, ok := values[1].([]byte); ok { - warning.Code = string(raw) - } else { - warning.Code = fmt.Sprintf("%s", values[1]) - } - if raw, ok := values[2].([]byte); ok { - warning.Message = string(raw) - } else { - warning.Message = fmt.Sprintf("%s", values[0]) - } - - warnings = append(warnings, warning) - - case io.EOF: - return warnings - - default: - rows.Close() - return - } - } -} diff --git a/vendor/github.com/go-sql-driver/mysql/infile.go b/vendor/github.com/go-sql-driver/mysql/infile.go deleted file mode 100644 index 547357cfa..000000000 --- a/vendor/github.com/go-sql-driver/mysql/infile.go +++ /dev/null @@ -1,182 +0,0 @@ -// Go MySQL Driver - A MySQL-Driver for Go's database/sql package -// -// Copyright 2013 The Go-MySQL-Driver Authors. All rights reserved. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at http://mozilla.org/MPL/2.0/. - -package mysql - -import ( - "fmt" - "io" - "os" - "strings" - "sync" -) - -var ( - fileRegister map[string]bool - fileRegisterLock sync.RWMutex - readerRegister map[string]func() io.Reader - readerRegisterLock sync.RWMutex -) - -// RegisterLocalFile adds the given file to the file whitelist, -// so that it can be used by "LOAD DATA LOCAL INFILE ". -// Alternatively you can allow the use of all local files with -// the DSN parameter 'allowAllFiles=true' -// -// filePath := "/home/gopher/data.csv" -// mysql.RegisterLocalFile(filePath) -// err := db.Exec("LOAD DATA LOCAL INFILE '" + filePath + "' INTO TABLE foo") -// if err != nil { -// ... -// -func RegisterLocalFile(filePath string) { - fileRegisterLock.Lock() - // lazy map init - if fileRegister == nil { - fileRegister = make(map[string]bool) - } - - fileRegister[strings.Trim(filePath, `"`)] = true - fileRegisterLock.Unlock() -} - -// DeregisterLocalFile removes the given filepath from the whitelist. -func DeregisterLocalFile(filePath string) { - fileRegisterLock.Lock() - delete(fileRegister, strings.Trim(filePath, `"`)) - fileRegisterLock.Unlock() -} - -// RegisterReaderHandler registers a handler function which is used -// to receive a io.Reader. -// The Reader can be used by "LOAD DATA LOCAL INFILE Reader::". -// If the handler returns a io.ReadCloser Close() is called when the -// request is finished. -// -// mysql.RegisterReaderHandler("data", func() io.Reader { -// var csvReader io.Reader // Some Reader that returns CSV data -// ... // Open Reader here -// return csvReader -// }) -// err := db.Exec("LOAD DATA LOCAL INFILE 'Reader::data' INTO TABLE foo") -// if err != nil { -// ... -// -func RegisterReaderHandler(name string, handler func() io.Reader) { - readerRegisterLock.Lock() - // lazy map init - if readerRegister == nil { - readerRegister = make(map[string]func() io.Reader) - } - - readerRegister[name] = handler - readerRegisterLock.Unlock() -} - -// DeregisterReaderHandler removes the ReaderHandler function with -// the given name from the registry. -func DeregisterReaderHandler(name string) { - readerRegisterLock.Lock() - delete(readerRegister, name) - readerRegisterLock.Unlock() -} - -func deferredClose(err *error, closer io.Closer) { - closeErr := closer.Close() - if *err == nil { - *err = closeErr - } -} - -func (mc *mysqlConn) handleInFileRequest(name string) (err error) { - var rdr io.Reader - var data []byte - packetSize := 16 * 1024 // 16KB is small enough for disk readahead and large enough for TCP - if mc.maxWriteSize < packetSize { - packetSize = mc.maxWriteSize - } - - if idx := strings.Index(name, "Reader::"); idx == 0 || (idx > 0 && name[idx-1] == '/') { // io.Reader - // The server might return an an absolute path. See issue #355. - name = name[idx+8:] - - readerRegisterLock.RLock() - handler, inMap := readerRegister[name] - readerRegisterLock.RUnlock() - - if inMap { - rdr = handler() - if rdr != nil { - if cl, ok := rdr.(io.Closer); ok { - defer deferredClose(&err, cl) - } - } else { - err = fmt.Errorf("Reader '%s' is ", name) - } - } else { - err = fmt.Errorf("Reader '%s' is not registered", name) - } - } else { // File - name = strings.Trim(name, `"`) - fileRegisterLock.RLock() - fr := fileRegister[name] - fileRegisterLock.RUnlock() - if mc.cfg.AllowAllFiles || fr { - var file *os.File - var fi os.FileInfo - - if file, err = os.Open(name); err == nil { - defer deferredClose(&err, file) - - // get file size - if fi, err = file.Stat(); err == nil { - rdr = file - if fileSize := int(fi.Size()); fileSize < packetSize { - packetSize = fileSize - } - } - } - } else { - err = fmt.Errorf("local file '%s' is not registered", name) - } - } - - // send content packets - if err == nil { - data := make([]byte, 4+packetSize) - var n int - for err == nil { - n, err = rdr.Read(data[4:]) - if n > 0 { - if ioErr := mc.writePacket(data[:4+n]); ioErr != nil { - return ioErr - } - } - } - if err == io.EOF { - err = nil - } - } - - // send empty packet (termination) - if data == nil { - data = make([]byte, 4) - } - if ioErr := mc.writePacket(data[:4]); ioErr != nil { - return ioErr - } - - // read OK packet - if err == nil { - _, err = mc.readResultOK() - return err - } - - mc.readPacket() - return err -} diff --git a/vendor/github.com/go-sql-driver/mysql/packets.go b/vendor/github.com/go-sql-driver/mysql/packets.go deleted file mode 100644 index aafe9793e..000000000 --- a/vendor/github.com/go-sql-driver/mysql/packets.go +++ /dev/null @@ -1,1287 +0,0 @@ -// Go MySQL Driver - A MySQL-Driver for Go's database/sql package -// -// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at http://mozilla.org/MPL/2.0/. - -package mysql - -import ( - "bytes" - "crypto/tls" - "database/sql/driver" - "encoding/binary" - "errors" - "fmt" - "io" - "math" - "time" -) - -// Packets documentation: -// http://dev.mysql.com/doc/internals/en/client-server-protocol.html - -// Read packet to buffer 'data' -func (mc *mysqlConn) readPacket() ([]byte, error) { - var prevData []byte - for { - // read packet header - data, err := mc.buf.readNext(4) - if err != nil { - errLog.Print(err) - mc.Close() - return nil, driver.ErrBadConn - } - - // packet length [24 bit] - pktLen := int(uint32(data[0]) | uint32(data[1])<<8 | uint32(data[2])<<16) - - // check packet sync [8 bit] - if data[3] != mc.sequence { - if data[3] > mc.sequence { - return nil, ErrPktSyncMul - } - return nil, ErrPktSync - } - mc.sequence++ - - // packets with length 0 terminate a previous packet which is a - // multiple of (2^24)−1 bytes long - if pktLen == 0 { - // there was no previous packet - if prevData == nil { - errLog.Print(ErrMalformPkt) - mc.Close() - return nil, driver.ErrBadConn - } - - return prevData, nil - } - - // read packet body [pktLen bytes] - data, err = mc.buf.readNext(pktLen) - if err != nil { - errLog.Print(err) - mc.Close() - return nil, driver.ErrBadConn - } - - // return data if this was the last packet - if pktLen < maxPacketSize { - // zero allocations for non-split packets - if prevData == nil { - return data, nil - } - - return append(prevData, data...), nil - } - - prevData = append(prevData, data...) - } -} - -// Write packet buffer 'data' -func (mc *mysqlConn) writePacket(data []byte) error { - pktLen := len(data) - 4 - - if pktLen > mc.maxAllowedPacket { - return ErrPktTooLarge - } - - for { - var size int - if pktLen >= maxPacketSize { - data[0] = 0xff - data[1] = 0xff - data[2] = 0xff - size = maxPacketSize - } else { - data[0] = byte(pktLen) - data[1] = byte(pktLen >> 8) - data[2] = byte(pktLen >> 16) - size = pktLen - } - data[3] = mc.sequence - - // Write packet - if mc.writeTimeout > 0 { - if err := mc.netConn.SetWriteDeadline(time.Now().Add(mc.writeTimeout)); err != nil { - return err - } - } - - n, err := mc.netConn.Write(data[:4+size]) - if err == nil && n == 4+size { - mc.sequence++ - if size != maxPacketSize { - return nil - } - pktLen -= size - data = data[size:] - continue - } - - // Handle error - if err == nil { // n != len(data) - errLog.Print(ErrMalformPkt) - } else { - errLog.Print(err) - } - return driver.ErrBadConn - } -} - -/****************************************************************************** -* Initialisation Process * -******************************************************************************/ - -// Handshake Initialization Packet -// http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::Handshake -func (mc *mysqlConn) readInitPacket() ([]byte, error) { - data, err := mc.readPacket() - if err != nil { - return nil, err - } - - if data[0] == iERR { - return nil, mc.handleErrorPacket(data) - } - - // protocol version [1 byte] - if data[0] < minProtocolVersion { - return nil, fmt.Errorf( - "unsupported protocol version %d. Version %d or higher is required", - data[0], - minProtocolVersion, - ) - } - - // server version [null terminated string] - // connection id [4 bytes] - pos := 1 + bytes.IndexByte(data[1:], 0x00) + 1 + 4 - - // first part of the password cipher [8 bytes] - cipher := data[pos : pos+8] - - // (filler) always 0x00 [1 byte] - pos += 8 + 1 - - // capability flags (lower 2 bytes) [2 bytes] - mc.flags = clientFlag(binary.LittleEndian.Uint16(data[pos : pos+2])) - if mc.flags&clientProtocol41 == 0 { - return nil, ErrOldProtocol - } - if mc.flags&clientSSL == 0 && mc.cfg.tls != nil { - return nil, ErrNoTLS - } - pos += 2 - - if len(data) > pos { - // character set [1 byte] - // status flags [2 bytes] - // capability flags (upper 2 bytes) [2 bytes] - // length of auth-plugin-data [1 byte] - // reserved (all [00]) [10 bytes] - pos += 1 + 2 + 2 + 1 + 10 - - // second part of the password cipher [mininum 13 bytes], - // where len=MAX(13, length of auth-plugin-data - 8) - // - // The web documentation is ambiguous about the length. However, - // according to mysql-5.7/sql/auth/sql_authentication.cc line 538, - // the 13th byte is "\0 byte, terminating the second part of - // a scramble". So the second part of the password cipher is - // a NULL terminated string that's at least 13 bytes with the - // last byte being NULL. - // - // The official Python library uses the fixed length 12 - // which seems to work but technically could have a hidden bug. - cipher = append(cipher, data[pos:pos+12]...) - - // TODO: Verify string termination - // EOF if version (>= 5.5.7 and < 5.5.10) or (>= 5.6.0 and < 5.6.2) - // \NUL otherwise - // - //if data[len(data)-1] == 0 { - // return - //} - //return ErrMalformPkt - - // make a memory safe copy of the cipher slice - var b [20]byte - copy(b[:], cipher) - return b[:], nil - } - - // make a memory safe copy of the cipher slice - var b [8]byte - copy(b[:], cipher) - return b[:], nil -} - -// Client Authentication Packet -// http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::HandshakeResponse -func (mc *mysqlConn) writeAuthPacket(cipher []byte) error { - // Adjust client flags based on server support - clientFlags := clientProtocol41 | - clientSecureConn | - clientLongPassword | - clientTransactions | - clientLocalFiles | - clientPluginAuth | - clientMultiResults | - mc.flags&clientLongFlag - - if mc.cfg.ClientFoundRows { - clientFlags |= clientFoundRows - } - - // To enable TLS / SSL - if mc.cfg.tls != nil { - clientFlags |= clientSSL - } - - if mc.cfg.MultiStatements { - clientFlags |= clientMultiStatements - } - - // User Password - scrambleBuff := scramblePassword(cipher, []byte(mc.cfg.Passwd)) - - pktLen := 4 + 4 + 1 + 23 + len(mc.cfg.User) + 1 + 1 + len(scrambleBuff) + 21 + 1 - - // To specify a db name - if n := len(mc.cfg.DBName); n > 0 { - clientFlags |= clientConnectWithDB - pktLen += n + 1 - } - - // Calculate packet length and get buffer with that size - data := mc.buf.takeSmallBuffer(pktLen + 4) - if data == nil { - // can not take the buffer. Something must be wrong with the connection - errLog.Print(ErrBusyBuffer) - return driver.ErrBadConn - } - - // ClientFlags [32 bit] - data[4] = byte(clientFlags) - data[5] = byte(clientFlags >> 8) - data[6] = byte(clientFlags >> 16) - data[7] = byte(clientFlags >> 24) - - // MaxPacketSize [32 bit] (none) - data[8] = 0x00 - data[9] = 0x00 - data[10] = 0x00 - data[11] = 0x00 - - // Charset [1 byte] - var found bool - data[12], found = collations[mc.cfg.Collation] - if !found { - // Note possibility for false negatives: - // could be triggered although the collation is valid if the - // collations map does not contain entries the server supports. - return errors.New("unknown collation") - } - - // SSL Connection Request Packet - // http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::SSLRequest - if mc.cfg.tls != nil { - // Send TLS / SSL request packet - if err := mc.writePacket(data[:(4+4+1+23)+4]); err != nil { - return err - } - - // Switch to TLS - tlsConn := tls.Client(mc.netConn, mc.cfg.tls) - if err := tlsConn.Handshake(); err != nil { - return err - } - mc.netConn = tlsConn - mc.buf.nc = tlsConn - } - - // Filler [23 bytes] (all 0x00) - pos := 13 - for ; pos < 13+23; pos++ { - data[pos] = 0 - } - - // User [null terminated string] - if len(mc.cfg.User) > 0 { - pos += copy(data[pos:], mc.cfg.User) - } - data[pos] = 0x00 - pos++ - - // ScrambleBuffer [length encoded integer] - data[pos] = byte(len(scrambleBuff)) - pos += 1 + copy(data[pos+1:], scrambleBuff) - - // Databasename [null terminated string] - if len(mc.cfg.DBName) > 0 { - pos += copy(data[pos:], mc.cfg.DBName) - data[pos] = 0x00 - pos++ - } - - // Assume native client during response - pos += copy(data[pos:], "mysql_native_password") - data[pos] = 0x00 - - // Send Auth packet - return mc.writePacket(data) -} - -// Client old authentication packet -// http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::AuthSwitchResponse -func (mc *mysqlConn) writeOldAuthPacket(cipher []byte) error { - // User password - scrambleBuff := scrambleOldPassword(cipher, []byte(mc.cfg.Passwd)) - - // Calculate the packet length and add a tailing 0 - pktLen := len(scrambleBuff) + 1 - data := mc.buf.takeSmallBuffer(4 + pktLen) - if data == nil { - // can not take the buffer. Something must be wrong with the connection - errLog.Print(ErrBusyBuffer) - return driver.ErrBadConn - } - - // Add the scrambled password [null terminated string] - copy(data[4:], scrambleBuff) - data[4+pktLen-1] = 0x00 - - return mc.writePacket(data) -} - -// Client clear text authentication packet -// http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::AuthSwitchResponse -func (mc *mysqlConn) writeClearAuthPacket() error { - // Calculate the packet length and add a tailing 0 - pktLen := len(mc.cfg.Passwd) + 1 - data := mc.buf.takeSmallBuffer(4 + pktLen) - if data == nil { - // can not take the buffer. Something must be wrong with the connection - errLog.Print(ErrBusyBuffer) - return driver.ErrBadConn - } - - // Add the clear password [null terminated string] - copy(data[4:], mc.cfg.Passwd) - data[4+pktLen-1] = 0x00 - - return mc.writePacket(data) -} - -// Native password authentication method -// http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::AuthSwitchResponse -func (mc *mysqlConn) writeNativeAuthPacket(cipher []byte) error { - scrambleBuff := scramblePassword(cipher, []byte(mc.cfg.Passwd)) - - // Calculate the packet length and add a tailing 0 - pktLen := len(scrambleBuff) - data := mc.buf.takeSmallBuffer(4 + pktLen) - if data == nil { - // can not take the buffer. Something must be wrong with the connection - errLog.Print(ErrBusyBuffer) - return driver.ErrBadConn - } - - // Add the scramble - copy(data[4:], scrambleBuff) - - return mc.writePacket(data) -} - -/****************************************************************************** -* Command Packets * -******************************************************************************/ - -func (mc *mysqlConn) writeCommandPacket(command byte) error { - // Reset Packet Sequence - mc.sequence = 0 - - data := mc.buf.takeSmallBuffer(4 + 1) - if data == nil { - // can not take the buffer. Something must be wrong with the connection - errLog.Print(ErrBusyBuffer) - return driver.ErrBadConn - } - - // Add command byte - data[4] = command - - // Send CMD packet - return mc.writePacket(data) -} - -func (mc *mysqlConn) writeCommandPacketStr(command byte, arg string) error { - // Reset Packet Sequence - mc.sequence = 0 - - pktLen := 1 + len(arg) - data := mc.buf.takeBuffer(pktLen + 4) - if data == nil { - // can not take the buffer. Something must be wrong with the connection - errLog.Print(ErrBusyBuffer) - return driver.ErrBadConn - } - - // Add command byte - data[4] = command - - // Add arg - copy(data[5:], arg) - - // Send CMD packet - return mc.writePacket(data) -} - -func (mc *mysqlConn) writeCommandPacketUint32(command byte, arg uint32) error { - // Reset Packet Sequence - mc.sequence = 0 - - data := mc.buf.takeSmallBuffer(4 + 1 + 4) - if data == nil { - // can not take the buffer. Something must be wrong with the connection - errLog.Print(ErrBusyBuffer) - return driver.ErrBadConn - } - - // Add command byte - data[4] = command - - // Add arg [32 bit] - data[5] = byte(arg) - data[6] = byte(arg >> 8) - data[7] = byte(arg >> 16) - data[8] = byte(arg >> 24) - - // Send CMD packet - return mc.writePacket(data) -} - -/****************************************************************************** -* Result Packets * -******************************************************************************/ - -// Returns error if Packet is not an 'Result OK'-Packet -func (mc *mysqlConn) readResultOK() ([]byte, error) { - data, err := mc.readPacket() - if err == nil { - // packet indicator - switch data[0] { - - case iOK: - return nil, mc.handleOkPacket(data) - - case iEOF: - if len(data) > 1 { - pluginEndIndex := bytes.IndexByte(data, 0x00) - plugin := string(data[1:pluginEndIndex]) - cipher := data[pluginEndIndex+1 : len(data)-1] - - if plugin == "mysql_old_password" { - // using old_passwords - return cipher, ErrOldPassword - } else if plugin == "mysql_clear_password" { - // using clear text password - return cipher, ErrCleartextPassword - } else if plugin == "mysql_native_password" { - // using mysql default authentication method - return cipher, ErrNativePassword - } else { - return cipher, ErrUnknownPlugin - } - } else { - // https://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::OldAuthSwitchRequest - return nil, ErrOldPassword - } - - default: // Error otherwise - return nil, mc.handleErrorPacket(data) - } - } - return nil, err -} - -// Result Set Header Packet -// http://dev.mysql.com/doc/internals/en/com-query-response.html#packet-ProtocolText::Resultset -func (mc *mysqlConn) readResultSetHeaderPacket() (int, error) { - data, err := mc.readPacket() - if err == nil { - switch data[0] { - - case iOK: - return 0, mc.handleOkPacket(data) - - case iERR: - return 0, mc.handleErrorPacket(data) - - case iLocalInFile: - return 0, mc.handleInFileRequest(string(data[1:])) - } - - // column count - num, _, n := readLengthEncodedInteger(data) - if n-len(data) == 0 { - return int(num), nil - } - - return 0, ErrMalformPkt - } - return 0, err -} - -// Error Packet -// http://dev.mysql.com/doc/internals/en/generic-response-packets.html#packet-ERR_Packet -func (mc *mysqlConn) handleErrorPacket(data []byte) error { - if data[0] != iERR { - return ErrMalformPkt - } - - // 0xff [1 byte] - - // Error Number [16 bit uint] - errno := binary.LittleEndian.Uint16(data[1:3]) - - pos := 3 - - // SQL State [optional: # + 5bytes string] - if data[3] == 0x23 { - //sqlstate := string(data[4 : 4+5]) - pos = 9 - } - - // Error Message [string] - return &MySQLError{ - Number: errno, - Message: string(data[pos:]), - } -} - -func readStatus(b []byte) statusFlag { - return statusFlag(b[0]) | statusFlag(b[1])<<8 -} - -// Ok Packet -// http://dev.mysql.com/doc/internals/en/generic-response-packets.html#packet-OK_Packet -func (mc *mysqlConn) handleOkPacket(data []byte) error { - var n, m int - - // 0x00 [1 byte] - - // Affected rows [Length Coded Binary] - mc.affectedRows, _, n = readLengthEncodedInteger(data[1:]) - - // Insert id [Length Coded Binary] - mc.insertId, _, m = readLengthEncodedInteger(data[1+n:]) - - // server_status [2 bytes] - mc.status = readStatus(data[1+n+m : 1+n+m+2]) - if err := mc.discardResults(); err != nil { - return err - } - - // warning count [2 bytes] - if !mc.strict { - return nil - } - - pos := 1 + n + m + 2 - if binary.LittleEndian.Uint16(data[pos:pos+2]) > 0 { - return mc.getWarnings() - } - return nil -} - -// Read Packets as Field Packets until EOF-Packet or an Error appears -// http://dev.mysql.com/doc/internals/en/com-query-response.html#packet-Protocol::ColumnDefinition41 -func (mc *mysqlConn) readColumns(count int) ([]mysqlField, error) { - columns := make([]mysqlField, count) - - for i := 0; ; i++ { - data, err := mc.readPacket() - if err != nil { - return nil, err - } - - // EOF Packet - if data[0] == iEOF && (len(data) == 5 || len(data) == 1) { - if i == count { - return columns, nil - } - return nil, fmt.Errorf("column count mismatch n:%d len:%d", count, len(columns)) - } - - // Catalog - pos, err := skipLengthEncodedString(data) - if err != nil { - return nil, err - } - - // Database [len coded string] - n, err := skipLengthEncodedString(data[pos:]) - if err != nil { - return nil, err - } - pos += n - - // Table [len coded string] - if mc.cfg.ColumnsWithAlias { - tableName, _, n, err := readLengthEncodedString(data[pos:]) - if err != nil { - return nil, err - } - pos += n - columns[i].tableName = string(tableName) - } else { - n, err = skipLengthEncodedString(data[pos:]) - if err != nil { - return nil, err - } - pos += n - } - - // Original table [len coded string] - n, err = skipLengthEncodedString(data[pos:]) - if err != nil { - return nil, err - } - pos += n - - // Name [len coded string] - name, _, n, err := readLengthEncodedString(data[pos:]) - if err != nil { - return nil, err - } - columns[i].name = string(name) - pos += n - - // Original name [len coded string] - n, err = skipLengthEncodedString(data[pos:]) - if err != nil { - return nil, err - } - - // Filler [uint8] - // Charset [charset, collation uint8] - // Length [uint32] - pos += n + 1 + 2 + 4 - - // Field type [uint8] - columns[i].fieldType = data[pos] - pos++ - - // Flags [uint16] - columns[i].flags = fieldFlag(binary.LittleEndian.Uint16(data[pos : pos+2])) - pos += 2 - - // Decimals [uint8] - columns[i].decimals = data[pos] - //pos++ - - // Default value [len coded binary] - //if pos < len(data) { - // defaultVal, _, err = bytesToLengthCodedBinary(data[pos:]) - //} - } -} - -// Read Packets as Field Packets until EOF-Packet or an Error appears -// http://dev.mysql.com/doc/internals/en/com-query-response.html#packet-ProtocolText::ResultsetRow -func (rows *textRows) readRow(dest []driver.Value) error { - mc := rows.mc - - data, err := mc.readPacket() - if err != nil { - return err - } - - // EOF Packet - if data[0] == iEOF && len(data) == 5 { - // server_status [2 bytes] - rows.mc.status = readStatus(data[3:]) - err = rows.mc.discardResults() - if err == nil { - err = io.EOF - } else { - // connection unusable - rows.mc.Close() - } - rows.mc = nil - return err - } - if data[0] == iERR { - rows.mc = nil - return mc.handleErrorPacket(data) - } - - // RowSet Packet - var n int - var isNull bool - pos := 0 - - for i := range dest { - // Read bytes and convert to string - dest[i], isNull, n, err = readLengthEncodedString(data[pos:]) - pos += n - if err == nil { - if !isNull { - if !mc.parseTime { - continue - } else { - switch rows.columns[i].fieldType { - case fieldTypeTimestamp, fieldTypeDateTime, - fieldTypeDate, fieldTypeNewDate: - dest[i], err = parseDateTime( - string(dest[i].([]byte)), - mc.cfg.Loc, - ) - if err == nil { - continue - } - default: - continue - } - } - - } else { - dest[i] = nil - continue - } - } - return err // err != nil - } - - return nil -} - -// Reads Packets until EOF-Packet or an Error appears. Returns count of Packets read -func (mc *mysqlConn) readUntilEOF() error { - for { - data, err := mc.readPacket() - if err != nil { - return err - } - - switch data[0] { - case iERR: - return mc.handleErrorPacket(data) - case iEOF: - if len(data) == 5 { - mc.status = readStatus(data[3:]) - } - return nil - } - } -} - -/****************************************************************************** -* Prepared Statements * -******************************************************************************/ - -// Prepare Result Packets -// http://dev.mysql.com/doc/internals/en/com-stmt-prepare-response.html -func (stmt *mysqlStmt) readPrepareResultPacket() (uint16, error) { - data, err := stmt.mc.readPacket() - if err == nil { - // packet indicator [1 byte] - if data[0] != iOK { - return 0, stmt.mc.handleErrorPacket(data) - } - - // statement id [4 bytes] - stmt.id = binary.LittleEndian.Uint32(data[1:5]) - - // Column count [16 bit uint] - columnCount := binary.LittleEndian.Uint16(data[5:7]) - - // Param count [16 bit uint] - stmt.paramCount = int(binary.LittleEndian.Uint16(data[7:9])) - - // Reserved [8 bit] - - // Warning count [16 bit uint] - if !stmt.mc.strict { - return columnCount, nil - } - - // Check for warnings count > 0, only available in MySQL > 4.1 - if len(data) >= 12 && binary.LittleEndian.Uint16(data[10:12]) > 0 { - return columnCount, stmt.mc.getWarnings() - } - return columnCount, nil - } - return 0, err -} - -// http://dev.mysql.com/doc/internals/en/com-stmt-send-long-data.html -func (stmt *mysqlStmt) writeCommandLongData(paramID int, arg []byte) error { - maxLen := stmt.mc.maxAllowedPacket - 1 - pktLen := maxLen - - // After the header (bytes 0-3) follows before the data: - // 1 byte command - // 4 bytes stmtID - // 2 bytes paramID - const dataOffset = 1 + 4 + 2 - - // Can not use the write buffer since - // a) the buffer is too small - // b) it is in use - data := make([]byte, 4+1+4+2+len(arg)) - - copy(data[4+dataOffset:], arg) - - for argLen := len(arg); argLen > 0; argLen -= pktLen - dataOffset { - if dataOffset+argLen < maxLen { - pktLen = dataOffset + argLen - } - - stmt.mc.sequence = 0 - // Add command byte [1 byte] - data[4] = comStmtSendLongData - - // Add stmtID [32 bit] - data[5] = byte(stmt.id) - data[6] = byte(stmt.id >> 8) - data[7] = byte(stmt.id >> 16) - data[8] = byte(stmt.id >> 24) - - // Add paramID [16 bit] - data[9] = byte(paramID) - data[10] = byte(paramID >> 8) - - // Send CMD packet - err := stmt.mc.writePacket(data[:4+pktLen]) - if err == nil { - data = data[pktLen-dataOffset:] - continue - } - return err - - } - - // Reset Packet Sequence - stmt.mc.sequence = 0 - return nil -} - -// Execute Prepared Statement -// http://dev.mysql.com/doc/internals/en/com-stmt-execute.html -func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error { - if len(args) != stmt.paramCount { - return fmt.Errorf( - "argument count mismatch (got: %d; has: %d)", - len(args), - stmt.paramCount, - ) - } - - const minPktLen = 4 + 1 + 4 + 1 + 4 - mc := stmt.mc - - // Reset packet-sequence - mc.sequence = 0 - - var data []byte - - if len(args) == 0 { - data = mc.buf.takeBuffer(minPktLen) - } else { - data = mc.buf.takeCompleteBuffer() - } - if data == nil { - // can not take the buffer. Something must be wrong with the connection - errLog.Print(ErrBusyBuffer) - return driver.ErrBadConn - } - - // command [1 byte] - data[4] = comStmtExecute - - // statement_id [4 bytes] - data[5] = byte(stmt.id) - data[6] = byte(stmt.id >> 8) - data[7] = byte(stmt.id >> 16) - data[8] = byte(stmt.id >> 24) - - // flags (0: CURSOR_TYPE_NO_CURSOR) [1 byte] - data[9] = 0x00 - - // iteration_count (uint32(1)) [4 bytes] - data[10] = 0x01 - data[11] = 0x00 - data[12] = 0x00 - data[13] = 0x00 - - if len(args) > 0 { - pos := minPktLen - - var nullMask []byte - if maskLen, typesLen := (len(args)+7)/8, 1+2*len(args); pos+maskLen+typesLen >= len(data) { - // buffer has to be extended but we don't know by how much so - // we depend on append after all data with known sizes fit. - // We stop at that because we deal with a lot of columns here - // which makes the required allocation size hard to guess. - tmp := make([]byte, pos+maskLen+typesLen) - copy(tmp[:pos], data[:pos]) - data = tmp - nullMask = data[pos : pos+maskLen] - pos += maskLen - } else { - nullMask = data[pos : pos+maskLen] - for i := 0; i < maskLen; i++ { - nullMask[i] = 0 - } - pos += maskLen - } - - // newParameterBoundFlag 1 [1 byte] - data[pos] = 0x01 - pos++ - - // type of each parameter [len(args)*2 bytes] - paramTypes := data[pos:] - pos += len(args) * 2 - - // value of each parameter [n bytes] - paramValues := data[pos:pos] - valuesCap := cap(paramValues) - - for i, arg := range args { - // build NULL-bitmap - if arg == nil { - nullMask[i/8] |= 1 << (uint(i) & 7) - paramTypes[i+i] = fieldTypeNULL - paramTypes[i+i+1] = 0x00 - continue - } - - // cache types and values - switch v := arg.(type) { - case int64: - paramTypes[i+i] = fieldTypeLongLong - paramTypes[i+i+1] = 0x00 - - if cap(paramValues)-len(paramValues)-8 >= 0 { - paramValues = paramValues[:len(paramValues)+8] - binary.LittleEndian.PutUint64( - paramValues[len(paramValues)-8:], - uint64(v), - ) - } else { - paramValues = append(paramValues, - uint64ToBytes(uint64(v))..., - ) - } - - case float64: - paramTypes[i+i] = fieldTypeDouble - paramTypes[i+i+1] = 0x00 - - if cap(paramValues)-len(paramValues)-8 >= 0 { - paramValues = paramValues[:len(paramValues)+8] - binary.LittleEndian.PutUint64( - paramValues[len(paramValues)-8:], - math.Float64bits(v), - ) - } else { - paramValues = append(paramValues, - uint64ToBytes(math.Float64bits(v))..., - ) - } - - case bool: - paramTypes[i+i] = fieldTypeTiny - paramTypes[i+i+1] = 0x00 - - if v { - paramValues = append(paramValues, 0x01) - } else { - paramValues = append(paramValues, 0x00) - } - - case []byte: - // Common case (non-nil value) first - if v != nil { - paramTypes[i+i] = fieldTypeString - paramTypes[i+i+1] = 0x00 - - if len(v) < mc.maxAllowedPacket-pos-len(paramValues)-(len(args)-(i+1))*64 { - paramValues = appendLengthEncodedInteger(paramValues, - uint64(len(v)), - ) - paramValues = append(paramValues, v...) - } else { - if err := stmt.writeCommandLongData(i, v); err != nil { - return err - } - } - continue - } - - // Handle []byte(nil) as a NULL value - nullMask[i/8] |= 1 << (uint(i) & 7) - paramTypes[i+i] = fieldTypeNULL - paramTypes[i+i+1] = 0x00 - - case string: - paramTypes[i+i] = fieldTypeString - paramTypes[i+i+1] = 0x00 - - if len(v) < mc.maxAllowedPacket-pos-len(paramValues)-(len(args)-(i+1))*64 { - paramValues = appendLengthEncodedInteger(paramValues, - uint64(len(v)), - ) - paramValues = append(paramValues, v...) - } else { - if err := stmt.writeCommandLongData(i, []byte(v)); err != nil { - return err - } - } - - case time.Time: - paramTypes[i+i] = fieldTypeString - paramTypes[i+i+1] = 0x00 - - var val []byte - if v.IsZero() { - val = []byte("0000-00-00") - } else { - val = []byte(v.In(mc.cfg.Loc).Format(timeFormat)) - } - - paramValues = appendLengthEncodedInteger(paramValues, - uint64(len(val)), - ) - paramValues = append(paramValues, val...) - - default: - return fmt.Errorf("can not convert type: %T", arg) - } - } - - // Check if param values exceeded the available buffer - // In that case we must build the data packet with the new values buffer - if valuesCap != cap(paramValues) { - data = append(data[:pos], paramValues...) - mc.buf.buf = data - } - - pos += len(paramValues) - data = data[:pos] - } - - return mc.writePacket(data) -} - -func (mc *mysqlConn) discardResults() error { - for mc.status&statusMoreResultsExists != 0 { - resLen, err := mc.readResultSetHeaderPacket() - if err != nil { - return err - } - if resLen > 0 { - // columns - if err := mc.readUntilEOF(); err != nil { - return err - } - // rows - if err := mc.readUntilEOF(); err != nil { - return err - } - } else { - mc.status &^= statusMoreResultsExists - } - } - return nil -} - -// http://dev.mysql.com/doc/internals/en/binary-protocol-resultset-row.html -func (rows *binaryRows) readRow(dest []driver.Value) error { - data, err := rows.mc.readPacket() - if err != nil { - return err - } - - // packet indicator [1 byte] - if data[0] != iOK { - // EOF Packet - if data[0] == iEOF && len(data) == 5 { - rows.mc.status = readStatus(data[3:]) - err = rows.mc.discardResults() - if err == nil { - err = io.EOF - } else { - // connection unusable - rows.mc.Close() - } - rows.mc = nil - return err - } - rows.mc = nil - - // Error otherwise - return rows.mc.handleErrorPacket(data) - } - - // NULL-bitmap, [(column-count + 7 + 2) / 8 bytes] - pos := 1 + (len(dest)+7+2)>>3 - nullMask := data[1:pos] - - for i := range dest { - // Field is NULL - // (byte >> bit-pos) % 2 == 1 - if ((nullMask[(i+2)>>3] >> uint((i+2)&7)) & 1) == 1 { - dest[i] = nil - continue - } - - // Convert to byte-coded string - switch rows.columns[i].fieldType { - case fieldTypeNULL: - dest[i] = nil - continue - - // Numeric Types - case fieldTypeTiny: - if rows.columns[i].flags&flagUnsigned != 0 { - dest[i] = int64(data[pos]) - } else { - dest[i] = int64(int8(data[pos])) - } - pos++ - continue - - case fieldTypeShort, fieldTypeYear: - if rows.columns[i].flags&flagUnsigned != 0 { - dest[i] = int64(binary.LittleEndian.Uint16(data[pos : pos+2])) - } else { - dest[i] = int64(int16(binary.LittleEndian.Uint16(data[pos : pos+2]))) - } - pos += 2 - continue - - case fieldTypeInt24, fieldTypeLong: - if rows.columns[i].flags&flagUnsigned != 0 { - dest[i] = int64(binary.LittleEndian.Uint32(data[pos : pos+4])) - } else { - dest[i] = int64(int32(binary.LittleEndian.Uint32(data[pos : pos+4]))) - } - pos += 4 - continue - - case fieldTypeLongLong: - if rows.columns[i].flags&flagUnsigned != 0 { - val := binary.LittleEndian.Uint64(data[pos : pos+8]) - if val > math.MaxInt64 { - dest[i] = uint64ToString(val) - } else { - dest[i] = int64(val) - } - } else { - dest[i] = int64(binary.LittleEndian.Uint64(data[pos : pos+8])) - } - pos += 8 - continue - - case fieldTypeFloat: - dest[i] = float32(math.Float32frombits(binary.LittleEndian.Uint32(data[pos : pos+4]))) - pos += 4 - continue - - case fieldTypeDouble: - dest[i] = math.Float64frombits(binary.LittleEndian.Uint64(data[pos : pos+8])) - pos += 8 - continue - - // Length coded Binary Strings - case fieldTypeDecimal, fieldTypeNewDecimal, fieldTypeVarChar, - fieldTypeBit, fieldTypeEnum, fieldTypeSet, fieldTypeTinyBLOB, - fieldTypeMediumBLOB, fieldTypeLongBLOB, fieldTypeBLOB, - fieldTypeVarString, fieldTypeString, fieldTypeGeometry, fieldTypeJSON: - var isNull bool - var n int - dest[i], isNull, n, err = readLengthEncodedString(data[pos:]) - pos += n - if err == nil { - if !isNull { - continue - } else { - dest[i] = nil - continue - } - } - return err - - case - fieldTypeDate, fieldTypeNewDate, // Date YYYY-MM-DD - fieldTypeTime, // Time [-][H]HH:MM:SS[.fractal] - fieldTypeTimestamp, fieldTypeDateTime: // Timestamp YYYY-MM-DD HH:MM:SS[.fractal] - - num, isNull, n := readLengthEncodedInteger(data[pos:]) - pos += n - - switch { - case isNull: - dest[i] = nil - continue - case rows.columns[i].fieldType == fieldTypeTime: - // database/sql does not support an equivalent to TIME, return a string - var dstlen uint8 - switch decimals := rows.columns[i].decimals; decimals { - case 0x00, 0x1f: - dstlen = 8 - case 1, 2, 3, 4, 5, 6: - dstlen = 8 + 1 + decimals - default: - return fmt.Errorf( - "protocol error, illegal decimals value %d", - rows.columns[i].decimals, - ) - } - dest[i], err = formatBinaryDateTime(data[pos:pos+int(num)], dstlen, true) - case rows.mc.parseTime: - dest[i], err = parseBinaryDateTime(num, data[pos:], rows.mc.cfg.Loc) - default: - var dstlen uint8 - if rows.columns[i].fieldType == fieldTypeDate { - dstlen = 10 - } else { - switch decimals := rows.columns[i].decimals; decimals { - case 0x00, 0x1f: - dstlen = 19 - case 1, 2, 3, 4, 5, 6: - dstlen = 19 + 1 + decimals - default: - return fmt.Errorf( - "protocol error, illegal decimals value %d", - rows.columns[i].decimals, - ) - } - } - dest[i], err = formatBinaryDateTime(data[pos:pos+int(num)], dstlen, false) - } - - if err == nil { - pos += int(num) - continue - } else { - return err - } - - // Please report if this happens! - default: - return fmt.Errorf("unknown field type %d", rows.columns[i].fieldType) - } - } - - return nil -} diff --git a/vendor/github.com/go-sql-driver/mysql/result.go b/vendor/github.com/go-sql-driver/mysql/result.go deleted file mode 100644 index c6438d034..000000000 --- a/vendor/github.com/go-sql-driver/mysql/result.go +++ /dev/null @@ -1,22 +0,0 @@ -// Go MySQL Driver - A MySQL-Driver for Go's database/sql package -// -// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at http://mozilla.org/MPL/2.0/. - -package mysql - -type mysqlResult struct { - affectedRows int64 - insertId int64 -} - -func (res *mysqlResult) LastInsertId() (int64, error) { - return res.insertId, nil -} - -func (res *mysqlResult) RowsAffected() (int64, error) { - return res.affectedRows, nil -} diff --git a/vendor/github.com/go-sql-driver/mysql/rows.go b/vendor/github.com/go-sql-driver/mysql/rows.go deleted file mode 100644 index c08255eee..000000000 --- a/vendor/github.com/go-sql-driver/mysql/rows.go +++ /dev/null @@ -1,112 +0,0 @@ -// Go MySQL Driver - A MySQL-Driver for Go's database/sql package -// -// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at http://mozilla.org/MPL/2.0/. - -package mysql - -import ( - "database/sql/driver" - "io" -) - -type mysqlField struct { - tableName string - name string - flags fieldFlag - fieldType byte - decimals byte -} - -type mysqlRows struct { - mc *mysqlConn - columns []mysqlField -} - -type binaryRows struct { - mysqlRows -} - -type textRows struct { - mysqlRows -} - -type emptyRows struct{} - -func (rows *mysqlRows) Columns() []string { - columns := make([]string, len(rows.columns)) - if rows.mc != nil && rows.mc.cfg.ColumnsWithAlias { - for i := range columns { - if tableName := rows.columns[i].tableName; len(tableName) > 0 { - columns[i] = tableName + "." + rows.columns[i].name - } else { - columns[i] = rows.columns[i].name - } - } - } else { - for i := range columns { - columns[i] = rows.columns[i].name - } - } - return columns -} - -func (rows *mysqlRows) Close() error { - mc := rows.mc - if mc == nil { - return nil - } - if mc.netConn == nil { - return ErrInvalidConn - } - - // Remove unread packets from stream - err := mc.readUntilEOF() - if err == nil { - if err = mc.discardResults(); err != nil { - return err - } - } - - rows.mc = nil - return err -} - -func (rows *binaryRows) Next(dest []driver.Value) error { - if mc := rows.mc; mc != nil { - if mc.netConn == nil { - return ErrInvalidConn - } - - // Fetch next row from stream - return rows.readRow(dest) - } - return io.EOF -} - -func (rows *textRows) Next(dest []driver.Value) error { - if mc := rows.mc; mc != nil { - if mc.netConn == nil { - return ErrInvalidConn - } - - // Fetch next row from stream - return rows.readRow(dest) - } - return io.EOF -} - -func (rows emptyRows) Columns() []string { - return nil -} - -func (rows emptyRows) Close() error { - return nil -} - -func (rows emptyRows) Next(dest []driver.Value) error { - return io.EOF -} diff --git a/vendor/github.com/go-sql-driver/mysql/statement.go b/vendor/github.com/go-sql-driver/mysql/statement.go deleted file mode 100644 index 7f9b04585..000000000 --- a/vendor/github.com/go-sql-driver/mysql/statement.go +++ /dev/null @@ -1,153 +0,0 @@ -// Go MySQL Driver - A MySQL-Driver for Go's database/sql package -// -// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at http://mozilla.org/MPL/2.0/. - -package mysql - -import ( - "database/sql/driver" - "fmt" - "reflect" - "strconv" -) - -type mysqlStmt struct { - mc *mysqlConn - id uint32 - paramCount int - columns []mysqlField // cached from the first query -} - -func (stmt *mysqlStmt) Close() error { - if stmt.mc == nil || stmt.mc.netConn == nil { - // driver.Stmt.Close can be called more than once, thus this function - // has to be idempotent. - // See also Issue #450 and golang/go#16019. - //errLog.Print(ErrInvalidConn) - return driver.ErrBadConn - } - - err := stmt.mc.writeCommandPacketUint32(comStmtClose, stmt.id) - stmt.mc = nil - return err -} - -func (stmt *mysqlStmt) NumInput() int { - return stmt.paramCount -} - -func (stmt *mysqlStmt) ColumnConverter(idx int) driver.ValueConverter { - return converter{} -} - -func (stmt *mysqlStmt) Exec(args []driver.Value) (driver.Result, error) { - if stmt.mc.netConn == nil { - errLog.Print(ErrInvalidConn) - return nil, driver.ErrBadConn - } - // Send command - err := stmt.writeExecutePacket(args) - if err != nil { - return nil, err - } - - mc := stmt.mc - - mc.affectedRows = 0 - mc.insertId = 0 - - // Read Result - resLen, err := mc.readResultSetHeaderPacket() - if err == nil { - if resLen > 0 { - // Columns - err = mc.readUntilEOF() - if err != nil { - return nil, err - } - - // Rows - err = mc.readUntilEOF() - } - if err == nil { - return &mysqlResult{ - affectedRows: int64(mc.affectedRows), - insertId: int64(mc.insertId), - }, nil - } - } - - return nil, err -} - -func (stmt *mysqlStmt) Query(args []driver.Value) (driver.Rows, error) { - if stmt.mc.netConn == nil { - errLog.Print(ErrInvalidConn) - return nil, driver.ErrBadConn - } - // Send command - err := stmt.writeExecutePacket(args) - if err != nil { - return nil, err - } - - mc := stmt.mc - - // Read Result - resLen, err := mc.readResultSetHeaderPacket() - if err != nil { - return nil, err - } - - rows := new(binaryRows) - - if resLen > 0 { - rows.mc = mc - // Columns - // If not cached, read them and cache them - if stmt.columns == nil { - rows.columns, err = mc.readColumns(resLen) - stmt.columns = rows.columns - } else { - rows.columns = stmt.columns - err = mc.readUntilEOF() - } - } - - return rows, err -} - -type converter struct{} - -func (c converter) ConvertValue(v interface{}) (driver.Value, error) { - if driver.IsValue(v) { - return v, nil - } - - rv := reflect.ValueOf(v) - switch rv.Kind() { - case reflect.Ptr: - // indirect pointers - if rv.IsNil() { - return nil, nil - } - return c.ConvertValue(rv.Elem().Interface()) - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return rv.Int(), nil - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32: - return int64(rv.Uint()), nil - case reflect.Uint64: - u64 := rv.Uint() - if u64 >= 1<<63 { - return strconv.FormatUint(u64, 10), nil - } - return int64(u64), nil - case reflect.Float32, reflect.Float64: - return rv.Float(), nil - } - return nil, fmt.Errorf("unsupported type %T, a %s", v, rv.Kind()) -} diff --git a/vendor/github.com/go-sql-driver/mysql/transaction.go b/vendor/github.com/go-sql-driver/mysql/transaction.go deleted file mode 100644 index 33c749b35..000000000 --- a/vendor/github.com/go-sql-driver/mysql/transaction.go +++ /dev/null @@ -1,31 +0,0 @@ -// Go MySQL Driver - A MySQL-Driver for Go's database/sql package -// -// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at http://mozilla.org/MPL/2.0/. - -package mysql - -type mysqlTx struct { - mc *mysqlConn -} - -func (tx *mysqlTx) Commit() (err error) { - if tx.mc == nil || tx.mc.netConn == nil { - return ErrInvalidConn - } - err = tx.mc.exec("COMMIT") - tx.mc = nil - return -} - -func (tx *mysqlTx) Rollback() (err error) { - if tx.mc == nil || tx.mc.netConn == nil { - return ErrInvalidConn - } - err = tx.mc.exec("ROLLBACK") - tx.mc = nil - return -} diff --git a/vendor/github.com/go-sql-driver/mysql/utils.go b/vendor/github.com/go-sql-driver/mysql/utils.go deleted file mode 100644 index d523b7ffd..000000000 --- a/vendor/github.com/go-sql-driver/mysql/utils.go +++ /dev/null @@ -1,740 +0,0 @@ -// Go MySQL Driver - A MySQL-Driver for Go's database/sql package -// -// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at http://mozilla.org/MPL/2.0/. - -package mysql - -import ( - "crypto/sha1" - "crypto/tls" - "database/sql/driver" - "encoding/binary" - "fmt" - "io" - "strings" - "time" -) - -var ( - tlsConfigRegister map[string]*tls.Config // Register for custom tls.Configs -) - -// RegisterTLSConfig registers a custom tls.Config to be used with sql.Open. -// Use the key as a value in the DSN where tls=value. -// -// rootCertPool := x509.NewCertPool() -// pem, err := ioutil.ReadFile("/path/ca-cert.pem") -// if err != nil { -// log.Fatal(err) -// } -// if ok := rootCertPool.AppendCertsFromPEM(pem); !ok { -// log.Fatal("Failed to append PEM.") -// } -// clientCert := make([]tls.Certificate, 0, 1) -// certs, err := tls.LoadX509KeyPair("/path/client-cert.pem", "/path/client-key.pem") -// if err != nil { -// log.Fatal(err) -// } -// clientCert = append(clientCert, certs) -// mysql.RegisterTLSConfig("custom", &tls.Config{ -// RootCAs: rootCertPool, -// Certificates: clientCert, -// }) -// db, err := sql.Open("mysql", "user@tcp(localhost:3306)/test?tls=custom") -// -func RegisterTLSConfig(key string, config *tls.Config) error { - if _, isBool := readBool(key); isBool || strings.ToLower(key) == "skip-verify" { - return fmt.Errorf("key '%s' is reserved", key) - } - - if tlsConfigRegister == nil { - tlsConfigRegister = make(map[string]*tls.Config) - } - - tlsConfigRegister[key] = config - return nil -} - -// DeregisterTLSConfig removes the tls.Config associated with key. -func DeregisterTLSConfig(key string) { - if tlsConfigRegister != nil { - delete(tlsConfigRegister, key) - } -} - -// Returns the bool value of the input. -// The 2nd return value indicates if the input was a valid bool value -func readBool(input string) (value bool, valid bool) { - switch input { - case "1", "true", "TRUE", "True": - return true, true - case "0", "false", "FALSE", "False": - return false, true - } - - // Not a valid bool value - return -} - -/****************************************************************************** -* Authentication * -******************************************************************************/ - -// Encrypt password using 4.1+ method -func scramblePassword(scramble, password []byte) []byte { - if len(password) == 0 { - return nil - } - - // stage1Hash = SHA1(password) - crypt := sha1.New() - crypt.Write(password) - stage1 := crypt.Sum(nil) - - // scrambleHash = SHA1(scramble + SHA1(stage1Hash)) - // inner Hash - crypt.Reset() - crypt.Write(stage1) - hash := crypt.Sum(nil) - - // outer Hash - crypt.Reset() - crypt.Write(scramble) - crypt.Write(hash) - scramble = crypt.Sum(nil) - - // token = scrambleHash XOR stage1Hash - for i := range scramble { - scramble[i] ^= stage1[i] - } - return scramble -} - -// Encrypt password using pre 4.1 (old password) method -// https://github.com/atcurtis/mariadb/blob/master/mysys/my_rnd.c -type myRnd struct { - seed1, seed2 uint32 -} - -const myRndMaxVal = 0x3FFFFFFF - -// Pseudo random number generator -func newMyRnd(seed1, seed2 uint32) *myRnd { - return &myRnd{ - seed1: seed1 % myRndMaxVal, - seed2: seed2 % myRndMaxVal, - } -} - -// Tested to be equivalent to MariaDB's floating point variant -// http://play.golang.org/p/QHvhd4qved -// http://play.golang.org/p/RG0q4ElWDx -func (r *myRnd) NextByte() byte { - r.seed1 = (r.seed1*3 + r.seed2) % myRndMaxVal - r.seed2 = (r.seed1 + r.seed2 + 33) % myRndMaxVal - - return byte(uint64(r.seed1) * 31 / myRndMaxVal) -} - -// Generate binary hash from byte string using insecure pre 4.1 method -func pwHash(password []byte) (result [2]uint32) { - var add uint32 = 7 - var tmp uint32 - - result[0] = 1345345333 - result[1] = 0x12345671 - - for _, c := range password { - // skip spaces and tabs in password - if c == ' ' || c == '\t' { - continue - } - - tmp = uint32(c) - result[0] ^= (((result[0] & 63) + add) * tmp) + (result[0] << 8) - result[1] += (result[1] << 8) ^ result[0] - add += tmp - } - - // Remove sign bit (1<<31)-1) - result[0] &= 0x7FFFFFFF - result[1] &= 0x7FFFFFFF - - return -} - -// Encrypt password using insecure pre 4.1 method -func scrambleOldPassword(scramble, password []byte) []byte { - if len(password) == 0 { - return nil - } - - scramble = scramble[:8] - - hashPw := pwHash(password) - hashSc := pwHash(scramble) - - r := newMyRnd(hashPw[0]^hashSc[0], hashPw[1]^hashSc[1]) - - var out [8]byte - for i := range out { - out[i] = r.NextByte() + 64 - } - - mask := r.NextByte() - for i := range out { - out[i] ^= mask - } - - return out[:] -} - -/****************************************************************************** -* Time related utils * -******************************************************************************/ - -// NullTime represents a time.Time that may be NULL. -// NullTime implements the Scanner interface so -// it can be used as a scan destination: -// -// var nt NullTime -// err := db.QueryRow("SELECT time FROM foo WHERE id=?", id).Scan(&nt) -// ... -// if nt.Valid { -// // use nt.Time -// } else { -// // NULL value -// } -// -// This NullTime implementation is not driver-specific -type NullTime struct { - Time time.Time - Valid bool // Valid is true if Time is not NULL -} - -// Scan implements the Scanner interface. -// The value type must be time.Time or string / []byte (formatted time-string), -// otherwise Scan fails. -func (nt *NullTime) Scan(value interface{}) (err error) { - if value == nil { - nt.Time, nt.Valid = time.Time{}, false - return - } - - switch v := value.(type) { - case time.Time: - nt.Time, nt.Valid = v, true - return - case []byte: - nt.Time, err = parseDateTime(string(v), time.UTC) - nt.Valid = (err == nil) - return - case string: - nt.Time, err = parseDateTime(v, time.UTC) - nt.Valid = (err == nil) - return - } - - nt.Valid = false - return fmt.Errorf("Can't convert %T to time.Time", value) -} - -// Value implements the driver Valuer interface. -func (nt NullTime) Value() (driver.Value, error) { - if !nt.Valid { - return nil, nil - } - return nt.Time, nil -} - -func parseDateTime(str string, loc *time.Location) (t time.Time, err error) { - base := "0000-00-00 00:00:00.0000000" - switch len(str) { - case 10, 19, 21, 22, 23, 24, 25, 26: // up to "YYYY-MM-DD HH:MM:SS.MMMMMM" - if str == base[:len(str)] { - return - } - t, err = time.Parse(timeFormat[:len(str)], str) - default: - err = fmt.Errorf("invalid time string: %s", str) - return - } - - // Adjust location - if err == nil && loc != time.UTC { - y, mo, d := t.Date() - h, mi, s := t.Clock() - t, err = time.Date(y, mo, d, h, mi, s, t.Nanosecond(), loc), nil - } - - return -} - -func parseBinaryDateTime(num uint64, data []byte, loc *time.Location) (driver.Value, error) { - switch num { - case 0: - return time.Time{}, nil - case 4: - return time.Date( - int(binary.LittleEndian.Uint16(data[:2])), // year - time.Month(data[2]), // month - int(data[3]), // day - 0, 0, 0, 0, - loc, - ), nil - case 7: - return time.Date( - int(binary.LittleEndian.Uint16(data[:2])), // year - time.Month(data[2]), // month - int(data[3]), // day - int(data[4]), // hour - int(data[5]), // minutes - int(data[6]), // seconds - 0, - loc, - ), nil - case 11: - return time.Date( - int(binary.LittleEndian.Uint16(data[:2])), // year - time.Month(data[2]), // month - int(data[3]), // day - int(data[4]), // hour - int(data[5]), // minutes - int(data[6]), // seconds - int(binary.LittleEndian.Uint32(data[7:11]))*1000, // nanoseconds - loc, - ), nil - } - return nil, fmt.Errorf("invalid DATETIME packet length %d", num) -} - -// zeroDateTime is used in formatBinaryDateTime to avoid an allocation -// if the DATE or DATETIME has the zero value. -// It must never be changed. -// The current behavior depends on database/sql copying the result. -var zeroDateTime = []byte("0000-00-00 00:00:00.000000") - -const digits01 = "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" -const digits10 = "0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999" - -func formatBinaryDateTime(src []byte, length uint8, justTime bool) (driver.Value, error) { - // length expects the deterministic length of the zero value, - // negative time and 100+ hours are automatically added if needed - if len(src) == 0 { - if justTime { - return zeroDateTime[11 : 11+length], nil - } - return zeroDateTime[:length], nil - } - var dst []byte // return value - var pt, p1, p2, p3 byte // current digit pair - var zOffs byte // offset of value in zeroDateTime - if justTime { - switch length { - case - 8, // time (can be up to 10 when negative and 100+ hours) - 10, 11, 12, 13, 14, 15: // time with fractional seconds - default: - return nil, fmt.Errorf("illegal TIME length %d", length) - } - switch len(src) { - case 8, 12: - default: - return nil, fmt.Errorf("invalid TIME packet length %d", len(src)) - } - // +2 to enable negative time and 100+ hours - dst = make([]byte, 0, length+2) - if src[0] == 1 { - dst = append(dst, '-') - } - if src[1] != 0 { - hour := uint16(src[1])*24 + uint16(src[5]) - pt = byte(hour / 100) - p1 = byte(hour - 100*uint16(pt)) - dst = append(dst, digits01[pt]) - } else { - p1 = src[5] - } - zOffs = 11 - src = src[6:] - } else { - switch length { - case 10, 19, 21, 22, 23, 24, 25, 26: - default: - t := "DATE" - if length > 10 { - t += "TIME" - } - return nil, fmt.Errorf("illegal %s length %d", t, length) - } - switch len(src) { - case 4, 7, 11: - default: - t := "DATE" - if length > 10 { - t += "TIME" - } - return nil, fmt.Errorf("illegal %s packet length %d", t, len(src)) - } - dst = make([]byte, 0, length) - // start with the date - year := binary.LittleEndian.Uint16(src[:2]) - pt = byte(year / 100) - p1 = byte(year - 100*uint16(pt)) - p2, p3 = src[2], src[3] - dst = append(dst, - digits10[pt], digits01[pt], - digits10[p1], digits01[p1], '-', - digits10[p2], digits01[p2], '-', - digits10[p3], digits01[p3], - ) - if length == 10 { - return dst, nil - } - if len(src) == 4 { - return append(dst, zeroDateTime[10:length]...), nil - } - dst = append(dst, ' ') - p1 = src[4] // hour - src = src[5:] - } - // p1 is 2-digit hour, src is after hour - p2, p3 = src[0], src[1] - dst = append(dst, - digits10[p1], digits01[p1], ':', - digits10[p2], digits01[p2], ':', - digits10[p3], digits01[p3], - ) - if length <= byte(len(dst)) { - return dst, nil - } - src = src[2:] - if len(src) == 0 { - return append(dst, zeroDateTime[19:zOffs+length]...), nil - } - microsecs := binary.LittleEndian.Uint32(src[:4]) - p1 = byte(microsecs / 10000) - microsecs -= 10000 * uint32(p1) - p2 = byte(microsecs / 100) - microsecs -= 100 * uint32(p2) - p3 = byte(microsecs) - switch decimals := zOffs + length - 20; decimals { - default: - return append(dst, '.', - digits10[p1], digits01[p1], - digits10[p2], digits01[p2], - digits10[p3], digits01[p3], - ), nil - case 1: - return append(dst, '.', - digits10[p1], - ), nil - case 2: - return append(dst, '.', - digits10[p1], digits01[p1], - ), nil - case 3: - return append(dst, '.', - digits10[p1], digits01[p1], - digits10[p2], - ), nil - case 4: - return append(dst, '.', - digits10[p1], digits01[p1], - digits10[p2], digits01[p2], - ), nil - case 5: - return append(dst, '.', - digits10[p1], digits01[p1], - digits10[p2], digits01[p2], - digits10[p3], - ), nil - } -} - -/****************************************************************************** -* Convert from and to bytes * -******************************************************************************/ - -func uint64ToBytes(n uint64) []byte { - return []byte{ - byte(n), - byte(n >> 8), - byte(n >> 16), - byte(n >> 24), - byte(n >> 32), - byte(n >> 40), - byte(n >> 48), - byte(n >> 56), - } -} - -func uint64ToString(n uint64) []byte { - var a [20]byte - i := 20 - - // U+0030 = 0 - // ... - // U+0039 = 9 - - var q uint64 - for n >= 10 { - i-- - q = n / 10 - a[i] = uint8(n-q*10) + 0x30 - n = q - } - - i-- - a[i] = uint8(n) + 0x30 - - return a[i:] -} - -// treats string value as unsigned integer representation -func stringToInt(b []byte) int { - val := 0 - for i := range b { - val *= 10 - val += int(b[i] - 0x30) - } - return val -} - -// returns the string read as a bytes slice, wheter the value is NULL, -// the number of bytes read and an error, in case the string is longer than -// the input slice -func readLengthEncodedString(b []byte) ([]byte, bool, int, error) { - // Get length - num, isNull, n := readLengthEncodedInteger(b) - if num < 1 { - return b[n:n], isNull, n, nil - } - - n += int(num) - - // Check data length - if len(b) >= n { - return b[n-int(num) : n], false, n, nil - } - return nil, false, n, io.EOF -} - -// returns the number of bytes skipped and an error, in case the string is -// longer than the input slice -func skipLengthEncodedString(b []byte) (int, error) { - // Get length - num, _, n := readLengthEncodedInteger(b) - if num < 1 { - return n, nil - } - - n += int(num) - - // Check data length - if len(b) >= n { - return n, nil - } - return n, io.EOF -} - -// returns the number read, whether the value is NULL and the number of bytes read -func readLengthEncodedInteger(b []byte) (uint64, bool, int) { - // See issue #349 - if len(b) == 0 { - return 0, true, 1 - } - switch b[0] { - - // 251: NULL - case 0xfb: - return 0, true, 1 - - // 252: value of following 2 - case 0xfc: - return uint64(b[1]) | uint64(b[2])<<8, false, 3 - - // 253: value of following 3 - case 0xfd: - return uint64(b[1]) | uint64(b[2])<<8 | uint64(b[3])<<16, false, 4 - - // 254: value of following 8 - case 0xfe: - return uint64(b[1]) | uint64(b[2])<<8 | uint64(b[3])<<16 | - uint64(b[4])<<24 | uint64(b[5])<<32 | uint64(b[6])<<40 | - uint64(b[7])<<48 | uint64(b[8])<<56, - false, 9 - } - - // 0-250: value of first byte - return uint64(b[0]), false, 1 -} - -// encodes a uint64 value and appends it to the given bytes slice -func appendLengthEncodedInteger(b []byte, n uint64) []byte { - switch { - case n <= 250: - return append(b, byte(n)) - - case n <= 0xffff: - return append(b, 0xfc, byte(n), byte(n>>8)) - - case n <= 0xffffff: - return append(b, 0xfd, byte(n), byte(n>>8), byte(n>>16)) - } - return append(b, 0xfe, byte(n), byte(n>>8), byte(n>>16), byte(n>>24), - byte(n>>32), byte(n>>40), byte(n>>48), byte(n>>56)) -} - -// reserveBuffer checks cap(buf) and expand buffer to len(buf) + appendSize. -// If cap(buf) is not enough, reallocate new buffer. -func reserveBuffer(buf []byte, appendSize int) []byte { - newSize := len(buf) + appendSize - if cap(buf) < newSize { - // Grow buffer exponentially - newBuf := make([]byte, len(buf)*2+appendSize) - copy(newBuf, buf) - buf = newBuf - } - return buf[:newSize] -} - -// escapeBytesBackslash escapes []byte with backslashes (\) -// This escapes the contents of a string (provided as []byte) by adding backslashes before special -// characters, and turning others into specific escape sequences, such as -// turning newlines into \n and null bytes into \0. -// https://github.com/mysql/mysql-server/blob/mysql-5.7.5/mysys/charset.c#L823-L932 -func escapeBytesBackslash(buf, v []byte) []byte { - pos := len(buf) - buf = reserveBuffer(buf, len(v)*2) - - for _, c := range v { - switch c { - case '\x00': - buf[pos] = '\\' - buf[pos+1] = '0' - pos += 2 - case '\n': - buf[pos] = '\\' - buf[pos+1] = 'n' - pos += 2 - case '\r': - buf[pos] = '\\' - buf[pos+1] = 'r' - pos += 2 - case '\x1a': - buf[pos] = '\\' - buf[pos+1] = 'Z' - pos += 2 - case '\'': - buf[pos] = '\\' - buf[pos+1] = '\'' - pos += 2 - case '"': - buf[pos] = '\\' - buf[pos+1] = '"' - pos += 2 - case '\\': - buf[pos] = '\\' - buf[pos+1] = '\\' - pos += 2 - default: - buf[pos] = c - pos++ - } - } - - return buf[:pos] -} - -// escapeStringBackslash is similar to escapeBytesBackslash but for string. -func escapeStringBackslash(buf []byte, v string) []byte { - pos := len(buf) - buf = reserveBuffer(buf, len(v)*2) - - for i := 0; i < len(v); i++ { - c := v[i] - switch c { - case '\x00': - buf[pos] = '\\' - buf[pos+1] = '0' - pos += 2 - case '\n': - buf[pos] = '\\' - buf[pos+1] = 'n' - pos += 2 - case '\r': - buf[pos] = '\\' - buf[pos+1] = 'r' - pos += 2 - case '\x1a': - buf[pos] = '\\' - buf[pos+1] = 'Z' - pos += 2 - case '\'': - buf[pos] = '\\' - buf[pos+1] = '\'' - pos += 2 - case '"': - buf[pos] = '\\' - buf[pos+1] = '"' - pos += 2 - case '\\': - buf[pos] = '\\' - buf[pos+1] = '\\' - pos += 2 - default: - buf[pos] = c - pos++ - } - } - - return buf[:pos] -} - -// escapeBytesQuotes escapes apostrophes in []byte by doubling them up. -// This escapes the contents of a string by doubling up any apostrophes that -// it contains. This is used when the NO_BACKSLASH_ESCAPES SQL_MODE is in -// effect on the server. -// https://github.com/mysql/mysql-server/blob/mysql-5.7.5/mysys/charset.c#L963-L1038 -func escapeBytesQuotes(buf, v []byte) []byte { - pos := len(buf) - buf = reserveBuffer(buf, len(v)*2) - - for _, c := range v { - if c == '\'' { - buf[pos] = '\'' - buf[pos+1] = '\'' - pos += 2 - } else { - buf[pos] = c - pos++ - } - } - - return buf[:pos] -} - -// escapeStringQuotes is similar to escapeBytesQuotes but for string. -func escapeStringQuotes(buf []byte, v string) []byte { - pos := len(buf) - buf = reserveBuffer(buf, len(v)*2) - - for i := 0; i < len(v); i++ { - c := v[i] - if c == '\'' { - buf[pos] = '\'' - buf[pos+1] = '\'' - pos += 2 - } else { - buf[pos] = c - pos++ - } - } - - return buf[:pos] -} diff --git a/vendor/github.com/go-xorm/builder/LICENSE b/vendor/github.com/go-xorm/builder/LICENSE deleted file mode 100644 index 614d5e282..000000000 --- a/vendor/github.com/go-xorm/builder/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2016 The Xorm Authors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the {organization} 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 COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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. diff --git a/vendor/github.com/go-xorm/builder/README.md b/vendor/github.com/go-xorm/builder/README.md deleted file mode 100644 index 162873637..000000000 --- a/vendor/github.com/go-xorm/builder/README.md +++ /dev/null @@ -1,175 +0,0 @@ -# SQL builder - -[![CircleCI](https://circleci.com/gh/go-xorm/builder/tree/master.svg?style=svg)](https://circleci.com/gh/go-xorm/builder/tree/master) - -Package builder is a lightweight and fast SQL builder for Go and XORM. - -Make sure you have installed Go 1.1+ and then: - - go get github.com/go-xorm/builder - -# Insert - -```Go -sql, args, err := Insert(Eq{"c": 1, "d": 2}).Into("table1").ToSQL() -``` - -# Select - -```Go -sql, args, err := Select("c, d").From("table1").Where(Eq{"a": 1}).ToSQL() - -sql, args, err = Select("c, d").From("table1").LeftJoin("table2", Eq{"table1.id": 1}.And(Lt{"table2.id": 3})). - RightJoin("table3", "table2.id = table3.tid").Where(Eq{"a": 1}).ToSQL() -``` - -# Update - -```Go -sql, args, err := Update(Eq{"a": 2}).From("table1").Where(Eq{"a": 1}).ToSQL() -``` - -# Delete - -```Go -sql, args, err := Delete(Eq{"a": 1}).From("table1").ToSQL() -``` - -# Conditions - -* `Eq` is a redefine of a map, you can give one or more conditions to `Eq` - -```Go -import . "github.com/go-xorm/builder" - -sql, args, _ := ToSQL(Eq{"a":1}) -// a=? [1] -sql, args, _ := ToSQL(Eq{"b":"c"}.And(Eq{"c": 0})) -// b=? AND c=? ["c", 0] -sql, args, _ := ToSQL(Eq{"b":"c", "c":0}) -// b=? AND c=? ["c", 0] -sql, args, _ := ToSQL(Eq{"b":"c"}.Or(Eq{"b":"d"})) -// b=? OR b=? ["c", "d"] -sql, args, _ := ToSQL(Eq{"b": []string{"c", "d"}}) -// b IN (?,?) ["c", "d"] -sql, args, _ := ToSQL(Eq{"b": 1, "c":[]int{2, 3}}) -// b=? AND c IN (?,?) [1, 2, 3] -``` - -* `Neq` is the same to `Eq` - -```Go -import . "github.com/go-xorm/builder" - -sql, args, _ := ToSQL(Neq{"a":1}) -// a<>? [1] -sql, args, _ := ToSQL(Neq{"b":"c"}.And(Neq{"c": 0})) -// b<>? AND c<>? ["c", 0] -sql, args, _ := ToSQL(Neq{"b":"c", "c":0}) -// b<>? AND c<>? ["c", 0] -sql, args, _ := ToSQL(Neq{"b":"c"}.Or(Neq{"b":"d"})) -// b<>? OR b<>? ["c", "d"] -sql, args, _ := ToSQL(Neq{"b": []string{"c", "d"}}) -// b NOT IN (?,?) ["c", "d"] -sql, args, _ := ToSQL(Neq{"b": 1, "c":[]int{2, 3}}) -// b<>? AND c NOT IN (?,?) [1, 2, 3] -``` - -* `Gt`, `Gte`, `Lt`, `Lte` - -```Go -import . "github.com/go-xorm/builder" - -sql, args, _ := ToSQL(Gt{"a", 1}.And(Gte{"b", 2})) -// a>? AND b>=? [1, 2] -sql, args, _ := ToSQL(Lt{"a", 1}.Or(Lte{"b", 2})) -// a? [1, %c%, 2] -``` - -* `Or(conds ...Cond)`, Or can connect one or more conditions via Or - -```Go -import . "github.com/go-xorm/builder" - -sql, args, _ := ToSQL(Or(Eq{"a":1}, Like{"b", "c"}, Neq{"d", 2})) -// a=? OR b LIKE ? OR d<>? [1, %c%, 2] -sql, args, _ := ToSQL(Or(Eq{"a":1}, And(Like{"b", "c"}, Neq{"d", 2}))) -// a=? OR (b LIKE ? AND d<>?) [1, %c%, 2] -``` - -* `Between` - -```Go -import . "github.com/go-xorm/builder" - -sql, args, _ := ToSQL(Between{"a", 1, 2}) -// a BETWEEN 1 AND 2 -``` - -* Define yourself conditions - -Since `Cond` is an interface. - -```Go -type Cond interface { - WriteTo(Writer) error - And(...Cond) Cond - Or(...Cond) Cond - IsValid() bool -} -``` - -You can define yourself conditions and compose with other `Cond`. \ No newline at end of file diff --git a/vendor/github.com/go-xorm/builder/builder.go b/vendor/github.com/go-xorm/builder/builder.go deleted file mode 100644 index 1253b9887..000000000 --- a/vendor/github.com/go-xorm/builder/builder.go +++ /dev/null @@ -1,190 +0,0 @@ -// Copyright 2016 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package builder - -type optype byte - -const ( - condType optype = iota // only conditions - selectType // select - insertType // insert - updateType // update - deleteType // delete -) - -type join struct { - joinType string - joinTable string - joinCond Cond -} - -// Builder describes a SQL statement -type Builder struct { - optype - tableName string - cond Cond - selects []string - joins []join - inserts Eq - updates []Eq -} - -// Select creates a select Builder -func Select(cols ...string) *Builder { - builder := &Builder{cond: NewCond()} - return builder.Select(cols...) -} - -// Insert creates an insert Builder -func Insert(eq Eq) *Builder { - builder := &Builder{cond: NewCond()} - return builder.Insert(eq) -} - -// Update creates an update Builder -func Update(updates ...Eq) *Builder { - builder := &Builder{cond: NewCond()} - return builder.Update(updates...) -} - -// Delete creates a delete Builder -func Delete(conds ...Cond) *Builder { - builder := &Builder{cond: NewCond()} - return builder.Delete(conds...) -} - -// Where sets where SQL -func (b *Builder) Where(cond Cond) *Builder { - b.cond = b.cond.And(cond) - return b -} - -// From sets the table name -func (b *Builder) From(tableName string) *Builder { - b.tableName = tableName - return b -} - -// Into sets insert table name -func (b *Builder) Into(tableName string) *Builder { - b.tableName = tableName - return b -} - -// Join sets join table and contions -func (b *Builder) Join(joinType, joinTable string, joinCond interface{}) *Builder { - switch joinCond.(type) { - case Cond: - b.joins = append(b.joins, join{joinType, joinTable, joinCond.(Cond)}) - case string: - b.joins = append(b.joins, join{joinType, joinTable, Expr(joinCond.(string))}) - } - - return b -} - -// InnerJoin sets inner join -func (b *Builder) InnerJoin(joinTable string, joinCond interface{}) *Builder { - return b.Join("INNER", joinTable, joinCond) -} - -// LeftJoin sets left join SQL -func (b *Builder) LeftJoin(joinTable string, joinCond interface{}) *Builder { - return b.Join("LEFT", joinTable, joinCond) -} - -// RightJoin sets right join SQL -func (b *Builder) RightJoin(joinTable string, joinCond interface{}) *Builder { - return b.Join("RIGHT", joinTable, joinCond) -} - -// CrossJoin sets cross join SQL -func (b *Builder) CrossJoin(joinTable string, joinCond interface{}) *Builder { - return b.Join("CROSS", joinTable, joinCond) -} - -// FullJoin sets full join SQL -func (b *Builder) FullJoin(joinTable string, joinCond interface{}) *Builder { - return b.Join("FULL", joinTable, joinCond) -} - -// Select sets select SQL -func (b *Builder) Select(cols ...string) *Builder { - b.selects = cols - b.optype = selectType - return b -} - -// And sets AND condition -func (b *Builder) And(cond Cond) *Builder { - b.cond = And(b.cond, cond) - return b -} - -// Or sets OR condition -func (b *Builder) Or(cond Cond) *Builder { - b.cond = Or(b.cond, cond) - return b -} - -// Insert sets insert SQL -func (b *Builder) Insert(eq Eq) *Builder { - b.inserts = eq - b.optype = insertType - return b -} - -// Update sets update SQL -func (b *Builder) Update(updates ...Eq) *Builder { - b.updates = updates - b.optype = updateType - return b -} - -// Delete sets delete SQL -func (b *Builder) Delete(conds ...Cond) *Builder { - b.cond = b.cond.And(conds...) - b.optype = deleteType - return b -} - -// WriteTo implements Writer interface -func (b *Builder) WriteTo(w Writer) error { - switch b.optype { - case condType: - return b.cond.WriteTo(w) - case selectType: - return b.selectWriteTo(w) - case insertType: - return b.insertWriteTo(w) - case updateType: - return b.updateWriteTo(w) - case deleteType: - return b.deleteWriteTo(w) - } - - return ErrNotSupportType -} - -// ToSQL convert a builder to SQL and args -func (b *Builder) ToSQL() (string, []interface{}, error) { - w := NewWriter() - if err := b.WriteTo(w); err != nil { - return "", nil, err - } - - return w.writer.String(), w.args, nil -} - -// ToSQL convert a builder or condtions to SQL and args -func ToSQL(cond interface{}) (string, []interface{}, error) { - switch cond.(type) { - case Cond: - return condToSQL(cond.(Cond)) - case *Builder: - return cond.(*Builder).ToSQL() - } - return "", nil, ErrNotSupportType -} diff --git a/vendor/github.com/go-xorm/builder/builder_delete.go b/vendor/github.com/go-xorm/builder/builder_delete.go deleted file mode 100644 index 743f1a4a9..000000000 --- a/vendor/github.com/go-xorm/builder/builder_delete.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2016 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package builder - -import ( - "errors" - "fmt" -) - -func (b *Builder) deleteWriteTo(w Writer) error { - if len(b.tableName) <= 0 { - return errors.New("no table indicated") - } - - if _, err := fmt.Fprintf(w, "DELETE FROM %s WHERE ", b.tableName); err != nil { - return err - } - - return b.cond.WriteTo(w) -} diff --git a/vendor/github.com/go-xorm/builder/builder_insert.go b/vendor/github.com/go-xorm/builder/builder_insert.go deleted file mode 100644 index decec9313..000000000 --- a/vendor/github.com/go-xorm/builder/builder_insert.go +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2016 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package builder - -import ( - "bytes" - "errors" - "fmt" -) - -func (b *Builder) insertWriteTo(w Writer) error { - if len(b.tableName) <= 0 { - return errors.New("no table indicated") - } - if len(b.inserts) <= 0 { - return errors.New("no column to be update") - } - - if _, err := fmt.Fprintf(w, "INSERT INTO %s (", b.tableName); err != nil { - return err - } - - var args = make([]interface{}, 0) - var bs []byte - var valBuffer = bytes.NewBuffer(bs) - var i = 0 - for col, value := range b.inserts { - fmt.Fprint(w, col) - if e, ok := value.(expr); ok { - fmt.Fprint(valBuffer, e.sql) - args = append(args, e.args...) - } else { - fmt.Fprint(valBuffer, "?") - args = append(args, value) - } - - if i != len(b.inserts)-1 { - if _, err := fmt.Fprint(w, ","); err != nil { - return err - } - if _, err := fmt.Fprint(valBuffer, ","); err != nil { - return err - } - } - i = i + 1 - } - - if _, err := fmt.Fprint(w, ") Values ("); err != nil { - return err - } - - if _, err := w.Write(valBuffer.Bytes()); err != nil { - return err - } - if _, err := fmt.Fprint(w, ")"); err != nil { - return err - } - - w.Append(args...) - - return nil -} diff --git a/vendor/github.com/go-xorm/builder/builder_select.go b/vendor/github.com/go-xorm/builder/builder_select.go deleted file mode 100644 index 05f116e00..000000000 --- a/vendor/github.com/go-xorm/builder/builder_select.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2016 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package builder - -import ( - "errors" - "fmt" -) - -func (b *Builder) selectWriteTo(w Writer) error { - if len(b.tableName) <= 0 { - return errors.New("no table indicated") - } - - if _, err := fmt.Fprint(w, "SELECT "); err != nil { - return err - } - if len(b.selects) > 0 { - for i, s := range b.selects { - if _, err := fmt.Fprint(w, s); err != nil { - return err - } - if i != len(b.selects)-1 { - if _, err := fmt.Fprint(w, ","); err != nil { - return err - } - } - } - } else { - if _, err := fmt.Fprint(w, "*"); err != nil { - return err - } - } - - if _, err := fmt.Fprintf(w, " FROM %s", b.tableName); err != nil { - return err - } - - for _, v := range b.joins { - fmt.Fprintf(w, " %s JOIN %s ON ", v.joinType, v.joinTable) - if err := v.joinCond.WriteTo(w); err != nil { - return err - } - } - - if _, err := fmt.Fprint(w, " WHERE "); err != nil { - return err - } - - return b.cond.WriteTo(w) -} diff --git a/vendor/github.com/go-xorm/builder/builder_update.go b/vendor/github.com/go-xorm/builder/builder_update.go deleted file mode 100644 index 182af830f..000000000 --- a/vendor/github.com/go-xorm/builder/builder_update.go +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2016 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package builder - -import ( - "errors" - "fmt" -) - -func (b *Builder) updateWriteTo(w Writer) error { - if len(b.tableName) <= 0 { - return errors.New("no table indicated") - } - if len(b.updates) <= 0 { - return errors.New("no column to be update") - } - - if _, err := fmt.Fprintf(w, "UPDATE %s SET ", b.tableName); err != nil { - return err - } - - for i, s := range b.updates { - if err := s.opWriteTo(",", w); err != nil { - return err - } - - if i != len(b.updates)-1 { - if _, err := fmt.Fprint(w, ","); err != nil { - return err - } - } - } - - if _, err := fmt.Fprint(w, " WHERE "); err != nil { - return err - } - - return b.cond.WriteTo(w) -} diff --git a/vendor/github.com/go-xorm/builder/circle.yml b/vendor/github.com/go-xorm/builder/circle.yml deleted file mode 100644 index b2a8bfc9e..000000000 --- a/vendor/github.com/go-xorm/builder/circle.yml +++ /dev/null @@ -1,12 +0,0 @@ -dependencies: - override: - # './...' is a relative pattern which means all subdirectories - - go get -t -d -v ./... - - go build -v - - go get -u github.com/golang/lint/golint - -test: - override: - # './...' is a relative pattern which means all subdirectories - - golint ./... - - go test -v -race \ No newline at end of file diff --git a/vendor/github.com/go-xorm/builder/cond.go b/vendor/github.com/go-xorm/builder/cond.go deleted file mode 100644 index 77dd139bf..000000000 --- a/vendor/github.com/go-xorm/builder/cond.go +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright 2016 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package builder - -import ( - "bytes" - "io" -) - -// Writer defines the interface -type Writer interface { - io.Writer - Append(...interface{}) -} - -var _ Writer = NewWriter() - -// BytesWriter implments Writer and save SQL in bytes.Buffer -type BytesWriter struct { - writer *bytes.Buffer - buffer []byte - args []interface{} -} - -// NewWriter creates a new string writer -func NewWriter() *BytesWriter { - w := &BytesWriter{} - w.writer = bytes.NewBuffer(w.buffer) - return w -} - -// Write writes data to Writer -func (s *BytesWriter) Write(buf []byte) (int, error) { - return s.writer.Write(buf) -} - -// Append appends args to Writer -func (s *BytesWriter) Append(args ...interface{}) { - s.args = append(s.args, args...) -} - -// Cond defines an interface -type Cond interface { - WriteTo(Writer) error - And(...Cond) Cond - Or(...Cond) Cond - IsValid() bool -} - -type condEmpty struct{} - -var _ Cond = condEmpty{} - -// NewCond creates an empty condition -func NewCond() Cond { - return condEmpty{} -} - -func (condEmpty) WriteTo(w Writer) error { - return nil -} - -func (condEmpty) And(conds ...Cond) Cond { - return And(conds...) -} - -func (condEmpty) Or(conds ...Cond) Cond { - return Or(conds...) -} - -func (condEmpty) IsValid() bool { - return false -} - -func condToSQL(cond Cond) (string, []interface{}, error) { - if cond == nil || !cond.IsValid() { - return "", nil, nil - } - - w := NewWriter() - if err := cond.WriteTo(w); err != nil { - return "", nil, err - } - return w.writer.String(), w.args, nil -} diff --git a/vendor/github.com/go-xorm/builder/cond_and.go b/vendor/github.com/go-xorm/builder/cond_and.go deleted file mode 100644 index 9c30e9c2e..000000000 --- a/vendor/github.com/go-xorm/builder/cond_and.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2016 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package builder - -import "fmt" - -type condAnd []Cond - -var _ Cond = condAnd{} - -// And generates AND conditions -func And(conds ...Cond) Cond { - var result = make(condAnd, 0, len(conds)) - for _, cond := range conds { - if cond == nil || !cond.IsValid() { - continue - } - result = append(result, cond) - } - return result -} - -func (and condAnd) WriteTo(w Writer) error { - for i, cond := range and { - _, isOr := cond.(condOr) - if isOr { - fmt.Fprint(w, "(") - } - - err := cond.WriteTo(w) - if err != nil { - return err - } - - if isOr { - fmt.Fprint(w, ")") - } - - if i != len(and)-1 { - fmt.Fprint(w, " AND ") - } - } - - return nil -} - -func (and condAnd) And(conds ...Cond) Cond { - return And(and, And(conds...)) -} - -func (and condAnd) Or(conds ...Cond) Cond { - return Or(and, Or(conds...)) -} - -func (and condAnd) IsValid() bool { - return len(and) > 0 -} diff --git a/vendor/github.com/go-xorm/builder/cond_between.go b/vendor/github.com/go-xorm/builder/cond_between.go deleted file mode 100644 index f2b29ed15..000000000 --- a/vendor/github.com/go-xorm/builder/cond_between.go +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2016 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package builder - -import "fmt" - -// Between implmentes between condition -type Between struct { - Col string - LessVal interface{} - MoreVal interface{} -} - -var _ Cond = Between{} - -// WriteTo write data to Writer -func (between Between) WriteTo(w Writer) error { - if _, err := fmt.Fprintf(w, "%s BETWEEN ? AND ?", between.Col); err != nil { - return err - } - w.Append(between.LessVal, between.MoreVal) - return nil -} - -// And implments And with other conditions -func (between Between) And(conds ...Cond) Cond { - return And(between, And(conds...)) -} - -// Or implments Or with other conditions -func (between Between) Or(conds ...Cond) Cond { - return Or(between, Or(conds...)) -} - -// IsValid tests if the condition is valid -func (between Between) IsValid() bool { - return len(between.Col) > 0 -} diff --git a/vendor/github.com/go-xorm/builder/cond_compare.go b/vendor/github.com/go-xorm/builder/cond_compare.go deleted file mode 100644 index e10ef7447..000000000 --- a/vendor/github.com/go-xorm/builder/cond_compare.go +++ /dev/null @@ -1,154 +0,0 @@ -// Copyright 2016 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package builder - -import "fmt" - -// WriteMap writes conditions' SQL to Writer, op could be =, <>, >, <, <=, >= and etc. -func WriteMap(w Writer, data map[string]interface{}, op string) error { - var args = make([]interface{}, 0, len(data)) - var i = 0 - for k, v := range data { - switch v.(type) { - case expr: - if _, err := fmt.Fprintf(w, "%s%s(", k, op); err != nil { - return err - } - - if err := v.(expr).WriteTo(w); err != nil { - return err - } - - if _, err := fmt.Fprintf(w, ")"); err != nil { - return err - } - case *Builder: - if _, err := fmt.Fprintf(w, "%s%s(", k, op); err != nil { - return err - } - - if err := v.(*Builder).WriteTo(w); err != nil { - return err - } - - if _, err := fmt.Fprintf(w, ")"); err != nil { - return err - } - default: - if _, err := fmt.Fprintf(w, "%s%s?", k, op); err != nil { - return err - } - args = append(args, v) - } - if i != len(data)-1 { - if _, err := fmt.Fprint(w, " AND "); err != nil { - return err - } - } - i = i + 1 - } - w.Append(args...) - return nil -} - -// Lt defines < condition -type Lt map[string]interface{} - -var _ Cond = Lt{} - -// WriteTo write SQL to Writer -func (lt Lt) WriteTo(w Writer) error { - return WriteMap(w, lt, "<") -} - -// And implements And with other conditions -func (lt Lt) And(conds ...Cond) Cond { - return condAnd{lt, And(conds...)} -} - -// Or implements Or with other conditions -func (lt Lt) Or(conds ...Cond) Cond { - return condOr{lt, Or(conds...)} -} - -// IsValid tests if this Eq is valid -func (lt Lt) IsValid() bool { - return len(lt) > 0 -} - -// Lte defines <= condition -type Lte map[string]interface{} - -var _ Cond = Lte{} - -// WriteTo write SQL to Writer -func (lte Lte) WriteTo(w Writer) error { - return WriteMap(w, lte, "<=") -} - -// And implements And with other conditions -func (lte Lte) And(conds ...Cond) Cond { - return And(lte, And(conds...)) -} - -// Or implements Or with other conditions -func (lte Lte) Or(conds ...Cond) Cond { - return Or(lte, Or(conds...)) -} - -// IsValid tests if this Eq is valid -func (lte Lte) IsValid() bool { - return len(lte) > 0 -} - -// Gt defines > condition -type Gt map[string]interface{} - -var _ Cond = Gt{} - -// WriteTo write SQL to Writer -func (gt Gt) WriteTo(w Writer) error { - return WriteMap(w, gt, ">") -} - -// And implements And with other conditions -func (gt Gt) And(conds ...Cond) Cond { - return And(gt, And(conds...)) -} - -// Or implements Or with other conditions -func (gt Gt) Or(conds ...Cond) Cond { - return Or(gt, Or(conds...)) -} - -// IsValid tests if this Eq is valid -func (gt Gt) IsValid() bool { - return len(gt) > 0 -} - -// Gte defines >= condition -type Gte map[string]interface{} - -var _ Cond = Gte{} - -// WriteTo write SQL to Writer -func (gte Gte) WriteTo(w Writer) error { - return WriteMap(w, gte, ">=") -} - -// And implements And with other conditions -func (gte Gte) And(conds ...Cond) Cond { - return And(gte, And(conds...)) -} - -// Or implements Or with other conditions -func (gte Gte) Or(conds ...Cond) Cond { - return Or(gte, Or(conds...)) -} - -// IsValid tests if this Eq is valid -func (gte Gte) IsValid() bool { - return len(gte) > 0 -} diff --git a/vendor/github.com/go-xorm/builder/cond_eq.go b/vendor/github.com/go-xorm/builder/cond_eq.go deleted file mode 100644 index 8777727ff..000000000 --- a/vendor/github.com/go-xorm/builder/cond_eq.go +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright 2016 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package builder - -import "fmt" - -// Incr implements a type used by Eq -type Incr int - -// Decr implements a type used by Eq -type Decr int - -// Eq defines equals conditions -type Eq map[string]interface{} - -var _ Cond = Eq{} - -func (eq Eq) opWriteTo(op string, w Writer) error { - var i = 0 - for k, v := range eq { - switch v.(type) { - case []int, []int64, []string, []int32, []int16, []int8, []uint, []uint64, []uint32, []uint16, []interface{}: - if err := In(k, v).WriteTo(w); err != nil { - return err - } - case expr: - if _, err := fmt.Fprintf(w, "%s=(", k); err != nil { - return err - } - - if err := v.(expr).WriteTo(w); err != nil { - return err - } - - if _, err := fmt.Fprintf(w, ")"); err != nil { - return err - } - case *Builder: - if _, err := fmt.Fprintf(w, "%s=(", k); err != nil { - return err - } - - if err := v.(*Builder).WriteTo(w); err != nil { - return err - } - - if _, err := fmt.Fprintf(w, ")"); err != nil { - return err - } - case Incr: - if _, err := fmt.Fprintf(w, "%s=%s+?", k, k); err != nil { - return err - } - w.Append(int(v.(Incr))) - case Decr: - if _, err := fmt.Fprintf(w, "%s=%s-?", k, k); err != nil { - return err - } - w.Append(int(v.(Decr))) - default: - if _, err := fmt.Fprintf(w, "%s=?", k); err != nil { - return err - } - w.Append(v) - } - if i != len(eq)-1 { - if _, err := fmt.Fprint(w, op); err != nil { - return err - } - } - i = i + 1 - } - return nil -} - -// WriteTo writes SQL to Writer -func (eq Eq) WriteTo(w Writer) error { - return eq.opWriteTo(" AND ", w) -} - -// And implements And with other conditions -func (eq Eq) And(conds ...Cond) Cond { - return And(eq, And(conds...)) -} - -// Or implements Or with other conditions -func (eq Eq) Or(conds ...Cond) Cond { - return Or(eq, Or(conds...)) -} - -// IsValid tests if this Eq is valid -func (eq Eq) IsValid() bool { - return len(eq) > 0 -} diff --git a/vendor/github.com/go-xorm/builder/cond_expr.go b/vendor/github.com/go-xorm/builder/cond_expr.go deleted file mode 100644 index e5ed572b1..000000000 --- a/vendor/github.com/go-xorm/builder/cond_expr.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2016 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package builder - -import "fmt" - -type expr struct { - sql string - args []interface{} -} - -var _ Cond = expr{} - -// Expr generate customerize SQL -func Expr(sql string, args ...interface{}) Cond { - return expr{sql, args} -} - -func (expr expr) WriteTo(w Writer) error { - if _, err := fmt.Fprint(w, expr.sql); err != nil { - return err - } - w.Append(expr.args...) - return nil -} - -func (expr expr) And(conds ...Cond) Cond { - return And(expr, And(conds...)) -} - -func (expr expr) Or(conds ...Cond) Cond { - return Or(expr, Or(conds...)) -} - -func (expr expr) IsValid() bool { - return len(expr.sql) > 0 -} diff --git a/vendor/github.com/go-xorm/builder/cond_in.go b/vendor/github.com/go-xorm/builder/cond_in.go deleted file mode 100644 index 692d2e289..000000000 --- a/vendor/github.com/go-xorm/builder/cond_in.go +++ /dev/null @@ -1,233 +0,0 @@ -// Copyright 2016 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package builder - -import ( - "fmt" - "reflect" - "strings" -) - -type condIn struct { - col string - vals []interface{} -} - -var _ Cond = condIn{} - -// In generates IN condition -func In(col string, values ...interface{}) Cond { - return condIn{col, values} -} - -func (condIn condIn) WriteTo(w Writer) error { - if len(condIn.vals) <= 0 { - return ErrNoInConditions - } - - switch condIn.vals[0].(type) { - case []int8: - vals := condIn.vals[0].([]int8) - if len(vals) <= 0 { - return ErrNoInConditions - } - questionMark := strings.Repeat("?,", len(vals)) - if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil { - return err - } - for _, val := range vals { - w.Append(val) - } - case []int16: - vals := condIn.vals[0].([]int16) - if len(vals) <= 0 { - return ErrNoInConditions - } - questionMark := strings.Repeat("?,", len(vals)) - if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil { - return err - } - for _, val := range vals { - w.Append(val) - } - case []int: - vals := condIn.vals[0].([]int) - if len(vals) <= 0 { - return ErrNoInConditions - } - questionMark := strings.Repeat("?,", len(vals)) - if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil { - return err - } - for _, val := range vals { - w.Append(val) - } - case []int32: - vals := condIn.vals[0].([]int32) - if len(vals) <= 0 { - return ErrNoInConditions - } - questionMark := strings.Repeat("?,", len(vals)) - if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil { - return err - } - for _, val := range vals { - w.Append(val) - } - case []int64: - vals := condIn.vals[0].([]int64) - if len(vals) <= 0 { - return ErrNoInConditions - } - questionMark := strings.Repeat("?,", len(vals)) - if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil { - return err - } - for _, val := range vals { - w.Append(val) - } - case []uint8: - vals := condIn.vals[0].([]uint8) - if len(vals) <= 0 { - return ErrNoInConditions - } - questionMark := strings.Repeat("?,", len(vals)) - if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil { - return err - } - for _, val := range vals { - w.Append(val) - } - case []uint16: - vals := condIn.vals[0].([]uint16) - if len(vals) <= 0 { - return ErrNoInConditions - } - questionMark := strings.Repeat("?,", len(vals)) - if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil { - return err - } - for _, val := range vals { - w.Append(val) - } - case []uint: - vals := condIn.vals[0].([]uint) - if len(vals) <= 0 { - return ErrNoInConditions - } - questionMark := strings.Repeat("?,", len(vals)) - if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil { - return err - } - for _, val := range vals { - w.Append(val) - } - case []uint32: - vals := condIn.vals[0].([]uint32) - if len(vals) <= 0 { - return ErrNoInConditions - } - questionMark := strings.Repeat("?,", len(vals)) - if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil { - return err - } - for _, val := range vals { - w.Append(val) - } - case []uint64: - vals := condIn.vals[0].([]uint64) - if len(vals) <= 0 { - return ErrNoInConditions - } - questionMark := strings.Repeat("?,", len(vals)) - if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil { - return err - } - for _, val := range vals { - w.Append(val) - } - case []string: - vals := condIn.vals[0].([]string) - if len(vals) <= 0 { - return ErrNoInConditions - } - questionMark := strings.Repeat("?,", len(vals)) - if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil { - return err - } - for _, val := range vals { - w.Append(val) - } - case []interface{}: - vals := condIn.vals[0].([]interface{}) - if len(vals) <= 0 { - return ErrNoInConditions - } - questionMark := strings.Repeat("?,", len(vals)) - if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil { - return err - } - w.Append(vals...) - case expr: - val := condIn.vals[0].(expr) - if _, err := fmt.Fprintf(w, "%s IN (", condIn.col); err != nil { - return err - } - if err := val.WriteTo(w); err != nil { - return err - } - if _, err := fmt.Fprintf(w, ")"); err != nil { - return err - } - case *Builder: - bd := condIn.vals[0].(*Builder) - if _, err := fmt.Fprintf(w, "%s IN (", condIn.col); err != nil { - return err - } - if err := bd.WriteTo(w); err != nil { - return err - } - if _, err := fmt.Fprintf(w, ")"); err != nil { - return err - } - default: - if len(condIn.vals) <= 0 { - return ErrNoInConditions - } - - v := reflect.ValueOf(condIn.vals[0]) - if v.Kind() == reflect.Slice { - l := v.Len() - - questionMark := strings.Repeat("?,", l) - if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil { - return err - } - - for i := 0; i < l; i++ { - w.Append(v.Index(i).Interface()) - } - } else { - questionMark := strings.Repeat("?,", len(condIn.vals)) - if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil { - return err - } - w.Append(condIn.vals...) - } - } - return nil -} - -func (condIn condIn) And(conds ...Cond) Cond { - return And(condIn, And(conds...)) -} - -func (condIn condIn) Or(conds ...Cond) Cond { - return Or(condIn, Or(conds...)) -} - -func (condIn condIn) IsValid() bool { - return len(condIn.col) > 0 && len(condIn.vals) > 0 -} diff --git a/vendor/github.com/go-xorm/builder/cond_like.go b/vendor/github.com/go-xorm/builder/cond_like.go deleted file mode 100644 index 0648badbe..000000000 --- a/vendor/github.com/go-xorm/builder/cond_like.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2016 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package builder - -import "fmt" - -// Like defines like condition -type Like [2]string - -var _ Cond = Like{"", ""} - -// WriteTo write SQL to Writer -func (like Like) WriteTo(w Writer) error { - if _, err := fmt.Fprintf(w, "%s LIKE ?", like[0]); err != nil { - return err - } - w.Append("%" + like[1] + "%") - return nil -} - -// And implements And with other conditions -func (like Like) And(conds ...Cond) Cond { - return And(like, And(conds...)) -} - -// Or implements Or with other conditions -func (like Like) Or(conds ...Cond) Cond { - return Or(like, Or(conds...)) -} - -// IsValid tests if this condition is valid -func (like Like) IsValid() bool { - return len(like[0]) > 0 && len(like[1]) > 0 -} diff --git a/vendor/github.com/go-xorm/builder/cond_neq.go b/vendor/github.com/go-xorm/builder/cond_neq.go deleted file mode 100644 index d07b2b18e..000000000 --- a/vendor/github.com/go-xorm/builder/cond_neq.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2016 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package builder - -import "fmt" - -// Neq defines not equal conditions -type Neq map[string]interface{} - -var _ Cond = Neq{} - -// WriteTo writes SQL to Writer -func (neq Neq) WriteTo(w Writer) error { - var args = make([]interface{}, 0, len(neq)) - var i = 0 - for k, v := range neq { - switch v.(type) { - case []int, []int64, []string, []int32, []int16, []int8: - if err := NotIn(k, v).WriteTo(w); err != nil { - return err - } - case expr: - if _, err := fmt.Fprintf(w, "%s<>(", k); err != nil { - return err - } - - if err := v.(expr).WriteTo(w); err != nil { - return err - } - - if _, err := fmt.Fprintf(w, ")"); err != nil { - return err - } - case *Builder: - if _, err := fmt.Fprintf(w, "%s<>(", k); err != nil { - return err - } - - if err := v.(*Builder).WriteTo(w); err != nil { - return err - } - - if _, err := fmt.Fprintf(w, ")"); err != nil { - return err - } - default: - if _, err := fmt.Fprintf(w, "%s<>?", k); err != nil { - return err - } - args = append(args, v) - } - if i != len(neq)-1 { - if _, err := fmt.Fprint(w, " AND "); err != nil { - return err - } - } - i = i + 1 - } - w.Append(args...) - return nil -} - -// And implements And with other conditions -func (neq Neq) And(conds ...Cond) Cond { - return And(neq, And(conds...)) -} - -// Or implements Or with other conditions -func (neq Neq) Or(conds ...Cond) Cond { - return Or(neq, Or(conds...)) -} - -// IsValid tests if this condition is valid -func (neq Neq) IsValid() bool { - return len(neq) > 0 -} diff --git a/vendor/github.com/go-xorm/builder/cond_not.go b/vendor/github.com/go-xorm/builder/cond_not.go deleted file mode 100644 index 294a7e072..000000000 --- a/vendor/github.com/go-xorm/builder/cond_not.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2016 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package builder - -import "fmt" - -// Not defines NOT condition -type Not [1]Cond - -var _ Cond = Not{} - -// WriteTo writes SQL to Writer -func (not Not) WriteTo(w Writer) error { - if _, err := fmt.Fprint(w, "NOT "); err != nil { - return err - } - switch not[0].(type) { - case condAnd, condOr: - if _, err := fmt.Fprint(w, "("); err != nil { - return err - } - } - - if err := not[0].WriteTo(w); err != nil { - return err - } - - switch not[0].(type) { - case condAnd, condOr: - if _, err := fmt.Fprint(w, ")"); err != nil { - return err - } - } - - return nil -} - -// And implements And with other conditions -func (not Not) And(conds ...Cond) Cond { - return And(not, And(conds...)) -} - -// Or implements Or with other conditions -func (not Not) Or(conds ...Cond) Cond { - return Or(not, Or(conds...)) -} - -// IsValid tests if this condition is valid -func (not Not) IsValid() bool { - return not[0] != nil && not[0].IsValid() -} diff --git a/vendor/github.com/go-xorm/builder/cond_notin.go b/vendor/github.com/go-xorm/builder/cond_notin.go deleted file mode 100644 index 47c16be27..000000000 --- a/vendor/github.com/go-xorm/builder/cond_notin.go +++ /dev/null @@ -1,211 +0,0 @@ -// Copyright 2016 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package builder - -import ( - "fmt" - "strings" -) - -type condNotIn condIn - -var _ Cond = condNotIn{} - -// NotIn generate NOT IN condition -func NotIn(col string, values ...interface{}) Cond { - return condNotIn{col, values} -} - -func (condNotIn condNotIn) WriteTo(w Writer) error { - if len(condNotIn.vals) <= 0 { - return ErrNoNotInConditions - } - - switch condNotIn.vals[0].(type) { - case []int8: - vals := condNotIn.vals[0].([]int8) - if len(vals) <= 0 { - return ErrNoNotInConditions - } - questionMark := strings.Repeat("?,", len(vals)) - if _, err := fmt.Fprintf(w, "%s NOT IN (%s)", condNotIn.col, questionMark[:len(questionMark)-1]); err != nil { - return err - } - for _, val := range vals { - w.Append(val) - } - case []int16: - vals := condNotIn.vals[0].([]int16) - if len(vals) <= 0 { - return ErrNoNotInConditions - } - questionMark := strings.Repeat("?,", len(vals)) - if _, err := fmt.Fprintf(w, "%s NOT IN (%s)", condNotIn.col, questionMark[:len(questionMark)-1]); err != nil { - return err - } - for _, val := range vals { - w.Append(val) - } - case []int: - vals := condNotIn.vals[0].([]int) - if len(vals) <= 0 { - return ErrNoNotInConditions - } - questionMark := strings.Repeat("?,", len(vals)) - if _, err := fmt.Fprintf(w, "%s NOT IN (%s)", condNotIn.col, questionMark[:len(questionMark)-1]); err != nil { - return err - } - for _, val := range vals { - w.Append(val) - } - case []int32: - vals := condNotIn.vals[0].([]int32) - if len(vals) <= 0 { - return ErrNoNotInConditions - } - questionMark := strings.Repeat("?,", len(vals)) - if _, err := fmt.Fprintf(w, "%s NOT IN (%s)", condNotIn.col, questionMark[:len(questionMark)-1]); err != nil { - return err - } - for _, val := range vals { - w.Append(val) - } - case []int64: - vals := condNotIn.vals[0].([]int64) - if len(vals) <= 0 { - return ErrNoNotInConditions - } - questionMark := strings.Repeat("?,", len(vals)) - if _, err := fmt.Fprintf(w, "%s NOT IN (%s)", condNotIn.col, questionMark[:len(questionMark)-1]); err != nil { - return err - } - for _, val := range vals { - w.Append(val) - } - case []uint8: - vals := condNotIn.vals[0].([]uint8) - if len(vals) <= 0 { - return ErrNoNotInConditions - } - questionMark := strings.Repeat("?,", len(vals)) - if _, err := fmt.Fprintf(w, "%s NOT IN (%s)", condNotIn.col, questionMark[:len(questionMark)-1]); err != nil { - return err - } - for _, val := range vals { - w.Append(val) - } - case []uint16: - vals := condNotIn.vals[0].([]uint16) - if len(vals) <= 0 { - return ErrNoNotInConditions - } - questionMark := strings.Repeat("?,", len(vals)) - if _, err := fmt.Fprintf(w, "%s NOT IN (%s)", condNotIn.col, questionMark[:len(questionMark)-1]); err != nil { - return err - } - for _, val := range vals { - w.Append(val) - } - case []uint: - vals := condNotIn.vals[0].([]uint) - if len(vals) <= 0 { - return ErrNoNotInConditions - } - questionMark := strings.Repeat("?,", len(vals)) - if _, err := fmt.Fprintf(w, "%s NOT IN (%s)", condNotIn.col, questionMark[:len(questionMark)-1]); err != nil { - return err - } - for _, val := range vals { - w.Append(val) - } - case []uint32: - vals := condNotIn.vals[0].([]uint32) - if len(vals) <= 0 { - return ErrNoNotInConditions - } - questionMark := strings.Repeat("?,", len(vals)) - if _, err := fmt.Fprintf(w, "%s NOT IN (%s)", condNotIn.col, questionMark[:len(questionMark)-1]); err != nil { - return err - } - for _, val := range vals { - w.Append(val) - } - case []uint64: - vals := condNotIn.vals[0].([]uint64) - if len(vals) <= 0 { - return ErrNoNotInConditions - } - questionMark := strings.Repeat("?,", len(vals)) - if _, err := fmt.Fprintf(w, "%s NOT IN (%s)", condNotIn.col, questionMark[:len(questionMark)-1]); err != nil { - return err - } - for _, val := range vals { - w.Append(val) - } - case []string: - vals := condNotIn.vals[0].([]string) - if len(vals) <= 0 { - return ErrNoNotInConditions - } - questionMark := strings.Repeat("?,", len(vals)) - if _, err := fmt.Fprintf(w, "%s NOT IN (%s)", condNotIn.col, questionMark[:len(questionMark)-1]); err != nil { - return err - } - for _, val := range vals { - w.Append(val) - } - case []interface{}: - vals := condNotIn.vals[0].([]interface{}) - if len(vals) <= 0 { - return ErrNoNotInConditions - } - questionMark := strings.Repeat("?,", len(vals)) - if _, err := fmt.Fprintf(w, "%s NOT IN (%s)", condNotIn.col, questionMark[:len(questionMark)-1]); err != nil { - return err - } - w.Append(vals...) - case expr: - val := condNotIn.vals[0].(expr) - if _, err := fmt.Fprintf(w, "%s NOT IN (", condNotIn.col); err != nil { - return err - } - if err := val.WriteTo(w); err != nil { - return err - } - if _, err := fmt.Fprintf(w, ")"); err != nil { - return err - } - case *Builder: - val := condNotIn.vals[0].(*Builder) - if _, err := fmt.Fprintf(w, "%s NOT IN (", condNotIn.col); err != nil { - return err - } - if err := val.WriteTo(w); err != nil { - return err - } - if _, err := fmt.Fprintf(w, ")"); err != nil { - return err - } - default: - questionMark := strings.Repeat("?,", len(condNotIn.vals)) - if _, err := fmt.Fprintf(w, "%s NOT IN (%s)", condNotIn.col, questionMark[:len(questionMark)-1]); err != nil { - return err - } - w.Append(condNotIn.vals...) - } - return nil -} - -func (condNotIn condNotIn) And(conds ...Cond) Cond { - return And(condNotIn, And(conds...)) -} - -func (condNotIn condNotIn) Or(conds ...Cond) Cond { - return Or(condNotIn, Or(conds...)) -} - -func (condNotIn condNotIn) IsValid() bool { - return len(condNotIn.col) > 0 && len(condNotIn.vals) > 0 -} diff --git a/vendor/github.com/go-xorm/builder/cond_null.go b/vendor/github.com/go-xorm/builder/cond_null.go deleted file mode 100644 index bf2aaf851..000000000 --- a/vendor/github.com/go-xorm/builder/cond_null.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2016 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package builder - -import "fmt" - -// IsNull defines IS NULL condition -type IsNull [1]string - -var _ Cond = IsNull{""} - -// WriteTo write SQL to Writer -func (isNull IsNull) WriteTo(w Writer) error { - _, err := fmt.Fprintf(w, "%s IS NULL", isNull[0]) - return err -} - -// And implements And with other conditions -func (isNull IsNull) And(conds ...Cond) Cond { - return And(isNull, And(conds...)) -} - -// Or implements Or with other conditions -func (isNull IsNull) Or(conds ...Cond) Cond { - return Or(isNull, Or(conds...)) -} - -// IsValid tests if this condition is valid -func (isNull IsNull) IsValid() bool { - return len(isNull[0]) > 0 -} - -// NotNull defines NOT NULL condition -type NotNull [1]string - -var _ Cond = NotNull{""} - -// WriteTo write SQL to Writer -func (notNull NotNull) WriteTo(w Writer) error { - _, err := fmt.Fprintf(w, "%s IS NOT NULL", notNull[0]) - return err -} - -// And implements And with other conditions -func (notNull NotNull) And(conds ...Cond) Cond { - return And(notNull, And(conds...)) -} - -// Or implements Or with other conditions -func (notNull NotNull) Or(conds ...Cond) Cond { - return Or(notNull, Or(conds...)) -} - -// IsValid tests if this condition is valid -func (notNull NotNull) IsValid() bool { - return len(notNull[0]) > 0 -} diff --git a/vendor/github.com/go-xorm/builder/cond_or.go b/vendor/github.com/go-xorm/builder/cond_or.go deleted file mode 100644 index 35c3da025..000000000 --- a/vendor/github.com/go-xorm/builder/cond_or.go +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2016 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package builder - -import "fmt" - -type condOr []Cond - -var _ Cond = condOr{} - -// Or sets OR conditions -func Or(conds ...Cond) Cond { - var result = make(condOr, 0, len(conds)) - for _, cond := range conds { - if cond == nil || !cond.IsValid() { - continue - } - result = append(result, cond) - } - return result -} - -// WriteTo implments Cond -func (o condOr) WriteTo(w Writer) error { - for i, cond := range o { - var needQuote bool - switch cond.(type) { - case condAnd: - needQuote = true - case Eq: - needQuote = (len(cond.(Eq)) > 1) - } - - if needQuote { - fmt.Fprint(w, "(") - } - - err := cond.WriteTo(w) - if err != nil { - return err - } - - if needQuote { - fmt.Fprint(w, ")") - } - - if i != len(o)-1 { - fmt.Fprint(w, " OR ") - } - } - - return nil -} - -func (o condOr) And(conds ...Cond) Cond { - return And(o, And(conds...)) -} - -func (o condOr) Or(conds ...Cond) Cond { - return Or(o, Or(conds...)) -} - -func (o condOr) IsValid() bool { - return len(o) > 0 -} diff --git a/vendor/github.com/go-xorm/builder/doc.go b/vendor/github.com/go-xorm/builder/doc.go deleted file mode 100644 index 162b150f1..000000000 --- a/vendor/github.com/go-xorm/builder/doc.go +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright 2016 The XORM Authors. All rights reserved. -// Use of this source code is governed by a BSD -// license that can be found in the LICENSE file. - -/* - -Package builder is a simple and powerful sql builder for Go. - -Make sure you have installed Go 1.1+ and then: - - go get github.com/go-xorm/builder - -WARNNING: Currently, only query conditions are supported. Below is the supported conditions. - -1. Eq is a redefine of a map, you can give one or more conditions to Eq - - import . "github.com/go-xorm/builder" - - sql, args, _ := ToSQL(Eq{"a":1}) - // a=? [1] - sql, args, _ := ToSQL(Eq{"b":"c"}.And(Eq{"c": 0})) - // b=? AND c=? ["c", 0] - sql, args, _ := ToSQL(Eq{"b":"c", "c":0}) - // b=? AND c=? ["c", 0] - sql, args, _ := ToSQL(Eq{"b":"c"}.Or(Eq{"b":"d"})) - // b=? OR b=? ["c", "d"] - sql, args, _ := ToSQL(Eq{"b": []string{"c", "d"}}) - // b IN (?,?) ["c", "d"] - sql, args, _ := ToSQL(Eq{"b": 1, "c":[]int{2, 3}}) - // b=? AND c IN (?,?) [1, 2, 3] - -2. Neq is the same to Eq - - import . "github.com/go-xorm/builder" - - sql, args, _ := ToSQL(Neq{"a":1}) - // a<>? [1] - sql, args, _ := ToSQL(Neq{"b":"c"}.And(Neq{"c": 0})) - // b<>? AND c<>? ["c", 0] - sql, args, _ := ToSQL(Neq{"b":"c", "c":0}) - // b<>? AND c<>? ["c", 0] - sql, args, _ := ToSQL(Neq{"b":"c"}.Or(Neq{"b":"d"})) - // b<>? OR b<>? ["c", "d"] - sql, args, _ := ToSQL(Neq{"b": []string{"c", "d"}}) - // b NOT IN (?,?) ["c", "d"] - sql, args, _ := ToSQL(Neq{"b": 1, "c":[]int{2, 3}}) - // b<>? AND c NOT IN (?,?) [1, 2, 3] - -3. Gt, Gte, Lt, Lte - - import . "github.com/go-xorm/builder" - - sql, args, _ := ToSQL(Gt{"a", 1}.And(Gte{"b", 2})) - // a>? AND b>=? [1, 2] - sql, args, _ := ToSQL(Lt{"a", 1}.Or(Lte{"b", 2})) - // a? [1, %c%, 2] - -9. Or(conds ...Cond), Or can connect one or more conditions via Or - - import . "github.com/go-xorm/builder" - - sql, args, _ := ToSQL(Or(Eq{"a":1}, Like{"b", "c"}, Neq{"d", 2})) - // a=? OR b LIKE ? OR d<>? [1, %c%, 2] - sql, args, _ := ToSQL(Or(Eq{"a":1}, And(Like{"b", "c"}, Neq{"d", 2}))) - // a=? OR (b LIKE ? AND d<>?) [1, %c%, 2] - -10. Between - - import . "github.com/go-xorm/builder" - - sql, args, _ := ToSQL(Between("a", 1, 2)) - // a BETWEEN 1 AND 2 - -11. define yourself conditions -Since Cond is a interface, you can define yourself conditions and compare with them -*/ -package builder diff --git a/vendor/github.com/go-xorm/builder/error.go b/vendor/github.com/go-xorm/builder/error.go deleted file mode 100644 index d7ac51ea1..000000000 --- a/vendor/github.com/go-xorm/builder/error.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2016 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package builder - -import "errors" - -var ( - // ErrNotSupportType not supported SQL type error - ErrNotSupportType = errors.New("not supported SQL type") - // ErrNoNotInConditions no NOT IN params error - ErrNoNotInConditions = errors.New("No NOT IN conditions") - // ErrNoInConditions no IN params error - ErrNoInConditions = errors.New("No IN conditions") -) diff --git a/vendor/github.com/go-xorm/core/LICENSE b/vendor/github.com/go-xorm/core/LICENSE deleted file mode 100644 index 113079780..000000000 --- a/vendor/github.com/go-xorm/core/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2013 - 2015 Lunny Xiao -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the {organization} 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 COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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. diff --git a/vendor/github.com/go-xorm/core/README.md b/vendor/github.com/go-xorm/core/README.md deleted file mode 100644 index 09b72c74b..000000000 --- a/vendor/github.com/go-xorm/core/README.md +++ /dev/null @@ -1,116 +0,0 @@ -Core is a lightweight wrapper of sql.DB. - -[![CircleCI](https://circleci.com/gh/go-xorm/core/tree/master.svg?style=svg)](https://circleci.com/gh/go-xorm/core/tree/master) - -# Open -```Go -db, _ := core.Open(db, connstr) -``` - -# SetMapper -```Go -db.SetMapper(SameMapper()) -``` - -## Scan usage - -### Scan -```Go -rows, _ := db.Query() -for rows.Next() { - rows.Scan() -} -``` - -### ScanMap -```Go -rows, _ := db.Query() -for rows.Next() { - rows.ScanMap() -``` - -### ScanSlice - -You can use `[]string`, `[][]byte`, `[]interface{}`, `[]*string`, `[]sql.NullString` to ScanSclice. Notice, slice's length should be equal or less than select columns. - -```Go -rows, _ := db.Query() -cols, _ := rows.Columns() -for rows.Next() { - var s = make([]string, len(cols)) - rows.ScanSlice(&s) -} -``` - -```Go -rows, _ := db.Query() -cols, _ := rows.Columns() -for rows.Next() { - var s = make([]*string, len(cols)) - rows.ScanSlice(&s) -} -``` - -### ScanStruct -```Go -rows, _ := db.Query() -for rows.Next() { - rows.ScanStructByName() - rows.ScanStructByIndex() -} -``` - -## Query usage -```Go -rows, err := db.Query("select * from table where name = ?", name) - -user = User{ - Name:"lunny", -} -rows, err := db.QueryStruct("select * from table where name = ?Name", - &user) - -var user = map[string]interface{}{ - "name": "lunny", -} -rows, err = db.QueryMap("select * from table where name = ?name", - &user) -``` - -## QueryRow usage -```Go -row := db.QueryRow("select * from table where name = ?", name) - -user = User{ - Name:"lunny", -} -row := db.QueryRowStruct("select * from table where name = ?Name", - &user) - -var user = map[string]interface{}{ - "name": "lunny", -} -row = db.QueryRowMap("select * from table where name = ?name", - &user) -``` - -## Exec usage -```Go -db.Exec("insert into user (`name`, title, age, alias, nick_name,created) values (?,?,?,?,?,?)", name, title, age, alias...) - -user = User{ - Name:"lunny", - Title:"test", - Age: 18, -} -result, err = db.ExecStruct("insert into user (`name`, title, age, alias, nick_name,created) values (?Name,?Title,?Age,?Alias,?NickName,?Created)", - &user) - -var user = map[string]interface{}{ - "Name": "lunny", - "Title": "test", - "Age": 18, -} -result, err = db.ExecMap("insert into user (`name`, title, age, alias, nick_name,created) values (?Name,?Title,?Age,?Alias,?NickName,?Created)", - &user) -``` \ No newline at end of file diff --git a/vendor/github.com/go-xorm/core/benchmark.sh b/vendor/github.com/go-xorm/core/benchmark.sh deleted file mode 100644 index eab9e57e9..000000000 --- a/vendor/github.com/go-xorm/core/benchmark.sh +++ /dev/null @@ -1 +0,0 @@ -go test -v -bench=. -run=XXX diff --git a/vendor/github.com/go-xorm/core/cache.go b/vendor/github.com/go-xorm/core/cache.go deleted file mode 100644 index cd95e548f..000000000 --- a/vendor/github.com/go-xorm/core/cache.go +++ /dev/null @@ -1,86 +0,0 @@ -package core - -import ( - "bytes" - "encoding/gob" - "errors" - "fmt" - "time" -) - -const ( - // default cache expired time - CacheExpired = 60 * time.Minute - // not use now - CacheMaxMemory = 256 - // evey ten minutes to clear all expired nodes - CacheGcInterval = 10 * time.Minute - // each time when gc to removed max nodes - CacheGcMaxRemoved = 20 -) - -var ( - ErrCacheMiss = errors.New("xorm/cache: key not found.") - ErrNotStored = errors.New("xorm/cache: not stored.") -) - -// CacheStore is a interface to store cache -type CacheStore interface { - // key is primary key or composite primary key - // value is struct's pointer - // key format : -p--... - Put(key string, value interface{}) error - Get(key string) (interface{}, error) - Del(key string) error -} - -// Cacher is an interface to provide cache -// id format : u--... -type Cacher interface { - GetIds(tableName, sql string) interface{} - GetBean(tableName string, id string) interface{} - PutIds(tableName, sql string, ids interface{}) - PutBean(tableName string, id string, obj interface{}) - DelIds(tableName, sql string) - DelBean(tableName string, id string) - ClearIds(tableName string) - ClearBeans(tableName string) -} - -func encodeIds(ids []PK) (string, error) { - buf := new(bytes.Buffer) - enc := gob.NewEncoder(buf) - err := enc.Encode(ids) - - return buf.String(), err -} - -func decodeIds(s string) ([]PK, error) { - pks := make([]PK, 0) - - dec := gob.NewDecoder(bytes.NewBufferString(s)) - err := dec.Decode(&pks) - - return pks, err -} - -func GetCacheSql(m Cacher, tableName, sql string, args interface{}) ([]PK, error) { - bytes := m.GetIds(tableName, GenSqlKey(sql, args)) - if bytes == nil { - return nil, errors.New("Not Exist") - } - return decodeIds(bytes.(string)) -} - -func PutCacheSql(m Cacher, ids []PK, tableName, sql string, args interface{}) error { - bytes, err := encodeIds(ids) - if err != nil { - return err - } - m.PutIds(tableName, GenSqlKey(sql, args), bytes) - return nil -} - -func GenSqlKey(sql string, args interface{}) string { - return fmt.Sprintf("%v-%v", sql, args) -} diff --git a/vendor/github.com/go-xorm/core/circle.yml b/vendor/github.com/go-xorm/core/circle.yml deleted file mode 100644 index 006e1230b..000000000 --- a/vendor/github.com/go-xorm/core/circle.yml +++ /dev/null @@ -1,14 +0,0 @@ -dependencies: - override: - # './...' is a relative pattern which means all subdirectories - - go get -t -d -v ./... - - go build -v - -database: - override: - - mysql -u root -e "CREATE DATABASE core_test DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci" - -test: - override: - # './...' is a relative pattern which means all subdirectories - - go test -v -race \ No newline at end of file diff --git a/vendor/github.com/go-xorm/core/column.go b/vendor/github.com/go-xorm/core/column.go deleted file mode 100644 index c59d01021..000000000 --- a/vendor/github.com/go-xorm/core/column.go +++ /dev/null @@ -1,156 +0,0 @@ -package core - -import ( - "fmt" - "reflect" - "strings" - "time" -) - -const ( - TWOSIDES = iota + 1 - ONLYTODB - ONLYFROMDB -) - -// database column -type Column struct { - Name string - TableName string - FieldName string - SQLType SQLType - Length int - Length2 int - Nullable bool - Default string - Indexes map[string]int - IsPrimaryKey bool - IsAutoIncrement bool - MapType int - IsCreated bool - IsUpdated bool - IsDeleted bool - IsCascade bool - IsVersion bool - DefaultIsEmpty bool - EnumOptions map[string]int - SetOptions map[string]int - DisableTimeZone bool - TimeZone *time.Location // column specified time zone -} - -func NewColumn(name, fieldName string, sqlType SQLType, len1, len2 int, nullable bool) *Column { - return &Column{ - Name: name, - TableName: "", - FieldName: fieldName, - SQLType: sqlType, - Length: len1, - Length2: len2, - Nullable: nullable, - Default: "", - Indexes: make(map[string]int), - IsPrimaryKey: false, - IsAutoIncrement: false, - MapType: TWOSIDES, - IsCreated: false, - IsUpdated: false, - IsDeleted: false, - IsCascade: false, - IsVersion: false, - DefaultIsEmpty: false, - EnumOptions: make(map[string]int), - } -} - -// generate column description string according dialect -func (col *Column) String(d Dialect) string { - sql := d.QuoteStr() + col.Name + d.QuoteStr() + " " - - sql += d.SqlType(col) + " " - - if col.IsPrimaryKey { - sql += "PRIMARY KEY " - if col.IsAutoIncrement { - sql += d.AutoIncrStr() + " " - } - } - - if d.ShowCreateNull() { - if col.Nullable { - sql += "NULL " - } else { - sql += "NOT NULL " - } - } - - if col.Default != "" { - sql += "DEFAULT " + col.Default + " " - } - - return sql -} - -func (col *Column) StringNoPk(d Dialect) string { - sql := d.QuoteStr() + col.Name + d.QuoteStr() + " " - - sql += d.SqlType(col) + " " - - if d.ShowCreateNull() { - if col.Nullable { - sql += "NULL " - } else { - sql += "NOT NULL " - } - } - - if col.Default != "" { - sql += "DEFAULT " + col.Default + " " - } - - return sql -} - -// return col's filed of struct's value -func (col *Column) ValueOf(bean interface{}) (*reflect.Value, error) { - dataStruct := reflect.Indirect(reflect.ValueOf(bean)) - return col.ValueOfV(&dataStruct) -} - -func (col *Column) ValueOfV(dataStruct *reflect.Value) (*reflect.Value, error) { - var fieldValue reflect.Value - fieldPath := strings.Split(col.FieldName, ".") - - if dataStruct.Type().Kind() == reflect.Map { - keyValue := reflect.ValueOf(fieldPath[len(fieldPath)-1]) - fieldValue = dataStruct.MapIndex(keyValue) - return &fieldValue, nil - } else if dataStruct.Type().Kind() == reflect.Interface { - structValue := reflect.ValueOf(dataStruct.Interface()) - dataStruct = &structValue - } - - level := len(fieldPath) - fieldValue = dataStruct.FieldByName(fieldPath[0]) - for i := 0; i < level-1; i++ { - if !fieldValue.IsValid() { - break - } - if fieldValue.Kind() == reflect.Struct { - fieldValue = fieldValue.FieldByName(fieldPath[i+1]) - } else if fieldValue.Kind() == reflect.Ptr { - if fieldValue.IsNil() { - fieldValue.Set(reflect.New(fieldValue.Type().Elem())) - } - fieldValue = fieldValue.Elem().FieldByName(fieldPath[i+1]) - } else { - return nil, fmt.Errorf("field %v is not valid", col.FieldName) - } - } - - if !fieldValue.IsValid() { - return nil, fmt.Errorf("field %v is not valid", col.FieldName) - } - - return &fieldValue, nil -} diff --git a/vendor/github.com/go-xorm/core/converstion.go b/vendor/github.com/go-xorm/core/converstion.go deleted file mode 100644 index 18522fbee..000000000 --- a/vendor/github.com/go-xorm/core/converstion.go +++ /dev/null @@ -1,8 +0,0 @@ -package core - -// Conversion is an interface. A type implements Conversion will according -// the custom method to fill into database and retrieve from database. -type Conversion interface { - FromDB([]byte) error - ToDB() ([]byte, error) -} diff --git a/vendor/github.com/go-xorm/core/db.go b/vendor/github.com/go-xorm/core/db.go deleted file mode 100644 index 6111c4b33..000000000 --- a/vendor/github.com/go-xorm/core/db.go +++ /dev/null @@ -1,368 +0,0 @@ -package core - -import ( - "database/sql" - "database/sql/driver" - "errors" - "fmt" - "reflect" - "regexp" -) - -func MapToSlice(query string, mp interface{}) (string, []interface{}, error) { - vv := reflect.ValueOf(mp) - if vv.Kind() != reflect.Ptr || vv.Elem().Kind() != reflect.Map { - return "", []interface{}{}, ErrNoMapPointer - } - - args := make([]interface{}, 0, len(vv.Elem().MapKeys())) - var err error - query = re.ReplaceAllStringFunc(query, func(src string) string { - v := vv.Elem().MapIndex(reflect.ValueOf(src[1:])) - if !v.IsValid() { - err = fmt.Errorf("map key %s is missing", src[1:]) - } else { - args = append(args, v.Interface()) - } - return "?" - }) - - return query, args, err -} - -func StructToSlice(query string, st interface{}) (string, []interface{}, error) { - vv := reflect.ValueOf(st) - if vv.Kind() != reflect.Ptr || vv.Elem().Kind() != reflect.Struct { - return "", []interface{}{}, ErrNoStructPointer - } - - args := make([]interface{}, 0) - var err error - query = re.ReplaceAllStringFunc(query, func(src string) string { - fv := vv.Elem().FieldByName(src[1:]).Interface() - if v, ok := fv.(driver.Valuer); ok { - var value driver.Value - value, err = v.Value() - if err != nil { - return "?" - } - args = append(args, value) - } else { - args = append(args, fv) - } - return "?" - }) - if err != nil { - return "", []interface{}{}, err - } - return query, args, nil -} - -type DB struct { - *sql.DB - Mapper IMapper -} - -func Open(driverName, dataSourceName string) (*DB, error) { - db, err := sql.Open(driverName, dataSourceName) - if err != nil { - return nil, err - } - return &DB{db, NewCacheMapper(&SnakeMapper{})}, nil -} - -func FromDB(db *sql.DB) *DB { - return &DB{db, NewCacheMapper(&SnakeMapper{})} -} - -func (db *DB) Query(query string, args ...interface{}) (*Rows, error) { - rows, err := db.DB.Query(query, args...) - if err != nil { - if rows != nil { - rows.Close() - } - return nil, err - } - return &Rows{rows, db.Mapper}, nil -} - -func (db *DB) QueryMap(query string, mp interface{}) (*Rows, error) { - query, args, err := MapToSlice(query, mp) - if err != nil { - return nil, err - } - return db.Query(query, args...) -} - -func (db *DB) QueryStruct(query string, st interface{}) (*Rows, error) { - query, args, err := StructToSlice(query, st) - if err != nil { - return nil, err - } - return db.Query(query, args...) -} - -func (db *DB) QueryRow(query string, args ...interface{}) *Row { - rows, err := db.Query(query, args...) - if err != nil { - return &Row{nil, err} - } - return &Row{rows, nil} -} - -func (db *DB) QueryRowMap(query string, mp interface{}) *Row { - query, args, err := MapToSlice(query, mp) - if err != nil { - return &Row{nil, err} - } - return db.QueryRow(query, args...) -} - -func (db *DB) QueryRowStruct(query string, st interface{}) *Row { - query, args, err := StructToSlice(query, st) - if err != nil { - return &Row{nil, err} - } - return db.QueryRow(query, args...) -} - -type Stmt struct { - *sql.Stmt - Mapper IMapper - names map[string]int -} - -func (db *DB) Prepare(query string) (*Stmt, error) { - names := make(map[string]int) - var i int - query = re.ReplaceAllStringFunc(query, func(src string) string { - names[src[1:]] = i - i += 1 - return "?" - }) - - stmt, err := db.DB.Prepare(query) - if err != nil { - return nil, err - } - return &Stmt{stmt, db.Mapper, names}, nil -} - -func (s *Stmt) ExecMap(mp interface{}) (sql.Result, error) { - vv := reflect.ValueOf(mp) - if vv.Kind() != reflect.Ptr || vv.Elem().Kind() != reflect.Map { - return nil, errors.New("mp should be a map's pointer") - } - - args := make([]interface{}, len(s.names)) - for k, i := range s.names { - args[i] = vv.Elem().MapIndex(reflect.ValueOf(k)).Interface() - } - return s.Stmt.Exec(args...) -} - -func (s *Stmt) ExecStruct(st interface{}) (sql.Result, error) { - vv := reflect.ValueOf(st) - if vv.Kind() != reflect.Ptr || vv.Elem().Kind() != reflect.Struct { - return nil, errors.New("mp should be a map's pointer") - } - - args := make([]interface{}, len(s.names)) - for k, i := range s.names { - args[i] = vv.Elem().FieldByName(k).Interface() - } - return s.Stmt.Exec(args...) -} - -func (s *Stmt) Query(args ...interface{}) (*Rows, error) { - rows, err := s.Stmt.Query(args...) - if err != nil { - return nil, err - } - return &Rows{rows, s.Mapper}, nil -} - -func (s *Stmt) QueryMap(mp interface{}) (*Rows, error) { - vv := reflect.ValueOf(mp) - if vv.Kind() != reflect.Ptr || vv.Elem().Kind() != reflect.Map { - return nil, errors.New("mp should be a map's pointer") - } - - args := make([]interface{}, len(s.names)) - for k, i := range s.names { - args[i] = vv.Elem().MapIndex(reflect.ValueOf(k)).Interface() - } - - return s.Query(args...) -} - -func (s *Stmt) QueryStruct(st interface{}) (*Rows, error) { - vv := reflect.ValueOf(st) - if vv.Kind() != reflect.Ptr || vv.Elem().Kind() != reflect.Struct { - return nil, errors.New("mp should be a map's pointer") - } - - args := make([]interface{}, len(s.names)) - for k, i := range s.names { - args[i] = vv.Elem().FieldByName(k).Interface() - } - - return s.Query(args...) -} - -func (s *Stmt) QueryRow(args ...interface{}) *Row { - rows, err := s.Query(args...) - return &Row{rows, err} -} - -func (s *Stmt) QueryRowMap(mp interface{}) *Row { - vv := reflect.ValueOf(mp) - if vv.Kind() != reflect.Ptr || vv.Elem().Kind() != reflect.Map { - return &Row{nil, errors.New("mp should be a map's pointer")} - } - - args := make([]interface{}, len(s.names)) - for k, i := range s.names { - args[i] = vv.Elem().MapIndex(reflect.ValueOf(k)).Interface() - } - - return s.QueryRow(args...) -} - -func (s *Stmt) QueryRowStruct(st interface{}) *Row { - vv := reflect.ValueOf(st) - if vv.Kind() != reflect.Ptr || vv.Elem().Kind() != reflect.Struct { - return &Row{nil, errors.New("st should be a struct's pointer")} - } - - args := make([]interface{}, len(s.names)) - for k, i := range s.names { - args[i] = vv.Elem().FieldByName(k).Interface() - } - - return s.QueryRow(args...) -} - -var ( - re = regexp.MustCompile(`[?](\w+)`) -) - -// insert into (name) values (?) -// insert into (name) values (?name) -func (db *DB) ExecMap(query string, mp interface{}) (sql.Result, error) { - query, args, err := MapToSlice(query, mp) - if err != nil { - return nil, err - } - return db.DB.Exec(query, args...) -} - -func (db *DB) ExecStruct(query string, st interface{}) (sql.Result, error) { - query, args, err := StructToSlice(query, st) - if err != nil { - return nil, err - } - return db.DB.Exec(query, args...) -} - -type EmptyScanner struct { -} - -func (EmptyScanner) Scan(src interface{}) error { - return nil -} - -type Tx struct { - *sql.Tx - Mapper IMapper -} - -func (db *DB) Begin() (*Tx, error) { - tx, err := db.DB.Begin() - if err != nil { - return nil, err - } - return &Tx{tx, db.Mapper}, nil -} - -func (tx *Tx) Prepare(query string) (*Stmt, error) { - names := make(map[string]int) - var i int - query = re.ReplaceAllStringFunc(query, func(src string) string { - names[src[1:]] = i - i += 1 - return "?" - }) - - stmt, err := tx.Tx.Prepare(query) - if err != nil { - return nil, err - } - return &Stmt{stmt, tx.Mapper, names}, nil -} - -func (tx *Tx) Stmt(stmt *Stmt) *Stmt { - // TODO: - return stmt -} - -func (tx *Tx) ExecMap(query string, mp interface{}) (sql.Result, error) { - query, args, err := MapToSlice(query, mp) - if err != nil { - return nil, err - } - return tx.Tx.Exec(query, args...) -} - -func (tx *Tx) ExecStruct(query string, st interface{}) (sql.Result, error) { - query, args, err := StructToSlice(query, st) - if err != nil { - return nil, err - } - return tx.Tx.Exec(query, args...) -} - -func (tx *Tx) Query(query string, args ...interface{}) (*Rows, error) { - rows, err := tx.Tx.Query(query, args...) - if err != nil { - return nil, err - } - return &Rows{rows, tx.Mapper}, nil -} - -func (tx *Tx) QueryMap(query string, mp interface{}) (*Rows, error) { - query, args, err := MapToSlice(query, mp) - if err != nil { - return nil, err - } - return tx.Query(query, args...) -} - -func (tx *Tx) QueryStruct(query string, st interface{}) (*Rows, error) { - query, args, err := StructToSlice(query, st) - if err != nil { - return nil, err - } - return tx.Query(query, args...) -} - -func (tx *Tx) QueryRow(query string, args ...interface{}) *Row { - rows, err := tx.Query(query, args...) - return &Row{rows, err} -} - -func (tx *Tx) QueryRowMap(query string, mp interface{}) *Row { - query, args, err := MapToSlice(query, mp) - if err != nil { - return &Row{nil, err} - } - return tx.QueryRow(query, args...) -} - -func (tx *Tx) QueryRowStruct(query string, st interface{}) *Row { - query, args, err := StructToSlice(query, st) - if err != nil { - return &Row{nil, err} - } - return tx.QueryRow(query, args...) -} diff --git a/vendor/github.com/go-xorm/core/dialect.go b/vendor/github.com/go-xorm/core/dialect.go deleted file mode 100644 index 70420ee5a..000000000 --- a/vendor/github.com/go-xorm/core/dialect.go +++ /dev/null @@ -1,307 +0,0 @@ -package core - -import ( - "fmt" - "strings" - "time" -) - -type DbType string - -type Uri struct { - DbType DbType - Proto string - Host string - Port string - DbName string - User string - Passwd string - Charset string - Laddr string - Raddr string - Timeout time.Duration - Schema string -} - -// a dialect is a driver's wrapper -type Dialect interface { - SetLogger(logger ILogger) - Init(*DB, *Uri, string, string) error - URI() *Uri - DB() *DB - DBType() DbType - SqlType(*Column) string - FormatBytes(b []byte) string - - DriverName() string - DataSourceName() string - - QuoteStr() string - IsReserved(string) bool - Quote(string) string - AndStr() string - OrStr() string - EqStr() string - RollBackStr() string - AutoIncrStr() string - - SupportInsertMany() bool - SupportEngine() bool - SupportCharset() bool - SupportDropIfExists() bool - IndexOnTable() bool - ShowCreateNull() bool - - IndexCheckSql(tableName, idxName string) (string, []interface{}) - TableCheckSql(tableName string) (string, []interface{}) - - IsColumnExist(tableName string, colName string) (bool, error) - - CreateTableSql(table *Table, tableName, storeEngine, charset string) string - DropTableSql(tableName string) string - CreateIndexSql(tableName string, index *Index) string - DropIndexSql(tableName string, index *Index) string - - ModifyColumnSql(tableName string, col *Column) string - - ForUpdateSql(query string) string - - //CreateTableIfNotExists(table *Table, tableName, storeEngine, charset string) error - //MustDropTable(tableName string) error - - GetColumns(tableName string) ([]string, map[string]*Column, error) - GetTables() ([]*Table, error) - GetIndexes(tableName string) (map[string]*Index, error) - - Filters() []Filter -} - -func OpenDialect(dialect Dialect) (*DB, error) { - return Open(dialect.DriverName(), dialect.DataSourceName()) -} - -type Base struct { - db *DB - dialect Dialect - driverName string - dataSourceName string - logger ILogger - *Uri -} - -func (b *Base) DB() *DB { - return b.db -} - -func (b *Base) SetLogger(logger ILogger) { - b.logger = logger -} - -func (b *Base) Init(db *DB, dialect Dialect, uri *Uri, drivername, dataSourceName string) error { - b.db, b.dialect, b.Uri = db, dialect, uri - b.driverName, b.dataSourceName = drivername, dataSourceName - return nil -} - -func (b *Base) URI() *Uri { - return b.Uri -} - -func (b *Base) DBType() DbType { - return b.Uri.DbType -} - -func (b *Base) FormatBytes(bs []byte) string { - return fmt.Sprintf("0x%x", bs) -} - -func (b *Base) DriverName() string { - return b.driverName -} - -func (b *Base) ShowCreateNull() bool { - return true -} - -func (b *Base) DataSourceName() string { - return b.dataSourceName -} - -func (b *Base) AndStr() string { - return "AND" -} - -func (b *Base) OrStr() string { - return "OR" -} - -func (b *Base) EqStr() string { - return "=" -} - -func (db *Base) RollBackStr() string { - return "ROLL BACK" -} - -func (db *Base) SupportDropIfExists() bool { - return true -} - -func (db *Base) DropTableSql(tableName string) string { - return fmt.Sprintf("DROP TABLE IF EXISTS `%s`", tableName) -} - -func (db *Base) HasRecords(query string, args ...interface{}) (bool, error) { - db.LogSQL(query, args) - rows, err := db.DB().Query(query, args...) - if err != nil { - return false, err - } - defer rows.Close() - - if rows.Next() { - return true, nil - } - return false, nil -} - -func (db *Base) IsColumnExist(tableName, colName string) (bool, error) { - query := "SELECT `COLUMN_NAME` FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE `TABLE_SCHEMA` = ? AND `TABLE_NAME` = ? AND `COLUMN_NAME` = ?" - query = strings.Replace(query, "`", db.dialect.QuoteStr(), -1) - return db.HasRecords(query, db.DbName, tableName, colName) -} - -/* -func (db *Base) CreateTableIfNotExists(table *Table, tableName, storeEngine, charset string) error { - sql, args := db.dialect.TableCheckSql(tableName) - rows, err := db.DB().Query(sql, args...) - if db.Logger != nil { - db.Logger.Info("[sql]", sql, args) - } - if err != nil { - return err - } - defer rows.Close() - - if rows.Next() { - return nil - } - - sql = db.dialect.CreateTableSql(table, tableName, storeEngine, charset) - _, err = db.DB().Exec(sql) - if db.Logger != nil { - db.Logger.Info("[sql]", sql) - } - return err -}*/ - -func (db *Base) CreateIndexSql(tableName string, index *Index) string { - quote := db.dialect.Quote - var unique string - var idxName string - if index.Type == UniqueType { - unique = " UNIQUE" - } - idxName = index.XName(tableName) - return fmt.Sprintf("CREATE%s INDEX %v ON %v (%v)", unique, - quote(idxName), quote(tableName), - quote(strings.Join(index.Cols, quote(",")))) -} - -func (db *Base) DropIndexSql(tableName string, index *Index) string { - quote := db.dialect.Quote - var name string - if index.IsRegular { - name = index.XName(tableName) - } else { - name = index.Name - } - return fmt.Sprintf("DROP INDEX %v ON %s", quote(name), quote(tableName)) -} - -func (db *Base) ModifyColumnSql(tableName string, col *Column) string { - return fmt.Sprintf("alter table %s MODIFY COLUMN %s", tableName, col.StringNoPk(db.dialect)) -} - -func (b *Base) CreateTableSql(table *Table, tableName, storeEngine, charset string) string { - var sql string - sql = "CREATE TABLE IF NOT EXISTS " - if tableName == "" { - tableName = table.Name - } - - sql += b.dialect.Quote(tableName) - sql += " (" - - if len(table.ColumnsSeq()) > 0 { - pkList := table.PrimaryKeys - - for _, colName := range table.ColumnsSeq() { - col := table.GetColumn(colName) - if col.IsPrimaryKey && len(pkList) == 1 { - sql += col.String(b.dialect) - } else { - sql += col.StringNoPk(b.dialect) - } - sql = strings.TrimSpace(sql) - sql += ", " - } - - if len(pkList) > 1 { - sql += "PRIMARY KEY ( " - sql += b.dialect.Quote(strings.Join(pkList, b.dialect.Quote(","))) - sql += " ), " - } - - sql = sql[:len(sql)-2] - } - sql += ")" - - if b.dialect.SupportEngine() && storeEngine != "" { - sql += " ENGINE=" + storeEngine - } - if b.dialect.SupportCharset() { - if len(charset) == 0 { - charset = b.dialect.URI().Charset - } - if len(charset) > 0 { - sql += " DEFAULT CHARSET " + charset - } - } - - return sql -} - -func (b *Base) ForUpdateSql(query string) string { - return query + " FOR UPDATE" -} - -func (b *Base) LogSQL(sql string, args []interface{}) { - if b.logger != nil && b.logger.IsShowSQL() { - if len(args) > 0 { - b.logger.Info("[sql]", sql, args) - } else { - b.logger.Info("[sql]", sql) - } - } -} - -var ( - dialects = map[string]func() Dialect{} -) - -// RegisterDialect register database dialect -func RegisterDialect(dbName DbType, dialectFunc func() Dialect) { - if dialectFunc == nil { - panic("core: Register dialect is nil") - } - dialects[strings.ToLower(string(dbName))] = dialectFunc // !nashtsai! allow override dialect -} - -// QueryDialect query if registed database dialect -func QueryDialect(dbName DbType) Dialect { - if d, ok := dialects[strings.ToLower(string(dbName))]; ok { - return d() - } - return nil -} diff --git a/vendor/github.com/go-xorm/core/driver.go b/vendor/github.com/go-xorm/core/driver.go deleted file mode 100644 index 0f1020b40..000000000 --- a/vendor/github.com/go-xorm/core/driver.go +++ /dev/null @@ -1,27 +0,0 @@ -package core - -type Driver interface { - Parse(string, string) (*Uri, error) -} - -var ( - drivers = map[string]Driver{} -) - -func RegisterDriver(driverName string, driver Driver) { - if driver == nil { - panic("core: Register driver is nil") - } - if _, dup := drivers[driverName]; dup { - panic("core: Register called twice for driver " + driverName) - } - drivers[driverName] = driver -} - -func QueryDriver(driverName string) Driver { - return drivers[driverName] -} - -func RegisteredDriverSize() int { - return len(drivers) -} diff --git a/vendor/github.com/go-xorm/core/error.go b/vendor/github.com/go-xorm/core/error.go deleted file mode 100644 index 640e6036e..000000000 --- a/vendor/github.com/go-xorm/core/error.go +++ /dev/null @@ -1,8 +0,0 @@ -package core - -import "errors" - -var ( - ErrNoMapPointer = errors.New("mp should be a map's pointer") - ErrNoStructPointer = errors.New("mp should be a struct's pointer") -) diff --git a/vendor/github.com/go-xorm/core/filter.go b/vendor/github.com/go-xorm/core/filter.go deleted file mode 100644 index 60caaf290..000000000 --- a/vendor/github.com/go-xorm/core/filter.go +++ /dev/null @@ -1,64 +0,0 @@ -package core - -import ( - "fmt" - "strings" -) - -// Filter is an interface to filter SQL -type Filter interface { - Do(sql string, dialect Dialect, table *Table) string -} - -// QuoteFilter filter SQL replace ` to database's own quote character -type QuoteFilter struct { -} - -func (s *QuoteFilter) Do(sql string, dialect Dialect, table *Table) string { - return strings.Replace(sql, "`", dialect.QuoteStr(), -1) -} - -// IdFilter filter SQL replace (id) to primary key column name -type IdFilter struct { -} - -type Quoter struct { - dialect Dialect -} - -func NewQuoter(dialect Dialect) *Quoter { - return &Quoter{dialect} -} - -func (q *Quoter) Quote(content string) string { - return q.dialect.QuoteStr() + content + q.dialect.QuoteStr() -} - -func (i *IdFilter) Do(sql string, dialect Dialect, table *Table) string { - quoter := NewQuoter(dialect) - if table != nil && len(table.PrimaryKeys) == 1 { - sql = strings.Replace(sql, "`(id)`", quoter.Quote(table.PrimaryKeys[0]), -1) - sql = strings.Replace(sql, quoter.Quote("(id)"), quoter.Quote(table.PrimaryKeys[0]), -1) - return strings.Replace(sql, "(id)", quoter.Quote(table.PrimaryKeys[0]), -1) - } - return sql -} - -// SeqFilter filter SQL replace ?, ? ... to $1, $2 ... -type SeqFilter struct { - Prefix string - Start int -} - -func (s *SeqFilter) Do(sql string, dialect Dialect, table *Table) string { - segs := strings.Split(sql, "?") - size := len(segs) - res := "" - for i, c := range segs { - if i < size-1 { - res += c + fmt.Sprintf("%s%v", s.Prefix, i+s.Start) - } - } - res += segs[size-1] - return res -} diff --git a/vendor/github.com/go-xorm/core/ilogger.go b/vendor/github.com/go-xorm/core/ilogger.go deleted file mode 100644 index c8d784960..000000000 --- a/vendor/github.com/go-xorm/core/ilogger.go +++ /dev/null @@ -1,31 +0,0 @@ -package core - -type LogLevel int - -const ( - // !nashtsai! following level also match syslog.Priority value - LOG_DEBUG LogLevel = iota - LOG_INFO - LOG_WARNING - LOG_ERR - LOG_OFF - LOG_UNKNOWN -) - -// logger interface -type ILogger interface { - Debug(v ...interface{}) - Debugf(format string, v ...interface{}) - Error(v ...interface{}) - Errorf(format string, v ...interface{}) - Info(v ...interface{}) - Infof(format string, v ...interface{}) - Warn(v ...interface{}) - Warnf(format string, v ...interface{}) - - Level() LogLevel - SetLevel(l LogLevel) - - ShowSQL(show ...bool) - IsShowSQL() bool -} diff --git a/vendor/github.com/go-xorm/core/index.go b/vendor/github.com/go-xorm/core/index.go deleted file mode 100644 index 73b95175a..000000000 --- a/vendor/github.com/go-xorm/core/index.go +++ /dev/null @@ -1,61 +0,0 @@ -package core - -import ( - "fmt" - "sort" - "strings" -) - -const ( - IndexType = iota + 1 - UniqueType -) - -// database index -type Index struct { - IsRegular bool - Name string - Type int - Cols []string -} - -func (index *Index) XName(tableName string) string { - if !strings.HasPrefix(index.Name, "UQE_") && - !strings.HasPrefix(index.Name, "IDX_") { - if index.Type == UniqueType { - return fmt.Sprintf("UQE_%v_%v", tableName, index.Name) - } - return fmt.Sprintf("IDX_%v_%v", tableName, index.Name) - } - return index.Name -} - -// add columns which will be composite index -func (index *Index) AddColumn(cols ...string) { - for _, col := range cols { - index.Cols = append(index.Cols, col) - } -} - -func (index *Index) Equal(dst *Index) bool { - if index.Type != dst.Type { - return false - } - if len(index.Cols) != len(dst.Cols) { - return false - } - sort.StringSlice(index.Cols).Sort() - sort.StringSlice(dst.Cols).Sort() - - for i := 0; i < len(index.Cols); i++ { - if index.Cols[i] != dst.Cols[i] { - return false - } - } - return true -} - -// new an index -func NewIndex(name string, indexType int) *Index { - return &Index{true, name, indexType, make([]string, 0)} -} diff --git a/vendor/github.com/go-xorm/core/mapper.go b/vendor/github.com/go-xorm/core/mapper.go deleted file mode 100644 index bb72a1566..000000000 --- a/vendor/github.com/go-xorm/core/mapper.go +++ /dev/null @@ -1,254 +0,0 @@ -package core - -import ( - "strings" - "sync" -) - -// name translation between struct, fields names and table, column names -type IMapper interface { - Obj2Table(string) string - Table2Obj(string) string -} - -type CacheMapper struct { - oriMapper IMapper - obj2tableCache map[string]string - obj2tableMutex sync.RWMutex - table2objCache map[string]string - table2objMutex sync.RWMutex -} - -func NewCacheMapper(mapper IMapper) *CacheMapper { - return &CacheMapper{oriMapper: mapper, obj2tableCache: make(map[string]string), - table2objCache: make(map[string]string), - } -} - -func (m *CacheMapper) Obj2Table(o string) string { - m.obj2tableMutex.RLock() - t, ok := m.obj2tableCache[o] - m.obj2tableMutex.RUnlock() - if ok { - return t - } - - t = m.oriMapper.Obj2Table(o) - m.obj2tableMutex.Lock() - m.obj2tableCache[o] = t - m.obj2tableMutex.Unlock() - return t -} - -func (m *CacheMapper) Table2Obj(t string) string { - m.table2objMutex.RLock() - o, ok := m.table2objCache[t] - m.table2objMutex.RUnlock() - if ok { - return o - } - - o = m.oriMapper.Table2Obj(t) - m.table2objMutex.Lock() - m.table2objCache[t] = o - m.table2objMutex.Unlock() - return o -} - -// SameMapper implements IMapper and provides same name between struct and -// database table -type SameMapper struct { -} - -func (m SameMapper) Obj2Table(o string) string { - return o -} - -func (m SameMapper) Table2Obj(t string) string { - return t -} - -// SnakeMapper implements IMapper and provides name transaltion between -// struct and database table -type SnakeMapper struct { -} - -func snakeCasedName(name string) string { - newstr := make([]rune, 0) - for idx, chr := range name { - if isUpper := 'A' <= chr && chr <= 'Z'; isUpper { - if idx > 0 { - newstr = append(newstr, '_') - } - chr -= ('A' - 'a') - } - newstr = append(newstr, chr) - } - - return string(newstr) -} - -func (mapper SnakeMapper) Obj2Table(name string) string { - return snakeCasedName(name) -} - -func titleCasedName(name string) string { - newstr := make([]rune, 0) - upNextChar := true - - name = strings.ToLower(name) - - for _, chr := range name { - switch { - case upNextChar: - upNextChar = false - if 'a' <= chr && chr <= 'z' { - chr -= ('a' - 'A') - } - case chr == '_': - upNextChar = true - continue - } - - newstr = append(newstr, chr) - } - - return string(newstr) -} - -func (mapper SnakeMapper) Table2Obj(name string) string { - return titleCasedName(name) -} - -// GonicMapper implements IMapper. It will consider initialisms when mapping names. -// E.g. id -> ID, user -> User and to table names: UserID -> user_id, MyUID -> my_uid -type GonicMapper map[string]bool - -func isASCIIUpper(r rune) bool { - return 'A' <= r && r <= 'Z' -} - -func toASCIIUpper(r rune) rune { - if 'a' <= r && r <= 'z' { - r -= ('a' - 'A') - } - return r -} - -func gonicCasedName(name string) string { - newstr := make([]rune, 0, len(name)+3) - for idx, chr := range name { - if isASCIIUpper(chr) && idx > 0 { - if !isASCIIUpper(newstr[len(newstr)-1]) { - newstr = append(newstr, '_') - } - } - - if !isASCIIUpper(chr) && idx > 1 { - l := len(newstr) - if isASCIIUpper(newstr[l-1]) && isASCIIUpper(newstr[l-2]) { - newstr = append(newstr, newstr[l-1]) - newstr[l-1] = '_' - } - } - - newstr = append(newstr, chr) - } - return strings.ToLower(string(newstr)) -} - -func (mapper GonicMapper) Obj2Table(name string) string { - return gonicCasedName(name) -} - -func (mapper GonicMapper) Table2Obj(name string) string { - newstr := make([]rune, 0) - - name = strings.ToLower(name) - parts := strings.Split(name, "_") - - for _, p := range parts { - _, isInitialism := mapper[strings.ToUpper(p)] - for i, r := range p { - if i == 0 || isInitialism { - r = toASCIIUpper(r) - } - newstr = append(newstr, r) - } - } - - return string(newstr) -} - -// A GonicMapper that contains a list of common initialisms taken from golang/lint -var LintGonicMapper = GonicMapper{ - "API": true, - "ASCII": true, - "CPU": true, - "CSS": true, - "DNS": true, - "EOF": true, - "GUID": true, - "HTML": true, - "HTTP": true, - "HTTPS": true, - "ID": true, - "IP": true, - "JSON": true, - "LHS": true, - "QPS": true, - "RAM": true, - "RHS": true, - "RPC": true, - "SLA": true, - "SMTP": true, - "SSH": true, - "TLS": true, - "TTL": true, - "UI": true, - "UID": true, - "UUID": true, - "URI": true, - "URL": true, - "UTF8": true, - "VM": true, - "XML": true, - "XSRF": true, - "XSS": true, -} - -// provide prefix table name support -type PrefixMapper struct { - Mapper IMapper - Prefix string -} - -func (mapper PrefixMapper) Obj2Table(name string) string { - return mapper.Prefix + mapper.Mapper.Obj2Table(name) -} - -func (mapper PrefixMapper) Table2Obj(name string) string { - return mapper.Mapper.Table2Obj(name[len(mapper.Prefix):]) -} - -func NewPrefixMapper(mapper IMapper, prefix string) PrefixMapper { - return PrefixMapper{mapper, prefix} -} - -// provide suffix table name support -type SuffixMapper struct { - Mapper IMapper - Suffix string -} - -func (mapper SuffixMapper) Obj2Table(name string) string { - return mapper.Mapper.Obj2Table(name) + mapper.Suffix -} - -func (mapper SuffixMapper) Table2Obj(name string) string { - return mapper.Mapper.Table2Obj(name[:len(name)-len(mapper.Suffix)]) -} - -func NewSuffixMapper(mapper IMapper, suffix string) SuffixMapper { - return SuffixMapper{mapper, suffix} -} diff --git a/vendor/github.com/go-xorm/core/pk.go b/vendor/github.com/go-xorm/core/pk.go deleted file mode 100644 index 1810dd944..000000000 --- a/vendor/github.com/go-xorm/core/pk.go +++ /dev/null @@ -1,26 +0,0 @@ -package core - -import ( - "bytes" - "encoding/gob" -) - -type PK []interface{} - -func NewPK(pks ...interface{}) *PK { - p := PK(pks) - return &p -} - -func (p *PK) ToString() (string, error) { - buf := new(bytes.Buffer) - enc := gob.NewEncoder(buf) - err := enc.Encode(*p) - return buf.String(), err -} - -func (p *PK) FromString(content string) error { - dec := gob.NewDecoder(bytes.NewBufferString(content)) - err := dec.Decode(p) - return err -} diff --git a/vendor/github.com/go-xorm/core/rows.go b/vendor/github.com/go-xorm/core/rows.go deleted file mode 100644 index c4dec23e0..000000000 --- a/vendor/github.com/go-xorm/core/rows.go +++ /dev/null @@ -1,380 +0,0 @@ -package core - -import ( - "database/sql" - "errors" - "reflect" - "sync" -) - -type Rows struct { - *sql.Rows - Mapper IMapper -} - -func (rs *Rows) ToMapString() ([]map[string]string, error) { - cols, err := rs.Columns() - if err != nil { - return nil, err - } - - var results = make([]map[string]string, 0, 10) - for rs.Next() { - var record = make(map[string]string, len(cols)) - err = rs.ScanMap(&record) - if err != nil { - return nil, err - } - results = append(results, record) - } - return results, nil -} - -// scan data to a struct's pointer according field index -func (rs *Rows) ScanStructByIndex(dest ...interface{}) error { - if len(dest) == 0 { - return errors.New("at least one struct") - } - - vvvs := make([]reflect.Value, len(dest)) - for i, s := range dest { - vv := reflect.ValueOf(s) - if vv.Kind() != reflect.Ptr || vv.Elem().Kind() != reflect.Struct { - return errors.New("dest should be a struct's pointer") - } - - vvvs[i] = vv.Elem() - } - - cols, err := rs.Columns() - if err != nil { - return err - } - newDest := make([]interface{}, len(cols)) - - var i = 0 - for _, vvv := range vvvs { - for j := 0; j < vvv.NumField(); j++ { - newDest[i] = vvv.Field(j).Addr().Interface() - i = i + 1 - } - } - - return rs.Rows.Scan(newDest...) -} - -var ( - fieldCache = make(map[reflect.Type]map[string]int) - fieldCacheMutex sync.RWMutex -) - -func fieldByName(v reflect.Value, name string) reflect.Value { - t := v.Type() - fieldCacheMutex.RLock() - cache, ok := fieldCache[t] - fieldCacheMutex.RUnlock() - if !ok { - cache = make(map[string]int) - for i := 0; i < v.NumField(); i++ { - cache[t.Field(i).Name] = i - } - fieldCacheMutex.Lock() - fieldCache[t] = cache - fieldCacheMutex.Unlock() - } - - if i, ok := cache[name]; ok { - return v.Field(i) - } - - return reflect.Zero(t) -} - -// scan data to a struct's pointer according field name -func (rs *Rows) ScanStructByName(dest interface{}) error { - vv := reflect.ValueOf(dest) - if vv.Kind() != reflect.Ptr || vv.Elem().Kind() != reflect.Struct { - return errors.New("dest should be a struct's pointer") - } - - cols, err := rs.Columns() - if err != nil { - return err - } - - newDest := make([]interface{}, len(cols)) - var v EmptyScanner - for j, name := range cols { - f := fieldByName(vv.Elem(), rs.Mapper.Table2Obj(name)) - if f.IsValid() { - newDest[j] = f.Addr().Interface() - } else { - newDest[j] = &v - } - } - - return rs.Rows.Scan(newDest...) -} - -type cacheStruct struct { - value reflect.Value - idx int -} - -var ( - reflectCache = make(map[reflect.Type]*cacheStruct) - reflectCacheMutex sync.RWMutex -) - -func ReflectNew(typ reflect.Type) reflect.Value { - reflectCacheMutex.RLock() - cs, ok := reflectCache[typ] - reflectCacheMutex.RUnlock() - - const newSize = 200 - - if !ok || cs.idx+1 > newSize-1 { - cs = &cacheStruct{reflect.MakeSlice(reflect.SliceOf(typ), newSize, newSize), 0} - reflectCacheMutex.Lock() - reflectCache[typ] = cs - reflectCacheMutex.Unlock() - } else { - reflectCacheMutex.Lock() - cs.idx = cs.idx + 1 - reflectCacheMutex.Unlock() - } - return cs.value.Index(cs.idx).Addr() -} - -// scan data to a slice's pointer, slice's length should equal to columns' number -func (rs *Rows) ScanSlice(dest interface{}) error { - vv := reflect.ValueOf(dest) - if vv.Kind() != reflect.Ptr || vv.Elem().Kind() != reflect.Slice { - return errors.New("dest should be a slice's pointer") - } - - vvv := vv.Elem() - cols, err := rs.Columns() - if err != nil { - return err - } - - newDest := make([]interface{}, len(cols)) - - for j := 0; j < len(cols); j++ { - if j >= vvv.Len() { - newDest[j] = reflect.New(vvv.Type().Elem()).Interface() - } else { - newDest[j] = vvv.Index(j).Addr().Interface() - } - } - - err = rs.Rows.Scan(newDest...) - if err != nil { - return err - } - - srcLen := vvv.Len() - for i := srcLen; i < len(cols); i++ { - vvv = reflect.Append(vvv, reflect.ValueOf(newDest[i]).Elem()) - } - return nil -} - -// scan data to a map's pointer -func (rs *Rows) ScanMap(dest interface{}) error { - vv := reflect.ValueOf(dest) - if vv.Kind() != reflect.Ptr || vv.Elem().Kind() != reflect.Map { - return errors.New("dest should be a map's pointer") - } - - cols, err := rs.Columns() - if err != nil { - return err - } - - newDest := make([]interface{}, len(cols)) - vvv := vv.Elem() - - for i, _ := range cols { - newDest[i] = ReflectNew(vvv.Type().Elem()).Interface() - //v := reflect.New(vvv.Type().Elem()) - //newDest[i] = v.Interface() - } - - err = rs.Rows.Scan(newDest...) - if err != nil { - return err - } - - for i, name := range cols { - vname := reflect.ValueOf(name) - vvv.SetMapIndex(vname, reflect.ValueOf(newDest[i]).Elem()) - } - - return nil -} - -/*func (rs *Rows) ScanMap(dest interface{}) error { - vv := reflect.ValueOf(dest) - if vv.Kind() != reflect.Ptr || vv.Elem().Kind() != reflect.Map { - return errors.New("dest should be a map's pointer") - } - - cols, err := rs.Columns() - if err != nil { - return err - } - - newDest := make([]interface{}, len(cols)) - err = rs.ScanSlice(newDest) - if err != nil { - return err - } - - vvv := vv.Elem() - - for i, name := range cols { - vname := reflect.ValueOf(name) - vvv.SetMapIndex(vname, reflect.ValueOf(newDest[i]).Elem()) - } - - return nil -}*/ -type Row struct { - rows *Rows - // One of these two will be non-nil: - err error // deferred error for easy chaining -} - -func (row *Row) Columns() ([]string, error) { - if row.err != nil { - return nil, row.err - } - return row.rows.Columns() -} - -func (row *Row) Scan(dest ...interface{}) error { - if row.err != nil { - return row.err - } - defer row.rows.Close() - - for _, dp := range dest { - if _, ok := dp.(*sql.RawBytes); ok { - return errors.New("sql: RawBytes isn't allowed on Row.Scan") - } - } - - if !row.rows.Next() { - if err := row.rows.Err(); err != nil { - return err - } - return sql.ErrNoRows - } - err := row.rows.Scan(dest...) - if err != nil { - return err - } - // Make sure the query can be processed to completion with no errors. - return row.rows.Close() -} - -func (row *Row) ScanStructByName(dest interface{}) error { - if row.err != nil { - return row.err - } - defer row.rows.Close() - - if !row.rows.Next() { - if err := row.rows.Err(); err != nil { - return err - } - return sql.ErrNoRows - } - err := row.rows.ScanStructByName(dest) - if err != nil { - return err - } - // Make sure the query can be processed to completion with no errors. - return row.rows.Close() -} - -func (row *Row) ScanStructByIndex(dest interface{}) error { - if row.err != nil { - return row.err - } - defer row.rows.Close() - - if !row.rows.Next() { - if err := row.rows.Err(); err != nil { - return err - } - return sql.ErrNoRows - } - err := row.rows.ScanStructByIndex(dest) - if err != nil { - return err - } - // Make sure the query can be processed to completion with no errors. - return row.rows.Close() -} - -// scan data to a slice's pointer, slice's length should equal to columns' number -func (row *Row) ScanSlice(dest interface{}) error { - if row.err != nil { - return row.err - } - defer row.rows.Close() - - if !row.rows.Next() { - if err := row.rows.Err(); err != nil { - return err - } - return sql.ErrNoRows - } - err := row.rows.ScanSlice(dest) - if err != nil { - return err - } - - // Make sure the query can be processed to completion with no errors. - return row.rows.Close() -} - -// scan data to a map's pointer -func (row *Row) ScanMap(dest interface{}) error { - if row.err != nil { - return row.err - } - defer row.rows.Close() - - if !row.rows.Next() { - if err := row.rows.Err(); err != nil { - return err - } - return sql.ErrNoRows - } - err := row.rows.ScanMap(dest) - if err != nil { - return err - } - - // Make sure the query can be processed to completion with no errors. - return row.rows.Close() -} - -func (row *Row) ToMapString() (map[string]string, error) { - cols, err := row.Columns() - if err != nil { - return nil, err - } - - var record = make(map[string]string, len(cols)) - err = row.ScanMap(&record) - if err != nil { - return nil, err - } - - return record, nil -} diff --git a/vendor/github.com/go-xorm/core/scan.go b/vendor/github.com/go-xorm/core/scan.go deleted file mode 100644 index 7da338d86..000000000 --- a/vendor/github.com/go-xorm/core/scan.go +++ /dev/null @@ -1,52 +0,0 @@ -package core - -import ( - "database/sql/driver" - "fmt" - "time" -) - -type NullTime time.Time - -var ( - _ driver.Valuer = NullTime{} -) - -func (ns *NullTime) Scan(value interface{}) error { - if value == nil { - return nil - } - return convertTime(ns, value) -} - -// Value implements the driver Valuer interface. -func (ns NullTime) Value() (driver.Value, error) { - if (time.Time)(ns).IsZero() { - return nil, nil - } - return (time.Time)(ns).Format("2006-01-02 15:04:05"), nil -} - -func convertTime(dest *NullTime, src interface{}) error { - // Common cases, without reflect. - switch s := src.(type) { - case string: - t, err := time.Parse("2006-01-02 15:04:05", s) - if err != nil { - return err - } - *dest = NullTime(t) - return nil - case []uint8: - t, err := time.Parse("2006-01-02 15:04:05", string(s)) - if err != nil { - return err - } - *dest = NullTime(t) - return nil - case nil: - default: - return fmt.Errorf("unsupported driver -> Scan pair: %T -> %T", src, dest) - } - return nil -} diff --git a/vendor/github.com/go-xorm/core/table.go b/vendor/github.com/go-xorm/core/table.go deleted file mode 100644 index e6f6a7518..000000000 --- a/vendor/github.com/go-xorm/core/table.go +++ /dev/null @@ -1,151 +0,0 @@ -package core - -import ( - "reflect" - "strings" -) - -// database table -type Table struct { - Name string - Type reflect.Type - columnsSeq []string - columnsMap map[string][]*Column - columns []*Column - Indexes map[string]*Index - PrimaryKeys []string - AutoIncrement string - Created map[string]bool - Updated string - Deleted string - Version string - Cacher Cacher - StoreEngine string - Charset string -} - -func (table *Table) Columns() []*Column { - return table.columns -} - -func (table *Table) ColumnsSeq() []string { - return table.columnsSeq -} - -func NewEmptyTable() *Table { - return NewTable("", nil) -} - -func NewTable(name string, t reflect.Type) *Table { - return &Table{Name: name, Type: t, - columnsSeq: make([]string, 0), - columns: make([]*Column, 0), - columnsMap: make(map[string][]*Column), - Indexes: make(map[string]*Index), - Created: make(map[string]bool), - PrimaryKeys: make([]string, 0), - } -} - -func (table *Table) columnsByName(name string) []*Column { - - n := len(name) - - for k := range table.columnsMap { - if len(k) != n { - continue - } - if strings.EqualFold(k, name) { - return table.columnsMap[k] - } - } - return nil -} - -func (table *Table) GetColumn(name string) *Column { - - cols := table.columnsByName(name) - - if cols != nil { - return cols[0] - } - - return nil -} - -func (table *Table) GetColumnIdx(name string, idx int) *Column { - - cols := table.columnsByName(name) - - if cols != nil && idx < len(cols) { - return cols[idx] - } - - return nil -} - -// if has primary key, return column -func (table *Table) PKColumns() []*Column { - columns := make([]*Column, len(table.PrimaryKeys)) - for i, name := range table.PrimaryKeys { - columns[i] = table.GetColumn(name) - } - return columns -} - -func (table *Table) ColumnType(name string) reflect.Type { - t, _ := table.Type.FieldByName(name) - return t.Type -} - -func (table *Table) AutoIncrColumn() *Column { - return table.GetColumn(table.AutoIncrement) -} - -func (table *Table) VersionColumn() *Column { - return table.GetColumn(table.Version) -} - -func (table *Table) UpdatedColumn() *Column { - return table.GetColumn(table.Updated) -} - -func (table *Table) DeletedColumn() *Column { - return table.GetColumn(table.Deleted) -} - -// add a column to table -func (table *Table) AddColumn(col *Column) { - table.columnsSeq = append(table.columnsSeq, col.Name) - table.columns = append(table.columns, col) - colName := strings.ToLower(col.Name) - if c, ok := table.columnsMap[colName]; ok { - table.columnsMap[colName] = append(c, col) - } else { - table.columnsMap[colName] = []*Column{col} - } - - if col.IsPrimaryKey { - table.PrimaryKeys = append(table.PrimaryKeys, col.Name) - } - if col.IsAutoIncrement { - table.AutoIncrement = col.Name - } - if col.IsCreated { - table.Created[col.Name] = true - } - if col.IsUpdated { - table.Updated = col.Name - } - if col.IsDeleted { - table.Deleted = col.Name - } - if col.IsVersion { - table.Version = col.Name - } -} - -// add an index or an unique to table -func (table *Table) AddIndex(index *Index) { - table.Indexes[index.Name] = index -} diff --git a/vendor/github.com/go-xorm/core/type.go b/vendor/github.com/go-xorm/core/type.go deleted file mode 100644 index 860482251..000000000 --- a/vendor/github.com/go-xorm/core/type.go +++ /dev/null @@ -1,304 +0,0 @@ -package core - -import ( - "reflect" - "sort" - "strings" - "time" -) - -const ( - POSTGRES = "postgres" - SQLITE = "sqlite3" - MYSQL = "mysql" - MSSQL = "mssql" - ORACLE = "oracle" -) - -// xorm SQL types -type SQLType struct { - Name string - DefaultLength int - DefaultLength2 int -} - -const ( - UNKNOW_TYPE = iota - TEXT_TYPE - BLOB_TYPE - TIME_TYPE - NUMERIC_TYPE -) - -func (s *SQLType) IsType(st int) bool { - if t, ok := SqlTypes[s.Name]; ok && t == st { - return true - } - return false -} - -func (s *SQLType) IsText() bool { - return s.IsType(TEXT_TYPE) -} - -func (s *SQLType) IsBlob() bool { - return s.IsType(BLOB_TYPE) -} - -func (s *SQLType) IsTime() bool { - return s.IsType(TIME_TYPE) -} - -func (s *SQLType) IsNumeric() bool { - return s.IsType(NUMERIC_TYPE) -} - -func (s *SQLType) IsJson() bool { - return s.Name == Json || s.Name == Jsonb -} - -var ( - Bit = "BIT" - TinyInt = "TINYINT" - SmallInt = "SMALLINT" - MediumInt = "MEDIUMINT" - Int = "INT" - Integer = "INTEGER" - BigInt = "BIGINT" - - Enum = "ENUM" - Set = "SET" - - Char = "CHAR" - Varchar = "VARCHAR" - NVarchar = "NVARCHAR" - TinyText = "TINYTEXT" - Text = "TEXT" - Clob = "CLOB" - MediumText = "MEDIUMTEXT" - LongText = "LONGTEXT" - Uuid = "UUID" - - Date = "DATE" - DateTime = "DATETIME" - Time = "TIME" - TimeStamp = "TIMESTAMP" - TimeStampz = "TIMESTAMPZ" - - Decimal = "DECIMAL" - Numeric = "NUMERIC" - - Real = "REAL" - Float = "FLOAT" - Double = "DOUBLE" - - Binary = "BINARY" - VarBinary = "VARBINARY" - TinyBlob = "TINYBLOB" - Blob = "BLOB" - MediumBlob = "MEDIUMBLOB" - LongBlob = "LONGBLOB" - Bytea = "BYTEA" - - Bool = "BOOL" - - Serial = "SERIAL" - BigSerial = "BIGSERIAL" - - Json = "JSON" - Jsonb = "JSONB" - - SqlTypes = map[string]int{ - Bit: NUMERIC_TYPE, - TinyInt: NUMERIC_TYPE, - SmallInt: NUMERIC_TYPE, - MediumInt: NUMERIC_TYPE, - Int: NUMERIC_TYPE, - Integer: NUMERIC_TYPE, - BigInt: NUMERIC_TYPE, - - Enum: TEXT_TYPE, - Set: TEXT_TYPE, - Json: TEXT_TYPE, - Jsonb: TEXT_TYPE, - - Char: TEXT_TYPE, - Varchar: TEXT_TYPE, - NVarchar: TEXT_TYPE, - TinyText: TEXT_TYPE, - Text: TEXT_TYPE, - MediumText: TEXT_TYPE, - LongText: TEXT_TYPE, - Uuid: TEXT_TYPE, - Clob: TEXT_TYPE, - - Date: TIME_TYPE, - DateTime: TIME_TYPE, - Time: TIME_TYPE, - TimeStamp: TIME_TYPE, - TimeStampz: TIME_TYPE, - - Decimal: NUMERIC_TYPE, - Numeric: NUMERIC_TYPE, - Real: NUMERIC_TYPE, - Float: NUMERIC_TYPE, - Double: NUMERIC_TYPE, - - Binary: BLOB_TYPE, - VarBinary: BLOB_TYPE, - - TinyBlob: BLOB_TYPE, - Blob: BLOB_TYPE, - MediumBlob: BLOB_TYPE, - LongBlob: BLOB_TYPE, - Bytea: BLOB_TYPE, - - Bool: NUMERIC_TYPE, - - Serial: NUMERIC_TYPE, - BigSerial: NUMERIC_TYPE, - } - - intTypes = sort.StringSlice{"*int", "*int16", "*int32", "*int8"} - uintTypes = sort.StringSlice{"*uint", "*uint16", "*uint32", "*uint8"} -) - -// !nashtsai! treat following var as interal const values, these are used for reflect.TypeOf comparision -var ( - c_EMPTY_STRING string - c_BOOL_DEFAULT bool - c_BYTE_DEFAULT byte - c_COMPLEX64_DEFAULT complex64 - c_COMPLEX128_DEFAULT complex128 - c_FLOAT32_DEFAULT float32 - c_FLOAT64_DEFAULT float64 - c_INT64_DEFAULT int64 - c_UINT64_DEFAULT uint64 - c_INT32_DEFAULT int32 - c_UINT32_DEFAULT uint32 - c_INT16_DEFAULT int16 - c_UINT16_DEFAULT uint16 - c_INT8_DEFAULT int8 - c_UINT8_DEFAULT uint8 - c_INT_DEFAULT int - c_UINT_DEFAULT uint - c_TIME_DEFAULT time.Time -) - -var ( - IntType = reflect.TypeOf(c_INT_DEFAULT) - Int8Type = reflect.TypeOf(c_INT8_DEFAULT) - Int16Type = reflect.TypeOf(c_INT16_DEFAULT) - Int32Type = reflect.TypeOf(c_INT32_DEFAULT) - Int64Type = reflect.TypeOf(c_INT64_DEFAULT) - - UintType = reflect.TypeOf(c_UINT_DEFAULT) - Uint8Type = reflect.TypeOf(c_UINT8_DEFAULT) - Uint16Type = reflect.TypeOf(c_UINT16_DEFAULT) - Uint32Type = reflect.TypeOf(c_UINT32_DEFAULT) - Uint64Type = reflect.TypeOf(c_UINT64_DEFAULT) - - Float32Type = reflect.TypeOf(c_FLOAT32_DEFAULT) - Float64Type = reflect.TypeOf(c_FLOAT64_DEFAULT) - - Complex64Type = reflect.TypeOf(c_COMPLEX64_DEFAULT) - Complex128Type = reflect.TypeOf(c_COMPLEX128_DEFAULT) - - StringType = reflect.TypeOf(c_EMPTY_STRING) - BoolType = reflect.TypeOf(c_BOOL_DEFAULT) - ByteType = reflect.TypeOf(c_BYTE_DEFAULT) - BytesType = reflect.SliceOf(ByteType) - - TimeType = reflect.TypeOf(c_TIME_DEFAULT) -) - -var ( - PtrIntType = reflect.PtrTo(IntType) - PtrInt8Type = reflect.PtrTo(Int8Type) - PtrInt16Type = reflect.PtrTo(Int16Type) - PtrInt32Type = reflect.PtrTo(Int32Type) - PtrInt64Type = reflect.PtrTo(Int64Type) - - PtrUintType = reflect.PtrTo(UintType) - PtrUint8Type = reflect.PtrTo(Uint8Type) - PtrUint16Type = reflect.PtrTo(Uint16Type) - PtrUint32Type = reflect.PtrTo(Uint32Type) - PtrUint64Type = reflect.PtrTo(Uint64Type) - - PtrFloat32Type = reflect.PtrTo(Float32Type) - PtrFloat64Type = reflect.PtrTo(Float64Type) - - PtrComplex64Type = reflect.PtrTo(Complex64Type) - PtrComplex128Type = reflect.PtrTo(Complex128Type) - - PtrStringType = reflect.PtrTo(StringType) - PtrBoolType = reflect.PtrTo(BoolType) - PtrByteType = reflect.PtrTo(ByteType) - - PtrTimeType = reflect.PtrTo(TimeType) -) - -// Type2SQLType generate SQLType acorrding Go's type -func Type2SQLType(t reflect.Type) (st SQLType) { - switch k := t.Kind(); k { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32: - st = SQLType{Int, 0, 0} - case reflect.Int64, reflect.Uint64: - st = SQLType{BigInt, 0, 0} - case reflect.Float32: - st = SQLType{Float, 0, 0} - case reflect.Float64: - st = SQLType{Double, 0, 0} - case reflect.Complex64, reflect.Complex128: - st = SQLType{Varchar, 64, 0} - case reflect.Array, reflect.Slice, reflect.Map: - if t.Elem() == reflect.TypeOf(c_BYTE_DEFAULT) { - st = SQLType{Blob, 0, 0} - } else { - st = SQLType{Text, 0, 0} - } - case reflect.Bool: - st = SQLType{Bool, 0, 0} - case reflect.String: - st = SQLType{Varchar, 255, 0} - case reflect.Struct: - if t.ConvertibleTo(TimeType) { - st = SQLType{DateTime, 0, 0} - } else { - // TODO need to handle association struct - st = SQLType{Text, 0, 0} - } - case reflect.Ptr: - st = Type2SQLType(t.Elem()) - default: - st = SQLType{Text, 0, 0} - } - return -} - -// default sql type change to go types -func SQLType2Type(st SQLType) reflect.Type { - name := strings.ToUpper(st.Name) - switch name { - case Bit, TinyInt, SmallInt, MediumInt, Int, Integer, Serial: - return reflect.TypeOf(1) - case BigInt, BigSerial: - return reflect.TypeOf(int64(1)) - case Float, Real: - return reflect.TypeOf(float32(1)) - case Double: - return reflect.TypeOf(float64(1)) - case Char, Varchar, NVarchar, TinyText, Text, MediumText, LongText, Enum, Set, Uuid, Clob: - return reflect.TypeOf("") - case TinyBlob, Blob, LongBlob, Bytea, Binary, MediumBlob, VarBinary: - return reflect.TypeOf([]byte{}) - case Bool: - return reflect.TypeOf(true) - case DateTime, Date, Time, TimeStamp, TimeStampz: - return reflect.TypeOf(c_TIME_DEFAULT) - case Decimal, Numeric: - return reflect.TypeOf("") - default: - return reflect.TypeOf("") - } -} diff --git a/vendor/github.com/go-xorm/xorm/CONTRIBUTING.md b/vendor/github.com/go-xorm/xorm/CONTRIBUTING.md deleted file mode 100644 index e0f6cfcdf..000000000 --- a/vendor/github.com/go-xorm/xorm/CONTRIBUTING.md +++ /dev/null @@ -1,49 +0,0 @@ -## Contributing to xorm - -`xorm` has a backlog of [pull requests](https://help.github.com/articles/using-pull-requests), but contributions are still very -much welcome. You can help with patch review, submitting bug reports, -or adding new functionality. There is no formal style guide, but -please conform to the style of existing code and general Go formatting -conventions when submitting patches. - -* [fork a repo](https://help.github.com/articles/fork-a-repo) -* [creating a pull request ](https://help.github.com/articles/creating-a-pull-request) - -### Language - -Since `xorm` is a world-wide open source project, please describe your issues or code changes in English as soon as possible. - -### Sign your codes with comments -``` -// !! your comments - -e.g., - -// !lunny! this is comments made by lunny -``` - -### Patch review - -Help review existing open [pull requests](https://help.github.com/articles/using-pull-requests) by commenting on the code or -proposed functionality. - -### Bug reports - -We appreciate any bug reports, but especially ones with self-contained -(doesn't depend on code outside of xorm), minimal (can't be simplified -further) test cases. It's especially helpful if you can submit a pull -request with just the failing test case (you'll probably want to -pattern it after the tests in -[base.go](https://github.com/go-xorm/tests/blob/master/base.go) AND -[benchmark.go](https://github.com/go-xorm/tests/blob/master/benchmark.go). - -If you implements a new database interface, you maybe need to add a _test.go file. -For example, [mysql_test.go](https://github.com/go-xorm/tests/blob/master/mysql/mysql_test.go) - -### New functionality - -There are a number of pending patches for new functionality, so -additional feature patches will take a while to merge. Still, patches -are generally reviewed based on usefulness and complexity in addition -to time-in-queue, so if you have a knockout idea, take a shot. Feel -free to open an issue discussion your proposed patch beforehand. diff --git a/vendor/github.com/go-xorm/xorm/LICENSE b/vendor/github.com/go-xorm/xorm/LICENSE deleted file mode 100644 index 84d2ae538..000000000 --- a/vendor/github.com/go-xorm/xorm/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2013 - 2015 The Xorm Authors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* 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. - -* Neither the name of the {organization} 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 COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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. diff --git a/vendor/github.com/go-xorm/xorm/README.md b/vendor/github.com/go-xorm/xorm/README.md deleted file mode 100644 index 12f6ca90b..000000000 --- a/vendor/github.com/go-xorm/xorm/README.md +++ /dev/null @@ -1,287 +0,0 @@ -[中文](https://github.com/go-xorm/xorm/blob/master/README_CN.md) - -Xorm is a simple and powerful ORM for Go. - -[![CircleCI](https://circleci.com/gh/go-xorm/xorm/tree/master.svg?style=svg)](https://circleci.com/gh/go-xorm/xorm/tree/master) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/go-xorm/xorm?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) - -# Notice - -The last master version is not backwards compatible. You should use `engine.ShowSQL()` and `engine.Logger().SetLevel()` instead of `engine.ShowSQL = `, `engine.ShowInfo = ` and so on. - -# Features - -* Struct <-> Table Mapping Support - -* Chainable APIs - -* Transaction Support - -* Both ORM and raw SQL operation Support - -* Sync database schema Support - -* Query Cache speed up - -* Database Reverse support, See [Xorm Tool README](https://github.com/go-xorm/cmd/blob/master/README.md) - -* Simple cascade loading support - -* Optimistic Locking support - -* SQL Builder support via [github.com/go-xorm/builder](https://github.com/go-xorm/builder) - -# Drivers Support - -Drivers for Go's sql package which currently support database/sql includes: - -* Mysql: [github.com/go-sql-driver/mysql](https://github.com/go-sql-driver/mysql) - -* MyMysql: [github.com/ziutek/mymysql/godrv](https://github.com/ziutek/mymysql/godrv) - -* Postgres: [github.com/lib/pq](https://github.com/lib/pq) - -* Tidb: [github.com/pingcap/tidb](https://github.com/pingcap/tidb) - -* SQLite: [github.com/mattn/go-sqlite3](https://github.com/mattn/go-sqlite3) - -* MsSql: [github.com/denisenkom/go-mssqldb](https://github.com/denisenkom/go-mssqldb) - -* MsSql: [github.com/lunny/godbc](https://github.com/lunny/godbc) - -* Oracle: [github.com/mattn/go-oci8](https://github.com/mattn/go-oci8) (experiment) - -# Changelog - -* **v0.6.0** - * remove support for ql - * add query condition builder support via [github.com/go-xorm/builder](https://github.com/go-xorm/builder), so `Where`, `And`, `Or` -methods can use `builder.Cond` as parameter - * add Sum, SumInt, SumInt64 and NotIn methods - * some bugs fixed - -* **v0.5.0** - * logging interface changed - * some bugs fixed - -* **v0.4.5** - * many bugs fixed - * extends support unlimited deepth - * Delete Limit support - -* **v0.4.4** - * ql database expriment support - * tidb database expriment support - * sql.NullString and etc. field support - * select ForUpdate support - * many bugs fixed - -[More changes ...](https://github.com/go-xorm/manual-en-US/tree/master/chapter-16) - -# Installation - -If you have [gopm](https://github.com/gpmgo/gopm) installed, - - gopm get github.com/go-xorm/xorm - -Or - - go get github.com/go-xorm/xorm - -# Documents - -* [Manual](http://xorm.io/docs) - -* [GoDoc](http://godoc.org/github.com/go-xorm/xorm) - -* [GoWalker](http://gowalker.org/github.com/go-xorm/xorm) - -# Quick Start - -* Create Engine - -```Go -engine, err := xorm.NewEngine(driverName, dataSourceName) -``` - -* Define a struct and Sync2 table struct to database - -```Go -type User struct { - Id int64 - Name string - Salt string - Age int - Passwd string `xorm:"varchar(200)"` - Created time.Time `xorm:"created"` - Updated time.Time `xorm:"updated"` -} - -err := engine.Sync2(new(User)) -``` - -* Query a SQL string, the returned results is []map[string][]byte - -```Go -results, err := engine.Query("select * from user") -``` - -* Execute a SQL string, the returned results - -```Go -affected, err := engine.Exec("update user set age = ? where name = ?", age, name) -``` - -* Insert one or multiple records to database - -```Go -affected, err := engine.Insert(&user) -// INSERT INTO struct () values () -affected, err := engine.Insert(&user1, &user2) -// INSERT INTO struct1 () values () -// INSERT INTO struct2 () values () -affected, err := engine.Insert(&users) -// INSERT INTO struct () values (),(),() -affected, err := engine.Insert(&user1, &users) -// INSERT INTO struct1 () values () -// INSERT INTO struct2 () values (),(),() -``` - -* Query one record from database - -```Go -has, err := engine.Get(&user) -// SELECT * FROM user LIMIT 1 -has, err := engine.Where("name = ?", name).Desc("id").Get(&user) -// SELECT * FROM user WHERE name = ? ORDER BY id DESC LIMIT 1 -``` - -* Query multiple records from database, also you can use join and extends - -```Go -var users []User -err := engine.Where("name = ?", name).And("age > 10").Limit(10, 0).Find(&users) -// SELECT * FROM user WHERE name = ? AND age > 10 limit 0 offset 10 - -type Detail struct { - Id int64 - UserId int64 `xorm:"index"` -} - -type UserDetail struct { - User `xorm:"extends"` - Detail `xorm:"extends"` -} - -var users []UserDetail -err := engine.Table("user").Select("user.*, detail.*") - Join("INNER", "detail", "detail.user_id = user.id"). - Where("user.name = ?", name).Limit(10, 0). - Find(&users) -// SELECT user.*, detail.* FROM user INNER JOIN detail WHERE user.name = ? limit 0 offset 10 -``` - -* Query multiple records and record by record handle, there are two methods Iterate and Rows - -```Go -err := engine.Iterate(&User{Name:name}, func(idx int, bean interface{}) error { - user := bean.(*User) - return nil -}) -// SELECT * FROM user - -rows, err := engine.Rows(&User{Name:name}) -// SELECT * FROM user -defer rows.Close() -bean := new(Struct) -for rows.Next() { - err = rows.Scan(bean) -} -``` - -* Update one or more records, default will update non-empty and non-zero fields except when you use Cols, AllCols and so on. - -```Go -affected, err := engine.Id(1).Update(&user) -// UPDATE user SET ... Where id = ? - -affected, err := engine.Update(&user, &User{Name:name}) -// UPDATE user SET ... Where name = ? - -var ids = []int64{1, 2, 3} -affected, err := engine.In("id", ids).Update(&user) -// UPDATE user SET ... Where id IN (?, ?, ?) - -// force update indicated columns by Cols -affected, err := engine.Id(1).Cols("age").Update(&User{Name:name, Age: 12}) -// UPDATE user SET age = ?, updated=? Where id = ? - -// force NOT update indicated columns by Omit -affected, err := engine.Id(1).Omit("name").Update(&User{Name:name, Age: 12}) -// UPDATE user SET age = ?, updated=? Where id = ? - -affected, err := engine.Id(1).AllCols().Update(&user) -// UPDATE user SET name=?,age=?,salt=?,passwd=?,updated=? Where id = ? -``` - -* Delete one or more records, Delete MUST have condition - -```Go -affected, err := engine.Where(...).Delete(&user) -// DELETE FROM user Where ... -affected, err := engine.Id(2).Delete(&user) -``` - -* Count records - -```Go -counts, err := engine.Count(&user) -// SELECT count(*) AS total FROM user -``` - -* Query conditions builder - -```Go -err := engine.Where(builder.NotIn("a", 1, 2).And(builder.In("b", "c", "d", "e"))).Find(&users) -// SELECT id, name ... FROM user WHERE a NOT IN (?, ?) AND b IN (?, ?, ?) -``` - -# Cases - -* [github.com/m3ng9i/qreader](https://github.com/m3ng9i/qreader) - -* [Wego](http://github.com/go-tango/wego) - -* [Docker.cn](https://docker.cn/) - -* [Gogs](http://try.gogits.org) - [github.com/gogits/gogs](http://github.com/gogits/gogs) - -* [Gorevel](http://gorevel.cn/) - [github.com/goofcc/gorevel](http://github.com/goofcc/gorevel) - -* [Gowalker](http://gowalker.org) - [github.com/Unknwon/gowalker](http://github.com/Unknwon/gowalker) - -* [Gobuild.io](http://gobuild.io) - [github.com/shxsun/gobuild](http://github.com/shxsun/gobuild) - -* [Sudo China](http://sudochina.com) - [github.com/insionng/toropress](http://github.com/insionng/toropress) - -* [Godaily](http://godaily.org) - [github.com/govc/godaily](http://github.com/govc/godaily) - -* [YouGam](http://www.yougam.com/) - -* [GoCMS - github.com/zzboy/GoCMS](https://github.com/zzdboy/GoCMS) - -* [GoBBS - gobbs.domolo.com](http://gobbs.domolo.com/) - -* [go-blog](http://wangcheng.me) - [github.com/easykoo/go-blog](https://github.com/easykoo/go-blog) - -# Discuss - -Please visit [Xorm on Google Groups](https://groups.google.com/forum/#!forum/xorm) - -# Contributing - -If you want to pull request, please see [CONTRIBUTING](https://github.com/go-xorm/xorm/blob/master/CONTRIBUTING.md) - -# LICENSE - - BSD License - [http://creativecommons.org/licenses/BSD/](http://creativecommons.org/licenses/BSD/) diff --git a/vendor/github.com/go-xorm/xorm/README_CN.md b/vendor/github.com/go-xorm/xorm/README_CN.md deleted file mode 100644 index 3919b3ed8..000000000 --- a/vendor/github.com/go-xorm/xorm/README_CN.md +++ /dev/null @@ -1,286 +0,0 @@ -# xorm - -[English](https://github.com/go-xorm/xorm/blob/master/README.md) - -xorm是一个简单而强大的Go语言ORM库. 通过它可以使数据库操作非常简便。 - -[![CircleCI](https://circleci.com/gh/go-xorm/xorm/tree/master.svg?style=svg)](https://circleci.com/gh/go-xorm/xorm/tree/master) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/go-xorm/xorm?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) - -# 注意 - -最新的版本有不兼容的更新,您必须使用 `engine.ShowSQL()` 和 `engine.Logger().SetLevel()` 来替代 `engine.ShowSQL = `, `engine.ShowInfo = ` 等等。 - -## 特性 - -* 支持Struct和数据库表之间的灵活映射,并支持自动同步 - -* 事务支持 - -* 同时支持原始SQL语句和ORM操作的混合执行 - -* 使用连写来简化调用 - -* 支持使用Id, In, Where, Limit, Join, Having, Table, Sql, Cols等函数和结构体等方式作为条件 - -* 支持级联加载Struct - -* 支持缓存 - -* 支持根据数据库自动生成xorm的结构体 - -* 支持记录版本(即乐观锁) - -* 内置SQL Builder支持 - -## 驱动支持 - -目前支持的Go数据库驱动和对应的数据库如下: - -* Mysql: [github.com/go-sql-driver/mysql](https://github.com/go-sql-driver/mysql) - -* MyMysql: [github.com/ziutek/mymysql/godrv](https://github.com/ziutek/mymysql/godrv) - -* Postgres: [github.com/lib/pq](https://github.com/lib/pq) - -* Tidb: [github.com/pingcap/tidb](https://github.com/pingcap/tidb) - -* SQLite: [github.com/mattn/go-sqlite3](https://github.com/mattn/go-sqlite3) - -* MsSql: [github.com/denisenkom/go-mssqldb](https://github.com/denisenkom/go-mssqldb) - -* MsSql: [github.com/lunny/godbc](https://github.com/lunny/godbc) - -* Oracle: [github.com/mattn/go-oci8](https://github.com/mattn/go-oci8) (试验性支持) - -## 更新日志 - -* **v0.6.0** - * 去除对 ql 的支持 - * 新增条件查询分析器 [github.com/go-xorm/builder](https://github.com/go-xorm/builder), 从因此 `Where, And, Or` 函数 -将可以用 `builder.Cond` 作为条件组合 - * 新增 Sum, SumInt, SumInt64 和 NotIn 函数 - * Bug修正 - -* **v0.5.0** - * logging接口进行不兼容改变 - * Bug修正 - -* **v0.4.5** - * bug修正 - * extends 支持无限级 - * Delete Limit 支持 - -* **v0.4.4** - * Tidb 数据库支持 - * QL 试验性支持 - * sql.NullString支持 - * ForUpdate 支持 - * bug修正 - -[更多更新日志...](https://github.com/go-xorm/manual-zh-CN/tree/master/chapter-16) - -## 安装 - -推荐使用 [gopm](https://github.com/gpmgo/gopm) 进行安装: - - gopm get github.com/go-xorm/xorm - -或者您也可以使用go工具进行安装: - - go get github.com/go-xorm/xorm - -## 文档 - -* [操作指南](http://xorm.io/docs) - -* [GoWalker代码文档](http://gowalker.org/github.com/go-xorm/xorm) - -* [Godoc代码文档](http://godoc.org/github.com/go-xorm/xorm) - -# 快速开始 - -* 第一步创建引擎,driverName, dataSourceName和database/sql接口相同 - -```Go -engine, err := xorm.NewEngine(driverName, dataSourceName) -``` - -* 定义一个和表同步的结构体,并且自动同步结构体到数据库 - -```Go -type User struct { - Id int64 - Name string - Salt string - Age int - Passwd string `xorm:"varchar(200)"` - Created time.Time `xorm:"created"` - Updated time.Time `xorm:"updated"` -} - -err := engine.Sync2(new(User)) -``` - -* 最原始的也支持SQL语句查询,返回的结果类型为 []map[string][]byte - -```Go -results, err := engine.Query("select * from user") -``` - -* 执行一个SQL语句 - -```Go -affected, err := engine.Exec("update user set age = ? where name = ?", age, name) -``` - -* 插入一条或者多条记录 - -```Go -affected, err := engine.Insert(&user) -// INSERT INTO struct () values () -affected, err := engine.Insert(&user1, &user2) -// INSERT INTO struct1 () values () -// INSERT INTO struct2 () values () -affected, err := engine.Insert(&users) -// INSERT INTO struct () values (),(),() -affected, err := engine.Insert(&user1, &users) -// INSERT INTO struct1 () values () -// INSERT INTO struct2 () values (),(),() -``` - -* 查询单条记录 - -```Go -has, err := engine.Get(&user) -// SELECT * FROM user LIMIT 1 -has, err := engine.Where("name = ?", name).Desc("id").Get(&user) -// SELECT * FROM user WHERE name = ? ORDER BY id DESC LIMIT 1 -``` - -* 查询多条记录,当然可以使用Join和extends来组合使用 - -```Go -var users []User -err := engine.Where("name = ?", name).And("age > 10").Limit(10, 0).Find(&users) -// SELECT * FROM user WHERE name = ? AND age > 10 limit 0 offset 10 - -type Detail struct { - Id int64 - UserId int64 `xorm:"index"` -} - -type UserDetail struct { - User `xorm:"extends"` - Detail `xorm:"extends"` -} - -var users []UserDetail -err := engine.Table("user").Select("user.*, detail.*") - Join("INNER", "detail", "detail.user_id = user.id"). - Where("user.name = ?", name).Limit(10, 0). - Find(&users) -// SELECT user.*, detail.* FROM user INNER JOIN detail WHERE user.name = ? limit 0 offset 10 -``` - -* 根据条件遍历数据库,可以有两种方式: Iterate and Rows - -```Go -err := engine.Iterate(&User{Name:name}, func(idx int, bean interface{}) error { - user := bean.(*User) - return nil -}) -// SELECT * FROM user - -rows, err := engine.Rows(&User{Name:name}) -// SELECT * FROM user -defer rows.Close() -bean := new(Struct) -for rows.Next() { - err = rows.Scan(bean) -} -``` - -* 更新数据,除非使用Cols,AllCols函数指明,默认只更新非空和非0的字段 - -```Go -affected, err := engine.Id(1).Update(&user) -// UPDATE user SET ... Where id = ? - -affected, err := engine.Update(&user, &User{Name:name}) -// UPDATE user SET ... Where name = ? - -var ids = []int64{1, 2, 3} -affected, err := engine.In(ids).Update(&user) -// UPDATE user SET ... Where id IN (?, ?, ?) - -// force update indicated columns by Cols -affected, err := engine.Id(1).Cols("age").Update(&User{Name:name, Age: 12}) -// UPDATE user SET age = ?, updated=? Where id = ? - -// force NOT update indicated columns by Omit -affected, err := engine.Id(1).Omit("name").Update(&User{Name:name, Age: 12}) -// UPDATE user SET age = ?, updated=? Where id = ? - -affected, err := engine.Id(1).AllCols().Update(&user) -// UPDATE user SET name=?,age=?,salt=?,passwd=?,updated=? Where id = ? -``` - -* 删除记录,需要注意,删除必须至少有一个条件,否则会报错。要清空数据库可以用EmptyTable - -```Go -affected, err := engine.Where(...).Delete(&user) -// DELETE FROM user Where ... -``` - -* 获取记录条数 - -```Go -counts, err := engine.Count(&user) -// SELECT count(*) AS total FROM user -``` - -* 条件编辑器 - -```Go -err := engine.Where(builder.NotIn("a", 1, 2).And(builder.In("b", "c", "d", "e"))).Find(&users) -// SELECT id, name ... FROM user WHERE a NOT IN (?, ?) AND b IN (?, ?, ?) -``` - -# 案例 - -* [github.com/m3ng9i/qreader](https://github.com/m3ng9i/qreader) - -* [Wego](http://github.com/go-tango/wego) - -* [Docker.cn](https://docker.cn/) - -* [Gogs](http://try.gogits.org) - [github.com/gogits/gogs](http://github.com/gogits/gogs) - -* [Gowalker](http://gowalker.org) - [github.com/Unknwon/gowalker](http://github.com/Unknwon/gowalker) - -* [Gobuild.io](http://gobuild.io) - [github.com/shxsun/gobuild](http://github.com/shxsun/gobuild) - -* [Sudo China](http://sudochina.com) - [github.com/insionng/toropress](http://github.com/insionng/toropress) - -* [Godaily](http://godaily.org) - [github.com/govc/godaily](http://github.com/govc/godaily) - -* [YouGam](http://www.yougam.com/) - -* [GoCMS - github.com/zzboy/GoCMS](https://github.com/zzdboy/GoCMS) - -* [GoBBS - gobbs.domolo.com](http://gobbs.domolo.com/) - -* [go-blog](http://wangcheng.me) - [github.com/easykoo/go-blog](https://github.com/easykoo/go-blog) - -## 讨论 - -请加入QQ群:280360085 进行讨论。 - -## 贡献 - -如果您也想为Xorm贡献您的力量,请查看 [CONTRIBUTING](https://github.com/go-xorm/xorm/blob/master/CONTRIBUTING.md) - -## LICENSE - -BSD License -[http://creativecommons.org/licenses/BSD/](http://creativecommons.org/licenses/BSD/) diff --git a/vendor/github.com/go-xorm/xorm/VERSION b/vendor/github.com/go-xorm/xorm/VERSION deleted file mode 100644 index 22c1aa4d0..000000000 --- a/vendor/github.com/go-xorm/xorm/VERSION +++ /dev/null @@ -1 +0,0 @@ -xorm v0.6.0.1022 \ No newline at end of file diff --git a/vendor/github.com/go-xorm/xorm/circle.yml b/vendor/github.com/go-xorm/xorm/circle.yml deleted file mode 100644 index 8faa627d1..000000000 --- a/vendor/github.com/go-xorm/xorm/circle.yml +++ /dev/null @@ -1,25 +0,0 @@ -dependencies: - override: - # './...' is a relative pattern which means all subdirectories - - go get -t -d -v ./... - - go get -t -d -v github.com/go-xorm/tests - - go build -v - -database: - override: - - mysql -u root -e "CREATE DATABASE xorm_test DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci" - - mysql -u root -e "CREATE DATABASE xorm_test1 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci" - - mysql -u root -e "CREATE DATABASE xorm_test2 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci" - - mysql -u root -e "CREATE DATABASE xorm_test3 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci" - - createdb -p 5432 -e -U postgres xorm_test - - createdb -p 5432 -e -U postgres xorm_test1 - - createdb -p 5432 -e -U postgres xorm_test2 - - createdb -p 5432 -e -U postgres xorm_test3 - -test: - override: - # './...' is a relative pattern which means all subdirectories - - go test -v -race - - cd /home/ubuntu/.go_workspace/src/github.com/go-xorm/tests && ./sqlite3.sh - - cd /home/ubuntu/.go_workspace/src/github.com/go-xorm/tests && ./mysql.sh - - cd /home/ubuntu/.go_workspace/src/github.com/go-xorm/tests && ./postgres.sh \ No newline at end of file diff --git a/vendor/github.com/go-xorm/xorm/convert.go b/vendor/github.com/go-xorm/xorm/convert.go deleted file mode 100644 index 87f0d3f1e..000000000 --- a/vendor/github.com/go-xorm/xorm/convert.go +++ /dev/null @@ -1,249 +0,0 @@ -// Copyright 2017 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xorm - -import ( - "database/sql/driver" - "errors" - "fmt" - "reflect" - "strconv" - "time" -) - -var errNilPtr = errors.New("destination pointer is nil") // embedded in descriptive error - -func strconvErr(err error) error { - if ne, ok := err.(*strconv.NumError); ok { - return ne.Err - } - return err -} - -func cloneBytes(b []byte) []byte { - if b == nil { - return nil - } else { - c := make([]byte, len(b)) - copy(c, b) - return c - } -} - -func asString(src interface{}) string { - switch v := src.(type) { - case string: - return v - case []byte: - return string(v) - } - rv := reflect.ValueOf(src) - switch rv.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return strconv.FormatInt(rv.Int(), 10) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - return strconv.FormatUint(rv.Uint(), 10) - case reflect.Float64: - return strconv.FormatFloat(rv.Float(), 'g', -1, 64) - case reflect.Float32: - return strconv.FormatFloat(rv.Float(), 'g', -1, 32) - case reflect.Bool: - return strconv.FormatBool(rv.Bool()) - } - return fmt.Sprintf("%v", src) -} - -func asBytes(buf []byte, rv reflect.Value) (b []byte, ok bool) { - switch rv.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return strconv.AppendInt(buf, rv.Int(), 10), true - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - return strconv.AppendUint(buf, rv.Uint(), 10), true - case reflect.Float32: - return strconv.AppendFloat(buf, rv.Float(), 'g', -1, 32), true - case reflect.Float64: - return strconv.AppendFloat(buf, rv.Float(), 'g', -1, 64), true - case reflect.Bool: - return strconv.AppendBool(buf, rv.Bool()), true - case reflect.String: - s := rv.String() - return append(buf, s...), true - } - return -} - -// convertAssign copies to dest the value in src, converting it if possible. -// An error is returned if the copy would result in loss of information. -// dest should be a pointer type. -func convertAssign(dest, src interface{}) error { - // Common cases, without reflect. - switch s := src.(type) { - case string: - switch d := dest.(type) { - case *string: - if d == nil { - return errNilPtr - } - *d = s - return nil - case *[]byte: - if d == nil { - return errNilPtr - } - *d = []byte(s) - return nil - } - case []byte: - switch d := dest.(type) { - case *string: - if d == nil { - return errNilPtr - } - *d = string(s) - return nil - case *interface{}: - if d == nil { - return errNilPtr - } - *d = cloneBytes(s) - return nil - case *[]byte: - if d == nil { - return errNilPtr - } - *d = cloneBytes(s) - return nil - } - - case time.Time: - switch d := dest.(type) { - case *string: - *d = s.Format(time.RFC3339Nano) - return nil - case *[]byte: - if d == nil { - return errNilPtr - } - *d = []byte(s.Format(time.RFC3339Nano)) - return nil - } - case nil: - switch d := dest.(type) { - case *interface{}: - if d == nil { - return errNilPtr - } - *d = nil - return nil - case *[]byte: - if d == nil { - return errNilPtr - } - *d = nil - return nil - } - } - - var sv reflect.Value - - switch d := dest.(type) { - case *string: - sv = reflect.ValueOf(src) - switch sv.Kind() { - case reflect.Bool, - reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, - reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, - reflect.Float32, reflect.Float64: - *d = asString(src) - return nil - } - case *[]byte: - sv = reflect.ValueOf(src) - if b, ok := asBytes(nil, sv); ok { - *d = b - return nil - } - case *bool: - bv, err := driver.Bool.ConvertValue(src) - if err == nil { - *d = bv.(bool) - } - return err - case *interface{}: - *d = src - return nil - } - - dpv := reflect.ValueOf(dest) - if dpv.Kind() != reflect.Ptr { - return errors.New("destination not a pointer") - } - if dpv.IsNil() { - return errNilPtr - } - - if !sv.IsValid() { - sv = reflect.ValueOf(src) - } - - dv := reflect.Indirect(dpv) - if sv.IsValid() && sv.Type().AssignableTo(dv.Type()) { - switch b := src.(type) { - case []byte: - dv.Set(reflect.ValueOf(cloneBytes(b))) - default: - dv.Set(sv) - } - return nil - } - - if dv.Kind() == sv.Kind() && sv.Type().ConvertibleTo(dv.Type()) { - dv.Set(sv.Convert(dv.Type())) - return nil - } - - switch dv.Kind() { - case reflect.Ptr: - if src == nil { - dv.Set(reflect.Zero(dv.Type())) - return nil - } else { - dv.Set(reflect.New(dv.Type().Elem())) - return convertAssign(dv.Interface(), src) - } - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - s := asString(src) - i64, err := strconv.ParseInt(s, 10, dv.Type().Bits()) - if err != nil { - err = strconvErr(err) - return fmt.Errorf("converting driver.Value type %T (%q) to a %s: %v", src, s, dv.Kind(), err) - } - dv.SetInt(i64) - return nil - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - s := asString(src) - u64, err := strconv.ParseUint(s, 10, dv.Type().Bits()) - if err != nil { - err = strconvErr(err) - return fmt.Errorf("converting driver.Value type %T (%q) to a %s: %v", src, s, dv.Kind(), err) - } - dv.SetUint(u64) - return nil - case reflect.Float32, reflect.Float64: - s := asString(src) - f64, err := strconv.ParseFloat(s, dv.Type().Bits()) - if err != nil { - err = strconvErr(err) - return fmt.Errorf("converting driver.Value type %T (%q) to a %s: %v", src, s, dv.Kind(), err) - } - dv.SetFloat(f64) - return nil - case reflect.String: - dv.SetString(asString(src)) - return nil - } - - return fmt.Errorf("unsupported Scan, storing driver.Value type %T into type %T", src, dest) -} diff --git a/vendor/github.com/go-xorm/xorm/doc.go b/vendor/github.com/go-xorm/xorm/doc.go deleted file mode 100644 index cc71930dd..000000000 --- a/vendor/github.com/go-xorm/xorm/doc.go +++ /dev/null @@ -1,158 +0,0 @@ -// Copyright 2013 - 2016 The XORM Authors. All rights reserved. -// Use of this source code is governed by a BSD -// license that can be found in the LICENSE file. - -/* - -Package xorm is a simple and powerful ORM for Go. - -Installation - -Make sure you have installed Go 1.1+ and then: - - go get github.com/go-xorm/xorm - -Create Engine - -Firstly, we should new an engine for a database - - engine, err := xorm.NewEngine(driverName, dataSourceName) - -Method NewEngine's parameters is the same as sql.Open. It depends -drivers' implementation. -Generally, one engine for an application is enough. You can set it as package variable. - -Raw Methods - -Xorm also support raw sql execution: - -1. query a SQL string, the returned results is []map[string][]byte - - results, err := engine.Query("select * from user") - -2. execute a SQL string, the returned results - - affected, err := engine.Exec("update user set .... where ...") - -ORM Methods - -There are 7 major ORM methods and many helpful methods to use to operate database. - -1. Insert one or multiple records to database - - affected, err := engine.Insert(&struct) - // INSERT INTO struct () values () - affected, err := engine.Insert(&struct1, &struct2) - // INSERT INTO struct1 () values () - // INSERT INTO struct2 () values () - affected, err := engine.Insert(&sliceOfStruct) - // INSERT INTO struct () values (),(),() - affected, err := engine.Insert(&struct1, &sliceOfStruct2) - // INSERT INTO struct1 () values () - // INSERT INTO struct2 () values (),(),() - -2. Query one record from database - - has, err := engine.Get(&user) - // SELECT * FROM user LIMIT 1 - -3. Query multiple records from database - - sliceOfStructs := new(Struct) - err := engine.Find(sliceOfStructs) - // SELECT * FROM user - -4. Query multiple records and record by record handle, there two methods, one is Iterate, -another is Rows - - err := engine.Iterate(...) - // SELECT * FROM user - - rows, err := engine.Rows(...) - // SELECT * FROM user - defer rows.Close() - bean := new(Struct) - for rows.Next() { - err = rows.Scan(bean) - } - -5. Update one or more records - - affected, err := engine.Id(...).Update(&user) - // UPDATE user SET ... - -6. Delete one or more records, Delete MUST has condition - - affected, err := engine.Where(...).Delete(&user) - // DELETE FROM user Where ... - -7. Count records - - counts, err := engine.Count(&user) - // SELECT count(*) AS total FROM user - -Conditions - -The above 7 methods could use with condition methods chainable. -Attention: the above 7 methods should be the last chainable method. - -1. Id, In - - engine.Id(1).Get(&user) // for single primary key - // SELECT * FROM user WHERE id = 1 - engine.Id(core.PK{1, 2}).Get(&user) // for composite primary keys - // SELECT * FROM user WHERE id1 = 1 AND id2 = 2 - engine.In("id", 1, 2, 3).Find(&users) - // SELECT * FROM user WHERE id IN (1, 2, 3) - engine.In("id", []int{1, 2, 3}) - // SELECT * FROM user WHERE id IN (1, 2, 3) - -2. Where, And, Or - - engine.Where().And().Or().Find() - // SELECT * FROM user WHERE (.. AND ..) OR ... - -3. OrderBy, Asc, Desc - - engine.Asc().Desc().Find() - // SELECT * FROM user ORDER BY .. ASC, .. DESC - engine.OrderBy().Find() - // SELECT * FROM user ORDER BY .. - -4. Limit, Top - - engine.Limit().Find() - // SELECT * FROM user LIMIT .. OFFSET .. - engine.Top(5).Find() - // SELECT TOP 5 * FROM user // for mssql - // SELECT * FROM user LIMIT .. OFFSET 0 //for other databases - -5. Sql, let you custom SQL - - var users []User - engine.Sql("select * from user").Find(&users) - -6. Cols, Omit, Distinct - - var users []*User - engine.Cols("col1, col2").Find(&users) - // SELECT col1, col2 FROM user - engine.Cols("col1", "col2").Where().Update(user) - // UPDATE user set col1 = ?, col2 = ? Where ... - engine.Omit("col1").Find(&users) - // SELECT col2, col3 FROM user - engine.Omit("col1").Insert(&user) - // INSERT INTO table (non-col1) VALUES () - engine.Distinct("col1").Find(&users) - // SELECT DISTINCT col1 FROM user - -7. Join, GroupBy, Having - - engine.GroupBy("name").Having("name='xlw'").Find(&users) - //SELECT * FROM user GROUP BY name HAVING name='xlw' - engine.Join("LEFT", "userdetail", "user.id=userdetail.id").Find(&users) - //SELECT * FROM user LEFT JOIN userdetail ON user.id=userdetail.id - -More usage, please visit http://xorm.io/docs -*/ -package xorm diff --git a/vendor/github.com/go-xorm/xorm/engine.go b/vendor/github.com/go-xorm/xorm/engine.go deleted file mode 100644 index a868d1a22..000000000 --- a/vendor/github.com/go-xorm/xorm/engine.go +++ /dev/null @@ -1,1651 +0,0 @@ -// Copyright 2015 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xorm - -import ( - "bufio" - "bytes" - "database/sql" - "encoding/gob" - "errors" - "fmt" - "io" - "os" - "reflect" - "strconv" - "strings" - "sync" - "time" - - "github.com/go-xorm/core" -) - -// Engine is the major struct of xorm, it means a database manager. -// Commonly, an application only need one engine -type Engine struct { - db *core.DB - dialect core.Dialect - - ColumnMapper core.IMapper - TableMapper core.IMapper - TagIdentifier string - Tables map[reflect.Type]*core.Table - - mutex *sync.RWMutex - Cacher core.Cacher - - showSQL bool - showExecTime bool - - logger core.ILogger - TZLocation *time.Location - DatabaseTZ *time.Location // The timezone of the database - - disableGlobalCache bool -} - -// ShowSQL show SQL statement or not on logger if log level is great than INFO -func (engine *Engine) ShowSQL(show ...bool) { - engine.logger.ShowSQL(show...) - if len(show) == 0 { - engine.showSQL = true - } else { - engine.showSQL = show[0] - } -} - -// ShowExecTime show SQL statement and execute time or not on logger if log level is great than INFO -func (engine *Engine) ShowExecTime(show ...bool) { - if len(show) == 0 { - engine.showExecTime = true - } else { - engine.showExecTime = show[0] - } -} - -// Logger return the logger interface -func (engine *Engine) Logger() core.ILogger { - return engine.logger -} - -// SetLogger set the new logger -func (engine *Engine) SetLogger(logger core.ILogger) { - engine.logger = logger - engine.dialect.SetLogger(logger) -} - -// SetDisableGlobalCache disable global cache or not -func (engine *Engine) SetDisableGlobalCache(disable bool) { - if engine.disableGlobalCache != disable { - engine.disableGlobalCache = disable - } -} - -// DriverName return the current sql driver's name -func (engine *Engine) DriverName() string { - return engine.dialect.DriverName() -} - -// DataSourceName return the current connection string -func (engine *Engine) DataSourceName() string { - return engine.dialect.DataSourceName() -} - -// SetMapper set the name mapping rules -func (engine *Engine) SetMapper(mapper core.IMapper) { - engine.SetTableMapper(mapper) - engine.SetColumnMapper(mapper) -} - -// SetTableMapper set the table name mapping rule -func (engine *Engine) SetTableMapper(mapper core.IMapper) { - engine.TableMapper = mapper -} - -// SetColumnMapper set the column name mapping rule -func (engine *Engine) SetColumnMapper(mapper core.IMapper) { - engine.ColumnMapper = mapper -} - -// SupportInsertMany If engine's database support batch insert records like -// "insert into user values (name, age), (name, age)". -// When the return is ture, then engine.Insert(&users) will -// generate batch sql and exeute. -func (engine *Engine) SupportInsertMany() bool { - return engine.dialect.SupportInsertMany() -} - -// QuoteStr Engine's database use which character as quote. -// mysql, sqlite use ` and postgres use " -func (engine *Engine) QuoteStr() string { - return engine.dialect.QuoteStr() -} - -// Quote Use QuoteStr quote the string sql -func (engine *Engine) Quote(value string) string { - value = strings.TrimSpace(value) - if len(value) == 0 { - return value - } - - if string(value[0]) == engine.dialect.QuoteStr() || value[0] == '`' { - return value - } - - value = strings.Replace(value, ".", engine.dialect.QuoteStr()+"."+engine.dialect.QuoteStr(), -1) - - return engine.dialect.QuoteStr() + value + engine.dialect.QuoteStr() -} - -// QuoteTo quotes string and writes into the buffer -func (engine *Engine) QuoteTo(buf *bytes.Buffer, value string) { - - if buf == nil { - return - } - - value = strings.TrimSpace(value) - if value == "" { - return - } - - if string(value[0]) == engine.dialect.QuoteStr() || value[0] == '`' { - buf.WriteString(value) - return - } - - value = strings.Replace(value, ".", engine.dialect.QuoteStr()+"."+engine.dialect.QuoteStr(), -1) - - buf.WriteString(engine.dialect.QuoteStr()) - buf.WriteString(value) - buf.WriteString(engine.dialect.QuoteStr()) -} - -func (engine *Engine) quote(sql string) string { - return engine.dialect.QuoteStr() + sql + engine.dialect.QuoteStr() -} - -// SqlType will be depracated, please use SQLType instead -// -// Deprecated: use SQLType instead -func (engine *Engine) SqlType(c *core.Column) string { - return engine.SQLType(c) -} - -// SQLType A simple wrapper to dialect's core.SqlType method -func (engine *Engine) SQLType(c *core.Column) string { - return engine.dialect.SqlType(c) -} - -// AutoIncrStr Database's autoincrement statement -func (engine *Engine) AutoIncrStr() string { - return engine.dialect.AutoIncrStr() -} - -// SetMaxOpenConns is only available for go 1.2+ -func (engine *Engine) SetMaxOpenConns(conns int) { - engine.db.SetMaxOpenConns(conns) -} - -// SetMaxIdleConns set the max idle connections on pool, default is 2 -func (engine *Engine) SetMaxIdleConns(conns int) { - engine.db.SetMaxIdleConns(conns) -} - -// SetDefaultCacher set the default cacher. Xorm's default not enable cacher. -func (engine *Engine) SetDefaultCacher(cacher core.Cacher) { - engine.Cacher = cacher -} - -// NoCache If you has set default cacher, and you want temporilly stop use cache, -// you can use NoCache() -func (engine *Engine) NoCache() *Session { - session := engine.NewSession() - session.IsAutoClose = true - return session.NoCache() -} - -// NoCascade If you do not want to auto cascade load object -func (engine *Engine) NoCascade() *Session { - session := engine.NewSession() - session.IsAutoClose = true - return session.NoCascade() -} - -// MapCacher Set a table use a special cacher -func (engine *Engine) MapCacher(bean interface{}, cacher core.Cacher) { - v := rValue(bean) - tb := engine.autoMapType(v) - tb.Cacher = cacher -} - -// NewDB provides an interface to operate database directly -func (engine *Engine) NewDB() (*core.DB, error) { - return core.OpenDialect(engine.dialect) -} - -// DB return the wrapper of sql.DB -func (engine *Engine) DB() *core.DB { - return engine.db -} - -// Dialect return database dialect -func (engine *Engine) Dialect() core.Dialect { - return engine.dialect -} - -// NewSession New a session -func (engine *Engine) NewSession() *Session { - session := &Session{Engine: engine} - session.Init() - return session -} - -// Close the engine -func (engine *Engine) Close() error { - return engine.db.Close() -} - -// Ping tests if database is alive -func (engine *Engine) Ping() error { - session := engine.NewSession() - defer session.Close() - if engine.showSQL { - engine.logger.Infof("PING DATABASE %v", engine.DriverName()) - } - return session.Ping() -} - -// logging sql -func (engine *Engine) logSQL(sqlStr string, sqlArgs ...interface{}) { - if engine.showSQL && !engine.showExecTime { - if len(sqlArgs) > 0 { - engine.logger.Infof("[sql] %v [args] %v", sqlStr, sqlArgs) - } else { - engine.logger.Infof("[sql] %v", sqlStr) - } - } -} - -func (engine *Engine) logSQLQueryTime(sqlStr string, args []interface{}, executionBlock func() (*core.Stmt, *core.Rows, error)) (*core.Stmt, *core.Rows, error) { - if engine.showSQL && engine.showExecTime { - b4ExecTime := time.Now() - stmt, res, err := executionBlock() - execDuration := time.Since(b4ExecTime) - if len(args) > 0 { - engine.logger.Infof("[sql] %s [args] %v - took: %v", sqlStr, args, execDuration) - } else { - engine.logger.Infof("[sql] %s - took: %v", sqlStr, execDuration) - } - return stmt, res, err - } - return executionBlock() -} - -func (engine *Engine) logSQLExecutionTime(sqlStr string, args []interface{}, executionBlock func() (sql.Result, error)) (sql.Result, error) { - if engine.showSQL && engine.showExecTime { - b4ExecTime := time.Now() - res, err := executionBlock() - execDuration := time.Since(b4ExecTime) - if len(args) > 0 { - engine.logger.Infof("[sql] %s [args] %v - took: %v", sqlStr, args, execDuration) - } else { - engine.logger.Infof("[sql] %s - took: %v", sqlStr, execDuration) - } - return res, err - } - return executionBlock() -} - -// Sql provides raw sql input parameter. When you have a complex SQL statement -// and cannot use Where, Id, In and etc. Methods to describe, you can use SQL. -// -// Deprecated: use SQL instead. -func (engine *Engine) Sql(querystring string, args ...interface{}) *Session { - return engine.SQL(querystring, args...) -} - -// SQL method let's you manually write raw SQL and operate -// For example: -// -// engine.SQL("select * from user").Find(&users) -// -// This code will execute "select * from user" and set the records to users -func (engine *Engine) SQL(query interface{}, args ...interface{}) *Session { - session := engine.NewSession() - session.IsAutoClose = true - return session.SQL(query, args...) -} - -// NoAutoTime Default if your struct has "created" or "updated" filed tag, the fields -// will automatically be filled with current time when Insert or Update -// invoked. Call NoAutoTime if you dont' want to fill automatically. -func (engine *Engine) NoAutoTime() *Session { - session := engine.NewSession() - session.IsAutoClose = true - return session.NoAutoTime() -} - -// NoAutoCondition disable auto generate Where condition from bean or not -func (engine *Engine) NoAutoCondition(no ...bool) *Session { - session := engine.NewSession() - session.IsAutoClose = true - return session.NoAutoCondition(no...) -} - -// DBMetas Retrieve all tables, columns, indexes' informations from database. -func (engine *Engine) DBMetas() ([]*core.Table, error) { - tables, err := engine.dialect.GetTables() - if err != nil { - return nil, err - } - - for _, table := range tables { - colSeq, cols, err := engine.dialect.GetColumns(table.Name) - if err != nil { - return nil, err - } - for _, name := range colSeq { - table.AddColumn(cols[name]) - } - indexes, err := engine.dialect.GetIndexes(table.Name) - if err != nil { - return nil, err - } - table.Indexes = indexes - - for _, index := range indexes { - for _, name := range index.Cols { - if col := table.GetColumn(name); col != nil { - col.Indexes[index.Name] = index.Type - } else { - return nil, fmt.Errorf("Unknown col %s in index %v of table %v, columns %v", name, index.Name, table.Name, table.ColumnsSeq()) - } - } - } - } - return tables, nil -} - -// DumpAllToFile dump database all table structs and data to a file -func (engine *Engine) DumpAllToFile(fp string, tp ...core.DbType) error { - f, err := os.Create(fp) - if err != nil { - return err - } - defer f.Close() - return engine.DumpAll(f, tp...) -} - -// DumpAll dump database all table structs and data to w -func (engine *Engine) DumpAll(w io.Writer, tp ...core.DbType) error { - tables, err := engine.DBMetas() - if err != nil { - return err - } - return engine.DumpTables(tables, w, tp...) -} - -// DumpTablesToFile dump specified tables to SQL file. -func (engine *Engine) DumpTablesToFile(tables []*core.Table, fp string, tp ...core.DbType) error { - f, err := os.Create(fp) - if err != nil { - return err - } - defer f.Close() - return engine.DumpTables(tables, f, tp...) -} - -// DumpTables dump specify tables to io.Writer -func (engine *Engine) DumpTables(tables []*core.Table, w io.Writer, tp ...core.DbType) error { - return engine.dumpTables(tables, w, tp...) -} - -// dumpTables dump database all table structs and data to w with specify db type -func (engine *Engine) dumpTables(tables []*core.Table, w io.Writer, tp ...core.DbType) error { - var dialect core.Dialect - var distDBName string - if len(tp) == 0 { - dialect = engine.dialect - distDBName = string(engine.dialect.DBType()) - } else { - dialect = core.QueryDialect(tp[0]) - if dialect == nil { - return errors.New("Unsupported database type") - } - dialect.Init(nil, engine.dialect.URI(), "", "") - distDBName = string(tp[0]) - } - - _, err := io.WriteString(w, fmt.Sprintf("/*Generated by xorm v%s %s, from %s to %s*/\n\n", - Version, time.Now().In(engine.TZLocation).Format("2006-01-02 15:04:05"), engine.dialect.DBType(), strings.ToUpper(distDBName))) - if err != nil { - return err - } - - for i, table := range tables { - if i > 0 { - _, err = io.WriteString(w, "\n") - if err != nil { - return err - } - } - _, err = io.WriteString(w, dialect.CreateTableSql(table, "", table.StoreEngine, "")+";\n") - if err != nil { - return err - } - for _, index := range table.Indexes { - _, err = io.WriteString(w, dialect.CreateIndexSql(table.Name, index)+";\n") - if err != nil { - return err - } - } - - cols := table.ColumnsSeq() - colNames := dialect.Quote(strings.Join(cols, dialect.Quote(", "))) - - rows, err := engine.DB().Query("SELECT " + colNames + " FROM " + engine.Quote(table.Name)) - if err != nil { - return err - } - defer rows.Close() - - for rows.Next() { - dest := make([]interface{}, len(cols)) - err = rows.ScanSlice(&dest) - if err != nil { - return err - } - - _, err = io.WriteString(w, "INSERT INTO "+dialect.Quote(table.Name)+" ("+colNames+") VALUES (") - if err != nil { - return err - } - - var temp string - for i, d := range dest { - col := table.GetColumn(cols[i]) - if col == nil { - return errors.New("unknow column error") - } - - if d == nil { - temp += ", NULL" - } else if col.SQLType.IsText() || col.SQLType.IsTime() { - var v = fmt.Sprintf("%s", d) - if strings.HasSuffix(v, " +0000 UTC") { - temp += fmt.Sprintf(", '%s'", v[0:len(v)-len(" +0000 UTC")]) - } else { - temp += ", '" + strings.Replace(v, "'", "''", -1) + "'" - } - } else if col.SQLType.IsBlob() { - if reflect.TypeOf(d).Kind() == reflect.Slice { - temp += fmt.Sprintf(", %s", dialect.FormatBytes(d.([]byte))) - } else if reflect.TypeOf(d).Kind() == reflect.String { - temp += fmt.Sprintf(", '%s'", d.(string)) - } - } else if col.SQLType.IsNumeric() { - switch reflect.TypeOf(d).Kind() { - case reflect.Slice: - temp += fmt.Sprintf(", %s", string(d.([]byte))) - case reflect.Int16, reflect.Int8, reflect.Int32, reflect.Int64, reflect.Int: - if col.SQLType.Name == core.Bool { - temp += fmt.Sprintf(", %v", strconv.FormatBool(reflect.ValueOf(d).Int() > 0)) - } else { - temp += fmt.Sprintf(", %v", d) - } - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - if col.SQLType.Name == core.Bool { - temp += fmt.Sprintf(", %v", strconv.FormatBool(reflect.ValueOf(d).Uint() > 0)) - } else { - temp += fmt.Sprintf(", %v", d) - } - default: - temp += fmt.Sprintf(", %v", d) - } - } else { - s := fmt.Sprintf("%v", d) - if strings.Contains(s, ":") || strings.Contains(s, "-") { - if strings.HasSuffix(s, " +0000 UTC") { - temp += fmt.Sprintf(", '%s'", s[0:len(s)-len(" +0000 UTC")]) - } else { - temp += fmt.Sprintf(", '%s'", s) - } - } else { - temp += fmt.Sprintf(", %s", s) - } - } - } - _, err = io.WriteString(w, temp[2:]+");\n") - if err != nil { - return err - } - } - - // FIXME: Hack for postgres - if string(dialect.DBType()) == core.POSTGRES && table.AutoIncrColumn() != nil { - _, err = io.WriteString(w, "SELECT setval('table_id_seq', COALESCE((SELECT MAX("+table.AutoIncrColumn().Name+") FROM "+dialect.Quote(table.Name)+"), 1), false);\n") - if err != nil { - return err - } - } - } - return nil -} - -func (engine *Engine) tableName(beanOrTableName interface{}) (string, error) { - v := rValue(beanOrTableName) - if v.Type().Kind() == reflect.String { - return beanOrTableName.(string), nil - } else if v.Type().Kind() == reflect.Struct { - return engine.tbName(v), nil - } - return "", errors.New("bean should be a struct or struct's point") -} - -func (engine *Engine) tbName(v reflect.Value) string { - if tb, ok := v.Interface().(TableName); ok { - return tb.TableName() - } - - if v.Type().Kind() == reflect.Ptr { - if tb, ok := reflect.Indirect(v).Interface().(TableName); ok { - return tb.TableName() - } - } else if v.CanAddr() { - if tb, ok := v.Addr().Interface().(TableName); ok { - return tb.TableName() - } - } - return engine.TableMapper.Obj2Table(reflect.Indirect(v).Type().Name()) -} - -// Cascade use cascade or not -func (engine *Engine) Cascade(trueOrFalse ...bool) *Session { - session := engine.NewSession() - session.IsAutoClose = true - return session.Cascade(trueOrFalse...) -} - -// Where method provide a condition query -func (engine *Engine) Where(query interface{}, args ...interface{}) *Session { - session := engine.NewSession() - session.IsAutoClose = true - return session.Where(query, args...) -} - -// Id will be depracated, please use ID instead -func (engine *Engine) Id(id interface{}) *Session { - session := engine.NewSession() - session.IsAutoClose = true - return session.Id(id) -} - -// ID method provoide a condition as (id) = ? -func (engine *Engine) ID(id interface{}) *Session { - session := engine.NewSession() - session.IsAutoClose = true - return session.ID(id) -} - -// Before apply before Processor, affected bean is passed to closure arg -func (engine *Engine) Before(closures func(interface{})) *Session { - session := engine.NewSession() - session.IsAutoClose = true - return session.Before(closures) -} - -// After apply after insert Processor, affected bean is passed to closure arg -func (engine *Engine) After(closures func(interface{})) *Session { - session := engine.NewSession() - session.IsAutoClose = true - return session.After(closures) -} - -// Charset set charset when create table, only support mysql now -func (engine *Engine) Charset(charset string) *Session { - session := engine.NewSession() - session.IsAutoClose = true - return session.Charset(charset) -} - -// StoreEngine set store engine when create table, only support mysql now -func (engine *Engine) StoreEngine(storeEngine string) *Session { - session := engine.NewSession() - session.IsAutoClose = true - return session.StoreEngine(storeEngine) -} - -// Distinct use for distinct columns. Caution: when you are using cache, -// distinct will not be cached because cache system need id, -// but distinct will not provide id -func (engine *Engine) Distinct(columns ...string) *Session { - session := engine.NewSession() - session.IsAutoClose = true - return session.Distinct(columns...) -} - -// Select customerize your select columns or contents -func (engine *Engine) Select(str string) *Session { - session := engine.NewSession() - session.IsAutoClose = true - return session.Select(str) -} - -// Cols only use the parameters as select or update columns -func (engine *Engine) Cols(columns ...string) *Session { - session := engine.NewSession() - session.IsAutoClose = true - return session.Cols(columns...) -} - -// AllCols indicates that all columns should be use -func (engine *Engine) AllCols() *Session { - session := engine.NewSession() - session.IsAutoClose = true - return session.AllCols() -} - -// MustCols specify some columns must use even if they are empty -func (engine *Engine) MustCols(columns ...string) *Session { - session := engine.NewSession() - session.IsAutoClose = true - return session.MustCols(columns...) -} - -// UseBool xorm automatically retrieve condition according struct, but -// if struct has bool field, it will ignore them. So use UseBool -// to tell system to do not ignore them. -// If no parameters, it will use all the bool field of struct, or -// it will use parameters's columns -func (engine *Engine) UseBool(columns ...string) *Session { - session := engine.NewSession() - session.IsAutoClose = true - return session.UseBool(columns...) -} - -// Omit only not use the parameters as select or update columns -func (engine *Engine) Omit(columns ...string) *Session { - session := engine.NewSession() - session.IsAutoClose = true - return session.Omit(columns...) -} - -// Nullable set null when column is zero-value and nullable for update -func (engine *Engine) Nullable(columns ...string) *Session { - session := engine.NewSession() - session.IsAutoClose = true - return session.Nullable(columns...) -} - -// In will generate "column IN (?, ?)" -func (engine *Engine) In(column string, args ...interface{}) *Session { - session := engine.NewSession() - session.IsAutoClose = true - return session.In(column, args...) -} - -// Incr provides a update string like "column = column + ?" -func (engine *Engine) Incr(column string, arg ...interface{}) *Session { - session := engine.NewSession() - session.IsAutoClose = true - return session.Incr(column, arg...) -} - -// Decr provides a update string like "column = column - ?" -func (engine *Engine) Decr(column string, arg ...interface{}) *Session { - session := engine.NewSession() - session.IsAutoClose = true - return session.Decr(column, arg...) -} - -// SetExpr provides a update string like "column = {expression}" -func (engine *Engine) SetExpr(column string, expression string) *Session { - session := engine.NewSession() - session.IsAutoClose = true - return session.SetExpr(column, expression) -} - -// Table temporarily change the Get, Find, Update's table -func (engine *Engine) Table(tableNameOrBean interface{}) *Session { - session := engine.NewSession() - session.IsAutoClose = true - return session.Table(tableNameOrBean) -} - -// Alias set the table alias -func (engine *Engine) Alias(alias string) *Session { - session := engine.NewSession() - session.IsAutoClose = true - return session.Alias(alias) -} - -// Limit will generate "LIMIT start, limit" -func (engine *Engine) Limit(limit int, start ...int) *Session { - session := engine.NewSession() - session.IsAutoClose = true - return session.Limit(limit, start...) -} - -// Desc will generate "ORDER BY column1 DESC, column2 DESC" -func (engine *Engine) Desc(colNames ...string) *Session { - session := engine.NewSession() - session.IsAutoClose = true - return session.Desc(colNames...) -} - -// Asc will generate "ORDER BY column1,column2 Asc" -// This method can chainable use. -// -// engine.Desc("name").Asc("age").Find(&users) -// // SELECT * FROM user ORDER BY name DESC, age ASC -// -func (engine *Engine) Asc(colNames ...string) *Session { - session := engine.NewSession() - session.IsAutoClose = true - return session.Asc(colNames...) -} - -// OrderBy will generate "ORDER BY order" -func (engine *Engine) OrderBy(order string) *Session { - session := engine.NewSession() - session.IsAutoClose = true - return session.OrderBy(order) -} - -// Join the join_operator should be one of INNER, LEFT OUTER, CROSS etc - this will be prepended to JOIN -func (engine *Engine) Join(joinOperator string, tablename interface{}, condition string, args ...interface{}) *Session { - session := engine.NewSession() - session.IsAutoClose = true - return session.Join(joinOperator, tablename, condition, args...) -} - -// GroupBy generate group by statement -func (engine *Engine) GroupBy(keys string) *Session { - session := engine.NewSession() - session.IsAutoClose = true - return session.GroupBy(keys) -} - -// Having generate having statement -func (engine *Engine) Having(conditions string) *Session { - session := engine.NewSession() - session.IsAutoClose = true - return session.Having(conditions) -} - -func (engine *Engine) autoMapType(v reflect.Value) *core.Table { - t := v.Type() - engine.mutex.Lock() - defer engine.mutex.Unlock() - table, ok := engine.Tables[t] - if !ok { - table = engine.mapType(v) - engine.Tables[t] = table - if engine.Cacher != nil { - if v.CanAddr() { - engine.GobRegister(v.Addr().Interface()) - } else { - engine.GobRegister(v.Interface()) - } - } - } - return table -} - -// GobRegister register one struct to gob for cache use -func (engine *Engine) GobRegister(v interface{}) *Engine { - //fmt.Printf("Type: %[1]T => Data: %[1]#v\n", v) - gob.Register(v) - return engine -} - -// Table table struct -type Table struct { - *core.Table - Name string -} - -// TableInfo get table info according to bean's content -func (engine *Engine) TableInfo(bean interface{}) *Table { - v := rValue(bean) - return &Table{engine.autoMapType(v), engine.tbName(v)} -} - -func addIndex(indexName string, table *core.Table, col *core.Column, indexType int) { - if index, ok := table.Indexes[indexName]; ok { - index.AddColumn(col.Name) - col.Indexes[index.Name] = indexType - } else { - index := core.NewIndex(indexName, indexType) - index.AddColumn(col.Name) - table.AddIndex(index) - col.Indexes[index.Name] = indexType - } -} - -func (engine *Engine) newTable() *core.Table { - table := core.NewEmptyTable() - - if !engine.disableGlobalCache { - table.Cacher = engine.Cacher - } - return table -} - -// TableName table name interface to define customerize table name -type TableName interface { - TableName() string -} - -var ( - tpTableName = reflect.TypeOf((*TableName)(nil)).Elem() -) - -func (engine *Engine) mapType(v reflect.Value) *core.Table { - t := v.Type() - table := engine.newTable() - if tb, ok := v.Interface().(TableName); ok { - table.Name = tb.TableName() - } else { - if v.CanAddr() { - if tb, ok = v.Addr().Interface().(TableName); ok { - table.Name = tb.TableName() - } - } - if table.Name == "" { - table.Name = engine.TableMapper.Obj2Table(t.Name()) - } - } - - table.Type = t - - var idFieldColName string - var err error - var hasCacheTag, hasNoCacheTag bool - - for i := 0; i < t.NumField(); i++ { - tag := t.Field(i).Tag - - ormTagStr := tag.Get(engine.TagIdentifier) - var col *core.Column - fieldValue := v.Field(i) - fieldType := fieldValue.Type() - - if ormTagStr != "" { - col = &core.Column{FieldName: t.Field(i).Name, Nullable: true, IsPrimaryKey: false, - IsAutoIncrement: false, MapType: core.TWOSIDES, Indexes: make(map[string]int)} - tags := splitTag(ormTagStr) - - if len(tags) > 0 { - if tags[0] == "-" { - continue - } - if strings.ToUpper(tags[0]) == "EXTENDS" { - switch fieldValue.Kind() { - case reflect.Ptr: - f := fieldValue.Type().Elem() - if f.Kind() == reflect.Struct { - fieldPtr := fieldValue - fieldValue = fieldValue.Elem() - if !fieldValue.IsValid() || fieldPtr.IsNil() { - fieldValue = reflect.New(f).Elem() - } - } - fallthrough - case reflect.Struct: - parentTable := engine.mapType(fieldValue) - for _, col := range parentTable.Columns() { - col.FieldName = fmt.Sprintf("%v.%v", t.Field(i).Name, col.FieldName) - table.AddColumn(col) - for indexName, indexType := range col.Indexes { - addIndex(indexName, table, col, indexType) - } - } - continue - default: - //TODO: warning - } - } - - indexNames := make(map[string]int) - var isIndex, isUnique bool - var preKey string - for j, key := range tags { - k := strings.ToUpper(key) - switch { - case k == "<-": - col.MapType = core.ONLYFROMDB - case k == "->": - col.MapType = core.ONLYTODB - case k == "PK": - col.IsPrimaryKey = true - col.Nullable = false - case k == "NULL": - if j == 0 { - col.Nullable = true - } else { - col.Nullable = (strings.ToUpper(tags[j-1]) != "NOT") - } - // TODO: for postgres how add autoincr? - /*case strings.HasPrefix(k, "AUTOINCR(") && strings.HasSuffix(k, ")"): - col.IsAutoIncrement = true - - autoStart := k[len("AUTOINCR")+1 : len(k)-1] - autoStartInt, err := strconv.Atoi(autoStart) - if err != nil { - engine.LogError(err) - } - col.AutoIncrStart = autoStartInt*/ - case k == "AUTOINCR": - col.IsAutoIncrement = true - //col.AutoIncrStart = 1 - case k == "DEFAULT": - col.Default = tags[j+1] - case k == "CREATED": - col.IsCreated = true - case k == "VERSION": - col.IsVersion = true - col.Default = "1" - case k == "UTC": - col.TimeZone = time.UTC - case k == "LOCAL": - col.TimeZone = time.Local - case strings.HasPrefix(k, "LOCALE(") && strings.HasSuffix(k, ")"): - location := k[len("LOCALE")+1 : len(k)-1] - col.TimeZone, err = time.LoadLocation(location) - if err != nil { - engine.logger.Error(err) - } - case k == "UPDATED": - col.IsUpdated = true - case k == "DELETED": - col.IsDeleted = true - case strings.HasPrefix(k, "INDEX(") && strings.HasSuffix(k, ")"): - indexName := k[len("INDEX")+1 : len(k)-1] - indexNames[indexName] = core.IndexType - case k == "INDEX": - isIndex = true - case strings.HasPrefix(k, "UNIQUE(") && strings.HasSuffix(k, ")"): - indexName := k[len("UNIQUE")+1 : len(k)-1] - indexNames[indexName] = core.UniqueType - case k == "UNIQUE": - isUnique = true - case k == "NOTNULL": - col.Nullable = false - case k == "CACHE": - if !hasCacheTag { - hasCacheTag = true - } - case k == "NOCACHE": - if !hasNoCacheTag { - hasNoCacheTag = true - } - case k == "NOT": - default: - if strings.HasPrefix(k, "'") && strings.HasSuffix(k, "'") { - if preKey != "DEFAULT" { - col.Name = key[1 : len(key)-1] - } - } else if strings.Contains(k, "(") && strings.HasSuffix(k, ")") { - fs := strings.Split(k, "(") - - if _, ok := core.SqlTypes[fs[0]]; !ok { - preKey = k - continue - } - col.SQLType = core.SQLType{Name: fs[0]} - if fs[0] == core.Enum && fs[1][0] == '\'' { //enum - options := strings.Split(fs[1][0:len(fs[1])-1], ",") - col.EnumOptions = make(map[string]int) - for k, v := range options { - v = strings.TrimSpace(v) - v = strings.Trim(v, "'") - col.EnumOptions[v] = k - } - } else if fs[0] == core.Set && fs[1][0] == '\'' { //set - options := strings.Split(fs[1][0:len(fs[1])-1], ",") - col.SetOptions = make(map[string]int) - for k, v := range options { - v = strings.TrimSpace(v) - v = strings.Trim(v, "'") - col.SetOptions[v] = k - } - } else { - fs2 := strings.Split(fs[1][0:len(fs[1])-1], ",") - if len(fs2) == 2 { - col.Length, err = strconv.Atoi(fs2[0]) - if err != nil { - engine.logger.Error(err) - } - col.Length2, err = strconv.Atoi(fs2[1]) - if err != nil { - engine.logger.Error(err) - } - } else if len(fs2) == 1 { - col.Length, err = strconv.Atoi(fs2[0]) - if err != nil { - engine.logger.Error(err) - } - } - } - } else { - if _, ok := core.SqlTypes[k]; ok { - col.SQLType = core.SQLType{Name: k} - } else if key != col.Default { - col.Name = key - } - } - engine.dialect.SqlType(col) - } - preKey = k - } - if col.SQLType.Name == "" { - col.SQLType = core.Type2SQLType(fieldType) - } - if col.Length == 0 { - col.Length = col.SQLType.DefaultLength - } - if col.Length2 == 0 { - col.Length2 = col.SQLType.DefaultLength2 - } - - if col.Name == "" { - col.Name = engine.ColumnMapper.Obj2Table(t.Field(i).Name) - } - - if isUnique { - indexNames[col.Name] = core.UniqueType - } else if isIndex { - indexNames[col.Name] = core.IndexType - } - - for indexName, indexType := range indexNames { - addIndex(indexName, table, col, indexType) - } - } - } else { - var sqlType core.SQLType - if fieldValue.CanAddr() { - if _, ok := fieldValue.Addr().Interface().(core.Conversion); ok { - sqlType = core.SQLType{Name: core.Text} - } - } - if _, ok := fieldValue.Interface().(core.Conversion); ok { - sqlType = core.SQLType{Name: core.Text} - } else { - sqlType = core.Type2SQLType(fieldType) - } - col = core.NewColumn(engine.ColumnMapper.Obj2Table(t.Field(i).Name), - t.Field(i).Name, sqlType, sqlType.DefaultLength, - sqlType.DefaultLength2, true) - } - if col.IsAutoIncrement { - col.Nullable = false - } - - table.AddColumn(col) - - if fieldType.Kind() == reflect.Int64 && (strings.ToUpper(col.FieldName) == "ID" || strings.HasSuffix(strings.ToUpper(col.FieldName), ".ID")) { - idFieldColName = col.Name - } - } // end for - - if idFieldColName != "" && len(table.PrimaryKeys) == 0 { - col := table.GetColumn(idFieldColName) - col.IsPrimaryKey = true - col.IsAutoIncrement = true - col.Nullable = false - table.PrimaryKeys = append(table.PrimaryKeys, col.Name) - table.AutoIncrement = col.Name - } - - if hasCacheTag { - if engine.Cacher != nil { // !nash! use engine's cacher if provided - engine.logger.Info("enable cache on table:", table.Name) - table.Cacher = engine.Cacher - } else { - engine.logger.Info("enable LRU cache on table:", table.Name) - table.Cacher = NewLRUCacher2(NewMemoryStore(), time.Hour, 10000) // !nashtsai! HACK use LRU cacher for now - } - } - if hasNoCacheTag { - engine.logger.Info("no cache on table:", table.Name) - table.Cacher = nil - } - - return table -} - -// IsTableEmpty if a table has any reocrd -func (engine *Engine) IsTableEmpty(bean interface{}) (bool, error) { - session := engine.NewSession() - defer session.Close() - return session.IsTableEmpty(bean) -} - -// IsTableExist if a table is exist -func (engine *Engine) IsTableExist(beanOrTableName interface{}) (bool, error) { - session := engine.NewSession() - defer session.Close() - return session.IsTableExist(beanOrTableName) -} - -// IdOf get id from one struct -// -// Deprecated: use IDOf instead. -func (engine *Engine) IdOf(bean interface{}) core.PK { - return engine.IDOf(bean) -} - -// IDOf get id from one struct -func (engine *Engine) IDOf(bean interface{}) core.PK { - return engine.IdOfV(reflect.ValueOf(bean)) -} - -// IdOfV get id from one value of struct -// -// Deprecated: use IDOfV instead. -func (engine *Engine) IdOfV(rv reflect.Value) core.PK { - return engine.IDOfV(rv) -} - -// IDOfV get id from one value of struct -func (engine *Engine) IDOfV(rv reflect.Value) core.PK { - v := reflect.Indirect(rv) - table := engine.autoMapType(v) - pk := make([]interface{}, len(table.PrimaryKeys)) - for i, col := range table.PKColumns() { - pkField := v.FieldByName(col.FieldName) - switch pkField.Kind() { - case reflect.String: - pk[i] = pkField.String() - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - pk[i] = pkField.Int() - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - pk[i] = pkField.Uint() - } - } - return core.PK(pk) -} - -// CreateIndexes create indexes -func (engine *Engine) CreateIndexes(bean interface{}) error { - session := engine.NewSession() - defer session.Close() - return session.CreateIndexes(bean) -} - -// CreateUniques create uniques -func (engine *Engine) CreateUniques(bean interface{}) error { - session := engine.NewSession() - defer session.Close() - return session.CreateUniques(bean) -} - -func (engine *Engine) getCacher2(table *core.Table) core.Cacher { - return table.Cacher -} - -func (engine *Engine) getCacher(v reflect.Value) core.Cacher { - if table := engine.autoMapType(v); table != nil { - return table.Cacher - } - return engine.Cacher -} - -// ClearCacheBean if enabled cache, clear the cache bean -func (engine *Engine) ClearCacheBean(bean interface{}, id string) error { - v := rValue(bean) - t := v.Type() - if t.Kind() != reflect.Struct { - return errors.New("error params") - } - tableName := engine.tbName(v) - table := engine.autoMapType(v) - cacher := table.Cacher - if cacher == nil { - cacher = engine.Cacher - } - if cacher != nil { - cacher.ClearIds(tableName) - cacher.DelBean(tableName, id) - } - return nil -} - -// ClearCache if enabled cache, clear some tables' cache -func (engine *Engine) ClearCache(beans ...interface{}) error { - for _, bean := range beans { - v := rValue(bean) - t := v.Type() - if t.Kind() != reflect.Struct { - return errors.New("error params") - } - tableName := engine.tbName(v) - table := engine.autoMapType(v) - cacher := table.Cacher - if cacher == nil { - cacher = engine.Cacher - } - if cacher != nil { - cacher.ClearIds(tableName) - cacher.ClearBeans(tableName) - } - } - return nil -} - -// Sync the new struct changes to database, this method will automatically add -// table, column, index, unique. but will not delete or change anything. -// If you change some field, you should change the database manually. -func (engine *Engine) Sync(beans ...interface{}) error { - for _, bean := range beans { - v := rValue(bean) - tableName := engine.tbName(v) - table := engine.autoMapType(v) - - s := engine.NewSession() - defer s.Close() - isExist, err := s.Table(bean).isTableExist(tableName) - if err != nil { - return err - } - if !isExist { - err = engine.CreateTables(bean) - if err != nil { - return err - } - } - /*isEmpty, err := engine.IsEmptyTable(bean) - if err != nil { - return err - }*/ - var isEmpty bool - if isEmpty { - err = engine.DropTables(bean) - if err != nil { - return err - } - err = engine.CreateTables(bean) - if err != nil { - return err - } - } else { - for _, col := range table.Columns() { - isExist, err := engine.dialect.IsColumnExist(tableName, col.Name) - if err != nil { - return err - } - if !isExist { - session := engine.NewSession() - session.Statement.setRefValue(v) - defer session.Close() - err = session.addColumn(col.Name) - if err != nil { - return err - } - } - } - - for name, index := range table.Indexes { - session := engine.NewSession() - session.Statement.setRefValue(v) - defer session.Close() - if index.Type == core.UniqueType { - //isExist, err := session.isIndexExist(table.Name, name, true) - isExist, err := session.isIndexExist2(tableName, index.Cols, true) - if err != nil { - return err - } - if !isExist { - session := engine.NewSession() - session.Statement.setRefValue(v) - defer session.Close() - err = session.addUnique(tableName, name) - if err != nil { - return err - } - } - } else if index.Type == core.IndexType { - isExist, err := session.isIndexExist2(tableName, index.Cols, false) - if err != nil { - return err - } - if !isExist { - session := engine.NewSession() - session.Statement.setRefValue(v) - defer session.Close() - err = session.addIndex(tableName, name) - if err != nil { - return err - } - } - } else { - return errors.New("unknow index type") - } - } - } - } - return nil -} - -// Sync2 synchronize structs to database tables -func (engine *Engine) Sync2(beans ...interface{}) error { - s := engine.NewSession() - defer s.Close() - return s.Sync2(beans...) -} - -func (engine *Engine) unMap(beans ...interface{}) (e error) { - engine.mutex.Lock() - defer engine.mutex.Unlock() - for _, bean := range beans { - t := rType(bean) - if _, ok := engine.Tables[t]; ok { - delete(engine.Tables, t) - } - } - return -} - -// Drop all mapped table -func (engine *Engine) dropAll() error { - session := engine.NewSession() - defer session.Close() - - err := session.Begin() - if err != nil { - return err - } - err = session.dropAll() - if err != nil { - session.Rollback() - return err - } - return session.Commit() -} - -// CreateTables create tabls according bean -func (engine *Engine) CreateTables(beans ...interface{}) error { - session := engine.NewSession() - defer session.Close() - - err := session.Begin() - if err != nil { - return err - } - - for _, bean := range beans { - err = session.CreateTable(bean) - if err != nil { - session.Rollback() - return err - } - } - return session.Commit() -} - -// DropTables drop specify tables -func (engine *Engine) DropTables(beans ...interface{}) error { - session := engine.NewSession() - defer session.Close() - - err := session.Begin() - if err != nil { - return err - } - - for _, bean := range beans { - err = session.DropTable(bean) - if err != nil { - session.Rollback() - return err - } - } - return session.Commit() -} - -func (engine *Engine) createAll() error { - session := engine.NewSession() - defer session.Close() - return session.createAll() -} - -// Exec raw sql -func (engine *Engine) Exec(sql string, args ...interface{}) (sql.Result, error) { - session := engine.NewSession() - defer session.Close() - return session.Exec(sql, args...) -} - -// Query a raw sql and return records as []map[string][]byte -func (engine *Engine) Query(sql string, paramStr ...interface{}) (resultsSlice []map[string][]byte, err error) { - session := engine.NewSession() - defer session.Close() - return session.Query(sql, paramStr...) -} - -// Insert one or more records -func (engine *Engine) Insert(beans ...interface{}) (int64, error) { - session := engine.NewSession() - defer session.Close() - return session.Insert(beans...) -} - -// InsertOne insert only one record -func (engine *Engine) InsertOne(bean interface{}) (int64, error) { - session := engine.NewSession() - defer session.Close() - return session.InsertOne(bean) -} - -// Update records, bean's non-empty fields are updated contents, -// condiBean' non-empty filds are conditions -// CAUTION: -// 1.bool will defaultly be updated content nor conditions -// You should call UseBool if you have bool to use. -// 2.float32 & float64 may be not inexact as conditions -func (engine *Engine) Update(bean interface{}, condiBeans ...interface{}) (int64, error) { - session := engine.NewSession() - defer session.Close() - return session.Update(bean, condiBeans...) -} - -// Delete records, bean's non-empty fields are conditions -func (engine *Engine) Delete(bean interface{}) (int64, error) { - session := engine.NewSession() - defer session.Close() - return session.Delete(bean) -} - -// Get retrieve one record from table, bean's non-empty fields -// are conditions -func (engine *Engine) Get(bean interface{}) (bool, error) { - session := engine.NewSession() - defer session.Close() - return session.Get(bean) -} - -// Find retrieve records from table, condiBeans's non-empty fields -// are conditions. beans could be []Struct, []*Struct, map[int64]Struct -// map[int64]*Struct -func (engine *Engine) Find(beans interface{}, condiBeans ...interface{}) error { - session := engine.NewSession() - defer session.Close() - return session.Find(beans, condiBeans...) -} - -// Iterate record by record handle records from table, bean's non-empty fields -// are conditions. -func (engine *Engine) Iterate(bean interface{}, fun IterFunc) error { - session := engine.NewSession() - defer session.Close() - return session.Iterate(bean, fun) -} - -// Rows return sql.Rows compatible Rows obj, as a forward Iterator object for iterating record by record, bean's non-empty fields -// are conditions. -func (engine *Engine) Rows(bean interface{}) (*Rows, error) { - session := engine.NewSession() - return session.Rows(bean) -} - -// Count counts the records. bean's non-empty fields are conditions. -func (engine *Engine) Count(bean interface{}) (int64, error) { - session := engine.NewSession() - defer session.Close() - return session.Count(bean) -} - -// Sum sum the records by some column. bean's non-empty fields are conditions. -func (engine *Engine) Sum(bean interface{}, colName string) (float64, error) { - session := engine.NewSession() - defer session.Close() - return session.Sum(bean, colName) -} - -// Sums sum the records by some columns. bean's non-empty fields are conditions. -func (engine *Engine) Sums(bean interface{}, colNames ...string) ([]float64, error) { - session := engine.NewSession() - defer session.Close() - return session.Sums(bean, colNames...) -} - -// SumsInt like Sums but return slice of int64 instead of float64. -func (engine *Engine) SumsInt(bean interface{}, colNames ...string) ([]int64, error) { - session := engine.NewSession() - defer session.Close() - return session.SumsInt(bean, colNames...) -} - -// ImportFile SQL DDL file -func (engine *Engine) ImportFile(ddlPath string) ([]sql.Result, error) { - file, err := os.Open(ddlPath) - if err != nil { - return nil, err - } - defer file.Close() - return engine.Import(file) -} - -// Import SQL DDL from io.Reader -func (engine *Engine) Import(r io.Reader) ([]sql.Result, error) { - var results []sql.Result - var lastError error - scanner := bufio.NewScanner(r) - - semiColSpliter := func(data []byte, atEOF bool) (advance int, token []byte, err error) { - if atEOF && len(data) == 0 { - return 0, nil, nil - } - if i := bytes.IndexByte(data, ';'); i >= 0 { - return i + 1, data[0:i], nil - } - // If we're at EOF, we have a final, non-terminated line. Return it. - if atEOF { - return len(data), data, nil - } - // Request more data. - return 0, nil, nil - } - - scanner.Split(semiColSpliter) - - for scanner.Scan() { - query := strings.Trim(scanner.Text(), " \t\n\r") - if len(query) > 0 { - engine.logSQL(query) - result, err := engine.DB().Exec(query) - results = append(results, result) - if err != nil { - return nil, err - //lastError = err - } - } - } - - return results, lastError -} - -// TZTime change one time to xorm time location -func (engine *Engine) TZTime(t time.Time) time.Time { - if !t.IsZero() { // if time is not initialized it's not suitable for Time.In() - return t.In(engine.TZLocation) - } - return t -} - -// NowTime return current time -func (engine *Engine) NowTime(sqlTypeName string) interface{} { - t := time.Now() - return engine.FormatTime(sqlTypeName, t) -} - -// NowTime2 return current time -func (engine *Engine) NowTime2(sqlTypeName string) (interface{}, time.Time) { - t := time.Now() - return engine.FormatTime(sqlTypeName, t), t -} - -// FormatTime format time -func (engine *Engine) FormatTime(sqlTypeName string, t time.Time) (v interface{}) { - return engine.formatTime(engine.TZLocation, sqlTypeName, t) -} - -func (engine *Engine) formatColTime(col *core.Column, t time.Time) (v interface{}) { - if col.DisableTimeZone { - return engine.formatTime(nil, col.SQLType.Name, t) - } else if col.TimeZone != nil { - return engine.formatTime(col.TimeZone, col.SQLType.Name, t) - } - return engine.formatTime(engine.TZLocation, col.SQLType.Name, t) -} - -func (engine *Engine) formatTime(tz *time.Location, sqlTypeName string, t time.Time) (v interface{}) { - if engine.dialect.DBType() == core.ORACLE { - return t - } - if tz != nil { - t = t.In(tz) - } else { - t = engine.TZTime(t) - } - switch sqlTypeName { - case core.Time: - s := t.Format("2006-01-02 15:04:05") //time.RFC3339 - v = s[11:19] - case core.Date: - v = t.Format("2006-01-02") - case core.DateTime, core.TimeStamp: - if engine.dialect.DBType() == "ql" { - v = t - } else if engine.dialect.DBType() == "sqlite3" { - v = t.UTC().Format("2006-01-02 15:04:05") - } else { - v = t.Format("2006-01-02 15:04:05") - } - case core.TimeStampz: - if engine.dialect.DBType() == core.MSSQL { - v = t.Format("2006-01-02T15:04:05.9999999Z07:00") - } else if engine.DriverName() == "mssql" { - v = t - } else { - v = t.Format(time.RFC3339Nano) - } - case core.BigInt, core.Int: - v = t.Unix() - default: - v = t - } - return -} - -// Unscoped always disable struct tag "deleted" -func (engine *Engine) Unscoped() *Session { - session := engine.NewSession() - session.IsAutoClose = true - return session.Unscoped() -} diff --git a/vendor/github.com/go-xorm/xorm/error.go b/vendor/github.com/go-xorm/xorm/error.go deleted file mode 100644 index 2a334f47c..000000000 --- a/vendor/github.com/go-xorm/xorm/error.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2015 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xorm - -import ( - "errors" -) - -var ( - // ErrParamsType params error - ErrParamsType = errors.New("Params type error") - // ErrTableNotFound table not found error - ErrTableNotFound = errors.New("Not found table") - // ErrUnSupportedType unsupported error - ErrUnSupportedType = errors.New("Unsupported type error") - // ErrNotExist record is not exist error - ErrNotExist = errors.New("Not exist error") - // ErrCacheFailed cache failed error - ErrCacheFailed = errors.New("Cache failed") - // ErrNeedDeletedCond delete needs less one condition error - ErrNeedDeletedCond = errors.New("Delete need at least one condition") - // ErrNotImplemented not implemented - ErrNotImplemented = errors.New("Not implemented") -) diff --git a/vendor/github.com/go-xorm/xorm/gen_reserved.sh b/vendor/github.com/go-xorm/xorm/gen_reserved.sh deleted file mode 100644 index 434a1bfcb..000000000 --- a/vendor/github.com/go-xorm/xorm/gen_reserved.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -if [ -f $1 ];then - cat $1| awk '{printf("\""$1"\":true,\n")}' -else - echo "argument $1 if not a file!" -fi diff --git a/vendor/github.com/go-xorm/xorm/goracle_driver.go b/vendor/github.com/go-xorm/xorm/goracle_driver.go deleted file mode 100644 index 9fcde48f0..000000000 --- a/vendor/github.com/go-xorm/xorm/goracle_driver.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2015 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xorm - -import ( - "errors" - "regexp" - - "github.com/go-xorm/core" -) - -// func init() { -// core.RegisterDriver("goracle", &goracleDriver{}) -// } - -type goracleDriver struct { -} - -func (cfg *goracleDriver) Parse(driverName, dataSourceName string) (*core.Uri, error) { - db := &core.Uri{DbType: core.ORACLE} - dsnPattern := regexp.MustCompile( - `^(?:(?P.*?)(?::(?P.*))?@)?` + // [user[:password]@] - `(?:(?P[^\(]*)(?:\((?P[^\)]*)\))?)?` + // [net[(addr)]] - `\/(?P.*?)` + // /dbname - `(?:\?(?P[^\?]*))?$`) // [?param1=value1¶mN=valueN] - matches := dsnPattern.FindStringSubmatch(dataSourceName) - //tlsConfigRegister := make(map[string]*tls.Config) - names := dsnPattern.SubexpNames() - - for i, match := range matches { - switch names[i] { - case "dbname": - db.DbName = match - } - } - if db.DbName == "" { - return nil, errors.New("dbname is empty") - } - return db, nil -} diff --git a/vendor/github.com/go-xorm/xorm/helpers.go b/vendor/github.com/go-xorm/xorm/helpers.go deleted file mode 100644 index 4e26e8414..000000000 --- a/vendor/github.com/go-xorm/xorm/helpers.go +++ /dev/null @@ -1,608 +0,0 @@ -// Copyright 2015 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xorm - -import ( - "errors" - "fmt" - "reflect" - "sort" - "strconv" - "strings" - "time" - - "github.com/go-xorm/core" -) - -// str2PK convert string value to primary key value according to tp -func str2PKValue(s string, tp reflect.Type) (reflect.Value, error) { - var err error - var result interface{} - var defReturn = reflect.Zero(tp) - - switch tp.Kind() { - case reflect.Int: - result, err = strconv.Atoi(s) - if err != nil { - return defReturn, fmt.Errorf("convert %s as int: %s", s, err.Error()) - } - case reflect.Int8: - x, err := strconv.Atoi(s) - if err != nil { - return defReturn, fmt.Errorf("convert %s as int8: %s", s, err.Error()) - } - result = int8(x) - case reflect.Int16: - x, err := strconv.Atoi(s) - if err != nil { - return defReturn, fmt.Errorf("convert %s as int16: %s", s, err.Error()) - } - result = int16(x) - case reflect.Int32: - x, err := strconv.Atoi(s) - if err != nil { - return defReturn, fmt.Errorf("convert %s as int32: %s", s, err.Error()) - } - result = int32(x) - case reflect.Int64: - result, err = strconv.ParseInt(s, 10, 64) - if err != nil { - return defReturn, fmt.Errorf("convert %s as int64: %s", s, err.Error()) - } - case reflect.Uint: - x, err := strconv.ParseUint(s, 10, 64) - if err != nil { - return defReturn, fmt.Errorf("convert %s as uint: %s", s, err.Error()) - } - result = uint(x) - case reflect.Uint8: - x, err := strconv.ParseUint(s, 10, 64) - if err != nil { - return defReturn, fmt.Errorf("convert %s as uint8: %s", s, err.Error()) - } - result = uint8(x) - case reflect.Uint16: - x, err := strconv.ParseUint(s, 10, 64) - if err != nil { - return defReturn, fmt.Errorf("convert %s as uint16: %s", s, err.Error()) - } - result = uint16(x) - case reflect.Uint32: - x, err := strconv.ParseUint(s, 10, 64) - if err != nil { - return defReturn, fmt.Errorf("convert %s as uint32: %s", s, err.Error()) - } - result = uint32(x) - case reflect.Uint64: - result, err = strconv.ParseUint(s, 10, 64) - if err != nil { - return defReturn, fmt.Errorf("convert %s as uint64: %s", s, err.Error()) - } - case reflect.String: - result = s - default: - return defReturn, errors.New("unsupported convert type") - } - return reflect.ValueOf(result).Convert(tp), nil -} - -func str2PK(s string, tp reflect.Type) (interface{}, error) { - v, err := str2PKValue(s, tp) - if err != nil { - return nil, err - } - return v.Interface(), nil -} - -func splitTag(tag string) (tags []string) { - tag = strings.TrimSpace(tag) - var hasQuote = false - var lastIdx = 0 - for i, t := range tag { - if t == '\'' { - hasQuote = !hasQuote - } else if t == ' ' { - if lastIdx < i && !hasQuote { - tags = append(tags, strings.TrimSpace(tag[lastIdx:i])) - lastIdx = i + 1 - } - } - } - if lastIdx < len(tag) { - tags = append(tags, strings.TrimSpace(tag[lastIdx:])) - } - return -} - -type zeroable interface { - IsZero() bool -} - -func isZero(k interface{}) bool { - switch k.(type) { - case int: - return k.(int) == 0 - case int8: - return k.(int8) == 0 - case int16: - return k.(int16) == 0 - case int32: - return k.(int32) == 0 - case int64: - return k.(int64) == 0 - case uint: - return k.(uint) == 0 - case uint8: - return k.(uint8) == 0 - case uint16: - return k.(uint16) == 0 - case uint32: - return k.(uint32) == 0 - case uint64: - return k.(uint64) == 0 - case float32: - return k.(float32) == 0 - case float64: - return k.(float64) == 0 - case bool: - return k.(bool) == false - case string: - return k.(string) == "" - case zeroable: - return k.(zeroable).IsZero() - } - return false -} - -func isStructZero(v reflect.Value) bool { - if !v.IsValid() { - return true - } - - for i := 0; i < v.NumField(); i++ { - field := v.Field(i) - switch field.Kind() { - case reflect.Ptr: - field = field.Elem() - fallthrough - case reflect.Struct: - if !isStructZero(field) { - return false - } - default: - if field.CanInterface() && !isZero(field.Interface()) { - return false - } - } - } - return true -} - -func int64ToIntValue(id int64, tp reflect.Type) reflect.Value { - var v interface{} - switch tp.Kind() { - case reflect.Int16: - v = int16(id) - case reflect.Int32: - v = int32(id) - case reflect.Int: - v = int(id) - case reflect.Int64: - v = id - case reflect.Uint16: - v = uint16(id) - case reflect.Uint32: - v = uint32(id) - case reflect.Uint64: - v = uint64(id) - case reflect.Uint: - v = uint(id) - } - return reflect.ValueOf(v).Convert(tp) -} - -func int64ToInt(id int64, tp reflect.Type) interface{} { - return int64ToIntValue(id, tp).Interface() -} - -func isPKZero(pk core.PK) bool { - for _, k := range pk { - if isZero(k) { - return true - } - } - return false -} - -func indexNoCase(s, sep string) int { - return strings.Index(strings.ToLower(s), strings.ToLower(sep)) -} - -func splitNoCase(s, sep string) []string { - idx := indexNoCase(s, sep) - if idx < 0 { - return []string{s} - } - return strings.Split(s, s[idx:idx+len(sep)]) -} - -func splitNNoCase(s, sep string, n int) []string { - idx := indexNoCase(s, sep) - if idx < 0 { - return []string{s} - } - return strings.SplitN(s, s[idx:idx+len(sep)], n) -} - -func makeArray(elem string, count int) []string { - res := make([]string, count) - for i := 0; i < count; i++ { - res[i] = elem - } - return res -} - -func rValue(bean interface{}) reflect.Value { - return reflect.Indirect(reflect.ValueOf(bean)) -} - -func rType(bean interface{}) reflect.Type { - sliceValue := reflect.Indirect(reflect.ValueOf(bean)) - //return reflect.TypeOf(sliceValue.Interface()) - return sliceValue.Type() -} - -func structName(v reflect.Type) string { - for v.Kind() == reflect.Ptr { - v = v.Elem() - } - return v.Name() -} - -func col2NewCols(columns ...string) []string { - newColumns := make([]string, 0, len(columns)) - for _, col := range columns { - col = strings.Replace(col, "`", "", -1) - col = strings.Replace(col, `"`, "", -1) - ccols := strings.Split(col, ",") - for _, c := range ccols { - newColumns = append(newColumns, strings.TrimSpace(c)) - } - } - return newColumns -} - -func sliceEq(left, right []string) bool { - if len(left) != len(right) { - return false - } - sort.Sort(sort.StringSlice(left)) - sort.Sort(sort.StringSlice(right)) - for i := 0; i < len(left); i++ { - if left[i] != right[i] { - return false - } - } - return true -} - -func reflect2value(rawValue *reflect.Value) (str string, err error) { - aa := reflect.TypeOf((*rawValue).Interface()) - vv := reflect.ValueOf((*rawValue).Interface()) - switch aa.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - str = strconv.FormatInt(vv.Int(), 10) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - str = strconv.FormatUint(vv.Uint(), 10) - case reflect.Float32, reflect.Float64: - str = strconv.FormatFloat(vv.Float(), 'f', -1, 64) - case reflect.String: - str = vv.String() - case reflect.Array, reflect.Slice: - switch aa.Elem().Kind() { - case reflect.Uint8: - data := rawValue.Interface().([]byte) - str = string(data) - default: - err = fmt.Errorf("Unsupported struct type %v", vv.Type().Name()) - } - // time type - case reflect.Struct: - if aa.ConvertibleTo(core.TimeType) { - str = vv.Convert(core.TimeType).Interface().(time.Time).Format(time.RFC3339Nano) - } else { - err = fmt.Errorf("Unsupported struct type %v", vv.Type().Name()) - } - case reflect.Bool: - str = strconv.FormatBool(vv.Bool()) - case reflect.Complex128, reflect.Complex64: - str = fmt.Sprintf("%v", vv.Complex()) - /* TODO: unsupported types below - case reflect.Map: - case reflect.Ptr: - case reflect.Uintptr: - case reflect.UnsafePointer: - case reflect.Chan, reflect.Func, reflect.Interface: - */ - default: - err = fmt.Errorf("Unsupported struct type %v", vv.Type().Name()) - } - return -} - -func value2Bytes(rawValue *reflect.Value) (data []byte, err error) { - var str string - str, err = reflect2value(rawValue) - if err != nil { - return - } - data = []byte(str) - return -} - -func value2String(rawValue *reflect.Value) (data string, err error) { - data, err = reflect2value(rawValue) - if err != nil { - return - } - return -} - -func rows2Strings(rows *core.Rows) (resultsSlice []map[string]string, err error) { - fields, err := rows.Columns() - if err != nil { - return nil, err - } - for rows.Next() { - result, err := row2mapStr(rows, fields) - if err != nil { - return nil, err - } - resultsSlice = append(resultsSlice, result) - } - - return resultsSlice, nil -} - -func rows2maps(rows *core.Rows) (resultsSlice []map[string][]byte, err error) { - fields, err := rows.Columns() - if err != nil { - return nil, err - } - for rows.Next() { - result, err := row2map(rows, fields) - if err != nil { - return nil, err - } - resultsSlice = append(resultsSlice, result) - } - - return resultsSlice, nil -} - -func row2map(rows *core.Rows, fields []string) (resultsMap map[string][]byte, err error) { - result := make(map[string][]byte) - scanResultContainers := make([]interface{}, len(fields)) - for i := 0; i < len(fields); i++ { - var scanResultContainer interface{} - scanResultContainers[i] = &scanResultContainer - } - if err := rows.Scan(scanResultContainers...); err != nil { - return nil, err - } - - for ii, key := range fields { - rawValue := reflect.Indirect(reflect.ValueOf(scanResultContainers[ii])) - //if row is null then ignore - if rawValue.Interface() == nil { - //fmt.Println("ignore ...", key, rawValue) - continue - } - - if data, err := value2Bytes(&rawValue); err == nil { - result[key] = data - } else { - return nil, err // !nashtsai! REVIEW, should return err or just error log? - } - } - return result, nil -} - -func row2mapStr(rows *core.Rows, fields []string) (resultsMap map[string]string, err error) { - result := make(map[string]string) - scanResultContainers := make([]interface{}, len(fields)) - for i := 0; i < len(fields); i++ { - var scanResultContainer interface{} - scanResultContainers[i] = &scanResultContainer - } - if err := rows.Scan(scanResultContainers...); err != nil { - return nil, err - } - - for ii, key := range fields { - rawValue := reflect.Indirect(reflect.ValueOf(scanResultContainers[ii])) - //if row is null then ignore - if rawValue.Interface() == nil { - //fmt.Println("ignore ...", key, rawValue) - continue - } - - if data, err := value2String(&rawValue); err == nil { - result[key] = data - } else { - return nil, err // !nashtsai! REVIEW, should return err or just error log? - } - } - return result, nil -} - -func txQuery2(tx *core.Tx, sqlStr string, params ...interface{}) (resultsSlice []map[string]string, err error) { - rows, err := tx.Query(sqlStr, params...) - if err != nil { - return nil, err - } - defer rows.Close() - - return rows2Strings(rows) -} - -func query2(db *core.DB, sqlStr string, params ...interface{}) (resultsSlice []map[string]string, err error) { - s, err := db.Prepare(sqlStr) - if err != nil { - return nil, err - } - defer s.Close() - rows, err := s.Query(params...) - if err != nil { - return nil, err - } - defer rows.Close() - return rows2Strings(rows) -} - -func setColumnInt(bean interface{}, col *core.Column, t int64) { - v, err := col.ValueOf(bean) - if err != nil { - return - } - if v.CanSet() { - switch v.Type().Kind() { - case reflect.Int, reflect.Int64, reflect.Int32: - v.SetInt(t) - case reflect.Uint, reflect.Uint64, reflect.Uint32: - v.SetUint(uint64(t)) - } - } -} - -func setColumnTime(bean interface{}, col *core.Column, t time.Time) { - v, err := col.ValueOf(bean) - if err != nil { - return - } - if v.CanSet() { - switch v.Type().Kind() { - case reflect.Struct: - v.Set(reflect.ValueOf(t).Convert(v.Type())) - case reflect.Int, reflect.Int64, reflect.Int32: - v.SetInt(t.Unix()) - case reflect.Uint, reflect.Uint64, reflect.Uint32: - v.SetUint(uint64(t.Unix())) - } - } -} - -func genCols(table *core.Table, session *Session, bean interface{}, useCol bool, includeQuote bool) ([]string, []interface{}, error) { - colNames := make([]string, 0, len(table.ColumnsSeq())) - args := make([]interface{}, 0, len(table.ColumnsSeq())) - - for _, col := range table.Columns() { - if useCol && !col.IsVersion && !col.IsCreated && !col.IsUpdated { - if _, ok := getFlagForColumn(session.Statement.columnMap, col); !ok { - continue - } - } - if col.MapType == core.ONLYFROMDB { - continue - } - - fieldValuePtr, err := col.ValueOf(bean) - if err != nil { - return nil, nil, err - } - fieldValue := *fieldValuePtr - - if col.IsAutoIncrement { - switch fieldValue.Type().Kind() { - case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int, reflect.Int64: - if fieldValue.Int() == 0 { - continue - } - case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint, reflect.Uint64: - if fieldValue.Uint() == 0 { - continue - } - case reflect.String: - if len(fieldValue.String()) == 0 { - continue - } - } - } - - if col.IsDeleted { - continue - } - - if session.Statement.ColumnStr != "" { - if _, ok := getFlagForColumn(session.Statement.columnMap, col); !ok { - continue - } - } - if session.Statement.OmitStr != "" { - if _, ok := getFlagForColumn(session.Statement.columnMap, col); ok { - continue - } - } - - // !evalphobia! set fieldValue as nil when column is nullable and zero-value - if _, ok := getFlagForColumn(session.Statement.nullableMap, col); ok { - if col.Nullable && isZero(fieldValue.Interface()) { - var nilValue *int - fieldValue = reflect.ValueOf(nilValue) - } - } - - if (col.IsCreated || col.IsUpdated) && session.Statement.UseAutoTime /*&& isZero(fieldValue.Interface())*/ { - // if time is non-empty, then set to auto time - val, t := session.Engine.NowTime2(col.SQLType.Name) - args = append(args, val) - - var colName = col.Name - session.afterClosures = append(session.afterClosures, func(bean interface{}) { - col := table.GetColumn(colName) - setColumnTime(bean, col, t) - }) - } else if col.IsVersion && session.Statement.checkVersion { - args = append(args, 1) - } else { - arg, err := session.value2Interface(col, fieldValue) - if err != nil { - return colNames, args, err - } - args = append(args, arg) - } - - if includeQuote { - colNames = append(colNames, session.Engine.Quote(col.Name)+" = ?") - } else { - colNames = append(colNames, col.Name) - } - } - return colNames, args, nil -} - -func indexName(tableName, idxName string) string { - return fmt.Sprintf("IDX_%v_%v", tableName, idxName) -} - -func getFlagForColumn(m map[string]bool, col *core.Column) (val bool, has bool) { - - if len(m) == 0 { - return false, false - } - - n := len(col.Name) - - for mk := range m { - if len(mk) != n { - continue - } - if strings.EqualFold(mk, col.Name) { - return m[mk], true - } - } - - return false, false -} diff --git a/vendor/github.com/go-xorm/xorm/logger.go b/vendor/github.com/go-xorm/xorm/logger.go deleted file mode 100644 index 727d030a4..000000000 --- a/vendor/github.com/go-xorm/xorm/logger.go +++ /dev/null @@ -1,187 +0,0 @@ -// Copyright 2015 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xorm - -import ( - "fmt" - "io" - "log" - - "github.com/go-xorm/core" -) - -// default log options -const ( - DEFAULT_LOG_PREFIX = "[xorm]" - DEFAULT_LOG_FLAG = log.Ldate | log.Lmicroseconds - DEFAULT_LOG_LEVEL = core.LOG_DEBUG -) - -var _ core.ILogger = DiscardLogger{} - -// DiscardLogger don't log implementation for core.ILogger -type DiscardLogger struct{} - -// Debug empty implementation -func (DiscardLogger) Debug(v ...interface{}) {} - -// Debugf empty implementation -func (DiscardLogger) Debugf(format string, v ...interface{}) {} - -// Error empty implementation -func (DiscardLogger) Error(v ...interface{}) {} - -// Errorf empty implementation -func (DiscardLogger) Errorf(format string, v ...interface{}) {} - -// Info empty implementation -func (DiscardLogger) Info(v ...interface{}) {} - -// Infof empty implementation -func (DiscardLogger) Infof(format string, v ...interface{}) {} - -// Warn empty implementation -func (DiscardLogger) Warn(v ...interface{}) {} - -// Warnf empty implementation -func (DiscardLogger) Warnf(format string, v ...interface{}) {} - -// Level empty implementation -func (DiscardLogger) Level() core.LogLevel { - return core.LOG_UNKNOWN -} - -// SetLevel empty implementation -func (DiscardLogger) SetLevel(l core.LogLevel) {} - -// ShowSQL empty implementation -func (DiscardLogger) ShowSQL(show ...bool) {} - -// IsShowSQL empty implementation -func (DiscardLogger) IsShowSQL() bool { - return false -} - -// SimpleLogger is the default implment of core.ILogger -type SimpleLogger struct { - DEBUG *log.Logger - ERR *log.Logger - INFO *log.Logger - WARN *log.Logger - level core.LogLevel - showSQL bool -} - -var _ core.ILogger = &SimpleLogger{} - -// NewSimpleLogger use a special io.Writer as logger output -func NewSimpleLogger(out io.Writer) *SimpleLogger { - return NewSimpleLogger2(out, DEFAULT_LOG_PREFIX, DEFAULT_LOG_FLAG) -} - -// NewSimpleLogger2 let you customrize your logger prefix and flag -func NewSimpleLogger2(out io.Writer, prefix string, flag int) *SimpleLogger { - return NewSimpleLogger3(out, prefix, flag, DEFAULT_LOG_LEVEL) -} - -// NewSimpleLogger3 let you customrize your logger prefix and flag and logLevel -func NewSimpleLogger3(out io.Writer, prefix string, flag int, l core.LogLevel) *SimpleLogger { - return &SimpleLogger{ - DEBUG: log.New(out, fmt.Sprintf("%s [debug] ", prefix), flag), - ERR: log.New(out, fmt.Sprintf("%s [error] ", prefix), flag), - INFO: log.New(out, fmt.Sprintf("%s [info] ", prefix), flag), - WARN: log.New(out, fmt.Sprintf("%s [warn] ", prefix), flag), - level: l, - } -} - -// Error implement core.ILogger -func (s *SimpleLogger) Error(v ...interface{}) { - if s.level <= core.LOG_ERR { - s.ERR.Output(2, fmt.Sprint(v...)) - } - return -} - -// Errorf implement core.ILogger -func (s *SimpleLogger) Errorf(format string, v ...interface{}) { - if s.level <= core.LOG_ERR { - s.ERR.Output(2, fmt.Sprintf(format, v...)) - } - return -} - -// Debug implement core.ILogger -func (s *SimpleLogger) Debug(v ...interface{}) { - if s.level <= core.LOG_DEBUG { - s.DEBUG.Output(2, fmt.Sprint(v...)) - } - return -} - -// Debugf implement core.ILogger -func (s *SimpleLogger) Debugf(format string, v ...interface{}) { - if s.level <= core.LOG_DEBUG { - s.DEBUG.Output(2, fmt.Sprintf(format, v...)) - } - return -} - -// Info implement core.ILogger -func (s *SimpleLogger) Info(v ...interface{}) { - if s.level <= core.LOG_INFO { - s.INFO.Output(2, fmt.Sprint(v...)) - } - return -} - -// Infof implement core.ILogger -func (s *SimpleLogger) Infof(format string, v ...interface{}) { - if s.level <= core.LOG_INFO { - s.INFO.Output(2, fmt.Sprintf(format, v...)) - } - return -} - -// Warn implement core.ILogger -func (s *SimpleLogger) Warn(v ...interface{}) { - if s.level <= core.LOG_WARNING { - s.WARN.Output(2, fmt.Sprint(v...)) - } - return -} - -// Warnf implement core.ILogger -func (s *SimpleLogger) Warnf(format string, v ...interface{}) { - if s.level <= core.LOG_WARNING { - s.WARN.Output(2, fmt.Sprintf(format, v...)) - } - return -} - -// Level implement core.ILogger -func (s *SimpleLogger) Level() core.LogLevel { - return s.level -} - -// SetLevel implement core.ILogger -func (s *SimpleLogger) SetLevel(l core.LogLevel) { - s.level = l - return -} - -// ShowSQL implement core.ILogger -func (s *SimpleLogger) ShowSQL(show ...bool) { - if len(show) == 0 { - s.showSQL = true - return - } - s.showSQL = show[0] -} - -// IsShowSQL implement core.ILogger -func (s *SimpleLogger) IsShowSQL() bool { - return s.showSQL -} diff --git a/vendor/github.com/go-xorm/xorm/lru_cacher.go b/vendor/github.com/go-xorm/xorm/lru_cacher.go deleted file mode 100644 index 4a7450435..000000000 --- a/vendor/github.com/go-xorm/xorm/lru_cacher.go +++ /dev/null @@ -1,294 +0,0 @@ -// Copyright 2015 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xorm - -import ( - "container/list" - "fmt" - "sync" - "time" - - "github.com/go-xorm/core" -) - -// LRUCacher implments cache object facilities -type LRUCacher struct { - idList *list.List - sqlList *list.List - idIndex map[string]map[string]*list.Element - sqlIndex map[string]map[string]*list.Element - store core.CacheStore - mutex sync.Mutex - // maxSize int - MaxElementSize int - Expired time.Duration - GcInterval time.Duration -} - -// NewLRUCacher creates a cacher -func NewLRUCacher(store core.CacheStore, maxElementSize int) *LRUCacher { - return NewLRUCacher2(store, 3600*time.Second, maxElementSize) -} - -// NewLRUCacher2 creates a cache include different params -func NewLRUCacher2(store core.CacheStore, expired time.Duration, maxElementSize int) *LRUCacher { - cacher := &LRUCacher{store: store, idList: list.New(), - sqlList: list.New(), Expired: expired, - GcInterval: core.CacheGcInterval, MaxElementSize: maxElementSize, - sqlIndex: make(map[string]map[string]*list.Element), - idIndex: make(map[string]map[string]*list.Element), - } - cacher.RunGC() - return cacher -} - -// RunGC run once every m.GcInterval -func (m *LRUCacher) RunGC() { - time.AfterFunc(m.GcInterval, func() { - m.RunGC() - m.GC() - }) -} - -// GC check ids lit and sql list to remove all element expired -func (m *LRUCacher) GC() { - //fmt.Println("begin gc ...") - //defer fmt.Println("end gc ...") - m.mutex.Lock() - defer m.mutex.Unlock() - var removedNum int - for e := m.idList.Front(); e != nil; { - if removedNum <= core.CacheGcMaxRemoved && - time.Now().Sub(e.Value.(*idNode).lastVisit) > m.Expired { - removedNum++ - next := e.Next() - //fmt.Println("removing ...", e.Value) - node := e.Value.(*idNode) - m.delBean(node.tbName, node.id) - e = next - } else { - //fmt.Printf("removing %d cache nodes ..., left %d\n", removedNum, m.idList.Len()) - break - } - } - - removedNum = 0 - for e := m.sqlList.Front(); e != nil; { - if removedNum <= core.CacheGcMaxRemoved && - time.Now().Sub(e.Value.(*sqlNode).lastVisit) > m.Expired { - removedNum++ - next := e.Next() - //fmt.Println("removing ...", e.Value) - node := e.Value.(*sqlNode) - m.delIds(node.tbName, node.sql) - e = next - } else { - //fmt.Printf("removing %d cache nodes ..., left %d\n", removedNum, m.sqlList.Len()) - break - } - } -} - -// GetIds returns all bean's ids according to sql and parameter from cache -func (m *LRUCacher) GetIds(tableName, sql string) interface{} { - m.mutex.Lock() - defer m.mutex.Unlock() - if _, ok := m.sqlIndex[tableName]; !ok { - m.sqlIndex[tableName] = make(map[string]*list.Element) - } - if v, err := m.store.Get(sql); err == nil { - if el, ok := m.sqlIndex[tableName][sql]; !ok { - el = m.sqlList.PushBack(newSQLNode(tableName, sql)) - m.sqlIndex[tableName][sql] = el - } else { - lastTime := el.Value.(*sqlNode).lastVisit - // if expired, remove the node and return nil - if time.Now().Sub(lastTime) > m.Expired { - m.delIds(tableName, sql) - return nil - } - m.sqlList.MoveToBack(el) - el.Value.(*sqlNode).lastVisit = time.Now() - } - return v - } - - m.delIds(tableName, sql) - - return nil -} - -// GetBean returns bean according tableName and id from cache -func (m *LRUCacher) GetBean(tableName string, id string) interface{} { - m.mutex.Lock() - defer m.mutex.Unlock() - if _, ok := m.idIndex[tableName]; !ok { - m.idIndex[tableName] = make(map[string]*list.Element) - } - tid := genID(tableName, id) - if v, err := m.store.Get(tid); err == nil { - if el, ok := m.idIndex[tableName][id]; ok { - lastTime := el.Value.(*idNode).lastVisit - // if expired, remove the node and return nil - if time.Now().Sub(lastTime) > m.Expired { - m.delBean(tableName, id) - //m.clearIds(tableName) - return nil - } - m.idList.MoveToBack(el) - el.Value.(*idNode).lastVisit = time.Now() - } else { - el = m.idList.PushBack(newIDNode(tableName, id)) - m.idIndex[tableName][id] = el - } - return v - } - - // store bean is not exist, then remove memory's index - m.delBean(tableName, id) - //m.clearIds(tableName) - return nil -} - -// clearIds clears all sql-ids mapping on table tableName from cache -func (m *LRUCacher) clearIds(tableName string) { - if tis, ok := m.sqlIndex[tableName]; ok { - for sql, v := range tis { - m.sqlList.Remove(v) - m.store.Del(sql) - } - } - m.sqlIndex[tableName] = make(map[string]*list.Element) -} - -// ClearIds clears all sql-ids mapping on table tableName from cache -func (m *LRUCacher) ClearIds(tableName string) { - m.mutex.Lock() - defer m.mutex.Unlock() - m.clearIds(tableName) -} - -func (m *LRUCacher) clearBeans(tableName string) { - if tis, ok := m.idIndex[tableName]; ok { - for id, v := range tis { - m.idList.Remove(v) - tid := genID(tableName, id) - m.store.Del(tid) - } - } - m.idIndex[tableName] = make(map[string]*list.Element) -} - -// ClearBeans clears all beans in some table -func (m *LRUCacher) ClearBeans(tableName string) { - m.mutex.Lock() - defer m.mutex.Unlock() - m.clearBeans(tableName) -} - -// PutIds pus ids into table -func (m *LRUCacher) PutIds(tableName, sql string, ids interface{}) { - m.mutex.Lock() - defer m.mutex.Unlock() - if _, ok := m.sqlIndex[tableName]; !ok { - m.sqlIndex[tableName] = make(map[string]*list.Element) - } - if el, ok := m.sqlIndex[tableName][sql]; !ok { - el = m.sqlList.PushBack(newSQLNode(tableName, sql)) - m.sqlIndex[tableName][sql] = el - } else { - el.Value.(*sqlNode).lastVisit = time.Now() - } - m.store.Put(sql, ids) - if m.sqlList.Len() > m.MaxElementSize { - e := m.sqlList.Front() - node := e.Value.(*sqlNode) - m.delIds(node.tbName, node.sql) - } -} - -// PutBean puts beans into table -func (m *LRUCacher) PutBean(tableName string, id string, obj interface{}) { - m.mutex.Lock() - defer m.mutex.Unlock() - var el *list.Element - var ok bool - - if el, ok = m.idIndex[tableName][id]; !ok { - el = m.idList.PushBack(newIDNode(tableName, id)) - m.idIndex[tableName][id] = el - } else { - el.Value.(*idNode).lastVisit = time.Now() - } - - m.store.Put(genID(tableName, id), obj) - if m.idList.Len() > m.MaxElementSize { - e := m.idList.Front() - node := e.Value.(*idNode) - m.delBean(node.tbName, node.id) - } -} - -func (m *LRUCacher) delIds(tableName, sql string) { - if _, ok := m.sqlIndex[tableName]; ok { - if el, ok := m.sqlIndex[tableName][sql]; ok { - delete(m.sqlIndex[tableName], sql) - m.sqlList.Remove(el) - } - } - m.store.Del(sql) -} - -// DelIds deletes ids -func (m *LRUCacher) DelIds(tableName, sql string) { - m.mutex.Lock() - defer m.mutex.Unlock() - m.delIds(tableName, sql) -} - -func (m *LRUCacher) delBean(tableName string, id string) { - tid := genID(tableName, id) - if el, ok := m.idIndex[tableName][id]; ok { - delete(m.idIndex[tableName], id) - m.idList.Remove(el) - m.clearIds(tableName) - } - m.store.Del(tid) -} - -// DelBean deletes beans in some table -func (m *LRUCacher) DelBean(tableName string, id string) { - m.mutex.Lock() - defer m.mutex.Unlock() - m.delBean(tableName, id) -} - -type idNode struct { - tbName string - id string - lastVisit time.Time -} - -type sqlNode struct { - tbName string - sql string - lastVisit time.Time -} - -func genSQLKey(sql string, args interface{}) string { - return fmt.Sprintf("%v-%v", sql, args) -} - -func genID(prefix string, id string) string { - return fmt.Sprintf("%v-%v", prefix, id) -} - -func newIDNode(tbName string, id string) *idNode { - return &idNode{tbName, id, time.Now()} -} - -func newSQLNode(tbName, sql string) *sqlNode { - return &sqlNode{tbName, sql, time.Now()} -} diff --git a/vendor/github.com/go-xorm/xorm/memory_store.go b/vendor/github.com/go-xorm/xorm/memory_store.go deleted file mode 100644 index 36853b19e..000000000 --- a/vendor/github.com/go-xorm/xorm/memory_store.go +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2015 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xorm - -import ( - "sync" - - "github.com/go-xorm/core" -) - -var _ core.CacheStore = NewMemoryStore() - -// MemoryStore represents in-memory store -type MemoryStore struct { - store map[interface{}]interface{} - mutex sync.RWMutex -} - -// NewMemoryStore creates a new store in memory -func NewMemoryStore() *MemoryStore { - return &MemoryStore{store: make(map[interface{}]interface{})} -} - -// Put puts object into store -func (s *MemoryStore) Put(key string, value interface{}) error { - s.mutex.Lock() - defer s.mutex.Unlock() - s.store[key] = value - return nil -} - -// Get gets object from store -func (s *MemoryStore) Get(key string) (interface{}, error) { - s.mutex.RLock() - defer s.mutex.RUnlock() - if v, ok := s.store[key]; ok { - return v, nil - } - - return nil, ErrNotExist -} - -// Del deletes object -func (s *MemoryStore) Del(key string) error { - s.mutex.Lock() - defer s.mutex.Unlock() - delete(s.store, key) - return nil -} diff --git a/vendor/github.com/go-xorm/xorm/mssql_dialect.go b/vendor/github.com/go-xorm/xorm/mssql_dialect.go deleted file mode 100644 index e9bda1fd5..000000000 --- a/vendor/github.com/go-xorm/xorm/mssql_dialect.go +++ /dev/null @@ -1,528 +0,0 @@ -// Copyright 2015 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xorm - -import ( - "fmt" - "strconv" - "strings" - - "github.com/go-xorm/core" -) - -var ( - mssqlReservedWords = map[string]bool{ - "ADD": true, - "EXTERNAL": true, - "PROCEDURE": true, - "ALL": true, - "FETCH": true, - "PUBLIC": true, - "ALTER": true, - "FILE": true, - "RAISERROR": true, - "AND": true, - "FILLFACTOR": true, - "READ": true, - "ANY": true, - "FOR": true, - "READTEXT": true, - "AS": true, - "FOREIGN": true, - "RECONFIGURE": true, - "ASC": true, - "FREETEXT": true, - "REFERENCES": true, - "AUTHORIZATION": true, - "FREETEXTTABLE": true, - "REPLICATION": true, - "BACKUP": true, - "FROM": true, - "RESTORE": true, - "BEGIN": true, - "FULL": true, - "RESTRICT": true, - "BETWEEN": true, - "FUNCTION": true, - "RETURN": true, - "BREAK": true, - "GOTO": true, - "REVERT": true, - "BROWSE": true, - "GRANT": true, - "REVOKE": true, - "BULK": true, - "GROUP": true, - "RIGHT": true, - "BY": true, - "HAVING": true, - "ROLLBACK": true, - "CASCADE": true, - "HOLDLOCK": true, - "ROWCOUNT": true, - "CASE": true, - "IDENTITY": true, - "ROWGUIDCOL": true, - "CHECK": true, - "IDENTITY_INSERT": true, - "RULE": true, - "CHECKPOINT": true, - "IDENTITYCOL": true, - "SAVE": true, - "CLOSE": true, - "IF": true, - "SCHEMA": true, - "CLUSTERED": true, - "IN": true, - "SECURITYAUDIT": true, - "COALESCE": true, - "INDEX": true, - "SELECT": true, - "COLLATE": true, - "INNER": true, - "SEMANTICKEYPHRASETABLE": true, - "COLUMN": true, - "INSERT": true, - "SEMANTICSIMILARITYDETAILSTABLE": true, - "COMMIT": true, - "INTERSECT": true, - "SEMANTICSIMILARITYTABLE": true, - "COMPUTE": true, - "INTO": true, - "SESSION_USER": true, - "CONSTRAINT": true, - "IS": true, - "SET": true, - "CONTAINS": true, - "JOIN": true, - "SETUSER": true, - "CONTAINSTABLE": true, - "KEY": true, - "SHUTDOWN": true, - "CONTINUE": true, - "KILL": true, - "SOME": true, - "CONVERT": true, - "LEFT": true, - "STATISTICS": true, - "CREATE": true, - "LIKE": true, - "SYSTEM_USER": true, - "CROSS": true, - "LINENO": true, - "TABLE": true, - "CURRENT": true, - "LOAD": true, - "TABLESAMPLE": true, - "CURRENT_DATE": true, - "MERGE": true, - "TEXTSIZE": true, - "CURRENT_TIME": true, - "NATIONAL": true, - "THEN": true, - "CURRENT_TIMESTAMP": true, - "NOCHECK": true, - "TO": true, - "CURRENT_USER": true, - "NONCLUSTERED": true, - "TOP": true, - "CURSOR": true, - "NOT": true, - "TRAN": true, - "DATABASE": true, - "NULL": true, - "TRANSACTION": true, - "DBCC": true, - "NULLIF": true, - "TRIGGER": true, - "DEALLOCATE": true, - "OF": true, - "TRUNCATE": true, - "DECLARE": true, - "OFF": true, - "TRY_CONVERT": true, - "DEFAULT": true, - "OFFSETS": true, - "TSEQUAL": true, - "DELETE": true, - "ON": true, - "UNION": true, - "DENY": true, - "OPEN": true, - "UNIQUE": true, - "DESC": true, - "OPENDATASOURCE": true, - "UNPIVOT": true, - "DISK": true, - "OPENQUERY": true, - "UPDATE": true, - "DISTINCT": true, - "OPENROWSET": true, - "UPDATETEXT": true, - "DISTRIBUTED": true, - "OPENXML": true, - "USE": true, - "DOUBLE": true, - "OPTION": true, - "USER": true, - "DROP": true, - "OR": true, - "VALUES": true, - "DUMP": true, - "ORDER": true, - "VARYING": true, - "ELSE": true, - "OUTER": true, - "VIEW": true, - "END": true, - "OVER": true, - "WAITFOR": true, - "ERRLVL": true, - "PERCENT": true, - "WHEN": true, - "ESCAPE": true, - "PIVOT": true, - "WHERE": true, - "EXCEPT": true, - "PLAN": true, - "WHILE": true, - "EXEC": true, - "PRECISION": true, - "WITH": true, - "EXECUTE": true, - "PRIMARY": true, - "WITHIN": true, - "EXISTS": true, - "PRINT": true, - "WRITETEXT": true, - "EXIT": true, - "PROC": true, - } -) - -type mssql struct { - core.Base -} - -func (db *mssql) Init(d *core.DB, uri *core.Uri, drivername, dataSourceName string) error { - return db.Base.Init(d, db, uri, drivername, dataSourceName) -} - -func (db *mssql) SqlType(c *core.Column) string { - var res string - switch t := c.SQLType.Name; t { - case core.Bool: - res = core.TinyInt - if c.Default == "true" { - c.Default = "1" - } else if c.Default == "false" { - c.Default = "0" - } - case core.Serial: - c.IsAutoIncrement = true - c.IsPrimaryKey = true - c.Nullable = false - res = core.Int - case core.BigSerial: - c.IsAutoIncrement = true - c.IsPrimaryKey = true - c.Nullable = false - res = core.BigInt - case core.Bytea, core.Blob, core.Binary, core.TinyBlob, core.MediumBlob, core.LongBlob: - res = core.VarBinary - if c.Length == 0 { - c.Length = 50 - } - case core.TimeStamp: - res = core.DateTime - case core.TimeStampz: - res = "DATETIMEOFFSET" - c.Length = 7 - case core.MediumInt: - res = core.Int - case core.Text, core.MediumText, core.TinyText, core.LongText, core.Json: - res = core.Varchar + "(MAX)" - case core.Double: - res = core.Real - case core.Uuid: - res = core.Varchar - c.Length = 40 - default: - res = t - } - - if res == core.Int { - return core.Int - } - - hasLen1 := (c.Length > 0) - hasLen2 := (c.Length2 > 0) - - if hasLen2 { - res += "(" + strconv.Itoa(c.Length) + "," + strconv.Itoa(c.Length2) + ")" - } else if hasLen1 { - res += "(" + strconv.Itoa(c.Length) + ")" - } - return res -} - -func (db *mssql) SupportInsertMany() bool { - return true -} - -func (db *mssql) IsReserved(name string) bool { - _, ok := mssqlReservedWords[name] - return ok -} - -func (db *mssql) Quote(name string) string { - return "\"" + name + "\"" -} - -func (db *mssql) QuoteStr() string { - return "\"" -} - -func (db *mssql) SupportEngine() bool { - return false -} - -func (db *mssql) AutoIncrStr() string { - return "IDENTITY" -} - -func (db *mssql) DropTableSql(tableName string) string { - return fmt.Sprintf("IF EXISTS (SELECT * FROM sysobjects WHERE id = "+ - "object_id(N'%s') and OBJECTPROPERTY(id, N'IsUserTable') = 1) "+ - "DROP TABLE \"%s\"", tableName, tableName) -} - -func (db *mssql) SupportCharset() bool { - return false -} - -func (db *mssql) IndexOnTable() bool { - return true -} - -func (db *mssql) IndexCheckSql(tableName, idxName string) (string, []interface{}) { - args := []interface{}{idxName} - sql := "select name from sysindexes where id=object_id('" + tableName + "') and name=?" - return sql, args -} - -/*func (db *mssql) ColumnCheckSql(tableName, colName string) (string, []interface{}) { - args := []interface{}{tableName, colName} - sql := `SELECT "COLUMN_NAME" FROM "INFORMATION_SCHEMA"."COLUMNS" WHERE "TABLE_NAME" = ? AND "COLUMN_NAME" = ?` - return sql, args -}*/ - -func (db *mssql) IsColumnExist(tableName, colName string) (bool, error) { - query := `SELECT "COLUMN_NAME" FROM "INFORMATION_SCHEMA"."COLUMNS" WHERE "TABLE_NAME" = ? AND "COLUMN_NAME" = ?` - - return db.HasRecords(query, tableName, colName) -} - -func (db *mssql) TableCheckSql(tableName string) (string, []interface{}) { - args := []interface{}{} - sql := "select * from sysobjects where id = object_id(N'" + tableName + "') and OBJECTPROPERTY(id, N'IsUserTable') = 1" - return sql, args -} - -func (db *mssql) GetColumns(tableName string) ([]string, map[string]*core.Column, error) { - args := []interface{}{} - s := `select a.name as name, b.name as ctype,a.max_length,a.precision,a.scale,a.is_nullable as nullable, - replace(replace(isnull(c.text,''),'(',''),')','') as vdefault - from sys.columns a left join sys.types b on a.user_type_id=b.user_type_id - left join sys.syscomments c on a.default_object_id=c.id - where a.object_id=object_id('` + tableName + `')` - db.LogSQL(s, args) - - rows, err := db.DB().Query(s, args...) - if err != nil { - return nil, nil, err - } - defer rows.Close() - - cols := make(map[string]*core.Column) - colSeq := make([]string, 0) - for rows.Next() { - var name, ctype, vdefault string - var maxLen, precision, scale int - var nullable bool - err = rows.Scan(&name, &ctype, &maxLen, &precision, &scale, &nullable, &vdefault) - if err != nil { - return nil, nil, err - } - - col := new(core.Column) - col.Indexes = make(map[string]int) - col.Name = strings.Trim(name, "` ") - col.Nullable = nullable - col.Default = vdefault - ct := strings.ToUpper(ctype) - if ct == "DECIMAL" { - col.Length = precision - col.Length2 = scale - } else { - col.Length = maxLen - } - switch ct { - case "DATETIMEOFFSET": - col.SQLType = core.SQLType{Name: core.TimeStampz, DefaultLength: 0, DefaultLength2: 0} - case "NVARCHAR": - col.SQLType = core.SQLType{Name: core.NVarchar, DefaultLength: 0, DefaultLength2: 0} - case "IMAGE": - col.SQLType = core.SQLType{Name: core.VarBinary, DefaultLength: 0, DefaultLength2: 0} - default: - if _, ok := core.SqlTypes[ct]; ok { - col.SQLType = core.SQLType{Name: ct, DefaultLength: 0, DefaultLength2: 0} - } else { - return nil, nil, fmt.Errorf("Unknown colType %v for %v - %v", ct, tableName, col.Name) - } - } - - if col.SQLType.IsText() || col.SQLType.IsTime() { - if col.Default != "" { - col.Default = "'" + col.Default + "'" - } else { - if col.DefaultIsEmpty { - col.Default = "''" - } - } - } - cols[col.Name] = col - colSeq = append(colSeq, col.Name) - } - return colSeq, cols, nil -} - -func (db *mssql) GetTables() ([]*core.Table, error) { - args := []interface{}{} - s := `select name from sysobjects where xtype ='U'` - db.LogSQL(s, args) - - rows, err := db.DB().Query(s, args...) - if err != nil { - return nil, err - } - defer rows.Close() - - tables := make([]*core.Table, 0) - for rows.Next() { - table := core.NewEmptyTable() - var name string - err = rows.Scan(&name) - if err != nil { - return nil, err - } - table.Name = strings.Trim(name, "` ") - tables = append(tables, table) - } - return tables, nil -} - -func (db *mssql) GetIndexes(tableName string) (map[string]*core.Index, error) { - args := []interface{}{tableName} - s := `SELECT -IXS.NAME AS [INDEX_NAME], -C.NAME AS [COLUMN_NAME], -IXS.is_unique AS [IS_UNIQUE] -FROM SYS.INDEXES IXS -INNER JOIN SYS.INDEX_COLUMNS IXCS -ON IXS.OBJECT_ID=IXCS.OBJECT_ID AND IXS.INDEX_ID = IXCS.INDEX_ID -INNER JOIN SYS.COLUMNS C ON IXS.OBJECT_ID=C.OBJECT_ID -AND IXCS.COLUMN_ID=C.COLUMN_ID -WHERE IXS.TYPE_DESC='NONCLUSTERED' and OBJECT_NAME(IXS.OBJECT_ID) =? -` - db.LogSQL(s, args) - - rows, err := db.DB().Query(s, args...) - if err != nil { - return nil, err - } - defer rows.Close() - - indexes := make(map[string]*core.Index, 0) - for rows.Next() { - var indexType int - var indexName, colName, isUnique string - - err = rows.Scan(&indexName, &colName, &isUnique) - if err != nil { - return nil, err - } - - i, err := strconv.ParseBool(isUnique) - if err != nil { - return nil, err - } - - if i { - indexType = core.UniqueType - } else { - indexType = core.IndexType - } - - colName = strings.Trim(colName, "` ") - - if strings.HasPrefix(indexName, "IDX_"+tableName) || strings.HasPrefix(indexName, "UQE_"+tableName) { - indexName = indexName[5+len(tableName):] - } - - var index *core.Index - var ok bool - if index, ok = indexes[indexName]; !ok { - index = new(core.Index) - index.Type = indexType - index.Name = indexName - indexes[indexName] = index - } - index.AddColumn(colName) - } - return indexes, nil -} - -func (db *mssql) CreateTableSql(table *core.Table, tableName, storeEngine, charset string) string { - var sql string - if tableName == "" { - tableName = table.Name - } - - sql = "IF NOT EXISTS (SELECT [name] FROM sys.tables WHERE [name] = '" + tableName + "' ) CREATE TABLE " - - sql += db.QuoteStr() + tableName + db.QuoteStr() + " (" - - pkList := table.PrimaryKeys - - for _, colName := range table.ColumnsSeq() { - col := table.GetColumn(colName) - if col.IsPrimaryKey && len(pkList) == 1 { - sql += col.String(db) - } else { - sql += col.StringNoPk(db) - } - sql = strings.TrimSpace(sql) - sql += ", " - } - - if len(pkList) > 1 { - sql += "PRIMARY KEY ( " - sql += strings.Join(pkList, ",") - sql += " ), " - } - - sql = sql[:len(sql)-2] + ")" - sql += ";" - return sql -} - -func (db *mssql) ForUpdateSql(query string) string { - return query -} - -func (db *mssql) Filters() []core.Filter { - return []core.Filter{&core.IdFilter{}, &core.QuoteFilter{}} -} diff --git a/vendor/github.com/go-xorm/xorm/mymysql_driver.go b/vendor/github.com/go-xorm/xorm/mymysql_driver.go deleted file mode 100644 index ef3086a42..000000000 --- a/vendor/github.com/go-xorm/xorm/mymysql_driver.go +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2015 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xorm - -import ( - "errors" - "strings" - "time" - - "github.com/go-xorm/core" -) - -type mymysqlDriver struct { -} - -func (p *mymysqlDriver) Parse(driverName, dataSourceName string) (*core.Uri, error) { - db := &core.Uri{DbType: core.MYSQL} - - pd := strings.SplitN(dataSourceName, "*", 2) - if len(pd) == 2 { - // Parse protocol part of URI - p := strings.SplitN(pd[0], ":", 2) - if len(p) != 2 { - return nil, errors.New("Wrong protocol part of URI") - } - db.Proto = p[0] - options := strings.Split(p[1], ",") - db.Raddr = options[0] - for _, o := range options[1:] { - kv := strings.SplitN(o, "=", 2) - var k, v string - if len(kv) == 2 { - k, v = kv[0], kv[1] - } else { - k, v = o, "true" - } - switch k { - case "laddr": - db.Laddr = v - case "timeout": - to, err := time.ParseDuration(v) - if err != nil { - return nil, err - } - db.Timeout = to - default: - return nil, errors.New("Unknown option: " + k) - } - } - // Remove protocol part - pd = pd[1:] - } - // Parse database part of URI - dup := strings.SplitN(pd[0], "/", 3) - if len(dup) != 3 { - return nil, errors.New("Wrong database part of URI") - } - db.DbName = dup[0] - db.User = dup[1] - db.Passwd = dup[2] - - return db, nil -} diff --git a/vendor/github.com/go-xorm/xorm/mysql_dialect.go b/vendor/github.com/go-xorm/xorm/mysql_dialect.go deleted file mode 100644 index ab756f359..000000000 --- a/vendor/github.com/go-xorm/xorm/mysql_dialect.go +++ /dev/null @@ -1,488 +0,0 @@ -// Copyright 2015 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xorm - -import ( - "crypto/tls" - "fmt" - "strconv" - "strings" - "time" - - "github.com/go-xorm/core" -) - -var ( - mysqlReservedWords = map[string]bool{ - "ADD": true, - "ALL": true, - "ALTER": true, - "ANALYZE": true, - "AND": true, - "AS": true, - "ASC": true, - "ASENSITIVE": true, - "BEFORE": true, - "BETWEEN": true, - "BIGINT": true, - "BINARY": true, - "BLOB": true, - "BOTH": true, - "BY": true, - "CALL": true, - "CASCADE": true, - "CASE": true, - "CHANGE": true, - "CHAR": true, - "CHARACTER": true, - "CHECK": true, - "COLLATE": true, - "COLUMN": true, - "CONDITION": true, - "CONNECTION": true, - "CONSTRAINT": true, - "CONTINUE": true, - "CONVERT": true, - "CREATE": true, - "CROSS": true, - "CURRENT_DATE": true, - "CURRENT_TIME": true, - "CURRENT_TIMESTAMP": true, - "CURRENT_USER": true, - "CURSOR": true, - "DATABASE": true, - "DATABASES": true, - "DAY_HOUR": true, - "DAY_MICROSECOND": true, - "DAY_MINUTE": true, - "DAY_SECOND": true, - "DEC": true, - "DECIMAL": true, - "DECLARE": true, - "DEFAULT": true, - "DELAYED": true, - "DELETE": true, - "DESC": true, - "DESCRIBE": true, - "DETERMINISTIC": true, - "DISTINCT": true, - "DISTINCTROW": true, - "DIV": true, - "DOUBLE": true, - "DROP": true, - "DUAL": true, - "EACH": true, - "ELSE": true, - "ELSEIF": true, - "ENCLOSED": true, - "ESCAPED": true, - "EXISTS": true, - "EXIT": true, - "EXPLAIN": true, - "FALSE": true, - "FETCH": true, - "FLOAT": true, - "FLOAT4": true, - "FLOAT8": true, - "FOR": true, - "FORCE": true, - "FOREIGN": true, - "FROM": true, - "FULLTEXT": true, - "GOTO": true, - "GRANT": true, - "GROUP": true, - "HAVING": true, - "HIGH_PRIORITY": true, - "HOUR_MICROSECOND": true, - "HOUR_MINUTE": true, - "HOUR_SECOND": true, - "IF": true, - "IGNORE": true, - "IN": true, "INDEX": true, - "INFILE": true, "INNER": true, "INOUT": true, - "INSENSITIVE": true, "INSERT": true, "INT": true, - "INT1": true, "INT2": true, "INT3": true, - "INT4": true, "INT8": true, "INTEGER": true, - "INTERVAL": true, "INTO": true, "IS": true, - "ITERATE": true, "JOIN": true, "KEY": true, - "KEYS": true, "KILL": true, "LABEL": true, - "LEADING": true, "LEAVE": true, "LEFT": true, - "LIKE": true, "LIMIT": true, "LINEAR": true, - "LINES": true, "LOAD": true, "LOCALTIME": true, - "LOCALTIMESTAMP": true, "LOCK": true, "LONG": true, - "LONGBLOB": true, "LONGTEXT": true, "LOOP": true, - "LOW_PRIORITY": true, "MATCH": true, "MEDIUMBLOB": true, - "MEDIUMINT": true, "MEDIUMTEXT": true, "MIDDLEINT": true, - "MINUTE_MICROSECOND": true, "MINUTE_SECOND": true, "MOD": true, - "MODIFIES": true, "NATURAL": true, "NOT": true, - "NO_WRITE_TO_BINLOG": true, "NULL": true, "NUMERIC": true, - "ON OPTIMIZE": true, "OPTION": true, - "OPTIONALLY": true, "OR": true, "ORDER": true, - "OUT": true, "OUTER": true, "OUTFILE": true, - "PRECISION": true, "PRIMARY": true, "PROCEDURE": true, - "PURGE": true, "RAID0": true, "RANGE": true, - "READ": true, "READS": true, "REAL": true, - "REFERENCES": true, "REGEXP": true, "RELEASE": true, - "RENAME": true, "REPEAT": true, "REPLACE": true, - "REQUIRE": true, "RESTRICT": true, "RETURN": true, - "REVOKE": true, "RIGHT": true, "RLIKE": true, - "SCHEMA": true, "SCHEMAS": true, "SECOND_MICROSECOND": true, - "SELECT": true, "SENSITIVE": true, "SEPARATOR": true, - "SET": true, "SHOW": true, "SMALLINT": true, - "SPATIAL": true, "SPECIFIC": true, "SQL": true, - "SQLEXCEPTION": true, "SQLSTATE": true, "SQLWARNING": true, - "SQL_BIG_RESULT": true, "SQL_CALC_FOUND_ROWS": true, "SQL_SMALL_RESULT": true, - "SSL": true, "STARTING": true, "STRAIGHT_JOIN": true, - "TABLE": true, "TERMINATED": true, "THEN": true, - "TINYBLOB": true, "TINYINT": true, "TINYTEXT": true, - "TO": true, "TRAILING": true, "TRIGGER": true, - "TRUE": true, "UNDO": true, "UNION": true, - "UNIQUE": true, "UNLOCK": true, "UNSIGNED": true, - "UPDATE": true, "USAGE": true, "USE": true, - "USING": true, "UTC_DATE": true, "UTC_TIME": true, - "UTC_TIMESTAMP": true, "VALUES": true, "VARBINARY": true, - "VARCHAR": true, - "VARCHARACTER": true, - "VARYING": true, - "WHEN": true, - "WHERE": true, - "WHILE": true, - "WITH": true, - "WRITE": true, - "X509": true, - "XOR": true, - "YEAR_MONTH": true, - "ZEROFILL": true, - } -) - -type mysql struct { - core.Base - net string - addr string - params map[string]string - loc *time.Location - timeout time.Duration - tls *tls.Config - allowAllFiles bool - allowOldPasswords bool - clientFoundRows bool -} - -func (db *mysql) Init(d *core.DB, uri *core.Uri, drivername, dataSourceName string) error { - return db.Base.Init(d, db, uri, drivername, dataSourceName) -} - -func (db *mysql) SqlType(c *core.Column) string { - var res string - switch t := c.SQLType.Name; t { - case core.Bool: - res = core.TinyInt - c.Length = 1 - case core.Serial: - c.IsAutoIncrement = true - c.IsPrimaryKey = true - c.Nullable = false - res = core.Int - case core.BigSerial: - c.IsAutoIncrement = true - c.IsPrimaryKey = true - c.Nullable = false - res = core.BigInt - case core.Bytea: - res = core.Blob - case core.TimeStampz: - res = core.Char - c.Length = 64 - case core.Enum: //mysql enum - res = core.Enum - res += "(" - opts := "" - for v := range c.EnumOptions { - opts += fmt.Sprintf(",'%v'", v) - } - res += strings.TrimLeft(opts, ",") - res += ")" - case core.Set: //mysql set - res = core.Set - res += "(" - opts := "" - for v := range c.SetOptions { - opts += fmt.Sprintf(",'%v'", v) - } - res += strings.TrimLeft(opts, ",") - res += ")" - case core.NVarchar: - res = core.Varchar - case core.Uuid: - res = core.Varchar - c.Length = 40 - case core.Json: - res = core.Text - default: - res = t - } - - hasLen1 := (c.Length > 0) - hasLen2 := (c.Length2 > 0) - - if res == core.BigInt && !hasLen1 && !hasLen2 { - c.Length = 20 - hasLen1 = true - } - - if hasLen2 { - res += "(" + strconv.Itoa(c.Length) + "," + strconv.Itoa(c.Length2) + ")" - } else if hasLen1 { - res += "(" + strconv.Itoa(c.Length) + ")" - } - return res -} - -func (db *mysql) SupportInsertMany() bool { - return true -} - -func (db *mysql) IsReserved(name string) bool { - _, ok := mysqlReservedWords[name] - return ok -} - -func (db *mysql) Quote(name string) string { - return "`" + name + "`" -} - -func (db *mysql) QuoteStr() string { - return "`" -} - -func (db *mysql) SupportEngine() bool { - return true -} - -func (db *mysql) AutoIncrStr() string { - return "AUTO_INCREMENT" -} - -func (db *mysql) SupportCharset() bool { - return true -} - -func (db *mysql) IndexOnTable() bool { - return true -} - -func (db *mysql) IndexCheckSql(tableName, idxName string) (string, []interface{}) { - args := []interface{}{db.DbName, tableName, idxName} - sql := "SELECT `INDEX_NAME` FROM `INFORMATION_SCHEMA`.`STATISTICS`" - sql += " WHERE `TABLE_SCHEMA` = ? AND `TABLE_NAME` = ? AND `INDEX_NAME`=?" - return sql, args -} - -/*func (db *mysql) ColumnCheckSql(tableName, colName string) (string, []interface{}) { - args := []interface{}{db.DbName, tableName, colName} - sql := "SELECT `COLUMN_NAME` FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE `TABLE_SCHEMA` = ? AND `TABLE_NAME` = ? AND `COLUMN_NAME` = ?" - return sql, args -}*/ - -func (db *mysql) TableCheckSql(tableName string) (string, []interface{}) { - args := []interface{}{db.DbName, tableName} - sql := "SELECT `TABLE_NAME` from `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA`=? and `TABLE_NAME`=?" - return sql, args -} - -func (db *mysql) GetColumns(tableName string) ([]string, map[string]*core.Column, error) { - args := []interface{}{db.DbName, tableName} - s := "SELECT `COLUMN_NAME`, `IS_NULLABLE`, `COLUMN_DEFAULT`, `COLUMN_TYPE`," + - " `COLUMN_KEY`, `EXTRA` FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE `TABLE_SCHEMA` = ? AND `TABLE_NAME` = ?" - db.LogSQL(s, args) - - rows, err := db.DB().Query(s, args...) - if err != nil { - return nil, nil, err - } - defer rows.Close() - - cols := make(map[string]*core.Column) - colSeq := make([]string, 0) - for rows.Next() { - col := new(core.Column) - col.Indexes = make(map[string]int) - - var columnName, isNullable, colType, colKey, extra string - var colDefault *string - err = rows.Scan(&columnName, &isNullable, &colDefault, &colType, &colKey, &extra) - if err != nil { - return nil, nil, err - } - col.Name = strings.Trim(columnName, "` ") - if "YES" == isNullable { - col.Nullable = true - } - - if colDefault != nil { - col.Default = *colDefault - if col.Default == "" { - col.DefaultIsEmpty = true - } - } - - cts := strings.Split(colType, "(") - colName := cts[0] - colType = strings.ToUpper(colName) - var len1, len2 int - if len(cts) == 2 { - idx := strings.Index(cts[1], ")") - if colType == core.Enum && cts[1][0] == '\'' { //enum - options := strings.Split(cts[1][0:idx], ",") - col.EnumOptions = make(map[string]int) - for k, v := range options { - v = strings.TrimSpace(v) - v = strings.Trim(v, "'") - col.EnumOptions[v] = k - } - } else if colType == core.Set && cts[1][0] == '\'' { - options := strings.Split(cts[1][0:idx], ",") - col.SetOptions = make(map[string]int) - for k, v := range options { - v = strings.TrimSpace(v) - v = strings.Trim(v, "'") - col.SetOptions[v] = k - } - } else { - lens := strings.Split(cts[1][0:idx], ",") - len1, err = strconv.Atoi(strings.TrimSpace(lens[0])) - if err != nil { - return nil, nil, err - } - if len(lens) == 2 { - len2, err = strconv.Atoi(lens[1]) - if err != nil { - return nil, nil, err - } - } - } - } - if colType == "FLOAT UNSIGNED" { - colType = "FLOAT" - } - col.Length = len1 - col.Length2 = len2 - if _, ok := core.SqlTypes[colType]; ok { - col.SQLType = core.SQLType{Name: colType, DefaultLength: len1, DefaultLength2: len2} - } else { - return nil, nil, fmt.Errorf("Unknown colType %v", colType) - } - - if colKey == "PRI" { - col.IsPrimaryKey = true - } - if colKey == "UNI" { - //col.is - } - - if extra == "auto_increment" { - col.IsAutoIncrement = true - } - - if col.SQLType.IsText() || col.SQLType.IsTime() { - if col.Default != "" { - col.Default = "'" + col.Default + "'" - } else { - if col.DefaultIsEmpty { - col.Default = "''" - } - } - } - cols[col.Name] = col - colSeq = append(colSeq, col.Name) - } - return colSeq, cols, nil -} - -func (db *mysql) GetTables() ([]*core.Table, error) { - args := []interface{}{db.DbName} - s := "SELECT `TABLE_NAME`, `ENGINE`, `TABLE_ROWS`, `AUTO_INCREMENT` from " + - "`INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA`=? AND (`ENGINE`='MyISAM' OR `ENGINE` = 'InnoDB' OR `ENGINE` = 'TokuDB')" - db.LogSQL(s, args) - - rows, err := db.DB().Query(s, args...) - if err != nil { - return nil, err - } - defer rows.Close() - - tables := make([]*core.Table, 0) - for rows.Next() { - table := core.NewEmptyTable() - var name, engine, tableRows string - var autoIncr *string - err = rows.Scan(&name, &engine, &tableRows, &autoIncr) - if err != nil { - return nil, err - } - - table.Name = name - table.StoreEngine = engine - tables = append(tables, table) - } - return tables, nil -} - -func (db *mysql) GetIndexes(tableName string) (map[string]*core.Index, error) { - args := []interface{}{db.DbName, tableName} - s := "SELECT `INDEX_NAME`, `NON_UNIQUE`, `COLUMN_NAME` FROM `INFORMATION_SCHEMA`.`STATISTICS` WHERE `TABLE_SCHEMA` = ? AND `TABLE_NAME` = ?" - db.LogSQL(s, args) - - rows, err := db.DB().Query(s, args...) - if err != nil { - return nil, err - } - defer rows.Close() - - indexes := make(map[string]*core.Index, 0) - for rows.Next() { - var indexType int - var indexName, colName, nonUnique string - err = rows.Scan(&indexName, &nonUnique, &colName) - if err != nil { - return nil, err - } - - if indexName == "PRIMARY" { - continue - } - - if "YES" == nonUnique || nonUnique == "1" { - indexType = core.IndexType - } else { - indexType = core.UniqueType - } - - colName = strings.Trim(colName, "` ") - var isRegular bool - if strings.HasPrefix(indexName, "IDX_"+tableName) || strings.HasPrefix(indexName, "UQE_"+tableName) { - indexName = indexName[5+len(tableName):] - isRegular = true - } - - var index *core.Index - var ok bool - if index, ok = indexes[indexName]; !ok { - index = new(core.Index) - index.IsRegular = isRegular - index.Type = indexType - index.Name = indexName - indexes[indexName] = index - } - index.AddColumn(colName) - } - return indexes, nil -} - -func (db *mysql) Filters() []core.Filter { - return []core.Filter{&core.IdFilter{}} -} diff --git a/vendor/github.com/go-xorm/xorm/mysql_driver.go b/vendor/github.com/go-xorm/xorm/mysql_driver.go deleted file mode 100644 index 6ceeed58f..000000000 --- a/vendor/github.com/go-xorm/xorm/mysql_driver.go +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2015 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xorm - -import ( - "regexp" - "strings" - - "github.com/go-xorm/core" -) - -type mysqlDriver struct { -} - -func (p *mysqlDriver) Parse(driverName, dataSourceName string) (*core.Uri, error) { - dsnPattern := regexp.MustCompile( - `^(?:(?P.*?)(?::(?P.*))?@)?` + // [user[:password]@] - `(?:(?P[^\(]*)(?:\((?P[^\)]*)\))?)?` + // [net[(addr)]] - `\/(?P.*?)` + // /dbname - `(?:\?(?P[^\?]*))?$`) // [?param1=value1¶mN=valueN] - matches := dsnPattern.FindStringSubmatch(dataSourceName) - //tlsConfigRegister := make(map[string]*tls.Config) - names := dsnPattern.SubexpNames() - - uri := &core.Uri{DbType: core.MYSQL} - - for i, match := range matches { - switch names[i] { - case "dbname": - uri.DbName = match - case "params": - if len(match) > 0 { - kvs := strings.Split(match, "&") - for _, kv := range kvs { - splits := strings.Split(kv, "=") - if len(splits) == 2 { - switch splits[0] { - case "charset": - uri.Charset = splits[1] - } - } - } - } - - } - } - return uri, nil -} diff --git a/vendor/github.com/go-xorm/xorm/oci8_driver.go b/vendor/github.com/go-xorm/xorm/oci8_driver.go deleted file mode 100644 index ec5f20228..000000000 --- a/vendor/github.com/go-xorm/xorm/oci8_driver.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2015 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xorm - -import ( - "errors" - "regexp" - - "github.com/go-xorm/core" -) - -type oci8Driver struct { -} - -//dataSourceName=user/password@ipv4:port/dbname -//dataSourceName=user/password@[ipv6]:port/dbname -func (p *oci8Driver) Parse(driverName, dataSourceName string) (*core.Uri, error) { - db := &core.Uri{DbType: core.ORACLE} - dsnPattern := regexp.MustCompile( - `^(?P.*)\/(?P.*)@` + // user:password@ - `(?P.*)` + // ip:port - `\/(?P.*)`) // dbname - matches := dsnPattern.FindStringSubmatch(dataSourceName) - names := dsnPattern.SubexpNames() - for i, match := range matches { - switch names[i] { - case "dbname": - db.DbName = match - } - } - if db.DbName == "" { - return nil, errors.New("dbname is empty") - } - return db, nil -} diff --git a/vendor/github.com/go-xorm/xorm/odbc_driver.go b/vendor/github.com/go-xorm/xorm/odbc_driver.go deleted file mode 100644 index 6770de607..000000000 --- a/vendor/github.com/go-xorm/xorm/odbc_driver.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2015 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xorm - -import ( - "errors" - "strings" - - "github.com/go-xorm/core" -) - -type odbcDriver struct { -} - -func (p *odbcDriver) Parse(driverName, dataSourceName string) (*core.Uri, error) { - kv := strings.Split(dataSourceName, ";") - var dbName string - - for _, c := range kv { - vv := strings.Split(strings.TrimSpace(c), "=") - if len(vv) == 2 { - switch strings.ToLower(vv[0]) { - case "database": - dbName = vv[1] - } - } - } - if dbName == "" { - return nil, errors.New("no db name provided") - } - return &core.Uri{DbName: dbName, DbType: core.MSSQL}, nil -} diff --git a/vendor/github.com/go-xorm/xorm/oracle_dialect.go b/vendor/github.com/go-xorm/xorm/oracle_dialect.go deleted file mode 100644 index b19ea38bb..000000000 --- a/vendor/github.com/go-xorm/xorm/oracle_dialect.go +++ /dev/null @@ -1,846 +0,0 @@ -// Copyright 2015 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xorm - -import ( - "fmt" - "strconv" - "strings" - - "github.com/go-xorm/core" -) - -var ( - oracleReservedWords = map[string]bool{ - "ACCESS": true, - "ACCOUNT": true, - "ACTIVATE": true, - "ADD": true, - "ADMIN": true, - "ADVISE": true, - "AFTER": true, - "ALL": true, - "ALL_ROWS": true, - "ALLOCATE": true, - "ALTER": true, - "ANALYZE": true, - "AND": true, - "ANY": true, - "ARCHIVE": true, - "ARCHIVELOG": true, - "ARRAY": true, - "AS": true, - "ASC": true, - "AT": true, - "AUDIT": true, - "AUTHENTICATED": true, - "AUTHORIZATION": true, - "AUTOEXTEND": true, - "AUTOMATIC": true, - "BACKUP": true, - "BECOME": true, - "BEFORE": true, - "BEGIN": true, - "BETWEEN": true, - "BFILE": true, - "BITMAP": true, - "BLOB": true, - "BLOCK": true, - "BODY": true, - "BY": true, - "CACHE": true, - "CACHE_INSTANCES": true, - "CANCEL": true, - "CASCADE": true, - "CAST": true, - "CFILE": true, - "CHAINED": true, - "CHANGE": true, - "CHAR": true, - "CHAR_CS": true, - "CHARACTER": true, - "CHECK": true, - "CHECKPOINT": true, - "CHOOSE": true, - "CHUNK": true, - "CLEAR": true, - "CLOB": true, - "CLONE": true, - "CLOSE": true, - "CLOSE_CACHED_OPEN_CURSORS": true, - "CLUSTER": true, - "COALESCE": true, - "COLUMN": true, - "COLUMNS": true, - "COMMENT": true, - "COMMIT": true, - "COMMITTED": true, - "COMPATIBILITY": true, - "COMPILE": true, - "COMPLETE": true, - "COMPOSITE_LIMIT": true, - "COMPRESS": true, - "COMPUTE": true, - "CONNECT": true, - "CONNECT_TIME": true, - "CONSTRAINT": true, - "CONSTRAINTS": true, - "CONTENTS": true, - "CONTINUE": true, - "CONTROLFILE": true, - "CONVERT": true, - "COST": true, - "CPU_PER_CALL": true, - "CPU_PER_SESSION": true, - "CREATE": true, - "CURRENT": true, - "CURRENT_SCHEMA": true, - "CURREN_USER": true, - "CURSOR": true, - "CYCLE": true, - "DANGLING": true, - "DATABASE": true, - "DATAFILE": true, - "DATAFILES": true, - "DATAOBJNO": true, - "DATE": true, - "DBA": true, - "DBHIGH": true, - "DBLOW": true, - "DBMAC": true, - "DEALLOCATE": true, - "DEBUG": true, - "DEC": true, - "DECIMAL": true, - "DECLARE": true, - "DEFAULT": true, - "DEFERRABLE": true, - "DEFERRED": true, - "DEGREE": true, - "DELETE": true, - "DEREF": true, - "DESC": true, - "DIRECTORY": true, - "DISABLE": true, - "DISCONNECT": true, - "DISMOUNT": true, - "DISTINCT": true, - "DISTRIBUTED": true, - "DML": true, - "DOUBLE": true, - "DROP": true, - "DUMP": true, - "EACH": true, - "ELSE": true, - "ENABLE": true, - "END": true, - "ENFORCE": true, - "ENTRY": true, - "ESCAPE": true, - "EXCEPT": true, - "EXCEPTIONS": true, - "EXCHANGE": true, - "EXCLUDING": true, - "EXCLUSIVE": true, - "EXECUTE": true, - "EXISTS": true, - "EXPIRE": true, - "EXPLAIN": true, - "EXTENT": true, - "EXTENTS": true, - "EXTERNALLY": true, - "FAILED_LOGIN_ATTEMPTS": true, - "FALSE": true, - "FAST": true, - "FILE": true, - "FIRST_ROWS": true, - "FLAGGER": true, - "FLOAT": true, - "FLOB": true, - "FLUSH": true, - "FOR": true, - "FORCE": true, - "FOREIGN": true, - "FREELIST": true, - "FREELISTS": true, - "FROM": true, - "FULL": true, - "FUNCTION": true, - "GLOBAL": true, - "GLOBALLY": true, - "GLOBAL_NAME": true, - "GRANT": true, - "GROUP": true, - "GROUPS": true, - "HASH": true, - "HASHKEYS": true, - "HAVING": true, - "HEADER": true, - "HEAP": true, - "IDENTIFIED": true, - "IDGENERATORS": true, - "IDLE_TIME": true, - "IF": true, - "IMMEDIATE": true, - "IN": true, - "INCLUDING": true, - "INCREMENT": true, - "INDEX": true, - "INDEXED": true, - "INDEXES": true, - "INDICATOR": true, - "IND_PARTITION": true, - "INITIAL": true, - "INITIALLY": true, - "INITRANS": true, - "INSERT": true, - "INSTANCE": true, - "INSTANCES": true, - "INSTEAD": true, - "INT": true, - "INTEGER": true, - "INTERMEDIATE": true, - "INTERSECT": true, - "INTO": true, - "IS": true, - "ISOLATION": true, - "ISOLATION_LEVEL": true, - "KEEP": true, - "KEY": true, - "KILL": true, - "LABEL": true, - "LAYER": true, - "LESS": true, - "LEVEL": true, - "LIBRARY": true, - "LIKE": true, - "LIMIT": true, - "LINK": true, - "LIST": true, - "LOB": true, - "LOCAL": true, - "LOCK": true, - "LOCKED": true, - "LOG": true, - "LOGFILE": true, - "LOGGING": true, - "LOGICAL_READS_PER_CALL": true, - "LOGICAL_READS_PER_SESSION": true, - "LONG": true, - "MANAGE": true, - "MASTER": true, - "MAX": true, - "MAXARCHLOGS": true, - "MAXDATAFILES": true, - "MAXEXTENTS": true, - "MAXINSTANCES": true, - "MAXLOGFILES": true, - "MAXLOGHISTORY": true, - "MAXLOGMEMBERS": true, - "MAXSIZE": true, - "MAXTRANS": true, - "MAXVALUE": true, - "MIN": true, - "MEMBER": true, - "MINIMUM": true, - "MINEXTENTS": true, - "MINUS": true, - "MINVALUE": true, - "MLSLABEL": true, - "MLS_LABEL_FORMAT": true, - "MODE": true, - "MODIFY": true, - "MOUNT": true, - "MOVE": true, - "MTS_DISPATCHERS": true, - "MULTISET": true, - "NATIONAL": true, - "NCHAR": true, - "NCHAR_CS": true, - "NCLOB": true, - "NEEDED": true, - "NESTED": true, - "NETWORK": true, - "NEW": true, - "NEXT": true, - "NOARCHIVELOG": true, - "NOAUDIT": true, - "NOCACHE": true, - "NOCOMPRESS": true, - "NOCYCLE": true, - "NOFORCE": true, - "NOLOGGING": true, - "NOMAXVALUE": true, - "NOMINVALUE": true, - "NONE": true, - "NOORDER": true, - "NOOVERRIDE": true, - "NOPARALLEL": true, - "NOREVERSE": true, - "NORMAL": true, - "NOSORT": true, - "NOT": true, - "NOTHING": true, - "NOWAIT": true, - "NULL": true, - "NUMBER": true, - "NUMERIC": true, - "NVARCHAR2": true, - "OBJECT": true, - "OBJNO": true, - "OBJNO_REUSE": true, - "OF": true, - "OFF": true, - "OFFLINE": true, - "OID": true, - "OIDINDEX": true, - "OLD": true, - "ON": true, - "ONLINE": true, - "ONLY": true, - "OPCODE": true, - "OPEN": true, - "OPTIMAL": true, - "OPTIMIZER_GOAL": true, - "OPTION": true, - "OR": true, - "ORDER": true, - "ORGANIZATION": true, - "OSLABEL": true, - "OVERFLOW": true, - "OWN": true, - "PACKAGE": true, - "PARALLEL": true, - "PARTITION": true, - "PASSWORD": true, - "PASSWORD_GRACE_TIME": true, - "PASSWORD_LIFE_TIME": true, - "PASSWORD_LOCK_TIME": true, - "PASSWORD_REUSE_MAX": true, - "PASSWORD_REUSE_TIME": true, - "PASSWORD_VERIFY_FUNCTION": true, - "PCTFREE": true, - "PCTINCREASE": true, - "PCTTHRESHOLD": true, - "PCTUSED": true, - "PCTVERSION": true, - "PERCENT": true, - "PERMANENT": true, - "PLAN": true, - "PLSQL_DEBUG": true, - "POST_TRANSACTION": true, - "PRECISION": true, - "PRESERVE": true, - "PRIMARY": true, - "PRIOR": true, - "PRIVATE": true, - "PRIVATE_SGA": true, - "PRIVILEGE": true, - "PRIVILEGES": true, - "PROCEDURE": true, - "PROFILE": true, - "PUBLIC": true, - "PURGE": true, - "QUEUE": true, - "QUOTA": true, - "RANGE": true, - "RAW": true, - "RBA": true, - "READ": true, - "READUP": true, - "REAL": true, - "REBUILD": true, - "RECOVER": true, - "RECOVERABLE": true, - "RECOVERY": true, - "REF": true, - "REFERENCES": true, - "REFERENCING": true, - "REFRESH": true, - "RENAME": true, - "REPLACE": true, - "RESET": true, - "RESETLOGS": true, - "RESIZE": true, - "RESOURCE": true, - "RESTRICTED": true, - "RETURN": true, - "RETURNING": true, - "REUSE": true, - "REVERSE": true, - "REVOKE": true, - "ROLE": true, - "ROLES": true, - "ROLLBACK": true, - "ROW": true, - "ROWID": true, - "ROWNUM": true, - "ROWS": true, - "RULE": true, - "SAMPLE": true, - "SAVEPOINT": true, - "SB4": true, - "SCAN_INSTANCES": true, - "SCHEMA": true, - "SCN": true, - "SCOPE": true, - "SD_ALL": true, - "SD_INHIBIT": true, - "SD_SHOW": true, - "SEGMENT": true, - "SEG_BLOCK": true, - "SEG_FILE": true, - "SELECT": true, - "SEQUENCE": true, - "SERIALIZABLE": true, - "SESSION": true, - "SESSION_CACHED_CURSORS": true, - "SESSIONS_PER_USER": true, - "SET": true, - "SHARE": true, - "SHARED": true, - "SHARED_POOL": true, - "SHRINK": true, - "SIZE": true, - "SKIP": true, - "SKIP_UNUSABLE_INDEXES": true, - "SMALLINT": true, - "SNAPSHOT": true, - "SOME": true, - "SORT": true, - "SPECIFICATION": true, - "SPLIT": true, - "SQL_TRACE": true, - "STANDBY": true, - "START": true, - "STATEMENT_ID": true, - "STATISTICS": true, - "STOP": true, - "STORAGE": true, - "STORE": true, - "STRUCTURE": true, - "SUCCESSFUL": true, - "SWITCH": true, - "SYS_OP_ENFORCE_NOT_NULL$": true, - "SYS_OP_NTCIMG$": true, - "SYNONYM": true, - "SYSDATE": true, - "SYSDBA": true, - "SYSOPER": true, - "SYSTEM": true, - "TABLE": true, - "TABLES": true, - "TABLESPACE": true, - "TABLESPACE_NO": true, - "TABNO": true, - "TEMPORARY": true, - "THAN": true, - "THE": true, - "THEN": true, - "THREAD": true, - "TIMESTAMP": true, - "TIME": true, - "TO": true, - "TOPLEVEL": true, - "TRACE": true, - "TRACING": true, - "TRANSACTION": true, - "TRANSITIONAL": true, - "TRIGGER": true, - "TRIGGERS": true, - "TRUE": true, - "TRUNCATE": true, - "TX": true, - "TYPE": true, - "UB2": true, - "UBA": true, - "UID": true, - "UNARCHIVED": true, - "UNDO": true, - "UNION": true, - "UNIQUE": true, - "UNLIMITED": true, - "UNLOCK": true, - "UNRECOVERABLE": true, - "UNTIL": true, - "UNUSABLE": true, - "UNUSED": true, - "UPDATABLE": true, - "UPDATE": true, - "USAGE": true, - "USE": true, - "USER": true, - "USING": true, - "VALIDATE": true, - "VALIDATION": true, - "VALUE": true, - "VALUES": true, - "VARCHAR": true, - "VARCHAR2": true, - "VARYING": true, - "VIEW": true, - "WHEN": true, - "WHENEVER": true, - "WHERE": true, - "WITH": true, - "WITHOUT": true, - "WORK": true, - "WRITE": true, - "WRITEDOWN": true, - "WRITEUP": true, - "XID": true, - "YEAR": true, - "ZONE": true, - } -) - -type oracle struct { - core.Base -} - -func (db *oracle) Init(d *core.DB, uri *core.Uri, drivername, dataSourceName string) error { - return db.Base.Init(d, db, uri, drivername, dataSourceName) -} - -func (db *oracle) SqlType(c *core.Column) string { - var res string - switch t := c.SQLType.Name; t { - case core.Bit, core.TinyInt, core.SmallInt, core.MediumInt, core.Int, core.Integer, core.BigInt, core.Bool, core.Serial, core.BigSerial: - res = "NUMBER" - case core.Binary, core.VarBinary, core.Blob, core.TinyBlob, core.MediumBlob, core.LongBlob, core.Bytea: - return core.Blob - case core.Time, core.DateTime, core.TimeStamp: - res = core.TimeStamp - case core.TimeStampz: - res = "TIMESTAMP WITH TIME ZONE" - case core.Float, core.Double, core.Numeric, core.Decimal: - res = "NUMBER" - case core.Text, core.MediumText, core.LongText, core.Json: - res = "CLOB" - case core.Char, core.Varchar, core.TinyText: - res = "VARCHAR2" - default: - res = t - } - - hasLen1 := (c.Length > 0) - hasLen2 := (c.Length2 > 0) - - if hasLen2 { - res += "(" + strconv.Itoa(c.Length) + "," + strconv.Itoa(c.Length2) + ")" - } else if hasLen1 { - res += "(" + strconv.Itoa(c.Length) + ")" - } - return res -} - -func (db *oracle) AutoIncrStr() string { - return "AUTO_INCREMENT" -} - -func (db *oracle) SupportInsertMany() bool { - return true -} - -func (db *oracle) IsReserved(name string) bool { - _, ok := oracleReservedWords[name] - return ok -} - -func (db *oracle) Quote(name string) string { - return "\"" + name + "\"" -} - -func (db *oracle) QuoteStr() string { - return "\"" -} - -func (db *oracle) SupportEngine() bool { - return false -} - -func (db *oracle) SupportCharset() bool { - return false -} - -func (db *oracle) SupportDropIfExists() bool { - return false -} - -func (db *oracle) IndexOnTable() bool { - return false -} - -func (db *oracle) DropTableSql(tableName string) string { - return fmt.Sprintf("DROP TABLE `%s`", tableName) -} - -func (db *oracle) CreateTableSql(table *core.Table, tableName, storeEngine, charset string) string { - var sql string - sql = "CREATE TABLE " - if tableName == "" { - tableName = table.Name - } - - sql += db.Quote(tableName) + " (" - - pkList := table.PrimaryKeys - - for _, colName := range table.ColumnsSeq() { - col := table.GetColumn(colName) - /*if col.IsPrimaryKey && len(pkList) == 1 { - sql += col.String(b.dialect) - } else {*/ - sql += col.StringNoPk(db) - //} - sql = strings.TrimSpace(sql) - sql += ", " - } - - if len(pkList) > 0 { - sql += "PRIMARY KEY ( " - sql += db.Quote(strings.Join(pkList, db.Quote(","))) - sql += " ), " - } - - sql = sql[:len(sql)-2] + ")" - if db.SupportEngine() && storeEngine != "" { - sql += " ENGINE=" + storeEngine - } - if db.SupportCharset() { - if len(charset) == 0 { - charset = db.URI().Charset - } - if len(charset) > 0 { - sql += " DEFAULT CHARSET " + charset - } - } - return sql -} - -func (db *oracle) IndexCheckSql(tableName, idxName string) (string, []interface{}) { - args := []interface{}{tableName, idxName} - return `SELECT INDEX_NAME FROM USER_INDEXES ` + - `WHERE TABLE_NAME = :1 AND INDEX_NAME = :2`, args -} - -func (db *oracle) TableCheckSql(tableName string) (string, []interface{}) { - args := []interface{}{tableName} - return `SELECT table_name FROM user_tables WHERE table_name = :1`, args -} - -func (db *oracle) MustDropTable(tableName string) error { - sql, args := db.TableCheckSql(tableName) - db.LogSQL(sql, args) - - rows, err := db.DB().Query(sql, args...) - if err != nil { - return err - } - defer rows.Close() - - if !rows.Next() { - return nil - } - - sql = "Drop Table \"" + tableName + "\"" - db.LogSQL(sql, args) - - _, err = db.DB().Exec(sql) - return err -} - -/*func (db *oracle) ColumnCheckSql(tableName, colName string) (string, []interface{}) { - args := []interface{}{strings.ToUpper(tableName), strings.ToUpper(colName)} - return "SELECT column_name FROM USER_TAB_COLUMNS WHERE table_name = ?" + - " AND column_name = ?", args -}*/ - -func (db *oracle) IsColumnExist(tableName, colName string) (bool, error) { - args := []interface{}{tableName, colName} - query := "SELECT column_name FROM USER_TAB_COLUMNS WHERE table_name = :1" + - " AND column_name = :2" - db.LogSQL(query, args) - - rows, err := db.DB().Query(query, args...) - if err != nil { - return false, err - } - defer rows.Close() - - if rows.Next() { - return true, nil - } - return false, nil -} - -func (db *oracle) GetColumns(tableName string) ([]string, map[string]*core.Column, error) { - args := []interface{}{tableName} - s := "SELECT column_name,data_default,data_type,data_length,data_precision,data_scale," + - "nullable FROM USER_TAB_COLUMNS WHERE table_name = :1" - db.LogSQL(s, args) - - rows, err := db.DB().Query(s, args...) - if err != nil { - return nil, nil, err - } - defer rows.Close() - - cols := make(map[string]*core.Column) - colSeq := make([]string, 0) - for rows.Next() { - col := new(core.Column) - col.Indexes = make(map[string]int) - - var colName, colDefault, nullable, dataType, dataPrecision, dataScale *string - var dataLen int - - err = rows.Scan(&colName, &colDefault, &dataType, &dataLen, &dataPrecision, - &dataScale, &nullable) - if err != nil { - return nil, nil, err - } - - col.Name = strings.Trim(*colName, `" `) - if colDefault != nil { - col.Default = *colDefault - col.DefaultIsEmpty = false - } - - if *nullable == "Y" { - col.Nullable = true - } else { - col.Nullable = false - } - - var ignore bool - - var dt string - var len1, len2 int - dts := strings.Split(*dataType, "(") - dt = dts[0] - if len(dts) > 1 { - lens := strings.Split(dts[1][:len(dts[1])-1], ",") - if len(lens) > 1 { - len1, _ = strconv.Atoi(lens[0]) - len2, _ = strconv.Atoi(lens[1]) - } else { - len1, _ = strconv.Atoi(lens[0]) - } - } - - switch dt { - case "VARCHAR2": - col.SQLType = core.SQLType{Name: core.Varchar, DefaultLength: len1, DefaultLength2: len2} - case "NVARCHAR2": - col.SQLType = core.SQLType{Name: core.NVarchar, DefaultLength: len1, DefaultLength2: len2} - case "TIMESTAMP WITH TIME ZONE": - col.SQLType = core.SQLType{Name: core.TimeStampz, DefaultLength: 0, DefaultLength2: 0} - case "NUMBER": - col.SQLType = core.SQLType{Name: core.Double, DefaultLength: len1, DefaultLength2: len2} - case "LONG", "LONG RAW": - col.SQLType = core.SQLType{Name: core.Text, DefaultLength: 0, DefaultLength2: 0} - case "RAW": - col.SQLType = core.SQLType{Name: core.Binary, DefaultLength: 0, DefaultLength2: 0} - case "ROWID": - col.SQLType = core.SQLType{Name: core.Varchar, DefaultLength: 18, DefaultLength2: 0} - case "AQ$_SUBSCRIBERS": - ignore = true - default: - col.SQLType = core.SQLType{Name: strings.ToUpper(dt), DefaultLength: len1, DefaultLength2: len2} - } - - if ignore { - continue - } - - if _, ok := core.SqlTypes[col.SQLType.Name]; !ok { - return nil, nil, fmt.Errorf("Unknown colType %v %v", *dataType, col.SQLType) - } - - col.Length = dataLen - - if col.SQLType.IsText() || col.SQLType.IsTime() { - if !col.DefaultIsEmpty { - col.Default = "'" + col.Default + "'" - } - } - cols[col.Name] = col - colSeq = append(colSeq, col.Name) - } - - return colSeq, cols, nil -} - -func (db *oracle) GetTables() ([]*core.Table, error) { - args := []interface{}{} - s := "SELECT table_name FROM user_tables" - db.LogSQL(s, args) - - rows, err := db.DB().Query(s, args...) - if err != nil { - return nil, err - } - defer rows.Close() - - tables := make([]*core.Table, 0) - for rows.Next() { - table := core.NewEmptyTable() - err = rows.Scan(&table.Name) - if err != nil { - return nil, err - } - - tables = append(tables, table) - } - return tables, nil -} - -func (db *oracle) GetIndexes(tableName string) (map[string]*core.Index, error) { - args := []interface{}{tableName} - s := "SELECT t.column_name,i.uniqueness,i.index_name FROM user_ind_columns t,user_indexes i " + - "WHERE t.index_name = i.index_name and t.table_name = i.table_name and t.table_name =:1" - db.LogSQL(s, args) - - rows, err := db.DB().Query(s, args...) - if err != nil { - return nil, err - } - defer rows.Close() - - indexes := make(map[string]*core.Index, 0) - for rows.Next() { - var indexType int - var indexName, colName, uniqueness string - - err = rows.Scan(&colName, &uniqueness, &indexName) - if err != nil { - return nil, err - } - - indexName = strings.Trim(indexName, `" `) - - if uniqueness == "UNIQUE" { - indexType = core.UniqueType - } else { - indexType = core.IndexType - } - - var index *core.Index - var ok bool - if index, ok = indexes[indexName]; !ok { - index = new(core.Index) - index.Type = indexType - index.Name = indexName - indexes[indexName] = index - } - index.AddColumn(colName) - } - return indexes, nil -} - -func (db *oracle) Filters() []core.Filter { - return []core.Filter{&core.QuoteFilter{}, &core.SeqFilter{Prefix: ":", Start: 1}, &core.IdFilter{}} -} diff --git a/vendor/github.com/go-xorm/xorm/pg_reserved.txt b/vendor/github.com/go-xorm/xorm/pg_reserved.txt deleted file mode 100644 index 720ed377b..000000000 --- a/vendor/github.com/go-xorm/xorm/pg_reserved.txt +++ /dev/null @@ -1,746 +0,0 @@ -A non-reserved non-reserved -ABORT non-reserved -ABS reserved reserved -ABSENT non-reserved non-reserved -ABSOLUTE non-reserved non-reserved non-reserved reserved -ACCESS non-reserved -ACCORDING non-reserved non-reserved -ACTION non-reserved non-reserved non-reserved reserved -ADA non-reserved non-reserved non-reserved -ADD non-reserved non-reserved non-reserved reserved -ADMIN non-reserved non-reserved non-reserved -AFTER non-reserved non-reserved non-reserved -AGGREGATE non-reserved -ALL reserved reserved reserved reserved -ALLOCATE reserved reserved reserved -ALSO non-reserved -ALTER non-reserved reserved reserved reserved -ALWAYS non-reserved non-reserved non-reserved -ANALYSE reserved -ANALYZE reserved -AND reserved reserved reserved reserved -ANY reserved reserved reserved reserved -ARE reserved reserved reserved -ARRAY reserved reserved reserved -ARRAY_AGG reserved reserved -ARRAY_MAX_CARDINALITY reserved -AS reserved reserved reserved reserved -ASC reserved non-reserved non-reserved reserved -ASENSITIVE reserved reserved -ASSERTION non-reserved non-reserved non-reserved reserved -ASSIGNMENT non-reserved non-reserved non-reserved -ASYMMETRIC reserved reserved reserved -AT non-reserved reserved reserved reserved -ATOMIC reserved reserved -ATTRIBUTE non-reserved non-reserved non-reserved -ATTRIBUTES non-reserved non-reserved -AUTHORIZATION reserved (can be function or type) reserved reserved reserved -AVG reserved reserved reserved -BACKWARD non-reserved -BASE64 non-reserved non-reserved -BEFORE non-reserved non-reserved non-reserved -BEGIN non-reserved reserved reserved reserved -BEGIN_FRAME reserved -BEGIN_PARTITION reserved -BERNOULLI non-reserved non-reserved -BETWEEN non-reserved (cannot be function or type) reserved reserved reserved -BIGINT non-reserved (cannot be function or type) reserved reserved -BINARY reserved (can be function or type) reserved reserved -BIT non-reserved (cannot be function or type) reserved -BIT_LENGTH reserved -BLOB reserved reserved -BLOCKED non-reserved non-reserved -BOM non-reserved non-reserved -BOOLEAN non-reserved (cannot be function or type) reserved reserved -BOTH reserved reserved reserved reserved -BREADTH non-reserved non-reserved -BY non-reserved reserved reserved reserved -C non-reserved non-reserved non-reserved -CACHE non-reserved -CALL reserved reserved -CALLED non-reserved reserved reserved -CARDINALITY reserved reserved -CASCADE non-reserved non-reserved non-reserved reserved -CASCADED non-reserved reserved reserved reserved -CASE reserved reserved reserved reserved -CAST reserved reserved reserved reserved -CATALOG non-reserved non-reserved non-reserved reserved -CATALOG_NAME non-reserved non-reserved non-reserved -CEIL reserved reserved -CEILING reserved reserved -CHAIN non-reserved non-reserved non-reserved -CHAR non-reserved (cannot be function or type) reserved reserved reserved -CHARACTER non-reserved (cannot be function or type) reserved reserved reserved -CHARACTERISTICS non-reserved non-reserved non-reserved -CHARACTERS non-reserved non-reserved -CHARACTER_LENGTH reserved reserved reserved -CHARACTER_SET_CATALOG non-reserved non-reserved non-reserved -CHARACTER_SET_NAME non-reserved non-reserved non-reserved -CHARACTER_SET_SCHEMA non-reserved non-reserved non-reserved -CHAR_LENGTH reserved reserved reserved -CHECK reserved reserved reserved reserved -CHECKPOINT non-reserved -CLASS non-reserved -CLASS_ORIGIN non-reserved non-reserved non-reserved -CLOB reserved reserved -CLOSE non-reserved reserved reserved reserved -CLUSTER non-reserved -COALESCE non-reserved (cannot be function or type) reserved reserved reserved -COBOL non-reserved non-reserved non-reserved -COLLATE reserved reserved reserved reserved -COLLATION reserved (can be function or type) non-reserved non-reserved reserved -COLLATION_CATALOG non-reserved non-reserved non-reserved -COLLATION_NAME non-reserved non-reserved non-reserved -COLLATION_SCHEMA non-reserved non-reserved non-reserved -COLLECT reserved reserved -COLUMN reserved reserved reserved reserved -COLUMNS non-reserved non-reserved -COLUMN_NAME non-reserved non-reserved non-reserved -COMMAND_FUNCTION non-reserved non-reserved non-reserved -COMMAND_FUNCTION_CODE non-reserved non-reserved -COMMENT non-reserved -COMMENTS non-reserved -COMMIT non-reserved reserved reserved reserved -COMMITTED non-reserved non-reserved non-reserved non-reserved -CONCURRENTLY reserved (can be function or type) -CONDITION reserved reserved -CONDITION_NUMBER non-reserved non-reserved non-reserved -CONFIGURATION non-reserved -CONNECT reserved reserved reserved -CONNECTION non-reserved non-reserved non-reserved reserved -CONNECTION_NAME non-reserved non-reserved non-reserved -CONSTRAINT reserved reserved reserved reserved -CONSTRAINTS non-reserved non-reserved non-reserved reserved -CONSTRAINT_CATALOG non-reserved non-reserved non-reserved -CONSTRAINT_NAME non-reserved non-reserved non-reserved -CONSTRAINT_SCHEMA non-reserved non-reserved non-reserved -CONSTRUCTOR non-reserved non-reserved -CONTAINS reserved non-reserved -CONTENT non-reserved non-reserved non-reserved -CONTINUE non-reserved non-reserved non-reserved reserved -CONTROL non-reserved non-reserved -CONVERSION non-reserved -CONVERT reserved reserved reserved -COPY non-reserved -CORR reserved reserved -CORRESPONDING reserved reserved reserved -COST non-reserved -COUNT reserved reserved reserved -COVAR_POP reserved reserved -COVAR_SAMP reserved reserved -CREATE reserved reserved reserved reserved -CROSS reserved (can be function or type) reserved reserved reserved -CSV non-reserved -CUBE reserved reserved -CUME_DIST reserved reserved -CURRENT non-reserved reserved reserved reserved -CURRENT_CATALOG reserved reserved reserved -CURRENT_DATE reserved reserved reserved reserved -CURRENT_DEFAULT_TRANSFORM_GROUP reserved reserved -CURRENT_PATH reserved reserved -CURRENT_ROLE reserved reserved reserved -CURRENT_ROW reserved -CURRENT_SCHEMA reserved (can be function or type) reserved reserved -CURRENT_TIME reserved reserved reserved reserved -CURRENT_TIMESTAMP reserved reserved reserved reserved -CURRENT_TRANSFORM_GROUP_FOR_TYPE reserved reserved -CURRENT_USER reserved reserved reserved reserved -CURSOR non-reserved reserved reserved reserved -CURSOR_NAME non-reserved non-reserved non-reserved -CYCLE non-reserved reserved reserved -DATA non-reserved non-reserved non-reserved non-reserved -DATABASE non-reserved -DATALINK reserved reserved -DATE reserved reserved reserved -DATETIME_INTERVAL_CODE non-reserved non-reserved non-reserved -DATETIME_INTERVAL_PRECISION non-reserved non-reserved non-reserved -DAY non-reserved reserved reserved reserved -DB non-reserved non-reserved -DEALLOCATE non-reserved reserved reserved reserved -DEC non-reserved (cannot be function or type) reserved reserved reserved -DECIMAL non-reserved (cannot be function or type) reserved reserved reserved -DECLARE non-reserved reserved reserved reserved -DEFAULT reserved reserved reserved reserved -DEFAULTS non-reserved non-reserved non-reserved -DEFERRABLE reserved non-reserved non-reserved reserved -DEFERRED non-reserved non-reserved non-reserved reserved -DEFINED non-reserved non-reserved -DEFINER non-reserved non-reserved non-reserved -DEGREE non-reserved non-reserved -DELETE non-reserved reserved reserved reserved -DELIMITER non-reserved -DELIMITERS non-reserved -DENSE_RANK reserved reserved -DEPTH non-reserved non-reserved -DEREF reserved reserved -DERIVED non-reserved non-reserved -DESC reserved non-reserved non-reserved reserved -DESCRIBE reserved reserved reserved -DESCRIPTOR non-reserved non-reserved reserved -DETERMINISTIC reserved reserved -DIAGNOSTICS non-reserved non-reserved reserved -DICTIONARY non-reserved -DISABLE non-reserved -DISCARD non-reserved -DISCONNECT reserved reserved reserved -DISPATCH non-reserved non-reserved -DISTINCT reserved reserved reserved reserved -DLNEWCOPY reserved reserved -DLPREVIOUSCOPY reserved reserved -DLURLCOMPLETE reserved reserved -DLURLCOMPLETEONLY reserved reserved -DLURLCOMPLETEWRITE reserved reserved -DLURLPATH reserved reserved -DLURLPATHONLY reserved reserved -DLURLPATHWRITE reserved reserved -DLURLSCHEME reserved reserved -DLURLSERVER reserved reserved -DLVALUE reserved reserved -DO reserved -DOCUMENT non-reserved non-reserved non-reserved -DOMAIN non-reserved non-reserved non-reserved reserved -DOUBLE non-reserved reserved reserved reserved -DROP non-reserved reserved reserved reserved -DYNAMIC reserved reserved -DYNAMIC_FUNCTION non-reserved non-reserved non-reserved -DYNAMIC_FUNCTION_CODE non-reserved non-reserved -EACH non-reserved reserved reserved -ELEMENT reserved reserved -ELSE reserved reserved reserved reserved -EMPTY non-reserved non-reserved -ENABLE non-reserved -ENCODING non-reserved non-reserved non-reserved -ENCRYPTED non-reserved -END reserved reserved reserved reserved -END-EXEC reserved reserved reserved -END_FRAME reserved -END_PARTITION reserved -ENFORCED non-reserved -ENUM non-reserved -EQUALS reserved non-reserved -ESCAPE non-reserved reserved reserved reserved -EVENT non-reserved -EVERY reserved reserved -EXCEPT reserved reserved reserved reserved -EXCEPTION reserved -EXCLUDE non-reserved non-reserved non-reserved -EXCLUDING non-reserved non-reserved non-reserved -EXCLUSIVE non-reserved -EXEC reserved reserved reserved -EXECUTE non-reserved reserved reserved reserved -EXISTS non-reserved (cannot be function or type) reserved reserved reserved -EXP reserved reserved -EXPLAIN non-reserved -EXPRESSION non-reserved -EXTENSION non-reserved -EXTERNAL non-reserved reserved reserved reserved -EXTRACT non-reserved (cannot be function or type) reserved reserved reserved -FALSE reserved reserved reserved reserved -FAMILY non-reserved -FETCH reserved reserved reserved reserved -FILE non-reserved non-reserved -FILTER reserved reserved -FINAL non-reserved non-reserved -FIRST non-reserved non-reserved non-reserved reserved -FIRST_VALUE reserved reserved -FLAG non-reserved non-reserved -FLOAT non-reserved (cannot be function or type) reserved reserved reserved -FLOOR reserved reserved -FOLLOWING non-reserved non-reserved non-reserved -FOR reserved reserved reserved reserved -FORCE non-reserved -FOREIGN reserved reserved reserved reserved -FORTRAN non-reserved non-reserved non-reserved -FORWARD non-reserved -FOUND non-reserved non-reserved reserved -FRAME_ROW reserved -FREE reserved reserved -FREEZE reserved (can be function or type) -FROM reserved reserved reserved reserved -FS non-reserved non-reserved -FULL reserved (can be function or type) reserved reserved reserved -FUNCTION non-reserved reserved reserved -FUNCTIONS non-reserved -FUSION reserved reserved -G non-reserved non-reserved -GENERAL non-reserved non-reserved -GENERATED non-reserved non-reserved -GET reserved reserved reserved -GLOBAL non-reserved reserved reserved reserved -GO non-reserved non-reserved reserved -GOTO non-reserved non-reserved reserved -GRANT reserved reserved reserved reserved -GRANTED non-reserved non-reserved non-reserved -GREATEST non-reserved (cannot be function or type) -GROUP reserved reserved reserved reserved -GROUPING reserved reserved -GROUPS reserved -HANDLER non-reserved -HAVING reserved reserved reserved reserved -HEADER non-reserved -HEX non-reserved non-reserved -HIERARCHY non-reserved non-reserved -HOLD non-reserved reserved reserved -HOUR non-reserved reserved reserved reserved -ID non-reserved non-reserved -IDENTITY non-reserved reserved reserved reserved -IF non-reserved -IGNORE non-reserved non-reserved -ILIKE reserved (can be function or type) -IMMEDIATE non-reserved non-reserved non-reserved reserved -IMMEDIATELY non-reserved -IMMUTABLE non-reserved -IMPLEMENTATION non-reserved non-reserved -IMPLICIT non-reserved -IMPORT reserved reserved -IN reserved reserved reserved reserved -INCLUDING non-reserved non-reserved non-reserved -INCREMENT non-reserved non-reserved non-reserved -INDENT non-reserved non-reserved -INDEX non-reserved -INDEXES non-reserved -INDICATOR reserved reserved reserved -INHERIT non-reserved -INHERITS non-reserved -INITIALLY reserved non-reserved non-reserved reserved -INLINE non-reserved -INNER reserved (can be function or type) reserved reserved reserved -INOUT non-reserved (cannot be function or type) reserved reserved -INPUT non-reserved non-reserved non-reserved reserved -INSENSITIVE non-reserved reserved reserved reserved -INSERT non-reserved reserved reserved reserved -INSTANCE non-reserved non-reserved -INSTANTIABLE non-reserved non-reserved -INSTEAD non-reserved non-reserved non-reserved -INT non-reserved (cannot be function or type) reserved reserved reserved -INTEGER non-reserved (cannot be function or type) reserved reserved reserved -INTEGRITY non-reserved non-reserved -INTERSECT reserved reserved reserved reserved -INTERSECTION reserved reserved -INTERVAL non-reserved (cannot be function or type) reserved reserved reserved -INTO reserved reserved reserved reserved -INVOKER non-reserved non-reserved non-reserved -IS reserved (can be function or type) reserved reserved reserved -ISNULL reserved (can be function or type) -ISOLATION non-reserved non-reserved non-reserved reserved -JOIN reserved (can be function or type) reserved reserved reserved -K non-reserved non-reserved -KEY non-reserved non-reserved non-reserved reserved -KEY_MEMBER non-reserved non-reserved -KEY_TYPE non-reserved non-reserved -LABEL non-reserved -LAG reserved reserved -LANGUAGE non-reserved reserved reserved reserved -LARGE non-reserved reserved reserved -LAST non-reserved non-reserved non-reserved reserved -LAST_VALUE reserved reserved -LATERAL reserved reserved reserved -LC_COLLATE non-reserved -LC_CTYPE non-reserved -LEAD reserved reserved -LEADING reserved reserved reserved reserved -LEAKPROOF non-reserved -LEAST non-reserved (cannot be function or type) -LEFT reserved (can be function or type) reserved reserved reserved -LENGTH non-reserved non-reserved non-reserved -LEVEL non-reserved non-reserved non-reserved reserved -LIBRARY non-reserved non-reserved -LIKE reserved (can be function or type) reserved reserved reserved -LIKE_REGEX reserved reserved -LIMIT reserved non-reserved non-reserved -LINK non-reserved non-reserved -LISTEN non-reserved -LN reserved reserved -LOAD non-reserved -LOCAL non-reserved reserved reserved reserved -LOCALTIME reserved reserved reserved -LOCALTIMESTAMP reserved reserved reserved -LOCATION non-reserved non-reserved non-reserved -LOCATOR non-reserved non-reserved -LOCK non-reserved -LOWER reserved reserved reserved -M non-reserved non-reserved -MAP non-reserved non-reserved -MAPPING non-reserved non-reserved non-reserved -MATCH non-reserved reserved reserved reserved -MATCHED non-reserved non-reserved -MATERIALIZED non-reserved -MAX reserved reserved reserved -MAXVALUE non-reserved non-reserved non-reserved -MAX_CARDINALITY reserved -MEMBER reserved reserved -MERGE reserved reserved -MESSAGE_LENGTH non-reserved non-reserved non-reserved -MESSAGE_OCTET_LENGTH non-reserved non-reserved non-reserved -MESSAGE_TEXT non-reserved non-reserved non-reserved -METHOD reserved reserved -MIN reserved reserved reserved -MINUTE non-reserved reserved reserved reserved -MINVALUE non-reserved non-reserved non-reserved -MOD reserved reserved -MODE non-reserved -MODIFIES reserved reserved -MODULE reserved reserved reserved -MONTH non-reserved reserved reserved reserved -MORE non-reserved non-reserved non-reserved -MOVE non-reserved -MULTISET reserved reserved -MUMPS non-reserved non-reserved non-reserved -NAME non-reserved non-reserved non-reserved non-reserved -NAMES non-reserved non-reserved non-reserved reserved -NAMESPACE non-reserved non-reserved -NATIONAL non-reserved (cannot be function or type) reserved reserved reserved -NATURAL reserved (can be function or type) reserved reserved reserved -NCHAR non-reserved (cannot be function or type) reserved reserved reserved -NCLOB reserved reserved -NESTING non-reserved non-reserved -NEW reserved reserved -NEXT non-reserved non-reserved non-reserved reserved -NFC non-reserved non-reserved -NFD non-reserved non-reserved -NFKC non-reserved non-reserved -NFKD non-reserved non-reserved -NIL non-reserved non-reserved -NO non-reserved reserved reserved reserved -NONE non-reserved (cannot be function or type) reserved reserved -NORMALIZE reserved reserved -NORMALIZED non-reserved non-reserved -NOT reserved reserved reserved reserved -NOTHING non-reserved -NOTIFY non-reserved -NOTNULL reserved (can be function or type) -NOWAIT non-reserved -NTH_VALUE reserved reserved -NTILE reserved reserved -NULL reserved reserved reserved reserved -NULLABLE non-reserved non-reserved non-reserved -NULLIF non-reserved (cannot be function or type) reserved reserved reserved -NULLS non-reserved non-reserved non-reserved -NUMBER non-reserved non-reserved non-reserved -NUMERIC non-reserved (cannot be function or type) reserved reserved reserved -OBJECT non-reserved non-reserved non-reserved -OCCURRENCES_REGEX reserved reserved -OCTETS non-reserved non-reserved -OCTET_LENGTH reserved reserved reserved -OF non-reserved reserved reserved reserved -OFF non-reserved non-reserved non-reserved -OFFSET reserved reserved reserved -OIDS non-reserved -OLD reserved reserved -ON reserved reserved reserved reserved -ONLY reserved reserved reserved reserved -OPEN reserved reserved reserved -OPERATOR non-reserved -OPTION non-reserved non-reserved non-reserved reserved -OPTIONS non-reserved non-reserved non-reserved -OR reserved reserved reserved reserved -ORDER reserved reserved reserved reserved -ORDERING non-reserved non-reserved -ORDINALITY non-reserved non-reserved -OTHERS non-reserved non-reserved -OUT non-reserved (cannot be function or type) reserved reserved -OUTER reserved (can be function or type) reserved reserved reserved -OUTPUT non-reserved non-reserved reserved -OVER reserved (can be function or type) reserved reserved -OVERLAPS reserved (can be function or type) reserved reserved reserved -OVERLAY non-reserved (cannot be function or type) reserved reserved -OVERRIDING non-reserved non-reserved -OWNED non-reserved -OWNER non-reserved -P non-reserved non-reserved -PAD non-reserved non-reserved reserved -PARAMETER reserved reserved -PARAMETER_MODE non-reserved non-reserved -PARAMETER_NAME non-reserved non-reserved -PARAMETER_ORDINAL_POSITION non-reserved non-reserved -PARAMETER_SPECIFIC_CATALOG non-reserved non-reserved -PARAMETER_SPECIFIC_NAME non-reserved non-reserved -PARAMETER_SPECIFIC_SCHEMA non-reserved non-reserved -PARSER non-reserved -PARTIAL non-reserved non-reserved non-reserved reserved -PARTITION non-reserved reserved reserved -PASCAL non-reserved non-reserved non-reserved -PASSING non-reserved non-reserved non-reserved -PASSTHROUGH non-reserved non-reserved -PASSWORD non-reserved -PATH non-reserved non-reserved -PERCENT reserved -PERCENTILE_CONT reserved reserved -PERCENTILE_DISC reserved reserved -PERCENT_RANK reserved reserved -PERIOD reserved -PERMISSION non-reserved non-reserved -PLACING reserved non-reserved non-reserved -PLANS non-reserved -PLI non-reserved non-reserved non-reserved -PORTION reserved -POSITION non-reserved (cannot be function or type) reserved reserved reserved -POSITION_REGEX reserved reserved -POWER reserved reserved -PRECEDES reserved -PRECEDING non-reserved non-reserved non-reserved -PRECISION non-reserved (cannot be function or type) reserved reserved reserved -PREPARE non-reserved reserved reserved reserved -PREPARED non-reserved -PRESERVE non-reserved non-reserved non-reserved reserved -PRIMARY reserved reserved reserved reserved -PRIOR non-reserved non-reserved non-reserved reserved -PRIVILEGES non-reserved non-reserved non-reserved reserved -PROCEDURAL non-reserved -PROCEDURE non-reserved reserved reserved reserved -PROGRAM non-reserved -PUBLIC non-reserved non-reserved reserved -QUOTE non-reserved -RANGE non-reserved reserved reserved -RANK reserved reserved -READ non-reserved non-reserved non-reserved reserved -READS reserved reserved -REAL non-reserved (cannot be function or type) reserved reserved reserved -REASSIGN non-reserved -RECHECK non-reserved -RECOVERY non-reserved non-reserved -RECURSIVE non-reserved reserved reserved -REF non-reserved reserved reserved -REFERENCES reserved reserved reserved reserved -REFERENCING reserved reserved -REFRESH non-reserved -REGR_AVGX reserved reserved -REGR_AVGY reserved reserved -REGR_COUNT reserved reserved -REGR_INTERCEPT reserved reserved -REGR_R2 reserved reserved -REGR_SLOPE reserved reserved -REGR_SXX reserved reserved -REGR_SXY reserved reserved -REGR_SYY reserved reserved -REINDEX non-reserved -RELATIVE non-reserved non-reserved non-reserved reserved -RELEASE non-reserved reserved reserved -RENAME non-reserved -REPEATABLE non-reserved non-reserved non-reserved non-reserved -REPLACE non-reserved -REPLICA non-reserved -REQUIRING non-reserved non-reserved -RESET non-reserved -RESPECT non-reserved non-reserved -RESTART non-reserved non-reserved non-reserved -RESTORE non-reserved non-reserved -RESTRICT non-reserved non-reserved non-reserved reserved -RESULT reserved reserved -RETURN reserved reserved -RETURNED_CARDINALITY non-reserved non-reserved -RETURNED_LENGTH non-reserved non-reserved non-reserved -RETURNED_OCTET_LENGTH non-reserved non-reserved non-reserved -RETURNED_SQLSTATE non-reserved non-reserved non-reserved -RETURNING reserved non-reserved non-reserved -RETURNS non-reserved reserved reserved -REVOKE non-reserved reserved reserved reserved -RIGHT reserved (can be function or type) reserved reserved reserved -ROLE non-reserved non-reserved non-reserved -ROLLBACK non-reserved reserved reserved reserved -ROLLUP reserved reserved -ROUTINE non-reserved non-reserved -ROUTINE_CATALOG non-reserved non-reserved -ROUTINE_NAME non-reserved non-reserved -ROUTINE_SCHEMA non-reserved non-reserved -ROW non-reserved (cannot be function or type) reserved reserved -ROWS non-reserved reserved reserved reserved -ROW_COUNT non-reserved non-reserved non-reserved -ROW_NUMBER reserved reserved -RULE non-reserved -SAVEPOINT non-reserved reserved reserved -SCALE non-reserved non-reserved non-reserved -SCHEMA non-reserved non-reserved non-reserved reserved -SCHEMA_NAME non-reserved non-reserved non-reserved -SCOPE reserved reserved -SCOPE_CATALOG non-reserved non-reserved -SCOPE_NAME non-reserved non-reserved -SCOPE_SCHEMA non-reserved non-reserved -SCROLL non-reserved reserved reserved reserved -SEARCH non-reserved reserved reserved -SECOND non-reserved reserved reserved reserved -SECTION non-reserved non-reserved reserved -SECURITY non-reserved non-reserved non-reserved -SELECT reserved reserved reserved reserved -SELECTIVE non-reserved non-reserved -SELF non-reserved non-reserved -SENSITIVE reserved reserved -SEQUENCE non-reserved non-reserved non-reserved -SEQUENCES non-reserved -SERIALIZABLE non-reserved non-reserved non-reserved non-reserved -SERVER non-reserved non-reserved non-reserved -SERVER_NAME non-reserved non-reserved non-reserved -SESSION non-reserved non-reserved non-reserved reserved -SESSION_USER reserved reserved reserved reserved -SET non-reserved reserved reserved reserved -SETOF non-reserved (cannot be function or type) -SETS non-reserved non-reserved -SHARE non-reserved -SHOW non-reserved -SIMILAR reserved (can be function or type) reserved reserved -SIMPLE non-reserved non-reserved non-reserved -SIZE non-reserved non-reserved reserved -SMALLINT non-reserved (cannot be function or type) reserved reserved reserved -SNAPSHOT non-reserved -SOME reserved reserved reserved reserved -SOURCE non-reserved non-reserved -SPACE non-reserved non-reserved reserved -SPECIFIC reserved reserved -SPECIFICTYPE reserved reserved -SPECIFIC_NAME non-reserved non-reserved -SQL reserved reserved reserved -SQLCODE reserved -SQLERROR reserved -SQLEXCEPTION reserved reserved -SQLSTATE reserved reserved reserved -SQLWARNING reserved reserved -SQRT reserved reserved -STABLE non-reserved -STANDALONE non-reserved non-reserved non-reserved -START non-reserved reserved reserved -STATE non-reserved non-reserved -STATEMENT non-reserved non-reserved non-reserved -STATIC reserved reserved -STATISTICS non-reserved -STDDEV_POP reserved reserved -STDDEV_SAMP reserved reserved -STDIN non-reserved -STDOUT non-reserved -STORAGE non-reserved -STRICT non-reserved -STRIP non-reserved non-reserved non-reserved -STRUCTURE non-reserved non-reserved -STYLE non-reserved non-reserved -SUBCLASS_ORIGIN non-reserved non-reserved non-reserved -SUBMULTISET reserved reserved -SUBSTRING non-reserved (cannot be function or type) reserved reserved reserved -SUBSTRING_REGEX reserved reserved -SUCCEEDS reserved -SUM reserved reserved reserved -SYMMETRIC reserved reserved reserved -SYSID non-reserved -SYSTEM non-reserved reserved reserved -SYSTEM_TIME reserved -SYSTEM_USER reserved reserved reserved -T non-reserved non-reserved -TABLE reserved reserved reserved reserved -TABLES non-reserved -TABLESAMPLE reserved reserved -TABLESPACE non-reserved -TABLE_NAME non-reserved non-reserved non-reserved -TEMP non-reserved -TEMPLATE non-reserved -TEMPORARY non-reserved non-reserved non-reserved reserved -TEXT non-reserved -THEN reserved reserved reserved reserved -TIES non-reserved non-reserved -TIME non-reserved (cannot be function or type) reserved reserved reserved -TIMESTAMP non-reserved (cannot be function or type) reserved reserved reserved -TIMEZONE_HOUR reserved reserved reserved -TIMEZONE_MINUTE reserved reserved reserved -TO reserved reserved reserved reserved -TOKEN non-reserved non-reserved -TOP_LEVEL_COUNT non-reserved non-reserved -TRAILING reserved reserved reserved reserved -TRANSACTION non-reserved non-reserved non-reserved reserved -TRANSACTIONS_COMMITTED non-reserved non-reserved -TRANSACTIONS_ROLLED_BACK non-reserved non-reserved -TRANSACTION_ACTIVE non-reserved non-reserved -TRANSFORM non-reserved non-reserved -TRANSFORMS non-reserved non-reserved -TRANSLATE reserved reserved reserved -TRANSLATE_REGEX reserved reserved -TRANSLATION reserved reserved reserved -TREAT non-reserved (cannot be function or type) reserved reserved -TRIGGER non-reserved reserved reserved -TRIGGER_CATALOG non-reserved non-reserved -TRIGGER_NAME non-reserved non-reserved -TRIGGER_SCHEMA non-reserved non-reserved -TRIM non-reserved (cannot be function or type) reserved reserved reserved -TRIM_ARRAY reserved reserved -TRUE reserved reserved reserved reserved -TRUNCATE non-reserved reserved reserved -TRUSTED non-reserved -TYPE non-reserved non-reserved non-reserved non-reserved -TYPES non-reserved -UESCAPE reserved reserved -UNBOUNDED non-reserved non-reserved non-reserved -UNCOMMITTED non-reserved non-reserved non-reserved non-reserved -UNDER non-reserved non-reserved -UNENCRYPTED non-reserved -UNION reserved reserved reserved reserved -UNIQUE reserved reserved reserved reserved -UNKNOWN non-reserved reserved reserved reserved -UNLINK non-reserved non-reserved -UNLISTEN non-reserved -UNLOGGED non-reserved -UNNAMED non-reserved non-reserved non-reserved -UNNEST reserved reserved -UNTIL non-reserved -UNTYPED non-reserved non-reserved -UPDATE non-reserved reserved reserved reserved -UPPER reserved reserved reserved -URI non-reserved non-reserved -USAGE non-reserved non-reserved reserved -USER reserved reserved reserved reserved -USER_DEFINED_TYPE_CATALOG non-reserved non-reserved -USER_DEFINED_TYPE_CODE non-reserved non-reserved -USER_DEFINED_TYPE_NAME non-reserved non-reserved -USER_DEFINED_TYPE_SCHEMA non-reserved non-reserved -USING reserved reserved reserved reserved -VACUUM non-reserved -VALID non-reserved non-reserved non-reserved -VALIDATE non-reserved -VALIDATOR non-reserved -VALUE non-reserved reserved reserved reserved -VALUES non-reserved (cannot be function or type) reserved reserved reserved -VALUE_OF reserved -VARBINARY reserved reserved -VARCHAR non-reserved (cannot be function or type) reserved reserved reserved -VARIADIC reserved -VARYING non-reserved reserved reserved reserved -VAR_POP reserved reserved -VAR_SAMP reserved reserved -VERBOSE reserved (can be function or type) -VERSION non-reserved non-reserved non-reserved -VERSIONING reserved -VIEW non-reserved non-reserved non-reserved reserved -VOLATILE non-reserved -WHEN reserved reserved reserved reserved -WHENEVER reserved reserved reserved -WHERE reserved reserved reserved reserved -WHITESPACE non-reserved non-reserved non-reserved -WIDTH_BUCKET reserved reserved -WINDOW reserved reserved reserved -WITH reserved reserved reserved reserved -WITHIN reserved reserved -WITHOUT non-reserved reserved reserved -WORK non-reserved non-reserved non-reserved reserved -WRAPPER non-reserved non-reserved non-reserved -WRITE non-reserved non-reserved non-reserved reserved -XML non-reserved reserved reserved -XMLAGG reserved reserved -XMLATTRIBUTES non-reserved (cannot be function or type) reserved reserved -XMLBINARY reserved reserved -XMLCAST reserved reserved -XMLCOMMENT reserved reserved -XMLCONCAT non-reserved (cannot be function or type) reserved reserved -XMLDECLARATION non-reserved non-reserved -XMLDOCUMENT reserved reserved -XMLELEMENT non-reserved (cannot be function or type) reserved reserved -XMLEXISTS non-reserved (cannot be function or type) reserved reserved -XMLFOREST non-reserved (cannot be function or type) reserved reserved -XMLITERATE reserved reserved -XMLNAMESPACES reserved reserved -XMLPARSE non-reserved (cannot be function or type) reserved reserved -XMLPI non-reserved (cannot be function or type) reserved reserved -XMLQUERY reserved reserved -XMLROOT non-reserved (cannot be function or type) -XMLSCHEMA non-reserved non-reserved -XMLSERIALIZE non-reserved (cannot be function or type) reserved reserved -XMLTABLE reserved reserved -XMLTEXT reserved reserved -XMLVALIDATE reserved reserved -YEAR non-reserved reserved reserved reserved -YES non-reserved non-reserved non-reserved -ZONE non-reserved non-reserved non-reserved reserved \ No newline at end of file diff --git a/vendor/github.com/go-xorm/xorm/postgres_dialect.go b/vendor/github.com/go-xorm/xorm/postgres_dialect.go deleted file mode 100644 index c23ab6f31..000000000 --- a/vendor/github.com/go-xorm/xorm/postgres_dialect.go +++ /dev/null @@ -1,1097 +0,0 @@ -// Copyright 2015 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xorm - -import ( - "fmt" - "strconv" - "strings" - - "github.com/go-xorm/core" -) - -// from http://www.postgresql.org/docs/current/static/sql-keywords-appendix.html -var ( - postgresReservedWords = map[string]bool{ - "A": true, - "ABORT": true, - "ABS": true, - "ABSENT": true, - "ABSOLUTE": true, - "ACCESS": true, - "ACCORDING": true, - "ACTION": true, - "ADA": true, - "ADD": true, - "ADMIN": true, - "AFTER": true, - "AGGREGATE": true, - "ALL": true, - "ALLOCATE": true, - "ALSO": true, - "ALTER": true, - "ALWAYS": true, - "ANALYSE": true, - "ANALYZE": true, - "AND": true, - "ANY": true, - "ARE": true, - "ARRAY": true, - "ARRAY_AGG": true, - "ARRAY_MAX_CARDINALITY": true, - "AS": true, - "ASC": true, - "ASENSITIVE": true, - "ASSERTION": true, - "ASSIGNMENT": true, - "ASYMMETRIC": true, - "AT": true, - "ATOMIC": true, - "ATTRIBUTE": true, - "ATTRIBUTES": true, - "AUTHORIZATION": true, - "AVG": true, - "BACKWARD": true, - "BASE64": true, - "BEFORE": true, - "BEGIN": true, - "BEGIN_FRAME": true, - "BEGIN_PARTITION": true, - "BERNOULLI": true, - "BETWEEN": true, - "BIGINT": true, - "BINARY": true, - "BIT": true, - "BIT_LENGTH": true, - "BLOB": true, - "BLOCKED": true, - "BOM": true, - "BOOLEAN": true, - "BOTH": true, - "BREADTH": true, - "BY": true, - "C": true, - "CACHE": true, - "CALL": true, - "CALLED": true, - "CARDINALITY": true, - "CASCADE": true, - "CASCADED": true, - "CASE": true, - "CAST": true, - "CATALOG": true, - "CATALOG_NAME": true, - "CEIL": true, - "CEILING": true, - "CHAIN": true, - "CHAR": true, - "CHARACTER": true, - "CHARACTERISTICS": true, - "CHARACTERS": true, - "CHARACTER_LENGTH": true, - "CHARACTER_SET_CATALOG": true, - "CHARACTER_SET_NAME": true, - "CHARACTER_SET_SCHEMA": true, - "CHAR_LENGTH": true, - "CHECK": true, - "CHECKPOINT": true, - "CLASS": true, - "CLASS_ORIGIN": true, - "CLOB": true, - "CLOSE": true, - "CLUSTER": true, - "COALESCE": true, - "COBOL": true, - "COLLATE": true, - "COLLATION": true, - "COLLATION_CATALOG": true, - "COLLATION_NAME": true, - "COLLATION_SCHEMA": true, - "COLLECT": true, - "COLUMN": true, - "COLUMNS": true, - "COLUMN_NAME": true, - "COMMAND_FUNCTION": true, - "COMMAND_FUNCTION_CODE": true, - "COMMENT": true, - "COMMENTS": true, - "COMMIT": true, - "COMMITTED": true, - "CONCURRENTLY": true, - "CONDITION": true, - "CONDITION_NUMBER": true, - "CONFIGURATION": true, - "CONNECT": true, - "CONNECTION": true, - "CONNECTION_NAME": true, - "CONSTRAINT": true, - "CONSTRAINTS": true, - "CONSTRAINT_CATALOG": true, - "CONSTRAINT_NAME": true, - "CONSTRAINT_SCHEMA": true, - "CONSTRUCTOR": true, - "CONTAINS": true, - "CONTENT": true, - "CONTINUE": true, - "CONTROL": true, - "CONVERSION": true, - "CONVERT": true, - "COPY": true, - "CORR": true, - "CORRESPONDING": true, - "COST": true, - "COUNT": true, - "COVAR_POP": true, - "COVAR_SAMP": true, - "CREATE": true, - "CROSS": true, - "CSV": true, - "CUBE": true, - "CUME_DIST": true, - "CURRENT": true, - "CURRENT_CATALOG": true, - "CURRENT_DATE": true, - "CURRENT_DEFAULT_TRANSFORM_GROUP": true, - "CURRENT_PATH": true, - "CURRENT_ROLE": true, - "CURRENT_ROW": true, - "CURRENT_SCHEMA": true, - "CURRENT_TIME": true, - "CURRENT_TIMESTAMP": true, - "CURRENT_TRANSFORM_GROUP_FOR_TYPE": true, - "CURRENT_USER": true, - "CURSOR": true, - "CURSOR_NAME": true, - "CYCLE": true, - "DATA": true, - "DATABASE": true, - "DATALINK": true, - "DATE": true, - "DATETIME_INTERVAL_CODE": true, - "DATETIME_INTERVAL_PRECISION": true, - "DAY": true, - "DB": true, - "DEALLOCATE": true, - "DEC": true, - "DECIMAL": true, - "DECLARE": true, - "DEFAULT": true, - "DEFAULTS": true, - "DEFERRABLE": true, - "DEFERRED": true, - "DEFINED": true, - "DEFINER": true, - "DEGREE": true, - "DELETE": true, - "DELIMITER": true, - "DELIMITERS": true, - "DENSE_RANK": true, - "DEPTH": true, - "DEREF": true, - "DERIVED": true, - "DESC": true, - "DESCRIBE": true, - "DESCRIPTOR": true, - "DETERMINISTIC": true, - "DIAGNOSTICS": true, - "DICTIONARY": true, - "DISABLE": true, - "DISCARD": true, - "DISCONNECT": true, - "DISPATCH": true, - "DISTINCT": true, - "DLNEWCOPY": true, - "DLPREVIOUSCOPY": true, - "DLURLCOMPLETE": true, - "DLURLCOMPLETEONLY": true, - "DLURLCOMPLETEWRITE": true, - "DLURLPATH": true, - "DLURLPATHONLY": true, - "DLURLPATHWRITE": true, - "DLURLSCHEME": true, - "DLURLSERVER": true, - "DLVALUE": true, - "DO": true, - "DOCUMENT": true, - "DOMAIN": true, - "DOUBLE": true, - "DROP": true, - "DYNAMIC": true, - "DYNAMIC_FUNCTION": true, - "DYNAMIC_FUNCTION_CODE": true, - "EACH": true, - "ELEMENT": true, - "ELSE": true, - "EMPTY": true, - "ENABLE": true, - "ENCODING": true, - "ENCRYPTED": true, - "END": true, - "END-EXEC": true, - "END_FRAME": true, - "END_PARTITION": true, - "ENFORCED": true, - "ENUM": true, - "EQUALS": true, - "ESCAPE": true, - "EVENT": true, - "EVERY": true, - "EXCEPT": true, - "EXCEPTION": true, - "EXCLUDE": true, - "EXCLUDING": true, - "EXCLUSIVE": true, - "EXEC": true, - "EXECUTE": true, - "EXISTS": true, - "EXP": true, - "EXPLAIN": true, - "EXPRESSION": true, - "EXTENSION": true, - "EXTERNAL": true, - "EXTRACT": true, - "FALSE": true, - "FAMILY": true, - "FETCH": true, - "FILE": true, - "FILTER": true, - "FINAL": true, - "FIRST": true, - "FIRST_VALUE": true, - "FLAG": true, - "FLOAT": true, - "FLOOR": true, - "FOLLOWING": true, - "FOR": true, - "FORCE": true, - "FOREIGN": true, - "FORTRAN": true, - "FORWARD": true, - "FOUND": true, - "FRAME_ROW": true, - "FREE": true, - "FREEZE": true, - "FROM": true, - "FS": true, - "FULL": true, - "FUNCTION": true, - "FUNCTIONS": true, - "FUSION": true, - "G": true, - "GENERAL": true, - "GENERATED": true, - "GET": true, - "GLOBAL": true, - "GO": true, - "GOTO": true, - "GRANT": true, - "GRANTED": true, - "GREATEST": true, - "GROUP": true, - "GROUPING": true, - "GROUPS": true, - "HANDLER": true, - "HAVING": true, - "HEADER": true, - "HEX": true, - "HIERARCHY": true, - "HOLD": true, - "HOUR": true, - "ID": true, - "IDENTITY": true, - "IF": true, - "IGNORE": true, - "ILIKE": true, - "IMMEDIATE": true, - "IMMEDIATELY": true, - "IMMUTABLE": true, - "IMPLEMENTATION": true, - "IMPLICIT": true, - "IMPORT": true, - "IN": true, - "INCLUDING": true, - "INCREMENT": true, - "INDENT": true, - "INDEX": true, - "INDEXES": true, - "INDICATOR": true, - "INHERIT": true, - "INHERITS": true, - "INITIALLY": true, - "INLINE": true, - "INNER": true, - "INOUT": true, - "INPUT": true, - "INSENSITIVE": true, - "INSERT": true, - "INSTANCE": true, - "INSTANTIABLE": true, - "INSTEAD": true, - "INT": true, - "INTEGER": true, - "INTEGRITY": true, - "INTERSECT": true, - "INTERSECTION": true, - "INTERVAL": true, - "INTO": true, - "INVOKER": true, - "IS": true, - "ISNULL": true, - "ISOLATION": true, - "JOIN": true, - "K": true, - "KEY": true, - "KEY_MEMBER": true, - "KEY_TYPE": true, - "LABEL": true, - "LAG": true, - "LANGUAGE": true, - "LARGE": true, - "LAST": true, - "LAST_VALUE": true, - "LATERAL": true, - "LC_COLLATE": true, - "LC_CTYPE": true, - "LEAD": true, - "LEADING": true, - "LEAKPROOF": true, - "LEAST": true, - "LEFT": true, - "LENGTH": true, - "LEVEL": true, - "LIBRARY": true, - "LIKE": true, - "LIKE_REGEX": true, - "LIMIT": true, - "LINK": true, - "LISTEN": true, - "LN": true, - "LOAD": true, - "LOCAL": true, - "LOCALTIME": true, - "LOCALTIMESTAMP": true, - "LOCATION": true, - "LOCATOR": true, - "LOCK": true, - "LOWER": true, - "M": true, - "MAP": true, - "MAPPING": true, - "MATCH": true, - "MATCHED": true, - "MATERIALIZED": true, - "MAX": true, - "MAXVALUE": true, - "MAX_CARDINALITY": true, - "MEMBER": true, - "MERGE": true, - "MESSAGE_LENGTH": true, - "MESSAGE_OCTET_LENGTH": true, - "MESSAGE_TEXT": true, - "METHOD": true, - "MIN": true, - "MINUTE": true, - "MINVALUE": true, - "MOD": true, - "MODE": true, - "MODIFIES": true, - "MODULE": true, - "MONTH": true, - "MORE": true, - "MOVE": true, - "MULTISET": true, - "MUMPS": true, - "NAME": true, - "NAMES": true, - "NAMESPACE": true, - "NATIONAL": true, - "NATURAL": true, - "NCHAR": true, - "NCLOB": true, - "NESTING": true, - "NEW": true, - "NEXT": true, - "NFC": true, - "NFD": true, - "NFKC": true, - "NFKD": true, - "NIL": true, - "NO": true, - "NONE": true, - "NORMALIZE": true, - "NORMALIZED": true, - "NOT": true, - "NOTHING": true, - "NOTIFY": true, - "NOTNULL": true, - "NOWAIT": true, - "NTH_VALUE": true, - "NTILE": true, - "NULL": true, - "NULLABLE": true, - "NULLIF": true, - "NULLS": true, - "NUMBER": true, - "NUMERIC": true, - "OBJECT": true, - "OCCURRENCES_REGEX": true, - "OCTETS": true, - "OCTET_LENGTH": true, - "OF": true, - "OFF": true, - "OFFSET": true, - "OIDS": true, - "OLD": true, - "ON": true, - "ONLY": true, - "OPEN": true, - "OPERATOR": true, - "OPTION": true, - "OPTIONS": true, - "OR": true, - "ORDER": true, - "ORDERING": true, - "ORDINALITY": true, - "OTHERS": true, - "OUT": true, - "OUTER": true, - "OUTPUT": true, - "OVER": true, - "OVERLAPS": true, - "OVERLAY": true, - "OVERRIDING": true, - "OWNED": true, - "OWNER": true, - "P": true, - "PAD": true, - "PARAMETER": true, - "PARAMETER_MODE": true, - "PARAMETER_NAME": true, - "PARAMETER_ORDINAL_POSITION": true, - "PARAMETER_SPECIFIC_CATALOG": true, - "PARAMETER_SPECIFIC_NAME": true, - "PARAMETER_SPECIFIC_SCHEMA": true, - "PARSER": true, - "PARTIAL": true, - "PARTITION": true, - "PASCAL": true, - "PASSING": true, - "PASSTHROUGH": true, - "PASSWORD": true, - "PATH": true, - "PERCENT": true, - "PERCENTILE_CONT": true, - "PERCENTILE_DISC": true, - "PERCENT_RANK": true, - "PERIOD": true, - "PERMISSION": true, - "PLACING": true, - "PLANS": true, - "PLI": true, - "PORTION": true, - "POSITION": true, - "POSITION_REGEX": true, - "POWER": true, - "PRECEDES": true, - "PRECEDING": true, - "PRECISION": true, - "PREPARE": true, - "PREPARED": true, - "PRESERVE": true, - "PRIMARY": true, - "PRIOR": true, - "PRIVILEGES": true, - "PROCEDURAL": true, - "PROCEDURE": true, - "PROGRAM": true, - "PUBLIC": true, - "QUOTE": true, - "RANGE": true, - "RANK": true, - "READ": true, - "READS": true, - "REAL": true, - "REASSIGN": true, - "RECHECK": true, - "RECOVERY": true, - "RECURSIVE": true, - "REF": true, - "REFERENCES": true, - "REFERENCING": true, - "REFRESH": true, - "REGR_AVGX": true, - "REGR_AVGY": true, - "REGR_COUNT": true, - "REGR_INTERCEPT": true, - "REGR_R2": true, - "REGR_SLOPE": true, - "REGR_SXX": true, - "REGR_SXY": true, - "REGR_SYY": true, - "REINDEX": true, - "RELATIVE": true, - "RELEASE": true, - "RENAME": true, - "REPEATABLE": true, - "REPLACE": true, - "REPLICA": true, - "REQUIRING": true, - "RESET": true, - "RESPECT": true, - "RESTART": true, - "RESTORE": true, - "RESTRICT": true, - "RESULT": true, - "RETURN": true, - "RETURNED_CARDINALITY": true, - "RETURNED_LENGTH": true, - "RETURNED_OCTET_LENGTH": true, - "RETURNED_SQLSTATE": true, - "RETURNING": true, - "RETURNS": true, - "REVOKE": true, - "RIGHT": true, - "ROLE": true, - "ROLLBACK": true, - "ROLLUP": true, - "ROUTINE": true, - "ROUTINE_CATALOG": true, - "ROUTINE_NAME": true, - "ROUTINE_SCHEMA": true, - "ROW": true, - "ROWS": true, - "ROW_COUNT": true, - "ROW_NUMBER": true, - "RULE": true, - "SAVEPOINT": true, - "SCALE": true, - "SCHEMA": true, - "SCHEMA_NAME": true, - "SCOPE": true, - "SCOPE_CATALOG": true, - "SCOPE_NAME": true, - "SCOPE_SCHEMA": true, - "SCROLL": true, - "SEARCH": true, - "SECOND": true, - "SECTION": true, - "SECURITY": true, - "SELECT": true, - "SELECTIVE": true, - "SELF": true, - "SENSITIVE": true, - "SEQUENCE": true, - "SEQUENCES": true, - "SERIALIZABLE": true, - "SERVER": true, - "SERVER_NAME": true, - "SESSION": true, - "SESSION_USER": true, - "SET": true, - "SETOF": true, - "SETS": true, - "SHARE": true, - "SHOW": true, - "SIMILAR": true, - "SIMPLE": true, - "SIZE": true, - "SMALLINT": true, - "SNAPSHOT": true, - "SOME": true, - "SOURCE": true, - "SPACE": true, - "SPECIFIC": true, - "SPECIFICTYPE": true, - "SPECIFIC_NAME": true, - "SQL": true, - "SQLCODE": true, - "SQLERROR": true, - "SQLEXCEPTION": true, - "SQLSTATE": true, - "SQLWARNING": true, - "SQRT": true, - "STABLE": true, - "STANDALONE": true, - "START": true, - "STATE": true, - "STATEMENT": true, - "STATIC": true, - "STATISTICS": true, - "STDDEV_POP": true, - "STDDEV_SAMP": true, - "STDIN": true, - "STDOUT": true, - "STORAGE": true, - "STRICT": true, - "STRIP": true, - "STRUCTURE": true, - "STYLE": true, - "SUBCLASS_ORIGIN": true, - "SUBMULTISET": true, - "SUBSTRING": true, - "SUBSTRING_REGEX": true, - "SUCCEEDS": true, - "SUM": true, - "SYMMETRIC": true, - "SYSID": true, - "SYSTEM": true, - "SYSTEM_TIME": true, - "SYSTEM_USER": true, - "T": true, - "TABLE": true, - "TABLES": true, - "TABLESAMPLE": true, - "TABLESPACE": true, - "TABLE_NAME": true, - "TEMP": true, - "TEMPLATE": true, - "TEMPORARY": true, - "TEXT": true, - "THEN": true, - "TIES": true, - "TIME": true, - "TIMESTAMP": true, - "TIMEZONE_HOUR": true, - "TIMEZONE_MINUTE": true, - "TO": true, - "TOKEN": true, - "TOP_LEVEL_COUNT": true, - "TRAILING": true, - "TRANSACTION": true, - "TRANSACTIONS_COMMITTED": true, - "TRANSACTIONS_ROLLED_BACK": true, - "TRANSACTION_ACTIVE": true, - "TRANSFORM": true, - "TRANSFORMS": true, - "TRANSLATE": true, - "TRANSLATE_REGEX": true, - "TRANSLATION": true, - "TREAT": true, - "TRIGGER": true, - "TRIGGER_CATALOG": true, - "TRIGGER_NAME": true, - "TRIGGER_SCHEMA": true, - "TRIM": true, - "TRIM_ARRAY": true, - "TRUE": true, - "TRUNCATE": true, - "TRUSTED": true, - "TYPE": true, - "TYPES": true, - "UESCAPE": true, - "UNBOUNDED": true, - "UNCOMMITTED": true, - "UNDER": true, - "UNENCRYPTED": true, - "UNION": true, - "UNIQUE": true, - "UNKNOWN": true, - "UNLINK": true, - "UNLISTEN": true, - "UNLOGGED": true, - "UNNAMED": true, - "UNNEST": true, - "UNTIL": true, - "UNTYPED": true, - "UPDATE": true, - "UPPER": true, - "URI": true, - "USAGE": true, - "USER": true, - "USER_DEFINED_TYPE_CATALOG": true, - "USER_DEFINED_TYPE_CODE": true, - "USER_DEFINED_TYPE_NAME": true, - "USER_DEFINED_TYPE_SCHEMA": true, - "USING": true, - "VACUUM": true, - "VALID": true, - "VALIDATE": true, - "VALIDATOR": true, - "VALUE": true, - "VALUES": true, - "VALUE_OF": true, - "VARBINARY": true, - "VARCHAR": true, - "VARIADIC": true, - "VARYING": true, - "VAR_POP": true, - "VAR_SAMP": true, - "VERBOSE": true, - "VERSION": true, - "VERSIONING": true, - "VIEW": true, - "VOLATILE": true, - "WHEN": true, - "WHENEVER": true, - "WHERE": true, - "WHITESPACE": true, - "WIDTH_BUCKET": true, - "WINDOW": true, - "WITH": true, - "WITHIN": true, - "WITHOUT": true, - "WORK": true, - "WRAPPER": true, - "WRITE": true, - "XML": true, - "XMLAGG": true, - "XMLATTRIBUTES": true, - "XMLBINARY": true, - "XMLCAST": true, - "XMLCOMMENT": true, - "XMLCONCAT": true, - "XMLDECLARATION": true, - "XMLDOCUMENT": true, - "XMLELEMENT": true, - "XMLEXISTS": true, - "XMLFOREST": true, - "XMLITERATE": true, - "XMLNAMESPACES": true, - "XMLPARSE": true, - "XMLPI": true, - "XMLQUERY": true, - "XMLROOT": true, - "XMLSCHEMA": true, - "XMLSERIALIZE": true, - "XMLTABLE": true, - "XMLTEXT": true, - "XMLVALIDATE": true, - "YEAR": true, - "YES": true, - "ZONE": true, - } -) - -type postgres struct { - core.Base -} - -func (db *postgres) Init(d *core.DB, uri *core.Uri, drivername, dataSourceName string) error { - return db.Base.Init(d, db, uri, drivername, dataSourceName) -} - -func (db *postgres) SqlType(c *core.Column) string { - var res string - switch t := c.SQLType.Name; t { - case core.TinyInt: - res = core.SmallInt - return res - case core.MediumInt, core.Int, core.Integer: - if c.IsAutoIncrement { - return core.Serial - } - return core.Integer - case core.BigInt: - if c.IsAutoIncrement { - return core.BigSerial - } - return core.BigInt - case core.Serial, core.BigSerial: - c.IsAutoIncrement = true - c.Nullable = false - res = t - case core.Binary, core.VarBinary: - return core.Bytea - case core.DateTime: - res = core.TimeStamp - case core.TimeStampz: - return "timestamp with time zone" - case core.Float: - res = core.Real - case core.TinyText, core.MediumText, core.LongText: - res = core.Text - case core.NVarchar: - res = core.Varchar - case core.Uuid: - res = core.Uuid - case core.Blob, core.TinyBlob, core.MediumBlob, core.LongBlob: - return core.Bytea - case core.Double: - return "DOUBLE PRECISION" - default: - if c.IsAutoIncrement { - return core.Serial - } - res = t - } - - hasLen1 := (c.Length > 0) - hasLen2 := (c.Length2 > 0) - - if hasLen2 { - res += "(" + strconv.Itoa(c.Length) + "," + strconv.Itoa(c.Length2) + ")" - } else if hasLen1 { - res += "(" + strconv.Itoa(c.Length) + ")" - } - return res -} - -func (db *postgres) SupportInsertMany() bool { - return true -} - -func (db *postgres) IsReserved(name string) bool { - _, ok := postgresReservedWords[name] - return ok -} - -func (db *postgres) Quote(name string) string { - name = strings.Replace(name, ".", `"."`, -1) - return "\"" + name + "\"" -} - -func (db *postgres) QuoteStr() string { - return "\"" -} - -func (db *postgres) AutoIncrStr() string { - return "" -} - -func (db *postgres) SupportEngine() bool { - return false -} - -func (db *postgres) SupportCharset() bool { - return false -} - -func (db *postgres) IndexOnTable() bool { - return false -} - -func (db *postgres) IndexCheckSql(tableName, idxName string) (string, []interface{}) { - args := []interface{}{tableName, idxName} - return `SELECT indexname FROM pg_indexes ` + - `WHERE tablename = ? AND indexname = ?`, args -} - -func (db *postgres) TableCheckSql(tableName string) (string, []interface{}) { - args := []interface{}{tableName} - return `SELECT tablename FROM pg_tables WHERE tablename = ?`, args -} - -/*func (db *postgres) ColumnCheckSql(tableName, colName string) (string, []interface{}) { - args := []interface{}{tableName, colName} - return "SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = ?" + - " AND column_name = ?", args -}*/ - -func (db *postgres) ModifyColumnSql(tableName string, col *core.Column) string { - return fmt.Sprintf("alter table %s ALTER COLUMN %s TYPE %s", - tableName, col.Name, db.SqlType(col)) -} - -func (db *postgres) DropIndexSql(tableName string, index *core.Index) string { - //var unique string - quote := db.Quote - idxName := index.Name - - if !strings.HasPrefix(idxName, "UQE_") && - !strings.HasPrefix(idxName, "IDX_") { - if index.Type == core.UniqueType { - idxName = fmt.Sprintf("UQE_%v_%v", tableName, index.Name) - } else { - idxName = fmt.Sprintf("IDX_%v_%v", tableName, index.Name) - } - } - return fmt.Sprintf("DROP INDEX %v", quote(idxName)) -} - -func (db *postgres) IsColumnExist(tableName, colName string) (bool, error) { - args := []interface{}{tableName, colName} - query := "SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = $1" + - " AND column_name = $2" - db.LogSQL(query, args) - - rows, err := db.DB().Query(query, args...) - if err != nil { - return false, err - } - defer rows.Close() - - return rows.Next(), nil -} - -func (db *postgres) GetColumns(tableName string) ([]string, map[string]*core.Column, error) { - // FIXME: the schema should be replaced by user custom's - args := []interface{}{tableName, "public"} - s := `SELECT column_name, column_default, is_nullable, data_type, character_maximum_length, numeric_precision, numeric_precision_radix , - CASE WHEN p.contype = 'p' THEN true ELSE false END AS primarykey, - CASE WHEN p.contype = 'u' THEN true ELSE false END AS uniquekey -FROM pg_attribute f - JOIN pg_class c ON c.oid = f.attrelid JOIN pg_type t ON t.oid = f.atttypid - LEFT JOIN pg_attrdef d ON d.adrelid = c.oid AND d.adnum = f.attnum - LEFT JOIN pg_namespace n ON n.oid = c.relnamespace - LEFT JOIN pg_constraint p ON p.conrelid = c.oid AND f.attnum = ANY (p.conkey) - LEFT JOIN pg_class AS g ON p.confrelid = g.oid - LEFT JOIN INFORMATION_SCHEMA.COLUMNS s ON s.column_name=f.attname AND c.relname=s.table_name -WHERE c.relkind = 'r'::char AND c.relname = $1 AND s.table_schema = $2 AND f.attnum > 0 ORDER BY f.attnum;` - db.LogSQL(s, args) - - rows, err := db.DB().Query(s, args...) - if err != nil { - return nil, nil, err - } - defer rows.Close() - - cols := make(map[string]*core.Column) - colSeq := make([]string, 0) - - for rows.Next() { - col := new(core.Column) - col.Indexes = make(map[string]int) - - var colName, isNullable, dataType string - var maxLenStr, colDefault, numPrecision, numRadix *string - var isPK, isUnique bool - err = rows.Scan(&colName, &colDefault, &isNullable, &dataType, &maxLenStr, &numPrecision, &numRadix, &isPK, &isUnique) - if err != nil { - return nil, nil, err - } - - //fmt.Println(args, colName, isNullable, dataType, maxLenStr, colDefault, numPrecision, numRadix, isPK, isUnique) - var maxLen int - if maxLenStr != nil { - maxLen, err = strconv.Atoi(*maxLenStr) - if err != nil { - return nil, nil, err - } - } - - col.Name = strings.Trim(colName, `" `) - - if colDefault != nil || isPK { - if isPK { - col.IsPrimaryKey = true - } else { - col.Default = *colDefault - } - } - - if colDefault != nil && strings.HasPrefix(*colDefault, "nextval(") { - col.IsAutoIncrement = true - } - - col.Nullable = (isNullable == "YES") - - switch dataType { - case "character varying", "character": - col.SQLType = core.SQLType{Name: core.Varchar, DefaultLength: 0, DefaultLength2: 0} - case "timestamp without time zone": - col.SQLType = core.SQLType{Name: core.DateTime, DefaultLength: 0, DefaultLength2: 0} - case "timestamp with time zone": - col.SQLType = core.SQLType{Name: core.TimeStampz, DefaultLength: 0, DefaultLength2: 0} - case "double precision": - col.SQLType = core.SQLType{Name: core.Double, DefaultLength: 0, DefaultLength2: 0} - case "boolean": - col.SQLType = core.SQLType{Name: core.Bool, DefaultLength: 0, DefaultLength2: 0} - case "time without time zone": - col.SQLType = core.SQLType{Name: core.Time, DefaultLength: 0, DefaultLength2: 0} - case "oid": - col.SQLType = core.SQLType{Name: core.BigInt, DefaultLength: 0, DefaultLength2: 0} - default: - col.SQLType = core.SQLType{Name: strings.ToUpper(dataType), DefaultLength: 0, DefaultLength2: 0} - } - if _, ok := core.SqlTypes[col.SQLType.Name]; !ok { - return nil, nil, fmt.Errorf("Unknown colType: %v", dataType) - } - - col.Length = maxLen - - if col.SQLType.IsText() || col.SQLType.IsTime() { - if col.Default != "" { - col.Default = "'" + col.Default + "'" - } else { - if col.DefaultIsEmpty { - col.Default = "''" - } - } - } - cols[col.Name] = col - colSeq = append(colSeq, col.Name) - } - - return colSeq, cols, nil -} - -func (db *postgres) GetTables() ([]*core.Table, error) { - // FIXME: replace public to user customrize schema - args := []interface{}{"public"} - s := fmt.Sprintf("SELECT tablename FROM pg_tables WHERE schemaname = $1") - db.LogSQL(s, args) - - rows, err := db.DB().Query(s, args...) - if err != nil { - return nil, err - } - defer rows.Close() - - tables := make([]*core.Table, 0) - for rows.Next() { - table := core.NewEmptyTable() - var name string - err = rows.Scan(&name) - if err != nil { - return nil, err - } - table.Name = name - tables = append(tables, table) - } - return tables, nil -} - -func (db *postgres) GetIndexes(tableName string) (map[string]*core.Index, error) { - // FIXME: replace the public schema to user specify schema - args := []interface{}{"public", tableName} - s := fmt.Sprintf("SELECT indexname, indexdef FROM pg_indexes WHERE schemaname=$1 AND tablename=$2") - db.LogSQL(s, args) - - rows, err := db.DB().Query(s, args...) - if err != nil { - return nil, err - } - defer rows.Close() - - indexes := make(map[string]*core.Index, 0) - for rows.Next() { - var indexType int - var indexName, indexdef string - var colNames []string - err = rows.Scan(&indexName, &indexdef) - if err != nil { - return nil, err - } - indexName = strings.Trim(indexName, `" `) - if strings.HasSuffix(indexName, "_pkey") { - continue - } - if strings.HasPrefix(indexdef, "CREATE UNIQUE INDEX") { - indexType = core.UniqueType - } else { - indexType = core.IndexType - } - cs := strings.Split(indexdef, "(") - colNames = strings.Split(cs[1][0:len(cs[1])-1], ",") - - if strings.HasPrefix(indexName, "IDX_"+tableName) || strings.HasPrefix(indexName, "UQE_"+tableName) { - newIdxName := indexName[5+len(tableName):] - if newIdxName != "" { - indexName = newIdxName - } - } - - index := &core.Index{Name: indexName, Type: indexType, Cols: make([]string, 0)} - for _, colName := range colNames { - index.Cols = append(index.Cols, strings.Trim(colName, `" `)) - } - indexes[index.Name] = index - } - return indexes, nil -} - -func (db *postgres) Filters() []core.Filter { - return []core.Filter{&core.IdFilter{}, &core.QuoteFilter{}, &core.SeqFilter{Prefix: "$", Start: 1}} -} diff --git a/vendor/github.com/go-xorm/xorm/pq_driver.go b/vendor/github.com/go-xorm/xorm/pq_driver.go deleted file mode 100644 index 5d608f250..000000000 --- a/vendor/github.com/go-xorm/xorm/pq_driver.go +++ /dev/null @@ -1,119 +0,0 @@ -// Copyright 2015 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xorm - -import ( - "errors" - "fmt" - "net/url" - "sort" - "strings" - - "github.com/go-xorm/core" -) - -type pqDriver struct { -} - -type values map[string]string - -func (vs values) Set(k, v string) { - vs[k] = v -} - -func (vs values) Get(k string) (v string) { - return vs[k] -} - -func errorf(s string, args ...interface{}) { - panic(fmt.Errorf("pq: %s", fmt.Sprintf(s, args...))) -} - -func parseURL(connstr string) (string, error) { - u, err := url.Parse(connstr) - if err != nil { - return "", err - } - - if u.Scheme != "postgresql" && u.Scheme != "postgres" { - return "", fmt.Errorf("invalid connection protocol: %s", u.Scheme) - } - - var kvs []string - escaper := strings.NewReplacer(` `, `\ `, `'`, `\'`, `\`, `\\`) - accrue := func(k, v string) { - if v != "" { - kvs = append(kvs, k+"="+escaper.Replace(v)) - } - } - - if u.User != nil { - v := u.User.Username() - accrue("user", v) - - v, _ = u.User.Password() - accrue("password", v) - } - - i := strings.Index(u.Host, ":") - if i < 0 { - accrue("host", u.Host) - } else { - accrue("host", u.Host[:i]) - accrue("port", u.Host[i+1:]) - } - - if u.Path != "" { - accrue("dbname", u.Path[1:]) - } - - q := u.Query() - for k := range q { - accrue(k, q.Get(k)) - } - - sort.Strings(kvs) // Makes testing easier (not a performance concern) - return strings.Join(kvs, " "), nil -} - -func parseOpts(name string, o values) { - if len(name) == 0 { - return - } - - name = strings.TrimSpace(name) - - ps := strings.Split(name, " ") - for _, p := range ps { - kv := strings.Split(p, "=") - if len(kv) < 2 { - errorf("invalid option: %q", p) - } - o.Set(kv[0], kv[1]) - } -} - -func (p *pqDriver) Parse(driverName, dataSourceName string) (*core.Uri, error) { - db := &core.Uri{DbType: core.POSTGRES} - o := make(values) - var err error - if strings.HasPrefix(dataSourceName, "postgresql://") || strings.HasPrefix(dataSourceName, "postgres://") { - dataSourceName, err = parseURL(dataSourceName) - if err != nil { - return nil, err - } - } - parseOpts(dataSourceName, o) - - db.DbName = o.Get("dbname") - if db.DbName == "" { - return nil, errors.New("dbname is empty") - } - /*db.Schema = o.Get("schema") - if len(db.Schema) == 0 { - db.Schema = "public" - }*/ - return db, nil -} diff --git a/vendor/github.com/go-xorm/xorm/processors.go b/vendor/github.com/go-xorm/xorm/processors.go deleted file mode 100644 index 77dd30e57..000000000 --- a/vendor/github.com/go-xorm/xorm/processors.go +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2015 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xorm - -// BeforeInsertProcessor executed before an object is initially persisted to the database -type BeforeInsertProcessor interface { - BeforeInsert() -} - -// BeforeUpdateProcessor executed before an object is updated -type BeforeUpdateProcessor interface { - BeforeUpdate() -} - -// BeforeDeleteProcessor executed before an object is deleted -type BeforeDeleteProcessor interface { - BeforeDelete() -} - -// BeforeSetProcessor executed before data set to the struct fields -type BeforeSetProcessor interface { - BeforeSet(string, Cell) -} - -// AfterSetProcessor executed after data set to the struct fields -type AfterSetProcessor interface { - AfterSet(string, Cell) -} - -// !nashtsai! TODO enable BeforeValidateProcessor when xorm start to support validations -//// Executed before an object is validated -//type BeforeValidateProcessor interface { -// BeforeValidate() -//} -// -- - -// AfterInsertProcessor executed after an object is persisted to the database -type AfterInsertProcessor interface { - AfterInsert() -} - -// AfterUpdateProcessor executed after an object has been updated -type AfterUpdateProcessor interface { - AfterUpdate() -} - -// AfterDeleteProcessor executed after an object has been deleted -type AfterDeleteProcessor interface { - AfterDelete() -} diff --git a/vendor/github.com/go-xorm/xorm/rows.go b/vendor/github.com/go-xorm/xorm/rows.go deleted file mode 100644 index e9cf8597c..000000000 --- a/vendor/github.com/go-xorm/xorm/rows.go +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright 2015 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xorm - -import ( - "database/sql" - "fmt" - "reflect" - - "github.com/go-xorm/core" -) - -// Rows rows wrapper a rows to -type Rows struct { - NoTypeCheck bool - - session *Session - stmt *core.Stmt - rows *core.Rows - fields []string - fieldsCount int - beanType reflect.Type - lastError error -} - -func newRows(session *Session, bean interface{}) (*Rows, error) { - rows := new(Rows) - rows.session = session - rows.beanType = reflect.Indirect(reflect.ValueOf(bean)).Type() - - defer rows.session.resetStatement() - - var sqlStr string - var args []interface{} - - rows.session.Statement.setRefValue(rValue(bean)) - if len(session.Statement.TableName()) <= 0 { - return nil, ErrTableNotFound - } - - if rows.session.Statement.RawSQL == "" { - sqlStr, args = rows.session.Statement.genGetSQL(bean) - } else { - sqlStr = rows.session.Statement.RawSQL - args = rows.session.Statement.RawParams - } - - for _, filter := range rows.session.Engine.dialect.Filters() { - sqlStr = filter.Do(sqlStr, session.Engine.dialect, rows.session.Statement.RefTable) - } - - rows.session.saveLastSQL(sqlStr, args...) - var err error - if rows.session.prepareStmt { - rows.stmt, err = rows.session.DB().Prepare(sqlStr) - if err != nil { - rows.lastError = err - rows.Close() - return nil, err - } - - rows.rows, err = rows.stmt.Query(args...) - if err != nil { - rows.lastError = err - rows.Close() - return nil, err - } - } else { - rows.rows, err = rows.session.DB().Query(sqlStr, args...) - if err != nil { - rows.lastError = err - rows.Close() - return nil, err - } - } - - rows.fields, err = rows.rows.Columns() - if err != nil { - rows.lastError = err - rows.Close() - return nil, err - } - rows.fieldsCount = len(rows.fields) - - return rows, nil -} - -// Next move cursor to next record, return false if end has reached -func (rows *Rows) Next() bool { - if rows.lastError == nil && rows.rows != nil { - hasNext := rows.rows.Next() - if !hasNext { - rows.lastError = sql.ErrNoRows - } - return hasNext - } - return false -} - -// Err returns the error, if any, that was encountered during iteration. Err may be called after an explicit or implicit Close. -func (rows *Rows) Err() error { - return rows.lastError -} - -// Scan row record to bean properties -func (rows *Rows) Scan(bean interface{}) error { - if rows.lastError != nil { - return rows.lastError - } - - if !rows.NoTypeCheck && reflect.Indirect(reflect.ValueOf(bean)).Type() != rows.beanType { - return fmt.Errorf("scan arg is incompatible type to [%v]", rows.beanType) - } - - _, err := rows.session.row2Bean(rows.rows, rows.fields, rows.fieldsCount, bean) - return err -} - -// Close session if session.IsAutoClose is true, and claimed any opened resources -func (rows *Rows) Close() error { - if rows.session.IsAutoClose { - defer rows.session.Close() - } - - if rows.lastError == nil { - if rows.rows != nil { - rows.lastError = rows.rows.Close() - if rows.lastError != nil { - defer rows.stmt.Close() - return rows.lastError - } - } - if rows.stmt != nil { - rows.lastError = rows.stmt.Close() - } - } else { - if rows.stmt != nil { - defer rows.stmt.Close() - } - if rows.rows != nil { - defer rows.rows.Close() - } - } - return rows.lastError -} diff --git a/vendor/github.com/go-xorm/xorm/session.go b/vendor/github.com/go-xorm/xorm/session.go deleted file mode 100644 index f5946ea37..000000000 --- a/vendor/github.com/go-xorm/xorm/session.go +++ /dev/null @@ -1,1633 +0,0 @@ -// Copyright 2015 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xorm - -import ( - "database/sql" - "database/sql/driver" - "encoding/json" - "errors" - "fmt" - "hash/crc32" - "reflect" - "strconv" - "strings" - "time" - - "github.com/go-xorm/builder" - "github.com/go-xorm/core" -) - -// Session keep a pointer to sql.DB and provides all execution of all -// kind of database operations. -type Session struct { - db *core.DB - Engine *Engine - Tx *core.Tx - Statement Statement - IsAutoCommit bool - IsCommitedOrRollbacked bool - TransType string - IsAutoClose bool - - // Automatically reset the statement after operations that execute a SQL - // query such as Count(), Find(), Get(), ... - AutoResetStatement bool - - // !nashtsai! storing these beans due to yet committed tx - afterInsertBeans map[interface{}]*[]func(interface{}) - afterUpdateBeans map[interface{}]*[]func(interface{}) - afterDeleteBeans map[interface{}]*[]func(interface{}) - // -- - - beforeClosures []func(interface{}) - afterClosures []func(interface{}) - - prepareStmt bool - stmtCache map[uint32]*core.Stmt //key: hash.Hash32 of (queryStr, len(queryStr)) - cascadeDeep int - - // !evalphobia! stored the last executed query on this session - //beforeSQLExec func(string, ...interface{}) - lastSQL string - lastSQLArgs []interface{} -} - -// Clone copy all the session's content and return a new session -func (session *Session) Clone() *Session { - var sess = *session - return &sess -} - -// Init reset the session as the init status. -func (session *Session) Init() { - session.Statement.Init() - session.Statement.Engine = session.Engine - session.IsAutoCommit = true - session.IsCommitedOrRollbacked = false - session.IsAutoClose = false - session.AutoResetStatement = true - session.prepareStmt = false - - // !nashtsai! is lazy init better? - session.afterInsertBeans = make(map[interface{}]*[]func(interface{}), 0) - session.afterUpdateBeans = make(map[interface{}]*[]func(interface{}), 0) - session.afterDeleteBeans = make(map[interface{}]*[]func(interface{}), 0) - session.beforeClosures = make([]func(interface{}), 0) - session.afterClosures = make([]func(interface{}), 0) - - session.lastSQL = "" - session.lastSQLArgs = []interface{}{} -} - -// Close release the connection from pool -func (session *Session) Close() { - for _, v := range session.stmtCache { - v.Close() - } - - if session.db != nil { - // When Close be called, if session is a transaction and do not call - // Commit or Rollback, then call Rollback. - if session.Tx != nil && !session.IsCommitedOrRollbacked { - session.Rollback() - } - session.Tx = nil - session.stmtCache = nil - session.Init() - session.db = nil - } -} - -func (session *Session) resetStatement() { - if session.AutoResetStatement { - session.Statement.Init() - } -} - -// Prepare set a flag to session that should be prepare statement before execute query -func (session *Session) Prepare() *Session { - session.prepareStmt = true - return session -} - -// Sql provides raw sql input parameter. When you have a complex SQL statement -// and cannot use Where, Id, In and etc. Methods to describe, you can use SQL. -// -// Deprecated: use SQL instead. -func (session *Session) Sql(query string, args ...interface{}) *Session { - return session.SQL(query, args...) -} - -// SQL provides raw sql input parameter. When you have a complex SQL statement -// and cannot use Where, Id, In and etc. Methods to describe, you can use SQL. -func (session *Session) SQL(query interface{}, args ...interface{}) *Session { - session.Statement.SQL(query, args...) - return session -} - -// Where provides custom query condition. -func (session *Session) Where(query interface{}, args ...interface{}) *Session { - session.Statement.Where(query, args...) - return session -} - -// And provides custom query condition. -func (session *Session) And(query interface{}, args ...interface{}) *Session { - session.Statement.And(query, args...) - return session -} - -// Or provides custom query condition. -func (session *Session) Or(query interface{}, args ...interface{}) *Session { - session.Statement.Or(query, args...) - return session -} - -// Id provides converting id as a query condition -// -// Deprecated: use ID instead -func (session *Session) Id(id interface{}) *Session { - return session.ID(id) -} - -// ID provides converting id as a query condition -func (session *Session) ID(id interface{}) *Session { - session.Statement.ID(id) - return session -} - -// Before Apply before Processor, affected bean is passed to closure arg -func (session *Session) Before(closures func(interface{})) *Session { - if closures != nil { - session.beforeClosures = append(session.beforeClosures, closures) - } - return session -} - -// After Apply after Processor, affected bean is passed to closure arg -func (session *Session) After(closures func(interface{})) *Session { - if closures != nil { - session.afterClosures = append(session.afterClosures, closures) - } - return session -} - -// Table can input a string or pointer to struct for special a table to operate. -func (session *Session) Table(tableNameOrBean interface{}) *Session { - session.Statement.Table(tableNameOrBean) - return session -} - -// Alias set the table alias -func (session *Session) Alias(alias string) *Session { - session.Statement.Alias(alias) - return session -} - -// In provides a query string like "id in (1, 2, 3)" -func (session *Session) In(column string, args ...interface{}) *Session { - session.Statement.In(column, args...) - return session -} - -// NotIn provides a query string like "id in (1, 2, 3)" -func (session *Session) NotIn(column string, args ...interface{}) *Session { - session.Statement.NotIn(column, args...) - return session -} - -// Incr provides a query string like "count = count + 1" -func (session *Session) Incr(column string, arg ...interface{}) *Session { - session.Statement.Incr(column, arg...) - return session -} - -// Decr provides a query string like "count = count - 1" -func (session *Session) Decr(column string, arg ...interface{}) *Session { - session.Statement.Decr(column, arg...) - return session -} - -// SetExpr provides a query string like "column = {expression}" -func (session *Session) SetExpr(column string, expression string) *Session { - session.Statement.SetExpr(column, expression) - return session -} - -// Select provides some columns to special -func (session *Session) Select(str string) *Session { - session.Statement.Select(str) - return session -} - -// Cols provides some columns to special -func (session *Session) Cols(columns ...string) *Session { - session.Statement.Cols(columns...) - return session -} - -// AllCols ask all columns -func (session *Session) AllCols() *Session { - session.Statement.AllCols() - return session -} - -// MustCols specify some columns must use even if they are empty -func (session *Session) MustCols(columns ...string) *Session { - session.Statement.MustCols(columns...) - return session -} - -// NoCascade indicate that no cascade load child object -func (session *Session) NoCascade() *Session { - session.Statement.UseCascade = false - return session -} - -// UseBool automatically retrieve condition according struct, but -// if struct has bool field, it will ignore them. So use UseBool -// to tell system to do not ignore them. -// If no parameters, it will use all the bool field of struct, or -// it will use parameters's columns -func (session *Session) UseBool(columns ...string) *Session { - session.Statement.UseBool(columns...) - return session -} - -// Distinct use for distinct columns. Caution: when you are using cache, -// distinct will not be cached because cache system need id, -// but distinct will not provide id -func (session *Session) Distinct(columns ...string) *Session { - session.Statement.Distinct(columns...) - return session -} - -// ForUpdate Set Read/Write locking for UPDATE -func (session *Session) ForUpdate() *Session { - session.Statement.IsForUpdate = true - return session -} - -// Omit Only not use the parameters as select or update columns -func (session *Session) Omit(columns ...string) *Session { - session.Statement.Omit(columns...) - return session -} - -// Nullable Set null when column is zero-value and nullable for update -func (session *Session) Nullable(columns ...string) *Session { - session.Statement.Nullable(columns...) - return session -} - -// NoAutoTime means do not automatically give created field and updated field -// the current time on the current session temporarily -func (session *Session) NoAutoTime() *Session { - session.Statement.UseAutoTime = false - return session -} - -// NoAutoCondition disable generate SQL condition from beans -func (session *Session) NoAutoCondition(no ...bool) *Session { - session.Statement.NoAutoCondition(no...) - return session -} - -// Limit provide limit and offset query condition -func (session *Session) Limit(limit int, start ...int) *Session { - session.Statement.Limit(limit, start...) - return session -} - -// OrderBy provide order by query condition, the input parameter is the content -// after order by on a sql statement. -func (session *Session) OrderBy(order string) *Session { - session.Statement.OrderBy(order) - return session -} - -// Desc provide desc order by query condition, the input parameters are columns. -func (session *Session) Desc(colNames ...string) *Session { - session.Statement.Desc(colNames...) - return session -} - -// Asc provide asc order by query condition, the input parameters are columns. -func (session *Session) Asc(colNames ...string) *Session { - session.Statement.Asc(colNames...) - return session -} - -// StoreEngine is only avialble mysql dialect currently -func (session *Session) StoreEngine(storeEngine string) *Session { - session.Statement.StoreEngine = storeEngine - return session -} - -// Charset is only avialble mysql dialect currently -func (session *Session) Charset(charset string) *Session { - session.Statement.Charset = charset - return session -} - -// Cascade indicates if loading sub Struct -func (session *Session) Cascade(trueOrFalse ...bool) *Session { - if len(trueOrFalse) >= 1 { - session.Statement.UseCascade = trueOrFalse[0] - } - return session -} - -// NoCache ask this session do not retrieve data from cache system and -// get data from database directly. -func (session *Session) NoCache() *Session { - session.Statement.UseCache = false - return session -} - -// Join join_operator should be one of INNER, LEFT OUTER, CROSS etc - this will be prepended to JOIN -func (session *Session) Join(joinOperator string, tablename interface{}, condition string, args ...interface{}) *Session { - session.Statement.Join(joinOperator, tablename, condition, args...) - return session -} - -// GroupBy Generate Group By statement -func (session *Session) GroupBy(keys string) *Session { - session.Statement.GroupBy(keys) - return session -} - -// Having Generate Having statement -func (session *Session) Having(conditions string) *Session { - session.Statement.Having(conditions) - return session -} - -// DB db return the wrapper of sql.DB -func (session *Session) DB() *core.DB { - if session.db == nil { - session.db = session.Engine.db - session.stmtCache = make(map[uint32]*core.Stmt, 0) - } - return session.db -} - -// Conds returns session query conditions -func (session *Session) Conds() builder.Cond { - return session.Statement.cond -} - -func cleanupProcessorsClosures(slices *[]func(interface{})) { - if len(*slices) > 0 { - *slices = make([]func(interface{}), 0) - } -} - -func (session *Session) canCache() bool { - if session.Statement.RefTable == nil || - session.Statement.JoinStr != "" || - session.Statement.RawSQL != "" || - !session.Statement.UseCache || - session.Statement.IsForUpdate || - session.Tx != nil || - len(session.Statement.selectStr) > 0 { - return false - } - return true -} - -func (session *Session) doPrepare(sqlStr string) (stmt *core.Stmt, err error) { - crc := crc32.ChecksumIEEE([]byte(sqlStr)) - // TODO try hash(sqlStr+len(sqlStr)) - var has bool - stmt, has = session.stmtCache[crc] - if !has { - stmt, err = session.DB().Prepare(sqlStr) - if err != nil { - return nil, err - } - session.stmtCache[crc] = stmt - } - return -} - -func (session *Session) getField(dataStruct *reflect.Value, key string, table *core.Table, idx int) *reflect.Value { - var col *core.Column - if col = table.GetColumnIdx(key, idx); col == nil { - //session.Engine.logger.Warnf("table %v has no column %v. %v", table.Name, key, table.ColumnsSeq()) - return nil - } - - fieldValue, err := col.ValueOfV(dataStruct) - if err != nil { - session.Engine.logger.Error(err) - return nil - } - - if !fieldValue.IsValid() || !fieldValue.CanSet() { - session.Engine.logger.Warnf("table %v's column %v is not valid or cannot set", table.Name, key) - return nil - } - return fieldValue -} - -// Cell cell is a result of one column field -type Cell *interface{} - -func (session *Session) rows2Beans(rows *core.Rows, fields []string, fieldsCount int, - table *core.Table, newElemFunc func([]string) reflect.Value, - sliceValueSetFunc func(*reflect.Value, core.PK) error) error { - for rows.Next() { - var newValue = newElemFunc(fields) - bean := newValue.Interface() - dataStruct := rValue(bean) - pk, err := session._row2Bean(rows, fields, fieldsCount, bean, &dataStruct, table) - if err != nil { - return err - } - - err = sliceValueSetFunc(&newValue, pk) - if err != nil { - return err - } - } - return nil -} - -func (session *Session) row2Bean(rows *core.Rows, fields []string, fieldsCount int, bean interface{}) (core.PK, error) { - dataStruct := rValue(bean) - if dataStruct.Kind() != reflect.Struct { - return nil, errors.New("Expected a pointer to a struct") - } - - session.Statement.setRefValue(dataStruct) - - return session._row2Bean(rows, fields, fieldsCount, bean, &dataStruct, session.Statement.RefTable) -} - -func (session *Session) _row2Bean(rows *core.Rows, fields []string, fieldsCount int, bean interface{}, dataStruct *reflect.Value, table *core.Table) (core.PK, error) { - scanResults := make([]interface{}, fieldsCount) - for i := 0; i < len(fields); i++ { - var cell interface{} - scanResults[i] = &cell - } - if err := rows.Scan(scanResults...); err != nil { - return nil, err - } - - if b, hasBeforeSet := bean.(BeforeSetProcessor); hasBeforeSet { - for ii, key := range fields { - b.BeforeSet(key, Cell(scanResults[ii].(*interface{}))) - } - } - - defer func() { - if b, hasAfterSet := bean.(AfterSetProcessor); hasAfterSet { - for ii, key := range fields { - b.AfterSet(key, Cell(scanResults[ii].(*interface{}))) - } - } - }() - - var tempMap = make(map[string]int) - var pk core.PK - for ii, key := range fields { - var idx int - var ok bool - var lKey = strings.ToLower(key) - if idx, ok = tempMap[lKey]; !ok { - idx = 0 - } else { - idx = idx + 1 - } - tempMap[lKey] = idx - - if fieldValue := session.getField(dataStruct, key, table, idx); fieldValue != nil { - rawValue := reflect.Indirect(reflect.ValueOf(scanResults[ii])) - - // if row is null then ignore - if rawValue.Interface() == nil { - continue - } - - if fieldValue.CanAddr() { - if structConvert, ok := fieldValue.Addr().Interface().(core.Conversion); ok { - if data, err := value2Bytes(&rawValue); err == nil { - structConvert.FromDB(data) - } else { - session.Engine.logger.Error(err) - } - continue - } - } - - if _, ok := fieldValue.Interface().(core.Conversion); ok { - if data, err := value2Bytes(&rawValue); err == nil { - if fieldValue.Kind() == reflect.Ptr && fieldValue.IsNil() { - fieldValue.Set(reflect.New(fieldValue.Type().Elem())) - } - fieldValue.Interface().(core.Conversion).FromDB(data) - } else { - session.Engine.logger.Error(err) - } - continue - } - - rawValueType := reflect.TypeOf(rawValue.Interface()) - vv := reflect.ValueOf(rawValue.Interface()) - col := table.GetColumnIdx(key, idx) - if col.IsPrimaryKey { - pk = append(pk, rawValue.Interface()) - } - fieldType := fieldValue.Type() - hasAssigned := false - - if col.SQLType.IsJson() { - var bs []byte - if rawValueType.Kind() == reflect.String { - bs = []byte(vv.String()) - } else if rawValueType.ConvertibleTo(core.BytesType) { - bs = vv.Bytes() - } else { - return nil, fmt.Errorf("unsupported database data type: %s %v", key, rawValueType.Kind()) - } - - hasAssigned = true - - if len(bs) > 0 { - if fieldValue.CanAddr() { - err := json.Unmarshal(bs, fieldValue.Addr().Interface()) - if err != nil { - session.Engine.logger.Error(key, err) - return nil, err - } - } else { - x := reflect.New(fieldType) - err := json.Unmarshal(bs, x.Interface()) - if err != nil { - session.Engine.logger.Error(key, err) - return nil, err - } - fieldValue.Set(x.Elem()) - } - } - - continue - } - - switch fieldType.Kind() { - case reflect.Complex64, reflect.Complex128: - // TODO: reimplement this - var bs []byte - if rawValueType.Kind() == reflect.String { - bs = []byte(vv.String()) - } else if rawValueType.ConvertibleTo(core.BytesType) { - bs = vv.Bytes() - } - - hasAssigned = true - if len(bs) > 0 { - if fieldValue.CanAddr() { - err := json.Unmarshal(bs, fieldValue.Addr().Interface()) - if err != nil { - session.Engine.logger.Error(err) - return nil, err - } - } else { - x := reflect.New(fieldType) - err := json.Unmarshal(bs, x.Interface()) - if err != nil { - session.Engine.logger.Error(err) - return nil, err - } - fieldValue.Set(x.Elem()) - } - } - case reflect.Slice, reflect.Array: - switch rawValueType.Kind() { - case reflect.Slice, reflect.Array: - switch rawValueType.Elem().Kind() { - case reflect.Uint8: - if fieldType.Elem().Kind() == reflect.Uint8 { - hasAssigned = true - fieldValue.Set(vv) - } - } - } - case reflect.String: - if rawValueType.Kind() == reflect.String { - hasAssigned = true - fieldValue.SetString(vv.String()) - } - case reflect.Bool: - if rawValueType.Kind() == reflect.Bool { - hasAssigned = true - fieldValue.SetBool(vv.Bool()) - } - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - switch rawValueType.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - hasAssigned = true - fieldValue.SetInt(vv.Int()) - } - case reflect.Float32, reflect.Float64: - switch rawValueType.Kind() { - case reflect.Float32, reflect.Float64: - hasAssigned = true - fieldValue.SetFloat(vv.Float()) - } - case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: - switch rawValueType.Kind() { - case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: - hasAssigned = true - fieldValue.SetUint(vv.Uint()) - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - hasAssigned = true - fieldValue.SetUint(uint64(vv.Int())) - } - case reflect.Struct: - if fieldType.ConvertibleTo(core.TimeType) { - if rawValueType == core.TimeType { - hasAssigned = true - - t := vv.Convert(core.TimeType).Interface().(time.Time) - - z, _ := t.Zone() - dbTZ := session.Engine.DatabaseTZ - if dbTZ == nil { - if session.Engine.dialect.DBType() == core.SQLITE { - dbTZ = time.UTC - } else { - dbTZ = time.Local - } - } - - // set new location if database don't save timezone or give an incorrect timezone - if len(z) == 0 || t.Year() == 0 || t.Location().String() != dbTZ.String() { // !nashtsai! HACK tmp work around for lib/pq doesn't properly time with location - session.Engine.logger.Debugf("empty zone key[%v] : %v | zone: %v | location: %+v\n", key, t, z, *t.Location()) - t = time.Date(t.Year(), t.Month(), t.Day(), t.Hour(), - t.Minute(), t.Second(), t.Nanosecond(), dbTZ) - } - - // !nashtsai! convert to engine location - if col.TimeZone == nil { - t = t.In(session.Engine.TZLocation) - } else { - t = t.In(col.TimeZone) - } - fieldValue.Set(reflect.ValueOf(t).Convert(fieldType)) - - // t = fieldValue.Interface().(time.Time) - // z, _ = t.Zone() - // session.Engine.LogDebug("fieldValue key[%v]: %v | zone: %v | location: %+v\n", key, t, z, *t.Location()) - } else if rawValueType == core.IntType || rawValueType == core.Int64Type || - rawValueType == core.Int32Type { - hasAssigned = true - var tz *time.Location - if col.TimeZone == nil { - tz = session.Engine.TZLocation - } else { - tz = col.TimeZone - } - t := time.Unix(vv.Int(), 0).In(tz) - //vv = reflect.ValueOf(t) - fieldValue.Set(reflect.ValueOf(t).Convert(fieldType)) - } else { - if d, ok := vv.Interface().([]uint8); ok { - hasAssigned = true - t, err := session.byte2Time(col, d) - if err != nil { - session.Engine.logger.Error("byte2Time error:", err.Error()) - hasAssigned = false - } else { - fieldValue.Set(reflect.ValueOf(t).Convert(fieldType)) - } - } else if d, ok := vv.Interface().(string); ok { - hasAssigned = true - t, err := session.str2Time(col, d) - if err != nil { - session.Engine.logger.Error("byte2Time error:", err.Error()) - hasAssigned = false - } else { - fieldValue.Set(reflect.ValueOf(t).Convert(fieldType)) - } - } else { - panic(fmt.Sprintf("rawValueType is %v, value is %v", rawValueType, vv.Interface())) - } - } - } else if nulVal, ok := fieldValue.Addr().Interface().(sql.Scanner); ok { - // !! 增加支持sql.Scanner接口的结构,如sql.NullString - hasAssigned = true - if err := nulVal.Scan(vv.Interface()); err != nil { - session.Engine.logger.Error("sql.Sanner error:", err.Error()) - hasAssigned = false - } - } else if col.SQLType.IsJson() { - if rawValueType.Kind() == reflect.String { - hasAssigned = true - x := reflect.New(fieldType) - if len([]byte(vv.String())) > 0 { - err := json.Unmarshal([]byte(vv.String()), x.Interface()) - if err != nil { - session.Engine.logger.Error(err) - return nil, err - } - fieldValue.Set(x.Elem()) - } - } else if rawValueType.Kind() == reflect.Slice { - hasAssigned = true - x := reflect.New(fieldType) - if len(vv.Bytes()) > 0 { - err := json.Unmarshal(vv.Bytes(), x.Interface()) - if err != nil { - session.Engine.logger.Error(err) - return nil, err - } - fieldValue.Set(x.Elem()) - } - } - } else if session.Statement.UseCascade { - table := session.Engine.autoMapType(*fieldValue) - if table != nil { - hasAssigned = true - if len(table.PrimaryKeys) != 1 { - panic("unsupported non or composited primary key cascade") - } - var pk = make(core.PK, len(table.PrimaryKeys)) - - switch rawValueType.Kind() { - case reflect.Int64: - pk[0] = vv.Int() - case reflect.Int: - pk[0] = int(vv.Int()) - case reflect.Int32: - pk[0] = int32(vv.Int()) - case reflect.Int16: - pk[0] = int16(vv.Int()) - case reflect.Int8: - pk[0] = int8(vv.Int()) - case reflect.Uint64: - pk[0] = vv.Uint() - case reflect.Uint: - pk[0] = uint(vv.Uint()) - case reflect.Uint32: - pk[0] = uint32(vv.Uint()) - case reflect.Uint16: - pk[0] = uint16(vv.Uint()) - case reflect.Uint8: - pk[0] = uint8(vv.Uint()) - case reflect.String: - pk[0] = vv.String() - case reflect.Slice: - pk[0], _ = strconv.ParseInt(string(rawValue.Interface().([]byte)), 10, 64) - default: - panic(fmt.Sprintf("unsupported primary key type: %v, %v", rawValueType, fieldValue)) - } - - if !isPKZero(pk) { - // !nashtsai! TODO for hasOne relationship, it's preferred to use join query for eager fetch - // however, also need to consider adding a 'lazy' attribute to xorm tag which allow hasOne - // property to be fetched lazily - structInter := reflect.New(fieldValue.Type()) - newsession := session.Engine.NewSession() - defer newsession.Close() - has, err := newsession.Id(pk).NoCascade().Get(structInter.Interface()) - if err != nil { - return nil, err - } - if has { - //v := structInter.Elem().Interface() - //fieldValue.Set(reflect.ValueOf(v)) - fieldValue.Set(structInter.Elem()) - } else { - return nil, errors.New("cascade obj is not exist") - } - } - } else { - session.Engine.logger.Error("unsupported struct type in Scan: ", fieldValue.Type().String()) - } - } - case reflect.Ptr: - // !nashtsai! TODO merge duplicated codes above - //typeStr := fieldType.String() - switch fieldType { - // following types case matching ptr's native type, therefore assign ptr directly - case core.PtrStringType: - if rawValueType.Kind() == reflect.String { - x := vv.String() - hasAssigned = true - fieldValue.Set(reflect.ValueOf(&x)) - } - case core.PtrBoolType: - if rawValueType.Kind() == reflect.Bool { - x := vv.Bool() - hasAssigned = true - fieldValue.Set(reflect.ValueOf(&x)) - } - case core.PtrTimeType: - if rawValueType == core.PtrTimeType { - hasAssigned = true - var x = rawValue.Interface().(time.Time) - fieldValue.Set(reflect.ValueOf(&x)) - } - case core.PtrFloat64Type: - if rawValueType.Kind() == reflect.Float64 { - x := vv.Float() - hasAssigned = true - fieldValue.Set(reflect.ValueOf(&x)) - } - case core.PtrUint64Type: - if rawValueType.Kind() == reflect.Int64 { - var x = uint64(vv.Int()) - hasAssigned = true - fieldValue.Set(reflect.ValueOf(&x)) - } - case core.PtrInt64Type: - if rawValueType.Kind() == reflect.Int64 { - x := vv.Int() - hasAssigned = true - fieldValue.Set(reflect.ValueOf(&x)) - } - case core.PtrFloat32Type: - if rawValueType.Kind() == reflect.Float64 { - var x = float32(vv.Float()) - hasAssigned = true - fieldValue.Set(reflect.ValueOf(&x)) - } - case core.PtrIntType: - if rawValueType.Kind() == reflect.Int64 { - var x = int(vv.Int()) - hasAssigned = true - fieldValue.Set(reflect.ValueOf(&x)) - } - case core.PtrInt32Type: - if rawValueType.Kind() == reflect.Int64 { - var x = int32(vv.Int()) - hasAssigned = true - fieldValue.Set(reflect.ValueOf(&x)) - } - case core.PtrInt8Type: - if rawValueType.Kind() == reflect.Int64 { - var x = int8(vv.Int()) - hasAssigned = true - fieldValue.Set(reflect.ValueOf(&x)) - } - case core.PtrInt16Type: - if rawValueType.Kind() == reflect.Int64 { - var x = int16(vv.Int()) - hasAssigned = true - fieldValue.Set(reflect.ValueOf(&x)) - } - case core.PtrUintType: - if rawValueType.Kind() == reflect.Int64 { - var x = uint(vv.Int()) - hasAssigned = true - fieldValue.Set(reflect.ValueOf(&x)) - } - case core.PtrUint32Type: - if rawValueType.Kind() == reflect.Int64 { - var x = uint32(vv.Int()) - hasAssigned = true - fieldValue.Set(reflect.ValueOf(&x)) - } - case core.Uint8Type: - if rawValueType.Kind() == reflect.Int64 { - var x = uint8(vv.Int()) - hasAssigned = true - fieldValue.Set(reflect.ValueOf(&x)) - } - case core.Uint16Type: - if rawValueType.Kind() == reflect.Int64 { - var x = uint16(vv.Int()) - hasAssigned = true - fieldValue.Set(reflect.ValueOf(&x)) - } - case core.Complex64Type: - var x complex64 - if len([]byte(vv.String())) > 0 { - err := json.Unmarshal([]byte(vv.String()), &x) - if err != nil { - session.Engine.logger.Error(err) - } else { - fieldValue.Set(reflect.ValueOf(&x)) - } - } - hasAssigned = true - case core.Complex128Type: - var x complex128 - if len([]byte(vv.String())) > 0 { - err := json.Unmarshal([]byte(vv.String()), &x) - if err != nil { - session.Engine.logger.Error(err) - } else { - fieldValue.Set(reflect.ValueOf(&x)) - } - } - hasAssigned = true - } // switch fieldType - // default: - // session.Engine.LogError("unsupported type in Scan: ", reflect.TypeOf(v).String()) - } // switch fieldType.Kind() - - // !nashtsai! for value can't be assigned directly fallback to convert to []byte then back to value - if !hasAssigned { - data, err := value2Bytes(&rawValue) - if err == nil { - session.bytes2Value(col, fieldValue, data) - } else { - session.Engine.logger.Error(err.Error()) - } - } - } - } - return pk, nil -} - -func (session *Session) queryPreprocess(sqlStr *string, paramStr ...interface{}) { - for _, filter := range session.Engine.dialect.Filters() { - *sqlStr = filter.Do(*sqlStr, session.Engine.dialect, session.Statement.RefTable) - } - - session.saveLastSQL(*sqlStr, paramStr...) -} - -func (session *Session) str2Time(col *core.Column, data string) (outTime time.Time, outErr error) { - sdata := strings.TrimSpace(data) - var x time.Time - var err error - - if sdata == "0000-00-00 00:00:00" || - sdata == "0001-01-01 00:00:00" { - } else if !strings.ContainsAny(sdata, "- :") { // !nashtsai! has only found that mymysql driver is using this for time type column - // time stamp - sd, err := strconv.ParseInt(sdata, 10, 64) - if err == nil { - x = time.Unix(sd, 0) - // !nashtsai! HACK mymysql driver is causing Local location being change to CHAT and cause wrong time conversion - if col.TimeZone == nil { - x = x.In(session.Engine.TZLocation) - } else { - x = x.In(col.TimeZone) - } - session.Engine.logger.Debugf("time(0) key[%v]: %+v | sdata: [%v]\n", col.FieldName, x, sdata) - } else { - session.Engine.logger.Debugf("time(0) err key[%v]: %+v | sdata: [%v]\n", col.FieldName, x, sdata) - } - } else if len(sdata) > 19 && strings.Contains(sdata, "-") { - x, err = time.ParseInLocation(time.RFC3339Nano, sdata, session.Engine.TZLocation) - session.Engine.logger.Debugf("time(1) key[%v]: %+v | sdata: [%v]\n", col.FieldName, x, sdata) - if err != nil { - x, err = time.ParseInLocation("2006-01-02 15:04:05.999999999", sdata, session.Engine.TZLocation) - session.Engine.logger.Debugf("time(2) key[%v]: %+v | sdata: [%v]\n", col.FieldName, x, sdata) - } - if err != nil { - x, err = time.ParseInLocation("2006-01-02 15:04:05.9999999 Z07:00", sdata, session.Engine.TZLocation) - session.Engine.logger.Debugf("time(3) key[%v]: %+v | sdata: [%v]\n", col.FieldName, x, sdata) - } - - } else if len(sdata) == 19 && strings.Contains(sdata, "-") { - x, err = time.ParseInLocation("2006-01-02 15:04:05", sdata, session.Engine.TZLocation) - session.Engine.logger.Debugf("time(4) key[%v]: %+v | sdata: [%v]\n", col.FieldName, x, sdata) - } else if len(sdata) == 10 && sdata[4] == '-' && sdata[7] == '-' { - x, err = time.ParseInLocation("2006-01-02", sdata, session.Engine.TZLocation) - session.Engine.logger.Debugf("time(5) key[%v]: %+v | sdata: [%v]\n", col.FieldName, x, sdata) - } else if col.SQLType.Name == core.Time { - if strings.Contains(sdata, " ") { - ssd := strings.Split(sdata, " ") - sdata = ssd[1] - } - - sdata = strings.TrimSpace(sdata) - if session.Engine.dialect.DBType() == core.MYSQL && len(sdata) > 8 { - sdata = sdata[len(sdata)-8:] - } - - st := fmt.Sprintf("2006-01-02 %v", sdata) - x, err = time.ParseInLocation("2006-01-02 15:04:05", st, session.Engine.TZLocation) - session.Engine.logger.Debugf("time(6) key[%v]: %+v | sdata: [%v]\n", col.FieldName, x, sdata) - } else { - outErr = fmt.Errorf("unsupported time format %v", sdata) - return - } - if err != nil { - outErr = fmt.Errorf("unsupported time format %v: %v", sdata, err) - return - } - outTime = x - return -} - -func (session *Session) byte2Time(col *core.Column, data []byte) (outTime time.Time, outErr error) { - return session.str2Time(col, string(data)) -} - -// convert a db data([]byte) to a field value -func (session *Session) bytes2Value(col *core.Column, fieldValue *reflect.Value, data []byte) error { - if structConvert, ok := fieldValue.Addr().Interface().(core.Conversion); ok { - return structConvert.FromDB(data) - } - - if structConvert, ok := fieldValue.Interface().(core.Conversion); ok { - return structConvert.FromDB(data) - } - - var v interface{} - key := col.Name - fieldType := fieldValue.Type() - - switch fieldType.Kind() { - case reflect.Complex64, reflect.Complex128: - x := reflect.New(fieldType) - if len(data) > 0 { - err := json.Unmarshal(data, x.Interface()) - if err != nil { - session.Engine.logger.Error(err) - return err - } - fieldValue.Set(x.Elem()) - } - case reflect.Slice, reflect.Array, reflect.Map: - v = data - t := fieldType.Elem() - k := t.Kind() - if col.SQLType.IsText() { - x := reflect.New(fieldType) - if len(data) > 0 { - err := json.Unmarshal(data, x.Interface()) - if err != nil { - session.Engine.logger.Error(err) - return err - } - fieldValue.Set(x.Elem()) - } - } else if col.SQLType.IsBlob() { - if k == reflect.Uint8 { - fieldValue.Set(reflect.ValueOf(v)) - } else { - x := reflect.New(fieldType) - if len(data) > 0 { - err := json.Unmarshal(data, x.Interface()) - if err != nil { - session.Engine.logger.Error(err) - return err - } - fieldValue.Set(x.Elem()) - } - } - } else { - return ErrUnSupportedType - } - case reflect.String: - fieldValue.SetString(string(data)) - case reflect.Bool: - d := string(data) - v, err := strconv.ParseBool(d) - if err != nil { - return fmt.Errorf("arg %v as bool: %s", key, err.Error()) - } - fieldValue.Set(reflect.ValueOf(v)) - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - sdata := string(data) - var x int64 - var err error - // for mysql, when use bit, it returned \x01 - if col.SQLType.Name == core.Bit && - session.Engine.dialect.DBType() == core.MYSQL { // !nashtsai! TODO dialect needs to provide conversion interface API - if len(data) == 1 { - x = int64(data[0]) - } else { - x = 0 - } - } else if strings.HasPrefix(sdata, "0x") { - x, err = strconv.ParseInt(sdata, 16, 64) - } else if strings.HasPrefix(sdata, "0") { - x, err = strconv.ParseInt(sdata, 8, 64) - } else if strings.EqualFold(sdata, "true") { - x = 1 - } else if strings.EqualFold(sdata, "false") { - x = 0 - } else { - x, err = strconv.ParseInt(sdata, 10, 64) - } - if err != nil { - return fmt.Errorf("arg %v as int: %s", key, err.Error()) - } - fieldValue.SetInt(x) - case reflect.Float32, reflect.Float64: - x, err := strconv.ParseFloat(string(data), 64) - if err != nil { - return fmt.Errorf("arg %v as float64: %s", key, err.Error()) - } - fieldValue.SetFloat(x) - case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: - x, err := strconv.ParseUint(string(data), 10, 64) - if err != nil { - return fmt.Errorf("arg %v as int: %s", key, err.Error()) - } - fieldValue.SetUint(x) - //Currently only support Time type - case reflect.Struct: - // !! 增加支持sql.Scanner接口的结构,如sql.NullString - if nulVal, ok := fieldValue.Addr().Interface().(sql.Scanner); ok { - if err := nulVal.Scan(data); err != nil { - return fmt.Errorf("sql.Scan(%v) failed: %s ", data, err.Error()) - } - } else { - if fieldType.ConvertibleTo(core.TimeType) { - x, err := session.byte2Time(col, data) - if err != nil { - return err - } - v = x - fieldValue.Set(reflect.ValueOf(v).Convert(fieldType)) - } else if session.Statement.UseCascade { - table := session.Engine.autoMapType(*fieldValue) - if table != nil { - // TODO: current only support 1 primary key - if len(table.PrimaryKeys) > 1 { - panic("unsupported composited primary key cascade") - } - var pk = make(core.PK, len(table.PrimaryKeys)) - rawValueType := table.ColumnType(table.PKColumns()[0].FieldName) - var err error - pk[0], err = str2PK(string(data), rawValueType) - if err != nil { - return err - } - - if !isPKZero(pk) { - // !nashtsai! TODO for hasOne relationship, it's preferred to use join query for eager fetch - // however, also need to consider adding a 'lazy' attribute to xorm tag which allow hasOne - // property to be fetched lazily - structInter := reflect.New(fieldValue.Type()) - newsession := session.Engine.NewSession() - defer newsession.Close() - has, err := newsession.Id(pk).NoCascade().Get(structInter.Interface()) - if err != nil { - return err - } - if has { - v = structInter.Elem().Interface() - fieldValue.Set(reflect.ValueOf(v)) - } else { - return errors.New("cascade obj is not exist") - } - } - } else { - return fmt.Errorf("unsupported struct type in Scan: %s", fieldValue.Type().String()) - } - } - } - case reflect.Ptr: - // !nashtsai! TODO merge duplicated codes above - //typeStr := fieldType.String() - switch fieldType.Elem().Kind() { - // case "*string": - case core.StringType.Kind(): - x := string(data) - fieldValue.Set(reflect.ValueOf(&x).Convert(fieldType)) - // case "*bool": - case core.BoolType.Kind(): - d := string(data) - v, err := strconv.ParseBool(d) - if err != nil { - return fmt.Errorf("arg %v as bool: %s", key, err.Error()) - } - fieldValue.Set(reflect.ValueOf(&v).Convert(fieldType)) - // case "*complex64": - case core.Complex64Type.Kind(): - var x complex64 - if len(data) > 0 { - err := json.Unmarshal(data, &x) - if err != nil { - session.Engine.logger.Error(err) - return err - } - fieldValue.Set(reflect.ValueOf(&x).Convert(fieldType)) - } - // case "*complex128": - case core.Complex128Type.Kind(): - var x complex128 - if len(data) > 0 { - err := json.Unmarshal(data, &x) - if err != nil { - session.Engine.logger.Error(err) - return err - } - fieldValue.Set(reflect.ValueOf(&x).Convert(fieldType)) - } - // case "*float64": - case core.Float64Type.Kind(): - x, err := strconv.ParseFloat(string(data), 64) - if err != nil { - return fmt.Errorf("arg %v as float64: %s", key, err.Error()) - } - fieldValue.Set(reflect.ValueOf(&x).Convert(fieldType)) - // case "*float32": - case core.Float32Type.Kind(): - var x float32 - x1, err := strconv.ParseFloat(string(data), 32) - if err != nil { - return fmt.Errorf("arg %v as float32: %s", key, err.Error()) - } - x = float32(x1) - fieldValue.Set(reflect.ValueOf(&x).Convert(fieldType)) - // case "*uint64": - case core.Uint64Type.Kind(): - var x uint64 - x, err := strconv.ParseUint(string(data), 10, 64) - if err != nil { - return fmt.Errorf("arg %v as int: %s", key, err.Error()) - } - fieldValue.Set(reflect.ValueOf(&x).Convert(fieldType)) - // case "*uint": - case core.UintType.Kind(): - var x uint - x1, err := strconv.ParseUint(string(data), 10, 64) - if err != nil { - return fmt.Errorf("arg %v as int: %s", key, err.Error()) - } - x = uint(x1) - fieldValue.Set(reflect.ValueOf(&x).Convert(fieldType)) - // case "*uint32": - case core.Uint32Type.Kind(): - var x uint32 - x1, err := strconv.ParseUint(string(data), 10, 64) - if err != nil { - return fmt.Errorf("arg %v as int: %s", key, err.Error()) - } - x = uint32(x1) - fieldValue.Set(reflect.ValueOf(&x).Convert(fieldType)) - // case "*uint8": - case core.Uint8Type.Kind(): - var x uint8 - x1, err := strconv.ParseUint(string(data), 10, 64) - if err != nil { - return fmt.Errorf("arg %v as int: %s", key, err.Error()) - } - x = uint8(x1) - fieldValue.Set(reflect.ValueOf(&x).Convert(fieldType)) - // case "*uint16": - case core.Uint16Type.Kind(): - var x uint16 - x1, err := strconv.ParseUint(string(data), 10, 64) - if err != nil { - return fmt.Errorf("arg %v as int: %s", key, err.Error()) - } - x = uint16(x1) - fieldValue.Set(reflect.ValueOf(&x).Convert(fieldType)) - // case "*int64": - case core.Int64Type.Kind(): - sdata := string(data) - var x int64 - var err error - // for mysql, when use bit, it returned \x01 - if col.SQLType.Name == core.Bit && - strings.Contains(session.Engine.DriverName(), "mysql") { - if len(data) == 1 { - x = int64(data[0]) - } else { - x = 0 - } - } else if strings.HasPrefix(sdata, "0x") { - x, err = strconv.ParseInt(sdata, 16, 64) - } else if strings.HasPrefix(sdata, "0") { - x, err = strconv.ParseInt(sdata, 8, 64) - } else { - x, err = strconv.ParseInt(sdata, 10, 64) - } - if err != nil { - return fmt.Errorf("arg %v as int: %s", key, err.Error()) - } - fieldValue.Set(reflect.ValueOf(&x).Convert(fieldType)) - // case "*int": - case core.IntType.Kind(): - sdata := string(data) - var x int - var x1 int64 - var err error - // for mysql, when use bit, it returned \x01 - if col.SQLType.Name == core.Bit && - strings.Contains(session.Engine.DriverName(), "mysql") { - if len(data) == 1 { - x = int(data[0]) - } else { - x = 0 - } - } else if strings.HasPrefix(sdata, "0x") { - x1, err = strconv.ParseInt(sdata, 16, 64) - x = int(x1) - } else if strings.HasPrefix(sdata, "0") { - x1, err = strconv.ParseInt(sdata, 8, 64) - x = int(x1) - } else { - x1, err = strconv.ParseInt(sdata, 10, 64) - x = int(x1) - } - if err != nil { - return fmt.Errorf("arg %v as int: %s", key, err.Error()) - } - fieldValue.Set(reflect.ValueOf(&x).Convert(fieldType)) - // case "*int32": - case core.Int32Type.Kind(): - sdata := string(data) - var x int32 - var x1 int64 - var err error - // for mysql, when use bit, it returned \x01 - if col.SQLType.Name == core.Bit && - session.Engine.dialect.DBType() == core.MYSQL { - if len(data) == 1 { - x = int32(data[0]) - } else { - x = 0 - } - } else if strings.HasPrefix(sdata, "0x") { - x1, err = strconv.ParseInt(sdata, 16, 64) - x = int32(x1) - } else if strings.HasPrefix(sdata, "0") { - x1, err = strconv.ParseInt(sdata, 8, 64) - x = int32(x1) - } else { - x1, err = strconv.ParseInt(sdata, 10, 64) - x = int32(x1) - } - if err != nil { - return fmt.Errorf("arg %v as int: %s", key, err.Error()) - } - fieldValue.Set(reflect.ValueOf(&x).Convert(fieldType)) - // case "*int8": - case core.Int8Type.Kind(): - sdata := string(data) - var x int8 - var x1 int64 - var err error - // for mysql, when use bit, it returned \x01 - if col.SQLType.Name == core.Bit && - strings.Contains(session.Engine.DriverName(), "mysql") { - if len(data) == 1 { - x = int8(data[0]) - } else { - x = 0 - } - } else if strings.HasPrefix(sdata, "0x") { - x1, err = strconv.ParseInt(sdata, 16, 64) - x = int8(x1) - } else if strings.HasPrefix(sdata, "0") { - x1, err = strconv.ParseInt(sdata, 8, 64) - x = int8(x1) - } else { - x1, err = strconv.ParseInt(sdata, 10, 64) - x = int8(x1) - } - if err != nil { - return fmt.Errorf("arg %v as int: %s", key, err.Error()) - } - fieldValue.Set(reflect.ValueOf(&x).Convert(fieldType)) - // case "*int16": - case core.Int16Type.Kind(): - sdata := string(data) - var x int16 - var x1 int64 - var err error - // for mysql, when use bit, it returned \x01 - if col.SQLType.Name == core.Bit && - strings.Contains(session.Engine.DriverName(), "mysql") { - if len(data) == 1 { - x = int16(data[0]) - } else { - x = 0 - } - } else if strings.HasPrefix(sdata, "0x") { - x1, err = strconv.ParseInt(sdata, 16, 64) - x = int16(x1) - } else if strings.HasPrefix(sdata, "0") { - x1, err = strconv.ParseInt(sdata, 8, 64) - x = int16(x1) - } else { - x1, err = strconv.ParseInt(sdata, 10, 64) - x = int16(x1) - } - if err != nil { - return fmt.Errorf("arg %v as int: %s", key, err.Error()) - } - fieldValue.Set(reflect.ValueOf(&x).Convert(fieldType)) - // case "*SomeStruct": - case reflect.Struct: - switch fieldType { - // case "*.time.Time": - case core.PtrTimeType: - x, err := session.byte2Time(col, data) - if err != nil { - return err - } - v = x - fieldValue.Set(reflect.ValueOf(&x)) - default: - if session.Statement.UseCascade { - structInter := reflect.New(fieldType.Elem()) - table := session.Engine.autoMapType(structInter.Elem()) - if table != nil { - if len(table.PrimaryKeys) > 1 { - panic("unsupported composited primary key cascade") - } - var pk = make(core.PK, len(table.PrimaryKeys)) - var err error - rawValueType := table.ColumnType(table.PKColumns()[0].FieldName) - pk[0], err = str2PK(string(data), rawValueType) - if err != nil { - return err - } - - if !isPKZero(pk) { - // !nashtsai! TODO for hasOne relationship, it's preferred to use join query for eager fetch - // however, also need to consider adding a 'lazy' attribute to xorm tag which allow hasOne - // property to be fetched lazily - newsession := session.Engine.NewSession() - defer newsession.Close() - has, err := newsession.Id(pk).NoCascade().Get(structInter.Interface()) - if err != nil { - return err - } - if has { - v = structInter.Interface() - fieldValue.Set(reflect.ValueOf(v)) - } else { - return errors.New("cascade obj is not exist") - } - } - } - } else { - return fmt.Errorf("unsupported struct type in Scan: %s", fieldValue.Type().String()) - } - } - default: - return fmt.Errorf("unsupported type in Scan: %s", fieldValue.Type().String()) - } - default: - return fmt.Errorf("unsupported type in Scan: %s", fieldValue.Type().String()) - } - - return nil -} - -// convert a field value of a struct to interface for put into db -func (session *Session) value2Interface(col *core.Column, fieldValue reflect.Value) (interface{}, error) { - if fieldValue.CanAddr() { - if fieldConvert, ok := fieldValue.Addr().Interface().(core.Conversion); ok { - data, err := fieldConvert.ToDB() - if err != nil { - return 0, err - } - if col.SQLType.IsBlob() { - return data, nil - } - return string(data), nil - } - } - - if fieldConvert, ok := fieldValue.Interface().(core.Conversion); ok { - data, err := fieldConvert.ToDB() - if err != nil { - return 0, err - } - if col.SQLType.IsBlob() { - return data, nil - } - return string(data), nil - } - - fieldType := fieldValue.Type() - k := fieldType.Kind() - if k == reflect.Ptr { - if fieldValue.IsNil() { - return nil, nil - } else if !fieldValue.IsValid() { - session.Engine.logger.Warn("the field[", col.FieldName, "] is invalid") - return nil, nil - } else { - // !nashtsai! deference pointer type to instance type - fieldValue = fieldValue.Elem() - fieldType = fieldValue.Type() - k = fieldType.Kind() - } - } - - switch k { - case reflect.Bool: - return fieldValue.Bool(), nil - case reflect.String: - return fieldValue.String(), nil - case reflect.Struct: - if fieldType.ConvertibleTo(core.TimeType) { - t := fieldValue.Convert(core.TimeType).Interface().(time.Time) - if session.Engine.dialect.DBType() == core.MSSQL { - if t.IsZero() { - return nil, nil - } - } - tf := session.Engine.FormatTime(col.SQLType.Name, t) - return tf, nil - } - - if !col.SQLType.IsJson() { - // !! 增加支持driver.Valuer接口的结构,如sql.NullString - if v, ok := fieldValue.Interface().(driver.Valuer); ok { - return v.Value() - } - - fieldTable := session.Engine.autoMapType(fieldValue) - if len(fieldTable.PrimaryKeys) == 1 { - pkField := reflect.Indirect(fieldValue).FieldByName(fieldTable.PKColumns()[0].FieldName) - return pkField.Interface(), nil - } - return 0, fmt.Errorf("no primary key for col %v", col.Name) - } - - if col.SQLType.IsText() { - bytes, err := json.Marshal(fieldValue.Interface()) - if err != nil { - session.Engine.logger.Error(err) - return 0, err - } - return string(bytes), nil - } else if col.SQLType.IsBlob() { - bytes, err := json.Marshal(fieldValue.Interface()) - if err != nil { - session.Engine.logger.Error(err) - return 0, err - } - return bytes, nil - } - return nil, fmt.Errorf("Unsupported type %v", fieldValue.Type()) - case reflect.Complex64, reflect.Complex128: - bytes, err := json.Marshal(fieldValue.Interface()) - if err != nil { - session.Engine.logger.Error(err) - return 0, err - } - return string(bytes), nil - case reflect.Array, reflect.Slice, reflect.Map: - if !fieldValue.IsValid() { - return fieldValue.Interface(), nil - } - - if col.SQLType.IsText() { - bytes, err := json.Marshal(fieldValue.Interface()) - if err != nil { - session.Engine.logger.Error(err) - return 0, err - } - return string(bytes), nil - } else if col.SQLType.IsBlob() { - var bytes []byte - var err error - if (k == reflect.Array || k == reflect.Slice) && - (fieldValue.Type().Elem().Kind() == reflect.Uint8) { - bytes = fieldValue.Bytes() - } else { - bytes, err = json.Marshal(fieldValue.Interface()) - if err != nil { - session.Engine.logger.Error(err) - return 0, err - } - } - return bytes, nil - } - return nil, ErrUnSupportedType - case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: - return int64(fieldValue.Uint()), nil - default: - return fieldValue.Interface(), nil - } -} - -// saveLastSQL stores executed query information -func (session *Session) saveLastSQL(sql string, args ...interface{}) { - session.lastSQL = sql - session.lastSQLArgs = args - session.Engine.logSQL(sql, args...) -} - -// LastSQL returns last query information -func (session *Session) LastSQL() (string, []interface{}) { - return session.lastSQL, session.lastSQLArgs -} - -// tbName get some table's table name -func (session *Session) tbNameNoSchema(table *core.Table) string { - if len(session.Statement.AltTableName) > 0 { - return session.Statement.AltTableName - } - - return table.Name -} - -// Unscoped always disable struct tag "deleted" -func (session *Session) Unscoped() *Session { - session.Statement.Unscoped() - return session -} diff --git a/vendor/github.com/go-xorm/xorm/session_delete.go b/vendor/github.com/go-xorm/xorm/session_delete.go deleted file mode 100644 index 1c458fe1e..000000000 --- a/vendor/github.com/go-xorm/xorm/session_delete.go +++ /dev/null @@ -1,238 +0,0 @@ -// Copyright 2016 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xorm - -import ( - "errors" - "fmt" - "strconv" - - "github.com/go-xorm/core" -) - -func (session *Session) cacheDelete(sqlStr string, args ...interface{}) error { - if session.Statement.RefTable == nil || - session.Tx != nil { - return ErrCacheFailed - } - - for _, filter := range session.Engine.dialect.Filters() { - sqlStr = filter.Do(sqlStr, session.Engine.dialect, session.Statement.RefTable) - } - - newsql := session.Statement.convertIDSQL(sqlStr) - if newsql == "" { - return ErrCacheFailed - } - - cacher := session.Engine.getCacher2(session.Statement.RefTable) - tableName := session.Statement.TableName() - ids, err := core.GetCacheSql(cacher, tableName, newsql, args) - if err != nil { - resultsSlice, err := session.query(newsql, args...) - if err != nil { - return err - } - ids = make([]core.PK, 0) - if len(resultsSlice) > 0 { - for _, data := range resultsSlice { - var id int64 - var pk core.PK = make([]interface{}, 0) - for _, col := range session.Statement.RefTable.PKColumns() { - if v, ok := data[col.Name]; !ok { - return errors.New("no id") - } else if col.SQLType.IsText() { - pk = append(pk, string(v)) - } else if col.SQLType.IsNumeric() { - id, err = strconv.ParseInt(string(v), 10, 64) - if err != nil { - return err - } - pk = append(pk, id) - } else { - return errors.New("not supported primary key type") - } - } - ids = append(ids, pk) - } - } - } /*else { - session.Engine.LogDebug("delete cache sql %v", newsql) - cacher.DelIds(tableName, genSqlKey(newsql, args)) - }*/ - - for _, id := range ids { - session.Engine.logger.Debug("[cacheDelete] delete cache obj", tableName, id) - sid, err := id.ToString() - if err != nil { - return err - } - cacher.DelBean(tableName, sid) - } - session.Engine.logger.Debug("[cacheDelete] clear cache sql", tableName) - cacher.ClearIds(tableName) - return nil -} - -// Delete records, bean's non-empty fields are conditions -func (session *Session) Delete(bean interface{}) (int64, error) { - defer session.resetStatement() - if session.IsAutoClose { - defer session.Close() - } - - session.Statement.setRefValue(rValue(bean)) - var table = session.Statement.RefTable - - // handle before delete processors - for _, closure := range session.beforeClosures { - closure(bean) - } - cleanupProcessorsClosures(&session.beforeClosures) - - if processor, ok := interface{}(bean).(BeforeDeleteProcessor); ok { - processor.BeforeDelete() - } - - // -- - condSQL, condArgs, _ := session.Statement.genConds(bean) - if len(condSQL) == 0 && session.Statement.LimitN == 0 { - return 0, ErrNeedDeletedCond - } - - var tableName = session.Engine.Quote(session.Statement.TableName()) - var deleteSQL string - if len(condSQL) > 0 { - deleteSQL = fmt.Sprintf("DELETE FROM %v WHERE %v", tableName, condSQL) - } else { - deleteSQL = fmt.Sprintf("DELETE FROM %v", tableName) - } - - var orderSQL string - if len(session.Statement.OrderStr) > 0 { - orderSQL += fmt.Sprintf(" ORDER BY %s", session.Statement.OrderStr) - } - if session.Statement.LimitN > 0 { - orderSQL += fmt.Sprintf(" LIMIT %d", session.Statement.LimitN) - } - - if len(orderSQL) > 0 { - switch session.Engine.dialect.DBType() { - case core.POSTGRES: - inSQL := fmt.Sprintf("ctid IN (SELECT ctid FROM %s%s)", tableName, orderSQL) - if len(condSQL) > 0 { - deleteSQL += " AND " + inSQL - } else { - deleteSQL += " WHERE " + inSQL - } - case core.SQLITE: - inSQL := fmt.Sprintf("rowid IN (SELECT rowid FROM %s%s)", tableName, orderSQL) - if len(condSQL) > 0 { - deleteSQL += " AND " + inSQL - } else { - deleteSQL += " WHERE " + inSQL - } - // TODO: how to handle delete limit on mssql? - case core.MSSQL: - return 0, ErrNotImplemented - default: - deleteSQL += orderSQL - } - } - - var realSQL string - argsForCache := make([]interface{}, 0, len(condArgs)*2) - if session.Statement.unscoped || table.DeletedColumn() == nil { // tag "deleted" is disabled - realSQL = deleteSQL - copy(argsForCache, condArgs) - argsForCache = append(condArgs, argsForCache...) - } else { - // !oinume! sqlStrForCache and argsForCache is needed to behave as executing "DELETE FROM ..." for cache. - copy(argsForCache, condArgs) - argsForCache = append(condArgs, argsForCache...) - - deletedColumn := table.DeletedColumn() - realSQL = fmt.Sprintf("UPDATE %v SET %v = ? WHERE %v", - session.Engine.Quote(session.Statement.TableName()), - session.Engine.Quote(deletedColumn.Name), - condSQL) - - if len(orderSQL) > 0 { - switch session.Engine.dialect.DBType() { - case core.POSTGRES: - inSQL := fmt.Sprintf("ctid IN (SELECT ctid FROM %s%s)", tableName, orderSQL) - if len(condSQL) > 0 { - realSQL += " AND " + inSQL - } else { - realSQL += " WHERE " + inSQL - } - case core.SQLITE: - inSQL := fmt.Sprintf("rowid IN (SELECT rowid FROM %s%s)", tableName, orderSQL) - if len(condSQL) > 0 { - realSQL += " AND " + inSQL - } else { - realSQL += " WHERE " + inSQL - } - // TODO: how to handle delete limit on mssql? - case core.MSSQL: - return 0, ErrNotImplemented - default: - realSQL += orderSQL - } - } - - // !oinume! Insert NowTime to the head of session.Statement.Params - condArgs = append(condArgs, "") - paramsLen := len(condArgs) - copy(condArgs[1:paramsLen], condArgs[0:paramsLen-1]) - - val, t := session.Engine.NowTime2(deletedColumn.SQLType.Name) - condArgs[0] = val - - var colName = deletedColumn.Name - session.afterClosures = append(session.afterClosures, func(bean interface{}) { - col := table.GetColumn(colName) - setColumnTime(bean, col, t) - }) - } - - if cacher := session.Engine.getCacher2(session.Statement.RefTable); cacher != nil && session.Statement.UseCache { - session.cacheDelete(deleteSQL, argsForCache...) - } - - res, err := session.exec(realSQL, condArgs...) - if err != nil { - return 0, err - } - - // handle after delete processors - if session.IsAutoCommit { - for _, closure := range session.afterClosures { - closure(bean) - } - if processor, ok := interface{}(bean).(AfterDeleteProcessor); ok { - processor.AfterDelete() - } - } else { - lenAfterClosures := len(session.afterClosures) - if lenAfterClosures > 0 { - if value, has := session.afterDeleteBeans[bean]; has && value != nil { - *value = append(*value, session.afterClosures...) - } else { - afterClosures := make([]func(interface{}), lenAfterClosures) - copy(afterClosures, session.afterClosures) - session.afterDeleteBeans[bean] = &afterClosures - } - } else { - if _, ok := interface{}(bean).(AfterDeleteProcessor); ok { - session.afterDeleteBeans[bean] = nil - } - } - } - cleanupProcessorsClosures(&session.afterClosures) - // -- - - return res.RowsAffected() -} diff --git a/vendor/github.com/go-xorm/xorm/session_find.go b/vendor/github.com/go-xorm/xorm/session_find.go deleted file mode 100644 index 748e319f7..000000000 --- a/vendor/github.com/go-xorm/xorm/session_find.go +++ /dev/null @@ -1,461 +0,0 @@ -// Copyright 2016 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xorm - -import ( - "errors" - "fmt" - "reflect" - "strconv" - "strings" - - "github.com/go-xorm/builder" - "github.com/go-xorm/core" -) - -const ( - tpStruct = iota - tpNonStruct -) - -// Find retrieve records from table, condiBeans's non-empty fields -// are conditions. beans could be []Struct, []*Struct, map[int64]Struct -// map[int64]*Struct -func (session *Session) Find(rowsSlicePtr interface{}, condiBean ...interface{}) error { - defer session.resetStatement() - if session.IsAutoClose { - defer session.Close() - } - - sliceValue := reflect.Indirect(reflect.ValueOf(rowsSlicePtr)) - if sliceValue.Kind() != reflect.Slice && sliceValue.Kind() != reflect.Map { - return errors.New("needs a pointer to a slice or a map") - } - - sliceElementType := sliceValue.Type().Elem() - - var tp = tpStruct - if session.Statement.RefTable == nil { - if sliceElementType.Kind() == reflect.Ptr { - if sliceElementType.Elem().Kind() == reflect.Struct { - pv := reflect.New(sliceElementType.Elem()) - session.Statement.setRefValue(pv.Elem()) - } else { - tp = tpNonStruct - } - } else if sliceElementType.Kind() == reflect.Struct { - pv := reflect.New(sliceElementType) - session.Statement.setRefValue(pv.Elem()) - } else { - tp = tpNonStruct - } - } - - var table = session.Statement.RefTable - - var addedTableName = (len(session.Statement.JoinStr) > 0) - var autoCond builder.Cond - if tp == tpStruct { - if !session.Statement.noAutoCondition && len(condiBean) > 0 { - var err error - autoCond, err = session.Statement.buildConds(table, condiBean[0], true, true, false, true, addedTableName) - if err != nil { - panic(err) - } - } else { - // !oinume! Add "
IS NULL" to WHERE whatever condiBean is given. - // See https://github.com/go-xorm/xorm/issues/179 - if col := table.DeletedColumn(); col != nil && !session.Statement.unscoped { // tag "deleted" is enabled - var colName = session.Engine.Quote(col.Name) - if addedTableName { - var nm = session.Statement.TableName() - if len(session.Statement.TableAlias) > 0 { - nm = session.Statement.TableAlias - } - colName = session.Engine.Quote(nm) + "." + colName - } - if session.Engine.dialect.DBType() == core.MSSQL { - autoCond = builder.IsNull{colName} - } else { - autoCond = builder.IsNull{colName}.Or(builder.Eq{colName: "0001-01-01 00:00:00"}) - } - } - } - } - - var sqlStr string - var args []interface{} - if session.Statement.RawSQL == "" { - if len(session.Statement.TableName()) <= 0 { - return ErrTableNotFound - } - - var columnStr = session.Statement.ColumnStr - if len(session.Statement.selectStr) > 0 { - columnStr = session.Statement.selectStr - } else { - if session.Statement.JoinStr == "" { - if columnStr == "" { - if session.Statement.GroupByStr != "" { - columnStr = session.Statement.Engine.Quote(strings.Replace(session.Statement.GroupByStr, ",", session.Engine.Quote(","), -1)) - } else { - columnStr = session.Statement.genColumnStr() - } - } - } else { - if columnStr == "" { - if session.Statement.GroupByStr != "" { - columnStr = session.Statement.Engine.Quote(strings.Replace(session.Statement.GroupByStr, ",", session.Engine.Quote(","), -1)) - } else { - columnStr = "*" - } - } - } - if columnStr == "" { - columnStr = "*" - } - } - - condSQL, condArgs, _ := builder.ToSQL(session.Statement.cond.And(autoCond)) - - args = append(session.Statement.joinArgs, condArgs...) - sqlStr = session.Statement.genSelectSQL(columnStr, condSQL) - // for mssql and use limit - qs := strings.Count(sqlStr, "?") - if len(args)*2 == qs { - args = append(args, args...) - } - } else { - sqlStr = session.Statement.RawSQL - args = session.Statement.RawParams - } - - var err error - if session.canCache() { - if cacher := session.Engine.getCacher2(table); cacher != nil && - !session.Statement.IsDistinct && - !session.Statement.unscoped { - err = session.cacheFind(sliceElementType, sqlStr, rowsSlicePtr, args...) - if err != ErrCacheFailed { - return err - } - err = nil // !nashtsai! reset err to nil for ErrCacheFailed - session.Engine.logger.Warn("Cache Find Failed") - } - } - - return session.noCacheFind(table, sliceValue, sqlStr, args...) -} - -func (session *Session) noCacheFind(table *core.Table, containerValue reflect.Value, sqlStr string, args ...interface{}) error { - var rawRows *core.Rows - var err error - - session.queryPreprocess(&sqlStr, args...) - if session.IsAutoCommit { - _, rawRows, err = session.innerQuery(sqlStr, args...) - } else { - rawRows, err = session.Tx.Query(sqlStr, args...) - } - if err != nil { - return err - } - defer rawRows.Close() - - fields, err := rawRows.Columns() - if err != nil { - return err - } - - var newElemFunc func(fields []string) reflect.Value - elemType := containerValue.Type().Elem() - var isPointer bool - if elemType.Kind() == reflect.Ptr { - isPointer = true - elemType = elemType.Elem() - } - if elemType.Kind() == reflect.Ptr { - return errors.New("pointer to pointer is not supported") - } - - newElemFunc = func(fields []string) reflect.Value { - switch elemType.Kind() { - case reflect.Slice: - slice := reflect.MakeSlice(elemType, len(fields), len(fields)) - x := reflect.New(slice.Type()) - x.Elem().Set(slice) - return x - case reflect.Map: - mp := reflect.MakeMap(elemType) - x := reflect.New(mp.Type()) - x.Elem().Set(mp) - return x - } - return reflect.New(elemType) - } - - var containerValueSetFunc func(*reflect.Value, core.PK) error - - if containerValue.Kind() == reflect.Slice { - containerValueSetFunc = func(newValue *reflect.Value, pk core.PK) error { - if isPointer { - containerValue.Set(reflect.Append(containerValue, newValue.Elem().Addr())) - } else { - containerValue.Set(reflect.Append(containerValue, newValue.Elem())) - } - return nil - } - } else { - keyType := containerValue.Type().Key() - if len(table.PrimaryKeys) == 0 { - return errors.New("don't support multiple primary key's map has non-slice key type") - } - if len(table.PrimaryKeys) > 1 && keyType.Kind() != reflect.Slice { - return errors.New("don't support multiple primary key's map has non-slice key type") - } - - containerValueSetFunc = func(newValue *reflect.Value, pk core.PK) error { - keyValue := reflect.New(keyType) - err := convertPKToValue(table, keyValue.Interface(), pk) - if err != nil { - return err - } - if isPointer { - containerValue.SetMapIndex(keyValue.Elem(), newValue.Elem().Addr()) - } else { - containerValue.SetMapIndex(keyValue.Elem(), newValue.Elem()) - } - return nil - } - } - - if elemType.Kind() == reflect.Struct { - var newValue = newElemFunc(fields) - dataStruct := rValue(newValue.Interface()) - return session.rows2Beans(rawRows, fields, len(fields), session.Engine.autoMapType(dataStruct), newElemFunc, containerValueSetFunc) - } - - for rawRows.Next() { - var newValue = newElemFunc(fields) - bean := newValue.Interface() - - switch elemType.Kind() { - case reflect.Slice: - err = rawRows.ScanSlice(bean) - case reflect.Map: - err = rawRows.ScanMap(bean) - default: - err = rawRows.Scan(bean) - } - - if err != nil { - return err - } - - if err := containerValueSetFunc(&newValue, nil); err != nil { - return err - } - } - return nil -} - -func convertPKToValue(table *core.Table, dst interface{}, pk core.PK) error { - cols := table.PKColumns() - if len(cols) == 1 { - return convertAssign(dst, pk[0]) - } - - dst = pk - return nil -} - -func (session *Session) cacheFind(t reflect.Type, sqlStr string, rowsSlicePtr interface{}, args ...interface{}) (err error) { - if !session.canCache() || - indexNoCase(sqlStr, "having") != -1 || - indexNoCase(sqlStr, "group by") != -1 { - return ErrCacheFailed - } - - for _, filter := range session.Engine.dialect.Filters() { - sqlStr = filter.Do(sqlStr, session.Engine.dialect, session.Statement.RefTable) - } - - newsql := session.Statement.convertIDSQL(sqlStr) - if newsql == "" { - return ErrCacheFailed - } - - tableName := session.Statement.TableName() - - table := session.Statement.RefTable - cacher := session.Engine.getCacher2(table) - ids, err := core.GetCacheSql(cacher, tableName, newsql, args) - if err != nil { - rows, err := session.DB().Query(newsql, args...) - if err != nil { - return err - } - defer rows.Close() - - var i int - ids = make([]core.PK, 0) - for rows.Next() { - i++ - if i > 500 { - session.Engine.logger.Debug("[cacheFind] ids length > 500, no cache") - return ErrCacheFailed - } - var res = make([]string, len(table.PrimaryKeys)) - err = rows.ScanSlice(&res) - if err != nil { - return err - } - - var pk core.PK = make([]interface{}, len(table.PrimaryKeys)) - for i, col := range table.PKColumns() { - if col.SQLType.IsNumeric() { - n, err := strconv.ParseInt(res[i], 10, 64) - if err != nil { - return err - } - pk[i] = n - } else if col.SQLType.IsText() { - pk[i] = res[i] - } else { - return errors.New("not supported") - } - } - - ids = append(ids, pk) - } - - session.Engine.logger.Debug("[cacheFind] cache sql:", ids, tableName, newsql, args) - err = core.PutCacheSql(cacher, ids, tableName, newsql, args) - if err != nil { - return err - } - } else { - session.Engine.logger.Debug("[cacheFind] cache hit sql:", newsql, args) - } - - sliceValue := reflect.Indirect(reflect.ValueOf(rowsSlicePtr)) - - ididxes := make(map[string]int) - var ides []core.PK - var temps = make([]interface{}, len(ids)) - - for idx, id := range ids { - sid, err := id.ToString() - if err != nil { - return err - } - bean := cacher.GetBean(tableName, sid) - if bean == nil { - ides = append(ides, id) - ididxes[sid] = idx - } else { - session.Engine.logger.Debug("[cacheFind] cache hit bean:", tableName, id, bean) - - pk := session.Engine.IdOf(bean) - xid, err := pk.ToString() - if err != nil { - return err - } - - if sid != xid { - session.Engine.logger.Error("[cacheFind] error cache", xid, sid, bean) - return ErrCacheFailed - } - temps[idx] = bean - } - } - - if len(ides) > 0 { - newSession := session.Engine.NewSession() - defer newSession.Close() - - slices := reflect.New(reflect.SliceOf(t)) - beans := slices.Interface() - - if len(table.PrimaryKeys) == 1 { - ff := make([]interface{}, 0, len(ides)) - for _, ie := range ides { - ff = append(ff, ie[0]) - } - - newSession.In("`"+table.PrimaryKeys[0]+"`", ff...) - } else { - for _, ie := range ides { - cond := builder.NewCond() - for i, name := range table.PrimaryKeys { - cond = cond.And(builder.Eq{"`" + name + "`": ie[i]}) - } - newSession.Or(cond) - } - } - - err = newSession.NoCache().Find(beans) - if err != nil { - return err - } - - vs := reflect.Indirect(reflect.ValueOf(beans)) - for i := 0; i < vs.Len(); i++ { - rv := vs.Index(i) - if rv.Kind() != reflect.Ptr { - rv = rv.Addr() - } - id := session.Engine.IdOfV(rv) - sid, err := id.ToString() - if err != nil { - return err - } - - bean := rv.Interface() - temps[ididxes[sid]] = bean - session.Engine.logger.Debug("[cacheFind] cache bean:", tableName, id, bean, temps) - cacher.PutBean(tableName, sid, bean) - } - } - - for j := 0; j < len(temps); j++ { - bean := temps[j] - if bean == nil { - session.Engine.logger.Warn("[cacheFind] cache no hit:", tableName, ids[j], temps) - // return errors.New("cache error") // !nashtsai! no need to return error, but continue instead - continue - } - if sliceValue.Kind() == reflect.Slice { - if t.Kind() == reflect.Ptr { - sliceValue.Set(reflect.Append(sliceValue, reflect.ValueOf(bean))) - } else { - sliceValue.Set(reflect.Append(sliceValue, reflect.Indirect(reflect.ValueOf(bean)))) - } - } else if sliceValue.Kind() == reflect.Map { - var key = ids[j] - keyType := sliceValue.Type().Key() - var ikey interface{} - if len(key) == 1 { - ikey, err = str2PK(fmt.Sprintf("%v", key[0]), keyType) - if err != nil { - return err - } - } else { - if keyType.Kind() != reflect.Slice { - return errors.New("table have multiple primary keys, key is not core.PK or slice") - } - ikey = key - } - - if t.Kind() == reflect.Ptr { - sliceValue.SetMapIndex(reflect.ValueOf(ikey), reflect.ValueOf(bean)) - } else { - sliceValue.SetMapIndex(reflect.ValueOf(ikey), reflect.Indirect(reflect.ValueOf(bean))) - } - } - } - - return nil -} diff --git a/vendor/github.com/go-xorm/xorm/session_get.go b/vendor/github.com/go-xorm/xorm/session_get.go deleted file mode 100644 index 2b975c837..000000000 --- a/vendor/github.com/go-xorm/xorm/session_get.go +++ /dev/null @@ -1,190 +0,0 @@ -// Copyright 2016 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xorm - -import ( - "errors" - "reflect" - "strconv" - - "github.com/go-xorm/core" -) - -// Get retrieve one record from database, bean's non-empty fields -// will be as conditions -func (session *Session) Get(bean interface{}) (bool, error) { - defer session.resetStatement() - if session.IsAutoClose { - defer session.Close() - } - - beanValue := reflect.ValueOf(bean) - if beanValue.Kind() != reflect.Ptr { - return false, errors.New("needs a pointer to a struct") - } - - // FIXME: remove this after support non-struct Get - if beanValue.Elem().Kind() != reflect.Struct { - return false, errors.New("needs a pointer to a struct") - } - - if beanValue.Elem().Kind() == reflect.Struct { - session.Statement.setRefValue(beanValue.Elem()) - } - - var sqlStr string - var args []interface{} - - if session.Statement.RawSQL == "" { - if len(session.Statement.TableName()) <= 0 { - return false, ErrTableNotFound - } - session.Statement.Limit(1) - sqlStr, args = session.Statement.genGetSQL(bean) - } else { - sqlStr = session.Statement.RawSQL - args = session.Statement.RawParams - } - - if session.canCache() { - if cacher := session.Engine.getCacher2(session.Statement.RefTable); cacher != nil && - !session.Statement.unscoped { - has, err := session.cacheGet(bean, sqlStr, args...) - if err != ErrCacheFailed { - return has, err - } - } - } - - return session.nocacheGet(beanValue.Elem().Kind(), bean, sqlStr, args...) -} - -func (session *Session) nocacheGet(beanKind reflect.Kind, bean interface{}, sqlStr string, args ...interface{}) (bool, error) { - var rawRows *core.Rows - var err error - session.queryPreprocess(&sqlStr, args...) - if session.IsAutoCommit { - _, rawRows, err = session.innerQuery(sqlStr, args...) - } else { - rawRows, err = session.Tx.Query(sqlStr, args...) - } - if err != nil { - return false, err - } - - defer rawRows.Close() - - if rawRows.Next() { - fields, err := rawRows.Columns() - if err != nil { - // WARN: Alougth rawRows return true, but get fields failed - return true, err - } - - switch beanKind { - case reflect.Struct: - _, err = session.row2Bean(rawRows, fields, len(fields), bean) - case reflect.Slice: - err = rawRows.ScanSlice(bean) - case reflect.Map: - err = rawRows.ScanMap(bean) - default: - err = rawRows.Scan(bean) - } - - return true, err - } - return false, nil -} - -func (session *Session) cacheGet(bean interface{}, sqlStr string, args ...interface{}) (has bool, err error) { - // if has no reftable, then don't use cache currently - if !session.canCache() { - return false, ErrCacheFailed - } - - for _, filter := range session.Engine.dialect.Filters() { - sqlStr = filter.Do(sqlStr, session.Engine.dialect, session.Statement.RefTable) - } - newsql := session.Statement.convertIDSQL(sqlStr) - if newsql == "" { - return false, ErrCacheFailed - } - - cacher := session.Engine.getCacher2(session.Statement.RefTable) - tableName := session.Statement.TableName() - session.Engine.logger.Debug("[cacheGet] find sql:", newsql, args) - ids, err := core.GetCacheSql(cacher, tableName, newsql, args) - table := session.Statement.RefTable - if err != nil { - var res = make([]string, len(table.PrimaryKeys)) - rows, err := session.DB().Query(newsql, args...) - if err != nil { - return false, err - } - defer rows.Close() - - if rows.Next() { - err = rows.ScanSlice(&res) - if err != nil { - return false, err - } - } else { - return false, ErrCacheFailed - } - - var pk core.PK = make([]interface{}, len(table.PrimaryKeys)) - for i, col := range table.PKColumns() { - if col.SQLType.IsText() { - pk[i] = res[i] - } else if col.SQLType.IsNumeric() { - n, err := strconv.ParseInt(res[i], 10, 64) - if err != nil { - return false, err - } - pk[i] = n - } else { - return false, errors.New("unsupported") - } - } - - ids = []core.PK{pk} - session.Engine.logger.Debug("[cacheGet] cache ids:", newsql, ids) - err = core.PutCacheSql(cacher, ids, tableName, newsql, args) - if err != nil { - return false, err - } - } else { - session.Engine.logger.Debug("[cacheGet] cache hit sql:", newsql) - } - - if len(ids) > 0 { - structValue := reflect.Indirect(reflect.ValueOf(bean)) - id := ids[0] - session.Engine.logger.Debug("[cacheGet] get bean:", tableName, id) - sid, err := id.ToString() - if err != nil { - return false, err - } - cacheBean := cacher.GetBean(tableName, sid) - if cacheBean == nil { - cacheBean = bean - has, err = session.nocacheGet(reflect.Struct, cacheBean, sqlStr, args...) - if err != nil || !has { - return has, err - } - - session.Engine.logger.Debug("[cacheGet] cache bean:", tableName, id, cacheBean) - cacher.PutBean(tableName, sid, cacheBean) - } else { - session.Engine.logger.Debug("[cacheGet] cache hit bean:", tableName, id, cacheBean) - has = true - } - structValue.Set(reflect.Indirect(reflect.ValueOf(cacheBean))) - - return has, nil - } - return false, nil -} diff --git a/vendor/github.com/go-xorm/xorm/session_insert.go b/vendor/github.com/go-xorm/xorm/session_insert.go deleted file mode 100644 index 96e969c2a..000000000 --- a/vendor/github.com/go-xorm/xorm/session_insert.go +++ /dev/null @@ -1,527 +0,0 @@ -// Copyright 2016 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xorm - -import ( - "errors" - "fmt" - "reflect" - "strconv" - "strings" - - "github.com/go-xorm/core" -) - -// Insert insert one or more beans -func (session *Session) Insert(beans ...interface{}) (int64, error) { - var affected int64 - var err error - - if session.IsAutoClose { - defer session.Close() - } - defer session.resetStatement() - - for _, bean := range beans { - sliceValue := reflect.Indirect(reflect.ValueOf(bean)) - if sliceValue.Kind() == reflect.Slice { - size := sliceValue.Len() - if size > 0 { - if session.Engine.SupportInsertMany() { - cnt, err := session.innerInsertMulti(bean) - if err != nil { - return affected, err - } - affected += cnt - } else { - for i := 0; i < size; i++ { - cnt, err := session.innerInsert(sliceValue.Index(i).Interface()) - if err != nil { - return affected, err - } - affected += cnt - } - } - } - } else { - cnt, err := session.innerInsert(bean) - if err != nil { - return affected, err - } - affected += cnt - } - } - - return affected, err -} - -func (session *Session) innerInsertMulti(rowsSlicePtr interface{}) (int64, error) { - sliceValue := reflect.Indirect(reflect.ValueOf(rowsSlicePtr)) - if sliceValue.Kind() != reflect.Slice { - return 0, errors.New("needs a pointer to a slice") - } - - if sliceValue.Len() <= 0 { - return 0, errors.New("could not insert a empty slice") - } - - session.Statement.setRefValue(sliceValue.Index(0)) - - if len(session.Statement.TableName()) <= 0 { - return 0, ErrTableNotFound - } - - table := session.Statement.RefTable - size := sliceValue.Len() - - var colNames []string - var colMultiPlaces []string - var args []interface{} - var cols []*core.Column - - for i := 0; i < size; i++ { - v := sliceValue.Index(i) - vv := reflect.Indirect(v) - elemValue := v.Interface() - var colPlaces []string - - // handle BeforeInsertProcessor - // !nashtsai! does user expect it's same slice to passed closure when using Before()/After() when insert multi?? - for _, closure := range session.beforeClosures { - closure(elemValue) - } - - if processor, ok := interface{}(elemValue).(BeforeInsertProcessor); ok { - processor.BeforeInsert() - } - // -- - - if i == 0 { - for _, col := range table.Columns() { - ptrFieldValue, err := col.ValueOfV(&vv) - if err != nil { - return 0, err - } - fieldValue := *ptrFieldValue - if col.IsAutoIncrement && isZero(fieldValue.Interface()) { - continue - } - if col.MapType == core.ONLYFROMDB { - continue - } - if col.IsDeleted { - continue - } - if session.Statement.ColumnStr != "" { - if _, ok := getFlagForColumn(session.Statement.columnMap, col); !ok { - continue - } - } - if session.Statement.OmitStr != "" { - if _, ok := getFlagForColumn(session.Statement.columnMap, col); ok { - continue - } - } - if (col.IsCreated || col.IsUpdated) && session.Statement.UseAutoTime { - val, t := session.Engine.NowTime2(col.SQLType.Name) - args = append(args, val) - - var colName = col.Name - session.afterClosures = append(session.afterClosures, func(bean interface{}) { - col := table.GetColumn(colName) - setColumnTime(bean, col, t) - }) - } else if col.IsVersion && session.Statement.checkVersion { - args = append(args, 1) - var colName = col.Name - session.afterClosures = append(session.afterClosures, func(bean interface{}) { - col := table.GetColumn(colName) - setColumnInt(bean, col, 1) - }) - } else { - arg, err := session.value2Interface(col, fieldValue) - if err != nil { - return 0, err - } - args = append(args, arg) - } - - colNames = append(colNames, col.Name) - cols = append(cols, col) - colPlaces = append(colPlaces, "?") - } - } else { - for _, col := range cols { - ptrFieldValue, err := col.ValueOfV(&vv) - if err != nil { - return 0, err - } - fieldValue := *ptrFieldValue - - if col.IsAutoIncrement && isZero(fieldValue.Interface()) { - continue - } - if col.MapType == core.ONLYFROMDB { - continue - } - if col.IsDeleted { - continue - } - if session.Statement.ColumnStr != "" { - if _, ok := getFlagForColumn(session.Statement.columnMap, col); !ok { - continue - } - } - if session.Statement.OmitStr != "" { - if _, ok := getFlagForColumn(session.Statement.columnMap, col); ok { - continue - } - } - if (col.IsCreated || col.IsUpdated) && session.Statement.UseAutoTime { - val, t := session.Engine.NowTime2(col.SQLType.Name) - args = append(args, val) - - var colName = col.Name - session.afterClosures = append(session.afterClosures, func(bean interface{}) { - col := table.GetColumn(colName) - setColumnTime(bean, col, t) - }) - } else if col.IsVersion && session.Statement.checkVersion { - args = append(args, 1) - var colName = col.Name - session.afterClosures = append(session.afterClosures, func(bean interface{}) { - col := table.GetColumn(colName) - setColumnInt(bean, col, 1) - }) - } else { - arg, err := session.value2Interface(col, fieldValue) - if err != nil { - return 0, err - } - args = append(args, arg) - } - - colPlaces = append(colPlaces, "?") - } - } - colMultiPlaces = append(colMultiPlaces, strings.Join(colPlaces, ", ")) - } - cleanupProcessorsClosures(&session.beforeClosures) - - statement := fmt.Sprintf("INSERT INTO %s (%v%v%v) VALUES (%v)", - session.Engine.Quote(session.Statement.TableName()), - session.Engine.QuoteStr(), - strings.Join(colNames, session.Engine.QuoteStr()+", "+session.Engine.QuoteStr()), - session.Engine.QuoteStr(), - strings.Join(colMultiPlaces, "),(")) - - res, err := session.exec(statement, args...) - if err != nil { - return 0, err - } - - if cacher := session.Engine.getCacher2(table); cacher != nil && session.Statement.UseCache { - session.cacheInsert(session.Statement.TableName()) - } - - lenAfterClosures := len(session.afterClosures) - for i := 0; i < size; i++ { - elemValue := reflect.Indirect(sliceValue.Index(i)).Addr().Interface() - - // handle AfterInsertProcessor - if session.IsAutoCommit { - // !nashtsai! does user expect it's same slice to passed closure when using Before()/After() when insert multi?? - for _, closure := range session.afterClosures { - closure(elemValue) - } - if processor, ok := interface{}(elemValue).(AfterInsertProcessor); ok { - processor.AfterInsert() - } - } else { - if lenAfterClosures > 0 { - if value, has := session.afterInsertBeans[elemValue]; has && value != nil { - *value = append(*value, session.afterClosures...) - } else { - afterClosures := make([]func(interface{}), lenAfterClosures) - copy(afterClosures, session.afterClosures) - session.afterInsertBeans[elemValue] = &afterClosures - } - } else { - if _, ok := interface{}(elemValue).(AfterInsertProcessor); ok { - session.afterInsertBeans[elemValue] = nil - } - } - } - } - - cleanupProcessorsClosures(&session.afterClosures) - return res.RowsAffected() -} - -// InsertMulti insert multiple records -func (session *Session) InsertMulti(rowsSlicePtr interface{}) (int64, error) { - defer session.resetStatement() - if session.IsAutoClose { - defer session.Close() - } - - sliceValue := reflect.Indirect(reflect.ValueOf(rowsSlicePtr)) - if sliceValue.Kind() != reflect.Slice { - return 0, ErrParamsType - - } - - if sliceValue.Len() <= 0 { - return 0, nil - } - - return session.innerInsertMulti(rowsSlicePtr) -} - -func (session *Session) innerInsert(bean interface{}) (int64, error) { - session.Statement.setRefValue(rValue(bean)) - if len(session.Statement.TableName()) <= 0 { - return 0, ErrTableNotFound - } - - table := session.Statement.RefTable - - // handle BeforeInsertProcessor - for _, closure := range session.beforeClosures { - closure(bean) - } - cleanupProcessorsClosures(&session.beforeClosures) // cleanup after used - - if processor, ok := interface{}(bean).(BeforeInsertProcessor); ok { - processor.BeforeInsert() - } - // -- - colNames, args, err := genCols(session.Statement.RefTable, session, bean, false, false) - if err != nil { - return 0, err - } - // insert expr columns, override if exists - exprColumns := session.Statement.getExpr() - exprColVals := make([]string, 0, len(exprColumns)) - for _, v := range exprColumns { - // remove the expr columns - for i, colName := range colNames { - if colName == v.colName { - colNames = append(colNames[:i], colNames[i+1:]...) - args = append(args[:i], args[i+1:]...) - } - } - - // append expr column to the end - colNames = append(colNames, v.colName) - exprColVals = append(exprColVals, v.expr) - } - - colPlaces := strings.Repeat("?, ", len(colNames)-len(exprColumns)) - if len(exprColVals) > 0 { - colPlaces = colPlaces + strings.Join(exprColVals, ", ") - } else { - colPlaces = colPlaces[0 : len(colPlaces)-2] - } - - sqlStr := fmt.Sprintf("INSERT INTO %s (%v%v%v) VALUES (%v)", - session.Engine.Quote(session.Statement.TableName()), - session.Engine.QuoteStr(), - strings.Join(colNames, session.Engine.Quote(", ")), - session.Engine.QuoteStr(), - colPlaces) - - handleAfterInsertProcessorFunc := func(bean interface{}) { - if session.IsAutoCommit { - for _, closure := range session.afterClosures { - closure(bean) - } - if processor, ok := interface{}(bean).(AfterInsertProcessor); ok { - processor.AfterInsert() - } - } else { - lenAfterClosures := len(session.afterClosures) - if lenAfterClosures > 0 { - if value, has := session.afterInsertBeans[bean]; has && value != nil { - *value = append(*value, session.afterClosures...) - } else { - afterClosures := make([]func(interface{}), lenAfterClosures) - copy(afterClosures, session.afterClosures) - session.afterInsertBeans[bean] = &afterClosures - } - - } else { - if _, ok := interface{}(bean).(AfterInsertProcessor); ok { - session.afterInsertBeans[bean] = nil - } - } - } - cleanupProcessorsClosures(&session.afterClosures) // cleanup after used - } - - // for postgres, many of them didn't implement lastInsertId, so we should - // implemented it ourself. - if session.Engine.dialect.DBType() == core.ORACLE && len(table.AutoIncrement) > 0 { - //assert table.AutoIncrement != "" - res, err := session.query("select seq_atable.currval from dual", args...) - if err != nil { - return 0, err - } - - handleAfterInsertProcessorFunc(bean) - - if cacher := session.Engine.getCacher2(table); cacher != nil && session.Statement.UseCache { - session.cacheInsert(session.Statement.TableName()) - } - - if table.Version != "" && session.Statement.checkVersion { - verValue, err := table.VersionColumn().ValueOf(bean) - if err != nil { - session.Engine.logger.Error(err) - } else if verValue.IsValid() && verValue.CanSet() { - verValue.SetInt(1) - } - } - - if len(res) < 1 { - return 0, errors.New("insert no error but not returned id") - } - - idByte := res[0][table.AutoIncrement] - id, err := strconv.ParseInt(string(idByte), 10, 64) - if err != nil || id <= 0 { - return 1, err - } - - aiValue, err := table.AutoIncrColumn().ValueOf(bean) - if err != nil { - session.Engine.logger.Error(err) - } - - if aiValue == nil || !aiValue.IsValid() || !aiValue.CanSet() { - return 1, nil - } - - aiValue.Set(int64ToIntValue(id, aiValue.Type())) - - return 1, nil - } else if session.Engine.dialect.DBType() == core.POSTGRES && len(table.AutoIncrement) > 0 { - //assert table.AutoIncrement != "" - sqlStr = sqlStr + " RETURNING " + session.Engine.Quote(table.AutoIncrement) - res, err := session.query(sqlStr, args...) - - if err != nil { - return 0, err - } - handleAfterInsertProcessorFunc(bean) - - if cacher := session.Engine.getCacher2(table); cacher != nil && session.Statement.UseCache { - session.cacheInsert(session.Statement.TableName()) - } - - if table.Version != "" && session.Statement.checkVersion { - verValue, err := table.VersionColumn().ValueOf(bean) - if err != nil { - session.Engine.logger.Error(err) - } else if verValue.IsValid() && verValue.CanSet() { - verValue.SetInt(1) - } - } - - if len(res) < 1 { - return 0, errors.New("insert no error but not returned id") - } - - idByte := res[0][table.AutoIncrement] - id, err := strconv.ParseInt(string(idByte), 10, 64) - if err != nil || id <= 0 { - return 1, err - } - - aiValue, err := table.AutoIncrColumn().ValueOf(bean) - if err != nil { - session.Engine.logger.Error(err) - } - - if aiValue == nil || !aiValue.IsValid() || !aiValue.CanSet() { - return 1, nil - } - - aiValue.Set(int64ToIntValue(id, aiValue.Type())) - - return 1, nil - } else { - res, err := session.exec(sqlStr, args...) - if err != nil { - return 0, err - } - - defer handleAfterInsertProcessorFunc(bean) - - if cacher := session.Engine.getCacher2(table); cacher != nil && session.Statement.UseCache { - session.cacheInsert(session.Statement.TableName()) - } - - if table.Version != "" && session.Statement.checkVersion { - verValue, err := table.VersionColumn().ValueOf(bean) - if err != nil { - session.Engine.logger.Error(err) - } else if verValue.IsValid() && verValue.CanSet() { - verValue.SetInt(1) - } - } - - if table.AutoIncrement == "" { - return res.RowsAffected() - } - - var id int64 - id, err = res.LastInsertId() - if err != nil || id <= 0 { - return res.RowsAffected() - } - - aiValue, err := table.AutoIncrColumn().ValueOf(bean) - if err != nil { - session.Engine.logger.Error(err) - } - - if aiValue == nil || !aiValue.IsValid() || !aiValue.CanSet() { - return res.RowsAffected() - } - - aiValue.Set(int64ToIntValue(id, aiValue.Type())) - - return res.RowsAffected() - } -} - -// InsertOne insert only one struct into database as a record. -// The in parameter bean must a struct or a point to struct. The return -// parameter is inserted and error -func (session *Session) InsertOne(bean interface{}) (int64, error) { - defer session.resetStatement() - if session.IsAutoClose { - defer session.Close() - } - - return session.innerInsert(bean) -} - -func (session *Session) cacheInsert(tables ...string) error { - if session.Statement.RefTable == nil { - return ErrCacheFailed - } - - table := session.Statement.RefTable - cacher := session.Engine.getCacher2(table) - - for _, t := range tables { - session.Engine.logger.Debug("[cache] clear sql:", t) - cacher.ClearIds(t) - } - - return nil -} diff --git a/vendor/github.com/go-xorm/xorm/session_iterate.go b/vendor/github.com/go-xorm/xorm/session_iterate.go deleted file mode 100644 index 7c1480959..000000000 --- a/vendor/github.com/go-xorm/xorm/session_iterate.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2016 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xorm - -import "reflect" - -// IterFunc only use by Iterate -type IterFunc func(idx int, bean interface{}) error - -// Rows return sql.Rows compatible Rows obj, as a forward Iterator object for iterating record by record, bean's non-empty fields -// are conditions. -func (session *Session) Rows(bean interface{}) (*Rows, error) { - return newRows(session, bean) -} - -// Iterate record by record handle records from table, condiBeans's non-empty fields -// are conditions. beans could be []Struct, []*Struct, map[int64]Struct -// map[int64]*Struct -func (session *Session) Iterate(bean interface{}, fun IterFunc) error { - rows, err := session.Rows(bean) - if err != nil { - return err - } - defer rows.Close() - - i := 0 - for rows.Next() { - b := reflect.New(rows.beanType).Interface() - err = rows.Scan(b) - if err != nil { - return err - } - err = fun(i, b) - if err != nil { - return err - } - i++ - } - return err -} diff --git a/vendor/github.com/go-xorm/xorm/session_raw.go b/vendor/github.com/go-xorm/xorm/session_raw.go deleted file mode 100644 index 9351d5cf9..000000000 --- a/vendor/github.com/go-xorm/xorm/session_raw.go +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright 2016 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xorm - -import ( - "database/sql" - - "github.com/go-xorm/core" -) - -func (session *Session) query(sqlStr string, paramStr ...interface{}) (resultsSlice []map[string][]byte, err error) { - session.queryPreprocess(&sqlStr, paramStr...) - - if session.IsAutoCommit { - return session.innerQuery2(sqlStr, paramStr...) - } - return session.txQuery(session.Tx, sqlStr, paramStr...) -} - -func (session *Session) txQuery(tx *core.Tx, sqlStr string, params ...interface{}) (resultsSlice []map[string][]byte, err error) { - rows, err := tx.Query(sqlStr, params...) - if err != nil { - return nil, err - } - defer rows.Close() - - return rows2maps(rows) -} - -func (session *Session) innerQuery(sqlStr string, params ...interface{}) (*core.Stmt, *core.Rows, error) { - var callback func() (*core.Stmt, *core.Rows, error) - if session.prepareStmt { - callback = func() (*core.Stmt, *core.Rows, error) { - stmt, err := session.doPrepare(sqlStr) - if err != nil { - return nil, nil, err - } - rows, err := stmt.Query(params...) - if err != nil { - return nil, nil, err - } - return stmt, rows, nil - } - } else { - callback = func() (*core.Stmt, *core.Rows, error) { - rows, err := session.DB().Query(sqlStr, params...) - if err != nil { - return nil, nil, err - } - return nil, rows, err - } - } - stmt, rows, err := session.Engine.logSQLQueryTime(sqlStr, params, callback) - if err != nil { - return nil, nil, err - } - return stmt, rows, nil -} - -func (session *Session) innerQuery2(sqlStr string, params ...interface{}) ([]map[string][]byte, error) { - _, rows, err := session.innerQuery(sqlStr, params...) - if rows != nil { - defer rows.Close() - } - if err != nil { - return nil, err - } - return rows2maps(rows) -} - -// Query a raw sql and return records as []map[string][]byte -func (session *Session) Query(sqlStr string, paramStr ...interface{}) (resultsSlice []map[string][]byte, err error) { - defer session.resetStatement() - if session.IsAutoClose { - defer session.Close() - } - - return session.query(sqlStr, paramStr...) -} - -// ============================= -// for string -// ============================= -func (session *Session) query2(sqlStr string, paramStr ...interface{}) (resultsSlice []map[string]string, err error) { - session.queryPreprocess(&sqlStr, paramStr...) - - if session.IsAutoCommit { - return query2(session.DB(), sqlStr, paramStr...) - } - return txQuery2(session.Tx, sqlStr, paramStr...) -} - -// Execute sql -func (session *Session) innerExec(sqlStr string, args ...interface{}) (sql.Result, error) { - if session.prepareStmt { - stmt, err := session.doPrepare(sqlStr) - if err != nil { - return nil, err - } - - res, err := stmt.Exec(args...) - if err != nil { - return nil, err - } - return res, nil - } - - return session.DB().Exec(sqlStr, args...) -} - -func (session *Session) exec(sqlStr string, args ...interface{}) (sql.Result, error) { - for _, filter := range session.Engine.dialect.Filters() { - // TODO: for table name, it's no need to RefTable - sqlStr = filter.Do(sqlStr, session.Engine.dialect, session.Statement.RefTable) - } - - session.saveLastSQL(sqlStr, args...) - - return session.Engine.logSQLExecutionTime(sqlStr, args, func() (sql.Result, error) { - if session.IsAutoCommit { - // FIXME: oci8 can not auto commit (github.com/mattn/go-oci8) - if session.Engine.dialect.DBType() == core.ORACLE { - session.Begin() - r, err := session.Tx.Exec(sqlStr, args...) - session.Commit() - return r, err - } - return session.innerExec(sqlStr, args...) - } - return session.Tx.Exec(sqlStr, args...) - }) -} - -// Exec raw sql -func (session *Session) Exec(sqlStr string, args ...interface{}) (sql.Result, error) { - defer session.resetStatement() - if session.IsAutoClose { - defer session.Close() - } - - return session.exec(sqlStr, args...) -} diff --git a/vendor/github.com/go-xorm/xorm/session_schema.go b/vendor/github.com/go-xorm/xorm/session_schema.go deleted file mode 100644 index 9011adadf..000000000 --- a/vendor/github.com/go-xorm/xorm/session_schema.go +++ /dev/null @@ -1,486 +0,0 @@ -// Copyright 2016 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xorm - -import ( - "database/sql" - "errors" - "fmt" - "reflect" - "strings" - - "github.com/go-xorm/core" -) - -// Ping test if database is ok -func (session *Session) Ping() error { - defer session.resetStatement() - if session.IsAutoClose { - defer session.Close() - } - - return session.DB().Ping() -} - -// CreateTable create a table according a bean -func (session *Session) CreateTable(bean interface{}) error { - v := rValue(bean) - session.Statement.setRefValue(v) - - defer session.resetStatement() - if session.IsAutoClose { - defer session.Close() - } - - return session.createOneTable() -} - -// CreateIndexes create indexes -func (session *Session) CreateIndexes(bean interface{}) error { - v := rValue(bean) - session.Statement.setRefValue(v) - - defer session.resetStatement() - if session.IsAutoClose { - defer session.Close() - } - - sqls := session.Statement.genIndexSQL() - for _, sqlStr := range sqls { - _, err := session.exec(sqlStr) - if err != nil { - return err - } - } - return nil -} - -// CreateUniques create uniques -func (session *Session) CreateUniques(bean interface{}) error { - v := rValue(bean) - session.Statement.setRefValue(v) - - defer session.resetStatement() - if session.IsAutoClose { - defer session.Close() - } - - sqls := session.Statement.genUniqueSQL() - for _, sqlStr := range sqls { - _, err := session.exec(sqlStr) - if err != nil { - return err - } - } - return nil -} - -func (session *Session) createOneTable() error { - sqlStr := session.Statement.genCreateTableSQL() - _, err := session.exec(sqlStr) - return err -} - -// to be deleted -func (session *Session) createAll() error { - if session.IsAutoClose { - defer session.Close() - } - - for _, table := range session.Engine.Tables { - session.Statement.RefTable = table - session.Statement.tableName = table.Name - err := session.createOneTable() - session.resetStatement() - if err != nil { - return err - } - } - return nil -} - -// DropIndexes drop indexes -func (session *Session) DropIndexes(bean interface{}) error { - v := rValue(bean) - session.Statement.setRefValue(v) - - defer session.resetStatement() - if session.IsAutoClose { - defer session.Close() - } - - sqls := session.Statement.genDelIndexSQL() - for _, sqlStr := range sqls { - _, err := session.exec(sqlStr) - if err != nil { - return err - } - } - return nil -} - -// DropTable drop table will drop table if exist, if drop failed, it will return error -func (session *Session) DropTable(beanOrTableName interface{}) error { - tableName, err := session.Engine.tableName(beanOrTableName) - if err != nil { - return err - } - - var needDrop = true - if !session.Engine.dialect.SupportDropIfExists() { - sqlStr, args := session.Engine.dialect.TableCheckSql(tableName) - results, err := session.query(sqlStr, args...) - if err != nil { - return err - } - needDrop = len(results) > 0 - } - - if needDrop { - sqlStr := session.Engine.Dialect().DropTableSql(tableName) - _, err = session.exec(sqlStr) - return err - } - return nil -} - -// IsTableExist if a table is exist -func (session *Session) IsTableExist(beanOrTableName interface{}) (bool, error) { - tableName, err := session.Engine.tableName(beanOrTableName) - if err != nil { - return false, err - } - - return session.isTableExist(tableName) -} - -func (session *Session) isTableExist(tableName string) (bool, error) { - defer session.resetStatement() - if session.IsAutoClose { - defer session.Close() - } - sqlStr, args := session.Engine.dialect.TableCheckSql(tableName) - results, err := session.query(sqlStr, args...) - return len(results) > 0, err -} - -// IsTableEmpty if table have any records -func (session *Session) IsTableEmpty(bean interface{}) (bool, error) { - v := rValue(bean) - t := v.Type() - - if t.Kind() == reflect.String { - return session.isTableEmpty(bean.(string)) - } else if t.Kind() == reflect.Struct { - rows, err := session.Count(bean) - return rows == 0, err - } - return false, errors.New("bean should be a struct or struct's point") -} - -func (session *Session) isTableEmpty(tableName string) (bool, error) { - defer session.resetStatement() - if session.IsAutoClose { - defer session.Close() - } - - var total int64 - sqlStr := fmt.Sprintf("select count(*) from %s", session.Engine.Quote(tableName)) - err := session.DB().QueryRow(sqlStr).Scan(&total) - session.saveLastSQL(sqlStr) - if err != nil { - if err == sql.ErrNoRows { - err = nil - } - return true, err - } - - return total == 0, nil -} - -func (session *Session) isIndexExist(tableName, idxName string, unique bool) (bool, error) { - defer session.resetStatement() - if session.IsAutoClose { - defer session.Close() - } - var idx string - if unique { - idx = uniqueName(tableName, idxName) - } else { - idx = indexName(tableName, idxName) - } - sqlStr, args := session.Engine.dialect.IndexCheckSql(tableName, idx) - results, err := session.query(sqlStr, args...) - return len(results) > 0, err -} - -// find if index is exist according cols -func (session *Session) isIndexExist2(tableName string, cols []string, unique bool) (bool, error) { - defer session.resetStatement() - if session.IsAutoClose { - defer session.Close() - } - - indexes, err := session.Engine.dialect.GetIndexes(tableName) - if err != nil { - return false, err - } - - for _, index := range indexes { - if sliceEq(index.Cols, cols) { - if unique { - return index.Type == core.UniqueType, nil - } - return index.Type == core.IndexType, nil - } - } - return false, nil -} - -func (session *Session) addColumn(colName string) error { - defer session.resetStatement() - if session.IsAutoClose { - defer session.Close() - } - - col := session.Statement.RefTable.GetColumn(colName) - sql, args := session.Statement.genAddColumnStr(col) - _, err := session.exec(sql, args...) - return err -} - -func (session *Session) addIndex(tableName, idxName string) error { - defer session.resetStatement() - if session.IsAutoClose { - defer session.Close() - } - index := session.Statement.RefTable.Indexes[idxName] - sqlStr := session.Engine.dialect.CreateIndexSql(tableName, index) - - _, err := session.exec(sqlStr) - return err -} - -func (session *Session) addUnique(tableName, uqeName string) error { - defer session.resetStatement() - if session.IsAutoClose { - defer session.Close() - } - index := session.Statement.RefTable.Indexes[uqeName] - sqlStr := session.Engine.dialect.CreateIndexSql(tableName, index) - _, err := session.exec(sqlStr) - return err -} - -// To be deleted -func (session *Session) dropAll() error { - defer session.resetStatement() - if session.IsAutoClose { - defer session.Close() - } - - for _, table := range session.Engine.Tables { - session.Statement.Init() - session.Statement.RefTable = table - sqlStr := session.Engine.Dialect().DropTableSql(session.Statement.TableName()) - _, err := session.exec(sqlStr) - if err != nil { - return err - } - } - return nil -} - -// Sync2 synchronize structs to database tables -func (session *Session) Sync2(beans ...interface{}) error { - engine := session.Engine - - tables, err := engine.DBMetas() - if err != nil { - return err - } - - var structTables []*core.Table - - for _, bean := range beans { - v := rValue(bean) - table := engine.mapType(v) - structTables = append(structTables, table) - var tbName = session.tbNameNoSchema(table) - - var oriTable *core.Table - for _, tb := range tables { - if strings.EqualFold(tb.Name, tbName) { - oriTable = tb - break - } - } - - if oriTable == nil { - err = session.StoreEngine(session.Statement.StoreEngine).CreateTable(bean) - if err != nil { - return err - } - - err = session.CreateUniques(bean) - if err != nil { - return err - } - - err = session.CreateIndexes(bean) - if err != nil { - return err - } - } else { - for _, col := range table.Columns() { - var oriCol *core.Column - for _, col2 := range oriTable.Columns() { - if strings.EqualFold(col.Name, col2.Name) { - oriCol = col2 - break - } - } - - if oriCol != nil { - expectedType := engine.dialect.SqlType(col) - curType := engine.dialect.SqlType(oriCol) - if expectedType != curType { - if expectedType == core.Text && - strings.HasPrefix(curType, core.Varchar) { - // currently only support mysql & postgres - if engine.dialect.DBType() == core.MYSQL || - engine.dialect.DBType() == core.POSTGRES { - engine.logger.Infof("Table %s column %s change type from %s to %s\n", - tbName, col.Name, curType, expectedType) - _, err = engine.Exec(engine.dialect.ModifyColumnSql(table.Name, col)) - } else { - engine.logger.Warnf("Table %s column %s db type is %s, struct type is %s\n", - tbName, col.Name, curType, expectedType) - } - } else if strings.HasPrefix(curType, core.Varchar) && strings.HasPrefix(expectedType, core.Varchar) { - if engine.dialect.DBType() == core.MYSQL { - if oriCol.Length < col.Length { - engine.logger.Infof("Table %s column %s change type from varchar(%d) to varchar(%d)\n", - tbName, col.Name, oriCol.Length, col.Length) - _, err = engine.Exec(engine.dialect.ModifyColumnSql(table.Name, col)) - } - } - } else { - if !(strings.HasPrefix(curType, expectedType) && curType[len(expectedType)] == '(') { - engine.logger.Warnf("Table %s column %s db type is %s, struct type is %s", - tbName, col.Name, curType, expectedType) - } - } - } else if expectedType == core.Varchar { - if engine.dialect.DBType() == core.MYSQL { - if oriCol.Length < col.Length { - engine.logger.Infof("Table %s column %s change type from varchar(%d) to varchar(%d)\n", - tbName, col.Name, oriCol.Length, col.Length) - _, err = engine.Exec(engine.dialect.ModifyColumnSql(table.Name, col)) - } - } - } - if col.Default != oriCol.Default { - engine.logger.Warnf("Table %s Column %s db default is %s, struct default is %s", - tbName, col.Name, oriCol.Default, col.Default) - } - if col.Nullable != oriCol.Nullable { - engine.logger.Warnf("Table %s Column %s db nullable is %v, struct nullable is %v", - tbName, col.Name, oriCol.Nullable, col.Nullable) - } - } else { - session := engine.NewSession() - session.Statement.RefTable = table - session.Statement.tableName = tbName - defer session.Close() - err = session.addColumn(col.Name) - } - if err != nil { - return err - } - } - - var foundIndexNames = make(map[string]bool) - var addedNames = make(map[string]*core.Index) - - for name, index := range table.Indexes { - var oriIndex *core.Index - for name2, index2 := range oriTable.Indexes { - if index.Equal(index2) { - oriIndex = index2 - foundIndexNames[name2] = true - break - } - } - - if oriIndex != nil { - if oriIndex.Type != index.Type { - sql := engine.dialect.DropIndexSql(tbName, oriIndex) - _, err = engine.Exec(sql) - if err != nil { - return err - } - oriIndex = nil - } - } - - if oriIndex == nil { - addedNames[name] = index - } - } - - for name2, index2 := range oriTable.Indexes { - if _, ok := foundIndexNames[name2]; !ok { - sql := engine.dialect.DropIndexSql(tbName, index2) - _, err = engine.Exec(sql) - if err != nil { - return err - } - } - } - - for name, index := range addedNames { - if index.Type == core.UniqueType { - session := engine.NewSession() - session.Statement.RefTable = table - session.Statement.tableName = tbName - defer session.Close() - err = session.addUnique(tbName, name) - } else if index.Type == core.IndexType { - session := engine.NewSession() - session.Statement.RefTable = table - session.Statement.tableName = tbName - defer session.Close() - err = session.addIndex(tbName, name) - } - if err != nil { - return err - } - } - } - } - - for _, table := range tables { - var oriTable *core.Table - for _, structTable := range structTables { - if strings.EqualFold(table.Name, session.tbNameNoSchema(structTable)) { - oriTable = structTable - break - } - } - - if oriTable == nil { - //engine.LogWarnf("Table %s has no struct to mapping it", table.Name) - continue - } - - for _, colName := range table.ColumnsSeq() { - if oriTable.GetColumn(colName) == nil { - engine.logger.Warnf("Table %s has column %s but struct has not related field", table.Name, colName) - } - } - } - return nil -} diff --git a/vendor/github.com/go-xorm/xorm/session_sum.go b/vendor/github.com/go-xorm/xorm/session_sum.go deleted file mode 100644 index 127f83f28..000000000 --- a/vendor/github.com/go-xorm/xorm/session_sum.go +++ /dev/null @@ -1,137 +0,0 @@ -// Copyright 2016 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xorm - -import "database/sql" - -// Count counts the records. bean's non-empty fields -// are conditions. -func (session *Session) Count(bean interface{}) (int64, error) { - defer session.resetStatement() - if session.IsAutoClose { - defer session.Close() - } - - var sqlStr string - var args []interface{} - if session.Statement.RawSQL == "" { - sqlStr, args = session.Statement.genCountSQL(bean) - } else { - sqlStr = session.Statement.RawSQL - args = session.Statement.RawParams - } - - session.queryPreprocess(&sqlStr, args...) - - var err error - var total int64 - if session.IsAutoCommit { - err = session.DB().QueryRow(sqlStr, args...).Scan(&total) - } else { - err = session.Tx.QueryRow(sqlStr, args...).Scan(&total) - } - - if err == sql.ErrNoRows || err == nil { - return total, nil - } - - return 0, err -} - -// Sum call sum some column. bean's non-empty fields are conditions. -func (session *Session) Sum(bean interface{}, columnName string) (float64, error) { - defer session.resetStatement() - if session.IsAutoClose { - defer session.Close() - } - - var sqlStr string - var args []interface{} - if len(session.Statement.RawSQL) == 0 { - sqlStr, args = session.Statement.genSumSQL(bean, columnName) - } else { - sqlStr = session.Statement.RawSQL - args = session.Statement.RawParams - } - - session.queryPreprocess(&sqlStr, args...) - - var err error - var res float64 - if session.IsAutoCommit { - err = session.DB().QueryRow(sqlStr, args...).Scan(&res) - } else { - err = session.Tx.QueryRow(sqlStr, args...).Scan(&res) - } - - if err == sql.ErrNoRows || err == nil { - return res, nil - } - return 0, err -} - -// Sums call sum some columns. bean's non-empty fields are conditions. -func (session *Session) Sums(bean interface{}, columnNames ...string) ([]float64, error) { - defer session.resetStatement() - if session.IsAutoClose { - defer session.Close() - } - - var sqlStr string - var args []interface{} - if len(session.Statement.RawSQL) == 0 { - sqlStr, args = session.Statement.genSumSQL(bean, columnNames...) - } else { - sqlStr = session.Statement.RawSQL - args = session.Statement.RawParams - } - - session.queryPreprocess(&sqlStr, args...) - - var err error - var res = make([]float64, len(columnNames), len(columnNames)) - if session.IsAutoCommit { - err = session.DB().QueryRow(sqlStr, args...).ScanSlice(&res) - } else { - err = session.Tx.QueryRow(sqlStr, args...).ScanSlice(&res) - } - - if err == sql.ErrNoRows || err == nil { - return res, nil - } - return nil, err -} - -// SumsInt sum specify columns and return as []int64 instead of []float64 -func (session *Session) SumsInt(bean interface{}, columnNames ...string) ([]int64, error) { - defer session.resetStatement() - if session.IsAutoClose { - defer session.Close() - } - - var sqlStr string - var args []interface{} - if len(session.Statement.RawSQL) == 0 { - sqlStr, args = session.Statement.genSumSQL(bean, columnNames...) - } else { - sqlStr = session.Statement.RawSQL - args = session.Statement.RawParams - } - - session.queryPreprocess(&sqlStr, args...) - - var err error - var res = make([]int64, 0, len(columnNames)) - if session.IsAutoCommit { - err = session.DB().QueryRow(sqlStr, args...).ScanSlice(&res) - } else { - err = session.Tx.QueryRow(sqlStr, args...).ScanSlice(&res) - } - - if err == sql.ErrNoRows || err == nil { - return res, nil - } - return nil, err -} diff --git a/vendor/github.com/go-xorm/xorm/session_tx.go b/vendor/github.com/go-xorm/xorm/session_tx.go deleted file mode 100644 index 302bc104d..000000000 --- a/vendor/github.com/go-xorm/xorm/session_tx.go +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright 2016 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xorm - -// Begin a transaction -func (session *Session) Begin() error { - if session.IsAutoCommit { - tx, err := session.DB().Begin() - if err != nil { - return err - } - session.IsAutoCommit = false - session.IsCommitedOrRollbacked = false - session.Tx = tx - session.saveLastSQL("BEGIN TRANSACTION") - } - return nil -} - -// Rollback When using transaction, you can rollback if any error -func (session *Session) Rollback() error { - if !session.IsAutoCommit && !session.IsCommitedOrRollbacked { - session.saveLastSQL(session.Engine.dialect.RollBackStr()) - session.IsCommitedOrRollbacked = true - return session.Tx.Rollback() - } - return nil -} - -// Commit When using transaction, Commit will commit all operations. -func (session *Session) Commit() error { - if !session.IsAutoCommit && !session.IsCommitedOrRollbacked { - session.saveLastSQL("COMMIT") - session.IsCommitedOrRollbacked = true - var err error - if err = session.Tx.Commit(); err == nil { - // handle processors after tx committed - - closureCallFunc := func(closuresPtr *[]func(interface{}), bean interface{}) { - - if closuresPtr != nil { - for _, closure := range *closuresPtr { - closure(bean) - } - } - } - - for bean, closuresPtr := range session.afterInsertBeans { - closureCallFunc(closuresPtr, bean) - - if processor, ok := interface{}(bean).(AfterInsertProcessor); ok { - processor.AfterInsert() - } - } - for bean, closuresPtr := range session.afterUpdateBeans { - closureCallFunc(closuresPtr, bean) - - if processor, ok := interface{}(bean).(AfterUpdateProcessor); ok { - processor.AfterUpdate() - } - } - for bean, closuresPtr := range session.afterDeleteBeans { - closureCallFunc(closuresPtr, bean) - - if processor, ok := interface{}(bean).(AfterDeleteProcessor); ok { - processor.AfterDelete() - } - } - cleanUpFunc := func(slices *map[interface{}]*[]func(interface{})) { - if len(*slices) > 0 { - *slices = make(map[interface{}]*[]func(interface{}), 0) - } - } - cleanUpFunc(&session.afterInsertBeans) - cleanUpFunc(&session.afterUpdateBeans) - cleanUpFunc(&session.afterDeleteBeans) - } - return err - } - return nil -} diff --git a/vendor/github.com/go-xorm/xorm/session_update.go b/vendor/github.com/go-xorm/xorm/session_update.go deleted file mode 100644 index 27e2deb0f..000000000 --- a/vendor/github.com/go-xorm/xorm/session_update.go +++ /dev/null @@ -1,345 +0,0 @@ -// Copyright 2016 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xorm - -import ( - "errors" - "fmt" - "reflect" - "strconv" - "strings" - - "github.com/go-xorm/builder" - "github.com/go-xorm/core" -) - -func (session *Session) cacheUpdate(sqlStr string, args ...interface{}) error { - if session.Statement.RefTable == nil || - session.Tx != nil { - return ErrCacheFailed - } - - oldhead, newsql := session.Statement.convertUpdateSQL(sqlStr) - if newsql == "" { - return ErrCacheFailed - } - for _, filter := range session.Engine.dialect.Filters() { - newsql = filter.Do(newsql, session.Engine.dialect, session.Statement.RefTable) - } - session.Engine.logger.Debug("[cacheUpdate] new sql", oldhead, newsql) - - var nStart int - if len(args) > 0 { - if strings.Index(sqlStr, "?") > -1 { - nStart = strings.Count(oldhead, "?") - } else { - // only for pq, TODO: if any other databse? - nStart = strings.Count(oldhead, "$") - } - } - table := session.Statement.RefTable - cacher := session.Engine.getCacher2(table) - tableName := session.Statement.TableName() - session.Engine.logger.Debug("[cacheUpdate] get cache sql", newsql, args[nStart:]) - ids, err := core.GetCacheSql(cacher, tableName, newsql, args[nStart:]) - if err != nil { - rows, err := session.DB().Query(newsql, args[nStart:]...) - if err != nil { - return err - } - defer rows.Close() - - ids = make([]core.PK, 0) - for rows.Next() { - var res = make([]string, len(table.PrimaryKeys)) - err = rows.ScanSlice(&res) - if err != nil { - return err - } - var pk core.PK = make([]interface{}, len(table.PrimaryKeys)) - for i, col := range table.PKColumns() { - if col.SQLType.IsNumeric() { - n, err := strconv.ParseInt(res[i], 10, 64) - if err != nil { - return err - } - pk[i] = n - } else if col.SQLType.IsText() { - pk[i] = res[i] - } else { - return errors.New("not supported") - } - } - - ids = append(ids, pk) - } - session.Engine.logger.Debug("[cacheUpdate] find updated id", ids) - } /*else { - session.Engine.LogDebug("[xorm:cacheUpdate] del cached sql:", tableName, newsql, args) - cacher.DelIds(tableName, genSqlKey(newsql, args)) - }*/ - - for _, id := range ids { - sid, err := id.ToString() - if err != nil { - return err - } - if bean := cacher.GetBean(tableName, sid); bean != nil { - sqls := splitNNoCase(sqlStr, "where", 2) - if len(sqls) == 0 || len(sqls) > 2 { - return ErrCacheFailed - } - - sqls = splitNNoCase(sqls[0], "set", 2) - if len(sqls) != 2 { - return ErrCacheFailed - } - kvs := strings.Split(strings.TrimSpace(sqls[1]), ",") - for idx, kv := range kvs { - sps := strings.SplitN(kv, "=", 2) - sps2 := strings.Split(sps[0], ".") - colName := sps2[len(sps2)-1] - if strings.Contains(colName, "`") { - colName = strings.TrimSpace(strings.Replace(colName, "`", "", -1)) - } else if strings.Contains(colName, session.Engine.QuoteStr()) { - colName = strings.TrimSpace(strings.Replace(colName, session.Engine.QuoteStr(), "", -1)) - } else { - session.Engine.logger.Debug("[cacheUpdate] cannot find column", tableName, colName) - return ErrCacheFailed - } - - if col := table.GetColumn(colName); col != nil { - fieldValue, err := col.ValueOf(bean) - if err != nil { - session.Engine.logger.Error(err) - } else { - session.Engine.logger.Debug("[cacheUpdate] set bean field", bean, colName, fieldValue.Interface()) - if col.IsVersion && session.Statement.checkVersion { - fieldValue.SetInt(fieldValue.Int() + 1) - } else { - fieldValue.Set(reflect.ValueOf(args[idx])) - } - } - } else { - session.Engine.logger.Errorf("[cacheUpdate] ERROR: column %v is not table %v's", - colName, table.Name) - } - } - - session.Engine.logger.Debug("[cacheUpdate] update cache", tableName, id, bean) - cacher.PutBean(tableName, sid, bean) - } - } - session.Engine.logger.Debug("[cacheUpdate] clear cached table sql:", tableName) - cacher.ClearIds(tableName) - return nil -} - -// Update records, bean's non-empty fields are updated contents, -// condiBean' non-empty filds are conditions -// CAUTION: -// 1.bool will defaultly be updated content nor conditions -// You should call UseBool if you have bool to use. -// 2.float32 & float64 may be not inexact as conditions -func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int64, error) { - defer session.resetStatement() - if session.IsAutoClose { - defer session.Close() - } - - v := rValue(bean) - t := v.Type() - - var colNames []string - var args []interface{} - - // handle before update processors - for _, closure := range session.beforeClosures { - closure(bean) - } - cleanupProcessorsClosures(&session.beforeClosures) // cleanup after used - if processor, ok := interface{}(bean).(BeforeUpdateProcessor); ok { - processor.BeforeUpdate() - } - // -- - - var err error - var isMap = t.Kind() == reflect.Map - var isStruct = t.Kind() == reflect.Struct - if isStruct { - session.Statement.setRefValue(v) - - if len(session.Statement.TableName()) <= 0 { - return 0, ErrTableNotFound - } - - if session.Statement.ColumnStr == "" { - colNames, args = buildUpdates(session.Engine, session.Statement.RefTable, bean, false, false, - false, false, session.Statement.allUseBool, session.Statement.useAllCols, - session.Statement.mustColumnMap, session.Statement.nullableMap, - session.Statement.columnMap, true, session.Statement.unscoped) - } else { - colNames, args, err = genCols(session.Statement.RefTable, session, bean, true, true) - if err != nil { - return 0, err - } - } - } else if isMap { - colNames = make([]string, 0) - args = make([]interface{}, 0) - bValue := reflect.Indirect(reflect.ValueOf(bean)) - - for _, v := range bValue.MapKeys() { - colNames = append(colNames, session.Engine.Quote(v.String())+" = ?") - args = append(args, bValue.MapIndex(v).Interface()) - } - } else { - return 0, ErrParamsType - } - - table := session.Statement.RefTable - - if session.Statement.UseAutoTime && table != nil && table.Updated != "" { - colNames = append(colNames, session.Engine.Quote(table.Updated)+" = ?") - col := table.UpdatedColumn() - val, t := session.Engine.NowTime2(col.SQLType.Name) - args = append(args, val) - - var colName = col.Name - if isStruct { - session.afterClosures = append(session.afterClosures, func(bean interface{}) { - col := table.GetColumn(colName) - setColumnTime(bean, col, t) - }) - } - } - - //for update action to like "column = column + ?" - incColumns := session.Statement.getInc() - for _, v := range incColumns { - colNames = append(colNames, session.Engine.Quote(v.colName)+" = "+session.Engine.Quote(v.colName)+" + ?") - args = append(args, v.arg) - } - //for update action to like "column = column - ?" - decColumns := session.Statement.getDec() - for _, v := range decColumns { - colNames = append(colNames, session.Engine.Quote(v.colName)+" = "+session.Engine.Quote(v.colName)+" - ?") - args = append(args, v.arg) - } - //for update action to like "column = expression" - exprColumns := session.Statement.getExpr() - for _, v := range exprColumns { - colNames = append(colNames, session.Engine.Quote(v.colName)+" = "+v.expr) - } - - session.Statement.processIDParam() - - var autoCond builder.Cond - if !session.Statement.noAutoCondition && len(condiBean) > 0 { - var err error - autoCond, err = session.Statement.buildConds(session.Statement.RefTable, condiBean[0], true, true, false, true, false) - if err != nil { - return 0, err - } - } - - st := session.Statement - defer session.resetStatement() - - var sqlStr string - var condArgs []interface{} - var condSQL string - cond := session.Statement.cond.And(autoCond) - - doIncVer := false - var verValue *reflect.Value - if table != nil && table.Version != "" && session.Statement.checkVersion { - verValue, err = table.VersionColumn().ValueOf(bean) - if err != nil { - return 0, err - } - - cond = cond.And(builder.Eq{session.Engine.Quote(table.Version): verValue.Interface()}) - condSQL, condArgs, _ = builder.ToSQL(cond) - - if len(condSQL) > 0 { - condSQL = "WHERE " + condSQL - } - - if st.LimitN > 0 { - condSQL = condSQL + fmt.Sprintf(" LIMIT %d", st.LimitN) - } - - sqlStr = fmt.Sprintf("UPDATE %v SET %v, %v %v", - session.Engine.Quote(session.Statement.TableName()), - strings.Join(colNames, ", "), - session.Engine.Quote(table.Version)+" = "+session.Engine.Quote(table.Version)+" + 1", - condSQL) - - doIncVer = true - } else { - condSQL, condArgs, _ = builder.ToSQL(cond) - if len(condSQL) > 0 { - condSQL = "WHERE " + condSQL - } - - if st.LimitN > 0 { - condSQL = condSQL + fmt.Sprintf(" LIMIT %d", st.LimitN) - } - - sqlStr = fmt.Sprintf("UPDATE %v SET %v %v", - session.Engine.Quote(session.Statement.TableName()), - strings.Join(colNames, ", "), - condSQL) - } - - res, err := session.exec(sqlStr, append(args, condArgs...)...) - if err != nil { - return 0, err - } else if doIncVer { - if verValue != nil && verValue.IsValid() && verValue.CanSet() { - verValue.SetInt(verValue.Int() + 1) - } - } - - if table != nil { - if cacher := session.Engine.getCacher2(table); cacher != nil && session.Statement.UseCache { - cacher.ClearIds(session.Statement.TableName()) - cacher.ClearBeans(session.Statement.TableName()) - } - } - - // handle after update processors - if session.IsAutoCommit { - for _, closure := range session.afterClosures { - closure(bean) - } - if processor, ok := interface{}(bean).(AfterUpdateProcessor); ok { - session.Engine.logger.Debug("[event]", session.Statement.TableName(), " has after update processor") - processor.AfterUpdate() - } - } else { - lenAfterClosures := len(session.afterClosures) - if lenAfterClosures > 0 { - if value, has := session.afterUpdateBeans[bean]; has && value != nil { - *value = append(*value, session.afterClosures...) - } else { - afterClosures := make([]func(interface{}), lenAfterClosures) - copy(afterClosures, session.afterClosures) - // FIXME: if bean is a map type, it will panic because map cannot be as map key - session.afterUpdateBeans[bean] = &afterClosures - } - - } else { - if _, ok := interface{}(bean).(AfterUpdateProcessor); ok { - session.afterUpdateBeans[bean] = nil - } - } - } - cleanupProcessorsClosures(&session.afterClosures) // cleanup after used - // -- - - return res.RowsAffected() -} diff --git a/vendor/github.com/go-xorm/xorm/sqlite3_dialect.go b/vendor/github.com/go-xorm/xorm/sqlite3_dialect.go deleted file mode 100644 index b72459aeb..000000000 --- a/vendor/github.com/go-xorm/xorm/sqlite3_dialect.go +++ /dev/null @@ -1,436 +0,0 @@ -// Copyright 2015 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xorm - -import ( - "database/sql" - "errors" - "fmt" - "regexp" - "strings" - - "github.com/go-xorm/core" -) - -// func init() { -// RegisterDialect("sqlite3", &sqlite3{}) -// } - -var ( - sqlite3ReservedWords = map[string]bool{ - "ABORT": true, - "ACTION": true, - "ADD": true, - "AFTER": true, - "ALL": true, - "ALTER": true, - "ANALYZE": true, - "AND": true, - "AS": true, - "ASC": true, - "ATTACH": true, - "AUTOINCREMENT": true, - "BEFORE": true, - "BEGIN": true, - "BETWEEN": true, - "BY": true, - "CASCADE": true, - "CASE": true, - "CAST": true, - "CHECK": true, - "COLLATE": true, - "COLUMN": true, - "COMMIT": true, - "CONFLICT": true, - "CONSTRAINT": true, - "CREATE": true, - "CROSS": true, - "CURRENT_DATE": true, - "CURRENT_TIME": true, - "CURRENT_TIMESTAMP": true, - "DATABASE": true, - "DEFAULT": true, - "DEFERRABLE": true, - "DEFERRED": true, - "DELETE": true, - "DESC": true, - "DETACH": true, - "DISTINCT": true, - "DROP": true, - "EACH": true, - "ELSE": true, - "END": true, - "ESCAPE": true, - "EXCEPT": true, - "EXCLUSIVE": true, - "EXISTS": true, - "EXPLAIN": true, - "FAIL": true, - "FOR": true, - "FOREIGN": true, - "FROM": true, - "FULL": true, - "GLOB": true, - "GROUP": true, - "HAVING": true, - "IF": true, - "IGNORE": true, - "IMMEDIATE": true, - "IN": true, - "INDEX": true, - "INDEXED": true, - "INITIALLY": true, - "INNER": true, - "INSERT": true, - "INSTEAD": true, - "INTERSECT": true, - "INTO": true, - "IS": true, - "ISNULL": true, - "JOIN": true, - "KEY": true, - "LEFT": true, - "LIKE": true, - "LIMIT": true, - "MATCH": true, - "NATURAL": true, - "NO": true, - "NOT": true, - "NOTNULL": true, - "NULL": true, - "OF": true, - "OFFSET": true, - "ON": true, - "OR": true, - "ORDER": true, - "OUTER": true, - "PLAN": true, - "PRAGMA": true, - "PRIMARY": true, - "QUERY": true, - "RAISE": true, - "RECURSIVE": true, - "REFERENCES": true, - "REGEXP": true, - "REINDEX": true, - "RELEASE": true, - "RENAME": true, - "REPLACE": true, - "RESTRICT": true, - "RIGHT": true, - "ROLLBACK": true, - "ROW": true, - "SAVEPOINT": true, - "SELECT": true, - "SET": true, - "TABLE": true, - "TEMP": true, - "TEMPORARY": true, - "THEN": true, - "TO": true, - "TRANSACTI": true, - "TRIGGER": true, - "UNION": true, - "UNIQUE": true, - "UPDATE": true, - "USING": true, - "VACUUM": true, - "VALUES": true, - "VIEW": true, - "VIRTUAL": true, - "WHEN": true, - "WHERE": true, - "WITH": true, - "WITHOUT": true, - } -) - -type sqlite3 struct { - core.Base -} - -func (db *sqlite3) Init(d *core.DB, uri *core.Uri, drivername, dataSourceName string) error { - return db.Base.Init(d, db, uri, drivername, dataSourceName) -} - -func (db *sqlite3) SqlType(c *core.Column) string { - switch t := c.SQLType.Name; t { - case core.Bool: - if c.Default == "true" { - c.Default = "1" - } else if c.Default == "false" { - c.Default = "0" - } - return core.Integer - case core.Date, core.DateTime, core.TimeStamp, core.Time: - return core.DateTime - case core.TimeStampz: - return core.Text - case core.Char, core.Varchar, core.NVarchar, core.TinyText, - core.Text, core.MediumText, core.LongText, core.Json: - return core.Text - case core.Bit, core.TinyInt, core.SmallInt, core.MediumInt, core.Int, core.Integer, core.BigInt: - return core.Integer - case core.Float, core.Double, core.Real: - return core.Real - case core.Decimal, core.Numeric: - return core.Numeric - case core.TinyBlob, core.Blob, core.MediumBlob, core.LongBlob, core.Bytea, core.Binary, core.VarBinary: - return core.Blob - case core.Serial, core.BigSerial: - c.IsPrimaryKey = true - c.IsAutoIncrement = true - c.Nullable = false - return core.Integer - default: - return t - } -} - -func (db *sqlite3) FormatBytes(bs []byte) string { - return fmt.Sprintf("X'%x'", bs) -} - -func (db *sqlite3) SupportInsertMany() bool { - return true -} - -func (db *sqlite3) IsReserved(name string) bool { - _, ok := sqlite3ReservedWords[name] - return ok -} - -func (db *sqlite3) Quote(name string) string { - return "`" + name + "`" -} - -func (db *sqlite3) QuoteStr() string { - return "`" -} - -func (db *sqlite3) AutoIncrStr() string { - return "AUTOINCREMENT" -} - -func (db *sqlite3) SupportEngine() bool { - return false -} - -func (db *sqlite3) SupportCharset() bool { - return false -} - -func (db *sqlite3) IndexOnTable() bool { - return false -} - -func (db *sqlite3) IndexCheckSql(tableName, idxName string) (string, []interface{}) { - args := []interface{}{idxName} - return "SELECT name FROM sqlite_master WHERE type='index' and name = ?", args -} - -func (db *sqlite3) TableCheckSql(tableName string) (string, []interface{}) { - args := []interface{}{tableName} - return "SELECT name FROM sqlite_master WHERE type='table' and name = ?", args -} - -func (db *sqlite3) DropIndexSql(tableName string, index *core.Index) string { - //var unique string - quote := db.Quote - idxName := index.Name - - if !strings.HasPrefix(idxName, "UQE_") && - !strings.HasPrefix(idxName, "IDX_") { - if index.Type == core.UniqueType { - idxName = fmt.Sprintf("UQE_%v_%v", tableName, index.Name) - } else { - idxName = fmt.Sprintf("IDX_%v_%v", tableName, index.Name) - } - } - return fmt.Sprintf("DROP INDEX %v", quote(idxName)) -} - -func (db *sqlite3) ForUpdateSql(query string) string { - return query -} - -/*func (db *sqlite3) ColumnCheckSql(tableName, colName string) (string, []interface{}) { - args := []interface{}{tableName} - sql := "SELECT name FROM sqlite_master WHERE type='table' and name = ? and ((sql like '%`" + colName + "`%') or (sql like '%[" + colName + "]%'))" - return sql, args -}*/ - -func (db *sqlite3) IsColumnExist(tableName, colName string) (bool, error) { - args := []interface{}{tableName} - query := "SELECT name FROM sqlite_master WHERE type='table' and name = ? and ((sql like '%`" + colName + "`%') or (sql like '%[" + colName + "]%'))" - db.LogSQL(query, args) - rows, err := db.DB().Query(query, args...) - if err != nil { - return false, err - } - defer rows.Close() - - if rows.Next() { - return true, nil - } - return false, nil -} - -func (db *sqlite3) GetColumns(tableName string) ([]string, map[string]*core.Column, error) { - args := []interface{}{tableName} - s := "SELECT sql FROM sqlite_master WHERE type='table' and name = ?" - db.LogSQL(s, args) - rows, err := db.DB().Query(s, args...) - if err != nil { - return nil, nil, err - } - defer rows.Close() - - var name string - for rows.Next() { - err = rows.Scan(&name) - if err != nil { - return nil, nil, err - } - break - } - - if name == "" { - return nil, nil, errors.New("no table named " + tableName) - } - - nStart := strings.Index(name, "(") - nEnd := strings.LastIndex(name, ")") - reg := regexp.MustCompile(`[^\(,\)]*(\([^\(]*\))?`) - colCreates := reg.FindAllString(name[nStart+1:nEnd], -1) - cols := make(map[string]*core.Column) - colSeq := make([]string, 0) - for _, colStr := range colCreates { - reg = regexp.MustCompile(`,\s`) - colStr = reg.ReplaceAllString(colStr, ",") - fields := strings.Fields(strings.TrimSpace(colStr)) - col := new(core.Column) - col.Indexes = make(map[string]int) - col.Nullable = true - col.DefaultIsEmpty = true - for idx, field := range fields { - if idx == 0 { - col.Name = strings.Trim(strings.Trim(field, "`[] "), `"`) - continue - } else if idx == 1 { - col.SQLType = core.SQLType{Name: field, DefaultLength: 0, DefaultLength2: 0} - } - switch field { - case "PRIMARY": - col.IsPrimaryKey = true - case "AUTOINCREMENT": - col.IsAutoIncrement = true - case "NULL": - if fields[idx-1] == "NOT" { - col.Nullable = false - } else { - col.Nullable = true - } - case "DEFAULT": - col.Default = fields[idx+1] - col.DefaultIsEmpty = false - } - } - if !col.SQLType.IsNumeric() && !col.DefaultIsEmpty { - col.Default = "'" + col.Default + "'" - } - cols[col.Name] = col - colSeq = append(colSeq, col.Name) - } - return colSeq, cols, nil -} - -func (db *sqlite3) GetTables() ([]*core.Table, error) { - args := []interface{}{} - s := "SELECT name FROM sqlite_master WHERE type='table'" - db.LogSQL(s, args) - - rows, err := db.DB().Query(s, args...) - if err != nil { - return nil, err - } - defer rows.Close() - - tables := make([]*core.Table, 0) - for rows.Next() { - table := core.NewEmptyTable() - err = rows.Scan(&table.Name) - if err != nil { - return nil, err - } - if table.Name == "sqlite_sequence" { - continue - } - tables = append(tables, table) - } - return tables, nil -} - -func (db *sqlite3) GetIndexes(tableName string) (map[string]*core.Index, error) { - args := []interface{}{tableName} - s := "SELECT sql FROM sqlite_master WHERE type='index' and tbl_name = ?" - db.LogSQL(s, args) - - rows, err := db.DB().Query(s, args...) - if err != nil { - return nil, err - } - defer rows.Close() - - indexes := make(map[string]*core.Index, 0) - for rows.Next() { - var tmpSQL sql.NullString - err = rows.Scan(&tmpSQL) - if err != nil { - return nil, err - } - - if !tmpSQL.Valid { - continue - } - sql := tmpSQL.String - - index := new(core.Index) - nNStart := strings.Index(sql, "INDEX") - nNEnd := strings.Index(sql, "ON") - if nNStart == -1 || nNEnd == -1 { - continue - } - - indexName := strings.Trim(sql[nNStart+6:nNEnd], "` []") - if strings.HasPrefix(indexName, "IDX_"+tableName) || strings.HasPrefix(indexName, "UQE_"+tableName) { - index.Name = indexName[5+len(tableName):] - } else { - index.Name = indexName - } - - if strings.HasPrefix(sql, "CREATE UNIQUE INDEX") { - index.Type = core.UniqueType - } else { - index.Type = core.IndexType - } - - nStart := strings.Index(sql, "(") - nEnd := strings.Index(sql, ")") - colIndexes := strings.Split(sql[nStart+1:nEnd], ",") - - index.Cols = make([]string, 0) - for _, col := range colIndexes { - index.Cols = append(index.Cols, strings.Trim(col, "` []")) - } - indexes[index.Name] = index - } - - return indexes, nil -} - -func (db *sqlite3) Filters() []core.Filter { - return []core.Filter{&core.IdFilter{}} -} diff --git a/vendor/github.com/go-xorm/xorm/sqlite3_driver.go b/vendor/github.com/go-xorm/xorm/sqlite3_driver.go deleted file mode 100644 index 6ae19569e..000000000 --- a/vendor/github.com/go-xorm/xorm/sqlite3_driver.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2015 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xorm - -import ( - "github.com/go-xorm/core" -) - -// func init() { -// core.RegisterDriver("sqlite3", &sqlite3Driver{}) -// } - -type sqlite3Driver struct { -} - -func (p *sqlite3Driver) Parse(driverName, dataSourceName string) (*core.Uri, error) { - return &core.Uri{DbType: core.SQLITE, DbName: dataSourceName}, nil -} diff --git a/vendor/github.com/go-xorm/xorm/statement.go b/vendor/github.com/go-xorm/xorm/statement.go deleted file mode 100644 index fb116b949..000000000 --- a/vendor/github.com/go-xorm/xorm/statement.go +++ /dev/null @@ -1,1381 +0,0 @@ -// Copyright 2015 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xorm - -import ( - "bytes" - "database/sql/driver" - "encoding/json" - "errors" - "fmt" - "reflect" - "strings" - "time" - - "github.com/go-xorm/builder" - "github.com/go-xorm/core" -) - -type incrParam struct { - colName string - arg interface{} -} - -type decrParam struct { - colName string - arg interface{} -} - -type exprParam struct { - colName string - expr string -} - -// Statement save all the sql info for executing SQL -type Statement struct { - RefTable *core.Table - Engine *Engine - Start int - LimitN int - IdParam *core.PK - OrderStr string - JoinStr string - joinArgs []interface{} - GroupByStr string - HavingStr string - ColumnStr string - selectStr string - columnMap map[string]bool - useAllCols bool - OmitStr string - AltTableName string - tableName string - RawSQL string - RawParams []interface{} - UseCascade bool - UseAutoJoin bool - StoreEngine string - Charset string - UseCache bool - UseAutoTime bool - noAutoCondition bool - IsDistinct bool - IsForUpdate bool - TableAlias string - allUseBool bool - checkVersion bool - unscoped bool - mustColumnMap map[string]bool - nullableMap map[string]bool - incrColumns map[string]incrParam - decrColumns map[string]decrParam - exprColumns map[string]exprParam - cond builder.Cond -} - -// Init reset all the statement's fields -func (statement *Statement) Init() { - statement.RefTable = nil - statement.Start = 0 - statement.LimitN = 0 - statement.OrderStr = "" - statement.UseCascade = true - statement.JoinStr = "" - statement.joinArgs = make([]interface{}, 0) - statement.GroupByStr = "" - statement.HavingStr = "" - statement.ColumnStr = "" - statement.OmitStr = "" - statement.columnMap = make(map[string]bool) - statement.AltTableName = "" - statement.tableName = "" - statement.IdParam = nil - statement.RawSQL = "" - statement.RawParams = make([]interface{}, 0) - statement.UseCache = true - statement.UseAutoTime = true - statement.noAutoCondition = false - statement.IsDistinct = false - statement.IsForUpdate = false - statement.TableAlias = "" - statement.selectStr = "" - statement.allUseBool = false - statement.useAllCols = false - statement.mustColumnMap = make(map[string]bool) - statement.nullableMap = make(map[string]bool) - statement.checkVersion = true - statement.unscoped = false - statement.incrColumns = make(map[string]incrParam) - statement.decrColumns = make(map[string]decrParam) - statement.exprColumns = make(map[string]exprParam) - statement.cond = builder.NewCond() -} - -// NoAutoCondition if you do not want convert bean's field as query condition, then use this function -func (statement *Statement) NoAutoCondition(no ...bool) *Statement { - statement.noAutoCondition = true - if len(no) > 0 { - statement.noAutoCondition = no[0] - } - return statement -} - -// Alias set the table alias -func (statement *Statement) Alias(alias string) *Statement { - statement.TableAlias = alias - return statement -} - -// SQL adds raw sql statement -func (statement *Statement) SQL(query interface{}, args ...interface{}) *Statement { - switch query.(type) { - case (*builder.Builder): - var err error - statement.RawSQL, statement.RawParams, err = query.(*builder.Builder).ToSQL() - if err != nil { - statement.Engine.logger.Error(err) - } - case string: - statement.RawSQL = query.(string) - statement.RawParams = args - default: - statement.Engine.logger.Error("unsupported sql type") - } - - return statement -} - -// Where add Where statement -func (statement *Statement) Where(query interface{}, args ...interface{}) *Statement { - return statement.And(query, args...) -} - -// And add Where & and statement -func (statement *Statement) And(query interface{}, args ...interface{}) *Statement { - switch query.(type) { - case string: - cond := builder.Expr(query.(string), args...) - statement.cond = statement.cond.And(cond) - case builder.Cond: - cond := query.(builder.Cond) - statement.cond = statement.cond.And(cond) - for _, v := range args { - if vv, ok := v.(builder.Cond); ok { - statement.cond = statement.cond.And(vv) - } - } - default: - // TODO: not support condition type - } - - return statement -} - -// Or add Where & Or statement -func (statement *Statement) Or(query interface{}, args ...interface{}) *Statement { - switch query.(type) { - case string: - cond := builder.Expr(query.(string), args...) - statement.cond = statement.cond.Or(cond) - case builder.Cond: - cond := query.(builder.Cond) - statement.cond = statement.cond.Or(cond) - for _, v := range args { - if vv, ok := v.(builder.Cond); ok { - statement.cond = statement.cond.Or(vv) - } - } - default: - // TODO: not support condition type - } - return statement -} - -// In generate "Where column IN (?) " statement -func (statement *Statement) In(column string, args ...interface{}) *Statement { - if len(args) == 0 { - return statement - } - - in := builder.In(column, args...) - statement.cond = statement.cond.And(in) - return statement -} - -// NotIn generate "Where column NOT IN (?) " statement -func (statement *Statement) NotIn(column string, args ...interface{}) *Statement { - if len(args) == 0 { - return statement - } - - in := builder.NotIn(column, args...) - statement.cond = statement.cond.And(in) - return statement -} - -func (statement *Statement) setRefValue(v reflect.Value) { - statement.RefTable = statement.Engine.autoMapType(reflect.Indirect(v)) - statement.tableName = statement.Engine.tbName(v) -} - -// Table tempororily set table name, the parameter could be a string or a pointer of struct -func (statement *Statement) Table(tableNameOrBean interface{}) *Statement { - v := rValue(tableNameOrBean) - t := v.Type() - if t.Kind() == reflect.String { - statement.AltTableName = tableNameOrBean.(string) - } else if t.Kind() == reflect.Struct { - statement.RefTable = statement.Engine.autoMapType(v) - statement.AltTableName = statement.Engine.tbName(v) - } - return statement -} - -// Auto generating update columnes and values according a struct -func buildUpdates(engine *Engine, table *core.Table, bean interface{}, - includeVersion bool, includeUpdated bool, includeNil bool, - includeAutoIncr bool, allUseBool bool, useAllCols bool, - mustColumnMap map[string]bool, nullableMap map[string]bool, - columnMap map[string]bool, update, unscoped bool) ([]string, []interface{}) { - - var colNames = make([]string, 0) - var args = make([]interface{}, 0) - for _, col := range table.Columns() { - if !includeVersion && col.IsVersion { - continue - } - if col.IsCreated { - continue - } - if !includeUpdated && col.IsUpdated { - continue - } - if !includeAutoIncr && col.IsAutoIncrement { - continue - } - if col.IsDeleted && !unscoped { - continue - } - if use, ok := columnMap[strings.ToLower(col.Name)]; ok && !use { - continue - } - - fieldValuePtr, err := col.ValueOf(bean) - if err != nil { - engine.logger.Error(err) - continue - } - - fieldValue := *fieldValuePtr - fieldType := reflect.TypeOf(fieldValue.Interface()) - - requiredField := useAllCols - includeNil := useAllCols - - if b, ok := getFlagForColumn(mustColumnMap, col); ok { - if b { - requiredField = true - } else { - continue - } - } - - // !evalphobia! set fieldValue as nil when column is nullable and zero-value - if b, ok := getFlagForColumn(nullableMap, col); ok { - if b && col.Nullable && isZero(fieldValue.Interface()) { - var nilValue *int - fieldValue = reflect.ValueOf(nilValue) - fieldType = reflect.TypeOf(fieldValue.Interface()) - includeNil = true - } - } - - var val interface{} - - if fieldValue.CanAddr() { - if structConvert, ok := fieldValue.Addr().Interface().(core.Conversion); ok { - data, err := structConvert.ToDB() - if err != nil { - engine.logger.Error(err) - } else { - val = data - } - goto APPEND - } - } - - if structConvert, ok := fieldValue.Interface().(core.Conversion); ok { - data, err := structConvert.ToDB() - if err != nil { - engine.logger.Error(err) - } else { - val = data - } - goto APPEND - } - - if fieldType.Kind() == reflect.Ptr { - if fieldValue.IsNil() { - if includeNil { - args = append(args, nil) - colNames = append(colNames, fmt.Sprintf("%v=?", engine.Quote(col.Name))) - } - continue - } else if !fieldValue.IsValid() { - continue - } else { - // dereference ptr type to instance type - fieldValue = fieldValue.Elem() - fieldType = reflect.TypeOf(fieldValue.Interface()) - requiredField = true - } - } - - switch fieldType.Kind() { - case reflect.Bool: - if allUseBool || requiredField { - val = fieldValue.Interface() - } else { - // if a bool in a struct, it will not be as a condition because it default is false, - // please use Where() instead - continue - } - case reflect.String: - if !requiredField && fieldValue.String() == "" { - continue - } - // for MyString, should convert to string or panic - if fieldType.String() != reflect.String.String() { - val = fieldValue.String() - } else { - val = fieldValue.Interface() - } - case reflect.Int8, reflect.Int16, reflect.Int, reflect.Int32, reflect.Int64: - if !requiredField && fieldValue.Int() == 0 { - continue - } - val = fieldValue.Interface() - case reflect.Float32, reflect.Float64: - if !requiredField && fieldValue.Float() == 0.0 { - continue - } - val = fieldValue.Interface() - case reflect.Uint8, reflect.Uint16, reflect.Uint, reflect.Uint32, reflect.Uint64: - if !requiredField && fieldValue.Uint() == 0 { - continue - } - t := int64(fieldValue.Uint()) - val = reflect.ValueOf(&t).Interface() - case reflect.Struct: - if fieldType.ConvertibleTo(core.TimeType) { - t := fieldValue.Convert(core.TimeType).Interface().(time.Time) - if !requiredField && (t.IsZero() || !fieldValue.IsValid()) { - continue - } - val = engine.FormatTime(col.SQLType.Name, t) - } else if nulType, ok := fieldValue.Interface().(driver.Valuer); ok { - val, _ = nulType.Value() - } else { - if !col.SQLType.IsJson() { - engine.autoMapType(fieldValue) - if table, ok := engine.Tables[fieldValue.Type()]; ok { - if len(table.PrimaryKeys) == 1 { - pkField := reflect.Indirect(fieldValue).FieldByName(table.PKColumns()[0].FieldName) - // fix non-int pk issues - if pkField.IsValid() && (!requiredField && !isZero(pkField.Interface())) { - val = pkField.Interface() - } else { - continue - } - } else { - //TODO: how to handler? - panic("not supported") - } - } else { - val = fieldValue.Interface() - } - } else { - // Blank struct could not be as update data - if requiredField || !isStructZero(fieldValue) { - bytes, err := json.Marshal(fieldValue.Interface()) - if err != nil { - panic(fmt.Sprintf("mashal %v failed", fieldValue.Interface())) - } - if col.SQLType.IsText() { - val = string(bytes) - } else if col.SQLType.IsBlob() { - val = bytes - } - } else { - continue - } - } - } - case reflect.Array, reflect.Slice, reflect.Map: - if !requiredField { - if fieldValue == reflect.Zero(fieldType) { - continue - } - if fieldValue.IsNil() || !fieldValue.IsValid() || fieldValue.Len() == 0 { - continue - } - } - - if col.SQLType.IsText() { - bytes, err := json.Marshal(fieldValue.Interface()) - if err != nil { - engine.logger.Error(err) - continue - } - val = string(bytes) - } else if col.SQLType.IsBlob() { - var bytes []byte - var err error - if (fieldType.Kind() == reflect.Array || fieldType.Kind() == reflect.Slice) && - fieldType.Elem().Kind() == reflect.Uint8 { - if fieldValue.Len() > 0 { - val = fieldValue.Bytes() - } else { - continue - } - } else { - bytes, err = json.Marshal(fieldValue.Interface()) - if err != nil { - engine.logger.Error(err) - continue - } - val = bytes - } - } else { - continue - } - default: - val = fieldValue.Interface() - } - - APPEND: - args = append(args, val) - if col.IsPrimaryKey && engine.dialect.DBType() == "ql" { - continue - } - colNames = append(colNames, fmt.Sprintf("%v = ?", engine.Quote(col.Name))) - } - - return colNames, args -} - -func (statement *Statement) needTableName() bool { - return len(statement.JoinStr) > 0 -} - -func (statement *Statement) colName(col *core.Column, tableName string) string { - if statement.needTableName() { - var nm = tableName - if len(statement.TableAlias) > 0 { - nm = statement.TableAlias - } - return statement.Engine.Quote(nm) + "." + statement.Engine.Quote(col.Name) - } - return statement.Engine.Quote(col.Name) -} - -func buildConds(engine *Engine, table *core.Table, bean interface{}, - includeVersion bool, includeUpdated bool, includeNil bool, - includeAutoIncr bool, allUseBool bool, useAllCols bool, unscoped bool, - mustColumnMap map[string]bool, tableName, aliasName string, addedTableName bool) (builder.Cond, error) { - var conds []builder.Cond - for _, col := range table.Columns() { - if !includeVersion && col.IsVersion { - continue - } - if !includeUpdated && col.IsUpdated { - continue - } - if !includeAutoIncr && col.IsAutoIncrement { - continue - } - - if engine.dialect.DBType() == core.MSSQL && (col.SQLType.Name == core.Text || col.SQLType.IsBlob() || col.SQLType.Name == core.TimeStampz) { - continue - } - if col.SQLType.IsJson() { - continue - } - - var colName string - if addedTableName { - var nm = tableName - if len(aliasName) > 0 { - nm = aliasName - } - colName = engine.Quote(nm) + "." + engine.Quote(col.Name) - } else { - colName = engine.Quote(col.Name) - } - - fieldValuePtr, err := col.ValueOf(bean) - if err != nil { - engine.logger.Error(err) - continue - } - - if col.IsDeleted && !unscoped { // tag "deleted" is enabled - if engine.dialect.DBType() == core.MSSQL { - conds = append(conds, builder.IsNull{colName}) - } else { - conds = append(conds, builder.IsNull{colName}.Or(builder.Eq{colName: "0001-01-01 00:00:00"})) - } - } - - fieldValue := *fieldValuePtr - if fieldValue.Interface() == nil { - continue - } - - fieldType := reflect.TypeOf(fieldValue.Interface()) - requiredField := useAllCols - - if b, ok := getFlagForColumn(mustColumnMap, col); ok { - if b { - requiredField = true - } else { - continue - } - } - - if fieldType.Kind() == reflect.Ptr { - if fieldValue.IsNil() { - if includeNil { - conds = append(conds, builder.Eq{colName: nil}) - } - continue - } else if !fieldValue.IsValid() { - continue - } else { - // dereference ptr type to instance type - fieldValue = fieldValue.Elem() - fieldType = reflect.TypeOf(fieldValue.Interface()) - requiredField = true - } - } - - var val interface{} - switch fieldType.Kind() { - case reflect.Bool: - if allUseBool || requiredField { - val = fieldValue.Interface() - } else { - // if a bool in a struct, it will not be as a condition because it default is false, - // please use Where() instead - continue - } - case reflect.String: - if !requiredField && fieldValue.String() == "" { - continue - } - // for MyString, should convert to string or panic - if fieldType.String() != reflect.String.String() { - val = fieldValue.String() - } else { - val = fieldValue.Interface() - } - case reflect.Int8, reflect.Int16, reflect.Int, reflect.Int32, reflect.Int64: - if !requiredField && fieldValue.Int() == 0 { - continue - } - val = fieldValue.Interface() - case reflect.Float32, reflect.Float64: - if !requiredField && fieldValue.Float() == 0.0 { - continue - } - val = fieldValue.Interface() - case reflect.Uint8, reflect.Uint16, reflect.Uint, reflect.Uint32, reflect.Uint64: - if !requiredField && fieldValue.Uint() == 0 { - continue - } - t := int64(fieldValue.Uint()) - val = reflect.ValueOf(&t).Interface() - case reflect.Struct: - if fieldType.ConvertibleTo(core.TimeType) { - t := fieldValue.Convert(core.TimeType).Interface().(time.Time) - if !requiredField && (t.IsZero() || !fieldValue.IsValid()) { - continue - } - val = engine.FormatTime(col.SQLType.Name, t) - } else if _, ok := reflect.New(fieldType).Interface().(core.Conversion); ok { - continue - } else if valNul, ok := fieldValue.Interface().(driver.Valuer); ok { - val, _ = valNul.Value() - if val == nil { - continue - } - } else { - if col.SQLType.IsJson() { - if col.SQLType.IsText() { - bytes, err := json.Marshal(fieldValue.Interface()) - if err != nil { - engine.logger.Error(err) - continue - } - val = string(bytes) - } else if col.SQLType.IsBlob() { - var bytes []byte - var err error - bytes, err = json.Marshal(fieldValue.Interface()) - if err != nil { - engine.logger.Error(err) - continue - } - val = bytes - } - } else { - engine.autoMapType(fieldValue) - if table, ok := engine.Tables[fieldValue.Type()]; ok { - if len(table.PrimaryKeys) == 1 { - pkField := reflect.Indirect(fieldValue).FieldByName(table.PKColumns()[0].FieldName) - // fix non-int pk issues - //if pkField.Int() != 0 { - if pkField.IsValid() && !isZero(pkField.Interface()) { - val = pkField.Interface() - } else { - continue - } - } else { - //TODO: how to handler? - panic(fmt.Sprintln("not supported", fieldValue.Interface(), "as", table.PrimaryKeys)) - } - } else { - val = fieldValue.Interface() - } - } - } - case reflect.Array, reflect.Slice, reflect.Map: - if fieldValue == reflect.Zero(fieldType) { - continue - } - if fieldValue.IsNil() || !fieldValue.IsValid() || fieldValue.Len() == 0 { - continue - } - - if col.SQLType.IsText() { - bytes, err := json.Marshal(fieldValue.Interface()) - if err != nil { - engine.logger.Error(err) - continue - } - val = string(bytes) - } else if col.SQLType.IsBlob() { - var bytes []byte - var err error - if (fieldType.Kind() == reflect.Array || fieldType.Kind() == reflect.Slice) && - fieldType.Elem().Kind() == reflect.Uint8 { - if fieldValue.Len() > 0 { - val = fieldValue.Bytes() - } else { - continue - } - } else { - bytes, err = json.Marshal(fieldValue.Interface()) - if err != nil { - engine.logger.Error(err) - continue - } - val = bytes - } - } else { - continue - } - default: - val = fieldValue.Interface() - } - - conds = append(conds, builder.Eq{colName: val}) - } - - return builder.And(conds...), nil -} - -// TableName return current tableName -func (statement *Statement) TableName() string { - if statement.AltTableName != "" { - return statement.AltTableName - } - - return statement.tableName -} - -// Id generate "where id = ? " statement or for composite key "where key1 = ? and key2 = ?" -// -// Deprecated: use ID instead -func (statement *Statement) Id(id interface{}) *Statement { - return statement.ID(id) -} - -// ID generate "where id = ? " statement or for composite key "where key1 = ? and key2 = ?" -func (statement *Statement) ID(id interface{}) *Statement { - idValue := reflect.ValueOf(id) - idType := reflect.TypeOf(idValue.Interface()) - - switch idType { - case ptrPkType: - if pkPtr, ok := (id).(*core.PK); ok { - statement.IdParam = pkPtr - return statement - } - case pkType: - if pk, ok := (id).(core.PK); ok { - statement.IdParam = &pk - return statement - } - } - - switch idType.Kind() { - case reflect.String: - statement.IdParam = &core.PK{idValue.Convert(reflect.TypeOf("")).Interface()} - return statement - } - - statement.IdParam = &core.PK{id} - return statement -} - -// Incr Generate "Update ... Set column = column + arg" statement -func (statement *Statement) Incr(column string, arg ...interface{}) *Statement { - k := strings.ToLower(column) - if len(arg) > 0 { - statement.incrColumns[k] = incrParam{column, arg[0]} - } else { - statement.incrColumns[k] = incrParam{column, 1} - } - return statement -} - -// Decr Generate "Update ... Set column = column - arg" statement -func (statement *Statement) Decr(column string, arg ...interface{}) *Statement { - k := strings.ToLower(column) - if len(arg) > 0 { - statement.decrColumns[k] = decrParam{column, arg[0]} - } else { - statement.decrColumns[k] = decrParam{column, 1} - } - return statement -} - -// SetExpr Generate "Update ... Set column = {expression}" statement -func (statement *Statement) SetExpr(column string, expression string) *Statement { - k := strings.ToLower(column) - statement.exprColumns[k] = exprParam{column, expression} - return statement -} - -// Generate "Update ... Set column = column + arg" statement -func (statement *Statement) getInc() map[string]incrParam { - return statement.incrColumns -} - -// Generate "Update ... Set column = column - arg" statement -func (statement *Statement) getDec() map[string]decrParam { - return statement.decrColumns -} - -// Generate "Update ... Set column = {expression}" statement -func (statement *Statement) getExpr() map[string]exprParam { - return statement.exprColumns -} - -func (statement *Statement) col2NewColsWithQuote(columns ...string) []string { - newColumns := make([]string, 0) - for _, col := range columns { - col = strings.Replace(col, "`", "", -1) - col = strings.Replace(col, statement.Engine.QuoteStr(), "", -1) - ccols := strings.Split(col, ",") - for _, c := range ccols { - fields := strings.Split(strings.TrimSpace(c), ".") - if len(fields) == 1 { - newColumns = append(newColumns, statement.Engine.quote(fields[0])) - } else if len(fields) == 2 { - newColumns = append(newColumns, statement.Engine.quote(fields[0])+"."+ - statement.Engine.quote(fields[1])) - } else { - panic(errors.New("unwanted colnames")) - } - } - } - return newColumns -} - -// Distinct generates "DISTINCT col1, col2 " statement -func (statement *Statement) Distinct(columns ...string) *Statement { - statement.IsDistinct = true - statement.Cols(columns...) - return statement -} - -// ForUpdate generates "SELECT ... FOR UPDATE" statement -func (statement *Statement) ForUpdate() *Statement { - statement.IsForUpdate = true - return statement -} - -// Select replace select -func (statement *Statement) Select(str string) *Statement { - statement.selectStr = str - return statement -} - -// Cols generate "col1, col2" statement -func (statement *Statement) Cols(columns ...string) *Statement { - cols := col2NewCols(columns...) - for _, nc := range cols { - statement.columnMap[strings.ToLower(nc)] = true - } - - newColumns := statement.col2NewColsWithQuote(columns...) - statement.ColumnStr = strings.Join(newColumns, ", ") - statement.ColumnStr = strings.Replace(statement.ColumnStr, statement.Engine.quote("*"), "*", -1) - return statement -} - -// AllCols update use only: update all columns -func (statement *Statement) AllCols() *Statement { - statement.useAllCols = true - return statement -} - -// MustCols update use only: must update columns -func (statement *Statement) MustCols(columns ...string) *Statement { - newColumns := col2NewCols(columns...) - for _, nc := range newColumns { - statement.mustColumnMap[strings.ToLower(nc)] = true - } - return statement -} - -// UseBool indicates that use bool fields as update contents and query contiditions -func (statement *Statement) UseBool(columns ...string) *Statement { - if len(columns) > 0 { - statement.MustCols(columns...) - } else { - statement.allUseBool = true - } - return statement -} - -// Omit do not use the columns -func (statement *Statement) Omit(columns ...string) { - newColumns := col2NewCols(columns...) - for _, nc := range newColumns { - statement.columnMap[strings.ToLower(nc)] = false - } - statement.OmitStr = statement.Engine.Quote(strings.Join(newColumns, statement.Engine.Quote(", "))) -} - -// Nullable Update use only: update columns to null when value is nullable and zero-value -func (statement *Statement) Nullable(columns ...string) { - newColumns := col2NewCols(columns...) - for _, nc := range newColumns { - statement.nullableMap[strings.ToLower(nc)] = true - } -} - -// Top generate LIMIT limit statement -func (statement *Statement) Top(limit int) *Statement { - statement.Limit(limit) - return statement -} - -// Limit generate LIMIT start, limit statement -func (statement *Statement) Limit(limit int, start ...int) *Statement { - statement.LimitN = limit - if len(start) > 0 { - statement.Start = start[0] - } - return statement -} - -// OrderBy generate "Order By order" statement -func (statement *Statement) OrderBy(order string) *Statement { - if len(statement.OrderStr) > 0 { - statement.OrderStr += ", " - } - statement.OrderStr += order - return statement -} - -// Desc generate `ORDER BY xx DESC` -func (statement *Statement) Desc(colNames ...string) *Statement { - var buf bytes.Buffer - fmt.Fprintf(&buf, statement.OrderStr) - if len(statement.OrderStr) > 0 { - fmt.Fprint(&buf, ", ") - } - newColNames := statement.col2NewColsWithQuote(colNames...) - fmt.Fprintf(&buf, "%v DESC", strings.Join(newColNames, " DESC, ")) - statement.OrderStr = buf.String() - return statement -} - -// Asc provide asc order by query condition, the input parameters are columns. -func (statement *Statement) Asc(colNames ...string) *Statement { - var buf bytes.Buffer - fmt.Fprintf(&buf, statement.OrderStr) - if len(statement.OrderStr) > 0 { - fmt.Fprint(&buf, ", ") - } - newColNames := statement.col2NewColsWithQuote(colNames...) - fmt.Fprintf(&buf, "%v ASC", strings.Join(newColNames, " ASC, ")) - statement.OrderStr = buf.String() - return statement -} - -// Join The joinOP should be one of INNER, LEFT OUTER, CROSS etc - this will be prepended to JOIN -func (statement *Statement) Join(joinOP string, tablename interface{}, condition string, args ...interface{}) *Statement { - var buf bytes.Buffer - if len(statement.JoinStr) > 0 { - fmt.Fprintf(&buf, "%v %v JOIN ", statement.JoinStr, joinOP) - } else { - fmt.Fprintf(&buf, "%v JOIN ", joinOP) - } - - switch tablename.(type) { - case []string: - t := tablename.([]string) - if len(t) > 1 { - fmt.Fprintf(&buf, "%v AS %v", statement.Engine.Quote(t[0]), statement.Engine.Quote(t[1])) - } else if len(t) == 1 { - fmt.Fprintf(&buf, statement.Engine.Quote(t[0])) - } - case []interface{}: - t := tablename.([]interface{}) - l := len(t) - var table string - if l > 0 { - f := t[0] - v := rValue(f) - t := v.Type() - if t.Kind() == reflect.String { - table = f.(string) - } else if t.Kind() == reflect.Struct { - table = statement.Engine.tbName(v) - } - } - if l > 1 { - fmt.Fprintf(&buf, "%v AS %v", statement.Engine.Quote(table), - statement.Engine.Quote(fmt.Sprintf("%v", t[1]))) - } else if l == 1 { - fmt.Fprintf(&buf, statement.Engine.Quote(table)) - } - default: - fmt.Fprintf(&buf, statement.Engine.Quote(fmt.Sprintf("%v", tablename))) - } - - fmt.Fprintf(&buf, " ON %v", condition) - statement.JoinStr = buf.String() - statement.joinArgs = append(statement.joinArgs, args...) - return statement -} - -// GroupBy generate "Group By keys" statement -func (statement *Statement) GroupBy(keys string) *Statement { - statement.GroupByStr = keys - return statement -} - -// Having generate "Having conditions" statement -func (statement *Statement) Having(conditions string) *Statement { - statement.HavingStr = fmt.Sprintf("HAVING %v", conditions) - return statement -} - -// Unscoped always disable struct tag "deleted" -func (statement *Statement) Unscoped() *Statement { - statement.unscoped = true - return statement -} - -func (statement *Statement) genColumnStr() string { - var buf bytes.Buffer - if statement.RefTable == nil { - return "" - } - - columns := statement.RefTable.Columns() - - for _, col := range columns { - if statement.OmitStr != "" { - if _, ok := getFlagForColumn(statement.columnMap, col); ok { - continue - } - } - - if col.MapType == core.ONLYTODB { - continue - } - - if buf.Len() != 0 { - buf.WriteString(", ") - } - - if col.IsPrimaryKey && statement.Engine.Dialect().DBType() == "ql" { - buf.WriteString("id() AS ") - } - - if statement.JoinStr != "" { - if statement.TableAlias != "" { - buf.WriteString(statement.TableAlias) - } else { - buf.WriteString(statement.TableName()) - } - - buf.WriteString(".") - } - - statement.Engine.QuoteTo(&buf, col.Name) - } - - return buf.String() -} - -func (statement *Statement) genCreateTableSQL() string { - return statement.Engine.dialect.CreateTableSql(statement.RefTable, statement.TableName(), - statement.StoreEngine, statement.Charset) -} - -func (statement *Statement) genIndexSQL() []string { - var sqls []string - tbName := statement.TableName() - quote := statement.Engine.Quote - for idxName, index := range statement.RefTable.Indexes { - if index.Type == core.IndexType { - sql := fmt.Sprintf("CREATE INDEX %v ON %v (%v);", quote(indexName(tbName, idxName)), - quote(tbName), quote(strings.Join(index.Cols, quote(",")))) - sqls = append(sqls, sql) - } - } - return sqls -} - -func uniqueName(tableName, uqeName string) string { - return fmt.Sprintf("UQE_%v_%v", tableName, uqeName) -} - -func (statement *Statement) genUniqueSQL() []string { - var sqls []string - tbName := statement.TableName() - for _, index := range statement.RefTable.Indexes { - if index.Type == core.UniqueType { - sql := statement.Engine.dialect.CreateIndexSql(tbName, index) - sqls = append(sqls, sql) - } - } - return sqls -} - -func (statement *Statement) genDelIndexSQL() []string { - var sqls []string - tbName := statement.TableName() - for idxName, index := range statement.RefTable.Indexes { - var rIdxName string - if index.Type == core.UniqueType { - rIdxName = uniqueName(tbName, idxName) - } else if index.Type == core.IndexType { - rIdxName = indexName(tbName, idxName) - } - sql := fmt.Sprintf("DROP INDEX %v", statement.Engine.Quote(rIdxName)) - if statement.Engine.dialect.IndexOnTable() { - sql += fmt.Sprintf(" ON %v", statement.Engine.Quote(statement.TableName())) - } - sqls = append(sqls, sql) - } - return sqls -} - -func (statement *Statement) genAddColumnStr(col *core.Column) (string, []interface{}) { - quote := statement.Engine.Quote - sql := fmt.Sprintf("ALTER TABLE %v ADD %v;", quote(statement.TableName()), - col.String(statement.Engine.dialect)) - return sql, []interface{}{} -} - -func (statement *Statement) buildConds(table *core.Table, bean interface{}, includeVersion bool, includeUpdated bool, includeNil bool, includeAutoIncr bool, addedTableName bool) (builder.Cond, error) { - return buildConds(statement.Engine, table, bean, includeVersion, includeUpdated, includeNil, includeAutoIncr, statement.allUseBool, statement.useAllCols, - statement.unscoped, statement.mustColumnMap, statement.TableName(), statement.TableAlias, addedTableName) -} - -func (statement *Statement) genConds(bean interface{}) (string, []interface{}, error) { - if !statement.noAutoCondition { - var addedTableName = (len(statement.JoinStr) > 0) - autoCond, err := statement.buildConds(statement.RefTable, bean, true, true, false, true, addedTableName) - if err != nil { - return "", nil, err - } - statement.cond = statement.cond.And(autoCond) - } - - statement.processIDParam() - - return builder.ToSQL(statement.cond) -} - -func (statement *Statement) genGetSQL(bean interface{}) (string, []interface{}) { - statement.setRefValue(rValue(bean)) - - var columnStr = statement.ColumnStr - if len(statement.selectStr) > 0 { - columnStr = statement.selectStr - } else { - // TODO: always generate column names, not use * even if join - if len(statement.JoinStr) == 0 { - if len(columnStr) == 0 { - if len(statement.GroupByStr) > 0 { - columnStr = statement.Engine.Quote(strings.Replace(statement.GroupByStr, ",", statement.Engine.Quote(","), -1)) - } else { - columnStr = statement.genColumnStr() - } - } - } else { - if len(columnStr) == 0 { - if len(statement.GroupByStr) > 0 { - columnStr = statement.Engine.Quote(strings.Replace(statement.GroupByStr, ",", statement.Engine.Quote(","), -1)) - } else { - columnStr = "*" - } - } - } - } - - condSQL, condArgs, _ := statement.genConds(bean) - - return statement.genSelectSQL(columnStr, condSQL), append(statement.joinArgs, condArgs...) -} - -func (statement *Statement) genCountSQL(bean interface{}) (string, []interface{}) { - statement.setRefValue(rValue(bean)) - - condSQL, condArgs, _ := statement.genConds(bean) - - var selectSQL = statement.selectStr - if len(selectSQL) <= 0 { - if statement.IsDistinct { - selectSQL = fmt.Sprintf("count(DISTINCT %s)", statement.ColumnStr) - } else { - selectSQL = "count(*)" - } - } - return statement.genSelectSQL(selectSQL, condSQL), append(statement.joinArgs, condArgs...) -} - -func (statement *Statement) genSumSQL(bean interface{}, columns ...string) (string, []interface{}) { - statement.setRefValue(rValue(bean)) - - var sumStrs = make([]string, 0, len(columns)) - for _, colName := range columns { - sumStrs = append(sumStrs, fmt.Sprintf("COALESCE(sum(%s),0)", colName)) - } - - condSQL, condArgs, _ := statement.genConds(bean) - - return statement.genSelectSQL(strings.Join(sumStrs, ", "), condSQL), append(statement.joinArgs, condArgs...) -} - -func (statement *Statement) genSelectSQL(columnStr, condSQL string) (a string) { - var distinct string - if statement.IsDistinct { - distinct = "DISTINCT " - } - - var dialect = statement.Engine.Dialect() - var quote = statement.Engine.Quote - var top string - var mssqlCondi string - - statement.processIDParam() - - var buf bytes.Buffer - if len(condSQL) > 0 { - fmt.Fprintf(&buf, " WHERE %v", condSQL) - } - var whereStr = buf.String() - - var fromStr = " FROM " + quote(statement.TableName()) - if statement.TableAlias != "" { - if dialect.DBType() == core.ORACLE { - fromStr += " " + quote(statement.TableAlias) - } else { - fromStr += " AS " + quote(statement.TableAlias) - } - } - if statement.JoinStr != "" { - fromStr = fmt.Sprintf("%v %v", fromStr, statement.JoinStr) - } - - if dialect.DBType() == core.MSSQL { - if statement.LimitN > 0 { - top = fmt.Sprintf(" TOP %d ", statement.LimitN) - } - if statement.Start > 0 { - var column string - if len(statement.RefTable.PKColumns()) == 0 { - for _, index := range statement.RefTable.Indexes { - if len(index.Cols) == 1 { - column = index.Cols[0] - break - } - } - if len(column) == 0 { - column = statement.RefTable.ColumnsSeq()[0] - } - } else { - column = statement.RefTable.PKColumns()[0].Name - } - if statement.needTableName() { - if len(statement.TableAlias) > 0 { - column = statement.TableAlias + "." + column - } else { - column = statement.TableName() + "." + column - } - } - - var orderStr string - if len(statement.OrderStr) > 0 { - orderStr = " ORDER BY " + statement.OrderStr - } - var groupStr string - if len(statement.GroupByStr) > 0 { - groupStr = " GROUP BY " + statement.GroupByStr - } - mssqlCondi = fmt.Sprintf("(%s NOT IN (SELECT TOP %d %s%s%s%s%s))", - column, statement.Start, column, fromStr, whereStr, orderStr, groupStr) - } - } - - // !nashtsai! REVIEW Sprintf is considered slowest mean of string concatnation, better to work with builder pattern - a = fmt.Sprintf("SELECT %v%v%v%v%v", top, distinct, columnStr, fromStr, whereStr) - if len(mssqlCondi) > 0 { - if len(whereStr) > 0 { - a += " AND " + mssqlCondi - } else { - a += " WHERE " + mssqlCondi - } - } - - if statement.GroupByStr != "" { - a = fmt.Sprintf("%v GROUP BY %v", a, statement.GroupByStr) - } - if statement.HavingStr != "" { - a = fmt.Sprintf("%v %v", a, statement.HavingStr) - } - if statement.OrderStr != "" { - a = fmt.Sprintf("%v ORDER BY %v", a, statement.OrderStr) - } - if dialect.DBType() != core.MSSQL && dialect.DBType() != core.ORACLE { - if statement.Start > 0 { - a = fmt.Sprintf("%v LIMIT %v OFFSET %v", a, statement.LimitN, statement.Start) - } else if statement.LimitN > 0 { - a = fmt.Sprintf("%v LIMIT %v", a, statement.LimitN) - } - } else if dialect.DBType() == core.ORACLE { - if statement.Start != 0 || statement.LimitN != 0 { - a = fmt.Sprintf("SELECT %v FROM (SELECT %v,ROWNUM RN FROM (%v) at WHERE ROWNUM <= %d) aat WHERE RN > %d", columnStr, columnStr, a, statement.Start+statement.LimitN, statement.Start) - } - } - if statement.IsForUpdate { - a = dialect.ForUpdateSql(a) - } - - return -} - -func (statement *Statement) processIDParam() { - if statement.IdParam == nil { - return - } - - for i, col := range statement.RefTable.PKColumns() { - var colName = statement.colName(col, statement.TableName()) - if i < len(*(statement.IdParam)) { - statement.cond = statement.cond.And(builder.Eq{colName: (*(statement.IdParam))[i]}) - } else { - statement.cond = statement.cond.And(builder.Eq{colName: ""}) - } - } -} - -func (statement *Statement) joinColumns(cols []*core.Column, includeTableName bool) string { - var colnames = make([]string, len(cols)) - for i, col := range cols { - if includeTableName { - colnames[i] = statement.Engine.Quote(statement.TableName()) + - "." + statement.Engine.Quote(col.Name) - } else { - colnames[i] = statement.Engine.Quote(col.Name) - } - } - return strings.Join(colnames, ", ") -} - -func (statement *Statement) convertIDSQL(sqlStr string) string { - if statement.RefTable != nil { - cols := statement.RefTable.PKColumns() - if len(cols) == 0 { - return "" - } - - colstrs := statement.joinColumns(cols, false) - sqls := splitNNoCase(sqlStr, " from ", 2) - if len(sqls) != 2 { - return "" - } - - var top string - if statement.LimitN > 0 && statement.Engine.dialect.DBType() == core.MSSQL { - top = fmt.Sprintf("TOP %d ", statement.LimitN) - } - - return fmt.Sprintf("SELECT %s%s FROM %v", top, colstrs, sqls[1]) - } - return "" -} - -func (statement *Statement) convertUpdateSQL(sqlStr string) (string, string) { - if statement.RefTable == nil || len(statement.RefTable.PrimaryKeys) != 1 { - return "", "" - } - - colstrs := statement.joinColumns(statement.RefTable.PKColumns(), true) - sqls := splitNNoCase(sqlStr, "where", 2) - if len(sqls) != 2 { - if len(sqls) == 1 { - return sqls[0], fmt.Sprintf("SELECT %v FROM %v", - colstrs, statement.Engine.Quote(statement.TableName())) - } - return "", "" - } - - var whereStr = sqls[1] - - //TODO: for postgres only, if any other database? - var paraStr string - if statement.Engine.dialect.DBType() == core.POSTGRES { - paraStr = "$" - } else if statement.Engine.dialect.DBType() == core.MSSQL { - paraStr = ":" - } - - if paraStr != "" { - if strings.Contains(sqls[1], paraStr) { - dollers := strings.Split(sqls[1], paraStr) - whereStr = dollers[0] - for i, c := range dollers[1:] { - ccs := strings.SplitN(c, " ", 2) - whereStr += fmt.Sprintf(paraStr+"%v %v", i+1, ccs[1]) - } - } - } - - return sqls[0], fmt.Sprintf("SELECT %v FROM %v WHERE %v", - colstrs, statement.Engine.Quote(statement.TableName()), - whereStr) -} diff --git a/vendor/github.com/go-xorm/xorm/syslogger.go b/vendor/github.com/go-xorm/xorm/syslogger.go deleted file mode 100644 index 8840635d4..000000000 --- a/vendor/github.com/go-xorm/xorm/syslogger.go +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright 2015 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !windows,!nacl,!plan9 - -package xorm - -import ( - "fmt" - "log/syslog" - - "github.com/go-xorm/core" -) - -var _ core.ILogger = &SyslogLogger{} - -// SyslogLogger will be depricated -type SyslogLogger struct { - w *syslog.Writer - showSQL bool -} - -// NewSyslogLogger implements core.ILogger -func NewSyslogLogger(w *syslog.Writer) *SyslogLogger { - return &SyslogLogger{w: w} -} - -// Debug log content as Debug -func (s *SyslogLogger) Debug(v ...interface{}) { - s.w.Debug(fmt.Sprint(v...)) -} - -// Debugf log content as Debug and format -func (s *SyslogLogger) Debugf(format string, v ...interface{}) { - s.w.Debug(fmt.Sprintf(format, v...)) -} - -// Error log content as Error -func (s *SyslogLogger) Error(v ...interface{}) { - s.w.Err(fmt.Sprint(v...)) -} - -// Errorf log content as Errorf and format -func (s *SyslogLogger) Errorf(format string, v ...interface{}) { - s.w.Err(fmt.Sprintf(format, v...)) -} - -// Info log content as Info -func (s *SyslogLogger) Info(v ...interface{}) { - s.w.Info(fmt.Sprint(v...)) -} - -// Infof log content as Infof and format -func (s *SyslogLogger) Infof(format string, v ...interface{}) { - s.w.Info(fmt.Sprintf(format, v...)) -} - -// Warn log content as Warn -func (s *SyslogLogger) Warn(v ...interface{}) { - s.w.Warning(fmt.Sprint(v...)) -} - -// Warnf log content as Warnf and format -func (s *SyslogLogger) Warnf(format string, v ...interface{}) { - s.w.Warning(fmt.Sprintf(format, v...)) -} - -// Level shows log level -func (s *SyslogLogger) Level() core.LogLevel { - return core.LOG_UNKNOWN -} - -// SetLevel always return error, as current log/syslog package doesn't allow to set priority level after syslog.Writer created -func (s *SyslogLogger) SetLevel(l core.LogLevel) {} - -// ShowSQL set if logging SQL -func (s *SyslogLogger) ShowSQL(show ...bool) { - if len(show) == 0 { - s.showSQL = true - return - } - s.showSQL = show[0] -} - -// IsShowSQL if logging SQL -func (s *SyslogLogger) IsShowSQL() bool { - return s.showSQL -} diff --git a/vendor/github.com/go-xorm/xorm/types.go b/vendor/github.com/go-xorm/xorm/types.go deleted file mode 100644 index 99d761c27..000000000 --- a/vendor/github.com/go-xorm/xorm/types.go +++ /dev/null @@ -1,12 +0,0 @@ -package xorm - -import ( - "reflect" - - "github.com/go-xorm/core" -) - -var ( - ptrPkType = reflect.TypeOf(&core.PK{}) - pkType = reflect.TypeOf(core.PK{}) -) diff --git a/vendor/github.com/go-xorm/xorm/xorm.go b/vendor/github.com/go-xorm/xorm/xorm.go deleted file mode 100644 index 6414d8a26..000000000 --- a/vendor/github.com/go-xorm/xorm/xorm.go +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright 2015 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xorm - -import ( - "fmt" - "os" - "reflect" - "runtime" - "sync" - "time" - - "github.com/go-xorm/core" -) - -const ( - // Version show the xorm's version - Version string = "0.6.0.1022" -) - -func regDrvsNDialects() bool { - providedDrvsNDialects := map[string]struct { - dbType core.DbType - getDriver func() core.Driver - getDialect func() core.Dialect - }{ - "mssql": {"mssql", func() core.Driver { return &odbcDriver{} }, func() core.Dialect { return &mssql{} }}, - "odbc": {"mssql", func() core.Driver { return &odbcDriver{} }, func() core.Dialect { return &mssql{} }}, // !nashtsai! TODO change this when supporting MS Access - "mysql": {"mysql", func() core.Driver { return &mysqlDriver{} }, func() core.Dialect { return &mysql{} }}, - "mymysql": {"mysql", func() core.Driver { return &mymysqlDriver{} }, func() core.Dialect { return &mysql{} }}, - "postgres": {"postgres", func() core.Driver { return &pqDriver{} }, func() core.Dialect { return &postgres{} }}, - "pgx": {"postgres", func() core.Driver { return &pqDriver{} }, func() core.Dialect { return &postgres{} }}, - "sqlite3": {"sqlite3", func() core.Driver { return &sqlite3Driver{} }, func() core.Dialect { return &sqlite3{} }}, - "oci8": {"oracle", func() core.Driver { return &oci8Driver{} }, func() core.Dialect { return &oracle{} }}, - "goracle": {"oracle", func() core.Driver { return &goracleDriver{} }, func() core.Dialect { return &oracle{} }}, - } - - for driverName, v := range providedDrvsNDialects { - if driver := core.QueryDriver(driverName); driver == nil { - core.RegisterDriver(driverName, v.getDriver()) - core.RegisterDialect(v.dbType, v.getDialect) - } - } - return true -} - -func close(engine *Engine) { - engine.Close() -} - -// NewEngine new a db manager according to the parameter. Currently support four -// drivers -func NewEngine(driverName string, dataSourceName string) (*Engine, error) { - regDrvsNDialects() - driver := core.QueryDriver(driverName) - if driver == nil { - return nil, fmt.Errorf("Unsupported driver name: %v", driverName) - } - - uri, err := driver.Parse(driverName, dataSourceName) - if err != nil { - return nil, err - } - - dialect := core.QueryDialect(uri.DbType) - if dialect == nil { - return nil, fmt.Errorf("Unsupported dialect type: %v", uri.DbType) - } - - db, err := core.Open(driverName, dataSourceName) - if err != nil { - return nil, err - } - - err = dialect.Init(db, uri, driverName, dataSourceName) - if err != nil { - return nil, err - } - - engine := &Engine{ - db: db, - dialect: dialect, - Tables: make(map[reflect.Type]*core.Table), - mutex: &sync.RWMutex{}, - TagIdentifier: "xorm", - TZLocation: time.Local, - } - - logger := NewSimpleLogger(os.Stdout) - logger.SetLevel(core.LOG_INFO) - engine.SetLogger(logger) - engine.SetMapper(core.NewCacheMapper(new(core.SnakeMapper))) - - runtime.SetFinalizer(engine, close) - - return engine, nil -} - -// Clone clone an engine -func (engine *Engine) Clone() (*Engine, error) { - return NewEngine(engine.DriverName(), engine.DataSourceName()) -} diff --git a/vendor/github.com/golang/protobuf/LICENSE b/vendor/github.com/golang/protobuf/LICENSE deleted file mode 100644 index 1b1b1921e..000000000 --- a/vendor/github.com/golang/protobuf/LICENSE +++ /dev/null @@ -1,31 +0,0 @@ -Go support for Protocol Buffers - Google's data interchange format - -Copyright 2010 The Go Authors. All rights reserved. -https://github.com/golang/protobuf - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * 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. - * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT -OWNER 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. - diff --git a/vendor/github.com/golang/protobuf/proto/Makefile b/vendor/github.com/golang/protobuf/proto/Makefile deleted file mode 100644 index e2e0651a9..000000000 --- a/vendor/github.com/golang/protobuf/proto/Makefile +++ /dev/null @@ -1,43 +0,0 @@ -# Go support for Protocol Buffers - Google's data interchange format -# -# Copyright 2010 The Go Authors. All rights reserved. -# https://github.com/golang/protobuf -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * 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. -# * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT -# OWNER 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. - -install: - go install - -test: install generate-test-pbs - go test - - -generate-test-pbs: - make install - make -C testdata - protoc --go_out=Mtestdata/test.proto=github.com/golang/protobuf/proto/testdata,Mgoogle/protobuf/any.proto=github.com/golang/protobuf/ptypes/any:. proto3_proto/proto3.proto - make diff --git a/vendor/github.com/golang/protobuf/proto/clone.go b/vendor/github.com/golang/protobuf/proto/clone.go deleted file mode 100644 index e392575b3..000000000 --- a/vendor/github.com/golang/protobuf/proto/clone.go +++ /dev/null @@ -1,229 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2011 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT -// OWNER 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. - -// Protocol buffer deep copy and merge. -// TODO: RawMessage. - -package proto - -import ( - "log" - "reflect" - "strings" -) - -// Clone returns a deep copy of a protocol buffer. -func Clone(pb Message) Message { - in := reflect.ValueOf(pb) - if in.IsNil() { - return pb - } - - out := reflect.New(in.Type().Elem()) - // out is empty so a merge is a deep copy. - mergeStruct(out.Elem(), in.Elem()) - return out.Interface().(Message) -} - -// Merge merges src into dst. -// Required and optional fields that are set in src will be set to that value in dst. -// Elements of repeated fields will be appended. -// Merge panics if src and dst are not the same type, or if dst is nil. -func Merge(dst, src Message) { - in := reflect.ValueOf(src) - out := reflect.ValueOf(dst) - if out.IsNil() { - panic("proto: nil destination") - } - if in.Type() != out.Type() { - // Explicit test prior to mergeStruct so that mistyped nils will fail - panic("proto: type mismatch") - } - if in.IsNil() { - // Merging nil into non-nil is a quiet no-op - return - } - mergeStruct(out.Elem(), in.Elem()) -} - -func mergeStruct(out, in reflect.Value) { - sprop := GetProperties(in.Type()) - for i := 0; i < in.NumField(); i++ { - f := in.Type().Field(i) - if strings.HasPrefix(f.Name, "XXX_") { - continue - } - mergeAny(out.Field(i), in.Field(i), false, sprop.Prop[i]) - } - - if emIn, ok := extendable(in.Addr().Interface()); ok { - emOut, _ := extendable(out.Addr().Interface()) - mIn, muIn := emIn.extensionsRead() - if mIn != nil { - mOut := emOut.extensionsWrite() - muIn.Lock() - mergeExtension(mOut, mIn) - muIn.Unlock() - } - } - - uf := in.FieldByName("XXX_unrecognized") - if !uf.IsValid() { - return - } - uin := uf.Bytes() - if len(uin) > 0 { - out.FieldByName("XXX_unrecognized").SetBytes(append([]byte(nil), uin...)) - } -} - -// mergeAny performs a merge between two values of the same type. -// viaPtr indicates whether the values were indirected through a pointer (implying proto2). -// prop is set if this is a struct field (it may be nil). -func mergeAny(out, in reflect.Value, viaPtr bool, prop *Properties) { - if in.Type() == protoMessageType { - if !in.IsNil() { - if out.IsNil() { - out.Set(reflect.ValueOf(Clone(in.Interface().(Message)))) - } else { - Merge(out.Interface().(Message), in.Interface().(Message)) - } - } - return - } - switch in.Kind() { - case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, - reflect.String, reflect.Uint32, reflect.Uint64: - if !viaPtr && isProto3Zero(in) { - return - } - out.Set(in) - case reflect.Interface: - // Probably a oneof field; copy non-nil values. - if in.IsNil() { - return - } - // Allocate destination if it is not set, or set to a different type. - // Otherwise we will merge as normal. - if out.IsNil() || out.Elem().Type() != in.Elem().Type() { - out.Set(reflect.New(in.Elem().Elem().Type())) // interface -> *T -> T -> new(T) - } - mergeAny(out.Elem(), in.Elem(), false, nil) - case reflect.Map: - if in.Len() == 0 { - return - } - if out.IsNil() { - out.Set(reflect.MakeMap(in.Type())) - } - // For maps with value types of *T or []byte we need to deep copy each value. - elemKind := in.Type().Elem().Kind() - for _, key := range in.MapKeys() { - var val reflect.Value - switch elemKind { - case reflect.Ptr: - val = reflect.New(in.Type().Elem().Elem()) - mergeAny(val, in.MapIndex(key), false, nil) - case reflect.Slice: - val = in.MapIndex(key) - val = reflect.ValueOf(append([]byte{}, val.Bytes()...)) - default: - val = in.MapIndex(key) - } - out.SetMapIndex(key, val) - } - case reflect.Ptr: - if in.IsNil() { - return - } - if out.IsNil() { - out.Set(reflect.New(in.Elem().Type())) - } - mergeAny(out.Elem(), in.Elem(), true, nil) - case reflect.Slice: - if in.IsNil() { - return - } - if in.Type().Elem().Kind() == reflect.Uint8 { - // []byte is a scalar bytes field, not a repeated field. - - // Edge case: if this is in a proto3 message, a zero length - // bytes field is considered the zero value, and should not - // be merged. - if prop != nil && prop.proto3 && in.Len() == 0 { - return - } - - // Make a deep copy. - // Append to []byte{} instead of []byte(nil) so that we never end up - // with a nil result. - out.SetBytes(append([]byte{}, in.Bytes()...)) - return - } - n := in.Len() - if out.IsNil() { - out.Set(reflect.MakeSlice(in.Type(), 0, n)) - } - switch in.Type().Elem().Kind() { - case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, - reflect.String, reflect.Uint32, reflect.Uint64: - out.Set(reflect.AppendSlice(out, in)) - default: - for i := 0; i < n; i++ { - x := reflect.Indirect(reflect.New(in.Type().Elem())) - mergeAny(x, in.Index(i), false, nil) - out.Set(reflect.Append(out, x)) - } - } - case reflect.Struct: - mergeStruct(out, in) - default: - // unknown type, so not a protocol buffer - log.Printf("proto: don't know how to copy %v", in) - } -} - -func mergeExtension(out, in map[int32]Extension) { - for extNum, eIn := range in { - eOut := Extension{desc: eIn.desc} - if eIn.value != nil { - v := reflect.New(reflect.TypeOf(eIn.value)).Elem() - mergeAny(v, reflect.ValueOf(eIn.value), false, nil) - eOut.value = v.Interface() - } - if eIn.enc != nil { - eOut.enc = make([]byte, len(eIn.enc)) - copy(eOut.enc, eIn.enc) - } - - out[extNum] = eOut - } -} diff --git a/vendor/github.com/golang/protobuf/proto/decode.go b/vendor/github.com/golang/protobuf/proto/decode.go deleted file mode 100644 index aa207298f..000000000 --- a/vendor/github.com/golang/protobuf/proto/decode.go +++ /dev/null @@ -1,970 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT -// OWNER 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. - -package proto - -/* - * Routines for decoding protocol buffer data to construct in-memory representations. - */ - -import ( - "errors" - "fmt" - "io" - "os" - "reflect" -) - -// errOverflow is returned when an integer is too large to be represented. -var errOverflow = errors.New("proto: integer overflow") - -// ErrInternalBadWireType is returned by generated code when an incorrect -// wire type is encountered. It does not get returned to user code. -var ErrInternalBadWireType = errors.New("proto: internal error: bad wiretype for oneof") - -// The fundamental decoders that interpret bytes on the wire. -// Those that take integer types all return uint64 and are -// therefore of type valueDecoder. - -// DecodeVarint reads a varint-encoded integer from the slice. -// It returns the integer and the number of bytes consumed, or -// zero if there is not enough. -// This is the format for the -// int32, int64, uint32, uint64, bool, and enum -// protocol buffer types. -func DecodeVarint(buf []byte) (x uint64, n int) { - for shift := uint(0); shift < 64; shift += 7 { - if n >= len(buf) { - return 0, 0 - } - b := uint64(buf[n]) - n++ - x |= (b & 0x7F) << shift - if (b & 0x80) == 0 { - return x, n - } - } - - // The number is too large to represent in a 64-bit value. - return 0, 0 -} - -func (p *Buffer) decodeVarintSlow() (x uint64, err error) { - i := p.index - l := len(p.buf) - - for shift := uint(0); shift < 64; shift += 7 { - if i >= l { - err = io.ErrUnexpectedEOF - return - } - b := p.buf[i] - i++ - x |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - p.index = i - return - } - } - - // The number is too large to represent in a 64-bit value. - err = errOverflow - return -} - -// DecodeVarint reads a varint-encoded integer from the Buffer. -// This is the format for the -// int32, int64, uint32, uint64, bool, and enum -// protocol buffer types. -func (p *Buffer) DecodeVarint() (x uint64, err error) { - i := p.index - buf := p.buf - - if i >= len(buf) { - return 0, io.ErrUnexpectedEOF - } else if buf[i] < 0x80 { - p.index++ - return uint64(buf[i]), nil - } else if len(buf)-i < 10 { - return p.decodeVarintSlow() - } - - var b uint64 - // we already checked the first byte - x = uint64(buf[i]) - 0x80 - i++ - - b = uint64(buf[i]) - i++ - x += b << 7 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 7 - - b = uint64(buf[i]) - i++ - x += b << 14 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 14 - - b = uint64(buf[i]) - i++ - x += b << 21 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 21 - - b = uint64(buf[i]) - i++ - x += b << 28 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 28 - - b = uint64(buf[i]) - i++ - x += b << 35 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 35 - - b = uint64(buf[i]) - i++ - x += b << 42 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 42 - - b = uint64(buf[i]) - i++ - x += b << 49 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 49 - - b = uint64(buf[i]) - i++ - x += b << 56 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 56 - - b = uint64(buf[i]) - i++ - x += b << 63 - if b&0x80 == 0 { - goto done - } - // x -= 0x80 << 63 // Always zero. - - return 0, errOverflow - -done: - p.index = i - return x, nil -} - -// DecodeFixed64 reads a 64-bit integer from the Buffer. -// This is the format for the -// fixed64, sfixed64, and double protocol buffer types. -func (p *Buffer) DecodeFixed64() (x uint64, err error) { - // x, err already 0 - i := p.index + 8 - if i < 0 || i > len(p.buf) { - err = io.ErrUnexpectedEOF - return - } - p.index = i - - x = uint64(p.buf[i-8]) - x |= uint64(p.buf[i-7]) << 8 - x |= uint64(p.buf[i-6]) << 16 - x |= uint64(p.buf[i-5]) << 24 - x |= uint64(p.buf[i-4]) << 32 - x |= uint64(p.buf[i-3]) << 40 - x |= uint64(p.buf[i-2]) << 48 - x |= uint64(p.buf[i-1]) << 56 - return -} - -// DecodeFixed32 reads a 32-bit integer from the Buffer. -// This is the format for the -// fixed32, sfixed32, and float protocol buffer types. -func (p *Buffer) DecodeFixed32() (x uint64, err error) { - // x, err already 0 - i := p.index + 4 - if i < 0 || i > len(p.buf) { - err = io.ErrUnexpectedEOF - return - } - p.index = i - - x = uint64(p.buf[i-4]) - x |= uint64(p.buf[i-3]) << 8 - x |= uint64(p.buf[i-2]) << 16 - x |= uint64(p.buf[i-1]) << 24 - return -} - -// DecodeZigzag64 reads a zigzag-encoded 64-bit integer -// from the Buffer. -// This is the format used for the sint64 protocol buffer type. -func (p *Buffer) DecodeZigzag64() (x uint64, err error) { - x, err = p.DecodeVarint() - if err != nil { - return - } - x = (x >> 1) ^ uint64((int64(x&1)<<63)>>63) - return -} - -// DecodeZigzag32 reads a zigzag-encoded 32-bit integer -// from the Buffer. -// This is the format used for the sint32 protocol buffer type. -func (p *Buffer) DecodeZigzag32() (x uint64, err error) { - x, err = p.DecodeVarint() - if err != nil { - return - } - x = uint64((uint32(x) >> 1) ^ uint32((int32(x&1)<<31)>>31)) - return -} - -// These are not ValueDecoders: they produce an array of bytes or a string. -// bytes, embedded messages - -// DecodeRawBytes reads a count-delimited byte buffer from the Buffer. -// This is the format used for the bytes protocol buffer -// type and for embedded messages. -func (p *Buffer) DecodeRawBytes(alloc bool) (buf []byte, err error) { - n, err := p.DecodeVarint() - if err != nil { - return nil, err - } - - nb := int(n) - if nb < 0 { - return nil, fmt.Errorf("proto: bad byte length %d", nb) - } - end := p.index + nb - if end < p.index || end > len(p.buf) { - return nil, io.ErrUnexpectedEOF - } - - if !alloc { - // todo: check if can get more uses of alloc=false - buf = p.buf[p.index:end] - p.index += nb - return - } - - buf = make([]byte, nb) - copy(buf, p.buf[p.index:]) - p.index += nb - return -} - -// DecodeStringBytes reads an encoded string from the Buffer. -// This is the format used for the proto2 string type. -func (p *Buffer) DecodeStringBytes() (s string, err error) { - buf, err := p.DecodeRawBytes(false) - if err != nil { - return - } - return string(buf), nil -} - -// Skip the next item in the buffer. Its wire type is decoded and presented as an argument. -// If the protocol buffer has extensions, and the field matches, add it as an extension. -// Otherwise, if the XXX_unrecognized field exists, append the skipped data there. -func (o *Buffer) skipAndSave(t reflect.Type, tag, wire int, base structPointer, unrecField field) error { - oi := o.index - - err := o.skip(t, tag, wire) - if err != nil { - return err - } - - if !unrecField.IsValid() { - return nil - } - - ptr := structPointer_Bytes(base, unrecField) - - // Add the skipped field to struct field - obuf := o.buf - - o.buf = *ptr - o.EncodeVarint(uint64(tag<<3 | wire)) - *ptr = append(o.buf, obuf[oi:o.index]...) - - o.buf = obuf - - return nil -} - -// Skip the next item in the buffer. Its wire type is decoded and presented as an argument. -func (o *Buffer) skip(t reflect.Type, tag, wire int) error { - - var u uint64 - var err error - - switch wire { - case WireVarint: - _, err = o.DecodeVarint() - case WireFixed64: - _, err = o.DecodeFixed64() - case WireBytes: - _, err = o.DecodeRawBytes(false) - case WireFixed32: - _, err = o.DecodeFixed32() - case WireStartGroup: - for { - u, err = o.DecodeVarint() - if err != nil { - break - } - fwire := int(u & 0x7) - if fwire == WireEndGroup { - break - } - ftag := int(u >> 3) - err = o.skip(t, ftag, fwire) - if err != nil { - break - } - } - default: - err = fmt.Errorf("proto: can't skip unknown wire type %d for %s", wire, t) - } - return err -} - -// Unmarshaler is the interface representing objects that can -// unmarshal themselves. The method should reset the receiver before -// decoding starts. The argument points to data that may be -// overwritten, so implementations should not keep references to the -// buffer. -type Unmarshaler interface { - Unmarshal([]byte) error -} - -// Unmarshal parses the protocol buffer representation in buf and places the -// decoded result in pb. If the struct underlying pb does not match -// the data in buf, the results can be unpredictable. -// -// Unmarshal resets pb before starting to unmarshal, so any -// existing data in pb is always removed. Use UnmarshalMerge -// to preserve and append to existing data. -func Unmarshal(buf []byte, pb Message) error { - pb.Reset() - return UnmarshalMerge(buf, pb) -} - -// UnmarshalMerge parses the protocol buffer representation in buf and -// writes the decoded result to pb. If the struct underlying pb does not match -// the data in buf, the results can be unpredictable. -// -// UnmarshalMerge merges into existing data in pb. -// Most code should use Unmarshal instead. -func UnmarshalMerge(buf []byte, pb Message) error { - // If the object can unmarshal itself, let it. - if u, ok := pb.(Unmarshaler); ok { - return u.Unmarshal(buf) - } - return NewBuffer(buf).Unmarshal(pb) -} - -// DecodeMessage reads a count-delimited message from the Buffer. -func (p *Buffer) DecodeMessage(pb Message) error { - enc, err := p.DecodeRawBytes(false) - if err != nil { - return err - } - return NewBuffer(enc).Unmarshal(pb) -} - -// DecodeGroup reads a tag-delimited group from the Buffer. -func (p *Buffer) DecodeGroup(pb Message) error { - typ, base, err := getbase(pb) - if err != nil { - return err - } - return p.unmarshalType(typ.Elem(), GetProperties(typ.Elem()), true, base) -} - -// Unmarshal parses the protocol buffer representation in the -// Buffer and places the decoded result in pb. If the struct -// underlying pb does not match the data in the buffer, the results can be -// unpredictable. -// -// Unlike proto.Unmarshal, this does not reset pb before starting to unmarshal. -func (p *Buffer) Unmarshal(pb Message) error { - // If the object can unmarshal itself, let it. - if u, ok := pb.(Unmarshaler); ok { - err := u.Unmarshal(p.buf[p.index:]) - p.index = len(p.buf) - return err - } - - typ, base, err := getbase(pb) - if err != nil { - return err - } - - err = p.unmarshalType(typ.Elem(), GetProperties(typ.Elem()), false, base) - - if collectStats { - stats.Decode++ - } - - return err -} - -// unmarshalType does the work of unmarshaling a structure. -func (o *Buffer) unmarshalType(st reflect.Type, prop *StructProperties, is_group bool, base structPointer) error { - var state errorState - required, reqFields := prop.reqCount, uint64(0) - - var err error - for err == nil && o.index < len(o.buf) { - oi := o.index - var u uint64 - u, err = o.DecodeVarint() - if err != nil { - break - } - wire := int(u & 0x7) - if wire == WireEndGroup { - if is_group { - if required > 0 { - // Not enough information to determine the exact field. - // (See below.) - return &RequiredNotSetError{"{Unknown}"} - } - return nil // input is satisfied - } - return fmt.Errorf("proto: %s: wiretype end group for non-group", st) - } - tag := int(u >> 3) - if tag <= 0 { - return fmt.Errorf("proto: %s: illegal tag %d (wire type %d)", st, tag, wire) - } - fieldnum, ok := prop.decoderTags.get(tag) - if !ok { - // Maybe it's an extension? - if prop.extendable { - if e, _ := extendable(structPointer_Interface(base, st)); isExtensionField(e, int32(tag)) { - if err = o.skip(st, tag, wire); err == nil { - extmap := e.extensionsWrite() - ext := extmap[int32(tag)] // may be missing - ext.enc = append(ext.enc, o.buf[oi:o.index]...) - extmap[int32(tag)] = ext - } - continue - } - } - // Maybe it's a oneof? - if prop.oneofUnmarshaler != nil { - m := structPointer_Interface(base, st).(Message) - // First return value indicates whether tag is a oneof field. - ok, err = prop.oneofUnmarshaler(m, tag, wire, o) - if err == ErrInternalBadWireType { - // Map the error to something more descriptive. - // Do the formatting here to save generated code space. - err = fmt.Errorf("bad wiretype for oneof field in %T", m) - } - if ok { - continue - } - } - err = o.skipAndSave(st, tag, wire, base, prop.unrecField) - continue - } - p := prop.Prop[fieldnum] - - if p.dec == nil { - fmt.Fprintf(os.Stderr, "proto: no protobuf decoder for %s.%s\n", st, st.Field(fieldnum).Name) - continue - } - dec := p.dec - if wire != WireStartGroup && wire != p.WireType { - if wire == WireBytes && p.packedDec != nil { - // a packable field - dec = p.packedDec - } else { - err = fmt.Errorf("proto: bad wiretype for field %s.%s: got wiretype %d, want %d", st, st.Field(fieldnum).Name, wire, p.WireType) - continue - } - } - decErr := dec(o, p, base) - if decErr != nil && !state.shouldContinue(decErr, p) { - err = decErr - } - if err == nil && p.Required { - // Successfully decoded a required field. - if tag <= 64 { - // use bitmap for fields 1-64 to catch field reuse. - var mask uint64 = 1 << uint64(tag-1) - if reqFields&mask == 0 { - // new required field - reqFields |= mask - required-- - } - } else { - // This is imprecise. It can be fooled by a required field - // with a tag > 64 that is encoded twice; that's very rare. - // A fully correct implementation would require allocating - // a data structure, which we would like to avoid. - required-- - } - } - } - if err == nil { - if is_group { - return io.ErrUnexpectedEOF - } - if state.err != nil { - return state.err - } - if required > 0 { - // Not enough information to determine the exact field. If we use extra - // CPU, we could determine the field only if the missing required field - // has a tag <= 64 and we check reqFields. - return &RequiredNotSetError{"{Unknown}"} - } - } - return err -} - -// Individual type decoders -// For each, -// u is the decoded value, -// v is a pointer to the field (pointer) in the struct - -// Sizes of the pools to allocate inside the Buffer. -// The goal is modest amortization and allocation -// on at least 16-byte boundaries. -const ( - boolPoolSize = 16 - uint32PoolSize = 8 - uint64PoolSize = 4 -) - -// Decode a bool. -func (o *Buffer) dec_bool(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - if len(o.bools) == 0 { - o.bools = make([]bool, boolPoolSize) - } - o.bools[0] = u != 0 - *structPointer_Bool(base, p.field) = &o.bools[0] - o.bools = o.bools[1:] - return nil -} - -func (o *Buffer) dec_proto3_bool(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - *structPointer_BoolVal(base, p.field) = u != 0 - return nil -} - -// Decode an int32. -func (o *Buffer) dec_int32(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - word32_Set(structPointer_Word32(base, p.field), o, uint32(u)) - return nil -} - -func (o *Buffer) dec_proto3_int32(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - word32Val_Set(structPointer_Word32Val(base, p.field), uint32(u)) - return nil -} - -// Decode an int64. -func (o *Buffer) dec_int64(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - word64_Set(structPointer_Word64(base, p.field), o, u) - return nil -} - -func (o *Buffer) dec_proto3_int64(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - word64Val_Set(structPointer_Word64Val(base, p.field), o, u) - return nil -} - -// Decode a string. -func (o *Buffer) dec_string(p *Properties, base structPointer) error { - s, err := o.DecodeStringBytes() - if err != nil { - return err - } - *structPointer_String(base, p.field) = &s - return nil -} - -func (o *Buffer) dec_proto3_string(p *Properties, base structPointer) error { - s, err := o.DecodeStringBytes() - if err != nil { - return err - } - *structPointer_StringVal(base, p.field) = s - return nil -} - -// Decode a slice of bytes ([]byte). -func (o *Buffer) dec_slice_byte(p *Properties, base structPointer) error { - b, err := o.DecodeRawBytes(true) - if err != nil { - return err - } - *structPointer_Bytes(base, p.field) = b - return nil -} - -// Decode a slice of bools ([]bool). -func (o *Buffer) dec_slice_bool(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - v := structPointer_BoolSlice(base, p.field) - *v = append(*v, u != 0) - return nil -} - -// Decode a slice of bools ([]bool) in packed format. -func (o *Buffer) dec_slice_packed_bool(p *Properties, base structPointer) error { - v := structPointer_BoolSlice(base, p.field) - - nn, err := o.DecodeVarint() - if err != nil { - return err - } - nb := int(nn) // number of bytes of encoded bools - fin := o.index + nb - if fin < o.index { - return errOverflow - } - - y := *v - for o.index < fin { - u, err := p.valDec(o) - if err != nil { - return err - } - y = append(y, u != 0) - } - - *v = y - return nil -} - -// Decode a slice of int32s ([]int32). -func (o *Buffer) dec_slice_int32(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - structPointer_Word32Slice(base, p.field).Append(uint32(u)) - return nil -} - -// Decode a slice of int32s ([]int32) in packed format. -func (o *Buffer) dec_slice_packed_int32(p *Properties, base structPointer) error { - v := structPointer_Word32Slice(base, p.field) - - nn, err := o.DecodeVarint() - if err != nil { - return err - } - nb := int(nn) // number of bytes of encoded int32s - - fin := o.index + nb - if fin < o.index { - return errOverflow - } - for o.index < fin { - u, err := p.valDec(o) - if err != nil { - return err - } - v.Append(uint32(u)) - } - return nil -} - -// Decode a slice of int64s ([]int64). -func (o *Buffer) dec_slice_int64(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - - structPointer_Word64Slice(base, p.field).Append(u) - return nil -} - -// Decode a slice of int64s ([]int64) in packed format. -func (o *Buffer) dec_slice_packed_int64(p *Properties, base structPointer) error { - v := structPointer_Word64Slice(base, p.field) - - nn, err := o.DecodeVarint() - if err != nil { - return err - } - nb := int(nn) // number of bytes of encoded int64s - - fin := o.index + nb - if fin < o.index { - return errOverflow - } - for o.index < fin { - u, err := p.valDec(o) - if err != nil { - return err - } - v.Append(u) - } - return nil -} - -// Decode a slice of strings ([]string). -func (o *Buffer) dec_slice_string(p *Properties, base structPointer) error { - s, err := o.DecodeStringBytes() - if err != nil { - return err - } - v := structPointer_StringSlice(base, p.field) - *v = append(*v, s) - return nil -} - -// Decode a slice of slice of bytes ([][]byte). -func (o *Buffer) dec_slice_slice_byte(p *Properties, base structPointer) error { - b, err := o.DecodeRawBytes(true) - if err != nil { - return err - } - v := structPointer_BytesSlice(base, p.field) - *v = append(*v, b) - return nil -} - -// Decode a map field. -func (o *Buffer) dec_new_map(p *Properties, base structPointer) error { - raw, err := o.DecodeRawBytes(false) - if err != nil { - return err - } - oi := o.index // index at the end of this map entry - o.index -= len(raw) // move buffer back to start of map entry - - mptr := structPointer_NewAt(base, p.field, p.mtype) // *map[K]V - if mptr.Elem().IsNil() { - mptr.Elem().Set(reflect.MakeMap(mptr.Type().Elem())) - } - v := mptr.Elem() // map[K]V - - // Prepare addressable doubly-indirect placeholders for the key and value types. - // See enc_new_map for why. - keyptr := reflect.New(reflect.PtrTo(p.mtype.Key())).Elem() // addressable *K - keybase := toStructPointer(keyptr.Addr()) // **K - - var valbase structPointer - var valptr reflect.Value - switch p.mtype.Elem().Kind() { - case reflect.Slice: - // []byte - var dummy []byte - valptr = reflect.ValueOf(&dummy) // *[]byte - valbase = toStructPointer(valptr) // *[]byte - case reflect.Ptr: - // message; valptr is **Msg; need to allocate the intermediate pointer - valptr = reflect.New(reflect.PtrTo(p.mtype.Elem())).Elem() // addressable *V - valptr.Set(reflect.New(valptr.Type().Elem())) - valbase = toStructPointer(valptr) - default: - // everything else - valptr = reflect.New(reflect.PtrTo(p.mtype.Elem())).Elem() // addressable *V - valbase = toStructPointer(valptr.Addr()) // **V - } - - // Decode. - // This parses a restricted wire format, namely the encoding of a message - // with two fields. See enc_new_map for the format. - for o.index < oi { - // tagcode for key and value properties are always a single byte - // because they have tags 1 and 2. - tagcode := o.buf[o.index] - o.index++ - switch tagcode { - case p.mkeyprop.tagcode[0]: - if err := p.mkeyprop.dec(o, p.mkeyprop, keybase); err != nil { - return err - } - case p.mvalprop.tagcode[0]: - if err := p.mvalprop.dec(o, p.mvalprop, valbase); err != nil { - return err - } - default: - // TODO: Should we silently skip this instead? - return fmt.Errorf("proto: bad map data tag %d", raw[0]) - } - } - keyelem, valelem := keyptr.Elem(), valptr.Elem() - if !keyelem.IsValid() { - keyelem = reflect.Zero(p.mtype.Key()) - } - if !valelem.IsValid() { - valelem = reflect.Zero(p.mtype.Elem()) - } - - v.SetMapIndex(keyelem, valelem) - return nil -} - -// Decode a group. -func (o *Buffer) dec_struct_group(p *Properties, base structPointer) error { - bas := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(bas) { - // allocate new nested message - bas = toStructPointer(reflect.New(p.stype)) - structPointer_SetStructPointer(base, p.field, bas) - } - return o.unmarshalType(p.stype, p.sprop, true, bas) -} - -// Decode an embedded message. -func (o *Buffer) dec_struct_message(p *Properties, base structPointer) (err error) { - raw, e := o.DecodeRawBytes(false) - if e != nil { - return e - } - - bas := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(bas) { - // allocate new nested message - bas = toStructPointer(reflect.New(p.stype)) - structPointer_SetStructPointer(base, p.field, bas) - } - - // If the object can unmarshal itself, let it. - if p.isUnmarshaler { - iv := structPointer_Interface(bas, p.stype) - return iv.(Unmarshaler).Unmarshal(raw) - } - - obuf := o.buf - oi := o.index - o.buf = raw - o.index = 0 - - err = o.unmarshalType(p.stype, p.sprop, false, bas) - o.buf = obuf - o.index = oi - - return err -} - -// Decode a slice of embedded messages. -func (o *Buffer) dec_slice_struct_message(p *Properties, base structPointer) error { - return o.dec_slice_struct(p, false, base) -} - -// Decode a slice of embedded groups. -func (o *Buffer) dec_slice_struct_group(p *Properties, base structPointer) error { - return o.dec_slice_struct(p, true, base) -} - -// Decode a slice of structs ([]*struct). -func (o *Buffer) dec_slice_struct(p *Properties, is_group bool, base structPointer) error { - v := reflect.New(p.stype) - bas := toStructPointer(v) - structPointer_StructPointerSlice(base, p.field).Append(bas) - - if is_group { - err := o.unmarshalType(p.stype, p.sprop, is_group, bas) - return err - } - - raw, err := o.DecodeRawBytes(false) - if err != nil { - return err - } - - // If the object can unmarshal itself, let it. - if p.isUnmarshaler { - iv := v.Interface() - return iv.(Unmarshaler).Unmarshal(raw) - } - - obuf := o.buf - oi := o.index - o.buf = raw - o.index = 0 - - err = o.unmarshalType(p.stype, p.sprop, is_group, bas) - - o.buf = obuf - o.index = oi - - return err -} diff --git a/vendor/github.com/golang/protobuf/proto/encode.go b/vendor/github.com/golang/protobuf/proto/encode.go deleted file mode 100644 index 2b30f8462..000000000 --- a/vendor/github.com/golang/protobuf/proto/encode.go +++ /dev/null @@ -1,1362 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT -// OWNER 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. - -package proto - -/* - * Routines for encoding data into the wire format for protocol buffers. - */ - -import ( - "errors" - "fmt" - "reflect" - "sort" -) - -// RequiredNotSetError is the error returned if Marshal is called with -// a protocol buffer struct whose required fields have not -// all been initialized. It is also the error returned if Unmarshal is -// called with an encoded protocol buffer that does not include all the -// required fields. -// -// When printed, RequiredNotSetError reports the first unset required field in a -// message. If the field cannot be precisely determined, it is reported as -// "{Unknown}". -type RequiredNotSetError struct { - field string -} - -func (e *RequiredNotSetError) Error() string { - return fmt.Sprintf("proto: required field %q not set", e.field) -} - -var ( - // errRepeatedHasNil is the error returned if Marshal is called with - // a struct with a repeated field containing a nil element. - errRepeatedHasNil = errors.New("proto: repeated field has nil element") - - // errOneofHasNil is the error returned if Marshal is called with - // a struct with a oneof field containing a nil element. - errOneofHasNil = errors.New("proto: oneof field has nil value") - - // ErrNil is the error returned if Marshal is called with nil. - ErrNil = errors.New("proto: Marshal called with nil") - - // ErrTooLarge is the error returned if Marshal is called with a - // message that encodes to >2GB. - ErrTooLarge = errors.New("proto: message encodes to over 2 GB") -) - -// The fundamental encoders that put bytes on the wire. -// Those that take integer types all accept uint64 and are -// therefore of type valueEncoder. - -const maxVarintBytes = 10 // maximum length of a varint - -// maxMarshalSize is the largest allowed size of an encoded protobuf, -// since C++ and Java use signed int32s for the size. -const maxMarshalSize = 1<<31 - 1 - -// EncodeVarint returns the varint encoding of x. -// This is the format for the -// int32, int64, uint32, uint64, bool, and enum -// protocol buffer types. -// Not used by the package itself, but helpful to clients -// wishing to use the same encoding. -func EncodeVarint(x uint64) []byte { - var buf [maxVarintBytes]byte - var n int - for n = 0; x > 127; n++ { - buf[n] = 0x80 | uint8(x&0x7F) - x >>= 7 - } - buf[n] = uint8(x) - n++ - return buf[0:n] -} - -// EncodeVarint writes a varint-encoded integer to the Buffer. -// This is the format for the -// int32, int64, uint32, uint64, bool, and enum -// protocol buffer types. -func (p *Buffer) EncodeVarint(x uint64) error { - for x >= 1<<7 { - p.buf = append(p.buf, uint8(x&0x7f|0x80)) - x >>= 7 - } - p.buf = append(p.buf, uint8(x)) - return nil -} - -// SizeVarint returns the varint encoding size of an integer. -func SizeVarint(x uint64) int { - return sizeVarint(x) -} - -func sizeVarint(x uint64) (n int) { - for { - n++ - x >>= 7 - if x == 0 { - break - } - } - return n -} - -// EncodeFixed64 writes a 64-bit integer to the Buffer. -// This is the format for the -// fixed64, sfixed64, and double protocol buffer types. -func (p *Buffer) EncodeFixed64(x uint64) error { - p.buf = append(p.buf, - uint8(x), - uint8(x>>8), - uint8(x>>16), - uint8(x>>24), - uint8(x>>32), - uint8(x>>40), - uint8(x>>48), - uint8(x>>56)) - return nil -} - -func sizeFixed64(x uint64) int { - return 8 -} - -// EncodeFixed32 writes a 32-bit integer to the Buffer. -// This is the format for the -// fixed32, sfixed32, and float protocol buffer types. -func (p *Buffer) EncodeFixed32(x uint64) error { - p.buf = append(p.buf, - uint8(x), - uint8(x>>8), - uint8(x>>16), - uint8(x>>24)) - return nil -} - -func sizeFixed32(x uint64) int { - return 4 -} - -// EncodeZigzag64 writes a zigzag-encoded 64-bit integer -// to the Buffer. -// This is the format used for the sint64 protocol buffer type. -func (p *Buffer) EncodeZigzag64(x uint64) error { - // use signed number to get arithmetic right shift. - return p.EncodeVarint(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} - -func sizeZigzag64(x uint64) int { - return sizeVarint(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} - -// EncodeZigzag32 writes a zigzag-encoded 32-bit integer -// to the Buffer. -// This is the format used for the sint32 protocol buffer type. -func (p *Buffer) EncodeZigzag32(x uint64) error { - // use signed number to get arithmetic right shift. - return p.EncodeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31)))) -} - -func sizeZigzag32(x uint64) int { - return sizeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31)))) -} - -// EncodeRawBytes writes a count-delimited byte buffer to the Buffer. -// This is the format used for the bytes protocol buffer -// type and for embedded messages. -func (p *Buffer) EncodeRawBytes(b []byte) error { - p.EncodeVarint(uint64(len(b))) - p.buf = append(p.buf, b...) - return nil -} - -func sizeRawBytes(b []byte) int { - return sizeVarint(uint64(len(b))) + - len(b) -} - -// EncodeStringBytes writes an encoded string to the Buffer. -// This is the format used for the proto2 string type. -func (p *Buffer) EncodeStringBytes(s string) error { - p.EncodeVarint(uint64(len(s))) - p.buf = append(p.buf, s...) - return nil -} - -func sizeStringBytes(s string) int { - return sizeVarint(uint64(len(s))) + - len(s) -} - -// Marshaler is the interface representing objects that can marshal themselves. -type Marshaler interface { - Marshal() ([]byte, error) -} - -// Marshal takes the protocol buffer -// and encodes it into the wire format, returning the data. -func Marshal(pb Message) ([]byte, error) { - // Can the object marshal itself? - if m, ok := pb.(Marshaler); ok { - return m.Marshal() - } - p := NewBuffer(nil) - err := p.Marshal(pb) - if p.buf == nil && err == nil { - // Return a non-nil slice on success. - return []byte{}, nil - } - return p.buf, err -} - -// EncodeMessage writes the protocol buffer to the Buffer, -// prefixed by a varint-encoded length. -func (p *Buffer) EncodeMessage(pb Message) error { - t, base, err := getbase(pb) - if structPointer_IsNil(base) { - return ErrNil - } - if err == nil { - var state errorState - err = p.enc_len_struct(GetProperties(t.Elem()), base, &state) - } - return err -} - -// Marshal takes the protocol buffer -// and encodes it into the wire format, writing the result to the -// Buffer. -func (p *Buffer) Marshal(pb Message) error { - // Can the object marshal itself? - if m, ok := pb.(Marshaler); ok { - data, err := m.Marshal() - p.buf = append(p.buf, data...) - return err - } - - t, base, err := getbase(pb) - if structPointer_IsNil(base) { - return ErrNil - } - if err == nil { - err = p.enc_struct(GetProperties(t.Elem()), base) - } - - if collectStats { - (stats).Encode++ // Parens are to work around a goimports bug. - } - - if len(p.buf) > maxMarshalSize { - return ErrTooLarge - } - return err -} - -// Size returns the encoded size of a protocol buffer. -func Size(pb Message) (n int) { - // Can the object marshal itself? If so, Size is slow. - // TODO: add Size to Marshaler, or add a Sizer interface. - if m, ok := pb.(Marshaler); ok { - b, _ := m.Marshal() - return len(b) - } - - t, base, err := getbase(pb) - if structPointer_IsNil(base) { - return 0 - } - if err == nil { - n = size_struct(GetProperties(t.Elem()), base) - } - - if collectStats { - (stats).Size++ // Parens are to work around a goimports bug. - } - - return -} - -// Individual type encoders. - -// Encode a bool. -func (o *Buffer) enc_bool(p *Properties, base structPointer) error { - v := *structPointer_Bool(base, p.field) - if v == nil { - return ErrNil - } - x := 0 - if *v { - x = 1 - } - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, uint64(x)) - return nil -} - -func (o *Buffer) enc_proto3_bool(p *Properties, base structPointer) error { - v := *structPointer_BoolVal(base, p.field) - if !v { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, 1) - return nil -} - -func size_bool(p *Properties, base structPointer) int { - v := *structPointer_Bool(base, p.field) - if v == nil { - return 0 - } - return len(p.tagcode) + 1 // each bool takes exactly one byte -} - -func size_proto3_bool(p *Properties, base structPointer) int { - v := *structPointer_BoolVal(base, p.field) - if !v && !p.oneof { - return 0 - } - return len(p.tagcode) + 1 // each bool takes exactly one byte -} - -// Encode an int32. -func (o *Buffer) enc_int32(p *Properties, base structPointer) error { - v := structPointer_Word32(base, p.field) - if word32_IsNil(v) { - return ErrNil - } - x := int32(word32_Get(v)) // permit sign extension to use full 64-bit range - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, uint64(x)) - return nil -} - -func (o *Buffer) enc_proto3_int32(p *Properties, base structPointer) error { - v := structPointer_Word32Val(base, p.field) - x := int32(word32Val_Get(v)) // permit sign extension to use full 64-bit range - if x == 0 { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, uint64(x)) - return nil -} - -func size_int32(p *Properties, base structPointer) (n int) { - v := structPointer_Word32(base, p.field) - if word32_IsNil(v) { - return 0 - } - x := int32(word32_Get(v)) // permit sign extension to use full 64-bit range - n += len(p.tagcode) - n += p.valSize(uint64(x)) - return -} - -func size_proto3_int32(p *Properties, base structPointer) (n int) { - v := structPointer_Word32Val(base, p.field) - x := int32(word32Val_Get(v)) // permit sign extension to use full 64-bit range - if x == 0 && !p.oneof { - return 0 - } - n += len(p.tagcode) - n += p.valSize(uint64(x)) - return -} - -// Encode a uint32. -// Exactly the same as int32, except for no sign extension. -func (o *Buffer) enc_uint32(p *Properties, base structPointer) error { - v := structPointer_Word32(base, p.field) - if word32_IsNil(v) { - return ErrNil - } - x := word32_Get(v) - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, uint64(x)) - return nil -} - -func (o *Buffer) enc_proto3_uint32(p *Properties, base structPointer) error { - v := structPointer_Word32Val(base, p.field) - x := word32Val_Get(v) - if x == 0 { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, uint64(x)) - return nil -} - -func size_uint32(p *Properties, base structPointer) (n int) { - v := structPointer_Word32(base, p.field) - if word32_IsNil(v) { - return 0 - } - x := word32_Get(v) - n += len(p.tagcode) - n += p.valSize(uint64(x)) - return -} - -func size_proto3_uint32(p *Properties, base structPointer) (n int) { - v := structPointer_Word32Val(base, p.field) - x := word32Val_Get(v) - if x == 0 && !p.oneof { - return 0 - } - n += len(p.tagcode) - n += p.valSize(uint64(x)) - return -} - -// Encode an int64. -func (o *Buffer) enc_int64(p *Properties, base structPointer) error { - v := structPointer_Word64(base, p.field) - if word64_IsNil(v) { - return ErrNil - } - x := word64_Get(v) - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, x) - return nil -} - -func (o *Buffer) enc_proto3_int64(p *Properties, base structPointer) error { - v := structPointer_Word64Val(base, p.field) - x := word64Val_Get(v) - if x == 0 { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, x) - return nil -} - -func size_int64(p *Properties, base structPointer) (n int) { - v := structPointer_Word64(base, p.field) - if word64_IsNil(v) { - return 0 - } - x := word64_Get(v) - n += len(p.tagcode) - n += p.valSize(x) - return -} - -func size_proto3_int64(p *Properties, base structPointer) (n int) { - v := structPointer_Word64Val(base, p.field) - x := word64Val_Get(v) - if x == 0 && !p.oneof { - return 0 - } - n += len(p.tagcode) - n += p.valSize(x) - return -} - -// Encode a string. -func (o *Buffer) enc_string(p *Properties, base structPointer) error { - v := *structPointer_String(base, p.field) - if v == nil { - return ErrNil - } - x := *v - o.buf = append(o.buf, p.tagcode...) - o.EncodeStringBytes(x) - return nil -} - -func (o *Buffer) enc_proto3_string(p *Properties, base structPointer) error { - v := *structPointer_StringVal(base, p.field) - if v == "" { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeStringBytes(v) - return nil -} - -func size_string(p *Properties, base structPointer) (n int) { - v := *structPointer_String(base, p.field) - if v == nil { - return 0 - } - x := *v - n += len(p.tagcode) - n += sizeStringBytes(x) - return -} - -func size_proto3_string(p *Properties, base structPointer) (n int) { - v := *structPointer_StringVal(base, p.field) - if v == "" && !p.oneof { - return 0 - } - n += len(p.tagcode) - n += sizeStringBytes(v) - return -} - -// All protocol buffer fields are nillable, but be careful. -func isNil(v reflect.Value) bool { - switch v.Kind() { - case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: - return v.IsNil() - } - return false -} - -// Encode a message struct. -func (o *Buffer) enc_struct_message(p *Properties, base structPointer) error { - var state errorState - structp := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(structp) { - return ErrNil - } - - // Can the object marshal itself? - if p.isMarshaler { - m := structPointer_Interface(structp, p.stype).(Marshaler) - data, err := m.Marshal() - if err != nil && !state.shouldContinue(err, nil) { - return err - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(data) - return state.err - } - - o.buf = append(o.buf, p.tagcode...) - return o.enc_len_struct(p.sprop, structp, &state) -} - -func size_struct_message(p *Properties, base structPointer) int { - structp := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(structp) { - return 0 - } - - // Can the object marshal itself? - if p.isMarshaler { - m := structPointer_Interface(structp, p.stype).(Marshaler) - data, _ := m.Marshal() - n0 := len(p.tagcode) - n1 := sizeRawBytes(data) - return n0 + n1 - } - - n0 := len(p.tagcode) - n1 := size_struct(p.sprop, structp) - n2 := sizeVarint(uint64(n1)) // size of encoded length - return n0 + n1 + n2 -} - -// Encode a group struct. -func (o *Buffer) enc_struct_group(p *Properties, base structPointer) error { - var state errorState - b := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(b) { - return ErrNil - } - - o.EncodeVarint(uint64((p.Tag << 3) | WireStartGroup)) - err := o.enc_struct(p.sprop, b) - if err != nil && !state.shouldContinue(err, nil) { - return err - } - o.EncodeVarint(uint64((p.Tag << 3) | WireEndGroup)) - return state.err -} - -func size_struct_group(p *Properties, base structPointer) (n int) { - b := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(b) { - return 0 - } - - n += sizeVarint(uint64((p.Tag << 3) | WireStartGroup)) - n += size_struct(p.sprop, b) - n += sizeVarint(uint64((p.Tag << 3) | WireEndGroup)) - return -} - -// Encode a slice of bools ([]bool). -func (o *Buffer) enc_slice_bool(p *Properties, base structPointer) error { - s := *structPointer_BoolSlice(base, p.field) - l := len(s) - if l == 0 { - return ErrNil - } - for _, x := range s { - o.buf = append(o.buf, p.tagcode...) - v := uint64(0) - if x { - v = 1 - } - p.valEnc(o, v) - } - return nil -} - -func size_slice_bool(p *Properties, base structPointer) int { - s := *structPointer_BoolSlice(base, p.field) - l := len(s) - if l == 0 { - return 0 - } - return l * (len(p.tagcode) + 1) // each bool takes exactly one byte -} - -// Encode a slice of bools ([]bool) in packed format. -func (o *Buffer) enc_slice_packed_bool(p *Properties, base structPointer) error { - s := *structPointer_BoolSlice(base, p.field) - l := len(s) - if l == 0 { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeVarint(uint64(l)) // each bool takes exactly one byte - for _, x := range s { - v := uint64(0) - if x { - v = 1 - } - p.valEnc(o, v) - } - return nil -} - -func size_slice_packed_bool(p *Properties, base structPointer) (n int) { - s := *structPointer_BoolSlice(base, p.field) - l := len(s) - if l == 0 { - return 0 - } - n += len(p.tagcode) - n += sizeVarint(uint64(l)) - n += l // each bool takes exactly one byte - return -} - -// Encode a slice of bytes ([]byte). -func (o *Buffer) enc_slice_byte(p *Properties, base structPointer) error { - s := *structPointer_Bytes(base, p.field) - if s == nil { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(s) - return nil -} - -func (o *Buffer) enc_proto3_slice_byte(p *Properties, base structPointer) error { - s := *structPointer_Bytes(base, p.field) - if len(s) == 0 { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(s) - return nil -} - -func size_slice_byte(p *Properties, base structPointer) (n int) { - s := *structPointer_Bytes(base, p.field) - if s == nil && !p.oneof { - return 0 - } - n += len(p.tagcode) - n += sizeRawBytes(s) - return -} - -func size_proto3_slice_byte(p *Properties, base structPointer) (n int) { - s := *structPointer_Bytes(base, p.field) - if len(s) == 0 && !p.oneof { - return 0 - } - n += len(p.tagcode) - n += sizeRawBytes(s) - return -} - -// Encode a slice of int32s ([]int32). -func (o *Buffer) enc_slice_int32(p *Properties, base structPointer) error { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return ErrNil - } - for i := 0; i < l; i++ { - o.buf = append(o.buf, p.tagcode...) - x := int32(s.Index(i)) // permit sign extension to use full 64-bit range - p.valEnc(o, uint64(x)) - } - return nil -} - -func size_slice_int32(p *Properties, base structPointer) (n int) { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return 0 - } - for i := 0; i < l; i++ { - n += len(p.tagcode) - x := int32(s.Index(i)) // permit sign extension to use full 64-bit range - n += p.valSize(uint64(x)) - } - return -} - -// Encode a slice of int32s ([]int32) in packed format. -func (o *Buffer) enc_slice_packed_int32(p *Properties, base structPointer) error { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return ErrNil - } - // TODO: Reuse a Buffer. - buf := NewBuffer(nil) - for i := 0; i < l; i++ { - x := int32(s.Index(i)) // permit sign extension to use full 64-bit range - p.valEnc(buf, uint64(x)) - } - - o.buf = append(o.buf, p.tagcode...) - o.EncodeVarint(uint64(len(buf.buf))) - o.buf = append(o.buf, buf.buf...) - return nil -} - -func size_slice_packed_int32(p *Properties, base structPointer) (n int) { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return 0 - } - var bufSize int - for i := 0; i < l; i++ { - x := int32(s.Index(i)) // permit sign extension to use full 64-bit range - bufSize += p.valSize(uint64(x)) - } - - n += len(p.tagcode) - n += sizeVarint(uint64(bufSize)) - n += bufSize - return -} - -// Encode a slice of uint32s ([]uint32). -// Exactly the same as int32, except for no sign extension. -func (o *Buffer) enc_slice_uint32(p *Properties, base structPointer) error { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return ErrNil - } - for i := 0; i < l; i++ { - o.buf = append(o.buf, p.tagcode...) - x := s.Index(i) - p.valEnc(o, uint64(x)) - } - return nil -} - -func size_slice_uint32(p *Properties, base structPointer) (n int) { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return 0 - } - for i := 0; i < l; i++ { - n += len(p.tagcode) - x := s.Index(i) - n += p.valSize(uint64(x)) - } - return -} - -// Encode a slice of uint32s ([]uint32) in packed format. -// Exactly the same as int32, except for no sign extension. -func (o *Buffer) enc_slice_packed_uint32(p *Properties, base structPointer) error { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return ErrNil - } - // TODO: Reuse a Buffer. - buf := NewBuffer(nil) - for i := 0; i < l; i++ { - p.valEnc(buf, uint64(s.Index(i))) - } - - o.buf = append(o.buf, p.tagcode...) - o.EncodeVarint(uint64(len(buf.buf))) - o.buf = append(o.buf, buf.buf...) - return nil -} - -func size_slice_packed_uint32(p *Properties, base structPointer) (n int) { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return 0 - } - var bufSize int - for i := 0; i < l; i++ { - bufSize += p.valSize(uint64(s.Index(i))) - } - - n += len(p.tagcode) - n += sizeVarint(uint64(bufSize)) - n += bufSize - return -} - -// Encode a slice of int64s ([]int64). -func (o *Buffer) enc_slice_int64(p *Properties, base structPointer) error { - s := structPointer_Word64Slice(base, p.field) - l := s.Len() - if l == 0 { - return ErrNil - } - for i := 0; i < l; i++ { - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, s.Index(i)) - } - return nil -} - -func size_slice_int64(p *Properties, base structPointer) (n int) { - s := structPointer_Word64Slice(base, p.field) - l := s.Len() - if l == 0 { - return 0 - } - for i := 0; i < l; i++ { - n += len(p.tagcode) - n += p.valSize(s.Index(i)) - } - return -} - -// Encode a slice of int64s ([]int64) in packed format. -func (o *Buffer) enc_slice_packed_int64(p *Properties, base structPointer) error { - s := structPointer_Word64Slice(base, p.field) - l := s.Len() - if l == 0 { - return ErrNil - } - // TODO: Reuse a Buffer. - buf := NewBuffer(nil) - for i := 0; i < l; i++ { - p.valEnc(buf, s.Index(i)) - } - - o.buf = append(o.buf, p.tagcode...) - o.EncodeVarint(uint64(len(buf.buf))) - o.buf = append(o.buf, buf.buf...) - return nil -} - -func size_slice_packed_int64(p *Properties, base structPointer) (n int) { - s := structPointer_Word64Slice(base, p.field) - l := s.Len() - if l == 0 { - return 0 - } - var bufSize int - for i := 0; i < l; i++ { - bufSize += p.valSize(s.Index(i)) - } - - n += len(p.tagcode) - n += sizeVarint(uint64(bufSize)) - n += bufSize - return -} - -// Encode a slice of slice of bytes ([][]byte). -func (o *Buffer) enc_slice_slice_byte(p *Properties, base structPointer) error { - ss := *structPointer_BytesSlice(base, p.field) - l := len(ss) - if l == 0 { - return ErrNil - } - for i := 0; i < l; i++ { - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(ss[i]) - } - return nil -} - -func size_slice_slice_byte(p *Properties, base structPointer) (n int) { - ss := *structPointer_BytesSlice(base, p.field) - l := len(ss) - if l == 0 { - return 0 - } - n += l * len(p.tagcode) - for i := 0; i < l; i++ { - n += sizeRawBytes(ss[i]) - } - return -} - -// Encode a slice of strings ([]string). -func (o *Buffer) enc_slice_string(p *Properties, base structPointer) error { - ss := *structPointer_StringSlice(base, p.field) - l := len(ss) - for i := 0; i < l; i++ { - o.buf = append(o.buf, p.tagcode...) - o.EncodeStringBytes(ss[i]) - } - return nil -} - -func size_slice_string(p *Properties, base structPointer) (n int) { - ss := *structPointer_StringSlice(base, p.field) - l := len(ss) - n += l * len(p.tagcode) - for i := 0; i < l; i++ { - n += sizeStringBytes(ss[i]) - } - return -} - -// Encode a slice of message structs ([]*struct). -func (o *Buffer) enc_slice_struct_message(p *Properties, base structPointer) error { - var state errorState - s := structPointer_StructPointerSlice(base, p.field) - l := s.Len() - - for i := 0; i < l; i++ { - structp := s.Index(i) - if structPointer_IsNil(structp) { - return errRepeatedHasNil - } - - // Can the object marshal itself? - if p.isMarshaler { - m := structPointer_Interface(structp, p.stype).(Marshaler) - data, err := m.Marshal() - if err != nil && !state.shouldContinue(err, nil) { - return err - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(data) - continue - } - - o.buf = append(o.buf, p.tagcode...) - err := o.enc_len_struct(p.sprop, structp, &state) - if err != nil && !state.shouldContinue(err, nil) { - if err == ErrNil { - return errRepeatedHasNil - } - return err - } - } - return state.err -} - -func size_slice_struct_message(p *Properties, base structPointer) (n int) { - s := structPointer_StructPointerSlice(base, p.field) - l := s.Len() - n += l * len(p.tagcode) - for i := 0; i < l; i++ { - structp := s.Index(i) - if structPointer_IsNil(structp) { - return // return the size up to this point - } - - // Can the object marshal itself? - if p.isMarshaler { - m := structPointer_Interface(structp, p.stype).(Marshaler) - data, _ := m.Marshal() - n += sizeRawBytes(data) - continue - } - - n0 := size_struct(p.sprop, structp) - n1 := sizeVarint(uint64(n0)) // size of encoded length - n += n0 + n1 - } - return -} - -// Encode a slice of group structs ([]*struct). -func (o *Buffer) enc_slice_struct_group(p *Properties, base structPointer) error { - var state errorState - s := structPointer_StructPointerSlice(base, p.field) - l := s.Len() - - for i := 0; i < l; i++ { - b := s.Index(i) - if structPointer_IsNil(b) { - return errRepeatedHasNil - } - - o.EncodeVarint(uint64((p.Tag << 3) | WireStartGroup)) - - err := o.enc_struct(p.sprop, b) - - if err != nil && !state.shouldContinue(err, nil) { - if err == ErrNil { - return errRepeatedHasNil - } - return err - } - - o.EncodeVarint(uint64((p.Tag << 3) | WireEndGroup)) - } - return state.err -} - -func size_slice_struct_group(p *Properties, base structPointer) (n int) { - s := structPointer_StructPointerSlice(base, p.field) - l := s.Len() - - n += l * sizeVarint(uint64((p.Tag<<3)|WireStartGroup)) - n += l * sizeVarint(uint64((p.Tag<<3)|WireEndGroup)) - for i := 0; i < l; i++ { - b := s.Index(i) - if structPointer_IsNil(b) { - return // return size up to this point - } - - n += size_struct(p.sprop, b) - } - return -} - -// Encode an extension map. -func (o *Buffer) enc_map(p *Properties, base structPointer) error { - exts := structPointer_ExtMap(base, p.field) - if err := encodeExtensionsMap(*exts); err != nil { - return err - } - - return o.enc_map_body(*exts) -} - -func (o *Buffer) enc_exts(p *Properties, base structPointer) error { - exts := structPointer_Extensions(base, p.field) - - v, mu := exts.extensionsRead() - if v == nil { - return nil - } - - mu.Lock() - defer mu.Unlock() - if err := encodeExtensionsMap(v); err != nil { - return err - } - - return o.enc_map_body(v) -} - -func (o *Buffer) enc_map_body(v map[int32]Extension) error { - // Fast-path for common cases: zero or one extensions. - if len(v) <= 1 { - for _, e := range v { - o.buf = append(o.buf, e.enc...) - } - return nil - } - - // Sort keys to provide a deterministic encoding. - keys := make([]int, 0, len(v)) - for k := range v { - keys = append(keys, int(k)) - } - sort.Ints(keys) - - for _, k := range keys { - o.buf = append(o.buf, v[int32(k)].enc...) - } - return nil -} - -func size_map(p *Properties, base structPointer) int { - v := structPointer_ExtMap(base, p.field) - return extensionsMapSize(*v) -} - -func size_exts(p *Properties, base structPointer) int { - v := structPointer_Extensions(base, p.field) - return extensionsSize(v) -} - -// Encode a map field. -func (o *Buffer) enc_new_map(p *Properties, base structPointer) error { - var state errorState // XXX: or do we need to plumb this through? - - /* - A map defined as - map map_field = N; - is encoded in the same way as - message MapFieldEntry { - key_type key = 1; - value_type value = 2; - } - repeated MapFieldEntry map_field = N; - */ - - v := structPointer_NewAt(base, p.field, p.mtype).Elem() // map[K]V - if v.Len() == 0 { - return nil - } - - keycopy, valcopy, keybase, valbase := mapEncodeScratch(p.mtype) - - enc := func() error { - if err := p.mkeyprop.enc(o, p.mkeyprop, keybase); err != nil { - return err - } - if err := p.mvalprop.enc(o, p.mvalprop, valbase); err != nil && err != ErrNil { - return err - } - return nil - } - - // Don't sort map keys. It is not required by the spec, and C++ doesn't do it. - for _, key := range v.MapKeys() { - val := v.MapIndex(key) - - keycopy.Set(key) - valcopy.Set(val) - - o.buf = append(o.buf, p.tagcode...) - if err := o.enc_len_thing(enc, &state); err != nil { - return err - } - } - return nil -} - -func size_new_map(p *Properties, base structPointer) int { - v := structPointer_NewAt(base, p.field, p.mtype).Elem() // map[K]V - - keycopy, valcopy, keybase, valbase := mapEncodeScratch(p.mtype) - - n := 0 - for _, key := range v.MapKeys() { - val := v.MapIndex(key) - keycopy.Set(key) - valcopy.Set(val) - - // Tag codes for key and val are the responsibility of the sub-sizer. - keysize := p.mkeyprop.size(p.mkeyprop, keybase) - valsize := p.mvalprop.size(p.mvalprop, valbase) - entry := keysize + valsize - // Add on tag code and length of map entry itself. - n += len(p.tagcode) + sizeVarint(uint64(entry)) + entry - } - return n -} - -// mapEncodeScratch returns a new reflect.Value matching the map's value type, -// and a structPointer suitable for passing to an encoder or sizer. -func mapEncodeScratch(mapType reflect.Type) (keycopy, valcopy reflect.Value, keybase, valbase structPointer) { - // Prepare addressable doubly-indirect placeholders for the key and value types. - // This is needed because the element-type encoders expect **T, but the map iteration produces T. - - keycopy = reflect.New(mapType.Key()).Elem() // addressable K - keyptr := reflect.New(reflect.PtrTo(keycopy.Type())).Elem() // addressable *K - keyptr.Set(keycopy.Addr()) // - keybase = toStructPointer(keyptr.Addr()) // **K - - // Value types are more varied and require special handling. - switch mapType.Elem().Kind() { - case reflect.Slice: - // []byte - var dummy []byte - valcopy = reflect.ValueOf(&dummy).Elem() // addressable []byte - valbase = toStructPointer(valcopy.Addr()) - case reflect.Ptr: - // message; the generated field type is map[K]*Msg (so V is *Msg), - // so we only need one level of indirection. - valcopy = reflect.New(mapType.Elem()).Elem() // addressable V - valbase = toStructPointer(valcopy.Addr()) - default: - // everything else - valcopy = reflect.New(mapType.Elem()).Elem() // addressable V - valptr := reflect.New(reflect.PtrTo(valcopy.Type())).Elem() // addressable *V - valptr.Set(valcopy.Addr()) // - valbase = toStructPointer(valptr.Addr()) // **V - } - return -} - -// Encode a struct. -func (o *Buffer) enc_struct(prop *StructProperties, base structPointer) error { - var state errorState - // Encode fields in tag order so that decoders may use optimizations - // that depend on the ordering. - // https://developers.google.com/protocol-buffers/docs/encoding#order - for _, i := range prop.order { - p := prop.Prop[i] - if p.enc != nil { - err := p.enc(o, p, base) - if err != nil { - if err == ErrNil { - if p.Required && state.err == nil { - state.err = &RequiredNotSetError{p.Name} - } - } else if err == errRepeatedHasNil { - // Give more context to nil values in repeated fields. - return errors.New("repeated field " + p.OrigName + " has nil element") - } else if !state.shouldContinue(err, p) { - return err - } - } - if len(o.buf) > maxMarshalSize { - return ErrTooLarge - } - } - } - - // Do oneof fields. - if prop.oneofMarshaler != nil { - m := structPointer_Interface(base, prop.stype).(Message) - if err := prop.oneofMarshaler(m, o); err == ErrNil { - return errOneofHasNil - } else if err != nil { - return err - } - } - - // Add unrecognized fields at the end. - if prop.unrecField.IsValid() { - v := *structPointer_Bytes(base, prop.unrecField) - if len(o.buf)+len(v) > maxMarshalSize { - return ErrTooLarge - } - if len(v) > 0 { - o.buf = append(o.buf, v...) - } - } - - return state.err -} - -func size_struct(prop *StructProperties, base structPointer) (n int) { - for _, i := range prop.order { - p := prop.Prop[i] - if p.size != nil { - n += p.size(p, base) - } - } - - // Add unrecognized fields at the end. - if prop.unrecField.IsValid() { - v := *structPointer_Bytes(base, prop.unrecField) - n += len(v) - } - - // Factor in any oneof fields. - if prop.oneofSizer != nil { - m := structPointer_Interface(base, prop.stype).(Message) - n += prop.oneofSizer(m) - } - - return -} - -var zeroes [20]byte // longer than any conceivable sizeVarint - -// Encode a struct, preceded by its encoded length (as a varint). -func (o *Buffer) enc_len_struct(prop *StructProperties, base structPointer, state *errorState) error { - return o.enc_len_thing(func() error { return o.enc_struct(prop, base) }, state) -} - -// Encode something, preceded by its encoded length (as a varint). -func (o *Buffer) enc_len_thing(enc func() error, state *errorState) error { - iLen := len(o.buf) - o.buf = append(o.buf, 0, 0, 0, 0) // reserve four bytes for length - iMsg := len(o.buf) - err := enc() - if err != nil && !state.shouldContinue(err, nil) { - return err - } - lMsg := len(o.buf) - iMsg - lLen := sizeVarint(uint64(lMsg)) - switch x := lLen - (iMsg - iLen); { - case x > 0: // actual length is x bytes larger than the space we reserved - // Move msg x bytes right. - o.buf = append(o.buf, zeroes[:x]...) - copy(o.buf[iMsg+x:], o.buf[iMsg:iMsg+lMsg]) - case x < 0: // actual length is x bytes smaller than the space we reserved - // Move msg x bytes left. - copy(o.buf[iMsg+x:], o.buf[iMsg:iMsg+lMsg]) - o.buf = o.buf[:len(o.buf)+x] // x is negative - } - // Encode the length in the reserved space. - o.buf = o.buf[:iLen] - o.EncodeVarint(uint64(lMsg)) - o.buf = o.buf[:len(o.buf)+lMsg] - return state.err -} - -// errorState maintains the first error that occurs and updates that error -// with additional context. -type errorState struct { - err error -} - -// shouldContinue reports whether encoding should continue upon encountering the -// given error. If the error is RequiredNotSetError, shouldContinue returns true -// and, if this is the first appearance of that error, remembers it for future -// reporting. -// -// If prop is not nil, it may update any error with additional context about the -// field with the error. -func (s *errorState) shouldContinue(err error, prop *Properties) bool { - // Ignore unset required fields. - reqNotSet, ok := err.(*RequiredNotSetError) - if !ok { - return false - } - if s.err == nil { - if prop != nil { - err = &RequiredNotSetError{prop.Name + "." + reqNotSet.field} - } - s.err = err - } - return true -} diff --git a/vendor/github.com/golang/protobuf/proto/equal.go b/vendor/github.com/golang/protobuf/proto/equal.go deleted file mode 100644 index 2ed1cf596..000000000 --- a/vendor/github.com/golang/protobuf/proto/equal.go +++ /dev/null @@ -1,300 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2011 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT -// OWNER 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. - -// Protocol buffer comparison. - -package proto - -import ( - "bytes" - "log" - "reflect" - "strings" -) - -/* -Equal returns true iff protocol buffers a and b are equal. -The arguments must both be pointers to protocol buffer structs. - -Equality is defined in this way: - - Two messages are equal iff they are the same type, - corresponding fields are equal, unknown field sets - are equal, and extensions sets are equal. - - Two set scalar fields are equal iff their values are equal. - If the fields are of a floating-point type, remember that - NaN != x for all x, including NaN. If the message is defined - in a proto3 .proto file, fields are not "set"; specifically, - zero length proto3 "bytes" fields are equal (nil == {}). - - Two repeated fields are equal iff their lengths are the same, - and their corresponding elements are equal. Note a "bytes" field, - although represented by []byte, is not a repeated field and the - rule for the scalar fields described above applies. - - Two unset fields are equal. - - Two unknown field sets are equal if their current - encoded state is equal. - - Two extension sets are equal iff they have corresponding - elements that are pairwise equal. - - Two map fields are equal iff their lengths are the same, - and they contain the same set of elements. Zero-length map - fields are equal. - - Every other combination of things are not equal. - -The return value is undefined if a and b are not protocol buffers. -*/ -func Equal(a, b Message) bool { - if a == nil || b == nil { - return a == b - } - v1, v2 := reflect.ValueOf(a), reflect.ValueOf(b) - if v1.Type() != v2.Type() { - return false - } - if v1.Kind() == reflect.Ptr { - if v1.IsNil() { - return v2.IsNil() - } - if v2.IsNil() { - return false - } - v1, v2 = v1.Elem(), v2.Elem() - } - if v1.Kind() != reflect.Struct { - return false - } - return equalStruct(v1, v2) -} - -// v1 and v2 are known to have the same type. -func equalStruct(v1, v2 reflect.Value) bool { - sprop := GetProperties(v1.Type()) - for i := 0; i < v1.NumField(); i++ { - f := v1.Type().Field(i) - if strings.HasPrefix(f.Name, "XXX_") { - continue - } - f1, f2 := v1.Field(i), v2.Field(i) - if f.Type.Kind() == reflect.Ptr { - if n1, n2 := f1.IsNil(), f2.IsNil(); n1 && n2 { - // both unset - continue - } else if n1 != n2 { - // set/unset mismatch - return false - } - b1, ok := f1.Interface().(raw) - if ok { - b2 := f2.Interface().(raw) - // RawMessage - if !bytes.Equal(b1.Bytes(), b2.Bytes()) { - return false - } - continue - } - f1, f2 = f1.Elem(), f2.Elem() - } - if !equalAny(f1, f2, sprop.Prop[i]) { - return false - } - } - - if em1 := v1.FieldByName("XXX_InternalExtensions"); em1.IsValid() { - em2 := v2.FieldByName("XXX_InternalExtensions") - if !equalExtensions(v1.Type(), em1.Interface().(XXX_InternalExtensions), em2.Interface().(XXX_InternalExtensions)) { - return false - } - } - - if em1 := v1.FieldByName("XXX_extensions"); em1.IsValid() { - em2 := v2.FieldByName("XXX_extensions") - if !equalExtMap(v1.Type(), em1.Interface().(map[int32]Extension), em2.Interface().(map[int32]Extension)) { - return false - } - } - - uf := v1.FieldByName("XXX_unrecognized") - if !uf.IsValid() { - return true - } - - u1 := uf.Bytes() - u2 := v2.FieldByName("XXX_unrecognized").Bytes() - if !bytes.Equal(u1, u2) { - return false - } - - return true -} - -// v1 and v2 are known to have the same type. -// prop may be nil. -func equalAny(v1, v2 reflect.Value, prop *Properties) bool { - if v1.Type() == protoMessageType { - m1, _ := v1.Interface().(Message) - m2, _ := v2.Interface().(Message) - return Equal(m1, m2) - } - switch v1.Kind() { - case reflect.Bool: - return v1.Bool() == v2.Bool() - case reflect.Float32, reflect.Float64: - return v1.Float() == v2.Float() - case reflect.Int32, reflect.Int64: - return v1.Int() == v2.Int() - case reflect.Interface: - // Probably a oneof field; compare the inner values. - n1, n2 := v1.IsNil(), v2.IsNil() - if n1 || n2 { - return n1 == n2 - } - e1, e2 := v1.Elem(), v2.Elem() - if e1.Type() != e2.Type() { - return false - } - return equalAny(e1, e2, nil) - case reflect.Map: - if v1.Len() != v2.Len() { - return false - } - for _, key := range v1.MapKeys() { - val2 := v2.MapIndex(key) - if !val2.IsValid() { - // This key was not found in the second map. - return false - } - if !equalAny(v1.MapIndex(key), val2, nil) { - return false - } - } - return true - case reflect.Ptr: - // Maps may have nil values in them, so check for nil. - if v1.IsNil() && v2.IsNil() { - return true - } - if v1.IsNil() != v2.IsNil() { - return false - } - return equalAny(v1.Elem(), v2.Elem(), prop) - case reflect.Slice: - if v1.Type().Elem().Kind() == reflect.Uint8 { - // short circuit: []byte - - // Edge case: if this is in a proto3 message, a zero length - // bytes field is considered the zero value. - if prop != nil && prop.proto3 && v1.Len() == 0 && v2.Len() == 0 { - return true - } - if v1.IsNil() != v2.IsNil() { - return false - } - return bytes.Equal(v1.Interface().([]byte), v2.Interface().([]byte)) - } - - if v1.Len() != v2.Len() { - return false - } - for i := 0; i < v1.Len(); i++ { - if !equalAny(v1.Index(i), v2.Index(i), prop) { - return false - } - } - return true - case reflect.String: - return v1.Interface().(string) == v2.Interface().(string) - case reflect.Struct: - return equalStruct(v1, v2) - case reflect.Uint32, reflect.Uint64: - return v1.Uint() == v2.Uint() - } - - // unknown type, so not a protocol buffer - log.Printf("proto: don't know how to compare %v", v1) - return false -} - -// base is the struct type that the extensions are based on. -// x1 and x2 are InternalExtensions. -func equalExtensions(base reflect.Type, x1, x2 XXX_InternalExtensions) bool { - em1, _ := x1.extensionsRead() - em2, _ := x2.extensionsRead() - return equalExtMap(base, em1, em2) -} - -func equalExtMap(base reflect.Type, em1, em2 map[int32]Extension) bool { - if len(em1) != len(em2) { - return false - } - - for extNum, e1 := range em1 { - e2, ok := em2[extNum] - if !ok { - return false - } - - m1, m2 := e1.value, e2.value - - if m1 != nil && m2 != nil { - // Both are unencoded. - if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) { - return false - } - continue - } - - // At least one is encoded. To do a semantically correct comparison - // we need to unmarshal them first. - var desc *ExtensionDesc - if m := extensionMaps[base]; m != nil { - desc = m[extNum] - } - if desc == nil { - log.Printf("proto: don't know how to compare extension %d of %v", extNum, base) - continue - } - var err error - if m1 == nil { - m1, err = decodeExtension(e1.enc, desc) - } - if m2 == nil && err == nil { - m2, err = decodeExtension(e2.enc, desc) - } - if err != nil { - // The encoded form is invalid. - log.Printf("proto: badly encoded extension %d of %v: %v", extNum, base, err) - return false - } - if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) { - return false - } - } - - return true -} diff --git a/vendor/github.com/golang/protobuf/proto/extensions.go b/vendor/github.com/golang/protobuf/proto/extensions.go deleted file mode 100644 index eaad21831..000000000 --- a/vendor/github.com/golang/protobuf/proto/extensions.go +++ /dev/null @@ -1,587 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT -// OWNER 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. - -package proto - -/* - * Types and routines for supporting protocol buffer extensions. - */ - -import ( - "errors" - "fmt" - "reflect" - "strconv" - "sync" -) - -// ErrMissingExtension is the error returned by GetExtension if the named extension is not in the message. -var ErrMissingExtension = errors.New("proto: missing extension") - -// ExtensionRange represents a range of message extensions for a protocol buffer. -// Used in code generated by the protocol compiler. -type ExtensionRange struct { - Start, End int32 // both inclusive -} - -// extendableProto is an interface implemented by any protocol buffer generated by the current -// proto compiler that may be extended. -type extendableProto interface { - Message - ExtensionRangeArray() []ExtensionRange - extensionsWrite() map[int32]Extension - extensionsRead() (map[int32]Extension, sync.Locker) -} - -// extendableProtoV1 is an interface implemented by a protocol buffer generated by the previous -// version of the proto compiler that may be extended. -type extendableProtoV1 interface { - Message - ExtensionRangeArray() []ExtensionRange - ExtensionMap() map[int32]Extension -} - -// extensionAdapter is a wrapper around extendableProtoV1 that implements extendableProto. -type extensionAdapter struct { - extendableProtoV1 -} - -func (e extensionAdapter) extensionsWrite() map[int32]Extension { - return e.ExtensionMap() -} - -func (e extensionAdapter) extensionsRead() (map[int32]Extension, sync.Locker) { - return e.ExtensionMap(), notLocker{} -} - -// notLocker is a sync.Locker whose Lock and Unlock methods are nops. -type notLocker struct{} - -func (n notLocker) Lock() {} -func (n notLocker) Unlock() {} - -// extendable returns the extendableProto interface for the given generated proto message. -// If the proto message has the old extension format, it returns a wrapper that implements -// the extendableProto interface. -func extendable(p interface{}) (extendableProto, bool) { - if ep, ok := p.(extendableProto); ok { - return ep, ok - } - if ep, ok := p.(extendableProtoV1); ok { - return extensionAdapter{ep}, ok - } - return nil, false -} - -// XXX_InternalExtensions is an internal representation of proto extensions. -// -// Each generated message struct type embeds an anonymous XXX_InternalExtensions field, -// thus gaining the unexported 'extensions' method, which can be called only from the proto package. -// -// The methods of XXX_InternalExtensions are not concurrency safe in general, -// but calls to logically read-only methods such as has and get may be executed concurrently. -type XXX_InternalExtensions struct { - // The struct must be indirect so that if a user inadvertently copies a - // generated message and its embedded XXX_InternalExtensions, they - // avoid the mayhem of a copied mutex. - // - // The mutex serializes all logically read-only operations to p.extensionMap. - // It is up to the client to ensure that write operations to p.extensionMap are - // mutually exclusive with other accesses. - p *struct { - mu sync.Mutex - extensionMap map[int32]Extension - } -} - -// extensionsWrite returns the extension map, creating it on first use. -func (e *XXX_InternalExtensions) extensionsWrite() map[int32]Extension { - if e.p == nil { - e.p = new(struct { - mu sync.Mutex - extensionMap map[int32]Extension - }) - e.p.extensionMap = make(map[int32]Extension) - } - return e.p.extensionMap -} - -// extensionsRead returns the extensions map for read-only use. It may be nil. -// The caller must hold the returned mutex's lock when accessing Elements within the map. -func (e *XXX_InternalExtensions) extensionsRead() (map[int32]Extension, sync.Locker) { - if e.p == nil { - return nil, nil - } - return e.p.extensionMap, &e.p.mu -} - -var extendableProtoType = reflect.TypeOf((*extendableProto)(nil)).Elem() -var extendableProtoV1Type = reflect.TypeOf((*extendableProtoV1)(nil)).Elem() - -// ExtensionDesc represents an extension specification. -// Used in generated code from the protocol compiler. -type ExtensionDesc struct { - ExtendedType Message // nil pointer to the type that is being extended - ExtensionType interface{} // nil pointer to the extension type - Field int32 // field number - Name string // fully-qualified name of extension, for text formatting - Tag string // protobuf tag style - Filename string // name of the file in which the extension is defined -} - -func (ed *ExtensionDesc) repeated() bool { - t := reflect.TypeOf(ed.ExtensionType) - return t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 -} - -// Extension represents an extension in a message. -type Extension struct { - // When an extension is stored in a message using SetExtension - // only desc and value are set. When the message is marshaled - // enc will be set to the encoded form of the message. - // - // When a message is unmarshaled and contains extensions, each - // extension will have only enc set. When such an extension is - // accessed using GetExtension (or GetExtensions) desc and value - // will be set. - desc *ExtensionDesc - value interface{} - enc []byte -} - -// SetRawExtension is for testing only. -func SetRawExtension(base Message, id int32, b []byte) { - epb, ok := extendable(base) - if !ok { - return - } - extmap := epb.extensionsWrite() - extmap[id] = Extension{enc: b} -} - -// isExtensionField returns true iff the given field number is in an extension range. -func isExtensionField(pb extendableProto, field int32) bool { - for _, er := range pb.ExtensionRangeArray() { - if er.Start <= field && field <= er.End { - return true - } - } - return false -} - -// checkExtensionTypes checks that the given extension is valid for pb. -func checkExtensionTypes(pb extendableProto, extension *ExtensionDesc) error { - var pbi interface{} = pb - // Check the extended type. - if ea, ok := pbi.(extensionAdapter); ok { - pbi = ea.extendableProtoV1 - } - if a, b := reflect.TypeOf(pbi), reflect.TypeOf(extension.ExtendedType); a != b { - return errors.New("proto: bad extended type; " + b.String() + " does not extend " + a.String()) - } - // Check the range. - if !isExtensionField(pb, extension.Field) { - return errors.New("proto: bad extension number; not in declared ranges") - } - return nil -} - -// extPropKey is sufficient to uniquely identify an extension. -type extPropKey struct { - base reflect.Type - field int32 -} - -var extProp = struct { - sync.RWMutex - m map[extPropKey]*Properties -}{ - m: make(map[extPropKey]*Properties), -} - -func extensionProperties(ed *ExtensionDesc) *Properties { - key := extPropKey{base: reflect.TypeOf(ed.ExtendedType), field: ed.Field} - - extProp.RLock() - if prop, ok := extProp.m[key]; ok { - extProp.RUnlock() - return prop - } - extProp.RUnlock() - - extProp.Lock() - defer extProp.Unlock() - // Check again. - if prop, ok := extProp.m[key]; ok { - return prop - } - - prop := new(Properties) - prop.Init(reflect.TypeOf(ed.ExtensionType), "unknown_name", ed.Tag, nil) - extProp.m[key] = prop - return prop -} - -// encode encodes any unmarshaled (unencoded) extensions in e. -func encodeExtensions(e *XXX_InternalExtensions) error { - m, mu := e.extensionsRead() - if m == nil { - return nil // fast path - } - mu.Lock() - defer mu.Unlock() - return encodeExtensionsMap(m) -} - -// encode encodes any unmarshaled (unencoded) extensions in e. -func encodeExtensionsMap(m map[int32]Extension) error { - for k, e := range m { - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - et := reflect.TypeOf(e.desc.ExtensionType) - props := extensionProperties(e.desc) - - p := NewBuffer(nil) - // If e.value has type T, the encoder expects a *struct{ X T }. - // Pass a *T with a zero field and hope it all works out. - x := reflect.New(et) - x.Elem().Set(reflect.ValueOf(e.value)) - if err := props.enc(p, props, toStructPointer(x)); err != nil { - return err - } - e.enc = p.buf - m[k] = e - } - return nil -} - -func extensionsSize(e *XXX_InternalExtensions) (n int) { - m, mu := e.extensionsRead() - if m == nil { - return 0 - } - mu.Lock() - defer mu.Unlock() - return extensionsMapSize(m) -} - -func extensionsMapSize(m map[int32]Extension) (n int) { - for _, e := range m { - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - n += len(e.enc) - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - et := reflect.TypeOf(e.desc.ExtensionType) - props := extensionProperties(e.desc) - - // If e.value has type T, the encoder expects a *struct{ X T }. - // Pass a *T with a zero field and hope it all works out. - x := reflect.New(et) - x.Elem().Set(reflect.ValueOf(e.value)) - n += props.size(props, toStructPointer(x)) - } - return -} - -// HasExtension returns whether the given extension is present in pb. -func HasExtension(pb Message, extension *ExtensionDesc) bool { - // TODO: Check types, field numbers, etc.? - epb, ok := extendable(pb) - if !ok { - return false - } - extmap, mu := epb.extensionsRead() - if extmap == nil { - return false - } - mu.Lock() - _, ok = extmap[extension.Field] - mu.Unlock() - return ok -} - -// ClearExtension removes the given extension from pb. -func ClearExtension(pb Message, extension *ExtensionDesc) { - epb, ok := extendable(pb) - if !ok { - return - } - // TODO: Check types, field numbers, etc.? - extmap := epb.extensionsWrite() - delete(extmap, extension.Field) -} - -// GetExtension parses and returns the given extension of pb. -// If the extension is not present and has no default value it returns ErrMissingExtension. -func GetExtension(pb Message, extension *ExtensionDesc) (interface{}, error) { - epb, ok := extendable(pb) - if !ok { - return nil, errors.New("proto: not an extendable proto") - } - - if err := checkExtensionTypes(epb, extension); err != nil { - return nil, err - } - - emap, mu := epb.extensionsRead() - if emap == nil { - return defaultExtensionValue(extension) - } - mu.Lock() - defer mu.Unlock() - e, ok := emap[extension.Field] - if !ok { - // defaultExtensionValue returns the default value or - // ErrMissingExtension if there is no default. - return defaultExtensionValue(extension) - } - - if e.value != nil { - // Already decoded. Check the descriptor, though. - if e.desc != extension { - // This shouldn't happen. If it does, it means that - // GetExtension was called twice with two different - // descriptors with the same field number. - return nil, errors.New("proto: descriptor conflict") - } - return e.value, nil - } - - v, err := decodeExtension(e.enc, extension) - if err != nil { - return nil, err - } - - // Remember the decoded version and drop the encoded version. - // That way it is safe to mutate what we return. - e.value = v - e.desc = extension - e.enc = nil - emap[extension.Field] = e - return e.value, nil -} - -// defaultExtensionValue returns the default value for extension. -// If no default for an extension is defined ErrMissingExtension is returned. -func defaultExtensionValue(extension *ExtensionDesc) (interface{}, error) { - t := reflect.TypeOf(extension.ExtensionType) - props := extensionProperties(extension) - - sf, _, err := fieldDefault(t, props) - if err != nil { - return nil, err - } - - if sf == nil || sf.value == nil { - // There is no default value. - return nil, ErrMissingExtension - } - - if t.Kind() != reflect.Ptr { - // We do not need to return a Ptr, we can directly return sf.value. - return sf.value, nil - } - - // We need to return an interface{} that is a pointer to sf.value. - value := reflect.New(t).Elem() - value.Set(reflect.New(value.Type().Elem())) - if sf.kind == reflect.Int32 { - // We may have an int32 or an enum, but the underlying data is int32. - // Since we can't set an int32 into a non int32 reflect.value directly - // set it as a int32. - value.Elem().SetInt(int64(sf.value.(int32))) - } else { - value.Elem().Set(reflect.ValueOf(sf.value)) - } - return value.Interface(), nil -} - -// decodeExtension decodes an extension encoded in b. -func decodeExtension(b []byte, extension *ExtensionDesc) (interface{}, error) { - o := NewBuffer(b) - - t := reflect.TypeOf(extension.ExtensionType) - - props := extensionProperties(extension) - - // t is a pointer to a struct, pointer to basic type or a slice. - // Allocate a "field" to store the pointer/slice itself; the - // pointer/slice will be stored here. We pass - // the address of this field to props.dec. - // This passes a zero field and a *t and lets props.dec - // interpret it as a *struct{ x t }. - value := reflect.New(t).Elem() - - for { - // Discard wire type and field number varint. It isn't needed. - if _, err := o.DecodeVarint(); err != nil { - return nil, err - } - - if err := props.dec(o, props, toStructPointer(value.Addr())); err != nil { - return nil, err - } - - if o.index >= len(o.buf) { - break - } - } - return value.Interface(), nil -} - -// GetExtensions returns a slice of the extensions present in pb that are also listed in es. -// The returned slice has the same length as es; missing extensions will appear as nil elements. -func GetExtensions(pb Message, es []*ExtensionDesc) (extensions []interface{}, err error) { - epb, ok := extendable(pb) - if !ok { - return nil, errors.New("proto: not an extendable proto") - } - extensions = make([]interface{}, len(es)) - for i, e := range es { - extensions[i], err = GetExtension(epb, e) - if err == ErrMissingExtension { - err = nil - } - if err != nil { - return - } - } - return -} - -// ExtensionDescs returns a new slice containing pb's extension descriptors, in undefined order. -// For non-registered extensions, ExtensionDescs returns an incomplete descriptor containing -// just the Field field, which defines the extension's field number. -func ExtensionDescs(pb Message) ([]*ExtensionDesc, error) { - epb, ok := extendable(pb) - if !ok { - return nil, fmt.Errorf("proto: %T is not an extendable proto.Message", pb) - } - registeredExtensions := RegisteredExtensions(pb) - - emap, mu := epb.extensionsRead() - if emap == nil { - return nil, nil - } - mu.Lock() - defer mu.Unlock() - extensions := make([]*ExtensionDesc, 0, len(emap)) - for extid, e := range emap { - desc := e.desc - if desc == nil { - desc = registeredExtensions[extid] - if desc == nil { - desc = &ExtensionDesc{Field: extid} - } - } - - extensions = append(extensions, desc) - } - return extensions, nil -} - -// SetExtension sets the specified extension of pb to the specified value. -func SetExtension(pb Message, extension *ExtensionDesc, value interface{}) error { - epb, ok := extendable(pb) - if !ok { - return errors.New("proto: not an extendable proto") - } - if err := checkExtensionTypes(epb, extension); err != nil { - return err - } - typ := reflect.TypeOf(extension.ExtensionType) - if typ != reflect.TypeOf(value) { - return errors.New("proto: bad extension value type") - } - // nil extension values need to be caught early, because the - // encoder can't distinguish an ErrNil due to a nil extension - // from an ErrNil due to a missing field. Extensions are - // always optional, so the encoder would just swallow the error - // and drop all the extensions from the encoded message. - if reflect.ValueOf(value).IsNil() { - return fmt.Errorf("proto: SetExtension called with nil value of type %T", value) - } - - extmap := epb.extensionsWrite() - extmap[extension.Field] = Extension{desc: extension, value: value} - return nil -} - -// ClearAllExtensions clears all extensions from pb. -func ClearAllExtensions(pb Message) { - epb, ok := extendable(pb) - if !ok { - return - } - m := epb.extensionsWrite() - for k := range m { - delete(m, k) - } -} - -// A global registry of extensions. -// The generated code will register the generated descriptors by calling RegisterExtension. - -var extensionMaps = make(map[reflect.Type]map[int32]*ExtensionDesc) - -// RegisterExtension is called from the generated code. -func RegisterExtension(desc *ExtensionDesc) { - st := reflect.TypeOf(desc.ExtendedType).Elem() - m := extensionMaps[st] - if m == nil { - m = make(map[int32]*ExtensionDesc) - extensionMaps[st] = m - } - if _, ok := m[desc.Field]; ok { - panic("proto: duplicate extension registered: " + st.String() + " " + strconv.Itoa(int(desc.Field))) - } - m[desc.Field] = desc -} - -// RegisteredExtensions returns a map of the registered extensions of a -// protocol buffer struct, indexed by the extension number. -// The argument pb should be a nil pointer to the struct type. -func RegisteredExtensions(pb Message) map[int32]*ExtensionDesc { - return extensionMaps[reflect.TypeOf(pb).Elem()] -} diff --git a/vendor/github.com/golang/protobuf/proto/lib.go b/vendor/github.com/golang/protobuf/proto/lib.go deleted file mode 100644 index ac4ddbc07..000000000 --- a/vendor/github.com/golang/protobuf/proto/lib.go +++ /dev/null @@ -1,898 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT -// OWNER 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. - -/* -Package proto converts data structures to and from the wire format of -protocol buffers. It works in concert with the Go source code generated -for .proto files by the protocol compiler. - -A summary of the properties of the protocol buffer interface -for a protocol buffer variable v: - - - Names are turned from camel_case to CamelCase for export. - - There are no methods on v to set fields; just treat - them as structure fields. - - There are getters that return a field's value if set, - and return the field's default value if unset. - The getters work even if the receiver is a nil message. - - The zero value for a struct is its correct initialization state. - All desired fields must be set before marshaling. - - A Reset() method will restore a protobuf struct to its zero state. - - Non-repeated fields are pointers to the values; nil means unset. - That is, optional or required field int32 f becomes F *int32. - - Repeated fields are slices. - - Helper functions are available to aid the setting of fields. - msg.Foo = proto.String("hello") // set field - - Constants are defined to hold the default values of all fields that - have them. They have the form Default_StructName_FieldName. - Because the getter methods handle defaulted values, - direct use of these constants should be rare. - - Enums are given type names and maps from names to values. - Enum values are prefixed by the enclosing message's name, or by the - enum's type name if it is a top-level enum. Enum types have a String - method, and a Enum method to assist in message construction. - - Nested messages, groups and enums have type names prefixed with the name of - the surrounding message type. - - Extensions are given descriptor names that start with E_, - followed by an underscore-delimited list of the nested messages - that contain it (if any) followed by the CamelCased name of the - extension field itself. HasExtension, ClearExtension, GetExtension - and SetExtension are functions for manipulating extensions. - - Oneof field sets are given a single field in their message, - with distinguished wrapper types for each possible field value. - - Marshal and Unmarshal are functions to encode and decode the wire format. - -When the .proto file specifies `syntax="proto3"`, there are some differences: - - - Non-repeated fields of non-message type are values instead of pointers. - - Getters are only generated for message and oneof fields. - - Enum types do not get an Enum method. - -The simplest way to describe this is to see an example. -Given file test.proto, containing - - package example; - - enum FOO { X = 17; } - - message Test { - required string label = 1; - optional int32 type = 2 [default=77]; - repeated int64 reps = 3; - optional group OptionalGroup = 4 { - required string RequiredField = 5; - } - oneof union { - int32 number = 6; - string name = 7; - } - } - -The resulting file, test.pb.go, is: - - package example - - import proto "github.com/golang/protobuf/proto" - import math "math" - - type FOO int32 - const ( - FOO_X FOO = 17 - ) - var FOO_name = map[int32]string{ - 17: "X", - } - var FOO_value = map[string]int32{ - "X": 17, - } - - func (x FOO) Enum() *FOO { - p := new(FOO) - *p = x - return p - } - func (x FOO) String() string { - return proto.EnumName(FOO_name, int32(x)) - } - func (x *FOO) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(FOO_value, data) - if err != nil { - return err - } - *x = FOO(value) - return nil - } - - type Test struct { - Label *string `protobuf:"bytes,1,req,name=label" json:"label,omitempty"` - Type *int32 `protobuf:"varint,2,opt,name=type,def=77" json:"type,omitempty"` - Reps []int64 `protobuf:"varint,3,rep,name=reps" json:"reps,omitempty"` - Optionalgroup *Test_OptionalGroup `protobuf:"group,4,opt,name=OptionalGroup" json:"optionalgroup,omitempty"` - // Types that are valid to be assigned to Union: - // *Test_Number - // *Test_Name - Union isTest_Union `protobuf_oneof:"union"` - XXX_unrecognized []byte `json:"-"` - } - func (m *Test) Reset() { *m = Test{} } - func (m *Test) String() string { return proto.CompactTextString(m) } - func (*Test) ProtoMessage() {} - - type isTest_Union interface { - isTest_Union() - } - - type Test_Number struct { - Number int32 `protobuf:"varint,6,opt,name=number"` - } - type Test_Name struct { - Name string `protobuf:"bytes,7,opt,name=name"` - } - - func (*Test_Number) isTest_Union() {} - func (*Test_Name) isTest_Union() {} - - func (m *Test) GetUnion() isTest_Union { - if m != nil { - return m.Union - } - return nil - } - const Default_Test_Type int32 = 77 - - func (m *Test) GetLabel() string { - if m != nil && m.Label != nil { - return *m.Label - } - return "" - } - - func (m *Test) GetType() int32 { - if m != nil && m.Type != nil { - return *m.Type - } - return Default_Test_Type - } - - func (m *Test) GetOptionalgroup() *Test_OptionalGroup { - if m != nil { - return m.Optionalgroup - } - return nil - } - - type Test_OptionalGroup struct { - RequiredField *string `protobuf:"bytes,5,req" json:"RequiredField,omitempty"` - } - func (m *Test_OptionalGroup) Reset() { *m = Test_OptionalGroup{} } - func (m *Test_OptionalGroup) String() string { return proto.CompactTextString(m) } - - func (m *Test_OptionalGroup) GetRequiredField() string { - if m != nil && m.RequiredField != nil { - return *m.RequiredField - } - return "" - } - - func (m *Test) GetNumber() int32 { - if x, ok := m.GetUnion().(*Test_Number); ok { - return x.Number - } - return 0 - } - - func (m *Test) GetName() string { - if x, ok := m.GetUnion().(*Test_Name); ok { - return x.Name - } - return "" - } - - func init() { - proto.RegisterEnum("example.FOO", FOO_name, FOO_value) - } - -To create and play with a Test object: - - package main - - import ( - "log" - - "github.com/golang/protobuf/proto" - pb "./example.pb" - ) - - func main() { - test := &pb.Test{ - Label: proto.String("hello"), - Type: proto.Int32(17), - Reps: []int64{1, 2, 3}, - Optionalgroup: &pb.Test_OptionalGroup{ - RequiredField: proto.String("good bye"), - }, - Union: &pb.Test_Name{"fred"}, - } - data, err := proto.Marshal(test) - if err != nil { - log.Fatal("marshaling error: ", err) - } - newTest := &pb.Test{} - err = proto.Unmarshal(data, newTest) - if err != nil { - log.Fatal("unmarshaling error: ", err) - } - // Now test and newTest contain the same data. - if test.GetLabel() != newTest.GetLabel() { - log.Fatalf("data mismatch %q != %q", test.GetLabel(), newTest.GetLabel()) - } - // Use a type switch to determine which oneof was set. - switch u := test.Union.(type) { - case *pb.Test_Number: // u.Number contains the number. - case *pb.Test_Name: // u.Name contains the string. - } - // etc. - } -*/ -package proto - -import ( - "encoding/json" - "fmt" - "log" - "reflect" - "sort" - "strconv" - "sync" -) - -// Message is implemented by generated protocol buffer messages. -type Message interface { - Reset() - String() string - ProtoMessage() -} - -// Stats records allocation details about the protocol buffer encoders -// and decoders. Useful for tuning the library itself. -type Stats struct { - Emalloc uint64 // mallocs in encode - Dmalloc uint64 // mallocs in decode - Encode uint64 // number of encodes - Decode uint64 // number of decodes - Chit uint64 // number of cache hits - Cmiss uint64 // number of cache misses - Size uint64 // number of sizes -} - -// Set to true to enable stats collection. -const collectStats = false - -var stats Stats - -// GetStats returns a copy of the global Stats structure. -func GetStats() Stats { return stats } - -// A Buffer is a buffer manager for marshaling and unmarshaling -// protocol buffers. It may be reused between invocations to -// reduce memory usage. It is not necessary to use a Buffer; -// the global functions Marshal and Unmarshal create a -// temporary Buffer and are fine for most applications. -type Buffer struct { - buf []byte // encode/decode byte stream - index int // read point - - // pools of basic types to amortize allocation. - bools []bool - uint32s []uint32 - uint64s []uint64 - - // extra pools, only used with pointer_reflect.go - int32s []int32 - int64s []int64 - float32s []float32 - float64s []float64 -} - -// NewBuffer allocates a new Buffer and initializes its internal data to -// the contents of the argument slice. -func NewBuffer(e []byte) *Buffer { - return &Buffer{buf: e} -} - -// Reset resets the Buffer, ready for marshaling a new protocol buffer. -func (p *Buffer) Reset() { - p.buf = p.buf[0:0] // for reading/writing - p.index = 0 // for reading -} - -// SetBuf replaces the internal buffer with the slice, -// ready for unmarshaling the contents of the slice. -func (p *Buffer) SetBuf(s []byte) { - p.buf = s - p.index = 0 -} - -// Bytes returns the contents of the Buffer. -func (p *Buffer) Bytes() []byte { return p.buf } - -/* - * Helper routines for simplifying the creation of optional fields of basic type. - */ - -// Bool is a helper routine that allocates a new bool value -// to store v and returns a pointer to it. -func Bool(v bool) *bool { - return &v -} - -// Int32 is a helper routine that allocates a new int32 value -// to store v and returns a pointer to it. -func Int32(v int32) *int32 { - return &v -} - -// Int is a helper routine that allocates a new int32 value -// to store v and returns a pointer to it, but unlike Int32 -// its argument value is an int. -func Int(v int) *int32 { - p := new(int32) - *p = int32(v) - return p -} - -// Int64 is a helper routine that allocates a new int64 value -// to store v and returns a pointer to it. -func Int64(v int64) *int64 { - return &v -} - -// Float32 is a helper routine that allocates a new float32 value -// to store v and returns a pointer to it. -func Float32(v float32) *float32 { - return &v -} - -// Float64 is a helper routine that allocates a new float64 value -// to store v and returns a pointer to it. -func Float64(v float64) *float64 { - return &v -} - -// Uint32 is a helper routine that allocates a new uint32 value -// to store v and returns a pointer to it. -func Uint32(v uint32) *uint32 { - return &v -} - -// Uint64 is a helper routine that allocates a new uint64 value -// to store v and returns a pointer to it. -func Uint64(v uint64) *uint64 { - return &v -} - -// String is a helper routine that allocates a new string value -// to store v and returns a pointer to it. -func String(v string) *string { - return &v -} - -// EnumName is a helper function to simplify printing protocol buffer enums -// by name. Given an enum map and a value, it returns a useful string. -func EnumName(m map[int32]string, v int32) string { - s, ok := m[v] - if ok { - return s - } - return strconv.Itoa(int(v)) -} - -// UnmarshalJSONEnum is a helper function to simplify recovering enum int values -// from their JSON-encoded representation. Given a map from the enum's symbolic -// names to its int values, and a byte buffer containing the JSON-encoded -// value, it returns an int32 that can be cast to the enum type by the caller. -// -// The function can deal with both JSON representations, numeric and symbolic. -func UnmarshalJSONEnum(m map[string]int32, data []byte, enumName string) (int32, error) { - if data[0] == '"' { - // New style: enums are strings. - var repr string - if err := json.Unmarshal(data, &repr); err != nil { - return -1, err - } - val, ok := m[repr] - if !ok { - return 0, fmt.Errorf("unrecognized enum %s value %q", enumName, repr) - } - return val, nil - } - // Old style: enums are ints. - var val int32 - if err := json.Unmarshal(data, &val); err != nil { - return 0, fmt.Errorf("cannot unmarshal %#q into enum %s", data, enumName) - } - return val, nil -} - -// DebugPrint dumps the encoded data in b in a debugging format with a header -// including the string s. Used in testing but made available for general debugging. -func (p *Buffer) DebugPrint(s string, b []byte) { - var u uint64 - - obuf := p.buf - index := p.index - p.buf = b - p.index = 0 - depth := 0 - - fmt.Printf("\n--- %s ---\n", s) - -out: - for { - for i := 0; i < depth; i++ { - fmt.Print(" ") - } - - index := p.index - if index == len(p.buf) { - break - } - - op, err := p.DecodeVarint() - if err != nil { - fmt.Printf("%3d: fetching op err %v\n", index, err) - break out - } - tag := op >> 3 - wire := op & 7 - - switch wire { - default: - fmt.Printf("%3d: t=%3d unknown wire=%d\n", - index, tag, wire) - break out - - case WireBytes: - var r []byte - - r, err = p.DecodeRawBytes(false) - if err != nil { - break out - } - fmt.Printf("%3d: t=%3d bytes [%d]", index, tag, len(r)) - if len(r) <= 6 { - for i := 0; i < len(r); i++ { - fmt.Printf(" %.2x", r[i]) - } - } else { - for i := 0; i < 3; i++ { - fmt.Printf(" %.2x", r[i]) - } - fmt.Printf(" ..") - for i := len(r) - 3; i < len(r); i++ { - fmt.Printf(" %.2x", r[i]) - } - } - fmt.Printf("\n") - - case WireFixed32: - u, err = p.DecodeFixed32() - if err != nil { - fmt.Printf("%3d: t=%3d fix32 err %v\n", index, tag, err) - break out - } - fmt.Printf("%3d: t=%3d fix32 %d\n", index, tag, u) - - case WireFixed64: - u, err = p.DecodeFixed64() - if err != nil { - fmt.Printf("%3d: t=%3d fix64 err %v\n", index, tag, err) - break out - } - fmt.Printf("%3d: t=%3d fix64 %d\n", index, tag, u) - - case WireVarint: - u, err = p.DecodeVarint() - if err != nil { - fmt.Printf("%3d: t=%3d varint err %v\n", index, tag, err) - break out - } - fmt.Printf("%3d: t=%3d varint %d\n", index, tag, u) - - case WireStartGroup: - fmt.Printf("%3d: t=%3d start\n", index, tag) - depth++ - - case WireEndGroup: - depth-- - fmt.Printf("%3d: t=%3d end\n", index, tag) - } - } - - if depth != 0 { - fmt.Printf("%3d: start-end not balanced %d\n", p.index, depth) - } - fmt.Printf("\n") - - p.buf = obuf - p.index = index -} - -// SetDefaults sets unset protocol buffer fields to their default values. -// It only modifies fields that are both unset and have defined defaults. -// It recursively sets default values in any non-nil sub-messages. -func SetDefaults(pb Message) { - setDefaults(reflect.ValueOf(pb), true, false) -} - -// v is a pointer to a struct. -func setDefaults(v reflect.Value, recur, zeros bool) { - v = v.Elem() - - defaultMu.RLock() - dm, ok := defaults[v.Type()] - defaultMu.RUnlock() - if !ok { - dm = buildDefaultMessage(v.Type()) - defaultMu.Lock() - defaults[v.Type()] = dm - defaultMu.Unlock() - } - - for _, sf := range dm.scalars { - f := v.Field(sf.index) - if !f.IsNil() { - // field already set - continue - } - dv := sf.value - if dv == nil && !zeros { - // no explicit default, and don't want to set zeros - continue - } - fptr := f.Addr().Interface() // **T - // TODO: Consider batching the allocations we do here. - switch sf.kind { - case reflect.Bool: - b := new(bool) - if dv != nil { - *b = dv.(bool) - } - *(fptr.(**bool)) = b - case reflect.Float32: - f := new(float32) - if dv != nil { - *f = dv.(float32) - } - *(fptr.(**float32)) = f - case reflect.Float64: - f := new(float64) - if dv != nil { - *f = dv.(float64) - } - *(fptr.(**float64)) = f - case reflect.Int32: - // might be an enum - if ft := f.Type(); ft != int32PtrType { - // enum - f.Set(reflect.New(ft.Elem())) - if dv != nil { - f.Elem().SetInt(int64(dv.(int32))) - } - } else { - // int32 field - i := new(int32) - if dv != nil { - *i = dv.(int32) - } - *(fptr.(**int32)) = i - } - case reflect.Int64: - i := new(int64) - if dv != nil { - *i = dv.(int64) - } - *(fptr.(**int64)) = i - case reflect.String: - s := new(string) - if dv != nil { - *s = dv.(string) - } - *(fptr.(**string)) = s - case reflect.Uint8: - // exceptional case: []byte - var b []byte - if dv != nil { - db := dv.([]byte) - b = make([]byte, len(db)) - copy(b, db) - } else { - b = []byte{} - } - *(fptr.(*[]byte)) = b - case reflect.Uint32: - u := new(uint32) - if dv != nil { - *u = dv.(uint32) - } - *(fptr.(**uint32)) = u - case reflect.Uint64: - u := new(uint64) - if dv != nil { - *u = dv.(uint64) - } - *(fptr.(**uint64)) = u - default: - log.Printf("proto: can't set default for field %v (sf.kind=%v)", f, sf.kind) - } - } - - for _, ni := range dm.nested { - f := v.Field(ni) - // f is *T or []*T or map[T]*T - switch f.Kind() { - case reflect.Ptr: - if f.IsNil() { - continue - } - setDefaults(f, recur, zeros) - - case reflect.Slice: - for i := 0; i < f.Len(); i++ { - e := f.Index(i) - if e.IsNil() { - continue - } - setDefaults(e, recur, zeros) - } - - case reflect.Map: - for _, k := range f.MapKeys() { - e := f.MapIndex(k) - if e.IsNil() { - continue - } - setDefaults(e, recur, zeros) - } - } - } -} - -var ( - // defaults maps a protocol buffer struct type to a slice of the fields, - // with its scalar fields set to their proto-declared non-zero default values. - defaultMu sync.RWMutex - defaults = make(map[reflect.Type]defaultMessage) - - int32PtrType = reflect.TypeOf((*int32)(nil)) -) - -// defaultMessage represents information about the default values of a message. -type defaultMessage struct { - scalars []scalarField - nested []int // struct field index of nested messages -} - -type scalarField struct { - index int // struct field index - kind reflect.Kind // element type (the T in *T or []T) - value interface{} // the proto-declared default value, or nil -} - -// t is a struct type. -func buildDefaultMessage(t reflect.Type) (dm defaultMessage) { - sprop := GetProperties(t) - for _, prop := range sprop.Prop { - fi, ok := sprop.decoderTags.get(prop.Tag) - if !ok { - // XXX_unrecognized - continue - } - ft := t.Field(fi).Type - - sf, nested, err := fieldDefault(ft, prop) - switch { - case err != nil: - log.Print(err) - case nested: - dm.nested = append(dm.nested, fi) - case sf != nil: - sf.index = fi - dm.scalars = append(dm.scalars, *sf) - } - } - - return dm -} - -// fieldDefault returns the scalarField for field type ft. -// sf will be nil if the field can not have a default. -// nestedMessage will be true if this is a nested message. -// Note that sf.index is not set on return. -func fieldDefault(ft reflect.Type, prop *Properties) (sf *scalarField, nestedMessage bool, err error) { - var canHaveDefault bool - switch ft.Kind() { - case reflect.Ptr: - if ft.Elem().Kind() == reflect.Struct { - nestedMessage = true - } else { - canHaveDefault = true // proto2 scalar field - } - - case reflect.Slice: - switch ft.Elem().Kind() { - case reflect.Ptr: - nestedMessage = true // repeated message - case reflect.Uint8: - canHaveDefault = true // bytes field - } - - case reflect.Map: - if ft.Elem().Kind() == reflect.Ptr { - nestedMessage = true // map with message values - } - } - - if !canHaveDefault { - if nestedMessage { - return nil, true, nil - } - return nil, false, nil - } - - // We now know that ft is a pointer or slice. - sf = &scalarField{kind: ft.Elem().Kind()} - - // scalar fields without defaults - if !prop.HasDefault { - return sf, false, nil - } - - // a scalar field: either *T or []byte - switch ft.Elem().Kind() { - case reflect.Bool: - x, err := strconv.ParseBool(prop.Default) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default bool %q: %v", prop.Default, err) - } - sf.value = x - case reflect.Float32: - x, err := strconv.ParseFloat(prop.Default, 32) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default float32 %q: %v", prop.Default, err) - } - sf.value = float32(x) - case reflect.Float64: - x, err := strconv.ParseFloat(prop.Default, 64) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default float64 %q: %v", prop.Default, err) - } - sf.value = x - case reflect.Int32: - x, err := strconv.ParseInt(prop.Default, 10, 32) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default int32 %q: %v", prop.Default, err) - } - sf.value = int32(x) - case reflect.Int64: - x, err := strconv.ParseInt(prop.Default, 10, 64) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default int64 %q: %v", prop.Default, err) - } - sf.value = x - case reflect.String: - sf.value = prop.Default - case reflect.Uint8: - // []byte (not *uint8) - sf.value = []byte(prop.Default) - case reflect.Uint32: - x, err := strconv.ParseUint(prop.Default, 10, 32) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default uint32 %q: %v", prop.Default, err) - } - sf.value = uint32(x) - case reflect.Uint64: - x, err := strconv.ParseUint(prop.Default, 10, 64) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default uint64 %q: %v", prop.Default, err) - } - sf.value = x - default: - return nil, false, fmt.Errorf("proto: unhandled def kind %v", ft.Elem().Kind()) - } - - return sf, false, nil -} - -// Map fields may have key types of non-float scalars, strings and enums. -// The easiest way to sort them in some deterministic order is to use fmt. -// If this turns out to be inefficient we can always consider other options, -// such as doing a Schwartzian transform. - -func mapKeys(vs []reflect.Value) sort.Interface { - s := mapKeySorter{ - vs: vs, - // default Less function: textual comparison - less: func(a, b reflect.Value) bool { - return fmt.Sprint(a.Interface()) < fmt.Sprint(b.Interface()) - }, - } - - // Type specialization per https://developers.google.com/protocol-buffers/docs/proto#maps; - // numeric keys are sorted numerically. - if len(vs) == 0 { - return s - } - switch vs[0].Kind() { - case reflect.Int32, reflect.Int64: - s.less = func(a, b reflect.Value) bool { return a.Int() < b.Int() } - case reflect.Uint32, reflect.Uint64: - s.less = func(a, b reflect.Value) bool { return a.Uint() < b.Uint() } - } - - return s -} - -type mapKeySorter struct { - vs []reflect.Value - less func(a, b reflect.Value) bool -} - -func (s mapKeySorter) Len() int { return len(s.vs) } -func (s mapKeySorter) Swap(i, j int) { s.vs[i], s.vs[j] = s.vs[j], s.vs[i] } -func (s mapKeySorter) Less(i, j int) bool { - return s.less(s.vs[i], s.vs[j]) -} - -// isProto3Zero reports whether v is a zero proto3 value. -func isProto3Zero(v reflect.Value) bool { - switch v.Kind() { - case reflect.Bool: - return !v.Bool() - case reflect.Int32, reflect.Int64: - return v.Int() == 0 - case reflect.Uint32, reflect.Uint64: - return v.Uint() == 0 - case reflect.Float32, reflect.Float64: - return v.Float() == 0 - case reflect.String: - return v.String() == "" - } - return false -} - -// ProtoPackageIsVersion2 is referenced from generated protocol buffer files -// to assert that that code is compatible with this version of the proto package. -const ProtoPackageIsVersion2 = true - -// ProtoPackageIsVersion1 is referenced from generated protocol buffer files -// to assert that that code is compatible with this version of the proto package. -const ProtoPackageIsVersion1 = true diff --git a/vendor/github.com/golang/protobuf/proto/message_set.go b/vendor/github.com/golang/protobuf/proto/message_set.go deleted file mode 100644 index fd982decd..000000000 --- a/vendor/github.com/golang/protobuf/proto/message_set.go +++ /dev/null @@ -1,311 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT -// OWNER 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. - -package proto - -/* - * Support for message sets. - */ - -import ( - "bytes" - "encoding/json" - "errors" - "fmt" - "reflect" - "sort" -) - -// errNoMessageTypeID occurs when a protocol buffer does not have a message type ID. -// A message type ID is required for storing a protocol buffer in a message set. -var errNoMessageTypeID = errors.New("proto does not have a message type ID") - -// The first two types (_MessageSet_Item and messageSet) -// model what the protocol compiler produces for the following protocol message: -// message MessageSet { -// repeated group Item = 1 { -// required int32 type_id = 2; -// required string message = 3; -// }; -// } -// That is the MessageSet wire format. We can't use a proto to generate these -// because that would introduce a circular dependency between it and this package. - -type _MessageSet_Item struct { - TypeId *int32 `protobuf:"varint,2,req,name=type_id"` - Message []byte `protobuf:"bytes,3,req,name=message"` -} - -type messageSet struct { - Item []*_MessageSet_Item `protobuf:"group,1,rep"` - XXX_unrecognized []byte - // TODO: caching? -} - -// Make sure messageSet is a Message. -var _ Message = (*messageSet)(nil) - -// messageTypeIder is an interface satisfied by a protocol buffer type -// that may be stored in a MessageSet. -type messageTypeIder interface { - MessageTypeId() int32 -} - -func (ms *messageSet) find(pb Message) *_MessageSet_Item { - mti, ok := pb.(messageTypeIder) - if !ok { - return nil - } - id := mti.MessageTypeId() - for _, item := range ms.Item { - if *item.TypeId == id { - return item - } - } - return nil -} - -func (ms *messageSet) Has(pb Message) bool { - if ms.find(pb) != nil { - return true - } - return false -} - -func (ms *messageSet) Unmarshal(pb Message) error { - if item := ms.find(pb); item != nil { - return Unmarshal(item.Message, pb) - } - if _, ok := pb.(messageTypeIder); !ok { - return errNoMessageTypeID - } - return nil // TODO: return error instead? -} - -func (ms *messageSet) Marshal(pb Message) error { - msg, err := Marshal(pb) - if err != nil { - return err - } - if item := ms.find(pb); item != nil { - // reuse existing item - item.Message = msg - return nil - } - - mti, ok := pb.(messageTypeIder) - if !ok { - return errNoMessageTypeID - } - - mtid := mti.MessageTypeId() - ms.Item = append(ms.Item, &_MessageSet_Item{ - TypeId: &mtid, - Message: msg, - }) - return nil -} - -func (ms *messageSet) Reset() { *ms = messageSet{} } -func (ms *messageSet) String() string { return CompactTextString(ms) } -func (*messageSet) ProtoMessage() {} - -// Support for the message_set_wire_format message option. - -func skipVarint(buf []byte) []byte { - i := 0 - for ; buf[i]&0x80 != 0; i++ { - } - return buf[i+1:] -} - -// MarshalMessageSet encodes the extension map represented by m in the message set wire format. -// It is called by generated Marshal methods on protocol buffer messages with the message_set_wire_format option. -func MarshalMessageSet(exts interface{}) ([]byte, error) { - var m map[int32]Extension - switch exts := exts.(type) { - case *XXX_InternalExtensions: - if err := encodeExtensions(exts); err != nil { - return nil, err - } - m, _ = exts.extensionsRead() - case map[int32]Extension: - if err := encodeExtensionsMap(exts); err != nil { - return nil, err - } - m = exts - default: - return nil, errors.New("proto: not an extension map") - } - - // Sort extension IDs to provide a deterministic encoding. - // See also enc_map in encode.go. - ids := make([]int, 0, len(m)) - for id := range m { - ids = append(ids, int(id)) - } - sort.Ints(ids) - - ms := &messageSet{Item: make([]*_MessageSet_Item, 0, len(m))} - for _, id := range ids { - e := m[int32(id)] - // Remove the wire type and field number varint, as well as the length varint. - msg := skipVarint(skipVarint(e.enc)) - - ms.Item = append(ms.Item, &_MessageSet_Item{ - TypeId: Int32(int32(id)), - Message: msg, - }) - } - return Marshal(ms) -} - -// UnmarshalMessageSet decodes the extension map encoded in buf in the message set wire format. -// It is called by generated Unmarshal methods on protocol buffer messages with the message_set_wire_format option. -func UnmarshalMessageSet(buf []byte, exts interface{}) error { - var m map[int32]Extension - switch exts := exts.(type) { - case *XXX_InternalExtensions: - m = exts.extensionsWrite() - case map[int32]Extension: - m = exts - default: - return errors.New("proto: not an extension map") - } - - ms := new(messageSet) - if err := Unmarshal(buf, ms); err != nil { - return err - } - for _, item := range ms.Item { - id := *item.TypeId - msg := item.Message - - // Restore wire type and field number varint, plus length varint. - // Be careful to preserve duplicate items. - b := EncodeVarint(uint64(id)<<3 | WireBytes) - if ext, ok := m[id]; ok { - // Existing data; rip off the tag and length varint - // so we join the new data correctly. - // We can assume that ext.enc is set because we are unmarshaling. - o := ext.enc[len(b):] // skip wire type and field number - _, n := DecodeVarint(o) // calculate length of length varint - o = o[n:] // skip length varint - msg = append(o, msg...) // join old data and new data - } - b = append(b, EncodeVarint(uint64(len(msg)))...) - b = append(b, msg...) - - m[id] = Extension{enc: b} - } - return nil -} - -// MarshalMessageSetJSON encodes the extension map represented by m in JSON format. -// It is called by generated MarshalJSON methods on protocol buffer messages with the message_set_wire_format option. -func MarshalMessageSetJSON(exts interface{}) ([]byte, error) { - var m map[int32]Extension - switch exts := exts.(type) { - case *XXX_InternalExtensions: - m, _ = exts.extensionsRead() - case map[int32]Extension: - m = exts - default: - return nil, errors.New("proto: not an extension map") - } - var b bytes.Buffer - b.WriteByte('{') - - // Process the map in key order for deterministic output. - ids := make([]int32, 0, len(m)) - for id := range m { - ids = append(ids, id) - } - sort.Sort(int32Slice(ids)) // int32Slice defined in text.go - - for i, id := range ids { - ext := m[id] - if i > 0 { - b.WriteByte(',') - } - - msd, ok := messageSetMap[id] - if !ok { - // Unknown type; we can't render it, so skip it. - continue - } - fmt.Fprintf(&b, `"[%s]":`, msd.name) - - x := ext.value - if x == nil { - x = reflect.New(msd.t.Elem()).Interface() - if err := Unmarshal(ext.enc, x.(Message)); err != nil { - return nil, err - } - } - d, err := json.Marshal(x) - if err != nil { - return nil, err - } - b.Write(d) - } - b.WriteByte('}') - return b.Bytes(), nil -} - -// UnmarshalMessageSetJSON decodes the extension map encoded in buf in JSON format. -// It is called by generated UnmarshalJSON methods on protocol buffer messages with the message_set_wire_format option. -func UnmarshalMessageSetJSON(buf []byte, exts interface{}) error { - // Common-case fast path. - if len(buf) == 0 || bytes.Equal(buf, []byte("{}")) { - return nil - } - - // This is fairly tricky, and it's not clear that it is needed. - return errors.New("TODO: UnmarshalMessageSetJSON not yet implemented") -} - -// A global registry of types that can be used in a MessageSet. - -var messageSetMap = make(map[int32]messageSetDesc) - -type messageSetDesc struct { - t reflect.Type // pointer to struct - name string -} - -// RegisterMessageSetType is called from the generated code. -func RegisterMessageSetType(m Message, fieldNum int32, name string) { - messageSetMap[fieldNum] = messageSetDesc{ - t: reflect.TypeOf(m), - name: name, - } -} diff --git a/vendor/github.com/golang/protobuf/proto/pointer_reflect.go b/vendor/github.com/golang/protobuf/proto/pointer_reflect.go deleted file mode 100644 index fb512e2e1..000000000 --- a/vendor/github.com/golang/protobuf/proto/pointer_reflect.go +++ /dev/null @@ -1,484 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2012 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT -// OWNER 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. - -// +build appengine js - -// This file contains an implementation of proto field accesses using package reflect. -// It is slower than the code in pointer_unsafe.go but it avoids package unsafe and can -// be used on App Engine. - -package proto - -import ( - "math" - "reflect" -) - -// A structPointer is a pointer to a struct. -type structPointer struct { - v reflect.Value -} - -// toStructPointer returns a structPointer equivalent to the given reflect value. -// The reflect value must itself be a pointer to a struct. -func toStructPointer(v reflect.Value) structPointer { - return structPointer{v} -} - -// IsNil reports whether p is nil. -func structPointer_IsNil(p structPointer) bool { - return p.v.IsNil() -} - -// Interface returns the struct pointer as an interface value. -func structPointer_Interface(p structPointer, _ reflect.Type) interface{} { - return p.v.Interface() -} - -// A field identifies a field in a struct, accessible from a structPointer. -// In this implementation, a field is identified by the sequence of field indices -// passed to reflect's FieldByIndex. -type field []int - -// toField returns a field equivalent to the given reflect field. -func toField(f *reflect.StructField) field { - return f.Index -} - -// invalidField is an invalid field identifier. -var invalidField = field(nil) - -// IsValid reports whether the field identifier is valid. -func (f field) IsValid() bool { return f != nil } - -// field returns the given field in the struct as a reflect value. -func structPointer_field(p structPointer, f field) reflect.Value { - // Special case: an extension map entry with a value of type T - // passes a *T to the struct-handling code with a zero field, - // expecting that it will be treated as equivalent to *struct{ X T }, - // which has the same memory layout. We have to handle that case - // specially, because reflect will panic if we call FieldByIndex on a - // non-struct. - if f == nil { - return p.v.Elem() - } - - return p.v.Elem().FieldByIndex(f) -} - -// ifield returns the given field in the struct as an interface value. -func structPointer_ifield(p structPointer, f field) interface{} { - return structPointer_field(p, f).Addr().Interface() -} - -// Bytes returns the address of a []byte field in the struct. -func structPointer_Bytes(p structPointer, f field) *[]byte { - return structPointer_ifield(p, f).(*[]byte) -} - -// BytesSlice returns the address of a [][]byte field in the struct. -func structPointer_BytesSlice(p structPointer, f field) *[][]byte { - return structPointer_ifield(p, f).(*[][]byte) -} - -// Bool returns the address of a *bool field in the struct. -func structPointer_Bool(p structPointer, f field) **bool { - return structPointer_ifield(p, f).(**bool) -} - -// BoolVal returns the address of a bool field in the struct. -func structPointer_BoolVal(p structPointer, f field) *bool { - return structPointer_ifield(p, f).(*bool) -} - -// BoolSlice returns the address of a []bool field in the struct. -func structPointer_BoolSlice(p structPointer, f field) *[]bool { - return structPointer_ifield(p, f).(*[]bool) -} - -// String returns the address of a *string field in the struct. -func structPointer_String(p structPointer, f field) **string { - return structPointer_ifield(p, f).(**string) -} - -// StringVal returns the address of a string field in the struct. -func structPointer_StringVal(p structPointer, f field) *string { - return structPointer_ifield(p, f).(*string) -} - -// StringSlice returns the address of a []string field in the struct. -func structPointer_StringSlice(p structPointer, f field) *[]string { - return structPointer_ifield(p, f).(*[]string) -} - -// Extensions returns the address of an extension map field in the struct. -func structPointer_Extensions(p structPointer, f field) *XXX_InternalExtensions { - return structPointer_ifield(p, f).(*XXX_InternalExtensions) -} - -// ExtMap returns the address of an extension map field in the struct. -func structPointer_ExtMap(p structPointer, f field) *map[int32]Extension { - return structPointer_ifield(p, f).(*map[int32]Extension) -} - -// NewAt returns the reflect.Value for a pointer to a field in the struct. -func structPointer_NewAt(p structPointer, f field, typ reflect.Type) reflect.Value { - return structPointer_field(p, f).Addr() -} - -// SetStructPointer writes a *struct field in the struct. -func structPointer_SetStructPointer(p structPointer, f field, q structPointer) { - structPointer_field(p, f).Set(q.v) -} - -// GetStructPointer reads a *struct field in the struct. -func structPointer_GetStructPointer(p structPointer, f field) structPointer { - return structPointer{structPointer_field(p, f)} -} - -// StructPointerSlice the address of a []*struct field in the struct. -func structPointer_StructPointerSlice(p structPointer, f field) structPointerSlice { - return structPointerSlice{structPointer_field(p, f)} -} - -// A structPointerSlice represents the address of a slice of pointers to structs -// (themselves messages or groups). That is, v.Type() is *[]*struct{...}. -type structPointerSlice struct { - v reflect.Value -} - -func (p structPointerSlice) Len() int { return p.v.Len() } -func (p structPointerSlice) Index(i int) structPointer { return structPointer{p.v.Index(i)} } -func (p structPointerSlice) Append(q structPointer) { - p.v.Set(reflect.Append(p.v, q.v)) -} - -var ( - int32Type = reflect.TypeOf(int32(0)) - uint32Type = reflect.TypeOf(uint32(0)) - float32Type = reflect.TypeOf(float32(0)) - int64Type = reflect.TypeOf(int64(0)) - uint64Type = reflect.TypeOf(uint64(0)) - float64Type = reflect.TypeOf(float64(0)) -) - -// A word32 represents a field of type *int32, *uint32, *float32, or *enum. -// That is, v.Type() is *int32, *uint32, *float32, or *enum and v is assignable. -type word32 struct { - v reflect.Value -} - -// IsNil reports whether p is nil. -func word32_IsNil(p word32) bool { - return p.v.IsNil() -} - -// Set sets p to point at a newly allocated word with bits set to x. -func word32_Set(p word32, o *Buffer, x uint32) { - t := p.v.Type().Elem() - switch t { - case int32Type: - if len(o.int32s) == 0 { - o.int32s = make([]int32, uint32PoolSize) - } - o.int32s[0] = int32(x) - p.v.Set(reflect.ValueOf(&o.int32s[0])) - o.int32s = o.int32s[1:] - return - case uint32Type: - if len(o.uint32s) == 0 { - o.uint32s = make([]uint32, uint32PoolSize) - } - o.uint32s[0] = x - p.v.Set(reflect.ValueOf(&o.uint32s[0])) - o.uint32s = o.uint32s[1:] - return - case float32Type: - if len(o.float32s) == 0 { - o.float32s = make([]float32, uint32PoolSize) - } - o.float32s[0] = math.Float32frombits(x) - p.v.Set(reflect.ValueOf(&o.float32s[0])) - o.float32s = o.float32s[1:] - return - } - - // must be enum - p.v.Set(reflect.New(t)) - p.v.Elem().SetInt(int64(int32(x))) -} - -// Get gets the bits pointed at by p, as a uint32. -func word32_Get(p word32) uint32 { - elem := p.v.Elem() - switch elem.Kind() { - case reflect.Int32: - return uint32(elem.Int()) - case reflect.Uint32: - return uint32(elem.Uint()) - case reflect.Float32: - return math.Float32bits(float32(elem.Float())) - } - panic("unreachable") -} - -// Word32 returns a reference to a *int32, *uint32, *float32, or *enum field in the struct. -func structPointer_Word32(p structPointer, f field) word32 { - return word32{structPointer_field(p, f)} -} - -// A word32Val represents a field of type int32, uint32, float32, or enum. -// That is, v.Type() is int32, uint32, float32, or enum and v is assignable. -type word32Val struct { - v reflect.Value -} - -// Set sets *p to x. -func word32Val_Set(p word32Val, x uint32) { - switch p.v.Type() { - case int32Type: - p.v.SetInt(int64(x)) - return - case uint32Type: - p.v.SetUint(uint64(x)) - return - case float32Type: - p.v.SetFloat(float64(math.Float32frombits(x))) - return - } - - // must be enum - p.v.SetInt(int64(int32(x))) -} - -// Get gets the bits pointed at by p, as a uint32. -func word32Val_Get(p word32Val) uint32 { - elem := p.v - switch elem.Kind() { - case reflect.Int32: - return uint32(elem.Int()) - case reflect.Uint32: - return uint32(elem.Uint()) - case reflect.Float32: - return math.Float32bits(float32(elem.Float())) - } - panic("unreachable") -} - -// Word32Val returns a reference to a int32, uint32, float32, or enum field in the struct. -func structPointer_Word32Val(p structPointer, f field) word32Val { - return word32Val{structPointer_field(p, f)} -} - -// A word32Slice is a slice of 32-bit values. -// That is, v.Type() is []int32, []uint32, []float32, or []enum. -type word32Slice struct { - v reflect.Value -} - -func (p word32Slice) Append(x uint32) { - n, m := p.v.Len(), p.v.Cap() - if n < m { - p.v.SetLen(n + 1) - } else { - t := p.v.Type().Elem() - p.v.Set(reflect.Append(p.v, reflect.Zero(t))) - } - elem := p.v.Index(n) - switch elem.Kind() { - case reflect.Int32: - elem.SetInt(int64(int32(x))) - case reflect.Uint32: - elem.SetUint(uint64(x)) - case reflect.Float32: - elem.SetFloat(float64(math.Float32frombits(x))) - } -} - -func (p word32Slice) Len() int { - return p.v.Len() -} - -func (p word32Slice) Index(i int) uint32 { - elem := p.v.Index(i) - switch elem.Kind() { - case reflect.Int32: - return uint32(elem.Int()) - case reflect.Uint32: - return uint32(elem.Uint()) - case reflect.Float32: - return math.Float32bits(float32(elem.Float())) - } - panic("unreachable") -} - -// Word32Slice returns a reference to a []int32, []uint32, []float32, or []enum field in the struct. -func structPointer_Word32Slice(p structPointer, f field) word32Slice { - return word32Slice{structPointer_field(p, f)} -} - -// word64 is like word32 but for 64-bit values. -type word64 struct { - v reflect.Value -} - -func word64_Set(p word64, o *Buffer, x uint64) { - t := p.v.Type().Elem() - switch t { - case int64Type: - if len(o.int64s) == 0 { - o.int64s = make([]int64, uint64PoolSize) - } - o.int64s[0] = int64(x) - p.v.Set(reflect.ValueOf(&o.int64s[0])) - o.int64s = o.int64s[1:] - return - case uint64Type: - if len(o.uint64s) == 0 { - o.uint64s = make([]uint64, uint64PoolSize) - } - o.uint64s[0] = x - p.v.Set(reflect.ValueOf(&o.uint64s[0])) - o.uint64s = o.uint64s[1:] - return - case float64Type: - if len(o.float64s) == 0 { - o.float64s = make([]float64, uint64PoolSize) - } - o.float64s[0] = math.Float64frombits(x) - p.v.Set(reflect.ValueOf(&o.float64s[0])) - o.float64s = o.float64s[1:] - return - } - panic("unreachable") -} - -func word64_IsNil(p word64) bool { - return p.v.IsNil() -} - -func word64_Get(p word64) uint64 { - elem := p.v.Elem() - switch elem.Kind() { - case reflect.Int64: - return uint64(elem.Int()) - case reflect.Uint64: - return elem.Uint() - case reflect.Float64: - return math.Float64bits(elem.Float()) - } - panic("unreachable") -} - -func structPointer_Word64(p structPointer, f field) word64 { - return word64{structPointer_field(p, f)} -} - -// word64Val is like word32Val but for 64-bit values. -type word64Val struct { - v reflect.Value -} - -func word64Val_Set(p word64Val, o *Buffer, x uint64) { - switch p.v.Type() { - case int64Type: - p.v.SetInt(int64(x)) - return - case uint64Type: - p.v.SetUint(x) - return - case float64Type: - p.v.SetFloat(math.Float64frombits(x)) - return - } - panic("unreachable") -} - -func word64Val_Get(p word64Val) uint64 { - elem := p.v - switch elem.Kind() { - case reflect.Int64: - return uint64(elem.Int()) - case reflect.Uint64: - return elem.Uint() - case reflect.Float64: - return math.Float64bits(elem.Float()) - } - panic("unreachable") -} - -func structPointer_Word64Val(p structPointer, f field) word64Val { - return word64Val{structPointer_field(p, f)} -} - -type word64Slice struct { - v reflect.Value -} - -func (p word64Slice) Append(x uint64) { - n, m := p.v.Len(), p.v.Cap() - if n < m { - p.v.SetLen(n + 1) - } else { - t := p.v.Type().Elem() - p.v.Set(reflect.Append(p.v, reflect.Zero(t))) - } - elem := p.v.Index(n) - switch elem.Kind() { - case reflect.Int64: - elem.SetInt(int64(int64(x))) - case reflect.Uint64: - elem.SetUint(uint64(x)) - case reflect.Float64: - elem.SetFloat(float64(math.Float64frombits(x))) - } -} - -func (p word64Slice) Len() int { - return p.v.Len() -} - -func (p word64Slice) Index(i int) uint64 { - elem := p.v.Index(i) - switch elem.Kind() { - case reflect.Int64: - return uint64(elem.Int()) - case reflect.Uint64: - return uint64(elem.Uint()) - case reflect.Float64: - return math.Float64bits(float64(elem.Float())) - } - panic("unreachable") -} - -func structPointer_Word64Slice(p structPointer, f field) word64Slice { - return word64Slice{structPointer_field(p, f)} -} diff --git a/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go b/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go deleted file mode 100644 index 6b5567d47..000000000 --- a/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go +++ /dev/null @@ -1,270 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2012 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT -// OWNER 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. - -// +build !appengine,!js - -// This file contains the implementation of the proto field accesses using package unsafe. - -package proto - -import ( - "reflect" - "unsafe" -) - -// NOTE: These type_Foo functions would more idiomatically be methods, -// but Go does not allow methods on pointer types, and we must preserve -// some pointer type for the garbage collector. We use these -// funcs with clunky names as our poor approximation to methods. -// -// An alternative would be -// type structPointer struct { p unsafe.Pointer } -// but that does not registerize as well. - -// A structPointer is a pointer to a struct. -type structPointer unsafe.Pointer - -// toStructPointer returns a structPointer equivalent to the given reflect value. -func toStructPointer(v reflect.Value) structPointer { - return structPointer(unsafe.Pointer(v.Pointer())) -} - -// IsNil reports whether p is nil. -func structPointer_IsNil(p structPointer) bool { - return p == nil -} - -// Interface returns the struct pointer, assumed to have element type t, -// as an interface value. -func structPointer_Interface(p structPointer, t reflect.Type) interface{} { - return reflect.NewAt(t, unsafe.Pointer(p)).Interface() -} - -// A field identifies a field in a struct, accessible from a structPointer. -// In this implementation, a field is identified by its byte offset from the start of the struct. -type field uintptr - -// toField returns a field equivalent to the given reflect field. -func toField(f *reflect.StructField) field { - return field(f.Offset) -} - -// invalidField is an invalid field identifier. -const invalidField = ^field(0) - -// IsValid reports whether the field identifier is valid. -func (f field) IsValid() bool { - return f != ^field(0) -} - -// Bytes returns the address of a []byte field in the struct. -func structPointer_Bytes(p structPointer, f field) *[]byte { - return (*[]byte)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// BytesSlice returns the address of a [][]byte field in the struct. -func structPointer_BytesSlice(p structPointer, f field) *[][]byte { - return (*[][]byte)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// Bool returns the address of a *bool field in the struct. -func structPointer_Bool(p structPointer, f field) **bool { - return (**bool)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// BoolVal returns the address of a bool field in the struct. -func structPointer_BoolVal(p structPointer, f field) *bool { - return (*bool)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// BoolSlice returns the address of a []bool field in the struct. -func structPointer_BoolSlice(p structPointer, f field) *[]bool { - return (*[]bool)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// String returns the address of a *string field in the struct. -func structPointer_String(p structPointer, f field) **string { - return (**string)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// StringVal returns the address of a string field in the struct. -func structPointer_StringVal(p structPointer, f field) *string { - return (*string)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// StringSlice returns the address of a []string field in the struct. -func structPointer_StringSlice(p structPointer, f field) *[]string { - return (*[]string)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// ExtMap returns the address of an extension map field in the struct. -func structPointer_Extensions(p structPointer, f field) *XXX_InternalExtensions { - return (*XXX_InternalExtensions)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -func structPointer_ExtMap(p structPointer, f field) *map[int32]Extension { - return (*map[int32]Extension)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// NewAt returns the reflect.Value for a pointer to a field in the struct. -func structPointer_NewAt(p structPointer, f field, typ reflect.Type) reflect.Value { - return reflect.NewAt(typ, unsafe.Pointer(uintptr(p)+uintptr(f))) -} - -// SetStructPointer writes a *struct field in the struct. -func structPointer_SetStructPointer(p structPointer, f field, q structPointer) { - *(*structPointer)(unsafe.Pointer(uintptr(p) + uintptr(f))) = q -} - -// GetStructPointer reads a *struct field in the struct. -func structPointer_GetStructPointer(p structPointer, f field) structPointer { - return *(*structPointer)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// StructPointerSlice the address of a []*struct field in the struct. -func structPointer_StructPointerSlice(p structPointer, f field) *structPointerSlice { - return (*structPointerSlice)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// A structPointerSlice represents a slice of pointers to structs (themselves submessages or groups). -type structPointerSlice []structPointer - -func (v *structPointerSlice) Len() int { return len(*v) } -func (v *structPointerSlice) Index(i int) structPointer { return (*v)[i] } -func (v *structPointerSlice) Append(p structPointer) { *v = append(*v, p) } - -// A word32 is the address of a "pointer to 32-bit value" field. -type word32 **uint32 - -// IsNil reports whether *v is nil. -func word32_IsNil(p word32) bool { - return *p == nil -} - -// Set sets *v to point at a newly allocated word set to x. -func word32_Set(p word32, o *Buffer, x uint32) { - if len(o.uint32s) == 0 { - o.uint32s = make([]uint32, uint32PoolSize) - } - o.uint32s[0] = x - *p = &o.uint32s[0] - o.uint32s = o.uint32s[1:] -} - -// Get gets the value pointed at by *v. -func word32_Get(p word32) uint32 { - return **p -} - -// Word32 returns the address of a *int32, *uint32, *float32, or *enum field in the struct. -func structPointer_Word32(p structPointer, f field) word32 { - return word32((**uint32)(unsafe.Pointer(uintptr(p) + uintptr(f)))) -} - -// A word32Val is the address of a 32-bit value field. -type word32Val *uint32 - -// Set sets *p to x. -func word32Val_Set(p word32Val, x uint32) { - *p = x -} - -// Get gets the value pointed at by p. -func word32Val_Get(p word32Val) uint32 { - return *p -} - -// Word32Val returns the address of a *int32, *uint32, *float32, or *enum field in the struct. -func structPointer_Word32Val(p structPointer, f field) word32Val { - return word32Val((*uint32)(unsafe.Pointer(uintptr(p) + uintptr(f)))) -} - -// A word32Slice is a slice of 32-bit values. -type word32Slice []uint32 - -func (v *word32Slice) Append(x uint32) { *v = append(*v, x) } -func (v *word32Slice) Len() int { return len(*v) } -func (v *word32Slice) Index(i int) uint32 { return (*v)[i] } - -// Word32Slice returns the address of a []int32, []uint32, []float32, or []enum field in the struct. -func structPointer_Word32Slice(p structPointer, f field) *word32Slice { - return (*word32Slice)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// word64 is like word32 but for 64-bit values. -type word64 **uint64 - -func word64_Set(p word64, o *Buffer, x uint64) { - if len(o.uint64s) == 0 { - o.uint64s = make([]uint64, uint64PoolSize) - } - o.uint64s[0] = x - *p = &o.uint64s[0] - o.uint64s = o.uint64s[1:] -} - -func word64_IsNil(p word64) bool { - return *p == nil -} - -func word64_Get(p word64) uint64 { - return **p -} - -func structPointer_Word64(p structPointer, f field) word64 { - return word64((**uint64)(unsafe.Pointer(uintptr(p) + uintptr(f)))) -} - -// word64Val is like word32Val but for 64-bit values. -type word64Val *uint64 - -func word64Val_Set(p word64Val, o *Buffer, x uint64) { - *p = x -} - -func word64Val_Get(p word64Val) uint64 { - return *p -} - -func structPointer_Word64Val(p structPointer, f field) word64Val { - return word64Val((*uint64)(unsafe.Pointer(uintptr(p) + uintptr(f)))) -} - -// word64Slice is like word32Slice but for 64-bit values. -type word64Slice []uint64 - -func (v *word64Slice) Append(x uint64) { *v = append(*v, x) } -func (v *word64Slice) Len() int { return len(*v) } -func (v *word64Slice) Index(i int) uint64 { return (*v)[i] } - -func structPointer_Word64Slice(p structPointer, f field) *word64Slice { - return (*word64Slice)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} diff --git a/vendor/github.com/golang/protobuf/proto/properties.go b/vendor/github.com/golang/protobuf/proto/properties.go deleted file mode 100644 index ec2289c00..000000000 --- a/vendor/github.com/golang/protobuf/proto/properties.go +++ /dev/null @@ -1,872 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT -// OWNER 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. - -package proto - -/* - * Routines for encoding data into the wire format for protocol buffers. - */ - -import ( - "fmt" - "log" - "os" - "reflect" - "sort" - "strconv" - "strings" - "sync" -) - -const debug bool = false - -// Constants that identify the encoding of a value on the wire. -const ( - WireVarint = 0 - WireFixed64 = 1 - WireBytes = 2 - WireStartGroup = 3 - WireEndGroup = 4 - WireFixed32 = 5 -) - -const startSize = 10 // initial slice/string sizes - -// Encoders are defined in encode.go -// An encoder outputs the full representation of a field, including its -// tag and encoder type. -type encoder func(p *Buffer, prop *Properties, base structPointer) error - -// A valueEncoder encodes a single integer in a particular encoding. -type valueEncoder func(o *Buffer, x uint64) error - -// Sizers are defined in encode.go -// A sizer returns the encoded size of a field, including its tag and encoder -// type. -type sizer func(prop *Properties, base structPointer) int - -// A valueSizer returns the encoded size of a single integer in a particular -// encoding. -type valueSizer func(x uint64) int - -// Decoders are defined in decode.go -// A decoder creates a value from its wire representation. -// Unrecognized subelements are saved in unrec. -type decoder func(p *Buffer, prop *Properties, base structPointer) error - -// A valueDecoder decodes a single integer in a particular encoding. -type valueDecoder func(o *Buffer) (x uint64, err error) - -// A oneofMarshaler does the marshaling for all oneof fields in a message. -type oneofMarshaler func(Message, *Buffer) error - -// A oneofUnmarshaler does the unmarshaling for a oneof field in a message. -type oneofUnmarshaler func(Message, int, int, *Buffer) (bool, error) - -// A oneofSizer does the sizing for all oneof fields in a message. -type oneofSizer func(Message) int - -// tagMap is an optimization over map[int]int for typical protocol buffer -// use-cases. Encoded protocol buffers are often in tag order with small tag -// numbers. -type tagMap struct { - fastTags []int - slowTags map[int]int -} - -// tagMapFastLimit is the upper bound on the tag number that will be stored in -// the tagMap slice rather than its map. -const tagMapFastLimit = 1024 - -func (p *tagMap) get(t int) (int, bool) { - if t > 0 && t < tagMapFastLimit { - if t >= len(p.fastTags) { - return 0, false - } - fi := p.fastTags[t] - return fi, fi >= 0 - } - fi, ok := p.slowTags[t] - return fi, ok -} - -func (p *tagMap) put(t int, fi int) { - if t > 0 && t < tagMapFastLimit { - for len(p.fastTags) < t+1 { - p.fastTags = append(p.fastTags, -1) - } - p.fastTags[t] = fi - return - } - if p.slowTags == nil { - p.slowTags = make(map[int]int) - } - p.slowTags[t] = fi -} - -// StructProperties represents properties for all the fields of a struct. -// decoderTags and decoderOrigNames should only be used by the decoder. -type StructProperties struct { - Prop []*Properties // properties for each field - reqCount int // required count - decoderTags tagMap // map from proto tag to struct field number - decoderOrigNames map[string]int // map from original name to struct field number - order []int // list of struct field numbers in tag order - unrecField field // field id of the XXX_unrecognized []byte field - extendable bool // is this an extendable proto - - oneofMarshaler oneofMarshaler - oneofUnmarshaler oneofUnmarshaler - oneofSizer oneofSizer - stype reflect.Type - - // OneofTypes contains information about the oneof fields in this message. - // It is keyed by the original name of a field. - OneofTypes map[string]*OneofProperties -} - -// OneofProperties represents information about a specific field in a oneof. -type OneofProperties struct { - Type reflect.Type // pointer to generated struct type for this oneof field - Field int // struct field number of the containing oneof in the message - Prop *Properties -} - -// Implement the sorting interface so we can sort the fields in tag order, as recommended by the spec. -// See encode.go, (*Buffer).enc_struct. - -func (sp *StructProperties) Len() int { return len(sp.order) } -func (sp *StructProperties) Less(i, j int) bool { - return sp.Prop[sp.order[i]].Tag < sp.Prop[sp.order[j]].Tag -} -func (sp *StructProperties) Swap(i, j int) { sp.order[i], sp.order[j] = sp.order[j], sp.order[i] } - -// Properties represents the protocol-specific behavior of a single struct field. -type Properties struct { - Name string // name of the field, for error messages - OrigName string // original name before protocol compiler (always set) - JSONName string // name to use for JSON; determined by protoc - Wire string - WireType int - Tag int - Required bool - Optional bool - Repeated bool - Packed bool // relevant for repeated primitives only - Enum string // set for enum types only - proto3 bool // whether this is known to be a proto3 field; set for []byte only - oneof bool // whether this is a oneof field - - Default string // default value - HasDefault bool // whether an explicit default was provided - def_uint64 uint64 - - enc encoder - valEnc valueEncoder // set for bool and numeric types only - field field - tagcode []byte // encoding of EncodeVarint((Tag<<3)|WireType) - tagbuf [8]byte - stype reflect.Type // set for struct types only - sprop *StructProperties // set for struct types only - isMarshaler bool - isUnmarshaler bool - - mtype reflect.Type // set for map types only - mkeyprop *Properties // set for map types only - mvalprop *Properties // set for map types only - - size sizer - valSize valueSizer // set for bool and numeric types only - - dec decoder - valDec valueDecoder // set for bool and numeric types only - - // If this is a packable field, this will be the decoder for the packed version of the field. - packedDec decoder -} - -// String formats the properties in the protobuf struct field tag style. -func (p *Properties) String() string { - s := p.Wire - s = "," - s += strconv.Itoa(p.Tag) - if p.Required { - s += ",req" - } - if p.Optional { - s += ",opt" - } - if p.Repeated { - s += ",rep" - } - if p.Packed { - s += ",packed" - } - s += ",name=" + p.OrigName - if p.JSONName != p.OrigName { - s += ",json=" + p.JSONName - } - if p.proto3 { - s += ",proto3" - } - if p.oneof { - s += ",oneof" - } - if len(p.Enum) > 0 { - s += ",enum=" + p.Enum - } - if p.HasDefault { - s += ",def=" + p.Default - } - return s -} - -// Parse populates p by parsing a string in the protobuf struct field tag style. -func (p *Properties) Parse(s string) { - // "bytes,49,opt,name=foo,def=hello!" - fields := strings.Split(s, ",") // breaks def=, but handled below. - if len(fields) < 2 { - fmt.Fprintf(os.Stderr, "proto: tag has too few fields: %q\n", s) - return - } - - p.Wire = fields[0] - switch p.Wire { - case "varint": - p.WireType = WireVarint - p.valEnc = (*Buffer).EncodeVarint - p.valDec = (*Buffer).DecodeVarint - p.valSize = sizeVarint - case "fixed32": - p.WireType = WireFixed32 - p.valEnc = (*Buffer).EncodeFixed32 - p.valDec = (*Buffer).DecodeFixed32 - p.valSize = sizeFixed32 - case "fixed64": - p.WireType = WireFixed64 - p.valEnc = (*Buffer).EncodeFixed64 - p.valDec = (*Buffer).DecodeFixed64 - p.valSize = sizeFixed64 - case "zigzag32": - p.WireType = WireVarint - p.valEnc = (*Buffer).EncodeZigzag32 - p.valDec = (*Buffer).DecodeZigzag32 - p.valSize = sizeZigzag32 - case "zigzag64": - p.WireType = WireVarint - p.valEnc = (*Buffer).EncodeZigzag64 - p.valDec = (*Buffer).DecodeZigzag64 - p.valSize = sizeZigzag64 - case "bytes", "group": - p.WireType = WireBytes - // no numeric converter for non-numeric types - default: - fmt.Fprintf(os.Stderr, "proto: tag has unknown wire type: %q\n", s) - return - } - - var err error - p.Tag, err = strconv.Atoi(fields[1]) - if err != nil { - return - } - - for i := 2; i < len(fields); i++ { - f := fields[i] - switch { - case f == "req": - p.Required = true - case f == "opt": - p.Optional = true - case f == "rep": - p.Repeated = true - case f == "packed": - p.Packed = true - case strings.HasPrefix(f, "name="): - p.OrigName = f[5:] - case strings.HasPrefix(f, "json="): - p.JSONName = f[5:] - case strings.HasPrefix(f, "enum="): - p.Enum = f[5:] - case f == "proto3": - p.proto3 = true - case f == "oneof": - p.oneof = true - case strings.HasPrefix(f, "def="): - p.HasDefault = true - p.Default = f[4:] // rest of string - if i+1 < len(fields) { - // Commas aren't escaped, and def is always last. - p.Default += "," + strings.Join(fields[i+1:], ",") - break - } - } - } -} - -func logNoSliceEnc(t1, t2 reflect.Type) { - fmt.Fprintf(os.Stderr, "proto: no slice oenc for %T = []%T\n", t1, t2) -} - -var protoMessageType = reflect.TypeOf((*Message)(nil)).Elem() - -// Initialize the fields for encoding and decoding. -func (p *Properties) setEncAndDec(typ reflect.Type, f *reflect.StructField, lockGetProp bool) { - p.enc = nil - p.dec = nil - p.size = nil - - switch t1 := typ; t1.Kind() { - default: - fmt.Fprintf(os.Stderr, "proto: no coders for %v\n", t1) - - // proto3 scalar types - - case reflect.Bool: - p.enc = (*Buffer).enc_proto3_bool - p.dec = (*Buffer).dec_proto3_bool - p.size = size_proto3_bool - case reflect.Int32: - p.enc = (*Buffer).enc_proto3_int32 - p.dec = (*Buffer).dec_proto3_int32 - p.size = size_proto3_int32 - case reflect.Uint32: - p.enc = (*Buffer).enc_proto3_uint32 - p.dec = (*Buffer).dec_proto3_int32 // can reuse - p.size = size_proto3_uint32 - case reflect.Int64, reflect.Uint64: - p.enc = (*Buffer).enc_proto3_int64 - p.dec = (*Buffer).dec_proto3_int64 - p.size = size_proto3_int64 - case reflect.Float32: - p.enc = (*Buffer).enc_proto3_uint32 // can just treat them as bits - p.dec = (*Buffer).dec_proto3_int32 - p.size = size_proto3_uint32 - case reflect.Float64: - p.enc = (*Buffer).enc_proto3_int64 // can just treat them as bits - p.dec = (*Buffer).dec_proto3_int64 - p.size = size_proto3_int64 - case reflect.String: - p.enc = (*Buffer).enc_proto3_string - p.dec = (*Buffer).dec_proto3_string - p.size = size_proto3_string - - case reflect.Ptr: - switch t2 := t1.Elem(); t2.Kind() { - default: - fmt.Fprintf(os.Stderr, "proto: no encoder function for %v -> %v\n", t1, t2) - break - case reflect.Bool: - p.enc = (*Buffer).enc_bool - p.dec = (*Buffer).dec_bool - p.size = size_bool - case reflect.Int32: - p.enc = (*Buffer).enc_int32 - p.dec = (*Buffer).dec_int32 - p.size = size_int32 - case reflect.Uint32: - p.enc = (*Buffer).enc_uint32 - p.dec = (*Buffer).dec_int32 // can reuse - p.size = size_uint32 - case reflect.Int64, reflect.Uint64: - p.enc = (*Buffer).enc_int64 - p.dec = (*Buffer).dec_int64 - p.size = size_int64 - case reflect.Float32: - p.enc = (*Buffer).enc_uint32 // can just treat them as bits - p.dec = (*Buffer).dec_int32 - p.size = size_uint32 - case reflect.Float64: - p.enc = (*Buffer).enc_int64 // can just treat them as bits - p.dec = (*Buffer).dec_int64 - p.size = size_int64 - case reflect.String: - p.enc = (*Buffer).enc_string - p.dec = (*Buffer).dec_string - p.size = size_string - case reflect.Struct: - p.stype = t1.Elem() - p.isMarshaler = isMarshaler(t1) - p.isUnmarshaler = isUnmarshaler(t1) - if p.Wire == "bytes" { - p.enc = (*Buffer).enc_struct_message - p.dec = (*Buffer).dec_struct_message - p.size = size_struct_message - } else { - p.enc = (*Buffer).enc_struct_group - p.dec = (*Buffer).dec_struct_group - p.size = size_struct_group - } - } - - case reflect.Slice: - switch t2 := t1.Elem(); t2.Kind() { - default: - logNoSliceEnc(t1, t2) - break - case reflect.Bool: - if p.Packed { - p.enc = (*Buffer).enc_slice_packed_bool - p.size = size_slice_packed_bool - } else { - p.enc = (*Buffer).enc_slice_bool - p.size = size_slice_bool - } - p.dec = (*Buffer).dec_slice_bool - p.packedDec = (*Buffer).dec_slice_packed_bool - case reflect.Int32: - if p.Packed { - p.enc = (*Buffer).enc_slice_packed_int32 - p.size = size_slice_packed_int32 - } else { - p.enc = (*Buffer).enc_slice_int32 - p.size = size_slice_int32 - } - p.dec = (*Buffer).dec_slice_int32 - p.packedDec = (*Buffer).dec_slice_packed_int32 - case reflect.Uint32: - if p.Packed { - p.enc = (*Buffer).enc_slice_packed_uint32 - p.size = size_slice_packed_uint32 - } else { - p.enc = (*Buffer).enc_slice_uint32 - p.size = size_slice_uint32 - } - p.dec = (*Buffer).dec_slice_int32 - p.packedDec = (*Buffer).dec_slice_packed_int32 - case reflect.Int64, reflect.Uint64: - if p.Packed { - p.enc = (*Buffer).enc_slice_packed_int64 - p.size = size_slice_packed_int64 - } else { - p.enc = (*Buffer).enc_slice_int64 - p.size = size_slice_int64 - } - p.dec = (*Buffer).dec_slice_int64 - p.packedDec = (*Buffer).dec_slice_packed_int64 - case reflect.Uint8: - p.dec = (*Buffer).dec_slice_byte - if p.proto3 { - p.enc = (*Buffer).enc_proto3_slice_byte - p.size = size_proto3_slice_byte - } else { - p.enc = (*Buffer).enc_slice_byte - p.size = size_slice_byte - } - case reflect.Float32, reflect.Float64: - switch t2.Bits() { - case 32: - // can just treat them as bits - if p.Packed { - p.enc = (*Buffer).enc_slice_packed_uint32 - p.size = size_slice_packed_uint32 - } else { - p.enc = (*Buffer).enc_slice_uint32 - p.size = size_slice_uint32 - } - p.dec = (*Buffer).dec_slice_int32 - p.packedDec = (*Buffer).dec_slice_packed_int32 - case 64: - // can just treat them as bits - if p.Packed { - p.enc = (*Buffer).enc_slice_packed_int64 - p.size = size_slice_packed_int64 - } else { - p.enc = (*Buffer).enc_slice_int64 - p.size = size_slice_int64 - } - p.dec = (*Buffer).dec_slice_int64 - p.packedDec = (*Buffer).dec_slice_packed_int64 - default: - logNoSliceEnc(t1, t2) - break - } - case reflect.String: - p.enc = (*Buffer).enc_slice_string - p.dec = (*Buffer).dec_slice_string - p.size = size_slice_string - case reflect.Ptr: - switch t3 := t2.Elem(); t3.Kind() { - default: - fmt.Fprintf(os.Stderr, "proto: no ptr oenc for %T -> %T -> %T\n", t1, t2, t3) - break - case reflect.Struct: - p.stype = t2.Elem() - p.isMarshaler = isMarshaler(t2) - p.isUnmarshaler = isUnmarshaler(t2) - if p.Wire == "bytes" { - p.enc = (*Buffer).enc_slice_struct_message - p.dec = (*Buffer).dec_slice_struct_message - p.size = size_slice_struct_message - } else { - p.enc = (*Buffer).enc_slice_struct_group - p.dec = (*Buffer).dec_slice_struct_group - p.size = size_slice_struct_group - } - } - case reflect.Slice: - switch t2.Elem().Kind() { - default: - fmt.Fprintf(os.Stderr, "proto: no slice elem oenc for %T -> %T -> %T\n", t1, t2, t2.Elem()) - break - case reflect.Uint8: - p.enc = (*Buffer).enc_slice_slice_byte - p.dec = (*Buffer).dec_slice_slice_byte - p.size = size_slice_slice_byte - } - } - - case reflect.Map: - p.enc = (*Buffer).enc_new_map - p.dec = (*Buffer).dec_new_map - p.size = size_new_map - - p.mtype = t1 - p.mkeyprop = &Properties{} - p.mkeyprop.init(reflect.PtrTo(p.mtype.Key()), "Key", f.Tag.Get("protobuf_key"), nil, lockGetProp) - p.mvalprop = &Properties{} - vtype := p.mtype.Elem() - if vtype.Kind() != reflect.Ptr && vtype.Kind() != reflect.Slice { - // The value type is not a message (*T) or bytes ([]byte), - // so we need encoders for the pointer to this type. - vtype = reflect.PtrTo(vtype) - } - p.mvalprop.init(vtype, "Value", f.Tag.Get("protobuf_val"), nil, lockGetProp) - } - - // precalculate tag code - wire := p.WireType - if p.Packed { - wire = WireBytes - } - x := uint32(p.Tag)<<3 | uint32(wire) - i := 0 - for i = 0; x > 127; i++ { - p.tagbuf[i] = 0x80 | uint8(x&0x7F) - x >>= 7 - } - p.tagbuf[i] = uint8(x) - p.tagcode = p.tagbuf[0 : i+1] - - if p.stype != nil { - if lockGetProp { - p.sprop = GetProperties(p.stype) - } else { - p.sprop = getPropertiesLocked(p.stype) - } - } -} - -var ( - marshalerType = reflect.TypeOf((*Marshaler)(nil)).Elem() - unmarshalerType = reflect.TypeOf((*Unmarshaler)(nil)).Elem() -) - -// isMarshaler reports whether type t implements Marshaler. -func isMarshaler(t reflect.Type) bool { - // We're checking for (likely) pointer-receiver methods - // so if t is not a pointer, something is very wrong. - // The calls above only invoke isMarshaler on pointer types. - if t.Kind() != reflect.Ptr { - panic("proto: misuse of isMarshaler") - } - return t.Implements(marshalerType) -} - -// isUnmarshaler reports whether type t implements Unmarshaler. -func isUnmarshaler(t reflect.Type) bool { - // We're checking for (likely) pointer-receiver methods - // so if t is not a pointer, something is very wrong. - // The calls above only invoke isUnmarshaler on pointer types. - if t.Kind() != reflect.Ptr { - panic("proto: misuse of isUnmarshaler") - } - return t.Implements(unmarshalerType) -} - -// Init populates the properties from a protocol buffer struct tag. -func (p *Properties) Init(typ reflect.Type, name, tag string, f *reflect.StructField) { - p.init(typ, name, tag, f, true) -} - -func (p *Properties) init(typ reflect.Type, name, tag string, f *reflect.StructField, lockGetProp bool) { - // "bytes,49,opt,def=hello!" - p.Name = name - p.OrigName = name - if f != nil { - p.field = toField(f) - } - if tag == "" { - return - } - p.Parse(tag) - p.setEncAndDec(typ, f, lockGetProp) -} - -var ( - propertiesMu sync.RWMutex - propertiesMap = make(map[reflect.Type]*StructProperties) -) - -// GetProperties returns the list of properties for the type represented by t. -// t must represent a generated struct type of a protocol message. -func GetProperties(t reflect.Type) *StructProperties { - if t.Kind() != reflect.Struct { - panic("proto: type must have kind struct") - } - - // Most calls to GetProperties in a long-running program will be - // retrieving details for types we have seen before. - propertiesMu.RLock() - sprop, ok := propertiesMap[t] - propertiesMu.RUnlock() - if ok { - if collectStats { - stats.Chit++ - } - return sprop - } - - propertiesMu.Lock() - sprop = getPropertiesLocked(t) - propertiesMu.Unlock() - return sprop -} - -// getPropertiesLocked requires that propertiesMu is held. -func getPropertiesLocked(t reflect.Type) *StructProperties { - if prop, ok := propertiesMap[t]; ok { - if collectStats { - stats.Chit++ - } - return prop - } - if collectStats { - stats.Cmiss++ - } - - prop := new(StructProperties) - // in case of recursive protos, fill this in now. - propertiesMap[t] = prop - - // build properties - prop.extendable = reflect.PtrTo(t).Implements(extendableProtoType) || - reflect.PtrTo(t).Implements(extendableProtoV1Type) - prop.unrecField = invalidField - prop.Prop = make([]*Properties, t.NumField()) - prop.order = make([]int, t.NumField()) - - for i := 0; i < t.NumField(); i++ { - f := t.Field(i) - p := new(Properties) - name := f.Name - p.init(f.Type, name, f.Tag.Get("protobuf"), &f, false) - - if f.Name == "XXX_InternalExtensions" { // special case - p.enc = (*Buffer).enc_exts - p.dec = nil // not needed - p.size = size_exts - } else if f.Name == "XXX_extensions" { // special case - p.enc = (*Buffer).enc_map - p.dec = nil // not needed - p.size = size_map - } else if f.Name == "XXX_unrecognized" { // special case - prop.unrecField = toField(&f) - } - oneof := f.Tag.Get("protobuf_oneof") // special case - if oneof != "" { - // Oneof fields don't use the traditional protobuf tag. - p.OrigName = oneof - } - prop.Prop[i] = p - prop.order[i] = i - if debug { - print(i, " ", f.Name, " ", t.String(), " ") - if p.Tag > 0 { - print(p.String()) - } - print("\n") - } - if p.enc == nil && !strings.HasPrefix(f.Name, "XXX_") && oneof == "" { - fmt.Fprintln(os.Stderr, "proto: no encoder for", f.Name, f.Type.String(), "[GetProperties]") - } - } - - // Re-order prop.order. - sort.Sort(prop) - - type oneofMessage interface { - XXX_OneofFuncs() (func(Message, *Buffer) error, func(Message, int, int, *Buffer) (bool, error), func(Message) int, []interface{}) - } - if om, ok := reflect.Zero(reflect.PtrTo(t)).Interface().(oneofMessage); ok { - var oots []interface{} - prop.oneofMarshaler, prop.oneofUnmarshaler, prop.oneofSizer, oots = om.XXX_OneofFuncs() - prop.stype = t - - // Interpret oneof metadata. - prop.OneofTypes = make(map[string]*OneofProperties) - for _, oot := range oots { - oop := &OneofProperties{ - Type: reflect.ValueOf(oot).Type(), // *T - Prop: new(Properties), - } - sft := oop.Type.Elem().Field(0) - oop.Prop.Name = sft.Name - oop.Prop.Parse(sft.Tag.Get("protobuf")) - // There will be exactly one interface field that - // this new value is assignable to. - for i := 0; i < t.NumField(); i++ { - f := t.Field(i) - if f.Type.Kind() != reflect.Interface { - continue - } - if !oop.Type.AssignableTo(f.Type) { - continue - } - oop.Field = i - break - } - prop.OneofTypes[oop.Prop.OrigName] = oop - } - } - - // build required counts - // build tags - reqCount := 0 - prop.decoderOrigNames = make(map[string]int) - for i, p := range prop.Prop { - if strings.HasPrefix(p.Name, "XXX_") { - // Internal fields should not appear in tags/origNames maps. - // They are handled specially when encoding and decoding. - continue - } - if p.Required { - reqCount++ - } - prop.decoderTags.put(p.Tag, i) - prop.decoderOrigNames[p.OrigName] = i - } - prop.reqCount = reqCount - - return prop -} - -// Return the Properties object for the x[0]'th field of the structure. -func propByIndex(t reflect.Type, x []int) *Properties { - if len(x) != 1 { - fmt.Fprintf(os.Stderr, "proto: field index dimension %d (not 1) for type %s\n", len(x), t) - return nil - } - prop := GetProperties(t) - return prop.Prop[x[0]] -} - -// Get the address and type of a pointer to a struct from an interface. -func getbase(pb Message) (t reflect.Type, b structPointer, err error) { - if pb == nil { - err = ErrNil - return - } - // get the reflect type of the pointer to the struct. - t = reflect.TypeOf(pb) - // get the address of the struct. - value := reflect.ValueOf(pb) - b = toStructPointer(value) - return -} - -// A global registry of enum types. -// The generated code will register the generated maps by calling RegisterEnum. - -var enumValueMaps = make(map[string]map[string]int32) - -// RegisterEnum is called from the generated code to install the enum descriptor -// maps into the global table to aid parsing text format protocol buffers. -func RegisterEnum(typeName string, unusedNameMap map[int32]string, valueMap map[string]int32) { - if _, ok := enumValueMaps[typeName]; ok { - panic("proto: duplicate enum registered: " + typeName) - } - enumValueMaps[typeName] = valueMap -} - -// EnumValueMap returns the mapping from names to integers of the -// enum type enumType, or a nil if not found. -func EnumValueMap(enumType string) map[string]int32 { - return enumValueMaps[enumType] -} - -// A registry of all linked message types. -// The string is a fully-qualified proto name ("pkg.Message"). -var ( - protoTypes = make(map[string]reflect.Type) - revProtoTypes = make(map[reflect.Type]string) -) - -// RegisterType is called from generated code and maps from the fully qualified -// proto name to the type (pointer to struct) of the protocol buffer. -func RegisterType(x Message, name string) { - if _, ok := protoTypes[name]; ok { - // TODO: Some day, make this a panic. - log.Printf("proto: duplicate proto type registered: %s", name) - return - } - t := reflect.TypeOf(x) - protoTypes[name] = t - revProtoTypes[t] = name -} - -// MessageName returns the fully-qualified proto name for the given message type. -func MessageName(x Message) string { - type xname interface { - XXX_MessageName() string - } - if m, ok := x.(xname); ok { - return m.XXX_MessageName() - } - return revProtoTypes[reflect.TypeOf(x)] -} - -// MessageType returns the message type (pointer to struct) for a named message. -func MessageType(name string) reflect.Type { return protoTypes[name] } - -// A registry of all linked proto files. -var ( - protoFiles = make(map[string][]byte) // file name => fileDescriptor -) - -// RegisterFile is called from generated code and maps from the -// full file name of a .proto file to its compressed FileDescriptorProto. -func RegisterFile(filename string, fileDescriptor []byte) { - protoFiles[filename] = fileDescriptor -} - -// FileDescriptor returns the compressed FileDescriptorProto for a .proto file. -func FileDescriptor(filename string) []byte { return protoFiles[filename] } diff --git a/vendor/github.com/golang/protobuf/proto/text.go b/vendor/github.com/golang/protobuf/proto/text.go deleted file mode 100644 index 965876bf0..000000000 --- a/vendor/github.com/golang/protobuf/proto/text.go +++ /dev/null @@ -1,854 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT -// OWNER 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. - -package proto - -// Functions for writing the text protocol buffer format. - -import ( - "bufio" - "bytes" - "encoding" - "errors" - "fmt" - "io" - "log" - "math" - "reflect" - "sort" - "strings" -) - -var ( - newline = []byte("\n") - spaces = []byte(" ") - gtNewline = []byte(">\n") - endBraceNewline = []byte("}\n") - backslashN = []byte{'\\', 'n'} - backslashR = []byte{'\\', 'r'} - backslashT = []byte{'\\', 't'} - backslashDQ = []byte{'\\', '"'} - backslashBS = []byte{'\\', '\\'} - posInf = []byte("inf") - negInf = []byte("-inf") - nan = []byte("nan") -) - -type writer interface { - io.Writer - WriteByte(byte) error -} - -// textWriter is an io.Writer that tracks its indentation level. -type textWriter struct { - ind int - complete bool // if the current position is a complete line - compact bool // whether to write out as a one-liner - w writer -} - -func (w *textWriter) WriteString(s string) (n int, err error) { - if !strings.Contains(s, "\n") { - if !w.compact && w.complete { - w.writeIndent() - } - w.complete = false - return io.WriteString(w.w, s) - } - // WriteString is typically called without newlines, so this - // codepath and its copy are rare. We copy to avoid - // duplicating all of Write's logic here. - return w.Write([]byte(s)) -} - -func (w *textWriter) Write(p []byte) (n int, err error) { - newlines := bytes.Count(p, newline) - if newlines == 0 { - if !w.compact && w.complete { - w.writeIndent() - } - n, err = w.w.Write(p) - w.complete = false - return n, err - } - - frags := bytes.SplitN(p, newline, newlines+1) - if w.compact { - for i, frag := range frags { - if i > 0 { - if err := w.w.WriteByte(' '); err != nil { - return n, err - } - n++ - } - nn, err := w.w.Write(frag) - n += nn - if err != nil { - return n, err - } - } - return n, nil - } - - for i, frag := range frags { - if w.complete { - w.writeIndent() - } - nn, err := w.w.Write(frag) - n += nn - if err != nil { - return n, err - } - if i+1 < len(frags) { - if err := w.w.WriteByte('\n'); err != nil { - return n, err - } - n++ - } - } - w.complete = len(frags[len(frags)-1]) == 0 - return n, nil -} - -func (w *textWriter) WriteByte(c byte) error { - if w.compact && c == '\n' { - c = ' ' - } - if !w.compact && w.complete { - w.writeIndent() - } - err := w.w.WriteByte(c) - w.complete = c == '\n' - return err -} - -func (w *textWriter) indent() { w.ind++ } - -func (w *textWriter) unindent() { - if w.ind == 0 { - log.Print("proto: textWriter unindented too far") - return - } - w.ind-- -} - -func writeName(w *textWriter, props *Properties) error { - if _, err := w.WriteString(props.OrigName); err != nil { - return err - } - if props.Wire != "group" { - return w.WriteByte(':') - } - return nil -} - -// raw is the interface satisfied by RawMessage. -type raw interface { - Bytes() []byte -} - -func requiresQuotes(u string) bool { - // When type URL contains any characters except [0-9A-Za-z./\-]*, it must be quoted. - for _, ch := range u { - switch { - case ch == '.' || ch == '/' || ch == '_': - continue - case '0' <= ch && ch <= '9': - continue - case 'A' <= ch && ch <= 'Z': - continue - case 'a' <= ch && ch <= 'z': - continue - default: - return true - } - } - return false -} - -// isAny reports whether sv is a google.protobuf.Any message -func isAny(sv reflect.Value) bool { - type wkt interface { - XXX_WellKnownType() string - } - t, ok := sv.Addr().Interface().(wkt) - return ok && t.XXX_WellKnownType() == "Any" -} - -// writeProto3Any writes an expanded google.protobuf.Any message. -// -// It returns (false, nil) if sv value can't be unmarshaled (e.g. because -// required messages are not linked in). -// -// It returns (true, error) when sv was written in expanded format or an error -// was encountered. -func (tm *TextMarshaler) writeProto3Any(w *textWriter, sv reflect.Value) (bool, error) { - turl := sv.FieldByName("TypeUrl") - val := sv.FieldByName("Value") - if !turl.IsValid() || !val.IsValid() { - return true, errors.New("proto: invalid google.protobuf.Any message") - } - - b, ok := val.Interface().([]byte) - if !ok { - return true, errors.New("proto: invalid google.protobuf.Any message") - } - - parts := strings.Split(turl.String(), "/") - mt := MessageType(parts[len(parts)-1]) - if mt == nil { - return false, nil - } - m := reflect.New(mt.Elem()) - if err := Unmarshal(b, m.Interface().(Message)); err != nil { - return false, nil - } - w.Write([]byte("[")) - u := turl.String() - if requiresQuotes(u) { - writeString(w, u) - } else { - w.Write([]byte(u)) - } - if w.compact { - w.Write([]byte("]:<")) - } else { - w.Write([]byte("]: <\n")) - w.ind++ - } - if err := tm.writeStruct(w, m.Elem()); err != nil { - return true, err - } - if w.compact { - w.Write([]byte("> ")) - } else { - w.ind-- - w.Write([]byte(">\n")) - } - return true, nil -} - -func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error { - if tm.ExpandAny && isAny(sv) { - if canExpand, err := tm.writeProto3Any(w, sv); canExpand { - return err - } - } - st := sv.Type() - sprops := GetProperties(st) - for i := 0; i < sv.NumField(); i++ { - fv := sv.Field(i) - props := sprops.Prop[i] - name := st.Field(i).Name - - if strings.HasPrefix(name, "XXX_") { - // There are two XXX_ fields: - // XXX_unrecognized []byte - // XXX_extensions map[int32]proto.Extension - // The first is handled here; - // the second is handled at the bottom of this function. - if name == "XXX_unrecognized" && !fv.IsNil() { - if err := writeUnknownStruct(w, fv.Interface().([]byte)); err != nil { - return err - } - } - continue - } - if fv.Kind() == reflect.Ptr && fv.IsNil() { - // Field not filled in. This could be an optional field or - // a required field that wasn't filled in. Either way, there - // isn't anything we can show for it. - continue - } - if fv.Kind() == reflect.Slice && fv.IsNil() { - // Repeated field that is empty, or a bytes field that is unused. - continue - } - - if props.Repeated && fv.Kind() == reflect.Slice { - // Repeated field. - for j := 0; j < fv.Len(); j++ { - if err := writeName(w, props); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - v := fv.Index(j) - if v.Kind() == reflect.Ptr && v.IsNil() { - // A nil message in a repeated field is not valid, - // but we can handle that more gracefully than panicking. - if _, err := w.Write([]byte("\n")); err != nil { - return err - } - continue - } - if err := tm.writeAny(w, v, props); err != nil { - return err - } - if err := w.WriteByte('\n'); err != nil { - return err - } - } - continue - } - if fv.Kind() == reflect.Map { - // Map fields are rendered as a repeated struct with key/value fields. - keys := fv.MapKeys() - sort.Sort(mapKeys(keys)) - for _, key := range keys { - val := fv.MapIndex(key) - if err := writeName(w, props); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - // open struct - if err := w.WriteByte('<'); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte('\n'); err != nil { - return err - } - } - w.indent() - // key - if _, err := w.WriteString("key:"); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - if err := tm.writeAny(w, key, props.mkeyprop); err != nil { - return err - } - if err := w.WriteByte('\n'); err != nil { - return err - } - // nil values aren't legal, but we can avoid panicking because of them. - if val.Kind() != reflect.Ptr || !val.IsNil() { - // value - if _, err := w.WriteString("value:"); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - if err := tm.writeAny(w, val, props.mvalprop); err != nil { - return err - } - if err := w.WriteByte('\n'); err != nil { - return err - } - } - // close struct - w.unindent() - if err := w.WriteByte('>'); err != nil { - return err - } - if err := w.WriteByte('\n'); err != nil { - return err - } - } - continue - } - if props.proto3 && fv.Kind() == reflect.Slice && fv.Len() == 0 { - // empty bytes field - continue - } - if fv.Kind() != reflect.Ptr && fv.Kind() != reflect.Slice { - // proto3 non-repeated scalar field; skip if zero value - if isProto3Zero(fv) { - continue - } - } - - if fv.Kind() == reflect.Interface { - // Check if it is a oneof. - if st.Field(i).Tag.Get("protobuf_oneof") != "" { - // fv is nil, or holds a pointer to generated struct. - // That generated struct has exactly one field, - // which has a protobuf struct tag. - if fv.IsNil() { - continue - } - inner := fv.Elem().Elem() // interface -> *T -> T - tag := inner.Type().Field(0).Tag.Get("protobuf") - props = new(Properties) // Overwrite the outer props var, but not its pointee. - props.Parse(tag) - // Write the value in the oneof, not the oneof itself. - fv = inner.Field(0) - - // Special case to cope with malformed messages gracefully: - // If the value in the oneof is a nil pointer, don't panic - // in writeAny. - if fv.Kind() == reflect.Ptr && fv.IsNil() { - // Use errors.New so writeAny won't render quotes. - msg := errors.New("/* nil */") - fv = reflect.ValueOf(&msg).Elem() - } - } - } - - if err := writeName(w, props); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - if b, ok := fv.Interface().(raw); ok { - if err := writeRaw(w, b.Bytes()); err != nil { - return err - } - continue - } - - // Enums have a String method, so writeAny will work fine. - if err := tm.writeAny(w, fv, props); err != nil { - return err - } - - if err := w.WriteByte('\n'); err != nil { - return err - } - } - - // Extensions (the XXX_extensions field). - pv := sv.Addr() - if _, ok := extendable(pv.Interface()); ok { - if err := tm.writeExtensions(w, pv); err != nil { - return err - } - } - - return nil -} - -// writeRaw writes an uninterpreted raw message. -func writeRaw(w *textWriter, b []byte) error { - if err := w.WriteByte('<'); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte('\n'); err != nil { - return err - } - } - w.indent() - if err := writeUnknownStruct(w, b); err != nil { - return err - } - w.unindent() - if err := w.WriteByte('>'); err != nil { - return err - } - return nil -} - -// writeAny writes an arbitrary field. -func (tm *TextMarshaler) writeAny(w *textWriter, v reflect.Value, props *Properties) error { - v = reflect.Indirect(v) - - // Floats have special cases. - if v.Kind() == reflect.Float32 || v.Kind() == reflect.Float64 { - x := v.Float() - var b []byte - switch { - case math.IsInf(x, 1): - b = posInf - case math.IsInf(x, -1): - b = negInf - case math.IsNaN(x): - b = nan - } - if b != nil { - _, err := w.Write(b) - return err - } - // Other values are handled below. - } - - // We don't attempt to serialise every possible value type; only those - // that can occur in protocol buffers. - switch v.Kind() { - case reflect.Slice: - // Should only be a []byte; repeated fields are handled in writeStruct. - if err := writeString(w, string(v.Bytes())); err != nil { - return err - } - case reflect.String: - if err := writeString(w, v.String()); err != nil { - return err - } - case reflect.Struct: - // Required/optional group/message. - var bra, ket byte = '<', '>' - if props != nil && props.Wire == "group" { - bra, ket = '{', '}' - } - if err := w.WriteByte(bra); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte('\n'); err != nil { - return err - } - } - w.indent() - if etm, ok := v.Interface().(encoding.TextMarshaler); ok { - text, err := etm.MarshalText() - if err != nil { - return err - } - if _, err = w.Write(text); err != nil { - return err - } - } else if err := tm.writeStruct(w, v); err != nil { - return err - } - w.unindent() - if err := w.WriteByte(ket); err != nil { - return err - } - default: - _, err := fmt.Fprint(w, v.Interface()) - return err - } - return nil -} - -// equivalent to C's isprint. -func isprint(c byte) bool { - return c >= 0x20 && c < 0x7f -} - -// writeString writes a string in the protocol buffer text format. -// It is similar to strconv.Quote except we don't use Go escape sequences, -// we treat the string as a byte sequence, and we use octal escapes. -// These differences are to maintain interoperability with the other -// languages' implementations of the text format. -func writeString(w *textWriter, s string) error { - // use WriteByte here to get any needed indent - if err := w.WriteByte('"'); err != nil { - return err - } - // Loop over the bytes, not the runes. - for i := 0; i < len(s); i++ { - var err error - // Divergence from C++: we don't escape apostrophes. - // There's no need to escape them, and the C++ parser - // copes with a naked apostrophe. - switch c := s[i]; c { - case '\n': - _, err = w.w.Write(backslashN) - case '\r': - _, err = w.w.Write(backslashR) - case '\t': - _, err = w.w.Write(backslashT) - case '"': - _, err = w.w.Write(backslashDQ) - case '\\': - _, err = w.w.Write(backslashBS) - default: - if isprint(c) { - err = w.w.WriteByte(c) - } else { - _, err = fmt.Fprintf(w.w, "\\%03o", c) - } - } - if err != nil { - return err - } - } - return w.WriteByte('"') -} - -func writeUnknownStruct(w *textWriter, data []byte) (err error) { - if !w.compact { - if _, err := fmt.Fprintf(w, "/* %d unknown bytes */\n", len(data)); err != nil { - return err - } - } - b := NewBuffer(data) - for b.index < len(b.buf) { - x, err := b.DecodeVarint() - if err != nil { - _, err := fmt.Fprintf(w, "/* %v */\n", err) - return err - } - wire, tag := x&7, x>>3 - if wire == WireEndGroup { - w.unindent() - if _, err := w.Write(endBraceNewline); err != nil { - return err - } - continue - } - if _, err := fmt.Fprint(w, tag); err != nil { - return err - } - if wire != WireStartGroup { - if err := w.WriteByte(':'); err != nil { - return err - } - } - if !w.compact || wire == WireStartGroup { - if err := w.WriteByte(' '); err != nil { - return err - } - } - switch wire { - case WireBytes: - buf, e := b.DecodeRawBytes(false) - if e == nil { - _, err = fmt.Fprintf(w, "%q", buf) - } else { - _, err = fmt.Fprintf(w, "/* %v */", e) - } - case WireFixed32: - x, err = b.DecodeFixed32() - err = writeUnknownInt(w, x, err) - case WireFixed64: - x, err = b.DecodeFixed64() - err = writeUnknownInt(w, x, err) - case WireStartGroup: - err = w.WriteByte('{') - w.indent() - case WireVarint: - x, err = b.DecodeVarint() - err = writeUnknownInt(w, x, err) - default: - _, err = fmt.Fprintf(w, "/* unknown wire type %d */", wire) - } - if err != nil { - return err - } - if err = w.WriteByte('\n'); err != nil { - return err - } - } - return nil -} - -func writeUnknownInt(w *textWriter, x uint64, err error) error { - if err == nil { - _, err = fmt.Fprint(w, x) - } else { - _, err = fmt.Fprintf(w, "/* %v */", err) - } - return err -} - -type int32Slice []int32 - -func (s int32Slice) Len() int { return len(s) } -func (s int32Slice) Less(i, j int) bool { return s[i] < s[j] } -func (s int32Slice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } - -// writeExtensions writes all the extensions in pv. -// pv is assumed to be a pointer to a protocol message struct that is extendable. -func (tm *TextMarshaler) writeExtensions(w *textWriter, pv reflect.Value) error { - emap := extensionMaps[pv.Type().Elem()] - ep, _ := extendable(pv.Interface()) - - // Order the extensions by ID. - // This isn't strictly necessary, but it will give us - // canonical output, which will also make testing easier. - m, mu := ep.extensionsRead() - if m == nil { - return nil - } - mu.Lock() - ids := make([]int32, 0, len(m)) - for id := range m { - ids = append(ids, id) - } - sort.Sort(int32Slice(ids)) - mu.Unlock() - - for _, extNum := range ids { - ext := m[extNum] - var desc *ExtensionDesc - if emap != nil { - desc = emap[extNum] - } - if desc == nil { - // Unknown extension. - if err := writeUnknownStruct(w, ext.enc); err != nil { - return err - } - continue - } - - pb, err := GetExtension(ep, desc) - if err != nil { - return fmt.Errorf("failed getting extension: %v", err) - } - - // Repeated extensions will appear as a slice. - if !desc.repeated() { - if err := tm.writeExtension(w, desc.Name, pb); err != nil { - return err - } - } else { - v := reflect.ValueOf(pb) - for i := 0; i < v.Len(); i++ { - if err := tm.writeExtension(w, desc.Name, v.Index(i).Interface()); err != nil { - return err - } - } - } - } - return nil -} - -func (tm *TextMarshaler) writeExtension(w *textWriter, name string, pb interface{}) error { - if _, err := fmt.Fprintf(w, "[%s]:", name); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - if err := tm.writeAny(w, reflect.ValueOf(pb), nil); err != nil { - return err - } - if err := w.WriteByte('\n'); err != nil { - return err - } - return nil -} - -func (w *textWriter) writeIndent() { - if !w.complete { - return - } - remain := w.ind * 2 - for remain > 0 { - n := remain - if n > len(spaces) { - n = len(spaces) - } - w.w.Write(spaces[:n]) - remain -= n - } - w.complete = false -} - -// TextMarshaler is a configurable text format marshaler. -type TextMarshaler struct { - Compact bool // use compact text format (one line). - ExpandAny bool // expand google.protobuf.Any messages of known types -} - -// Marshal writes a given protocol buffer in text format. -// The only errors returned are from w. -func (tm *TextMarshaler) Marshal(w io.Writer, pb Message) error { - val := reflect.ValueOf(pb) - if pb == nil || val.IsNil() { - w.Write([]byte("")) - return nil - } - var bw *bufio.Writer - ww, ok := w.(writer) - if !ok { - bw = bufio.NewWriter(w) - ww = bw - } - aw := &textWriter{ - w: ww, - complete: true, - compact: tm.Compact, - } - - if etm, ok := pb.(encoding.TextMarshaler); ok { - text, err := etm.MarshalText() - if err != nil { - return err - } - if _, err = aw.Write(text); err != nil { - return err - } - if bw != nil { - return bw.Flush() - } - return nil - } - // Dereference the received pointer so we don't have outer < and >. - v := reflect.Indirect(val) - if err := tm.writeStruct(aw, v); err != nil { - return err - } - if bw != nil { - return bw.Flush() - } - return nil -} - -// Text is the same as Marshal, but returns the string directly. -func (tm *TextMarshaler) Text(pb Message) string { - var buf bytes.Buffer - tm.Marshal(&buf, pb) - return buf.String() -} - -var ( - defaultTextMarshaler = TextMarshaler{} - compactTextMarshaler = TextMarshaler{Compact: true} -) - -// TODO: consider removing some of the Marshal functions below. - -// MarshalText writes a given protocol buffer in text format. -// The only errors returned are from w. -func MarshalText(w io.Writer, pb Message) error { return defaultTextMarshaler.Marshal(w, pb) } - -// MarshalTextString is the same as MarshalText, but returns the string directly. -func MarshalTextString(pb Message) string { return defaultTextMarshaler.Text(pb) } - -// CompactText writes a given protocol buffer in compact text format (one line). -func CompactText(w io.Writer, pb Message) error { return compactTextMarshaler.Marshal(w, pb) } - -// CompactTextString is the same as CompactText, but returns the string directly. -func CompactTextString(pb Message) string { return compactTextMarshaler.Text(pb) } diff --git a/vendor/github.com/golang/protobuf/proto/text_parser.go b/vendor/github.com/golang/protobuf/proto/text_parser.go deleted file mode 100644 index 61f83c1e1..000000000 --- a/vendor/github.com/golang/protobuf/proto/text_parser.go +++ /dev/null @@ -1,895 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT -// OWNER 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. - -package proto - -// Functions for parsing the Text protocol buffer format. -// TODO: message sets. - -import ( - "encoding" - "errors" - "fmt" - "reflect" - "strconv" - "strings" - "unicode/utf8" -) - -// Error string emitted when deserializing Any and fields are already set -const anyRepeatedlyUnpacked = "Any message unpacked multiple times, or %q already set" - -type ParseError struct { - Message string - Line int // 1-based line number - Offset int // 0-based byte offset from start of input -} - -func (p *ParseError) Error() string { - if p.Line == 1 { - // show offset only for first line - return fmt.Sprintf("line 1.%d: %v", p.Offset, p.Message) - } - return fmt.Sprintf("line %d: %v", p.Line, p.Message) -} - -type token struct { - value string - err *ParseError - line int // line number - offset int // byte number from start of input, not start of line - unquoted string // the unquoted version of value, if it was a quoted string -} - -func (t *token) String() string { - if t.err == nil { - return fmt.Sprintf("%q (line=%d, offset=%d)", t.value, t.line, t.offset) - } - return fmt.Sprintf("parse error: %v", t.err) -} - -type textParser struct { - s string // remaining input - done bool // whether the parsing is finished (success or error) - backed bool // whether back() was called - offset, line int - cur token -} - -func newTextParser(s string) *textParser { - p := new(textParser) - p.s = s - p.line = 1 - p.cur.line = 1 - return p -} - -func (p *textParser) errorf(format string, a ...interface{}) *ParseError { - pe := &ParseError{fmt.Sprintf(format, a...), p.cur.line, p.cur.offset} - p.cur.err = pe - p.done = true - return pe -} - -// Numbers and identifiers are matched by [-+._A-Za-z0-9] -func isIdentOrNumberChar(c byte) bool { - switch { - case 'A' <= c && c <= 'Z', 'a' <= c && c <= 'z': - return true - case '0' <= c && c <= '9': - return true - } - switch c { - case '-', '+', '.', '_': - return true - } - return false -} - -func isWhitespace(c byte) bool { - switch c { - case ' ', '\t', '\n', '\r': - return true - } - return false -} - -func isQuote(c byte) bool { - switch c { - case '"', '\'': - return true - } - return false -} - -func (p *textParser) skipWhitespace() { - i := 0 - for i < len(p.s) && (isWhitespace(p.s[i]) || p.s[i] == '#') { - if p.s[i] == '#' { - // comment; skip to end of line or input - for i < len(p.s) && p.s[i] != '\n' { - i++ - } - if i == len(p.s) { - break - } - } - if p.s[i] == '\n' { - p.line++ - } - i++ - } - p.offset += i - p.s = p.s[i:len(p.s)] - if len(p.s) == 0 { - p.done = true - } -} - -func (p *textParser) advance() { - // Skip whitespace - p.skipWhitespace() - if p.done { - return - } - - // Start of non-whitespace - p.cur.err = nil - p.cur.offset, p.cur.line = p.offset, p.line - p.cur.unquoted = "" - switch p.s[0] { - case '<', '>', '{', '}', ':', '[', ']', ';', ',', '/': - // Single symbol - p.cur.value, p.s = p.s[0:1], p.s[1:len(p.s)] - case '"', '\'': - // Quoted string - i := 1 - for i < len(p.s) && p.s[i] != p.s[0] && p.s[i] != '\n' { - if p.s[i] == '\\' && i+1 < len(p.s) { - // skip escaped char - i++ - } - i++ - } - if i >= len(p.s) || p.s[i] != p.s[0] { - p.errorf("unmatched quote") - return - } - unq, err := unquoteC(p.s[1:i], rune(p.s[0])) - if err != nil { - p.errorf("invalid quoted string %s: %v", p.s[0:i+1], err) - return - } - p.cur.value, p.s = p.s[0:i+1], p.s[i+1:len(p.s)] - p.cur.unquoted = unq - default: - i := 0 - for i < len(p.s) && isIdentOrNumberChar(p.s[i]) { - i++ - } - if i == 0 { - p.errorf("unexpected byte %#x", p.s[0]) - return - } - p.cur.value, p.s = p.s[0:i], p.s[i:len(p.s)] - } - p.offset += len(p.cur.value) -} - -var ( - errBadUTF8 = errors.New("proto: bad UTF-8") - errBadHex = errors.New("proto: bad hexadecimal") -) - -func unquoteC(s string, quote rune) (string, error) { - // This is based on C++'s tokenizer.cc. - // Despite its name, this is *not* parsing C syntax. - // For instance, "\0" is an invalid quoted string. - - // Avoid allocation in trivial cases. - simple := true - for _, r := range s { - if r == '\\' || r == quote { - simple = false - break - } - } - if simple { - return s, nil - } - - buf := make([]byte, 0, 3*len(s)/2) - for len(s) > 0 { - r, n := utf8.DecodeRuneInString(s) - if r == utf8.RuneError && n == 1 { - return "", errBadUTF8 - } - s = s[n:] - if r != '\\' { - if r < utf8.RuneSelf { - buf = append(buf, byte(r)) - } else { - buf = append(buf, string(r)...) - } - continue - } - - ch, tail, err := unescape(s) - if err != nil { - return "", err - } - buf = append(buf, ch...) - s = tail - } - return string(buf), nil -} - -func unescape(s string) (ch string, tail string, err error) { - r, n := utf8.DecodeRuneInString(s) - if r == utf8.RuneError && n == 1 { - return "", "", errBadUTF8 - } - s = s[n:] - switch r { - case 'a': - return "\a", s, nil - case 'b': - return "\b", s, nil - case 'f': - return "\f", s, nil - case 'n': - return "\n", s, nil - case 'r': - return "\r", s, nil - case 't': - return "\t", s, nil - case 'v': - return "\v", s, nil - case '?': - return "?", s, nil // trigraph workaround - case '\'', '"', '\\': - return string(r), s, nil - case '0', '1', '2', '3', '4', '5', '6', '7', 'x', 'X': - if len(s) < 2 { - return "", "", fmt.Errorf(`\%c requires 2 following digits`, r) - } - base := 8 - ss := s[:2] - s = s[2:] - if r == 'x' || r == 'X' { - base = 16 - } else { - ss = string(r) + ss - } - i, err := strconv.ParseUint(ss, base, 8) - if err != nil { - return "", "", err - } - return string([]byte{byte(i)}), s, nil - case 'u', 'U': - n := 4 - if r == 'U' { - n = 8 - } - if len(s) < n { - return "", "", fmt.Errorf(`\%c requires %d digits`, r, n) - } - - bs := make([]byte, n/2) - for i := 0; i < n; i += 2 { - a, ok1 := unhex(s[i]) - b, ok2 := unhex(s[i+1]) - if !ok1 || !ok2 { - return "", "", errBadHex - } - bs[i/2] = a<<4 | b - } - s = s[n:] - return string(bs), s, nil - } - return "", "", fmt.Errorf(`unknown escape \%c`, r) -} - -// Adapted from src/pkg/strconv/quote.go. -func unhex(b byte) (v byte, ok bool) { - switch { - case '0' <= b && b <= '9': - return b - '0', true - case 'a' <= b && b <= 'f': - return b - 'a' + 10, true - case 'A' <= b && b <= 'F': - return b - 'A' + 10, true - } - return 0, false -} - -// Back off the parser by one token. Can only be done between calls to next(). -// It makes the next advance() a no-op. -func (p *textParser) back() { p.backed = true } - -// Advances the parser and returns the new current token. -func (p *textParser) next() *token { - if p.backed || p.done { - p.backed = false - return &p.cur - } - p.advance() - if p.done { - p.cur.value = "" - } else if len(p.cur.value) > 0 && isQuote(p.cur.value[0]) { - // Look for multiple quoted strings separated by whitespace, - // and concatenate them. - cat := p.cur - for { - p.skipWhitespace() - if p.done || !isQuote(p.s[0]) { - break - } - p.advance() - if p.cur.err != nil { - return &p.cur - } - cat.value += " " + p.cur.value - cat.unquoted += p.cur.unquoted - } - p.done = false // parser may have seen EOF, but we want to return cat - p.cur = cat - } - return &p.cur -} - -func (p *textParser) consumeToken(s string) error { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value != s { - p.back() - return p.errorf("expected %q, found %q", s, tok.value) - } - return nil -} - -// Return a RequiredNotSetError indicating which required field was not set. -func (p *textParser) missingRequiredFieldError(sv reflect.Value) *RequiredNotSetError { - st := sv.Type() - sprops := GetProperties(st) - for i := 0; i < st.NumField(); i++ { - if !isNil(sv.Field(i)) { - continue - } - - props := sprops.Prop[i] - if props.Required { - return &RequiredNotSetError{fmt.Sprintf("%v.%v", st, props.OrigName)} - } - } - return &RequiredNotSetError{fmt.Sprintf("%v.", st)} // should not happen -} - -// Returns the index in the struct for the named field, as well as the parsed tag properties. -func structFieldByName(sprops *StructProperties, name string) (int, *Properties, bool) { - i, ok := sprops.decoderOrigNames[name] - if ok { - return i, sprops.Prop[i], true - } - return -1, nil, false -} - -// Consume a ':' from the input stream (if the next token is a colon), -// returning an error if a colon is needed but not present. -func (p *textParser) checkForColon(props *Properties, typ reflect.Type) *ParseError { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value != ":" { - // Colon is optional when the field is a group or message. - needColon := true - switch props.Wire { - case "group": - needColon = false - case "bytes": - // A "bytes" field is either a message, a string, or a repeated field; - // those three become *T, *string and []T respectively, so we can check for - // this field being a pointer to a non-string. - if typ.Kind() == reflect.Ptr { - // *T or *string - if typ.Elem().Kind() == reflect.String { - break - } - } else if typ.Kind() == reflect.Slice { - // []T or []*T - if typ.Elem().Kind() != reflect.Ptr { - break - } - } else if typ.Kind() == reflect.String { - // The proto3 exception is for a string field, - // which requires a colon. - break - } - needColon = false - } - if needColon { - return p.errorf("expected ':', found %q", tok.value) - } - p.back() - } - return nil -} - -func (p *textParser) readStruct(sv reflect.Value, terminator string) error { - st := sv.Type() - sprops := GetProperties(st) - reqCount := sprops.reqCount - var reqFieldErr error - fieldSet := make(map[string]bool) - // A struct is a sequence of "name: value", terminated by one of - // '>' or '}', or the end of the input. A name may also be - // "[extension]" or "[type/url]". - // - // The whole struct can also be an expanded Any message, like: - // [type/url] < ... struct contents ... > - for { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value == terminator { - break - } - if tok.value == "[" { - // Looks like an extension or an Any. - // - // TODO: Check whether we need to handle - // namespace rooted names (e.g. ".something.Foo"). - extName, err := p.consumeExtName() - if err != nil { - return err - } - - if s := strings.LastIndex(extName, "/"); s >= 0 { - // If it contains a slash, it's an Any type URL. - messageName := extName[s+1:] - mt := MessageType(messageName) - if mt == nil { - return p.errorf("unrecognized message %q in google.protobuf.Any", messageName) - } - tok = p.next() - if tok.err != nil { - return tok.err - } - // consume an optional colon - if tok.value == ":" { - tok = p.next() - if tok.err != nil { - return tok.err - } - } - var terminator string - switch tok.value { - case "<": - terminator = ">" - case "{": - terminator = "}" - default: - return p.errorf("expected '{' or '<', found %q", tok.value) - } - v := reflect.New(mt.Elem()) - if pe := p.readStruct(v.Elem(), terminator); pe != nil { - return pe - } - b, err := Marshal(v.Interface().(Message)) - if err != nil { - return p.errorf("failed to marshal message of type %q: %v", messageName, err) - } - if fieldSet["type_url"] { - return p.errorf(anyRepeatedlyUnpacked, "type_url") - } - if fieldSet["value"] { - return p.errorf(anyRepeatedlyUnpacked, "value") - } - sv.FieldByName("TypeUrl").SetString(extName) - sv.FieldByName("Value").SetBytes(b) - fieldSet["type_url"] = true - fieldSet["value"] = true - continue - } - - var desc *ExtensionDesc - // This could be faster, but it's functional. - // TODO: Do something smarter than a linear scan. - for _, d := range RegisteredExtensions(reflect.New(st).Interface().(Message)) { - if d.Name == extName { - desc = d - break - } - } - if desc == nil { - return p.errorf("unrecognized extension %q", extName) - } - - props := &Properties{} - props.Parse(desc.Tag) - - typ := reflect.TypeOf(desc.ExtensionType) - if err := p.checkForColon(props, typ); err != nil { - return err - } - - rep := desc.repeated() - - // Read the extension structure, and set it in - // the value we're constructing. - var ext reflect.Value - if !rep { - ext = reflect.New(typ).Elem() - } else { - ext = reflect.New(typ.Elem()).Elem() - } - if err := p.readAny(ext, props); err != nil { - if _, ok := err.(*RequiredNotSetError); !ok { - return err - } - reqFieldErr = err - } - ep := sv.Addr().Interface().(Message) - if !rep { - SetExtension(ep, desc, ext.Interface()) - } else { - old, err := GetExtension(ep, desc) - var sl reflect.Value - if err == nil { - sl = reflect.ValueOf(old) // existing slice - } else { - sl = reflect.MakeSlice(typ, 0, 1) - } - sl = reflect.Append(sl, ext) - SetExtension(ep, desc, sl.Interface()) - } - if err := p.consumeOptionalSeparator(); err != nil { - return err - } - continue - } - - // This is a normal, non-extension field. - name := tok.value - var dst reflect.Value - fi, props, ok := structFieldByName(sprops, name) - if ok { - dst = sv.Field(fi) - } else if oop, ok := sprops.OneofTypes[name]; ok { - // It is a oneof. - props = oop.Prop - nv := reflect.New(oop.Type.Elem()) - dst = nv.Elem().Field(0) - field := sv.Field(oop.Field) - if !field.IsNil() { - return p.errorf("field '%s' would overwrite already parsed oneof '%s'", name, sv.Type().Field(oop.Field).Name) - } - field.Set(nv) - } - if !dst.IsValid() { - return p.errorf("unknown field name %q in %v", name, st) - } - - if dst.Kind() == reflect.Map { - // Consume any colon. - if err := p.checkForColon(props, dst.Type()); err != nil { - return err - } - - // Construct the map if it doesn't already exist. - if dst.IsNil() { - dst.Set(reflect.MakeMap(dst.Type())) - } - key := reflect.New(dst.Type().Key()).Elem() - val := reflect.New(dst.Type().Elem()).Elem() - - // The map entry should be this sequence of tokens: - // < key : KEY value : VALUE > - // However, implementations may omit key or value, and technically - // we should support them in any order. See b/28924776 for a time - // this went wrong. - - tok := p.next() - var terminator string - switch tok.value { - case "<": - terminator = ">" - case "{": - terminator = "}" - default: - return p.errorf("expected '{' or '<', found %q", tok.value) - } - for { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value == terminator { - break - } - switch tok.value { - case "key": - if err := p.consumeToken(":"); err != nil { - return err - } - if err := p.readAny(key, props.mkeyprop); err != nil { - return err - } - if err := p.consumeOptionalSeparator(); err != nil { - return err - } - case "value": - if err := p.checkForColon(props.mvalprop, dst.Type().Elem()); err != nil { - return err - } - if err := p.readAny(val, props.mvalprop); err != nil { - return err - } - if err := p.consumeOptionalSeparator(); err != nil { - return err - } - default: - p.back() - return p.errorf(`expected "key", "value", or %q, found %q`, terminator, tok.value) - } - } - - dst.SetMapIndex(key, val) - continue - } - - // Check that it's not already set if it's not a repeated field. - if !props.Repeated && fieldSet[name] { - return p.errorf("non-repeated field %q was repeated", name) - } - - if err := p.checkForColon(props, dst.Type()); err != nil { - return err - } - - // Parse into the field. - fieldSet[name] = true - if err := p.readAny(dst, props); err != nil { - if _, ok := err.(*RequiredNotSetError); !ok { - return err - } - reqFieldErr = err - } - if props.Required { - reqCount-- - } - - if err := p.consumeOptionalSeparator(); err != nil { - return err - } - - } - - if reqCount > 0 { - return p.missingRequiredFieldError(sv) - } - return reqFieldErr -} - -// consumeExtName consumes extension name or expanded Any type URL and the -// following ']'. It returns the name or URL consumed. -func (p *textParser) consumeExtName() (string, error) { - tok := p.next() - if tok.err != nil { - return "", tok.err - } - - // If extension name or type url is quoted, it's a single token. - if len(tok.value) > 2 && isQuote(tok.value[0]) && tok.value[len(tok.value)-1] == tok.value[0] { - name, err := unquoteC(tok.value[1:len(tok.value)-1], rune(tok.value[0])) - if err != nil { - return "", err - } - return name, p.consumeToken("]") - } - - // Consume everything up to "]" - var parts []string - for tok.value != "]" { - parts = append(parts, tok.value) - tok = p.next() - if tok.err != nil { - return "", p.errorf("unrecognized type_url or extension name: %s", tok.err) - } - } - return strings.Join(parts, ""), nil -} - -// consumeOptionalSeparator consumes an optional semicolon or comma. -// It is used in readStruct to provide backward compatibility. -func (p *textParser) consumeOptionalSeparator() error { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value != ";" && tok.value != "," { - p.back() - } - return nil -} - -func (p *textParser) readAny(v reflect.Value, props *Properties) error { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value == "" { - return p.errorf("unexpected EOF") - } - - switch fv := v; fv.Kind() { - case reflect.Slice: - at := v.Type() - if at.Elem().Kind() == reflect.Uint8 { - // Special case for []byte - if tok.value[0] != '"' && tok.value[0] != '\'' { - // Deliberately written out here, as the error after - // this switch statement would write "invalid []byte: ...", - // which is not as user-friendly. - return p.errorf("invalid string: %v", tok.value) - } - bytes := []byte(tok.unquoted) - fv.Set(reflect.ValueOf(bytes)) - return nil - } - // Repeated field. - if tok.value == "[" { - // Repeated field with list notation, like [1,2,3]. - for { - fv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem())) - err := p.readAny(fv.Index(fv.Len()-1), props) - if err != nil { - return err - } - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value == "]" { - break - } - if tok.value != "," { - return p.errorf("Expected ']' or ',' found %q", tok.value) - } - } - return nil - } - // One value of the repeated field. - p.back() - fv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem())) - return p.readAny(fv.Index(fv.Len()-1), props) - case reflect.Bool: - // true/1/t/True or false/f/0/False. - switch tok.value { - case "true", "1", "t", "True": - fv.SetBool(true) - return nil - case "false", "0", "f", "False": - fv.SetBool(false) - return nil - } - case reflect.Float32, reflect.Float64: - v := tok.value - // Ignore 'f' for compatibility with output generated by C++, but don't - // remove 'f' when the value is "-inf" or "inf". - if strings.HasSuffix(v, "f") && tok.value != "-inf" && tok.value != "inf" { - v = v[:len(v)-1] - } - if f, err := strconv.ParseFloat(v, fv.Type().Bits()); err == nil { - fv.SetFloat(f) - return nil - } - case reflect.Int32: - if x, err := strconv.ParseInt(tok.value, 0, 32); err == nil { - fv.SetInt(x) - return nil - } - - if len(props.Enum) == 0 { - break - } - m, ok := enumValueMaps[props.Enum] - if !ok { - break - } - x, ok := m[tok.value] - if !ok { - break - } - fv.SetInt(int64(x)) - return nil - case reflect.Int64: - if x, err := strconv.ParseInt(tok.value, 0, 64); err == nil { - fv.SetInt(x) - return nil - } - - case reflect.Ptr: - // A basic field (indirected through pointer), or a repeated message/group - p.back() - fv.Set(reflect.New(fv.Type().Elem())) - return p.readAny(fv.Elem(), props) - case reflect.String: - if tok.value[0] == '"' || tok.value[0] == '\'' { - fv.SetString(tok.unquoted) - return nil - } - case reflect.Struct: - var terminator string - switch tok.value { - case "{": - terminator = "}" - case "<": - terminator = ">" - default: - return p.errorf("expected '{' or '<', found %q", tok.value) - } - // TODO: Handle nested messages which implement encoding.TextUnmarshaler. - return p.readStruct(fv, terminator) - case reflect.Uint32: - if x, err := strconv.ParseUint(tok.value, 0, 32); err == nil { - fv.SetUint(uint64(x)) - return nil - } - case reflect.Uint64: - if x, err := strconv.ParseUint(tok.value, 0, 64); err == nil { - fv.SetUint(x) - return nil - } - } - return p.errorf("invalid %v: %v", v.Type(), tok.value) -} - -// UnmarshalText reads a protocol buffer in Text format. UnmarshalText resets pb -// before starting to unmarshal, so any existing data in pb is always removed. -// If a required field is not set and no other error occurs, -// UnmarshalText returns *RequiredNotSetError. -func UnmarshalText(s string, pb Message) error { - if um, ok := pb.(encoding.TextUnmarshaler); ok { - err := um.UnmarshalText([]byte(s)) - return err - } - pb.Reset() - v := reflect.ValueOf(pb) - if pe := newTextParser(s).readStruct(v.Elem(), ""); pe != nil { - return pe - } - return nil -} diff --git a/vendor/github.com/golang/protobuf/ptypes/any/any.pb.go b/vendor/github.com/golang/protobuf/ptypes/any/any.pb.go deleted file mode 100644 index 1fbaa44ca..000000000 --- a/vendor/github.com/golang/protobuf/ptypes/any/any.pb.go +++ /dev/null @@ -1,168 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: github.com/golang/protobuf/ptypes/any/any.proto - -/* -Package any is a generated protocol buffer package. - -It is generated from these files: - github.com/golang/protobuf/ptypes/any/any.proto - -It has these top-level messages: - Any -*/ -package any - -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package - -// `Any` contains an arbitrary serialized protocol buffer message along with a -// URL that describes the type of the serialized message. -// -// Protobuf library provides support to pack/unpack Any values in the form -// of utility functions or additional generated methods of the Any type. -// -// Example 1: Pack and unpack a message in C++. -// -// Foo foo = ...; -// Any any; -// any.PackFrom(foo); -// ... -// if (any.UnpackTo(&foo)) { -// ... -// } -// -// Example 2: Pack and unpack a message in Java. -// -// Foo foo = ...; -// Any any = Any.pack(foo); -// ... -// if (any.is(Foo.class)) { -// foo = any.unpack(Foo.class); -// } -// -// Example 3: Pack and unpack a message in Python. -// -// foo = Foo(...) -// any = Any() -// any.Pack(foo) -// ... -// if any.Is(Foo.DESCRIPTOR): -// any.Unpack(foo) -// ... -// -// The pack methods provided by protobuf library will by default use -// 'type.googleapis.com/full.type.name' as the type URL and the unpack -// methods only use the fully qualified type name after the last '/' -// in the type URL, for example "foo.bar.com/x/y.z" will yield type -// name "y.z". -// -// -// JSON -// ==== -// The JSON representation of an `Any` value uses the regular -// representation of the deserialized, embedded message, with an -// additional field `@type` which contains the type URL. Example: -// -// package google.profile; -// message Person { -// string first_name = 1; -// string last_name = 2; -// } -// -// { -// "@type": "type.googleapis.com/google.profile.Person", -// "firstName": , -// "lastName": -// } -// -// If the embedded message type is well-known and has a custom JSON -// representation, that representation will be embedded adding a field -// `value` which holds the custom JSON in addition to the `@type` -// field. Example (for message [google.protobuf.Duration][]): -// -// { -// "@type": "type.googleapis.com/google.protobuf.Duration", -// "value": "1.212s" -// } -// -type Any struct { - // A URL/resource name whose content describes the type of the - // serialized protocol buffer message. - // - // For URLs which use the scheme `http`, `https`, or no scheme, the - // following restrictions and interpretations apply: - // - // * If no scheme is provided, `https` is assumed. - // * The last segment of the URL's path must represent the fully - // qualified name of the type (as in `path/google.protobuf.Duration`). - // The name should be in a canonical form (e.g., leading "." is - // not accepted). - // * An HTTP GET on the URL must yield a [google.protobuf.Type][] - // value in binary format, or produce an error. - // * Applications are allowed to cache lookup results based on the - // URL, or have them precompiled into a binary to avoid any - // lookup. Therefore, binary compatibility needs to be preserved - // on changes to types. (Use versioned type names to manage - // breaking changes.) - // - // Schemes other than `http`, `https` (or the empty scheme) might be - // used with implementation specific semantics. - // - TypeUrl string `protobuf:"bytes,1,opt,name=type_url,json=typeUrl" json:"type_url,omitempty"` - // Must be a valid serialized protocol buffer of the above specified type. - Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` -} - -func (m *Any) Reset() { *m = Any{} } -func (m *Any) String() string { return proto.CompactTextString(m) } -func (*Any) ProtoMessage() {} -func (*Any) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } -func (*Any) XXX_WellKnownType() string { return "Any" } - -func (m *Any) GetTypeUrl() string { - if m != nil { - return m.TypeUrl - } - return "" -} - -func (m *Any) GetValue() []byte { - if m != nil { - return m.Value - } - return nil -} - -func init() { - proto.RegisterType((*Any)(nil), "google.protobuf.Any") -} - -func init() { proto.RegisterFile("github.com/golang/protobuf/ptypes/any/any.proto", fileDescriptor0) } - -var fileDescriptor0 = []byte{ - // 184 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0x4f, 0xcf, 0x2c, 0xc9, - 0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xcf, 0xcf, 0x49, 0xcc, 0x4b, 0xd7, 0x2f, 0x28, - 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x2f, 0x28, 0xa9, 0x2c, 0x48, 0x2d, 0xd6, 0x4f, 0xcc, - 0xab, 0x04, 0x61, 0x3d, 0xb0, 0xb8, 0x10, 0x7f, 0x7a, 0x7e, 0x7e, 0x7a, 0x4e, 0xaa, 0x1e, 0x4c, - 0x95, 0x92, 0x19, 0x17, 0xb3, 0x63, 0x5e, 0xa5, 0x90, 0x24, 0x17, 0x07, 0x48, 0x79, 0x7c, 0x69, - 0x51, 0x8e, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0x67, 0x10, 0x3b, 0x88, 0x1f, 0x5a, 0x94, 0x23, 0x24, - 0xc2, 0xc5, 0x5a, 0x96, 0x98, 0x53, 0x9a, 0x2a, 0xc1, 0xa4, 0xc0, 0xa8, 0xc1, 0x13, 0x04, 0xe1, - 0x38, 0xe5, 0x73, 0x09, 0x27, 0xe7, 0xe7, 0xea, 0xa1, 0x19, 0xe7, 0xc4, 0xe1, 0x98, 0x57, 0x19, - 0x00, 0xe2, 0x04, 0x30, 0x46, 0xa9, 0x12, 0xe5, 0xb8, 0x45, 0x4c, 0xcc, 0xee, 0x01, 0x4e, 0xab, - 0x98, 0xe4, 0xdc, 0x21, 0x46, 0x05, 0x40, 0x95, 0xe8, 0x85, 0xa7, 0xe6, 0xe4, 0x78, 0xe7, 0xe5, - 0x97, 0xe7, 0x85, 0x80, 0x94, 0x26, 0xb1, 0x81, 0xf5, 0x1a, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, - 0x45, 0x1f, 0x1a, 0xf2, 0xf3, 0x00, 0x00, 0x00, -} diff --git a/vendor/github.com/golang/protobuf/ptypes/any/any.proto b/vendor/github.com/golang/protobuf/ptypes/any/any.proto deleted file mode 100644 index 9bd3f50a4..000000000 --- a/vendor/github.com/golang/protobuf/ptypes/any/any.proto +++ /dev/null @@ -1,139 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT -// OWNER 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. - -syntax = "proto3"; - -package google.protobuf; - -option csharp_namespace = "Google.Protobuf.WellKnownTypes"; -option go_package = "github.com/golang/protobuf/ptypes/any"; -option java_package = "com.google.protobuf"; -option java_outer_classname = "AnyProto"; -option java_multiple_files = true; -option objc_class_prefix = "GPB"; - -// `Any` contains an arbitrary serialized protocol buffer message along with a -// URL that describes the type of the serialized message. -// -// Protobuf library provides support to pack/unpack Any values in the form -// of utility functions or additional generated methods of the Any type. -// -// Example 1: Pack and unpack a message in C++. -// -// Foo foo = ...; -// Any any; -// any.PackFrom(foo); -// ... -// if (any.UnpackTo(&foo)) { -// ... -// } -// -// Example 2: Pack and unpack a message in Java. -// -// Foo foo = ...; -// Any any = Any.pack(foo); -// ... -// if (any.is(Foo.class)) { -// foo = any.unpack(Foo.class); -// } -// -// Example 3: Pack and unpack a message in Python. -// -// foo = Foo(...) -// any = Any() -// any.Pack(foo) -// ... -// if any.Is(Foo.DESCRIPTOR): -// any.Unpack(foo) -// ... -// -// The pack methods provided by protobuf library will by default use -// 'type.googleapis.com/full.type.name' as the type URL and the unpack -// methods only use the fully qualified type name after the last '/' -// in the type URL, for example "foo.bar.com/x/y.z" will yield type -// name "y.z". -// -// -// JSON -// ==== -// The JSON representation of an `Any` value uses the regular -// representation of the deserialized, embedded message, with an -// additional field `@type` which contains the type URL. Example: -// -// package google.profile; -// message Person { -// string first_name = 1; -// string last_name = 2; -// } -// -// { -// "@type": "type.googleapis.com/google.profile.Person", -// "firstName": , -// "lastName": -// } -// -// If the embedded message type is well-known and has a custom JSON -// representation, that representation will be embedded adding a field -// `value` which holds the custom JSON in addition to the `@type` -// field. Example (for message [google.protobuf.Duration][]): -// -// { -// "@type": "type.googleapis.com/google.protobuf.Duration", -// "value": "1.212s" -// } -// -message Any { - // A URL/resource name whose content describes the type of the - // serialized protocol buffer message. - // - // For URLs which use the scheme `http`, `https`, or no scheme, the - // following restrictions and interpretations apply: - // - // * If no scheme is provided, `https` is assumed. - // * The last segment of the URL's path must represent the fully - // qualified name of the type (as in `path/google.protobuf.Duration`). - // The name should be in a canonical form (e.g., leading "." is - // not accepted). - // * An HTTP GET on the URL must yield a [google.protobuf.Type][] - // value in binary format, or produce an error. - // * Applications are allowed to cache lookup results based on the - // URL, or have them precompiled into a binary to avoid any - // lookup. Therefore, binary compatibility needs to be preserved - // on changes to types. (Use versioned type names to manage - // breaking changes.) - // - // Schemes other than `http`, `https` (or the empty scheme) might be - // used with implementation specific semantics. - // - string type_url = 1; - - // Must be a valid serialized protocol buffer of the above specified type. - bytes value = 2; -} diff --git a/vendor/github.com/jakecoffman/cron/LICENSE b/vendor/github.com/jakecoffman/cron/LICENSE deleted file mode 100644 index 3a0f627ff..000000000 --- a/vendor/github.com/jakecoffman/cron/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -Copyright (C) 2012 Rob Figueiredo -All Rights Reserved. - -MIT LICENSE - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/jakecoffman/cron/README.md b/vendor/github.com/jakecoffman/cron/README.md deleted file mode 100644 index d29a360ee..000000000 --- a/vendor/github.com/jakecoffman/cron/README.md +++ /dev/null @@ -1,141 +0,0 @@ -cron -==== - -A cron library for Go. See the -[godoc](http://go.pkgdoc.org/github.com/robfig/cron). - -## Usage - -Callers may register Funcs to be invoked on a given schedule. Cron will run -them in their own goroutines. A name must be provided. - -```go -c := cron.New() -c.AddFunc("0 5 * * * *", func() { fmt.Println("Every 5 minutes") }, "Often") -c.AddFunc("@hourly", func() { fmt.Println("Every hour") }, "Frequent") -c.AddFunc("@every 1h30m", func() { fmt.Println("Every hour thirty") }, "Less Frequent") -c.Start() -.. -// Funcs are invoked in their own goroutine, asynchronously. -... -// Funcs may also be added to a running Cron -c.AddFunc("@daily", func() { fmt.Println("Every day") }, "My Job") -.. -// Inspect the cron job entries' next and previous run times. -inspect(c.Entries()) -.. -// Remove an entry from the cron by name. -c.RemoveJob("My Job") -.. -c.Stop() // Stop the scheduler (does not stop any jobs already running). -``` - -## CRON Expression - -This section describes the specific format accepted by this cron. Some snippets -are taken from [the wikipedia article](http://en.wikipedia.org/wiki/Cron). - -### Format - -A cron expression represents a set of times, using 6 space-separated fields. - -Field name | Mandatory? | Allowed values | Allowed special characters ----------- | ---------- | -------------- | -------------------------- -Seconds | Yes | 0-59 | * / , - -Minutes | Yes | 0-59 | * / , - -Hours | Yes | 0-23 | * / , - -Day of month | Yes | 1-31 | * / , - ? -Month | Yes | 1-12 or JAN-DEC | * / , - -Day of week | Yes | 0-6 or SUN-SAT | * / , - ? - -Note: Month and Day-of-week field values are case insensitive. "SUN", "Sun", -and "sun" are equally accepted. - -### Special Characters - -#### Asterisk ( * ) - -The asterisk indicates that the cron expression will match for all values of the -field; e.g., using an asterisk in the 5th field (month) would indicate every -month. - -#### Slash ( / ) - -Slashes are used to describe increments of ranges. For example 3-59/15 in the -1st field (minutes) would indicate the 3rd minute of the hour and every 15 -minutes thereafter. The form "*/..." is equivalent to the form "first-last/...", -that is, an increment over the largest possible range of the field. The form -"N/..." is accepted as meaning "N-MAX/...", that is, starting at N, use the -increment until the end of that specific range. It does not wrap around. - -#### Comma ( , ) - -Commas are used to separate items of a list. For example, using "MON,WED,FRI" in -the 5th field (day of week) would mean Mondays, Wednesdays and Fridays. - -#### Hyphen ( - ) - -Hyphens are used to define ranges. For example, 9-17 would indicate every -hour between 9am and 5pm inclusive. - -#### Question mark ( ? ) - -Question mark may be used instead of '*' for leaving either day-of-month or -day-of-week blank. - -### Predefined schedules - -You may use one of several pre-defined schedules in place of a cron expression. - -Entry | Description | Equivalent To ------ | ----------- | ------------- -@yearly (or @annually) | Run once a year, midnight, Jan. 1st | 0 0 0 1 1 * -@monthly | Run once a month, midnight, first of month | 0 0 0 1 * * -@weekly | Run once a week, midnight on Sunday | 0 0 0 * * 0 -@daily (or @midnight) | Run once a day, midnight | 0 0 0 * * * -@hourly | Run once an hour, beginning of hour | 0 0 * * * * - -## Intervals - -You may also schedule a job to execute at fixed intervals. This is supported by -formatting the cron spec like this: - - @every - -where `` is a string accepted by -[`time.ParseDuration`](http://golang.org/pkg/time/#ParseDuration). - -For example, `@every 1h30m10s` would indicate a schedule that activates every -1 hour, 30 minutes, 10 seconds. - -> Note: The interval does not take the job runtime into account. For example, -> if a job takes *3 minutes* to run, and it is scheduled to run every *5 minutes*, -> it will have only *2 minutes* of idle time between each run. - -## Time zones - -All interpretation and scheduling is done in the machine's local time zone (as -provided by the [Go time package](http://www.golang.org/pkg/time)). - -Be aware that jobs scheduled during daylight-savings leap-ahead transitions will -not be run! - -## Thread safety - -Since the Cron service runs concurrently with the calling code, some amount of -care must be taken to ensure proper synchronization. - -All [cron methods](http://go.pkgdoc.org/github.com/robfig/cron#Cron) are -designed to be correctly synchronized as long as the caller ensures that -invocations have a clear happens-before ordering between them. - -## Implementation - -Cron entries are stored in an array, sorted by their next activation time. Cron -sleeps until the next job is due to be run. - -Upon waking: -* it runs each entry that is active on that second -* it calculates the next run times for the jobs that were run -* it re-sorts the array of entries by next activation time. -* it goes to sleep until the soonest job. diff --git a/vendor/github.com/jakecoffman/cron/constantdelay.go b/vendor/github.com/jakecoffman/cron/constantdelay.go deleted file mode 100644 index 7f289000c..000000000 --- a/vendor/github.com/jakecoffman/cron/constantdelay.go +++ /dev/null @@ -1,28 +0,0 @@ -package cron - -import "time" - -// ConstantDelaySchedule represents a simple recurring duty cycle, e.g. "Every 5 minutes". -// It does not support jobs more frequent than once a second. -type ConstantDelaySchedule struct { - Delay time.Duration -} - -// Every returns a crontab Schedule that activates once every duration. -// Delays of less than a second are not supported (will panic). -// Any fields less than a Second are truncated. -func Every(duration time.Duration) ConstantDelaySchedule { - if duration < time.Second { - panic("cron/constantdelay: delays of less than a second are not supported: " + - duration.String()) - } - return ConstantDelaySchedule{ - Delay: duration - time.Duration(duration.Nanoseconds())%time.Second, - } -} - -// Next returns the next time this should be run. -// This rounds so that the next activation time will be on the second. -func (schedule ConstantDelaySchedule) Next(t time.Time) time.Time { - return t.Add(schedule.Delay - time.Duration(t.Nanosecond())*time.Nanosecond) -} diff --git a/vendor/github.com/jakecoffman/cron/cron.go b/vendor/github.com/jakecoffman/cron/cron.go deleted file mode 100644 index 89be8c0a2..000000000 --- a/vendor/github.com/jakecoffman/cron/cron.go +++ /dev/null @@ -1,246 +0,0 @@ -// This library implements a cron spec parser and runner. See the README for -// more details. -package cron - -import ( - "sort" - "time" -) - -type entries []*Entry - -// Cron keeps track of any number of entries, invoking the associated func as -// specified by the schedule. It may be started, stopped, and the entries may -// be inspected while running. -type Cron struct { - entries entries - stop chan struct{} - add chan *Entry - remove chan string - snapshot chan entries - running bool -} - -// Job is an interface for submitted cron jobs. -type Job interface { - Run() -} - -// The Schedule describes a job's duty cycle. -type Schedule interface { - // Return the next activation time, later than the given time. - // Next is invoked initially, and then each time the job is run. - Next(time.Time) time.Time -} - -// Entry consists of a schedule and the func to execute on that schedule. -type Entry struct { - // The schedule on which this job should be run. - Schedule Schedule - - // The next time the job will run. This is the zero time if Cron has not been - // started or this entry's schedule is unsatisfiable - Next time.Time - - // The last time this job was run. This is the zero time if the job has never - // been run. - Prev time.Time - - // The Job to run. - Job Job - - // Unique name to identify the Entry so as to be able to remove it later. - Name string -} - -// byTime is a wrapper for sorting the entry array by time -// (with zero time at the end). -type byTime []*Entry - -func (s byTime) Len() int { return len(s) } -func (s byTime) Swap(i, j int) { s[i], s[j] = s[j], s[i] } -func (s byTime) Less(i, j int) bool { - // Two zero times should return false. - // Otherwise, zero is "greater" than any other time. - // (To sort it at the end of the list.) - if s[i].Next.IsZero() { - return false - } - if s[j].Next.IsZero() { - return true - } - return s[i].Next.Before(s[j].Next) -} - -// New returns a new Cron job runner. -func New() *Cron { - return &Cron{ - entries: nil, - add: make(chan *Entry), - remove: make(chan string), - stop: make(chan struct{}), - snapshot: make(chan entries), - running: false, - } -} - -// A wrapper that turns a func() into a cron.Job -type FuncJob func() - -func (f FuncJob) Run() { f() } - -// AddFunc adds a func to the Cron to be run on the given schedule. -func (c *Cron) AddFunc(spec string, cmd func(), name string) { - c.AddJob(spec, FuncJob(cmd), name) -} - -// AddFunc adds a Job to the Cron to be run on the given schedule. -func (c *Cron) AddJob(spec string, cmd Job, name string) { - c.Schedule(Parse(spec), cmd, name) -} - -// RemoveJob removes a Job from the Cron based on name. -func (c *Cron) RemoveJob(name string) { - if !c.running { - i := c.entries.pos(name) - - if i == -1 { - return - } - - c.entries = c.entries[:i+copy(c.entries[i:], c.entries[i+1:])] - return - } - - c.remove <- name -} - -func (entrySlice entries) pos(name string) int { - for p, e := range entrySlice { - if e.Name == name { - return p - } - } - return -1 -} - -// Schedule adds a Job to the Cron to be run on the given schedule. -func (c *Cron) Schedule(schedule Schedule, cmd Job, name string) { - entry := &Entry{ - Schedule: schedule, - Job: cmd, - Name: name, - } - - if !c.running { - i := c.entries.pos(entry.Name) - if i != -1 { - return - } - c.entries = append(c.entries, entry) - return - } - - c.add <- entry -} - -// Entries returns a snapshot of the cron entries. -func (c *Cron) Entries() []*Entry { - if c.running { - c.snapshot <- nil - x := <-c.snapshot - return x - } - return c.entrySnapshot() -} - -// Start the cron scheduler in its own go-routine. -func (c *Cron) Start() { - c.running = true - go c.run() -} - -// Run the scheduler.. this is private just due to the need to synchronize -// access to the 'running' state variable. -func (c *Cron) run() { - // Figure out the next activation times for each entry. - now := time.Now().Local() - for _, entry := range c.entries { - entry.Next = entry.Schedule.Next(now) - } - - for { - // Determine the next entry to run. - sort.Sort(byTime(c.entries)) - - var effective time.Time - if len(c.entries) == 0 || c.entries[0].Next.IsZero() { - // If there are no entries yet, just sleep - it still handles new entries - // and stop requests. - effective = now.AddDate(10, 0, 0) - } else { - effective = c.entries[0].Next - } - - select { - case now = <-time.After(effective.Sub(now)): - // Run every entry whose next time was this effective time. - for _, e := range c.entries { - if e.Next != effective { - break - } - go e.Job.Run() - e.Prev = e.Next - e.Next = e.Schedule.Next(effective) - } - continue - - case newEntry := <-c.add: - i := c.entries.pos(newEntry.Name) - if i != -1 { - break - } - c.entries = append(c.entries, newEntry) - newEntry.Next = newEntry.Schedule.Next(time.Now().Local()) - - case name := <-c.remove: - i := c.entries.pos(name) - - if i == -1 { - break - } - - c.entries = c.entries[:i+copy(c.entries[i:], c.entries[i+1:])] - - case <-c.snapshot: - c.snapshot <- c.entrySnapshot() - - case <-c.stop: - return - } - - // 'now' should be updated after newEntry and snapshot cases. - now = time.Now().Local() - } -} - -// Stop the cron scheduler. -func (c *Cron) Stop() { - c.stop <- struct{}{} - c.running = false -} - -// entrySnapshot returns a copy of the current cron entry list. -func (c *Cron) entrySnapshot() []*Entry { - entries := []*Entry{} - for _, e := range c.entries { - entries = append(entries, &Entry{ - Schedule: e.Schedule, - Next: e.Next, - Prev: e.Prev, - Job: e.Job, - Name: e.Name, - }) - } - return entries -} diff --git a/vendor/github.com/jakecoffman/cron/parser.go b/vendor/github.com/jakecoffman/cron/parser.go deleted file mode 100644 index 7d0ee9dec..000000000 --- a/vendor/github.com/jakecoffman/cron/parser.go +++ /dev/null @@ -1,223 +0,0 @@ -package cron - -import ( - "log" - "math" - "strconv" - "strings" - "time" -) - -// Parse returns a new crontab schedule representing the given spec. -// It panics with a descriptive error if the spec is not valid. -// -// It accepts -// - Full crontab specs, e.g. "* * * * * ?" -// - Descriptors, e.g. "@midnight", "@every 1h30m" -func Parse(spec string) Schedule { - if spec[0] == '@' { - return parseDescriptor(spec) - } - - // Split on whitespace. We require 5 or 6 fields. - // (second) (minute) (hour) (day of month) (month) (day of week, optional) - fields := strings.Fields(spec) - if len(fields) != 5 && len(fields) != 6 { - log.Panicf("Expected 5 or 6 fields, found %d: %s", len(fields), spec) - } - - // If a sixth field is not provided (DayOfWeek), then it is equivalent to star. - if len(fields) == 5 { - fields = append(fields, "*") - } - - schedule := &SpecSchedule{ - Second: getField(fields[0], seconds), - Minute: getField(fields[1], minutes), - Hour: getField(fields[2], hours), - Dom: getField(fields[3], dom), - Month: getField(fields[4], months), - Dow: getField(fields[5], dow), - } - - return schedule -} - -// getField returns an Int with the bits set representing all of the times that -// the field represents. A "field" is a comma-separated list of "ranges". -func getField(field string, r bounds) uint64 { - // list = range {"," range} - var bits uint64 - ranges := strings.FieldsFunc(field, func(r rune) bool { return r == ',' }) - for _, expr := range ranges { - bits |= getRange(expr, r) - } - return bits -} - -// getRange returns the bits indicated by the given expression: -// number | number "-" number [ "/" number ] -func getRange(expr string, r bounds) uint64 { - - var ( - start, end, step uint - rangeAndStep = strings.Split(expr, "/") - lowAndHigh = strings.Split(rangeAndStep[0], "-") - singleDigit = len(lowAndHigh) == 1 - ) - - var extra_star uint64 - if lowAndHigh[0] == "*" || lowAndHigh[0] == "?" { - start = r.min - end = r.max - extra_star = starBit - } else { - start = parseIntOrName(lowAndHigh[0], r.names) - switch len(lowAndHigh) { - case 1: - end = start - case 2: - end = parseIntOrName(lowAndHigh[1], r.names) - default: - log.Panicf("Too many hyphens: %s", expr) - } - } - - switch len(rangeAndStep) { - case 1: - step = 1 - case 2: - step = mustParseInt(rangeAndStep[1]) - - // Special handling: "N/step" means "N-max/step". - if singleDigit { - end = r.max - } - default: - log.Panicf("Too many slashes: %s", expr) - } - - if start < r.min { - log.Panicf("Beginning of range (%d) below minimum (%d): %s", start, r.min, expr) - } - if end > r.max { - log.Panicf("End of range (%d) above maximum (%d): %s", end, r.max, expr) - } - if start > end { - log.Panicf("Beginning of range (%d) beyond end of range (%d): %s", start, end, expr) - } - - return getBits(start, end, step) | extra_star -} - -// parseIntOrName returns the (possibly-named) integer contained in expr. -func parseIntOrName(expr string, names map[string]uint) uint { - if names != nil { - if namedInt, ok := names[strings.ToLower(expr)]; ok { - return namedInt - } - } - return mustParseInt(expr) -} - -// mustParseInt parses the given expression as an int or panics. -func mustParseInt(expr string) uint { - num, err := strconv.Atoi(expr) - if err != nil { - log.Panicf("Failed to parse int from %s: %s", expr, err) - } - if num < 0 { - log.Panicf("Negative number (%d) not allowed: %s", num, expr) - } - - return uint(num) -} - -// getBits sets all bits in the range [min, max], modulo the given step size. -func getBits(min, max, step uint) uint64 { - var bits uint64 - - // If step is 1, use shifts. - if step == 1 { - return ^(math.MaxUint64 << (max + 1)) & (math.MaxUint64 << min) - } - - // Else, use a simple loop. - for i := min; i <= max; i += step { - bits |= 1 << i - } - return bits -} - -// all returns all bits within the given bounds. (plus the star bit) -func all(r bounds) uint64 { - return getBits(r.min, r.max, 1) | starBit -} - -// parseDescriptor returns a pre-defined schedule for the expression, or panics -// if none matches. -func parseDescriptor(spec string) Schedule { - switch spec { - case "@yearly", "@annually": - return &SpecSchedule{ - Second: 1 << seconds.min, - Minute: 1 << minutes.min, - Hour: 1 << hours.min, - Dom: 1 << dom.min, - Month: 1 << months.min, - Dow: all(dow), - } - - case "@monthly": - return &SpecSchedule{ - Second: 1 << seconds.min, - Minute: 1 << minutes.min, - Hour: 1 << hours.min, - Dom: 1 << dom.min, - Month: all(months), - Dow: all(dow), - } - - case "@weekly": - return &SpecSchedule{ - Second: 1 << seconds.min, - Minute: 1 << minutes.min, - Hour: 1 << hours.min, - Dom: all(dom), - Month: all(months), - Dow: 1 << dow.min, - } - - case "@daily", "@midnight": - return &SpecSchedule{ - Second: 1 << seconds.min, - Minute: 1 << minutes.min, - Hour: 1 << hours.min, - Dom: all(dom), - Month: all(months), - Dow: all(dow), - } - - case "@hourly": - return &SpecSchedule{ - Second: 1 << seconds.min, - Minute: 1 << minutes.min, - Hour: all(hours), - Dom: all(dom), - Month: all(months), - Dow: all(dow), - } - } - - const every = "@every " - if strings.HasPrefix(spec, every) { - duration, err := time.ParseDuration(spec[len(every):]) - if err != nil { - log.Panicf("Failed to parse duration %s: %s", spec, err) - } - return Every(duration) - } - - log.Panicf("Unrecognized descriptor: %s", spec) - return nil -} diff --git a/vendor/github.com/jakecoffman/cron/spec.go b/vendor/github.com/jakecoffman/cron/spec.go deleted file mode 100644 index cb3743325..000000000 --- a/vendor/github.com/jakecoffman/cron/spec.go +++ /dev/null @@ -1,161 +0,0 @@ -package cron - -import ( - "time" -) - -// SpecSchedule specifies a duty cycle (to the second granularity), based on a -// traditional crontab specification. It is computed initially and stored as bit sets. -type SpecSchedule struct { - Second, Minute, Hour, Dom, Month, Dow uint64 -} - -// bounds provides a range of acceptable values (plus a map of name to value). -type bounds struct { - min, max uint - names map[string]uint -} - -// The bounds for each field. -var ( - seconds = bounds{0, 59, nil} - minutes = bounds{0, 59, nil} - hours = bounds{0, 23, nil} - dom = bounds{1, 31, nil} - months = bounds{1, 12, map[string]uint{ - "jan": 1, - "feb": 2, - "mar": 3, - "apr": 4, - "may": 5, - "jun": 6, - "jul": 7, - "aug": 8, - "sep": 9, - "oct": 10, - "nov": 11, - "dec": 12, - }} - dow = bounds{0, 6, map[string]uint{ - "sun": 0, - "mon": 1, - "tue": 2, - "wed": 3, - "thu": 4, - "fri": 5, - "sat": 6, - }} -) - -const ( - // Set the top bit if a star was included in the expression. - starBit = 1 << 63 -) - -// Next returns the next time this schedule is activated, greater than the given -// time. If no time can be found to satisfy the schedule, return the zero time. -func (s *SpecSchedule) Next(t time.Time) time.Time { - // General approach: - // For Month, Day, Hour, Minute, Second: - // Check if the time value matches. If yes, continue to the next field. - // If the field doesn't match the schedule, then increment the field until it matches. - // While incrementing the field, a wrap-around brings it back to the beginning - // of the field list (since it is necessary to re-verify previous field - // values) - - // Start at the earliest possible time (the upcoming second). - t = t.Add(1*time.Second - time.Duration(t.Nanosecond())*time.Nanosecond) - - // This flag indicates whether a field has been incremented. - added := false - - // If no time is found within five years, return zero. - yearLimit := t.Year() + 5 - -WRAP: - if t.Year() > yearLimit { - return time.Time{} - } - - // Find the first applicable month. - // If it's this month, then do nothing. - for 1< 0 - dowMatch bool = 1< 0 - ) - - if s.Dom&starBit > 0 || s.Dow&starBit > 0 { - return domMatch && dowMatch - } - return domMatch || dowMatch -} diff --git a/vendor/github.com/klauspost/compress/LICENSE b/vendor/github.com/klauspost/compress/LICENSE deleted file mode 100644 index 744875676..000000000 --- a/vendor/github.com/klauspost/compress/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2012 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * 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. - * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT -OWNER 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. diff --git a/vendor/github.com/klauspost/compress/flate/copy.go b/vendor/github.com/klauspost/compress/flate/copy.go deleted file mode 100644 index a3200a8f4..000000000 --- a/vendor/github.com/klauspost/compress/flate/copy.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package flate - -// forwardCopy is like the built-in copy function except that it always goes -// forward from the start, even if the dst and src overlap. -// It is equivalent to: -// for i := 0; i < n; i++ { -// mem[dst+i] = mem[src+i] -// } -func forwardCopy(mem []byte, dst, src, n int) { - if dst <= src { - copy(mem[dst:dst+n], mem[src:src+n]) - return - } - for { - if dst >= src+n { - copy(mem[dst:dst+n], mem[src:src+n]) - return - } - // There is some forward overlap. The destination - // will be filled with a repeated pattern of mem[src:src+k]. - // We copy one instance of the pattern here, then repeat. - // Each time around this loop k will double. - k := dst - src - copy(mem[dst:dst+k], mem[src:src+k]) - n -= k - dst += k - } -} diff --git a/vendor/github.com/klauspost/compress/flate/crc32_amd64.go b/vendor/github.com/klauspost/compress/flate/crc32_amd64.go deleted file mode 100644 index 70a6095e6..000000000 --- a/vendor/github.com/klauspost/compress/flate/crc32_amd64.go +++ /dev/null @@ -1,41 +0,0 @@ -//+build !noasm -//+build !appengine - -// Copyright 2015, Klaus Post, see LICENSE for details. - -package flate - -import ( - "github.com/klauspost/cpuid" -) - -// crc32sse returns a hash for the first 4 bytes of the slice -// len(a) must be >= 4. -//go:noescape -func crc32sse(a []byte) uint32 - -// crc32sseAll calculates hashes for each 4-byte set in a. -// dst must be east len(a) - 4 in size. -// The size is not checked by the assembly. -//go:noescape -func crc32sseAll(a []byte, dst []uint32) - -// matchLenSSE4 returns the number of matching bytes in a and b -// up to length 'max'. Both slices must be at least 'max' -// bytes in size. -// -// TODO: drop the "SSE4" name, since it doesn't use any SSE instructions. -// -//go:noescape -func matchLenSSE4(a, b []byte, max int) int - -// histogram accumulates a histogram of b in h. -// h must be at least 256 entries in length, -// and must be cleared before calling this function. -//go:noescape -func histogram(b []byte, h []int32) - -// Detect SSE 4.2 feature. -func init() { - useSSE42 = cpuid.CPU.SSE42() -} diff --git a/vendor/github.com/klauspost/compress/flate/crc32_amd64.s b/vendor/github.com/klauspost/compress/flate/crc32_amd64.s deleted file mode 100644 index 2fb2079b9..000000000 --- a/vendor/github.com/klauspost/compress/flate/crc32_amd64.s +++ /dev/null @@ -1,213 +0,0 @@ -//+build !noasm -//+build !appengine - -// Copyright 2015, Klaus Post, see LICENSE for details. - -// func crc32sse(a []byte) uint32 -TEXT ·crc32sse(SB), 4, $0 - MOVQ a+0(FP), R10 - XORQ BX, BX - - // CRC32 dword (R10), EBX - BYTE $0xF2; BYTE $0x41; BYTE $0x0f - BYTE $0x38; BYTE $0xf1; BYTE $0x1a - - MOVL BX, ret+24(FP) - RET - -// func crc32sseAll(a []byte, dst []uint32) -TEXT ·crc32sseAll(SB), 4, $0 - MOVQ a+0(FP), R8 // R8: src - MOVQ a_len+8(FP), R10 // input length - MOVQ dst+24(FP), R9 // R9: dst - SUBQ $4, R10 - JS end - JZ one_crc - MOVQ R10, R13 - SHRQ $2, R10 // len/4 - ANDQ $3, R13 // len&3 - XORQ BX, BX - ADDQ $1, R13 - TESTQ R10, R10 - JZ rem_loop - -crc_loop: - MOVQ (R8), R11 - XORQ BX, BX - XORQ DX, DX - XORQ DI, DI - MOVQ R11, R12 - SHRQ $8, R11 - MOVQ R12, AX - MOVQ R11, CX - SHRQ $16, R12 - SHRQ $16, R11 - MOVQ R12, SI - - // CRC32 EAX, EBX - BYTE $0xF2; BYTE $0x0f - BYTE $0x38; BYTE $0xf1; BYTE $0xd8 - - // CRC32 ECX, EDX - BYTE $0xF2; BYTE $0x0f - BYTE $0x38; BYTE $0xf1; BYTE $0xd1 - - // CRC32 ESI, EDI - BYTE $0xF2; BYTE $0x0f - BYTE $0x38; BYTE $0xf1; BYTE $0xfe - MOVL BX, (R9) - MOVL DX, 4(R9) - MOVL DI, 8(R9) - - XORQ BX, BX - MOVL R11, AX - - // CRC32 EAX, EBX - BYTE $0xF2; BYTE $0x0f - BYTE $0x38; BYTE $0xf1; BYTE $0xd8 - MOVL BX, 12(R9) - - ADDQ $16, R9 - ADDQ $4, R8 - XORQ BX, BX - SUBQ $1, R10 - JNZ crc_loop - -rem_loop: - MOVL (R8), AX - - // CRC32 EAX, EBX - BYTE $0xF2; BYTE $0x0f - BYTE $0x38; BYTE $0xf1; BYTE $0xd8 - - MOVL BX, (R9) - ADDQ $4, R9 - ADDQ $1, R8 - XORQ BX, BX - SUBQ $1, R13 - JNZ rem_loop - -end: - RET - -one_crc: - MOVQ $1, R13 - XORQ BX, BX - JMP rem_loop - -// func matchLenSSE4(a, b []byte, max int) int -TEXT ·matchLenSSE4(SB), 4, $0 - MOVQ a_base+0(FP), SI - MOVQ b_base+24(FP), DI - MOVQ DI, DX - MOVQ max+48(FP), CX - -cmp8: - // As long as we are 8 or more bytes before the end of max, we can load and - // compare 8 bytes at a time. If those 8 bytes are equal, repeat. - CMPQ CX, $8 - JLT cmp1 - MOVQ (SI), AX - MOVQ (DI), BX - CMPQ AX, BX - JNE bsf - ADDQ $8, SI - ADDQ $8, DI - SUBQ $8, CX - JMP cmp8 - -bsf: - // If those 8 bytes were not equal, XOR the two 8 byte values, and return - // the index of the first byte that differs. The BSF instruction finds the - // least significant 1 bit, the amd64 architecture is little-endian, and - // the shift by 3 converts a bit index to a byte index. - XORQ AX, BX - BSFQ BX, BX - SHRQ $3, BX - ADDQ BX, DI - - // Subtract off &b[0] to convert from &b[ret] to ret, and return. - SUBQ DX, DI - MOVQ DI, ret+56(FP) - RET - -cmp1: - // In the slices' tail, compare 1 byte at a time. - CMPQ CX, $0 - JEQ matchLenEnd - MOVB (SI), AX - MOVB (DI), BX - CMPB AX, BX - JNE matchLenEnd - ADDQ $1, SI - ADDQ $1, DI - SUBQ $1, CX - JMP cmp1 - -matchLenEnd: - // Subtract off &b[0] to convert from &b[ret] to ret, and return. - SUBQ DX, DI - MOVQ DI, ret+56(FP) - RET - -// func histogram(b []byte, h []int32) -TEXT ·histogram(SB), 4, $0 - MOVQ b+0(FP), SI // SI: &b - MOVQ b_len+8(FP), R9 // R9: len(b) - MOVQ h+24(FP), DI // DI: Histogram - MOVQ R9, R8 - SHRQ $3, R8 - JZ hist1 - XORQ R11, R11 - -loop_hist8: - MOVQ (SI), R10 - - MOVB R10, R11 - INCL (DI)(R11*4) - SHRQ $8, R10 - - MOVB R10, R11 - INCL (DI)(R11*4) - SHRQ $8, R10 - - MOVB R10, R11 - INCL (DI)(R11*4) - SHRQ $8, R10 - - MOVB R10, R11 - INCL (DI)(R11*4) - SHRQ $8, R10 - - MOVB R10, R11 - INCL (DI)(R11*4) - SHRQ $8, R10 - - MOVB R10, R11 - INCL (DI)(R11*4) - SHRQ $8, R10 - - MOVB R10, R11 - INCL (DI)(R11*4) - SHRQ $8, R10 - - INCL (DI)(R10*4) - - ADDQ $8, SI - DECQ R8 - JNZ loop_hist8 - -hist1: - ANDQ $7, R9 - JZ end_hist - XORQ R10, R10 - -loop_hist1: - MOVB (SI), R10 - INCL (DI)(R10*4) - INCQ SI - DECQ R9 - JNZ loop_hist1 - -end_hist: - RET diff --git a/vendor/github.com/klauspost/compress/flate/crc32_noasm.go b/vendor/github.com/klauspost/compress/flate/crc32_noasm.go deleted file mode 100644 index bd98bd598..000000000 --- a/vendor/github.com/klauspost/compress/flate/crc32_noasm.go +++ /dev/null @@ -1,35 +0,0 @@ -//+build !amd64 noasm appengine - -// Copyright 2015, Klaus Post, see LICENSE for details. - -package flate - -func init() { - useSSE42 = false -} - -// crc32sse should never be called. -func crc32sse(a []byte) uint32 { - panic("no assembler") -} - -// crc32sseAll should never be called. -func crc32sseAll(a []byte, dst []uint32) { - panic("no assembler") -} - -// matchLenSSE4 should never be called. -func matchLenSSE4(a, b []byte, max int) int { - panic("no assembler") - return 0 -} - -// histogram accumulates a histogram of b in h. -// -// len(h) must be >= 256, and h's elements must be all zeroes. -func histogram(b []byte, h []int32) { - h = h[:256] - for _, t := range b { - h[t]++ - } -} diff --git a/vendor/github.com/klauspost/compress/flate/deflate.go b/vendor/github.com/klauspost/compress/flate/deflate.go deleted file mode 100644 index 9e6e7ff0c..000000000 --- a/vendor/github.com/klauspost/compress/flate/deflate.go +++ /dev/null @@ -1,1353 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Copyright (c) 2015 Klaus Post -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package flate - -import ( - "fmt" - "io" - "math" -) - -const ( - NoCompression = 0 - BestSpeed = 1 - BestCompression = 9 - DefaultCompression = -1 - - // HuffmanOnly disables Lempel-Ziv match searching and only performs Huffman - // entropy encoding. This mode is useful in compressing data that has - // already been compressed with an LZ style algorithm (e.g. Snappy or LZ4) - // that lacks an entropy encoder. Compression gains are achieved when - // certain bytes in the input stream occur more frequently than others. - // - // Note that HuffmanOnly produces a compressed output that is - // RFC 1951 compliant. That is, any valid DEFLATE decompressor will - // continue to be able to decompress this output. - HuffmanOnly = -2 - ConstantCompression = HuffmanOnly // compatibility alias. - - logWindowSize = 15 - windowSize = 1 << logWindowSize - windowMask = windowSize - 1 - logMaxOffsetSize = 15 // Standard DEFLATE - minMatchLength = 4 // The smallest match that the compressor looks for - maxMatchLength = 258 // The longest match for the compressor - minOffsetSize = 1 // The shortest offset that makes any sense - - // The maximum number of tokens we put into a single flat block, just too - // stop things from getting too large. - maxFlateBlockTokens = 1 << 14 - maxStoreBlockSize = 65535 - hashBits = 17 // After 17 performance degrades - hashSize = 1 << hashBits - hashMask = (1 << hashBits) - 1 - hashShift = (hashBits + minMatchLength - 1) / minMatchLength - maxHashOffset = 1 << 24 - - skipNever = math.MaxInt32 -) - -var useSSE42 bool - -type compressionLevel struct { - good, lazy, nice, chain, fastSkipHashing, level int -} - -// Compression levels have been rebalanced from zlib deflate defaults -// to give a bigger spread in speed and compression. -// See https://blog.klauspost.com/rebalancing-deflate-compression-levels/ -var levels = []compressionLevel{ - {}, // 0 - // Level 1-4 uses specialized algorithm - values not used - {0, 0, 0, 0, 0, 1}, - {0, 0, 0, 0, 0, 2}, - {0, 0, 0, 0, 0, 3}, - {0, 0, 0, 0, 0, 4}, - // For levels 5-6 we don't bother trying with lazy matches. - // Lazy matching is at least 30% slower, with 1.5% increase. - {6, 0, 12, 8, 12, 5}, - {8, 0, 24, 16, 16, 6}, - // Levels 7-9 use increasingly more lazy matching - // and increasingly stringent conditions for "good enough". - {8, 8, 24, 16, skipNever, 7}, - {10, 16, 24, 64, skipNever, 8}, - {32, 258, 258, 4096, skipNever, 9}, -} - -type compressor struct { - compressionLevel - - w *huffmanBitWriter - bulkHasher func([]byte, []uint32) - - // compression algorithm - fill func(*compressor, []byte) int // copy data to window - step func(*compressor) // process window - sync bool // requesting flush - - // Input hash chains - // hashHead[hashValue] contains the largest inputIndex with the specified hash value - // If hashHead[hashValue] is within the current window, then - // hashPrev[hashHead[hashValue] & windowMask] contains the previous index - // with the same hash value. - chainHead int - hashHead [hashSize]uint32 - hashPrev [windowSize]uint32 - hashOffset int - - // input window: unprocessed data is window[index:windowEnd] - index int - window []byte - windowEnd int - blockStart int // window index where current tokens start - byteAvailable bool // if true, still need to process window[index-1]. - - // queued output tokens - tokens tokens - - // deflate state - length int - offset int - hash uint32 - maxInsertIndex int - err error - ii uint16 // position of last match, intended to overflow to reset. - - snap snappyEnc - hashMatch [maxMatchLength + minMatchLength]uint32 -} - -func (d *compressor) fillDeflate(b []byte) int { - if d.index >= 2*windowSize-(minMatchLength+maxMatchLength) { - // shift the window by windowSize - copy(d.window[:], d.window[windowSize:2*windowSize]) - d.index -= windowSize - d.windowEnd -= windowSize - if d.blockStart >= windowSize { - d.blockStart -= windowSize - } else { - d.blockStart = math.MaxInt32 - } - d.hashOffset += windowSize - if d.hashOffset > maxHashOffset { - delta := d.hashOffset - 1 - d.hashOffset -= delta - d.chainHead -= delta - // Iterate over slices instead of arrays to avoid copying - // the entire table onto the stack (Issue #18625). - for i, v := range d.hashPrev[:] { - if int(v) > delta { - d.hashPrev[i] = uint32(int(v) - delta) - } else { - d.hashPrev[i] = 0 - } - } - for i, v := range d.hashHead[:] { - if int(v) > delta { - d.hashHead[i] = uint32(int(v) - delta) - } else { - d.hashHead[i] = 0 - } - } - } - } - n := copy(d.window[d.windowEnd:], b) - d.windowEnd += n - return n -} - -func (d *compressor) writeBlock(tok tokens, index int, eof bool) error { - if index > 0 || eof { - var window []byte - if d.blockStart <= index { - window = d.window[d.blockStart:index] - } - d.blockStart = index - d.w.writeBlock(tok.tokens[:tok.n], eof, window) - return d.w.err - } - return nil -} - -// writeBlockSkip writes the current block and uses the number of tokens -// to determine if the block should be stored on no matches, or -// only huffman encoded. -func (d *compressor) writeBlockSkip(tok tokens, index int, eof bool) error { - if index > 0 || eof { - if d.blockStart <= index { - window := d.window[d.blockStart:index] - // If we removed less than a 64th of all literals - // we huffman compress the block. - if int(tok.n) > len(window)-int(tok.n>>6) { - d.w.writeBlockHuff(eof, window) - } else { - // Write a dynamic huffman block. - d.w.writeBlockDynamic(tok.tokens[:tok.n], eof, window) - } - } else { - d.w.writeBlock(tok.tokens[:tok.n], eof, nil) - } - d.blockStart = index - return d.w.err - } - return nil -} - -// fillWindow will fill the current window with the supplied -// dictionary and calculate all hashes. -// This is much faster than doing a full encode. -// Should only be used after a start/reset. -func (d *compressor) fillWindow(b []byte) { - // Do not fill window if we are in store-only mode, - // use constant or Snappy compression. - switch d.compressionLevel.level { - case 0, 1, 2: - return - } - // If we are given too much, cut it. - if len(b) > windowSize { - b = b[len(b)-windowSize:] - } - // Add all to window. - n := copy(d.window[d.windowEnd:], b) - - // Calculate 256 hashes at the time (more L1 cache hits) - loops := (n + 256 - minMatchLength) / 256 - for j := 0; j < loops; j++ { - startindex := j * 256 - end := startindex + 256 + minMatchLength - 1 - if end > n { - end = n - } - tocheck := d.window[startindex:end] - dstSize := len(tocheck) - minMatchLength + 1 - - if dstSize <= 0 { - continue - } - - dst := d.hashMatch[:dstSize] - d.bulkHasher(tocheck, dst) - var newH uint32 - for i, val := range dst { - di := i + startindex - newH = val & hashMask - // Get previous value with the same hash. - // Our chain should point to the previous value. - d.hashPrev[di&windowMask] = d.hashHead[newH] - // Set the head of the hash chain to us. - d.hashHead[newH] = uint32(di + d.hashOffset) - } - d.hash = newH - } - // Update window information. - d.windowEnd += n - d.index = n -} - -// Try to find a match starting at index whose length is greater than prevSize. -// We only look at chainCount possibilities before giving up. -// pos = d.index, prevHead = d.chainHead-d.hashOffset, prevLength=minMatchLength-1, lookahead -func (d *compressor) findMatch(pos int, prevHead int, prevLength int, lookahead int) (length, offset int, ok bool) { - minMatchLook := maxMatchLength - if lookahead < minMatchLook { - minMatchLook = lookahead - } - - win := d.window[0 : pos+minMatchLook] - - // We quit when we get a match that's at least nice long - nice := len(win) - pos - if d.nice < nice { - nice = d.nice - } - - // If we've got a match that's good enough, only look in 1/4 the chain. - tries := d.chain - length = prevLength - if length >= d.good { - tries >>= 2 - } - - wEnd := win[pos+length] - wPos := win[pos:] - minIndex := pos - windowSize - - for i := prevHead; tries > 0; tries-- { - if wEnd == win[i+length] { - n := matchLen(win[i:], wPos, minMatchLook) - - if n > length && (n > minMatchLength || pos-i <= 4096) { - length = n - offset = pos - i - ok = true - if n >= nice { - // The match is good enough that we don't try to find a better one. - break - } - wEnd = win[pos+n] - } - } - if i == minIndex { - // hashPrev[i & windowMask] has already been overwritten, so stop now. - break - } - i = int(d.hashPrev[i&windowMask]) - d.hashOffset - if i < minIndex || i < 0 { - break - } - } - return -} - -// Try to find a match starting at index whose length is greater than prevSize. -// We only look at chainCount possibilities before giving up. -// pos = d.index, prevHead = d.chainHead-d.hashOffset, prevLength=minMatchLength-1, lookahead -func (d *compressor) findMatchSSE(pos int, prevHead int, prevLength int, lookahead int) (length, offset int, ok bool) { - minMatchLook := maxMatchLength - if lookahead < minMatchLook { - minMatchLook = lookahead - } - - win := d.window[0 : pos+minMatchLook] - - // We quit when we get a match that's at least nice long - nice := len(win) - pos - if d.nice < nice { - nice = d.nice - } - - // If we've got a match that's good enough, only look in 1/4 the chain. - tries := d.chain - length = prevLength - if length >= d.good { - tries >>= 2 - } - - wEnd := win[pos+length] - wPos := win[pos:] - minIndex := pos - windowSize - - for i := prevHead; tries > 0; tries-- { - if wEnd == win[i+length] { - n := matchLenSSE4(win[i:], wPos, minMatchLook) - - if n > length && (n > minMatchLength || pos-i <= 4096) { - length = n - offset = pos - i - ok = true - if n >= nice { - // The match is good enough that we don't try to find a better one. - break - } - wEnd = win[pos+n] - } - } - if i == minIndex { - // hashPrev[i & windowMask] has already been overwritten, so stop now. - break - } - i = int(d.hashPrev[i&windowMask]) - d.hashOffset - if i < minIndex || i < 0 { - break - } - } - return -} - -func (d *compressor) writeStoredBlock(buf []byte) error { - if d.w.writeStoredHeader(len(buf), false); d.w.err != nil { - return d.w.err - } - d.w.writeBytes(buf) - return d.w.err -} - -const hashmul = 0x1e35a7bd - -// hash4 returns a hash representation of the first 4 bytes -// of the supplied slice. -// The caller must ensure that len(b) >= 4. -func hash4(b []byte) uint32 { - return ((uint32(b[3]) | uint32(b[2])<<8 | uint32(b[1])<<16 | uint32(b[0])<<24) * hashmul) >> (32 - hashBits) -} - -// bulkHash4 will compute hashes using the same -// algorithm as hash4 -func bulkHash4(b []byte, dst []uint32) { - if len(b) < minMatchLength { - return - } - hb := uint32(b[3]) | uint32(b[2])<<8 | uint32(b[1])<<16 | uint32(b[0])<<24 - dst[0] = (hb * hashmul) >> (32 - hashBits) - end := len(b) - minMatchLength + 1 - for i := 1; i < end; i++ { - hb = (hb << 8) | uint32(b[i+3]) - dst[i] = (hb * hashmul) >> (32 - hashBits) - } -} - -// matchLen returns the number of matching bytes in a and b -// up to length 'max'. Both slices must be at least 'max' -// bytes in size. -func matchLen(a, b []byte, max int) int { - a = a[:max] - b = b[:len(a)] - for i, av := range a { - if b[i] != av { - return i - } - } - return max -} - -func (d *compressor) initDeflate() { - d.window = make([]byte, 2*windowSize) - d.hashOffset = 1 - d.length = minMatchLength - 1 - d.offset = 0 - d.byteAvailable = false - d.index = 0 - d.hash = 0 - d.chainHead = -1 - d.bulkHasher = bulkHash4 - if useSSE42 { - d.bulkHasher = crc32sseAll - } -} - -// Assumes that d.fastSkipHashing != skipNever, -// otherwise use deflateLazy -func (d *compressor) deflate() { - - // Sanity enables additional runtime tests. - // It's intended to be used during development - // to supplement the currently ad-hoc unit tests. - const sanity = false - - if d.windowEnd-d.index < minMatchLength+maxMatchLength && !d.sync { - return - } - - d.maxInsertIndex = d.windowEnd - (minMatchLength - 1) - if d.index < d.maxInsertIndex { - d.hash = hash4(d.window[d.index : d.index+minMatchLength]) - } - - for { - if sanity && d.index > d.windowEnd { - panic("index > windowEnd") - } - lookahead := d.windowEnd - d.index - if lookahead < minMatchLength+maxMatchLength { - if !d.sync { - return - } - if sanity && d.index > d.windowEnd { - panic("index > windowEnd") - } - if lookahead == 0 { - if d.tokens.n > 0 { - if d.err = d.writeBlockSkip(d.tokens, d.index, false); d.err != nil { - return - } - d.tokens.n = 0 - } - return - } - } - if d.index < d.maxInsertIndex { - // Update the hash - d.hash = hash4(d.window[d.index : d.index+minMatchLength]) - ch := d.hashHead[d.hash&hashMask] - d.chainHead = int(ch) - d.hashPrev[d.index&windowMask] = ch - d.hashHead[d.hash&hashMask] = uint32(d.index + d.hashOffset) - } - d.length = minMatchLength - 1 - d.offset = 0 - minIndex := d.index - windowSize - if minIndex < 0 { - minIndex = 0 - } - - if d.chainHead-d.hashOffset >= minIndex && lookahead > minMatchLength-1 { - if newLength, newOffset, ok := d.findMatch(d.index, d.chainHead-d.hashOffset, minMatchLength-1, lookahead); ok { - d.length = newLength - d.offset = newOffset - } - } - if d.length >= minMatchLength { - d.ii = 0 - // There was a match at the previous step, and the current match is - // not better. Output the previous match. - // "d.length-3" should NOT be "d.length-minMatchLength", since the format always assume 3 - d.tokens.tokens[d.tokens.n] = matchToken(uint32(d.length-3), uint32(d.offset-minOffsetSize)) - d.tokens.n++ - // Insert in the hash table all strings up to the end of the match. - // index and index-1 are already inserted. If there is not enough - // lookahead, the last two strings are not inserted into the hash - // table. - if d.length <= d.fastSkipHashing { - var newIndex int - newIndex = d.index + d.length - // Calculate missing hashes - end := newIndex - if end > d.maxInsertIndex { - end = d.maxInsertIndex - } - end += minMatchLength - 1 - startindex := d.index + 1 - if startindex > d.maxInsertIndex { - startindex = d.maxInsertIndex - } - tocheck := d.window[startindex:end] - dstSize := len(tocheck) - minMatchLength + 1 - if dstSize > 0 { - dst := d.hashMatch[:dstSize] - bulkHash4(tocheck, dst) - var newH uint32 - for i, val := range dst { - di := i + startindex - newH = val & hashMask - // Get previous value with the same hash. - // Our chain should point to the previous value. - d.hashPrev[di&windowMask] = d.hashHead[newH] - // Set the head of the hash chain to us. - d.hashHead[newH] = uint32(di + d.hashOffset) - } - d.hash = newH - } - d.index = newIndex - } else { - // For matches this long, we don't bother inserting each individual - // item into the table. - d.index += d.length - if d.index < d.maxInsertIndex { - d.hash = hash4(d.window[d.index : d.index+minMatchLength]) - } - } - if d.tokens.n == maxFlateBlockTokens { - // The block includes the current character - if d.err = d.writeBlockSkip(d.tokens, d.index, false); d.err != nil { - return - } - d.tokens.n = 0 - } - } else { - d.ii++ - end := d.index + int(d.ii>>uint(d.fastSkipHashing)) + 1 - if end > d.windowEnd { - end = d.windowEnd - } - for i := d.index; i < end; i++ { - d.tokens.tokens[d.tokens.n] = literalToken(uint32(d.window[i])) - d.tokens.n++ - if d.tokens.n == maxFlateBlockTokens { - if d.err = d.writeBlockSkip(d.tokens, i+1, false); d.err != nil { - return - } - d.tokens.n = 0 - } - } - d.index = end - } - } -} - -// deflateLazy is the same as deflate, but with d.fastSkipHashing == skipNever, -// meaning it always has lazy matching on. -func (d *compressor) deflateLazy() { - // Sanity enables additional runtime tests. - // It's intended to be used during development - // to supplement the currently ad-hoc unit tests. - const sanity = false - - if d.windowEnd-d.index < minMatchLength+maxMatchLength && !d.sync { - return - } - - d.maxInsertIndex = d.windowEnd - (minMatchLength - 1) - if d.index < d.maxInsertIndex { - d.hash = hash4(d.window[d.index : d.index+minMatchLength]) - } - - for { - if sanity && d.index > d.windowEnd { - panic("index > windowEnd") - } - lookahead := d.windowEnd - d.index - if lookahead < minMatchLength+maxMatchLength { - if !d.sync { - return - } - if sanity && d.index > d.windowEnd { - panic("index > windowEnd") - } - if lookahead == 0 { - // Flush current output block if any. - if d.byteAvailable { - // There is still one pending token that needs to be flushed - d.tokens.tokens[d.tokens.n] = literalToken(uint32(d.window[d.index-1])) - d.tokens.n++ - d.byteAvailable = false - } - if d.tokens.n > 0 { - if d.err = d.writeBlock(d.tokens, d.index, false); d.err != nil { - return - } - d.tokens.n = 0 - } - return - } - } - if d.index < d.maxInsertIndex { - // Update the hash - d.hash = hash4(d.window[d.index : d.index+minMatchLength]) - ch := d.hashHead[d.hash&hashMask] - d.chainHead = int(ch) - d.hashPrev[d.index&windowMask] = ch - d.hashHead[d.hash&hashMask] = uint32(d.index + d.hashOffset) - } - prevLength := d.length - prevOffset := d.offset - d.length = minMatchLength - 1 - d.offset = 0 - minIndex := d.index - windowSize - if minIndex < 0 { - minIndex = 0 - } - - if d.chainHead-d.hashOffset >= minIndex && lookahead > prevLength && prevLength < d.lazy { - if newLength, newOffset, ok := d.findMatch(d.index, d.chainHead-d.hashOffset, minMatchLength-1, lookahead); ok { - d.length = newLength - d.offset = newOffset - } - } - if prevLength >= minMatchLength && d.length <= prevLength { - // There was a match at the previous step, and the current match is - // not better. Output the previous match. - d.tokens.tokens[d.tokens.n] = matchToken(uint32(prevLength-3), uint32(prevOffset-minOffsetSize)) - d.tokens.n++ - - // Insert in the hash table all strings up to the end of the match. - // index and index-1 are already inserted. If there is not enough - // lookahead, the last two strings are not inserted into the hash - // table. - var newIndex int - newIndex = d.index + prevLength - 1 - // Calculate missing hashes - end := newIndex - if end > d.maxInsertIndex { - end = d.maxInsertIndex - } - end += minMatchLength - 1 - startindex := d.index + 1 - if startindex > d.maxInsertIndex { - startindex = d.maxInsertIndex - } - tocheck := d.window[startindex:end] - dstSize := len(tocheck) - minMatchLength + 1 - if dstSize > 0 { - dst := d.hashMatch[:dstSize] - bulkHash4(tocheck, dst) - var newH uint32 - for i, val := range dst { - di := i + startindex - newH = val & hashMask - // Get previous value with the same hash. - // Our chain should point to the previous value. - d.hashPrev[di&windowMask] = d.hashHead[newH] - // Set the head of the hash chain to us. - d.hashHead[newH] = uint32(di + d.hashOffset) - } - d.hash = newH - } - - d.index = newIndex - d.byteAvailable = false - d.length = minMatchLength - 1 - if d.tokens.n == maxFlateBlockTokens { - // The block includes the current character - if d.err = d.writeBlock(d.tokens, d.index, false); d.err != nil { - return - } - d.tokens.n = 0 - } - } else { - // Reset, if we got a match this run. - if d.length >= minMatchLength { - d.ii = 0 - } - // We have a byte waiting. Emit it. - if d.byteAvailable { - d.ii++ - d.tokens.tokens[d.tokens.n] = literalToken(uint32(d.window[d.index-1])) - d.tokens.n++ - if d.tokens.n == maxFlateBlockTokens { - if d.err = d.writeBlock(d.tokens, d.index, false); d.err != nil { - return - } - d.tokens.n = 0 - } - d.index++ - - // If we have a long run of no matches, skip additional bytes - // Resets when d.ii overflows after 64KB. - if d.ii > 31 { - n := int(d.ii >> 5) - for j := 0; j < n; j++ { - if d.index >= d.windowEnd-1 { - break - } - - d.tokens.tokens[d.tokens.n] = literalToken(uint32(d.window[d.index-1])) - d.tokens.n++ - if d.tokens.n == maxFlateBlockTokens { - if d.err = d.writeBlock(d.tokens, d.index, false); d.err != nil { - return - } - d.tokens.n = 0 - } - d.index++ - } - // Flush last byte - d.tokens.tokens[d.tokens.n] = literalToken(uint32(d.window[d.index-1])) - d.tokens.n++ - d.byteAvailable = false - // d.length = minMatchLength - 1 // not needed, since d.ii is reset above, so it should never be > minMatchLength - if d.tokens.n == maxFlateBlockTokens { - if d.err = d.writeBlock(d.tokens, d.index, false); d.err != nil { - return - } - d.tokens.n = 0 - } - } - } else { - d.index++ - d.byteAvailable = true - } - } - } -} - -// Assumes that d.fastSkipHashing != skipNever, -// otherwise use deflateLazySSE -func (d *compressor) deflateSSE() { - - // Sanity enables additional runtime tests. - // It's intended to be used during development - // to supplement the currently ad-hoc unit tests. - const sanity = false - - if d.windowEnd-d.index < minMatchLength+maxMatchLength && !d.sync { - return - } - - d.maxInsertIndex = d.windowEnd - (minMatchLength - 1) - if d.index < d.maxInsertIndex { - d.hash = crc32sse(d.window[d.index:d.index+minMatchLength]) & hashMask - } - - for { - if sanity && d.index > d.windowEnd { - panic("index > windowEnd") - } - lookahead := d.windowEnd - d.index - if lookahead < minMatchLength+maxMatchLength { - if !d.sync { - return - } - if sanity && d.index > d.windowEnd { - panic("index > windowEnd") - } - if lookahead == 0 { - if d.tokens.n > 0 { - if d.err = d.writeBlockSkip(d.tokens, d.index, false); d.err != nil { - return - } - d.tokens.n = 0 - } - return - } - } - if d.index < d.maxInsertIndex { - // Update the hash - d.hash = crc32sse(d.window[d.index:d.index+minMatchLength]) & hashMask - ch := d.hashHead[d.hash] - d.chainHead = int(ch) - d.hashPrev[d.index&windowMask] = ch - d.hashHead[d.hash] = uint32(d.index + d.hashOffset) - } - d.length = minMatchLength - 1 - d.offset = 0 - minIndex := d.index - windowSize - if minIndex < 0 { - minIndex = 0 - } - - if d.chainHead-d.hashOffset >= minIndex && lookahead > minMatchLength-1 { - if newLength, newOffset, ok := d.findMatchSSE(d.index, d.chainHead-d.hashOffset, minMatchLength-1, lookahead); ok { - d.length = newLength - d.offset = newOffset - } - } - if d.length >= minMatchLength { - d.ii = 0 - // There was a match at the previous step, and the current match is - // not better. Output the previous match. - // "d.length-3" should NOT be "d.length-minMatchLength", since the format always assume 3 - d.tokens.tokens[d.tokens.n] = matchToken(uint32(d.length-3), uint32(d.offset-minOffsetSize)) - d.tokens.n++ - // Insert in the hash table all strings up to the end of the match. - // index and index-1 are already inserted. If there is not enough - // lookahead, the last two strings are not inserted into the hash - // table. - if d.length <= d.fastSkipHashing { - var newIndex int - newIndex = d.index + d.length - // Calculate missing hashes - end := newIndex - if end > d.maxInsertIndex { - end = d.maxInsertIndex - } - end += minMatchLength - 1 - startindex := d.index + 1 - if startindex > d.maxInsertIndex { - startindex = d.maxInsertIndex - } - tocheck := d.window[startindex:end] - dstSize := len(tocheck) - minMatchLength + 1 - if dstSize > 0 { - dst := d.hashMatch[:dstSize] - - crc32sseAll(tocheck, dst) - var newH uint32 - for i, val := range dst { - di := i + startindex - newH = val & hashMask - // Get previous value with the same hash. - // Our chain should point to the previous value. - d.hashPrev[di&windowMask] = d.hashHead[newH] - // Set the head of the hash chain to us. - d.hashHead[newH] = uint32(di + d.hashOffset) - } - d.hash = newH - } - d.index = newIndex - } else { - // For matches this long, we don't bother inserting each individual - // item into the table. - d.index += d.length - if d.index < d.maxInsertIndex { - d.hash = crc32sse(d.window[d.index:d.index+minMatchLength]) & hashMask - } - } - if d.tokens.n == maxFlateBlockTokens { - // The block includes the current character - if d.err = d.writeBlockSkip(d.tokens, d.index, false); d.err != nil { - return - } - d.tokens.n = 0 - } - } else { - d.ii++ - end := d.index + int(d.ii>>5) + 1 - if end > d.windowEnd { - end = d.windowEnd - } - for i := d.index; i < end; i++ { - d.tokens.tokens[d.tokens.n] = literalToken(uint32(d.window[i])) - d.tokens.n++ - if d.tokens.n == maxFlateBlockTokens { - if d.err = d.writeBlockSkip(d.tokens, i+1, false); d.err != nil { - return - } - d.tokens.n = 0 - } - } - d.index = end - } - } -} - -// deflateLazy is the same as deflate, but with d.fastSkipHashing == skipNever, -// meaning it always has lazy matching on. -func (d *compressor) deflateLazySSE() { - // Sanity enables additional runtime tests. - // It's intended to be used during development - // to supplement the currently ad-hoc unit tests. - const sanity = false - - if d.windowEnd-d.index < minMatchLength+maxMatchLength && !d.sync { - return - } - - d.maxInsertIndex = d.windowEnd - (minMatchLength - 1) - if d.index < d.maxInsertIndex { - d.hash = crc32sse(d.window[d.index:d.index+minMatchLength]) & hashMask - } - - for { - if sanity && d.index > d.windowEnd { - panic("index > windowEnd") - } - lookahead := d.windowEnd - d.index - if lookahead < minMatchLength+maxMatchLength { - if !d.sync { - return - } - if sanity && d.index > d.windowEnd { - panic("index > windowEnd") - } - if lookahead == 0 { - // Flush current output block if any. - if d.byteAvailable { - // There is still one pending token that needs to be flushed - d.tokens.tokens[d.tokens.n] = literalToken(uint32(d.window[d.index-1])) - d.tokens.n++ - d.byteAvailable = false - } - if d.tokens.n > 0 { - if d.err = d.writeBlock(d.tokens, d.index, false); d.err != nil { - return - } - d.tokens.n = 0 - } - return - } - } - if d.index < d.maxInsertIndex { - // Update the hash - d.hash = crc32sse(d.window[d.index:d.index+minMatchLength]) & hashMask - ch := d.hashHead[d.hash] - d.chainHead = int(ch) - d.hashPrev[d.index&windowMask] = ch - d.hashHead[d.hash] = uint32(d.index + d.hashOffset) - } - prevLength := d.length - prevOffset := d.offset - d.length = minMatchLength - 1 - d.offset = 0 - minIndex := d.index - windowSize - if minIndex < 0 { - minIndex = 0 - } - - if d.chainHead-d.hashOffset >= minIndex && lookahead > prevLength && prevLength < d.lazy { - if newLength, newOffset, ok := d.findMatchSSE(d.index, d.chainHead-d.hashOffset, minMatchLength-1, lookahead); ok { - d.length = newLength - d.offset = newOffset - } - } - if prevLength >= minMatchLength && d.length <= prevLength { - // There was a match at the previous step, and the current match is - // not better. Output the previous match. - d.tokens.tokens[d.tokens.n] = matchToken(uint32(prevLength-3), uint32(prevOffset-minOffsetSize)) - d.tokens.n++ - - // Insert in the hash table all strings up to the end of the match. - // index and index-1 are already inserted. If there is not enough - // lookahead, the last two strings are not inserted into the hash - // table. - var newIndex int - newIndex = d.index + prevLength - 1 - // Calculate missing hashes - end := newIndex - if end > d.maxInsertIndex { - end = d.maxInsertIndex - } - end += minMatchLength - 1 - startindex := d.index + 1 - if startindex > d.maxInsertIndex { - startindex = d.maxInsertIndex - } - tocheck := d.window[startindex:end] - dstSize := len(tocheck) - minMatchLength + 1 - if dstSize > 0 { - dst := d.hashMatch[:dstSize] - crc32sseAll(tocheck, dst) - var newH uint32 - for i, val := range dst { - di := i + startindex - newH = val & hashMask - // Get previous value with the same hash. - // Our chain should point to the previous value. - d.hashPrev[di&windowMask] = d.hashHead[newH] - // Set the head of the hash chain to us. - d.hashHead[newH] = uint32(di + d.hashOffset) - } - d.hash = newH - } - - d.index = newIndex - d.byteAvailable = false - d.length = minMatchLength - 1 - if d.tokens.n == maxFlateBlockTokens { - // The block includes the current character - if d.err = d.writeBlock(d.tokens, d.index, false); d.err != nil { - return - } - d.tokens.n = 0 - } - } else { - // Reset, if we got a match this run. - if d.length >= minMatchLength { - d.ii = 0 - } - // We have a byte waiting. Emit it. - if d.byteAvailable { - d.ii++ - d.tokens.tokens[d.tokens.n] = literalToken(uint32(d.window[d.index-1])) - d.tokens.n++ - if d.tokens.n == maxFlateBlockTokens { - if d.err = d.writeBlock(d.tokens, d.index, false); d.err != nil { - return - } - d.tokens.n = 0 - } - d.index++ - - // If we have a long run of no matches, skip additional bytes - // Resets when d.ii overflows after 64KB. - if d.ii > 31 { - n := int(d.ii >> 6) - for j := 0; j < n; j++ { - if d.index >= d.windowEnd-1 { - break - } - - d.tokens.tokens[d.tokens.n] = literalToken(uint32(d.window[d.index-1])) - d.tokens.n++ - if d.tokens.n == maxFlateBlockTokens { - if d.err = d.writeBlock(d.tokens, d.index, false); d.err != nil { - return - } - d.tokens.n = 0 - } - d.index++ - } - // Flush last byte - d.tokens.tokens[d.tokens.n] = literalToken(uint32(d.window[d.index-1])) - d.tokens.n++ - d.byteAvailable = false - // d.length = minMatchLength - 1 // not needed, since d.ii is reset above, so it should never be > minMatchLength - if d.tokens.n == maxFlateBlockTokens { - if d.err = d.writeBlock(d.tokens, d.index, false); d.err != nil { - return - } - d.tokens.n = 0 - } - } - } else { - d.index++ - d.byteAvailable = true - } - } - } -} - -func (d *compressor) store() { - if d.windowEnd > 0 && (d.windowEnd == maxStoreBlockSize || d.sync) { - d.err = d.writeStoredBlock(d.window[:d.windowEnd]) - d.windowEnd = 0 - } -} - -// fillWindow will fill the buffer with data for huffman-only compression. -// The number of bytes copied is returned. -func (d *compressor) fillBlock(b []byte) int { - n := copy(d.window[d.windowEnd:], b) - d.windowEnd += n - return n -} - -// storeHuff will compress and store the currently added data, -// if enough has been accumulated or we at the end of the stream. -// Any error that occurred will be in d.err -func (d *compressor) storeHuff() { - if d.windowEnd < len(d.window) && !d.sync || d.windowEnd == 0 { - return - } - d.w.writeBlockHuff(false, d.window[:d.windowEnd]) - d.err = d.w.err - d.windowEnd = 0 -} - -// storeHuff will compress and store the currently added data, -// if enough has been accumulated or we at the end of the stream. -// Any error that occurred will be in d.err -func (d *compressor) storeSnappy() { - // We only compress if we have maxStoreBlockSize. - if d.windowEnd < maxStoreBlockSize { - if !d.sync { - return - } - // Handle extremely small sizes. - if d.windowEnd < 128 { - if d.windowEnd == 0 { - return - } - if d.windowEnd <= 32 { - d.err = d.writeStoredBlock(d.window[:d.windowEnd]) - d.tokens.n = 0 - d.windowEnd = 0 - } else { - d.w.writeBlockHuff(false, d.window[:d.windowEnd]) - d.err = d.w.err - } - d.tokens.n = 0 - d.windowEnd = 0 - d.snap.Reset() - return - } - } - - d.snap.Encode(&d.tokens, d.window[:d.windowEnd]) - // If we made zero matches, store the block as is. - if int(d.tokens.n) == d.windowEnd { - d.err = d.writeStoredBlock(d.window[:d.windowEnd]) - // If we removed less than 1/16th, huffman compress the block. - } else if int(d.tokens.n) > d.windowEnd-(d.windowEnd>>4) { - d.w.writeBlockHuff(false, d.window[:d.windowEnd]) - d.err = d.w.err - } else { - d.w.writeBlockDynamic(d.tokens.tokens[:d.tokens.n], false, d.window[:d.windowEnd]) - d.err = d.w.err - } - d.tokens.n = 0 - d.windowEnd = 0 -} - -// write will add input byte to the stream. -// Unless an error occurs all bytes will be consumed. -func (d *compressor) write(b []byte) (n int, err error) { - if d.err != nil { - return 0, d.err - } - n = len(b) - for len(b) > 0 { - d.step(d) - b = b[d.fill(d, b):] - if d.err != nil { - return 0, d.err - } - } - return n, d.err -} - -func (d *compressor) syncFlush() error { - d.sync = true - if d.err != nil { - return d.err - } - d.step(d) - if d.err == nil { - d.w.writeStoredHeader(0, false) - d.w.flush() - d.err = d.w.err - } - d.sync = false - return d.err -} - -func (d *compressor) init(w io.Writer, level int) (err error) { - d.w = newHuffmanBitWriter(w) - - switch { - case level == NoCompression: - d.window = make([]byte, maxStoreBlockSize) - d.fill = (*compressor).fillBlock - d.step = (*compressor).store - case level == ConstantCompression: - d.window = make([]byte, maxStoreBlockSize) - d.fill = (*compressor).fillBlock - d.step = (*compressor).storeHuff - case level >= 1 && level <= 4: - d.snap = newSnappy(level) - d.window = make([]byte, maxStoreBlockSize) - d.fill = (*compressor).fillBlock - d.step = (*compressor).storeSnappy - case level == DefaultCompression: - level = 5 - fallthrough - case 5 <= level && level <= 9: - d.compressionLevel = levels[level] - d.initDeflate() - d.fill = (*compressor).fillDeflate - if d.fastSkipHashing == skipNever { - if useSSE42 { - d.step = (*compressor).deflateLazySSE - } else { - d.step = (*compressor).deflateLazy - } - } else { - if useSSE42 { - d.step = (*compressor).deflateSSE - } else { - d.step = (*compressor).deflate - - } - } - default: - return fmt.Errorf("flate: invalid compression level %d: want value in range [-2, 9]", level) - } - return nil -} - -// reset the state of the compressor. -func (d *compressor) reset(w io.Writer) { - d.w.reset(w) - d.sync = false - d.err = nil - // We only need to reset a few things for Snappy. - if d.snap != nil { - d.snap.Reset() - d.windowEnd = 0 - d.tokens.n = 0 - return - } - switch d.compressionLevel.chain { - case 0: - // level was NoCompression or ConstantCompresssion. - d.windowEnd = 0 - default: - d.chainHead = -1 - for i := range d.hashHead { - d.hashHead[i] = 0 - } - for i := range d.hashPrev { - d.hashPrev[i] = 0 - } - d.hashOffset = 1 - d.index, d.windowEnd = 0, 0 - d.blockStart, d.byteAvailable = 0, false - d.tokens.n = 0 - d.length = minMatchLength - 1 - d.offset = 0 - d.hash = 0 - d.ii = 0 - d.maxInsertIndex = 0 - } -} - -func (d *compressor) close() error { - if d.err != nil { - return d.err - } - d.sync = true - d.step(d) - if d.err != nil { - return d.err - } - if d.w.writeStoredHeader(0, true); d.w.err != nil { - return d.w.err - } - d.w.flush() - return d.w.err -} - -// NewWriter returns a new Writer compressing data at the given level. -// Following zlib, levels range from 1 (BestSpeed) to 9 (BestCompression); -// higher levels typically run slower but compress more. -// Level 0 (NoCompression) does not attempt any compression; it only adds the -// necessary DEFLATE framing. -// Level -1 (DefaultCompression) uses the default compression level. -// Level -2 (ConstantCompression) will use Huffman compression only, giving -// a very fast compression for all types of input, but sacrificing considerable -// compression efficiency. -// -// If level is in the range [-2, 9] then the error returned will be nil. -// Otherwise the error returned will be non-nil. -func NewWriter(w io.Writer, level int) (*Writer, error) { - var dw Writer - if err := dw.d.init(w, level); err != nil { - return nil, err - } - return &dw, nil -} - -// NewWriterDict is like NewWriter but initializes the new -// Writer with a preset dictionary. The returned Writer behaves -// as if the dictionary had been written to it without producing -// any compressed output. The compressed data written to w -// can only be decompressed by a Reader initialized with the -// same dictionary. -func NewWriterDict(w io.Writer, level int, dict []byte) (*Writer, error) { - dw := &dictWriter{w} - zw, err := NewWriter(dw, level) - if err != nil { - return nil, err - } - zw.d.fillWindow(dict) - zw.dict = append(zw.dict, dict...) // duplicate dictionary for Reset method. - return zw, err -} - -type dictWriter struct { - w io.Writer -} - -func (w *dictWriter) Write(b []byte) (n int, err error) { - return w.w.Write(b) -} - -// A Writer takes data written to it and writes the compressed -// form of that data to an underlying writer (see NewWriter). -type Writer struct { - d compressor - dict []byte -} - -// Write writes data to w, which will eventually write the -// compressed form of data to its underlying writer. -func (w *Writer) Write(data []byte) (n int, err error) { - return w.d.write(data) -} - -// Flush flushes any pending data to the underlying writer. -// It is useful mainly in compressed network protocols, to ensure that -// a remote reader has enough data to reconstruct a packet. -// Flush does not return until the data has been written. -// Calling Flush when there is no pending data still causes the Writer -// to emit a sync marker of at least 4 bytes. -// If the underlying writer returns an error, Flush returns that error. -// -// In the terminology of the zlib library, Flush is equivalent to Z_SYNC_FLUSH. -func (w *Writer) Flush() error { - // For more about flushing: - // http://www.bolet.org/~pornin/deflate-flush.html - return w.d.syncFlush() -} - -// Close flushes and closes the writer. -func (w *Writer) Close() error { - return w.d.close() -} - -// Reset discards the writer's state and makes it equivalent to -// the result of NewWriter or NewWriterDict called with dst -// and w's level and dictionary. -func (w *Writer) Reset(dst io.Writer) { - if dw, ok := w.d.w.writer.(*dictWriter); ok { - // w was created with NewWriterDict - dw.w = dst - w.d.reset(dw) - w.d.fillWindow(w.dict) - } else { - // w was created with NewWriter - w.d.reset(dst) - } -} - -// ResetDict discards the writer's state and makes it equivalent to -// the result of NewWriter or NewWriterDict called with dst -// and w's level, but sets a specific dictionary. -func (w *Writer) ResetDict(dst io.Writer, dict []byte) { - w.dict = dict - w.d.reset(dst) - w.d.fillWindow(w.dict) -} diff --git a/vendor/github.com/klauspost/compress/flate/dict_decoder.go b/vendor/github.com/klauspost/compress/flate/dict_decoder.go deleted file mode 100644 index 71c75a065..000000000 --- a/vendor/github.com/klauspost/compress/flate/dict_decoder.go +++ /dev/null @@ -1,184 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package flate - -// dictDecoder implements the LZ77 sliding dictionary as used in decompression. -// LZ77 decompresses data through sequences of two forms of commands: -// -// * Literal insertions: Runs of one or more symbols are inserted into the data -// stream as is. This is accomplished through the writeByte method for a -// single symbol, or combinations of writeSlice/writeMark for multiple symbols. -// Any valid stream must start with a literal insertion if no preset dictionary -// is used. -// -// * Backward copies: Runs of one or more symbols are copied from previously -// emitted data. Backward copies come as the tuple (dist, length) where dist -// determines how far back in the stream to copy from and length determines how -// many bytes to copy. Note that it is valid for the length to be greater than -// the distance. Since LZ77 uses forward copies, that situation is used to -// perform a form of run-length encoding on repeated runs of symbols. -// The writeCopy and tryWriteCopy are used to implement this command. -// -// For performance reasons, this implementation performs little to no sanity -// checks about the arguments. As such, the invariants documented for each -// method call must be respected. -type dictDecoder struct { - hist []byte // Sliding window history - - // Invariant: 0 <= rdPos <= wrPos <= len(hist) - wrPos int // Current output position in buffer - rdPos int // Have emitted hist[:rdPos] already - full bool // Has a full window length been written yet? -} - -// init initializes dictDecoder to have a sliding window dictionary of the given -// size. If a preset dict is provided, it will initialize the dictionary with -// the contents of dict. -func (dd *dictDecoder) init(size int, dict []byte) { - *dd = dictDecoder{hist: dd.hist} - - if cap(dd.hist) < size { - dd.hist = make([]byte, size) - } - dd.hist = dd.hist[:size] - - if len(dict) > len(dd.hist) { - dict = dict[len(dict)-len(dd.hist):] - } - dd.wrPos = copy(dd.hist, dict) - if dd.wrPos == len(dd.hist) { - dd.wrPos = 0 - dd.full = true - } - dd.rdPos = dd.wrPos -} - -// histSize reports the total amount of historical data in the dictionary. -func (dd *dictDecoder) histSize() int { - if dd.full { - return len(dd.hist) - } - return dd.wrPos -} - -// availRead reports the number of bytes that can be flushed by readFlush. -func (dd *dictDecoder) availRead() int { - return dd.wrPos - dd.rdPos -} - -// availWrite reports the available amount of output buffer space. -func (dd *dictDecoder) availWrite() int { - return len(dd.hist) - dd.wrPos -} - -// writeSlice returns a slice of the available buffer to write data to. -// -// This invariant will be kept: len(s) <= availWrite() -func (dd *dictDecoder) writeSlice() []byte { - return dd.hist[dd.wrPos:] -} - -// writeMark advances the writer pointer by cnt. -// -// This invariant must be kept: 0 <= cnt <= availWrite() -func (dd *dictDecoder) writeMark(cnt int) { - dd.wrPos += cnt -} - -// writeByte writes a single byte to the dictionary. -// -// This invariant must be kept: 0 < availWrite() -func (dd *dictDecoder) writeByte(c byte) { - dd.hist[dd.wrPos] = c - dd.wrPos++ -} - -// writeCopy copies a string at a given (dist, length) to the output. -// This returns the number of bytes copied and may be less than the requested -// length if the available space in the output buffer is too small. -// -// This invariant must be kept: 0 < dist <= histSize() -func (dd *dictDecoder) writeCopy(dist, length int) int { - dstBase := dd.wrPos - dstPos := dstBase - srcPos := dstPos - dist - endPos := dstPos + length - if endPos > len(dd.hist) { - endPos = len(dd.hist) - } - - // Copy non-overlapping section after destination position. - // - // This section is non-overlapping in that the copy length for this section - // is always less than or equal to the backwards distance. This can occur - // if a distance refers to data that wraps-around in the buffer. - // Thus, a backwards copy is performed here; that is, the exact bytes in - // the source prior to the copy is placed in the destination. - if srcPos < 0 { - srcPos += len(dd.hist) - dstPos += copy(dd.hist[dstPos:endPos], dd.hist[srcPos:]) - srcPos = 0 - } - - // Copy possibly overlapping section before destination position. - // - // This section can overlap if the copy length for this section is larger - // than the backwards distance. This is allowed by LZ77 so that repeated - // strings can be succinctly represented using (dist, length) pairs. - // Thus, a forwards copy is performed here; that is, the bytes copied is - // possibly dependent on the resulting bytes in the destination as the copy - // progresses along. This is functionally equivalent to the following: - // - // for i := 0; i < endPos-dstPos; i++ { - // dd.hist[dstPos+i] = dd.hist[srcPos+i] - // } - // dstPos = endPos - // - for dstPos < endPos { - dstPos += copy(dd.hist[dstPos:endPos], dd.hist[srcPos:dstPos]) - } - - dd.wrPos = dstPos - return dstPos - dstBase -} - -// tryWriteCopy tries to copy a string at a given (distance, length) to the -// output. This specialized version is optimized for short distances. -// -// This method is designed to be inlined for performance reasons. -// -// This invariant must be kept: 0 < dist <= histSize() -func (dd *dictDecoder) tryWriteCopy(dist, length int) int { - dstPos := dd.wrPos - endPos := dstPos + length - if dstPos < dist || endPos > len(dd.hist) { - return 0 - } - dstBase := dstPos - srcPos := dstPos - dist - - // Copy possibly overlapping section before destination position. -loop: - dstPos += copy(dd.hist[dstPos:endPos], dd.hist[srcPos:dstPos]) - if dstPos < endPos { - goto loop // Avoid for-loop so that this function can be inlined - } - - dd.wrPos = dstPos - return dstPos - dstBase -} - -// readFlush returns a slice of the historical buffer that is ready to be -// emitted to the user. The data returned by readFlush must be fully consumed -// before calling any other dictDecoder methods. -func (dd *dictDecoder) readFlush() []byte { - toRead := dd.hist[dd.rdPos:dd.wrPos] - dd.rdPos = dd.wrPos - if dd.wrPos == len(dd.hist) { - dd.wrPos, dd.rdPos = 0, 0 - dd.full = true - } - return toRead -} diff --git a/vendor/github.com/klauspost/compress/flate/gen.go b/vendor/github.com/klauspost/compress/flate/gen.go deleted file mode 100644 index 154c89a48..000000000 --- a/vendor/github.com/klauspost/compress/flate/gen.go +++ /dev/null @@ -1,265 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// This program generates fixedhuff.go -// Invoke as -// -// go run gen.go -output fixedhuff.go - -package main - -import ( - "bytes" - "flag" - "fmt" - "go/format" - "io/ioutil" - "log" -) - -var filename = flag.String("output", "fixedhuff.go", "output file name") - -const maxCodeLen = 16 - -// Note: the definition of the huffmanDecoder struct is copied from -// inflate.go, as it is private to the implementation. - -// chunk & 15 is number of bits -// chunk >> 4 is value, including table link - -const ( - huffmanChunkBits = 9 - huffmanNumChunks = 1 << huffmanChunkBits - huffmanCountMask = 15 - huffmanValueShift = 4 -) - -type huffmanDecoder struct { - min int // the minimum code length - chunks [huffmanNumChunks]uint32 // chunks as described above - links [][]uint32 // overflow links - linkMask uint32 // mask the width of the link table -} - -// Initialize Huffman decoding tables from array of code lengths. -// Following this function, h is guaranteed to be initialized into a complete -// tree (i.e., neither over-subscribed nor under-subscribed). The exception is a -// degenerate case where the tree has only a single symbol with length 1. Empty -// trees are permitted. -func (h *huffmanDecoder) init(bits []int) bool { - // Sanity enables additional runtime tests during Huffman - // table construction. It's intended to be used during - // development to supplement the currently ad-hoc unit tests. - const sanity = false - - if h.min != 0 { - *h = huffmanDecoder{} - } - - // Count number of codes of each length, - // compute min and max length. - var count [maxCodeLen]int - var min, max int - for _, n := range bits { - if n == 0 { - continue - } - if min == 0 || n < min { - min = n - } - if n > max { - max = n - } - count[n]++ - } - - // Empty tree. The decompressor.huffSym function will fail later if the tree - // is used. Technically, an empty tree is only valid for the HDIST tree and - // not the HCLEN and HLIT tree. However, a stream with an empty HCLEN tree - // is guaranteed to fail since it will attempt to use the tree to decode the - // codes for the HLIT and HDIST trees. Similarly, an empty HLIT tree is - // guaranteed to fail later since the compressed data section must be - // composed of at least one symbol (the end-of-block marker). - if max == 0 { - return true - } - - code := 0 - var nextcode [maxCodeLen]int - for i := min; i <= max; i++ { - code <<= 1 - nextcode[i] = code - code += count[i] - } - - // Check that the coding is complete (i.e., that we've - // assigned all 2-to-the-max possible bit sequences). - // Exception: To be compatible with zlib, we also need to - // accept degenerate single-code codings. See also - // TestDegenerateHuffmanCoding. - if code != 1< huffmanChunkBits { - numLinks := 1 << (uint(max) - huffmanChunkBits) - h.linkMask = uint32(numLinks - 1) - - // create link tables - link := nextcode[huffmanChunkBits+1] >> 1 - h.links = make([][]uint32, huffmanNumChunks-link) - for j := uint(link); j < huffmanNumChunks; j++ { - reverse := int(reverseByte[j>>8]) | int(reverseByte[j&0xff])<<8 - reverse >>= uint(16 - huffmanChunkBits) - off := j - uint(link) - if sanity && h.chunks[reverse] != 0 { - panic("impossible: overwriting existing chunk") - } - h.chunks[reverse] = uint32(off<>8]) | int(reverseByte[code&0xff])<<8 - reverse >>= uint(16 - n) - if n <= huffmanChunkBits { - for off := reverse; off < len(h.chunks); off += 1 << uint(n) { - // We should never need to overwrite - // an existing chunk. Also, 0 is - // never a valid chunk, because the - // lower 4 "count" bits should be - // between 1 and 15. - if sanity && h.chunks[off] != 0 { - panic("impossible: overwriting existing chunk") - } - h.chunks[off] = chunk - } - } else { - j := reverse & (huffmanNumChunks - 1) - if sanity && h.chunks[j]&huffmanCountMask != huffmanChunkBits+1 { - // Longer codes should have been - // associated with a link table above. - panic("impossible: not an indirect chunk") - } - value := h.chunks[j] >> huffmanValueShift - linktab := h.links[value] - reverse >>= huffmanChunkBits - for off := reverse; off < len(linktab); off += 1 << uint(n-huffmanChunkBits) { - if sanity && linktab[off] != 0 { - panic("impossible: overwriting existing chunk") - } - linktab[off] = chunk - } - } - } - - if sanity { - // Above we've sanity checked that we never overwrote - // an existing entry. Here we additionally check that - // we filled the tables completely. - for i, chunk := range h.chunks { - if chunk == 0 { - // As an exception, in the degenerate - // single-code case, we allow odd - // chunks to be missing. - if code == 1 && i%2 == 1 { - continue - } - panic("impossible: missing chunk") - } - } - for _, linktab := range h.links { - for _, chunk := range linktab { - if chunk == 0 { - panic("impossible: missing chunk") - } - } - } - } - - return true -} - -func main() { - flag.Parse() - - var h huffmanDecoder - var bits [288]int - initReverseByte() - for i := 0; i < 144; i++ { - bits[i] = 8 - } - for i := 144; i < 256; i++ { - bits[i] = 9 - } - for i := 256; i < 280; i++ { - bits[i] = 7 - } - for i := 280; i < 288; i++ { - bits[i] = 8 - } - h.init(bits[:]) - if h.links != nil { - log.Fatal("Unexpected links table in fixed Huffman decoder") - } - - var buf bytes.Buffer - - fmt.Fprintf(&buf, `// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file.`+"\n\n") - - fmt.Fprintln(&buf, "package flate") - fmt.Fprintln(&buf) - fmt.Fprintln(&buf, "// autogenerated by go run gen.go -output fixedhuff.go, DO NOT EDIT") - fmt.Fprintln(&buf) - fmt.Fprintln(&buf, "var fixedHuffmanDecoder = huffmanDecoder{") - fmt.Fprintf(&buf, "\t%d,\n", h.min) - fmt.Fprintln(&buf, "\t[huffmanNumChunks]uint32{") - for i := 0; i < huffmanNumChunks; i++ { - if i&7 == 0 { - fmt.Fprintf(&buf, "\t\t") - } else { - fmt.Fprintf(&buf, " ") - } - fmt.Fprintf(&buf, "0x%04x,", h.chunks[i]) - if i&7 == 7 { - fmt.Fprintln(&buf) - } - } - fmt.Fprintln(&buf, "\t},") - fmt.Fprintln(&buf, "\tnil, 0,") - fmt.Fprintln(&buf, "}") - - data, err := format.Source(buf.Bytes()) - if err != nil { - log.Fatal(err) - } - err = ioutil.WriteFile(*filename, data, 0644) - if err != nil { - log.Fatal(err) - } -} - -var reverseByte [256]byte - -func initReverseByte() { - for x := 0; x < 256; x++ { - var result byte - for i := uint(0); i < 8; i++ { - result |= byte(((x >> i) & 1) << (7 - i)) - } - reverseByte[x] = result - } -} diff --git a/vendor/github.com/klauspost/compress/flate/huffman_bit_writer.go b/vendor/github.com/klauspost/compress/flate/huffman_bit_writer.go deleted file mode 100644 index f9b2a699a..000000000 --- a/vendor/github.com/klauspost/compress/flate/huffman_bit_writer.go +++ /dev/null @@ -1,701 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package flate - -import ( - "io" -) - -const ( - // The largest offset code. - offsetCodeCount = 30 - - // The special code used to mark the end of a block. - endBlockMarker = 256 - - // The first length code. - lengthCodesStart = 257 - - // The number of codegen codes. - codegenCodeCount = 19 - badCode = 255 - - // bufferFlushSize indicates the buffer size - // after which bytes are flushed to the writer. - // Should preferably be a multiple of 6, since - // we accumulate 6 bytes between writes to the buffer. - bufferFlushSize = 240 - - // bufferSize is the actual output byte buffer size. - // It must have additional headroom for a flush - // which can contain up to 8 bytes. - bufferSize = bufferFlushSize + 8 -) - -// The number of extra bits needed by length code X - LENGTH_CODES_START. -var lengthExtraBits = []int8{ - /* 257 */ 0, 0, 0, - /* 260 */ 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, - /* 270 */ 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, - /* 280 */ 4, 5, 5, 5, 5, 0, -} - -// The length indicated by length code X - LENGTH_CODES_START. -var lengthBase = []uint32{ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, - 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, - 64, 80, 96, 112, 128, 160, 192, 224, 255, -} - -// offset code word extra bits. -var offsetExtraBits = []int8{ - 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, - 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, - 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, - /* extended window */ - 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, -} - -var offsetBase = []uint32{ - /* normal deflate */ - 0x000000, 0x000001, 0x000002, 0x000003, 0x000004, - 0x000006, 0x000008, 0x00000c, 0x000010, 0x000018, - 0x000020, 0x000030, 0x000040, 0x000060, 0x000080, - 0x0000c0, 0x000100, 0x000180, 0x000200, 0x000300, - 0x000400, 0x000600, 0x000800, 0x000c00, 0x001000, - 0x001800, 0x002000, 0x003000, 0x004000, 0x006000, - - /* extended window */ - 0x008000, 0x00c000, 0x010000, 0x018000, 0x020000, - 0x030000, 0x040000, 0x060000, 0x080000, 0x0c0000, - 0x100000, 0x180000, 0x200000, 0x300000, -} - -// The odd order in which the codegen code sizes are written. -var codegenOrder = []uint32{16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15} - -type huffmanBitWriter struct { - // writer is the underlying writer. - // Do not use it directly; use the write method, which ensures - // that Write errors are sticky. - writer io.Writer - - // Data waiting to be written is bytes[0:nbytes] - // and then the low nbits of bits. - bits uint64 - nbits uint - bytes [bufferSize]byte - codegenFreq [codegenCodeCount]int32 - nbytes int - literalFreq []int32 - offsetFreq []int32 - codegen []uint8 - literalEncoding *huffmanEncoder - offsetEncoding *huffmanEncoder - codegenEncoding *huffmanEncoder - err error -} - -func newHuffmanBitWriter(w io.Writer) *huffmanBitWriter { - return &huffmanBitWriter{ - writer: w, - literalFreq: make([]int32, maxNumLit), - offsetFreq: make([]int32, offsetCodeCount), - codegen: make([]uint8, maxNumLit+offsetCodeCount+1), - literalEncoding: newHuffmanEncoder(maxNumLit), - codegenEncoding: newHuffmanEncoder(codegenCodeCount), - offsetEncoding: newHuffmanEncoder(offsetCodeCount), - } -} - -func (w *huffmanBitWriter) reset(writer io.Writer) { - w.writer = writer - w.bits, w.nbits, w.nbytes, w.err = 0, 0, 0, nil - w.bytes = [bufferSize]byte{} -} - -func (w *huffmanBitWriter) flush() { - if w.err != nil { - w.nbits = 0 - return - } - n := w.nbytes - for w.nbits != 0 { - w.bytes[n] = byte(w.bits) - w.bits >>= 8 - if w.nbits > 8 { // Avoid underflow - w.nbits -= 8 - } else { - w.nbits = 0 - } - n++ - } - w.bits = 0 - w.write(w.bytes[:n]) - w.nbytes = 0 -} - -func (w *huffmanBitWriter) write(b []byte) { - if w.err != nil { - return - } - _, w.err = w.writer.Write(b) -} - -func (w *huffmanBitWriter) writeBits(b int32, nb uint) { - if w.err != nil { - return - } - w.bits |= uint64(b) << w.nbits - w.nbits += nb - if w.nbits >= 48 { - bits := w.bits - w.bits >>= 48 - w.nbits -= 48 - n := w.nbytes - bytes := w.bytes[n : n+6] - bytes[0] = byte(bits) - bytes[1] = byte(bits >> 8) - bytes[2] = byte(bits >> 16) - bytes[3] = byte(bits >> 24) - bytes[4] = byte(bits >> 32) - bytes[5] = byte(bits >> 40) - n += 6 - if n >= bufferFlushSize { - w.write(w.bytes[:n]) - n = 0 - } - w.nbytes = n - } -} - -func (w *huffmanBitWriter) writeBytes(bytes []byte) { - if w.err != nil { - return - } - n := w.nbytes - if w.nbits&7 != 0 { - w.err = InternalError("writeBytes with unfinished bits") - return - } - for w.nbits != 0 { - w.bytes[n] = byte(w.bits) - w.bits >>= 8 - w.nbits -= 8 - n++ - } - if n != 0 { - w.write(w.bytes[:n]) - } - w.nbytes = 0 - w.write(bytes) -} - -// RFC 1951 3.2.7 specifies a special run-length encoding for specifying -// the literal and offset lengths arrays (which are concatenated into a single -// array). This method generates that run-length encoding. -// -// The result is written into the codegen array, and the frequencies -// of each code is written into the codegenFreq array. -// Codes 0-15 are single byte codes. Codes 16-18 are followed by additional -// information. Code badCode is an end marker -// -// numLiterals The number of literals in literalEncoding -// numOffsets The number of offsets in offsetEncoding -// litenc, offenc The literal and offset encoder to use -func (w *huffmanBitWriter) generateCodegen(numLiterals int, numOffsets int, litEnc, offEnc *huffmanEncoder) { - for i := range w.codegenFreq { - w.codegenFreq[i] = 0 - } - // Note that we are using codegen both as a temporary variable for holding - // a copy of the frequencies, and as the place where we put the result. - // This is fine because the output is always shorter than the input used - // so far. - codegen := w.codegen // cache - // Copy the concatenated code sizes to codegen. Put a marker at the end. - cgnl := codegen[:numLiterals] - for i := range cgnl { - cgnl[i] = uint8(litEnc.codes[i].len) - } - - cgnl = codegen[numLiterals : numLiterals+numOffsets] - for i := range cgnl { - cgnl[i] = uint8(offEnc.codes[i].len) - } - codegen[numLiterals+numOffsets] = badCode - - size := codegen[0] - count := 1 - outIndex := 0 - for inIndex := 1; size != badCode; inIndex++ { - // INVARIANT: We have seen "count" copies of size that have not yet - // had output generated for them. - nextSize := codegen[inIndex] - if nextSize == size { - count++ - continue - } - // We need to generate codegen indicating "count" of size. - if size != 0 { - codegen[outIndex] = size - outIndex++ - w.codegenFreq[size]++ - count-- - for count >= 3 { - n := 6 - if n > count { - n = count - } - codegen[outIndex] = 16 - outIndex++ - codegen[outIndex] = uint8(n - 3) - outIndex++ - w.codegenFreq[16]++ - count -= n - } - } else { - for count >= 11 { - n := 138 - if n > count { - n = count - } - codegen[outIndex] = 18 - outIndex++ - codegen[outIndex] = uint8(n - 11) - outIndex++ - w.codegenFreq[18]++ - count -= n - } - if count >= 3 { - // count >= 3 && count <= 10 - codegen[outIndex] = 17 - outIndex++ - codegen[outIndex] = uint8(count - 3) - outIndex++ - w.codegenFreq[17]++ - count = 0 - } - } - count-- - for ; count >= 0; count-- { - codegen[outIndex] = size - outIndex++ - w.codegenFreq[size]++ - } - // Set up invariant for next time through the loop. - size = nextSize - count = 1 - } - // Marker indicating the end of the codegen. - codegen[outIndex] = badCode -} - -// dynamicSize returns the size of dynamically encoded data in bits. -func (w *huffmanBitWriter) dynamicSize(litEnc, offEnc *huffmanEncoder, extraBits int) (size, numCodegens int) { - numCodegens = len(w.codegenFreq) - for numCodegens > 4 && w.codegenFreq[codegenOrder[numCodegens-1]] == 0 { - numCodegens-- - } - header := 3 + 5 + 5 + 4 + (3 * numCodegens) + - w.codegenEncoding.bitLength(w.codegenFreq[:]) + - int(w.codegenFreq[16])*2 + - int(w.codegenFreq[17])*3 + - int(w.codegenFreq[18])*7 - size = header + - litEnc.bitLength(w.literalFreq) + - offEnc.bitLength(w.offsetFreq) + - extraBits - - return size, numCodegens -} - -// fixedSize returns the size of dynamically encoded data in bits. -func (w *huffmanBitWriter) fixedSize(extraBits int) int { - return 3 + - fixedLiteralEncoding.bitLength(w.literalFreq) + - fixedOffsetEncoding.bitLength(w.offsetFreq) + - extraBits -} - -// storedSize calculates the stored size, including header. -// The function returns the size in bits and whether the block -// fits inside a single block. -func (w *huffmanBitWriter) storedSize(in []byte) (int, bool) { - if in == nil { - return 0, false - } - if len(in) <= maxStoreBlockSize { - return (len(in) + 5) * 8, true - } - return 0, false -} - -func (w *huffmanBitWriter) writeCode(c hcode) { - if w.err != nil { - return - } - w.bits |= uint64(c.code) << w.nbits - w.nbits += uint(c.len) - if w.nbits >= 48 { - bits := w.bits - w.bits >>= 48 - w.nbits -= 48 - n := w.nbytes - bytes := w.bytes[n : n+6] - bytes[0] = byte(bits) - bytes[1] = byte(bits >> 8) - bytes[2] = byte(bits >> 16) - bytes[3] = byte(bits >> 24) - bytes[4] = byte(bits >> 32) - bytes[5] = byte(bits >> 40) - n += 6 - if n >= bufferFlushSize { - w.write(w.bytes[:n]) - n = 0 - } - w.nbytes = n - } -} - -// Write the header of a dynamic Huffman block to the output stream. -// -// numLiterals The number of literals specified in codegen -// numOffsets The number of offsets specified in codegen -// numCodegens The number of codegens used in codegen -func (w *huffmanBitWriter) writeDynamicHeader(numLiterals int, numOffsets int, numCodegens int, isEof bool) { - if w.err != nil { - return - } - var firstBits int32 = 4 - if isEof { - firstBits = 5 - } - w.writeBits(firstBits, 3) - w.writeBits(int32(numLiterals-257), 5) - w.writeBits(int32(numOffsets-1), 5) - w.writeBits(int32(numCodegens-4), 4) - - for i := 0; i < numCodegens; i++ { - value := uint(w.codegenEncoding.codes[codegenOrder[i]].len) - w.writeBits(int32(value), 3) - } - - i := 0 - for { - var codeWord int = int(w.codegen[i]) - i++ - if codeWord == badCode { - break - } - w.writeCode(w.codegenEncoding.codes[uint32(codeWord)]) - - switch codeWord { - case 16: - w.writeBits(int32(w.codegen[i]), 2) - i++ - break - case 17: - w.writeBits(int32(w.codegen[i]), 3) - i++ - break - case 18: - w.writeBits(int32(w.codegen[i]), 7) - i++ - break - } - } -} - -func (w *huffmanBitWriter) writeStoredHeader(length int, isEof bool) { - if w.err != nil { - return - } - var flag int32 - if isEof { - flag = 1 - } - w.writeBits(flag, 3) - w.flush() - w.writeBits(int32(length), 16) - w.writeBits(int32(^uint16(length)), 16) -} - -func (w *huffmanBitWriter) writeFixedHeader(isEof bool) { - if w.err != nil { - return - } - // Indicate that we are a fixed Huffman block - var value int32 = 2 - if isEof { - value = 3 - } - w.writeBits(value, 3) -} - -// writeBlock will write a block of tokens with the smallest encoding. -// The original input can be supplied, and if the huffman encoded data -// is larger than the original bytes, the data will be written as a -// stored block. -// If the input is nil, the tokens will always be Huffman encoded. -func (w *huffmanBitWriter) writeBlock(tokens []token, eof bool, input []byte) { - if w.err != nil { - return - } - - tokens = append(tokens, endBlockMarker) - numLiterals, numOffsets := w.indexTokens(tokens) - - var extraBits int - storedSize, storable := w.storedSize(input) - if storable { - // We only bother calculating the costs of the extra bits required by - // the length of offset fields (which will be the same for both fixed - // and dynamic encoding), if we need to compare those two encodings - // against stored encoding. - for lengthCode := lengthCodesStart + 8; lengthCode < numLiterals; lengthCode++ { - // First eight length codes have extra size = 0. - extraBits += int(w.literalFreq[lengthCode]) * int(lengthExtraBits[lengthCode-lengthCodesStart]) - } - for offsetCode := 4; offsetCode < numOffsets; offsetCode++ { - // First four offset codes have extra size = 0. - extraBits += int(w.offsetFreq[offsetCode]) * int(offsetExtraBits[offsetCode]) - } - } - - // Figure out smallest code. - // Fixed Huffman baseline. - var literalEncoding = fixedLiteralEncoding - var offsetEncoding = fixedOffsetEncoding - var size = w.fixedSize(extraBits) - - // Dynamic Huffman? - var numCodegens int - - // Generate codegen and codegenFrequencies, which indicates how to encode - // the literalEncoding and the offsetEncoding. - w.generateCodegen(numLiterals, numOffsets, w.literalEncoding, w.offsetEncoding) - w.codegenEncoding.generate(w.codegenFreq[:], 7) - dynamicSize, numCodegens := w.dynamicSize(w.literalEncoding, w.offsetEncoding, extraBits) - - if dynamicSize < size { - size = dynamicSize - literalEncoding = w.literalEncoding - offsetEncoding = w.offsetEncoding - } - - // Stored bytes? - if storable && storedSize < size { - w.writeStoredHeader(len(input), eof) - w.writeBytes(input) - return - } - - // Huffman. - if literalEncoding == fixedLiteralEncoding { - w.writeFixedHeader(eof) - } else { - w.writeDynamicHeader(numLiterals, numOffsets, numCodegens, eof) - } - - // Write the tokens. - w.writeTokens(tokens, literalEncoding.codes, offsetEncoding.codes) -} - -// writeBlockDynamic encodes a block using a dynamic Huffman table. -// This should be used if the symbols used have a disproportionate -// histogram distribution. -// If input is supplied and the compression savings are below 1/16th of the -// input size the block is stored. -func (w *huffmanBitWriter) writeBlockDynamic(tokens []token, eof bool, input []byte) { - if w.err != nil { - return - } - - tokens = append(tokens, endBlockMarker) - numLiterals, numOffsets := w.indexTokens(tokens) - - // Generate codegen and codegenFrequencies, which indicates how to encode - // the literalEncoding and the offsetEncoding. - w.generateCodegen(numLiterals, numOffsets, w.literalEncoding, w.offsetEncoding) - w.codegenEncoding.generate(w.codegenFreq[:], 7) - size, numCodegens := w.dynamicSize(w.literalEncoding, w.offsetEncoding, 0) - - // Store bytes, if we don't get a reasonable improvement. - if ssize, storable := w.storedSize(input); storable && ssize < (size+size>>4) { - w.writeStoredHeader(len(input), eof) - w.writeBytes(input) - return - } - - // Write Huffman table. - w.writeDynamicHeader(numLiterals, numOffsets, numCodegens, eof) - - // Write the tokens. - w.writeTokens(tokens, w.literalEncoding.codes, w.offsetEncoding.codes) -} - -// indexTokens indexes a slice of tokens, and updates -// literalFreq and offsetFreq, and generates literalEncoding -// and offsetEncoding. -// The number of literal and offset tokens is returned. -func (w *huffmanBitWriter) indexTokens(tokens []token) (numLiterals, numOffsets int) { - for i := range w.literalFreq { - w.literalFreq[i] = 0 - } - for i := range w.offsetFreq { - w.offsetFreq[i] = 0 - } - - for _, t := range tokens { - if t < matchType { - w.literalFreq[t.literal()]++ - continue - } - length := t.length() - offset := t.offset() - w.literalFreq[lengthCodesStart+lengthCode(length)]++ - w.offsetFreq[offsetCode(offset)]++ - } - - // get the number of literals - numLiterals = len(w.literalFreq) - for w.literalFreq[numLiterals-1] == 0 { - numLiterals-- - } - // get the number of offsets - numOffsets = len(w.offsetFreq) - for numOffsets > 0 && w.offsetFreq[numOffsets-1] == 0 { - numOffsets-- - } - if numOffsets == 0 { - // We haven't found a single match. If we want to go with the dynamic encoding, - // we should count at least one offset to be sure that the offset huffman tree could be encoded. - w.offsetFreq[0] = 1 - numOffsets = 1 - } - w.literalEncoding.generate(w.literalFreq, 15) - w.offsetEncoding.generate(w.offsetFreq, 15) - return -} - -// writeTokens writes a slice of tokens to the output. -// codes for literal and offset encoding must be supplied. -func (w *huffmanBitWriter) writeTokens(tokens []token, leCodes, oeCodes []hcode) { - if w.err != nil { - return - } - for _, t := range tokens { - if t < matchType { - w.writeCode(leCodes[t.literal()]) - continue - } - // Write the length - length := t.length() - lengthCode := lengthCode(length) - w.writeCode(leCodes[lengthCode+lengthCodesStart]) - extraLengthBits := uint(lengthExtraBits[lengthCode]) - if extraLengthBits > 0 { - extraLength := int32(length - lengthBase[lengthCode]) - w.writeBits(extraLength, extraLengthBits) - } - // Write the offset - offset := t.offset() - offsetCode := offsetCode(offset) - w.writeCode(oeCodes[offsetCode]) - extraOffsetBits := uint(offsetExtraBits[offsetCode]) - if extraOffsetBits > 0 { - extraOffset := int32(offset - offsetBase[offsetCode]) - w.writeBits(extraOffset, extraOffsetBits) - } - } -} - -// huffOffset is a static offset encoder used for huffman only encoding. -// It can be reused since we will not be encoding offset values. -var huffOffset *huffmanEncoder - -func init() { - w := newHuffmanBitWriter(nil) - w.offsetFreq[0] = 1 - huffOffset = newHuffmanEncoder(offsetCodeCount) - huffOffset.generate(w.offsetFreq, 15) -} - -// writeBlockHuff encodes a block of bytes as either -// Huffman encoded literals or uncompressed bytes if the -// results only gains very little from compression. -func (w *huffmanBitWriter) writeBlockHuff(eof bool, input []byte) { - if w.err != nil { - return - } - - // Clear histogram - for i := range w.literalFreq { - w.literalFreq[i] = 0 - } - - // Add everything as literals - histogram(input, w.literalFreq) - - w.literalFreq[endBlockMarker] = 1 - - const numLiterals = endBlockMarker + 1 - const numOffsets = 1 - - w.literalEncoding.generate(w.literalFreq, 15) - - // Figure out smallest code. - // Always use dynamic Huffman or Store - var numCodegens int - - // Generate codegen and codegenFrequencies, which indicates how to encode - // the literalEncoding and the offsetEncoding. - w.generateCodegen(numLiterals, numOffsets, w.literalEncoding, huffOffset) - w.codegenEncoding.generate(w.codegenFreq[:], 7) - size, numCodegens := w.dynamicSize(w.literalEncoding, huffOffset, 0) - - // Store bytes, if we don't get a reasonable improvement. - if ssize, storable := w.storedSize(input); storable && ssize < (size+size>>4) { - w.writeStoredHeader(len(input), eof) - w.writeBytes(input) - return - } - - // Huffman. - w.writeDynamicHeader(numLiterals, numOffsets, numCodegens, eof) - encoding := w.literalEncoding.codes[:257] - n := w.nbytes - for _, t := range input { - // Bitwriting inlined, ~30% speedup - c := encoding[t] - w.bits |= uint64(c.code) << w.nbits - w.nbits += uint(c.len) - if w.nbits < 48 { - continue - } - // Store 6 bytes - bits := w.bits - w.bits >>= 48 - w.nbits -= 48 - bytes := w.bytes[n : n+6] - bytes[0] = byte(bits) - bytes[1] = byte(bits >> 8) - bytes[2] = byte(bits >> 16) - bytes[3] = byte(bits >> 24) - bytes[4] = byte(bits >> 32) - bytes[5] = byte(bits >> 40) - n += 6 - if n < bufferFlushSize { - continue - } - w.write(w.bytes[:n]) - if w.err != nil { - return // Return early in the event of write failures - } - n = 0 - } - w.nbytes = n - w.writeCode(encoding[endBlockMarker]) -} diff --git a/vendor/github.com/klauspost/compress/flate/huffman_code.go b/vendor/github.com/klauspost/compress/flate/huffman_code.go deleted file mode 100644 index bdcbd823b..000000000 --- a/vendor/github.com/klauspost/compress/flate/huffman_code.go +++ /dev/null @@ -1,344 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package flate - -import ( - "math" - "sort" -) - -// hcode is a huffman code with a bit code and bit length. -type hcode struct { - code, len uint16 -} - -type huffmanEncoder struct { - codes []hcode - freqcache []literalNode - bitCount [17]int32 - lns byLiteral // stored to avoid repeated allocation in generate - lfs byFreq // stored to avoid repeated allocation in generate -} - -type literalNode struct { - literal uint16 - freq int32 -} - -// A levelInfo describes the state of the constructed tree for a given depth. -type levelInfo struct { - // Our level. for better printing - level int32 - - // The frequency of the last node at this level - lastFreq int32 - - // The frequency of the next character to add to this level - nextCharFreq int32 - - // The frequency of the next pair (from level below) to add to this level. - // Only valid if the "needed" value of the next lower level is 0. - nextPairFreq int32 - - // The number of chains remaining to generate for this level before moving - // up to the next level - needed int32 -} - -// set sets the code and length of an hcode. -func (h *hcode) set(code uint16, length uint16) { - h.len = length - h.code = code -} - -func maxNode() literalNode { return literalNode{math.MaxUint16, math.MaxInt32} } - -func newHuffmanEncoder(size int) *huffmanEncoder { - return &huffmanEncoder{codes: make([]hcode, size)} -} - -// Generates a HuffmanCode corresponding to the fixed literal table -func generateFixedLiteralEncoding() *huffmanEncoder { - h := newHuffmanEncoder(maxNumLit) - codes := h.codes - var ch uint16 - for ch = 0; ch < maxNumLit; ch++ { - var bits uint16 - var size uint16 - switch { - case ch < 144: - // size 8, 000110000 .. 10111111 - bits = ch + 48 - size = 8 - break - case ch < 256: - // size 9, 110010000 .. 111111111 - bits = ch + 400 - 144 - size = 9 - break - case ch < 280: - // size 7, 0000000 .. 0010111 - bits = ch - 256 - size = 7 - break - default: - // size 8, 11000000 .. 11000111 - bits = ch + 192 - 280 - size = 8 - } - codes[ch] = hcode{code: reverseBits(bits, byte(size)), len: size} - } - return h -} - -func generateFixedOffsetEncoding() *huffmanEncoder { - h := newHuffmanEncoder(30) - codes := h.codes - for ch := range codes { - codes[ch] = hcode{code: reverseBits(uint16(ch), 5), len: 5} - } - return h -} - -var fixedLiteralEncoding *huffmanEncoder = generateFixedLiteralEncoding() -var fixedOffsetEncoding *huffmanEncoder = generateFixedOffsetEncoding() - -func (h *huffmanEncoder) bitLength(freq []int32) int { - var total int - for i, f := range freq { - if f != 0 { - total += int(f) * int(h.codes[i].len) - } - } - return total -} - -const maxBitsLimit = 16 - -// Return the number of literals assigned to each bit size in the Huffman encoding -// -// This method is only called when list.length >= 3 -// The cases of 0, 1, and 2 literals are handled by special case code. -// -// list An array of the literals with non-zero frequencies -// and their associated frequencies. The array is in order of increasing -// frequency, and has as its last element a special element with frequency -// MaxInt32 -// maxBits The maximum number of bits that should be used to encode any literal. -// Must be less than 16. -// return An integer array in which array[i] indicates the number of literals -// that should be encoded in i bits. -func (h *huffmanEncoder) bitCounts(list []literalNode, maxBits int32) []int32 { - if maxBits >= maxBitsLimit { - panic("flate: maxBits too large") - } - n := int32(len(list)) - list = list[0 : n+1] - list[n] = maxNode() - - // The tree can't have greater depth than n - 1, no matter what. This - // saves a little bit of work in some small cases - if maxBits > n-1 { - maxBits = n - 1 - } - - // Create information about each of the levels. - // A bogus "Level 0" whose sole purpose is so that - // level1.prev.needed==0. This makes level1.nextPairFreq - // be a legitimate value that never gets chosen. - var levels [maxBitsLimit]levelInfo - // leafCounts[i] counts the number of literals at the left - // of ancestors of the rightmost node at level i. - // leafCounts[i][j] is the number of literals at the left - // of the level j ancestor. - var leafCounts [maxBitsLimit][maxBitsLimit]int32 - - for level := int32(1); level <= maxBits; level++ { - // For every level, the first two items are the first two characters. - // We initialize the levels as if we had already figured this out. - levels[level] = levelInfo{ - level: level, - lastFreq: list[1].freq, - nextCharFreq: list[2].freq, - nextPairFreq: list[0].freq + list[1].freq, - } - leafCounts[level][level] = 2 - if level == 1 { - levels[level].nextPairFreq = math.MaxInt32 - } - } - - // We need a total of 2*n - 2 items at top level and have already generated 2. - levels[maxBits].needed = 2*n - 4 - - level := maxBits - for { - l := &levels[level] - if l.nextPairFreq == math.MaxInt32 && l.nextCharFreq == math.MaxInt32 { - // We've run out of both leafs and pairs. - // End all calculations for this level. - // To make sure we never come back to this level or any lower level, - // set nextPairFreq impossibly large. - l.needed = 0 - levels[level+1].nextPairFreq = math.MaxInt32 - level++ - continue - } - - prevFreq := l.lastFreq - if l.nextCharFreq < l.nextPairFreq { - // The next item on this row is a leaf node. - n := leafCounts[level][level] + 1 - l.lastFreq = l.nextCharFreq - // Lower leafCounts are the same of the previous node. - leafCounts[level][level] = n - l.nextCharFreq = list[n].freq - } else { - // The next item on this row is a pair from the previous row. - // nextPairFreq isn't valid until we generate two - // more values in the level below - l.lastFreq = l.nextPairFreq - // Take leaf counts from the lower level, except counts[level] remains the same. - copy(leafCounts[level][:level], leafCounts[level-1][:level]) - levels[l.level-1].needed = 2 - } - - if l.needed--; l.needed == 0 { - // We've done everything we need to do for this level. - // Continue calculating one level up. Fill in nextPairFreq - // of that level with the sum of the two nodes we've just calculated on - // this level. - if l.level == maxBits { - // All done! - break - } - levels[l.level+1].nextPairFreq = prevFreq + l.lastFreq - level++ - } else { - // If we stole from below, move down temporarily to replenish it. - for levels[level-1].needed > 0 { - level-- - } - } - } - - // Somethings is wrong if at the end, the top level is null or hasn't used - // all of the leaves. - if leafCounts[maxBits][maxBits] != n { - panic("leafCounts[maxBits][maxBits] != n") - } - - bitCount := h.bitCount[:maxBits+1] - bits := 1 - counts := &leafCounts[maxBits] - for level := maxBits; level > 0; level-- { - // chain.leafCount gives the number of literals requiring at least "bits" - // bits to encode. - bitCount[bits] = counts[level] - counts[level-1] - bits++ - } - return bitCount -} - -// Look at the leaves and assign them a bit count and an encoding as specified -// in RFC 1951 3.2.2 -func (h *huffmanEncoder) assignEncodingAndSize(bitCount []int32, list []literalNode) { - code := uint16(0) - for n, bits := range bitCount { - code <<= 1 - if n == 0 || bits == 0 { - continue - } - // The literals list[len(list)-bits] .. list[len(list)-bits] - // are encoded using "bits" bits, and get the values - // code, code + 1, .... The code values are - // assigned in literal order (not frequency order). - chunk := list[len(list)-int(bits):] - - h.lns.sort(chunk) - for _, node := range chunk { - h.codes[node.literal] = hcode{code: reverseBits(code, uint8(n)), len: uint16(n)} - code++ - } - list = list[0 : len(list)-int(bits)] - } -} - -// Update this Huffman Code object to be the minimum code for the specified frequency count. -// -// freq An array of frequencies, in which frequency[i] gives the frequency of literal i. -// maxBits The maximum number of bits to use for any literal. -func (h *huffmanEncoder) generate(freq []int32, maxBits int32) { - if h.freqcache == nil { - // Allocate a reusable buffer with the longest possible frequency table. - // Possible lengths are codegenCodeCount, offsetCodeCount and maxNumLit. - // The largest of these is maxNumLit, so we allocate for that case. - h.freqcache = make([]literalNode, maxNumLit+1) - } - list := h.freqcache[:len(freq)+1] - // Number of non-zero literals - count := 0 - // Set list to be the set of all non-zero literals and their frequencies - for i, f := range freq { - if f != 0 { - list[count] = literalNode{uint16(i), f} - count++ - } else { - list[count] = literalNode{} - h.codes[i].len = 0 - } - } - list[len(freq)] = literalNode{} - - list = list[:count] - if count <= 2 { - // Handle the small cases here, because they are awkward for the general case code. With - // two or fewer literals, everything has bit length 1. - for i, node := range list { - // "list" is in order of increasing literal value. - h.codes[node.literal].set(uint16(i), 1) - } - return - } - h.lfs.sort(list) - - // Get the number of literals for each bit count - bitCount := h.bitCounts(list, maxBits) - // And do the assignment - h.assignEncodingAndSize(bitCount, list) -} - -type byLiteral []literalNode - -func (s *byLiteral) sort(a []literalNode) { - *s = byLiteral(a) - sort.Sort(s) -} - -func (s byLiteral) Len() int { return len(s) } - -func (s byLiteral) Less(i, j int) bool { - return s[i].literal < s[j].literal -} - -func (s byLiteral) Swap(i, j int) { s[i], s[j] = s[j], s[i] } - -type byFreq []literalNode - -func (s *byFreq) sort(a []literalNode) { - *s = byFreq(a) - sort.Sort(s) -} - -func (s byFreq) Len() int { return len(s) } - -func (s byFreq) Less(i, j int) bool { - if s[i].freq == s[j].freq { - return s[i].literal < s[j].literal - } - return s[i].freq < s[j].freq -} - -func (s byFreq) Swap(i, j int) { s[i], s[j] = s[j], s[i] } diff --git a/vendor/github.com/klauspost/compress/flate/inflate.go b/vendor/github.com/klauspost/compress/flate/inflate.go deleted file mode 100644 index 53b63d9a0..000000000 --- a/vendor/github.com/klauspost/compress/flate/inflate.go +++ /dev/null @@ -1,846 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package flate implements the DEFLATE compressed data format, described in -// RFC 1951. The gzip and zlib packages implement access to DEFLATE-based file -// formats. -package flate - -import ( - "bufio" - "io" - "strconv" - "sync" -) - -const ( - maxCodeLen = 16 // max length of Huffman code - // The next three numbers come from the RFC section 3.2.7, with the - // additional proviso in section 3.2.5 which implies that distance codes - // 30 and 31 should never occur in compressed data. - maxNumLit = 286 - maxNumDist = 30 - numCodes = 19 // number of codes in Huffman meta-code -) - -// Initialize the fixedHuffmanDecoder only once upon first use. -var fixedOnce sync.Once -var fixedHuffmanDecoder huffmanDecoder - -// A CorruptInputError reports the presence of corrupt input at a given offset. -type CorruptInputError int64 - -func (e CorruptInputError) Error() string { - return "flate: corrupt input before offset " + strconv.FormatInt(int64(e), 10) -} - -// An InternalError reports an error in the flate code itself. -type InternalError string - -func (e InternalError) Error() string { return "flate: internal error: " + string(e) } - -// A ReadError reports an error encountered while reading input. -// -// Deprecated: No longer returned. -type ReadError struct { - Offset int64 // byte offset where error occurred - Err error // error returned by underlying Read -} - -func (e *ReadError) Error() string { - return "flate: read error at offset " + strconv.FormatInt(e.Offset, 10) + ": " + e.Err.Error() -} - -// A WriteError reports an error encountered while writing output. -// -// Deprecated: No longer returned. -type WriteError struct { - Offset int64 // byte offset where error occurred - Err error // error returned by underlying Write -} - -func (e *WriteError) Error() string { - return "flate: write error at offset " + strconv.FormatInt(e.Offset, 10) + ": " + e.Err.Error() -} - -// Resetter resets a ReadCloser returned by NewReader or NewReaderDict to -// to switch to a new underlying Reader. This permits reusing a ReadCloser -// instead of allocating a new one. -type Resetter interface { - // Reset discards any buffered data and resets the Resetter as if it was - // newly initialized with the given reader. - Reset(r io.Reader, dict []byte) error -} - -// The data structure for decoding Huffman tables is based on that of -// zlib. There is a lookup table of a fixed bit width (huffmanChunkBits), -// For codes smaller than the table width, there are multiple entries -// (each combination of trailing bits has the same value). For codes -// larger than the table width, the table contains a link to an overflow -// table. The width of each entry in the link table is the maximum code -// size minus the chunk width. -// -// Note that you can do a lookup in the table even without all bits -// filled. Since the extra bits are zero, and the DEFLATE Huffman codes -// have the property that shorter codes come before longer ones, the -// bit length estimate in the result is a lower bound on the actual -// number of bits. -// -// See the following: -// http://www.gzip.org/algorithm.txt - -// chunk & 15 is number of bits -// chunk >> 4 is value, including table link - -const ( - huffmanChunkBits = 9 - huffmanNumChunks = 1 << huffmanChunkBits - huffmanCountMask = 15 - huffmanValueShift = 4 -) - -type huffmanDecoder struct { - min int // the minimum code length - chunks [huffmanNumChunks]uint32 // chunks as described above - links [][]uint32 // overflow links - linkMask uint32 // mask the width of the link table -} - -// Initialize Huffman decoding tables from array of code lengths. -// Following this function, h is guaranteed to be initialized into a complete -// tree (i.e., neither over-subscribed nor under-subscribed). The exception is a -// degenerate case where the tree has only a single symbol with length 1. Empty -// trees are permitted. -func (h *huffmanDecoder) init(bits []int) bool { - // Sanity enables additional runtime tests during Huffman - // table construction. It's intended to be used during - // development to supplement the currently ad-hoc unit tests. - const sanity = false - - if h.min != 0 { - *h = huffmanDecoder{} - } - - // Count number of codes of each length, - // compute min and max length. - var count [maxCodeLen]int - var min, max int - for _, n := range bits { - if n == 0 { - continue - } - if min == 0 || n < min { - min = n - } - if n > max { - max = n - } - count[n]++ - } - - // Empty tree. The decompressor.huffSym function will fail later if the tree - // is used. Technically, an empty tree is only valid for the HDIST tree and - // not the HCLEN and HLIT tree. However, a stream with an empty HCLEN tree - // is guaranteed to fail since it will attempt to use the tree to decode the - // codes for the HLIT and HDIST trees. Similarly, an empty HLIT tree is - // guaranteed to fail later since the compressed data section must be - // composed of at least one symbol (the end-of-block marker). - if max == 0 { - return true - } - - code := 0 - var nextcode [maxCodeLen]int - for i := min; i <= max; i++ { - code <<= 1 - nextcode[i] = code - code += count[i] - } - - // Check that the coding is complete (i.e., that we've - // assigned all 2-to-the-max possible bit sequences). - // Exception: To be compatible with zlib, we also need to - // accept degenerate single-code codings. See also - // TestDegenerateHuffmanCoding. - if code != 1< huffmanChunkBits { - numLinks := 1 << (uint(max) - huffmanChunkBits) - h.linkMask = uint32(numLinks - 1) - - // create link tables - link := nextcode[huffmanChunkBits+1] >> 1 - h.links = make([][]uint32, huffmanNumChunks-link) - for j := uint(link); j < huffmanNumChunks; j++ { - reverse := int(reverseByte[j>>8]) | int(reverseByte[j&0xff])<<8 - reverse >>= uint(16 - huffmanChunkBits) - off := j - uint(link) - if sanity && h.chunks[reverse] != 0 { - panic("impossible: overwriting existing chunk") - } - h.chunks[reverse] = uint32(off<>8]) | int(reverseByte[code&0xff])<<8 - reverse >>= uint(16 - n) - if n <= huffmanChunkBits { - for off := reverse; off < len(h.chunks); off += 1 << uint(n) { - // We should never need to overwrite - // an existing chunk. Also, 0 is - // never a valid chunk, because the - // lower 4 "count" bits should be - // between 1 and 15. - if sanity && h.chunks[off] != 0 { - panic("impossible: overwriting existing chunk") - } - h.chunks[off] = chunk - } - } else { - j := reverse & (huffmanNumChunks - 1) - if sanity && h.chunks[j]&huffmanCountMask != huffmanChunkBits+1 { - // Longer codes should have been - // associated with a link table above. - panic("impossible: not an indirect chunk") - } - value := h.chunks[j] >> huffmanValueShift - linktab := h.links[value] - reverse >>= huffmanChunkBits - for off := reverse; off < len(linktab); off += 1 << uint(n-huffmanChunkBits) { - if sanity && linktab[off] != 0 { - panic("impossible: overwriting existing chunk") - } - linktab[off] = chunk - } - } - } - - if sanity { - // Above we've sanity checked that we never overwrote - // an existing entry. Here we additionally check that - // we filled the tables completely. - for i, chunk := range h.chunks { - if chunk == 0 { - // As an exception, in the degenerate - // single-code case, we allow odd - // chunks to be missing. - if code == 1 && i%2 == 1 { - continue - } - panic("impossible: missing chunk") - } - } - for _, linktab := range h.links { - for _, chunk := range linktab { - if chunk == 0 { - panic("impossible: missing chunk") - } - } - } - } - - return true -} - -// The actual read interface needed by NewReader. -// If the passed in io.Reader does not also have ReadByte, -// the NewReader will introduce its own buffering. -type Reader interface { - io.Reader - io.ByteReader -} - -// Decompress state. -type decompressor struct { - // Input source. - r Reader - roffset int64 - - // Input bits, in top of b. - b uint32 - nb uint - - // Huffman decoders for literal/length, distance. - h1, h2 huffmanDecoder - - // Length arrays used to define Huffman codes. - bits *[maxNumLit + maxNumDist]int - codebits *[numCodes]int - - // Output history, buffer. - dict dictDecoder - - // Temporary buffer (avoids repeated allocation). - buf [4]byte - - // Next step in the decompression, - // and decompression state. - step func(*decompressor) - stepState int - final bool - err error - toRead []byte - hl, hd *huffmanDecoder - copyLen int - copyDist int -} - -func (f *decompressor) nextBlock() { - for f.nb < 1+2 { - if f.err = f.moreBits(); f.err != nil { - return - } - } - f.final = f.b&1 == 1 - f.b >>= 1 - typ := f.b & 3 - f.b >>= 2 - f.nb -= 1 + 2 - switch typ { - case 0: - f.dataBlock() - case 1: - // compressed, fixed Huffman tables - f.hl = &fixedHuffmanDecoder - f.hd = nil - f.huffmanBlock() - case 2: - // compressed, dynamic Huffman tables - if f.err = f.readHuffman(); f.err != nil { - break - } - f.hl = &f.h1 - f.hd = &f.h2 - f.huffmanBlock() - default: - // 3 is reserved. - f.err = CorruptInputError(f.roffset) - } -} - -func (f *decompressor) Read(b []byte) (int, error) { - for { - if len(f.toRead) > 0 { - n := copy(b, f.toRead) - f.toRead = f.toRead[n:] - if len(f.toRead) == 0 { - return n, f.err - } - return n, nil - } - if f.err != nil { - return 0, f.err - } - f.step(f) - if f.err != nil && len(f.toRead) == 0 { - f.toRead = f.dict.readFlush() // Flush what's left in case of error - } - } -} - -// Support the io.WriteTo interface for io.Copy and friends. -func (f *decompressor) WriteTo(w io.Writer) (int64, error) { - total := int64(0) - flushed := false - for { - if len(f.toRead) > 0 { - n, err := w.Write(f.toRead) - total += int64(n) - if err != nil { - f.err = err - return total, err - } - if n != len(f.toRead) { - return total, io.ErrShortWrite - } - f.toRead = f.toRead[:0] - } - if f.err != nil && flushed { - if f.err == io.EOF { - return total, nil - } - return total, f.err - } - if f.err == nil { - f.step(f) - } - if len(f.toRead) == 0 && f.err != nil && !flushed { - f.toRead = f.dict.readFlush() // Flush what's left in case of error - flushed = true - } - } -} - -func (f *decompressor) Close() error { - if f.err == io.EOF { - return nil - } - return f.err -} - -// RFC 1951 section 3.2.7. -// Compression with dynamic Huffman codes - -var codeOrder = [...]int{16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15} - -func (f *decompressor) readHuffman() error { - // HLIT[5], HDIST[5], HCLEN[4]. - for f.nb < 5+5+4 { - if err := f.moreBits(); err != nil { - return err - } - } - nlit := int(f.b&0x1F) + 257 - if nlit > maxNumLit { - return CorruptInputError(f.roffset) - } - f.b >>= 5 - ndist := int(f.b&0x1F) + 1 - if ndist > maxNumDist { - return CorruptInputError(f.roffset) - } - f.b >>= 5 - nclen := int(f.b&0xF) + 4 - // numCodes is 19, so nclen is always valid. - f.b >>= 4 - f.nb -= 5 + 5 + 4 - - // (HCLEN+4)*3 bits: code lengths in the magic codeOrder order. - for i := 0; i < nclen; i++ { - for f.nb < 3 { - if err := f.moreBits(); err != nil { - return err - } - } - f.codebits[codeOrder[i]] = int(f.b & 0x7) - f.b >>= 3 - f.nb -= 3 - } - for i := nclen; i < len(codeOrder); i++ { - f.codebits[codeOrder[i]] = 0 - } - if !f.h1.init(f.codebits[0:]) { - return CorruptInputError(f.roffset) - } - - // HLIT + 257 code lengths, HDIST + 1 code lengths, - // using the code length Huffman code. - for i, n := 0, nlit+ndist; i < n; { - x, err := f.huffSym(&f.h1) - if err != nil { - return err - } - if x < 16 { - // Actual length. - f.bits[i] = x - i++ - continue - } - // Repeat previous length or zero. - var rep int - var nb uint - var b int - switch x { - default: - return InternalError("unexpected length code") - case 16: - rep = 3 - nb = 2 - if i == 0 { - return CorruptInputError(f.roffset) - } - b = f.bits[i-1] - case 17: - rep = 3 - nb = 3 - b = 0 - case 18: - rep = 11 - nb = 7 - b = 0 - } - for f.nb < nb { - if err := f.moreBits(); err != nil { - return err - } - } - rep += int(f.b & uint32(1<>= nb - f.nb -= nb - if i+rep > n { - return CorruptInputError(f.roffset) - } - for j := 0; j < rep; j++ { - f.bits[i] = b - i++ - } - } - - if !f.h1.init(f.bits[0:nlit]) || !f.h2.init(f.bits[nlit:nlit+ndist]) { - return CorruptInputError(f.roffset) - } - - // As an optimization, we can initialize the min bits to read at a time - // for the HLIT tree to the length of the EOB marker since we know that - // every block must terminate with one. This preserves the property that - // we never read any extra bytes after the end of the DEFLATE stream. - if f.h1.min < f.bits[endBlockMarker] { - f.h1.min = f.bits[endBlockMarker] - } - - return nil -} - -// Decode a single Huffman block from f. -// hl and hd are the Huffman states for the lit/length values -// and the distance values, respectively. If hd == nil, using the -// fixed distance encoding associated with fixed Huffman blocks. -func (f *decompressor) huffmanBlock() { - const ( - stateInit = iota // Zero value must be stateInit - stateDict - ) - - switch f.stepState { - case stateInit: - goto readLiteral - case stateDict: - goto copyHistory - } - -readLiteral: - // Read literal and/or (length, distance) according to RFC section 3.2.3. - { - v, err := f.huffSym(f.hl) - if err != nil { - f.err = err - return - } - var n uint // number of bits extra - var length int - switch { - case v < 256: - f.dict.writeByte(byte(v)) - if f.dict.availWrite() == 0 { - f.toRead = f.dict.readFlush() - f.step = (*decompressor).huffmanBlock - f.stepState = stateInit - return - } - goto readLiteral - case v == 256: - f.finishBlock() - return - // otherwise, reference to older data - case v < 265: - length = v - (257 - 3) - n = 0 - case v < 269: - length = v*2 - (265*2 - 11) - n = 1 - case v < 273: - length = v*4 - (269*4 - 19) - n = 2 - case v < 277: - length = v*8 - (273*8 - 35) - n = 3 - case v < 281: - length = v*16 - (277*16 - 67) - n = 4 - case v < 285: - length = v*32 - (281*32 - 131) - n = 5 - case v < maxNumLit: - length = 258 - n = 0 - default: - f.err = CorruptInputError(f.roffset) - return - } - if n > 0 { - for f.nb < n { - if err = f.moreBits(); err != nil { - f.err = err - return - } - } - length += int(f.b & uint32(1<>= n - f.nb -= n - } - - var dist int - if f.hd == nil { - for f.nb < 5 { - if err = f.moreBits(); err != nil { - f.err = err - return - } - } - dist = int(reverseByte[(f.b&0x1F)<<3]) - f.b >>= 5 - f.nb -= 5 - } else { - if dist, err = f.huffSym(f.hd); err != nil { - f.err = err - return - } - } - - switch { - case dist < 4: - dist++ - case dist < maxNumDist: - nb := uint(dist-2) >> 1 - // have 1 bit in bottom of dist, need nb more. - extra := (dist & 1) << nb - for f.nb < nb { - if err = f.moreBits(); err != nil { - f.err = err - return - } - } - extra |= int(f.b & uint32(1<>= nb - f.nb -= nb - dist = 1<<(nb+1) + 1 + extra - default: - f.err = CorruptInputError(f.roffset) - return - } - - // No check on length; encoding can be prescient. - if dist > f.dict.histSize() { - f.err = CorruptInputError(f.roffset) - return - } - - f.copyLen, f.copyDist = length, dist - goto copyHistory - } - -copyHistory: - // Perform a backwards copy according to RFC section 3.2.3. - { - cnt := f.dict.tryWriteCopy(f.copyDist, f.copyLen) - if cnt == 0 { - cnt = f.dict.writeCopy(f.copyDist, f.copyLen) - } - f.copyLen -= cnt - - if f.dict.availWrite() == 0 || f.copyLen > 0 { - f.toRead = f.dict.readFlush() - f.step = (*decompressor).huffmanBlock // We need to continue this work - f.stepState = stateDict - return - } - goto readLiteral - } -} - -// Copy a single uncompressed data block from input to output. -func (f *decompressor) dataBlock() { - // Uncompressed. - // Discard current half-byte. - f.nb = 0 - f.b = 0 - - // Length then ones-complement of length. - nr, err := io.ReadFull(f.r, f.buf[0:4]) - f.roffset += int64(nr) - if err != nil { - if err == io.EOF { - err = io.ErrUnexpectedEOF - } - f.err = err - return - } - n := int(f.buf[0]) | int(f.buf[1])<<8 - nn := int(f.buf[2]) | int(f.buf[3])<<8 - if uint16(nn) != uint16(^n) { - f.err = CorruptInputError(f.roffset) - return - } - - if n == 0 { - f.toRead = f.dict.readFlush() - f.finishBlock() - return - } - - f.copyLen = n - f.copyData() -} - -// copyData copies f.copyLen bytes from the underlying reader into f.hist. -// It pauses for reads when f.hist is full. -func (f *decompressor) copyData() { - buf := f.dict.writeSlice() - if len(buf) > f.copyLen { - buf = buf[:f.copyLen] - } - - cnt, err := io.ReadFull(f.r, buf) - f.roffset += int64(cnt) - f.copyLen -= cnt - f.dict.writeMark(cnt) - if err != nil { - if err == io.EOF { - err = io.ErrUnexpectedEOF - } - f.err = err - return - } - - if f.dict.availWrite() == 0 || f.copyLen > 0 { - f.toRead = f.dict.readFlush() - f.step = (*decompressor).copyData - return - } - f.finishBlock() -} - -func (f *decompressor) finishBlock() { - if f.final { - if f.dict.availRead() > 0 { - f.toRead = f.dict.readFlush() - } - f.err = io.EOF - } - f.step = (*decompressor).nextBlock -} - -func (f *decompressor) moreBits() error { - c, err := f.r.ReadByte() - if err != nil { - if err == io.EOF { - err = io.ErrUnexpectedEOF - } - return err - } - f.roffset++ - f.b |= uint32(c) << f.nb - f.nb += 8 - return nil -} - -// Read the next Huffman-encoded symbol from f according to h. -func (f *decompressor) huffSym(h *huffmanDecoder) (int, error) { - // Since a huffmanDecoder can be empty or be composed of a degenerate tree - // with single element, huffSym must error on these two edge cases. In both - // cases, the chunks slice will be 0 for the invalid sequence, leading it - // satisfy the n == 0 check below. - n := uint(h.min) - for { - for f.nb < n { - if err := f.moreBits(); err != nil { - return 0, err - } - } - chunk := h.chunks[f.b&(huffmanNumChunks-1)] - n = uint(chunk & huffmanCountMask) - if n > huffmanChunkBits { - chunk = h.links[chunk>>huffmanValueShift][(f.b>>huffmanChunkBits)&h.linkMask] - n = uint(chunk & huffmanCountMask) - } - if n <= f.nb { - if n == 0 { - f.err = CorruptInputError(f.roffset) - return 0, f.err - } - f.b >>= n - f.nb -= n - return int(chunk >> huffmanValueShift), nil - } - } -} - -func makeReader(r io.Reader) Reader { - if rr, ok := r.(Reader); ok { - return rr - } - return bufio.NewReader(r) -} - -func fixedHuffmanDecoderInit() { - fixedOnce.Do(func() { - // These come from the RFC section 3.2.6. - var bits [288]int - for i := 0; i < 144; i++ { - bits[i] = 8 - } - for i := 144; i < 256; i++ { - bits[i] = 9 - } - for i := 256; i < 280; i++ { - bits[i] = 7 - } - for i := 280; i < 288; i++ { - bits[i] = 8 - } - fixedHuffmanDecoder.init(bits[:]) - }) -} - -func (f *decompressor) Reset(r io.Reader, dict []byte) error { - *f = decompressor{ - r: makeReader(r), - bits: f.bits, - codebits: f.codebits, - dict: f.dict, - step: (*decompressor).nextBlock, - } - f.dict.init(maxMatchOffset, dict) - return nil -} - -// NewReader returns a new ReadCloser that can be used -// to read the uncompressed version of r. -// If r does not also implement io.ByteReader, -// the decompressor may read more data than necessary from r. -// It is the caller's responsibility to call Close on the ReadCloser -// when finished reading. -// -// The ReadCloser returned by NewReader also implements Resetter. -func NewReader(r io.Reader) io.ReadCloser { - fixedHuffmanDecoderInit() - - var f decompressor - f.r = makeReader(r) - f.bits = new([maxNumLit + maxNumDist]int) - f.codebits = new([numCodes]int) - f.step = (*decompressor).nextBlock - f.dict.init(maxMatchOffset, nil) - return &f -} - -// NewReaderDict is like NewReader but initializes the reader -// with a preset dictionary. The returned Reader behaves as if -// the uncompressed data stream started with the given dictionary, -// which has already been read. NewReaderDict is typically used -// to read data compressed by NewWriterDict. -// -// The ReadCloser returned by NewReader also implements Resetter. -func NewReaderDict(r io.Reader, dict []byte) io.ReadCloser { - fixedHuffmanDecoderInit() - - var f decompressor - f.r = makeReader(r) - f.bits = new([maxNumLit + maxNumDist]int) - f.codebits = new([numCodes]int) - f.step = (*decompressor).nextBlock - f.dict.init(maxMatchOffset, dict) - return &f -} diff --git a/vendor/github.com/klauspost/compress/flate/reverse_bits.go b/vendor/github.com/klauspost/compress/flate/reverse_bits.go deleted file mode 100644 index c1a02720d..000000000 --- a/vendor/github.com/klauspost/compress/flate/reverse_bits.go +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package flate - -var reverseByte = [256]byte{ - 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, - 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0, - 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, - 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, - 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, - 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4, - 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, - 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc, - 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, - 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, - 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, - 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa, - 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, - 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6, - 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, - 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, - 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1, - 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1, - 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, - 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9, - 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, - 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5, - 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed, - 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd, - 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, - 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3, - 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, - 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb, - 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7, - 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7, - 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, - 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff, -} - -func reverseUint16(v uint16) uint16 { - return uint16(reverseByte[v>>8]) | uint16(reverseByte[v&0xFF])<<8 -} - -func reverseBits(number uint16, bitLength byte) uint16 { - return reverseUint16(number << uint8(16-bitLength)) -} diff --git a/vendor/github.com/klauspost/compress/flate/snappy.go b/vendor/github.com/klauspost/compress/flate/snappy.go deleted file mode 100644 index d853320a7..000000000 --- a/vendor/github.com/klauspost/compress/flate/snappy.go +++ /dev/null @@ -1,900 +0,0 @@ -// Copyright 2011 The Snappy-Go Authors. All rights reserved. -// Modified for deflate by Klaus Post (c) 2015. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package flate - -// emitLiteral writes a literal chunk and returns the number of bytes written. -func emitLiteral(dst *tokens, lit []byte) { - ol := int(dst.n) - for i, v := range lit { - dst.tokens[(i+ol)&maxStoreBlockSize] = token(v) - } - dst.n += uint16(len(lit)) -} - -// emitCopy writes a copy chunk and returns the number of bytes written. -func emitCopy(dst *tokens, offset, length int) { - dst.tokens[dst.n] = matchToken(uint32(length-3), uint32(offset-minOffsetSize)) - dst.n++ -} - -type snappyEnc interface { - Encode(dst *tokens, src []byte) - Reset() -} - -func newSnappy(level int) snappyEnc { - switch level { - case 1: - return &snappyL1{} - case 2: - return &snappyL2{snappyGen: snappyGen{cur: maxStoreBlockSize, prev: make([]byte, 0, maxStoreBlockSize)}} - case 3: - return &snappyL3{snappyGen: snappyGen{cur: maxStoreBlockSize, prev: make([]byte, 0, maxStoreBlockSize)}} - case 4: - return &snappyL4{snappyL3{snappyGen: snappyGen{cur: maxStoreBlockSize, prev: make([]byte, 0, maxStoreBlockSize)}}} - default: - panic("invalid level specified") - } -} - -const ( - tableBits = 14 // Bits used in the table - tableSize = 1 << tableBits // Size of the table - tableMask = tableSize - 1 // Mask for table indices. Redundant, but can eliminate bounds checks. - tableShift = 32 - tableBits // Right-shift to get the tableBits most significant bits of a uint32. - baseMatchOffset = 1 // The smallest match offset - baseMatchLength = 3 // The smallest match length per the RFC section 3.2.5 - maxMatchOffset = 1 << 15 // The largest match offset -) - -func load32(b []byte, i int) uint32 { - b = b[i : i+4 : len(b)] // Help the compiler eliminate bounds checks on the next line. - return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 -} - -func load64(b []byte, i int) uint64 { - b = b[i : i+8 : len(b)] // Help the compiler eliminate bounds checks on the next line. - return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | - uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 -} - -func hash(u uint32) uint32 { - return (u * 0x1e35a7bd) >> tableShift -} - -// snappyL1 encapsulates level 1 compression -type snappyL1 struct{} - -func (e *snappyL1) Reset() {} - -func (e *snappyL1) Encode(dst *tokens, src []byte) { - const ( - inputMargin = 16 - 1 - minNonLiteralBlockSize = 1 + 1 + inputMargin - ) - - // This check isn't in the Snappy implementation, but there, the caller - // instead of the callee handles this case. - if len(src) < minNonLiteralBlockSize { - // We do not fill the token table. - // This will be picked up by caller. - dst.n = uint16(len(src)) - return - } - - // Initialize the hash table. - // - // The table element type is uint16, as s < sLimit and sLimit < len(src) - // and len(src) <= maxStoreBlockSize and maxStoreBlockSize == 65535. - var table [tableSize]uint16 - - // sLimit is when to stop looking for offset/length copies. The inputMargin - // lets us use a fast path for emitLiteral in the main loop, while we are - // looking for copies. - sLimit := len(src) - inputMargin - - // nextEmit is where in src the next emitLiteral should start from. - nextEmit := 0 - - // The encoded form must start with a literal, as there are no previous - // bytes to copy, so we start looking for hash matches at s == 1. - s := 1 - nextHash := hash(load32(src, s)) - - for { - // Copied from the C++ snappy implementation: - // - // Heuristic match skipping: If 32 bytes are scanned with no matches - // found, start looking only at every other byte. If 32 more bytes are - // scanned (or skipped), look at every third byte, etc.. When a match - // is found, immediately go back to looking at every byte. This is a - // small loss (~5% performance, ~0.1% density) for compressible data - // due to more bookkeeping, but for non-compressible data (such as - // JPEG) it's a huge win since the compressor quickly "realizes" the - // data is incompressible and doesn't bother looking for matches - // everywhere. - // - // The "skip" variable keeps track of how many bytes there are since - // the last match; dividing it by 32 (ie. right-shifting by five) gives - // the number of bytes to move ahead for each iteration. - skip := 32 - - nextS := s - candidate := 0 - for { - s = nextS - bytesBetweenHashLookups := skip >> 5 - nextS = s + bytesBetweenHashLookups - skip += bytesBetweenHashLookups - if nextS > sLimit { - goto emitRemainder - } - candidate = int(table[nextHash&tableMask]) - table[nextHash&tableMask] = uint16(s) - nextHash = hash(load32(src, nextS)) - if s-candidate <= maxMatchOffset && load32(src, s) == load32(src, candidate) { - break - } - } - - // A 4-byte match has been found. We'll later see if more than 4 bytes - // match. But, prior to the match, src[nextEmit:s] are unmatched. Emit - // them as literal bytes. - emitLiteral(dst, src[nextEmit:s]) - - // Call emitCopy, and then see if another emitCopy could be our next - // move. Repeat until we find no match for the input immediately after - // what was consumed by the last emitCopy call. - // - // If we exit this loop normally then we need to call emitLiteral next, - // though we don't yet know how big the literal will be. We handle that - // by proceeding to the next iteration of the main loop. We also can - // exit this loop via goto if we get close to exhausting the input. - for { - // Invariant: we have a 4-byte match at s, and no need to emit any - // literal bytes prior to s. - base := s - - // Extend the 4-byte match as long as possible. - // - // This is an inlined version of Snappy's: - // s = extendMatch(src, candidate+4, s+4) - s += 4 - s1 := base + maxMatchLength - if s1 > len(src) { - s1 = len(src) - } - a := src[s:s1] - b := src[candidate+4:] - b = b[:len(a)] - l := len(a) - for i := range a { - if a[i] != b[i] { - l = i - break - } - } - s += l - - // matchToken is flate's equivalent of Snappy's emitCopy. - dst.tokens[dst.n] = matchToken(uint32(s-base-baseMatchLength), uint32(base-candidate-baseMatchOffset)) - dst.n++ - nextEmit = s - if s >= sLimit { - goto emitRemainder - } - - // We could immediately start working at s now, but to improve - // compression we first update the hash table at s-1 and at s. If - // another emitCopy is not our next move, also calculate nextHash - // at s+1. At least on GOARCH=amd64, these three hash calculations - // are faster as one load64 call (with some shifts) instead of - // three load32 calls. - x := load64(src, s-1) - prevHash := hash(uint32(x >> 0)) - table[prevHash&tableMask] = uint16(s - 1) - currHash := hash(uint32(x >> 8)) - candidate = int(table[currHash&tableMask]) - table[currHash&tableMask] = uint16(s) - if s-candidate > maxMatchOffset || uint32(x>>8) != load32(src, candidate) { - nextHash = hash(uint32(x >> 16)) - s++ - break - } - } - } - -emitRemainder: - if nextEmit < len(src) { - emitLiteral(dst, src[nextEmit:]) - } -} - -type tableEntry struct { - val uint32 - offset int32 -} - -func load3232(b []byte, i int32) uint32 { - b = b[i : i+4 : len(b)] // Help the compiler eliminate bounds checks on the next line. - return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 -} - -func load6432(b []byte, i int32) uint64 { - b = b[i : i+8 : len(b)] // Help the compiler eliminate bounds checks on the next line. - return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | - uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 -} - -// snappyGen maintains the table for matches, -// and the previous byte block for level 2. -// This is the generic implementation. -type snappyGen struct { - prev []byte - cur int32 -} - -// snappyGen maintains the table for matches, -// and the previous byte block for level 2. -// This is the generic implementation. -type snappyL2 struct { - snappyGen - table [tableSize]tableEntry -} - -// EncodeL2 uses a similar algorithm to level 1, but is capable -// of matching across blocks giving better compression at a small slowdown. -func (e *snappyL2) Encode(dst *tokens, src []byte) { - const ( - inputMargin = 8 - 1 - minNonLiteralBlockSize = 1 + 1 + inputMargin - ) - - // Protect against e.cur wraparound. - if e.cur > 1<<30 { - for i := range e.table[:] { - e.table[i] = tableEntry{} - } - e.cur = maxStoreBlockSize - } - - // This check isn't in the Snappy implementation, but there, the caller - // instead of the callee handles this case. - if len(src) < minNonLiteralBlockSize { - // We do not fill the token table. - // This will be picked up by caller. - dst.n = uint16(len(src)) - e.cur += maxStoreBlockSize - e.prev = e.prev[:0] - return - } - - // sLimit is when to stop looking for offset/length copies. The inputMargin - // lets us use a fast path for emitLiteral in the main loop, while we are - // looking for copies. - sLimit := int32(len(src) - inputMargin) - - // nextEmit is where in src the next emitLiteral should start from. - nextEmit := int32(0) - s := int32(0) - cv := load3232(src, s) - nextHash := hash(cv) - - for { - // Copied from the C++ snappy implementation: - // - // Heuristic match skipping: If 32 bytes are scanned with no matches - // found, start looking only at every other byte. If 32 more bytes are - // scanned (or skipped), look at every third byte, etc.. When a match - // is found, immediately go back to looking at every byte. This is a - // small loss (~5% performance, ~0.1% density) for compressible data - // due to more bookkeeping, but for non-compressible data (such as - // JPEG) it's a huge win since the compressor quickly "realizes" the - // data is incompressible and doesn't bother looking for matches - // everywhere. - // - // The "skip" variable keeps track of how many bytes there are since - // the last match; dividing it by 32 (ie. right-shifting by five) gives - // the number of bytes to move ahead for each iteration. - skip := int32(32) - - nextS := s - var candidate tableEntry - for { - s = nextS - bytesBetweenHashLookups := skip >> 5 - nextS = s + bytesBetweenHashLookups - skip += bytesBetweenHashLookups - if nextS > sLimit { - goto emitRemainder - } - candidate = e.table[nextHash&tableMask] - now := load3232(src, nextS) - e.table[nextHash&tableMask] = tableEntry{offset: s + e.cur, val: cv} - nextHash = hash(now) - - offset := s - (candidate.offset - e.cur) - if offset > maxMatchOffset || cv != candidate.val { - // Out of range or not matched. - cv = now - continue - } - break - } - - // A 4-byte match has been found. We'll later see if more than 4 bytes - // match. But, prior to the match, src[nextEmit:s] are unmatched. Emit - // them as literal bytes. - emitLiteral(dst, src[nextEmit:s]) - - // Call emitCopy, and then see if another emitCopy could be our next - // move. Repeat until we find no match for the input immediately after - // what was consumed by the last emitCopy call. - // - // If we exit this loop normally then we need to call emitLiteral next, - // though we don't yet know how big the literal will be. We handle that - // by proceeding to the next iteration of the main loop. We also can - // exit this loop via goto if we get close to exhausting the input. - for { - // Invariant: we have a 4-byte match at s, and no need to emit any - // literal bytes prior to s. - - // Extend the 4-byte match as long as possible. - // - s += 4 - t := candidate.offset - e.cur + 4 - l := e.matchlen(s, t, src) - - // matchToken is flate's equivalent of Snappy's emitCopy. (length,offset) - dst.tokens[dst.n] = matchToken(uint32(l+4-baseMatchLength), uint32(s-t-baseMatchOffset)) - dst.n++ - s += l - nextEmit = s - if s >= sLimit { - t += l - // Index first pair after match end. - if int(t+4) < len(src) && t > 0 { - cv := load3232(src, t) - e.table[hash(cv)&tableMask] = tableEntry{offset: t + e.cur, val: cv} - } - goto emitRemainder - } - - // We could immediately start working at s now, but to improve - // compression we first update the hash table at s-1 and at s. If - // another emitCopy is not our next move, also calculate nextHash - // at s+1. At least on GOARCH=amd64, these three hash calculations - // are faster as one load64 call (with some shifts) instead of - // three load32 calls. - x := load6432(src, s-1) - prevHash := hash(uint32(x)) - e.table[prevHash&tableMask] = tableEntry{offset: e.cur + s - 1, val: uint32(x)} - x >>= 8 - currHash := hash(uint32(x)) - candidate = e.table[currHash&tableMask] - e.table[currHash&tableMask] = tableEntry{offset: e.cur + s, val: uint32(x)} - - offset := s - (candidate.offset - e.cur) - if offset > maxMatchOffset || uint32(x) != candidate.val { - cv = uint32(x >> 8) - nextHash = hash(cv) - s++ - break - } - } - } - -emitRemainder: - if int(nextEmit) < len(src) { - emitLiteral(dst, src[nextEmit:]) - } - e.cur += int32(len(src)) - e.prev = e.prev[:len(src)] - copy(e.prev, src) -} - -type tableEntryPrev struct { - Cur tableEntry - Prev tableEntry -} - -// snappyL3 -type snappyL3 struct { - snappyGen - table [tableSize]tableEntryPrev -} - -// Encode uses a similar algorithm to level 2, will check up to two candidates. -func (e *snappyL3) Encode(dst *tokens, src []byte) { - const ( - inputMargin = 8 - 1 - minNonLiteralBlockSize = 1 + 1 + inputMargin - ) - - // Protect against e.cur wraparound. - if e.cur > 1<<30 { - for i := range e.table[:] { - e.table[i] = tableEntryPrev{} - } - e.snappyGen = snappyGen{cur: maxStoreBlockSize, prev: e.prev[:0]} - } - - // This check isn't in the Snappy implementation, but there, the caller - // instead of the callee handles this case. - if len(src) < minNonLiteralBlockSize { - // We do not fill the token table. - // This will be picked up by caller. - dst.n = uint16(len(src)) - e.cur += maxStoreBlockSize - e.prev = e.prev[:0] - return - } - - // sLimit is when to stop looking for offset/length copies. The inputMargin - // lets us use a fast path for emitLiteral in the main loop, while we are - // looking for copies. - sLimit := int32(len(src) - inputMargin) - - // nextEmit is where in src the next emitLiteral should start from. - nextEmit := int32(0) - s := int32(0) - cv := load3232(src, s) - nextHash := hash(cv) - - for { - // Copied from the C++ snappy implementation: - // - // Heuristic match skipping: If 32 bytes are scanned with no matches - // found, start looking only at every other byte. If 32 more bytes are - // scanned (or skipped), look at every third byte, etc.. When a match - // is found, immediately go back to looking at every byte. This is a - // small loss (~5% performance, ~0.1% density) for compressible data - // due to more bookkeeping, but for non-compressible data (such as - // JPEG) it's a huge win since the compressor quickly "realizes" the - // data is incompressible and doesn't bother looking for matches - // everywhere. - // - // The "skip" variable keeps track of how many bytes there are since - // the last match; dividing it by 32 (ie. right-shifting by five) gives - // the number of bytes to move ahead for each iteration. - skip := int32(32) - - nextS := s - var candidate tableEntry - for { - s = nextS - bytesBetweenHashLookups := skip >> 5 - nextS = s + bytesBetweenHashLookups - skip += bytesBetweenHashLookups - if nextS > sLimit { - goto emitRemainder - } - candidates := e.table[nextHash&tableMask] - now := load3232(src, nextS) - e.table[nextHash&tableMask] = tableEntryPrev{Prev: candidates.Cur, Cur: tableEntry{offset: s + e.cur, val: cv}} - nextHash = hash(now) - - // Check both candidates - candidate = candidates.Cur - if cv == candidate.val { - offset := s - (candidate.offset - e.cur) - if offset <= maxMatchOffset { - break - } - } else { - // We only check if value mismatches. - // Offset will always be invalid in other cases. - candidate = candidates.Prev - if cv == candidate.val { - offset := s - (candidate.offset - e.cur) - if offset <= maxMatchOffset { - break - } - } - } - cv = now - } - - // A 4-byte match has been found. We'll later see if more than 4 bytes - // match. But, prior to the match, src[nextEmit:s] are unmatched. Emit - // them as literal bytes. - emitLiteral(dst, src[nextEmit:s]) - - // Call emitCopy, and then see if another emitCopy could be our next - // move. Repeat until we find no match for the input immediately after - // what was consumed by the last emitCopy call. - // - // If we exit this loop normally then we need to call emitLiteral next, - // though we don't yet know how big the literal will be. We handle that - // by proceeding to the next iteration of the main loop. We also can - // exit this loop via goto if we get close to exhausting the input. - for { - // Invariant: we have a 4-byte match at s, and no need to emit any - // literal bytes prior to s. - - // Extend the 4-byte match as long as possible. - // - s += 4 - t := candidate.offset - e.cur + 4 - l := e.matchlen(s, t, src) - - // matchToken is flate's equivalent of Snappy's emitCopy. (length,offset) - dst.tokens[dst.n] = matchToken(uint32(l+4-baseMatchLength), uint32(s-t-baseMatchOffset)) - dst.n++ - s += l - nextEmit = s - if s >= sLimit { - t += l - // Index first pair after match end. - if int(t+4) < len(src) && t > 0 { - cv := load3232(src, t) - nextHash = hash(cv) - e.table[nextHash&tableMask] = tableEntryPrev{ - Prev: e.table[nextHash&tableMask].Cur, - Cur: tableEntry{offset: e.cur + t, val: cv}, - } - } - goto emitRemainder - } - - // We could immediately start working at s now, but to improve - // compression we first update the hash table at s-3 to s. If - // another emitCopy is not our next move, also calculate nextHash - // at s+1. At least on GOARCH=amd64, these three hash calculations - // are faster as one load64 call (with some shifts) instead of - // three load32 calls. - x := load6432(src, s-3) - prevHash := hash(uint32(x)) - e.table[prevHash&tableMask] = tableEntryPrev{ - Prev: e.table[prevHash&tableMask].Cur, - Cur: tableEntry{offset: e.cur + s - 3, val: uint32(x)}, - } - x >>= 8 - prevHash = hash(uint32(x)) - - e.table[prevHash&tableMask] = tableEntryPrev{ - Prev: e.table[prevHash&tableMask].Cur, - Cur: tableEntry{offset: e.cur + s - 2, val: uint32(x)}, - } - x >>= 8 - prevHash = hash(uint32(x)) - - e.table[prevHash&tableMask] = tableEntryPrev{ - Prev: e.table[prevHash&tableMask].Cur, - Cur: tableEntry{offset: e.cur + s - 1, val: uint32(x)}, - } - x >>= 8 - currHash := hash(uint32(x)) - candidates := e.table[currHash&tableMask] - cv = uint32(x) - e.table[currHash&tableMask] = tableEntryPrev{ - Prev: candidates.Cur, - Cur: tableEntry{offset: s + e.cur, val: cv}, - } - - // Check both candidates - candidate = candidates.Cur - if cv == candidate.val { - offset := s - (candidate.offset - e.cur) - if offset <= maxMatchOffset { - continue - } - } else { - // We only check if value mismatches. - // Offset will always be invalid in other cases. - candidate = candidates.Prev - if cv == candidate.val { - offset := s - (candidate.offset - e.cur) - if offset <= maxMatchOffset { - continue - } - } - } - cv = uint32(x >> 8) - nextHash = hash(cv) - s++ - break - } - } - -emitRemainder: - if int(nextEmit) < len(src) { - emitLiteral(dst, src[nextEmit:]) - } - e.cur += int32(len(src)) - e.prev = e.prev[:len(src)] - copy(e.prev, src) -} - -// snappyL4 -type snappyL4 struct { - snappyL3 -} - -// Encode uses a similar algorithm to level 3, -// but will check up to two candidates if first isn't long enough. -func (e *snappyL4) Encode(dst *tokens, src []byte) { - const ( - inputMargin = 8 - 3 - minNonLiteralBlockSize = 1 + 1 + inputMargin - matchLenGood = 12 - ) - - // Protect against e.cur wraparound. - if e.cur > 1<<30 { - for i := range e.table[:] { - e.table[i] = tableEntryPrev{} - } - e.snappyGen = snappyGen{cur: maxStoreBlockSize, prev: e.prev[:0]} - } - - // This check isn't in the Snappy implementation, but there, the caller - // instead of the callee handles this case. - if len(src) < minNonLiteralBlockSize { - // We do not fill the token table. - // This will be picked up by caller. - dst.n = uint16(len(src)) - e.cur += maxStoreBlockSize - e.prev = e.prev[:0] - return - } - - // sLimit is when to stop looking for offset/length copies. The inputMargin - // lets us use a fast path for emitLiteral in the main loop, while we are - // looking for copies. - sLimit := int32(len(src) - inputMargin) - - // nextEmit is where in src the next emitLiteral should start from. - nextEmit := int32(0) - s := int32(0) - cv := load3232(src, s) - nextHash := hash(cv) - - for { - // Copied from the C++ snappy implementation: - // - // Heuristic match skipping: If 32 bytes are scanned with no matches - // found, start looking only at every other byte. If 32 more bytes are - // scanned (or skipped), look at every third byte, etc.. When a match - // is found, immediately go back to looking at every byte. This is a - // small loss (~5% performance, ~0.1% density) for compressible data - // due to more bookkeeping, but for non-compressible data (such as - // JPEG) it's a huge win since the compressor quickly "realizes" the - // data is incompressible and doesn't bother looking for matches - // everywhere. - // - // The "skip" variable keeps track of how many bytes there are since - // the last match; dividing it by 32 (ie. right-shifting by five) gives - // the number of bytes to move ahead for each iteration. - skip := int32(32) - - nextS := s - var candidate tableEntry - var candidateAlt tableEntry - for { - s = nextS - bytesBetweenHashLookups := skip >> 5 - nextS = s + bytesBetweenHashLookups - skip += bytesBetweenHashLookups - if nextS > sLimit { - goto emitRemainder - } - candidates := e.table[nextHash&tableMask] - now := load3232(src, nextS) - e.table[nextHash&tableMask] = tableEntryPrev{Prev: candidates.Cur, Cur: tableEntry{offset: s + e.cur, val: cv}} - nextHash = hash(now) - - // Check both candidates - candidate = candidates.Cur - if cv == candidate.val { - offset := s - (candidate.offset - e.cur) - if offset < maxMatchOffset { - offset = s - (candidates.Prev.offset - e.cur) - if cv == candidates.Prev.val && offset < maxMatchOffset { - candidateAlt = candidates.Prev - } - break - } - } else { - // We only check if value mismatches. - // Offset will always be invalid in other cases. - candidate = candidates.Prev - if cv == candidate.val { - offset := s - (candidate.offset - e.cur) - if offset < maxMatchOffset { - break - } - } - } - cv = now - } - - // A 4-byte match has been found. We'll later see if more than 4 bytes - // match. But, prior to the match, src[nextEmit:s] are unmatched. Emit - // them as literal bytes. - emitLiteral(dst, src[nextEmit:s]) - - // Call emitCopy, and then see if another emitCopy could be our next - // move. Repeat until we find no match for the input immediately after - // what was consumed by the last emitCopy call. - // - // If we exit this loop normally then we need to call emitLiteral next, - // though we don't yet know how big the literal will be. We handle that - // by proceeding to the next iteration of the main loop. We also can - // exit this loop via goto if we get close to exhausting the input. - for { - // Invariant: we have a 4-byte match at s, and no need to emit any - // literal bytes prior to s. - - // Extend the 4-byte match as long as possible. - // - s += 4 - t := candidate.offset - e.cur + 4 - l := e.matchlen(s, t, src) - // Try alternative candidate if match length < matchLenGood. - if l < matchLenGood-4 && candidateAlt.offset != 0 { - t2 := candidateAlt.offset - e.cur + 4 - l2 := e.matchlen(s, t2, src) - if l2 > l { - l = l2 - t = t2 - } - } - // matchToken is flate's equivalent of Snappy's emitCopy. (length,offset) - dst.tokens[dst.n] = matchToken(uint32(l+4-baseMatchLength), uint32(s-t-baseMatchOffset)) - dst.n++ - s += l - nextEmit = s - if s >= sLimit { - t += l - // Index first pair after match end. - if int(t+4) < len(src) && t > 0 { - cv := load3232(src, t) - nextHash = hash(cv) - e.table[nextHash&tableMask] = tableEntryPrev{ - Prev: e.table[nextHash&tableMask].Cur, - Cur: tableEntry{offset: e.cur + t, val: cv}, - } - } - goto emitRemainder - } - - // We could immediately start working at s now, but to improve - // compression we first update the hash table at s-3 to s. If - // another emitCopy is not our next move, also calculate nextHash - // at s+1. At least on GOARCH=amd64, these three hash calculations - // are faster as one load64 call (with some shifts) instead of - // three load32 calls. - x := load6432(src, s-3) - prevHash := hash(uint32(x)) - e.table[prevHash&tableMask] = tableEntryPrev{ - Prev: e.table[prevHash&tableMask].Cur, - Cur: tableEntry{offset: e.cur + s - 3, val: uint32(x)}, - } - x >>= 8 - prevHash = hash(uint32(x)) - - e.table[prevHash&tableMask] = tableEntryPrev{ - Prev: e.table[prevHash&tableMask].Cur, - Cur: tableEntry{offset: e.cur + s - 2, val: uint32(x)}, - } - x >>= 8 - prevHash = hash(uint32(x)) - - e.table[prevHash&tableMask] = tableEntryPrev{ - Prev: e.table[prevHash&tableMask].Cur, - Cur: tableEntry{offset: e.cur + s - 1, val: uint32(x)}, - } - x >>= 8 - currHash := hash(uint32(x)) - candidates := e.table[currHash&tableMask] - cv = uint32(x) - e.table[currHash&tableMask] = tableEntryPrev{ - Prev: candidates.Cur, - Cur: tableEntry{offset: s + e.cur, val: cv}, - } - - // Check both candidates - candidate = candidates.Cur - candidateAlt = tableEntry{} - if cv == candidate.val { - offset := s - (candidate.offset - e.cur) - if offset <= maxMatchOffset { - offset = s - (candidates.Prev.offset - e.cur) - if cv == candidates.Prev.val && offset <= maxMatchOffset { - candidateAlt = candidates.Prev - } - continue - } - } else { - // We only check if value mismatches. - // Offset will always be invalid in other cases. - candidate = candidates.Prev - if cv == candidate.val { - offset := s - (candidate.offset - e.cur) - if offset <= maxMatchOffset { - continue - } - } - } - cv = uint32(x >> 8) - nextHash = hash(cv) - s++ - break - } - } - -emitRemainder: - if int(nextEmit) < len(src) { - emitLiteral(dst, src[nextEmit:]) - } - e.cur += int32(len(src)) - e.prev = e.prev[:len(src)] - copy(e.prev, src) -} - -func (e *snappyGen) matchlen(s, t int32, src []byte) int32 { - s1 := int(s) + maxMatchLength - 4 - if s1 > len(src) { - s1 = len(src) - } - - // If we are inside the current block - if t >= 0 { - b := src[t:] - a := src[s:s1] - b = b[:len(a)] - // Extend the match to be as long as possible. - for i := range a { - if a[i] != b[i] { - return int32(i) - } - } - return int32(len(a)) - } - - // We found a match in the previous block. - tp := int32(len(e.prev)) + t - if tp < 0 { - return 0 - } - - // Extend the match to be as long as possible. - a := src[s:s1] - b := e.prev[tp:] - if len(b) > len(a) { - b = b[:len(a)] - } - a = a[:len(b)] - for i := range b { - if a[i] != b[i] { - return int32(i) - } - } - - // If we reached our limit, we matched everything we are - // allowed to in the previous block and we return. - n := int32(len(b)) - if int(s+n) == s1 { - return n - } - - // Continue looking for more matches in the current block. - a = src[s+n : s1] - b = src[:len(a)] - for i := range a { - if a[i] != b[i] { - return int32(i) + n - } - } - return int32(len(a)) + n -} - -// Reset the encoding table. -func (e *snappyGen) Reset() { - e.prev = e.prev[:0] - e.cur += maxMatchOffset -} diff --git a/vendor/github.com/klauspost/compress/flate/token.go b/vendor/github.com/klauspost/compress/flate/token.go deleted file mode 100644 index 4f275ea61..000000000 --- a/vendor/github.com/klauspost/compress/flate/token.go +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package flate - -import "fmt" - -const ( - // 2 bits: type 0 = literal 1=EOF 2=Match 3=Unused - // 8 bits: xlength = length - MIN_MATCH_LENGTH - // 22 bits xoffset = offset - MIN_OFFSET_SIZE, or literal - lengthShift = 22 - offsetMask = 1< pair into a match token. -func matchToken(xlength uint32, xoffset uint32) token { - return token(matchType + xlength< maxMatchLength || xoffset > maxMatchOffset { - panic(fmt.Sprintf("Invalid match: len: %d, offset: %d\n", xlength, xoffset)) - return token(matchType) - } - return token(matchType + xlength<> lengthShift) } - -func lengthCode(len uint32) uint32 { return lengthCodes[len] } - -// Returns the offset code corresponding to a specific offset -func offsetCode(off uint32) uint32 { - if off < uint32(len(offsetCodes)) { - return offsetCodes[off] - } else if off>>7 < uint32(len(offsetCodes)) { - return offsetCodes[off>>7] + 14 - } else { - return offsetCodes[off>>14] + 28 - } -} diff --git a/vendor/github.com/klauspost/compress/gzip/gunzip.go b/vendor/github.com/klauspost/compress/gzip/gunzip.go deleted file mode 100644 index e73fab3f0..000000000 --- a/vendor/github.com/klauspost/compress/gzip/gunzip.go +++ /dev/null @@ -1,344 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package gzip implements reading and writing of gzip format compressed files, -// as specified in RFC 1952. -package gzip - -import ( - "bufio" - "encoding/binary" - "errors" - "io" - "time" - - "github.com/klauspost/compress/flate" - "github.com/klauspost/crc32" -) - -const ( - gzipID1 = 0x1f - gzipID2 = 0x8b - gzipDeflate = 8 - flagText = 1 << 0 - flagHdrCrc = 1 << 1 - flagExtra = 1 << 2 - flagName = 1 << 3 - flagComment = 1 << 4 -) - -var ( - // ErrChecksum is returned when reading GZIP data that has an invalid checksum. - ErrChecksum = errors.New("gzip: invalid checksum") - // ErrHeader is returned when reading GZIP data that has an invalid header. - ErrHeader = errors.New("gzip: invalid header") -) - -var le = binary.LittleEndian - -// noEOF converts io.EOF to io.ErrUnexpectedEOF. -func noEOF(err error) error { - if err == io.EOF { - return io.ErrUnexpectedEOF - } - return err -} - -// The gzip file stores a header giving metadata about the compressed file. -// That header is exposed as the fields of the Writer and Reader structs. -// -// Strings must be UTF-8 encoded and may only contain Unicode code points -// U+0001 through U+00FF, due to limitations of the GZIP file format. -type Header struct { - Comment string // comment - Extra []byte // "extra data" - ModTime time.Time // modification time - Name string // file name - OS byte // operating system type -} - -// A Reader is an io.Reader that can be read to retrieve -// uncompressed data from a gzip-format compressed file. -// -// In general, a gzip file can be a concatenation of gzip files, -// each with its own header. Reads from the Reader -// return the concatenation of the uncompressed data of each. -// Only the first header is recorded in the Reader fields. -// -// Gzip files store a length and checksum of the uncompressed data. -// The Reader will return a ErrChecksum when Read -// reaches the end of the uncompressed data if it does not -// have the expected length or checksum. Clients should treat data -// returned by Read as tentative until they receive the io.EOF -// marking the end of the data. -type Reader struct { - Header // valid after NewReader or Reader.Reset - r flate.Reader - decompressor io.ReadCloser - digest uint32 // CRC-32, IEEE polynomial (section 8) - size uint32 // Uncompressed size (section 2.3.1) - buf [512]byte - err error - multistream bool -} - -// NewReader creates a new Reader reading the given reader. -// If r does not also implement io.ByteReader, -// the decompressor may read more data than necessary from r. -// -// It is the caller's responsibility to call Close on the Reader when done. -// -// The Reader.Header fields will be valid in the Reader returned. -func NewReader(r io.Reader) (*Reader, error) { - z := new(Reader) - if err := z.Reset(r); err != nil { - return nil, err - } - return z, nil -} - -// Reset discards the Reader z's state and makes it equivalent to the -// result of its original state from NewReader, but reading from r instead. -// This permits reusing a Reader rather than allocating a new one. -func (z *Reader) Reset(r io.Reader) error { - *z = Reader{ - decompressor: z.decompressor, - multistream: true, - } - if rr, ok := r.(flate.Reader); ok { - z.r = rr - } else { - z.r = bufio.NewReader(r) - } - z.Header, z.err = z.readHeader() - return z.err -} - -// Multistream controls whether the reader supports multistream files. -// -// If enabled (the default), the Reader expects the input to be a sequence -// of individually gzipped data streams, each with its own header and -// trailer, ending at EOF. The effect is that the concatenation of a sequence -// of gzipped files is treated as equivalent to the gzip of the concatenation -// of the sequence. This is standard behavior for gzip readers. -// -// Calling Multistream(false) disables this behavior; disabling the behavior -// can be useful when reading file formats that distinguish individual gzip -// data streams or mix gzip data streams with other data streams. -// In this mode, when the Reader reaches the end of the data stream, -// Read returns io.EOF. If the underlying reader implements io.ByteReader, -// it will be left positioned just after the gzip stream. -// To start the next stream, call z.Reset(r) followed by z.Multistream(false). -// If there is no next stream, z.Reset(r) will return io.EOF. -func (z *Reader) Multistream(ok bool) { - z.multistream = ok -} - -// readString reads a NUL-terminated string from z.r. -// It treats the bytes read as being encoded as ISO 8859-1 (Latin-1) and -// will output a string encoded using UTF-8. -// This method always updates z.digest with the data read. -func (z *Reader) readString() (string, error) { - var err error - needConv := false - for i := 0; ; i++ { - if i >= len(z.buf) { - return "", ErrHeader - } - z.buf[i], err = z.r.ReadByte() - if err != nil { - return "", err - } - if z.buf[i] > 0x7f { - needConv = true - } - if z.buf[i] == 0 { - // Digest covers the NUL terminator. - z.digest = crc32.Update(z.digest, crc32.IEEETable, z.buf[:i+1]) - - // Strings are ISO 8859-1, Latin-1 (RFC 1952, section 2.3.1). - if needConv { - s := make([]rune, 0, i) - for _, v := range z.buf[:i] { - s = append(s, rune(v)) - } - return string(s), nil - } - return string(z.buf[:i]), nil - } - } -} - -// readHeader reads the GZIP header according to section 2.3.1. -// This method does not set z.err. -func (z *Reader) readHeader() (hdr Header, err error) { - if _, err = io.ReadFull(z.r, z.buf[:10]); err != nil { - // RFC 1952, section 2.2, says the following: - // A gzip file consists of a series of "members" (compressed data sets). - // - // Other than this, the specification does not clarify whether a - // "series" is defined as "one or more" or "zero or more". To err on the - // side of caution, Go interprets this to mean "zero or more". - // Thus, it is okay to return io.EOF here. - return hdr, err - } - if z.buf[0] != gzipID1 || z.buf[1] != gzipID2 || z.buf[2] != gzipDeflate { - return hdr, ErrHeader - } - flg := z.buf[3] - hdr.ModTime = time.Unix(int64(le.Uint32(z.buf[4:8])), 0) - // z.buf[8] is XFL and is currently ignored. - hdr.OS = z.buf[9] - z.digest = crc32.ChecksumIEEE(z.buf[:10]) - - if flg&flagExtra != 0 { - if _, err = io.ReadFull(z.r, z.buf[:2]); err != nil { - return hdr, noEOF(err) - } - z.digest = crc32.Update(z.digest, crc32.IEEETable, z.buf[:2]) - data := make([]byte, le.Uint16(z.buf[:2])) - if _, err = io.ReadFull(z.r, data); err != nil { - return hdr, noEOF(err) - } - z.digest = crc32.Update(z.digest, crc32.IEEETable, data) - hdr.Extra = data - } - - var s string - if flg&flagName != 0 { - if s, err = z.readString(); err != nil { - return hdr, err - } - hdr.Name = s - } - - if flg&flagComment != 0 { - if s, err = z.readString(); err != nil { - return hdr, err - } - hdr.Comment = s - } - - if flg&flagHdrCrc != 0 { - if _, err = io.ReadFull(z.r, z.buf[:2]); err != nil { - return hdr, noEOF(err) - } - digest := le.Uint16(z.buf[:2]) - if digest != uint16(z.digest) { - return hdr, ErrHeader - } - } - - z.digest = 0 - if z.decompressor == nil { - z.decompressor = flate.NewReader(z.r) - } else { - z.decompressor.(flate.Resetter).Reset(z.r, nil) - } - return hdr, nil -} - -// Read implements io.Reader, reading uncompressed bytes from its underlying Reader. -func (z *Reader) Read(p []byte) (n int, err error) { - if z.err != nil { - return 0, z.err - } - - n, z.err = z.decompressor.Read(p) - z.digest = crc32.Update(z.digest, crc32.IEEETable, p[:n]) - z.size += uint32(n) - if z.err != io.EOF { - // In the normal case we return here. - return n, z.err - } - - // Finished file; check checksum and size. - if _, err := io.ReadFull(z.r, z.buf[:8]); err != nil { - z.err = noEOF(err) - return n, z.err - } - digest := le.Uint32(z.buf[:4]) - size := le.Uint32(z.buf[4:8]) - if digest != z.digest || size != z.size { - z.err = ErrChecksum - return n, z.err - } - z.digest, z.size = 0, 0 - - // File is ok; check if there is another. - if !z.multistream { - return n, io.EOF - } - z.err = nil // Remove io.EOF - - if _, z.err = z.readHeader(); z.err != nil { - return n, z.err - } - - // Read from next file, if necessary. - if n > 0 { - return n, nil - } - return z.Read(p) -} - -// Support the io.WriteTo interface for io.Copy and friends. -func (z *Reader) WriteTo(w io.Writer) (int64, error) { - total := int64(0) - crcWriter := crc32.NewIEEE() - for { - if z.err != nil { - if z.err == io.EOF { - return total, nil - } - return total, z.err - } - - // We write both to output and digest. - mw := io.MultiWriter(w, crcWriter) - n, err := z.decompressor.(io.WriterTo).WriteTo(mw) - total += n - z.size += uint32(n) - if err != nil { - z.err = err - return total, z.err - } - - // Finished file; check checksum + size. - if _, err := io.ReadFull(z.r, z.buf[0:8]); err != nil { - if err == io.EOF { - err = io.ErrUnexpectedEOF - } - z.err = err - return total, err - } - z.digest = crcWriter.Sum32() - digest := le.Uint32(z.buf[:4]) - size := le.Uint32(z.buf[4:8]) - if digest != z.digest || size != z.size { - z.err = ErrChecksum - return total, z.err - } - z.digest, z.size = 0, 0 - - // File is ok; check if there is another. - if !z.multistream { - return total, nil - } - crcWriter.Reset() - z.err = nil // Remove io.EOF - - if _, z.err = z.readHeader(); z.err != nil { - if z.err == io.EOF { - return total, nil - } - return total, z.err - } - } -} - -// Close closes the Reader. It does not close the underlying io.Reader. -// In order for the GZIP checksum to be verified, the reader must be -// fully consumed until the io.EOF. -func (z *Reader) Close() error { return z.decompressor.Close() } diff --git a/vendor/github.com/klauspost/compress/gzip/gzip.go b/vendor/github.com/klauspost/compress/gzip/gzip.go deleted file mode 100644 index a0f3ed0fc..000000000 --- a/vendor/github.com/klauspost/compress/gzip/gzip.go +++ /dev/null @@ -1,251 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package gzip - -import ( - "errors" - "fmt" - "io" - - "github.com/klauspost/compress/flate" - "github.com/klauspost/crc32" -) - -// These constants are copied from the flate package, so that code that imports -// "compress/gzip" does not also have to import "compress/flate". -const ( - NoCompression = flate.NoCompression - BestSpeed = flate.BestSpeed - BestCompression = flate.BestCompression - DefaultCompression = flate.DefaultCompression - ConstantCompression = flate.ConstantCompression - HuffmanOnly = flate.HuffmanOnly -) - -// A Writer is an io.WriteCloser. -// Writes to a Writer are compressed and written to w. -type Writer struct { - Header // written at first call to Write, Flush, or Close - w io.Writer - level int - wroteHeader bool - compressor *flate.Writer - digest uint32 // CRC-32, IEEE polynomial (section 8) - size uint32 // Uncompressed size (section 2.3.1) - closed bool - buf [10]byte - err error -} - -// NewWriter returns a new Writer. -// Writes to the returned writer are compressed and written to w. -// -// It is the caller's responsibility to call Close on the WriteCloser when done. -// Writes may be buffered and not flushed until Close. -// -// Callers that wish to set the fields in Writer.Header must do so before -// the first call to Write, Flush, or Close. -func NewWriter(w io.Writer) *Writer { - z, _ := NewWriterLevel(w, DefaultCompression) - return z -} - -// NewWriterLevel is like NewWriter but specifies the compression level instead -// of assuming DefaultCompression. -// -// The compression level can be DefaultCompression, NoCompression, or any -// integer value between BestSpeed and BestCompression inclusive. The error -// returned will be nil if the level is valid. -func NewWriterLevel(w io.Writer, level int) (*Writer, error) { - if level < HuffmanOnly || level > BestCompression { - return nil, fmt.Errorf("gzip: invalid compression level: %d", level) - } - z := new(Writer) - z.init(w, level) - return z, nil -} - -func (z *Writer) init(w io.Writer, level int) { - compressor := z.compressor - if compressor != nil { - compressor.Reset(w) - } - *z = Writer{ - Header: Header{ - OS: 255, // unknown - }, - w: w, - level: level, - compressor: compressor, - } -} - -// Reset discards the Writer z's state and makes it equivalent to the -// result of its original state from NewWriter or NewWriterLevel, but -// writing to w instead. This permits reusing a Writer rather than -// allocating a new one. -func (z *Writer) Reset(w io.Writer) { - z.init(w, z.level) -} - -// writeBytes writes a length-prefixed byte slice to z.w. -func (z *Writer) writeBytes(b []byte) error { - if len(b) > 0xffff { - return errors.New("gzip.Write: Extra data is too large") - } - le.PutUint16(z.buf[:2], uint16(len(b))) - _, err := z.w.Write(z.buf[:2]) - if err != nil { - return err - } - _, err = z.w.Write(b) - return err -} - -// writeString writes a UTF-8 string s in GZIP's format to z.w. -// GZIP (RFC 1952) specifies that strings are NUL-terminated ISO 8859-1 (Latin-1). -func (z *Writer) writeString(s string) (err error) { - // GZIP stores Latin-1 strings; error if non-Latin-1; convert if non-ASCII. - needconv := false - for _, v := range s { - if v == 0 || v > 0xff { - return errors.New("gzip.Write: non-Latin-1 header string") - } - if v > 0x7f { - needconv = true - } - } - if needconv { - b := make([]byte, 0, len(s)) - for _, v := range s { - b = append(b, byte(v)) - } - _, err = z.w.Write(b) - } else { - _, err = io.WriteString(z.w, s) - } - if err != nil { - return err - } - // GZIP strings are NUL-terminated. - z.buf[0] = 0 - _, err = z.w.Write(z.buf[:1]) - return err -} - -// Write writes a compressed form of p to the underlying io.Writer. The -// compressed bytes are not necessarily flushed until the Writer is closed. -func (z *Writer) Write(p []byte) (int, error) { - if z.err != nil { - return 0, z.err - } - var n int - // Write the GZIP header lazily. - if !z.wroteHeader { - z.wroteHeader = true - z.buf[0] = gzipID1 - z.buf[1] = gzipID2 - z.buf[2] = gzipDeflate - z.buf[3] = 0 - if z.Extra != nil { - z.buf[3] |= 0x04 - } - if z.Name != "" { - z.buf[3] |= 0x08 - } - if z.Comment != "" { - z.buf[3] |= 0x10 - } - le.PutUint32(z.buf[4:8], uint32(z.ModTime.Unix())) - if z.level == BestCompression { - z.buf[8] = 2 - } else if z.level == BestSpeed { - z.buf[8] = 4 - } else { - z.buf[8] = 0 - } - z.buf[9] = z.OS - n, z.err = z.w.Write(z.buf[:10]) - if z.err != nil { - return n, z.err - } - if z.Extra != nil { - z.err = z.writeBytes(z.Extra) - if z.err != nil { - return n, z.err - } - } - if z.Name != "" { - z.err = z.writeString(z.Name) - if z.err != nil { - return n, z.err - } - } - if z.Comment != "" { - z.err = z.writeString(z.Comment) - if z.err != nil { - return n, z.err - } - } - if z.compressor == nil { - z.compressor, _ = flate.NewWriter(z.w, z.level) - } - } - z.size += uint32(len(p)) - z.digest = crc32.Update(z.digest, crc32.IEEETable, p) - n, z.err = z.compressor.Write(p) - return n, z.err -} - -// Flush flushes any pending compressed data to the underlying writer. -// -// It is useful mainly in compressed network protocols, to ensure that -// a remote reader has enough data to reconstruct a packet. Flush does -// not return until the data has been written. If the underlying -// writer returns an error, Flush returns that error. -// -// In the terminology of the zlib library, Flush is equivalent to Z_SYNC_FLUSH. -func (z *Writer) Flush() error { - if z.err != nil { - return z.err - } - if z.closed { - return nil - } - if !z.wroteHeader { - z.Write(nil) - if z.err != nil { - return z.err - } - } - z.err = z.compressor.Flush() - return z.err -} - -// Close closes the Writer, flushing any unwritten data to the underlying -// io.Writer, but does not close the underlying io.Writer. -func (z *Writer) Close() error { - if z.err != nil { - return z.err - } - if z.closed { - return nil - } - z.closed = true - if !z.wroteHeader { - z.Write(nil) - if z.err != nil { - return z.err - } - } - z.err = z.compressor.Close() - if z.err != nil { - return z.err - } - le.PutUint32(z.buf[:4], z.digest) - le.PutUint32(z.buf[4:8], z.size) - _, z.err = z.w.Write(z.buf[:8]) - return z.err -} diff --git a/vendor/github.com/klauspost/cpuid/LICENSE b/vendor/github.com/klauspost/cpuid/LICENSE deleted file mode 100644 index 5cec7ee94..000000000 --- a/vendor/github.com/klauspost/cpuid/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015 Klaus Post - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - diff --git a/vendor/github.com/klauspost/cpuid/README.md b/vendor/github.com/klauspost/cpuid/README.md deleted file mode 100644 index b2b6bee87..000000000 --- a/vendor/github.com/klauspost/cpuid/README.md +++ /dev/null @@ -1,145 +0,0 @@ -# cpuid -Package cpuid provides information about the CPU running the current program. - -CPU features are detected on startup, and kept for fast access through the life of the application. -Currently x86 / x64 (AMD64) is supported, and no external C (cgo) code is used, which should make the library very easy to use. - -You can access the CPU information by accessing the shared CPU variable of the cpuid library. - -Package home: https://github.com/klauspost/cpuid - -[![GoDoc][1]][2] [![Build Status][3]][4] - -[1]: https://godoc.org/github.com/klauspost/cpuid?status.svg -[2]: https://godoc.org/github.com/klauspost/cpuid -[3]: https://travis-ci.org/klauspost/cpuid.svg -[4]: https://travis-ci.org/klauspost/cpuid - -# features -## CPU Instructions -* **CMOV** (i686 CMOV) -* **NX** (NX (No-Execute) bit) -* **AMD3DNOW** (AMD 3DNOW) -* **AMD3DNOWEXT** (AMD 3DNowExt) -* **MMX** (standard MMX) -* **MMXEXT** (SSE integer functions or AMD MMX ext) -* **SSE** (SSE functions) -* **SSE2** (P4 SSE functions) -* **SSE3** (Prescott SSE3 functions) -* **SSSE3** (Conroe SSSE3 functions) -* **SSE4** (Penryn SSE4.1 functions) -* **SSE4A** (AMD Barcelona microarchitecture SSE4a instructions) -* **SSE42** (Nehalem SSE4.2 functions) -* **AVX** (AVX functions) -* **AVX2** (AVX2 functions) -* **FMA3** (Intel FMA 3) -* **FMA4** (Bulldozer FMA4 functions) -* **XOP** (Bulldozer XOP functions) -* **F16C** (Half-precision floating-point conversion) -* **BMI1** (Bit Manipulation Instruction Set 1) -* **BMI2** (Bit Manipulation Instruction Set 2) -* **TBM** (AMD Trailing Bit Manipulation) -* **LZCNT** (LZCNT instruction) -* **POPCNT** (POPCNT instruction) -* **AESNI** (Advanced Encryption Standard New Instructions) -* **CLMUL** (Carry-less Multiplication) -* **HTT** (Hyperthreading (enabled)) -* **HLE** (Hardware Lock Elision) -* **RTM** (Restricted Transactional Memory) -* **RDRAND** (RDRAND instruction is available) -* **RDSEED** (RDSEED instruction is available) -* **ADX** (Intel ADX (Multi-Precision Add-Carry Instruction Extensions)) -* **SHA** (Intel SHA Extensions) -* **AVX512F** (AVX-512 Foundation) -* **AVX512DQ** (AVX-512 Doubleword and Quadword Instructions) -* **AVX512IFMA** (AVX-512 Integer Fused Multiply-Add Instructions) -* **AVX512PF** (AVX-512 Prefetch Instructions) -* **AVX512ER** (AVX-512 Exponential and Reciprocal Instructions) -* **AVX512CD** (AVX-512 Conflict Detection Instructions) -* **AVX512BW** (AVX-512 Byte and Word Instructions) -* **AVX512VL** (AVX-512 Vector Length Extensions) -* **AVX512VBMI** (AVX-512 Vector Bit Manipulation Instructions) -* **MPX** (Intel MPX (Memory Protection Extensions)) -* **ERMS** (Enhanced REP MOVSB/STOSB) -* **RDTSCP** (RDTSCP Instruction) -* **CX16** (CMPXCHG16B Instruction) -* **SGX** (Software Guard Extensions, with activation details) - -## Performance -* **RDTSCP()** Returns current cycle count. Can be used for benchmarking. -* **SSE2SLOW** (SSE2 is supported, but usually not faster) -* **SSE3SLOW** (SSE3 is supported, but usually not faster) -* **ATOM** (Atom processor, some SSSE3 instructions are slower) -* **Cache line** (Probable size of a cache line). -* **L1, L2, L3 Cache size** on newer Intel/AMD CPUs. - -## Cpu Vendor/VM -* **Intel** -* **AMD** -* **VIA** -* **Transmeta** -* **NSC** -* **KVM** (Kernel-based Virtual Machine) -* **MSVM** (Microsoft Hyper-V or Windows Virtual PC) -* **VMware** -* **XenHVM** - -# installing - -```go get github.com/klauspost/cpuid``` - -# example - -```Go -package main - -import ( - "fmt" - "github.com/klauspost/cpuid" -) - -func main() { - // Print basic CPU information: - fmt.Println("Name:", cpuid.CPU.BrandName) - fmt.Println("PhysicalCores:", cpuid.CPU.PhysicalCores) - fmt.Println("ThreadsPerCore:", cpuid.CPU.ThreadsPerCore) - fmt.Println("LogicalCores:", cpuid.CPU.LogicalCores) - fmt.Println("Family", cpuid.CPU.Family, "Model:", cpuid.CPU.Model) - fmt.Println("Features:", cpuid.CPU.Features) - fmt.Println("Cacheline bytes:", cpuid.CPU.CacheLine) - fmt.Println("L1 Data Cache:", cpuid.CPU.Cache.L1D, "bytes") - fmt.Println("L1 Instruction Cache:", cpuid.CPU.Cache.L1D, "bytes") - fmt.Println("L2 Cache:", cpuid.CPU.Cache.L2, "bytes") - fmt.Println("L3 Cache:", cpuid.CPU.Cache.L3, "bytes") - - // Test if we have a specific feature: - if cpuid.CPU.SSE() { - fmt.Println("We have Streaming SIMD Extensions") - } -} -``` - -Sample output: -``` ->go run main.go -Name: Intel(R) Core(TM) i5-2540M CPU @ 2.60GHz -PhysicalCores: 2 -ThreadsPerCore: 2 -LogicalCores: 4 -Family 6 Model: 42 -Features: CMOV,MMX,MMXEXT,SSE,SSE2,SSE3,SSSE3,SSE4.1,SSE4.2,AVX,AESNI,CLMUL -Cacheline bytes: 64 -We have Streaming SIMD Extensions -``` - -# private package - -In the "private" folder you can find an autogenerated version of the library you can include in your own packages. - -For this purpose all exports are removed, and functions and constants are lowercased. - -This is not a recommended way of using the library, but provided for convenience, if it is difficult for you to use external packages. - -# license - -This code is published under an MIT license. See LICENSE file for more information. diff --git a/vendor/github.com/klauspost/cpuid/cpuid.go b/vendor/github.com/klauspost/cpuid/cpuid.go deleted file mode 100644 index 9230ca562..000000000 --- a/vendor/github.com/klauspost/cpuid/cpuid.go +++ /dev/null @@ -1,1022 +0,0 @@ -// Copyright (c) 2015 Klaus Post, released under MIT License. See LICENSE file. - -// Package cpuid provides information about the CPU running the current program. -// -// CPU features are detected on startup, and kept for fast access through the life of the application. -// Currently x86 / x64 (AMD64) is supported. -// -// You can access the CPU information by accessing the shared CPU variable of the cpuid library. -// -// Package home: https://github.com/klauspost/cpuid -package cpuid - -import "strings" - -// Vendor is a representation of a CPU vendor. -type Vendor int - -const ( - Other Vendor = iota - Intel - AMD - VIA - Transmeta - NSC - KVM // Kernel-based Virtual Machine - MSVM // Microsoft Hyper-V or Windows Virtual PC - VMware - XenHVM -) - -const ( - CMOV = 1 << iota // i686 CMOV - NX // NX (No-Execute) bit - AMD3DNOW // AMD 3DNOW - AMD3DNOWEXT // AMD 3DNowExt - MMX // standard MMX - MMXEXT // SSE integer functions or AMD MMX ext - SSE // SSE functions - SSE2 // P4 SSE functions - SSE3 // Prescott SSE3 functions - SSSE3 // Conroe SSSE3 functions - SSE4 // Penryn SSE4.1 functions - SSE4A // AMD Barcelona microarchitecture SSE4a instructions - SSE42 // Nehalem SSE4.2 functions - AVX // AVX functions - AVX2 // AVX2 functions - FMA3 // Intel FMA 3 - FMA4 // Bulldozer FMA4 functions - XOP // Bulldozer XOP functions - F16C // Half-precision floating-point conversion - BMI1 // Bit Manipulation Instruction Set 1 - BMI2 // Bit Manipulation Instruction Set 2 - TBM // AMD Trailing Bit Manipulation - LZCNT // LZCNT instruction - POPCNT // POPCNT instruction - AESNI // Advanced Encryption Standard New Instructions - CLMUL // Carry-less Multiplication - HTT // Hyperthreading (enabled) - HLE // Hardware Lock Elision - RTM // Restricted Transactional Memory - RDRAND // RDRAND instruction is available - RDSEED // RDSEED instruction is available - ADX // Intel ADX (Multi-Precision Add-Carry Instruction Extensions) - SHA // Intel SHA Extensions - AVX512F // AVX-512 Foundation - AVX512DQ // AVX-512 Doubleword and Quadword Instructions - AVX512IFMA // AVX-512 Integer Fused Multiply-Add Instructions - AVX512PF // AVX-512 Prefetch Instructions - AVX512ER // AVX-512 Exponential and Reciprocal Instructions - AVX512CD // AVX-512 Conflict Detection Instructions - AVX512BW // AVX-512 Byte and Word Instructions - AVX512VL // AVX-512 Vector Length Extensions - AVX512VBMI // AVX-512 Vector Bit Manipulation Instructions - MPX // Intel MPX (Memory Protection Extensions) - ERMS // Enhanced REP MOVSB/STOSB - RDTSCP // RDTSCP Instruction - CX16 // CMPXCHG16B Instruction - SGX // Software Guard Extensions - - // Performance indicators - SSE2SLOW // SSE2 is supported, but usually not faster - SSE3SLOW // SSE3 is supported, but usually not faster - ATOM // Atom processor, some SSSE3 instructions are slower -) - -var flagNames = map[Flags]string{ - CMOV: "CMOV", // i686 CMOV - NX: "NX", // NX (No-Execute) bit - AMD3DNOW: "AMD3DNOW", // AMD 3DNOW - AMD3DNOWEXT: "AMD3DNOWEXT", // AMD 3DNowExt - MMX: "MMX", // Standard MMX - MMXEXT: "MMXEXT", // SSE integer functions or AMD MMX ext - SSE: "SSE", // SSE functions - SSE2: "SSE2", // P4 SSE2 functions - SSE3: "SSE3", // Prescott SSE3 functions - SSSE3: "SSSE3", // Conroe SSSE3 functions - SSE4: "SSE4.1", // Penryn SSE4.1 functions - SSE4A: "SSE4A", // AMD Barcelona microarchitecture SSE4a instructions - SSE42: "SSE4.2", // Nehalem SSE4.2 functions - AVX: "AVX", // AVX functions - AVX2: "AVX2", // AVX functions - FMA3: "FMA3", // Intel FMA 3 - FMA4: "FMA4", // Bulldozer FMA4 functions - XOP: "XOP", // Bulldozer XOP functions - F16C: "F16C", // Half-precision floating-point conversion - BMI1: "BMI1", // Bit Manipulation Instruction Set 1 - BMI2: "BMI2", // Bit Manipulation Instruction Set 2 - TBM: "TBM", // AMD Trailing Bit Manipulation - LZCNT: "LZCNT", // LZCNT instruction - POPCNT: "POPCNT", // POPCNT instruction - AESNI: "AESNI", // Advanced Encryption Standard New Instructions - CLMUL: "CLMUL", // Carry-less Multiplication - HTT: "HTT", // Hyperthreading (enabled) - HLE: "HLE", // Hardware Lock Elision - RTM: "RTM", // Restricted Transactional Memory - RDRAND: "RDRAND", // RDRAND instruction is available - RDSEED: "RDSEED", // RDSEED instruction is available - ADX: "ADX", // Intel ADX (Multi-Precision Add-Carry Instruction Extensions) - SHA: "SHA", // Intel SHA Extensions - AVX512F: "AVX512F", // AVX-512 Foundation - AVX512DQ: "AVX512DQ", // AVX-512 Doubleword and Quadword Instructions - AVX512IFMA: "AVX512IFMA", // AVX-512 Integer Fused Multiply-Add Instructions - AVX512PF: "AVX512PF", // AVX-512 Prefetch Instructions - AVX512ER: "AVX512ER", // AVX-512 Exponential and Reciprocal Instructions - AVX512CD: "AVX512CD", // AVX-512 Conflict Detection Instructions - AVX512BW: "AVX512BW", // AVX-512 Byte and Word Instructions - AVX512VL: "AVX512VL", // AVX-512 Vector Length Extensions - AVX512VBMI: "AVX512VBMI", // AVX-512 Vector Bit Manipulation Instructions - MPX: "MPX", // Intel MPX (Memory Protection Extensions) - ERMS: "ERMS", // Enhanced REP MOVSB/STOSB - RDTSCP: "RDTSCP", // RDTSCP Instruction - CX16: "CX16", // CMPXCHG16B Instruction - SGX: "SGX", // Software Guard Extensions - - // Performance indicators - SSE2SLOW: "SSE2SLOW", // SSE2 supported, but usually not faster - SSE3SLOW: "SSE3SLOW", // SSE3 supported, but usually not faster - ATOM: "ATOM", // Atom processor, some SSSE3 instructions are slower - -} - -// CPUInfo contains information about the detected system CPU. -type CPUInfo struct { - BrandName string // Brand name reported by the CPU - VendorID Vendor // Comparable CPU vendor ID - Features Flags // Features of the CPU - PhysicalCores int // Number of physical processor cores in your CPU. Will be 0 if undetectable. - ThreadsPerCore int // Number of threads per physical core. Will be 1 if undetectable. - LogicalCores int // Number of physical cores times threads that can run on each core through the use of hyperthreading. Will be 0 if undetectable. - Family int // CPU family number - Model int // CPU model number - CacheLine int // Cache line size in bytes. Will be 0 if undetectable. - Cache struct { - L1I int // L1 Instruction Cache (per core or shared). Will be -1 if undetected - L1D int // L1 Data Cache (per core or shared). Will be -1 if undetected - L2 int // L2 Cache (per core or shared). Will be -1 if undetected - L3 int // L3 Instruction Cache (per core or shared). Will be -1 if undetected - } - SGX SGXSupport - maxFunc uint32 - maxExFunc uint32 -} - -var cpuid func(op uint32) (eax, ebx, ecx, edx uint32) -var cpuidex func(op, op2 uint32) (eax, ebx, ecx, edx uint32) -var xgetbv func(index uint32) (eax, edx uint32) -var rdtscpAsm func() (eax, ebx, ecx, edx uint32) - -// CPU contains information about the CPU as detected on startup, -// or when Detect last was called. -// -// Use this as the primary entry point to you data, -// this way queries are -var CPU CPUInfo - -func init() { - initCPU() - Detect() -} - -// Detect will re-detect current CPU info. -// This will replace the content of the exported CPU variable. -// -// Unless you expect the CPU to change while you are running your program -// you should not need to call this function. -// If you call this, you must ensure that no other goroutine is accessing the -// exported CPU variable. -func Detect() { - CPU.maxFunc = maxFunctionID() - CPU.maxExFunc = maxExtendedFunction() - CPU.BrandName = brandName() - CPU.CacheLine = cacheLine() - CPU.Family, CPU.Model = familyModel() - CPU.Features = support() - CPU.SGX = sgx(CPU.Features&SGX != 0) - CPU.ThreadsPerCore = threadsPerCore() - CPU.LogicalCores = logicalCores() - CPU.PhysicalCores = physicalCores() - CPU.VendorID = vendorID() - CPU.cacheSize() -} - -// Generated here: http://play.golang.org/p/BxFH2Gdc0G - -// Cmov indicates support of CMOV instructions -func (c CPUInfo) Cmov() bool { - return c.Features&CMOV != 0 -} - -// Amd3dnow indicates support of AMD 3DNOW! instructions -func (c CPUInfo) Amd3dnow() bool { - return c.Features&AMD3DNOW != 0 -} - -// Amd3dnowExt indicates support of AMD 3DNOW! Extended instructions -func (c CPUInfo) Amd3dnowExt() bool { - return c.Features&AMD3DNOWEXT != 0 -} - -// MMX indicates support of MMX instructions -func (c CPUInfo) MMX() bool { - return c.Features&MMX != 0 -} - -// MMXExt indicates support of MMXEXT instructions -// (SSE integer functions or AMD MMX ext) -func (c CPUInfo) MMXExt() bool { - return c.Features&MMXEXT != 0 -} - -// SSE indicates support of SSE instructions -func (c CPUInfo) SSE() bool { - return c.Features&SSE != 0 -} - -// SSE2 indicates support of SSE 2 instructions -func (c CPUInfo) SSE2() bool { - return c.Features&SSE2 != 0 -} - -// SSE3 indicates support of SSE 3 instructions -func (c CPUInfo) SSE3() bool { - return c.Features&SSE3 != 0 -} - -// SSSE3 indicates support of SSSE 3 instructions -func (c CPUInfo) SSSE3() bool { - return c.Features&SSSE3 != 0 -} - -// SSE4 indicates support of SSE 4 (also called SSE 4.1) instructions -func (c CPUInfo) SSE4() bool { - return c.Features&SSE4 != 0 -} - -// SSE42 indicates support of SSE4.2 instructions -func (c CPUInfo) SSE42() bool { - return c.Features&SSE42 != 0 -} - -// AVX indicates support of AVX instructions -// and operating system support of AVX instructions -func (c CPUInfo) AVX() bool { - return c.Features&AVX != 0 -} - -// AVX2 indicates support of AVX2 instructions -func (c CPUInfo) AVX2() bool { - return c.Features&AVX2 != 0 -} - -// FMA3 indicates support of FMA3 instructions -func (c CPUInfo) FMA3() bool { - return c.Features&FMA3 != 0 -} - -// FMA4 indicates support of FMA4 instructions -func (c CPUInfo) FMA4() bool { - return c.Features&FMA4 != 0 -} - -// XOP indicates support of XOP instructions -func (c CPUInfo) XOP() bool { - return c.Features&XOP != 0 -} - -// F16C indicates support of F16C instructions -func (c CPUInfo) F16C() bool { - return c.Features&F16C != 0 -} - -// BMI1 indicates support of BMI1 instructions -func (c CPUInfo) BMI1() bool { - return c.Features&BMI1 != 0 -} - -// BMI2 indicates support of BMI2 instructions -func (c CPUInfo) BMI2() bool { - return c.Features&BMI2 != 0 -} - -// TBM indicates support of TBM instructions -// (AMD Trailing Bit Manipulation) -func (c CPUInfo) TBM() bool { - return c.Features&TBM != 0 -} - -// Lzcnt indicates support of LZCNT instruction -func (c CPUInfo) Lzcnt() bool { - return c.Features&LZCNT != 0 -} - -// Popcnt indicates support of POPCNT instruction -func (c CPUInfo) Popcnt() bool { - return c.Features&POPCNT != 0 -} - -// HTT indicates the processor has Hyperthreading enabled -func (c CPUInfo) HTT() bool { - return c.Features&HTT != 0 -} - -// SSE2Slow indicates that SSE2 may be slow on this processor -func (c CPUInfo) SSE2Slow() bool { - return c.Features&SSE2SLOW != 0 -} - -// SSE3Slow indicates that SSE3 may be slow on this processor -func (c CPUInfo) SSE3Slow() bool { - return c.Features&SSE3SLOW != 0 -} - -// AesNi indicates support of AES-NI instructions -// (Advanced Encryption Standard New Instructions) -func (c CPUInfo) AesNi() bool { - return c.Features&AESNI != 0 -} - -// Clmul indicates support of CLMUL instructions -// (Carry-less Multiplication) -func (c CPUInfo) Clmul() bool { - return c.Features&CLMUL != 0 -} - -// NX indicates support of NX (No-Execute) bit -func (c CPUInfo) NX() bool { - return c.Features&NX != 0 -} - -// SSE4A indicates support of AMD Barcelona microarchitecture SSE4a instructions -func (c CPUInfo) SSE4A() bool { - return c.Features&SSE4A != 0 -} - -// HLE indicates support of Hardware Lock Elision -func (c CPUInfo) HLE() bool { - return c.Features&HLE != 0 -} - -// RTM indicates support of Restricted Transactional Memory -func (c CPUInfo) RTM() bool { - return c.Features&RTM != 0 -} - -// Rdrand indicates support of RDRAND instruction is available -func (c CPUInfo) Rdrand() bool { - return c.Features&RDRAND != 0 -} - -// Rdseed indicates support of RDSEED instruction is available -func (c CPUInfo) Rdseed() bool { - return c.Features&RDSEED != 0 -} - -// ADX indicates support of Intel ADX (Multi-Precision Add-Carry Instruction Extensions) -func (c CPUInfo) ADX() bool { - return c.Features&ADX != 0 -} - -// SHA indicates support of Intel SHA Extensions -func (c CPUInfo) SHA() bool { - return c.Features&SHA != 0 -} - -// AVX512F indicates support of AVX-512 Foundation -func (c CPUInfo) AVX512F() bool { - return c.Features&AVX512F != 0 -} - -// AVX512DQ indicates support of AVX-512 Doubleword and Quadword Instructions -func (c CPUInfo) AVX512DQ() bool { - return c.Features&AVX512DQ != 0 -} - -// AVX512IFMA indicates support of AVX-512 Integer Fused Multiply-Add Instructions -func (c CPUInfo) AVX512IFMA() bool { - return c.Features&AVX512IFMA != 0 -} - -// AVX512PF indicates support of AVX-512 Prefetch Instructions -func (c CPUInfo) AVX512PF() bool { - return c.Features&AVX512PF != 0 -} - -// AVX512ER indicates support of AVX-512 Exponential and Reciprocal Instructions -func (c CPUInfo) AVX512ER() bool { - return c.Features&AVX512ER != 0 -} - -// AVX512CD indicates support of AVX-512 Conflict Detection Instructions -func (c CPUInfo) AVX512CD() bool { - return c.Features&AVX512CD != 0 -} - -// AVX512BW indicates support of AVX-512 Byte and Word Instructions -func (c CPUInfo) AVX512BW() bool { - return c.Features&AVX512BW != 0 -} - -// AVX512VL indicates support of AVX-512 Vector Length Extensions -func (c CPUInfo) AVX512VL() bool { - return c.Features&AVX512VL != 0 -} - -// AVX512VBMI indicates support of AVX-512 Vector Bit Manipulation Instructions -func (c CPUInfo) AVX512VBMI() bool { - return c.Features&AVX512VBMI != 0 -} - -// MPX indicates support of Intel MPX (Memory Protection Extensions) -func (c CPUInfo) MPX() bool { - return c.Features&MPX != 0 -} - -// ERMS indicates support of Enhanced REP MOVSB/STOSB -func (c CPUInfo) ERMS() bool { - return c.Features&ERMS != 0 -} - -func (c CPUInfo) RDTSCP() bool { - return c.Features&RDTSCP != 0 -} - -func (c CPUInfo) CX16() bool { - return c.Features&CX16 != 0 -} - -// Atom indicates an Atom processor -func (c CPUInfo) Atom() bool { - return c.Features&ATOM != 0 -} - -// Intel returns true if vendor is recognized as Intel -func (c CPUInfo) Intel() bool { - return c.VendorID == Intel -} - -// AMD returns true if vendor is recognized as AMD -func (c CPUInfo) AMD() bool { - return c.VendorID == AMD -} - -// Transmeta returns true if vendor is recognized as Transmeta -func (c CPUInfo) Transmeta() bool { - return c.VendorID == Transmeta -} - -// NSC returns true if vendor is recognized as National Semiconductor -func (c CPUInfo) NSC() bool { - return c.VendorID == NSC -} - -// VIA returns true if vendor is recognized as VIA -func (c CPUInfo) VIA() bool { - return c.VendorID == VIA -} - -// RTCounter returns the 64-bit time-stamp counter -// Uses the RDTSCP instruction. The value 0 is returned -// if the CPU does not support the instruction. -func (c CPUInfo) RTCounter() uint64 { - if !c.RDTSCP() { - return 0 - } - a, _, _, d := rdtscpAsm() - return uint64(a) | (uint64(d) << 32) -} - -// Ia32TscAux returns the IA32_TSC_AUX part of the RDTSCP. -// This variable is OS dependent, but on Linux contains information -// about the current cpu/core the code is running on. -// If the RDTSCP instruction isn't supported on the CPU, the value 0 is returned. -func (c CPUInfo) Ia32TscAux() uint32 { - if !c.RDTSCP() { - return 0 - } - _, _, ecx, _ := rdtscpAsm() - return ecx -} - -// LogicalCPU will return the Logical CPU the code is currently executing on. -// This is likely to change when the OS re-schedules the running thread -// to another CPU. -// If the current core cannot be detected, -1 will be returned. -func (c CPUInfo) LogicalCPU() int { - if c.maxFunc < 1 { - return -1 - } - _, ebx, _, _ := cpuid(1) - return int(ebx >> 24) -} - -// VM Will return true if the cpu id indicates we are in -// a virtual machine. This is only a hint, and will very likely -// have many false negatives. -func (c CPUInfo) VM() bool { - switch c.VendorID { - case MSVM, KVM, VMware, XenHVM: - return true - } - return false -} - -// Flags contains detected cpu features and caracteristics -type Flags uint64 - -// String returns a string representation of the detected -// CPU features. -func (f Flags) String() string { - return strings.Join(f.Strings(), ",") -} - -// Strings returns and array of the detected features. -func (f Flags) Strings() []string { - s := support() - r := make([]string, 0, 20) - for i := uint(0); i < 64; i++ { - key := Flags(1 << i) - val := flagNames[key] - if s&key != 0 { - r = append(r, val) - } - } - return r -} - -func maxExtendedFunction() uint32 { - eax, _, _, _ := cpuid(0x80000000) - return eax -} - -func maxFunctionID() uint32 { - a, _, _, _ := cpuid(0) - return a -} - -func brandName() string { - if maxExtendedFunction() >= 0x80000004 { - v := make([]uint32, 0, 48) - for i := uint32(0); i < 3; i++ { - a, b, c, d := cpuid(0x80000002 + i) - v = append(v, a, b, c, d) - } - return strings.Trim(string(valAsString(v...)), " ") - } - return "unknown" -} - -func threadsPerCore() int { - mfi := maxFunctionID() - if mfi < 0x4 || vendorID() != Intel { - return 1 - } - - if mfi < 0xb { - _, b, _, d := cpuid(1) - if (d & (1 << 28)) != 0 { - // v will contain logical core count - v := (b >> 16) & 255 - if v > 1 { - a4, _, _, _ := cpuid(4) - // physical cores - v2 := (a4 >> 26) + 1 - if v2 > 0 { - return int(v) / int(v2) - } - } - } - return 1 - } - _, b, _, _ := cpuidex(0xb, 0) - if b&0xffff == 0 { - return 1 - } - return int(b & 0xffff) -} - -func logicalCores() int { - mfi := maxFunctionID() - switch vendorID() { - case Intel: - // Use this on old Intel processors - if mfi < 0xb { - if mfi < 1 { - return 0 - } - // CPUID.1:EBX[23:16] represents the maximum number of addressable IDs (initial APIC ID) - // that can be assigned to logical processors in a physical package. - // The value may not be the same as the number of logical processors that are present in the hardware of a physical package. - _, ebx, _, _ := cpuid(1) - logical := (ebx >> 16) & 0xff - return int(logical) - } - _, b, _, _ := cpuidex(0xb, 1) - return int(b & 0xffff) - case AMD: - _, b, _, _ := cpuid(1) - return int((b >> 16) & 0xff) - default: - return 0 - } -} - -func familyModel() (int, int) { - if maxFunctionID() < 0x1 { - return 0, 0 - } - eax, _, _, _ := cpuid(1) - family := ((eax >> 8) & 0xf) + ((eax >> 20) & 0xff) - model := ((eax >> 4) & 0xf) + ((eax >> 12) & 0xf0) - return int(family), int(model) -} - -func physicalCores() int { - switch vendorID() { - case Intel: - return logicalCores() / threadsPerCore() - case AMD: - if maxExtendedFunction() >= 0x80000008 { - _, _, c, _ := cpuid(0x80000008) - return int(c&0xff) + 1 - } - } - return 0 -} - -// Except from http://en.wikipedia.org/wiki/CPUID#EAX.3D0:_Get_vendor_ID -var vendorMapping = map[string]Vendor{ - "AMDisbetter!": AMD, - "AuthenticAMD": AMD, - "CentaurHauls": VIA, - "GenuineIntel": Intel, - "TransmetaCPU": Transmeta, - "GenuineTMx86": Transmeta, - "Geode by NSC": NSC, - "VIA VIA VIA ": VIA, - "KVMKVMKVMKVM": KVM, - "Microsoft Hv": MSVM, - "VMwareVMware": VMware, - "XenVMMXenVMM": XenHVM, -} - -func vendorID() Vendor { - _, b, c, d := cpuid(0) - v := valAsString(b, d, c) - vend, ok := vendorMapping[string(v)] - if !ok { - return Other - } - return vend -} - -func cacheLine() int { - if maxFunctionID() < 0x1 { - return 0 - } - - _, ebx, _, _ := cpuid(1) - cache := (ebx & 0xff00) >> 5 // cflush size - if cache == 0 && maxExtendedFunction() >= 0x80000006 { - _, _, ecx, _ := cpuid(0x80000006) - cache = ecx & 0xff // cacheline size - } - // TODO: Read from Cache and TLB Information - return int(cache) -} - -func (c *CPUInfo) cacheSize() { - c.Cache.L1D = -1 - c.Cache.L1I = -1 - c.Cache.L2 = -1 - c.Cache.L3 = -1 - vendor := vendorID() - switch vendor { - case Intel: - if maxFunctionID() < 4 { - return - } - for i := uint32(0); ; i++ { - eax, ebx, ecx, _ := cpuidex(4, i) - cacheType := eax & 15 - if cacheType == 0 { - break - } - cacheLevel := (eax >> 5) & 7 - coherency := int(ebx&0xfff) + 1 - partitions := int((ebx>>12)&0x3ff) + 1 - associativity := int((ebx>>22)&0x3ff) + 1 - sets := int(ecx) + 1 - size := associativity * partitions * coherency * sets - switch cacheLevel { - case 1: - if cacheType == 1 { - // 1 = Data Cache - c.Cache.L1D = size - } else if cacheType == 2 { - // 2 = Instruction Cache - c.Cache.L1I = size - } else { - if c.Cache.L1D < 0 { - c.Cache.L1I = size - } - if c.Cache.L1I < 0 { - c.Cache.L1I = size - } - } - case 2: - c.Cache.L2 = size - case 3: - c.Cache.L3 = size - } - } - case AMD: - // Untested. - if maxExtendedFunction() < 0x80000005 { - return - } - _, _, ecx, edx := cpuid(0x80000005) - c.Cache.L1D = int(((ecx >> 24) & 0xFF) * 1024) - c.Cache.L1I = int(((edx >> 24) & 0xFF) * 1024) - - if maxExtendedFunction() < 0x80000006 { - return - } - _, _, ecx, _ = cpuid(0x80000006) - c.Cache.L2 = int(((ecx >> 16) & 0xFFFF) * 1024) - } - - return -} - -type SGXSupport struct { - Available bool - SGX1Supported bool - SGX2Supported bool - MaxEnclaveSizeNot64 int64 - MaxEnclaveSize64 int64 -} - -func sgx(available bool) (rval SGXSupport) { - rval.Available = available - - if !available { - return - } - - a, _, _, d := cpuidex(0x12, 0) - rval.SGX1Supported = a&0x01 != 0 - rval.SGX2Supported = a&0x02 != 0 - rval.MaxEnclaveSizeNot64 = 1 << (d & 0xFF) // pow 2 - rval.MaxEnclaveSize64 = 1 << ((d >> 8) & 0xFF) // pow 2 - - return -} - -func support() Flags { - mfi := maxFunctionID() - vend := vendorID() - if mfi < 0x1 { - return 0 - } - rval := uint64(0) - _, _, c, d := cpuid(1) - if (d & (1 << 15)) != 0 { - rval |= CMOV - } - if (d & (1 << 23)) != 0 { - rval |= MMX - } - if (d & (1 << 25)) != 0 { - rval |= MMXEXT - } - if (d & (1 << 25)) != 0 { - rval |= SSE - } - if (d & (1 << 26)) != 0 { - rval |= SSE2 - } - if (c & 1) != 0 { - rval |= SSE3 - } - if (c & 0x00000200) != 0 { - rval |= SSSE3 - } - if (c & 0x00080000) != 0 { - rval |= SSE4 - } - if (c & 0x00100000) != 0 { - rval |= SSE42 - } - if (c & (1 << 25)) != 0 { - rval |= AESNI - } - if (c & (1 << 1)) != 0 { - rval |= CLMUL - } - if c&(1<<23) != 0 { - rval |= POPCNT - } - if c&(1<<30) != 0 { - rval |= RDRAND - } - if c&(1<<29) != 0 { - rval |= F16C - } - if c&(1<<13) != 0 { - rval |= CX16 - } - if vend == Intel && (d&(1<<28)) != 0 && mfi >= 4 { - if threadsPerCore() > 1 { - rval |= HTT - } - } - - // Check XGETBV, OXSAVE and AVX bits - if c&(1<<26) != 0 && c&(1<<27) != 0 && c&(1<<28) != 0 { - // Check for OS support - eax, _ := xgetbv(0) - if (eax & 0x6) == 0x6 { - rval |= AVX - if (c & 0x00001000) != 0 { - rval |= FMA3 - } - } - } - - // Check AVX2, AVX2 requires OS support, but BMI1/2 don't. - if mfi >= 7 { - _, ebx, ecx, _ := cpuidex(7, 0) - if (rval&AVX) != 0 && (ebx&0x00000020) != 0 { - rval |= AVX2 - } - if (ebx & 0x00000008) != 0 { - rval |= BMI1 - if (ebx & 0x00000100) != 0 { - rval |= BMI2 - } - } - if ebx&(1<<2) != 0 { - rval |= SGX - } - if ebx&(1<<4) != 0 { - rval |= HLE - } - if ebx&(1<<9) != 0 { - rval |= ERMS - } - if ebx&(1<<11) != 0 { - rval |= RTM - } - if ebx&(1<<14) != 0 { - rval |= MPX - } - if ebx&(1<<18) != 0 { - rval |= RDSEED - } - if ebx&(1<<19) != 0 { - rval |= ADX - } - if ebx&(1<<29) != 0 { - rval |= SHA - } - - // Only detect AVX-512 features if XGETBV is supported - if c&((1<<26)|(1<<27)) == (1<<26)|(1<<27) { - // Check for OS support - eax, _ := xgetbv(0) - - // Verify that XCR0[7:5] = ‘111b’ (OPMASK state, upper 256-bit of ZMM0-ZMM15 and - // ZMM16-ZMM31 state are enabled by OS) - /// and that XCR0[2:1] = ‘11b’ (XMM state and YMM state are enabled by OS). - if (eax>>5)&7 == 7 && (eax>>1)&3 == 3 { - if ebx&(1<<16) != 0 { - rval |= AVX512F - } - if ebx&(1<<17) != 0 { - rval |= AVX512DQ - } - if ebx&(1<<21) != 0 { - rval |= AVX512IFMA - } - if ebx&(1<<26) != 0 { - rval |= AVX512PF - } - if ebx&(1<<27) != 0 { - rval |= AVX512ER - } - if ebx&(1<<28) != 0 { - rval |= AVX512CD - } - if ebx&(1<<30) != 0 { - rval |= AVX512BW - } - if ebx&(1<<31) != 0 { - rval |= AVX512VL - } - // ecx - if ecx&(1<<1) != 0 { - rval |= AVX512VBMI - } - } - } - } - - if maxExtendedFunction() >= 0x80000001 { - _, _, c, d := cpuid(0x80000001) - if (c & (1 << 5)) != 0 { - rval |= LZCNT - rval |= POPCNT - } - if (d & (1 << 31)) != 0 { - rval |= AMD3DNOW - } - if (d & (1 << 30)) != 0 { - rval |= AMD3DNOWEXT - } - if (d & (1 << 23)) != 0 { - rval |= MMX - } - if (d & (1 << 22)) != 0 { - rval |= MMXEXT - } - if (c & (1 << 6)) != 0 { - rval |= SSE4A - } - if d&(1<<20) != 0 { - rval |= NX - } - if d&(1<<27) != 0 { - rval |= RDTSCP - } - - /* Allow for selectively disabling SSE2 functions on AMD processors - with SSE2 support but not SSE4a. This includes Athlon64, some - Opteron, and some Sempron processors. MMX, SSE, or 3DNow! are faster - than SSE2 often enough to utilize this special-case flag. - AV_CPU_FLAG_SSE2 and AV_CPU_FLAG_SSE2SLOW are both set in this case - so that SSE2 is used unless explicitly disabled by checking - AV_CPU_FLAG_SSE2SLOW. */ - if vendorID() != Intel && - rval&SSE2 != 0 && (c&0x00000040) == 0 { - rval |= SSE2SLOW - } - - /* XOP and FMA4 use the AVX instruction coding scheme, so they can't be - * used unless the OS has AVX support. */ - if (rval & AVX) != 0 { - if (c & 0x00000800) != 0 { - rval |= XOP - } - if (c & 0x00010000) != 0 { - rval |= FMA4 - } - } - - if vendorID() == Intel { - family, model := familyModel() - if family == 6 && (model == 9 || model == 13 || model == 14) { - /* 6/9 (pentium-m "banias"), 6/13 (pentium-m "dothan"), and - * 6/14 (core1 "yonah") theoretically support sse2, but it's - * usually slower than mmx. */ - if (rval & SSE2) != 0 { - rval |= SSE2SLOW - } - if (rval & SSE3) != 0 { - rval |= SSE3SLOW - } - } - /* The Atom processor has SSSE3 support, which is useful in many cases, - * but sometimes the SSSE3 version is slower than the SSE2 equivalent - * on the Atom, but is generally faster on other processors supporting - * SSSE3. This flag allows for selectively disabling certain SSSE3 - * functions on the Atom. */ - if family == 6 && model == 28 { - rval |= ATOM - } - } - } - return Flags(rval) -} - -func valAsString(values ...uint32) []byte { - r := make([]byte, 4*len(values)) - for i, v := range values { - dst := r[i*4:] - dst[0] = byte(v & 0xff) - dst[1] = byte((v >> 8) & 0xff) - dst[2] = byte((v >> 16) & 0xff) - dst[3] = byte((v >> 24) & 0xff) - switch { - case dst[0] == 0: - return r[:i*4] - case dst[1] == 0: - return r[:i*4+1] - case dst[2] == 0: - return r[:i*4+2] - case dst[3] == 0: - return r[:i*4+3] - } - } - return r -} diff --git a/vendor/github.com/klauspost/cpuid/cpuid_386.s b/vendor/github.com/klauspost/cpuid/cpuid_386.s deleted file mode 100644 index 4d731711e..000000000 --- a/vendor/github.com/klauspost/cpuid/cpuid_386.s +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) 2015 Klaus Post, released under MIT License. See LICENSE file. - -// +build 386,!gccgo - -// func asmCpuid(op uint32) (eax, ebx, ecx, edx uint32) -TEXT ·asmCpuid(SB), 7, $0 - XORL CX, CX - MOVL op+0(FP), AX - CPUID - MOVL AX, eax+4(FP) - MOVL BX, ebx+8(FP) - MOVL CX, ecx+12(FP) - MOVL DX, edx+16(FP) - RET - -// func asmCpuidex(op, op2 uint32) (eax, ebx, ecx, edx uint32) -TEXT ·asmCpuidex(SB), 7, $0 - MOVL op+0(FP), AX - MOVL op2+4(FP), CX - CPUID - MOVL AX, eax+8(FP) - MOVL BX, ebx+12(FP) - MOVL CX, ecx+16(FP) - MOVL DX, edx+20(FP) - RET - -// func xgetbv(index uint32) (eax, edx uint32) -TEXT ·asmXgetbv(SB), 7, $0 - MOVL index+0(FP), CX - BYTE $0x0f; BYTE $0x01; BYTE $0xd0 // XGETBV - MOVL AX, eax+4(FP) - MOVL DX, edx+8(FP) - RET - -// func asmRdtscpAsm() (eax, ebx, ecx, edx uint32) -TEXT ·asmRdtscpAsm(SB), 7, $0 - BYTE $0x0F; BYTE $0x01; BYTE $0xF9 // RDTSCP - MOVL AX, eax+0(FP) - MOVL BX, ebx+4(FP) - MOVL CX, ecx+8(FP) - MOVL DX, edx+12(FP) - RET diff --git a/vendor/github.com/klauspost/cpuid/cpuid_amd64.s b/vendor/github.com/klauspost/cpuid/cpuid_amd64.s deleted file mode 100644 index 3c1d60e42..000000000 --- a/vendor/github.com/klauspost/cpuid/cpuid_amd64.s +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) 2015 Klaus Post, released under MIT License. See LICENSE file. - -//+build amd64,!gccgo - -// func asmCpuid(op uint32) (eax, ebx, ecx, edx uint32) -TEXT ·asmCpuid(SB), 7, $0 - XORQ CX, CX - MOVL op+0(FP), AX - CPUID - MOVL AX, eax+8(FP) - MOVL BX, ebx+12(FP) - MOVL CX, ecx+16(FP) - MOVL DX, edx+20(FP) - RET - -// func asmCpuidex(op, op2 uint32) (eax, ebx, ecx, edx uint32) -TEXT ·asmCpuidex(SB), 7, $0 - MOVL op+0(FP), AX - MOVL op2+4(FP), CX - CPUID - MOVL AX, eax+8(FP) - MOVL BX, ebx+12(FP) - MOVL CX, ecx+16(FP) - MOVL DX, edx+20(FP) - RET - -// func asmXgetbv(index uint32) (eax, edx uint32) -TEXT ·asmXgetbv(SB), 7, $0 - MOVL index+0(FP), CX - BYTE $0x0f; BYTE $0x01; BYTE $0xd0 // XGETBV - MOVL AX, eax+8(FP) - MOVL DX, edx+12(FP) - RET - -// func asmRdtscpAsm() (eax, ebx, ecx, edx uint32) -TEXT ·asmRdtscpAsm(SB), 7, $0 - BYTE $0x0F; BYTE $0x01; BYTE $0xF9 // RDTSCP - MOVL AX, eax+0(FP) - MOVL BX, ebx+4(FP) - MOVL CX, ecx+8(FP) - MOVL DX, edx+12(FP) - RET diff --git a/vendor/github.com/klauspost/cpuid/detect_intel.go b/vendor/github.com/klauspost/cpuid/detect_intel.go deleted file mode 100644 index a5f04dd6d..000000000 --- a/vendor/github.com/klauspost/cpuid/detect_intel.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) 2015 Klaus Post, released under MIT License. See LICENSE file. - -// +build 386,!gccgo amd64,!gccgo - -package cpuid - -func asmCpuid(op uint32) (eax, ebx, ecx, edx uint32) -func asmCpuidex(op, op2 uint32) (eax, ebx, ecx, edx uint32) -func asmXgetbv(index uint32) (eax, edx uint32) -func asmRdtscpAsm() (eax, ebx, ecx, edx uint32) - -func initCPU() { - cpuid = asmCpuid - cpuidex = asmCpuidex - xgetbv = asmXgetbv - rdtscpAsm = asmRdtscpAsm -} diff --git a/vendor/github.com/klauspost/cpuid/detect_ref.go b/vendor/github.com/klauspost/cpuid/detect_ref.go deleted file mode 100644 index 909c5d9a7..000000000 --- a/vendor/github.com/klauspost/cpuid/detect_ref.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) 2015 Klaus Post, released under MIT License. See LICENSE file. - -// +build !amd64,!386 gccgo - -package cpuid - -func initCPU() { - cpuid = func(op uint32) (eax, ebx, ecx, edx uint32) { - return 0, 0, 0, 0 - } - - cpuidex = func(op, op2 uint32) (eax, ebx, ecx, edx uint32) { - return 0, 0, 0, 0 - } - - xgetbv = func(index uint32) (eax, edx uint32) { - return 0, 0 - } - - rdtscpAsm = func() (eax, ebx, ecx, edx uint32) { - return 0, 0, 0, 0 - } -} diff --git a/vendor/github.com/klauspost/cpuid/generate.go b/vendor/github.com/klauspost/cpuid/generate.go deleted file mode 100644 index c060b8165..000000000 --- a/vendor/github.com/klauspost/cpuid/generate.go +++ /dev/null @@ -1,3 +0,0 @@ -package cpuid - -//go:generate go run private-gen.go diff --git a/vendor/github.com/klauspost/cpuid/private-gen.go b/vendor/github.com/klauspost/cpuid/private-gen.go deleted file mode 100644 index 437333d29..000000000 --- a/vendor/github.com/klauspost/cpuid/private-gen.go +++ /dev/null @@ -1,476 +0,0 @@ -// +build ignore - -package main - -import ( - "bytes" - "fmt" - "go/ast" - "go/parser" - "go/printer" - "go/token" - "io" - "io/ioutil" - "log" - "os" - "reflect" - "strings" - "unicode" - "unicode/utf8" -) - -var inFiles = []string{"cpuid.go", "cpuid_test.go"} -var copyFiles = []string{"cpuid_amd64.s", "cpuid_386.s", "detect_ref.go", "detect_intel.go"} -var fileSet = token.NewFileSet() -var reWrites = []rewrite{ - initRewrite("CPUInfo -> cpuInfo"), - initRewrite("Vendor -> vendor"), - initRewrite("Flags -> flags"), - initRewrite("Detect -> detect"), - initRewrite("CPU -> cpu"), -} -var excludeNames = map[string]bool{"string": true, "join": true, "trim": true, - // cpuid_test.go - "t": true, "println": true, "logf": true, "log": true, "fatalf": true, "fatal": true, -} - -var excludePrefixes = []string{"test", "benchmark"} - -func main() { - Package := "private" - parserMode := parser.ParseComments - exported := make(map[string]rewrite) - for _, file := range inFiles { - in, err := os.Open(file) - if err != nil { - log.Fatalf("opening input", err) - } - - src, err := ioutil.ReadAll(in) - if err != nil { - log.Fatalf("reading input", err) - } - - astfile, err := parser.ParseFile(fileSet, file, src, parserMode) - if err != nil { - log.Fatalf("parsing input", err) - } - - for _, rw := range reWrites { - astfile = rw(astfile) - } - - // Inspect the AST and print all identifiers and literals. - var startDecl token.Pos - var endDecl token.Pos - ast.Inspect(astfile, func(n ast.Node) bool { - var s string - switch x := n.(type) { - case *ast.Ident: - if x.IsExported() { - t := strings.ToLower(x.Name) - for _, pre := range excludePrefixes { - if strings.HasPrefix(t, pre) { - return true - } - } - if excludeNames[t] != true { - //if x.Pos() > startDecl && x.Pos() < endDecl { - exported[x.Name] = initRewrite(x.Name + " -> " + t) - } - } - - case *ast.GenDecl: - if x.Tok == token.CONST && x.Lparen > 0 { - startDecl = x.Lparen - endDecl = x.Rparen - // fmt.Printf("Decl:%s -> %s\n", fileSet.Position(startDecl), fileSet.Position(endDecl)) - } - } - if s != "" { - fmt.Printf("%s:\t%s\n", fileSet.Position(n.Pos()), s) - } - return true - }) - - for _, rw := range exported { - astfile = rw(astfile) - } - - var buf bytes.Buffer - - printer.Fprint(&buf, fileSet, astfile) - - // Remove package documentation and insert information - s := buf.String() - ind := strings.Index(buf.String(), "\npackage cpuid") - s = s[ind:] - s = "// Generated, DO NOT EDIT,\n" + - "// but copy it to your own project and rename the package.\n" + - "// See more at http://github.com/klauspost/cpuid\n" + - s - - outputName := Package + string(os.PathSeparator) + file - - err = ioutil.WriteFile(outputName, []byte(s), 0644) - if err != nil { - log.Fatalf("writing output: %s", err) - } - log.Println("Generated", outputName) - } - - for _, file := range copyFiles { - dst := "" - if strings.HasPrefix(file, "cpuid") { - dst = Package + string(os.PathSeparator) + file - } else { - dst = Package + string(os.PathSeparator) + "cpuid_" + file - } - err := copyFile(file, dst) - if err != nil { - log.Fatalf("copying file: %s", err) - } - log.Println("Copied", dst) - } -} - -// CopyFile copies a file from src to dst. If src and dst files exist, and are -// the same, then return success. Copy the file contents from src to dst. -func copyFile(src, dst string) (err error) { - sfi, err := os.Stat(src) - if err != nil { - return - } - if !sfi.Mode().IsRegular() { - // cannot copy non-regular files (e.g., directories, - // symlinks, devices, etc.) - return fmt.Errorf("CopyFile: non-regular source file %s (%q)", sfi.Name(), sfi.Mode().String()) - } - dfi, err := os.Stat(dst) - if err != nil { - if !os.IsNotExist(err) { - return - } - } else { - if !(dfi.Mode().IsRegular()) { - return fmt.Errorf("CopyFile: non-regular destination file %s (%q)", dfi.Name(), dfi.Mode().String()) - } - if os.SameFile(sfi, dfi) { - return - } - } - err = copyFileContents(src, dst) - return -} - -// copyFileContents copies the contents of the file named src to the file named -// by dst. The file will be created if it does not already exist. If the -// destination file exists, all it's contents will be replaced by the contents -// of the source file. -func copyFileContents(src, dst string) (err error) { - in, err := os.Open(src) - if err != nil { - return - } - defer in.Close() - out, err := os.Create(dst) - if err != nil { - return - } - defer func() { - cerr := out.Close() - if err == nil { - err = cerr - } - }() - if _, err = io.Copy(out, in); err != nil { - return - } - err = out.Sync() - return -} - -type rewrite func(*ast.File) *ast.File - -// Mostly copied from gofmt -func initRewrite(rewriteRule string) rewrite { - f := strings.Split(rewriteRule, "->") - if len(f) != 2 { - fmt.Fprintf(os.Stderr, "rewrite rule must be of the form 'pattern -> replacement'\n") - os.Exit(2) - } - pattern := parseExpr(f[0], "pattern") - replace := parseExpr(f[1], "replacement") - return func(p *ast.File) *ast.File { return rewriteFile(pattern, replace, p) } -} - -// parseExpr parses s as an expression. -// It might make sense to expand this to allow statement patterns, -// but there are problems with preserving formatting and also -// with what a wildcard for a statement looks like. -func parseExpr(s, what string) ast.Expr { - x, err := parser.ParseExpr(s) - if err != nil { - fmt.Fprintf(os.Stderr, "parsing %s %s at %s\n", what, s, err) - os.Exit(2) - } - return x -} - -// Keep this function for debugging. -/* -func dump(msg string, val reflect.Value) { - fmt.Printf("%s:\n", msg) - ast.Print(fileSet, val.Interface()) - fmt.Println() -} -*/ - -// rewriteFile applies the rewrite rule 'pattern -> replace' to an entire file. -func rewriteFile(pattern, replace ast.Expr, p *ast.File) *ast.File { - cmap := ast.NewCommentMap(fileSet, p, p.Comments) - m := make(map[string]reflect.Value) - pat := reflect.ValueOf(pattern) - repl := reflect.ValueOf(replace) - - var rewriteVal func(val reflect.Value) reflect.Value - rewriteVal = func(val reflect.Value) reflect.Value { - // don't bother if val is invalid to start with - if !val.IsValid() { - return reflect.Value{} - } - for k := range m { - delete(m, k) - } - val = apply(rewriteVal, val) - if match(m, pat, val) { - val = subst(m, repl, reflect.ValueOf(val.Interface().(ast.Node).Pos())) - } - return val - } - - r := apply(rewriteVal, reflect.ValueOf(p)).Interface().(*ast.File) - r.Comments = cmap.Filter(r).Comments() // recreate comments list - return r -} - -// set is a wrapper for x.Set(y); it protects the caller from panics if x cannot be changed to y. -func set(x, y reflect.Value) { - // don't bother if x cannot be set or y is invalid - if !x.CanSet() || !y.IsValid() { - return - } - defer func() { - if x := recover(); x != nil { - if s, ok := x.(string); ok && - (strings.Contains(s, "type mismatch") || strings.Contains(s, "not assignable")) { - // x cannot be set to y - ignore this rewrite - return - } - panic(x) - } - }() - x.Set(y) -} - -// Values/types for special cases. -var ( - objectPtrNil = reflect.ValueOf((*ast.Object)(nil)) - scopePtrNil = reflect.ValueOf((*ast.Scope)(nil)) - - identType = reflect.TypeOf((*ast.Ident)(nil)) - objectPtrType = reflect.TypeOf((*ast.Object)(nil)) - positionType = reflect.TypeOf(token.NoPos) - callExprType = reflect.TypeOf((*ast.CallExpr)(nil)) - scopePtrType = reflect.TypeOf((*ast.Scope)(nil)) -) - -// apply replaces each AST field x in val with f(x), returning val. -// To avoid extra conversions, f operates on the reflect.Value form. -func apply(f func(reflect.Value) reflect.Value, val reflect.Value) reflect.Value { - if !val.IsValid() { - return reflect.Value{} - } - - // *ast.Objects introduce cycles and are likely incorrect after - // rewrite; don't follow them but replace with nil instead - if val.Type() == objectPtrType { - return objectPtrNil - } - - // similarly for scopes: they are likely incorrect after a rewrite; - // replace them with nil - if val.Type() == scopePtrType { - return scopePtrNil - } - - switch v := reflect.Indirect(val); v.Kind() { - case reflect.Slice: - for i := 0; i < v.Len(); i++ { - e := v.Index(i) - set(e, f(e)) - } - case reflect.Struct: - for i := 0; i < v.NumField(); i++ { - e := v.Field(i) - set(e, f(e)) - } - case reflect.Interface: - e := v.Elem() - set(v, f(e)) - } - return val -} - -func isWildcard(s string) bool { - rune, size := utf8.DecodeRuneInString(s) - return size == len(s) && unicode.IsLower(rune) -} - -// match returns true if pattern matches val, -// recording wildcard submatches in m. -// If m == nil, match checks whether pattern == val. -func match(m map[string]reflect.Value, pattern, val reflect.Value) bool { - // Wildcard matches any expression. If it appears multiple - // times in the pattern, it must match the same expression - // each time. - if m != nil && pattern.IsValid() && pattern.Type() == identType { - name := pattern.Interface().(*ast.Ident).Name - if isWildcard(name) && val.IsValid() { - // wildcards only match valid (non-nil) expressions. - if _, ok := val.Interface().(ast.Expr); ok && !val.IsNil() { - if old, ok := m[name]; ok { - return match(nil, old, val) - } - m[name] = val - return true - } - } - } - - // Otherwise, pattern and val must match recursively. - if !pattern.IsValid() || !val.IsValid() { - return !pattern.IsValid() && !val.IsValid() - } - if pattern.Type() != val.Type() { - return false - } - - // Special cases. - switch pattern.Type() { - case identType: - // For identifiers, only the names need to match - // (and none of the other *ast.Object information). - // This is a common case, handle it all here instead - // of recursing down any further via reflection. - p := pattern.Interface().(*ast.Ident) - v := val.Interface().(*ast.Ident) - return p == nil && v == nil || p != nil && v != nil && p.Name == v.Name - case objectPtrType, positionType: - // object pointers and token positions always match - return true - case callExprType: - // For calls, the Ellipsis fields (token.Position) must - // match since that is how f(x) and f(x...) are different. - // Check them here but fall through for the remaining fields. - p := pattern.Interface().(*ast.CallExpr) - v := val.Interface().(*ast.CallExpr) - if p.Ellipsis.IsValid() != v.Ellipsis.IsValid() { - return false - } - } - - p := reflect.Indirect(pattern) - v := reflect.Indirect(val) - if !p.IsValid() || !v.IsValid() { - return !p.IsValid() && !v.IsValid() - } - - switch p.Kind() { - case reflect.Slice: - if p.Len() != v.Len() { - return false - } - for i := 0; i < p.Len(); i++ { - if !match(m, p.Index(i), v.Index(i)) { - return false - } - } - return true - - case reflect.Struct: - for i := 0; i < p.NumField(); i++ { - if !match(m, p.Field(i), v.Field(i)) { - return false - } - } - return true - - case reflect.Interface: - return match(m, p.Elem(), v.Elem()) - } - - // Handle token integers, etc. - return p.Interface() == v.Interface() -} - -// subst returns a copy of pattern with values from m substituted in place -// of wildcards and pos used as the position of tokens from the pattern. -// if m == nil, subst returns a copy of pattern and doesn't change the line -// number information. -func subst(m map[string]reflect.Value, pattern reflect.Value, pos reflect.Value) reflect.Value { - if !pattern.IsValid() { - return reflect.Value{} - } - - // Wildcard gets replaced with map value. - if m != nil && pattern.Type() == identType { - name := pattern.Interface().(*ast.Ident).Name - if isWildcard(name) { - if old, ok := m[name]; ok { - return subst(nil, old, reflect.Value{}) - } - } - } - - if pos.IsValid() && pattern.Type() == positionType { - // use new position only if old position was valid in the first place - if old := pattern.Interface().(token.Pos); !old.IsValid() { - return pattern - } - return pos - } - - // Otherwise copy. - switch p := pattern; p.Kind() { - case reflect.Slice: - v := reflect.MakeSlice(p.Type(), p.Len(), p.Len()) - for i := 0; i < p.Len(); i++ { - v.Index(i).Set(subst(m, p.Index(i), pos)) - } - return v - - case reflect.Struct: - v := reflect.New(p.Type()).Elem() - for i := 0; i < p.NumField(); i++ { - v.Field(i).Set(subst(m, p.Field(i), pos)) - } - return v - - case reflect.Ptr: - v := reflect.New(p.Type()).Elem() - if elem := p.Elem(); elem.IsValid() { - v.Set(subst(m, elem, pos).Addr()) - } - return v - - case reflect.Interface: - v := reflect.New(p.Type()).Elem() - if elem := p.Elem(); elem.IsValid() { - v.Set(subst(m, elem, pos)) - } - return v - } - - return pattern -} diff --git a/vendor/github.com/klauspost/crc32/LICENSE b/vendor/github.com/klauspost/crc32/LICENSE deleted file mode 100644 index 4fd5963e3..000000000 --- a/vendor/github.com/klauspost/crc32/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -Copyright (c) 2012 The Go Authors. All rights reserved. -Copyright (c) 2015 Klaus Post - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * 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. - * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT -OWNER 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. diff --git a/vendor/github.com/klauspost/crc32/README.md b/vendor/github.com/klauspost/crc32/README.md deleted file mode 100644 index 029625d36..000000000 --- a/vendor/github.com/klauspost/crc32/README.md +++ /dev/null @@ -1,87 +0,0 @@ -# crc32 -CRC32 hash with x64 optimizations - -This package is a drop-in replacement for the standard library `hash/crc32` package, that features SSE 4.2 optimizations on x64 platforms, for a 10x speedup. - -[![Build Status](https://travis-ci.org/klauspost/crc32.svg?branch=master)](https://travis-ci.org/klauspost/crc32) - -# usage - -Install using `go get github.com/klauspost/crc32`. This library is based on Go 1.5 code and requires Go 1.3 or newer. - -Replace `import "hash/crc32"` with `import "github.com/klauspost/crc32"` and you are good to go. - -# changes -* Oct 20, 2016: Changes have been merged to upstream Go. Package updated to match. -* Dec 4, 2015: Uses the "slice-by-8" trick more extensively, which gives a 1.5 to 2.5x speedup if assembler is unavailable. - - -# performance - -For *Go 1.7* performance is equivalent to the standard library. So if you use this package for Go 1.7 you can switch back. - - -For IEEE tables (the most common), there is approximately a factor 10 speedup with "CLMUL" (Carryless multiplication) instruction: -``` -benchmark old ns/op new ns/op delta -BenchmarkCrc32KB 99955 10258 -89.74% - -benchmark old MB/s new MB/s speedup -BenchmarkCrc32KB 327.83 3194.20 9.74x -``` - -For other tables and "CLMUL" capable machines the performance is the same as the standard library. - -Here are some detailed benchmarks, comparing to go 1.5 standard library with and without assembler enabled. - -``` -Std: Standard Go 1.5 library -Crc: Indicates IEEE type CRC. -40B: Size of each slice encoded. -NoAsm: Assembler was disabled (ie. not an AMD64 or SSE 4.2+ capable machine). -Castagnoli: Castagnoli CRC type. - -BenchmarkStdCrc40B-4 10000000 158 ns/op 252.88 MB/s -BenchmarkCrc40BNoAsm-4 20000000 105 ns/op 377.38 MB/s (slice8) -BenchmarkCrc40B-4 20000000 105 ns/op 378.77 MB/s (slice8) - -BenchmarkStdCrc1KB-4 500000 3604 ns/op 284.10 MB/s -BenchmarkCrc1KBNoAsm-4 1000000 1463 ns/op 699.79 MB/s (slice8) -BenchmarkCrc1KB-4 3000000 396 ns/op 2583.69 MB/s (asm) - -BenchmarkStdCrc8KB-4 200000 11417 ns/op 717.48 MB/s (slice8) -BenchmarkCrc8KBNoAsm-4 200000 11317 ns/op 723.85 MB/s (slice8) -BenchmarkCrc8KB-4 500000 2919 ns/op 2805.73 MB/s (asm) - -BenchmarkStdCrc32KB-4 30000 45749 ns/op 716.24 MB/s (slice8) -BenchmarkCrc32KBNoAsm-4 30000 45109 ns/op 726.42 MB/s (slice8) -BenchmarkCrc32KB-4 100000 11497 ns/op 2850.09 MB/s (asm) - -BenchmarkStdNoAsmCastagnol40B-4 10000000 161 ns/op 246.94 MB/s -BenchmarkStdCastagnoli40B-4 50000000 28.4 ns/op 1410.69 MB/s (asm) -BenchmarkCastagnoli40BNoAsm-4 20000000 100 ns/op 398.01 MB/s (slice8) -BenchmarkCastagnoli40B-4 50000000 28.2 ns/op 1419.54 MB/s (asm) - -BenchmarkStdNoAsmCastagnoli1KB-4 500000 3622 ns/op 282.67 MB/s -BenchmarkStdCastagnoli1KB-4 10000000 144 ns/op 7099.78 MB/s (asm) -BenchmarkCastagnoli1KBNoAsm-4 1000000 1475 ns/op 694.14 MB/s (slice8) -BenchmarkCastagnoli1KB-4 10000000 146 ns/op 6993.35 MB/s (asm) - -BenchmarkStdNoAsmCastagnoli8KB-4 50000 28781 ns/op 284.63 MB/s -BenchmarkStdCastagnoli8KB-4 1000000 1029 ns/op 7957.89 MB/s (asm) -BenchmarkCastagnoli8KBNoAsm-4 200000 11410 ns/op 717.94 MB/s (slice8) -BenchmarkCastagnoli8KB-4 1000000 1000 ns/op 8188.71 MB/s (asm) - -BenchmarkStdNoAsmCastagnoli32KB-4 10000 115426 ns/op 283.89 MB/s -BenchmarkStdCastagnoli32KB-4 300000 4065 ns/op 8059.13 MB/s (asm) -BenchmarkCastagnoli32KBNoAsm-4 30000 45171 ns/op 725.41 MB/s (slice8) -BenchmarkCastagnoli32KB-4 500000 4077 ns/op 8035.89 MB/s (asm) -``` - -The IEEE assembler optimizations has been submitted and will be part of the Go 1.6 standard library. - -However, the improved use of slice-by-8 has not, but will probably be submitted for Go 1.7. - -# license - -Standard Go license. Changes are Copyright (c) 2015 Klaus Post under same conditions. diff --git a/vendor/github.com/klauspost/crc32/crc32.go b/vendor/github.com/klauspost/crc32/crc32.go deleted file mode 100644 index 8aa91b17e..000000000 --- a/vendor/github.com/klauspost/crc32/crc32.go +++ /dev/null @@ -1,207 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package crc32 implements the 32-bit cyclic redundancy check, or CRC-32, -// checksum. See http://en.wikipedia.org/wiki/Cyclic_redundancy_check for -// information. -// -// Polynomials are represented in LSB-first form also known as reversed representation. -// -// See http://en.wikipedia.org/wiki/Mathematics_of_cyclic_redundancy_checks#Reversed_representations_and_reciprocal_polynomials -// for information. -package crc32 - -import ( - "hash" - "sync" -) - -// The size of a CRC-32 checksum in bytes. -const Size = 4 - -// Predefined polynomials. -const ( - // IEEE is by far and away the most common CRC-32 polynomial. - // Used by ethernet (IEEE 802.3), v.42, fddi, gzip, zip, png, ... - IEEE = 0xedb88320 - - // Castagnoli's polynomial, used in iSCSI. - // Has better error detection characteristics than IEEE. - // http://dx.doi.org/10.1109/26.231911 - Castagnoli = 0x82f63b78 - - // Koopman's polynomial. - // Also has better error detection characteristics than IEEE. - // http://dx.doi.org/10.1109/DSN.2002.1028931 - Koopman = 0xeb31d82e -) - -// Table is a 256-word table representing the polynomial for efficient processing. -type Table [256]uint32 - -// This file makes use of functions implemented in architecture-specific files. -// The interface that they implement is as follows: -// -// // archAvailableIEEE reports whether an architecture-specific CRC32-IEEE -// // algorithm is available. -// archAvailableIEEE() bool -// -// // archInitIEEE initializes the architecture-specific CRC3-IEEE algorithm. -// // It can only be called if archAvailableIEEE() returns true. -// archInitIEEE() -// -// // archUpdateIEEE updates the given CRC32-IEEE. It can only be called if -// // archInitIEEE() was previously called. -// archUpdateIEEE(crc uint32, p []byte) uint32 -// -// // archAvailableCastagnoli reports whether an architecture-specific -// // CRC32-C algorithm is available. -// archAvailableCastagnoli() bool -// -// // archInitCastagnoli initializes the architecture-specific CRC32-C -// // algorithm. It can only be called if archAvailableCastagnoli() returns -// // true. -// archInitCastagnoli() -// -// // archUpdateCastagnoli updates the given CRC32-C. It can only be called -// // if archInitCastagnoli() was previously called. -// archUpdateCastagnoli(crc uint32, p []byte) uint32 - -// castagnoliTable points to a lazily initialized Table for the Castagnoli -// polynomial. MakeTable will always return this value when asked to make a -// Castagnoli table so we can compare against it to find when the caller is -// using this polynomial. -var castagnoliTable *Table -var castagnoliTable8 *slicing8Table -var castagnoliArchImpl bool -var updateCastagnoli func(crc uint32, p []byte) uint32 -var castagnoliOnce sync.Once - -func castagnoliInit() { - castagnoliTable = simpleMakeTable(Castagnoli) - castagnoliArchImpl = archAvailableCastagnoli() - - if castagnoliArchImpl { - archInitCastagnoli() - updateCastagnoli = archUpdateCastagnoli - } else { - // Initialize the slicing-by-8 table. - castagnoliTable8 = slicingMakeTable(Castagnoli) - updateCastagnoli = func(crc uint32, p []byte) uint32 { - return slicingUpdate(crc, castagnoliTable8, p) - } - } -} - -// IEEETable is the table for the IEEE polynomial. -var IEEETable = simpleMakeTable(IEEE) - -// ieeeTable8 is the slicing8Table for IEEE -var ieeeTable8 *slicing8Table -var ieeeArchImpl bool -var updateIEEE func(crc uint32, p []byte) uint32 -var ieeeOnce sync.Once - -func ieeeInit() { - ieeeArchImpl = archAvailableIEEE() - - if ieeeArchImpl { - archInitIEEE() - updateIEEE = archUpdateIEEE - } else { - // Initialize the slicing-by-8 table. - ieeeTable8 = slicingMakeTable(IEEE) - updateIEEE = func(crc uint32, p []byte) uint32 { - return slicingUpdate(crc, ieeeTable8, p) - } - } -} - -// MakeTable returns a Table constructed from the specified polynomial. -// The contents of this Table must not be modified. -func MakeTable(poly uint32) *Table { - switch poly { - case IEEE: - ieeeOnce.Do(ieeeInit) - return IEEETable - case Castagnoli: - castagnoliOnce.Do(castagnoliInit) - return castagnoliTable - } - return simpleMakeTable(poly) -} - -// digest represents the partial evaluation of a checksum. -type digest struct { - crc uint32 - tab *Table -} - -// New creates a new hash.Hash32 computing the CRC-32 checksum -// using the polynomial represented by the Table. -// Its Sum method will lay the value out in big-endian byte order. -func New(tab *Table) hash.Hash32 { - if tab == IEEETable { - ieeeOnce.Do(ieeeInit) - } - return &digest{0, tab} -} - -// NewIEEE creates a new hash.Hash32 computing the CRC-32 checksum -// using the IEEE polynomial. -// Its Sum method will lay the value out in big-endian byte order. -func NewIEEE() hash.Hash32 { return New(IEEETable) } - -func (d *digest) Size() int { return Size } - -func (d *digest) BlockSize() int { return 1 } - -func (d *digest) Reset() { d.crc = 0 } - -// Update returns the result of adding the bytes in p to the crc. -func Update(crc uint32, tab *Table, p []byte) uint32 { - switch tab { - case castagnoliTable: - return updateCastagnoli(crc, p) - case IEEETable: - // Unfortunately, because IEEETable is exported, IEEE may be used without a - // call to MakeTable. We have to make sure it gets initialized in that case. - ieeeOnce.Do(ieeeInit) - return updateIEEE(crc, p) - default: - return simpleUpdate(crc, tab, p) - } -} - -func (d *digest) Write(p []byte) (n int, err error) { - switch d.tab { - case castagnoliTable: - d.crc = updateCastagnoli(d.crc, p) - case IEEETable: - // We only create digest objects through New() which takes care of - // initialization in this case. - d.crc = updateIEEE(d.crc, p) - default: - d.crc = simpleUpdate(d.crc, d.tab, p) - } - return len(p), nil -} - -func (d *digest) Sum32() uint32 { return d.crc } - -func (d *digest) Sum(in []byte) []byte { - s := d.Sum32() - return append(in, byte(s>>24), byte(s>>16), byte(s>>8), byte(s)) -} - -// Checksum returns the CRC-32 checksum of data -// using the polynomial represented by the Table. -func Checksum(data []byte, tab *Table) uint32 { return Update(0, tab, data) } - -// ChecksumIEEE returns the CRC-32 checksum of data -// using the IEEE polynomial. -func ChecksumIEEE(data []byte) uint32 { - ieeeOnce.Do(ieeeInit) - return updateIEEE(0, data) -} diff --git a/vendor/github.com/klauspost/crc32/crc32_amd64.go b/vendor/github.com/klauspost/crc32/crc32_amd64.go deleted file mode 100644 index af2a0b844..000000000 --- a/vendor/github.com/klauspost/crc32/crc32_amd64.go +++ /dev/null @@ -1,230 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !appengine,!gccgo - -// AMD64-specific hardware-assisted CRC32 algorithms. See crc32.go for a -// description of the interface that each architecture-specific file -// implements. - -package crc32 - -import "unsafe" - -// This file contains the code to call the SSE 4.2 version of the Castagnoli -// and IEEE CRC. - -// haveSSE41/haveSSE42/haveCLMUL are defined in crc_amd64.s and use -// CPUID to test for SSE 4.1, 4.2 and CLMUL support. -func haveSSE41() bool -func haveSSE42() bool -func haveCLMUL() bool - -// castagnoliSSE42 is defined in crc32_amd64.s and uses the SSE4.2 CRC32 -// instruction. -//go:noescape -func castagnoliSSE42(crc uint32, p []byte) uint32 - -// castagnoliSSE42Triple is defined in crc32_amd64.s and uses the SSE4.2 CRC32 -// instruction. -//go:noescape -func castagnoliSSE42Triple( - crcA, crcB, crcC uint32, - a, b, c []byte, - rounds uint32, -) (retA uint32, retB uint32, retC uint32) - -// ieeeCLMUL is defined in crc_amd64.s and uses the PCLMULQDQ -// instruction as well as SSE 4.1. -//go:noescape -func ieeeCLMUL(crc uint32, p []byte) uint32 - -var sse42 = haveSSE42() -var useFastIEEE = haveCLMUL() && haveSSE41() - -const castagnoliK1 = 168 -const castagnoliK2 = 1344 - -type sse42Table [4]Table - -var castagnoliSSE42TableK1 *sse42Table -var castagnoliSSE42TableK2 *sse42Table - -func archAvailableCastagnoli() bool { - return sse42 -} - -func archInitCastagnoli() { - if !sse42 { - panic("arch-specific Castagnoli not available") - } - castagnoliSSE42TableK1 = new(sse42Table) - castagnoliSSE42TableK2 = new(sse42Table) - // See description in updateCastagnoli. - // t[0][i] = CRC(i000, O) - // t[1][i] = CRC(0i00, O) - // t[2][i] = CRC(00i0, O) - // t[3][i] = CRC(000i, O) - // where O is a sequence of K zeros. - var tmp [castagnoliK2]byte - for b := 0; b < 4; b++ { - for i := 0; i < 256; i++ { - val := uint32(i) << uint32(b*8) - castagnoliSSE42TableK1[b][i] = castagnoliSSE42(val, tmp[:castagnoliK1]) - castagnoliSSE42TableK2[b][i] = castagnoliSSE42(val, tmp[:]) - } - } -} - -// castagnoliShift computes the CRC32-C of K1 or K2 zeroes (depending on the -// table given) with the given initial crc value. This corresponds to -// CRC(crc, O) in the description in updateCastagnoli. -func castagnoliShift(table *sse42Table, crc uint32) uint32 { - return table[3][crc>>24] ^ - table[2][(crc>>16)&0xFF] ^ - table[1][(crc>>8)&0xFF] ^ - table[0][crc&0xFF] -} - -func archUpdateCastagnoli(crc uint32, p []byte) uint32 { - if !sse42 { - panic("not available") - } - - // This method is inspired from the algorithm in Intel's white paper: - // "Fast CRC Computation for iSCSI Polynomial Using CRC32 Instruction" - // The same strategy of splitting the buffer in three is used but the - // combining calculation is different; the complete derivation is explained - // below. - // - // -- The basic idea -- - // - // The CRC32 instruction (available in SSE4.2) can process 8 bytes at a - // time. In recent Intel architectures the instruction takes 3 cycles; - // however the processor can pipeline up to three instructions if they - // don't depend on each other. - // - // Roughly this means that we can process three buffers in about the same - // time we can process one buffer. - // - // The idea is then to split the buffer in three, CRC the three pieces - // separately and then combine the results. - // - // Combining the results requires precomputed tables, so we must choose a - // fixed buffer length to optimize. The longer the length, the faster; but - // only buffers longer than this length will use the optimization. We choose - // two cutoffs and compute tables for both: - // - one around 512: 168*3=504 - // - one around 4KB: 1344*3=4032 - // - // -- The nitty gritty -- - // - // Let CRC(I, X) be the non-inverted CRC32-C of the sequence X (with - // initial non-inverted CRC I). This function has the following properties: - // (a) CRC(I, AB) = CRC(CRC(I, A), B) - // (b) CRC(I, A xor B) = CRC(I, A) xor CRC(0, B) - // - // Say we want to compute CRC(I, ABC) where A, B, C are three sequences of - // K bytes each, where K is a fixed constant. Let O be the sequence of K zero - // bytes. - // - // CRC(I, ABC) = CRC(I, ABO xor C) - // = CRC(I, ABO) xor CRC(0, C) - // = CRC(CRC(I, AB), O) xor CRC(0, C) - // = CRC(CRC(I, AO xor B), O) xor CRC(0, C) - // = CRC(CRC(I, AO) xor CRC(0, B), O) xor CRC(0, C) - // = CRC(CRC(CRC(I, A), O) xor CRC(0, B), O) xor CRC(0, C) - // - // The castagnoliSSE42Triple function can compute CRC(I, A), CRC(0, B), - // and CRC(0, C) efficiently. We just need to find a way to quickly compute - // CRC(uvwx, O) given a 4-byte initial value uvwx. We can precompute these - // values; since we can't have a 32-bit table, we break it up into four - // 8-bit tables: - // - // CRC(uvwx, O) = CRC(u000, O) xor - // CRC(0v00, O) xor - // CRC(00w0, O) xor - // CRC(000x, O) - // - // We can compute tables corresponding to the four terms for all 8-bit - // values. - - crc = ^crc - - // If a buffer is long enough to use the optimization, process the first few - // bytes to align the buffer to an 8 byte boundary (if necessary). - if len(p) >= castagnoliK1*3 { - delta := int(uintptr(unsafe.Pointer(&p[0])) & 7) - if delta != 0 { - delta = 8 - delta - crc = castagnoliSSE42(crc, p[:delta]) - p = p[delta:] - } - } - - // Process 3*K2 at a time. - for len(p) >= castagnoliK2*3 { - // Compute CRC(I, A), CRC(0, B), and CRC(0, C). - crcA, crcB, crcC := castagnoliSSE42Triple( - crc, 0, 0, - p, p[castagnoliK2:], p[castagnoliK2*2:], - castagnoliK2/24) - - // CRC(I, AB) = CRC(CRC(I, A), O) xor CRC(0, B) - crcAB := castagnoliShift(castagnoliSSE42TableK2, crcA) ^ crcB - // CRC(I, ABC) = CRC(CRC(I, AB), O) xor CRC(0, C) - crc = castagnoliShift(castagnoliSSE42TableK2, crcAB) ^ crcC - p = p[castagnoliK2*3:] - } - - // Process 3*K1 at a time. - for len(p) >= castagnoliK1*3 { - // Compute CRC(I, A), CRC(0, B), and CRC(0, C). - crcA, crcB, crcC := castagnoliSSE42Triple( - crc, 0, 0, - p, p[castagnoliK1:], p[castagnoliK1*2:], - castagnoliK1/24) - - // CRC(I, AB) = CRC(CRC(I, A), O) xor CRC(0, B) - crcAB := castagnoliShift(castagnoliSSE42TableK1, crcA) ^ crcB - // CRC(I, ABC) = CRC(CRC(I, AB), O) xor CRC(0, C) - crc = castagnoliShift(castagnoliSSE42TableK1, crcAB) ^ crcC - p = p[castagnoliK1*3:] - } - - // Use the simple implementation for what's left. - crc = castagnoliSSE42(crc, p) - return ^crc -} - -func archAvailableIEEE() bool { - return useFastIEEE -} - -var archIeeeTable8 *slicing8Table - -func archInitIEEE() { - if !useFastIEEE { - panic("not available") - } - // We still use slicing-by-8 for small buffers. - archIeeeTable8 = slicingMakeTable(IEEE) -} - -func archUpdateIEEE(crc uint32, p []byte) uint32 { - if !useFastIEEE { - panic("not available") - } - - if len(p) >= 64 { - left := len(p) & 15 - do := len(p) - left - crc = ^ieeeCLMUL(^crc, p[:do]) - p = p[do:] - } - if len(p) == 0 { - return crc - } - return slicingUpdate(crc, archIeeeTable8, p) -} diff --git a/vendor/github.com/klauspost/crc32/crc32_amd64.s b/vendor/github.com/klauspost/crc32/crc32_amd64.s deleted file mode 100644 index e8a7941ce..000000000 --- a/vendor/github.com/klauspost/crc32/crc32_amd64.s +++ /dev/null @@ -1,319 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build gc - -#define NOSPLIT 4 -#define RODATA 8 - -// castagnoliSSE42 updates the (non-inverted) crc with the given buffer. -// -// func castagnoliSSE42(crc uint32, p []byte) uint32 -TEXT ·castagnoliSSE42(SB), NOSPLIT, $0 - MOVL crc+0(FP), AX // CRC value - MOVQ p+8(FP), SI // data pointer - MOVQ p_len+16(FP), CX // len(p) - - // If there are fewer than 8 bytes to process, skip alignment. - CMPQ CX, $8 - JL less_than_8 - - MOVQ SI, BX - ANDQ $7, BX - JZ aligned - - // Process the first few bytes to 8-byte align the input. - - // BX = 8 - BX. We need to process this many bytes to align. - SUBQ $1, BX - XORQ $7, BX - - BTQ $0, BX - JNC align_2 - - CRC32B (SI), AX - DECQ CX - INCQ SI - -align_2: - BTQ $1, BX - JNC align_4 - - // CRC32W (SI), AX - BYTE $0x66; BYTE $0xf2; BYTE $0x0f; BYTE $0x38; BYTE $0xf1; BYTE $0x06 - - SUBQ $2, CX - ADDQ $2, SI - -align_4: - BTQ $2, BX - JNC aligned - - // CRC32L (SI), AX - BYTE $0xf2; BYTE $0x0f; BYTE $0x38; BYTE $0xf1; BYTE $0x06 - - SUBQ $4, CX - ADDQ $4, SI - -aligned: - // The input is now 8-byte aligned and we can process 8-byte chunks. - CMPQ CX, $8 - JL less_than_8 - - CRC32Q (SI), AX - ADDQ $8, SI - SUBQ $8, CX - JMP aligned - -less_than_8: - // We may have some bytes left over; process 4 bytes, then 2, then 1. - BTQ $2, CX - JNC less_than_4 - - // CRC32L (SI), AX - BYTE $0xf2; BYTE $0x0f; BYTE $0x38; BYTE $0xf1; BYTE $0x06 - ADDQ $4, SI - -less_than_4: - BTQ $1, CX - JNC less_than_2 - - // CRC32W (SI), AX - BYTE $0x66; BYTE $0xf2; BYTE $0x0f; BYTE $0x38; BYTE $0xf1; BYTE $0x06 - ADDQ $2, SI - -less_than_2: - BTQ $0, CX - JNC done - - CRC32B (SI), AX - -done: - MOVL AX, ret+32(FP) - RET - -// castagnoliSSE42Triple updates three (non-inverted) crcs with (24*rounds) -// bytes from each buffer. -// -// func castagnoliSSE42Triple( -// crc1, crc2, crc3 uint32, -// a, b, c []byte, -// rounds uint32, -// ) (retA uint32, retB uint32, retC uint32) -TEXT ·castagnoliSSE42Triple(SB), NOSPLIT, $0 - MOVL crcA+0(FP), AX - MOVL crcB+4(FP), CX - MOVL crcC+8(FP), DX - - MOVQ a+16(FP), R8 // data pointer - MOVQ b+40(FP), R9 // data pointer - MOVQ c+64(FP), R10 // data pointer - - MOVL rounds+88(FP), R11 - -loop: - CRC32Q (R8), AX - CRC32Q (R9), CX - CRC32Q (R10), DX - - CRC32Q 8(R8), AX - CRC32Q 8(R9), CX - CRC32Q 8(R10), DX - - CRC32Q 16(R8), AX - CRC32Q 16(R9), CX - CRC32Q 16(R10), DX - - ADDQ $24, R8 - ADDQ $24, R9 - ADDQ $24, R10 - - DECQ R11 - JNZ loop - - MOVL AX, retA+96(FP) - MOVL CX, retB+100(FP) - MOVL DX, retC+104(FP) - RET - -// func haveSSE42() bool -TEXT ·haveSSE42(SB), NOSPLIT, $0 - XORQ AX, AX - INCL AX - CPUID - SHRQ $20, CX - ANDQ $1, CX - MOVB CX, ret+0(FP) - RET - -// func haveCLMUL() bool -TEXT ·haveCLMUL(SB), NOSPLIT, $0 - XORQ AX, AX - INCL AX - CPUID - SHRQ $1, CX - ANDQ $1, CX - MOVB CX, ret+0(FP) - RET - -// func haveSSE41() bool -TEXT ·haveSSE41(SB), NOSPLIT, $0 - XORQ AX, AX - INCL AX - CPUID - SHRQ $19, CX - ANDQ $1, CX - MOVB CX, ret+0(FP) - RET - -// CRC32 polynomial data -// -// These constants are lifted from the -// Linux kernel, since they avoid the costly -// PSHUFB 16 byte reversal proposed in the -// original Intel paper. -DATA r2r1kp<>+0(SB)/8, $0x154442bd4 -DATA r2r1kp<>+8(SB)/8, $0x1c6e41596 -DATA r4r3kp<>+0(SB)/8, $0x1751997d0 -DATA r4r3kp<>+8(SB)/8, $0x0ccaa009e -DATA rupolykp<>+0(SB)/8, $0x1db710641 -DATA rupolykp<>+8(SB)/8, $0x1f7011641 -DATA r5kp<>+0(SB)/8, $0x163cd6124 - -GLOBL r2r1kp<>(SB), RODATA, $16 -GLOBL r4r3kp<>(SB), RODATA, $16 -GLOBL rupolykp<>(SB), RODATA, $16 -GLOBL r5kp<>(SB), RODATA, $8 - -// Based on http://www.intel.com/content/dam/www/public/us/en/documents/white-papers/fast-crc-computation-generic-polynomials-pclmulqdq-paper.pdf -// len(p) must be at least 64, and must be a multiple of 16. - -// func ieeeCLMUL(crc uint32, p []byte) uint32 -TEXT ·ieeeCLMUL(SB), NOSPLIT, $0 - MOVL crc+0(FP), X0 // Initial CRC value - MOVQ p+8(FP), SI // data pointer - MOVQ p_len+16(FP), CX // len(p) - - MOVOU (SI), X1 - MOVOU 16(SI), X2 - MOVOU 32(SI), X3 - MOVOU 48(SI), X4 - PXOR X0, X1 - ADDQ $64, SI // buf+=64 - SUBQ $64, CX // len-=64 - CMPQ CX, $64 // Less than 64 bytes left - JB remain64 - - MOVOA r2r1kp<>+0(SB), X0 - -loopback64: - MOVOA X1, X5 - MOVOA X2, X6 - MOVOA X3, X7 - MOVOA X4, X8 - - PCLMULQDQ $0, X0, X1 - PCLMULQDQ $0, X0, X2 - PCLMULQDQ $0, X0, X3 - PCLMULQDQ $0, X0, X4 - - // Load next early - MOVOU (SI), X11 - MOVOU 16(SI), X12 - MOVOU 32(SI), X13 - MOVOU 48(SI), X14 - - PCLMULQDQ $0x11, X0, X5 - PCLMULQDQ $0x11, X0, X6 - PCLMULQDQ $0x11, X0, X7 - PCLMULQDQ $0x11, X0, X8 - - PXOR X5, X1 - PXOR X6, X2 - PXOR X7, X3 - PXOR X8, X4 - - PXOR X11, X1 - PXOR X12, X2 - PXOR X13, X3 - PXOR X14, X4 - - ADDQ $0x40, DI - ADDQ $64, SI // buf+=64 - SUBQ $64, CX // len-=64 - CMPQ CX, $64 // Less than 64 bytes left? - JGE loopback64 - - // Fold result into a single register (X1) -remain64: - MOVOA r4r3kp<>+0(SB), X0 - - MOVOA X1, X5 - PCLMULQDQ $0, X0, X1 - PCLMULQDQ $0x11, X0, X5 - PXOR X5, X1 - PXOR X2, X1 - - MOVOA X1, X5 - PCLMULQDQ $0, X0, X1 - PCLMULQDQ $0x11, X0, X5 - PXOR X5, X1 - PXOR X3, X1 - - MOVOA X1, X5 - PCLMULQDQ $0, X0, X1 - PCLMULQDQ $0x11, X0, X5 - PXOR X5, X1 - PXOR X4, X1 - - // If there is less than 16 bytes left we are done - CMPQ CX, $16 - JB finish - - // Encode 16 bytes -remain16: - MOVOU (SI), X10 - MOVOA X1, X5 - PCLMULQDQ $0, X0, X1 - PCLMULQDQ $0x11, X0, X5 - PXOR X5, X1 - PXOR X10, X1 - SUBQ $16, CX - ADDQ $16, SI - CMPQ CX, $16 - JGE remain16 - -finish: - // Fold final result into 32 bits and return it - PCMPEQB X3, X3 - PCLMULQDQ $1, X1, X0 - PSRLDQ $8, X1 - PXOR X0, X1 - - MOVOA X1, X2 - MOVQ r5kp<>+0(SB), X0 - - // Creates 32 bit mask. Note that we don't care about upper half. - PSRLQ $32, X3 - - PSRLDQ $4, X2 - PAND X3, X1 - PCLMULQDQ $0, X0, X1 - PXOR X2, X1 - - MOVOA rupolykp<>+0(SB), X0 - - MOVOA X1, X2 - PAND X3, X1 - PCLMULQDQ $0x10, X0, X1 - PAND X3, X1 - PCLMULQDQ $0, X0, X1 - PXOR X2, X1 - - // PEXTRD $1, X1, AX (SSE 4.1) - BYTE $0x66; BYTE $0x0f; BYTE $0x3a - BYTE $0x16; BYTE $0xc8; BYTE $0x01 - MOVL AX, ret+32(FP) - - RET diff --git a/vendor/github.com/klauspost/crc32/crc32_amd64p32.go b/vendor/github.com/klauspost/crc32/crc32_amd64p32.go deleted file mode 100644 index 3222b06a5..000000000 --- a/vendor/github.com/klauspost/crc32/crc32_amd64p32.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !appengine,!gccgo - -package crc32 - -// This file contains the code to call the SSE 4.2 version of the Castagnoli -// CRC. - -// haveSSE42 is defined in crc32_amd64p32.s and uses CPUID to test for SSE 4.2 -// support. -func haveSSE42() bool - -// castagnoliSSE42 is defined in crc32_amd64p32.s and uses the SSE4.2 CRC32 -// instruction. -//go:noescape -func castagnoliSSE42(crc uint32, p []byte) uint32 - -var sse42 = haveSSE42() - -func archAvailableCastagnoli() bool { - return sse42 -} - -func archInitCastagnoli() { - if !sse42 { - panic("not available") - } - // No initialization necessary. -} - -func archUpdateCastagnoli(crc uint32, p []byte) uint32 { - if !sse42 { - panic("not available") - } - return castagnoliSSE42(crc, p) -} - -func archAvailableIEEE() bool { return false } -func archInitIEEE() { panic("not available") } -func archUpdateIEEE(crc uint32, p []byte) uint32 { panic("not available") } diff --git a/vendor/github.com/klauspost/crc32/crc32_amd64p32.s b/vendor/github.com/klauspost/crc32/crc32_amd64p32.s deleted file mode 100644 index a578d685c..000000000 --- a/vendor/github.com/klauspost/crc32/crc32_amd64p32.s +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build gc - -#define NOSPLIT 4 -#define RODATA 8 - -// func castagnoliSSE42(crc uint32, p []byte) uint32 -TEXT ·castagnoliSSE42(SB), NOSPLIT, $0 - MOVL crc+0(FP), AX // CRC value - MOVL p+4(FP), SI // data pointer - MOVL p_len+8(FP), CX // len(p) - - NOTL AX - - // If there's less than 8 bytes to process, we do it byte-by-byte. - CMPQ CX, $8 - JL cleanup - - // Process individual bytes until the input is 8-byte aligned. -startup: - MOVQ SI, BX - ANDQ $7, BX - JZ aligned - - CRC32B (SI), AX - DECQ CX - INCQ SI - JMP startup - -aligned: - // The input is now 8-byte aligned and we can process 8-byte chunks. - CMPQ CX, $8 - JL cleanup - - CRC32Q (SI), AX - ADDQ $8, SI - SUBQ $8, CX - JMP aligned - -cleanup: - // We may have some bytes left over that we process one at a time. - CMPQ CX, $0 - JE done - - CRC32B (SI), AX - INCQ SI - DECQ CX - JMP cleanup - -done: - NOTL AX - MOVL AX, ret+16(FP) - RET - -// func haveSSE42() bool -TEXT ·haveSSE42(SB), NOSPLIT, $0 - XORQ AX, AX - INCL AX - CPUID - SHRQ $20, CX - ANDQ $1, CX - MOVB CX, ret+0(FP) - RET - diff --git a/vendor/github.com/klauspost/crc32/crc32_generic.go b/vendor/github.com/klauspost/crc32/crc32_generic.go deleted file mode 100644 index abacbb663..000000000 --- a/vendor/github.com/klauspost/crc32/crc32_generic.go +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This file contains CRC32 algorithms that are not specific to any architecture -// and don't use hardware acceleration. -// -// The simple (and slow) CRC32 implementation only uses a 256*4 bytes table. -// -// The slicing-by-8 algorithm is a faster implementation that uses a bigger -// table (8*256*4 bytes). - -package crc32 - -// simpleMakeTable allocates and constructs a Table for the specified -// polynomial. The table is suitable for use with the simple algorithm -// (simpleUpdate). -func simpleMakeTable(poly uint32) *Table { - t := new(Table) - simplePopulateTable(poly, t) - return t -} - -// simplePopulateTable constructs a Table for the specified polynomial, suitable -// for use with simpleUpdate. -func simplePopulateTable(poly uint32, t *Table) { - for i := 0; i < 256; i++ { - crc := uint32(i) - for j := 0; j < 8; j++ { - if crc&1 == 1 { - crc = (crc >> 1) ^ poly - } else { - crc >>= 1 - } - } - t[i] = crc - } -} - -// simpleUpdate uses the simple algorithm to update the CRC, given a table that -// was previously computed using simpleMakeTable. -func simpleUpdate(crc uint32, tab *Table, p []byte) uint32 { - crc = ^crc - for _, v := range p { - crc = tab[byte(crc)^v] ^ (crc >> 8) - } - return ^crc -} - -// Use slicing-by-8 when payload >= this value. -const slicing8Cutoff = 16 - -// slicing8Table is array of 8 Tables, used by the slicing-by-8 algorithm. -type slicing8Table [8]Table - -// slicingMakeTable constructs a slicing8Table for the specified polynomial. The -// table is suitable for use with the slicing-by-8 algorithm (slicingUpdate). -func slicingMakeTable(poly uint32) *slicing8Table { - t := new(slicing8Table) - simplePopulateTable(poly, &t[0]) - for i := 0; i < 256; i++ { - crc := t[0][i] - for j := 1; j < 8; j++ { - crc = t[0][crc&0xFF] ^ (crc >> 8) - t[j][i] = crc - } - } - return t -} - -// slicingUpdate uses the slicing-by-8 algorithm to update the CRC, given a -// table that was previously computed using slicingMakeTable. -func slicingUpdate(crc uint32, tab *slicing8Table, p []byte) uint32 { - if len(p) >= slicing8Cutoff { - crc = ^crc - for len(p) > 8 { - crc ^= uint32(p[0]) | uint32(p[1])<<8 | uint32(p[2])<<16 | uint32(p[3])<<24 - crc = tab[0][p[7]] ^ tab[1][p[6]] ^ tab[2][p[5]] ^ tab[3][p[4]] ^ - tab[4][crc>>24] ^ tab[5][(crc>>16)&0xFF] ^ - tab[6][(crc>>8)&0xFF] ^ tab[7][crc&0xFF] - p = p[8:] - } - crc = ^crc - } - if len(p) == 0 { - return crc - } - return simpleUpdate(crc, &tab[0], p) -} diff --git a/vendor/github.com/klauspost/crc32/crc32_otherarch.go b/vendor/github.com/klauspost/crc32/crc32_otherarch.go deleted file mode 100644 index cc960764b..000000000 --- a/vendor/github.com/klauspost/crc32/crc32_otherarch.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !amd64,!amd64p32,!s390x - -package crc32 - -func archAvailableIEEE() bool { return false } -func archInitIEEE() { panic("not available") } -func archUpdateIEEE(crc uint32, p []byte) uint32 { panic("not available") } - -func archAvailableCastagnoli() bool { return false } -func archInitCastagnoli() { panic("not available") } -func archUpdateCastagnoli(crc uint32, p []byte) uint32 { panic("not available") } diff --git a/vendor/github.com/klauspost/crc32/crc32_s390x.go b/vendor/github.com/klauspost/crc32/crc32_s390x.go deleted file mode 100644 index ce96f0328..000000000 --- a/vendor/github.com/klauspost/crc32/crc32_s390x.go +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build s390x - -package crc32 - -const ( - vxMinLen = 64 - vxAlignMask = 15 // align to 16 bytes -) - -// hasVectorFacility reports whether the machine has the z/Architecture -// vector facility installed and enabled. -func hasVectorFacility() bool - -var hasVX = hasVectorFacility() - -// vectorizedCastagnoli implements CRC32 using vector instructions. -// It is defined in crc32_s390x.s. -//go:noescape -func vectorizedCastagnoli(crc uint32, p []byte) uint32 - -// vectorizedIEEE implements CRC32 using vector instructions. -// It is defined in crc32_s390x.s. -//go:noescape -func vectorizedIEEE(crc uint32, p []byte) uint32 - -func archAvailableCastagnoli() bool { - return hasVX -} - -var archCastagnoliTable8 *slicing8Table - -func archInitCastagnoli() { - if !hasVX { - panic("not available") - } - // We still use slicing-by-8 for small buffers. - archCastagnoliTable8 = slicingMakeTable(Castagnoli) -} - -// archUpdateCastagnoli calculates the checksum of p using -// vectorizedCastagnoli. -func archUpdateCastagnoli(crc uint32, p []byte) uint32 { - if !hasVX { - panic("not available") - } - // Use vectorized function if data length is above threshold. - if len(p) >= vxMinLen { - aligned := len(p) & ^vxAlignMask - crc = vectorizedCastagnoli(crc, p[:aligned]) - p = p[aligned:] - } - if len(p) == 0 { - return crc - } - return slicingUpdate(crc, archCastagnoliTable8, p) -} - -func archAvailableIEEE() bool { - return hasVX -} - -var archIeeeTable8 *slicing8Table - -func archInitIEEE() { - if !hasVX { - panic("not available") - } - // We still use slicing-by-8 for small buffers. - archIeeeTable8 = slicingMakeTable(IEEE) -} - -// archUpdateIEEE calculates the checksum of p using vectorizedIEEE. -func archUpdateIEEE(crc uint32, p []byte) uint32 { - if !hasVX { - panic("not available") - } - // Use vectorized function if data length is above threshold. - if len(p) >= vxMinLen { - aligned := len(p) & ^vxAlignMask - crc = vectorizedIEEE(crc, p[:aligned]) - p = p[aligned:] - } - if len(p) == 0 { - return crc - } - return slicingUpdate(crc, archIeeeTable8, p) -} diff --git a/vendor/github.com/klauspost/crc32/crc32_s390x.s b/vendor/github.com/klauspost/crc32/crc32_s390x.s deleted file mode 100644 index e980ca29d..000000000 --- a/vendor/github.com/klauspost/crc32/crc32_s390x.s +++ /dev/null @@ -1,249 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build s390x - -#include "textflag.h" - -// Vector register range containing CRC-32 constants - -#define CONST_PERM_LE2BE V9 -#define CONST_R2R1 V10 -#define CONST_R4R3 V11 -#define CONST_R5 V12 -#define CONST_RU_POLY V13 -#define CONST_CRC_POLY V14 - -// The CRC-32 constant block contains reduction constants to fold and -// process particular chunks of the input data stream in parallel. -// -// Note that the constant definitions below are extended in order to compute -// intermediate results with a single VECTOR GALOIS FIELD MULTIPLY instruction. -// The rightmost doubleword can be 0 to prevent contribution to the result or -// can be multiplied by 1 to perform an XOR without the need for a separate -// VECTOR EXCLUSIVE OR instruction. -// -// The polynomials used are bit-reflected: -// -// IEEE: P'(x) = 0x0edb88320 -// Castagnoli: P'(x) = 0x082f63b78 - -// IEEE polynomial constants -DATA ·crcleconskp+0(SB)/8, $0x0F0E0D0C0B0A0908 // LE-to-BE mask -DATA ·crcleconskp+8(SB)/8, $0x0706050403020100 -DATA ·crcleconskp+16(SB)/8, $0x00000001c6e41596 // R2 -DATA ·crcleconskp+24(SB)/8, $0x0000000154442bd4 // R1 -DATA ·crcleconskp+32(SB)/8, $0x00000000ccaa009e // R4 -DATA ·crcleconskp+40(SB)/8, $0x00000001751997d0 // R3 -DATA ·crcleconskp+48(SB)/8, $0x0000000000000000 -DATA ·crcleconskp+56(SB)/8, $0x0000000163cd6124 // R5 -DATA ·crcleconskp+64(SB)/8, $0x0000000000000000 -DATA ·crcleconskp+72(SB)/8, $0x00000001F7011641 // u' -DATA ·crcleconskp+80(SB)/8, $0x0000000000000000 -DATA ·crcleconskp+88(SB)/8, $0x00000001DB710641 // P'(x) << 1 - -GLOBL ·crcleconskp(SB), RODATA, $144 - -// Castagonli Polynomial constants -DATA ·crccleconskp+0(SB)/8, $0x0F0E0D0C0B0A0908 // LE-to-BE mask -DATA ·crccleconskp+8(SB)/8, $0x0706050403020100 -DATA ·crccleconskp+16(SB)/8, $0x000000009e4addf8 // R2 -DATA ·crccleconskp+24(SB)/8, $0x00000000740eef02 // R1 -DATA ·crccleconskp+32(SB)/8, $0x000000014cd00bd6 // R4 -DATA ·crccleconskp+40(SB)/8, $0x00000000f20c0dfe // R3 -DATA ·crccleconskp+48(SB)/8, $0x0000000000000000 -DATA ·crccleconskp+56(SB)/8, $0x00000000dd45aab8 // R5 -DATA ·crccleconskp+64(SB)/8, $0x0000000000000000 -DATA ·crccleconskp+72(SB)/8, $0x00000000dea713f1 // u' -DATA ·crccleconskp+80(SB)/8, $0x0000000000000000 -DATA ·crccleconskp+88(SB)/8, $0x0000000105ec76f0 // P'(x) << 1 - -GLOBL ·crccleconskp(SB), RODATA, $144 - -// func hasVectorFacility() bool -TEXT ·hasVectorFacility(SB), NOSPLIT, $24-1 - MOVD $x-24(SP), R1 - XC $24, 0(R1), 0(R1) // clear the storage - MOVD $2, R0 // R0 is the number of double words stored -1 - WORD $0xB2B01000 // STFLE 0(R1) - XOR R0, R0 // reset the value of R0 - MOVBZ z-8(SP), R1 - AND $0x40, R1 - BEQ novector - -vectorinstalled: - // check if the vector instruction has been enabled - VLEIB $0, $0xF, V16 - VLGVB $0, V16, R1 - CMPBNE R1, $0xF, novector - MOVB $1, ret+0(FP) // have vx - RET - -novector: - MOVB $0, ret+0(FP) // no vx - RET - -// The CRC-32 function(s) use these calling conventions: -// -// Parameters: -// -// R2: Initial CRC value, typically ~0; and final CRC (return) value. -// R3: Input buffer pointer, performance might be improved if the -// buffer is on a doubleword boundary. -// R4: Length of the buffer, must be 64 bytes or greater. -// -// Register usage: -// -// R5: CRC-32 constant pool base pointer. -// V0: Initial CRC value and intermediate constants and results. -// V1..V4: Data for CRC computation. -// V5..V8: Next data chunks that are fetched from the input buffer. -// -// V9..V14: CRC-32 constants. - -// func vectorizedIEEE(crc uint32, p []byte) uint32 -TEXT ·vectorizedIEEE(SB), NOSPLIT, $0 - MOVWZ crc+0(FP), R2 // R2 stores the CRC value - MOVD p+8(FP), R3 // data pointer - MOVD p_len+16(FP), R4 // len(p) - - MOVD $·crcleconskp(SB), R5 - BR vectorizedBody<>(SB) - -// func vectorizedCastagnoli(crc uint32, p []byte) uint32 -TEXT ·vectorizedCastagnoli(SB), NOSPLIT, $0 - MOVWZ crc+0(FP), R2 // R2 stores the CRC value - MOVD p+8(FP), R3 // data pointer - MOVD p_len+16(FP), R4 // len(p) - - // R5: crc-32 constant pool base pointer, constant is used to reduce crc - MOVD $·crccleconskp(SB), R5 - BR vectorizedBody<>(SB) - -TEXT vectorizedBody<>(SB), NOSPLIT, $0 - XOR $0xffffffff, R2 // NOTW R2 - VLM 0(R5), CONST_PERM_LE2BE, CONST_CRC_POLY - - // Load the initial CRC value into the rightmost word of V0 - VZERO V0 - VLVGF $3, R2, V0 - - // Crash if the input size is less than 64-bytes. - CMP R4, $64 - BLT crash - - // Load a 64-byte data chunk and XOR with CRC - VLM 0(R3), V1, V4 // 64-bytes into V1..V4 - - // Reflect the data if the CRC operation is in the bit-reflected domain - VPERM V1, V1, CONST_PERM_LE2BE, V1 - VPERM V2, V2, CONST_PERM_LE2BE, V2 - VPERM V3, V3, CONST_PERM_LE2BE, V3 - VPERM V4, V4, CONST_PERM_LE2BE, V4 - - VX V0, V1, V1 // V1 ^= CRC - ADD $64, R3 // BUF = BUF + 64 - ADD $(-64), R4 - - // Check remaining buffer size and jump to proper folding method - CMP R4, $64 - BLT less_than_64bytes - -fold_64bytes_loop: - // Load the next 64-byte data chunk into V5 to V8 - VLM 0(R3), V5, V8 - VPERM V5, V5, CONST_PERM_LE2BE, V5 - VPERM V6, V6, CONST_PERM_LE2BE, V6 - VPERM V7, V7, CONST_PERM_LE2BE, V7 - VPERM V8, V8, CONST_PERM_LE2BE, V8 - - // Perform a GF(2) multiplication of the doublewords in V1 with - // the reduction constants in V0. The intermediate result is - // then folded (accumulated) with the next data chunk in V5 and - // stored in V1. Repeat this step for the register contents - // in V2, V3, and V4 respectively. - - VGFMAG CONST_R2R1, V1, V5, V1 - VGFMAG CONST_R2R1, V2, V6, V2 - VGFMAG CONST_R2R1, V3, V7, V3 - VGFMAG CONST_R2R1, V4, V8, V4 - - // Adjust buffer pointer and length for next loop - ADD $64, R3 // BUF = BUF + 64 - ADD $(-64), R4 // LEN = LEN - 64 - - CMP R4, $64 - BGE fold_64bytes_loop - -less_than_64bytes: - // Fold V1 to V4 into a single 128-bit value in V1 - VGFMAG CONST_R4R3, V1, V2, V1 - VGFMAG CONST_R4R3, V1, V3, V1 - VGFMAG CONST_R4R3, V1, V4, V1 - - // Check whether to continue with 64-bit folding - CMP R4, $16 - BLT final_fold - -fold_16bytes_loop: - VL 0(R3), V2 // Load next data chunk - VPERM V2, V2, CONST_PERM_LE2BE, V2 - - VGFMAG CONST_R4R3, V1, V2, V1 // Fold next data chunk - - // Adjust buffer pointer and size for folding next data chunk - ADD $16, R3 - ADD $-16, R4 - - // Process remaining data chunks - CMP R4, $16 - BGE fold_16bytes_loop - -final_fold: - VLEIB $7, $0x40, V9 - VSRLB V9, CONST_R4R3, V0 - VLEIG $0, $1, V0 - - VGFMG V0, V1, V1 - - VLEIB $7, $0x20, V9 // Shift by words - VSRLB V9, V1, V2 // Store remaining bits in V2 - VUPLLF V1, V1 // Split rightmost doubleword - VGFMAG CONST_R5, V1, V2, V1 // V1 = (V1 * R5) XOR V2 - - // The input values to the Barret reduction are the degree-63 polynomial - // in V1 (R(x)), degree-32 generator polynomial, and the reduction - // constant u. The Barret reduction result is the CRC value of R(x) mod - // P(x). - // - // The Barret reduction algorithm is defined as: - // - // 1. T1(x) = floor( R(x) / x^32 ) GF2MUL u - // 2. T2(x) = floor( T1(x) / x^32 ) GF2MUL P(x) - // 3. C(x) = R(x) XOR T2(x) mod x^32 - // - // Note: To compensate the division by x^32, use the vector unpack - // instruction to move the leftmost word into the leftmost doubleword - // of the vector register. The rightmost doubleword is multiplied - // with zero to not contribute to the intermedate results. - - // T1(x) = floor( R(x) / x^32 ) GF2MUL u - VUPLLF V1, V2 - VGFMG CONST_RU_POLY, V2, V2 - - // Compute the GF(2) product of the CRC polynomial in VO with T1(x) in - // V2 and XOR the intermediate result, T2(x), with the value in V1. - // The final result is in the rightmost word of V2. - - VUPLLF V2, V2 - VGFMAG CONST_CRC_POLY, V2, V1, V2 - -done: - VLGVF $2, V2, R2 - XOR $0xffffffff, R2 // NOTW R2 - MOVWZ R2, ret + 32(FP) - RET - -crash: - MOVD $0, (R0) // input size is less than 64-bytes diff --git a/vendor/github.com/lib/pq/CONTRIBUTING.md b/vendor/github.com/lib/pq/CONTRIBUTING.md deleted file mode 100644 index 84c937f15..000000000 --- a/vendor/github.com/lib/pq/CONTRIBUTING.md +++ /dev/null @@ -1,29 +0,0 @@ -## Contributing to pq - -`pq` has a backlog of pull requests, but contributions are still very -much welcome. You can help with patch review, submitting bug reports, -or adding new functionality. There is no formal style guide, but -please conform to the style of existing code and general Go formatting -conventions when submitting patches. - -### Patch review - -Help review existing open pull requests by commenting on the code or -proposed functionality. - -### Bug reports - -We appreciate any bug reports, but especially ones with self-contained -(doesn't depend on code outside of pq), minimal (can't be simplified -further) test cases. It's especially helpful if you can submit a pull -request with just the failing test case (you'll probably want to -pattern it after the tests in -[conn_test.go](https://github.com/lib/pq/blob/master/conn_test.go). - -### New functionality - -There are a number of pending patches for new functionality, so -additional feature patches will take a while to merge. Still, patches -are generally reviewed based on usefulness and complexity in addition -to time-in-queue, so if you have a knockout idea, take a shot. Feel -free to open an issue discussion your proposed patch beforehand. diff --git a/vendor/github.com/lib/pq/LICENSE.md b/vendor/github.com/lib/pq/LICENSE.md deleted file mode 100644 index 5773904a3..000000000 --- a/vendor/github.com/lib/pq/LICENSE.md +++ /dev/null @@ -1,8 +0,0 @@ -Copyright (c) 2011-2013, 'pq' Contributors -Portions Copyright (C) 2011 Blake Mizerany - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/lib/pq/README.md b/vendor/github.com/lib/pq/README.md deleted file mode 100644 index d71f3c2c3..000000000 --- a/vendor/github.com/lib/pq/README.md +++ /dev/null @@ -1,95 +0,0 @@ -# pq - A pure Go postgres driver for Go's database/sql package - -[![GoDoc](https://godoc.org/github.com/lib/pq?status.svg)](https://godoc.org/github.com/lib/pq) -[![Build Status](https://travis-ci.org/lib/pq.svg?branch=master)](https://travis-ci.org/lib/pq) - -## Install - - go get github.com/lib/pq - -## Docs - -For detailed documentation and basic usage examples, please see the package -documentation at . - -## Tests - -`go test` is used for testing. See [TESTS.md](TESTS.md) for more details. - -## Features - -* SSL -* Handles bad connections for `database/sql` -* Scan `time.Time` correctly (i.e. `timestamp[tz]`, `time[tz]`, `date`) -* Scan binary blobs correctly (i.e. `bytea`) -* Package for `hstore` support -* COPY FROM support -* pq.ParseURL for converting urls to connection strings for sql.Open. -* Many libpq compatible environment variables -* Unix socket support -* Notifications: `LISTEN`/`NOTIFY` -* pgpass support - -## Future / Things you can help with - -* Better COPY FROM / COPY TO (see discussion in #181) - -## Thank you (alphabetical) - -Some of these contributors are from the original library `bmizerany/pq.go` whose -code still exists in here. - -* Andy Balholm (andybalholm) -* Ben Berkert (benburkert) -* Benjamin Heatwole (bheatwole) -* Bill Mill (llimllib) -* Bjørn Madsen (aeons) -* Blake Gentry (bgentry) -* Brad Fitzpatrick (bradfitz) -* Charlie Melbye (cmelbye) -* Chris Bandy (cbandy) -* Chris Gilling (cgilling) -* Chris Walsh (cwds) -* Dan Sosedoff (sosedoff) -* Daniel Farina (fdr) -* Eric Chlebek (echlebek) -* Eric Garrido (minusnine) -* Eric Urban (hydrogen18) -* Everyone at The Go Team -* Evan Shaw (edsrzf) -* Ewan Chou (coocood) -* Fazal Majid (fazalmajid) -* Federico Romero (federomero) -* Fumin (fumin) -* Gary Burd (garyburd) -* Heroku (heroku) -* James Pozdena (jpoz) -* Jason McVetta (jmcvetta) -* Jeremy Jay (pbnjay) -* Joakim Sernbrant (serbaut) -* John Gallagher (jgallagher) -* Jonathan Rudenberg (titanous) -* Joël Stemmer (jstemmer) -* Kamil Kisiel (kisielk) -* Kelly Dunn (kellydunn) -* Keith Rarick (kr) -* Kir Shatrov (kirs) -* Lann Martin (lann) -* Maciek Sakrejda (uhoh-itsmaciek) -* Marc Brinkmann (mbr) -* Marko Tiikkaja (johto) -* Matt Newberry (MattNewberry) -* Matt Robenolt (mattrobenolt) -* Martin Olsen (martinolsen) -* Mike Lewis (mikelikespie) -* Nicolas Patry (Narsil) -* Oliver Tonnhofer (olt) -* Patrick Hayes (phayes) -* Paul Hammond (paulhammond) -* Ryan Smith (ryandotsmith) -* Samuel Stauffer (samuel) -* Timothée Peignier (cyberdelia) -* Travis Cline (tmc) -* TruongSinh Tran-Nguyen (truongsinh) -* Yaismel Miranda (ympons) -* notedit (notedit) diff --git a/vendor/github.com/lib/pq/TESTS.md b/vendor/github.com/lib/pq/TESTS.md deleted file mode 100644 index f05021115..000000000 --- a/vendor/github.com/lib/pq/TESTS.md +++ /dev/null @@ -1,33 +0,0 @@ -# Tests - -## Running Tests - -`go test` is used for testing. A running PostgreSQL -server is required, with the ability to log in. The -database to connect to test with is "pqgotest," on -"localhost" but these can be overridden using [environment -variables](https://www.postgresql.org/docs/9.3/static/libpq-envars.html). - -Example: - - PGHOST=/run/postgresql go test - -## Benchmarks - -A benchmark suite can be run as part of the tests: - - go test -bench . - -## Example setup (Docker) - -Run a postgres container: - -``` -docker run --expose 5432:5432 postgres -``` - -Run tests: - -``` -PGHOST=localhost PGPORT=5432 PGUSER=postgres PGSSLMODE=disable PGDATABASE=postgres go test -``` diff --git a/vendor/github.com/lib/pq/array.go b/vendor/github.com/lib/pq/array.go deleted file mode 100644 index e4933e227..000000000 --- a/vendor/github.com/lib/pq/array.go +++ /dev/null @@ -1,756 +0,0 @@ -package pq - -import ( - "bytes" - "database/sql" - "database/sql/driver" - "encoding/hex" - "fmt" - "reflect" - "strconv" - "strings" -) - -var typeByteSlice = reflect.TypeOf([]byte{}) -var typeDriverValuer = reflect.TypeOf((*driver.Valuer)(nil)).Elem() -var typeSQLScanner = reflect.TypeOf((*sql.Scanner)(nil)).Elem() - -// Array returns the optimal driver.Valuer and sql.Scanner for an array or -// slice of any dimension. -// -// For example: -// db.Query(`SELECT * FROM t WHERE id = ANY($1)`, pq.Array([]int{235, 401})) -// -// var x []sql.NullInt64 -// db.QueryRow('SELECT ARRAY[235, 401]').Scan(pq.Array(&x)) -// -// Scanning multi-dimensional arrays is not supported. Arrays where the lower -// bound is not one (such as `[0:0]={1}') are not supported. -func Array(a interface{}) interface { - driver.Valuer - sql.Scanner -} { - switch a := a.(type) { - case []bool: - return (*BoolArray)(&a) - case []float64: - return (*Float64Array)(&a) - case []int64: - return (*Int64Array)(&a) - case []string: - return (*StringArray)(&a) - - case *[]bool: - return (*BoolArray)(a) - case *[]float64: - return (*Float64Array)(a) - case *[]int64: - return (*Int64Array)(a) - case *[]string: - return (*StringArray)(a) - } - - return GenericArray{a} -} - -// ArrayDelimiter may be optionally implemented by driver.Valuer or sql.Scanner -// to override the array delimiter used by GenericArray. -type ArrayDelimiter interface { - // ArrayDelimiter returns the delimiter character(s) for this element's type. - ArrayDelimiter() string -} - -// BoolArray represents a one-dimensional array of the PostgreSQL boolean type. -type BoolArray []bool - -// Scan implements the sql.Scanner interface. -func (a *BoolArray) Scan(src interface{}) error { - switch src := src.(type) { - case []byte: - return a.scanBytes(src) - case string: - return a.scanBytes([]byte(src)) - case nil: - *a = nil - return nil - } - - return fmt.Errorf("pq: cannot convert %T to BoolArray", src) -} - -func (a *BoolArray) scanBytes(src []byte) error { - elems, err := scanLinearArray(src, []byte{','}, "BoolArray") - if err != nil { - return err - } - if *a != nil && len(elems) == 0 { - *a = (*a)[:0] - } else { - b := make(BoolArray, len(elems)) - for i, v := range elems { - if len(v) != 1 { - return fmt.Errorf("pq: could not parse boolean array index %d: invalid boolean %q", i, v) - } - switch v[0] { - case 't': - b[i] = true - case 'f': - b[i] = false - default: - return fmt.Errorf("pq: could not parse boolean array index %d: invalid boolean %q", i, v) - } - } - *a = b - } - return nil -} - -// Value implements the driver.Valuer interface. -func (a BoolArray) Value() (driver.Value, error) { - if a == nil { - return nil, nil - } - - if n := len(a); n > 0 { - // There will be exactly two curly brackets, N bytes of values, - // and N-1 bytes of delimiters. - b := make([]byte, 1+2*n) - - for i := 0; i < n; i++ { - b[2*i] = ',' - if a[i] { - b[1+2*i] = 't' - } else { - b[1+2*i] = 'f' - } - } - - b[0] = '{' - b[2*n] = '}' - - return string(b), nil - } - - return "{}", nil -} - -// ByteaArray represents a one-dimensional array of the PostgreSQL bytea type. -type ByteaArray [][]byte - -// Scan implements the sql.Scanner interface. -func (a *ByteaArray) Scan(src interface{}) error { - switch src := src.(type) { - case []byte: - return a.scanBytes(src) - case string: - return a.scanBytes([]byte(src)) - case nil: - *a = nil - return nil - } - - return fmt.Errorf("pq: cannot convert %T to ByteaArray", src) -} - -func (a *ByteaArray) scanBytes(src []byte) error { - elems, err := scanLinearArray(src, []byte{','}, "ByteaArray") - if err != nil { - return err - } - if *a != nil && len(elems) == 0 { - *a = (*a)[:0] - } else { - b := make(ByteaArray, len(elems)) - for i, v := range elems { - b[i], err = parseBytea(v) - if err != nil { - return fmt.Errorf("could not parse bytea array index %d: %s", i, err.Error()) - } - } - *a = b - } - return nil -} - -// Value implements the driver.Valuer interface. It uses the "hex" format which -// is only supported on PostgreSQL 9.0 or newer. -func (a ByteaArray) Value() (driver.Value, error) { - if a == nil { - return nil, nil - } - - if n := len(a); n > 0 { - // There will be at least two curly brackets, 2*N bytes of quotes, - // 3*N bytes of hex formatting, and N-1 bytes of delimiters. - size := 1 + 6*n - for _, x := range a { - size += hex.EncodedLen(len(x)) - } - - b := make([]byte, size) - - for i, s := 0, b; i < n; i++ { - o := copy(s, `,"\\x`) - o += hex.Encode(s[o:], a[i]) - s[o] = '"' - s = s[o+1:] - } - - b[0] = '{' - b[size-1] = '}' - - return string(b), nil - } - - return "{}", nil -} - -// Float64Array represents a one-dimensional array of the PostgreSQL double -// precision type. -type Float64Array []float64 - -// Scan implements the sql.Scanner interface. -func (a *Float64Array) Scan(src interface{}) error { - switch src := src.(type) { - case []byte: - return a.scanBytes(src) - case string: - return a.scanBytes([]byte(src)) - case nil: - *a = nil - return nil - } - - return fmt.Errorf("pq: cannot convert %T to Float64Array", src) -} - -func (a *Float64Array) scanBytes(src []byte) error { - elems, err := scanLinearArray(src, []byte{','}, "Float64Array") - if err != nil { - return err - } - if *a != nil && len(elems) == 0 { - *a = (*a)[:0] - } else { - b := make(Float64Array, len(elems)) - for i, v := range elems { - if b[i], err = strconv.ParseFloat(string(v), 64); err != nil { - return fmt.Errorf("pq: parsing array element index %d: %v", i, err) - } - } - *a = b - } - return nil -} - -// Value implements the driver.Valuer interface. -func (a Float64Array) Value() (driver.Value, error) { - if a == nil { - return nil, nil - } - - if n := len(a); n > 0 { - // There will be at least two curly brackets, N bytes of values, - // and N-1 bytes of delimiters. - b := make([]byte, 1, 1+2*n) - b[0] = '{' - - b = strconv.AppendFloat(b, a[0], 'f', -1, 64) - for i := 1; i < n; i++ { - b = append(b, ',') - b = strconv.AppendFloat(b, a[i], 'f', -1, 64) - } - - return string(append(b, '}')), nil - } - - return "{}", nil -} - -// GenericArray implements the driver.Valuer and sql.Scanner interfaces for -// an array or slice of any dimension. -type GenericArray struct{ A interface{} } - -func (GenericArray) evaluateDestination(rt reflect.Type) (reflect.Type, func([]byte, reflect.Value) error, string) { - var assign func([]byte, reflect.Value) error - var del = "," - - // TODO calculate the assign function for other types - // TODO repeat this section on the element type of arrays or slices (multidimensional) - { - if reflect.PtrTo(rt).Implements(typeSQLScanner) { - // dest is always addressable because it is an element of a slice. - assign = func(src []byte, dest reflect.Value) (err error) { - ss := dest.Addr().Interface().(sql.Scanner) - if src == nil { - err = ss.Scan(nil) - } else { - err = ss.Scan(src) - } - return - } - goto FoundType - } - - assign = func([]byte, reflect.Value) error { - return fmt.Errorf("pq: scanning to %s is not implemented; only sql.Scanner", rt) - } - } - -FoundType: - - if ad, ok := reflect.Zero(rt).Interface().(ArrayDelimiter); ok { - del = ad.ArrayDelimiter() - } - - return rt, assign, del -} - -// Scan implements the sql.Scanner interface. -func (a GenericArray) Scan(src interface{}) error { - dpv := reflect.ValueOf(a.A) - switch { - case dpv.Kind() != reflect.Ptr: - return fmt.Errorf("pq: destination %T is not a pointer to array or slice", a.A) - case dpv.IsNil(): - return fmt.Errorf("pq: destination %T is nil", a.A) - } - - dv := dpv.Elem() - switch dv.Kind() { - case reflect.Slice: - case reflect.Array: - default: - return fmt.Errorf("pq: destination %T is not a pointer to array or slice", a.A) - } - - switch src := src.(type) { - case []byte: - return a.scanBytes(src, dv) - case string: - return a.scanBytes([]byte(src), dv) - case nil: - if dv.Kind() == reflect.Slice { - dv.Set(reflect.Zero(dv.Type())) - return nil - } - } - - return fmt.Errorf("pq: cannot convert %T to %s", src, dv.Type()) -} - -func (a GenericArray) scanBytes(src []byte, dv reflect.Value) error { - dtype, assign, del := a.evaluateDestination(dv.Type().Elem()) - dims, elems, err := parseArray(src, []byte(del)) - if err != nil { - return err - } - - // TODO allow multidimensional - - if len(dims) > 1 { - return fmt.Errorf("pq: scanning from multidimensional ARRAY%s is not implemented", - strings.Replace(fmt.Sprint(dims), " ", "][", -1)) - } - - // Treat a zero-dimensional array like an array with a single dimension of zero. - if len(dims) == 0 { - dims = append(dims, 0) - } - - for i, rt := 0, dv.Type(); i < len(dims); i, rt = i+1, rt.Elem() { - switch rt.Kind() { - case reflect.Slice: - case reflect.Array: - if rt.Len() != dims[i] { - return fmt.Errorf("pq: cannot convert ARRAY%s to %s", - strings.Replace(fmt.Sprint(dims), " ", "][", -1), dv.Type()) - } - default: - // TODO handle multidimensional - } - } - - values := reflect.MakeSlice(reflect.SliceOf(dtype), len(elems), len(elems)) - for i, e := range elems { - if err := assign(e, values.Index(i)); err != nil { - return fmt.Errorf("pq: parsing array element index %d: %v", i, err) - } - } - - // TODO handle multidimensional - - switch dv.Kind() { - case reflect.Slice: - dv.Set(values.Slice(0, dims[0])) - case reflect.Array: - for i := 0; i < dims[0]; i++ { - dv.Index(i).Set(values.Index(i)) - } - } - - return nil -} - -// Value implements the driver.Valuer interface. -func (a GenericArray) Value() (driver.Value, error) { - if a.A == nil { - return nil, nil - } - - rv := reflect.ValueOf(a.A) - - switch rv.Kind() { - case reflect.Slice: - if rv.IsNil() { - return nil, nil - } - case reflect.Array: - default: - return nil, fmt.Errorf("pq: Unable to convert %T to array", a.A) - } - - if n := rv.Len(); n > 0 { - // There will be at least two curly brackets, N bytes of values, - // and N-1 bytes of delimiters. - b := make([]byte, 0, 1+2*n) - - b, _, err := appendArray(b, rv, n) - return string(b), err - } - - return "{}", nil -} - -// Int64Array represents a one-dimensional array of the PostgreSQL integer types. -type Int64Array []int64 - -// Scan implements the sql.Scanner interface. -func (a *Int64Array) Scan(src interface{}) error { - switch src := src.(type) { - case []byte: - return a.scanBytes(src) - case string: - return a.scanBytes([]byte(src)) - case nil: - *a = nil - return nil - } - - return fmt.Errorf("pq: cannot convert %T to Int64Array", src) -} - -func (a *Int64Array) scanBytes(src []byte) error { - elems, err := scanLinearArray(src, []byte{','}, "Int64Array") - if err != nil { - return err - } - if *a != nil && len(elems) == 0 { - *a = (*a)[:0] - } else { - b := make(Int64Array, len(elems)) - for i, v := range elems { - if b[i], err = strconv.ParseInt(string(v), 10, 64); err != nil { - return fmt.Errorf("pq: parsing array element index %d: %v", i, err) - } - } - *a = b - } - return nil -} - -// Value implements the driver.Valuer interface. -func (a Int64Array) Value() (driver.Value, error) { - if a == nil { - return nil, nil - } - - if n := len(a); n > 0 { - // There will be at least two curly brackets, N bytes of values, - // and N-1 bytes of delimiters. - b := make([]byte, 1, 1+2*n) - b[0] = '{' - - b = strconv.AppendInt(b, a[0], 10) - for i := 1; i < n; i++ { - b = append(b, ',') - b = strconv.AppendInt(b, a[i], 10) - } - - return string(append(b, '}')), nil - } - - return "{}", nil -} - -// StringArray represents a one-dimensional array of the PostgreSQL character types. -type StringArray []string - -// Scan implements the sql.Scanner interface. -func (a *StringArray) Scan(src interface{}) error { - switch src := src.(type) { - case []byte: - return a.scanBytes(src) - case string: - return a.scanBytes([]byte(src)) - case nil: - *a = nil - return nil - } - - return fmt.Errorf("pq: cannot convert %T to StringArray", src) -} - -func (a *StringArray) scanBytes(src []byte) error { - elems, err := scanLinearArray(src, []byte{','}, "StringArray") - if err != nil { - return err - } - if *a != nil && len(elems) == 0 { - *a = (*a)[:0] - } else { - b := make(StringArray, len(elems)) - for i, v := range elems { - if b[i] = string(v); v == nil { - return fmt.Errorf("pq: parsing array element index %d: cannot convert nil to string", i) - } - } - *a = b - } - return nil -} - -// Value implements the driver.Valuer interface. -func (a StringArray) Value() (driver.Value, error) { - if a == nil { - return nil, nil - } - - if n := len(a); n > 0 { - // There will be at least two curly brackets, 2*N bytes of quotes, - // and N-1 bytes of delimiters. - b := make([]byte, 1, 1+3*n) - b[0] = '{' - - b = appendArrayQuotedBytes(b, []byte(a[0])) - for i := 1; i < n; i++ { - b = append(b, ',') - b = appendArrayQuotedBytes(b, []byte(a[i])) - } - - return string(append(b, '}')), nil - } - - return "{}", nil -} - -// appendArray appends rv to the buffer, returning the extended buffer and -// the delimiter used between elements. -// -// It panics when n <= 0 or rv's Kind is not reflect.Array nor reflect.Slice. -func appendArray(b []byte, rv reflect.Value, n int) ([]byte, string, error) { - var del string - var err error - - b = append(b, '{') - - if b, del, err = appendArrayElement(b, rv.Index(0)); err != nil { - return b, del, err - } - - for i := 1; i < n; i++ { - b = append(b, del...) - if b, del, err = appendArrayElement(b, rv.Index(i)); err != nil { - return b, del, err - } - } - - return append(b, '}'), del, nil -} - -// appendArrayElement appends rv to the buffer, returning the extended buffer -// and the delimiter to use before the next element. -// -// When rv's Kind is neither reflect.Array nor reflect.Slice, it is converted -// using driver.DefaultParameterConverter and the resulting []byte or string -// is double-quoted. -// -// See http://www.postgresql.org/docs/current/static/arrays.html#ARRAYS-IO -func appendArrayElement(b []byte, rv reflect.Value) ([]byte, string, error) { - if k := rv.Kind(); k == reflect.Array || k == reflect.Slice { - if t := rv.Type(); t != typeByteSlice && !t.Implements(typeDriverValuer) { - if n := rv.Len(); n > 0 { - return appendArray(b, rv, n) - } - - return b, "", nil - } - } - - var del = "," - var err error - var iv interface{} = rv.Interface() - - if ad, ok := iv.(ArrayDelimiter); ok { - del = ad.ArrayDelimiter() - } - - if iv, err = driver.DefaultParameterConverter.ConvertValue(iv); err != nil { - return b, del, err - } - - switch v := iv.(type) { - case nil: - return append(b, "NULL"...), del, nil - case []byte: - return appendArrayQuotedBytes(b, v), del, nil - case string: - return appendArrayQuotedBytes(b, []byte(v)), del, nil - } - - b, err = appendValue(b, iv) - return b, del, err -} - -func appendArrayQuotedBytes(b, v []byte) []byte { - b = append(b, '"') - for { - i := bytes.IndexAny(v, `"\`) - if i < 0 { - b = append(b, v...) - break - } - if i > 0 { - b = append(b, v[:i]...) - } - b = append(b, '\\', v[i]) - v = v[i+1:] - } - return append(b, '"') -} - -func appendValue(b []byte, v driver.Value) ([]byte, error) { - return append(b, encode(nil, v, 0)...), nil -} - -// parseArray extracts the dimensions and elements of an array represented in -// text format. Only representations emitted by the backend are supported. -// Notably, whitespace around brackets and delimiters is significant, and NULL -// is case-sensitive. -// -// See http://www.postgresql.org/docs/current/static/arrays.html#ARRAYS-IO -func parseArray(src, del []byte) (dims []int, elems [][]byte, err error) { - var depth, i int - - if len(src) < 1 || src[0] != '{' { - return nil, nil, fmt.Errorf("pq: unable to parse array; expected %q at offset %d", '{', 0) - } - -Open: - for i < len(src) { - switch src[i] { - case '{': - depth++ - i++ - case '}': - elems = make([][]byte, 0) - goto Close - default: - break Open - } - } - dims = make([]int, i) - -Element: - for i < len(src) { - switch src[i] { - case '{': - if depth == len(dims) { - break Element - } - depth++ - dims[depth-1] = 0 - i++ - case '"': - var elem = []byte{} - var escape bool - for i++; i < len(src); i++ { - if escape { - elem = append(elem, src[i]) - escape = false - } else { - switch src[i] { - default: - elem = append(elem, src[i]) - case '\\': - escape = true - case '"': - elems = append(elems, elem) - i++ - break Element - } - } - } - default: - for start := i; i < len(src); i++ { - if bytes.HasPrefix(src[i:], del) || src[i] == '}' { - elem := src[start:i] - if len(elem) == 0 { - return nil, nil, fmt.Errorf("pq: unable to parse array; unexpected %q at offset %d", src[i], i) - } - if bytes.Equal(elem, []byte("NULL")) { - elem = nil - } - elems = append(elems, elem) - break Element - } - } - } - } - - for i < len(src) { - if bytes.HasPrefix(src[i:], del) && depth > 0 { - dims[depth-1]++ - i += len(del) - goto Element - } else if src[i] == '}' && depth > 0 { - dims[depth-1]++ - depth-- - i++ - } else { - return nil, nil, fmt.Errorf("pq: unable to parse array; unexpected %q at offset %d", src[i], i) - } - } - -Close: - for i < len(src) { - if src[i] == '}' && depth > 0 { - depth-- - i++ - } else { - return nil, nil, fmt.Errorf("pq: unable to parse array; unexpected %q at offset %d", src[i], i) - } - } - if depth > 0 { - err = fmt.Errorf("pq: unable to parse array; expected %q at offset %d", '}', i) - } - if err == nil { - for _, d := range dims { - if (len(elems) % d) != 0 { - err = fmt.Errorf("pq: multidimensional arrays must have elements with matching dimensions") - } - } - } - return -} - -func scanLinearArray(src, del []byte, typ string) (elems [][]byte, err error) { - dims, elems, err := parseArray(src, del) - if err != nil { - return nil, err - } - if len(dims) > 1 { - return nil, fmt.Errorf("pq: cannot convert ARRAY%s to %s", strings.Replace(fmt.Sprint(dims), " ", "][", -1), typ) - } - return elems, err -} diff --git a/vendor/github.com/lib/pq/buf.go b/vendor/github.com/lib/pq/buf.go deleted file mode 100644 index 666b0012a..000000000 --- a/vendor/github.com/lib/pq/buf.go +++ /dev/null @@ -1,91 +0,0 @@ -package pq - -import ( - "bytes" - "encoding/binary" - - "github.com/lib/pq/oid" -) - -type readBuf []byte - -func (b *readBuf) int32() (n int) { - n = int(int32(binary.BigEndian.Uint32(*b))) - *b = (*b)[4:] - return -} - -func (b *readBuf) oid() (n oid.Oid) { - n = oid.Oid(binary.BigEndian.Uint32(*b)) - *b = (*b)[4:] - return -} - -// N.B: this is actually an unsigned 16-bit integer, unlike int32 -func (b *readBuf) int16() (n int) { - n = int(binary.BigEndian.Uint16(*b)) - *b = (*b)[2:] - return -} - -func (b *readBuf) string() string { - i := bytes.IndexByte(*b, 0) - if i < 0 { - errorf("invalid message format; expected string terminator") - } - s := (*b)[:i] - *b = (*b)[i+1:] - return string(s) -} - -func (b *readBuf) next(n int) (v []byte) { - v = (*b)[:n] - *b = (*b)[n:] - return -} - -func (b *readBuf) byte() byte { - return b.next(1)[0] -} - -type writeBuf struct { - buf []byte - pos int -} - -func (b *writeBuf) int32(n int) { - x := make([]byte, 4) - binary.BigEndian.PutUint32(x, uint32(n)) - b.buf = append(b.buf, x...) -} - -func (b *writeBuf) int16(n int) { - x := make([]byte, 2) - binary.BigEndian.PutUint16(x, uint16(n)) - b.buf = append(b.buf, x...) -} - -func (b *writeBuf) string(s string) { - b.buf = append(b.buf, (s + "\000")...) -} - -func (b *writeBuf) byte(c byte) { - b.buf = append(b.buf, c) -} - -func (b *writeBuf) bytes(v []byte) { - b.buf = append(b.buf, v...) -} - -func (b *writeBuf) wrap() []byte { - p := b.buf[b.pos:] - binary.BigEndian.PutUint32(p, uint32(len(p))) - return b.buf -} - -func (b *writeBuf) next(c byte) { - p := b.buf[b.pos:] - binary.BigEndian.PutUint32(p, uint32(len(p))) - b.pos = len(b.buf) + 1 - b.buf = append(b.buf, c, 0, 0, 0, 0) -} diff --git a/vendor/github.com/lib/pq/conn.go b/vendor/github.com/lib/pq/conn.go deleted file mode 100644 index 43c8df29f..000000000 --- a/vendor/github.com/lib/pq/conn.go +++ /dev/null @@ -1,1854 +0,0 @@ -package pq - -import ( - "bufio" - "crypto/md5" - "database/sql" - "database/sql/driver" - "encoding/binary" - "errors" - "fmt" - "io" - "net" - "os" - "os/user" - "path" - "path/filepath" - "strconv" - "strings" - "time" - "unicode" - - "github.com/lib/pq/oid" -) - -// Common error types -var ( - ErrNotSupported = errors.New("pq: Unsupported command") - ErrInFailedTransaction = errors.New("pq: Could not complete operation in a failed transaction") - ErrSSLNotSupported = errors.New("pq: SSL is not enabled on the server") - ErrSSLKeyHasWorldPermissions = errors.New("pq: Private key file has group or world access. Permissions should be u=rw (0600) or less") - ErrCouldNotDetectUsername = errors.New("pq: Could not detect default username. Please provide one explicitly") - - errUnexpectedReady = errors.New("unexpected ReadyForQuery") - errNoRowsAffected = errors.New("no RowsAffected available after the empty statement") - errNoLastInsertID = errors.New("no LastInsertId available after the empty statement") -) - -// Driver is the Postgres database driver. -type Driver struct{} - -// Open opens a new connection to the database. name is a connection string. -// Most users should only use it through database/sql package from the standard -// library. -func (d *Driver) Open(name string) (driver.Conn, error) { - return Open(name) -} - -func init() { - sql.Register("postgres", &Driver{}) -} - -type parameterStatus struct { - // server version in the same format as server_version_num, or 0 if - // unavailable - serverVersion int - - // the current location based on the TimeZone value of the session, if - // available - currentLocation *time.Location -} - -type transactionStatus byte - -const ( - txnStatusIdle transactionStatus = 'I' - txnStatusIdleInTransaction transactionStatus = 'T' - txnStatusInFailedTransaction transactionStatus = 'E' -) - -func (s transactionStatus) String() string { - switch s { - case txnStatusIdle: - return "idle" - case txnStatusIdleInTransaction: - return "idle in transaction" - case txnStatusInFailedTransaction: - return "in a failed transaction" - default: - errorf("unknown transactionStatus %d", s) - } - - panic("not reached") -} - -// Dialer is the dialer interface. It can be used to obtain more control over -// how pq creates network connections. -type Dialer interface { - Dial(network, address string) (net.Conn, error) - DialTimeout(network, address string, timeout time.Duration) (net.Conn, error) -} - -type defaultDialer struct{} - -func (d defaultDialer) Dial(ntw, addr string) (net.Conn, error) { - return net.Dial(ntw, addr) -} -func (d defaultDialer) DialTimeout(ntw, addr string, timeout time.Duration) (net.Conn, error) { - return net.DialTimeout(ntw, addr, timeout) -} - -type conn struct { - c net.Conn - buf *bufio.Reader - namei int - scratch [512]byte - txnStatus transactionStatus - txnFinish func() - - // Save connection arguments to use during CancelRequest. - dialer Dialer - opts values - - // Cancellation key data for use with CancelRequest messages. - processID int - secretKey int - - parameterStatus parameterStatus - - saveMessageType byte - saveMessageBuffer []byte - - // If true, this connection is bad and all public-facing functions should - // return ErrBadConn. - bad bool - - // If set, this connection should never use the binary format when - // receiving query results from prepared statements. Only provided for - // debugging. - disablePreparedBinaryResult bool - - // Whether to always send []byte parameters over as binary. Enables single - // round-trip mode for non-prepared Query calls. - binaryParameters bool - - // If true this connection is in the middle of a COPY - inCopy bool -} - -// Handle driver-side settings in parsed connection string. -func (cn *conn) handleDriverSettings(o values) (err error) { - boolSetting := func(key string, val *bool) error { - if value, ok := o[key]; ok { - if value == "yes" { - *val = true - } else if value == "no" { - *val = false - } else { - return fmt.Errorf("unrecognized value %q for %s", value, key) - } - } - return nil - } - - err = boolSetting("disable_prepared_binary_result", &cn.disablePreparedBinaryResult) - if err != nil { - return err - } - return boolSetting("binary_parameters", &cn.binaryParameters) -} - -func (cn *conn) handlePgpass(o values) { - // if a password was supplied, do not process .pgpass - if _, ok := o["password"]; ok { - return - } - filename := os.Getenv("PGPASSFILE") - if filename == "" { - // XXX this code doesn't work on Windows where the default filename is - // XXX %APPDATA%\postgresql\pgpass.conf - // Prefer $HOME over user.Current due to glibc bug: golang.org/issue/13470 - userHome := os.Getenv("HOME") - if userHome == "" { - user, err := user.Current() - if err != nil { - return - } - userHome = user.HomeDir - } - filename = filepath.Join(userHome, ".pgpass") - } - fileinfo, err := os.Stat(filename) - if err != nil { - return - } - mode := fileinfo.Mode() - if mode&(0x77) != 0 { - // XXX should warn about incorrect .pgpass permissions as psql does - return - } - file, err := os.Open(filename) - if err != nil { - return - } - defer file.Close() - scanner := bufio.NewScanner(io.Reader(file)) - hostname := o["host"] - ntw, _ := network(o) - port := o["port"] - db := o["dbname"] - username := o["user"] - // From: https://github.com/tg/pgpass/blob/master/reader.go - getFields := func(s string) []string { - fs := make([]string, 0, 5) - f := make([]rune, 0, len(s)) - - var esc bool - for _, c := range s { - switch { - case esc: - f = append(f, c) - esc = false - case c == '\\': - esc = true - case c == ':': - fs = append(fs, string(f)) - f = f[:0] - default: - f = append(f, c) - } - } - return append(fs, string(f)) - } - for scanner.Scan() { - line := scanner.Text() - if len(line) == 0 || line[0] == '#' { - continue - } - split := getFields(line) - if len(split) != 5 { - continue - } - if (split[0] == "*" || split[0] == hostname || (split[0] == "localhost" && (hostname == "" || ntw == "unix"))) && (split[1] == "*" || split[1] == port) && (split[2] == "*" || split[2] == db) && (split[3] == "*" || split[3] == username) { - o["password"] = split[4] - return - } - } -} - -func (cn *conn) writeBuf(b byte) *writeBuf { - cn.scratch[0] = b - return &writeBuf{ - buf: cn.scratch[:5], - pos: 1, - } -} - -// Open opens a new connection to the database. name is a connection string. -// Most users should only use it through database/sql package from the standard -// library. -func Open(name string) (_ driver.Conn, err error) { - return DialOpen(defaultDialer{}, name) -} - -// DialOpen opens a new connection to the database using a dialer. -func DialOpen(d Dialer, name string) (_ driver.Conn, err error) { - // Handle any panics during connection initialization. Note that we - // specifically do *not* want to use errRecover(), as that would turn any - // connection errors into ErrBadConns, hiding the real error message from - // the user. - defer errRecoverNoErrBadConn(&err) - - o := make(values) - - // A number of defaults are applied here, in this order: - // - // * Very low precedence defaults applied in every situation - // * Environment variables - // * Explicitly passed connection information - o["host"] = "localhost" - o["port"] = "5432" - // N.B.: Extra float digits should be set to 3, but that breaks - // Postgres 8.4 and older, where the max is 2. - o["extra_float_digits"] = "2" - for k, v := range parseEnviron(os.Environ()) { - o[k] = v - } - - if strings.HasPrefix(name, "postgres://") || strings.HasPrefix(name, "postgresql://") { - name, err = ParseURL(name) - if err != nil { - return nil, err - } - } - - if err := parseOpts(name, o); err != nil { - return nil, err - } - - // Use the "fallback" application name if necessary - if fallback, ok := o["fallback_application_name"]; ok { - if _, ok := o["application_name"]; !ok { - o["application_name"] = fallback - } - } - - // We can't work with any client_encoding other than UTF-8 currently. - // However, we have historically allowed the user to set it to UTF-8 - // explicitly, and there's no reason to break such programs, so allow that. - // Note that the "options" setting could also set client_encoding, but - // parsing its value is not worth it. Instead, we always explicitly send - // client_encoding as a separate run-time parameter, which should override - // anything set in options. - if enc, ok := o["client_encoding"]; ok && !isUTF8(enc) { - return nil, errors.New("client_encoding must be absent or 'UTF8'") - } - o["client_encoding"] = "UTF8" - // DateStyle needs a similar treatment. - if datestyle, ok := o["datestyle"]; ok { - if datestyle != "ISO, MDY" { - panic(fmt.Sprintf("setting datestyle must be absent or %v; got %v", - "ISO, MDY", datestyle)) - } - } else { - o["datestyle"] = "ISO, MDY" - } - - // If a user is not provided by any other means, the last - // resort is to use the current operating system provided user - // name. - if _, ok := o["user"]; !ok { - u, err := userCurrent() - if err != nil { - return nil, err - } - o["user"] = u - } - - cn := &conn{ - opts: o, - dialer: d, - } - err = cn.handleDriverSettings(o) - if err != nil { - return nil, err - } - cn.handlePgpass(o) - - cn.c, err = dial(d, o) - if err != nil { - return nil, err - } - - err = cn.ssl(o) - if err != nil { - return nil, err - } - - // cn.startup panics on error. Make sure we don't leak cn.c. - panicking := true - defer func() { - if panicking { - cn.c.Close() - } - }() - - cn.buf = bufio.NewReader(cn.c) - cn.startup(o) - - // reset the deadline, in case one was set (see dial) - if timeout, ok := o["connect_timeout"]; ok && timeout != "0" { - err = cn.c.SetDeadline(time.Time{}) - } - panicking = false - return cn, err -} - -func dial(d Dialer, o values) (net.Conn, error) { - ntw, addr := network(o) - // SSL is not necessary or supported over UNIX domain sockets - if ntw == "unix" { - o["sslmode"] = "disable" - } - - // Zero or not specified means wait indefinitely. - if timeout, ok := o["connect_timeout"]; ok && timeout != "0" { - seconds, err := strconv.ParseInt(timeout, 10, 0) - if err != nil { - return nil, fmt.Errorf("invalid value for parameter connect_timeout: %s", err) - } - duration := time.Duration(seconds) * time.Second - // connect_timeout should apply to the entire connection establishment - // procedure, so we both use a timeout for the TCP connection - // establishment and set a deadline for doing the initial handshake. - // The deadline is then reset after startup() is done. - deadline := time.Now().Add(duration) - conn, err := d.DialTimeout(ntw, addr, duration) - if err != nil { - return nil, err - } - err = conn.SetDeadline(deadline) - return conn, err - } - return d.Dial(ntw, addr) -} - -func network(o values) (string, string) { - host := o["host"] - - if strings.HasPrefix(host, "/") { - sockPath := path.Join(host, ".s.PGSQL."+o["port"]) - return "unix", sockPath - } - - return "tcp", net.JoinHostPort(host, o["port"]) -} - -type values map[string]string - -// scanner implements a tokenizer for libpq-style option strings. -type scanner struct { - s []rune - i int -} - -// newScanner returns a new scanner initialized with the option string s. -func newScanner(s string) *scanner { - return &scanner{[]rune(s), 0} -} - -// Next returns the next rune. -// It returns 0, false if the end of the text has been reached. -func (s *scanner) Next() (rune, bool) { - if s.i >= len(s.s) { - return 0, false - } - r := s.s[s.i] - s.i++ - return r, true -} - -// SkipSpaces returns the next non-whitespace rune. -// It returns 0, false if the end of the text has been reached. -func (s *scanner) SkipSpaces() (rune, bool) { - r, ok := s.Next() - for unicode.IsSpace(r) && ok { - r, ok = s.Next() - } - return r, ok -} - -// parseOpts parses the options from name and adds them to the values. -// -// The parsing code is based on conninfo_parse from libpq's fe-connect.c -func parseOpts(name string, o values) error { - s := newScanner(name) - - for { - var ( - keyRunes, valRunes []rune - r rune - ok bool - ) - - if r, ok = s.SkipSpaces(); !ok { - break - } - - // Scan the key - for !unicode.IsSpace(r) && r != '=' { - keyRunes = append(keyRunes, r) - if r, ok = s.Next(); !ok { - break - } - } - - // Skip any whitespace if we're not at the = yet - if r != '=' { - r, ok = s.SkipSpaces() - } - - // The current character should be = - if r != '=' || !ok { - return fmt.Errorf(`missing "=" after %q in connection info string"`, string(keyRunes)) - } - - // Skip any whitespace after the = - if r, ok = s.SkipSpaces(); !ok { - // If we reach the end here, the last value is just an empty string as per libpq. - o[string(keyRunes)] = "" - break - } - - if r != '\'' { - for !unicode.IsSpace(r) { - if r == '\\' { - if r, ok = s.Next(); !ok { - return fmt.Errorf(`missing character after backslash`) - } - } - valRunes = append(valRunes, r) - - if r, ok = s.Next(); !ok { - break - } - } - } else { - quote: - for { - if r, ok = s.Next(); !ok { - return fmt.Errorf(`unterminated quoted string literal in connection string`) - } - switch r { - case '\'': - break quote - case '\\': - r, _ = s.Next() - fallthrough - default: - valRunes = append(valRunes, r) - } - } - } - - o[string(keyRunes)] = string(valRunes) - } - - return nil -} - -func (cn *conn) isInTransaction() bool { - return cn.txnStatus == txnStatusIdleInTransaction || - cn.txnStatus == txnStatusInFailedTransaction -} - -func (cn *conn) checkIsInTransaction(intxn bool) { - if cn.isInTransaction() != intxn { - cn.bad = true - errorf("unexpected transaction status %v", cn.txnStatus) - } -} - -func (cn *conn) Begin() (_ driver.Tx, err error) { - return cn.begin("") -} - -func (cn *conn) begin(mode string) (_ driver.Tx, err error) { - if cn.bad { - return nil, driver.ErrBadConn - } - defer cn.errRecover(&err) - - cn.checkIsInTransaction(false) - _, commandTag, err := cn.simpleExec("BEGIN" + mode) - if err != nil { - return nil, err - } - if commandTag != "BEGIN" { - cn.bad = true - return nil, fmt.Errorf("unexpected command tag %s", commandTag) - } - if cn.txnStatus != txnStatusIdleInTransaction { - cn.bad = true - return nil, fmt.Errorf("unexpected transaction status %v", cn.txnStatus) - } - return cn, nil -} - -func (cn *conn) closeTxn() { - if finish := cn.txnFinish; finish != nil { - finish() - } -} - -func (cn *conn) Commit() (err error) { - defer cn.closeTxn() - if cn.bad { - return driver.ErrBadConn - } - defer cn.errRecover(&err) - - cn.checkIsInTransaction(true) - // We don't want the client to think that everything is okay if it tries - // to commit a failed transaction. However, no matter what we return, - // database/sql will release this connection back into the free connection - // pool so we have to abort the current transaction here. Note that you - // would get the same behaviour if you issued a COMMIT in a failed - // transaction, so it's also the least surprising thing to do here. - if cn.txnStatus == txnStatusInFailedTransaction { - if err := cn.Rollback(); err != nil { - return err - } - return ErrInFailedTransaction - } - - _, commandTag, err := cn.simpleExec("COMMIT") - if err != nil { - if cn.isInTransaction() { - cn.bad = true - } - return err - } - if commandTag != "COMMIT" { - cn.bad = true - return fmt.Errorf("unexpected command tag %s", commandTag) - } - cn.checkIsInTransaction(false) - return nil -} - -func (cn *conn) Rollback() (err error) { - defer cn.closeTxn() - if cn.bad { - return driver.ErrBadConn - } - defer cn.errRecover(&err) - - cn.checkIsInTransaction(true) - _, commandTag, err := cn.simpleExec("ROLLBACK") - if err != nil { - if cn.isInTransaction() { - cn.bad = true - } - return err - } - if commandTag != "ROLLBACK" { - return fmt.Errorf("unexpected command tag %s", commandTag) - } - cn.checkIsInTransaction(false) - return nil -} - -func (cn *conn) gname() string { - cn.namei++ - return strconv.FormatInt(int64(cn.namei), 10) -} - -func (cn *conn) simpleExec(q string) (res driver.Result, commandTag string, err error) { - b := cn.writeBuf('Q') - b.string(q) - cn.send(b) - - for { - t, r := cn.recv1() - switch t { - case 'C': - res, commandTag = cn.parseComplete(r.string()) - case 'Z': - cn.processReadyForQuery(r) - if res == nil && err == nil { - err = errUnexpectedReady - } - // done - return - case 'E': - err = parseError(r) - case 'I': - res = emptyRows - case 'T', 'D': - // ignore any results - default: - cn.bad = true - errorf("unknown response for simple query: %q", t) - } - } -} - -func (cn *conn) simpleQuery(q string) (res *rows, err error) { - defer cn.errRecover(&err) - - b := cn.writeBuf('Q') - b.string(q) - cn.send(b) - - for { - t, r := cn.recv1() - switch t { - case 'C', 'I': - // We allow queries which don't return any results through Query as - // well as Exec. We still have to give database/sql a rows object - // the user can close, though, to avoid connections from being - // leaked. A "rows" with done=true works fine for that purpose. - if err != nil { - cn.bad = true - errorf("unexpected message %q in simple query execution", t) - } - if res == nil { - res = &rows{ - cn: cn, - } - } - // Set the result and tag to the last command complete if there wasn't a - // query already run. Although queries usually return from here and cede - // control to Next, a query with zero results does not. - if t == 'C' && res.colNames == nil { - res.result, res.tag = cn.parseComplete(r.string()) - } - res.done = true - case 'Z': - cn.processReadyForQuery(r) - // done - return - case 'E': - res = nil - err = parseError(r) - case 'D': - if res == nil { - cn.bad = true - errorf("unexpected DataRow in simple query execution") - } - // the query didn't fail; kick off to Next - cn.saveMessage(t, r) - return - case 'T': - // res might be non-nil here if we received a previous - // CommandComplete, but that's fine; just overwrite it - res = &rows{cn: cn} - res.colNames, res.colFmts, res.colTyps = parsePortalRowDescribe(r) - - // To work around a bug in QueryRow in Go 1.2 and earlier, wait - // until the first DataRow has been received. - default: - cn.bad = true - errorf("unknown response for simple query: %q", t) - } - } -} - -type noRows struct{} - -var emptyRows noRows - -var _ driver.Result = noRows{} - -func (noRows) LastInsertId() (int64, error) { - return 0, errNoLastInsertID -} - -func (noRows) RowsAffected() (int64, error) { - return 0, errNoRowsAffected -} - -// Decides which column formats to use for a prepared statement. The input is -// an array of type oids, one element per result column. -func decideColumnFormats(colTyps []fieldDesc, forceText bool) (colFmts []format, colFmtData []byte) { - if len(colTyps) == 0 { - return nil, colFmtDataAllText - } - - colFmts = make([]format, len(colTyps)) - if forceText { - return colFmts, colFmtDataAllText - } - - allBinary := true - allText := true - for i, t := range colTyps { - switch t.OID { - // This is the list of types to use binary mode for when receiving them - // through a prepared statement. If a type appears in this list, it - // must also be implemented in binaryDecode in encode.go. - case oid.T_bytea: - fallthrough - case oid.T_int8: - fallthrough - case oid.T_int4: - fallthrough - case oid.T_int2: - fallthrough - case oid.T_uuid: - colFmts[i] = formatBinary - allText = false - - default: - allBinary = false - } - } - - if allBinary { - return colFmts, colFmtDataAllBinary - } else if allText { - return colFmts, colFmtDataAllText - } else { - colFmtData = make([]byte, 2+len(colFmts)*2) - binary.BigEndian.PutUint16(colFmtData, uint16(len(colFmts))) - for i, v := range colFmts { - binary.BigEndian.PutUint16(colFmtData[2+i*2:], uint16(v)) - } - return colFmts, colFmtData - } -} - -func (cn *conn) prepareTo(q, stmtName string) *stmt { - st := &stmt{cn: cn, name: stmtName} - - b := cn.writeBuf('P') - b.string(st.name) - b.string(q) - b.int16(0) - - b.next('D') - b.byte('S') - b.string(st.name) - - b.next('S') - cn.send(b) - - cn.readParseResponse() - st.paramTyps, st.colNames, st.colTyps = cn.readStatementDescribeResponse() - st.colFmts, st.colFmtData = decideColumnFormats(st.colTyps, cn.disablePreparedBinaryResult) - cn.readReadyForQuery() - return st -} - -func (cn *conn) Prepare(q string) (_ driver.Stmt, err error) { - if cn.bad { - return nil, driver.ErrBadConn - } - defer cn.errRecover(&err) - - if len(q) >= 4 && strings.EqualFold(q[:4], "COPY") { - s, err := cn.prepareCopyIn(q) - if err == nil { - cn.inCopy = true - } - return s, err - } - return cn.prepareTo(q, cn.gname()), nil -} - -func (cn *conn) Close() (err error) { - // Skip cn.bad return here because we always want to close a connection. - defer cn.errRecover(&err) - - // Ensure that cn.c.Close is always run. Since error handling is done with - // panics and cn.errRecover, the Close must be in a defer. - defer func() { - cerr := cn.c.Close() - if err == nil { - err = cerr - } - }() - - // Don't go through send(); ListenerConn relies on us not scribbling on the - // scratch buffer of this connection. - return cn.sendSimpleMessage('X') -} - -// Implement the "Queryer" interface -func (cn *conn) Query(query string, args []driver.Value) (driver.Rows, error) { - return cn.query(query, args) -} - -func (cn *conn) query(query string, args []driver.Value) (_ *rows, err error) { - if cn.bad { - return nil, driver.ErrBadConn - } - if cn.inCopy { - return nil, errCopyInProgress - } - defer cn.errRecover(&err) - - // Check to see if we can use the "simpleQuery" interface, which is - // *much* faster than going through prepare/exec - if len(args) == 0 { - return cn.simpleQuery(query) - } - - if cn.binaryParameters { - cn.sendBinaryModeQuery(query, args) - - cn.readParseResponse() - cn.readBindResponse() - rows := &rows{cn: cn} - rows.colNames, rows.colFmts, rows.colTyps = cn.readPortalDescribeResponse() - cn.postExecuteWorkaround() - return rows, nil - } - st := cn.prepareTo(query, "") - st.exec(args) - return &rows{ - cn: cn, - colNames: st.colNames, - colTyps: st.colTyps, - colFmts: st.colFmts, - }, nil -} - -// Implement the optional "Execer" interface for one-shot queries -func (cn *conn) Exec(query string, args []driver.Value) (res driver.Result, err error) { - if cn.bad { - return nil, driver.ErrBadConn - } - defer cn.errRecover(&err) - - // Check to see if we can use the "simpleExec" interface, which is - // *much* faster than going through prepare/exec - if len(args) == 0 { - // ignore commandTag, our caller doesn't care - r, _, err := cn.simpleExec(query) - return r, err - } - - if cn.binaryParameters { - cn.sendBinaryModeQuery(query, args) - - cn.readParseResponse() - cn.readBindResponse() - cn.readPortalDescribeResponse() - cn.postExecuteWorkaround() - res, _, err = cn.readExecuteResponse("Execute") - return res, err - } - // Use the unnamed statement to defer planning until bind - // time, or else value-based selectivity estimates cannot be - // used. - st := cn.prepareTo(query, "") - r, err := st.Exec(args) - if err != nil { - panic(err) - } - return r, err -} - -func (cn *conn) send(m *writeBuf) { - _, err := cn.c.Write(m.wrap()) - if err != nil { - panic(err) - } -} - -func (cn *conn) sendStartupPacket(m *writeBuf) error { - _, err := cn.c.Write((m.wrap())[1:]) - return err -} - -// Send a message of type typ to the server on the other end of cn. The -// message should have no payload. This method does not use the scratch -// buffer. -func (cn *conn) sendSimpleMessage(typ byte) (err error) { - _, err = cn.c.Write([]byte{typ, '\x00', '\x00', '\x00', '\x04'}) - return err -} - -// saveMessage memorizes a message and its buffer in the conn struct. -// recvMessage will then return these values on the next call to it. This -// method is useful in cases where you have to see what the next message is -// going to be (e.g. to see whether it's an error or not) but you can't handle -// the message yourself. -func (cn *conn) saveMessage(typ byte, buf *readBuf) { - if cn.saveMessageType != 0 { - cn.bad = true - errorf("unexpected saveMessageType %d", cn.saveMessageType) - } - cn.saveMessageType = typ - cn.saveMessageBuffer = *buf -} - -// recvMessage receives any message from the backend, or returns an error if -// a problem occurred while reading the message. -func (cn *conn) recvMessage(r *readBuf) (byte, error) { - // workaround for a QueryRow bug, see exec - if cn.saveMessageType != 0 { - t := cn.saveMessageType - *r = cn.saveMessageBuffer - cn.saveMessageType = 0 - cn.saveMessageBuffer = nil - return t, nil - } - - x := cn.scratch[:5] - _, err := io.ReadFull(cn.buf, x) - if err != nil { - return 0, err - } - - // read the type and length of the message that follows - t := x[0] - n := int(binary.BigEndian.Uint32(x[1:])) - 4 - var y []byte - if n <= len(cn.scratch) { - y = cn.scratch[:n] - } else { - y = make([]byte, n) - } - _, err = io.ReadFull(cn.buf, y) - if err != nil { - return 0, err - } - *r = y - return t, nil -} - -// recv receives a message from the backend, but if an error happened while -// reading the message or the received message was an ErrorResponse, it panics. -// NoticeResponses are ignored. This function should generally be used only -// during the startup sequence. -func (cn *conn) recv() (t byte, r *readBuf) { - for { - var err error - r = &readBuf{} - t, err = cn.recvMessage(r) - if err != nil { - panic(err) - } - - switch t { - case 'E': - panic(parseError(r)) - case 'N': - // ignore - default: - return - } - } -} - -// recv1Buf is exactly equivalent to recv1, except it uses a buffer supplied by -// the caller to avoid an allocation. -func (cn *conn) recv1Buf(r *readBuf) byte { - for { - t, err := cn.recvMessage(r) - if err != nil { - panic(err) - } - - switch t { - case 'A', 'N': - // ignore - case 'S': - cn.processParameterStatus(r) - default: - return t - } - } -} - -// recv1 receives a message from the backend, panicking if an error occurs -// while attempting to read it. All asynchronous messages are ignored, with -// the exception of ErrorResponse. -func (cn *conn) recv1() (t byte, r *readBuf) { - r = &readBuf{} - t = cn.recv1Buf(r) - return t, r -} - -func (cn *conn) ssl(o values) error { - upgrade, err := ssl(o) - if err != nil { - return err - } - - if upgrade == nil { - // Nothing to do - return nil - } - - w := cn.writeBuf(0) - w.int32(80877103) - if err = cn.sendStartupPacket(w); err != nil { - return err - } - - b := cn.scratch[:1] - _, err = io.ReadFull(cn.c, b) - if err != nil { - return err - } - - if b[0] != 'S' { - return ErrSSLNotSupported - } - - cn.c, err = upgrade(cn.c) - return err -} - -// isDriverSetting returns true iff a setting is purely for configuring the -// driver's options and should not be sent to the server in the connection -// startup packet. -func isDriverSetting(key string) bool { - switch key { - case "host", "port": - return true - case "password": - return true - case "sslmode", "sslcert", "sslkey", "sslrootcert": - return true - case "fallback_application_name": - return true - case "connect_timeout": - return true - case "disable_prepared_binary_result": - return true - case "binary_parameters": - return true - - default: - return false - } -} - -func (cn *conn) startup(o values) { - w := cn.writeBuf(0) - w.int32(196608) - // Send the backend the name of the database we want to connect to, and the - // user we want to connect as. Additionally, we send over any run-time - // parameters potentially included in the connection string. If the server - // doesn't recognize any of them, it will reply with an error. - for k, v := range o { - if isDriverSetting(k) { - // skip options which can't be run-time parameters - continue - } - // The protocol requires us to supply the database name as "database" - // instead of "dbname". - if k == "dbname" { - k = "database" - } - w.string(k) - w.string(v) - } - w.string("") - if err := cn.sendStartupPacket(w); err != nil { - panic(err) - } - - for { - t, r := cn.recv() - switch t { - case 'K': - cn.processBackendKeyData(r) - case 'S': - cn.processParameterStatus(r) - case 'R': - cn.auth(r, o) - case 'Z': - cn.processReadyForQuery(r) - return - default: - errorf("unknown response for startup: %q", t) - } - } -} - -func (cn *conn) auth(r *readBuf, o values) { - switch code := r.int32(); code { - case 0: - // OK - case 3: - w := cn.writeBuf('p') - w.string(o["password"]) - cn.send(w) - - t, r := cn.recv() - if t != 'R' { - errorf("unexpected password response: %q", t) - } - - if r.int32() != 0 { - errorf("unexpected authentication response: %q", t) - } - case 5: - s := string(r.next(4)) - w := cn.writeBuf('p') - w.string("md5" + md5s(md5s(o["password"]+o["user"])+s)) - cn.send(w) - - t, r := cn.recv() - if t != 'R' { - errorf("unexpected password response: %q", t) - } - - if r.int32() != 0 { - errorf("unexpected authentication response: %q", t) - } - default: - errorf("unknown authentication response: %d", code) - } -} - -type format int - -const formatText format = 0 -const formatBinary format = 1 - -// One result-column format code with the value 1 (i.e. all binary). -var colFmtDataAllBinary = []byte{0, 1, 0, 1} - -// No result-column format codes (i.e. all text). -var colFmtDataAllText = []byte{0, 0} - -type stmt struct { - cn *conn - name string - colNames []string - colFmts []format - colFmtData []byte - colTyps []fieldDesc - paramTyps []oid.Oid - closed bool -} - -func (st *stmt) Close() (err error) { - if st.closed { - return nil - } - if st.cn.bad { - return driver.ErrBadConn - } - defer st.cn.errRecover(&err) - - w := st.cn.writeBuf('C') - w.byte('S') - w.string(st.name) - st.cn.send(w) - - st.cn.send(st.cn.writeBuf('S')) - - t, _ := st.cn.recv1() - if t != '3' { - st.cn.bad = true - errorf("unexpected close response: %q", t) - } - st.closed = true - - t, r := st.cn.recv1() - if t != 'Z' { - st.cn.bad = true - errorf("expected ready for query, but got: %q", t) - } - st.cn.processReadyForQuery(r) - - return nil -} - -func (st *stmt) Query(v []driver.Value) (r driver.Rows, err error) { - if st.cn.bad { - return nil, driver.ErrBadConn - } - defer st.cn.errRecover(&err) - - st.exec(v) - return &rows{ - cn: st.cn, - colNames: st.colNames, - colTyps: st.colTyps, - colFmts: st.colFmts, - }, nil -} - -func (st *stmt) Exec(v []driver.Value) (res driver.Result, err error) { - if st.cn.bad { - return nil, driver.ErrBadConn - } - defer st.cn.errRecover(&err) - - st.exec(v) - res, _, err = st.cn.readExecuteResponse("simple query") - return res, err -} - -func (st *stmt) exec(v []driver.Value) { - if len(v) >= 65536 { - errorf("got %d parameters but PostgreSQL only supports 65535 parameters", len(v)) - } - if len(v) != len(st.paramTyps) { - errorf("got %d parameters but the statement requires %d", len(v), len(st.paramTyps)) - } - - cn := st.cn - w := cn.writeBuf('B') - w.byte(0) // unnamed portal - w.string(st.name) - - if cn.binaryParameters { - cn.sendBinaryParameters(w, v) - } else { - w.int16(0) - w.int16(len(v)) - for i, x := range v { - if x == nil { - w.int32(-1) - } else { - b := encode(&cn.parameterStatus, x, st.paramTyps[i]) - w.int32(len(b)) - w.bytes(b) - } - } - } - w.bytes(st.colFmtData) - - w.next('E') - w.byte(0) - w.int32(0) - - w.next('S') - cn.send(w) - - cn.readBindResponse() - cn.postExecuteWorkaround() - -} - -func (st *stmt) NumInput() int { - return len(st.paramTyps) -} - -// parseComplete parses the "command tag" from a CommandComplete message, and -// returns the number of rows affected (if applicable) and a string -// identifying only the command that was executed, e.g. "ALTER TABLE". If the -// command tag could not be parsed, parseComplete panics. -func (cn *conn) parseComplete(commandTag string) (driver.Result, string) { - commandsWithAffectedRows := []string{ - "SELECT ", - // INSERT is handled below - "UPDATE ", - "DELETE ", - "FETCH ", - "MOVE ", - "COPY ", - } - - var affectedRows *string - for _, tag := range commandsWithAffectedRows { - if strings.HasPrefix(commandTag, tag) { - t := commandTag[len(tag):] - affectedRows = &t - commandTag = tag[:len(tag)-1] - break - } - } - // INSERT also includes the oid of the inserted row in its command tag. - // Oids in user tables are deprecated, and the oid is only returned when - // exactly one row is inserted, so it's unlikely to be of value to any - // real-world application and we can ignore it. - if affectedRows == nil && strings.HasPrefix(commandTag, "INSERT ") { - parts := strings.Split(commandTag, " ") - if len(parts) != 3 { - cn.bad = true - errorf("unexpected INSERT command tag %s", commandTag) - } - affectedRows = &parts[len(parts)-1] - commandTag = "INSERT" - } - // There should be no affected rows attached to the tag, just return it - if affectedRows == nil { - return driver.RowsAffected(0), commandTag - } - n, err := strconv.ParseInt(*affectedRows, 10, 64) - if err != nil { - cn.bad = true - errorf("could not parse commandTag: %s", err) - } - return driver.RowsAffected(n), commandTag -} - -type rows struct { - cn *conn - finish func() - colNames []string - colTyps []fieldDesc - colFmts []format - done bool - rb readBuf - result driver.Result - tag string -} - -func (rs *rows) Close() error { - if finish := rs.finish; finish != nil { - defer finish() - } - // no need to look at cn.bad as Next() will - for { - err := rs.Next(nil) - switch err { - case nil: - case io.EOF: - // rs.Next can return io.EOF on both 'Z' (ready for query) and 'T' (row - // description, used with HasNextResultSet). We need to fetch messages until - // we hit a 'Z', which is done by waiting for done to be set. - if rs.done { - return nil - } - default: - return err - } - } -} - -func (rs *rows) Columns() []string { - return rs.colNames -} - -func (rs *rows) Result() driver.Result { - if rs.result == nil { - return emptyRows - } - return rs.result -} - -func (rs *rows) Tag() string { - return rs.tag -} - -func (rs *rows) Next(dest []driver.Value) (err error) { - if rs.done { - return io.EOF - } - - conn := rs.cn - if conn.bad { - return driver.ErrBadConn - } - defer conn.errRecover(&err) - - for { - t := conn.recv1Buf(&rs.rb) - switch t { - case 'E': - err = parseError(&rs.rb) - case 'C', 'I': - if t == 'C' { - rs.result, rs.tag = conn.parseComplete(rs.rb.string()) - } - continue - case 'Z': - conn.processReadyForQuery(&rs.rb) - rs.done = true - if err != nil { - return err - } - return io.EOF - case 'D': - n := rs.rb.int16() - if err != nil { - conn.bad = true - errorf("unexpected DataRow after error %s", err) - } - if n < len(dest) { - dest = dest[:n] - } - for i := range dest { - l := rs.rb.int32() - if l == -1 { - dest[i] = nil - continue - } - dest[i] = decode(&conn.parameterStatus, rs.rb.next(l), rs.colTyps[i].OID, rs.colFmts[i]) - } - return - case 'T': - rs.colNames, rs.colFmts, rs.colTyps = parsePortalRowDescribe(&rs.rb) - return io.EOF - default: - errorf("unexpected message after execute: %q", t) - } - } -} - -func (rs *rows) HasNextResultSet() bool { - return !rs.done -} - -func (rs *rows) NextResultSet() error { - return nil -} - -// QuoteIdentifier quotes an "identifier" (e.g. a table or a column name) to be -// used as part of an SQL statement. For example: -// -// tblname := "my_table" -// data := "my_data" -// quoted := pq.QuoteIdentifier(tblname) -// err := db.Exec(fmt.Sprintf("INSERT INTO %s VALUES ($1)", quoted), data) -// -// Any double quotes in name will be escaped. The quoted identifier will be -// case sensitive when used in a query. If the input string contains a zero -// byte, the result will be truncated immediately before it. -func QuoteIdentifier(name string) string { - end := strings.IndexRune(name, 0) - if end > -1 { - name = name[:end] - } - return `"` + strings.Replace(name, `"`, `""`, -1) + `"` -} - -func md5s(s string) string { - h := md5.New() - h.Write([]byte(s)) - return fmt.Sprintf("%x", h.Sum(nil)) -} - -func (cn *conn) sendBinaryParameters(b *writeBuf, args []driver.Value) { - // Do one pass over the parameters to see if we're going to send any of - // them over in binary. If we are, create a paramFormats array at the - // same time. - var paramFormats []int - for i, x := range args { - _, ok := x.([]byte) - if ok { - if paramFormats == nil { - paramFormats = make([]int, len(args)) - } - paramFormats[i] = 1 - } - } - if paramFormats == nil { - b.int16(0) - } else { - b.int16(len(paramFormats)) - for _, x := range paramFormats { - b.int16(x) - } - } - - b.int16(len(args)) - for _, x := range args { - if x == nil { - b.int32(-1) - } else { - datum := binaryEncode(&cn.parameterStatus, x) - b.int32(len(datum)) - b.bytes(datum) - } - } -} - -func (cn *conn) sendBinaryModeQuery(query string, args []driver.Value) { - if len(args) >= 65536 { - errorf("got %d parameters but PostgreSQL only supports 65535 parameters", len(args)) - } - - b := cn.writeBuf('P') - b.byte(0) // unnamed statement - b.string(query) - b.int16(0) - - b.next('B') - b.int16(0) // unnamed portal and statement - cn.sendBinaryParameters(b, args) - b.bytes(colFmtDataAllText) - - b.next('D') - b.byte('P') - b.byte(0) // unnamed portal - - b.next('E') - b.byte(0) - b.int32(0) - - b.next('S') - cn.send(b) -} - -func (cn *conn) processParameterStatus(r *readBuf) { - var err error - - param := r.string() - switch param { - case "server_version": - var major1 int - var major2 int - var minor int - _, err = fmt.Sscanf(r.string(), "%d.%d.%d", &major1, &major2, &minor) - if err == nil { - cn.parameterStatus.serverVersion = major1*10000 + major2*100 + minor - } - - case "TimeZone": - cn.parameterStatus.currentLocation, err = time.LoadLocation(r.string()) - if err != nil { - cn.parameterStatus.currentLocation = nil - } - - default: - // ignore - } -} - -func (cn *conn) processReadyForQuery(r *readBuf) { - cn.txnStatus = transactionStatus(r.byte()) -} - -func (cn *conn) readReadyForQuery() { - t, r := cn.recv1() - switch t { - case 'Z': - cn.processReadyForQuery(r) - return - default: - cn.bad = true - errorf("unexpected message %q; expected ReadyForQuery", t) - } -} - -func (cn *conn) processBackendKeyData(r *readBuf) { - cn.processID = r.int32() - cn.secretKey = r.int32() -} - -func (cn *conn) readParseResponse() { - t, r := cn.recv1() - switch t { - case '1': - return - case 'E': - err := parseError(r) - cn.readReadyForQuery() - panic(err) - default: - cn.bad = true - errorf("unexpected Parse response %q", t) - } -} - -func (cn *conn) readStatementDescribeResponse() (paramTyps []oid.Oid, colNames []string, colTyps []fieldDesc) { - for { - t, r := cn.recv1() - switch t { - case 't': - nparams := r.int16() - paramTyps = make([]oid.Oid, nparams) - for i := range paramTyps { - paramTyps[i] = r.oid() - } - case 'n': - return paramTyps, nil, nil - case 'T': - colNames, colTyps = parseStatementRowDescribe(r) - return paramTyps, colNames, colTyps - case 'E': - err := parseError(r) - cn.readReadyForQuery() - panic(err) - default: - cn.bad = true - errorf("unexpected Describe statement response %q", t) - } - } -} - -func (cn *conn) readPortalDescribeResponse() (colNames []string, colFmts []format, colTyps []fieldDesc) { - t, r := cn.recv1() - switch t { - case 'T': - return parsePortalRowDescribe(r) - case 'n': - return nil, nil, nil - case 'E': - err := parseError(r) - cn.readReadyForQuery() - panic(err) - default: - cn.bad = true - errorf("unexpected Describe response %q", t) - } - panic("not reached") -} - -func (cn *conn) readBindResponse() { - t, r := cn.recv1() - switch t { - case '2': - return - case 'E': - err := parseError(r) - cn.readReadyForQuery() - panic(err) - default: - cn.bad = true - errorf("unexpected Bind response %q", t) - } -} - -func (cn *conn) postExecuteWorkaround() { - // Work around a bug in sql.DB.QueryRow: in Go 1.2 and earlier it ignores - // any errors from rows.Next, which masks errors that happened during the - // execution of the query. To avoid the problem in common cases, we wait - // here for one more message from the database. If it's not an error the - // query will likely succeed (or perhaps has already, if it's a - // CommandComplete), so we push the message into the conn struct; recv1 - // will return it as the next message for rows.Next or rows.Close. - // However, if it's an error, we wait until ReadyForQuery and then return - // the error to our caller. - for { - t, r := cn.recv1() - switch t { - case 'E': - err := parseError(r) - cn.readReadyForQuery() - panic(err) - case 'C', 'D', 'I': - // the query didn't fail, but we can't process this message - cn.saveMessage(t, r) - return - default: - cn.bad = true - errorf("unexpected message during extended query execution: %q", t) - } - } -} - -// Only for Exec(), since we ignore the returned data -func (cn *conn) readExecuteResponse(protocolState string) (res driver.Result, commandTag string, err error) { - for { - t, r := cn.recv1() - switch t { - case 'C': - if err != nil { - cn.bad = true - errorf("unexpected CommandComplete after error %s", err) - } - res, commandTag = cn.parseComplete(r.string()) - case 'Z': - cn.processReadyForQuery(r) - if res == nil && err == nil { - err = errUnexpectedReady - } - return res, commandTag, err - case 'E': - err = parseError(r) - case 'T', 'D', 'I': - if err != nil { - cn.bad = true - errorf("unexpected %q after error %s", t, err) - } - if t == 'I' { - res = emptyRows - } - // ignore any results - default: - cn.bad = true - errorf("unknown %s response: %q", protocolState, t) - } - } -} - -func parseStatementRowDescribe(r *readBuf) (colNames []string, colTyps []fieldDesc) { - n := r.int16() - colNames = make([]string, n) - colTyps = make([]fieldDesc, n) - for i := range colNames { - colNames[i] = r.string() - r.next(6) - colTyps[i].OID = r.oid() - colTyps[i].Len = r.int16() - colTyps[i].Mod = r.int32() - // format code not known when describing a statement; always 0 - r.next(2) - } - return -} - -func parsePortalRowDescribe(r *readBuf) (colNames []string, colFmts []format, colTyps []fieldDesc) { - n := r.int16() - colNames = make([]string, n) - colFmts = make([]format, n) - colTyps = make([]fieldDesc, n) - for i := range colNames { - colNames[i] = r.string() - r.next(6) - colTyps[i].OID = r.oid() - colTyps[i].Len = r.int16() - colTyps[i].Mod = r.int32() - colFmts[i] = format(r.int16()) - } - return -} - -// parseEnviron tries to mimic some of libpq's environment handling -// -// To ease testing, it does not directly reference os.Environ, but is -// designed to accept its output. -// -// Environment-set connection information is intended to have a higher -// precedence than a library default but lower than any explicitly -// passed information (such as in the URL or connection string). -func parseEnviron(env []string) (out map[string]string) { - out = make(map[string]string) - - for _, v := range env { - parts := strings.SplitN(v, "=", 2) - - accrue := func(keyname string) { - out[keyname] = parts[1] - } - unsupported := func() { - panic(fmt.Sprintf("setting %v not supported", parts[0])) - } - - // The order of these is the same as is seen in the - // PostgreSQL 9.1 manual. Unsupported but well-defined - // keys cause a panic; these should be unset prior to - // execution. Options which pq expects to be set to a - // certain value are allowed, but must be set to that - // value if present (they can, of course, be absent). - switch parts[0] { - case "PGHOST": - accrue("host") - case "PGHOSTADDR": - unsupported() - case "PGPORT": - accrue("port") - case "PGDATABASE": - accrue("dbname") - case "PGUSER": - accrue("user") - case "PGPASSWORD": - accrue("password") - case "PGSERVICE", "PGSERVICEFILE", "PGREALM": - unsupported() - case "PGOPTIONS": - accrue("options") - case "PGAPPNAME": - accrue("application_name") - case "PGSSLMODE": - accrue("sslmode") - case "PGSSLCERT": - accrue("sslcert") - case "PGSSLKEY": - accrue("sslkey") - case "PGSSLROOTCERT": - accrue("sslrootcert") - case "PGREQUIRESSL", "PGSSLCRL": - unsupported() - case "PGREQUIREPEER": - unsupported() - case "PGKRBSRVNAME", "PGGSSLIB": - unsupported() - case "PGCONNECT_TIMEOUT": - accrue("connect_timeout") - case "PGCLIENTENCODING": - accrue("client_encoding") - case "PGDATESTYLE": - accrue("datestyle") - case "PGTZ": - accrue("timezone") - case "PGGEQO": - accrue("geqo") - case "PGSYSCONFDIR", "PGLOCALEDIR": - unsupported() - } - } - - return out -} - -// isUTF8 returns whether name is a fuzzy variation of the string "UTF-8". -func isUTF8(name string) bool { - // Recognize all sorts of silly things as "UTF-8", like Postgres does - s := strings.Map(alnumLowerASCII, name) - return s == "utf8" || s == "unicode" -} - -func alnumLowerASCII(ch rune) rune { - if 'A' <= ch && ch <= 'Z' { - return ch + ('a' - 'A') - } - if 'a' <= ch && ch <= 'z' || '0' <= ch && ch <= '9' { - return ch - } - return -1 // discard -} diff --git a/vendor/github.com/lib/pq/conn_go18.go b/vendor/github.com/lib/pq/conn_go18.go deleted file mode 100644 index a5254f2b4..000000000 --- a/vendor/github.com/lib/pq/conn_go18.go +++ /dev/null @@ -1,131 +0,0 @@ -// +build go1.8 - -package pq - -import ( - "context" - "database/sql" - "database/sql/driver" - "fmt" - "io" - "io/ioutil" -) - -// Implement the "QueryerContext" interface -func (cn *conn) QueryContext(ctx context.Context, query string, args []driver.NamedValue) (driver.Rows, error) { - list := make([]driver.Value, len(args)) - for i, nv := range args { - list[i] = nv.Value - } - finish := cn.watchCancel(ctx) - r, err := cn.query(query, list) - if err != nil { - if finish != nil { - finish() - } - return nil, err - } - r.finish = finish - return r, nil -} - -// Implement the "ExecerContext" interface -func (cn *conn) ExecContext(ctx context.Context, query string, args []driver.NamedValue) (driver.Result, error) { - list := make([]driver.Value, len(args)) - for i, nv := range args { - list[i] = nv.Value - } - - if finish := cn.watchCancel(ctx); finish != nil { - defer finish() - } - - return cn.Exec(query, list) -} - -// Implement the "ConnBeginTx" interface -func (cn *conn) BeginTx(ctx context.Context, opts driver.TxOptions) (driver.Tx, error) { - var mode string - - switch sql.IsolationLevel(opts.Isolation) { - case sql.LevelDefault: - // Don't touch mode: use the server's default - case sql.LevelReadUncommitted: - mode = " ISOLATION LEVEL READ UNCOMMITTED" - case sql.LevelReadCommitted: - mode = " ISOLATION LEVEL READ COMMITTED" - case sql.LevelRepeatableRead: - mode = " ISOLATION LEVEL REPEATABLE READ" - case sql.LevelSerializable: - mode = " ISOLATION LEVEL SERIALIZABLE" - default: - return nil, fmt.Errorf("pq: isolation level not supported: %d", opts.Isolation) - } - - if opts.ReadOnly { - mode += " READ ONLY" - } else { - mode += " READ WRITE" - } - - tx, err := cn.begin(mode) - if err != nil { - return nil, err - } - cn.txnFinish = cn.watchCancel(ctx) - return tx, nil -} - -func (cn *conn) watchCancel(ctx context.Context) func() { - if done := ctx.Done(); done != nil { - finished := make(chan struct{}) - go func() { - select { - case <-done: - _ = cn.cancel() - finished <- struct{}{} - case <-finished: - } - }() - return func() { - select { - case <-finished: - case finished <- struct{}{}: - } - } - } - return nil -} - -func (cn *conn) cancel() error { - c, err := dial(cn.dialer, cn.opts) - if err != nil { - return err - } - defer c.Close() - - { - can := conn{ - c: c, - } - err = can.ssl(cn.opts) - if err != nil { - return err - } - - w := can.writeBuf(0) - w.int32(80877102) // cancel request code - w.int32(cn.processID) - w.int32(cn.secretKey) - - if err := can.sendStartupPacket(w); err != nil { - return err - } - } - - // Read until EOF to ensure that the server received the cancel. - { - _, err := io.Copy(ioutil.Discard, c) - return err - } -} diff --git a/vendor/github.com/lib/pq/connector.go b/vendor/github.com/lib/pq/connector.go deleted file mode 100644 index 9e66eb5df..000000000 --- a/vendor/github.com/lib/pq/connector.go +++ /dev/null @@ -1,43 +0,0 @@ -// +build go1.10 - -package pq - -import ( - "context" - "database/sql/driver" -) - -// Connector represents a fixed configuration for the pq driver with a given -// name. Connector satisfies the database/sql/driver Connector interface and -// can be used to create any number of DB Conn's via the database/sql OpenDB -// function. -// -// See https://golang.org/pkg/database/sql/driver/#Connector. -// See https://golang.org/pkg/database/sql/#OpenDB. -type connector struct { - name string -} - -// Connect returns a connection to the database using the fixed configuration -// of this Connector. Context is not used. -func (c *connector) Connect(_ context.Context) (driver.Conn, error) { - return (&Driver{}).Open(c.name) -} - -// Driver returnst the underlying driver of this Connector. -func (c *connector) Driver() driver.Driver { - return &Driver{} -} - -var _ driver.Connector = &connector{} - -// NewConnector returns a connector for the pq driver in a fixed configuration -// with the given name. The returned connector can be used to create any number -// of equivalent Conn's. The returned connector is intended to be used with -// database/sql.OpenDB. -// -// See https://golang.org/pkg/database/sql/driver/#Connector. -// See https://golang.org/pkg/database/sql/#OpenDB. -func NewConnector(name string) (driver.Connector, error) { - return &connector{name: name}, nil -} diff --git a/vendor/github.com/lib/pq/copy.go b/vendor/github.com/lib/pq/copy.go deleted file mode 100644 index 345c2398f..000000000 --- a/vendor/github.com/lib/pq/copy.go +++ /dev/null @@ -1,282 +0,0 @@ -package pq - -import ( - "database/sql/driver" - "encoding/binary" - "errors" - "fmt" - "sync" -) - -var ( - errCopyInClosed = errors.New("pq: copyin statement has already been closed") - errBinaryCopyNotSupported = errors.New("pq: only text format supported for COPY") - errCopyToNotSupported = errors.New("pq: COPY TO is not supported") - errCopyNotSupportedOutsideTxn = errors.New("pq: COPY is only allowed inside a transaction") - errCopyInProgress = errors.New("pq: COPY in progress") -) - -// CopyIn creates a COPY FROM statement which can be prepared with -// Tx.Prepare(). The target table should be visible in search_path. -func CopyIn(table string, columns ...string) string { - stmt := "COPY " + QuoteIdentifier(table) + " (" - for i, col := range columns { - if i != 0 { - stmt += ", " - } - stmt += QuoteIdentifier(col) - } - stmt += ") FROM STDIN" - return stmt -} - -// CopyInSchema creates a COPY FROM statement which can be prepared with -// Tx.Prepare(). -func CopyInSchema(schema, table string, columns ...string) string { - stmt := "COPY " + QuoteIdentifier(schema) + "." + QuoteIdentifier(table) + " (" - for i, col := range columns { - if i != 0 { - stmt += ", " - } - stmt += QuoteIdentifier(col) - } - stmt += ") FROM STDIN" - return stmt -} - -type copyin struct { - cn *conn - buffer []byte - rowData chan []byte - done chan bool - - closed bool - - sync.Mutex // guards err - err error -} - -const ciBufferSize = 64 * 1024 - -// flush buffer before the buffer is filled up and needs reallocation -const ciBufferFlushSize = 63 * 1024 - -func (cn *conn) prepareCopyIn(q string) (_ driver.Stmt, err error) { - if !cn.isInTransaction() { - return nil, errCopyNotSupportedOutsideTxn - } - - ci := ©in{ - cn: cn, - buffer: make([]byte, 0, ciBufferSize), - rowData: make(chan []byte), - done: make(chan bool, 1), - } - // add CopyData identifier + 4 bytes for message length - ci.buffer = append(ci.buffer, 'd', 0, 0, 0, 0) - - b := cn.writeBuf('Q') - b.string(q) - cn.send(b) - -awaitCopyInResponse: - for { - t, r := cn.recv1() - switch t { - case 'G': - if r.byte() != 0 { - err = errBinaryCopyNotSupported - break awaitCopyInResponse - } - go ci.resploop() - return ci, nil - case 'H': - err = errCopyToNotSupported - break awaitCopyInResponse - case 'E': - err = parseError(r) - case 'Z': - if err == nil { - ci.setBad() - errorf("unexpected ReadyForQuery in response to COPY") - } - cn.processReadyForQuery(r) - return nil, err - default: - ci.setBad() - errorf("unknown response for copy query: %q", t) - } - } - - // something went wrong, abort COPY before we return - b = cn.writeBuf('f') - b.string(err.Error()) - cn.send(b) - - for { - t, r := cn.recv1() - switch t { - case 'c', 'C', 'E': - case 'Z': - // correctly aborted, we're done - cn.processReadyForQuery(r) - return nil, err - default: - ci.setBad() - errorf("unknown response for CopyFail: %q", t) - } - } -} - -func (ci *copyin) flush(buf []byte) { - // set message length (without message identifier) - binary.BigEndian.PutUint32(buf[1:], uint32(len(buf)-1)) - - _, err := ci.cn.c.Write(buf) - if err != nil { - panic(err) - } -} - -func (ci *copyin) resploop() { - for { - var r readBuf - t, err := ci.cn.recvMessage(&r) - if err != nil { - ci.setBad() - ci.setError(err) - ci.done <- true - return - } - switch t { - case 'C': - // complete - case 'N': - // NoticeResponse - case 'Z': - ci.cn.processReadyForQuery(&r) - ci.done <- true - return - case 'E': - err := parseError(&r) - ci.setError(err) - default: - ci.setBad() - ci.setError(fmt.Errorf("unknown response during CopyIn: %q", t)) - ci.done <- true - return - } - } -} - -func (ci *copyin) setBad() { - ci.Lock() - ci.cn.bad = true - ci.Unlock() -} - -func (ci *copyin) isBad() bool { - ci.Lock() - b := ci.cn.bad - ci.Unlock() - return b -} - -func (ci *copyin) isErrorSet() bool { - ci.Lock() - isSet := (ci.err != nil) - ci.Unlock() - return isSet -} - -// setError() sets ci.err if one has not been set already. Caller must not be -// holding ci.Mutex. -func (ci *copyin) setError(err error) { - ci.Lock() - if ci.err == nil { - ci.err = err - } - ci.Unlock() -} - -func (ci *copyin) NumInput() int { - return -1 -} - -func (ci *copyin) Query(v []driver.Value) (r driver.Rows, err error) { - return nil, ErrNotSupported -} - -// Exec inserts values into the COPY stream. The insert is asynchronous -// and Exec can return errors from previous Exec calls to the same -// COPY stmt. -// -// You need to call Exec(nil) to sync the COPY stream and to get any -// errors from pending data, since Stmt.Close() doesn't return errors -// to the user. -func (ci *copyin) Exec(v []driver.Value) (r driver.Result, err error) { - if ci.closed { - return nil, errCopyInClosed - } - - if ci.isBad() { - return nil, driver.ErrBadConn - } - defer ci.cn.errRecover(&err) - - if ci.isErrorSet() { - return nil, ci.err - } - - if len(v) == 0 { - return nil, ci.Close() - } - - numValues := len(v) - for i, value := range v { - ci.buffer = appendEncodedText(&ci.cn.parameterStatus, ci.buffer, value) - if i < numValues-1 { - ci.buffer = append(ci.buffer, '\t') - } - } - - ci.buffer = append(ci.buffer, '\n') - - if len(ci.buffer) > ciBufferFlushSize { - ci.flush(ci.buffer) - // reset buffer, keep bytes for message identifier and length - ci.buffer = ci.buffer[:5] - } - - return driver.RowsAffected(0), nil -} - -func (ci *copyin) Close() (err error) { - if ci.closed { // Don't do anything, we're already closed - return nil - } - ci.closed = true - - if ci.isBad() { - return driver.ErrBadConn - } - defer ci.cn.errRecover(&err) - - if len(ci.buffer) > 0 { - ci.flush(ci.buffer) - } - // Avoid touching the scratch buffer as resploop could be using it. - err = ci.cn.sendSimpleMessage('c') - if err != nil { - return err - } - - <-ci.done - ci.cn.inCopy = false - - if ci.isErrorSet() { - err = ci.err - return err - } - return nil -} diff --git a/vendor/github.com/lib/pq/doc.go b/vendor/github.com/lib/pq/doc.go deleted file mode 100644 index a1b029713..000000000 --- a/vendor/github.com/lib/pq/doc.go +++ /dev/null @@ -1,245 +0,0 @@ -/* -Package pq is a pure Go Postgres driver for the database/sql package. - -In most cases clients will use the database/sql package instead of -using this package directly. For example: - - import ( - "database/sql" - - _ "github.com/lib/pq" - ) - - func main() { - connStr := "user=pqgotest dbname=pqgotest sslmode=verify-full" - db, err := sql.Open("postgres", connStr) - if err != nil { - log.Fatal(err) - } - - age := 21 - rows, err := db.Query("SELECT name FROM users WHERE age = $1", age) - … - } - -You can also connect to a database using a URL. For example: - - connStr := "postgres://pqgotest:password@localhost/pqgotest?sslmode=verify-full" - db, err := sql.Open("postgres", connStr) - - -Connection String Parameters - - -Similarly to libpq, when establishing a connection using pq you are expected to -supply a connection string containing zero or more parameters. -A subset of the connection parameters supported by libpq are also supported by pq. -Additionally, pq also lets you specify run-time parameters (such as search_path or work_mem) -directly in the connection string. This is different from libpq, which does not allow -run-time parameters in the connection string, instead requiring you to supply -them in the options parameter. - -For compatibility with libpq, the following special connection parameters are -supported: - - * dbname - The name of the database to connect to - * user - The user to sign in as - * password - The user's password - * host - The host to connect to. Values that start with / are for unix - domain sockets. (default is localhost) - * port - The port to bind to. (default is 5432) - * sslmode - Whether or not to use SSL (default is require, this is not - the default for libpq) - * fallback_application_name - An application_name to fall back to if one isn't provided. - * connect_timeout - Maximum wait for connection, in seconds. Zero or - not specified means wait indefinitely. - * sslcert - Cert file location. The file must contain PEM encoded data. - * sslkey - Key file location. The file must contain PEM encoded data. - * sslrootcert - The location of the root certificate file. The file - must contain PEM encoded data. - -Valid values for sslmode are: - - * disable - No SSL - * require - Always SSL (skip verification) - * verify-ca - Always SSL (verify that the certificate presented by the - server was signed by a trusted CA) - * verify-full - Always SSL (verify that the certification presented by - the server was signed by a trusted CA and the server host name - matches the one in the certificate) - -See http://www.postgresql.org/docs/current/static/libpq-connect.html#LIBPQ-CONNSTRING -for more information about connection string parameters. - -Use single quotes for values that contain whitespace: - - "user=pqgotest password='with spaces'" - -A backslash will escape the next character in values: - - "user=space\ man password='it\'s valid'" - -Note that the connection parameter client_encoding (which sets the -text encoding for the connection) may be set but must be "UTF8", -matching with the same rules as Postgres. It is an error to provide -any other value. - -In addition to the parameters listed above, any run-time parameter that can be -set at backend start time can be set in the connection string. For more -information, see -http://www.postgresql.org/docs/current/static/runtime-config.html. - -Most environment variables as specified at http://www.postgresql.org/docs/current/static/libpq-envars.html -supported by libpq are also supported by pq. If any of the environment -variables not supported by pq are set, pq will panic during connection -establishment. Environment variables have a lower precedence than explicitly -provided connection parameters. - -The pgpass mechanism as described in http://www.postgresql.org/docs/current/static/libpq-pgpass.html -is supported, but on Windows PGPASSFILE must be specified explicitly. - - -Queries - - -database/sql does not dictate any specific format for parameter -markers in query strings, and pq uses the Postgres-native ordinal markers, -as shown above. The same marker can be reused for the same parameter: - - rows, err := db.Query(`SELECT name FROM users WHERE favorite_fruit = $1 - OR age BETWEEN $2 AND $2 + 3`, "orange", 64) - -pq does not support the LastInsertId() method of the Result type in database/sql. -To return the identifier of an INSERT (or UPDATE or DELETE), use the Postgres -RETURNING clause with a standard Query or QueryRow call: - - var userid int - err := db.QueryRow(`INSERT INTO users(name, favorite_fruit, age) - VALUES('beatrice', 'starfruit', 93) RETURNING id`).Scan(&userid) - -For more details on RETURNING, see the Postgres documentation: - - http://www.postgresql.org/docs/current/static/sql-insert.html - http://www.postgresql.org/docs/current/static/sql-update.html - http://www.postgresql.org/docs/current/static/sql-delete.html - -For additional instructions on querying see the documentation for the database/sql package. - - -Data Types - - -Parameters pass through driver.DefaultParameterConverter before they are handled -by this package. When the binary_parameters connection option is enabled, -[]byte values are sent directly to the backend as data in binary format. - -This package returns the following types for values from the PostgreSQL backend: - - - integer types smallint, integer, and bigint are returned as int64 - - floating-point types real and double precision are returned as float64 - - character types char, varchar, and text are returned as string - - temporal types date, time, timetz, timestamp, and timestamptz are - returned as time.Time - - the boolean type is returned as bool - - the bytea type is returned as []byte - -All other types are returned directly from the backend as []byte values in text format. - - -Errors - - -pq may return errors of type *pq.Error which can be interrogated for error details: - - if err, ok := err.(*pq.Error); ok { - fmt.Println("pq error:", err.Code.Name()) - } - -See the pq.Error type for details. - - -Bulk imports - -You can perform bulk imports by preparing a statement returned by pq.CopyIn (or -pq.CopyInSchema) in an explicit transaction (sql.Tx). The returned statement -handle can then be repeatedly "executed" to copy data into the target table. -After all data has been processed you should call Exec() once with no arguments -to flush all buffered data. Any call to Exec() might return an error which -should be handled appropriately, but because of the internal buffering an error -returned by Exec() might not be related to the data passed in the call that -failed. - -CopyIn uses COPY FROM internally. It is not possible to COPY outside of an -explicit transaction in pq. - -Usage example: - - txn, err := db.Begin() - if err != nil { - log.Fatal(err) - } - - stmt, err := txn.Prepare(pq.CopyIn("users", "name", "age")) - if err != nil { - log.Fatal(err) - } - - for _, user := range users { - _, err = stmt.Exec(user.Name, int64(user.Age)) - if err != nil { - log.Fatal(err) - } - } - - _, err = stmt.Exec() - if err != nil { - log.Fatal(err) - } - - err = stmt.Close() - if err != nil { - log.Fatal(err) - } - - err = txn.Commit() - if err != nil { - log.Fatal(err) - } - - -Notifications - - -PostgreSQL supports a simple publish/subscribe model over database -connections. See http://www.postgresql.org/docs/current/static/sql-notify.html -for more information about the general mechanism. - -To start listening for notifications, you first have to open a new connection -to the database by calling NewListener. This connection can not be used for -anything other than LISTEN / NOTIFY. Calling Listen will open a "notification -channel"; once a notification channel is open, a notification generated on that -channel will effect a send on the Listener.Notify channel. A notification -channel will remain open until Unlisten is called, though connection loss might -result in some notifications being lost. To solve this problem, Listener sends -a nil pointer over the Notify channel any time the connection is re-established -following a connection loss. The application can get information about the -state of the underlying connection by setting an event callback in the call to -NewListener. - -A single Listener can safely be used from concurrent goroutines, which means -that there is often no need to create more than one Listener in your -application. However, a Listener is always connected to a single database, so -you will need to create a new Listener instance for every database you want to -receive notifications in. - -The channel name in both Listen and Unlisten is case sensitive, and can contain -any characters legal in an identifier (see -http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS -for more information). Note that the channel name will be truncated to 63 -bytes by the PostgreSQL server. - -You can find a complete, working example of Listener usage at -http://godoc.org/github.com/lib/pq/example/listen. - -*/ -package pq diff --git a/vendor/github.com/lib/pq/encode.go b/vendor/github.com/lib/pq/encode.go deleted file mode 100644 index 3b0d365f2..000000000 --- a/vendor/github.com/lib/pq/encode.go +++ /dev/null @@ -1,603 +0,0 @@ -package pq - -import ( - "bytes" - "database/sql/driver" - "encoding/binary" - "encoding/hex" - "errors" - "fmt" - "math" - "strconv" - "strings" - "sync" - "time" - - "github.com/lib/pq/oid" -) - -func binaryEncode(parameterStatus *parameterStatus, x interface{}) []byte { - switch v := x.(type) { - case []byte: - return v - default: - return encode(parameterStatus, x, oid.T_unknown) - } -} - -func encode(parameterStatus *parameterStatus, x interface{}, pgtypOid oid.Oid) []byte { - switch v := x.(type) { - case int64: - return strconv.AppendInt(nil, v, 10) - case float64: - return strconv.AppendFloat(nil, v, 'f', -1, 64) - case []byte: - if pgtypOid == oid.T_bytea { - return encodeBytea(parameterStatus.serverVersion, v) - } - - return v - case string: - if pgtypOid == oid.T_bytea { - return encodeBytea(parameterStatus.serverVersion, []byte(v)) - } - - return []byte(v) - case bool: - return strconv.AppendBool(nil, v) - case time.Time: - return formatTs(v) - - default: - errorf("encode: unknown type for %T", v) - } - - panic("not reached") -} - -func decode(parameterStatus *parameterStatus, s []byte, typ oid.Oid, f format) interface{} { - switch f { - case formatBinary: - return binaryDecode(parameterStatus, s, typ) - case formatText: - return textDecode(parameterStatus, s, typ) - default: - panic("not reached") - } -} - -func binaryDecode(parameterStatus *parameterStatus, s []byte, typ oid.Oid) interface{} { - switch typ { - case oid.T_bytea: - return s - case oid.T_int8: - return int64(binary.BigEndian.Uint64(s)) - case oid.T_int4: - return int64(int32(binary.BigEndian.Uint32(s))) - case oid.T_int2: - return int64(int16(binary.BigEndian.Uint16(s))) - case oid.T_uuid: - b, err := decodeUUIDBinary(s) - if err != nil { - panic(err) - } - return b - - default: - errorf("don't know how to decode binary parameter of type %d", uint32(typ)) - } - - panic("not reached") -} - -func textDecode(parameterStatus *parameterStatus, s []byte, typ oid.Oid) interface{} { - switch typ { - case oid.T_char, oid.T_varchar, oid.T_text: - return string(s) - case oid.T_bytea: - b, err := parseBytea(s) - if err != nil { - errorf("%s", err) - } - return b - case oid.T_timestamptz: - return parseTs(parameterStatus.currentLocation, string(s)) - case oid.T_timestamp, oid.T_date: - return parseTs(nil, string(s)) - case oid.T_time: - return mustParse("15:04:05", typ, s) - case oid.T_timetz: - return mustParse("15:04:05-07", typ, s) - case oid.T_bool: - return s[0] == 't' - case oid.T_int8, oid.T_int4, oid.T_int2: - i, err := strconv.ParseInt(string(s), 10, 64) - if err != nil { - errorf("%s", err) - } - return i - case oid.T_float4, oid.T_float8: - bits := 64 - if typ == oid.T_float4 { - bits = 32 - } - f, err := strconv.ParseFloat(string(s), bits) - if err != nil { - errorf("%s", err) - } - return f - } - - return s -} - -// appendEncodedText encodes item in text format as required by COPY -// and appends to buf -func appendEncodedText(parameterStatus *parameterStatus, buf []byte, x interface{}) []byte { - switch v := x.(type) { - case int64: - return strconv.AppendInt(buf, v, 10) - case float64: - return strconv.AppendFloat(buf, v, 'f', -1, 64) - case []byte: - encodedBytea := encodeBytea(parameterStatus.serverVersion, v) - return appendEscapedText(buf, string(encodedBytea)) - case string: - return appendEscapedText(buf, v) - case bool: - return strconv.AppendBool(buf, v) - case time.Time: - return append(buf, formatTs(v)...) - case nil: - return append(buf, "\\N"...) - default: - errorf("encode: unknown type for %T", v) - } - - panic("not reached") -} - -func appendEscapedText(buf []byte, text string) []byte { - escapeNeeded := false - startPos := 0 - var c byte - - // check if we need to escape - for i := 0; i < len(text); i++ { - c = text[i] - if c == '\\' || c == '\n' || c == '\r' || c == '\t' { - escapeNeeded = true - startPos = i - break - } - } - if !escapeNeeded { - return append(buf, text...) - } - - // copy till first char to escape, iterate the rest - result := append(buf, text[:startPos]...) - for i := startPos; i < len(text); i++ { - c = text[i] - switch c { - case '\\': - result = append(result, '\\', '\\') - case '\n': - result = append(result, '\\', 'n') - case '\r': - result = append(result, '\\', 'r') - case '\t': - result = append(result, '\\', 't') - default: - result = append(result, c) - } - } - return result -} - -func mustParse(f string, typ oid.Oid, s []byte) time.Time { - str := string(s) - - // check for a 30-minute-offset timezone - if (typ == oid.T_timestamptz || typ == oid.T_timetz) && - str[len(str)-3] == ':' { - f += ":00" - } - t, err := time.Parse(f, str) - if err != nil { - errorf("decode: %s", err) - } - return t -} - -var errInvalidTimestamp = errors.New("invalid timestamp") - -type timestampParser struct { - err error -} - -func (p *timestampParser) expect(str string, char byte, pos int) { - if p.err != nil { - return - } - if pos+1 > len(str) { - p.err = errInvalidTimestamp - return - } - if c := str[pos]; c != char && p.err == nil { - p.err = fmt.Errorf("expected '%v' at position %v; got '%v'", char, pos, c) - } -} - -func (p *timestampParser) mustAtoi(str string, begin int, end int) int { - if p.err != nil { - return 0 - } - if begin < 0 || end < 0 || begin > end || end > len(str) { - p.err = errInvalidTimestamp - return 0 - } - result, err := strconv.Atoi(str[begin:end]) - if err != nil { - if p.err == nil { - p.err = fmt.Errorf("expected number; got '%v'", str) - } - return 0 - } - return result -} - -// The location cache caches the time zones typically used by the client. -type locationCache struct { - cache map[int]*time.Location - lock sync.Mutex -} - -// All connections share the same list of timezones. Benchmarking shows that -// about 5% speed could be gained by putting the cache in the connection and -// losing the mutex, at the cost of a small amount of memory and a somewhat -// significant increase in code complexity. -var globalLocationCache = newLocationCache() - -func newLocationCache() *locationCache { - return &locationCache{cache: make(map[int]*time.Location)} -} - -// Returns the cached timezone for the specified offset, creating and caching -// it if necessary. -func (c *locationCache) getLocation(offset int) *time.Location { - c.lock.Lock() - defer c.lock.Unlock() - - location, ok := c.cache[offset] - if !ok { - location = time.FixedZone("", offset) - c.cache[offset] = location - } - - return location -} - -var infinityTsEnabled = false -var infinityTsNegative time.Time -var infinityTsPositive time.Time - -const ( - infinityTsEnabledAlready = "pq: infinity timestamp enabled already" - infinityTsNegativeMustBeSmaller = "pq: infinity timestamp: negative value must be smaller (before) than positive" -) - -// EnableInfinityTs controls the handling of Postgres' "-infinity" and -// "infinity" "timestamp"s. -// -// If EnableInfinityTs is not called, "-infinity" and "infinity" will return -// []byte("-infinity") and []byte("infinity") respectively, and potentially -// cause error "sql: Scan error on column index 0: unsupported driver -> Scan -// pair: []uint8 -> *time.Time", when scanning into a time.Time value. -// -// Once EnableInfinityTs has been called, all connections created using this -// driver will decode Postgres' "-infinity" and "infinity" for "timestamp", -// "timestamp with time zone" and "date" types to the predefined minimum and -// maximum times, respectively. When encoding time.Time values, any time which -// equals or precedes the predefined minimum time will be encoded to -// "-infinity". Any values at or past the maximum time will similarly be -// encoded to "infinity". -// -// If EnableInfinityTs is called with negative >= positive, it will panic. -// Calling EnableInfinityTs after a connection has been established results in -// undefined behavior. If EnableInfinityTs is called more than once, it will -// panic. -func EnableInfinityTs(negative time.Time, positive time.Time) { - if infinityTsEnabled { - panic(infinityTsEnabledAlready) - } - if !negative.Before(positive) { - panic(infinityTsNegativeMustBeSmaller) - } - infinityTsEnabled = true - infinityTsNegative = negative - infinityTsPositive = positive -} - -/* - * Testing might want to toggle infinityTsEnabled - */ -func disableInfinityTs() { - infinityTsEnabled = false -} - -// This is a time function specific to the Postgres default DateStyle -// setting ("ISO, MDY"), the only one we currently support. This -// accounts for the discrepancies between the parsing available with -// time.Parse and the Postgres date formatting quirks. -func parseTs(currentLocation *time.Location, str string) interface{} { - switch str { - case "-infinity": - if infinityTsEnabled { - return infinityTsNegative - } - return []byte(str) - case "infinity": - if infinityTsEnabled { - return infinityTsPositive - } - return []byte(str) - } - t, err := ParseTimestamp(currentLocation, str) - if err != nil { - panic(err) - } - return t -} - -// ParseTimestamp parses Postgres' text format. It returns a time.Time in -// currentLocation iff that time's offset agrees with the offset sent from the -// Postgres server. Otherwise, ParseTimestamp returns a time.Time with the -// fixed offset offset provided by the Postgres server. -func ParseTimestamp(currentLocation *time.Location, str string) (time.Time, error) { - p := timestampParser{} - - monSep := strings.IndexRune(str, '-') - // this is Gregorian year, not ISO Year - // In Gregorian system, the year 1 BC is followed by AD 1 - year := p.mustAtoi(str, 0, monSep) - daySep := monSep + 3 - month := p.mustAtoi(str, monSep+1, daySep) - p.expect(str, '-', daySep) - timeSep := daySep + 3 - day := p.mustAtoi(str, daySep+1, timeSep) - - minLen := monSep + len("01-01") + 1 - - isBC := strings.HasSuffix(str, " BC") - if isBC { - minLen += 3 - } - - var hour, minute, second int - if len(str) > minLen { - p.expect(str, ' ', timeSep) - minSep := timeSep + 3 - p.expect(str, ':', minSep) - hour = p.mustAtoi(str, timeSep+1, minSep) - secSep := minSep + 3 - p.expect(str, ':', secSep) - minute = p.mustAtoi(str, minSep+1, secSep) - secEnd := secSep + 3 - second = p.mustAtoi(str, secSep+1, secEnd) - } - remainderIdx := monSep + len("01-01 00:00:00") + 1 - // Three optional (but ordered) sections follow: the - // fractional seconds, the time zone offset, and the BC - // designation. We set them up here and adjust the other - // offsets if the preceding sections exist. - - nanoSec := 0 - tzOff := 0 - - if remainderIdx < len(str) && str[remainderIdx] == '.' { - fracStart := remainderIdx + 1 - fracOff := strings.IndexAny(str[fracStart:], "-+ ") - if fracOff < 0 { - fracOff = len(str) - fracStart - } - fracSec := p.mustAtoi(str, fracStart, fracStart+fracOff) - nanoSec = fracSec * (1000000000 / int(math.Pow(10, float64(fracOff)))) - - remainderIdx += fracOff + 1 - } - if tzStart := remainderIdx; tzStart < len(str) && (str[tzStart] == '-' || str[tzStart] == '+') { - // time zone separator is always '-' or '+' (UTC is +00) - var tzSign int - switch c := str[tzStart]; c { - case '-': - tzSign = -1 - case '+': - tzSign = +1 - default: - return time.Time{}, fmt.Errorf("expected '-' or '+' at position %v; got %v", tzStart, c) - } - tzHours := p.mustAtoi(str, tzStart+1, tzStart+3) - remainderIdx += 3 - var tzMin, tzSec int - if remainderIdx < len(str) && str[remainderIdx] == ':' { - tzMin = p.mustAtoi(str, remainderIdx+1, remainderIdx+3) - remainderIdx += 3 - } - if remainderIdx < len(str) && str[remainderIdx] == ':' { - tzSec = p.mustAtoi(str, remainderIdx+1, remainderIdx+3) - remainderIdx += 3 - } - tzOff = tzSign * ((tzHours * 60 * 60) + (tzMin * 60) + tzSec) - } - var isoYear int - - if isBC { - isoYear = 1 - year - remainderIdx += 3 - } else { - isoYear = year - } - if remainderIdx < len(str) { - return time.Time{}, fmt.Errorf("expected end of input, got %v", str[remainderIdx:]) - } - t := time.Date(isoYear, time.Month(month), day, - hour, minute, second, nanoSec, - globalLocationCache.getLocation(tzOff)) - - if currentLocation != nil { - // Set the location of the returned Time based on the session's - // TimeZone value, but only if the local time zone database agrees with - // the remote database on the offset. - lt := t.In(currentLocation) - _, newOff := lt.Zone() - if newOff == tzOff { - t = lt - } - } - - return t, p.err -} - -// formatTs formats t into a format postgres understands. -func formatTs(t time.Time) []byte { - if infinityTsEnabled { - // t <= -infinity : ! (t > -infinity) - if !t.After(infinityTsNegative) { - return []byte("-infinity") - } - // t >= infinity : ! (!t < infinity) - if !t.Before(infinityTsPositive) { - return []byte("infinity") - } - } - return FormatTimestamp(t) -} - -// FormatTimestamp formats t into Postgres' text format for timestamps. -func FormatTimestamp(t time.Time) []byte { - // Need to send dates before 0001 A.D. with " BC" suffix, instead of the - // minus sign preferred by Go. - // Beware, "0000" in ISO is "1 BC", "-0001" is "2 BC" and so on - bc := false - if t.Year() <= 0 { - // flip year sign, and add 1, e.g: "0" will be "1", and "-10" will be "11" - t = t.AddDate((-t.Year())*2+1, 0, 0) - bc = true - } - b := []byte(t.Format("2006-01-02 15:04:05.999999999Z07:00")) - - _, offset := t.Zone() - offset = offset % 60 - if offset != 0 { - // RFC3339Nano already printed the minus sign - if offset < 0 { - offset = -offset - } - - b = append(b, ':') - if offset < 10 { - b = append(b, '0') - } - b = strconv.AppendInt(b, int64(offset), 10) - } - - if bc { - b = append(b, " BC"...) - } - return b -} - -// Parse a bytea value received from the server. Both "hex" and the legacy -// "escape" format are supported. -func parseBytea(s []byte) (result []byte, err error) { - if len(s) >= 2 && bytes.Equal(s[:2], []byte("\\x")) { - // bytea_output = hex - s = s[2:] // trim off leading "\\x" - result = make([]byte, hex.DecodedLen(len(s))) - _, err := hex.Decode(result, s) - if err != nil { - return nil, err - } - } else { - // bytea_output = escape - for len(s) > 0 { - if s[0] == '\\' { - // escaped '\\' - if len(s) >= 2 && s[1] == '\\' { - result = append(result, '\\') - s = s[2:] - continue - } - - // '\\' followed by an octal number - if len(s) < 4 { - return nil, fmt.Errorf("invalid bytea sequence %v", s) - } - r, err := strconv.ParseInt(string(s[1:4]), 8, 9) - if err != nil { - return nil, fmt.Errorf("could not parse bytea value: %s", err.Error()) - } - result = append(result, byte(r)) - s = s[4:] - } else { - // We hit an unescaped, raw byte. Try to read in as many as - // possible in one go. - i := bytes.IndexByte(s, '\\') - if i == -1 { - result = append(result, s...) - break - } - result = append(result, s[:i]...) - s = s[i:] - } - } - } - - return result, nil -} - -func encodeBytea(serverVersion int, v []byte) (result []byte) { - if serverVersion >= 90000 { - // Use the hex format if we know that the server supports it - result = make([]byte, 2+hex.EncodedLen(len(v))) - result[0] = '\\' - result[1] = 'x' - hex.Encode(result[2:], v) - } else { - // .. or resort to "escape" - for _, b := range v { - if b == '\\' { - result = append(result, '\\', '\\') - } else if b < 0x20 || b > 0x7e { - result = append(result, []byte(fmt.Sprintf("\\%03o", b))...) - } else { - result = append(result, b) - } - } - } - - return result -} - -// NullTime represents a time.Time that may be null. NullTime implements the -// sql.Scanner interface so it can be used as a scan destination, similar to -// sql.NullString. -type NullTime struct { - Time time.Time - Valid bool // Valid is true if Time is not NULL -} - -// Scan implements the Scanner interface. -func (nt *NullTime) Scan(value interface{}) error { - nt.Time, nt.Valid = value.(time.Time) - return nil -} - -// Value implements the driver Valuer interface. -func (nt NullTime) Value() (driver.Value, error) { - if !nt.Valid { - return nil, nil - } - return nt.Time, nil -} diff --git a/vendor/github.com/lib/pq/error.go b/vendor/github.com/lib/pq/error.go deleted file mode 100644 index 96aae29c6..000000000 --- a/vendor/github.com/lib/pq/error.go +++ /dev/null @@ -1,515 +0,0 @@ -package pq - -import ( - "database/sql/driver" - "fmt" - "io" - "net" - "runtime" -) - -// Error severities -const ( - Efatal = "FATAL" - Epanic = "PANIC" - Ewarning = "WARNING" - Enotice = "NOTICE" - Edebug = "DEBUG" - Einfo = "INFO" - Elog = "LOG" -) - -// Error represents an error communicating with the server. -// -// See http://www.postgresql.org/docs/current/static/protocol-error-fields.html for details of the fields -type Error struct { - Severity string - Code ErrorCode - Message string - Detail string - Hint string - Position string - InternalPosition string - InternalQuery string - Where string - Schema string - Table string - Column string - DataTypeName string - Constraint string - File string - Line string - Routine string -} - -// ErrorCode is a five-character error code. -type ErrorCode string - -// Name returns a more human friendly rendering of the error code, namely the -// "condition name". -// -// See http://www.postgresql.org/docs/9.3/static/errcodes-appendix.html for -// details. -func (ec ErrorCode) Name() string { - return errorCodeNames[ec] -} - -// ErrorClass is only the class part of an error code. -type ErrorClass string - -// Name returns the condition name of an error class. It is equivalent to the -// condition name of the "standard" error code (i.e. the one having the last -// three characters "000"). -func (ec ErrorClass) Name() string { - return errorCodeNames[ErrorCode(ec+"000")] -} - -// Class returns the error class, e.g. "28". -// -// See http://www.postgresql.org/docs/9.3/static/errcodes-appendix.html for -// details. -func (ec ErrorCode) Class() ErrorClass { - return ErrorClass(ec[0:2]) -} - -// errorCodeNames is a mapping between the five-character error codes and the -// human readable "condition names". It is derived from the list at -// http://www.postgresql.org/docs/9.3/static/errcodes-appendix.html -var errorCodeNames = map[ErrorCode]string{ - // Class 00 - Successful Completion - "00000": "successful_completion", - // Class 01 - Warning - "01000": "warning", - "0100C": "dynamic_result_sets_returned", - "01008": "implicit_zero_bit_padding", - "01003": "null_value_eliminated_in_set_function", - "01007": "privilege_not_granted", - "01006": "privilege_not_revoked", - "01004": "string_data_right_truncation", - "01P01": "deprecated_feature", - // Class 02 - No Data (this is also a warning class per the SQL standard) - "02000": "no_data", - "02001": "no_additional_dynamic_result_sets_returned", - // Class 03 - SQL Statement Not Yet Complete - "03000": "sql_statement_not_yet_complete", - // Class 08 - Connection Exception - "08000": "connection_exception", - "08003": "connection_does_not_exist", - "08006": "connection_failure", - "08001": "sqlclient_unable_to_establish_sqlconnection", - "08004": "sqlserver_rejected_establishment_of_sqlconnection", - "08007": "transaction_resolution_unknown", - "08P01": "protocol_violation", - // Class 09 - Triggered Action Exception - "09000": "triggered_action_exception", - // Class 0A - Feature Not Supported - "0A000": "feature_not_supported", - // Class 0B - Invalid Transaction Initiation - "0B000": "invalid_transaction_initiation", - // Class 0F - Locator Exception - "0F000": "locator_exception", - "0F001": "invalid_locator_specification", - // Class 0L - Invalid Grantor - "0L000": "invalid_grantor", - "0LP01": "invalid_grant_operation", - // Class 0P - Invalid Role Specification - "0P000": "invalid_role_specification", - // Class 0Z - Diagnostics Exception - "0Z000": "diagnostics_exception", - "0Z002": "stacked_diagnostics_accessed_without_active_handler", - // Class 20 - Case Not Found - "20000": "case_not_found", - // Class 21 - Cardinality Violation - "21000": "cardinality_violation", - // Class 22 - Data Exception - "22000": "data_exception", - "2202E": "array_subscript_error", - "22021": "character_not_in_repertoire", - "22008": "datetime_field_overflow", - "22012": "division_by_zero", - "22005": "error_in_assignment", - "2200B": "escape_character_conflict", - "22022": "indicator_overflow", - "22015": "interval_field_overflow", - "2201E": "invalid_argument_for_logarithm", - "22014": "invalid_argument_for_ntile_function", - "22016": "invalid_argument_for_nth_value_function", - "2201F": "invalid_argument_for_power_function", - "2201G": "invalid_argument_for_width_bucket_function", - "22018": "invalid_character_value_for_cast", - "22007": "invalid_datetime_format", - "22019": "invalid_escape_character", - "2200D": "invalid_escape_octet", - "22025": "invalid_escape_sequence", - "22P06": "nonstandard_use_of_escape_character", - "22010": "invalid_indicator_parameter_value", - "22023": "invalid_parameter_value", - "2201B": "invalid_regular_expression", - "2201W": "invalid_row_count_in_limit_clause", - "2201X": "invalid_row_count_in_result_offset_clause", - "22009": "invalid_time_zone_displacement_value", - "2200C": "invalid_use_of_escape_character", - "2200G": "most_specific_type_mismatch", - "22004": "null_value_not_allowed", - "22002": "null_value_no_indicator_parameter", - "22003": "numeric_value_out_of_range", - "2200H": "sequence_generator_limit_exceeded", - "22026": "string_data_length_mismatch", - "22001": "string_data_right_truncation", - "22011": "substring_error", - "22027": "trim_error", - "22024": "unterminated_c_string", - "2200F": "zero_length_character_string", - "22P01": "floating_point_exception", - "22P02": "invalid_text_representation", - "22P03": "invalid_binary_representation", - "22P04": "bad_copy_file_format", - "22P05": "untranslatable_character", - "2200L": "not_an_xml_document", - "2200M": "invalid_xml_document", - "2200N": "invalid_xml_content", - "2200S": "invalid_xml_comment", - "2200T": "invalid_xml_processing_instruction", - // Class 23 - Integrity Constraint Violation - "23000": "integrity_constraint_violation", - "23001": "restrict_violation", - "23502": "not_null_violation", - "23503": "foreign_key_violation", - "23505": "unique_violation", - "23514": "check_violation", - "23P01": "exclusion_violation", - // Class 24 - Invalid Cursor State - "24000": "invalid_cursor_state", - // Class 25 - Invalid Transaction State - "25000": "invalid_transaction_state", - "25001": "active_sql_transaction", - "25002": "branch_transaction_already_active", - "25008": "held_cursor_requires_same_isolation_level", - "25003": "inappropriate_access_mode_for_branch_transaction", - "25004": "inappropriate_isolation_level_for_branch_transaction", - "25005": "no_active_sql_transaction_for_branch_transaction", - "25006": "read_only_sql_transaction", - "25007": "schema_and_data_statement_mixing_not_supported", - "25P01": "no_active_sql_transaction", - "25P02": "in_failed_sql_transaction", - // Class 26 - Invalid SQL Statement Name - "26000": "invalid_sql_statement_name", - // Class 27 - Triggered Data Change Violation - "27000": "triggered_data_change_violation", - // Class 28 - Invalid Authorization Specification - "28000": "invalid_authorization_specification", - "28P01": "invalid_password", - // Class 2B - Dependent Privilege Descriptors Still Exist - "2B000": "dependent_privilege_descriptors_still_exist", - "2BP01": "dependent_objects_still_exist", - // Class 2D - Invalid Transaction Termination - "2D000": "invalid_transaction_termination", - // Class 2F - SQL Routine Exception - "2F000": "sql_routine_exception", - "2F005": "function_executed_no_return_statement", - "2F002": "modifying_sql_data_not_permitted", - "2F003": "prohibited_sql_statement_attempted", - "2F004": "reading_sql_data_not_permitted", - // Class 34 - Invalid Cursor Name - "34000": "invalid_cursor_name", - // Class 38 - External Routine Exception - "38000": "external_routine_exception", - "38001": "containing_sql_not_permitted", - "38002": "modifying_sql_data_not_permitted", - "38003": "prohibited_sql_statement_attempted", - "38004": "reading_sql_data_not_permitted", - // Class 39 - External Routine Invocation Exception - "39000": "external_routine_invocation_exception", - "39001": "invalid_sqlstate_returned", - "39004": "null_value_not_allowed", - "39P01": "trigger_protocol_violated", - "39P02": "srf_protocol_violated", - // Class 3B - Savepoint Exception - "3B000": "savepoint_exception", - "3B001": "invalid_savepoint_specification", - // Class 3D - Invalid Catalog Name - "3D000": "invalid_catalog_name", - // Class 3F - Invalid Schema Name - "3F000": "invalid_schema_name", - // Class 40 - Transaction Rollback - "40000": "transaction_rollback", - "40002": "transaction_integrity_constraint_violation", - "40001": "serialization_failure", - "40003": "statement_completion_unknown", - "40P01": "deadlock_detected", - // Class 42 - Syntax Error or Access Rule Violation - "42000": "syntax_error_or_access_rule_violation", - "42601": "syntax_error", - "42501": "insufficient_privilege", - "42846": "cannot_coerce", - "42803": "grouping_error", - "42P20": "windowing_error", - "42P19": "invalid_recursion", - "42830": "invalid_foreign_key", - "42602": "invalid_name", - "42622": "name_too_long", - "42939": "reserved_name", - "42804": "datatype_mismatch", - "42P18": "indeterminate_datatype", - "42P21": "collation_mismatch", - "42P22": "indeterminate_collation", - "42809": "wrong_object_type", - "42703": "undefined_column", - "42883": "undefined_function", - "42P01": "undefined_table", - "42P02": "undefined_parameter", - "42704": "undefined_object", - "42701": "duplicate_column", - "42P03": "duplicate_cursor", - "42P04": "duplicate_database", - "42723": "duplicate_function", - "42P05": "duplicate_prepared_statement", - "42P06": "duplicate_schema", - "42P07": "duplicate_table", - "42712": "duplicate_alias", - "42710": "duplicate_object", - "42702": "ambiguous_column", - "42725": "ambiguous_function", - "42P08": "ambiguous_parameter", - "42P09": "ambiguous_alias", - "42P10": "invalid_column_reference", - "42611": "invalid_column_definition", - "42P11": "invalid_cursor_definition", - "42P12": "invalid_database_definition", - "42P13": "invalid_function_definition", - "42P14": "invalid_prepared_statement_definition", - "42P15": "invalid_schema_definition", - "42P16": "invalid_table_definition", - "42P17": "invalid_object_definition", - // Class 44 - WITH CHECK OPTION Violation - "44000": "with_check_option_violation", - // Class 53 - Insufficient Resources - "53000": "insufficient_resources", - "53100": "disk_full", - "53200": "out_of_memory", - "53300": "too_many_connections", - "53400": "configuration_limit_exceeded", - // Class 54 - Program Limit Exceeded - "54000": "program_limit_exceeded", - "54001": "statement_too_complex", - "54011": "too_many_columns", - "54023": "too_many_arguments", - // Class 55 - Object Not In Prerequisite State - "55000": "object_not_in_prerequisite_state", - "55006": "object_in_use", - "55P02": "cant_change_runtime_param", - "55P03": "lock_not_available", - // Class 57 - Operator Intervention - "57000": "operator_intervention", - "57014": "query_canceled", - "57P01": "admin_shutdown", - "57P02": "crash_shutdown", - "57P03": "cannot_connect_now", - "57P04": "database_dropped", - // Class 58 - System Error (errors external to PostgreSQL itself) - "58000": "system_error", - "58030": "io_error", - "58P01": "undefined_file", - "58P02": "duplicate_file", - // Class F0 - Configuration File Error - "F0000": "config_file_error", - "F0001": "lock_file_exists", - // Class HV - Foreign Data Wrapper Error (SQL/MED) - "HV000": "fdw_error", - "HV005": "fdw_column_name_not_found", - "HV002": "fdw_dynamic_parameter_value_needed", - "HV010": "fdw_function_sequence_error", - "HV021": "fdw_inconsistent_descriptor_information", - "HV024": "fdw_invalid_attribute_value", - "HV007": "fdw_invalid_column_name", - "HV008": "fdw_invalid_column_number", - "HV004": "fdw_invalid_data_type", - "HV006": "fdw_invalid_data_type_descriptors", - "HV091": "fdw_invalid_descriptor_field_identifier", - "HV00B": "fdw_invalid_handle", - "HV00C": "fdw_invalid_option_index", - "HV00D": "fdw_invalid_option_name", - "HV090": "fdw_invalid_string_length_or_buffer_length", - "HV00A": "fdw_invalid_string_format", - "HV009": "fdw_invalid_use_of_null_pointer", - "HV014": "fdw_too_many_handles", - "HV001": "fdw_out_of_memory", - "HV00P": "fdw_no_schemas", - "HV00J": "fdw_option_name_not_found", - "HV00K": "fdw_reply_handle", - "HV00Q": "fdw_schema_not_found", - "HV00R": "fdw_table_not_found", - "HV00L": "fdw_unable_to_create_execution", - "HV00M": "fdw_unable_to_create_reply", - "HV00N": "fdw_unable_to_establish_connection", - // Class P0 - PL/pgSQL Error - "P0000": "plpgsql_error", - "P0001": "raise_exception", - "P0002": "no_data_found", - "P0003": "too_many_rows", - // Class XX - Internal Error - "XX000": "internal_error", - "XX001": "data_corrupted", - "XX002": "index_corrupted", -} - -func parseError(r *readBuf) *Error { - err := new(Error) - for t := r.byte(); t != 0; t = r.byte() { - msg := r.string() - switch t { - case 'S': - err.Severity = msg - case 'C': - err.Code = ErrorCode(msg) - case 'M': - err.Message = msg - case 'D': - err.Detail = msg - case 'H': - err.Hint = msg - case 'P': - err.Position = msg - case 'p': - err.InternalPosition = msg - case 'q': - err.InternalQuery = msg - case 'W': - err.Where = msg - case 's': - err.Schema = msg - case 't': - err.Table = msg - case 'c': - err.Column = msg - case 'd': - err.DataTypeName = msg - case 'n': - err.Constraint = msg - case 'F': - err.File = msg - case 'L': - err.Line = msg - case 'R': - err.Routine = msg - } - } - return err -} - -// Fatal returns true if the Error Severity is fatal. -func (err *Error) Fatal() bool { - return err.Severity == Efatal -} - -// Get implements the legacy PGError interface. New code should use the fields -// of the Error struct directly. -func (err *Error) Get(k byte) (v string) { - switch k { - case 'S': - return err.Severity - case 'C': - return string(err.Code) - case 'M': - return err.Message - case 'D': - return err.Detail - case 'H': - return err.Hint - case 'P': - return err.Position - case 'p': - return err.InternalPosition - case 'q': - return err.InternalQuery - case 'W': - return err.Where - case 's': - return err.Schema - case 't': - return err.Table - case 'c': - return err.Column - case 'd': - return err.DataTypeName - case 'n': - return err.Constraint - case 'F': - return err.File - case 'L': - return err.Line - case 'R': - return err.Routine - } - return "" -} - -func (err Error) Error() string { - return "pq: " + err.Message -} - -// PGError is an interface used by previous versions of pq. It is provided -// only to support legacy code. New code should use the Error type. -type PGError interface { - Error() string - Fatal() bool - Get(k byte) (v string) -} - -func errorf(s string, args ...interface{}) { - panic(fmt.Errorf("pq: %s", fmt.Sprintf(s, args...))) -} - -// TODO(ainar-g) Rename to errorf after removing panics. -func fmterrorf(s string, args ...interface{}) error { - return fmt.Errorf("pq: %s", fmt.Sprintf(s, args...)) -} - -func errRecoverNoErrBadConn(err *error) { - e := recover() - if e == nil { - // Do nothing - return - } - var ok bool - *err, ok = e.(error) - if !ok { - *err = fmt.Errorf("pq: unexpected error: %#v", e) - } -} - -func (c *conn) errRecover(err *error) { - e := recover() - switch v := e.(type) { - case nil: - // Do nothing - case runtime.Error: - c.bad = true - panic(v) - case *Error: - if v.Fatal() { - *err = driver.ErrBadConn - } else { - *err = v - } - case *net.OpError: - c.bad = true - *err = v - case error: - if v == io.EOF || v.(error).Error() == "remote error: handshake failure" { - *err = driver.ErrBadConn - } else { - *err = v - } - - default: - c.bad = true - panic(fmt.Sprintf("unknown error: %#v", e)) - } - - // Any time we return ErrBadConn, we need to remember it since *Tx doesn't - // mark the connection bad in database/sql. - if *err == driver.ErrBadConn { - c.bad = true - } -} diff --git a/vendor/github.com/lib/pq/notify.go b/vendor/github.com/lib/pq/notify.go deleted file mode 100644 index 947d189f4..000000000 --- a/vendor/github.com/lib/pq/notify.go +++ /dev/null @@ -1,794 +0,0 @@ -package pq - -// Package pq is a pure Go Postgres driver for the database/sql package. -// This module contains support for Postgres LISTEN/NOTIFY. - -import ( - "errors" - "fmt" - "sync" - "sync/atomic" - "time" -) - -// Notification represents a single notification from the database. -type Notification struct { - // Process ID (PID) of the notifying postgres backend. - BePid int - // Name of the channel the notification was sent on. - Channel string - // Payload, or the empty string if unspecified. - Extra string -} - -func recvNotification(r *readBuf) *Notification { - bePid := r.int32() - channel := r.string() - extra := r.string() - - return &Notification{bePid, channel, extra} -} - -const ( - connStateIdle int32 = iota - connStateExpectResponse - connStateExpectReadyForQuery -) - -type message struct { - typ byte - err error -} - -var errListenerConnClosed = errors.New("pq: ListenerConn has been closed") - -// ListenerConn is a low-level interface for waiting for notifications. You -// should use Listener instead. -type ListenerConn struct { - // guards cn and err - connectionLock sync.Mutex - cn *conn - err error - - connState int32 - - // the sending goroutine will be holding this lock - senderLock sync.Mutex - - notificationChan chan<- *Notification - - replyChan chan message -} - -// NewListenerConn creates a new ListenerConn. Use NewListener instead. -func NewListenerConn(name string, notificationChan chan<- *Notification) (*ListenerConn, error) { - return newDialListenerConn(defaultDialer{}, name, notificationChan) -} - -func newDialListenerConn(d Dialer, name string, c chan<- *Notification) (*ListenerConn, error) { - cn, err := DialOpen(d, name) - if err != nil { - return nil, err - } - - l := &ListenerConn{ - cn: cn.(*conn), - notificationChan: c, - connState: connStateIdle, - replyChan: make(chan message, 2), - } - - go l.listenerConnMain() - - return l, nil -} - -// We can only allow one goroutine at a time to be running a query on the -// connection for various reasons, so the goroutine sending on the connection -// must be holding senderLock. -// -// Returns an error if an unrecoverable error has occurred and the ListenerConn -// should be abandoned. -func (l *ListenerConn) acquireSenderLock() error { - // we must acquire senderLock first to avoid deadlocks; see ExecSimpleQuery - l.senderLock.Lock() - - l.connectionLock.Lock() - err := l.err - l.connectionLock.Unlock() - if err != nil { - l.senderLock.Unlock() - return err - } - return nil -} - -func (l *ListenerConn) releaseSenderLock() { - l.senderLock.Unlock() -} - -// setState advances the protocol state to newState. Returns false if moving -// to that state from the current state is not allowed. -func (l *ListenerConn) setState(newState int32) bool { - var expectedState int32 - - switch newState { - case connStateIdle: - expectedState = connStateExpectReadyForQuery - case connStateExpectResponse: - expectedState = connStateIdle - case connStateExpectReadyForQuery: - expectedState = connStateExpectResponse - default: - panic(fmt.Sprintf("unexpected listenerConnState %d", newState)) - } - - return atomic.CompareAndSwapInt32(&l.connState, expectedState, newState) -} - -// Main logic is here: receive messages from the postgres backend, forward -// notifications and query replies and keep the internal state in sync with the -// protocol state. Returns when the connection has been lost, is about to go -// away or should be discarded because we couldn't agree on the state with the -// server backend. -func (l *ListenerConn) listenerConnLoop() (err error) { - defer errRecoverNoErrBadConn(&err) - - r := &readBuf{} - for { - t, err := l.cn.recvMessage(r) - if err != nil { - return err - } - - switch t { - case 'A': - // recvNotification copies all the data so we don't need to worry - // about the scratch buffer being overwritten. - l.notificationChan <- recvNotification(r) - - case 'T', 'D': - // only used by tests; ignore - - case 'E': - // We might receive an ErrorResponse even when not in a query; it - // is expected that the server will close the connection after - // that, but we should make sure that the error we display is the - // one from the stray ErrorResponse, not io.ErrUnexpectedEOF. - if !l.setState(connStateExpectReadyForQuery) { - return parseError(r) - } - l.replyChan <- message{t, parseError(r)} - - case 'C', 'I': - if !l.setState(connStateExpectReadyForQuery) { - // protocol out of sync - return fmt.Errorf("unexpected CommandComplete") - } - // ExecSimpleQuery doesn't need to know about this message - - case 'Z': - if !l.setState(connStateIdle) { - // protocol out of sync - return fmt.Errorf("unexpected ReadyForQuery") - } - l.replyChan <- message{t, nil} - - case 'N', 'S': - // ignore - default: - return fmt.Errorf("unexpected message %q from server in listenerConnLoop", t) - } - } -} - -// This is the main routine for the goroutine receiving on the database -// connection. Most of the main logic is in listenerConnLoop. -func (l *ListenerConn) listenerConnMain() { - err := l.listenerConnLoop() - - // listenerConnLoop terminated; we're done, but we still have to clean up. - // Make sure nobody tries to start any new queries by making sure the err - // pointer is set. It is important that we do not overwrite its value; a - // connection could be closed by either this goroutine or one sending on - // the connection -- whoever closes the connection is assumed to have the - // more meaningful error message (as the other one will probably get - // net.errClosed), so that goroutine sets the error we expose while the - // other error is discarded. If the connection is lost while two - // goroutines are operating on the socket, it probably doesn't matter which - // error we expose so we don't try to do anything more complex. - l.connectionLock.Lock() - if l.err == nil { - l.err = err - } - l.cn.Close() - l.connectionLock.Unlock() - - // There might be a query in-flight; make sure nobody's waiting for a - // response to it, since there's not going to be one. - close(l.replyChan) - - // let the listener know we're done - close(l.notificationChan) - - // this ListenerConn is done -} - -// Listen sends a LISTEN query to the server. See ExecSimpleQuery. -func (l *ListenerConn) Listen(channel string) (bool, error) { - return l.ExecSimpleQuery("LISTEN " + QuoteIdentifier(channel)) -} - -// Unlisten sends an UNLISTEN query to the server. See ExecSimpleQuery. -func (l *ListenerConn) Unlisten(channel string) (bool, error) { - return l.ExecSimpleQuery("UNLISTEN " + QuoteIdentifier(channel)) -} - -// UnlistenAll sends an `UNLISTEN *` query to the server. See ExecSimpleQuery. -func (l *ListenerConn) UnlistenAll() (bool, error) { - return l.ExecSimpleQuery("UNLISTEN *") -} - -// Ping the remote server to make sure it's alive. Non-nil error means the -// connection has failed and should be abandoned. -func (l *ListenerConn) Ping() error { - sent, err := l.ExecSimpleQuery("") - if !sent { - return err - } - if err != nil { - // shouldn't happen - panic(err) - } - return nil -} - -// Attempt to send a query on the connection. Returns an error if sending the -// query failed, and the caller should initiate closure of this connection. -// The caller must be holding senderLock (see acquireSenderLock and -// releaseSenderLock). -func (l *ListenerConn) sendSimpleQuery(q string) (err error) { - defer errRecoverNoErrBadConn(&err) - - // must set connection state before sending the query - if !l.setState(connStateExpectResponse) { - panic("two queries running at the same time") - } - - // Can't use l.cn.writeBuf here because it uses the scratch buffer which - // might get overwritten by listenerConnLoop. - b := &writeBuf{ - buf: []byte("Q\x00\x00\x00\x00"), - pos: 1, - } - b.string(q) - l.cn.send(b) - - return nil -} - -// ExecSimpleQuery executes a "simple query" (i.e. one with no bindable -// parameters) on the connection. The possible return values are: -// 1) "executed" is true; the query was executed to completion on the -// database server. If the query failed, err will be set to the error -// returned by the database, otherwise err will be nil. -// 2) If "executed" is false, the query could not be executed on the remote -// server. err will be non-nil. -// -// After a call to ExecSimpleQuery has returned an executed=false value, the -// connection has either been closed or will be closed shortly thereafter, and -// all subsequently executed queries will return an error. -func (l *ListenerConn) ExecSimpleQuery(q string) (executed bool, err error) { - if err = l.acquireSenderLock(); err != nil { - return false, err - } - defer l.releaseSenderLock() - - err = l.sendSimpleQuery(q) - if err != nil { - // We can't know what state the protocol is in, so we need to abandon - // this connection. - l.connectionLock.Lock() - // Set the error pointer if it hasn't been set already; see - // listenerConnMain. - if l.err == nil { - l.err = err - } - l.connectionLock.Unlock() - l.cn.c.Close() - return false, err - } - - // now we just wait for a reply.. - for { - m, ok := <-l.replyChan - if !ok { - // We lost the connection to server, don't bother waiting for a - // a response. err should have been set already. - l.connectionLock.Lock() - err := l.err - l.connectionLock.Unlock() - return false, err - } - switch m.typ { - case 'Z': - // sanity check - if m.err != nil { - panic("m.err != nil") - } - // done; err might or might not be set - return true, err - - case 'E': - // sanity check - if m.err == nil { - panic("m.err == nil") - } - // server responded with an error; ReadyForQuery to follow - err = m.err - - default: - return false, fmt.Errorf("unknown response for simple query: %q", m.typ) - } - } -} - -// Close closes the connection. -func (l *ListenerConn) Close() error { - l.connectionLock.Lock() - if l.err != nil { - l.connectionLock.Unlock() - return errListenerConnClosed - } - l.err = errListenerConnClosed - l.connectionLock.Unlock() - // We can't send anything on the connection without holding senderLock. - // Simply close the net.Conn to wake up everyone operating on it. - return l.cn.c.Close() -} - -// Err returns the reason the connection was closed. It is not safe to call -// this function until l.Notify has been closed. -func (l *ListenerConn) Err() error { - return l.err -} - -var errListenerClosed = errors.New("pq: Listener has been closed") - -// ErrChannelAlreadyOpen is returned from Listen when a channel is already -// open. -var ErrChannelAlreadyOpen = errors.New("pq: channel is already open") - -// ErrChannelNotOpen is returned from Unlisten when a channel is not open. -var ErrChannelNotOpen = errors.New("pq: channel is not open") - -// ListenerEventType is an enumeration of listener event types. -type ListenerEventType int - -const ( - // ListenerEventConnected is emitted only when the database connection - // has been initially initialized. The err argument of the callback - // will always be nil. - ListenerEventConnected ListenerEventType = iota - - // ListenerEventDisconnected is emitted after a database connection has - // been lost, either because of an error or because Close has been - // called. The err argument will be set to the reason the database - // connection was lost. - ListenerEventDisconnected - - // ListenerEventReconnected is emitted after a database connection has - // been re-established after connection loss. The err argument of the - // callback will always be nil. After this event has been emitted, a - // nil pq.Notification is sent on the Listener.Notify channel. - ListenerEventReconnected - - // ListenerEventConnectionAttemptFailed is emitted after a connection - // to the database was attempted, but failed. The err argument will be - // set to an error describing why the connection attempt did not - // succeed. - ListenerEventConnectionAttemptFailed -) - -// EventCallbackType is the event callback type. See also ListenerEventType -// constants' documentation. -type EventCallbackType func(event ListenerEventType, err error) - -// Listener provides an interface for listening to notifications from a -// PostgreSQL database. For general usage information, see section -// "Notifications". -// -// Listener can safely be used from concurrently running goroutines. -type Listener struct { - // Channel for receiving notifications from the database. In some cases a - // nil value will be sent. See section "Notifications" above. - Notify chan *Notification - - name string - minReconnectInterval time.Duration - maxReconnectInterval time.Duration - dialer Dialer - eventCallback EventCallbackType - - lock sync.Mutex - isClosed bool - reconnectCond *sync.Cond - cn *ListenerConn - connNotificationChan <-chan *Notification - channels map[string]struct{} -} - -// NewListener creates a new database connection dedicated to LISTEN / NOTIFY. -// -// name should be set to a connection string to be used to establish the -// database connection (see section "Connection String Parameters" above). -// -// minReconnectInterval controls the duration to wait before trying to -// re-establish the database connection after connection loss. After each -// consecutive failure this interval is doubled, until maxReconnectInterval is -// reached. Successfully completing the connection establishment procedure -// resets the interval back to minReconnectInterval. -// -// The last parameter eventCallback can be set to a function which will be -// called by the Listener when the state of the underlying database connection -// changes. This callback will be called by the goroutine which dispatches the -// notifications over the Notify channel, so you should try to avoid doing -// potentially time-consuming operations from the callback. -func NewListener(name string, - minReconnectInterval time.Duration, - maxReconnectInterval time.Duration, - eventCallback EventCallbackType) *Listener { - return NewDialListener(defaultDialer{}, name, minReconnectInterval, maxReconnectInterval, eventCallback) -} - -// NewDialListener is like NewListener but it takes a Dialer. -func NewDialListener(d Dialer, - name string, - minReconnectInterval time.Duration, - maxReconnectInterval time.Duration, - eventCallback EventCallbackType) *Listener { - - l := &Listener{ - name: name, - minReconnectInterval: minReconnectInterval, - maxReconnectInterval: maxReconnectInterval, - dialer: d, - eventCallback: eventCallback, - - channels: make(map[string]struct{}), - - Notify: make(chan *Notification, 32), - } - l.reconnectCond = sync.NewCond(&l.lock) - - go l.listenerMain() - - return l -} - -// NotificationChannel returns the notification channel for this listener. -// This is the same channel as Notify, and will not be recreated during the -// life time of the Listener. -func (l *Listener) NotificationChannel() <-chan *Notification { - return l.Notify -} - -// Listen starts listening for notifications on a channel. Calls to this -// function will block until an acknowledgement has been received from the -// server. Note that Listener automatically re-establishes the connection -// after connection loss, so this function may block indefinitely if the -// connection can not be re-established. -// -// Listen will only fail in three conditions: -// 1) The channel is already open. The returned error will be -// ErrChannelAlreadyOpen. -// 2) The query was executed on the remote server, but PostgreSQL returned an -// error message in response to the query. The returned error will be a -// pq.Error containing the information the server supplied. -// 3) Close is called on the Listener before the request could be completed. -// -// The channel name is case-sensitive. -func (l *Listener) Listen(channel string) error { - l.lock.Lock() - defer l.lock.Unlock() - - if l.isClosed { - return errListenerClosed - } - - // The server allows you to issue a LISTEN on a channel which is already - // open, but it seems useful to be able to detect this case to spot for - // mistakes in application logic. If the application genuinely does't - // care, it can check the exported error and ignore it. - _, exists := l.channels[channel] - if exists { - return ErrChannelAlreadyOpen - } - - if l.cn != nil { - // If gotResponse is true but error is set, the query was executed on - // the remote server, but resulted in an error. This should be - // relatively rare, so it's fine if we just pass the error to our - // caller. However, if gotResponse is false, we could not complete the - // query on the remote server and our underlying connection is about - // to go away, so we only add relname to l.channels, and wait for - // resync() to take care of the rest. - gotResponse, err := l.cn.Listen(channel) - if gotResponse && err != nil { - return err - } - } - - l.channels[channel] = struct{}{} - for l.cn == nil { - l.reconnectCond.Wait() - // we let go of the mutex for a while - if l.isClosed { - return errListenerClosed - } - } - - return nil -} - -// Unlisten removes a channel from the Listener's channel list. Returns -// ErrChannelNotOpen if the Listener is not listening on the specified channel. -// Returns immediately with no error if there is no connection. Note that you -// might still get notifications for this channel even after Unlisten has -// returned. -// -// The channel name is case-sensitive. -func (l *Listener) Unlisten(channel string) error { - l.lock.Lock() - defer l.lock.Unlock() - - if l.isClosed { - return errListenerClosed - } - - // Similarly to LISTEN, this is not an error in Postgres, but it seems - // useful to distinguish from the normal conditions. - _, exists := l.channels[channel] - if !exists { - return ErrChannelNotOpen - } - - if l.cn != nil { - // Similarly to Listen (see comment in that function), the caller - // should only be bothered with an error if it came from the backend as - // a response to our query. - gotResponse, err := l.cn.Unlisten(channel) - if gotResponse && err != nil { - return err - } - } - - // Don't bother waiting for resync if there's no connection. - delete(l.channels, channel) - return nil -} - -// UnlistenAll removes all channels from the Listener's channel list. Returns -// immediately with no error if there is no connection. Note that you might -// still get notifications for any of the deleted channels even after -// UnlistenAll has returned. -func (l *Listener) UnlistenAll() error { - l.lock.Lock() - defer l.lock.Unlock() - - if l.isClosed { - return errListenerClosed - } - - if l.cn != nil { - // Similarly to Listen (see comment in that function), the caller - // should only be bothered with an error if it came from the backend as - // a response to our query. - gotResponse, err := l.cn.UnlistenAll() - if gotResponse && err != nil { - return err - } - } - - // Don't bother waiting for resync if there's no connection. - l.channels = make(map[string]struct{}) - return nil -} - -// Ping the remote server to make sure it's alive. Non-nil return value means -// that there is no active connection. -func (l *Listener) Ping() error { - l.lock.Lock() - defer l.lock.Unlock() - - if l.isClosed { - return errListenerClosed - } - if l.cn == nil { - return errors.New("no connection") - } - - return l.cn.Ping() -} - -// Clean up after losing the server connection. Returns l.cn.Err(), which -// should have the reason the connection was lost. -func (l *Listener) disconnectCleanup() error { - l.lock.Lock() - defer l.lock.Unlock() - - // sanity check; can't look at Err() until the channel has been closed - select { - case _, ok := <-l.connNotificationChan: - if ok { - panic("connNotificationChan not closed") - } - default: - panic("connNotificationChan not closed") - } - - err := l.cn.Err() - l.cn.Close() - l.cn = nil - return err -} - -// Synchronize the list of channels we want to be listening on with the server -// after the connection has been established. -func (l *Listener) resync(cn *ListenerConn, notificationChan <-chan *Notification) error { - doneChan := make(chan error) - go func(notificationChan <-chan *Notification) { - for channel := range l.channels { - // If we got a response, return that error to our caller as it's - // going to be more descriptive than cn.Err(). - gotResponse, err := cn.Listen(channel) - if gotResponse && err != nil { - doneChan <- err - return - } - - // If we couldn't reach the server, wait for notificationChan to - // close and then return the error message from the connection, as - // per ListenerConn's interface. - if err != nil { - for range notificationChan { - } - doneChan <- cn.Err() - return - } - } - doneChan <- nil - }(notificationChan) - - // Ignore notifications while synchronization is going on to avoid - // deadlocks. We have to send a nil notification over Notify anyway as - // we can't possibly know which notifications (if any) were lost while - // the connection was down, so there's no reason to try and process - // these messages at all. - for { - select { - case _, ok := <-notificationChan: - if !ok { - notificationChan = nil - } - - case err := <-doneChan: - return err - } - } -} - -// caller should NOT be holding l.lock -func (l *Listener) closed() bool { - l.lock.Lock() - defer l.lock.Unlock() - - return l.isClosed -} - -func (l *Listener) connect() error { - notificationChan := make(chan *Notification, 32) - cn, err := newDialListenerConn(l.dialer, l.name, notificationChan) - if err != nil { - return err - } - - l.lock.Lock() - defer l.lock.Unlock() - - err = l.resync(cn, notificationChan) - if err != nil { - cn.Close() - return err - } - - l.cn = cn - l.connNotificationChan = notificationChan - l.reconnectCond.Broadcast() - - return nil -} - -// Close disconnects the Listener from the database and shuts it down. -// Subsequent calls to its methods will return an error. Close returns an -// error if the connection has already been closed. -func (l *Listener) Close() error { - l.lock.Lock() - defer l.lock.Unlock() - - if l.isClosed { - return errListenerClosed - } - - if l.cn != nil { - l.cn.Close() - } - l.isClosed = true - - return nil -} - -func (l *Listener) emitEvent(event ListenerEventType, err error) { - if l.eventCallback != nil { - l.eventCallback(event, err) - } -} - -// Main logic here: maintain a connection to the server when possible, wait -// for notifications and emit events. -func (l *Listener) listenerConnLoop() { - var nextReconnect time.Time - - reconnectInterval := l.minReconnectInterval - for { - for { - err := l.connect() - if err == nil { - break - } - - if l.closed() { - return - } - l.emitEvent(ListenerEventConnectionAttemptFailed, err) - - time.Sleep(reconnectInterval) - reconnectInterval *= 2 - if reconnectInterval > l.maxReconnectInterval { - reconnectInterval = l.maxReconnectInterval - } - } - - if nextReconnect.IsZero() { - l.emitEvent(ListenerEventConnected, nil) - } else { - l.emitEvent(ListenerEventReconnected, nil) - l.Notify <- nil - } - - reconnectInterval = l.minReconnectInterval - nextReconnect = time.Now().Add(reconnectInterval) - - for { - notification, ok := <-l.connNotificationChan - if !ok { - // lost connection, loop again - break - } - l.Notify <- notification - } - - err := l.disconnectCleanup() - if l.closed() { - return - } - l.emitEvent(ListenerEventDisconnected, err) - - time.Sleep(time.Until(nextReconnect)) - } -} - -func (l *Listener) listenerMain() { - l.listenerConnLoop() - close(l.Notify) -} diff --git a/vendor/github.com/lib/pq/oid/doc.go b/vendor/github.com/lib/pq/oid/doc.go deleted file mode 100644 index caaede248..000000000 --- a/vendor/github.com/lib/pq/oid/doc.go +++ /dev/null @@ -1,6 +0,0 @@ -// Package oid contains OID constants -// as defined by the Postgres server. -package oid - -// Oid is a Postgres Object ID. -type Oid uint32 diff --git a/vendor/github.com/lib/pq/oid/types.go b/vendor/github.com/lib/pq/oid/types.go deleted file mode 100644 index ecc84c2c8..000000000 --- a/vendor/github.com/lib/pq/oid/types.go +++ /dev/null @@ -1,343 +0,0 @@ -// Code generated by gen.go. DO NOT EDIT. - -package oid - -const ( - T_bool Oid = 16 - T_bytea Oid = 17 - T_char Oid = 18 - T_name Oid = 19 - T_int8 Oid = 20 - T_int2 Oid = 21 - T_int2vector Oid = 22 - T_int4 Oid = 23 - T_regproc Oid = 24 - T_text Oid = 25 - T_oid Oid = 26 - T_tid Oid = 27 - T_xid Oid = 28 - T_cid Oid = 29 - T_oidvector Oid = 30 - T_pg_ddl_command Oid = 32 - T_pg_type Oid = 71 - T_pg_attribute Oid = 75 - T_pg_proc Oid = 81 - T_pg_class Oid = 83 - T_json Oid = 114 - T_xml Oid = 142 - T__xml Oid = 143 - T_pg_node_tree Oid = 194 - T__json Oid = 199 - T_smgr Oid = 210 - T_index_am_handler Oid = 325 - T_point Oid = 600 - T_lseg Oid = 601 - T_path Oid = 602 - T_box Oid = 603 - T_polygon Oid = 604 - T_line Oid = 628 - T__line Oid = 629 - T_cidr Oid = 650 - T__cidr Oid = 651 - T_float4 Oid = 700 - T_float8 Oid = 701 - T_abstime Oid = 702 - T_reltime Oid = 703 - T_tinterval Oid = 704 - T_unknown Oid = 705 - T_circle Oid = 718 - T__circle Oid = 719 - T_money Oid = 790 - T__money Oid = 791 - T_macaddr Oid = 829 - T_inet Oid = 869 - T__bool Oid = 1000 - T__bytea Oid = 1001 - T__char Oid = 1002 - T__name Oid = 1003 - T__int2 Oid = 1005 - T__int2vector Oid = 1006 - T__int4 Oid = 1007 - T__regproc Oid = 1008 - T__text Oid = 1009 - T__tid Oid = 1010 - T__xid Oid = 1011 - T__cid Oid = 1012 - T__oidvector Oid = 1013 - T__bpchar Oid = 1014 - T__varchar Oid = 1015 - T__int8 Oid = 1016 - T__point Oid = 1017 - T__lseg Oid = 1018 - T__path Oid = 1019 - T__box Oid = 1020 - T__float4 Oid = 1021 - T__float8 Oid = 1022 - T__abstime Oid = 1023 - T__reltime Oid = 1024 - T__tinterval Oid = 1025 - T__polygon Oid = 1027 - T__oid Oid = 1028 - T_aclitem Oid = 1033 - T__aclitem Oid = 1034 - T__macaddr Oid = 1040 - T__inet Oid = 1041 - T_bpchar Oid = 1042 - T_varchar Oid = 1043 - T_date Oid = 1082 - T_time Oid = 1083 - T_timestamp Oid = 1114 - T__timestamp Oid = 1115 - T__date Oid = 1182 - T__time Oid = 1183 - T_timestamptz Oid = 1184 - T__timestamptz Oid = 1185 - T_interval Oid = 1186 - T__interval Oid = 1187 - T__numeric Oid = 1231 - T_pg_database Oid = 1248 - T__cstring Oid = 1263 - T_timetz Oid = 1266 - T__timetz Oid = 1270 - T_bit Oid = 1560 - T__bit Oid = 1561 - T_varbit Oid = 1562 - T__varbit Oid = 1563 - T_numeric Oid = 1700 - T_refcursor Oid = 1790 - T__refcursor Oid = 2201 - T_regprocedure Oid = 2202 - T_regoper Oid = 2203 - T_regoperator Oid = 2204 - T_regclass Oid = 2205 - T_regtype Oid = 2206 - T__regprocedure Oid = 2207 - T__regoper Oid = 2208 - T__regoperator Oid = 2209 - T__regclass Oid = 2210 - T__regtype Oid = 2211 - T_record Oid = 2249 - T_cstring Oid = 2275 - T_any Oid = 2276 - T_anyarray Oid = 2277 - T_void Oid = 2278 - T_trigger Oid = 2279 - T_language_handler Oid = 2280 - T_internal Oid = 2281 - T_opaque Oid = 2282 - T_anyelement Oid = 2283 - T__record Oid = 2287 - T_anynonarray Oid = 2776 - T_pg_authid Oid = 2842 - T_pg_auth_members Oid = 2843 - T__txid_snapshot Oid = 2949 - T_uuid Oid = 2950 - T__uuid Oid = 2951 - T_txid_snapshot Oid = 2970 - T_fdw_handler Oid = 3115 - T_pg_lsn Oid = 3220 - T__pg_lsn Oid = 3221 - T_tsm_handler Oid = 3310 - T_anyenum Oid = 3500 - T_tsvector Oid = 3614 - T_tsquery Oid = 3615 - T_gtsvector Oid = 3642 - T__tsvector Oid = 3643 - T__gtsvector Oid = 3644 - T__tsquery Oid = 3645 - T_regconfig Oid = 3734 - T__regconfig Oid = 3735 - T_regdictionary Oid = 3769 - T__regdictionary Oid = 3770 - T_jsonb Oid = 3802 - T__jsonb Oid = 3807 - T_anyrange Oid = 3831 - T_event_trigger Oid = 3838 - T_int4range Oid = 3904 - T__int4range Oid = 3905 - T_numrange Oid = 3906 - T__numrange Oid = 3907 - T_tsrange Oid = 3908 - T__tsrange Oid = 3909 - T_tstzrange Oid = 3910 - T__tstzrange Oid = 3911 - T_daterange Oid = 3912 - T__daterange Oid = 3913 - T_int8range Oid = 3926 - T__int8range Oid = 3927 - T_pg_shseclabel Oid = 4066 - T_regnamespace Oid = 4089 - T__regnamespace Oid = 4090 - T_regrole Oid = 4096 - T__regrole Oid = 4097 -) - -var TypeName = map[Oid]string{ - T_bool: "BOOL", - T_bytea: "BYTEA", - T_char: "CHAR", - T_name: "NAME", - T_int8: "INT8", - T_int2: "INT2", - T_int2vector: "INT2VECTOR", - T_int4: "INT4", - T_regproc: "REGPROC", - T_text: "TEXT", - T_oid: "OID", - T_tid: "TID", - T_xid: "XID", - T_cid: "CID", - T_oidvector: "OIDVECTOR", - T_pg_ddl_command: "PG_DDL_COMMAND", - T_pg_type: "PG_TYPE", - T_pg_attribute: "PG_ATTRIBUTE", - T_pg_proc: "PG_PROC", - T_pg_class: "PG_CLASS", - T_json: "JSON", - T_xml: "XML", - T__xml: "_XML", - T_pg_node_tree: "PG_NODE_TREE", - T__json: "_JSON", - T_smgr: "SMGR", - T_index_am_handler: "INDEX_AM_HANDLER", - T_point: "POINT", - T_lseg: "LSEG", - T_path: "PATH", - T_box: "BOX", - T_polygon: "POLYGON", - T_line: "LINE", - T__line: "_LINE", - T_cidr: "CIDR", - T__cidr: "_CIDR", - T_float4: "FLOAT4", - T_float8: "FLOAT8", - T_abstime: "ABSTIME", - T_reltime: "RELTIME", - T_tinterval: "TINTERVAL", - T_unknown: "UNKNOWN", - T_circle: "CIRCLE", - T__circle: "_CIRCLE", - T_money: "MONEY", - T__money: "_MONEY", - T_macaddr: "MACADDR", - T_inet: "INET", - T__bool: "_BOOL", - T__bytea: "_BYTEA", - T__char: "_CHAR", - T__name: "_NAME", - T__int2: "_INT2", - T__int2vector: "_INT2VECTOR", - T__int4: "_INT4", - T__regproc: "_REGPROC", - T__text: "_TEXT", - T__tid: "_TID", - T__xid: "_XID", - T__cid: "_CID", - T__oidvector: "_OIDVECTOR", - T__bpchar: "_BPCHAR", - T__varchar: "_VARCHAR", - T__int8: "_INT8", - T__point: "_POINT", - T__lseg: "_LSEG", - T__path: "_PATH", - T__box: "_BOX", - T__float4: "_FLOAT4", - T__float8: "_FLOAT8", - T__abstime: "_ABSTIME", - T__reltime: "_RELTIME", - T__tinterval: "_TINTERVAL", - T__polygon: "_POLYGON", - T__oid: "_OID", - T_aclitem: "ACLITEM", - T__aclitem: "_ACLITEM", - T__macaddr: "_MACADDR", - T__inet: "_INET", - T_bpchar: "BPCHAR", - T_varchar: "VARCHAR", - T_date: "DATE", - T_time: "TIME", - T_timestamp: "TIMESTAMP", - T__timestamp: "_TIMESTAMP", - T__date: "_DATE", - T__time: "_TIME", - T_timestamptz: "TIMESTAMPTZ", - T__timestamptz: "_TIMESTAMPTZ", - T_interval: "INTERVAL", - T__interval: "_INTERVAL", - T__numeric: "_NUMERIC", - T_pg_database: "PG_DATABASE", - T__cstring: "_CSTRING", - T_timetz: "TIMETZ", - T__timetz: "_TIMETZ", - T_bit: "BIT", - T__bit: "_BIT", - T_varbit: "VARBIT", - T__varbit: "_VARBIT", - T_numeric: "NUMERIC", - T_refcursor: "REFCURSOR", - T__refcursor: "_REFCURSOR", - T_regprocedure: "REGPROCEDURE", - T_regoper: "REGOPER", - T_regoperator: "REGOPERATOR", - T_regclass: "REGCLASS", - T_regtype: "REGTYPE", - T__regprocedure: "_REGPROCEDURE", - T__regoper: "_REGOPER", - T__regoperator: "_REGOPERATOR", - T__regclass: "_REGCLASS", - T__regtype: "_REGTYPE", - T_record: "RECORD", - T_cstring: "CSTRING", - T_any: "ANY", - T_anyarray: "ANYARRAY", - T_void: "VOID", - T_trigger: "TRIGGER", - T_language_handler: "LANGUAGE_HANDLER", - T_internal: "INTERNAL", - T_opaque: "OPAQUE", - T_anyelement: "ANYELEMENT", - T__record: "_RECORD", - T_anynonarray: "ANYNONARRAY", - T_pg_authid: "PG_AUTHID", - T_pg_auth_members: "PG_AUTH_MEMBERS", - T__txid_snapshot: "_TXID_SNAPSHOT", - T_uuid: "UUID", - T__uuid: "_UUID", - T_txid_snapshot: "TXID_SNAPSHOT", - T_fdw_handler: "FDW_HANDLER", - T_pg_lsn: "PG_LSN", - T__pg_lsn: "_PG_LSN", - T_tsm_handler: "TSM_HANDLER", - T_anyenum: "ANYENUM", - T_tsvector: "TSVECTOR", - T_tsquery: "TSQUERY", - T_gtsvector: "GTSVECTOR", - T__tsvector: "_TSVECTOR", - T__gtsvector: "_GTSVECTOR", - T__tsquery: "_TSQUERY", - T_regconfig: "REGCONFIG", - T__regconfig: "_REGCONFIG", - T_regdictionary: "REGDICTIONARY", - T__regdictionary: "_REGDICTIONARY", - T_jsonb: "JSONB", - T__jsonb: "_JSONB", - T_anyrange: "ANYRANGE", - T_event_trigger: "EVENT_TRIGGER", - T_int4range: "INT4RANGE", - T__int4range: "_INT4RANGE", - T_numrange: "NUMRANGE", - T__numrange: "_NUMRANGE", - T_tsrange: "TSRANGE", - T__tsrange: "_TSRANGE", - T_tstzrange: "TSTZRANGE", - T__tstzrange: "_TSTZRANGE", - T_daterange: "DATERANGE", - T__daterange: "_DATERANGE", - T_int8range: "INT8RANGE", - T__int8range: "_INT8RANGE", - T_pg_shseclabel: "PG_SHSECLABEL", - T_regnamespace: "REGNAMESPACE", - T__regnamespace: "_REGNAMESPACE", - T_regrole: "REGROLE", - T__regrole: "_REGROLE", -} diff --git a/vendor/github.com/lib/pq/rows.go b/vendor/github.com/lib/pq/rows.go deleted file mode 100644 index c6aa5b9a3..000000000 --- a/vendor/github.com/lib/pq/rows.go +++ /dev/null @@ -1,93 +0,0 @@ -package pq - -import ( - "math" - "reflect" - "time" - - "github.com/lib/pq/oid" -) - -const headerSize = 4 - -type fieldDesc struct { - // The object ID of the data type. - OID oid.Oid - // The data type size (see pg_type.typlen). - // Note that negative values denote variable-width types. - Len int - // The type modifier (see pg_attribute.atttypmod). - // The meaning of the modifier is type-specific. - Mod int -} - -func (fd fieldDesc) Type() reflect.Type { - switch fd.OID { - case oid.T_int8: - return reflect.TypeOf(int64(0)) - case oid.T_int4: - return reflect.TypeOf(int32(0)) - case oid.T_int2: - return reflect.TypeOf(int16(0)) - case oid.T_varchar, oid.T_text: - return reflect.TypeOf("") - case oid.T_bool: - return reflect.TypeOf(false) - case oid.T_date, oid.T_time, oid.T_timetz, oid.T_timestamp, oid.T_timestamptz: - return reflect.TypeOf(time.Time{}) - case oid.T_bytea: - return reflect.TypeOf([]byte(nil)) - default: - return reflect.TypeOf(new(interface{})).Elem() - } -} - -func (fd fieldDesc) Name() string { - return oid.TypeName[fd.OID] -} - -func (fd fieldDesc) Length() (length int64, ok bool) { - switch fd.OID { - case oid.T_text, oid.T_bytea: - return math.MaxInt64, true - case oid.T_varchar, oid.T_bpchar: - return int64(fd.Mod - headerSize), true - default: - return 0, false - } -} - -func (fd fieldDesc) PrecisionScale() (precision, scale int64, ok bool) { - switch fd.OID { - case oid.T_numeric, oid.T__numeric: - mod := fd.Mod - headerSize - precision = int64((mod >> 16) & 0xffff) - scale = int64(mod & 0xffff) - return precision, scale, true - default: - return 0, 0, false - } -} - -// ColumnTypeScanType returns the value type that can be used to scan types into. -func (rs *rows) ColumnTypeScanType(index int) reflect.Type { - return rs.colTyps[index].Type() -} - -// ColumnTypeDatabaseTypeName return the database system type name. -func (rs *rows) ColumnTypeDatabaseTypeName(index int) string { - return rs.colTyps[index].Name() -} - -// ColumnTypeLength returns the length of the column type if the column is a -// variable length type. If the column is not a variable length type ok -// should return false. -func (rs *rows) ColumnTypeLength(index int) (length int64, ok bool) { - return rs.colTyps[index].Length() -} - -// ColumnTypePrecisionScale should return the precision and scale for decimal -// types. If not applicable, ok should be false. -func (rs *rows) ColumnTypePrecisionScale(index int) (precision, scale int64, ok bool) { - return rs.colTyps[index].PrecisionScale() -} diff --git a/vendor/github.com/lib/pq/ssl.go b/vendor/github.com/lib/pq/ssl.go deleted file mode 100644 index e1a326a0d..000000000 --- a/vendor/github.com/lib/pq/ssl.go +++ /dev/null @@ -1,169 +0,0 @@ -package pq - -import ( - "crypto/tls" - "crypto/x509" - "io/ioutil" - "net" - "os" - "os/user" - "path/filepath" -) - -// ssl generates a function to upgrade a net.Conn based on the "sslmode" and -// related settings. The function is nil when no upgrade should take place. -func ssl(o values) (func(net.Conn) (net.Conn, error), error) { - verifyCaOnly := false - tlsConf := tls.Config{} - switch mode := o["sslmode"]; mode { - // "require" is the default. - case "", "require": - // We must skip TLS's own verification since it requires full - // verification since Go 1.3. - tlsConf.InsecureSkipVerify = true - - // From http://www.postgresql.org/docs/current/static/libpq-ssl.html: - // - // Note: For backwards compatibility with earlier versions of - // PostgreSQL, if a root CA file exists, the behavior of - // sslmode=require will be the same as that of verify-ca, meaning the - // server certificate is validated against the CA. Relying on this - // behavior is discouraged, and applications that need certificate - // validation should always use verify-ca or verify-full. - if sslrootcert, ok := o["sslrootcert"]; ok { - if _, err := os.Stat(sslrootcert); err == nil { - verifyCaOnly = true - } else { - delete(o, "sslrootcert") - } - } - case "verify-ca": - // We must skip TLS's own verification since it requires full - // verification since Go 1.3. - tlsConf.InsecureSkipVerify = true - verifyCaOnly = true - case "verify-full": - tlsConf.ServerName = o["host"] - case "disable": - return nil, nil - default: - return nil, fmterrorf(`unsupported sslmode %q; only "require" (default), "verify-full", "verify-ca", and "disable" supported`, mode) - } - - err := sslClientCertificates(&tlsConf, o) - if err != nil { - return nil, err - } - err = sslCertificateAuthority(&tlsConf, o) - if err != nil { - return nil, err - } - sslRenegotiation(&tlsConf) - - return func(conn net.Conn) (net.Conn, error) { - client := tls.Client(conn, &tlsConf) - if verifyCaOnly { - err := sslVerifyCertificateAuthority(client, &tlsConf) - if err != nil { - return nil, err - } - } - return client, nil - }, nil -} - -// sslClientCertificates adds the certificate specified in the "sslcert" and -// "sslkey" settings, or if they aren't set, from the .postgresql directory -// in the user's home directory. The configured files must exist and have -// the correct permissions. -func sslClientCertificates(tlsConf *tls.Config, o values) error { - // user.Current() might fail when cross-compiling. We have to ignore the - // error and continue without home directory defaults, since we wouldn't - // know from where to load them. - user, _ := user.Current() - - // In libpq, the client certificate is only loaded if the setting is not blank. - // - // https://github.com/postgres/postgres/blob/REL9_6_2/src/interfaces/libpq/fe-secure-openssl.c#L1036-L1037 - sslcert := o["sslcert"] - if len(sslcert) == 0 && user != nil { - sslcert = filepath.Join(user.HomeDir, ".postgresql", "postgresql.crt") - } - // https://github.com/postgres/postgres/blob/REL9_6_2/src/interfaces/libpq/fe-secure-openssl.c#L1045 - if len(sslcert) == 0 { - return nil - } - // https://github.com/postgres/postgres/blob/REL9_6_2/src/interfaces/libpq/fe-secure-openssl.c#L1050:L1054 - if _, err := os.Stat(sslcert); os.IsNotExist(err) { - return nil - } else if err != nil { - return err - } - - // In libpq, the ssl key is only loaded if the setting is not blank. - // - // https://github.com/postgres/postgres/blob/REL9_6_2/src/interfaces/libpq/fe-secure-openssl.c#L1123-L1222 - sslkey := o["sslkey"] - if len(sslkey) == 0 && user != nil { - sslkey = filepath.Join(user.HomeDir, ".postgresql", "postgresql.key") - } - - if len(sslkey) > 0 { - if err := sslKeyPermissions(sslkey); err != nil { - return err - } - } - - cert, err := tls.LoadX509KeyPair(sslcert, sslkey) - if err != nil { - return err - } - - tlsConf.Certificates = []tls.Certificate{cert} - return nil -} - -// sslCertificateAuthority adds the RootCA specified in the "sslrootcert" setting. -func sslCertificateAuthority(tlsConf *tls.Config, o values) error { - // In libpq, the root certificate is only loaded if the setting is not blank. - // - // https://github.com/postgres/postgres/blob/REL9_6_2/src/interfaces/libpq/fe-secure-openssl.c#L950-L951 - if sslrootcert := o["sslrootcert"]; len(sslrootcert) > 0 { - tlsConf.RootCAs = x509.NewCertPool() - - cert, err := ioutil.ReadFile(sslrootcert) - if err != nil { - return err - } - - if !tlsConf.RootCAs.AppendCertsFromPEM(cert) { - return fmterrorf("couldn't parse pem in sslrootcert") - } - } - - return nil -} - -// sslVerifyCertificateAuthority carries out a TLS handshake to the server and -// verifies the presented certificate against the CA, i.e. the one specified in -// sslrootcert or the system CA if sslrootcert was not specified. -func sslVerifyCertificateAuthority(client *tls.Conn, tlsConf *tls.Config) error { - err := client.Handshake() - if err != nil { - return err - } - certs := client.ConnectionState().PeerCertificates - opts := x509.VerifyOptions{ - DNSName: client.ConnectionState().ServerName, - Intermediates: x509.NewCertPool(), - Roots: tlsConf.RootCAs, - } - for i, cert := range certs { - if i == 0 { - continue - } - opts.Intermediates.AddCert(cert) - } - _, err = certs[0].Verify(opts) - return err -} diff --git a/vendor/github.com/lib/pq/ssl_go1.7.go b/vendor/github.com/lib/pq/ssl_go1.7.go deleted file mode 100644 index d7ba43b32..000000000 --- a/vendor/github.com/lib/pq/ssl_go1.7.go +++ /dev/null @@ -1,14 +0,0 @@ -// +build go1.7 - -package pq - -import "crypto/tls" - -// Accept renegotiation requests initiated by the backend. -// -// Renegotiation was deprecated then removed from PostgreSQL 9.5, but -// the default configuration of older versions has it enabled. Redshift -// also initiates renegotiations and cannot be reconfigured. -func sslRenegotiation(conf *tls.Config) { - conf.Renegotiation = tls.RenegotiateFreelyAsClient -} diff --git a/vendor/github.com/lib/pq/ssl_permissions.go b/vendor/github.com/lib/pq/ssl_permissions.go deleted file mode 100644 index 3b7c3a2a3..000000000 --- a/vendor/github.com/lib/pq/ssl_permissions.go +++ /dev/null @@ -1,20 +0,0 @@ -// +build !windows - -package pq - -import "os" - -// sslKeyPermissions checks the permissions on user-supplied ssl key files. -// The key file should have very little access. -// -// libpq does not check key file permissions on Windows. -func sslKeyPermissions(sslkey string) error { - info, err := os.Stat(sslkey) - if err != nil { - return err - } - if info.Mode().Perm()&0077 != 0 { - return ErrSSLKeyHasWorldPermissions - } - return nil -} diff --git a/vendor/github.com/lib/pq/ssl_renegotiation.go b/vendor/github.com/lib/pq/ssl_renegotiation.go deleted file mode 100644 index 85ed5e437..000000000 --- a/vendor/github.com/lib/pq/ssl_renegotiation.go +++ /dev/null @@ -1,8 +0,0 @@ -// +build !go1.7 - -package pq - -import "crypto/tls" - -// Renegotiation is not supported by crypto/tls until Go 1.7. -func sslRenegotiation(*tls.Config) {} diff --git a/vendor/github.com/lib/pq/ssl_windows.go b/vendor/github.com/lib/pq/ssl_windows.go deleted file mode 100644 index 5d2c763ce..000000000 --- a/vendor/github.com/lib/pq/ssl_windows.go +++ /dev/null @@ -1,9 +0,0 @@ -// +build windows - -package pq - -// sslKeyPermissions checks the permissions on user-supplied ssl key files. -// The key file should have very little access. -// -// libpq does not check key file permissions on Windows. -func sslKeyPermissions(string) error { return nil } diff --git a/vendor/github.com/lib/pq/url.go b/vendor/github.com/lib/pq/url.go deleted file mode 100644 index f4d8a7c20..000000000 --- a/vendor/github.com/lib/pq/url.go +++ /dev/null @@ -1,76 +0,0 @@ -package pq - -import ( - "fmt" - "net" - nurl "net/url" - "sort" - "strings" -) - -// ParseURL no longer needs to be used by clients of this library since supplying a URL as a -// connection string to sql.Open() is now supported: -// -// sql.Open("postgres", "postgres://bob:secret@1.2.3.4:5432/mydb?sslmode=verify-full") -// -// It remains exported here for backwards-compatibility. -// -// ParseURL converts a url to a connection string for driver.Open. -// Example: -// -// "postgres://bob:secret@1.2.3.4:5432/mydb?sslmode=verify-full" -// -// converts to: -// -// "user=bob password=secret host=1.2.3.4 port=5432 dbname=mydb sslmode=verify-full" -// -// A minimal example: -// -// "postgres://" -// -// This will be blank, causing driver.Open to use all of the defaults -func ParseURL(url string) (string, error) { - u, err := nurl.Parse(url) - if err != nil { - return "", err - } - - if u.Scheme != "postgres" && u.Scheme != "postgresql" { - return "", fmt.Errorf("invalid connection protocol: %s", u.Scheme) - } - - var kvs []string - escaper := strings.NewReplacer(` `, `\ `, `'`, `\'`, `\`, `\\`) - accrue := func(k, v string) { - if v != "" { - kvs = append(kvs, k+"="+escaper.Replace(v)) - } - } - - if u.User != nil { - v := u.User.Username() - accrue("user", v) - - v, _ = u.User.Password() - accrue("password", v) - } - - if host, port, err := net.SplitHostPort(u.Host); err != nil { - accrue("host", u.Host) - } else { - accrue("host", host) - accrue("port", port) - } - - if u.Path != "" { - accrue("dbname", u.Path[1:]) - } - - q := u.Query() - for k := range q { - accrue(k, q.Get(k)) - } - - sort.Strings(kvs) // Makes testing easier (not a performance concern) - return strings.Join(kvs, " "), nil -} diff --git a/vendor/github.com/lib/pq/user_posix.go b/vendor/github.com/lib/pq/user_posix.go deleted file mode 100644 index bf982524f..000000000 --- a/vendor/github.com/lib/pq/user_posix.go +++ /dev/null @@ -1,24 +0,0 @@ -// Package pq is a pure Go Postgres driver for the database/sql package. - -// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris rumprun - -package pq - -import ( - "os" - "os/user" -) - -func userCurrent() (string, error) { - u, err := user.Current() - if err == nil { - return u.Username, nil - } - - name := os.Getenv("USER") - if name != "" { - return name, nil - } - - return "", ErrCouldNotDetectUsername -} diff --git a/vendor/github.com/lib/pq/user_windows.go b/vendor/github.com/lib/pq/user_windows.go deleted file mode 100644 index 2b691267b..000000000 --- a/vendor/github.com/lib/pq/user_windows.go +++ /dev/null @@ -1,27 +0,0 @@ -// Package pq is a pure Go Postgres driver for the database/sql package. -package pq - -import ( - "path/filepath" - "syscall" -) - -// Perform Windows user name lookup identically to libpq. -// -// The PostgreSQL code makes use of the legacy Win32 function -// GetUserName, and that function has not been imported into stock Go. -// GetUserNameEx is available though, the difference being that a -// wider range of names are available. To get the output to be the -// same as GetUserName, only the base (or last) component of the -// result is returned. -func userCurrent() (string, error) { - pw_name := make([]uint16, 128) - pwname_size := uint32(len(pw_name)) - 1 - err := syscall.GetUserNameEx(syscall.NameSamCompatible, &pw_name[0], &pwname_size) - if err != nil { - return "", ErrCouldNotDetectUsername - } - s := syscall.UTF16ToString(pw_name) - u := filepath.Base(s) - return u, nil -} diff --git a/vendor/github.com/lib/pq/uuid.go b/vendor/github.com/lib/pq/uuid.go deleted file mode 100644 index 9a1b9e074..000000000 --- a/vendor/github.com/lib/pq/uuid.go +++ /dev/null @@ -1,23 +0,0 @@ -package pq - -import ( - "encoding/hex" - "fmt" -) - -// decodeUUIDBinary interprets the binary format of a uuid, returning it in text format. -func decodeUUIDBinary(src []byte) ([]byte, error) { - if len(src) != 16 { - return nil, fmt.Errorf("pq: unable to decode uuid; bad length: %d", len(src)) - } - - dst := make([]byte, 36) - dst[8], dst[13], dst[18], dst[23] = '-', '-', '-', '-' - hex.Encode(dst[0:], src[0:4]) - hex.Encode(dst[9:], src[4:6]) - hex.Encode(dst[14:], src[6:8]) - hex.Encode(dst[19:], src[8:10]) - hex.Encode(dst[24:], src[10:16]) - - return dst, nil -} diff --git a/vendor/github.com/ouqiang/goutil/LICENSE b/vendor/github.com/ouqiang/goutil/LICENSE deleted file mode 100644 index 261eeb9e9..000000000 --- a/vendor/github.com/ouqiang/goutil/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/github.com/ouqiang/goutil/README.md b/vendor/github.com/ouqiang/goutil/README.md deleted file mode 100644 index 4a86fd975..000000000 --- a/vendor/github.com/ouqiang/goutil/README.md +++ /dev/null @@ -1 +0,0 @@ -# Golang 工具包 \ No newline at end of file diff --git a/vendor/github.com/ouqiang/goutil/doc.go b/vendor/github.com/ouqiang/goutil/doc.go deleted file mode 100644 index f0c53b3fc..000000000 --- a/vendor/github.com/ouqiang/goutil/doc.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2018 ouqiang authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -// Package goutil 常用工具包 -package goutil diff --git a/vendor/github.com/ouqiang/goutil/util.go b/vendor/github.com/ouqiang/goutil/util.go deleted file mode 100644 index a9db01a7b..000000000 --- a/vendor/github.com/ouqiang/goutil/util.go +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright 2018 ouqiang authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package goutil - -import ( - "bytes" - "crypto/md5" - "encoding/hex" - "fmt" - "html/template" - "io" - "math/rand" - "net/http" - "os" - "path" - "path/filepath" - "runtime" - "time" -) - -// MD5 生成MD5摘要 -func MD5(s string) string { - m := md5.New() - m.Write([]byte(s)) - - return hex.EncodeToString(m.Sum(nil)) -} - -// RandNumber 生成min - max之间的随机数 -func RandNumber(min, max int) int { - r := rand.New(rand.NewSource(time.Now().UnixNano())) - - return min + r.Intn(max-min) -} - -// PanicToError Panic转换为error -func PanicToError(f func()) (err error) { - defer func() { - if e := recover(); e != nil { - err = fmt.Errorf("panic: %s", e) - } - }() - f() - return -} - -// PrintAppVersion 打印应用版本 -func PrintAppVersion(appVersion, GitCommit, BuildDate string) { - versionInfo, err := FormatAppVersion(appVersion, GitCommit, BuildDate) - if err != nil { - panic(err) - } - fmt.Println(versionInfo) -} - -// FormatAppVersion 格式化应用版本信息 -func FormatAppVersion(appVersion, GitCommit, BuildDate string) (string, error) { - content := ` - Version: {{.Version}} -Go Version: {{.GoVersion}} -Git Commit: {{.GitCommit}} - Built: {{.BuildDate}} - OS/ARCH: {{.GOOS}}/{{.GOARCH}} -` - tpl, err := template.New("version").Parse(content) - if err != nil { - return "", err - } - var buf bytes.Buffer - err = tpl.Execute(&buf, map[string]string{ - "Version": appVersion, - "GoVersion": runtime.Version(), - "GitCommit": GitCommit, - "BuildDate": BuildDate, - "GOOS": runtime.GOOS, - "GOARCH": runtime.GOARCH, - }) - if err != nil { - return "", err - } - - return buf.String(), err -} - -// DownloadFile 文件下载 -func DownloadFile(filePath string, rw http.ResponseWriter) error { - file, err := os.Open(filePath) - if err != nil { - return err - } - filename := path.Base(filePath) - rw.Header().Set("Content-Type", "application/octet-stream") - rw.Header().Set("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, filename)) - _, err = io.Copy(rw, file) - - return err -} - -// WorkDir 获取程序运行时根目录 -func WorkDir() (string, error) { - execPath, err := os.Executable() - if err != nil { - return "", err - } - wd := filepath.Dir(execPath) - if filepath.Base(wd) == "bin" { - wd = filepath.Dir(wd) - } - - return wd, nil -} diff --git a/vendor/github.com/rakyll/statik/LICENSE b/vendor/github.com/rakyll/statik/LICENSE deleted file mode 100644 index a4c5efd82..000000000 --- a/vendor/github.com/rakyll/statik/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2014 Google Inc. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/github.com/rakyll/statik/README.md b/vendor/github.com/rakyll/statik/README.md deleted file mode 100644 index cb0a37a72..000000000 --- a/vendor/github.com/rakyll/statik/README.md +++ /dev/null @@ -1,45 +0,0 @@ -# statik - -[![Build Status](https://travis-ci.org/rakyll/statik.svg?branch=master)](https://travis-ci.org/rakyll/statik) - -statik allows you to embed a directory of static files into your Go binary to be later served from an http.FileSystem. - -Is this a crazy idea? No, not necessarily. If you're building a tool that has a Web component, you typically want to serve some images, CSS and JavaScript. You like the comfort of distributing a single binary, so you don't want to mess with deploying them elsewhere. If your static files are not large in size and will be browsed by a few people, statik is a solution you are looking for. - -## Usage - -Install the command line tool first. - - go get github.com/rakyll/statik - -statik is a tiny program that reads a directory and generates a source file contains its contents. The generated source file registers the directory contents to be used by statik file system. - -The command below will walk on the public path and generate a package called `statik` under the current working directory. - - $ statik -src=/path/to/your/project/public - -In your program, all your need to do is to import the generated package, initialize a new statik file system and serve. - -~~~ go -import ( - "github.com/rakyll/statik/fs" - - _ "./statik" // TODO: Replace with the absolute import path -) - -// ... - - statikFS, err := fs.New() - if err != nil { - log.Fatal(err) - } - - http.Handle("/public/", http.StripPrefix("/public/", http.FileServer(statikFS))) - http.ListenAndServe(":8080", nil) -~~~ - -Visit http://localhost:8080/public/path/to/file to see your file. - -There is also a working example under [example](https://github.com/rakyll/statik/tree/master/example) directory, follow the instructions to build and run it. - -Note: The idea and the implementation are hijacked from [camlistore](http://camlistore.org/). I decided to decouple it from its codebase due to the fact I'm actively in need of a similar solution for many of my projects. diff --git a/vendor/github.com/rakyll/statik/fs/fs.go b/vendor/github.com/rakyll/statik/fs/fs.go deleted file mode 100644 index 82cda3a8b..000000000 --- a/vendor/github.com/rakyll/statik/fs/fs.go +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright 2014 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package fs contains an HTTP file system that works with zip contents. -package fs - -import ( - "archive/zip" - "bytes" - "errors" - "fmt" - "io/ioutil" - "net/http" - "os" - "strings" -) - -var zipData string - -// file holds unzipped read-only file contents and file metadata. -type file struct { - os.FileInfo - data []byte -} - -type statikFS struct { - files map[string]file -} - -// Register registers zip contents data, later used to initialize -// the statik file system. -func Register(data string) { - zipData = data -} - -// New creates a new file system with the registered zip contents data. -// It unzips all files and stores them in an in-memory map. -func New() (http.FileSystem, error) { - if zipData == "" { - return nil, errors.New("statik/fs: no zip data registered") - } - zipReader, err := zip.NewReader(strings.NewReader(zipData), int64(len(zipData))) - if err != nil { - return nil, err - } - files := make(map[string]file) - for _, zipFile := range zipReader.File { - unzipped, err := unzip(zipFile) - if err != nil { - return nil, fmt.Errorf("statik/fs: error unzipping file %q: %s", zipFile.Name, err) - } - files["/"+zipFile.Name] = file{ - FileInfo: zipFile.FileInfo(), - data: unzipped, - } - } - return &statikFS{files: files}, nil -} - -func unzip(zf *zip.File) ([]byte, error) { - rc, err := zf.Open() - if err != nil { - return nil, err - } - defer rc.Close() - return ioutil.ReadAll(rc) -} - -// Open returns a file matching the given file name, or os.ErrNotExists if -// no file matching the given file name is found in the archive. -// If a directory is requested, Open returns the file named "index.html" -// in the requested directory, if that file exists. -func (fs *statikFS) Open(name string) (http.File, error) { - name = strings.Replace(name, "//", "/", -1) - f, ok := fs.files[name] - if ok { - return newHTTPFile(f, false), nil - } - // The file doesn't match, but maybe it's a directory, - // thus we should look for index.html - indexName := strings.Replace(name+"/index.html", "//", "/", -1) - f, ok = fs.files[indexName] - if !ok { - return nil, os.ErrNotExist - } - return newHTTPFile(f, true), nil -} - -func newHTTPFile(file file, isDir bool) *httpFile { - return &httpFile{ - file: file, - reader: bytes.NewReader(file.data), - isDir: isDir, - } -} - -// httpFile represents an HTTP file and acts as a bridge -// between file and http.File. -type httpFile struct { - file - - reader *bytes.Reader - isDir bool -} - -// Read reads bytes into p, returns the number of read bytes. -func (f *httpFile) Read(p []byte) (n int, err error) { - return f.reader.Read(p) -} - -// Seek seeks to the offset. -func (f *httpFile) Seek(offset int64, whence int) (ret int64, err error) { - return f.reader.Seek(offset, whence) -} - -// Stat stats the file. -func (f *httpFile) Stat() (os.FileInfo, error) { - return f, nil -} - -// IsDir returns true if the file location represents a directory. -func (f *httpFile) IsDir() bool { - return f.isDir -} - -// Readdir returns an empty slice of files, directory -// listing is disabled. -func (f *httpFile) Readdir(count int) ([]os.FileInfo, error) { - // directory listing is disabled. - return make([]os.FileInfo, 0), nil -} - -func (f *httpFile) Close() error { - return nil -} diff --git a/vendor/github.com/rakyll/statik/statik.go b/vendor/github.com/rakyll/statik/statik.go deleted file mode 100644 index 73733b02a..000000000 --- a/vendor/github.com/rakyll/statik/statik.go +++ /dev/null @@ -1,233 +0,0 @@ -// Copyright 2014 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package contains a program that generates code to register -// a directory and its contents as zip data for statik file system. -package main - -import ( - "archive/zip" - "bytes" - "flag" - "fmt" - "io" - "io/ioutil" - "os" - "path" - "path/filepath" - "strings" - "time" -) - -const ( - namePackage = "statik" - nameSourceFile = "statik.go" -) - -var ( - flagSrc = flag.String("src", path.Join(".", "public"), "The path of the source directory.") - flagDest = flag.String("dest", ".", "The destination path of the generated package.") - flagNoMtime = flag.Bool("m", false, "Ignore modification times on files.") - flagNoCompress = flag.Bool("Z", false, "Do not use compression to shrink the files.") - flagForce = flag.Bool("f", false, "Overwrite destination file if it already exists.") - flagTags = flag.String("tags", "", "Write build constraint tags") -) - -// mtimeDate holds the arbitrary mtime that we assign to files when -// flagNoMtime is set. -var mtimeDate = time.Date(2000, time.January, 1, 0, 0, 0, 0, time.UTC) - -func main() { - flag.Parse() - - file, err := generateSource(*flagSrc) - if err != nil { - exitWithError(err) - } - - destDir := path.Join(*flagDest, namePackage) - err = os.MkdirAll(destDir, 0755) - if err != nil { - exitWithError(err) - } - - err = rename(file.Name(), path.Join(destDir, nameSourceFile)) - if err != nil { - exitWithError(err) - } -} - -// rename tries to os.Rename, but fall backs to copying from src -// to dest and unlink the source if os.Rename fails. -func rename(src, dest string) error { - // Try to rename generated source. - if err := os.Rename(src, dest); err == nil { - return nil - } - // If the rename failed (might do so due to temporary file residing on a - // different device), try to copy byte by byte. - rc, err := os.Open(src) - if err != nil { - return err - } - defer func() { - rc.Close() - os.Remove(src) // ignore the error, source is in tmp. - }() - - if _, err = os.Stat(dest); !os.IsNotExist(err) { - if *flagForce { - if err = os.Remove(dest); err != nil { - return fmt.Errorf("file %q could not be deleted", dest) - } - } else { - return fmt.Errorf("file %q already exists; use -f to overwrite", dest) - } - } - - wc, err := os.Create(dest) - if err != nil { - return err - } - defer wc.Close() - - if _, err = io.Copy(wc, rc); err != nil { - // Delete remains of failed copy attempt. - os.Remove(dest) - } - return err -} - -// Walks on the source path and generates source code -// that contains source directory's contents as zip contents. -// Generates source registers generated zip contents data to -// be read by the statik/fs HTTP file system. -func generateSource(srcPath string) (file *os.File, err error) { - var ( - buffer bytes.Buffer - zipWriter io.Writer - ) - - zipWriter = &buffer - f, err := ioutil.TempFile("", namePackage) - if err != nil { - return - } - - zipWriter = io.MultiWriter(zipWriter, f) - defer f.Close() - - w := zip.NewWriter(zipWriter) - if err = filepath.Walk(srcPath, func(path string, fi os.FileInfo, err error) error { - if err != nil { - return err - } - // Ignore directories and hidden files. - // No entry is needed for directories in a zip file. - // Each file is represented with a path, no directory - // entities are required to build the hierarchy. - if fi.IsDir() || strings.HasPrefix(fi.Name(), ".") { - return nil - } - relPath, err := filepath.Rel(srcPath, path) - if err != nil { - return err - } - b, err := ioutil.ReadFile(path) - if err != nil { - return err - } - fHeader, err := zip.FileInfoHeader(fi) - if err != nil { - return err - } - if *flagNoMtime { - // Always use the same modification time so that - // the output is deterministic with respect to the file contents. - fHeader.SetModTime(mtimeDate) - } - fHeader.Name = filepath.ToSlash(relPath) - if !*flagNoCompress { - fHeader.Method = zip.Deflate - } - f, err := w.CreateHeader(fHeader) - if err != nil { - return err - } - _, err = f.Write(b) - return err - }); err != nil { - return - } - if err = w.Close(); err != nil { - return - } - - var tags string - if *flagTags != "" { - tags = "\n// +build " + *flagTags + "\n" - } - - // then embed it as a quoted string - var qb bytes.Buffer - fmt.Fprintf(&qb, `// Code generated by statik. DO NOT EDIT. -%s -package %s - -import ( - "github.com/rakyll/statik/fs" -) - -func init() { - data := "`, tags, namePackage) - FprintZipData(&qb, buffer.Bytes()) - fmt.Fprint(&qb, `" - fs.Register(data) -} -`) - - if err = ioutil.WriteFile(f.Name(), qb.Bytes(), 0644); err != nil { - return - } - return f, nil -} - -// FprintZipData converts zip binary contents to a string literal. -func FprintZipData(dest *bytes.Buffer, zipData []byte) { - for _, b := range zipData { - if b == '\n' { - dest.WriteString(`\n`) - continue - } - if b == '\\' { - dest.WriteString(`\\`) - continue - } - if b == '"' { - dest.WriteString(`\"`) - continue - } - if (b >= 32 && b <= 126) || b == '\t' { - dest.WriteByte(b) - continue - } - fmt.Fprintf(dest, "\\x%02x", b) - } -} - -// Prints out the error message and exists with a non-success signal. -func exitWithError(err error) { - fmt.Println(err) - os.Exit(1) -} diff --git a/vendor/github.com/urfave/cli/CHANGELOG.md b/vendor/github.com/urfave/cli/CHANGELOG.md deleted file mode 100644 index 07f75464b..000000000 --- a/vendor/github.com/urfave/cli/CHANGELOG.md +++ /dev/null @@ -1,392 +0,0 @@ -# Change Log - -**ATTN**: This project uses [semantic versioning](http://semver.org/). - -## [Unreleased] - -## [1.19.1] - 2016-11-21 - -### Fixed - -- Fixes regression introduced in 1.19.0 where using an `ActionFunc` as - the `Action` for a command would cause it to error rather than calling the - function. Should not have a affected declarative cases using `func(c - *cli.Context) err)`. -- Shell completion now handles the case where the user specifies - `--generate-bash-completion` immediately after a flag that takes an argument. - Previously it call the application with `--generate-bash-completion` as the - flag value. - -## [1.19.0] - 2016-11-19 -### Added -- `FlagsByName` was added to make it easy to sort flags (e.g. `sort.Sort(cli.FlagsByName(app.Flags))`) -- A `Description` field was added to `App` for a more detailed description of - the application (similar to the existing `Description` field on `Command`) -- Flag type code generation via `go generate` -- Write to stderr and exit 1 if action returns non-nil error -- Added support for TOML to the `altsrc` loader -- `SkipArgReorder` was added to allow users to skip the argument reordering. - This is useful if you want to consider all "flags" after an argument as - arguments rather than flags (the default behavior of the stdlib `flag` - library). This is backported functionality from the [removal of the flag - reordering](https://github.com/urfave/cli/pull/398) in the unreleased version - 2 -- For formatted errors (those implementing `ErrorFormatter`), the errors will - be formatted during output. Compatible with `pkg/errors`. - -### Changed -- Raise minimum tested/supported Go version to 1.2+ - -### Fixed -- Consider empty environment variables as set (previously environment variables - with the equivalent of `""` would be skipped rather than their value used). -- Return an error if the value in a given environment variable cannot be parsed - as the flag type. Previously these errors were silently swallowed. -- Print full error when an invalid flag is specified (which includes the invalid flag) -- `App.Writer` defaults to `stdout` when `nil` -- If no action is specified on a command or app, the help is now printed instead of `panic`ing -- `App.Metadata` is initialized automatically now (previously was `nil` unless initialized) -- Correctly show help message if `-h` is provided to a subcommand -- `context.(Global)IsSet` now respects environment variables. Previously it - would return `false` if a flag was specified in the environment rather than - as an argument -- Removed deprecation warnings to STDERR to avoid them leaking to the end-user -- `altsrc`s import paths were updated to use `gopkg.in/urfave/cli.v1`. This - fixes issues that occurred when `gopkg.in/urfave/cli.v1` was imported as well - as `altsrc` where Go would complain that the types didn't match - -## [1.18.1] - 2016-08-28 -### Fixed -- Removed deprecation warnings to STDERR to avoid them leaking to the end-user (backported) - -## [1.18.0] - 2016-06-27 -### Added -- `./runtests` test runner with coverage tracking by default -- testing on OS X -- testing on Windows -- `UintFlag`, `Uint64Flag`, and `Int64Flag` types and supporting code - -### Changed -- Use spaces for alignment in help/usage output instead of tabs, making the - output alignment consistent regardless of tab width - -### Fixed -- Printing of command aliases in help text -- Printing of visible flags for both struct and struct pointer flags -- Display the `help` subcommand when using `CommandCategories` -- No longer swallows `panic`s that occur within the `Action`s themselves when - detecting the signature of the `Action` field - -## [1.17.1] - 2016-08-28 -### Fixed -- Removed deprecation warnings to STDERR to avoid them leaking to the end-user - -## [1.17.0] - 2016-05-09 -### Added -- Pluggable flag-level help text rendering via `cli.DefaultFlagStringFunc` -- `context.GlobalBoolT` was added as an analogue to `context.GlobalBool` -- Support for hiding commands by setting `Hidden: true` -- this will hide the - commands in help output - -### Changed -- `Float64Flag`, `IntFlag`, and `DurationFlag` default values are no longer - quoted in help text output. -- All flag types now include `(default: {value})` strings following usage when a - default value can be (reasonably) detected. -- `IntSliceFlag` and `StringSliceFlag` usage strings are now more consistent - with non-slice flag types -- Apps now exit with a code of 3 if an unknown subcommand is specified - (previously they printed "No help topic for...", but still exited 0. This - makes it easier to script around apps built using `cli` since they can trust - that a 0 exit code indicated a successful execution. -- cleanups based on [Go Report Card - feedback](https://goreportcard.com/report/github.com/urfave/cli) - -## [1.16.1] - 2016-08-28 -### Fixed -- Removed deprecation warnings to STDERR to avoid them leaking to the end-user - -## [1.16.0] - 2016-05-02 -### Added -- `Hidden` field on all flag struct types to omit from generated help text - -### Changed -- `BashCompletionFlag` (`--enable-bash-completion`) is now omitted from -generated help text via the `Hidden` field - -### Fixed -- handling of error values in `HandleAction` and `HandleExitCoder` - -## [1.15.0] - 2016-04-30 -### Added -- This file! -- Support for placeholders in flag usage strings -- `App.Metadata` map for arbitrary data/state management -- `Set` and `GlobalSet` methods on `*cli.Context` for altering values after -parsing. -- Support for nested lookup of dot-delimited keys in structures loaded from -YAML. - -### Changed -- The `App.Action` and `Command.Action` now prefer a return signature of -`func(*cli.Context) error`, as defined by `cli.ActionFunc`. If a non-nil -`error` is returned, there may be two outcomes: - - If the error fulfills `cli.ExitCoder`, then `os.Exit` will be called - automatically - - Else the error is bubbled up and returned from `App.Run` -- Specifying an `Action` with the legacy return signature of -`func(*cli.Context)` will produce a deprecation message to stderr -- Specifying an `Action` that is not a `func` type will produce a non-zero exit -from `App.Run` -- Specifying an `Action` func that has an invalid (input) signature will -produce a non-zero exit from `App.Run` - -### Deprecated -- -`cli.App.RunAndExitOnError`, which should now be done by returning an error -that fulfills `cli.ExitCoder` to `cli.App.Run`. -- the legacy signature for -`cli.App.Action` of `func(*cli.Context)`, which should now have a return -signature of `func(*cli.Context) error`, as defined by `cli.ActionFunc`. - -### Fixed -- Added missing `*cli.Context.GlobalFloat64` method - -## [1.14.0] - 2016-04-03 (backfilled 2016-04-25) -### Added -- Codebeat badge -- Support for categorization via `CategorizedHelp` and `Categories` on app. - -### Changed -- Use `filepath.Base` instead of `path.Base` in `Name` and `HelpName`. - -### Fixed -- Ensure version is not shown in help text when `HideVersion` set. - -## [1.13.0] - 2016-03-06 (backfilled 2016-04-25) -### Added -- YAML file input support. -- `NArg` method on context. - -## [1.12.0] - 2016-02-17 (backfilled 2016-04-25) -### Added -- Custom usage error handling. -- Custom text support in `USAGE` section of help output. -- Improved help messages for empty strings. -- AppVeyor CI configuration. - -### Changed -- Removed `panic` from default help printer func. -- De-duping and optimizations. - -### Fixed -- Correctly handle `Before`/`After` at command level when no subcommands. -- Case of literal `-` argument causing flag reordering. -- Environment variable hints on Windows. -- Docs updates. - -## [1.11.1] - 2015-12-21 (backfilled 2016-04-25) -### Changed -- Use `path.Base` in `Name` and `HelpName` -- Export `GetName` on flag types. - -### Fixed -- Flag parsing when skipping is enabled. -- Test output cleanup. -- Move completion check to account for empty input case. - -## [1.11.0] - 2015-11-15 (backfilled 2016-04-25) -### Added -- Destination scan support for flags. -- Testing against `tip` in Travis CI config. - -### Changed -- Go version in Travis CI config. - -### Fixed -- Removed redundant tests. -- Use correct example naming in tests. - -## [1.10.2] - 2015-10-29 (backfilled 2016-04-25) -### Fixed -- Remove unused var in bash completion. - -## [1.10.1] - 2015-10-21 (backfilled 2016-04-25) -### Added -- Coverage and reference logos in README. - -### Fixed -- Use specified values in help and version parsing. -- Only display app version and help message once. - -## [1.10.0] - 2015-10-06 (backfilled 2016-04-25) -### Added -- More tests for existing functionality. -- `ArgsUsage` at app and command level for help text flexibility. - -### Fixed -- Honor `HideHelp` and `HideVersion` in `App.Run`. -- Remove juvenile word from README. - -## [1.9.0] - 2015-09-08 (backfilled 2016-04-25) -### Added -- `FullName` on command with accompanying help output update. -- Set default `$PROG` in bash completion. - -### Changed -- Docs formatting. - -### Fixed -- Removed self-referential imports in tests. - -## [1.8.0] - 2015-06-30 (backfilled 2016-04-25) -### Added -- Support for `Copyright` at app level. -- `Parent` func at context level to walk up context lineage. - -### Fixed -- Global flag processing at top level. - -## [1.7.1] - 2015-06-11 (backfilled 2016-04-25) -### Added -- Aggregate errors from `Before`/`After` funcs. -- Doc comments on flag structs. -- Include non-global flags when checking version and help. -- Travis CI config updates. - -### Fixed -- Ensure slice type flags have non-nil values. -- Collect global flags from the full command hierarchy. -- Docs prose. - -## [1.7.0] - 2015-05-03 (backfilled 2016-04-25) -### Changed -- `HelpPrinter` signature includes output writer. - -### Fixed -- Specify go 1.1+ in docs. -- Set `Writer` when running command as app. - -## [1.6.0] - 2015-03-23 (backfilled 2016-04-25) -### Added -- Multiple author support. -- `NumFlags` at context level. -- `Aliases` at command level. - -### Deprecated -- `ShortName` at command level. - -### Fixed -- Subcommand help output. -- Backward compatible support for deprecated `Author` and `Email` fields. -- Docs regarding `Names`/`Aliases`. - -## [1.5.0] - 2015-02-20 (backfilled 2016-04-25) -### Added -- `After` hook func support at app and command level. - -### Fixed -- Use parsed context when running command as subcommand. -- Docs prose. - -## [1.4.1] - 2015-01-09 (backfilled 2016-04-25) -### Added -- Support for hiding `-h / --help` flags, but not `help` subcommand. -- Stop flag parsing after `--`. - -### Fixed -- Help text for generic flags to specify single value. -- Use double quotes in output for defaults. -- Use `ParseInt` instead of `ParseUint` for int environment var values. -- Use `0` as base when parsing int environment var values. - -## [1.4.0] - 2014-12-12 (backfilled 2016-04-25) -### Added -- Support for environment variable lookup "cascade". -- Support for `Stdout` on app for output redirection. - -### Fixed -- Print command help instead of app help in `ShowCommandHelp`. - -## [1.3.1] - 2014-11-13 (backfilled 2016-04-25) -### Added -- Docs and example code updates. - -### Changed -- Default `-v / --version` flag made optional. - -## [1.3.0] - 2014-08-10 (backfilled 2016-04-25) -### Added -- `FlagNames` at context level. -- Exposed `VersionPrinter` var for more control over version output. -- Zsh completion hook. -- `AUTHOR` section in default app help template. -- Contribution guidelines. -- `DurationFlag` type. - -## [1.2.0] - 2014-08-02 -### Added -- Support for environment variable defaults on flags plus tests. - -## [1.1.0] - 2014-07-15 -### Added -- Bash completion. -- Optional hiding of built-in help command. -- Optional skipping of flag parsing at command level. -- `Author`, `Email`, and `Compiled` metadata on app. -- `Before` hook func support at app and command level. -- `CommandNotFound` func support at app level. -- Command reference available on context. -- `GenericFlag` type. -- `Float64Flag` type. -- `BoolTFlag` type. -- `IsSet` flag helper on context. -- More flag lookup funcs at context level. -- More tests & docs. - -### Changed -- Help template updates to account for presence/absence of flags. -- Separated subcommand help template. -- Exposed `HelpPrinter` var for more control over help output. - -## [1.0.0] - 2013-11-01 -### Added -- `help` flag in default app flag set and each command flag set. -- Custom handling of argument parsing errors. -- Command lookup by name at app level. -- `StringSliceFlag` type and supporting `StringSlice` type. -- `IntSliceFlag` type and supporting `IntSlice` type. -- Slice type flag lookups by name at context level. -- Export of app and command help functions. -- More tests & docs. - -## 0.1.0 - 2013-07-22 -### Added -- Initial implementation. - -[Unreleased]: https://github.com/urfave/cli/compare/v1.18.0...HEAD -[1.18.0]: https://github.com/urfave/cli/compare/v1.17.0...v1.18.0 -[1.17.0]: https://github.com/urfave/cli/compare/v1.16.0...v1.17.0 -[1.16.0]: https://github.com/urfave/cli/compare/v1.15.0...v1.16.0 -[1.15.0]: https://github.com/urfave/cli/compare/v1.14.0...v1.15.0 -[1.14.0]: https://github.com/urfave/cli/compare/v1.13.0...v1.14.0 -[1.13.0]: https://github.com/urfave/cli/compare/v1.12.0...v1.13.0 -[1.12.0]: https://github.com/urfave/cli/compare/v1.11.1...v1.12.0 -[1.11.1]: https://github.com/urfave/cli/compare/v1.11.0...v1.11.1 -[1.11.0]: https://github.com/urfave/cli/compare/v1.10.2...v1.11.0 -[1.10.2]: https://github.com/urfave/cli/compare/v1.10.1...v1.10.2 -[1.10.1]: https://github.com/urfave/cli/compare/v1.10.0...v1.10.1 -[1.10.0]: https://github.com/urfave/cli/compare/v1.9.0...v1.10.0 -[1.9.0]: https://github.com/urfave/cli/compare/v1.8.0...v1.9.0 -[1.8.0]: https://github.com/urfave/cli/compare/v1.7.1...v1.8.0 -[1.7.1]: https://github.com/urfave/cli/compare/v1.7.0...v1.7.1 -[1.7.0]: https://github.com/urfave/cli/compare/v1.6.0...v1.7.0 -[1.6.0]: https://github.com/urfave/cli/compare/v1.5.0...v1.6.0 -[1.5.0]: https://github.com/urfave/cli/compare/v1.4.1...v1.5.0 -[1.4.1]: https://github.com/urfave/cli/compare/v1.4.0...v1.4.1 -[1.4.0]: https://github.com/urfave/cli/compare/v1.3.1...v1.4.0 -[1.3.1]: https://github.com/urfave/cli/compare/v1.3.0...v1.3.1 -[1.3.0]: https://github.com/urfave/cli/compare/v1.2.0...v1.3.0 -[1.2.0]: https://github.com/urfave/cli/compare/v1.1.0...v1.2.0 -[1.1.0]: https://github.com/urfave/cli/compare/v1.0.0...v1.1.0 -[1.0.0]: https://github.com/urfave/cli/compare/v0.1.0...v1.0.0 diff --git a/vendor/github.com/urfave/cli/LICENSE b/vendor/github.com/urfave/cli/LICENSE deleted file mode 100644 index 42a597e29..000000000 --- a/vendor/github.com/urfave/cli/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2016 Jeremy Saenz & Contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/github.com/urfave/cli/README.md b/vendor/github.com/urfave/cli/README.md deleted file mode 100644 index 2bbbd8ea9..000000000 --- a/vendor/github.com/urfave/cli/README.md +++ /dev/null @@ -1,1381 +0,0 @@ -cli -=== - -[![Build Status](https://travis-ci.org/urfave/cli.svg?branch=master)](https://travis-ci.org/urfave/cli) -[![Windows Build Status](https://ci.appveyor.com/api/projects/status/rtgk5xufi932pb2v?svg=true)](https://ci.appveyor.com/project/urfave/cli) -[![GoDoc](https://godoc.org/github.com/urfave/cli?status.svg)](https://godoc.org/github.com/urfave/cli) -[![codebeat](https://codebeat.co/badges/0a8f30aa-f975-404b-b878-5fab3ae1cc5f)](https://codebeat.co/projects/github-com-urfave-cli) -[![Go Report Card](https://goreportcard.com/badge/urfave/cli)](https://goreportcard.com/report/urfave/cli) -[![top level coverage](https://gocover.io/_badge/github.com/urfave/cli?0 "top level coverage")](http://gocover.io/github.com/urfave/cli) / -[![altsrc coverage](https://gocover.io/_badge/github.com/urfave/cli/altsrc?0 "altsrc coverage")](http://gocover.io/github.com/urfave/cli/altsrc) - -**Notice:** This is the library formerly known as -`github.com/codegangsta/cli` -- Github will automatically redirect requests -to this repository, but we recommend updating your references for clarity. - -cli is a simple, fast, and fun package for building command line apps in Go. The -goal is to enable developers to write fast and distributable command line -applications in an expressive way. - - - -- [Overview](#overview) -- [Installation](#installation) - * [Supported platforms](#supported-platforms) - * [Using the `v2` branch](#using-the-v2-branch) - * [Pinning to the `v1` releases](#pinning-to-the-v1-releases) -- [Getting Started](#getting-started) -- [Examples](#examples) - * [Arguments](#arguments) - * [Flags](#flags) - + [Placeholder Values](#placeholder-values) - + [Alternate Names](#alternate-names) - + [Ordering](#ordering) - + [Values from the Environment](#values-from-the-environment) - + [Values from alternate input sources (YAML, TOML, and others)](#values-from-alternate-input-sources-yaml-toml-and-others) - * [Subcommands](#subcommands) - * [Subcommands categories](#subcommands-categories) - * [Exit code](#exit-code) - * [Bash Completion](#bash-completion) - + [Enabling](#enabling) - + [Distribution](#distribution) - + [Customization](#customization) - * [Generated Help Text](#generated-help-text) - + [Customization](#customization-1) - * [Version Flag](#version-flag) - + [Customization](#customization-2) - + [Full API Example](#full-api-example) -- [Contribution Guidelines](#contribution-guidelines) - - - -## Overview - -Command line apps are usually so tiny that there is absolutely no reason why -your code should *not* be self-documenting. Things like generating help text and -parsing command flags/options should not hinder productivity when writing a -command line app. - -**This is where cli comes into play.** cli makes command line programming fun, -organized, and expressive! - -## Installation - -Make sure you have a working Go environment. Go version 1.2+ is supported. [See -the install instructions for Go](http://golang.org/doc/install.html). - -To install cli, simply run: -``` -$ go get github.com/urfave/cli -``` - -Make sure your `PATH` includes the `$GOPATH/bin` directory so your commands can -be easily used: -``` -export PATH=$PATH:$GOPATH/bin -``` - -### Supported platforms - -cli is tested against multiple versions of Go on Linux, and against the latest -released version of Go on OS X and Windows. For full details, see -[`./.travis.yml`](./.travis.yml) and [`./appveyor.yml`](./appveyor.yml). - -### Using the `v2` branch - -**Warning**: The `v2` branch is currently unreleased and considered unstable. - -There is currently a long-lived branch named `v2` that is intended to land as -the new `master` branch once development there has settled down. The current -`master` branch (mirrored as `v1`) is being manually merged into `v2` on -an irregular human-based schedule, but generally if one wants to "upgrade" to -`v2` *now* and accept the volatility (read: "awesomeness") that comes along with -that, please use whatever version pinning of your preference, such as via -`gopkg.in`: - -``` -$ go get gopkg.in/urfave/cli.v2 -``` - -``` go -... -import ( - "gopkg.in/urfave/cli.v2" // imports as package "cli" -) -... -``` - -### Pinning to the `v1` releases - -Similarly to the section above describing use of the `v2` branch, if one wants -to avoid any unexpected compatibility pains once `v2` becomes `master`, then -pinning to `v1` is an acceptable option, e.g.: - -``` -$ go get gopkg.in/urfave/cli.v1 -``` - -``` go -... -import ( - "gopkg.in/urfave/cli.v1" // imports as package "cli" -) -... -``` - -This will pull the latest tagged `v1` release (e.g. `v1.18.1` at the time of writing). - -## Getting Started - -One of the philosophies behind cli is that an API should be playful and full of -discovery. So a cli app can be as little as one line of code in `main()`. - - -``` go -package main - -import ( - "os" - - "github.com/urfave/cli" -) - -func main() { - cli.NewApp().Run(os.Args) -} -``` - -This app will run and show help text, but is not very useful. Let's give an -action to execute and some help documentation: - - -``` go -package main - -import ( - "fmt" - "os" - - "github.com/urfave/cli" -) - -func main() { - app := cli.NewApp() - app.Name = "boom" - app.Usage = "make an explosive entrance" - app.Action = func(c *cli.Context) error { - fmt.Println("boom! I say!") - return nil - } - - app.Run(os.Args) -} -``` - -Running this already gives you a ton of functionality, plus support for things -like subcommands and flags, which are covered below. - -## Examples - -Being a programmer can be a lonely job. Thankfully by the power of automation -that is not the case! Let's create a greeter app to fend off our demons of -loneliness! - -Start by creating a directory named `greet`, and within it, add a file, -`greet.go` with the following code in it: - - -``` go -package main - -import ( - "fmt" - "os" - - "github.com/urfave/cli" -) - -func main() { - app := cli.NewApp() - app.Name = "greet" - app.Usage = "fight the loneliness!" - app.Action = func(c *cli.Context) error { - fmt.Println("Hello friend!") - return nil - } - - app.Run(os.Args) -} -``` - -Install our command to the `$GOPATH/bin` directory: - -``` -$ go install -``` - -Finally run our new command: - -``` -$ greet -Hello friend! -``` - -cli also generates neat help text: - -``` -$ greet help -NAME: - greet - fight the loneliness! - -USAGE: - greet [global options] command [command options] [arguments...] - -VERSION: - 0.0.0 - -COMMANDS: - help, h Shows a list of commands or help for one command - -GLOBAL OPTIONS - --version Shows version information -``` - -### Arguments - -You can lookup arguments by calling the `Args` function on `cli.Context`, e.g.: - - -``` go -package main - -import ( - "fmt" - "os" - - "github.com/urfave/cli" -) - -func main() { - app := cli.NewApp() - - app.Action = func(c *cli.Context) error { - fmt.Printf("Hello %q", c.Args().Get(0)) - return nil - } - - app.Run(os.Args) -} -``` - -### Flags - -Setting and querying flags is simple. - - -``` go -package main - -import ( - "fmt" - "os" - - "github.com/urfave/cli" -) - -func main() { - app := cli.NewApp() - - app.Flags = []cli.Flag { - cli.StringFlag{ - Name: "lang", - Value: "english", - Usage: "language for the greeting", - }, - } - - app.Action = func(c *cli.Context) error { - name := "Nefertiti" - if c.NArg() > 0 { - name = c.Args().Get(0) - } - if c.String("lang") == "spanish" { - fmt.Println("Hola", name) - } else { - fmt.Println("Hello", name) - } - return nil - } - - app.Run(os.Args) -} -``` - -You can also set a destination variable for a flag, to which the content will be -scanned. - - -``` go -package main - -import ( - "os" - "fmt" - - "github.com/urfave/cli" -) - -func main() { - var language string - - app := cli.NewApp() - - app.Flags = []cli.Flag { - cli.StringFlag{ - Name: "lang", - Value: "english", - Usage: "language for the greeting", - Destination: &language, - }, - } - - app.Action = func(c *cli.Context) error { - name := "someone" - if c.NArg() > 0 { - name = c.Args()[0] - } - if language == "spanish" { - fmt.Println("Hola", name) - } else { - fmt.Println("Hello", name) - } - return nil - } - - app.Run(os.Args) -} -``` - -See full list of flags at http://godoc.org/github.com/urfave/cli - -#### Placeholder Values - -Sometimes it's useful to specify a flag's value within the usage string itself. -Such placeholders are indicated with back quotes. - -For example this: - - -```go -package main - -import ( - "os" - - "github.com/urfave/cli" -) - -func main() { - app := cli.NewApp() - - app.Flags = []cli.Flag{ - cli.StringFlag{ - Name: "config, c", - Usage: "Load configuration from `FILE`", - }, - } - - app.Run(os.Args) -} -``` - -Will result in help output like: - -``` ---config FILE, -c FILE Load configuration from FILE -``` - -Note that only the first placeholder is used. Subsequent back-quoted words will -be left as-is. - -#### Alternate Names - -You can set alternate (or short) names for flags by providing a comma-delimited -list for the `Name`. e.g. - - -``` go -package main - -import ( - "os" - - "github.com/urfave/cli" -) - -func main() { - app := cli.NewApp() - - app.Flags = []cli.Flag { - cli.StringFlag{ - Name: "lang, l", - Value: "english", - Usage: "language for the greeting", - }, - } - - app.Run(os.Args) -} -``` - -That flag can then be set with `--lang spanish` or `-l spanish`. Note that -giving two different forms of the same flag in the same command invocation is an -error. - -#### Ordering - -Flags for the application and commands are shown in the order they are defined. -However, it's possible to sort them from outside this library by using `FlagsByName` -or `CommandsByName` with `sort`. - -For example this: - - -``` go -package main - -import ( - "os" - "sort" - - "github.com/urfave/cli" -) - -func main() { - app := cli.NewApp() - - app.Flags = []cli.Flag { - cli.StringFlag{ - Name: "lang, l", - Value: "english", - Usage: "Language for the greeting", - }, - cli.StringFlag{ - Name: "config, c", - Usage: "Load configuration from `FILE`", - }, - } - - app.Commands = []cli.Command{ - { - Name: "complete", - Aliases: []string{"c"}, - Usage: "complete a task on the list", - Action: func(c *cli.Context) error { - return nil - }, - }, - { - Name: "add", - Aliases: []string{"a"}, - Usage: "add a task to the list", - Action: func(c *cli.Context) error { - return nil - }, - }, - } - - sort.Sort(cli.FlagsByName(app.Flags)) - sort.Sort(cli.CommandsByName(app.Commands)) - - app.Run(os.Args) -} -``` - -Will result in help output like: - -``` ---config FILE, -c FILE Load configuration from FILE ---lang value, -l value Language for the greeting (default: "english") -``` - -#### Values from the Environment - -You can also have the default value set from the environment via `EnvVar`. e.g. - - -``` go -package main - -import ( - "os" - - "github.com/urfave/cli" -) - -func main() { - app := cli.NewApp() - - app.Flags = []cli.Flag { - cli.StringFlag{ - Name: "lang, l", - Value: "english", - Usage: "language for the greeting", - EnvVar: "APP_LANG", - }, - } - - app.Run(os.Args) -} -``` - -The `EnvVar` may also be given as a comma-delimited "cascade", where the first -environment variable that resolves is used as the default. - - -``` go -package main - -import ( - "os" - - "github.com/urfave/cli" -) - -func main() { - app := cli.NewApp() - - app.Flags = []cli.Flag { - cli.StringFlag{ - Name: "lang, l", - Value: "english", - Usage: "language for the greeting", - EnvVar: "LEGACY_COMPAT_LANG,APP_LANG,LANG", - }, - } - - app.Run(os.Args) -} -``` - -#### Values from alternate input sources (YAML, TOML, and others) - -There is a separate package altsrc that adds support for getting flag values -from other file input sources. - -Currently supported input source formats: -* YAML -* TOML - -In order to get values for a flag from an alternate input source the following -code would be added to wrap an existing cli.Flag like below: - -``` go - altsrc.NewIntFlag(cli.IntFlag{Name: "test"}) -``` - -Initialization must also occur for these flags. Below is an example initializing -getting data from a yaml file below. - -``` go - command.Before = altsrc.InitInputSourceWithContext(command.Flags, NewYamlSourceFromFlagFunc("load")) -``` - -The code above will use the "load" string as a flag name to get the file name of -a yaml file from the cli.Context. It will then use that file name to initialize -the yaml input source for any flags that are defined on that command. As a note -the "load" flag used would also have to be defined on the command flags in order -for this code snipped to work. - -Currently only the aboved specified formats are supported but developers can -add support for other input sources by implementing the -altsrc.InputSourceContext for their given sources. - -Here is a more complete sample of a command using YAML support: - - -``` go -package notmain - -import ( - "fmt" - "os" - - "github.com/urfave/cli" - "github.com/urfave/cli/altsrc" -) - -func main() { - app := cli.NewApp() - - flags := []cli.Flag{ - altsrc.NewIntFlag(cli.IntFlag{Name: "test"}), - cli.StringFlag{Name: "load"}, - } - - app.Action = func(c *cli.Context) error { - fmt.Println("yaml ist rad") - return nil - } - - app.Before = altsrc.InitInputSourceWithContext(flags, altsrc.NewYamlSourceFromFlagFunc("load")) - app.Flags = flags - - app.Run(os.Args) -} -``` - -### Subcommands - -Subcommands can be defined for a more git-like command line app. - - -```go -package main - -import ( - "fmt" - "os" - - "github.com/urfave/cli" -) - -func main() { - app := cli.NewApp() - - app.Commands = []cli.Command{ - { - Name: "add", - Aliases: []string{"a"}, - Usage: "add a task to the list", - Action: func(c *cli.Context) error { - fmt.Println("added task: ", c.Args().First()) - return nil - }, - }, - { - Name: "complete", - Aliases: []string{"c"}, - Usage: "complete a task on the list", - Action: func(c *cli.Context) error { - fmt.Println("completed task: ", c.Args().First()) - return nil - }, - }, - { - Name: "template", - Aliases: []string{"t"}, - Usage: "options for task templates", - Subcommands: []cli.Command{ - { - Name: "add", - Usage: "add a new template", - Action: func(c *cli.Context) error { - fmt.Println("new task template: ", c.Args().First()) - return nil - }, - }, - { - Name: "remove", - Usage: "remove an existing template", - Action: func(c *cli.Context) error { - fmt.Println("removed task template: ", c.Args().First()) - return nil - }, - }, - }, - }, - } - - app.Run(os.Args) -} -``` - -### Subcommands categories - -For additional organization in apps that have many subcommands, you can -associate a category for each command to group them together in the help -output. - -E.g. - -```go -package main - -import ( - "os" - - "github.com/urfave/cli" -) - -func main() { - app := cli.NewApp() - - app.Commands = []cli.Command{ - { - Name: "noop", - }, - { - Name: "add", - Category: "template", - }, - { - Name: "remove", - Category: "template", - }, - } - - app.Run(os.Args) -} -``` - -Will include: - -``` -COMMANDS: - noop - - Template actions: - add - remove -``` - -### Exit code - -Calling `App.Run` will not automatically call `os.Exit`, which means that by -default the exit code will "fall through" to being `0`. An explicit exit code -may be set by returning a non-nil error that fulfills `cli.ExitCoder`, *or* a -`cli.MultiError` that includes an error that fulfills `cli.ExitCoder`, e.g.: - -``` go -package main - -import ( - "os" - - "github.com/urfave/cli" -) - -func main() { - app := cli.NewApp() - app.Flags = []cli.Flag{ - cli.BoolTFlag{ - Name: "ginger-crouton", - Usage: "is it in the soup?", - }, - } - app.Action = func(ctx *cli.Context) error { - if !ctx.Bool("ginger-crouton") { - return cli.NewExitError("it is not in the soup", 86) - } - return nil - } - - app.Run(os.Args) -} -``` - -### Bash Completion - -You can enable completion commands by setting the `EnableBashCompletion` -flag on the `App` object. By default, this setting will only auto-complete to -show an app's subcommands, but you can write your own completion methods for -the App or its subcommands. - - -``` go -package main - -import ( - "fmt" - "os" - - "github.com/urfave/cli" -) - -func main() { - tasks := []string{"cook", "clean", "laundry", "eat", "sleep", "code"} - - app := cli.NewApp() - app.EnableBashCompletion = true - app.Commands = []cli.Command{ - { - Name: "complete", - Aliases: []string{"c"}, - Usage: "complete a task on the list", - Action: func(c *cli.Context) error { - fmt.Println("completed task: ", c.Args().First()) - return nil - }, - BashComplete: func(c *cli.Context) { - // This will complete if no args are passed - if c.NArg() > 0 { - return - } - for _, t := range tasks { - fmt.Println(t) - } - }, - }, - } - - app.Run(os.Args) -} -``` - -#### Enabling - -Source the `autocomplete/bash_autocomplete` file in your `.bashrc` file while -setting the `PROG` variable to the name of your program: - -`PROG=myprogram source /.../cli/autocomplete/bash_autocomplete` - -#### Distribution - -Copy `autocomplete/bash_autocomplete` into `/etc/bash_completion.d/` and rename -it to the name of the program you wish to add autocomplete support for (or -automatically install it there if you are distributing a package). Don't forget -to source the file to make it active in the current shell. - -``` -sudo cp src/bash_autocomplete /etc/bash_completion.d/ -source /etc/bash_completion.d/ -``` - -Alternatively, you can just document that users should source the generic -`autocomplete/bash_autocomplete` in their bash configuration with `$PROG` set -to the name of their program (as above). - -#### Customization - -The default bash completion flag (`--generate-bash-completion`) is defined as -`cli.BashCompletionFlag`, and may be redefined if desired, e.g.: - - -``` go -package main - -import ( - "os" - - "github.com/urfave/cli" -) - -func main() { - cli.BashCompletionFlag = cli.BoolFlag{ - Name: "compgen", - Hidden: true, - } - - app := cli.NewApp() - app.EnableBashCompletion = true - app.Commands = []cli.Command{ - { - Name: "wat", - }, - } - app.Run(os.Args) -} -``` - -### Generated Help Text - -The default help flag (`-h/--help`) is defined as `cli.HelpFlag` and is checked -by the cli internals in order to print generated help text for the app, command, -or subcommand, and break execution. - -#### Customization - -All of the help text generation may be customized, and at multiple levels. The -templates are exposed as variables `AppHelpTemplate`, `CommandHelpTemplate`, and -`SubcommandHelpTemplate` which may be reassigned or augmented, and full override -is possible by assigning a compatible func to the `cli.HelpPrinter` variable, -e.g.: - - -``` go -package main - -import ( - "fmt" - "io" - "os" - - "github.com/urfave/cli" -) - -func main() { - // EXAMPLE: Append to an existing template - cli.AppHelpTemplate = fmt.Sprintf(`%s - -WEBSITE: http://awesometown.example.com - -SUPPORT: support@awesometown.example.com - -`, cli.AppHelpTemplate) - - // EXAMPLE: Override a template - cli.AppHelpTemplate = `NAME: - {{.Name}} - {{.Usage}} -USAGE: - {{.HelpName}} {{if .VisibleFlags}}[global options]{{end}}{{if .Commands}} command [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}} - {{if len .Authors}} -AUTHOR: - {{range .Authors}}{{ . }}{{end}} - {{end}}{{if .Commands}} -COMMANDS: -{{range .Commands}}{{if not .HideHelp}} {{join .Names ", "}}{{ "\t"}}{{.Usage}}{{ "\n" }}{{end}}{{end}}{{end}}{{if .VisibleFlags}} -GLOBAL OPTIONS: - {{range .VisibleFlags}}{{.}} - {{end}}{{end}}{{if .Copyright }} -COPYRIGHT: - {{.Copyright}} - {{end}}{{if .Version}} -VERSION: - {{.Version}} - {{end}} -` - - // EXAMPLE: Replace the `HelpPrinter` func - cli.HelpPrinter = func(w io.Writer, templ string, data interface{}) { - fmt.Println("Ha HA. I pwnd the help!!1") - } - - cli.NewApp().Run(os.Args) -} -``` - -The default flag may be customized to something other than `-h/--help` by -setting `cli.HelpFlag`, e.g.: - - -``` go -package main - -import ( - "os" - - "github.com/urfave/cli" -) - -func main() { - cli.HelpFlag = cli.BoolFlag{ - Name: "halp, haaaaalp", - Usage: "HALP", - EnvVar: "SHOW_HALP,HALPPLZ", - } - - cli.NewApp().Run(os.Args) -} -``` - -### Version Flag - -The default version flag (`-v/--version`) is defined as `cli.VersionFlag`, which -is checked by the cli internals in order to print the `App.Version` via -`cli.VersionPrinter` and break execution. - -#### Customization - -The default flag may be customized to something other than `-v/--version` by -setting `cli.VersionFlag`, e.g.: - - -``` go -package main - -import ( - "os" - - "github.com/urfave/cli" -) - -func main() { - cli.VersionFlag = cli.BoolFlag{ - Name: "print-version, V", - Usage: "print only the version", - } - - app := cli.NewApp() - app.Name = "partay" - app.Version = "19.99.0" - app.Run(os.Args) -} -``` - -Alternatively, the version printer at `cli.VersionPrinter` may be overridden, e.g.: - - -``` go -package main - -import ( - "fmt" - "os" - - "github.com/urfave/cli" -) - -var ( - Revision = "fafafaf" -) - -func main() { - cli.VersionPrinter = func(c *cli.Context) { - fmt.Printf("version=%s revision=%s\n", c.App.Version, Revision) - } - - app := cli.NewApp() - app.Name = "partay" - app.Version = "19.99.0" - app.Run(os.Args) -} -``` - -#### Full API Example - -**Notice**: This is a contrived (functioning) example meant strictly for API -demonstration purposes. Use of one's imagination is encouraged. - - -``` go -package main - -import ( - "errors" - "flag" - "fmt" - "io" - "io/ioutil" - "os" - "time" - - "github.com/urfave/cli" -) - -func init() { - cli.AppHelpTemplate += "\nCUSTOMIZED: you bet ur muffins\n" - cli.CommandHelpTemplate += "\nYMMV\n" - cli.SubcommandHelpTemplate += "\nor something\n" - - cli.HelpFlag = cli.BoolFlag{Name: "halp"} - cli.BashCompletionFlag = cli.BoolFlag{Name: "compgen", Hidden: true} - cli.VersionFlag = cli.BoolFlag{Name: "print-version, V"} - - cli.HelpPrinter = func(w io.Writer, templ string, data interface{}) { - fmt.Fprintf(w, "best of luck to you\n") - } - cli.VersionPrinter = func(c *cli.Context) { - fmt.Fprintf(c.App.Writer, "version=%s\n", c.App.Version) - } - cli.OsExiter = func(c int) { - fmt.Fprintf(cli.ErrWriter, "refusing to exit %d\n", c) - } - cli.ErrWriter = ioutil.Discard - cli.FlagStringer = func(fl cli.Flag) string { - return fmt.Sprintf("\t\t%s", fl.GetName()) - } -} - -type hexWriter struct{} - -func (w *hexWriter) Write(p []byte) (int, error) { - for _, b := range p { - fmt.Printf("%x", b) - } - fmt.Printf("\n") - - return len(p), nil -} - -type genericType struct{ - s string -} - -func (g *genericType) Set(value string) error { - g.s = value - return nil -} - -func (g *genericType) String() string { - return g.s -} - -func main() { - app := cli.NewApp() - app.Name = "kənˈtrīv" - app.Version = "19.99.0" - app.Compiled = time.Now() - app.Authors = []cli.Author{ - cli.Author{ - Name: "Example Human", - Email: "human@example.com", - }, - } - app.Copyright = "(c) 1999 Serious Enterprise" - app.HelpName = "contrive" - app.Usage = "demonstrate available API" - app.UsageText = "contrive - demonstrating the available API" - app.ArgsUsage = "[args and such]" - app.Commands = []cli.Command{ - cli.Command{ - Name: "doo", - Aliases: []string{"do"}, - Category: "motion", - Usage: "do the doo", - UsageText: "doo - does the dooing", - Description: "no really, there is a lot of dooing to be done", - ArgsUsage: "[arrgh]", - Flags: []cli.Flag{ - cli.BoolFlag{Name: "forever, forevvarr"}, - }, - Subcommands: cli.Commands{ - cli.Command{ - Name: "wop", - Action: wopAction, - }, - }, - SkipFlagParsing: false, - HideHelp: false, - Hidden: false, - HelpName: "doo!", - BashComplete: func(c *cli.Context) { - fmt.Fprintf(c.App.Writer, "--better\n") - }, - Before: func(c *cli.Context) error { - fmt.Fprintf(c.App.Writer, "brace for impact\n") - return nil - }, - After: func(c *cli.Context) error { - fmt.Fprintf(c.App.Writer, "did we lose anyone?\n") - return nil - }, - Action: func(c *cli.Context) error { - c.Command.FullName() - c.Command.HasName("wop") - c.Command.Names() - c.Command.VisibleFlags() - fmt.Fprintf(c.App.Writer, "dodododododoodododddooooododododooo\n") - if c.Bool("forever") { - c.Command.Run(c) - } - return nil - }, - OnUsageError: func(c *cli.Context, err error, isSubcommand bool) error { - fmt.Fprintf(c.App.Writer, "for shame\n") - return err - }, - }, - } - app.Flags = []cli.Flag{ - cli.BoolFlag{Name: "fancy"}, - cli.BoolTFlag{Name: "fancier"}, - cli.DurationFlag{Name: "howlong, H", Value: time.Second * 3}, - cli.Float64Flag{Name: "howmuch"}, - cli.GenericFlag{Name: "wat", Value: &genericType{}}, - cli.Int64Flag{Name: "longdistance"}, - cli.Int64SliceFlag{Name: "intervals"}, - cli.IntFlag{Name: "distance"}, - cli.IntSliceFlag{Name: "times"}, - cli.StringFlag{Name: "dance-move, d"}, - cli.StringSliceFlag{Name: "names, N"}, - cli.UintFlag{Name: "age"}, - cli.Uint64Flag{Name: "bigage"}, - } - app.EnableBashCompletion = true - app.HideHelp = false - app.HideVersion = false - app.BashComplete = func(c *cli.Context) { - fmt.Fprintf(c.App.Writer, "lipstick\nkiss\nme\nlipstick\nringo\n") - } - app.Before = func(c *cli.Context) error { - fmt.Fprintf(c.App.Writer, "HEEEERE GOES\n") - return nil - } - app.After = func(c *cli.Context) error { - fmt.Fprintf(c.App.Writer, "Phew!\n") - return nil - } - app.CommandNotFound = func(c *cli.Context, command string) { - fmt.Fprintf(c.App.Writer, "Thar be no %q here.\n", command) - } - app.OnUsageError = func(c *cli.Context, err error, isSubcommand bool) error { - if isSubcommand { - return err - } - - fmt.Fprintf(c.App.Writer, "WRONG: %#v\n", err) - return nil - } - app.Action = func(c *cli.Context) error { - cli.DefaultAppComplete(c) - cli.HandleExitCoder(errors.New("not an exit coder, though")) - cli.ShowAppHelp(c) - cli.ShowCommandCompletions(c, "nope") - cli.ShowCommandHelp(c, "also-nope") - cli.ShowCompletions(c) - cli.ShowSubcommandHelp(c) - cli.ShowVersion(c) - - categories := c.App.Categories() - categories.AddCommand("sounds", cli.Command{ - Name: "bloop", - }) - - for _, category := range c.App.Categories() { - fmt.Fprintf(c.App.Writer, "%s\n", category.Name) - fmt.Fprintf(c.App.Writer, "%#v\n", category.Commands) - fmt.Fprintf(c.App.Writer, "%#v\n", category.VisibleCommands()) - } - - fmt.Printf("%#v\n", c.App.Command("doo")) - if c.Bool("infinite") { - c.App.Run([]string{"app", "doo", "wop"}) - } - - if c.Bool("forevar") { - c.App.RunAsSubcommand(c) - } - c.App.Setup() - fmt.Printf("%#v\n", c.App.VisibleCategories()) - fmt.Printf("%#v\n", c.App.VisibleCommands()) - fmt.Printf("%#v\n", c.App.VisibleFlags()) - - fmt.Printf("%#v\n", c.Args().First()) - if len(c.Args()) > 0 { - fmt.Printf("%#v\n", c.Args()[1]) - } - fmt.Printf("%#v\n", c.Args().Present()) - fmt.Printf("%#v\n", c.Args().Tail()) - - set := flag.NewFlagSet("contrive", 0) - nc := cli.NewContext(c.App, set, c) - - fmt.Printf("%#v\n", nc.Args()) - fmt.Printf("%#v\n", nc.Bool("nope")) - fmt.Printf("%#v\n", nc.BoolT("nerp")) - fmt.Printf("%#v\n", nc.Duration("howlong")) - fmt.Printf("%#v\n", nc.Float64("hay")) - fmt.Printf("%#v\n", nc.Generic("bloop")) - fmt.Printf("%#v\n", nc.Int64("bonk")) - fmt.Printf("%#v\n", nc.Int64Slice("burnks")) - fmt.Printf("%#v\n", nc.Int("bips")) - fmt.Printf("%#v\n", nc.IntSlice("blups")) - fmt.Printf("%#v\n", nc.String("snurt")) - fmt.Printf("%#v\n", nc.StringSlice("snurkles")) - fmt.Printf("%#v\n", nc.Uint("flub")) - fmt.Printf("%#v\n", nc.Uint64("florb")) - fmt.Printf("%#v\n", nc.GlobalBool("global-nope")) - fmt.Printf("%#v\n", nc.GlobalBoolT("global-nerp")) - fmt.Printf("%#v\n", nc.GlobalDuration("global-howlong")) - fmt.Printf("%#v\n", nc.GlobalFloat64("global-hay")) - fmt.Printf("%#v\n", nc.GlobalGeneric("global-bloop")) - fmt.Printf("%#v\n", nc.GlobalInt("global-bips")) - fmt.Printf("%#v\n", nc.GlobalIntSlice("global-blups")) - fmt.Printf("%#v\n", nc.GlobalString("global-snurt")) - fmt.Printf("%#v\n", nc.GlobalStringSlice("global-snurkles")) - - fmt.Printf("%#v\n", nc.FlagNames()) - fmt.Printf("%#v\n", nc.GlobalFlagNames()) - fmt.Printf("%#v\n", nc.GlobalIsSet("wat")) - fmt.Printf("%#v\n", nc.GlobalSet("wat", "nope")) - fmt.Printf("%#v\n", nc.NArg()) - fmt.Printf("%#v\n", nc.NumFlags()) - fmt.Printf("%#v\n", nc.Parent()) - - nc.Set("wat", "also-nope") - - ec := cli.NewExitError("ohwell", 86) - fmt.Fprintf(c.App.Writer, "%d", ec.ExitCode()) - fmt.Printf("made it!\n") - return ec - } - - if os.Getenv("HEXY") != "" { - app.Writer = &hexWriter{} - app.ErrWriter = &hexWriter{} - } - - app.Metadata = map[string]interface{}{ - "layers": "many", - "explicable": false, - "whatever-values": 19.99, - } - - app.Run(os.Args) -} - -func wopAction(c *cli.Context) error { - fmt.Fprintf(c.App.Writer, ":wave: over here, eh\n") - return nil -} -``` - -## Contribution Guidelines - -Feel free to put up a pull request to fix a bug or maybe add a feature. I will -give it a code review and make sure that it does not break backwards -compatibility. If I or any other collaborators agree that it is in line with -the vision of the project, we will work with you to get the code into -a mergeable state and merge it into the master branch. - -If you have contributed something significant to the project, we will most -likely add you as a collaborator. As a collaborator you are given the ability -to merge others pull requests. It is very important that new code does not -break existing code, so be careful about what code you do choose to merge. - -If you feel like you have contributed to the project but have not yet been -added as a collaborator, we probably forgot to add you, please open an issue. diff --git a/vendor/github.com/urfave/cli/app.go b/vendor/github.com/urfave/cli/app.go deleted file mode 100644 index 95ffc0b97..000000000 --- a/vendor/github.com/urfave/cli/app.go +++ /dev/null @@ -1,492 +0,0 @@ -package cli - -import ( - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "sort" - "time" -) - -var ( - changeLogURL = "https://github.com/urfave/cli/blob/master/CHANGELOG.md" - appActionDeprecationURL = fmt.Sprintf("%s#deprecated-cli-app-action-signature", changeLogURL) - runAndExitOnErrorDeprecationURL = fmt.Sprintf("%s#deprecated-cli-app-runandexitonerror", changeLogURL) - - contactSysadmin = "This is an error in the application. Please contact the distributor of this application if this is not you." - - errInvalidActionType = NewExitError("ERROR invalid Action type. "+ - fmt.Sprintf("Must be `func(*Context`)` or `func(*Context) error). %s", contactSysadmin)+ - fmt.Sprintf("See %s", appActionDeprecationURL), 2) -) - -// App is the main structure of a cli application. It is recommended that -// an app be created with the cli.NewApp() function -type App struct { - // The name of the program. Defaults to path.Base(os.Args[0]) - Name string - // Full name of command for help, defaults to Name - HelpName string - // Description of the program. - Usage string - // Text to override the USAGE section of help - UsageText string - // Description of the program argument format. - ArgsUsage string - // Version of the program - Version string - // Description of the program - Description string - // List of commands to execute - Commands []Command - // List of flags to parse - Flags []Flag - // Boolean to enable bash completion commands - EnableBashCompletion bool - // Boolean to hide built-in help command - HideHelp bool - // Boolean to hide built-in version flag and the VERSION section of help - HideVersion bool - // Populate on app startup, only gettable through method Categories() - categories CommandCategories - // An action to execute when the bash-completion flag is set - BashComplete BashCompleteFunc - // An action to execute before any subcommands are run, but after the context is ready - // If a non-nil error is returned, no subcommands are run - Before BeforeFunc - // An action to execute after any subcommands are run, but after the subcommand has finished - // It is run even if Action() panics - After AfterFunc - - // The action to execute when no subcommands are specified - // Expects a `cli.ActionFunc` but will accept the *deprecated* signature of `func(*cli.Context) {}` - // *Note*: support for the deprecated `Action` signature will be removed in a future version - Action interface{} - - // Execute this function if the proper command cannot be found - CommandNotFound CommandNotFoundFunc - // Execute this function if an usage error occurs - OnUsageError OnUsageErrorFunc - // Compilation date - Compiled time.Time - // List of all authors who contributed - Authors []Author - // Copyright of the binary if any - Copyright string - // Name of Author (Note: Use App.Authors, this is deprecated) - Author string - // Email of Author (Note: Use App.Authors, this is deprecated) - Email string - // Writer writer to write output to - Writer io.Writer - // ErrWriter writes error output - ErrWriter io.Writer - // Other custom info - Metadata map[string]interface{} - - didSetup bool -} - -// Tries to find out when this binary was compiled. -// Returns the current time if it fails to find it. -func compileTime() time.Time { - info, err := os.Stat(os.Args[0]) - if err != nil { - return time.Now() - } - return info.ModTime() -} - -// NewApp creates a new cli Application with some reasonable defaults for Name, -// Usage, Version and Action. -func NewApp() *App { - return &App{ - Name: filepath.Base(os.Args[0]), - HelpName: filepath.Base(os.Args[0]), - Usage: "A new cli application", - UsageText: "", - Version: "0.0.0", - BashComplete: DefaultAppComplete, - Action: helpCommand.Action, - Compiled: compileTime(), - Writer: os.Stdout, - } -} - -// Setup runs initialization code to ensure all data structures are ready for -// `Run` or inspection prior to `Run`. It is internally called by `Run`, but -// will return early if setup has already happened. -func (a *App) Setup() { - if a.didSetup { - return - } - - a.didSetup = true - - if a.Author != "" || a.Email != "" { - a.Authors = append(a.Authors, Author{Name: a.Author, Email: a.Email}) - } - - newCmds := []Command{} - for _, c := range a.Commands { - if c.HelpName == "" { - c.HelpName = fmt.Sprintf("%s %s", a.HelpName, c.Name) - } - newCmds = append(newCmds, c) - } - a.Commands = newCmds - - if a.Command(helpCommand.Name) == nil && !a.HideHelp { - a.Commands = append(a.Commands, helpCommand) - if (HelpFlag != BoolFlag{}) { - a.appendFlag(HelpFlag) - } - } - - if !a.HideVersion { - a.appendFlag(VersionFlag) - } - - a.categories = CommandCategories{} - for _, command := range a.Commands { - a.categories = a.categories.AddCommand(command.Category, command) - } - sort.Sort(a.categories) - - if a.Metadata == nil { - a.Metadata = make(map[string]interface{}) - } - - if a.Writer == nil { - a.Writer = os.Stdout - } -} - -// Run is the entry point to the cli app. Parses the arguments slice and routes -// to the proper flag/args combination -func (a *App) Run(arguments []string) (err error) { - a.Setup() - - // handle the completion flag separately from the flagset since - // completion could be attempted after a flag, but before its value was put - // on the command line. this causes the flagset to interpret the completion - // flag name as the value of the flag before it which is undesirable - // note that we can only do this because the shell autocomplete function - // always appends the completion flag at the end of the command - shellComplete, arguments := checkShellCompleteFlag(a, arguments) - - // parse flags - set, err := flagSet(a.Name, a.Flags) - if err != nil { - return err - } - - set.SetOutput(ioutil.Discard) - err = set.Parse(arguments[1:]) - nerr := normalizeFlags(a.Flags, set) - context := NewContext(a, set, nil) - if nerr != nil { - fmt.Fprintln(a.Writer, nerr) - ShowAppHelp(context) - return nerr - } - context.shellComplete = shellComplete - - if checkCompletions(context) { - return nil - } - - if err != nil { - if a.OnUsageError != nil { - err := a.OnUsageError(context, err, false) - HandleExitCoder(err) - return err - } - fmt.Fprintf(a.Writer, "%s %s\n\n", "Incorrect Usage.", err.Error()) - ShowAppHelp(context) - return err - } - - if !a.HideHelp && checkHelp(context) { - ShowAppHelp(context) - return nil - } - - if !a.HideVersion && checkVersion(context) { - ShowVersion(context) - return nil - } - - if a.After != nil { - defer func() { - if afterErr := a.After(context); afterErr != nil { - if err != nil { - err = NewMultiError(err, afterErr) - } else { - err = afterErr - } - } - }() - } - - if a.Before != nil { - beforeErr := a.Before(context) - if beforeErr != nil { - fmt.Fprintf(a.Writer, "%v\n\n", beforeErr) - ShowAppHelp(context) - HandleExitCoder(beforeErr) - err = beforeErr - return err - } - } - - args := context.Args() - if args.Present() { - name := args.First() - c := a.Command(name) - if c != nil { - return c.Run(context) - } - } - - if a.Action == nil { - a.Action = helpCommand.Action - } - - // Run default Action - err = HandleAction(a.Action, context) - - HandleExitCoder(err) - return err -} - -// RunAndExitOnError calls .Run() and exits non-zero if an error was returned -// -// Deprecated: instead you should return an error that fulfills cli.ExitCoder -// to cli.App.Run. This will cause the application to exit with the given eror -// code in the cli.ExitCoder -func (a *App) RunAndExitOnError() { - if err := a.Run(os.Args); err != nil { - fmt.Fprintln(a.errWriter(), err) - OsExiter(1) - } -} - -// RunAsSubcommand invokes the subcommand given the context, parses ctx.Args() to -// generate command-specific flags -func (a *App) RunAsSubcommand(ctx *Context) (err error) { - // append help to commands - if len(a.Commands) > 0 { - if a.Command(helpCommand.Name) == nil && !a.HideHelp { - a.Commands = append(a.Commands, helpCommand) - if (HelpFlag != BoolFlag{}) { - a.appendFlag(HelpFlag) - } - } - } - - newCmds := []Command{} - for _, c := range a.Commands { - if c.HelpName == "" { - c.HelpName = fmt.Sprintf("%s %s", a.HelpName, c.Name) - } - newCmds = append(newCmds, c) - } - a.Commands = newCmds - - // parse flags - set, err := flagSet(a.Name, a.Flags) - if err != nil { - return err - } - - set.SetOutput(ioutil.Discard) - err = set.Parse(ctx.Args().Tail()) - nerr := normalizeFlags(a.Flags, set) - context := NewContext(a, set, ctx) - - if nerr != nil { - fmt.Fprintln(a.Writer, nerr) - fmt.Fprintln(a.Writer) - if len(a.Commands) > 0 { - ShowSubcommandHelp(context) - } else { - ShowCommandHelp(ctx, context.Args().First()) - } - return nerr - } - - if checkCompletions(context) { - return nil - } - - if err != nil { - if a.OnUsageError != nil { - err = a.OnUsageError(context, err, true) - HandleExitCoder(err) - return err - } - fmt.Fprintf(a.Writer, "%s %s\n\n", "Incorrect Usage.", err.Error()) - ShowSubcommandHelp(context) - return err - } - - if len(a.Commands) > 0 { - if checkSubcommandHelp(context) { - return nil - } - } else { - if checkCommandHelp(ctx, context.Args().First()) { - return nil - } - } - - if a.After != nil { - defer func() { - afterErr := a.After(context) - if afterErr != nil { - HandleExitCoder(err) - if err != nil { - err = NewMultiError(err, afterErr) - } else { - err = afterErr - } - } - }() - } - - if a.Before != nil { - beforeErr := a.Before(context) - if beforeErr != nil { - HandleExitCoder(beforeErr) - err = beforeErr - return err - } - } - - args := context.Args() - if args.Present() { - name := args.First() - c := a.Command(name) - if c != nil { - return c.Run(context) - } - } - - // Run default Action - err = HandleAction(a.Action, context) - - HandleExitCoder(err) - return err -} - -// Command returns the named command on App. Returns nil if the command does not exist -func (a *App) Command(name string) *Command { - for _, c := range a.Commands { - if c.HasName(name) { - return &c - } - } - - return nil -} - -// Categories returns a slice containing all the categories with the commands they contain -func (a *App) Categories() CommandCategories { - return a.categories -} - -// VisibleCategories returns a slice of categories and commands that are -// Hidden=false -func (a *App) VisibleCategories() []*CommandCategory { - ret := []*CommandCategory{} - for _, category := range a.categories { - if visible := func() *CommandCategory { - for _, command := range category.Commands { - if !command.Hidden { - return category - } - } - return nil - }(); visible != nil { - ret = append(ret, visible) - } - } - return ret -} - -// VisibleCommands returns a slice of the Commands with Hidden=false -func (a *App) VisibleCommands() []Command { - ret := []Command{} - for _, command := range a.Commands { - if !command.Hidden { - ret = append(ret, command) - } - } - return ret -} - -// VisibleFlags returns a slice of the Flags with Hidden=false -func (a *App) VisibleFlags() []Flag { - return visibleFlags(a.Flags) -} - -func (a *App) hasFlag(flag Flag) bool { - for _, f := range a.Flags { - if flag == f { - return true - } - } - - return false -} - -func (a *App) errWriter() io.Writer { - - // When the app ErrWriter is nil use the package level one. - if a.ErrWriter == nil { - return ErrWriter - } - - return a.ErrWriter -} - -func (a *App) appendFlag(flag Flag) { - if !a.hasFlag(flag) { - a.Flags = append(a.Flags, flag) - } -} - -// Author represents someone who has contributed to a cli project. -type Author struct { - Name string // The Authors name - Email string // The Authors email -} - -// String makes Author comply to the Stringer interface, to allow an easy print in the templating process -func (a Author) String() string { - e := "" - if a.Email != "" { - e = " <" + a.Email + ">" - } - - return fmt.Sprintf("%v%v", a.Name, e) -} - -// HandleAction attempts to figure out which Action signature was used. If -// it's an ActionFunc or a func with the legacy signature for Action, the func -// is run! -func HandleAction(action interface{}, context *Context) (err error) { - if a, ok := action.(ActionFunc); ok { - return a(context) - } else if a, ok := action.(func(*Context) error); ok { - return a(context) - } else if a, ok := action.(func(*Context)); ok { // deprecated function signature - a(context) - return nil - } else { - return errInvalidActionType - } -} diff --git a/vendor/github.com/urfave/cli/appveyor.yml b/vendor/github.com/urfave/cli/appveyor.yml deleted file mode 100644 index 698b188e1..000000000 --- a/vendor/github.com/urfave/cli/appveyor.yml +++ /dev/null @@ -1,24 +0,0 @@ -version: "{build}" - -os: Windows Server 2012 R2 - -clone_folder: c:\gopath\src\github.com\urfave\cli - -environment: - GOPATH: C:\gopath - GOVERSION: 1.6 - PYTHON: C:\Python27-x64 - PYTHON_VERSION: 2.7.x - PYTHON_ARCH: 64 - -install: -- set PATH=%GOPATH%\bin;C:\go\bin;%PATH% -- go version -- go env -- go get github.com/urfave/gfmrun/... -- go get -v -t ./... - -build_script: -- python runtests vet -- python runtests test -- python runtests gfmrun diff --git a/vendor/github.com/urfave/cli/category.go b/vendor/github.com/urfave/cli/category.go deleted file mode 100644 index 1a6055023..000000000 --- a/vendor/github.com/urfave/cli/category.go +++ /dev/null @@ -1,44 +0,0 @@ -package cli - -// CommandCategories is a slice of *CommandCategory. -type CommandCategories []*CommandCategory - -// CommandCategory is a category containing commands. -type CommandCategory struct { - Name string - Commands Commands -} - -func (c CommandCategories) Less(i, j int) bool { - return c[i].Name < c[j].Name -} - -func (c CommandCategories) Len() int { - return len(c) -} - -func (c CommandCategories) Swap(i, j int) { - c[i], c[j] = c[j], c[i] -} - -// AddCommand adds a command to a category. -func (c CommandCategories) AddCommand(category string, command Command) CommandCategories { - for _, commandCategory := range c { - if commandCategory.Name == category { - commandCategory.Commands = append(commandCategory.Commands, command) - return c - } - } - return append(c, &CommandCategory{Name: category, Commands: []Command{command}}) -} - -// VisibleCommands returns a slice of the Commands with Hidden=false -func (c *CommandCategory) VisibleCommands() []Command { - ret := []Command{} - for _, command := range c.Commands { - if !command.Hidden { - ret = append(ret, command) - } - } - return ret -} diff --git a/vendor/github.com/urfave/cli/cli.go b/vendor/github.com/urfave/cli/cli.go deleted file mode 100644 index 74fd101f4..000000000 --- a/vendor/github.com/urfave/cli/cli.go +++ /dev/null @@ -1,21 +0,0 @@ -// Package cli provides a minimal framework for creating and organizing command line -// Go applications. cli is designed to be easy to understand and write, the most simple -// cli application can be written as follows: -// func main() { -// cli.NewApp().Run(os.Args) -// } -// -// Of course this application does not do much, so let's make this an actual application: -// func main() { -// app := cli.NewApp() -// app.Name = "greet" -// app.Usage = "say a greeting" -// app.Action = func(c *cli.Context) error { -// println("Greetings") -// } -// -// app.Run(os.Args) -// } -package cli - -//go:generate python ./generate-flag-types cli -i flag-types.json -o flag_generated.go diff --git a/vendor/github.com/urfave/cli/command.go b/vendor/github.com/urfave/cli/command.go deleted file mode 100644 index 40ebdb64f..000000000 --- a/vendor/github.com/urfave/cli/command.go +++ /dev/null @@ -1,299 +0,0 @@ -package cli - -import ( - "fmt" - "io/ioutil" - "sort" - "strings" -) - -// Command is a subcommand for a cli.App. -type Command struct { - // The name of the command - Name string - // short name of the command. Typically one character (deprecated, use `Aliases`) - ShortName string - // A list of aliases for the command - Aliases []string - // A short description of the usage of this command - Usage string - // Custom text to show on USAGE section of help - UsageText string - // A longer explanation of how the command works - Description string - // A short description of the arguments of this command - ArgsUsage string - // The category the command is part of - Category string - // The function to call when checking for bash command completions - BashComplete BashCompleteFunc - // An action to execute before any sub-subcommands are run, but after the context is ready - // If a non-nil error is returned, no sub-subcommands are run - Before BeforeFunc - // An action to execute after any subcommands are run, but after the subcommand has finished - // It is run even if Action() panics - After AfterFunc - // The function to call when this command is invoked - Action interface{} - // TODO: replace `Action: interface{}` with `Action: ActionFunc` once some kind - // of deprecation period has passed, maybe? - - // Execute this function if a usage error occurs. - OnUsageError OnUsageErrorFunc - // List of child commands - Subcommands Commands - // List of flags to parse - Flags []Flag - // Treat all flags as normal arguments if true - SkipFlagParsing bool - // Skip argument reordering which attempts to move flags before arguments, - // but only works if all flags appear after all arguments. This behavior was - // removed n version 2 since it only works under specific conditions so we - // backport here by exposing it as an option for compatibility. - SkipArgReorder bool - // Boolean to hide built-in help command - HideHelp bool - // Boolean to hide this command from help or completion - Hidden bool - - // Full name of command for help, defaults to full command name, including parent commands. - HelpName string - commandNamePath []string -} - -type CommandsByName []Command - -func (c CommandsByName) Len() int { - return len(c) -} - -func (c CommandsByName) Less(i, j int) bool { - return c[i].Name < c[j].Name -} - -func (c CommandsByName) Swap(i, j int) { - c[i], c[j] = c[j], c[i] -} - -// FullName returns the full name of the command. -// For subcommands this ensures that parent commands are part of the command path -func (c Command) FullName() string { - if c.commandNamePath == nil { - return c.Name - } - return strings.Join(c.commandNamePath, " ") -} - -// Commands is a slice of Command -type Commands []Command - -// Run invokes the command given the context, parses ctx.Args() to generate command-specific flags -func (c Command) Run(ctx *Context) (err error) { - if len(c.Subcommands) > 0 { - return c.startApp(ctx) - } - - if !c.HideHelp && (HelpFlag != BoolFlag{}) { - // append help to flags - c.Flags = append( - c.Flags, - HelpFlag, - ) - } - - set, err := flagSet(c.Name, c.Flags) - if err != nil { - return err - } - set.SetOutput(ioutil.Discard) - - if c.SkipFlagParsing { - err = set.Parse(append([]string{"--"}, ctx.Args().Tail()...)) - } else if !c.SkipArgReorder { - firstFlagIndex := -1 - terminatorIndex := -1 - for index, arg := range ctx.Args() { - if arg == "--" { - terminatorIndex = index - break - } else if arg == "-" { - // Do nothing. A dash alone is not really a flag. - continue - } else if strings.HasPrefix(arg, "-") && firstFlagIndex == -1 { - firstFlagIndex = index - } - } - - if firstFlagIndex > -1 { - args := ctx.Args() - regularArgs := make([]string, len(args[1:firstFlagIndex])) - copy(regularArgs, args[1:firstFlagIndex]) - - var flagArgs []string - if terminatorIndex > -1 { - flagArgs = args[firstFlagIndex:terminatorIndex] - regularArgs = append(regularArgs, args[terminatorIndex:]...) - } else { - flagArgs = args[firstFlagIndex:] - } - - err = set.Parse(append(flagArgs, regularArgs...)) - } else { - err = set.Parse(ctx.Args().Tail()) - } - } else { - err = set.Parse(ctx.Args().Tail()) - } - - nerr := normalizeFlags(c.Flags, set) - if nerr != nil { - fmt.Fprintln(ctx.App.Writer, nerr) - fmt.Fprintln(ctx.App.Writer) - ShowCommandHelp(ctx, c.Name) - return nerr - } - - context := NewContext(ctx.App, set, ctx) - if checkCommandCompletions(context, c.Name) { - return nil - } - - if err != nil { - if c.OnUsageError != nil { - err := c.OnUsageError(ctx, err, false) - HandleExitCoder(err) - return err - } - fmt.Fprintln(ctx.App.Writer, "Incorrect Usage:", err.Error()) - fmt.Fprintln(ctx.App.Writer) - ShowCommandHelp(ctx, c.Name) - return err - } - - if checkCommandHelp(context, c.Name) { - return nil - } - - if c.After != nil { - defer func() { - afterErr := c.After(context) - if afterErr != nil { - HandleExitCoder(err) - if err != nil { - err = NewMultiError(err, afterErr) - } else { - err = afterErr - } - } - }() - } - - if c.Before != nil { - err = c.Before(context) - if err != nil { - fmt.Fprintln(ctx.App.Writer, err) - fmt.Fprintln(ctx.App.Writer) - ShowCommandHelp(ctx, c.Name) - HandleExitCoder(err) - return err - } - } - - if c.Action == nil { - c.Action = helpSubcommand.Action - } - - context.Command = c - err = HandleAction(c.Action, context) - - if err != nil { - HandleExitCoder(err) - } - return err -} - -// Names returns the names including short names and aliases. -func (c Command) Names() []string { - names := []string{c.Name} - - if c.ShortName != "" { - names = append(names, c.ShortName) - } - - return append(names, c.Aliases...) -} - -// HasName returns true if Command.Name or Command.ShortName matches given name -func (c Command) HasName(name string) bool { - for _, n := range c.Names() { - if n == name { - return true - } - } - return false -} - -func (c Command) startApp(ctx *Context) error { - app := NewApp() - app.Metadata = ctx.App.Metadata - // set the name and usage - app.Name = fmt.Sprintf("%s %s", ctx.App.Name, c.Name) - if c.HelpName == "" { - app.HelpName = c.HelpName - } else { - app.HelpName = app.Name - } - - app.Usage = c.Usage - app.Description = c.Description - app.ArgsUsage = c.ArgsUsage - - // set CommandNotFound - app.CommandNotFound = ctx.App.CommandNotFound - - // set the flags and commands - app.Commands = c.Subcommands - app.Flags = c.Flags - app.HideHelp = c.HideHelp - - app.Version = ctx.App.Version - app.HideVersion = ctx.App.HideVersion - app.Compiled = ctx.App.Compiled - app.Author = ctx.App.Author - app.Email = ctx.App.Email - app.Writer = ctx.App.Writer - app.ErrWriter = ctx.App.ErrWriter - - app.categories = CommandCategories{} - for _, command := range c.Subcommands { - app.categories = app.categories.AddCommand(command.Category, command) - } - - sort.Sort(app.categories) - - // bash completion - app.EnableBashCompletion = ctx.App.EnableBashCompletion - if c.BashComplete != nil { - app.BashComplete = c.BashComplete - } - - // set the actions - app.Before = c.Before - app.After = c.After - if c.Action != nil { - app.Action = c.Action - } else { - app.Action = helpSubcommand.Action - } - - for index, cc := range app.Commands { - app.Commands[index].commandNamePath = []string{c.Name, cc.Name} - } - - return app.RunAsSubcommand(ctx) -} - -// VisibleFlags returns a slice of the Flags with Hidden=false -func (c Command) VisibleFlags() []Flag { - return visibleFlags(c.Flags) -} diff --git a/vendor/github.com/urfave/cli/context.go b/vendor/github.com/urfave/cli/context.go deleted file mode 100644 index cb89e92a0..000000000 --- a/vendor/github.com/urfave/cli/context.go +++ /dev/null @@ -1,276 +0,0 @@ -package cli - -import ( - "errors" - "flag" - "reflect" - "strings" - "syscall" -) - -// Context is a type that is passed through to -// each Handler action in a cli application. Context -// can be used to retrieve context-specific Args and -// parsed command-line options. -type Context struct { - App *App - Command Command - shellComplete bool - flagSet *flag.FlagSet - setFlags map[string]bool - parentContext *Context -} - -// NewContext creates a new context. For use in when invoking an App or Command action. -func NewContext(app *App, set *flag.FlagSet, parentCtx *Context) *Context { - c := &Context{App: app, flagSet: set, parentContext: parentCtx} - - if parentCtx != nil { - c.shellComplete = parentCtx.shellComplete - } - - return c -} - -// NumFlags returns the number of flags set -func (c *Context) NumFlags() int { - return c.flagSet.NFlag() -} - -// Set sets a context flag to a value. -func (c *Context) Set(name, value string) error { - return c.flagSet.Set(name, value) -} - -// GlobalSet sets a context flag to a value on the global flagset -func (c *Context) GlobalSet(name, value string) error { - return globalContext(c).flagSet.Set(name, value) -} - -// IsSet determines if the flag was actually set -func (c *Context) IsSet(name string) bool { - if c.setFlags == nil { - c.setFlags = make(map[string]bool) - - c.flagSet.Visit(func(f *flag.Flag) { - c.setFlags[f.Name] = true - }) - - c.flagSet.VisitAll(func(f *flag.Flag) { - if _, ok := c.setFlags[f.Name]; ok { - return - } - c.setFlags[f.Name] = false - }) - - // XXX hack to support IsSet for flags with EnvVar - // - // There isn't an easy way to do this with the current implementation since - // whether a flag was set via an environment variable is very difficult to - // determine here. Instead, we intend to introduce a backwards incompatible - // change in version 2 to add `IsSet` to the Flag interface to push the - // responsibility closer to where the information required to determine - // whether a flag is set by non-standard means such as environment - // variables is avaliable. - // - // See https://github.com/urfave/cli/issues/294 for additional discussion - flags := c.Command.Flags - if c.Command.Name == "" { // cannot == Command{} since it contains slice types - if c.App != nil { - flags = c.App.Flags - } - } - for _, f := range flags { - eachName(f.GetName(), func(name string) { - if isSet, ok := c.setFlags[name]; isSet || !ok { - return - } - - val := reflect.ValueOf(f) - if val.Kind() == reflect.Ptr { - val = val.Elem() - } - - envVarValue := val.FieldByName("EnvVar") - if !envVarValue.IsValid() { - return - } - - eachName(envVarValue.String(), func(envVar string) { - envVar = strings.TrimSpace(envVar) - if _, ok := syscall.Getenv(envVar); ok { - c.setFlags[name] = true - return - } - }) - }) - } - } - - return c.setFlags[name] -} - -// GlobalIsSet determines if the global flag was actually set -func (c *Context) GlobalIsSet(name string) bool { - ctx := c - if ctx.parentContext != nil { - ctx = ctx.parentContext - } - - for ; ctx != nil; ctx = ctx.parentContext { - if ctx.IsSet(name) { - return true - } - } - return false -} - -// FlagNames returns a slice of flag names used in this context. -func (c *Context) FlagNames() (names []string) { - for _, flag := range c.Command.Flags { - name := strings.Split(flag.GetName(), ",")[0] - if name == "help" { - continue - } - names = append(names, name) - } - return -} - -// GlobalFlagNames returns a slice of global flag names used by the app. -func (c *Context) GlobalFlagNames() (names []string) { - for _, flag := range c.App.Flags { - name := strings.Split(flag.GetName(), ",")[0] - if name == "help" || name == "version" { - continue - } - names = append(names, name) - } - return -} - -// Parent returns the parent context, if any -func (c *Context) Parent() *Context { - return c.parentContext -} - -// value returns the value of the flag coressponding to `name` -func (c *Context) value(name string) interface{} { - return c.flagSet.Lookup(name).Value.(flag.Getter).Get() -} - -// Args contains apps console arguments -type Args []string - -// Args returns the command line arguments associated with the context. -func (c *Context) Args() Args { - args := Args(c.flagSet.Args()) - return args -} - -// NArg returns the number of the command line arguments. -func (c *Context) NArg() int { - return len(c.Args()) -} - -// Get returns the nth argument, or else a blank string -func (a Args) Get(n int) string { - if len(a) > n { - return a[n] - } - return "" -} - -// First returns the first argument, or else a blank string -func (a Args) First() string { - return a.Get(0) -} - -// Tail returns the rest of the arguments (not the first one) -// or else an empty string slice -func (a Args) Tail() []string { - if len(a) >= 2 { - return []string(a)[1:] - } - return []string{} -} - -// Present checks if there are any arguments present -func (a Args) Present() bool { - return len(a) != 0 -} - -// Swap swaps arguments at the given indexes -func (a Args) Swap(from, to int) error { - if from >= len(a) || to >= len(a) { - return errors.New("index out of range") - } - a[from], a[to] = a[to], a[from] - return nil -} - -func globalContext(ctx *Context) *Context { - if ctx == nil { - return nil - } - - for { - if ctx.parentContext == nil { - return ctx - } - ctx = ctx.parentContext - } -} - -func lookupGlobalFlagSet(name string, ctx *Context) *flag.FlagSet { - if ctx.parentContext != nil { - ctx = ctx.parentContext - } - for ; ctx != nil; ctx = ctx.parentContext { - if f := ctx.flagSet.Lookup(name); f != nil { - return ctx.flagSet - } - } - return nil -} - -func copyFlag(name string, ff *flag.Flag, set *flag.FlagSet) { - switch ff.Value.(type) { - case *StringSlice: - default: - set.Set(name, ff.Value.String()) - } -} - -func normalizeFlags(flags []Flag, set *flag.FlagSet) error { - visited := make(map[string]bool) - set.Visit(func(f *flag.Flag) { - visited[f.Name] = true - }) - for _, f := range flags { - parts := strings.Split(f.GetName(), ",") - if len(parts) == 1 { - continue - } - var ff *flag.Flag - for _, name := range parts { - name = strings.Trim(name, " ") - if visited[name] { - if ff != nil { - return errors.New("Cannot use two forms of the same flag: " + name + " " + ff.Name) - } - ff = set.Lookup(name) - } - } - if ff == nil { - continue - } - for _, name := range parts { - name = strings.Trim(name, " ") - if !visited[name] { - copyFlag(name, ff, set) - } - } - } - return nil -} diff --git a/vendor/github.com/urfave/cli/errors.go b/vendor/github.com/urfave/cli/errors.go deleted file mode 100644 index f9d648e61..000000000 --- a/vendor/github.com/urfave/cli/errors.go +++ /dev/null @@ -1,124 +0,0 @@ -package cli - -import ( - "fmt" - "io" - "os" - "strings" -) - -// OsExiter is the function used when the app exits. If not set defaults to os.Exit. -var OsExiter = os.Exit - -// ErrWriter is used to write errors to the user. This can be anything -// implementing the io.Writer interface and defaults to os.Stderr. -var ErrWriter io.Writer = os.Stderr - -// MultiError is an error that wraps multiple errors. -type MultiError struct { - Errors []error -} - -// NewMultiError creates a new MultiError. Pass in one or more errors. -func NewMultiError(err ...error) MultiError { - return MultiError{Errors: err} -} - -// Error implements the error interface. -func (m MultiError) Error() string { - errs := make([]string, len(m.Errors)) - for i, err := range m.Errors { - errs[i] = err.Error() - } - - return strings.Join(errs, "\n") -} - -type ErrorFormatter interface { - Format(s fmt.State, verb rune) -} - -// ExitCoder is the interface checked by `App` and `Command` for a custom exit -// code -type ExitCoder interface { - error - ExitCode() int -} - -// ExitError fulfills both the builtin `error` interface and `ExitCoder` -type ExitError struct { - exitCode int - message interface{} -} - -// NewExitError makes a new *ExitError -func NewExitError(message interface{}, exitCode int) *ExitError { - return &ExitError{ - exitCode: exitCode, - message: message, - } -} - -// Error returns the string message, fulfilling the interface required by -// `error` -func (ee *ExitError) Error() string { - return fmt.Sprintf("%v", ee.message) -} - -// ExitCode returns the exit code, fulfilling the interface required by -// `ExitCoder` -func (ee *ExitError) ExitCode() int { - return ee.exitCode -} - -// HandleExitCoder checks if the error fulfills the ExitCoder interface, and if -// so prints the error to stderr (if it is non-empty) and calls OsExiter with the -// given exit code. If the given error is a MultiError, then this func is -// called on all members of the Errors slice and calls OsExiter with the last exit code. -func HandleExitCoder(err error) { - if err == nil { - return - } - - if exitErr, ok := err.(ExitCoder); ok { - if err.Error() != "" { - if _, ok := exitErr.(ErrorFormatter); ok { - fmt.Fprintf(ErrWriter, "%+v\n", err) - } else { - fmt.Fprintln(ErrWriter, err) - } - } - OsExiter(exitErr.ExitCode()) - return - } - - if multiErr, ok := err.(MultiError); ok { - code := handleMultiError(multiErr) - OsExiter(code) - return - } - - if err.Error() != "" { - if _, ok := err.(ErrorFormatter); ok { - fmt.Fprintf(ErrWriter, "%+v\n", err) - } else { - fmt.Fprintln(ErrWriter, err) - } - } - OsExiter(1) -} - -func handleMultiError(multiErr MultiError) int { - code := 1 - for _, merr := range multiErr.Errors { - if multiErr2, ok := merr.(MultiError); ok { - code = handleMultiError(multiErr2) - } else { - fmt.Fprintln(ErrWriter, merr) - if exitErr, ok := merr.(ExitCoder); ok { - code = exitErr.ExitCode() - } - } - } - return code -} diff --git a/vendor/github.com/urfave/cli/flag-types.json b/vendor/github.com/urfave/cli/flag-types.json deleted file mode 100644 index 122310785..000000000 --- a/vendor/github.com/urfave/cli/flag-types.json +++ /dev/null @@ -1,93 +0,0 @@ -[ - { - "name": "Bool", - "type": "bool", - "value": false, - "context_default": "false", - "parser": "strconv.ParseBool(f.Value.String())" - }, - { - "name": "BoolT", - "type": "bool", - "value": false, - "doctail": " that is true by default", - "context_default": "false", - "parser": "strconv.ParseBool(f.Value.String())" - }, - { - "name": "Duration", - "type": "time.Duration", - "doctail": " (see https://golang.org/pkg/time/#ParseDuration)", - "context_default": "0", - "parser": "time.ParseDuration(f.Value.String())" - }, - { - "name": "Float64", - "type": "float64", - "context_default": "0", - "parser": "strconv.ParseFloat(f.Value.String(), 64)" - }, - { - "name": "Generic", - "type": "Generic", - "dest": false, - "context_default": "nil", - "context_type": "interface{}" - }, - { - "name": "Int64", - "type": "int64", - "context_default": "0", - "parser": "strconv.ParseInt(f.Value.String(), 0, 64)" - }, - { - "name": "Int", - "type": "int", - "context_default": "0", - "parser": "strconv.ParseInt(f.Value.String(), 0, 64)", - "parser_cast": "int(parsed)" - }, - { - "name": "IntSlice", - "type": "*IntSlice", - "dest": false, - "context_default": "nil", - "context_type": "[]int", - "parser": "(f.Value.(*IntSlice)).Value(), error(nil)" - }, - { - "name": "Int64Slice", - "type": "*Int64Slice", - "dest": false, - "context_default": "nil", - "context_type": "[]int64", - "parser": "(f.Value.(*Int64Slice)).Value(), error(nil)" - }, - { - "name": "String", - "type": "string", - "context_default": "\"\"", - "parser": "f.Value.String(), error(nil)" - }, - { - "name": "StringSlice", - "type": "*StringSlice", - "dest": false, - "context_default": "nil", - "context_type": "[]string", - "parser": "(f.Value.(*StringSlice)).Value(), error(nil)" - }, - { - "name": "Uint64", - "type": "uint64", - "context_default": "0", - "parser": "strconv.ParseUint(f.Value.String(), 0, 64)" - }, - { - "name": "Uint", - "type": "uint", - "context_default": "0", - "parser": "strconv.ParseUint(f.Value.String(), 0, 64)", - "parser_cast": "uint(parsed)" - } -] diff --git a/vendor/github.com/urfave/cli/flag.go b/vendor/github.com/urfave/cli/flag.go deleted file mode 100644 index 7dd8a2c4a..000000000 --- a/vendor/github.com/urfave/cli/flag.go +++ /dev/null @@ -1,799 +0,0 @@ -package cli - -import ( - "flag" - "fmt" - "reflect" - "runtime" - "strconv" - "strings" - "syscall" - "time" -) - -const defaultPlaceholder = "value" - -// BashCompletionFlag enables bash-completion for all commands and subcommands -var BashCompletionFlag = BoolFlag{ - Name: "generate-bash-completion", - Hidden: true, -} - -// VersionFlag prints the version for the application -var VersionFlag = BoolFlag{ - Name: "version, v", - Usage: "print the version", -} - -// HelpFlag prints the help for all commands and subcommands -// Set to the zero value (BoolFlag{}) to disable flag -- keeps subcommand -// unless HideHelp is set to true) -var HelpFlag = BoolFlag{ - Name: "help, h", - Usage: "show help", -} - -// FlagStringer converts a flag definition to a string. This is used by help -// to display a flag. -var FlagStringer FlagStringFunc = stringifyFlag - -// FlagsByName is a slice of Flag. -type FlagsByName []Flag - -func (f FlagsByName) Len() int { - return len(f) -} - -func (f FlagsByName) Less(i, j int) bool { - return f[i].GetName() < f[j].GetName() -} - -func (f FlagsByName) Swap(i, j int) { - f[i], f[j] = f[j], f[i] -} - -// Flag is a common interface related to parsing flags in cli. -// For more advanced flag parsing techniques, it is recommended that -// this interface be implemented. -type Flag interface { - fmt.Stringer - // Apply Flag settings to the given flag set - Apply(*flag.FlagSet) - GetName() string -} - -// errorableFlag is an interface that allows us to return errors during apply -// it allows flags defined in this library to return errors in a fashion backwards compatible -// TODO remove in v2 and modify the existing Flag interface to return errors -type errorableFlag interface { - Flag - - ApplyWithError(*flag.FlagSet) error -} - -func flagSet(name string, flags []Flag) (*flag.FlagSet, error) { - set := flag.NewFlagSet(name, flag.ContinueOnError) - - for _, f := range flags { - //TODO remove in v2 when errorableFlag is removed - if ef, ok := f.(errorableFlag); ok { - if err := ef.ApplyWithError(set); err != nil { - return nil, err - } - } else { - f.Apply(set) - } - } - return set, nil -} - -func eachName(longName string, fn func(string)) { - parts := strings.Split(longName, ",") - for _, name := range parts { - name = strings.Trim(name, " ") - fn(name) - } -} - -// Generic is a generic parseable type identified by a specific flag -type Generic interface { - Set(value string) error - String() string -} - -// Apply takes the flagset and calls Set on the generic flag with the value -// provided by the user for parsing by the flag -// Ignores parsing errors -func (f GenericFlag) Apply(set *flag.FlagSet) { - f.ApplyWithError(set) -} - -// ApplyWithError takes the flagset and calls Set on the generic flag with the value -// provided by the user for parsing by the flag -func (f GenericFlag) ApplyWithError(set *flag.FlagSet) error { - val := f.Value - if f.EnvVar != "" { - for _, envVar := range strings.Split(f.EnvVar, ",") { - envVar = strings.TrimSpace(envVar) - if envVal, ok := syscall.Getenv(envVar); ok { - if err := val.Set(envVal); err != nil { - return fmt.Errorf("could not parse %s as value for flag %s: %s", envVal, f.Name, err) - } - break - } - } - } - - eachName(f.Name, func(name string) { - set.Var(f.Value, name, f.Usage) - }) - - return nil -} - -// StringSlice is an opaque type for []string to satisfy flag.Value and flag.Getter -type StringSlice []string - -// Set appends the string value to the list of values -func (f *StringSlice) Set(value string) error { - *f = append(*f, value) - return nil -} - -// String returns a readable representation of this value (for usage defaults) -func (f *StringSlice) String() string { - return fmt.Sprintf("%s", *f) -} - -// Value returns the slice of strings set by this flag -func (f *StringSlice) Value() []string { - return *f -} - -// Get returns the slice of strings set by this flag -func (f *StringSlice) Get() interface{} { - return *f -} - -// Apply populates the flag given the flag set and environment -// Ignores errors -func (f StringSliceFlag) Apply(set *flag.FlagSet) { - f.ApplyWithError(set) -} - -// ApplyWithError populates the flag given the flag set and environment -func (f StringSliceFlag) ApplyWithError(set *flag.FlagSet) error { - if f.EnvVar != "" { - for _, envVar := range strings.Split(f.EnvVar, ",") { - envVar = strings.TrimSpace(envVar) - if envVal, ok := syscall.Getenv(envVar); ok { - newVal := &StringSlice{} - for _, s := range strings.Split(envVal, ",") { - s = strings.TrimSpace(s) - if err := newVal.Set(s); err != nil { - return fmt.Errorf("could not parse %s as string value for flag %s: %s", envVal, f.Name, err) - } - } - f.Value = newVal - break - } - } - } - - eachName(f.Name, func(name string) { - if f.Value == nil { - f.Value = &StringSlice{} - } - set.Var(f.Value, name, f.Usage) - }) - - return nil -} - -// IntSlice is an opaque type for []int to satisfy flag.Value and flag.Getter -type IntSlice []int - -// Set parses the value into an integer and appends it to the list of values -func (f *IntSlice) Set(value string) error { - tmp, err := strconv.Atoi(value) - if err != nil { - return err - } - *f = append(*f, tmp) - return nil -} - -// String returns a readable representation of this value (for usage defaults) -func (f *IntSlice) String() string { - return fmt.Sprintf("%#v", *f) -} - -// Value returns the slice of ints set by this flag -func (f *IntSlice) Value() []int { - return *f -} - -// Get returns the slice of ints set by this flag -func (f *IntSlice) Get() interface{} { - return *f -} - -// Apply populates the flag given the flag set and environment -// Ignores errors -func (f IntSliceFlag) Apply(set *flag.FlagSet) { - f.ApplyWithError(set) -} - -// ApplyWithError populates the flag given the flag set and environment -func (f IntSliceFlag) ApplyWithError(set *flag.FlagSet) error { - if f.EnvVar != "" { - for _, envVar := range strings.Split(f.EnvVar, ",") { - envVar = strings.TrimSpace(envVar) - if envVal, ok := syscall.Getenv(envVar); ok { - newVal := &IntSlice{} - for _, s := range strings.Split(envVal, ",") { - s = strings.TrimSpace(s) - if err := newVal.Set(s); err != nil { - return fmt.Errorf("could not parse %s as int slice value for flag %s: %s", envVal, f.Name, err) - } - } - f.Value = newVal - break - } - } - } - - eachName(f.Name, func(name string) { - if f.Value == nil { - f.Value = &IntSlice{} - } - set.Var(f.Value, name, f.Usage) - }) - - return nil -} - -// Int64Slice is an opaque type for []int to satisfy flag.Value and flag.Getter -type Int64Slice []int64 - -// Set parses the value into an integer and appends it to the list of values -func (f *Int64Slice) Set(value string) error { - tmp, err := strconv.ParseInt(value, 10, 64) - if err != nil { - return err - } - *f = append(*f, tmp) - return nil -} - -// String returns a readable representation of this value (for usage defaults) -func (f *Int64Slice) String() string { - return fmt.Sprintf("%#v", *f) -} - -// Value returns the slice of ints set by this flag -func (f *Int64Slice) Value() []int64 { - return *f -} - -// Get returns the slice of ints set by this flag -func (f *Int64Slice) Get() interface{} { - return *f -} - -// Apply populates the flag given the flag set and environment -// Ignores errors -func (f Int64SliceFlag) Apply(set *flag.FlagSet) { - f.ApplyWithError(set) -} - -// ApplyWithError populates the flag given the flag set and environment -func (f Int64SliceFlag) ApplyWithError(set *flag.FlagSet) error { - if f.EnvVar != "" { - for _, envVar := range strings.Split(f.EnvVar, ",") { - envVar = strings.TrimSpace(envVar) - if envVal, ok := syscall.Getenv(envVar); ok { - newVal := &Int64Slice{} - for _, s := range strings.Split(envVal, ",") { - s = strings.TrimSpace(s) - if err := newVal.Set(s); err != nil { - return fmt.Errorf("could not parse %s as int64 slice value for flag %s: %s", envVal, f.Name, err) - } - } - f.Value = newVal - break - } - } - } - - eachName(f.Name, func(name string) { - if f.Value == nil { - f.Value = &Int64Slice{} - } - set.Var(f.Value, name, f.Usage) - }) - return nil -} - -// Apply populates the flag given the flag set and environment -// Ignores errors -func (f BoolFlag) Apply(set *flag.FlagSet) { - f.ApplyWithError(set) -} - -// ApplyWithError populates the flag given the flag set and environment -func (f BoolFlag) ApplyWithError(set *flag.FlagSet) error { - val := false - if f.EnvVar != "" { - for _, envVar := range strings.Split(f.EnvVar, ",") { - envVar = strings.TrimSpace(envVar) - if envVal, ok := syscall.Getenv(envVar); ok { - if envVal == "" { - val = false - break - } - - envValBool, err := strconv.ParseBool(envVal) - if err != nil { - return fmt.Errorf("could not parse %s as bool value for flag %s: %s", envVal, f.Name, err) - } - - val = envValBool - break - } - } - } - - eachName(f.Name, func(name string) { - if f.Destination != nil { - set.BoolVar(f.Destination, name, val, f.Usage) - return - } - set.Bool(name, val, f.Usage) - }) - - return nil -} - -// Apply populates the flag given the flag set and environment -// Ignores errors -func (f BoolTFlag) Apply(set *flag.FlagSet) { - f.ApplyWithError(set) -} - -// ApplyWithError populates the flag given the flag set and environment -func (f BoolTFlag) ApplyWithError(set *flag.FlagSet) error { - val := true - if f.EnvVar != "" { - for _, envVar := range strings.Split(f.EnvVar, ",") { - envVar = strings.TrimSpace(envVar) - if envVal, ok := syscall.Getenv(envVar); ok { - if envVal == "" { - val = false - break - } - - envValBool, err := strconv.ParseBool(envVal) - if err != nil { - return fmt.Errorf("could not parse %s as bool value for flag %s: %s", envVal, f.Name, err) - } - - val = envValBool - break - } - } - } - - eachName(f.Name, func(name string) { - if f.Destination != nil { - set.BoolVar(f.Destination, name, val, f.Usage) - return - } - set.Bool(name, val, f.Usage) - }) - - return nil -} - -// Apply populates the flag given the flag set and environment -// Ignores errors -func (f StringFlag) Apply(set *flag.FlagSet) { - f.ApplyWithError(set) -} - -// ApplyWithError populates the flag given the flag set and environment -func (f StringFlag) ApplyWithError(set *flag.FlagSet) error { - if f.EnvVar != "" { - for _, envVar := range strings.Split(f.EnvVar, ",") { - envVar = strings.TrimSpace(envVar) - if envVal, ok := syscall.Getenv(envVar); ok { - f.Value = envVal - break - } - } - } - - eachName(f.Name, func(name string) { - if f.Destination != nil { - set.StringVar(f.Destination, name, f.Value, f.Usage) - return - } - set.String(name, f.Value, f.Usage) - }) - - return nil -} - -// Apply populates the flag given the flag set and environment -// Ignores errors -func (f IntFlag) Apply(set *flag.FlagSet) { - f.ApplyWithError(set) -} - -// ApplyWithError populates the flag given the flag set and environment -func (f IntFlag) ApplyWithError(set *flag.FlagSet) error { - if f.EnvVar != "" { - for _, envVar := range strings.Split(f.EnvVar, ",") { - envVar = strings.TrimSpace(envVar) - if envVal, ok := syscall.Getenv(envVar); ok { - envValInt, err := strconv.ParseInt(envVal, 0, 64) - if err != nil { - return fmt.Errorf("could not parse %s as int value for flag %s: %s", envVal, f.Name, err) - } - f.Value = int(envValInt) - break - } - } - } - - eachName(f.Name, func(name string) { - if f.Destination != nil { - set.IntVar(f.Destination, name, f.Value, f.Usage) - return - } - set.Int(name, f.Value, f.Usage) - }) - - return nil -} - -// Apply populates the flag given the flag set and environment -// Ignores errors -func (f Int64Flag) Apply(set *flag.FlagSet) { - f.ApplyWithError(set) -} - -// ApplyWithError populates the flag given the flag set and environment -func (f Int64Flag) ApplyWithError(set *flag.FlagSet) error { - if f.EnvVar != "" { - for _, envVar := range strings.Split(f.EnvVar, ",") { - envVar = strings.TrimSpace(envVar) - if envVal, ok := syscall.Getenv(envVar); ok { - envValInt, err := strconv.ParseInt(envVal, 0, 64) - if err != nil { - return fmt.Errorf("could not parse %s as int value for flag %s: %s", envVal, f.Name, err) - } - - f.Value = envValInt - break - } - } - } - - eachName(f.Name, func(name string) { - if f.Destination != nil { - set.Int64Var(f.Destination, name, f.Value, f.Usage) - return - } - set.Int64(name, f.Value, f.Usage) - }) - - return nil -} - -// Apply populates the flag given the flag set and environment -// Ignores errors -func (f UintFlag) Apply(set *flag.FlagSet) { - f.ApplyWithError(set) -} - -// ApplyWithError populates the flag given the flag set and environment -func (f UintFlag) ApplyWithError(set *flag.FlagSet) error { - if f.EnvVar != "" { - for _, envVar := range strings.Split(f.EnvVar, ",") { - envVar = strings.TrimSpace(envVar) - if envVal, ok := syscall.Getenv(envVar); ok { - envValInt, err := strconv.ParseUint(envVal, 0, 64) - if err != nil { - return fmt.Errorf("could not parse %s as uint value for flag %s: %s", envVal, f.Name, err) - } - - f.Value = uint(envValInt) - break - } - } - } - - eachName(f.Name, func(name string) { - if f.Destination != nil { - set.UintVar(f.Destination, name, f.Value, f.Usage) - return - } - set.Uint(name, f.Value, f.Usage) - }) - - return nil -} - -// Apply populates the flag given the flag set and environment -// Ignores errors -func (f Uint64Flag) Apply(set *flag.FlagSet) { - f.ApplyWithError(set) -} - -// ApplyWithError populates the flag given the flag set and environment -func (f Uint64Flag) ApplyWithError(set *flag.FlagSet) error { - if f.EnvVar != "" { - for _, envVar := range strings.Split(f.EnvVar, ",") { - envVar = strings.TrimSpace(envVar) - if envVal, ok := syscall.Getenv(envVar); ok { - envValInt, err := strconv.ParseUint(envVal, 0, 64) - if err != nil { - return fmt.Errorf("could not parse %s as uint64 value for flag %s: %s", envVal, f.Name, err) - } - - f.Value = uint64(envValInt) - break - } - } - } - - eachName(f.Name, func(name string) { - if f.Destination != nil { - set.Uint64Var(f.Destination, name, f.Value, f.Usage) - return - } - set.Uint64(name, f.Value, f.Usage) - }) - - return nil -} - -// Apply populates the flag given the flag set and environment -// Ignores errors -func (f DurationFlag) Apply(set *flag.FlagSet) { - f.ApplyWithError(set) -} - -// ApplyWithError populates the flag given the flag set and environment -func (f DurationFlag) ApplyWithError(set *flag.FlagSet) error { - if f.EnvVar != "" { - for _, envVar := range strings.Split(f.EnvVar, ",") { - envVar = strings.TrimSpace(envVar) - if envVal, ok := syscall.Getenv(envVar); ok { - envValDuration, err := time.ParseDuration(envVal) - if err != nil { - return fmt.Errorf("could not parse %s as duration for flag %s: %s", envVal, f.Name, err) - } - - f.Value = envValDuration - break - } - } - } - - eachName(f.Name, func(name string) { - if f.Destination != nil { - set.DurationVar(f.Destination, name, f.Value, f.Usage) - return - } - set.Duration(name, f.Value, f.Usage) - }) - - return nil -} - -// Apply populates the flag given the flag set and environment -// Ignores errors -func (f Float64Flag) Apply(set *flag.FlagSet) { - f.ApplyWithError(set) -} - -// ApplyWithError populates the flag given the flag set and environment -func (f Float64Flag) ApplyWithError(set *flag.FlagSet) error { - if f.EnvVar != "" { - for _, envVar := range strings.Split(f.EnvVar, ",") { - envVar = strings.TrimSpace(envVar) - if envVal, ok := syscall.Getenv(envVar); ok { - envValFloat, err := strconv.ParseFloat(envVal, 10) - if err != nil { - return fmt.Errorf("could not parse %s as float64 value for flag %s: %s", envVal, f.Name, err) - } - - f.Value = float64(envValFloat) - break - } - } - } - - eachName(f.Name, func(name string) { - if f.Destination != nil { - set.Float64Var(f.Destination, name, f.Value, f.Usage) - return - } - set.Float64(name, f.Value, f.Usage) - }) - - return nil -} - -func visibleFlags(fl []Flag) []Flag { - visible := []Flag{} - for _, flag := range fl { - if !flagValue(flag).FieldByName("Hidden").Bool() { - visible = append(visible, flag) - } - } - return visible -} - -func prefixFor(name string) (prefix string) { - if len(name) == 1 { - prefix = "-" - } else { - prefix = "--" - } - - return -} - -// Returns the placeholder, if any, and the unquoted usage string. -func unquoteUsage(usage string) (string, string) { - for i := 0; i < len(usage); i++ { - if usage[i] == '`' { - for j := i + 1; j < len(usage); j++ { - if usage[j] == '`' { - name := usage[i+1 : j] - usage = usage[:i] + name + usage[j+1:] - return name, usage - } - } - break - } - } - return "", usage -} - -func prefixedNames(fullName, placeholder string) string { - var prefixed string - parts := strings.Split(fullName, ",") - for i, name := range parts { - name = strings.Trim(name, " ") - prefixed += prefixFor(name) + name - if placeholder != "" { - prefixed += " " + placeholder - } - if i < len(parts)-1 { - prefixed += ", " - } - } - return prefixed -} - -func withEnvHint(envVar, str string) string { - envText := "" - if envVar != "" { - prefix := "$" - suffix := "" - sep := ", $" - if runtime.GOOS == "windows" { - prefix = "%" - suffix = "%" - sep = "%, %" - } - envText = fmt.Sprintf(" [%s%s%s]", prefix, strings.Join(strings.Split(envVar, ","), sep), suffix) - } - return str + envText -} - -func flagValue(f Flag) reflect.Value { - fv := reflect.ValueOf(f) - for fv.Kind() == reflect.Ptr { - fv = reflect.Indirect(fv) - } - return fv -} - -func stringifyFlag(f Flag) string { - fv := flagValue(f) - - switch f.(type) { - case IntSliceFlag: - return withEnvHint(fv.FieldByName("EnvVar").String(), - stringifyIntSliceFlag(f.(IntSliceFlag))) - case Int64SliceFlag: - return withEnvHint(fv.FieldByName("EnvVar").String(), - stringifyInt64SliceFlag(f.(Int64SliceFlag))) - case StringSliceFlag: - return withEnvHint(fv.FieldByName("EnvVar").String(), - stringifyStringSliceFlag(f.(StringSliceFlag))) - } - - placeholder, usage := unquoteUsage(fv.FieldByName("Usage").String()) - - needsPlaceholder := false - defaultValueString := "" - val := fv.FieldByName("Value") - - if val.IsValid() { - needsPlaceholder = true - defaultValueString = fmt.Sprintf(" (default: %v)", val.Interface()) - - if val.Kind() == reflect.String && val.String() != "" { - defaultValueString = fmt.Sprintf(" (default: %q)", val.String()) - } - } - - if defaultValueString == " (default: )" { - defaultValueString = "" - } - - if needsPlaceholder && placeholder == "" { - placeholder = defaultPlaceholder - } - - usageWithDefault := strings.TrimSpace(fmt.Sprintf("%s%s", usage, defaultValueString)) - - return withEnvHint(fv.FieldByName("EnvVar").String(), - fmt.Sprintf("%s\t%s", prefixedNames(fv.FieldByName("Name").String(), placeholder), usageWithDefault)) -} - -func stringifyIntSliceFlag(f IntSliceFlag) string { - defaultVals := []string{} - if f.Value != nil && len(f.Value.Value()) > 0 { - for _, i := range f.Value.Value() { - defaultVals = append(defaultVals, fmt.Sprintf("%d", i)) - } - } - - return stringifySliceFlag(f.Usage, f.Name, defaultVals) -} - -func stringifyInt64SliceFlag(f Int64SliceFlag) string { - defaultVals := []string{} - if f.Value != nil && len(f.Value.Value()) > 0 { - for _, i := range f.Value.Value() { - defaultVals = append(defaultVals, fmt.Sprintf("%d", i)) - } - } - - return stringifySliceFlag(f.Usage, f.Name, defaultVals) -} - -func stringifyStringSliceFlag(f StringSliceFlag) string { - defaultVals := []string{} - if f.Value != nil && len(f.Value.Value()) > 0 { - for _, s := range f.Value.Value() { - if len(s) > 0 { - defaultVals = append(defaultVals, fmt.Sprintf("%q", s)) - } - } - } - - return stringifySliceFlag(f.Usage, f.Name, defaultVals) -} - -func stringifySliceFlag(usage, name string, defaultVals []string) string { - placeholder, usage := unquoteUsage(usage) - if placeholder == "" { - placeholder = defaultPlaceholder - } - - defaultVal := "" - if len(defaultVals) > 0 { - defaultVal = fmt.Sprintf(" (default: %s)", strings.Join(defaultVals, ", ")) - } - - usageWithDefault := strings.TrimSpace(fmt.Sprintf("%s%s", usage, defaultVal)) - return fmt.Sprintf("%s\t%s", prefixedNames(name, placeholder), usageWithDefault) -} diff --git a/vendor/github.com/urfave/cli/flag_generated.go b/vendor/github.com/urfave/cli/flag_generated.go deleted file mode 100644 index 491b61956..000000000 --- a/vendor/github.com/urfave/cli/flag_generated.go +++ /dev/null @@ -1,627 +0,0 @@ -package cli - -import ( - "flag" - "strconv" - "time" -) - -// WARNING: This file is generated! - -// BoolFlag is a flag with type bool -type BoolFlag struct { - Name string - Usage string - EnvVar string - Hidden bool - Destination *bool -} - -// String returns a readable representation of this value -// (for usage defaults) -func (f BoolFlag) String() string { - return FlagStringer(f) -} - -// GetName returns the name of the flag -func (f BoolFlag) GetName() string { - return f.Name -} - -// Bool looks up the value of a local BoolFlag, returns -// false if not found -func (c *Context) Bool(name string) bool { - return lookupBool(name, c.flagSet) -} - -// GlobalBool looks up the value of a global BoolFlag, returns -// false if not found -func (c *Context) GlobalBool(name string) bool { - if fs := lookupGlobalFlagSet(name, c); fs != nil { - return lookupBool(name, fs) - } - return false -} - -func lookupBool(name string, set *flag.FlagSet) bool { - f := set.Lookup(name) - if f != nil { - parsed, err := strconv.ParseBool(f.Value.String()) - if err != nil { - return false - } - return parsed - } - return false -} - -// BoolTFlag is a flag with type bool that is true by default -type BoolTFlag struct { - Name string - Usage string - EnvVar string - Hidden bool - Destination *bool -} - -// String returns a readable representation of this value -// (for usage defaults) -func (f BoolTFlag) String() string { - return FlagStringer(f) -} - -// GetName returns the name of the flag -func (f BoolTFlag) GetName() string { - return f.Name -} - -// BoolT looks up the value of a local BoolTFlag, returns -// false if not found -func (c *Context) BoolT(name string) bool { - return lookupBoolT(name, c.flagSet) -} - -// GlobalBoolT looks up the value of a global BoolTFlag, returns -// false if not found -func (c *Context) GlobalBoolT(name string) bool { - if fs := lookupGlobalFlagSet(name, c); fs != nil { - return lookupBoolT(name, fs) - } - return false -} - -func lookupBoolT(name string, set *flag.FlagSet) bool { - f := set.Lookup(name) - if f != nil { - parsed, err := strconv.ParseBool(f.Value.String()) - if err != nil { - return false - } - return parsed - } - return false -} - -// DurationFlag is a flag with type time.Duration (see https://golang.org/pkg/time/#ParseDuration) -type DurationFlag struct { - Name string - Usage string - EnvVar string - Hidden bool - Value time.Duration - Destination *time.Duration -} - -// String returns a readable representation of this value -// (for usage defaults) -func (f DurationFlag) String() string { - return FlagStringer(f) -} - -// GetName returns the name of the flag -func (f DurationFlag) GetName() string { - return f.Name -} - -// Duration looks up the value of a local DurationFlag, returns -// 0 if not found -func (c *Context) Duration(name string) time.Duration { - return lookupDuration(name, c.flagSet) -} - -// GlobalDuration looks up the value of a global DurationFlag, returns -// 0 if not found -func (c *Context) GlobalDuration(name string) time.Duration { - if fs := lookupGlobalFlagSet(name, c); fs != nil { - return lookupDuration(name, fs) - } - return 0 -} - -func lookupDuration(name string, set *flag.FlagSet) time.Duration { - f := set.Lookup(name) - if f != nil { - parsed, err := time.ParseDuration(f.Value.String()) - if err != nil { - return 0 - } - return parsed - } - return 0 -} - -// Float64Flag is a flag with type float64 -type Float64Flag struct { - Name string - Usage string - EnvVar string - Hidden bool - Value float64 - Destination *float64 -} - -// String returns a readable representation of this value -// (for usage defaults) -func (f Float64Flag) String() string { - return FlagStringer(f) -} - -// GetName returns the name of the flag -func (f Float64Flag) GetName() string { - return f.Name -} - -// Float64 looks up the value of a local Float64Flag, returns -// 0 if not found -func (c *Context) Float64(name string) float64 { - return lookupFloat64(name, c.flagSet) -} - -// GlobalFloat64 looks up the value of a global Float64Flag, returns -// 0 if not found -func (c *Context) GlobalFloat64(name string) float64 { - if fs := lookupGlobalFlagSet(name, c); fs != nil { - return lookupFloat64(name, fs) - } - return 0 -} - -func lookupFloat64(name string, set *flag.FlagSet) float64 { - f := set.Lookup(name) - if f != nil { - parsed, err := strconv.ParseFloat(f.Value.String(), 64) - if err != nil { - return 0 - } - return parsed - } - return 0 -} - -// GenericFlag is a flag with type Generic -type GenericFlag struct { - Name string - Usage string - EnvVar string - Hidden bool - Value Generic -} - -// String returns a readable representation of this value -// (for usage defaults) -func (f GenericFlag) String() string { - return FlagStringer(f) -} - -// GetName returns the name of the flag -func (f GenericFlag) GetName() string { - return f.Name -} - -// Generic looks up the value of a local GenericFlag, returns -// nil if not found -func (c *Context) Generic(name string) interface{} { - return lookupGeneric(name, c.flagSet) -} - -// GlobalGeneric looks up the value of a global GenericFlag, returns -// nil if not found -func (c *Context) GlobalGeneric(name string) interface{} { - if fs := lookupGlobalFlagSet(name, c); fs != nil { - return lookupGeneric(name, fs) - } - return nil -} - -func lookupGeneric(name string, set *flag.FlagSet) interface{} { - f := set.Lookup(name) - if f != nil { - parsed, err := f.Value, error(nil) - if err != nil { - return nil - } - return parsed - } - return nil -} - -// Int64Flag is a flag with type int64 -type Int64Flag struct { - Name string - Usage string - EnvVar string - Hidden bool - Value int64 - Destination *int64 -} - -// String returns a readable representation of this value -// (for usage defaults) -func (f Int64Flag) String() string { - return FlagStringer(f) -} - -// GetName returns the name of the flag -func (f Int64Flag) GetName() string { - return f.Name -} - -// Int64 looks up the value of a local Int64Flag, returns -// 0 if not found -func (c *Context) Int64(name string) int64 { - return lookupInt64(name, c.flagSet) -} - -// GlobalInt64 looks up the value of a global Int64Flag, returns -// 0 if not found -func (c *Context) GlobalInt64(name string) int64 { - if fs := lookupGlobalFlagSet(name, c); fs != nil { - return lookupInt64(name, fs) - } - return 0 -} - -func lookupInt64(name string, set *flag.FlagSet) int64 { - f := set.Lookup(name) - if f != nil { - parsed, err := strconv.ParseInt(f.Value.String(), 0, 64) - if err != nil { - return 0 - } - return parsed - } - return 0 -} - -// IntFlag is a flag with type int -type IntFlag struct { - Name string - Usage string - EnvVar string - Hidden bool - Value int - Destination *int -} - -// String returns a readable representation of this value -// (for usage defaults) -func (f IntFlag) String() string { - return FlagStringer(f) -} - -// GetName returns the name of the flag -func (f IntFlag) GetName() string { - return f.Name -} - -// Int looks up the value of a local IntFlag, returns -// 0 if not found -func (c *Context) Int(name string) int { - return lookupInt(name, c.flagSet) -} - -// GlobalInt looks up the value of a global IntFlag, returns -// 0 if not found -func (c *Context) GlobalInt(name string) int { - if fs := lookupGlobalFlagSet(name, c); fs != nil { - return lookupInt(name, fs) - } - return 0 -} - -func lookupInt(name string, set *flag.FlagSet) int { - f := set.Lookup(name) - if f != nil { - parsed, err := strconv.ParseInt(f.Value.String(), 0, 64) - if err != nil { - return 0 - } - return int(parsed) - } - return 0 -} - -// IntSliceFlag is a flag with type *IntSlice -type IntSliceFlag struct { - Name string - Usage string - EnvVar string - Hidden bool - Value *IntSlice -} - -// String returns a readable representation of this value -// (for usage defaults) -func (f IntSliceFlag) String() string { - return FlagStringer(f) -} - -// GetName returns the name of the flag -func (f IntSliceFlag) GetName() string { - return f.Name -} - -// IntSlice looks up the value of a local IntSliceFlag, returns -// nil if not found -func (c *Context) IntSlice(name string) []int { - return lookupIntSlice(name, c.flagSet) -} - -// GlobalIntSlice looks up the value of a global IntSliceFlag, returns -// nil if not found -func (c *Context) GlobalIntSlice(name string) []int { - if fs := lookupGlobalFlagSet(name, c); fs != nil { - return lookupIntSlice(name, fs) - } - return nil -} - -func lookupIntSlice(name string, set *flag.FlagSet) []int { - f := set.Lookup(name) - if f != nil { - parsed, err := (f.Value.(*IntSlice)).Value(), error(nil) - if err != nil { - return nil - } - return parsed - } - return nil -} - -// Int64SliceFlag is a flag with type *Int64Slice -type Int64SliceFlag struct { - Name string - Usage string - EnvVar string - Hidden bool - Value *Int64Slice -} - -// String returns a readable representation of this value -// (for usage defaults) -func (f Int64SliceFlag) String() string { - return FlagStringer(f) -} - -// GetName returns the name of the flag -func (f Int64SliceFlag) GetName() string { - return f.Name -} - -// Int64Slice looks up the value of a local Int64SliceFlag, returns -// nil if not found -func (c *Context) Int64Slice(name string) []int64 { - return lookupInt64Slice(name, c.flagSet) -} - -// GlobalInt64Slice looks up the value of a global Int64SliceFlag, returns -// nil if not found -func (c *Context) GlobalInt64Slice(name string) []int64 { - if fs := lookupGlobalFlagSet(name, c); fs != nil { - return lookupInt64Slice(name, fs) - } - return nil -} - -func lookupInt64Slice(name string, set *flag.FlagSet) []int64 { - f := set.Lookup(name) - if f != nil { - parsed, err := (f.Value.(*Int64Slice)).Value(), error(nil) - if err != nil { - return nil - } - return parsed - } - return nil -} - -// StringFlag is a flag with type string -type StringFlag struct { - Name string - Usage string - EnvVar string - Hidden bool - Value string - Destination *string -} - -// String returns a readable representation of this value -// (for usage defaults) -func (f StringFlag) String() string { - return FlagStringer(f) -} - -// GetName returns the name of the flag -func (f StringFlag) GetName() string { - return f.Name -} - -// String looks up the value of a local StringFlag, returns -// "" if not found -func (c *Context) String(name string) string { - return lookupString(name, c.flagSet) -} - -// GlobalString looks up the value of a global StringFlag, returns -// "" if not found -func (c *Context) GlobalString(name string) string { - if fs := lookupGlobalFlagSet(name, c); fs != nil { - return lookupString(name, fs) - } - return "" -} - -func lookupString(name string, set *flag.FlagSet) string { - f := set.Lookup(name) - if f != nil { - parsed, err := f.Value.String(), error(nil) - if err != nil { - return "" - } - return parsed - } - return "" -} - -// StringSliceFlag is a flag with type *StringSlice -type StringSliceFlag struct { - Name string - Usage string - EnvVar string - Hidden bool - Value *StringSlice -} - -// String returns a readable representation of this value -// (for usage defaults) -func (f StringSliceFlag) String() string { - return FlagStringer(f) -} - -// GetName returns the name of the flag -func (f StringSliceFlag) GetName() string { - return f.Name -} - -// StringSlice looks up the value of a local StringSliceFlag, returns -// nil if not found -func (c *Context) StringSlice(name string) []string { - return lookupStringSlice(name, c.flagSet) -} - -// GlobalStringSlice looks up the value of a global StringSliceFlag, returns -// nil if not found -func (c *Context) GlobalStringSlice(name string) []string { - if fs := lookupGlobalFlagSet(name, c); fs != nil { - return lookupStringSlice(name, fs) - } - return nil -} - -func lookupStringSlice(name string, set *flag.FlagSet) []string { - f := set.Lookup(name) - if f != nil { - parsed, err := (f.Value.(*StringSlice)).Value(), error(nil) - if err != nil { - return nil - } - return parsed - } - return nil -} - -// Uint64Flag is a flag with type uint64 -type Uint64Flag struct { - Name string - Usage string - EnvVar string - Hidden bool - Value uint64 - Destination *uint64 -} - -// String returns a readable representation of this value -// (for usage defaults) -func (f Uint64Flag) String() string { - return FlagStringer(f) -} - -// GetName returns the name of the flag -func (f Uint64Flag) GetName() string { - return f.Name -} - -// Uint64 looks up the value of a local Uint64Flag, returns -// 0 if not found -func (c *Context) Uint64(name string) uint64 { - return lookupUint64(name, c.flagSet) -} - -// GlobalUint64 looks up the value of a global Uint64Flag, returns -// 0 if not found -func (c *Context) GlobalUint64(name string) uint64 { - if fs := lookupGlobalFlagSet(name, c); fs != nil { - return lookupUint64(name, fs) - } - return 0 -} - -func lookupUint64(name string, set *flag.FlagSet) uint64 { - f := set.Lookup(name) - if f != nil { - parsed, err := strconv.ParseUint(f.Value.String(), 0, 64) - if err != nil { - return 0 - } - return parsed - } - return 0 -} - -// UintFlag is a flag with type uint -type UintFlag struct { - Name string - Usage string - EnvVar string - Hidden bool - Value uint - Destination *uint -} - -// String returns a readable representation of this value -// (for usage defaults) -func (f UintFlag) String() string { - return FlagStringer(f) -} - -// GetName returns the name of the flag -func (f UintFlag) GetName() string { - return f.Name -} - -// Uint looks up the value of a local UintFlag, returns -// 0 if not found -func (c *Context) Uint(name string) uint { - return lookupUint(name, c.flagSet) -} - -// GlobalUint looks up the value of a global UintFlag, returns -// 0 if not found -func (c *Context) GlobalUint(name string) uint { - if fs := lookupGlobalFlagSet(name, c); fs != nil { - return lookupUint(name, fs) - } - return 0 -} - -func lookupUint(name string, set *flag.FlagSet) uint { - f := set.Lookup(name) - if f != nil { - parsed, err := strconv.ParseUint(f.Value.String(), 0, 64) - if err != nil { - return 0 - } - return uint(parsed) - } - return 0 -} diff --git a/vendor/github.com/urfave/cli/funcs.go b/vendor/github.com/urfave/cli/funcs.go deleted file mode 100644 index cba5e6cb0..000000000 --- a/vendor/github.com/urfave/cli/funcs.go +++ /dev/null @@ -1,28 +0,0 @@ -package cli - -// BashCompleteFunc is an action to execute when the bash-completion flag is set -type BashCompleteFunc func(*Context) - -// BeforeFunc is an action to execute before any subcommands are run, but after -// the context is ready if a non-nil error is returned, no subcommands are run -type BeforeFunc func(*Context) error - -// AfterFunc is an action to execute after any subcommands are run, but after the -// subcommand has finished it is run even if Action() panics -type AfterFunc func(*Context) error - -// ActionFunc is the action to execute when no subcommands are specified -type ActionFunc func(*Context) error - -// CommandNotFoundFunc is executed if the proper command cannot be found -type CommandNotFoundFunc func(*Context, string) - -// OnUsageErrorFunc is executed if an usage error occurs. This is useful for displaying -// customized usage error messages. This function is able to replace the -// original error messages. If this function is not set, the "Incorrect usage" -// is displayed and the execution is interrupted. -type OnUsageErrorFunc func(context *Context, err error, isSubcommand bool) error - -// FlagStringFunc is used by the help generation to display a flag, which is -// expected to be a single line. -type FlagStringFunc func(Flag) string diff --git a/vendor/github.com/urfave/cli/generate-flag-types b/vendor/github.com/urfave/cli/generate-flag-types deleted file mode 100644 index 7147381ce..000000000 --- a/vendor/github.com/urfave/cli/generate-flag-types +++ /dev/null @@ -1,255 +0,0 @@ -#!/usr/bin/env python -""" -The flag types that ship with the cli library have many things in common, and -so we can take advantage of the `go generate` command to create much of the -source code from a list of definitions. These definitions attempt to cover -the parts that vary between flag types, and should evolve as needed. - -An example of the minimum definition needed is: - - { - "name": "SomeType", - "type": "sometype", - "context_default": "nil" - } - -In this example, the code generated for the `cli` package will include a type -named `SomeTypeFlag` that is expected to wrap a value of type `sometype`. -Fetching values by name via `*cli.Context` will default to a value of `nil`. - -A more complete, albeit somewhat redundant, example showing all available -definition keys is: - - { - "name": "VeryMuchType", - "type": "*VeryMuchType", - "value": true, - "dest": false, - "doctail": " which really only wraps a []float64, oh well!", - "context_type": "[]float64", - "context_default": "nil", - "parser": "parseVeryMuchType(f.Value.String())", - "parser_cast": "[]float64(parsed)" - } - -The meaning of each field is as follows: - - name (string) - The type "name", which will be suffixed with - `Flag` when generating the type definition - for `cli` and the wrapper type for `altsrc` - type (string) - The type that the generated `Flag` type for `cli` - is expected to "contain" as its `.Value` member - value (bool) - Should the generated `cli` type have a `Value` - member? - dest (bool) - Should the generated `cli` type support a - destination pointer? - doctail (string) - Additional docs for the `cli` flag type comment - context_type (string) - The literal type used in the `*cli.Context` - reader func signature - context_default (string) - The literal value used as the default by the - `*cli.Context` reader funcs when no value is - present - parser (string) - Literal code used to parse the flag `f`, - expected to have a return signature of - (value, error) - parser_cast (string) - Literal code used to cast the `parsed` value - returned from the `parser` code -""" - -from __future__ import print_function, unicode_literals - -import argparse -import json -import os -import subprocess -import sys -import tempfile -import textwrap - - -class _FancyFormatter(argparse.ArgumentDefaultsHelpFormatter, - argparse.RawDescriptionHelpFormatter): - pass - - -def main(sysargs=sys.argv[:]): - parser = argparse.ArgumentParser( - description='Generate flag type code!', - formatter_class=_FancyFormatter) - parser.add_argument( - 'package', - type=str, default='cli', choices=_WRITEFUNCS.keys(), - help='Package for which flag types will be generated' - ) - parser.add_argument( - '-i', '--in-json', - type=argparse.FileType('r'), - default=sys.stdin, - help='Input JSON file which defines each type to be generated' - ) - parser.add_argument( - '-o', '--out-go', - type=argparse.FileType('w'), - default=sys.stdout, - help='Output file/stream to which generated source will be written' - ) - parser.epilog = __doc__ - - args = parser.parse_args(sysargs[1:]) - _generate_flag_types(_WRITEFUNCS[args.package], args.out_go, args.in_json) - return 0 - - -def _generate_flag_types(writefunc, output_go, input_json): - types = json.load(input_json) - - tmp = tempfile.NamedTemporaryFile(suffix='.go', delete=False) - writefunc(tmp, types) - tmp.close() - - new_content = subprocess.check_output( - ['goimports', tmp.name] - ).decode('utf-8') - - print(new_content, file=output_go, end='') - output_go.flush() - os.remove(tmp.name) - - -def _set_typedef_defaults(typedef): - typedef.setdefault('doctail', '') - typedef.setdefault('context_type', typedef['type']) - typedef.setdefault('dest', True) - typedef.setdefault('value', True) - typedef.setdefault('parser', 'f.Value, error(nil)') - typedef.setdefault('parser_cast', 'parsed') - - -def _write_cli_flag_types(outfile, types): - _fwrite(outfile, """\ - package cli - - // WARNING: This file is generated! - - """) - - for typedef in types: - _set_typedef_defaults(typedef) - - _fwrite(outfile, """\ - // {name}Flag is a flag with type {type}{doctail} - type {name}Flag struct {{ - Name string - Usage string - EnvVar string - Hidden bool - """.format(**typedef)) - - if typedef['value']: - _fwrite(outfile, """\ - Value {type} - """.format(**typedef)) - - if typedef['dest']: - _fwrite(outfile, """\ - Destination *{type} - """.format(**typedef)) - - _fwrite(outfile, "\n}\n\n") - - _fwrite(outfile, """\ - // String returns a readable representation of this value - // (for usage defaults) - func (f {name}Flag) String() string {{ - return FlagStringer(f) - }} - - // GetName returns the name of the flag - func (f {name}Flag) GetName() string {{ - return f.Name - }} - - // {name} looks up the value of a local {name}Flag, returns - // {context_default} if not found - func (c *Context) {name}(name string) {context_type} {{ - return lookup{name}(name, c.flagSet) - }} - - // Global{name} looks up the value of a global {name}Flag, returns - // {context_default} if not found - func (c *Context) Global{name}(name string) {context_type} {{ - if fs := lookupGlobalFlagSet(name, c); fs != nil {{ - return lookup{name}(name, fs) - }} - return {context_default} - }} - - func lookup{name}(name string, set *flag.FlagSet) {context_type} {{ - f := set.Lookup(name) - if f != nil {{ - parsed, err := {parser} - if err != nil {{ - return {context_default} - }} - return {parser_cast} - }} - return {context_default} - }} - """.format(**typedef)) - - -def _write_altsrc_flag_types(outfile, types): - _fwrite(outfile, """\ - package altsrc - - import ( - "gopkg.in/urfave/cli.v1" - ) - - // WARNING: This file is generated! - - """) - - for typedef in types: - _set_typedef_defaults(typedef) - - _fwrite(outfile, """\ - // {name}Flag is the flag type that wraps cli.{name}Flag to allow - // for other values to be specified - type {name}Flag struct {{ - cli.{name}Flag - set *flag.FlagSet - }} - - // New{name}Flag creates a new {name}Flag - func New{name}Flag(fl cli.{name}Flag) *{name}Flag {{ - return &{name}Flag{{{name}Flag: fl, set: nil}} - }} - - // Apply saves the flagSet for later usage calls, then calls the - // wrapped {name}Flag.Apply - func (f *{name}Flag) Apply(set *flag.FlagSet) {{ - f.set = set - f.{name}Flag.Apply(set) - }} - - // ApplyWithError saves the flagSet for later usage calls, then calls the - // wrapped {name}Flag.ApplyWithError - func (f *{name}Flag) ApplyWithError(set *flag.FlagSet) error {{ - f.set = set - return f.{name}Flag.ApplyWithError(set) - }} - """.format(**typedef)) - - -def _fwrite(outfile, text): - print(textwrap.dedent(text), end='', file=outfile) - - -_WRITEFUNCS = { - 'cli': _write_cli_flag_types, - 'altsrc': _write_altsrc_flag_types -} - -if __name__ == '__main__': - sys.exit(main()) diff --git a/vendor/github.com/urfave/cli/help.go b/vendor/github.com/urfave/cli/help.go deleted file mode 100644 index d00e4da1b..000000000 --- a/vendor/github.com/urfave/cli/help.go +++ /dev/null @@ -1,294 +0,0 @@ -package cli - -import ( - "fmt" - "io" - "os" - "strings" - "text/tabwriter" - "text/template" -) - -// AppHelpTemplate is the text template for the Default help topic. -// cli.go uses text/template to render templates. You can -// render custom help text by setting this variable. -var AppHelpTemplate = `NAME: - {{.Name}}{{if .Usage}} - {{.Usage}}{{end}} - -USAGE: - {{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}} {{if .VisibleFlags}}[global options]{{end}}{{if .Commands}} command [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Version}}{{if not .HideVersion}} - -VERSION: - {{.Version}}{{end}}{{end}}{{if .Description}} - -DESCRIPTION: - {{.Description}}{{end}}{{if len .Authors}} - -AUTHOR{{with $length := len .Authors}}{{if ne 1 $length}}S{{end}}{{end}}: - {{range $index, $author := .Authors}}{{if $index}} - {{end}}{{$author}}{{end}}{{end}}{{if .VisibleCommands}} - -COMMANDS:{{range .VisibleCategories}}{{if .Name}} - {{.Name}}:{{end}}{{range .VisibleCommands}} - {{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{end}}{{end}}{{if .VisibleFlags}} - -GLOBAL OPTIONS: - {{range $index, $option := .VisibleFlags}}{{if $index}} - {{end}}{{$option}}{{end}}{{end}}{{if .Copyright}} - -COPYRIGHT: - {{.Copyright}}{{end}} -` - -// CommandHelpTemplate is the text template for the command help topic. -// cli.go uses text/template to render templates. You can -// render custom help text by setting this variable. -var CommandHelpTemplate = `NAME: - {{.HelpName}} - {{.Usage}} - -USAGE: - {{.HelpName}}{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{if .Category}} - -CATEGORY: - {{.Category}}{{end}}{{if .Description}} - -DESCRIPTION: - {{.Description}}{{end}}{{if .VisibleFlags}} - -OPTIONS: - {{range .VisibleFlags}}{{.}} - {{end}}{{end}} -` - -// SubcommandHelpTemplate is the text template for the subcommand help topic. -// cli.go uses text/template to render templates. You can -// render custom help text by setting this variable. -var SubcommandHelpTemplate = `NAME: - {{.HelpName}} - {{if .Description}}{{.Description}}{{else}}{{.Usage}}{{end}} - -USAGE: - {{.HelpName}} command{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}} - -COMMANDS:{{range .VisibleCategories}}{{if .Name}} - {{.Name}}:{{end}}{{range .VisibleCommands}} - {{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}} -{{end}}{{if .VisibleFlags}} -OPTIONS: - {{range .VisibleFlags}}{{.}} - {{end}}{{end}} -` - -var helpCommand = Command{ - Name: "help", - Aliases: []string{"h"}, - Usage: "Shows a list of commands or help for one command", - ArgsUsage: "[command]", - Action: func(c *Context) error { - args := c.Args() - if args.Present() { - return ShowCommandHelp(c, args.First()) - } - - ShowAppHelp(c) - return nil - }, -} - -var helpSubcommand = Command{ - Name: "help", - Aliases: []string{"h"}, - Usage: "Shows a list of commands or help for one command", - ArgsUsage: "[command]", - Action: func(c *Context) error { - args := c.Args() - if args.Present() { - return ShowCommandHelp(c, args.First()) - } - - return ShowSubcommandHelp(c) - }, -} - -// Prints help for the App or Command -type helpPrinter func(w io.Writer, templ string, data interface{}) - -// HelpPrinter is a function that writes the help output. If not set a default -// is used. The function signature is: -// func(w io.Writer, templ string, data interface{}) -var HelpPrinter helpPrinter = printHelp - -// VersionPrinter prints the version for the App -var VersionPrinter = printVersion - -// ShowAppHelp is an action that displays the help. -func ShowAppHelp(c *Context) error { - HelpPrinter(c.App.Writer, AppHelpTemplate, c.App) - return nil -} - -// DefaultAppComplete prints the list of subcommands as the default app completion method -func DefaultAppComplete(c *Context) { - for _, command := range c.App.Commands { - if command.Hidden { - continue - } - for _, name := range command.Names() { - fmt.Fprintln(c.App.Writer, name) - } - } -} - -// ShowCommandHelp prints help for the given command -func ShowCommandHelp(ctx *Context, command string) error { - // show the subcommand help for a command with subcommands - if command == "" { - HelpPrinter(ctx.App.Writer, SubcommandHelpTemplate, ctx.App) - return nil - } - - for _, c := range ctx.App.Commands { - if c.HasName(command) { - HelpPrinter(ctx.App.Writer, CommandHelpTemplate, c) - return nil - } - } - - if ctx.App.CommandNotFound == nil { - return NewExitError(fmt.Sprintf("No help topic for '%v'", command), 3) - } - - ctx.App.CommandNotFound(ctx, command) - return nil -} - -// ShowSubcommandHelp prints help for the given subcommand -func ShowSubcommandHelp(c *Context) error { - return ShowCommandHelp(c, c.Command.Name) -} - -// ShowVersion prints the version number of the App -func ShowVersion(c *Context) { - VersionPrinter(c) -} - -func printVersion(c *Context) { - fmt.Fprintf(c.App.Writer, "%v version %v\n", c.App.Name, c.App.Version) -} - -// ShowCompletions prints the lists of commands within a given context -func ShowCompletions(c *Context) { - a := c.App - if a != nil && a.BashComplete != nil { - a.BashComplete(c) - } -} - -// ShowCommandCompletions prints the custom completions for a given command -func ShowCommandCompletions(ctx *Context, command string) { - c := ctx.App.Command(command) - if c != nil && c.BashComplete != nil { - c.BashComplete(ctx) - } -} - -func printHelp(out io.Writer, templ string, data interface{}) { - funcMap := template.FuncMap{ - "join": strings.Join, - } - - w := tabwriter.NewWriter(out, 1, 8, 2, ' ', 0) - t := template.Must(template.New("help").Funcs(funcMap).Parse(templ)) - err := t.Execute(w, data) - if err != nil { - // If the writer is closed, t.Execute will fail, and there's nothing - // we can do to recover. - if os.Getenv("CLI_TEMPLATE_ERROR_DEBUG") != "" { - fmt.Fprintf(ErrWriter, "CLI TEMPLATE ERROR: %#v\n", err) - } - return - } - w.Flush() -} - -func checkVersion(c *Context) bool { - found := false - if VersionFlag.Name != "" { - eachName(VersionFlag.Name, func(name string) { - if c.GlobalBool(name) || c.Bool(name) { - found = true - } - }) - } - return found -} - -func checkHelp(c *Context) bool { - found := false - if HelpFlag.Name != "" { - eachName(HelpFlag.Name, func(name string) { - if c.GlobalBool(name) || c.Bool(name) { - found = true - } - }) - } - return found -} - -func checkCommandHelp(c *Context, name string) bool { - if c.Bool("h") || c.Bool("help") { - ShowCommandHelp(c, name) - return true - } - - return false -} - -func checkSubcommandHelp(c *Context) bool { - if c.Bool("h") || c.Bool("help") { - ShowSubcommandHelp(c) - return true - } - - return false -} - -func checkShellCompleteFlag(a *App, arguments []string) (bool, []string) { - if !a.EnableBashCompletion { - return false, arguments - } - - pos := len(arguments) - 1 - lastArg := arguments[pos] - - if lastArg != "--"+BashCompletionFlag.Name { - return false, arguments - } - - return true, arguments[:pos] -} - -func checkCompletions(c *Context) bool { - if !c.shellComplete { - return false - } - - if args := c.Args(); args.Present() { - name := args.First() - if cmd := c.App.Command(name); cmd != nil { - // let the command handle the completion - return false - } - } - - ShowCompletions(c) - return true -} - -func checkCommandCompletions(c *Context, name string) bool { - if !c.shellComplete { - return false - } - - ShowCommandCompletions(c, name) - return true -} diff --git a/vendor/github.com/urfave/cli/runtests b/vendor/github.com/urfave/cli/runtests deleted file mode 100644 index ee22bdeed..000000000 --- a/vendor/github.com/urfave/cli/runtests +++ /dev/null @@ -1,122 +0,0 @@ -#!/usr/bin/env python -from __future__ import print_function - -import argparse -import os -import sys -import tempfile - -from subprocess import check_call, check_output - - -PACKAGE_NAME = os.environ.get( - 'CLI_PACKAGE_NAME', 'github.com/urfave/cli' -) - - -def main(sysargs=sys.argv[:]): - targets = { - 'vet': _vet, - 'test': _test, - 'gfmrun': _gfmrun, - 'toc': _toc, - 'gen': _gen, - } - - parser = argparse.ArgumentParser() - parser.add_argument( - 'target', nargs='?', choices=tuple(targets.keys()), default='test' - ) - args = parser.parse_args(sysargs[1:]) - - targets[args.target]() - return 0 - - -def _test(): - if check_output('go version'.split()).split()[2] < 'go1.2': - _run('go test -v .') - return - - coverprofiles = [] - for subpackage in ['', 'altsrc']: - coverprofile = 'cli.coverprofile' - if subpackage != '': - coverprofile = '{}.coverprofile'.format(subpackage) - - coverprofiles.append(coverprofile) - - _run('go test -v'.split() + [ - '-coverprofile={}'.format(coverprofile), - ('{}/{}'.format(PACKAGE_NAME, subpackage)).rstrip('/') - ]) - - combined_name = _combine_coverprofiles(coverprofiles) - _run('go tool cover -func={}'.format(combined_name)) - os.remove(combined_name) - - -def _gfmrun(): - go_version = check_output('go version'.split()).split()[2] - if go_version < 'go1.3': - print('runtests: skip on {}'.format(go_version), file=sys.stderr) - return - _run(['gfmrun', '-c', str(_gfmrun_count()), '-s', 'README.md']) - - -def _vet(): - _run('go vet ./...') - - -def _toc(): - _run('node_modules/.bin/markdown-toc -i README.md') - _run('git diff --exit-code') - - -def _gen(): - go_version = check_output('go version'.split()).split()[2] - if go_version < 'go1.5': - print('runtests: skip on {}'.format(go_version), file=sys.stderr) - return - - _run('go generate ./...') - _run('git diff --exit-code') - - -def _run(command): - if hasattr(command, 'split'): - command = command.split() - print('runtests: {}'.format(' '.join(command)), file=sys.stderr) - check_call(command) - - -def _gfmrun_count(): - with open('README.md') as infile: - lines = infile.read().splitlines() - return len(filter(_is_go_runnable, lines)) - - -def _is_go_runnable(line): - return line.startswith('package main') - - -def _combine_coverprofiles(coverprofiles): - combined = tempfile.NamedTemporaryFile( - suffix='.coverprofile', delete=False - ) - combined.write('mode: set\n') - - for coverprofile in coverprofiles: - with open(coverprofile, 'r') as infile: - for line in infile.readlines(): - if not line.startswith('mode: '): - combined.write(line) - - combined.flush() - name = combined.name - combined.close() - return name - - -if __name__ == '__main__': - sys.exit(main()) diff --git a/vendor/golang.org/x/crypto/.gitattributes b/vendor/golang.org/x/crypto/.gitattributes deleted file mode 100644 index d2f212e5d..000000000 --- a/vendor/golang.org/x/crypto/.gitattributes +++ /dev/null @@ -1,10 +0,0 @@ -# Treat all files in this repo as binary, with no git magic updating -# line endings. Windows users contributing to Go will need to use a -# modern version of git and editors capable of LF line endings. -# -# We'll prevent accidental CRLF line endings from entering the repo -# via the git-review gofmt checks. -# -# See golang.org/issue/9281 - -* -text diff --git a/vendor/golang.org/x/crypto/.gitignore b/vendor/golang.org/x/crypto/.gitignore deleted file mode 100644 index 8339fd61d..000000000 --- a/vendor/golang.org/x/crypto/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# Add no patterns to .hgignore except for files generated by the build. -last-change diff --git a/vendor/golang.org/x/crypto/AUTHORS b/vendor/golang.org/x/crypto/AUTHORS deleted file mode 100644 index 15167cd74..000000000 --- a/vendor/golang.org/x/crypto/AUTHORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code refers to The Go Authors for copyright purposes. -# The master list of authors is in the main Go distribution, -# visible at http://tip.golang.org/AUTHORS. diff --git a/vendor/golang.org/x/crypto/CONTRIBUTING.md b/vendor/golang.org/x/crypto/CONTRIBUTING.md deleted file mode 100644 index 88dff59bc..000000000 --- a/vendor/golang.org/x/crypto/CONTRIBUTING.md +++ /dev/null @@ -1,31 +0,0 @@ -# Contributing to Go - -Go is an open source project. - -It is the work of hundreds of contributors. We appreciate your help! - - -## Filing issues - -When [filing an issue](https://golang.org/issue/new), make sure to answer these five questions: - -1. What version of Go are you using (`go version`)? -2. What operating system and processor architecture are you using? -3. What did you do? -4. What did you expect to see? -5. What did you see instead? - -General questions should go to the [golang-nuts mailing list](https://groups.google.com/group/golang-nuts) instead of the issue tracker. -The gophers there will answer or ask you to file an issue if you've tripped over a bug. - -## Contributing code - -Please read the [Contribution Guidelines](https://golang.org/doc/contribute.html) -before sending patches. - -**We do not accept GitHub pull requests** -(we use [Gerrit](https://code.google.com/p/gerrit/) instead for code review). - -Unless otherwise noted, the Go source files are distributed under -the BSD-style license found in the LICENSE file. - diff --git a/vendor/golang.org/x/crypto/CONTRIBUTORS b/vendor/golang.org/x/crypto/CONTRIBUTORS deleted file mode 100644 index 1c4577e96..000000000 --- a/vendor/golang.org/x/crypto/CONTRIBUTORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code was written by the Go contributors. -# The master list of contributors is in the main Go distribution, -# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/golang.org/x/crypto/LICENSE b/vendor/golang.org/x/crypto/LICENSE deleted file mode 100644 index 6a66aea5e..000000000 --- a/vendor/golang.org/x/crypto/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2009 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * 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. - * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT -OWNER 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. diff --git a/vendor/golang.org/x/crypto/PATENTS b/vendor/golang.org/x/crypto/PATENTS deleted file mode 100644 index 733099041..000000000 --- a/vendor/golang.org/x/crypto/PATENTS +++ /dev/null @@ -1,22 +0,0 @@ -Additional IP Rights Grant (Patents) - -"This implementation" means the copyrightable works distributed by -Google as part of the Go project. - -Google hereby grants to You a perpetual, worldwide, non-exclusive, -no-charge, royalty-free, irrevocable (except as stated in this section) -patent license to make, have made, use, offer to sell, sell, import, -transfer and otherwise run, modify and propagate the contents of this -implementation of Go, where such license applies only to those patent -claims, both currently owned or controlled by Google and acquired in -the future, licensable by Google that are necessarily infringed by this -implementation of Go. This grant does not include claims that would be -infringed only as a consequence of further modification of this -implementation. If you or your agent or exclusive licensee institute or -order or agree to the institution of patent litigation against any -entity (including a cross-claim or counterclaim in a lawsuit) alleging -that this implementation of Go or any code incorporated within this -implementation of Go constitutes direct or contributory patent -infringement, or inducement of patent infringement, then any patent -rights granted to you under this License for this implementation of Go -shall terminate as of the date such litigation is filed. diff --git a/vendor/golang.org/x/crypto/README b/vendor/golang.org/x/crypto/README deleted file mode 100644 index f1e0cbf94..000000000 --- a/vendor/golang.org/x/crypto/README +++ /dev/null @@ -1,3 +0,0 @@ -This repository holds supplementary Go cryptography libraries. - -To submit changes to this repository, see http://golang.org/doc/contribute.html. diff --git a/vendor/golang.org/x/crypto/acme/acme.go b/vendor/golang.org/x/crypto/acme/acme.go deleted file mode 100644 index 140d422fa..000000000 --- a/vendor/golang.org/x/crypto/acme/acme.go +++ /dev/null @@ -1,1048 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package acme provides an implementation of the -// Automatic Certificate Management Environment (ACME) spec. -// See https://tools.ietf.org/html/draft-ietf-acme-acme-02 for details. -// -// Most common scenarios will want to use autocert subdirectory instead, -// which provides automatic access to certificates from Let's Encrypt -// and any other ACME-based CA. -// -// This package is a work in progress and makes no API stability promises. -package acme - -import ( - "bytes" - "context" - "crypto" - "crypto/ecdsa" - "crypto/elliptic" - "crypto/rand" - "crypto/sha256" - "crypto/tls" - "crypto/x509" - "encoding/base64" - "encoding/hex" - "encoding/json" - "encoding/pem" - "errors" - "fmt" - "io" - "io/ioutil" - "math/big" - "net/http" - "strconv" - "strings" - "sync" - "time" -) - -// LetsEncryptURL is the Directory endpoint of Let's Encrypt CA. -const LetsEncryptURL = "https://acme-v01.api.letsencrypt.org/directory" - -const ( - maxChainLen = 5 // max depth and breadth of a certificate chain - maxCertSize = 1 << 20 // max size of a certificate, in bytes - - // Max number of collected nonces kept in memory. - // Expect usual peak of 1 or 2. - maxNonces = 100 -) - -// CertOption is an optional argument type for Client methods which manipulate -// certificate data. -type CertOption interface { - privateCertOpt() -} - -// WithKey creates an option holding a private/public key pair. -// The private part signs a certificate, and the public part represents the signee. -func WithKey(key crypto.Signer) CertOption { - return &certOptKey{key} -} - -type certOptKey struct { - key crypto.Signer -} - -func (*certOptKey) privateCertOpt() {} - -// WithTemplate creates an option for specifying a certificate template. -// See x509.CreateCertificate for template usage details. -// -// In TLSSNIxChallengeCert methods, the template is also used as parent, -// resulting in a self-signed certificate. -// The DNSNames field of t is always overwritten for tls-sni challenge certs. -func WithTemplate(t *x509.Certificate) CertOption { - return (*certOptTemplate)(t) -} - -type certOptTemplate x509.Certificate - -func (*certOptTemplate) privateCertOpt() {} - -// Client is an ACME client. -// The only required field is Key. An example of creating a client with a new key -// is as follows: -// -// key, err := rsa.GenerateKey(rand.Reader, 2048) -// if err != nil { -// log.Fatal(err) -// } -// client := &Client{Key: key} -// -type Client struct { - // Key is the account key used to register with a CA and sign requests. - // Key.Public() must return a *rsa.PublicKey or *ecdsa.PublicKey. - Key crypto.Signer - - // HTTPClient optionally specifies an HTTP client to use - // instead of http.DefaultClient. - HTTPClient *http.Client - - // DirectoryURL points to the CA directory endpoint. - // If empty, LetsEncryptURL is used. - // Mutating this value after a successful call of Client's Discover method - // will have no effect. - DirectoryURL string - - dirMu sync.Mutex // guards writes to dir - dir *Directory // cached result of Client's Discover method - - noncesMu sync.Mutex - nonces map[string]struct{} // nonces collected from previous responses -} - -// Discover performs ACME server discovery using c.DirectoryURL. -// -// It caches successful result. So, subsequent calls will not result in -// a network round-trip. This also means mutating c.DirectoryURL after successful call -// of this method will have no effect. -func (c *Client) Discover(ctx context.Context) (Directory, error) { - c.dirMu.Lock() - defer c.dirMu.Unlock() - if c.dir != nil { - return *c.dir, nil - } - - dirURL := c.DirectoryURL - if dirURL == "" { - dirURL = LetsEncryptURL - } - res, err := c.get(ctx, dirURL) - if err != nil { - return Directory{}, err - } - defer res.Body.Close() - c.addNonce(res.Header) - if res.StatusCode != http.StatusOK { - return Directory{}, responseError(res) - } - - var v struct { - Reg string `json:"new-reg"` - Authz string `json:"new-authz"` - Cert string `json:"new-cert"` - Revoke string `json:"revoke-cert"` - Meta struct { - Terms string `json:"terms-of-service"` - Website string `json:"website"` - CAA []string `json:"caa-identities"` - } - } - if json.NewDecoder(res.Body).Decode(&v); err != nil { - return Directory{}, err - } - c.dir = &Directory{ - RegURL: v.Reg, - AuthzURL: v.Authz, - CertURL: v.Cert, - RevokeURL: v.Revoke, - Terms: v.Meta.Terms, - Website: v.Meta.Website, - CAA: v.Meta.CAA, - } - return *c.dir, nil -} - -// CreateCert requests a new certificate using the Certificate Signing Request csr encoded in DER format. -// The exp argument indicates the desired certificate validity duration. CA may issue a certificate -// with a different duration. -// If the bundle argument is true, the returned value will also contain the CA (issuer) certificate chain. -// -// In the case where CA server does not provide the issued certificate in the response, -// CreateCert will poll certURL using c.FetchCert, which will result in additional round-trips. -// In such scenario the caller can cancel the polling with ctx. -// -// CreateCert returns an error if the CA's response or chain was unreasonably large. -// Callers are encouraged to parse the returned value to ensure the certificate is valid and has the expected features. -func (c *Client) CreateCert(ctx context.Context, csr []byte, exp time.Duration, bundle bool) (der [][]byte, certURL string, err error) { - if _, err := c.Discover(ctx); err != nil { - return nil, "", err - } - - req := struct { - Resource string `json:"resource"` - CSR string `json:"csr"` - NotBefore string `json:"notBefore,omitempty"` - NotAfter string `json:"notAfter,omitempty"` - }{ - Resource: "new-cert", - CSR: base64.RawURLEncoding.EncodeToString(csr), - } - now := timeNow() - req.NotBefore = now.Format(time.RFC3339) - if exp > 0 { - req.NotAfter = now.Add(exp).Format(time.RFC3339) - } - - res, err := c.postJWS(ctx, c.Key, c.dir.CertURL, req) - if err != nil { - return nil, "", err - } - defer res.Body.Close() - if res.StatusCode != http.StatusCreated { - return nil, "", responseError(res) - } - - curl := res.Header.Get("location") // cert permanent URL - if res.ContentLength == 0 { - // no cert in the body; poll until we get it - cert, err := c.FetchCert(ctx, curl, bundle) - return cert, curl, err - } - // slurp issued cert and CA chain, if requested - cert, err := c.responseCert(ctx, res, bundle) - return cert, curl, err -} - -// FetchCert retrieves already issued certificate from the given url, in DER format. -// It retries the request until the certificate is successfully retrieved, -// context is cancelled by the caller or an error response is received. -// -// The returned value will also contain the CA (issuer) certificate if the bundle argument is true. -// -// FetchCert returns an error if the CA's response or chain was unreasonably large. -// Callers are encouraged to parse the returned value to ensure the certificate is valid -// and has expected features. -func (c *Client) FetchCert(ctx context.Context, url string, bundle bool) ([][]byte, error) { - for { - res, err := c.get(ctx, url) - if err != nil { - return nil, err - } - defer res.Body.Close() - if res.StatusCode == http.StatusOK { - return c.responseCert(ctx, res, bundle) - } - if res.StatusCode > 299 { - return nil, responseError(res) - } - d := retryAfter(res.Header.Get("retry-after"), 3*time.Second) - select { - case <-time.After(d): - // retry - case <-ctx.Done(): - return nil, ctx.Err() - } - } -} - -// RevokeCert revokes a previously issued certificate cert, provided in DER format. -// -// The key argument, used to sign the request, must be authorized -// to revoke the certificate. It's up to the CA to decide which keys are authorized. -// For instance, the key pair of the certificate may be authorized. -// If the key is nil, c.Key is used instead. -func (c *Client) RevokeCert(ctx context.Context, key crypto.Signer, cert []byte, reason CRLReasonCode) error { - if _, err := c.Discover(ctx); err != nil { - return err - } - - body := &struct { - Resource string `json:"resource"` - Cert string `json:"certificate"` - Reason int `json:"reason"` - }{ - Resource: "revoke-cert", - Cert: base64.RawURLEncoding.EncodeToString(cert), - Reason: int(reason), - } - if key == nil { - key = c.Key - } - res, err := c.postJWS(ctx, key, c.dir.RevokeURL, body) - if err != nil { - return err - } - defer res.Body.Close() - if res.StatusCode != http.StatusOK { - return responseError(res) - } - return nil -} - -// AcceptTOS always returns true to indicate the acceptance of a CA's Terms of Service -// during account registration. See Register method of Client for more details. -func AcceptTOS(tosURL string) bool { return true } - -// Register creates a new account registration by following the "new-reg" flow. -// It returns registered account. The a argument is not modified. -// -// The registration may require the caller to agree to the CA's Terms of Service (TOS). -// If so, and the account has not indicated the acceptance of the terms (see Account for details), -// Register calls prompt with a TOS URL provided by the CA. Prompt should report -// whether the caller agrees to the terms. To always accept the terms, the caller can use AcceptTOS. -func (c *Client) Register(ctx context.Context, a *Account, prompt func(tosURL string) bool) (*Account, error) { - if _, err := c.Discover(ctx); err != nil { - return nil, err - } - - var err error - if a, err = c.doReg(ctx, c.dir.RegURL, "new-reg", a); err != nil { - return nil, err - } - var accept bool - if a.CurrentTerms != "" && a.CurrentTerms != a.AgreedTerms { - accept = prompt(a.CurrentTerms) - } - if accept { - a.AgreedTerms = a.CurrentTerms - a, err = c.UpdateReg(ctx, a) - } - return a, err -} - -// GetReg retrieves an existing registration. -// The url argument is an Account URI. -func (c *Client) GetReg(ctx context.Context, url string) (*Account, error) { - a, err := c.doReg(ctx, url, "reg", nil) - if err != nil { - return nil, err - } - a.URI = url - return a, nil -} - -// UpdateReg updates an existing registration. -// It returns an updated account copy. The provided account is not modified. -func (c *Client) UpdateReg(ctx context.Context, a *Account) (*Account, error) { - uri := a.URI - a, err := c.doReg(ctx, uri, "reg", a) - if err != nil { - return nil, err - } - a.URI = uri - return a, nil -} - -// Authorize performs the initial step in an authorization flow. -// The caller will then need to choose from and perform a set of returned -// challenges using c.Accept in order to successfully complete authorization. -// -// If an authorization has been previously granted, the CA may return -// a valid authorization (Authorization.Status is StatusValid). If so, the caller -// need not fulfill any challenge and can proceed to requesting a certificate. -func (c *Client) Authorize(ctx context.Context, domain string) (*Authorization, error) { - if _, err := c.Discover(ctx); err != nil { - return nil, err - } - - type authzID struct { - Type string `json:"type"` - Value string `json:"value"` - } - req := struct { - Resource string `json:"resource"` - Identifier authzID `json:"identifier"` - }{ - Resource: "new-authz", - Identifier: authzID{Type: "dns", Value: domain}, - } - res, err := c.postJWS(ctx, c.Key, c.dir.AuthzURL, req) - if err != nil { - return nil, err - } - defer res.Body.Close() - if res.StatusCode != http.StatusCreated { - return nil, responseError(res) - } - - var v wireAuthz - if err := json.NewDecoder(res.Body).Decode(&v); err != nil { - return nil, fmt.Errorf("acme: invalid response: %v", err) - } - if v.Status != StatusPending && v.Status != StatusValid { - return nil, fmt.Errorf("acme: unexpected status: %s", v.Status) - } - return v.authorization(res.Header.Get("Location")), nil -} - -// GetAuthorization retrieves an authorization identified by the given URL. -// -// If a caller needs to poll an authorization until its status is final, -// see the WaitAuthorization method. -func (c *Client) GetAuthorization(ctx context.Context, url string) (*Authorization, error) { - res, err := c.get(ctx, url) - if err != nil { - return nil, err - } - defer res.Body.Close() - if res.StatusCode != http.StatusOK && res.StatusCode != http.StatusAccepted { - return nil, responseError(res) - } - var v wireAuthz - if err := json.NewDecoder(res.Body).Decode(&v); err != nil { - return nil, fmt.Errorf("acme: invalid response: %v", err) - } - return v.authorization(url), nil -} - -// RevokeAuthorization relinquishes an existing authorization identified -// by the given URL. -// The url argument is an Authorization.URI value. -// -// If successful, the caller will be required to obtain a new authorization -// using the Authorize method before being able to request a new certificate -// for the domain associated with the authorization. -// -// It does not revoke existing certificates. -func (c *Client) RevokeAuthorization(ctx context.Context, url string) error { - req := struct { - Resource string `json:"resource"` - Status string `json:"status"` - Delete bool `json:"delete"` - }{ - Resource: "authz", - Status: "deactivated", - Delete: true, - } - res, err := c.postJWS(ctx, c.Key, url, req) - if err != nil { - return err - } - defer res.Body.Close() - if res.StatusCode != http.StatusOK { - return responseError(res) - } - return nil -} - -// WaitAuthorization polls an authorization at the given URL -// until it is in one of the final states, StatusValid or StatusInvalid, -// or the context is done. -// -// It returns a non-nil Authorization only if its Status is StatusValid. -// In all other cases WaitAuthorization returns an error. -// If the Status is StatusInvalid, the returned error is ErrAuthorizationFailed. -func (c *Client) WaitAuthorization(ctx context.Context, url string) (*Authorization, error) { - var count int - sleep := func(v string, inc int) error { - count += inc - d := backoff(count, 10*time.Second) - d = retryAfter(v, d) - wakeup := time.NewTimer(d) - defer wakeup.Stop() - select { - case <-ctx.Done(): - return ctx.Err() - case <-wakeup.C: - return nil - } - } - - for { - res, err := c.get(ctx, url) - if err != nil { - return nil, err - } - retry := res.Header.Get("retry-after") - if res.StatusCode != http.StatusOK && res.StatusCode != http.StatusAccepted { - res.Body.Close() - if err := sleep(retry, 1); err != nil { - return nil, err - } - continue - } - var raw wireAuthz - err = json.NewDecoder(res.Body).Decode(&raw) - res.Body.Close() - if err != nil { - if err := sleep(retry, 0); err != nil { - return nil, err - } - continue - } - if raw.Status == StatusValid { - return raw.authorization(url), nil - } - if raw.Status == StatusInvalid { - return nil, ErrAuthorizationFailed - } - if err := sleep(retry, 0); err != nil { - return nil, err - } - } -} - -// GetChallenge retrieves the current status of an challenge. -// -// A client typically polls a challenge status using this method. -func (c *Client) GetChallenge(ctx context.Context, url string) (*Challenge, error) { - res, err := c.get(ctx, url) - if err != nil { - return nil, err - } - defer res.Body.Close() - if res.StatusCode != http.StatusOK && res.StatusCode != http.StatusAccepted { - return nil, responseError(res) - } - v := wireChallenge{URI: url} - if err := json.NewDecoder(res.Body).Decode(&v); err != nil { - return nil, fmt.Errorf("acme: invalid response: %v", err) - } - return v.challenge(), nil -} - -// Accept informs the server that the client accepts one of its challenges -// previously obtained with c.Authorize. -// -// The server will then perform the validation asynchronously. -func (c *Client) Accept(ctx context.Context, chal *Challenge) (*Challenge, error) { - auth, err := keyAuth(c.Key.Public(), chal.Token) - if err != nil { - return nil, err - } - - req := struct { - Resource string `json:"resource"` - Type string `json:"type"` - Auth string `json:"keyAuthorization"` - }{ - Resource: "challenge", - Type: chal.Type, - Auth: auth, - } - res, err := c.postJWS(ctx, c.Key, chal.URI, req) - if err != nil { - return nil, err - } - defer res.Body.Close() - // Note: the protocol specifies 200 as the expected response code, but - // letsencrypt seems to be returning 202. - if res.StatusCode != http.StatusOK && res.StatusCode != http.StatusAccepted { - return nil, responseError(res) - } - - var v wireChallenge - if err := json.NewDecoder(res.Body).Decode(&v); err != nil { - return nil, fmt.Errorf("acme: invalid response: %v", err) - } - return v.challenge(), nil -} - -// DNS01ChallengeRecord returns a DNS record value for a dns-01 challenge response. -// A TXT record containing the returned value must be provisioned under -// "_acme-challenge" name of the domain being validated. -// -// The token argument is a Challenge.Token value. -func (c *Client) DNS01ChallengeRecord(token string) (string, error) { - ka, err := keyAuth(c.Key.Public(), token) - if err != nil { - return "", err - } - b := sha256.Sum256([]byte(ka)) - return base64.RawURLEncoding.EncodeToString(b[:]), nil -} - -// HTTP01ChallengeResponse returns the response for an http-01 challenge. -// Servers should respond with the value to HTTP requests at the URL path -// provided by HTTP01ChallengePath to validate the challenge and prove control -// over a domain name. -// -// The token argument is a Challenge.Token value. -func (c *Client) HTTP01ChallengeResponse(token string) (string, error) { - return keyAuth(c.Key.Public(), token) -} - -// HTTP01ChallengePath returns the URL path at which the response for an http-01 challenge -// should be provided by the servers. -// The response value can be obtained with HTTP01ChallengeResponse. -// -// The token argument is a Challenge.Token value. -func (c *Client) HTTP01ChallengePath(token string) string { - return "/.well-known/acme-challenge/" + token -} - -// TLSSNI01ChallengeCert creates a certificate for TLS-SNI-01 challenge response. -// Servers can present the certificate to validate the challenge and prove control -// over a domain name. -// -// The implementation is incomplete in that the returned value is a single certificate, -// computed only for Z0 of the key authorization. ACME CAs are expected to update -// their implementations to use the newer version, TLS-SNI-02. -// For more details on TLS-SNI-01 see https://tools.ietf.org/html/draft-ietf-acme-acme-01#section-7.3. -// -// The token argument is a Challenge.Token value. -// If a WithKey option is provided, its private part signs the returned cert, -// and the public part is used to specify the signee. -// If no WithKey option is provided, a new ECDSA key is generated using P-256 curve. -// -// The returned certificate is valid for the next 24 hours and must be presented only when -// the server name of the client hello matches exactly the returned name value. -func (c *Client) TLSSNI01ChallengeCert(token string, opt ...CertOption) (cert tls.Certificate, name string, err error) { - ka, err := keyAuth(c.Key.Public(), token) - if err != nil { - return tls.Certificate{}, "", err - } - b := sha256.Sum256([]byte(ka)) - h := hex.EncodeToString(b[:]) - name = fmt.Sprintf("%s.%s.acme.invalid", h[:32], h[32:]) - cert, err = tlsChallengeCert([]string{name}, opt) - if err != nil { - return tls.Certificate{}, "", err - } - return cert, name, nil -} - -// TLSSNI02ChallengeCert creates a certificate for TLS-SNI-02 challenge response. -// Servers can present the certificate to validate the challenge and prove control -// over a domain name. For more details on TLS-SNI-02 see -// https://tools.ietf.org/html/draft-ietf-acme-acme-03#section-7.3. -// -// The token argument is a Challenge.Token value. -// If a WithKey option is provided, its private part signs the returned cert, -// and the public part is used to specify the signee. -// If no WithKey option is provided, a new ECDSA key is generated using P-256 curve. -// -// The returned certificate is valid for the next 24 hours and must be presented only when -// the server name in the client hello matches exactly the returned name value. -func (c *Client) TLSSNI02ChallengeCert(token string, opt ...CertOption) (cert tls.Certificate, name string, err error) { - b := sha256.Sum256([]byte(token)) - h := hex.EncodeToString(b[:]) - sanA := fmt.Sprintf("%s.%s.token.acme.invalid", h[:32], h[32:]) - - ka, err := keyAuth(c.Key.Public(), token) - if err != nil { - return tls.Certificate{}, "", err - } - b = sha256.Sum256([]byte(ka)) - h = hex.EncodeToString(b[:]) - sanB := fmt.Sprintf("%s.%s.ka.acme.invalid", h[:32], h[32:]) - - cert, err = tlsChallengeCert([]string{sanA, sanB}, opt) - if err != nil { - return tls.Certificate{}, "", err - } - return cert, sanA, nil -} - -// doReg sends all types of registration requests. -// The type of request is identified by typ argument, which is a "resource" -// in the ACME spec terms. -// -// A non-nil acct argument indicates whether the intention is to mutate data -// of the Account. Only Contact and Agreement of its fields are used -// in such cases. -func (c *Client) doReg(ctx context.Context, url string, typ string, acct *Account) (*Account, error) { - req := struct { - Resource string `json:"resource"` - Contact []string `json:"contact,omitempty"` - Agreement string `json:"agreement,omitempty"` - }{ - Resource: typ, - } - if acct != nil { - req.Contact = acct.Contact - req.Agreement = acct.AgreedTerms - } - res, err := c.postJWS(ctx, c.Key, url, req) - if err != nil { - return nil, err - } - defer res.Body.Close() - if res.StatusCode < 200 || res.StatusCode > 299 { - return nil, responseError(res) - } - - var v struct { - Contact []string - Agreement string - Authorizations string - Certificates string - } - if err := json.NewDecoder(res.Body).Decode(&v); err != nil { - return nil, fmt.Errorf("acme: invalid response: %v", err) - } - var tos string - if v := linkHeader(res.Header, "terms-of-service"); len(v) > 0 { - tos = v[0] - } - var authz string - if v := linkHeader(res.Header, "next"); len(v) > 0 { - authz = v[0] - } - return &Account{ - URI: res.Header.Get("Location"), - Contact: v.Contact, - AgreedTerms: v.Agreement, - CurrentTerms: tos, - Authz: authz, - Authorizations: v.Authorizations, - Certificates: v.Certificates, - }, nil -} - -// postJWS signs the body with the given key and POSTs it to the provided url. -// The body argument must be JSON-serializable. -func (c *Client) postJWS(ctx context.Context, key crypto.Signer, url string, body interface{}) (*http.Response, error) { - nonce, err := c.popNonce(ctx, url) - if err != nil { - return nil, err - } - b, err := jwsEncodeJSON(body, key, nonce) - if err != nil { - return nil, err - } - res, err := c.post(ctx, url, "application/jose+json", bytes.NewReader(b)) - if err != nil { - return nil, err - } - c.addNonce(res.Header) - return res, nil -} - -// popNonce returns a nonce value previously stored with c.addNonce -// or fetches a fresh one from the given URL. -func (c *Client) popNonce(ctx context.Context, url string) (string, error) { - c.noncesMu.Lock() - defer c.noncesMu.Unlock() - if len(c.nonces) == 0 { - return c.fetchNonce(ctx, url) - } - var nonce string - for nonce = range c.nonces { - delete(c.nonces, nonce) - break - } - return nonce, nil -} - -// addNonce stores a nonce value found in h (if any) for future use. -func (c *Client) addNonce(h http.Header) { - v := nonceFromHeader(h) - if v == "" { - return - } - c.noncesMu.Lock() - defer c.noncesMu.Unlock() - if len(c.nonces) >= maxNonces { - return - } - if c.nonces == nil { - c.nonces = make(map[string]struct{}) - } - c.nonces[v] = struct{}{} -} - -func (c *Client) httpClient() *http.Client { - if c.HTTPClient != nil { - return c.HTTPClient - } - return http.DefaultClient -} - -func (c *Client) get(ctx context.Context, urlStr string) (*http.Response, error) { - req, err := http.NewRequest("GET", urlStr, nil) - if err != nil { - return nil, err - } - return c.do(ctx, req) -} - -func (c *Client) head(ctx context.Context, urlStr string) (*http.Response, error) { - req, err := http.NewRequest("HEAD", urlStr, nil) - if err != nil { - return nil, err - } - return c.do(ctx, req) -} - -func (c *Client) post(ctx context.Context, urlStr, contentType string, body io.Reader) (*http.Response, error) { - req, err := http.NewRequest("POST", urlStr, body) - if err != nil { - return nil, err - } - req.Header.Set("Content-Type", contentType) - return c.do(ctx, req) -} - -func (c *Client) do(ctx context.Context, req *http.Request) (*http.Response, error) { - res, err := c.httpClient().Do(req.WithContext(ctx)) - if err != nil { - select { - case <-ctx.Done(): - // Prefer the unadorned context error. - // (The acme package had tests assuming this, previously from ctxhttp's - // behavior, predating net/http supporting contexts natively) - // TODO(bradfitz): reconsider this in the future. But for now this - // requires no test updates. - return nil, ctx.Err() - default: - return nil, err - } - } - return res, nil -} - -func (c *Client) fetchNonce(ctx context.Context, url string) (string, error) { - resp, err := c.head(ctx, url) - if err != nil { - return "", err - } - defer resp.Body.Close() - nonce := nonceFromHeader(resp.Header) - if nonce == "" { - if resp.StatusCode > 299 { - return "", responseError(resp) - } - return "", errors.New("acme: nonce not found") - } - return nonce, nil -} - -func nonceFromHeader(h http.Header) string { - return h.Get("Replay-Nonce") -} - -func (c *Client) responseCert(ctx context.Context, res *http.Response, bundle bool) ([][]byte, error) { - b, err := ioutil.ReadAll(io.LimitReader(res.Body, maxCertSize+1)) - if err != nil { - return nil, fmt.Errorf("acme: response stream: %v", err) - } - if len(b) > maxCertSize { - return nil, errors.New("acme: certificate is too big") - } - cert := [][]byte{b} - if !bundle { - return cert, nil - } - - // Append CA chain cert(s). - // At least one is required according to the spec: - // https://tools.ietf.org/html/draft-ietf-acme-acme-03#section-6.3.1 - up := linkHeader(res.Header, "up") - if len(up) == 0 { - return nil, errors.New("acme: rel=up link not found") - } - if len(up) > maxChainLen { - return nil, errors.New("acme: rel=up link is too large") - } - for _, url := range up { - cc, err := c.chainCert(ctx, url, 0) - if err != nil { - return nil, err - } - cert = append(cert, cc...) - } - return cert, nil -} - -// responseError creates an error of Error type from resp. -func responseError(resp *http.Response) error { - // don't care if ReadAll returns an error: - // json.Unmarshal will fail in that case anyway - b, _ := ioutil.ReadAll(resp.Body) - e := struct { - Status int - Type string - Detail string - }{ - Status: resp.StatusCode, - } - if err := json.Unmarshal(b, &e); err != nil { - // this is not a regular error response: - // populate detail with anything we received, - // e.Status will already contain HTTP response code value - e.Detail = string(b) - if e.Detail == "" { - e.Detail = resp.Status - } - } - return &Error{ - StatusCode: e.Status, - ProblemType: e.Type, - Detail: e.Detail, - Header: resp.Header, - } -} - -// chainCert fetches CA certificate chain recursively by following "up" links. -// Each recursive call increments the depth by 1, resulting in an error -// if the recursion level reaches maxChainLen. -// -// First chainCert call starts with depth of 0. -func (c *Client) chainCert(ctx context.Context, url string, depth int) ([][]byte, error) { - if depth >= maxChainLen { - return nil, errors.New("acme: certificate chain is too deep") - } - - res, err := c.get(ctx, url) - if err != nil { - return nil, err - } - defer res.Body.Close() - if res.StatusCode != http.StatusOK { - return nil, responseError(res) - } - b, err := ioutil.ReadAll(io.LimitReader(res.Body, maxCertSize+1)) - if err != nil { - return nil, err - } - if len(b) > maxCertSize { - return nil, errors.New("acme: certificate is too big") - } - chain := [][]byte{b} - - uplink := linkHeader(res.Header, "up") - if len(uplink) > maxChainLen { - return nil, errors.New("acme: certificate chain is too large") - } - for _, up := range uplink { - cc, err := c.chainCert(ctx, up, depth+1) - if err != nil { - return nil, err - } - chain = append(chain, cc...) - } - - return chain, nil -} - -// linkHeader returns URI-Reference values of all Link headers -// with relation-type rel. -// See https://tools.ietf.org/html/rfc5988#section-5 for details. -func linkHeader(h http.Header, rel string) []string { - var links []string - for _, v := range h["Link"] { - parts := strings.Split(v, ";") - for _, p := range parts { - p = strings.TrimSpace(p) - if !strings.HasPrefix(p, "rel=") { - continue - } - if v := strings.Trim(p[4:], `"`); v == rel { - links = append(links, strings.Trim(parts[0], "<>")) - } - } - } - return links -} - -// retryAfter parses a Retry-After HTTP header value, -// trying to convert v into an int (seconds) or use http.ParseTime otherwise. -// It returns d if v cannot be parsed. -func retryAfter(v string, d time.Duration) time.Duration { - if i, err := strconv.Atoi(v); err == nil { - return time.Duration(i) * time.Second - } - t, err := http.ParseTime(v) - if err != nil { - return d - } - return t.Sub(timeNow()) -} - -// backoff computes a duration after which an n+1 retry iteration should occur -// using truncated exponential backoff algorithm. -// -// The n argument is always bounded between 0 and 30. -// The max argument defines upper bound for the returned value. -func backoff(n int, max time.Duration) time.Duration { - if n < 0 { - n = 0 - } - if n > 30 { - n = 30 - } - var d time.Duration - if x, err := rand.Int(rand.Reader, big.NewInt(1000)); err == nil { - d = time.Duration(x.Int64()) * time.Millisecond - } - d += time.Duration(1< max { - return max - } - return d -} - -// keyAuth generates a key authorization string for a given token. -func keyAuth(pub crypto.PublicKey, token string) (string, error) { - th, err := JWKThumbprint(pub) - if err != nil { - return "", err - } - return fmt.Sprintf("%s.%s", token, th), nil -} - -// tlsChallengeCert creates a temporary certificate for TLS-SNI challenges -// with the given SANs and auto-generated public/private key pair. -// To create a cert with a custom key pair, specify WithKey option. -func tlsChallengeCert(san []string, opt []CertOption) (tls.Certificate, error) { - var ( - key crypto.Signer - tmpl *x509.Certificate - ) - for _, o := range opt { - switch o := o.(type) { - case *certOptKey: - if key != nil { - return tls.Certificate{}, errors.New("acme: duplicate key option") - } - key = o.key - case *certOptTemplate: - var t = *(*x509.Certificate)(o) // shallow copy is ok - tmpl = &t - default: - // package's fault, if we let this happen: - panic(fmt.Sprintf("unsupported option type %T", o)) - } - } - if key == nil { - var err error - if key, err = ecdsa.GenerateKey(elliptic.P256(), rand.Reader); err != nil { - return tls.Certificate{}, err - } - } - if tmpl == nil { - tmpl = &x509.Certificate{ - SerialNumber: big.NewInt(1), - NotBefore: time.Now(), - NotAfter: time.Now().Add(24 * time.Hour), - BasicConstraintsValid: true, - KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, - ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, - } - } - tmpl.DNSNames = san - - der, err := x509.CreateCertificate(rand.Reader, tmpl, tmpl, key.Public(), key) - if err != nil { - return tls.Certificate{}, err - } - return tls.Certificate{ - Certificate: [][]byte{der}, - PrivateKey: key, - }, nil -} - -// encodePEM returns b encoded as PEM with block of type typ. -func encodePEM(typ string, b []byte) []byte { - pb := &pem.Block{Type: typ, Bytes: b} - return pem.EncodeToMemory(pb) -} - -// timeNow is useful for testing for fixed current time. -var timeNow = time.Now diff --git a/vendor/golang.org/x/crypto/acme/acme_test.go b/vendor/golang.org/x/crypto/acme/acme_test.go deleted file mode 100644 index b91533df4..000000000 --- a/vendor/golang.org/x/crypto/acme/acme_test.go +++ /dev/null @@ -1,1305 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package acme - -import ( - "bytes" - "context" - "crypto/rand" - "crypto/rsa" - "crypto/tls" - "crypto/x509" - "crypto/x509/pkix" - "encoding/base64" - "encoding/json" - "fmt" - "io/ioutil" - "math/big" - "net/http" - "net/http/httptest" - "reflect" - "sort" - "strings" - "testing" - "time" -) - -// Decodes a JWS-encoded request and unmarshals the decoded JSON into a provided -// interface. -func decodeJWSRequest(t *testing.T, v interface{}, r *http.Request) { - // Decode request - var req struct{ Payload string } - if err := json.NewDecoder(r.Body).Decode(&req); err != nil { - t.Fatal(err) - } - payload, err := base64.RawURLEncoding.DecodeString(req.Payload) - if err != nil { - t.Fatal(err) - } - err = json.Unmarshal(payload, v) - if err != nil { - t.Fatal(err) - } -} - -type jwsHead struct { - Alg string - Nonce string - JWK map[string]string `json:"jwk"` -} - -func decodeJWSHead(r *http.Request) (*jwsHead, error) { - var req struct{ Protected string } - if err := json.NewDecoder(r.Body).Decode(&req); err != nil { - return nil, err - } - b, err := base64.RawURLEncoding.DecodeString(req.Protected) - if err != nil { - return nil, err - } - var head jwsHead - if err := json.Unmarshal(b, &head); err != nil { - return nil, err - } - return &head, nil -} - -func TestDiscover(t *testing.T) { - const ( - reg = "https://example.com/acme/new-reg" - authz = "https://example.com/acme/new-authz" - cert = "https://example.com/acme/new-cert" - revoke = "https://example.com/acme/revoke-cert" - ) - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("content-type", "application/json") - fmt.Fprintf(w, `{ - "new-reg": %q, - "new-authz": %q, - "new-cert": %q, - "revoke-cert": %q - }`, reg, authz, cert, revoke) - })) - defer ts.Close() - c := Client{DirectoryURL: ts.URL} - dir, err := c.Discover(context.Background()) - if err != nil { - t.Fatal(err) - } - if dir.RegURL != reg { - t.Errorf("dir.RegURL = %q; want %q", dir.RegURL, reg) - } - if dir.AuthzURL != authz { - t.Errorf("dir.AuthzURL = %q; want %q", dir.AuthzURL, authz) - } - if dir.CertURL != cert { - t.Errorf("dir.CertURL = %q; want %q", dir.CertURL, cert) - } - if dir.RevokeURL != revoke { - t.Errorf("dir.RevokeURL = %q; want %q", dir.RevokeURL, revoke) - } -} - -func TestRegister(t *testing.T) { - contacts := []string{"mailto:admin@example.com"} - - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.Method == "HEAD" { - w.Header().Set("replay-nonce", "test-nonce") - return - } - if r.Method != "POST" { - t.Errorf("r.Method = %q; want POST", r.Method) - } - - var j struct { - Resource string - Contact []string - Agreement string - } - decodeJWSRequest(t, &j, r) - - // Test request - if j.Resource != "new-reg" { - t.Errorf("j.Resource = %q; want new-reg", j.Resource) - } - if !reflect.DeepEqual(j.Contact, contacts) { - t.Errorf("j.Contact = %v; want %v", j.Contact, contacts) - } - - w.Header().Set("Location", "https://ca.tld/acme/reg/1") - w.Header().Set("Link", `;rel="next"`) - w.Header().Add("Link", `;rel="recover"`) - w.Header().Add("Link", `;rel="terms-of-service"`) - w.WriteHeader(http.StatusCreated) - b, _ := json.Marshal(contacts) - fmt.Fprintf(w, `{"contact": %s}`, b) - })) - defer ts.Close() - - prompt := func(url string) bool { - const terms = "https://ca.tld/acme/terms" - if url != terms { - t.Errorf("prompt url = %q; want %q", url, terms) - } - return false - } - - c := Client{Key: testKeyEC, dir: &Directory{RegURL: ts.URL}} - a := &Account{Contact: contacts} - var err error - if a, err = c.Register(context.Background(), a, prompt); err != nil { - t.Fatal(err) - } - if a.URI != "https://ca.tld/acme/reg/1" { - t.Errorf("a.URI = %q; want https://ca.tld/acme/reg/1", a.URI) - } - if a.Authz != "https://ca.tld/acme/new-authz" { - t.Errorf("a.Authz = %q; want https://ca.tld/acme/new-authz", a.Authz) - } - if a.CurrentTerms != "https://ca.tld/acme/terms" { - t.Errorf("a.CurrentTerms = %q; want https://ca.tld/acme/terms", a.CurrentTerms) - } - if !reflect.DeepEqual(a.Contact, contacts) { - t.Errorf("a.Contact = %v; want %v", a.Contact, contacts) - } -} - -func TestUpdateReg(t *testing.T) { - const terms = "https://ca.tld/acme/terms" - contacts := []string{"mailto:admin@example.com"} - - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.Method == "HEAD" { - w.Header().Set("replay-nonce", "test-nonce") - return - } - if r.Method != "POST" { - t.Errorf("r.Method = %q; want POST", r.Method) - } - - var j struct { - Resource string - Contact []string - Agreement string - } - decodeJWSRequest(t, &j, r) - - // Test request - if j.Resource != "reg" { - t.Errorf("j.Resource = %q; want reg", j.Resource) - } - if j.Agreement != terms { - t.Errorf("j.Agreement = %q; want %q", j.Agreement, terms) - } - if !reflect.DeepEqual(j.Contact, contacts) { - t.Errorf("j.Contact = %v; want %v", j.Contact, contacts) - } - - w.Header().Set("Link", `;rel="next"`) - w.Header().Add("Link", `;rel="recover"`) - w.Header().Add("Link", fmt.Sprintf(`<%s>;rel="terms-of-service"`, terms)) - w.WriteHeader(http.StatusOK) - b, _ := json.Marshal(contacts) - fmt.Fprintf(w, `{"contact":%s, "agreement":%q}`, b, terms) - })) - defer ts.Close() - - c := Client{Key: testKeyEC} - a := &Account{URI: ts.URL, Contact: contacts, AgreedTerms: terms} - var err error - if a, err = c.UpdateReg(context.Background(), a); err != nil { - t.Fatal(err) - } - if a.Authz != "https://ca.tld/acme/new-authz" { - t.Errorf("a.Authz = %q; want https://ca.tld/acme/new-authz", a.Authz) - } - if a.AgreedTerms != terms { - t.Errorf("a.AgreedTerms = %q; want %q", a.AgreedTerms, terms) - } - if a.CurrentTerms != terms { - t.Errorf("a.CurrentTerms = %q; want %q", a.CurrentTerms, terms) - } - if a.URI != ts.URL { - t.Errorf("a.URI = %q; want %q", a.URI, ts.URL) - } -} - -func TestGetReg(t *testing.T) { - const terms = "https://ca.tld/acme/terms" - const newTerms = "https://ca.tld/acme/new-terms" - contacts := []string{"mailto:admin@example.com"} - - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.Method == "HEAD" { - w.Header().Set("replay-nonce", "test-nonce") - return - } - if r.Method != "POST" { - t.Errorf("r.Method = %q; want POST", r.Method) - } - - var j struct { - Resource string - Contact []string - Agreement string - } - decodeJWSRequest(t, &j, r) - - // Test request - if j.Resource != "reg" { - t.Errorf("j.Resource = %q; want reg", j.Resource) - } - if len(j.Contact) != 0 { - t.Errorf("j.Contact = %v", j.Contact) - } - if j.Agreement != "" { - t.Errorf("j.Agreement = %q", j.Agreement) - } - - w.Header().Set("Link", `;rel="next"`) - w.Header().Add("Link", `;rel="recover"`) - w.Header().Add("Link", fmt.Sprintf(`<%s>;rel="terms-of-service"`, newTerms)) - w.WriteHeader(http.StatusOK) - b, _ := json.Marshal(contacts) - fmt.Fprintf(w, `{"contact":%s, "agreement":%q}`, b, terms) - })) - defer ts.Close() - - c := Client{Key: testKeyEC} - a, err := c.GetReg(context.Background(), ts.URL) - if err != nil { - t.Fatal(err) - } - if a.Authz != "https://ca.tld/acme/new-authz" { - t.Errorf("a.AuthzURL = %q; want https://ca.tld/acme/new-authz", a.Authz) - } - if a.AgreedTerms != terms { - t.Errorf("a.AgreedTerms = %q; want %q", a.AgreedTerms, terms) - } - if a.CurrentTerms != newTerms { - t.Errorf("a.CurrentTerms = %q; want %q", a.CurrentTerms, newTerms) - } - if a.URI != ts.URL { - t.Errorf("a.URI = %q; want %q", a.URI, ts.URL) - } -} - -func TestAuthorize(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.Method == "HEAD" { - w.Header().Set("replay-nonce", "test-nonce") - return - } - if r.Method != "POST" { - t.Errorf("r.Method = %q; want POST", r.Method) - } - - var j struct { - Resource string - Identifier struct { - Type string - Value string - } - } - decodeJWSRequest(t, &j, r) - - // Test request - if j.Resource != "new-authz" { - t.Errorf("j.Resource = %q; want new-authz", j.Resource) - } - if j.Identifier.Type != "dns" { - t.Errorf("j.Identifier.Type = %q; want dns", j.Identifier.Type) - } - if j.Identifier.Value != "example.com" { - t.Errorf("j.Identifier.Value = %q; want example.com", j.Identifier.Value) - } - - w.Header().Set("Location", "https://ca.tld/acme/auth/1") - w.WriteHeader(http.StatusCreated) - fmt.Fprintf(w, `{ - "identifier": {"type":"dns","value":"example.com"}, - "status":"pending", - "challenges":[ - { - "type":"http-01", - "status":"pending", - "uri":"https://ca.tld/acme/challenge/publickey/id1", - "token":"token1" - }, - { - "type":"tls-sni-01", - "status":"pending", - "uri":"https://ca.tld/acme/challenge/publickey/id2", - "token":"token2" - } - ], - "combinations":[[0],[1]]}`) - })) - defer ts.Close() - - cl := Client{Key: testKeyEC, dir: &Directory{AuthzURL: ts.URL}} - auth, err := cl.Authorize(context.Background(), "example.com") - if err != nil { - t.Fatal(err) - } - - if auth.URI != "https://ca.tld/acme/auth/1" { - t.Errorf("URI = %q; want https://ca.tld/acme/auth/1", auth.URI) - } - if auth.Status != "pending" { - t.Errorf("Status = %q; want pending", auth.Status) - } - if auth.Identifier.Type != "dns" { - t.Errorf("Identifier.Type = %q; want dns", auth.Identifier.Type) - } - if auth.Identifier.Value != "example.com" { - t.Errorf("Identifier.Value = %q; want example.com", auth.Identifier.Value) - } - - if n := len(auth.Challenges); n != 2 { - t.Fatalf("len(auth.Challenges) = %d; want 2", n) - } - - c := auth.Challenges[0] - if c.Type != "http-01" { - t.Errorf("c.Type = %q; want http-01", c.Type) - } - if c.URI != "https://ca.tld/acme/challenge/publickey/id1" { - t.Errorf("c.URI = %q; want https://ca.tld/acme/challenge/publickey/id1", c.URI) - } - if c.Token != "token1" { - t.Errorf("c.Token = %q; want token1", c.Type) - } - - c = auth.Challenges[1] - if c.Type != "tls-sni-01" { - t.Errorf("c.Type = %q; want tls-sni-01", c.Type) - } - if c.URI != "https://ca.tld/acme/challenge/publickey/id2" { - t.Errorf("c.URI = %q; want https://ca.tld/acme/challenge/publickey/id2", c.URI) - } - if c.Token != "token2" { - t.Errorf("c.Token = %q; want token2", c.Type) - } - - combs := [][]int{{0}, {1}} - if !reflect.DeepEqual(auth.Combinations, combs) { - t.Errorf("auth.Combinations: %+v\nwant: %+v\n", auth.Combinations, combs) - } -} - -func TestAuthorizeValid(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.Method == "HEAD" { - w.Header().Set("replay-nonce", "nonce") - return - } - w.WriteHeader(http.StatusCreated) - w.Write([]byte(`{"status":"valid"}`)) - })) - defer ts.Close() - client := Client{Key: testKey, dir: &Directory{AuthzURL: ts.URL}} - _, err := client.Authorize(context.Background(), "example.com") - if err != nil { - t.Errorf("err = %v", err) - } -} - -func TestGetAuthorization(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.Method != "GET" { - t.Errorf("r.Method = %q; want GET", r.Method) - } - - w.WriteHeader(http.StatusOK) - fmt.Fprintf(w, `{ - "identifier": {"type":"dns","value":"example.com"}, - "status":"pending", - "challenges":[ - { - "type":"http-01", - "status":"pending", - "uri":"https://ca.tld/acme/challenge/publickey/id1", - "token":"token1" - }, - { - "type":"tls-sni-01", - "status":"pending", - "uri":"https://ca.tld/acme/challenge/publickey/id2", - "token":"token2" - } - ], - "combinations":[[0],[1]]}`) - })) - defer ts.Close() - - cl := Client{Key: testKeyEC} - auth, err := cl.GetAuthorization(context.Background(), ts.URL) - if err != nil { - t.Fatal(err) - } - - if auth.Status != "pending" { - t.Errorf("Status = %q; want pending", auth.Status) - } - if auth.Identifier.Type != "dns" { - t.Errorf("Identifier.Type = %q; want dns", auth.Identifier.Type) - } - if auth.Identifier.Value != "example.com" { - t.Errorf("Identifier.Value = %q; want example.com", auth.Identifier.Value) - } - - if n := len(auth.Challenges); n != 2 { - t.Fatalf("len(set.Challenges) = %d; want 2", n) - } - - c := auth.Challenges[0] - if c.Type != "http-01" { - t.Errorf("c.Type = %q; want http-01", c.Type) - } - if c.URI != "https://ca.tld/acme/challenge/publickey/id1" { - t.Errorf("c.URI = %q; want https://ca.tld/acme/challenge/publickey/id1", c.URI) - } - if c.Token != "token1" { - t.Errorf("c.Token = %q; want token1", c.Type) - } - - c = auth.Challenges[1] - if c.Type != "tls-sni-01" { - t.Errorf("c.Type = %q; want tls-sni-01", c.Type) - } - if c.URI != "https://ca.tld/acme/challenge/publickey/id2" { - t.Errorf("c.URI = %q; want https://ca.tld/acme/challenge/publickey/id2", c.URI) - } - if c.Token != "token2" { - t.Errorf("c.Token = %q; want token2", c.Type) - } - - combs := [][]int{{0}, {1}} - if !reflect.DeepEqual(auth.Combinations, combs) { - t.Errorf("auth.Combinations: %+v\nwant: %+v\n", auth.Combinations, combs) - } -} - -func TestWaitAuthorization(t *testing.T) { - var count int - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - count++ - w.Header().Set("retry-after", "0") - if count > 1 { - fmt.Fprintf(w, `{"status":"valid"}`) - return - } - fmt.Fprintf(w, `{"status":"pending"}`) - })) - defer ts.Close() - - type res struct { - authz *Authorization - err error - } - done := make(chan res) - defer close(done) - go func() { - var client Client - a, err := client.WaitAuthorization(context.Background(), ts.URL) - done <- res{a, err} - }() - - select { - case <-time.After(5 * time.Second): - t.Fatal("WaitAuthz took too long to return") - case res := <-done: - if res.err != nil { - t.Fatalf("res.err = %v", res.err) - } - if res.authz == nil { - t.Fatal("res.authz is nil") - } - } -} - -func TestWaitAuthorizationInvalid(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - fmt.Fprintf(w, `{"status":"invalid"}`) - })) - defer ts.Close() - - res := make(chan error) - defer close(res) - go func() { - var client Client - _, err := client.WaitAuthorization(context.Background(), ts.URL) - res <- err - }() - - select { - case <-time.After(3 * time.Second): - t.Fatal("WaitAuthz took too long to return") - case err := <-res: - if err == nil { - t.Error("err is nil") - } - } -} - -func TestWaitAuthorizationCancel(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("retry-after", "60") - fmt.Fprintf(w, `{"status":"pending"}`) - })) - defer ts.Close() - - res := make(chan error) - defer close(res) - go func() { - var client Client - ctx, cancel := context.WithTimeout(context.Background(), 200*time.Millisecond) - defer cancel() - _, err := client.WaitAuthorization(ctx, ts.URL) - res <- err - }() - - select { - case <-time.After(time.Second): - t.Fatal("WaitAuthz took too long to return") - case err := <-res: - if err == nil { - t.Error("err is nil") - } - } -} - -func TestRevokeAuthorization(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.Method == "HEAD" { - w.Header().Set("replay-nonce", "nonce") - return - } - switch r.URL.Path { - case "/1": - var req struct { - Resource string - Status string - Delete bool - } - decodeJWSRequest(t, &req, r) - if req.Resource != "authz" { - t.Errorf("req.Resource = %q; want authz", req.Resource) - } - if req.Status != "deactivated" { - t.Errorf("req.Status = %q; want deactivated", req.Status) - } - if !req.Delete { - t.Errorf("req.Delete is false") - } - case "/2": - w.WriteHeader(http.StatusInternalServerError) - } - })) - defer ts.Close() - client := &Client{Key: testKey} - ctx := context.Background() - if err := client.RevokeAuthorization(ctx, ts.URL+"/1"); err != nil { - t.Errorf("err = %v", err) - } - if client.RevokeAuthorization(ctx, ts.URL+"/2") == nil { - t.Error("nil error") - } -} - -func TestPollChallenge(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.Method != "GET" { - t.Errorf("r.Method = %q; want GET", r.Method) - } - - w.WriteHeader(http.StatusOK) - fmt.Fprintf(w, `{ - "type":"http-01", - "status":"pending", - "uri":"https://ca.tld/acme/challenge/publickey/id1", - "token":"token1"}`) - })) - defer ts.Close() - - cl := Client{Key: testKeyEC} - chall, err := cl.GetChallenge(context.Background(), ts.URL) - if err != nil { - t.Fatal(err) - } - - if chall.Status != "pending" { - t.Errorf("Status = %q; want pending", chall.Status) - } - if chall.Type != "http-01" { - t.Errorf("c.Type = %q; want http-01", chall.Type) - } - if chall.URI != "https://ca.tld/acme/challenge/publickey/id1" { - t.Errorf("c.URI = %q; want https://ca.tld/acme/challenge/publickey/id1", chall.URI) - } - if chall.Token != "token1" { - t.Errorf("c.Token = %q; want token1", chall.Type) - } -} - -func TestAcceptChallenge(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.Method == "HEAD" { - w.Header().Set("replay-nonce", "test-nonce") - return - } - if r.Method != "POST" { - t.Errorf("r.Method = %q; want POST", r.Method) - } - - var j struct { - Resource string - Type string - Auth string `json:"keyAuthorization"` - } - decodeJWSRequest(t, &j, r) - - // Test request - if j.Resource != "challenge" { - t.Errorf(`resource = %q; want "challenge"`, j.Resource) - } - if j.Type != "http-01" { - t.Errorf(`type = %q; want "http-01"`, j.Type) - } - keyAuth := "token1." + testKeyECThumbprint - if j.Auth != keyAuth { - t.Errorf(`keyAuthorization = %q; want %q`, j.Auth, keyAuth) - } - - // Respond to request - w.WriteHeader(http.StatusAccepted) - fmt.Fprintf(w, `{ - "type":"http-01", - "status":"pending", - "uri":"https://ca.tld/acme/challenge/publickey/id1", - "token":"token1", - "keyAuthorization":%q - }`, keyAuth) - })) - defer ts.Close() - - cl := Client{Key: testKeyEC} - c, err := cl.Accept(context.Background(), &Challenge{ - URI: ts.URL, - Token: "token1", - Type: "http-01", - }) - if err != nil { - t.Fatal(err) - } - - if c.Type != "http-01" { - t.Errorf("c.Type = %q; want http-01", c.Type) - } - if c.URI != "https://ca.tld/acme/challenge/publickey/id1" { - t.Errorf("c.URI = %q; want https://ca.tld/acme/challenge/publickey/id1", c.URI) - } - if c.Token != "token1" { - t.Errorf("c.Token = %q; want token1", c.Type) - } -} - -func TestNewCert(t *testing.T) { - notBefore := time.Now() - notAfter := notBefore.AddDate(0, 2, 0) - timeNow = func() time.Time { return notBefore } - - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.Method == "HEAD" { - w.Header().Set("replay-nonce", "test-nonce") - return - } - if r.Method != "POST" { - t.Errorf("r.Method = %q; want POST", r.Method) - } - - var j struct { - Resource string `json:"resource"` - CSR string `json:"csr"` - NotBefore string `json:"notBefore,omitempty"` - NotAfter string `json:"notAfter,omitempty"` - } - decodeJWSRequest(t, &j, r) - - // Test request - if j.Resource != "new-cert" { - t.Errorf(`resource = %q; want "new-cert"`, j.Resource) - } - if j.NotBefore != notBefore.Format(time.RFC3339) { - t.Errorf(`notBefore = %q; wanted %q`, j.NotBefore, notBefore.Format(time.RFC3339)) - } - if j.NotAfter != notAfter.Format(time.RFC3339) { - t.Errorf(`notAfter = %q; wanted %q`, j.NotAfter, notAfter.Format(time.RFC3339)) - } - - // Respond to request - template := x509.Certificate{ - SerialNumber: big.NewInt(int64(1)), - Subject: pkix.Name{ - Organization: []string{"goacme"}, - }, - NotBefore: notBefore, - NotAfter: notAfter, - - KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, - ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, - BasicConstraintsValid: true, - } - - sampleCert, err := x509.CreateCertificate(rand.Reader, &template, &template, &testKeyEC.PublicKey, testKeyEC) - if err != nil { - t.Fatalf("Error creating certificate: %v", err) - } - - w.Header().Set("Location", "https://ca.tld/acme/cert/1") - w.WriteHeader(http.StatusCreated) - w.Write(sampleCert) - })) - defer ts.Close() - - csr := x509.CertificateRequest{ - Version: 0, - Subject: pkix.Name{ - CommonName: "example.com", - Organization: []string{"goacme"}, - }, - } - csrb, err := x509.CreateCertificateRequest(rand.Reader, &csr, testKeyEC) - if err != nil { - t.Fatal(err) - } - - c := Client{Key: testKeyEC, dir: &Directory{CertURL: ts.URL}} - cert, certURL, err := c.CreateCert(context.Background(), csrb, notAfter.Sub(notBefore), false) - if err != nil { - t.Fatal(err) - } - if cert == nil { - t.Errorf("cert is nil") - } - if certURL != "https://ca.tld/acme/cert/1" { - t.Errorf("certURL = %q; want https://ca.tld/acme/cert/1", certURL) - } -} - -func TestFetchCert(t *testing.T) { - var count byte - var ts *httptest.Server - ts = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - count++ - if count < 3 { - up := fmt.Sprintf("<%s>;rel=up", ts.URL) - w.Header().Set("link", up) - } - w.Write([]byte{count}) - })) - defer ts.Close() - res, err := (&Client{}).FetchCert(context.Background(), ts.URL, true) - if err != nil { - t.Fatalf("FetchCert: %v", err) - } - cert := [][]byte{{1}, {2}, {3}} - if !reflect.DeepEqual(res, cert) { - t.Errorf("res = %v; want %v", res, cert) - } -} - -func TestFetchCertRetry(t *testing.T) { - var count int - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if count < 1 { - w.Header().Set("retry-after", "0") - w.WriteHeader(http.StatusAccepted) - count++ - return - } - w.Write([]byte{1}) - })) - defer ts.Close() - res, err := (&Client{}).FetchCert(context.Background(), ts.URL, false) - if err != nil { - t.Fatalf("FetchCert: %v", err) - } - cert := [][]byte{{1}} - if !reflect.DeepEqual(res, cert) { - t.Errorf("res = %v; want %v", res, cert) - } -} - -func TestFetchCertCancel(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("retry-after", "0") - w.WriteHeader(http.StatusAccepted) - })) - defer ts.Close() - ctx, cancel := context.WithCancel(context.Background()) - done := make(chan struct{}) - var err error - go func() { - _, err = (&Client{}).FetchCert(ctx, ts.URL, false) - close(done) - }() - cancel() - <-done - if err != context.Canceled { - t.Errorf("err = %v; want %v", err, context.Canceled) - } -} - -func TestFetchCertDepth(t *testing.T) { - var count byte - var ts *httptest.Server - ts = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - count++ - if count > maxChainLen+1 { - t.Errorf("count = %d; want at most %d", count, maxChainLen+1) - w.WriteHeader(http.StatusInternalServerError) - } - w.Header().Set("link", fmt.Sprintf("<%s>;rel=up", ts.URL)) - w.Write([]byte{count}) - })) - defer ts.Close() - _, err := (&Client{}).FetchCert(context.Background(), ts.URL, true) - if err == nil { - t.Errorf("err is nil") - } -} - -func TestFetchCertBreadth(t *testing.T) { - var ts *httptest.Server - ts = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - for i := 0; i < maxChainLen+1; i++ { - w.Header().Add("link", fmt.Sprintf("<%s>;rel=up", ts.URL)) - } - w.Write([]byte{1}) - })) - defer ts.Close() - _, err := (&Client{}).FetchCert(context.Background(), ts.URL, true) - if err == nil { - t.Errorf("err is nil") - } -} - -func TestFetchCertSize(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - b := bytes.Repeat([]byte{1}, maxCertSize+1) - w.Write(b) - })) - defer ts.Close() - _, err := (&Client{}).FetchCert(context.Background(), ts.URL, false) - if err == nil { - t.Errorf("err is nil") - } -} - -func TestRevokeCert(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.Method == "HEAD" { - w.Header().Set("replay-nonce", "nonce") - return - } - - var req struct { - Resource string - Certificate string - Reason int - } - decodeJWSRequest(t, &req, r) - if req.Resource != "revoke-cert" { - t.Errorf("req.Resource = %q; want revoke-cert", req.Resource) - } - if req.Reason != 1 { - t.Errorf("req.Reason = %d; want 1", req.Reason) - } - // echo -n cert | base64 | tr -d '=' | tr '/+' '_-' - cert := "Y2VydA" - if req.Certificate != cert { - t.Errorf("req.Certificate = %q; want %q", req.Certificate, cert) - } - })) - defer ts.Close() - client := &Client{ - Key: testKeyEC, - dir: &Directory{RevokeURL: ts.URL}, - } - ctx := context.Background() - if err := client.RevokeCert(ctx, nil, []byte("cert"), CRLReasonKeyCompromise); err != nil { - t.Fatal(err) - } -} - -func TestNonce_add(t *testing.T) { - var c Client - c.addNonce(http.Header{"Replay-Nonce": {"nonce"}}) - c.addNonce(http.Header{"Replay-Nonce": {}}) - c.addNonce(http.Header{"Replay-Nonce": {"nonce"}}) - - nonces := map[string]struct{}{"nonce": struct{}{}} - if !reflect.DeepEqual(c.nonces, nonces) { - t.Errorf("c.nonces = %q; want %q", c.nonces, nonces) - } -} - -func TestNonce_addMax(t *testing.T) { - c := &Client{nonces: make(map[string]struct{})} - for i := 0; i < maxNonces; i++ { - c.nonces[fmt.Sprintf("%d", i)] = struct{}{} - } - c.addNonce(http.Header{"Replay-Nonce": {"nonce"}}) - if n := len(c.nonces); n != maxNonces { - t.Errorf("len(c.nonces) = %d; want %d", n, maxNonces) - } -} - -func TestNonce_fetch(t *testing.T) { - tests := []struct { - code int - nonce string - }{ - {http.StatusOK, "nonce1"}, - {http.StatusBadRequest, "nonce2"}, - {http.StatusOK, ""}, - } - var i int - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.Method != "HEAD" { - t.Errorf("%d: r.Method = %q; want HEAD", i, r.Method) - } - w.Header().Set("replay-nonce", tests[i].nonce) - w.WriteHeader(tests[i].code) - })) - defer ts.Close() - for ; i < len(tests); i++ { - test := tests[i] - c := &Client{} - n, err := c.fetchNonce(context.Background(), ts.URL) - if n != test.nonce { - t.Errorf("%d: n=%q; want %q", i, n, test.nonce) - } - switch { - case err == nil && test.nonce == "": - t.Errorf("%d: n=%q, err=%v; want non-nil error", i, n, err) - case err != nil && test.nonce != "": - t.Errorf("%d: n=%q, err=%v; want %q", i, n, err, test.nonce) - } - } -} - -func TestNonce_fetchError(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusTooManyRequests) - })) - defer ts.Close() - c := &Client{} - _, err := c.fetchNonce(context.Background(), ts.URL) - e, ok := err.(*Error) - if !ok { - t.Fatalf("err is %T; want *Error", err) - } - if e.StatusCode != http.StatusTooManyRequests { - t.Errorf("e.StatusCode = %d; want %d", e.StatusCode, http.StatusTooManyRequests) - } -} - -func TestNonce_postJWS(t *testing.T) { - var count int - seen := make(map[string]bool) - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - count++ - w.Header().Set("replay-nonce", fmt.Sprintf("nonce%d", count)) - if r.Method == "HEAD" { - // We expect the client do a HEAD request - // but only to fetch the first nonce. - return - } - // Make client.Authorize happy; we're not testing its result. - defer func() { - w.WriteHeader(http.StatusCreated) - w.Write([]byte(`{"status":"valid"}`)) - }() - - head, err := decodeJWSHead(r) - if err != nil { - t.Errorf("decodeJWSHead: %v", err) - return - } - if head.Nonce == "" { - t.Error("head.Nonce is empty") - return - } - if seen[head.Nonce] { - t.Errorf("nonce is already used: %q", head.Nonce) - } - seen[head.Nonce] = true - })) - defer ts.Close() - - client := Client{Key: testKey, dir: &Directory{AuthzURL: ts.URL}} - if _, err := client.Authorize(context.Background(), "example.com"); err != nil { - t.Errorf("client.Authorize 1: %v", err) - } - // The second call should not generate another extra HEAD request. - if _, err := client.Authorize(context.Background(), "example.com"); err != nil { - t.Errorf("client.Authorize 2: %v", err) - } - - if count != 3 { - t.Errorf("total requests count: %d; want 3", count) - } - if n := len(client.nonces); n != 1 { - t.Errorf("len(client.nonces) = %d; want 1", n) - } - for k := range seen { - if _, exist := client.nonces[k]; exist { - t.Errorf("used nonce %q in client.nonces", k) - } - } -} - -func TestLinkHeader(t *testing.T) { - h := http.Header{"Link": { - `;rel="next"`, - `; rel=recover`, - `; foo=bar; rel="terms-of-service"`, - `;rel="next"`, - }} - tests := []struct { - rel string - out []string - }{ - {"next", []string{"https://example.com/acme/new-authz", "dup"}}, - {"recover", []string{"https://example.com/acme/recover-reg"}}, - {"terms-of-service", []string{"https://example.com/acme/terms"}}, - {"empty", nil}, - } - for i, test := range tests { - if v := linkHeader(h, test.rel); !reflect.DeepEqual(v, test.out) { - t.Errorf("%d: linkHeader(%q): %v; want %v", i, test.rel, v, test.out) - } - } -} - -func TestErrorResponse(t *testing.T) { - s := `{ - "status": 400, - "type": "urn:acme:error:xxx", - "detail": "text" - }` - res := &http.Response{ - StatusCode: 400, - Status: "400 Bad Request", - Body: ioutil.NopCloser(strings.NewReader(s)), - Header: http.Header{"X-Foo": {"bar"}}, - } - err := responseError(res) - v, ok := err.(*Error) - if !ok { - t.Fatalf("err = %+v (%T); want *Error type", err, err) - } - if v.StatusCode != 400 { - t.Errorf("v.StatusCode = %v; want 400", v.StatusCode) - } - if v.ProblemType != "urn:acme:error:xxx" { - t.Errorf("v.ProblemType = %q; want urn:acme:error:xxx", v.ProblemType) - } - if v.Detail != "text" { - t.Errorf("v.Detail = %q; want text", v.Detail) - } - if !reflect.DeepEqual(v.Header, res.Header) { - t.Errorf("v.Header = %+v; want %+v", v.Header, res.Header) - } -} - -func TestTLSSNI01ChallengeCert(t *testing.T) { - const ( - token = "evaGxfADs6pSRb2LAv9IZf17Dt3juxGJ-PCt92wr-oA" - // echo -n | shasum -a 256 - san = "dbbd5eefe7b4d06eb9d1d9f5acb4c7cd.a27d320e4b30332f0b6cb441734ad7b0.acme.invalid" - ) - - client := &Client{Key: testKeyEC} - tlscert, name, err := client.TLSSNI01ChallengeCert(token) - if err != nil { - t.Fatal(err) - } - - if n := len(tlscert.Certificate); n != 1 { - t.Fatalf("len(tlscert.Certificate) = %d; want 1", n) - } - cert, err := x509.ParseCertificate(tlscert.Certificate[0]) - if err != nil { - t.Fatal(err) - } - if len(cert.DNSNames) != 1 || cert.DNSNames[0] != san { - t.Fatalf("cert.DNSNames = %v; want %q", cert.DNSNames, san) - } - if cert.DNSNames[0] != name { - t.Errorf("cert.DNSNames[0] != name: %q vs %q", cert.DNSNames[0], name) - } -} - -func TestTLSSNI02ChallengeCert(t *testing.T) { - const ( - token = "evaGxfADs6pSRb2LAv9IZf17Dt3juxGJ-PCt92wr-oA" - // echo -n evaGxfADs6pSRb2LAv9IZf17Dt3juxGJ-PCt92wr-oA | shasum -a 256 - sanA = "7ea0aaa69214e71e02cebb18bb867736.09b730209baabf60e43d4999979ff139.token.acme.invalid" - // echo -n | shasum -a 256 - sanB = "dbbd5eefe7b4d06eb9d1d9f5acb4c7cd.a27d320e4b30332f0b6cb441734ad7b0.ka.acme.invalid" - ) - - client := &Client{Key: testKeyEC} - tlscert, name, err := client.TLSSNI02ChallengeCert(token) - if err != nil { - t.Fatal(err) - } - - if n := len(tlscert.Certificate); n != 1 { - t.Fatalf("len(tlscert.Certificate) = %d; want 1", n) - } - cert, err := x509.ParseCertificate(tlscert.Certificate[0]) - if err != nil { - t.Fatal(err) - } - names := []string{sanA, sanB} - if !reflect.DeepEqual(cert.DNSNames, names) { - t.Fatalf("cert.DNSNames = %v;\nwant %v", cert.DNSNames, names) - } - sort.Strings(cert.DNSNames) - i := sort.SearchStrings(cert.DNSNames, name) - if i >= len(cert.DNSNames) || cert.DNSNames[i] != name { - t.Errorf("%v doesn't have %q", cert.DNSNames, name) - } -} - -func TestTLSChallengeCertOpt(t *testing.T) { - key, err := rsa.GenerateKey(rand.Reader, 512) - if err != nil { - t.Fatal(err) - } - tmpl := &x509.Certificate{ - SerialNumber: big.NewInt(2), - Subject: pkix.Name{Organization: []string{"Test"}}, - DNSNames: []string{"should-be-overwritten"}, - } - opts := []CertOption{WithKey(key), WithTemplate(tmpl)} - - client := &Client{Key: testKeyEC} - cert1, _, err := client.TLSSNI01ChallengeCert("token", opts...) - if err != nil { - t.Fatal(err) - } - cert2, _, err := client.TLSSNI02ChallengeCert("token", opts...) - if err != nil { - t.Fatal(err) - } - - for i, tlscert := range []tls.Certificate{cert1, cert2} { - // verify generated cert private key - tlskey, ok := tlscert.PrivateKey.(*rsa.PrivateKey) - if !ok { - t.Errorf("%d: tlscert.PrivateKey is %T; want *rsa.PrivateKey", i, tlscert.PrivateKey) - continue - } - if tlskey.D.Cmp(key.D) != 0 { - t.Errorf("%d: tlskey.D = %v; want %v", i, tlskey.D, key.D) - } - // verify generated cert public key - x509Cert, err := x509.ParseCertificate(tlscert.Certificate[0]) - if err != nil { - t.Errorf("%d: %v", i, err) - continue - } - tlspub, ok := x509Cert.PublicKey.(*rsa.PublicKey) - if !ok { - t.Errorf("%d: x509Cert.PublicKey is %T; want *rsa.PublicKey", i, x509Cert.PublicKey) - continue - } - if tlspub.N.Cmp(key.N) != 0 { - t.Errorf("%d: tlspub.N = %v; want %v", i, tlspub.N, key.N) - } - // verify template option - sn := big.NewInt(2) - if x509Cert.SerialNumber.Cmp(sn) != 0 { - t.Errorf("%d: SerialNumber = %v; want %v", i, x509Cert.SerialNumber, sn) - } - org := []string{"Test"} - if !reflect.DeepEqual(x509Cert.Subject.Organization, org) { - t.Errorf("%d: Subject.Organization = %+v; want %+v", i, x509Cert.Subject.Organization, org) - } - for _, v := range x509Cert.DNSNames { - if !strings.HasSuffix(v, ".acme.invalid") { - t.Errorf("%d: invalid DNSNames element: %q", i, v) - } - } - } -} - -func TestHTTP01Challenge(t *testing.T) { - const ( - token = "xxx" - // thumbprint is precomputed for testKeyEC in jws_test.go - value = token + "." + testKeyECThumbprint - urlpath = "/.well-known/acme-challenge/" + token - ) - client := &Client{Key: testKeyEC} - val, err := client.HTTP01ChallengeResponse(token) - if err != nil { - t.Fatal(err) - } - if val != value { - t.Errorf("val = %q; want %q", val, value) - } - if path := client.HTTP01ChallengePath(token); path != urlpath { - t.Errorf("path = %q; want %q", path, urlpath) - } -} - -func TestDNS01ChallengeRecord(t *testing.T) { - // echo -n xxx. | \ - // openssl dgst -binary -sha256 | \ - // base64 | tr -d '=' | tr '/+' '_-' - const value = "8DERMexQ5VcdJ_prpPiA0mVdp7imgbCgjsG4SqqNMIo" - - client := &Client{Key: testKeyEC} - val, err := client.DNS01ChallengeRecord("xxx") - if err != nil { - t.Fatal(err) - } - if val != value { - t.Errorf("val = %q; want %q", val, value) - } -} - -func TestBackoff(t *testing.T) { - tt := []struct{ min, max time.Duration }{ - {time.Second, 2 * time.Second}, - {2 * time.Second, 3 * time.Second}, - {4 * time.Second, 5 * time.Second}, - {8 * time.Second, 9 * time.Second}, - } - for i, test := range tt { - d := backoff(i, time.Minute) - if d < test.min || test.max < d { - t.Errorf("%d: d = %v; want between %v and %v", i, d, test.min, test.max) - } - } - - min, max := time.Second, 2*time.Second - if d := backoff(-1, time.Minute); d < min || max < d { - t.Errorf("d = %v; want between %v and %v", d, min, max) - } - - bound := 10 * time.Second - if d := backoff(100, bound); d != bound { - t.Errorf("d = %v; want %v", d, bound) - } -} diff --git a/vendor/golang.org/x/crypto/acme/autocert/autocert.go b/vendor/golang.org/x/crypto/acme/autocert/autocert.go deleted file mode 100644 index f50c88e82..000000000 --- a/vendor/golang.org/x/crypto/acme/autocert/autocert.go +++ /dev/null @@ -1,792 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package autocert provides automatic access to certificates from Let's Encrypt -// and any other ACME-based CA. -// -// This package is a work in progress and makes no API stability promises. -package autocert - -import ( - "bytes" - "context" - "crypto" - "crypto/ecdsa" - "crypto/elliptic" - "crypto/rand" - "crypto/rsa" - "crypto/tls" - "crypto/x509" - "crypto/x509/pkix" - "encoding/pem" - "errors" - "fmt" - "io" - mathrand "math/rand" - "net/http" - "strconv" - "strings" - "sync" - "time" - - "golang.org/x/crypto/acme" -) - -// pseudoRand is safe for concurrent use. -var pseudoRand *lockedMathRand - -func init() { - src := mathrand.NewSource(timeNow().UnixNano()) - pseudoRand = &lockedMathRand{rnd: mathrand.New(src)} -} - -// AcceptTOS is a Manager.Prompt function that always returns true to -// indicate acceptance of the CA's Terms of Service during account -// registration. -func AcceptTOS(tosURL string) bool { return true } - -// HostPolicy specifies which host names the Manager is allowed to respond to. -// It returns a non-nil error if the host should be rejected. -// The returned error is accessible via tls.Conn.Handshake and its callers. -// See Manager's HostPolicy field and GetCertificate method docs for more details. -type HostPolicy func(ctx context.Context, host string) error - -// HostWhitelist returns a policy where only the specified host names are allowed. -// Only exact matches are currently supported. Subdomains, regexp or wildcard -// will not match. -func HostWhitelist(hosts ...string) HostPolicy { - whitelist := make(map[string]bool, len(hosts)) - for _, h := range hosts { - whitelist[h] = true - } - return func(_ context.Context, host string) error { - if !whitelist[host] { - return errors.New("acme/autocert: host not configured") - } - return nil - } -} - -// defaultHostPolicy is used when Manager.HostPolicy is not set. -func defaultHostPolicy(context.Context, string) error { - return nil -} - -// Manager is a stateful certificate manager built on top of acme.Client. -// It obtains and refreshes certificates automatically, -// as well as providing them to a TLS server via tls.Config. -// -// A simple usage example: -// -// m := autocert.Manager{ -// Prompt: autocert.AcceptTOS, -// HostPolicy: autocert.HostWhitelist("example.org"), -// } -// s := &http.Server{ -// Addr: ":https", -// TLSConfig: &tls.Config{GetCertificate: m.GetCertificate}, -// } -// s.ListenAndServeTLS("", "") -// -// To preserve issued certificates and improve overall performance, -// use a cache implementation of Cache. For instance, DirCache. -type Manager struct { - // Prompt specifies a callback function to conditionally accept a CA's Terms of Service (TOS). - // The registration may require the caller to agree to the CA's TOS. - // If so, Manager calls Prompt with a TOS URL provided by the CA. Prompt should report - // whether the caller agrees to the terms. - // - // To always accept the terms, the callers can use AcceptTOS. - Prompt func(tosURL string) bool - - // Cache optionally stores and retrieves previously-obtained certificates. - // If nil, certs will only be cached for the lifetime of the Manager. - // - // Manager passes the Cache certificates data encoded in PEM, with private/public - // parts combined in a single Cache.Put call, private key first. - Cache Cache - - // HostPolicy controls which domains the Manager will attempt - // to retrieve new certificates for. It does not affect cached certs. - // - // If non-nil, HostPolicy is called before requesting a new cert. - // If nil, all hosts are currently allowed. This is not recommended, - // as it opens a potential attack where clients connect to a server - // by IP address and pretend to be asking for an incorrect host name. - // Manager will attempt to obtain a certificate for that host, incorrectly, - // eventually reaching the CA's rate limit for certificate requests - // and making it impossible to obtain actual certificates. - // - // See GetCertificate for more details. - HostPolicy HostPolicy - - // RenewBefore optionally specifies how early certificates should - // be renewed before they expire. - // - // If zero, they're renewed 1 week before expiration. - RenewBefore time.Duration - - // Client is used to perform low-level operations, such as account registration - // and requesting new certificates. - // If Client is nil, a zero-value acme.Client is used with acme.LetsEncryptURL - // directory endpoint and a newly-generated ECDSA P-256 key. - // - // Mutating the field after the first call of GetCertificate method will have no effect. - Client *acme.Client - - // Email optionally specifies a contact email address. - // This is used by CAs, such as Let's Encrypt, to notify about problems - // with issued certificates. - // - // If the Client's account key is already registered, Email is not used. - Email string - - // ForceRSA makes the Manager generate certificates with 2048-bit RSA keys. - // - // If false, a default is used. Currently the default - // is EC-based keys using the P-256 curve. - ForceRSA bool - - clientMu sync.Mutex - client *acme.Client // initialized by acmeClient method - - stateMu sync.Mutex - state map[string]*certState // keyed by domain name - - // tokenCert is keyed by token domain name, which matches server name - // of ClientHello. Keys always have ".acme.invalid" suffix. - tokenCertMu sync.RWMutex - tokenCert map[string]*tls.Certificate - - // renewal tracks the set of domains currently running renewal timers. - // It is keyed by domain name. - renewalMu sync.Mutex - renewal map[string]*domainRenewal -} - -// GetCertificate implements the tls.Config.GetCertificate hook. -// It provides a TLS certificate for hello.ServerName host, including answering -// *.acme.invalid (TLS-SNI) challenges. All other fields of hello are ignored. -// -// If m.HostPolicy is non-nil, GetCertificate calls the policy before requesting -// a new cert. A non-nil error returned from m.HostPolicy halts TLS negotiation. -// The error is propagated back to the caller of GetCertificate and is user-visible. -// This does not affect cached certs. See HostPolicy field description for more details. -func (m *Manager) GetCertificate(hello *tls.ClientHelloInfo) (*tls.Certificate, error) { - name := hello.ServerName - if name == "" { - return nil, errors.New("acme/autocert: missing server name") - } - - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute) - defer cancel() - - // check whether this is a token cert requested for TLS-SNI challenge - if strings.HasSuffix(name, ".acme.invalid") { - m.tokenCertMu.RLock() - defer m.tokenCertMu.RUnlock() - if cert := m.tokenCert[name]; cert != nil { - return cert, nil - } - if cert, err := m.cacheGet(ctx, name); err == nil { - return cert, nil - } - // TODO: cache error results? - return nil, fmt.Errorf("acme/autocert: no token cert for %q", name) - } - - // regular domain - name = strings.TrimSuffix(name, ".") // golang.org/issue/18114 - cert, err := m.cert(ctx, name) - if err == nil { - return cert, nil - } - if err != ErrCacheMiss { - return nil, err - } - - // first-time - if err := m.hostPolicy()(ctx, name); err != nil { - return nil, err - } - cert, err = m.createCert(ctx, name) - if err != nil { - return nil, err - } - m.cachePut(ctx, name, cert) - return cert, nil -} - -// cert returns an existing certificate either from m.state or cache. -// If a certificate is found in cache but not in m.state, the latter will be filled -// with the cached value. -func (m *Manager) cert(ctx context.Context, name string) (*tls.Certificate, error) { - m.stateMu.Lock() - if s, ok := m.state[name]; ok { - m.stateMu.Unlock() - s.RLock() - defer s.RUnlock() - return s.tlscert() - } - defer m.stateMu.Unlock() - cert, err := m.cacheGet(ctx, name) - if err != nil { - return nil, err - } - signer, ok := cert.PrivateKey.(crypto.Signer) - if !ok { - return nil, errors.New("acme/autocert: private key cannot sign") - } - if m.state == nil { - m.state = make(map[string]*certState) - } - s := &certState{ - key: signer, - cert: cert.Certificate, - leaf: cert.Leaf, - } - m.state[name] = s - go m.renew(name, s.key, s.leaf.NotAfter) - return cert, nil -} - -// cacheGet always returns a valid certificate, or an error otherwise. -func (m *Manager) cacheGet(ctx context.Context, domain string) (*tls.Certificate, error) { - if m.Cache == nil { - return nil, ErrCacheMiss - } - data, err := m.Cache.Get(ctx, domain) - if err != nil { - return nil, err - } - - // private - priv, pub := pem.Decode(data) - if priv == nil || !strings.Contains(priv.Type, "PRIVATE") { - return nil, errors.New("acme/autocert: no private key found in cache") - } - privKey, err := parsePrivateKey(priv.Bytes) - if err != nil { - return nil, err - } - - // public - var pubDER [][]byte - for len(pub) > 0 { - var b *pem.Block - b, pub = pem.Decode(pub) - if b == nil { - break - } - pubDER = append(pubDER, b.Bytes) - } - if len(pub) > 0 { - return nil, errors.New("acme/autocert: invalid public key") - } - - // verify and create TLS cert - leaf, err := validCert(domain, pubDER, privKey) - if err != nil { - return nil, err - } - tlscert := &tls.Certificate{ - Certificate: pubDER, - PrivateKey: privKey, - Leaf: leaf, - } - return tlscert, nil -} - -func (m *Manager) cachePut(ctx context.Context, domain string, tlscert *tls.Certificate) error { - if m.Cache == nil { - return nil - } - - // contains PEM-encoded data - var buf bytes.Buffer - - // private - switch key := tlscert.PrivateKey.(type) { - case *ecdsa.PrivateKey: - if err := encodeECDSAKey(&buf, key); err != nil { - return err - } - case *rsa.PrivateKey: - b := x509.MarshalPKCS1PrivateKey(key) - pb := &pem.Block{Type: "RSA PRIVATE KEY", Bytes: b} - if err := pem.Encode(&buf, pb); err != nil { - return err - } - default: - return errors.New("acme/autocert: unknown private key type") - } - - // public - for _, b := range tlscert.Certificate { - pb := &pem.Block{Type: "CERTIFICATE", Bytes: b} - if err := pem.Encode(&buf, pb); err != nil { - return err - } - } - - return m.Cache.Put(ctx, domain, buf.Bytes()) -} - -func encodeECDSAKey(w io.Writer, key *ecdsa.PrivateKey) error { - b, err := x509.MarshalECPrivateKey(key) - if err != nil { - return err - } - pb := &pem.Block{Type: "EC PRIVATE KEY", Bytes: b} - return pem.Encode(w, pb) -} - -// createCert starts the domain ownership verification and returns a certificate -// for that domain upon success. -// -// If the domain is already being verified, it waits for the existing verification to complete. -// Either way, createCert blocks for the duration of the whole process. -func (m *Manager) createCert(ctx context.Context, domain string) (*tls.Certificate, error) { - // TODO: maybe rewrite this whole piece using sync.Once - state, err := m.certState(domain) - if err != nil { - return nil, err - } - // state may exist if another goroutine is already working on it - // in which case just wait for it to finish - if !state.locked { - state.RLock() - defer state.RUnlock() - return state.tlscert() - } - - // We are the first; state is locked. - // Unblock the readers when domain ownership is verified - // and the we got the cert or the process failed. - defer state.Unlock() - state.locked = false - - der, leaf, err := m.authorizedCert(ctx, state.key, domain) - if err != nil { - return nil, err - } - state.cert = der - state.leaf = leaf - go m.renew(domain, state.key, state.leaf.NotAfter) - return state.tlscert() -} - -// certState returns a new or existing certState. -// If a new certState is returned, state.exist is false and the state is locked. -// The returned error is non-nil only in the case where a new state could not be created. -func (m *Manager) certState(domain string) (*certState, error) { - m.stateMu.Lock() - defer m.stateMu.Unlock() - if m.state == nil { - m.state = make(map[string]*certState) - } - // existing state - if state, ok := m.state[domain]; ok { - return state, nil - } - - // new locked state - var ( - err error - key crypto.Signer - ) - if m.ForceRSA { - key, err = rsa.GenerateKey(rand.Reader, 2048) - } else { - key, err = ecdsa.GenerateKey(elliptic.P256(), rand.Reader) - } - if err != nil { - return nil, err - } - - state := &certState{ - key: key, - locked: true, - } - state.Lock() // will be unlocked by m.certState caller - m.state[domain] = state - return state, nil -} - -// authorizedCert starts domain ownership verification process and requests a new cert upon success. -// The key argument is the certificate private key. -func (m *Manager) authorizedCert(ctx context.Context, key crypto.Signer, domain string) (der [][]byte, leaf *x509.Certificate, err error) { - // TODO: make m.verify retry or retry m.verify calls here - if err := m.verify(ctx, domain); err != nil { - return nil, nil, err - } - client, err := m.acmeClient(ctx) - if err != nil { - return nil, nil, err - } - csr, err := certRequest(key, domain) - if err != nil { - return nil, nil, err - } - der, _, err = client.CreateCert(ctx, csr, 0, true) - if err != nil { - return nil, nil, err - } - leaf, err = validCert(domain, der, key) - if err != nil { - return nil, nil, err - } - return der, leaf, nil -} - -// verify starts a new identifier (domain) authorization flow. -// It prepares a challenge response and then blocks until the authorization -// is marked as "completed" by the CA (either succeeded or failed). -// -// verify returns nil iff the verification was successful. -func (m *Manager) verify(ctx context.Context, domain string) error { - client, err := m.acmeClient(ctx) - if err != nil { - return err - } - - // start domain authorization and get the challenge - authz, err := client.Authorize(ctx, domain) - if err != nil { - return err - } - // maybe don't need to at all - if authz.Status == acme.StatusValid { - return nil - } - - // pick a challenge: prefer tls-sni-02 over tls-sni-01 - // TODO: consider authz.Combinations - var chal *acme.Challenge - for _, c := range authz.Challenges { - if c.Type == "tls-sni-02" { - chal = c - break - } - if c.Type == "tls-sni-01" { - chal = c - } - } - if chal == nil { - return errors.New("acme/autocert: no supported challenge type found") - } - - // create a token cert for the challenge response - var ( - cert tls.Certificate - name string - ) - switch chal.Type { - case "tls-sni-01": - cert, name, err = client.TLSSNI01ChallengeCert(chal.Token) - case "tls-sni-02": - cert, name, err = client.TLSSNI02ChallengeCert(chal.Token) - default: - err = fmt.Errorf("acme/autocert: unknown challenge type %q", chal.Type) - } - if err != nil { - return err - } - m.putTokenCert(ctx, name, &cert) - defer func() { - // verification has ended at this point - // don't need token cert anymore - go m.deleteTokenCert(name) - }() - - // ready to fulfill the challenge - if _, err := client.Accept(ctx, chal); err != nil { - return err - } - // wait for the CA to validate - _, err = client.WaitAuthorization(ctx, authz.URI) - return err -} - -// putTokenCert stores the cert under the named key in both m.tokenCert map -// and m.Cache. -func (m *Manager) putTokenCert(ctx context.Context, name string, cert *tls.Certificate) { - m.tokenCertMu.Lock() - defer m.tokenCertMu.Unlock() - if m.tokenCert == nil { - m.tokenCert = make(map[string]*tls.Certificate) - } - m.tokenCert[name] = cert - m.cachePut(ctx, name, cert) -} - -// deleteTokenCert removes the token certificate for the specified domain name -// from both m.tokenCert map and m.Cache. -func (m *Manager) deleteTokenCert(name string) { - m.tokenCertMu.Lock() - defer m.tokenCertMu.Unlock() - delete(m.tokenCert, name) - if m.Cache != nil { - m.Cache.Delete(context.Background(), name) - } -} - -// renew starts a cert renewal timer loop, one per domain. -// -// The loop is scheduled in two cases: -// - a cert was fetched from cache for the first time (wasn't in m.state) -// - a new cert was created by m.createCert -// -// The key argument is a certificate private key. -// The exp argument is the cert expiration time (NotAfter). -func (m *Manager) renew(domain string, key crypto.Signer, exp time.Time) { - m.renewalMu.Lock() - defer m.renewalMu.Unlock() - if m.renewal[domain] != nil { - // another goroutine is already on it - return - } - if m.renewal == nil { - m.renewal = make(map[string]*domainRenewal) - } - dr := &domainRenewal{m: m, domain: domain, key: key} - m.renewal[domain] = dr - dr.start(exp) -} - -// stopRenew stops all currently running cert renewal timers. -// The timers are not restarted during the lifetime of the Manager. -func (m *Manager) stopRenew() { - m.renewalMu.Lock() - defer m.renewalMu.Unlock() - for name, dr := range m.renewal { - delete(m.renewal, name) - dr.stop() - } -} - -func (m *Manager) accountKey(ctx context.Context) (crypto.Signer, error) { - const keyName = "acme_account.key" - - genKey := func() (*ecdsa.PrivateKey, error) { - return ecdsa.GenerateKey(elliptic.P256(), rand.Reader) - } - - if m.Cache == nil { - return genKey() - } - - data, err := m.Cache.Get(ctx, keyName) - if err == ErrCacheMiss { - key, err := genKey() - if err != nil { - return nil, err - } - var buf bytes.Buffer - if err := encodeECDSAKey(&buf, key); err != nil { - return nil, err - } - if err := m.Cache.Put(ctx, keyName, buf.Bytes()); err != nil { - return nil, err - } - return key, nil - } - if err != nil { - return nil, err - } - - priv, _ := pem.Decode(data) - if priv == nil || !strings.Contains(priv.Type, "PRIVATE") { - return nil, errors.New("acme/autocert: invalid account key found in cache") - } - return parsePrivateKey(priv.Bytes) -} - -func (m *Manager) acmeClient(ctx context.Context) (*acme.Client, error) { - m.clientMu.Lock() - defer m.clientMu.Unlock() - if m.client != nil { - return m.client, nil - } - - client := m.Client - if client == nil { - client = &acme.Client{DirectoryURL: acme.LetsEncryptURL} - } - if client.Key == nil { - var err error - client.Key, err = m.accountKey(ctx) - if err != nil { - return nil, err - } - } - var contact []string - if m.Email != "" { - contact = []string{"mailto:" + m.Email} - } - a := &acme.Account{Contact: contact} - _, err := client.Register(ctx, a, m.Prompt) - if ae, ok := err.(*acme.Error); err == nil || ok && ae.StatusCode == http.StatusConflict { - // conflict indicates the key is already registered - m.client = client - err = nil - } - return m.client, err -} - -func (m *Manager) hostPolicy() HostPolicy { - if m.HostPolicy != nil { - return m.HostPolicy - } - return defaultHostPolicy -} - -func (m *Manager) renewBefore() time.Duration { - if m.RenewBefore > maxRandRenew { - return m.RenewBefore - } - return 7 * 24 * time.Hour // 1 week -} - -// certState is ready when its mutex is unlocked for reading. -type certState struct { - sync.RWMutex - locked bool // locked for read/write - key crypto.Signer // private key for cert - cert [][]byte // DER encoding - leaf *x509.Certificate // parsed cert[0]; always non-nil if cert != nil -} - -// tlscert creates a tls.Certificate from s.key and s.cert. -// Callers should wrap it in s.RLock() and s.RUnlock(). -func (s *certState) tlscert() (*tls.Certificate, error) { - if s.key == nil { - return nil, errors.New("acme/autocert: missing signer") - } - if len(s.cert) == 0 { - return nil, errors.New("acme/autocert: missing certificate") - } - return &tls.Certificate{ - PrivateKey: s.key, - Certificate: s.cert, - Leaf: s.leaf, - }, nil -} - -// certRequest creates a certificate request for the given common name cn -// and optional SANs. -func certRequest(key crypto.Signer, cn string, san ...string) ([]byte, error) { - req := &x509.CertificateRequest{ - Subject: pkix.Name{CommonName: cn}, - DNSNames: san, - } - return x509.CreateCertificateRequest(rand.Reader, req, key) -} - -// Attempt to parse the given private key DER block. OpenSSL 0.9.8 generates -// PKCS#1 private keys by default, while OpenSSL 1.0.0 generates PKCS#8 keys. -// OpenSSL ecparam generates SEC1 EC private keys for ECDSA. We try all three. -// -// Inspired by parsePrivateKey in crypto/tls/tls.go. -func parsePrivateKey(der []byte) (crypto.Signer, error) { - if key, err := x509.ParsePKCS1PrivateKey(der); err == nil { - return key, nil - } - if key, err := x509.ParsePKCS8PrivateKey(der); err == nil { - switch key := key.(type) { - case *rsa.PrivateKey: - return key, nil - case *ecdsa.PrivateKey: - return key, nil - default: - return nil, errors.New("acme/autocert: unknown private key type in PKCS#8 wrapping") - } - } - if key, err := x509.ParseECPrivateKey(der); err == nil { - return key, nil - } - - return nil, errors.New("acme/autocert: failed to parse private key") -} - -// validCert parses a cert chain provided as der argument and verifies the leaf, der[0], -// corresponds to the private key, as well as the domain match and expiration dates. -// It doesn't do any revocation checking. -// -// The returned value is the verified leaf cert. -func validCert(domain string, der [][]byte, key crypto.Signer) (leaf *x509.Certificate, err error) { - // parse public part(s) - var n int - for _, b := range der { - n += len(b) - } - pub := make([]byte, n) - n = 0 - for _, b := range der { - n += copy(pub[n:], b) - } - x509Cert, err := x509.ParseCertificates(pub) - if len(x509Cert) == 0 { - return nil, errors.New("acme/autocert: no public key found") - } - // verify the leaf is not expired and matches the domain name - leaf = x509Cert[0] - now := timeNow() - if now.Before(leaf.NotBefore) { - return nil, errors.New("acme/autocert: certificate is not valid yet") - } - if now.After(leaf.NotAfter) { - return nil, errors.New("acme/autocert: expired certificate") - } - if err := leaf.VerifyHostname(domain); err != nil { - return nil, err - } - // ensure the leaf corresponds to the private key - switch pub := leaf.PublicKey.(type) { - case *rsa.PublicKey: - prv, ok := key.(*rsa.PrivateKey) - if !ok { - return nil, errors.New("acme/autocert: private key type does not match public key type") - } - if pub.N.Cmp(prv.N) != 0 { - return nil, errors.New("acme/autocert: private key does not match public key") - } - case *ecdsa.PublicKey: - prv, ok := key.(*ecdsa.PrivateKey) - if !ok { - return nil, errors.New("acme/autocert: private key type does not match public key type") - } - if pub.X.Cmp(prv.X) != 0 || pub.Y.Cmp(prv.Y) != 0 { - return nil, errors.New("acme/autocert: private key does not match public key") - } - default: - return nil, errors.New("acme/autocert: unknown public key algorithm") - } - return leaf, nil -} - -func retryAfter(v string) time.Duration { - if i, err := strconv.Atoi(v); err == nil { - return time.Duration(i) * time.Second - } - if t, err := http.ParseTime(v); err == nil { - return t.Sub(timeNow()) - } - return time.Second -} - -type lockedMathRand struct { - sync.Mutex - rnd *mathrand.Rand -} - -func (r *lockedMathRand) int63n(max int64) int64 { - r.Lock() - n := r.rnd.Int63n(max) - r.Unlock() - return n -} - -// for easier testing -var timeNow = time.Now diff --git a/vendor/golang.org/x/crypto/acme/autocert/autocert_test.go b/vendor/golang.org/x/crypto/acme/autocert/autocert_test.go deleted file mode 100644 index acef16259..000000000 --- a/vendor/golang.org/x/crypto/acme/autocert/autocert_test.go +++ /dev/null @@ -1,441 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package autocert - -import ( - "context" - "crypto" - "crypto/ecdsa" - "crypto/elliptic" - "crypto/rand" - "crypto/rsa" - "crypto/tls" - "crypto/x509" - "crypto/x509/pkix" - "encoding/base64" - "encoding/json" - "fmt" - "html/template" - "io" - "math/big" - "net/http" - "net/http/httptest" - "reflect" - "sync" - "testing" - "time" - - "golang.org/x/crypto/acme" -) - -var discoTmpl = template.Must(template.New("disco").Parse(`{ - "new-reg": "{{.}}/new-reg", - "new-authz": "{{.}}/new-authz", - "new-cert": "{{.}}/new-cert" -}`)) - -var authzTmpl = template.Must(template.New("authz").Parse(`{ - "status": "pending", - "challenges": [ - { - "uri": "{{.}}/challenge/1", - "type": "tls-sni-01", - "token": "token-01" - }, - { - "uri": "{{.}}/challenge/2", - "type": "tls-sni-02", - "token": "token-02" - } - ] -}`)) - -type memCache struct { - mu sync.Mutex - keyData map[string][]byte -} - -func (m *memCache) Get(ctx context.Context, key string) ([]byte, error) { - m.mu.Lock() - defer m.mu.Unlock() - - v, ok := m.keyData[key] - if !ok { - return nil, ErrCacheMiss - } - return v, nil -} - -func (m *memCache) Put(ctx context.Context, key string, data []byte) error { - m.mu.Lock() - defer m.mu.Unlock() - - m.keyData[key] = data - return nil -} - -func (m *memCache) Delete(ctx context.Context, key string) error { - m.mu.Lock() - defer m.mu.Unlock() - - delete(m.keyData, key) - return nil -} - -func newMemCache() *memCache { - return &memCache{ - keyData: make(map[string][]byte), - } -} - -func dummyCert(pub interface{}, san ...string) ([]byte, error) { - return dateDummyCert(pub, time.Now(), time.Now().Add(90*24*time.Hour), san...) -} - -func dateDummyCert(pub interface{}, start, end time.Time, san ...string) ([]byte, error) { - // use EC key to run faster on 386 - key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) - if err != nil { - return nil, err - } - t := &x509.Certificate{ - SerialNumber: big.NewInt(1), - NotBefore: start, - NotAfter: end, - BasicConstraintsValid: true, - KeyUsage: x509.KeyUsageKeyEncipherment, - DNSNames: san, - } - if pub == nil { - pub = &key.PublicKey - } - return x509.CreateCertificate(rand.Reader, t, t, pub, key) -} - -func decodePayload(v interface{}, r io.Reader) error { - var req struct{ Payload string } - if err := json.NewDecoder(r).Decode(&req); err != nil { - return err - } - payload, err := base64.RawURLEncoding.DecodeString(req.Payload) - if err != nil { - return err - } - return json.Unmarshal(payload, v) -} - -func TestGetCertificate(t *testing.T) { - man := &Manager{Prompt: AcceptTOS} - defer man.stopRenew() - hello := &tls.ClientHelloInfo{ServerName: "example.org"} - testGetCertificate(t, man, "example.org", hello) -} - -func TestGetCertificate_trailingDot(t *testing.T) { - man := &Manager{Prompt: AcceptTOS} - defer man.stopRenew() - hello := &tls.ClientHelloInfo{ServerName: "example.org."} - testGetCertificate(t, man, "example.org", hello) -} - -func TestGetCertificate_ForceRSA(t *testing.T) { - man := &Manager{ - Prompt: AcceptTOS, - Cache: newMemCache(), - ForceRSA: true, - } - defer man.stopRenew() - hello := &tls.ClientHelloInfo{ServerName: "example.org"} - testGetCertificate(t, man, "example.org", hello) - - cert, err := man.cacheGet(context.Background(), "example.org") - if err != nil { - t.Fatalf("man.cacheGet: %v", err) - } - if _, ok := cert.PrivateKey.(*rsa.PrivateKey); !ok { - t.Errorf("cert.PrivateKey is %T; want *rsa.PrivateKey", cert.PrivateKey) - } -} - -// tests man.GetCertificate flow using the provided hello argument. -// The domain argument is the expected domain name of a certificate request. -func testGetCertificate(t *testing.T, man *Manager, domain string, hello *tls.ClientHelloInfo) { - // echo token-02 | shasum -a 256 - // then divide result in 2 parts separated by dot - tokenCertName := "4e8eb87631187e9ff2153b56b13a4dec.13a35d002e485d60ff37354b32f665d9.token.acme.invalid" - verifyTokenCert := func() { - hello := &tls.ClientHelloInfo{ServerName: tokenCertName} - _, err := man.GetCertificate(hello) - if err != nil { - t.Errorf("verifyTokenCert: GetCertificate(%q): %v", tokenCertName, err) - return - } - } - - // ACME CA server stub - var ca *httptest.Server - ca = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("replay-nonce", "nonce") - if r.Method == "HEAD" { - // a nonce request - return - } - - switch r.URL.Path { - // discovery - case "/": - if err := discoTmpl.Execute(w, ca.URL); err != nil { - t.Fatalf("discoTmpl: %v", err) - } - // client key registration - case "/new-reg": - w.Write([]byte("{}")) - // domain authorization - case "/new-authz": - w.Header().Set("location", ca.URL+"/authz/1") - w.WriteHeader(http.StatusCreated) - if err := authzTmpl.Execute(w, ca.URL); err != nil { - t.Fatalf("authzTmpl: %v", err) - } - // accept tls-sni-02 challenge - case "/challenge/2": - verifyTokenCert() - w.Write([]byte("{}")) - // authorization status - case "/authz/1": - w.Write([]byte(`{"status": "valid"}`)) - // cert request - case "/new-cert": - var req struct { - CSR string `json:"csr"` - } - decodePayload(&req, r.Body) - b, _ := base64.RawURLEncoding.DecodeString(req.CSR) - csr, err := x509.ParseCertificateRequest(b) - if err != nil { - t.Fatalf("new-cert: CSR: %v", err) - } - if csr.Subject.CommonName != domain { - t.Errorf("CommonName in CSR = %q; want %q", csr.Subject.CommonName, domain) - } - der, err := dummyCert(csr.PublicKey, domain) - if err != nil { - t.Fatalf("new-cert: dummyCert: %v", err) - } - chainUp := fmt.Sprintf("<%s/ca-cert>; rel=up", ca.URL) - w.Header().Set("link", chainUp) - w.WriteHeader(http.StatusCreated) - w.Write(der) - // CA chain cert - case "/ca-cert": - der, err := dummyCert(nil, "ca") - if err != nil { - t.Fatalf("ca-cert: dummyCert: %v", err) - } - w.Write(der) - default: - t.Errorf("unrecognized r.URL.Path: %s", r.URL.Path) - } - })) - defer ca.Close() - - // use EC key to run faster on 386 - key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) - if err != nil { - t.Fatal(err) - } - man.Client = &acme.Client{ - Key: key, - DirectoryURL: ca.URL, - } - - // simulate tls.Config.GetCertificate - var tlscert *tls.Certificate - done := make(chan struct{}) - go func() { - tlscert, err = man.GetCertificate(hello) - close(done) - }() - select { - case <-time.After(time.Minute): - t.Fatal("man.GetCertificate took too long to return") - case <-done: - } - if err != nil { - t.Fatalf("man.GetCertificate: %v", err) - } - - // verify the tlscert is the same we responded with from the CA stub - if len(tlscert.Certificate) == 0 { - t.Fatal("len(tlscert.Certificate) is 0") - } - cert, err := x509.ParseCertificate(tlscert.Certificate[0]) - if err != nil { - t.Fatalf("x509.ParseCertificate: %v", err) - } - if len(cert.DNSNames) == 0 || cert.DNSNames[0] != domain { - t.Errorf("cert.DNSNames = %v; want %q", cert.DNSNames, domain) - } - - // make sure token cert was removed - done = make(chan struct{}) - go func() { - for { - hello := &tls.ClientHelloInfo{ServerName: tokenCertName} - if _, err := man.GetCertificate(hello); err != nil { - break - } - time.Sleep(100 * time.Millisecond) - } - close(done) - }() - select { - case <-time.After(5 * time.Second): - t.Error("token cert was not removed") - case <-done: - } -} - -func TestAccountKeyCache(t *testing.T) { - m := Manager{Cache: newMemCache()} - ctx := context.Background() - k1, err := m.accountKey(ctx) - if err != nil { - t.Fatal(err) - } - k2, err := m.accountKey(ctx) - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(k1, k2) { - t.Errorf("account keys don't match: k1 = %#v; k2 = %#v", k1, k2) - } -} - -func TestCache(t *testing.T) { - privKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) - if err != nil { - t.Fatal(err) - } - tmpl := &x509.Certificate{ - SerialNumber: big.NewInt(1), - Subject: pkix.Name{CommonName: "example.org"}, - NotAfter: time.Now().Add(time.Hour), - } - pub, err := x509.CreateCertificate(rand.Reader, tmpl, tmpl, &privKey.PublicKey, privKey) - if err != nil { - t.Fatal(err) - } - tlscert := &tls.Certificate{ - Certificate: [][]byte{pub}, - PrivateKey: privKey, - } - - man := &Manager{Cache: newMemCache()} - defer man.stopRenew() - ctx := context.Background() - if err := man.cachePut(ctx, "example.org", tlscert); err != nil { - t.Fatalf("man.cachePut: %v", err) - } - res, err := man.cacheGet(ctx, "example.org") - if err != nil { - t.Fatalf("man.cacheGet: %v", err) - } - if res == nil { - t.Fatal("res is nil") - } -} - -func TestHostWhitelist(t *testing.T) { - policy := HostWhitelist("example.com", "example.org", "*.example.net") - tt := []struct { - host string - allow bool - }{ - {"example.com", true}, - {"example.org", true}, - {"one.example.com", false}, - {"two.example.org", false}, - {"three.example.net", false}, - {"dummy", false}, - } - for i, test := range tt { - err := policy(nil, test.host) - if err != nil && test.allow { - t.Errorf("%d: policy(%q): %v; want nil", i, test.host, err) - } - if err == nil && !test.allow { - t.Errorf("%d: policy(%q): nil; want an error", i, test.host) - } - } -} - -func TestValidCert(t *testing.T) { - key1, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) - if err != nil { - t.Fatal(err) - } - key2, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) - if err != nil { - t.Fatal(err) - } - key3, err := rsa.GenerateKey(rand.Reader, 512) - if err != nil { - t.Fatal(err) - } - cert1, err := dummyCert(key1.Public(), "example.org") - if err != nil { - t.Fatal(err) - } - cert2, err := dummyCert(key2.Public(), "example.org") - if err != nil { - t.Fatal(err) - } - cert3, err := dummyCert(key3.Public(), "example.org") - if err != nil { - t.Fatal(err) - } - now := time.Now() - early, err := dateDummyCert(key1.Public(), now.Add(time.Hour), now.Add(2*time.Hour), "example.org") - if err != nil { - t.Fatal(err) - } - expired, err := dateDummyCert(key1.Public(), now.Add(-2*time.Hour), now.Add(-time.Hour), "example.org") - if err != nil { - t.Fatal(err) - } - - tt := []struct { - domain string - key crypto.Signer - cert [][]byte - ok bool - }{ - {"example.org", key1, [][]byte{cert1}, true}, - {"example.org", key3, [][]byte{cert3}, true}, - {"example.org", key1, [][]byte{cert1, cert2, cert3}, true}, - {"example.org", key1, [][]byte{cert1, {1}}, false}, - {"example.org", key1, [][]byte{{1}}, false}, - {"example.org", key1, [][]byte{cert2}, false}, - {"example.org", key2, [][]byte{cert1}, false}, - {"example.org", key1, [][]byte{cert3}, false}, - {"example.org", key3, [][]byte{cert1}, false}, - {"example.net", key1, [][]byte{cert1}, false}, - {"example.org", key1, [][]byte{early}, false}, - {"example.org", key1, [][]byte{expired}, false}, - } - for i, test := range tt { - leaf, err := validCert(test.domain, test.cert, test.key) - if err != nil && test.ok { - t.Errorf("%d: err = %v", i, err) - } - if err == nil && !test.ok { - t.Errorf("%d: err is nil", i) - } - if err == nil && test.ok && leaf == nil { - t.Errorf("%d: leaf is nil", i) - } - } -} diff --git a/vendor/golang.org/x/crypto/acme/autocert/cache.go b/vendor/golang.org/x/crypto/acme/autocert/cache.go deleted file mode 100644 index 9f3e9d133..000000000 --- a/vendor/golang.org/x/crypto/acme/autocert/cache.go +++ /dev/null @@ -1,129 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package autocert - -import ( - "context" - "errors" - "io/ioutil" - "os" - "path/filepath" -) - -// ErrCacheMiss is returned when a certificate is not found in cache. -var ErrCacheMiss = errors.New("acme/autocert: certificate cache miss") - -// Cache is used by Manager to store and retrieve previously obtained certificates -// as opaque data. -// -// The key argument of the methods refers to a domain name but need not be an FQDN. -// Cache implementations should not rely on the key naming pattern. -type Cache interface { - // Get returns a certificate data for the specified key. - // If there's no such key, Get returns ErrCacheMiss. - Get(ctx context.Context, key string) ([]byte, error) - - // Put stores the data in the cache under the specified key. - // Underlying implementations may use any data storage format, - // as long as the reverse operation, Get, results in the original data. - Put(ctx context.Context, key string, data []byte) error - - // Delete removes a certificate data from the cache under the specified key. - // If there's no such key in the cache, Delete returns nil. - Delete(ctx context.Context, key string) error -} - -// DirCache implements Cache using a directory on the local filesystem. -// If the directory does not exist, it will be created with 0700 permissions. -type DirCache string - -// Get reads a certificate data from the specified file name. -func (d DirCache) Get(ctx context.Context, name string) ([]byte, error) { - name = filepath.Join(string(d), name) - var ( - data []byte - err error - done = make(chan struct{}) - ) - go func() { - data, err = ioutil.ReadFile(name) - close(done) - }() - select { - case <-ctx.Done(): - return nil, ctx.Err() - case <-done: - } - if os.IsNotExist(err) { - return nil, ErrCacheMiss - } - return data, err -} - -// Put writes the certificate data to the specified file name. -// The file will be created with 0600 permissions. -func (d DirCache) Put(ctx context.Context, name string, data []byte) error { - if err := os.MkdirAll(string(d), 0700); err != nil { - return err - } - - done := make(chan struct{}) - var err error - go func() { - defer close(done) - var tmp string - if tmp, err = d.writeTempFile(name, data); err != nil { - return - } - // prevent overwriting the file if the context was cancelled - if ctx.Err() != nil { - return // no need to set err - } - name = filepath.Join(string(d), name) - err = os.Rename(tmp, name) - }() - select { - case <-ctx.Done(): - return ctx.Err() - case <-done: - } - return err -} - -// Delete removes the specified file name. -func (d DirCache) Delete(ctx context.Context, name string) error { - name = filepath.Join(string(d), name) - var ( - err error - done = make(chan struct{}) - ) - go func() { - err = os.Remove(name) - close(done) - }() - select { - case <-ctx.Done(): - return ctx.Err() - case <-done: - } - if err != nil && !os.IsNotExist(err) { - return err - } - return nil -} - -// writeTempFile writes b to a temporary file, closes the file and returns its path. -func (d DirCache) writeTempFile(prefix string, b []byte) (string, error) { - // TempFile uses 0600 permissions - f, err := ioutil.TempFile(string(d), prefix) - if err != nil { - return "", err - } - if _, err := f.Write(b); err != nil { - f.Close() - return "", err - } - return f.Name(), f.Close() -} diff --git a/vendor/golang.org/x/crypto/acme/autocert/cache_test.go b/vendor/golang.org/x/crypto/acme/autocert/cache_test.go deleted file mode 100644 index 6e1b88d57..000000000 --- a/vendor/golang.org/x/crypto/acme/autocert/cache_test.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package autocert - -import ( - "context" - "io/ioutil" - "os" - "path/filepath" - "reflect" - "testing" -) - -// make sure DirCache satisfies Cache interface -var _ Cache = DirCache("/") - -func TestDirCache(t *testing.T) { - dir, err := ioutil.TempDir("", "autocert") - if err != nil { - t.Fatal(err) - } - dir = filepath.Join(dir, "certs") // a nonexistent dir - cache := DirCache(dir) - ctx := context.Background() - - // test cache miss - if _, err := cache.Get(ctx, "nonexistent"); err != ErrCacheMiss { - t.Errorf("get: %v; want ErrCacheMiss", err) - } - - // test put/get - b1 := []byte{1} - if err := cache.Put(ctx, "dummy", b1); err != nil { - t.Fatalf("put: %v", err) - } - b2, err := cache.Get(ctx, "dummy") - if err != nil { - t.Fatalf("get: %v", err) - } - if !reflect.DeepEqual(b1, b2) { - t.Errorf("b1 = %v; want %v", b1, b2) - } - name := filepath.Join(dir, "dummy") - if _, err := os.Stat(name); err != nil { - t.Error(err) - } - - // test delete - if err := cache.Delete(ctx, "dummy"); err != nil { - t.Fatalf("delete: %v", err) - } - if _, err := cache.Get(ctx, "dummy"); err != ErrCacheMiss { - t.Errorf("get: %v; want ErrCacheMiss", err) - } -} diff --git a/vendor/golang.org/x/crypto/acme/autocert/listener.go b/vendor/golang.org/x/crypto/acme/autocert/listener.go deleted file mode 100644 index d4c93d2f1..000000000 --- a/vendor/golang.org/x/crypto/acme/autocert/listener.go +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package autocert - -import ( - "crypto/tls" - "log" - "net" - "os" - "path/filepath" - "runtime" - "time" -) - -// NewListener returns a net.Listener that listens on the standard TLS -// port (443) on all interfaces and returns *tls.Conn connections with -// LetsEncrypt certificates for the provided domain or domains. -// -// It enables one-line HTTPS servers: -// -// log.Fatal(http.Serve(autocert.NewListener("example.com"), handler)) -// -// NewListener is a convenience function for a common configuration. -// More complex or custom configurations can use the autocert.Manager -// type instead. -// -// Use of this function implies acceptance of the LetsEncrypt Terms of -// Service. If domains is not empty, the provided domains are passed -// to HostWhitelist. If domains is empty, the listener will do -// LetsEncrypt challenges for any requested domain, which is not -// recommended. -// -// Certificates are cached in a "golang-autocert" directory under an -// operating system-specific cache or temp directory. This may not -// be suitable for servers spanning multiple machines. -// -// The returned Listener also enables TCP keep-alives on the accepted -// connections. The returned *tls.Conn are returned before their TLS -// handshake has completed. -func NewListener(domains ...string) net.Listener { - m := &Manager{ - Prompt: AcceptTOS, - } - if len(domains) > 0 { - m.HostPolicy = HostWhitelist(domains...) - } - dir := cacheDir() - if err := os.MkdirAll(dir, 0700); err != nil { - log.Printf("warning: autocert.NewListener not using a cache: %v", err) - } else { - m.Cache = DirCache(dir) - } - return m.Listener() -} - -// Listener listens on the standard TLS port (443) on all interfaces -// and returns a net.Listener returning *tls.Conn connections. -// -// The returned Listener also enables TCP keep-alives on the accepted -// connections. The returned *tls.Conn are returned before their TLS -// handshake has completed. -// -// Unlike NewListener, it is the caller's responsibility to initialize -// the Manager m's Prompt, Cache, HostPolicy, and other desired options. -func (m *Manager) Listener() net.Listener { - ln := &listener{ - m: m, - conf: &tls.Config{ - GetCertificate: m.GetCertificate, // bonus: panic on nil m - }, - } - ln.tcpListener, ln.tcpListenErr = net.Listen("tcp", ":443") - return ln -} - -type listener struct { - m *Manager - conf *tls.Config - - tcpListener net.Listener - tcpListenErr error -} - -func (ln *listener) Accept() (net.Conn, error) { - if ln.tcpListenErr != nil { - return nil, ln.tcpListenErr - } - conn, err := ln.tcpListener.Accept() - if err != nil { - return nil, err - } - tcpConn := conn.(*net.TCPConn) - - // Because Listener is a convenience function, help out with - // this too. This is not possible for the caller to set once - // we return a *tcp.Conn wrapping an inaccessible net.Conn. - // If callers don't want this, they can do things the manual - // way and tweak as needed. But this is what net/http does - // itself, so copy that. If net/http changes, we can change - // here too. - tcpConn.SetKeepAlive(true) - tcpConn.SetKeepAlivePeriod(3 * time.Minute) - - return tls.Server(tcpConn, ln.conf), nil -} - -func (ln *listener) Addr() net.Addr { - if ln.tcpListener != nil { - return ln.tcpListener.Addr() - } - // net.Listen failed. Return something non-nil in case callers - // call Addr before Accept: - return &net.TCPAddr{IP: net.IP{0, 0, 0, 0}, Port: 443} -} - -func (ln *listener) Close() error { - if ln.tcpListenErr != nil { - return ln.tcpListenErr - } - return ln.tcpListener.Close() -} - -func homeDir() string { - if runtime.GOOS == "windows" { - return os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH") - } - if h := os.Getenv("HOME"); h != "" { - return h - } - return "/" -} - -func cacheDir() string { - const base = "golang-autocert" - switch runtime.GOOS { - case "darwin": - return filepath.Join(homeDir(), "Library", "Caches", base) - case "windows": - for _, ev := range []string{"APPDATA", "CSIDL_APPDATA", "TEMP", "TMP"} { - if v := os.Getenv(ev); v != "" { - return filepath.Join(v, base) - } - } - // Worst case: - return filepath.Join(homeDir(), base) - } - if xdg := os.Getenv("XDG_CACHE_HOME"); xdg != "" { - return filepath.Join(xdg, base) - } - return filepath.Join(homeDir(), ".cache", base) -} diff --git a/vendor/golang.org/x/crypto/acme/autocert/listener_test.go b/vendor/golang.org/x/crypto/acme/autocert/listener_test.go deleted file mode 100644 index 9272ebb29..000000000 --- a/vendor/golang.org/x/crypto/acme/autocert/listener_test.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package autocert_test - -import ( - "fmt" - "log" - "net/http" - - "golang.org/x/crypto/acme/autocert" -) - -func ExampleNewListener() { - mux := http.NewServeMux() - mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - fmt.Fprintf(w, "Hello, TLS user! Your config: %+v", r.TLS) - }) - log.Fatal(http.Serve(autocert.NewListener("example.com"), mux)) -} diff --git a/vendor/golang.org/x/crypto/acme/autocert/renewal.go b/vendor/golang.org/x/crypto/acme/autocert/renewal.go deleted file mode 100644 index 14ac90558..000000000 --- a/vendor/golang.org/x/crypto/acme/autocert/renewal.go +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package autocert - -import ( - "context" - "crypto" - "sync" - "time" -) - -// maxRandRenew is a maximum deviation from Manager.RenewBefore. -const maxRandRenew = time.Hour - -// domainRenewal tracks the state used by the periodic timers -// renewing a single domain's cert. -type domainRenewal struct { - m *Manager - domain string - key crypto.Signer - - timerMu sync.Mutex - timer *time.Timer -} - -// start starts a cert renewal timer at the time -// defined by the certificate expiration time exp. -// -// If the timer is already started, calling start is a noop. -func (dr *domainRenewal) start(exp time.Time) { - dr.timerMu.Lock() - defer dr.timerMu.Unlock() - if dr.timer != nil { - return - } - dr.timer = time.AfterFunc(dr.next(exp), dr.renew) -} - -// stop stops the cert renewal timer. -// If the timer is already stopped, calling stop is a noop. -func (dr *domainRenewal) stop() { - dr.timerMu.Lock() - defer dr.timerMu.Unlock() - if dr.timer == nil { - return - } - dr.timer.Stop() - dr.timer = nil -} - -// renew is called periodically by a timer. -// The first renew call is kicked off by dr.start. -func (dr *domainRenewal) renew() { - dr.timerMu.Lock() - defer dr.timerMu.Unlock() - if dr.timer == nil { - return - } - - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Minute) - defer cancel() - // TODO: rotate dr.key at some point? - next, err := dr.do(ctx) - if err != nil { - next = maxRandRenew / 2 - next += time.Duration(pseudoRand.int63n(int64(next))) - } - dr.timer = time.AfterFunc(next, dr.renew) - testDidRenewLoop(next, err) -} - -// do is similar to Manager.createCert but it doesn't lock a Manager.state item. -// Instead, it requests a new certificate independently and, upon success, -// replaces dr.m.state item with a new one and updates cache for the given domain. -// -// It may return immediately if the expiration date of the currently cached cert -// is far enough in the future. -// -// The returned value is a time interval after which the renewal should occur again. -func (dr *domainRenewal) do(ctx context.Context) (time.Duration, error) { - // a race is likely unavoidable in a distributed environment - // but we try nonetheless - if tlscert, err := dr.m.cacheGet(ctx, dr.domain); err == nil { - next := dr.next(tlscert.Leaf.NotAfter) - if next > dr.m.renewBefore()+maxRandRenew { - return next, nil - } - } - - der, leaf, err := dr.m.authorizedCert(ctx, dr.key, dr.domain) - if err != nil { - return 0, err - } - state := &certState{ - key: dr.key, - cert: der, - leaf: leaf, - } - tlscert, err := state.tlscert() - if err != nil { - return 0, err - } - dr.m.cachePut(ctx, dr.domain, tlscert) - dr.m.stateMu.Lock() - defer dr.m.stateMu.Unlock() - // m.state is guaranteed to be non-nil at this point - dr.m.state[dr.domain] = state - return dr.next(leaf.NotAfter), nil -} - -func (dr *domainRenewal) next(expiry time.Time) time.Duration { - d := expiry.Sub(timeNow()) - dr.m.renewBefore() - // add a bit of randomness to renew deadline - n := pseudoRand.int63n(int64(maxRandRenew)) - d -= time.Duration(n) - if d < 0 { - return 0 - } - return d -} - -var testDidRenewLoop = func(next time.Duration, err error) {} diff --git a/vendor/golang.org/x/crypto/acme/autocert/renewal_test.go b/vendor/golang.org/x/crypto/acme/autocert/renewal_test.go deleted file mode 100644 index 87474b69f..000000000 --- a/vendor/golang.org/x/crypto/acme/autocert/renewal_test.go +++ /dev/null @@ -1,191 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package autocert - -import ( - "context" - "crypto/ecdsa" - "crypto/elliptic" - "crypto/rand" - "crypto/tls" - "crypto/x509" - "encoding/base64" - "fmt" - "net/http" - "net/http/httptest" - "testing" - "time" - - "golang.org/x/crypto/acme" -) - -func TestRenewalNext(t *testing.T) { - now := time.Now() - timeNow = func() time.Time { return now } - defer func() { timeNow = time.Now }() - - man := &Manager{RenewBefore: 7 * 24 * time.Hour} - defer man.stopRenew() - tt := []struct { - expiry time.Time - min, max time.Duration - }{ - {now.Add(90 * 24 * time.Hour), 83*24*time.Hour - maxRandRenew, 83 * 24 * time.Hour}, - {now.Add(time.Hour), 0, 1}, - {now, 0, 1}, - {now.Add(-time.Hour), 0, 1}, - } - - dr := &domainRenewal{m: man} - for i, test := range tt { - next := dr.next(test.expiry) - if next < test.min || test.max < next { - t.Errorf("%d: next = %v; want between %v and %v", i, next, test.min, test.max) - } - } -} - -func TestRenewFromCache(t *testing.T) { - const domain = "example.org" - - // ACME CA server stub - var ca *httptest.Server - ca = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("replay-nonce", "nonce") - if r.Method == "HEAD" { - // a nonce request - return - } - - switch r.URL.Path { - // discovery - case "/": - if err := discoTmpl.Execute(w, ca.URL); err != nil { - t.Fatalf("discoTmpl: %v", err) - } - // client key registration - case "/new-reg": - w.Write([]byte("{}")) - // domain authorization - case "/new-authz": - w.Header().Set("location", ca.URL+"/authz/1") - w.WriteHeader(http.StatusCreated) - w.Write([]byte(`{"status": "valid"}`)) - // cert request - case "/new-cert": - var req struct { - CSR string `json:"csr"` - } - decodePayload(&req, r.Body) - b, _ := base64.RawURLEncoding.DecodeString(req.CSR) - csr, err := x509.ParseCertificateRequest(b) - if err != nil { - t.Fatalf("new-cert: CSR: %v", err) - } - der, err := dummyCert(csr.PublicKey, domain) - if err != nil { - t.Fatalf("new-cert: dummyCert: %v", err) - } - chainUp := fmt.Sprintf("<%s/ca-cert>; rel=up", ca.URL) - w.Header().Set("link", chainUp) - w.WriteHeader(http.StatusCreated) - w.Write(der) - // CA chain cert - case "/ca-cert": - der, err := dummyCert(nil, "ca") - if err != nil { - t.Fatalf("ca-cert: dummyCert: %v", err) - } - w.Write(der) - default: - t.Errorf("unrecognized r.URL.Path: %s", r.URL.Path) - } - })) - defer ca.Close() - - // use EC key to run faster on 386 - key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) - if err != nil { - t.Fatal(err) - } - man := &Manager{ - Prompt: AcceptTOS, - Cache: newMemCache(), - RenewBefore: 24 * time.Hour, - Client: &acme.Client{ - Key: key, - DirectoryURL: ca.URL, - }, - } - defer man.stopRenew() - - // cache an almost expired cert - now := time.Now() - cert, err := dateDummyCert(key.Public(), now.Add(-2*time.Hour), now.Add(time.Minute), domain) - if err != nil { - t.Fatal(err) - } - tlscert := &tls.Certificate{PrivateKey: key, Certificate: [][]byte{cert}} - if err := man.cachePut(context.Background(), domain, tlscert); err != nil { - t.Fatal(err) - } - - // veriy the renewal happened - defer func() { - testDidRenewLoop = func(next time.Duration, err error) {} - }() - done := make(chan struct{}) - testDidRenewLoop = func(next time.Duration, err error) { - defer close(done) - if err != nil { - t.Errorf("testDidRenewLoop: %v", err) - } - // Next should be about 90 days: - // dummyCert creates 90days expiry + account for man.RenewBefore. - // Previous expiration was within 1 min. - future := 88 * 24 * time.Hour - if next < future { - t.Errorf("testDidRenewLoop: next = %v; want >= %v", next, future) - } - - // ensure the new cert is cached - after := time.Now().Add(future) - tlscert, err := man.cacheGet(context.Background(), domain) - if err != nil { - t.Fatalf("man.cacheGet: %v", err) - } - if !tlscert.Leaf.NotAfter.After(after) { - t.Errorf("cache leaf.NotAfter = %v; want > %v", tlscert.Leaf.NotAfter, after) - } - - // verify the old cert is also replaced in memory - man.stateMu.Lock() - defer man.stateMu.Unlock() - s := man.state[domain] - if s == nil { - t.Fatalf("m.state[%q] is nil", domain) - } - tlscert, err = s.tlscert() - if err != nil { - t.Fatalf("s.tlscert: %v", err) - } - if !tlscert.Leaf.NotAfter.After(after) { - t.Errorf("state leaf.NotAfter = %v; want > %v", tlscert.Leaf.NotAfter, after) - } - } - - // trigger renew - hello := &tls.ClientHelloInfo{ServerName: domain} - if _, err := man.GetCertificate(hello); err != nil { - t.Fatal(err) - } - - // wait for renew loop - select { - case <-time.After(10 * time.Second): - t.Fatal("renew took too long to occur") - case <-done: - } -} diff --git a/vendor/golang.org/x/crypto/acme/jws.go b/vendor/golang.org/x/crypto/acme/jws.go deleted file mode 100644 index 49ba313ca..000000000 --- a/vendor/golang.org/x/crypto/acme/jws.go +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package acme - -import ( - "crypto" - "crypto/ecdsa" - "crypto/rand" - "crypto/rsa" - "crypto/sha256" - _ "crypto/sha512" // need for EC keys - "encoding/base64" - "encoding/json" - "fmt" - "math/big" -) - -// jwsEncodeJSON signs claimset using provided key and a nonce. -// The result is serialized in JSON format. -// See https://tools.ietf.org/html/rfc7515#section-7. -func jwsEncodeJSON(claimset interface{}, key crypto.Signer, nonce string) ([]byte, error) { - jwk, err := jwkEncode(key.Public()) - if err != nil { - return nil, err - } - alg, sha := jwsHasher(key) - if alg == "" || !sha.Available() { - return nil, ErrUnsupportedKey - } - phead := fmt.Sprintf(`{"alg":%q,"jwk":%s,"nonce":%q}`, alg, jwk, nonce) - phead = base64.RawURLEncoding.EncodeToString([]byte(phead)) - cs, err := json.Marshal(claimset) - if err != nil { - return nil, err - } - payload := base64.RawURLEncoding.EncodeToString(cs) - hash := sha.New() - hash.Write([]byte(phead + "." + payload)) - sig, err := jwsSign(key, sha, hash.Sum(nil)) - if err != nil { - return nil, err - } - - enc := struct { - Protected string `json:"protected"` - Payload string `json:"payload"` - Sig string `json:"signature"` - }{ - Protected: phead, - Payload: payload, - Sig: base64.RawURLEncoding.EncodeToString(sig), - } - return json.Marshal(&enc) -} - -// jwkEncode encodes public part of an RSA or ECDSA key into a JWK. -// The result is also suitable for creating a JWK thumbprint. -// https://tools.ietf.org/html/rfc7517 -func jwkEncode(pub crypto.PublicKey) (string, error) { - switch pub := pub.(type) { - case *rsa.PublicKey: - // https://tools.ietf.org/html/rfc7518#section-6.3.1 - n := pub.N - e := big.NewInt(int64(pub.E)) - // Field order is important. - // See https://tools.ietf.org/html/rfc7638#section-3.3 for details. - return fmt.Sprintf(`{"e":"%s","kty":"RSA","n":"%s"}`, - base64.RawURLEncoding.EncodeToString(e.Bytes()), - base64.RawURLEncoding.EncodeToString(n.Bytes()), - ), nil - case *ecdsa.PublicKey: - // https://tools.ietf.org/html/rfc7518#section-6.2.1 - p := pub.Curve.Params() - n := p.BitSize / 8 - if p.BitSize%8 != 0 { - n++ - } - x := pub.X.Bytes() - if n > len(x) { - x = append(make([]byte, n-len(x)), x...) - } - y := pub.Y.Bytes() - if n > len(y) { - y = append(make([]byte, n-len(y)), y...) - } - // Field order is important. - // See https://tools.ietf.org/html/rfc7638#section-3.3 for details. - return fmt.Sprintf(`{"crv":"%s","kty":"EC","x":"%s","y":"%s"}`, - p.Name, - base64.RawURLEncoding.EncodeToString(x), - base64.RawURLEncoding.EncodeToString(y), - ), nil - } - return "", ErrUnsupportedKey -} - -// jwsSign signs the digest using the given key. -// It returns ErrUnsupportedKey if the key type is unknown. -// The hash is used only for RSA keys. -func jwsSign(key crypto.Signer, hash crypto.Hash, digest []byte) ([]byte, error) { - switch key := key.(type) { - case *rsa.PrivateKey: - return key.Sign(rand.Reader, digest, hash) - case *ecdsa.PrivateKey: - r, s, err := ecdsa.Sign(rand.Reader, key, digest) - if err != nil { - return nil, err - } - rb, sb := r.Bytes(), s.Bytes() - size := key.Params().BitSize / 8 - if size%8 > 0 { - size++ - } - sig := make([]byte, size*2) - copy(sig[size-len(rb):], rb) - copy(sig[size*2-len(sb):], sb) - return sig, nil - } - return nil, ErrUnsupportedKey -} - -// jwsHasher indicates suitable JWS algorithm name and a hash function -// to use for signing a digest with the provided key. -// It returns ("", 0) if the key is not supported. -func jwsHasher(key crypto.Signer) (string, crypto.Hash) { - switch key := key.(type) { - case *rsa.PrivateKey: - return "RS256", crypto.SHA256 - case *ecdsa.PrivateKey: - switch key.Params().Name { - case "P-256": - return "ES256", crypto.SHA256 - case "P-384": - return "ES384", crypto.SHA384 - case "P-512": - return "ES512", crypto.SHA512 - } - } - return "", 0 -} - -// JWKThumbprint creates a JWK thumbprint out of pub -// as specified in https://tools.ietf.org/html/rfc7638. -func JWKThumbprint(pub crypto.PublicKey) (string, error) { - jwk, err := jwkEncode(pub) - if err != nil { - return "", err - } - b := sha256.Sum256([]byte(jwk)) - return base64.RawURLEncoding.EncodeToString(b[:]), nil -} diff --git a/vendor/golang.org/x/crypto/acme/jws_test.go b/vendor/golang.org/x/crypto/acme/jws_test.go deleted file mode 100644 index 1def87397..000000000 --- a/vendor/golang.org/x/crypto/acme/jws_test.go +++ /dev/null @@ -1,266 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package acme - -import ( - "crypto/ecdsa" - "crypto/elliptic" - "crypto/rsa" - "crypto/x509" - "encoding/base64" - "encoding/json" - "encoding/pem" - "math/big" - "testing" -) - -const testKeyPEM = ` ------BEGIN RSA PRIVATE KEY----- -MIIEowIBAAKCAQEA4xgZ3eRPkwoRvy7qeRUbmMDe0V+xH9eWLdu0iheeLlrmD2mq -WXfP9IeSKApbn34g8TuAS9g5zhq8ELQ3kmjr+KV86GAMgI6VAcGlq3QrzpTCf/30 -Ab7+zawrfRaFONa1HwEzPY1KHnGVkxJc85gNkwYI9SY2RHXtvln3zs5wITNrdosq -EXeaIkVYBEhbhNu54pp3kxo6TuWLi9e6pXeWetEwmlBwtWZlPoib2j3TxLBksKZf -oyFyek380mHgJAumQ/I2fjj98/97mk3ihOY4AgVdCDj1z/GCoZkG5Rq7nbCGyosy -KWyDX00Zs+nNqVhoLeIvXC4nnWdJMZ6rogxyQQIDAQABAoIBACIEZTOI1Kao9nmV -9IeIsuaR1Y61b9neOF/MLmIVIZu+AAJFCMB4Iw11FV6sFodwpEyeZhx2WkpWVN+H -r19eGiLX3zsL0DOdqBJoSIHDWCCMxgnYJ6nvS0nRxX3qVrBp8R2g12Ub+gNPbmFm -ecf/eeERIVxfifd9VsyRu34eDEvcmKFuLYbElFcPh62xE3x12UZvV/sN7gXbawpP -G+w255vbE5MoaKdnnO83cTFlcHvhn24M/78qP7Te5OAeelr1R89kYxQLpuGe4fbS -zc6E3ym5Td6urDetGGrSY1Eu10/8sMusX+KNWkm+RsBRbkyKq72ks/qKpOxOa+c6 -9gm+Y8ECgYEA/iNUyg1ubRdH11p82l8KHtFC1DPE0V1gSZsX29TpM5jS4qv46K+s -8Ym1zmrORM8x+cynfPx1VQZQ34EYeCMIX212ryJ+zDATl4NE0I4muMvSiH9vx6Xc -7FmhNnaYzPsBL5Tm9nmtQuP09YEn8poiOJFiDs/4olnD5ogA5O4THGkCgYEA5MIL -qWYBUuqbEWLRtMruUtpASclrBqNNsJEsMGbeqBJmoMxdHeSZckbLOrqm7GlMyNRJ -Ne/5uWRGSzaMYuGmwsPpERzqEvYFnSrpjW5YtXZ+JtxFXNVfm9Z1gLLgvGpOUCIU -RbpoDckDe1vgUuk3y5+DjZihs+rqIJ45XzXTzBkCgYBWuf3segruJZy5rEKhTv+o -JqeUvRn0jNYYKFpLBeyTVBrbie6GkbUGNIWbrK05pC+c3K9nosvzuRUOQQL1tJbd -4gA3oiD9U4bMFNr+BRTHyZ7OQBcIXdz3t1qhuHVKtnngIAN1p25uPlbRFUNpshnt -jgeVoHlsBhApcs5DUc+pyQKBgDzeHPg/+g4z+nrPznjKnktRY1W+0El93kgi+J0Q -YiJacxBKEGTJ1MKBb8X6sDurcRDm22wMpGfd9I5Cv2v4GsUsF7HD/cx5xdih+G73 -c4clNj/k0Ff5Nm1izPUno4C+0IOl7br39IPmfpSuR6wH/h6iHQDqIeybjxyKvT1G -N0rRAoGBAKGD+4ZI/E1MoJ5CXB8cDDMHagbE3cq/DtmYzE2v1DFpQYu5I4PCm5c7 -EQeIP6dZtv8IMgtGIb91QX9pXvP0aznzQKwYIA8nZgoENCPfiMTPiEDT9e/0lObO -9XWsXpbSTsRPj0sv1rB+UzBJ0PgjK4q2zOF0sNo7b1+6nlM3BWPx ------END RSA PRIVATE KEY----- -` - -// This thumbprint is for the testKey defined above. -const testKeyThumbprint = "6nicxzh6WETQlrvdchkz-U3e3DOQZ4heJKU63rfqMqQ" - -const ( - // openssl ecparam -name secp256k1 -genkey -noout - testKeyECPEM = ` ------BEGIN EC PRIVATE KEY----- -MHcCAQEEIK07hGLr0RwyUdYJ8wbIiBS55CjnkMD23DWr+ccnypWLoAoGCCqGSM49 -AwEHoUQDQgAE5lhEug5xK4xBDZ2nAbaxLtaLiv85bxJ7ePd1dkO23HThqIrvawF5 -QAaS/RNouybCiRhRjI3EaxLkQwgrCw0gqQ== ------END EC PRIVATE KEY----- -` - // 1. opnessl ec -in key.pem -noout -text - // 2. remove first byte, 04 (the header); the rest is X and Y - // 3. covert each with: echo | xxd -r -p | base64 | tr -d '=' | tr '/+' '_-' - testKeyECPubX = "5lhEug5xK4xBDZ2nAbaxLtaLiv85bxJ7ePd1dkO23HQ" - testKeyECPubY = "4aiK72sBeUAGkv0TaLsmwokYUYyNxGsS5EMIKwsNIKk" - // echo -n '{"crv":"P-256","kty":"EC","x":"","y":""}' | \ - // openssl dgst -binary -sha256 | base64 | tr -d '=' | tr '/+' '_-' - testKeyECThumbprint = "zedj-Bd1Zshp8KLePv2MB-lJ_Hagp7wAwdkA0NUTniU" -) - -var ( - testKey *rsa.PrivateKey - testKeyEC *ecdsa.PrivateKey -) - -func init() { - d, _ := pem.Decode([]byte(testKeyPEM)) - if d == nil { - panic("no block found in testKeyPEM") - } - var err error - testKey, err = x509.ParsePKCS1PrivateKey(d.Bytes) - if err != nil { - panic(err.Error()) - } - - if d, _ = pem.Decode([]byte(testKeyECPEM)); d == nil { - panic("no block found in testKeyECPEM") - } - testKeyEC, err = x509.ParseECPrivateKey(d.Bytes) - if err != nil { - panic(err.Error()) - } -} - -func TestJWSEncodeJSON(t *testing.T) { - claims := struct{ Msg string }{"Hello JWS"} - // JWS signed with testKey and "nonce" as the nonce value - // JSON-serialized JWS fields are split for easier testing - const ( - // {"alg":"RS256","jwk":{"e":"AQAB","kty":"RSA","n":"..."},"nonce":"nonce"} - protected = "eyJhbGciOiJSUzI1NiIsImp3ayI6eyJlIjoiQVFBQiIsImt0eSI6" + - "IlJTQSIsIm4iOiI0eGdaM2VSUGt3b1J2eTdxZVJVYm1NRGUwVi14" + - "SDllV0xkdTBpaGVlTGxybUQybXFXWGZQOUllU0tBcGJuMzRnOFR1" + - "QVM5ZzV6aHE4RUxRM2ttanItS1Y4NkdBTWdJNlZBY0dscTNRcnpw" + - "VENmXzMwQWI3LXphd3JmUmFGT05hMUh3RXpQWTFLSG5HVmt4SmM4" + - "NWdOa3dZSTlTWTJSSFh0dmxuM3pzNXdJVE5yZG9zcUVYZWFJa1ZZ" + - "QkVoYmhOdTU0cHAza3hvNlR1V0xpOWU2cFhlV2V0RXdtbEJ3dFda" + - "bFBvaWIyajNUeExCa3NLWmZveUZ5ZWszODBtSGdKQXVtUV9JMmZq" + - "ajk4Xzk3bWszaWhPWTRBZ1ZkQ0RqMXpfR0NvWmtHNVJxN25iQ0d5" + - "b3N5S1d5RFgwMFpzLW5OcVZob0xlSXZYQzRubldkSk1aNnJvZ3h5" + - "UVEifSwibm9uY2UiOiJub25jZSJ9" - // {"Msg":"Hello JWS"} - payload = "eyJNc2ciOiJIZWxsbyBKV1MifQ" - signature = "eAGUikStX_UxyiFhxSLMyuyBcIB80GeBkFROCpap2sW3EmkU_ggF" + - "knaQzxrTfItICSAXsCLIquZ5BbrSWA_4vdEYrwWtdUj7NqFKjHRa" + - "zpLHcoR7r1rEHvkoP1xj49lS5fc3Wjjq8JUhffkhGbWZ8ZVkgPdC" + - "4tMBWiQDoth-x8jELP_3LYOB_ScUXi2mETBawLgOT2K8rA0Vbbmx" + - "hWNlOWuUf-8hL5YX4IOEwsS8JK_TrTq5Zc9My0zHJmaieqDV0UlP" + - "k0onFjPFkGm7MrPSgd0MqRG-4vSAg2O4hDo7rKv4n8POjjXlNQvM" + - "9IPLr8qZ7usYBKhEGwX3yq_eicAwBw" - ) - - b, err := jwsEncodeJSON(claims, testKey, "nonce") - if err != nil { - t.Fatal(err) - } - var jws struct{ Protected, Payload, Signature string } - if err := json.Unmarshal(b, &jws); err != nil { - t.Fatal(err) - } - if jws.Protected != protected { - t.Errorf("protected:\n%s\nwant:\n%s", jws.Protected, protected) - } - if jws.Payload != payload { - t.Errorf("payload:\n%s\nwant:\n%s", jws.Payload, payload) - } - if jws.Signature != signature { - t.Errorf("signature:\n%s\nwant:\n%s", jws.Signature, signature) - } -} - -func TestJWSEncodeJSONEC(t *testing.T) { - claims := struct{ Msg string }{"Hello JWS"} - - b, err := jwsEncodeJSON(claims, testKeyEC, "nonce") - if err != nil { - t.Fatal(err) - } - var jws struct{ Protected, Payload, Signature string } - if err := json.Unmarshal(b, &jws); err != nil { - t.Fatal(err) - } - - if b, err = base64.RawURLEncoding.DecodeString(jws.Protected); err != nil { - t.Fatalf("jws.Protected: %v", err) - } - var head struct { - Alg string - Nonce string - JWK struct { - Crv string - Kty string - X string - Y string - } `json:"jwk"` - } - if err := json.Unmarshal(b, &head); err != nil { - t.Fatalf("jws.Protected: %v", err) - } - if head.Alg != "ES256" { - t.Errorf("head.Alg = %q; want ES256", head.Alg) - } - if head.Nonce != "nonce" { - t.Errorf("head.Nonce = %q; want nonce", head.Nonce) - } - if head.JWK.Crv != "P-256" { - t.Errorf("head.JWK.Crv = %q; want P-256", head.JWK.Crv) - } - if head.JWK.Kty != "EC" { - t.Errorf("head.JWK.Kty = %q; want EC", head.JWK.Kty) - } - if head.JWK.X != testKeyECPubX { - t.Errorf("head.JWK.X = %q; want %q", head.JWK.X, testKeyECPubX) - } - if head.JWK.Y != testKeyECPubY { - t.Errorf("head.JWK.Y = %q; want %q", head.JWK.Y, testKeyECPubY) - } -} - -func TestJWKThumbprintRSA(t *testing.T) { - // Key example from RFC 7638 - const base64N = "0vx7agoebGcQSuuPiLJXZptN9nndrQmbXEps2aiAFbWhM78LhWx4cbbfAAt" + - "VT86zwu1RK7aPFFxuhDR1L6tSoc_BJECPebWKRXjBZCiFV4n3oknjhMstn6" + - "4tZ_2W-5JsGY4Hc5n9yBXArwl93lqt7_RN5w6Cf0h4QyQ5v-65YGjQR0_FD" + - "W2QvzqY368QQMicAtaSqzs8KJZgnYb9c7d0zgdAZHzu6qMQvRL5hajrn1n9" + - "1CbOpbISD08qNLyrdkt-bFTWhAI4vMQFh6WeZu0fM4lFd2NcRwr3XPksINH" + - "aQ-G_xBniIqbw0Ls1jF44-csFCur-kEgU8awapJzKnqDKgw" - const base64E = "AQAB" - const expected = "NzbLsXh8uDCcd-6MNwXF4W_7noWXFZAfHkxZsRGC9Xs" - - b, err := base64.RawURLEncoding.DecodeString(base64N) - if err != nil { - t.Fatalf("Error parsing example key N: %v", err) - } - n := new(big.Int).SetBytes(b) - - b, err = base64.RawURLEncoding.DecodeString(base64E) - if err != nil { - t.Fatalf("Error parsing example key E: %v", err) - } - e := new(big.Int).SetBytes(b) - - pub := &rsa.PublicKey{N: n, E: int(e.Uint64())} - th, err := JWKThumbprint(pub) - if err != nil { - t.Error(err) - } - if th != expected { - t.Errorf("thumbprint = %q; want %q", th, expected) - } -} - -func TestJWKThumbprintEC(t *testing.T) { - // Key example from RFC 7520 - // expected was computed with - // echo -n '{"crv":"P-521","kty":"EC","x":"","y":""}' | \ - // openssl dgst -binary -sha256 | \ - // base64 | \ - // tr -d '=' | tr '/+' '_-' - const ( - base64X = "AHKZLLOsCOzz5cY97ewNUajB957y-C-U88c3v13nmGZx6sYl_oJXu9A5RkT" + - "KqjqvjyekWF-7ytDyRXYgCF5cj0Kt" - base64Y = "AdymlHvOiLxXkEhayXQnNCvDX4h9htZaCJN34kfmC6pV5OhQHiraVySsUda" + - "QkAgDPrwQrJmbnX9cwlGfP-HqHZR1" - expected = "dHri3SADZkrush5HU_50AoRhcKFryN-PI6jPBtPL55M" - ) - - b, err := base64.RawURLEncoding.DecodeString(base64X) - if err != nil { - t.Fatalf("Error parsing example key X: %v", err) - } - x := new(big.Int).SetBytes(b) - - b, err = base64.RawURLEncoding.DecodeString(base64Y) - if err != nil { - t.Fatalf("Error parsing example key Y: %v", err) - } - y := new(big.Int).SetBytes(b) - - pub := &ecdsa.PublicKey{Curve: elliptic.P521(), X: x, Y: y} - th, err := JWKThumbprint(pub) - if err != nil { - t.Error(err) - } - if th != expected { - t.Errorf("thumbprint = %q; want %q", th, expected) - } -} - -func TestJWKThumbprintErrUnsupportedKey(t *testing.T) { - _, err := JWKThumbprint(struct{}{}) - if err != ErrUnsupportedKey { - t.Errorf("err = %q; want %q", err, ErrUnsupportedKey) - } -} diff --git a/vendor/golang.org/x/crypto/acme/types.go b/vendor/golang.org/x/crypto/acme/types.go deleted file mode 100644 index 0513b2e55..000000000 --- a/vendor/golang.org/x/crypto/acme/types.go +++ /dev/null @@ -1,209 +0,0 @@ -package acme - -import ( - "errors" - "fmt" - "net/http" -) - -// ACME server response statuses used to describe Authorization and Challenge states. -const ( - StatusUnknown = "unknown" - StatusPending = "pending" - StatusProcessing = "processing" - StatusValid = "valid" - StatusInvalid = "invalid" - StatusRevoked = "revoked" -) - -// CRLReasonCode identifies the reason for a certificate revocation. -type CRLReasonCode int - -// CRL reason codes as defined in RFC 5280. -const ( - CRLReasonUnspecified CRLReasonCode = 0 - CRLReasonKeyCompromise CRLReasonCode = 1 - CRLReasonCACompromise CRLReasonCode = 2 - CRLReasonAffiliationChanged CRLReasonCode = 3 - CRLReasonSuperseded CRLReasonCode = 4 - CRLReasonCessationOfOperation CRLReasonCode = 5 - CRLReasonCertificateHold CRLReasonCode = 6 - CRLReasonRemoveFromCRL CRLReasonCode = 8 - CRLReasonPrivilegeWithdrawn CRLReasonCode = 9 - CRLReasonAACompromise CRLReasonCode = 10 -) - -var ( - // ErrAuthorizationFailed indicates that an authorization for an identifier - // did not succeed. - ErrAuthorizationFailed = errors.New("acme: identifier authorization failed") - - // ErrUnsupportedKey is returned when an unsupported key type is encountered. - ErrUnsupportedKey = errors.New("acme: unknown key type; only RSA and ECDSA are supported") -) - -// Error is an ACME error, defined in Problem Details for HTTP APIs doc -// http://tools.ietf.org/html/draft-ietf-appsawg-http-problem. -type Error struct { - // StatusCode is The HTTP status code generated by the origin server. - StatusCode int - // ProblemType is a URI reference that identifies the problem type, - // typically in a "urn:acme:error:xxx" form. - ProblemType string - // Detail is a human-readable explanation specific to this occurrence of the problem. - Detail string - // Header is the original server error response headers. - Header http.Header -} - -func (e *Error) Error() string { - return fmt.Sprintf("%d %s: %s", e.StatusCode, e.ProblemType, e.Detail) -} - -// Account is a user account. It is associated with a private key. -type Account struct { - // URI is the account unique ID, which is also a URL used to retrieve - // account data from the CA. - URI string - - // Contact is a slice of contact info used during registration. - Contact []string - - // The terms user has agreed to. - // A value not matching CurrentTerms indicates that the user hasn't agreed - // to the actual Terms of Service of the CA. - AgreedTerms string - - // Actual terms of a CA. - CurrentTerms string - - // Authz is the authorization URL used to initiate a new authz flow. - Authz string - - // Authorizations is a URI from which a list of authorizations - // granted to this account can be fetched via a GET request. - Authorizations string - - // Certificates is a URI from which a list of certificates - // issued for this account can be fetched via a GET request. - Certificates string -} - -// Directory is ACME server discovery data. -type Directory struct { - // RegURL is an account endpoint URL, allowing for creating new - // and modifying existing accounts. - RegURL string - - // AuthzURL is used to initiate Identifier Authorization flow. - AuthzURL string - - // CertURL is a new certificate issuance endpoint URL. - CertURL string - - // RevokeURL is used to initiate a certificate revocation flow. - RevokeURL string - - // Term is a URI identifying the current terms of service. - Terms string - - // Website is an HTTP or HTTPS URL locating a website - // providing more information about the ACME server. - Website string - - // CAA consists of lowercase hostname elements, which the ACME server - // recognises as referring to itself for the purposes of CAA record validation - // as defined in RFC6844. - CAA []string -} - -// Challenge encodes a returned CA challenge. -type Challenge struct { - // Type is the challenge type, e.g. "http-01", "tls-sni-02", "dns-01". - Type string - - // URI is where a challenge response can be posted to. - URI string - - // Token is a random value that uniquely identifies the challenge. - Token string - - // Status identifies the status of this challenge. - Status string -} - -// Authorization encodes an authorization response. -type Authorization struct { - // URI uniquely identifies a authorization. - URI string - - // Status identifies the status of an authorization. - Status string - - // Identifier is what the account is authorized to represent. - Identifier AuthzID - - // Challenges that the client needs to fulfill in order to prove possession - // of the identifier (for pending authorizations). - // For final authorizations, the challenges that were used. - Challenges []*Challenge - - // A collection of sets of challenges, each of which would be sufficient - // to prove possession of the identifier. - // Clients must complete a set of challenges that covers at least one set. - // Challenges are identified by their indices in the challenges array. - // If this field is empty, the client needs to complete all challenges. - Combinations [][]int -} - -// AuthzID is an identifier that an account is authorized to represent. -type AuthzID struct { - Type string // The type of identifier, e.g. "dns". - Value string // The identifier itself, e.g. "example.org". -} - -// wireAuthz is ACME JSON representation of Authorization objects. -type wireAuthz struct { - Status string - Challenges []wireChallenge - Combinations [][]int - Identifier struct { - Type string - Value string - } -} - -func (z *wireAuthz) authorization(uri string) *Authorization { - a := &Authorization{ - URI: uri, - Status: z.Status, - Identifier: AuthzID{Type: z.Identifier.Type, Value: z.Identifier.Value}, - Combinations: z.Combinations, // shallow copy - Challenges: make([]*Challenge, len(z.Challenges)), - } - for i, v := range z.Challenges { - a.Challenges[i] = v.challenge() - } - return a -} - -// wireChallenge is ACME JSON challenge representation. -type wireChallenge struct { - URI string `json:"uri"` - Type string - Token string - Status string -} - -func (c *wireChallenge) challenge() *Challenge { - v := &Challenge{ - URI: c.URI, - Type: c.Type, - Token: c.Token, - Status: c.Status, - } - if v.Status == "" { - v.Status = StatusPending - } - return v -} diff --git a/vendor/golang.org/x/crypto/bcrypt/base64.go b/vendor/golang.org/x/crypto/bcrypt/base64.go deleted file mode 100644 index fc3116090..000000000 --- a/vendor/golang.org/x/crypto/bcrypt/base64.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bcrypt - -import "encoding/base64" - -const alphabet = "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" - -var bcEncoding = base64.NewEncoding(alphabet) - -func base64Encode(src []byte) []byte { - n := bcEncoding.EncodedLen(len(src)) - dst := make([]byte, n) - bcEncoding.Encode(dst, src) - for dst[n-1] == '=' { - n-- - } - return dst[:n] -} - -func base64Decode(src []byte) ([]byte, error) { - numOfEquals := 4 - (len(src) % 4) - for i := 0; i < numOfEquals; i++ { - src = append(src, '=') - } - - dst := make([]byte, bcEncoding.DecodedLen(len(src))) - n, err := bcEncoding.Decode(dst, src) - if err != nil { - return nil, err - } - return dst[:n], nil -} diff --git a/vendor/golang.org/x/crypto/bcrypt/bcrypt.go b/vendor/golang.org/x/crypto/bcrypt/bcrypt.go deleted file mode 100644 index f8b807f9c..000000000 --- a/vendor/golang.org/x/crypto/bcrypt/bcrypt.go +++ /dev/null @@ -1,294 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package bcrypt implements Provos and Mazières's bcrypt adaptive hashing -// algorithm. See http://www.usenix.org/event/usenix99/provos/provos.pdf -package bcrypt // import "golang.org/x/crypto/bcrypt" - -// The code is a port of Provos and Mazières's C implementation. -import ( - "crypto/rand" - "crypto/subtle" - "errors" - "fmt" - "golang.org/x/crypto/blowfish" - "io" - "strconv" -) - -const ( - MinCost int = 4 // the minimum allowable cost as passed in to GenerateFromPassword - MaxCost int = 31 // the maximum allowable cost as passed in to GenerateFromPassword - DefaultCost int = 10 // the cost that will actually be set if a cost below MinCost is passed into GenerateFromPassword -) - -// The error returned from CompareHashAndPassword when a password and hash do -// not match. -var ErrMismatchedHashAndPassword = errors.New("crypto/bcrypt: hashedPassword is not the hash of the given password") - -// The error returned from CompareHashAndPassword when a hash is too short to -// be a bcrypt hash. -var ErrHashTooShort = errors.New("crypto/bcrypt: hashedSecret too short to be a bcrypted password") - -// The error returned from CompareHashAndPassword when a hash was created with -// a bcrypt algorithm newer than this implementation. -type HashVersionTooNewError byte - -func (hv HashVersionTooNewError) Error() string { - return fmt.Sprintf("crypto/bcrypt: bcrypt algorithm version '%c' requested is newer than current version '%c'", byte(hv), majorVersion) -} - -// The error returned from CompareHashAndPassword when a hash starts with something other than '$' -type InvalidHashPrefixError byte - -func (ih InvalidHashPrefixError) Error() string { - return fmt.Sprintf("crypto/bcrypt: bcrypt hashes must start with '$', but hashedSecret started with '%c'", byte(ih)) -} - -type InvalidCostError int - -func (ic InvalidCostError) Error() string { - return fmt.Sprintf("crypto/bcrypt: cost %d is outside allowed range (%d,%d)", int(ic), int(MinCost), int(MaxCost)) -} - -const ( - majorVersion = '2' - minorVersion = 'a' - maxSaltSize = 16 - maxCryptedHashSize = 23 - encodedSaltSize = 22 - encodedHashSize = 31 - minHashSize = 59 -) - -// magicCipherData is an IV for the 64 Blowfish encryption calls in -// bcrypt(). It's the string "OrpheanBeholderScryDoubt" in big-endian bytes. -var magicCipherData = []byte{ - 0x4f, 0x72, 0x70, 0x68, - 0x65, 0x61, 0x6e, 0x42, - 0x65, 0x68, 0x6f, 0x6c, - 0x64, 0x65, 0x72, 0x53, - 0x63, 0x72, 0x79, 0x44, - 0x6f, 0x75, 0x62, 0x74, -} - -type hashed struct { - hash []byte - salt []byte - cost int // allowed range is MinCost to MaxCost - major byte - minor byte -} - -// GenerateFromPassword returns the bcrypt hash of the password at the given -// cost. If the cost given is less than MinCost, the cost will be set to -// DefaultCost, instead. Use CompareHashAndPassword, as defined in this package, -// to compare the returned hashed password with its cleartext version. -func GenerateFromPassword(password []byte, cost int) ([]byte, error) { - p, err := newFromPassword(password, cost) - if err != nil { - return nil, err - } - return p.Hash(), nil -} - -// CompareHashAndPassword compares a bcrypt hashed password with its possible -// plaintext equivalent. Returns nil on success, or an error on failure. -func CompareHashAndPassword(hashedPassword, password []byte) error { - p, err := newFromHash(hashedPassword) - if err != nil { - return err - } - - otherHash, err := bcrypt(password, p.cost, p.salt) - if err != nil { - return err - } - - otherP := &hashed{otherHash, p.salt, p.cost, p.major, p.minor} - if subtle.ConstantTimeCompare(p.Hash(), otherP.Hash()) == 1 { - return nil - } - - return ErrMismatchedHashAndPassword -} - -// Cost returns the hashing cost used to create the given hashed -// password. When, in the future, the hashing cost of a password system needs -// to be increased in order to adjust for greater computational power, this -// function allows one to establish which passwords need to be updated. -func Cost(hashedPassword []byte) (int, error) { - p, err := newFromHash(hashedPassword) - if err != nil { - return 0, err - } - return p.cost, nil -} - -func newFromPassword(password []byte, cost int) (*hashed, error) { - if cost < MinCost { - cost = DefaultCost - } - p := new(hashed) - p.major = majorVersion - p.minor = minorVersion - - err := checkCost(cost) - if err != nil { - return nil, err - } - p.cost = cost - - unencodedSalt := make([]byte, maxSaltSize) - _, err = io.ReadFull(rand.Reader, unencodedSalt) - if err != nil { - return nil, err - } - - p.salt = base64Encode(unencodedSalt) - hash, err := bcrypt(password, p.cost, p.salt) - if err != nil { - return nil, err - } - p.hash = hash - return p, err -} - -func newFromHash(hashedSecret []byte) (*hashed, error) { - if len(hashedSecret) < minHashSize { - return nil, ErrHashTooShort - } - p := new(hashed) - n, err := p.decodeVersion(hashedSecret) - if err != nil { - return nil, err - } - hashedSecret = hashedSecret[n:] - n, err = p.decodeCost(hashedSecret) - if err != nil { - return nil, err - } - hashedSecret = hashedSecret[n:] - - // The "+2" is here because we'll have to append at most 2 '=' to the salt - // when base64 decoding it in expensiveBlowfishSetup(). - p.salt = make([]byte, encodedSaltSize, encodedSaltSize+2) - copy(p.salt, hashedSecret[:encodedSaltSize]) - - hashedSecret = hashedSecret[encodedSaltSize:] - p.hash = make([]byte, len(hashedSecret)) - copy(p.hash, hashedSecret) - - return p, nil -} - -func bcrypt(password []byte, cost int, salt []byte) ([]byte, error) { - cipherData := make([]byte, len(magicCipherData)) - copy(cipherData, magicCipherData) - - c, err := expensiveBlowfishSetup(password, uint32(cost), salt) - if err != nil { - return nil, err - } - - for i := 0; i < 24; i += 8 { - for j := 0; j < 64; j++ { - c.Encrypt(cipherData[i:i+8], cipherData[i:i+8]) - } - } - - // Bug compatibility with C bcrypt implementations. We only encode 23 of - // the 24 bytes encrypted. - hsh := base64Encode(cipherData[:maxCryptedHashSize]) - return hsh, nil -} - -func expensiveBlowfishSetup(key []byte, cost uint32, salt []byte) (*blowfish.Cipher, error) { - - csalt, err := base64Decode(salt) - if err != nil { - return nil, err - } - - // Bug compatibility with C bcrypt implementations. They use the trailing - // NULL in the key string during expansion. - ckey := append(key, 0) - - c, err := blowfish.NewSaltedCipher(ckey, csalt) - if err != nil { - return nil, err - } - - var i, rounds uint64 - rounds = 1 << cost - for i = 0; i < rounds; i++ { - blowfish.ExpandKey(ckey, c) - blowfish.ExpandKey(csalt, c) - } - - return c, nil -} - -func (p *hashed) Hash() []byte { - arr := make([]byte, 60) - arr[0] = '$' - arr[1] = p.major - n := 2 - if p.minor != 0 { - arr[2] = p.minor - n = 3 - } - arr[n] = '$' - n += 1 - copy(arr[n:], []byte(fmt.Sprintf("%02d", p.cost))) - n += 2 - arr[n] = '$' - n += 1 - copy(arr[n:], p.salt) - n += encodedSaltSize - copy(arr[n:], p.hash) - n += encodedHashSize - return arr[:n] -} - -func (p *hashed) decodeVersion(sbytes []byte) (int, error) { - if sbytes[0] != '$' { - return -1, InvalidHashPrefixError(sbytes[0]) - } - if sbytes[1] > majorVersion { - return -1, HashVersionTooNewError(sbytes[1]) - } - p.major = sbytes[1] - n := 3 - if sbytes[2] != '$' { - p.minor = sbytes[2] - n++ - } - return n, nil -} - -// sbytes should begin where decodeVersion left off. -func (p *hashed) decodeCost(sbytes []byte) (int, error) { - cost, err := strconv.Atoi(string(sbytes[0:2])) - if err != nil { - return -1, err - } - err = checkCost(cost) - if err != nil { - return -1, err - } - p.cost = cost - return 3, nil -} - -func (p *hashed) String() string { - return fmt.Sprintf("&{hash: %#v, salt: %#v, cost: %d, major: %c, minor: %c}", string(p.hash), p.salt, p.cost, p.major, p.minor) -} - -func checkCost(cost int) error { - if cost < MinCost || cost > MaxCost { - return InvalidCostError(cost) - } - return nil -} diff --git a/vendor/golang.org/x/crypto/bcrypt/bcrypt_test.go b/vendor/golang.org/x/crypto/bcrypt/bcrypt_test.go deleted file mode 100644 index f08a6f5b2..000000000 --- a/vendor/golang.org/x/crypto/bcrypt/bcrypt_test.go +++ /dev/null @@ -1,226 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bcrypt - -import ( - "bytes" - "fmt" - "testing" -) - -func TestBcryptingIsEasy(t *testing.T) { - pass := []byte("mypassword") - hp, err := GenerateFromPassword(pass, 0) - if err != nil { - t.Fatalf("GenerateFromPassword error: %s", err) - } - - if CompareHashAndPassword(hp, pass) != nil { - t.Errorf("%v should hash %s correctly", hp, pass) - } - - notPass := "notthepass" - err = CompareHashAndPassword(hp, []byte(notPass)) - if err != ErrMismatchedHashAndPassword { - t.Errorf("%v and %s should be mismatched", hp, notPass) - } -} - -func TestBcryptingIsCorrect(t *testing.T) { - pass := []byte("allmine") - salt := []byte("XajjQvNhvvRt5GSeFk1xFe") - expectedHash := []byte("$2a$10$XajjQvNhvvRt5GSeFk1xFeyqRrsxkhBkUiQeg0dt.wU1qD4aFDcga") - - hash, err := bcrypt(pass, 10, salt) - if err != nil { - t.Fatalf("bcrypt blew up: %v", err) - } - if !bytes.HasSuffix(expectedHash, hash) { - t.Errorf("%v should be the suffix of %v", hash, expectedHash) - } - - h, err := newFromHash(expectedHash) - if err != nil { - t.Errorf("Unable to parse %s: %v", string(expectedHash), err) - } - - // This is not the safe way to compare these hashes. We do this only for - // testing clarity. Use bcrypt.CompareHashAndPassword() - if err == nil && !bytes.Equal(expectedHash, h.Hash()) { - t.Errorf("Parsed hash %v should equal %v", h.Hash(), expectedHash) - } -} - -func TestVeryShortPasswords(t *testing.T) { - key := []byte("k") - salt := []byte("XajjQvNhvvRt5GSeFk1xFe") - _, err := bcrypt(key, 10, salt) - if err != nil { - t.Errorf("One byte key resulted in error: %s", err) - } -} - -func TestTooLongPasswordsWork(t *testing.T) { - salt := []byte("XajjQvNhvvRt5GSeFk1xFe") - // One byte over the usual 56 byte limit that blowfish has - tooLongPass := []byte("012345678901234567890123456789012345678901234567890123456") - tooLongExpected := []byte("$2a$10$XajjQvNhvvRt5GSeFk1xFe5l47dONXg781AmZtd869sO8zfsHuw7C") - hash, err := bcrypt(tooLongPass, 10, salt) - if err != nil { - t.Fatalf("bcrypt blew up on long password: %v", err) - } - if !bytes.HasSuffix(tooLongExpected, hash) { - t.Errorf("%v should be the suffix of %v", hash, tooLongExpected) - } -} - -type InvalidHashTest struct { - err error - hash []byte -} - -var invalidTests = []InvalidHashTest{ - {ErrHashTooShort, []byte("$2a$10$fooo")}, - {ErrHashTooShort, []byte("$2a")}, - {HashVersionTooNewError('3'), []byte("$3a$10$sssssssssssssssssssssshhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh")}, - {InvalidHashPrefixError('%'), []byte("%2a$10$sssssssssssssssssssssshhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh")}, - {InvalidCostError(32), []byte("$2a$32$sssssssssssssssssssssshhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh")}, -} - -func TestInvalidHashErrors(t *testing.T) { - check := func(name string, expected, err error) { - if err == nil { - t.Errorf("%s: Should have returned an error", name) - } - if err != nil && err != expected { - t.Errorf("%s gave err %v but should have given %v", name, err, expected) - } - } - for _, iht := range invalidTests { - _, err := newFromHash(iht.hash) - check("newFromHash", iht.err, err) - err = CompareHashAndPassword(iht.hash, []byte("anything")) - check("CompareHashAndPassword", iht.err, err) - } -} - -func TestUnpaddedBase64Encoding(t *testing.T) { - original := []byte{101, 201, 101, 75, 19, 227, 199, 20, 239, 236, 133, 32, 30, 109, 243, 30} - encodedOriginal := []byte("XajjQvNhvvRt5GSeFk1xFe") - - encoded := base64Encode(original) - - if !bytes.Equal(encodedOriginal, encoded) { - t.Errorf("Encoded %v should have equaled %v", encoded, encodedOriginal) - } - - decoded, err := base64Decode(encodedOriginal) - if err != nil { - t.Fatalf("base64Decode blew up: %s", err) - } - - if !bytes.Equal(decoded, original) { - t.Errorf("Decoded %v should have equaled %v", decoded, original) - } -} - -func TestCost(t *testing.T) { - suffix := "XajjQvNhvvRt5GSeFk1xFe5l47dONXg781AmZtd869sO8zfsHuw7C" - for _, vers := range []string{"2a", "2"} { - for _, cost := range []int{4, 10} { - s := fmt.Sprintf("$%s$%02d$%s", vers, cost, suffix) - h := []byte(s) - actual, err := Cost(h) - if err != nil { - t.Errorf("Cost, error: %s", err) - continue - } - if actual != cost { - t.Errorf("Cost, expected: %d, actual: %d", cost, actual) - } - } - } - _, err := Cost([]byte("$a$a$" + suffix)) - if err == nil { - t.Errorf("Cost, malformed but no error returned") - } -} - -func TestCostValidationInHash(t *testing.T) { - if testing.Short() { - return - } - - pass := []byte("mypassword") - - for c := 0; c < MinCost; c++ { - p, _ := newFromPassword(pass, c) - if p.cost != DefaultCost { - t.Errorf("newFromPassword should default costs below %d to %d, but was %d", MinCost, DefaultCost, p.cost) - } - } - - p, _ := newFromPassword(pass, 14) - if p.cost != 14 { - t.Errorf("newFromPassword should default cost to 14, but was %d", p.cost) - } - - hp, _ := newFromHash(p.Hash()) - if p.cost != hp.cost { - t.Errorf("newFromHash should maintain the cost at %d, but was %d", p.cost, hp.cost) - } - - _, err := newFromPassword(pass, 32) - if err == nil { - t.Fatalf("newFromPassword: should return a cost error") - } - if err != InvalidCostError(32) { - t.Errorf("newFromPassword: should return cost error, got %#v", err) - } -} - -func TestCostReturnsWithLeadingZeroes(t *testing.T) { - hp, _ := newFromPassword([]byte("abcdefgh"), 7) - cost := hp.Hash()[4:7] - expected := []byte("07$") - - if !bytes.Equal(expected, cost) { - t.Errorf("single digit costs in hash should have leading zeros: was %v instead of %v", cost, expected) - } -} - -func TestMinorNotRequired(t *testing.T) { - noMinorHash := []byte("$2$10$XajjQvNhvvRt5GSeFk1xFeyqRrsxkhBkUiQeg0dt.wU1qD4aFDcga") - h, err := newFromHash(noMinorHash) - if err != nil { - t.Fatalf("No minor hash blew up: %s", err) - } - if h.minor != 0 { - t.Errorf("Should leave minor version at 0, but was %d", h.minor) - } - - if !bytes.Equal(noMinorHash, h.Hash()) { - t.Errorf("Should generate hash %v, but created %v", noMinorHash, h.Hash()) - } -} - -func BenchmarkEqual(b *testing.B) { - b.StopTimer() - passwd := []byte("somepasswordyoulike") - hash, _ := GenerateFromPassword(passwd, 10) - b.StartTimer() - for i := 0; i < b.N; i++ { - CompareHashAndPassword(hash, passwd) - } -} - -func BenchmarkGeneration(b *testing.B) { - b.StopTimer() - passwd := []byte("mylongpassword1234") - b.StartTimer() - for i := 0; i < b.N; i++ { - GenerateFromPassword(passwd, 10) - } -} diff --git a/vendor/golang.org/x/crypto/blake2b/blake2b.go b/vendor/golang.org/x/crypto/blake2b/blake2b.go deleted file mode 100644 index ce6224101..000000000 --- a/vendor/golang.org/x/crypto/blake2b/blake2b.go +++ /dev/null @@ -1,194 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package blake2b implements the BLAKE2b hash algorithm as -// defined in RFC 7693. -package blake2b // import "golang.org/x/crypto/blake2b" - -import ( - "encoding/binary" - "errors" - "hash" -) - -const ( - // The blocksize of BLAKE2b in bytes. - BlockSize = 128 - // The hash size of BLAKE2b-512 in bytes. - Size = 64 - // The hash size of BLAKE2b-384 in bytes. - Size384 = 48 - // The hash size of BLAKE2b-256 in bytes. - Size256 = 32 -) - -var ( - useAVX2 bool - useAVX bool - useSSE4 bool -) - -var errKeySize = errors.New("blake2b: invalid key size") - -var iv = [8]uint64{ - 0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1, - 0x510e527fade682d1, 0x9b05688c2b3e6c1f, 0x1f83d9abfb41bd6b, 0x5be0cd19137e2179, -} - -// Sum512 returns the BLAKE2b-512 checksum of the data. -func Sum512(data []byte) [Size]byte { - var sum [Size]byte - checkSum(&sum, Size, data) - return sum -} - -// Sum384 returns the BLAKE2b-384 checksum of the data. -func Sum384(data []byte) [Size384]byte { - var sum [Size]byte - var sum384 [Size384]byte - checkSum(&sum, Size384, data) - copy(sum384[:], sum[:Size384]) - return sum384 -} - -// Sum256 returns the BLAKE2b-256 checksum of the data. -func Sum256(data []byte) [Size256]byte { - var sum [Size]byte - var sum256 [Size256]byte - checkSum(&sum, Size256, data) - copy(sum256[:], sum[:Size256]) - return sum256 -} - -// New512 returns a new hash.Hash computing the BLAKE2b-512 checksum. A non-nil -// key turns the hash into a MAC. The key must between zero and 64 bytes long. -func New512(key []byte) (hash.Hash, error) { return newDigest(Size, key) } - -// New384 returns a new hash.Hash computing the BLAKE2b-384 checksum. A non-nil -// key turns the hash into a MAC. The key must between zero and 64 bytes long. -func New384(key []byte) (hash.Hash, error) { return newDigest(Size384, key) } - -// New256 returns a new hash.Hash computing the BLAKE2b-256 checksum. A non-nil -// key turns the hash into a MAC. The key must between zero and 64 bytes long. -func New256(key []byte) (hash.Hash, error) { return newDigest(Size256, key) } - -func newDigest(hashSize int, key []byte) (*digest, error) { - if len(key) > Size { - return nil, errKeySize - } - d := &digest{ - size: hashSize, - keyLen: len(key), - } - copy(d.key[:], key) - d.Reset() - return d, nil -} - -func checkSum(sum *[Size]byte, hashSize int, data []byte) { - h := iv - h[0] ^= uint64(hashSize) | (1 << 16) | (1 << 24) - var c [2]uint64 - - if length := len(data); length > BlockSize { - n := length &^ (BlockSize - 1) - if length == n { - n -= BlockSize - } - hashBlocks(&h, &c, 0, data[:n]) - data = data[n:] - } - - var block [BlockSize]byte - offset := copy(block[:], data) - remaining := uint64(BlockSize - offset) - if c[0] < remaining { - c[1]-- - } - c[0] -= remaining - - hashBlocks(&h, &c, 0xFFFFFFFFFFFFFFFF, block[:]) - - for i, v := range h[:(hashSize+7)/8] { - binary.LittleEndian.PutUint64(sum[8*i:], v) - } -} - -type digest struct { - h [8]uint64 - c [2]uint64 - size int - block [BlockSize]byte - offset int - - key [BlockSize]byte - keyLen int -} - -func (d *digest) BlockSize() int { return BlockSize } - -func (d *digest) Size() int { return d.size } - -func (d *digest) Reset() { - d.h = iv - d.h[0] ^= uint64(d.size) | (uint64(d.keyLen) << 8) | (1 << 16) | (1 << 24) - d.offset, d.c[0], d.c[1] = 0, 0, 0 - if d.keyLen > 0 { - d.block = d.key - d.offset = BlockSize - } -} - -func (d *digest) Write(p []byte) (n int, err error) { - n = len(p) - - if d.offset > 0 { - remaining := BlockSize - d.offset - if n <= remaining { - d.offset += copy(d.block[d.offset:], p) - return - } - copy(d.block[d.offset:], p[:remaining]) - hashBlocks(&d.h, &d.c, 0, d.block[:]) - d.offset = 0 - p = p[remaining:] - } - - if length := len(p); length > BlockSize { - nn := length &^ (BlockSize - 1) - if length == nn { - nn -= BlockSize - } - hashBlocks(&d.h, &d.c, 0, p[:nn]) - p = p[nn:] - } - - if len(p) > 0 { - d.offset += copy(d.block[:], p) - } - - return -} - -func (d *digest) Sum(b []byte) []byte { - var block [BlockSize]byte - copy(block[:], d.block[:d.offset]) - remaining := uint64(BlockSize - d.offset) - - c := d.c - if c[0] < remaining { - c[1]-- - } - c[0] -= remaining - - h := d.h - hashBlocks(&h, &c, 0xFFFFFFFFFFFFFFFF, block[:]) - - var sum [Size]byte - for i, v := range h[:(d.size+7)/8] { - binary.LittleEndian.PutUint64(sum[8*i:], v) - } - - return append(b, sum[:d.size]...) -} diff --git a/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.go b/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.go deleted file mode 100644 index 8c41cf6c7..000000000 --- a/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build go1.7,amd64,!gccgo,!appengine - -package blake2b - -func init() { - useAVX2 = supportsAVX2() - useAVX = supportsAVX() - useSSE4 = supportsSSE4() -} - -//go:noescape -func supportsSSE4() bool - -//go:noescape -func supportsAVX() bool - -//go:noescape -func supportsAVX2() bool - -//go:noescape -func hashBlocksAVX2(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) - -//go:noescape -func hashBlocksAVX(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) - -//go:noescape -func hashBlocksSSE4(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) - -func hashBlocks(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) { - if useAVX2 { - hashBlocksAVX2(h, c, flag, blocks) - } else if useAVX { - hashBlocksAVX(h, c, flag, blocks) - } else if useSSE4 { - hashBlocksSSE4(h, c, flag, blocks) - } else { - hashBlocksGeneric(h, c, flag, blocks) - } -} diff --git a/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.s b/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.s deleted file mode 100644 index 784bce6a9..000000000 --- a/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.s +++ /dev/null @@ -1,762 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build go1.7,amd64,!gccgo,!appengine - -#include "textflag.h" - -DATA ·AVX2_iv0<>+0x00(SB)/8, $0x6a09e667f3bcc908 -DATA ·AVX2_iv0<>+0x08(SB)/8, $0xbb67ae8584caa73b -DATA ·AVX2_iv0<>+0x10(SB)/8, $0x3c6ef372fe94f82b -DATA ·AVX2_iv0<>+0x18(SB)/8, $0xa54ff53a5f1d36f1 -GLOBL ·AVX2_iv0<>(SB), (NOPTR+RODATA), $32 - -DATA ·AVX2_iv1<>+0x00(SB)/8, $0x510e527fade682d1 -DATA ·AVX2_iv1<>+0x08(SB)/8, $0x9b05688c2b3e6c1f -DATA ·AVX2_iv1<>+0x10(SB)/8, $0x1f83d9abfb41bd6b -DATA ·AVX2_iv1<>+0x18(SB)/8, $0x5be0cd19137e2179 -GLOBL ·AVX2_iv1<>(SB), (NOPTR+RODATA), $32 - -DATA ·AVX2_c40<>+0x00(SB)/8, $0x0201000706050403 -DATA ·AVX2_c40<>+0x08(SB)/8, $0x0a09080f0e0d0c0b -DATA ·AVX2_c40<>+0x10(SB)/8, $0x0201000706050403 -DATA ·AVX2_c40<>+0x18(SB)/8, $0x0a09080f0e0d0c0b -GLOBL ·AVX2_c40<>(SB), (NOPTR+RODATA), $32 - -DATA ·AVX2_c48<>+0x00(SB)/8, $0x0100070605040302 -DATA ·AVX2_c48<>+0x08(SB)/8, $0x09080f0e0d0c0b0a -DATA ·AVX2_c48<>+0x10(SB)/8, $0x0100070605040302 -DATA ·AVX2_c48<>+0x18(SB)/8, $0x09080f0e0d0c0b0a -GLOBL ·AVX2_c48<>(SB), (NOPTR+RODATA), $32 - -DATA ·AVX_iv0<>+0x00(SB)/8, $0x6a09e667f3bcc908 -DATA ·AVX_iv0<>+0x08(SB)/8, $0xbb67ae8584caa73b -GLOBL ·AVX_iv0<>(SB), (NOPTR+RODATA), $16 - -DATA ·AVX_iv1<>+0x00(SB)/8, $0x3c6ef372fe94f82b -DATA ·AVX_iv1<>+0x08(SB)/8, $0xa54ff53a5f1d36f1 -GLOBL ·AVX_iv1<>(SB), (NOPTR+RODATA), $16 - -DATA ·AVX_iv2<>+0x00(SB)/8, $0x510e527fade682d1 -DATA ·AVX_iv2<>+0x08(SB)/8, $0x9b05688c2b3e6c1f -GLOBL ·AVX_iv2<>(SB), (NOPTR+RODATA), $16 - -DATA ·AVX_iv3<>+0x00(SB)/8, $0x1f83d9abfb41bd6b -DATA ·AVX_iv3<>+0x08(SB)/8, $0x5be0cd19137e2179 -GLOBL ·AVX_iv3<>(SB), (NOPTR+RODATA), $16 - -DATA ·AVX_c40<>+0x00(SB)/8, $0x0201000706050403 -DATA ·AVX_c40<>+0x08(SB)/8, $0x0a09080f0e0d0c0b -GLOBL ·AVX_c40<>(SB), (NOPTR+RODATA), $16 - -DATA ·AVX_c48<>+0x00(SB)/8, $0x0100070605040302 -DATA ·AVX_c48<>+0x08(SB)/8, $0x09080f0e0d0c0b0a -GLOBL ·AVX_c48<>(SB), (NOPTR+RODATA), $16 - -#define VPERMQ_0x39_Y1_Y1 BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xc9; BYTE $0x39 -#define VPERMQ_0x93_Y1_Y1 BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xc9; BYTE $0x93 -#define VPERMQ_0x4E_Y2_Y2 BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xd2; BYTE $0x4e -#define VPERMQ_0x93_Y3_Y3 BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xdb; BYTE $0x93 -#define VPERMQ_0x39_Y3_Y3 BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xdb; BYTE $0x39 - -#define ROUND_AVX2(m0, m1, m2, m3, t, c40, c48) \ - VPADDQ m0, Y0, Y0; \ - VPADDQ Y1, Y0, Y0; \ - VPXOR Y0, Y3, Y3; \ - VPSHUFD $-79, Y3, Y3; \ - VPADDQ Y3, Y2, Y2; \ - VPXOR Y2, Y1, Y1; \ - VPSHUFB c40, Y1, Y1; \ - VPADDQ m1, Y0, Y0; \ - VPADDQ Y1, Y0, Y0; \ - VPXOR Y0, Y3, Y3; \ - VPSHUFB c48, Y3, Y3; \ - VPADDQ Y3, Y2, Y2; \ - VPXOR Y2, Y1, Y1; \ - VPADDQ Y1, Y1, t; \ - VPSRLQ $63, Y1, Y1; \ - VPXOR t, Y1, Y1; \ - VPERMQ_0x39_Y1_Y1; \ - VPERMQ_0x4E_Y2_Y2; \ - VPERMQ_0x93_Y3_Y3; \ - VPADDQ m2, Y0, Y0; \ - VPADDQ Y1, Y0, Y0; \ - VPXOR Y0, Y3, Y3; \ - VPSHUFD $-79, Y3, Y3; \ - VPADDQ Y3, Y2, Y2; \ - VPXOR Y2, Y1, Y1; \ - VPSHUFB c40, Y1, Y1; \ - VPADDQ m3, Y0, Y0; \ - VPADDQ Y1, Y0, Y0; \ - VPXOR Y0, Y3, Y3; \ - VPSHUFB c48, Y3, Y3; \ - VPADDQ Y3, Y2, Y2; \ - VPXOR Y2, Y1, Y1; \ - VPADDQ Y1, Y1, t; \ - VPSRLQ $63, Y1, Y1; \ - VPXOR t, Y1, Y1; \ - VPERMQ_0x39_Y3_Y3; \ - VPERMQ_0x4E_Y2_Y2; \ - VPERMQ_0x93_Y1_Y1 - -#define VMOVQ_SI_X11_0 BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x1E -#define VMOVQ_SI_X12_0 BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x26 -#define VMOVQ_SI_X13_0 BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x2E -#define VMOVQ_SI_X14_0 BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x36 -#define VMOVQ_SI_X15_0 BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x3E - -#define VMOVQ_SI_X11(n) BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x5E; BYTE $n -#define VMOVQ_SI_X12(n) BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x66; BYTE $n -#define VMOVQ_SI_X13(n) BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x6E; BYTE $n -#define VMOVQ_SI_X14(n) BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x76; BYTE $n -#define VMOVQ_SI_X15(n) BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x7E; BYTE $n - -#define VPINSRQ_1_SI_X11_0 BYTE $0xC4; BYTE $0x63; BYTE $0xA1; BYTE $0x22; BYTE $0x1E; BYTE $0x01 -#define VPINSRQ_1_SI_X12_0 BYTE $0xC4; BYTE $0x63; BYTE $0x99; BYTE $0x22; BYTE $0x26; BYTE $0x01 -#define VPINSRQ_1_SI_X13_0 BYTE $0xC4; BYTE $0x63; BYTE $0x91; BYTE $0x22; BYTE $0x2E; BYTE $0x01 -#define VPINSRQ_1_SI_X14_0 BYTE $0xC4; BYTE $0x63; BYTE $0x89; BYTE $0x22; BYTE $0x36; BYTE $0x01 -#define VPINSRQ_1_SI_X15_0 BYTE $0xC4; BYTE $0x63; BYTE $0x81; BYTE $0x22; BYTE $0x3E; BYTE $0x01 - -#define VPINSRQ_1_SI_X11(n) BYTE $0xC4; BYTE $0x63; BYTE $0xA1; BYTE $0x22; BYTE $0x5E; BYTE $n; BYTE $0x01 -#define VPINSRQ_1_SI_X12(n) BYTE $0xC4; BYTE $0x63; BYTE $0x99; BYTE $0x22; BYTE $0x66; BYTE $n; BYTE $0x01 -#define VPINSRQ_1_SI_X13(n) BYTE $0xC4; BYTE $0x63; BYTE $0x91; BYTE $0x22; BYTE $0x6E; BYTE $n; BYTE $0x01 -#define VPINSRQ_1_SI_X14(n) BYTE $0xC4; BYTE $0x63; BYTE $0x89; BYTE $0x22; BYTE $0x76; BYTE $n; BYTE $0x01 -#define VPINSRQ_1_SI_X15(n) BYTE $0xC4; BYTE $0x63; BYTE $0x81; BYTE $0x22; BYTE $0x7E; BYTE $n; BYTE $0x01 - -#define VMOVQ_R8_X15 BYTE $0xC4; BYTE $0x41; BYTE $0xF9; BYTE $0x6E; BYTE $0xF8 -#define VPINSRQ_1_R9_X15 BYTE $0xC4; BYTE $0x43; BYTE $0x81; BYTE $0x22; BYTE $0xF9; BYTE $0x01 - -// load msg: Y12 = (i0, i1, i2, i3) -// i0, i1, i2, i3 must not be 0 -#define LOAD_MSG_AVX2_Y12(i0, i1, i2, i3) \ - VMOVQ_SI_X12(i0*8); \ - VMOVQ_SI_X11(i2*8); \ - VPINSRQ_1_SI_X12(i1*8); \ - VPINSRQ_1_SI_X11(i3*8); \ - VINSERTI128 $1, X11, Y12, Y12 - -// load msg: Y13 = (i0, i1, i2, i3) -// i0, i1, i2, i3 must not be 0 -#define LOAD_MSG_AVX2_Y13(i0, i1, i2, i3) \ - VMOVQ_SI_X13(i0*8); \ - VMOVQ_SI_X11(i2*8); \ - VPINSRQ_1_SI_X13(i1*8); \ - VPINSRQ_1_SI_X11(i3*8); \ - VINSERTI128 $1, X11, Y13, Y13 - -// load msg: Y14 = (i0, i1, i2, i3) -// i0, i1, i2, i3 must not be 0 -#define LOAD_MSG_AVX2_Y14(i0, i1, i2, i3) \ - VMOVQ_SI_X14(i0*8); \ - VMOVQ_SI_X11(i2*8); \ - VPINSRQ_1_SI_X14(i1*8); \ - VPINSRQ_1_SI_X11(i3*8); \ - VINSERTI128 $1, X11, Y14, Y14 - -// load msg: Y15 = (i0, i1, i2, i3) -// i0, i1, i2, i3 must not be 0 -#define LOAD_MSG_AVX2_Y15(i0, i1, i2, i3) \ - VMOVQ_SI_X15(i0*8); \ - VMOVQ_SI_X11(i2*8); \ - VPINSRQ_1_SI_X15(i1*8); \ - VPINSRQ_1_SI_X11(i3*8); \ - VINSERTI128 $1, X11, Y15, Y15 - -#define LOAD_MSG_AVX2_0_2_4_6_1_3_5_7_8_10_12_14_9_11_13_15() \ - VMOVQ_SI_X12_0; \ - VMOVQ_SI_X11(4*8); \ - VPINSRQ_1_SI_X12(2*8); \ - VPINSRQ_1_SI_X11(6*8); \ - VINSERTI128 $1, X11, Y12, Y12; \ - LOAD_MSG_AVX2_Y13(1, 3, 5, 7); \ - LOAD_MSG_AVX2_Y14(8, 10, 12, 14); \ - LOAD_MSG_AVX2_Y15(9, 11, 13, 15) - -#define LOAD_MSG_AVX2_14_4_9_13_10_8_15_6_1_0_11_5_12_2_7_3() \ - LOAD_MSG_AVX2_Y12(14, 4, 9, 13); \ - LOAD_MSG_AVX2_Y13(10, 8, 15, 6); \ - VMOVQ_SI_X11(11*8); \ - VPSHUFD $0x4E, 0*8(SI), X14; \ - VPINSRQ_1_SI_X11(5*8); \ - VINSERTI128 $1, X11, Y14, Y14; \ - LOAD_MSG_AVX2_Y15(12, 2, 7, 3) - -#define LOAD_MSG_AVX2_11_12_5_15_8_0_2_13_10_3_7_9_14_6_1_4() \ - VMOVQ_SI_X11(5*8); \ - VMOVDQU 11*8(SI), X12; \ - VPINSRQ_1_SI_X11(15*8); \ - VINSERTI128 $1, X11, Y12, Y12; \ - VMOVQ_SI_X13(8*8); \ - VMOVQ_SI_X11(2*8); \ - VPINSRQ_1_SI_X13_0; \ - VPINSRQ_1_SI_X11(13*8); \ - VINSERTI128 $1, X11, Y13, Y13; \ - LOAD_MSG_AVX2_Y14(10, 3, 7, 9); \ - LOAD_MSG_AVX2_Y15(14, 6, 1, 4) - -#define LOAD_MSG_AVX2_7_3_13_11_9_1_12_14_2_5_4_15_6_10_0_8() \ - LOAD_MSG_AVX2_Y12(7, 3, 13, 11); \ - LOAD_MSG_AVX2_Y13(9, 1, 12, 14); \ - LOAD_MSG_AVX2_Y14(2, 5, 4, 15); \ - VMOVQ_SI_X15(6*8); \ - VMOVQ_SI_X11_0; \ - VPINSRQ_1_SI_X15(10*8); \ - VPINSRQ_1_SI_X11(8*8); \ - VINSERTI128 $1, X11, Y15, Y15 - -#define LOAD_MSG_AVX2_9_5_2_10_0_7_4_15_14_11_6_3_1_12_8_13() \ - LOAD_MSG_AVX2_Y12(9, 5, 2, 10); \ - VMOVQ_SI_X13_0; \ - VMOVQ_SI_X11(4*8); \ - VPINSRQ_1_SI_X13(7*8); \ - VPINSRQ_1_SI_X11(15*8); \ - VINSERTI128 $1, X11, Y13, Y13; \ - LOAD_MSG_AVX2_Y14(14, 11, 6, 3); \ - LOAD_MSG_AVX2_Y15(1, 12, 8, 13) - -#define LOAD_MSG_AVX2_2_6_0_8_12_10_11_3_4_7_15_1_13_5_14_9() \ - VMOVQ_SI_X12(2*8); \ - VMOVQ_SI_X11_0; \ - VPINSRQ_1_SI_X12(6*8); \ - VPINSRQ_1_SI_X11(8*8); \ - VINSERTI128 $1, X11, Y12, Y12; \ - LOAD_MSG_AVX2_Y13(12, 10, 11, 3); \ - LOAD_MSG_AVX2_Y14(4, 7, 15, 1); \ - LOAD_MSG_AVX2_Y15(13, 5, 14, 9) - -#define LOAD_MSG_AVX2_12_1_14_4_5_15_13_10_0_6_9_8_7_3_2_11() \ - LOAD_MSG_AVX2_Y12(12, 1, 14, 4); \ - LOAD_MSG_AVX2_Y13(5, 15, 13, 10); \ - VMOVQ_SI_X14_0; \ - VPSHUFD $0x4E, 8*8(SI), X11; \ - VPINSRQ_1_SI_X14(6*8); \ - VINSERTI128 $1, X11, Y14, Y14; \ - LOAD_MSG_AVX2_Y15(7, 3, 2, 11) - -#define LOAD_MSG_AVX2_13_7_12_3_11_14_1_9_5_15_8_2_0_4_6_10() \ - LOAD_MSG_AVX2_Y12(13, 7, 12, 3); \ - LOAD_MSG_AVX2_Y13(11, 14, 1, 9); \ - LOAD_MSG_AVX2_Y14(5, 15, 8, 2); \ - VMOVQ_SI_X15_0; \ - VMOVQ_SI_X11(6*8); \ - VPINSRQ_1_SI_X15(4*8); \ - VPINSRQ_1_SI_X11(10*8); \ - VINSERTI128 $1, X11, Y15, Y15 - -#define LOAD_MSG_AVX2_6_14_11_0_15_9_3_8_12_13_1_10_2_7_4_5() \ - VMOVQ_SI_X12(6*8); \ - VMOVQ_SI_X11(11*8); \ - VPINSRQ_1_SI_X12(14*8); \ - VPINSRQ_1_SI_X11_0; \ - VINSERTI128 $1, X11, Y12, Y12; \ - LOAD_MSG_AVX2_Y13(15, 9, 3, 8); \ - VMOVQ_SI_X11(1*8); \ - VMOVDQU 12*8(SI), X14; \ - VPINSRQ_1_SI_X11(10*8); \ - VINSERTI128 $1, X11, Y14, Y14; \ - VMOVQ_SI_X15(2*8); \ - VMOVDQU 4*8(SI), X11; \ - VPINSRQ_1_SI_X15(7*8); \ - VINSERTI128 $1, X11, Y15, Y15 - -#define LOAD_MSG_AVX2_10_8_7_1_2_4_6_5_15_9_3_13_11_14_12_0() \ - LOAD_MSG_AVX2_Y12(10, 8, 7, 1); \ - VMOVQ_SI_X13(2*8); \ - VPSHUFD $0x4E, 5*8(SI), X11; \ - VPINSRQ_1_SI_X13(4*8); \ - VINSERTI128 $1, X11, Y13, Y13; \ - LOAD_MSG_AVX2_Y14(15, 9, 3, 13); \ - VMOVQ_SI_X15(11*8); \ - VMOVQ_SI_X11(12*8); \ - VPINSRQ_1_SI_X15(14*8); \ - VPINSRQ_1_SI_X11_0; \ - VINSERTI128 $1, X11, Y15, Y15 - -// func hashBlocksAVX2(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) -TEXT ·hashBlocksAVX2(SB), 4, $320-48 // frame size = 288 + 32 byte alignment - MOVQ h+0(FP), AX - MOVQ c+8(FP), BX - MOVQ flag+16(FP), CX - MOVQ blocks_base+24(FP), SI - MOVQ blocks_len+32(FP), DI - - MOVQ SP, DX - MOVQ SP, R9 - ADDQ $31, R9 - ANDQ $~31, R9 - MOVQ R9, SP - - MOVQ CX, 16(SP) - XORQ CX, CX - MOVQ CX, 24(SP) - - VMOVDQU ·AVX2_c40<>(SB), Y4 - VMOVDQU ·AVX2_c48<>(SB), Y5 - - VMOVDQU 0(AX), Y8 - VMOVDQU 32(AX), Y9 - VMOVDQU ·AVX2_iv0<>(SB), Y6 - VMOVDQU ·AVX2_iv1<>(SB), Y7 - - MOVQ 0(BX), R8 - MOVQ 8(BX), R9 - MOVQ R9, 8(SP) - -loop: - ADDQ $128, R8 - MOVQ R8, 0(SP) - CMPQ R8, $128 - JGE noinc - INCQ R9 - MOVQ R9, 8(SP) - -noinc: - VMOVDQA Y8, Y0 - VMOVDQA Y9, Y1 - VMOVDQA Y6, Y2 - VPXOR 0(SP), Y7, Y3 - - LOAD_MSG_AVX2_0_2_4_6_1_3_5_7_8_10_12_14_9_11_13_15() - VMOVDQA Y12, 32(SP) - VMOVDQA Y13, 64(SP) - VMOVDQA Y14, 96(SP) - VMOVDQA Y15, 128(SP) - ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) - LOAD_MSG_AVX2_14_4_9_13_10_8_15_6_1_0_11_5_12_2_7_3() - VMOVDQA Y12, 160(SP) - VMOVDQA Y13, 192(SP) - VMOVDQA Y14, 224(SP) - VMOVDQA Y15, 256(SP) - - ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) - LOAD_MSG_AVX2_11_12_5_15_8_0_2_13_10_3_7_9_14_6_1_4() - ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) - LOAD_MSG_AVX2_7_3_13_11_9_1_12_14_2_5_4_15_6_10_0_8() - ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) - LOAD_MSG_AVX2_9_5_2_10_0_7_4_15_14_11_6_3_1_12_8_13() - ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) - LOAD_MSG_AVX2_2_6_0_8_12_10_11_3_4_7_15_1_13_5_14_9() - ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) - LOAD_MSG_AVX2_12_1_14_4_5_15_13_10_0_6_9_8_7_3_2_11() - ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) - LOAD_MSG_AVX2_13_7_12_3_11_14_1_9_5_15_8_2_0_4_6_10() - ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) - LOAD_MSG_AVX2_6_14_11_0_15_9_3_8_12_13_1_10_2_7_4_5() - ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) - LOAD_MSG_AVX2_10_8_7_1_2_4_6_5_15_9_3_13_11_14_12_0() - ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) - - ROUND_AVX2(32(SP), 64(SP), 96(SP), 128(SP), Y10, Y4, Y5) - ROUND_AVX2(160(SP), 192(SP), 224(SP), 256(SP), Y10, Y4, Y5) - - VPXOR Y0, Y8, Y8 - VPXOR Y1, Y9, Y9 - VPXOR Y2, Y8, Y8 - VPXOR Y3, Y9, Y9 - - LEAQ 128(SI), SI - SUBQ $128, DI - JNE loop - - MOVQ R8, 0(BX) - MOVQ R9, 8(BX) - - VMOVDQU Y8, 0(AX) - VMOVDQU Y9, 32(AX) - VZEROUPPER - - MOVQ DX, SP - RET - -#define VPUNPCKLQDQ_X2_X2_X15 BYTE $0xC5; BYTE $0x69; BYTE $0x6C; BYTE $0xFA -#define VPUNPCKLQDQ_X3_X3_X15 BYTE $0xC5; BYTE $0x61; BYTE $0x6C; BYTE $0xFB -#define VPUNPCKLQDQ_X7_X7_X15 BYTE $0xC5; BYTE $0x41; BYTE $0x6C; BYTE $0xFF -#define VPUNPCKLQDQ_X13_X13_X15 BYTE $0xC4; BYTE $0x41; BYTE $0x11; BYTE $0x6C; BYTE $0xFD -#define VPUNPCKLQDQ_X14_X14_X15 BYTE $0xC4; BYTE $0x41; BYTE $0x09; BYTE $0x6C; BYTE $0xFE - -#define VPUNPCKHQDQ_X15_X2_X2 BYTE $0xC4; BYTE $0xC1; BYTE $0x69; BYTE $0x6D; BYTE $0xD7 -#define VPUNPCKHQDQ_X15_X3_X3 BYTE $0xC4; BYTE $0xC1; BYTE $0x61; BYTE $0x6D; BYTE $0xDF -#define VPUNPCKHQDQ_X15_X6_X6 BYTE $0xC4; BYTE $0xC1; BYTE $0x49; BYTE $0x6D; BYTE $0xF7 -#define VPUNPCKHQDQ_X15_X7_X7 BYTE $0xC4; BYTE $0xC1; BYTE $0x41; BYTE $0x6D; BYTE $0xFF -#define VPUNPCKHQDQ_X15_X3_X2 BYTE $0xC4; BYTE $0xC1; BYTE $0x61; BYTE $0x6D; BYTE $0xD7 -#define VPUNPCKHQDQ_X15_X7_X6 BYTE $0xC4; BYTE $0xC1; BYTE $0x41; BYTE $0x6D; BYTE $0xF7 -#define VPUNPCKHQDQ_X15_X13_X3 BYTE $0xC4; BYTE $0xC1; BYTE $0x11; BYTE $0x6D; BYTE $0xDF -#define VPUNPCKHQDQ_X15_X13_X7 BYTE $0xC4; BYTE $0xC1; BYTE $0x11; BYTE $0x6D; BYTE $0xFF - -#define SHUFFLE_AVX() \ - VMOVDQA X6, X13; \ - VMOVDQA X2, X14; \ - VMOVDQA X4, X6; \ - VPUNPCKLQDQ_X13_X13_X15; \ - VMOVDQA X5, X4; \ - VMOVDQA X6, X5; \ - VPUNPCKHQDQ_X15_X7_X6; \ - VPUNPCKLQDQ_X7_X7_X15; \ - VPUNPCKHQDQ_X15_X13_X7; \ - VPUNPCKLQDQ_X3_X3_X15; \ - VPUNPCKHQDQ_X15_X2_X2; \ - VPUNPCKLQDQ_X14_X14_X15; \ - VPUNPCKHQDQ_X15_X3_X3; \ - -#define SHUFFLE_AVX_INV() \ - VMOVDQA X2, X13; \ - VMOVDQA X4, X14; \ - VPUNPCKLQDQ_X2_X2_X15; \ - VMOVDQA X5, X4; \ - VPUNPCKHQDQ_X15_X3_X2; \ - VMOVDQA X14, X5; \ - VPUNPCKLQDQ_X3_X3_X15; \ - VMOVDQA X6, X14; \ - VPUNPCKHQDQ_X15_X13_X3; \ - VPUNPCKLQDQ_X7_X7_X15; \ - VPUNPCKHQDQ_X15_X6_X6; \ - VPUNPCKLQDQ_X14_X14_X15; \ - VPUNPCKHQDQ_X15_X7_X7; \ - -#define HALF_ROUND_AVX(v0, v1, v2, v3, v4, v5, v6, v7, m0, m1, m2, m3, t0, c40, c48) \ - VPADDQ m0, v0, v0; \ - VPADDQ v2, v0, v0; \ - VPADDQ m1, v1, v1; \ - VPADDQ v3, v1, v1; \ - VPXOR v0, v6, v6; \ - VPXOR v1, v7, v7; \ - VPSHUFD $-79, v6, v6; \ - VPSHUFD $-79, v7, v7; \ - VPADDQ v6, v4, v4; \ - VPADDQ v7, v5, v5; \ - VPXOR v4, v2, v2; \ - VPXOR v5, v3, v3; \ - VPSHUFB c40, v2, v2; \ - VPSHUFB c40, v3, v3; \ - VPADDQ m2, v0, v0; \ - VPADDQ v2, v0, v0; \ - VPADDQ m3, v1, v1; \ - VPADDQ v3, v1, v1; \ - VPXOR v0, v6, v6; \ - VPXOR v1, v7, v7; \ - VPSHUFB c48, v6, v6; \ - VPSHUFB c48, v7, v7; \ - VPADDQ v6, v4, v4; \ - VPADDQ v7, v5, v5; \ - VPXOR v4, v2, v2; \ - VPXOR v5, v3, v3; \ - VPADDQ v2, v2, t0; \ - VPSRLQ $63, v2, v2; \ - VPXOR t0, v2, v2; \ - VPADDQ v3, v3, t0; \ - VPSRLQ $63, v3, v3; \ - VPXOR t0, v3, v3 - -// load msg: X12 = (i0, i1), X13 = (i2, i3), X14 = (i4, i5), X15 = (i6, i7) -// i0, i1, i2, i3, i4, i5, i6, i7 must not be 0 -#define LOAD_MSG_AVX(i0, i1, i2, i3, i4, i5, i6, i7) \ - VMOVQ_SI_X12(i0*8); \ - VMOVQ_SI_X13(i2*8); \ - VMOVQ_SI_X14(i4*8); \ - VMOVQ_SI_X15(i6*8); \ - VPINSRQ_1_SI_X12(i1*8); \ - VPINSRQ_1_SI_X13(i3*8); \ - VPINSRQ_1_SI_X14(i5*8); \ - VPINSRQ_1_SI_X15(i7*8) - -// load msg: X12 = (0, 2), X13 = (4, 6), X14 = (1, 3), X15 = (5, 7) -#define LOAD_MSG_AVX_0_2_4_6_1_3_5_7() \ - VMOVQ_SI_X12_0; \ - VMOVQ_SI_X13(4*8); \ - VMOVQ_SI_X14(1*8); \ - VMOVQ_SI_X15(5*8); \ - VPINSRQ_1_SI_X12(2*8); \ - VPINSRQ_1_SI_X13(6*8); \ - VPINSRQ_1_SI_X14(3*8); \ - VPINSRQ_1_SI_X15(7*8) - -// load msg: X12 = (1, 0), X13 = (11, 5), X14 = (12, 2), X15 = (7, 3) -#define LOAD_MSG_AVX_1_0_11_5_12_2_7_3() \ - VPSHUFD $0x4E, 0*8(SI), X12; \ - VMOVQ_SI_X13(11*8); \ - VMOVQ_SI_X14(12*8); \ - VMOVQ_SI_X15(7*8); \ - VPINSRQ_1_SI_X13(5*8); \ - VPINSRQ_1_SI_X14(2*8); \ - VPINSRQ_1_SI_X15(3*8) - -// load msg: X12 = (11, 12), X13 = (5, 15), X14 = (8, 0), X15 = (2, 13) -#define LOAD_MSG_AVX_11_12_5_15_8_0_2_13() \ - VMOVDQU 11*8(SI), X12; \ - VMOVQ_SI_X13(5*8); \ - VMOVQ_SI_X14(8*8); \ - VMOVQ_SI_X15(2*8); \ - VPINSRQ_1_SI_X13(15*8); \ - VPINSRQ_1_SI_X14_0; \ - VPINSRQ_1_SI_X15(13*8) - -// load msg: X12 = (2, 5), X13 = (4, 15), X14 = (6, 10), X15 = (0, 8) -#define LOAD_MSG_AVX_2_5_4_15_6_10_0_8() \ - VMOVQ_SI_X12(2*8); \ - VMOVQ_SI_X13(4*8); \ - VMOVQ_SI_X14(6*8); \ - VMOVQ_SI_X15_0; \ - VPINSRQ_1_SI_X12(5*8); \ - VPINSRQ_1_SI_X13(15*8); \ - VPINSRQ_1_SI_X14(10*8); \ - VPINSRQ_1_SI_X15(8*8) - -// load msg: X12 = (9, 5), X13 = (2, 10), X14 = (0, 7), X15 = (4, 15) -#define LOAD_MSG_AVX_9_5_2_10_0_7_4_15() \ - VMOVQ_SI_X12(9*8); \ - VMOVQ_SI_X13(2*8); \ - VMOVQ_SI_X14_0; \ - VMOVQ_SI_X15(4*8); \ - VPINSRQ_1_SI_X12(5*8); \ - VPINSRQ_1_SI_X13(10*8); \ - VPINSRQ_1_SI_X14(7*8); \ - VPINSRQ_1_SI_X15(15*8) - -// load msg: X12 = (2, 6), X13 = (0, 8), X14 = (12, 10), X15 = (11, 3) -#define LOAD_MSG_AVX_2_6_0_8_12_10_11_3() \ - VMOVQ_SI_X12(2*8); \ - VMOVQ_SI_X13_0; \ - VMOVQ_SI_X14(12*8); \ - VMOVQ_SI_X15(11*8); \ - VPINSRQ_1_SI_X12(6*8); \ - VPINSRQ_1_SI_X13(8*8); \ - VPINSRQ_1_SI_X14(10*8); \ - VPINSRQ_1_SI_X15(3*8) - -// load msg: X12 = (0, 6), X13 = (9, 8), X14 = (7, 3), X15 = (2, 11) -#define LOAD_MSG_AVX_0_6_9_8_7_3_2_11() \ - MOVQ 0*8(SI), X12; \ - VPSHUFD $0x4E, 8*8(SI), X13; \ - MOVQ 7*8(SI), X14; \ - MOVQ 2*8(SI), X15; \ - VPINSRQ_1_SI_X12(6*8); \ - VPINSRQ_1_SI_X14(3*8); \ - VPINSRQ_1_SI_X15(11*8) - -// load msg: X12 = (6, 14), X13 = (11, 0), X14 = (15, 9), X15 = (3, 8) -#define LOAD_MSG_AVX_6_14_11_0_15_9_3_8() \ - MOVQ 6*8(SI), X12; \ - MOVQ 11*8(SI), X13; \ - MOVQ 15*8(SI), X14; \ - MOVQ 3*8(SI), X15; \ - VPINSRQ_1_SI_X12(14*8); \ - VPINSRQ_1_SI_X13_0; \ - VPINSRQ_1_SI_X14(9*8); \ - VPINSRQ_1_SI_X15(8*8) - -// load msg: X12 = (5, 15), X13 = (8, 2), X14 = (0, 4), X15 = (6, 10) -#define LOAD_MSG_AVX_5_15_8_2_0_4_6_10() \ - MOVQ 5*8(SI), X12; \ - MOVQ 8*8(SI), X13; \ - MOVQ 0*8(SI), X14; \ - MOVQ 6*8(SI), X15; \ - VPINSRQ_1_SI_X12(15*8); \ - VPINSRQ_1_SI_X13(2*8); \ - VPINSRQ_1_SI_X14(4*8); \ - VPINSRQ_1_SI_X15(10*8) - -// load msg: X12 = (12, 13), X13 = (1, 10), X14 = (2, 7), X15 = (4, 5) -#define LOAD_MSG_AVX_12_13_1_10_2_7_4_5() \ - VMOVDQU 12*8(SI), X12; \ - MOVQ 1*8(SI), X13; \ - MOVQ 2*8(SI), X14; \ - VPINSRQ_1_SI_X13(10*8); \ - VPINSRQ_1_SI_X14(7*8); \ - VMOVDQU 4*8(SI), X15 - -// load msg: X12 = (15, 9), X13 = (3, 13), X14 = (11, 14), X15 = (12, 0) -#define LOAD_MSG_AVX_15_9_3_13_11_14_12_0() \ - MOVQ 15*8(SI), X12; \ - MOVQ 3*8(SI), X13; \ - MOVQ 11*8(SI), X14; \ - MOVQ 12*8(SI), X15; \ - VPINSRQ_1_SI_X12(9*8); \ - VPINSRQ_1_SI_X13(13*8); \ - VPINSRQ_1_SI_X14(14*8); \ - VPINSRQ_1_SI_X15_0 - -// func hashBlocksAVX(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) -TEXT ·hashBlocksAVX(SB), 4, $288-48 // frame size = 272 + 16 byte alignment - MOVQ h+0(FP), AX - MOVQ c+8(FP), BX - MOVQ flag+16(FP), CX - MOVQ blocks_base+24(FP), SI - MOVQ blocks_len+32(FP), DI - - MOVQ SP, BP - MOVQ SP, R9 - ADDQ $15, R9 - ANDQ $~15, R9 - MOVQ R9, SP - - VMOVDQU ·AVX_c40<>(SB), X0 - VMOVDQU ·AVX_c48<>(SB), X1 - VMOVDQA X0, X8 - VMOVDQA X1, X9 - - VMOVDQU ·AVX_iv3<>(SB), X0 - VMOVDQA X0, 0(SP) - XORQ CX, 0(SP) // 0(SP) = ·AVX_iv3 ^ (CX || 0) - - VMOVDQU 0(AX), X10 - VMOVDQU 16(AX), X11 - VMOVDQU 32(AX), X2 - VMOVDQU 48(AX), X3 - - MOVQ 0(BX), R8 - MOVQ 8(BX), R9 - -loop: - ADDQ $128, R8 - CMPQ R8, $128 - JGE noinc - INCQ R9 - -noinc: - VMOVQ_R8_X15 - VPINSRQ_1_R9_X15 - - VMOVDQA X10, X0 - VMOVDQA X11, X1 - VMOVDQU ·AVX_iv0<>(SB), X4 - VMOVDQU ·AVX_iv1<>(SB), X5 - VMOVDQU ·AVX_iv2<>(SB), X6 - - VPXOR X15, X6, X6 - VMOVDQA 0(SP), X7 - - LOAD_MSG_AVX_0_2_4_6_1_3_5_7() - VMOVDQA X12, 16(SP) - VMOVDQA X13, 32(SP) - VMOVDQA X14, 48(SP) - VMOVDQA X15, 64(SP) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX() - LOAD_MSG_AVX(8, 10, 12, 14, 9, 11, 13, 15) - VMOVDQA X12, 80(SP) - VMOVDQA X13, 96(SP) - VMOVDQA X14, 112(SP) - VMOVDQA X15, 128(SP) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX_INV() - - LOAD_MSG_AVX(14, 4, 9, 13, 10, 8, 15, 6) - VMOVDQA X12, 144(SP) - VMOVDQA X13, 160(SP) - VMOVDQA X14, 176(SP) - VMOVDQA X15, 192(SP) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX() - LOAD_MSG_AVX_1_0_11_5_12_2_7_3() - VMOVDQA X12, 208(SP) - VMOVDQA X13, 224(SP) - VMOVDQA X14, 240(SP) - VMOVDQA X15, 256(SP) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX_INV() - - LOAD_MSG_AVX_11_12_5_15_8_0_2_13() - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX() - LOAD_MSG_AVX(10, 3, 7, 9, 14, 6, 1, 4) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX_INV() - - LOAD_MSG_AVX(7, 3, 13, 11, 9, 1, 12, 14) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX() - LOAD_MSG_AVX_2_5_4_15_6_10_0_8() - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX_INV() - - LOAD_MSG_AVX_9_5_2_10_0_7_4_15() - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX() - LOAD_MSG_AVX(14, 11, 6, 3, 1, 12, 8, 13) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX_INV() - - LOAD_MSG_AVX_2_6_0_8_12_10_11_3() - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX() - LOAD_MSG_AVX(4, 7, 15, 1, 13, 5, 14, 9) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX_INV() - - LOAD_MSG_AVX(12, 1, 14, 4, 5, 15, 13, 10) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX() - LOAD_MSG_AVX_0_6_9_8_7_3_2_11() - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX_INV() - - LOAD_MSG_AVX(13, 7, 12, 3, 11, 14, 1, 9) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX() - LOAD_MSG_AVX_5_15_8_2_0_4_6_10() - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX_INV() - - LOAD_MSG_AVX_6_14_11_0_15_9_3_8() - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX() - LOAD_MSG_AVX_12_13_1_10_2_7_4_5() - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX_INV() - - LOAD_MSG_AVX(10, 8, 7, 1, 2, 4, 6, 5) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX() - LOAD_MSG_AVX_15_9_3_13_11_14_12_0() - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX_INV() - - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, 16(SP), 32(SP), 48(SP), 64(SP), X15, X8, X9) - SHUFFLE_AVX() - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, 80(SP), 96(SP), 112(SP), 128(SP), X15, X8, X9) - SHUFFLE_AVX_INV() - - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, 144(SP), 160(SP), 176(SP), 192(SP), X15, X8, X9) - SHUFFLE_AVX() - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, 208(SP), 224(SP), 240(SP), 256(SP), X15, X8, X9) - SHUFFLE_AVX_INV() - - VMOVDQU 32(AX), X14 - VMOVDQU 48(AX), X15 - VPXOR X0, X10, X10 - VPXOR X1, X11, X11 - VPXOR X2, X14, X14 - VPXOR X3, X15, X15 - VPXOR X4, X10, X10 - VPXOR X5, X11, X11 - VPXOR X6, X14, X2 - VPXOR X7, X15, X3 - VMOVDQU X2, 32(AX) - VMOVDQU X3, 48(AX) - - LEAQ 128(SI), SI - SUBQ $128, DI - JNE loop - - VMOVDQU X10, 0(AX) - VMOVDQU X11, 16(AX) - - MOVQ R8, 0(BX) - MOVQ R9, 8(BX) - VZEROUPPER - - MOVQ BP, SP - RET - -// func supportsAVX2() bool -TEXT ·supportsAVX2(SB), 4, $0-1 - MOVQ runtime·support_avx2(SB), AX - MOVB AX, ret+0(FP) - RET - -// func supportsAVX() bool -TEXT ·supportsAVX(SB), 4, $0-1 - MOVQ runtime·support_avx(SB), AX - MOVB AX, ret+0(FP) - RET diff --git a/vendor/golang.org/x/crypto/blake2b/blake2b_amd64.go b/vendor/golang.org/x/crypto/blake2b/blake2b_amd64.go deleted file mode 100644 index 2ab7c30fc..000000000 --- a/vendor/golang.org/x/crypto/blake2b/blake2b_amd64.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !go1.7,amd64,!gccgo,!appengine - -package blake2b - -func init() { - useSSE4 = supportsSSE4() -} - -//go:noescape -func supportsSSE4() bool - -//go:noescape -func hashBlocksSSE4(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) - -func hashBlocks(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) { - if useSSE4 { - hashBlocksSSE4(h, c, flag, blocks) - } else { - hashBlocksGeneric(h, c, flag, blocks) - } -} diff --git a/vendor/golang.org/x/crypto/blake2b/blake2b_amd64.s b/vendor/golang.org/x/crypto/blake2b/blake2b_amd64.s deleted file mode 100644 index 64530740b..000000000 --- a/vendor/golang.org/x/crypto/blake2b/blake2b_amd64.s +++ /dev/null @@ -1,290 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build amd64,!gccgo,!appengine - -#include "textflag.h" - -DATA ·iv0<>+0x00(SB)/8, $0x6a09e667f3bcc908 -DATA ·iv0<>+0x08(SB)/8, $0xbb67ae8584caa73b -GLOBL ·iv0<>(SB), (NOPTR+RODATA), $16 - -DATA ·iv1<>+0x00(SB)/8, $0x3c6ef372fe94f82b -DATA ·iv1<>+0x08(SB)/8, $0xa54ff53a5f1d36f1 -GLOBL ·iv1<>(SB), (NOPTR+RODATA), $16 - -DATA ·iv2<>+0x00(SB)/8, $0x510e527fade682d1 -DATA ·iv2<>+0x08(SB)/8, $0x9b05688c2b3e6c1f -GLOBL ·iv2<>(SB), (NOPTR+RODATA), $16 - -DATA ·iv3<>+0x00(SB)/8, $0x1f83d9abfb41bd6b -DATA ·iv3<>+0x08(SB)/8, $0x5be0cd19137e2179 -GLOBL ·iv3<>(SB), (NOPTR+RODATA), $16 - -DATA ·c40<>+0x00(SB)/8, $0x0201000706050403 -DATA ·c40<>+0x08(SB)/8, $0x0a09080f0e0d0c0b -GLOBL ·c40<>(SB), (NOPTR+RODATA), $16 - -DATA ·c48<>+0x00(SB)/8, $0x0100070605040302 -DATA ·c48<>+0x08(SB)/8, $0x09080f0e0d0c0b0a -GLOBL ·c48<>(SB), (NOPTR+RODATA), $16 - -#define SHUFFLE(v2, v3, v4, v5, v6, v7, t1, t2) \ - MOVO v4, t1; \ - MOVO v5, v4; \ - MOVO t1, v5; \ - MOVO v6, t1; \ - PUNPCKLQDQ v6, t2; \ - PUNPCKHQDQ v7, v6; \ - PUNPCKHQDQ t2, v6; \ - PUNPCKLQDQ v7, t2; \ - MOVO t1, v7; \ - MOVO v2, t1; \ - PUNPCKHQDQ t2, v7; \ - PUNPCKLQDQ v3, t2; \ - PUNPCKHQDQ t2, v2; \ - PUNPCKLQDQ t1, t2; \ - PUNPCKHQDQ t2, v3 - -#define SHUFFLE_INV(v2, v3, v4, v5, v6, v7, t1, t2) \ - MOVO v4, t1; \ - MOVO v5, v4; \ - MOVO t1, v5; \ - MOVO v2, t1; \ - PUNPCKLQDQ v2, t2; \ - PUNPCKHQDQ v3, v2; \ - PUNPCKHQDQ t2, v2; \ - PUNPCKLQDQ v3, t2; \ - MOVO t1, v3; \ - MOVO v6, t1; \ - PUNPCKHQDQ t2, v3; \ - PUNPCKLQDQ v7, t2; \ - PUNPCKHQDQ t2, v6; \ - PUNPCKLQDQ t1, t2; \ - PUNPCKHQDQ t2, v7 - -#define HALF_ROUND(v0, v1, v2, v3, v4, v5, v6, v7, m0, m1, m2, m3, t0, c40, c48) \ - PADDQ m0, v0; \ - PADDQ m1, v1; \ - PADDQ v2, v0; \ - PADDQ v3, v1; \ - PXOR v0, v6; \ - PXOR v1, v7; \ - PSHUFD $0xB1, v6, v6; \ - PSHUFD $0xB1, v7, v7; \ - PADDQ v6, v4; \ - PADDQ v7, v5; \ - PXOR v4, v2; \ - PXOR v5, v3; \ - PSHUFB c40, v2; \ - PSHUFB c40, v3; \ - PADDQ m2, v0; \ - PADDQ m3, v1; \ - PADDQ v2, v0; \ - PADDQ v3, v1; \ - PXOR v0, v6; \ - PXOR v1, v7; \ - PSHUFB c48, v6; \ - PSHUFB c48, v7; \ - PADDQ v6, v4; \ - PADDQ v7, v5; \ - PXOR v4, v2; \ - PXOR v5, v3; \ - MOVOU v2, t0; \ - PADDQ v2, t0; \ - PSRLQ $63, v2; \ - PXOR t0, v2; \ - MOVOU v3, t0; \ - PADDQ v3, t0; \ - PSRLQ $63, v3; \ - PXOR t0, v3 - -#define LOAD_MSG(m0, m1, m2, m3, src, i0, i1, i2, i3, i4, i5, i6, i7) \ - MOVQ i0*8(src), m0; \ - PINSRQ $1, i1*8(src), m0; \ - MOVQ i2*8(src), m1; \ - PINSRQ $1, i3*8(src), m1; \ - MOVQ i4*8(src), m2; \ - PINSRQ $1, i5*8(src), m2; \ - MOVQ i6*8(src), m3; \ - PINSRQ $1, i7*8(src), m3 - -// func hashBlocksSSE4(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) -TEXT ·hashBlocksSSE4(SB), 4, $288-48 // frame size = 272 + 16 byte alignment - MOVQ h+0(FP), AX - MOVQ c+8(FP), BX - MOVQ flag+16(FP), CX - MOVQ blocks_base+24(FP), SI - MOVQ blocks_len+32(FP), DI - - MOVQ SP, BP - MOVQ SP, R9 - ADDQ $15, R9 - ANDQ $~15, R9 - MOVQ R9, SP - - MOVOU ·iv3<>(SB), X0 - MOVO X0, 0(SP) - XORQ CX, 0(SP) // 0(SP) = ·iv3 ^ (CX || 0) - - MOVOU ·c40<>(SB), X13 - MOVOU ·c48<>(SB), X14 - - MOVOU 0(AX), X12 - MOVOU 16(AX), X15 - - MOVQ 0(BX), R8 - MOVQ 8(BX), R9 - -loop: - ADDQ $128, R8 - CMPQ R8, $128 - JGE noinc - INCQ R9 - -noinc: - MOVQ R8, X8 - PINSRQ $1, R9, X8 - - MOVO X12, X0 - MOVO X15, X1 - MOVOU 32(AX), X2 - MOVOU 48(AX), X3 - MOVOU ·iv0<>(SB), X4 - MOVOU ·iv1<>(SB), X5 - MOVOU ·iv2<>(SB), X6 - - PXOR X8, X6 - MOVO 0(SP), X7 - - LOAD_MSG(X8, X9, X10, X11, SI, 0, 2, 4, 6, 1, 3, 5, 7) - MOVO X8, 16(SP) - MOVO X9, 32(SP) - MOVO X10, 48(SP) - MOVO X11, 64(SP) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) - LOAD_MSG(X8, X9, X10, X11, SI, 8, 10, 12, 14, 9, 11, 13, 15) - MOVO X8, 80(SP) - MOVO X9, 96(SP) - MOVO X10, 112(SP) - MOVO X11, 128(SP) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) - - LOAD_MSG(X8, X9, X10, X11, SI, 14, 4, 9, 13, 10, 8, 15, 6) - MOVO X8, 144(SP) - MOVO X9, 160(SP) - MOVO X10, 176(SP) - MOVO X11, 192(SP) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) - LOAD_MSG(X8, X9, X10, X11, SI, 1, 0, 11, 5, 12, 2, 7, 3) - MOVO X8, 208(SP) - MOVO X9, 224(SP) - MOVO X10, 240(SP) - MOVO X11, 256(SP) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) - - LOAD_MSG(X8, X9, X10, X11, SI, 11, 12, 5, 15, 8, 0, 2, 13) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) - LOAD_MSG(X8, X9, X10, X11, SI, 10, 3, 7, 9, 14, 6, 1, 4) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) - - LOAD_MSG(X8, X9, X10, X11, SI, 7, 3, 13, 11, 9, 1, 12, 14) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) - LOAD_MSG(X8, X9, X10, X11, SI, 2, 5, 4, 15, 6, 10, 0, 8) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) - - LOAD_MSG(X8, X9, X10, X11, SI, 9, 5, 2, 10, 0, 7, 4, 15) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) - LOAD_MSG(X8, X9, X10, X11, SI, 14, 11, 6, 3, 1, 12, 8, 13) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) - - LOAD_MSG(X8, X9, X10, X11, SI, 2, 6, 0, 8, 12, 10, 11, 3) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) - LOAD_MSG(X8, X9, X10, X11, SI, 4, 7, 15, 1, 13, 5, 14, 9) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) - - LOAD_MSG(X8, X9, X10, X11, SI, 12, 1, 14, 4, 5, 15, 13, 10) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) - LOAD_MSG(X8, X9, X10, X11, SI, 0, 6, 9, 8, 7, 3, 2, 11) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) - - LOAD_MSG(X8, X9, X10, X11, SI, 13, 7, 12, 3, 11, 14, 1, 9) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) - LOAD_MSG(X8, X9, X10, X11, SI, 5, 15, 8, 2, 0, 4, 6, 10) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) - - LOAD_MSG(X8, X9, X10, X11, SI, 6, 14, 11, 0, 15, 9, 3, 8) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) - LOAD_MSG(X8, X9, X10, X11, SI, 12, 13, 1, 10, 2, 7, 4, 5) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) - - LOAD_MSG(X8, X9, X10, X11, SI, 10, 8, 7, 1, 2, 4, 6, 5) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) - LOAD_MSG(X8, X9, X10, X11, SI, 15, 9, 3, 13, 11, 14, 12, 0) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) - - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, 16(SP), 32(SP), 48(SP), 64(SP), X11, X13, X14) - SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, 80(SP), 96(SP), 112(SP), 128(SP), X11, X13, X14) - SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) - - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, 144(SP), 160(SP), 176(SP), 192(SP), X11, X13, X14) - SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, 208(SP), 224(SP), 240(SP), 256(SP), X11, X13, X14) - SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) - - MOVOU 32(AX), X10 - MOVOU 48(AX), X11 - PXOR X0, X12 - PXOR X1, X15 - PXOR X2, X10 - PXOR X3, X11 - PXOR X4, X12 - PXOR X5, X15 - PXOR X6, X10 - PXOR X7, X11 - MOVOU X10, 32(AX) - MOVOU X11, 48(AX) - - LEAQ 128(SI), SI - SUBQ $128, DI - JNE loop - - MOVOU X12, 0(AX) - MOVOU X15, 16(AX) - - MOVQ R8, 0(BX) - MOVQ R9, 8(BX) - - MOVQ BP, SP - RET - -// func supportsSSE4() bool -TEXT ·supportsSSE4(SB), 4, $0-1 - MOVL $1, AX - CPUID - SHRL $19, CX // Bit 19 indicates SSE4 support - ANDL $1, CX // CX != 0 if support SSE4 - MOVB CX, ret+0(FP) - RET diff --git a/vendor/golang.org/x/crypto/blake2b/blake2b_generic.go b/vendor/golang.org/x/crypto/blake2b/blake2b_generic.go deleted file mode 100644 index 4bd2abc91..000000000 --- a/vendor/golang.org/x/crypto/blake2b/blake2b_generic.go +++ /dev/null @@ -1,179 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package blake2b - -import "encoding/binary" - -// the precomputed values for BLAKE2b -// there are 12 16-byte arrays - one for each round -// the entries are calculated from the sigma constants. -var precomputed = [12][16]byte{ - {0, 2, 4, 6, 1, 3, 5, 7, 8, 10, 12, 14, 9, 11, 13, 15}, - {14, 4, 9, 13, 10, 8, 15, 6, 1, 0, 11, 5, 12, 2, 7, 3}, - {11, 12, 5, 15, 8, 0, 2, 13, 10, 3, 7, 9, 14, 6, 1, 4}, - {7, 3, 13, 11, 9, 1, 12, 14, 2, 5, 4, 15, 6, 10, 0, 8}, - {9, 5, 2, 10, 0, 7, 4, 15, 14, 11, 6, 3, 1, 12, 8, 13}, - {2, 6, 0, 8, 12, 10, 11, 3, 4, 7, 15, 1, 13, 5, 14, 9}, - {12, 1, 14, 4, 5, 15, 13, 10, 0, 6, 9, 8, 7, 3, 2, 11}, - {13, 7, 12, 3, 11, 14, 1, 9, 5, 15, 8, 2, 0, 4, 6, 10}, - {6, 14, 11, 0, 15, 9, 3, 8, 12, 13, 1, 10, 2, 7, 4, 5}, - {10, 8, 7, 1, 2, 4, 6, 5, 15, 9, 3, 13, 11, 14, 12, 0}, - {0, 2, 4, 6, 1, 3, 5, 7, 8, 10, 12, 14, 9, 11, 13, 15}, // equal to the first - {14, 4, 9, 13, 10, 8, 15, 6, 1, 0, 11, 5, 12, 2, 7, 3}, // equal to the second -} - -func hashBlocksGeneric(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) { - var m [16]uint64 - c0, c1 := c[0], c[1] - - for i := 0; i < len(blocks); { - c0 += BlockSize - if c0 < BlockSize { - c1++ - } - - v0, v1, v2, v3, v4, v5, v6, v7 := h[0], h[1], h[2], h[3], h[4], h[5], h[6], h[7] - v8, v9, v10, v11, v12, v13, v14, v15 := iv[0], iv[1], iv[2], iv[3], iv[4], iv[5], iv[6], iv[7] - v12 ^= c0 - v13 ^= c1 - v14 ^= flag - - for j := range m { - m[j] = binary.LittleEndian.Uint64(blocks[i:]) - i += 8 - } - - for j := range precomputed { - s := &(precomputed[j]) - - v0 += m[s[0]] - v0 += v4 - v12 ^= v0 - v12 = v12<<(64-32) | v12>>32 - v8 += v12 - v4 ^= v8 - v4 = v4<<(64-24) | v4>>24 - v1 += m[s[1]] - v1 += v5 - v13 ^= v1 - v13 = v13<<(64-32) | v13>>32 - v9 += v13 - v5 ^= v9 - v5 = v5<<(64-24) | v5>>24 - v2 += m[s[2]] - v2 += v6 - v14 ^= v2 - v14 = v14<<(64-32) | v14>>32 - v10 += v14 - v6 ^= v10 - v6 = v6<<(64-24) | v6>>24 - v3 += m[s[3]] - v3 += v7 - v15 ^= v3 - v15 = v15<<(64-32) | v15>>32 - v11 += v15 - v7 ^= v11 - v7 = v7<<(64-24) | v7>>24 - - v0 += m[s[4]] - v0 += v4 - v12 ^= v0 - v12 = v12<<(64-16) | v12>>16 - v8 += v12 - v4 ^= v8 - v4 = v4<<(64-63) | v4>>63 - v1 += m[s[5]] - v1 += v5 - v13 ^= v1 - v13 = v13<<(64-16) | v13>>16 - v9 += v13 - v5 ^= v9 - v5 = v5<<(64-63) | v5>>63 - v2 += m[s[6]] - v2 += v6 - v14 ^= v2 - v14 = v14<<(64-16) | v14>>16 - v10 += v14 - v6 ^= v10 - v6 = v6<<(64-63) | v6>>63 - v3 += m[s[7]] - v3 += v7 - v15 ^= v3 - v15 = v15<<(64-16) | v15>>16 - v11 += v15 - v7 ^= v11 - v7 = v7<<(64-63) | v7>>63 - - v0 += m[s[8]] - v0 += v5 - v15 ^= v0 - v15 = v15<<(64-32) | v15>>32 - v10 += v15 - v5 ^= v10 - v5 = v5<<(64-24) | v5>>24 - v1 += m[s[9]] - v1 += v6 - v12 ^= v1 - v12 = v12<<(64-32) | v12>>32 - v11 += v12 - v6 ^= v11 - v6 = v6<<(64-24) | v6>>24 - v2 += m[s[10]] - v2 += v7 - v13 ^= v2 - v13 = v13<<(64-32) | v13>>32 - v8 += v13 - v7 ^= v8 - v7 = v7<<(64-24) | v7>>24 - v3 += m[s[11]] - v3 += v4 - v14 ^= v3 - v14 = v14<<(64-32) | v14>>32 - v9 += v14 - v4 ^= v9 - v4 = v4<<(64-24) | v4>>24 - - v0 += m[s[12]] - v0 += v5 - v15 ^= v0 - v15 = v15<<(64-16) | v15>>16 - v10 += v15 - v5 ^= v10 - v5 = v5<<(64-63) | v5>>63 - v1 += m[s[13]] - v1 += v6 - v12 ^= v1 - v12 = v12<<(64-16) | v12>>16 - v11 += v12 - v6 ^= v11 - v6 = v6<<(64-63) | v6>>63 - v2 += m[s[14]] - v2 += v7 - v13 ^= v2 - v13 = v13<<(64-16) | v13>>16 - v8 += v13 - v7 ^= v8 - v7 = v7<<(64-63) | v7>>63 - v3 += m[s[15]] - v3 += v4 - v14 ^= v3 - v14 = v14<<(64-16) | v14>>16 - v9 += v14 - v4 ^= v9 - v4 = v4<<(64-63) | v4>>63 - - } - - h[0] ^= v0 ^ v8 - h[1] ^= v1 ^ v9 - h[2] ^= v2 ^ v10 - h[3] ^= v3 ^ v11 - h[4] ^= v4 ^ v12 - h[5] ^= v5 ^ v13 - h[6] ^= v6 ^ v14 - h[7] ^= v7 ^ v15 - } - c[0], c[1] = c0, c1 -} diff --git a/vendor/golang.org/x/crypto/blake2b/blake2b_ref.go b/vendor/golang.org/x/crypto/blake2b/blake2b_ref.go deleted file mode 100644 index da156a1ba..000000000 --- a/vendor/golang.org/x/crypto/blake2b/blake2b_ref.go +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !amd64 appengine gccgo - -package blake2b - -func hashBlocks(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) { - hashBlocksGeneric(h, c, flag, blocks) -} diff --git a/vendor/golang.org/x/crypto/blake2b/blake2b_test.go b/vendor/golang.org/x/crypto/blake2b/blake2b_test.go deleted file mode 100644 index a38fceb20..000000000 --- a/vendor/golang.org/x/crypto/blake2b/blake2b_test.go +++ /dev/null @@ -1,448 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package blake2b - -import ( - "bytes" - "encoding/hex" - "fmt" - "hash" - "testing" -) - -func fromHex(s string) []byte { - b, err := hex.DecodeString(s) - if err != nil { - panic(err) - } - return b -} - -func TestHashes(t *testing.T) { - defer func(sse4, avx, avx2 bool) { - useSSE4, useAVX, useAVX2 = sse4, useAVX, avx2 - }(useSSE4, useAVX, useAVX2) - - if useAVX2 { - t.Log("AVX2 version") - testHashes(t) - useAVX2 = false - } - if useAVX { - t.Log("AVX version") - testHashes(t) - useAVX = false - } - if useSSE4 { - t.Log("SSE4 version") - testHashes(t) - useSSE4 = false - } - t.Log("generic version") - testHashes(t) -} - -func testHashes(t *testing.T) { - key, _ := hex.DecodeString("000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f") - - input := make([]byte, 255) - for i := range input { - input[i] = byte(i) - } - - for i, expectedHex := range hashes { - h, err := New512(key) - if err != nil { - t.Fatalf("#%d: error from New512: %v", i, err) - } - - h.Write(input[:i]) - sum := h.Sum(nil) - - if gotHex := fmt.Sprintf("%x", sum); gotHex != expectedHex { - t.Fatalf("#%d (single write): got %s, wanted %s", i, gotHex, expectedHex) - } - - h.Reset() - for j := 0; j < i; j++ { - h.Write(input[j : j+1]) - } - - sum = h.Sum(sum[:0]) - if gotHex := fmt.Sprintf("%x", sum); gotHex != expectedHex { - t.Fatalf("#%d (byte-by-byte): got %s, wanted %s", i, gotHex, expectedHex) - } - } -} - -func generateSequence(out []byte, seed uint32) { - a := 0xDEAD4BAD * seed // prime - b := uint32(1) - - for i := range out { // fill the buf - a, b = b, a+b - out[i] = byte(b >> 24) - } -} - -func computeMAC(msg []byte, hashSize int, key []byte) (sum []byte) { - var h hash.Hash - switch hashSize { - case Size: - h, _ = New512(key) - case Size384: - h, _ = New384(key) - case Size256: - h, _ = New256(key) - case 20: - h, _ = newDigest(20, key) - default: - panic("unexpected hashSize") - } - - h.Write(msg) - return h.Sum(sum) -} - -func computeHash(msg []byte, hashSize int) (sum []byte) { - switch hashSize { - case Size: - hash := Sum512(msg) - return hash[:] - case Size384: - hash := Sum384(msg) - return hash[:] - case Size256: - hash := Sum256(msg) - return hash[:] - case 20: - var hash [64]byte - checkSum(&hash, 20, msg) - return hash[:20] - default: - panic("unexpected hashSize") - } -} - -// Test function from RFC 7693. -func TestSelfTest(t *testing.T) { - hashLens := [4]int{20, 32, 48, 64} - msgLens := [6]int{0, 3, 128, 129, 255, 1024} - - msg := make([]byte, 1024) - key := make([]byte, 64) - - h, _ := New256(nil) - for _, hashSize := range hashLens { - for _, msgLength := range msgLens { - generateSequence(msg[:msgLength], uint32(msgLength)) // unkeyed hash - - md := computeHash(msg[:msgLength], hashSize) - h.Write(md) - - generateSequence(key[:], uint32(hashSize)) // keyed hash - md = computeMAC(msg[:msgLength], hashSize, key[:hashSize]) - h.Write(md) - } - } - - sum := h.Sum(nil) - expected := [32]byte{ - 0xc2, 0x3a, 0x78, 0x00, 0xd9, 0x81, 0x23, 0xbd, - 0x10, 0xf5, 0x06, 0xc6, 0x1e, 0x29, 0xda, 0x56, - 0x03, 0xd7, 0x63, 0xb8, 0xbb, 0xad, 0x2e, 0x73, - 0x7f, 0x5e, 0x76, 0x5a, 0x7b, 0xcc, 0xd4, 0x75, - } - if !bytes.Equal(sum, expected[:]) { - t.Fatalf("got %x, wanted %x", sum, expected) - } -} - -// Benchmarks - -func benchmarkSum(b *testing.B, size int) { - data := make([]byte, size) - b.SetBytes(int64(size)) - b.ResetTimer() - for i := 0; i < b.N; i++ { - Sum512(data) - } -} - -func benchmarkWrite(b *testing.B, size int) { - data := make([]byte, size) - h, _ := New512(nil) - b.SetBytes(int64(size)) - b.ResetTimer() - for i := 0; i < b.N; i++ { - h.Write(data) - } -} - -func BenchmarkWrite128(b *testing.B) { benchmarkWrite(b, 128) } -func BenchmarkWrite1K(b *testing.B) { benchmarkWrite(b, 1024) } - -func BenchmarkSum128(b *testing.B) { benchmarkSum(b, 128) } -func BenchmarkSum1K(b *testing.B) { benchmarkSum(b, 1024) } - -// These values were taken from https://blake2.net/blake2b-test.txt. -var hashes = []string{ - "10ebb67700b1868efb4417987acf4690ae9d972fb7a590c2f02871799aaa4786b5e996e8f0f4eb981fc214b005f42d2ff4233499391653df7aefcbc13fc51568", - "961f6dd1e4dd30f63901690c512e78e4b45e4742ed197c3c5e45c549fd25f2e4187b0bc9fe30492b16b0d0bc4ef9b0f34c7003fac09a5ef1532e69430234cebd", - "da2cfbe2d8409a0f38026113884f84b50156371ae304c4430173d08a99d9fb1b983164a3770706d537f49e0c916d9f32b95cc37a95b99d857436f0232c88a965", - "33d0825dddf7ada99b0e7e307104ad07ca9cfd9692214f1561356315e784f3e5a17e364ae9dbb14cb2036df932b77f4b292761365fb328de7afdc6d8998f5fc1", - "beaa5a3d08f3807143cf621d95cd690514d0b49efff9c91d24b59241ec0eefa5f60196d407048bba8d2146828ebcb0488d8842fd56bb4f6df8e19c4b4daab8ac", - "098084b51fd13deae5f4320de94a688ee07baea2800486689a8636117b46c1f4c1f6af7f74ae7c857600456a58a3af251dc4723a64cc7c0a5ab6d9cac91c20bb", - "6044540d560853eb1c57df0077dd381094781cdb9073e5b1b3d3f6c7829e12066bbaca96d989a690de72ca3133a83652ba284a6d62942b271ffa2620c9e75b1f", - "7a8cfe9b90f75f7ecb3acc053aaed6193112b6f6a4aeeb3f65d3de541942deb9e2228152a3c4bbbe72fc3b12629528cfbb09fe630f0474339f54abf453e2ed52", - "380beaf6ea7cc9365e270ef0e6f3a64fb902acae51dd5512f84259ad2c91f4bc4108db73192a5bbfb0cbcf71e46c3e21aee1c5e860dc96e8eb0b7b8426e6abe9", - "60fe3c4535e1b59d9a61ea8500bfac41a69dffb1ceadd9aca323e9a625b64da5763bad7226da02b9c8c4f1a5de140ac5a6c1124e4f718ce0b28ea47393aa6637", - "4fe181f54ad63a2983feaaf77d1e7235c2beb17fa328b6d9505bda327df19fc37f02c4b6f0368ce23147313a8e5738b5fa2a95b29de1c7f8264eb77b69f585cd", - "f228773ce3f3a42b5f144d63237a72d99693adb8837d0e112a8a0f8ffff2c362857ac49c11ec740d1500749dac9b1f4548108bf3155794dcc9e4082849e2b85b", - "962452a8455cc56c8511317e3b1f3b2c37df75f588e94325fdd77070359cf63a9ae6e930936fdf8e1e08ffca440cfb72c28f06d89a2151d1c46cd5b268ef8563", - "43d44bfa18768c59896bf7ed1765cb2d14af8c260266039099b25a603e4ddc5039d6ef3a91847d1088d401c0c7e847781a8a590d33a3c6cb4df0fab1c2f22355", - "dcffa9d58c2a4ca2cdbb0c7aa4c4c1d45165190089f4e983bb1c2cab4aaeff1fa2b5ee516fecd780540240bf37e56c8bcca7fab980e1e61c9400d8a9a5b14ac6", - "6fbf31b45ab0c0b8dad1c0f5f4061379912dde5aa922099a030b725c73346c524291adef89d2f6fd8dfcda6d07dad811a9314536c2915ed45da34947e83de34e", - "a0c65bddde8adef57282b04b11e7bc8aab105b99231b750c021f4a735cb1bcfab87553bba3abb0c3e64a0b6955285185a0bd35fb8cfde557329bebb1f629ee93", - "f99d815550558e81eca2f96718aed10d86f3f1cfb675cce06b0eff02f617c5a42c5aa760270f2679da2677c5aeb94f1142277f21c7f79f3c4f0cce4ed8ee62b1", - "95391da8fc7b917a2044b3d6f5374e1ca072b41454d572c7356c05fd4bc1e0f40b8bb8b4a9f6bce9be2c4623c399b0dca0dab05cb7281b71a21b0ebcd9e55670", - "04b9cd3d20d221c09ac86913d3dc63041989a9a1e694f1e639a3ba7e451840f750c2fc191d56ad61f2e7936bc0ac8e094b60caeed878c18799045402d61ceaf9", - "ec0e0ef707e4ed6c0c66f9e089e4954b058030d2dd86398fe84059631f9ee591d9d77375355149178c0cf8f8e7c49ed2a5e4f95488a2247067c208510fadc44c", - "9a37cce273b79c09913677510eaf7688e89b3314d3532fd2764c39de022a2945b5710d13517af8ddc0316624e73bec1ce67df15228302036f330ab0cb4d218dd", - "4cf9bb8fb3d4de8b38b2f262d3c40f46dfe747e8fc0a414c193d9fcf753106ce47a18f172f12e8a2f1c26726545358e5ee28c9e2213a8787aafbc516d2343152", - "64e0c63af9c808fd893137129867fd91939d53f2af04be4fa268006100069b2d69daa5c5d8ed7fddcb2a70eeecdf2b105dd46a1e3b7311728f639ab489326bc9", - "5e9c93158d659b2def06b0c3c7565045542662d6eee8a96a89b78ade09fe8b3dcc096d4fe48815d88d8f82620156602af541955e1f6ca30dce14e254c326b88f", - "7775dff889458dd11aef417276853e21335eb88e4dec9cfb4e9edb49820088551a2ca60339f12066101169f0dfe84b098fddb148d9da6b3d613df263889ad64b", - "f0d2805afbb91f743951351a6d024f9353a23c7ce1fc2b051b3a8b968c233f46f50f806ecb1568ffaa0b60661e334b21dde04f8fa155ac740eeb42e20b60d764", - "86a2af316e7d7754201b942e275364ac12ea8962ab5bd8d7fb276dc5fbffc8f9a28cae4e4867df6780d9b72524160927c855da5b6078e0b554aa91e31cb9ca1d", - "10bdf0caa0802705e706369baf8a3f79d72c0a03a80675a7bbb00be3a45e516424d1ee88efb56f6d5777545ae6e27765c3a8f5e493fc308915638933a1dfee55", - "b01781092b1748459e2e4ec178696627bf4ebafebba774ecf018b79a68aeb84917bf0b84bb79d17b743151144cd66b7b33a4b9e52c76c4e112050ff5385b7f0b", - "c6dbc61dec6eaeac81e3d5f755203c8e220551534a0b2fd105a91889945a638550204f44093dd998c076205dffad703a0e5cd3c7f438a7e634cd59fededb539e", - "eba51acffb4cea31db4b8d87e9bf7dd48fe97b0253ae67aa580f9ac4a9d941f2bea518ee286818cc9f633f2a3b9fb68e594b48cdd6d515bf1d52ba6c85a203a7", - "86221f3ada52037b72224f105d7999231c5e5534d03da9d9c0a12acb68460cd375daf8e24386286f9668f72326dbf99ba094392437d398e95bb8161d717f8991", - "5595e05c13a7ec4dc8f41fb70cb50a71bce17c024ff6de7af618d0cc4e9c32d9570d6d3ea45b86525491030c0d8f2b1836d5778c1ce735c17707df364d054347", - "ce0f4f6aca89590a37fe034dd74dd5fa65eb1cbd0a41508aaddc09351a3cea6d18cb2189c54b700c009f4cbf0521c7ea01be61c5ae09cb54f27bc1b44d658c82", - "7ee80b06a215a3bca970c77cda8761822bc103d44fa4b33f4d07dcb997e36d55298bceae12241b3fa07fa63be5576068da387b8d5859aeab701369848b176d42", - "940a84b6a84d109aab208c024c6ce9647676ba0aaa11f86dbb7018f9fd2220a6d901a9027f9abcf935372727cbf09ebd61a2a2eeb87653e8ecad1bab85dc8327", - "2020b78264a82d9f4151141adba8d44bf20c5ec062eee9b595a11f9e84901bf148f298e0c9f8777dcdbc7cc4670aac356cc2ad8ccb1629f16f6a76bcefbee760", - "d1b897b0e075ba68ab572adf9d9c436663e43eb3d8e62d92fc49c9be214e6f27873fe215a65170e6bea902408a25b49506f47babd07cecf7113ec10c5dd31252", - "b14d0c62abfa469a357177e594c10c194243ed2025ab8aa5ad2fa41ad318e0ff48cd5e60bec07b13634a711d2326e488a985f31e31153399e73088efc86a5c55", - "4169c5cc808d2697dc2a82430dc23e3cd356dc70a94566810502b8d655b39abf9e7f902fe717e0389219859e1945df1af6ada42e4ccda55a197b7100a30c30a1", - "258a4edb113d66c839c8b1c91f15f35ade609f11cd7f8681a4045b9fef7b0b24c82cda06a5f2067b368825e3914e53d6948ede92efd6e8387fa2e537239b5bee", - "79d2d8696d30f30fb34657761171a11e6c3f1e64cbe7bebee159cb95bfaf812b4f411e2f26d9c421dc2c284a3342d823ec293849e42d1e46b0a4ac1e3c86abaa", - "8b9436010dc5dee992ae38aea97f2cd63b946d94fedd2ec9671dcde3bd4ce9564d555c66c15bb2b900df72edb6b891ebcadfeff63c9ea4036a998be7973981e7", - "c8f68e696ed28242bf997f5b3b34959508e42d613810f1e2a435c96ed2ff560c7022f361a9234b9837feee90bf47922ee0fd5f8ddf823718d86d1e16c6090071", - "b02d3eee4860d5868b2c39ce39bfe81011290564dd678c85e8783f29302dfc1399ba95b6b53cd9ebbf400cca1db0ab67e19a325f2d115812d25d00978ad1bca4", - "7693ea73af3ac4dad21ca0d8da85b3118a7d1c6024cfaf557699868217bc0c2f44a199bc6c0edd519798ba05bd5b1b4484346a47c2cadf6bf30b785cc88b2baf", - "a0e5c1c0031c02e48b7f09a5e896ee9aef2f17fc9e18e997d7f6cac7ae316422c2b1e77984e5f3a73cb45deed5d3f84600105e6ee38f2d090c7d0442ea34c46d", - "41daa6adcfdb69f1440c37b596440165c15ada596813e2e22f060fcd551f24dee8e04ba6890387886ceec4a7a0d7fc6b44506392ec3822c0d8c1acfc7d5aebe8", - "14d4d40d5984d84c5cf7523b7798b254e275a3a8cc0a1bd06ebc0bee726856acc3cbf516ff667cda2058ad5c3412254460a82c92187041363cc77a4dc215e487", - "d0e7a1e2b9a447fee83e2277e9ff8010c2f375ae12fa7aaa8ca5a6317868a26a367a0b69fbc1cf32a55d34eb370663016f3d2110230eba754028a56f54acf57c", - "e771aa8db5a3e043e8178f39a0857ba04a3f18e4aa05743cf8d222b0b095825350ba422f63382a23d92e4149074e816a36c1cd28284d146267940b31f8818ea2", - "feb4fd6f9e87a56bef398b3284d2bda5b5b0e166583a66b61e538457ff0584872c21a32962b9928ffab58de4af2edd4e15d8b35570523207ff4e2a5aa7754caa", - "462f17bf005fb1c1b9e671779f665209ec2873e3e411f98dabf240a1d5ec3f95ce6796b6fc23fe171903b502023467dec7273ff74879b92967a2a43a5a183d33", - "d3338193b64553dbd38d144bea71c5915bb110e2d88180dbc5db364fd6171df317fc7268831b5aef75e4342b2fad8797ba39eddcef80e6ec08159350b1ad696d", - "e1590d585a3d39f7cb599abd479070966409a6846d4377acf4471d065d5db94129cc9be92573b05ed226be1e9b7cb0cabe87918589f80dadd4ef5ef25a93d28e", - "f8f3726ac5a26cc80132493a6fedcb0e60760c09cfc84cad178175986819665e76842d7b9fedf76dddebf5d3f56faaad4477587af21606d396ae570d8e719af2", - "30186055c07949948183c850e9a756cc09937e247d9d928e869e20bafc3cd9721719d34e04a0899b92c736084550186886efba2e790d8be6ebf040b209c439a4", - "f3c4276cb863637712c241c444c5cc1e3554e0fddb174d035819dd83eb700b4ce88df3ab3841ba02085e1a99b4e17310c5341075c0458ba376c95a6818fbb3e2", - "0aa007c4dd9d5832393040a1583c930bca7dc5e77ea53add7e2b3f7c8e231368043520d4a3ef53c969b6bbfd025946f632bd7f765d53c21003b8f983f75e2a6a", - "08e9464720533b23a04ec24f7ae8c103145f765387d738777d3d343477fd1c58db052142cab754ea674378e18766c53542f71970171cc4f81694246b717d7564", - "d37ff7ad297993e7ec21e0f1b4b5ae719cdc83c5db687527f27516cbffa822888a6810ee5c1ca7bfe3321119be1ab7bfa0a502671c8329494df7ad6f522d440f", - "dd9042f6e464dcf86b1262f6accfafbd8cfd902ed3ed89abf78ffa482dbdeeb6969842394c9a1168ae3d481a017842f660002d42447c6b22f7b72f21aae021c9", - "bd965bf31e87d70327536f2a341cebc4768eca275fa05ef98f7f1b71a0351298de006fba73fe6733ed01d75801b4a928e54231b38e38c562b2e33ea1284992fa", - "65676d800617972fbd87e4b9514e1c67402b7a331096d3bfac22f1abb95374abc942f16e9ab0ead33b87c91968a6e509e119ff07787b3ef483e1dcdccf6e3022", - "939fa189699c5d2c81ddd1ffc1fa207c970b6a3685bb29ce1d3e99d42f2f7442da53e95a72907314f4588399a3ff5b0a92beb3f6be2694f9f86ecf2952d5b41c", - "c516541701863f91005f314108ceece3c643e04fc8c42fd2ff556220e616aaa6a48aeb97a84bad74782e8dff96a1a2fa949339d722edcaa32b57067041df88cc", - "987fd6e0d6857c553eaebb3d34970a2c2f6e89a3548f492521722b80a1c21a153892346d2cba6444212d56da9a26e324dccbc0dcde85d4d2ee4399eec5a64e8f", - "ae56deb1c2328d9c4017706bce6e99d41349053ba9d336d677c4c27d9fd50ae6aee17e853154e1f4fe7672346da2eaa31eea53fcf24a22804f11d03da6abfc2b", - "49d6a608c9bde4491870498572ac31aac3fa40938b38a7818f72383eb040ad39532bc06571e13d767e6945ab77c0bdc3b0284253343f9f6c1244ebf2ff0df866", - "da582ad8c5370b4469af862aa6467a2293b2b28bd80ae0e91f425ad3d47249fdf98825cc86f14028c3308c9804c78bfeeeee461444ce243687e1a50522456a1d", - "d5266aa3331194aef852eed86d7b5b2633a0af1c735906f2e13279f14931a9fc3b0eac5ce9245273bd1aa92905abe16278ef7efd47694789a7283b77da3c70f8", - "2962734c28252186a9a1111c732ad4de4506d4b4480916303eb7991d659ccda07a9911914bc75c418ab7a4541757ad054796e26797feaf36e9f6ad43f14b35a4", - "e8b79ec5d06e111bdfafd71e9f5760f00ac8ac5d8bf768f9ff6f08b8f026096b1cc3a4c973333019f1e3553e77da3f98cb9f542e0a90e5f8a940cc58e59844b3", - "dfb320c44f9d41d1efdcc015f08dd5539e526e39c87d509ae6812a969e5431bf4fa7d91ffd03b981e0d544cf72d7b1c0374f8801482e6dea2ef903877eba675e", - "d88675118fdb55a5fb365ac2af1d217bf526ce1ee9c94b2f0090b2c58a06ca58187d7fe57c7bed9d26fca067b4110eefcd9a0a345de872abe20de368001b0745", - "b893f2fc41f7b0dd6e2f6aa2e0370c0cff7df09e3acfcc0e920b6e6fad0ef747c40668417d342b80d2351e8c175f20897a062e9765e6c67b539b6ba8b9170545", - "6c67ec5697accd235c59b486d7b70baeedcbd4aa64ebd4eef3c7eac189561a726250aec4d48cadcafbbe2ce3c16ce2d691a8cce06e8879556d4483ed7165c063", - "f1aa2b044f8f0c638a3f362e677b5d891d6fd2ab0765f6ee1e4987de057ead357883d9b405b9d609eea1b869d97fb16d9b51017c553f3b93c0a1e0f1296fedcd", - "cbaa259572d4aebfc1917acddc582b9f8dfaa928a198ca7acd0f2aa76a134a90252e6298a65b08186a350d5b7626699f8cb721a3ea5921b753ae3a2dce24ba3a", - "fa1549c9796cd4d303dcf452c1fbd5744fd9b9b47003d920b92de34839d07ef2a29ded68f6fc9e6c45e071a2e48bd50c5084e96b657dd0404045a1ddefe282ed", - "5cf2ac897ab444dcb5c8d87c495dbdb34e1838b6b629427caa51702ad0f9688525f13bec503a3c3a2c80a65e0b5715e8afab00ffa56ec455a49a1ad30aa24fcd", - "9aaf80207bace17bb7ab145757d5696bde32406ef22b44292ef65d4519c3bb2ad41a59b62cc3e94b6fa96d32a7faadae28af7d35097219aa3fd8cda31e40c275", - "af88b163402c86745cb650c2988fb95211b94b03ef290eed9662034241fd51cf398f8073e369354c43eae1052f9b63b08191caa138aa54fea889cc7024236897", - "48fa7d64e1ceee27b9864db5ada4b53d00c9bc7626555813d3cd6730ab3cc06ff342d727905e33171bde6e8476e77fb1720861e94b73a2c538d254746285f430", - "0e6fd97a85e904f87bfe85bbeb34f69e1f18105cf4ed4f87aec36c6e8b5f68bd2a6f3dc8a9ecb2b61db4eedb6b2ea10bf9cb0251fb0f8b344abf7f366b6de5ab", - "06622da5787176287fdc8fed440bad187d830099c94e6d04c8e9c954cda70c8bb9e1fc4a6d0baa831b9b78ef6648681a4867a11da93ee36e5e6a37d87fc63f6f", - "1da6772b58fabf9c61f68d412c82f182c0236d7d575ef0b58dd22458d643cd1dfc93b03871c316d8430d312995d4197f0874c99172ba004a01ee295abac24e46", - "3cd2d9320b7b1d5fb9aab951a76023fa667be14a9124e394513918a3f44096ae4904ba0ffc150b63bc7ab1eeb9a6e257e5c8f000a70394a5afd842715de15f29", - "04cdc14f7434e0b4be70cb41db4c779a88eaef6accebcb41f2d42fffe7f32a8e281b5c103a27021d0d08362250753cdf70292195a53a48728ceb5844c2d98bab", - "9071b7a8a075d0095b8fb3ae5113785735ab98e2b52faf91d5b89e44aac5b5d4ebbf91223b0ff4c71905da55342e64655d6ef8c89a4768c3f93a6dc0366b5bc8", - "ebb30240dd96c7bc8d0abe49aa4edcbb4afdc51ff9aaf720d3f9e7fbb0f9c6d6571350501769fc4ebd0b2141247ff400d4fd4be414edf37757bb90a32ac5c65a", - "8532c58bf3c8015d9d1cbe00eef1f5082f8f3632fbe9f1ed4f9dfb1fa79e8283066d77c44c4af943d76b300364aecbd0648c8a8939bd204123f4b56260422dec", - "fe9846d64f7c7708696f840e2d76cb4408b6595c2f81ec6a28a7f2f20cb88cfe6ac0b9e9b8244f08bd7095c350c1d0842f64fb01bb7f532dfcd47371b0aeeb79", - "28f17ea6fb6c42092dc264257e29746321fb5bdaea9873c2a7fa9d8f53818e899e161bc77dfe8090afd82bf2266c5c1bc930a8d1547624439e662ef695f26f24", - "ec6b7d7f030d4850acae3cb615c21dd25206d63e84d1db8d957370737ba0e98467ea0ce274c66199901eaec18a08525715f53bfdb0aacb613d342ebdceeddc3b", - "b403d3691c03b0d3418df327d5860d34bbfcc4519bfbce36bf33b208385fadb9186bc78a76c489d89fd57e7dc75412d23bcd1dae8470ce9274754bb8585b13c5", - "31fc79738b8772b3f55cd8178813b3b52d0db5a419d30ba9495c4b9da0219fac6df8e7c23a811551a62b827f256ecdb8124ac8a6792ccfecc3b3012722e94463", - "bb2039ec287091bcc9642fc90049e73732e02e577e2862b32216ae9bedcd730c4c284ef3968c368b7d37584f97bd4b4dc6ef6127acfe2e6ae2509124e66c8af4", - "f53d68d13f45edfcb9bd415e2831e938350d5380d3432278fc1c0c381fcb7c65c82dafe051d8c8b0d44e0974a0e59ec7bf7ed0459f86e96f329fc79752510fd3", - "8d568c7984f0ecdf7640fbc483b5d8c9f86634f6f43291841b309a350ab9c1137d24066b09da9944bac54d5bb6580d836047aac74ab724b887ebf93d4b32eca9", - "c0b65ce5a96ff774c456cac3b5f2c4cd359b4ff53ef93a3da0778be4900d1e8da1601e769e8f1b02d2a2f8c5b9fa10b44f1c186985468feeb008730283a6657d", - "4900bba6f5fb103ece8ec96ada13a5c3c85488e05551da6b6b33d988e611ec0fe2e3c2aa48ea6ae8986a3a231b223c5d27cec2eadde91ce07981ee652862d1e4", - "c7f5c37c7285f927f76443414d4357ff789647d7a005a5a787e03c346b57f49f21b64fa9cf4b7e45573e23049017567121a9c3d4b2b73ec5e9413577525db45a", - "ec7096330736fdb2d64b5653e7475da746c23a4613a82687a28062d3236364284ac01720ffb406cfe265c0df626a188c9e5963ace5d3d5bb363e32c38c2190a6", - "82e744c75f4649ec52b80771a77d475a3bc091989556960e276a5f9ead92a03f718742cdcfeaee5cb85c44af198adc43a4a428f5f0c2ddb0be36059f06d7df73", - "2834b7a7170f1f5b68559ab78c1050ec21c919740b784a9072f6e5d69f828d70c919c5039fb148e39e2c8a52118378b064ca8d5001cd10a5478387b966715ed6", - "16b4ada883f72f853bb7ef253efcab0c3e2161687ad61543a0d2824f91c1f81347d86be709b16996e17f2dd486927b0288ad38d13063c4a9672c39397d3789b6", - "78d048f3a69d8b54ae0ed63a573ae350d89f7c6cf1f3688930de899afa037697629b314e5cd303aa62feea72a25bf42b304b6c6bcb27fae21c16d925e1fbdac3", - "0f746a48749287ada77a82961f05a4da4abdb7d77b1220f836d09ec814359c0ec0239b8c7b9ff9e02f569d1b301ef67c4612d1de4f730f81c12c40cc063c5caa", - "f0fc859d3bd195fbdc2d591e4cdac15179ec0f1dc821c11df1f0c1d26e6260aaa65b79fafacafd7d3ad61e600f250905f5878c87452897647a35b995bcadc3a3", - "2620f687e8625f6a412460b42e2cef67634208ce10a0cbd4dff7044a41b7880077e9f8dc3b8d1216d3376a21e015b58fb279b521d83f9388c7382c8505590b9b", - "227e3aed8d2cb10b918fcb04f9de3e6d0a57e08476d93759cd7b2ed54a1cbf0239c528fb04bbf288253e601d3bc38b21794afef90b17094a182cac557745e75f", - "1a929901b09c25f27d6b35be7b2f1c4745131fdebca7f3e2451926720434e0db6e74fd693ad29b777dc3355c592a361c4873b01133a57c2e3b7075cbdb86f4fc", - "5fd7968bc2fe34f220b5e3dc5af9571742d73b7d60819f2888b629072b96a9d8ab2d91b82d0a9aaba61bbd39958132fcc4257023d1eca591b3054e2dc81c8200", - "dfcce8cf32870cc6a503eadafc87fd6f78918b9b4d0737db6810be996b5497e7e5cc80e312f61e71ff3e9624436073156403f735f56b0b01845c18f6caf772e6", - "02f7ef3a9ce0fff960f67032b296efca3061f4934d690749f2d01c35c81c14f39a67fa350bc8a0359bf1724bffc3bca6d7c7bba4791fd522a3ad353c02ec5aa8", - "64be5c6aba65d594844ae78bb022e5bebe127fd6b6ffa5a13703855ab63b624dcd1a363f99203f632ec386f3ea767fc992e8ed9686586aa27555a8599d5b808f", - "f78585505c4eaa54a8b5be70a61e735e0ff97af944ddb3001e35d86c4e2199d976104b6ae31750a36a726ed285064f5981b503889fef822fcdc2898dddb7889a", - "e4b5566033869572edfd87479a5bb73c80e8759b91232879d96b1dda36c012076ee5a2ed7ae2de63ef8406a06aea82c188031b560beafb583fb3de9e57952a7e", - "e1b3e7ed867f6c9484a2a97f7715f25e25294e992e41f6a7c161ffc2adc6daaeb7113102d5e6090287fe6ad94ce5d6b739c6ca240b05c76fb73f25dd024bf935", - "85fd085fdc12a080983df07bd7012b0d402a0f4043fcb2775adf0bad174f9b08d1676e476985785c0a5dcc41dbff6d95ef4d66a3fbdc4a74b82ba52da0512b74", - "aed8fa764b0fbff821e05233d2f7b0900ec44d826f95e93c343c1bc3ba5a24374b1d616e7e7aba453a0ada5e4fab5382409e0d42ce9c2bc7fb39a99c340c20f0", - "7ba3b2e297233522eeb343bd3ebcfd835a04007735e87f0ca300cbee6d416565162171581e4020ff4cf176450f1291ea2285cb9ebffe4c56660627685145051c", - "de748bcf89ec88084721e16b85f30adb1a6134d664b5843569babc5bbd1a15ca9b61803c901a4fef32965a1749c9f3a4e243e173939dc5a8dc495c671ab52145", - "aaf4d2bdf200a919706d9842dce16c98140d34bc433df320aba9bd429e549aa7a3397652a4d768277786cf993cde2338673ed2e6b66c961fefb82cd20c93338f", - "c408218968b788bf864f0997e6bc4c3dba68b276e2125a4843296052ff93bf5767b8cdce7131f0876430c1165fec6c4f47adaa4fd8bcfacef463b5d3d0fa61a0", - "76d2d819c92bce55fa8e092ab1bf9b9eab237a25267986cacf2b8ee14d214d730dc9a5aa2d7b596e86a1fd8fa0804c77402d2fcd45083688b218b1cdfa0dcbcb", - "72065ee4dd91c2d8509fa1fc28a37c7fc9fa7d5b3f8ad3d0d7a25626b57b1b44788d4caf806290425f9890a3a2a35a905ab4b37acfd0da6e4517b2525c9651e4", - "64475dfe7600d7171bea0b394e27c9b00d8e74dd1e416a79473682ad3dfdbb706631558055cfc8a40e07bd015a4540dcdea15883cbbf31412df1de1cd4152b91", - "12cd1674a4488a5d7c2b3160d2e2c4b58371bedad793418d6f19c6ee385d70b3e06739369d4df910edb0b0a54cbff43d54544cd37ab3a06cfa0a3ddac8b66c89", - "60756966479dedc6dd4bcff8ea7d1d4ce4d4af2e7b097e32e3763518441147cc12b3c0ee6d2ecabf1198cec92e86a3616fba4f4e872f5825330adbb4c1dee444", - "a7803bcb71bc1d0f4383dde1e0612e04f872b715ad30815c2249cf34abb8b024915cb2fc9f4e7cc4c8cfd45be2d5a91eab0941c7d270e2da4ca4a9f7ac68663a", - "b84ef6a7229a34a750d9a98ee2529871816b87fbe3bc45b45fa5ae82d5141540211165c3c5d7a7476ba5a4aa06d66476f0d9dc49a3f1ee72c3acabd498967414", - "fae4b6d8efc3f8c8e64d001dabec3a21f544e82714745251b2b4b393f2f43e0da3d403c64db95a2cb6e23ebb7b9e94cdd5ddac54f07c4a61bd3cb10aa6f93b49", - "34f7286605a122369540141ded79b8957255da2d4155abbf5a8dbb89c8eb7ede8eeef1daa46dc29d751d045dc3b1d658bb64b80ff8589eddb3824b13da235a6b", - "3b3b48434be27b9eababba43bf6b35f14b30f6a88dc2e750c358470d6b3aa3c18e47db4017fa55106d8252f016371a00f5f8b070b74ba5f23cffc5511c9f09f0", - "ba289ebd6562c48c3e10a8ad6ce02e73433d1e93d7c9279d4d60a7e879ee11f441a000f48ed9f7c4ed87a45136d7dccdca482109c78a51062b3ba4044ada2469", - "022939e2386c5a37049856c850a2bb10a13dfea4212b4c732a8840a9ffa5faf54875c5448816b2785a007da8a8d2bc7d71a54e4e6571f10b600cbdb25d13ede3", - "e6fec19d89ce8717b1a087024670fe026f6c7cbda11caef959bb2d351bf856f8055d1c0ebdaaa9d1b17886fc2c562b5e99642fc064710c0d3488a02b5ed7f6fd", - "94c96f02a8f576aca32ba61c2b206f907285d9299b83ac175c209a8d43d53bfe683dd1d83e7549cb906c28f59ab7c46f8751366a28c39dd5fe2693c9019666c8", - "31a0cd215ebd2cb61de5b9edc91e6195e31c59a5648d5c9f737e125b2605708f2e325ab3381c8dce1a3e958886f1ecdc60318f882cfe20a24191352e617b0f21", - "91ab504a522dce78779f4c6c6ba2e6b6db5565c76d3e7e7c920caf7f757ef9db7c8fcf10e57f03379ea9bf75eb59895d96e149800b6aae01db778bb90afbc989", - "d85cabc6bd5b1a01a5afd8c6734740da9fd1c1acc6db29bfc8a2e5b668b028b6b3154bfb8703fa3180251d589ad38040ceb707c4bad1b5343cb426b61eaa49c1", - "d62efbec2ca9c1f8bd66ce8b3f6a898cb3f7566ba6568c618ad1feb2b65b76c3ce1dd20f7395372faf28427f61c9278049cf0140df434f5633048c86b81e0399", - "7c8fdc6175439e2c3db15bafa7fb06143a6a23bc90f449e79deef73c3d492a671715c193b6fea9f036050b946069856b897e08c00768f5ee5ddcf70b7cd6d0e0", - "58602ee7468e6bc9df21bd51b23c005f72d6cb013f0a1b48cbec5eca299299f97f09f54a9a01483eaeb315a6478bad37ba47ca1347c7c8fc9e6695592c91d723", - "27f5b79ed256b050993d793496edf4807c1d85a7b0a67c9c4fa99860750b0ae66989670a8ffd7856d7ce411599e58c4d77b232a62bef64d15275be46a68235ff", - "3957a976b9f1887bf004a8dca942c92d2b37ea52600f25e0c9bc5707d0279c00c6e85a839b0d2d8eb59c51d94788ebe62474a791cadf52cccf20f5070b6573fc", - "eaa2376d55380bf772ecca9cb0aa4668c95c707162fa86d518c8ce0ca9bf7362b9f2a0adc3ff59922df921b94567e81e452f6c1a07fc817cebe99604b3505d38", - "c1e2c78b6b2734e2480ec550434cb5d613111adcc21d475545c3b1b7e6ff12444476e5c055132e2229dc0f807044bb919b1a5662dd38a9ee65e243a3911aed1a", - "8ab48713389dd0fcf9f965d3ce66b1e559a1f8c58741d67683cd971354f452e62d0207a65e436c5d5d8f8ee71c6abfe50e669004c302b31a7ea8311d4a916051", - "24ce0addaa4c65038bd1b1c0f1452a0b128777aabc94a29df2fd6c7e2f85f8ab9ac7eff516b0e0a825c84a24cfe492eaad0a6308e46dd42fe8333ab971bb30ca", - "5154f929ee03045b6b0c0004fa778edee1d139893267cc84825ad7b36c63de32798e4a166d24686561354f63b00709a1364b3c241de3febf0754045897467cd4", - "e74e907920fd87bd5ad636dd11085e50ee70459c443e1ce5809af2bc2eba39f9e6d7128e0e3712c316da06f4705d78a4838e28121d4344a2c79c5e0db307a677", - "bf91a22334bac20f3fd80663b3cd06c4e8802f30e6b59f90d3035cc9798a217ed5a31abbda7fa6842827bdf2a7a1c21f6fcfccbb54c6c52926f32da816269be1", - "d9d5c74be5121b0bd742f26bffb8c89f89171f3f934913492b0903c271bbe2b3395ef259669bef43b57f7fcc3027db01823f6baee66e4f9fead4d6726c741fce", - "50c8b8cf34cd879f80e2faab3230b0c0e1cc3e9dcadeb1b9d97ab923415dd9a1fe38addd5c11756c67990b256e95ad6d8f9fedce10bf1c90679cde0ecf1be347", - "0a386e7cd5dd9b77a035e09fe6fee2c8ce61b5383c87ea43205059c5e4cd4f4408319bb0a82360f6a58e6c9ce3f487c446063bf813bc6ba535e17fc1826cfc91", - "1f1459cb6b61cbac5f0efe8fc487538f42548987fcd56221cfa7beb22504769e792c45adfb1d6b3d60d7b749c8a75b0bdf14e8ea721b95dca538ca6e25711209", - "e58b3836b7d8fedbb50ca5725c6571e74c0785e97821dab8b6298c10e4c079d4a6cdf22f0fedb55032925c16748115f01a105e77e00cee3d07924dc0d8f90659", - "b929cc6505f020158672deda56d0db081a2ee34c00c1100029bdf8ea98034fa4bf3e8655ec697fe36f40553c5bb46801644a627d3342f4fc92b61f03290fb381", - "72d353994b49d3e03153929a1e4d4f188ee58ab9e72ee8e512f29bc773913819ce057ddd7002c0433ee0a16114e3d156dd2c4a7e80ee53378b8670f23e33ef56", - "c70ef9bfd775d408176737a0736d68517ce1aaad7e81a93c8c1ed967ea214f56c8a377b1763e676615b60f3988241eae6eab9685a5124929d28188f29eab06f7", - "c230f0802679cb33822ef8b3b21bf7a9a28942092901d7dac3760300831026cf354c9232df3e084d9903130c601f63c1f4a4a4b8106e468cd443bbe5a734f45f", - "6f43094cafb5ebf1f7a4937ec50f56a4c9da303cbb55ac1f27f1f1976cd96beda9464f0e7b9c54620b8a9fba983164b8be3578425a024f5fe199c36356b88972", - "3745273f4c38225db2337381871a0c6aafd3af9b018c88aa02025850a5dc3a42a1a3e03e56cbf1b0876d63a441f1d2856a39b8801eb5af325201c415d65e97fe", - "c50c44cca3ec3edaae779a7e179450ebdda2f97067c690aa6c5a4ac7c30139bb27c0df4db3220e63cb110d64f37ffe078db72653e2daacf93ae3f0a2d1a7eb2e", - "8aef263e385cbc61e19b28914243262af5afe8726af3ce39a79c27028cf3ecd3f8d2dfd9cfc9ad91b58f6f20778fd5f02894a3d91c7d57d1e4b866a7f364b6be", - "28696141de6e2d9bcb3235578a66166c1448d3e905a1b482d423be4bc5369bc8c74dae0acc9cc123e1d8ddce9f97917e8c019c552da32d39d2219b9abf0fa8c8", - "2fb9eb2085830181903a9dafe3db428ee15be7662224efd643371fb25646aee716e531eca69b2bdc8233f1a8081fa43da1500302975a77f42fa592136710e9dc", - "66f9a7143f7a3314a669bf2e24bbb35014261d639f495b6c9c1f104fe8e320aca60d4550d69d52edbd5a3cdeb4014ae65b1d87aa770b69ae5c15f4330b0b0ad8", - "f4c4dd1d594c3565e3e25ca43dad82f62abea4835ed4cd811bcd975e46279828d44d4c62c3679f1b7f7b9dd4571d7b49557347b8c5460cbdc1bef690fb2a08c0", - "8f1dc9649c3a84551f8f6e91cac68242a43b1f8f328ee92280257387fa7559aa6db12e4aeadc2d26099178749c6864b357f3f83b2fb3efa8d2a8db056bed6bcc", - "3139c1a7f97afd1675d460ebbc07f2728aa150df849624511ee04b743ba0a833092f18c12dc91b4dd243f333402f59fe28abdbbbae301e7b659c7a26d5c0f979", - "06f94a2996158a819fe34c40de3cf0379fd9fb85b3e363ba3926a0e7d960e3f4c2e0c70c7ce0ccb2a64fc29869f6e7ab12bd4d3f14fce943279027e785fb5c29", - "c29c399ef3eee8961e87565c1ce263925fc3d0ce267d13e48dd9e732ee67b0f69fad56401b0f10fcaac119201046cca28c5b14abdea3212ae65562f7f138db3d", - "4cec4c9df52eef05c3f6faaa9791bc7445937183224ecc37a1e58d0132d35617531d7e795f52af7b1eb9d147de1292d345fe341823f8e6bc1e5badca5c656108", - "898bfbae93b3e18d00697eab7d9704fa36ec339d076131cefdf30edbe8d9cc81c3a80b129659b163a323bab9793d4feed92d54dae966c77529764a09be88db45", - "ee9bd0469d3aaf4f14035be48a2c3b84d9b4b1fff1d945e1f1c1d38980a951be197b25fe22c731f20aeacc930ba9c4a1f4762227617ad350fdabb4e80273a0f4", - "3d4d3113300581cd96acbf091c3d0f3c310138cd6979e6026cde623e2dd1b24d4a8638bed1073344783ad0649cc6305ccec04beb49f31c633088a99b65130267", - "95c0591ad91f921ac7be6d9ce37e0663ed8011c1cfd6d0162a5572e94368bac02024485e6a39854aa46fe38e97d6c6b1947cd272d86b06bb5b2f78b9b68d559d", - "227b79ded368153bf46c0a3ca978bfdbef31f3024a5665842468490b0ff748ae04e7832ed4c9f49de9b1706709d623e5c8c15e3caecae8d5e433430ff72f20eb", - "5d34f3952f0105eef88ae8b64c6ce95ebfade0e02c69b08762a8712d2e4911ad3f941fc4034dc9b2e479fdbcd279b902faf5d838bb2e0c6495d372b5b7029813", - "7f939bf8353abce49e77f14f3750af20b7b03902e1a1e7fb6aaf76d0259cd401a83190f15640e74f3e6c5a90e839c7821f6474757f75c7bf9002084ddc7a62dc", - "062b61a2f9a33a71d7d0a06119644c70b0716a504de7e5e1be49bd7b86e7ed6817714f9f0fc313d06129597e9a2235ec8521de36f7290a90ccfc1ffa6d0aee29", - "f29e01eeae64311eb7f1c6422f946bf7bea36379523e7b2bbaba7d1d34a22d5ea5f1c5a09d5ce1fe682cced9a4798d1a05b46cd72dff5c1b355440b2a2d476bc", - "ec38cd3bbab3ef35d7cb6d5c914298351d8a9dc97fcee051a8a02f58e3ed6184d0b7810a5615411ab1b95209c3c810114fdeb22452084e77f3f847c6dbaafe16", - "c2aef5e0ca43e82641565b8cb943aa8ba53550caef793b6532fafad94b816082f0113a3ea2f63608ab40437ecc0f0229cb8fa224dcf1c478a67d9b64162b92d1", - "15f534efff7105cd1c254d074e27d5898b89313b7d366dc2d7d87113fa7d53aae13f6dba487ad8103d5e854c91fdb6e1e74b2ef6d1431769c30767dde067a35c", - "89acbca0b169897a0a2714c2df8c95b5b79cb69390142b7d6018bb3e3076b099b79a964152a9d912b1b86412b7e372e9cecad7f25d4cbab8a317be36492a67d7", - "e3c0739190ed849c9c962fd9dbb55e207e624fcac1eb417691515499eea8d8267b7e8f1287a63633af5011fde8c4ddf55bfdf722edf88831414f2cfaed59cb9a", - "8d6cf87c08380d2d1506eee46fd4222d21d8c04e585fbfd08269c98f702833a156326a0724656400ee09351d57b440175e2a5de93cc5f80db6daf83576cf75fa", - "da24bede383666d563eeed37f6319baf20d5c75d1635a6ba5ef4cfa1ac95487e96f8c08af600aab87c986ebad49fc70a58b4890b9c876e091016daf49e1d322e", - "f9d1d1b1e87ea7ae753a029750cc1cf3d0157d41805e245c5617bb934e732f0ae3180b78e05bfe76c7c3051e3e3ac78b9b50c05142657e1e03215d6ec7bfd0fc", - "11b7bc1668032048aa43343de476395e814bbbc223678db951a1b03a021efac948cfbe215f97fe9a72a2f6bc039e3956bfa417c1a9f10d6d7ba5d3d32ff323e5", - "b8d9000e4fc2b066edb91afee8e7eb0f24e3a201db8b6793c0608581e628ed0bcc4e5aa6787992a4bcc44e288093e63ee83abd0bc3ec6d0934a674a4da13838a", - "ce325e294f9b6719d6b61278276ae06a2564c03bb0b783fafe785bdf89c7d5acd83e78756d301b445699024eaeb77b54d477336ec2a4f332f2b3f88765ddb0c3", - "29acc30e9603ae2fccf90bf97e6cc463ebe28c1b2f9b4b765e70537c25c702a29dcbfbf14c99c54345ba2b51f17b77b5f15db92bbad8fa95c471f5d070a137cc", - "3379cbaae562a87b4c0425550ffdd6bfe1203f0d666cc7ea095be407a5dfe61ee91441cd5154b3e53b4f5fb31ad4c7a9ad5c7af4ae679aa51a54003a54ca6b2d", - "3095a349d245708c7cf550118703d7302c27b60af5d4e67fc978f8a4e60953c7a04f92fcf41aee64321ccb707a895851552b1e37b00bc5e6b72fa5bcef9e3fff", - "07262d738b09321f4dbccec4bb26f48cb0f0ed246ce0b31b9a6e7bc683049f1f3e5545f28ce932dd985c5ab0f43bd6de0770560af329065ed2e49d34624c2cbb", - "b6405eca8ee3316c87061cc6ec18dba53e6c250c63ba1f3bae9e55dd3498036af08cd272aa24d713c6020d77ab2f3919af1a32f307420618ab97e73953994fb4", - "7ee682f63148ee45f6e5315da81e5c6e557c2c34641fc509c7a5701088c38a74756168e2cd8d351e88fd1a451f360a01f5b2580f9b5a2e8cfc138f3dd59a3ffc", - "1d263c179d6b268f6fa016f3a4f29e943891125ed8593c81256059f5a7b44af2dcb2030d175c00e62ecaf7ee96682aa07ab20a611024a28532b1c25b86657902", - "106d132cbdb4cd2597812846e2bc1bf732fec5f0a5f65dbb39ec4e6dc64ab2ce6d24630d0f15a805c3540025d84afa98e36703c3dbee713e72dde8465bc1be7e", - "0e79968226650667a8d862ea8da4891af56a4e3a8b6d1750e394f0dea76d640d85077bcec2cc86886e506751b4f6a5838f7f0b5fef765d9dc90dcdcbaf079f08", - "521156a82ab0c4e566e5844d5e31ad9aaf144bbd5a464fdca34dbd5717e8ff711d3ffebbfa085d67fe996a34f6d3e4e60b1396bf4b1610c263bdbb834d560816", - "1aba88befc55bc25efbce02db8b9933e46f57661baeabeb21cc2574d2a518a3cba5dc5a38e49713440b25f9c744e75f6b85c9d8f4681f676160f6105357b8406", - "5a9949fcb2c473cda968ac1b5d08566dc2d816d960f57e63b898fa701cf8ebd3f59b124d95bfbbedc5f1cf0e17d5eaed0c02c50b69d8a402cabcca4433b51fd4", - "b0cead09807c672af2eb2b0f06dde46cf5370e15a4096b1a7d7cbb36ec31c205fbefca00b7a4162fa89fb4fb3eb78d79770c23f44e7206664ce3cd931c291e5d", - "bb6664931ec97044e45b2ae420ae1c551a8874bc937d08e969399c3964ebdba8346cdd5d09caafe4c28ba7ec788191ceca65ddd6f95f18583e040d0f30d0364d", - "65bc770a5faa3792369803683e844b0be7ee96f29f6d6a35568006bd5590f9a4ef639b7a8061c7b0424b66b60ac34af3119905f33a9d8c3ae18382ca9b689900", - "ea9b4dca333336aaf839a45c6eaa48b8cb4c7ddabffea4f643d6357ea6628a480a5b45f2b052c1b07d1fedca918b6f1139d80f74c24510dcbaa4be70eacc1b06", - "e6342fb4a780ad975d0e24bce149989b91d360557e87994f6b457b895575cc02d0c15bad3ce7577f4c63927ff13f3e381ff7e72bdbe745324844a9d27e3f1c01", - "3e209c9b33e8e461178ab46b1c64b49a07fb745f1c8bc95fbfb94c6b87c69516651b264ef980937fad41238b91ddc011a5dd777c7efd4494b4b6ecd3a9c22ac0", - "fd6a3d5b1875d80486d6e69694a56dbb04a99a4d051f15db2689776ba1c4882e6d462a603b7015dc9f4b7450f05394303b8652cfb404a266962c41bae6e18a94", - "951e27517e6bad9e4195fc8671dee3e7e9be69cee1422cb9fecfce0dba875f7b310b93ee3a3d558f941f635f668ff832d2c1d033c5e2f0997e4c66f147344e02", - "8eba2f874f1ae84041903c7c4253c82292530fc8509550bfdc34c95c7e2889d5650b0ad8cb988e5c4894cb87fbfbb19612ea93ccc4c5cad17158b9763464b492", - "16f712eaa1b7c6354719a8e7dbdfaf55e4063a4d277d947550019b38dfb564830911057d50506136e2394c3b28945cc964967d54e3000c2181626cfb9b73efd2", - "c39639e7d5c7fb8cdd0fd3e6a52096039437122f21c78f1679cea9d78a734c56ecbeb28654b4f18e342c331f6f7229ec4b4bc281b2d80a6eb50043f31796c88c", - "72d081af99f8a173dcc9a0ac4eb3557405639a29084b54a40172912a2f8a395129d5536f0918e902f9e8fa6000995f4168ddc5f893011be6a0dbc9b8a1a3f5bb", - "c11aa81e5efd24d5fc27ee586cfd8847fbb0e27601ccece5ecca0198e3c7765393bb74457c7e7a27eb9170350e1fb53857177506be3e762cc0f14d8c3afe9077", - "c28f2150b452e6c0c424bcde6f8d72007f9310fed7f2f87de0dbb64f4479d6c1441ba66f44b2accee61609177ed340128b407ecec7c64bbe50d63d22d8627727", - "f63d88122877ec30b8c8b00d22e89000a966426112bd44166e2f525b769ccbe9b286d437a0129130dde1a86c43e04bedb594e671d98283afe64ce331de9828fd", - "348b0532880b88a6614a8d7408c3f913357fbb60e995c60205be9139e74998aede7f4581e42f6b52698f7fa1219708c14498067fd1e09502de83a77dd281150c", - "5133dc8bef725359dff59792d85eaf75b7e1dcd1978b01c35b1b85fcebc63388ad99a17b6346a217dc1a9622ebd122ecf6913c4d31a6b52a695b86af00d741a0", - "2753c4c0e98ecad806e88780ec27fccd0f5c1ab547f9e4bf1659d192c23aa2cc971b58b6802580baef8adc3b776ef7086b2545c2987f348ee3719cdef258c403", - "b1663573ce4b9d8caefc865012f3e39714b9898a5da6ce17c25a6a47931a9ddb9bbe98adaa553beed436e89578455416c2a52a525cf2862b8d1d49a2531b7391", - "64f58bd6bfc856f5e873b2a2956ea0eda0d6db0da39c8c7fc67c9f9feefcff3072cdf9e6ea37f69a44f0c61aa0da3693c2db5b54960c0281a088151db42b11e8", - "0764c7be28125d9065c4b98a69d60aede703547c66a12e17e1c618994132f5ef82482c1e3fe3146cc65376cc109f0138ed9a80e49f1f3c7d610d2f2432f20605", - "f748784398a2ff03ebeb07e155e66116a839741a336e32da71ec696001f0ad1b25cd48c69cfca7265eca1dd71904a0ce748ac4124f3571076dfa7116a9cf00e9", - "3f0dbc0186bceb6b785ba78d2a2a013c910be157bdaffae81bb6663b1a73722f7f1228795f3ecada87cf6ef0078474af73f31eca0cc200ed975b6893f761cb6d", - "d4762cd4599876ca75b2b8fe249944dbd27ace741fdab93616cbc6e425460feb51d4e7adcc38180e7fc47c89024a7f56191adb878dfde4ead62223f5a2610efe", - "cd36b3d5b4c91b90fcbba79513cfee1907d8645a162afd0cd4cf4192d4a5f4c892183a8eacdb2b6b6a9d9aa8c11ac1b261b380dbee24ca468f1bfd043c58eefe", - "98593452281661a53c48a9d8cd790826c1a1ce567738053d0bee4a91a3d5bd92eefdbabebe3204f2031ca5f781bda99ef5d8ae56e5b04a9e1ecd21b0eb05d3e1", - "771f57dd2775ccdab55921d3e8e30ccf484d61fe1c1b9c2ae819d0fb2a12fab9be70c4a7a138da84e8280435daade5bbe66af0836a154f817fb17f3397e725a3", - "c60897c6f828e21f16fbb5f15b323f87b6c8955eabf1d38061f707f608abdd993fac3070633e286cf8339ce295dd352df4b4b40b2f29da1dd50b3a05d079e6bb", - "8210cd2c2d3b135c2cf07fa0d1433cd771f325d075c6469d9c7f1ba0943cd4ab09808cabf4acb9ce5bb88b498929b4b847f681ad2c490d042db2aec94214b06b", - "1d4edfffd8fd80f7e4107840fa3aa31e32598491e4af7013c197a65b7f36dd3ac4b478456111cd4309d9243510782fa31b7c4c95fa951520d020eb7e5c36e4ef", - "af8e6e91fab46ce4873e1a50a8ef448cc29121f7f74deef34a71ef89cc00d9274bc6c2454bbb3230d8b2ec94c62b1dec85f3593bfa30ea6f7a44d7c09465a253", - "29fd384ed4906f2d13aa9fe7af905990938bed807f1832454a372ab412eea1f5625a1fcc9ac8343b7c67c5aba6e0b1cc4644654913692c6b39eb9187ceacd3ec", - "a268c7885d9874a51c44dffed8ea53e94f78456e0b2ed99ff5a3924760813826d960a15edbedbb5de5226ba4b074e71b05c55b9756bb79e55c02754c2c7b6c8a", - "0cf8545488d56a86817cd7ecb10f7116b7ea530a45b6ea497b6c72c997e09e3d0da8698f46bb006fc977c2cd3d1177463ac9057fdd1662c85d0c126443c10473", - "b39614268fdd8781515e2cfebf89b4d5402bab10c226e6344e6b9ae000fb0d6c79cb2f3ec80e80eaeb1980d2f8698916bd2e9f747236655116649cd3ca23a837", - "74bef092fc6f1e5dba3663a3fb003b2a5ba257496536d99f62b9d73f8f9eb3ce9ff3eec709eb883655ec9eb896b9128f2afc89cf7d1ab58a72f4a3bf034d2b4a", - "3a988d38d75611f3ef38b8774980b33e573b6c57bee0469ba5eed9b44f29945e7347967fba2c162e1c3be7f310f2f75ee2381e7bfd6b3f0baea8d95dfb1dafb1", - "58aedfce6f67ddc85a28c992f1c0bd0969f041e66f1ee88020a125cbfcfebcd61709c9c4eba192c15e69f020d462486019fa8dea0cd7a42921a19d2fe546d43d", - "9347bd291473e6b4e368437b8e561e065f649a6d8ada479ad09b1999a8f26b91cf6120fd3bfe014e83f23acfa4c0ad7b3712b2c3c0733270663112ccd9285cd9", - "b32163e7c5dbb5f51fdc11d2eac875efbbcb7e7699090a7e7ff8a8d50795af5d74d9ff98543ef8cdf89ac13d0485278756e0ef00c817745661e1d59fe38e7537", - "1085d78307b1c4b008c57a2e7e5b234658a0a82e4ff1e4aaac72b312fda0fe27d233bc5b10e9cc17fdc7697b540c7d95eb215a19a1a0e20e1abfa126efd568c7", - "4e5c734c7dde011d83eac2b7347b373594f92d7091b9ca34cb9c6f39bdf5a8d2f134379e16d822f6522170ccf2ddd55c84b9e6c64fc927ac4cf8dfb2a17701f2", - "695d83bd990a1117b3d0ce06cc888027d12a054c2677fd82f0d4fbfc93575523e7991a5e35a3752e9b70ce62992e268a877744cdd435f5f130869c9a2074b338", - "a6213743568e3b3158b9184301f3690847554c68457cb40fc9a4b8cfd8d4a118c301a07737aeda0f929c68913c5f51c80394f53bff1c3e83b2e40ca97eba9e15", - "d444bfa2362a96df213d070e33fa841f51334e4e76866b8139e8af3bb3398be2dfaddcbc56b9146de9f68118dc5829e74b0c28d7711907b121f9161cb92b69a9", - "142709d62e28fcccd0af97fad0f8465b971e82201dc51070faa0372aa43e92484be1c1e73ba10906d5d1853db6a4106e0a7bf9800d373d6dee2d46d62ef2a461", -} diff --git a/vendor/golang.org/x/crypto/blake2b/register.go b/vendor/golang.org/x/crypto/blake2b/register.go deleted file mode 100644 index efd689af4..000000000 --- a/vendor/golang.org/x/crypto/blake2b/register.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build go1.9 - -package blake2b - -import ( - "crypto" - "hash" -) - -func init() { - newHash256 := func() hash.Hash { - h, _ := New256(nil) - return h - } - newHash384 := func() hash.Hash { - h, _ := New384(nil) - return h - } - - newHash512 := func() hash.Hash { - h, _ := New512(nil) - return h - } - - crypto.RegisterHash(crypto.BLAKE2b_256, newHash256) - crypto.RegisterHash(crypto.BLAKE2b_384, newHash384) - crypto.RegisterHash(crypto.BLAKE2b_512, newHash512) -} diff --git a/vendor/golang.org/x/crypto/blake2s/blake2s.go b/vendor/golang.org/x/crypto/blake2s/blake2s.go deleted file mode 100644 index 7e3fc4fd8..000000000 --- a/vendor/golang.org/x/crypto/blake2s/blake2s.go +++ /dev/null @@ -1,160 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package blake2s implements the BLAKE2s hash algorithm as -// defined in RFC 7693. -package blake2s // import "golang.org/x/crypto/blake2s" - -import ( - "encoding/binary" - "errors" - "hash" -) - -const ( - // The blocksize of BLAKE2s in bytes. - BlockSize = 64 - // The hash size of BLAKE2s-256 in bytes. - Size = 32 -) - -var errKeySize = errors.New("blake2s: invalid key size") - -var iv = [8]uint32{ - 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, - 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19, -} - -// Sum256 returns the BLAKE2s-256 checksum of the data. -func Sum256(data []byte) [Size]byte { - var sum [Size]byte - checkSum(&sum, Size, data) - return sum -} - -// New256 returns a new hash.Hash computing the BLAKE2s-256 checksum. A non-nil -// key turns the hash into a MAC. The key must between zero and 32 bytes long. -func New256(key []byte) (hash.Hash, error) { return newDigest(Size, key) } - -func newDigest(hashSize int, key []byte) (*digest, error) { - if len(key) > Size { - return nil, errKeySize - } - d := &digest{ - size: hashSize, - keyLen: len(key), - } - copy(d.key[:], key) - d.Reset() - return d, nil -} - -func checkSum(sum *[Size]byte, hashSize int, data []byte) { - var ( - h [8]uint32 - c [2]uint32 - ) - - h = iv - h[0] ^= uint32(hashSize) | (1 << 16) | (1 << 24) - - if length := len(data); length > BlockSize { - n := length &^ (BlockSize - 1) - if length == n { - n -= BlockSize - } - hashBlocks(&h, &c, 0, data[:n]) - data = data[n:] - } - - var block [BlockSize]byte - offset := copy(block[:], data) - remaining := uint32(BlockSize - offset) - - if c[0] < remaining { - c[1]-- - } - c[0] -= remaining - - hashBlocks(&h, &c, 0xFFFFFFFF, block[:]) - - for i, v := range h { - binary.LittleEndian.PutUint32(sum[4*i:], v) - } -} - -type digest struct { - h [8]uint32 - c [2]uint32 - size int - block [BlockSize]byte - offset int - - key [BlockSize]byte - keyLen int -} - -func (d *digest) BlockSize() int { return BlockSize } - -func (d *digest) Size() int { return d.size } - -func (d *digest) Reset() { - d.h = iv - d.h[0] ^= uint32(d.size) | (uint32(d.keyLen) << 8) | (1 << 16) | (1 << 24) - d.offset, d.c[0], d.c[1] = 0, 0, 0 - if d.keyLen > 0 { - d.block = d.key - d.offset = BlockSize - } -} - -func (d *digest) Write(p []byte) (n int, err error) { - n = len(p) - - if d.offset > 0 { - remaining := BlockSize - d.offset - if n <= remaining { - d.offset += copy(d.block[d.offset:], p) - return - } - copy(d.block[d.offset:], p[:remaining]) - hashBlocks(&d.h, &d.c, 0, d.block[:]) - d.offset = 0 - p = p[remaining:] - } - - if length := len(p); length > BlockSize { - nn := length &^ (BlockSize - 1) - if length == nn { - nn -= BlockSize - } - hashBlocks(&d.h, &d.c, 0, p[:nn]) - p = p[nn:] - } - - d.offset += copy(d.block[:], p) - return -} - -func (d *digest) Sum(b []byte) []byte { - var block [BlockSize]byte - h := d.h - c := d.c - - copy(block[:], d.block[:d.offset]) - remaining := uint32(BlockSize - d.offset) - if c[0] < remaining { - c[1]-- - } - c[0] -= remaining - - hashBlocks(&h, &c, 0xFFFFFFFF, block[:]) - - var sum [Size]byte - for i, v := range h { - binary.LittleEndian.PutUint32(sum[4*i:], v) - } - - return append(b, sum[:d.size]...) -} diff --git a/vendor/golang.org/x/crypto/blake2s/blake2s_386.go b/vendor/golang.org/x/crypto/blake2s/blake2s_386.go deleted file mode 100644 index 857508030..000000000 --- a/vendor/golang.org/x/crypto/blake2s/blake2s_386.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build 386,!gccgo,!appengine - -package blake2s - -var ( - useSSE4 = false - useSSSE3 = supportSSSE3() - useSSE2 = supportSSE2() - useGeneric = true -) - -//go:noescape -func supportSSE2() bool - -//go:noescape -func supportSSSE3() bool - -//go:noescape -func hashBlocksSSE2(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) - -//go:noescape -func hashBlocksSSSE3(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) - -func hashBlocks(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) { - if useSSSE3 { - hashBlocksSSSE3(h, c, flag, blocks) - } else if useSSE2 { - hashBlocksSSE2(h, c, flag, blocks) - } else { - hashBlocksGeneric(h, c, flag, blocks) - } -} diff --git a/vendor/golang.org/x/crypto/blake2s/blake2s_386.s b/vendor/golang.org/x/crypto/blake2s/blake2s_386.s deleted file mode 100644 index 0bb65c70f..000000000 --- a/vendor/golang.org/x/crypto/blake2s/blake2s_386.s +++ /dev/null @@ -1,460 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build 386,!gccgo,!appengine - -#include "textflag.h" - -DATA iv0<>+0x00(SB)/4, $0x6a09e667 -DATA iv0<>+0x04(SB)/4, $0xbb67ae85 -DATA iv0<>+0x08(SB)/4, $0x3c6ef372 -DATA iv0<>+0x0c(SB)/4, $0xa54ff53a -GLOBL iv0<>(SB), (NOPTR+RODATA), $16 - -DATA iv1<>+0x00(SB)/4, $0x510e527f -DATA iv1<>+0x04(SB)/4, $0x9b05688c -DATA iv1<>+0x08(SB)/4, $0x1f83d9ab -DATA iv1<>+0x0c(SB)/4, $0x5be0cd19 -GLOBL iv1<>(SB), (NOPTR+RODATA), $16 - -DATA rol16<>+0x00(SB)/8, $0x0504070601000302 -DATA rol16<>+0x08(SB)/8, $0x0D0C0F0E09080B0A -GLOBL rol16<>(SB), (NOPTR+RODATA), $16 - -DATA rol8<>+0x00(SB)/8, $0x0407060500030201 -DATA rol8<>+0x08(SB)/8, $0x0C0F0E0D080B0A09 -GLOBL rol8<>(SB), (NOPTR+RODATA), $16 - -DATA counter<>+0x00(SB)/8, $0x40 -DATA counter<>+0x08(SB)/8, $0x0 -GLOBL counter<>(SB), (NOPTR+RODATA), $16 - -#define ROTL_SSE2(n, t, v) \ - MOVO v, t; \ - PSLLL $n, t; \ - PSRLL $(32-n), v; \ - PXOR t, v - -#define ROTL_SSSE3(c, v) \ - PSHUFB c, v - -#define ROUND_SSE2(v0, v1, v2, v3, m0, m1, m2, m3, t) \ - PADDL m0, v0; \ - PADDL v1, v0; \ - PXOR v0, v3; \ - ROTL_SSE2(16, t, v3); \ - PADDL v3, v2; \ - PXOR v2, v1; \ - ROTL_SSE2(20, t, v1); \ - PADDL m1, v0; \ - PADDL v1, v0; \ - PXOR v0, v3; \ - ROTL_SSE2(24, t, v3); \ - PADDL v3, v2; \ - PXOR v2, v1; \ - ROTL_SSE2(25, t, v1); \ - PSHUFL $0x39, v1, v1; \ - PSHUFL $0x4E, v2, v2; \ - PSHUFL $0x93, v3, v3; \ - PADDL m2, v0; \ - PADDL v1, v0; \ - PXOR v0, v3; \ - ROTL_SSE2(16, t, v3); \ - PADDL v3, v2; \ - PXOR v2, v1; \ - ROTL_SSE2(20, t, v1); \ - PADDL m3, v0; \ - PADDL v1, v0; \ - PXOR v0, v3; \ - ROTL_SSE2(24, t, v3); \ - PADDL v3, v2; \ - PXOR v2, v1; \ - ROTL_SSE2(25, t, v1); \ - PSHUFL $0x39, v3, v3; \ - PSHUFL $0x4E, v2, v2; \ - PSHUFL $0x93, v1, v1 - -#define ROUND_SSSE3(v0, v1, v2, v3, m0, m1, m2, m3, t, c16, c8) \ - PADDL m0, v0; \ - PADDL v1, v0; \ - PXOR v0, v3; \ - ROTL_SSSE3(c16, v3); \ - PADDL v3, v2; \ - PXOR v2, v1; \ - ROTL_SSE2(20, t, v1); \ - PADDL m1, v0; \ - PADDL v1, v0; \ - PXOR v0, v3; \ - ROTL_SSSE3(c8, v3); \ - PADDL v3, v2; \ - PXOR v2, v1; \ - ROTL_SSE2(25, t, v1); \ - PSHUFL $0x39, v1, v1; \ - PSHUFL $0x4E, v2, v2; \ - PSHUFL $0x93, v3, v3; \ - PADDL m2, v0; \ - PADDL v1, v0; \ - PXOR v0, v3; \ - ROTL_SSSE3(c16, v3); \ - PADDL v3, v2; \ - PXOR v2, v1; \ - ROTL_SSE2(20, t, v1); \ - PADDL m3, v0; \ - PADDL v1, v0; \ - PXOR v0, v3; \ - ROTL_SSSE3(c8, v3); \ - PADDL v3, v2; \ - PXOR v2, v1; \ - ROTL_SSE2(25, t, v1); \ - PSHUFL $0x39, v3, v3; \ - PSHUFL $0x4E, v2, v2; \ - PSHUFL $0x93, v1, v1 - -#define PRECOMPUTE(dst, off, src, t) \ - MOVL 0*4(src), t; \ - MOVL t, 0*4+off+0(dst); \ - MOVL t, 9*4+off+64(dst); \ - MOVL t, 5*4+off+128(dst); \ - MOVL t, 14*4+off+192(dst); \ - MOVL t, 4*4+off+256(dst); \ - MOVL t, 2*4+off+320(dst); \ - MOVL t, 8*4+off+384(dst); \ - MOVL t, 12*4+off+448(dst); \ - MOVL t, 3*4+off+512(dst); \ - MOVL t, 15*4+off+576(dst); \ - MOVL 1*4(src), t; \ - MOVL t, 4*4+off+0(dst); \ - MOVL t, 8*4+off+64(dst); \ - MOVL t, 14*4+off+128(dst); \ - MOVL t, 5*4+off+192(dst); \ - MOVL t, 12*4+off+256(dst); \ - MOVL t, 11*4+off+320(dst); \ - MOVL t, 1*4+off+384(dst); \ - MOVL t, 6*4+off+448(dst); \ - MOVL t, 10*4+off+512(dst); \ - MOVL t, 3*4+off+576(dst); \ - MOVL 2*4(src), t; \ - MOVL t, 1*4+off+0(dst); \ - MOVL t, 13*4+off+64(dst); \ - MOVL t, 6*4+off+128(dst); \ - MOVL t, 8*4+off+192(dst); \ - MOVL t, 2*4+off+256(dst); \ - MOVL t, 0*4+off+320(dst); \ - MOVL t, 14*4+off+384(dst); \ - MOVL t, 11*4+off+448(dst); \ - MOVL t, 12*4+off+512(dst); \ - MOVL t, 4*4+off+576(dst); \ - MOVL 3*4(src), t; \ - MOVL t, 5*4+off+0(dst); \ - MOVL t, 15*4+off+64(dst); \ - MOVL t, 9*4+off+128(dst); \ - MOVL t, 1*4+off+192(dst); \ - MOVL t, 11*4+off+256(dst); \ - MOVL t, 7*4+off+320(dst); \ - MOVL t, 13*4+off+384(dst); \ - MOVL t, 3*4+off+448(dst); \ - MOVL t, 6*4+off+512(dst); \ - MOVL t, 10*4+off+576(dst); \ - MOVL 4*4(src), t; \ - MOVL t, 2*4+off+0(dst); \ - MOVL t, 1*4+off+64(dst); \ - MOVL t, 15*4+off+128(dst); \ - MOVL t, 10*4+off+192(dst); \ - MOVL t, 6*4+off+256(dst); \ - MOVL t, 8*4+off+320(dst); \ - MOVL t, 3*4+off+384(dst); \ - MOVL t, 13*4+off+448(dst); \ - MOVL t, 14*4+off+512(dst); \ - MOVL t, 5*4+off+576(dst); \ - MOVL 5*4(src), t; \ - MOVL t, 6*4+off+0(dst); \ - MOVL t, 11*4+off+64(dst); \ - MOVL t, 2*4+off+128(dst); \ - MOVL t, 9*4+off+192(dst); \ - MOVL t, 1*4+off+256(dst); \ - MOVL t, 13*4+off+320(dst); \ - MOVL t, 4*4+off+384(dst); \ - MOVL t, 8*4+off+448(dst); \ - MOVL t, 15*4+off+512(dst); \ - MOVL t, 7*4+off+576(dst); \ - MOVL 6*4(src), t; \ - MOVL t, 3*4+off+0(dst); \ - MOVL t, 7*4+off+64(dst); \ - MOVL t, 13*4+off+128(dst); \ - MOVL t, 12*4+off+192(dst); \ - MOVL t, 10*4+off+256(dst); \ - MOVL t, 1*4+off+320(dst); \ - MOVL t, 9*4+off+384(dst); \ - MOVL t, 14*4+off+448(dst); \ - MOVL t, 0*4+off+512(dst); \ - MOVL t, 6*4+off+576(dst); \ - MOVL 7*4(src), t; \ - MOVL t, 7*4+off+0(dst); \ - MOVL t, 14*4+off+64(dst); \ - MOVL t, 10*4+off+128(dst); \ - MOVL t, 0*4+off+192(dst); \ - MOVL t, 5*4+off+256(dst); \ - MOVL t, 9*4+off+320(dst); \ - MOVL t, 12*4+off+384(dst); \ - MOVL t, 1*4+off+448(dst); \ - MOVL t, 13*4+off+512(dst); \ - MOVL t, 2*4+off+576(dst); \ - MOVL 8*4(src), t; \ - MOVL t, 8*4+off+0(dst); \ - MOVL t, 5*4+off+64(dst); \ - MOVL t, 4*4+off+128(dst); \ - MOVL t, 15*4+off+192(dst); \ - MOVL t, 14*4+off+256(dst); \ - MOVL t, 3*4+off+320(dst); \ - MOVL t, 11*4+off+384(dst); \ - MOVL t, 10*4+off+448(dst); \ - MOVL t, 7*4+off+512(dst); \ - MOVL t, 1*4+off+576(dst); \ - MOVL 9*4(src), t; \ - MOVL t, 12*4+off+0(dst); \ - MOVL t, 2*4+off+64(dst); \ - MOVL t, 11*4+off+128(dst); \ - MOVL t, 4*4+off+192(dst); \ - MOVL t, 0*4+off+256(dst); \ - MOVL t, 15*4+off+320(dst); \ - MOVL t, 10*4+off+384(dst); \ - MOVL t, 7*4+off+448(dst); \ - MOVL t, 5*4+off+512(dst); \ - MOVL t, 9*4+off+576(dst); \ - MOVL 10*4(src), t; \ - MOVL t, 9*4+off+0(dst); \ - MOVL t, 4*4+off+64(dst); \ - MOVL t, 8*4+off+128(dst); \ - MOVL t, 13*4+off+192(dst); \ - MOVL t, 3*4+off+256(dst); \ - MOVL t, 5*4+off+320(dst); \ - MOVL t, 7*4+off+384(dst); \ - MOVL t, 15*4+off+448(dst); \ - MOVL t, 11*4+off+512(dst); \ - MOVL t, 0*4+off+576(dst); \ - MOVL 11*4(src), t; \ - MOVL t, 13*4+off+0(dst); \ - MOVL t, 10*4+off+64(dst); \ - MOVL t, 0*4+off+128(dst); \ - MOVL t, 3*4+off+192(dst); \ - MOVL t, 9*4+off+256(dst); \ - MOVL t, 6*4+off+320(dst); \ - MOVL t, 15*4+off+384(dst); \ - MOVL t, 4*4+off+448(dst); \ - MOVL t, 2*4+off+512(dst); \ - MOVL t, 12*4+off+576(dst); \ - MOVL 12*4(src), t; \ - MOVL t, 10*4+off+0(dst); \ - MOVL t, 12*4+off+64(dst); \ - MOVL t, 1*4+off+128(dst); \ - MOVL t, 6*4+off+192(dst); \ - MOVL t, 13*4+off+256(dst); \ - MOVL t, 4*4+off+320(dst); \ - MOVL t, 0*4+off+384(dst); \ - MOVL t, 2*4+off+448(dst); \ - MOVL t, 8*4+off+512(dst); \ - MOVL t, 14*4+off+576(dst); \ - MOVL 13*4(src), t; \ - MOVL t, 14*4+off+0(dst); \ - MOVL t, 3*4+off+64(dst); \ - MOVL t, 7*4+off+128(dst); \ - MOVL t, 2*4+off+192(dst); \ - MOVL t, 15*4+off+256(dst); \ - MOVL t, 12*4+off+320(dst); \ - MOVL t, 6*4+off+384(dst); \ - MOVL t, 0*4+off+448(dst); \ - MOVL t, 9*4+off+512(dst); \ - MOVL t, 11*4+off+576(dst); \ - MOVL 14*4(src), t; \ - MOVL t, 11*4+off+0(dst); \ - MOVL t, 0*4+off+64(dst); \ - MOVL t, 12*4+off+128(dst); \ - MOVL t, 7*4+off+192(dst); \ - MOVL t, 8*4+off+256(dst); \ - MOVL t, 14*4+off+320(dst); \ - MOVL t, 2*4+off+384(dst); \ - MOVL t, 5*4+off+448(dst); \ - MOVL t, 1*4+off+512(dst); \ - MOVL t, 13*4+off+576(dst); \ - MOVL 15*4(src), t; \ - MOVL t, 15*4+off+0(dst); \ - MOVL t, 6*4+off+64(dst); \ - MOVL t, 3*4+off+128(dst); \ - MOVL t, 11*4+off+192(dst); \ - MOVL t, 7*4+off+256(dst); \ - MOVL t, 10*4+off+320(dst); \ - MOVL t, 5*4+off+384(dst); \ - MOVL t, 9*4+off+448(dst); \ - MOVL t, 4*4+off+512(dst); \ - MOVL t, 8*4+off+576(dst) - -// func hashBlocksSSE2(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) -TEXT ·hashBlocksSSE2(SB), 0, $672-24 // frame = 656 + 16 byte alignment - MOVL h+0(FP), AX - MOVL c+4(FP), BX - MOVL flag+8(FP), CX - MOVL blocks_base+12(FP), SI - MOVL blocks_len+16(FP), DX - - MOVL SP, BP - MOVL SP, DI - ADDL $15, DI - ANDL $~15, DI - MOVL DI, SP - - MOVL CX, 8(SP) - MOVL 0(BX), CX - MOVL CX, 0(SP) - MOVL 4(BX), CX - MOVL CX, 4(SP) - XORL CX, CX - MOVL CX, 12(SP) - - MOVOU 0(AX), X0 - MOVOU 16(AX), X1 - MOVOU counter<>(SB), X2 - -loop: - MOVO X0, X4 - MOVO X1, X5 - MOVOU iv0<>(SB), X6 - MOVOU iv1<>(SB), X7 - - MOVO 0(SP), X3 - PADDQ X2, X3 - PXOR X3, X7 - MOVO X3, 0(SP) - - PRECOMPUTE(SP, 16, SI, CX) - ROUND_SSE2(X4, X5, X6, X7, 16(SP), 32(SP), 48(SP), 64(SP), X3) - ROUND_SSE2(X4, X5, X6, X7, 16+64(SP), 32+64(SP), 48+64(SP), 64+64(SP), X3) - ROUND_SSE2(X4, X5, X6, X7, 16+128(SP), 32+128(SP), 48+128(SP), 64+128(SP), X3) - ROUND_SSE2(X4, X5, X6, X7, 16+192(SP), 32+192(SP), 48+192(SP), 64+192(SP), X3) - ROUND_SSE2(X4, X5, X6, X7, 16+256(SP), 32+256(SP), 48+256(SP), 64+256(SP), X3) - ROUND_SSE2(X4, X5, X6, X7, 16+320(SP), 32+320(SP), 48+320(SP), 64+320(SP), X3) - ROUND_SSE2(X4, X5, X6, X7, 16+384(SP), 32+384(SP), 48+384(SP), 64+384(SP), X3) - ROUND_SSE2(X4, X5, X6, X7, 16+448(SP), 32+448(SP), 48+448(SP), 64+448(SP), X3) - ROUND_SSE2(X4, X5, X6, X7, 16+512(SP), 32+512(SP), 48+512(SP), 64+512(SP), X3) - ROUND_SSE2(X4, X5, X6, X7, 16+576(SP), 32+576(SP), 48+576(SP), 64+576(SP), X3) - - PXOR X4, X0 - PXOR X5, X1 - PXOR X6, X0 - PXOR X7, X1 - - LEAL 64(SI), SI - SUBL $64, DX - JNE loop - - MOVL 0(SP), CX - MOVL CX, 0(BX) - MOVL 4(SP), CX - MOVL CX, 4(BX) - - MOVOU X0, 0(AX) - MOVOU X1, 16(AX) - - MOVL BP, SP - RET - -// func hashBlocksSSSE3(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) -TEXT ·hashBlocksSSSE3(SB), 0, $704-24 // frame = 688 + 16 byte alignment - MOVL h+0(FP), AX - MOVL c+4(FP), BX - MOVL flag+8(FP), CX - MOVL blocks_base+12(FP), SI - MOVL blocks_len+16(FP), DX - - MOVL SP, BP - MOVL SP, DI - ADDL $15, DI - ANDL $~15, DI - MOVL DI, SP - - MOVL CX, 8(SP) - MOVL 0(BX), CX - MOVL CX, 0(SP) - MOVL 4(BX), CX - MOVL CX, 4(SP) - XORL CX, CX - MOVL CX, 12(SP) - - MOVOU 0(AX), X0 - MOVOU 16(AX), X1 - MOVOU counter<>(SB), X2 - -loop: - MOVO X0, 656(SP) - MOVO X1, 672(SP) - MOVO X0, X4 - MOVO X1, X5 - MOVOU iv0<>(SB), X6 - MOVOU iv1<>(SB), X7 - - MOVO 0(SP), X3 - PADDQ X2, X3 - PXOR X3, X7 - MOVO X3, 0(SP) - - MOVOU rol16<>(SB), X0 - MOVOU rol8<>(SB), X1 - - PRECOMPUTE(SP, 16, SI, CX) - ROUND_SSSE3(X4, X5, X6, X7, 16(SP), 32(SP), 48(SP), 64(SP), X3, X0, X1) - ROUND_SSSE3(X4, X5, X6, X7, 16+64(SP), 32+64(SP), 48+64(SP), 64+64(SP), X3, X0, X1) - ROUND_SSSE3(X4, X5, X6, X7, 16+128(SP), 32+128(SP), 48+128(SP), 64+128(SP), X3, X0, X1) - ROUND_SSSE3(X4, X5, X6, X7, 16+192(SP), 32+192(SP), 48+192(SP), 64+192(SP), X3, X0, X1) - ROUND_SSSE3(X4, X5, X6, X7, 16+256(SP), 32+256(SP), 48+256(SP), 64+256(SP), X3, X0, X1) - ROUND_SSSE3(X4, X5, X6, X7, 16+320(SP), 32+320(SP), 48+320(SP), 64+320(SP), X3, X0, X1) - ROUND_SSSE3(X4, X5, X6, X7, 16+384(SP), 32+384(SP), 48+384(SP), 64+384(SP), X3, X0, X1) - ROUND_SSSE3(X4, X5, X6, X7, 16+448(SP), 32+448(SP), 48+448(SP), 64+448(SP), X3, X0, X1) - ROUND_SSSE3(X4, X5, X6, X7, 16+512(SP), 32+512(SP), 48+512(SP), 64+512(SP), X3, X0, X1) - ROUND_SSSE3(X4, X5, X6, X7, 16+576(SP), 32+576(SP), 48+576(SP), 64+576(SP), X3, X0, X1) - - MOVO 656(SP), X0 - MOVO 672(SP), X1 - PXOR X4, X0 - PXOR X5, X1 - PXOR X6, X0 - PXOR X7, X1 - - LEAL 64(SI), SI - SUBL $64, DX - JNE loop - - MOVL 0(SP), CX - MOVL CX, 0(BX) - MOVL 4(SP), CX - MOVL CX, 4(BX) - - MOVOU X0, 0(AX) - MOVOU X1, 16(AX) - - MOVL BP, SP - RET - -// func supportSSSE3() bool -TEXT ·supportSSSE3(SB), 4, $0-1 - MOVL $1, AX - CPUID - MOVL CX, BX - ANDL $0x1, BX // supports SSE3 - JZ FALSE - ANDL $0x200, CX // supports SSSE3 - JZ FALSE - MOVB $1, ret+0(FP) - RET - -FALSE: - MOVB $0, ret+0(FP) - RET - -// func supportSSE2() bool -TEXT ·supportSSE2(SB), 4, $0-1 - MOVL $1, AX - CPUID - SHRL $26, DX - ANDL $1, DX // DX != 0 if support SSE2 - MOVB DX, ret+0(FP) - RET diff --git a/vendor/golang.org/x/crypto/blake2s/blake2s_amd64.go b/vendor/golang.org/x/crypto/blake2s/blake2s_amd64.go deleted file mode 100644 index 43a76253d..000000000 --- a/vendor/golang.org/x/crypto/blake2s/blake2s_amd64.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build amd64,!gccgo,!appengine - -package blake2s - -var ( - useSSE4 = supportSSE4() - useSSSE3 = supportSSSE3() - useSSE2 = true // Always available on amd64 - useGeneric = false -) - -//go:noescape -func supportSSSE3() bool - -//go:noescape -func supportSSE4() bool - -//go:noescape -func hashBlocksSSE2(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) - -//go:noescape -func hashBlocksSSSE3(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) - -//go:noescape -func hashBlocksSSE4(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) - -func hashBlocks(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) { - if useSSE4 { - hashBlocksSSE4(h, c, flag, blocks) - } else if useSSSE3 { - hashBlocksSSSE3(h, c, flag, blocks) - } else { - hashBlocksSSE2(h, c, flag, blocks) - } -} diff --git a/vendor/golang.org/x/crypto/blake2s/blake2s_amd64.s b/vendor/golang.org/x/crypto/blake2s/blake2s_amd64.s deleted file mode 100644 index 6cdf5a94c..000000000 --- a/vendor/golang.org/x/crypto/blake2s/blake2s_amd64.s +++ /dev/null @@ -1,463 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build amd64,!gccgo,!appengine - -#include "textflag.h" - -DATA iv0<>+0x00(SB)/4, $0x6a09e667 -DATA iv0<>+0x04(SB)/4, $0xbb67ae85 -DATA iv0<>+0x08(SB)/4, $0x3c6ef372 -DATA iv0<>+0x0c(SB)/4, $0xa54ff53a -GLOBL iv0<>(SB), (NOPTR+RODATA), $16 - -DATA iv1<>+0x00(SB)/4, $0x510e527f -DATA iv1<>+0x04(SB)/4, $0x9b05688c -DATA iv1<>+0x08(SB)/4, $0x1f83d9ab -DATA iv1<>+0x0c(SB)/4, $0x5be0cd19 -GLOBL iv1<>(SB), (NOPTR+RODATA), $16 - -DATA rol16<>+0x00(SB)/8, $0x0504070601000302 -DATA rol16<>+0x08(SB)/8, $0x0D0C0F0E09080B0A -GLOBL rol16<>(SB), (NOPTR+RODATA), $16 - -DATA rol8<>+0x00(SB)/8, $0x0407060500030201 -DATA rol8<>+0x08(SB)/8, $0x0C0F0E0D080B0A09 -GLOBL rol8<>(SB), (NOPTR+RODATA), $16 - -DATA counter<>+0x00(SB)/8, $0x40 -DATA counter<>+0x08(SB)/8, $0x0 -GLOBL counter<>(SB), (NOPTR+RODATA), $16 - -#define ROTL_SSE2(n, t, v) \ - MOVO v, t; \ - PSLLL $n, t; \ - PSRLL $(32-n), v; \ - PXOR t, v - -#define ROTL_SSSE3(c, v) \ - PSHUFB c, v - -#define ROUND_SSE2(v0, v1, v2, v3, m0, m1, m2, m3, t) \ - PADDL m0, v0; \ - PADDL v1, v0; \ - PXOR v0, v3; \ - ROTL_SSE2(16, t, v3); \ - PADDL v3, v2; \ - PXOR v2, v1; \ - ROTL_SSE2(20, t, v1); \ - PADDL m1, v0; \ - PADDL v1, v0; \ - PXOR v0, v3; \ - ROTL_SSE2(24, t, v3); \ - PADDL v3, v2; \ - PXOR v2, v1; \ - ROTL_SSE2(25, t, v1); \ - PSHUFL $0x39, v1, v1; \ - PSHUFL $0x4E, v2, v2; \ - PSHUFL $0x93, v3, v3; \ - PADDL m2, v0; \ - PADDL v1, v0; \ - PXOR v0, v3; \ - ROTL_SSE2(16, t, v3); \ - PADDL v3, v2; \ - PXOR v2, v1; \ - ROTL_SSE2(20, t, v1); \ - PADDL m3, v0; \ - PADDL v1, v0; \ - PXOR v0, v3; \ - ROTL_SSE2(24, t, v3); \ - PADDL v3, v2; \ - PXOR v2, v1; \ - ROTL_SSE2(25, t, v1); \ - PSHUFL $0x39, v3, v3; \ - PSHUFL $0x4E, v2, v2; \ - PSHUFL $0x93, v1, v1 - -#define ROUND_SSSE3(v0, v1, v2, v3, m0, m1, m2, m3, t, c16, c8) \ - PADDL m0, v0; \ - PADDL v1, v0; \ - PXOR v0, v3; \ - ROTL_SSSE3(c16, v3); \ - PADDL v3, v2; \ - PXOR v2, v1; \ - ROTL_SSE2(20, t, v1); \ - PADDL m1, v0; \ - PADDL v1, v0; \ - PXOR v0, v3; \ - ROTL_SSSE3(c8, v3); \ - PADDL v3, v2; \ - PXOR v2, v1; \ - ROTL_SSE2(25, t, v1); \ - PSHUFL $0x39, v1, v1; \ - PSHUFL $0x4E, v2, v2; \ - PSHUFL $0x93, v3, v3; \ - PADDL m2, v0; \ - PADDL v1, v0; \ - PXOR v0, v3; \ - ROTL_SSSE3(c16, v3); \ - PADDL v3, v2; \ - PXOR v2, v1; \ - ROTL_SSE2(20, t, v1); \ - PADDL m3, v0; \ - PADDL v1, v0; \ - PXOR v0, v3; \ - ROTL_SSSE3(c8, v3); \ - PADDL v3, v2; \ - PXOR v2, v1; \ - ROTL_SSE2(25, t, v1); \ - PSHUFL $0x39, v3, v3; \ - PSHUFL $0x4E, v2, v2; \ - PSHUFL $0x93, v1, v1 - - -#define LOAD_MSG_SSE4(m0, m1, m2, m3, src, i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15) \ - MOVL i0*4(src), m0; \ - PINSRD $1, i1*4(src), m0; \ - PINSRD $2, i2*4(src), m0; \ - PINSRD $3, i3*4(src), m0; \ - MOVL i4*4(src), m1; \ - PINSRD $1, i5*4(src), m1; \ - PINSRD $2, i6*4(src), m1; \ - PINSRD $3, i7*4(src), m1; \ - MOVL i8*4(src), m2; \ - PINSRD $1, i9*4(src), m2; \ - PINSRD $2, i10*4(src), m2; \ - PINSRD $3, i11*4(src), m2; \ - MOVL i12*4(src), m3; \ - PINSRD $1, i13*4(src), m3; \ - PINSRD $2, i14*4(src), m3; \ - PINSRD $3, i15*4(src), m3 - -#define PRECOMPUTE_MSG(dst, off, src, R8, R9, R10, R11, R12, R13, R14, R15) \ - MOVQ 0*4(src), R8; \ - MOVQ 2*4(src), R9; \ - MOVQ 4*4(src), R10; \ - MOVQ 6*4(src), R11; \ - MOVQ 8*4(src), R12; \ - MOVQ 10*4(src), R13; \ - MOVQ 12*4(src), R14; \ - MOVQ 14*4(src), R15; \ - \ - MOVL R8, 0*4+off+0(dst); \ - MOVL R8, 9*4+off+64(dst); \ - MOVL R8, 5*4+off+128(dst); \ - MOVL R8, 14*4+off+192(dst); \ - MOVL R8, 4*4+off+256(dst); \ - MOVL R8, 2*4+off+320(dst); \ - MOVL R8, 8*4+off+384(dst); \ - MOVL R8, 12*4+off+448(dst); \ - MOVL R8, 3*4+off+512(dst); \ - MOVL R8, 15*4+off+576(dst); \ - SHRQ $32, R8; \ - MOVL R8, 4*4+off+0(dst); \ - MOVL R8, 8*4+off+64(dst); \ - MOVL R8, 14*4+off+128(dst); \ - MOVL R8, 5*4+off+192(dst); \ - MOVL R8, 12*4+off+256(dst); \ - MOVL R8, 11*4+off+320(dst); \ - MOVL R8, 1*4+off+384(dst); \ - MOVL R8, 6*4+off+448(dst); \ - MOVL R8, 10*4+off+512(dst); \ - MOVL R8, 3*4+off+576(dst); \ - \ - MOVL R9, 1*4+off+0(dst); \ - MOVL R9, 13*4+off+64(dst); \ - MOVL R9, 6*4+off+128(dst); \ - MOVL R9, 8*4+off+192(dst); \ - MOVL R9, 2*4+off+256(dst); \ - MOVL R9, 0*4+off+320(dst); \ - MOVL R9, 14*4+off+384(dst); \ - MOVL R9, 11*4+off+448(dst); \ - MOVL R9, 12*4+off+512(dst); \ - MOVL R9, 4*4+off+576(dst); \ - SHRQ $32, R9; \ - MOVL R9, 5*4+off+0(dst); \ - MOVL R9, 15*4+off+64(dst); \ - MOVL R9, 9*4+off+128(dst); \ - MOVL R9, 1*4+off+192(dst); \ - MOVL R9, 11*4+off+256(dst); \ - MOVL R9, 7*4+off+320(dst); \ - MOVL R9, 13*4+off+384(dst); \ - MOVL R9, 3*4+off+448(dst); \ - MOVL R9, 6*4+off+512(dst); \ - MOVL R9, 10*4+off+576(dst); \ - \ - MOVL R10, 2*4+off+0(dst); \ - MOVL R10, 1*4+off+64(dst); \ - MOVL R10, 15*4+off+128(dst); \ - MOVL R10, 10*4+off+192(dst); \ - MOVL R10, 6*4+off+256(dst); \ - MOVL R10, 8*4+off+320(dst); \ - MOVL R10, 3*4+off+384(dst); \ - MOVL R10, 13*4+off+448(dst); \ - MOVL R10, 14*4+off+512(dst); \ - MOVL R10, 5*4+off+576(dst); \ - SHRQ $32, R10; \ - MOVL R10, 6*4+off+0(dst); \ - MOVL R10, 11*4+off+64(dst); \ - MOVL R10, 2*4+off+128(dst); \ - MOVL R10, 9*4+off+192(dst); \ - MOVL R10, 1*4+off+256(dst); \ - MOVL R10, 13*4+off+320(dst); \ - MOVL R10, 4*4+off+384(dst); \ - MOVL R10, 8*4+off+448(dst); \ - MOVL R10, 15*4+off+512(dst); \ - MOVL R10, 7*4+off+576(dst); \ - \ - MOVL R11, 3*4+off+0(dst); \ - MOVL R11, 7*4+off+64(dst); \ - MOVL R11, 13*4+off+128(dst); \ - MOVL R11, 12*4+off+192(dst); \ - MOVL R11, 10*4+off+256(dst); \ - MOVL R11, 1*4+off+320(dst); \ - MOVL R11, 9*4+off+384(dst); \ - MOVL R11, 14*4+off+448(dst); \ - MOVL R11, 0*4+off+512(dst); \ - MOVL R11, 6*4+off+576(dst); \ - SHRQ $32, R11; \ - MOVL R11, 7*4+off+0(dst); \ - MOVL R11, 14*4+off+64(dst); \ - MOVL R11, 10*4+off+128(dst); \ - MOVL R11, 0*4+off+192(dst); \ - MOVL R11, 5*4+off+256(dst); \ - MOVL R11, 9*4+off+320(dst); \ - MOVL R11, 12*4+off+384(dst); \ - MOVL R11, 1*4+off+448(dst); \ - MOVL R11, 13*4+off+512(dst); \ - MOVL R11, 2*4+off+576(dst); \ - \ - MOVL R12, 8*4+off+0(dst); \ - MOVL R12, 5*4+off+64(dst); \ - MOVL R12, 4*4+off+128(dst); \ - MOVL R12, 15*4+off+192(dst); \ - MOVL R12, 14*4+off+256(dst); \ - MOVL R12, 3*4+off+320(dst); \ - MOVL R12, 11*4+off+384(dst); \ - MOVL R12, 10*4+off+448(dst); \ - MOVL R12, 7*4+off+512(dst); \ - MOVL R12, 1*4+off+576(dst); \ - SHRQ $32, R12; \ - MOVL R12, 12*4+off+0(dst); \ - MOVL R12, 2*4+off+64(dst); \ - MOVL R12, 11*4+off+128(dst); \ - MOVL R12, 4*4+off+192(dst); \ - MOVL R12, 0*4+off+256(dst); \ - MOVL R12, 15*4+off+320(dst); \ - MOVL R12, 10*4+off+384(dst); \ - MOVL R12, 7*4+off+448(dst); \ - MOVL R12, 5*4+off+512(dst); \ - MOVL R12, 9*4+off+576(dst); \ - \ - MOVL R13, 9*4+off+0(dst); \ - MOVL R13, 4*4+off+64(dst); \ - MOVL R13, 8*4+off+128(dst); \ - MOVL R13, 13*4+off+192(dst); \ - MOVL R13, 3*4+off+256(dst); \ - MOVL R13, 5*4+off+320(dst); \ - MOVL R13, 7*4+off+384(dst); \ - MOVL R13, 15*4+off+448(dst); \ - MOVL R13, 11*4+off+512(dst); \ - MOVL R13, 0*4+off+576(dst); \ - SHRQ $32, R13; \ - MOVL R13, 13*4+off+0(dst); \ - MOVL R13, 10*4+off+64(dst); \ - MOVL R13, 0*4+off+128(dst); \ - MOVL R13, 3*4+off+192(dst); \ - MOVL R13, 9*4+off+256(dst); \ - MOVL R13, 6*4+off+320(dst); \ - MOVL R13, 15*4+off+384(dst); \ - MOVL R13, 4*4+off+448(dst); \ - MOVL R13, 2*4+off+512(dst); \ - MOVL R13, 12*4+off+576(dst); \ - \ - MOVL R14, 10*4+off+0(dst); \ - MOVL R14, 12*4+off+64(dst); \ - MOVL R14, 1*4+off+128(dst); \ - MOVL R14, 6*4+off+192(dst); \ - MOVL R14, 13*4+off+256(dst); \ - MOVL R14, 4*4+off+320(dst); \ - MOVL R14, 0*4+off+384(dst); \ - MOVL R14, 2*4+off+448(dst); \ - MOVL R14, 8*4+off+512(dst); \ - MOVL R14, 14*4+off+576(dst); \ - SHRQ $32, R14; \ - MOVL R14, 14*4+off+0(dst); \ - MOVL R14, 3*4+off+64(dst); \ - MOVL R14, 7*4+off+128(dst); \ - MOVL R14, 2*4+off+192(dst); \ - MOVL R14, 15*4+off+256(dst); \ - MOVL R14, 12*4+off+320(dst); \ - MOVL R14, 6*4+off+384(dst); \ - MOVL R14, 0*4+off+448(dst); \ - MOVL R14, 9*4+off+512(dst); \ - MOVL R14, 11*4+off+576(dst); \ - \ - MOVL R15, 11*4+off+0(dst); \ - MOVL R15, 0*4+off+64(dst); \ - MOVL R15, 12*4+off+128(dst); \ - MOVL R15, 7*4+off+192(dst); \ - MOVL R15, 8*4+off+256(dst); \ - MOVL R15, 14*4+off+320(dst); \ - MOVL R15, 2*4+off+384(dst); \ - MOVL R15, 5*4+off+448(dst); \ - MOVL R15, 1*4+off+512(dst); \ - MOVL R15, 13*4+off+576(dst); \ - SHRQ $32, R15; \ - MOVL R15, 15*4+off+0(dst); \ - MOVL R15, 6*4+off+64(dst); \ - MOVL R15, 3*4+off+128(dst); \ - MOVL R15, 11*4+off+192(dst); \ - MOVL R15, 7*4+off+256(dst); \ - MOVL R15, 10*4+off+320(dst); \ - MOVL R15, 5*4+off+384(dst); \ - MOVL R15, 9*4+off+448(dst); \ - MOVL R15, 4*4+off+512(dst); \ - MOVL R15, 8*4+off+576(dst) - -#define BLAKE2s_SSE2() \ - PRECOMPUTE_MSG(SP, 16, SI, R8, R9, R10, R11, R12, R13, R14, R15); \ - ROUND_SSE2(X4, X5, X6, X7, 16(SP), 32(SP), 48(SP), 64(SP), X8); \ - ROUND_SSE2(X4, X5, X6, X7, 16+64(SP), 32+64(SP), 48+64(SP), 64+64(SP), X8); \ - ROUND_SSE2(X4, X5, X6, X7, 16+128(SP), 32+128(SP), 48+128(SP), 64+128(SP), X8); \ - ROUND_SSE2(X4, X5, X6, X7, 16+192(SP), 32+192(SP), 48+192(SP), 64+192(SP), X8); \ - ROUND_SSE2(X4, X5, X6, X7, 16+256(SP), 32+256(SP), 48+256(SP), 64+256(SP), X8); \ - ROUND_SSE2(X4, X5, X6, X7, 16+320(SP), 32+320(SP), 48+320(SP), 64+320(SP), X8); \ - ROUND_SSE2(X4, X5, X6, X7, 16+384(SP), 32+384(SP), 48+384(SP), 64+384(SP), X8); \ - ROUND_SSE2(X4, X5, X6, X7, 16+448(SP), 32+448(SP), 48+448(SP), 64+448(SP), X8); \ - ROUND_SSE2(X4, X5, X6, X7, 16+512(SP), 32+512(SP), 48+512(SP), 64+512(SP), X8); \ - ROUND_SSE2(X4, X5, X6, X7, 16+576(SP), 32+576(SP), 48+576(SP), 64+576(SP), X8) - -#define BLAKE2s_SSSE3() \ - PRECOMPUTE_MSG(SP, 16, SI, R8, R9, R10, R11, R12, R13, R14, R15); \ - ROUND_SSSE3(X4, X5, X6, X7, 16(SP), 32(SP), 48(SP), 64(SP), X8, X13, X14); \ - ROUND_SSSE3(X4, X5, X6, X7, 16+64(SP), 32+64(SP), 48+64(SP), 64+64(SP), X8, X13, X14); \ - ROUND_SSSE3(X4, X5, X6, X7, 16+128(SP), 32+128(SP), 48+128(SP), 64+128(SP), X8, X13, X14); \ - ROUND_SSSE3(X4, X5, X6, X7, 16+192(SP), 32+192(SP), 48+192(SP), 64+192(SP), X8, X13, X14); \ - ROUND_SSSE3(X4, X5, X6, X7, 16+256(SP), 32+256(SP), 48+256(SP), 64+256(SP), X8, X13, X14); \ - ROUND_SSSE3(X4, X5, X6, X7, 16+320(SP), 32+320(SP), 48+320(SP), 64+320(SP), X8, X13, X14); \ - ROUND_SSSE3(X4, X5, X6, X7, 16+384(SP), 32+384(SP), 48+384(SP), 64+384(SP), X8, X13, X14); \ - ROUND_SSSE3(X4, X5, X6, X7, 16+448(SP), 32+448(SP), 48+448(SP), 64+448(SP), X8, X13, X14); \ - ROUND_SSSE3(X4, X5, X6, X7, 16+512(SP), 32+512(SP), 48+512(SP), 64+512(SP), X8, X13, X14); \ - ROUND_SSSE3(X4, X5, X6, X7, 16+576(SP), 32+576(SP), 48+576(SP), 64+576(SP), X8, X13, X14) - -#define BLAKE2s_SSE4() \ - LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 0, 2, 4, 6, 1, 3, 5, 7, 8, 10, 12, 14, 9, 11, 13, 15); \ - ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14); \ - LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 14, 4, 9, 13, 10, 8, 15, 6, 1, 0, 11, 5, 12, 2, 7, 3); \ - ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14); \ - LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 11, 12, 5, 15, 8, 0, 2, 13, 10, 3, 7, 9, 14, 6, 1, 4); \ - ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14); \ - LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 7, 3, 13, 11, 9, 1, 12, 14, 2, 5, 4, 15, 6, 10, 0, 8); \ - ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14); \ - LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 9, 5, 2, 10, 0, 7, 4, 15, 14, 11, 6, 3, 1, 12, 8, 13); \ - ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14); \ - LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 2, 6, 0, 8, 12, 10, 11, 3, 4, 7, 15, 1, 13, 5, 14, 9); \ - ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14); \ - LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 12, 1, 14, 4, 5, 15, 13, 10, 0, 6, 9, 8, 7, 3, 2, 11); \ - ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14); \ - LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 13, 7, 12, 3, 11, 14, 1, 9, 5, 15, 8, 2, 0, 4, 6, 10); \ - ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14); \ - LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 6, 14, 11, 0, 15, 9, 3, 8, 12, 13, 1, 10, 2, 7, 4, 5); \ - ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14); \ - LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 10, 8, 7, 1, 2, 4, 6, 5, 15, 9, 3, 13, 11, 14, 12, 0); \ - ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14) - -#define HASH_BLOCKS(h, c, flag, blocks_base, blocks_len, BLAKE2s_FUNC) \ - MOVQ h, AX; \ - MOVQ c, BX; \ - MOVL flag, CX; \ - MOVQ blocks_base, SI; \ - MOVQ blocks_len, DX; \ - \ - MOVQ SP, BP; \ - MOVQ SP, R9; \ - ADDQ $15, R9; \ - ANDQ $~15, R9; \ - MOVQ R9, SP; \ - \ - MOVQ 0(BX), R9; \ - MOVQ R9, 0(SP); \ - XORQ R9, R9; \ - MOVQ R9, 8(SP); \ - MOVL CX, 8(SP); \ - \ - MOVOU 0(AX), X0; \ - MOVOU 16(AX), X1; \ - MOVOU iv0<>(SB), X2; \ - MOVOU iv1<>(SB), X3 \ - \ - MOVOU counter<>(SB), X12; \ - MOVOU rol16<>(SB), X13; \ - MOVOU rol8<>(SB), X14; \ - MOVO 0(SP), X15; \ - \ - loop: \ - MOVO X0, X4; \ - MOVO X1, X5; \ - MOVO X2, X6; \ - MOVO X3, X7; \ - \ - PADDQ X12, X15; \ - PXOR X15, X7; \ - \ - BLAKE2s_FUNC(); \ - \ - PXOR X4, X0; \ - PXOR X5, X1; \ - PXOR X6, X0; \ - PXOR X7, X1; \ - \ - LEAQ 64(SI), SI; \ - SUBQ $64, DX; \ - JNE loop; \ - \ - MOVO X15, 0(SP); \ - MOVQ 0(SP), R9; \ - MOVQ R9, 0(BX); \ - \ - MOVOU X0, 0(AX); \ - MOVOU X1, 16(AX); \ - \ - MOVQ BP, SP - -// func hashBlocksSSE2(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) -TEXT ·hashBlocksSSE2(SB), 0, $672-48 // frame = 656 + 16 byte alignment - HASH_BLOCKS(h+0(FP), c+8(FP), flag+16(FP), blocks_base+24(FP), blocks_len+32(FP), BLAKE2s_SSE2) - RET - -// func hashBlocksSSSE3(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) -TEXT ·hashBlocksSSSE3(SB), 0, $672-48 // frame = 656 + 16 byte alignment - HASH_BLOCKS(h+0(FP), c+8(FP), flag+16(FP), blocks_base+24(FP), blocks_len+32(FP), BLAKE2s_SSSE3) - RET - -// func hashBlocksSSE4(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) -TEXT ·hashBlocksSSE4(SB), 0, $32-48 // frame = 16 + 16 byte alignment - HASH_BLOCKS(h+0(FP), c+8(FP), flag+16(FP), blocks_base+24(FP), blocks_len+32(FP), BLAKE2s_SSE4) - RET - -// func supportSSE4() bool -TEXT ·supportSSE4(SB), 4, $0-1 - MOVL $1, AX - CPUID - SHRL $19, CX // Bit 19 indicates SSE4.1. - ANDL $1, CX - MOVB CX, ret+0(FP) - RET - -// func supportSSSE3() bool -TEXT ·supportSSSE3(SB), 4, $0-1 - MOVL $1, AX - CPUID - MOVL CX, BX - ANDL $0x1, BX // Bit zero indicates SSE3 support. - JZ FALSE - ANDL $0x200, CX // Bit nine indicates SSSE3 support. - JZ FALSE - MOVB $1, ret+0(FP) - RET - -FALSE: - MOVB $0, ret+0(FP) - RET diff --git a/vendor/golang.org/x/crypto/blake2s/blake2s_generic.go b/vendor/golang.org/x/crypto/blake2s/blake2s_generic.go deleted file mode 100644 index f7e065378..000000000 --- a/vendor/golang.org/x/crypto/blake2s/blake2s_generic.go +++ /dev/null @@ -1,174 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package blake2s - -// the precomputed values for BLAKE2s -// there are 10 16-byte arrays - one for each round -// the entries are calculated from the sigma constants. -var precomputed = [10][16]byte{ - {0, 2, 4, 6, 1, 3, 5, 7, 8, 10, 12, 14, 9, 11, 13, 15}, - {14, 4, 9, 13, 10, 8, 15, 6, 1, 0, 11, 5, 12, 2, 7, 3}, - {11, 12, 5, 15, 8, 0, 2, 13, 10, 3, 7, 9, 14, 6, 1, 4}, - {7, 3, 13, 11, 9, 1, 12, 14, 2, 5, 4, 15, 6, 10, 0, 8}, - {9, 5, 2, 10, 0, 7, 4, 15, 14, 11, 6, 3, 1, 12, 8, 13}, - {2, 6, 0, 8, 12, 10, 11, 3, 4, 7, 15, 1, 13, 5, 14, 9}, - {12, 1, 14, 4, 5, 15, 13, 10, 0, 6, 9, 8, 7, 3, 2, 11}, - {13, 7, 12, 3, 11, 14, 1, 9, 5, 15, 8, 2, 0, 4, 6, 10}, - {6, 14, 11, 0, 15, 9, 3, 8, 12, 13, 1, 10, 2, 7, 4, 5}, - {10, 8, 7, 1, 2, 4, 6, 5, 15, 9, 3, 13, 11, 14, 12, 0}, -} - -func hashBlocksGeneric(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) { - var m [16]uint32 - c0, c1 := c[0], c[1] - - for i := 0; i < len(blocks); { - c0 += BlockSize - if c0 < BlockSize { - c1++ - } - - v0, v1, v2, v3, v4, v5, v6, v7 := h[0], h[1], h[2], h[3], h[4], h[5], h[6], h[7] - v8, v9, v10, v11, v12, v13, v14, v15 := iv[0], iv[1], iv[2], iv[3], iv[4], iv[5], iv[6], iv[7] - v12 ^= c0 - v13 ^= c1 - v14 ^= flag - - for j := range m { - m[j] = uint32(blocks[i]) | uint32(blocks[i+1])<<8 | uint32(blocks[i+2])<<16 | uint32(blocks[i+3])<<24 - i += 4 - } - - for k := range precomputed { - s := &(precomputed[k]) - - v0 += m[s[0]] - v0 += v4 - v12 ^= v0 - v12 = v12<<(32-16) | v12>>16 - v8 += v12 - v4 ^= v8 - v4 = v4<<(32-12) | v4>>12 - v1 += m[s[1]] - v1 += v5 - v13 ^= v1 - v13 = v13<<(32-16) | v13>>16 - v9 += v13 - v5 ^= v9 - v5 = v5<<(32-12) | v5>>12 - v2 += m[s[2]] - v2 += v6 - v14 ^= v2 - v14 = v14<<(32-16) | v14>>16 - v10 += v14 - v6 ^= v10 - v6 = v6<<(32-12) | v6>>12 - v3 += m[s[3]] - v3 += v7 - v15 ^= v3 - v15 = v15<<(32-16) | v15>>16 - v11 += v15 - v7 ^= v11 - v7 = v7<<(32-12) | v7>>12 - - v0 += m[s[4]] - v0 += v4 - v12 ^= v0 - v12 = v12<<(32-8) | v12>>8 - v8 += v12 - v4 ^= v8 - v4 = v4<<(32-7) | v4>>7 - v1 += m[s[5]] - v1 += v5 - v13 ^= v1 - v13 = v13<<(32-8) | v13>>8 - v9 += v13 - v5 ^= v9 - v5 = v5<<(32-7) | v5>>7 - v2 += m[s[6]] - v2 += v6 - v14 ^= v2 - v14 = v14<<(32-8) | v14>>8 - v10 += v14 - v6 ^= v10 - v6 = v6<<(32-7) | v6>>7 - v3 += m[s[7]] - v3 += v7 - v15 ^= v3 - v15 = v15<<(32-8) | v15>>8 - v11 += v15 - v7 ^= v11 - v7 = v7<<(32-7) | v7>>7 - - v0 += m[s[8]] - v0 += v5 - v15 ^= v0 - v15 = v15<<(32-16) | v15>>16 - v10 += v15 - v5 ^= v10 - v5 = v5<<(32-12) | v5>>12 - v1 += m[s[9]] - v1 += v6 - v12 ^= v1 - v12 = v12<<(32-16) | v12>>16 - v11 += v12 - v6 ^= v11 - v6 = v6<<(32-12) | v6>>12 - v2 += m[s[10]] - v2 += v7 - v13 ^= v2 - v13 = v13<<(32-16) | v13>>16 - v8 += v13 - v7 ^= v8 - v7 = v7<<(32-12) | v7>>12 - v3 += m[s[11]] - v3 += v4 - v14 ^= v3 - v14 = v14<<(32-16) | v14>>16 - v9 += v14 - v4 ^= v9 - v4 = v4<<(32-12) | v4>>12 - - v0 += m[s[12]] - v0 += v5 - v15 ^= v0 - v15 = v15<<(32-8) | v15>>8 - v10 += v15 - v5 ^= v10 - v5 = v5<<(32-7) | v5>>7 - v1 += m[s[13]] - v1 += v6 - v12 ^= v1 - v12 = v12<<(32-8) | v12>>8 - v11 += v12 - v6 ^= v11 - v6 = v6<<(32-7) | v6>>7 - v2 += m[s[14]] - v2 += v7 - v13 ^= v2 - v13 = v13<<(32-8) | v13>>8 - v8 += v13 - v7 ^= v8 - v7 = v7<<(32-7) | v7>>7 - v3 += m[s[15]] - v3 += v4 - v14 ^= v3 - v14 = v14<<(32-8) | v14>>8 - v9 += v14 - v4 ^= v9 - v4 = v4<<(32-7) | v4>>7 - } - - h[0] ^= v0 ^ v8 - h[1] ^= v1 ^ v9 - h[2] ^= v2 ^ v10 - h[3] ^= v3 ^ v11 - h[4] ^= v4 ^ v12 - h[5] ^= v5 ^ v13 - h[6] ^= v6 ^ v14 - h[7] ^= v7 ^ v15 - } - c[0], c[1] = c0, c1 -} diff --git a/vendor/golang.org/x/crypto/blake2s/blake2s_ref.go b/vendor/golang.org/x/crypto/blake2s/blake2s_ref.go deleted file mode 100644 index 7e54230bc..000000000 --- a/vendor/golang.org/x/crypto/blake2s/blake2s_ref.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !amd64,!386 gccgo appengine - -package blake2s - -var ( - useSSE4 = false - useSSSE3 = false - useSSE2 = false - useGeneric = true -) - -func hashBlocks(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) { - hashBlocksGeneric(h, c, flag, blocks) -} diff --git a/vendor/golang.org/x/crypto/blake2s/blake2s_test.go b/vendor/golang.org/x/crypto/blake2s/blake2s_test.go deleted file mode 100644 index e6f2eeb44..000000000 --- a/vendor/golang.org/x/crypto/blake2s/blake2s_test.go +++ /dev/null @@ -1,357 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package blake2s - -import ( - "encoding/hex" - "fmt" - "testing" -) - -func TestHashes(t *testing.T) { - defer func(sse2, ssse3, sse4 bool) { - useSSE2, useSSSE3, useSSE4 = sse2, ssse3, sse4 - }(useSSE2, useSSSE3, useSSE4) - - if useSSE4 { - t.Log("SSE4 version") - testHashes(t) - useSSE4 = false - } - if useSSSE3 { - t.Log("SSSE3 version") - testHashes(t) - useSSSE3 = false - } - if useSSE2 { - t.Log("SSE2 version") - testHashes(t) - useSSE2 = false - } - if useGeneric { - t.Log("generic version") - testHashes(t) - } -} - -func testHashes(t *testing.T) { - key, _ := hex.DecodeString("000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f") - - input := make([]byte, 255) - for i := range input { - input[i] = byte(i) - } - - for i, expectedHex := range hashes { - h, err := New256(key) - if err != nil { - t.Fatalf("#%d: error from New256: %v", i, err) - } - - h.Write(input[:i]) - sum := h.Sum(nil) - - if gotHex := fmt.Sprintf("%x", sum); gotHex != expectedHex { - t.Fatalf("#%d (single write): got %s, wanted %s", i, gotHex, expectedHex) - } - - h.Reset() - for j := 0; j < i; j++ { - h.Write(input[j : j+1]) - } - - sum = h.Sum(sum[:0]) - if gotHex := fmt.Sprintf("%x", sum); gotHex != expectedHex { - t.Fatalf("#%d (byte-by-byte): got %s, wanted %s", i, gotHex, expectedHex) - } - } -} - -// Benchmarks - -func benchmarkSum(b *testing.B, size int) { - data := make([]byte, size) - b.SetBytes(int64(size)) - b.ResetTimer() - for i := 0; i < b.N; i++ { - Sum256(data) - } -} - -func benchmarkWrite(b *testing.B, size int) { - data := make([]byte, size) - h, _ := New256(nil) - b.SetBytes(int64(size)) - b.ResetTimer() - for i := 0; i < b.N; i++ { - h.Write(data) - } -} - -func BenchmarkWrite64(b *testing.B) { benchmarkWrite(b, 64) } -func BenchmarkWrite1K(b *testing.B) { benchmarkWrite(b, 1024) } - -func BenchmarkSum64(b *testing.B) { benchmarkSum(b, 64) } -func BenchmarkSum1K(b *testing.B) { benchmarkSum(b, 1024) } - -// hashes is taken from https://blake2.net/blake2s-test.txt -var hashes = []string{ - "48a8997da407876b3d79c0d92325ad3b89cbb754d86ab71aee047ad345fd2c49", - "40d15fee7c328830166ac3f918650f807e7e01e177258cdc0a39b11f598066f1", - "6bb71300644cd3991b26ccd4d274acd1adeab8b1d7914546c1198bbe9fc9d803", - "1d220dbe2ee134661fdf6d9e74b41704710556f2f6e5a091b227697445dbea6b", - "f6c3fbadb4cc687a0064a5be6e791bec63b868ad62fba61b3757ef9ca52e05b2", - "49c1f21188dfd769aea0e911dd6b41f14dab109d2b85977aa3088b5c707e8598", - "fdd8993dcd43f696d44f3cea0ff35345234ec8ee083eb3cada017c7f78c17143", - "e6c8125637438d0905b749f46560ac89fd471cf8692e28fab982f73f019b83a9", - "19fc8ca6979d60e6edd3b4541e2f967ced740df6ec1eaebbfe813832e96b2974", - "a6ad777ce881b52bb5a4421ab6cdd2dfba13e963652d4d6d122aee46548c14a7", - "f5c4b2ba1a00781b13aba0425242c69cb1552f3f71a9a3bb22b4a6b4277b46dd", - "e33c4c9bd0cc7e45c80e65c77fa5997fec7002738541509e68a9423891e822a3", - "fba16169b2c3ee105be6e1e650e5cbf40746b6753d036ab55179014ad7ef6651", - "f5c4bec6d62fc608bf41cc115f16d61c7efd3ff6c65692bbe0afffb1fede7475", - "a4862e76db847f05ba17ede5da4e7f91b5925cf1ad4ba12732c3995742a5cd6e", - "65f4b860cd15b38ef814a1a804314a55be953caa65fd758ad989ff34a41c1eea", - "19ba234f0a4f38637d1839f9d9f76ad91c8522307143c97d5f93f69274cec9a7", - "1a67186ca4a5cb8e65fca0e2ecbc5ddc14ae381bb8bffeb9e0a103449e3ef03c", - "afbea317b5a2e89c0bd90ccf5d7fd0ed57fe585e4be3271b0a6bf0f5786b0f26", - "f1b01558ce541262f5ec34299d6fb4090009e3434be2f49105cf46af4d2d4124", - "13a0a0c86335635eaa74ca2d5d488c797bbb4f47dc07105015ed6a1f3309efce", - "1580afeebebb346f94d59fe62da0b79237ead7b1491f5667a90e45edf6ca8b03", - "20be1a875b38c573dd7faaa0de489d655c11efb6a552698e07a2d331b5f655c3", - "be1fe3c4c04018c54c4a0f6b9a2ed3c53abe3a9f76b4d26de56fc9ae95059a99", - "e3e3ace537eb3edd8463d9ad3582e13cf86533ffde43d668dd2e93bbdbd7195a", - "110c50c0bf2c6e7aeb7e435d92d132ab6655168e78a2decdec3330777684d9c1", - "e9ba8f505c9c80c08666a701f3367e6cc665f34b22e73c3c0417eb1c2206082f", - "26cd66fca02379c76df12317052bcafd6cd8c3a7b890d805f36c49989782433a", - "213f3596d6e3a5d0e9932cd2159146015e2abc949f4729ee2632fe1edb78d337", - "1015d70108e03be1c702fe97253607d14aee591f2413ea6787427b6459ff219a", - "3ca989de10cfe609909472c8d35610805b2f977734cf652cc64b3bfc882d5d89", - "b6156f72d380ee9ea6acd190464f2307a5c179ef01fd71f99f2d0f7a57360aea", - "c03bc642b20959cbe133a0303e0c1abff3e31ec8e1a328ec8565c36decff5265", - "2c3e08176f760c6264c3a2cd66fec6c3d78de43fc192457b2a4a660a1e0eb22b", - "f738c02f3c1b190c512b1a32deabf353728e0e9ab034490e3c3409946a97aeec", - "8b1880df301cc963418811088964839287ff7fe31c49ea6ebd9e48bdeee497c5", - "1e75cb21c60989020375f1a7a242839f0b0b68973a4c2a05cf7555ed5aaec4c1", - "62bf8a9c32a5bccf290b6c474d75b2a2a4093f1a9e27139433a8f2b3bce7b8d7", - "166c8350d3173b5e702b783dfd33c66ee0432742e9b92b997fd23c60dc6756ca", - "044a14d822a90cacf2f5a101428adc8f4109386ccb158bf905c8618b8ee24ec3", - "387d397ea43a994be84d2d544afbe481a2000f55252696bba2c50c8ebd101347", - "56f8ccf1f86409b46ce36166ae9165138441577589db08cbc5f66ca29743b9fd", - "9706c092b04d91f53dff91fa37b7493d28b576b5d710469df79401662236fc03", - "877968686c068ce2f7e2adcff68bf8748edf3cf862cfb4d3947a3106958054e3", - "8817e5719879acf7024787eccdb271035566cfa333e049407c0178ccc57a5b9f", - "8938249e4b50cadaccdf5b18621326cbb15253e33a20f5636e995d72478de472", - "f164abba4963a44d107257e3232d90aca5e66a1408248c51741e991db5227756", - "d05563e2b1cba0c4a2a1e8bde3a1a0d9f5b40c85a070d6f5fb21066ead5d0601", - "03fbb16384f0a3866f4c3117877666efbf124597564b293d4aab0d269fabddfa", - "5fa8486ac0e52964d1881bbe338eb54be2f719549224892057b4da04ba8b3475", - "cdfabcee46911111236a31708b2539d71fc211d9b09c0d8530a11e1dbf6eed01", - "4f82de03b9504793b82a07a0bdcdff314d759e7b62d26b784946b0d36f916f52", - "259ec7f173bcc76a0994c967b4f5f024c56057fb79c965c4fae41875f06a0e4c", - "193cc8e7c3e08bb30f5437aa27ade1f142369b246a675b2383e6da9b49a9809e", - "5c10896f0e2856b2a2eee0fe4a2c1633565d18f0e93e1fab26c373e8f829654d", - "f16012d93f28851a1eb989f5d0b43f3f39ca73c9a62d5181bff237536bd348c3", - "2966b3cfae1e44ea996dc5d686cf25fa053fb6f67201b9e46eade85d0ad6b806", - "ddb8782485e900bc60bcf4c33a6fd585680cc683d516efa03eb9985fad8715fb", - "4c4d6e71aea05786413148fc7a786b0ecaf582cff1209f5a809fba8504ce662c", - "fb4c5e86d7b2229b99b8ba6d94c247ef964aa3a2bae8edc77569f28dbbff2d4e", - "e94f526de9019633ecd54ac6120f23958d7718f1e7717bf329211a4faeed4e6d", - "cbd6660a10db3f23f7a03d4b9d4044c7932b2801ac89d60bc9eb92d65a46c2a0", - "8818bbd3db4dc123b25cbba5f54c2bc4b3fcf9bf7d7a7709f4ae588b267c4ece", - "c65382513f07460da39833cb666c5ed82e61b9e998f4b0c4287cee56c3cc9bcd", - "8975b0577fd35566d750b362b0897a26c399136df07bababbde6203ff2954ed4", - "21fe0ceb0052be7fb0f004187cacd7de67fa6eb0938d927677f2398c132317a8", - "2ef73f3c26f12d93889f3c78b6a66c1d52b649dc9e856e2c172ea7c58ac2b5e3", - "388a3cd56d73867abb5f8401492b6e2681eb69851e767fd84210a56076fb3dd3", - "af533e022fc9439e4e3cb838ecd18692232adf6fe9839526d3c3dd1b71910b1a", - "751c09d41a9343882a81cd13ee40818d12eb44c6c7f40df16e4aea8fab91972a", - "5b73ddb68d9d2b0aa265a07988d6b88ae9aac582af83032f8a9b21a2e1b7bf18", - "3da29126c7c5d7f43e64242a79feaa4ef3459cdeccc898ed59a97f6ec93b9dab", - "566dc920293da5cb4fe0aa8abda8bbf56f552313bff19046641e3615c1e3ed3f", - "4115bea02f73f97f629e5c5590720c01e7e449ae2a6697d4d2783321303692f9", - "4ce08f4762468a7670012164878d68340c52a35e66c1884d5c864889abc96677", - "81ea0b7804124e0c22ea5fc71104a2afcb52a1fa816f3ecb7dcb5d9dea1786d0", - "fe362733b05f6bedaf9379d7f7936ede209b1f8323c3922549d9e73681b5db7b", - "eff37d30dfd20359be4e73fdf40d27734b3df90a97a55ed745297294ca85d09f", - "172ffc67153d12e0ca76a8b6cd5d4731885b39ce0cac93a8972a18006c8b8baf", - "c47957f1cc88e83ef9445839709a480a036bed5f88ac0fcc8e1e703ffaac132c", - "30f3548370cfdceda5c37b569b6175e799eef1a62aaa943245ae7669c227a7b5", - "c95dcb3cf1f27d0eef2f25d2413870904a877c4a56c2de1e83e2bc2ae2e46821", - "d5d0b5d705434cd46b185749f66bfb5836dcdf6ee549a2b7a4aee7f58007caaf", - "bbc124a712f15d07c300e05b668389a439c91777f721f8320c1c9078066d2c7e", - "a451b48c35a6c7854cfaae60262e76990816382ac0667e5a5c9e1b46c4342ddf", - "b0d150fb55e778d01147f0b5d89d99ecb20ff07e5e6760d6b645eb5b654c622b", - "34f737c0ab219951eee89a9f8dac299c9d4c38f33fa494c5c6eefc92b6db08bc", - "1a62cc3a00800dcbd99891080c1e098458193a8cc9f970ea99fbeff00318c289", - "cfce55ebafc840d7ae48281c7fd57ec8b482d4b704437495495ac414cf4a374b", - "6746facf71146d999dabd05d093ae586648d1ee28e72617b99d0f0086e1e45bf", - "571ced283b3f23b4e750bf12a2caf1781847bd890e43603cdc5976102b7bb11b", - "cfcb765b048e35022c5d089d26e85a36b005a2b80493d03a144e09f409b6afd1", - "4050c7a27705bb27f42089b299f3cbe5054ead68727e8ef9318ce6f25cd6f31d", - "184070bd5d265fbdc142cd1c5cd0d7e414e70369a266d627c8fba84fa5e84c34", - "9edda9a4443902a9588c0d0ccc62b930218479a6841e6fe7d43003f04b1fd643", - "e412feef7908324a6da1841629f35d3d358642019310ec57c614836b63d30763", - "1a2b8edff3f9acc1554fcbae3cf1d6298c6462e22e5eb0259684f835012bd13f", - "288c4ad9b9409762ea07c24a41f04f69a7d74bee2d95435374bde946d7241c7b", - "805691bb286748cfb591d3aebe7e6f4e4dc6e2808c65143cc004e4eb6fd09d43", - "d4ac8d3a0afc6cfa7b460ae3001baeb36dadb37da07d2e8ac91822df348aed3d", - "c376617014d20158bced3d3ba552b6eccf84e62aa3eb650e90029c84d13eea69", - "c41f09f43cecae7293d6007ca0a357087d5ae59be500c1cd5b289ee810c7b082", - "03d1ced1fba5c39155c44b7765cb760c78708dcfc80b0bd8ade3a56da8830b29", - "09bde6f152218dc92c41d7f45387e63e5869d807ec70b821405dbd884b7fcf4b", - "71c9036e18179b90b37d39e9f05eb89cc5fc341fd7c477d0d7493285faca08a4", - "5916833ebb05cd919ca7fe83b692d3205bef72392b2cf6bb0a6d43f994f95f11", - "f63aab3ec641b3b024964c2b437c04f6043c4c7e0279239995401958f86bbe54", - "f172b180bfb09740493120b6326cbdc561e477def9bbcfd28cc8c1c5e3379a31", - "cb9b89cc18381dd9141ade588654d4e6a231d5bf49d4d59ac27d869cbe100cf3", - "7bd8815046fdd810a923e1984aaebdcdf84d87c8992d68b5eeb460f93eb3c8d7", - "607be66862fd08ee5b19facac09dfdbcd40c312101d66e6ebd2b841f1b9a9325", - "9fe03bbe69ab1834f5219b0da88a08b30a66c5913f0151963c360560db0387b3", - "90a83585717b75f0e9b725e055eeeeb9e7a028ea7e6cbc07b20917ec0363e38c", - "336ea0530f4a7469126e0218587ebbde3358a0b31c29d200f7dc7eb15c6aadd8", - "a79e76dc0abca4396f0747cd7b748df913007626b1d659da0c1f78b9303d01a3", - "44e78a773756e0951519504d7038d28d0213a37e0ce375371757bc996311e3b8", - "77ac012a3f754dcfeab5eb996be9cd2d1f96111b6e49f3994df181f28569d825", - "ce5a10db6fccdaf140aaa4ded6250a9c06e9222bc9f9f3658a4aff935f2b9f3a", - "ecc203a7fe2be4abd55bb53e6e673572e0078da8cd375ef430cc97f9f80083af", - "14a5186de9d7a18b0412b8563e51cc5433840b4a129a8ff963b33a3c4afe8ebb", - "13f8ef95cb86e6a638931c8e107673eb76ba10d7c2cd70b9d9920bbeed929409", - "0b338f4ee12f2dfcb78713377941e0b0632152581d1332516e4a2cab1942cca4", - "eaab0ec37b3b8ab796e9f57238de14a264a076f3887d86e29bb5906db5a00e02", - "23cb68b8c0e6dc26dc27766ddc0a13a99438fd55617aa4095d8f969720c872df", - "091d8ee30d6f2968d46b687dd65292665742de0bb83dcc0004c72ce10007a549", - "7f507abc6d19ba00c065a876ec5657868882d18a221bc46c7a6912541f5bc7ba", - "a0607c24e14e8c223db0d70b4d30ee88014d603f437e9e02aa7dafa3cdfbad94", - "ddbfea75cc467882eb3483ce5e2e756a4f4701b76b445519e89f22d60fa86e06", - "0c311f38c35a4fb90d651c289d486856cd1413df9b0677f53ece2cd9e477c60a", - "46a73a8dd3e70f59d3942c01df599def783c9da82fd83222cd662b53dce7dbdf", - "ad038ff9b14de84a801e4e621ce5df029dd93520d0c2fa38bff176a8b1d1698c", - "ab70c5dfbd1ea817fed0cd067293abf319e5d7901c2141d5d99b23f03a38e748", - "1fffda67932b73c8ecaf009a3491a026953babfe1f663b0697c3c4ae8b2e7dcb", - "b0d2cc19472dd57f2b17efc03c8d58c2283dbb19da572f7755855aa9794317a0", - "a0d19a6ee33979c325510e276622df41f71583d07501b87071129a0ad94732a5", - "724642a7032d1062b89e52bea34b75df7d8fe772d9fe3c93ddf3c4545ab5a99b", - "ade5eaa7e61f672d587ea03dae7d7b55229c01d06bc0a5701436cbd18366a626", - "013b31ebd228fcdda51fabb03bb02d60ac20ca215aafa83bdd855e3755a35f0b", - "332ed40bb10dde3c954a75d7b8999d4b26a1c063c1dc6e32c1d91bab7bbb7d16", - "c7a197b3a05b566bcc9facd20e441d6f6c2860ac9651cd51d6b9d2cdeeea0390", - "bd9cf64ea8953c037108e6f654914f3958b68e29c16700dc184d94a21708ff60", - "8835b0ac021151df716474ce27ce4d3c15f0b2dab48003cf3f3efd0945106b9a", - "3bfefa3301aa55c080190cffda8eae51d9af488b4c1f24c3d9a75242fd8ea01d", - "08284d14993cd47d53ebaecf0df0478cc182c89c00e1859c84851686ddf2c1b7", - "1ed7ef9f04c2ac8db6a864db131087f27065098e69c3fe78718d9b947f4a39d0", - "c161f2dcd57e9c1439b31a9dd43d8f3d7dd8f0eb7cfac6fb25a0f28e306f0661", - "c01969ad34c52caf3dc4d80d19735c29731ac6e7a92085ab9250c48dea48a3fc", - "1720b3655619d2a52b3521ae0e49e345cb3389ebd6208acaf9f13fdacca8be49", - "756288361c83e24c617cf95c905b22d017cdc86f0bf1d658f4756c7379873b7f", - "e7d0eda3452693b752abcda1b55e276f82698f5f1605403eff830bea0071a394", - "2c82ecaa6b84803e044af63118afe544687cb6e6c7df49ed762dfd7c8693a1bc", - "6136cbf4b441056fa1e2722498125d6ded45e17b52143959c7f4d4e395218ac2", - "721d3245aafef27f6a624f47954b6c255079526ffa25e9ff77e5dcff473b1597", - "9dd2fbd8cef16c353c0ac21191d509eb28dd9e3e0d8cea5d26ca839393851c3a", - "b2394ceacdebf21bf9df2ced98e58f1c3a4bbbff660dd900f62202d6785cc46e", - "57089f222749ad7871765f062b114f43ba20ec56422a8b1e3f87192c0ea718c6", - "e49a9459961cd33cdf4aae1b1078a5dea7c040e0fea340c93a724872fc4af806", - "ede67f720effd2ca9c88994152d0201dee6b0a2d2c077aca6dae29f73f8b6309", - "e0f434bf22e3088039c21f719ffc67f0f2cb5e98a7a0194c76e96bf4e8e17e61", - "277c04e2853484a4eba910ad336d01b477b67cc200c59f3c8d77eef8494f29cd", - "156d5747d0c99c7f27097d7b7e002b2e185cb72d8dd7eb424a0321528161219f", - "20ddd1ed9b1ca803946d64a83ae4659da67fba7a1a3eddb1e103c0f5e03e3a2c", - "f0af604d3dabbf9a0f2a7d3dda6bd38bba72c6d09be494fcef713ff10189b6e6", - "9802bb87def4cc10c4a5fd49aa58dfe2f3fddb46b4708814ead81d23ba95139b", - "4f8ce1e51d2fe7f24043a904d898ebfc91975418753413aa099b795ecb35cedb", - "bddc6514d7ee6ace0a4ac1d0e068112288cbcf560454642705630177cba608bd", - "d635994f6291517b0281ffdd496afa862712e5b3c4e52e4cd5fdae8c0e72fb08", - "878d9ca600cf87e769cc305c1b35255186615a73a0da613b5f1c98dbf81283ea", - "a64ebe5dc185de9fdde7607b6998702eb23456184957307d2fa72e87a47702d6", - "ce50eab7b5eb52bdc9ad8e5a480ab780ca9320e44360b1fe37e03f2f7ad7de01", - "eeddb7c0db6e30abe66d79e327511e61fcebbc29f159b40a86b046ecf0513823", - "787fc93440c1ec96b5ad01c16cf77916a1405f9426356ec921d8dff3ea63b7e0", - "7f0d5eab47eefda696c0bf0fbf86ab216fce461e9303aba6ac374120e890e8df", - "b68004b42f14ad029f4c2e03b1d5eb76d57160e26476d21131bef20ada7d27f4", - "b0c4eb18ae250b51a41382ead92d0dc7455f9379fc9884428e4770608db0faec", - "f92b7a870c059f4d46464c824ec96355140bdce681322cc3a992ff103e3fea52", - "5364312614813398cc525d4c4e146edeb371265fba19133a2c3d2159298a1742", - "f6620e68d37fb2af5000fc28e23b832297ecd8bce99e8be4d04e85309e3d3374", - "5316a27969d7fe04ff27b283961bffc3bf5dfb32fb6a89d101c6c3b1937c2871", - "81d1664fdf3cb33c24eebac0bd64244b77c4abea90bbe8b5ee0b2aafcf2d6a53", - "345782f295b0880352e924a0467b5fbc3e8f3bfbc3c7e48b67091fb5e80a9442", - "794111ea6cd65e311f74ee41d476cb632ce1e4b051dc1d9e9d061a19e1d0bb49", - "2a85daf6138816b99bf8d08ba2114b7ab07975a78420c1a3b06a777c22dd8bcb", - "89b0d5f289ec16401a069a960d0b093e625da3cf41ee29b59b930c5820145455", - "d0fdcb543943fc27d20864f52181471b942cc77ca675bcb30df31d358ef7b1eb", - "b17ea8d77063c709d4dc6b879413c343e3790e9e62ca85b7900b086f6b75c672", - "e71a3e2c274db842d92114f217e2c0eac8b45093fdfd9df4ca7162394862d501", - "c0476759ab7aa333234f6b44f5fd858390ec23694c622cb986e769c78edd733e", - "9ab8eabb1416434d85391341d56993c55458167d4418b19a0f2ad8b79a83a75b", - "7992d0bbb15e23826f443e00505d68d3ed7372995a5c3e498654102fbcd0964e", - "c021b30085151435df33b007ccecc69df1269f39ba25092bed59d932ac0fdc28", - "91a25ec0ec0d9a567f89c4bfe1a65a0e432d07064b4190e27dfb81901fd3139b", - "5950d39a23e1545f301270aa1a12f2e6c453776e4d6355de425cc153f9818867", - "d79f14720c610af179a3765d4b7c0968f977962dbf655b521272b6f1e194488e", - "e9531bfc8b02995aeaa75ba27031fadbcbf4a0dab8961d9296cd7e84d25d6006", - "34e9c26a01d7f16181b454a9d1623c233cb99d31c694656e9413aca3e918692f", - "d9d7422f437bd439ddd4d883dae2a08350173414be78155133fff1964c3d7972", - "4aee0c7aaf075414ff1793ead7eaca601775c615dbd60b640b0a9f0ce505d435", - "6bfdd15459c83b99f096bfb49ee87b063d69c1974c6928acfcfb4099f8c4ef67", - "9fd1c408fd75c336193a2a14d94f6af5adf050b80387b4b010fb29f4cc72707c", - "13c88480a5d00d6c8c7ad2110d76a82d9b70f4fa6696d4e5dd42a066dcaf9920", - "820e725ee25fe8fd3a8d5abe4c46c3ba889de6fa9191aa22ba67d5705421542b", - "32d93a0eb02f42fbbcaf2bad0085b282e46046a4df7ad10657c9d6476375b93e", - "adc5187905b1669cd8ec9c721e1953786b9d89a9bae30780f1e1eab24a00523c", - "e90756ff7f9ad810b239a10ced2cf9b2284354c1f8c7e0accc2461dc796d6e89", - "1251f76e56978481875359801db589a0b22f86d8d634dc04506f322ed78f17e8", - "3afa899fd980e73ecb7f4d8b8f291dc9af796bc65d27f974c6f193c9191a09fd", - "aa305be26e5deddc3c1010cbc213f95f051c785c5b431e6a7cd048f161787528", - "8ea1884ff32e9d10f039b407d0d44e7e670abd884aeee0fb757ae94eaa97373d", - "d482b2155d4dec6b4736a1f1617b53aaa37310277d3fef0c37ad41768fc235b4", - "4d413971387e7a8898a8dc2a27500778539ea214a2dfe9b3d7e8ebdce5cf3db3", - "696e5d46e6c57e8796e4735d08916e0b7929b3cf298c296d22e9d3019653371c", - "1f5647c1d3b088228885865c8940908bf40d1a8272821973b160008e7a3ce2eb", - "b6e76c330f021a5bda65875010b0edf09126c0f510ea849048192003aef4c61c", - "3cd952a0beada41abb424ce47f94b42be64e1ffb0fd0782276807946d0d0bc55", - "98d92677439b41b7bb513312afb92bcc8ee968b2e3b238cecb9b0f34c9bb63d0", - "ecbca2cf08ae57d517ad16158a32bfa7dc0382eaeda128e91886734c24a0b29d", - "942cc7c0b52e2b16a4b89fa4fc7e0bf609e29a08c1a8543452b77c7bfd11bb28", - "8a065d8b61a0dffb170d5627735a76b0e9506037808cba16c345007c9f79cf8f", - "1b9fa19714659c78ff413871849215361029ac802b1cbcd54e408bd87287f81f", - "8dab071bcd6c7292a9ef727b4ae0d86713301da8618d9a48adce55f303a869a1", - "8253e3e7c7b684b9cb2beb014ce330ff3d99d17abbdbabe4f4d674ded53ffc6b", - "f195f321e9e3d6bd7d074504dd2ab0e6241f92e784b1aa271ff648b1cab6d7f6", - "27e4cc72090f241266476a7c09495f2db153d5bcbd761903ef79275ec56b2ed8", - "899c2405788e25b99a1846355e646d77cf400083415f7dc5afe69d6e17c00023", - "a59b78c4905744076bfee894de707d4f120b5c6893ea0400297d0bb834727632", - "59dc78b105649707a2bb4419c48f005400d3973de3736610230435b10424b24f", - "c0149d1d7e7a6353a6d906efe728f2f329fe14a4149a3ea77609bc42b975ddfa", - "a32f241474a6c16932e9243be0cf09bcdc7e0ca0e7a6a1b9b1a0f01e41502377", - "b239b2e4f81841361c1339f68e2c359f929af9ad9f34e01aab4631ad6d5500b0", - "85fb419c7002a3e0b4b6ea093b4c1ac6936645b65dac5ac15a8528b7b94c1754", - "9619720625f190b93a3fad186ab314189633c0d3a01e6f9bc8c4a8f82f383dbf", - "7d620d90fe69fa469a6538388970a1aa09bb48a2d59b347b97e8ce71f48c7f46", - "294383568596fb37c75bbacd979c5ff6f20a556bf8879cc72924855df9b8240e", - "16b18ab314359c2b833c1c6986d48c55a9fc97cde9a3c1f10a3177140f73f738", - "8cbbdd14bc33f04cf45813e4a153a273d36adad5ce71f499eeb87fb8ac63b729", - "69c9a498db174ecaefcc5a3ac9fdedf0f813a5bec727f1e775babdec7718816e", - "b462c3be40448f1d4f80626254e535b08bc9cdcff599a768578d4b2881a8e3f0", - "553e9d9c5f360ac0b74a7d44e5a391dad4ced03e0c24183b7e8ecabdf1715a64", - "7a7c55a56fa9ae51e655e01975d8a6ff4ae9e4b486fcbe4eac044588f245ebea", - "2afdf3c82abc4867f5de111286c2b3be7d6e48657ba923cfbf101a6dfcf9db9a", - "41037d2edcdce0c49b7fb4a6aa0999ca66976c7483afe631d4eda283144f6dfc", - "c4466f8497ca2eeb4583a0b08e9d9ac74395709fda109d24f2e4462196779c5d", - "75f609338aa67d969a2ae2a2362b2da9d77c695dfd1df7224a6901db932c3364", - "68606ceb989d5488fc7cf649f3d7c272ef055da1a93faecd55fe06f6967098ca", - "44346bdeb7e052f6255048f0d9b42c425bab9c3dd24168212c3ecf1ebf34e6ae", - "8e9cf6e1f366471f2ac7d2ee9b5e6266fda71f8f2e4109f2237ed5f8813fc718", - "84bbeb8406d250951f8c1b3e86a7c010082921833dfd9555a2f909b1086eb4b8", - "ee666f3eef0f7e2a9c222958c97eaf35f51ced393d714485ab09a069340fdf88", - "c153d34a65c47b4a62c5cacf24010975d0356b2f32c8f5da530d338816ad5de6", - "9fc5450109e1b779f6c7ae79d56c27635c8dd426c5a9d54e2578db989b8c3b4e", - "d12bf3732ef4af5c22fa90356af8fc50fcb40f8f2ea5c8594737a3b3d5abdbd7", - "11030b9289bba5af65260672ab6fee88b87420acef4a1789a2073b7ec2f2a09e", - "69cb192b8444005c8c0ceb12c846860768188cda0aec27a9c8a55cdee2123632", - "db444c15597b5f1a03d1f9edd16e4a9f43a667cc275175dfa2b704e3bb1a9b83", - "3fb735061abc519dfe979e54c1ee5bfad0a9d858b3315bad34bde999efd724dd", -} diff --git a/vendor/golang.org/x/crypto/blake2s/register.go b/vendor/golang.org/x/crypto/blake2s/register.go deleted file mode 100644 index d277459a1..000000000 --- a/vendor/golang.org/x/crypto/blake2s/register.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build go1.9 - -package blake2s - -import ( - "crypto" - "hash" -) - -func init() { - newHash256 := func() hash.Hash { - h, _ := New256(nil) - return h - } - - crypto.RegisterHash(crypto.BLAKE2s_256, newHash256) -} diff --git a/vendor/golang.org/x/crypto/blowfish/block.go b/vendor/golang.org/x/crypto/blowfish/block.go deleted file mode 100644 index 9d80f1952..000000000 --- a/vendor/golang.org/x/crypto/blowfish/block.go +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package blowfish - -// getNextWord returns the next big-endian uint32 value from the byte slice -// at the given position in a circular manner, updating the position. -func getNextWord(b []byte, pos *int) uint32 { - var w uint32 - j := *pos - for i := 0; i < 4; i++ { - w = w<<8 | uint32(b[j]) - j++ - if j >= len(b) { - j = 0 - } - } - *pos = j - return w -} - -// ExpandKey performs a key expansion on the given *Cipher. Specifically, it -// performs the Blowfish algorithm's key schedule which sets up the *Cipher's -// pi and substitution tables for calls to Encrypt. This is used, primarily, -// by the bcrypt package to reuse the Blowfish key schedule during its -// set up. It's unlikely that you need to use this directly. -func ExpandKey(key []byte, c *Cipher) { - j := 0 - for i := 0; i < 18; i++ { - // Using inlined getNextWord for performance. - var d uint32 - for k := 0; k < 4; k++ { - d = d<<8 | uint32(key[j]) - j++ - if j >= len(key) { - j = 0 - } - } - c.p[i] ^= d - } - - var l, r uint32 - for i := 0; i < 18; i += 2 { - l, r = encryptBlock(l, r, c) - c.p[i], c.p[i+1] = l, r - } - - for i := 0; i < 256; i += 2 { - l, r = encryptBlock(l, r, c) - c.s0[i], c.s0[i+1] = l, r - } - for i := 0; i < 256; i += 2 { - l, r = encryptBlock(l, r, c) - c.s1[i], c.s1[i+1] = l, r - } - for i := 0; i < 256; i += 2 { - l, r = encryptBlock(l, r, c) - c.s2[i], c.s2[i+1] = l, r - } - for i := 0; i < 256; i += 2 { - l, r = encryptBlock(l, r, c) - c.s3[i], c.s3[i+1] = l, r - } -} - -// This is similar to ExpandKey, but folds the salt during the key -// schedule. While ExpandKey is essentially expandKeyWithSalt with an all-zero -// salt passed in, reusing ExpandKey turns out to be a place of inefficiency -// and specializing it here is useful. -func expandKeyWithSalt(key []byte, salt []byte, c *Cipher) { - j := 0 - for i := 0; i < 18; i++ { - c.p[i] ^= getNextWord(key, &j) - } - - j = 0 - var l, r uint32 - for i := 0; i < 18; i += 2 { - l ^= getNextWord(salt, &j) - r ^= getNextWord(salt, &j) - l, r = encryptBlock(l, r, c) - c.p[i], c.p[i+1] = l, r - } - - for i := 0; i < 256; i += 2 { - l ^= getNextWord(salt, &j) - r ^= getNextWord(salt, &j) - l, r = encryptBlock(l, r, c) - c.s0[i], c.s0[i+1] = l, r - } - - for i := 0; i < 256; i += 2 { - l ^= getNextWord(salt, &j) - r ^= getNextWord(salt, &j) - l, r = encryptBlock(l, r, c) - c.s1[i], c.s1[i+1] = l, r - } - - for i := 0; i < 256; i += 2 { - l ^= getNextWord(salt, &j) - r ^= getNextWord(salt, &j) - l, r = encryptBlock(l, r, c) - c.s2[i], c.s2[i+1] = l, r - } - - for i := 0; i < 256; i += 2 { - l ^= getNextWord(salt, &j) - r ^= getNextWord(salt, &j) - l, r = encryptBlock(l, r, c) - c.s3[i], c.s3[i+1] = l, r - } -} - -func encryptBlock(l, r uint32, c *Cipher) (uint32, uint32) { - xl, xr := l, r - xl ^= c.p[0] - xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[1] - xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[2] - xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[3] - xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[4] - xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[5] - xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[6] - xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[7] - xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[8] - xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[9] - xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[10] - xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[11] - xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[12] - xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[13] - xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[14] - xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[15] - xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[16] - xr ^= c.p[17] - return xr, xl -} - -func decryptBlock(l, r uint32, c *Cipher) (uint32, uint32) { - xl, xr := l, r - xl ^= c.p[17] - xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[16] - xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[15] - xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[14] - xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[13] - xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[12] - xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[11] - xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[10] - xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[9] - xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[8] - xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[7] - xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[6] - xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[5] - xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[4] - xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[3] - xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[2] - xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[1] - xr ^= c.p[0] - return xr, xl -} diff --git a/vendor/golang.org/x/crypto/blowfish/blowfish_test.go b/vendor/golang.org/x/crypto/blowfish/blowfish_test.go deleted file mode 100644 index 7afa1fdf3..000000000 --- a/vendor/golang.org/x/crypto/blowfish/blowfish_test.go +++ /dev/null @@ -1,274 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package blowfish - -import "testing" - -type CryptTest struct { - key []byte - in []byte - out []byte -} - -// Test vector values are from http://www.schneier.com/code/vectors.txt. -var encryptTests = []CryptTest{ - { - []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - []byte{0x4E, 0xF9, 0x97, 0x45, 0x61, 0x98, 0xDD, 0x78}}, - { - []byte{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - []byte{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - []byte{0x51, 0x86, 0x6F, 0xD5, 0xB8, 0x5E, 0xCB, 0x8A}}, - { - []byte{0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - []byte{0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}, - []byte{0x7D, 0x85, 0x6F, 0x9A, 0x61, 0x30, 0x63, 0xF2}}, - { - []byte{0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11}, - []byte{0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11}, - []byte{0x24, 0x66, 0xDD, 0x87, 0x8B, 0x96, 0x3C, 0x9D}}, - - { - []byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF}, - []byte{0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11}, - []byte{0x61, 0xF9, 0xC3, 0x80, 0x22, 0x81, 0xB0, 0x96}}, - { - []byte{0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11}, - []byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF}, - []byte{0x7D, 0x0C, 0xC6, 0x30, 0xAF, 0xDA, 0x1E, 0xC7}}, - { - []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - []byte{0x4E, 0xF9, 0x97, 0x45, 0x61, 0x98, 0xDD, 0x78}}, - { - []byte{0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}, - []byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF}, - []byte{0x0A, 0xCE, 0xAB, 0x0F, 0xC6, 0xA0, 0xA2, 0x8D}}, - { - []byte{0x7C, 0xA1, 0x10, 0x45, 0x4A, 0x1A, 0x6E, 0x57}, - []byte{0x01, 0xA1, 0xD6, 0xD0, 0x39, 0x77, 0x67, 0x42}, - []byte{0x59, 0xC6, 0x82, 0x45, 0xEB, 0x05, 0x28, 0x2B}}, - { - []byte{0x01, 0x31, 0xD9, 0x61, 0x9D, 0xC1, 0x37, 0x6E}, - []byte{0x5C, 0xD5, 0x4C, 0xA8, 0x3D, 0xEF, 0x57, 0xDA}, - []byte{0xB1, 0xB8, 0xCC, 0x0B, 0x25, 0x0F, 0x09, 0xA0}}, - { - []byte{0x07, 0xA1, 0x13, 0x3E, 0x4A, 0x0B, 0x26, 0x86}, - []byte{0x02, 0x48, 0xD4, 0x38, 0x06, 0xF6, 0x71, 0x72}, - []byte{0x17, 0x30, 0xE5, 0x77, 0x8B, 0xEA, 0x1D, 0xA4}}, - { - []byte{0x38, 0x49, 0x67, 0x4C, 0x26, 0x02, 0x31, 0x9E}, - []byte{0x51, 0x45, 0x4B, 0x58, 0x2D, 0xDF, 0x44, 0x0A}, - []byte{0xA2, 0x5E, 0x78, 0x56, 0xCF, 0x26, 0x51, 0xEB}}, - { - []byte{0x04, 0xB9, 0x15, 0xBA, 0x43, 0xFE, 0xB5, 0xB6}, - []byte{0x42, 0xFD, 0x44, 0x30, 0x59, 0x57, 0x7F, 0xA2}, - []byte{0x35, 0x38, 0x82, 0xB1, 0x09, 0xCE, 0x8F, 0x1A}}, - { - []byte{0x01, 0x13, 0xB9, 0x70, 0xFD, 0x34, 0xF2, 0xCE}, - []byte{0x05, 0x9B, 0x5E, 0x08, 0x51, 0xCF, 0x14, 0x3A}, - []byte{0x48, 0xF4, 0xD0, 0x88, 0x4C, 0x37, 0x99, 0x18}}, - { - []byte{0x01, 0x70, 0xF1, 0x75, 0x46, 0x8F, 0xB5, 0xE6}, - []byte{0x07, 0x56, 0xD8, 0xE0, 0x77, 0x47, 0x61, 0xD2}, - []byte{0x43, 0x21, 0x93, 0xB7, 0x89, 0x51, 0xFC, 0x98}}, - { - []byte{0x43, 0x29, 0x7F, 0xAD, 0x38, 0xE3, 0x73, 0xFE}, - []byte{0x76, 0x25, 0x14, 0xB8, 0x29, 0xBF, 0x48, 0x6A}, - []byte{0x13, 0xF0, 0x41, 0x54, 0xD6, 0x9D, 0x1A, 0xE5}}, - { - []byte{0x07, 0xA7, 0x13, 0x70, 0x45, 0xDA, 0x2A, 0x16}, - []byte{0x3B, 0xDD, 0x11, 0x90, 0x49, 0x37, 0x28, 0x02}, - []byte{0x2E, 0xED, 0xDA, 0x93, 0xFF, 0xD3, 0x9C, 0x79}}, - { - []byte{0x04, 0x68, 0x91, 0x04, 0xC2, 0xFD, 0x3B, 0x2F}, - []byte{0x26, 0x95, 0x5F, 0x68, 0x35, 0xAF, 0x60, 0x9A}, - []byte{0xD8, 0x87, 0xE0, 0x39, 0x3C, 0x2D, 0xA6, 0xE3}}, - { - []byte{0x37, 0xD0, 0x6B, 0xB5, 0x16, 0xCB, 0x75, 0x46}, - []byte{0x16, 0x4D, 0x5E, 0x40, 0x4F, 0x27, 0x52, 0x32}, - []byte{0x5F, 0x99, 0xD0, 0x4F, 0x5B, 0x16, 0x39, 0x69}}, - { - []byte{0x1F, 0x08, 0x26, 0x0D, 0x1A, 0xC2, 0x46, 0x5E}, - []byte{0x6B, 0x05, 0x6E, 0x18, 0x75, 0x9F, 0x5C, 0xCA}, - []byte{0x4A, 0x05, 0x7A, 0x3B, 0x24, 0xD3, 0x97, 0x7B}}, - { - []byte{0x58, 0x40, 0x23, 0x64, 0x1A, 0xBA, 0x61, 0x76}, - []byte{0x00, 0x4B, 0xD6, 0xEF, 0x09, 0x17, 0x60, 0x62}, - []byte{0x45, 0x20, 0x31, 0xC1, 0xE4, 0xFA, 0xDA, 0x8E}}, - { - []byte{0x02, 0x58, 0x16, 0x16, 0x46, 0x29, 0xB0, 0x07}, - []byte{0x48, 0x0D, 0x39, 0x00, 0x6E, 0xE7, 0x62, 0xF2}, - []byte{0x75, 0x55, 0xAE, 0x39, 0xF5, 0x9B, 0x87, 0xBD}}, - { - []byte{0x49, 0x79, 0x3E, 0xBC, 0x79, 0xB3, 0x25, 0x8F}, - []byte{0x43, 0x75, 0x40, 0xC8, 0x69, 0x8F, 0x3C, 0xFA}, - []byte{0x53, 0xC5, 0x5F, 0x9C, 0xB4, 0x9F, 0xC0, 0x19}}, - { - []byte{0x4F, 0xB0, 0x5E, 0x15, 0x15, 0xAB, 0x73, 0xA7}, - []byte{0x07, 0x2D, 0x43, 0xA0, 0x77, 0x07, 0x52, 0x92}, - []byte{0x7A, 0x8E, 0x7B, 0xFA, 0x93, 0x7E, 0x89, 0xA3}}, - { - []byte{0x49, 0xE9, 0x5D, 0x6D, 0x4C, 0xA2, 0x29, 0xBF}, - []byte{0x02, 0xFE, 0x55, 0x77, 0x81, 0x17, 0xF1, 0x2A}, - []byte{0xCF, 0x9C, 0x5D, 0x7A, 0x49, 0x86, 0xAD, 0xB5}}, - { - []byte{0x01, 0x83, 0x10, 0xDC, 0x40, 0x9B, 0x26, 0xD6}, - []byte{0x1D, 0x9D, 0x5C, 0x50, 0x18, 0xF7, 0x28, 0xC2}, - []byte{0xD1, 0xAB, 0xB2, 0x90, 0x65, 0x8B, 0xC7, 0x78}}, - { - []byte{0x1C, 0x58, 0x7F, 0x1C, 0x13, 0x92, 0x4F, 0xEF}, - []byte{0x30, 0x55, 0x32, 0x28, 0x6D, 0x6F, 0x29, 0x5A}, - []byte{0x55, 0xCB, 0x37, 0x74, 0xD1, 0x3E, 0xF2, 0x01}}, - { - []byte{0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, - []byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF}, - []byte{0xFA, 0x34, 0xEC, 0x48, 0x47, 0xB2, 0x68, 0xB2}}, - { - []byte{0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E}, - []byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF}, - []byte{0xA7, 0x90, 0x79, 0x51, 0x08, 0xEA, 0x3C, 0xAE}}, - { - []byte{0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE}, - []byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF}, - []byte{0xC3, 0x9E, 0x07, 0x2D, 0x9F, 0xAC, 0x63, 0x1D}}, - { - []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - []byte{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - []byte{0x01, 0x49, 0x33, 0xE0, 0xCD, 0xAF, 0xF6, 0xE4}}, - { - []byte{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - []byte{0xF2, 0x1E, 0x9A, 0x77, 0xB7, 0x1C, 0x49, 0xBC}}, - { - []byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF}, - []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - []byte{0x24, 0x59, 0x46, 0x88, 0x57, 0x54, 0x36, 0x9A}}, - { - []byte{0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}, - []byte{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - []byte{0x6B, 0x5C, 0x5A, 0x9C, 0x5D, 0x9E, 0x0A, 0x5A}}, -} - -func TestCipherEncrypt(t *testing.T) { - for i, tt := range encryptTests { - c, err := NewCipher(tt.key) - if err != nil { - t.Errorf("NewCipher(%d bytes) = %s", len(tt.key), err) - continue - } - ct := make([]byte, len(tt.out)) - c.Encrypt(ct, tt.in) - for j, v := range ct { - if v != tt.out[j] { - t.Errorf("Cipher.Encrypt, test vector #%d: cipher-text[%d] = %#x, expected %#x", i, j, v, tt.out[j]) - break - } - } - } -} - -func TestCipherDecrypt(t *testing.T) { - for i, tt := range encryptTests { - c, err := NewCipher(tt.key) - if err != nil { - t.Errorf("NewCipher(%d bytes) = %s", len(tt.key), err) - continue - } - pt := make([]byte, len(tt.in)) - c.Decrypt(pt, tt.out) - for j, v := range pt { - if v != tt.in[j] { - t.Errorf("Cipher.Decrypt, test vector #%d: plain-text[%d] = %#x, expected %#x", i, j, v, tt.in[j]) - break - } - } - } -} - -func TestSaltedCipherKeyLength(t *testing.T) { - if _, err := NewSaltedCipher(nil, []byte{'a'}); err != KeySizeError(0) { - t.Errorf("NewSaltedCipher with short key, gave error %#v, expected %#v", err, KeySizeError(0)) - } - - // A 57-byte key. One over the typical blowfish restriction. - key := []byte("012345678901234567890123456789012345678901234567890123456") - if _, err := NewSaltedCipher(key, []byte{'a'}); err != nil { - t.Errorf("NewSaltedCipher with long key, gave error %#v", err) - } -} - -// Test vectors generated with Blowfish from OpenSSH. -var saltedVectors = [][8]byte{ - {0x0c, 0x82, 0x3b, 0x7b, 0x8d, 0x01, 0x4b, 0x7e}, - {0xd1, 0xe1, 0x93, 0xf0, 0x70, 0xa6, 0xdb, 0x12}, - {0xfc, 0x5e, 0xba, 0xde, 0xcb, 0xf8, 0x59, 0xad}, - {0x8a, 0x0c, 0x76, 0xe7, 0xdd, 0x2c, 0xd3, 0xa8}, - {0x2c, 0xcb, 0x7b, 0xee, 0xac, 0x7b, 0x7f, 0xf8}, - {0xbb, 0xf6, 0x30, 0x6f, 0xe1, 0x5d, 0x62, 0xbf}, - {0x97, 0x1e, 0xc1, 0x3d, 0x3d, 0xe0, 0x11, 0xe9}, - {0x06, 0xd7, 0x4d, 0xb1, 0x80, 0xa3, 0xb1, 0x38}, - {0x67, 0xa1, 0xa9, 0x75, 0x0e, 0x5b, 0xc6, 0xb4}, - {0x51, 0x0f, 0x33, 0x0e, 0x4f, 0x67, 0xd2, 0x0c}, - {0xf1, 0x73, 0x7e, 0xd8, 0x44, 0xea, 0xdb, 0xe5}, - {0x14, 0x0e, 0x16, 0xce, 0x7f, 0x4a, 0x9c, 0x7b}, - {0x4b, 0xfe, 0x43, 0xfd, 0xbf, 0x36, 0x04, 0x47}, - {0xb1, 0xeb, 0x3e, 0x15, 0x36, 0xa7, 0xbb, 0xe2}, - {0x6d, 0x0b, 0x41, 0xdd, 0x00, 0x98, 0x0b, 0x19}, - {0xd3, 0xce, 0x45, 0xce, 0x1d, 0x56, 0xb7, 0xfc}, - {0xd9, 0xf0, 0xfd, 0xda, 0xc0, 0x23, 0xb7, 0x93}, - {0x4c, 0x6f, 0xa1, 0xe4, 0x0c, 0xa8, 0xca, 0x57}, - {0xe6, 0x2f, 0x28, 0xa7, 0x0c, 0x94, 0x0d, 0x08}, - {0x8f, 0xe3, 0xf0, 0xb6, 0x29, 0xe3, 0x44, 0x03}, - {0xff, 0x98, 0xdd, 0x04, 0x45, 0xb4, 0x6d, 0x1f}, - {0x9e, 0x45, 0x4d, 0x18, 0x40, 0x53, 0xdb, 0xef}, - {0xb7, 0x3b, 0xef, 0x29, 0xbe, 0xa8, 0x13, 0x71}, - {0x02, 0x54, 0x55, 0x41, 0x8e, 0x04, 0xfc, 0xad}, - {0x6a, 0x0a, 0xee, 0x7c, 0x10, 0xd9, 0x19, 0xfe}, - {0x0a, 0x22, 0xd9, 0x41, 0xcc, 0x23, 0x87, 0x13}, - {0x6e, 0xff, 0x1f, 0xff, 0x36, 0x17, 0x9c, 0xbe}, - {0x79, 0xad, 0xb7, 0x40, 0xf4, 0x9f, 0x51, 0xa6}, - {0x97, 0x81, 0x99, 0xa4, 0xde, 0x9e, 0x9f, 0xb6}, - {0x12, 0x19, 0x7a, 0x28, 0xd0, 0xdc, 0xcc, 0x92}, - {0x81, 0xda, 0x60, 0x1e, 0x0e, 0xdd, 0x65, 0x56}, - {0x7d, 0x76, 0x20, 0xb2, 0x73, 0xc9, 0x9e, 0xee}, -} - -func TestSaltedCipher(t *testing.T) { - var key, salt [32]byte - for i := range key { - key[i] = byte(i) - salt[i] = byte(i + 32) - } - for i, v := range saltedVectors { - c, err := NewSaltedCipher(key[:], salt[:i]) - if err != nil { - t.Fatal(err) - } - var buf [8]byte - c.Encrypt(buf[:], buf[:]) - if v != buf { - t.Errorf("%d: expected %x, got %x", i, v, buf) - } - } -} - -func BenchmarkExpandKeyWithSalt(b *testing.B) { - key := make([]byte, 32) - salt := make([]byte, 16) - c, _ := NewCipher(key) - for i := 0; i < b.N; i++ { - expandKeyWithSalt(key, salt, c) - } -} - -func BenchmarkExpandKey(b *testing.B) { - key := make([]byte, 32) - c, _ := NewCipher(key) - for i := 0; i < b.N; i++ { - ExpandKey(key, c) - } -} diff --git a/vendor/golang.org/x/crypto/blowfish/cipher.go b/vendor/golang.org/x/crypto/blowfish/cipher.go deleted file mode 100644 index a73954f39..000000000 --- a/vendor/golang.org/x/crypto/blowfish/cipher.go +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package blowfish implements Bruce Schneier's Blowfish encryption algorithm. -package blowfish // import "golang.org/x/crypto/blowfish" - -// The code is a port of Bruce Schneier's C implementation. -// See http://www.schneier.com/blowfish.html. - -import "strconv" - -// The Blowfish block size in bytes. -const BlockSize = 8 - -// A Cipher is an instance of Blowfish encryption using a particular key. -type Cipher struct { - p [18]uint32 - s0, s1, s2, s3 [256]uint32 -} - -type KeySizeError int - -func (k KeySizeError) Error() string { - return "crypto/blowfish: invalid key size " + strconv.Itoa(int(k)) -} - -// NewCipher creates and returns a Cipher. -// The key argument should be the Blowfish key, from 1 to 56 bytes. -func NewCipher(key []byte) (*Cipher, error) { - var result Cipher - if k := len(key); k < 1 || k > 56 { - return nil, KeySizeError(k) - } - initCipher(&result) - ExpandKey(key, &result) - return &result, nil -} - -// NewSaltedCipher creates a returns a Cipher that folds a salt into its key -// schedule. For most purposes, NewCipher, instead of NewSaltedCipher, is -// sufficient and desirable. For bcrypt compatibility, the key can be over 56 -// bytes. -func NewSaltedCipher(key, salt []byte) (*Cipher, error) { - if len(salt) == 0 { - return NewCipher(key) - } - var result Cipher - if k := len(key); k < 1 { - return nil, KeySizeError(k) - } - initCipher(&result) - expandKeyWithSalt(key, salt, &result) - return &result, nil -} - -// BlockSize returns the Blowfish block size, 8 bytes. -// It is necessary to satisfy the Block interface in the -// package "crypto/cipher". -func (c *Cipher) BlockSize() int { return BlockSize } - -// Encrypt encrypts the 8-byte buffer src using the key k -// and stores the result in dst. -// Note that for amounts of data larger than a block, -// it is not safe to just call Encrypt on successive blocks; -// instead, use an encryption mode like CBC (see crypto/cipher/cbc.go). -func (c *Cipher) Encrypt(dst, src []byte) { - l := uint32(src[0])<<24 | uint32(src[1])<<16 | uint32(src[2])<<8 | uint32(src[3]) - r := uint32(src[4])<<24 | uint32(src[5])<<16 | uint32(src[6])<<8 | uint32(src[7]) - l, r = encryptBlock(l, r, c) - dst[0], dst[1], dst[2], dst[3] = byte(l>>24), byte(l>>16), byte(l>>8), byte(l) - dst[4], dst[5], dst[6], dst[7] = byte(r>>24), byte(r>>16), byte(r>>8), byte(r) -} - -// Decrypt decrypts the 8-byte buffer src using the key k -// and stores the result in dst. -func (c *Cipher) Decrypt(dst, src []byte) { - l := uint32(src[0])<<24 | uint32(src[1])<<16 | uint32(src[2])<<8 | uint32(src[3]) - r := uint32(src[4])<<24 | uint32(src[5])<<16 | uint32(src[6])<<8 | uint32(src[7]) - l, r = decryptBlock(l, r, c) - dst[0], dst[1], dst[2], dst[3] = byte(l>>24), byte(l>>16), byte(l>>8), byte(l) - dst[4], dst[5], dst[6], dst[7] = byte(r>>24), byte(r>>16), byte(r>>8), byte(r) -} - -func initCipher(c *Cipher) { - copy(c.p[0:], p[0:]) - copy(c.s0[0:], s0[0:]) - copy(c.s1[0:], s1[0:]) - copy(c.s2[0:], s2[0:]) - copy(c.s3[0:], s3[0:]) -} diff --git a/vendor/golang.org/x/crypto/blowfish/const.go b/vendor/golang.org/x/crypto/blowfish/const.go deleted file mode 100644 index 8c5ee4cb0..000000000 --- a/vendor/golang.org/x/crypto/blowfish/const.go +++ /dev/null @@ -1,199 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// The startup permutation array and substitution boxes. -// They are the hexadecimal digits of PI; see: -// http://www.schneier.com/code/constants.txt. - -package blowfish - -var s0 = [256]uint32{ - 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, - 0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, - 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, 0x0d95748f, 0x728eb658, - 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, - 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, - 0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, - 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, 0x55ca396a, 0x2aab10b6, - 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, - 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, - 0x7a325381, 0x28958677, 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, - 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 0xef845d5d, 0xe98575b1, - 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, - 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, - 0x670c9c61, 0xabd388f0, 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, - 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, 0xa1f1651d, 0x39af0176, - 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, - 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706, - 0x1bfedf72, 0x429b023d, 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, - 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b, - 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, - 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c, - 0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, - 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, 0x5579c0bd, 0x1a60320a, - 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, - 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, - 0x53317b48, 0x3e00df82, 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, - 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, 0x695b27b0, 0xbbca58c8, - 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, - 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, - 0x62fb1341, 0xcee4c6e8, 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, - 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 0xd08ed1d0, 0xafc725e0, - 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, - 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, - 0xea752dfe, 0x8b021fa1, 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, - 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 0x165fa266, 0x80957705, - 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, - 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e, - 0x226800bb, 0x57b8e0af, 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, - 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, 0x83260376, 0x6295cfa9, - 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, - 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f, - 0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, - 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a, -} - -var s1 = [256]uint32{ - 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, - 0x9cee60b8, 0x8fedb266, 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, - 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65, - 0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, - 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, - 0x3c971814, 0x6b6a70a1, 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, - 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, 0xb03ada37, 0xf0500c0d, - 0xf01c1f04, 0x0200b3ff, 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, - 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, - 0xc8b57634, 0x9af3dda7, 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, - 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, 0x4e548b38, 0x4f6db908, - 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, - 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, - 0x501adde6, 0x9f84cd87, 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, - 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, 0xef1c1847, 0x3215d908, - 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, - 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, - 0x3c11183b, 0x5924a509, 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, - 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa, - 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, - 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, - 0x1939260f, 0x19c27960, 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, - 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, 0xc332ddef, 0xbe6c5aa5, - 0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, - 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, - 0x0334fe1e, 0xaa0363cf, 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, - 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, 0x648b1eaf, 0x19bdf0ca, - 0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, - 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, - 0x11ed935f, 0x16681281, 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, - 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, 0xcdb30aeb, 0x532e3054, - 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, - 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, - 0xdb6c4f15, 0xfacb4fd0, 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, - 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, 0xcf62a1f2, 0x5b8d2646, - 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, - 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, - 0x1dadf43e, 0x233f7061, 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, - 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e, - 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, - 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, - 0x675fda79, 0xe3674340, 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, - 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7, -} - -var s2 = [256]uint32{ - 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, - 0xbcf46b2e, 0xd4a20068, 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, - 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, 0x4d95fc1d, 0x96b591af, - 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, - 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 0x28507825, 0x530429f4, - 0x0a2c86da, 0xe9b66dfb, 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, - 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, 0xaace1e7c, 0xd3375fec, - 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, - 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332, - 0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, - 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, 0x55a867bc, 0xa1159a58, - 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, - 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, - 0x48c1133f, 0xc70f86dc, 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, - 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, 0x257b7834, 0x602a9c60, - 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, - 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, - 0xde720c8c, 0x2da2f728, 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, - 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, 0x0a476341, 0x992eff74, - 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, - 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, - 0xb5390f92, 0x690fed0b, 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, - 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, 0x37392eb3, 0xcc115979, - 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, - 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa, - 0x3d25bdd8, 0xe2e1c3c9, 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, - 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, 0x9dbc8057, 0xf0f7c086, - 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, - 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, 0xbde8ae24, - 0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, - 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, 0x7aeb2661, 0x8b1ddf84, - 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, - 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, - 0x662d09a1, 0xc4324633, 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, - 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, 0xdcb7da83, 0x573906fe, - 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, - 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, - 0x006058aa, 0x30dc7d62, 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, - 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, 0x6f05e409, 0x4b7c0188, - 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, - 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, - 0xa28514d9, 0x6c51133c, 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, - 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0, -} - -var s3 = [256]uint32{ - 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, - 0xd3822740, 0x99bc9bbe, 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, - 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f, 0xbc946e79, - 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, - 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, - 0x63ef8ce2, 0x9a86ee22, 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, - 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, 0x2826a2f9, 0xa73a3ae1, - 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, - 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797, - 0x2cf0b7d9, 0x022b8b51, 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, - 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, 0xe029ac71, 0xe019a5e6, - 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, - 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba, - 0x03a16125, 0x0564f0bd, 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, - 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, 0x7533d928, 0xb155fdf5, - 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, - 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, - 0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, - 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, 0xb39a460a, 0x6445c0dd, - 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, - 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, - 0x8d6612ae, 0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, - 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 0x4040cb08, 0x4eb4e2cc, - 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, - 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, - 0xbb3a792b, 0x344525bd, 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, - 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a, - 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, - 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a, - 0x0f91fc71, 0x9b941525, 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, - 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b, - 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, - 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e, - 0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, - 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, 0xf523f357, 0xa6327623, - 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, - 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, - 0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, - 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, 0x53113ec0, 0x1640e3d3, - 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, - 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, - 0x01c36ae4, 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, - 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6, -} - -var p = [18]uint32{ - 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0, - 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, - 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b, -} diff --git a/vendor/golang.org/x/crypto/bn256/bn256.go b/vendor/golang.org/x/crypto/bn256/bn256.go deleted file mode 100644 index 014f8b355..000000000 --- a/vendor/golang.org/x/crypto/bn256/bn256.go +++ /dev/null @@ -1,404 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package bn256 implements a particular bilinear group at the 128-bit security level. -// -// Bilinear groups are the basis of many of the new cryptographic protocols -// that have been proposed over the past decade. They consist of a triplet of -// groups (G₁, G₂ and GT) such that there exists a function e(g₁ˣ,g₂ʸ)=gTˣʸ -// (where gₓ is a generator of the respective group). That function is called -// a pairing function. -// -// This package specifically implements the Optimal Ate pairing over a 256-bit -// Barreto-Naehrig curve as described in -// http://cryptojedi.org/papers/dclxvi-20100714.pdf. Its output is compatible -// with the implementation described in that paper. -package bn256 // import "golang.org/x/crypto/bn256" - -import ( - "crypto/rand" - "io" - "math/big" -) - -// BUG(agl): this implementation is not constant time. -// TODO(agl): keep GF(p²) elements in Mongomery form. - -// G1 is an abstract cyclic group. The zero value is suitable for use as the -// output of an operation, but cannot be used as an input. -type G1 struct { - p *curvePoint -} - -// RandomG1 returns x and g₁ˣ where x is a random, non-zero number read from r. -func RandomG1(r io.Reader) (*big.Int, *G1, error) { - var k *big.Int - var err error - - for { - k, err = rand.Int(r, Order) - if err != nil { - return nil, nil, err - } - if k.Sign() > 0 { - break - } - } - - return k, new(G1).ScalarBaseMult(k), nil -} - -func (g *G1) String() string { - return "bn256.G1" + g.p.String() -} - -// ScalarBaseMult sets e to g*k where g is the generator of the group and -// then returns e. -func (e *G1) ScalarBaseMult(k *big.Int) *G1 { - if e.p == nil { - e.p = newCurvePoint(nil) - } - e.p.Mul(curveGen, k, new(bnPool)) - return e -} - -// ScalarMult sets e to a*k and then returns e. -func (e *G1) ScalarMult(a *G1, k *big.Int) *G1 { - if e.p == nil { - e.p = newCurvePoint(nil) - } - e.p.Mul(a.p, k, new(bnPool)) - return e -} - -// Add sets e to a+b and then returns e. -// BUG(agl): this function is not complete: a==b fails. -func (e *G1) Add(a, b *G1) *G1 { - if e.p == nil { - e.p = newCurvePoint(nil) - } - e.p.Add(a.p, b.p, new(bnPool)) - return e -} - -// Neg sets e to -a and then returns e. -func (e *G1) Neg(a *G1) *G1 { - if e.p == nil { - e.p = newCurvePoint(nil) - } - e.p.Negative(a.p) - return e -} - -// Marshal converts n to a byte slice. -func (n *G1) Marshal() []byte { - n.p.MakeAffine(nil) - - xBytes := new(big.Int).Mod(n.p.x, p).Bytes() - yBytes := new(big.Int).Mod(n.p.y, p).Bytes() - - // Each value is a 256-bit number. - const numBytes = 256 / 8 - - ret := make([]byte, numBytes*2) - copy(ret[1*numBytes-len(xBytes):], xBytes) - copy(ret[2*numBytes-len(yBytes):], yBytes) - - return ret -} - -// Unmarshal sets e to the result of converting the output of Marshal back into -// a group element and then returns e. -func (e *G1) Unmarshal(m []byte) (*G1, bool) { - // Each value is a 256-bit number. - const numBytes = 256 / 8 - - if len(m) != 2*numBytes { - return nil, false - } - - if e.p == nil { - e.p = newCurvePoint(nil) - } - - e.p.x.SetBytes(m[0*numBytes : 1*numBytes]) - e.p.y.SetBytes(m[1*numBytes : 2*numBytes]) - - if e.p.x.Sign() == 0 && e.p.y.Sign() == 0 { - // This is the point at infinity. - e.p.y.SetInt64(1) - e.p.z.SetInt64(0) - e.p.t.SetInt64(0) - } else { - e.p.z.SetInt64(1) - e.p.t.SetInt64(1) - - if !e.p.IsOnCurve() { - return nil, false - } - } - - return e, true -} - -// G2 is an abstract cyclic group. The zero value is suitable for use as the -// output of an operation, but cannot be used as an input. -type G2 struct { - p *twistPoint -} - -// RandomG1 returns x and g₂ˣ where x is a random, non-zero number read from r. -func RandomG2(r io.Reader) (*big.Int, *G2, error) { - var k *big.Int - var err error - - for { - k, err = rand.Int(r, Order) - if err != nil { - return nil, nil, err - } - if k.Sign() > 0 { - break - } - } - - return k, new(G2).ScalarBaseMult(k), nil -} - -func (g *G2) String() string { - return "bn256.G2" + g.p.String() -} - -// ScalarBaseMult sets e to g*k where g is the generator of the group and -// then returns out. -func (e *G2) ScalarBaseMult(k *big.Int) *G2 { - if e.p == nil { - e.p = newTwistPoint(nil) - } - e.p.Mul(twistGen, k, new(bnPool)) - return e -} - -// ScalarMult sets e to a*k and then returns e. -func (e *G2) ScalarMult(a *G2, k *big.Int) *G2 { - if e.p == nil { - e.p = newTwistPoint(nil) - } - e.p.Mul(a.p, k, new(bnPool)) - return e -} - -// Add sets e to a+b and then returns e. -// BUG(agl): this function is not complete: a==b fails. -func (e *G2) Add(a, b *G2) *G2 { - if e.p == nil { - e.p = newTwistPoint(nil) - } - e.p.Add(a.p, b.p, new(bnPool)) - return e -} - -// Marshal converts n into a byte slice. -func (n *G2) Marshal() []byte { - n.p.MakeAffine(nil) - - xxBytes := new(big.Int).Mod(n.p.x.x, p).Bytes() - xyBytes := new(big.Int).Mod(n.p.x.y, p).Bytes() - yxBytes := new(big.Int).Mod(n.p.y.x, p).Bytes() - yyBytes := new(big.Int).Mod(n.p.y.y, p).Bytes() - - // Each value is a 256-bit number. - const numBytes = 256 / 8 - - ret := make([]byte, numBytes*4) - copy(ret[1*numBytes-len(xxBytes):], xxBytes) - copy(ret[2*numBytes-len(xyBytes):], xyBytes) - copy(ret[3*numBytes-len(yxBytes):], yxBytes) - copy(ret[4*numBytes-len(yyBytes):], yyBytes) - - return ret -} - -// Unmarshal sets e to the result of converting the output of Marshal back into -// a group element and then returns e. -func (e *G2) Unmarshal(m []byte) (*G2, bool) { - // Each value is a 256-bit number. - const numBytes = 256 / 8 - - if len(m) != 4*numBytes { - return nil, false - } - - if e.p == nil { - e.p = newTwistPoint(nil) - } - - e.p.x.x.SetBytes(m[0*numBytes : 1*numBytes]) - e.p.x.y.SetBytes(m[1*numBytes : 2*numBytes]) - e.p.y.x.SetBytes(m[2*numBytes : 3*numBytes]) - e.p.y.y.SetBytes(m[3*numBytes : 4*numBytes]) - - if e.p.x.x.Sign() == 0 && - e.p.x.y.Sign() == 0 && - e.p.y.x.Sign() == 0 && - e.p.y.y.Sign() == 0 { - // This is the point at infinity. - e.p.y.SetOne() - e.p.z.SetZero() - e.p.t.SetZero() - } else { - e.p.z.SetOne() - e.p.t.SetOne() - - if !e.p.IsOnCurve() { - return nil, false - } - } - - return e, true -} - -// GT is an abstract cyclic group. The zero value is suitable for use as the -// output of an operation, but cannot be used as an input. -type GT struct { - p *gfP12 -} - -func (g *GT) String() string { - return "bn256.GT" + g.p.String() -} - -// ScalarMult sets e to a*k and then returns e. -func (e *GT) ScalarMult(a *GT, k *big.Int) *GT { - if e.p == nil { - e.p = newGFp12(nil) - } - e.p.Exp(a.p, k, new(bnPool)) - return e -} - -// Add sets e to a+b and then returns e. -func (e *GT) Add(a, b *GT) *GT { - if e.p == nil { - e.p = newGFp12(nil) - } - e.p.Mul(a.p, b.p, new(bnPool)) - return e -} - -// Neg sets e to -a and then returns e. -func (e *GT) Neg(a *GT) *GT { - if e.p == nil { - e.p = newGFp12(nil) - } - e.p.Invert(a.p, new(bnPool)) - return e -} - -// Marshal converts n into a byte slice. -func (n *GT) Marshal() []byte { - n.p.Minimal() - - xxxBytes := n.p.x.x.x.Bytes() - xxyBytes := n.p.x.x.y.Bytes() - xyxBytes := n.p.x.y.x.Bytes() - xyyBytes := n.p.x.y.y.Bytes() - xzxBytes := n.p.x.z.x.Bytes() - xzyBytes := n.p.x.z.y.Bytes() - yxxBytes := n.p.y.x.x.Bytes() - yxyBytes := n.p.y.x.y.Bytes() - yyxBytes := n.p.y.y.x.Bytes() - yyyBytes := n.p.y.y.y.Bytes() - yzxBytes := n.p.y.z.x.Bytes() - yzyBytes := n.p.y.z.y.Bytes() - - // Each value is a 256-bit number. - const numBytes = 256 / 8 - - ret := make([]byte, numBytes*12) - copy(ret[1*numBytes-len(xxxBytes):], xxxBytes) - copy(ret[2*numBytes-len(xxyBytes):], xxyBytes) - copy(ret[3*numBytes-len(xyxBytes):], xyxBytes) - copy(ret[4*numBytes-len(xyyBytes):], xyyBytes) - copy(ret[5*numBytes-len(xzxBytes):], xzxBytes) - copy(ret[6*numBytes-len(xzyBytes):], xzyBytes) - copy(ret[7*numBytes-len(yxxBytes):], yxxBytes) - copy(ret[8*numBytes-len(yxyBytes):], yxyBytes) - copy(ret[9*numBytes-len(yyxBytes):], yyxBytes) - copy(ret[10*numBytes-len(yyyBytes):], yyyBytes) - copy(ret[11*numBytes-len(yzxBytes):], yzxBytes) - copy(ret[12*numBytes-len(yzyBytes):], yzyBytes) - - return ret -} - -// Unmarshal sets e to the result of converting the output of Marshal back into -// a group element and then returns e. -func (e *GT) Unmarshal(m []byte) (*GT, bool) { - // Each value is a 256-bit number. - const numBytes = 256 / 8 - - if len(m) != 12*numBytes { - return nil, false - } - - if e.p == nil { - e.p = newGFp12(nil) - } - - e.p.x.x.x.SetBytes(m[0*numBytes : 1*numBytes]) - e.p.x.x.y.SetBytes(m[1*numBytes : 2*numBytes]) - e.p.x.y.x.SetBytes(m[2*numBytes : 3*numBytes]) - e.p.x.y.y.SetBytes(m[3*numBytes : 4*numBytes]) - e.p.x.z.x.SetBytes(m[4*numBytes : 5*numBytes]) - e.p.x.z.y.SetBytes(m[5*numBytes : 6*numBytes]) - e.p.y.x.x.SetBytes(m[6*numBytes : 7*numBytes]) - e.p.y.x.y.SetBytes(m[7*numBytes : 8*numBytes]) - e.p.y.y.x.SetBytes(m[8*numBytes : 9*numBytes]) - e.p.y.y.y.SetBytes(m[9*numBytes : 10*numBytes]) - e.p.y.z.x.SetBytes(m[10*numBytes : 11*numBytes]) - e.p.y.z.y.SetBytes(m[11*numBytes : 12*numBytes]) - - return e, true -} - -// Pair calculates an Optimal Ate pairing. -func Pair(g1 *G1, g2 *G2) *GT { - return >{optimalAte(g2.p, g1.p, new(bnPool))} -} - -// bnPool implements a tiny cache of *big.Int objects that's used to reduce the -// number of allocations made during processing. -type bnPool struct { - bns []*big.Int - count int -} - -func (pool *bnPool) Get() *big.Int { - if pool == nil { - return new(big.Int) - } - - pool.count++ - l := len(pool.bns) - if l == 0 { - return new(big.Int) - } - - bn := pool.bns[l-1] - pool.bns = pool.bns[:l-1] - return bn -} - -func (pool *bnPool) Put(bn *big.Int) { - if pool == nil { - return - } - pool.bns = append(pool.bns, bn) - pool.count-- -} - -func (pool *bnPool) Count() int { - return pool.count -} diff --git a/vendor/golang.org/x/crypto/bn256/bn256_test.go b/vendor/golang.org/x/crypto/bn256/bn256_test.go deleted file mode 100644 index 1cec3884e..000000000 --- a/vendor/golang.org/x/crypto/bn256/bn256_test.go +++ /dev/null @@ -1,304 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bn256 - -import ( - "bytes" - "crypto/rand" - "math/big" - "testing" -) - -func TestGFp2Invert(t *testing.T) { - pool := new(bnPool) - - a := newGFp2(pool) - a.x.SetString("23423492374", 10) - a.y.SetString("12934872398472394827398470", 10) - - inv := newGFp2(pool) - inv.Invert(a, pool) - - b := newGFp2(pool).Mul(inv, a, pool) - if b.x.Int64() != 0 || b.y.Int64() != 1 { - t.Fatalf("bad result for a^-1*a: %s %s", b.x, b.y) - } - - a.Put(pool) - b.Put(pool) - inv.Put(pool) - - if c := pool.Count(); c > 0 { - t.Errorf("Pool count non-zero: %d\n", c) - } -} - -func isZero(n *big.Int) bool { - return new(big.Int).Mod(n, p).Int64() == 0 -} - -func isOne(n *big.Int) bool { - return new(big.Int).Mod(n, p).Int64() == 1 -} - -func TestGFp6Invert(t *testing.T) { - pool := new(bnPool) - - a := newGFp6(pool) - a.x.x.SetString("239487238491", 10) - a.x.y.SetString("2356249827341", 10) - a.y.x.SetString("082659782", 10) - a.y.y.SetString("182703523765", 10) - a.z.x.SetString("978236549263", 10) - a.z.y.SetString("64893242", 10) - - inv := newGFp6(pool) - inv.Invert(a, pool) - - b := newGFp6(pool).Mul(inv, a, pool) - if !isZero(b.x.x) || - !isZero(b.x.y) || - !isZero(b.y.x) || - !isZero(b.y.y) || - !isZero(b.z.x) || - !isOne(b.z.y) { - t.Fatalf("bad result for a^-1*a: %s", b) - } - - a.Put(pool) - b.Put(pool) - inv.Put(pool) - - if c := pool.Count(); c > 0 { - t.Errorf("Pool count non-zero: %d\n", c) - } -} - -func TestGFp12Invert(t *testing.T) { - pool := new(bnPool) - - a := newGFp12(pool) - a.x.x.x.SetString("239846234862342323958623", 10) - a.x.x.y.SetString("2359862352529835623", 10) - a.x.y.x.SetString("928836523", 10) - a.x.y.y.SetString("9856234", 10) - a.x.z.x.SetString("235635286", 10) - a.x.z.y.SetString("5628392833", 10) - a.y.x.x.SetString("252936598265329856238956532167968", 10) - a.y.x.y.SetString("23596239865236954178968", 10) - a.y.y.x.SetString("95421692834", 10) - a.y.y.y.SetString("236548", 10) - a.y.z.x.SetString("924523", 10) - a.y.z.y.SetString("12954623", 10) - - inv := newGFp12(pool) - inv.Invert(a, pool) - - b := newGFp12(pool).Mul(inv, a, pool) - if !isZero(b.x.x.x) || - !isZero(b.x.x.y) || - !isZero(b.x.y.x) || - !isZero(b.x.y.y) || - !isZero(b.x.z.x) || - !isZero(b.x.z.y) || - !isZero(b.y.x.x) || - !isZero(b.y.x.y) || - !isZero(b.y.y.x) || - !isZero(b.y.y.y) || - !isZero(b.y.z.x) || - !isOne(b.y.z.y) { - t.Fatalf("bad result for a^-1*a: %s", b) - } - - a.Put(pool) - b.Put(pool) - inv.Put(pool) - - if c := pool.Count(); c > 0 { - t.Errorf("Pool count non-zero: %d\n", c) - } -} - -func TestCurveImpl(t *testing.T) { - pool := new(bnPool) - - g := &curvePoint{ - pool.Get().SetInt64(1), - pool.Get().SetInt64(-2), - pool.Get().SetInt64(1), - pool.Get().SetInt64(0), - } - - x := pool.Get().SetInt64(32498273234) - X := newCurvePoint(pool).Mul(g, x, pool) - - y := pool.Get().SetInt64(98732423523) - Y := newCurvePoint(pool).Mul(g, y, pool) - - s1 := newCurvePoint(pool).Mul(X, y, pool).MakeAffine(pool) - s2 := newCurvePoint(pool).Mul(Y, x, pool).MakeAffine(pool) - - if s1.x.Cmp(s2.x) != 0 || - s2.x.Cmp(s1.x) != 0 { - t.Errorf("DH points don't match: (%s, %s) (%s, %s)", s1.x, s1.y, s2.x, s2.y) - } - - pool.Put(x) - X.Put(pool) - pool.Put(y) - Y.Put(pool) - s1.Put(pool) - s2.Put(pool) - g.Put(pool) - - if c := pool.Count(); c > 0 { - t.Errorf("Pool count non-zero: %d\n", c) - } -} - -func TestOrderG1(t *testing.T) { - g := new(G1).ScalarBaseMult(Order) - if !g.p.IsInfinity() { - t.Error("G1 has incorrect order") - } - - one := new(G1).ScalarBaseMult(new(big.Int).SetInt64(1)) - g.Add(g, one) - g.p.MakeAffine(nil) - if g.p.x.Cmp(one.p.x) != 0 || g.p.y.Cmp(one.p.y) != 0 { - t.Errorf("1+0 != 1 in G1") - } -} - -func TestOrderG2(t *testing.T) { - g := new(G2).ScalarBaseMult(Order) - if !g.p.IsInfinity() { - t.Error("G2 has incorrect order") - } - - one := new(G2).ScalarBaseMult(new(big.Int).SetInt64(1)) - g.Add(g, one) - g.p.MakeAffine(nil) - if g.p.x.x.Cmp(one.p.x.x) != 0 || - g.p.x.y.Cmp(one.p.x.y) != 0 || - g.p.y.x.Cmp(one.p.y.x) != 0 || - g.p.y.y.Cmp(one.p.y.y) != 0 { - t.Errorf("1+0 != 1 in G2") - } -} - -func TestOrderGT(t *testing.T) { - gt := Pair(&G1{curveGen}, &G2{twistGen}) - g := new(GT).ScalarMult(gt, Order) - if !g.p.IsOne() { - t.Error("GT has incorrect order") - } -} - -func TestBilinearity(t *testing.T) { - for i := 0; i < 2; i++ { - a, p1, _ := RandomG1(rand.Reader) - b, p2, _ := RandomG2(rand.Reader) - e1 := Pair(p1, p2) - - e2 := Pair(&G1{curveGen}, &G2{twistGen}) - e2.ScalarMult(e2, a) - e2.ScalarMult(e2, b) - - minusE2 := new(GT).Neg(e2) - e1.Add(e1, minusE2) - - if !e1.p.IsOne() { - t.Fatalf("bad pairing result: %s", e1) - } - } -} - -func TestG1Marshal(t *testing.T) { - g := new(G1).ScalarBaseMult(new(big.Int).SetInt64(1)) - form := g.Marshal() - _, ok := new(G1).Unmarshal(form) - if !ok { - t.Fatalf("failed to unmarshal") - } - - g.ScalarBaseMult(Order) - form = g.Marshal() - g2, ok := new(G1).Unmarshal(form) - if !ok { - t.Fatalf("failed to unmarshal ∞") - } - if !g2.p.IsInfinity() { - t.Fatalf("∞ unmarshaled incorrectly") - } -} - -func TestG2Marshal(t *testing.T) { - g := new(G2).ScalarBaseMult(new(big.Int).SetInt64(1)) - form := g.Marshal() - _, ok := new(G2).Unmarshal(form) - if !ok { - t.Fatalf("failed to unmarshal") - } - - g.ScalarBaseMult(Order) - form = g.Marshal() - g2, ok := new(G2).Unmarshal(form) - if !ok { - t.Fatalf("failed to unmarshal ∞") - } - if !g2.p.IsInfinity() { - t.Fatalf("∞ unmarshaled incorrectly") - } -} - -func TestG1Identity(t *testing.T) { - g := new(G1).ScalarBaseMult(new(big.Int).SetInt64(0)) - if !g.p.IsInfinity() { - t.Error("failure") - } -} - -func TestG2Identity(t *testing.T) { - g := new(G2).ScalarBaseMult(new(big.Int).SetInt64(0)) - if !g.p.IsInfinity() { - t.Error("failure") - } -} - -func TestTripartiteDiffieHellman(t *testing.T) { - a, _ := rand.Int(rand.Reader, Order) - b, _ := rand.Int(rand.Reader, Order) - c, _ := rand.Int(rand.Reader, Order) - - pa, _ := new(G1).Unmarshal(new(G1).ScalarBaseMult(a).Marshal()) - qa, _ := new(G2).Unmarshal(new(G2).ScalarBaseMult(a).Marshal()) - pb, _ := new(G1).Unmarshal(new(G1).ScalarBaseMult(b).Marshal()) - qb, _ := new(G2).Unmarshal(new(G2).ScalarBaseMult(b).Marshal()) - pc, _ := new(G1).Unmarshal(new(G1).ScalarBaseMult(c).Marshal()) - qc, _ := new(G2).Unmarshal(new(G2).ScalarBaseMult(c).Marshal()) - - k1 := Pair(pb, qc) - k1.ScalarMult(k1, a) - k1Bytes := k1.Marshal() - - k2 := Pair(pc, qa) - k2.ScalarMult(k2, b) - k2Bytes := k2.Marshal() - - k3 := Pair(pa, qb) - k3.ScalarMult(k3, c) - k3Bytes := k3.Marshal() - - if !bytes.Equal(k1Bytes, k2Bytes) || !bytes.Equal(k2Bytes, k3Bytes) { - t.Errorf("keys didn't agree") - } -} - -func BenchmarkPairing(b *testing.B) { - for i := 0; i < b.N; i++ { - Pair(&G1{curveGen}, &G2{twistGen}) - } -} diff --git a/vendor/golang.org/x/crypto/bn256/constants.go b/vendor/golang.org/x/crypto/bn256/constants.go deleted file mode 100644 index 1ccefc498..000000000 --- a/vendor/golang.org/x/crypto/bn256/constants.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bn256 - -import ( - "math/big" -) - -func bigFromBase10(s string) *big.Int { - n, _ := new(big.Int).SetString(s, 10) - return n -} - -// u is the BN parameter that determines the prime: 1868033³. -var u = bigFromBase10("6518589491078791937") - -// p is a prime over which we form a basic field: 36u⁴+36u³+24u²+6u+1. -var p = bigFromBase10("65000549695646603732796438742359905742825358107623003571877145026864184071783") - -// Order is the number of elements in both G₁ and G₂: 36u⁴+36u³+18u²+6u+1. -var Order = bigFromBase10("65000549695646603732796438742359905742570406053903786389881062969044166799969") - -// xiToPMinus1Over6 is ξ^((p-1)/6) where ξ = i+3. -var xiToPMinus1Over6 = &gfP2{bigFromBase10("8669379979083712429711189836753509758585994370025260553045152614783263110636"), bigFromBase10("19998038925833620163537568958541907098007303196759855091367510456613536016040")} - -// xiToPMinus1Over3 is ξ^((p-1)/3) where ξ = i+3. -var xiToPMinus1Over3 = &gfP2{bigFromBase10("26098034838977895781559542626833399156321265654106457577426020397262786167059"), bigFromBase10("15931493369629630809226283458085260090334794394361662678240713231519278691715")} - -// xiToPMinus1Over2 is ξ^((p-1)/2) where ξ = i+3. -var xiToPMinus1Over2 = &gfP2{bigFromBase10("50997318142241922852281555961173165965672272825141804376761836765206060036244"), bigFromBase10("38665955945962842195025998234511023902832543644254935982879660597356748036009")} - -// xiToPSquaredMinus1Over3 is ξ^((p²-1)/3) where ξ = i+3. -var xiToPSquaredMinus1Over3 = bigFromBase10("65000549695646603727810655408050771481677621702948236658134783353303381437752") - -// xiTo2PSquaredMinus2Over3 is ξ^((2p²-2)/3) where ξ = i+3 (a cubic root of unity, mod p). -var xiTo2PSquaredMinus2Over3 = bigFromBase10("4985783334309134261147736404674766913742361673560802634030") - -// xiToPSquaredMinus1Over6 is ξ^((1p²-1)/6) where ξ = i+3 (a cubic root of -1, mod p). -var xiToPSquaredMinus1Over6 = bigFromBase10("65000549695646603727810655408050771481677621702948236658134783353303381437753") - -// xiTo2PMinus2Over3 is ξ^((2p-2)/3) where ξ = i+3. -var xiTo2PMinus2Over3 = &gfP2{bigFromBase10("19885131339612776214803633203834694332692106372356013117629940868870585019582"), bigFromBase10("21645619881471562101905880913352894726728173167203616652430647841922248593627")} diff --git a/vendor/golang.org/x/crypto/bn256/curve.go b/vendor/golang.org/x/crypto/bn256/curve.go deleted file mode 100644 index 55b7063f1..000000000 --- a/vendor/golang.org/x/crypto/bn256/curve.go +++ /dev/null @@ -1,278 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bn256 - -import ( - "math/big" -) - -// curvePoint implements the elliptic curve y²=x³+3. Points are kept in -// Jacobian form and t=z² when valid. G₁ is the set of points of this curve on -// GF(p). -type curvePoint struct { - x, y, z, t *big.Int -} - -var curveB = new(big.Int).SetInt64(3) - -// curveGen is the generator of G₁. -var curveGen = &curvePoint{ - new(big.Int).SetInt64(1), - new(big.Int).SetInt64(-2), - new(big.Int).SetInt64(1), - new(big.Int).SetInt64(1), -} - -func newCurvePoint(pool *bnPool) *curvePoint { - return &curvePoint{ - pool.Get(), - pool.Get(), - pool.Get(), - pool.Get(), - } -} - -func (c *curvePoint) String() string { - c.MakeAffine(new(bnPool)) - return "(" + c.x.String() + ", " + c.y.String() + ")" -} - -func (c *curvePoint) Put(pool *bnPool) { - pool.Put(c.x) - pool.Put(c.y) - pool.Put(c.z) - pool.Put(c.t) -} - -func (c *curvePoint) Set(a *curvePoint) { - c.x.Set(a.x) - c.y.Set(a.y) - c.z.Set(a.z) - c.t.Set(a.t) -} - -// IsOnCurve returns true iff c is on the curve where c must be in affine form. -func (c *curvePoint) IsOnCurve() bool { - yy := new(big.Int).Mul(c.y, c.y) - xxx := new(big.Int).Mul(c.x, c.x) - xxx.Mul(xxx, c.x) - yy.Sub(yy, xxx) - yy.Sub(yy, curveB) - if yy.Sign() < 0 || yy.Cmp(p) >= 0 { - yy.Mod(yy, p) - } - return yy.Sign() == 0 -} - -func (c *curvePoint) SetInfinity() { - c.z.SetInt64(0) -} - -func (c *curvePoint) IsInfinity() bool { - return c.z.Sign() == 0 -} - -func (c *curvePoint) Add(a, b *curvePoint, pool *bnPool) { - if a.IsInfinity() { - c.Set(b) - return - } - if b.IsInfinity() { - c.Set(a) - return - } - - // See http://hyperelliptic.org/EFD/g1p/auto-code/shortw/jacobian-0/addition/add-2007-bl.op3 - - // Normalize the points by replacing a = [x1:y1:z1] and b = [x2:y2:z2] - // by [u1:s1:z1·z2] and [u2:s2:z1·z2] - // where u1 = x1·z2², s1 = y1·z2³ and u1 = x2·z1², s2 = y2·z1³ - z1z1 := pool.Get().Mul(a.z, a.z) - z1z1.Mod(z1z1, p) - z2z2 := pool.Get().Mul(b.z, b.z) - z2z2.Mod(z2z2, p) - u1 := pool.Get().Mul(a.x, z2z2) - u1.Mod(u1, p) - u2 := pool.Get().Mul(b.x, z1z1) - u2.Mod(u2, p) - - t := pool.Get().Mul(b.z, z2z2) - t.Mod(t, p) - s1 := pool.Get().Mul(a.y, t) - s1.Mod(s1, p) - - t.Mul(a.z, z1z1) - t.Mod(t, p) - s2 := pool.Get().Mul(b.y, t) - s2.Mod(s2, p) - - // Compute x = (2h)²(s²-u1-u2) - // where s = (s2-s1)/(u2-u1) is the slope of the line through - // (u1,s1) and (u2,s2). The extra factor 2h = 2(u2-u1) comes from the value of z below. - // This is also: - // 4(s2-s1)² - 4h²(u1+u2) = 4(s2-s1)² - 4h³ - 4h²(2u1) - // = r² - j - 2v - // with the notations below. - h := pool.Get().Sub(u2, u1) - xEqual := h.Sign() == 0 - - t.Add(h, h) - // i = 4h² - i := pool.Get().Mul(t, t) - i.Mod(i, p) - // j = 4h³ - j := pool.Get().Mul(h, i) - j.Mod(j, p) - - t.Sub(s2, s1) - yEqual := t.Sign() == 0 - if xEqual && yEqual { - c.Double(a, pool) - return - } - r := pool.Get().Add(t, t) - - v := pool.Get().Mul(u1, i) - v.Mod(v, p) - - // t4 = 4(s2-s1)² - t4 := pool.Get().Mul(r, r) - t4.Mod(t4, p) - t.Add(v, v) - t6 := pool.Get().Sub(t4, j) - c.x.Sub(t6, t) - - // Set y = -(2h)³(s1 + s*(x/4h²-u1)) - // This is also - // y = - 2·s1·j - (s2-s1)(2x - 2i·u1) = r(v-x) - 2·s1·j - t.Sub(v, c.x) // t7 - t4.Mul(s1, j) // t8 - t4.Mod(t4, p) - t6.Add(t4, t4) // t9 - t4.Mul(r, t) // t10 - t4.Mod(t4, p) - c.y.Sub(t4, t6) - - // Set z = 2(u2-u1)·z1·z2 = 2h·z1·z2 - t.Add(a.z, b.z) // t11 - t4.Mul(t, t) // t12 - t4.Mod(t4, p) - t.Sub(t4, z1z1) // t13 - t4.Sub(t, z2z2) // t14 - c.z.Mul(t4, h) - c.z.Mod(c.z, p) - - pool.Put(z1z1) - pool.Put(z2z2) - pool.Put(u1) - pool.Put(u2) - pool.Put(t) - pool.Put(s1) - pool.Put(s2) - pool.Put(h) - pool.Put(i) - pool.Put(j) - pool.Put(r) - pool.Put(v) - pool.Put(t4) - pool.Put(t6) -} - -func (c *curvePoint) Double(a *curvePoint, pool *bnPool) { - // See http://hyperelliptic.org/EFD/g1p/auto-code/shortw/jacobian-0/doubling/dbl-2009-l.op3 - A := pool.Get().Mul(a.x, a.x) - A.Mod(A, p) - B := pool.Get().Mul(a.y, a.y) - B.Mod(B, p) - C := pool.Get().Mul(B, B) - C.Mod(C, p) - - t := pool.Get().Add(a.x, B) - t2 := pool.Get().Mul(t, t) - t2.Mod(t2, p) - t.Sub(t2, A) - t2.Sub(t, C) - d := pool.Get().Add(t2, t2) - t.Add(A, A) - e := pool.Get().Add(t, A) - f := pool.Get().Mul(e, e) - f.Mod(f, p) - - t.Add(d, d) - c.x.Sub(f, t) - - t.Add(C, C) - t2.Add(t, t) - t.Add(t2, t2) - c.y.Sub(d, c.x) - t2.Mul(e, c.y) - t2.Mod(t2, p) - c.y.Sub(t2, t) - - t.Mul(a.y, a.z) - t.Mod(t, p) - c.z.Add(t, t) - - pool.Put(A) - pool.Put(B) - pool.Put(C) - pool.Put(t) - pool.Put(t2) - pool.Put(d) - pool.Put(e) - pool.Put(f) -} - -func (c *curvePoint) Mul(a *curvePoint, scalar *big.Int, pool *bnPool) *curvePoint { - sum := newCurvePoint(pool) - sum.SetInfinity() - t := newCurvePoint(pool) - - for i := scalar.BitLen(); i >= 0; i-- { - t.Double(sum, pool) - if scalar.Bit(i) != 0 { - sum.Add(t, a, pool) - } else { - sum.Set(t) - } - } - - c.Set(sum) - sum.Put(pool) - t.Put(pool) - return c -} - -func (c *curvePoint) MakeAffine(pool *bnPool) *curvePoint { - if words := c.z.Bits(); len(words) == 1 && words[0] == 1 { - return c - } - - zInv := pool.Get().ModInverse(c.z, p) - t := pool.Get().Mul(c.y, zInv) - t.Mod(t, p) - zInv2 := pool.Get().Mul(zInv, zInv) - zInv2.Mod(zInv2, p) - c.y.Mul(t, zInv2) - c.y.Mod(c.y, p) - t.Mul(c.x, zInv2) - t.Mod(t, p) - c.x.Set(t) - c.z.SetInt64(1) - c.t.SetInt64(1) - - pool.Put(zInv) - pool.Put(t) - pool.Put(zInv2) - - return c -} - -func (c *curvePoint) Negative(a *curvePoint) { - c.x.Set(a.x) - c.y.Neg(a.y) - c.z.Set(a.z) - c.t.SetInt64(0) -} diff --git a/vendor/golang.org/x/crypto/bn256/example_test.go b/vendor/golang.org/x/crypto/bn256/example_test.go deleted file mode 100644 index b2d19807a..000000000 --- a/vendor/golang.org/x/crypto/bn256/example_test.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bn256 - -import ( - "crypto/rand" -) - -func ExamplePair() { - // This implements the tripartite Diffie-Hellman algorithm from "A One - // Round Protocol for Tripartite Diffie-Hellman", A. Joux. - // http://www.springerlink.com/content/cddc57yyva0hburb/fulltext.pdf - - // Each of three parties, a, b and c, generate a private value. - a, _ := rand.Int(rand.Reader, Order) - b, _ := rand.Int(rand.Reader, Order) - c, _ := rand.Int(rand.Reader, Order) - - // Then each party calculates g₁ and g₂ times their private value. - pa := new(G1).ScalarBaseMult(a) - qa := new(G2).ScalarBaseMult(a) - - pb := new(G1).ScalarBaseMult(b) - qb := new(G2).ScalarBaseMult(b) - - pc := new(G1).ScalarBaseMult(c) - qc := new(G2).ScalarBaseMult(c) - - // Now each party exchanges its public values with the other two and - // all parties can calculate the shared key. - k1 := Pair(pb, qc) - k1.ScalarMult(k1, a) - - k2 := Pair(pc, qa) - k2.ScalarMult(k2, b) - - k3 := Pair(pa, qb) - k3.ScalarMult(k3, c) - - // k1, k2 and k3 will all be equal. -} diff --git a/vendor/golang.org/x/crypto/bn256/gfp12.go b/vendor/golang.org/x/crypto/bn256/gfp12.go deleted file mode 100644 index f084eddf2..000000000 --- a/vendor/golang.org/x/crypto/bn256/gfp12.go +++ /dev/null @@ -1,200 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bn256 - -// For details of the algorithms used, see "Multiplication and Squaring on -// Pairing-Friendly Fields, Devegili et al. -// http://eprint.iacr.org/2006/471.pdf. - -import ( - "math/big" -) - -// gfP12 implements the field of size p¹² as a quadratic extension of gfP6 -// where ω²=τ. -type gfP12 struct { - x, y *gfP6 // value is xω + y -} - -func newGFp12(pool *bnPool) *gfP12 { - return &gfP12{newGFp6(pool), newGFp6(pool)} -} - -func (e *gfP12) String() string { - return "(" + e.x.String() + "," + e.y.String() + ")" -} - -func (e *gfP12) Put(pool *bnPool) { - e.x.Put(pool) - e.y.Put(pool) -} - -func (e *gfP12) Set(a *gfP12) *gfP12 { - e.x.Set(a.x) - e.y.Set(a.y) - return e -} - -func (e *gfP12) SetZero() *gfP12 { - e.x.SetZero() - e.y.SetZero() - return e -} - -func (e *gfP12) SetOne() *gfP12 { - e.x.SetZero() - e.y.SetOne() - return e -} - -func (e *gfP12) Minimal() { - e.x.Minimal() - e.y.Minimal() -} - -func (e *gfP12) IsZero() bool { - e.Minimal() - return e.x.IsZero() && e.y.IsZero() -} - -func (e *gfP12) IsOne() bool { - e.Minimal() - return e.x.IsZero() && e.y.IsOne() -} - -func (e *gfP12) Conjugate(a *gfP12) *gfP12 { - e.x.Negative(a.x) - e.y.Set(a.y) - return a -} - -func (e *gfP12) Negative(a *gfP12) *gfP12 { - e.x.Negative(a.x) - e.y.Negative(a.y) - return e -} - -// Frobenius computes (xω+y)^p = x^p ω·ξ^((p-1)/6) + y^p -func (e *gfP12) Frobenius(a *gfP12, pool *bnPool) *gfP12 { - e.x.Frobenius(a.x, pool) - e.y.Frobenius(a.y, pool) - e.x.MulScalar(e.x, xiToPMinus1Over6, pool) - return e -} - -// FrobeniusP2 computes (xω+y)^p² = x^p² ω·ξ^((p²-1)/6) + y^p² -func (e *gfP12) FrobeniusP2(a *gfP12, pool *bnPool) *gfP12 { - e.x.FrobeniusP2(a.x) - e.x.MulGFP(e.x, xiToPSquaredMinus1Over6) - e.y.FrobeniusP2(a.y) - return e -} - -func (e *gfP12) Add(a, b *gfP12) *gfP12 { - e.x.Add(a.x, b.x) - e.y.Add(a.y, b.y) - return e -} - -func (e *gfP12) Sub(a, b *gfP12) *gfP12 { - e.x.Sub(a.x, b.x) - e.y.Sub(a.y, b.y) - return e -} - -func (e *gfP12) Mul(a, b *gfP12, pool *bnPool) *gfP12 { - tx := newGFp6(pool) - tx.Mul(a.x, b.y, pool) - t := newGFp6(pool) - t.Mul(b.x, a.y, pool) - tx.Add(tx, t) - - ty := newGFp6(pool) - ty.Mul(a.y, b.y, pool) - t.Mul(a.x, b.x, pool) - t.MulTau(t, pool) - e.y.Add(ty, t) - e.x.Set(tx) - - tx.Put(pool) - ty.Put(pool) - t.Put(pool) - return e -} - -func (e *gfP12) MulScalar(a *gfP12, b *gfP6, pool *bnPool) *gfP12 { - e.x.Mul(e.x, b, pool) - e.y.Mul(e.y, b, pool) - return e -} - -func (c *gfP12) Exp(a *gfP12, power *big.Int, pool *bnPool) *gfP12 { - sum := newGFp12(pool) - sum.SetOne() - t := newGFp12(pool) - - for i := power.BitLen() - 1; i >= 0; i-- { - t.Square(sum, pool) - if power.Bit(i) != 0 { - sum.Mul(t, a, pool) - } else { - sum.Set(t) - } - } - - c.Set(sum) - - sum.Put(pool) - t.Put(pool) - - return c -} - -func (e *gfP12) Square(a *gfP12, pool *bnPool) *gfP12 { - // Complex squaring algorithm - v0 := newGFp6(pool) - v0.Mul(a.x, a.y, pool) - - t := newGFp6(pool) - t.MulTau(a.x, pool) - t.Add(a.y, t) - ty := newGFp6(pool) - ty.Add(a.x, a.y) - ty.Mul(ty, t, pool) - ty.Sub(ty, v0) - t.MulTau(v0, pool) - ty.Sub(ty, t) - - e.y.Set(ty) - e.x.Double(v0) - - v0.Put(pool) - t.Put(pool) - ty.Put(pool) - - return e -} - -func (e *gfP12) Invert(a *gfP12, pool *bnPool) *gfP12 { - // See "Implementing cryptographic pairings", M. Scott, section 3.2. - // ftp://136.206.11.249/pub/crypto/pairings.pdf - t1 := newGFp6(pool) - t2 := newGFp6(pool) - - t1.Square(a.x, pool) - t2.Square(a.y, pool) - t1.MulTau(t1, pool) - t1.Sub(t2, t1) - t2.Invert(t1, pool) - - e.x.Negative(a.x) - e.y.Set(a.y) - e.MulScalar(e, t2, pool) - - t1.Put(pool) - t2.Put(pool) - - return e -} diff --git a/vendor/golang.org/x/crypto/bn256/gfp2.go b/vendor/golang.org/x/crypto/bn256/gfp2.go deleted file mode 100644 index 97f3f1f3f..000000000 --- a/vendor/golang.org/x/crypto/bn256/gfp2.go +++ /dev/null @@ -1,219 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bn256 - -// For details of the algorithms used, see "Multiplication and Squaring on -// Pairing-Friendly Fields, Devegili et al. -// http://eprint.iacr.org/2006/471.pdf. - -import ( - "math/big" -) - -// gfP2 implements a field of size p² as a quadratic extension of the base -// field where i²=-1. -type gfP2 struct { - x, y *big.Int // value is xi+y. -} - -func newGFp2(pool *bnPool) *gfP2 { - return &gfP2{pool.Get(), pool.Get()} -} - -func (e *gfP2) String() string { - x := new(big.Int).Mod(e.x, p) - y := new(big.Int).Mod(e.y, p) - return "(" + x.String() + "," + y.String() + ")" -} - -func (e *gfP2) Put(pool *bnPool) { - pool.Put(e.x) - pool.Put(e.y) -} - -func (e *gfP2) Set(a *gfP2) *gfP2 { - e.x.Set(a.x) - e.y.Set(a.y) - return e -} - -func (e *gfP2) SetZero() *gfP2 { - e.x.SetInt64(0) - e.y.SetInt64(0) - return e -} - -func (e *gfP2) SetOne() *gfP2 { - e.x.SetInt64(0) - e.y.SetInt64(1) - return e -} - -func (e *gfP2) Minimal() { - if e.x.Sign() < 0 || e.x.Cmp(p) >= 0 { - e.x.Mod(e.x, p) - } - if e.y.Sign() < 0 || e.y.Cmp(p) >= 0 { - e.y.Mod(e.y, p) - } -} - -func (e *gfP2) IsZero() bool { - return e.x.Sign() == 0 && e.y.Sign() == 0 -} - -func (e *gfP2) IsOne() bool { - if e.x.Sign() != 0 { - return false - } - words := e.y.Bits() - return len(words) == 1 && words[0] == 1 -} - -func (e *gfP2) Conjugate(a *gfP2) *gfP2 { - e.y.Set(a.y) - e.x.Neg(a.x) - return e -} - -func (e *gfP2) Negative(a *gfP2) *gfP2 { - e.x.Neg(a.x) - e.y.Neg(a.y) - return e -} - -func (e *gfP2) Add(a, b *gfP2) *gfP2 { - e.x.Add(a.x, b.x) - e.y.Add(a.y, b.y) - return e -} - -func (e *gfP2) Sub(a, b *gfP2) *gfP2 { - e.x.Sub(a.x, b.x) - e.y.Sub(a.y, b.y) - return e -} - -func (e *gfP2) Double(a *gfP2) *gfP2 { - e.x.Lsh(a.x, 1) - e.y.Lsh(a.y, 1) - return e -} - -func (c *gfP2) Exp(a *gfP2, power *big.Int, pool *bnPool) *gfP2 { - sum := newGFp2(pool) - sum.SetOne() - t := newGFp2(pool) - - for i := power.BitLen() - 1; i >= 0; i-- { - t.Square(sum, pool) - if power.Bit(i) != 0 { - sum.Mul(t, a, pool) - } else { - sum.Set(t) - } - } - - c.Set(sum) - - sum.Put(pool) - t.Put(pool) - - return c -} - -// See "Multiplication and Squaring in Pairing-Friendly Fields", -// http://eprint.iacr.org/2006/471.pdf -func (e *gfP2) Mul(a, b *gfP2, pool *bnPool) *gfP2 { - tx := pool.Get().Mul(a.x, b.y) - t := pool.Get().Mul(b.x, a.y) - tx.Add(tx, t) - tx.Mod(tx, p) - - ty := pool.Get().Mul(a.y, b.y) - t.Mul(a.x, b.x) - ty.Sub(ty, t) - e.y.Mod(ty, p) - e.x.Set(tx) - - pool.Put(tx) - pool.Put(ty) - pool.Put(t) - - return e -} - -func (e *gfP2) MulScalar(a *gfP2, b *big.Int) *gfP2 { - e.x.Mul(a.x, b) - e.y.Mul(a.y, b) - return e -} - -// MulXi sets e=ξa where ξ=i+3 and then returns e. -func (e *gfP2) MulXi(a *gfP2, pool *bnPool) *gfP2 { - // (xi+y)(i+3) = (3x+y)i+(3y-x) - tx := pool.Get().Lsh(a.x, 1) - tx.Add(tx, a.x) - tx.Add(tx, a.y) - - ty := pool.Get().Lsh(a.y, 1) - ty.Add(ty, a.y) - ty.Sub(ty, a.x) - - e.x.Set(tx) - e.y.Set(ty) - - pool.Put(tx) - pool.Put(ty) - - return e -} - -func (e *gfP2) Square(a *gfP2, pool *bnPool) *gfP2 { - // Complex squaring algorithm: - // (xi+b)² = (x+y)(y-x) + 2*i*x*y - t1 := pool.Get().Sub(a.y, a.x) - t2 := pool.Get().Add(a.x, a.y) - ty := pool.Get().Mul(t1, t2) - ty.Mod(ty, p) - - t1.Mul(a.x, a.y) - t1.Lsh(t1, 1) - - e.x.Mod(t1, p) - e.y.Set(ty) - - pool.Put(t1) - pool.Put(t2) - pool.Put(ty) - - return e -} - -func (e *gfP2) Invert(a *gfP2, pool *bnPool) *gfP2 { - // See "Implementing cryptographic pairings", M. Scott, section 3.2. - // ftp://136.206.11.249/pub/crypto/pairings.pdf - t := pool.Get() - t.Mul(a.y, a.y) - t2 := pool.Get() - t2.Mul(a.x, a.x) - t.Add(t, t2) - - inv := pool.Get() - inv.ModInverse(t, p) - - e.x.Neg(a.x) - e.x.Mul(e.x, inv) - e.x.Mod(e.x, p) - - e.y.Mul(a.y, inv) - e.y.Mod(e.y, p) - - pool.Put(t) - pool.Put(t2) - pool.Put(inv) - - return e -} diff --git a/vendor/golang.org/x/crypto/bn256/gfp6.go b/vendor/golang.org/x/crypto/bn256/gfp6.go deleted file mode 100644 index f98ae782c..000000000 --- a/vendor/golang.org/x/crypto/bn256/gfp6.go +++ /dev/null @@ -1,296 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bn256 - -// For details of the algorithms used, see "Multiplication and Squaring on -// Pairing-Friendly Fields, Devegili et al. -// http://eprint.iacr.org/2006/471.pdf. - -import ( - "math/big" -) - -// gfP6 implements the field of size p⁶ as a cubic extension of gfP2 where τ³=ξ -// and ξ=i+3. -type gfP6 struct { - x, y, z *gfP2 // value is xτ² + yτ + z -} - -func newGFp6(pool *bnPool) *gfP6 { - return &gfP6{newGFp2(pool), newGFp2(pool), newGFp2(pool)} -} - -func (e *gfP6) String() string { - return "(" + e.x.String() + "," + e.y.String() + "," + e.z.String() + ")" -} - -func (e *gfP6) Put(pool *bnPool) { - e.x.Put(pool) - e.y.Put(pool) - e.z.Put(pool) -} - -func (e *gfP6) Set(a *gfP6) *gfP6 { - e.x.Set(a.x) - e.y.Set(a.y) - e.z.Set(a.z) - return e -} - -func (e *gfP6) SetZero() *gfP6 { - e.x.SetZero() - e.y.SetZero() - e.z.SetZero() - return e -} - -func (e *gfP6) SetOne() *gfP6 { - e.x.SetZero() - e.y.SetZero() - e.z.SetOne() - return e -} - -func (e *gfP6) Minimal() { - e.x.Minimal() - e.y.Minimal() - e.z.Minimal() -} - -func (e *gfP6) IsZero() bool { - return e.x.IsZero() && e.y.IsZero() && e.z.IsZero() -} - -func (e *gfP6) IsOne() bool { - return e.x.IsZero() && e.y.IsZero() && e.z.IsOne() -} - -func (e *gfP6) Negative(a *gfP6) *gfP6 { - e.x.Negative(a.x) - e.y.Negative(a.y) - e.z.Negative(a.z) - return e -} - -func (e *gfP6) Frobenius(a *gfP6, pool *bnPool) *gfP6 { - e.x.Conjugate(a.x) - e.y.Conjugate(a.y) - e.z.Conjugate(a.z) - - e.x.Mul(e.x, xiTo2PMinus2Over3, pool) - e.y.Mul(e.y, xiToPMinus1Over3, pool) - return e -} - -// FrobeniusP2 computes (xτ²+yτ+z)^(p²) = xτ^(2p²) + yτ^(p²) + z -func (e *gfP6) FrobeniusP2(a *gfP6) *gfP6 { - // τ^(2p²) = τ²τ^(2p²-2) = τ²ξ^((2p²-2)/3) - e.x.MulScalar(a.x, xiTo2PSquaredMinus2Over3) - // τ^(p²) = ττ^(p²-1) = τξ^((p²-1)/3) - e.y.MulScalar(a.y, xiToPSquaredMinus1Over3) - e.z.Set(a.z) - return e -} - -func (e *gfP6) Add(a, b *gfP6) *gfP6 { - e.x.Add(a.x, b.x) - e.y.Add(a.y, b.y) - e.z.Add(a.z, b.z) - return e -} - -func (e *gfP6) Sub(a, b *gfP6) *gfP6 { - e.x.Sub(a.x, b.x) - e.y.Sub(a.y, b.y) - e.z.Sub(a.z, b.z) - return e -} - -func (e *gfP6) Double(a *gfP6) *gfP6 { - e.x.Double(a.x) - e.y.Double(a.y) - e.z.Double(a.z) - return e -} - -func (e *gfP6) Mul(a, b *gfP6, pool *bnPool) *gfP6 { - // "Multiplication and Squaring on Pairing-Friendly Fields" - // Section 4, Karatsuba method. - // http://eprint.iacr.org/2006/471.pdf - - v0 := newGFp2(pool) - v0.Mul(a.z, b.z, pool) - v1 := newGFp2(pool) - v1.Mul(a.y, b.y, pool) - v2 := newGFp2(pool) - v2.Mul(a.x, b.x, pool) - - t0 := newGFp2(pool) - t0.Add(a.x, a.y) - t1 := newGFp2(pool) - t1.Add(b.x, b.y) - tz := newGFp2(pool) - tz.Mul(t0, t1, pool) - - tz.Sub(tz, v1) - tz.Sub(tz, v2) - tz.MulXi(tz, pool) - tz.Add(tz, v0) - - t0.Add(a.y, a.z) - t1.Add(b.y, b.z) - ty := newGFp2(pool) - ty.Mul(t0, t1, pool) - ty.Sub(ty, v0) - ty.Sub(ty, v1) - t0.MulXi(v2, pool) - ty.Add(ty, t0) - - t0.Add(a.x, a.z) - t1.Add(b.x, b.z) - tx := newGFp2(pool) - tx.Mul(t0, t1, pool) - tx.Sub(tx, v0) - tx.Add(tx, v1) - tx.Sub(tx, v2) - - e.x.Set(tx) - e.y.Set(ty) - e.z.Set(tz) - - t0.Put(pool) - t1.Put(pool) - tx.Put(pool) - ty.Put(pool) - tz.Put(pool) - v0.Put(pool) - v1.Put(pool) - v2.Put(pool) - return e -} - -func (e *gfP6) MulScalar(a *gfP6, b *gfP2, pool *bnPool) *gfP6 { - e.x.Mul(a.x, b, pool) - e.y.Mul(a.y, b, pool) - e.z.Mul(a.z, b, pool) - return e -} - -func (e *gfP6) MulGFP(a *gfP6, b *big.Int) *gfP6 { - e.x.MulScalar(a.x, b) - e.y.MulScalar(a.y, b) - e.z.MulScalar(a.z, b) - return e -} - -// MulTau computes τ·(aτ²+bτ+c) = bτ²+cτ+aξ -func (e *gfP6) MulTau(a *gfP6, pool *bnPool) { - tz := newGFp2(pool) - tz.MulXi(a.x, pool) - ty := newGFp2(pool) - ty.Set(a.y) - e.y.Set(a.z) - e.x.Set(ty) - e.z.Set(tz) - tz.Put(pool) - ty.Put(pool) -} - -func (e *gfP6) Square(a *gfP6, pool *bnPool) *gfP6 { - v0 := newGFp2(pool).Square(a.z, pool) - v1 := newGFp2(pool).Square(a.y, pool) - v2 := newGFp2(pool).Square(a.x, pool) - - c0 := newGFp2(pool).Add(a.x, a.y) - c0.Square(c0, pool) - c0.Sub(c0, v1) - c0.Sub(c0, v2) - c0.MulXi(c0, pool) - c0.Add(c0, v0) - - c1 := newGFp2(pool).Add(a.y, a.z) - c1.Square(c1, pool) - c1.Sub(c1, v0) - c1.Sub(c1, v1) - xiV2 := newGFp2(pool).MulXi(v2, pool) - c1.Add(c1, xiV2) - - c2 := newGFp2(pool).Add(a.x, a.z) - c2.Square(c2, pool) - c2.Sub(c2, v0) - c2.Add(c2, v1) - c2.Sub(c2, v2) - - e.x.Set(c2) - e.y.Set(c1) - e.z.Set(c0) - - v0.Put(pool) - v1.Put(pool) - v2.Put(pool) - c0.Put(pool) - c1.Put(pool) - c2.Put(pool) - xiV2.Put(pool) - - return e -} - -func (e *gfP6) Invert(a *gfP6, pool *bnPool) *gfP6 { - // See "Implementing cryptographic pairings", M. Scott, section 3.2. - // ftp://136.206.11.249/pub/crypto/pairings.pdf - - // Here we can give a short explanation of how it works: let j be a cubic root of - // unity in GF(p²) so that 1+j+j²=0. - // Then (xτ² + yτ + z)(xj²τ² + yjτ + z)(xjτ² + yj²τ + z) - // = (xτ² + yτ + z)(Cτ²+Bτ+A) - // = (x³ξ²+y³ξ+z³-3ξxyz) = F is an element of the base field (the norm). - // - // On the other hand (xj²τ² + yjτ + z)(xjτ² + yj²τ + z) - // = τ²(y²-ξxz) + τ(ξx²-yz) + (z²-ξxy) - // - // So that's why A = (z²-ξxy), B = (ξx²-yz), C = (y²-ξxz) - t1 := newGFp2(pool) - - A := newGFp2(pool) - A.Square(a.z, pool) - t1.Mul(a.x, a.y, pool) - t1.MulXi(t1, pool) - A.Sub(A, t1) - - B := newGFp2(pool) - B.Square(a.x, pool) - B.MulXi(B, pool) - t1.Mul(a.y, a.z, pool) - B.Sub(B, t1) - - C := newGFp2(pool) - C.Square(a.y, pool) - t1.Mul(a.x, a.z, pool) - C.Sub(C, t1) - - F := newGFp2(pool) - F.Mul(C, a.y, pool) - F.MulXi(F, pool) - t1.Mul(A, a.z, pool) - F.Add(F, t1) - t1.Mul(B, a.x, pool) - t1.MulXi(t1, pool) - F.Add(F, t1) - - F.Invert(F, pool) - - e.x.Mul(C, F, pool) - e.y.Mul(B, F, pool) - e.z.Mul(A, F, pool) - - t1.Put(pool) - A.Put(pool) - B.Put(pool) - C.Put(pool) - F.Put(pool) - - return e -} diff --git a/vendor/golang.org/x/crypto/bn256/optate.go b/vendor/golang.org/x/crypto/bn256/optate.go deleted file mode 100644 index 7ae0746eb..000000000 --- a/vendor/golang.org/x/crypto/bn256/optate.go +++ /dev/null @@ -1,395 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bn256 - -func lineFunctionAdd(r, p *twistPoint, q *curvePoint, r2 *gfP2, pool *bnPool) (a, b, c *gfP2, rOut *twistPoint) { - // See the mixed addition algorithm from "Faster Computation of the - // Tate Pairing", http://arxiv.org/pdf/0904.0854v3.pdf - - B := newGFp2(pool).Mul(p.x, r.t, pool) - - D := newGFp2(pool).Add(p.y, r.z) - D.Square(D, pool) - D.Sub(D, r2) - D.Sub(D, r.t) - D.Mul(D, r.t, pool) - - H := newGFp2(pool).Sub(B, r.x) - I := newGFp2(pool).Square(H, pool) - - E := newGFp2(pool).Add(I, I) - E.Add(E, E) - - J := newGFp2(pool).Mul(H, E, pool) - - L1 := newGFp2(pool).Sub(D, r.y) - L1.Sub(L1, r.y) - - V := newGFp2(pool).Mul(r.x, E, pool) - - rOut = newTwistPoint(pool) - rOut.x.Square(L1, pool) - rOut.x.Sub(rOut.x, J) - rOut.x.Sub(rOut.x, V) - rOut.x.Sub(rOut.x, V) - - rOut.z.Add(r.z, H) - rOut.z.Square(rOut.z, pool) - rOut.z.Sub(rOut.z, r.t) - rOut.z.Sub(rOut.z, I) - - t := newGFp2(pool).Sub(V, rOut.x) - t.Mul(t, L1, pool) - t2 := newGFp2(pool).Mul(r.y, J, pool) - t2.Add(t2, t2) - rOut.y.Sub(t, t2) - - rOut.t.Square(rOut.z, pool) - - t.Add(p.y, rOut.z) - t.Square(t, pool) - t.Sub(t, r2) - t.Sub(t, rOut.t) - - t2.Mul(L1, p.x, pool) - t2.Add(t2, t2) - a = newGFp2(pool) - a.Sub(t2, t) - - c = newGFp2(pool) - c.MulScalar(rOut.z, q.y) - c.Add(c, c) - - b = newGFp2(pool) - b.SetZero() - b.Sub(b, L1) - b.MulScalar(b, q.x) - b.Add(b, b) - - B.Put(pool) - D.Put(pool) - H.Put(pool) - I.Put(pool) - E.Put(pool) - J.Put(pool) - L1.Put(pool) - V.Put(pool) - t.Put(pool) - t2.Put(pool) - - return -} - -func lineFunctionDouble(r *twistPoint, q *curvePoint, pool *bnPool) (a, b, c *gfP2, rOut *twistPoint) { - // See the doubling algorithm for a=0 from "Faster Computation of the - // Tate Pairing", http://arxiv.org/pdf/0904.0854v3.pdf - - A := newGFp2(pool).Square(r.x, pool) - B := newGFp2(pool).Square(r.y, pool) - C := newGFp2(pool).Square(B, pool) - - D := newGFp2(pool).Add(r.x, B) - D.Square(D, pool) - D.Sub(D, A) - D.Sub(D, C) - D.Add(D, D) - - E := newGFp2(pool).Add(A, A) - E.Add(E, A) - - G := newGFp2(pool).Square(E, pool) - - rOut = newTwistPoint(pool) - rOut.x.Sub(G, D) - rOut.x.Sub(rOut.x, D) - - rOut.z.Add(r.y, r.z) - rOut.z.Square(rOut.z, pool) - rOut.z.Sub(rOut.z, B) - rOut.z.Sub(rOut.z, r.t) - - rOut.y.Sub(D, rOut.x) - rOut.y.Mul(rOut.y, E, pool) - t := newGFp2(pool).Add(C, C) - t.Add(t, t) - t.Add(t, t) - rOut.y.Sub(rOut.y, t) - - rOut.t.Square(rOut.z, pool) - - t.Mul(E, r.t, pool) - t.Add(t, t) - b = newGFp2(pool) - b.SetZero() - b.Sub(b, t) - b.MulScalar(b, q.x) - - a = newGFp2(pool) - a.Add(r.x, E) - a.Square(a, pool) - a.Sub(a, A) - a.Sub(a, G) - t.Add(B, B) - t.Add(t, t) - a.Sub(a, t) - - c = newGFp2(pool) - c.Mul(rOut.z, r.t, pool) - c.Add(c, c) - c.MulScalar(c, q.y) - - A.Put(pool) - B.Put(pool) - C.Put(pool) - D.Put(pool) - E.Put(pool) - G.Put(pool) - t.Put(pool) - - return -} - -func mulLine(ret *gfP12, a, b, c *gfP2, pool *bnPool) { - a2 := newGFp6(pool) - a2.x.SetZero() - a2.y.Set(a) - a2.z.Set(b) - a2.Mul(a2, ret.x, pool) - t3 := newGFp6(pool).MulScalar(ret.y, c, pool) - - t := newGFp2(pool) - t.Add(b, c) - t2 := newGFp6(pool) - t2.x.SetZero() - t2.y.Set(a) - t2.z.Set(t) - ret.x.Add(ret.x, ret.y) - - ret.y.Set(t3) - - ret.x.Mul(ret.x, t2, pool) - ret.x.Sub(ret.x, a2) - ret.x.Sub(ret.x, ret.y) - a2.MulTau(a2, pool) - ret.y.Add(ret.y, a2) - - a2.Put(pool) - t3.Put(pool) - t2.Put(pool) - t.Put(pool) -} - -// sixuPlus2NAF is 6u+2 in non-adjacent form. -var sixuPlus2NAF = []int8{0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, -1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, -1, 0, 1, 0, 0, 0, 1, 0, -1, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, -1, 0, 0, 0, 0, 1, 0, 0, 0, 1} - -// miller implements the Miller loop for calculating the Optimal Ate pairing. -// See algorithm 1 from http://cryptojedi.org/papers/dclxvi-20100714.pdf -func miller(q *twistPoint, p *curvePoint, pool *bnPool) *gfP12 { - ret := newGFp12(pool) - ret.SetOne() - - aAffine := newTwistPoint(pool) - aAffine.Set(q) - aAffine.MakeAffine(pool) - - bAffine := newCurvePoint(pool) - bAffine.Set(p) - bAffine.MakeAffine(pool) - - minusA := newTwistPoint(pool) - minusA.Negative(aAffine, pool) - - r := newTwistPoint(pool) - r.Set(aAffine) - - r2 := newGFp2(pool) - r2.Square(aAffine.y, pool) - - for i := len(sixuPlus2NAF) - 1; i > 0; i-- { - a, b, c, newR := lineFunctionDouble(r, bAffine, pool) - if i != len(sixuPlus2NAF)-1 { - ret.Square(ret, pool) - } - - mulLine(ret, a, b, c, pool) - a.Put(pool) - b.Put(pool) - c.Put(pool) - r.Put(pool) - r = newR - - switch sixuPlus2NAF[i-1] { - case 1: - a, b, c, newR = lineFunctionAdd(r, aAffine, bAffine, r2, pool) - case -1: - a, b, c, newR = lineFunctionAdd(r, minusA, bAffine, r2, pool) - default: - continue - } - - mulLine(ret, a, b, c, pool) - a.Put(pool) - b.Put(pool) - c.Put(pool) - r.Put(pool) - r = newR - } - - // In order to calculate Q1 we have to convert q from the sextic twist - // to the full GF(p^12) group, apply the Frobenius there, and convert - // back. - // - // The twist isomorphism is (x', y') -> (xω², yω³). If we consider just - // x for a moment, then after applying the Frobenius, we have x̄ω^(2p) - // where x̄ is the conjugate of x. If we are going to apply the inverse - // isomorphism we need a value with a single coefficient of ω² so we - // rewrite this as x̄ω^(2p-2)ω². ξ⁶ = ω and, due to the construction of - // p, 2p-2 is a multiple of six. Therefore we can rewrite as - // x̄ξ^((p-1)/3)ω² and applying the inverse isomorphism eliminates the - // ω². - // - // A similar argument can be made for the y value. - - q1 := newTwistPoint(pool) - q1.x.Conjugate(aAffine.x) - q1.x.Mul(q1.x, xiToPMinus1Over3, pool) - q1.y.Conjugate(aAffine.y) - q1.y.Mul(q1.y, xiToPMinus1Over2, pool) - q1.z.SetOne() - q1.t.SetOne() - - // For Q2 we are applying the p² Frobenius. The two conjugations cancel - // out and we are left only with the factors from the isomorphism. In - // the case of x, we end up with a pure number which is why - // xiToPSquaredMinus1Over3 is ∈ GF(p). With y we get a factor of -1. We - // ignore this to end up with -Q2. - - minusQ2 := newTwistPoint(pool) - minusQ2.x.MulScalar(aAffine.x, xiToPSquaredMinus1Over3) - minusQ2.y.Set(aAffine.y) - minusQ2.z.SetOne() - minusQ2.t.SetOne() - - r2.Square(q1.y, pool) - a, b, c, newR := lineFunctionAdd(r, q1, bAffine, r2, pool) - mulLine(ret, a, b, c, pool) - a.Put(pool) - b.Put(pool) - c.Put(pool) - r.Put(pool) - r = newR - - r2.Square(minusQ2.y, pool) - a, b, c, newR = lineFunctionAdd(r, minusQ2, bAffine, r2, pool) - mulLine(ret, a, b, c, pool) - a.Put(pool) - b.Put(pool) - c.Put(pool) - r.Put(pool) - r = newR - - aAffine.Put(pool) - bAffine.Put(pool) - minusA.Put(pool) - r.Put(pool) - r2.Put(pool) - - return ret -} - -// finalExponentiation computes the (p¹²-1)/Order-th power of an element of -// GF(p¹²) to obtain an element of GT (steps 13-15 of algorithm 1 from -// http://cryptojedi.org/papers/dclxvi-20100714.pdf) -func finalExponentiation(in *gfP12, pool *bnPool) *gfP12 { - t1 := newGFp12(pool) - - // This is the p^6-Frobenius - t1.x.Negative(in.x) - t1.y.Set(in.y) - - inv := newGFp12(pool) - inv.Invert(in, pool) - t1.Mul(t1, inv, pool) - - t2 := newGFp12(pool).FrobeniusP2(t1, pool) - t1.Mul(t1, t2, pool) - - fp := newGFp12(pool).Frobenius(t1, pool) - fp2 := newGFp12(pool).FrobeniusP2(t1, pool) - fp3 := newGFp12(pool).Frobenius(fp2, pool) - - fu, fu2, fu3 := newGFp12(pool), newGFp12(pool), newGFp12(pool) - fu.Exp(t1, u, pool) - fu2.Exp(fu, u, pool) - fu3.Exp(fu2, u, pool) - - y3 := newGFp12(pool).Frobenius(fu, pool) - fu2p := newGFp12(pool).Frobenius(fu2, pool) - fu3p := newGFp12(pool).Frobenius(fu3, pool) - y2 := newGFp12(pool).FrobeniusP2(fu2, pool) - - y0 := newGFp12(pool) - y0.Mul(fp, fp2, pool) - y0.Mul(y0, fp3, pool) - - y1, y4, y5 := newGFp12(pool), newGFp12(pool), newGFp12(pool) - y1.Conjugate(t1) - y5.Conjugate(fu2) - y3.Conjugate(y3) - y4.Mul(fu, fu2p, pool) - y4.Conjugate(y4) - - y6 := newGFp12(pool) - y6.Mul(fu3, fu3p, pool) - y6.Conjugate(y6) - - t0 := newGFp12(pool) - t0.Square(y6, pool) - t0.Mul(t0, y4, pool) - t0.Mul(t0, y5, pool) - t1.Mul(y3, y5, pool) - t1.Mul(t1, t0, pool) - t0.Mul(t0, y2, pool) - t1.Square(t1, pool) - t1.Mul(t1, t0, pool) - t1.Square(t1, pool) - t0.Mul(t1, y1, pool) - t1.Mul(t1, y0, pool) - t0.Square(t0, pool) - t0.Mul(t0, t1, pool) - - inv.Put(pool) - t1.Put(pool) - t2.Put(pool) - fp.Put(pool) - fp2.Put(pool) - fp3.Put(pool) - fu.Put(pool) - fu2.Put(pool) - fu3.Put(pool) - fu2p.Put(pool) - fu3p.Put(pool) - y0.Put(pool) - y1.Put(pool) - y2.Put(pool) - y3.Put(pool) - y4.Put(pool) - y5.Put(pool) - y6.Put(pool) - - return t0 -} - -func optimalAte(a *twistPoint, b *curvePoint, pool *bnPool) *gfP12 { - e := miller(a, b, pool) - ret := finalExponentiation(e, pool) - e.Put(pool) - - if a.IsInfinity() || b.IsInfinity() { - ret.SetOne() - } - - return ret -} diff --git a/vendor/golang.org/x/crypto/bn256/twist.go b/vendor/golang.org/x/crypto/bn256/twist.go deleted file mode 100644 index 4f8b3fede..000000000 --- a/vendor/golang.org/x/crypto/bn256/twist.go +++ /dev/null @@ -1,249 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bn256 - -import ( - "math/big" -) - -// twistPoint implements the elliptic curve y²=x³+3/ξ over GF(p²). Points are -// kept in Jacobian form and t=z² when valid. The group G₂ is the set of -// n-torsion points of this curve over GF(p²) (where n = Order) -type twistPoint struct { - x, y, z, t *gfP2 -} - -var twistB = &gfP2{ - bigFromBase10("6500054969564660373279643874235990574282535810762300357187714502686418407178"), - bigFromBase10("45500384786952622612957507119651934019977750675336102500314001518804928850249"), -} - -// twistGen is the generator of group G₂. -var twistGen = &twistPoint{ - &gfP2{ - bigFromBase10("21167961636542580255011770066570541300993051739349375019639421053990175267184"), - bigFromBase10("64746500191241794695844075326670126197795977525365406531717464316923369116492"), - }, - &gfP2{ - bigFromBase10("20666913350058776956210519119118544732556678129809273996262322366050359951122"), - bigFromBase10("17778617556404439934652658462602675281523610326338642107814333856843981424549"), - }, - &gfP2{ - bigFromBase10("0"), - bigFromBase10("1"), - }, - &gfP2{ - bigFromBase10("0"), - bigFromBase10("1"), - }, -} - -func newTwistPoint(pool *bnPool) *twistPoint { - return &twistPoint{ - newGFp2(pool), - newGFp2(pool), - newGFp2(pool), - newGFp2(pool), - } -} - -func (c *twistPoint) String() string { - return "(" + c.x.String() + ", " + c.y.String() + ", " + c.z.String() + ")" -} - -func (c *twistPoint) Put(pool *bnPool) { - c.x.Put(pool) - c.y.Put(pool) - c.z.Put(pool) - c.t.Put(pool) -} - -func (c *twistPoint) Set(a *twistPoint) { - c.x.Set(a.x) - c.y.Set(a.y) - c.z.Set(a.z) - c.t.Set(a.t) -} - -// IsOnCurve returns true iff c is on the curve where c must be in affine form. -func (c *twistPoint) IsOnCurve() bool { - pool := new(bnPool) - yy := newGFp2(pool).Square(c.y, pool) - xxx := newGFp2(pool).Square(c.x, pool) - xxx.Mul(xxx, c.x, pool) - yy.Sub(yy, xxx) - yy.Sub(yy, twistB) - yy.Minimal() - return yy.x.Sign() == 0 && yy.y.Sign() == 0 -} - -func (c *twistPoint) SetInfinity() { - c.z.SetZero() -} - -func (c *twistPoint) IsInfinity() bool { - return c.z.IsZero() -} - -func (c *twistPoint) Add(a, b *twistPoint, pool *bnPool) { - // For additional comments, see the same function in curve.go. - - if a.IsInfinity() { - c.Set(b) - return - } - if b.IsInfinity() { - c.Set(a) - return - } - - // See http://hyperelliptic.org/EFD/g1p/auto-code/shortw/jacobian-0/addition/add-2007-bl.op3 - z1z1 := newGFp2(pool).Square(a.z, pool) - z2z2 := newGFp2(pool).Square(b.z, pool) - u1 := newGFp2(pool).Mul(a.x, z2z2, pool) - u2 := newGFp2(pool).Mul(b.x, z1z1, pool) - - t := newGFp2(pool).Mul(b.z, z2z2, pool) - s1 := newGFp2(pool).Mul(a.y, t, pool) - - t.Mul(a.z, z1z1, pool) - s2 := newGFp2(pool).Mul(b.y, t, pool) - - h := newGFp2(pool).Sub(u2, u1) - xEqual := h.IsZero() - - t.Add(h, h) - i := newGFp2(pool).Square(t, pool) - j := newGFp2(pool).Mul(h, i, pool) - - t.Sub(s2, s1) - yEqual := t.IsZero() - if xEqual && yEqual { - c.Double(a, pool) - return - } - r := newGFp2(pool).Add(t, t) - - v := newGFp2(pool).Mul(u1, i, pool) - - t4 := newGFp2(pool).Square(r, pool) - t.Add(v, v) - t6 := newGFp2(pool).Sub(t4, j) - c.x.Sub(t6, t) - - t.Sub(v, c.x) // t7 - t4.Mul(s1, j, pool) // t8 - t6.Add(t4, t4) // t9 - t4.Mul(r, t, pool) // t10 - c.y.Sub(t4, t6) - - t.Add(a.z, b.z) // t11 - t4.Square(t, pool) // t12 - t.Sub(t4, z1z1) // t13 - t4.Sub(t, z2z2) // t14 - c.z.Mul(t4, h, pool) - - z1z1.Put(pool) - z2z2.Put(pool) - u1.Put(pool) - u2.Put(pool) - t.Put(pool) - s1.Put(pool) - s2.Put(pool) - h.Put(pool) - i.Put(pool) - j.Put(pool) - r.Put(pool) - v.Put(pool) - t4.Put(pool) - t6.Put(pool) -} - -func (c *twistPoint) Double(a *twistPoint, pool *bnPool) { - // See http://hyperelliptic.org/EFD/g1p/auto-code/shortw/jacobian-0/doubling/dbl-2009-l.op3 - A := newGFp2(pool).Square(a.x, pool) - B := newGFp2(pool).Square(a.y, pool) - C := newGFp2(pool).Square(B, pool) - - t := newGFp2(pool).Add(a.x, B) - t2 := newGFp2(pool).Square(t, pool) - t.Sub(t2, A) - t2.Sub(t, C) - d := newGFp2(pool).Add(t2, t2) - t.Add(A, A) - e := newGFp2(pool).Add(t, A) - f := newGFp2(pool).Square(e, pool) - - t.Add(d, d) - c.x.Sub(f, t) - - t.Add(C, C) - t2.Add(t, t) - t.Add(t2, t2) - c.y.Sub(d, c.x) - t2.Mul(e, c.y, pool) - c.y.Sub(t2, t) - - t.Mul(a.y, a.z, pool) - c.z.Add(t, t) - - A.Put(pool) - B.Put(pool) - C.Put(pool) - t.Put(pool) - t2.Put(pool) - d.Put(pool) - e.Put(pool) - f.Put(pool) -} - -func (c *twistPoint) Mul(a *twistPoint, scalar *big.Int, pool *bnPool) *twistPoint { - sum := newTwistPoint(pool) - sum.SetInfinity() - t := newTwistPoint(pool) - - for i := scalar.BitLen(); i >= 0; i-- { - t.Double(sum, pool) - if scalar.Bit(i) != 0 { - sum.Add(t, a, pool) - } else { - sum.Set(t) - } - } - - c.Set(sum) - sum.Put(pool) - t.Put(pool) - return c -} - -func (c *twistPoint) MakeAffine(pool *bnPool) *twistPoint { - if c.z.IsOne() { - return c - } - - zInv := newGFp2(pool).Invert(c.z, pool) - t := newGFp2(pool).Mul(c.y, zInv, pool) - zInv2 := newGFp2(pool).Square(zInv, pool) - c.y.Mul(t, zInv2, pool) - t.Mul(c.x, zInv2, pool) - c.x.Set(t) - c.z.SetOne() - c.t.SetOne() - - zInv.Put(pool) - t.Put(pool) - zInv2.Put(pool) - - return c -} - -func (c *twistPoint) Negative(a *twistPoint, pool *bnPool) { - c.x.Set(a.x) - c.y.SetZero() - c.y.Sub(c.y, a.y) - c.z.Set(a.z) - c.t.SetZero() -} diff --git a/vendor/golang.org/x/crypto/cast5/cast5.go b/vendor/golang.org/x/crypto/cast5/cast5.go deleted file mode 100644 index 0b4af37bd..000000000 --- a/vendor/golang.org/x/crypto/cast5/cast5.go +++ /dev/null @@ -1,526 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package cast5 implements CAST5, as defined in RFC 2144. CAST5 is a common -// OpenPGP cipher. -package cast5 // import "golang.org/x/crypto/cast5" - -import "errors" - -const BlockSize = 8 -const KeySize = 16 - -type Cipher struct { - masking [16]uint32 - rotate [16]uint8 -} - -func NewCipher(key []byte) (c *Cipher, err error) { - if len(key) != KeySize { - return nil, errors.New("CAST5: keys must be 16 bytes") - } - - c = new(Cipher) - c.keySchedule(key) - return -} - -func (c *Cipher) BlockSize() int { - return BlockSize -} - -func (c *Cipher) Encrypt(dst, src []byte) { - l := uint32(src[0])<<24 | uint32(src[1])<<16 | uint32(src[2])<<8 | uint32(src[3]) - r := uint32(src[4])<<24 | uint32(src[5])<<16 | uint32(src[6])<<8 | uint32(src[7]) - - l, r = r, l^f1(r, c.masking[0], c.rotate[0]) - l, r = r, l^f2(r, c.masking[1], c.rotate[1]) - l, r = r, l^f3(r, c.masking[2], c.rotate[2]) - l, r = r, l^f1(r, c.masking[3], c.rotate[3]) - - l, r = r, l^f2(r, c.masking[4], c.rotate[4]) - l, r = r, l^f3(r, c.masking[5], c.rotate[5]) - l, r = r, l^f1(r, c.masking[6], c.rotate[6]) - l, r = r, l^f2(r, c.masking[7], c.rotate[7]) - - l, r = r, l^f3(r, c.masking[8], c.rotate[8]) - l, r = r, l^f1(r, c.masking[9], c.rotate[9]) - l, r = r, l^f2(r, c.masking[10], c.rotate[10]) - l, r = r, l^f3(r, c.masking[11], c.rotate[11]) - - l, r = r, l^f1(r, c.masking[12], c.rotate[12]) - l, r = r, l^f2(r, c.masking[13], c.rotate[13]) - l, r = r, l^f3(r, c.masking[14], c.rotate[14]) - l, r = r, l^f1(r, c.masking[15], c.rotate[15]) - - dst[0] = uint8(r >> 24) - dst[1] = uint8(r >> 16) - dst[2] = uint8(r >> 8) - dst[3] = uint8(r) - dst[4] = uint8(l >> 24) - dst[5] = uint8(l >> 16) - dst[6] = uint8(l >> 8) - dst[7] = uint8(l) -} - -func (c *Cipher) Decrypt(dst, src []byte) { - l := uint32(src[0])<<24 | uint32(src[1])<<16 | uint32(src[2])<<8 | uint32(src[3]) - r := uint32(src[4])<<24 | uint32(src[5])<<16 | uint32(src[6])<<8 | uint32(src[7]) - - l, r = r, l^f1(r, c.masking[15], c.rotate[15]) - l, r = r, l^f3(r, c.masking[14], c.rotate[14]) - l, r = r, l^f2(r, c.masking[13], c.rotate[13]) - l, r = r, l^f1(r, c.masking[12], c.rotate[12]) - - l, r = r, l^f3(r, c.masking[11], c.rotate[11]) - l, r = r, l^f2(r, c.masking[10], c.rotate[10]) - l, r = r, l^f1(r, c.masking[9], c.rotate[9]) - l, r = r, l^f3(r, c.masking[8], c.rotate[8]) - - l, r = r, l^f2(r, c.masking[7], c.rotate[7]) - l, r = r, l^f1(r, c.masking[6], c.rotate[6]) - l, r = r, l^f3(r, c.masking[5], c.rotate[5]) - l, r = r, l^f2(r, c.masking[4], c.rotate[4]) - - l, r = r, l^f1(r, c.masking[3], c.rotate[3]) - l, r = r, l^f3(r, c.masking[2], c.rotate[2]) - l, r = r, l^f2(r, c.masking[1], c.rotate[1]) - l, r = r, l^f1(r, c.masking[0], c.rotate[0]) - - dst[0] = uint8(r >> 24) - dst[1] = uint8(r >> 16) - dst[2] = uint8(r >> 8) - dst[3] = uint8(r) - dst[4] = uint8(l >> 24) - dst[5] = uint8(l >> 16) - dst[6] = uint8(l >> 8) - dst[7] = uint8(l) -} - -type keyScheduleA [4][7]uint8 -type keyScheduleB [4][5]uint8 - -// keyScheduleRound contains the magic values for a round of the key schedule. -// The keyScheduleA deals with the lines like: -// z0z1z2z3 = x0x1x2x3 ^ S5[xD] ^ S6[xF] ^ S7[xC] ^ S8[xE] ^ S7[x8] -// Conceptually, both x and z are in the same array, x first. The first -// element describes which word of this array gets written to and the -// second, which word gets read. So, for the line above, it's "4, 0", because -// it's writing to the first word of z, which, being after x, is word 4, and -// reading from the first word of x: word 0. -// -// Next are the indexes into the S-boxes. Now the array is treated as bytes. So -// "xD" is 0xd. The first byte of z is written as "16 + 0", just to be clear -// that it's z that we're indexing. -// -// keyScheduleB deals with lines like: -// K1 = S5[z8] ^ S6[z9] ^ S7[z7] ^ S8[z6] ^ S5[z2] -// "K1" is ignored because key words are always written in order. So the five -// elements are the S-box indexes. They use the same form as in keyScheduleA, -// above. - -type keyScheduleRound struct{} -type keySchedule []keyScheduleRound - -var schedule = []struct { - a keyScheduleA - b keyScheduleB -}{ - { - keyScheduleA{ - {4, 0, 0xd, 0xf, 0xc, 0xe, 0x8}, - {5, 2, 16 + 0, 16 + 2, 16 + 1, 16 + 3, 0xa}, - {6, 3, 16 + 7, 16 + 6, 16 + 5, 16 + 4, 9}, - {7, 1, 16 + 0xa, 16 + 9, 16 + 0xb, 16 + 8, 0xb}, - }, - keyScheduleB{ - {16 + 8, 16 + 9, 16 + 7, 16 + 6, 16 + 2}, - {16 + 0xa, 16 + 0xb, 16 + 5, 16 + 4, 16 + 6}, - {16 + 0xc, 16 + 0xd, 16 + 3, 16 + 2, 16 + 9}, - {16 + 0xe, 16 + 0xf, 16 + 1, 16 + 0, 16 + 0xc}, - }, - }, - { - keyScheduleA{ - {0, 6, 16 + 5, 16 + 7, 16 + 4, 16 + 6, 16 + 0}, - {1, 4, 0, 2, 1, 3, 16 + 2}, - {2, 5, 7, 6, 5, 4, 16 + 1}, - {3, 7, 0xa, 9, 0xb, 8, 16 + 3}, - }, - keyScheduleB{ - {3, 2, 0xc, 0xd, 8}, - {1, 0, 0xe, 0xf, 0xd}, - {7, 6, 8, 9, 3}, - {5, 4, 0xa, 0xb, 7}, - }, - }, - { - keyScheduleA{ - {4, 0, 0xd, 0xf, 0xc, 0xe, 8}, - {5, 2, 16 + 0, 16 + 2, 16 + 1, 16 + 3, 0xa}, - {6, 3, 16 + 7, 16 + 6, 16 + 5, 16 + 4, 9}, - {7, 1, 16 + 0xa, 16 + 9, 16 + 0xb, 16 + 8, 0xb}, - }, - keyScheduleB{ - {16 + 3, 16 + 2, 16 + 0xc, 16 + 0xd, 16 + 9}, - {16 + 1, 16 + 0, 16 + 0xe, 16 + 0xf, 16 + 0xc}, - {16 + 7, 16 + 6, 16 + 8, 16 + 9, 16 + 2}, - {16 + 5, 16 + 4, 16 + 0xa, 16 + 0xb, 16 + 6}, - }, - }, - { - keyScheduleA{ - {0, 6, 16 + 5, 16 + 7, 16 + 4, 16 + 6, 16 + 0}, - {1, 4, 0, 2, 1, 3, 16 + 2}, - {2, 5, 7, 6, 5, 4, 16 + 1}, - {3, 7, 0xa, 9, 0xb, 8, 16 + 3}, - }, - keyScheduleB{ - {8, 9, 7, 6, 3}, - {0xa, 0xb, 5, 4, 7}, - {0xc, 0xd, 3, 2, 8}, - {0xe, 0xf, 1, 0, 0xd}, - }, - }, -} - -func (c *Cipher) keySchedule(in []byte) { - var t [8]uint32 - var k [32]uint32 - - for i := 0; i < 4; i++ { - j := i * 4 - t[i] = uint32(in[j])<<24 | uint32(in[j+1])<<16 | uint32(in[j+2])<<8 | uint32(in[j+3]) - } - - x := []byte{6, 7, 4, 5} - ki := 0 - - for half := 0; half < 2; half++ { - for _, round := range schedule { - for j := 0; j < 4; j++ { - var a [7]uint8 - copy(a[:], round.a[j][:]) - w := t[a[1]] - w ^= sBox[4][(t[a[2]>>2]>>(24-8*(a[2]&3)))&0xff] - w ^= sBox[5][(t[a[3]>>2]>>(24-8*(a[3]&3)))&0xff] - w ^= sBox[6][(t[a[4]>>2]>>(24-8*(a[4]&3)))&0xff] - w ^= sBox[7][(t[a[5]>>2]>>(24-8*(a[5]&3)))&0xff] - w ^= sBox[x[j]][(t[a[6]>>2]>>(24-8*(a[6]&3)))&0xff] - t[a[0]] = w - } - - for j := 0; j < 4; j++ { - var b [5]uint8 - copy(b[:], round.b[j][:]) - w := sBox[4][(t[b[0]>>2]>>(24-8*(b[0]&3)))&0xff] - w ^= sBox[5][(t[b[1]>>2]>>(24-8*(b[1]&3)))&0xff] - w ^= sBox[6][(t[b[2]>>2]>>(24-8*(b[2]&3)))&0xff] - w ^= sBox[7][(t[b[3]>>2]>>(24-8*(b[3]&3)))&0xff] - w ^= sBox[4+j][(t[b[4]>>2]>>(24-8*(b[4]&3)))&0xff] - k[ki] = w - ki++ - } - } - } - - for i := 0; i < 16; i++ { - c.masking[i] = k[i] - c.rotate[i] = uint8(k[16+i] & 0x1f) - } -} - -// These are the three 'f' functions. See RFC 2144, section 2.2. -func f1(d, m uint32, r uint8) uint32 { - t := m + d - I := (t << r) | (t >> (32 - r)) - return ((sBox[0][I>>24] ^ sBox[1][(I>>16)&0xff]) - sBox[2][(I>>8)&0xff]) + sBox[3][I&0xff] -} - -func f2(d, m uint32, r uint8) uint32 { - t := m ^ d - I := (t << r) | (t >> (32 - r)) - return ((sBox[0][I>>24] - sBox[1][(I>>16)&0xff]) + sBox[2][(I>>8)&0xff]) ^ sBox[3][I&0xff] -} - -func f3(d, m uint32, r uint8) uint32 { - t := m - d - I := (t << r) | (t >> (32 - r)) - return ((sBox[0][I>>24] + sBox[1][(I>>16)&0xff]) ^ sBox[2][(I>>8)&0xff]) - sBox[3][I&0xff] -} - -var sBox = [8][256]uint32{ - { - 0x30fb40d4, 0x9fa0ff0b, 0x6beccd2f, 0x3f258c7a, 0x1e213f2f, 0x9c004dd3, 0x6003e540, 0xcf9fc949, - 0xbfd4af27, 0x88bbbdb5, 0xe2034090, 0x98d09675, 0x6e63a0e0, 0x15c361d2, 0xc2e7661d, 0x22d4ff8e, - 0x28683b6f, 0xc07fd059, 0xff2379c8, 0x775f50e2, 0x43c340d3, 0xdf2f8656, 0x887ca41a, 0xa2d2bd2d, - 0xa1c9e0d6, 0x346c4819, 0x61b76d87, 0x22540f2f, 0x2abe32e1, 0xaa54166b, 0x22568e3a, 0xa2d341d0, - 0x66db40c8, 0xa784392f, 0x004dff2f, 0x2db9d2de, 0x97943fac, 0x4a97c1d8, 0x527644b7, 0xb5f437a7, - 0xb82cbaef, 0xd751d159, 0x6ff7f0ed, 0x5a097a1f, 0x827b68d0, 0x90ecf52e, 0x22b0c054, 0xbc8e5935, - 0x4b6d2f7f, 0x50bb64a2, 0xd2664910, 0xbee5812d, 0xb7332290, 0xe93b159f, 0xb48ee411, 0x4bff345d, - 0xfd45c240, 0xad31973f, 0xc4f6d02e, 0x55fc8165, 0xd5b1caad, 0xa1ac2dae, 0xa2d4b76d, 0xc19b0c50, - 0x882240f2, 0x0c6e4f38, 0xa4e4bfd7, 0x4f5ba272, 0x564c1d2f, 0xc59c5319, 0xb949e354, 0xb04669fe, - 0xb1b6ab8a, 0xc71358dd, 0x6385c545, 0x110f935d, 0x57538ad5, 0x6a390493, 0xe63d37e0, 0x2a54f6b3, - 0x3a787d5f, 0x6276a0b5, 0x19a6fcdf, 0x7a42206a, 0x29f9d4d5, 0xf61b1891, 0xbb72275e, 0xaa508167, - 0x38901091, 0xc6b505eb, 0x84c7cb8c, 0x2ad75a0f, 0x874a1427, 0xa2d1936b, 0x2ad286af, 0xaa56d291, - 0xd7894360, 0x425c750d, 0x93b39e26, 0x187184c9, 0x6c00b32d, 0x73e2bb14, 0xa0bebc3c, 0x54623779, - 0x64459eab, 0x3f328b82, 0x7718cf82, 0x59a2cea6, 0x04ee002e, 0x89fe78e6, 0x3fab0950, 0x325ff6c2, - 0x81383f05, 0x6963c5c8, 0x76cb5ad6, 0xd49974c9, 0xca180dcf, 0x380782d5, 0xc7fa5cf6, 0x8ac31511, - 0x35e79e13, 0x47da91d0, 0xf40f9086, 0xa7e2419e, 0x31366241, 0x051ef495, 0xaa573b04, 0x4a805d8d, - 0x548300d0, 0x00322a3c, 0xbf64cddf, 0xba57a68e, 0x75c6372b, 0x50afd341, 0xa7c13275, 0x915a0bf5, - 0x6b54bfab, 0x2b0b1426, 0xab4cc9d7, 0x449ccd82, 0xf7fbf265, 0xab85c5f3, 0x1b55db94, 0xaad4e324, - 0xcfa4bd3f, 0x2deaa3e2, 0x9e204d02, 0xc8bd25ac, 0xeadf55b3, 0xd5bd9e98, 0xe31231b2, 0x2ad5ad6c, - 0x954329de, 0xadbe4528, 0xd8710f69, 0xaa51c90f, 0xaa786bf6, 0x22513f1e, 0xaa51a79b, 0x2ad344cc, - 0x7b5a41f0, 0xd37cfbad, 0x1b069505, 0x41ece491, 0xb4c332e6, 0x032268d4, 0xc9600acc, 0xce387e6d, - 0xbf6bb16c, 0x6a70fb78, 0x0d03d9c9, 0xd4df39de, 0xe01063da, 0x4736f464, 0x5ad328d8, 0xb347cc96, - 0x75bb0fc3, 0x98511bfb, 0x4ffbcc35, 0xb58bcf6a, 0xe11f0abc, 0xbfc5fe4a, 0xa70aec10, 0xac39570a, - 0x3f04442f, 0x6188b153, 0xe0397a2e, 0x5727cb79, 0x9ceb418f, 0x1cacd68d, 0x2ad37c96, 0x0175cb9d, - 0xc69dff09, 0xc75b65f0, 0xd9db40d8, 0xec0e7779, 0x4744ead4, 0xb11c3274, 0xdd24cb9e, 0x7e1c54bd, - 0xf01144f9, 0xd2240eb1, 0x9675b3fd, 0xa3ac3755, 0xd47c27af, 0x51c85f4d, 0x56907596, 0xa5bb15e6, - 0x580304f0, 0xca042cf1, 0x011a37ea, 0x8dbfaadb, 0x35ba3e4a, 0x3526ffa0, 0xc37b4d09, 0xbc306ed9, - 0x98a52666, 0x5648f725, 0xff5e569d, 0x0ced63d0, 0x7c63b2cf, 0x700b45e1, 0xd5ea50f1, 0x85a92872, - 0xaf1fbda7, 0xd4234870, 0xa7870bf3, 0x2d3b4d79, 0x42e04198, 0x0cd0ede7, 0x26470db8, 0xf881814c, - 0x474d6ad7, 0x7c0c5e5c, 0xd1231959, 0x381b7298, 0xf5d2f4db, 0xab838653, 0x6e2f1e23, 0x83719c9e, - 0xbd91e046, 0x9a56456e, 0xdc39200c, 0x20c8c571, 0x962bda1c, 0xe1e696ff, 0xb141ab08, 0x7cca89b9, - 0x1a69e783, 0x02cc4843, 0xa2f7c579, 0x429ef47d, 0x427b169c, 0x5ac9f049, 0xdd8f0f00, 0x5c8165bf, - }, - { - 0x1f201094, 0xef0ba75b, 0x69e3cf7e, 0x393f4380, 0xfe61cf7a, 0xeec5207a, 0x55889c94, 0x72fc0651, - 0xada7ef79, 0x4e1d7235, 0xd55a63ce, 0xde0436ba, 0x99c430ef, 0x5f0c0794, 0x18dcdb7d, 0xa1d6eff3, - 0xa0b52f7b, 0x59e83605, 0xee15b094, 0xe9ffd909, 0xdc440086, 0xef944459, 0xba83ccb3, 0xe0c3cdfb, - 0xd1da4181, 0x3b092ab1, 0xf997f1c1, 0xa5e6cf7b, 0x01420ddb, 0xe4e7ef5b, 0x25a1ff41, 0xe180f806, - 0x1fc41080, 0x179bee7a, 0xd37ac6a9, 0xfe5830a4, 0x98de8b7f, 0x77e83f4e, 0x79929269, 0x24fa9f7b, - 0xe113c85b, 0xacc40083, 0xd7503525, 0xf7ea615f, 0x62143154, 0x0d554b63, 0x5d681121, 0xc866c359, - 0x3d63cf73, 0xcee234c0, 0xd4d87e87, 0x5c672b21, 0x071f6181, 0x39f7627f, 0x361e3084, 0xe4eb573b, - 0x602f64a4, 0xd63acd9c, 0x1bbc4635, 0x9e81032d, 0x2701f50c, 0x99847ab4, 0xa0e3df79, 0xba6cf38c, - 0x10843094, 0x2537a95e, 0xf46f6ffe, 0xa1ff3b1f, 0x208cfb6a, 0x8f458c74, 0xd9e0a227, 0x4ec73a34, - 0xfc884f69, 0x3e4de8df, 0xef0e0088, 0x3559648d, 0x8a45388c, 0x1d804366, 0x721d9bfd, 0xa58684bb, - 0xe8256333, 0x844e8212, 0x128d8098, 0xfed33fb4, 0xce280ae1, 0x27e19ba5, 0xd5a6c252, 0xe49754bd, - 0xc5d655dd, 0xeb667064, 0x77840b4d, 0xa1b6a801, 0x84db26a9, 0xe0b56714, 0x21f043b7, 0xe5d05860, - 0x54f03084, 0x066ff472, 0xa31aa153, 0xdadc4755, 0xb5625dbf, 0x68561be6, 0x83ca6b94, 0x2d6ed23b, - 0xeccf01db, 0xa6d3d0ba, 0xb6803d5c, 0xaf77a709, 0x33b4a34c, 0x397bc8d6, 0x5ee22b95, 0x5f0e5304, - 0x81ed6f61, 0x20e74364, 0xb45e1378, 0xde18639b, 0x881ca122, 0xb96726d1, 0x8049a7e8, 0x22b7da7b, - 0x5e552d25, 0x5272d237, 0x79d2951c, 0xc60d894c, 0x488cb402, 0x1ba4fe5b, 0xa4b09f6b, 0x1ca815cf, - 0xa20c3005, 0x8871df63, 0xb9de2fcb, 0x0cc6c9e9, 0x0beeff53, 0xe3214517, 0xb4542835, 0x9f63293c, - 0xee41e729, 0x6e1d2d7c, 0x50045286, 0x1e6685f3, 0xf33401c6, 0x30a22c95, 0x31a70850, 0x60930f13, - 0x73f98417, 0xa1269859, 0xec645c44, 0x52c877a9, 0xcdff33a6, 0xa02b1741, 0x7cbad9a2, 0x2180036f, - 0x50d99c08, 0xcb3f4861, 0xc26bd765, 0x64a3f6ab, 0x80342676, 0x25a75e7b, 0xe4e6d1fc, 0x20c710e6, - 0xcdf0b680, 0x17844d3b, 0x31eef84d, 0x7e0824e4, 0x2ccb49eb, 0x846a3bae, 0x8ff77888, 0xee5d60f6, - 0x7af75673, 0x2fdd5cdb, 0xa11631c1, 0x30f66f43, 0xb3faec54, 0x157fd7fa, 0xef8579cc, 0xd152de58, - 0xdb2ffd5e, 0x8f32ce19, 0x306af97a, 0x02f03ef8, 0x99319ad5, 0xc242fa0f, 0xa7e3ebb0, 0xc68e4906, - 0xb8da230c, 0x80823028, 0xdcdef3c8, 0xd35fb171, 0x088a1bc8, 0xbec0c560, 0x61a3c9e8, 0xbca8f54d, - 0xc72feffa, 0x22822e99, 0x82c570b4, 0xd8d94e89, 0x8b1c34bc, 0x301e16e6, 0x273be979, 0xb0ffeaa6, - 0x61d9b8c6, 0x00b24869, 0xb7ffce3f, 0x08dc283b, 0x43daf65a, 0xf7e19798, 0x7619b72f, 0x8f1c9ba4, - 0xdc8637a0, 0x16a7d3b1, 0x9fc393b7, 0xa7136eeb, 0xc6bcc63e, 0x1a513742, 0xef6828bc, 0x520365d6, - 0x2d6a77ab, 0x3527ed4b, 0x821fd216, 0x095c6e2e, 0xdb92f2fb, 0x5eea29cb, 0x145892f5, 0x91584f7f, - 0x5483697b, 0x2667a8cc, 0x85196048, 0x8c4bacea, 0x833860d4, 0x0d23e0f9, 0x6c387e8a, 0x0ae6d249, - 0xb284600c, 0xd835731d, 0xdcb1c647, 0xac4c56ea, 0x3ebd81b3, 0x230eabb0, 0x6438bc87, 0xf0b5b1fa, - 0x8f5ea2b3, 0xfc184642, 0x0a036b7a, 0x4fb089bd, 0x649da589, 0xa345415e, 0x5c038323, 0x3e5d3bb9, - 0x43d79572, 0x7e6dd07c, 0x06dfdf1e, 0x6c6cc4ef, 0x7160a539, 0x73bfbe70, 0x83877605, 0x4523ecf1, - }, - { - 0x8defc240, 0x25fa5d9f, 0xeb903dbf, 0xe810c907, 0x47607fff, 0x369fe44b, 0x8c1fc644, 0xaececa90, - 0xbeb1f9bf, 0xeefbcaea, 0xe8cf1950, 0x51df07ae, 0x920e8806, 0xf0ad0548, 0xe13c8d83, 0x927010d5, - 0x11107d9f, 0x07647db9, 0xb2e3e4d4, 0x3d4f285e, 0xb9afa820, 0xfade82e0, 0xa067268b, 0x8272792e, - 0x553fb2c0, 0x489ae22b, 0xd4ef9794, 0x125e3fbc, 0x21fffcee, 0x825b1bfd, 0x9255c5ed, 0x1257a240, - 0x4e1a8302, 0xbae07fff, 0x528246e7, 0x8e57140e, 0x3373f7bf, 0x8c9f8188, 0xa6fc4ee8, 0xc982b5a5, - 0xa8c01db7, 0x579fc264, 0x67094f31, 0xf2bd3f5f, 0x40fff7c1, 0x1fb78dfc, 0x8e6bd2c1, 0x437be59b, - 0x99b03dbf, 0xb5dbc64b, 0x638dc0e6, 0x55819d99, 0xa197c81c, 0x4a012d6e, 0xc5884a28, 0xccc36f71, - 0xb843c213, 0x6c0743f1, 0x8309893c, 0x0feddd5f, 0x2f7fe850, 0xd7c07f7e, 0x02507fbf, 0x5afb9a04, - 0xa747d2d0, 0x1651192e, 0xaf70bf3e, 0x58c31380, 0x5f98302e, 0x727cc3c4, 0x0a0fb402, 0x0f7fef82, - 0x8c96fdad, 0x5d2c2aae, 0x8ee99a49, 0x50da88b8, 0x8427f4a0, 0x1eac5790, 0x796fb449, 0x8252dc15, - 0xefbd7d9b, 0xa672597d, 0xada840d8, 0x45f54504, 0xfa5d7403, 0xe83ec305, 0x4f91751a, 0x925669c2, - 0x23efe941, 0xa903f12e, 0x60270df2, 0x0276e4b6, 0x94fd6574, 0x927985b2, 0x8276dbcb, 0x02778176, - 0xf8af918d, 0x4e48f79e, 0x8f616ddf, 0xe29d840e, 0x842f7d83, 0x340ce5c8, 0x96bbb682, 0x93b4b148, - 0xef303cab, 0x984faf28, 0x779faf9b, 0x92dc560d, 0x224d1e20, 0x8437aa88, 0x7d29dc96, 0x2756d3dc, - 0x8b907cee, 0xb51fd240, 0xe7c07ce3, 0xe566b4a1, 0xc3e9615e, 0x3cf8209d, 0x6094d1e3, 0xcd9ca341, - 0x5c76460e, 0x00ea983b, 0xd4d67881, 0xfd47572c, 0xf76cedd9, 0xbda8229c, 0x127dadaa, 0x438a074e, - 0x1f97c090, 0x081bdb8a, 0x93a07ebe, 0xb938ca15, 0x97b03cff, 0x3dc2c0f8, 0x8d1ab2ec, 0x64380e51, - 0x68cc7bfb, 0xd90f2788, 0x12490181, 0x5de5ffd4, 0xdd7ef86a, 0x76a2e214, 0xb9a40368, 0x925d958f, - 0x4b39fffa, 0xba39aee9, 0xa4ffd30b, 0xfaf7933b, 0x6d498623, 0x193cbcfa, 0x27627545, 0x825cf47a, - 0x61bd8ba0, 0xd11e42d1, 0xcead04f4, 0x127ea392, 0x10428db7, 0x8272a972, 0x9270c4a8, 0x127de50b, - 0x285ba1c8, 0x3c62f44f, 0x35c0eaa5, 0xe805d231, 0x428929fb, 0xb4fcdf82, 0x4fb66a53, 0x0e7dc15b, - 0x1f081fab, 0x108618ae, 0xfcfd086d, 0xf9ff2889, 0x694bcc11, 0x236a5cae, 0x12deca4d, 0x2c3f8cc5, - 0xd2d02dfe, 0xf8ef5896, 0xe4cf52da, 0x95155b67, 0x494a488c, 0xb9b6a80c, 0x5c8f82bc, 0x89d36b45, - 0x3a609437, 0xec00c9a9, 0x44715253, 0x0a874b49, 0xd773bc40, 0x7c34671c, 0x02717ef6, 0x4feb5536, - 0xa2d02fff, 0xd2bf60c4, 0xd43f03c0, 0x50b4ef6d, 0x07478cd1, 0x006e1888, 0xa2e53f55, 0xb9e6d4bc, - 0xa2048016, 0x97573833, 0xd7207d67, 0xde0f8f3d, 0x72f87b33, 0xabcc4f33, 0x7688c55d, 0x7b00a6b0, - 0x947b0001, 0x570075d2, 0xf9bb88f8, 0x8942019e, 0x4264a5ff, 0x856302e0, 0x72dbd92b, 0xee971b69, - 0x6ea22fde, 0x5f08ae2b, 0xaf7a616d, 0xe5c98767, 0xcf1febd2, 0x61efc8c2, 0xf1ac2571, 0xcc8239c2, - 0x67214cb8, 0xb1e583d1, 0xb7dc3e62, 0x7f10bdce, 0xf90a5c38, 0x0ff0443d, 0x606e6dc6, 0x60543a49, - 0x5727c148, 0x2be98a1d, 0x8ab41738, 0x20e1be24, 0xaf96da0f, 0x68458425, 0x99833be5, 0x600d457d, - 0x282f9350, 0x8334b362, 0xd91d1120, 0x2b6d8da0, 0x642b1e31, 0x9c305a00, 0x52bce688, 0x1b03588a, - 0xf7baefd5, 0x4142ed9c, 0xa4315c11, 0x83323ec5, 0xdfef4636, 0xa133c501, 0xe9d3531c, 0xee353783, - }, - { - 0x9db30420, 0x1fb6e9de, 0xa7be7bef, 0xd273a298, 0x4a4f7bdb, 0x64ad8c57, 0x85510443, 0xfa020ed1, - 0x7e287aff, 0xe60fb663, 0x095f35a1, 0x79ebf120, 0xfd059d43, 0x6497b7b1, 0xf3641f63, 0x241e4adf, - 0x28147f5f, 0x4fa2b8cd, 0xc9430040, 0x0cc32220, 0xfdd30b30, 0xc0a5374f, 0x1d2d00d9, 0x24147b15, - 0xee4d111a, 0x0fca5167, 0x71ff904c, 0x2d195ffe, 0x1a05645f, 0x0c13fefe, 0x081b08ca, 0x05170121, - 0x80530100, 0xe83e5efe, 0xac9af4f8, 0x7fe72701, 0xd2b8ee5f, 0x06df4261, 0xbb9e9b8a, 0x7293ea25, - 0xce84ffdf, 0xf5718801, 0x3dd64b04, 0xa26f263b, 0x7ed48400, 0x547eebe6, 0x446d4ca0, 0x6cf3d6f5, - 0x2649abdf, 0xaea0c7f5, 0x36338cc1, 0x503f7e93, 0xd3772061, 0x11b638e1, 0x72500e03, 0xf80eb2bb, - 0xabe0502e, 0xec8d77de, 0x57971e81, 0xe14f6746, 0xc9335400, 0x6920318f, 0x081dbb99, 0xffc304a5, - 0x4d351805, 0x7f3d5ce3, 0xa6c866c6, 0x5d5bcca9, 0xdaec6fea, 0x9f926f91, 0x9f46222f, 0x3991467d, - 0xa5bf6d8e, 0x1143c44f, 0x43958302, 0xd0214eeb, 0x022083b8, 0x3fb6180c, 0x18f8931e, 0x281658e6, - 0x26486e3e, 0x8bd78a70, 0x7477e4c1, 0xb506e07c, 0xf32d0a25, 0x79098b02, 0xe4eabb81, 0x28123b23, - 0x69dead38, 0x1574ca16, 0xdf871b62, 0x211c40b7, 0xa51a9ef9, 0x0014377b, 0x041e8ac8, 0x09114003, - 0xbd59e4d2, 0xe3d156d5, 0x4fe876d5, 0x2f91a340, 0x557be8de, 0x00eae4a7, 0x0ce5c2ec, 0x4db4bba6, - 0xe756bdff, 0xdd3369ac, 0xec17b035, 0x06572327, 0x99afc8b0, 0x56c8c391, 0x6b65811c, 0x5e146119, - 0x6e85cb75, 0xbe07c002, 0xc2325577, 0x893ff4ec, 0x5bbfc92d, 0xd0ec3b25, 0xb7801ab7, 0x8d6d3b24, - 0x20c763ef, 0xc366a5fc, 0x9c382880, 0x0ace3205, 0xaac9548a, 0xeca1d7c7, 0x041afa32, 0x1d16625a, - 0x6701902c, 0x9b757a54, 0x31d477f7, 0x9126b031, 0x36cc6fdb, 0xc70b8b46, 0xd9e66a48, 0x56e55a79, - 0x026a4ceb, 0x52437eff, 0x2f8f76b4, 0x0df980a5, 0x8674cde3, 0xedda04eb, 0x17a9be04, 0x2c18f4df, - 0xb7747f9d, 0xab2af7b4, 0xefc34d20, 0x2e096b7c, 0x1741a254, 0xe5b6a035, 0x213d42f6, 0x2c1c7c26, - 0x61c2f50f, 0x6552daf9, 0xd2c231f8, 0x25130f69, 0xd8167fa2, 0x0418f2c8, 0x001a96a6, 0x0d1526ab, - 0x63315c21, 0x5e0a72ec, 0x49bafefd, 0x187908d9, 0x8d0dbd86, 0x311170a7, 0x3e9b640c, 0xcc3e10d7, - 0xd5cad3b6, 0x0caec388, 0xf73001e1, 0x6c728aff, 0x71eae2a1, 0x1f9af36e, 0xcfcbd12f, 0xc1de8417, - 0xac07be6b, 0xcb44a1d8, 0x8b9b0f56, 0x013988c3, 0xb1c52fca, 0xb4be31cd, 0xd8782806, 0x12a3a4e2, - 0x6f7de532, 0x58fd7eb6, 0xd01ee900, 0x24adffc2, 0xf4990fc5, 0x9711aac5, 0x001d7b95, 0x82e5e7d2, - 0x109873f6, 0x00613096, 0xc32d9521, 0xada121ff, 0x29908415, 0x7fbb977f, 0xaf9eb3db, 0x29c9ed2a, - 0x5ce2a465, 0xa730f32c, 0xd0aa3fe8, 0x8a5cc091, 0xd49e2ce7, 0x0ce454a9, 0xd60acd86, 0x015f1919, - 0x77079103, 0xdea03af6, 0x78a8565e, 0xdee356df, 0x21f05cbe, 0x8b75e387, 0xb3c50651, 0xb8a5c3ef, - 0xd8eeb6d2, 0xe523be77, 0xc2154529, 0x2f69efdf, 0xafe67afb, 0xf470c4b2, 0xf3e0eb5b, 0xd6cc9876, - 0x39e4460c, 0x1fda8538, 0x1987832f, 0xca007367, 0xa99144f8, 0x296b299e, 0x492fc295, 0x9266beab, - 0xb5676e69, 0x9bd3ddda, 0xdf7e052f, 0xdb25701c, 0x1b5e51ee, 0xf65324e6, 0x6afce36c, 0x0316cc04, - 0x8644213e, 0xb7dc59d0, 0x7965291f, 0xccd6fd43, 0x41823979, 0x932bcdf6, 0xb657c34d, 0x4edfd282, - 0x7ae5290c, 0x3cb9536b, 0x851e20fe, 0x9833557e, 0x13ecf0b0, 0xd3ffb372, 0x3f85c5c1, 0x0aef7ed2, - }, - { - 0x7ec90c04, 0x2c6e74b9, 0x9b0e66df, 0xa6337911, 0xb86a7fff, 0x1dd358f5, 0x44dd9d44, 0x1731167f, - 0x08fbf1fa, 0xe7f511cc, 0xd2051b00, 0x735aba00, 0x2ab722d8, 0x386381cb, 0xacf6243a, 0x69befd7a, - 0xe6a2e77f, 0xf0c720cd, 0xc4494816, 0xccf5c180, 0x38851640, 0x15b0a848, 0xe68b18cb, 0x4caadeff, - 0x5f480a01, 0x0412b2aa, 0x259814fc, 0x41d0efe2, 0x4e40b48d, 0x248eb6fb, 0x8dba1cfe, 0x41a99b02, - 0x1a550a04, 0xba8f65cb, 0x7251f4e7, 0x95a51725, 0xc106ecd7, 0x97a5980a, 0xc539b9aa, 0x4d79fe6a, - 0xf2f3f763, 0x68af8040, 0xed0c9e56, 0x11b4958b, 0xe1eb5a88, 0x8709e6b0, 0xd7e07156, 0x4e29fea7, - 0x6366e52d, 0x02d1c000, 0xc4ac8e05, 0x9377f571, 0x0c05372a, 0x578535f2, 0x2261be02, 0xd642a0c9, - 0xdf13a280, 0x74b55bd2, 0x682199c0, 0xd421e5ec, 0x53fb3ce8, 0xc8adedb3, 0x28a87fc9, 0x3d959981, - 0x5c1ff900, 0xfe38d399, 0x0c4eff0b, 0x062407ea, 0xaa2f4fb1, 0x4fb96976, 0x90c79505, 0xb0a8a774, - 0xef55a1ff, 0xe59ca2c2, 0xa6b62d27, 0xe66a4263, 0xdf65001f, 0x0ec50966, 0xdfdd55bc, 0x29de0655, - 0x911e739a, 0x17af8975, 0x32c7911c, 0x89f89468, 0x0d01e980, 0x524755f4, 0x03b63cc9, 0x0cc844b2, - 0xbcf3f0aa, 0x87ac36e9, 0xe53a7426, 0x01b3d82b, 0x1a9e7449, 0x64ee2d7e, 0xcddbb1da, 0x01c94910, - 0xb868bf80, 0x0d26f3fd, 0x9342ede7, 0x04a5c284, 0x636737b6, 0x50f5b616, 0xf24766e3, 0x8eca36c1, - 0x136e05db, 0xfef18391, 0xfb887a37, 0xd6e7f7d4, 0xc7fb7dc9, 0x3063fcdf, 0xb6f589de, 0xec2941da, - 0x26e46695, 0xb7566419, 0xf654efc5, 0xd08d58b7, 0x48925401, 0xc1bacb7f, 0xe5ff550f, 0xb6083049, - 0x5bb5d0e8, 0x87d72e5a, 0xab6a6ee1, 0x223a66ce, 0xc62bf3cd, 0x9e0885f9, 0x68cb3e47, 0x086c010f, - 0xa21de820, 0xd18b69de, 0xf3f65777, 0xfa02c3f6, 0x407edac3, 0xcbb3d550, 0x1793084d, 0xb0d70eba, - 0x0ab378d5, 0xd951fb0c, 0xded7da56, 0x4124bbe4, 0x94ca0b56, 0x0f5755d1, 0xe0e1e56e, 0x6184b5be, - 0x580a249f, 0x94f74bc0, 0xe327888e, 0x9f7b5561, 0xc3dc0280, 0x05687715, 0x646c6bd7, 0x44904db3, - 0x66b4f0a3, 0xc0f1648a, 0x697ed5af, 0x49e92ff6, 0x309e374f, 0x2cb6356a, 0x85808573, 0x4991f840, - 0x76f0ae02, 0x083be84d, 0x28421c9a, 0x44489406, 0x736e4cb8, 0xc1092910, 0x8bc95fc6, 0x7d869cf4, - 0x134f616f, 0x2e77118d, 0xb31b2be1, 0xaa90b472, 0x3ca5d717, 0x7d161bba, 0x9cad9010, 0xaf462ba2, - 0x9fe459d2, 0x45d34559, 0xd9f2da13, 0xdbc65487, 0xf3e4f94e, 0x176d486f, 0x097c13ea, 0x631da5c7, - 0x445f7382, 0x175683f4, 0xcdc66a97, 0x70be0288, 0xb3cdcf72, 0x6e5dd2f3, 0x20936079, 0x459b80a5, - 0xbe60e2db, 0xa9c23101, 0xeba5315c, 0x224e42f2, 0x1c5c1572, 0xf6721b2c, 0x1ad2fff3, 0x8c25404e, - 0x324ed72f, 0x4067b7fd, 0x0523138e, 0x5ca3bc78, 0xdc0fd66e, 0x75922283, 0x784d6b17, 0x58ebb16e, - 0x44094f85, 0x3f481d87, 0xfcfeae7b, 0x77b5ff76, 0x8c2302bf, 0xaaf47556, 0x5f46b02a, 0x2b092801, - 0x3d38f5f7, 0x0ca81f36, 0x52af4a8a, 0x66d5e7c0, 0xdf3b0874, 0x95055110, 0x1b5ad7a8, 0xf61ed5ad, - 0x6cf6e479, 0x20758184, 0xd0cefa65, 0x88f7be58, 0x4a046826, 0x0ff6f8f3, 0xa09c7f70, 0x5346aba0, - 0x5ce96c28, 0xe176eda3, 0x6bac307f, 0x376829d2, 0x85360fa9, 0x17e3fe2a, 0x24b79767, 0xf5a96b20, - 0xd6cd2595, 0x68ff1ebf, 0x7555442c, 0xf19f06be, 0xf9e0659a, 0xeeb9491d, 0x34010718, 0xbb30cab8, - 0xe822fe15, 0x88570983, 0x750e6249, 0xda627e55, 0x5e76ffa8, 0xb1534546, 0x6d47de08, 0xefe9e7d4, - }, - { - 0xf6fa8f9d, 0x2cac6ce1, 0x4ca34867, 0xe2337f7c, 0x95db08e7, 0x016843b4, 0xeced5cbc, 0x325553ac, - 0xbf9f0960, 0xdfa1e2ed, 0x83f0579d, 0x63ed86b9, 0x1ab6a6b8, 0xde5ebe39, 0xf38ff732, 0x8989b138, - 0x33f14961, 0xc01937bd, 0xf506c6da, 0xe4625e7e, 0xa308ea99, 0x4e23e33c, 0x79cbd7cc, 0x48a14367, - 0xa3149619, 0xfec94bd5, 0xa114174a, 0xeaa01866, 0xa084db2d, 0x09a8486f, 0xa888614a, 0x2900af98, - 0x01665991, 0xe1992863, 0xc8f30c60, 0x2e78ef3c, 0xd0d51932, 0xcf0fec14, 0xf7ca07d2, 0xd0a82072, - 0xfd41197e, 0x9305a6b0, 0xe86be3da, 0x74bed3cd, 0x372da53c, 0x4c7f4448, 0xdab5d440, 0x6dba0ec3, - 0x083919a7, 0x9fbaeed9, 0x49dbcfb0, 0x4e670c53, 0x5c3d9c01, 0x64bdb941, 0x2c0e636a, 0xba7dd9cd, - 0xea6f7388, 0xe70bc762, 0x35f29adb, 0x5c4cdd8d, 0xf0d48d8c, 0xb88153e2, 0x08a19866, 0x1ae2eac8, - 0x284caf89, 0xaa928223, 0x9334be53, 0x3b3a21bf, 0x16434be3, 0x9aea3906, 0xefe8c36e, 0xf890cdd9, - 0x80226dae, 0xc340a4a3, 0xdf7e9c09, 0xa694a807, 0x5b7c5ecc, 0x221db3a6, 0x9a69a02f, 0x68818a54, - 0xceb2296f, 0x53c0843a, 0xfe893655, 0x25bfe68a, 0xb4628abc, 0xcf222ebf, 0x25ac6f48, 0xa9a99387, - 0x53bddb65, 0xe76ffbe7, 0xe967fd78, 0x0ba93563, 0x8e342bc1, 0xe8a11be9, 0x4980740d, 0xc8087dfc, - 0x8de4bf99, 0xa11101a0, 0x7fd37975, 0xda5a26c0, 0xe81f994f, 0x9528cd89, 0xfd339fed, 0xb87834bf, - 0x5f04456d, 0x22258698, 0xc9c4c83b, 0x2dc156be, 0x4f628daa, 0x57f55ec5, 0xe2220abe, 0xd2916ebf, - 0x4ec75b95, 0x24f2c3c0, 0x42d15d99, 0xcd0d7fa0, 0x7b6e27ff, 0xa8dc8af0, 0x7345c106, 0xf41e232f, - 0x35162386, 0xe6ea8926, 0x3333b094, 0x157ec6f2, 0x372b74af, 0x692573e4, 0xe9a9d848, 0xf3160289, - 0x3a62ef1d, 0xa787e238, 0xf3a5f676, 0x74364853, 0x20951063, 0x4576698d, 0xb6fad407, 0x592af950, - 0x36f73523, 0x4cfb6e87, 0x7da4cec0, 0x6c152daa, 0xcb0396a8, 0xc50dfe5d, 0xfcd707ab, 0x0921c42f, - 0x89dff0bb, 0x5fe2be78, 0x448f4f33, 0x754613c9, 0x2b05d08d, 0x48b9d585, 0xdc049441, 0xc8098f9b, - 0x7dede786, 0xc39a3373, 0x42410005, 0x6a091751, 0x0ef3c8a6, 0x890072d6, 0x28207682, 0xa9a9f7be, - 0xbf32679d, 0xd45b5b75, 0xb353fd00, 0xcbb0e358, 0x830f220a, 0x1f8fb214, 0xd372cf08, 0xcc3c4a13, - 0x8cf63166, 0x061c87be, 0x88c98f88, 0x6062e397, 0x47cf8e7a, 0xb6c85283, 0x3cc2acfb, 0x3fc06976, - 0x4e8f0252, 0x64d8314d, 0xda3870e3, 0x1e665459, 0xc10908f0, 0x513021a5, 0x6c5b68b7, 0x822f8aa0, - 0x3007cd3e, 0x74719eef, 0xdc872681, 0x073340d4, 0x7e432fd9, 0x0c5ec241, 0x8809286c, 0xf592d891, - 0x08a930f6, 0x957ef305, 0xb7fbffbd, 0xc266e96f, 0x6fe4ac98, 0xb173ecc0, 0xbc60b42a, 0x953498da, - 0xfba1ae12, 0x2d4bd736, 0x0f25faab, 0xa4f3fceb, 0xe2969123, 0x257f0c3d, 0x9348af49, 0x361400bc, - 0xe8816f4a, 0x3814f200, 0xa3f94043, 0x9c7a54c2, 0xbc704f57, 0xda41e7f9, 0xc25ad33a, 0x54f4a084, - 0xb17f5505, 0x59357cbe, 0xedbd15c8, 0x7f97c5ab, 0xba5ac7b5, 0xb6f6deaf, 0x3a479c3a, 0x5302da25, - 0x653d7e6a, 0x54268d49, 0x51a477ea, 0x5017d55b, 0xd7d25d88, 0x44136c76, 0x0404a8c8, 0xb8e5a121, - 0xb81a928a, 0x60ed5869, 0x97c55b96, 0xeaec991b, 0x29935913, 0x01fdb7f1, 0x088e8dfa, 0x9ab6f6f5, - 0x3b4cbf9f, 0x4a5de3ab, 0xe6051d35, 0xa0e1d855, 0xd36b4cf1, 0xf544edeb, 0xb0e93524, 0xbebb8fbd, - 0xa2d762cf, 0x49c92f54, 0x38b5f331, 0x7128a454, 0x48392905, 0xa65b1db8, 0x851c97bd, 0xd675cf2f, - }, - { - 0x85e04019, 0x332bf567, 0x662dbfff, 0xcfc65693, 0x2a8d7f6f, 0xab9bc912, 0xde6008a1, 0x2028da1f, - 0x0227bce7, 0x4d642916, 0x18fac300, 0x50f18b82, 0x2cb2cb11, 0xb232e75c, 0x4b3695f2, 0xb28707de, - 0xa05fbcf6, 0xcd4181e9, 0xe150210c, 0xe24ef1bd, 0xb168c381, 0xfde4e789, 0x5c79b0d8, 0x1e8bfd43, - 0x4d495001, 0x38be4341, 0x913cee1d, 0x92a79c3f, 0x089766be, 0xbaeeadf4, 0x1286becf, 0xb6eacb19, - 0x2660c200, 0x7565bde4, 0x64241f7a, 0x8248dca9, 0xc3b3ad66, 0x28136086, 0x0bd8dfa8, 0x356d1cf2, - 0x107789be, 0xb3b2e9ce, 0x0502aa8f, 0x0bc0351e, 0x166bf52a, 0xeb12ff82, 0xe3486911, 0xd34d7516, - 0x4e7b3aff, 0x5f43671b, 0x9cf6e037, 0x4981ac83, 0x334266ce, 0x8c9341b7, 0xd0d854c0, 0xcb3a6c88, - 0x47bc2829, 0x4725ba37, 0xa66ad22b, 0x7ad61f1e, 0x0c5cbafa, 0x4437f107, 0xb6e79962, 0x42d2d816, - 0x0a961288, 0xe1a5c06e, 0x13749e67, 0x72fc081a, 0xb1d139f7, 0xf9583745, 0xcf19df58, 0xbec3f756, - 0xc06eba30, 0x07211b24, 0x45c28829, 0xc95e317f, 0xbc8ec511, 0x38bc46e9, 0xc6e6fa14, 0xbae8584a, - 0xad4ebc46, 0x468f508b, 0x7829435f, 0xf124183b, 0x821dba9f, 0xaff60ff4, 0xea2c4e6d, 0x16e39264, - 0x92544a8b, 0x009b4fc3, 0xaba68ced, 0x9ac96f78, 0x06a5b79a, 0xb2856e6e, 0x1aec3ca9, 0xbe838688, - 0x0e0804e9, 0x55f1be56, 0xe7e5363b, 0xb3a1f25d, 0xf7debb85, 0x61fe033c, 0x16746233, 0x3c034c28, - 0xda6d0c74, 0x79aac56c, 0x3ce4e1ad, 0x51f0c802, 0x98f8f35a, 0x1626a49f, 0xeed82b29, 0x1d382fe3, - 0x0c4fb99a, 0xbb325778, 0x3ec6d97b, 0x6e77a6a9, 0xcb658b5c, 0xd45230c7, 0x2bd1408b, 0x60c03eb7, - 0xb9068d78, 0xa33754f4, 0xf430c87d, 0xc8a71302, 0xb96d8c32, 0xebd4e7be, 0xbe8b9d2d, 0x7979fb06, - 0xe7225308, 0x8b75cf77, 0x11ef8da4, 0xe083c858, 0x8d6b786f, 0x5a6317a6, 0xfa5cf7a0, 0x5dda0033, - 0xf28ebfb0, 0xf5b9c310, 0xa0eac280, 0x08b9767a, 0xa3d9d2b0, 0x79d34217, 0x021a718d, 0x9ac6336a, - 0x2711fd60, 0x438050e3, 0x069908a8, 0x3d7fedc4, 0x826d2bef, 0x4eeb8476, 0x488dcf25, 0x36c9d566, - 0x28e74e41, 0xc2610aca, 0x3d49a9cf, 0xbae3b9df, 0xb65f8de6, 0x92aeaf64, 0x3ac7d5e6, 0x9ea80509, - 0xf22b017d, 0xa4173f70, 0xdd1e16c3, 0x15e0d7f9, 0x50b1b887, 0x2b9f4fd5, 0x625aba82, 0x6a017962, - 0x2ec01b9c, 0x15488aa9, 0xd716e740, 0x40055a2c, 0x93d29a22, 0xe32dbf9a, 0x058745b9, 0x3453dc1e, - 0xd699296e, 0x496cff6f, 0x1c9f4986, 0xdfe2ed07, 0xb87242d1, 0x19de7eae, 0x053e561a, 0x15ad6f8c, - 0x66626c1c, 0x7154c24c, 0xea082b2a, 0x93eb2939, 0x17dcb0f0, 0x58d4f2ae, 0x9ea294fb, 0x52cf564c, - 0x9883fe66, 0x2ec40581, 0x763953c3, 0x01d6692e, 0xd3a0c108, 0xa1e7160e, 0xe4f2dfa6, 0x693ed285, - 0x74904698, 0x4c2b0edd, 0x4f757656, 0x5d393378, 0xa132234f, 0x3d321c5d, 0xc3f5e194, 0x4b269301, - 0xc79f022f, 0x3c997e7e, 0x5e4f9504, 0x3ffafbbd, 0x76f7ad0e, 0x296693f4, 0x3d1fce6f, 0xc61e45be, - 0xd3b5ab34, 0xf72bf9b7, 0x1b0434c0, 0x4e72b567, 0x5592a33d, 0xb5229301, 0xcfd2a87f, 0x60aeb767, - 0x1814386b, 0x30bcc33d, 0x38a0c07d, 0xfd1606f2, 0xc363519b, 0x589dd390, 0x5479f8e6, 0x1cb8d647, - 0x97fd61a9, 0xea7759f4, 0x2d57539d, 0x569a58cf, 0xe84e63ad, 0x462e1b78, 0x6580f87e, 0xf3817914, - 0x91da55f4, 0x40a230f3, 0xd1988f35, 0xb6e318d2, 0x3ffa50bc, 0x3d40f021, 0xc3c0bdae, 0x4958c24c, - 0x518f36b2, 0x84b1d370, 0x0fedce83, 0x878ddada, 0xf2a279c7, 0x94e01be8, 0x90716f4b, 0x954b8aa3, - }, - { - 0xe216300d, 0xbbddfffc, 0xa7ebdabd, 0x35648095, 0x7789f8b7, 0xe6c1121b, 0x0e241600, 0x052ce8b5, - 0x11a9cfb0, 0xe5952f11, 0xece7990a, 0x9386d174, 0x2a42931c, 0x76e38111, 0xb12def3a, 0x37ddddfc, - 0xde9adeb1, 0x0a0cc32c, 0xbe197029, 0x84a00940, 0xbb243a0f, 0xb4d137cf, 0xb44e79f0, 0x049eedfd, - 0x0b15a15d, 0x480d3168, 0x8bbbde5a, 0x669ded42, 0xc7ece831, 0x3f8f95e7, 0x72df191b, 0x7580330d, - 0x94074251, 0x5c7dcdfa, 0xabbe6d63, 0xaa402164, 0xb301d40a, 0x02e7d1ca, 0x53571dae, 0x7a3182a2, - 0x12a8ddec, 0xfdaa335d, 0x176f43e8, 0x71fb46d4, 0x38129022, 0xce949ad4, 0xb84769ad, 0x965bd862, - 0x82f3d055, 0x66fb9767, 0x15b80b4e, 0x1d5b47a0, 0x4cfde06f, 0xc28ec4b8, 0x57e8726e, 0x647a78fc, - 0x99865d44, 0x608bd593, 0x6c200e03, 0x39dc5ff6, 0x5d0b00a3, 0xae63aff2, 0x7e8bd632, 0x70108c0c, - 0xbbd35049, 0x2998df04, 0x980cf42a, 0x9b6df491, 0x9e7edd53, 0x06918548, 0x58cb7e07, 0x3b74ef2e, - 0x522fffb1, 0xd24708cc, 0x1c7e27cd, 0xa4eb215b, 0x3cf1d2e2, 0x19b47a38, 0x424f7618, 0x35856039, - 0x9d17dee7, 0x27eb35e6, 0xc9aff67b, 0x36baf5b8, 0x09c467cd, 0xc18910b1, 0xe11dbf7b, 0x06cd1af8, - 0x7170c608, 0x2d5e3354, 0xd4de495a, 0x64c6d006, 0xbcc0c62c, 0x3dd00db3, 0x708f8f34, 0x77d51b42, - 0x264f620f, 0x24b8d2bf, 0x15c1b79e, 0x46a52564, 0xf8d7e54e, 0x3e378160, 0x7895cda5, 0x859c15a5, - 0xe6459788, 0xc37bc75f, 0xdb07ba0c, 0x0676a3ab, 0x7f229b1e, 0x31842e7b, 0x24259fd7, 0xf8bef472, - 0x835ffcb8, 0x6df4c1f2, 0x96f5b195, 0xfd0af0fc, 0xb0fe134c, 0xe2506d3d, 0x4f9b12ea, 0xf215f225, - 0xa223736f, 0x9fb4c428, 0x25d04979, 0x34c713f8, 0xc4618187, 0xea7a6e98, 0x7cd16efc, 0x1436876c, - 0xf1544107, 0xbedeee14, 0x56e9af27, 0xa04aa441, 0x3cf7c899, 0x92ecbae6, 0xdd67016d, 0x151682eb, - 0xa842eedf, 0xfdba60b4, 0xf1907b75, 0x20e3030f, 0x24d8c29e, 0xe139673b, 0xefa63fb8, 0x71873054, - 0xb6f2cf3b, 0x9f326442, 0xcb15a4cc, 0xb01a4504, 0xf1e47d8d, 0x844a1be5, 0xbae7dfdc, 0x42cbda70, - 0xcd7dae0a, 0x57e85b7a, 0xd53f5af6, 0x20cf4d8c, 0xcea4d428, 0x79d130a4, 0x3486ebfb, 0x33d3cddc, - 0x77853b53, 0x37effcb5, 0xc5068778, 0xe580b3e6, 0x4e68b8f4, 0xc5c8b37e, 0x0d809ea2, 0x398feb7c, - 0x132a4f94, 0x43b7950e, 0x2fee7d1c, 0x223613bd, 0xdd06caa2, 0x37df932b, 0xc4248289, 0xacf3ebc3, - 0x5715f6b7, 0xef3478dd, 0xf267616f, 0xc148cbe4, 0x9052815e, 0x5e410fab, 0xb48a2465, 0x2eda7fa4, - 0xe87b40e4, 0xe98ea084, 0x5889e9e1, 0xefd390fc, 0xdd07d35b, 0xdb485694, 0x38d7e5b2, 0x57720101, - 0x730edebc, 0x5b643113, 0x94917e4f, 0x503c2fba, 0x646f1282, 0x7523d24a, 0xe0779695, 0xf9c17a8f, - 0x7a5b2121, 0xd187b896, 0x29263a4d, 0xba510cdf, 0x81f47c9f, 0xad1163ed, 0xea7b5965, 0x1a00726e, - 0x11403092, 0x00da6d77, 0x4a0cdd61, 0xad1f4603, 0x605bdfb0, 0x9eedc364, 0x22ebe6a8, 0xcee7d28a, - 0xa0e736a0, 0x5564a6b9, 0x10853209, 0xc7eb8f37, 0x2de705ca, 0x8951570f, 0xdf09822b, 0xbd691a6c, - 0xaa12e4f2, 0x87451c0f, 0xe0f6a27a, 0x3ada4819, 0x4cf1764f, 0x0d771c2b, 0x67cdb156, 0x350d8384, - 0x5938fa0f, 0x42399ef3, 0x36997b07, 0x0e84093d, 0x4aa93e61, 0x8360d87b, 0x1fa98b0c, 0x1149382c, - 0xe97625a5, 0x0614d1b7, 0x0e25244b, 0x0c768347, 0x589e8d82, 0x0d2059d1, 0xa466bb1e, 0xf8da0a82, - 0x04f19130, 0xba6e4ec0, 0x99265164, 0x1ee7230d, 0x50b2ad80, 0xeaee6801, 0x8db2a283, 0xea8bf59e, - }, -} diff --git a/vendor/golang.org/x/crypto/cast5/cast5_test.go b/vendor/golang.org/x/crypto/cast5/cast5_test.go deleted file mode 100644 index 778b272a6..000000000 --- a/vendor/golang.org/x/crypto/cast5/cast5_test.go +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cast5 - -import ( - "bytes" - "encoding/hex" - "testing" -) - -// This test vector is taken from RFC 2144, App B.1. -// Since the other two test vectors are for reduced-round variants, we can't -// use them. -var basicTests = []struct { - key, plainText, cipherText string -}{ - { - "0123456712345678234567893456789a", - "0123456789abcdef", - "238b4fe5847e44b2", - }, -} - -func TestBasic(t *testing.T) { - for i, test := range basicTests { - key, _ := hex.DecodeString(test.key) - plainText, _ := hex.DecodeString(test.plainText) - expected, _ := hex.DecodeString(test.cipherText) - - c, err := NewCipher(key) - if err != nil { - t.Errorf("#%d: failed to create Cipher: %s", i, err) - continue - } - var cipherText [BlockSize]byte - c.Encrypt(cipherText[:], plainText) - if !bytes.Equal(cipherText[:], expected) { - t.Errorf("#%d: got:%x want:%x", i, cipherText, expected) - } - - var plainTextAgain [BlockSize]byte - c.Decrypt(plainTextAgain[:], cipherText[:]) - if !bytes.Equal(plainTextAgain[:], plainText) { - t.Errorf("#%d: got:%x want:%x", i, plainTextAgain, plainText) - } - } -} - -// TestFull performs the test specified in RFC 2144, App B.2. -// However, due to the length of time taken, it's disabled here and a more -// limited version is included, below. -func TestFull(t *testing.T) { - if testing.Short() { - // This is too slow for normal testing - return - } - - a, b := iterate(1000000) - - const expectedA = "eea9d0a249fd3ba6b3436fb89d6dca92" - const expectedB = "b2c95eb00c31ad7180ac05b8e83d696e" - - if hex.EncodeToString(a) != expectedA { - t.Errorf("a: got:%x want:%s", a, expectedA) - } - if hex.EncodeToString(b) != expectedB { - t.Errorf("b: got:%x want:%s", b, expectedB) - } -} - -func iterate(iterations int) ([]byte, []byte) { - const initValueHex = "0123456712345678234567893456789a" - - initValue, _ := hex.DecodeString(initValueHex) - - var a, b [16]byte - copy(a[:], initValue) - copy(b[:], initValue) - - for i := 0; i < iterations; i++ { - c, _ := NewCipher(b[:]) - c.Encrypt(a[:8], a[:8]) - c.Encrypt(a[8:], a[8:]) - c, _ = NewCipher(a[:]) - c.Encrypt(b[:8], b[:8]) - c.Encrypt(b[8:], b[8:]) - } - - return a[:], b[:] -} - -func TestLimited(t *testing.T) { - a, b := iterate(1000) - - const expectedA = "23f73b14b02a2ad7dfb9f2c35644798d" - const expectedB = "e5bf37eff14c456a40b21ce369370a9f" - - if hex.EncodeToString(a) != expectedA { - t.Errorf("a: got:%x want:%s", a, expectedA) - } - if hex.EncodeToString(b) != expectedB { - t.Errorf("b: got:%x want:%s", b, expectedB) - } -} diff --git a/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305.go b/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305.go deleted file mode 100644 index 3f0dcb9d8..000000000 --- a/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305.go +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package chacha20poly1305 implements the ChaCha20-Poly1305 AEAD as specified in RFC 7539. -package chacha20poly1305 // import "golang.org/x/crypto/chacha20poly1305" - -import ( - "crypto/cipher" - "errors" -) - -const ( - // KeySize is the size of the key used by this AEAD, in bytes. - KeySize = 32 - // NonceSize is the size of the nonce used with this AEAD, in bytes. - NonceSize = 12 -) - -type chacha20poly1305 struct { - key [32]byte -} - -// New returns a ChaCha20-Poly1305 AEAD that uses the given, 256-bit key. -func New(key []byte) (cipher.AEAD, error) { - if len(key) != KeySize { - return nil, errors.New("chacha20poly1305: bad key length") - } - ret := new(chacha20poly1305) - copy(ret.key[:], key) - return ret, nil -} - -func (c *chacha20poly1305) NonceSize() int { - return NonceSize -} - -func (c *chacha20poly1305) Overhead() int { - return 16 -} - -func (c *chacha20poly1305) Seal(dst, nonce, plaintext, additionalData []byte) []byte { - if len(nonce) != NonceSize { - panic("chacha20poly1305: bad nonce length passed to Seal") - } - - if uint64(len(plaintext)) > (1<<38)-64 { - panic("chacha20poly1305: plaintext too large") - } - - return c.seal(dst, nonce, plaintext, additionalData) -} - -var errOpen = errors.New("chacha20poly1305: message authentication failed") - -func (c *chacha20poly1305) Open(dst, nonce, ciphertext, additionalData []byte) ([]byte, error) { - if len(nonce) != NonceSize { - panic("chacha20poly1305: bad nonce length passed to Open") - } - if len(ciphertext) < 16 { - return nil, errOpen - } - if uint64(len(ciphertext)) > (1<<38)-48 { - panic("chacha20poly1305: ciphertext too large") - } - - return c.open(dst, nonce, ciphertext, additionalData) -} - -// sliceForAppend takes a slice and a requested number of bytes. It returns a -// slice with the contents of the given slice followed by that many bytes and a -// second slice that aliases into it and contains only the extra bytes. If the -// original slice has sufficient capacity then no allocation is performed. -func sliceForAppend(in []byte, n int) (head, tail []byte) { - if total := len(in) + n; cap(in) >= total { - head = in[:total] - } else { - head = make([]byte, total) - copy(head, in) - } - tail = head[len(in):] - return -} diff --git a/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.go b/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.go deleted file mode 100644 index 475503321..000000000 --- a/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.go +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build go1.7,amd64,!gccgo,!appengine - -package chacha20poly1305 - -import "encoding/binary" - -//go:noescape -func chacha20Poly1305Open(dst []byte, key []uint32, src, ad []byte) bool - -//go:noescape -func chacha20Poly1305Seal(dst []byte, key []uint32, src, ad []byte) - -//go:noescape -func haveSSSE3() bool - -var canUseASM bool - -func init() { - canUseASM = haveSSSE3() -} - -// setupState writes a ChaCha20 input matrix to state. See -// https://tools.ietf.org/html/rfc7539#section-2.3. -func setupState(state *[16]uint32, key *[32]byte, nonce []byte) { - state[0] = 0x61707865 - state[1] = 0x3320646e - state[2] = 0x79622d32 - state[3] = 0x6b206574 - - state[4] = binary.LittleEndian.Uint32(key[:4]) - state[5] = binary.LittleEndian.Uint32(key[4:8]) - state[6] = binary.LittleEndian.Uint32(key[8:12]) - state[7] = binary.LittleEndian.Uint32(key[12:16]) - state[8] = binary.LittleEndian.Uint32(key[16:20]) - state[9] = binary.LittleEndian.Uint32(key[20:24]) - state[10] = binary.LittleEndian.Uint32(key[24:28]) - state[11] = binary.LittleEndian.Uint32(key[28:32]) - - state[12] = 0 - state[13] = binary.LittleEndian.Uint32(nonce[:4]) - state[14] = binary.LittleEndian.Uint32(nonce[4:8]) - state[15] = binary.LittleEndian.Uint32(nonce[8:12]) -} - -func (c *chacha20poly1305) seal(dst, nonce, plaintext, additionalData []byte) []byte { - if !canUseASM { - return c.sealGeneric(dst, nonce, plaintext, additionalData) - } - - var state [16]uint32 - setupState(&state, &c.key, nonce) - - ret, out := sliceForAppend(dst, len(plaintext)+16) - chacha20Poly1305Seal(out[:], state[:], plaintext, additionalData) - return ret -} - -func (c *chacha20poly1305) open(dst, nonce, ciphertext, additionalData []byte) ([]byte, error) { - if !canUseASM { - return c.openGeneric(dst, nonce, ciphertext, additionalData) - } - - var state [16]uint32 - setupState(&state, &c.key, nonce) - - ciphertext = ciphertext[:len(ciphertext)-16] - ret, out := sliceForAppend(dst, len(ciphertext)) - if !chacha20Poly1305Open(out, state[:], ciphertext, additionalData) { - for i := range out { - out[i] = 0 - } - return nil, errOpen - } - - return ret, nil -} diff --git a/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.s b/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.s deleted file mode 100644 index 39c58b44a..000000000 --- a/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.s +++ /dev/null @@ -1,2721 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This file was originally from https://golang.org/cl/24717 by Vlad Krasnov of CloudFlare. - -// +build go1.7,amd64,!gccgo,!appengine - -#include "textflag.h" -// General register allocation -#define oup DI -#define inp SI -#define inl BX -#define adp CX // free to reuse, after we hash the additional data -#define keyp R8 // free to reuse, when we copy the key to stack -#define itr2 R9 // general iterator -#define itr1 CX // general iterator -#define acc0 R10 -#define acc1 R11 -#define acc2 R12 -#define t0 R13 -#define t1 R14 -#define t2 R15 -#define t3 R8 -// Register and stack allocation for the SSE code -#define rStore (0*16)(BP) -#define sStore (1*16)(BP) -#define state1Store (2*16)(BP) -#define state2Store (3*16)(BP) -#define tmpStore (4*16)(BP) -#define ctr0Store (5*16)(BP) -#define ctr1Store (6*16)(BP) -#define ctr2Store (7*16)(BP) -#define ctr3Store (8*16)(BP) -#define A0 X0 -#define A1 X1 -#define A2 X2 -#define B0 X3 -#define B1 X4 -#define B2 X5 -#define C0 X6 -#define C1 X7 -#define C2 X8 -#define D0 X9 -#define D1 X10 -#define D2 X11 -#define T0 X12 -#define T1 X13 -#define T2 X14 -#define T3 X15 -#define A3 T0 -#define B3 T1 -#define C3 T2 -#define D3 T3 -// Register and stack allocation for the AVX2 code -#define rsStoreAVX2 (0*32)(BP) -#define state1StoreAVX2 (1*32)(BP) -#define state2StoreAVX2 (2*32)(BP) -#define ctr0StoreAVX2 (3*32)(BP) -#define ctr1StoreAVX2 (4*32)(BP) -#define ctr2StoreAVX2 (5*32)(BP) -#define ctr3StoreAVX2 (6*32)(BP) -#define tmpStoreAVX2 (7*32)(BP) // 256 bytes on stack -#define AA0 Y0 -#define AA1 Y5 -#define AA2 Y6 -#define AA3 Y7 -#define BB0 Y14 -#define BB1 Y9 -#define BB2 Y10 -#define BB3 Y11 -#define CC0 Y12 -#define CC1 Y13 -#define CC2 Y8 -#define CC3 Y15 -#define DD0 Y4 -#define DD1 Y1 -#define DD2 Y2 -#define DD3 Y3 -#define TT0 DD3 -#define TT1 AA3 -#define TT2 BB3 -#define TT3 CC3 -// ChaCha20 constants -DATA ·chacha20Constants<>+0x00(SB)/4, $0x61707865 -DATA ·chacha20Constants<>+0x04(SB)/4, $0x3320646e -DATA ·chacha20Constants<>+0x08(SB)/4, $0x79622d32 -DATA ·chacha20Constants<>+0x0c(SB)/4, $0x6b206574 -DATA ·chacha20Constants<>+0x10(SB)/4, $0x61707865 -DATA ·chacha20Constants<>+0x14(SB)/4, $0x3320646e -DATA ·chacha20Constants<>+0x18(SB)/4, $0x79622d32 -DATA ·chacha20Constants<>+0x1c(SB)/4, $0x6b206574 -// <<< 16 with PSHUFB -DATA ·rol16<>+0x00(SB)/8, $0x0504070601000302 -DATA ·rol16<>+0x08(SB)/8, $0x0D0C0F0E09080B0A -DATA ·rol16<>+0x10(SB)/8, $0x0504070601000302 -DATA ·rol16<>+0x18(SB)/8, $0x0D0C0F0E09080B0A -// <<< 8 with PSHUFB -DATA ·rol8<>+0x00(SB)/8, $0x0605040702010003 -DATA ·rol8<>+0x08(SB)/8, $0x0E0D0C0F0A09080B -DATA ·rol8<>+0x10(SB)/8, $0x0605040702010003 -DATA ·rol8<>+0x18(SB)/8, $0x0E0D0C0F0A09080B - -DATA ·avx2InitMask<>+0x00(SB)/8, $0x0 -DATA ·avx2InitMask<>+0x08(SB)/8, $0x0 -DATA ·avx2InitMask<>+0x10(SB)/8, $0x1 -DATA ·avx2InitMask<>+0x18(SB)/8, $0x0 - -DATA ·avx2IncMask<>+0x00(SB)/8, $0x2 -DATA ·avx2IncMask<>+0x08(SB)/8, $0x0 -DATA ·avx2IncMask<>+0x10(SB)/8, $0x2 -DATA ·avx2IncMask<>+0x18(SB)/8, $0x0 -// Poly1305 key clamp -DATA ·polyClampMask<>+0x00(SB)/8, $0x0FFFFFFC0FFFFFFF -DATA ·polyClampMask<>+0x08(SB)/8, $0x0FFFFFFC0FFFFFFC -DATA ·polyClampMask<>+0x10(SB)/8, $0xFFFFFFFFFFFFFFFF -DATA ·polyClampMask<>+0x18(SB)/8, $0xFFFFFFFFFFFFFFFF - -DATA ·sseIncMask<>+0x00(SB)/8, $0x1 -DATA ·sseIncMask<>+0x08(SB)/8, $0x0 -// To load/store the last < 16 bytes in a buffer -DATA ·andMask<>+0x00(SB)/8, $0x00000000000000ff -DATA ·andMask<>+0x08(SB)/8, $0x0000000000000000 -DATA ·andMask<>+0x10(SB)/8, $0x000000000000ffff -DATA ·andMask<>+0x18(SB)/8, $0x0000000000000000 -DATA ·andMask<>+0x20(SB)/8, $0x0000000000ffffff -DATA ·andMask<>+0x28(SB)/8, $0x0000000000000000 -DATA ·andMask<>+0x30(SB)/8, $0x00000000ffffffff -DATA ·andMask<>+0x38(SB)/8, $0x0000000000000000 -DATA ·andMask<>+0x40(SB)/8, $0x000000ffffffffff -DATA ·andMask<>+0x48(SB)/8, $0x0000000000000000 -DATA ·andMask<>+0x50(SB)/8, $0x0000ffffffffffff -DATA ·andMask<>+0x58(SB)/8, $0x0000000000000000 -DATA ·andMask<>+0x60(SB)/8, $0x00ffffffffffffff -DATA ·andMask<>+0x68(SB)/8, $0x0000000000000000 -DATA ·andMask<>+0x70(SB)/8, $0xffffffffffffffff -DATA ·andMask<>+0x78(SB)/8, $0x0000000000000000 -DATA ·andMask<>+0x80(SB)/8, $0xffffffffffffffff -DATA ·andMask<>+0x88(SB)/8, $0x00000000000000ff -DATA ·andMask<>+0x90(SB)/8, $0xffffffffffffffff -DATA ·andMask<>+0x98(SB)/8, $0x000000000000ffff -DATA ·andMask<>+0xa0(SB)/8, $0xffffffffffffffff -DATA ·andMask<>+0xa8(SB)/8, $0x0000000000ffffff -DATA ·andMask<>+0xb0(SB)/8, $0xffffffffffffffff -DATA ·andMask<>+0xb8(SB)/8, $0x00000000ffffffff -DATA ·andMask<>+0xc0(SB)/8, $0xffffffffffffffff -DATA ·andMask<>+0xc8(SB)/8, $0x000000ffffffffff -DATA ·andMask<>+0xd0(SB)/8, $0xffffffffffffffff -DATA ·andMask<>+0xd8(SB)/8, $0x0000ffffffffffff -DATA ·andMask<>+0xe0(SB)/8, $0xffffffffffffffff -DATA ·andMask<>+0xe8(SB)/8, $0x00ffffffffffffff - -GLOBL ·chacha20Constants<>(SB), (NOPTR+RODATA), $32 -GLOBL ·rol16<>(SB), (NOPTR+RODATA), $32 -GLOBL ·rol8<>(SB), (NOPTR+RODATA), $32 -GLOBL ·sseIncMask<>(SB), (NOPTR+RODATA), $16 -GLOBL ·avx2IncMask<>(SB), (NOPTR+RODATA), $32 -GLOBL ·avx2InitMask<>(SB), (NOPTR+RODATA), $32 -GLOBL ·polyClampMask<>(SB), (NOPTR+RODATA), $32 -GLOBL ·andMask<>(SB), (NOPTR+RODATA), $240 -// No PALIGNR in Go ASM yet (but VPALIGNR is present). -#define shiftB0Left BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xdb; BYTE $0x04 // PALIGNR $4, X3, X3 -#define shiftB1Left BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xe4; BYTE $0x04 // PALIGNR $4, X4, X4 -#define shiftB2Left BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xed; BYTE $0x04 // PALIGNR $4, X5, X5 -#define shiftB3Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xed; BYTE $0x04 // PALIGNR $4, X13, X13 -#define shiftC0Left BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xf6; BYTE $0x08 // PALIGNR $8, X6, X6 -#define shiftC1Left BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xff; BYTE $0x08 // PALIGNR $8, X7, X7 -#define shiftC2Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xc0; BYTE $0x08 // PALIGNR $8, X8, X8 -#define shiftC3Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xf6; BYTE $0x08 // PALIGNR $8, X14, X14 -#define shiftD0Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xc9; BYTE $0x0c // PALIGNR $12, X9, X9 -#define shiftD1Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xd2; BYTE $0x0c // PALIGNR $12, X10, X10 -#define shiftD2Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xdb; BYTE $0x0c // PALIGNR $12, X11, X11 -#define shiftD3Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xff; BYTE $0x0c // PALIGNR $12, X15, X15 -#define shiftB0Right BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xdb; BYTE $0x0c // PALIGNR $12, X3, X3 -#define shiftB1Right BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xe4; BYTE $0x0c // PALIGNR $12, X4, X4 -#define shiftB2Right BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xed; BYTE $0x0c // PALIGNR $12, X5, X5 -#define shiftB3Right BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xed; BYTE $0x0c // PALIGNR $12, X13, X13 -#define shiftC0Right shiftC0Left -#define shiftC1Right shiftC1Left -#define shiftC2Right shiftC2Left -#define shiftC3Right shiftC3Left -#define shiftD0Right BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xc9; BYTE $0x04 // PALIGNR $4, X9, X9 -#define shiftD1Right BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xd2; BYTE $0x04 // PALIGNR $4, X10, X10 -#define shiftD2Right BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xdb; BYTE $0x04 // PALIGNR $4, X11, X11 -#define shiftD3Right BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xff; BYTE $0x04 // PALIGNR $4, X15, X15 -// Some macros -#define chachaQR(A, B, C, D, T) \ - PADDD B, A; PXOR A, D; PSHUFB ·rol16<>(SB), D \ - PADDD D, C; PXOR C, B; MOVO B, T; PSLLL $12, T; PSRLL $20, B; PXOR T, B \ - PADDD B, A; PXOR A, D; PSHUFB ·rol8<>(SB), D \ - PADDD D, C; PXOR C, B; MOVO B, T; PSLLL $7, T; PSRLL $25, B; PXOR T, B - -#define chachaQR_AVX2(A, B, C, D, T) \ - VPADDD B, A, A; VPXOR A, D, D; VPSHUFB ·rol16<>(SB), D, D \ - VPADDD D, C, C; VPXOR C, B, B; VPSLLD $12, B, T; VPSRLD $20, B, B; VPXOR T, B, B \ - VPADDD B, A, A; VPXOR A, D, D; VPSHUFB ·rol8<>(SB), D, D \ - VPADDD D, C, C; VPXOR C, B, B; VPSLLD $7, B, T; VPSRLD $25, B, B; VPXOR T, B, B - -#define polyAdd(S) ADDQ S, acc0; ADCQ 8+S, acc1; ADCQ $1, acc2 -#define polyMulStage1 MOVQ (0*8)(BP), AX; MOVQ AX, t2; MULQ acc0; MOVQ AX, t0; MOVQ DX, t1; MOVQ (0*8)(BP), AX; MULQ acc1; IMULQ acc2, t2; ADDQ AX, t1; ADCQ DX, t2 -#define polyMulStage2 MOVQ (1*8)(BP), AX; MOVQ AX, t3; MULQ acc0; ADDQ AX, t1; ADCQ $0, DX; MOVQ DX, acc0; MOVQ (1*8)(BP), AX; MULQ acc1; ADDQ AX, t2; ADCQ $0, DX -#define polyMulStage3 IMULQ acc2, t3; ADDQ acc0, t2; ADCQ DX, t3 -#define polyMulReduceStage MOVQ t0, acc0; MOVQ t1, acc1; MOVQ t2, acc2; ANDQ $3, acc2; MOVQ t2, t0; ANDQ $-4, t0; MOVQ t3, t1; SHRQ $2, t2:t3; SHRQ $2, t3; ADDQ t0, acc0; ADCQ t1, acc1; ADCQ $0, acc2; ADDQ t2, acc0; ADCQ t3, acc1; ADCQ $0, acc2 - -#define polyMulStage1_AVX2 MOVQ (0*8)(BP), DX; MOVQ DX, t2; MULXQ acc0, t0, t1; IMULQ acc2, t2; MULXQ acc1, AX, DX; ADDQ AX, t1; ADCQ DX, t2 -#define polyMulStage2_AVX2 MOVQ (1*8)(BP), DX; MULXQ acc0, acc0, AX; ADDQ acc0, t1; MULXQ acc1, acc1, t3; ADCQ acc1, t2; ADCQ $0, t3 -#define polyMulStage3_AVX2 IMULQ acc2, DX; ADDQ AX, t2; ADCQ DX, t3 - -#define polyMul polyMulStage1; polyMulStage2; polyMulStage3; polyMulReduceStage -#define polyMulAVX2 polyMulStage1_AVX2; polyMulStage2_AVX2; polyMulStage3_AVX2; polyMulReduceStage -// ---------------------------------------------------------------------------- -TEXT polyHashADInternal<>(SB), NOSPLIT, $0 - // adp points to beginning of additional data - // itr2 holds ad length - XORQ acc0, acc0 - XORQ acc1, acc1 - XORQ acc2, acc2 - CMPQ itr2, $13 - JNE hashADLoop - -openFastTLSAD: - // Special treatment for the TLS case of 13 bytes - MOVQ (adp), acc0 - MOVQ 5(adp), acc1 - SHRQ $24, acc1 - MOVQ $1, acc2 - polyMul - RET - -hashADLoop: - // Hash in 16 byte chunks - CMPQ itr2, $16 - JB hashADTail - polyAdd(0(adp)) - LEAQ (1*16)(adp), adp - SUBQ $16, itr2 - polyMul - JMP hashADLoop - -hashADTail: - CMPQ itr2, $0 - JE hashADDone - - // Hash last < 16 byte tail - XORQ t0, t0 - XORQ t1, t1 - XORQ t2, t2 - ADDQ itr2, adp - -hashADTailLoop: - SHLQ $8, t1:t0 - SHLQ $8, t0 - MOVB -1(adp), t2 - XORQ t2, t0 - DECQ adp - DECQ itr2 - JNE hashADTailLoop - -hashADTailFinish: - ADDQ t0, acc0; ADCQ t1, acc1; ADCQ $1, acc2 - polyMul - - // Finished AD -hashADDone: - RET - -// ---------------------------------------------------------------------------- -// func chacha20Poly1305Open(dst, key, src, ad []byte) bool -TEXT ·chacha20Poly1305Open(SB), 0, $288-97 - // For aligned stack access - MOVQ SP, BP - ADDQ $32, BP - ANDQ $-32, BP - MOVQ dst+0(FP), oup - MOVQ key+24(FP), keyp - MOVQ src+48(FP), inp - MOVQ src_len+56(FP), inl - MOVQ ad+72(FP), adp - - // Check for AVX2 support - CMPB runtime·support_avx2(SB), $0 - JE noavx2bmi2Open - - // Check BMI2 bit for MULXQ. - // runtime·cpuid_ebx7 is always available here - // because it passed avx2 check - TESTL $(1<<8), runtime·cpuid_ebx7(SB) - JNE chacha20Poly1305Open_AVX2 -noavx2bmi2Open: - - // Special optimization, for very short buffers - CMPQ inl, $128 - JBE openSSE128 // About 16% faster - - // For long buffers, prepare the poly key first - MOVOU ·chacha20Constants<>(SB), A0 - MOVOU (1*16)(keyp), B0 - MOVOU (2*16)(keyp), C0 - MOVOU (3*16)(keyp), D0 - MOVO D0, T1 - - // Store state on stack for future use - MOVO B0, state1Store - MOVO C0, state2Store - MOVO D0, ctr3Store - MOVQ $10, itr2 - -openSSEPreparePolyKey: - chachaQR(A0, B0, C0, D0, T0) - shiftB0Left; shiftC0Left; shiftD0Left - chachaQR(A0, B0, C0, D0, T0) - shiftB0Right; shiftC0Right; shiftD0Right - DECQ itr2 - JNE openSSEPreparePolyKey - - // A0|B0 hold the Poly1305 32-byte key, C0,D0 can be discarded - PADDL ·chacha20Constants<>(SB), A0; PADDL state1Store, B0 - - // Clamp and store the key - PAND ·polyClampMask<>(SB), A0 - MOVO A0, rStore; MOVO B0, sStore - - // Hash AAD - MOVQ ad_len+80(FP), itr2 - CALL polyHashADInternal<>(SB) - -openSSEMainLoop: - CMPQ inl, $256 - JB openSSEMainLoopDone - - // Load state, increment counter blocks - MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0 - MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 - MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 - MOVO A2, A3; MOVO B2, B3; MOVO C2, C3; MOVO D2, D3; PADDL ·sseIncMask<>(SB), D3 - - // Store counters - MOVO D0, ctr0Store; MOVO D1, ctr1Store; MOVO D2, ctr2Store; MOVO D3, ctr3Store - - // There are 10 ChaCha20 iterations of 2QR each, so for 6 iterations we hash 2 blocks, and for the remaining 4 only 1 block - for a total of 16 - MOVQ $4, itr1 - MOVQ inp, itr2 - -openSSEInternalLoop: - MOVO C3, tmpStore - chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) - MOVO tmpStore, C3 - MOVO C1, tmpStore - chachaQR(A3, B3, C3, D3, C1) - MOVO tmpStore, C1 - polyAdd(0(itr2)) - shiftB0Left; shiftB1Left; shiftB2Left; shiftB3Left - shiftC0Left; shiftC1Left; shiftC2Left; shiftC3Left - shiftD0Left; shiftD1Left; shiftD2Left; shiftD3Left - polyMulStage1 - polyMulStage2 - LEAQ (2*8)(itr2), itr2 - MOVO C3, tmpStore - chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) - MOVO tmpStore, C3 - MOVO C1, tmpStore - polyMulStage3 - chachaQR(A3, B3, C3, D3, C1) - MOVO tmpStore, C1 - polyMulReduceStage - shiftB0Right; shiftB1Right; shiftB2Right; shiftB3Right - shiftC0Right; shiftC1Right; shiftC2Right; shiftC3Right - shiftD0Right; shiftD1Right; shiftD2Right; shiftD3Right - DECQ itr1 - JGE openSSEInternalLoop - - polyAdd(0(itr2)) - polyMul - LEAQ (2*8)(itr2), itr2 - - CMPQ itr1, $-6 - JG openSSEInternalLoop - - // Add in the state - PADDD ·chacha20Constants<>(SB), A0; PADDD ·chacha20Constants<>(SB), A1; PADDD ·chacha20Constants<>(SB), A2; PADDD ·chacha20Constants<>(SB), A3 - PADDD state1Store, B0; PADDD state1Store, B1; PADDD state1Store, B2; PADDD state1Store, B3 - PADDD state2Store, C0; PADDD state2Store, C1; PADDD state2Store, C2; PADDD state2Store, C3 - PADDD ctr0Store, D0; PADDD ctr1Store, D1; PADDD ctr2Store, D2; PADDD ctr3Store, D3 - - // Load - xor - store - MOVO D3, tmpStore - MOVOU (0*16)(inp), D3; PXOR D3, A0; MOVOU A0, (0*16)(oup) - MOVOU (1*16)(inp), D3; PXOR D3, B0; MOVOU B0, (1*16)(oup) - MOVOU (2*16)(inp), D3; PXOR D3, C0; MOVOU C0, (2*16)(oup) - MOVOU (3*16)(inp), D3; PXOR D3, D0; MOVOU D0, (3*16)(oup) - MOVOU (4*16)(inp), D0; PXOR D0, A1; MOVOU A1, (4*16)(oup) - MOVOU (5*16)(inp), D0; PXOR D0, B1; MOVOU B1, (5*16)(oup) - MOVOU (6*16)(inp), D0; PXOR D0, C1; MOVOU C1, (6*16)(oup) - MOVOU (7*16)(inp), D0; PXOR D0, D1; MOVOU D1, (7*16)(oup) - MOVOU (8*16)(inp), D0; PXOR D0, A2; MOVOU A2, (8*16)(oup) - MOVOU (9*16)(inp), D0; PXOR D0, B2; MOVOU B2, (9*16)(oup) - MOVOU (10*16)(inp), D0; PXOR D0, C2; MOVOU C2, (10*16)(oup) - MOVOU (11*16)(inp), D0; PXOR D0, D2; MOVOU D2, (11*16)(oup) - MOVOU (12*16)(inp), D0; PXOR D0, A3; MOVOU A3, (12*16)(oup) - MOVOU (13*16)(inp), D0; PXOR D0, B3; MOVOU B3, (13*16)(oup) - MOVOU (14*16)(inp), D0; PXOR D0, C3; MOVOU C3, (14*16)(oup) - MOVOU (15*16)(inp), D0; PXOR tmpStore, D0; MOVOU D0, (15*16)(oup) - LEAQ 256(inp), inp - LEAQ 256(oup), oup - SUBQ $256, inl - JMP openSSEMainLoop - -openSSEMainLoopDone: - // Handle the various tail sizes efficiently - TESTQ inl, inl - JE openSSEFinalize - CMPQ inl, $64 - JBE openSSETail64 - CMPQ inl, $128 - JBE openSSETail128 - CMPQ inl, $192 - JBE openSSETail192 - JMP openSSETail256 - -openSSEFinalize: - // Hash in the PT, AAD lengths - ADDQ ad_len+80(FP), acc0; ADCQ src_len+56(FP), acc1; ADCQ $1, acc2 - polyMul - - // Final reduce - MOVQ acc0, t0 - MOVQ acc1, t1 - MOVQ acc2, t2 - SUBQ $-5, acc0 - SBBQ $-1, acc1 - SBBQ $3, acc2 - CMOVQCS t0, acc0 - CMOVQCS t1, acc1 - CMOVQCS t2, acc2 - - // Add in the "s" part of the key - ADDQ 0+sStore, acc0 - ADCQ 8+sStore, acc1 - - // Finally, constant time compare to the tag at the end of the message - XORQ AX, AX - MOVQ $1, DX - XORQ (0*8)(inp), acc0 - XORQ (1*8)(inp), acc1 - ORQ acc1, acc0 - CMOVQEQ DX, AX - - // Return true iff tags are equal - MOVB AX, ret+96(FP) - RET - -// ---------------------------------------------------------------------------- -// Special optimization for buffers smaller than 129 bytes -openSSE128: - // For up to 128 bytes of ciphertext and 64 bytes for the poly key, we require to process three blocks - MOVOU ·chacha20Constants<>(SB), A0; MOVOU (1*16)(keyp), B0; MOVOU (2*16)(keyp), C0; MOVOU (3*16)(keyp), D0 - MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 - MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 - MOVO B0, T1; MOVO C0, T2; MOVO D1, T3 - MOVQ $10, itr2 - -openSSE128InnerCipherLoop: - chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) - shiftB0Left; shiftB1Left; shiftB2Left - shiftC0Left; shiftC1Left; shiftC2Left - shiftD0Left; shiftD1Left; shiftD2Left - chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) - shiftB0Right; shiftB1Right; shiftB2Right - shiftC0Right; shiftC1Right; shiftC2Right - shiftD0Right; shiftD1Right; shiftD2Right - DECQ itr2 - JNE openSSE128InnerCipherLoop - - // A0|B0 hold the Poly1305 32-byte key, C0,D0 can be discarded - PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1; PADDL ·chacha20Constants<>(SB), A2 - PADDL T1, B0; PADDL T1, B1; PADDL T1, B2 - PADDL T2, C1; PADDL T2, C2 - PADDL T3, D1; PADDL ·sseIncMask<>(SB), T3; PADDL T3, D2 - - // Clamp and store the key - PAND ·polyClampMask<>(SB), A0 - MOVOU A0, rStore; MOVOU B0, sStore - - // Hash - MOVQ ad_len+80(FP), itr2 - CALL polyHashADInternal<>(SB) - -openSSE128Open: - CMPQ inl, $16 - JB openSSETail16 - SUBQ $16, inl - - // Load for hashing - polyAdd(0(inp)) - - // Load for decryption - MOVOU (inp), T0; PXOR T0, A1; MOVOU A1, (oup) - LEAQ (1*16)(inp), inp - LEAQ (1*16)(oup), oup - polyMul - - // Shift the stream "left" - MOVO B1, A1 - MOVO C1, B1 - MOVO D1, C1 - MOVO A2, D1 - MOVO B2, A2 - MOVO C2, B2 - MOVO D2, C2 - JMP openSSE128Open - -openSSETail16: - TESTQ inl, inl - JE openSSEFinalize - - // We can safely load the CT from the end, because it is padded with the MAC - MOVQ inl, itr2 - SHLQ $4, itr2 - LEAQ ·andMask<>(SB), t0 - MOVOU (inp), T0 - ADDQ inl, inp - PAND -16(t0)(itr2*1), T0 - MOVO T0, 0+tmpStore - MOVQ T0, t0 - MOVQ 8+tmpStore, t1 - PXOR A1, T0 - - // We can only store one byte at a time, since plaintext can be shorter than 16 bytes -openSSETail16Store: - MOVQ T0, t3 - MOVB t3, (oup) - PSRLDQ $1, T0 - INCQ oup - DECQ inl - JNE openSSETail16Store - ADDQ t0, acc0; ADCQ t1, acc1; ADCQ $1, acc2 - polyMul - JMP openSSEFinalize - -// ---------------------------------------------------------------------------- -// Special optimization for the last 64 bytes of ciphertext -openSSETail64: - // Need to decrypt up to 64 bytes - prepare single block - MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0; MOVO D0, ctr0Store - XORQ itr2, itr2 - MOVQ inl, itr1 - CMPQ itr1, $16 - JB openSSETail64LoopB - -openSSETail64LoopA: - // Perform ChaCha rounds, while hashing the remaining input - polyAdd(0(inp)(itr2*1)) - polyMul - SUBQ $16, itr1 - -openSSETail64LoopB: - ADDQ $16, itr2 - chachaQR(A0, B0, C0, D0, T0) - shiftB0Left; shiftC0Left; shiftD0Left - chachaQR(A0, B0, C0, D0, T0) - shiftB0Right; shiftC0Right; shiftD0Right - - CMPQ itr1, $16 - JAE openSSETail64LoopA - - CMPQ itr2, $160 - JNE openSSETail64LoopB - - PADDL ·chacha20Constants<>(SB), A0; PADDL state1Store, B0; PADDL state2Store, C0; PADDL ctr0Store, D0 - -openSSETail64DecLoop: - CMPQ inl, $16 - JB openSSETail64DecLoopDone - SUBQ $16, inl - MOVOU (inp), T0 - PXOR T0, A0 - MOVOU A0, (oup) - LEAQ 16(inp), inp - LEAQ 16(oup), oup - MOVO B0, A0 - MOVO C0, B0 - MOVO D0, C0 - JMP openSSETail64DecLoop - -openSSETail64DecLoopDone: - MOVO A0, A1 - JMP openSSETail16 - -// ---------------------------------------------------------------------------- -// Special optimization for the last 128 bytes of ciphertext -openSSETail128: - // Need to decrypt up to 128 bytes - prepare two blocks - MOVO ·chacha20Constants<>(SB), A1; MOVO state1Store, B1; MOVO state2Store, C1; MOVO ctr3Store, D1; PADDL ·sseIncMask<>(SB), D1; MOVO D1, ctr0Store - MOVO A1, A0; MOVO B1, B0; MOVO C1, C0; MOVO D1, D0; PADDL ·sseIncMask<>(SB), D0; MOVO D0, ctr1Store - XORQ itr2, itr2 - MOVQ inl, itr1 - ANDQ $-16, itr1 - -openSSETail128LoopA: - // Perform ChaCha rounds, while hashing the remaining input - polyAdd(0(inp)(itr2*1)) - polyMul - -openSSETail128LoopB: - ADDQ $16, itr2 - chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0) - shiftB0Left; shiftC0Left; shiftD0Left - shiftB1Left; shiftC1Left; shiftD1Left - chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0) - shiftB0Right; shiftC0Right; shiftD0Right - shiftB1Right; shiftC1Right; shiftD1Right - - CMPQ itr2, itr1 - JB openSSETail128LoopA - - CMPQ itr2, $160 - JNE openSSETail128LoopB - - PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1 - PADDL state1Store, B0; PADDL state1Store, B1 - PADDL state2Store, C0; PADDL state2Store, C1 - PADDL ctr1Store, D0; PADDL ctr0Store, D1 - - MOVOU (0*16)(inp), T0; MOVOU (1*16)(inp), T1; MOVOU (2*16)(inp), T2; MOVOU (3*16)(inp), T3 - PXOR T0, A1; PXOR T1, B1; PXOR T2, C1; PXOR T3, D1 - MOVOU A1, (0*16)(oup); MOVOU B1, (1*16)(oup); MOVOU C1, (2*16)(oup); MOVOU D1, (3*16)(oup) - - SUBQ $64, inl - LEAQ 64(inp), inp - LEAQ 64(oup), oup - JMP openSSETail64DecLoop - -// ---------------------------------------------------------------------------- -// Special optimization for the last 192 bytes of ciphertext -openSSETail192: - // Need to decrypt up to 192 bytes - prepare three blocks - MOVO ·chacha20Constants<>(SB), A2; MOVO state1Store, B2; MOVO state2Store, C2; MOVO ctr3Store, D2; PADDL ·sseIncMask<>(SB), D2; MOVO D2, ctr0Store - MOVO A2, A1; MOVO B2, B1; MOVO C2, C1; MOVO D2, D1; PADDL ·sseIncMask<>(SB), D1; MOVO D1, ctr1Store - MOVO A1, A0; MOVO B1, B0; MOVO C1, C0; MOVO D1, D0; PADDL ·sseIncMask<>(SB), D0; MOVO D0, ctr2Store - - MOVQ inl, itr1 - MOVQ $160, itr2 - CMPQ itr1, $160 - CMOVQGT itr2, itr1 - ANDQ $-16, itr1 - XORQ itr2, itr2 - -openSSLTail192LoopA: - // Perform ChaCha rounds, while hashing the remaining input - polyAdd(0(inp)(itr2*1)) - polyMul - -openSSLTail192LoopB: - ADDQ $16, itr2 - chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) - shiftB0Left; shiftC0Left; shiftD0Left - shiftB1Left; shiftC1Left; shiftD1Left - shiftB2Left; shiftC2Left; shiftD2Left - - chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) - shiftB0Right; shiftC0Right; shiftD0Right - shiftB1Right; shiftC1Right; shiftD1Right - shiftB2Right; shiftC2Right; shiftD2Right - - CMPQ itr2, itr1 - JB openSSLTail192LoopA - - CMPQ itr2, $160 - JNE openSSLTail192LoopB - - CMPQ inl, $176 - JB openSSLTail192Store - - polyAdd(160(inp)) - polyMul - - CMPQ inl, $192 - JB openSSLTail192Store - - polyAdd(176(inp)) - polyMul - -openSSLTail192Store: - PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1; PADDL ·chacha20Constants<>(SB), A2 - PADDL state1Store, B0; PADDL state1Store, B1; PADDL state1Store, B2 - PADDL state2Store, C0; PADDL state2Store, C1; PADDL state2Store, C2 - PADDL ctr2Store, D0; PADDL ctr1Store, D1; PADDL ctr0Store, D2 - - MOVOU (0*16)(inp), T0; MOVOU (1*16)(inp), T1; MOVOU (2*16)(inp), T2; MOVOU (3*16)(inp), T3 - PXOR T0, A2; PXOR T1, B2; PXOR T2, C2; PXOR T3, D2 - MOVOU A2, (0*16)(oup); MOVOU B2, (1*16)(oup); MOVOU C2, (2*16)(oup); MOVOU D2, (3*16)(oup) - - MOVOU (4*16)(inp), T0; MOVOU (5*16)(inp), T1; MOVOU (6*16)(inp), T2; MOVOU (7*16)(inp), T3 - PXOR T0, A1; PXOR T1, B1; PXOR T2, C1; PXOR T3, D1 - MOVOU A1, (4*16)(oup); MOVOU B1, (5*16)(oup); MOVOU C1, (6*16)(oup); MOVOU D1, (7*16)(oup) - - SUBQ $128, inl - LEAQ 128(inp), inp - LEAQ 128(oup), oup - JMP openSSETail64DecLoop - -// ---------------------------------------------------------------------------- -// Special optimization for the last 256 bytes of ciphertext -openSSETail256: - // Need to decrypt up to 256 bytes - prepare four blocks - MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0 - MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 - MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 - MOVO A2, A3; MOVO B2, B3; MOVO C2, C3; MOVO D2, D3; PADDL ·sseIncMask<>(SB), D3 - - // Store counters - MOVO D0, ctr0Store; MOVO D1, ctr1Store; MOVO D2, ctr2Store; MOVO D3, ctr3Store - XORQ itr2, itr2 - -openSSETail256Loop: - // This loop inteleaves 8 ChaCha quarter rounds with 1 poly multiplication - polyAdd(0(inp)(itr2*1)) - MOVO C3, tmpStore - chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) - MOVO tmpStore, C3 - MOVO C1, tmpStore - chachaQR(A3, B3, C3, D3, C1) - MOVO tmpStore, C1 - shiftB0Left; shiftB1Left; shiftB2Left; shiftB3Left - shiftC0Left; shiftC1Left; shiftC2Left; shiftC3Left - shiftD0Left; shiftD1Left; shiftD2Left; shiftD3Left - polyMulStage1 - polyMulStage2 - MOVO C3, tmpStore - chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) - MOVO tmpStore, C3 - MOVO C1, tmpStore - chachaQR(A3, B3, C3, D3, C1) - MOVO tmpStore, C1 - polyMulStage3 - polyMulReduceStage - shiftB0Right; shiftB1Right; shiftB2Right; shiftB3Right - shiftC0Right; shiftC1Right; shiftC2Right; shiftC3Right - shiftD0Right; shiftD1Right; shiftD2Right; shiftD3Right - ADDQ $2*8, itr2 - CMPQ itr2, $160 - JB openSSETail256Loop - MOVQ inl, itr1 - ANDQ $-16, itr1 - -openSSETail256HashLoop: - polyAdd(0(inp)(itr2*1)) - polyMul - ADDQ $2*8, itr2 - CMPQ itr2, itr1 - JB openSSETail256HashLoop - - // Add in the state - PADDD ·chacha20Constants<>(SB), A0; PADDD ·chacha20Constants<>(SB), A1; PADDD ·chacha20Constants<>(SB), A2; PADDD ·chacha20Constants<>(SB), A3 - PADDD state1Store, B0; PADDD state1Store, B1; PADDD state1Store, B2; PADDD state1Store, B3 - PADDD state2Store, C0; PADDD state2Store, C1; PADDD state2Store, C2; PADDD state2Store, C3 - PADDD ctr0Store, D0; PADDD ctr1Store, D1; PADDD ctr2Store, D2; PADDD ctr3Store, D3 - MOVO D3, tmpStore - - // Load - xor - store - MOVOU (0*16)(inp), D3; PXOR D3, A0 - MOVOU (1*16)(inp), D3; PXOR D3, B0 - MOVOU (2*16)(inp), D3; PXOR D3, C0 - MOVOU (3*16)(inp), D3; PXOR D3, D0 - MOVOU A0, (0*16)(oup) - MOVOU B0, (1*16)(oup) - MOVOU C0, (2*16)(oup) - MOVOU D0, (3*16)(oup) - MOVOU (4*16)(inp), A0; MOVOU (5*16)(inp), B0; MOVOU (6*16)(inp), C0; MOVOU (7*16)(inp), D0 - PXOR A0, A1; PXOR B0, B1; PXOR C0, C1; PXOR D0, D1 - MOVOU A1, (4*16)(oup); MOVOU B1, (5*16)(oup); MOVOU C1, (6*16)(oup); MOVOU D1, (7*16)(oup) - MOVOU (8*16)(inp), A0; MOVOU (9*16)(inp), B0; MOVOU (10*16)(inp), C0; MOVOU (11*16)(inp), D0 - PXOR A0, A2; PXOR B0, B2; PXOR C0, C2; PXOR D0, D2 - MOVOU A2, (8*16)(oup); MOVOU B2, (9*16)(oup); MOVOU C2, (10*16)(oup); MOVOU D2, (11*16)(oup) - LEAQ 192(inp), inp - LEAQ 192(oup), oup - SUBQ $192, inl - MOVO A3, A0 - MOVO B3, B0 - MOVO C3, C0 - MOVO tmpStore, D0 - - JMP openSSETail64DecLoop - -// ---------------------------------------------------------------------------- -// ------------------------- AVX2 Code ---------------------------------------- -chacha20Poly1305Open_AVX2: - VZEROUPPER - VMOVDQU ·chacha20Constants<>(SB), AA0 - BYTE $0xc4; BYTE $0x42; BYTE $0x7d; BYTE $0x5a; BYTE $0x70; BYTE $0x10 // broadcasti128 16(r8), ymm14 - BYTE $0xc4; BYTE $0x42; BYTE $0x7d; BYTE $0x5a; BYTE $0x60; BYTE $0x20 // broadcasti128 32(r8), ymm12 - BYTE $0xc4; BYTE $0xc2; BYTE $0x7d; BYTE $0x5a; BYTE $0x60; BYTE $0x30 // broadcasti128 48(r8), ymm4 - VPADDD ·avx2InitMask<>(SB), DD0, DD0 - - // Special optimization, for very short buffers - CMPQ inl, $192 - JBE openAVX2192 - CMPQ inl, $320 - JBE openAVX2320 - - // For the general key prepare the key first - as a byproduct we have 64 bytes of cipher stream - VMOVDQA BB0, state1StoreAVX2 - VMOVDQA CC0, state2StoreAVX2 - VMOVDQA DD0, ctr3StoreAVX2 - MOVQ $10, itr2 - -openAVX2PreparePolyKey: - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0) - VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $12, DD0, DD0, DD0 - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0) - VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $4, DD0, DD0, DD0 - DECQ itr2 - JNE openAVX2PreparePolyKey - - VPADDD ·chacha20Constants<>(SB), AA0, AA0 - VPADDD state1StoreAVX2, BB0, BB0 - VPADDD state2StoreAVX2, CC0, CC0 - VPADDD ctr3StoreAVX2, DD0, DD0 - - VPERM2I128 $0x02, AA0, BB0, TT0 - - // Clamp and store poly key - VPAND ·polyClampMask<>(SB), TT0, TT0 - VMOVDQA TT0, rsStoreAVX2 - - // Stream for the first 64 bytes - VPERM2I128 $0x13, AA0, BB0, AA0 - VPERM2I128 $0x13, CC0, DD0, BB0 - - // Hash AD + first 64 bytes - MOVQ ad_len+80(FP), itr2 - CALL polyHashADInternal<>(SB) - XORQ itr1, itr1 - -openAVX2InitialHash64: - polyAdd(0(inp)(itr1*1)) - polyMulAVX2 - ADDQ $16, itr1 - CMPQ itr1, $64 - JNE openAVX2InitialHash64 - - // Decrypt the first 64 bytes - VPXOR (0*32)(inp), AA0, AA0 - VPXOR (1*32)(inp), BB0, BB0 - VMOVDQU AA0, (0*32)(oup) - VMOVDQU BB0, (1*32)(oup) - LEAQ (2*32)(inp), inp - LEAQ (2*32)(oup), oup - SUBQ $64, inl - -openAVX2MainLoop: - CMPQ inl, $512 - JB openAVX2MainLoopDone - - // Load state, increment counter blocks, store the incremented counters - VMOVDQU ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 - VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3 - VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3 - VMOVDQA ctr3StoreAVX2, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2; VPADDD ·avx2IncMask<>(SB), DD2, DD3 - VMOVDQA DD0, ctr0StoreAVX2; VMOVDQA DD1, ctr1StoreAVX2; VMOVDQA DD2, ctr2StoreAVX2; VMOVDQA DD3, ctr3StoreAVX2 - XORQ itr1, itr1 - -openAVX2InternalLoop: - // Lets just say this spaghetti loop interleaves 2 quarter rounds with 3 poly multiplications - // Effectively per 512 bytes of stream we hash 480 bytes of ciphertext - polyAdd(0*8(inp)(itr1*1)) - VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 - polyMulStage1_AVX2 - VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 - VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 - polyMulStage2_AVX2 - VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 - VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 - polyMulStage3_AVX2 - VMOVDQA CC3, tmpStoreAVX2 - VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 - VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 - VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 - VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 - VMOVDQA tmpStoreAVX2, CC3 - polyMulReduceStage - VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 - VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 - VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 - polyAdd(2*8(inp)(itr1*1)) - VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 - polyMulStage1_AVX2 - VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 - VMOVDQA CC3, tmpStoreAVX2 - VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 - VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 - VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 - VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 - VMOVDQA tmpStoreAVX2, CC3 - polyMulStage2_AVX2 - VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $4, BB3, BB3, BB3 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 - VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2; VPALIGNR $12, DD3, DD3, DD3 - VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 - polyMulStage3_AVX2 - VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 - VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 - polyMulReduceStage - VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 - VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 - polyAdd(4*8(inp)(itr1*1)) - LEAQ (6*8)(itr1), itr1 - VMOVDQA CC3, tmpStoreAVX2 - VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 - VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 - VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 - VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 - VMOVDQA tmpStoreAVX2, CC3 - polyMulStage1_AVX2 - VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 - VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 - polyMulStage2_AVX2 - VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 - VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 - polyMulStage3_AVX2 - VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 - VMOVDQA CC3, tmpStoreAVX2 - VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 - VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 - VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 - VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 - VMOVDQA tmpStoreAVX2, CC3 - polyMulReduceStage - VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $12, BB3, BB3, BB3 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 - VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2; VPALIGNR $4, DD3, DD3, DD3 - CMPQ itr1, $480 - JNE openAVX2InternalLoop - - VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2; VPADDD ·chacha20Constants<>(SB), AA3, AA3 - VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2; VPADDD state1StoreAVX2, BB3, BB3 - VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2; VPADDD state2StoreAVX2, CC3, CC3 - VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2; VPADDD ctr3StoreAVX2, DD3, DD3 - VMOVDQA CC3, tmpStoreAVX2 - - // We only hashed 480 of the 512 bytes available - hash the remaining 32 here - polyAdd(480(inp)) - polyMulAVX2 - VPERM2I128 $0x02, AA0, BB0, CC3; VPERM2I128 $0x13, AA0, BB0, BB0; VPERM2I128 $0x02, CC0, DD0, AA0; VPERM2I128 $0x13, CC0, DD0, CC0 - VPXOR (0*32)(inp), CC3, CC3; VPXOR (1*32)(inp), AA0, AA0; VPXOR (2*32)(inp), BB0, BB0; VPXOR (3*32)(inp), CC0, CC0 - VMOVDQU CC3, (0*32)(oup); VMOVDQU AA0, (1*32)(oup); VMOVDQU BB0, (2*32)(oup); VMOVDQU CC0, (3*32)(oup) - VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 - VPXOR (4*32)(inp), AA0, AA0; VPXOR (5*32)(inp), BB0, BB0; VPXOR (6*32)(inp), CC0, CC0; VPXOR (7*32)(inp), DD0, DD0 - VMOVDQU AA0, (4*32)(oup); VMOVDQU BB0, (5*32)(oup); VMOVDQU CC0, (6*32)(oup); VMOVDQU DD0, (7*32)(oup) - - // and here - polyAdd(496(inp)) - polyMulAVX2 - VPERM2I128 $0x02, AA2, BB2, AA0; VPERM2I128 $0x02, CC2, DD2, BB0; VPERM2I128 $0x13, AA2, BB2, CC0; VPERM2I128 $0x13, CC2, DD2, DD0 - VPXOR (8*32)(inp), AA0, AA0; VPXOR (9*32)(inp), BB0, BB0; VPXOR (10*32)(inp), CC0, CC0; VPXOR (11*32)(inp), DD0, DD0 - VMOVDQU AA0, (8*32)(oup); VMOVDQU BB0, (9*32)(oup); VMOVDQU CC0, (10*32)(oup); VMOVDQU DD0, (11*32)(oup) - VPERM2I128 $0x02, AA3, BB3, AA0; VPERM2I128 $0x02, tmpStoreAVX2, DD3, BB0; VPERM2I128 $0x13, AA3, BB3, CC0; VPERM2I128 $0x13, tmpStoreAVX2, DD3, DD0 - VPXOR (12*32)(inp), AA0, AA0; VPXOR (13*32)(inp), BB0, BB0; VPXOR (14*32)(inp), CC0, CC0; VPXOR (15*32)(inp), DD0, DD0 - VMOVDQU AA0, (12*32)(oup); VMOVDQU BB0, (13*32)(oup); VMOVDQU CC0, (14*32)(oup); VMOVDQU DD0, (15*32)(oup) - LEAQ (32*16)(inp), inp - LEAQ (32*16)(oup), oup - SUBQ $(32*16), inl - JMP openAVX2MainLoop - -openAVX2MainLoopDone: - // Handle the various tail sizes efficiently - TESTQ inl, inl - JE openSSEFinalize - CMPQ inl, $128 - JBE openAVX2Tail128 - CMPQ inl, $256 - JBE openAVX2Tail256 - CMPQ inl, $384 - JBE openAVX2Tail384 - JMP openAVX2Tail512 - -// ---------------------------------------------------------------------------- -// Special optimization for buffers smaller than 193 bytes -openAVX2192: - // For up to 192 bytes of ciphertext and 64 bytes for the poly key, we process four blocks - VMOVDQA AA0, AA1 - VMOVDQA BB0, BB1 - VMOVDQA CC0, CC1 - VPADDD ·avx2IncMask<>(SB), DD0, DD1 - VMOVDQA AA0, AA2 - VMOVDQA BB0, BB2 - VMOVDQA CC0, CC2 - VMOVDQA DD0, DD2 - VMOVDQA DD1, TT3 - MOVQ $10, itr2 - -openAVX2192InnerCipherLoop: - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) - VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 - VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1 - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) - VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 - VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1 - DECQ itr2 - JNE openAVX2192InnerCipherLoop - VPADDD AA2, AA0, AA0; VPADDD AA2, AA1, AA1 - VPADDD BB2, BB0, BB0; VPADDD BB2, BB1, BB1 - VPADDD CC2, CC0, CC0; VPADDD CC2, CC1, CC1 - VPADDD DD2, DD0, DD0; VPADDD TT3, DD1, DD1 - VPERM2I128 $0x02, AA0, BB0, TT0 - - // Clamp and store poly key - VPAND ·polyClampMask<>(SB), TT0, TT0 - VMOVDQA TT0, rsStoreAVX2 - - // Stream for up to 192 bytes - VPERM2I128 $0x13, AA0, BB0, AA0 - VPERM2I128 $0x13, CC0, DD0, BB0 - VPERM2I128 $0x02, AA1, BB1, CC0 - VPERM2I128 $0x02, CC1, DD1, DD0 - VPERM2I128 $0x13, AA1, BB1, AA1 - VPERM2I128 $0x13, CC1, DD1, BB1 - -openAVX2ShortOpen: - // Hash - MOVQ ad_len+80(FP), itr2 - CALL polyHashADInternal<>(SB) - -openAVX2ShortOpenLoop: - CMPQ inl, $32 - JB openAVX2ShortTail32 - SUBQ $32, inl - - // Load for hashing - polyAdd(0*8(inp)) - polyMulAVX2 - polyAdd(2*8(inp)) - polyMulAVX2 - - // Load for decryption - VPXOR (inp), AA0, AA0 - VMOVDQU AA0, (oup) - LEAQ (1*32)(inp), inp - LEAQ (1*32)(oup), oup - - // Shift stream left - VMOVDQA BB0, AA0 - VMOVDQA CC0, BB0 - VMOVDQA DD0, CC0 - VMOVDQA AA1, DD0 - VMOVDQA BB1, AA1 - VMOVDQA CC1, BB1 - VMOVDQA DD1, CC1 - VMOVDQA AA2, DD1 - VMOVDQA BB2, AA2 - JMP openAVX2ShortOpenLoop - -openAVX2ShortTail32: - CMPQ inl, $16 - VMOVDQA A0, A1 - JB openAVX2ShortDone - - SUBQ $16, inl - - // Load for hashing - polyAdd(0*8(inp)) - polyMulAVX2 - - // Load for decryption - VPXOR (inp), A0, T0 - VMOVDQU T0, (oup) - LEAQ (1*16)(inp), inp - LEAQ (1*16)(oup), oup - VPERM2I128 $0x11, AA0, AA0, AA0 - VMOVDQA A0, A1 - -openAVX2ShortDone: - VZEROUPPER - JMP openSSETail16 - -// ---------------------------------------------------------------------------- -// Special optimization for buffers smaller than 321 bytes -openAVX2320: - // For up to 320 bytes of ciphertext and 64 bytes for the poly key, we process six blocks - VMOVDQA AA0, AA1; VMOVDQA BB0, BB1; VMOVDQA CC0, CC1; VPADDD ·avx2IncMask<>(SB), DD0, DD1 - VMOVDQA AA0, AA2; VMOVDQA BB0, BB2; VMOVDQA CC0, CC2; VPADDD ·avx2IncMask<>(SB), DD1, DD2 - VMOVDQA BB0, TT1; VMOVDQA CC0, TT2; VMOVDQA DD0, TT3 - MOVQ $10, itr2 - -openAVX2320InnerCipherLoop: - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) - VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 - VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2 - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) - VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 - VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2 - DECQ itr2 - JNE openAVX2320InnerCipherLoop - - VMOVDQA ·chacha20Constants<>(SB), TT0 - VPADDD TT0, AA0, AA0; VPADDD TT0, AA1, AA1; VPADDD TT0, AA2, AA2 - VPADDD TT1, BB0, BB0; VPADDD TT1, BB1, BB1; VPADDD TT1, BB2, BB2 - VPADDD TT2, CC0, CC0; VPADDD TT2, CC1, CC1; VPADDD TT2, CC2, CC2 - VMOVDQA ·avx2IncMask<>(SB), TT0 - VPADDD TT3, DD0, DD0; VPADDD TT0, TT3, TT3 - VPADDD TT3, DD1, DD1; VPADDD TT0, TT3, TT3 - VPADDD TT3, DD2, DD2 - - // Clamp and store poly key - VPERM2I128 $0x02, AA0, BB0, TT0 - VPAND ·polyClampMask<>(SB), TT0, TT0 - VMOVDQA TT0, rsStoreAVX2 - - // Stream for up to 320 bytes - VPERM2I128 $0x13, AA0, BB0, AA0 - VPERM2I128 $0x13, CC0, DD0, BB0 - VPERM2I128 $0x02, AA1, BB1, CC0 - VPERM2I128 $0x02, CC1, DD1, DD0 - VPERM2I128 $0x13, AA1, BB1, AA1 - VPERM2I128 $0x13, CC1, DD1, BB1 - VPERM2I128 $0x02, AA2, BB2, CC1 - VPERM2I128 $0x02, CC2, DD2, DD1 - VPERM2I128 $0x13, AA2, BB2, AA2 - VPERM2I128 $0x13, CC2, DD2, BB2 - JMP openAVX2ShortOpen - -// ---------------------------------------------------------------------------- -// Special optimization for the last 128 bytes of ciphertext -openAVX2Tail128: - // Need to decrypt up to 128 bytes - prepare two blocks - VMOVDQA ·chacha20Constants<>(SB), AA1 - VMOVDQA state1StoreAVX2, BB1 - VMOVDQA state2StoreAVX2, CC1 - VMOVDQA ctr3StoreAVX2, DD1 - VPADDD ·avx2IncMask<>(SB), DD1, DD1 - VMOVDQA DD1, DD0 - - XORQ itr2, itr2 - MOVQ inl, itr1 - ANDQ $-16, itr1 - TESTQ itr1, itr1 - JE openAVX2Tail128LoopB - -openAVX2Tail128LoopA: - // Perform ChaCha rounds, while hashing the remaining input - polyAdd(0(inp)(itr2*1)) - polyMulAVX2 - -openAVX2Tail128LoopB: - ADDQ $16, itr2 - chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) - VPALIGNR $4, BB1, BB1, BB1 - VPALIGNR $8, CC1, CC1, CC1 - VPALIGNR $12, DD1, DD1, DD1 - chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) - VPALIGNR $12, BB1, BB1, BB1 - VPALIGNR $8, CC1, CC1, CC1 - VPALIGNR $4, DD1, DD1, DD1 - CMPQ itr2, itr1 - JB openAVX2Tail128LoopA - CMPQ itr2, $160 - JNE openAVX2Tail128LoopB - - VPADDD ·chacha20Constants<>(SB), AA1, AA1 - VPADDD state1StoreAVX2, BB1, BB1 - VPADDD state2StoreAVX2, CC1, CC1 - VPADDD DD0, DD1, DD1 - VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 - -openAVX2TailLoop: - CMPQ inl, $32 - JB openAVX2Tail - SUBQ $32, inl - - // Load for decryption - VPXOR (inp), AA0, AA0 - VMOVDQU AA0, (oup) - LEAQ (1*32)(inp), inp - LEAQ (1*32)(oup), oup - VMOVDQA BB0, AA0 - VMOVDQA CC0, BB0 - VMOVDQA DD0, CC0 - JMP openAVX2TailLoop - -openAVX2Tail: - CMPQ inl, $16 - VMOVDQA A0, A1 - JB openAVX2TailDone - SUBQ $16, inl - - // Load for decryption - VPXOR (inp), A0, T0 - VMOVDQU T0, (oup) - LEAQ (1*16)(inp), inp - LEAQ (1*16)(oup), oup - VPERM2I128 $0x11, AA0, AA0, AA0 - VMOVDQA A0, A1 - -openAVX2TailDone: - VZEROUPPER - JMP openSSETail16 - -// ---------------------------------------------------------------------------- -// Special optimization for the last 256 bytes of ciphertext -openAVX2Tail256: - // Need to decrypt up to 256 bytes - prepare four blocks - VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1 - VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1 - VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1 - VMOVDQA ctr3StoreAVX2, DD0 - VPADDD ·avx2IncMask<>(SB), DD0, DD0 - VPADDD ·avx2IncMask<>(SB), DD0, DD1 - VMOVDQA DD0, TT1 - VMOVDQA DD1, TT2 - - // Compute the number of iterations that will hash data - MOVQ inl, tmpStoreAVX2 - MOVQ inl, itr1 - SUBQ $128, itr1 - SHRQ $4, itr1 - MOVQ $10, itr2 - CMPQ itr1, $10 - CMOVQGT itr2, itr1 - MOVQ inp, inl - XORQ itr2, itr2 - -openAVX2Tail256LoopA: - polyAdd(0(inl)) - polyMulAVX2 - LEAQ 16(inl), inl - - // Perform ChaCha rounds, while hashing the remaining input -openAVX2Tail256LoopB: - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) - VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 - VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1 - INCQ itr2 - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) - VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 - VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1 - CMPQ itr2, itr1 - JB openAVX2Tail256LoopA - - CMPQ itr2, $10 - JNE openAVX2Tail256LoopB - - MOVQ inl, itr2 - SUBQ inp, inl - MOVQ inl, itr1 - MOVQ tmpStoreAVX2, inl - - // Hash the remainder of data (if any) -openAVX2Tail256Hash: - ADDQ $16, itr1 - CMPQ itr1, inl - JGT openAVX2Tail256HashEnd - polyAdd (0(itr2)) - polyMulAVX2 - LEAQ 16(itr2), itr2 - JMP openAVX2Tail256Hash - -// Store 128 bytes safely, then go to store loop -openAVX2Tail256HashEnd: - VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1 - VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1 - VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1 - VPADDD TT1, DD0, DD0; VPADDD TT2, DD1, DD1 - VPERM2I128 $0x02, AA0, BB0, AA2; VPERM2I128 $0x02, CC0, DD0, BB2; VPERM2I128 $0x13, AA0, BB0, CC2; VPERM2I128 $0x13, CC0, DD0, DD2 - VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 - - VPXOR (0*32)(inp), AA2, AA2; VPXOR (1*32)(inp), BB2, BB2; VPXOR (2*32)(inp), CC2, CC2; VPXOR (3*32)(inp), DD2, DD2 - VMOVDQU AA2, (0*32)(oup); VMOVDQU BB2, (1*32)(oup); VMOVDQU CC2, (2*32)(oup); VMOVDQU DD2, (3*32)(oup) - LEAQ (4*32)(inp), inp - LEAQ (4*32)(oup), oup - SUBQ $4*32, inl - - JMP openAVX2TailLoop - -// ---------------------------------------------------------------------------- -// Special optimization for the last 384 bytes of ciphertext -openAVX2Tail384: - // Need to decrypt up to 384 bytes - prepare six blocks - VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2 - VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2 - VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2 - VMOVDQA ctr3StoreAVX2, DD0 - VPADDD ·avx2IncMask<>(SB), DD0, DD0 - VPADDD ·avx2IncMask<>(SB), DD0, DD1 - VPADDD ·avx2IncMask<>(SB), DD1, DD2 - VMOVDQA DD0, ctr0StoreAVX2 - VMOVDQA DD1, ctr1StoreAVX2 - VMOVDQA DD2, ctr2StoreAVX2 - - // Compute the number of iterations that will hash two blocks of data - MOVQ inl, tmpStoreAVX2 - MOVQ inl, itr1 - SUBQ $256, itr1 - SHRQ $4, itr1 - ADDQ $6, itr1 - MOVQ $10, itr2 - CMPQ itr1, $10 - CMOVQGT itr2, itr1 - MOVQ inp, inl - XORQ itr2, itr2 - - // Perform ChaCha rounds, while hashing the remaining input -openAVX2Tail384LoopB: - polyAdd(0(inl)) - polyMulAVX2 - LEAQ 16(inl), inl - -openAVX2Tail384LoopA: - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) - VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 - VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2 - polyAdd(0(inl)) - polyMulAVX2 - LEAQ 16(inl), inl - INCQ itr2 - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) - VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 - VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2 - - CMPQ itr2, itr1 - JB openAVX2Tail384LoopB - - CMPQ itr2, $10 - JNE openAVX2Tail384LoopA - - MOVQ inl, itr2 - SUBQ inp, inl - MOVQ inl, itr1 - MOVQ tmpStoreAVX2, inl - -openAVX2Tail384Hash: - ADDQ $16, itr1 - CMPQ itr1, inl - JGT openAVX2Tail384HashEnd - polyAdd(0(itr2)) - polyMulAVX2 - LEAQ 16(itr2), itr2 - JMP openAVX2Tail384Hash - -// Store 256 bytes safely, then go to store loop -openAVX2Tail384HashEnd: - VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2 - VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2 - VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2 - VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2 - VPERM2I128 $0x02, AA0, BB0, TT0; VPERM2I128 $0x02, CC0, DD0, TT1; VPERM2I128 $0x13, AA0, BB0, TT2; VPERM2I128 $0x13, CC0, DD0, TT3 - VPXOR (0*32)(inp), TT0, TT0; VPXOR (1*32)(inp), TT1, TT1; VPXOR (2*32)(inp), TT2, TT2; VPXOR (3*32)(inp), TT3, TT3 - VMOVDQU TT0, (0*32)(oup); VMOVDQU TT1, (1*32)(oup); VMOVDQU TT2, (2*32)(oup); VMOVDQU TT3, (3*32)(oup) - VPERM2I128 $0x02, AA1, BB1, TT0; VPERM2I128 $0x02, CC1, DD1, TT1; VPERM2I128 $0x13, AA1, BB1, TT2; VPERM2I128 $0x13, CC1, DD1, TT3 - VPXOR (4*32)(inp), TT0, TT0; VPXOR (5*32)(inp), TT1, TT1; VPXOR (6*32)(inp), TT2, TT2; VPXOR (7*32)(inp), TT3, TT3 - VMOVDQU TT0, (4*32)(oup); VMOVDQU TT1, (5*32)(oup); VMOVDQU TT2, (6*32)(oup); VMOVDQU TT3, (7*32)(oup) - VPERM2I128 $0x02, AA2, BB2, AA0; VPERM2I128 $0x02, CC2, DD2, BB0; VPERM2I128 $0x13, AA2, BB2, CC0; VPERM2I128 $0x13, CC2, DD2, DD0 - LEAQ (8*32)(inp), inp - LEAQ (8*32)(oup), oup - SUBQ $8*32, inl - JMP openAVX2TailLoop - -// ---------------------------------------------------------------------------- -// Special optimization for the last 512 bytes of ciphertext -openAVX2Tail512: - VMOVDQU ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 - VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3 - VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3 - VMOVDQA ctr3StoreAVX2, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2; VPADDD ·avx2IncMask<>(SB), DD2, DD3 - VMOVDQA DD0, ctr0StoreAVX2; VMOVDQA DD1, ctr1StoreAVX2; VMOVDQA DD2, ctr2StoreAVX2; VMOVDQA DD3, ctr3StoreAVX2 - XORQ itr1, itr1 - MOVQ inp, itr2 - -openAVX2Tail512LoopB: - polyAdd(0(itr2)) - polyMulAVX2 - LEAQ (2*8)(itr2), itr2 - -openAVX2Tail512LoopA: - VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 - VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 - VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 - VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 - VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 - VMOVDQA CC3, tmpStoreAVX2 - VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 - VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 - VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 - VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 - VMOVDQA tmpStoreAVX2, CC3 - polyAdd(0*8(itr2)) - polyMulAVX2 - VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 - VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 - VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 - VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 - VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 - VMOVDQA CC3, tmpStoreAVX2 - VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 - VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 - VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 - VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 - VMOVDQA tmpStoreAVX2, CC3 - VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $4, BB3, BB3, BB3 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 - VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2; VPALIGNR $12, DD3, DD3, DD3 - VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 - VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 - VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 - VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 - VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 - polyAdd(2*8(itr2)) - polyMulAVX2 - LEAQ (4*8)(itr2), itr2 - VMOVDQA CC3, tmpStoreAVX2 - VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 - VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 - VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 - VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 - VMOVDQA tmpStoreAVX2, CC3 - VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 - VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 - VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 - VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 - VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 - VMOVDQA CC3, tmpStoreAVX2 - VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 - VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 - VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 - VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 - VMOVDQA tmpStoreAVX2, CC3 - VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $12, BB3, BB3, BB3 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 - VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2; VPALIGNR $4, DD3, DD3, DD3 - INCQ itr1 - CMPQ itr1, $4 - JLT openAVX2Tail512LoopB - - CMPQ itr1, $10 - JNE openAVX2Tail512LoopA - - MOVQ inl, itr1 - SUBQ $384, itr1 - ANDQ $-16, itr1 - -openAVX2Tail512HashLoop: - TESTQ itr1, itr1 - JE openAVX2Tail512HashEnd - polyAdd(0(itr2)) - polyMulAVX2 - LEAQ 16(itr2), itr2 - SUBQ $16, itr1 - JMP openAVX2Tail512HashLoop - -openAVX2Tail512HashEnd: - VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2; VPADDD ·chacha20Constants<>(SB), AA3, AA3 - VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2; VPADDD state1StoreAVX2, BB3, BB3 - VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2; VPADDD state2StoreAVX2, CC3, CC3 - VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2; VPADDD ctr3StoreAVX2, DD3, DD3 - VMOVDQA CC3, tmpStoreAVX2 - VPERM2I128 $0x02, AA0, BB0, CC3; VPERM2I128 $0x13, AA0, BB0, BB0; VPERM2I128 $0x02, CC0, DD0, AA0; VPERM2I128 $0x13, CC0, DD0, CC0 - VPXOR (0*32)(inp), CC3, CC3; VPXOR (1*32)(inp), AA0, AA0; VPXOR (2*32)(inp), BB0, BB0; VPXOR (3*32)(inp), CC0, CC0 - VMOVDQU CC3, (0*32)(oup); VMOVDQU AA0, (1*32)(oup); VMOVDQU BB0, (2*32)(oup); VMOVDQU CC0, (3*32)(oup) - VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 - VPXOR (4*32)(inp), AA0, AA0; VPXOR (5*32)(inp), BB0, BB0; VPXOR (6*32)(inp), CC0, CC0; VPXOR (7*32)(inp), DD0, DD0 - VMOVDQU AA0, (4*32)(oup); VMOVDQU BB0, (5*32)(oup); VMOVDQU CC0, (6*32)(oup); VMOVDQU DD0, (7*32)(oup) - VPERM2I128 $0x02, AA2, BB2, AA0; VPERM2I128 $0x02, CC2, DD2, BB0; VPERM2I128 $0x13, AA2, BB2, CC0; VPERM2I128 $0x13, CC2, DD2, DD0 - VPXOR (8*32)(inp), AA0, AA0; VPXOR (9*32)(inp), BB0, BB0; VPXOR (10*32)(inp), CC0, CC0; VPXOR (11*32)(inp), DD0, DD0 - VMOVDQU AA0, (8*32)(oup); VMOVDQU BB0, (9*32)(oup); VMOVDQU CC0, (10*32)(oup); VMOVDQU DD0, (11*32)(oup) - VPERM2I128 $0x02, AA3, BB3, AA0; VPERM2I128 $0x02, tmpStoreAVX2, DD3, BB0; VPERM2I128 $0x13, AA3, BB3, CC0; VPERM2I128 $0x13, tmpStoreAVX2, DD3, DD0 - - LEAQ (12*32)(inp), inp - LEAQ (12*32)(oup), oup - SUBQ $12*32, inl - - JMP openAVX2TailLoop - -// ---------------------------------------------------------------------------- -// ---------------------------------------------------------------------------- -// func chacha20Poly1305Seal(dst, key, src, ad []byte) -TEXT ·chacha20Poly1305Seal(SB), 0, $288-96 - // For aligned stack access - MOVQ SP, BP - ADDQ $32, BP - ANDQ $-32, BP - MOVQ dst+0(FP), oup - MOVQ key+24(FP), keyp - MOVQ src+48(FP), inp - MOVQ src_len+56(FP), inl - MOVQ ad+72(FP), adp - - // Check for AVX2 support - CMPB runtime·support_avx2(SB), $0 - JE noavx2bmi2Seal - - // Check BMI2 bit for MULXQ. - // runtime·cpuid_ebx7 is always available here - // because it passed avx2 check - TESTL $(1<<8), runtime·cpuid_ebx7(SB) - JNE chacha20Poly1305Seal_AVX2 -noavx2bmi2Seal: - - // Special optimization, for very short buffers - CMPQ inl, $128 - JBE sealSSE128 // About 15% faster - - // In the seal case - prepare the poly key + 3 blocks of stream in the first iteration - MOVOU ·chacha20Constants<>(SB), A0 - MOVOU (1*16)(keyp), B0 - MOVOU (2*16)(keyp), C0 - MOVOU (3*16)(keyp), D0 - - // Store state on stack for future use - MOVO B0, state1Store - MOVO C0, state2Store - - // Load state, increment counter blocks - MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 - MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 - MOVO A2, A3; MOVO B2, B3; MOVO C2, C3; MOVO D2, D3; PADDL ·sseIncMask<>(SB), D3 - - // Store counters - MOVO D0, ctr0Store; MOVO D1, ctr1Store; MOVO D2, ctr2Store; MOVO D3, ctr3Store - MOVQ $10, itr2 - -sealSSEIntroLoop: - MOVO C3, tmpStore - chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) - MOVO tmpStore, C3 - MOVO C1, tmpStore - chachaQR(A3, B3, C3, D3, C1) - MOVO tmpStore, C1 - shiftB0Left; shiftB1Left; shiftB2Left; shiftB3Left - shiftC0Left; shiftC1Left; shiftC2Left; shiftC3Left - shiftD0Left; shiftD1Left; shiftD2Left; shiftD3Left - - MOVO C3, tmpStore - chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) - MOVO tmpStore, C3 - MOVO C1, tmpStore - chachaQR(A3, B3, C3, D3, C1) - MOVO tmpStore, C1 - shiftB0Right; shiftB1Right; shiftB2Right; shiftB3Right - shiftC0Right; shiftC1Right; shiftC2Right; shiftC3Right - shiftD0Right; shiftD1Right; shiftD2Right; shiftD3Right - DECQ itr2 - JNE sealSSEIntroLoop - - // Add in the state - PADDD ·chacha20Constants<>(SB), A0; PADDD ·chacha20Constants<>(SB), A1; PADDD ·chacha20Constants<>(SB), A2; PADDD ·chacha20Constants<>(SB), A3 - PADDD state1Store, B0; PADDD state1Store, B1; PADDD state1Store, B2; PADDD state1Store, B3 - PADDD state2Store, C1; PADDD state2Store, C2; PADDD state2Store, C3 - PADDD ctr1Store, D1; PADDD ctr2Store, D2; PADDD ctr3Store, D3 - - // Clamp and store the key - PAND ·polyClampMask<>(SB), A0 - MOVO A0, rStore - MOVO B0, sStore - - // Hash AAD - MOVQ ad_len+80(FP), itr2 - CALL polyHashADInternal<>(SB) - - MOVOU (0*16)(inp), A0; MOVOU (1*16)(inp), B0; MOVOU (2*16)(inp), C0; MOVOU (3*16)(inp), D0 - PXOR A0, A1; PXOR B0, B1; PXOR C0, C1; PXOR D0, D1 - MOVOU A1, (0*16)(oup); MOVOU B1, (1*16)(oup); MOVOU C1, (2*16)(oup); MOVOU D1, (3*16)(oup) - MOVOU (4*16)(inp), A0; MOVOU (5*16)(inp), B0; MOVOU (6*16)(inp), C0; MOVOU (7*16)(inp), D0 - PXOR A0, A2; PXOR B0, B2; PXOR C0, C2; PXOR D0, D2 - MOVOU A2, (4*16)(oup); MOVOU B2, (5*16)(oup); MOVOU C2, (6*16)(oup); MOVOU D2, (7*16)(oup) - - MOVQ $128, itr1 - SUBQ $128, inl - LEAQ 128(inp), inp - - MOVO A3, A1; MOVO B3, B1; MOVO C3, C1; MOVO D3, D1 - - CMPQ inl, $64 - JBE sealSSE128SealHash - - MOVOU (0*16)(inp), A0; MOVOU (1*16)(inp), B0; MOVOU (2*16)(inp), C0; MOVOU (3*16)(inp), D0 - PXOR A0, A3; PXOR B0, B3; PXOR C0, C3; PXOR D0, D3 - MOVOU A3, (8*16)(oup); MOVOU B3, (9*16)(oup); MOVOU C3, (10*16)(oup); MOVOU D3, (11*16)(oup) - - ADDQ $64, itr1 - SUBQ $64, inl - LEAQ 64(inp), inp - - MOVQ $2, itr1 - MOVQ $8, itr2 - - CMPQ inl, $64 - JBE sealSSETail64 - CMPQ inl, $128 - JBE sealSSETail128 - CMPQ inl, $192 - JBE sealSSETail192 - -sealSSEMainLoop: - // Load state, increment counter blocks - MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0 - MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 - MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 - MOVO A2, A3; MOVO B2, B3; MOVO C2, C3; MOVO D2, D3; PADDL ·sseIncMask<>(SB), D3 - - // Store counters - MOVO D0, ctr0Store; MOVO D1, ctr1Store; MOVO D2, ctr2Store; MOVO D3, ctr3Store - -sealSSEInnerLoop: - MOVO C3, tmpStore - chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) - MOVO tmpStore, C3 - MOVO C1, tmpStore - chachaQR(A3, B3, C3, D3, C1) - MOVO tmpStore, C1 - polyAdd(0(oup)) - shiftB0Left; shiftB1Left; shiftB2Left; shiftB3Left - shiftC0Left; shiftC1Left; shiftC2Left; shiftC3Left - shiftD0Left; shiftD1Left; shiftD2Left; shiftD3Left - polyMulStage1 - polyMulStage2 - LEAQ (2*8)(oup), oup - MOVO C3, tmpStore - chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) - MOVO tmpStore, C3 - MOVO C1, tmpStore - polyMulStage3 - chachaQR(A3, B3, C3, D3, C1) - MOVO tmpStore, C1 - polyMulReduceStage - shiftB0Right; shiftB1Right; shiftB2Right; shiftB3Right - shiftC0Right; shiftC1Right; shiftC2Right; shiftC3Right - shiftD0Right; shiftD1Right; shiftD2Right; shiftD3Right - DECQ itr2 - JGE sealSSEInnerLoop - polyAdd(0(oup)) - polyMul - LEAQ (2*8)(oup), oup - DECQ itr1 - JG sealSSEInnerLoop - - // Add in the state - PADDD ·chacha20Constants<>(SB), A0; PADDD ·chacha20Constants<>(SB), A1; PADDD ·chacha20Constants<>(SB), A2; PADDD ·chacha20Constants<>(SB), A3 - PADDD state1Store, B0; PADDD state1Store, B1; PADDD state1Store, B2; PADDD state1Store, B3 - PADDD state2Store, C0; PADDD state2Store, C1; PADDD state2Store, C2; PADDD state2Store, C3 - PADDD ctr0Store, D0; PADDD ctr1Store, D1; PADDD ctr2Store, D2; PADDD ctr3Store, D3 - MOVO D3, tmpStore - - // Load - xor - store - MOVOU (0*16)(inp), D3; PXOR D3, A0 - MOVOU (1*16)(inp), D3; PXOR D3, B0 - MOVOU (2*16)(inp), D3; PXOR D3, C0 - MOVOU (3*16)(inp), D3; PXOR D3, D0 - MOVOU A0, (0*16)(oup) - MOVOU B0, (1*16)(oup) - MOVOU C0, (2*16)(oup) - MOVOU D0, (3*16)(oup) - MOVO tmpStore, D3 - - MOVOU (4*16)(inp), A0; MOVOU (5*16)(inp), B0; MOVOU (6*16)(inp), C0; MOVOU (7*16)(inp), D0 - PXOR A0, A1; PXOR B0, B1; PXOR C0, C1; PXOR D0, D1 - MOVOU A1, (4*16)(oup); MOVOU B1, (5*16)(oup); MOVOU C1, (6*16)(oup); MOVOU D1, (7*16)(oup) - MOVOU (8*16)(inp), A0; MOVOU (9*16)(inp), B0; MOVOU (10*16)(inp), C0; MOVOU (11*16)(inp), D0 - PXOR A0, A2; PXOR B0, B2; PXOR C0, C2; PXOR D0, D2 - MOVOU A2, (8*16)(oup); MOVOU B2, (9*16)(oup); MOVOU C2, (10*16)(oup); MOVOU D2, (11*16)(oup) - ADDQ $192, inp - MOVQ $192, itr1 - SUBQ $192, inl - MOVO A3, A1 - MOVO B3, B1 - MOVO C3, C1 - MOVO D3, D1 - CMPQ inl, $64 - JBE sealSSE128SealHash - MOVOU (0*16)(inp), A0; MOVOU (1*16)(inp), B0; MOVOU (2*16)(inp), C0; MOVOU (3*16)(inp), D0 - PXOR A0, A3; PXOR B0, B3; PXOR C0, C3; PXOR D0, D3 - MOVOU A3, (12*16)(oup); MOVOU B3, (13*16)(oup); MOVOU C3, (14*16)(oup); MOVOU D3, (15*16)(oup) - LEAQ 64(inp), inp - SUBQ $64, inl - MOVQ $6, itr1 - MOVQ $4, itr2 - CMPQ inl, $192 - JG sealSSEMainLoop - - MOVQ inl, itr1 - TESTQ inl, inl - JE sealSSE128SealHash - MOVQ $6, itr1 - CMPQ inl, $64 - JBE sealSSETail64 - CMPQ inl, $128 - JBE sealSSETail128 - JMP sealSSETail192 - -// ---------------------------------------------------------------------------- -// Special optimization for the last 64 bytes of plaintext -sealSSETail64: - // Need to encrypt up to 64 bytes - prepare single block, hash 192 or 256 bytes - MOVO ·chacha20Constants<>(SB), A1 - MOVO state1Store, B1 - MOVO state2Store, C1 - MOVO ctr3Store, D1 - PADDL ·sseIncMask<>(SB), D1 - MOVO D1, ctr0Store - -sealSSETail64LoopA: - // Perform ChaCha rounds, while hashing the previously encrypted ciphertext - polyAdd(0(oup)) - polyMul - LEAQ 16(oup), oup - -sealSSETail64LoopB: - chachaQR(A1, B1, C1, D1, T1) - shiftB1Left; shiftC1Left; shiftD1Left - chachaQR(A1, B1, C1, D1, T1) - shiftB1Right; shiftC1Right; shiftD1Right - polyAdd(0(oup)) - polyMul - LEAQ 16(oup), oup - - DECQ itr1 - JG sealSSETail64LoopA - - DECQ itr2 - JGE sealSSETail64LoopB - PADDL ·chacha20Constants<>(SB), A1 - PADDL state1Store, B1 - PADDL state2Store, C1 - PADDL ctr0Store, D1 - - JMP sealSSE128Seal - -// ---------------------------------------------------------------------------- -// Special optimization for the last 128 bytes of plaintext -sealSSETail128: - // Need to encrypt up to 128 bytes - prepare two blocks, hash 192 or 256 bytes - MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0; MOVO D0, ctr0Store - MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1; MOVO D1, ctr1Store - -sealSSETail128LoopA: - // Perform ChaCha rounds, while hashing the previously encrypted ciphertext - polyAdd(0(oup)) - polyMul - LEAQ 16(oup), oup - -sealSSETail128LoopB: - chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0) - shiftB0Left; shiftC0Left; shiftD0Left - shiftB1Left; shiftC1Left; shiftD1Left - polyAdd(0(oup)) - polyMul - LEAQ 16(oup), oup - chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0) - shiftB0Right; shiftC0Right; shiftD0Right - shiftB1Right; shiftC1Right; shiftD1Right - - DECQ itr1 - JG sealSSETail128LoopA - - DECQ itr2 - JGE sealSSETail128LoopB - - PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1 - PADDL state1Store, B0; PADDL state1Store, B1 - PADDL state2Store, C0; PADDL state2Store, C1 - PADDL ctr0Store, D0; PADDL ctr1Store, D1 - - MOVOU (0*16)(inp), T0; MOVOU (1*16)(inp), T1; MOVOU (2*16)(inp), T2; MOVOU (3*16)(inp), T3 - PXOR T0, A0; PXOR T1, B0; PXOR T2, C0; PXOR T3, D0 - MOVOU A0, (0*16)(oup); MOVOU B0, (1*16)(oup); MOVOU C0, (2*16)(oup); MOVOU D0, (3*16)(oup) - - MOVQ $64, itr1 - LEAQ 64(inp), inp - SUBQ $64, inl - - JMP sealSSE128SealHash - -// ---------------------------------------------------------------------------- -// Special optimization for the last 192 bytes of plaintext -sealSSETail192: - // Need to encrypt up to 192 bytes - prepare three blocks, hash 192 or 256 bytes - MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0; MOVO D0, ctr0Store - MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1; MOVO D1, ctr1Store - MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2; MOVO D2, ctr2Store - -sealSSETail192LoopA: - // Perform ChaCha rounds, while hashing the previously encrypted ciphertext - polyAdd(0(oup)) - polyMul - LEAQ 16(oup), oup - -sealSSETail192LoopB: - chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) - shiftB0Left; shiftC0Left; shiftD0Left - shiftB1Left; shiftC1Left; shiftD1Left - shiftB2Left; shiftC2Left; shiftD2Left - - polyAdd(0(oup)) - polyMul - LEAQ 16(oup), oup - - chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) - shiftB0Right; shiftC0Right; shiftD0Right - shiftB1Right; shiftC1Right; shiftD1Right - shiftB2Right; shiftC2Right; shiftD2Right - - DECQ itr1 - JG sealSSETail192LoopA - - DECQ itr2 - JGE sealSSETail192LoopB - - PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1; PADDL ·chacha20Constants<>(SB), A2 - PADDL state1Store, B0; PADDL state1Store, B1; PADDL state1Store, B2 - PADDL state2Store, C0; PADDL state2Store, C1; PADDL state2Store, C2 - PADDL ctr0Store, D0; PADDL ctr1Store, D1; PADDL ctr2Store, D2 - - MOVOU (0*16)(inp), T0; MOVOU (1*16)(inp), T1; MOVOU (2*16)(inp), T2; MOVOU (3*16)(inp), T3 - PXOR T0, A0; PXOR T1, B0; PXOR T2, C0; PXOR T3, D0 - MOVOU A0, (0*16)(oup); MOVOU B0, (1*16)(oup); MOVOU C0, (2*16)(oup); MOVOU D0, (3*16)(oup) - MOVOU (4*16)(inp), T0; MOVOU (5*16)(inp), T1; MOVOU (6*16)(inp), T2; MOVOU (7*16)(inp), T3 - PXOR T0, A1; PXOR T1, B1; PXOR T2, C1; PXOR T3, D1 - MOVOU A1, (4*16)(oup); MOVOU B1, (5*16)(oup); MOVOU C1, (6*16)(oup); MOVOU D1, (7*16)(oup) - - MOVO A2, A1 - MOVO B2, B1 - MOVO C2, C1 - MOVO D2, D1 - MOVQ $128, itr1 - LEAQ 128(inp), inp - SUBQ $128, inl - - JMP sealSSE128SealHash - -// ---------------------------------------------------------------------------- -// Special seal optimization for buffers smaller than 129 bytes -sealSSE128: - // For up to 128 bytes of ciphertext and 64 bytes for the poly key, we require to process three blocks - MOVOU ·chacha20Constants<>(SB), A0; MOVOU (1*16)(keyp), B0; MOVOU (2*16)(keyp), C0; MOVOU (3*16)(keyp), D0 - MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 - MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 - MOVO B0, T1; MOVO C0, T2; MOVO D1, T3 - MOVQ $10, itr2 - -sealSSE128InnerCipherLoop: - chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) - shiftB0Left; shiftB1Left; shiftB2Left - shiftC0Left; shiftC1Left; shiftC2Left - shiftD0Left; shiftD1Left; shiftD2Left - chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) - shiftB0Right; shiftB1Right; shiftB2Right - shiftC0Right; shiftC1Right; shiftC2Right - shiftD0Right; shiftD1Right; shiftD2Right - DECQ itr2 - JNE sealSSE128InnerCipherLoop - - // A0|B0 hold the Poly1305 32-byte key, C0,D0 can be discarded - PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1; PADDL ·chacha20Constants<>(SB), A2 - PADDL T1, B0; PADDL T1, B1; PADDL T1, B2 - PADDL T2, C1; PADDL T2, C2 - PADDL T3, D1; PADDL ·sseIncMask<>(SB), T3; PADDL T3, D2 - PAND ·polyClampMask<>(SB), A0 - MOVOU A0, rStore - MOVOU B0, sStore - - // Hash - MOVQ ad_len+80(FP), itr2 - CALL polyHashADInternal<>(SB) - XORQ itr1, itr1 - -sealSSE128SealHash: - // itr1 holds the number of bytes encrypted but not yet hashed - CMPQ itr1, $16 - JB sealSSE128Seal - polyAdd(0(oup)) - polyMul - - SUBQ $16, itr1 - ADDQ $16, oup - - JMP sealSSE128SealHash - -sealSSE128Seal: - CMPQ inl, $16 - JB sealSSETail - SUBQ $16, inl - - // Load for decryption - MOVOU (inp), T0 - PXOR T0, A1 - MOVOU A1, (oup) - LEAQ (1*16)(inp), inp - LEAQ (1*16)(oup), oup - - // Extract for hashing - MOVQ A1, t0 - PSRLDQ $8, A1 - MOVQ A1, t1 - ADDQ t0, acc0; ADCQ t1, acc1; ADCQ $1, acc2 - polyMul - - // Shift the stream "left" - MOVO B1, A1 - MOVO C1, B1 - MOVO D1, C1 - MOVO A2, D1 - MOVO B2, A2 - MOVO C2, B2 - MOVO D2, C2 - JMP sealSSE128Seal - -sealSSETail: - TESTQ inl, inl - JE sealSSEFinalize - - // We can only load the PT one byte at a time to avoid read after end of buffer - MOVQ inl, itr2 - SHLQ $4, itr2 - LEAQ ·andMask<>(SB), t0 - MOVQ inl, itr1 - LEAQ -1(inp)(inl*1), inp - XORQ t2, t2 - XORQ t3, t3 - XORQ AX, AX - -sealSSETailLoadLoop: - SHLQ $8, t2, t3 - SHLQ $8, t2 - MOVB (inp), AX - XORQ AX, t2 - LEAQ -1(inp), inp - DECQ itr1 - JNE sealSSETailLoadLoop - MOVQ t2, 0+tmpStore - MOVQ t3, 8+tmpStore - PXOR 0+tmpStore, A1 - MOVOU A1, (oup) - MOVOU -16(t0)(itr2*1), T0 - PAND T0, A1 - MOVQ A1, t0 - PSRLDQ $8, A1 - MOVQ A1, t1 - ADDQ t0, acc0; ADCQ t1, acc1; ADCQ $1, acc2 - polyMul - - ADDQ inl, oup - -sealSSEFinalize: - // Hash in the buffer lengths - ADDQ ad_len+80(FP), acc0 - ADCQ src_len+56(FP), acc1 - ADCQ $1, acc2 - polyMul - - // Final reduce - MOVQ acc0, t0 - MOVQ acc1, t1 - MOVQ acc2, t2 - SUBQ $-5, acc0 - SBBQ $-1, acc1 - SBBQ $3, acc2 - CMOVQCS t0, acc0 - CMOVQCS t1, acc1 - CMOVQCS t2, acc2 - - // Add in the "s" part of the key - ADDQ 0+sStore, acc0 - ADCQ 8+sStore, acc1 - - // Finally store the tag at the end of the message - MOVQ acc0, (0*8)(oup) - MOVQ acc1, (1*8)(oup) - RET - -// ---------------------------------------------------------------------------- -// ------------------------- AVX2 Code ---------------------------------------- -chacha20Poly1305Seal_AVX2: - VZEROUPPER - VMOVDQU ·chacha20Constants<>(SB), AA0 - BYTE $0xc4; BYTE $0x42; BYTE $0x7d; BYTE $0x5a; BYTE $0x70; BYTE $0x10 // broadcasti128 16(r8), ymm14 - BYTE $0xc4; BYTE $0x42; BYTE $0x7d; BYTE $0x5a; BYTE $0x60; BYTE $0x20 // broadcasti128 32(r8), ymm12 - BYTE $0xc4; BYTE $0xc2; BYTE $0x7d; BYTE $0x5a; BYTE $0x60; BYTE $0x30 // broadcasti128 48(r8), ymm4 - VPADDD ·avx2InitMask<>(SB), DD0, DD0 - - // Special optimizations, for very short buffers - CMPQ inl, $192 - JBE seal192AVX2 // 33% faster - CMPQ inl, $320 - JBE seal320AVX2 // 17% faster - - // For the general key prepare the key first - as a byproduct we have 64 bytes of cipher stream - VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 - VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3; VMOVDQA BB0, state1StoreAVX2 - VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3; VMOVDQA CC0, state2StoreAVX2 - VPADDD ·avx2IncMask<>(SB), DD0, DD1; VMOVDQA DD0, ctr0StoreAVX2 - VPADDD ·avx2IncMask<>(SB), DD1, DD2; VMOVDQA DD1, ctr1StoreAVX2 - VPADDD ·avx2IncMask<>(SB), DD2, DD3; VMOVDQA DD2, ctr2StoreAVX2 - VMOVDQA DD3, ctr3StoreAVX2 - MOVQ $10, itr2 - -sealAVX2IntroLoop: - VMOVDQA CC3, tmpStoreAVX2 - chachaQR_AVX2(AA0, BB0, CC0, DD0, CC3); chachaQR_AVX2(AA1, BB1, CC1, DD1, CC3); chachaQR_AVX2(AA2, BB2, CC2, DD2, CC3) - VMOVDQA tmpStoreAVX2, CC3 - VMOVDQA CC1, tmpStoreAVX2 - chachaQR_AVX2(AA3, BB3, CC3, DD3, CC1) - VMOVDQA tmpStoreAVX2, CC1 - - VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $12, DD0, DD0, DD0 - VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $12, DD1, DD1, DD1 - VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $12, DD2, DD2, DD2 - VPALIGNR $4, BB3, BB3, BB3; VPALIGNR $8, CC3, CC3, CC3; VPALIGNR $12, DD3, DD3, DD3 - - VMOVDQA CC3, tmpStoreAVX2 - chachaQR_AVX2(AA0, BB0, CC0, DD0, CC3); chachaQR_AVX2(AA1, BB1, CC1, DD1, CC3); chachaQR_AVX2(AA2, BB2, CC2, DD2, CC3) - VMOVDQA tmpStoreAVX2, CC3 - VMOVDQA CC1, tmpStoreAVX2 - chachaQR_AVX2(AA3, BB3, CC3, DD3, CC1) - VMOVDQA tmpStoreAVX2, CC1 - - VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $4, DD0, DD0, DD0 - VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $4, DD1, DD1, DD1 - VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $4, DD2, DD2, DD2 - VPALIGNR $12, BB3, BB3, BB3; VPALIGNR $8, CC3, CC3, CC3; VPALIGNR $4, DD3, DD3, DD3 - DECQ itr2 - JNE sealAVX2IntroLoop - - VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2; VPADDD ·chacha20Constants<>(SB), AA3, AA3 - VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2; VPADDD state1StoreAVX2, BB3, BB3 - VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2; VPADDD state2StoreAVX2, CC3, CC3 - VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2; VPADDD ctr3StoreAVX2, DD3, DD3 - - VPERM2I128 $0x13, CC0, DD0, CC0 // Stream bytes 96 - 127 - VPERM2I128 $0x02, AA0, BB0, DD0 // The Poly1305 key - VPERM2I128 $0x13, AA0, BB0, AA0 // Stream bytes 64 - 95 - - // Clamp and store poly key - VPAND ·polyClampMask<>(SB), DD0, DD0 - VMOVDQA DD0, rsStoreAVX2 - - // Hash AD - MOVQ ad_len+80(FP), itr2 - CALL polyHashADInternal<>(SB) - - // Can store at least 320 bytes - VPXOR (0*32)(inp), AA0, AA0 - VPXOR (1*32)(inp), CC0, CC0 - VMOVDQU AA0, (0*32)(oup) - VMOVDQU CC0, (1*32)(oup) - - VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 - VPXOR (2*32)(inp), AA0, AA0; VPXOR (3*32)(inp), BB0, BB0; VPXOR (4*32)(inp), CC0, CC0; VPXOR (5*32)(inp), DD0, DD0 - VMOVDQU AA0, (2*32)(oup); VMOVDQU BB0, (3*32)(oup); VMOVDQU CC0, (4*32)(oup); VMOVDQU DD0, (5*32)(oup) - VPERM2I128 $0x02, AA2, BB2, AA0; VPERM2I128 $0x02, CC2, DD2, BB0; VPERM2I128 $0x13, AA2, BB2, CC0; VPERM2I128 $0x13, CC2, DD2, DD0 - VPXOR (6*32)(inp), AA0, AA0; VPXOR (7*32)(inp), BB0, BB0; VPXOR (8*32)(inp), CC0, CC0; VPXOR (9*32)(inp), DD0, DD0 - VMOVDQU AA0, (6*32)(oup); VMOVDQU BB0, (7*32)(oup); VMOVDQU CC0, (8*32)(oup); VMOVDQU DD0, (9*32)(oup) - - MOVQ $320, itr1 - SUBQ $320, inl - LEAQ 320(inp), inp - - VPERM2I128 $0x02, AA3, BB3, AA0; VPERM2I128 $0x02, CC3, DD3, BB0; VPERM2I128 $0x13, AA3, BB3, CC0; VPERM2I128 $0x13, CC3, DD3, DD0 - CMPQ inl, $128 - JBE sealAVX2SealHash - - VPXOR (0*32)(inp), AA0, AA0; VPXOR (1*32)(inp), BB0, BB0; VPXOR (2*32)(inp), CC0, CC0; VPXOR (3*32)(inp), DD0, DD0 - VMOVDQU AA0, (10*32)(oup); VMOVDQU BB0, (11*32)(oup); VMOVDQU CC0, (12*32)(oup); VMOVDQU DD0, (13*32)(oup) - SUBQ $128, inl - LEAQ 128(inp), inp - - MOVQ $8, itr1 - MOVQ $2, itr2 - - CMPQ inl, $128 - JBE sealAVX2Tail128 - CMPQ inl, $256 - JBE sealAVX2Tail256 - CMPQ inl, $384 - JBE sealAVX2Tail384 - CMPQ inl, $512 - JBE sealAVX2Tail512 - - // We have 448 bytes to hash, but main loop hashes 512 bytes at a time - perform some rounds, before the main loop - VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 - VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3 - VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3 - VMOVDQA ctr3StoreAVX2, DD0 - VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2; VPADDD ·avx2IncMask<>(SB), DD2, DD3 - VMOVDQA DD0, ctr0StoreAVX2; VMOVDQA DD1, ctr1StoreAVX2; VMOVDQA DD2, ctr2StoreAVX2; VMOVDQA DD3, ctr3StoreAVX2 - - VMOVDQA CC3, tmpStoreAVX2 - chachaQR_AVX2(AA0, BB0, CC0, DD0, CC3); chachaQR_AVX2(AA1, BB1, CC1, DD1, CC3); chachaQR_AVX2(AA2, BB2, CC2, DD2, CC3) - VMOVDQA tmpStoreAVX2, CC3 - VMOVDQA CC1, tmpStoreAVX2 - chachaQR_AVX2(AA3, BB3, CC3, DD3, CC1) - VMOVDQA tmpStoreAVX2, CC1 - - VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $12, DD0, DD0, DD0 - VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $12, DD1, DD1, DD1 - VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $12, DD2, DD2, DD2 - VPALIGNR $4, BB3, BB3, BB3; VPALIGNR $8, CC3, CC3, CC3; VPALIGNR $12, DD3, DD3, DD3 - - VMOVDQA CC3, tmpStoreAVX2 - chachaQR_AVX2(AA0, BB0, CC0, DD0, CC3); chachaQR_AVX2(AA1, BB1, CC1, DD1, CC3); chachaQR_AVX2(AA2, BB2, CC2, DD2, CC3) - VMOVDQA tmpStoreAVX2, CC3 - VMOVDQA CC1, tmpStoreAVX2 - chachaQR_AVX2(AA3, BB3, CC3, DD3, CC1) - VMOVDQA tmpStoreAVX2, CC1 - - VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $4, DD0, DD0, DD0 - VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $4, DD1, DD1, DD1 - VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $4, DD2, DD2, DD2 - VPALIGNR $12, BB3, BB3, BB3; VPALIGNR $8, CC3, CC3, CC3; VPALIGNR $4, DD3, DD3, DD3 - VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 - VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 - VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 - VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 - VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 - VMOVDQA CC3, tmpStoreAVX2 - VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 - VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 - VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 - VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 - VMOVDQA tmpStoreAVX2, CC3 - - SUBQ $16, oup // Adjust the pointer - MOVQ $9, itr1 - JMP sealAVX2InternalLoopStart - -sealAVX2MainLoop: - // Load state, increment counter blocks, store the incremented counters - VMOVDQU ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 - VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3 - VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3 - VMOVDQA ctr3StoreAVX2, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2; VPADDD ·avx2IncMask<>(SB), DD2, DD3 - VMOVDQA DD0, ctr0StoreAVX2; VMOVDQA DD1, ctr1StoreAVX2; VMOVDQA DD2, ctr2StoreAVX2; VMOVDQA DD3, ctr3StoreAVX2 - MOVQ $10, itr1 - -sealAVX2InternalLoop: - polyAdd(0*8(oup)) - VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 - polyMulStage1_AVX2 - VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 - VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 - polyMulStage2_AVX2 - VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 - VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 - polyMulStage3_AVX2 - VMOVDQA CC3, tmpStoreAVX2 - VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 - VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 - VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 - VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 - VMOVDQA tmpStoreAVX2, CC3 - polyMulReduceStage - -sealAVX2InternalLoopStart: - VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 - VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 - VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 - polyAdd(2*8(oup)) - VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 - polyMulStage1_AVX2 - VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 - VMOVDQA CC3, tmpStoreAVX2 - VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 - VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 - VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 - VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 - VMOVDQA tmpStoreAVX2, CC3 - polyMulStage2_AVX2 - VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $4, BB3, BB3, BB3 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 - VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2; VPALIGNR $12, DD3, DD3, DD3 - VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 - polyMulStage3_AVX2 - VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 - VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 - polyMulReduceStage - VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 - VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 - polyAdd(4*8(oup)) - LEAQ (6*8)(oup), oup - VMOVDQA CC3, tmpStoreAVX2 - VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 - VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 - VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 - VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 - VMOVDQA tmpStoreAVX2, CC3 - polyMulStage1_AVX2 - VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 - VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 - polyMulStage2_AVX2 - VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 - VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 - polyMulStage3_AVX2 - VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 - VMOVDQA CC3, tmpStoreAVX2 - VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 - VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 - VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 - VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 - VMOVDQA tmpStoreAVX2, CC3 - polyMulReduceStage - VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $12, BB3, BB3, BB3 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 - VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2; VPALIGNR $4, DD3, DD3, DD3 - DECQ itr1 - JNE sealAVX2InternalLoop - - VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2; VPADDD ·chacha20Constants<>(SB), AA3, AA3 - VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2; VPADDD state1StoreAVX2, BB3, BB3 - VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2; VPADDD state2StoreAVX2, CC3, CC3 - VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2; VPADDD ctr3StoreAVX2, DD3, DD3 - VMOVDQA CC3, tmpStoreAVX2 - - // We only hashed 480 of the 512 bytes available - hash the remaining 32 here - polyAdd(0*8(oup)) - polyMulAVX2 - LEAQ (4*8)(oup), oup - VPERM2I128 $0x02, AA0, BB0, CC3; VPERM2I128 $0x13, AA0, BB0, BB0; VPERM2I128 $0x02, CC0, DD0, AA0; VPERM2I128 $0x13, CC0, DD0, CC0 - VPXOR (0*32)(inp), CC3, CC3; VPXOR (1*32)(inp), AA0, AA0; VPXOR (2*32)(inp), BB0, BB0; VPXOR (3*32)(inp), CC0, CC0 - VMOVDQU CC3, (0*32)(oup); VMOVDQU AA0, (1*32)(oup); VMOVDQU BB0, (2*32)(oup); VMOVDQU CC0, (3*32)(oup) - VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 - VPXOR (4*32)(inp), AA0, AA0; VPXOR (5*32)(inp), BB0, BB0; VPXOR (6*32)(inp), CC0, CC0; VPXOR (7*32)(inp), DD0, DD0 - VMOVDQU AA0, (4*32)(oup); VMOVDQU BB0, (5*32)(oup); VMOVDQU CC0, (6*32)(oup); VMOVDQU DD0, (7*32)(oup) - - // and here - polyAdd(-2*8(oup)) - polyMulAVX2 - VPERM2I128 $0x02, AA2, BB2, AA0; VPERM2I128 $0x02, CC2, DD2, BB0; VPERM2I128 $0x13, AA2, BB2, CC0; VPERM2I128 $0x13, CC2, DD2, DD0 - VPXOR (8*32)(inp), AA0, AA0; VPXOR (9*32)(inp), BB0, BB0; VPXOR (10*32)(inp), CC0, CC0; VPXOR (11*32)(inp), DD0, DD0 - VMOVDQU AA0, (8*32)(oup); VMOVDQU BB0, (9*32)(oup); VMOVDQU CC0, (10*32)(oup); VMOVDQU DD0, (11*32)(oup) - VPERM2I128 $0x02, AA3, BB3, AA0; VPERM2I128 $0x02, tmpStoreAVX2, DD3, BB0; VPERM2I128 $0x13, AA3, BB3, CC0; VPERM2I128 $0x13, tmpStoreAVX2, DD3, DD0 - VPXOR (12*32)(inp), AA0, AA0; VPXOR (13*32)(inp), BB0, BB0; VPXOR (14*32)(inp), CC0, CC0; VPXOR (15*32)(inp), DD0, DD0 - VMOVDQU AA0, (12*32)(oup); VMOVDQU BB0, (13*32)(oup); VMOVDQU CC0, (14*32)(oup); VMOVDQU DD0, (15*32)(oup) - LEAQ (32*16)(inp), inp - SUBQ $(32*16), inl - CMPQ inl, $512 - JG sealAVX2MainLoop - - // Tail can only hash 480 bytes - polyAdd(0*8(oup)) - polyMulAVX2 - polyAdd(2*8(oup)) - polyMulAVX2 - LEAQ 32(oup), oup - - MOVQ $10, itr1 - MOVQ $0, itr2 - CMPQ inl, $128 - JBE sealAVX2Tail128 - CMPQ inl, $256 - JBE sealAVX2Tail256 - CMPQ inl, $384 - JBE sealAVX2Tail384 - JMP sealAVX2Tail512 - -// ---------------------------------------------------------------------------- -// Special optimization for buffers smaller than 193 bytes -seal192AVX2: - // For up to 192 bytes of ciphertext and 64 bytes for the poly key, we process four blocks - VMOVDQA AA0, AA1 - VMOVDQA BB0, BB1 - VMOVDQA CC0, CC1 - VPADDD ·avx2IncMask<>(SB), DD0, DD1 - VMOVDQA AA0, AA2 - VMOVDQA BB0, BB2 - VMOVDQA CC0, CC2 - VMOVDQA DD0, DD2 - VMOVDQA DD1, TT3 - MOVQ $10, itr2 - -sealAVX2192InnerCipherLoop: - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) - VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 - VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1 - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) - VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 - VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1 - DECQ itr2 - JNE sealAVX2192InnerCipherLoop - VPADDD AA2, AA0, AA0; VPADDD AA2, AA1, AA1 - VPADDD BB2, BB0, BB0; VPADDD BB2, BB1, BB1 - VPADDD CC2, CC0, CC0; VPADDD CC2, CC1, CC1 - VPADDD DD2, DD0, DD0; VPADDD TT3, DD1, DD1 - VPERM2I128 $0x02, AA0, BB0, TT0 - - // Clamp and store poly key - VPAND ·polyClampMask<>(SB), TT0, TT0 - VMOVDQA TT0, rsStoreAVX2 - - // Stream for up to 192 bytes - VPERM2I128 $0x13, AA0, BB0, AA0 - VPERM2I128 $0x13, CC0, DD0, BB0 - VPERM2I128 $0x02, AA1, BB1, CC0 - VPERM2I128 $0x02, CC1, DD1, DD0 - VPERM2I128 $0x13, AA1, BB1, AA1 - VPERM2I128 $0x13, CC1, DD1, BB1 - -sealAVX2ShortSeal: - // Hash aad - MOVQ ad_len+80(FP), itr2 - CALL polyHashADInternal<>(SB) - XORQ itr1, itr1 - -sealAVX2SealHash: - // itr1 holds the number of bytes encrypted but not yet hashed - CMPQ itr1, $16 - JB sealAVX2ShortSealLoop - polyAdd(0(oup)) - polyMul - SUBQ $16, itr1 - ADDQ $16, oup - JMP sealAVX2SealHash - -sealAVX2ShortSealLoop: - CMPQ inl, $32 - JB sealAVX2ShortTail32 - SUBQ $32, inl - - // Load for encryption - VPXOR (inp), AA0, AA0 - VMOVDQU AA0, (oup) - LEAQ (1*32)(inp), inp - - // Now can hash - polyAdd(0*8(oup)) - polyMulAVX2 - polyAdd(2*8(oup)) - polyMulAVX2 - LEAQ (1*32)(oup), oup - - // Shift stream left - VMOVDQA BB0, AA0 - VMOVDQA CC0, BB0 - VMOVDQA DD0, CC0 - VMOVDQA AA1, DD0 - VMOVDQA BB1, AA1 - VMOVDQA CC1, BB1 - VMOVDQA DD1, CC1 - VMOVDQA AA2, DD1 - VMOVDQA BB2, AA2 - JMP sealAVX2ShortSealLoop - -sealAVX2ShortTail32: - CMPQ inl, $16 - VMOVDQA A0, A1 - JB sealAVX2ShortDone - - SUBQ $16, inl - - // Load for encryption - VPXOR (inp), A0, T0 - VMOVDQU T0, (oup) - LEAQ (1*16)(inp), inp - - // Hash - polyAdd(0*8(oup)) - polyMulAVX2 - LEAQ (1*16)(oup), oup - VPERM2I128 $0x11, AA0, AA0, AA0 - VMOVDQA A0, A1 - -sealAVX2ShortDone: - VZEROUPPER - JMP sealSSETail - -// ---------------------------------------------------------------------------- -// Special optimization for buffers smaller than 321 bytes -seal320AVX2: - // For up to 320 bytes of ciphertext and 64 bytes for the poly key, we process six blocks - VMOVDQA AA0, AA1; VMOVDQA BB0, BB1; VMOVDQA CC0, CC1; VPADDD ·avx2IncMask<>(SB), DD0, DD1 - VMOVDQA AA0, AA2; VMOVDQA BB0, BB2; VMOVDQA CC0, CC2; VPADDD ·avx2IncMask<>(SB), DD1, DD2 - VMOVDQA BB0, TT1; VMOVDQA CC0, TT2; VMOVDQA DD0, TT3 - MOVQ $10, itr2 - -sealAVX2320InnerCipherLoop: - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) - VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 - VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2 - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) - VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 - VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2 - DECQ itr2 - JNE sealAVX2320InnerCipherLoop - - VMOVDQA ·chacha20Constants<>(SB), TT0 - VPADDD TT0, AA0, AA0; VPADDD TT0, AA1, AA1; VPADDD TT0, AA2, AA2 - VPADDD TT1, BB0, BB0; VPADDD TT1, BB1, BB1; VPADDD TT1, BB2, BB2 - VPADDD TT2, CC0, CC0; VPADDD TT2, CC1, CC1; VPADDD TT2, CC2, CC2 - VMOVDQA ·avx2IncMask<>(SB), TT0 - VPADDD TT3, DD0, DD0; VPADDD TT0, TT3, TT3 - VPADDD TT3, DD1, DD1; VPADDD TT0, TT3, TT3 - VPADDD TT3, DD2, DD2 - - // Clamp and store poly key - VPERM2I128 $0x02, AA0, BB0, TT0 - VPAND ·polyClampMask<>(SB), TT0, TT0 - VMOVDQA TT0, rsStoreAVX2 - - // Stream for up to 320 bytes - VPERM2I128 $0x13, AA0, BB0, AA0 - VPERM2I128 $0x13, CC0, DD0, BB0 - VPERM2I128 $0x02, AA1, BB1, CC0 - VPERM2I128 $0x02, CC1, DD1, DD0 - VPERM2I128 $0x13, AA1, BB1, AA1 - VPERM2I128 $0x13, CC1, DD1, BB1 - VPERM2I128 $0x02, AA2, BB2, CC1 - VPERM2I128 $0x02, CC2, DD2, DD1 - VPERM2I128 $0x13, AA2, BB2, AA2 - VPERM2I128 $0x13, CC2, DD2, BB2 - JMP sealAVX2ShortSeal - -// ---------------------------------------------------------------------------- -// Special optimization for the last 128 bytes of ciphertext -sealAVX2Tail128: - // Need to decrypt up to 128 bytes - prepare two blocks - // If we got here after the main loop - there are 512 encrypted bytes waiting to be hashed - // If we got here before the main loop - there are 448 encrpyred bytes waiting to be hashed - VMOVDQA ·chacha20Constants<>(SB), AA0 - VMOVDQA state1StoreAVX2, BB0 - VMOVDQA state2StoreAVX2, CC0 - VMOVDQA ctr3StoreAVX2, DD0 - VPADDD ·avx2IncMask<>(SB), DD0, DD0 - VMOVDQA DD0, DD1 - -sealAVX2Tail128LoopA: - polyAdd(0(oup)) - polyMul - LEAQ 16(oup), oup - -sealAVX2Tail128LoopB: - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0) - polyAdd(0(oup)) - polyMul - VPALIGNR $4, BB0, BB0, BB0 - VPALIGNR $8, CC0, CC0, CC0 - VPALIGNR $12, DD0, DD0, DD0 - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0) - polyAdd(16(oup)) - polyMul - LEAQ 32(oup), oup - VPALIGNR $12, BB0, BB0, BB0 - VPALIGNR $8, CC0, CC0, CC0 - VPALIGNR $4, DD0, DD0, DD0 - DECQ itr1 - JG sealAVX2Tail128LoopA - DECQ itr2 - JGE sealAVX2Tail128LoopB - - VPADDD ·chacha20Constants<>(SB), AA0, AA1 - VPADDD state1StoreAVX2, BB0, BB1 - VPADDD state2StoreAVX2, CC0, CC1 - VPADDD DD1, DD0, DD1 - - VPERM2I128 $0x02, AA1, BB1, AA0 - VPERM2I128 $0x02, CC1, DD1, BB0 - VPERM2I128 $0x13, AA1, BB1, CC0 - VPERM2I128 $0x13, CC1, DD1, DD0 - JMP sealAVX2ShortSealLoop - -// ---------------------------------------------------------------------------- -// Special optimization for the last 256 bytes of ciphertext -sealAVX2Tail256: - // Need to decrypt up to 256 bytes - prepare two blocks - // If we got here after the main loop - there are 512 encrypted bytes waiting to be hashed - // If we got here before the main loop - there are 448 encrpyred bytes waiting to be hashed - VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA ·chacha20Constants<>(SB), AA1 - VMOVDQA state1StoreAVX2, BB0; VMOVDQA state1StoreAVX2, BB1 - VMOVDQA state2StoreAVX2, CC0; VMOVDQA state2StoreAVX2, CC1 - VMOVDQA ctr3StoreAVX2, DD0 - VPADDD ·avx2IncMask<>(SB), DD0, DD0 - VPADDD ·avx2IncMask<>(SB), DD0, DD1 - VMOVDQA DD0, TT1 - VMOVDQA DD1, TT2 - -sealAVX2Tail256LoopA: - polyAdd(0(oup)) - polyMul - LEAQ 16(oup), oup - -sealAVX2Tail256LoopB: - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) - polyAdd(0(oup)) - polyMul - VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 - VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1 - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) - polyAdd(16(oup)) - polyMul - LEAQ 32(oup), oup - VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 - VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1 - DECQ itr1 - JG sealAVX2Tail256LoopA - DECQ itr2 - JGE sealAVX2Tail256LoopB - - VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1 - VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1 - VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1 - VPADDD TT1, DD0, DD0; VPADDD TT2, DD1, DD1 - VPERM2I128 $0x02, AA0, BB0, TT0 - VPERM2I128 $0x02, CC0, DD0, TT1 - VPERM2I128 $0x13, AA0, BB0, TT2 - VPERM2I128 $0x13, CC0, DD0, TT3 - VPXOR (0*32)(inp), TT0, TT0; VPXOR (1*32)(inp), TT1, TT1; VPXOR (2*32)(inp), TT2, TT2; VPXOR (3*32)(inp), TT3, TT3 - VMOVDQU TT0, (0*32)(oup); VMOVDQU TT1, (1*32)(oup); VMOVDQU TT2, (2*32)(oup); VMOVDQU TT3, (3*32)(oup) - MOVQ $128, itr1 - LEAQ 128(inp), inp - SUBQ $128, inl - VPERM2I128 $0x02, AA1, BB1, AA0 - VPERM2I128 $0x02, CC1, DD1, BB0 - VPERM2I128 $0x13, AA1, BB1, CC0 - VPERM2I128 $0x13, CC1, DD1, DD0 - - JMP sealAVX2SealHash - -// ---------------------------------------------------------------------------- -// Special optimization for the last 384 bytes of ciphertext -sealAVX2Tail384: - // Need to decrypt up to 384 bytes - prepare two blocks - // If we got here after the main loop - there are 512 encrypted bytes waiting to be hashed - // If we got here before the main loop - there are 448 encrpyred bytes waiting to be hashed - VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2 - VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2 - VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2 - VMOVDQA ctr3StoreAVX2, DD0 - VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2 - VMOVDQA DD0, TT1; VMOVDQA DD1, TT2; VMOVDQA DD2, TT3 - -sealAVX2Tail384LoopA: - polyAdd(0(oup)) - polyMul - LEAQ 16(oup), oup - -sealAVX2Tail384LoopB: - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) - polyAdd(0(oup)) - polyMul - VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 - VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2 - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) - polyAdd(16(oup)) - polyMul - LEAQ 32(oup), oup - VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 - VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2 - DECQ itr1 - JG sealAVX2Tail384LoopA - DECQ itr2 - JGE sealAVX2Tail384LoopB - - VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2 - VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2 - VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2 - VPADDD TT1, DD0, DD0; VPADDD TT2, DD1, DD1; VPADDD TT3, DD2, DD2 - VPERM2I128 $0x02, AA0, BB0, TT0 - VPERM2I128 $0x02, CC0, DD0, TT1 - VPERM2I128 $0x13, AA0, BB0, TT2 - VPERM2I128 $0x13, CC0, DD0, TT3 - VPXOR (0*32)(inp), TT0, TT0; VPXOR (1*32)(inp), TT1, TT1; VPXOR (2*32)(inp), TT2, TT2; VPXOR (3*32)(inp), TT3, TT3 - VMOVDQU TT0, (0*32)(oup); VMOVDQU TT1, (1*32)(oup); VMOVDQU TT2, (2*32)(oup); VMOVDQU TT3, (3*32)(oup) - VPERM2I128 $0x02, AA1, BB1, TT0 - VPERM2I128 $0x02, CC1, DD1, TT1 - VPERM2I128 $0x13, AA1, BB1, TT2 - VPERM2I128 $0x13, CC1, DD1, TT3 - VPXOR (4*32)(inp), TT0, TT0; VPXOR (5*32)(inp), TT1, TT1; VPXOR (6*32)(inp), TT2, TT2; VPXOR (7*32)(inp), TT3, TT3 - VMOVDQU TT0, (4*32)(oup); VMOVDQU TT1, (5*32)(oup); VMOVDQU TT2, (6*32)(oup); VMOVDQU TT3, (7*32)(oup) - MOVQ $256, itr1 - LEAQ 256(inp), inp - SUBQ $256, inl - VPERM2I128 $0x02, AA2, BB2, AA0 - VPERM2I128 $0x02, CC2, DD2, BB0 - VPERM2I128 $0x13, AA2, BB2, CC0 - VPERM2I128 $0x13, CC2, DD2, DD0 - - JMP sealAVX2SealHash - -// ---------------------------------------------------------------------------- -// Special optimization for the last 512 bytes of ciphertext -sealAVX2Tail512: - // Need to decrypt up to 512 bytes - prepare two blocks - // If we got here after the main loop - there are 512 encrypted bytes waiting to be hashed - // If we got here before the main loop - there are 448 encrpyred bytes waiting to be hashed - VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 - VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3 - VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3 - VMOVDQA ctr3StoreAVX2, DD0 - VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2; VPADDD ·avx2IncMask<>(SB), DD2, DD3 - VMOVDQA DD0, ctr0StoreAVX2; VMOVDQA DD1, ctr1StoreAVX2; VMOVDQA DD2, ctr2StoreAVX2; VMOVDQA DD3, ctr3StoreAVX2 - -sealAVX2Tail512LoopA: - polyAdd(0(oup)) - polyMul - LEAQ 16(oup), oup - -sealAVX2Tail512LoopB: - VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 - VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 - VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 - VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 - VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 - VMOVDQA CC3, tmpStoreAVX2 - VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 - VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 - VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 - VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 - VMOVDQA tmpStoreAVX2, CC3 - polyAdd(0*8(oup)) - polyMulAVX2 - VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 - VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 - VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 - VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 - VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 - VMOVDQA CC3, tmpStoreAVX2 - VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 - VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 - VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 - VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 - VMOVDQA tmpStoreAVX2, CC3 - VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $4, BB3, BB3, BB3 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 - VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2; VPALIGNR $12, DD3, DD3, DD3 - VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 - VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 - VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 - VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 - VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 - polyAdd(2*8(oup)) - polyMulAVX2 - LEAQ (4*8)(oup), oup - VMOVDQA CC3, tmpStoreAVX2 - VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 - VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 - VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 - VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 - VMOVDQA tmpStoreAVX2, CC3 - VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 - VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 - VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 - VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 - VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 - VMOVDQA CC3, tmpStoreAVX2 - VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 - VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 - VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 - VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 - VMOVDQA tmpStoreAVX2, CC3 - VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $12, BB3, BB3, BB3 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 - VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2; VPALIGNR $4, DD3, DD3, DD3 - - DECQ itr1 - JG sealAVX2Tail512LoopA - DECQ itr2 - JGE sealAVX2Tail512LoopB - - VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2; VPADDD ·chacha20Constants<>(SB), AA3, AA3 - VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2; VPADDD state1StoreAVX2, BB3, BB3 - VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2; VPADDD state2StoreAVX2, CC3, CC3 - VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2; VPADDD ctr3StoreAVX2, DD3, DD3 - VMOVDQA CC3, tmpStoreAVX2 - VPERM2I128 $0x02, AA0, BB0, CC3 - VPXOR (0*32)(inp), CC3, CC3 - VMOVDQU CC3, (0*32)(oup) - VPERM2I128 $0x02, CC0, DD0, CC3 - VPXOR (1*32)(inp), CC3, CC3 - VMOVDQU CC3, (1*32)(oup) - VPERM2I128 $0x13, AA0, BB0, CC3 - VPXOR (2*32)(inp), CC3, CC3 - VMOVDQU CC3, (2*32)(oup) - VPERM2I128 $0x13, CC0, DD0, CC3 - VPXOR (3*32)(inp), CC3, CC3 - VMOVDQU CC3, (3*32)(oup) - - VPERM2I128 $0x02, AA1, BB1, AA0 - VPERM2I128 $0x02, CC1, DD1, BB0 - VPERM2I128 $0x13, AA1, BB1, CC0 - VPERM2I128 $0x13, CC1, DD1, DD0 - VPXOR (4*32)(inp), AA0, AA0; VPXOR (5*32)(inp), BB0, BB0; VPXOR (6*32)(inp), CC0, CC0; VPXOR (7*32)(inp), DD0, DD0 - VMOVDQU AA0, (4*32)(oup); VMOVDQU BB0, (5*32)(oup); VMOVDQU CC0, (6*32)(oup); VMOVDQU DD0, (7*32)(oup) - - VPERM2I128 $0x02, AA2, BB2, AA0 - VPERM2I128 $0x02, CC2, DD2, BB0 - VPERM2I128 $0x13, AA2, BB2, CC0 - VPERM2I128 $0x13, CC2, DD2, DD0 - VPXOR (8*32)(inp), AA0, AA0; VPXOR (9*32)(inp), BB0, BB0; VPXOR (10*32)(inp), CC0, CC0; VPXOR (11*32)(inp), DD0, DD0 - VMOVDQU AA0, (8*32)(oup); VMOVDQU BB0, (9*32)(oup); VMOVDQU CC0, (10*32)(oup); VMOVDQU DD0, (11*32)(oup) - - MOVQ $384, itr1 - LEAQ 384(inp), inp - SUBQ $384, inl - VPERM2I128 $0x02, AA3, BB3, AA0 - VPERM2I128 $0x02, tmpStoreAVX2, DD3, BB0 - VPERM2I128 $0x13, AA3, BB3, CC0 - VPERM2I128 $0x13, tmpStoreAVX2, DD3, DD0 - - JMP sealAVX2SealHash - -// func haveSSSE3() bool -TEXT ·haveSSSE3(SB), NOSPLIT, $0 - XORQ AX, AX - INCL AX - CPUID - SHRQ $9, CX - ANDQ $1, CX - MOVB CX, ret+0(FP) - RET - diff --git a/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_generic.go b/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_generic.go deleted file mode 100644 index f7e4bfb1c..000000000 --- a/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_generic.go +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package chacha20poly1305 - -import ( - "encoding/binary" - - "golang.org/x/crypto/chacha20poly1305/internal/chacha20" - "golang.org/x/crypto/poly1305" -) - -func roundTo16(n int) int { - return 16 * ((n + 15) / 16) -} - -func (c *chacha20poly1305) sealGeneric(dst, nonce, plaintext, additionalData []byte) []byte { - var counter [16]byte - copy(counter[4:], nonce) - - var polyKey [32]byte - chacha20.XORKeyStream(polyKey[:], polyKey[:], &counter, &c.key) - - ret, out := sliceForAppend(dst, len(plaintext)+poly1305.TagSize) - counter[0] = 1 - chacha20.XORKeyStream(out, plaintext, &counter, &c.key) - - polyInput := make([]byte, roundTo16(len(additionalData))+roundTo16(len(plaintext))+8+8) - copy(polyInput, additionalData) - copy(polyInput[roundTo16(len(additionalData)):], out[:len(plaintext)]) - binary.LittleEndian.PutUint64(polyInput[len(polyInput)-16:], uint64(len(additionalData))) - binary.LittleEndian.PutUint64(polyInput[len(polyInput)-8:], uint64(len(plaintext))) - - var tag [poly1305.TagSize]byte - poly1305.Sum(&tag, polyInput, &polyKey) - copy(out[len(plaintext):], tag[:]) - - return ret -} - -func (c *chacha20poly1305) openGeneric(dst, nonce, ciphertext, additionalData []byte) ([]byte, error) { - var tag [poly1305.TagSize]byte - copy(tag[:], ciphertext[len(ciphertext)-16:]) - ciphertext = ciphertext[:len(ciphertext)-16] - - var counter [16]byte - copy(counter[4:], nonce) - - var polyKey [32]byte - chacha20.XORKeyStream(polyKey[:], polyKey[:], &counter, &c.key) - - polyInput := make([]byte, roundTo16(len(additionalData))+roundTo16(len(ciphertext))+8+8) - copy(polyInput, additionalData) - copy(polyInput[roundTo16(len(additionalData)):], ciphertext) - binary.LittleEndian.PutUint64(polyInput[len(polyInput)-16:], uint64(len(additionalData))) - binary.LittleEndian.PutUint64(polyInput[len(polyInput)-8:], uint64(len(ciphertext))) - - ret, out := sliceForAppend(dst, len(ciphertext)) - if !poly1305.Verify(&tag, polyInput, &polyKey) { - for i := range out { - out[i] = 0 - } - return nil, errOpen - } - - counter[0] = 1 - chacha20.XORKeyStream(out, ciphertext, &counter, &c.key) - return ret, nil -} diff --git a/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_noasm.go b/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_noasm.go deleted file mode 100644 index 4c2eb703c..000000000 --- a/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_noasm.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !amd64 !go1.7 gccgo appengine - -package chacha20poly1305 - -func (c *chacha20poly1305) seal(dst, nonce, plaintext, additionalData []byte) []byte { - return c.sealGeneric(dst, nonce, plaintext, additionalData) -} - -func (c *chacha20poly1305) open(dst, nonce, ciphertext, additionalData []byte) ([]byte, error) { - return c.openGeneric(dst, nonce, ciphertext, additionalData) -} diff --git a/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_test.go b/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_test.go deleted file mode 100644 index 78f981a74..000000000 --- a/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_test.go +++ /dev/null @@ -1,182 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package chacha20poly1305 - -import ( - "bytes" - cr "crypto/rand" - "encoding/hex" - mr "math/rand" - "testing" -) - -func TestVectors(t *testing.T) { - for i, test := range chacha20Poly1305Tests { - key, _ := hex.DecodeString(test.key) - nonce, _ := hex.DecodeString(test.nonce) - ad, _ := hex.DecodeString(test.aad) - plaintext, _ := hex.DecodeString(test.plaintext) - - aead, err := New(key) - if err != nil { - t.Fatal(err) - } - - ct := aead.Seal(nil, nonce, plaintext, ad) - if ctHex := hex.EncodeToString(ct); ctHex != test.out { - t.Errorf("#%d: got %s, want %s", i, ctHex, test.out) - continue - } - - plaintext2, err := aead.Open(nil, nonce, ct, ad) - if err != nil { - t.Errorf("#%d: Open failed", i) - continue - } - - if !bytes.Equal(plaintext, plaintext2) { - t.Errorf("#%d: plaintext's don't match: got %x vs %x", i, plaintext2, plaintext) - continue - } - - if len(ad) > 0 { - alterAdIdx := mr.Intn(len(ad)) - ad[alterAdIdx] ^= 0x80 - if _, err := aead.Open(nil, nonce, ct, ad); err == nil { - t.Errorf("#%d: Open was successful after altering additional data", i) - } - ad[alterAdIdx] ^= 0x80 - } - - alterNonceIdx := mr.Intn(aead.NonceSize()) - nonce[alterNonceIdx] ^= 0x80 - if _, err := aead.Open(nil, nonce, ct, ad); err == nil { - t.Errorf("#%d: Open was successful after altering nonce", i) - } - nonce[alterNonceIdx] ^= 0x80 - - alterCtIdx := mr.Intn(len(ct)) - ct[alterCtIdx] ^= 0x80 - if _, err := aead.Open(nil, nonce, ct, ad); err == nil { - t.Errorf("#%d: Open was successful after altering ciphertext", i) - } - ct[alterCtIdx] ^= 0x80 - } -} - -func TestRandom(t *testing.T) { - // Some random tests to verify Open(Seal) == Plaintext - for i := 0; i < 256; i++ { - var nonce [12]byte - var key [32]byte - - al := mr.Intn(128) - pl := mr.Intn(16384) - ad := make([]byte, al) - plaintext := make([]byte, pl) - cr.Read(key[:]) - cr.Read(nonce[:]) - cr.Read(ad) - cr.Read(plaintext) - - aead, err := New(key[:]) - if err != nil { - t.Fatal(err) - } - - ct := aead.Seal(nil, nonce[:], plaintext, ad) - - plaintext2, err := aead.Open(nil, nonce[:], ct, ad) - if err != nil { - t.Errorf("Random #%d: Open failed", i) - continue - } - - if !bytes.Equal(plaintext, plaintext2) { - t.Errorf("Random #%d: plaintext's don't match: got %x vs %x", i, plaintext2, plaintext) - continue - } - - if len(ad) > 0 { - alterAdIdx := mr.Intn(len(ad)) - ad[alterAdIdx] ^= 0x80 - if _, err := aead.Open(nil, nonce[:], ct, ad); err == nil { - t.Errorf("Random #%d: Open was successful after altering additional data", i) - } - ad[alterAdIdx] ^= 0x80 - } - - alterNonceIdx := mr.Intn(aead.NonceSize()) - nonce[alterNonceIdx] ^= 0x80 - if _, err := aead.Open(nil, nonce[:], ct, ad); err == nil { - t.Errorf("Random #%d: Open was successful after altering nonce", i) - } - nonce[alterNonceIdx] ^= 0x80 - - alterCtIdx := mr.Intn(len(ct)) - ct[alterCtIdx] ^= 0x80 - if _, err := aead.Open(nil, nonce[:], ct, ad); err == nil { - t.Errorf("Random #%d: Open was successful after altering ciphertext", i) - } - ct[alterCtIdx] ^= 0x80 - } -} - -func benchamarkChaCha20Poly1305Seal(b *testing.B, buf []byte) { - b.SetBytes(int64(len(buf))) - - var key [32]byte - var nonce [12]byte - var ad [13]byte - var out []byte - - aead, _ := New(key[:]) - b.ResetTimer() - for i := 0; i < b.N; i++ { - out = aead.Seal(out[:0], nonce[:], buf[:], ad[:]) - } -} - -func benchamarkChaCha20Poly1305Open(b *testing.B, buf []byte) { - b.SetBytes(int64(len(buf))) - - var key [32]byte - var nonce [12]byte - var ad [13]byte - var ct []byte - var out []byte - - aead, _ := New(key[:]) - ct = aead.Seal(ct[:0], nonce[:], buf[:], ad[:]) - - b.ResetTimer() - for i := 0; i < b.N; i++ { - out, _ = aead.Open(out[:0], nonce[:], ct[:], ad[:]) - } -} - -func BenchmarkChacha20Poly1305Open_64(b *testing.B) { - benchamarkChaCha20Poly1305Open(b, make([]byte, 64)) -} - -func BenchmarkChacha20Poly1305Seal_64(b *testing.B) { - benchamarkChaCha20Poly1305Seal(b, make([]byte, 64)) -} - -func BenchmarkChacha20Poly1305Open_1350(b *testing.B) { - benchamarkChaCha20Poly1305Open(b, make([]byte, 1350)) -} - -func BenchmarkChacha20Poly1305Seal_1350(b *testing.B) { - benchamarkChaCha20Poly1305Seal(b, make([]byte, 1350)) -} - -func BenchmarkChacha20Poly1305Open_8K(b *testing.B) { - benchamarkChaCha20Poly1305Open(b, make([]byte, 8*1024)) -} - -func BenchmarkChacha20Poly1305Seal_8K(b *testing.B) { - benchamarkChaCha20Poly1305Seal(b, make([]byte, 8*1024)) -} diff --git a/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_vectors_test.go b/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_vectors_test.go deleted file mode 100644 index 49f0da6b7..000000000 --- a/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_vectors_test.go +++ /dev/null @@ -1,332 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package chacha20poly1305 - -var chacha20Poly1305Tests = []struct { - plaintext, aad, key, nonce, out string -}{ - { - "4c616469657320616e642047656e746c656d656e206f662074686520636c617373206f66202739393a204966204920636f756c64206f6666657220796f75206f6e6c79206f6e652074697020666f7220746865206675747572652c2073756e73637265656e20776f756c642062652069742e", - "50515253c0c1c2c3c4c5c6c7", - "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f", - "070000004041424344454647", - "d31a8d34648e60db7b86afbc53ef7ec2a4aded51296e08fea9e2b5a736ee62d63dbea45e8ca9671282fafb69da92728b1a71de0a9e060b2905d6a5b67ecd3b3692ddbd7f2d778b8c9803aee328091b58fab324e4fad675945585808b4831d7bc3ff4def08e4b7a9de576d26586cec64b61161ae10b594f09e26a7e902ecbd0600691", - }, - { - "1400000cebccee3bf561b292340fec60", - "00000000000000001603030010", - "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", - "129039b5572e8a7a8131f76a", - "2b487a2941bc07f3cc76d1a531662588ee7c2598e59778c24d5b27559a80d163", - }, - { - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "00000000000000000000000000", - "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", - "129039b5572e8a7a8131f76a", - "3f487a25aa70e9c8391763370569c9e83b7650dd1921c8b78869f241f25d2096c910b180930c5b8747fd90959fe8ca2dcadb4fa50fa1439f916b2301e1cc0810d6725775d3ab86721700f96e22709b0a7a8bef32627dd929b2dd3ba15772b669062bb558bc92e6c241a1d60d9f0035e80c335f854815fe1138ab8af653eab3e122135feeec7dfaba1cc24af82a2b7acccdd824899a7e03cc29c25be8a4f56a66673845b93bae1556f09dafc89a0d22af207718e2a6bb022e9d917597295992ea3b750cc0e7a7c3d33b23c5a8aeab45f5bb542f6c9e6c1747ae5a344aff483ba38577ad534b33b3abc7d284776ea33ed488c2a2475648a4fcda561745ea7787ed60f2368deb27c75adce6ff9b6cc6de1f5e72a741e2d59f64751b3ae482d714e0c90e83c671ff98ed611823afb39e6e5019a6ba548a2a72e829c7b7b4a101ac9deb90a25d3e0c50d22e1fc26c7c02296fa13c6d9c14767f68aaf46450a8d0fd5feb60d9d73c6e68623425b4984a79d619dd6bf896459aa77a681ec9c1a97f645e121f47779b051f8948a817f84d1f55da170d5bbbaf2f64e18b97ed3fd822db2819f523314f1e5ac72e8f69bbe6c87c22daddb0e1ac6790f8534071de2f258064b99789bfb165b065b8fe96f9127cd7dca9f7cb0368420f1e802faa3ca23792f2a5b93773dd405e71c320b211b54f7a26626b03c060e1ab87f32ac588abfa056ce090bd7c69913a700c80f325bfe824fa", - }, - { - "0967de57eefe1aaa999b9b746d88a1a248000d8734e0e938c6aa87", - "e4f0a3a4f90a8250f8806aa319053e8d73c62f150e2f239563037e9cc92823ad18c65111d0d462c954cc6c6ed2aafb45702a5a7e597d13bd8091594ab97cf7d1", - "f2db28620582e05f00f31c808475ca3df1c20e340bf14828352499466d79295f", - "4349e2131d44dc711148dfe3", - "bd06cc144fdc0d8b735fa4452eabbf78fd4ad2966ea41a84f68da40ca2da439777bc2ba6c4ec2de0d003eb", - }, - { - "c4c920fb52a56fe66eaa8aa3fa187c543e3db8e5c8094c4313dc4ed35dfc5821c5791d171e8cfe8d37883031a0ad", - "85deea3dc4", - "05ff881d1e151bab4ca3db7d44880222733fe62686f71ce1e4610f2ea19599a7", - "b34710f65aed442e4a40866b", - "b154452fb7e85d175dd0b0db08591565c5587a725cf22386922f5d27a01015aba778975510b38754b2182e24352f019b7ad493e1ed255906715644aec6e0", - }, - { - "c4b337df5e83823900c6c202e93541cf5bc8c677a9aad8b8d87a4d7221e294e595cbc4f34e462d4e0def50f62491c57f598cf60236cfba0f4908816aea154f80e013732e59a07c668fcc5cb35d2232b7ae29b9e4f874f3417c74ab6689fae6690d5a9766fa13cd8adf293d3d4b70f4f999adde9121d1d29d467d04cf77ea398444d0ea3fe4b7c9c3e106002c76f4260fa204a0c3d5", - "72611bef65eb664f24ea94f4d5d3d88c9c9c6da29c9a1991c02833c4c9f6993b57b5", - "dd0f2d4bb1c9e5ca5aa5f38d69bc8402f7dbb7229857b4a41b3044d481b7655e", - "2bbca0910cc47ca0b8517391", - "83aa28d6d98901e2981d21d3758ae4db8cce07fe08d82ca6f036a68daa88a7dda56eeb38040c942bdda0fd2d369eec44bd070e2c9314992f68dc16989a6ac0c3912c378cf3254f4bae74a66b075e828df6f855c0d8a827ffed3c03582c12a9112eeb7be43dfe8bd78beb2d1e56678b99a0372531727cb7f2b98d2f917ec10de93fe86267100c20356e80528c5066688c8b7acba76e591449952343f663993d5b642e59eb0f", - }, - { - "a9775b8e42b63335439cf1c79fe8a3560b3baebfdfc9ef239d70da02cea0947817f00659a63a8ee9d67fb1756854cc738f7a326e432191e1916be35f0b78d72268de7c0e180af7ee8aa864f2fc30658baa97f9edb88ace49f5b2a8002a8023925e9fa076a997643340c8253cf88ac8a221c190d94c5e224110cb423a4b65cca9046c1fad0483e1444c0680449148e7b20a778c56d5ae97e679d920c43eed6d42598cf05d10d1a15cd722a0686a871b74fea7cad45562bacf3bda937ac701bc218dac7e9d7d20f955429abdac21d821207febf4d54daea4898837035038bf71c66cef63e90f5d3e51f7fcfe18d41f38540a2c2958dacde16304e4b33da324030f1366f923c337", - "74ba3372d308910b5c9c3885f41252d57556", - "9cf77bd06a4ed8fb59349791b98ba40b6019611942f5768e8be2ee88477149e3", - "b928935c4c966c60fd6583c0", - "ec7fd64fd75b254961a2b7fc942470d8620f439258b871d0d00f58028b5e0bee5e139e8108ac439391465d6658f559b1df57aa21cf826ede1a28bc11af885e13eebfc009870928fae8abfdd943a60c54fca93f0502dc23d29c2fd5340f9bc0e6ef2a18b66ef627af95f796d5bbca50de22c8ec802da9397089b25c6ba5262468e3977b45dc112e51896c70731b0a52d7efec7c93b41995823436bf4b0c477ae79684407c9831b487928b2b8303caca752b3edf1f0598e15831155462706f94ef3fa3a9e5f937f37085afa9b4bbf939d275796a61b78f70597acfd25cd87f967021cd99328fc371b5eb5739869520657b30e4a5b0db7c8715cbe275dee78e719b357d3a9731f9eaba95986479bb2004a77822fc115a3d", - }, - { - "b3d3128bce6bbf66fd78f1a18352bae56bfcdae18b65c379ee0aeb37ee54fba1270d2df578ec5b75654d16e89fd1cd0acda7ec580dafd2fbbabd32a8112d49383a762db2638928c8d63eb0750f7e7fdd256b35321b072dd5c45f7dd58cc60dc63d3b79a0c4a1689adf180fef968eccbcfa01ee15091ceacd7b67a3082db0ce6aeb470aafe87249c88b58b721e783dde184ccf68de8e05b6347fe6b74ae3adf9a81e9496a5c9332e7ebe908d26ce6b3f0b2a97e9a89d9fdd0d7694585a3241f240d698e69fcc050e7a959ba153f6d06f117848ba05d887134f1b6b994dad9b9e74247513e08a125b1fadfc7394dcd2a6451b504ae3e75e22f2b9bc405747dedb6c43ef4ccdf1a7edaf9451346123eaa63f3af113124f361508e255503a242b96680ae3360c8b13ac1f64d08088bb26b7f617cb0866f11d6fd362b00d86eba3fee68724e302388f119d6f92161ac8ce00d08919377a26974d99575b1032ff0f1976240c785c8b89e9eb2bf005e4be06b5371ffca14683fedfdb49e00e38ff27af1324177faf91599abd5990920797574eb743effdc7decda318ada1419cc8e0bfecf82f9c99792746c2b", - "7e8da4f3018f673f8e43bd7a1dee05f8031ec49129c361abbc2a434e9eaf791c3c1d0f3dad767d3bba3ab6d728bbcf2bd994bd03571eae1348f161e6a1da03ddf7121ba4", - "7ee32dd501dce849cd492f6e23324c1a4567bfceff9f11d1352bcb8615f1b093", - "8998e043d2961afa51ea262a", - "ba85e72af18cb5ba85a4a0d6c28b4ac1e5509a3a2fdb0e3255cbc559df5e6a661fc560c756a0264dd99b72c61c51a4b7ad56ca4c8ccb7e8edfc48ff3cceac5d1e8ac5fc87096adc4d0e9a27492857b17604c3a694cfe0e70b22df106c8f3c61f840bcd634964cdb571840e125e381e7dd3a0d97972e965f16f775fa4ce555124318290bf508beb7bd77e633042deb0e863631478fc3dc9122862b3c31264471bcce54e0b74040c8bafd481cf798f332e8940f1134d3027d6f28e771d15e154fc89c6c25fe18a5d312807cc2e623bb1bbb4f0b6ec71d009407eb54bb0759f03682f65d0da8812f84d8e97483f6a8d76a8417efcd9526444abba24288647609791578887ef49780b0b89f51b072cae81c5b5014463da3633dda105b82add0f9c2f065dca46eedd2928be2570493c79a996fa78ea6aec0996497fe2dc444432ade4eaa662ee2255f0f4b92d593288a8e3ffe7a15a10e9d33b0203af23f4c9fd2cfcb6160db63b52810869ff1e65423dbe2c4415884b9f8dec3c968e14cd74f323c89053a96111bc9ce59ec483832c49c53a648e5f0f797f53642ac60170c94b473f1f2e7d8a38e46460b81219b52081263027f74cbf63a75af3a7", - }, - { - "68d5ba501e87994ef6bc8042d7c5a99693a835a4796ad044f0e536a0790a7ee1e03832fec0cb4cb688cdf85f92a1f526492acac2949a0684803c24f947a3da27db0c259bd87251603f49bfd1eab4f733dec2f5725cfcf6dc381ad57fbdb0a699bccc34943e86f47dcfb34eba6746ed4508e3b764dfad4117c8169785c63d1e8309531747d90cc4a8bf13622759506c613324c512d10629991dc01fe3fe3d6607907e4f698a1312492674707fc4dde0f701a609d2ac336cc9f38badf1c813f9599148c21b5bd4658249d5010db2e205b3880e863441f2fe357dab2645be1f9e5067616bc335d0457ea6468c5828910cb09f92e5e184e316018e3c464c5ce59cc34608867bd8cbfa7e1286d73a17e3ebb675d097f9b3adfa41ea408d46252a096b3290e70a5be1896d6760a87e439334b863ccb11679ab5763ebe4a9110eb37c4043634b9e44d40cab34b42977475e2faa2ae0c0a38b170776fbb0870a63044aa6679545ac6951579d0581144cdf43f60923b6acaecdb325c864acd2c7b01d6e18b2b3c41c041bb9099cce557b114b84350131e3cee4089648b5691065867e7d38314154355d0e3ef9dc9375eddef922df2a06ad0f0e4357c3ac672932e5a66b16e8bf4b45cd893ea91cb397faadb9d9d7bf86e6ceca3e9176a5baa98b6114a149d3ed8ea176cc4a9380e18d2d9b67045aedeb28b729ba2ece74d759d5ebfb1ebee8ac5f5e79aaf1f98b7f2626e62a81d315a98b3e", - "63b90dd89066ad7b61cc39497899a8f14399eace1810f5fe3b76d2501f5d8f83169c5ba602082164d45aad4df3553e36ef29050739fa067470d8c58f3554124bf06df1f27612564a6c04976059d69648ff9b50389556ad052e729563c6a7", - "7d5c4314a542aff57a454b274a7999dfdc5f878a159c29be27dabdfcf7c06975", - "aeb6159fa88bb1ffd51d036d", - "7597f7f44191e815a409754db7fea688e0105c987fa065e621823ea6dea617aed613092ad566c487cfa1a93f556615d2a575fb30ac34b11e19cd908d74545906f929dc9e59f6f1e1e6eaaabe182748ef87057ef7820ffcf254c40237d3ea9ff004472db783ed54b5a294a46cf90519bf89367b04fc01ce544c5bcdd3197eb1237923ce2c0c99921ca959c53b54176d292e97f6d9696ded6054711721aebda543e3e077c90e6f216cdc275b86d45603521c5aab24f08fd06833b0743c388382f941e19e0283ac7c4ef22383e1b9b08572882769c1382bab9ad127e7f3e09b5330b82d3e0c7d6f0df46edc93265999eef8e7afa0cb1db77df7accf5bff8631a320d146a5c751a637a80f627b0c9a41b44f09212f38c154226de02f4906ef34139bbeacc3f06739c8540e37334392d38ba1cbf4bc7debe77c09b35d2200216db15ed4389f43bfd8ae9bf76fd8243c3d869546e16b8e44a6cd1edbd2c58ef890b5a84cda889131e5cd9402ca4d8271052c6b4fe3f2dff54fb77bcb575c315b9109f90b14bc8e109919808a581c1809e2a188d29fd34ce639088a6683f641925f5b4b3529baa34e080bb47fb7ad9b43d0d67c9e6ae7cacb50527fa74e56d0c8b20149f5d332d686d48ebbe634c2b5d35fc84c69a5bcc93b93dedcf9fdf19a1fb9b75f6df9692d16f6c3490377a06294499e4b8ebeaa0cfd840bfa05fde21c0b5e94d13063b3f5da7b537caefe89069cfa9de9eb8f06e4d30125de64716f821bcc8279c0c7ea2e", - }, - { - "89c1ee38b6697d0190c87a2aa756892ee09fca095df1e31aeedbda5750f604d9b8f2116e5b8f70ec57ea16fe419f2d213ef72b9be90eb5d7e98f2e398632123e2524ac80b31c6c0a07820848223569602d94fc16a3b1ed8c411bc6c74ed80573fcb1f3afce60b9d5e2c21d04f78665241b613abe12274a5343101a91e91f04e5d1f7959f574e743a10913e0817a32c320467f0178e3b6ad14b856234a4661a755eaf14b5fd88ef0e192e1631d14263d6a954ed388f5709dadc6c0f81d229f630d80be6d593d5e3ad03f9ded53c41abe595981d24ef27ffcc930e4d653743960f4e7ce4e251c88f55c16d2afdaed5e3446d00685c276728ba757520acb9b6bb0732a0e9836878d829e5022794d70ad8440a40a132a8c9ec1d3f0ccaf8c285fff425e9788d6150b74753dedb2ae8b36ff2f310249bd911b9181d8310e00810d42ef94cbb5a9d72a1f0507c1a382f892b23994fbe7360778b7efa9c5e03ac3231a57fecff1c5fa10caf1d26e84db0137049622ebcc3a64841a0e49fa390d1d43550c1346c20d578cff39fb7404fcab0982dde55f0849d312581d0c811a19d46f25e7a5e7e50d74d43760583c5cf335dfc11b2ec964f1dbbd0ed83e18f2027817ea2dffcf2b64a352c4fb8f11eeb4f1bfc01079251254d2112d103a1f12a2270cc026cbeb8b6f3e505abd62496253f93274625786b73997e449c1f35c742a593441252fcc845e1cef1b8f287dd311a0477407ce3b31661f7b2802c79c2d20d06e45f03aca4e47a959c6c1d7a9d377e1577fbf82a115921c3d94e3d9c204aa204a9a5b04d8a2be3269700a035371f4aaf1a42d92b9bfbee74492b106975b36d1e581d6ce2484f09e04fa91586c85f35e2a10f0d3c0afcb05327c1bc9d7429bbcc4627af8f76b86fc561844c2ae3810c84901ac09a1670ed3d31a9daa5d296", - "7219bd21a834d917f93a9b45647ec77102578bc2f2a132dfde6489b9095b4f7b740c9c1c4075333ab0ce7f14", - "a7f849b054982cc8a4c8e5e53e181feee79e0233e58882839892134ad582da7c", - "4c46854e9e101090b1436f90", - "ab2e189baf60886bed88eb751bf3560a8bd3cdb6ee621d8c18b5fb3aa418f350048ecf359a7d542daf7090ec8688c3b0fe85914aa49d83be4ae3396f7bdc48051afae6a97fca7b42c0bf612a42d3c79ef6aadceb57f5cfe8d67f89d49add0ea1ffd423da058297239e72a85fa6cd1d82e243a503b1b0e12d7510a9ee98d7921dae2754d7581e52acb8ab9e7f9df3c73410789115cef6ce7c937a5441ad4edf2b7a8c0c6d152d5a5909c4ce839d59594a6163364038c4c71a1507389717f61e2bda1ea66a83ef477762e7834ebcfaa8f2ee61ced1605ba1380108236e1763bf40af5259da07dd3e3d0fb2801868c2e7c839e318678687cbe33384e2ef5750a0a0e2d2e19e869a4277e32a315ed4de79357f6a12a8a25d5b18291316d9bf40dad2d05d1b523ade76650669c700a1c2965f4e51337aa5d45ec7b4981072779401d6d30ed69034053334bccb18425ac68460becf2aeccc75aacd3d6709f07ee10366ed848c8a54904af4ea71fc2117de133f01e1cc031f2a4d0779b997b82682433ee615202d5dfffba6c916f11a00551d56ffde8c36b303263e14adaf45b6eab0bedf344e5214ce52f071d2f40154d788c6870020791a03d2fd4ec5879d9026241954ed45cfddef4937ea3d0d45647f252be31411237983a1be340fc65ebab9a5620abb0e8d475af4e89e842e895eda0cbd283bb5d0bf20236c62d956de733d60ebceb42fc0c9adbf9b69f8d66551b0aca0e260625ad41cad75d752a234af7caf7902c2c5b62f04b6a8e019a6179d44feeb2ad5859ef1c45371e66f1af1fe0de63997266c290e27f0dd62185c53f81e0a50c296a51ace7c90d9cf0dda8b2d7e72a347f64c44262e2a544d1acc7bb05734dc1783bbc1903279092fe7fe434610aa95fc2ce5fc5ee45858f5e8337d8fcb0a468464becb1cef6b7e5ea48ba383ad8a406df9c581f1cac057d8711fcb", - }, - { - "2dcfbb59975f217c445f95634d7c0250afe7d8316a70c47dba99ff94167ab74349729ce1d2bd5d161df27a6a6e7cba1e63924fcd03134abdad4952c3c409060d7ca2ee4e5f4c647c3edee7ad5aa1cbbd341a8a372ed4f4db1e469ee250a4efcc46de1aa52a7e22685d0915b7aae075defbff1529d40a04f250a2d4a046c36c8ca18631cb055334625c4919072a8ee5258efb4e6205525455f428f63aeb62c68de9f758ee4b8c50a7d669ae00f89425868f73e894c53ce9b964dff34f42b9dc2bb03519fbc169a397d25197cae5bc50742f3808f474f2add8d1a0281359043e0a395705fbc0a89293fa2a5ddfe6ae5416e65c0a5b4eb83320585b33b26072bc99c9c1948a6a271d64517a433728974d0ff4586a42109d6268f9961a5908d6f2d198875b02ae7866fff3a9361b41842a35dc9477ec32da542b706f8478457649ddfda5dfab1d45aa10efe12c3065566541ebdc2d1db6814826f0cc9e3642e813408df3ebaa3896bb2777e757dc3dbc1d28994a454fcb8d76bc5914f29cfc05dc89f8c734315def58d4d6b0b0136ccd3c05178155e30fcb9f68df9104dc96e0658fa899c0058818da5ec88a723558ae3a6f2f8f523e5af1a73a82ab16198c7ba8341568399d8013fc499e6e7ef61cb8654b48b88aa2a931dc2cdcf245686eed9c8355d620d5e91c1e878a9c7da655e3f29d9b7c3f44ad1c70890eb5f27ca28efff76420cd4e3cebd5c788536ddd365f7ad1dbb91588d58612e43b0460de9260d5f780a245bc8e1a83166df1f3a3506d742c268ab4fc10c6e04bca40295da0ff5420a199dd2fb36045215138c4a2a539ceccc382c8d349a81e13e848708947c4a9e85d861811e75d323896f6da3b2fa807f22bcfc57477e487602cf8e973bc925b1a19732b00d15d38675313a283bbaa75e6793b5af11fe2514bda3abe96cc19b0e58ddbe55e381ec58c31670fec1184d38bbf2d7cde0fcd29e907e780d30130b98e0c9eec44bcb1d0ed18dfda2a64adb523da3102eafe2bd3051353d8148491a290308ed4ec3fa5da5784b481e861360c3b670e256539f96a4c4c4360d0d40260049035f1cfdacb275e7fa847e0df531b466141ac9a3a16e7865947572e4ab732daec23aac6eed1256d796c4d58bf699f20aa4bbae461a16abbe9c1e9", - "33791b0d653fb72c2d88519b02bde85a7c51f99cfb4456dfa6f84a61e10b4a14846521", - "a0a7b73ca2fc9282a28acc036bd74d7f5cb2a146577a5c29dbc3963fe7ebfd87", - "eaa4d916d261676d632455be", - "c9a631de470fd04dcbf8ea9f4d8ac37c3988878b6381707ac2c91d3720edbb31576ba90731f433a5e13582aca2b3c76ae75ca8881a463ecfa789910d3a776a9ad4800521c6baa120b2f1afd10f32ef8da63f5b69f5e5fd88ee84bf66b0666b15d05c4050f5358a050b9d5cf1503719f56cd48ceba78f29efe2ae8092e37f5134df526831532f86ccb9339637e2c9e9b9036f83cc058fda23e826a188456e7fd3f4ee20f4e4a3221883fe3232b49db607b90a8956133ab95051c9ec33a908ea7e81a1bfa7bd06c09f0143d07bb23a3feeac7f0d7720269c93e2df19d03605828c8713b84d183c9a50954c12fe3b047511ad15ef03a63355520cbd224d06a34de67a671368e6a8f9feeefe48fc273764a8c69c00314e5d693f159cb5270544f3c4e1760b0529e3303ab308e9a6d03835a3a42aef2df5f7643696f707a574d1dcc676aeecdd9947ebe8c13bcf15d30b2d10d2cd95445a307c1d22d39450615ad38f9302c6eb9dc05764b0503d6a7eaff9feb94834853b47bc25660207be3e7c0e27cb3127b5402cb016396e5ff07ddc3df29861dd68a17f53bf660b23352b739d6da72381b8d19a9fc95da7efb79330a2b360dce4309860af429e3fd10cab235c4acc1d80d9e20d67019375bd161ab65648400f308815afe63cfc717f7d0eea150e687caac25b6603287d44dca4a7cc2f67c3bdd54450bd3170340253b03ba054ec003070eddf9c14fb9dc595e228e4968524900cb5d85af6d1e658a42d744e0e7eb6995023823a8dc33528c6715b2e1aa607782c8e1ddddad72026d657bf122ece8685f6e92236e809139325e4a3c069facf94c10b7896995bba01eb22c7b3a87ea2114a7649d7ed3e83d223e5e785c66a75119beab0968d3eaf0cbcc2d7ede95d024041e6db39a880ce3e19efea32fb89a40a2aae22f407e5fd615e51e48dbd50a8b4ec27ce95e2ba1928bf699d0418705482ed0ed7acc858dfbd690403c74667a88dd5221bb79940c6c4a268379c10343aaefb635982c14f33ad83d47ced9682961540bd4f75804d3d48ba8aa67fb2e3a1db83fbcbe57fec9e4ffb1b575e947f8bd8263c680357960e3a39382974774b5a013f2f8514b3c63c21dbfd314fd5d927d82ba616d76629ac018879f54ff84b5808e94af4fcfe1cf8845b65208ca5510b5b593ce6c109611652cd", - }, - { - "c335b055b752e083554b5aa2cbb6556cfcace658d5c11b6b000256fd89e9b24c1e62a2d5b582580acdb2ad9869020465aeeabe83acd9eeacdc44aa652d5cb24bbe542073d6787ea32b2b3c942d40f9db2bb75ed7914c836d902dd2be89840948d82abbaea23952cd648e6191ce5b6cf912cad0a3165410a781e3650b676e5340980eee3b484008acce6a3e9dc5aa96d775677b8bbb8b323c6e9747d6069a169ea904d9f145e29d134cdbb0118647e8fbae638669efb9a55d50ed33568749f5304ece2193b0bfa6fc9a570d209ef61b4c59a2b5485b5aa6ab47d902cf23f7ff71c5210476e0aa727a01809b9f76b6ebcf58a018b3fbbe5f42976111ba58112b1d322f9312da068cdb86277bfcde66cb3607e3ea02a1494439aa56f302671f1f994eb3ab28b937043f5f7f3b3de50673ecea5dee8ba633c45089b852f0d772892525344ede6b521dcad15807b65e7ba348d891d47fc498cf4d50223d2794c64db9fa9b9766edb430be0c38746ab317b38ba9870a6d1fdabb70fcf89790bfe449b97fe01f6c94502aa0889f0a3bb6bdc65f44d1cd64ab88d4a7806b373f5080f9cf60183cf4686694f0059e2bbc5cf21ba0c3e8046e70d815f1444c3094cc29632c429f20aa06b49b0b52c6c7aeb8e34f7bcb53e93c2cfe2d704a5d0416876742c90762730d160e1869d5e0178dc366098ebaf2cae6f1f7563b555a52dcc194a5c8f718d50d27ee76fcce8e8991f4921fae85ea9476e1eab1364403120698b7ce8fd0a49cf79213f360a17cf1950f104494fad80adcc3bb1207bf250d57dcdce6ac8082a312959672361363cc227310b66ee8c04aab7b5cb33a81c0915e9c770a1cfaae2e8f44a0c65703927977a22fe58aef2f366b8be9a50da9376b46ae7562a82391386831febf359039ac326891bc58c0f2c34bdb6858859fc3cb4e392df65cbe2ec4f02c8425bcbdd1ee2562ab7d229d406d79a9c6fe4889c996c2f68d1fb5bbe3a5e867caa4249b934afd3ec71fdb088c54b15252f9dc1b909e121dbdc7d8a16cc00836652dd1f877ce363eed11467966f7ccb8f1a8d48146e69e04ad76a51937ad4f9cda209451eeca90dbdbd65441ce20fabfc8ce400fb4de136154b87a8b65c92740e9bb91d78521b261f806a2c6279c85ef6ac5fe1ea3117ff7c9f9832fc2aa6fab660082eb22344c1a3befe0628b6551f62a5014cd6194c42b8d475a50f2c9fb58c97e43ebb29005ed7fe54f0a4aa10074f1154152a9067d364dd7863fa082976a00db55b26b5ba0ea40eff48b90", - "f5ff810a41d4b34751e9942970d4c9f26b33f24689a4b1e4449b243490afc485af468ff01a42376b2bcb949b9f5e8d0b917f511a", - "a74271c184a82cb074c14b131fd91eb05870cb7c73c9e511ec8140bfe2f34089", - "2403fe689e239c2ed261b381", - "af9be893d5fd23aab42e6a2e59a8e7cb13d4f543db02af87cb0802bc1af7c717cd0093cc8244994cf21189146922b69927ffd5745e57118bea07a6afe7c21d952c13ab636b3c2e461dc9ffb3ae701175360156338be94b1fa7115799831019455cfaf5114010fe45f8fb9c77ec50fe06f2c5a32423edccb3b2210ee1200a78e1a3130c567542377827586ca8cf0c14c19fa1449a2cce9c039bb441b04e9c0a3f9a743b31c828032174fcdb7c894349aa68f5adf97dfe9294d24e6b5fed95eb994397883f58487bf5c57b0aea5268be7cee9efeab370f89805ebe5373ab2e93658fc078955ccf68b554dd5605005751ee8531c35ca5336a5d0ce273370c0dc9307779b86e96d2d1daf2620d67d43e1fb7800ccf250ca3c02eb74047c1d2a2bc7f29fff8320301694b80d0fd975f834337d00d5f0e4215044d52aa4ca21e6a9d7e03f186d7cdd5c48e3765dc926fb0a46bb0f05c50d9f69c9c507527a60366b7dc251aae1d6bb0d9c73735dcfab959f6fd4382fe2a1f6ad07affb0601bb9040f81b55a48f6a6c5f8ac4a2acc2b0c9a6c439198f7926460695fa11e0b0b017e39de5cf0d5d5f84d972b5eee7b5d1e0343b5485cd84b92ad892e5b23f3e803f5b363f2398c11c15be9f13e59922b0d49902dc8483fb142850b4226da2fb84e9b434a34f6bb67f575a9e57fde3354bc3077a876e260311bb2481bb139aa9af55df5074749fe532d7b8a554218a90cc7e7ac69db280bae5d55a174dfc8d325b9909a8da1016d4e162fe5ba70cf8726cdf291f5e47083d9929cd5e32021cbfd982fd0975f6f9baf4322b553cb3174b11c007559879f308419ff9e4e18eee8d3640cec8aea082b90f69cf3c7676c28af0265c24c91cd58a06513198892ce6ce1ab3ee9ac0a2e937b973a9cac06a039a54f8d994c13d42c59187f677352e5feb32a417aebec4d852b2595e7e67450e06dbd183279e3b63022a3813b37257b085bf8454d6890875a2950d20210a8df4f9da746722f62687e92f0e9efc3e5d526d65ccfbcc042fcac7964dbe147932c73924bdcdf62f9eae58d29e8567ffed90048bcf0566b952e986efeae4c477944af18bd243c3eccf8d88c06d07279adad037450cb8547a8aa0a74223f4851747c803cb21a2dd027e7080aed75038cdcecbc4639d87763cdd41829a1b72cedf0d722b180d0d492a5740ea7607b95f3201df352fb1ab28149124d2df5d5ec106867897b537302c3431402348f94d28eebc701ae1b49d10adedea38f1654fbc48885e59e6e6dfd413c6b5a97d8c35dfb07a6cdefe317bf61cf91", - }, - { - "4aba5a776ace38b6e2578f0007e770d264e39c49f588ca3547ad2888365e3a811994f8836330394587c8458eb0b6611499fd5d8e8527c3cdd4ec550b4a8f8c632384e786b420cb3be911c999c72aad60270aefad31b27a069ecf11e95e9d4c81213308d554d3103de4d9d6ab04830c2b8dfbd8bead52c44c21d5357f72810193b5096809dc7846c1521c6c569f78812c735aea21acaf6dce84a24df7234e8ad857f3e1346b27f5bd436113e2da950e4deff96e9ba8db692c7db723a105ae795da15b910c8286cac6e7dda8c172b70f61b07dfd58596684d61da8772356f180f74c1103ce97cd947eab3d401df44f7fa4cc7cfc25e280fc002873237e64a375b0b4797f4b4613c9f150090f44588ee8250ae44aec6546ec8dba0f0c1eb281cf66fa4eb141617b32b28441f6ddcfdf02d9c34cc62893b2b64dc2c26b74433adb3e888c7fea07b19c8cf39269c2716b9c35b7625d4a141397d6d5034b193d2657c6b2d6b0ba874c467adeaf3d501ad985d13be21c4ff6b326cbb671e4f4973bba49116a0399b6491394f850e4122969e4644c00b442b3da0d6a4bf25ee22d182b3f822fd83878ebcc713cb183651a67ca66677ea81b58b685a3a8e385d5fbb0147ddfecb558d881c914324c794db443b31bc15c361912bbbcba9e418f99f2a416d190cb29684df27c7f3ff6ccf339800efbdc4514ee00d1a89f12373804db4fd66c1affd467f251e73147b3248033327b0f7790fd7861a51773dd4f78b89e4e24b94df9203f4a077091bb9411eec78dfe3e1dfbb67ea1cdf17e1d6936bbb75b74055495449e9cb52f5749404610cd444fea3f0568e0d35a5ef0c395ab7bf0208044b5c4e2517911a9c351efd31f33220972287253fbccb1eb8f46960a36b68a7a6b4f5cbdc86d668bbf555fde8881e7faa9594da425ff8fb54526bf7cdc4af64899530561c06bed7fc04c5d48cd4542779e901bc48fab79d4d13850ad8247f51b9afa7d5a656ada25b6376d837cb0fa1b4016dfcfc158a39290f43f133b352ed52fab2f951509bacb41284fbdd849d8185fb7e7200f8ab2a07ef2b3b927e18e568dbeeba2c7a66e08cebdc6a6069ebe6656a586652f3905ae2bb867529af6a827b494c97b3a378408f44aaefbe86c613e11e7a44020a9ee4b62569dfc4c462300daec7b1424ff1c1849ca1332367470475c14877cbe76c820cc651c18ab3f18852b93994f93b568dc7f7b0eb5f07ffc4c9384c851fa9071c6f68ddea1ccf627f889c0471c76aff9f52b07ab1b86a7671a2b2f6b25c0ddebb66ac95737bf7e2f493f7665b5265eaa5166556cecfdd3062802724ec24f3978b903d0f0c24e1f0b8d967142bccfed0d354279223f4c28684e9ab611e9ef89a3f25993b5a8b3c0354931780501651236a78b58e7d7814f251b053605f4c0a8e7193b9cc1ee5cf7378e6f3c8fd44ec57bd91e62b09fb1d6bab60cbfabcc6792e6a32ea7918a9ec9180d05a7e1546d5d2d8bbfde2a71b4e427c0a4d28d0b6473ae", - "921a401db90935c60edda8624a0590d5c46eff3522e35de2872f6f9394e24126fd8143b68a797c995624fba0298b75eef974", - "6a4d35ae03bf277f587da4541dcddf92bbd906dff45d5ff23c0f60ae53b062be", - "231b5780fedfb06d724450b3", - "ba40968282d98849b19d867f8b564ea5a81d657516099362926bca4cb6e9ae02719d10c8061f53008c727a0eeea5e1e36c9e55c117e9434e213316c96840231a1e356b254a9981d4a6ca3c66cfc61018bcaade1a4486506559e6aa3a86bac980d391d835fd5ded98d10f1394d84bf1bbf2cd3397890d704154802f7864ecc753db782fd3d19213ae65ace4770e1bacf32d61c6730aa5adcab4d7e2e437888c11c29abba4890a17a00f67a53b660becd94092df0598df5ac57326f6860593a519e28bd4a39f6481e1a4748881fd5f0456a3cd9f28d1d1e78dc64030cbd8fdb2c5abdab3f13d6ccccd187e71e989f8c486929efcdbf2a763effa95af62db5cef95e9081b818275c69267022fda4b7fdb8c650b491a785b03d4d0186625962b6326ec3f4e176373da4dc1f83a14815adf82c6bffa7c6967d77528d0249754bb4d17656bc4a89449b16152a4a1aea7eb0054a8892f271138971507d2f3b237ba5b620f444544e4a8c2b1ab4f9168762c27478c9f776c47ee2e9ff05bfa35ed127f0cabe7cc053640bb8aa01f8359b74bf89ef43ca94c48fcd201eae39d1835957eeccd6b3a852f4e1bbfef9a469f42c764481ff8408fe5871afeeae7676b58f4202199aad50a596626dff97c8e60d750cc59da9f595ce12ce9afdce14481cb1e39994de8fe4cce07845110d6703dc59d34734e93e9e57e1c52d61f44143a2d290220a4bad5098d098ee65ea4b6757d8a9bf5485aa3d697a7826d4a285186f5da10eff707566c23c6a15033365bcb498c44487c72d96402d1834753fdbf86770239761f03e0dc8963766441da99c0813e4f1df5a1d018c8799861a396562eb24ce305ca15f4022d83ea3c56b68d9a7ceac4742ec0ce50f4d36273df26005ec2b051fa071b319be2d8a5ed26eb75bc1ea83761b8454db234d15d84d6706cd178981c1f156e6d28f774aee3e9a4fade022e71b52b50aa532b8bc7fe464f22d6eb169c69671875d614e987658820c2f584a4fea3008afdcbb646dba3d69020fbf503f121be3480344db23efdda0d255aa058c3ff66abd3a5fe35db977521608bba7eddae72ae801f4fbb12a1de4133039e046ceb8db87e465e5ede1d79a08c857d59076d7ff858942c31e15cbbdae6fc15c3f9545a0825d6ff8583c0aba8a7d143d27b93f6caefb98c0d83bd8715abcab2a49087f55a9daf9090eacdf45be08ad80b5df5070e1719f68c4cc8f8711083f0f7823a09ec092f22df95fe9e95114fdf82a3f6eed0bfc9c0aa65222609442776154a474dbc9e662cd5dce66846572e52417ee5d7eb59287d07ef60a9537fe1f85c7fa74fe84dea0da235ac7574335e6649b54a6bd33397df4bf4a7976c4ab868aa702766d2bc8d2c82c2d1c2653fc8428b8d1e61852ac185a3a0b416dbcf8eb54c44967ff43c44f2b32c6d4a9dbf2c2f3a587b430aef50f0375cdb4c1b319ac9aca486d9bb321141b065f52f7b6decaf1985531ca7bbc3772a561eb1efb8a6297075920bc432131a5b211bf25e35fa31e12833bc77a9de14c7", - }, - { - "6c0056937faf1023032df1e2bfacbbc58bb022eba25ffa020d4eb26f0caf0678af5d0b2f0c1b520f4843f107f0adcc7b5dee66ff4d61025bafb4cabb64d133132e3e423a599549a1d83aa8c8e774444462aa44b00b460bbafad5755ea6a872d4e6b40e3f4957e0229288ea79fc2ebe5fd9020fe4481a9f42ef14a196bd136aa3c779e311d0c333624c1ddc484c9aa7259cb609e4d0a826c0bdc7567adac01da23900b30ac4e66c100348584fe200747eb67e6287268947e3509d5d2b5d7bcd977b80a13f660d4f6956a8b938a82db75eab19e5d2a22cb5f3c9131e278eebbe096b5f49d16c983ac240f3fbe821b247cccb2c9e6e59546122677f49f56a07fed56647a6d3e0e09520d49009f54250c10e7c607cd5b4ddf81b5c4110c6490e9baf56418236211856f5a85feaebafacf92c0c7501c052f9dbae3beb7484f90f334f50b68571cedc67763b5161ebfd5a1709cf18c92112a4cf4d8f43d1895204d8a2ba5e14883a7bff75cc6060cabb77d38a909daca2417befd1bfc05a11c432b47f90c807ca4306400f67a0d92218adaca84a584a8bd4395c93f9b6a4bde9583c79204444634a8473b1244cd33cf980e443d82ecfac672b3f60e2e41ecb3c5a445d9e88c0e90c339a31806e6d79ee52bdc6808c73e8b7b24899966664d3c1a9305f31f0483e24e36fa451dc1d3f2eda05af6678971e2bdfb7c1461c9407c5c466f6b5af34d992a37de3809a22ae75275ddba0f4f9cbd4b18c1acd212192e587889a36bd73c860f0abe08bcd8f00f5ecdb95e1d560b586eccf530df0e5f3776d8dae2a01768bf1226b7ceffa7ce4e75879c82dd97db3c64c06d33cebc6b35854618355d80e46fa79c3e9743fce5b974723c421a077e7ec7dba286881dbc1d53d442a1552700fcb33f83f73c69a0a0ebdcf2f5d461649c4d0712c514ded268a31509f83c1ae4ff4a68e676d29727be641aa4487c08d4b90ff78e24c6508d69759751a1a23690ec9f8763621e8b107295b4bb01bd9fcacd8748e24d996fa70ef6f8b0992f4185bec8e920d7643159f9f604fba394b6611bff435998b2f097a9e948430899c8c752a1e83a061983f00f88ebb32da214399167932a1a83c1b47d09f77593b03cf6521520583ea4483e2d33e14ad60584676d1791779b532c085d238df0d3bae735d0078e0eabd63cc90a2e13d023983780afc8f83b1c14437937c16a1b7c41414c48cf4ae49587ad9fa5b16fc949a749e96032248c4667f58e295f999590dae1d99a2cbe3fa45bcf4a1d3f0356d64d40367f64b2c5cca843e5f7dd7b88a85d52328a00622e6c317879607bc036c9006d38652ffe21c83207c00f8348a7d0aaea5aab4c89077df170de6d41052641726eb6925cd85a9ee01a9e636346340e209ea96d17b0eb0921b96662ce9cb430fb6ac348331dd7133875769bbbba99dc49333950e4145a15ddb0789c4d2ccd38878080ca9e57ddc6cd5452790eec45482f8e990392e319609391fce0beba19463a9a00d8f1de9fbf22f23821de7d69fdfbf3019ed61aff79acfc5a6ba663a1e10da2b9ff7149aea43bd6c61a543008402309df0924de72c1cacd2d6120cf422e61fc1de345cc8771934d8be77d9437a09e06a9b2d51c849fd9a200fa714328d34f36b684f33df6968b827df916a599a4bc3367814fec21198e2213ff653cd2a463892966c72ffd42a26b3bb91", - "0d55dcd08b54e58916f622f81761ef6a2e19b167ac47d3", - "e42e1d6d44138f3d2bf12c951f454686f18d590fd30057405b5a3dc2b317fa97", - "1e46a7486c5a03fd6758d938", - "fd3c1fac10cc82e49235fd57f5aea0ee7a7bd6d539b138d4b3fb623aee591615c1a61228ef9673113a3a90a3687a12d4c6367d5f7bc67d422fdc4106455084d79c2c42c5e86368dd164bcbce7925bfffe7d96c13a2f49aac8e9d1ada3554e3fdc21aab00455a0f33b0c1fdea91b3588e7ad301bfccf9940027332fbdf966463491f7a33c093e0a13831ea9d2183294f89f414cf7b5876af04fa68d594430194429df74fa5915394427259e832bc545c13400aef6cf16620d48280798a6e49773c9316d79fa1dc758e54cde2e2cdb856092d83f4e9b698385cb976fd6cc2538abe055273a5b34a784182ea5e7d3ac9019a05de5e5afe4308a7ed2d363cd50ed6a52df1c616e4a82f607ced768445d13ae4884f2ae1f9fd8313924e8a1a8a23905c92eb231f638dfa6f4cb27bbb9844e05afbbe2ca4d1a3b3a5b371bf33c9ab6f82a7387d61cf8bf662097624145a983839b0cb9f4bd07556800b4054fb3d0bac94f44bcc9b4ac49c39f5571fac4e02ff09f08b3ed5add4bf8bba934e9feb773c0590b45c45fa036382f3fe9782ad19107d4630321e414b7b442b64f18fdd5219039e5740f34b3ce8925d1afe8a39e35ce8db086060bab63b9720700499f82db19a62897c6d845389461260303f9cf2bc7235a898b4620c2191ef05604a5c8c783d58009533a86b27c12b0772635d34ac53993ccf174c9087073e5e69b26c0c3d9f768507ac4d4e2af847b65e3a6e1b7a6dafb0aefc190871cdae6c60f0b1d6137c351d4cb211870791cf4cb8af2ea446f6401eb9ec8a5bcebccce898d1dfb13454df6b35b81ed6d7637e6e261e004080c60944f3a08e8e5fc7e2e4939e7c2607c8cf07d1d10883ba3ad43e2611826f245df571857ae0a7a867df9659f2082c19f94ce400132e48c7f8de2b102c7f83ba5cd1e785597a0ba0d73bb81bba0c00300d4bcd6ec25fb73105a46122873bfa729c0979d8d314ab7ea52391aabab513dbfd1cf01c2990c0a3612f4511c2bcf0f5a07e659a881a7f99c3f1fc4a46e66904427fe26a4a80a904c047d090c861a075c0ae4e29bfbc18b9620aaa42237f4c6fa76ee7491ee638ab5f1cf0b440759828e1ec519679efc776eb1468999a00f667e87199ad6891e98b95fb682e02517b024a6bb803ed23c944010cb7bad0733eccc12d6ab6030c6e88d510ce92e2f98fdcfaa1e37e41fbfb4e99589c0e8efbefd40473db42b3a73b57b22a2f8c9bdaab16831f1b117dd83a77dd01ee8d0c2e92203adb670f4fd65e618823ad196220d70e014c1aafd8863797c61c16382c2600062683ed3a180c70891717c52da15191b02f25d1715ebf33a5e6037092421989c942082f4b836423cc3e976c9bcda185de36f06265dfc250a27d2de0bc48c73b3bff704f3b386f962522f572108458bdb283c6ab3fd33b3ac13a406268fd5d97e17db9c0f780b4b2a8f761d15a4d8b3a0cd73357ecf4d26a6492ee069f19325823ef50bcb2f73326719a57b67eeef506fe8915a1b1ba1a637592268257b91e9c7c5d33cdd947967efc1952005d82ccef9a3ad7ef8ffbb6b658983d64c51242ba53f8f8963245b87a25aa9324c527e53f8c11d55f30aab598401589acd13f090541b3b057b162190f27910718b02a6b8ddbb8ca6cf40bf0d2848f4b76341bd5e78f476862bcdbe2d1bac84c0566fb45b21388221ecd8483d99fe603646b1a9f38a49230cf4dbe5d7883d73eece01bf", - }, - { - "04892b94c65685f2eba438322b29bf8439938590d3e0eb10a29e279d356cb439f6dfcdbc3552af21f7e753221012a649a52bda780bc589ae63b04b981dffd113df9fcf14f17e35e865880a769bb1bf40dc99b9e85e4296c1f2e1590fe02b22bfcaf2d4bb7009a4d692ae4c2d5f0b6d3ca526240368bac55b9b1e6a7b498d3b137f0fcfef1873c5aa2111d7811d45bdc26be1c5d49b8a2f36a999b1f226ec06a5fbd59514485abe696c96ea89dba74b4688101a239b495944e30b3609f73caff3114407599ec5c30a5bad933655de7dddef97018ae15acec46504cd5d417c5052c057ac5f1c6f69781cfdae71db2b4fcac35054a4aa22681027356d68b2bdba721466d130d53ba8f23857631382b2de450232e9ad5551bd7c872ae439e79eabfb057d2bdab8d4ccf02b3003ade2e1f3e514dc92692e4fe5b579c9ee6067995b6c168647ce5a13be8543c23326a3260bb7029d2030ec05e565ced3c5366d20a283a6e95201fd108640d2b96676df712de20e4e12fa53f85f22cb24583844fabcebe40eece11e7221f12c88670bf994ed08e2000236f86258c386b0fccbaab8b68ec6a26fe41491d540193c4c12d1391ab3391de9317f41f505f1f1d09ca9862a6f289a533d2b297d4465c956360371ea3c8ed36e0d1563120654e3a2fd69cd6c9267bfcf92e84cd64e162c84199d6e552b42c33857264b5d7a2e007797cde32934a3f8c68b459cd95bc85e7466ccc9910e8dca65b315c32e43c3a5da908904c42cfc8ab74126919ceeef1054bbdae6ca67b02f1ac5f24808b5eee24577e609a3e3935a24b9ebc1a8dad1fc96abe26012928f2d5782755f3763427dda28867d0b1ad830d3c3f17b9ec278346e5a9480ed23ad44a523a4dd86e65a610ee0de1afab64ace7a3b4918fdc14c6b1ce0ec0903994da9bcf18643d7e0a4e6c08200bb394a89b385d2cb829417eeb0f7dab9fa7306a330f82973cf0917b5ca99b585d2ff0e8584e050077467f5245ecfdd5942e4fc72dc26e5ab2ffc61f996167e68168cee9a6d3ea1e1a696060465e35da8c75a1aa380004faffcb0a992c627fbdcb4e97721271802cdaf08d214ec2fbcb389d75709d7a6b9d35662661c8961f93d4a705e7188613f3769114c55400809cadf60d3b6068c8a5ceef078785171b59be1140c6a754ba1de5ced349df63d67d59d3a8ca3c716ffb506772d57e9e3f2caf7fe346c4ad64aa6c37e43b9bbaa8f58e51bfbac31fa6137728f8e5b728025697e5ad5c8301f6ff39eb2ad595d3cb24257adee88a84fbf1ade4d7550cd9ab94bf48e1424ae83184c35c5a5920157d45805c2e0ad129fc7f0ec3c41b9d6fa04cb8918ef379b0783d1cc2863cd80382585fa05320ca4f9fd90353e490b384ed6c166c6f802cd7bd39aa43667246e8da96992db7537d472c709b01114e95febaac5b1a3c77e1e9a18c2d180e63f0d8fa89f6a1ed63e909e4741af5c2a0e47d4d3f8779b7696358f58060f3f461cceeebb390c92779d30bfdedf1b08ed62dcc05a545bd0ea915f42976e81dd8a50cc4689d8d8007508bf53e7da5bd43c3894968cf0677681c6b818353af6bf8ac205139add1310e5d363ccadbfa0eaf735808325e7f9a6aeb1bee3ebb4a27576a88811859c216b6f84371c43d8063a0d87bd326eb6d81c6896ff534ba2c9c14a51d2cfedf33a5c787279bb4a7ff65706b389756a6191d2f791254233ee047d40d64c2dca878a42f903fd4382f39a89a723fe11848fe37b2008be53f7c2d037981d6462a4eea49df1a2e074957afd3c9dfb4d218a309cab395afe301ccf", - "67b5eccb1790babc2dab5e0d1ff3871c3024177d45a2ae", - "259603e1c3af3fd0ce3257eb627b02e0c0a48ea2f175de3d8c36570a445e5369", - "e14de73c4b17581a7e0d0649", - "33522e67ef932da5fa8abe628b51f3abd5049951dbc982ea95b7769652d4830c588fa45e3fcff094c8602b9008d7b2f9bf6c1c4a8cfb515401c7c44a7ec42ccb967722a710199e121a41160b1ec581507e9bd2e2e506b10c4b5a8d6977435aa08e27504957cd49e756e1574c4ccbbdde937de35128b7ee3455d2e665c596c2e97c253c94e405f85eb5de84874c099b4a97eb8f492d28f2e4bc64b228dd5984e76ca08376d7f1355ba8e0fa60fca96635075417d8b436278e0fb91e3bfc7d61ca8c7407086933c061b2d318f46f352099e1d317d6c44098539d1d2c1b7894db668e7a82ff991864fae236570cc420a4229883f1e2242d05aa07e175bc6abe11cc643cf1786a4456a2de8c066fb1a70fe387f149ffbe8cca7b110e256fd0c09b1d3bd7381cfa82fa700c8db1e79809ccf75ea52d0b349264557046e8703a191ddaace00ccfc513db5e78810eaac0a99d7bb1a5725e722d4e595216a0e12f3a7aab2e623ea9e1dad06169914bcd51b643016fea7dc3f2743b1e65877f1fd5581bee5ef206d86494a587ec8462a170746fcedb2c9f99090674ee687382711b4610ddac599732453dc063518aa36f5b4129098fb9fddc02eb8f8cfc2fdf0d904ef4d6d06014f977b29d0e9aab4044ce9c662a18b1a8db1ceea97854e90704430fe9b1046b221b27ac79054fcc68c3abd6fab7da66e255ff0cbd0506c852e961e619615c944cd9a05c25abb63742f5da7bd9939feb0f2f2208c8ce82f551a9d4d70e935dad018e3e4e6998e39670221601c3e34716ba75eb4e2fdf53c4d471c444330514986de45cf44d77f793c17e36a271fc65e6bf08943aef4c66547dc310c7a430e3fe7a54898de48f69f282f52bbdc4daabdb325cec7ab66fce1aea4e2fd932dc1a316c821f5220ea437447feae2fa478adade7cd515a27d8c132d0299b3ca1bc8516c9d9e7c65c38c238c69f03e104eb42a29cacc8d79b808ea6fb233a5056201e3697f81a2d49ccd8b8efd1ab0fd407c16a210767d1d3ca798ee53a4bbf1ce5090d321b1a64fc2c5f013c23829f5b0d2737936ca71595a1d02711c8a7b0e74654e5d76376ae26977dd49c68e3c0a7b36e047d44be42d732c31f681bd7b1b4b339f004ecd847960377acd005debfab13d0fb88355025877630aff753a7cfddf6851e8bcc8ec37b8f9149830f47e6b601098b2ba19a4c0808e31e8927b2525cb82bfddc9b4bcba2b46bbe768ee278fb89010243d16f9679f5ba4f13cfe76b5beb16c7b28daf99b0873098115c2233ee3402ac0f6c899a2cfcc83b2ccc06676999ad48017c4ace507080a26501993327ebdcbd1e2eaaaa99f4998b716cd9e36eb26b4573a03fd1d18047198fdf675ef4f979864ac85d230a011c69d8b6c45e9efbdc2a03f195c9731b4cefa60208ba845c0978e73d082bf6d6a513b93dc805a4f5973f4158f60a200167ca88704a15ac5ab1f38ed455a426f7c6a96b6bfea2ebc1ae1247cfe5ff29ee81bdbcb53b03b89568bae9a6f311d2b20e31c2d91bd18fd93a37be266d0de8015d52e325f78356dea0b77cc76f28e0f06e4ec705d1328340013a77b0b6196f44b7712fff4ae0ac7f6afab9456a95012b7c6d387285487476d189977e28f6c9d1a3f736320d61302c2d627d5a7ac8cde4988056b55eeba27efe7e640f94c115762ad5849423ae138c76f15b47bd2a2bde2c492489b7980aaf1c4e32a155f858d7be4fcd0f8a18e7b5d97c5a08d7885d6d56222ef49542c7f80498a14a8eed1c092543aac3439966d5b5d0cb9e602f4fd795c09d652b64f9ab67e38f48c88d18e30a9774f37e9c77b7a94cc7310d", - }, - { - "4ab8068988d4bbe0bf1e5bc2fe1c668cbe58019c958dd2ec97164aea7f3f41c9f747527f1c0e5fdb2cbb9d2ad704b6955cb731f14403dddb1a28c5996707635e4eb5dd6ac33d46eff8e319cfe7cf6443869534ca9812a5b23a6b4ca172afffc064dc2b28197117115431e03c00447f87d9b45172c6f724006270a1d41fa094847cbfac9630c3a785f488c1f5cc407ca6f4cd18bac43cba26ad5bfaccfb8f50784efc0e7fc0b504b43dc5a90a0525b0faf3c8b4b7046fdeb1cad87ec667ce3eb6cb4c358b01393f3ffee949030ef9fd01c1b2b9c5219777eb6ff5b1d7c3ef8d8e3bc2193dfb597cf942c5fc50befa527fac0b44cda2bbb811b06ae87459750295371cd232754e2bb7132807d1225950ce64949b0650531800bd0074177677acad937ee008cc0bbfdf33c6b0552000238494be8be412a3e5cfa359e619d092c76310a76bdcb22abbe6f16b3b116b5f95001d20e42fc3c9ff6723e580f378475788eec265a1ed2087de8cc2eff72184f73fa5dc6e68a56dcfc85350bccb97135386d5b827c2d9aea065708f5c921454d1b9303f21d5adf19e00415acbd86d1e5e42d78505b033a515a435713649c50702f54623cbf31469f355c3be2e30dd8c72b4127764451d79e952ea1f9bb0269da56dc07060d5d9542a9c1258ccefe53fa3f7b6073cd38026256b45c01b6c5dc0d91e3139f30a8d1da7a076738f5bb23352693a8e3cbbb46226fa22416680013f9e3278913d06aee4a62457357f0a68d173a360af5e1411840e34c574b4c6b352f92ce33632911ad8b6710d357b7607ee19679e777baffb8ae3c0fe9786b2e97fdeccb5105ecfe81441f549bc6b50ab84b749fb33f8f6bddcb6bb733d6d5dbc4b29725b8741439b8239e53fa435ea29ed3324202b1bdd07d1987b0e06d8cb51013dad897ef02401290940ce3f2af72c5d1b4c8836299008c10b16c7e3e119e41ec66d9db6929ee09bdeaeda08a50665c052edf77b7dff3d8815046bf71d5015e3bdb29a4f507aeb2e28c536cdcc9b8d1e89849a0683d78f99dbfa90f94aa5dc08587657a8f042d718080de5d4a973f232f78c387b63c7143fc2a4380c491414a18b6c4a7bae2194b62e798ad7ec7d09e409425f6d0973accb17e4d860f8ec0283584cff076d93bd9b0c4873f9c57cddcebe3c3bc8afe793c6cb6b26c4582847b07446b7e1d9757de6bdf0df826cbc502bf88cf3a773866d3ff293034abc4afa3091b2126a278f50e47f2f66ebebb616e342098ab690f7f5828bf8cc4742c677d378893e9f188e8397bee983a9a0998de2a31798330f8db59a8581e1c847589bc0e2d95ffa68e39226cc15cf6cae5c4f5174e7848375391dfabafec202565ec2383721339f04c5c5d1da953d88f18cda65745ee8e99805e35203a6545a0416923b38c5db3c8aa00d64354bed27d7c78c4b257534bd7a18107ebe64d8c27b6afdb330d8efba79fd1fae480cd51fd3626bf8d79fb651b7c6cf752aa737a5123558420d48fc86451b358d270aacfa6c17f343b7a9956e6f64e4990c1b3f1e5097605edf5ce4247819b19f245e9a90758dd42c36699ba5cd7f3ed99a7df7eb155749f4b42d192c47cacb6b2865fb9ef2cfca283865cd06e40cdf7f89d76a9e2eb393e2e0ac0e2776da929f3f8e3d325d075a966d289c51347bd0bd523a5c81edef63ce9b72f5114c88b08b16edbd73f518096240a5b37421843173be8df4ac7c587a17ca6f2916f7d9a10dc75f81bc778a1eb730d12b51555cc414eab9c066113a7edba9a7f1a18092ae47f12f0368ba211feaf34a3b48a7ff5c91b81cf7c95675a4001c95a19d284fe4197fe8823909a123fcec5e45935da12416be1bdf14918414ad19b54a41052f5b8417ddbd207ee01d6a3e62fd9b0321b1c13d91d6ce15ea7b2ea0c670a5f5cb290ca8e62c26c6499104ab8e9fafb05170ede246bbf7313625d1fc9576f1609ffd08852a2f4b73c04f1f4eeecefe3f3eeb2185a618b6dd3e87d9d3fdcb349cc83c21f26b6c662bbb857aa95378e991640a160a23cce76153c134508c68ec54a5", - "0d471079ad3c3432b6de852ec71692d12d9df4f984554d458a9dd1f28a2697976da8111ae4454c9a23d1c8eae75bbc14f8b00e7c065bc290f8938282b91a1a26c22b40a6708c40945d087e45633a595beb67d8f1c29a81", - "f3dac58738ce057d3140d68d2b3e651c00ff9dbb2ca0f913be50219dd36f23c6", - "bb2d033de71d570ddf824e85", - "238c4e6be84bfb151557327095c88f6dc2889bce2d6f0329e0c42a5cd7554ab16c8b5a4db26eab30f519c24766b1085e11d40823053ca77adfe2af387b4dcde12bc38502229510606ff086265f45b1087375dc4a022eb0b641101c74ad566ab6f230133b7aa61861aa8202b67beddc30dda506691a42032357010d45adc7ee633b536a2fefb3b2143837bb46db04f66a6e2bc628d6041b3d306ff78e96205ab66847036efa1fb6e6a387cf8d5a105738be7163df9da0db48e3d8fd6a786f0f887968e180ad6888e110fb3d7919c42a7f8c92491d795c813f30ea645fafcddf877f5035f133f864fd0ba1415b3d698f2349ebe03d9e76610355e7fc23221c5c72b1b2628a40b14badf93288fc4abeaff5306d274f21938650ab236a39496d3f8a6e9086eac058e365d4335b51eafac813f9175bb7bebb75605909ec3fde6515694e119f7b6e96aa1d6d6454c3a7dddeacc83bf0c1f5f6c2a9dd2f460f3e5b074a33b8d7904e6988ae43a22a87f0933f812e45c4c518bf83e606bad4c3c55422ab2207e9d3cfcbc5819049f55e35b9663273d9d3a6f8a897fa38b0dca77eb6c344290cc007b68d913187f2cd480a40262623a4e95d90d5701ac2b9d858d70a27f0672f919c2ded1fb89134ac9a8ba6ac62931c832372abb70e811dc50cce264ece65e87338231f18ac007c5f68f3b1c5904ffbb2e1dc361d53914917770d66afe28c547d8cd5896d892cbdadc34cd6af348c93bdb8b072f38b085361e62ded7a38b4368824c759ec7d2cf4caddb9191e5deedc8b8388bc4ba2c0672321bcda3a7343c9ea71ef03750912f35624d81da5fa8a6ee676c4efd99d0c7258b844ded7b35d8c8233a316b508d79c7c0b3edabad5db9543615179b1c111bfd78b79327ac5b4155336d670baa592d441c810cb1b7c07f3d35473a45b57e780b7d997782aeecfc0363976fb608d6967844ed00b63ba75996054d090aeb605c195b1ff86f9d9ab5892d27632cbb59c06b3ccd69d33ed5dea9398f00b7c6404fcfe2fcb5924e4cb75cbcae0a1b084ea8b15eaa5847431e9ab70e4afe15b4c82239f6165e243e3b76d6c91d23b16edecad8bcb16898641f8e323671452034a8ec9b42b29cec0db210bad0444f1c5bf3505cc41d514d5a270d556f0a34333bd06cd6509ba253a6ba7a6db8f1a60c99f0c3d566a038a72f1271a178cc3ff890b0df1e7438c0c1a12d9873643e2d7bfeb92379545de50834abe2a345faf7ca49beeab87ee516dd8598b71196b8cdb15e7200cb5bd814338babd74c565faaf33d9a8ed4209b417345a1ae611880ea22ab2e894d5d14a28fe3835d3b2718125f0e6daabd85327455646290ceab89e579ed5e1d72a0172e4a6d8da70290b5022c941f3866f96cc4218de5d2622d13af6dab15760a1ec5d10918267f9585284058aba611ba07b1d5711cef505869831699bedc2b190fe1d578814065c91d87a8c8dc9b0d4dae0c80cd241f0bda3a6d5e714c894b7a48b1e5eed4555f103eb03c9db30efcb855df422d7451a6d70f28174c7ebff536dd2cd2891f6c3f264d632ca924c4e0d84b37cf8e06e6f2e29efac6cf008cc27f062441278dbc9f09cf44987e0e9ca088a48437b0b89efb9cf00d3d0c5fb449fd4b64e21dc48cf300c2d80a502cb583219f1881e78e647783d91dd2f3b389a1594eefd8ea07d4786f983d13e33cf7a34e4c9a0ec4b791f1666a4eef4e63bde7a241f49b5cf615888bd8130743bc8a6d502bfc73ab64d1184ead9a611832b7e24483a1a0fc475d9ff6166b86a18a3dc96910ff182cf326456c4461ce8acb3467f801890eaf1ce0b24791da9c650876e718c0bf43c475174f9712dd4a228695e8f8b2b23fc4a06358b4a6a8e1afa87a0280c3e098f218f7a6d6bd716f8c105a7eb799ba0220837fa5a96c8a22a826a6f7ea9d7216a24acbc7b0133210cc17c8190507badb421bc54997ff9340cdc1ee415126ac46a4fec9fee12d40f06300f7e397b228250f36d6f0d2ddad5fe1898ea690e4c7cc3a116a70bfaf6d2dc996753fffae40ba5280b8356b7ab4ffbc914ec74eaa070581fdd1d9e5aa2", - }, - { - "4d81b652fee892d575bd13dad913d976cf0517c819d5183a72eba995b1f27efe743451721ce34791a15a6b7a6e44f13d4a080563dd1d9d4f0946e5ba3863b9ac970a1fb4ed66458ec1b1092ff5fa6c3f0271a2df8e3f2e97851352be760b6a0e1589c202f00791b1b89ae0ae944ced96bd90754bcfa3e355b735132d407d3b5507fd57f705e8a8bd82886b16d459ac91e921dcb8c5bf0d7cf420a9349ee589a5e2e19ce7c944a54ccc1062a0690f3152300d0bf5cd1871c1391bf6d7007f7ce26018ca2a5c6f76287fd8c8e9e7f93b1806460dd35f7f95989a8b6f9a0aeb7c6b0346955fb50b8735e34f1ecb4859e34ea0f022ff6fb797094206a34cf120b7f4664c531c57da513b296f0671c8e9bf68d9e1674998fe52da04f627f516dee97c2b3c988216e9bd3f58c3b021ac70898651f1cfeaef21c4f417ebe92dcad3aaf50f4277262c356584f816a5a5862f2bd720fac10f1b86033371ed603bc00a30cf4da8f579dd5bfdd571a37af7d2a5cef29f9001bb1605ee87f24ec3b259f381a69b771f78d21c4e43bfc83a916e08830d9885c8ae8ab6367c05f92e5eecaf0488262300f83f4e3bff177590857e149216995bc52311fb9f16f4cd74e07c7868a39b699bdbb7d7dace4c6a53ca7ee6e11741a63a52a1d96995a6dd752356dec6f14761ccfe38a6cd8511204f8f0630a747d6e19a77bb030c61e0828436604a28a7acf4a5e49b7269ac93b93b99e9e2e1c0c47b377f7e44e05ec6659526afbdcd5bb172404ce5a9f8786234114c16f20cda6d4359eb873a4a4d9fdf734e9c40aa4db3ea9a98939210f6c62142dd144eb78191116d194bb766ea96da38321ae27fcdcc196560ac75567297984fabe6072c771899906350f74de6d18518eb6898b934b11e945d94ead02b821fd6682602e03e9c70a1ec67eed33874eb24dc83dd1035fba5928f8f62ba1282907aa8935ae72fcb881b3277ee6bebda8fc75d6cd792677c25f70c87b11e094298b2d5f39904be211ff0980e5b83e8ea4a455622d8be9efdb5aa8466c88ea861407d54d98112faa10293af5e16974861dc9f83b45d21b112cc367894c421f5049e49dd205bd7c15e6a70bc810704e2e3a3659800864912527f8be743acdc474a26246a81fc2bdf669b9be7a2a0c986432e1e44b5675607e7e1ee2a8dcb72d8f1964272926e52f909ede0ac8daa32d1d850158db76b959e4d83c9da4e3bb23fd1f5b26463045d6cf13d187fe74a50c09a654d52d0e2f01d66b9f8b4f4aaf4c69fa62a02aa876f9bc4871aacd26a6c6ccfb9bea09cafbd0268b5b65d60aa23ff504d02fad4719698f8b044ca1bb037ea6af58a06a448080dfdbe6a5d698d5db9da5fb4aed04a46c8fa8b93153bca00a5bf8aab64d2b371d072db2ddb688a9442e948f0b99236828dc115a2fddfa2a29e2d4e02ff0173cf734efd4eb687e3f8712be82abe1fac4be0c1eddda090803fbdce41bccfb58c43038991ba1074b281a09bac5eba58a99a1a9678ba26f8f9e3c63ba095f02cd8f3b56aadc5de60477efbf3dcb54b854f651cc72042bf19268554c61b44f2f338a75de56c3c45b3ba40a697f5f21c4557380c777bcc91a151e5676c2a59606200bd476cf98d20b4cdc64bc3b8670810a014871be018bc32fe239e287cfe8a7cbcd1e8b55e08692ccfb4ef871cf797bc0b1fd7ec37931e35b6bc5d32bbe7ae77b9962c179f96436e4a32f566298d2235acf921e38c3f1942fb7674b65e222d17b95a2e58f072c63aa4bba1ce48c303f4bd24d84963f18c5e670015c52342dcdc9c0b348c7dfac721b568effe2bf2f2e816ca3279bbbed823beede8e12fc5bdccd0f1584deb1f6ea1875e9fb350919b675ccde0178bb83a4aa5232bd5e8e9a1b8daf905c6197367a0d106532297ef89f3bc690b48224592c768bd9c50a63d0881370d475081aef052b444744b33fd3fef674a37898fc950f887ed482d2a51ae615ef5b1dfa3a23257e6a6a319a4e2080b2c4094bb09e4b390d1fcbefc4d6c5dab620f8b05b1bd5d976300b007e2b8120ef8a6c9028b7d925c795058c6bdb6711fc5fc2476b9810d1d81bd24637537716edd3b7068b802c531531df710d3682f9865530e1ed51b3b56d860ba4e972bbc74662cdd1e2ea24f81bf469193afc02b14143a32e9556e3f2ecef97c65", - "2538d98b64b6aa9258f9141840a5abef66d6037a10356366a3a294719c10d6c148b04cac66f63ebff052d730f8821f5e5822d869573bcffbdd636c7973433abbf38767597da5186df8ef9df071bc4ecade2633366102313e659db8d8e0f293d379fa2df79f456497", - "a5049b0aa153e282457555bf6f82b60fc81aa6fd1c2ea3db031478ffb74b5b5d", - "350287a6bed5709dfba3d35c", - "849670914f5fe318eb01e8849e536374ec11e813acdbbe6a5e82a506f6aef4f916a3a7fb2e41db3adf990175e21f2386d1805af9bbc32a6ac156b13b1a9505958f68599019c4b7297314229c467114754277b10e9f49a4d12837ef24184629c8902ebe2a23f740dc826b01f8963d47100bf617b314835e436104eb207fa9a1079b8feba06d9369b9aa8222d38d87096b73678bc5db9a1add59394530e678b6ec93a80efc6e8320f2909e3e891306d69b016ade0d30cde64c2c903b401f9d01a29b5cb8619dc68ad6c21900b365a6b657f7d9ca4c145fe598a94eeea741e20a9329996b17aba5d7115c93623f2f5d6927068d0f190b49eb885429d771bbbb3980e9293e4d664a71c3cb629d869dc97e58fc3d328331b11df19a38d61e1705ec4c3d779168abe049e9d675337ff658e00d2d610c8f227d1341d1c41f1c01d8b5d83c4b1b30ae4318da9822f46402ee8cd5cfe9f3f22d90a5ec2d0aaa0baa85e10f5295cc6005c5a0887287b0c867a23da1a4c2196f91fe0bd4f0db1ab324c26fe6088d7583f3cd052b7f6fca38e8b21f98fd07fe78b7657da1f586f1fbd3d2b4079e20f21dccc0d269d53a29deb7c7fb63cc291d1d2c50ff163e08ce612310d3bd622f2416e193078ce4e1463f8a3490578af96ca98e665468281f1af9117a2ed23367df19b570885de9d6594f09aaba4090bdd1079720b08d54311793c97bbe14433b031c865b059cb4f75db74779b82c4f83eb4bd829c62eab995027b548063d7cab7d1a6f9642da6cf7181c0ac71594b97fc2c84b1768f81eb287091f63c76623c61e7ba90c922c74d46b9ae5d8094d9752bc1e8020a82601c356a201e0473d540053c707a88f4baad37826152dd245c4cee6b0019583c61e4327fdf6bdcae53584cdba8a503b835bfb5df9d649705fcc1f09376eec96c3da1e105accc1cbc21d90f527041a9beb85f8cbb1ee8db798838bb45374b741618f83b5d0801a3af2f640abdbe74ec3dc15d6711b4c1480aa8d6084defba82ed221ba359c9744705c4feee0955c27ef468cbb816694516f73fb541e0ad4ccf99ec8b67ef090505d1f7c4c3a8ed7e291c820261f12d92bbc6609da6c275349819848c9112826674f243acb9a29ab73f17c8f8af12c7437c11972c824f00db7ad284e51b9b508a925f0664bb259b4443d56463bffc9e5d845c9b9f79b24c1f457088fadd281f48238866e0b92d6253638eb188bbaa8bf6a81d2b1087904974752697cffb00b4ba05e5b7b842a3d2c0a743e4bd691625788fbe9df14600643b1d161bb2916176b6ee40aee38dbb594ec2735d41369ed3a0c6dd9073f1eb51d1b77eb9a967b53670a8ed755f3b2b73a6cb50a9e1ea7549346646dbe4b801c8aa642779d8761b6c2d2e1a9995e758ab92f07c4eb4a23c042171a4b354f434ced5f6d9ccd26cd6c2506e5023dc076ced15566fdabc7364f4a8594cd6ec404e1a9470f52a83052390e4f7789ade9179b069d9f84ca2c7ac9eea51035db817845aded7405bee90cbe92364c8c7cf8a366cbebd7a972438f2a9881395a8610a2cd0c06c46b60cdae5b1f473f4fd6ec48479cf35101656f05485198a470cd36af22838e7ba3e28863cd8ba7bbba7e3c2625c1106a6be44c9e3d9b9938679b26f0713c62c3757a2dc8b2d9eed5e652220a7711cd220bc91a9afd7c940dd8be71616ebb8b2cb0686dfa161c6ef56994a3cafaec5e79bd0a2531fd1c1a42771acb101a38988bcba51ad85bffcd8c67aebec5b37d526b29f7b9d31388e1e7ad7154f8e65516f0d80a30b88c2b868be2541d19ea1d2bcbadd30e2fbb1b4678bfef7f200e0f8309ac0701000c52ebbcd6fa00cb85c8d3ea9c5aceeb3adcf3773cfb3bfc9ac764d031d7c63ab888e9b03eb9fa74554dab4719d426d0875a508c8c86b22cabfeeb70b0f1461db4e5f639d2a2d28a089dbcc48e3f34394ff1acb887b89f75d3236c8143bb9b06273c3878744340ea1858a9f383f8bbdc259250e23a3c3992bf8b7ca7e1a66913547710402bb538a8866772d11cf4214060ed091d403e1c9ca3af75859259f88656a1cfecfdb49d57c193e60a2223627c681a2fbc7390140aeddc19df035a5207adde4f5736bc542bfdc943ae8b094f4a8701618688fadc2284fb423f602c41ad8ee11e5d9fdfa67fb7dc7d4dce7847d4875b3af667168ebb6082f6911c95", - }, - { - "67f0494a728fbfc84e2f4a043e121ee40f3b12b31616c78e157ed970db28674318b08d8b3f4c538d7b9d91b9b0b09ebfebb07201c6398fdbb8684c9390b3d6a8636333a3b086302b24c2e5d47283935d33065efa3fedd5f755218be5d4618d38c5c1db75470ba06bcd853f3f08d39c3cd9fa3618e70b103c2d9b2101fcaf39c1701436b720d723ed5c622d6535c9a10ec4d727abe237e80fd20911ceb84a90285fc6e07f9d036cfa65995f9b6300a927d7d0d2b907bac9d9c4daa87c2438a583fe85029c886f96ed08f5886bf53292cc0265850a1f4ee3e3288b604dc305d0c28ad35e1242f4ff4ae988b6deba48aabcad2fc6cd7eaab0a63510f3f915c4bb9f9719b1d90db123f639d9d4f3227eafcfad769c2b204dd2555dc54e738909122022c4f92f751d25aef6f9a1187750e825c68450e6d1223c2fe88aa27194b492b6788be6eda80b9b9f053cb77c8d9fa15324f23af5147624fc00c66e947b004bf38b31e1343c7cd341b98abe462a5f994e51d343664968624a2ed0dea9d0299d5c5a7e9097fa63d8b3ed96f917f693654766a9adb01110fa3fe0d8e9b102860d5c049df3fe00ccb2ed62ab05583e6aa0a5134d55245d4f643e274def29d3fc86d79979d599458786a8338b0071f6a01609ee6b2e4bba9289e2df780bb27491890d0b5ea650e62df819b8f98aae99a1b8870ce6d3c7785ca957d5b4094946925751f0fda1d62a9aefe3937a912c1b49b4272f87eea7e397feb84c0702929959e38a568460811e5064b1caf5dee53f920c6e19fb16fc9214b5de1cb770b510533f66d8a0e7f6f04ba8ba41869f8018abee31a6042d3919e217359988eaa9db2a10b3caf7aaba43527484d81304f0bef22165f74e9e1031b545ca3d2f74195984cc237b76ddbec85142a06446902339b1883000264031db85fb19b46f320ef3fe316f750f2d3d6070dec5b66ee8ef20701f20965f5171e44c8a99bcbca7afbbd81e30e74c6d48bc4b0d72baf562da6581fafbe14b6cc597f75e53b305036ede219ec56d0c0d29571a9c110ffeeb747fe56f6030dc26c8d3841b868a1ef56840932dad9f3bd7f75573086571f4d9f0d949510a2577d2f8fbed7e850c73ed4c071bf9a656d09dab43a610b49aeaa57333f67d586d4f50683dceee4942db9549f68eef4c5f8df8a2330857cdf2fc4025f2be7d5f0dcdc74a9cb593de91282787b716d416a3ccb8d6d40fa3c70be4ecfda26a5caf3724fad3d98db16ab6d8f26defc68392923b69664b0c2d56f01a549284b042bbd43c8faec940187f190aec08d06f9a62ab03c9f610f64c0010a0939451d5502511dfd3da1fec5a38f64640c7b6db2961def257eee9a3eff944828e9557deba68bd8e42dc7a9c1570e35537993061fa0f5351fd3cf4ec36386ec4cdc5a2882d5f16703b900c5000efa63888d69982e5ecd3e329c8cf5f003e23ce03c55631246ca15ffcadb0fc9d5634252ccda812ba7bf5e343c44244026512062a68374ed4d8add0855dcc22b30148e0cef0f2886be76bafabadf3ae1205b43c6deb8a41c338114895dd6b49deb329ada31b350e02a1bdad4eb05b61b50f9d22fa2863bd607406f552713e302467ddc78213d584b4933202438d63f99d011b97297f5589f35b7e45ccbd76f02453b7a7668c2b1a1f5d1d63eb805c8881771faaf67433eacfb22f9b6fa58b93f9423a5fcf667aeec39751ae17ad36992556431bca77059a29353598dac12bd3036633d2ccadc18f44123e5bc074f4e5ca380095af062fd83b647015259be929011cfbcdc9bc5d0dcf9b688f0f5d74da95746f447a9e1cb5028ccb2827b45129d04cf6990953a6d8ee0e67fe6bdbd8004f4744cae5607fe7ec4a0f14fe603dcead3367b6870d8e751cf57387d04b881f92cce9772d695f19b36e2db2cf6a807c9ee83225f5c09a11b50e99855921a4eced8e631af7c234aa31615c00ccdd7c6ac5ae8fba6e29cc233765a891864c7d73dae08ed1a3c27cd423d8d4efb550597afee8356c12018f496637daec83575f5e38ed2fdbafabafd38483c239d31cb4d104e93d16eacc6050033a3c86929be4ca8914a538bf540b43d7ce7daaea317bee1ab80504846554879f900d312bf2fbb406a0edc5f4f809cbc68675b0b7f09fd1a8a4d52c0929b3a8b9c1dae4b3d599b976867e6a7e8736450dabf5c49c949544386a71419324ea4ce5c4319899ca510f50d07ace57b013655b0929f79dbf3cd629ad17bdd10109b7c53a4f5f04a16e5471e823c898362df43f57ebdd1627b33fd4cafca6cc065d9140acf0454d5f99be47bc87e0f3b4d4320bbf0f21e7c261bb8d5d615963beeaa46bdbe9b83a8277813ffe6132b23564bef5", - "74dfdc364097c39ef91c01b707a522e28edb1c11529d5050ff820234e6c0295aa00591e09d547e9671804d7825705ab44b76c59d1315ed1297ef477db070d85076693013bdafa92e2ff6a654660008b176cd4e8ae23b9c792be3f7db54cf2bca385bddf50a8624397cca8ee3cb96944164e3cb461e68", - "b3b5ccd7ef49a27d2c6d13c0ae77a37abec2e27e0b2d3530cdbb7f36792a7d2c", - "c0494bb7249f864f69beab46", - "ed8d6e964bcde1df68e7f362243073941fd68ac77929c8e480c89f519f748b3dc337b1af6231632c975167a8425b174b42c2c60dfc0ec85a0a212bf5c9aada818a83f9664c8712d96de1036b5e5d8c8298786b753638de3a8da958549f16eb9c723355cdf7b999aac464ec39df7d6c1607e81b88b63043d1c847dab618f1b19336911b4b0145c2a694e61db71e021282006d48e37f10f3b6314dd012a07618228532c28ca84a936e0eff83723d117b2f2db857d14af5bbd5948a0e53018b31e57cc2a81f36aa013a844990753ccb347fe98fab294cbd252a8b8f7246276275d2780511fd3cb7baa2fd1548184f968c422230f7ad73ae9dde91295f79f6b799e7d234dfd6573fee6d6ae748b0a8cd7ed4862ebd957390826f276c2afb01fbb4b64b61a1bfc138508efd630e77580867bdc1e96a48a694cf0db6c2a11f05dd0bc8769e7200bb0749f5798b6f3559de55d0c281eb5df22b731fbbc109da9c68f209b888e61240c4c0ca006d105c0a7f43144021547d3316e5a99f6c429f9ea2f17d77dc68bc9d5125b6260f79bc8b3b8061972e6757d87b6544f21645c0b4debe5224f7c48142c09f35b8e144c0c1e6521f04c170519ff744d61abd59a56d25a26c5ed5972191b25e78e2140f3ce68fe17be9e59a79f6c69619a79b83614c670c7736d19c27fd22515fb5b896a6418cc0b4850e85c07b38b995cffafd9f69763cbbcfa9d1bbea6868244a66a5cc82e815fae09f5775d28437634926d571c2b0d200855e09cbdc67d10f85bd4cc334ded4c83aeea57f8e373a950f135997666b653e8de47a3bc0059525720045996bff500a47baeec97808fe971d7693dfde339e8beca3598fbc053121536c30d0af10f8f5d8e5eeaaaa9586d7abb563fd69e88351f93bcc46520f6d97c1a49ba9f8f6a25cdcfc11b2a722910aabe7435ac8f0dcda9f824fdde80850f21a2d4bcbfd2e9fcbd14dec05c117a9796db49e2f0dc55e74c7f0f615bd049fa7d0bfcf197dcda3ef3de90762e6f6f9f8a8936bd04fcf2a97cf18ecc8f2f118ffbf02b67f252097e4289d02f264161f6f90f79e1e1ef8414b01a9e1a77b88c039ad6eda6df1e28fcfe9370f0d574aa9e857dcebb19eb7ce8af9b19b4481c9fb3e1f0db3b02af483f737ce3ea824b2165e7c0fca8585383d4b0a16eab2c7e3ee5c038f939a97bc8e1c093cc5372ee45d81836c988f3ab3e6ee0e5f9549e4b7bc381a2afac2074cf75ed56b0e757e7966cb253d549fb0902da98294c6dd4de3c2e166b7e45098d2729b1393deb68471d4d3218dea3dfd0183b654ae4092a79357945eea4b28cfd06b40d30d1b4b8f19827895f6f908f0fe511f74ec84cbab2483ca4bdfc6ef50178eabad79b18b58529c9328c13c52c2869858cc20ec36ef7717e1c743d13f9607bbdb0b701d9df6aca7366814e883d23e51ee5b0f20ef70e2c4134ab037d213315fddc89009260981329a1872e541767adbd5ee9501e7df4ef0cdfae9769961f8716ee7dfbab0ec89b3f62e987387d5842e124a69b07245d359052ada50cfd67472d27ce2c4eacb5421b62dd7331da54ebf0989803797f4c8c781d0e2e6477b421c7d5cefc8146aacc0012af3f1f7cd71ce2b1045d86bf48c9a13fe469a1865294e160b4975023d0eb24ed26837afefc250a914f86f8b1f5d67d65e9737e841519148d4dd5dbf2b5a8b073861288ec9793d4b113d71c01727f67d791852fc3946dc912d60fc66bffccf4c45d859eed9f0bfc7f89086df5d5cd830ac919aa7cdb4504018052d67f6a3ca012ed69187cd5fbe91875cfade381bff1e804ba59cd59f0f75cb46dcfba234ab9832c3fb9aa8dde19fc1fb30677ac1793a38d94aefd9ffcd4e777e9e4f6d49e0cdac6c16a36bc2f3ed8e23b80350e3be6d866aaafbc8cbf7c69fe44c2aa80651164803150c23ebe262aa669c77ca94d215895d2ee9c3e325a0bf2c61e419a41e0f7b1ba8ee0508307d49301abccd5b74c054b6c7bd1aa67cffeafee033761d8226d9dbd7214b130a867764062cf4da685deefa23693b8549d5ef5e53df85c19bfb3c43c6bd073e7a836f849587a4747e1a9a3c7194f6d5472d2e3e4c81784a3061fc9bd3b94862c4784974d859134369486f2651f1db94f511c6f59f41da0d75307191602730b88e4e6101fc8d392c87687f3be454dd92fb8ec380715bcd88aadb63717cbce4db91a36821a572c363759d8d0a2ab007e5981b78731dfdea20d900b14f0c5ee6a4a9b532ed2134e6edb4dc267f001cb88dbe43aac4aad453b839d035697df7de98ca7a9ee7601228a79004b89796e9ab971aeb8e62c789bb21f38b77b492c57db402bf6a42ad0cee169e9251d865ea3e5f79b1801ef1e53797aa6c7060d6f9486081", - }, - { - "04cf92a64cbe135f7fc1d7223b95e41d13f04b482018039f4e7ccacba8aa15ac79a752c5666524e527fb076290ec80a3dccbebfce3ee9b316a65fd130f12bf88b9124d1f7772049e6d0c01fef881a1d44c8dd02f7b6b60e6d15df9e06fb86929cab64842284de09659e19451623525aec2f5dd3e603e24319b1d120bd57b34a0317ce25ac9c2f022a4847306b998b57c8d92baeed0de1f6cfb3177d0acab70de275238f1152813b9ac87bf651f74e1ad079b9bd779ba4374ecba459865b5768d08ae7e1dd691d6821895e8380ac9e5116580e8de3a2c5326e698bf4c4d35d955e45772bae8483d01de2539e8ee1ef9539ee132d80d85fff41dbe406af319c0d7703292587bcf5959f49241e2b03a364e1b682729ed261d0ae45d74d77634afe667413ee210983b042a7ce6dbb61c29d18450fa7176177b5a74f032ea24e1d08b220f6d32a7a836d1241cacda39d6acbd26a62f9dbeaaf7329a291dbf0aed4a2cfcb85ea360947585b1215feaf70ba71eb2d6bb7081b2a21bdcbfdae6ad2513a9dd714d3d06c2c2b7e322a1db2d48f9df1fb44fa066f2bb42b196295ebb3c0898ad55d5b317986afaba0bd5e754cec773821613e908ce2bba6454181f9020b73e758df18c255c87df675cc6bb2b8d2eada44196ac10c26674167f94a79f4be515d8d6a1fd3228dc9a85a355b030845dd4c5f481d5b6e74acc66de730629581b022fbcff61e5dcfb6a7f511aafd577849a6b057021ecbaee53986159c1ba74c3e930c34a159f467f1e9799cd6c1151067c56769e43308c96c8edef8aa7634d909310dba9af2128cdb8c29b24d3ec2a4f43a1ed86d1791c9a670b240e6e719f01827aaa319bd3ff53959a776886a1b7c942a54f141e6bae8576d294e44333e6c5ad90f74863f69bf890126016b318e0f6bd2f0adb9bb861118af5f6cd28dc93d56c8a1dd080b8c810ca29267d410673fe367dd9d1353ae2bf2fd88d57b4202c21aa49f12a01b93acbe260492367bc219d3afb6e6f35502f6529bcbcdddce9fe8632efb034a9eaff8b4a48afb105d04e3fcbbcae010ddd6636992213750b12fb3e01ab72aa957136e0bae591bfb5e0fe819cac82a98ae8df230af399160594540640c6b1d537e7b5f1cc47b08127ae02c35b846de56c4c08773fa18d4436e14b76a7fc4bdee301d0af4880306f2f33328ab79f6f24ec779b2b1928704f09bbc5b0b7108e9a115e4959df79c80eacfb98649a0788867e23b2974b22e654ddab0494bc922ecdf17727d0f0efde9dea7601857d890bfbacbd93f7df794bbc254f50e1e17eaed2f5d5a2e6c58083aff68434730d406fb9fd02b0dd7bfb99a04aea812b6830fe5e05a044ca21c77a174bae8b58eefa11ecfcc1c977bc6218064c9931b5c92f13cfd05799f11e130869c293c1b08dd29c899365014fc8195514b286c97cb6dc4b8633e47751f87fbaba137b6aa04d072ae06c2b2f34448449f60b1272c1efbd4722a2be749a3d2e5450aabef1f7c51bd8324607668a8caf8097c2f358b1b09fd3525d47ec9a7640eb20ffdc17c4f7eff63df75dc7830c471ace3a727feb11533d6e9a2a08106af33069cf482ec63724032e81cab18e12cb5c4c3ddc374e2f75bcc99fc5da09b80a738852a14e8ac552b8471c6ad52e35317b730db2c13c277e06c643e0d0fbea43833de4d2c7a9247ff040e9c56f1ff7ea92049c5341c4d1478a14275a10119d934e8165152b89951bca7ee1399dd8232fdcbf831d8354640e698b68799d060ceb877201b2fb96cec514affeb28721e163e1648164b9e5722271db9b0ee1a7f96819fa1b1590e9daa598d9571ffa3882db9d034056e9b2785a8d13686eba61d7d45cf2e9ecdbc391739ce89297211472be18b21401658c5bf29fc3615924382d802a166d05dafe7876e70a0d081e80c63632da379766928a0555eb5e7a238cfa4da267527c66caf34dd40055f2801b29b3f5604a5bf3d46048bfbec2e24abd2fed2481698a4b5cd71f5d2c12dd473b903c9bdb978eaff7d76fb69951005681ed7b0257054eb3dd6d10097fee51ba7e8d565925e4091cbb78d255c9d3ab4ac0264d172c9bcb0908db1288c9634248f198a1167daa323822058decd83936985f83b08b1e7b942756a7af200af168fb8a091107b4443fd649cdc22106f9b9657c69f19be485c23b2c715b3762c332eccc44f380883357d10019f20612ab6b8f155c2af9e2ec340e5d8f45bf5278ac1fbc9f9f44d2f615d21007d822b244b1c7a0dbc182c7f5912485d6e4d74e90f60a2f964e028c63d49c6aadbf1df170e4914ca514139ba538207b1cf7caaceed4db8423dd1086b2adf15f6c0e50dcf2e12898f53c339a745316904ae03c38b417bcd7f5cd5ea77a4f06e65d56c24f37ebe72d271ac79b6ddd2bb8bd67f0727ead49737aa71af4f620da53769ca3ae878adbaea5a249128074ca3ddbbbaf5a68f9cde2a0e8d69708b0ea7f4c8d2dd4180882bdaacccf2a409a681c551776bd10439fb12b7548342532b371c0e045d8e8c895929464bdd4fe25f0533c66104daaaffed52446094978bcbb389c", - "001084c8a5175c0ad43108f9215c35886c82321c800740c6118a3fcd45776a4588ee0e2d056a37d99b40d2bd9c0845088a77240b7e65d18fef105d3488c77910b5873dbbf275948db5", - "d614d2e671066e387f7eee07bca9f9313d86e6a4d1371360900d670e11ecf1e7", - "674a516f8f59f9067e0485e3", - "1ee376e9e3c89b2147bcf75480ff0dec1d0e8cd45ba812f34c84124871d484b4ca87bfc8cf99f85ad452c482933801426e2737a97468809fa36caebebe8eed07a626b3bc3614ef1ceb54f9221ecb16f413f0bd9ed4b3010c40632f05223484af7bf5948c2fb8a3d2ce04c53e3f2682494f3969a0f8eb738cf93c0141799c9e6b68924433f0326991e19626bb19e6fbb5dd46baf39f92e830f9b1ff465a007f031891fb1f1799cc122d3ae7a55624356b5297bd5d948d9ff2e414cd8adf00a53524df43f398938d33c93b2c06bcde2679566c0a7b0177b4a873f35874739d550712d5cfe3d25c19292ba97c01d84224738bb25546e5c252fe5e5f260ca881aaf176a271a6fca2edbb2cf23ae6d4c56c20daadadb8205c2e33881867cd67ae6e59132edccc3601f014b744ff8eb6aef5e09b358607695d3af42ab8fa30e9fdf99ce54427ba9da3699de19f7a8f9be368df47ff0607601a91e7a5fa6e72be50bb32b825427cdeda3972a18a23af290986cde14f5fb9cbddad336f5efcd2d7a0cf3d5b23e54b702352fd5ee52d7e3479441497d56e17d5868574c56cfc421ee47bb00e9c75b84262a1b9e2cbfcccfed9c4c386ef0d2c1be9a7b7556909b5d72a38b7258acdd624de2396c75386e077c34f005f92a2203c82d1072c8998f03b1df22de832ac733977705453b1d72336b8d371cf1ed3923f462ecd22075de5df68c83ab1e6648ede7fd5ee5794a744abcb32af73bcb182cf97d36f37c15535c4107b7c8f2321f9fe0e2b6ccbe74204df3d748c05bc1e0e2c55ae1aee2d4aa4a52e98ca7229d6d06576196ac8e4b14a9ce807075cdc876aaf904c9962741efa8c6caf41e6b87b2ecd6636e2e58f3ecf576e5d8b895162545e618960ff6e336ff17eacd5a1eb335001633fa78c41ed05466d904ef9b81b643a043298c0e291a085e4e67da72e329adfccc407f800709865147db49cbdf4232073b7bc7ad89b3dd901d927ee08ae6497e0f2f9d052ca8d7444d2e2ae2197f930a7b1c8af38d8739ad298464169823684612cb628c484f710cf9c552551b6837b575a43275100bf800b7a3d777adc44d07f67cee5000422b9049dcfbedfccded0f2aa4d189621579b01e3fdaedc4d772dcc593316ca85e7aa248d219dac21c561d318a4936ac0d3bd5c75311486c174e0e2182affdf69bdd6a086534e4a602efba2b9363beeb5346539b45336cbaf479da6b15b226a9ac026482216dedb84ae3443b306820d9f05f78dca7090d727c7481d82c6e5df80e189e24e46f5758e453e542bd91a58eb51a89e07c50afb543c6b998704432e863dc4c0d0236e0672835a7b0b64e14f5ced2904e54da4287597f920bb4d542c35d3b0271cf0eec055656d523d7d2cbd667445d3e8634854f8616b7d7a7f3e14fd32651e9df40e1daedfdff1371f16d5549ed5646adf2d417e4b3a4d145bbe0974ab388c2716861a08296b862e4fd035163281457877eff89dadb160eb2b780414435784804bf4fd36602699d8c2f6a8cbcb509198c38e2df2edaae7bd7c93313ca98a9c2d24419a12ce35b0b3d68c18840e3ff8739d70969927c7db9a6569787bdedf5c99948a9e79b2302a83a71159f4c789b3b3f05f1e574f8a24c899ae3457f8e73f9bd86976fbddd83b1af337eb8da4c0dbac3792921597e18a2fd3a0ac89a270794529d370d36bb6dc7452e754e903781cbf57c8646b92d5d02842e7df229b3d721f9b981f9d61a48f00e53948a5dbc4f739849609d94aba3e3f5f8163d40321576cb8eb8e89953b608a01184d41aafc13f40c47b12240e3ad49413473c26b6843f4514be221c2af632d1a54cba230457f23f00b2608485c381ae03b389ad0a1671fb416de4659cc7f7a9c4b6d9807789c307d061fcf613b96a2d79e5e3e20b863c8b1b75f35c982b40ac8dcb7d2712ef7df94901facef783e8015a9a48574aa6f0cfb0bf6c1a3409028f8d62137c347f5a35ad6a3cd60d71aeb29bae56bb4590f69226fb4e08fab7a9f41e58f4d5784540a70e7a97720c549c8440b089eabd0eb3e4d37a2e54b1160572ce568f4256dd244decec31fec555017ebf488e878945383750eff26a8a1cca73e7d6f52d8cb229d5603360a3bffec23029ee34145c4aade82d486758e0aea9e1b7bf0b4bfbd4fcc96aab66a27fb463b48c6a6c5c5a60253e2fbc5716ef55629277a5f3b89c300e21bf1226241ce0d587fe3f5b11e47f35614169dcfaa375ee1aa589be33a4363765368f5666d155cf72e851d426fa67b982aac4dbbc29356d71deb0715b34e00b9fd8876bbb09ca0701b15615f05cc45e128b3864b26003e6ffe801c4e27402f37b8997e0c29ebc273dc03358cd22fdb68d9cd3b56ff8248a727c2d4ac65acda4d0e0f511bc07ab06cefcf444f1002c151b953d7f7b19695668a86683497c2a2d2e69f19a4997148d2e8d158da859c8f44437d9ce9db92f84a88e89cbffc74c0ef4295088e2543a4f7c6ae9c908bd987bcfd7a074f83ffaf3888bd7f430dc5a5bb70d223c21b1bcd8bff2103408460df864dcc168486f6a66d67ded366c6e10f50bcddada93627cda711764a57ec36035ebc", - }, - { - "ce72c93caa49bb9850774149a87fcf8e23a0c53701554468645554553d54190bc6e247712b02097b794bc421ca94afed34742435ca689d2ebef183fb469c060c7f4d7daa508726c9d2eaeb9c7e9a89b30faee8d9168607d4778acfbd27d5caa623475073ce763ca061273cdfc2c692d1747baa8a01b15f783b2e36620400082747599a16cfd6b630fef310c0b9a2912d1d3bb71eec16972745cd8a49cd927014eb0a2abbe0e1ebded4fb9e8d9e2fbabb6a71da5688717ecd3e08160b9a861f86904a41702b2c4fff28ed8cc61d468187b75bde3fcc5c0c0a642215fea83584387fc5a9aaf2f8a91ae535e0027b618a32bd687289c47e9428a1a92649deab825d702b076223b07c08e55c0b60be95937bfd0504c18398e924420f6e20baf07e2b1b858d3e360a461b66517c24e60f9fe314a4a4973c8dbc7e9d2a9f571a1d8235a21073d81ab9f4800b70a5f17f44d593e8792a2507e6a3a41042fb2a5f7e5f028ed2daa88cce28973ecd88bd125d50fad77b1fde61c38272057d9c65fbfc6789ce41315a105af14e277a0c39d75c34aed7538c39160eab1c8c47818743e8111229426c399c5e88c4d894fdaff0315ec885ea019bf9acb785f3380c37201d494a60b583fc130bc0eb9fbe9b90eff95874e35910dc05c761f8006e2f208b786aeb2eeee841f9a82d9966c82956c181caa4dada81dfa2e2d7a25007c2dc7f2dc7ad1bafef14581cadbee4d614a557df4931b9ca105bade8fdfdefc0d96eeda11c08500b1ca827ca670ba07bb0f85af92914c43a6f71226d6e112d487f1ae99b2239a63ee2cd0849d8a9c488a11f82ca334604a2b7260f25373c6db75656527890f9b772c6bfbb9f687f27099ea9d4d1efd874a6ff83cc36c039ed1690408f20394692ff054d9e6eccc6776b6f4b3c5f24b0052334d159f40b470a9b8799bbc0df4dbfe59a5e536624cad193160ef23abef85df2c9b6e6d4fdf16f848a2a446a77044f1162a278866c491982570cbc16041908cdd0efa2cde011526a3c96d4b39a23c5fcc53d8232869cb4dea871f4ac8afc795aeb1b28cb2d7a3669100a1cab2ee1a7f31e2a25a5c6da836e4b771ad57393305faf582adcd26045e26b618d9943358c615fb206258c8993d700adac7440dcd3ef34fdcb065e10e9c9727662b5abee160aa01d2f2ca6c203a76fb01bb08cee9fc1eb6bc7497bb012ed2774a2d263b9dd03d60c307ccf33233ee33eee702c8e3118f9f86174a97462d0e804a24bbd7f4f938c7f105bb23399967288069e1637b60f2f1883d88ce5a874ea4bc0a7ca0f3b568e4bb1407e4bd6f0d3dc8fe91345f8435d7b1be961c45e4b0f1ef2d92d2d30bb78e1fbf72cd2e7ffae76e8c2bce005195c2003bde46108f37ffacdac28fd67a0de62970b347f0ae3f5f3a5b1d3aacb2fcaceecaf2ff4a2aeef6f5a176cc1b74b234f5658ce603bc353e075278a4056540e43033d37a6eb2615453d8206f5cd294423811283bcd5d79c4afe268a547b98977ed5cf24c0f53a0533bc0b2889356cacb67e2f7353060f9e04362859b1c1f02f96bf5457b58e5ce84a6810d39d7c7f53faaec64db5d6ebb90c1412bdd503ec6bc240c277ce1f5f18876feb24eb6a77e5193e33ce141e8720329add079dc9735f0a35d7d85436f1dba6dcff9147777760b5aa2ec9c8b5e9fb4fc602ec8f754c99ab2372ff5963dbff3fda91865108e606b214cf7acab875197e78060eed52a798751998ce7c73cebc4d5f429f6729a5193d7593072d0921ac8127ba6e796107ee7b9fbcf7128ab35fe9f6fe501fa4695c19fd64460685f287acacf5250efc13899bcf80ad5a340d432a0b9449affda5c8fa090f008e01873aae7d5fbc7972451542c5c29cf9cfdf23db736c8a7112536b1b626caa63f3e4117044cdeab612fff8d8c194d19174f56ce761f6587349c48fab30390f231d209461ee7e18007d10d83ea5aacf199f3b00003259747b1d03274d3c3670595604bb4482d345ffe31d3e88c70da16649a2677bfbdbf618de1d651a53d573aada2eee5c01335ce5519a6d18a70f7ff0b1e66bacc162c49f7f29b9d3fe2c7dd85b6b355c9f9141f02baf08d2be87c36f6d2e1b2e90dfcd100886e306b360df0ecb146a6aa5ac5ad05b63a219ea65885894a386248254348ada17908d776f9b438306ad28b208f80d6b9b265500aead945134b9d388ed5d6205edf07c5d8bbfe0916d0943750150e09c76359d24e3317517ea489fd8a501dd93f159f07d19d00e86d952fbdba2db771910143df346b30a30fba908a1abe5349c3f241958f428dece7ad9a91cb42035c43573b87b26c2ab216cb4c21799f6b3d81acd300ff50edd6fe7868b9ba6c160db3418565ada027b46b63e5d4f3411284fde585ed3673b424ec1cdea678e4a43c262991c3c9b988351d6e0a10af1c959cf21b7a288f2e4d7b3b2c11b400b5e036df71fa993b72ce48d0d8598fe4ef1ce70a970f89b55cf4f07906a479bc84a08bf6ab25221de37afebbc47ea0b38b87be128737d7d43cc84d336cc6ffe1677bd802910a2084751f30398dd0ed09589b2befd2f3b40fbc013318c822fa2faec2323fcc52b43161f47aefc557e92df3050dc5f8b1c5a4b2f8bd7b2ba7aaca79dcfa362fbe7781a2e261683a4a862d5f83e34845a8fcf8a1aa73cd521e87cbeb71f20b20698cc34bee3b8628b1a3784596c", - "08b3fbd73d157e79ea9f61665d19867dcb8c1598c1d37b793606936d8aecd992a0d46addeae857d488b83be5d1c1639d4d78350e4cb08782b61bef4107c9d3a79d3d85", - "a56f38b4bbe83b3d9e562cdf5ef5b30593f08a1a166676c4fb0d5861654e640b", - "8726dc5cae9497936658f603", - "88420357d1ad70e7c7bfd55b3cfd4bf06cd4e9b4ed5cba681045199a06985956d35fe86b28b9a4599964930d05d230a23c55a6a152f67082a453fc31f68489df05c553f9ae5cdb3f611445db384d79af865e52440a876fc4153d896b7a2318dbc2a4495ecdbb2e9dc68022326d35289e82aa55197aedc266dd91ba3018c7b474ba22b4e773773f3e9890ea84bc16a6b235e4bb69e785c40c1adc15b0e0ef03aa147b0d14e62341e27398b84a53f72c9199cc1c94cbcad2bd31aa69c96b06d01775b8c0f80278a43f526664bdd430164863c9c9140ad87798a5b8f38dfe90d37f54d1137709d5311136b728e6c799da244294daa4c8b44bfb0acc603a16c088a081129a0d2cff55ce1c4ccb486fa0ecc3098ef2196f47c49f9d253112bd5746fd99df5d2be577617dc2519c0ad04ee49ee1d7be3d50492017108fffc9a414ea227af39fe49fb2c895fcf00d927bf4a2d78c466fd44df4768e6775d39fa5c834b60979ca27ee9f00faf37a090838f56275a894ddadd265a8d2de74265e4d8d286639ce8f01eccd4f551cf6b4429eae3f08902b6ce6ef422cf91ce8946d9403fe8064784895b62a7f5df76ea294132c59da6b9f53d4195c1e9000bec499c14cf8bad460aebb024a76ac50616f0dcda71c0f56dd3239b11764f3ed6ed06c049b2ad673e4beea391dbb854fde1f01b1900858b9809259f3906b34f95a1c6ce8d24fdf0cf7c2ab7bde2202a7f1482baa6e51caaccef9f541c377da620bfbc63955cae0e6644ec8ed6878f704f1dea30d6b50d4291892bad19b0234582d50c6cc0b4165322cff24a9dc2ce1be35be0fdb3bb7abb777ff0b2f4cf16277388af5a89220d59f1f45ee9cc2a0fd7af9aa8e9e8d548fd65be4e47e7f8ef58f7701f93a42e7ff78f70e807fb63513157fcba96ad9731b2e8f80da85ef407d5c368ad16f0657620bfc122ba1b10d7ac2bf46d8133a9c6fec1fe04882f3d5765da8f825e1984a4313f72b67d806ed45c000dd3ddedd524d474b9b5788547d0712e8edb4c6c586d0cdf8f2384f1e093a7f6dffea6e79df9cb9398f5d0b9a7cbd63d489430fbfa397a0d03ef916b7702f33a54ebab84a7055b7ec6179b0ab7722f03e126ed343b1cdf2af3763df7e3a070162535514b01ad86c6cb051859aba1cc4766b12c8cd57b73fdd3c65af6961c45395aa7b885dd59e115db885f644e1c94bfa26b3804f767601c86e2c7dcecd4daa59955e6a40991a4b4701e63fc82b46dc0ccf59af40a8583171375551c868436ede535705f2e6380c5899cddfcaf9e94314794bab98846cd5ba9e9afbdbe1ea7fec5e22e7b2aae59fa598f4d6c0cc6f936a616e11bf01a2acc891cbfa2bc53c511a8a3a3da2e3aa5907d123ab2a4a3c0009fdb5235a3c33718fe4c504e1539abac6370e06150c402b5fc2f8c32608db4ce2eca9d1e4b96371ee195f6cd632f5b972385f9d5d357b87c78cb4e2c27aa9851534de14de923543f5fd9d55e34d6e8b7e1f3f2735df80046de01f79d0321066f9bbd76299c7386d285f7bf4ac15e033e89a040710c90f87aacc09fb8159f93c8b4860247eef079e32d05707e88aac734a2eadaa853f528d9986e0af3435b5c5f44ddfdab9b0c9ab3eea97676e920f80d1794740067f9b229fb018c804e595aa997533a5e967cb79ee58eea18995a90ac08333f1c69600b17ef4f454f540dbfa8b502457761bc4daa876d9053ae1f55001b6916ce559dc6268d01841255990e56614e6f4ee4ce04472dff0657360d75da4e83a71c852a2585110e53137e91bd89d64d99b5614ab2a5691c876f15d9931b092fc6729c0732db5cc40f966fe440ff99d7d05b24a872f552c27fb0cf2af443340b153214b407fb9ca3750d9c157aa75763b0b7600959663889d00f392d6ebc12835bd2f03ad802a21d0228f1d2e9731d0f0051eb2d5369ab790d1134c38e28d2bc2d5d57d6d897244742c176559961a1e40c84ee5c8225c8d72b92352a011e3785c262aac115cafccc2fe1b5e81a677a0220f207ebadd786b93f58e40eb6ade68ddda5b66c5f0f6b4b95cdb8241156110ba3303beb79acbd54423315768bb43b4fe8c4a465e50c4e63bce272c4d731ea4c797e14b2de31ce4264e2479179b906f67af4a23c56e817abafedc2c7a65aa45f0c89fcd0baba60561a8d013e2d5e0bdf9fbcc1346d3edb20e6e9f9c410982e1ac43039ad8fd0ebd453a6788376951fc20374b59946a6803498929d9fdf2e0f5e58c441329a79d1232e957b3a9ed17231c663b4819dcb6b4e33d205edaeb7d7ec466930bd84a064b40aa67fd76f6ca005408062b45b5aed6f8161836c7160a8c8313dc9aa1c6d42c2c16972a1065e41aea9c58db7916e1670cb42a8b54d85498561b4401761506860b19b446655f8988101fb4c45067e30edc3f00df8d88ee34111dd6626d605d993ff207be09704fd8dc242ce514bae77cecd20f10d4a38435a3f5e545882fdc224586a04ca6a162e118d23716240fa67892b78faf98a17916471f7f121fb9f85497a0b34bf5aaa4ee1ed8a4681bec55d1b4973d4368600115bea70f20a37c9e942b87f6cd1e2ab70fd401e703e3c8334c75fc338508e06d6370779578fbe737a75954b4701bfd92028ec32d3d7ae606caaf9f049d9774f70efa707c1c1174d9fcb5b0a0ae2a961c6f58e48ba82c2db14ebbbdc24288e42879f547b855c86dea9a3b9877e4b105515bd78cc43465", - }, - { - "bf7884fab52251e202afd7b5b46aa53f85bca5fb80a009d8016e276579e401385d853312a884f4aa33cc5fe7360426bbc0ccb7416cc0196e2e40d3a825d5e0825a1394029789acca550bb28b10d847d0a4fe1111be2b7fec6b5294902775128288a784203031ea853c9c104c75571d19552e2a1359a900c5fc9455230968a5920f2ab23f5b9cc49739d4e4ae2c01c7812ff295899b954e9729a3bb330b60c51a8a7759e5131d7d4cf261fa1e62c29f91b4341a4fc968e7f30ca2261702eb328d628b7275a9efc29b50bcb9b27e5844328d5e8256c76949d30b6fea0d5a1c9abca80d3251fcf4ec4db0a5ff2ffd43618aa2e3e1694c2a3c579a2665f443ffb1eb0ce33c09d7285687cd55b6ca9918553bfb36a44860e09ffa0604ef4904a034108370195a986fe165c598305eb08599abbb3df31b1d93162397056d9ba5a1ac2812c582aa356310fafb4058abc5f157802e4a9b4bddb16e75b6db105b7dbc838f820539b76949b1648909104efa67ce28b16a738f1be104d2bd142d3ad1b1c953b6020a1f4cbb84d5c49424befbf2e6ac5c593b783a3f4af75477312528fa78dffd82fe493d821e011642bf1135a5be91fef909383953308dcb61b2f35c2ad259acd1a2e953c0ea6a03a97b384e39c94c33d3846c26b4f9f116abe572d5b7cb81886d6adc2d544630fdc1684bfb32972e051b9a2bd0931de63e025813b923944290fe1ebd5264ee4f25569a2088314e8d4ce8b91c7bd602b9d85acc917d60d30d5ef1cbb055b9ff7b0f999b98caea2517d2de334eb436078c90d41e0e34f11b93e3e643389f43b3afdc4f47a7396cbe0b4bf159ff27618cb835aac6699be1fc7ec840b767836a165fb95d06f2cac4fe15b65714ddb8a095ed4a5b57e63d536405931b6c168683763fe07c32aa4130bff787d4d440746a2dbfc584a502d809076b257482abf7f8ead7741c82b54c41acd41581148aeb4149b0c6eeb39ef7ba091c2e8bc72583b2fdf8ce7fad1bc05aefd6db0360c644a9760a9729a88ee4b2ab123d7238c12435b9f3b4660e74c0fd4a9b00aa614453d84fea01f779e5a924f8e79630a8bb6561ae19c7bc8d88b9d823b98285fdd65d4cc05e443944ed5d3cd4f46c7cafd1dd5deaa519772dd24f508bd2d588a832d5689119a2d506ff11dbf37d57a24e35ff38da18af07eaff5775d12dfe795fd3e1f0ec83c5f283d6cd76532519a15a18d93431893b1b88929159bf8fd21f62b30f4e37d540baab0e30ff3349a08d627ac19303fcae8b8e3fe44eceb66d30697c7ea051bf5afdcd8bfc00d49c8d36164ec9194a78a4d8b78826863e93b6a810354861f4a35ec12e5ac102f74e390d9c0227e67acbbe3254e5b892786e3a88a383ea9726485854a319569a678fa70392cee90c9aa83eee8df6800565bb8e083e78a064c0f8b863120efd799ea57d3073663c0d0e7bfb9b717ca1d6372fdf75a77fd9677791cb899fc8033d6d806de1e6aaeef525ea909666316d9d604c1207cbeb6f427c3acc1b02cf59704fc65135703f2a9529bb2c8fec992c4de53e54b029c3f2a5fdbec1008d1a70dce0c11251003ce62af712b9e4abe631902485404e4933f346f1b4467fceb65baf776d0078aae6a2a1f95b85a441b635663c75b485a8a7cb9a5c12192ac874d940e2d9b88cc05a2db9b5b35df769925da508112ab0b8f64a1408633fd0d81810baf2c846b222736bd826c8cf905b2c35633d6013f5565e0a5ec1492e99613f53530799052a0d70023339d1c394fdf9f73a590a2faf68390d2a823bc3e47a173782b03dacbdadaef1e67fb47a7cad71b6067ce5b5e41fc20ea1fed28578e9bdfa99faa657a754488ed3fc084faa7a05b0f6eb66da0a28e9ab26bb319fa4ee993de840948f94dc1d68d926b783a0bd3396a89970b2c2595de8148e87b87c21f664618af4f567115d403715c3d7d2f66d7a90de2c5237893a4c18c20494e3faf94485ed39ecfe972c36acef0d7ee57bf8755924c790ad02dcc5c4e15aa7db53eb6040244c3ebb7874676782e54dfdddc256018ae6af8cc37450a4cef77f21e2e061062ca0c2a514290c960f5993ec1ce9eea6d09d3293118237e079b6015b966361c3032368174d74ae5cce4148ea2b3690fbd3c28ee544c5c5bd7bc618122979d52c9d3d44eab1f2467f338e695ec5f95998bbe77dffac42bc2809d43a324e0f5feb4ca3d5fd951b7dc8a9e6276ee080079b68849b14c7573cd02c76027a856165d1043acf99554c62fe32896d120974ae71f84986bfa0c28fcc399246bef3ab90f8e55f913aabf339dd7ca6f0861a9ef712e77dd28740615479f39a37e746c7df2b267066d1649fafe0459f665f3d5e7124db43ab1ba5ff94989acc7fe0935e0bbacf718b33103a1355d97ab416d8263ab369e6cf0ee563a77f2f265fc3856b7d54dc0887ed439a421c14f733ec1d6da086536f9539d23cb8026218c5e783423b5f4ac24c8d5d8faa7186dd5ea34afe299e6dbed73ffa8f415da706442a48808a9342d6209f65ca11eba76f8ef26db890da76671971f65bce9e6112c8aa92523dd5295d748e28857acff408c161c0513b37b855a8afb0764d118815bb1b68f8f09156641f7eea994ddea20f4062607b9919d041c880b71592402a4d5b92464b239caf431a99dc67787e76b8e1d7337af004bcb88473cd16b3f7640e8aaa59ad4609f060a2cdc71a4b3ed22c1506a7050a63bd8ed68aa58a8109980bb3f2b9f9fba9599d7620b8c25e8aee739095789af83529cfbfce5941d7f14c8ae30583deafdc7c25fc34e75bbed6ce4f6b47e9647c12333ce08c7db77dc94161cfc43f7ea0bba39def8bf8ae61c6fdcc0de6308af963c6d9ef43916d0cd2cedb970d5937c9fdd4b888cc66e99363b5a04ae62a4349f01c3933ada64080741b1781754e4a722303faef69e382cd9823177e4d5ac83e76017124a7b1a41bcdbb9c4209e7b42c", - "eaae1c53919e2029c137a80f91704d0871be2c1870d0333d8bcf7f94", - "4c434cddb399e52457113cc7e16f046c3f8301f5b6c296979f8a091a9ea557ea", - "b633c1a0e1ddf4727b149b3d", - "f1de487001a580cee6edadb1ef6b700c861a70c6ef16274447b8c61bb10d2d1efbf104d5f7d7172c6a5cf9c06d886165a2919ee9418e2e8f803d47832dae5ef232ee300d1f973a6298c22d777a1b16264353cc731a7a683cfe31e0abc704460788c555c0c24f281b81d7761235a955c736f17f213a896b40a034609ca8456ec3cf5906d01121b7580ce19d89347b6a59c81add318df487b2442a7a8b5e30df78467abbf46bcd5ee5b994a39ca5bd8846caba6f02f4f1335b73d4e20be0b6ad85966f86d1bb857713ebf947ae936782f1f4929498bbd66bdd5ad6fa252364a5a6b46180e93b54cc321b3cf63cf23d55392475c6b8c8c9dc707924b55544151c7c55ae0bf391f793e52bed70829fcd32b2926600f65be0943d6a9a96547675426b0dca9cc7b0f5dbc9d5439d0281014c6c159d055d6bd89d67828ba7fd2a0570ba82996037f7dcce297fe6518331270f6fd5ee63d406cc5081472bc5f2298a9208dba9398ccf807ce9af982885897715b3c5742456f756d79c70434a9baf7b4b6664c9d9f5696c5256b74099e593f97a2d4a469cb3430d0c3eb06083398cabd58af598945a85c9235a3fdd9ba7686e54d0de9afb594b1bb030be8e6bb839f6b45699dbcd2f771db64b0c62bbf6c8672fb412d60c00b3d87f82ffff6512e8308877573323c5a2d6a216ce3e2ce07c9763835ae59d44d7958fd873e3995b62b1b347e489ce86e023ae27a6cb03ddec27a38fb233499a714acd89232a91d38abce30299f38f437f7a46df647f2be862c1e7bcc1e4263c2147b13ee5b345b7fcb973f3ac71db8bc12309f67ddb62659bd73fbd20664eadcd23a79233386aeec1a6fcc8c592053954ee53826cb9b6bba22400648887311cdfa5414c96d5956fe193a3729be1434d923a3f9849f6c419f77ea05fb72f3c4f75ccec03b7f7aef8c8e55c8c5480ee505ae1a7594e6a911dfbc39dbb0ae8656f5972eb644c64203a920fe0078f3d050cc5666ed9747c23df7853d6913005d0156e741a5ead3bb1b22e5bd802c303a73a961f0b60d0fa698041c22577b44eba5d6071de4b545d9f5de24944c151de6a189bfdc223e0507c74ff929f06a2e7497e8c63073294b4aba110a006a6e9510a9617405d9ee711831e085940006761822672549d1d1c70e50002c2227f6f304b9a7f11dc05751be2dfd297087044d2e20ecfa0c091478d62c1bf5f0aacd25bb0384853762a51144b77d30418b633c4c10a6eda7b2eac46905641da0b685f85349749a91cdbaa4027fc50eb97a7dea9e8cbb5b5f386ace0363803ba579cd16ef80dc40ba1044b4ecd0e81e382635d7855e2341b18e0ca705ff46990282fe25093a248ca04a1fff64ebee25065350ea4b9e5990da4dd2e28688ab08b6d6fcb54d70f6d74fd7e5e05d21c12f5b140839aa966aea9ee094a923ee5ec704b5b709ff009c20ed89a75468c48b505d07c7a5ba1ad54ed610886c9d84468eaa598c71b017578404c909dbca431703e0cb1cfb975a696a1677bc015a75db007eccdcb21b9e5e119c48f148c2cffcf29e245e52156ba5ba0a8b0031570e4cbe7b3ac4646353594f0c4a9424c9d97845c5e1a4b4016df9be8df3013e5269484cf32258849afbdd733189ea11783f0f64d3aba9b4f48818011e868cc03ecaa44ff0ab83ed12981a6df445294ff672f3a16d6e0d19b90007d4646e967e0fb1763b3c879f548e1103a75c94f3a7f72be78555eafc086c1c58d1761aac60b843704f234c55b951a1303a12705f2120f784c2bc1494432a94c835d908f0edd5cbb169afd2d38087ca5bc5e5df9c3bd970dd2da4fb2a00933538148ebf669a20b5beef0402e53dbfc3a0f289b33b41ca27eb2f036a22f0d02e0617bd01e8c74be264515c9b46b9ab6fc67403a35837844580794088a9d3c14ad9309435daa0396f48017be524856ab6c191350529962ead64bab33171a01bb3c144b23bed406cb05102c693ce5df36eb541c47e871acf56f2b47de687eb9b3511ae83d06b1f69fbcef3225c3469c304741437fcd0ff4ae3484c117f51d24b6ae1363beb7d85d9b61e01e3dee901b90f2d3272eedb384ddb4d3b9594b9c0926595e500f8ce2e5cd407bd7a4e2c8e6f4315bf693e8c961ba5b8a6c7f5030c68a6b995e9d3f9eaee9eebc9d679eaf72a5f1cb6b2fc66edc7dffa2370dd778ea7ff446121999afba7bb35ceabf626c6269bc466d65f7f812c663bcb2fd87d3e09ab7d71e727f66d20ec48a5d2bf0aaf0aca05d1546d6e974f90df85c1393e3d45731f71ec7b5cb6cfb4e5c29976ead6944a99df2045056e198b19905362d4e9b765adb65eb089233a8b3777352665489c9456cceed593c6590d9f3cc4024d0bb92e1a0dc619bf8ae65be77456c18f8171e4d2d846073cf5c57ba93adbc0db9799e3d98934aa6899372acfa4d7d2ea32e20164b79c71d7bd33c94f9a781a25cbcafe563462eeacaec0e8d9d6c0199de85558a3a05d1ee3483351915d8a4e65ca0ab129a2386a9e26aff9b912c588babbcf25f8c467145061b9b8fbbff19d8c6ded8527d457be7c926c8f490bbcd627b3002044b7729a52e94147f95772591616f6074047e758597f410b3100f9efafaa4137dedfd0edfa85b0927804f0b4fcea1a174622116222004d42b36c2c73d04781f2f49d080f351e57154a3980005bcfb0ea34288e2fafec5bfd01e1f7901b3efc71ae58bf8df4cd7c045856103b77bd78073f0174aaaef4a3c0e8b5b46dc92db55478f012dc1b7d513e215e735573257f105d2390b5366f49b61809033c13ed4e1ebe19ab89313c947f2585f0788a0c5de90b41ad0dbbfc604a0d414d0e5390a0f3c9616cfce4097e38e05888b8bc6e55e40368bacdba7e5b76f4bd8fe619746155c30b38807a1ad325b00ecc3dbcf23014e79f1c39af7cdd0dc7ea58ce733e6611b7eae069deb047aeadfc21960e614db19d2e7e0905a9873268b9a24f856c28059321a742cd6cb3d1527", - }, - { - "c89c3cadc094bffd5ba06c600dabe30ea19ad037316fc13b895fe0e14ac8841264c1bf25557e22b01f8e102c3af43adb8e0a12bf79d3fa0232dae37ca3688e07294e2c7ecc4e2eebdd3f17173351f2c15b0480d4d77bd70955ba86f82214004b622cc92f7bf81a5837326f6a83612bdf65abb33c268a457c45cb7467e074b342a17c711c748c74abbee31541444020a9ecd4e5125e2a8ea3f6030bd677be18183a8a34af16a85ad48b7015cfb036789c0a5daf68883d0c7e401754b8d56cd00ff605be0cad19e03989f608392c81d636de859e66c2aae403c138bb96a58ba69b9064a83e7d8877067e7f40aa0016e0df9b7f455d292a60eb621b8107a727a3378c4b7509d3ec10526c50fc6c66dd4b015c915e85bbbf701ddaf2258119c8b9a5132eafe61bbf38870f35f375123f766ed0d4f38b9364a86e56cdef6f95a815a8d7c48ff283c77992fc6c070eab7d7c7b517006e5d4af532a7c429912ebaebac27249b4f5112d870d998e1c450b98c05d08c742dc769506f2d7a004c24ebf84c10838b619653e27ffcc4344d8db0435e4cb77c0410cc734e36738a6b5f72a7600632d19c86b40c737830b0f5f104443dbbb031dc7ca51ab318951e7817b5d81de8a9aa7f5db6e2d5e7a3cbd8a8100653c048204ced3af005d00e7de7b445f5acff901c4d46ff133e92ef073aff1d9ebf55befc32f9ec38c9eaa6a1aefc974bec2758297e474cacea2ba4151ab1a3ca0762c64a5ca273169d29b83c164f77f266c01bd5075871e17426068ed7aa58ef0d1f2959b19c604eb6187acc57e2becea2da93ba23159ba73b9226034c7ee2498e0ba34fa8038e5e2c092a73ebd9329ea3d648d6ebd47e1776941ab3130cfc91089fd0a0a36f0ecf68293343f275d2a64c1b7d27ffeb3f667f4a19824706235fa5f3f04952ff08bb183c0f1aa1d1b0edfd2e05ed093543788f5d0ac6532e15f912163275053b202d772f381900e906fe070cdb00421e78c16b7387be91adb7b3b3ea28b92548d69c780ea578e7ac66eeb931eefb4067bcabdb345a7cd2022085fc494f118215adfa2443630bffc9faa8fbd9943c3140d81c7532895734a9dd20e31c326531d06f5623c252139c4cbc882640c457819c63f6ceed4e03872b246a3766df69373ebf5af1116e8d5e1b15745bd9dbdd663fd4352d1238a43d5d1e74b3edddfb1c9d460daeb49afccfa0712b7a4cf8d07ccd0599ef3e4e1c9b5c814f3a6f3a46fc80449b34df87f47ff91fea3618cab2d5c04cb50e8ad199d752d901b21348ae939d39c86cc1bcecbadcc6f0e581a3bb51e070507b41ea4294b35456c69cf55a2a3f1296f0df73abac3a9c81cc303d1e20ad6e9bef48de83fc22dac2cfc01ce9ff3f70e00ee49bab2f282ceb6859f989075814e690e36a8d16354fd6056cbff49c30e49b1570363498531ff0ad0979a4518e9ae271f57f883abf5e301c0e24a83f09335479698911bca90269a28c0e040a98e67c9e55f4c91542f921511dd980270cd490766da22306b48ca9309aad3b2393b7b1e9ac7afeff64204081f9c0a8f6a5396d02eb9009901ca2c0a75ffbdae3a38ccd5007cc4f6bec8fedd64086cce5c039e8abc9e23bd694fc8de4e858c89bd585ebdd422b492eab26f4ebbdc1d17dfbba19b5ac458c31320a161a52dea638548205a6ad4ec54875ca34238c059177bfab2d5be0a98d12b3932d0661d33ec655446d0283224af8ec7f1c6874add03448fd8029a71d3c5aa06951123c9fd881d435845757df50444e6cacc31a8cf7537a778d1184b96c3512cd474f5d1fd1214555789d24c8d173358e36400b2d937595109729d9f35eecb0963c0da60d2eeb52a778876059fa95d820d5d34e7948d389dffd53d34c4083d27c917879b053cc57dc43c8263e5dfe5f33c19dad0a7126ea6e8abdbacb318d37c305a183596ddb25b1934beff13a4f24fbdcc2064de8e0bc639e672ecfe45692e9f8164365e1691784b4f775ef369aeb135ce15135c20da95064c810592ea33316b9767caaef842f948b9573b2205ec57d3026a2f2244c42991462e233061549cf9bc66a7b4a8a0fc61f73883fd24dad02644004989c4721a0aa03d3b0191d7fa4d3da102e541fe463936c9365ba30681e706ca70cb3c8ad5dcc710de59e7d8a6247aa809bba74ff4dd182a38bb31baa337841302c19ed89d65e87bbed05465f4ce0dfe89b44d7e9266a8ca21d984c41109d813ca76eb67dbd4e39aa437ff98050c968ec1e40c534ab51d6b8ea2309fab08b3757e9edc5972bff316f6f2affbff458ac0299613734b30dfdad20f797d172cf295cbcfee3d8ee25485d40380d3480a9372a1a6e5ecd7c4c6a9d34027ea6c197f37e86e757750c9fc24cc7cf814878b8628326c140930dbb2041bd9ee87f36ebfdbdc34522cfd4e50c9cb48dd52d4647a06d08e0f0069c104849bf30c8e61cb693dffbc69fc0ab9c5d502a227d606a1dcd630ebd799acdb1e47ce2ad52ff53f6cf4fbd5f0058fb5db915702675ea44334d42e0b6ddae78b22b5b5f7e5aa36519e31278e37b64312479b14aef9b8f12d8c1f39faf920851bd53b13bae5490c847b3312b2e956c430f1d8deea91cf171dee5017e7709d0346d81600bd5f0c41da3f548c28aa50589b293685ba059cd7f3edefdb5d8cdea364f4a42153b0632ef0b7ba18610b71fc34a781eead1dc5a00ab47b6840590ba44dafc6a16029cf50e089684194d93dc881beb62edb7ccee6304a4e71a35915f109db92690461b9e4ea21257ffb62477c20feaafc7a78e2aac2301b66893157920ce9fb114ab4f534d61bb3d17dfb4d9ef9f79a736f7c1d32ac3998356aefc876d8c38722787d564e980a1f15056cb3fe634d71d2c98e0475c79cab318b73a863362f85aeacdcfc44e61b5aeb870de9ea5b5abd24e8c19ab05e45e1e9b8894deeb9d29d65ae99aa94b5047f3c1168276cc2e491aba52b5b03703ced28c63a167f0cb3e4bb4d8e4f0292cf3ea4376510fa49a1a5efcc00f23c3cdf6402197b81262e66e17bf4307d87ffbc2b37213b316bddd65aa9d64ce6122c4a1545c5966bf4fc4c6ff17ded787ca9a3b3cadee435bbba8f6590dc4ba30895b84d5b4eb94f4b05be3c", - "82abb4ff5457b21f359754f151e456e2c0a185c8363d15918bcee0d6d49f12564ac655", - "b63b577e719494032062e3f63682098dcdcfe26cedea2a40893c847a331e4ce9", - "9f1d08be539f1244f0f69ad2", - "88dcdb0309f8c4a96ad5560f8210eda1f5afb31b85b7a8b15525777748967d4ed77c063f65d64ef19b31044f2adc690f5e457faa1abe2e127b38c626eaa94053c9ae1b6b4d0db1f02c8404b50f58210cc9fcc6fa4ecc615631da631031cd6253b4a13a3e88295ffdc775fd4bdf29655d9780dbe02b0a82aad4c4088e90b51f170909c0f98ff93ca3926067ec94be05841603db4f913b7025a9ee34b8d8bc629ed827a2a9857e0814d36b83cba21e670f8f94ceb4be5757e0b8782895b5d8605868e4f584b5bb6a5f3a94edd9b23fc2b6fa06914aec970c260fc370aa245ca68888c90c43eecb68474c9e45c53a7da055f5bfe39b56769fa56264dc8bf4c1616e30262bd501ff9fc5cd78f73ad89e093feba0393a11c6b2cbca765ba025c40dd0417dfa644fce96db5a0362235ad37a317145e7b5f3c7213c7fb3c393be57a1cb55035f06da1f0bf665653c5fe8a0f3ca67dbcbfc59852694d34819d0978cd09b508d103017168f6848258493be737cc24c2112f2afeabf41038bea1f74bc8656d9910b77d33cc691a0d9b12f7c518ecef93423cb4871949a518d2f06e5427823324275b97110f8f88b0d14788741e617f4b194e679a1627da50376a08d4f23b005c0446b46d4f534ed85e4692e7946ec818437089425ee30e47de995e8774b61003801de67939d9fed7bf0cdaf625798d0d0d04a61a2482217b890168e36f20cf1d6b81f9daf1a49a781567c4363ac2f3ebf0252d5adfbed17f98cc264ed2765aa279b7437410ee8b4cf42932e5055f4884deefd2a979ab1328f97cb750b3b7e4615b9c1c61659c90a5ff6d1c736e785587ec85040fb2c6decf789c2707974bfcbd0c7f699627b31e0762321d55bcc6acf1aabbd44abd7766d397bfbb68c424b311611d9eeb6598ca3126f569f688455da8d5ab86eb01f9c96186858c4b5e447aa2b9ca11aa5453f731beed4e09f95bb7376e200212e2f03551b8b09a19d6910f25898d692bc20bf6ed3ac9a0276db560de5c9e264f4db8fec6577042fbbd4510bb7070086508ac451a1fda26582c259412fbf1bd60cd5e921160c2604fde559b5ed4df52b805010b225f999450adadc6e108b70f169a3d8da6efbe1cce1c4908b004e928e3cdfdd0b4c5f742fd72a11c9585aa3517486201b6d9a98739b77970a88072750d29d005a291546f13b576b4249d71f04a9abf8f653ca206d98f738af2a1203bf0975f0a40138df054ee834ab73a3b1d7036567369a7ae15f808904e08adfc84b34a0e1356009d8a82e51c3e8f2170908179bfe47be8ad819cb12e85b6b76bba7c9b9398dfc00f550e32c171b4d5f2d9676063efee0b0b49660c10260ce052dd00addc3359e35c25dc33066d4b05bec7d93f71e0ad7d5ab83d844c7f33137894327f464260688ea4ce9847046e7dd0bfa48d4e15277a9586b4742daf0c5ecc59aceea6867068b03c20aad38d04a814472287d809a9285cd4dcdbf68f3f4ffb794701f4c265b2dff4aee55c9815938689162e08309df150538e60dccc03d495adcc560fb831444b922a6375845cef5dec56eff2910b5bde5f25f0e550ab5a13205de91d20896fe04a8ecc2c83d1371cf381424f8c43d2a5ced374878405f52bb92f4fa3c15d29ec151508488f9b4e42527921e245a8ee4b5d6ee95797f6ec4374d79acd7b467454a1d7eda05a8ae104534b23c46b27581abed6afc3ca555202dda94fc2b93501fe78867730a84f6f726dfd7364bc240b65d6c3022a04e09c89e36a809fbf244cc5522315110e9e33c8a4e1f1396e3e51fcdd53d9ae94fe7bf6c6ccef0ce02048a11441de3c25aa9787c577501977e486f8dfaa4c81e3183e648311148ce5cf3de56878847a9d14c0645777022c158670377dd9553eb63eb17e19ebb06202be8fd9bc2b24878cc86f9938e5996751ad9ca04b636497199f7f27dfa0f5ba2a01c3a491bec6dc5113d127f6aae38fa07ce7539a0c1817f7f0de0da538f4d85ffa394784a42eb50994e28530e3997e3345db28bafbb836fa463d34146d9f46d8d2b28b3954b9bc7f84046828e9b55e2fd663e562aa95caa97873f48f0a003d2251fb3ddbce0b6072fc17e0d3f99b655b8f41e8e6986ef7526544222e2d402489eabed4c219540605b9f5dd321ad902708601e85bc874c11efedd072aab7e10272c87b08b9457223de9fbc3abc2d1346656a524e9c67d79d4053c4257e886d6b430f5b7f57b2e5e92ae69273c1705a3074d5066def69fadea1af8fa9b3bf4890f9cda4b1833e5ed27f22bc4fe4cf452880c7b53320bc7cb748c0af6e7550ffa84e4714ec18d208131ae9e3edc6cd6fa2c60ab8ebc1ee56eafc01fbfba061e55014b9711eb58fdd01f8936d29dd081565de0b175b02989c5ff374e6f58c3383e9bc00d8a93903e6a221c7475e15aaef77594849af877f3807a76e03bdd54ff0b192bf34385d24d858d6f454810ee48141d73e3acf1aa3d19cd4c723a634cd8e25b4fb604c744e408dfd82961e46e8444f001d0991af24b3b6ec57ba41fb45122afc73ec6b25f501f1abd46181247945729337bf5083e5821968502a5a696043ee696c290095feac000957f968ac61ccb572ab2f37008830ab9a81d02456190af99873450b52df1888c3d8b6b13df65a9bb36a4b6d0538a0f179daebca2bed6f94b4670560fc5471c3770f2d004b6a138b8243068d754fd246e9881242638c6675f1611f237146f6e0f72ff2fba96f479fe0a662a81f40928f5400a0bbfb5ed07a87f457d5febdbdd6f323e2a59f749e6fc8a51d08b023734c762a91cc517401be57ffdf6a52b9174ea153abf2190ae2642955c3c02b4a15d72456c9d2f323de6fabbf56dfa3b566f1aa688c86b662bd34cf2511cc4a30621b6f1f1ac382bc1c4fa4c0d4d5a30ae90a5e54a9fb4afc1475e7c612eeb7f0e09e894c2004cd04126df9359d525d7f090e4b531916207c38c3512341c84218c86fc50061043ba1b89ddfb21cd756b391cb53e8c1cd55352be05efe562669e3986c022e30c79a97bdf087889a392e6da0d72cc7ea208aaf23408df23f3a9ea9bf9a935e49c9994a37a5dd0faf1267d5f7db47cf64ae1d3ec166466b2f882eb21698aa375cb50146c0e660e9bbb38d7bbc1c1c6d8333f7031d6a", - }, - { - "68ca38fccd585eb14f953358220027046c14ef965478d3d8f206f63fef4fe3571a1b53e774b298c347cc1b69cc426d39575ccfabd5a284c7a87a0698cae9efe40543cb79f5643c3c3057a5fc991235f06f059c44a7200b509a12e864fbd748001a14790f78b54ba80cf0a4a603da9672df32b68652c1d6edd3be51cf969acfb0ae49c026fe0bce0bfc72b1ff4c47712b7a27b2cce888b9bc470b8bdda55a8d53a34d79a25947ad55b95e5406a5c5311fece3ecd46ca590b3b01b9055761da8196b21bbc468681922c66d286c32598b1e3d77f2a91d835ccd9eec231409cb2e74ede9385552517718be9f84f0f9100e368701dfa4843b7222279537306065a54d4edda3a02f1ab9edba3ddeb34dece9d5edc8797103eb942a80cb5ae130ff2e7eddd11f0cecd8f9a615d75963c44238b10ab1230d9db7371d8291feb2912d306efe4f7aea2773903d4be9a00f2bd8c03589e342269a79441c0b42ce9c6fff0a6e4e845876f7e9b342d25351fe2b1233b4f576db90ef1facfa617b96d17aa03fc824973e1c80f15e5344b0516fc28424b7faff47ea1ef4e47f6f7b50e91b8fb14027f05ca7e1bafa266a4b952cd0b9e4cab82bb4d61f99568e14a6772f36296f5d19cb04fa86ff20f04ab61d1a6f01e5282c99fe4c3254da46fb5276317be58e94b1928e3791af27dc6544f6d445dbfc7275fbbea74f98ee4aea647b654909f9fa9c88312d3759099c9d0070e3db6d55506813f8b7abe602964a7dfb9387f58e237dbf50b4185a50b65ac099352dee8695017e4dac644f42aecc3e415333cf76b08fc764a721b45d7b74f6b0a2e43637e5b4849218d3d4c6a01208f345d76af56631590e520d6bcd82627d2446b45b2c68e0be81b3924753a54f47ea27b1e08de2399b34470701c9697eedaf3248db9b28991cdc2c632fd1b376bbda279b6709d5033d1c0a3ee573bdd222ef1afe8a4397a61fc30a4e94bdc55097ecebfef6c00133dc0b72c17e2f93a11eae9fa9f1364f10fa595e8e1623dead10caac068aad3967b9ab2837dabcd8f96a77a25baef16ba84bc93661ed150ffddfbb0369683cd021e8f959c2b531bb1fa95d7a574fe5ff9aae35fb9b4a0a9829c59b932ed8634fc05ca88211da3e30839baadaea8fd9843e0e80d9598a7282500d157ee579cda5d57628e7506617d301c2adec5186708f94f069ed7bdb70cbe88549cefe1673d48c9bbbdc01d2af03945cefe6e25f757750de64cbb9d496a25adf7058f5e32c827fe75e80ba0e834e6a72344dd2aac4228828ed42fd83e4576254af5737dcd9b6c338377d46baccb02d00fdffaac12133ea0e75e791593ef3aded4ae4c9249b8d5cd20aa28cd652b9d750b88111d9b4fbe729e27882206b2f0eb614d7daaf6436816fd80d452ac71c7a7f9e8c595287407c6ab9fe8a242e98da4270b4f1d4ea7243c27f89ed46a567c643f31f967b5f12e518106f3d3e08178078cc714cb6e39079631966a9becd6f02c18e983ceeaa2106ba9043f9985b791027eb5dddceed563106bcdbc48a4ac64bd95e87c708a8cdc33811bcd16c35e193203e70ef2bc7203183fbf60d46bc581f1bdfe62387b3e6c0c4a29130d872c3f8b134e7dcfb080e7e03048c49c0e468dbc44eff4b02e50bc6889cf7600fba58c0ee409ce948aa684baef4956fd8fd4a9c4c49e84e2ff314b7900b179fc66f5fb4affb9ef7a6064354fad8c3d2d50e6f2157576f864a843dda8f547955c4d80a73d4a86b7aaeaecea886927a5ba0e97df740ec7e8b70bb650010df55d4b75f478b07b205b560d45de666d84206c1bffd02ab7b8d1c37f21c47d1711b89d16214d8151a8e75eeeb5c54c39e5a855d578708d314240a064051d8b26c6183ce755be38fe9597dd5b5d198532b1db083a4b856b8dd60bf1db197cf1df852eb6daecffd97287a6cdd4c05307722e0fac798507f75b03e9361d5627ecdb56a3b633938fa61b2673efe6c6e768e4e7055e6c1d55c7113efd3e95151b606bbf169f4296455dccb93da370150c54fc11b3682f092f30381c6ecd218a3d9d39442c8bea61d9a71b174a8b2c56e028689380879cafb7c4bc2691dda0cf6ada039755edf93f851446df9f63267f8b8f030c069fabbe6457d4f63575b5905fb927a5a720d52c351bfbc48f12440a91471697e6b2564b1a2b314fa0e6dff090079637287b635d875f120671561102ad27aa83d9f0cee41bf023bcd703ad670b43ae23bf01713650834cc1e95dd486757f0a4f6fc9337bb95738805ad5e756198579c886eb0ee77e4ba957997dde0eecd84e4c9171c84ad8f0cb23c6a289e037f3a8beeea7965ce34fa47cbd727baa4ac9e6dc3baf17049fd2386674b246aca5ef6b8496f1d17a3175f6fee86299232c7fff682f066cbed895155d475bf9fd4b5571d257534c88c93377b1a600d4c280d42aafda975eb32c740073cffa610b5fd2dda7262a2fff5da7a0f3a875c62949e0c9247827d7a49bd8185bc27967124c34b9725ee961bc8102a029786652c2571be6cf33be63cf867c2b48e5826b31b714a415fe05c27f0862a870d8fb33200719ef4ac8530a4ecf2597b4a7f2e66f078a7505803774889a1cf963083c831f46725a1ec5545d8489e53921d81f80ef99f5e51a2d5992c7769c2a7ec8bd8e0f2fd81de53c7b69b650a2d838b269185c5efd668c470943bd956e3c5e1bba5d3b927b10cee68a75372d4d6fdfa6782c05659281bc9bc56a2123967f4f50cc7ae3379ba21e1617553354b5030b3d3f0092c1824f5d47b97e6b4fedaa90aa2573e1b115ffc72d44fa8209fd8d372c8dc9ee00193b47c2a9a302875da331731713243d02eb5a57d5dc51c35988ffd742ddd75c191f1eb2c2214a1fc47b82db8ea708818262d9583f2b1b98a40b6ff6e94742f25661a51882ef28475aab12d9422b6ac48e341cbd6f38460333b5fa1cfd4d0f43aeb46c21938468fe3f7bc771972246156652d2c58b18c8cecec2dbbc0feb0fae9f6bc022e029111f94e8913c0ad741612a1426b53cff73fbb24fb7b22ab750ba1310ecf339fe12ced6a3fae17b4c429550794a8d68be891b0e30cd28e81de2fb2ecfee58bdf11794951276005eb8a5af21e03c8aaeb595ace652c5ce60a8b98f6897d82698ffbb2e02213e50d9d3f00bb42c8652d22bffb87ec576ef6e206ed6c846fd5136a87f38c9ad899371799f35a6258878418830b04da79fabd80e7290456fe17c0850a4c20e2e657f97f4a53e1a3db65bb5e71bf38eab9f56aa11e6ef71c85b8a28f04c271", - "ea196b6a64be4b0799b1c2f72281300c3a2577db44e5d3606b8b02fa8fc46c7aded7e442", - "7c86a2c06b7520d60023d18fe73d09c514ed07a91d50d8fd5bff00e7550faed1", - "952f492fe00b26028c560fc6", - "b3f3294815ce461c8843172efe93f73a8254e58a0e71953e35c15aa89a7bd9dfee967853dcbfba73d3b87fa60449cbcabf13b1206d0cb27d2c3fedcfa695b6d41efda37bb6db35449bd470a23787619ee48f981d3f0b1c8e121725b2289b6d67858a4f9ab41683bdaec8a913ca2cc292a9640efe50fb85a1d1f7b286f45d4448f85b3242f45ab44e3281d759db24dfabbae4259f127d6546ecb914d7e93e2c19230c67fba8a6cba6069023ff7ea3d8a170289c2b4391bb97a7b899228d032b36186dfbb29ae8f0e6c06d753f4c6b21982d49ee682bef50a5c2c8434510c5fa2b9c0349592f33f8d7ad6f7243d42b292aee6d210c61e3f898875b91a17a89148275031b74cb34e628d7b701775dbfcf87c79ab279a73dad14d8eed365eb9f29a007b7d2ccc07ceb8cdcdaece67fa0166e135c9a4b939426882eeca98ab887ed2e4888bbebd5afc9f2da3e9162527262b0fa85903246bc8b80df3060c890ebaa516781a2b2a138b98001287e12a9c68471912dd297bc0beadccdc31a27b7c726baf31510cd355a28e4ef786b30084af66ef135909795aa73814cbbc6552270d5e11d46e9497ba30d6d8cecf343d16e7e3357bc9bbfbc7c1dcaa5fafd8a9b07056129da02e6228886463474c5af1d670bc14cf2868b816cc71578ad807a37477341c8192bfc2e8b1f7bfd58827e041f70384f92bb4c6acc415dde5099a1c2b27b709f9e53d1dab07c87a042ca4af7a2a6ee57b37bf2bb42259d372ecfeaf1dc55ac3a9f211f16fef3b2d5f11dc19fd1f425c14779580b2501ec6e0a84220e7e12baf9e0fee3e8cf499a7fba6721a746f598f04ee8ab4df31fb8fa5ce2d2419d5551155c009f2780cdd225ec2c19f94fb9c8b785ad4574b4da766eabfa696a1994e64a2518d1bcade6390cc683a6e80cf8b163c3e58cfa1134ee743079347f08a89c81478668df32ce9cdd7b853db5cf7af13436f3bbb11bcfa8f6b6d727a1df84f99fb3a5c248b8fd5baf669b68fd9af45298030f3251bf0351fa9b58b0b9fba53ecfd838300790ebd689744c1b7b333fbed76c8fb96fc669ecc6695ff5bf8379dd2a3c270af858cc60894be8922d69fb9707bd2a7825f2eec4a5056e5e91714f4dcfa86974259fcbfd5f20d55923a0a9936fb20e5ae9670e2019336e15f530c0be449fe355a7a02c0938d60720d5b8f4f59d2e4213ad5251c6058312b43d47c44ffc8946a98797f5ace279d3e126da63633c0eff1c412febdd47817aaee466c639e43637c1e179f606780ab490d3f0b3c2d79709f1262305fc87c02f68da2dc32f8c544e7b358c3a5d2c27986a19d13fe736c60a3524e94caa55e853eedeece985d16bfa6c487bed6583436cf82077fcdcf90a05f49db50588f46550f7a0c3a1cfca902d66d25dba8d2c53bb5557cc1d87c8a407898b3c30c4f0852df92d839859c191228d0a47324ea9ec2e0ae84513cbe4ff4aff85e77b8587f1044bcb9775099ebc2f28fbcd1cad58a8ce1f072f2228f559fbfdd8405d86f8262c27c3d95e01016b343c6a4e59dec81b59bb6e3c6109a4cffffa85e9752ed2149b5624417c0dfd1a27bd2630bf59814f15820c43bfa317be59ef6f433c95e8be154a8ae94765bcedadebb717f0d8c24e01e1952bd104ba9620f067554ae0faeb78f13c622c45d97b2b5774a3e30cb07f2cf0e8b19d1266d8a8861f3772305e24ec5c9cb714806c7d705a3bed6385f8be4e12562e17ec3df01afb4ef6f7427c48a1bc0e64fc65eb1c3d3ff2d6687e4c275a019f5ab5c63bbe47e3680fb1802d5835c4d494f0f394de1ae47f81eef005127d0971c4589c456ae6a69855f35635c28b590c1b93f155fabcab59b6c7cd8ea1c4ed1f67093aa782c54329cdcf9bf84a40400de707b894587d6e08cf7fd72fa45b6709a26e97ff5ec1269b8042358f872a79e8c2db1c7ebffac014d6b6f71b0c1c1945ddedaf5b6911668059b61b55eea4737aa307c829309c9ea548fba2bede023849bd61b5a467cd1ab1c61205ce64301e2531e5d58d03c74ecdafe1f5b74627be8716cad0d0a0be60984c9f9dfeae24a6c4949170ce2f589326e0a76c447a578ea3a5e4bd9f18884f18843eb1a78aa2fae06a7569a97551b227c34d429c8e1c8c5417ced93c30dcc607cb32a365d87328aaecb4ce57ab8e74f0d9099e267cfb747a3bca9f76b5f6dfb543bc4b5c06c3646062ec14f511058eb2939601913f8a0f1785249cb72b0bb1c12a9508b23caf490537eec53f614f3e06592eb61f75c1cecfa514cf7b500b0375095d5db74556220131390b77d0db72711c0c7229a5769b1d2b3f5105f3a4370beb1cacbd93ce32f89f1fc833c7949211dd204616c013a3399a22f5325f1a00008f4c8ee7dc5bd7476848721fef843123a6213cb0c0b6ae84233ed01a77a115d06e08990b8e60cfa4f41dbc9505cfae76463278b6c6b5ac7c3b83284caaba4a6a1d739c392528ff5b06bc3b82e98060e3001279a44aabaacc661fb14e7581d1235940cbe067c6b386da09454e0467c785ed0b65d41ff4cf36ba5f63d3ff2b45c11c6c22d3ea8ebbf1d52d770e0ebf2ba0c67c7d3641c145cab474a88119335990137fa82a340c2cc8c453752a3aa801127a47aeefe66d1af1a26ee1cd0e6d935bd548f6ce33a9c204be02ba08f9fa03c685665375db7c0c656ddf3e441ddd96b0d2018beff5086cc63339f26bc8332a5e6a1422bfedb69187a3443c23b630a28b02f8075faf3ff2fbeef6cdf02ba4af47a765003de2254b69f487bb5d038759a33ce6885611198b81b0b6fc5d7a531a7a90dbc3556aa758db1657698cb3698b8207b1c1b589efe5d52790667ac483dde9543953c6392d5eb8afdafa205d325e314f810e9c7722cbf5bb76fd6502733149bf21c60717ff5bc366b85ee9f206bb1f330ea72f61a9766090eabde747b1eb9c046cc8713d5a4f8d4b7dcd7c61f2496c5b467608cd9260382b8f11b04c318a5ebb6411a4c7fa060e08c295c6062ac644bd3d10bcbfcfe2e3748eba66f65d904ff21147faa8475f508f21238d42f62b697249b9fceb905127f7684c8130cb8663f09cd25ea038078e1980237389337d1446c3a77bce41b37b50b9c3a020526e7b7b3bef370cd7af71b225700627060eb65693899d277ed130ec5ed9eee75d4886f31aa93bbf302e0c69c9c4499396b43dceb67c02fafaff8b56698308393a03f60babde883f00de2c66831f024fafaf98b2fcf37a9ce01d4f34e95c9408395716dcf83fe86c7a0f5e3e6741c3b63b6ebe9964f1d5005eeb732ce66402007beb3e6a087053", - }, - { - "9100c5b2d7c5d5a854bce55e82f94b89a268da7b66357a661dcf75cba10a1b320ae0e4e1a5b989f9766e57f867a3810a0b5b857191ffd7aece4c796f5694a2617486421940cc12b63a6aaea20d2fac188b318a1c3061cafeae436e04d710654b96a864d674768caee03a50ed6afc06f52d90115df1db5c9f1ecaa4f5da094070b1a447251ad3d4fb0e24e87821ee6d4e7e7eac7059080f77d2b36cacbdac1c6e5063946a376865458c4ebdad3c2afcbba8a82b01b03a7882eee42eab904a19e0aead4ae515b02aa2fee74f3a114bf5b9f320baa35b3225491653f4a69e0d864cbbd031d0805b727e42c2b9530dae0c01cfc6a42af8ca730e1d67b4bb743a072f0a38008b937209d534c2284271344340fae76af2b1dd00cf44b48ab8ee92e8f9cae8845e5a8d338f505cd1c19014018bfb6b7dad487e7c8c32064421982c1a63149ec16f2bf4fe7b50cf3ce1e33d6cdea8e98bf067077c9a0ec1bba6edd5090273ca719ebf6f1a0f3e56f021945cff3c468b2dad92a947a06a024758d7505a4a1bcbe9da3a03e97859da99ed36982a7c23572ab60071566b749dc34bee1d9609e87fe32282cc9adba633c9ddcbf359ef4a83a54af5fbb5699978b487954a907dc9739f4b3f3927e66cf0c338e31c272da0cc7795c72dfe60a5b2e73bfd77b8c6ea58122a913910fe29d3360cef5d398f29b024f0dd225183d538bed2b076989aceaac460e3d45e0ca7941897f151261a024b0adf6d5b62429420144497adde6557a3c53b7723471fb760b6a8b1dcc2b327cd939528f5d7bc16ec00ad99df12f082d82bf9fb7318b3d3ce5b84ab1e38d2ebcb6713c03fd0d62bd083c4af96b4316ee02b6953431c261278aabd96e28f81adf7946e3664446135c825e45ed916ccb941350c84523296cadd5360bfe3e16dda75db10da1f710fe796f3456f0911294a4735cf9968656345b9c3049ca47176194c86f36cf702538df699fcffaa254af15b198ac37eed0837b00cd3547e496ecacf6136c6648a535a235059cd75a3bfd0bc49933b379b72e7a8463c268faaf05f0b27256fb179c9d4c923a13ec6600f83aaa2bee13e30c8e676040c06aefc65ba238a29d403f3a8cc164a0bdcaa1a5f54bc1d35fa4efee0c402eccab1e92f6b0cba94e1bd87898a9dd3957a7eafd9d26bf70866450646090833d4b91c032428bdb9097b409305de669a58e44931b7b428bf1a6dc56177cd944b87b04eabd80c64e287a5758c83db26dbc06f0c772335363ea2fb9f19c833644fe3b3fbbbbf5f9d460412d287eef862ae676f258aa45bc8465667601e9ac46e7d77693936c8d67ccde94e54d746b785ad26aa38ca0500105b6870790235e780ac50b9e3198f5fe678ae3a4ff4f1d4a2177edae183daf2de42625845973fc544907e27a90d868f8634c9d529bbaacbd228a5b4ac7fa68ac208e207a022cce4b24a0b5b5791eaddc6b3b3ef6e5dba41855ff531de9bbca0a39ea743c0732772bd32cd15c4b7f28a6ba579d902331a88920fb970aa75114e14b891d42cb947e9eb14feafccf1393796b21099e52b21773adae8e550f93364b1c438dd7d7fc76994c51860b652974d04a7e6ead207610de149f231422595f4e9ced1674d98d0e15ee841143ad8613f804729524e8a5f30d451611676f70a60c5dcc7127497f4d27f35e7ba0e48f98e9022e0deac400e809170970867a1682c7d2f3ef2c632c44568abff76f4f804841ae462c7247147b6e1debe48802674fd55b2ef1be5b4604d5f60c35358c7d773ab3a3ad0ab81868c6044d4e06a48ddbffacddadf813a2ce09aef34f3b60b666245a032f021b87c81fc506166983f25930cff728d399f6dd48ea1c745ad2da7f2cdd9e3ee915f708db0d1f3481018db1c174ea950ed17247bb8ebc065186758e5403bd4d19a445e4a15519326696e4280bcecd1a903f525bbe1e521f94d79df8db4b35f4ef7bd990c0f2c32789a75f95761ca0064bf251fa00b409a58b979e56d2c44bc2302552f118162891bd78272384c739c0c98bbaca3fc46fbb5bfe123eb25df0e27343e38b5a0c2d0774443af91b64b9d4e0649f20290edb84fcedb3bf4ba491bee8754a32716739e5ab64deb6c9888bb9fd2ada1629a59b16934ec5dee3678dcbdcc7fe5e2f3833da9d1281669b1d108837eaae5180396813883de26b957037623825b0675df431fb06b35191c06229f84cc849ccf1b1e079efc2e575331cd77b3297d2908c048b82b7dd14883f3e707bf6ca38f87c19625bec47c11f54988a97205d27ac51a32f19704391af72021b78cc4461386dc3844a1b45596fede3f70e311eba92b1d9ac221d3dc19f3fdd080c2169348f2cc8c9380e12a7ebf69efa37bda4ca6f7e66919b94532ac43022c0518c04d0a8cd99e0cbac88b7a317a1dac5469534b4fbc64080196b44498e149b0a196bb2d6f59392a21c4a4523ec1ff922a52de790e42810fd9355471169d22b734dde4a3361ecd57e271a92132a8b35cfa91d508d45618ad8c6c1ea209405a3d1d3ee1535caeaa3f20546052fc13aff7a584ff79db1726678344098d8563caa2a2abf6fe5aa03d7af49dccf1b17be85600e7cfdbfff54282394b0fbeafda615185574fdff78d59ec2a26dddba1c531a1ac007cabf5be2e2f0a3dedb9174e0a9da5597c9de6d68911fc66ec9d2b1e3fd71ebb83147ab14384ee303d067f47a324a01fc187f54a98f1b0848fdba2ceb3c18936d503e71887d548c4dbc70b7eecac9ead3393f8cb85a84f1484f2e237b36b6d886f54a0f629e8bb05b0c6839c722149a5b541703aeac04e6eb230a5659b12ed0a668d018f75bc94258218c1f5390b9aee4c0b2836cb76a47da649e2425bcf4cc15c4d51d109e5f78cfdb88137c31b2510264e46f1c4eb6e6b3450ad901ff9517b47a24d508844dc85fc5dbcc079e2d09f301691f401ff5f36500cc66f0617eb4dba389d427c7ac778d78438506608f0961f818a2080ea56d0f61c40fc342b49ee63e730df61f757387b9089e1987977b7fa02d87aec2e4be24b8bdf7fb6286d190f9df870944fa910df32f178ab692fa56b071f57366a3981f51800ab416dc4500abcc19e0c6aaeeb9ca063470993ec749a0bcbd07604516b1d51175ebedbaec8986f67a4d9158f75b5f3bcbe86a83220b4fdf12a0242951f94ac7d52882b1b209b82c4749753ea4d46a60bcc4f3eed033bde2d3d20c25cb46fd907f7052217a0a4db143b2efe8875a59441f4d22ef70d0c244b2de6a7e15581e84c860a6326ae3e3aea6d3972e2de0623d2d852c9e65eed318bd3d86d29595575df60d9050e1740f884796b6657718a294adcf2303adf61c6b23933db93885172e82a78f741b8efc6315a2c88ccb6b11692a346cd82a79334e0c610734e61e6378b5e2ecc161d924778bfcf4475805a0823a0d5a54768d9272ee99b7c4a81b3d5dfe1a2f5ff34", - "3c77f30bbb698b1571aeb54653fcae2c23dc16be58603f0c361eedd813ec0c4f63005a1e69e533da93e820e6e4ce1308aa29c60289060ebf24fc9738e8a4874ca4e26a0dc79ee75b8607416bd554737f", - "0223c0a6052bb3cdc99a284fa169ba76be2df53b677642a606090a9267a60769", - "7d3981073f90c6648c5e9c74", - "61ec5230306b70113f67b340575b77ef76d521ff75b754d551e4177591a02351ad382b2a4067f2b3af7e8e15431c7133e98be9d8293d17ef40161dbad9a4f1a4f30cdd557bb9a8b03b5f1b277c850e23ecfa0fc2ab1102e4b1d5e836a606883c3d43527fc3aa26955964b144a9a56cafa7b174d72a0635b80e7b4f871ead3838a955a14c4b8c5c3c66fd86a5e4ff10dfaa92105378bbc5f76ad29727e5bc4779ba3e6dc19bf45020f6ce4dfb3400df05cac51577d58eec21b22839b8f055226b204e641783bb3305b4461172f1c1d48eec56fe6f82aae564ac6688d7b0994747d9b23a24418e69f8a4fc548f854f86baacbdec78b7597b138c453349034c8cad2ff272781e0e6799ef2f8addaf18528736aef21ef8c2d213161e36b2c7815fcfc40747626e0165684e46a9a2275c533d548e52a9952a556168195d602ead86f6bd699e97ca59f4cb2050ff148f5bdfec358dc4542ff2f700db9861dfe5ba377ec7fdc0fcb2501e72fe6873c7cc76b95b4f300857f76e6e6e370119f403b556115b19fee7009f4f6675ad2d174f44002e35ddc360f309f20a3a1dbf39d90d7e5fa2106c53afb0bf445e4cede59cb50b8a7a2c0961d00b2c251f2d815309f74a46a424838ee87f1229273ff3b66dfb79e3b1ce11bd60e061e60e3f37bd7ac896b618cd78388590f44b1a276b965a4b95f2e3a7a175b30fb45dc7a71d4b3a1a33e98af30dbb46a217c50046ac21b8bbe9537c02f05a5780c8a5d796bd6424fd9e9f3ed5932069bc050bf4a1898a0ef0ca756aa2e2269b709cc92e0c5192ab49d692143388ede2bde4923c85eae8f59db5c7711dabeb33743c692be6dfebd815456958b5e1384a109f891f433e7b4a1031d4f30478b05766dd97eb964a28f2f7b55aa6c27c7f4ebf4d47ee8709bf99915426b3896412a855798e392e111789213af537cff7a976b4509e0eb6ffbb8e886a3596a242d16d95109b0ff562c624e06636a3611f804f9b2e252afe8a4e5e868b48e9e734f688f2da2012d7fdfe2d3aca75fd74730a85aae90353417fd52b92d28a5098b6af358a096b859859916bcd5a8f779676c6e04ea461fe62872050af92d08cdf1124bde1e889ace3c923457ecfe0a635ec757907a131ad7c2ca3f60e1317880f843c5e63f4ba59ab2882a492dd1e070b070af6f60e18cca29541206a7b267c3f75a5327fd9b8ffc9b36b57b73b36e586541d15c85253e17a2581e8f8a1518f275cc79afcf2b5c88a16e9bf553e757df089b5db90a9dcdc1867b788fe75abb5161dd7ee1cf37d3f0faa793ddb1bbf1eca13f4220ea63af8ef7c0e7144d999ba1c5a983e74d48cef708c1d28d3c0a168ab87d0ef70f381693f0d438ce013ffa2cba65a8cf6b498a7120209564535b7372690329cdbd74eaa76765962720f06aae58338a10064ad80f5a67395db2c31d36b1f5eb777306395f192599d2f737327afdcd9f14b3f24155a3f974915d3302427494fad756703b13afcd1764ef9735e7dbff920f1253cb668e9f40632aea1e0b4620db162138e4a97e6f0729b14be4a7c3256250d5e7423ba1238c704503c51cfc9cb68db7001b2f597a15e77138beea02e11e0bb98a72f2a77b7260e9172fe7e60483114ddd836addd966b69570db5eb26a0cfc4f8a8b80d26357ed51a70165bc0dd11ad7467688025bdb532e7222ea12f23c44d08d111b0ad4acb2f5b3d6b45c387d541ffc84466ed57acacefb1436ef00bcb5b6211dfd0650113ac369b9f3e4891acb2693c377467b1e9c949cc0ea6c4a72ef9292964275ed397cd2b1ed25fe1aa8f47e90cde362392da5e53893eef6e4f61decae1a75e3b726f0596f09c3cba62aa08bea89984b484d5768296a5afa8b0759dceba530a169d22b81979212b3343db35ce4e4766dd251ea6a47f5033cc090d6577efbed441bb4f8944937e812f12ef17ede76df621bd4cfa31567ade18b74583a2b783279150d584ca13c0d4784b70156afdf9be8ae96666b82def888465cd3df349de427d5f5b3572e4f963d33f968e6780e381ca196bc04a6664fe93fdc8558b21b84130dfa2a646950eb2e927885925af46d7a28d1507bcc3c02ba98318bfebe5b9eea1bd47935ad869eb701cbc35a9aef5efad88ff54eb350a34ccef2e159de8e16135b81105bf799fbd86aa11653b5ef93a1ab1c367231d61b42b8bdb4f04d8d05396d53247d51890be9b56c51cb19eec0fd1e6b8cdc98376b6c6b30963ac7ab02656ff94dec0e3a0eb3f3ffb8bebd99d5889df98e6c77093c370373dd5f17871fb334c7eb12c6ca22deb75bdac9eaf24281c965dffe03da9c940e13fb382fb6be332797813710a7cd2e7720f5b9e53fc0d98fcceeea4a8e9f787e670d60bfc4a849f34571e5d09b9e9c28cdf2b2d888eca9bb31ea8b9239bd19dca86880ad3e12b1583acc3a6d1f0a438ce3b5a337487279dc4ead1b214272d455e6a2c8cce4ae3bb29abfdbe77a67ababeaff5dd9c96b17f589cd4615c0209eba5e4b1c7167b4b739ca4b9957185961529d1082226f85068890c94aa1f1c244259ef7b120e40114926a49c4412b67b4caef1ff3ce6f3aea3c6107b830cd34df9f4d73d7d978b6b9d5c481e9d76e83d649e742b098334838fe50d80975fb567642d3b72c461ef3072ebb1d03c0099e97575bae6a12cd2352d9d296351df6965d736d7568c2911394a73d199743526ba54dd62c56c598f4e78495c0172739274c0b8c96755e489765723a24a8704093a94544f6c8764dcd1ce6b4bf2917cfad27d85e4442b4e5bd577ea1a88c2b79d61cc1be01ee9028235b36444483b4e45da1087bf6d45ca540620de5aacc644a0d5c4b807b582c7b058e140eebca539947502bf73c9abc81a0e3a618b39d3a38c4ff7f94767fd7e6b9eb61e629806bc3d183bdade7e369d180dd2f57fef677e22ce41be7224f11723a85a3f1d14d7b72dc98ccb2816b77e625ce3db3e2c5753af8b079e0d63939079a01910ee4699cb405d4d9c60e4ac86a7fda3a4c9c290662afbdb7678c3a84c87ff83470fa8a416511a06d3216a1445699d7ad7e6980491fd596d39762d576b08fcbf0825243c1fc01ec8300780857c429c607113160a8354f6699b368a87983464472a5754fd58943fca6f6779764fbe6cbb510d5280292df02c4a7ed9acec8c95ad67ebcda71d0f519ac18db9b43b28244cd34fe02c5d694df57410eb54c5e1ca0f8501e7776a811d7ee81eb9d8c80b2ca50a012b5eecd5428af965b217e7fdac80be88a01f76d473105b027eb557a523f13c55e1670ff34627667649573e0f19dda41c525a8c96c2866a88bd73e66c786767e1657960f6676d8a22be1c6024158a0f0e4ec761148b5a3d8ea481d8fed94855be82479ba23213190054f937838f0e35e00aa74c89b294c29ea25ad7e96b4b6fa952ea8f1cbe5397b7c86d0b74ccc25e22c88736b045fe86110bffa0679f28a1f27162b51410498cb7", - }, - { - "0fcff2c29cbb5cc40bfd2ec573ecf368275ade6a00e5730b77dab17e437b46524b3814e7f470acff6ddac4e0c6b748ed112657120bca1d83a4ce01e74a473995804d7c74bd28732a02370ac8ef52b600790d1284d82f077cfe096448509dddd0eb5944a882b7d384efdd4dde3003dea910f12de82035651e3ec9668e66435f519da3fa1f5bcda34aaaf028daf3068304f7b1ec18e65136241a9db281e011d27db5cc9c1099405a4430821e2488a228805314983966ce5d806b0f014c21d4c9d6a066e63aa6407ed6c29cfa4a3e22ca913762ca9d31271d9c371fe858f3b22e931814cdbe544b9416e88f6026b12bb8e88d8285beaaa35be1c24339b5f567480d7b16cbcf6160e549ef4570a0702889feaa0ebc54b11735735b6e2850d5715e5087291fe8890432784aa219bacaa2b874b075c9628cfed5e76dfe38426f9693f6bfb2de49b710c101b2dabb7c7c74f12de9ba8f75b8645d25629568d12bfbc7eaada63364b6f56569cf21e54c95d6797e9008f3496c506ecfe5d6a010d168fb7f0e2ee3c423492df36a133fffe9b87d7ac070c32cc131fba6089cb7d904b25812e03cd6048504f7ef1736ee00ee6b7aaedb3dda9c6fd6437772fa5076aca9888ce55e906a62875979bd477aabb2f4598d32342aa10a6d187c6768f213117a9ff6d830603bb7b9b475002e20b2237a4055ae6af6b8d70e343e76265188a0f07e7820dfb3d898684d99966d4bb9e78b0e95f5044dcc12810a89a75b11474c8fc06c6e734407db91a072ffeb2be6773a7c6c3ec939514b43daf29feb3aeb7afa57e96d9cf0492d90bb2c7be613f2208f5f5f5898b0a3db8a967a75d065efcabdd83759c88086583bb3d422c6c6425525a1adbd515199dbe71350b77940813618b88fe139153974c80d968ed4d9e3f97a91b7cce250a7c963f880dc38011250b9a131f2b76b677f78fd0e4cd6f1465182fd1d644dc42db0bcad8df4ae9f456841765af8e1c1775abf85a69577ece6f9e9035e36c88be784397479e713be4f5434aa4c166bc4702a4916c0c003a6baecaa182372a30af6dc7e6fc4912d13e662bd327829f6e85340fe130001babaee64d211d6761bcc52993c162a692a10cbe7434310392b64792a777a2b31341995072a6b7d4538cfde74e609dd1019a9f75cec0896186c0f42e3896d15be87aac5b11642f74e11d5c2f7de9f07f848ff543507ea4d73fa8f5683fc6b41831606352c482c7a5a013c51e0db59d824582c595f17a6d2113528943194d6b5aadcead62516507f178cd0f76729cf8b81fce4e0138ab224bfdbb8f16f8ea6196b90ef90a63f0fbdcbdfb5320984be8a80a26b932d1db7ecf870dd67fe838069136ff9b9ae087779e82cacf1b06a7b310ce6c439047c26fcec0364ea87e4549a544d540256cb7c3ef7282fa792aad89e919dd89519fe910501f5ef88da43232e917730e742ac2539d454e066feb9058f56dd246fdbb674dcab636585a788b338ffe41f4190447a65985acb9613d02669ad4ad888004c65acb0ca315752e58f51c9ae9259f20cbe8a668a207a5a46e30891bc909108f53db8bf6f0f11549e621d4cf4763e0035c867bfe9e1192fc421c080b25289a78f4167fe517852efdb6f3ccfe67ad01b4337da2c18f35bdc151c5dc76ee66efd27d5fc784e4e6829bea4f8a41ec8bf61ff998d178ce9f4a10551687337d7705eac6cd7fabb3f2379e31c1d01e4dc63e475f0fb01d9efa3de400b5177e2c2d68f2ead89e9ecad62cfc97fd0ad5b3391d0248dd2fd7c75dcbd802d3463ef0af21eb77b07a3286a72f1e9439f457630159abde7983a5c74f7dda12b40913632afedadb691d62003c70a46664fbd976457544cef8ea863858505b1c596e7f745d4a5fb657b1c694226afa9756c40d9c49425b323ce17a8531c5919b24010f715b5f27a300ee37334931ca9ff5c83c3f0a87713768ebccaaa15e35c56f3536ba945e5d954c94c885c68325bc4b51fb55d96c8d424849ece9a812af0747d5b1dc240f71609439f65acd1c17086e025e376eeb79a7255680cd692fc4b0f5768d1985fe8a1a387074f58c8bfdea8e5c11ed379b845ce2052a5b24ef0c1a658923eb87adf5b01e6aa59ae6937564ef97421722c67404cb9e5fe07d5bfad2e52ebe6cccb41ceb1eb2760545fb6a3582bc4ca572b0aa4e4f0a2ecc56299f3b485d980501a4e010576615ad518fd2d43c1f79aed013ed1f1e1bdb74357aaf7dc84772c9ec62da43c8ffe11a7fb3eeabc3584a936c37b28a438dfe78f89de6b0d5597ac1bc55057544e68fb49a6e505db69af122c2a3ad06219b7f2a2955db0ebf55c06baac5e0efac609436dee484857f75a8421945484ad0c7650a1d3008cc85c938208f19002b7994524878d6ddf85c763a65cb72a09c3a059657459f13cb584bfbd754fbf2de904517092be4f1786b2bde26ae8eb2d884592fc9e84395408f8117e47d1ab30d5fca167bbf07e41a33c230d240e3aac53cda9f251e24659da57d721288252fe7ff3653ae3e47b86209e9344accef0009b99f2ec7b3845558f1d77b89fc9b61ebc1b589fffd3261f71b9631e87541e22ed100e694854bed771358f10fe452fba61875a605b8080cc39e3eac13708e32518f28e60464c38b782c7c7800df63b6e7e95ced9154ea54e32900f6998f38eb1e51c112b6949e2eb11a96b1ea0a68c1e3b5af750a99c9fdb2cae44c5a1d37686ef87b158d19343e23daf00dd558cfb91e6f2e18f8e806abb2faf80d082f657717d08ca4e9c0d30d9bc30b612bcb1a3a3a3843231059dec344c6c04ce625b3fe064092e00175fd9d38f8fe54c4088efe30d211412be01460a6d4ad8d0a618b00a21de0a383de30ccd72f119b27a08958729a999e8aadff21829cbe8cfe398d90476e33db4c64981383a9aeab4a27f3bcb29d4b3d3b3a6ebdd71d3ac546b8658e269959630de176819b153cd53d2091efbddd2cf9178ba6ee98e1a3df9a095db0a2b713a0988a22239f5f08cc8f9abc3d67d9267f54dd5dedbf01bd490b0b09adb21d4e5aa7707e36cf77034f01bf8c7988a2e8dd7046bb2f486878436371f1258f3f7026afee6d7f6560be67103ad098edc9665e00118d4879f58bdd677cf2e6bc631d5c517acbb6db8a1debb4fe7492b7daf0b7ec7df056637c23caf926a1a589bef1db29cd81f547afd0fc9e459f46108ffdfcfdee43515a771c439dbde9177ceaf296a8749be0146cdca2b26be8c2ebd6cfd9b5032b1f7a375307f54c2f622711f8cf8684afaaf17c4da3e83666c40d26adc239c8d1a40024bbf560db5787ed404763d4e70ec6635c6a4b82c10f8ff7ad42217613c57648716ba94cb33129f3789dc86f9c8ec2e8e90e6bba0dfba1bb3dc3215188979a09f33346a6647099ed0e624c9ae10f83da0def840bdb25b718e8d86a616ff46b5327b1f99c22937920f5b5bbd6b53fa0b32f24befa4a7603234e6d94be51f00189a20b15c49e8ee58434a15ae9d10b9cf0204bfa7ab1fd9e006b22bebd22b036c4bb4c9949cb7ecdf01028d9f12466e144b2dbbf64d95d65347013e192d428678f64f0d9306f97208fb00a70d4615229143dd8890725ee3ba6021d38d6359055aa812edaf", - "0c5fb7075f5e15a6733737b614bf46871e29417e4b140bae6e10081623f5c52f557c36b4da4b5a4e82920497514b1e6f745fedbf73f86ee10976f82c6cbd5bc13a917514ddd062", - "e70954c812cac03e367e99f7b82a6dcc073d2f679f965d524872756ee58654cc", - "5f6267f6b3b21423267310e6", - "c53868c0fdc14e891ae1bc257fbb13be210a5d9cdbd9d18fe1b474f9a1929dbba3f25222d8fe8c1be3eef22352100064b922fd9642ad128a202b6382ae0a67c8affb0c5bfa1a80e55c1084cc372485243df872d677a80a3ef1ca3589908bca621f6f50133eb762cb9c05775d13db7dd3eb65ffd3eef96e8dd42928facc68390f6bbc50b17e1ef5ea6310d8756dd177be2cceb63a97bcceaa046794915589ca022d90756b02c22e8634c0ed44192abc3b8b1e2814c855ab27aaae3bdd801a73e6209fdd559ceb59a94fd98a66d12a31a643ca2f4b07ed910bc390f77ab89395d5cd1d783d8940dad4447f0452991b209cfcd998b0c814cebd08f9ff15052818bab0bf51c3b72ac1020d3b0974fbdf4ff941b1ab9c01f284fe82f2fd89c0aeb4b9fbb0a74ece08b3debc7b65e7263e2922fd4aba15ae3cba7885d04127c8e06a67f244e7aa4556f8694a5db6653f6e48d6de54f9e4024d25d3236d4f933205b6a358aa1506f832ef7d556c6a1bfe4aabfce51f3b5ac64bf6ab1e665bddb12fe13db9f07a55db3da3886df36ddb89f3a4939b1e9e5b701301570e3d01c0b947f498dcc6af438cc15e6038cb78a78986da0316cab67bca3e28c95e6b7e6b36cae9202cf4a77a0e15d3c3291d267aeee172dd587a944719b9fbe077603b4d39d4302b9a6415aa07af309a5e1cf7a9379552becdb4bc6a0b5c85d2e63bb141c405afc58a8b2b4188b3883a24eedf98dd50fc54725c440ccdb03514a6f37cab49296b6826b6bc7d7ad8cac0a3425eeb6866d94119acdad468cefe162a29e8831c77aa83321e8ae3e20e968cfe51dbf2b63f4e26c61536e6be4f63d61bbd06af38023b15f4fccb8ae0356d924dbf646bff69d1ac0d6e1c7f40b12d6d16e52d1c15958add5708bd38c514e47fe623a67c9ec211cd625b398fa7fd67a23e6e9f65d42dda2bae94524372fbc1a7e0ab3f1c451c126135536e73c573749aa60177dfb68843752b010e2cb9c1afaf51c94a48cf8ac7aab3fb200aaebcedefc6cccb581848da0121af92d9f4be002f0c2beffdfa65c36bec80e7f62d7009b1eb719d24b96e97059e6b50a52662c2c833738849f342391514349305228b29bfa9c7cf2a931558ca8e704c600148a28bd871465b23af499c11784aa45acd051f276d82789c58b14f12619372be4bc3a285f6cee21d65648d18e61752d6e7957736d3385f8ad36702c451c61ed475997d6d9f11c8be5257d8febce329aa701028aa2b5644b8515a95b5e866780e32754ac2e6f2e31b2c04a4ad35cbcbc25b23e9bf49cb1a5d877ca30880741757c29303af8676546760016f1538991b37cf0cd24ad3b1d877e5e1bd083e4b990af6ff5c0b28e530db3f463d21e76c928c8e1ffaa6c045937ea171a9071827a173e231f50e95430ae4895932c88ce048058ce6d0a50ca5c1842506158e98bb2912a61c7991a2256c97cb9050a4bb3ca32594622756291340561e9e584dd2e096263b6ff8eb898ae86f5f24500320d2d0ebb30d84cb4ef876a877dad23a611b39bf0cba5e22f2850e11c298fa23fed40691b83acc87136f8fa540b1dc40d1b0d0bd489ee9dad785c121955a094a2c6bd3353e142c04f7b88b2eb3305fd00d5eddb391b73fa2b16a6357aaa2abf2059ec979bd3ce06d5fff1c325bbe5c833a101615750613047d8155ac0c3a0734cc6aaeae7cb65d7501cb95f9d6d1161d09c961c0681547faf7983ed2efaf4e0fbb87a06169ecff1d0ee540a9223a73f75584441d4669cac09c2dbdb8aa2aed74eb9a2870f2021eb16e5f5c3e79a24d7110af4bece22a1086d27642550cadfa4f0e03f2c032a2745e1c9277a4f67fa4dc74ba056110fed3a63f643567d079c9430b8d5b3bf57a9b3f02d486d870229fee5462043b6bda8d265c745ddc1b8952bf91828d6db2edcfca7051e74df9dd456dca5e04ba469b9ff6a8130aab3903c05659b8f31cf4ba4c22511493a36541ff9d88c708dfb714d52a3c0356543e6efad37530b598bb63c3724772907abe4cad39c896c62daf5b30cd7d37eb36a7be2494353028c76e8d148b018c7bb755c45d2a33f61944071bae8316881e9aa37e4ec2374aac4f8436ed3c7db2092326538f07fc6644e0239899e3335f73c1e3c4602b12d19d7b639d4968974b6b2703ec1add8cd930cbafff4158f68f06aaac83bb4a2e31466e2ddc247ad71c5f4c49af7defd1394e21819cc24c78380caefb2ce87c0d1050680313037def12ca21cf67bb6692d6e4a9e90a9c9a0b7118ac300c6c6f636337aa25bc59cf1d9749dc183803cc0ccd1ff53210352795c6edb49ff1e5e8ebaee7b3eda6e3c0c340fa60594115e37fab60133b8a3b39d2e63db0bc6a03973e236fca801553912f93feafd8b96766049dd2066f3c5ac9222121ee9d36cbcd8f713adc8779949941f8a8dcc92ade62e46e9f1b292d5f7eced14c3bff50a811cb762ced1f103652773ef946e18569eb5892626627e085d4ffb3102c1586ddf88acbaeed903b22d3e7ccd8b8ddcdfddb872403240bc8e0e46a068f55bbddaf90fffb9a914187aac2ceedf21fefa1fe32fc7bdbb9fd76dcda1fca7b39107d308d11a118e47499dc4092ef0cd28d0d9af84440f095b4feb7adcba198894cd89a324c60ed0b996c520d4b33391bbbef1997256af7ba7ec1069244359066af81543ca23105742fee3480f890373d3205236bed566cd22a62bf69f8c0f27b714f84a203bca1605865e2cc2f9211389e0df7a4b3aab9d10826639357efe1f5fe64a1bd6d06d0b5605658c4d2d12e1bec77e70ea393b0a09043dd7d6684bd53f4c883f2f6928d99ba91873d063d43600f9105d503b11d8dc2b05e34b4fcf18e78b2b6c97d3b2c9249a2f6566ddab2a8a67fed6c9f8af2f4ef98dd579f2d4fb572e178489c503df5d5f03bee9920db347a6e734ed72ec7233387f1579c13725599a33a90915ddf03725dce20fd3806abc1029a20732380596057830ed63b6edcaa4d4418871bbfd58de1d1f2800588ed207f2016e11abd1baf1895f6096e2c75cc5916836a9ddc09cab4c28e53fadbd7d3080088131cc270095315b61011b0cea5b4d64b647bbcea54d20be1eec0992c72fc9c9771cae19191cf6a6f1840acec1deff605626d0a0d79ea8fe0af63ea75e80f8141fa8d7ca6f4c99dc7e78aeacc67762ed0134f1a0b053debfb9ccb145800b9818c2deb46f7124e8655f37c3291af107ed75384afcedb44518ca14cdea341c9657ec638531011cb957ed6b3434b736ae8c8199684cc58862638c5f6c07e1cbe8ae68c5582b1697ca9dbdd01e97023138a9173d6b1294cd99514a28102e6912b1c87ef22cdc611133bcc111e95c355a26b20a3d6f0ead66e932c5e1229b0fc17a7d6f78134c69beb362ca75017b1bf1105ac8970fad48acb8313cb3ff10e9d72c4ff11f95c2dab59575525c98653a9c7d31585a3742267c062d6ffc7a4303a3e81a45bf39e1ce2097623bba70f216aa612c64ba06ed6d596ad6abbdde69d56ab45e25ebcd4e485824449550232be26f987c14008f67c9db9d0f709f567fa44502b9e0839457e5f0aadec0395bf5c38ed8de7529708e58c0a895198fc8b2570fb6e68547630ca7f313526d392ac4776be973205f971854c300454d5", - }, - { - "95a17355dfa9d378a18ba20e58aa4b8711ea1d6e3c65e0b2d3c6382892c7d02768437d47ed50bf8edc619c340be7bb1cd1d88b0d3d6bbf1031f738c4be09eb264c686d39b92cc7958e63c9994a84b61b5c412999ace8a9dee0e2a29eeb8dc537f63271af5f3844ed9c0d86e6913c02ed7d2b862a132f08f311aa92fc3757342d89a5dce8dd20d5792d5c60be9862ab168d3140a061489472f2266f297da357064833ef2554c49f8120ff40b961ebcfee1d0f8e7e5722f049485f72c502c9cc4afdbb70517f0fd2a00e12596ffe285d1b37eb998e0e89d756e9491ceb13e83610a3a66122b533c2c3461b3244438f5f7a7af8088881dfdf6a29fb563ce38c4c8632ada8e7e06baa2686dc6aca6bc944e5c14d6e432c4dad554803912b8fddb1c18a59a86bc452914b2efc1599c5597f87a6edcad33a7728827bbaad0a975ecc22b7748d7cc71ec7f51adc8fe0350e67dcfb31af35a8d7b72391642e29c2fa4b796ed8f535f6bc2b1198baf1cec858aac38959f83130af55c21383ebd57d364eeb0e442104004c1599060667ce5e1191e76a89199a386e5c4bf147206e7d6e598bb27a90b3c6a54cccacb39a0ac42bf22eb40bc8ec7925376a6c57d8eac6317578ac052b72ab773f572ad961ee05531cb95ee5a6d70add4176351960fb4bd673f7db9f698616a8dd41823f2f87924c40f131e6c83bc40ab1f92312f46ee86765c306cf4a1d77275ef9668d80f9d9c1ea0aa7b2456bbcf764e009584ef1c0b4b4c683fee3fa2641f48ccf7485a8356fb3dd22f848deefadbef8050de9c5c19e8c449c6f3ec2b1324f80a7d428dc44dbb966d40244c3af03bcb410a57ad1430615e07553a22686f1a62dc6cf090aaac3707ec5b44274b7fe28c7a3a298e7a8adc71e016944875bebb421babd2b64809be3454f25b90723e2cec68467ad2d14744b15de8f9c397a505a340e85998e207cd46fa18d76c46f458af4ac3821c0ac6cd68afb72c376c31daad1a2435fc2bf333260c1a82430edaf2499e7455a93b1301eada2e12365ffcd36a1119664d0c996318a3e55bb2c04dfc5eb251f7fd64f9d83f27ea6577d748e1f85248355ed19867857dc3383e01249cc37684b0eb8e891aa663801e4ac8f0331b38686a19f0d19f6e94c7ac95ec395962be0a4e3c8358d2f6d8f13191e164ad29cd1733bde8c31c7d8ab90366e26cc9a06707dcfa60bfe139a112db827778ac348fdfe26892fed61db7e9849a464e3aad561797b6c778e0688bbbeaf3349727b4670a2d0a08f317b0dc9c4b12ea85c0309d57e754d0c7bd5c83985fb82f776c968189908a8ca83b5944767c2efc3c5f898436de54fe8bb17224012a437896d9fa106a749d12aff657266276129ec5ac12fc7a77eb06296d2a2a876d931e479d3ea201cbb4b1b20bd81471eaa33786c624013e1f07577c2171f38f0511c6924078a40c2d55ce392dd2ab0885e29f4c06907a1597c181b933853838970edad7777ed394c491cde27478eafa5b7a36520aa0779261f94b957e83ce058298dcfa07b08ecc425caeb6c599a11103d7631e77daa0d9d3fc6f42703d57f2c624ecddd56b9a27b848de7dd28f8ed656f1e4decc95a8908217e2f2453ae50b5fc1d9352d735ce5bc2b538eaae25501d449d090df793151811443c64f28d19eeaaac4081e10edca4c4148e723ade8f7e7b988b732ba08b3ce4c8a0d655bac4ff66048148135decd7727a49ac59d82ad470b5479c55d3d8399b790ff033d3ef99d770e1eacecdc140480aeca1e2167553cbbdef2090c7592b40681b733b0a0d127beefd49bcbe8904c975a5ab8b1afe56d7ed7667b5cf92f537ad6972b876843364817c20400524097ac9b405e4b35bbba0d12355a0b54bd763b4491b2acd4e8e4fcaaf8fcfd398499d4c4e81ffa93ca07a5ff51a1540f178f43a931e07e1ad56ab5ce57a2f7dc3ccca114dc9ba8a6934e95f4efe9f3f76947909b280ea5fd795bbbc0feb3ad2b704e305cd9d8f37d178961f77355eedc9d7f77c58e1db2f7797eb8682255939293c3ef7dacd2eab46c4cbbdf929aac301a13f59831a88fab173803399d96dc216abb9f079e79bbfab667ca590266891c8a7ea4bc1724573e5c5a67e9f1341b5bffaa538e240f78da7733237999ac86141b2ac0324f17609b71c885630c90befc3b027a5f01e33979165ce2a00968c414838446c2aba76e1d7fe3707c742f68af21d30e23b637accc848f6c8df820a27bb4e94e5090ac6e008fde7cf3fdd5931fa891335ec8d01b5d6f77db57a87dc35d6701adf7ae0bf82dda6511c83ab4d7d3460b221eeb3d6c4aa537924db5559b1c6739040534fc330f5144c78bf99f5f4faa715e85aebac043e2529197a82ca40f65a8149a9447a9e58c61618600b0c5ab221420c0cee114a133a648dbc2eceb2894ffc329376d1eb3ce7039cf30ff6a53038b23c26c38739fdebc7b919956ca2e468d577dea6621a8d66b78075ad26a6e6d8e20c9b694698540d516ea2bd108625e5fd038b5f1e19c5d5993b82bfe16897c375322dbbca81c81cef6ad900f0ffe5ed02714c208a12f5234d78e32ee07af155ad1e1077a0d8938f426d8f326c751f6ee66c8f707e8493cbfc76f9ddf1ea329e094315a91ba9385e16c890823db0f0231c7f939a042665009d5edd8e48102c515341fa6eea33cc00fb5d82380d735b29f2eec3f61428f7b186d43fcee46b2037ad1aa6974d729848cf1a80dc8ddb0580c9c876def06d8f7642cf45263a655ee77f047fcd76171546319622bf71283f3bf0b519e123a85765779c8bb201e99981ed184e642f63aa61f9cc206bf45fa6e514bfc637671d9cdfba2891bb112a3cff438a6372ee0dd3e7d9f352ce52f8b367b7799e1f963bfe50638f0c74b94873fcd3d66fc1e342a8bd36fb8b88f33eefabb78eca4dc9c89e2c57aaa010f2140dc5ea7c86cebe2f8bf42a167d1d546cc80bfa9258c35af6efb1a090c293a4cf588e4bdf5c090ee7fe38fd7b5551e71e5ce2b0b5a50bab95bc4c257edfc94d37579816b4a2249ba05c991bb2ea02d047e480fc8a8ba71f48f344c6d20d140a64ac20184e45b4eea14d0953370c237ef0a47a7a2f22997715dd3ee8ea52f24ffe12674d571b3bf968454ca051701e411499bc43bb55bbd033f9b81d4baa6c49bdd49614efd20d58175af868ca16a9deaf65216abbdc3beed5f30b209e786a5b4c006f3bd27d93e9d78b51a1a2fb7f5160a0bc1b7df70952ea1573888ddde3d9dd5314b0d0a899a733eb48d5e6c7274667e362e4da6b37c480aa4d0d8730e66483fb1453a3aefad69942ac7f09d3c571b6275590938c541336a121bdd20722550236a9a5e4a37c7de628fceffbc260b1e9b6417c4295907937b13609b8585ebb8f076073abdcf19104ed80ffafe1b09997f115d987a552be5689c70fe125ca702d2ae4d807d5690bc2e90b72cabb0b61ad203b34c68df21c16b92bf8def5680b204ce327214c32e4363d5600f96162a6819dda472acc6441858f396385a16fa5ee52cc0f9ffef3d53c49d535aa37db2cd4b573ff81d74006677969ec1ad891082b5d18ca5b0b9f975574ccffaca72b805c9f7fdd76bfe3dd384dc953255a5b50b7731a137fb9aad42e77d3da1eff5a7b9eda5814993cf2d289bb25ae1680ffcdf419e073d38b4701021adb2019359bb70ff4cca930be7bb979a0678f20665d14803d8753c8ce54cae92feb026486ba747a861daa449863bd38cb4d5831aa6db1e7f404b0c3587aac8765aeecec686066ee7d11321574f04d3f3da571e71222ce07277eca7ff97607", - "5e24f34a8d53b17bd0c2aee5369e3276dbd7e7c2ea0990f1300fbbb00831b76655aab1e2fd625ecd", - "c1d796f1e651a1ee825855d80206baff6818cc8c247ee6ce62b7531e6e9ac32f", - "240cb25aaae4d085bbb747a5", - "319e968ad291ea5d4a057c38f7afa4ddb9c9565962fa1a7b231e397a268ad8e0c5030a2df09dc4f99402ddf2e0d06e753bf55e1b318b3e5ff0108de2328d3b8d53e23e08bf7d84d59fededd60d47bbb52736b0491f82c616eb5f779c496abd6499555035e4513c8613e7204e6bff8d06dfecd9ce38c6b83efd8d0e41f84f7cfc9ae07113237987a4b2eaa87f7e0a310155e282e57858244e9071712fa026cb781e5a4bfe6fa1bc480e534096394459a3d1354e2d9a54aac6926a60b388410fd0b53f7a3a9116292f37406369c22ea674418c4deeead171e00f74f5cabae5d24a0686a4bcd8ba99aea613a23edd0a019a319daa3779c212fbdca9d772fc3fe612cf178c2aca2aeaf6bce2433494027a474eff699bba95fc7dcf79ca1d77b1e097439a9050a5cc78e0b78bf2e7f50f959ea2986a59be3880519cd84d0a673acb0432feb1945c603e70748445c74600ccfec60efcf9e4d02a7df5f967de4b473f63b0b0499ff4ba350ec1182f3a0ac17ef9ae28945fc9bc714c49909a7c1e2f311aa6ad7652e22e1f48bb51cf53814a2125152813752d86c7f9468a991d0ac84b1a2f3969b8081c228b7f5760718036e26a10e211ff04ea323acdaaddf9b06a08c92ed663d0fdf13fa601cda45c416c2d3803dd9b5ca29cba57e59cf4ad93176c65c64507b1995d638541c90b381ff758833a2ad67b0de44c280fdfd82b3c6d4353ae30b33768863cd3169a2032f26e37ddd57e7da1673cfc7375bf6e6792495a2b434155d684f2a6f2b919f944469d47be5aa7da74eed69d871e6f65c3ae08904a9ad042ba39905188f0b9158fd14094bd6a408fba6ef57566d69eccda86bb54cd3ca7381f51bffeaf8bcc1ae8df91d22c359888e21b70f640d6f3726a34e6100ee269124747f0ca05110f63deee07e3628bd6aacf926036ccec02c0b6bd7259db52ea8b7a686b36ba1d0296c85e43e25d72ce46c66a1e646301dafd2f4c502281e6f949011cea69459c026c65bd130d6ef06be17b23a9c9a84746e39d017b144135025ac527c1e653f233770cd68e9f232c3b623ceda836843b3e9ea313cc6a57d28ce71ccfb7265ce73b06bce1447220645e6f66caeb06b55129b97c8dd8db54c94d771504d24cedc86a8ec706a9f7dcbbcd7fc7cf38005b2913b1cfb77370bd23183ac7b5ca5135a2738cc91d05b2b22640469e3daeb6a7b0f14fc6652563663520f7754aba624a35e5d24529a6ee9f5ef0d019d83c04f5a93a38b68cbce0cecd42a11aae305475806326aebb4f673791f50c9f90894add51a0fd7c02807efd8c1bd21fa717a860e224bc9fa3f40975fd8d558e4844a09f8920256528450d77e546604e2ce2d38efadaf39a0ea3ea12156174aa8a20481e6c1190e448564675f9ca60bcef37cacec5aa218122e7bd25b571ff10f54979d62018b779a2a3d5d7d6cd56ae31efef2c844ba50ff9da88eba7a8e0d9fc5388a805ba4ad35eaa4798e395d2fe112083cce2f11cc850d25ca5c6e60a9996cee4789ca99d519daedb62f4fb1e535b742a35d71d7390117e93821ff18948a78c1fcdcb90a5f1211327d7ee0663ef16ff446e0e22d8cb7b2d3d05469b1c02864f4a87e2d9715f60c9e7be841e308d0a5f6c50161a4a0464aebafb88e0d2df8cefcead93c9623106d5518a9852f320235594be10c45bc0cf06c9daa007100ff97959357f9be8e49c870d0a11c884213e266c35e9131439fb3654fd5f1abd1e778ccb02b8c262753a22653a09272a0c33b6b2683c9045e8f967af756b98dc1797ff605c64ac5bda8252e9ebfe0e4d8d7ca754fcca5e3de3c4b63678da095281d76d60fa12ff4ca818825f346b9c4e426cee16db5818d78a527a901cd088bc2983f9b83430b50683018996996717a1738439680b68e3f61cbdcd0f0e1a6b436af8fa05d3ce2228054e319bad1dc6ac970c75313c552fc1136fabc302fcd1d09ef1b9138d18133a772cbd9cb197ff58c6e898f9e83e4e27206f3b15b6bf2778aaf9fb38e0d50152f8dbf5763816132a04b4b2e9639584b3dc8ea6d95ade024f9497944200ab0aeab206ef099859b9240aaa15f737c1e0fe6d015d04f47261ade4928e3c2ca21d1f5ab4a3f571f2ed92ebeeebf2493e6e39f0063ba931e165384ee1b5081f5f8d26ec24716757037f5158d35effbe67009080ad7b0381292a513f312eb28328cf5ff47a6599e36c14277c3eb5053c5aca530ff5954c21c03fb3fd5fc0facdac36dd819b0495fde421411e0440991da0cc4a20d294446115c0b79045037fbfacfeac574da3bf192fec4bf38c27cef71d03787430223b6069ba6d9273ec8679736a832277c657862ca791b559a5054ee8c7c07618083f75480c8aa01cb086c7317315911802e6cefb15bbe20494b14d97e3a885806db775c216dc15949e3b724f7cbb30bd2c46bd5a2fd6132352c2b21cc2b47891dd9794975f70a6fa7a0791ee761ccf4c263f27f64790826c1aa656c39483e029baef0855935e7e6c133a4035a3699925fbde131ca62948879373346af35bd7fa52b8d6c3338f213bbd9c79977c0d710028d1d386df614c5faf4a1f8fe5506a9af7059370893ff6d07d91383baba67a617b5d829e0e2eb20e541ed5c34be7ef0eaf6c6f6f52d7ca01933a2a4e8de46e422dc95161ba8ad354f6bc7c8e4cf8ab5e08607530147fcd7c9481afc621c5a3230a05e2c4db79db9e1e73f43556a8e8f0dff7ffe420282212f23d4c5f6f8d2febe129b9fe5ba7ddf27f72ae898a4eba270b5d2bb3b6b06e38c546ba80a9b2bc46097d0b47db5ae72485ef2c6419e856c33c2d66a861b9d474699e730eb8a8992e3ea9c1ed74316687d5d9fc611189eba2aa31af5ba8e81179866dc016bda977c59c595e40001c8ab3a4a44cec00ff84c6dbd9ad4be30bcc080e69b9398089d6ea464a70f536ace3b447693301c94850606d0de1299770b5f45e6d28f8ab83e3ffe52178522eb91fdaa9e4a696674ba0f52ee18e960b04415782f018d67479081b1bf9b4c9b90de026cbb66bf7d9d12cddccdd9b2c8ee2f010892571c6f0c0feac9555c71bf61f9cd69553cf7fc2be8d058e0c3430e134adb1ba28985fdc4f0cf71bd3cd09f5f82f303cded0de62f98404477bdd0a846c6c51e3e82ebf72f475afc8e6388aec57206018ba2528ede194345cc1ee95cb2023793f692f708aac3c9e8a682af36b078f5d6c7a3ed07475e9fe73b95d1eee048ab898edfee3fac4beda45f03eeb64b2128f6df9453ed77c6010e13c0270c068f704f49e62fb7410be90ffee47584ca2efc5287dae1f63bcc1819e7548eb9f0d8a3182f9ed00da3817255a2ff735876b75cd21cb25e86aa4b2893f9e5089dfac76194563f9a14335dd37ef06a501c89623caaf6feb4afb792092dfed515ba7518e278c341834a9dd17b50a0fc860b62ec621b69408cb3fbf7d4ab88a3e367fda84c82357376fa9b1161b739361c313b99dcbf4122f3870c8175093298cf432174217398928983ab6cea4759f18e7a21d71fe1b0f3cda05d241e12db0818b8763bd23d958d6e52981ce8d84cd6d82640d2000874a53c0bd14949ec99e48ce6c954ef0d08e6e319de5ebf7e142f25c0f50ff13f6acecde6a270c8d8de05ef4c310ce9e92f40f6f2b77d6e7aa3f056d4a20f7faa7cd0b93d82e3972343a50a26ff462caada10621bc953b73913944246d2a4da25fa52cc6ee1293c436ab9031ee2dc79cce39f139f44d473c236731257c6f65ca4d383e39cf8d33923afea3c80244021d36e0ed43230c44e7d1a1297d35464861f9149d869f26cc51879027169803e43c898d1b4a2a2480197500", - }, - { - "2158abc2472e1b9c061da2c01d0ad9e996fd687cccca331fe8a2baacd12c06f284b1b5cbdfd067e5ed09a60a137ff4a97c5c26482659680ffb22bbcd4ec1bfd272749e52440537320fdd3c225c30ccd98cf221b34b89c247ab7d14f93ed3ccb0486a028c6f3abe7e17fba1742b6d4db85f6e6baaf82df1a3aa059de8d9699821d39bad42d56cc1ec67626092cfad4a2e1cb5d814e2cab78ccf5474a8bd0dc990a877d37de394694af6cadcc57727f393dccba7bf955f4b65b3c00d71cdd701754ed4f231685b7b5e2557239d7e16305be2d81a773765dcea25ea5bf2c15d670f3159409ab5bbf8da121c779132a8ec1480068cb76b68a19152fd83135aeb228b446225f91d1ed4303a4bc16cf3ad8173b30d2a1e75ccafc8c933db231efeae6260d45c7ef230ae2c7b6f986f1c19e2cf260ded9cd99d64a2d03fc5ee3d73509e47ac1c39dcca655839fec75517a9243eb611da8fae3e317e7df66cbb6abd59b16975eb463f509e784e65cd660ef1a4c5027e54b1bc862f397c9cf4e6594d98c2c2830801d3a679220b46881a372cdf3aaa33eb66b91a9f36b6941c0fe1b4d2a437daa50b811f2d8c65b5a69de185d78bb9c2f172dc90a89324c5a2067974aab14f4fbcd06ee95cd49e03717f88480a410afbb4e68b5c79b0211cb69b90604cdfaf08af1ef10cf28f0f630e97ab18d9b5138d9b9ee9154e0b3104a6c164f2a114fa5032eb5c247a6b87880332a0dce7b36982515297a05dc8a4038a09f52b1def7b4fdad8735443fadc462c7c22132f8b9581de2d213bf5c53f7fce34aaeb24263afefead5341a72f88d3acaae6db367c5c14a97d4f9e438e1e11c3c8fde7ee37e5ece5382e8c68b660146046ef96c24caa6bc9fa0a0c88281e4bf01b32df5218cb3750f9c4b8af24cc106abca62d085198d14ba2ded3cafc1fbb17519a696965a1ba5f65720e893f1ef3fbc5200316b9d4615bb23426ae53e1c5a57b2f0ee0d0c83f353b4ebe7a6cb17531d278478b4ca8e6ffdd0cad30ed73d568a2e44972ac88a7e7d665614316d674e84ebc739b645a9a4166477254ba47bc5c2b05ced88e75bf64da21a7f1f71cd946d84de13ca77b7e0dc2f0617d371ed96323a83bb11dfa16f81bbde913d9c259b10f3aeeb6b56cc4775c25f49343cef667763118932c2e8b47ec745ac537b37746ed65fda2d1c11a2de60ec02adcb79152e8a9e614d8715cc4e6b6891d6a0063576560fa3621146308222432ffdbc351c36c37d844a934088fea92ac54920facf870a62e91ba9299dcb6cbdb918e2d54fb642c3f0d60489c4bda489f6c584b64c8f19359ab25f388dbbe636c4d90c048f5ed87024dcf9f98a9e738163f837a07750d61203254a80d120c795f9c3aa791272f9474fe330da81a45be5ac838613d46c25e781606862912ff88af393040605fd4d55d07e2052227c37ceffcdd2d42a08bbab69140dfa4406853799893daf768af546f915a91b81d0da719ebd45b8b5f1641f15621959689e810217bea18e3996c532ac6e4e2e4f289fddd5e5968bd6fa9aec5ca435c532b6c74a7568c8aeff9dd19bfc2fba3b484a191e2faf9a069a24e2e6d928ac0bdf635644cc1ef3bbacc547a8e4f1d42d4bed3b6b8cc56216fa550dc37da9cf4d1d1591d9348594d14adc7a3fde5e5d1a3b9875c85de7df483cdd0baa86dae793e0796d14fef1f649de6079acbec6b6fa5f2cb2bd0481f5316f00dbe5dbc379bc3cd6d13bd8c775a727ef43e6a5fad1051783b22c05a75d64a8394a73fcb430299b015563c8cb0ae0aa4ec750399855411c076d21aeca8656f3d0cae084fb0a1ffc6f73b52a7ea5d4bd6d24e7057a3811719533105fc967439a32241f2d3e3f299da2deb821748cdee1a1c5e71bfdf88d833bade2f505268f375a9e6488cd8e16705cce91d15b60b2fd269a19148296a7be348aa349a12270fbc0d5748e538afeb0598081a4f1349217ceab3c4141d40f765ea2bfffd530fb9606601469fb131a44939be984c07bac8f26d8c068accfdefb729eeb47cfd6ddc646e22031f53a7698c6501d86cbba05e282d64b2f962a1b08b9064078dd1e3f14006f45f599bc8e600cabe6d855fcbae8c3060859202361d929a241f6c0711ac0d050b67a1d44da19e0b0e236adad1f60a327c9c34b2b9c64cdde5b8e4f664f2fc70599d44a63ee2b14d051c27d71231098ecd3d4086038d63e84547dfaa39db1a92785e38b640ea0345062a1c185b25a72862e7ae6574114eba592d6492087e2580dc5d361c473a614d647e66c0a30de806f4976b69a8b92301e68794ee05b96ee116a5fd5edf5eab43dc1103801eec861383f17c2bab9f2d9126c1802b7aee0c909309ee72679ab644abb9c4caa54add283b5954e6f881781e42f849bce6554c7a5e3becc5d5a209805ccd4a0117272a53807e3978ffb19641a9dffd9034490a9284f658599961daf52f24f6464c2099cc9ed3459d84dbde2ebbdbbeef25c882a9beda03573bdd4c6a0143b14d634a1a021d5f9fa23a7ed0f5598ee57e56672814412b6c7c08b8e709fb98575fe2716100d000a20a7e7200d800e556564c7e6a8da9d609b18ff0bb8a8812e96b834a6b534b0d5dc97f5da17f42f8d58e763f1b201625d1a5158c2f9e9e190921637474ae81d278002f197f7211540088931ca8a941794e56067ef4a497fdc6fa713aa9f20c21f23c3a71ae4cc5aed459ca7c020bf55162fbcf56a066546660c5a009b8ad2aaae9651c97b1e145853a10013d1bf68e7df25dd492c328f823ed982da54557502ebc6cc56d4d0bf2881bf3c536ea53b4dcb0886e73b066969dfec343441b9372d7ff38454c4337d45e2b999415ec48f19cd05f0f80c5a61ec369610784f47a5cf3b2a13ff5d8145303ade7189a300936006846812dec9ff15500f8daf47236e724d72619af3a6cb3e854cb8284d5b8843dfe056beaa45c40a4541a98c7507feb27a605d6e07189c8c5554a492a03ce6701d3d2ec782e2c1c8346b54a963435bdda3a93bbac1d837172cebb9cd18903d25cd6bed404eaf18730a6d1c6da0783b5411770ed34f35fa6c11a4292a34565ff1b23d4200ec5a73e6b7905458088fac19f6aafd35e0e791f28bbb2cb0117ca1c3a9e3c4863e487ce5d8c14dd140e9eb4794d87d75b01f683bca84ebdbf19dafab716421bfac9e95755fd346a0cd31e8520a55c7ca652ff63fb4e20ba67fab41e11f7390bc02363162097802c6a9eb18b430d07ea60064d5b546d15bb68cada79c113848136e797577f1783e9b53574f9427be3a28230fdd69d139205dd6c7e9e7f031fb6eab70d69ce905384c5c77d084360aac590a89b2dbb2d339899b13619b455cf9f0cdc08db6c5b5f3223dc3a663ce42bcc8cc6f947f42cdf8dde15a6926b753177513a52be95b1f0b88d2a1ec90e49959b108fe204bbc29199d7382c42ad5dbaff970cbd2dbeade54bd70415e54daa805d396361f525f38efc2bba3fd818f9d7af0594dcc341c20f18c624fe13ce7e7108e1d2fd06c58b03f04642c95e3ba00d4035ea0476ac138f72378d85050bf60dedc90af38e96f67fdc38483a73e847b41d31b894ddcb234f02b0d507bbcb15a8941f9c23b592a291cbeacb3ed213f2f044aa842275a7717757467f121294bba6b357c969e96bfab455c6f328d9e5181d909c3f0543b17d9af7fcac099067b043be79aca8e5a75c3a6d4f6246357a63c516a3ca595447f34b43a055d3070517c67ec36e636aca9ed71a001d4f7b81149124deeb7826dec3697e183d861d544c9c17baff82849d599e9e77ed19f801aa1ce095940674576ff270ac788d00c429187e299a03c6f3a1646a8f7d6290287e70bd1276316ae624da929c67936191abdfba45e2803884e5a3136205a38a841448968a7900709dda033a42969bd3417a8d865d0dbee1f261f4556797dfebab278136a182a63e5ca9789e3f1371808efe06eb0cc5ccfe26c0538d573378035afa39fb7cdf3ad889b277c8c6e84954e74f3ff3140bf13bcb45c822784125d23b5eceb73e", - "088fc7ba068f80efd8d4d62813c93c1eba77e9ff400c7781314abc901873ce200295da09245bf8fd2fce254397616151d94b511957c89a881256182ac9e64acb7b25d4a080cc9daf9ac2f231235483fc9fd415f69caf7eaf0597", - "78d5f86b071bbf8a185e5e2d54faddd2a9e26983b1e7a74be0f0b979b9f4af31", - "d9ce7d249af9496e99c93b36", - "ad542824b49fc520f0b7ff8ce2bff8b3d47baacb4a1c95ed56a306483aac551fffba48e8a8f5e4cc536e9266182f6811d070fb9282f5c542cefb4993ccc7044b42cfd6fc71793dc8dd2de23c630f9ceaeddba45efed9d7fca25fcb07d193c000822478b19c2ee9fb31760cfe01475ba8a003db469d1130318a79345a29d054a9f9412dca1edf6d8f1498af5bb6fdbbd3d5f9a244ff176f62742c53779291ef6294df6540d841f4ee8c7c58fc8497ba74d9cf7947add5373427d81ae928305b93dd26cfc65e63b0ed0812ce759511bfbb10aca98f2abdbc9055c4e5ab82637f6a965bb74f592bdf11118b8eb79d50331e76cb4d10c6b4428cd4ec2ef4cb727bdba2b5375f5184d77772d0f9fd3a3c579a4a548b9c2dadc22c805ae959617af49a514b43f47af834313ed2e4d1fcec2c4b9ea87f328fa3d23129a36e6c54bcd08f7e30645de86e98ebb11bcaf99543503eb1e024bc9fd51fe6bd5e6d749033f2452cdf28b3d0f8a304111bdd26dbde641c02fcb15dc21b1a9baac5e86d35b4126ed1cc8a2c3c2a5b94c99fb9b2008daf1a0c090633bf9e31326428c75a50e821b1e72a6504c9d7bcfcaabecd929163d365832e8971f5efebff99ee3f5b95f957e8904d05b410936d8a81c60b4947f8605c58e5b727d491995c76fbe06e556c8ab5cc661a0c09ebc98d61010050f68b31fbe1f9de8f6481b2704204b0164d8433ba4dc1076908c782826e9b555e8d608463581099a466f92bfd6ac9796eacc0ab771a3f11d03806b0f33ec04c69cef6b87d58c11acb5d1374450ce61ba159456b915043c5c17cb03f0ba66d027105bb6fff41e6422f13e2a466f073358bf68149a3b577cfba7ea08b42f83fbc5a2aff17c5ee7dbdac3ff97389f5b8d1f3750e5c9be651209eeb9574127ea81bd7619da16d1cfab85754883543f6474c8c0cc9d5b80e34bf8262d2b4798f9917bcab4b880339397907a5bafe7d149247fd735523df3cbb17ae5e298846ad3bfb7d4f902aa549b7667d3ea945b002e7b209bc83842a7b120d6d27ce80631404371f31d1f61efc5423e1822032a1cbf4fa1a6b6fe79934a202d5add8c6e3595e49be3dd9553a569521c50e9653bc684ef2b73c3526ff7a0843fcac9cc9ecf46e63df5b9328a54c576bd299a366bbdc0f83a9de67b03f1da16244bd6d52e7e4b52c4ed693827735554b05b3a260cd01a41d7c944d0b7b58ae4b0eb052da34bc22b779d7ad46f90f3d4049c097e0adeaf71bbb30ed24b32ff5c7a65177db77492c2571e9cd99f15e613797e319ea7377038d53b28a4cd66a697e5e8f84cf16bd0f0430b34826114b4e1d1ebaaf2939dff7f9f4ce7c0861e51701c42d9cc9e871018b447ccaf4e402e3d63be164dcdf6799314a389ada8bf5e51a35148acf627e51481b9b0e4bec09c9e6d59229721b151fa9adf8323001fcf33afbc9a949643172f39b0d10ef57b37973683fdd9b9eb46e63054fd05ffbef889ff8fc8f251b0ab41fb00757ec1964ef373fceb8f6d148a7f7c89944b3cfc240d091601b23046188ba70a7cdf7b6f96eb93dcd3d24d4aebdc4a29a749bfe3cf5f6e1a025b62982ce188e6b57245d829c9fc1dcaaa5309a8b9557b8824a78eceef6e977721de4065b474ae008642b974001a5565ef5fe4250194e8b861cc45a8691c461817f10b646fb526bf0fe7790bb0db29d1356e8c7a197ec78df8310431d632a032b5490c2a458eb8d4327a9679d7e8ef8739797b0e820e2c567ce3562592e862a1dfcecd50bf77fcfcd00518db65ee0effb9eb3655d5d401a4a47808faa596d17b316f828cbbc14a7e018a0593da9320140a752f3824b5fcb66aa4c3cb94366ee8b821b09e7bea2c04ece15e8a7be1f58463b525e8cfcfc3fdd395ec5b0575094313557e632d0a65e3099e3c653111a5fb4f0eb2aa710229fc055a2bfd8a7147cbecc10823f1244fbb6894af1408ff9047d6483ef83573b5421b9798ee387dc38f166b11de6c33e9785e9b3d9d28bc24c37890e4f8f8ff24cca298b44d6fb1c6aad28cc634a67dd427205285521a172c2a4884ac5b038e261e38faf0086a02aa29195713cea335c47d03d67fa0dec7a8cb21db741519f5f0ba0143f14d71e33d82c75d6a19b3f7a42e6c16d762354daa2670ffa55bd400637de9cddf9e7964a03b4c8956f36bf54d89cf16de23e8c52957b52eb4572a11d1398be72bdb129e2c1abb58c65cc291bb7b0d2dc326c6125a441863a6c92de0f47a355222d58bf10af0d297a86a98b4e933a8f844fc7f1bbc8ba77919dfc50c41219e3db309b92ba056349faa758daf360b8ac05e43fc2069cd46e63fec399cd7764b111467fc65407ac06f5f84a3179930f6215ac5ec906146c19e0d3e162e77a2bca3582128284282b251cdcac03ecc204266ac3a9cfe8d8854008baf89c0ea0096a400d6a0d2f7c681c99462cf0105f7a3dde690ece0438fbb820b9c73c6cdf6208c336831101b904526cf8ac331d879d71615d8b1f750ac7f0ec692d97a5e21e17e194a98c10172b5c4bc1049a8743188ae7c4d70384a7e68c1353aab7882bb91aa383821046ed0ebabb4b2dd126ccb935f48646b299095cdb71ecd5cc402e4635a3f7a3c8a6f54f4076ba028dedb402bcc92f5668dec3d91dda7319f58382017e306237e42480ee2c1f5930564cf16fdf37a3434585336b8e4535bba87311cd47722b9da727250560624a5dde48a2090ee44592d2fc06edda634b600fad9f843c6b2eaa0697b42858afee8191dd2a31e5685bd104188e2ccb057dd0a8d4d1205d7c846f5b8ec0f06bff61c7f47ac4da30e1bc80a4e95af79b14a83e9af2e0f195cb92d14f752a5f12ff90a05765be453075d799694848fcddb07859336ec101c8052bdc273d4abc313cfb351b543fa340dcd01bf32fea59881ddb8f33c6023ccea70532814ce4a2d0c66c846347b86c29dfc34f6fa4db298911d4367c59939020a3d078194e6a3a3c5126c24ed182398468e77fd61a5b1271f5cb2a97868876954c3f7179d6a045f4bd770f681cd82216cd2b1ceeb4e724b3fddeb74481e662fbd7f5dd45bed6d4f89d21b8dd9c1009ad2b0b16954e97993ab8f3fdd9d61f8db102a945591b4552f419971a9e46a792dd8392c8d9502767c82d9b4f69e66071eb579859e9ca070cad5fe3b7fcb77b8474926ea991ce7ad201421f8a79c051b762a066027ab2b9595a1c97ad57f3149f5872ed4d8e99195d47bd3c03bbee590a50a99d8048e912aaeed797977b52f0240a6cf2c865b108456881adbfda60cf701454da17bae879cf098df808f34e50bccaada2d3edeb1aa73cfe3c512d814eb33897b6ff9d67d3d682517cc333c3c2552adc99860b1f0d1076390de9f84fcc9e802581f77e14f5254da01831c70cb8581630dadb44209377d90447a1a21cc8a2d6d897db62d8420afbcc6ed85ce42f3281255bd43e0afd3e86b27d3b957104ef54959282b0e1b381a26f16057246704c7888126055af5a1f494540f01897e8781e1a5c0193b7bef4b5588d0e9b9c8de74dcdb63f03f7b15cf48fbb71c7c3bbe9329e3d326988bad7d0cb85537c1e0b3cd88f37a3c7765f548f99e495ddc29daed8c7f15dadf2e5b79def91dbbea277c51a5da250e66c305604bcce4789ca2df9a10614d72824ba8e4f179f35ccae7119fd962cce13b282f0f970ca6c4776374c4bc438f0de98aa04fb3cf23d2c6800a4a666c15bd20c486e88e688ff9e5fce906b4ae96ec7c3388d7567ce6c8bc61f6d2373b93f9ddbb02b384084b3f28f54c9ddda232d3084daa5fac5ca356ac0059f2fd3fde5d6a9516d0954653b699aa986f70733538e19721daa41329abb95058450e602eb5726ad5a8b81aa474650659c6f7f6f53f8a6e635bf35f4b1191e0dbefad3be756c6141c7d55f007f4fd131e5d5eaa120ba31cc32b8d4c69d4fa784fe0af7dc272898789c774e7995cb252eb6c8e8053c9e7adb59c27f675952d161dba78bdfb15859fdfe4fe4a44c01efd394bf51d43c600aa9a527d9c490971e188e28b980e77a9c6ea0a4ef6bd38d11b47f5745ecdb", - }, - { - "9cd1c25b5bdab9b9080db3e5e05dc749e0783087c310777d89307138613bdffe0ca259677c13208420d4690031314a11a97a986d8b0fea143f5b4da0972c9ea3cef80b4b0b2bcf2bff392c306a764113f0d9807be86a9027c6ddc85d096600d85e0b236937f295362bc1679537a8a9278229a36a9433925a105ab719c0b7f11fc31488fa071d3032de97c81540713dc29ae02c2e13be8823183f3cd9f72ef8ba4280b4499ee47c7c7c4492bcb5cf7e4fafaa7ec26906e58146215a3d4f52f792d3abdb718f57ed0b9b7fc7504e45a0fdf01ebf5924a4da6ac635a715879ea75a4983cbd9dab9e47638acc687f16684e184443aa9e81513ae4abbc4d1596b2ca3eef77cc9b0603fe90c0570fe6cf4dff0381a99212fadcf7968934ac1ff7664ed6ee0b61e41f5074dfb774b676c2b57a445f1c5749e95ed062837c727ae2c151c0ccb3a4dc1429bbcb9e62325117aca566b8fca0924b70f4defd7749d0389b90f55f35d1635f8d2efdef514f06fde46db6e11e492c8f4dfb7cb5454cedd0ddd32013a4836321a25110f3a017f18475a86583e192132f8d8fd4c2dcb2a3aa95c3be3a57216bf9727cfd1284eea6fa870c8e689e91982c116ceeee2f8298b55646efad684b96eab883fd3d629437e9a0b6523f47ea5b59474a4766ccd01c13170bb08f47576a0fdb573d4dfb65279c1b79cb535426bcab60f4022dc42e40db29f15a6148b461241bae62070389932f035e7257752ef2d6130503d72344b24d360cae8ec11fa2dcbe04d3b18e66d081b552e93a71dc0094d1046bf4491e318f2ae00debffa0b8ada58c5f23e33fb598829ec2f46ad3894bd7f530210371a02e51ae0a414eb2eee43f3e08126dbdbae04c7de4b7416df32953234a6694ea84e6889f27c74206ab8144a393a2614e92adcc77550dd54827387b619f004c13f6c4a31e8bf525277669db0a0c3c589eda15063f12eb774a13e2aba2f2f7b6e9bc69f8485f1d6fc5773acf83671812412d28704003e78a17da25bacd1d61a6d9cb9f121abc71d023bcafa713b7c954e4e1c524e5bcaefd86c4a843e209eabbd579cde0263fc059ec6ff10017ba54fc9c2a1171d6b06f5d85079167117c12e6e5d0c71c008765fce756fd0f1141fbad6c1d2f32cd8e80429611a9a78dbc8e738d458f9ddce58ab43c77b34db9befb25cc1a588998e8dc2efa75c6883244fbbf9a7b4d6750c81b8d3fdedaf98dc61f49d067c369409f984b155ec347a3bef73e2a44957b0ca0f84c7fc335fd89453759ad0ac2fd9a5b38afa9fbe74daaee7bc52301302fb2286c21fb922f74d756de84519171fbecaa9b869682d431614ff6845126a4034f10253aa244bf89ab8e0dfd1f7fe8fc1a8472a10746d26896c8ece7ef80eb2e910069435518ccf096caeda63ad692455b04e6525bb8bae27197ca5118a57fb9a5d8fcfae1b9eb7874d91eafafa0e4fab5cb4d0173f7e3e58fae369843a641e98f3ee460e8cfe95d98f7fd38a8d2235e9d6050015833e6d7d21d7015c3b1ff42f0d3a3d9a38d373c8524752e06987c9408cca550f08c38c2a9a8d86d5ac7a04bab44254ed15c7b5670e0747788e11b81adb0d29e3d0b50d6a429340ee0d44a8c286fcaf9bc46403d26b4a4af95b021336103c1ae0f1274b33bb8b21c8cfca8a56c639f18a9df45d083fa7019aaa14d1ba50eb9a4112e574cd70969640602096265a87b1f77c0e00bbb501555f1626196611b4a824991cf10ab2874a12a8e0390267eaf9e3f8f99eadfbf40d111a26772cda1f50743c417eeec9c80171a83a730f246cf31c6691c96185d672a0fde9ccd7091c4b455dc93326913497396e0a4992773caeddcd783e534eb0f34b99bf23a2db6ee738381b5fc94ff603be014c507888ff55557793a8c5439b11dc5a347f35a2666eda81cda4d1c3a78fc4f3df3c7bde91d05524791b67142c446f60c3a4022912ddabdf817ca3280b671beaa496c935661e5adf39c1f4650563c5c807c8f21aa59df926199c4e2404690ea8ffd7dd65f637452ff93995fe9c5ac7a322b9bdc756b7ed6f533b9357a4a1ffa379dd096f144e9e0d87330c238ed3c6b08c8478e23b65518ea1e4e64585e5e9fec2f26dd7400ce4c73ff0eacdc3b07e4f34f6316f5b82fefc66e442ecc92bea8c1d58635d644724a3380e71fbbeef4bf3e57c6240ff603d65447f510eaa3c9ac794fd24f844489b7c560c7814fbc307e03f6a213eca5ea40fddf51d8731b74ec5b472bdf8ba59751065ed2461b02c41ef96622e60c0d26f9dc78c24f94372bef7e47cf09ed565ae3a52d39b02ffddf1953f1ff500f1659db9f1c2b23534702c19ec1cb7c18166fcd33997d53874c7cdb4e6c2b4d82751911913434e48b37a61a0971861187e5decb7f5c1ef6988bc1d6f7fd147a623d8bf361b0d7ece88df6e1ff8d037762d232e22e51d8c6ddaa9dc597b23ff9efbbfd416cc53e5543253732a23aba151cecf73b3ecff21c6a9fd1f24211fc21cde9633aae918ff1c6b72468f1de7e0ecb6539fa353c069fcbe8920dfa8e2fb86782e3062462f7eb2a2c441bfac21ab62744b05c70b6fc3c9f8e3a8a0c5a4263ed256a019861ecb28e20ce78e2d93f1a1def669e9652cb35d105bfdd5ff2313d27ab3eb00d1b628b4c20f42efa23390802af96a8f261ded3678ea0b780e1f4a88d23588a4ebb058adbf9a9c62ce2ce2f8264c874c697482e25f8d5a6daca4f57fd97d23c42d7b71ec150d4ee33931db5f7d63abe7d72dc936bb23a367c798e6a01509644284d52f9ae27d7d1bae597b2cbc26139354dcca0fff6d76c6065d661b66ca5eeb9f8d85810a029cb95b17e5173ef8ab92d475a1d3e21799e874ff04dbc962c668ef4be9f94d85b2a99d97c0db8f6b6d63e00e36c325cfab9aceaf7597113bff0086e8fad36eac7c0b443de6d3a8533789616d4c863df7200ba795a3b8d0a2b9568bb32af95fa604a3e3ea778c3dae159e1b612458584564ffda07b8aba9710134242b2d83d23127b51b9e41584c56f667b71bc01060240f3a2bc7e5d438e7095c1236e0e468079a83a5dbdcf132d258e9ed18f94d3c098867d06d3c09544565677b454be34ce567f1c143e2f3153bdc0353d65090dfd8f7af4633b89a781e01f4634dd7b0323ea1f38184e697bfc39a1299eaa278c39a2709cde0a346fea53a61f211112450b318d137fe68f6c102085aedabd2b045fab912da5c58d8019239f3a44b18f4fe30c5352e2e2bf030334a1dde1dcd23178636f1e38ec9e42102d8c54df0b94b207e804eacab3edddf89fabda6c8e1bd4e17ae31a57716c679ee8bc7de4412fec3934c6f3e8b4c1d1447dbba0fbc775dd3258f789ca53f1593cadc710fef6fd282bb41c0468ede5ad5b914e4758b4148b0d0c04c75ff6208ca3e79d92de8abafa4ec70ea7a4e454f0759337ce575c4954584e2bb8444c34e823d27b025d25fc9becfb4391df9882452bca0373164cd76e9af316df3f5bb7532e22557b485217254d5ab72ce349620f03758219b259784d4c9f1c7beac3cf08e624742e768b53b3d60ad0b94442c847b84a516a93d9b7d068c44c43980b4c7e2fb0ac964bf05a11fb2adb4f6d938715dde88061b238321afc7e5e84799b02a94baf3f879f89a98ab474ca12085137d639b837ebe069f6dcd8456141d063eb1c032aa392a44d1d58b1e77aba38a280625ab84e3b123507ea7a692c4acd1756c031fa52d637703ee957a993804c13e296cc20c1de55c9b8c032e50afffc51c02e5c12f48383237cdacd005b09243d9fe05e51cea42b77645e5c6f4e48c10e671d216b90a48f0d8f5c1dda553217f5126646d11a62587eb0a4ee0efdaf0d54bc2eb04cd34f5a529b682ce09a34d5acab2c8db58ed6244f7b024e68a14bcd5d7a7daa4dbcf490485cbd38e6f20e839d2b0142b9d766f9527937bb1a737877edf6122ba306bbfb5379243a6b22bdf85dcf3b079691f0e90b28a4259c1c9d8a02afa5b5a661a0f9dac52435e7d22e3591593d37eb2e10f646b51be2d1a96cd4490289ef642ad93eeffd64d7cf830d60dc4a98c768a9bdbf6ec9923062ff04abf19e8b65b95494a9420971018c7e6268b8fb2021a4ddd103976333fa52389643c711a980664e29a8479aa9c4091c2cc2074ce3ac1ab4afa217d39c6a1", - "c22add33457539a957d32dd07ec9110f8cdd2f00ab6ac256b4bc7732f63dd3b867b0ecac262555", - "e71f9a3dd457b4064df1d9055889f105af175a2d10dd7b8729da0d0116c2d9fd", - "7df9824e774c5f86d83cb5d8", - "689683c9e7aa9c48b9fda0cfffea0458ea0c3dedccd21efeb06126f1194780917c9f4f2f44b1daceec3f6b1f75506f4169bdacf12c1f65958784851056fe0b4b42a22aeb043ab35ca73747346ac58c550324c4b849a404c94b8860967b6fc58aff25dad0556f1952c045b91f56ec8eebf6f552c18b2a0641c037e6c6538b289601e1fd5a7bbe7b6e0b224124fec341bf77615183abafb52b3e30082a0abfc2cf224324338c132426011d9f800b382e6b834896ea48a8247f149d92ded7e69c7800096076cd2a729a1fe41c70dafb1f855ffa2ffc27b93e2f5f6827ade7118af60730033675d84de9cde6c260d3d615a945dfe0ed25f33b6cbd2c0e204ee919219d85c7536f4700f06fa61937f8dbbe9bda88db1f4ba8a8d195cd385eec62edd9ce673880800be9aa4430e5c10a5908f6dd349af70f32b32d8db38a7d73821af47b993b622bf168565082d07e88fc48231a440469adeca59263302438ece96d89de11cf8057454d1bfe8e4e36965a4d82618834a0847af39dd8776866d9558a5cff79a1cc9d1e3c22e050677e54ead68b3cf0094daa01330d41bb66708a8bbb8a196fae5c77dc6774629d38905e81d97c5b16d755182f687a8046e55d148419cf9c12139fee50c0533b0f04a805723ce1ea5595fca5b668e58f6b3b396f438308372489b640317cfa3a79392cf6d1afdd8c3359557a83790021a4eb418fa189ad15ba9be0f74182ac76076f102ec171117a3d16ca20b4d200e03e54f1f0ee6308e463a148c0c85aac3ccbe5781cf45b53a313f7c9975a45d1853ed9104a860c08634a8211b87500b5ffa3d8d9d56f22256d485b9b45b24d3873159adb8ae25966cc40f164f342519e88d1ead1e711e1b2bbd4be64c7e83f056f797c2d3a5cf7c5025f92be5637fa7738a1bbba55f761dcd1451ce4b1e85a6628b629a2f7917a86363b01516472c0f8614abe2ad1c9d5501b2a44a68e3eeeb34a64541125bf49138bcd15b7c82dfd40708414b85107d8b982c4f99783a03c707a37787a91a7198063f0e8a2d52dca61755105faaa09c063c7a0849570cba1aa7ddb3600eeba602c7e7c9b90ed00ec731d4d1d8e4bb42f9e9db21616c4aca48dc27b939428834404331288f03c2b5e887103c51748d0257519c3988f6492eb70cabbc2dd8a8a910d737a678d0970ec48bef3b81673bd10b687b37e11d49e7cf90c03c54826ecd833bfd9dbb8174274dd45b139d08371d5d248ee33298193194734c5863adf4bca92bc282bae2f47da5201fc240dd0710a22a8d922faf92c2071a7eede7ee17232d3b6ee5f3ebb1a8b230600b243c860968ab427a5f540912e5e7bfa0271201f288727f2bd5173539d5318e5c1c0a71cba4d9501b91c3bffa7bb61b3713f1751efe94a66e17d2b42da51d13c3df40f4db988dace42a6a1b9d138c4f590b7227990711afbf8f56fa63f2800cc019bbd4a7b3a0983c9b9e5f77562dcad6de96e3b2eb85cd99d28a021a10d6734400a91369236b48ed68528afc68f247d45c79318fc5d634ecb0f3ef8536d8ec2e877adc3308be906c5b96777d0e05970023e5c5dffed12310cc97249e4b95e32451c9acca8394fde699deda57e938bed7167e62e2cb62357f82fbe821ee73b4e09c6e2f512515412c2f27805762a8493e74a3d30bb409e499002a97354381318af28311ce484bdf7c39db53f08f73ca5793945e13fc8c66d503fa95506b37ce134ce2945d75b424ca6367ef4ed47b9cb8ba7de80e773279bf23ac888eb105385ea958b1b49b27c8db6b1e14a5c8ed5d28808a7d0b6bff1a58f24f9c57fd8b8f477a9d1365f89c698b8ba923896181299d474b93e05d3c915b10a69e61910761a6d8644933c593661b0828afeca590ca18e702322d9140d98fcf836c2f7a4f72b59eb529823a52ab05d919c3eee4db2cae1067213c5070450a160fd52fa44bc9bacc5c136701cd7adb1faf484da376477da08f6a4dcaa37af47c7b026c2da9d5fd0b30741357104cb2bc0d3cebd132b5fc7c873ebeceec5492aecab95ab393f35b93b923d2ca071e6bd8522c3ad8598a05e96646504f1620c045aa5734d665acbdda0ef73612be4ca4d95ba069041e042497f7b10445869989ce30f55206a1feb4e64890b7d1f7e9df2e88a352674a52ae4267c06592d425ed1d88101cf94588135892218ac11f3976ab2b47a27f02eb887696c94b13d48b4370eb11222274b5513a0fef905c66d0c1893832ffdb9b333178b65338fd8b81094d8f86f2e4e96a47e72032cd6fd47af87eec295c6e980f595b57f79abeb4654c4039fa03ade732b1e579551898b801ecd6e0fb1c5fd198335834b51673d074a8222640d2a969998f5b878bf897fdcf3426c4e24a7c599e5567643fa79ea5d20e7de581a873ee0181e3632a4e304f9dae09a81f882d4061ec17e588793b160c93a926874d5a8b78727f88de9bc125589a9562db5bb1c01012bbea1b2eeab68877871ce83455db43cc48455effbc71c436aebe362af22c6a319d134f65681c4d0d51f9aa42fb20f48ae3f7065664aeff5d8349624a5d79eb0bef3cbb2a1244ee445f560a6bf7a796b2c950a37dfb85ed5be11e8e305e835c9e077e676aa5ce23edb1f74806278548e3fa35059abc2f032289f9bd76043c8dd1352b6131cf34f66bcd0e7f1d13081f5b08ed0c69136f3b7ad8e05e9fe99a9b73624095f96740c1f40074e5d92ffeccdc0f15502082fdfcfc97a800be511c22b875f2832b2b891cb1aad2a17c7bd0be4427a4549404172f7c14d5e425e14498237c26a7813cd8612d048703cb180f1a6194f688b4644304950b078692faec7a2a5c5bbc482f3a7e8ef2825c4c19032a7a79a2908ca9774c6403e6b15625c485f2dd078902aff769dfee2dca9373704bf63ad981b51f61253910fd48c49ef10e3938f35ca8dd491a8e569baef675df30367b093f1088ebe8f876191dc32055481d074e5e47a4bd728efaea9fee3e83d8556255ffb2fa08194bdc66897d97d1557186d5f873169461494a83368ed8065b9a033fa4c2f07f7c60f945b60479e3c89233d58f674c0c6fa5918150bae0c6de2b65a09ccd490e2ad8571745bc37e70982411af667f3e8e9b9f7f75d863e5fef05c1f0d2acc7c86585a83ee32e0a64a9e67e75b80def5bfeb7cffe6e6822efa7a9cf049689b58336b081c039696e0fd3b2a2a6b0d177c9b3f8fe5cbb1c69ea93c1235b2c5b6934f603127eeafc4ed0728161612acdb2ba894a5ac376c4ef1fa8d49b4722379e5cb39752837395c413dd29a2a88c03849b6fb2221fd85ba6d5a50ba7ee9c09ecc5e6dc66afdaa1b021282cadc68f19529eadab809341187d57cfdfe01d0798ab8a94277b9b868612e575bd98f70de80ebe5f57637c511800373262eb5ac3836b03808ca5d5f732f286a5f18a7b7fb8cd8f60e4debe54731c9c524b84694c5469975443964ed28ccff2f4e8e0cf4c60c1c8a092e986cf12fa90a994e4f26ac89fabe8a0d1e27fdc00f1d3d3fdb73bb76809f93ea113e336cb0a5438147e454e262fbb7d656aa1be1288839bc342b48ba7d0e72c85a2e24be1a97dfb2db85b5d850481e62f3b11a28c6407686e73d550b9f1d0f010602e82af26813d2484a8db2da0814782c8404b2865abfbe3c98a07ffb37eea6de7992cad73a9b81ae96a9acb13ba213eb4111d868cc73b0432d2b6c2d7e0e0ca7ccbdce86d01576e1136871a07c76498eae53fb7ebf2e85fb8561d10dfba740400ef4495ece7eb33ce3bce26344eddd88cf1ed8028ec5fe8e71edda54dbdae08f50f8df6295f6d7ef1163f62262a200456a7777d0565d7f5832fcc7ac144b5c3e0ce3e5c9b7f880a54ed5e80662e96b356ff58f2e372b1dc0d73cb8b96c72caa9e5dd312841a8be23f838bc706d893e1a8a48b2c069874c293c41d00226f73f987aec8686046ac4c0c972c991c38b98cabce30e7255dbf16039b95dc7d103fde630b03441b15bd2c214763fece9d6778d1c6354d2c9478c226175c02cb006006715fffc879a6a2b4111f6234ee330d6c84d453c9ffac08efda1f380110a8ef8c2fe44e2ed644cc3e0146b4d02f76586fbb6d69b827be38b9add444e2bac4d7165007cdbf2ea8c4b967fc1bb70c68b229f19bc3f79cb13ee6265264885f04c09a96583f331ed46de3e5dcaf08313ba6053f3d0c1916a0f", - }, - { - "3ab6cbeebc18df951d371e0f3cce2697fb367476bd9d50ca9e668c77636eeb9d24b68be0ce6a75eca194fbde6221755d57e9d3148623de24896a9becd98789fd3d14de0c7e53f81fe7f3fd491472a66b5b797fe19c5d0525c7a111a0289a9e65ae7c712ccf694cb75c490070bca7db17205af9bdb7fee27f9ff41fc78ebd2d3d399e690908b5c064ffc0d5bb67b0d2880bcb45c2ca2741691b6131aa1e5ee758fc50610406216905e13ec049ee92d1f95e16bc283dfd91595ec2037d20ead51d3a362140578a4538c80581b79852b0f6686c1ea66aafffc872024592ec1aaf2650d167a75bace024b261db4ab48b401cf85ec2620dc12a7fc37012af8ac1d6db923d82eee962129bc4ede578782594708357d29118fd10dc6d228bf7e461d2769e556488b776237b6309f3dc2e884cb2df1f43f71c53d389765f805ac053d05fa835e75fab0adb0f13ceeb425637f43556372d728a00fb005f7c5a20cf2b7f776066d60b70b11a848005c6d63dba0c93f139067b39017c997dd6b94c0138c3619e9a6d0e4b8792cb8d58a2ca12ae5d03e7637f2065fbb9e2d1722fd3aaf234488ca157d829e9a3b642458054f3dd58da41d7fba6d2b488a327b776d1aaab1a364c710e755ab22b9cf7abf1eb8949c5ca20c070f275f8959cb00c6d5ab7879003f89f795351a4ef4850e033d929f9a349b9133b2e0bd1cabbdd381594bfa697b845100b96b5fade05db12de040b814ec49489f39f5abd5b37f570cbb516636d5b7378f12872d02d4de20b52ed8ca0b12029a4c084621bbb578b870ca2ea79fd5df1ef8664bfb3b1a1bf038e4ba33f6ccde42c5146470c9dd293aa747d2372db1561617920142ac1d32e4f1fd18e8b9e72b7efb8fefc56d08f00450d23b7e8381849b1385ddcf9310a4850dbd6db7a4992690190655760f557a5027b5ceab3743365ac9041a5c14bed1126c4eca00d7e0a0e0e6f666f64bd1466387150ece5835192149237d5dd25e703e9d3a4f652ae04601d6acf8228e4e86055394c3abc9dccd02f04a60c298d101260b408b2620c137f77e2019fc6eaff1b234c56dfe922b0192656254fe3356143e969f64b7609cbedebcc8cb2b68bcdd9d723b9c14669da6cbfffbca2351de51e87db6afde435ead0017682b8014f91d9734a9ab9b374257273e114a8fffac786d53183ba666d8a67e30c1fe45bb1bdcefb5787afcbad213f8e36e78d30ae1305df96bf450349ade655cccbb17d887f79e00728abb449ea427fd2d0af80e3b5607a74a57dbe5264131f2fc49cb74415974b3d43ff872d4106ff11b680f56be06fdf85ec9dd850b1f77f759337b9a9ce04e611036d3f45743e562abe4b959eba7424a712fcf7c3f3773886aef22f7cf6168efa83cd3ff70b9521cae1b6689b2b8c423d883a007bb138025f2a31db2147691bcb365ac242efe40cd09a746cc501ae0289e80205993b07f86538d486803da14b74fb0db6ebf1c2bb8c36275137d654c1be56c65891cd50f705247d85621fd0d61ade8c05cf4ec15b84e8adbcbe017d7d5743d5e91025e0154a5d9bac7c6b8297490e9c195c5d74e046219c042219817a5c56636c7c4382c6a01d721d88f4b4d20250eb5eae5f3ef481dbf8a3f47a1d51d080bd4cc33f12645c8481e57835b77a85a2d83301172782f22026e69a43376ac4f5b78734c9eb914e6c76c6a12d4127cf195ad030825322a279093cbc40a680355d086a27f3fb7560713b019e7c286d96833dc60590e9a709f2e3c632894668e74ed20e42cd83a23ebea3dc3bcc49d14f8697541780fb2072dee6a5672d0d4e7bdf5cbdacdf5fea9e03c6d9cf0faa1e954172acc26dcd344bb3d9b2e0e6015cc55d19713d795bdb7c21b44b305e69c69fdb7261483f9693f36f45d356462f1ba4498de1c2e8bc3e0a70893acef2006dcd73cf15b265a8a5d4ed792a34a846d8f1d3b9b3bb75f1c5e57a00b36c00203973ef4e2654f6cb29e4445318ed99f0de6ca992281e83ed03feedb66aeed6a461c6f2871ae95343cd9797e58430d5639d7ef5c59c78b29f76a055e18e2b85eff177770c60ca4f2d61e612e617e749b4653e7901b62ba02dcbf50e59219349120ac01e6b8a6e98eb54abd16b921a1ff85898f90fc49a3c8f8f4ae9b0dd32c3e7f2e1527c4feb67a496390f28532f20acc71abb8bb4f71b434104f41e36b705289858a4e8430b8cd9449b0198ca2244923cff1df0f63833373c275572de5a9a77b23e5ff54aebce8e86d02651f26ae32e69001e5f3951967579ebe8574682cef8c12dee0b18bc999f8cc0f07e2ad3ac94d3caf30c1c8a8295756aecbbecbbb4ade8a2b8015e52a0eb1290693c6316d036e0c443fc4ec591c32f7e7f1b3933c921d5812233d3c21ee5528822b59ef2ec7eb62f7b04f40cc8238a473ec37a07e54f8907825ccaa1421c2964d2c756be450dedc011e1cdd9045720421b9a4a00e9d3076c2fd10d71ee36d5c0fd2c7e42396b034a4cd0245027449242dfdc42c8af4a34df1b4150097726c9745247b78bb2bad5fe8af94eb13ee1f41dbd36e56d801a4c9c5b9ca5d3c26f4714b6fe9f69b87567426eb6f4ac97e8c9541eafc19fc90d3b24aae0f76c4f3f81063d206ff695d638048c2cb023147a78332939d2f2470d16f1ed0e5d3d4dde438affb2809488b99815e54938fac3b02deceaffde310cf422f9027f364f5e79da5d2b5af1b4138ac9f9d301f396b220829c1f60cd2b54ef24576e5ba6ccd4802900db1bb4eea57de7787eda0e30fa90cc19f099444488699bf7c442c398c2ed989d084c8cadc97325484e337848c34562b3dea6f7670f935ed3d5216c970e04351651c1c31a34e862821bdbcbde202d91fed38965e31cc3b6f1e52288f327bd0a787ecd92b3b6f535d1d000b0f02d41ee01ca54e4e6179ad7fcbd60f0e41dfa5c9cc7ee4f7de3844fb385ffa3b24092b30be697f1fd32c9faef29ead346e42fe2ab1d312901b678b43b7758edb7eaa1c2d038b4cd6a7dc759a6b12cec955bcf4179006a7ab6e22ef15986df107080d340b8870e2304d57caa87a9961c04655d7d66c7f71ca9260e02aced131d6de65d256d6b487141c51bc86eb1e4721742f07d09e799b30da7b5ba94c8d701ae34271ba06f8ce134a7a9a2598d1570cf05edd9ec868cfa2e41b4c20a8bc4b8bfebd45f5a60408f08e931617746d1464bbe1f3844ab3272ede635f771f9af30e483903ee4d0cdecbaff4d31451e7791dc97c92042fb932fe1c82652c1d682a55912e33de3b1299db076cef594458670dc4f911f4a244e2bec757dad4b0052a41235e2f5e60b929682608c16a61287826218a1ac3cf0d8286555d5b0552754685c365d4342f0d9c45065daf6786179da791a86b50a5edd6fb4b21f09d9747136aacf79ecbf52b00fb88b0630ec7f0a6699901ba4eff913a3ab33ac85a71ebb51ed343eac86eebb3e79c16e664078ccda09e77ef8e0919b8cc447116b65ccbd5200fbfe86e9bac5637b33c9bcac9596b57c14ad5da548e96a8ffad5f5c69247c68d464c770011da7b45a337f138cda6b4e15311879bfaf12af4c61fba596780e6adcd5dadde372823da6014122dbac70f0dd896a8d387d3c74df282a659028d06cfeab3ae22dcd1fc3ce60f69a0d678aeae0e5681952949e31ccb8975cd167c9d012f4b230b1c1f47022eb1a3042951b338a734cdd17db0ed483a621650deb3510efe74191a94611dc212c0c73b117a73b8ae41892cf176742bd98a7cb73dcdc53b42df56d640739852335f8d44d901fc884286b433fc285fd5b3db8df0a8522cea3182c071f559c328b8516c9252681a94eecec7ebf626c0a9014d9aaaa0c694d14855433dae06656657d1f8a939123d28e00513d72bd3802d211ad7c1e06b9228c0d5656edccad5339bcdddd5e01afdc01f10974be3187804324fc513ba583b7b2da1e9096bbe3d078c1adc6c34d92c54e9c49fccdc17d10e66962120ee5d9b1cfe852569436270cf7c4c3bb12568050e2ca4db08bbac16214238413195dd4d936272fca5d56d7551b9b002df1807ed44abc84c66746387b79bc9e830a635c308a7bfad7c2c22cee6d3d0c5ebd8b230837b7ceaefdf71a67a3a8eaae0c36de86b2d96e759b8b53f8b8604775eb7a7e13223cb21033dc87d775628581a954085c2d66c1c8f225b1aa86091061738e7495cb36a5ff032dc678904bfa39a00285cd6947865b6d4805e3411644b4a4c94a6fffe05ef31e156bae6165d801685dcec195552d029d22e5de393a82ddf3cd3de3ad8cd6bba2325a03982204f07fc3c21518ef17a601fd743b27f7191bb446ff61d3c61d7608777990997e911932532e5b3235f13423756f5b6c786720cf6682932c90092", - "50772c5a0e156ba13a9d86edc0e600021d56f7d31e7e452a74ad53a6775339c7ca6521d87a8c79b42900a1e9e6a1ec03f7e3d615611c3fd5c9927c40e5b508af1a298794b60148df01e9c9e78ab5ea8198c097fadcd6cfa6694be64e00eefe1a1885aece86f6ad87df766e692b58ebc41982bef5", - "93a2561a9904a1787a10e2a668cd6a814f2877a7b512698e94796805875c8d1a", - "588d9bc1d98210d9700ef488", - "165d8c9eabcd5e93e6eff7be122c8c242e1a7f284790c93324f924efabcec4a4ce48262011b7360c2833143d645ff295453853c92f0c48c6dfc2af7ec58d9bec0d13239c7e5593cdb39d49376c6341263df80c0ed2ed79fe9899d0c07de93f6ea95a5dfd307e49bdb5672b158a4df623ee86d54cd1a0fa9a60ce39d1f5f4b6b0ce9daf2a61a907cff3bdd3f29156ac439638e0910d728843ae17ea7368814ad7734732e7c023d4954e1cd5fd19fc9b76e9bb84b61dd4371478917757b14b366b4bfab4eab0d9de746088ad43d8742e2b9e58faff15c2eff084df5f4316111d5dd7d23cc0b1ee1000253f26cd260aa636f03f64a8342e531ca1515b3beecc3ee07a29184988325322d5c09754c278231f92c0d980adc919d4fccf4a1da1d37f1ddb58ca997d6d700946199fa007c43853b6caf5f8049233584087fb23c3952414ac487e452f0c3898486d04e5b008b843122501f9c8a294da9159a04119ad5c8e9f5c211411e34559d3a7bcf2ac10e0174f94f3f2968c80ebdf4498de172884dbdad0acc3a887f9bfe896a6004d54cc424567d53f1198ba33c56aa460edc6af0e437b34322c1144854bafb2434f00703c1992dbad0ceaa0616aec60a380676ca11558cece57a936959d6c2ffe0647eeffd37524fbafa9691f31499701b202d9dc9980e79ea517089eced779aa45b522c9ad193e63ea8b64e8a942f630d44370f23b7e9acfedac51dd9f139f8806b09a8fbbabc76fec3c3721fad5087a6d41f93973af8d787d8bc74a3122d99ea14e2f30a3c90be4b695c8b269784eefafa52d6a79e785eb47a23d72f037ca572b7029d2f37baabce57658119fb02c5b659e3aadfe0052f1cc3c0afc6fe4624533d9700388713945c20c1d175da53738fc73f48fe57fef8305e796b474b6f8d3fc5040042373a13384237d95bb045ce0c20934a964a8372acedfd6e559aa84180a86311a3996cc17bf7f73e5d85d4db2529989e5836edad490aaa5f56d17326825aa20608fd209903335de4b36b79f68b6a52194f6ea8ce42570533df650e65b50c367f69b9f08c32b3ce3e75318106b8b2c6b6d09369c781fbf2aaa35053af215b621f833814ec4778ac683de0dc22c418b077a917a6e405ccbde9f72ed523aa696be1a6f247b096b9235217bcf19b88d43178cce5a7d82335fccb4c079e00280bfd272b9f16ffefa7fea38d09dfb2e4874553b135052595812aed3fa15096abf1eebf9abd598289e0d156974de4c2654c60825d42b662ca7439816d9d3a0255f40a4965504f643f029da535d4b109e8658ec570e99859382ca0ede0b0495d508c63c7f1eff3f648c60e9b773590cc663a751178ba7603a11985ff519056661b9460c1aabc30e83bb0073a927682a06d1b8050c345f7920c1a37546d79587fae2a92c803a986248f90547f0b6c0ad0552d8260d2a0dc3cc76d092ab76b8c12f05dcf141167a6ea300bc23227933396ef6fe9d51a1ba5a754485950f06cfa6964db2d0fd1d4393cc36f0592fca25ac1a6aacda2a32f548ed20287e3d291661848a62d41504e4fcb1cd1785617fa5786712b3005f1a1041733df6cf838ea3ea0b93685889bc6b2857d80a9bc0e7a66f7fb3d805770402f049889311fc112dccc72a25bd127777fd87bf5ab56d39bfe6be2b45a8301c2f324dcc50b27540200d522c24941701f7293b8877ac84cf35638507c7d912a3a94e4384b68c507412df65d0c4ca8ec2da704bd4483eb2e0d13b68c0c2b68c106a55b9710ad0a1436d655a3cf3c419d5e6f027ddf5dcfc896a5b316a7dae9290a7bf81aed539a647c8c98e24e7ed6a4f7f00a11134ca715e5826625c250500f8f16b40de048b095b5dd08268407f58a91c86c36ca5a2bf4f8fc682adf1bf601da24414c74956e1a8fd2888b5260e980c32f6678a4dc4ff73220c22593d23144b84c2ff56920342248876d15ea54fc100c09a81b802dd15f030bda9aa08727ea49e34f0ca8693e0a06d0af06ea7ceddbf0584adfdebeb20510bbac683451d9f84cf0f4e85c34d979e550e07e7f414d6f1011cb3dc28d0df6d4aac113f2d5b04e4486ee2cdcd4157dafcbbd55e8330a7176d1b231d9f47a63da9ee30fec6cc2c5aba3a8c6154f79997af89d972743255355647235ee939f4f305ec655271e0cd562ff6f401b86dd5826c769298445108ad0d9e13c504551f74c507436911331db60ef0ea99dc259b13cfcb0596fa9b3c95cd7fc3b1611e3b012b6719afbcee7548939676dffc372276aecd08e6a14251407cf995266545427d49ae5ab245cd5d534c52542fc71b3973f0b766f3d234c8baaec8b74eaa8ba90abe160b4504769d02e08d7af4e7ecc167780c619cefa58865169b674b2b1e10d82f6560ba0be41a781f4afa46bd722566d941a8e6f87e4a5c03d89685a22a3470354f2922e2915f9d46288a5e8896ed13617dce694a595e379f25fe621dde8ba73d865976950954e5bd07db147a0fb74f87cb06aba49b073942b82fab33a878651df73df2721ef800b658bdc6c359d396f684598e93f38e79639b8736b02dfcc124fb9fc199c35f2fa1d0dc39939c57286e58a7deed7b6c76e02b99a14d9bbf11f65d8eb7fa096fe4baf0f78cb34736499a0ca550f10d7edc8909dc34b039e3abdf1aa67a51d37a2eaf4c07022897d4d8355d3325bcf392d91d02d462488ead90b366e9645b956c3802e4249d34b5b2b2484a1dec15a9477821df6bef5e1626ec5ee9832fc3bd0b63a3c4100d32fac3e9085f0b5ba43123f54beaa7ccbe6ba68231649f35a28acfcbbf97dea2d6cfd96025032b3950ec8437108d0f07baf1bc89e3afbc2cdbb5031d3cd9e20b19018adda466382059229e4c8c54b455eda4280bde43b36afa96e146e408c7104523d5f565d22ef86d4c7cbf9c6e0d0b30e37b37feb9332939c642eacfe19d0dae1259d3267635051ea5f9b518dd74786e45fb8bdf72cbe3753bd50bea2a961b49cc0e2d589e77fd25ebd962463fc728b1d288c38a79a182b124d345872afbcfe792d259e7e5334311244edc75d05f9a12eadb61fd3ff79fe8c097eb01a4ac1f0c339d3be74be3d96b0b6a15e8868d043a0f2007ee8aa51756d78b7a78ad90fd9a26afbcb51fdc20ed7a3947f715c833e363bb87504d8efc9f8b93a993e2e26430f79f3cce203b09093c9b456b1967212eb0db4f7688d4dccd4a523866f75c9d9e7ce07825ae34399c5607a60b771866a647b6d5e1e20795ca906e451f367d8c40ffe79a2cecfe7aa47a402f8d49be9084661c96ebb11f1b48e7e8abd2978ee626f962e98f99db4eb3c6a52aa2bb2e62194120ce1e773b9db784e8c9b5adcfb70e3bd5717293eebf014e9872c5c1bdf3fb296cb88eab5e97a5ac320092033b49f37d840dac23021c19ab2a89190f3c8dde927f6e6b41874bf71ba7747a616682bd5b3f17a1dad40f4993a1b186ce4f44afb4e36af7715450bac62cb1527eb8db1d87bbc4d9c99415d16660e48efd911e02f5777a77e72733af3c3f5315dd0c785d5212b79c46c3bccd74582c57cfac0d50fc0c85370476913f9d8e8e10d0f6602f2271994972de49ab1a91728713c3cfcedb0e61c270b5fb331a980965bcfe10b41251a0f7915d5943f49fb139626f1c424524f2fba3a407e77dd7513669894fd09fff4185fbb997b4e4677f6ea0b52892f013f1691bdb38eee9307a565e396bab484d91cea9268f49aed29e319b0add900b6a75f7461db5486aaf5366f98df05674361308931de753c70777de73337a996f6d4b0e06d63a69849ba7533bb0e446f062edbd6250e61a49f4120f84efc1cf74c1bd30cc61a2d719fa76991dab119fc814a7c56f48bd584c7935679c53bb0ac78905b5d961fcd89a4b567d17a5182651cb07146aa9a94972ce613e8ff9c878a8433c0244052f09980a52d800e97ba65e8ac186862def58c72b9feec91266e26aa5075b3337c7bb8716b3acafe666ffe2df32b78f9995661d3ba28f8a8780436aae1da2a3e6a0a16dc562b8d5df6f68391aab73a10508e0f55208f974a0505f0fc0d8a55049a7b631fc94fab91459ae1f199527362695b41972e50faee34c5cca9e35e8682099f5e9652f88cfe9fa990ff2154c89c1c2a4ed6bb8a889fecfdf048ee0aae7798c55d6cdfd062cbca97ca289578c832d658ceaf26faba54c9c3ee9eb5bac80698c1441b9cba287f749a5e30d5cc715a01c89353ceab0974ae77fecc1d2dfb31a5101783cbc002c73cd155dfd14685c2f9acc170dc437c649b6b4720b676848a7f9b56cc4787eabe72f6e3f2aed776f9bb1432fba93a63bfa44fbcfcb6eaa9ef4b79b32bdbd68cddbb9897cf5a02c6f99fc765790092edf0d5bca7c55cf232a03fbb6f3eae09b12e09a9b49a538e0589394700d16ebd3", - }, - { - "3497e8d61062e6f2084ebf72d00e9a47b550591edeee9746f31ea28039a1646d384c4348af293ab778f92a4807c48fbd14e8dbf3d67339c991dc4aca7dae38b5fb7bfeaaa538611d328b653950f4f664dcd257b345917cd66dc6a1ea75d99f70549d1af9d67b1608077b41576f38bb4c0a13ff4fa47b251142c6fbb79f9a27f43841ed0ebc0416c37f571aef8fd63b99e93ae88db50e9ef7d499ae7433d5686b165579d3598f96d9e7b1c876870310703df8fdf2069beadb34984f676eb7d3840c4c5766dcee3fc39f0739260a499647429339482e232362bc72c92a299cae36e9069cc5f4db8893e2c1b9ec0b4f334de26c951090b9724c2b3b7655d8248bc12a27861e020eb1e4cf6ad0dab903279b6fbdabff761d4ba159c1f631e681f210a8782faa86e08e554b5e30046157a0d1144bd08a691c2cc2dd22f3c3a4e5d44c5d03f7e3e385382ee4683345c0d316d41ee75f87038b49e0ad3ca45121789e7e7b95615e1a9a8dfe02c044c2935a97b141f639448182252ebfc980e0411e5fbcb3c01acd5aa7cc5d67101ffa6ab6acacace5f02d67155c26dedc071ffa66dbad26f67a819d46de0556fdffc1b4ab6d60905d8ef873ea1e51c62571c08b4c6db242e733e02e11e5840ee445c290b2232010b118839b37d4615c4521e8928e9ad475cdb4a3de9928ec7e6daf0e20d22e308347b31e7e877fdacda0c25f2e5c33a329e84707816ff4ffdca30dfc753c2cf883df16016795db34359e9363fac60624ae4d2b30bc1f2f99c23d953779c22ffca145fd08dad83c0f76cf727196799544c6c07483e0a41ca2e1b1da5a730956154f531d292b5a39a229ab13bf24a804eb68786e481c8aebfd3bc557afceadc41d00e1472c3b80ce652be1245089283bf1a1a93abd3325bb6eea121db8c0e1d6c0c31decfe9dba63c89b881824b0531651fc500f2f75ca9e5fdcbb179c9ded5d600a495ea704c2709f4a88c4fadcda4cd82a5b089f25a6fe0161159efe03fb5e0d44bdb5487f25e8c9adacc389860f62b06a6a4f8f104d9171622f70652ace736e8b28b70a4d9fd3fa4b9784d1a6e6811150d0a0601d31d17f6041e58a1058f99b80b0a6cd4f79c79a104b6bb731ecc881bc68e1d99ab358faf43d8504957ea0152e46e27dbfaa17d0f58287276e4fa82ab78a03513d5b4c3199d1362e4fd6447d1c26fadbd011abc69332ed0181952b391f2e8a5c89d68e22a7c451f69a9573b6bb6d918c7e3d52116f3f12f1d43d2af46bb450f58bde1732a268293cfd9cf2b90a844588c1979a30d6ac21aaea4b9e5500ef4a8bcd62bd70cae6acc8839f818d23c615e45daf14335c36dd46817c9b816be60c3848caa812b055da33f45bc01721d6fb7e850fb1e1458f27c70bc34876a955aef11f5703cfacde03a039c3b75b99b2d91fc18b00071a28ce25eb169b946b49858aa0885a4c665deca020a3fbba55d4d9175fd91e7901ec9eec0239806e8305f8238e5270f4af5c94d0008f8a5564636cc33c8a3d3e76db2a7915abe798b0dfbb3e322b33e188c7b188573bddbb9e4a7edbd4bb194b9743c4aceeab449f8affddbc2b109eb3d84f3b2f8b18ea2962680437241d82bb6146674ff1abee7baacc38d5dcd688b425c3e3b0dccdda3e36de755afcf7155d3d7cac2e279baad167e2a743b82ff8ddf3db8ecfa9680ddf468339427a4e9fb8ca4ce6f1e790c24e7269912a9989088c65965b0efe68ed44eb26876674261e3e72042f5995f1a7075b3932f4c23a8027d0db35ce4322122f489995bcc0b3fa32b7298c4c1b3354766c866a2fc0ea5690c58c5e08ae7037f70accb3ca7faefc37d78883f2bcd768285dd2571dbcaead813a0b8ae87cc1df868e93500d414c4418d5c80b919f73b9fd46111a02bfc884f9d30ee14fcfc1d55d54256b9572afad4777b8d8172c911472a22e7461f6f85aca063c19d6fdef3351149ee6864e93cdc54ca5dc7837f0ead91f5e3b155795df5dd1f933cee8671ffc05058353995019e5f6f55d2de6470605a5411afcd7fa5aa8f38d77dbf496d7fa9c5a4d35ab661aa15c77ce42bed44763166160ed5bba954e470c293ca301363f5b837406ea8ea746057588c34acf266030864d8c40e2da88ef04c49205fad1607d456767d30eadd884359bce04c12e35487bc1885d9b104c9fd4dea4ceaf054cf46cb3c77a619ffe963acc9bfcfad0447591ccd32cdd1fccb1fe7080ad75cca2e17f695ce0095a774327123f21e2839773506a9f2d896bde87dc5e35512ad733aa408f8a49e9018d1013cc32f550c968a03308cdbc73ab444f0a79a13450d4de906369da4c6a675d7e338f738358dc238be4f047579c8ba7a60448da541cb9e57f22bfcb8c26280a59b77edd0f5a009a3ef1e2958d6d3c3372840dc6a0c6ab1fe86aeb7590137feacbfdc7da57c77595b8572b45c4677836ec86fd8c4ca8ac351397aaa3aa298d752754507e1cc514d41c3f1ae0a692179218141f65bccb9acf6244730c6d00829455d21371972745b3665f930cf2aa9f0abebe6f7b89094aeb4dbdf7bbbe794f134b6284e289c995ef2929fc1bd39b259259950de29e57cdec15c4a7d33ef6e689596a6ce23301d25c2ace77fe699d90c2329da4d0f471bc093563dc735ac2fdb32c6995606a67bc953534939ed1236003c004d3b47590beabf39a1e4d5d1b00898496e9effda68433da17d1ab3a32aefa3681aeac116c5705077552649153ed15e9d704e67d8819579feb02d91db0d3533182ff43ee5648f5cc9a595ded4772d61e77bd9bffd6f29fc1f478dea44c32d5ce3118bc8860b254fb0bb1e85223bf709a7c0b9a52fd3914f1b1f295fd246bcb568388dee43a32df45e3c798068608a102143b5511746903255b98238003eed68776b46bb0e64af6c9118ecf9896709aaaabefbc1f58bf45b45768345b560ae2cdbe4d7da497736da8013c4098addb4258cafe7823bdbdd715250b707b155248d39fc6773639e4de3b201fd3cdfa1526c4149ee7d15bbee680c956fbdea844b1470a287d430c5c7e2d7b51fa756720397bbe214c19df3399a989958732d93979e361f7266e53a59bcef695435db67cd8749d258e7d582726e1bcad1395e68d7848849fb6d74451a53ae6e8989c64701102959f7fedc6a5cf8352e218396f9181f33037ca74886fae6e57460bbcb71cbe4cbb3d3a81e2090434eb1d6d5baeee4ede251952ad88001ce047279cfe435a4afe97847f798d84ad79a11bd44f09222d2f3b7fdcc47ff8a4c61f40c4629a0f603193e0aa2164579a05726e547c9081abcc0087907f8034469f740a020e19623fad42e9cea64068abb3d6ff2f6680da328061c200e1f646816a5083786ae5b71728a0e5cee14d7a942379c389fa9dbc7afe7e7ae075c061df11e4587bc90f92f1b077c091c43a25e7b3e870ad852c2883aba2632063c4ff74a857ef7267816317f823a8bc5dcda311b513be3a40e6bdeb89210bece50a608e624f00c9d063e0c8878884e45527f50a3ab4447a9a01652322700f087b6f96ddbe96a68ef98656800eda6563015a6d3c0eb1b6a9b21cccd58cdcdd074b73e40a098a980210ef831ec9e881cb42ee07519fbdfa52d9c62766a2046dee7752f880dc9082ed7f050b49ed8d14307b1b811bd87b6db2419418e49885d20fd7ca8fb45a11a1da17ac2304393734b552b5d02a303ddc72d1f456697a287851f207054c18a6262f5349348c806841d21e11fd4e4ed9c01fce1688483e009930079f7d2045a34f98ed83256dec66400a783d58c61619e6e42f6e2c6e6fc69e76651b96aabfe643ac69681955ce595f4696b80dadd1f3910061be6ed0840d47e928dd93e7c3d6932d3ead820d06e2539d9a604a6b53db6bb599da851de7cc060faa9af76d708a9aaf371dbc3eff0fdb99702504c3006f789a49feb730cabe40745837e2c8c17c77f999333798431231b337357637a5efd1eeed891fb7475f2c9f960e67578adf50241287bc5599ee08d0237f08c86ed9b75b62d612a9353e48cb4cb022d78f73fba1fab7f794a5ff64c97e6c91ec464847a81e5a5253989a1ee54a41bcd9b4b77bae6e72421471a7ddf0136edc59b72402d57e542916ee47fb3988b7123c6e8debddff2df171d4ce61e83c3d41f36143c9df97f2f68639f1bfc2a9d1fe175fe9f45e17e5cfebb330d3f06e15e3cf58acaff09ea576d896359a3f06985765824bc499319384e4c458d4326db801c564b0b503552bdbec60752b670d82cc8fce9028ff24ade3e805b81a72701b37d4ccedd72118b20d792739e035bbacc4893ded88619a6c499f246311947e48684a35406c4ef279c71ab2a74f6e5313f7900080f19aec3a39109d4aa41c930c66c84cd2163f4cdd59fe84a86cd8bb6468bce45a56d09490e032da844e6d90b436dd874c1cd32a75d1ae1d3e86d8a2ef948649eb56dd7b360f55ba5dc34a12f9279945436c6fb83d1ed57ba4ae1d9342a3dc2df9baa82fc9fee927c13439ba5bd2ff9f3e6f577b8d2df731db14c51db8a14bb15bf3e125f1ca4cb2fe856c5a576cf995db5010687d0799581c5e76d400c1855bb46680a631cc582f51c589a831", - "823d0cd34e7450550da9716c1f456ce0cbc79431483a6214939266581b0e899e4c95719a09c1ef166a618289a6ee6971b6fea3fe380512cb977823b387ac51d341c26d4a835c61eebde37764d2e1d588df7886177e98e3151106c898b3196bf4dbd83f5f", - "a4639c22fc7f370d8500a53819102df5e86c541c0ca10e8f6564e50b90c28f34", - "34a04df283c45655a52bdd84", - "cd8d1b2e5f65ddb3c0da8f12096134da22ad4d541444964077610aafc1f77f8da5ffc75bee807541cb6eb0526e78d57fd88fa9d9608914cf391ae7ccb8eedb0aa711889f9b6192601163b271c90df5d69fef487b6c05a24fc667469cf16cbd5afd58fc830119fc9f61b26dd50a96ed84c96825a615a3aee84ea4c950152323b20884346b25c9e2a6be3a93505ba059fbb114c224bed8f05f54eab76b2c9c23a0fd942eef9696ff67484b542c8347f1b1fd7df7242872b3528c9e45030447b2bc85eaf191963291e4223b75778335e5f1256618ff87bbd68b5a9e5cbd2ca1dc8aff4625c834edf8fb0d879b1f75ba9b85895a6bb4d7569a41bb3be6cdd020065bcc69b44a8fa335d9418ea2d090d8061e042e8e1a6ac03a6d5525079f14274079734ed42c5c9ab9986f0fee6bc9ee6c485e233e9b4d6de70664902529a135a5675ae129353eb2c00b73f226e84fe8c594272d6eceaca28b6da30492c92074250ec80beddb7208f9b5418944305b0864009b3bbb3dfbfb4cc2bba3313f8f7c6c19860f1dc0f5d7aa06e3b551adfc63dddac980a79d72bd2225d54a87a93717291c7b78bdfc5521f7f3239d5564fe9c9559dfefe76b77efc2e75991f31a0134529a6611ab9ef076491f2d2d81ffc5774ba8f8009dd7e5881e09ddf5116fcb5a44e576aef6cea91ebf52c56c742049639392cfb8b280dc2229252e04d8d394ffafa539290acdd8118656e7e1a4f7bfc0bb689448379e8cedff7590a09a3f5a29bf819fd87297b96ca07431a29a07ae126eb9d65e21824c16707db89868e127f17614a536de6ed268b1600a8b02aac2bca54a09b7cccf8e184448df334f95b9f0221187d56da7bd422f09b4d94228098b563df53414a5a86728962a2ea63023d8c3f03847b36db7cd189ccfef3e623b14842b8cccb18b4f80f01b32a4cec48f3009b98ffa25dbad76089c8700e90848da74aeca81d01f4dab2b7e844a3e48bef21f33c92734b821ab382bdf6d0b1048a9866e676b78ac9398678ff626d5c173a15a0a7514b2544405dd54eccaa2791605c87d7117bc9f8c0ad84623a9d3a2b1733304b492d4dec38f7981db9361b03a2837a95fe937976c7f4341a802dbf583366fbe368a3af3f92618046bb55696cf7af1f465a5a57ec5908621f431ffc762f35abe892f772a60a3f75ad8401321f67981e90083fdd1cce40903ce56a629120d6e13c8871523c4d848664331966298c8b31a5bc8174a8c14f61cbe98ae7ee3e90bc832b04318864d19a9b8b6d49a260f42bb120cef9afbe704faecf0f428d917ead9f020f5e9d772bc8f29600f8a7623d8971c1e3c5f1a3b094191e497bd70f85de124137cc4b9fe0617cb73cd44b89aada072625e25976e7aaa5a8fe9d9e3f32db47d1565aaef0e84d256bfce6aedfa1a2dce5a94976a2bb9a0da95941fb7ed444990b0e0e87627e35f3235a998019650a5e5cae804ecab8cf729a5c712f1e7d17486082dd50cbeb2ee1b0be6a7bf08a66ab3cf1fe9f49c7083f5b8ad183f32fb35fb8a41230e4041bcf0e5ef54bc3d21ecc1fceb08d95d745a997e8f2fc3c0f6b1b6c1c02e03ff02ae0d879d13eedd42d9f9949ca7ebb785764162ceb6c6f9944dcb3927b2f4eab23ab566b2b2bcc0c7d77b82579e88203602264064ce98b5b1ed992c1bb13edce579ae7f5e11697b493749f308b33e47512533350df5c07c3dadff656197884f359cdfcb736d29231aea1524b56e06c92f5a98ea663543f67e44003f5b41907a951dd792468c84c5e0e1b46149a5c9751295e153990b78c0cc712889a21b299b0315150dc50aa3b4f7fb0079ddd39d263a754b1dcc595c76ea9fea6c120384afb38d4bd40491c4689b1afc9dd096dd0327c84802bda6bb6b7a8830bc6c06b308ae9665a8666a5551ec954eb72adb827ef38f036c51698a28c92dc1c9e25c267532da2c04c1bf27f5b683ac750c3ef53a8460dc186331549bf82868f9327422c09afe1cd15e161bc41a70cab2f973efcfc8f01a380b86a432e1ae540e09d404d93d22a20dd5f685a52f0acb863dadea236288b1714700f23d1c19e40e219e8ed21f6a393e541abba850ffbbd4030e5f6567b7202fb66d86cc2a0beabd495814f6a50690e8d74cb8b093e4d43261fff80e7a67ca06dfe808899cbef84c09ece01414baac740cbe4c656b17991868e2a136f4785a0de311aeb18cc95ed33fbece22aaed8cc1e47f58cf6c09a6f92c96f37d2d2485b369093506f5e9f8534f8569655277d0399ddd3d33861bd40c71ac53a44d1981cd744d79202322d47a0228356c0e27efa2ff1009cf2a416fb6e8844eb76b8077a4a3961ff193e1c95b222e72688ba48be82ec5da498e58861ea613782ed1ab50a95b5cc236834af98e61528ab18453c20ff978551b81e1bcc0ff4b7092bdd9ab0b946b7324b7361ef05e1f7d7f6a336281b4bb2c671a95a6ab84be6bef1b9c8c3d2536edb8d79b40637e16d7281ec5243016232d7c9fc07ed9dfcf555055d8ae65f12ad150da81f62f2e1e82b3adacf6d623ee4759ad61a09038905bcf1dbbab671dd28fc1d10a0b7eaaef73a5862ab449bd84c8698d061e79fbe52a86739ba945a01353e0f3916667bd7b4356cc65451c7003927f2aa738d98245760550156dda529be741ce3ae1afdea0de35ada26ac241fcb5d518e6ee7f9930baf88bacf8bdaccbecfdb920f3b26285439912a8902ae029b07f28c1dbcfde780cd2bee6c6e5f4520c5c7ff3ab5448ec86cfb270c39586f80041f3764b5dc77dc5ced0695c89671cf90ed34c4067b4bd938b1493c7902dd94be824810a00bbde4915d138fcc7584790bb0b6682fc0799cd415441ac90c1caa008c7fde3ab4a3aae478c64991ebe07e6c4587d3046c9ebb8e125e795f0be9266bcee5a4e4355a2830c5b34e583b0355b34b89c08011db6f6b8371de003074704e8cdda37ce42c7e395b6a37bae3dfbe67bcfd1f125c9a262d56883ddc028773988270aa30c6dd326cbffee589f38286533e1d5c9486011170be591beab5e0ce98837cf91f0a58d69d872e364aa88daf9cfa71bad167129420282d99ed5884a1276dfffb2c4100c74a8b863b063c07937f2e9c12523deac4ea16178863d975e3a5be5efb5ffbea994d07f7ddc5326bed1f5c9415c1d4ee1667e3a581499bb573595158636ad94d84f7c6e4b8efc2b141f2bfab7932a050fd88a8c7b21877cddd488543db5b11138cc808e1248b6e2ef492faa8a32f9d93e3c060b5cec10f03794248f9662ed8c283a8e0eb493824e2750ec75b3b1292d80ce002083a3c64cc487afc31b20f84a778f386b012ef7bef46e638d0f1cd75487ea46e05621d608482637b3e642a9a2c5371bead4386eff968b3e007fc263086d8a930dc76a8431a4e6907ae35c7b3291075d1c723f02e4895714803c0e97d65b04c0f27d01d5d68001bdb3bbd44dfee1eff1754fe8c182cd9bc6ee273beb2a444ca1766f747d86f36cd8cef6eb1dafe0c38b9327a8cac6e83e076099188f02721cc4de3d940c3ef19d9b067be07b890c798a79ee8c44d96c5e05ee5d5202d941a674378386233a83bc85134dc8c46a7531b2b952fb277d8089cfb13e882bcf7545f0605271fe38bf4754f98dfa13fe6b635a62bcf962553882a8f28a9a5fc0b3f85509b702d4a7555d40c4f7d10fbe80d48b4826995fda7d15f14aa9b95fc6526101cf09c97fd74baca6bd26b4fce8a57b0726e0f68118969ec067e9ca39b2ba59fb0d78eb5cec5b872613b1b76763b3217d859bd6d991bbb5448bd4e49dd6597ddec9e46afb3f71d254aba828c91de51904139ab19138e36e6996a207da80323d96077c97a3e8994296376d4dcb602f1e77371efe8b020b7b6f6f7bd2bd733ad9c06c45b77a2893d73b4a8a57707969af74ba06b2fe7d4079bcad1cfeb3689ab95c8b1215fe0a855eb431f67df4ea589dadbf055086924e42cb142c9031e25b81e8e1167a54008ba1ad7fec6794f203b27f3092dd72bb766c9653a72b2e25c965f53487cf3baf74eb7742702380303af8c0a61cca3eec78d4b709e35e2cc5bd586263d9f56fc12454547bc6165e3f070ce7b2bcace5c8cbf52f987568dd90237cf190dabd4ee7a80494692a5379b013611f4eebeef8e1ab9a9c5ba61926095545e19c3dd61b7b404230729aff7d82b6bbbed6b4a926f6e49189e3bccb578fcb3537951fe9c78ac842350ddd80133275ac0bce3a669183776fee8288f874d29190b452d65bb7d8edfedc6fa0ae147102b92041af6dd8a566932e016763b60a5b9b1e3667f228cab075f966d1c525ac19d12046c6409345799adfd7154b6d8b51eeb1eab3a132ac6a2e08acd1a34bbbbdd019195af9f8a93c6ed5463765173e669cb0d42b6cffee1a4b45987853d43c02f920819f45a4fe0905d8c65aca182b4bf56fa0dc51cb53c642fef003d92c13ef4bc1bac571cbe2ba3673a49694f6311b7dfc17a4069759177930b179748d4403c7259e10a5d221cd0a6b745966e598f894e607b779dd5289fbdae0b4348141ad373a62c76aa454b35b39a7be875598bb30007fc300606ee2537cfcd7c22b6149880fb3cd8eb53054d698a0d20f26a5c3ce468255737a68706784", - }, - { - "5622aa8d2f308dd468a7e4959ccc01f0e80d91f79df65b8201eb44911f6abc758c6703bb97908fff377395d33f96c328a4541f414b7ac34c6607dd85729afbfe01feba988e4997c6bd2c99fcc35d2467b143a8fcbe6b49247226a9e4c0a4e3c1a29d5931e6f1f7a31d90a0e0edc4479f08ef9bc65ae4eacd0b93b1cb38948dda31e60b18d702bbf5935bd580201d1f280cbbee679fd834aa6be576a37a037eabe989c3c18c7fb61fda8b9ffaa8bf22b57a101c19e850c454353af7af3d755b26ff1ee78b9d9daa78294972d108958682a5a29c8ef260e2289ad9d7d74f32fd4e51e5d9ee828366abccd97dd56e035713a6f3a1985383c0ed5d98c4accac2fa1ba7d30a295670d5224952f7b7554fcbfb426c9496f054834dec48f9b70af3d2b1c6dcda1c4daf3e9601364e57851952c785e65d753be1c22729bbde33aeb1e4748dbe90da6ecf716f05bfc68ad819515dffafd33a909562b95140ecfff1d0747f8e0459fcd3ca6cd8893262614bb4bf4b639285f327e7ac782898781968ec98f6f0f2f3c4bc5f9c4691ffa7ddb3662816f8ad092095b598bd4d10d6b5fc6fabed619eb11dfd4d638f4c0b6cff7194156a411e8ad6d3229320336ad52fd9811c3a1fcd571d1bbbac67c6186737ac7ca1ed9b2bc46e4e578f81c164b09ae5cdd4059a2c22b5e7ce1dade684e49200867f9bb1430aff9b99805cfd31f7e3fecbe898f70a4eded86b8bbeef7050eff6cf8ba71395a7ae2e270a2b58010e56cdf6efc4003da3d8a82e96979ee68694b6113cc9a6e377d40a810063830eb95005a81405e5b7de8de67424845bab1911bc55da6338513742d237a555465fa54b07ba50ed712e7a57a39fdcfe4af50f064ae969823aa1c40cd86a621ec90769d0c1babd33e8388a8bd76689215b9827a5819127bb32ecc80a562a291f3192eff34cad2635e5b0c0bc174add72e2041864953f1fc72be7d28111fba0438d9036da3d5c0f220ccfde2319bb96fcbfae6055ed7f1c1967ee9a78e93bbb77cbf151084d602a5a2f087d49c3134582c1a5d7af24f4c88be26204cc9dbf4368b19470fef49a5823a2d66c65e9b1e8ab56bf5a7bb3220696840a6222caa58a7b39fb792d95d25038a8bd9d916e853cc5459640f8b8468e3d51f05f1b95e996cee40ffb7ae14cb289094f1b77d5573c1aee7c12a6c3a1e31491422f272cc5f510d4f18ab63d3c3f468c5abd61b2fa7ba0768d46392e2a4dc06c7ce79841dca916cd33cc0a700b50fc660e5d1808d8b87e65feb89428055495823b2dc317d6d9e50aa5ef7ab14076174ed32f56abe7d410e58ca40e92f8a31433d0d74ba7b130b1561f2b075fa11ead744d031f34d82f1a64d428f6cccb0a009be24b42937bf3e99a1ef1fabf0fa7335dab52918382abe756d3de229ee8223aca6d7c5de87047838e387d4e472481a4cfd4365256e13aacb518ce5300f18dcb5e0a28477a6fca08a74756ef6bd8933bacc98d02abc7ae60df7cb3e06d41abcc4bd313c543ddcdea2424d98ffc6dcaa83658aae11f5841ffd4f5df42368a0e815d2146a0fe138b223764b133d17cdb08d485e9f3dd2bf2b220d1f4565b02d7b9231d592130e4436849f49b1a70772244fc0c38da372a8c57fc80ad57828410a5a16ac6d14e093997fdd5b26e4cd4b248e0ea221715ae6e112e1b68b09f795540e31b1231244bc922207b906c4f42b5302dd7474286b653b4d1bb657134bab117d6c349fa0f121c2f8dac9cdcef510c1c28545eae0ab163db6cc84ca182feb858c10153d0136f00a01c9c7d0bed892715dd85c4e73627c3a2ef0f43710dfccacffd1d9f118c9fb1a83b2eb328b8da3e955f027d95294038184f7b895d77532c7570cb86fd6b37a5a66659cf1e330db3930f302838706050c0dcd91d532d49c89d144e9a7f864026ec99f50acc02bd5f11ee88495ee8991ec4723b189f84e03d992fd718b5173ea1b033ab7d3568dc4656648fb54d28d3119b0f293a930a772c394f45ee66838f17b73a94eca27033f9d5c2ae22eb813386905dc024673850a087958eed191d04d05798bcf909eff2deb2a0009d223323b290e3d6f71b2797a2bc2590d54294a5992d629336518514032614a04847c3fad8a7d1cfc2f86765b48cf58acf892f68b691fbece38100e6a71487ef5c4ae934f1ba03b4b26a1967f70ef1c697202e4eb22a3a95ab3b7b524f0241ab4d2adf3ee5e3f2974d0bfe4419ef0ab11039ffc26339570e74d260c4d5a16f22cb4f60b03253487f5e46c47836ce29460728086a615f78d631d89a06790928455889f58adc3d0a3a84ceb2ba9cdb00a403080e6567873b985fd59fd9dec71e375013c12c51cb67d599198f36f58fdaf897e85dfe6f9896cf6d35a84cfdc6834dd9447a2a10e1ffa9fa8edfef1db9e8b4a245b211de49e04b7e88977b4e1ac9285f43526f2452181ee0f80efeb1f6b2533b656519ae45652ccefca81c17714476b497e5d8e9fdf6c9f504c7a7fa7afa36df5f4f8da5b4b973b1618fc8d2d43e866b235e5420551d1659e5bd545fb78a3e17d9cbbc8e842f3fe6be07b892453ffd689d5188f26f9e4c545ba0b3132af12a03bce6914015d026d3d7df661c1e6384bbb50dae24abfa78079a2b1ac41c44c7d82a59183f293f12011e781d3cdca2f791afa5b55a9f2d6139587bfd74bfc54ce91e642847a33b48c1b366fd8f08f520b79ad5113a0273735aee71ceae361a97547fc09b22fbe4e4ae4ae13e52d65e0971341aab368d1e917c8f5f2ac57ac119f981b51b7c99ff2be3e16935b7c73e28fb58d332e6f2c36281228c479c4d6095cf15b14baeb0769191dfc649a70471a25d45d4433797a5b8ba31ff567e60ec4d759d99244d0fb5dfef7c2896809938ddde0d2015a4c5ce5ef6cdb5752da1c2a33e5bc78b6b7c6a5af892f0792c28560a357720da3cee3833bbeda8e98e6a8cccc6535831cfc28bc8557b4181a3978bd90eabb34b99eb7e55d9263e6790ca34561d8c87ec4e12b4a38df524318db00a9b5bbde6f5a8644a818a88e91b521d716fa9f95bf70b109b9905bfca926fd42ecb9114c039790abb0392a41ee4c190536a89ae6194befc2dc4bcf7562bcb84f65c99b69612c0511552f53436b6c489204d3881e1f67e0fba3a061165d2955c2e2e12c440d31556250a8a5cc04ee5e09b1d627c14e08bce1a92df7f6475db92a3ee57e4c16c3ae677c44237122818ad457a29595ab528744707f3ab7ccf3d20bd94047e013e647802a7af14cfc7c11441ea6e9b9f960fe69d03911ad2cf3a8f633e0d647c71dc7e188c92e75353fc953d6a30dd0040c39d4355b71524f1a4872fb1ecab22c8293b54bb22a80e1e3d4c886d2988adec26f041dd0565cfa9edfe5ad9aa7da1d3b8f68fda9e9df9dbe98148120af6ff30e6400deca6dc9593dbf06c856d0d582503e7ffa185f87c6e7ac58184bb80b4a1c0c18d669e23f9791365fe807356a5763ea418c39d94311759b29b14324fb6f3104359ae66532779b825f92b7c9ea2ba43ba7de04eaef7a86192bc93e17286f1b6e0a01c33c796ebed8f17692eb9237173a051c14e4869afda2643bb98c9ac4ea94c6bdc1401c80190df6abe988d2f0b2d80cc7bc8362ba25c6e5df4370a43e156aebd6aaf856b3f64d5fefc622d078faed40b760a361966a4765adb809dbcd74b7a41faffad3a64823860e5656874133c7f8a46b5a3ac591906359aa4f171ef6bb2ea6b5f24cfe25c2fc7c1973bd5d3bb5f197002c5ca1bccffb570f0265f5cd949c7386d961ac9c5e18b5d1d6030d8bf4a48c10f12dcdb11924b02b8ab5e91f425ca62bbe42b80c6b6dde3160ebbd55803966716734327058e29bd39874f2eac199067fdbbe8c372c5a688d3615e2b65f4937b67d6a26c64cc2a9e5379cc00925c678f174f538915f912e85b7014c064a73bcc7ddd38e1a9627ffddb4bfd6da764fdbfb45048c9495ab1a4cac5642f6c9ffbe97d33cb26964a23719620df3d85dcfc392c4502759fb31a6a797e99e51e94cf9bc79ac15de4e5cf7a05aeb88a8ab4c3b6f9c52b99794503f2c49cd7e230a67df7403e552523249f29d257b35c0c7712053c3d9eb583a1a7473d7f296d25a66566e4ba8b08de2a31b082e40c8e5b1e93985b324dded3f52511744e7e99f4e3ffd99d8ae17bb5122b37f637c5525558eab18a378f5e2cb56fa003ed3af8d139d16ec4b2ea79c415b0ba4d750ca2cdf653582ee3b65a9825fb9b123593e36e645232163cabda515b959ed0a1419e9894f6c677ac200fd11babe3503ec7bfa319f1b9559d94a6f82945c9ca8667621a5d28920949a1da644cbdb58b84742e9d65e7f2027b99fba4dec46f642bd17e88fa109143b26ba7fe285c89add0b74a369f3d381ad633bfb4f72e1822ff96aaf9a73b3c59a6e457cf40e17c1198c64737037f52d9b3118daa3fa5cd3e3c7738e3b3743c595893289974a4aa0d6bf1446e70964823a7d5cee67b9b25b7125d9ac5d1d61f2a6947c3deec6deb575e2fc5cec60df26de3c0545e5b79156dd6af33a78552d1ee9994cc8501b7dc5fe7a22eadaf201a92e06ef03be705a8bdb4db65392d3628c7cbf44cccac292c93cb5a407a7a5a0d5ac9fd95b0033d6eb719d3f14609190dd40d5aa1b983cd4c4e278cc8a1e7d5fbb0d39060d6cdce8de6a17e2dab973a7fa594205e17edab6514372eb51e03b0ced6402fac0efd3af49fb8214a505cc9f5f0ea5308d7fe6dec369ba154", - "9f522375925222a04f5c95ee14b6386412025903ecad0bc3ab78afe1145136b3a3592835ab4ad6faa66be9", - "d1ba82b3ced3e9817642aaacedf482e79bedd0560ef2754215ee792514bbf8e6", - "bb21211f342379370f2642d3", - "1a6683805d3f478ca1c1512b9846468378f83be27393db63956e151ec408368b47334afe610249182f54c4d0a01b704db2aa90a9755b8feb67ef9301f0715d7d6bdfa5cc4497cef1142a43eeb42f7c413e8f489af30d742a706d05a40a0c4a5991f9e2cc5d9fbca6ad3767682e20c146ac35aef38dfb2a77388b738fa022158d5c802e5f0761096bb45b50815ebf09172759521b5c5d459703ebe9ff669ee4d14a86e5d0650b597f4a082ba0aef366a924ea378b91c3262d99f48189eea19c76c0f644079f8415c11033cf24d30d6c149ab13ca5c29deafdc816e457257361c1af4b915da312d2e6c7fc712faa27be3e67c893f9005a0e2c28369991c1dab22d38961d1abd6d94c4d549cf491aa1f8d522be3ffa6d214825a5fde3c94c4e35c29b8d05b2627eb12c9d94f450a85eec6bc963a279a37c2344ca36eb604c4bd11c2bf2ecc0dc16c2c365bbbcad3541bd54f8d0bdbb3ca4a087b62fc19fcc1c13984eab807d2a6a1386643d90d412d027bcd0a638765498cdbb1f4cc1b91b69bd241eab3645f225ece85a56e5008d6094041f8cca6b9a0ae3b15585de6fe0695d79d348f8619431ece40e736957a7627224fe92bbe30df5124f476d97e36b5b08b3787e8e00f0c10013068eb156f82f3494a35d6edd5f7048d1e91954f1013ede22eca8b4ba41699ee08decedde87139180a567c6d169b672af0f12aa09ce20e9cac4e78b8067d31ba4f63606c00d1d787b868cf7643fbb170f8074667c9f7584d36af80b4e6557724013618c28d0dd40bfe9d4b25761b3c99558af528c2d290d04b09821bd7f992c044dd61dde9395bd0c9ddec6d0bf6e044ddf0b4b2d6753f5acf2e9c904caa4e9f310578527b85e6738803758da646919989f735b09c9a5744e63fed2c3982e59fd29d2baeb9771316bf8d29213a4956b66c78d5654436ffdd82d0d572530fd09507b988d13fd743f35333237681f8abbb301a8ea870159f802a57760659094d0e4902036c5a62c563f1fc86c4238e1ce89f5176ecaea194ca112fbdeefbef4fa7c203678cafd34486fe58b2af04f84a1cb620c6e123bfd96301e0a5e5e5abcc95d28b852d0cee2f51faa73e42f22fc335f50de4c3812ee14038633a195083f3944284c1086c34995832c3cceb7d385b4ce86af10685c16005495121105272d1d739c584a07ec7801c3667bb280987a8aa41f9537e9d1812a5dba5b385a0b71d2e9573c6f3e9ebf0bf7267528946a6aa6f43efce908d32525cdc3b825bb11c7239f1de412704d24c17455b9382fd6a873180f0d5d44dc449320973d5cd0d4e67e83946b6ef47e5fc3dabadd80751f1421404e56b1bce748b7bde63c6975ca81f3eaf52586a55242c9745dee3f7c796d4508e818eaa4fa50490c1a79624561b98d2e1139a328806414c905372356a22393ea0da51c83957029edd8c2dfcf46d9564264d74c1c0497034ec018b1dd4c14acebc34b6d2c1a616937c37b8b4a0ee5dcdf787a0de1173798ab929b72e0fa83a6c9b9a99d8024328d9c236a8f57550a4f83e8071eac76adb55939f85f5b5f514174b670a3e8dc2b54656f6201940a81fe4953d2680ae4ec58635ba74d15efab3e06dca6ac269711ef2d4dd49f731e24a92a3b935ebbb3fe8d001cd4062669ae4baa62c2947033afcfaca227d88a11769f87456d5cd1bb6606891e71d63aff9cd5a7d23263a78768ac2ac54ece1441fd37d096cd27e916e68891137fc3cca427febd1947cfb4d7ccfad75b2ec5e809c132111eadf25a73043d68333139bd2435de9941bbc61c5c509897cfc19a21645019eaaccb6d06371e3d0570c09c7556e41a727e44d9bd672fccd1f89cc7d58761c16df8fb75fb8a1dde2caaf088f02dad91b6489114398740e6798f3ea8c7b0cfd974e160a0106d703d9589ab09aae79108e3212f19cb950ea9c0798a1532bc2a065d5900a12054395c0545b0878ac0b1d461f553dccfc2a22bf254ced88dcb538e3889549960b77ba6237ab1458e158f4f46606372e797ec9d9ecc6534acaa1218e7540eef11030bb9c3e5a7816f3b33a590d970619bdd2dc04d5c6f4ec38b7cb4d525234b836eab57f65dd045e02367eede9049e219b8712b8d6fe178080c5f77b821f1a475259ae571a5578eb3b48863162d45486f71a28ecbcedb35b320e5b6401f9e7870aa5418449bf47502626e1f42abf481b48d5a6819c640bfdb64f873d583fc4e40187940a6c3373ea7b47195270a8657898f55568985018abcea9bce1c155d95b426f91a734b2a14ec2c7ca2011a4d30019fd9b3ef63a804e9c30c3de2651c4213e90285a4ba100b31ee402e8a7f23cf9d4dba003bbf982526bc63be5af102dca34e7d362d6fbf6f56046160d7af33b364f2a86074d1c0fdd54aae89b19480efde2a9caef9de7c0f9491e1cf43a48752cef405a0ff16b0fc67bbe433a3c1b9661406c3726092efdc076febd60c436476f24dab1b0b8f8893986d951ed72282990e8b1526f4dcf539b22c01c6a7eb5577cd540a16a81296ebeeb7ddda72e60fcf2840c5b42c5cba30eaea5402f267d1d04bc80da5ef0dd2bf3c7a2be986507617c9bdbc96c6273a0c9e586a0c48c98b4552113149c6f79557fc8ace0b1a512fec3aa09ef191f95c2163113ac5cdd940f0c2120509bc53c3ea493c54703effb902ef752c830c61e85636ca95429bf16937bf6786b3eae1b277bf08dcd69f521a0078d633beb33c9aa0cb33b238e1021ca67df122a403a3698452740bdcac81d22ccfe4ab5f835d1961708d1faf6d40f115f16c6094ea37a7ff15e0534f62c19a6f4ded0967be337cdbdd2a7c58ba16ba2e4c3686e9d075c6fa7d29b2a0335ab4940d2a95c4500295f4db84ae65e46c54b7300909cc5411c725a31fd962d239aa0e2007c285586b4c778e2ac7afec42cd8409a63d7cd9c677031f43f4aaf04258dcf1270c02a4764177aa66db2d8f860eeb1fd06d0b27587537410bcb641f90aaa7bfc6f12bd143f66e7c933a0f3ce6b5048913e1b2d79eaa6c19e7255d5eabd24d5f12426339541a22d600cdfd1781a1a3894740887840aa82e5a461fc324285b0223ac9b95c3eb88160353f168b3d4ae8a2e87b7715b5fd2671f66e6eaaf9365b3d9e3acd9a749faefba6009783771177aa4dc91f72fed7a5bf6b1b7738b84ac0a07b4a5a3f0a9134a39e1e7e3e2f9a92d5644295f31c5a356092bf07c709b4c34305ebf50e857a4f593dd1cce0439d3fd125c1ede1a48f583bbbe0eec7058345129ef78868a96f8a76ba7fbfd1c5eebf75f3e0eeeb9db87474b96f321b87fffc02433513fb467fb74e2fc8feb498d51530c753e9a173e95e0edc5ba9802641a45db281b2e2d87d409057b4fb1925e834e90fa5619ae3a9237d5b104e7ac67c2bdc31001eedb4ec7064b2f72e0379bf8780f67ec4b195db014a2d130e77b1778efe3dc703f1310a566a6d3b5c9b12b1d4e25815493ed1510a516a31ced3b64ca49a783ad63ea71a57290727fa31386d2fbfe41f12d36a618c6c28d8f10405eb3e0a33e8ac2e4133ba75c688c8c9a2bb33c8fa032eaf3ea0d2c27bf89269c4aec55f8232b292e7fa9fc24527184f19187d9d8a3f52335e2feb5dc6d997b9b773a79a31db832b752e5738963ee5d61a1b426414975693f986e165e52d46cb059fdd4f48f008e96d4c1a48306b7c002fd0c861721656074cf11173ca65cbdb694c79f58a3f3365e872b24670b691682c10261eb1ffb2b65da031d070e31542f49704b77970a78bcfb4c4ca517b4c966a4e8e27664704f633e90cb7d7917dc1d3a8b8b7fcf59ea3a8a81305761923cb182cebdd59255803a14ca8a75fd007670d79a25eacda1138d67a0fd1da981529dbf182fc4d7a700ba498e4476a1d415381c9e2ffa3bd46201cf2e454c4aaedbbe3893bb4121a6de02cbecc1f319155eb8c99d1030103bb6194bee51e74fa01f28dbe16092955b9599d5c1f1c3f356e26d48fcad7c4cdf0eef25c25273dd62171785c9d2c5a01b1f3da9b4786b1b399d890e2049b73c12de2fb7177f2bc3d9c645398111ebcfd83b73119897bb994f998f4a6fae1b3d6361e171059dba0bf9de9af7a5a1b21641790baf82a36278945d649cf5d310f3792fdefe8c58986a48118fd94647b786e47733ae703701e18992bc1b143b1da6110a98030bb9895c14d7b8eae1a155a550e219a5b6301b6d26d7956ecfe4c7023eec1ff62538b3606ebc7906a1243bf8357f593b6cfff32e3fc6b51f6a0ffaecb658d526f7a5e9faa6294e4808b779f4832318cc184e49e8957b72bea0d67366e040cf76a85889fc6b04e84afab0d02947d0d83e0de19f12966fa8372f6e82ff402bd7a69195eb1a7864a3375aa9e23736fa4d4b0224647e416474c01f72b7d4af240d7f43395b5b04c8fdef1165ce1d56ee8ba0e350e6ada893e0594facbfb5f0d8829ae203929525951584c21371b86deb0f76ef5daad5e847135a6488b35ea33e3a165fea502975d6421d4567a229bf3ce94605885453610eb9c82f9ea743bee9e14776bc3076a29af268cc72d9092a492d9ff08c345dc2eb2f8003b561d9912ae1198c58107f8b37a08b35075af9863110e6770425e9d59c2dfff9d9942c8bc3bf7904c2a952bcd573706caf1ee14420564ffc433c0f5871c4bda916f2530ac75819ade49fa1de21edacbbf6b7075dba21a84989411c566b7c356b81803c7215ab0f326a6b8910dbc62c1bee3af51f105fcdebc0dbc56a50b22cf81eda563bf8c2eff98b476e8", - }, - { - "99444e82c6c4c47070b164f298ffdf6955ee5bcb3070b9aa95ce658db4db084d2056cfe61a93568b44ba7ddcba5d450f4ba0da7b119425a6628b3416663c638692326cacc5c237097db5e537122b465dcb21d8dcb5fe831789b72deff3907685c2e23187a56990221e755930a09f8d6cc065487563cb8cec82b9dc754952fa0b342c92d99522fbb39854e338f470a4b4d5ed2a39b8b6253b7001b0b953abc588d757616c7a5d1f12b1024aa572ef5a47dc8480943aa6cfaaa78064fb2b29830280e46efa418d0cf38f57980146f2482276c9b6b16f865b1606bf1131e894336979a163ba2e70adbdc746be0d38062fafcfe5603e6bbb55717b66a263fbd5cc7476302ea4a0dc6167221f745a26a309f5886934f4258965a0ef0803eaddd05e54008df8a0695a078b797be59f1eef95a658c99a7d52001d4108212ce5f18a39f1173291808c980b0513f1a531e03ad7380372b65572d3967af4c25fe54d99d664cb67e557fff05c12e10143c13b1bfa3e8db093ff832a7978ecd85d3971349e3c9b83939b73f0ad55f1f1162d0c106b99c0ff98442911bc15e9194f5b4ded97e9702b84e31b31380c224f392e5fa5c720a45f64cd7020e25a3931b5871e4c708e77f4729225aa9f48f9d876597d3e79219dddee0efdd16836021dbd21692dafe121217347cc128fc5eb051e6843978ae17478ef714957a84c74656ddd931cbeb43e32fb0a448acf2f90ee98d38522b4fa9aa36be4fa13306e799d4c0cb90ac0f73cbc018146d1b0d6bf48aa446a5e3e0502aae9fcbd196b36b6b7426fc10367febf687f05392fdcf878863de2e47be7e625d0e3e3e94e199f055c0fc65f76c41ede43231873ff10eb854dcd6ac9b550ee8533d16f81eb0e86471d4da69311c47255e78ac8e79ab36ce880d6b135279fbb5a712adc5c3862a356af49e9c10d5b16f4e5dedb80914868111e194745b802a0292c7c8564de28ba8e71a44f7eff6573e5434e65d496cde5b5e62cfa9e2e9ac85a164dbff5767983e71dd2661d37d9027a27674ebe3433731a606db88e0880e91ecea8134421962b3f68915c9f6a5e1992c56750f99bc313fb30cb89384c72571a1a6a5e3c01897b691bd70985352217fa8a67f3252a06205bd1a9931d1cea3736559572561fedbf3ac4c8bff9ebd7f3753ee69a69ecbac4be6357db7f4213b697a828edc716ac01da75c1d46098c7d5d6ae6f3f9a2903588c5b340c9d47c234efea21b700cdb8db4279afa2117677e824e627bf0f2b179c864ba823926a57825478395545f130886bdf2a7c55a2647a888c3998b750343d9cdc602e46b7b09a2fe9ef74db1ffc46fe27c254c927ce51b307e96a571da7f3f907223fbed2daedbcc96197e95edde7859f3b4ec6099f791089e368a68a5ba0917ddf4f50b93c0c839ea36cfc8053811f8fcfe6986e5fa9f743119ecd6c3e5fea1dae3ad7eb465a89e9c68569190688a8d56e4143ceea3b11fbd9de67173d5134ec8b0bd7d16560ba2be52345ebacedc01a2e03e8183ef91317d87b2e15cc6301586ed829d438e4ff1d074408b332c8ce60ccb6790ab08c228807509dd4b39f2c227755f6b039f5cd413ad6f46c9ec2cc6a79457529d297b1d9e74ead9bedd9bd652fb31568a8e2a9e2b89e4e57601bc1d960360232cdb30cb502b950ef930d54c2c0692a684cd44b0472995bd2b41dac1553ae47216253d6640d2653a033a862f3118c5b5d60a662d240bda5f4da51092eff514f61a425c5b14b19517ec1b371d240cc30a0739273b34f18a72a69b1586802a7caa6cc8f5817a8a995695d063c9dd26c3d45feb0f84dc8a0773151cf9a537664f942f351599cfbee0558f441f5c7ad320cabe305f9aba570ddf6407749b6db42f9ce94526a8f4170e735b1dcfc5f0e090af10e039db3747aa9b4f1f26acc34639ac8b60557f7753e2c261a29852932901a4093b7f307319cbb228e26eec289898b3f8ee236032163293b8caf64be3f7ffed236f1da688d958a1bbb79dd45026884904bbb936c1ebca7aa6b0c68aa8b667dc1575729e4ecb4ffa82ddced2f4571bf902c52fc4a0ea3f47aaf5c243ac2a1fc19f825fde5d9fc8d06d97a351eebf4ae1846aa62554d57cffdb3f3377695338f8d598d723289ff3962796e8065632e7da9d8dffe2636cd23eac15a60568eefe3e77c561906555268cfc1e9342417b1cdf090cc16c79939b15a9311b0210094087dea22833f74eb0e35d44259ecf327dc84f3f24b8c2bfce7be0d97e00d2be88a150a0d557ff963b4cda60eb99935951d288768b4b2649b717133517f5e3909744417c9c3102c77ddd285976cba2c89e2b4f297665632d7c8652847c4625038a6670169772de0550066ec6c2018f503cce79a333ecc0a0632334df6959d2e3b052fa47c5c84d15ceabdc80bd6be0ea2a5a8d5e374e0e9a613369ca8d4cae3d9f98755560b27b2f6e47b01ba390f5ddeb732c22b12abd225e26ecdb639b08f3237e488430b3b39f0b63aaaef4907cd003a8f2b4c3bfd721d6c3fd3a5f062d72746606a529ba34251ddec4026f40d262e9d527ad84fecf5bb2cc8601c2a38437098aec2335104842ff1c455e5d17c136ece8d461d7a3bd9a60339c22d71059e09b3603c0565c0345684893b56054ec4d3db0bf15546cafb4a03bd7775c3157e7676bb7bdb7baf3100396c563eba1a12952503eb6ccde6b6d0a42d456743c4ddb97f5994fa08c5fa41315080eb6b928090956bfc6252b232f6e0785d233c3adcbb9370b59c35b0dd66005d516befd1fc843df8e68fab19858b91e2aecd1c8a88b0fa3d4c2fed2995ee87e65976b755fbf44ee183f9fa08848bea325807bce0b7b61e03e50b2c7af9b360532a17a8250cf6068fef0198738c82a5e58961c54017e343fcef7076e823d63b4deee472fada7989ca7a213d06a4e3eb2d44b16e5c94b1588321cf6c45a5a792938b058d667e1730f8386dfedc50ea0a959b78f12f2949b34b181f90bec622515227dfb8a5f6e89d2e559c0ba686153b218d2c50b67503018e22914ce9b49d3bdb7cf38172db1ea130baacd640c111614e3db204b3b50641d8978dc14b2afc27a7efa819cac6bafa8166d1c127e2237520d57ad38a80146217a12363cb1f8a720e328cd8f846d379ada43bd4865e4aa633c479bd448d205b2e43befa63486c717af84a733f1dececc127c047850aeeb8ce677612f5966e23d92c1d3c758aaeef82f862c1154fadd6766e1dfc780bb447732a5968c0c78b9af4a9d669338458b57cbb77910a24678092857c0b903152035bab6b1c73f7b667a08cd0d31128888de3ff1fed24866eb60beac19c1b139f77bf0b9332024999a2d56975e691fd7475fd93622119d0d725bb99c1d6ac604d6b6be09d6d29360fff9f84e5318259a67fec08a006d9772b9410ec6abd4cb828b898c625c2fc35c19cb9a6cd3b0073baec7b5af254d21de8e209539f560bc80ea38e33658a68262622cdf35dcd6618b9e272ac3644c91f27d372c6297d8e37201c6a86a7d3accdf579c15246276a0009ddac4021755f4848d10f714e9da86eba13f461e6a12edb1aef2d6117986120750d609682bfdfcb90ee3cde8be54d45f841a6dee2d5b9fdc4e65edb7ebffcf3cc5c8a4e1c6919ac57568be23bd8283319ce11fca3caf968b057432f163f22e29cac30b8154a646ca0ef4fdbc7770ee1451fdde9e9d651992d94c843d4eb2570975528ad9f8c193f7c681a43df28242547010e30d75fca04f39247c77d6c3715c25fc261ecdba16844bbab23e4d0482bd1565ca9b526ada9b8f5703661a84b23070d85f3e8265b2ce10750c5d798f1a8ef4d51a473ff4d2bf4be615566ac796db9fe61a224bcce05c31ecb9ab7bc43a609944a7c9398a7875609ddbcb556296f548a117847df7d0afe48a5b504e85b0d7ca589103d3197933a744fefca795e1e036f964a4f14554d5cfa0261e25d6e5e02f86e402906d3637a2352459cb1639f20faea6f0e3fbc6a39becb1b1b3a791e32e85e5bee31be685410adf0c11190e20b7a5119b90e83f2cc4f0de8898606bb6e64165c95d4c5eae472daa6836a888ee4d9a79de72b8fb47a9c9c0323a2be9106d4ee9ba8b3858c256032a9caba37af94df4c7b0adc2f8478cb879b6d452d73191b0fc1ce944df3f4809cbf3ad46eceb3ba4abd9679410f45c8aab20dd72626f235e7c0c934b4beb4507def24ebbdd7a507943c81d54bc69df578aacd9ed0bfd3b7809dec345ba084d88fa9c34d80685415a4d5eaef9b88e51432b2b2037186baf123a6257e47aa56d6531923d38178e8264dd315e95bfafd8dacaf901e354b0f58f135d638df2c0f32453205c7aaeeedf8c102e11cfddea9a98d3ac7c385d71b760cf2afeb1ebe1d64f0222b9b101893d11a74ed175297c1dfd188a2565fbecc6bb07b56ce3973322a965dc5a675587890cc65a71efc68fdcdf1a023505ef0bc0e6b12dca5860fcf1c6c94c2e2ec3a72b8a019d69c82d36a73738dc3d17d7fdfe992bc8e18cb5d3437f1f619dd318b95d1a56b6d273ed79ab2655d83e2dd63cb6f1f5987eab6bb21a7b13b84e2c619b36b842192c3f82c755d8af840675b0bd67a655d641b1886c3c9c147ac87615ff3e58085a879b21dd63c1616a3712279ec87d650a2eed665b797ad631f0ec312f343979cbc49b99385cfa92841cba12d52777df565545a1deb07800a15431c0987b4a543fd5ed6832e80ab6f4b4d9c9ec419932a6ded4759f5c7630a0b80139234b8d53117acb4452c60b477ad50157169a89bd796e2308baa9395b513a94747611c7978c82dbdf48d716c3ac181ac2b2a4702c02a324bd4c5e089d989d020ebec9963b5c721a95492158f54973b7fc1828181acb3cc8078ac095136d97221c60b847bd2a52427383ab68cd1f10b92738c13203fdfa0b78baa09c1837be2498667c459", - "0ce980442336d0f427db869a6799baa6785b5e030567c588e2a7d2680e96c11b7f415fa27730969e0b1c3973b5f3192d4e773153def6dcc09dae29ac44eac7c42c2666a356fd4262197bd5cf6eeefcbd662d104423ec05c19a2e6ddf1834a3445a09e8b1062a1320a5e8ef13d6ebd03c19e1813ccd86fd68b46a", - "1ac8a509db7bf4acb80d8d394a5abf47c273b2093f50f35049e749f3e16cb0fb", - "47cc9eea11f9f3f9aafa23bd", - "088888333340b3a057b05491fb2402301c8654948aa6d5ee1ec75eb045858c22056fef0873d6675f897126052923a47a30675b266ffb6181cbd29ce2da3720e36a227e4c6e53328d789913c0d9cd149a6e49293996b1be7d6c513b24d876445a950e723ade3efc36907c840b9b8cfdb1503811b4044d931a0009b381fd60a5bf1e73d16348cb57eea672709875fb9d56908dbc729d5d7d322a17a41d0f62c9af9a013ab1e19fb7b6c6e7fa0c0b18bec5e3d3e92546c77e3753193389e5fcdb6a6a1896cba461343e71ef7a156b136b27ae6f45be9368301cfade203e9b53824d70f07de9abfea1968b8ff8489b9804422ba05ac3c3adf23ba0848817fa51febab5e9b5500100310479e710b663f064c1ef101c9a5320367cd8bc6e52081a32f070e7d3fd6f4210cdffdb9fcab1de4af5b06a7c6d191dcc12b25b3053e58952bfd1f723afbf570796946c1df9579ad14ea9c8c30389c1de4d1e845c764fec5eb8faaf4c558c5eb5113018c6a21ef653ac7d7f5b6c7e1a8fd48c6f423e9913436202da176a86731287db7331db055508acc94168888040ee37b3c119c8a0d88360241d68745825fe480324a944d56e7cd0375d4d33a5fe7a3863c2aaa899b2d24f65b70bd804039116fe959c32442c9f0b5470463523eb4336985b71125fe5235cbca0c88a6f92416d038e144de5ff8ef6ca749a9e239f02db505bff8e16fad1cba8b1500445f067a674142b6413e9dc0f432242d8301879bfc11fa86d1ac9992ab12319fea8b703e10a13bfd4b017496222be26b56af3ef67610f904f0ca8a3e7cc249ca8122735a542b289f13922904ff23dd197f8883c7ac77150d7331316ef94e0cf13b6ad95070420513599100b0a6d117640b781c622ed7ef7ead29476b3c835bd9dbda2203930bcee7ac01c3b9c89da405ee436ee652ddcc3e96c7f1a94e200eec9a4a226f3cf7ae5725068916e73b61149497d11dd85157f895669f51978d1bea8fd2afabb18d082365daba2682ef623109988b7d0e27ae57bc14d86603f93b5ac040ae52d8db404ee27e6c34cd4246f40eccf9d3f8637a4615a4006918b01d34709bcbebd02ea72958d54db3e87d69e6d783de2f1841029d6975eb11f9b076c247108797d5368c656f888092b82aa81aa26e164e038b359bd68801c22fc107e4083a9d85fc254b002ece9d4545310b0cb22ec1af04a7ee31d210ede4b605dbdbcb70e4301989422ef46edf63f9c96de9cb3f70638b51df5c0abe79b7af8cd97148f2b7bf394bea0f7bbbf6925f83b901b87a6079f2c3b38a98fe1a86dc7f48bf97553701834f557451df4b41e7db984a34432823585380b45c1b84813d6aa21107cae252923fb4673cf660a541e65610ac0127d238285f53bf329b62169f3e42d5efe268dea62578e97da59a58a1314a1bd46cf7a7cae772814130b51411082e30062fdbda1c9e14d6b2bfff89d0379d32461f3b8e833b105f6a89532ae748b5fb43f283fc86450404e8befb8442b65e338aa0408303a70e9c27a1d923d9f2a06e7c6159c50bf2e3ba5b035420ecbd9d0b5fae478eb1ab72fa714f99d00188bb10e60380fa3a3a318c2d359ea3805c2fa0dde17ee52a504f70d6b466bd38d1dd4196be336a9ab4a9e573d1bc6404018a119f688c1dc2a8ed1433e8a8ebf455ce3808c245f0220f0c12d28c771757763bd111ab829294e2429a6f7a59858dfa1fe0b806e986d40aaff934589fefd75ab91097a979f26bc9352267efb2d82c4738e4e6c451b0d5adc398f546c646b9e6b8fc84e91651a1252d5b805a857c7798d102d1e6f90749252bc53588348ecec0897c79f514442fe3b27608c95d0cba999a7e0fbd7f601689b4dc63ecb9ff553ff12eca3e9b26e3eccbde28770bb6aff7c864ad6be77fc09f81f90df6efd0c4025d0916ab5197ab846dfe6121c462761d9cc87112ebbca197b0a222fd34a15b824b7eda06a56a6ffda760fae5f0b527e2798f01e205a3f47947a4bd190f6abfb1dab2e3a53131af95d593bb57e4f4af506440cf20636d9fccc449d9565bf43dec8b6877337ca5a43900c1dc600c877b290342914e909aad8c5f0755bc25652781535c057ed5ab2ff8ad4322a8edf3fc1b5311dae6361a7395919725f4cd87ce0ccba37c64eb3618f9c5a53644ada569b90cd07184fc048f1b589eb29852909e75e7116ef96a268ea85c2bd257cefdde9222d7eda875a2a3abcd3a02a1fb470ba967b20beb54914b8b0c6ed464ba978088d7f8b30d098966b0bde82a8f1210f5d0c3405c9bc73f703134d0b6ee13326f65fa0b8154f4e30808997d4afbd060285942ca1dededc3410a099881492b5730ab7bdc2a4cfd0068f67766d60b5d4945f121459d2083334ac878d067bef644b9ee427bbbd6c9351d7b019bfc051c05ac301ff3792a1c687546dbf6a07a0cf56717374bfa1191c22b7753f6ae02392f8aac9207d1ad0fcd57c5c8b35817574b7dd90a00cab75f508f8a234eabce6618305f94746cb6a8573389d336bb67e1b0d2b6e9bd3959ef344e1eb245b522c35222813b8c6e82df48987436b5592025e9786ca63b6d1a064223bfacf59ada713c2a3116611393aa8446ea79b3cb21e96d13b659ada2d6524686fd46ec66c1b4d8f5ae7831840c9e3db64d528f83a1cef1e0a586a783f8306cb261ed9c2905493e74d35883fcb39cfc5745c282104cc3ce804999231d13e1bc6f2c022f05999fb57575bbdaf00d7a990e17dd2f8b9dfe66a637b42f58ee49ba60f2dd9718d09d7025b6061b2087bc35f0a8c884f5b67a5e18c2b4e857d3b48b79dc7cab6b72f572d22987566238a7153ed6264578424f1ce091fd05b7f14563fe12c76104d3373367af3ed3aca694a21127b5912c0b7eb1ddf9d4a9f03f660d49f7a7f0fb42797fd112414c3eba2b75a04282dcb9645191fd3dbe376e7f60ab40bb7ca1e991053a1912854a68d7dcf854201d1f2c26c6cfaea32e29d80847e6288274713d2ca973b91dab97884326b280c6f06c65b8fd25d314be29139961051a1d8699467d02b67991baabc9b05629660c243ca3b0477362d5e6bf9eaa33beeb52cf399846c77fcae11a89cbfdb2058e443ddd44fe202a3ba5c2efce937d78b9639781b8b2b99077b433189cf3b0733ed73b59bb194c9a98c5aa0cba6e71d1c5522f193defb9e31fd2cd60f22bedaf7008c2fb0b55a8dd52731dfa2bc69b40f835ae95db040cda6a4a1588a5ba4769edfeb7369c1e9a3b1cda293255b4942881d94d771b7b82460004875e71be64c582f2830c5e80dd6de421a311c5852f4912bea1451b0328d01c7029867cf9af99284cdfc1e1f0aa0d8c19ba9bc035dc270b45724247137da5d3fc4daa09e7014fe1439889968eb23fe124f067825d5f7b304f17a983580e009e0e51630ea0006dbc74a30b512cd9eb4d0b315a0ffdbfb581609ea9661b0007cd234ce43c17c92269a7519bfe99c2ca94b5cd3e7654946e67b37d4270a369266db6804336a446022677a024d44cc02cb04108292dc12f790578a0d61cb6fada738902eed3afdf1850bafcb279f18b5798d7466752c6368a594533baff5dbd17974638ecc41753b184845206c79bbab84dfef148eb7f1390f8cb7346a14c88caf540c241cad11ce8869be3bec85d029ef490fc5edacf94fa962be39a33c8efefcbb6b43960d5bc35f8fb72038af3801466aed141b50e9ac7dcf1921f7a6abaf320ff02ac34bbfac265e05e27495e6e027e673a48a874e6f0c33827a050fa21c2efa789c1e3df2ecda95fc52ca7be35dbf17ff6c73f37cb236e5131542e002913d177ffb21ac450e2542e24b894650007c36c52d90f83731009a7c3239ccf11829cf0fb6510d9924e927f14d6a06f8dc772fc9b028a8bbd2d3388985f3e2609abbd08434c46642b97240c9380a831bbafdc5db77be63a1400cc9a4f7362a689b07a77162022c6ba7a1bb9f0446a0b6b460ebdd9111132694fa5f1b29da39be66c5179849ae9720b2da0a012d4bdfd1b18b8fbef0d5c32b92c351dcf2c599f069c3b53f622fc8e904f27584b2d97d43f779abcde6dc1413c0a677dd187b28cfbcf7fa6316f0967b53977432d45944ce8ebd2e265c0bf6b2870c75ae808fed52aa35421ef55667ecd6f9d279c9b91c9314bd9411bce267d6ad52b1d910b3e65147c3eb6021a0af98707408e66bb11ca5abf5e34b2bc85b144fd06ea56f5d7f8939fe0cfa4862e7f306de069cf85f4aa7aa97c6848594f5a6dbcc718d2af77497f4b9d5ffa217fc301127071e9bc9c2c9222ba90e286506e384f321e622f05d81c114953d0f7e9626b74f4a6bea8cfb86ceb4575e5cf4fb84e9efac8291d1f4153ad3cd9a34ce0ffcfbe30b6829c0f986a4f85d63b602ab99ff3934b1e0c46e55d56eb479b79ca0729beb59aed783e9a3ccd55db8d884733dbd93f9fd7a7209fb92fcc49826b2d4356ca676f01b0981637897b3d2f90f37bfd73b214a398a8e4e2f9e5abec01d8192ca690191255dd8304a2d95a69331288bce00385f462e942f4d694dc3560a263c8ac2b5cd1d2c63b90ec67c32eaf5bd947bd8ac730da9c09ebc6888b0b4f3bead157aa9d31c2802df8ff0e4d69b7abfed6f184bf35a16ffb5677ddfc4682322128932d57fe4c32f21e190e1147d8e673ae407b1dbbca31331310b299e9f3db08ebfd2dad3158562c2e47addcbcc831cef0194ac8ba9778d0103c2955c886d439967bf788eae688f2a7459b0ef3bd16808e8d768b8962a24588d918ceb2cd1cd611b504019f65216beca212f44600cb7fac77216b7645c49f18064a3acdc01399315084dc9ea151ee28534fb31628d190bc540ac6b6aba572ba51aee89544015e6fbca2b3c2330f2ac1f68849e99e1a1f7f523599eaee22720392ea52259e26f1101614d4edae481b3783af4e99082d75dcca549049290731bbadd1ec0a93789ad5c9afe8bae44e35b3e59e562362964", - }, - { - "0410d1f8bc890649c250a3819766f4496f339a6384e34acdd72b3a87266edd2a7eae223a372883f978277a108d6e59fca1f35f25d7a9f3aed42d35fa9b12241ac04754f76fd8f0e8ff6af88cd851887a45e89f1c9192ca66bfff605b128575d2ccc9ca3ba1ba23a0251b2cfd6db577b29d17ce2ea998946997f5c4a97a397c46024681a400a54425c071232d269adfc3b1adf15b4586c4dd7b8886f5c1023bc348bc674961ac6e221d914f432c2f06dddcf738227dfcfff88485ed45882809d0e57019461c88683919b87c45e78223c37a5be5f758e4f0dc6add22f2062bc2eb9bdc31b8649af17d526ec339f0e6fc6a41e26299c65276302f982235c3e5205ec1521625ec08a23e766577664b73d18d5533261c859c4cb4346feaf7540a56155c6c3a4874dc86ea42fd518d71221ac65541e2dadd2f8e129e7809f2835f07dfcc4128401dae2b5fac7ced1d9e07e3f348c6cd26f55b3893d4418557a18c366dcd5eadea0dd84ab95437d6f23eb9e5877fb2ad740ee507e2268c39c7186f34e5cee2d0dbba1a940f516a018f23e716a399c317a7a81f89cfabc296c432cba900ad79db67936f76e4d97874fc5f8a9ff84eb7a0f6d629c581ec5c451e27ef1ed468f93bfc68b2e0412a543d89dfdd812d9421236a4be9eb374531556c207340886c7b84d42d651557b952e0982f62c5c383e92dced21905174a5a836acdc3f2393e770d6cdc22c39575a42ea406f36889dc9558aeae5dc5f8b84862850b55bf4accccb6a8ef793d641d6b08235f70ad3b0605eab462afad1af80fa003645f4d302b03d81a7d167e9a8187bee0f76b1cfd7006b2d2b55fedad6e8db1d3ecfe031702dc327ff2b0197337d7542f42702cb276de852b3d72d9acff8a7feb8882028a5e340950e523c41cfa184b3d8878effe56742994e60240e58cbfd01541d39fa007a9f0ecccb409c6cc540354ccf35223677cb74e7ef7330bb60420f7d7bf97de6888cb343cd4fb0928fe5df5f1b018592ccfa7aac6dab57cded573b5950b94fd935f32cf332dd85b2b36501de6687612371dbcfdf77279d647ed8bdcf81fda8b7e0c5ab139330d64695d814fc6f761fd141dfb0c8f74e2d7616db3598d8de40b993fbdd272ca37db27b82aedb08bebc4a8e6d0385ab20fbc20c215ad50fab8e93975bcab3ff38667abb0545b3b3f20e325f01b80a32a3cc3ed51703d4b2826849ee22fddd5b544816599dca0d8fc84feed9f7e90caba53b70bc3f457eb1adb89fd0b67d2c0ab53264430c61d2c4a1b19ea99a9b453fc6b5ebf5fb5ab799134769c9b495c479c828bcc49a8f993c3127d5cbc31afb89c0e78fbc323755457ebf0f3344d3ad1cfc59d186e96ac31a9298e655b3d1df74b95f30fb868631053540388a13d597002f689708d35a2365e309bb96db8b1b94ea4c8060c2b165f7f19e72056409159371ac9c44f6bfaad9b9567094d18c29bbc8aa2c8b5b82735d20f55284fe68186004b4a4fb644fd52d9645b277c1dc238a764005c1d2791ef36e71786cd990ccee4571d9a9b1aec757e479cfa645e320bc33268e05af9cf90e0e616ae7f237c637a99fe15b4ea8a3232262d96855fa248920a28ec03f77ce4dd93925db60ec030a7be455ba9d08edbf6bb717b1a13c3ac1deb9821e21505c0a8971d5ea5dd8e4c9cd3a845a336209af191150ba5d9b8c2c450e3a765e8670d7f846b2461f971fdcd1942704f620a40f4204b99f9035bbd543f64b927cbc7a74f32cbb12c3caef955f169a45374e4479430e08d333c4a877baf41a27a0849ca3a157b6651295fa71ac94b6e3d30b5d160965e93d2a81b4d575cefd264399c9e4e17059f4064465b2d92c96ac27e3b221499b5e642d033992c236b905c072faa1e34495f9890bac6228330e4016c061605bbfc478c30e1b8534c49af54785972aca2d144328b0a540e3b3810a73e26acfa22f48652d53ea521875475ffade8ab50b9f08245fad753350f63dc4e898948ac7dcefe520ca47394f8e993a6d13ff68a2f78cf294f235f5f863bad10c4f5bc41c3ba93cf5e076357f0f7fdc136f34b656b1b8ebb3eed1ac429c7d4edbc902f7f4bc24ea9c9b200b9a9fd7adff0c6445ce1d2171fc031e3e9f8b8d6b448053393c8813d91333d4bdc3bc5bb2b8bff876cd29e8b92cf6f7bc727517b6f57ae031f3040b0637dfb40b8c1fbe44cfb6bb9cd0a445fd9b3daa1da2b1c4a82cb4da1fb8d525e0a4d9ec30e9aa75b951214621c58c1f60c9b97e6c6b330497e7dea790a3cd8158a76d898107ff3a5910707ae60c8a46c633b522aee83736d005de60b9abe202435f8bc4577b0eb08b7f2b617bb5a831e95d6488459bbf15919d764b39684d7cb7c9310f343fbfcfbeeb212a90d96c7a26c1026c5cb171ee4ef839785076e5084026077455c73404a2653f333e9bad555cafc1a9613387a02bb1287c380d7478238bec8943208de585bd18b448b6099565cb3ec70ec6672a778fa6af9d1b17b0970439da24c7bfaa74c85ecd8e5852e42391ab2258024ccf91e37f2f0e86df958b197fafd12f4a45f7990375f1665a14f7f5374ff7740f89677ea8660587fb80916b30629a7aa88213bbf80512421a0a37414a2eb549b81cc85072cdd87e4e69d97ecc63f974e60d20de0233101c3d475d777602b12e2f797e9237570085b0e9f48d4dedf233eb1301ed4621f9736946eadf599bfd79157c0b4cc31bc273f5c6f133a4e3679ff6797d3c9b76aff4bd8ad40726c1703c3d8b78f0974b748d0265b0a75928374f91b48c2d2b2c11d8b6e5efddb75009e4db72e562be59efb0bfa06808c89f585a43d4776ef08947a77f277526777f0b52f1e0b5a03aa560fa45c8f30e584b58ac1fc00b104942b7b86a3cdee1abea349dcaea4e058faeffc567e2c3b03e1c5c4ddc675e25aa15de1442bcf5ee972a8c5204ca5794694759c13a2d716839dda61635043bdf1a09e35cb6d93b4df3b7a00871f79cdb4ee69c79041dd14deb7754107b8fef8589d2d240ac1d8eafc52ea847263512651bbede2fccaf6da816b1b892319817bb6af9fc17078ab6cca95f03cf8426249fd4f2bf91921d39b8cee24af07a52bbe54ca7fc4422a310dbf2149b763ac0060fb2c59154d2cb0da1ad4892279b4e0ce7f5f92c189c3ce48e518ff48c4ffa9bf2b02d4792f84534958dc6bd2914ba010aa32d133f6a07bdbb87a237c7acc3ba5cf101efe947147ed4eb3bfdffe5fefa991c0dc8760586218d286944c52d0f221e0101f74826761d01a20af187f9ec1115e9e98bff6fbd7c8816c15d33c07f51c171490997bf269951218ae92b66fa3150d3bd40336abccb717e18b53e8806fff94009910f202a5041b5396d1c339e6d075bad4ab66a0637d81eed1696e4068024001123204b8371f0bcdf0ce07d79f7c917327f7138a75947846fde68665e9c767fbf96bb3308abffe7a8d05512c81e39fa8dab2334f46ab9543921ca97be31076dc7b2a0d05e90b7f7610d1a391b442398ef56cde3b18737faa8f282572389b4fb3c55cb8ae6737257708c808bc0a414bffae293bc69cba702ce2959e1a30edcdf64985a4b0bcc927c5912f819c71cc9b1ff5d6e5929055be72ea5c8c1a4a591093deb5449b7e6b60109be1ac0cae472ba31e1035ae65f3214f50ad699a077a2de52f7180addde0bd78c2698470b1af13cfbf497d243c9e738c4cdc265356543885c5b933a299f01a5b5a9ecb0b4ddfda0c28573064f6a3f142801795d66bcd5c31868fd3207fee7bd98c47e4da26bee64e1617b20cbaa34e3abbe31126b06d5737fc2b577b19d255a519397f3ff8668d0e7d401a37e368729e4b83c5fbf01c32ec478967605cbc0675f685b5eeeb42fc688216a0667e1204c995c9c485e6f7712d80d88edc9594528b1907790549756dcc8b0d32091f36d2b4009639e68daa130e83a1ea18353ca34f431c548d91c1591ccf8b25eec1f7a3c18ddca71b87bb290a5c13229250c5e193e1352072f6798ec504b3b4c6aa578737332f52baea7bc4468fe6d8dfabb9728cee93fee50c8caa113f5ed7e9b55e21e98d73a377ef68be7e4e965dfa50cf863e6285236f11ce80512c573ae2b55bcb43cf6ebabed6783c250f991f5f68a59dcb2ac13a3c8fba8dbb11c79dc6236809f2d7c4b0ad3cecd24b85f1aaed9748b8c109f2fd98ac8a53bd52f18475598d67305117de8e03b0d988a2847539cc2efad520f86dcd82c08ad4b10e490b9cb03bedc7197bcaca55526cd9c8a5a5f69f7a1697e7e31aa76eee597c386418e89f06b0b9817a83d6cdefaf9594548b33cea1cbb585e55df3d3b66f0b1a88f4b98ea4720f1ef5e6ebe4958078ea0bacb8ad776e325ccb252f81943b9b1c2f54aad3c7baf1bca0dda1355d191f69c5d8163c464898116dc89201032d1e3281c8054882f60522d3a65831bf779a854fb0c195f85aa66522386625658457e74d5c2fcf5234f226da4a579ac1f11f11a1e0a6993a4dfe5c856481ebe9d8d2363401058736f7ad104104aa03f5c91496aaba2fe4072d418d91c2787a9b4ab0cf4bb65681ad0392ef073cf2fc060692b0c0c194c8eed5558098cdfa3317ab02626159e40e5c76fd64b2ef60b8f5f368b6b4fd7ea3d2d3236aa01d9db7c8a01929f9fd38557335b926251ade1a0d47d0c1444e6416218781c1a51e786dbe9297b78fcf0d0304c62929e00744ed4e14af926313a9849b2a464048bead075044bee013cbe318920c4172138560629a0ff4fd229d81bdc7c7fd1086ab17d6efd5b603a1991b33a55ca5b9e2051b7c140f7937adfaf474c2f284489d9b1e8c71d58f126eaa451407eacde9f0e86504f7de3ba4d830199a229de2bf39014baad6dbbc448501588ceb2575db0ddae005b81ba9914bc22b6d600e2c990f7843e553ff29d8008265eba7dac7b5b5a7ba6dc263fe0e262a7b8638a81f4720622c7361554b61d7b04c7f8b133440baeead7d51ac8b77d606fd0eae1c55ce7e8141dfd68d40ae3d8d2dc8a061085b4fb6d8a06263183869154618329be6b01c2890f2b5d0a0f25dcdbbfe2ec3597d79311edb943613fd4b59157df4fc2e1024be03d98ea3cbec7186ea9f4a431dc3743b9f0871b205bc0c1b3a001768", - "113b261414b4b7dfa028668ac8b0cde5734120124991c54f4dd16a87d181efe2bc15f6d0caaeaf6ad615f59ec5c2833904a34b4d34109c82e10609b387f995430e8c13d83ac34310d838af9efa32d7fed6224c0a33", - "cd762390b93369f1e207eb15deeaeb0036f5331e82480d180f84a76c3e44550b", - "e88c14ef96c7768f5dba9de9", - "8d6aaa27892a76fb05a2e96cef9a9b4b7ae0670a12cff95f7b076372456889fbd3b9b4fb5fd98b3bd85b247f15009be2f4e7a0329dd118b6872199b314e159618ede0381dd97db28743461ace1a694c0383d8458150a501d6c45f4b50d5b1bd47e61a51f9ed4929bf2e564f201ed0e6825170027d93e482c1ce268459d2f81cab41f0e7ff281430c16b34a29b5c76630dba72ab9e751bae41122b26121d91f2af271a23e818263f46e05fdd52f319d58330bcabf66637a368c0a8aeeb20cad1916d966e5e0b0de74cc67ebe57e3d1fe01e9743d42a931cb4b98bb762ea43ab937d1e5c42eb08fd56e70e911bdcc1ca4ca0604a329c5364b262ce2de282b4732ea657b89300cc7b7127ba4a2d08c13f581f024fd093ac09c2bc245be60c80e102405597fa8082f4d28cc954a93217edffaba3d2a397bb59ee89c8cc0f33eded78f21183bd1acdce64a923dd609a0620d2911f61e81fb2c8ccad8ad9d81157223253a121ea2bc60d6a3670c563fe06bd75688572b3be83cd31dfeac6b17cf8455267b481219c42034b2252977f32b8e6588fb05166498fa37d17c2b002a655b5711bbc21175348225fdcca041b1f97fae48fb1e222c5bb46b5202191c00666b7e1b2d84aca3edbee7a97dc0f6d1330e929226f8a76c155e973c1ab62c867e1f87be37788754e51825ba31af9f4722b5782ef782fbb70c391a664f252d14e49a805e94790135ff6bd881a687f98b42da96fd34bf240eae4914488af739ec15f13f048a7eb5fa94af14e8b6ac5fae714cbef6268b114813ca2a3920a7a9d5eb506a2ca211758de292047eefdb5a97e18530dcd8410495fc42abed91b1204d9b8ba9d6aed11d2d0fa0d931d46f93f2c1a560ef9f5f7cee1497be770d3cb07c534215cec12c1458bb57aab4d95cf4a15a5e3a3bf8e650206d5cac4af3193d169f1a57638d9a50f6b7c6985d42f7138b9226451670d7359351c2affbca65680557693d03458341198b8e13d0ea6abb7496edea3cd4dee2eb93695e668c7c0901c6809b8ef434e88b85a8b22cab6508b9560fae62900056b7c5c29a8c899bed45a2b5159a1d4929476ef350101317f77f02d48a039cf4cf01c56319cbba16fe908c49ed6f3face88867c0ad3703452baa7b86fe58a00ab8f740b4e8055164b0385dd3fa44502ffbb99cdd843bc3287ea468aafe4cc298a3fc180f284dbf78aa09e0a2f7d8593356eab016ad8dc505420edd376b66598a3d0aaa848fd68c4e07419b8b50e40febe2b6b17ad07726fae1f87e86abd01490a0ce24fb57b533c765504ee0a9ca154187bcf5e6828e3addc7597532643cfd992558d63b1acd00e7aa41b9765094217480c08c43f4f0b3f0127120699b7f2a5ac07c655b6143e467777cdad4bc21d4b57da4d8f9b9a7e4523d8c6fba3614b7f7281e80ff0f9004577adcff1b79fe443c80ca9655ecc102d5df6aab2ff6c3401f344b77666c59ac7d5b92bf4f1e2322f74b75e6ef2bf43ad9e018f164ae76a91451e5221bdf5b65a4fbbaa8dc31e6063b451edbbf4965307f8e65bfae87b15f2453083bea8484017228a9cdc6edab1a28834eed8ce07430f776b916b3bdd2340798955ce9ffcf114c3f6a88bcc4c7b6f2e3842426488c340d00f2c4d2d6fd3b6263dcf7a57f5cea6c77efba7013297bd3320accf033acc0833aaa8e8f95cecba469704214f54a1ed581349878a591f9993371f1daf92e55b2a4faf8f952cf785c687a59b3c258daef1b6d7bf9f904123c7384a859933c3ac31e33edf648a1be4d6264ffade860915bd118f0b9aaec2eb8e16b2015fc25e68caac77a3accea53b9b178f6cf48d15029fac12963b4277df037b7a494cb29b1d9e6d2148531a1f7360519cba5657c080254f130a1cc3ccaadb4298d7ea0223897e63d798b4f4909577cf9b491a82de0275a246bb1211bc4144574c8ef176b382262c0e087975cbef33cc616d32e0131a9efdbe8ad3d9cb5f935d3f4f409852acca22ae2a6e7450e9a426ec3b9183f93b4b7f89d850e1c7053c661936e0cde23e831a261b319b430da45772f0fc0113679d06f025983bbf37ecfba35eeca28de5ff4815a490570491266e92faaf8d0ad4ac8df106faff8fe3c8d050ae9dfc03a01ad177c21d7b653509a80369a668a97eaa532dc9867c32aebaf89ed36586e1ebbe1045347766a354a86ec1e8b2f30c8fdfbb6c5d549e7a84db81b73fb828499c5c4be0d4b2b7ffb197133a0ee18abb5a4e371be0ec0a6535507029316f8decde30833ca47493ffcab781d028edfb91c138609baf1054ad52a5d8ccb98b3ca5b138f253d99bd556afd80f71b39f36e0d96fba4e0cbdb18926894968aa825392f12d98b6497ff85a0e4a91c97f37ba1dcad30fe688b54008b925805104a61dc22b712685202ecdb073fad9b10b5b9ee2ff781f23fd41ecdec87f85b369a304b85bd2af126d08f79d8a9e2bff0b18607a95c4efe35941c5493c94e3f2f3902e79f4cfe84c138b83c7f32d7c5a125b28c6107921e8ac92f1af7da015b46a2f9169369cede770292eee8a5f40d080ea1c267c33cb7d4187093d486dc3911bb2d6cae036cb508e81ca783ab5e95cec751e39f3038003081a252eefa7cd913baf136d4e27076251da9cbf0c7d2586fe02b62ec786790ef08fb3ff3d79bd06868eb1abd9875920e14fccf6dc144e898f578b7295fb5f4e84cbf683722ce3597aafe3195e194736fc317ed03ebbb00d956ce89f7a41a334020e1a88da355d3b47d5bd3965a290f6fbf5dfdc8c8e6347b4eb85151e53a960311582235f3b546ca80a670dcb628fef572dfae0c101bc08c80f78d5630a793bdfe402592c316227f2333b386839a67e6ee8d9396fabc9648ea656a407670efaf80966034958f4a70fe7b920c79dea3d5a0ff05f3ed0516537d51a686efcb258520936fdd415345251c9ac1143a41be295cf12da5d4319e78e1c57ce20507490e5213ca7be92afca8ec8b6a07b33571afe6940daa2afb0dd4dcc1c329474ff8e13d740488e5ced552074fff695a04fc1b70755245895a1e9c387fd9514261dbb0f600ae03f4896e795d1e72f421d8572543243d662f6811eb9402b6a3b8dbb0f32de95bb1ac01b1287663d3b6a3f52339a4f6b27789e15519b2b59f2f4fc8fd33ad1a6e4d02cf0ddf8499f45746da424ee78e72847e3cd3833551b6e6fd6b1aa98c688252b57a1d97660ff006ea1b970a0b8fc7d2e313ffd0b0b85299ded47b60cd2fe9bdd7ebace4b0c1072cdf67231a475045990b35ec761e1dc1dfbd0c402296566eb4b9462979d33c9d652a9295ae70943f38adb212b48bd8ebe82722b1712ab6a3be6060297e2aa54e7d0158e4aba6975237e7c7a1e22b29560b8d262125ff2a6e5c1332acd0f6b5ba15b4a82d3631891a01530321830aa8f2e8ab6b41bc5b5356957a4d0c3bc3eab04df7700305a95d0f9cd18d486c675c963876b25b1a0f78e245deb40dedd14dafdaa9d614fb06eb2538c5411e13be116c76fbd3377ff212eb07c5c035612e4cd7a1de2ceafe95832eff88a9bdb3595cc19287fa40b8d244afe9bd24dca40db49893602a59640d7a1b8e7475825b09cb0cee111864deba9d3d1beac03664279910accb9fac534ef099e398d7f6e3235cef7685fd1ae46e47da093135741894273c0c3486197c26057044b10faa57244721328b47e611633d16d3e4776d90309d68ce4a60d3ecda26c9f39c1c6da67ff79fde4977efc5653d79ad86c3b53090003bb72e78aeedcf4c8107185d9aa65221df4e2104640a1a083845c01000370371fea2a6bc8ae43fbe290949da4e559d3867c16df16b143fdc807616f51ebce8d05bb03c2b0bd587b95e3f6a15d907aa9a5b11622ddf4c81ff9fda4bb49d3e9577551bae649cf64ac0cfd646b02f6f16cdefde09a55e77afd16c74e8a3d777d80b7cc42c51f618a3c467968631119f11ca4385f0f5713e37ab1133b692de475db1d44fbfe9d274b9a09e673dac88aea74ba88cde8db3c831e9b5a0f1e40261281e5aea9d4dfd48c5d9e173f4d9cd56fe7fd610909c838bcbe1d6c729e151ecb4caef511a36a14b03cca7ec5d0feacb4647ea5212a11d18cbcbedf78443127680ac0b1bb65120b4197570288226830e2a92b380e32387bbcd3be2c77d6c7722054d849be9de459cc1832ec3ac8e7f60fba9c81cf5fbad37d228eba137a23227d56cd24970340f2b7599aada9d2424cdba8b50c2b97244dc83f7391e2ceba5bc0a11ba547c142126c791265b33a3db6238321a5f3273ffb01e42adee17b898153e41818b91413ec4f6386ab3dd48db875afe659db9eac94d16f850ac179d087d93784d607349e8711f5f96fd514e8d096de8b4a74122ba914520e93a11fa4adf006700e122e2531e1f39340cccbab4862708d69c117d3efbebabc14a0231916ae1ee8285727c9fc980051360346d53dfc76aa5a11fb1fc8f36f95f741e913bd2cd1031e508b320abd2d3a62baa400dc439969eb44e6abf8223b29d4025c3d1ca08d2dbdbbf9927c625270543e8c0cb5ac5bb5d504d224e66a1895719e4f975d819a95e54cecfa59ec8e385aaacbb023772fdddbe093afaf5a75e63a62d51926254e5b47da1e9b05851196644b9180734d05810dcf3502747c4ece652b67674c02aae74f20d07de2ad5993b3a68d10207eab6be5be34e52ada655aa96c1d82df9b24c2acec35e8f0bec9131c20d0ad8936880af87215611b80d07d7a741a12d8145bd05066c6ac171afd8684b92f72237bb0e4ca4aec1ec280e39f36928852d5d8d02fe463acbad8ecefc103083fd4298f399bb254e7bfa166638460b760ccf2b0f5fec0e3875206bdc8ce096274643824acfad71ba06441c74788356caebdd2208f6f077b056fa9d85aa4357e93bf064a776f5f3b0f288d0afdc51558c8f25cbee17247364c2bb24637dd69017f92bbb43024d9c773439626a02bd0cd44136a642c9c5ae593f32eada790c31a6704030f2e07f1173cbc0dabc410bf9864214c298a6283b3631acbf94b8371681ba81eed1aa81ccf258252d7f90fe733ac770b9744d0170cb554b39e6c72e05919cc237f8f4d7f3545f4d2732f4c9473c77401dcba04c0fd33efc73219f31c08dfab26abee9a7cd4ad3584730768fae899fc", - }, - { - "9c73ac05648e0c50a3ea3a8eea70841e8e06669c1e7520c5e25e093769c4b005375c0a9cea16ec8e00261ceb96a00924a66fc0c4e4e089c63e93fea857aead8e0ab82af4ce1682cf3c9fbad23fc3f7e632b7aa169834ddd6c7db7e1e892cac93e4d787b2ed0a812aa93bfce8fef3ce30ab794743ad241974ff989288c43e1ba815a25a03acdc2d5517293e161d0c46c8858d0b32b124a6b0bc3838807753288cf6838fa25fbcf876e6368c0342d3cbc860d6fa12faa1c2b7d9fb37504e60dd44e36ce74229dfb80f1545125718dd1f78b31a8aadbb4d6494489ce596fcc2dbdf2ec22157a1d966b61e780d36552daf084739b602861a96ceb67b65b23d40916c02b2c3a38c2a59aaa266e1f8939000dac9b6dc50d1731e87ee833a2cc3cb98c57e5b680a85c1b428289520bb252096efd7723fa8e55d2fd4e16900a435986ab3f3d2bd799471a1bc07c1772ce10d1bb8805a6065b8903999f9393d2ed1a7e1c57a9e3e0e10dfca17a04143814f5f3acfb99a34712a6e0a24a7485279ef343e69d27c77e25b41f9fb833d7cd29cb6a15551d5c77b43d19feb19f2640926a272f81eeadb792bd474ae11f080ada72103f8f7ca733a9b1325b50589be2b2b3023491afec246d336f4e4277592ce9695c68d5f39c8fa4cedaf51776d7ca29ea0ecb89eaefe71e5f3560c68e8dafe7da08cdcd954d626418677b8f3f45b9194474a32f548a4da3bfae6a3e2c0a25f602e3b3a821160c397d77c8bcbd71c5f1e669213af36eeea30d48e12953071f55eac2fe0bd8fa355671fe032f6fc9214632428125a16fc8aea8a9c7fba0d7518b9a4f876349ccb9bbbabcdb2a85fc60b83ee1ddd041967efa4036e5e10e377c9886f40bc0b0b57c7b724795f843f6a072e87e532a04c21445090a360731a2afb896ab795750e5c2c33d58bb714f5be427ca3751df09661402604a09a1eca95a8344d3daa5b99d68e6e6245825704c5d4a73af197d052d7f75778917542261d77735a21cff3f75d6159a3e4b1a7a9854ee376e6b3c8bdaa1f353b957862b2efd50d10a40007026261a546124cef979ad20d8085d53e30f5736b8aebcd3cdaa349ea474af249ac53eef2653ae1fcd5b3095538de9368d307d45df2a19acd44e3b78c2da9d5d9fcc4cb61feac5dd35f66299845bc0018c3d476b6761083baf33a4621e41cfae0e0c642de729fb2d206db6a4b976a635b3fd911b5e9946fddceb6feb2d2f893b2bed590317442037a1d6dc5b5d72910160221cbecb53bc983f1c736c3bfc9757e9e05af1248b28d651f521af67b2a0d7e4bd86a0013338404fabac7b9833c372142e6338a98c0efb7130aae8e34bb0c80937680a7a904aba3be735d41af9462f17b967b13566bcb697579f8a9340429c77baa6e24ae1ac86d8d25ae3cb9112e34a7a948fd141367898c5f33c0635c87de06f603b510cb229df0d0d9a9e107de88b12686c539ed4fc54c8285afde0c8ee502919a125cbcaf4c8c89f56e90d3f641f97c07326956f7b5d87c65b689f39b8b84359ee0f14d2c7ed621ec67f5e2a8ee5faf21c805187edd95e3941ed62fa95a65473a569566d46b87c0d27ca37b6b022a8cca30a4480d392ba15701d1015b3648958cddfb614983211bffc4966ac6c1f691f19bd9fed405a02c06712d62a775f73353f3949c76b6b7757a4ee0410fd6d20071abfe46b09e72b70f9f19b61410ea67037e037934bbefaf09cff018a5c218176d165d1eb5cfd5c46eee7b82fe65ea02e3ed7b18a86ac7b139b7c9df79e1f6e6f85304ad22d97190c7ec12c651fcc835ea434d92ae1444e7cb0dc644efbc2ae70f2f94310805c1d0f2d49643d05e78baa1c54d4fd99137a49efde88dba1374c94208fb4a0ebc1a0090b043610ebc1bb08168ff5bf936ff9834e825eefb9ab73da2b287b06fa2b0ff52f46061b07c1131e4108cde478c767b749b696f3520acd8d3338842d53941282da289dd1e9a0e02aa9be0f127566c9bf2d50a27f6b6ffc9e9880bbfc14ce7eeee70cb0c0ad90fb474efa69b46123638e8405fdef65fa7e0e7b29fa8fe8696edf661f9003a08b4aff85a4a3e6d817655c1d533b834da981b8c37c38abd5977b3ba71b3f57967a471c2eeaf2f6f258431fbb7e92f91814b1db80ea775681f282290db170942bb7b04aa2a331950b74a4b6e337affb4c51c6cd4c4e13ce3095e73e4767c2731f72bdb225ff572163fbd8573378427fda194d165750d487f6bbb63e1378a132fb6ee5115e3c32b2380b096b735bdb4d651853bc7928346fe3ea9df7534f2a4eae1f5ffc4b82ae738db7df0103ba4e68c2a2153bca499bae2439a57778cfc616df16032aa8a19e26597d275d2775b5ea17cb25d204b18028eb25a053e5666ac47c6def151f7d4b68ea62c601d87bfbe04711c24bc34274be6815024d7b7d01e7dae10cea6e485348ab195a83854663cc5826181b688cc9c091dc1e0d491fe51400e20e6f2a51a7d56af258e038bcbc80e2c4ac4b41661bd33229d07b39b59f3aa79d99c1ef41974a33e02a7cacd6fd8f9b99cadd0fd6a031f070bd3a364c64ddda0e9fb94036f374171de0b3f4ee3380780e6d77d50db9d58e670fb4a364827d631226a3491a27602808141ce657ad6e560ad62b088ff086e6f03b8a64bdf7c7d01e7b19289279509a9d6d80e50aef3b05b5561e4556952c46d0b6ab8eae735eccee77e570e1360b7ea38c53ae6b8eb420e4c2663b57827228392db6e79105a47f7d89e06ecfebdd63783101d3bfb5f494785acfdfed41f8166faefdf0b49260222c4080ec2c6e4f949f41784f076ce37fc7a34fa4e547bb44e6b9359b4b95cd67d64e4402ac83973bd50f8adc7c6e4c34019bd8f6d3843bba3d7155890712e0ed5134e00db877398d86b459f312a6272431f01b057446bfb1b8053acf181bac79408c7708f3a0867a64e06d7786849bb874a6bdf8fd6daaa572d5648ae100f4318d6b3a811bb0fb709168e817ed83c0622a7e5b17ebf5cd5ecb21d9ac32ddddb039083144c93cb55a95ad72732132d54bb120639d1620ebd142b58d75835b35cc6367012c93c6772963e9ac852c71c0dda2246ab845469997fc170d8f62334bc5aa4ce23e036967674303ec6f75bd3d17d197d026de69beda70bc59d2ff95a899d28ac7e5e42f4d37233996a8e6d3b0b86b80df49ea8e145b4a6e3e39f3d6c3c6518bac45baf97cde23037709d737b242b8918ca31f90fe59ff2c83e2f347a954d3559a8e4f075c620ad36be20b1e24b3afa156cf3255192171ad0474e4adc9b7f35436325b92945665f038611e5d14bdfe7b7d20c09642323346a717f460dfe7b5062a0098be66febe9f5fccfc747aeaeff81ba08e5dd2b1a489c998ea9970afaf9aa03859073707a686c492fb3f7ddb27897ba5e75e578bd82114b2ba85525a2002927909c970a04035334b64b1169c3a923211e0999db8baa26b6537cdcf57c051c0ca1b317a5b66ad96cb5ebd57994f99ab202348d8ddeb343312f1f26ab2442b8c5f5cf6bab394418ef2fed68c3e60275e836027515b6b946e5d86d91fdaf49c2a5182d5051726840a156a8653cabda25e1dd9af693533d782caa09295952ebfe6a194fbc8bb7fc2c0da5914a506c6f31490928dc5d6554890f5eb268b09d671bb6b6d7416dd36e7b78ffc5c86b34fab43d22909a87e5239643d5fef373650e291be56b89b9d90431d8c9fa44fdf4f83a1689d59d6ef833b1ce31a44197b36ab298d53b51ae3f8387087dcb0571c340874c1524ba0d576bdb88101c1fc387d25b5c0dad0b4d309255ad5d5b1e209ba56db0c927bd209399a8a3b5c8663c9ac199a76ea4f49e364a4b93a569b3400e20f0d748adf7db46a07efc68e43802a5d1a914759eb2abe8fe3e8d67f2cd7612bd4d5a6a4535b1e5b3ad4d97e54f3db7f8512c9603d87e01160b6908d8df1b952c750071abb1565e5ea3f643f233faeb84278187ff0089150bf21ee4d13979fdae796f592ac5b88869aecc5be1c64665edc8ececc87502d36720b73859313607aaa561d56a195dd3c7292fa8f0750ddd3df9ca056fccd9d6ec900f45c1454c6ceaad4154c69e288dc85735b8cc42950a3c5f0fab2be8811779905c3ad5a9a6bf56e7141d863caa4e93e0065f229b695efb790926618b3eda1b9a15f143bbb09aa3c4b72900617793417df364185cc213d5cc3a375778117212266356e214f085d8a7aed908256c4aa25faebabc70ce913c08c89380da06920069e8e27dd867567f152f883a9bd2dcfb8097b7f065482d6d11c0edebc67feb3068cead403503c04b324885ce1a62c99af9808a5ec8b7cbd978b8c43e37b06e9f7e1ce0b31fa0fe52e8842002e6e99cdf69263d31de080b56c0cf94f77f0397fd1f77b13e17af90ff33b00119999df802c33534a13d3ff7fd0e8cf58e8f8c8bae033cec1aec7d191f2d1a39c7b731c97a67fd1ca43c13a24b9f97d92e2364dc26a1c9408d4659ac7373e53a2a1704a47e01c0223ed4c489735b62a27ec67ea46747e4f48d3da101b0863bda9d3f7f1b413f3e7f130208875e6a29dc30a78198ef658c7ca32d7d53b4b92e51f8ad6d39ecabb800adc0870b2ab0e85b5769f346ce7fc371ad40c561f9f3b2f2a01f2b8ccae48c78a41383cfc36b2a1bd41d61a39c24144965d9aa5ecc5d506c7c7cf9476085bf049942d35caefd77821ad925b7fd3a006213abc1e008114c848d45cbedcb8af264cdc5c07bc338fddd1123940e5d95717040325048439dccd1e298bead22b011ef76d26a390a68161b8bab29e8409a5880cca9c8104694e1282c9fd64f50e73ec6b9a9ffc31115de9cc0088400a2dc806f85487fcbdd60f409ffca584fb197156b40142e512a0dedea1571ebb74d6b26d3b4a59e9105929a055cf3540e8a6a79ca7ea71ba8b40893c9797e81c6e9a7999d4d382e52cac95727bcac354616ae1094552b3d0a33d0d3ac4e547237fc0cd54944039b0eccf335889f6aceb518de496e0986783c564be8a4a05bdc9c67b1e5abb480b98173ef091259d8c772b611e0c09758fceea3e59243406edfa71fc452d4450b55b8fa5ecb543692c6eda3a6ad3bfea929a18ebbe5ce2ac4754989c71dced37286cdd1512107e4e7f4878da1c28b4beb2dd9a712a8d1d61d1a5fe5382db8aab4857b05a783e98e77711c1933a7641fd43dc6e6e597bd03b11ce8e94aa094fe250f03cc92ed5b0a5e7723911e87b0f3c476d9aa0d96adbfb395a8fd353cfb5a4cfe27deeb82e849f90bdb17928b0a5702e4010f7aaece2d43772a78b325d2ff24f9de0f7bc65974d2348c64", - "bf96bbc17abcd1f56a9f22ad164d25ca72f8c996f1a7a66d6effe140336da4f20460b47e1c8573872496343be35a055552ceec437692b0e4919224c4ffc8b603286a8245eff5cc148b004f6e5a54c4ac22b0f09842a07cd332a09732694d3591b8b7d6a7ada2bb38a30aa7fd5e6baa811b9a195d3a96306d", - "aa2f714d3a184a9883f4199e8e33fbc9c92b36fff2d59f07a9d0d335d7476e81", - "36c79f9f14d431cc8c077439", - "873d0617c986dc9d83e9cdfc50b1f916626a9d9e1c595dc7ccd99d1e993d25d89b04a893c89e205952eef8f1733054bbb55fa5e1b07135787d4fcfae226737b50cafa2c11276e8708451be9b4d7f662e98ef6b705c5c4fc64588728eab1dfee22a0a92bae61828a7394977b0ae8a3b6d0126a23583fec025becf0a72a28891391ac1495732a7a4a1d43a63ed8eb37b280b6d886096fbc4f77aadbc5e441e996334d0e10cd7f3dbba9bb7efb147297986509a07735385c681e0543186dc166291edc3b4664f5c8ffb0965c85bc30ff5e7769a69609c69ebb68f35d104bafe3dbd3e2a40e13865f19bca3612e48592aa930eaee29440b4ebc1c0a59f1c54519857c929709b086bfddd6d4a30940b592be48e0067976099efe71f45f956182dbb300e8076e1207baa32d59c1afef7f34171bd66099d2d7f07b39d16d0f8b085185bf2554c6ad66bcd656f07979e8f19575a116f5c4fb9700ec3b46a3254f28afa1ed51348c1af6dba26fd398098a76d7bfa2ff195eebab41330ef290bf75205a2ee570a2fa46bbaa74aa6ba68a0e63e2731dc1974eb44794f3c89ba58cf96f7a070fcca678185711d97cd9d7d8202351ed589e0b05a7a190e60ae4aa109254a7bcf7013f8addd07a64145e21226795ff7c7b1c225f40ed7c3552da8eb18b9bc9bc70c2e7ecb10c8b20c54f04b6e27b5044a7a67b558407eb330f2083444375c022565c45fe817dc00c7d24c23db320d15949b0b64fbbaedd310e73e423fcebe6e1e98a5cd232d97e6466642e5e3b23f06525ac1cdf8688650cd366b1b7ba2a9033e62d836b14bb73717757b76b9673671bd3d3b2a56628f5a309f3b86ad32abac0590c50f7c5a22e0a920d88dc9fbcb3add08b900a2a2fae4178aa100a0e645ab428e0e79bd90baf4af2755e48262b64838a6fbc21226e323c0a1ba5703e30738fc7b5a7df9eabec6199df5ff6ad58f9df5a734ccd6509e53ecb3de1c881732e26e52ab848a0335b04b25f2254aaf8c130c78b0c9a40b60d402673ac7ec7311d0b00c45bd176bc73ad81c2478611804f59e3c145110aacce922e473ef346f8acaabdbb9f313dd3f8d0a937d0c048e5af789e2e09a816146f9ea28170909caf2572a2f6e2d0d511242909de2815e9ec586b2d12183ddbeb7dd70f32424097e2ec28b4ba62cf78f547e2057a4c050cccdf6b582172343742ec8c85e2847efb1595bccf89ece3b3ebba824d2f097b1987ec26c6e5710544739d54a714060fa91b7995cff0161415eaf55758078772c0271d9d282354e47a25b673eb11497a6ed8db82267d65ad47412300ed525af96f943c5336b1de88676dc346e7339230032463d305b0442f934018bdf0242768511d20474c6ecc82fd752c0c0ca5cee1f3e06e679fa5835540f97870d47ccc6bab233290be7a3bbd4a73f1dc7682049bf7b3cbfb6687479c18d246e3c07161df5c889ee95d39cccd989625a8c9e80f951f8b1832f6378e05daa8566477d7fe547e49ae6e822a68de4df9fc4d6500d5219c3d3bd8887bd7f695151ba378da17c2e750399f7482973510a386721c59683a86003edb9f0ce1ea89bd7bb8a25c222df7ebedcc1b56c8ce18f367b2cae720e0591b477f6ffb498c3d7ce59cabb1b01d7cba84d7180b4b2a165d4b889a6ac361720e768f2913aa50b0b5c88e55c35bb4df4fbc4460338809605f1fd445a2bcd97ec1d2f269b5e779a18c8f215bbc5555c745424484ee5436119eb8754f5e9e91f51fe715353596baa1fbb0a690e99691636e6027cbd4b7be752bc278661e2677070ddc12dccc262d3dd47160345de51359ee8dcf2f61044f95dfdaf323881b2bbff68af6572348f786f6e52d1309cff871ad58148307d7eaedc93ef037922b6092ac62171433adc4934884efdee3052ebd60ee115f76f9dbd0eab7c4c0a77b4ce8078209d23d81d957335f331965b556ebd54732327b5aacc899f9ed0edacad9eb98cb845867f249efb0e1a5fa2483227f78decbf7f1f32d060ab0c01eb985d83920b2cc24b5f9a0d5d869e980129d3b78277fb87e5cda61e340a729d86b6617b8828dffc7c37d4c38080ef3515c2784935973dd184e0a8160f84bb78bcd8a5e691760be4a4d41ed6512ee436ce24650c0e17e7d74b5e01cc39b21e21514a84db262d673f24a82cfd5dfe2a162976171c538b24af16429bf8ed5fa8e37f89ec6e7d63ea1d83ac1087cf89e8f43161f225108889e922493d973e36b510074533cb1cb22174d21c4076959e4191a5df880a8b868b95a9cb5151a7ad47375fcd87725660cc0b59c88ceb86984941268493c49b8aa2baa8c531ecf497853ffc3d26b926a379e72188e246d42073041fbca453bd558f328881c8f8d9e099e898a912530c4be499f2b32229c359ea10e0befe6d94cba5ddafe51d164898166e890b22fd1eebd5724451511dce1f8f7431d712a3f1e50fa5f609da686253311af255b84b2106b09b803e94b51729cfa0826869945d46b9606547e7e33fd9961cf15b400d0f5e01d8fd4d92a83ae526934059d4514b9e0005317a70466aa0b6086d5fcfed201d958a0de55fd23f0919ea29b8aa02440031a9fc206b9feef362a73430a4204869354ec81b6fff92eca97e7f1bb12d25228eae466b8137b4806895ce34b57dc14bdcd107fe160776b0e5daab150ba06976eb884eaa574da393af4de355381c7caa4f611a2ee70a0c78df93a4276f55e6281997b4aeb36888a6d9638cc95444047e5202f41f8bdd787f1ff44a648cc7d39f05e49e5d6989fedb194c526780709763da81a780db0d1534a466cce57e11dd3a4c0e273d9873af1040d52a90e20101e1f80ef296d45769d204cd5417a84e022b6b336675d36d9cbdb16b0cbb08f5e240012967c8067c92f97f981cd19d449084400d76adfb7c610abb73bf21e161db04debe6665fca79d71c8cc50adc3ecf0e52d07773478ca97b8e9821a5704dc58acc647a5bc618d2b681f17942c46c266c73ec211ca403a7d47e42e12c775b370cd500d70a4aac7124f5f6d2d4ca78e1c17a96426c326bb60379ceb0c84a86200f3b450e5e9aaa11f45440f5260eee7675a8b9c47fbc58cf18a651a1dc7b39a911442504f12c103054bb50f15381e512dc6e3af7b414b3db26fe767d83a2a53d7181fec8f6b196c7874befd6628b31797ee3c9260c7b7853b137893e36696e2a47277add98462ea9a0edeb7d2d3c0f2805fd7db64c2c7eff353ff2b36f4de862a42779ffd4dbe77b6a79bc9f4ea3e909474ead915fa3fa990bc82b83a670b163e79300b627fb91c4502e96bb9dde00f716ae6ad14dac647c9f7c2e5b2e505708b5fee996b8e9113a8f4f2caaf414061ee72e76b8bf47ec4f781bd7c589adebc2c267448247e30d659998d8037783494a1fdadcc819d7ad7ea2674f75e10639c3d3055046a00814ddda0e463185454a4455d60b9780250183d591c3db6f27373cd2ce4f02f206ae10a8c32d71226e7cb8d5b05909445977164983c0073434d6c0f2bb62bda66a16792d6e53a49ccb5ac3e285a6baba935f30e9d1ddb812a018ce04f29e2009ad678ba72b6a7112d6e7cfcd3ee7b058ec954a6fd7fd01018a6eba6209687c3130de58147b07bcfa02ec1caf30b59daf87db4618b4a5fad34cbc8014a7529b9458e05eccb9a77ef1621aa95513c6fa4003b0877ffa6d48805e7867dcf53447caf348228ce926233f65d553146584d6ff3dc3ed3296db9bfe69dec6a07add13037b3aade118b2ac3c52350b9691a6cb32356ad93377059fb8ceab68de38d96876d6d383db01f3cf620e47cbfd471bf6dd1f601210482f7c3bdd4c3bd37dd0a7507e1f0fe515151634813dd4ecefe97b52eda28e7a7129993b0af311abd3a07bc463f3cbbcb4fb0eb265a5835663fdbab0d8b8b5a73837ac98ced6582348fdeb41ac8ea9e36f9818ab9c0a41bac1389a6b518ea17df043dd50550f32471645791bf59855ed695b84919aa5cb688e569122786660f06e3a919ef9cf18c355bb397b86710c367362cddb0239aa1d32d489328e4bf92b3abdc3d0dacd76ef1a1efa28fdb848e708aed6780e2d8efb19a2e26fea56b4440dc3eafd796896d73fd150bbd967871f5e6ee5db58995f2f85cc2a15077d7d472bec2e30430af6891193ef03dfc7761e2b3b3b54a72d4f1084a8fc541526fdeb0633dcba14e9485b43065aee8750397ea88d9ff13417149e0fa145be666e6f4afdabe7ad8e4864e777c20ee7a2842db44dedee22f3ce2f97d72919b9ff6059352083be816a7515c48c5140a99af8e81b9e18b10074dc73dab55fae66261421629c8e323d8134f08beefbda555660a51e4b55a9ba4573bdf0396cc413145a941c4175aa672586f7676027f9fe211db87fe07a23962f5b1ad8f566f0d5b13c5146457276f307a02e1e13d00c5032a06d225248215e4bc4be1b672f1eaff16ca95da42513fc4315c7a6663f9101aba80224acbf0c87fd3a2ee9dedd1808c1247c5bebf3cb8d77377a508ddb484ed91203a438ef5ed3ca14e087102bc5f3828d8c3437ecf5c92eeec0331ed93ae33520740abae9b7bfc45f097da70adbb9b9b879e46a7d655dbf75d89773f737b66fd8a8c13506cff7b44bd85dee279ea7053f3ed8447fe79c400cf23726fae800449d27af5e342ecf776378e2eb449a3af27a40fe4a9806487b81c942bfe1a4b0fc146c971a13f83669e0189e337cc9fa2024864436189a9165ade6b864698ecb797ea05fed0d60f0ab4b92cbae36c72ccb5aa45337cc02dd086afed9e5522ecdb75ccf389fcd63c5a4abbf60908e39cb3268c76a08687588be67a856a841eeaaee8ed016f6640ef0f5acce12ab8bb58dda380696e3fb22d0bae0788c4fb79d00cfa5ae3e479dcf7d08b45f4592c2d2a7f8081d5a9398659613ba4932ebfd7382d516b2648ec4ff4477648069b9b2e4decc89547c16ab82a0ad9cf293fee5adb17cea4c95ab7b8e386dcae6acac63ad0d1d13656dfd97d5623dbe45230de597751321bbe5a03c879c303fd7a0d837d48141decb6df4f0865717628c85dbfda29df9a8a69b2c956c75fc66e45c08960c23bbbc706e48395057f989dfe675305067b3ed8d046db339e504d5b2bc978ab4dc261d8afb325c5e794ec79d63d8db53f9dd24b623fbcc202679fae8f7d39f7f7e0667b142c714b6a723996e5254ad2ebafd63c3577f8909981ce6b3eb1a6ad67a4e93c45ac3b34587d153ec5ab67a2697a9741610d5a176cb9b5856bdccb98f69421061c84811dd6660495d9f30548efaa69e36ead246d997c95bad0ca3fdc1a08b4be31b12daf211d3e29d585cdac48af8f2268ec304bb35d", - }, - { - "ceb1f819497c0d631a9c9616655f419b5e3470fd3b19cd0e4fa556bd26cd9df57e960ec7121b2a2cb7c0421c1f84b77eb8277bf341490190ee574d1424eb09a281176a933394bfea5502077486bef23ee66e3127b732b7a58a04b9aeefc35170dabb030d4fc3f8a4c5ff194bbd0b89a379baca30ec81d576868f25755276e62c31e93a80ac322571313ebcee494592c3ff5cf3ecdec962645887d9aafdbfd62ea910af5542d4c7731283625bc9f41ec85012b42edb1792339e6cdd9c2bb3cad4c4792a064df17a5f74dcbb3dd0d90620ebba4fc6d1e1f9704dd60c798ad64d4e5077549d68cefdddaab81a7a91209b7ddbea43accb3d1c191328929dffdfeb4f5740ecbf0ee99cb9a1b73333d7ceb0b2b8f35f84307b9d44a42fe1a30ecdf2650dde251bc8c1d46978089c50d64c028f40611370ddb0b481df9624ed63165370f4788bbc396026b268c2023e0f04cd4f66e0bf439074c46f0ae85d6dfeb0ddf22868af61c8d5133097156fa61a3cf5801db5c3ad29871d336f7aa06d2a7d5f52e50eb3aee3c7de7bdc4d21f68a1776a7cc3954f5c071282febc89c1545fc672a0a1bd8eee2b769be048ab58ea12b356d658a6225fb8a55e752f1fc97ed64c2f87f9ae661514f1f56d9d4e47b001ae865a44b8a9fd5df8628d183bfbee781b6661c9cc76debe6c3c5bba840bbc228206673aa05498a8c715b0f3019f6b2d05cce6c233b5809ff1dc4a75d7f69859fcff94ad442d460b32f6fe348659518c16385e49fddee9efab2455732aedcd17dd51b5117efb2ca1e21ae6787437f48a7042d46e11be4dbcd2932ffd70fd154e4eca5fcdc57c6fa79746100b8e1485fe575a5c79089a25eb2d55d89e42eddc81b82c4f7da8bf153ff5353b7349b161911bbe0a14483fff6585d7f3c8b5c04a6dfc99db9548f0c53e25f0b16fa212f0bdd10ad2193ac18eb09972795f42b3bd3f4d98c4868989c4af7a760f1c88ffda59faac73256df1d607644f56a70303d6409c9ad716149bb58f01b4ab8ab475e4af1257d47049aa77adf9ce54fcd22b3d6ec60484da903a6991ff052ca37b01428d5916fd92c17530bb3385a805b0d57476e9f9417a23ab1c12a038b61b3a0898831f9615d10b468c3edc24448d09b8f3e3a2355dc5e069e880929eabcc97344fb6ca5587c5ac1404783848f531f1e915941e7359fedd328f7fd12b3c685f8c1f29d1a6ef7dbae3e5e32cdb251eb43aa2d2ae0cc18b3f40fb006c2778cba387e5852ec4f2d9b8e8ccd5b3e1f4781c974aca940c45d35d30d3b9584c750bd45a80f32f73dcd85c99ae107b92888839c342cdcf88911cb974d611b14b1d85a59e88c502559d6eef3b7f5addf7d307bb25c57aae669767db6d798ca887124e159b0317e09076cfdbe61aa9ddeda189036703b1cd9b1998f88325910a37ef1fc2e227a382ae635e847df8625b99eb6ef0ef10ce7a2a5762ad7d03a7a4e2b767c4df0b477d6e9601dc8e6438184f97193ea7d7a8c22f1b6fac1f0740f1beb8b68db40e0b22940cff2261273aa0be43df561b88184a9377e6a27f27942dd04abb9448b6b6ecb3a60f14dd39b58b8d94e1991cf9d3a071ba42e0e1d71eb211ca466a70fd4724a34639707feefbfd73dd9680d76a214924642a063b38b85cf30eb763fbfe889f34b20fa4a10ba214d938a5a092c6e9b73b13bd664c75b34f746aa360593c0f8dee0f328f0ad4a3e40d498490007e573b8204a1ce7a550deecfb15f18ed5ea6cb5dd95a68adfe4cab37c13b383f8273b1971580016a8df02a3f4f431c9de9e7ebb33244512080fc5852278081b9f4434109c3427441329e8071d19d0fbb74fb6ea73fbfc7c0ac1012d3a0948d94d7ceae9b0112ec43a16cb582f9c53e7eb0ad15e05ceda108fdb3dc9e585a332018d1cb19e4a75d86041308fdd8476c88e4826931601a3a5dce06fc16512f4669f10183d5a8d15bace4649abcac07358089aeb1e9b8fc3776f3239d5442d3be33d532097e13651af7c9a5b465ace9e626889800318447b8876b45dbbe1989e1eecbfb5cdf5067c71a0d7b7fba6555d0edede12f7228d7f9841dc532274f24060b1f52da6fbaa179b81ce962723f43601d248f8f4d5778c1653e038c8d27828836d562968004003810e9aa9318edf3260272b54fca2e012f6c04abe92c2e6152f3c3e973c7e9abe8c3467bdc246f0226d1b7669bd577bb317c571aa8758bfb694fe4dd17ce78f091cf6c6de3cb601a9d177128fce8d42e652b490d90c4f8fa04ddc71cac300d3dff699be3250bfdb2136edb0057af3ebcca77ba5b3ca34531810c5e2d4c5b5b3bc4e71ee9e30cac067b7706c326357fe0ad2a4bd9cd811b4e9d696bd9b4b70579ae246381210f879c769e5f9cc3cf8d70e9c94ab74a55f5d7bf61a17418b6edb6db4147fc40cf98c75de85421b7d192919add48e5334ebce2a06e56b915447fe085b7dcd677659dd55de1f705c389975e56e0338a2ef07ccf5ec3786407e8449d9011641786f1ecd4d3d3da975d61f5a442293e6119ab20686ea8cc7681010421226838a95a157e2de948c536aabadafcd4095dfda48e5613272289a8238dc945e5f1ef30075d5de096131740cdf23da1fb8b9fa009e5b321083cd93bba9271909460c09bbe1e8c54319394ff85c291814e21215816d4791f01424abbe4cc4c792d0d04db1b812f4d24b44caa76de2bc50f4d1d1611862512d87fcebd3c0b2659082b2423bc5360d107ad7b8e8ba7438ae4509105d6b618af25e75c51e272aafaaddf1e5a227f2b2a2c96a8a83dec23223cb428136a30b290181ee20a819cf52f6c03798e7294a89f3b5137693d5a8b7a0ea38d78e43008fc4eeaf6d077ebffd3ef7952620e0af1395c38a289832df391d1710ab5b103a1ffeea8c06684c03a74399cd63797c770e3f0136d8331611502d21fb883136a82f2034358880392fc3d2fc274b799e59b89f8f90d2a5a123d3c21e5bf3540323743858fdb8912c7c6329a3aea241075ae097ebb23c8cd50f4ff46b42486e65bda6beba5f4fe6dbb30f7e61b1bf690c9f00f7513c83274cd21bb71563257a20cc38da2b88c1063bd0849c8243058ee205853342085a8edb7545f0d96a6af936a3d4612b95676665eb02e72e0875100dfa444f039eddde1422ceed8d38e6c3dbba25064f8c6cb5786f9ca67712b7840cfbd40f99b1edadd4bb9a61f48124cf3b49d68bd642404eb1dcf428eeabadfba6810a4032f8ed06b38867a7098c7744d54dcfab8f0ff941ecee69da9916d54097e080cad86dd08bf53833fec4aa4399f7124586223ec70e2c31e8c647be06df9e86a976f37901e9b134e775de2a0fd53d545c5f92236dbf5455859c138b7bb1112427049d29ed4f5dd5c43cffd3113c276d9bba910879e55efe817189fc239a204a9ebe738c0dd161d10d60a51e9dcc8c38861d41ff029ffd841086803320a17ebf5ff14b6cc2ac3dcf0ce2eea9af7ae23597233599c2321dd2b99e06d93f84989e75e30a388f47079c2af545d96f270e064a43a00c76bddf2f5be5089a69a138de844216148a1eb0b413f58d831d9b8967df297455e7538442388cdda12d157fb25896c6e2b47696c76b234a88bed4f09dfd64f2e4b77627ef03049030190fe271a5a853591ee9218a0c6b12cb3f02683d665b211dd1480cd44c9c0566ace7d751902babae14cc3821374bec774d54b4b4afd5d1811ede556a7a5ad02642a878d2d32380e7efb9082604f49d51495105f827d77945b5cfaf2f2980566b28ce3dfbf1bee2e077eb067bdfa4cc28f5d2211ca99a615e69118d9391e3feb9b13cb4a2fa9682718189ec612db889228aaa3f3345a091aeb11f41420240fbb47caf567646d9e7c762d3288f8bb2b1165cf049a191db5042fa9185fcd180b04d3007c376e0aa3d427d66d10918821f74736816044366463df7cb3ac94cea167cf1daf2d1842f130295e40bad672a22da9238ded69e241395f04d5e3c3875b8294faafbd3d90ed56ff3e01c5a0a3e349d761273143686aa26d408620c7d1a35ccc430a09e3f750d3256298c6068c0fdded270f308f79d2fcba591d723ac0cef703d8f0e7c051bae5b453abbadfab98bcc297ed4201b03ebc195c2e441cfd3b10c63c08868db36c320707ecd6a37593661d70a81f30e6db4a32f98e4fe6b950ace55923631c8f95138781fa2af78d8104fe39242f1fff6942e8e782dfa0d37c863caff9492f8e5cb70046d207c4630cc29c20e1ac105aef093261d8d335456961e552ab14d107cbe14e9de912f0e5d58d16b729270208204469f917af4e710123c3bc38a4b3f485f2926f058344db105b9239829441a2d8ababf04aea615c0e350846d9bc3b5faecdbeb450f38f615f119ad1b5dc748e88107ec2fae01f0915174feec37b3e7248ed2699d0a5fb2fc785f17d6275fbea867aad815acc8a6fd3ca4ea7357d197e5a30082ad5f35a9d894c0aebb206c6487163c9cc20442c040e6aab33d7b4b221e4ba4cbabd975836e353129559d8ddcb3c97876cdba360da0e0c1dd5b0cff7957a444027db985ebefb6154453a221076c997d3954b347f49308d2ee14d1676b75ab6ef365f3de54aaf398fd96b9040253813ba734829bc78a6db59e3f1c0ab4c878a72d6b8681157919130fd3171126994dcdcdcf68955ad64af8156702c92f7a715ce6f7ddfb70f60e80c92691efbfdebc8cae252108fb6c0010d303d9027d4a5e63413b5fb2316d32fb93c3ea52a2a7df50cc0058c76c58d73f5bb041d9fb9f3c3cda9bee0c0920079ce4f1ef8698ced664ce2e2b3b86027ae2b3bcbbae5bf7ea3693d9429cf94938dd3a2763d3f53937c46763ffee6579d018358bc69182b1c7158a09b18352ea618c11c45f07fe97cb65faca535f43237879ae3e0a31efd14679daf8fd2ce25eb8f32218fa20afc586a98fd908d3fd804cabbf56dcae272328011b252dfd83e5f0a5fdebc6acb04c5540255e1322de5fce9db5aa4cdccd74dde8990ae51cefd6c1edc1879971d3efb1f94dc41b2b23e9c9d89415b46189914a229b2f3e8b05ff78c68711385a00e9534dae6f79d15842aaec575e4ee0f098028bc74016cd3f8e93c6a0cb21a0b574ee63e367343ca9de28003d76e02d0ee2b8d622cfa3615d3628fd02499eb7bd8c1aa1f34edd9c2d059c6a7c7c978a5e4f60801e03e17c3a09793c5217f310a30db1965b8e328893cef20f4a899aa8d9fa28f7fe0a733813ed7466046776a874273ecfb57158483f4a588ad4f232adec5ba4ea651822780596de09fd54b1717bf04130619979a0e3d12ab7c35d64afb8099a1d21bc952653742f50c8e1c244d10374329cedd27fbefd37815a9b3112a4cb2fc587c4ebda381b2b01fced45cdf0b9ff8ca7d10b65ce42e728de183a82e369486a2e3345664e70674a5dac174d6616d90de8e472b62759df057119875483cfbfb103041751747f9cd12bb31e91caf79eb2db1168026a4707dc618f30", - "e45eef9561f3acb3672b4f38570256e8cc4d877e2998e72b022e33de8fc20f7320fe0882f2b53559e084923786e8205336a7d15f3fb88a41e7bd20767f2feaa02df2221fa7577988db0bbf61f3dfb429868688c53e130725d0279c505686f083", - "475a44cde0cc931edf9a44b0c1e0001766f09ade023dfe6b59a6af800e549b55", - "7812a320691ca8442767a51a", - "eaa577bd67fe79ce4586f43355c94528e306c1678946e4f7a907d2a8ee7f4281270502522119a8b09b6f05d864921cb515fddf6a1000fc2f67b52d0627998591e2acf5b6faf71c278e5754b2703662ce670dd049da8d6e280c2b84d6a9b29ce28980563c40e03381a49c54608b72faec9b272ef05cfa41957d9eaf3e944b22610c725d8efea90aaac6e782848d368ffc08784d7fe37ea1effbbbb34952def29fc511fb10a1282bb0b6334328e4d00529a44de3259b522553a07d524dc75f431cc9670127c15670c0df419826617cfb5ebdd8788d5f528a9eb1e61324eac5c1746f339aae2e2e2fae598642a389da671482128acf2d69814258d83de98f186468136868b729aa5f0874fef2ff2575a1f87439d64e049e4d0637e9c99ecb7275417af654541306615f30b75a6caaa563e4790dfb28fe9f0e7881ea2d885eefdba99efa7f878925ce7d33e86d888154a1b03189429fe20af8fa3a68d65ced9b690a709031121425cfcd7e1890ed9614f9dc3ecbd0e38c6c84e453e3204978ddc1ef8d7fc6cae28c61a472d8e089e23209f0c36e80c994af771e6505e72ba90e5543f6bad6dcd31fdd468b13533a0254e44797825764ac1f63747d8d6ca019ff16fa732068ee94be382c46b168050ba725379df31a98ab81ec8eb266a3c3f2e1cd95e5f12b3bc79b8b435e4d94098c6184631cec57e9d8913458889223a2a4541f34d2f9df380f34c3e541fc587f0a6cf08c82e99476060eb84709a292f4c7a8551bda3a9eb6735787dbb9d7f1e83937c2e0e49f2cf6e0ab0ad84c40fbafc3c7e61886a8629bea816972fa0afd0f617b6340b1af19e341875e97565c8eb0b25fcf68696ee674d2abdc29396bfd0f282543d2b72a239c6470f76d3b5bff6d1d064e6e2d06f9deef2aae8a259c034373efc820f9a2fdbce36cc27f35dd6386de3b49509d0c305757257f8674d958c580a09e768c0f6ef237416fd53c31511badb2e7cdfee636508482f01899e72052b46b5d844799cf94708520178cfec2b61c8980fa7dfaad8915b0b75ce6eb57ed4a01edcb4a35c1dfcdf8d60f3191bbcdfd522a0e321ea41c2cd87a303522d0f98b82dcbe53232ecbf0e2528de7e1be75569584bf2ec574687fde67ffe9827ebbe78f2e5bc4fb368f3c9b0f588c97f7a139bd82fe86eb605b8e29cee75d07b510da1b24fd62cd2fb366f1621e7dbf268b15937f7f7ea4acf6e615775a32c90733769996dd2c5aebe08ecba73e0bc4781d33971992b2764c1b08aa972859cb61b003406479423254a01ea85a348ef249d408157cc0962d1e24cd9c426e6e6a3784dec6fe935be1f6730b01e8683d97e21d8774b2e2655f85db7149e930a44524d4f86004cd687d8a528b6ceadd890707458cab62809110ee28f61a7277ed79dc41e573fd4a59fabf15393ed4c21bf4d5138ac843e80bbf5e1c39ac2d7f2147f35996eb51a9e835db63faaa196b8aef1823ad72523fbfcb35b5560582a48a25ab770e7528e4b3ef291e6f62f5fac916e2162b3b56304287e46839858daf322b0de083d1691d6bda44d66d085ef0d0ad364eebacdd0a43a4456035e58910d0b2dacce45b1c0beabc784f3620a3e4390c345df6117b86d4fc386523b7ceeaecc21233a2865ec6b63bffba6689fb3323402119db8f0665a4730b2e26ca6411db04f1bcc78ce6272159ed2665a286f1ad7758d6d90090a6fd320e697dafbdfef575077e282b825bd64a4dbcf92d1fc0c6f795154e8466ee4b318f2d44b6f81c52523ab68ff8367e01090c2623e00b4008e784049df873a35c29e0abcfae7acbf27236adba0b913d19a15b4af4996669aba4c656c317084347ca962ac8df15cd2f849f522016eb92de4de62944b917d88200ef9aa2def0d13e5f4ae09d2eb4a2d0800af1d704cb01975f6d59768a2b50e39e78116147fd6dcdfbc08354c1b4033bf6772fa127856a4072556a9f07bd7516d01ef41bcb519005c0a3b2a04400427ec033f1b52fe5fdc1aed8e2521fd0fff663e203defc39d7546281a98a502b8a470af16cc62a6581c9985d7ca516864b799fcc55a803ce80711484f6b81591d2402bb1499c95dfb1dee9846679c22853be87c84b4547138dc4fd46b4e79ad12773a5392540a595954112f0cb1d9be4d4eb3aaa4286b6c01520558d58587d9d7f0df3a0282011ce01c9c17111d10ad61b3675b1826c1ad37fc562bdde951b43f890555d6f74ac4fbdb9abbe8bc1e80bb6d52c13de8960a3ff8f65201265e82981dbe39e0d65cf3f1fb6c56e11f9786210383d0150a5e0cbbdb52ca8b2bc45c12fb572657380df369082685b3de9847d5014beaeef815d63e203cc911061eb53d89a312d187f9f02760bfa71083fb643f5d8c324c410070b7ebde250a185e7359837899bb1568a43fa3418f39c12feb03b148b924bfb98b99352b1fbad3f07ac8e4302f85d1fe9ee4bf7507972670ff8beca105cdeb037f1cc4f944d6ca869d0281653de5ee93a7362420fdba8b01a375ff08fe27873655953ec1c00f53613c6ab8b244e2fc1b6babdca5311428d06f57aa4882dc870165deff75ba877dd2a04d1799f26ebfac97a1be53a83ab77dbc2cd4aa45bd779f61b1283eae1a1866ec8a9c150dd0a4deceb2ddea1bc0f4206cd435600a8f190b999b952337d9eb2bdeb3aba2cb2e7000319056629dc1f00901f0880278509417223a3ea0919fcdcf12bff0771c7cc725bdca292068478ccb2e1f35ae8964e0601789a73e7e7c1769ba53f865910fc3d0085c922d7f7849d27b6e7503d521371351f9d7dfd5afc5df0effdf6ac49617fa228501ad72154a73e07781dc4b07765dbfa721d95cf1dc41e161cbd34fc7883a25e3ba6b03e504b2c3b98c8b12ff629b965c2aefc26d74faff7f784baf09c3fc38c487a9d1f5818261162f97e9dff70cf42eb5dbcd7bebb66d68f26d917ddf2a3efc0db1e3372b170b4cd18da507e44c467943f73648dba74db1053b53f989e481c3054bac22c6342fca2c26d30a859a1312e9c353bf921f68136de2b1589747bc765153927c31ebe749dcdff98b5da84c4b66085451b4c87fe1ba2142f98636bcb268c33f7b8c2b96a6525298814578377aa189dd73d5bb27ec5cd2110d8751c18a3110273df2595d4c3a00809bdeda70d86c4a8169b7010c9cdeabfbc3dd3266518226d0ade9bcc4825f18198c854de329fb8fe456dd3bf35d89bd9d2384f3f3282f6872351a18a2f852bf173ea4426de6d01b3ef4b4685aa82df7dc45b99617a8b8c8a0c65a2237b3eaae8267e1f6c453f485432529d973924a080f6a1cc2cc18f804f53209383ce3601ad9361afc331707be1c88b4370404cb7fe0bc538df04adc5c8d9ced94b4c474b19619a53dca3fddb434cac09ce10c0293fea04e8e1b19fd3ff3d174baa988d91cb604fadc59ac0b61f4f87bfd07eee20f7f3ffd96766dd6f3555cd48da7ecd71d2fef34ab082678bfc4dd007669b3fc7a937a5a46269baa7e4e4e43eff1b2b847ea70b6c6c23905d6fb2fbccd944251087ac00c35c2eedba30641797d36ef9d3cb1afc0e3e8930f5b605a847ee77106995bd44047294d04350194369c5a7bf246d1108e1d18d9a638be0c051f695ce86579db613cd8922e86c683c91800b9a34fe6339e0dd79472daa662f78f04f0151a3acd18f11faa4e1216222843b521fb998c8490ab8bab27fde36395b456501307d07b484b453b189fa339282a634af30fea99c9af8f877e61871fe743238b2cee6cb69dbd17d574b5106ebe4b0fde4ef42fab469a5ba7d62c23b67d857f1af6ac981c320db70cdbb6be41bbca60bb7a159ee1c85cb82e0a220064359c06c660b75de6b49839eea68c80283b75d9d627aa4500c0c0f21edafe4a2cf7ee079d5310479da06ba58b142614fe69cb236c51447d63db31cdff91485b46325c26d40dc6d608d46a5e2fb01df06064a022ddf6d5cce0147d5b2a5aba5f9fadc5e778010a924e00a13e21daeea2cd330f45536ef4f42c2e77be00bb53b3f9a93d3eb327dbf30baccee5d26849cfad654ff3ef2b035b78dd3ef42de3302e5514551a968a205b823dffb040ac9452ae3efb43219b02436d0761ca11470405510e534d56caeaacc40eaf9c47a39475adad266f5ddc813e71223800dd46fa7c02b078353f870049806ed7ba57b40b7c3c6272296667500c4b97dd2d7026698b6bc4985bc01be99e0097013a2632c71740888ffaf902a02bf644b38cf9a42528880d9dd142de967cc2ad3e1f1737f0cb8dc5c59c252496e8cfe4e53c82f4a28d9ba2bfa62b6415ba3e5e09040d7f3e3abfeba53e46575e8817ac5eca806ec8a84c7cf77c9fa86c9dd2940f5b96b25a92d4a8f894d4717c8f80a62a35a51d8511f1e822fd79e6fc27cc3f3097d9e3272447de6f223971657ded9e660ee4f8836359742ce7616fd0ca2de6656c71b212b34b8edc71ff36bc84ac4af58eb1adcba4b2c0cb31468dbd2c2b7ee6752981ee1d152c4e4a9b25b2ce87796820def34b662381806d2e4fc77f0b69d7a87de43d94d62a6a6526a7f8c588392890e96f9c51bb58b4f438eb5d197477ce9b160d1c898c89ab408b3c1d648be93b531a5bb4988592c5a8999ae3acbe586d947fe6dd507cddb92dff4974ae17ab99aad5aec9d07b96bd29489876f51afa67570e86b69321d9e565d86001514638403f86666dbf93f18e0a62bf65db333bb85a3ae12d8411aa3c2a423a29bacbbfeebb8a5bafd90436bfded16f992232360211086a3084d9fd1980dd96631820a2cf25c3ac5c19d164cf5ab9a852399491962100ca4fd640146b7ea5460b4fb9e46bf8d23d508a4eeb8a3e9fad8249ece3648c2ec7705a7414eb8e8d602549204cb437f589161fe40de1447d14efa4d738b775d0333526c845cef5ffcbaf5c957df1d8022176b56eeb198e7ad2dfc3d7ea46b125ed432cd04c77efc011a2dad8573345080d7c3cdf5cc160fbc86c4ee1959ee1b8258056b0f3d9343c22dbb2f7858c5f162f08cffdca1acc866aa68e5f1c00b74f66544e8a61e429335adf6f73e32fa87e48e1adf15bb6c7aeacc93713dbc31cdccc9b0e52f922842679494039c395cc1d95eb97ae4df3bb8aba9a2584d97a236f87cb22f00c0a078b045044a5c456e22b2b94a76a559de2672c880660f9785b76bcc2aaed780e05212415c6e73880ca110654ed155a1004af45d5f15ae8e5bfd4817440c5d3d5589eea2c6c344ca0d85d91460638b37f877ea4cbbed35ea75678ef2335a5922cc8541987cc256c8f58045028d33a1c4899cc32265c619ac782ff998a478996be6a0c5b102a664831b395a884f18e77885d860d6b236c52a8066d2ced25432bce79a31b23117f405ef4ebdf3517de98d288f8c3baf04b63b6817c46c14b646308e9f97170b7dbbf9d1a36480338d8eb7466df56feb6baef42cba75512954fd7e33961d247b7393726e46c6e94e156d5776a89ad3e288554470ca0bc4cf4d2d2b0c01ae4fcafcb65ccd6ead03df1d4d6577bb", - }, - { - "228eabb5ad8b4ff13b10d13b27372bc2152dff149859ba47d9c89b741d4a5340d8fff5858a4576c55547007d7e2b3f94583ea8f0976237712bd2e5481c3988f5387e7ac2c3f18718388795b7b2d44b0a13f3faaa55311b800301c9203a511572cf8f349280bbabb9424070f415bbfe28aef8d20329ee842cef4d4c299e619b6ef1cf00718aab2accec9ac00155be2903b6fb07dfe98b0bd8d8580176b99ce4aa6be51cf59046c17ce1817d363fa63af5a241d48bcce064a438651af102ff9c6de4b86374fe24f1dfa66e16e51550dbb791af425d8fa601c70c1bb90e1a557bfe0dde730b0364eba9d2018ee751699ee219e13fa8874070935b29a1767e1d748bfbe796fe4b81a71e823605d39fa4b5b885f4610c34d1a090fa4106785e7a035a629958ad1b00cb9d36d171d575268efa1bef064fc0a6dfbae8e532466035a0c2cef96fe9f93b872f0cf804811e927b39818189412868fb104e2d56ae62f77031f0df1ae91aa11826991ca7b8af22f130a47a72cce36ddc319b32dffd294f2e192e490249ea1a6f8437173ce6392d16dda888a98bf685bc91b89b8ee1eabdfb1806fd61f018d1744fe8b03521de4bff86d4a811ca2ecd5be668e9c752a6c26aacc0cc9dd89d112785c25ca6a0a7a5267b4e37457c04a0626c8a29be30ec28ddacf47a84918bab164d07bdedae62132ab04a6f2c4e108eba9ab878caa4a1a7509521d427ad7f3dfa86fae8345dfb5e0d46ce3a94dec84f7880c7422468ea74fe0b4825b8c762b34d5d9b82ba96e0c7dcae01718ccac0044a87476ff031e3ee3c2c13f5f375a841d243c38cd9a354b6525527de1fe7e36a6e2ad95e5bbc4c97e85f8cdcd5341da777e03451838807d5dd2eb4fd15976783c140e21cfc2eb3e58e40c16374de0aecbe3e3d41c64417a472cba18762080a2348ec3f441bf229a932ea0ca7c816938655d0c81b14dfbf86aa600d0c68172fb0046ef51f601ec89309d43ad1eacd583f9d205bb1ff1a37a97b44b5e35be4945f52897eb2a74645b01a7f82054cda44e9fa9f9af9bad1a235155718713bacd08d354f3fdd95858db0040fb551e9f93ae399d5dc53a67e88bcd5a02d104dfd9d824cdd5fe262ed9266fc47b7e640f2c9d9c7a62c6d24b429fa55560aa254a824a0858482e771144d6d5b05539cf71d75bec3a22be75655e1ababec4dff9472a019f6220067374dd49252282e4945a407084633ef9c88d14833bd95335107d36afdf56a642cb739bf0a61ed53a6915baed78e9d74166ebc492b517c7c594fe6564550bb7108f43012551e65fbafc0a9874e46fb64b5b7aee0082a5d617a43b8bf9473309c6761aebc7f13b72ed460b522a6b0875b67353c705f99d1d9dc899870fcc90c632aba1fa9ced6d7a2368dc4dd3d4b38a5807415e00de6b9ea70525a6c1b67d04521efeeefc6c591fc5256d990a1123522864a029430bb7ea00dd80d283fdd6d61cc5b509221e28f73386803d97a38fb0182fd95b3b91353c6eb60ef2b3d5c8c0ab8dc9cd9be2b4cf69450d00e88cb0f0bc9a4be82b71148a37237ceaf945ab94c365625f58171eb15c1bb244a87335550d813d28f241a3296520046e65aff3291555786d7c871ec8a2d10d4b44429041c3cd6ab60f0def742de3d28393c5aca92b150697ac15504ee66d8a2aa01a6c63d7c719d6d4f94af2ed1d8670e3231a0e481095e425e6231c43ad36e3b7a3478f6a61563f5aa13237beb8a891dbb29013c325f7f91c1b055fb83c436fdf8aef49ec457946e6ab7e955427373fd9c743acfd4b9609569b591ec79c7ea7276de103a35a4a8a05c91f59e04689ba1ddd570b18ed046f785d7e4ff9fce7115ac814fe126f781828877208ddfbb2ebc919e6d1f6eb417f38bfbf22ac9633f75e58e560b85d88d0e4fad9b2e68c9ebf9675819d50c30c8982bbbc2f41e02690390bf0e16979b24e648bf15b18800aaef58c3c465f38cfd1e47bf1266c17b69523b7868d2138cb95c4bce0dd3ceb7c2267b868b6e12888d5a489fc0091b295b56a1c328b54fe1119aaf1e6d7dd52fa450b52fbfc8b84c2200ebe209060b655cad288562786673121691809366af37b76567762d1fc24f1fad3128b43c8d10e9b6954b2efcbe40124fc0a5b670dd6dd544e30263a551825282aa06be3817a8eeacf31ca8b25cba011d60b78d3d2462810764e4acb566ff371005f5481c9d36c991527143af2c44cc8cfc59c920bb4a281f2ed4d494d30ba4d900edf59e23be2f763072255cb6f1e8b24ab1d305fbfb2429cff8bda303617c034e71a17230d0e860420dbcf9fea4ab48557e4d50797179496936ec6c97686fe6d9115809e14069244d251d4bc9c8931e47e06ec051e709ba1df526b55d959b37a6f3408833aaac80cfc9cb99915eb7d83e26998f0da2492b986fe0f5047b2cab6e6d33a117df21e6a8ec7f394a3712885dab176a4d6095e5cf75dbd3f0077e5e74b1ff8b902072380cf172562884de852ff5f07c55856224fb3df8eb44764ab9284944b86ab6f176a863cdd0e7ab5616a14692f6cbf41bc63113b27689fc2fb145736aaf2a5b26d2bef3a2a59ef8bb3f3e4d360a4251d0736482e9ed7e189fc48c0973b6649988228c2ac72b23826a61cfa06b11f13c8555be6e433d87e20113eb74c94f0e51719a7b38c59eba300089d06b9bc2a72017668e5aa3153ca4282718f1762642e7c1be1f865cd9b65c6387c8fe496f1e60d5acbb78c2f71cea1f35dc955b1e7d1cdc9ca339765995d9e05dd729cdf58aa2a1451b633c374e5b6c2af1c8486ee4250a875e80e1f359c15130eb1e2575c0c7badb2af61378527fa24347ebb12c10bbb36e3c94619556b2c641d0ebb691b2706cdd667f55b8fff8fb46e3ac72f3682661a4bac2391075ff5145eb07d69d77437adec2d096c1c89208ab3e7a9ea6a0ff4a5bc1846b3683bd7c6ec4520c3c95861a5856b0191e4221c9819c67273c66729728f6035e79c0dae8842df4c0c27ada1ad18b34efcd55b94ef120762e87e8c5afdec80d5788e83f0d1533cdd7aea8f27f33266e007b274f6d48c59bcfad607e8b298be2b17322be88558c60033452826778f167f318b660607bfb2f285cadb385399636acb8f5350d819511b5e7931c5f8483529d3ab3fdb5ae2dde0ada918f1327c6c0dfbbf5ed3c8afef171910dd0169022b3cad5b08084dd5e8eb8ef1ecb17e48bf69f80e3db0ae1cc7b73d94b89696e3c3443ecb4c7ca12568201744d1858d90ff759f2d264d49edf47772bd0e0990c14dcf8c8a4c2dafa44dc6e92f4c66b03bdc4f68f28ca2d0811a433e184cced99a8e5614ca83c46ec18b47e0c7ae91037ae06c6d6d0f3dee19711c21cddafb5869416d23c5219296acda7774891877f3f8d46155d39f43ed10500ede3afa26943b83b800b54a9752250ec6ae173e920002f365d692a9b3a2f9b27124ac97b8e81b70e8c0bb7022d07ee97e962810962b03fc019695b5399f77aab414327cfc5dedd51e99453179c42ae85a42f8e06e0cec6f937224dd019c77c5a0ba32ad08107216a9c758138b730bd5b5f4b613f192839514a8621634d9dbd5840e728c1ef4a2c8bbfadc376dd80d13dcb327ce55ab536a43b570789f5c5e135ac0af79b54232613d0e989ae695aeb358c671ae71d508b58a793e19c58c3d204cdc9a021ecc634bcb0bd6a1917554ea3bd688adab8163260a914fc01d7ce05a497a5c5836cf9401cb6aa35cd008470bdecfb97a511c905badd01bbb4d0c05867661debd2162beeccd52399d5a70a929405293916f33ed0d03f8b850f4bdd77b1fb6283118d71de629577383c81cad086f4099ce7476cb787f73c96431a0df4156f7826fce9045f7e7c97bbfd618b845595203cdc8df4638430fac74a07bc5f773486731d8ad29c06695704cbe2882077a85d543551b7ba81b181ccb93d2b3071b1a38f3c762b42df8246aa64cecbdc772830ac79e766fa99e8c65225f28297a32526df9b51227bd368253737f013ae18435a912bc18cc4a95216ce449865e8bd8bc759dce9d4af52f9e789eafa37023e91946952202dfb7243cab7db2f9f98bb66f19750c547a2bf2e2ba92862ab66f33fcf465ffc41d23f0b891a3b28b3f68ea48dde6ad4802902abd22b0d7d9101bd61471c5d88ee9d9477b7cf9f6ac52e0f520c79278da22938745446f1e647ae478ecba416b941aa31f979d0633efe72910bebb8988de1d0013616f31c5da163eb6c07022649ac57422627a5642618f53103adc9918f9992c5b085e10d2744f9934bfbb994a710d6cd387c325e94278f97d5582864f1bb29a1400aaf674ea8fb99a3b42e4ac50418fd804a5b1471eaac4642d4aa338fd3d5d0dd84372b2c32c5cfe7f319acf731a9787b048cedee3833300dde639cb1386c8fbca4bae8d67fb7bd72d1696a0212e27e166e6b04a79e34b47c98502ed0bdbd8d61777537f72df569fe5ed30071b57e8724e98ccb88c07f0458cf32298cefb6ed672b255e581ac756789b57e950d57174bffd3f47bdbe4b168e7e3f1a6df508d4202d327947facfbf9526a9e5fc1a5abb179902d4584deae6cb2900391e080d3f3540b87c3a873ccfaee5b4aaff0e6516a867ea00b4d5e680fee6b91defc65c240614a1409bdd0f49c2c4f3c1d258d77abfc17a749660f49547adb236730e5a7a22fbbabdd8ca079a8efa5b605332db12f455868ab67a1ffd27d1339bdf8d150189cfbf6199c6fc27c05788138a63267eb8ac086e27286b4ef99ee9d92cfedab5ce9916675f128f206a1733f47a597232067aa12da20c7b9cab6575d7634f8c31e9a29948b528681f3f9c13b9f585ebfbff8c28a299a43e4409b31b6c02a79eeb493734fe5f9c1d9e3830572eb54229b5cf525768f695acff48c76b4a6e0936b7406ab69f06d33d3f04946db9d7966ea6e8c50ede5abadda28149edef5223a6938d5c32933070d234043feddbd65c81be218f9d7c497a1ecac30bb9162e60a9bbbcdb4fec4b212050610e2b376aadf58b3c9207860d2650d0310ae6606a8f1b266b6a13b68c3306ed413224abdf19371bac3ea1b964f28996fc70f666ff118c6a7c9f2108d327f5145919c03832f754de35f5979ae72130e39126499037d6fbb3751cbb4843b05d9dc91dd5fc1429da491f72e3069313ea243933b47109af247fcbe0c70f9024ac5a41815655ab309fcaa282d03596ba59cfee0e40f7bd657689453e98d562442fa4c585f970b6983a581b0b8eb1c5e780b3f5c1abb326213c6b5fd440c2187066ddf55f4eabf88804139392c45979440c6f05b7222bd95e963832d7fa4a4760273cc075e8b8feeccb917e8feaf7d3f766d9ae880487e69bc01872ba62b91b8af5dbffdd93fdc95e8f47ed793fc070a5991f2e9ea61439662dab218f643c1959171937aa160008a548f51f87b58f2c4fae5aed556f26bb9cd1dc2b3518458e2f5ec5d974c6e11a0ed639958cc8c1db771cc8cc8bee8727bf6452f47c9782acf548856a0e67841c3dbdb1c98572a4fc8e6cc8195a504019b4930d302a90dc20d8628ae6c90e0206cbb3d05025744db4e115cd3b650e5519a1624acbf226ebca8875b05183b2584e65289f8b9cec3f7d010cb9671a0e80bb70ca8763f1722d79e8decb6b9023baf64b5981e745c06546cc1e", - "ade72c2ea29cf829ffe99c2d63840b2eef9b51a9919c02128347d2e88e9f063b86326928cf6252ce4beefbae7206dc61a22d0b33c90d464d551835e3b73c1e3d6e88663deab80c35a607e4180ec079b0ee84e3b7922904e7423acaf976e837", - "43348cf32211d7daa300de8a4218543c8e3c7373ad10950765c39760f80b733c", - "e4709d225a552e90fb357413", - "562050bfb40451f27b1181c389508550a0f46b53d14ca73143da9dae3d3d2b466e9618db39e3219675d2b6eadded7dd9c741d7c9bf3c5619a521189607acbcf6b3964d469d966fa134444aa06d80749c873f0f976e0c5efc5be8d00a2729f03eda6a7b8630575df8b3a19388ff88daf0d00bb3e7c35a525ded90a4511ce815fe6c8904406cf72d7bfa14ca533566f7b54268835285c5402e22a63f98b5d90c86dae0a76d65eacc1ba85b3f5a1499d5f3432dd5455fab9e8bfbd266e99283c2bddf9b556410956b2f061603d1fc91194766f90da841699ba7da3d53ed5abdd8e98034f8fe734446d92b458a731aa4c578552ec1ac5d1baaccc4153a67b48a290602d5f955d61a08436b27cfb0786a80afef76e1266310a42d90feeb3bcc40ae5c4506432dcc92f7e5758ceaf277255401f5c5f4b10df93a249e38edd9effe7bacdf7fecc451d3b2cea77c9bab0403450c41929775b8c0ace46f6928f4d9cf3adf86832d298ea32b236d3201464e2ff506ef01da0e1e389e26e2b3ddc553b369b48d1aa5dd43edd5cab065e276aeff72a4c43206063fc7eea3bcc783ba2221f5b615a7a43a75cecda6bca5aa159e9208bf66af61e2e465c2daee630c4c62077ea6ef0e8b4b4e272d4e93a5f5284f9da463e1a60f815a8a31698ecdc09dff2b62f00e37aea5fd4b07a110cef27e12466c1814d3b10017cb9b8e12f2f38f10cbe31296de2570d5662b16639fcdc05db81e0d48178d055ef873501148d00903ec771400fa4873c5579dc3265028f531538f6dab1e5607a15c8b90cbfa4835107cba6f453bbdc71d08c7e423f58b44be38a9c8a610469f2551ee6177edf639cde35fe8e02f76b7ed106d691a876a4fda3b42d8ace3e0d3d4e026206c5d7d4d56fdda9dcd30fd7b74217fab3c617903f1aeffb8363443ed128af94c391810e327704d6f655e57dece97658d41e074029823850ddf7c5937af41c64465046d8544bba65c691ac69121bd272107f7eef8cfdb6a25da5da16d1033cede09129d51f6abfe63905a6fba9a64d7832fa35825447150595a60163af848eea878fb31a5fb97b1859efbfcc8586eebce8cfe64386461a9b88aa5efc1db43c64dfd5d4a45aa74803fd178f9e16a3f59acfb6e13a564d645cedd73890d0a82fb6dffeef527694a7cf2a89aed9750c3675a67505bff77de8d046087bd39a85c90aedb085e99baf04c7e3bf92e350b332da1b8af85550a00d68904ca426da61add864496d6ff442bb0b848e9aa463bb0c2085cff1a83a47d6f702bd184cfb5c139752754c8978d27b58d364bd88722b9097ee3a6ae28eabb14ca7c31e40461101e92448dbbc63b55cfe56efd078d0058c5e6146c73bcd949c4b3ec9f881b9a5f7b41ca83301261e0c674f2d35d96761baa00ce0675c082bf73dc52dc726a3e605067569a372d2bb47fc8fe1e74f00078ce6f352a6d9d97fd2834670ba3a45aa6751eafc7ed6694e1e07542860c8ea516f296ee901a3ee16b00b40419c74bf6db12c7230325e85a918f412bc2f6469c1a13a5aa77f028e327749efd05b91053f49d9f1edf49aa552c58c68257233a168db60ac55b4086ddaea275b078869cda7b69493c4b371b4e9c8361357a7ac7d3d3bbb464c960addfa8df2b208b21b090d540c440241598212d33273203d484e0930e22469c2a8e866579a4a2b3db8f8344dbf8baa1b97be0c4d976f6aaf14cc09ec52630139b894b2b6f4dad3a205a7b286253f1522b1d6e43bfa37beaf06f831c6f0945cefb2593b9b298da13b0d910582086c5d7e256ed4067bfb476dbe01bcddb437d46ba716d6ace2ff9912c8e460ad33ab3d8f97b7b08dd4ba9e01968d1949ff85b4b9d5b8da291fc0f90ab1eab1d246f67d76092b7a37528ceb388dd76f8a8f0aabb7490f02a2c8bc6498cb26350d859c466dd611bf0ceb81a8b7899c67742c22697ccee21c4963acb003d15c1a2078112bab05595917584e417db3872a0ff0a29138bbca7314449b19827525340370d7e48fdf9f7c6b4a280e78d00775a291081a5e78e7a00ff915015dd5af5f0a45690baba8b1b503bf85f326c23136f4424be4a559aed03fbc81400ac27a33dadb2155d1704950d98043dcd86df1eee78f3f266c4d14deb8126708f74b59aa15e8b497c6a52924a473f999aaf0abd3d148fee8503a1568efec7bfb0bd463402f563e4019cc9c9e1eb498aa54dcb659f43b86df0a34de4e51ec558bbbade3d69511d3fea2baf44f67e85ada7398d7f72ecadcd9e981f82b0743ed74bd33088ba4cbc85b0c99dc5382c599706dd2d51aa9f470c25a98e7e8248dec216a155495630662bf6ba0b7a4baa2cdad30e9ce3e1a65e3c23d69d5f946606ee8504dd70830aa5a8ddd84f10e064695469727d2efeb46186c9d3b7a170057636f05b9ec4c2de7d935fba504a1e7eddf7a5a95226b253b0b9eccec976ca3c57599850db40c27a51ae755c1f30d392467cb74e5c8235861d11d0f8461b0e1d84f5718d64ea92da62f4de184a6499dba473e82b3d197305de0e494f118a263237c7b4c0652327977edb427ccded35552c00a5804b9557ccf2bca2484d9da2c33f6c1bbf2c666ea10b4644a21e3905e5c4eb417ac3572e783428d23dd7222e75c356b99e8183d033034e29e618c90e66ec2f1e9fca47d82c1cffda8ad14c96045159d9437e91ecef41d24cff89009ff57e18c1a422860aa9cd31dd2a85b07422c72a5decc614a9742e62a4988f394421b6918e51c2412d749bb53b1e8fed7b2ef0873ffe14fa77bc366bbd5fa1432be465f5e25266c6c12b55df1f19b1a491acfc5c9019f122c422243d751d8eaa8ff721397915171556e999b34425f7d3ad6f6c3323b8133b4618c65ac16cb5941edc979472734bdccafc73c08939c0b1e306ae3015faa9cfa09ed6560269a1dc54c2c046a12a178144f4381f7b6fd3fd2d28f778d444d9f7a0dae00ea96c6969b78ef326a962d23275f1518f0e6a2469440612f3710b53538fe99a6179471be8c5b2d682ab3e9a5126e41ed6de000cd9e92fec3974e0f4cb2d2245d03d6ee80d6a793b16efa829d75c796f34d4e918250f457703559bb48ff78f0896be1bda403b7f1fd6a319d68478ff70d88238f2b8afc7d20e51757bb9db3bffb35a8040fc0db913c4f03d48619af7fd24cb8986b3e139058be3cc253b3de9b3bb3f8dab7b8818638279b2e6a0c29cfe16fa7250d3c74362ffa07e2977cf562140fe28afba8f61d81f7c73bdd4a2faddb00752bb049d0a57d05c6475c7387e6716ee31974169930c9fd830cef138659cf56f2212de185186c3d683fc6b7fd36e7821f69d0de041a569765066dc4a1934870a7b80f174e8f9e484942e62404a42b21658467873865ef94fc262c231527f39e82dfec91215947b99567daf75c6a28073ee4e67d4307e4b35b46f85433abd9812f35438b34598ff3b6dbd60b60747ad64565391df45ac80b272d0141702ab807fa27c6a6ba2f42c3facfae0c773940cb2943bb1353b41298258bc0d07542b69483e17ab9ce709e4160b80a0968dae9af8fc7c0324c753ca4a11a6df32dfa79a87b445c988154bb3c503e6884cf6d8f5e062a16b4ff230fbda109a6127d35e3bf2b29bfd3b18ba275af773b1981d603300035e046ef023d51874aa105d136bfcc9c7323bd0513a6b2b397ffea71afb7a8d4695411d86164917099eef504f6cff3c5cefb88f23f56c4ae3e2b09a3f353fa55630f45f06c29e8912e8c3c4f493f25eda781680585580595bba43dca9cfd400d9eaf5081d2c6697da59e012dfd0b875336b88fe16609c2e9876737b9afb868ed52417ed0c6b359d582d585ff82d98edd4e63c6b65cf43d4f69eee2af4819157b8a433966953862d1ff2c6d0cba382644a1b0033ddb7be3d1fa9a204042d7b821b293bd659dca980c108ad1db740800b9bd2fc1a163f9b4066f7604f160a7910bd947cb48ce6c81e680fc6571ff0cd12a3ded9c8cd560970ca5cb480a70a8322d5072edcd257604eba8dcf55f9ec97ea2b14fdcc72fbf615131836fb14e42b8d7171d0a06d2fb3caec2e0759e86b0d8f21e312d9211ed7fe0b48669934ffb892baf1db9aa457c07820723e5446420334bf6479f2099e01ef8adf273adfdd9ed0b741931284515d69c211cc2efead8339e450b13be71b35c36c1f00c2b8ed0cfa9792e422912e14b5b1455ef6abdbbec0035480c6cb69d21321d12ee19d528dd48f43b142cf0502eae5304ce52b7fb827552db9ab885b93e83d56a33346135aef11b7e48efca7cd52e2499a7edab0bd0562862187ff4599b2446bff11c37181092fbb05d0e05220ca6bc37f529d6599e8c29acb9f25616c27df291d4fb07430188e6470df7002f73cfe5fe6907dab0b4f90bb58130fe90241c29c6063a22c9f45d032b282eb92c93736692bd5cbde2a17552e942b595b08e6ba0c91a03b9079e9117fbba8f26ce6c5d0500c69bb6e22e3562a50baece49109c2d42b6714250665afd0f0a7e951182012f21aef4b917cd434d9ca22661437608e32666497516be34652500def6c28ef8f56f2273de5416142ce9606faf7df92ab779ed6aa74cb99bb1bfe758ffd344e1d31f479807326d1a7b98f6811e275545d69198707b0fbf027dc6a5e4815d62ef191535569a452c27c4e25ecf139df949d70dd5935bddc04f33b2f0bcf5073c51fc51c15067963a20569b5659f0e7413b347d6d5ee38a92b7e6e656c199149f07ebafe5281db6b1b2ecd9e0384b6f5a8e27ecea9a0249c61b16564964054f5f9621471a98de132e102f518c1419829e2ae2c8c5fffd1270f0a0b33a383437b0034783d50bce8bd7420c059d16364eecbd55b6ac8df8a70382734d8127f4f5895cc9e508b13c000ea053ab59b87ee639745418ffc566ceebad37a17b842d24d3423ac3f086142c622eceaadc4106f8c90c5dae1f52f407fa0bf1e6bf9385cbcbf3b61006ea3b1e66b693ce704577ca9598587f41e05d36d1de424e0e51290a5f2e2f99f1960c0253a046a49b19eef249ca2dda2af1e8dd78411088eff1e9c23c31bd20abd4fc9e7eab19500827d202f76270fe9f90e95309516343e0fca48e5a12182e91c78ebf2cdd4644629afdc90bbccb77546cd765135910ba1cd8a3e3c00fa77e585865e898bfecd06c01a0a4d7be483801099c61941c4967154af5620b171b426cf229df59d2944ba50754140c3f305c16956953be376fe6e7cf31a2e9c276bb09cc24c4b86b2b26f039b0d8511853adcb7feb8502e7641a34e3242bf2c538006bb1983345ec3cacbf219ef10efc1681d52e6e1b1c60bb556b6b8a63d1d1f6869077841d1b816f3165a35833e33d39a8c6e62a2f7c482c395768fc6a0e3cbfc7a1a6d64da53adad66c8016f76eaa73df1b8ef83012ecbe75c92a8e39b48169433f951a539b28a034d5fdd00639a5e3e17ef14dafe869064d130c90c68be4d5ceddabed1bc94e97e2cdf7313f780cd6e175a9e3eba3eaed896fe464073fcf07ae7b5bd41d58c3160f66ac95a76fdaa7a8cbaebb304fe3c8f03cef927a1182ac2281c3b32378813b24bb99e42cb0774331ad78b74d46b8ce48bbf4ef8431a82d4240edfd61b910c38570ba0bfbd4a41665117e6d5f5a97908462e62d0b76160d06aa56cc6e17aaf4607ba8263648f2a0077e306c25486f5f39a75", - }, - { - "2f6210063cb3071b3d49339185c2cef8357b08ca826d8d1acd852540c16540f1c850f70404fe1f414853d3cd15a1c64a1cce149e3ca1b80926de4ae8438ad90bdad010decf2f201782f3e49794aae1b079f54eb59607bebde508a528927e346d4e444b1d736b34f65e198df2c36fa23c64f1f1fbf8b0b8ddb85d054bdb39b8297d0347f16f7be7cd9474c058e36294485386434b36fb28ee582e393367f15ce5f5a3d6641fbd31b331f10b1554a05da726a0f35c9b1b4af3498426b17582966a266cce452900f85af1046f45a4ccedca6ce02607fb70fa45f420f66aa38cd4c9f8a30e21a3067b940aebdaaeb7c77824a79e2ba20f26e70346dd6de96942b261e5c08288c7fe1cd1e9f680a0bdf8c46497f007a616eea95ccc17463559f8973eb919c68017e25100d9d1a196ca65fb615502076bf0b0c8bcc70ef22006895ebfa2243fba0791bae0625b762cc1718d1673948264454a200c58122d5e9b8b1e3eb05df8b7eeb297510e0d7dcf7f0be5f29f6756e4b177f109891e6825a9866359e35b10d20da7231bb5a0ea34abd0264b377d2fe9f420f27d3e5aa2e8e00541c46052966ef9b989ae5974e2054409507b867f647aa057f7deb19ac6929f0856005aec6e53a5f702fe6be403afed532b73d38fed73e6e551987f182a1e20801e7a6c8ccd1184cf0fefb4139fa166ca15395902ac40e7fed8661602853682a3b0ee307dffb44d0ea3012142a2880cb7c166ba6ea6a16c7e0882808db8023068f060e5ef1432fdb8331ffad6a7078d686d47d613e94291f1c4117e7c13aee4030fcaf223fcefdb300ed606b5dd931e4adbf45dc437eeb5fbff337812e15c15f026071423f6ef5305c559baa2ecd8ecc7cd498b043740ff3673774855d45d45fa64591d5b4970600ec91ab1b6f39d7dc0e709c41e49c355bd3b9d120ffb57095fb127bafa971a086135b917285794e83e9dac5ce76fb1a4aa4fb6b94a0dc3a9beea64b8817ec1e2b37af9dbd18ec30f2b6f6c12df1db6896c6c43b67a066038f0c4f17142b254f62c4dd1fedb950d07047919e397d06d033cb0bab6b61aefa6dee01720926b16beb9e8bc947dca9b8143b565da85d2dec182987838b267de9047f5b0d961c7971aaf54ae2c1e4aad61ff123c84e41a4566b2bd9e64247cf46b72a444d36bdced1a309b464ee5f4afe406eb68eb05ae51b76bf01b906c0ffbdeb440b11f1c9e3a4c3a809a1f7449047b356c663a1ab7f286a70d16141d11f2d151a4f06d422ab97cab539c1f9da09ad20c000c27b8fead5f0cc37329d466fa260aea934c154dc9c0a065df3d057a0f117a1c38321ae59226a8054f7d6b49a3753436c249838b0924f0e861f5627106dd8d3f0fa724a1cecda71d4a1267ed889b234ae4a7d5edcbc5d52cba389dc0152aff24d224c6a0f16dbd3b7f242807bf4b51a3f22690bdeb66eaa59e8766b3b265d784899d247a0ae1b58a06dd91c529e3691b09f9d9f55fc39afd4a00b0fc668880ef25a46a30861fba8cfd4b51262eba4138b41a2d13ddc71128c8c1242e49a51d6f49879fcfa7595ba4a4adcad3670b0b1b26382f03ff402bc70150f54bf513ba3e9a590e41b269e55616af297ebb3499e16cc8e46c0810330a602955553c0f93d668a1181a0bfd7021ad9a9f68ce39493b012da70a3dda149d0369f23f788616e0272efa322b6a54d804f340d32c890e2eb7b538f48f4c9293b584d22d0ae80d321607644271b81a76ac5b49d8e457069b0c3e909b8a222e3fa6016cb1e979e300804742f2005c68acb7b1849c088b3714c9c7af54e9de9390df0041c87924c8fa6b0aec6b6754171e059cba0d27f221f0b9d044a3aed8338dd8745651981e4b0329376f908b86ae9022699d495bbe3a148f7eb73d56eacb2e5e2180f63fcbfa680369f88eefa71f1210bc5b6b7b957f0a1437476a2112998033197673e470dbe7d9d476c97b95db8b5136f6cccc75d6e0ac1e4ace30e34e64fcc4d7e135b2c80e863ed701d3b28c25e982f1b5f8c895a4e6df7216c3c07abf8551a0ba0469c88aa7a08c7b5218a03b9b91f0935985373f65aa56286ad0e7ef2288a926f172b098123c136455b3a0f04590839e16bade7b6434a3cf048abe2612684c03dafd9cec39af508e63f07ea881014697bc24122058b5ef5d3fae835216d055f0cdf1dc06a12c95041d13ac9e15f235d11747f16ffce1cc3b8f508da520e395edd471f3759d8879ba9c2558b1188d822fd4739ed0546b0ce3bb9988db7c1dc8518ebbc62c4440e6e0653f917dcc13aca1864b71dbb67dbe7117474c936414e4f3cfab1f13eb05f3504484ce11977ab21ec523f97ba1b7ecb8fe384b634c30561cdb752fc67a2316bfa7e4d03f5f825d24a556a0460d8cfe0cc54a6f117ac52d553a5d1bb48031732716436675c5c3996b1939b127c6b0338bfaa29c7467cac9a127e455a715c9ce2b0c35a0d2f83a3d1273ee39399e6cc4980e610c752bd51652b96bf9cf34c7fa41fc9b13f5d55007483e4082ddac4675baa7822fd257452411b01de0e5e5da26e17539d64a89dd93c71d15a4c95b1a83039cb2d5f3f7fa04a817e48dfcbfb3de34ecb47f7592123caf27e17982fbfc8597af5b8aa6558f4e6c73db69328e47677afbe6ef8df82c3d1f0db6a108b2279f61822908d7b856432c32ac5ec0f3c53befab2a7ca356b9c2636f646b228b0a830d348be4ece2271814d477d4c73c0fb6e83a338b90ec4ef45cb25f7e3d6a014a9e8d2e8a6f55a383291a57f15667a73ea1daca31c7182523ca85a107efa2518d2f7f179ed4ba21fed479ef2be09669817133b2384bd85b155dfc1c4c9e6dd9ceecf06cc1ab8ebf7f07aeaae7441468b5471aed93f248a84f44c59be33274b11f651de010ab9f8fb24d3a99914e0147951c34280e7dd15ec196f9a4c86e55e7d373c7e31e6672d1b3ac6a45fa6c8c9088c0b8963d89f4ff1feea3e85cf9cf2f6c97128afd845bb131c6f62b3282bbba42745080fd457f1d3322058f1bd4be876bd01269546d1a853310b165926c1fd4e07054deb5d3fbe8f6007711d435994005aba95918c3df4cd390b165fcd139dd418ebbf661b6de57b655698a8a02ca8fad73e8c536c7110957c36e5494a831d536eccb97a2a9ef58fe58e2885aad170720ffcc57c7de601ea1cf723577a30aad8fd544317e33897c8b6c04e5191bec391ab990e197f10038c0726d371677e4a54c28d7ca5c6046e7cc4acde565b91f7f72af6109a0614160d3ae97e9257b8f71a4663b00c681e793cbb478306e97b0e04711eae7722b4845dadf2fff5bbe71ff24acffea2ee67df99bf62a098ddae9d4ebd3bc5dff04a2d9e3d1d83e8f493db3f63c9e24231b1dbe1147c79f21b0730c842f6983330c5c17dd34556d7e932074cfbe98f2dab5b0ebfd778a1e28fe2bac2d942f61a08b787ebfcdeb3d600bb130ca4922a4ffd38ffc4a1a1a7218451e45da4da67ad81ef898ece3d54cef877cb9d09f5dcf72eccbbc06e62f1e2b4d64059b0a807329780b155ce1614b68de04387d6108ef4dd3ab54b9da72e528d6eac3e16a360ae3421f3f23808a8b5e8ec3dbefcbca3c9f76905850033d78d9283bba9272c475b4e3b4d7643e62c2cc259ebbf168f890de88e82f8b26a7654ee31fe055e45609c70ae02b4942ee15678cd158f4c9e8d351d102ddf7a942458c6125e1457bea0d86ca38cf0c26e474b2b5cca77eb57ad0867cad7d25efc2b250e79396637ea3e948dbb855029cc9b452955bd04ad5a0d0514d4d773c0f298df7bc235a3ac64383a1fbd8a397a158e936b3ba81895a51daa89f51e4ae7a71a53794ff715a42f4fc3dcc9fd56df7bea4ab782534d3760e7b15605fc4dad16911656983c0ab77bce9445bbeb1537c55fef57a32c8f1404306a0a2ca7b73348cd99d0f9948875531cbb0ef7c036cd201614c33293d746c44140e0e8f82421c5bdf2bf428b249597df949fafdb5ccfe1618323f56a6ab9abab9a84a3beb6696ca918af244d34cc1cd95bbca4a87c860a0fa9ff6a04a905b0338a53f230bd5ee9c60e0e0332ca200c15dca0be5936b858d0a7b2e540b8958432e9767396c55d5cc35b60062580023b5cb2f9a5e9a1feba59a19f9a5a251e9d0e8500955a5df21da95213ced2260a2ed8f3d4b295c36cef750c89cf21985c302d5cc577aab7855409a912dbcf1d0a9800df4aa692a78607a40fd6d5a82305c58fcb3d2a82b27e8c5b91681aae62a2bf31ed55c494dbdc38eba30e83c6044945df76705228eede8470369f2e9941ddcb2f239fb3ff6bfcdb0efb5ec50f981adf0e8b213769ffbbea364b08cf8cd69abbfa2a6fe9865cc48558134a57bb5526b9d047e14a379d246de82d3d64f3c810ede280c768dd8bee25af287d5a8d94045ddbf5981382bc716ad9aedfcd66e0ab496172a24efe80649db8e1e83675fc8451e22c6564d8d6dfb285af7fec802b35f19dd8308c68952a11770247fcfecc4ed0e8a445c17b1573f0b4e3ed350f13269ceb572943fc435563459d5044699f1542335b03be6077af156b8c5a6a9f71078ad820cec4642427a9b187ee1b17036d5a5e6108cee8a7d444342eaec3afa64e77c71d3c2b3153d4e2dbb30df2b66b4d14cc45d3a4eda7e911d697e5763e23ee05311a20626df55549b8533c6ebe79737abf472f9cff08bec590943bdeb819d3f923f45b81f9a0cba1f3f800a261842d10cb4cbdba456c7fe5f0abb4a8b58891d97cfd6b669e2708922f1934809d51a1589e5f12e3bb82c9ac3e7e44e3f6e6cd63d428da624fd2f46eec38ff798a90d228efe50c9b67c63796347c8a2b53478f27605999a03c8e1f18b70e92419f646a7f49670aa12d324751aec17d0208fc296955b3098241189af8172d39a6819415cafb107c1842b369f174d6f37dd31cd728dfd0ab10f93609006342b6e4d6ccbfd1ed2bea2fdf5411442b04b1fe218916f159b20242f80b535b4e0a3024c6eff6a40bd0d3db24e51f5ff9c14e1b4a650ca4170ee70f0a3a5a58349a7d0b7a63af86347351696870b95231f76d8c5c6a20736907726341dcbb76672871d18c2157c094b929fd29d34f5bcaacd82706f89a60000cd341d98eb830b73a12335b69f3e0131ded3ce12c98bbd960d2d0696d40696a13ab43925374498d868cd8f070c9039ea6407fc2d92b9c39fe7c935bbcfcc5c0980952fb7dac79042951f49a1af828b138a87401c4104bc28cdf1e39dbd3fa63dd4d5f5ae9d85f032a43ad353bc5e6746e5a76326ab1f4e79103116ce70bc0b459200f32f85e461291e347dda92e421778b849e37a3ecb0b31ec6818e828dd3148dc74313aba43cc9d8b9a36a9dc4e229488060eb6c109f8ad6201958adec6d3bb3b04e5e558a272d44cb98e18f7a0ad8fa6ac3667a62f150830aa930f6166baac6b9081b44304988fbe1698a5b746255de26bb5988aca90bb6523cad68a7572f615f4aa58f932d8a749615cf0a7724e99de042268ceb31433e6df0a61547d576a6201b36b348c028ded5f7e94d1cd2eafc141088ff42cb3dafbbe4c402b93aa9d955df8d9d9fb57c75ac65c2c837acc44bbd4d4aff1888aed46c73d625ad7fff035e8ca0fe411c73ed8135b6b8e17a039ec74e9de0d64cb442bf8a676c0a666f68f21066332cd921ae0ed766f0516a8e19b82cf98e78add0373737a3419e13aa902310c44feae5fdf8bc64e80dce772686a31f141bcce452041bf545b908ef4a2b000e7beaf378e2afdccbbcaa42e330e5024400cf2852d3444718", - "fd5008477b0855f6f2486fd4f74b9fb4f6e19726c6996bc66893183bd76054d5b05c1c2b64722256ba912ab2dcca66d2abfdf972966438fff7513acfb18ea461eac08c4e32aea4ed3fcf9f1c9905ee4402e7b6984bef974340d212f160b6524b76de99a98d3e96cc0d35e8a63ad7ea3cbea1d40a906c4dd03e5fc19e1513e9", - "390a5e75c9ff4ad38fb6205ff47f209294337c1f25ff54a3c01eee8e1e220257", - "8bf183347ec1ca4bceff3374", - "19fa2641519e21293094e9d767ee1237f9e0715dc57172794867c3bbe2cb647f9b28a8d3f85c0ff557b91bad66f5ea16e0107757b0277fdd3ca05bf47c19bcb92a958a57e8c142a51af29bddb20af84377b6db65f77494e0dc4d2634a776b3a5d777319873bc0dacbbd4b9ebccfae849fa7e9769cdf54660ecca0d5cf4fa5190713726d54d02b3a3f21857125b8a808c0ca2f99d11dc430ed5113ee49ff8f00bcc08f0370dd510e8100e1285659a7b2c7457a6049f2af7786c4db1471ce5bd164e11c7a2165e83e03a135ae2b3429f82f677de044a067e99e0bda2d65a7270d629c00e1d528212d3aeb2896e58ee5145a93ed06a9c00705ad5c5988d3a192304c1d17661d45257c5d16799ef70771964435b12e3b2ee9d5b467c3b1992f45b7a59871b40d8daa1c280747ecb3d170257b91df1f549ce6d66455b5b6f60b7c6e95c92a67e20cffe8599ceb183de53f1dedfe19bae836447af8e053ba419660e0912cad064d6125b9e978e8d0d5f28f8a4e43ca3cdf2d4c0e9a11221d8184e9eb6c90761b0beac82d0d22793279aedb1c7db3632adbee323bc3bbde4801152694831abf5676979af26af7dcbadfba1cad1306b635840cbca76c558b37db0803b4c12befa27d16f21506b07ade4a838d6beba1816eb29ed5e3c4f132a752fc747bd9ba879156e87e6c1584e911da9f796e1fa4a055e427272559e4bd6d0f54b8257100f8a55d84c27b702bb1fe2f995425c85fd48b0a0610db5b39f7a5031407a12dae9f508b21b1378f14952d1beb2dea81d016b2d9b7f1a67b814569b69c0e619adea02a8683242d63a11d3317d060e5b4d85df5ad73127541ba5314715d187990735aa81f438f8b94070ec506ba536274d98b766c1694e54367891a602b99e370425b47a70b819277a249fa429c5bbd0530267f987e6022f25030c30f3baeedc0d13c95f3d5e4b2b87465d179a3a23b9f9e76a42ceea55226ce072f9488392f40621289124d786109d2498e74fb37e2ef466fe8bf3016d96e34204c32978775765aa80461cac48518157f86d59f6187bad4ee62fba1ddbe166b29452f4a59af1e057300c353440644a8e40ae8171ea028be2fa315804abf518847c7945e8228b7766cfdb08d3a3116b59aab8e94b6d8c8c9ef442c2dc7f923bc2cd3e5c663baca7dded976bf191fe36da16948c89c385fe71434f4aa5dd15fe0e925d2459e3b068b9d82a9cc8b8f9786bd9f5fef9baaaf2d67027d9bfd58bb2c58ec7c746b747ab62f9242e4b53ed14d6fc75f5280eca0de23717c97a2293826e19cc8eb47f946421516c349dc4ba49225b91e4e868874bdebd373700df1f3792aaa140597e58b88f90e163397dbad3941705b53d754e3e0c9003df836a7fb8d23f40362fcb5f3947a4281b24240be4ee89aa8e917b194f94345eeca224df0adc15f22a617b6427f29410bc48ea3f92216163785723efc36301d23ed52780c6fd7924bcfaa03269b13582b7c7ea9c0e4a451f38a469fbdb585dcb7c81452da77945ebe27eb26ff6e8c7b2decea289aac5af74746dc257c9bea44a0847f02c4f586e1d76f39d5bf952355a0875f177a666d1d354ad86ce5ec0aba2c2b20cab050eaffd31095395132f5af80a2d2d53b77bda49f948bbb37bdf31c8a690476488e14e542ff6841e7fbfc2eb84795696562d079dc1612274b6dff362567084f793f0bc2dd8de23392d05aeeeeac6991c9f74387153a4b7da94790375e336a00c8293bad0fcef2dd1880e7094e2e53f738247c860780ebe308410ca02ae409ae720e841f48c9677acc6e7d4ccd18c219c400f8b7e1257f692e09eaef96802b17a1cb7d93eb81d3bfcbc7af4cdf05b98e22556b3d1a8b56d6d83bb5f5724696f8f329839dbe477483ec3c09fa2e0628faeba1bf285c224bea3f6cdc7bbd768133c6ef1da14f248cc3b819b196588811b073a7291817bd1e89c65760435d8d17cbf9423744a92143e0f956e2977b39c54fdead5a57f3a04a0facca01bbf44d3b1fb9c4fa83ae1046985e3f26aa0a437999004dd8adc04c5111759849f919b93558dbc559173a23b069b59f800096d9fcf077c7640f59170bb9a6fffe64778bac272365d27ea62aa956559e90edd3f6393cc8775597bcf7d91990ab9511973d948324a27261059e93f4b5dd2f70caf12e1a08e0493cb05588618764391f355379578cf94dd33e616136eea997ec11c0d4ff064ff51a767e5558433a2e3a9a74c232d8e187f47b8cca010709eb9fea0dac8f1ea53bf18822e154ecd929c83b0eac366e30fffbd5ba6a46d734f58d26e7f5df538e18b3d827884aa857a680823131bcf30a76f1a555bcabb17b02b53aefad96fe76f7312da69719434c580d3ff1bcdcd594e6375935003d5d732cc577e11ea2abb1d04259f50aed4c3af9866e8c4a52a09809046ee330f05c4403acbc297a9416c5208fadb31ed4eb7a3b01b87bf08c75cf44c2b0df84df30872d021d6567ea649859268e5e1b5b6405e1b41e350a32c1af13722959c17c01b52c42241313b26b25995a1c89a53e248488724d280647226195746901929501df36d1e94815d7fe6c4ca2731f3181293217f71b9d7f59c2474856972013924ae4796db4cbd22d8905a6043c959941ca6b556c53d1688c439036c715d33a47a7dfc2fe40e53424c5093020d2e85e4b04aa4c704ea5bfe5a2384878da38319c59d41d66b6add2a443d9ea11edd8d18fa41004251653857733b388b453943eb33df93dcd5d549757fa2967ef0f9a5105836c48826c47fcccb2d9bc349032b286962136b848632bdcf186a08cbeaa52d195efcfc3a440bac154971d11ff4994f293b14fb8c3214ebe7ab8b3d0f2fe0b03ed7b145fafd7730a173e3cc1847f0cdf2cf629f5ea81a07bef716b1a67dd9e3b7a52fea1aaa7a393f53b5bdb5988df78a57a9dad19a8253316835acab8a6b9a9fb42d97bf29b2443322f46de386fd82bd3453ed68e2370c6eac4497b1bde7b42d569c452f377bd38bd50fa5a6792ef5c9ec6c647001149b86fedb3e2f18d4271e9cc4801aa16ecddb31b6a795fecabc613bfbc8e4f5636d71e74595c841fd11b6a6bc7f169317c1added56b82a71fc36d774bb4d661685363e9da5fd2e1f357006dc5b5bbf8b42ee3f869e75a541586fba558a8f490d641b78c27368b9b4c2db046354e9358ae9140e91cd95ebeffc6c0d2676a3ff4ab10d463bf32bed97023a80a79df191ab9858c43537a03072a17c30b1bd99efbd361590ed6b7d5b0ec4e2326fa35904ab9a48596f44491cbbc0112890f9386ed04dec30126be359a05e99b2b77fa2c8f6b7460a6cd590d71c73b2a1b23312ff89306b6e41c76ddc0a099bfa79498e36ae5cf0c560b8854dff32d2b690ce0ac4aabfa723ac6f2e97ad1083235196b464ad67fdd649aec01695d55c8b4bb198f30630ca635aa5a1915f3718341bcfd8b522f764015fa5479004d28eceea7fe67df7ee24a97a9708d528b89589f1899f13242a0d00f7464c3cdfce213699340e754533b934f4a8410224e111f31cf8e54d7b5e90cd8c68bf96edbc8d183894deefdf4fcc1a83162a3f6341dcd9a9aecf171c0df28257a68b1af1b67c54c43c3cff27fed89cc64bc46e23a49ec74a9efbab7981d9f0a018247441e4f0f5b5f68ba9325582f92de4cca4a5f878a0c5c387581e64324e3246d8f3205c838a29f1abeea24446e496421f0e742d411adb55f70272ae4a992e825a3d327e44b8b3762b25aa451d07eb4eac0322b431fa676462632daba2aba7bdeee1b438f051d21d4b1897e2ac2f95ee7c23f9996a805de8fffb3b30b855cd6c5b84c011accf4bf94d304d944079f04b5cadf8fcd6751c22a0f9165ab98998b2d89e6514641f1f3b91b8c0bf057d69c3d893fc4e041e06a2229e2ee58082ffb58cb920972ede58483287d0ace94c1becef26a410b93e4ff402e61dcc574b790d49679f18f4e2004f8b7cc357faba34a80e56821bb5b883d1a8b49c6605002152f270bbc36bc79095644e29ab08cc988deda765d67e4fff12b726d5de135ff9d0cbd9d5f9d440e548836633b93a38330d638468b59a32642da3375cdf70b062d14b46a78569c24a706e179baa2058dcae5c61fb6cadd9e015b017f26e9dbe3e6366cf5f1ec839aa3bbb21dd6c9b8e910245fa95b09b7d6cbf08a4c6c84bef257a70389be962dad14d97a893c128b73bf6580689e540d004f21edf8403f36b1ad7c9a2e83ffceb141af59700c316c8c1e3347187f24819c2ff0c9f9a2360dce354f3374374eab1643d2d8831310a8e3ca6768200ea7759822b82f7027cd450479fcc7f6d04802b15735a137ad489f1e1ee78434a253a9dd16684ad58fc91960cde6754f82e8b38edd5e798fdbbbf8fc2e2380a4e21dd94f8c1c063b18f29d8cd8d89f65deac5640799d4ca2caa29c1e72ad8bc417490d11e4051d94956fbc74289857e5f8e9e87b9a2d83074a994de0b10bc7782f6650cfbdb8c835c81cd88bdce5f04ca939b3c5cd010d4dc5d51224fcacbca9851694b8bf55b22dead859d023eee5a7ad3436a912c3fc0284456d5d72ea5f1afa8545c856676ac2dd9a057028bd3ca0f50e7070fa74152f13997c95c1834c3e67504f1a4165d2b49a96919b88f72caed60f56ca7ab5a3204fb12ad3592c725fdebb048732fc189c7dfed185c6c184a626e07d7356860d00389862d5b9701eaa4e5f7889e6db0f54633369b8d26805c08471de8fc3f8fa1fb0b0711d9e015add5373f7f8b64abaddbac3399c756244b1b07c579d33e4967e5e0cf16de29cb8a7efad07ff9039ca305772a6e45c76bd9b77e24949556766a8b8425c5e595efb431bde4ee222f9eb3fc2d002a1e2d14db2b23135266c942eea33bffd30eb0218405373240e0cd3040436ca895093bf056fd001c00ba59d90502042e6e6c0167105051628895c8164c9ab959400898309cabafdef12be53604fa57df44e0a90a81bd63c331291a93bffefe809e80db0679568f6e94e0d8e2edec0087c35bcb3c4f4725e6013bcf197156cd9d90612423348123383e45c14d27d8833f56ddb04083c069fd6e282fe69c940840f5f747dfb72ad72fd8cf9f3ded15c9e2f4727fd60b4f40e95dbe77a89b47dde7d5326942600554905d9dade9d145ab6da802643f2081678392609c2fdd1b79dd8caec137cbed315374c6f05c0758070f3bb17e23d81ccc39c6aa89913897e487fde889c5aacd422278f8571641cc4f0a93d9768aef9e45d6bd187d1ba637ce0fbd3c573d6778cf7bf5188c00dcdf13be3fd599143952b376220283e34e014e83b214bd5f64eb0ecb098ae8bef883949907cc36e22ece60b893b963cfa73d120513e285aaf70ce5add34edbdac60b3aa7b385b90e339058fb9b3cf984b06f79788016035c5ce490f2de7995b98a8c1c9c80f29603ae2b7fc41886663163e604275cb085f8453b27f4d795b9bad19ade2f98a1c99b43a7581bd991e5d0e5e1a6e713acc522ba9fe8302658a9782558e35436e714ac6bc85ad1d3cd008f24106901fa954f5fefb61210d6f8dc9ff35c480f1d14e59c0e501917a31ee9d00c6bdb06a00af5a8b08c3928cc5f37476248223627cb77eaf0e96213cb0a13e97d3fe9b9814d462690e8d68d02655a32fc271ee73db4f88a33386ea88a5857e15a28d9b3e3a96f00c7cd85aa53f9282ab8c8ca6d6a8afed43aa87fe7fc1ad59b0f0db2dd25c20af96e8c282c19fc883ef01a4060398926a1c82f07bcd3bc314580d7636b623b7bad8ddba05850291a6344df0f346fa4a321a85ee3e9c", - }, - { - "67c6697351ff4aec29cdbaabf2fbe3467cc254f81be8e78d765a2e63339fc99a66320db73158a35a255d051758e95ed4abb2cdc69bb454110e827441213ddc8770e93ea141e1fc673e017e97eadc6b968f385c2aecb03bfb32af3c54ec18db5c021afe43fbfaaa3afb29d1e6053c7c9475d8be6189f95cbba8990f95b1ebf1b305eff700e9a13ae5ca0bcbd0484764bd1f231ea81c7b64c514735ac55e4b79633b706424119e09dcaad4acf21b10af3b33cde3504847155cbb6f2219ba9b7df50be11a1c7f23f829f8a41b13b5ca4ee8983238e0794d3d34bc5f4e77facb6c05ac86212baa1a55a2be70b5733b045cd33694b3afe2f0e49e4f321549fd824ea90870d4b28a2954489a0abcd50e18a844ac5bf38e4cd72d9b", - "0942e506c433afcda3847f2dad", - "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", - "129039b5572e8a7a8131f76a", - "588e1356fb8fa32410dad99cf7922aae47b4042502c92f3afe33dc22c1c2e90caf22bc37a254f8dd62a09582c70194f9616982639415178e9fe95740c0f1d497a69b69d4924a7a15290187f9c8acf09cf5b3b3188ecde2d2807207f5bb6a6d3504314b1b47684cf8ba8807eb9a3c497c79ebe1e4c1eca2aa90328563e201425227fca8ee05dcc05fd6c98128626c1e71d2fb3a21860567093db1012dfabe13055c48219d2a301c8a5a49033a811d8d9413bafbb2eefc177226fe578e93c2ef1f309416dc98843bfac387debb1b610b1d2366178ce7212a7312057a3d058357a629f18c78e129e60979a2310455a76207be5611e8b4b840629564020c17f5c9446882e23f610e931246ec434e62de765bf22954cfae02b2ff4b4086fbbd1b6cec23e45481eac5a25d", - }, - { - "67c6697351ff4aec29cdbaabf2fbe3467cc254f81be8e78d765a2e63339fc99a66320db73158a35a255d051758e95ed4abb2cdc69bb454110e827441213ddc8770e93ea141e1fc673e017e97eadc6b968f385c2aecb03bfb32af3c54ec18db5c021afe43fbfaaa3afb29d1e6053c7c9475d8be6189f95cbba8990f95b1ebf1b305eff700e9a13ae5ca0bcbd0484764bd1f231ea81c7b64c514735ac55e4b79633b706424119e09dcaad4acf21b10af3b33cde3504847155cbb6f2219ba9b7df50be11a1c7f23f829f8a41b13b5ca4ee8983238e0794d3d34bc5f4e77facb6c05ac86212baa1a55a2be70b5733b045cd33694b3afe2f0e49e4f321549fd824ea90870d4b28a2954489a0abcd50e18a844ac5bf38e4cd72d9b0942e506c433afcda3847f2dadd47647de321cec4ac430f62023856cfbb20704f4ec0bb920ba86c33e05f1ecd96733b79950a3e314", - "d3d934f75ea0f210a8f6059401", - "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", - "129039b5572e8a7a8131f76a", - "588e1356fb8fa32410dad99cf7922aae47b4042502c92f3afe33dc22c1c2e90caf22bc37a254f8dd62a09582c70194f9616982639415178e9fe95740c0f1d497a69b69d4924a7a15290187f9c8acf09cf5b3b3188ecde2d2807207f5bb6a6d3504314b1b47684cf8ba8807eb9a3c497c79ebe1e4c1eca2aa90328563e201425227fca8ee05dcc05fd6c98128626c1e71d2fb3a21860567093db1012dfabe13055c48219d2a301c8a5a49033a811d8d9413bafbb2eefc177226fe578e93c2ef1f309416dc98843bfac387debb1b610b1d2366178ce7212a7312057a3d058357a629f18c78e129e60979a2310455a76207be5611e8b4b840629564020c17f5c9446882e23f610e931246ec434e62de765bf22954cfae02b2ff7c59dfe246e4bb2d6a8afcebdc2beeaabf2a3f43f95a5ea639853f38719875ecdd2bbc0d81bb2a5ed59553b1e76b6365b74f618f685eb7731024bbf6794c3f4c7c5a1cf925", - }, - { - "67c6697351ff4aec29cdbaabf2fbe3467cc254f81be8e78d765a2e63339fc99a66320db73158a35a255d051758e95ed4abb2cdc69bb454110e827441213ddc8770e93ea141e1fc673e017e97eadc6b968f385c2aecb03bfb32af3c54ec18db5c021afe43fbfaaa3afb29d1e6053c7c9475d8be6189f95cbba8990f95b1ebf1b305eff700e9a13ae5ca0bcbd0484764bd1f231ea81c7b64c514735ac55e4b79633b706424119e09dcaad4acf21b10af3b33cde3504847155cbb6f2219ba9b7df50be11a1c7f23f829f8a41b13b5ca4ee8983238e0794d3d34bc5f4e77facb6c05ac86212baa1a55a2be70b5733b045cd33694b3afe2f0e49e4f321549fd824ea90870d4b28a2954489a0abcd50e18a844ac5bf38e4cd72d9b0942e506c433afcda3847f2dadd47647de321cec4ac430f62023856cfbb20704f4ec0bb920ba86c33e05f1ecd96733b79950a3e314", - "d3d934f75ea0f210a8f6059401beb4bc4478fa4969e623d01ada696a7e4c7e5125b34884533a94fb319990325744ee9bbce9e525cf08f5e9e25e5360aad2b2d085fa54d835e8d466826498d9a8877565705a8a3f62802944de7ca5894e5759d351adac869580ec17e485f18c0c66f17cc07cbb", - "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", - "129039b5572e8a7a8131f76a", - "588e1356fb8fa32410dad99cf7922aae47b4042502c92f3afe33dc22c1c2e90caf22bc37a254f8dd62a09582c70194f9616982639415178e9fe95740c0f1d497a69b69d4924a7a15290187f9c8acf09cf5b3b3188ecde2d2807207f5bb6a6d3504314b1b47684cf8ba8807eb9a3c497c79ebe1e4c1eca2aa90328563e201425227fca8ee05dcc05fd6c98128626c1e71d2fb3a21860567093db1012dfabe13055c48219d2a301c8a5a49033a811d8d9413bafbb2eefc177226fe578e93c2ef1f309416dc98843bfac387debb1b610b1d2366178ce7212a7312057a3d058357a629f18c78e129e60979a2310455a76207be5611e8b4b840629564020c17f5c9446882e23f610e931246ec434e62de765bf22954cfae02b2ff7c59dfe246e4bb2d6a8afcebdc2beeaabf2a3f43f95a5ea639853f38719875ecdd2bbc0d81bb2a5ed59553b1e76b6365b74f618f68a12d0f1cc99e132db9014100d9668c91", - }, - { - "67c6697351ff4aec29cdbaabf2fbe3467cc254f81be8e78d765a2e63339fc99a66320db73158a35a255d051758e95ed4abb2cdc69bb454110e827441213ddc8770e93ea141e1fc673e017e97eadc6b968f385c2aecb03bfb32af3c54ec18db5c021afe43fbfaaa3afb29d1e6053c7c9475d8be6189f95cbba8990f95b1ebf1b305eff700e9a13ae5ca0bcbd0484764bd1f231ea81c7b64c514735ac55e4b79633b706424119e09dcaad4acf21b10af3b33cde3504847155cbb6f2219ba9b7df50be11a1c7f23f829f8a41b13b5ca4ee8983238e0794d3d34bc5f4e77facb6c05ac86212baa1a55a2be70b5733b045cd33694b3afe2f0e49e4f321549fd824ea90870d4b28a2954489a0abcd50e18a844ac5bf38e4cd72d9b0942e506c433afcda3847f2dadd47647de321cec4ac430f62023856cfbb20704f4ec0bb920ba86c33e05f1ecd96733b79950a3e314d3d934f75ea0f210a8f6059401beb4bc4478fa4969e623d01ada696a7e4c7e5125b34884533a94fb319990325744ee9b", - "bc", - "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", - "129039b5572e8a7a8131f76a", - "588e1356fb8fa32410dad99cf7922aae47b4042502c92f3afe33dc22c1c2e90caf22bc37a254f8dd62a09582c70194f9616982639415178e9fe95740c0f1d497a69b69d4924a7a15290187f9c8acf09cf5b3b3188ecde2d2807207f5bb6a6d3504314b1b47684cf8ba8807eb9a3c497c79ebe1e4c1eca2aa90328563e201425227fca8ee05dcc05fd6c98128626c1e71d2fb3a21860567093db1012dfabe13055c48219d2a301c8a5a49033a811d8d9413bafbb2eefc177226fe578e93c2ef1f309416dc98843bfac387debb1b610b1d2366178ce7212a7312057a3d058357a629f18c78e129e60979a2310455a76207be5611e8b4b840629564020c17f5c9446882e23f610e931246ec434e62de765bf22954cfae02b2ff7c59dfe246e4bb2d6a8afcebdc2beeaabf2a3f43f95a5ea639853f38719875ecdd2bbc0d81bb2a5ed59553b1e76b6365b74f618f68d1f05b5662cd6e04de896d3ef5dae4149485a5a2093ff4ec74b20b5e5bf8e61b5c65515938c202beab3eea5a498d2f32d4d00a24b826b6efb16013ef54cbe170", - }, - { - "67c6697351ff4aec29cdbaabf2fbe3467cc254f81be8e78d765a2e63339fc99a66320db73158a35a255d051758e95ed4abb2cdc69bb454110e827441213ddc8770e93ea141e1fc673e017e97eadc6b968f385c2aecb03bfb32af3c54ec18db5c021afe43fbfaaa3afb29d1e6053c7c9475d8be6189f95cbba8990f95b1ebf1b305eff700e9a13ae5ca0bcbd0484764bd1f231ea81c7b64c514735ac55e4b79633b706424119e09dcaad4acf21b10af3b33cde3504847155cbb6f2219ba9b7df50be11a1c7f23f829f8a41b13b5ca4ee8983238e0794d3d34bc5f4e77facb6c05ac86212baa1a55a2be70b5733b045cd33694b3afe2f0e49e4f321549fd824ea90870d4b28a2954489a0abcd50e18a844ac5bf38e4cd72d9b0942e506c433afcda3847f2dadd47647de321cec4ac430f62023856cfbb20704f4ec0bb920ba86c33e05f1ecd96733b79950a3e314d3d934f75ea0f210a8f6059401beb4bc4478fa4969e623d01ada696a7e4c7e5125b34884533a94fb319990325744ee9bbce9e525cf08f5e9e25e5360aad2b2d085fa54d835e8d466826498d9a8877565705a8a3f62802944de7ca5894e5759d351adac869580ec17e485f18c0c66f17cc0", - "7cbb22fce466da610b63af62bc83b4692f3affaf271693ac071fb86d11342d", - "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", - "129039b5572e8a7a8131f76a", - "588e1356fb8fa32410dad99cf7922aae47b4042502c92f3afe33dc22c1c2e90caf22bc37a254f8dd62a09582c70194f9616982639415178e9fe95740c0f1d497a69b69d4924a7a15290187f9c8acf09cf5b3b3188ecde2d2807207f5bb6a6d3504314b1b47684cf8ba8807eb9a3c497c79ebe1e4c1eca2aa90328563e201425227fca8ee05dcc05fd6c98128626c1e71d2fb3a21860567093db1012dfabe13055c48219d2a301c8a5a49033a811d8d9413bafbb2eefc177226fe578e93c2ef1f309416dc98843bfac387debb1b610b1d2366178ce7212a7312057a3d058357a629f18c78e129e60979a2310455a76207be5611e8b4b840629564020c17f5c9446882e23f610e931246ec434e62de765bf22954cfae02b2ff7c59dfe246e4bb2d6a8afcebdc2beeaabf2a3f43f95a5ea639853f38719875ecdd2bbc0d81bb2a5ed59553b1e76b6365b74f618f68d1f05b5662cd6e04de896d3ef5dae4149485a5a2093ff4ec74b20b5e5bf8e61b5c65515938c202beab3eea5a498d2f32c38dbb37d04f8272e741da2802c54a9d9aaf8ecf38b36fc9ad0079523f6a4abd5281a22697a3180bc02662a7c13ee23599d18e5c48300dbb831509df4c172f53e524b3c15124a87ac73e5028cde6c94d8d", - }, - { - "67c6697351ff4aec29cdbaabf2fbe3467cc254f81be8e78d765a2e63339fc99a66320db73158a35a255d051758e95ed4abb2cdc69bb454110e827441213ddc8770e93ea141e1fc673e017e97eadc6b968f385c2aecb03bfb32af3c54ec18db5c021afe43fbfaaa3afb29d1e6053c7c9475d8be6189f95cbba8990f95b1ebf1b305eff700e9a13ae5ca0bcbd0484764bd1f231ea81c7b64c514735ac55e4b79633b706424119e09dcaad4acf21b10af3b33cde3504847155cbb6f2219ba9b7df50be11a1c7f23f829f8a41b13b5ca4ee8983238e0794d3d34bc5f4e77facb6c05ac86212baa1a55a2be70b5733b045cd33694b3afe2f0e49e4f321549fd824ea90870d4b28a2954489a0abcd50e18a844ac5bf38e4cd72d9b0942e506c433afcda3847f2dadd47647de321cec4ac430f62023856cfbb20704f4ec0bb920ba86c33e05f1ecd96733b79950a3e314d3d934f75ea0f210a8f6059401beb4bc4478fa4969e623d01ada696a7e4c7e5125b34884533a94fb319990325744ee9bbce9e525", - "", - "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", - "129039b5572e8a7a8131f76a", - "588e1356fb8fa32410dad99cf7922aae47b4042502c92f3afe33dc22c1c2e90caf22bc37a254f8dd62a09582c70194f9616982639415178e9fe95740c0f1d497a69b69d4924a7a15290187f9c8acf09cf5b3b3188ecde2d2807207f5bb6a6d3504314b1b47684cf8ba8807eb9a3c497c79ebe1e4c1eca2aa90328563e201425227fca8ee05dcc05fd6c98128626c1e71d2fb3a21860567093db1012dfabe13055c48219d2a301c8a5a49033a811d8d9413bafbb2eefc177226fe578e93c2ef1f309416dc98843bfac387debb1b610b1d2366178ce7212a7312057a3d058357a629f18c78e129e60979a2310455a76207be5611e8b4b840629564020c17f5c9446882e23f610e931246ec434e62de765bf22954cfae02b2ff7c59dfe246e4bb2d6a8afcebdc2beeaabf2a3f43f95a5ea639853f38719875ecdd2bbc0d81bb2a5ed59553b1e76b6365b74f618f68d1f05b5662cd6e04de896d3ef5dae4149485a5a2093ff4ec74b20b5e5bf8e61b5c65515938c202beab3eea5a498d2f32c38dbb370a9bbc3187cc260ddac991f94ce4f0d5", - }, - { - "0fb826ddb2eb5e708de203d0438be12cf708d635ebdbae56278be09077009586b9bc646ba7c2db35a5de05e86ae71461efea96dac64430edcf117d461113cccacf303576f310ab98efb180599894ba877e50614494923163a3afa9b4c2757f91a6b40799c5b331b464b10dfc45c783c317e408ab76390e19e8b7ceaa2c4d3bd201436bc6f69c7a5a4d8756924ed95665bd5e1034971e4d80d51b2a", - "026866d46aa940309fdcabf92a324fbc", - "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", - "129039b5572e8a7a8131f76a", - "30f05cf8189bb7b8b4f560e746e228c4cc7e86e8f2fa66e1afe212d1855db51070acd5eb34ce80b2e223957df50fde4c2531d97fc9e573725e7a5e47f0dfc4da1942620320bb2deaf8b17937bae4218d04db8e76f6efe84a117292159507c9f8a09fb2c17921d7762510dbf1dac7b62b1bd7572e3e2cf008d01c445c7fa78833235034281ae180e051451c6a64f22ca9708634bd0d604e4cfcd971b13742efa5b6363e662a875daccb2b00", - }, - { - "c7d4f8790e4c47d4daecbddf5939973521ddbf3b832e564afc66f03b5583c41c58bd956609dc3ae3c8f7c2213059575236168dba44e3044049f47c9e7840bbd0fd5036062d70e9f567ac1797056ee93c8476f6c959fa09a3ee854166c6fc36c34d6cca7adcb36f435f86db65f4c4a1793b974294914b377fd179e697751c5ac289243c65d8aca93732849c27483da083d4e218652d4fe5fec8cb953ee7f00070143dd6ece97f241b03c0424bfee2cfd2c4e738f2361df0ffe8863dcf763d408a7a167763959b7f985bc1e359a4b22c6899645ad0814bcf69d10c38474978d1c48e482723e3a6bb3f689f980c51c474eb28cfbba91a8a12eb964b32dfc303a3524ccb752f71316ed9d007e521cb5a0cf429c79d4351b02ee7fb60c7be636a10af3586dfa7b74d80875466a820c0b514e97cb12cce615ab55cba7c1b1de72bcd1cb1acc368f944ef4eaa986e6a4d8253c9337f9795d94df193c90cb0b0387dcde929905223d441717ed9dfe826613bf094ba872993d41b269e27d74e5f541b497eac9ba180dc12ffb6f1e7dc5223cce6dd541071282b97c6526e15b2c330fb41dc96e25d72f45c28e543053766d11d44252db54e584c14abbb295d7e5a58bf36eea1936095ef897a338eb1995fcedd85fc92d354dfe7ff9a115c186bb4d7a1a27835030d248c87571a38f17906cefe0261d15740b9", - "56", - "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", - "129039b5572e8a7a8131f76a", - "f89c825ca43cae1ce3fbdee85c505edd1aabefe69a0f9efd740f027aa7dee48a91ad24e69ad061648f0a52b4afb19d7ffccdc21f4b4247dfd89f5f9f998cb3c02b226173fedb6f8770aceef9271e7236fefd19fb3b87d08a5c587ac7918e80aa4b477f22602189811e270d686bc4949137a41d11d95ec96ee9d26c6126f6e923ab37638b34d1538d2e46d6df6216da4f193a3cecb731e632e109ced643056a1673059355d2d1314df35ded8364efed7de490201090a6f2d1751748585f64d26041637ba3723cbc4b60e226f10a19699d223075bc1f27d82e7f560c0db630ea670b3f8a70a8950894af4d1c7b3f674a3fa00d19ee4cc2b6174c1d259a297424bf2c3943a29a16a9830ce11abaa79cd2eb77b53a02b365b1838e7bfd5ae1bd044ffc885c61c6b2186a357e8b8f732b7ab96517969aeb70c7b493bbaca9462a61815a3c6135c748bf9c8487ac0631807aa69243fa09cd3b8efb63f8d4e090ad30b6c2f08bf4e82f191cedfa5cbe2b42268d67ecd105918181e44fc9879efd642d20be84e6f74717e03fb94fcbaa6ed3b307431d2a9384b8a2b3e5825ffce8d99af48f177e43bb4272226d8a5edd37d53807f768feb9e0733b437a1d0f84779ab68a1804e92a5eecca56364f0fa6dca152203b249fdc8fbd950fdc37c1887596308a90ba3a5751c7096bfbd1cb177bb17847b33c4379b43938a67674459cd9a06e3017ccac5b", - }, - { - "135a28170fe89066da7bcff3a9ccc1b27dfe942a6f47b23835ef746aaea63dc10066d90f4e697528e5451b8e11dd408fdbd4b94a1c6c82515bf7bc099df9cb9d5fa4acad0d22d5f267f18078cec107a995c1f3b12d7603886dbf910ab85ca7180053c50e759b00dc8c81555a425c03d71df6894a6c8cd2d94b64e303c08a1bc1dee1cf537ccf300850856292e1656aff5bf349c87f1ca1ca8085cd400fe901edcad04146a0714ef0f6b083d715edd670e020385f3cda29bc5ff6fc6edffe5ca9ce9def6e0e3d5f04ede2db02cfb2", - "73afd2ab0e0e8537cae42dc6530dc4afb6934ca6", - "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", - "129039b5572e8a7a8131f76a", - "2c125232a59879aee36cacc4aca5085a4688c4f776667a8fbd86862b5cfb1d57c976688fdd652eafa2b88b1b8e358aa2110ff6ef13cdc1ceca9c9f087c35c38d89d6fbd8de89538070f17916ecb19ca3ef4a1c834f0bdaa1df62aaabef2e117106787056c909e61ecd208357dd5c363f11c5d6cf24992cc873cf69f59360a820fcf290bd90b2cab24c47286acb4e1033962b6d41e562a206a94796a8ab1c6b8bade804ff9bdf5ba6062d2c1f8fe0f4dfc05720bd9a612b92c26789f9f6a7ce43f5e8e3aee99a9cd7d6c11eaa611983c36935b0dda57d898a60a0ab7c4b54", - }, -} diff --git a/vendor/golang.org/x/crypto/chacha20poly1305/internal/chacha20/chacha_generic.go b/vendor/golang.org/x/crypto/chacha20poly1305/internal/chacha20/chacha_generic.go deleted file mode 100644 index f9e8a3a2f..000000000 --- a/vendor/golang.org/x/crypto/chacha20poly1305/internal/chacha20/chacha_generic.go +++ /dev/null @@ -1,199 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package ChaCha20 implements the core ChaCha20 function as specified in https://tools.ietf.org/html/rfc7539#section-2.3. -package chacha20 - -import "encoding/binary" - -const rounds = 20 - -// core applies the ChaCha20 core function to 16-byte input in, 32-byte key k, -// and 16-byte constant c, and puts the result into 64-byte array out. -func core(out *[64]byte, in *[16]byte, k *[32]byte) { - j0 := uint32(0x61707865) - j1 := uint32(0x3320646e) - j2 := uint32(0x79622d32) - j3 := uint32(0x6b206574) - j4 := binary.LittleEndian.Uint32(k[0:4]) - j5 := binary.LittleEndian.Uint32(k[4:8]) - j6 := binary.LittleEndian.Uint32(k[8:12]) - j7 := binary.LittleEndian.Uint32(k[12:16]) - j8 := binary.LittleEndian.Uint32(k[16:20]) - j9 := binary.LittleEndian.Uint32(k[20:24]) - j10 := binary.LittleEndian.Uint32(k[24:28]) - j11 := binary.LittleEndian.Uint32(k[28:32]) - j12 := binary.LittleEndian.Uint32(in[0:4]) - j13 := binary.LittleEndian.Uint32(in[4:8]) - j14 := binary.LittleEndian.Uint32(in[8:12]) - j15 := binary.LittleEndian.Uint32(in[12:16]) - - x0, x1, x2, x3, x4, x5, x6, x7 := j0, j1, j2, j3, j4, j5, j6, j7 - x8, x9, x10, x11, x12, x13, x14, x15 := j8, j9, j10, j11, j12, j13, j14, j15 - - for i := 0; i < rounds; i += 2 { - x0 += x4 - x12 ^= x0 - x12 = (x12 << 16) | (x12 >> (16)) - x8 += x12 - x4 ^= x8 - x4 = (x4 << 12) | (x4 >> (20)) - x0 += x4 - x12 ^= x0 - x12 = (x12 << 8) | (x12 >> (24)) - x8 += x12 - x4 ^= x8 - x4 = (x4 << 7) | (x4 >> (25)) - x1 += x5 - x13 ^= x1 - x13 = (x13 << 16) | (x13 >> 16) - x9 += x13 - x5 ^= x9 - x5 = (x5 << 12) | (x5 >> 20) - x1 += x5 - x13 ^= x1 - x13 = (x13 << 8) | (x13 >> 24) - x9 += x13 - x5 ^= x9 - x5 = (x5 << 7) | (x5 >> 25) - x2 += x6 - x14 ^= x2 - x14 = (x14 << 16) | (x14 >> 16) - x10 += x14 - x6 ^= x10 - x6 = (x6 << 12) | (x6 >> 20) - x2 += x6 - x14 ^= x2 - x14 = (x14 << 8) | (x14 >> 24) - x10 += x14 - x6 ^= x10 - x6 = (x6 << 7) | (x6 >> 25) - x3 += x7 - x15 ^= x3 - x15 = (x15 << 16) | (x15 >> 16) - x11 += x15 - x7 ^= x11 - x7 = (x7 << 12) | (x7 >> 20) - x3 += x7 - x15 ^= x3 - x15 = (x15 << 8) | (x15 >> 24) - x11 += x15 - x7 ^= x11 - x7 = (x7 << 7) | (x7 >> 25) - x0 += x5 - x15 ^= x0 - x15 = (x15 << 16) | (x15 >> 16) - x10 += x15 - x5 ^= x10 - x5 = (x5 << 12) | (x5 >> 20) - x0 += x5 - x15 ^= x0 - x15 = (x15 << 8) | (x15 >> 24) - x10 += x15 - x5 ^= x10 - x5 = (x5 << 7) | (x5 >> 25) - x1 += x6 - x12 ^= x1 - x12 = (x12 << 16) | (x12 >> 16) - x11 += x12 - x6 ^= x11 - x6 = (x6 << 12) | (x6 >> 20) - x1 += x6 - x12 ^= x1 - x12 = (x12 << 8) | (x12 >> 24) - x11 += x12 - x6 ^= x11 - x6 = (x6 << 7) | (x6 >> 25) - x2 += x7 - x13 ^= x2 - x13 = (x13 << 16) | (x13 >> 16) - x8 += x13 - x7 ^= x8 - x7 = (x7 << 12) | (x7 >> 20) - x2 += x7 - x13 ^= x2 - x13 = (x13 << 8) | (x13 >> 24) - x8 += x13 - x7 ^= x8 - x7 = (x7 << 7) | (x7 >> 25) - x3 += x4 - x14 ^= x3 - x14 = (x14 << 16) | (x14 >> 16) - x9 += x14 - x4 ^= x9 - x4 = (x4 << 12) | (x4 >> 20) - x3 += x4 - x14 ^= x3 - x14 = (x14 << 8) | (x14 >> 24) - x9 += x14 - x4 ^= x9 - x4 = (x4 << 7) | (x4 >> 25) - } - - x0 += j0 - x1 += j1 - x2 += j2 - x3 += j3 - x4 += j4 - x5 += j5 - x6 += j6 - x7 += j7 - x8 += j8 - x9 += j9 - x10 += j10 - x11 += j11 - x12 += j12 - x13 += j13 - x14 += j14 - x15 += j15 - - binary.LittleEndian.PutUint32(out[0:4], x0) - binary.LittleEndian.PutUint32(out[4:8], x1) - binary.LittleEndian.PutUint32(out[8:12], x2) - binary.LittleEndian.PutUint32(out[12:16], x3) - binary.LittleEndian.PutUint32(out[16:20], x4) - binary.LittleEndian.PutUint32(out[20:24], x5) - binary.LittleEndian.PutUint32(out[24:28], x6) - binary.LittleEndian.PutUint32(out[28:32], x7) - binary.LittleEndian.PutUint32(out[32:36], x8) - binary.LittleEndian.PutUint32(out[36:40], x9) - binary.LittleEndian.PutUint32(out[40:44], x10) - binary.LittleEndian.PutUint32(out[44:48], x11) - binary.LittleEndian.PutUint32(out[48:52], x12) - binary.LittleEndian.PutUint32(out[52:56], x13) - binary.LittleEndian.PutUint32(out[56:60], x14) - binary.LittleEndian.PutUint32(out[60:64], x15) -} - -// XORKeyStream crypts bytes from in to out using the given key and counters. -// In and out may be the same slice but otherwise should not overlap. Counter -// contains the raw ChaCha20 counter bytes (i.e. block counter followed by -// nonce). -func XORKeyStream(out, in []byte, counter *[16]byte, key *[32]byte) { - var block [64]byte - var counterCopy [16]byte - copy(counterCopy[:], counter[:]) - - for len(in) >= 64 { - core(&block, &counterCopy, key) - for i, x := range block { - out[i] = in[i] ^ x - } - u := uint32(1) - for i := 0; i < 4; i++ { - u += uint32(counterCopy[i]) - counterCopy[i] = byte(u) - u >>= 8 - } - in = in[64:] - out = out[64:] - } - - if len(in) > 0 { - core(&block, &counterCopy, key) - for i, v := range in { - out[i] = v ^ block[i] - } - } -} diff --git a/vendor/golang.org/x/crypto/chacha20poly1305/internal/chacha20/chacha_test.go b/vendor/golang.org/x/crypto/chacha20poly1305/internal/chacha20/chacha_test.go deleted file mode 100644 index b80d34cdd..000000000 --- a/vendor/golang.org/x/crypto/chacha20poly1305/internal/chacha20/chacha_test.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package chacha20 - -import ( - "encoding/hex" - "testing" -) - -func TestCore(t *testing.T) { - // This is just a smoke test that checks the example from - // https://tools.ietf.org/html/rfc7539#section-2.3.2. The - // chacha20poly1305 package contains much more extensive tests of this - // code. - var key [32]byte - for i := range key { - key[i] = byte(i) - } - - var input [16]byte - input[0] = 1 - input[7] = 9 - input[11] = 0x4a - - var out [64]byte - XORKeyStream(out[:], out[:], &input, &key) - const expected = "10f1e7e4d13b5915500fdd1fa32071c4c7d1f4c733c068030422aa9ac3d46c4ed2826446079faa0914c2d705d98b02a2b5129cd1de164eb9cbd083e8a2503c4e" - if result := hex.EncodeToString(out[:]); result != expected { - t.Errorf("wanted %x but got %x", expected, result) - } -} diff --git a/vendor/golang.org/x/crypto/codereview.cfg b/vendor/golang.org/x/crypto/codereview.cfg deleted file mode 100644 index 3f8b14b64..000000000 --- a/vendor/golang.org/x/crypto/codereview.cfg +++ /dev/null @@ -1 +0,0 @@ -issuerepo: golang/go diff --git a/vendor/golang.org/x/crypto/cryptobyte/asn1.go b/vendor/golang.org/x/crypto/cryptobyte/asn1.go deleted file mode 100644 index 166e22d7b..000000000 --- a/vendor/golang.org/x/crypto/cryptobyte/asn1.go +++ /dev/null @@ -1,604 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cryptobyte - -import ( - "encoding/asn1" - "fmt" - "math/big" - "reflect" - "time" -) - -// This file contains ASN.1-related methods for String and Builder. - -// Tag represents an ASN.1 tag number and class (together also referred to as -// identifier octets). Methods in this package only support the low-tag-number -// form, i.e. a single identifier octet with bits 7-8 encoding the class and -// bits 1-6 encoding the tag number. -type Tag uint8 - -// Contructed returns t with the context-specific class bit set. -func (t Tag) ContextSpecific() Tag { return t | 0x80 } - -// Contructed returns t with the constructed class bit set. -func (t Tag) Constructed() Tag { return t | 0x20 } - -// Builder - -// AddASN1Int64 appends a DER-encoded ASN.1 INTEGER. -func (b *Builder) AddASN1Int64(v int64) { - b.addASN1Signed(asn1.TagInteger, v) -} - -// AddASN1Enum appends a DER-encoded ASN.1 ENUMERATION. -func (b *Builder) AddASN1Enum(v int64) { - b.addASN1Signed(asn1.TagEnum, v) -} - -func (b *Builder) addASN1Signed(tag Tag, v int64) { - b.AddASN1(tag, func(c *Builder) { - length := 1 - for i := v; i >= 0x80 || i < -0x80; i >>= 8 { - length++ - } - - for ; length > 0; length-- { - i := v >> uint((length-1)*8) & 0xff - c.AddUint8(uint8(i)) - } - }) -} - -// AddASN1Uint64 appends a DER-encoded ASN.1 INTEGER. -func (b *Builder) AddASN1Uint64(v uint64) { - b.AddASN1(asn1.TagInteger, func(c *Builder) { - length := 1 - for i := v; i >= 0x80; i >>= 8 { - length++ - } - - for ; length > 0; length-- { - i := v >> uint((length-1)*8) & 0xff - c.AddUint8(uint8(i)) - } - }) -} - -// AddASN1BigInt appends a DER-encoded ASN.1 INTEGER. -func (b *Builder) AddASN1BigInt(n *big.Int) { - if b.err != nil { - return - } - - b.AddASN1(asn1.TagInteger, func(c *Builder) { - if n.Sign() < 0 { - // A negative number has to be converted to two's-complement form. So we - // invert and subtract 1. If the most-significant-bit isn't set then - // we'll need to pad the beginning with 0xff in order to keep the number - // negative. - nMinus1 := new(big.Int).Neg(n) - nMinus1.Sub(nMinus1, bigOne) - bytes := nMinus1.Bytes() - for i := range bytes { - bytes[i] ^= 0xff - } - if bytes[0]&0x80 == 0 { - c.add(0xff) - } - c.add(bytes...) - } else if n.Sign() == 0 { - c.add(0) - } else { - bytes := n.Bytes() - if bytes[0]&0x80 != 0 { - c.add(0) - } - c.add(bytes...) - } - }) -} - -// AddASN1OctetString appends a DER-encoded ASN.1 OCTET STRING. -func (b *Builder) AddASN1OctetString(bytes []byte) { - b.AddASN1(asn1.TagOctetString, func(c *Builder) { - c.AddBytes(bytes) - }) -} - -const generalizedTimeFormatStr = "20060102150405Z0700" - -// AddASN1GeneralizedTime appends a DER-encoded ASN.1 GENERALIZEDTIME. -func (b *Builder) AddASN1GeneralizedTime(t time.Time) { - if t.Year() < 0 || t.Year() > 9999 { - b.err = fmt.Errorf("cryptobyte: cannot represent %v as a GeneralizedTime", t) - return - } - b.AddASN1(asn1.TagGeneralizedTime, func(c *Builder) { - c.AddBytes([]byte(t.Format(generalizedTimeFormatStr))) - }) -} - -// AddASN1BitString appends a DER-encoded ASN.1 BIT STRING. -func (b *Builder) AddASN1BitString(s asn1.BitString) { - // TODO(martinkr): Implement. - b.MarshalASN1(s) -} - -// MarshalASN1 calls asn1.Marshal on its input and appends the result if -// successful or records an error if one occurred. -func (b *Builder) MarshalASN1(v interface{}) { - // NOTE(martinkr): This is somewhat of a hack to allow propagation of - // asn1.Marshal errors into Builder.err. N.B. if you call MarshalASN1 with a - // value embedded into a struct, its tag information is lost. - if b.err != nil { - return - } - bytes, err := asn1.Marshal(v) - if err != nil { - b.err = err - return - } - b.AddBytes(bytes) -} - -// AddASN1 appends an ASN.1 object. The object is prefixed with the given tag. -// Tags greater than 30 are not supported and result in an error (i.e. -// low-tag-number form only). The child builder passed to the -// BuilderContinuation can be used to build the content of the ASN.1 object. -func (b *Builder) AddASN1(tag Tag, f BuilderContinuation) { - if b.err != nil { - return - } - // Identifiers with the low five bits set indicate high-tag-number format - // (two or more octets), which we don't support. - if tag&0x1f == 0x1f { - b.err = fmt.Errorf("cryptobyte: high-tag number identifier octects not supported: 0x%x", tag) - return - } - b.AddUint8(uint8(tag)) - b.addLengthPrefixed(1, true, f) -} - -// String - -var bigIntType = reflect.TypeOf((*big.Int)(nil)).Elem() - -// ReadASN1Integer decodes an ASN.1 INTEGER into out and advances. If out does -// not point to an integer or to a big.Int, it panics. It returns true on -// success and false on error. -func (s *String) ReadASN1Integer(out interface{}) bool { - if reflect.TypeOf(out).Kind() != reflect.Ptr { - panic("out is not a pointer") - } - switch reflect.ValueOf(out).Elem().Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - var i int64 - if !s.readASN1Int64(&i) || reflect.ValueOf(out).Elem().OverflowInt(i) { - return false - } - reflect.ValueOf(out).Elem().SetInt(i) - return true - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - var u uint64 - if !s.readASN1Uint64(&u) || reflect.ValueOf(out).Elem().OverflowUint(u) { - return false - } - reflect.ValueOf(out).Elem().SetUint(u) - return true - case reflect.Struct: - if reflect.TypeOf(out).Elem() == bigIntType { - return s.readASN1BigInt(out.(*big.Int)) - } - } - panic("out does not point to an integer type") -} - -func checkASN1Integer(bytes []byte) bool { - if len(bytes) == 0 { - // An INTEGER is encoded with at least one octet. - return false - } - if len(bytes) == 1 { - return true - } - if bytes[0] == 0 && bytes[1]&0x80 == 0 || bytes[0] == 0xff && bytes[1]&0x80 == 0x80 { - // Value is not minimally encoded. - return false - } - return true -} - -var bigOne = big.NewInt(1) - -func (s *String) readASN1BigInt(out *big.Int) bool { - var bytes String - if !s.ReadASN1(&bytes, asn1.TagInteger) || !checkASN1Integer(bytes) { - return false - } - if bytes[0]&0x80 == 0x80 { - // Negative number. - neg := make([]byte, len(bytes)) - for i, b := range bytes { - neg[i] = ^b - } - out.SetBytes(neg) - out.Add(out, bigOne) - out.Neg(out) - } else { - out.SetBytes(bytes) - } - return true -} - -func (s *String) readASN1Int64(out *int64) bool { - var bytes String - if !s.ReadASN1(&bytes, asn1.TagInteger) || !checkASN1Integer(bytes) || !asn1Signed(out, bytes) { - return false - } - return true -} - -func asn1Signed(out *int64, n []byte) bool { - length := len(n) - if length > 8 { - return false - } - for i := 0; i < length; i++ { - *out <<= 8 - *out |= int64(n[i]) - } - // Shift up and down in order to sign extend the result. - *out <<= 64 - uint8(length)*8 - *out >>= 64 - uint8(length)*8 - return true -} - -func (s *String) readASN1Uint64(out *uint64) bool { - var bytes String - if !s.ReadASN1(&bytes, asn1.TagInteger) || !checkASN1Integer(bytes) || !asn1Unsigned(out, bytes) { - return false - } - return true -} - -func asn1Unsigned(out *uint64, n []byte) bool { - length := len(n) - if length > 9 || length == 9 && n[0] != 0 { - // Too large for uint64. - return false - } - if n[0]&0x80 != 0 { - // Negative number. - return false - } - for i := 0; i < length; i++ { - *out <<= 8 - *out |= uint64(n[i]) - } - return true -} - -// ReadASN1Enum decodes an ASN.1 ENUMERATION into out and advances. It returns -// true on success and false on error. -func (s *String) ReadASN1Enum(out *int) bool { - var bytes String - var i int64 - if !s.ReadASN1(&bytes, asn1.TagEnum) || !checkASN1Integer(bytes) || !asn1Signed(&i, bytes) { - return false - } - if int64(int(i)) != i { - return false - } - *out = int(i) - return true -} - -func (s *String) readBase128Int(out *int) bool { - ret := 0 - for i := 0; len(*s) > 0; i++ { - if i == 4 { - return false - } - ret <<= 7 - b := s.read(1)[0] - ret |= int(b & 0x7f) - if b&0x80 == 0 { - *out = ret - return true - } - } - return false // truncated -} - -// ReadASN1ObjectIdentifier decodes an ASN.1 OBJECT IDENTIFIER into out and -// advances. It returns true on success and false on error. -func (s *String) ReadASN1ObjectIdentifier(out *asn1.ObjectIdentifier) bool { - var bytes String - if !s.ReadASN1(&bytes, asn1.TagOID) || len(bytes) == 0 { - return false - } - - // In the worst case, we get two elements from the first byte (which is - // encoded differently) and then every varint is a single byte long. - components := make([]int, len(bytes)+1) - - // The first varint is 40*value1 + value2: - // According to this packing, value1 can take the values 0, 1 and 2 only. - // When value1 = 0 or value1 = 1, then value2 is <= 39. When value1 = 2, - // then there are no restrictions on value2. - var v int - if !bytes.readBase128Int(&v) { - return false - } - if v < 80 { - components[0] = v / 40 - components[1] = v % 40 - } else { - components[0] = 2 - components[1] = v - 80 - } - - i := 2 - for ; len(bytes) > 0; i++ { - if !bytes.readBase128Int(&v) { - return false - } - components[i] = v - } - *out = components[:i] - return true -} - -// ReadASN1GeneralizedTime decodes an ASN.1 GENERALIZEDTIME into out and -// advances. It returns true on success and false on error. -func (s *String) ReadASN1GeneralizedTime(out *time.Time) bool { - var bytes String - if !s.ReadASN1(&bytes, asn1.TagGeneralizedTime) { - return false - } - t := string(bytes) - res, err := time.Parse(generalizedTimeFormatStr, t) - if err != nil { - return false - } - if serialized := res.Format(generalizedTimeFormatStr); serialized != t { - return false - } - *out = res - return true -} - -// ReadASN1BitString decodes an ASN.1 BIT STRING into out and advances. It -// returns true on success and false on error. -func (s *String) ReadASN1BitString(out *asn1.BitString) bool { - var bytes String - if !s.ReadASN1(&bytes, asn1.TagBitString) || len(bytes) == 0 { - return false - } - - paddingBits := uint8(bytes[0]) - bytes = bytes[1:] - if paddingBits > 7 || - len(bytes) == 0 && paddingBits != 0 || - len(bytes) > 0 && bytes[len(bytes)-1]&(1< 4 || len(*s) < int(2+lenLen) { - return false - } - - lenBytes := String((*s)[2 : 2+lenLen]) - if !lenBytes.readUnsigned(&len32, int(lenLen)) { - return false - } - - // ITU-T X.690 section 10.1 (DER length forms) requires encoding the length - // with the minimum number of octets. - if len32 < 128 { - // Length should have used short-form encoding. - return false - } - if len32>>((lenLen-1)*8) == 0 { - // Leading octet is 0. Length should have been at least one byte shorter. - return false - } - - headerLen = 2 + uint32(lenLen) - if headerLen+len32 < len32 { - // Overflow. - return false - } - length = headerLen + len32 - } - - if uint32(int(length)) != length || !s.ReadBytes((*[]byte)(out), int(length)) { - return false - } - if skipHeader && !out.Skip(int(headerLen)) { - panic("cryptobyte: internal error") - } - - return true -} diff --git a/vendor/golang.org/x/crypto/cryptobyte/asn1_test.go b/vendor/golang.org/x/crypto/cryptobyte/asn1_test.go deleted file mode 100644 index c8c187032..000000000 --- a/vendor/golang.org/x/crypto/cryptobyte/asn1_test.go +++ /dev/null @@ -1,285 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cryptobyte - -import ( - "bytes" - "encoding/asn1" - "math/big" - "reflect" - "testing" - "time" -) - -type readASN1Test struct { - name string - in []byte - tag Tag - ok bool - out interface{} -} - -var readASN1TestData = []readASN1Test{ - {"valid", []byte{0x30, 2, 1, 2}, 0x30, true, []byte{1, 2}}, - {"truncated", []byte{0x30, 3, 1, 2}, 0x30, false, nil}, - {"zero length of length", []byte{0x30, 0x80}, 0x30, false, nil}, - {"invalid long form length", []byte{0x30, 0x81, 1, 1}, 0x30, false, nil}, - {"non-minimal length", append([]byte{0x30, 0x82, 0, 0x80}, make([]byte, 0x80)...), 0x30, false, nil}, - {"invalid tag", []byte{0xa1, 3, 0x4, 1, 1}, 31, false, nil}, - {"high tag", []byte{0x1f, 0x81, 0x80, 0x01, 2, 1, 2}, 0xff /* actually 0x4001, but tag is uint8 */, false, nil}, -} - -func TestReadASN1(t *testing.T) { - for _, test := range readASN1TestData { - t.Run(test.name, func(t *testing.T) { - var in, out String = test.in, nil - ok := in.ReadASN1(&out, test.tag) - if ok != test.ok || ok && !bytes.Equal(out, test.out.([]byte)) { - t.Errorf("in.ReadASN1() = %v, want %v; out = %v, want %v", ok, test.ok, out, test.out) - } - }) - } -} - -func TestReadASN1Optional(t *testing.T) { - var empty String - var present bool - ok := empty.ReadOptionalASN1(nil, &present, 0xa0) - if !ok || present { - t.Errorf("empty.ReadOptionalASN1() = %v, want true; present = %v want false", ok, present) - } - - var in, out String = []byte{0xa1, 3, 0x4, 1, 1}, nil - ok = in.ReadOptionalASN1(&out, &present, 0xa0) - if !ok || present { - t.Errorf("in.ReadOptionalASN1() = %v, want true, present = %v, want false", ok, present) - } - ok = in.ReadOptionalASN1(&out, &present, 0xa1) - wantBytes := []byte{4, 1, 1} - if !ok || !present || !bytes.Equal(out, wantBytes) { - t.Errorf("in.ReadOptionalASN1() = %v, want true; present = %v, want true; out = %v, want = %v", ok, present, out, wantBytes) - } -} - -var optionalOctetStringTestData = []struct { - readASN1Test - present bool -}{ - {readASN1Test{"empty", []byte{}, 0xa0, true, []byte{}}, false}, - {readASN1Test{"invalid", []byte{0xa1, 3, 0x4, 2, 1}, 0xa1, false, []byte{}}, true}, - {readASN1Test{"missing", []byte{0xa1, 3, 0x4, 1, 1}, 0xa0, true, []byte{}}, false}, - {readASN1Test{"present", []byte{0xa1, 3, 0x4, 1, 1}, 0xa1, true, []byte{1}}, true}, -} - -func TestReadASN1OptionalOctetString(t *testing.T) { - for _, test := range optionalOctetStringTestData { - t.Run(test.name, func(t *testing.T) { - in := String(test.in) - var out []byte - var present bool - ok := in.ReadOptionalASN1OctetString(&out, &present, test.tag) - if ok != test.ok || present != test.present || !bytes.Equal(out, test.out.([]byte)) { - t.Errorf("in.ReadOptionalASN1OctetString() = %v, want %v; present = %v want %v; out = %v, want %v", ok, test.ok, present, test.present, out, test.out) - } - }) - } -} - -const defaultInt = -1 - -var optionalIntTestData = []readASN1Test{ - {"empty", []byte{}, 0xa0, true, defaultInt}, - {"invalid", []byte{0xa1, 3, 0x2, 2, 127}, 0xa1, false, 0}, - {"missing", []byte{0xa1, 3, 0x2, 1, 127}, 0xa0, true, defaultInt}, - {"present", []byte{0xa1, 3, 0x2, 1, 42}, 0xa1, true, 42}, -} - -func TestReadASN1OptionalInteger(t *testing.T) { - for _, test := range optionalIntTestData { - t.Run(test.name, func(t *testing.T) { - in := String(test.in) - var out int - ok := in.ReadOptionalASN1Integer(&out, test.tag, defaultInt) - if ok != test.ok || ok && out != test.out.(int) { - t.Errorf("in.ReadOptionalASN1Integer() = %v, want %v; out = %v, want %v", ok, test.ok, out, test.out) - } - }) - } -} - -func TestReadASN1IntegerSigned(t *testing.T) { - testData64 := []struct { - in []byte - out int64 - }{ - {[]byte{2, 3, 128, 0, 0}, -0x800000}, - {[]byte{2, 2, 255, 0}, -256}, - {[]byte{2, 2, 255, 127}, -129}, - {[]byte{2, 1, 128}, -128}, - {[]byte{2, 1, 255}, -1}, - {[]byte{2, 1, 0}, 0}, - {[]byte{2, 1, 1}, 1}, - {[]byte{2, 1, 2}, 2}, - {[]byte{2, 1, 127}, 127}, - {[]byte{2, 2, 0, 128}, 128}, - {[]byte{2, 2, 1, 0}, 256}, - {[]byte{2, 4, 0, 128, 0, 0}, 0x800000}, - } - for i, test := range testData64 { - in := String(test.in) - var out int64 - ok := in.ReadASN1Integer(&out) - if !ok || out != test.out { - t.Errorf("#%d: in.ReadASN1Integer() = %v, want true; out = %d, want %d", i, ok, out, test.out) - } - } - - // Repeat the same cases, reading into a big.Int. - t.Run("big.Int", func(t *testing.T) { - for i, test := range testData64 { - in := String(test.in) - var out big.Int - ok := in.ReadASN1Integer(&out) - if !ok || out.Int64() != test.out { - t.Errorf("#%d: in.ReadASN1Integer() = %v, want true; out = %d, want %d", i, ok, out.Int64(), test.out) - } - } - }) -} - -func TestReadASN1IntegerUnsigned(t *testing.T) { - testData := []struct { - in []byte - out uint64 - }{ - {[]byte{2, 1, 0}, 0}, - {[]byte{2, 1, 1}, 1}, - {[]byte{2, 1, 2}, 2}, - {[]byte{2, 1, 127}, 127}, - {[]byte{2, 2, 0, 128}, 128}, - {[]byte{2, 2, 1, 0}, 256}, - {[]byte{2, 4, 0, 128, 0, 0}, 0x800000}, - {[]byte{2, 8, 127, 255, 255, 255, 255, 255, 255, 255}, 0x7fffffffffffffff}, - {[]byte{2, 9, 0, 128, 0, 0, 0, 0, 0, 0, 0}, 0x8000000000000000}, - {[]byte{2, 9, 0, 255, 255, 255, 255, 255, 255, 255, 255}, 0xffffffffffffffff}, - } - for i, test := range testData { - in := String(test.in) - var out uint64 - ok := in.ReadASN1Integer(&out) - if !ok || out != test.out { - t.Errorf("#%d: in.ReadASN1Integer() = %v, want true; out = %d, want %d", i, ok, out, test.out) - } - } -} - -func TestReadASN1IntegerInvalid(t *testing.T) { - testData := []String{ - []byte{3, 1, 0}, // invalid tag - // truncated - []byte{2, 1}, - []byte{2, 2, 0}, - // not minimally encoded - []byte{2, 2, 0, 1}, - []byte{2, 2, 0xff, 0xff}, - } - - for i, test := range testData { - var out int64 - if test.ReadASN1Integer(&out) { - t.Errorf("#%d: in.ReadASN1Integer() = true, want false (out = %d)", i, out) - } - } -} - -func TestReadASN1ObjectIdentifier(t *testing.T) { - testData := []struct { - in []byte - ok bool - out []int - }{ - {[]byte{}, false, []int{}}, - {[]byte{6, 0}, false, []int{}}, - {[]byte{5, 1, 85}, false, []int{2, 5}}, - {[]byte{6, 1, 85}, true, []int{2, 5}}, - {[]byte{6, 2, 85, 0x02}, true, []int{2, 5, 2}}, - {[]byte{6, 4, 85, 0x02, 0xc0, 0x00}, true, []int{2, 5, 2, 0x2000}}, - {[]byte{6, 3, 0x81, 0x34, 0x03}, true, []int{2, 100, 3}}, - {[]byte{6, 7, 85, 0x02, 0xc0, 0x80, 0x80, 0x80, 0x80}, false, []int{}}, - } - - for i, test := range testData { - in := String(test.in) - var out asn1.ObjectIdentifier - ok := in.ReadASN1ObjectIdentifier(&out) - if ok != test.ok || ok && !out.Equal(test.out) { - t.Errorf("#%d: in.ReadASN1ObjectIdentifier() = %v, want %v; out = %v, want %v", i, ok, test.ok, out, test.out) - } - } -} - -func TestReadASN1GeneralizedTime(t *testing.T) { - testData := []struct { - in string - ok bool - out time.Time - }{ - {"20100102030405Z", true, time.Date(2010, 01, 02, 03, 04, 05, 0, time.UTC)}, - {"20100102030405", false, time.Time{}}, - {"20100102030405+0607", true, time.Date(2010, 01, 02, 03, 04, 05, 0, time.FixedZone("", 6*60*60+7*60))}, - {"20100102030405-0607", true, time.Date(2010, 01, 02, 03, 04, 05, 0, time.FixedZone("", -6*60*60-7*60))}, - /* These are invalid times. However, the time package normalises times - * and they were accepted in some versions. See #11134. */ - {"00000100000000Z", false, time.Time{}}, - {"20101302030405Z", false, time.Time{}}, - {"20100002030405Z", false, time.Time{}}, - {"20100100030405Z", false, time.Time{}}, - {"20100132030405Z", false, time.Time{}}, - {"20100231030405Z", false, time.Time{}}, - {"20100102240405Z", false, time.Time{}}, - {"20100102036005Z", false, time.Time{}}, - {"20100102030460Z", false, time.Time{}}, - {"-20100102030410Z", false, time.Time{}}, - {"2010-0102030410Z", false, time.Time{}}, - {"2010-0002030410Z", false, time.Time{}}, - {"201001-02030410Z", false, time.Time{}}, - {"20100102-030410Z", false, time.Time{}}, - {"2010010203-0410Z", false, time.Time{}}, - {"201001020304-10Z", false, time.Time{}}, - } - for i, test := range testData { - in := String(append([]byte{asn1.TagGeneralizedTime, byte(len(test.in))}, test.in...)) - var out time.Time - ok := in.ReadASN1GeneralizedTime(&out) - if ok != test.ok || ok && !reflect.DeepEqual(out, test.out) { - t.Errorf("#%d: in.ReadASN1GeneralizedTime() = %v, want %v; out = %q, want %q", i, ok, test.ok, out, test.out) - } - } -} - -func TestReadASN1BitString(t *testing.T) { - testData := []struct { - in []byte - ok bool - out asn1.BitString - }{ - {[]byte{}, false, asn1.BitString{}}, - {[]byte{0x00}, true, asn1.BitString{}}, - {[]byte{0x07, 0x00}, true, asn1.BitString{Bytes: []byte{0}, BitLength: 1}}, - {[]byte{0x07, 0x01}, false, asn1.BitString{}}, - {[]byte{0x07, 0x40}, false, asn1.BitString{}}, - {[]byte{0x08, 0x00}, false, asn1.BitString{}}, - {[]byte{0xff}, false, asn1.BitString{}}, - {[]byte{0xfe, 0x00}, false, asn1.BitString{}}, - } - for i, test := range testData { - in := String(append([]byte{3, byte(len(test.in))}, test.in...)) - var out asn1.BitString - ok := in.ReadASN1BitString(&out) - if ok != test.ok || ok && (!bytes.Equal(out.Bytes, test.out.Bytes) || out.BitLength != test.out.BitLength) { - t.Errorf("#%d: in.ReadASN1BitString() = %v, want %v; out = %v, want %v", i, ok, test.ok, out, test.out) - } - } -} diff --git a/vendor/golang.org/x/crypto/cryptobyte/builder.go b/vendor/golang.org/x/crypto/cryptobyte/builder.go deleted file mode 100644 index 9883fb3c3..000000000 --- a/vendor/golang.org/x/crypto/cryptobyte/builder.go +++ /dev/null @@ -1,255 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cryptobyte - -import ( - "errors" - "fmt" -) - -// A Builder builds byte strings from fixed-length and length-prefixed values. -// The zero value is a usable Builder that allocates space as needed. -type Builder struct { - err error - result []byte - fixedSize bool - child *Builder - offset int - pendingLenLen int - pendingIsASN1 bool -} - -// NewBuilder creates a Builder that appends its output to the given buffer. -// Like append(), the slice will be reallocated if its capacity is exceeded. -// Use Bytes to get the final buffer. -func NewBuilder(buffer []byte) *Builder { - return &Builder{ - result: buffer, - } -} - -// NewFixedBuilder creates a Builder that appends its output into the given -// buffer. This builder does not reallocate the output buffer. Writes that -// would exceed the buffer's capacity are treated as an error. -func NewFixedBuilder(buffer []byte) *Builder { - return &Builder{ - result: buffer, - fixedSize: true, - } -} - -// Bytes returns the bytes written by the builder or an error if one has -// occurred during during building. -func (b *Builder) Bytes() ([]byte, error) { - if b.err != nil { - return nil, b.err - } - return b.result[b.offset:], nil -} - -// BytesOrPanic returns the bytes written by the builder or panics if an error -// has occurred during building. -func (b *Builder) BytesOrPanic() []byte { - if b.err != nil { - panic(b.err) - } - return b.result[b.offset:] -} - -// AddUint8 appends an 8-bit value to the byte string. -func (b *Builder) AddUint8(v uint8) { - b.add(byte(v)) -} - -// AddUint16 appends a big-endian, 16-bit value to the byte string. -func (b *Builder) AddUint16(v uint16) { - b.add(byte(v>>8), byte(v)) -} - -// AddUint24 appends a big-endian, 24-bit value to the byte string. The highest -// byte of the 32-bit input value is silently truncated. -func (b *Builder) AddUint24(v uint32) { - b.add(byte(v>>16), byte(v>>8), byte(v)) -} - -// AddUint32 appends a big-endian, 32-bit value to the byte string. -func (b *Builder) AddUint32(v uint32) { - b.add(byte(v>>24), byte(v>>16), byte(v>>8), byte(v)) -} - -// AddBytes appends a sequence of bytes to the byte string. -func (b *Builder) AddBytes(v []byte) { - b.add(v...) -} - -// BuilderContinuation is continuation-passing interface for building -// length-prefixed byte sequences. Builder methods for length-prefixed -// sequences (AddUint8LengthPrefixed etc.) will invoke the BuilderContinuation -// supplied to them. The child builder passed to the continuation can be used -// to build the content of the length-prefixed sequence. Example: -// -// parent := cryptobyte.NewBuilder() -// parent.AddUint8LengthPrefixed(func (child *Builder) { -// child.AddUint8(42) -// child.AddUint8LengthPrefixed(func (grandchild *Builder) { -// grandchild.AddUint8(5) -// }) -// }) -// -// It is an error to write more bytes to the child than allowed by the reserved -// length prefix. After the continuation returns, the child must be considered -// invalid, i.e. users must not store any copies or references of the child -// that outlive the continuation. -type BuilderContinuation func(child *Builder) - -// AddUint8LengthPrefixed adds a 8-bit length-prefixed byte sequence. -func (b *Builder) AddUint8LengthPrefixed(f BuilderContinuation) { - b.addLengthPrefixed(1, false, f) -} - -// AddUint16LengthPrefixed adds a big-endian, 16-bit length-prefixed byte sequence. -func (b *Builder) AddUint16LengthPrefixed(f BuilderContinuation) { - b.addLengthPrefixed(2, false, f) -} - -// AddUint24LengthPrefixed adds a big-endian, 24-bit length-prefixed byte sequence. -func (b *Builder) AddUint24LengthPrefixed(f BuilderContinuation) { - b.addLengthPrefixed(3, false, f) -} - -func (b *Builder) addLengthPrefixed(lenLen int, isASN1 bool, f BuilderContinuation) { - // Subsequent writes can be ignored if the builder has encountered an error. - if b.err != nil { - return - } - - offset := len(b.result) - b.add(make([]byte, lenLen)...) - - b.child = &Builder{ - result: b.result, - fixedSize: b.fixedSize, - offset: offset, - pendingLenLen: lenLen, - pendingIsASN1: isASN1, - } - - f(b.child) - b.flushChild() - if b.child != nil { - panic("cryptobyte: internal error") - } -} - -func (b *Builder) flushChild() { - if b.child == nil { - return - } - b.child.flushChild() - child := b.child - b.child = nil - - if child.err != nil { - b.err = child.err - return - } - - length := len(child.result) - child.pendingLenLen - child.offset - - if length < 0 { - panic("cryptobyte: internal error") // result unexpectedly shrunk - } - - if child.pendingIsASN1 { - // For ASN.1, we reserved a single byte for the length. If that turned out - // to be incorrect, we have to move the contents along in order to make - // space. - if child.pendingLenLen != 1 { - panic("cryptobyte: internal error") - } - var lenLen, lenByte uint8 - if int64(length) > 0xfffffffe { - b.err = errors.New("pending ASN.1 child too long") - return - } else if length > 0xffffff { - lenLen = 5 - lenByte = 0x80 | 4 - } else if length > 0xffff { - lenLen = 4 - lenByte = 0x80 | 3 - } else if length > 0xff { - lenLen = 3 - lenByte = 0x80 | 2 - } else if length > 0x7f { - lenLen = 2 - lenByte = 0x80 | 1 - } else { - lenLen = 1 - lenByte = uint8(length) - length = 0 - } - - // Insert the initial length byte, make space for successive length bytes, - // and adjust the offset. - child.result[child.offset] = lenByte - extraBytes := int(lenLen - 1) - if extraBytes != 0 { - child.add(make([]byte, extraBytes)...) - childStart := child.offset + child.pendingLenLen - copy(child.result[childStart+extraBytes:], child.result[childStart:]) - } - child.offset++ - child.pendingLenLen = extraBytes - } - - l := length - for i := child.pendingLenLen - 1; i >= 0; i-- { - child.result[child.offset+i] = uint8(l) - l >>= 8 - } - if l != 0 { - b.err = fmt.Errorf("cryptobyte: pending child length %d exceeds %d-byte length prefix", length, child.pendingLenLen) - return - } - - if !b.fixedSize { - b.result = child.result // In case child reallocated result. - } -} - -func (b *Builder) add(bytes ...byte) { - if b.err != nil { - return - } - if b.child != nil { - panic("attempted write while child is pending") - } - if len(b.result)+len(bytes) < len(bytes) { - b.err = errors.New("cryptobyte: length overflow") - } - if b.fixedSize && len(b.result)+len(bytes) > cap(b.result) { - b.err = errors.New("cryptobyte: Builder is exceeding its fixed-size buffer") - return - } - b.result = append(b.result, bytes...) -} - -// A MarshalingValue marshals itself into a Builder. -type MarshalingValue interface { - // Marshal is called by Builder.AddValue. It receives a pointer to a builder - // to marshal itself into. It may return an error that occurred during - // marshaling, such as unset or invalid values. - Marshal(b *Builder) error -} - -// AddValue calls Marshal on v, passing a pointer to the builder to append to. -// If Marshal returns an error, it is set on the Builder so that subsequent -// appends don't have an effect. -func (b *Builder) AddValue(v MarshalingValue) { - err := v.Marshal(b) - if err != nil { - b.err = err - } -} diff --git a/vendor/golang.org/x/crypto/cryptobyte/cryptobyte_test.go b/vendor/golang.org/x/crypto/cryptobyte/cryptobyte_test.go deleted file mode 100644 index 49c61dca4..000000000 --- a/vendor/golang.org/x/crypto/cryptobyte/cryptobyte_test.go +++ /dev/null @@ -1,379 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cryptobyte - -import ( - "bytes" - "fmt" - "testing" -) - -func builderBytesEq(b *Builder, want ...byte) error { - got := b.BytesOrPanic() - if !bytes.Equal(got, want) { - return fmt.Errorf("Bytes() = %v, want %v", got, want) - } - return nil -} - -func TestBytes(t *testing.T) { - var b Builder - v := []byte("foobarbaz") - b.AddBytes(v[0:3]) - b.AddBytes(v[3:4]) - b.AddBytes(v[4:9]) - if err := builderBytesEq(&b, v...); err != nil { - t.Error(err) - } - s := String(b.BytesOrPanic()) - for _, w := range []string{"foo", "bar", "baz"} { - var got []byte - if !s.ReadBytes(&got, 3) { - t.Errorf("ReadBytes() = false, want true (w = %v)", w) - } - want := []byte(w) - if !bytes.Equal(got, want) { - t.Errorf("ReadBytes(): got = %v, want %v", got, want) - } - } - if len(s) != 0 { - t.Errorf("len(s) = %d, want 0", len(s)) - } -} - -func TestUint8(t *testing.T) { - var b Builder - b.AddUint8(42) - if err := builderBytesEq(&b, 42); err != nil { - t.Error(err) - } - - var s String = b.BytesOrPanic() - var v uint8 - if !s.ReadUint8(&v) { - t.Error("ReadUint8() = false, want true") - } - if v != 42 { - t.Errorf("v = %d, want 42", v) - } - if len(s) != 0 { - t.Errorf("len(s) = %d, want 0", len(s)) - } -} - -func TestUint16(t *testing.T) { - var b Builder - b.AddUint16(65534) - if err := builderBytesEq(&b, 255, 254); err != nil { - t.Error(err) - } - var s String = b.BytesOrPanic() - var v uint16 - if !s.ReadUint16(&v) { - t.Error("ReadUint16() == false, want true") - } - if v != 65534 { - t.Errorf("v = %d, want 65534", v) - } - if len(s) != 0 { - t.Errorf("len(s) = %d, want 0", len(s)) - } -} - -func TestUint24(t *testing.T) { - var b Builder - b.AddUint24(0xfffefd) - if err := builderBytesEq(&b, 255, 254, 253); err != nil { - t.Error(err) - } - - var s String = b.BytesOrPanic() - var v uint32 - if !s.ReadUint24(&v) { - t.Error("ReadUint8() = false, want true") - } - if v != 0xfffefd { - t.Errorf("v = %d, want fffefd", v) - } - if len(s) != 0 { - t.Errorf("len(s) = %d, want 0", len(s)) - } -} - -func TestUint24Truncation(t *testing.T) { - var b Builder - b.AddUint24(0x10111213) - if err := builderBytesEq(&b, 0x11, 0x12, 0x13); err != nil { - t.Error(err) - } -} - -func TestUint32(t *testing.T) { - var b Builder - b.AddUint32(0xfffefdfc) - if err := builderBytesEq(&b, 255, 254, 253, 252); err != nil { - t.Error(err) - } - - var s String = b.BytesOrPanic() - var v uint32 - if !s.ReadUint32(&v) { - t.Error("ReadUint8() = false, want true") - } - if v != 0xfffefdfc { - t.Errorf("v = %x, want fffefdfc", v) - } - if len(s) != 0 { - t.Errorf("len(s) = %d, want 0", len(s)) - } -} - -func TestUMultiple(t *testing.T) { - var b Builder - b.AddUint8(23) - b.AddUint32(0xfffefdfc) - b.AddUint16(42) - if err := builderBytesEq(&b, 23, 255, 254, 253, 252, 0, 42); err != nil { - t.Error(err) - } - - var s String = b.BytesOrPanic() - var ( - x uint8 - y uint32 - z uint16 - ) - if !s.ReadUint8(&x) || !s.ReadUint32(&y) || !s.ReadUint16(&z) { - t.Error("ReadUint8() = false, want true") - } - if x != 23 || y != 0xfffefdfc || z != 42 { - t.Errorf("x, y, z = %d, %d, %d; want 23, 4294901244, 5", x, y, z) - } - if len(s) != 0 { - t.Errorf("len(s) = %d, want 0", len(s)) - } -} - -func TestUint8LengthPrefixedSimple(t *testing.T) { - var b Builder - b.AddUint8LengthPrefixed(func(c *Builder) { - c.AddUint8(23) - c.AddUint8(42) - }) - if err := builderBytesEq(&b, 2, 23, 42); err != nil { - t.Error(err) - } - - var base, child String = b.BytesOrPanic(), nil - var x, y uint8 - if !base.ReadUint8LengthPrefixed(&child) || !child.ReadUint8(&x) || - !child.ReadUint8(&y) { - t.Error("parsing failed") - } - if x != 23 || y != 42 { - t.Errorf("want x, y == 23, 42; got %d, %d", x, y) - } - if len(base) != 0 { - t.Errorf("len(base) = %d, want 0", len(base)) - } - if len(child) != 0 { - t.Errorf("len(child) = %d, want 0", len(child)) - } -} - -func TestUint8LengthPrefixedMulti(t *testing.T) { - var b Builder - b.AddUint8LengthPrefixed(func(c *Builder) { - c.AddUint8(23) - c.AddUint8(42) - }) - b.AddUint8(5) - b.AddUint8LengthPrefixed(func(c *Builder) { - c.AddUint8(123) - c.AddUint8(234) - }) - if err := builderBytesEq(&b, 2, 23, 42, 5, 2, 123, 234); err != nil { - t.Error(err) - } - - var s, child String = b.BytesOrPanic(), nil - var u, v, w, x, y uint8 - if !s.ReadUint8LengthPrefixed(&child) || !child.ReadUint8(&u) || !child.ReadUint8(&v) || - !s.ReadUint8(&w) || !s.ReadUint8LengthPrefixed(&child) || !child.ReadUint8(&x) || !child.ReadUint8(&y) { - t.Error("parsing failed") - } - if u != 23 || v != 42 || w != 5 || x != 123 || y != 234 { - t.Errorf("u, v, w, x, y = %d, %d, %d, %d, %d; want 23, 42, 5, 123, 234", - u, v, w, x, y) - } - if len(s) != 0 { - t.Errorf("len(s) = %d, want 0", len(s)) - } - if len(child) != 0 { - t.Errorf("len(child) = %d, want 0", len(child)) - } -} - -func TestUint8LengthPrefixedNested(t *testing.T) { - var b Builder - b.AddUint8LengthPrefixed(func(c *Builder) { - c.AddUint8(5) - c.AddUint8LengthPrefixed(func(d *Builder) { - d.AddUint8(23) - d.AddUint8(42) - }) - c.AddUint8(123) - }) - if err := builderBytesEq(&b, 5, 5, 2, 23, 42, 123); err != nil { - t.Error(err) - } - - var base, child1, child2 String = b.BytesOrPanic(), nil, nil - var u, v, w, x uint8 - if !base.ReadUint8LengthPrefixed(&child1) { - t.Error("parsing base failed") - } - if !child1.ReadUint8(&u) || !child1.ReadUint8LengthPrefixed(&child2) || !child1.ReadUint8(&x) { - t.Error("parsing child1 failed") - } - if !child2.ReadUint8(&v) || !child2.ReadUint8(&w) { - t.Error("parsing child2 failed") - } - if u != 5 || v != 23 || w != 42 || x != 123 { - t.Errorf("u, v, w, x = %d, %d, %d, %d, want 5, 23, 42, 123", - u, v, w, x) - } - if len(base) != 0 { - t.Errorf("len(base) = %d, want 0", len(base)) - } - if len(child1) != 0 { - t.Errorf("len(child1) = %d, want 0", len(child1)) - } - if len(base) != 0 { - t.Errorf("len(child2) = %d, want 0", len(child2)) - } -} - -func TestPreallocatedBuffer(t *testing.T) { - var buf [5]byte - b := NewBuilder(buf[0:0]) - b.AddUint8(1) - b.AddUint8LengthPrefixed(func(c *Builder) { - c.AddUint8(3) - c.AddUint8(4) - }) - b.AddUint16(1286) // Outgrow buf by one byte. - want := []byte{1, 2, 3, 4, 0} - if !bytes.Equal(buf[:], want) { - t.Errorf("buf = %v want %v", buf, want) - } - if err := builderBytesEq(b, 1, 2, 3, 4, 5, 6); err != nil { - t.Error(err) - } -} - -func TestWriteWithPendingChild(t *testing.T) { - var b Builder - b.AddUint8LengthPrefixed(func(c *Builder) { - c.AddUint8LengthPrefixed(func(d *Builder) { - defer func() { - if recover() == nil { - t.Errorf("recover() = nil, want error; c.AddUint8() did not panic") - } - }() - c.AddUint8(2) // panics - - defer func() { - if recover() == nil { - t.Errorf("recover() = nil, want error; b.AddUint8() did not panic") - } - }() - b.AddUint8(2) // panics - }) - - defer func() { - if recover() == nil { - t.Errorf("recover() = nil, want error; b.AddUint8() did not panic") - } - }() - b.AddUint8(2) // panics - }) -} - -// ASN.1 - -func TestASN1Int64(t *testing.T) { - tests := []struct { - in int64 - want []byte - }{ - {-0x800000, []byte{2, 3, 128, 0, 0}}, - {-256, []byte{2, 2, 255, 0}}, - {-129, []byte{2, 2, 255, 127}}, - {-128, []byte{2, 1, 128}}, - {-1, []byte{2, 1, 255}}, - {0, []byte{2, 1, 0}}, - {1, []byte{2, 1, 1}}, - {2, []byte{2, 1, 2}}, - {127, []byte{2, 1, 127}}, - {128, []byte{2, 2, 0, 128}}, - {256, []byte{2, 2, 1, 0}}, - {0x800000, []byte{2, 4, 0, 128, 0, 0}}, - } - for i, tt := range tests { - var b Builder - b.AddASN1Int64(tt.in) - if err := builderBytesEq(&b, tt.want...); err != nil { - t.Errorf("%v, (i = %d; in = %v)", err, i, tt.in) - } - - var n int64 - s := String(b.BytesOrPanic()) - ok := s.ReadASN1Integer(&n) - if !ok || n != tt.in { - t.Errorf("s.ReadASN1Integer(&n) = %v, n = %d; want true, n = %d (i = %d)", - ok, n, tt.in, i) - } - if len(s) != 0 { - t.Errorf("len(s) = %d, want 0", len(s)) - } - } -} - -func TestASN1Uint64(t *testing.T) { - tests := []struct { - in uint64 - want []byte - }{ - {0, []byte{2, 1, 0}}, - {1, []byte{2, 1, 1}}, - {2, []byte{2, 1, 2}}, - {127, []byte{2, 1, 127}}, - {128, []byte{2, 2, 0, 128}}, - {256, []byte{2, 2, 1, 0}}, - {0x800000, []byte{2, 4, 0, 128, 0, 0}}, - {0x7fffffffffffffff, []byte{2, 8, 127, 255, 255, 255, 255, 255, 255, 255}}, - {0x8000000000000000, []byte{2, 9, 0, 128, 0, 0, 0, 0, 0, 0, 0}}, - {0xffffffffffffffff, []byte{2, 9, 0, 255, 255, 255, 255, 255, 255, 255, 255}}, - } - for i, tt := range tests { - var b Builder - b.AddASN1Uint64(tt.in) - if err := builderBytesEq(&b, tt.want...); err != nil { - t.Errorf("%v, (i = %d; in = %v)", err, i, tt.in) - } - - var n uint64 - s := String(b.BytesOrPanic()) - ok := s.ReadASN1Integer(&n) - if !ok || n != tt.in { - t.Errorf("s.ReadASN1Integer(&n) = %v, n = %d; want true, n = %d (i = %d)", - ok, n, tt.in, i) - } - if len(s) != 0 { - t.Errorf("len(s) = %d, want 0", len(s)) - } - } -} diff --git a/vendor/golang.org/x/crypto/cryptobyte/example_test.go b/vendor/golang.org/x/crypto/cryptobyte/example_test.go deleted file mode 100644 index 7d3c06e12..000000000 --- a/vendor/golang.org/x/crypto/cryptobyte/example_test.go +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cryptobyte_test - -import ( - "encoding/asn1" - "fmt" - "golang.org/x/crypto/cryptobyte" -) - -func ExampleString_lengthPrefixed() { - // This is an example of parsing length-prefixed data (as found in, for - // example, TLS). Imagine a 16-bit prefixed series of 8-bit prefixed - // strings. - - input := cryptobyte.String([]byte{0, 12, 5, 'h', 'e', 'l', 'l', 'o', 5, 'w', 'o', 'r', 'l', 'd'}) - var result []string - - var values cryptobyte.String - if !input.ReadUint16LengthPrefixed(&values) || - !input.Empty() { - panic("bad format") - } - - for !values.Empty() { - var value cryptobyte.String - if !values.ReadUint8LengthPrefixed(&value) { - panic("bad format") - } - - result = append(result, string(value)) - } - - // Output: []string{"hello", "world"} - fmt.Printf("%#v\n", result) -} - -func ExampleString_asn1() { - // This is an example of parsing ASN.1 data that looks like: - // Foo ::= SEQUENCE { - // version [6] INTEGER DEFAULT 0 - // data OCTET STRING - // } - - input := cryptobyte.String([]byte{0x30, 12, 0xa6, 3, 2, 1, 2, 4, 5, 'h', 'e', 'l', 'l', 'o'}) - - var ( - version int64 - data, inner, versionBytes cryptobyte.String - haveVersion bool - ) - if !input.ReadASN1(&inner, cryptobyte.Tag(asn1.TagSequence).Constructed()) || - !input.Empty() || - !inner.ReadOptionalASN1(&versionBytes, &haveVersion, cryptobyte.Tag(6).Constructed().ContextSpecific()) || - (haveVersion && !versionBytes.ReadASN1Integer(&version)) || - (haveVersion && !versionBytes.Empty()) || - !inner.ReadASN1(&data, asn1.TagOctetString) || - !inner.Empty() { - panic("bad format") - } - - // Output: haveVersion: true, version: 2, data: hello - fmt.Printf("haveVersion: %t, version: %d, data: %s\n", haveVersion, version, string(data)) -} - -func ExampleBuilder_asn1() { - // This is an example of building ASN.1 data that looks like: - // Foo ::= SEQUENCE { - // version [6] INTEGER DEFAULT 0 - // data OCTET STRING - // } - - version := int64(2) - data := []byte("hello") - const defaultVersion = 0 - - var b cryptobyte.Builder - b.AddASN1(cryptobyte.Tag(asn1.TagSequence).Constructed(), func(b *cryptobyte.Builder) { - if version != defaultVersion { - b.AddASN1(cryptobyte.Tag(6).Constructed().ContextSpecific(), func(b *cryptobyte.Builder) { - b.AddASN1Int64(version) - }) - } - b.AddASN1OctetString(data) - }) - - result, err := b.Bytes() - if err != nil { - panic(err) - } - - // Output: 300ca603020102040568656c6c6f - fmt.Printf("%x\n", result) -} - -func ExampleBuilder_lengthPrefixed() { - // This is an example of building length-prefixed data (as found in, - // for example, TLS). Imagine a 16-bit prefixed series of 8-bit - // prefixed strings. - input := []string{"hello", "world"} - - var b cryptobyte.Builder - b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { - for _, value := range input { - b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddBytes([]byte(value)) - }) - } - }) - - result, err := b.Bytes() - if err != nil { - panic(err) - } - - // Output: 000c0568656c6c6f05776f726c64 - fmt.Printf("%x\n", result) -} diff --git a/vendor/golang.org/x/crypto/cryptobyte/string.go b/vendor/golang.org/x/crypto/cryptobyte/string.go deleted file mode 100644 index 678033611..000000000 --- a/vendor/golang.org/x/crypto/cryptobyte/string.go +++ /dev/null @@ -1,157 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package cryptobyte implements building and parsing of byte strings for -// DER-encoded ASN.1 and TLS messages. See the examples for the Builder and -// String types to get started. -package cryptobyte // import "golang.org/x/crypto/cryptobyte" - -// String represents a string of bytes. It provides methods for parsing -// fixed-length and length-prefixed values from it. -type String []byte - -// read advances a String by n bytes and returns them. If less than n bytes -// remain, it returns nil. -func (s *String) read(n int) []byte { - if len(*s) < n { - return nil - } - v := (*s)[:n] - *s = (*s)[n:] - return v -} - -// Skip advances the String by n byte and reports whether it was successful. -func (s *String) Skip(n int) bool { - return s.read(n) != nil -} - -// ReadUint8 decodes an 8-bit value into out and advances over it. It -// returns true on success and false on error. -func (s *String) ReadUint8(out *uint8) bool { - v := s.read(1) - if v == nil { - return false - } - *out = uint8(v[0]) - return true -} - -// ReadUint16 decodes a big-endian, 16-bit value into out and advances over it. -// It returns true on success and false on error. -func (s *String) ReadUint16(out *uint16) bool { - v := s.read(2) - if v == nil { - return false - } - *out = uint16(v[0])<<8 | uint16(v[1]) - return true -} - -// ReadUint24 decodes a big-endian, 24-bit value into out and advances over it. -// It returns true on success and false on error. -func (s *String) ReadUint24(out *uint32) bool { - v := s.read(3) - if v == nil { - return false - } - *out = uint32(v[0])<<16 | uint32(v[1])<<8 | uint32(v[2]) - return true -} - -// ReadUint32 decodes a big-endian, 32-bit value into out and advances over it. -// It returns true on success and false on error. -func (s *String) ReadUint32(out *uint32) bool { - v := s.read(4) - if v == nil { - return false - } - *out = uint32(v[0])<<24 | uint32(v[1])<<16 | uint32(v[2])<<8 | uint32(v[3]) - return true -} - -func (s *String) readUnsigned(out *uint32, length int) bool { - v := s.read(length) - if v == nil { - return false - } - var result uint32 - for i := 0; i < length; i++ { - result <<= 8 - result |= uint32(v[i]) - } - *out = result - return true -} - -func (s *String) readLengthPrefixed(lenLen int, outChild *String) bool { - lenBytes := s.read(lenLen) - if lenBytes == nil { - return false - } - var length uint32 - for _, b := range lenBytes { - length = length << 8 - length = length | uint32(b) - } - if int(length) < 0 { - // This currently cannot overflow because we read uint24 at most, but check - // anyway in case that changes in the future. - return false - } - v := s.read(int(length)) - if v == nil { - return false - } - *outChild = v - return true -} - -// ReadUint8LengthPrefixed reads the content of an 8-bit length-prefixed value -// into out and advances over it. It returns true on success and false on -// error. -func (s *String) ReadUint8LengthPrefixed(out *String) bool { - return s.readLengthPrefixed(1, out) -} - -// ReadUint16LengthPrefixed reads the content of a big-endian, 16-bit -// length-prefixed value into out and advances over it. It returns true on -// success and false on error. -func (s *String) ReadUint16LengthPrefixed(out *String) bool { - return s.readLengthPrefixed(2, out) -} - -// ReadUint24LengthPrefixed reads the content of a big-endian, 24-bit -// length-prefixed value into out and advances over it. It returns true on -// success and false on error. -func (s *String) ReadUint24LengthPrefixed(out *String) bool { - return s.readLengthPrefixed(3, out) -} - -// ReadBytes reads n bytes into out and advances over them. It returns true on -// success and false and error. -func (s *String) ReadBytes(out *[]byte, n int) bool { - v := s.read(n) - if v == nil { - return false - } - *out = v - return true -} - -// CopyBytes copies len(out) bytes into out and advances over them. It returns -// true on success and false on error. -func (s *String) CopyBytes(out []byte) bool { - n := len(out) - v := s.read(n) - if v == nil { - return false - } - return copy(out, v) == n -} - -// Empty reports whether the string does not contain any bytes. -func (s String) Empty() bool { - return len(s) == 0 -} diff --git a/vendor/golang.org/x/crypto/curve25519/const_amd64.h b/vendor/golang.org/x/crypto/curve25519/const_amd64.h deleted file mode 100644 index 80ad2220f..000000000 --- a/vendor/golang.org/x/crypto/curve25519/const_amd64.h +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This code was translated into a form compatible with 6a from the public -// domain sources in SUPERCOP: http://bench.cr.yp.to/supercop.html - -#define REDMASK51 0x0007FFFFFFFFFFFF diff --git a/vendor/golang.org/x/crypto/curve25519/const_amd64.s b/vendor/golang.org/x/crypto/curve25519/const_amd64.s deleted file mode 100644 index 0ad539885..000000000 --- a/vendor/golang.org/x/crypto/curve25519/const_amd64.s +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This code was translated into a form compatible with 6a from the public -// domain sources in SUPERCOP: http://bench.cr.yp.to/supercop.html - -// +build amd64,!gccgo,!appengine - -// These constants cannot be encoded in non-MOVQ immediates. -// We access them directly from memory instead. - -DATA ·_121666_213(SB)/8, $996687872 -GLOBL ·_121666_213(SB), 8, $8 - -DATA ·_2P0(SB)/8, $0xFFFFFFFFFFFDA -GLOBL ·_2P0(SB), 8, $8 - -DATA ·_2P1234(SB)/8, $0xFFFFFFFFFFFFE -GLOBL ·_2P1234(SB), 8, $8 diff --git a/vendor/golang.org/x/crypto/curve25519/cswap_amd64.s b/vendor/golang.org/x/crypto/curve25519/cswap_amd64.s deleted file mode 100644 index 45484d1b5..000000000 --- a/vendor/golang.org/x/crypto/curve25519/cswap_amd64.s +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This code was translated into a form compatible with 6a from the public -// domain sources in SUPERCOP: http://bench.cr.yp.to/supercop.html - -// +build amd64,!gccgo,!appengine - -// func cswap(inout *[5]uint64, v uint64) -TEXT ·cswap(SB),7,$0 - MOVQ inout+0(FP),DI - MOVQ v+8(FP),SI - - CMPQ SI,$1 - MOVQ 0(DI),SI - MOVQ 80(DI),DX - MOVQ 8(DI),CX - MOVQ 88(DI),R8 - MOVQ SI,R9 - CMOVQEQ DX,SI - CMOVQEQ R9,DX - MOVQ CX,R9 - CMOVQEQ R8,CX - CMOVQEQ R9,R8 - MOVQ SI,0(DI) - MOVQ DX,80(DI) - MOVQ CX,8(DI) - MOVQ R8,88(DI) - MOVQ 16(DI),SI - MOVQ 96(DI),DX - MOVQ 24(DI),CX - MOVQ 104(DI),R8 - MOVQ SI,R9 - CMOVQEQ DX,SI - CMOVQEQ R9,DX - MOVQ CX,R9 - CMOVQEQ R8,CX - CMOVQEQ R9,R8 - MOVQ SI,16(DI) - MOVQ DX,96(DI) - MOVQ CX,24(DI) - MOVQ R8,104(DI) - MOVQ 32(DI),SI - MOVQ 112(DI),DX - MOVQ 40(DI),CX - MOVQ 120(DI),R8 - MOVQ SI,R9 - CMOVQEQ DX,SI - CMOVQEQ R9,DX - MOVQ CX,R9 - CMOVQEQ R8,CX - CMOVQEQ R9,R8 - MOVQ SI,32(DI) - MOVQ DX,112(DI) - MOVQ CX,40(DI) - MOVQ R8,120(DI) - MOVQ 48(DI),SI - MOVQ 128(DI),DX - MOVQ 56(DI),CX - MOVQ 136(DI),R8 - MOVQ SI,R9 - CMOVQEQ DX,SI - CMOVQEQ R9,DX - MOVQ CX,R9 - CMOVQEQ R8,CX - CMOVQEQ R9,R8 - MOVQ SI,48(DI) - MOVQ DX,128(DI) - MOVQ CX,56(DI) - MOVQ R8,136(DI) - MOVQ 64(DI),SI - MOVQ 144(DI),DX - MOVQ 72(DI),CX - MOVQ 152(DI),R8 - MOVQ SI,R9 - CMOVQEQ DX,SI - CMOVQEQ R9,DX - MOVQ CX,R9 - CMOVQEQ R8,CX - CMOVQEQ R9,R8 - MOVQ SI,64(DI) - MOVQ DX,144(DI) - MOVQ CX,72(DI) - MOVQ R8,152(DI) - MOVQ DI,AX - MOVQ SI,DX - RET diff --git a/vendor/golang.org/x/crypto/curve25519/curve25519.go b/vendor/golang.org/x/crypto/curve25519/curve25519.go deleted file mode 100644 index 6918c47fc..000000000 --- a/vendor/golang.org/x/crypto/curve25519/curve25519.go +++ /dev/null @@ -1,841 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// We have a implementation in amd64 assembly so this code is only run on -// non-amd64 platforms. The amd64 assembly does not support gccgo. -// +build !amd64 gccgo appengine - -package curve25519 - -// This code is a port of the public domain, "ref10" implementation of -// curve25519 from SUPERCOP 20130419 by D. J. Bernstein. - -// fieldElement represents an element of the field GF(2^255 - 19). An element -// t, entries t[0]...t[9], represents the integer t[0]+2^26 t[1]+2^51 t[2]+2^77 -// t[3]+2^102 t[4]+...+2^230 t[9]. Bounds on each t[i] vary depending on -// context. -type fieldElement [10]int32 - -func feZero(fe *fieldElement) { - for i := range fe { - fe[i] = 0 - } -} - -func feOne(fe *fieldElement) { - feZero(fe) - fe[0] = 1 -} - -func feAdd(dst, a, b *fieldElement) { - for i := range dst { - dst[i] = a[i] + b[i] - } -} - -func feSub(dst, a, b *fieldElement) { - for i := range dst { - dst[i] = a[i] - b[i] - } -} - -func feCopy(dst, src *fieldElement) { - for i := range dst { - dst[i] = src[i] - } -} - -// feCSwap replaces (f,g) with (g,f) if b == 1; replaces (f,g) with (f,g) if b == 0. -// -// Preconditions: b in {0,1}. -func feCSwap(f, g *fieldElement, b int32) { - var x fieldElement - b = -b - for i := range x { - x[i] = b & (f[i] ^ g[i]) - } - - for i := range f { - f[i] ^= x[i] - } - for i := range g { - g[i] ^= x[i] - } -} - -// load3 reads a 24-bit, little-endian value from in. -func load3(in []byte) int64 { - var r int64 - r = int64(in[0]) - r |= int64(in[1]) << 8 - r |= int64(in[2]) << 16 - return r -} - -// load4 reads a 32-bit, little-endian value from in. -func load4(in []byte) int64 { - var r int64 - r = int64(in[0]) - r |= int64(in[1]) << 8 - r |= int64(in[2]) << 16 - r |= int64(in[3]) << 24 - return r -} - -func feFromBytes(dst *fieldElement, src *[32]byte) { - h0 := load4(src[:]) - h1 := load3(src[4:]) << 6 - h2 := load3(src[7:]) << 5 - h3 := load3(src[10:]) << 3 - h4 := load3(src[13:]) << 2 - h5 := load4(src[16:]) - h6 := load3(src[20:]) << 7 - h7 := load3(src[23:]) << 5 - h8 := load3(src[26:]) << 4 - h9 := load3(src[29:]) << 2 - - var carry [10]int64 - carry[9] = (h9 + 1<<24) >> 25 - h0 += carry[9] * 19 - h9 -= carry[9] << 25 - carry[1] = (h1 + 1<<24) >> 25 - h2 += carry[1] - h1 -= carry[1] << 25 - carry[3] = (h3 + 1<<24) >> 25 - h4 += carry[3] - h3 -= carry[3] << 25 - carry[5] = (h5 + 1<<24) >> 25 - h6 += carry[5] - h5 -= carry[5] << 25 - carry[7] = (h7 + 1<<24) >> 25 - h8 += carry[7] - h7 -= carry[7] << 25 - - carry[0] = (h0 + 1<<25) >> 26 - h1 += carry[0] - h0 -= carry[0] << 26 - carry[2] = (h2 + 1<<25) >> 26 - h3 += carry[2] - h2 -= carry[2] << 26 - carry[4] = (h4 + 1<<25) >> 26 - h5 += carry[4] - h4 -= carry[4] << 26 - carry[6] = (h6 + 1<<25) >> 26 - h7 += carry[6] - h6 -= carry[6] << 26 - carry[8] = (h8 + 1<<25) >> 26 - h9 += carry[8] - h8 -= carry[8] << 26 - - dst[0] = int32(h0) - dst[1] = int32(h1) - dst[2] = int32(h2) - dst[3] = int32(h3) - dst[4] = int32(h4) - dst[5] = int32(h5) - dst[6] = int32(h6) - dst[7] = int32(h7) - dst[8] = int32(h8) - dst[9] = int32(h9) -} - -// feToBytes marshals h to s. -// Preconditions: -// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. -// -// Write p=2^255-19; q=floor(h/p). -// Basic claim: q = floor(2^(-255)(h + 19 2^(-25)h9 + 2^(-1))). -// -// Proof: -// Have |h|<=p so |q|<=1 so |19^2 2^(-255) q|<1/4. -// Also have |h-2^230 h9|<2^230 so |19 2^(-255)(h-2^230 h9)|<1/4. -// -// Write y=2^(-1)-19^2 2^(-255)q-19 2^(-255)(h-2^230 h9). -// Then 0> 25 - q = (h[0] + q) >> 26 - q = (h[1] + q) >> 25 - q = (h[2] + q) >> 26 - q = (h[3] + q) >> 25 - q = (h[4] + q) >> 26 - q = (h[5] + q) >> 25 - q = (h[6] + q) >> 26 - q = (h[7] + q) >> 25 - q = (h[8] + q) >> 26 - q = (h[9] + q) >> 25 - - // Goal: Output h-(2^255-19)q, which is between 0 and 2^255-20. - h[0] += 19 * q - // Goal: Output h-2^255 q, which is between 0 and 2^255-20. - - carry[0] = h[0] >> 26 - h[1] += carry[0] - h[0] -= carry[0] << 26 - carry[1] = h[1] >> 25 - h[2] += carry[1] - h[1] -= carry[1] << 25 - carry[2] = h[2] >> 26 - h[3] += carry[2] - h[2] -= carry[2] << 26 - carry[3] = h[3] >> 25 - h[4] += carry[3] - h[3] -= carry[3] << 25 - carry[4] = h[4] >> 26 - h[5] += carry[4] - h[4] -= carry[4] << 26 - carry[5] = h[5] >> 25 - h[6] += carry[5] - h[5] -= carry[5] << 25 - carry[6] = h[6] >> 26 - h[7] += carry[6] - h[6] -= carry[6] << 26 - carry[7] = h[7] >> 25 - h[8] += carry[7] - h[7] -= carry[7] << 25 - carry[8] = h[8] >> 26 - h[9] += carry[8] - h[8] -= carry[8] << 26 - carry[9] = h[9] >> 25 - h[9] -= carry[9] << 25 - // h10 = carry9 - - // Goal: Output h[0]+...+2^255 h10-2^255 q, which is between 0 and 2^255-20. - // Have h[0]+...+2^230 h[9] between 0 and 2^255-1; - // evidently 2^255 h10-2^255 q = 0. - // Goal: Output h[0]+...+2^230 h[9]. - - s[0] = byte(h[0] >> 0) - s[1] = byte(h[0] >> 8) - s[2] = byte(h[0] >> 16) - s[3] = byte((h[0] >> 24) | (h[1] << 2)) - s[4] = byte(h[1] >> 6) - s[5] = byte(h[1] >> 14) - s[6] = byte((h[1] >> 22) | (h[2] << 3)) - s[7] = byte(h[2] >> 5) - s[8] = byte(h[2] >> 13) - s[9] = byte((h[2] >> 21) | (h[3] << 5)) - s[10] = byte(h[3] >> 3) - s[11] = byte(h[3] >> 11) - s[12] = byte((h[3] >> 19) | (h[4] << 6)) - s[13] = byte(h[4] >> 2) - s[14] = byte(h[4] >> 10) - s[15] = byte(h[4] >> 18) - s[16] = byte(h[5] >> 0) - s[17] = byte(h[5] >> 8) - s[18] = byte(h[5] >> 16) - s[19] = byte((h[5] >> 24) | (h[6] << 1)) - s[20] = byte(h[6] >> 7) - s[21] = byte(h[6] >> 15) - s[22] = byte((h[6] >> 23) | (h[7] << 3)) - s[23] = byte(h[7] >> 5) - s[24] = byte(h[7] >> 13) - s[25] = byte((h[7] >> 21) | (h[8] << 4)) - s[26] = byte(h[8] >> 4) - s[27] = byte(h[8] >> 12) - s[28] = byte((h[8] >> 20) | (h[9] << 6)) - s[29] = byte(h[9] >> 2) - s[30] = byte(h[9] >> 10) - s[31] = byte(h[9] >> 18) -} - -// feMul calculates h = f * g -// Can overlap h with f or g. -// -// Preconditions: -// |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. -// |g| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. -// -// Postconditions: -// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. -// -// Notes on implementation strategy: -// -// Using schoolbook multiplication. -// Karatsuba would save a little in some cost models. -// -// Most multiplications by 2 and 19 are 32-bit precomputations; -// cheaper than 64-bit postcomputations. -// -// There is one remaining multiplication by 19 in the carry chain; -// one *19 precomputation can be merged into this, -// but the resulting data flow is considerably less clean. -// -// There are 12 carries below. -// 10 of them are 2-way parallelizable and vectorizable. -// Can get away with 11 carries, but then data flow is much deeper. -// -// With tighter constraints on inputs can squeeze carries into int32. -func feMul(h, f, g *fieldElement) { - f0 := f[0] - f1 := f[1] - f2 := f[2] - f3 := f[3] - f4 := f[4] - f5 := f[5] - f6 := f[6] - f7 := f[7] - f8 := f[8] - f9 := f[9] - g0 := g[0] - g1 := g[1] - g2 := g[2] - g3 := g[3] - g4 := g[4] - g5 := g[5] - g6 := g[6] - g7 := g[7] - g8 := g[8] - g9 := g[9] - g1_19 := 19 * g1 // 1.4*2^29 - g2_19 := 19 * g2 // 1.4*2^30; still ok - g3_19 := 19 * g3 - g4_19 := 19 * g4 - g5_19 := 19 * g5 - g6_19 := 19 * g6 - g7_19 := 19 * g7 - g8_19 := 19 * g8 - g9_19 := 19 * g9 - f1_2 := 2 * f1 - f3_2 := 2 * f3 - f5_2 := 2 * f5 - f7_2 := 2 * f7 - f9_2 := 2 * f9 - f0g0 := int64(f0) * int64(g0) - f0g1 := int64(f0) * int64(g1) - f0g2 := int64(f0) * int64(g2) - f0g3 := int64(f0) * int64(g3) - f0g4 := int64(f0) * int64(g4) - f0g5 := int64(f0) * int64(g5) - f0g6 := int64(f0) * int64(g6) - f0g7 := int64(f0) * int64(g7) - f0g8 := int64(f0) * int64(g8) - f0g9 := int64(f0) * int64(g9) - f1g0 := int64(f1) * int64(g0) - f1g1_2 := int64(f1_2) * int64(g1) - f1g2 := int64(f1) * int64(g2) - f1g3_2 := int64(f1_2) * int64(g3) - f1g4 := int64(f1) * int64(g4) - f1g5_2 := int64(f1_2) * int64(g5) - f1g6 := int64(f1) * int64(g6) - f1g7_2 := int64(f1_2) * int64(g7) - f1g8 := int64(f1) * int64(g8) - f1g9_38 := int64(f1_2) * int64(g9_19) - f2g0 := int64(f2) * int64(g0) - f2g1 := int64(f2) * int64(g1) - f2g2 := int64(f2) * int64(g2) - f2g3 := int64(f2) * int64(g3) - f2g4 := int64(f2) * int64(g4) - f2g5 := int64(f2) * int64(g5) - f2g6 := int64(f2) * int64(g6) - f2g7 := int64(f2) * int64(g7) - f2g8_19 := int64(f2) * int64(g8_19) - f2g9_19 := int64(f2) * int64(g9_19) - f3g0 := int64(f3) * int64(g0) - f3g1_2 := int64(f3_2) * int64(g1) - f3g2 := int64(f3) * int64(g2) - f3g3_2 := int64(f3_2) * int64(g3) - f3g4 := int64(f3) * int64(g4) - f3g5_2 := int64(f3_2) * int64(g5) - f3g6 := int64(f3) * int64(g6) - f3g7_38 := int64(f3_2) * int64(g7_19) - f3g8_19 := int64(f3) * int64(g8_19) - f3g9_38 := int64(f3_2) * int64(g9_19) - f4g0 := int64(f4) * int64(g0) - f4g1 := int64(f4) * int64(g1) - f4g2 := int64(f4) * int64(g2) - f4g3 := int64(f4) * int64(g3) - f4g4 := int64(f4) * int64(g4) - f4g5 := int64(f4) * int64(g5) - f4g6_19 := int64(f4) * int64(g6_19) - f4g7_19 := int64(f4) * int64(g7_19) - f4g8_19 := int64(f4) * int64(g8_19) - f4g9_19 := int64(f4) * int64(g9_19) - f5g0 := int64(f5) * int64(g0) - f5g1_2 := int64(f5_2) * int64(g1) - f5g2 := int64(f5) * int64(g2) - f5g3_2 := int64(f5_2) * int64(g3) - f5g4 := int64(f5) * int64(g4) - f5g5_38 := int64(f5_2) * int64(g5_19) - f5g6_19 := int64(f5) * int64(g6_19) - f5g7_38 := int64(f5_2) * int64(g7_19) - f5g8_19 := int64(f5) * int64(g8_19) - f5g9_38 := int64(f5_2) * int64(g9_19) - f6g0 := int64(f6) * int64(g0) - f6g1 := int64(f6) * int64(g1) - f6g2 := int64(f6) * int64(g2) - f6g3 := int64(f6) * int64(g3) - f6g4_19 := int64(f6) * int64(g4_19) - f6g5_19 := int64(f6) * int64(g5_19) - f6g6_19 := int64(f6) * int64(g6_19) - f6g7_19 := int64(f6) * int64(g7_19) - f6g8_19 := int64(f6) * int64(g8_19) - f6g9_19 := int64(f6) * int64(g9_19) - f7g0 := int64(f7) * int64(g0) - f7g1_2 := int64(f7_2) * int64(g1) - f7g2 := int64(f7) * int64(g2) - f7g3_38 := int64(f7_2) * int64(g3_19) - f7g4_19 := int64(f7) * int64(g4_19) - f7g5_38 := int64(f7_2) * int64(g5_19) - f7g6_19 := int64(f7) * int64(g6_19) - f7g7_38 := int64(f7_2) * int64(g7_19) - f7g8_19 := int64(f7) * int64(g8_19) - f7g9_38 := int64(f7_2) * int64(g9_19) - f8g0 := int64(f8) * int64(g0) - f8g1 := int64(f8) * int64(g1) - f8g2_19 := int64(f8) * int64(g2_19) - f8g3_19 := int64(f8) * int64(g3_19) - f8g4_19 := int64(f8) * int64(g4_19) - f8g5_19 := int64(f8) * int64(g5_19) - f8g6_19 := int64(f8) * int64(g6_19) - f8g7_19 := int64(f8) * int64(g7_19) - f8g8_19 := int64(f8) * int64(g8_19) - f8g9_19 := int64(f8) * int64(g9_19) - f9g0 := int64(f9) * int64(g0) - f9g1_38 := int64(f9_2) * int64(g1_19) - f9g2_19 := int64(f9) * int64(g2_19) - f9g3_38 := int64(f9_2) * int64(g3_19) - f9g4_19 := int64(f9) * int64(g4_19) - f9g5_38 := int64(f9_2) * int64(g5_19) - f9g6_19 := int64(f9) * int64(g6_19) - f9g7_38 := int64(f9_2) * int64(g7_19) - f9g8_19 := int64(f9) * int64(g8_19) - f9g9_38 := int64(f9_2) * int64(g9_19) - h0 := f0g0 + f1g9_38 + f2g8_19 + f3g7_38 + f4g6_19 + f5g5_38 + f6g4_19 + f7g3_38 + f8g2_19 + f9g1_38 - h1 := f0g1 + f1g0 + f2g9_19 + f3g8_19 + f4g7_19 + f5g6_19 + f6g5_19 + f7g4_19 + f8g3_19 + f9g2_19 - h2 := f0g2 + f1g1_2 + f2g0 + f3g9_38 + f4g8_19 + f5g7_38 + f6g6_19 + f7g5_38 + f8g4_19 + f9g3_38 - h3 := f0g3 + f1g2 + f2g1 + f3g0 + f4g9_19 + f5g8_19 + f6g7_19 + f7g6_19 + f8g5_19 + f9g4_19 - h4 := f0g4 + f1g3_2 + f2g2 + f3g1_2 + f4g0 + f5g9_38 + f6g8_19 + f7g7_38 + f8g6_19 + f9g5_38 - h5 := f0g5 + f1g4 + f2g3 + f3g2 + f4g1 + f5g0 + f6g9_19 + f7g8_19 + f8g7_19 + f9g6_19 - h6 := f0g6 + f1g5_2 + f2g4 + f3g3_2 + f4g2 + f5g1_2 + f6g0 + f7g9_38 + f8g8_19 + f9g7_38 - h7 := f0g7 + f1g6 + f2g5 + f3g4 + f4g3 + f5g2 + f6g1 + f7g0 + f8g9_19 + f9g8_19 - h8 := f0g8 + f1g7_2 + f2g6 + f3g5_2 + f4g4 + f5g3_2 + f6g2 + f7g1_2 + f8g0 + f9g9_38 - h9 := f0g9 + f1g8 + f2g7 + f3g6 + f4g5 + f5g4 + f6g3 + f7g2 + f8g1 + f9g0 - var carry [10]int64 - - // |h0| <= (1.1*1.1*2^52*(1+19+19+19+19)+1.1*1.1*2^50*(38+38+38+38+38)) - // i.e. |h0| <= 1.2*2^59; narrower ranges for h2, h4, h6, h8 - // |h1| <= (1.1*1.1*2^51*(1+1+19+19+19+19+19+19+19+19)) - // i.e. |h1| <= 1.5*2^58; narrower ranges for h3, h5, h7, h9 - - carry[0] = (h0 + (1 << 25)) >> 26 - h1 += carry[0] - h0 -= carry[0] << 26 - carry[4] = (h4 + (1 << 25)) >> 26 - h5 += carry[4] - h4 -= carry[4] << 26 - // |h0| <= 2^25 - // |h4| <= 2^25 - // |h1| <= 1.51*2^58 - // |h5| <= 1.51*2^58 - - carry[1] = (h1 + (1 << 24)) >> 25 - h2 += carry[1] - h1 -= carry[1] << 25 - carry[5] = (h5 + (1 << 24)) >> 25 - h6 += carry[5] - h5 -= carry[5] << 25 - // |h1| <= 2^24; from now on fits into int32 - // |h5| <= 2^24; from now on fits into int32 - // |h2| <= 1.21*2^59 - // |h6| <= 1.21*2^59 - - carry[2] = (h2 + (1 << 25)) >> 26 - h3 += carry[2] - h2 -= carry[2] << 26 - carry[6] = (h6 + (1 << 25)) >> 26 - h7 += carry[6] - h6 -= carry[6] << 26 - // |h2| <= 2^25; from now on fits into int32 unchanged - // |h6| <= 2^25; from now on fits into int32 unchanged - // |h3| <= 1.51*2^58 - // |h7| <= 1.51*2^58 - - carry[3] = (h3 + (1 << 24)) >> 25 - h4 += carry[3] - h3 -= carry[3] << 25 - carry[7] = (h7 + (1 << 24)) >> 25 - h8 += carry[7] - h7 -= carry[7] << 25 - // |h3| <= 2^24; from now on fits into int32 unchanged - // |h7| <= 2^24; from now on fits into int32 unchanged - // |h4| <= 1.52*2^33 - // |h8| <= 1.52*2^33 - - carry[4] = (h4 + (1 << 25)) >> 26 - h5 += carry[4] - h4 -= carry[4] << 26 - carry[8] = (h8 + (1 << 25)) >> 26 - h9 += carry[8] - h8 -= carry[8] << 26 - // |h4| <= 2^25; from now on fits into int32 unchanged - // |h8| <= 2^25; from now on fits into int32 unchanged - // |h5| <= 1.01*2^24 - // |h9| <= 1.51*2^58 - - carry[9] = (h9 + (1 << 24)) >> 25 - h0 += carry[9] * 19 - h9 -= carry[9] << 25 - // |h9| <= 2^24; from now on fits into int32 unchanged - // |h0| <= 1.8*2^37 - - carry[0] = (h0 + (1 << 25)) >> 26 - h1 += carry[0] - h0 -= carry[0] << 26 - // |h0| <= 2^25; from now on fits into int32 unchanged - // |h1| <= 1.01*2^24 - - h[0] = int32(h0) - h[1] = int32(h1) - h[2] = int32(h2) - h[3] = int32(h3) - h[4] = int32(h4) - h[5] = int32(h5) - h[6] = int32(h6) - h[7] = int32(h7) - h[8] = int32(h8) - h[9] = int32(h9) -} - -// feSquare calculates h = f*f. Can overlap h with f. -// -// Preconditions: -// |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. -// -// Postconditions: -// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. -func feSquare(h, f *fieldElement) { - f0 := f[0] - f1 := f[1] - f2 := f[2] - f3 := f[3] - f4 := f[4] - f5 := f[5] - f6 := f[6] - f7 := f[7] - f8 := f[8] - f9 := f[9] - f0_2 := 2 * f0 - f1_2 := 2 * f1 - f2_2 := 2 * f2 - f3_2 := 2 * f3 - f4_2 := 2 * f4 - f5_2 := 2 * f5 - f6_2 := 2 * f6 - f7_2 := 2 * f7 - f5_38 := 38 * f5 // 1.31*2^30 - f6_19 := 19 * f6 // 1.31*2^30 - f7_38 := 38 * f7 // 1.31*2^30 - f8_19 := 19 * f8 // 1.31*2^30 - f9_38 := 38 * f9 // 1.31*2^30 - f0f0 := int64(f0) * int64(f0) - f0f1_2 := int64(f0_2) * int64(f1) - f0f2_2 := int64(f0_2) * int64(f2) - f0f3_2 := int64(f0_2) * int64(f3) - f0f4_2 := int64(f0_2) * int64(f4) - f0f5_2 := int64(f0_2) * int64(f5) - f0f6_2 := int64(f0_2) * int64(f6) - f0f7_2 := int64(f0_2) * int64(f7) - f0f8_2 := int64(f0_2) * int64(f8) - f0f9_2 := int64(f0_2) * int64(f9) - f1f1_2 := int64(f1_2) * int64(f1) - f1f2_2 := int64(f1_2) * int64(f2) - f1f3_4 := int64(f1_2) * int64(f3_2) - f1f4_2 := int64(f1_2) * int64(f4) - f1f5_4 := int64(f1_2) * int64(f5_2) - f1f6_2 := int64(f1_2) * int64(f6) - f1f7_4 := int64(f1_2) * int64(f7_2) - f1f8_2 := int64(f1_2) * int64(f8) - f1f9_76 := int64(f1_2) * int64(f9_38) - f2f2 := int64(f2) * int64(f2) - f2f3_2 := int64(f2_2) * int64(f3) - f2f4_2 := int64(f2_2) * int64(f4) - f2f5_2 := int64(f2_2) * int64(f5) - f2f6_2 := int64(f2_2) * int64(f6) - f2f7_2 := int64(f2_2) * int64(f7) - f2f8_38 := int64(f2_2) * int64(f8_19) - f2f9_38 := int64(f2) * int64(f9_38) - f3f3_2 := int64(f3_2) * int64(f3) - f3f4_2 := int64(f3_2) * int64(f4) - f3f5_4 := int64(f3_2) * int64(f5_2) - f3f6_2 := int64(f3_2) * int64(f6) - f3f7_76 := int64(f3_2) * int64(f7_38) - f3f8_38 := int64(f3_2) * int64(f8_19) - f3f9_76 := int64(f3_2) * int64(f9_38) - f4f4 := int64(f4) * int64(f4) - f4f5_2 := int64(f4_2) * int64(f5) - f4f6_38 := int64(f4_2) * int64(f6_19) - f4f7_38 := int64(f4) * int64(f7_38) - f4f8_38 := int64(f4_2) * int64(f8_19) - f4f9_38 := int64(f4) * int64(f9_38) - f5f5_38 := int64(f5) * int64(f5_38) - f5f6_38 := int64(f5_2) * int64(f6_19) - f5f7_76 := int64(f5_2) * int64(f7_38) - f5f8_38 := int64(f5_2) * int64(f8_19) - f5f9_76 := int64(f5_2) * int64(f9_38) - f6f6_19 := int64(f6) * int64(f6_19) - f6f7_38 := int64(f6) * int64(f7_38) - f6f8_38 := int64(f6_2) * int64(f8_19) - f6f9_38 := int64(f6) * int64(f9_38) - f7f7_38 := int64(f7) * int64(f7_38) - f7f8_38 := int64(f7_2) * int64(f8_19) - f7f9_76 := int64(f7_2) * int64(f9_38) - f8f8_19 := int64(f8) * int64(f8_19) - f8f9_38 := int64(f8) * int64(f9_38) - f9f9_38 := int64(f9) * int64(f9_38) - h0 := f0f0 + f1f9_76 + f2f8_38 + f3f7_76 + f4f6_38 + f5f5_38 - h1 := f0f1_2 + f2f9_38 + f3f8_38 + f4f7_38 + f5f6_38 - h2 := f0f2_2 + f1f1_2 + f3f9_76 + f4f8_38 + f5f7_76 + f6f6_19 - h3 := f0f3_2 + f1f2_2 + f4f9_38 + f5f8_38 + f6f7_38 - h4 := f0f4_2 + f1f3_4 + f2f2 + f5f9_76 + f6f8_38 + f7f7_38 - h5 := f0f5_2 + f1f4_2 + f2f3_2 + f6f9_38 + f7f8_38 - h6 := f0f6_2 + f1f5_4 + f2f4_2 + f3f3_2 + f7f9_76 + f8f8_19 - h7 := f0f7_2 + f1f6_2 + f2f5_2 + f3f4_2 + f8f9_38 - h8 := f0f8_2 + f1f7_4 + f2f6_2 + f3f5_4 + f4f4 + f9f9_38 - h9 := f0f9_2 + f1f8_2 + f2f7_2 + f3f6_2 + f4f5_2 - var carry [10]int64 - - carry[0] = (h0 + (1 << 25)) >> 26 - h1 += carry[0] - h0 -= carry[0] << 26 - carry[4] = (h4 + (1 << 25)) >> 26 - h5 += carry[4] - h4 -= carry[4] << 26 - - carry[1] = (h1 + (1 << 24)) >> 25 - h2 += carry[1] - h1 -= carry[1] << 25 - carry[5] = (h5 + (1 << 24)) >> 25 - h6 += carry[5] - h5 -= carry[5] << 25 - - carry[2] = (h2 + (1 << 25)) >> 26 - h3 += carry[2] - h2 -= carry[2] << 26 - carry[6] = (h6 + (1 << 25)) >> 26 - h7 += carry[6] - h6 -= carry[6] << 26 - - carry[3] = (h3 + (1 << 24)) >> 25 - h4 += carry[3] - h3 -= carry[3] << 25 - carry[7] = (h7 + (1 << 24)) >> 25 - h8 += carry[7] - h7 -= carry[7] << 25 - - carry[4] = (h4 + (1 << 25)) >> 26 - h5 += carry[4] - h4 -= carry[4] << 26 - carry[8] = (h8 + (1 << 25)) >> 26 - h9 += carry[8] - h8 -= carry[8] << 26 - - carry[9] = (h9 + (1 << 24)) >> 25 - h0 += carry[9] * 19 - h9 -= carry[9] << 25 - - carry[0] = (h0 + (1 << 25)) >> 26 - h1 += carry[0] - h0 -= carry[0] << 26 - - h[0] = int32(h0) - h[1] = int32(h1) - h[2] = int32(h2) - h[3] = int32(h3) - h[4] = int32(h4) - h[5] = int32(h5) - h[6] = int32(h6) - h[7] = int32(h7) - h[8] = int32(h8) - h[9] = int32(h9) -} - -// feMul121666 calculates h = f * 121666. Can overlap h with f. -// -// Preconditions: -// |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. -// -// Postconditions: -// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. -func feMul121666(h, f *fieldElement) { - h0 := int64(f[0]) * 121666 - h1 := int64(f[1]) * 121666 - h2 := int64(f[2]) * 121666 - h3 := int64(f[3]) * 121666 - h4 := int64(f[4]) * 121666 - h5 := int64(f[5]) * 121666 - h6 := int64(f[6]) * 121666 - h7 := int64(f[7]) * 121666 - h8 := int64(f[8]) * 121666 - h9 := int64(f[9]) * 121666 - var carry [10]int64 - - carry[9] = (h9 + (1 << 24)) >> 25 - h0 += carry[9] * 19 - h9 -= carry[9] << 25 - carry[1] = (h1 + (1 << 24)) >> 25 - h2 += carry[1] - h1 -= carry[1] << 25 - carry[3] = (h3 + (1 << 24)) >> 25 - h4 += carry[3] - h3 -= carry[3] << 25 - carry[5] = (h5 + (1 << 24)) >> 25 - h6 += carry[5] - h5 -= carry[5] << 25 - carry[7] = (h7 + (1 << 24)) >> 25 - h8 += carry[7] - h7 -= carry[7] << 25 - - carry[0] = (h0 + (1 << 25)) >> 26 - h1 += carry[0] - h0 -= carry[0] << 26 - carry[2] = (h2 + (1 << 25)) >> 26 - h3 += carry[2] - h2 -= carry[2] << 26 - carry[4] = (h4 + (1 << 25)) >> 26 - h5 += carry[4] - h4 -= carry[4] << 26 - carry[6] = (h6 + (1 << 25)) >> 26 - h7 += carry[6] - h6 -= carry[6] << 26 - carry[8] = (h8 + (1 << 25)) >> 26 - h9 += carry[8] - h8 -= carry[8] << 26 - - h[0] = int32(h0) - h[1] = int32(h1) - h[2] = int32(h2) - h[3] = int32(h3) - h[4] = int32(h4) - h[5] = int32(h5) - h[6] = int32(h6) - h[7] = int32(h7) - h[8] = int32(h8) - h[9] = int32(h9) -} - -// feInvert sets out = z^-1. -func feInvert(out, z *fieldElement) { - var t0, t1, t2, t3 fieldElement - var i int - - feSquare(&t0, z) - for i = 1; i < 1; i++ { - feSquare(&t0, &t0) - } - feSquare(&t1, &t0) - for i = 1; i < 2; i++ { - feSquare(&t1, &t1) - } - feMul(&t1, z, &t1) - feMul(&t0, &t0, &t1) - feSquare(&t2, &t0) - for i = 1; i < 1; i++ { - feSquare(&t2, &t2) - } - feMul(&t1, &t1, &t2) - feSquare(&t2, &t1) - for i = 1; i < 5; i++ { - feSquare(&t2, &t2) - } - feMul(&t1, &t2, &t1) - feSquare(&t2, &t1) - for i = 1; i < 10; i++ { - feSquare(&t2, &t2) - } - feMul(&t2, &t2, &t1) - feSquare(&t3, &t2) - for i = 1; i < 20; i++ { - feSquare(&t3, &t3) - } - feMul(&t2, &t3, &t2) - feSquare(&t2, &t2) - for i = 1; i < 10; i++ { - feSquare(&t2, &t2) - } - feMul(&t1, &t2, &t1) - feSquare(&t2, &t1) - for i = 1; i < 50; i++ { - feSquare(&t2, &t2) - } - feMul(&t2, &t2, &t1) - feSquare(&t3, &t2) - for i = 1; i < 100; i++ { - feSquare(&t3, &t3) - } - feMul(&t2, &t3, &t2) - feSquare(&t2, &t2) - for i = 1; i < 50; i++ { - feSquare(&t2, &t2) - } - feMul(&t1, &t2, &t1) - feSquare(&t1, &t1) - for i = 1; i < 5; i++ { - feSquare(&t1, &t1) - } - feMul(out, &t1, &t0) -} - -func scalarMult(out, in, base *[32]byte) { - var e [32]byte - - copy(e[:], in[:]) - e[0] &= 248 - e[31] &= 127 - e[31] |= 64 - - var x1, x2, z2, x3, z3, tmp0, tmp1 fieldElement - feFromBytes(&x1, base) - feOne(&x2) - feCopy(&x3, &x1) - feOne(&z3) - - swap := int32(0) - for pos := 254; pos >= 0; pos-- { - b := e[pos/8] >> uint(pos&7) - b &= 1 - swap ^= int32(b) - feCSwap(&x2, &x3, swap) - feCSwap(&z2, &z3, swap) - swap = int32(b) - - feSub(&tmp0, &x3, &z3) - feSub(&tmp1, &x2, &z2) - feAdd(&x2, &x2, &z2) - feAdd(&z2, &x3, &z3) - feMul(&z3, &tmp0, &x2) - feMul(&z2, &z2, &tmp1) - feSquare(&tmp0, &tmp1) - feSquare(&tmp1, &x2) - feAdd(&x3, &z3, &z2) - feSub(&z2, &z3, &z2) - feMul(&x2, &tmp1, &tmp0) - feSub(&tmp1, &tmp1, &tmp0) - feSquare(&z2, &z2) - feMul121666(&z3, &tmp1) - feSquare(&x3, &x3) - feAdd(&tmp0, &tmp0, &z3) - feMul(&z3, &x1, &z2) - feMul(&z2, &tmp1, &tmp0) - } - - feCSwap(&x2, &x3, swap) - feCSwap(&z2, &z3, swap) - - feInvert(&z2, &z2) - feMul(&x2, &x2, &z2) - feToBytes(out, &x2) -} diff --git a/vendor/golang.org/x/crypto/curve25519/curve25519_test.go b/vendor/golang.org/x/crypto/curve25519/curve25519_test.go deleted file mode 100644 index 14b0ee87c..000000000 --- a/vendor/golang.org/x/crypto/curve25519/curve25519_test.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package curve25519 - -import ( - "fmt" - "testing" -) - -const expectedHex = "89161fde887b2b53de549af483940106ecc114d6982daa98256de23bdf77661a" - -func TestBaseScalarMult(t *testing.T) { - var a, b [32]byte - in := &a - out := &b - a[0] = 1 - - for i := 0; i < 200; i++ { - ScalarBaseMult(out, in) - in, out = out, in - } - - result := fmt.Sprintf("%x", in[:]) - if result != expectedHex { - t.Errorf("incorrect result: got %s, want %s", result, expectedHex) - } -} diff --git a/vendor/golang.org/x/crypto/curve25519/doc.go b/vendor/golang.org/x/crypto/curve25519/doc.go deleted file mode 100644 index ebeea3c2d..000000000 --- a/vendor/golang.org/x/crypto/curve25519/doc.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package curve25519 provides an implementation of scalar multiplication on -// the elliptic curve known as curve25519. See http://cr.yp.to/ecdh.html -package curve25519 // import "golang.org/x/crypto/curve25519" - -// basePoint is the x coordinate of the generator of the curve. -var basePoint = [32]byte{9, 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} - -// ScalarMult sets dst to the product in*base where dst and base are the x -// coordinates of group points and all values are in little-endian form. -func ScalarMult(dst, in, base *[32]byte) { - scalarMult(dst, in, base) -} - -// ScalarBaseMult sets dst to the product in*base where dst and base are the x -// coordinates of group points, base is the standard generator and all values -// are in little-endian form. -func ScalarBaseMult(dst, in *[32]byte) { - ScalarMult(dst, in, &basePoint) -} diff --git a/vendor/golang.org/x/crypto/curve25519/freeze_amd64.s b/vendor/golang.org/x/crypto/curve25519/freeze_amd64.s deleted file mode 100644 index 536479bf6..000000000 --- a/vendor/golang.org/x/crypto/curve25519/freeze_amd64.s +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This code was translated into a form compatible with 6a from the public -// domain sources in SUPERCOP: http://bench.cr.yp.to/supercop.html - -// +build amd64,!gccgo,!appengine - -#include "const_amd64.h" - -// func freeze(inout *[5]uint64) -TEXT ·freeze(SB),7,$0-8 - MOVQ inout+0(FP), DI - - MOVQ 0(DI),SI - MOVQ 8(DI),DX - MOVQ 16(DI),CX - MOVQ 24(DI),R8 - MOVQ 32(DI),R9 - MOVQ $REDMASK51,AX - MOVQ AX,R10 - SUBQ $18,R10 - MOVQ $3,R11 -REDUCELOOP: - MOVQ SI,R12 - SHRQ $51,R12 - ANDQ AX,SI - ADDQ R12,DX - MOVQ DX,R12 - SHRQ $51,R12 - ANDQ AX,DX - ADDQ R12,CX - MOVQ CX,R12 - SHRQ $51,R12 - ANDQ AX,CX - ADDQ R12,R8 - MOVQ R8,R12 - SHRQ $51,R12 - ANDQ AX,R8 - ADDQ R12,R9 - MOVQ R9,R12 - SHRQ $51,R12 - ANDQ AX,R9 - IMUL3Q $19,R12,R12 - ADDQ R12,SI - SUBQ $1,R11 - JA REDUCELOOP - MOVQ $1,R12 - CMPQ R10,SI - CMOVQLT R11,R12 - CMPQ AX,DX - CMOVQNE R11,R12 - CMPQ AX,CX - CMOVQNE R11,R12 - CMPQ AX,R8 - CMOVQNE R11,R12 - CMPQ AX,R9 - CMOVQNE R11,R12 - NEGQ R12 - ANDQ R12,AX - ANDQ R12,R10 - SUBQ R10,SI - SUBQ AX,DX - SUBQ AX,CX - SUBQ AX,R8 - SUBQ AX,R9 - MOVQ SI,0(DI) - MOVQ DX,8(DI) - MOVQ CX,16(DI) - MOVQ R8,24(DI) - MOVQ R9,32(DI) - RET diff --git a/vendor/golang.org/x/crypto/curve25519/ladderstep_amd64.s b/vendor/golang.org/x/crypto/curve25519/ladderstep_amd64.s deleted file mode 100644 index 7074e5cd9..000000000 --- a/vendor/golang.org/x/crypto/curve25519/ladderstep_amd64.s +++ /dev/null @@ -1,1377 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This code was translated into a form compatible with 6a from the public -// domain sources in SUPERCOP: http://bench.cr.yp.to/supercop.html - -// +build amd64,!gccgo,!appengine - -#include "const_amd64.h" - -// func ladderstep(inout *[5][5]uint64) -TEXT ·ladderstep(SB),0,$296-8 - MOVQ inout+0(FP),DI - - MOVQ 40(DI),SI - MOVQ 48(DI),DX - MOVQ 56(DI),CX - MOVQ 64(DI),R8 - MOVQ 72(DI),R9 - MOVQ SI,AX - MOVQ DX,R10 - MOVQ CX,R11 - MOVQ R8,R12 - MOVQ R9,R13 - ADDQ ·_2P0(SB),AX - ADDQ ·_2P1234(SB),R10 - ADDQ ·_2P1234(SB),R11 - ADDQ ·_2P1234(SB),R12 - ADDQ ·_2P1234(SB),R13 - ADDQ 80(DI),SI - ADDQ 88(DI),DX - ADDQ 96(DI),CX - ADDQ 104(DI),R8 - ADDQ 112(DI),R9 - SUBQ 80(DI),AX - SUBQ 88(DI),R10 - SUBQ 96(DI),R11 - SUBQ 104(DI),R12 - SUBQ 112(DI),R13 - MOVQ SI,0(SP) - MOVQ DX,8(SP) - MOVQ CX,16(SP) - MOVQ R8,24(SP) - MOVQ R9,32(SP) - MOVQ AX,40(SP) - MOVQ R10,48(SP) - MOVQ R11,56(SP) - MOVQ R12,64(SP) - MOVQ R13,72(SP) - MOVQ 40(SP),AX - MULQ 40(SP) - MOVQ AX,SI - MOVQ DX,CX - MOVQ 40(SP),AX - SHLQ $1,AX - MULQ 48(SP) - MOVQ AX,R8 - MOVQ DX,R9 - MOVQ 40(SP),AX - SHLQ $1,AX - MULQ 56(SP) - MOVQ AX,R10 - MOVQ DX,R11 - MOVQ 40(SP),AX - SHLQ $1,AX - MULQ 64(SP) - MOVQ AX,R12 - MOVQ DX,R13 - MOVQ 40(SP),AX - SHLQ $1,AX - MULQ 72(SP) - MOVQ AX,R14 - MOVQ DX,R15 - MOVQ 48(SP),AX - MULQ 48(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 48(SP),AX - SHLQ $1,AX - MULQ 56(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 48(SP),AX - SHLQ $1,AX - MULQ 64(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 48(SP),DX - IMUL3Q $38,DX,AX - MULQ 72(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 56(SP),AX - MULQ 56(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 56(SP),DX - IMUL3Q $38,DX,AX - MULQ 64(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 56(SP),DX - IMUL3Q $38,DX,AX - MULQ 72(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 64(SP),DX - IMUL3Q $19,DX,AX - MULQ 64(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 64(SP),DX - IMUL3Q $38,DX,AX - MULQ 72(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 72(SP),DX - IMUL3Q $19,DX,AX - MULQ 72(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ $REDMASK51,DX - SHLQ $13,CX:SI - ANDQ DX,SI - SHLQ $13,R9:R8 - ANDQ DX,R8 - ADDQ CX,R8 - SHLQ $13,R11:R10 - ANDQ DX,R10 - ADDQ R9,R10 - SHLQ $13,R13:R12 - ANDQ DX,R12 - ADDQ R11,R12 - SHLQ $13,R15:R14 - ANDQ DX,R14 - ADDQ R13,R14 - IMUL3Q $19,R15,CX - ADDQ CX,SI - MOVQ SI,CX - SHRQ $51,CX - ADDQ R8,CX - ANDQ DX,SI - MOVQ CX,R8 - SHRQ $51,CX - ADDQ R10,CX - ANDQ DX,R8 - MOVQ CX,R9 - SHRQ $51,CX - ADDQ R12,CX - ANDQ DX,R9 - MOVQ CX,AX - SHRQ $51,CX - ADDQ R14,CX - ANDQ DX,AX - MOVQ CX,R10 - SHRQ $51,CX - IMUL3Q $19,CX,CX - ADDQ CX,SI - ANDQ DX,R10 - MOVQ SI,80(SP) - MOVQ R8,88(SP) - MOVQ R9,96(SP) - MOVQ AX,104(SP) - MOVQ R10,112(SP) - MOVQ 0(SP),AX - MULQ 0(SP) - MOVQ AX,SI - MOVQ DX,CX - MOVQ 0(SP),AX - SHLQ $1,AX - MULQ 8(SP) - MOVQ AX,R8 - MOVQ DX,R9 - MOVQ 0(SP),AX - SHLQ $1,AX - MULQ 16(SP) - MOVQ AX,R10 - MOVQ DX,R11 - MOVQ 0(SP),AX - SHLQ $1,AX - MULQ 24(SP) - MOVQ AX,R12 - MOVQ DX,R13 - MOVQ 0(SP),AX - SHLQ $1,AX - MULQ 32(SP) - MOVQ AX,R14 - MOVQ DX,R15 - MOVQ 8(SP),AX - MULQ 8(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 8(SP),AX - SHLQ $1,AX - MULQ 16(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 8(SP),AX - SHLQ $1,AX - MULQ 24(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 8(SP),DX - IMUL3Q $38,DX,AX - MULQ 32(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 16(SP),AX - MULQ 16(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 16(SP),DX - IMUL3Q $38,DX,AX - MULQ 24(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 16(SP),DX - IMUL3Q $38,DX,AX - MULQ 32(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 24(SP),DX - IMUL3Q $19,DX,AX - MULQ 24(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 24(SP),DX - IMUL3Q $38,DX,AX - MULQ 32(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 32(SP),DX - IMUL3Q $19,DX,AX - MULQ 32(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ $REDMASK51,DX - SHLQ $13,CX:SI - ANDQ DX,SI - SHLQ $13,R9:R8 - ANDQ DX,R8 - ADDQ CX,R8 - SHLQ $13,R11:R10 - ANDQ DX,R10 - ADDQ R9,R10 - SHLQ $13,R13:R12 - ANDQ DX,R12 - ADDQ R11,R12 - SHLQ $13,R15:R14 - ANDQ DX,R14 - ADDQ R13,R14 - IMUL3Q $19,R15,CX - ADDQ CX,SI - MOVQ SI,CX - SHRQ $51,CX - ADDQ R8,CX - ANDQ DX,SI - MOVQ CX,R8 - SHRQ $51,CX - ADDQ R10,CX - ANDQ DX,R8 - MOVQ CX,R9 - SHRQ $51,CX - ADDQ R12,CX - ANDQ DX,R9 - MOVQ CX,AX - SHRQ $51,CX - ADDQ R14,CX - ANDQ DX,AX - MOVQ CX,R10 - SHRQ $51,CX - IMUL3Q $19,CX,CX - ADDQ CX,SI - ANDQ DX,R10 - MOVQ SI,120(SP) - MOVQ R8,128(SP) - MOVQ R9,136(SP) - MOVQ AX,144(SP) - MOVQ R10,152(SP) - MOVQ SI,SI - MOVQ R8,DX - MOVQ R9,CX - MOVQ AX,R8 - MOVQ R10,R9 - ADDQ ·_2P0(SB),SI - ADDQ ·_2P1234(SB),DX - ADDQ ·_2P1234(SB),CX - ADDQ ·_2P1234(SB),R8 - ADDQ ·_2P1234(SB),R9 - SUBQ 80(SP),SI - SUBQ 88(SP),DX - SUBQ 96(SP),CX - SUBQ 104(SP),R8 - SUBQ 112(SP),R9 - MOVQ SI,160(SP) - MOVQ DX,168(SP) - MOVQ CX,176(SP) - MOVQ R8,184(SP) - MOVQ R9,192(SP) - MOVQ 120(DI),SI - MOVQ 128(DI),DX - MOVQ 136(DI),CX - MOVQ 144(DI),R8 - MOVQ 152(DI),R9 - MOVQ SI,AX - MOVQ DX,R10 - MOVQ CX,R11 - MOVQ R8,R12 - MOVQ R9,R13 - ADDQ ·_2P0(SB),AX - ADDQ ·_2P1234(SB),R10 - ADDQ ·_2P1234(SB),R11 - ADDQ ·_2P1234(SB),R12 - ADDQ ·_2P1234(SB),R13 - ADDQ 160(DI),SI - ADDQ 168(DI),DX - ADDQ 176(DI),CX - ADDQ 184(DI),R8 - ADDQ 192(DI),R9 - SUBQ 160(DI),AX - SUBQ 168(DI),R10 - SUBQ 176(DI),R11 - SUBQ 184(DI),R12 - SUBQ 192(DI),R13 - MOVQ SI,200(SP) - MOVQ DX,208(SP) - MOVQ CX,216(SP) - MOVQ R8,224(SP) - MOVQ R9,232(SP) - MOVQ AX,240(SP) - MOVQ R10,248(SP) - MOVQ R11,256(SP) - MOVQ R12,264(SP) - MOVQ R13,272(SP) - MOVQ 224(SP),SI - IMUL3Q $19,SI,AX - MOVQ AX,280(SP) - MULQ 56(SP) - MOVQ AX,SI - MOVQ DX,CX - MOVQ 232(SP),DX - IMUL3Q $19,DX,AX - MOVQ AX,288(SP) - MULQ 48(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 200(SP),AX - MULQ 40(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 200(SP),AX - MULQ 48(SP) - MOVQ AX,R8 - MOVQ DX,R9 - MOVQ 200(SP),AX - MULQ 56(SP) - MOVQ AX,R10 - MOVQ DX,R11 - MOVQ 200(SP),AX - MULQ 64(SP) - MOVQ AX,R12 - MOVQ DX,R13 - MOVQ 200(SP),AX - MULQ 72(SP) - MOVQ AX,R14 - MOVQ DX,R15 - MOVQ 208(SP),AX - MULQ 40(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 208(SP),AX - MULQ 48(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 208(SP),AX - MULQ 56(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 208(SP),AX - MULQ 64(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 208(SP),DX - IMUL3Q $19,DX,AX - MULQ 72(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 216(SP),AX - MULQ 40(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 216(SP),AX - MULQ 48(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 216(SP),AX - MULQ 56(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 216(SP),DX - IMUL3Q $19,DX,AX - MULQ 64(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 216(SP),DX - IMUL3Q $19,DX,AX - MULQ 72(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 224(SP),AX - MULQ 40(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 224(SP),AX - MULQ 48(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 280(SP),AX - MULQ 64(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 280(SP),AX - MULQ 72(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 232(SP),AX - MULQ 40(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 288(SP),AX - MULQ 56(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 288(SP),AX - MULQ 64(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 288(SP),AX - MULQ 72(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ $REDMASK51,DX - SHLQ $13,CX:SI - ANDQ DX,SI - SHLQ $13,R9:R8 - ANDQ DX,R8 - ADDQ CX,R8 - SHLQ $13,R11:R10 - ANDQ DX,R10 - ADDQ R9,R10 - SHLQ $13,R13:R12 - ANDQ DX,R12 - ADDQ R11,R12 - SHLQ $13,R15:R14 - ANDQ DX,R14 - ADDQ R13,R14 - IMUL3Q $19,R15,CX - ADDQ CX,SI - MOVQ SI,CX - SHRQ $51,CX - ADDQ R8,CX - MOVQ CX,R8 - SHRQ $51,CX - ANDQ DX,SI - ADDQ R10,CX - MOVQ CX,R9 - SHRQ $51,CX - ANDQ DX,R8 - ADDQ R12,CX - MOVQ CX,AX - SHRQ $51,CX - ANDQ DX,R9 - ADDQ R14,CX - MOVQ CX,R10 - SHRQ $51,CX - ANDQ DX,AX - IMUL3Q $19,CX,CX - ADDQ CX,SI - ANDQ DX,R10 - MOVQ SI,40(SP) - MOVQ R8,48(SP) - MOVQ R9,56(SP) - MOVQ AX,64(SP) - MOVQ R10,72(SP) - MOVQ 264(SP),SI - IMUL3Q $19,SI,AX - MOVQ AX,200(SP) - MULQ 16(SP) - MOVQ AX,SI - MOVQ DX,CX - MOVQ 272(SP),DX - IMUL3Q $19,DX,AX - MOVQ AX,208(SP) - MULQ 8(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 240(SP),AX - MULQ 0(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 240(SP),AX - MULQ 8(SP) - MOVQ AX,R8 - MOVQ DX,R9 - MOVQ 240(SP),AX - MULQ 16(SP) - MOVQ AX,R10 - MOVQ DX,R11 - MOVQ 240(SP),AX - MULQ 24(SP) - MOVQ AX,R12 - MOVQ DX,R13 - MOVQ 240(SP),AX - MULQ 32(SP) - MOVQ AX,R14 - MOVQ DX,R15 - MOVQ 248(SP),AX - MULQ 0(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 248(SP),AX - MULQ 8(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 248(SP),AX - MULQ 16(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 248(SP),AX - MULQ 24(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 248(SP),DX - IMUL3Q $19,DX,AX - MULQ 32(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 256(SP),AX - MULQ 0(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 256(SP),AX - MULQ 8(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 256(SP),AX - MULQ 16(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 256(SP),DX - IMUL3Q $19,DX,AX - MULQ 24(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 256(SP),DX - IMUL3Q $19,DX,AX - MULQ 32(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 264(SP),AX - MULQ 0(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 264(SP),AX - MULQ 8(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 200(SP),AX - MULQ 24(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 200(SP),AX - MULQ 32(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 272(SP),AX - MULQ 0(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 208(SP),AX - MULQ 16(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 208(SP),AX - MULQ 24(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 208(SP),AX - MULQ 32(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ $REDMASK51,DX - SHLQ $13,CX:SI - ANDQ DX,SI - SHLQ $13,R9:R8 - ANDQ DX,R8 - ADDQ CX,R8 - SHLQ $13,R11:R10 - ANDQ DX,R10 - ADDQ R9,R10 - SHLQ $13,R13:R12 - ANDQ DX,R12 - ADDQ R11,R12 - SHLQ $13,R15:R14 - ANDQ DX,R14 - ADDQ R13,R14 - IMUL3Q $19,R15,CX - ADDQ CX,SI - MOVQ SI,CX - SHRQ $51,CX - ADDQ R8,CX - MOVQ CX,R8 - SHRQ $51,CX - ANDQ DX,SI - ADDQ R10,CX - MOVQ CX,R9 - SHRQ $51,CX - ANDQ DX,R8 - ADDQ R12,CX - MOVQ CX,AX - SHRQ $51,CX - ANDQ DX,R9 - ADDQ R14,CX - MOVQ CX,R10 - SHRQ $51,CX - ANDQ DX,AX - IMUL3Q $19,CX,CX - ADDQ CX,SI - ANDQ DX,R10 - MOVQ SI,DX - MOVQ R8,CX - MOVQ R9,R11 - MOVQ AX,R12 - MOVQ R10,R13 - ADDQ ·_2P0(SB),DX - ADDQ ·_2P1234(SB),CX - ADDQ ·_2P1234(SB),R11 - ADDQ ·_2P1234(SB),R12 - ADDQ ·_2P1234(SB),R13 - ADDQ 40(SP),SI - ADDQ 48(SP),R8 - ADDQ 56(SP),R9 - ADDQ 64(SP),AX - ADDQ 72(SP),R10 - SUBQ 40(SP),DX - SUBQ 48(SP),CX - SUBQ 56(SP),R11 - SUBQ 64(SP),R12 - SUBQ 72(SP),R13 - MOVQ SI,120(DI) - MOVQ R8,128(DI) - MOVQ R9,136(DI) - MOVQ AX,144(DI) - MOVQ R10,152(DI) - MOVQ DX,160(DI) - MOVQ CX,168(DI) - MOVQ R11,176(DI) - MOVQ R12,184(DI) - MOVQ R13,192(DI) - MOVQ 120(DI),AX - MULQ 120(DI) - MOVQ AX,SI - MOVQ DX,CX - MOVQ 120(DI),AX - SHLQ $1,AX - MULQ 128(DI) - MOVQ AX,R8 - MOVQ DX,R9 - MOVQ 120(DI),AX - SHLQ $1,AX - MULQ 136(DI) - MOVQ AX,R10 - MOVQ DX,R11 - MOVQ 120(DI),AX - SHLQ $1,AX - MULQ 144(DI) - MOVQ AX,R12 - MOVQ DX,R13 - MOVQ 120(DI),AX - SHLQ $1,AX - MULQ 152(DI) - MOVQ AX,R14 - MOVQ DX,R15 - MOVQ 128(DI),AX - MULQ 128(DI) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 128(DI),AX - SHLQ $1,AX - MULQ 136(DI) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 128(DI),AX - SHLQ $1,AX - MULQ 144(DI) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 128(DI),DX - IMUL3Q $38,DX,AX - MULQ 152(DI) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 136(DI),AX - MULQ 136(DI) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 136(DI),DX - IMUL3Q $38,DX,AX - MULQ 144(DI) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 136(DI),DX - IMUL3Q $38,DX,AX - MULQ 152(DI) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 144(DI),DX - IMUL3Q $19,DX,AX - MULQ 144(DI) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 144(DI),DX - IMUL3Q $38,DX,AX - MULQ 152(DI) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 152(DI),DX - IMUL3Q $19,DX,AX - MULQ 152(DI) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ $REDMASK51,DX - SHLQ $13,CX:SI - ANDQ DX,SI - SHLQ $13,R9:R8 - ANDQ DX,R8 - ADDQ CX,R8 - SHLQ $13,R11:R10 - ANDQ DX,R10 - ADDQ R9,R10 - SHLQ $13,R13:R12 - ANDQ DX,R12 - ADDQ R11,R12 - SHLQ $13,R15:R14 - ANDQ DX,R14 - ADDQ R13,R14 - IMUL3Q $19,R15,CX - ADDQ CX,SI - MOVQ SI,CX - SHRQ $51,CX - ADDQ R8,CX - ANDQ DX,SI - MOVQ CX,R8 - SHRQ $51,CX - ADDQ R10,CX - ANDQ DX,R8 - MOVQ CX,R9 - SHRQ $51,CX - ADDQ R12,CX - ANDQ DX,R9 - MOVQ CX,AX - SHRQ $51,CX - ADDQ R14,CX - ANDQ DX,AX - MOVQ CX,R10 - SHRQ $51,CX - IMUL3Q $19,CX,CX - ADDQ CX,SI - ANDQ DX,R10 - MOVQ SI,120(DI) - MOVQ R8,128(DI) - MOVQ R9,136(DI) - MOVQ AX,144(DI) - MOVQ R10,152(DI) - MOVQ 160(DI),AX - MULQ 160(DI) - MOVQ AX,SI - MOVQ DX,CX - MOVQ 160(DI),AX - SHLQ $1,AX - MULQ 168(DI) - MOVQ AX,R8 - MOVQ DX,R9 - MOVQ 160(DI),AX - SHLQ $1,AX - MULQ 176(DI) - MOVQ AX,R10 - MOVQ DX,R11 - MOVQ 160(DI),AX - SHLQ $1,AX - MULQ 184(DI) - MOVQ AX,R12 - MOVQ DX,R13 - MOVQ 160(DI),AX - SHLQ $1,AX - MULQ 192(DI) - MOVQ AX,R14 - MOVQ DX,R15 - MOVQ 168(DI),AX - MULQ 168(DI) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 168(DI),AX - SHLQ $1,AX - MULQ 176(DI) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 168(DI),AX - SHLQ $1,AX - MULQ 184(DI) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 168(DI),DX - IMUL3Q $38,DX,AX - MULQ 192(DI) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 176(DI),AX - MULQ 176(DI) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 176(DI),DX - IMUL3Q $38,DX,AX - MULQ 184(DI) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 176(DI),DX - IMUL3Q $38,DX,AX - MULQ 192(DI) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 184(DI),DX - IMUL3Q $19,DX,AX - MULQ 184(DI) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 184(DI),DX - IMUL3Q $38,DX,AX - MULQ 192(DI) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 192(DI),DX - IMUL3Q $19,DX,AX - MULQ 192(DI) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ $REDMASK51,DX - SHLQ $13,CX:SI - ANDQ DX,SI - SHLQ $13,R9:R8 - ANDQ DX,R8 - ADDQ CX,R8 - SHLQ $13,R11:R10 - ANDQ DX,R10 - ADDQ R9,R10 - SHLQ $13,R13:R12 - ANDQ DX,R12 - ADDQ R11,R12 - SHLQ $13,R15:R14 - ANDQ DX,R14 - ADDQ R13,R14 - IMUL3Q $19,R15,CX - ADDQ CX,SI - MOVQ SI,CX - SHRQ $51,CX - ADDQ R8,CX - ANDQ DX,SI - MOVQ CX,R8 - SHRQ $51,CX - ADDQ R10,CX - ANDQ DX,R8 - MOVQ CX,R9 - SHRQ $51,CX - ADDQ R12,CX - ANDQ DX,R9 - MOVQ CX,AX - SHRQ $51,CX - ADDQ R14,CX - ANDQ DX,AX - MOVQ CX,R10 - SHRQ $51,CX - IMUL3Q $19,CX,CX - ADDQ CX,SI - ANDQ DX,R10 - MOVQ SI,160(DI) - MOVQ R8,168(DI) - MOVQ R9,176(DI) - MOVQ AX,184(DI) - MOVQ R10,192(DI) - MOVQ 184(DI),SI - IMUL3Q $19,SI,AX - MOVQ AX,0(SP) - MULQ 16(DI) - MOVQ AX,SI - MOVQ DX,CX - MOVQ 192(DI),DX - IMUL3Q $19,DX,AX - MOVQ AX,8(SP) - MULQ 8(DI) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 160(DI),AX - MULQ 0(DI) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 160(DI),AX - MULQ 8(DI) - MOVQ AX,R8 - MOVQ DX,R9 - MOVQ 160(DI),AX - MULQ 16(DI) - MOVQ AX,R10 - MOVQ DX,R11 - MOVQ 160(DI),AX - MULQ 24(DI) - MOVQ AX,R12 - MOVQ DX,R13 - MOVQ 160(DI),AX - MULQ 32(DI) - MOVQ AX,R14 - MOVQ DX,R15 - MOVQ 168(DI),AX - MULQ 0(DI) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 168(DI),AX - MULQ 8(DI) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 168(DI),AX - MULQ 16(DI) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 168(DI),AX - MULQ 24(DI) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 168(DI),DX - IMUL3Q $19,DX,AX - MULQ 32(DI) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 176(DI),AX - MULQ 0(DI) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 176(DI),AX - MULQ 8(DI) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 176(DI),AX - MULQ 16(DI) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 176(DI),DX - IMUL3Q $19,DX,AX - MULQ 24(DI) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 176(DI),DX - IMUL3Q $19,DX,AX - MULQ 32(DI) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 184(DI),AX - MULQ 0(DI) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 184(DI),AX - MULQ 8(DI) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 0(SP),AX - MULQ 24(DI) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 0(SP),AX - MULQ 32(DI) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 192(DI),AX - MULQ 0(DI) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 8(SP),AX - MULQ 16(DI) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 8(SP),AX - MULQ 24(DI) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 8(SP),AX - MULQ 32(DI) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ $REDMASK51,DX - SHLQ $13,CX:SI - ANDQ DX,SI - SHLQ $13,R9:R8 - ANDQ DX,R8 - ADDQ CX,R8 - SHLQ $13,R11:R10 - ANDQ DX,R10 - ADDQ R9,R10 - SHLQ $13,R13:R12 - ANDQ DX,R12 - ADDQ R11,R12 - SHLQ $13,R15:R14 - ANDQ DX,R14 - ADDQ R13,R14 - IMUL3Q $19,R15,CX - ADDQ CX,SI - MOVQ SI,CX - SHRQ $51,CX - ADDQ R8,CX - MOVQ CX,R8 - SHRQ $51,CX - ANDQ DX,SI - ADDQ R10,CX - MOVQ CX,R9 - SHRQ $51,CX - ANDQ DX,R8 - ADDQ R12,CX - MOVQ CX,AX - SHRQ $51,CX - ANDQ DX,R9 - ADDQ R14,CX - MOVQ CX,R10 - SHRQ $51,CX - ANDQ DX,AX - IMUL3Q $19,CX,CX - ADDQ CX,SI - ANDQ DX,R10 - MOVQ SI,160(DI) - MOVQ R8,168(DI) - MOVQ R9,176(DI) - MOVQ AX,184(DI) - MOVQ R10,192(DI) - MOVQ 144(SP),SI - IMUL3Q $19,SI,AX - MOVQ AX,0(SP) - MULQ 96(SP) - MOVQ AX,SI - MOVQ DX,CX - MOVQ 152(SP),DX - IMUL3Q $19,DX,AX - MOVQ AX,8(SP) - MULQ 88(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 120(SP),AX - MULQ 80(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 120(SP),AX - MULQ 88(SP) - MOVQ AX,R8 - MOVQ DX,R9 - MOVQ 120(SP),AX - MULQ 96(SP) - MOVQ AX,R10 - MOVQ DX,R11 - MOVQ 120(SP),AX - MULQ 104(SP) - MOVQ AX,R12 - MOVQ DX,R13 - MOVQ 120(SP),AX - MULQ 112(SP) - MOVQ AX,R14 - MOVQ DX,R15 - MOVQ 128(SP),AX - MULQ 80(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 128(SP),AX - MULQ 88(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 128(SP),AX - MULQ 96(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 128(SP),AX - MULQ 104(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 128(SP),DX - IMUL3Q $19,DX,AX - MULQ 112(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 136(SP),AX - MULQ 80(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 136(SP),AX - MULQ 88(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 136(SP),AX - MULQ 96(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 136(SP),DX - IMUL3Q $19,DX,AX - MULQ 104(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 136(SP),DX - IMUL3Q $19,DX,AX - MULQ 112(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 144(SP),AX - MULQ 80(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 144(SP),AX - MULQ 88(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 0(SP),AX - MULQ 104(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 0(SP),AX - MULQ 112(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 152(SP),AX - MULQ 80(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 8(SP),AX - MULQ 96(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 8(SP),AX - MULQ 104(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 8(SP),AX - MULQ 112(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ $REDMASK51,DX - SHLQ $13,CX:SI - ANDQ DX,SI - SHLQ $13,R9:R8 - ANDQ DX,R8 - ADDQ CX,R8 - SHLQ $13,R11:R10 - ANDQ DX,R10 - ADDQ R9,R10 - SHLQ $13,R13:R12 - ANDQ DX,R12 - ADDQ R11,R12 - SHLQ $13,R15:R14 - ANDQ DX,R14 - ADDQ R13,R14 - IMUL3Q $19,R15,CX - ADDQ CX,SI - MOVQ SI,CX - SHRQ $51,CX - ADDQ R8,CX - MOVQ CX,R8 - SHRQ $51,CX - ANDQ DX,SI - ADDQ R10,CX - MOVQ CX,R9 - SHRQ $51,CX - ANDQ DX,R8 - ADDQ R12,CX - MOVQ CX,AX - SHRQ $51,CX - ANDQ DX,R9 - ADDQ R14,CX - MOVQ CX,R10 - SHRQ $51,CX - ANDQ DX,AX - IMUL3Q $19,CX,CX - ADDQ CX,SI - ANDQ DX,R10 - MOVQ SI,40(DI) - MOVQ R8,48(DI) - MOVQ R9,56(DI) - MOVQ AX,64(DI) - MOVQ R10,72(DI) - MOVQ 160(SP),AX - MULQ ·_121666_213(SB) - SHRQ $13,AX - MOVQ AX,SI - MOVQ DX,CX - MOVQ 168(SP),AX - MULQ ·_121666_213(SB) - SHRQ $13,AX - ADDQ AX,CX - MOVQ DX,R8 - MOVQ 176(SP),AX - MULQ ·_121666_213(SB) - SHRQ $13,AX - ADDQ AX,R8 - MOVQ DX,R9 - MOVQ 184(SP),AX - MULQ ·_121666_213(SB) - SHRQ $13,AX - ADDQ AX,R9 - MOVQ DX,R10 - MOVQ 192(SP),AX - MULQ ·_121666_213(SB) - SHRQ $13,AX - ADDQ AX,R10 - IMUL3Q $19,DX,DX - ADDQ DX,SI - ADDQ 80(SP),SI - ADDQ 88(SP),CX - ADDQ 96(SP),R8 - ADDQ 104(SP),R9 - ADDQ 112(SP),R10 - MOVQ SI,80(DI) - MOVQ CX,88(DI) - MOVQ R8,96(DI) - MOVQ R9,104(DI) - MOVQ R10,112(DI) - MOVQ 104(DI),SI - IMUL3Q $19,SI,AX - MOVQ AX,0(SP) - MULQ 176(SP) - MOVQ AX,SI - MOVQ DX,CX - MOVQ 112(DI),DX - IMUL3Q $19,DX,AX - MOVQ AX,8(SP) - MULQ 168(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 80(DI),AX - MULQ 160(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 80(DI),AX - MULQ 168(SP) - MOVQ AX,R8 - MOVQ DX,R9 - MOVQ 80(DI),AX - MULQ 176(SP) - MOVQ AX,R10 - MOVQ DX,R11 - MOVQ 80(DI),AX - MULQ 184(SP) - MOVQ AX,R12 - MOVQ DX,R13 - MOVQ 80(DI),AX - MULQ 192(SP) - MOVQ AX,R14 - MOVQ DX,R15 - MOVQ 88(DI),AX - MULQ 160(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 88(DI),AX - MULQ 168(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 88(DI),AX - MULQ 176(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 88(DI),AX - MULQ 184(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 88(DI),DX - IMUL3Q $19,DX,AX - MULQ 192(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 96(DI),AX - MULQ 160(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 96(DI),AX - MULQ 168(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 96(DI),AX - MULQ 176(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 96(DI),DX - IMUL3Q $19,DX,AX - MULQ 184(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 96(DI),DX - IMUL3Q $19,DX,AX - MULQ 192(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 104(DI),AX - MULQ 160(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 104(DI),AX - MULQ 168(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 0(SP),AX - MULQ 184(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 0(SP),AX - MULQ 192(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 112(DI),AX - MULQ 160(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 8(SP),AX - MULQ 176(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 8(SP),AX - MULQ 184(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 8(SP),AX - MULQ 192(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ $REDMASK51,DX - SHLQ $13,CX:SI - ANDQ DX,SI - SHLQ $13,R9:R8 - ANDQ DX,R8 - ADDQ CX,R8 - SHLQ $13,R11:R10 - ANDQ DX,R10 - ADDQ R9,R10 - SHLQ $13,R13:R12 - ANDQ DX,R12 - ADDQ R11,R12 - SHLQ $13,R15:R14 - ANDQ DX,R14 - ADDQ R13,R14 - IMUL3Q $19,R15,CX - ADDQ CX,SI - MOVQ SI,CX - SHRQ $51,CX - ADDQ R8,CX - MOVQ CX,R8 - SHRQ $51,CX - ANDQ DX,SI - ADDQ R10,CX - MOVQ CX,R9 - SHRQ $51,CX - ANDQ DX,R8 - ADDQ R12,CX - MOVQ CX,AX - SHRQ $51,CX - ANDQ DX,R9 - ADDQ R14,CX - MOVQ CX,R10 - SHRQ $51,CX - ANDQ DX,AX - IMUL3Q $19,CX,CX - ADDQ CX,SI - ANDQ DX,R10 - MOVQ SI,80(DI) - MOVQ R8,88(DI) - MOVQ R9,96(DI) - MOVQ AX,104(DI) - MOVQ R10,112(DI) - RET diff --git a/vendor/golang.org/x/crypto/curve25519/mont25519_amd64.go b/vendor/golang.org/x/crypto/curve25519/mont25519_amd64.go deleted file mode 100644 index 5822bd533..000000000 --- a/vendor/golang.org/x/crypto/curve25519/mont25519_amd64.go +++ /dev/null @@ -1,240 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build amd64,!gccgo,!appengine - -package curve25519 - -// These functions are implemented in the .s files. The names of the functions -// in the rest of the file are also taken from the SUPERCOP sources to help -// people following along. - -//go:noescape - -func cswap(inout *[5]uint64, v uint64) - -//go:noescape - -func ladderstep(inout *[5][5]uint64) - -//go:noescape - -func freeze(inout *[5]uint64) - -//go:noescape - -func mul(dest, a, b *[5]uint64) - -//go:noescape - -func square(out, in *[5]uint64) - -// mladder uses a Montgomery ladder to calculate (xr/zr) *= s. -func mladder(xr, zr *[5]uint64, s *[32]byte) { - var work [5][5]uint64 - - work[0] = *xr - setint(&work[1], 1) - setint(&work[2], 0) - work[3] = *xr - setint(&work[4], 1) - - j := uint(6) - var prevbit byte - - for i := 31; i >= 0; i-- { - for j < 8 { - bit := ((*s)[i] >> j) & 1 - swap := bit ^ prevbit - prevbit = bit - cswap(&work[1], uint64(swap)) - ladderstep(&work) - j-- - } - j = 7 - } - - *xr = work[1] - *zr = work[2] -} - -func scalarMult(out, in, base *[32]byte) { - var e [32]byte - copy(e[:], (*in)[:]) - e[0] &= 248 - e[31] &= 127 - e[31] |= 64 - - var t, z [5]uint64 - unpack(&t, base) - mladder(&t, &z, &e) - invert(&z, &z) - mul(&t, &t, &z) - pack(out, &t) -} - -func setint(r *[5]uint64, v uint64) { - r[0] = v - r[1] = 0 - r[2] = 0 - r[3] = 0 - r[4] = 0 -} - -// unpack sets r = x where r consists of 5, 51-bit limbs in little-endian -// order. -func unpack(r *[5]uint64, x *[32]byte) { - r[0] = uint64(x[0]) | - uint64(x[1])<<8 | - uint64(x[2])<<16 | - uint64(x[3])<<24 | - uint64(x[4])<<32 | - uint64(x[5])<<40 | - uint64(x[6]&7)<<48 - - r[1] = uint64(x[6])>>3 | - uint64(x[7])<<5 | - uint64(x[8])<<13 | - uint64(x[9])<<21 | - uint64(x[10])<<29 | - uint64(x[11])<<37 | - uint64(x[12]&63)<<45 - - r[2] = uint64(x[12])>>6 | - uint64(x[13])<<2 | - uint64(x[14])<<10 | - uint64(x[15])<<18 | - uint64(x[16])<<26 | - uint64(x[17])<<34 | - uint64(x[18])<<42 | - uint64(x[19]&1)<<50 - - r[3] = uint64(x[19])>>1 | - uint64(x[20])<<7 | - uint64(x[21])<<15 | - uint64(x[22])<<23 | - uint64(x[23])<<31 | - uint64(x[24])<<39 | - uint64(x[25]&15)<<47 - - r[4] = uint64(x[25])>>4 | - uint64(x[26])<<4 | - uint64(x[27])<<12 | - uint64(x[28])<<20 | - uint64(x[29])<<28 | - uint64(x[30])<<36 | - uint64(x[31]&127)<<44 -} - -// pack sets out = x where out is the usual, little-endian form of the 5, -// 51-bit limbs in x. -func pack(out *[32]byte, x *[5]uint64) { - t := *x - freeze(&t) - - out[0] = byte(t[0]) - out[1] = byte(t[0] >> 8) - out[2] = byte(t[0] >> 16) - out[3] = byte(t[0] >> 24) - out[4] = byte(t[0] >> 32) - out[5] = byte(t[0] >> 40) - out[6] = byte(t[0] >> 48) - - out[6] ^= byte(t[1]<<3) & 0xf8 - out[7] = byte(t[1] >> 5) - out[8] = byte(t[1] >> 13) - out[9] = byte(t[1] >> 21) - out[10] = byte(t[1] >> 29) - out[11] = byte(t[1] >> 37) - out[12] = byte(t[1] >> 45) - - out[12] ^= byte(t[2]<<6) & 0xc0 - out[13] = byte(t[2] >> 2) - out[14] = byte(t[2] >> 10) - out[15] = byte(t[2] >> 18) - out[16] = byte(t[2] >> 26) - out[17] = byte(t[2] >> 34) - out[18] = byte(t[2] >> 42) - out[19] = byte(t[2] >> 50) - - out[19] ^= byte(t[3]<<1) & 0xfe - out[20] = byte(t[3] >> 7) - out[21] = byte(t[3] >> 15) - out[22] = byte(t[3] >> 23) - out[23] = byte(t[3] >> 31) - out[24] = byte(t[3] >> 39) - out[25] = byte(t[3] >> 47) - - out[25] ^= byte(t[4]<<4) & 0xf0 - out[26] = byte(t[4] >> 4) - out[27] = byte(t[4] >> 12) - out[28] = byte(t[4] >> 20) - out[29] = byte(t[4] >> 28) - out[30] = byte(t[4] >> 36) - out[31] = byte(t[4] >> 44) -} - -// invert calculates r = x^-1 mod p using Fermat's little theorem. -func invert(r *[5]uint64, x *[5]uint64) { - var z2, z9, z11, z2_5_0, z2_10_0, z2_20_0, z2_50_0, z2_100_0, t [5]uint64 - - square(&z2, x) /* 2 */ - square(&t, &z2) /* 4 */ - square(&t, &t) /* 8 */ - mul(&z9, &t, x) /* 9 */ - mul(&z11, &z9, &z2) /* 11 */ - square(&t, &z11) /* 22 */ - mul(&z2_5_0, &t, &z9) /* 2^5 - 2^0 = 31 */ - - square(&t, &z2_5_0) /* 2^6 - 2^1 */ - for i := 1; i < 5; i++ { /* 2^20 - 2^10 */ - square(&t, &t) - } - mul(&z2_10_0, &t, &z2_5_0) /* 2^10 - 2^0 */ - - square(&t, &z2_10_0) /* 2^11 - 2^1 */ - for i := 1; i < 10; i++ { /* 2^20 - 2^10 */ - square(&t, &t) - } - mul(&z2_20_0, &t, &z2_10_0) /* 2^20 - 2^0 */ - - square(&t, &z2_20_0) /* 2^21 - 2^1 */ - for i := 1; i < 20; i++ { /* 2^40 - 2^20 */ - square(&t, &t) - } - mul(&t, &t, &z2_20_0) /* 2^40 - 2^0 */ - - square(&t, &t) /* 2^41 - 2^1 */ - for i := 1; i < 10; i++ { /* 2^50 - 2^10 */ - square(&t, &t) - } - mul(&z2_50_0, &t, &z2_10_0) /* 2^50 - 2^0 */ - - square(&t, &z2_50_0) /* 2^51 - 2^1 */ - for i := 1; i < 50; i++ { /* 2^100 - 2^50 */ - square(&t, &t) - } - mul(&z2_100_0, &t, &z2_50_0) /* 2^100 - 2^0 */ - - square(&t, &z2_100_0) /* 2^101 - 2^1 */ - for i := 1; i < 100; i++ { /* 2^200 - 2^100 */ - square(&t, &t) - } - mul(&t, &t, &z2_100_0) /* 2^200 - 2^0 */ - - square(&t, &t) /* 2^201 - 2^1 */ - for i := 1; i < 50; i++ { /* 2^250 - 2^50 */ - square(&t, &t) - } - mul(&t, &t, &z2_50_0) /* 2^250 - 2^0 */ - - square(&t, &t) /* 2^251 - 2^1 */ - square(&t, &t) /* 2^252 - 2^2 */ - square(&t, &t) /* 2^253 - 2^3 */ - - square(&t, &t) /* 2^254 - 2^4 */ - - square(&t, &t) /* 2^255 - 2^5 */ - mul(r, &t, &z11) /* 2^255 - 21 */ -} diff --git a/vendor/golang.org/x/crypto/curve25519/mul_amd64.s b/vendor/golang.org/x/crypto/curve25519/mul_amd64.s deleted file mode 100644 index b162e6515..000000000 --- a/vendor/golang.org/x/crypto/curve25519/mul_amd64.s +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This code was translated into a form compatible with 6a from the public -// domain sources in SUPERCOP: http://bench.cr.yp.to/supercop.html - -// +build amd64,!gccgo,!appengine - -#include "const_amd64.h" - -// func mul(dest, a, b *[5]uint64) -TEXT ·mul(SB),0,$16-24 - MOVQ dest+0(FP), DI - MOVQ a+8(FP), SI - MOVQ b+16(FP), DX - - MOVQ DX,CX - MOVQ 24(SI),DX - IMUL3Q $19,DX,AX - MOVQ AX,0(SP) - MULQ 16(CX) - MOVQ AX,R8 - MOVQ DX,R9 - MOVQ 32(SI),DX - IMUL3Q $19,DX,AX - MOVQ AX,8(SP) - MULQ 8(CX) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 0(SI),AX - MULQ 0(CX) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 0(SI),AX - MULQ 8(CX) - MOVQ AX,R10 - MOVQ DX,R11 - MOVQ 0(SI),AX - MULQ 16(CX) - MOVQ AX,R12 - MOVQ DX,R13 - MOVQ 0(SI),AX - MULQ 24(CX) - MOVQ AX,R14 - MOVQ DX,R15 - MOVQ 0(SI),AX - MULQ 32(CX) - MOVQ AX,BX - MOVQ DX,BP - MOVQ 8(SI),AX - MULQ 0(CX) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 8(SI),AX - MULQ 8(CX) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 8(SI),AX - MULQ 16(CX) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 8(SI),AX - MULQ 24(CX) - ADDQ AX,BX - ADCQ DX,BP - MOVQ 8(SI),DX - IMUL3Q $19,DX,AX - MULQ 32(CX) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 16(SI),AX - MULQ 0(CX) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 16(SI),AX - MULQ 8(CX) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 16(SI),AX - MULQ 16(CX) - ADDQ AX,BX - ADCQ DX,BP - MOVQ 16(SI),DX - IMUL3Q $19,DX,AX - MULQ 24(CX) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 16(SI),DX - IMUL3Q $19,DX,AX - MULQ 32(CX) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 24(SI),AX - MULQ 0(CX) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 24(SI),AX - MULQ 8(CX) - ADDQ AX,BX - ADCQ DX,BP - MOVQ 0(SP),AX - MULQ 24(CX) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 0(SP),AX - MULQ 32(CX) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 32(SI),AX - MULQ 0(CX) - ADDQ AX,BX - ADCQ DX,BP - MOVQ 8(SP),AX - MULQ 16(CX) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 8(SP),AX - MULQ 24(CX) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 8(SP),AX - MULQ 32(CX) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ $REDMASK51,SI - SHLQ $13,R9:R8 - ANDQ SI,R8 - SHLQ $13,R11:R10 - ANDQ SI,R10 - ADDQ R9,R10 - SHLQ $13,R13:R12 - ANDQ SI,R12 - ADDQ R11,R12 - SHLQ $13,R15:R14 - ANDQ SI,R14 - ADDQ R13,R14 - SHLQ $13,BP:BX - ANDQ SI,BX - ADDQ R15,BX - IMUL3Q $19,BP,DX - ADDQ DX,R8 - MOVQ R8,DX - SHRQ $51,DX - ADDQ R10,DX - MOVQ DX,CX - SHRQ $51,DX - ANDQ SI,R8 - ADDQ R12,DX - MOVQ DX,R9 - SHRQ $51,DX - ANDQ SI,CX - ADDQ R14,DX - MOVQ DX,AX - SHRQ $51,DX - ANDQ SI,R9 - ADDQ BX,DX - MOVQ DX,R10 - SHRQ $51,DX - ANDQ SI,AX - IMUL3Q $19,DX,DX - ADDQ DX,R8 - ANDQ SI,R10 - MOVQ R8,0(DI) - MOVQ CX,8(DI) - MOVQ R9,16(DI) - MOVQ AX,24(DI) - MOVQ R10,32(DI) - RET diff --git a/vendor/golang.org/x/crypto/curve25519/square_amd64.s b/vendor/golang.org/x/crypto/curve25519/square_amd64.s deleted file mode 100644 index 4e864a83e..000000000 --- a/vendor/golang.org/x/crypto/curve25519/square_amd64.s +++ /dev/null @@ -1,132 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This code was translated into a form compatible with 6a from the public -// domain sources in SUPERCOP: http://bench.cr.yp.to/supercop.html - -// +build amd64,!gccgo,!appengine - -#include "const_amd64.h" - -// func square(out, in *[5]uint64) -TEXT ·square(SB),7,$0-16 - MOVQ out+0(FP), DI - MOVQ in+8(FP), SI - - MOVQ 0(SI),AX - MULQ 0(SI) - MOVQ AX,CX - MOVQ DX,R8 - MOVQ 0(SI),AX - SHLQ $1,AX - MULQ 8(SI) - MOVQ AX,R9 - MOVQ DX,R10 - MOVQ 0(SI),AX - SHLQ $1,AX - MULQ 16(SI) - MOVQ AX,R11 - MOVQ DX,R12 - MOVQ 0(SI),AX - SHLQ $1,AX - MULQ 24(SI) - MOVQ AX,R13 - MOVQ DX,R14 - MOVQ 0(SI),AX - SHLQ $1,AX - MULQ 32(SI) - MOVQ AX,R15 - MOVQ DX,BX - MOVQ 8(SI),AX - MULQ 8(SI) - ADDQ AX,R11 - ADCQ DX,R12 - MOVQ 8(SI),AX - SHLQ $1,AX - MULQ 16(SI) - ADDQ AX,R13 - ADCQ DX,R14 - MOVQ 8(SI),AX - SHLQ $1,AX - MULQ 24(SI) - ADDQ AX,R15 - ADCQ DX,BX - MOVQ 8(SI),DX - IMUL3Q $38,DX,AX - MULQ 32(SI) - ADDQ AX,CX - ADCQ DX,R8 - MOVQ 16(SI),AX - MULQ 16(SI) - ADDQ AX,R15 - ADCQ DX,BX - MOVQ 16(SI),DX - IMUL3Q $38,DX,AX - MULQ 24(SI) - ADDQ AX,CX - ADCQ DX,R8 - MOVQ 16(SI),DX - IMUL3Q $38,DX,AX - MULQ 32(SI) - ADDQ AX,R9 - ADCQ DX,R10 - MOVQ 24(SI),DX - IMUL3Q $19,DX,AX - MULQ 24(SI) - ADDQ AX,R9 - ADCQ DX,R10 - MOVQ 24(SI),DX - IMUL3Q $38,DX,AX - MULQ 32(SI) - ADDQ AX,R11 - ADCQ DX,R12 - MOVQ 32(SI),DX - IMUL3Q $19,DX,AX - MULQ 32(SI) - ADDQ AX,R13 - ADCQ DX,R14 - MOVQ $REDMASK51,SI - SHLQ $13,R8:CX - ANDQ SI,CX - SHLQ $13,R10:R9 - ANDQ SI,R9 - ADDQ R8,R9 - SHLQ $13,R12:R11 - ANDQ SI,R11 - ADDQ R10,R11 - SHLQ $13,R14:R13 - ANDQ SI,R13 - ADDQ R12,R13 - SHLQ $13,BX:R15 - ANDQ SI,R15 - ADDQ R14,R15 - IMUL3Q $19,BX,DX - ADDQ DX,CX - MOVQ CX,DX - SHRQ $51,DX - ADDQ R9,DX - ANDQ SI,CX - MOVQ DX,R8 - SHRQ $51,DX - ADDQ R11,DX - ANDQ SI,R8 - MOVQ DX,R9 - SHRQ $51,DX - ADDQ R13,DX - ANDQ SI,R9 - MOVQ DX,AX - SHRQ $51,DX - ADDQ R15,DX - ANDQ SI,AX - MOVQ DX,R10 - SHRQ $51,DX - IMUL3Q $19,DX,DX - ADDQ DX,CX - ANDQ SI,R10 - MOVQ CX,0(DI) - MOVQ R8,8(DI) - MOVQ R9,16(DI) - MOVQ AX,24(DI) - MOVQ R10,32(DI) - RET diff --git a/vendor/golang.org/x/crypto/ed25519/ed25519.go b/vendor/golang.org/x/crypto/ed25519/ed25519.go deleted file mode 100644 index f1d95674a..000000000 --- a/vendor/golang.org/x/crypto/ed25519/ed25519.go +++ /dev/null @@ -1,181 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package ed25519 implements the Ed25519 signature algorithm. See -// http://ed25519.cr.yp.to/. -// -// These functions are also compatible with the “Ed25519” function defined in -// https://tools.ietf.org/html/draft-irtf-cfrg-eddsa-05. -package ed25519 - -// This code is a port of the public domain, “ref10” implementation of ed25519 -// from SUPERCOP. - -import ( - "crypto" - cryptorand "crypto/rand" - "crypto/sha512" - "crypto/subtle" - "errors" - "io" - "strconv" - - "golang.org/x/crypto/ed25519/internal/edwards25519" -) - -const ( - // PublicKeySize is the size, in bytes, of public keys as used in this package. - PublicKeySize = 32 - // PrivateKeySize is the size, in bytes, of private keys as used in this package. - PrivateKeySize = 64 - // SignatureSize is the size, in bytes, of signatures generated and verified by this package. - SignatureSize = 64 -) - -// PublicKey is the type of Ed25519 public keys. -type PublicKey []byte - -// PrivateKey is the type of Ed25519 private keys. It implements crypto.Signer. -type PrivateKey []byte - -// Public returns the PublicKey corresponding to priv. -func (priv PrivateKey) Public() crypto.PublicKey { - publicKey := make([]byte, PublicKeySize) - copy(publicKey, priv[32:]) - return PublicKey(publicKey) -} - -// Sign signs the given message with priv. -// Ed25519 performs two passes over messages to be signed and therefore cannot -// handle pre-hashed messages. Thus opts.HashFunc() must return zero to -// indicate the message hasn't been hashed. This can be achieved by passing -// crypto.Hash(0) as the value for opts. -func (priv PrivateKey) Sign(rand io.Reader, message []byte, opts crypto.SignerOpts) (signature []byte, err error) { - if opts.HashFunc() != crypto.Hash(0) { - return nil, errors.New("ed25519: cannot sign hashed message") - } - - return Sign(priv, message), nil -} - -// GenerateKey generates a public/private key pair using entropy from rand. -// If rand is nil, crypto/rand.Reader will be used. -func GenerateKey(rand io.Reader) (publicKey PublicKey, privateKey PrivateKey, err error) { - if rand == nil { - rand = cryptorand.Reader - } - - privateKey = make([]byte, PrivateKeySize) - publicKey = make([]byte, PublicKeySize) - _, err = io.ReadFull(rand, privateKey[:32]) - if err != nil { - return nil, nil, err - } - - digest := sha512.Sum512(privateKey[:32]) - digest[0] &= 248 - digest[31] &= 127 - digest[31] |= 64 - - var A edwards25519.ExtendedGroupElement - var hBytes [32]byte - copy(hBytes[:], digest[:]) - edwards25519.GeScalarMultBase(&A, &hBytes) - var publicKeyBytes [32]byte - A.ToBytes(&publicKeyBytes) - - copy(privateKey[32:], publicKeyBytes[:]) - copy(publicKey, publicKeyBytes[:]) - - return publicKey, privateKey, nil -} - -// Sign signs the message with privateKey and returns a signature. It will -// panic if len(privateKey) is not PrivateKeySize. -func Sign(privateKey PrivateKey, message []byte) []byte { - if l := len(privateKey); l != PrivateKeySize { - panic("ed25519: bad private key length: " + strconv.Itoa(l)) - } - - h := sha512.New() - h.Write(privateKey[:32]) - - var digest1, messageDigest, hramDigest [64]byte - var expandedSecretKey [32]byte - h.Sum(digest1[:0]) - copy(expandedSecretKey[:], digest1[:]) - expandedSecretKey[0] &= 248 - expandedSecretKey[31] &= 63 - expandedSecretKey[31] |= 64 - - h.Reset() - h.Write(digest1[32:]) - h.Write(message) - h.Sum(messageDigest[:0]) - - var messageDigestReduced [32]byte - edwards25519.ScReduce(&messageDigestReduced, &messageDigest) - var R edwards25519.ExtendedGroupElement - edwards25519.GeScalarMultBase(&R, &messageDigestReduced) - - var encodedR [32]byte - R.ToBytes(&encodedR) - - h.Reset() - h.Write(encodedR[:]) - h.Write(privateKey[32:]) - h.Write(message) - h.Sum(hramDigest[:0]) - var hramDigestReduced [32]byte - edwards25519.ScReduce(&hramDigestReduced, &hramDigest) - - var s [32]byte - edwards25519.ScMulAdd(&s, &hramDigestReduced, &expandedSecretKey, &messageDigestReduced) - - signature := make([]byte, SignatureSize) - copy(signature[:], encodedR[:]) - copy(signature[32:], s[:]) - - return signature -} - -// Verify reports whether sig is a valid signature of message by publicKey. It -// will panic if len(publicKey) is not PublicKeySize. -func Verify(publicKey PublicKey, message, sig []byte) bool { - if l := len(publicKey); l != PublicKeySize { - panic("ed25519: bad public key length: " + strconv.Itoa(l)) - } - - if len(sig) != SignatureSize || sig[63]&224 != 0 { - return false - } - - var A edwards25519.ExtendedGroupElement - var publicKeyBytes [32]byte - copy(publicKeyBytes[:], publicKey) - if !A.FromBytes(&publicKeyBytes) { - return false - } - edwards25519.FeNeg(&A.X, &A.X) - edwards25519.FeNeg(&A.T, &A.T) - - h := sha512.New() - h.Write(sig[:32]) - h.Write(publicKey[:]) - h.Write(message) - var digest [64]byte - h.Sum(digest[:0]) - - var hReduced [32]byte - edwards25519.ScReduce(&hReduced, &digest) - - var R edwards25519.ProjectiveGroupElement - var b [32]byte - copy(b[:], sig[32:]) - edwards25519.GeDoubleScalarMultVartime(&R, &hReduced, &A, &b) - - var checkR [32]byte - R.ToBytes(&checkR) - return subtle.ConstantTimeCompare(sig[:32], checkR[:]) == 1 -} diff --git a/vendor/golang.org/x/crypto/ed25519/ed25519_test.go b/vendor/golang.org/x/crypto/ed25519/ed25519_test.go deleted file mode 100644 index 638e5255d..000000000 --- a/vendor/golang.org/x/crypto/ed25519/ed25519_test.go +++ /dev/null @@ -1,183 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ed25519 - -import ( - "bufio" - "bytes" - "compress/gzip" - "crypto" - "crypto/rand" - "encoding/hex" - "os" - "strings" - "testing" - - "golang.org/x/crypto/ed25519/internal/edwards25519" -) - -type zeroReader struct{} - -func (zeroReader) Read(buf []byte) (int, error) { - for i := range buf { - buf[i] = 0 - } - return len(buf), nil -} - -func TestUnmarshalMarshal(t *testing.T) { - pub, _, _ := GenerateKey(rand.Reader) - - var A edwards25519.ExtendedGroupElement - var pubBytes [32]byte - copy(pubBytes[:], pub) - if !A.FromBytes(&pubBytes) { - t.Fatalf("ExtendedGroupElement.FromBytes failed") - } - - var pub2 [32]byte - A.ToBytes(&pub2) - - if pubBytes != pub2 { - t.Errorf("FromBytes(%v)->ToBytes does not round-trip, got %x\n", pubBytes, pub2) - } -} - -func TestSignVerify(t *testing.T) { - var zero zeroReader - public, private, _ := GenerateKey(zero) - - message := []byte("test message") - sig := Sign(private, message) - if !Verify(public, message, sig) { - t.Errorf("valid signature rejected") - } - - wrongMessage := []byte("wrong message") - if Verify(public, wrongMessage, sig) { - t.Errorf("signature of different message accepted") - } -} - -func TestCryptoSigner(t *testing.T) { - var zero zeroReader - public, private, _ := GenerateKey(zero) - - signer := crypto.Signer(private) - - publicInterface := signer.Public() - public2, ok := publicInterface.(PublicKey) - if !ok { - t.Fatalf("expected PublicKey from Public() but got %T", publicInterface) - } - - if !bytes.Equal(public, public2) { - t.Errorf("public keys do not match: original:%x vs Public():%x", public, public2) - } - - message := []byte("message") - var noHash crypto.Hash - signature, err := signer.Sign(zero, message, noHash) - if err != nil { - t.Fatalf("error from Sign(): %s", err) - } - - if !Verify(public, message, signature) { - t.Errorf("Verify failed on signature from Sign()") - } -} - -func TestGolden(t *testing.T) { - // sign.input.gz is a selection of test cases from - // http://ed25519.cr.yp.to/python/sign.input - testDataZ, err := os.Open("testdata/sign.input.gz") - if err != nil { - t.Fatal(err) - } - defer testDataZ.Close() - testData, err := gzip.NewReader(testDataZ) - if err != nil { - t.Fatal(err) - } - defer testData.Close() - - scanner := bufio.NewScanner(testData) - lineNo := 0 - - for scanner.Scan() { - lineNo++ - - line := scanner.Text() - parts := strings.Split(line, ":") - if len(parts) != 5 { - t.Fatalf("bad number of parts on line %d", lineNo) - } - - privBytes, _ := hex.DecodeString(parts[0]) - pubKey, _ := hex.DecodeString(parts[1]) - msg, _ := hex.DecodeString(parts[2]) - sig, _ := hex.DecodeString(parts[3]) - // The signatures in the test vectors also include the message - // at the end, but we just want R and S. - sig = sig[:SignatureSize] - - if l := len(pubKey); l != PublicKeySize { - t.Fatalf("bad public key length on line %d: got %d bytes", lineNo, l) - } - - var priv [PrivateKeySize]byte - copy(priv[:], privBytes) - copy(priv[32:], pubKey) - - sig2 := Sign(priv[:], msg) - if !bytes.Equal(sig, sig2[:]) { - t.Errorf("different signature result on line %d: %x vs %x", lineNo, sig, sig2) - } - - if !Verify(pubKey, msg, sig2) { - t.Errorf("signature failed to verify on line %d", lineNo) - } - } - - if err := scanner.Err(); err != nil { - t.Fatalf("error reading test data: %s", err) - } -} - -func BenchmarkKeyGeneration(b *testing.B) { - var zero zeroReader - for i := 0; i < b.N; i++ { - if _, _, err := GenerateKey(zero); err != nil { - b.Fatal(err) - } - } -} - -func BenchmarkSigning(b *testing.B) { - var zero zeroReader - _, priv, err := GenerateKey(zero) - if err != nil { - b.Fatal(err) - } - message := []byte("Hello, world!") - b.ResetTimer() - for i := 0; i < b.N; i++ { - Sign(priv, message) - } -} - -func BenchmarkVerification(b *testing.B) { - var zero zeroReader - pub, priv, err := GenerateKey(zero) - if err != nil { - b.Fatal(err) - } - message := []byte("Hello, world!") - signature := Sign(priv, message) - b.ResetTimer() - for i := 0; i < b.N; i++ { - Verify(pub, message, signature) - } -} diff --git a/vendor/golang.org/x/crypto/ed25519/internal/edwards25519/const.go b/vendor/golang.org/x/crypto/ed25519/internal/edwards25519/const.go deleted file mode 100644 index e39f086c1..000000000 --- a/vendor/golang.org/x/crypto/ed25519/internal/edwards25519/const.go +++ /dev/null @@ -1,1422 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package edwards25519 - -// These values are from the public domain, “ref10” implementation of ed25519 -// from SUPERCOP. - -// d is a constant in the Edwards curve equation. -var d = FieldElement{ - -10913610, 13857413, -15372611, 6949391, 114729, -8787816, -6275908, -3247719, -18696448, -12055116, -} - -// d2 is 2*d. -var d2 = FieldElement{ - -21827239, -5839606, -30745221, 13898782, 229458, 15978800, -12551817, -6495438, 29715968, 9444199, -} - -// SqrtM1 is the square-root of -1 in the field. -var SqrtM1 = FieldElement{ - -32595792, -7943725, 9377950, 3500415, 12389472, -272473, -25146209, -2005654, 326686, 11406482, -} - -// A is a constant in the Montgomery-form of curve25519. -var A = FieldElement{ - 486662, 0, 0, 0, 0, 0, 0, 0, 0, 0, -} - -// bi contains precomputed multiples of the base-point. See the Ed25519 paper -// for a discussion about how these values are used. -var bi = [8]PreComputedGroupElement{ - { - FieldElement{25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605}, - FieldElement{-12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378}, - FieldElement{-8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546}, - }, - { - FieldElement{15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024}, - FieldElement{16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574}, - FieldElement{30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357}, - }, - { - FieldElement{10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380}, - FieldElement{4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306}, - FieldElement{19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942}, - }, - { - FieldElement{5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766}, - FieldElement{-30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701}, - FieldElement{28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300}, - }, - { - FieldElement{-22518993, -6692182, 14201702, -8745502, -23510406, 8844726, 18474211, -1361450, -13062696, 13821877}, - FieldElement{-6455177, -7839871, 3374702, -4740862, -27098617, -10571707, 31655028, -7212327, 18853322, -14220951}, - FieldElement{4566830, -12963868, -28974889, -12240689, -7602672, -2830569, -8514358, -10431137, 2207753, -3209784}, - }, - { - FieldElement{-25154831, -4185821, 29681144, 7868801, -6854661, -9423865, -12437364, -663000, -31111463, -16132436}, - FieldElement{25576264, -2703214, 7349804, -11814844, 16472782, 9300885, 3844789, 15725684, 171356, 6466918}, - FieldElement{23103977, 13316479, 9739013, -16149481, 817875, -15038942, 8965339, -14088058, -30714912, 16193877}, - }, - { - FieldElement{-33521811, 3180713, -2394130, 14003687, -16903474, -16270840, 17238398, 4729455, -18074513, 9256800}, - FieldElement{-25182317, -4174131, 32336398, 5036987, -21236817, 11360617, 22616405, 9761698, -19827198, 630305}, - FieldElement{-13720693, 2639453, -24237460, -7406481, 9494427, -5774029, -6554551, -15960994, -2449256, -14291300}, - }, - { - FieldElement{-3151181, -5046075, 9282714, 6866145, -31907062, -863023, -18940575, 15033784, 25105118, -7894876}, - FieldElement{-24326370, 15950226, -31801215, -14592823, -11662737, -5090925, 1573892, -2625887, 2198790, -15804619}, - FieldElement{-3099351, 10324967, -2241613, 7453183, -5446979, -2735503, -13812022, -16236442, -32461234, -12290683}, - }, -} - -// base contains precomputed multiples of the base-point. See the Ed25519 paper -// for a discussion about how these values are used. -var base = [32][8]PreComputedGroupElement{ - { - { - FieldElement{25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605}, - FieldElement{-12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378}, - FieldElement{-8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546}, - }, - { - FieldElement{-12815894, -12976347, -21581243, 11784320, -25355658, -2750717, -11717903, -3814571, -358445, -10211303}, - FieldElement{-21703237, 6903825, 27185491, 6451973, -29577724, -9554005, -15616551, 11189268, -26829678, -5319081}, - FieldElement{26966642, 11152617, 32442495, 15396054, 14353839, -12752335, -3128826, -9541118, -15472047, -4166697}, - }, - { - FieldElement{15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024}, - FieldElement{16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574}, - FieldElement{30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357}, - }, - { - FieldElement{-17036878, 13921892, 10945806, -6033431, 27105052, -16084379, -28926210, 15006023, 3284568, -6276540}, - FieldElement{23599295, -8306047, -11193664, -7687416, 13236774, 10506355, 7464579, 9656445, 13059162, 10374397}, - FieldElement{7798556, 16710257, 3033922, 2874086, 28997861, 2835604, 32406664, -3839045, -641708, -101325}, - }, - { - FieldElement{10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380}, - FieldElement{4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306}, - FieldElement{19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942}, - }, - { - FieldElement{-15371964, -12862754, 32573250, 4720197, -26436522, 5875511, -19188627, -15224819, -9818940, -12085777}, - FieldElement{-8549212, 109983, 15149363, 2178705, 22900618, 4543417, 3044240, -15689887, 1762328, 14866737}, - FieldElement{-18199695, -15951423, -10473290, 1707278, -17185920, 3916101, -28236412, 3959421, 27914454, 4383652}, - }, - { - FieldElement{5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766}, - FieldElement{-30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701}, - FieldElement{28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300}, - }, - { - FieldElement{14499471, -2729599, -33191113, -4254652, 28494862, 14271267, 30290735, 10876454, -33154098, 2381726}, - FieldElement{-7195431, -2655363, -14730155, 462251, -27724326, 3941372, -6236617, 3696005, -32300832, 15351955}, - FieldElement{27431194, 8222322, 16448760, -3907995, -18707002, 11938355, -32961401, -2970515, 29551813, 10109425}, - }, - }, - { - { - FieldElement{-13657040, -13155431, -31283750, 11777098, 21447386, 6519384, -2378284, -1627556, 10092783, -4764171}, - FieldElement{27939166, 14210322, 4677035, 16277044, -22964462, -12398139, -32508754, 12005538, -17810127, 12803510}, - FieldElement{17228999, -15661624, -1233527, 300140, -1224870, -11714777, 30364213, -9038194, 18016357, 4397660}, - }, - { - FieldElement{-10958843, -7690207, 4776341, -14954238, 27850028, -15602212, -26619106, 14544525, -17477504, 982639}, - FieldElement{29253598, 15796703, -2863982, -9908884, 10057023, 3163536, 7332899, -4120128, -21047696, 9934963}, - FieldElement{5793303, 16271923, -24131614, -10116404, 29188560, 1206517, -14747930, 4559895, -30123922, -10897950}, - }, - { - FieldElement{-27643952, -11493006, 16282657, -11036493, 28414021, -15012264, 24191034, 4541697, -13338309, 5500568}, - FieldElement{12650548, -1497113, 9052871, 11355358, -17680037, -8400164, -17430592, 12264343, 10874051, 13524335}, - FieldElement{25556948, -3045990, 714651, 2510400, 23394682, -10415330, 33119038, 5080568, -22528059, 5376628}, - }, - { - FieldElement{-26088264, -4011052, -17013699, -3537628, -6726793, 1920897, -22321305, -9447443, 4535768, 1569007}, - FieldElement{-2255422, 14606630, -21692440, -8039818, 28430649, 8775819, -30494562, 3044290, 31848280, 12543772}, - FieldElement{-22028579, 2943893, -31857513, 6777306, 13784462, -4292203, -27377195, -2062731, 7718482, 14474653}, - }, - { - FieldElement{2385315, 2454213, -22631320, 46603, -4437935, -15680415, 656965, -7236665, 24316168, -5253567}, - FieldElement{13741529, 10911568, -33233417, -8603737, -20177830, -1033297, 33040651, -13424532, -20729456, 8321686}, - FieldElement{21060490, -2212744, 15712757, -4336099, 1639040, 10656336, 23845965, -11874838, -9984458, 608372}, - }, - { - FieldElement{-13672732, -15087586, -10889693, -7557059, -6036909, 11305547, 1123968, -6780577, 27229399, 23887}, - FieldElement{-23244140, -294205, -11744728, 14712571, -29465699, -2029617, 12797024, -6440308, -1633405, 16678954}, - FieldElement{-29500620, 4770662, -16054387, 14001338, 7830047, 9564805, -1508144, -4795045, -17169265, 4904953}, - }, - { - FieldElement{24059557, 14617003, 19037157, -15039908, 19766093, -14906429, 5169211, 16191880, 2128236, -4326833}, - FieldElement{-16981152, 4124966, -8540610, -10653797, 30336522, -14105247, -29806336, 916033, -6882542, -2986532}, - FieldElement{-22630907, 12419372, -7134229, -7473371, -16478904, 16739175, 285431, 2763829, 15736322, 4143876}, - }, - { - FieldElement{2379352, 11839345, -4110402, -5988665, 11274298, 794957, 212801, -14594663, 23527084, -16458268}, - FieldElement{33431127, -11130478, -17838966, -15626900, 8909499, 8376530, -32625340, 4087881, -15188911, -14416214}, - FieldElement{1767683, 7197987, -13205226, -2022635, -13091350, 448826, 5799055, 4357868, -4774191, -16323038}, - }, - }, - { - { - FieldElement{6721966, 13833823, -23523388, -1551314, 26354293, -11863321, 23365147, -3949732, 7390890, 2759800}, - FieldElement{4409041, 2052381, 23373853, 10530217, 7676779, -12885954, 21302353, -4264057, 1244380, -12919645}, - FieldElement{-4421239, 7169619, 4982368, -2957590, 30256825, -2777540, 14086413, 9208236, 15886429, 16489664}, - }, - { - FieldElement{1996075, 10375649, 14346367, 13311202, -6874135, -16438411, -13693198, 398369, -30606455, -712933}, - FieldElement{-25307465, 9795880, -2777414, 14878809, -33531835, 14780363, 13348553, 12076947, -30836462, 5113182}, - FieldElement{-17770784, 11797796, 31950843, 13929123, -25888302, 12288344, -30341101, -7336386, 13847711, 5387222}, - }, - { - FieldElement{-18582163, -3416217, 17824843, -2340966, 22744343, -10442611, 8763061, 3617786, -19600662, 10370991}, - FieldElement{20246567, -14369378, 22358229, -543712, 18507283, -10413996, 14554437, -8746092, 32232924, 16763880}, - FieldElement{9648505, 10094563, 26416693, 14745928, -30374318, -6472621, 11094161, 15689506, 3140038, -16510092}, - }, - { - FieldElement{-16160072, 5472695, 31895588, 4744994, 8823515, 10365685, -27224800, 9448613, -28774454, 366295}, - FieldElement{19153450, 11523972, -11096490, -6503142, -24647631, 5420647, 28344573, 8041113, 719605, 11671788}, - FieldElement{8678025, 2694440, -6808014, 2517372, 4964326, 11152271, -15432916, -15266516, 27000813, -10195553}, - }, - { - FieldElement{-15157904, 7134312, 8639287, -2814877, -7235688, 10421742, 564065, 5336097, 6750977, -14521026}, - FieldElement{11836410, -3979488, 26297894, 16080799, 23455045, 15735944, 1695823, -8819122, 8169720, 16220347}, - FieldElement{-18115838, 8653647, 17578566, -6092619, -8025777, -16012763, -11144307, -2627664, -5990708, -14166033}, - }, - { - FieldElement{-23308498, -10968312, 15213228, -10081214, -30853605, -11050004, 27884329, 2847284, 2655861, 1738395}, - FieldElement{-27537433, -14253021, -25336301, -8002780, -9370762, 8129821, 21651608, -3239336, -19087449, -11005278}, - FieldElement{1533110, 3437855, 23735889, 459276, 29970501, 11335377, 26030092, 5821408, 10478196, 8544890}, - }, - { - FieldElement{32173121, -16129311, 24896207, 3921497, 22579056, -3410854, 19270449, 12217473, 17789017, -3395995}, - FieldElement{-30552961, -2228401, -15578829, -10147201, 13243889, 517024, 15479401, -3853233, 30460520, 1052596}, - FieldElement{-11614875, 13323618, 32618793, 8175907, -15230173, 12596687, 27491595, -4612359, 3179268, -9478891}, - }, - { - FieldElement{31947069, -14366651, -4640583, -15339921, -15125977, -6039709, -14756777, -16411740, 19072640, -9511060}, - FieldElement{11685058, 11822410, 3158003, -13952594, 33402194, -4165066, 5977896, -5215017, 473099, 5040608}, - FieldElement{-20290863, 8198642, -27410132, 11602123, 1290375, -2799760, 28326862, 1721092, -19558642, -3131606}, - }, - }, - { - { - FieldElement{7881532, 10687937, 7578723, 7738378, -18951012, -2553952, 21820786, 8076149, -27868496, 11538389}, - FieldElement{-19935666, 3899861, 18283497, -6801568, -15728660, -11249211, 8754525, 7446702, -5676054, 5797016}, - FieldElement{-11295600, -3793569, -15782110, -7964573, 12708869, -8456199, 2014099, -9050574, -2369172, -5877341}, - }, - { - FieldElement{-22472376, -11568741, -27682020, 1146375, 18956691, 16640559, 1192730, -3714199, 15123619, 10811505}, - FieldElement{14352098, -3419715, -18942044, 10822655, 32750596, 4699007, -70363, 15776356, -28886779, -11974553}, - FieldElement{-28241164, -8072475, -4978962, -5315317, 29416931, 1847569, -20654173, -16484855, 4714547, -9600655}, - }, - { - FieldElement{15200332, 8368572, 19679101, 15970074, -31872674, 1959451, 24611599, -4543832, -11745876, 12340220}, - FieldElement{12876937, -10480056, 33134381, 6590940, -6307776, 14872440, 9613953, 8241152, 15370987, 9608631}, - FieldElement{-4143277, -12014408, 8446281, -391603, 4407738, 13629032, -7724868, 15866074, -28210621, -8814099}, - }, - { - FieldElement{26660628, -15677655, 8393734, 358047, -7401291, 992988, -23904233, 858697, 20571223, 8420556}, - FieldElement{14620715, 13067227, -15447274, 8264467, 14106269, 15080814, 33531827, 12516406, -21574435, -12476749}, - FieldElement{236881, 10476226, 57258, -14677024, 6472998, 2466984, 17258519, 7256740, 8791136, 15069930}, - }, - { - FieldElement{1276410, -9371918, 22949635, -16322807, -23493039, -5702186, 14711875, 4874229, -30663140, -2331391}, - FieldElement{5855666, 4990204, -13711848, 7294284, -7804282, 1924647, -1423175, -7912378, -33069337, 9234253}, - FieldElement{20590503, -9018988, 31529744, -7352666, -2706834, 10650548, 31559055, -11609587, 18979186, 13396066}, - }, - { - FieldElement{24474287, 4968103, 22267082, 4407354, 24063882, -8325180, -18816887, 13594782, 33514650, 7021958}, - FieldElement{-11566906, -6565505, -21365085, 15928892, -26158305, 4315421, -25948728, -3916677, -21480480, 12868082}, - FieldElement{-28635013, 13504661, 19988037, -2132761, 21078225, 6443208, -21446107, 2244500, -12455797, -8089383}, - }, - { - FieldElement{-30595528, 13793479, -5852820, 319136, -25723172, -6263899, 33086546, 8957937, -15233648, 5540521}, - FieldElement{-11630176, -11503902, -8119500, -7643073, 2620056, 1022908, -23710744, -1568984, -16128528, -14962807}, - FieldElement{23152971, 775386, 27395463, 14006635, -9701118, 4649512, 1689819, 892185, -11513277, -15205948}, - }, - { - FieldElement{9770129, 9586738, 26496094, 4324120, 1556511, -3550024, 27453819, 4763127, -19179614, 5867134}, - FieldElement{-32765025, 1927590, 31726409, -4753295, 23962434, -16019500, 27846559, 5931263, -29749703, -16108455}, - FieldElement{27461885, -2977536, 22380810, 1815854, -23033753, -3031938, 7283490, -15148073, -19526700, 7734629}, - }, - }, - { - { - FieldElement{-8010264, -9590817, -11120403, 6196038, 29344158, -13430885, 7585295, -3176626, 18549497, 15302069}, - FieldElement{-32658337, -6171222, -7672793, -11051681, 6258878, 13504381, 10458790, -6418461, -8872242, 8424746}, - FieldElement{24687205, 8613276, -30667046, -3233545, 1863892, -1830544, 19206234, 7134917, -11284482, -828919}, - }, - { - FieldElement{11334899, -9218022, 8025293, 12707519, 17523892, -10476071, 10243738, -14685461, -5066034, 16498837}, - FieldElement{8911542, 6887158, -9584260, -6958590, 11145641, -9543680, 17303925, -14124238, 6536641, 10543906}, - FieldElement{-28946384, 15479763, -17466835, 568876, -1497683, 11223454, -2669190, -16625574, -27235709, 8876771}, - }, - { - FieldElement{-25742899, -12566864, -15649966, -846607, -33026686, -796288, -33481822, 15824474, -604426, -9039817}, - FieldElement{10330056, 70051, 7957388, -9002667, 9764902, 15609756, 27698697, -4890037, 1657394, 3084098}, - FieldElement{10477963, -7470260, 12119566, -13250805, 29016247, -5365589, 31280319, 14396151, -30233575, 15272409}, - }, - { - FieldElement{-12288309, 3169463, 28813183, 16658753, 25116432, -5630466, -25173957, -12636138, -25014757, 1950504}, - FieldElement{-26180358, 9489187, 11053416, -14746161, -31053720, 5825630, -8384306, -8767532, 15341279, 8373727}, - FieldElement{28685821, 7759505, -14378516, -12002860, -31971820, 4079242, 298136, -10232602, -2878207, 15190420}, - }, - { - FieldElement{-32932876, 13806336, -14337485, -15794431, -24004620, 10940928, 8669718, 2742393, -26033313, -6875003}, - FieldElement{-1580388, -11729417, -25979658, -11445023, -17411874, -10912854, 9291594, -16247779, -12154742, 6048605}, - FieldElement{-30305315, 14843444, 1539301, 11864366, 20201677, 1900163, 13934231, 5128323, 11213262, 9168384}, - }, - { - FieldElement{-26280513, 11007847, 19408960, -940758, -18592965, -4328580, -5088060, -11105150, 20470157, -16398701}, - FieldElement{-23136053, 9282192, 14855179, -15390078, -7362815, -14408560, -22783952, 14461608, 14042978, 5230683}, - FieldElement{29969567, -2741594, -16711867, -8552442, 9175486, -2468974, 21556951, 3506042, -5933891, -12449708}, - }, - { - FieldElement{-3144746, 8744661, 19704003, 4581278, -20430686, 6830683, -21284170, 8971513, -28539189, 15326563}, - FieldElement{-19464629, 10110288, -17262528, -3503892, -23500387, 1355669, -15523050, 15300988, -20514118, 9168260}, - FieldElement{-5353335, 4488613, -23803248, 16314347, 7780487, -15638939, -28948358, 9601605, 33087103, -9011387}, - }, - { - FieldElement{-19443170, -15512900, -20797467, -12445323, -29824447, 10229461, -27444329, -15000531, -5996870, 15664672}, - FieldElement{23294591, -16632613, -22650781, -8470978, 27844204, 11461195, 13099750, -2460356, 18151676, 13417686}, - FieldElement{-24722913, -4176517, -31150679, 5988919, -26858785, 6685065, 1661597, -12551441, 15271676, -15452665}, - }, - }, - { - { - FieldElement{11433042, -13228665, 8239631, -5279517, -1985436, -725718, -18698764, 2167544, -6921301, -13440182}, - FieldElement{-31436171, 15575146, 30436815, 12192228, -22463353, 9395379, -9917708, -8638997, 12215110, 12028277}, - FieldElement{14098400, 6555944, 23007258, 5757252, -15427832, -12950502, 30123440, 4617780, -16900089, -655628}, - }, - { - FieldElement{-4026201, -15240835, 11893168, 13718664, -14809462, 1847385, -15819999, 10154009, 23973261, -12684474}, - FieldElement{-26531820, -3695990, -1908898, 2534301, -31870557, -16550355, 18341390, -11419951, 32013174, -10103539}, - FieldElement{-25479301, 10876443, -11771086, -14625140, -12369567, 1838104, 21911214, 6354752, 4425632, -837822}, - }, - { - FieldElement{-10433389, -14612966, 22229858, -3091047, -13191166, 776729, -17415375, -12020462, 4725005, 14044970}, - FieldElement{19268650, -7304421, 1555349, 8692754, -21474059, -9910664, 6347390, -1411784, -19522291, -16109756}, - FieldElement{-24864089, 12986008, -10898878, -5558584, -11312371, -148526, 19541418, 8180106, 9282262, 10282508}, - }, - { - FieldElement{-26205082, 4428547, -8661196, -13194263, 4098402, -14165257, 15522535, 8372215, 5542595, -10702683}, - FieldElement{-10562541, 14895633, 26814552, -16673850, -17480754, -2489360, -2781891, 6993761, -18093885, 10114655}, - FieldElement{-20107055, -929418, 31422704, 10427861, -7110749, 6150669, -29091755, -11529146, 25953725, -106158}, - }, - { - FieldElement{-4234397, -8039292, -9119125, 3046000, 2101609, -12607294, 19390020, 6094296, -3315279, 12831125}, - FieldElement{-15998678, 7578152, 5310217, 14408357, -33548620, -224739, 31575954, 6326196, 7381791, -2421839}, - FieldElement{-20902779, 3296811, 24736065, -16328389, 18374254, 7318640, 6295303, 8082724, -15362489, 12339664}, - }, - { - FieldElement{27724736, 2291157, 6088201, -14184798, 1792727, 5857634, 13848414, 15768922, 25091167, 14856294}, - FieldElement{-18866652, 8331043, 24373479, 8541013, -701998, -9269457, 12927300, -12695493, -22182473, -9012899}, - FieldElement{-11423429, -5421590, 11632845, 3405020, 30536730, -11674039, -27260765, 13866390, 30146206, 9142070}, - }, - { - FieldElement{3924129, -15307516, -13817122, -10054960, 12291820, -668366, -27702774, 9326384, -8237858, 4171294}, - FieldElement{-15921940, 16037937, 6713787, 16606682, -21612135, 2790944, 26396185, 3731949, 345228, -5462949}, - FieldElement{-21327538, 13448259, 25284571, 1143661, 20614966, -8849387, 2031539, -12391231, -16253183, -13582083}, - }, - { - FieldElement{31016211, -16722429, 26371392, -14451233, -5027349, 14854137, 17477601, 3842657, 28012650, -16405420}, - FieldElement{-5075835, 9368966, -8562079, -4600902, -15249953, 6970560, -9189873, 16292057, -8867157, 3507940}, - FieldElement{29439664, 3537914, 23333589, 6997794, -17555561, -11018068, -15209202, -15051267, -9164929, 6580396}, - }, - }, - { - { - FieldElement{-12185861, -7679788, 16438269, 10826160, -8696817, -6235611, 17860444, -9273846, -2095802, 9304567}, - FieldElement{20714564, -4336911, 29088195, 7406487, 11426967, -5095705, 14792667, -14608617, 5289421, -477127}, - FieldElement{-16665533, -10650790, -6160345, -13305760, 9192020, -1802462, 17271490, 12349094, 26939669, -3752294}, - }, - { - FieldElement{-12889898, 9373458, 31595848, 16374215, 21471720, 13221525, -27283495, -12348559, -3698806, 117887}, - FieldElement{22263325, -6560050, 3984570, -11174646, -15114008, -566785, 28311253, 5358056, -23319780, 541964}, - FieldElement{16259219, 3261970, 2309254, -15534474, -16885711, -4581916, 24134070, -16705829, -13337066, -13552195}, - }, - { - FieldElement{9378160, -13140186, -22845982, -12745264, 28198281, -7244098, -2399684, -717351, 690426, 14876244}, - FieldElement{24977353, -314384, -8223969, -13465086, 28432343, -1176353, -13068804, -12297348, -22380984, 6618999}, - FieldElement{-1538174, 11685646, 12944378, 13682314, -24389511, -14413193, 8044829, -13817328, 32239829, -5652762}, - }, - { - FieldElement{-18603066, 4762990, -926250, 8885304, -28412480, -3187315, 9781647, -10350059, 32779359, 5095274}, - FieldElement{-33008130, -5214506, -32264887, -3685216, 9460461, -9327423, -24601656, 14506724, 21639561, -2630236}, - FieldElement{-16400943, -13112215, 25239338, 15531969, 3987758, -4499318, -1289502, -6863535, 17874574, 558605}, - }, - { - FieldElement{-13600129, 10240081, 9171883, 16131053, -20869254, 9599700, 33499487, 5080151, 2085892, 5119761}, - FieldElement{-22205145, -2519528, -16381601, 414691, -25019550, 2170430, 30634760, -8363614, -31999993, -5759884}, - FieldElement{-6845704, 15791202, 8550074, -1312654, 29928809, -12092256, 27534430, -7192145, -22351378, 12961482}, - }, - { - FieldElement{-24492060, -9570771, 10368194, 11582341, -23397293, -2245287, 16533930, 8206996, -30194652, -5159638}, - FieldElement{-11121496, -3382234, 2307366, 6362031, -135455, 8868177, -16835630, 7031275, 7589640, 8945490}, - FieldElement{-32152748, 8917967, 6661220, -11677616, -1192060, -15793393, 7251489, -11182180, 24099109, -14456170}, - }, - { - FieldElement{5019558, -7907470, 4244127, -14714356, -26933272, 6453165, -19118182, -13289025, -6231896, -10280736}, - FieldElement{10853594, 10721687, 26480089, 5861829, -22995819, 1972175, -1866647, -10557898, -3363451, -6441124}, - FieldElement{-17002408, 5906790, 221599, -6563147, 7828208, -13248918, 24362661, -2008168, -13866408, 7421392}, - }, - { - FieldElement{8139927, -6546497, 32257646, -5890546, 30375719, 1886181, -21175108, 15441252, 28826358, -4123029}, - FieldElement{6267086, 9695052, 7709135, -16603597, -32869068, -1886135, 14795160, -7840124, 13746021, -1742048}, - FieldElement{28584902, 7787108, -6732942, -15050729, 22846041, -7571236, -3181936, -363524, 4771362, -8419958}, - }, - }, - { - { - FieldElement{24949256, 6376279, -27466481, -8174608, -18646154, -9930606, 33543569, -12141695, 3569627, 11342593}, - FieldElement{26514989, 4740088, 27912651, 3697550, 19331575, -11472339, 6809886, 4608608, 7325975, -14801071}, - FieldElement{-11618399, -14554430, -24321212, 7655128, -1369274, 5214312, -27400540, 10258390, -17646694, -8186692}, - }, - { - FieldElement{11431204, 15823007, 26570245, 14329124, 18029990, 4796082, -31446179, 15580664, 9280358, -3973687}, - FieldElement{-160783, -10326257, -22855316, -4304997, -20861367, -13621002, -32810901, -11181622, -15545091, 4387441}, - FieldElement{-20799378, 12194512, 3937617, -5805892, -27154820, 9340370, -24513992, 8548137, 20617071, -7482001}, - }, - { - FieldElement{-938825, -3930586, -8714311, 16124718, 24603125, -6225393, -13775352, -11875822, 24345683, 10325460}, - FieldElement{-19855277, -1568885, -22202708, 8714034, 14007766, 6928528, 16318175, -1010689, 4766743, 3552007}, - FieldElement{-21751364, -16730916, 1351763, -803421, -4009670, 3950935, 3217514, 14481909, 10988822, -3994762}, - }, - { - FieldElement{15564307, -14311570, 3101243, 5684148, 30446780, -8051356, 12677127, -6505343, -8295852, 13296005}, - FieldElement{-9442290, 6624296, -30298964, -11913677, -4670981, -2057379, 31521204, 9614054, -30000824, 12074674}, - FieldElement{4771191, -135239, 14290749, -13089852, 27992298, 14998318, -1413936, -1556716, 29832613, -16391035}, - }, - { - FieldElement{7064884, -7541174, -19161962, -5067537, -18891269, -2912736, 25825242, 5293297, -27122660, 13101590}, - FieldElement{-2298563, 2439670, -7466610, 1719965, -27267541, -16328445, 32512469, -5317593, -30356070, -4190957}, - FieldElement{-30006540, 10162316, -33180176, 3981723, -16482138, -13070044, 14413974, 9515896, 19568978, 9628812}, - }, - { - FieldElement{33053803, 199357, 15894591, 1583059, 27380243, -4580435, -17838894, -6106839, -6291786, 3437740}, - FieldElement{-18978877, 3884493, 19469877, 12726490, 15913552, 13614290, -22961733, 70104, 7463304, 4176122}, - FieldElement{-27124001, 10659917, 11482427, -16070381, 12771467, -6635117, -32719404, -5322751, 24216882, 5944158}, - }, - { - FieldElement{8894125, 7450974, -2664149, -9765752, -28080517, -12389115, 19345746, 14680796, 11632993, 5847885}, - FieldElement{26942781, -2315317, 9129564, -4906607, 26024105, 11769399, -11518837, 6367194, -9727230, 4782140}, - FieldElement{19916461, -4828410, -22910704, -11414391, 25606324, -5972441, 33253853, 8220911, 6358847, -1873857}, - }, - { - FieldElement{801428, -2081702, 16569428, 11065167, 29875704, 96627, 7908388, -4480480, -13538503, 1387155}, - FieldElement{19646058, 5720633, -11416706, 12814209, 11607948, 12749789, 14147075, 15156355, -21866831, 11835260}, - FieldElement{19299512, 1155910, 28703737, 14890794, 2925026, 7269399, 26121523, 15467869, -26560550, 5052483}, - }, - }, - { - { - FieldElement{-3017432, 10058206, 1980837, 3964243, 22160966, 12322533, -6431123, -12618185, 12228557, -7003677}, - FieldElement{32944382, 14922211, -22844894, 5188528, 21913450, -8719943, 4001465, 13238564, -6114803, 8653815}, - FieldElement{22865569, -4652735, 27603668, -12545395, 14348958, 8234005, 24808405, 5719875, 28483275, 2841751}, - }, - { - FieldElement{-16420968, -1113305, -327719, -12107856, 21886282, -15552774, -1887966, -315658, 19932058, -12739203}, - FieldElement{-11656086, 10087521, -8864888, -5536143, -19278573, -3055912, 3999228, 13239134, -4777469, -13910208}, - FieldElement{1382174, -11694719, 17266790, 9194690, -13324356, 9720081, 20403944, 11284705, -14013818, 3093230}, - }, - { - FieldElement{16650921, -11037932, -1064178, 1570629, -8329746, 7352753, -302424, 16271225, -24049421, -6691850}, - FieldElement{-21911077, -5927941, -4611316, -5560156, -31744103, -10785293, 24123614, 15193618, -21652117, -16739389}, - FieldElement{-9935934, -4289447, -25279823, 4372842, 2087473, 10399484, 31870908, 14690798, 17361620, 11864968}, - }, - { - FieldElement{-11307610, 6210372, 13206574, 5806320, -29017692, -13967200, -12331205, -7486601, -25578460, -16240689}, - FieldElement{14668462, -12270235, 26039039, 15305210, 25515617, 4542480, 10453892, 6577524, 9145645, -6443880}, - FieldElement{5974874, 3053895, -9433049, -10385191, -31865124, 3225009, -7972642, 3936128, -5652273, -3050304}, - }, - { - FieldElement{30625386, -4729400, -25555961, -12792866, -20484575, 7695099, 17097188, -16303496, -27999779, 1803632}, - FieldElement{-3553091, 9865099, -5228566, 4272701, -5673832, -16689700, 14911344, 12196514, -21405489, 7047412}, - FieldElement{20093277, 9920966, -11138194, -5343857, 13161587, 12044805, -32856851, 4124601, -32343828, -10257566}, - }, - { - FieldElement{-20788824, 14084654, -13531713, 7842147, 19119038, -13822605, 4752377, -8714640, -21679658, 2288038}, - FieldElement{-26819236, -3283715, 29965059, 3039786, -14473765, 2540457, 29457502, 14625692, -24819617, 12570232}, - FieldElement{-1063558, -11551823, 16920318, 12494842, 1278292, -5869109, -21159943, -3498680, -11974704, 4724943}, - }, - { - FieldElement{17960970, -11775534, -4140968, -9702530, -8876562, -1410617, -12907383, -8659932, -29576300, 1903856}, - FieldElement{23134274, -14279132, -10681997, -1611936, 20684485, 15770816, -12989750, 3190296, 26955097, 14109738}, - FieldElement{15308788, 5320727, -30113809, -14318877, 22902008, 7767164, 29425325, -11277562, 31960942, 11934971}, - }, - { - FieldElement{-27395711, 8435796, 4109644, 12222639, -24627868, 14818669, 20638173, 4875028, 10491392, 1379718}, - FieldElement{-13159415, 9197841, 3875503, -8936108, -1383712, -5879801, 33518459, 16176658, 21432314, 12180697}, - FieldElement{-11787308, 11500838, 13787581, -13832590, -22430679, 10140205, 1465425, 12689540, -10301319, -13872883}, - }, - }, - { - { - FieldElement{5414091, -15386041, -21007664, 9643570, 12834970, 1186149, -2622916, -1342231, 26128231, 6032912}, - FieldElement{-26337395, -13766162, 32496025, -13653919, 17847801, -12669156, 3604025, 8316894, -25875034, -10437358}, - FieldElement{3296484, 6223048, 24680646, -12246460, -23052020, 5903205, -8862297, -4639164, 12376617, 3188849}, - }, - { - FieldElement{29190488, -14659046, 27549113, -1183516, 3520066, -10697301, 32049515, -7309113, -16109234, -9852307}, - FieldElement{-14744486, -9309156, 735818, -598978, -20407687, -5057904, 25246078, -15795669, 18640741, -960977}, - FieldElement{-6928835, -16430795, 10361374, 5642961, 4910474, 12345252, -31638386, -494430, 10530747, 1053335}, - }, - { - FieldElement{-29265967, -14186805, -13538216, -12117373, -19457059, -10655384, -31462369, -2948985, 24018831, 15026644}, - FieldElement{-22592535, -3145277, -2289276, 5953843, -13440189, 9425631, 25310643, 13003497, -2314791, -15145616}, - FieldElement{-27419985, -603321, -8043984, -1669117, -26092265, 13987819, -27297622, 187899, -23166419, -2531735}, - }, - { - FieldElement{-21744398, -13810475, 1844840, 5021428, -10434399, -15911473, 9716667, 16266922, -5070217, 726099}, - FieldElement{29370922, -6053998, 7334071, -15342259, 9385287, 2247707, -13661962, -4839461, 30007388, -15823341}, - FieldElement{-936379, 16086691, 23751945, -543318, -1167538, -5189036, 9137109, 730663, 9835848, 4555336}, - }, - { - FieldElement{-23376435, 1410446, -22253753, -12899614, 30867635, 15826977, 17693930, 544696, -11985298, 12422646}, - FieldElement{31117226, -12215734, -13502838, 6561947, -9876867, -12757670, -5118685, -4096706, 29120153, 13924425}, - FieldElement{-17400879, -14233209, 19675799, -2734756, -11006962, -5858820, -9383939, -11317700, 7240931, -237388}, - }, - { - FieldElement{-31361739, -11346780, -15007447, -5856218, -22453340, -12152771, 1222336, 4389483, 3293637, -15551743}, - FieldElement{-16684801, -14444245, 11038544, 11054958, -13801175, -3338533, -24319580, 7733547, 12796905, -6335822}, - FieldElement{-8759414, -10817836, -25418864, 10783769, -30615557, -9746811, -28253339, 3647836, 3222231, -11160462}, - }, - { - FieldElement{18606113, 1693100, -25448386, -15170272, 4112353, 10045021, 23603893, -2048234, -7550776, 2484985}, - FieldElement{9255317, -3131197, -12156162, -1004256, 13098013, -9214866, 16377220, -2102812, -19802075, -3034702}, - FieldElement{-22729289, 7496160, -5742199, 11329249, 19991973, -3347502, -31718148, 9936966, -30097688, -10618797}, - }, - { - FieldElement{21878590, -5001297, 4338336, 13643897, -3036865, 13160960, 19708896, 5415497, -7360503, -4109293}, - FieldElement{27736861, 10103576, 12500508, 8502413, -3413016, -9633558, 10436918, -1550276, -23659143, -8132100}, - FieldElement{19492550, -12104365, -29681976, -852630, -3208171, 12403437, 30066266, 8367329, 13243957, 8709688}, - }, - }, - { - { - FieldElement{12015105, 2801261, 28198131, 10151021, 24818120, -4743133, -11194191, -5645734, 5150968, 7274186}, - FieldElement{2831366, -12492146, 1478975, 6122054, 23825128, -12733586, 31097299, 6083058, 31021603, -9793610}, - FieldElement{-2529932, -2229646, 445613, 10720828, -13849527, -11505937, -23507731, 16354465, 15067285, -14147707}, - }, - { - FieldElement{7840942, 14037873, -33364863, 15934016, -728213, -3642706, 21403988, 1057586, -19379462, -12403220}, - FieldElement{915865, -16469274, 15608285, -8789130, -24357026, 6060030, -17371319, 8410997, -7220461, 16527025}, - FieldElement{32922597, -556987, 20336074, -16184568, 10903705, -5384487, 16957574, 52992, 23834301, 6588044}, - }, - { - FieldElement{32752030, 11232950, 3381995, -8714866, 22652988, -10744103, 17159699, 16689107, -20314580, -1305992}, - FieldElement{-4689649, 9166776, -25710296, -10847306, 11576752, 12733943, 7924251, -2752281, 1976123, -7249027}, - FieldElement{21251222, 16309901, -2983015, -6783122, 30810597, 12967303, 156041, -3371252, 12331345, -8237197}, - }, - { - FieldElement{8651614, -4477032, -16085636, -4996994, 13002507, 2950805, 29054427, -5106970, 10008136, -4667901}, - FieldElement{31486080, 15114593, -14261250, 12951354, 14369431, -7387845, 16347321, -13662089, 8684155, -10532952}, - FieldElement{19443825, 11385320, 24468943, -9659068, -23919258, 2187569, -26263207, -6086921, 31316348, 14219878}, - }, - { - FieldElement{-28594490, 1193785, 32245219, 11392485, 31092169, 15722801, 27146014, 6992409, 29126555, 9207390}, - FieldElement{32382935, 1110093, 18477781, 11028262, -27411763, -7548111, -4980517, 10843782, -7957600, -14435730}, - FieldElement{2814918, 7836403, 27519878, -7868156, -20894015, -11553689, -21494559, 8550130, 28346258, 1994730}, - }, - { - FieldElement{-19578299, 8085545, -14000519, -3948622, 2785838, -16231307, -19516951, 7174894, 22628102, 8115180}, - FieldElement{-30405132, 955511, -11133838, -15078069, -32447087, -13278079, -25651578, 3317160, -9943017, 930272}, - FieldElement{-15303681, -6833769, 28856490, 1357446, 23421993, 1057177, 24091212, -1388970, -22765376, -10650715}, - }, - { - FieldElement{-22751231, -5303997, -12907607, -12768866, -15811511, -7797053, -14839018, -16554220, -1867018, 8398970}, - FieldElement{-31969310, 2106403, -4736360, 1362501, 12813763, 16200670, 22981545, -6291273, 18009408, -15772772}, - FieldElement{-17220923, -9545221, -27784654, 14166835, 29815394, 7444469, 29551787, -3727419, 19288549, 1325865}, - }, - { - FieldElement{15100157, -15835752, -23923978, -1005098, -26450192, 15509408, 12376730, -3479146, 33166107, -8042750}, - FieldElement{20909231, 13023121, -9209752, 16251778, -5778415, -8094914, 12412151, 10018715, 2213263, -13878373}, - FieldElement{32529814, -11074689, 30361439, -16689753, -9135940, 1513226, 22922121, 6382134, -5766928, 8371348}, - }, - }, - { - { - FieldElement{9923462, 11271500, 12616794, 3544722, -29998368, -1721626, 12891687, -8193132, -26442943, 10486144}, - FieldElement{-22597207, -7012665, 8587003, -8257861, 4084309, -12970062, 361726, 2610596, -23921530, -11455195}, - FieldElement{5408411, -1136691, -4969122, 10561668, 24145918, 14240566, 31319731, -4235541, 19985175, -3436086}, - }, - { - FieldElement{-13994457, 16616821, 14549246, 3341099, 32155958, 13648976, -17577068, 8849297, 65030, 8370684}, - FieldElement{-8320926, -12049626, 31204563, 5839400, -20627288, -1057277, -19442942, 6922164, 12743482, -9800518}, - FieldElement{-2361371, 12678785, 28815050, 4759974, -23893047, 4884717, 23783145, 11038569, 18800704, 255233}, - }, - { - FieldElement{-5269658, -1773886, 13957886, 7990715, 23132995, 728773, 13393847, 9066957, 19258688, -14753793}, - FieldElement{-2936654, -10827535, -10432089, 14516793, -3640786, 4372541, -31934921, 2209390, -1524053, 2055794}, - FieldElement{580882, 16705327, 5468415, -2683018, -30926419, -14696000, -7203346, -8994389, -30021019, 7394435}, - }, - { - FieldElement{23838809, 1822728, -15738443, 15242727, 8318092, -3733104, -21672180, -3492205, -4821741, 14799921}, - FieldElement{13345610, 9759151, 3371034, -16137791, 16353039, 8577942, 31129804, 13496856, -9056018, 7402518}, - FieldElement{2286874, -4435931, -20042458, -2008336, -13696227, 5038122, 11006906, -15760352, 8205061, 1607563}, - }, - { - FieldElement{14414086, -8002132, 3331830, -3208217, 22249151, -5594188, 18364661, -2906958, 30019587, -9029278}, - FieldElement{-27688051, 1585953, -10775053, 931069, -29120221, -11002319, -14410829, 12029093, 9944378, 8024}, - FieldElement{4368715, -3709630, 29874200, -15022983, -20230386, -11410704, -16114594, -999085, -8142388, 5640030}, - }, - { - FieldElement{10299610, 13746483, 11661824, 16234854, 7630238, 5998374, 9809887, -16694564, 15219798, -14327783}, - FieldElement{27425505, -5719081, 3055006, 10660664, 23458024, 595578, -15398605, -1173195, -18342183, 9742717}, - FieldElement{6744077, 2427284, 26042789, 2720740, -847906, 1118974, 32324614, 7406442, 12420155, 1994844}, - }, - { - FieldElement{14012521, -5024720, -18384453, -9578469, -26485342, -3936439, -13033478, -10909803, 24319929, -6446333}, - FieldElement{16412690, -4507367, 10772641, 15929391, -17068788, -4658621, 10555945, -10484049, -30102368, -4739048}, - FieldElement{22397382, -7767684, -9293161, -12792868, 17166287, -9755136, -27333065, 6199366, 21880021, -12250760}, - }, - { - FieldElement{-4283307, 5368523, -31117018, 8163389, -30323063, 3209128, 16557151, 8890729, 8840445, 4957760}, - FieldElement{-15447727, 709327, -6919446, -10870178, -29777922, 6522332, -21720181, 12130072, -14796503, 5005757}, - FieldElement{-2114751, -14308128, 23019042, 15765735, -25269683, 6002752, 10183197, -13239326, -16395286, -2176112}, - }, - }, - { - { - FieldElement{-19025756, 1632005, 13466291, -7995100, -23640451, 16573537, -32013908, -3057104, 22208662, 2000468}, - FieldElement{3065073, -1412761, -25598674, -361432, -17683065, -5703415, -8164212, 11248527, -3691214, -7414184}, - FieldElement{10379208, -6045554, 8877319, 1473647, -29291284, -12507580, 16690915, 2553332, -3132688, 16400289}, - }, - { - FieldElement{15716668, 1254266, -18472690, 7446274, -8448918, 6344164, -22097271, -7285580, 26894937, 9132066}, - FieldElement{24158887, 12938817, 11085297, -8177598, -28063478, -4457083, -30576463, 64452, -6817084, -2692882}, - FieldElement{13488534, 7794716, 22236231, 5989356, 25426474, -12578208, 2350710, -3418511, -4688006, 2364226}, - }, - { - FieldElement{16335052, 9132434, 25640582, 6678888, 1725628, 8517937, -11807024, -11697457, 15445875, -7798101}, - FieldElement{29004207, -7867081, 28661402, -640412, -12794003, -7943086, 31863255, -4135540, -278050, -15759279}, - FieldElement{-6122061, -14866665, -28614905, 14569919, -10857999, -3591829, 10343412, -6976290, -29828287, -10815811}, - }, - { - FieldElement{27081650, 3463984, 14099042, -4517604, 1616303, -6205604, 29542636, 15372179, 17293797, 960709}, - FieldElement{20263915, 11434237, -5765435, 11236810, 13505955, -10857102, -16111345, 6493122, -19384511, 7639714}, - FieldElement{-2830798, -14839232, 25403038, -8215196, -8317012, -16173699, 18006287, -16043750, 29994677, -15808121}, - }, - { - FieldElement{9769828, 5202651, -24157398, -13631392, -28051003, -11561624, -24613141, -13860782, -31184575, 709464}, - FieldElement{12286395, 13076066, -21775189, -1176622, -25003198, 4057652, -32018128, -8890874, 16102007, 13205847}, - FieldElement{13733362, 5599946, 10557076, 3195751, -5557991, 8536970, -25540170, 8525972, 10151379, 10394400}, - }, - { - FieldElement{4024660, -16137551, 22436262, 12276534, -9099015, -2686099, 19698229, 11743039, -33302334, 8934414}, - FieldElement{-15879800, -4525240, -8580747, -2934061, 14634845, -698278, -9449077, 3137094, -11536886, 11721158}, - FieldElement{17555939, -5013938, 8268606, 2331751, -22738815, 9761013, 9319229, 8835153, -9205489, -1280045}, - }, - { - FieldElement{-461409, -7830014, 20614118, 16688288, -7514766, -4807119, 22300304, 505429, 6108462, -6183415}, - FieldElement{-5070281, 12367917, -30663534, 3234473, 32617080, -8422642, 29880583, -13483331, -26898490, -7867459}, - FieldElement{-31975283, 5726539, 26934134, 10237677, -3173717, -605053, 24199304, 3795095, 7592688, -14992079}, - }, - { - FieldElement{21594432, -14964228, 17466408, -4077222, 32537084, 2739898, 6407723, 12018833, -28256052, 4298412}, - FieldElement{-20650503, -11961496, -27236275, 570498, 3767144, -1717540, 13891942, -1569194, 13717174, 10805743}, - FieldElement{-14676630, -15644296, 15287174, 11927123, 24177847, -8175568, -796431, 14860609, -26938930, -5863836}, - }, - }, - { - { - FieldElement{12962541, 5311799, -10060768, 11658280, 18855286, -7954201, 13286263, -12808704, -4381056, 9882022}, - FieldElement{18512079, 11319350, -20123124, 15090309, 18818594, 5271736, -22727904, 3666879, -23967430, -3299429}, - FieldElement{-6789020, -3146043, 16192429, 13241070, 15898607, -14206114, -10084880, -6661110, -2403099, 5276065}, - }, - { - FieldElement{30169808, -5317648, 26306206, -11750859, 27814964, 7069267, 7152851, 3684982, 1449224, 13082861}, - FieldElement{10342826, 3098505, 2119311, 193222, 25702612, 12233820, 23697382, 15056736, -21016438, -8202000}, - FieldElement{-33150110, 3261608, 22745853, 7948688, 19370557, -15177665, -26171976, 6482814, -10300080, -11060101}, - }, - { - FieldElement{32869458, -5408545, 25609743, 15678670, -10687769, -15471071, 26112421, 2521008, -22664288, 6904815}, - FieldElement{29506923, 4457497, 3377935, -9796444, -30510046, 12935080, 1561737, 3841096, -29003639, -6657642}, - FieldElement{10340844, -6630377, -18656632, -2278430, 12621151, -13339055, 30878497, -11824370, -25584551, 5181966}, - }, - { - FieldElement{25940115, -12658025, 17324188, -10307374, -8671468, 15029094, 24396252, -16450922, -2322852, -12388574}, - FieldElement{-21765684, 9916823, -1300409, 4079498, -1028346, 11909559, 1782390, 12641087, 20603771, -6561742}, - FieldElement{-18882287, -11673380, 24849422, 11501709, 13161720, -4768874, 1925523, 11914390, 4662781, 7820689}, - }, - { - FieldElement{12241050, -425982, 8132691, 9393934, 32846760, -1599620, 29749456, 12172924, 16136752, 15264020}, - FieldElement{-10349955, -14680563, -8211979, 2330220, -17662549, -14545780, 10658213, 6671822, 19012087, 3772772}, - FieldElement{3753511, -3421066, 10617074, 2028709, 14841030, -6721664, 28718732, -15762884, 20527771, 12988982}, - }, - { - FieldElement{-14822485, -5797269, -3707987, 12689773, -898983, -10914866, -24183046, -10564943, 3299665, -12424953}, - FieldElement{-16777703, -15253301, -9642417, 4978983, 3308785, 8755439, 6943197, 6461331, -25583147, 8991218}, - FieldElement{-17226263, 1816362, -1673288, -6086439, 31783888, -8175991, -32948145, 7417950, -30242287, 1507265}, - }, - { - FieldElement{29692663, 6829891, -10498800, 4334896, 20945975, -11906496, -28887608, 8209391, 14606362, -10647073}, - FieldElement{-3481570, 8707081, 32188102, 5672294, 22096700, 1711240, -33020695, 9761487, 4170404, -2085325}, - FieldElement{-11587470, 14855945, -4127778, -1531857, -26649089, 15084046, 22186522, 16002000, -14276837, -8400798}, - }, - { - FieldElement{-4811456, 13761029, -31703877, -2483919, -3312471, 7869047, -7113572, -9620092, 13240845, 10965870}, - FieldElement{-7742563, -8256762, -14768334, -13656260, -23232383, 12387166, 4498947, 14147411, 29514390, 4302863}, - FieldElement{-13413405, -12407859, 20757302, -13801832, 14785143, 8976368, -5061276, -2144373, 17846988, -13971927}, - }, - }, - { - { - FieldElement{-2244452, -754728, -4597030, -1066309, -6247172, 1455299, -21647728, -9214789, -5222701, 12650267}, - FieldElement{-9906797, -16070310, 21134160, 12198166, -27064575, 708126, 387813, 13770293, -19134326, 10958663}, - FieldElement{22470984, 12369526, 23446014, -5441109, -21520802, -9698723, -11772496, -11574455, -25083830, 4271862}, - }, - { - FieldElement{-25169565, -10053642, -19909332, 15361595, -5984358, 2159192, 75375, -4278529, -32526221, 8469673}, - FieldElement{15854970, 4148314, -8893890, 7259002, 11666551, 13824734, -30531198, 2697372, 24154791, -9460943}, - FieldElement{15446137, -15806644, 29759747, 14019369, 30811221, -9610191, -31582008, 12840104, 24913809, 9815020}, - }, - { - FieldElement{-4709286, -5614269, -31841498, -12288893, -14443537, 10799414, -9103676, 13438769, 18735128, 9466238}, - FieldElement{11933045, 9281483, 5081055, -5183824, -2628162, -4905629, -7727821, -10896103, -22728655, 16199064}, - FieldElement{14576810, 379472, -26786533, -8317236, -29426508, -10812974, -102766, 1876699, 30801119, 2164795}, - }, - { - FieldElement{15995086, 3199873, 13672555, 13712240, -19378835, -4647646, -13081610, -15496269, -13492807, 1268052}, - FieldElement{-10290614, -3659039, -3286592, 10948818, 23037027, 3794475, -3470338, -12600221, -17055369, 3565904}, - FieldElement{29210088, -9419337, -5919792, -4952785, 10834811, -13327726, -16512102, -10820713, -27162222, -14030531}, - }, - { - FieldElement{-13161890, 15508588, 16663704, -8156150, -28349942, 9019123, -29183421, -3769423, 2244111, -14001979}, - FieldElement{-5152875, -3800936, -9306475, -6071583, 16243069, 14684434, -25673088, -16180800, 13491506, 4641841}, - FieldElement{10813417, 643330, -19188515, -728916, 30292062, -16600078, 27548447, -7721242, 14476989, -12767431}, - }, - { - FieldElement{10292079, 9984945, 6481436, 8279905, -7251514, 7032743, 27282937, -1644259, -27912810, 12651324}, - FieldElement{-31185513, -813383, 22271204, 11835308, 10201545, 15351028, 17099662, 3988035, 21721536, -3148940}, - FieldElement{10202177, -6545839, -31373232, -9574638, -32150642, -8119683, -12906320, 3852694, 13216206, 14842320}, - }, - { - FieldElement{-15815640, -10601066, -6538952, -7258995, -6984659, -6581778, -31500847, 13765824, -27434397, 9900184}, - FieldElement{14465505, -13833331, -32133984, -14738873, -27443187, 12990492, 33046193, 15796406, -7051866, -8040114}, - FieldElement{30924417, -8279620, 6359016, -12816335, 16508377, 9071735, -25488601, 15413635, 9524356, -7018878}, - }, - { - FieldElement{12274201, -13175547, 32627641, -1785326, 6736625, 13267305, 5237659, -5109483, 15663516, 4035784}, - FieldElement{-2951309, 8903985, 17349946, 601635, -16432815, -4612556, -13732739, -15889334, -22258478, 4659091}, - FieldElement{-16916263, -4952973, -30393711, -15158821, 20774812, 15897498, 5736189, 15026997, -2178256, -13455585}, - }, - }, - { - { - FieldElement{-8858980, -2219056, 28571666, -10155518, -474467, -10105698, -3801496, 278095, 23440562, -290208}, - FieldElement{10226241, -5928702, 15139956, 120818, -14867693, 5218603, 32937275, 11551483, -16571960, -7442864}, - FieldElement{17932739, -12437276, -24039557, 10749060, 11316803, 7535897, 22503767, 5561594, -3646624, 3898661}, - }, - { - FieldElement{7749907, -969567, -16339731, -16464, -25018111, 15122143, -1573531, 7152530, 21831162, 1245233}, - FieldElement{26958459, -14658026, 4314586, 8346991, -5677764, 11960072, -32589295, -620035, -30402091, -16716212}, - FieldElement{-12165896, 9166947, 33491384, 13673479, 29787085, 13096535, 6280834, 14587357, -22338025, 13987525}, - }, - { - FieldElement{-24349909, 7778775, 21116000, 15572597, -4833266, -5357778, -4300898, -5124639, -7469781, -2858068}, - FieldElement{9681908, -6737123, -31951644, 13591838, -6883821, 386950, 31622781, 6439245, -14581012, 4091397}, - FieldElement{-8426427, 1470727, -28109679, -1596990, 3978627, -5123623, -19622683, 12092163, 29077877, -14741988}, - }, - { - FieldElement{5269168, -6859726, -13230211, -8020715, 25932563, 1763552, -5606110, -5505881, -20017847, 2357889}, - FieldElement{32264008, -15407652, -5387735, -1160093, -2091322, -3946900, 23104804, -12869908, 5727338, 189038}, - FieldElement{14609123, -8954470, -6000566, -16622781, -14577387, -7743898, -26745169, 10942115, -25888931, -14884697}, - }, - { - FieldElement{20513500, 5557931, -15604613, 7829531, 26413943, -2019404, -21378968, 7471781, 13913677, -5137875}, - FieldElement{-25574376, 11967826, 29233242, 12948236, -6754465, 4713227, -8940970, 14059180, 12878652, 8511905}, - FieldElement{-25656801, 3393631, -2955415, -7075526, -2250709, 9366908, -30223418, 6812974, 5568676, -3127656}, - }, - { - FieldElement{11630004, 12144454, 2116339, 13606037, 27378885, 15676917, -17408753, -13504373, -14395196, 8070818}, - FieldElement{27117696, -10007378, -31282771, -5570088, 1127282, 12772488, -29845906, 10483306, -11552749, -1028714}, - FieldElement{10637467, -5688064, 5674781, 1072708, -26343588, -6982302, -1683975, 9177853, -27493162, 15431203}, - }, - { - FieldElement{20525145, 10892566, -12742472, 12779443, -29493034, 16150075, -28240519, 14943142, -15056790, -7935931}, - FieldElement{-30024462, 5626926, -551567, -9981087, 753598, 11981191, 25244767, -3239766, -3356550, 9594024}, - FieldElement{-23752644, 2636870, -5163910, -10103818, 585134, 7877383, 11345683, -6492290, 13352335, -10977084}, - }, - { - FieldElement{-1931799, -5407458, 3304649, -12884869, 17015806, -4877091, -29783850, -7752482, -13215537, -319204}, - FieldElement{20239939, 6607058, 6203985, 3483793, -18386976, -779229, -20723742, 15077870, -22750759, 14523817}, - FieldElement{27406042, -6041657, 27423596, -4497394, 4996214, 10002360, -28842031, -4545494, -30172742, -4805667}, - }, - }, - { - { - FieldElement{11374242, 12660715, 17861383, -12540833, 10935568, 1099227, -13886076, -9091740, -27727044, 11358504}, - FieldElement{-12730809, 10311867, 1510375, 10778093, -2119455, -9145702, 32676003, 11149336, -26123651, 4985768}, - FieldElement{-19096303, 341147, -6197485, -239033, 15756973, -8796662, -983043, 13794114, -19414307, -15621255}, - }, - { - FieldElement{6490081, 11940286, 25495923, -7726360, 8668373, -8751316, 3367603, 6970005, -1691065, -9004790}, - FieldElement{1656497, 13457317, 15370807, 6364910, 13605745, 8362338, -19174622, -5475723, -16796596, -5031438}, - FieldElement{-22273315, -13524424, -64685, -4334223, -18605636, -10921968, -20571065, -7007978, -99853, -10237333}, - }, - { - FieldElement{17747465, 10039260, 19368299, -4050591, -20630635, -16041286, 31992683, -15857976, -29260363, -5511971}, - FieldElement{31932027, -4986141, -19612382, 16366580, 22023614, 88450, 11371999, -3744247, 4882242, -10626905}, - FieldElement{29796507, 37186, 19818052, 10115756, -11829032, 3352736, 18551198, 3272828, -5190932, -4162409}, - }, - { - FieldElement{12501286, 4044383, -8612957, -13392385, -32430052, 5136599, -19230378, -3529697, 330070, -3659409}, - FieldElement{6384877, 2899513, 17807477, 7663917, -2358888, 12363165, 25366522, -8573892, -271295, 12071499}, - FieldElement{-8365515, -4042521, 25133448, -4517355, -6211027, 2265927, -32769618, 1936675, -5159697, 3829363}, - }, - { - FieldElement{28425966, -5835433, -577090, -4697198, -14217555, 6870930, 7921550, -6567787, 26333140, 14267664}, - FieldElement{-11067219, 11871231, 27385719, -10559544, -4585914, -11189312, 10004786, -8709488, -21761224, 8930324}, - FieldElement{-21197785, -16396035, 25654216, -1725397, 12282012, 11008919, 1541940, 4757911, -26491501, -16408940}, - }, - { - FieldElement{13537262, -7759490, -20604840, 10961927, -5922820, -13218065, -13156584, 6217254, -15943699, 13814990}, - FieldElement{-17422573, 15157790, 18705543, 29619, 24409717, -260476, 27361681, 9257833, -1956526, -1776914}, - FieldElement{-25045300, -10191966, 15366585, 15166509, -13105086, 8423556, -29171540, 12361135, -18685978, 4578290}, - }, - { - FieldElement{24579768, 3711570, 1342322, -11180126, -27005135, 14124956, -22544529, 14074919, 21964432, 8235257}, - FieldElement{-6528613, -2411497, 9442966, -5925588, 12025640, -1487420, -2981514, -1669206, 13006806, 2355433}, - FieldElement{-16304899, -13605259, -6632427, -5142349, 16974359, -10911083, 27202044, 1719366, 1141648, -12796236}, - }, - { - FieldElement{-12863944, -13219986, -8318266, -11018091, -6810145, -4843894, 13475066, -3133972, 32674895, 13715045}, - FieldElement{11423335, -5468059, 32344216, 8962751, 24989809, 9241752, -13265253, 16086212, -28740881, -15642093}, - FieldElement{-1409668, 12530728, -6368726, 10847387, 19531186, -14132160, -11709148, 7791794, -27245943, 4383347}, - }, - }, - { - { - FieldElement{-28970898, 5271447, -1266009, -9736989, -12455236, 16732599, -4862407, -4906449, 27193557, 6245191}, - FieldElement{-15193956, 5362278, -1783893, 2695834, 4960227, 12840725, 23061898, 3260492, 22510453, 8577507}, - FieldElement{-12632451, 11257346, -32692994, 13548177, -721004, 10879011, 31168030, 13952092, -29571492, -3635906}, - }, - { - FieldElement{3877321, -9572739, 32416692, 5405324, -11004407, -13656635, 3759769, 11935320, 5611860, 8164018}, - FieldElement{-16275802, 14667797, 15906460, 12155291, -22111149, -9039718, 32003002, -8832289, 5773085, -8422109}, - FieldElement{-23788118, -8254300, 1950875, 8937633, 18686727, 16459170, -905725, 12376320, 31632953, 190926}, - }, - { - FieldElement{-24593607, -16138885, -8423991, 13378746, 14162407, 6901328, -8288749, 4508564, -25341555, -3627528}, - FieldElement{8884438, -5884009, 6023974, 10104341, -6881569, -4941533, 18722941, -14786005, -1672488, 827625}, - FieldElement{-32720583, -16289296, -32503547, 7101210, 13354605, 2659080, -1800575, -14108036, -24878478, 1541286}, - }, - { - FieldElement{2901347, -1117687, 3880376, -10059388, -17620940, -3612781, -21802117, -3567481, 20456845, -1885033}, - FieldElement{27019610, 12299467, -13658288, -1603234, -12861660, -4861471, -19540150, -5016058, 29439641, 15138866}, - FieldElement{21536104, -6626420, -32447818, -10690208, -22408077, 5175814, -5420040, -16361163, 7779328, 109896}, - }, - { - FieldElement{30279744, 14648750, -8044871, 6425558, 13639621, -743509, 28698390, 12180118, 23177719, -554075}, - FieldElement{26572847, 3405927, -31701700, 12890905, -19265668, 5335866, -6493768, 2378492, 4439158, -13279347}, - FieldElement{-22716706, 3489070, -9225266, -332753, 18875722, -1140095, 14819434, -12731527, -17717757, -5461437}, - }, - { - FieldElement{-5056483, 16566551, 15953661, 3767752, -10436499, 15627060, -820954, 2177225, 8550082, -15114165}, - FieldElement{-18473302, 16596775, -381660, 15663611, 22860960, 15585581, -27844109, -3582739, -23260460, -8428588}, - FieldElement{-32480551, 15707275, -8205912, -5652081, 29464558, 2713815, -22725137, 15860482, -21902570, 1494193}, - }, - { - FieldElement{-19562091, -14087393, -25583872, -9299552, 13127842, 759709, 21923482, 16529112, 8742704, 12967017}, - FieldElement{-28464899, 1553205, 32536856, -10473729, -24691605, -406174, -8914625, -2933896, -29903758, 15553883}, - FieldElement{21877909, 3230008, 9881174, 10539357, -4797115, 2841332, 11543572, 14513274, 19375923, -12647961}, - }, - { - FieldElement{8832269, -14495485, 13253511, 5137575, 5037871, 4078777, 24880818, -6222716, 2862653, 9455043}, - FieldElement{29306751, 5123106, 20245049, -14149889, 9592566, 8447059, -2077124, -2990080, 15511449, 4789663}, - FieldElement{-20679756, 7004547, 8824831, -9434977, -4045704, -3750736, -5754762, 108893, 23513200, 16652362}, - }, - }, - { - { - FieldElement{-33256173, 4144782, -4476029, -6579123, 10770039, -7155542, -6650416, -12936300, -18319198, 10212860}, - FieldElement{2756081, 8598110, 7383731, -6859892, 22312759, -1105012, 21179801, 2600940, -9988298, -12506466}, - FieldElement{-24645692, 13317462, -30449259, -15653928, 21365574, -10869657, 11344424, 864440, -2499677, -16710063}, - }, - { - FieldElement{-26432803, 6148329, -17184412, -14474154, 18782929, -275997, -22561534, 211300, 2719757, 4940997}, - FieldElement{-1323882, 3911313, -6948744, 14759765, -30027150, 7851207, 21690126, 8518463, 26699843, 5276295}, - FieldElement{-13149873, -6429067, 9396249, 365013, 24703301, -10488939, 1321586, 149635, -15452774, 7159369}, - }, - { - FieldElement{9987780, -3404759, 17507962, 9505530, 9731535, -2165514, 22356009, 8312176, 22477218, -8403385}, - FieldElement{18155857, -16504990, 19744716, 9006923, 15154154, -10538976, 24256460, -4864995, -22548173, 9334109}, - FieldElement{2986088, -4911893, 10776628, -3473844, 10620590, -7083203, -21413845, 14253545, -22587149, 536906}, - }, - { - FieldElement{4377756, 8115836, 24567078, 15495314, 11625074, 13064599, 7390551, 10589625, 10838060, -15420424}, - FieldElement{-19342404, 867880, 9277171, -3218459, -14431572, -1986443, 19295826, -15796950, 6378260, 699185}, - FieldElement{7895026, 4057113, -7081772, -13077756, -17886831, -323126, -716039, 15693155, -5045064, -13373962}, - }, - { - FieldElement{-7737563, -5869402, -14566319, -7406919, 11385654, 13201616, 31730678, -10962840, -3918636, -9669325}, - FieldElement{10188286, -15770834, -7336361, 13427543, 22223443, 14896287, 30743455, 7116568, -21786507, 5427593}, - FieldElement{696102, 13206899, 27047647, -10632082, 15285305, -9853179, 10798490, -4578720, 19236243, 12477404}, - }, - { - FieldElement{-11229439, 11243796, -17054270, -8040865, -788228, -8167967, -3897669, 11180504, -23169516, 7733644}, - FieldElement{17800790, -14036179, -27000429, -11766671, 23887827, 3149671, 23466177, -10538171, 10322027, 15313801}, - FieldElement{26246234, 11968874, 32263343, -5468728, 6830755, -13323031, -15794704, -101982, -24449242, 10890804}, - }, - { - FieldElement{-31365647, 10271363, -12660625, -6267268, 16690207, -13062544, -14982212, 16484931, 25180797, -5334884}, - FieldElement{-586574, 10376444, -32586414, -11286356, 19801893, 10997610, 2276632, 9482883, 316878, 13820577}, - FieldElement{-9882808, -4510367, -2115506, 16457136, -11100081, 11674996, 30756178, -7515054, 30696930, -3712849}, - }, - { - FieldElement{32988917, -9603412, 12499366, 7910787, -10617257, -11931514, -7342816, -9985397, -32349517, 7392473}, - FieldElement{-8855661, 15927861, 9866406, -3649411, -2396914, -16655781, -30409476, -9134995, 25112947, -2926644}, - FieldElement{-2504044, -436966, 25621774, -5678772, 15085042, -5479877, -24884878, -13526194, 5537438, -13914319}, - }, - }, - { - { - FieldElement{-11225584, 2320285, -9584280, 10149187, -33444663, 5808648, -14876251, -1729667, 31234590, 6090599}, - FieldElement{-9633316, 116426, 26083934, 2897444, -6364437, -2688086, 609721, 15878753, -6970405, -9034768}, - FieldElement{-27757857, 247744, -15194774, -9002551, 23288161, -10011936, -23869595, 6503646, 20650474, 1804084}, - }, - { - FieldElement{-27589786, 15456424, 8972517, 8469608, 15640622, 4439847, 3121995, -10329713, 27842616, -202328}, - FieldElement{-15306973, 2839644, 22530074, 10026331, 4602058, 5048462, 28248656, 5031932, -11375082, 12714369}, - FieldElement{20807691, -7270825, 29286141, 11421711, -27876523, -13868230, -21227475, 1035546, -19733229, 12796920}, - }, - { - FieldElement{12076899, -14301286, -8785001, -11848922, -25012791, 16400684, -17591495, -12899438, 3480665, -15182815}, - FieldElement{-32361549, 5457597, 28548107, 7833186, 7303070, -11953545, -24363064, -15921875, -33374054, 2771025}, - FieldElement{-21389266, 421932, 26597266, 6860826, 22486084, -6737172, -17137485, -4210226, -24552282, 15673397}, - }, - { - FieldElement{-20184622, 2338216, 19788685, -9620956, -4001265, -8740893, -20271184, 4733254, 3727144, -12934448}, - FieldElement{6120119, 814863, -11794402, -622716, 6812205, -15747771, 2019594, 7975683, 31123697, -10958981}, - FieldElement{30069250, -11435332, 30434654, 2958439, 18399564, -976289, 12296869, 9204260, -16432438, 9648165}, - }, - { - FieldElement{32705432, -1550977, 30705658, 7451065, -11805606, 9631813, 3305266, 5248604, -26008332, -11377501}, - FieldElement{17219865, 2375039, -31570947, -5575615, -19459679, 9219903, 294711, 15298639, 2662509, -16297073}, - FieldElement{-1172927, -7558695, -4366770, -4287744, -21346413, -8434326, 32087529, -1222777, 32247248, -14389861}, - }, - { - FieldElement{14312628, 1221556, 17395390, -8700143, -4945741, -8684635, -28197744, -9637817, -16027623, -13378845}, - FieldElement{-1428825, -9678990, -9235681, 6549687, -7383069, -468664, 23046502, 9803137, 17597934, 2346211}, - FieldElement{18510800, 15337574, 26171504, 981392, -22241552, 7827556, -23491134, -11323352, 3059833, -11782870}, - }, - { - FieldElement{10141598, 6082907, 17829293, -1947643, 9830092, 13613136, -25556636, -5544586, -33502212, 3592096}, - FieldElement{33114168, -15889352, -26525686, -13343397, 33076705, 8716171, 1151462, 1521897, -982665, -6837803}, - FieldElement{-32939165, -4255815, 23947181, -324178, -33072974, -12305637, -16637686, 3891704, 26353178, 693168}, - }, - { - FieldElement{30374239, 1595580, -16884039, 13186931, 4600344, 406904, 9585294, -400668, 31375464, 14369965}, - FieldElement{-14370654, -7772529, 1510301, 6434173, -18784789, -6262728, 32732230, -13108839, 17901441, 16011505}, - FieldElement{18171223, -11934626, -12500402, 15197122, -11038147, -15230035, -19172240, -16046376, 8764035, 12309598}, - }, - }, - { - { - FieldElement{5975908, -5243188, -19459362, -9681747, -11541277, 14015782, -23665757, 1228319, 17544096, -10593782}, - FieldElement{5811932, -1715293, 3442887, -2269310, -18367348, -8359541, -18044043, -15410127, -5565381, 12348900}, - FieldElement{-31399660, 11407555, 25755363, 6891399, -3256938, 14872274, -24849353, 8141295, -10632534, -585479}, - }, - { - FieldElement{-12675304, 694026, -5076145, 13300344, 14015258, -14451394, -9698672, -11329050, 30944593, 1130208}, - FieldElement{8247766, -6710942, -26562381, -7709309, -14401939, -14648910, 4652152, 2488540, 23550156, -271232}, - FieldElement{17294316, -3788438, 7026748, 15626851, 22990044, 113481, 2267737, -5908146, -408818, -137719}, - }, - { - FieldElement{16091085, -16253926, 18599252, 7340678, 2137637, -1221657, -3364161, 14550936, 3260525, -7166271}, - FieldElement{-4910104, -13332887, 18550887, 10864893, -16459325, -7291596, -23028869, -13204905, -12748722, 2701326}, - FieldElement{-8574695, 16099415, 4629974, -16340524, -20786213, -6005432, -10018363, 9276971, 11329923, 1862132}, - }, - { - FieldElement{14763076, -15903608, -30918270, 3689867, 3511892, 10313526, -21951088, 12219231, -9037963, -940300}, - FieldElement{8894987, -3446094, 6150753, 3013931, 301220, 15693451, -31981216, -2909717, -15438168, 11595570}, - FieldElement{15214962, 3537601, -26238722, -14058872, 4418657, -15230761, 13947276, 10730794, -13489462, -4363670}, - }, - { - FieldElement{-2538306, 7682793, 32759013, 263109, -29984731, -7955452, -22332124, -10188635, 977108, 699994}, - FieldElement{-12466472, 4195084, -9211532, 550904, -15565337, 12917920, 19118110, -439841, -30534533, -14337913}, - FieldElement{31788461, -14507657, 4799989, 7372237, 8808585, -14747943, 9408237, -10051775, 12493932, -5409317}, - }, - { - FieldElement{-25680606, 5260744, -19235809, -6284470, -3695942, 16566087, 27218280, 2607121, 29375955, 6024730}, - FieldElement{842132, -2794693, -4763381, -8722815, 26332018, -12405641, 11831880, 6985184, -9940361, 2854096}, - FieldElement{-4847262, -7969331, 2516242, -5847713, 9695691, -7221186, 16512645, 960770, 12121869, 16648078}, - }, - { - FieldElement{-15218652, 14667096, -13336229, 2013717, 30598287, -464137, -31504922, -7882064, 20237806, 2838411}, - FieldElement{-19288047, 4453152, 15298546, -16178388, 22115043, -15972604, 12544294, -13470457, 1068881, -12499905}, - FieldElement{-9558883, -16518835, 33238498, 13506958, 30505848, -1114596, -8486907, -2630053, 12521378, 4845654}, - }, - { - FieldElement{-28198521, 10744108, -2958380, 10199664, 7759311, -13088600, 3409348, -873400, -6482306, -12885870}, - FieldElement{-23561822, 6230156, -20382013, 10655314, -24040585, -11621172, 10477734, -1240216, -3113227, 13974498}, - FieldElement{12966261, 15550616, -32038948, -1615346, 21025980, -629444, 5642325, 7188737, 18895762, 12629579}, - }, - }, - { - { - FieldElement{14741879, -14946887, 22177208, -11721237, 1279741, 8058600, 11758140, 789443, 32195181, 3895677}, - FieldElement{10758205, 15755439, -4509950, 9243698, -4879422, 6879879, -2204575, -3566119, -8982069, 4429647}, - FieldElement{-2453894, 15725973, -20436342, -10410672, -5803908, -11040220, -7135870, -11642895, 18047436, -15281743}, - }, - { - FieldElement{-25173001, -11307165, 29759956, 11776784, -22262383, -15820455, 10993114, -12850837, -17620701, -9408468}, - FieldElement{21987233, 700364, -24505048, 14972008, -7774265, -5718395, 32155026, 2581431, -29958985, 8773375}, - FieldElement{-25568350, 454463, -13211935, 16126715, 25240068, 8594567, 20656846, 12017935, -7874389, -13920155}, - }, - { - FieldElement{6028182, 6263078, -31011806, -11301710, -818919, 2461772, -31841174, -5468042, -1721788, -2776725}, - FieldElement{-12278994, 16624277, 987579, -5922598, 32908203, 1248608, 7719845, -4166698, 28408820, 6816612}, - FieldElement{-10358094, -8237829, 19549651, -12169222, 22082623, 16147817, 20613181, 13982702, -10339570, 5067943}, - }, - { - FieldElement{-30505967, -3821767, 12074681, 13582412, -19877972, 2443951, -19719286, 12746132, 5331210, -10105944}, - FieldElement{30528811, 3601899, -1957090, 4619785, -27361822, -15436388, 24180793, -12570394, 27679908, -1648928}, - FieldElement{9402404, -13957065, 32834043, 10838634, -26580150, -13237195, 26653274, -8685565, 22611444, -12715406}, - }, - { - FieldElement{22190590, 1118029, 22736441, 15130463, -30460692, -5991321, 19189625, -4648942, 4854859, 6622139}, - FieldElement{-8310738, -2953450, -8262579, -3388049, -10401731, -271929, 13424426, -3567227, 26404409, 13001963}, - FieldElement{-31241838, -15415700, -2994250, 8939346, 11562230, -12840670, -26064365, -11621720, -15405155, 11020693}, - }, - { - FieldElement{1866042, -7949489, -7898649, -10301010, 12483315, 13477547, 3175636, -12424163, 28761762, 1406734}, - FieldElement{-448555, -1777666, 13018551, 3194501, -9580420, -11161737, 24760585, -4347088, 25577411, -13378680}, - FieldElement{-24290378, 4759345, -690653, -1852816, 2066747, 10693769, -29595790, 9884936, -9368926, 4745410}, - }, - { - FieldElement{-9141284, 6049714, -19531061, -4341411, -31260798, 9944276, -15462008, -11311852, 10931924, -11931931}, - FieldElement{-16561513, 14112680, -8012645, 4817318, -8040464, -11414606, -22853429, 10856641, -20470770, 13434654}, - FieldElement{22759489, -10073434, -16766264, -1871422, 13637442, -10168091, 1765144, -12654326, 28445307, -5364710}, - }, - { - FieldElement{29875063, 12493613, 2795536, -3786330, 1710620, 15181182, -10195717, -8788675, 9074234, 1167180}, - FieldElement{-26205683, 11014233, -9842651, -2635485, -26908120, 7532294, -18716888, -9535498, 3843903, 9367684}, - FieldElement{-10969595, -6403711, 9591134, 9582310, 11349256, 108879, 16235123, 8601684, -139197, 4242895}, - }, - }, - { - { - FieldElement{22092954, -13191123, -2042793, -11968512, 32186753, -11517388, -6574341, 2470660, -27417366, 16625501}, - FieldElement{-11057722, 3042016, 13770083, -9257922, 584236, -544855, -7770857, 2602725, -27351616, 14247413}, - FieldElement{6314175, -10264892, -32772502, 15957557, -10157730, 168750, -8618807, 14290061, 27108877, -1180880}, - }, - { - FieldElement{-8586597, -7170966, 13241782, 10960156, -32991015, -13794596, 33547976, -11058889, -27148451, 981874}, - FieldElement{22833440, 9293594, -32649448, -13618667, -9136966, 14756819, -22928859, -13970780, -10479804, -16197962}, - FieldElement{-7768587, 3326786, -28111797, 10783824, 19178761, 14905060, 22680049, 13906969, -15933690, 3797899}, - }, - { - FieldElement{21721356, -4212746, -12206123, 9310182, -3882239, -13653110, 23740224, -2709232, 20491983, -8042152}, - FieldElement{9209270, -15135055, -13256557, -6167798, -731016, 15289673, 25947805, 15286587, 30997318, -6703063}, - FieldElement{7392032, 16618386, 23946583, -8039892, -13265164, -1533858, -14197445, -2321576, 17649998, -250080}, - }, - { - FieldElement{-9301088, -14193827, 30609526, -3049543, -25175069, -1283752, -15241566, -9525724, -2233253, 7662146}, - FieldElement{-17558673, 1763594, -33114336, 15908610, -30040870, -12174295, 7335080, -8472199, -3174674, 3440183}, - FieldElement{-19889700, -5977008, -24111293, -9688870, 10799743, -16571957, 40450, -4431835, 4862400, 1133}, - }, - { - FieldElement{-32856209, -7873957, -5422389, 14860950, -16319031, 7956142, 7258061, 311861, -30594991, -7379421}, - FieldElement{-3773428, -1565936, 28985340, 7499440, 24445838, 9325937, 29727763, 16527196, 18278453, 15405622}, - FieldElement{-4381906, 8508652, -19898366, -3674424, -5984453, 15149970, -13313598, 843523, -21875062, 13626197}, - }, - { - FieldElement{2281448, -13487055, -10915418, -2609910, 1879358, 16164207, -10783882, 3953792, 13340839, 15928663}, - FieldElement{31727126, -7179855, -18437503, -8283652, 2875793, -16390330, -25269894, -7014826, -23452306, 5964753}, - FieldElement{4100420, -5959452, -17179337, 6017714, -18705837, 12227141, -26684835, 11344144, 2538215, -7570755}, - }, - { - FieldElement{-9433605, 6123113, 11159803, -2156608, 30016280, 14966241, -20474983, 1485421, -629256, -15958862}, - FieldElement{-26804558, 4260919, 11851389, 9658551, -32017107, 16367492, -20205425, -13191288, 11659922, -11115118}, - FieldElement{26180396, 10015009, -30844224, -8581293, 5418197, 9480663, 2231568, -10170080, 33100372, -1306171}, - }, - { - FieldElement{15121113, -5201871, -10389905, 15427821, -27509937, -15992507, 21670947, 4486675, -5931810, -14466380}, - FieldElement{16166486, -9483733, -11104130, 6023908, -31926798, -1364923, 2340060, -16254968, -10735770, -10039824}, - FieldElement{28042865, -3557089, -12126526, 12259706, -3717498, -6945899, 6766453, -8689599, 18036436, 5803270}, - }, - }, - { - { - FieldElement{-817581, 6763912, 11803561, 1585585, 10958447, -2671165, 23855391, 4598332, -6159431, -14117438}, - FieldElement{-31031306, -14256194, 17332029, -2383520, 31312682, -5967183, 696309, 50292, -20095739, 11763584}, - FieldElement{-594563, -2514283, -32234153, 12643980, 12650761, 14811489, 665117, -12613632, -19773211, -10713562}, - }, - { - FieldElement{30464590, -11262872, -4127476, -12734478, 19835327, -7105613, -24396175, 2075773, -17020157, 992471}, - FieldElement{18357185, -6994433, 7766382, 16342475, -29324918, 411174, 14578841, 8080033, -11574335, -10601610}, - FieldElement{19598397, 10334610, 12555054, 2555664, 18821899, -10339780, 21873263, 16014234, 26224780, 16452269}, - }, - { - FieldElement{-30223925, 5145196, 5944548, 16385966, 3976735, 2009897, -11377804, -7618186, -20533829, 3698650}, - FieldElement{14187449, 3448569, -10636236, -10810935, -22663880, -3433596, 7268410, -10890444, 27394301, 12015369}, - FieldElement{19695761, 16087646, 28032085, 12999827, 6817792, 11427614, 20244189, -1312777, -13259127, -3402461}, - }, - { - FieldElement{30860103, 12735208, -1888245, -4699734, -16974906, 2256940, -8166013, 12298312, -8550524, -10393462}, - FieldElement{-5719826, -11245325, -1910649, 15569035, 26642876, -7587760, -5789354, -15118654, -4976164, 12651793}, - FieldElement{-2848395, 9953421, 11531313, -5282879, 26895123, -12697089, -13118820, -16517902, 9768698, -2533218}, - }, - { - FieldElement{-24719459, 1894651, -287698, -4704085, 15348719, -8156530, 32767513, 12765450, 4940095, 10678226}, - FieldElement{18860224, 15980149, -18987240, -1562570, -26233012, -11071856, -7843882, 13944024, -24372348, 16582019}, - FieldElement{-15504260, 4970268, -29893044, 4175593, -20993212, -2199756, -11704054, 15444560, -11003761, 7989037}, - }, - { - FieldElement{31490452, 5568061, -2412803, 2182383, -32336847, 4531686, -32078269, 6200206, -19686113, -14800171}, - FieldElement{-17308668, -15879940, -31522777, -2831, -32887382, 16375549, 8680158, -16371713, 28550068, -6857132}, - FieldElement{-28126887, -5688091, 16837845, -1820458, -6850681, 12700016, -30039981, 4364038, 1155602, 5988841}, - }, - { - FieldElement{21890435, -13272907, -12624011, 12154349, -7831873, 15300496, 23148983, -4470481, 24618407, 8283181}, - FieldElement{-33136107, -10512751, 9975416, 6841041, -31559793, 16356536, 3070187, -7025928, 1466169, 10740210}, - FieldElement{-1509399, -15488185, -13503385, -10655916, 32799044, 909394, -13938903, -5779719, -32164649, -15327040}, - }, - { - FieldElement{3960823, -14267803, -28026090, -15918051, -19404858, 13146868, 15567327, 951507, -3260321, -573935}, - FieldElement{24740841, 5052253, -30094131, 8961361, 25877428, 6165135, -24368180, 14397372, -7380369, -6144105}, - FieldElement{-28888365, 3510803, -28103278, -1158478, -11238128, -10631454, -15441463, -14453128, -1625486, -6494814}, - }, - }, - { - { - FieldElement{793299, -9230478, 8836302, -6235707, -27360908, -2369593, 33152843, -4885251, -9906200, -621852}, - FieldElement{5666233, 525582, 20782575, -8038419, -24538499, 14657740, 16099374, 1468826, -6171428, -15186581}, - FieldElement{-4859255, -3779343, -2917758, -6748019, 7778750, 11688288, -30404353, -9871238, -1558923, -9863646}, - }, - { - FieldElement{10896332, -7719704, 824275, 472601, -19460308, 3009587, 25248958, 14783338, -30581476, -15757844}, - FieldElement{10566929, 12612572, -31944212, 11118703, -12633376, 12362879, 21752402, 8822496, 24003793, 14264025}, - FieldElement{27713862, -7355973, -11008240, 9227530, 27050101, 2504721, 23886875, -13117525, 13958495, -5732453}, - }, - { - FieldElement{-23481610, 4867226, -27247128, 3900521, 29838369, -8212291, -31889399, -10041781, 7340521, -15410068}, - FieldElement{4646514, -8011124, -22766023, -11532654, 23184553, 8566613, 31366726, -1381061, -15066784, -10375192}, - FieldElement{-17270517, 12723032, -16993061, 14878794, 21619651, -6197576, 27584817, 3093888, -8843694, 3849921}, - }, - { - FieldElement{-9064912, 2103172, 25561640, -15125738, -5239824, 9582958, 32477045, -9017955, 5002294, -15550259}, - FieldElement{-12057553, -11177906, 21115585, -13365155, 8808712, -12030708, 16489530, 13378448, -25845716, 12741426}, - FieldElement{-5946367, 10645103, -30911586, 15390284, -3286982, -7118677, 24306472, 15852464, 28834118, -7646072}, - }, - { - FieldElement{-17335748, -9107057, -24531279, 9434953, -8472084, -583362, -13090771, 455841, 20461858, 5491305}, - FieldElement{13669248, -16095482, -12481974, -10203039, -14569770, -11893198, -24995986, 11293807, -28588204, -9421832}, - FieldElement{28497928, 6272777, -33022994, 14470570, 8906179, -1225630, 18504674, -14165166, 29867745, -8795943}, - }, - { - FieldElement{-16207023, 13517196, -27799630, -13697798, 24009064, -6373891, -6367600, -13175392, 22853429, -4012011}, - FieldElement{24191378, 16712145, -13931797, 15217831, 14542237, 1646131, 18603514, -11037887, 12876623, -2112447}, - FieldElement{17902668, 4518229, -411702, -2829247, 26878217, 5258055, -12860753, 608397, 16031844, 3723494}, - }, - { - FieldElement{-28632773, 12763728, -20446446, 7577504, 33001348, -13017745, 17558842, -7872890, 23896954, -4314245}, - FieldElement{-20005381, -12011952, 31520464, 605201, 2543521, 5991821, -2945064, 7229064, -9919646, -8826859}, - FieldElement{28816045, 298879, -28165016, -15920938, 19000928, -1665890, -12680833, -2949325, -18051778, -2082915}, - }, - { - FieldElement{16000882, -344896, 3493092, -11447198, -29504595, -13159789, 12577740, 16041268, -19715240, 7847707}, - FieldElement{10151868, 10572098, 27312476, 7922682, 14825339, 4723128, -32855931, -6519018, -10020567, 3852848}, - FieldElement{-11430470, 15697596, -21121557, -4420647, 5386314, 15063598, 16514493, -15932110, 29330899, -15076224}, - }, - }, - { - { - FieldElement{-25499735, -4378794, -15222908, -6901211, 16615731, 2051784, 3303702, 15490, -27548796, 12314391}, - FieldElement{15683520, -6003043, 18109120, -9980648, 15337968, -5997823, -16717435, 15921866, 16103996, -3731215}, - FieldElement{-23169824, -10781249, 13588192, -1628807, -3798557, -1074929, -19273607, 5402699, -29815713, -9841101}, - }, - { - FieldElement{23190676, 2384583, -32714340, 3462154, -29903655, -1529132, -11266856, 8911517, -25205859, 2739713}, - FieldElement{21374101, -3554250, -33524649, 9874411, 15377179, 11831242, -33529904, 6134907, 4931255, 11987849}, - FieldElement{-7732, -2978858, -16223486, 7277597, 105524, -322051, -31480539, 13861388, -30076310, 10117930}, - }, - { - FieldElement{-29501170, -10744872, -26163768, 13051539, -25625564, 5089643, -6325503, 6704079, 12890019, 15728940}, - FieldElement{-21972360, -11771379, -951059, -4418840, 14704840, 2695116, 903376, -10428139, 12885167, 8311031}, - FieldElement{-17516482, 5352194, 10384213, -13811658, 7506451, 13453191, 26423267, 4384730, 1888765, -5435404}, - }, - { - FieldElement{-25817338, -3107312, -13494599, -3182506, 30896459, -13921729, -32251644, -12707869, -19464434, -3340243}, - FieldElement{-23607977, -2665774, -526091, 4651136, 5765089, 4618330, 6092245, 14845197, 17151279, -9854116}, - FieldElement{-24830458, -12733720, -15165978, 10367250, -29530908, -265356, 22825805, -7087279, -16866484, 16176525}, - }, - { - FieldElement{-23583256, 6564961, 20063689, 3798228, -4740178, 7359225, 2006182, -10363426, -28746253, -10197509}, - FieldElement{-10626600, -4486402, -13320562, -5125317, 3432136, -6393229, 23632037, -1940610, 32808310, 1099883}, - FieldElement{15030977, 5768825, -27451236, -2887299, -6427378, -15361371, -15277896, -6809350, 2051441, -15225865}, - }, - { - FieldElement{-3362323, -7239372, 7517890, 9824992, 23555850, 295369, 5148398, -14154188, -22686354, 16633660}, - FieldElement{4577086, -16752288, 13249841, -15304328, 19958763, -14537274, 18559670, -10759549, 8402478, -9864273}, - FieldElement{-28406330, -1051581, -26790155, -907698, -17212414, -11030789, 9453451, -14980072, 17983010, 9967138}, - }, - { - FieldElement{-25762494, 6524722, 26585488, 9969270, 24709298, 1220360, -1677990, 7806337, 17507396, 3651560}, - FieldElement{-10420457, -4118111, 14584639, 15971087, -15768321, 8861010, 26556809, -5574557, -18553322, -11357135}, - FieldElement{2839101, 14284142, 4029895, 3472686, 14402957, 12689363, -26642121, 8459447, -5605463, -7621941}, - }, - { - FieldElement{-4839289, -3535444, 9744961, 2871048, 25113978, 3187018, -25110813, -849066, 17258084, -7977739}, - FieldElement{18164541, -10595176, -17154882, -1542417, 19237078, -9745295, 23357533, -15217008, 26908270, 12150756}, - FieldElement{-30264870, -7647865, 5112249, -7036672, -1499807, -6974257, 43168, -5537701, -32302074, 16215819}, - }, - }, - { - { - FieldElement{-6898905, 9824394, -12304779, -4401089, -31397141, -6276835, 32574489, 12532905, -7503072, -8675347}, - FieldElement{-27343522, -16515468, -27151524, -10722951, 946346, 16291093, 254968, 7168080, 21676107, -1943028}, - FieldElement{21260961, -8424752, -16831886, -11920822, -23677961, 3968121, -3651949, -6215466, -3556191, -7913075}, - }, - { - FieldElement{16544754, 13250366, -16804428, 15546242, -4583003, 12757258, -2462308, -8680336, -18907032, -9662799}, - FieldElement{-2415239, -15577728, 18312303, 4964443, -15272530, -12653564, 26820651, 16690659, 25459437, -4564609}, - FieldElement{-25144690, 11425020, 28423002, -11020557, -6144921, -15826224, 9142795, -2391602, -6432418, -1644817}, - }, - { - FieldElement{-23104652, 6253476, 16964147, -3768872, -25113972, -12296437, -27457225, -16344658, 6335692, 7249989}, - FieldElement{-30333227, 13979675, 7503222, -12368314, -11956721, -4621693, -30272269, 2682242, 25993170, -12478523}, - FieldElement{4364628, 5930691, 32304656, -10044554, -8054781, 15091131, 22857016, -10598955, 31820368, 15075278}, - }, - { - FieldElement{31879134, -8918693, 17258761, 90626, -8041836, -4917709, 24162788, -9650886, -17970238, 12833045}, - FieldElement{19073683, 14851414, -24403169, -11860168, 7625278, 11091125, -19619190, 2074449, -9413939, 14905377}, - FieldElement{24483667, -11935567, -2518866, -11547418, -1553130, 15355506, -25282080, 9253129, 27628530, -7555480}, - }, - { - FieldElement{17597607, 8340603, 19355617, 552187, 26198470, -3176583, 4593324, -9157582, -14110875, 15297016}, - FieldElement{510886, 14337390, -31785257, 16638632, 6328095, 2713355, -20217417, -11864220, 8683221, 2921426}, - FieldElement{18606791, 11874196, 27155355, -5281482, -24031742, 6265446, -25178240, -1278924, 4674690, 13890525}, - }, - { - FieldElement{13609624, 13069022, -27372361, -13055908, 24360586, 9592974, 14977157, 9835105, 4389687, 288396}, - FieldElement{9922506, -519394, 13613107, 5883594, -18758345, -434263, -12304062, 8317628, 23388070, 16052080}, - FieldElement{12720016, 11937594, -31970060, -5028689, 26900120, 8561328, -20155687, -11632979, -14754271, -10812892}, - }, - { - FieldElement{15961858, 14150409, 26716931, -665832, -22794328, 13603569, 11829573, 7467844, -28822128, 929275}, - FieldElement{11038231, -11582396, -27310482, -7316562, -10498527, -16307831, -23479533, -9371869, -21393143, 2465074}, - FieldElement{20017163, -4323226, 27915242, 1529148, 12396362, 15675764, 13817261, -9658066, 2463391, -4622140}, - }, - { - FieldElement{-16358878, -12663911, -12065183, 4996454, -1256422, 1073572, 9583558, 12851107, 4003896, 12673717}, - FieldElement{-1731589, -15155870, -3262930, 16143082, 19294135, 13385325, 14741514, -9103726, 7903886, 2348101}, - FieldElement{24536016, -16515207, 12715592, -3862155, 1511293, 10047386, -3842346, -7129159, -28377538, 10048127}, - }, - }, - { - { - FieldElement{-12622226, -6204820, 30718825, 2591312, -10617028, 12192840, 18873298, -7297090, -32297756, 15221632}, - FieldElement{-26478122, -11103864, 11546244, -1852483, 9180880, 7656409, -21343950, 2095755, 29769758, 6593415}, - FieldElement{-31994208, -2907461, 4176912, 3264766, 12538965, -868111, 26312345, -6118678, 30958054, 8292160}, - }, - { - FieldElement{31429822, -13959116, 29173532, 15632448, 12174511, -2760094, 32808831, 3977186, 26143136, -3148876}, - FieldElement{22648901, 1402143, -22799984, 13746059, 7936347, 365344, -8668633, -1674433, -3758243, -2304625}, - FieldElement{-15491917, 8012313, -2514730, -12702462, -23965846, -10254029, -1612713, -1535569, -16664475, 8194478}, - }, - { - FieldElement{27338066, -7507420, -7414224, 10140405, -19026427, -6589889, 27277191, 8855376, 28572286, 3005164}, - FieldElement{26287124, 4821776, 25476601, -4145903, -3764513, -15788984, -18008582, 1182479, -26094821, -13079595}, - FieldElement{-7171154, 3178080, 23970071, 6201893, -17195577, -4489192, -21876275, -13982627, 32208683, -1198248}, - }, - { - FieldElement{-16657702, 2817643, -10286362, 14811298, 6024667, 13349505, -27315504, -10497842, -27672585, -11539858}, - FieldElement{15941029, -9405932, -21367050, 8062055, 31876073, -238629, -15278393, -1444429, 15397331, -4130193}, - FieldElement{8934485, -13485467, -23286397, -13423241, -32446090, 14047986, 31170398, -1441021, -27505566, 15087184}, - }, - { - FieldElement{-18357243, -2156491, 24524913, -16677868, 15520427, -6360776, -15502406, 11461896, 16788528, -5868942}, - FieldElement{-1947386, 16013773, 21750665, 3714552, -17401782, -16055433, -3770287, -10323320, 31322514, -11615635}, - FieldElement{21426655, -5650218, -13648287, -5347537, -28812189, -4920970, -18275391, -14621414, 13040862, -12112948}, - }, - { - FieldElement{11293895, 12478086, -27136401, 15083750, -29307421, 14748872, 14555558, -13417103, 1613711, 4896935}, - FieldElement{-25894883, 15323294, -8489791, -8057900, 25967126, -13425460, 2825960, -4897045, -23971776, -11267415}, - FieldElement{-15924766, -5229880, -17443532, 6410664, 3622847, 10243618, 20615400, 12405433, -23753030, -8436416}, - }, - { - FieldElement{-7091295, 12556208, -20191352, 9025187, -17072479, 4333801, 4378436, 2432030, 23097949, -566018}, - FieldElement{4565804, -16025654, 20084412, -7842817, 1724999, 189254, 24767264, 10103221, -18512313, 2424778}, - FieldElement{366633, -11976806, 8173090, -6890119, 30788634, 5745705, -7168678, 1344109, -3642553, 12412659}, - }, - { - FieldElement{-24001791, 7690286, 14929416, -168257, -32210835, -13412986, 24162697, -15326504, -3141501, 11179385}, - FieldElement{18289522, -14724954, 8056945, 16430056, -21729724, 7842514, -6001441, -1486897, -18684645, -11443503}, - FieldElement{476239, 6601091, -6152790, -9723375, 17503545, -4863900, 27672959, 13403813, 11052904, 5219329}, - }, - }, - { - { - FieldElement{20678546, -8375738, -32671898, 8849123, -5009758, 14574752, 31186971, -3973730, 9014762, -8579056}, - FieldElement{-13644050, -10350239, -15962508, 5075808, -1514661, -11534600, -33102500, 9160280, 8473550, -3256838}, - FieldElement{24900749, 14435722, 17209120, -15292541, -22592275, 9878983, -7689309, -16335821, -24568481, 11788948}, - }, - { - FieldElement{-3118155, -11395194, -13802089, 14797441, 9652448, -6845904, -20037437, 10410733, -24568470, -1458691}, - FieldElement{-15659161, 16736706, -22467150, 10215878, -9097177, 7563911, 11871841, -12505194, -18513325, 8464118}, - FieldElement{-23400612, 8348507, -14585951, -861714, -3950205, -6373419, 14325289, 8628612, 33313881, -8370517}, - }, - { - FieldElement{-20186973, -4967935, 22367356, 5271547, -1097117, -4788838, -24805667, -10236854, -8940735, -5818269}, - FieldElement{-6948785, -1795212, -32625683, -16021179, 32635414, -7374245, 15989197, -12838188, 28358192, -4253904}, - FieldElement{-23561781, -2799059, -32351682, -1661963, -9147719, 10429267, -16637684, 4072016, -5351664, 5596589}, - }, - { - FieldElement{-28236598, -3390048, 12312896, 6213178, 3117142, 16078565, 29266239, 2557221, 1768301, 15373193}, - FieldElement{-7243358, -3246960, -4593467, -7553353, -127927, -912245, -1090902, -4504991, -24660491, 3442910}, - FieldElement{-30210571, 5124043, 14181784, 8197961, 18964734, -11939093, 22597931, 7176455, -18585478, 13365930}, - }, - { - FieldElement{-7877390, -1499958, 8324673, 4690079, 6261860, 890446, 24538107, -8570186, -9689599, -3031667}, - FieldElement{25008904, -10771599, -4305031, -9638010, 16265036, 15721635, 683793, -11823784, 15723479, -15163481}, - FieldElement{-9660625, 12374379, -27006999, -7026148, -7724114, -12314514, 11879682, 5400171, 519526, -1235876}, - }, - { - FieldElement{22258397, -16332233, -7869817, 14613016, -22520255, -2950923, -20353881, 7315967, 16648397, 7605640}, - FieldElement{-8081308, -8464597, -8223311, 9719710, 19259459, -15348212, 23994942, -5281555, -9468848, 4763278}, - FieldElement{-21699244, 9220969, -15730624, 1084137, -25476107, -2852390, 31088447, -7764523, -11356529, 728112}, - }, - { - FieldElement{26047220, -11751471, -6900323, -16521798, 24092068, 9158119, -4273545, -12555558, -29365436, -5498272}, - FieldElement{17510331, -322857, 5854289, 8403524, 17133918, -3112612, -28111007, 12327945, 10750447, 10014012}, - FieldElement{-10312768, 3936952, 9156313, -8897683, 16498692, -994647, -27481051, -666732, 3424691, 7540221}, - }, - { - FieldElement{30322361, -6964110, 11361005, -4143317, 7433304, 4989748, -7071422, -16317219, -9244265, 15258046}, - FieldElement{13054562, -2779497, 19155474, 469045, -12482797, 4566042, 5631406, 2711395, 1062915, -5136345}, - FieldElement{-19240248, -11254599, -29509029, -7499965, -5835763, 13005411, -6066489, 12194497, 32960380, 1459310}, - }, - }, - { - { - FieldElement{19852034, 7027924, 23669353, 10020366, 8586503, -6657907, 394197, -6101885, 18638003, -11174937}, - FieldElement{31395534, 15098109, 26581030, 8030562, -16527914, -5007134, 9012486, -7584354, -6643087, -5442636}, - FieldElement{-9192165, -2347377, -1997099, 4529534, 25766844, 607986, -13222, 9677543, -32294889, -6456008}, - }, - { - FieldElement{-2444496, -149937, 29348902, 8186665, 1873760, 12489863, -30934579, -7839692, -7852844, -8138429}, - FieldElement{-15236356, -15433509, 7766470, 746860, 26346930, -10221762, -27333451, 10754588, -9431476, 5203576}, - FieldElement{31834314, 14135496, -770007, 5159118, 20917671, -16768096, -7467973, -7337524, 31809243, 7347066}, - }, - { - FieldElement{-9606723, -11874240, 20414459, 13033986, 13716524, -11691881, 19797970, -12211255, 15192876, -2087490}, - FieldElement{-12663563, -2181719, 1168162, -3804809, 26747877, -14138091, 10609330, 12694420, 33473243, -13382104}, - FieldElement{33184999, 11180355, 15832085, -11385430, -1633671, 225884, 15089336, -11023903, -6135662, 14480053}, - }, - { - FieldElement{31308717, -5619998, 31030840, -1897099, 15674547, -6582883, 5496208, 13685227, 27595050, 8737275}, - FieldElement{-20318852, -15150239, 10933843, -16178022, 8335352, -7546022, -31008351, -12610604, 26498114, 66511}, - FieldElement{22644454, -8761729, -16671776, 4884562, -3105614, -13559366, 30540766, -4286747, -13327787, -7515095}, - }, - { - FieldElement{-28017847, 9834845, 18617207, -2681312, -3401956, -13307506, 8205540, 13585437, -17127465, 15115439}, - FieldElement{23711543, -672915, 31206561, -8362711, 6164647, -9709987, -33535882, -1426096, 8236921, 16492939}, - FieldElement{-23910559, -13515526, -26299483, -4503841, 25005590, -7687270, 19574902, 10071562, 6708380, -6222424}, - }, - { - FieldElement{2101391, -4930054, 19702731, 2367575, -15427167, 1047675, 5301017, 9328700, 29955601, -11678310}, - FieldElement{3096359, 9271816, -21620864, -15521844, -14847996, -7592937, -25892142, -12635595, -9917575, 6216608}, - FieldElement{-32615849, 338663, -25195611, 2510422, -29213566, -13820213, 24822830, -6146567, -26767480, 7525079}, - }, - { - FieldElement{-23066649, -13985623, 16133487, -7896178, -3389565, 778788, -910336, -2782495, -19386633, 11994101}, - FieldElement{21691500, -13624626, -641331, -14367021, 3285881, -3483596, -25064666, 9718258, -7477437, 13381418}, - FieldElement{18445390, -4202236, 14979846, 11622458, -1727110, -3582980, 23111648, -6375247, 28535282, 15779576}, - }, - { - FieldElement{30098053, 3089662, -9234387, 16662135, -21306940, 11308411, -14068454, 12021730, 9955285, -16303356}, - FieldElement{9734894, -14576830, -7473633, -9138735, 2060392, 11313496, -18426029, 9924399, 20194861, 13380996}, - FieldElement{-26378102, -7965207, -22167821, 15789297, -18055342, -6168792, -1984914, 15707771, 26342023, 10146099}, - }, - }, - { - { - FieldElement{-26016874, -219943, 21339191, -41388, 19745256, -2878700, -29637280, 2227040, 21612326, -545728}, - FieldElement{-13077387, 1184228, 23562814, -5970442, -20351244, -6348714, 25764461, 12243797, -20856566, 11649658}, - FieldElement{-10031494, 11262626, 27384172, 2271902, 26947504, -15997771, 39944, 6114064, 33514190, 2333242}, - }, - { - FieldElement{-21433588, -12421821, 8119782, 7219913, -21830522, -9016134, -6679750, -12670638, 24350578, -13450001}, - FieldElement{-4116307, -11271533, -23886186, 4843615, -30088339, 690623, -31536088, -10406836, 8317860, 12352766}, - FieldElement{18200138, -14475911, -33087759, -2696619, -23702521, -9102511, -23552096, -2287550, 20712163, 6719373}, - }, - { - FieldElement{26656208, 6075253, -7858556, 1886072, -28344043, 4262326, 11117530, -3763210, 26224235, -3297458}, - FieldElement{-17168938, -14854097, -3395676, -16369877, -19954045, 14050420, 21728352, 9493610, 18620611, -16428628}, - FieldElement{-13323321, 13325349, 11432106, 5964811, 18609221, 6062965, -5269471, -9725556, -30701573, -16479657}, - }, - { - FieldElement{-23860538, -11233159, 26961357, 1640861, -32413112, -16737940, 12248509, -5240639, 13735342, 1934062}, - FieldElement{25089769, 6742589, 17081145, -13406266, 21909293, -16067981, -15136294, -3765346, -21277997, 5473616}, - FieldElement{31883677, -7961101, 1083432, -11572403, 22828471, 13290673, -7125085, 12469656, 29111212, -5451014}, - }, - { - FieldElement{24244947, -15050407, -26262976, 2791540, -14997599, 16666678, 24367466, 6388839, -10295587, 452383}, - FieldElement{-25640782, -3417841, 5217916, 16224624, 19987036, -4082269, -24236251, -5915248, 15766062, 8407814}, - FieldElement{-20406999, 13990231, 15495425, 16395525, 5377168, 15166495, -8917023, -4388953, -8067909, 2276718}, - }, - { - FieldElement{30157918, 12924066, -17712050, 9245753, 19895028, 3368142, -23827587, 5096219, 22740376, -7303417}, - FieldElement{2041139, -14256350, 7783687, 13876377, -25946985, -13352459, 24051124, 13742383, -15637599, 13295222}, - FieldElement{33338237, -8505733, 12532113, 7977527, 9106186, -1715251, -17720195, -4612972, -4451357, -14669444}, - }, - { - FieldElement{-20045281, 5454097, -14346548, 6447146, 28862071, 1883651, -2469266, -4141880, 7770569, 9620597}, - FieldElement{23208068, 7979712, 33071466, 8149229, 1758231, -10834995, 30945528, -1694323, -33502340, -14767970}, - FieldElement{1439958, -16270480, -1079989, -793782, 4625402, 10647766, -5043801, 1220118, 30494170, -11440799}, - }, - { - FieldElement{-5037580, -13028295, -2970559, -3061767, 15640974, -6701666, -26739026, 926050, -1684339, -13333647}, - FieldElement{13908495, -3549272, 30919928, -6273825, -21521863, 7989039, 9021034, 9078865, 3353509, 4033511}, - FieldElement{-29663431, -15113610, 32259991, -344482, 24295849, -12912123, 23161163, 8839127, 27485041, 7356032}, - }, - }, - { - { - FieldElement{9661027, 705443, 11980065, -5370154, -1628543, 14661173, -6346142, 2625015, 28431036, -16771834}, - FieldElement{-23839233, -8311415, -25945511, 7480958, -17681669, -8354183, -22545972, 14150565, 15970762, 4099461}, - FieldElement{29262576, 16756590, 26350592, -8793563, 8529671, -11208050, 13617293, -9937143, 11465739, 8317062}, - }, - { - FieldElement{-25493081, -6962928, 32500200, -9419051, -23038724, -2302222, 14898637, 3848455, 20969334, -5157516}, - FieldElement{-20384450, -14347713, -18336405, 13884722, -33039454, 2842114, -21610826, -3649888, 11177095, 14989547}, - FieldElement{-24496721, -11716016, 16959896, 2278463, 12066309, 10137771, 13515641, 2581286, -28487508, 9930240}, - }, - { - FieldElement{-17751622, -2097826, 16544300, -13009300, -15914807, -14949081, 18345767, -13403753, 16291481, -5314038}, - FieldElement{-33229194, 2553288, 32678213, 9875984, 8534129, 6889387, -9676774, 6957617, 4368891, 9788741}, - FieldElement{16660756, 7281060, -10830758, 12911820, 20108584, -8101676, -21722536, -8613148, 16250552, -11111103}, - }, - { - FieldElement{-19765507, 2390526, -16551031, 14161980, 1905286, 6414907, 4689584, 10604807, -30190403, 4782747}, - FieldElement{-1354539, 14736941, -7367442, -13292886, 7710542, -14155590, -9981571, 4383045, 22546403, 437323}, - FieldElement{31665577, -12180464, -16186830, 1491339, -18368625, 3294682, 27343084, 2786261, -30633590, -14097016}, - }, - { - FieldElement{-14467279, -683715, -33374107, 7448552, 19294360, 14334329, -19690631, 2355319, -19284671, -6114373}, - FieldElement{15121312, -15796162, 6377020, -6031361, -10798111, -12957845, 18952177, 15496498, -29380133, 11754228}, - FieldElement{-2637277, -13483075, 8488727, -14303896, 12728761, -1622493, 7141596, 11724556, 22761615, -10134141}, - }, - { - FieldElement{16918416, 11729663, -18083579, 3022987, -31015732, -13339659, -28741185, -12227393, 32851222, 11717399}, - FieldElement{11166634, 7338049, -6722523, 4531520, -29468672, -7302055, 31474879, 3483633, -1193175, -4030831}, - FieldElement{-185635, 9921305, 31456609, -13536438, -12013818, 13348923, 33142652, 6546660, -19985279, -3948376}, - }, - { - FieldElement{-32460596, 11266712, -11197107, -7899103, 31703694, 3855903, -8537131, -12833048, -30772034, -15486313}, - FieldElement{-18006477, 12709068, 3991746, -6479188, -21491523, -10550425, -31135347, -16049879, 10928917, 3011958}, - FieldElement{-6957757, -15594337, 31696059, 334240, 29576716, 14796075, -30831056, -12805180, 18008031, 10258577}, - }, - { - FieldElement{-22448644, 15655569, 7018479, -4410003, -30314266, -1201591, -1853465, 1367120, 25127874, 6671743}, - FieldElement{29701166, -14373934, -10878120, 9279288, -17568, 13127210, 21382910, 11042292, 25838796, 4642684}, - FieldElement{-20430234, 14955537, -24126347, 8124619, -5369288, -5990470, 30468147, -13900640, 18423289, 4177476}, - }, - }, -} diff --git a/vendor/golang.org/x/crypto/ed25519/internal/edwards25519/edwards25519.go b/vendor/golang.org/x/crypto/ed25519/internal/edwards25519/edwards25519.go deleted file mode 100644 index 5f8b99478..000000000 --- a/vendor/golang.org/x/crypto/ed25519/internal/edwards25519/edwards25519.go +++ /dev/null @@ -1,1771 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package edwards25519 - -// This code is a port of the public domain, “ref10” implementation of ed25519 -// from SUPERCOP. - -// FieldElement represents an element of the field GF(2^255 - 19). An element -// t, entries t[0]...t[9], represents the integer t[0]+2^26 t[1]+2^51 t[2]+2^77 -// t[3]+2^102 t[4]+...+2^230 t[9]. Bounds on each t[i] vary depending on -// context. -type FieldElement [10]int32 - -var zero FieldElement - -func FeZero(fe *FieldElement) { - copy(fe[:], zero[:]) -} - -func FeOne(fe *FieldElement) { - FeZero(fe) - fe[0] = 1 -} - -func FeAdd(dst, a, b *FieldElement) { - dst[0] = a[0] + b[0] - dst[1] = a[1] + b[1] - dst[2] = a[2] + b[2] - dst[3] = a[3] + b[3] - dst[4] = a[4] + b[4] - dst[5] = a[5] + b[5] - dst[6] = a[6] + b[6] - dst[7] = a[7] + b[7] - dst[8] = a[8] + b[8] - dst[9] = a[9] + b[9] -} - -func FeSub(dst, a, b *FieldElement) { - dst[0] = a[0] - b[0] - dst[1] = a[1] - b[1] - dst[2] = a[2] - b[2] - dst[3] = a[3] - b[3] - dst[4] = a[4] - b[4] - dst[5] = a[5] - b[5] - dst[6] = a[6] - b[6] - dst[7] = a[7] - b[7] - dst[8] = a[8] - b[8] - dst[9] = a[9] - b[9] -} - -func FeCopy(dst, src *FieldElement) { - copy(dst[:], src[:]) -} - -// Replace (f,g) with (g,g) if b == 1; -// replace (f,g) with (f,g) if b == 0. -// -// Preconditions: b in {0,1}. -func FeCMove(f, g *FieldElement, b int32) { - b = -b - f[0] ^= b & (f[0] ^ g[0]) - f[1] ^= b & (f[1] ^ g[1]) - f[2] ^= b & (f[2] ^ g[2]) - f[3] ^= b & (f[3] ^ g[3]) - f[4] ^= b & (f[4] ^ g[4]) - f[5] ^= b & (f[5] ^ g[5]) - f[6] ^= b & (f[6] ^ g[6]) - f[7] ^= b & (f[7] ^ g[7]) - f[8] ^= b & (f[8] ^ g[8]) - f[9] ^= b & (f[9] ^ g[9]) -} - -func load3(in []byte) int64 { - var r int64 - r = int64(in[0]) - r |= int64(in[1]) << 8 - r |= int64(in[2]) << 16 - return r -} - -func load4(in []byte) int64 { - var r int64 - r = int64(in[0]) - r |= int64(in[1]) << 8 - r |= int64(in[2]) << 16 - r |= int64(in[3]) << 24 - return r -} - -func FeFromBytes(dst *FieldElement, src *[32]byte) { - h0 := load4(src[:]) - h1 := load3(src[4:]) << 6 - h2 := load3(src[7:]) << 5 - h3 := load3(src[10:]) << 3 - h4 := load3(src[13:]) << 2 - h5 := load4(src[16:]) - h6 := load3(src[20:]) << 7 - h7 := load3(src[23:]) << 5 - h8 := load3(src[26:]) << 4 - h9 := (load3(src[29:]) & 8388607) << 2 - - FeCombine(dst, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9) -} - -// FeToBytes marshals h to s. -// Preconditions: -// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. -// -// Write p=2^255-19; q=floor(h/p). -// Basic claim: q = floor(2^(-255)(h + 19 2^(-25)h9 + 2^(-1))). -// -// Proof: -// Have |h|<=p so |q|<=1 so |19^2 2^(-255) q|<1/4. -// Also have |h-2^230 h9|<2^230 so |19 2^(-255)(h-2^230 h9)|<1/4. -// -// Write y=2^(-1)-19^2 2^(-255)q-19 2^(-255)(h-2^230 h9). -// Then 0> 25 - q = (h[0] + q) >> 26 - q = (h[1] + q) >> 25 - q = (h[2] + q) >> 26 - q = (h[3] + q) >> 25 - q = (h[4] + q) >> 26 - q = (h[5] + q) >> 25 - q = (h[6] + q) >> 26 - q = (h[7] + q) >> 25 - q = (h[8] + q) >> 26 - q = (h[9] + q) >> 25 - - // Goal: Output h-(2^255-19)q, which is between 0 and 2^255-20. - h[0] += 19 * q - // Goal: Output h-2^255 q, which is between 0 and 2^255-20. - - carry[0] = h[0] >> 26 - h[1] += carry[0] - h[0] -= carry[0] << 26 - carry[1] = h[1] >> 25 - h[2] += carry[1] - h[1] -= carry[1] << 25 - carry[2] = h[2] >> 26 - h[3] += carry[2] - h[2] -= carry[2] << 26 - carry[3] = h[3] >> 25 - h[4] += carry[3] - h[3] -= carry[3] << 25 - carry[4] = h[4] >> 26 - h[5] += carry[4] - h[4] -= carry[4] << 26 - carry[5] = h[5] >> 25 - h[6] += carry[5] - h[5] -= carry[5] << 25 - carry[6] = h[6] >> 26 - h[7] += carry[6] - h[6] -= carry[6] << 26 - carry[7] = h[7] >> 25 - h[8] += carry[7] - h[7] -= carry[7] << 25 - carry[8] = h[8] >> 26 - h[9] += carry[8] - h[8] -= carry[8] << 26 - carry[9] = h[9] >> 25 - h[9] -= carry[9] << 25 - // h10 = carry9 - - // Goal: Output h[0]+...+2^255 h10-2^255 q, which is between 0 and 2^255-20. - // Have h[0]+...+2^230 h[9] between 0 and 2^255-1; - // evidently 2^255 h10-2^255 q = 0. - // Goal: Output h[0]+...+2^230 h[9]. - - s[0] = byte(h[0] >> 0) - s[1] = byte(h[0] >> 8) - s[2] = byte(h[0] >> 16) - s[3] = byte((h[0] >> 24) | (h[1] << 2)) - s[4] = byte(h[1] >> 6) - s[5] = byte(h[1] >> 14) - s[6] = byte((h[1] >> 22) | (h[2] << 3)) - s[7] = byte(h[2] >> 5) - s[8] = byte(h[2] >> 13) - s[9] = byte((h[2] >> 21) | (h[3] << 5)) - s[10] = byte(h[3] >> 3) - s[11] = byte(h[3] >> 11) - s[12] = byte((h[3] >> 19) | (h[4] << 6)) - s[13] = byte(h[4] >> 2) - s[14] = byte(h[4] >> 10) - s[15] = byte(h[4] >> 18) - s[16] = byte(h[5] >> 0) - s[17] = byte(h[5] >> 8) - s[18] = byte(h[5] >> 16) - s[19] = byte((h[5] >> 24) | (h[6] << 1)) - s[20] = byte(h[6] >> 7) - s[21] = byte(h[6] >> 15) - s[22] = byte((h[6] >> 23) | (h[7] << 3)) - s[23] = byte(h[7] >> 5) - s[24] = byte(h[7] >> 13) - s[25] = byte((h[7] >> 21) | (h[8] << 4)) - s[26] = byte(h[8] >> 4) - s[27] = byte(h[8] >> 12) - s[28] = byte((h[8] >> 20) | (h[9] << 6)) - s[29] = byte(h[9] >> 2) - s[30] = byte(h[9] >> 10) - s[31] = byte(h[9] >> 18) -} - -func FeIsNegative(f *FieldElement) byte { - var s [32]byte - FeToBytes(&s, f) - return s[0] & 1 -} - -func FeIsNonZero(f *FieldElement) int32 { - var s [32]byte - FeToBytes(&s, f) - var x uint8 - for _, b := range s { - x |= b - } - x |= x >> 4 - x |= x >> 2 - x |= x >> 1 - return int32(x & 1) -} - -// FeNeg sets h = -f -// -// Preconditions: -// |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. -// -// Postconditions: -// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. -func FeNeg(h, f *FieldElement) { - h[0] = -f[0] - h[1] = -f[1] - h[2] = -f[2] - h[3] = -f[3] - h[4] = -f[4] - h[5] = -f[5] - h[6] = -f[6] - h[7] = -f[7] - h[8] = -f[8] - h[9] = -f[9] -} - -func FeCombine(h *FieldElement, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9 int64) { - var c0, c1, c2, c3, c4, c5, c6, c7, c8, c9 int64 - - /* - |h0| <= (1.1*1.1*2^52*(1+19+19+19+19)+1.1*1.1*2^50*(38+38+38+38+38)) - i.e. |h0| <= 1.2*2^59; narrower ranges for h2, h4, h6, h8 - |h1| <= (1.1*1.1*2^51*(1+1+19+19+19+19+19+19+19+19)) - i.e. |h1| <= 1.5*2^58; narrower ranges for h3, h5, h7, h9 - */ - - c0 = (h0 + (1 << 25)) >> 26 - h1 += c0 - h0 -= c0 << 26 - c4 = (h4 + (1 << 25)) >> 26 - h5 += c4 - h4 -= c4 << 26 - /* |h0| <= 2^25 */ - /* |h4| <= 2^25 */ - /* |h1| <= 1.51*2^58 */ - /* |h5| <= 1.51*2^58 */ - - c1 = (h1 + (1 << 24)) >> 25 - h2 += c1 - h1 -= c1 << 25 - c5 = (h5 + (1 << 24)) >> 25 - h6 += c5 - h5 -= c5 << 25 - /* |h1| <= 2^24; from now on fits into int32 */ - /* |h5| <= 2^24; from now on fits into int32 */ - /* |h2| <= 1.21*2^59 */ - /* |h6| <= 1.21*2^59 */ - - c2 = (h2 + (1 << 25)) >> 26 - h3 += c2 - h2 -= c2 << 26 - c6 = (h6 + (1 << 25)) >> 26 - h7 += c6 - h6 -= c6 << 26 - /* |h2| <= 2^25; from now on fits into int32 unchanged */ - /* |h6| <= 2^25; from now on fits into int32 unchanged */ - /* |h3| <= 1.51*2^58 */ - /* |h7| <= 1.51*2^58 */ - - c3 = (h3 + (1 << 24)) >> 25 - h4 += c3 - h3 -= c3 << 25 - c7 = (h7 + (1 << 24)) >> 25 - h8 += c7 - h7 -= c7 << 25 - /* |h3| <= 2^24; from now on fits into int32 unchanged */ - /* |h7| <= 2^24; from now on fits into int32 unchanged */ - /* |h4| <= 1.52*2^33 */ - /* |h8| <= 1.52*2^33 */ - - c4 = (h4 + (1 << 25)) >> 26 - h5 += c4 - h4 -= c4 << 26 - c8 = (h8 + (1 << 25)) >> 26 - h9 += c8 - h8 -= c8 << 26 - /* |h4| <= 2^25; from now on fits into int32 unchanged */ - /* |h8| <= 2^25; from now on fits into int32 unchanged */ - /* |h5| <= 1.01*2^24 */ - /* |h9| <= 1.51*2^58 */ - - c9 = (h9 + (1 << 24)) >> 25 - h0 += c9 * 19 - h9 -= c9 << 25 - /* |h9| <= 2^24; from now on fits into int32 unchanged */ - /* |h0| <= 1.8*2^37 */ - - c0 = (h0 + (1 << 25)) >> 26 - h1 += c0 - h0 -= c0 << 26 - /* |h0| <= 2^25; from now on fits into int32 unchanged */ - /* |h1| <= 1.01*2^24 */ - - h[0] = int32(h0) - h[1] = int32(h1) - h[2] = int32(h2) - h[3] = int32(h3) - h[4] = int32(h4) - h[5] = int32(h5) - h[6] = int32(h6) - h[7] = int32(h7) - h[8] = int32(h8) - h[9] = int32(h9) -} - -// FeMul calculates h = f * g -// Can overlap h with f or g. -// -// Preconditions: -// |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. -// |g| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. -// -// Postconditions: -// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. -// -// Notes on implementation strategy: -// -// Using schoolbook multiplication. -// Karatsuba would save a little in some cost models. -// -// Most multiplications by 2 and 19 are 32-bit precomputations; -// cheaper than 64-bit postcomputations. -// -// There is one remaining multiplication by 19 in the carry chain; -// one *19 precomputation can be merged into this, -// but the resulting data flow is considerably less clean. -// -// There are 12 carries below. -// 10 of them are 2-way parallelizable and vectorizable. -// Can get away with 11 carries, but then data flow is much deeper. -// -// With tighter constraints on inputs, can squeeze carries into int32. -func FeMul(h, f, g *FieldElement) { - f0 := int64(f[0]) - f1 := int64(f[1]) - f2 := int64(f[2]) - f3 := int64(f[3]) - f4 := int64(f[4]) - f5 := int64(f[5]) - f6 := int64(f[6]) - f7 := int64(f[7]) - f8 := int64(f[8]) - f9 := int64(f[9]) - - f1_2 := int64(2 * f[1]) - f3_2 := int64(2 * f[3]) - f5_2 := int64(2 * f[5]) - f7_2 := int64(2 * f[7]) - f9_2 := int64(2 * f[9]) - - g0 := int64(g[0]) - g1 := int64(g[1]) - g2 := int64(g[2]) - g3 := int64(g[3]) - g4 := int64(g[4]) - g5 := int64(g[5]) - g6 := int64(g[6]) - g7 := int64(g[7]) - g8 := int64(g[8]) - g9 := int64(g[9]) - - g1_19 := int64(19 * g[1]) /* 1.4*2^29 */ - g2_19 := int64(19 * g[2]) /* 1.4*2^30; still ok */ - g3_19 := int64(19 * g[3]) - g4_19 := int64(19 * g[4]) - g5_19 := int64(19 * g[5]) - g6_19 := int64(19 * g[6]) - g7_19 := int64(19 * g[7]) - g8_19 := int64(19 * g[8]) - g9_19 := int64(19 * g[9]) - - h0 := f0*g0 + f1_2*g9_19 + f2*g8_19 + f3_2*g7_19 + f4*g6_19 + f5_2*g5_19 + f6*g4_19 + f7_2*g3_19 + f8*g2_19 + f9_2*g1_19 - h1 := f0*g1 + f1*g0 + f2*g9_19 + f3*g8_19 + f4*g7_19 + f5*g6_19 + f6*g5_19 + f7*g4_19 + f8*g3_19 + f9*g2_19 - h2 := f0*g2 + f1_2*g1 + f2*g0 + f3_2*g9_19 + f4*g8_19 + f5_2*g7_19 + f6*g6_19 + f7_2*g5_19 + f8*g4_19 + f9_2*g3_19 - h3 := f0*g3 + f1*g2 + f2*g1 + f3*g0 + f4*g9_19 + f5*g8_19 + f6*g7_19 + f7*g6_19 + f8*g5_19 + f9*g4_19 - h4 := f0*g4 + f1_2*g3 + f2*g2 + f3_2*g1 + f4*g0 + f5_2*g9_19 + f6*g8_19 + f7_2*g7_19 + f8*g6_19 + f9_2*g5_19 - h5 := f0*g5 + f1*g4 + f2*g3 + f3*g2 + f4*g1 + f5*g0 + f6*g9_19 + f7*g8_19 + f8*g7_19 + f9*g6_19 - h6 := f0*g6 + f1_2*g5 + f2*g4 + f3_2*g3 + f4*g2 + f5_2*g1 + f6*g0 + f7_2*g9_19 + f8*g8_19 + f9_2*g7_19 - h7 := f0*g7 + f1*g6 + f2*g5 + f3*g4 + f4*g3 + f5*g2 + f6*g1 + f7*g0 + f8*g9_19 + f9*g8_19 - h8 := f0*g8 + f1_2*g7 + f2*g6 + f3_2*g5 + f4*g4 + f5_2*g3 + f6*g2 + f7_2*g1 + f8*g0 + f9_2*g9_19 - h9 := f0*g9 + f1*g8 + f2*g7 + f3*g6 + f4*g5 + f5*g4 + f6*g3 + f7*g2 + f8*g1 + f9*g0 - - FeCombine(h, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9) -} - -func feSquare(f *FieldElement) (h0, h1, h2, h3, h4, h5, h6, h7, h8, h9 int64) { - f0 := int64(f[0]) - f1 := int64(f[1]) - f2 := int64(f[2]) - f3 := int64(f[3]) - f4 := int64(f[4]) - f5 := int64(f[5]) - f6 := int64(f[6]) - f7 := int64(f[7]) - f8 := int64(f[8]) - f9 := int64(f[9]) - f0_2 := int64(2 * f[0]) - f1_2 := int64(2 * f[1]) - f2_2 := int64(2 * f[2]) - f3_2 := int64(2 * f[3]) - f4_2 := int64(2 * f[4]) - f5_2 := int64(2 * f[5]) - f6_2 := int64(2 * f[6]) - f7_2 := int64(2 * f[7]) - f5_38 := 38 * f5 // 1.31*2^30 - f6_19 := 19 * f6 // 1.31*2^30 - f7_38 := 38 * f7 // 1.31*2^30 - f8_19 := 19 * f8 // 1.31*2^30 - f9_38 := 38 * f9 // 1.31*2^30 - - h0 = f0*f0 + f1_2*f9_38 + f2_2*f8_19 + f3_2*f7_38 + f4_2*f6_19 + f5*f5_38 - h1 = f0_2*f1 + f2*f9_38 + f3_2*f8_19 + f4*f7_38 + f5_2*f6_19 - h2 = f0_2*f2 + f1_2*f1 + f3_2*f9_38 + f4_2*f8_19 + f5_2*f7_38 + f6*f6_19 - h3 = f0_2*f3 + f1_2*f2 + f4*f9_38 + f5_2*f8_19 + f6*f7_38 - h4 = f0_2*f4 + f1_2*f3_2 + f2*f2 + f5_2*f9_38 + f6_2*f8_19 + f7*f7_38 - h5 = f0_2*f5 + f1_2*f4 + f2_2*f3 + f6*f9_38 + f7_2*f8_19 - h6 = f0_2*f6 + f1_2*f5_2 + f2_2*f4 + f3_2*f3 + f7_2*f9_38 + f8*f8_19 - h7 = f0_2*f7 + f1_2*f6 + f2_2*f5 + f3_2*f4 + f8*f9_38 - h8 = f0_2*f8 + f1_2*f7_2 + f2_2*f6 + f3_2*f5_2 + f4*f4 + f9*f9_38 - h9 = f0_2*f9 + f1_2*f8 + f2_2*f7 + f3_2*f6 + f4_2*f5 - - return -} - -// FeSquare calculates h = f*f. Can overlap h with f. -// -// Preconditions: -// |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. -// -// Postconditions: -// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. -func FeSquare(h, f *FieldElement) { - h0, h1, h2, h3, h4, h5, h6, h7, h8, h9 := feSquare(f) - FeCombine(h, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9) -} - -// FeSquare2 sets h = 2 * f * f -// -// Can overlap h with f. -// -// Preconditions: -// |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. -// -// Postconditions: -// |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. -// See fe_mul.c for discussion of implementation strategy. -func FeSquare2(h, f *FieldElement) { - h0, h1, h2, h3, h4, h5, h6, h7, h8, h9 := feSquare(f) - - h0 += h0 - h1 += h1 - h2 += h2 - h3 += h3 - h4 += h4 - h5 += h5 - h6 += h6 - h7 += h7 - h8 += h8 - h9 += h9 - - FeCombine(h, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9) -} - -func FeInvert(out, z *FieldElement) { - var t0, t1, t2, t3 FieldElement - var i int - - FeSquare(&t0, z) // 2^1 - FeSquare(&t1, &t0) // 2^2 - for i = 1; i < 2; i++ { // 2^3 - FeSquare(&t1, &t1) - } - FeMul(&t1, z, &t1) // 2^3 + 2^0 - FeMul(&t0, &t0, &t1) // 2^3 + 2^1 + 2^0 - FeSquare(&t2, &t0) // 2^4 + 2^2 + 2^1 - FeMul(&t1, &t1, &t2) // 2^4 + 2^3 + 2^2 + 2^1 + 2^0 - FeSquare(&t2, &t1) // 5,4,3,2,1 - for i = 1; i < 5; i++ { // 9,8,7,6,5 - FeSquare(&t2, &t2) - } - FeMul(&t1, &t2, &t1) // 9,8,7,6,5,4,3,2,1,0 - FeSquare(&t2, &t1) // 10..1 - for i = 1; i < 10; i++ { // 19..10 - FeSquare(&t2, &t2) - } - FeMul(&t2, &t2, &t1) // 19..0 - FeSquare(&t3, &t2) // 20..1 - for i = 1; i < 20; i++ { // 39..20 - FeSquare(&t3, &t3) - } - FeMul(&t2, &t3, &t2) // 39..0 - FeSquare(&t2, &t2) // 40..1 - for i = 1; i < 10; i++ { // 49..10 - FeSquare(&t2, &t2) - } - FeMul(&t1, &t2, &t1) // 49..0 - FeSquare(&t2, &t1) // 50..1 - for i = 1; i < 50; i++ { // 99..50 - FeSquare(&t2, &t2) - } - FeMul(&t2, &t2, &t1) // 99..0 - FeSquare(&t3, &t2) // 100..1 - for i = 1; i < 100; i++ { // 199..100 - FeSquare(&t3, &t3) - } - FeMul(&t2, &t3, &t2) // 199..0 - FeSquare(&t2, &t2) // 200..1 - for i = 1; i < 50; i++ { // 249..50 - FeSquare(&t2, &t2) - } - FeMul(&t1, &t2, &t1) // 249..0 - FeSquare(&t1, &t1) // 250..1 - for i = 1; i < 5; i++ { // 254..5 - FeSquare(&t1, &t1) - } - FeMul(out, &t1, &t0) // 254..5,3,1,0 -} - -func fePow22523(out, z *FieldElement) { - var t0, t1, t2 FieldElement - var i int - - FeSquare(&t0, z) - for i = 1; i < 1; i++ { - FeSquare(&t0, &t0) - } - FeSquare(&t1, &t0) - for i = 1; i < 2; i++ { - FeSquare(&t1, &t1) - } - FeMul(&t1, z, &t1) - FeMul(&t0, &t0, &t1) - FeSquare(&t0, &t0) - for i = 1; i < 1; i++ { - FeSquare(&t0, &t0) - } - FeMul(&t0, &t1, &t0) - FeSquare(&t1, &t0) - for i = 1; i < 5; i++ { - FeSquare(&t1, &t1) - } - FeMul(&t0, &t1, &t0) - FeSquare(&t1, &t0) - for i = 1; i < 10; i++ { - FeSquare(&t1, &t1) - } - FeMul(&t1, &t1, &t0) - FeSquare(&t2, &t1) - for i = 1; i < 20; i++ { - FeSquare(&t2, &t2) - } - FeMul(&t1, &t2, &t1) - FeSquare(&t1, &t1) - for i = 1; i < 10; i++ { - FeSquare(&t1, &t1) - } - FeMul(&t0, &t1, &t0) - FeSquare(&t1, &t0) - for i = 1; i < 50; i++ { - FeSquare(&t1, &t1) - } - FeMul(&t1, &t1, &t0) - FeSquare(&t2, &t1) - for i = 1; i < 100; i++ { - FeSquare(&t2, &t2) - } - FeMul(&t1, &t2, &t1) - FeSquare(&t1, &t1) - for i = 1; i < 50; i++ { - FeSquare(&t1, &t1) - } - FeMul(&t0, &t1, &t0) - FeSquare(&t0, &t0) - for i = 1; i < 2; i++ { - FeSquare(&t0, &t0) - } - FeMul(out, &t0, z) -} - -// Group elements are members of the elliptic curve -x^2 + y^2 = 1 + d * x^2 * -// y^2 where d = -121665/121666. -// -// Several representations are used: -// ProjectiveGroupElement: (X:Y:Z) satisfying x=X/Z, y=Y/Z -// ExtendedGroupElement: (X:Y:Z:T) satisfying x=X/Z, y=Y/Z, XY=ZT -// CompletedGroupElement: ((X:Z),(Y:T)) satisfying x=X/Z, y=Y/T -// PreComputedGroupElement: (y+x,y-x,2dxy) - -type ProjectiveGroupElement struct { - X, Y, Z FieldElement -} - -type ExtendedGroupElement struct { - X, Y, Z, T FieldElement -} - -type CompletedGroupElement struct { - X, Y, Z, T FieldElement -} - -type PreComputedGroupElement struct { - yPlusX, yMinusX, xy2d FieldElement -} - -type CachedGroupElement struct { - yPlusX, yMinusX, Z, T2d FieldElement -} - -func (p *ProjectiveGroupElement) Zero() { - FeZero(&p.X) - FeOne(&p.Y) - FeOne(&p.Z) -} - -func (p *ProjectiveGroupElement) Double(r *CompletedGroupElement) { - var t0 FieldElement - - FeSquare(&r.X, &p.X) - FeSquare(&r.Z, &p.Y) - FeSquare2(&r.T, &p.Z) - FeAdd(&r.Y, &p.X, &p.Y) - FeSquare(&t0, &r.Y) - FeAdd(&r.Y, &r.Z, &r.X) - FeSub(&r.Z, &r.Z, &r.X) - FeSub(&r.X, &t0, &r.Y) - FeSub(&r.T, &r.T, &r.Z) -} - -func (p *ProjectiveGroupElement) ToBytes(s *[32]byte) { - var recip, x, y FieldElement - - FeInvert(&recip, &p.Z) - FeMul(&x, &p.X, &recip) - FeMul(&y, &p.Y, &recip) - FeToBytes(s, &y) - s[31] ^= FeIsNegative(&x) << 7 -} - -func (p *ExtendedGroupElement) Zero() { - FeZero(&p.X) - FeOne(&p.Y) - FeOne(&p.Z) - FeZero(&p.T) -} - -func (p *ExtendedGroupElement) Double(r *CompletedGroupElement) { - var q ProjectiveGroupElement - p.ToProjective(&q) - q.Double(r) -} - -func (p *ExtendedGroupElement) ToCached(r *CachedGroupElement) { - FeAdd(&r.yPlusX, &p.Y, &p.X) - FeSub(&r.yMinusX, &p.Y, &p.X) - FeCopy(&r.Z, &p.Z) - FeMul(&r.T2d, &p.T, &d2) -} - -func (p *ExtendedGroupElement) ToProjective(r *ProjectiveGroupElement) { - FeCopy(&r.X, &p.X) - FeCopy(&r.Y, &p.Y) - FeCopy(&r.Z, &p.Z) -} - -func (p *ExtendedGroupElement) ToBytes(s *[32]byte) { - var recip, x, y FieldElement - - FeInvert(&recip, &p.Z) - FeMul(&x, &p.X, &recip) - FeMul(&y, &p.Y, &recip) - FeToBytes(s, &y) - s[31] ^= FeIsNegative(&x) << 7 -} - -func (p *ExtendedGroupElement) FromBytes(s *[32]byte) bool { - var u, v, v3, vxx, check FieldElement - - FeFromBytes(&p.Y, s) - FeOne(&p.Z) - FeSquare(&u, &p.Y) - FeMul(&v, &u, &d) - FeSub(&u, &u, &p.Z) // y = y^2-1 - FeAdd(&v, &v, &p.Z) // v = dy^2+1 - - FeSquare(&v3, &v) - FeMul(&v3, &v3, &v) // v3 = v^3 - FeSquare(&p.X, &v3) - FeMul(&p.X, &p.X, &v) - FeMul(&p.X, &p.X, &u) // x = uv^7 - - fePow22523(&p.X, &p.X) // x = (uv^7)^((q-5)/8) - FeMul(&p.X, &p.X, &v3) - FeMul(&p.X, &p.X, &u) // x = uv^3(uv^7)^((q-5)/8) - - var tmpX, tmp2 [32]byte - - FeSquare(&vxx, &p.X) - FeMul(&vxx, &vxx, &v) - FeSub(&check, &vxx, &u) // vx^2-u - if FeIsNonZero(&check) == 1 { - FeAdd(&check, &vxx, &u) // vx^2+u - if FeIsNonZero(&check) == 1 { - return false - } - FeMul(&p.X, &p.X, &SqrtM1) - - FeToBytes(&tmpX, &p.X) - for i, v := range tmpX { - tmp2[31-i] = v - } - } - - if FeIsNegative(&p.X) != (s[31] >> 7) { - FeNeg(&p.X, &p.X) - } - - FeMul(&p.T, &p.X, &p.Y) - return true -} - -func (p *CompletedGroupElement) ToProjective(r *ProjectiveGroupElement) { - FeMul(&r.X, &p.X, &p.T) - FeMul(&r.Y, &p.Y, &p.Z) - FeMul(&r.Z, &p.Z, &p.T) -} - -func (p *CompletedGroupElement) ToExtended(r *ExtendedGroupElement) { - FeMul(&r.X, &p.X, &p.T) - FeMul(&r.Y, &p.Y, &p.Z) - FeMul(&r.Z, &p.Z, &p.T) - FeMul(&r.T, &p.X, &p.Y) -} - -func (p *PreComputedGroupElement) Zero() { - FeOne(&p.yPlusX) - FeOne(&p.yMinusX) - FeZero(&p.xy2d) -} - -func geAdd(r *CompletedGroupElement, p *ExtendedGroupElement, q *CachedGroupElement) { - var t0 FieldElement - - FeAdd(&r.X, &p.Y, &p.X) - FeSub(&r.Y, &p.Y, &p.X) - FeMul(&r.Z, &r.X, &q.yPlusX) - FeMul(&r.Y, &r.Y, &q.yMinusX) - FeMul(&r.T, &q.T2d, &p.T) - FeMul(&r.X, &p.Z, &q.Z) - FeAdd(&t0, &r.X, &r.X) - FeSub(&r.X, &r.Z, &r.Y) - FeAdd(&r.Y, &r.Z, &r.Y) - FeAdd(&r.Z, &t0, &r.T) - FeSub(&r.T, &t0, &r.T) -} - -func geSub(r *CompletedGroupElement, p *ExtendedGroupElement, q *CachedGroupElement) { - var t0 FieldElement - - FeAdd(&r.X, &p.Y, &p.X) - FeSub(&r.Y, &p.Y, &p.X) - FeMul(&r.Z, &r.X, &q.yMinusX) - FeMul(&r.Y, &r.Y, &q.yPlusX) - FeMul(&r.T, &q.T2d, &p.T) - FeMul(&r.X, &p.Z, &q.Z) - FeAdd(&t0, &r.X, &r.X) - FeSub(&r.X, &r.Z, &r.Y) - FeAdd(&r.Y, &r.Z, &r.Y) - FeSub(&r.Z, &t0, &r.T) - FeAdd(&r.T, &t0, &r.T) -} - -func geMixedAdd(r *CompletedGroupElement, p *ExtendedGroupElement, q *PreComputedGroupElement) { - var t0 FieldElement - - FeAdd(&r.X, &p.Y, &p.X) - FeSub(&r.Y, &p.Y, &p.X) - FeMul(&r.Z, &r.X, &q.yPlusX) - FeMul(&r.Y, &r.Y, &q.yMinusX) - FeMul(&r.T, &q.xy2d, &p.T) - FeAdd(&t0, &p.Z, &p.Z) - FeSub(&r.X, &r.Z, &r.Y) - FeAdd(&r.Y, &r.Z, &r.Y) - FeAdd(&r.Z, &t0, &r.T) - FeSub(&r.T, &t0, &r.T) -} - -func geMixedSub(r *CompletedGroupElement, p *ExtendedGroupElement, q *PreComputedGroupElement) { - var t0 FieldElement - - FeAdd(&r.X, &p.Y, &p.X) - FeSub(&r.Y, &p.Y, &p.X) - FeMul(&r.Z, &r.X, &q.yMinusX) - FeMul(&r.Y, &r.Y, &q.yPlusX) - FeMul(&r.T, &q.xy2d, &p.T) - FeAdd(&t0, &p.Z, &p.Z) - FeSub(&r.X, &r.Z, &r.Y) - FeAdd(&r.Y, &r.Z, &r.Y) - FeSub(&r.Z, &t0, &r.T) - FeAdd(&r.T, &t0, &r.T) -} - -func slide(r *[256]int8, a *[32]byte) { - for i := range r { - r[i] = int8(1 & (a[i>>3] >> uint(i&7))) - } - - for i := range r { - if r[i] != 0 { - for b := 1; b <= 6 && i+b < 256; b++ { - if r[i+b] != 0 { - if r[i]+(r[i+b]<= -15 { - r[i] -= r[i+b] << uint(b) - for k := i + b; k < 256; k++ { - if r[k] == 0 { - r[k] = 1 - break - } - r[k] = 0 - } - } else { - break - } - } - } - } - } -} - -// GeDoubleScalarMultVartime sets r = a*A + b*B -// where a = a[0]+256*a[1]+...+256^31 a[31]. -// and b = b[0]+256*b[1]+...+256^31 b[31]. -// B is the Ed25519 base point (x,4/5) with x positive. -func GeDoubleScalarMultVartime(r *ProjectiveGroupElement, a *[32]byte, A *ExtendedGroupElement, b *[32]byte) { - var aSlide, bSlide [256]int8 - var Ai [8]CachedGroupElement // A,3A,5A,7A,9A,11A,13A,15A - var t CompletedGroupElement - var u, A2 ExtendedGroupElement - var i int - - slide(&aSlide, a) - slide(&bSlide, b) - - A.ToCached(&Ai[0]) - A.Double(&t) - t.ToExtended(&A2) - - for i := 0; i < 7; i++ { - geAdd(&t, &A2, &Ai[i]) - t.ToExtended(&u) - u.ToCached(&Ai[i+1]) - } - - r.Zero() - - for i = 255; i >= 0; i-- { - if aSlide[i] != 0 || bSlide[i] != 0 { - break - } - } - - for ; i >= 0; i-- { - r.Double(&t) - - if aSlide[i] > 0 { - t.ToExtended(&u) - geAdd(&t, &u, &Ai[aSlide[i]/2]) - } else if aSlide[i] < 0 { - t.ToExtended(&u) - geSub(&t, &u, &Ai[(-aSlide[i])/2]) - } - - if bSlide[i] > 0 { - t.ToExtended(&u) - geMixedAdd(&t, &u, &bi[bSlide[i]/2]) - } else if bSlide[i] < 0 { - t.ToExtended(&u) - geMixedSub(&t, &u, &bi[(-bSlide[i])/2]) - } - - t.ToProjective(r) - } -} - -// equal returns 1 if b == c and 0 otherwise, assuming that b and c are -// non-negative. -func equal(b, c int32) int32 { - x := uint32(b ^ c) - x-- - return int32(x >> 31) -} - -// negative returns 1 if b < 0 and 0 otherwise. -func negative(b int32) int32 { - return (b >> 31) & 1 -} - -func PreComputedGroupElementCMove(t, u *PreComputedGroupElement, b int32) { - FeCMove(&t.yPlusX, &u.yPlusX, b) - FeCMove(&t.yMinusX, &u.yMinusX, b) - FeCMove(&t.xy2d, &u.xy2d, b) -} - -func selectPoint(t *PreComputedGroupElement, pos int32, b int32) { - var minusT PreComputedGroupElement - bNegative := negative(b) - bAbs := b - (((-bNegative) & b) << 1) - - t.Zero() - for i := int32(0); i < 8; i++ { - PreComputedGroupElementCMove(t, &base[pos][i], equal(bAbs, i+1)) - } - FeCopy(&minusT.yPlusX, &t.yMinusX) - FeCopy(&minusT.yMinusX, &t.yPlusX) - FeNeg(&minusT.xy2d, &t.xy2d) - PreComputedGroupElementCMove(t, &minusT, bNegative) -} - -// GeScalarMultBase computes h = a*B, where -// a = a[0]+256*a[1]+...+256^31 a[31] -// B is the Ed25519 base point (x,4/5) with x positive. -// -// Preconditions: -// a[31] <= 127 -func GeScalarMultBase(h *ExtendedGroupElement, a *[32]byte) { - var e [64]int8 - - for i, v := range a { - e[2*i] = int8(v & 15) - e[2*i+1] = int8((v >> 4) & 15) - } - - // each e[i] is between 0 and 15 and e[63] is between 0 and 7. - - carry := int8(0) - for i := 0; i < 63; i++ { - e[i] += carry - carry = (e[i] + 8) >> 4 - e[i] -= carry << 4 - } - e[63] += carry - // each e[i] is between -8 and 8. - - h.Zero() - var t PreComputedGroupElement - var r CompletedGroupElement - for i := int32(1); i < 64; i += 2 { - selectPoint(&t, i/2, int32(e[i])) - geMixedAdd(&r, h, &t) - r.ToExtended(h) - } - - var s ProjectiveGroupElement - - h.Double(&r) - r.ToProjective(&s) - s.Double(&r) - r.ToProjective(&s) - s.Double(&r) - r.ToProjective(&s) - s.Double(&r) - r.ToExtended(h) - - for i := int32(0); i < 64; i += 2 { - selectPoint(&t, i/2, int32(e[i])) - geMixedAdd(&r, h, &t) - r.ToExtended(h) - } -} - -// The scalars are GF(2^252 + 27742317777372353535851937790883648493). - -// Input: -// a[0]+256*a[1]+...+256^31*a[31] = a -// b[0]+256*b[1]+...+256^31*b[31] = b -// c[0]+256*c[1]+...+256^31*c[31] = c -// -// Output: -// s[0]+256*s[1]+...+256^31*s[31] = (ab+c) mod l -// where l = 2^252 + 27742317777372353535851937790883648493. -func ScMulAdd(s, a, b, c *[32]byte) { - a0 := 2097151 & load3(a[:]) - a1 := 2097151 & (load4(a[2:]) >> 5) - a2 := 2097151 & (load3(a[5:]) >> 2) - a3 := 2097151 & (load4(a[7:]) >> 7) - a4 := 2097151 & (load4(a[10:]) >> 4) - a5 := 2097151 & (load3(a[13:]) >> 1) - a6 := 2097151 & (load4(a[15:]) >> 6) - a7 := 2097151 & (load3(a[18:]) >> 3) - a8 := 2097151 & load3(a[21:]) - a9 := 2097151 & (load4(a[23:]) >> 5) - a10 := 2097151 & (load3(a[26:]) >> 2) - a11 := (load4(a[28:]) >> 7) - b0 := 2097151 & load3(b[:]) - b1 := 2097151 & (load4(b[2:]) >> 5) - b2 := 2097151 & (load3(b[5:]) >> 2) - b3 := 2097151 & (load4(b[7:]) >> 7) - b4 := 2097151 & (load4(b[10:]) >> 4) - b5 := 2097151 & (load3(b[13:]) >> 1) - b6 := 2097151 & (load4(b[15:]) >> 6) - b7 := 2097151 & (load3(b[18:]) >> 3) - b8 := 2097151 & load3(b[21:]) - b9 := 2097151 & (load4(b[23:]) >> 5) - b10 := 2097151 & (load3(b[26:]) >> 2) - b11 := (load4(b[28:]) >> 7) - c0 := 2097151 & load3(c[:]) - c1 := 2097151 & (load4(c[2:]) >> 5) - c2 := 2097151 & (load3(c[5:]) >> 2) - c3 := 2097151 & (load4(c[7:]) >> 7) - c4 := 2097151 & (load4(c[10:]) >> 4) - c5 := 2097151 & (load3(c[13:]) >> 1) - c6 := 2097151 & (load4(c[15:]) >> 6) - c7 := 2097151 & (load3(c[18:]) >> 3) - c8 := 2097151 & load3(c[21:]) - c9 := 2097151 & (load4(c[23:]) >> 5) - c10 := 2097151 & (load3(c[26:]) >> 2) - c11 := (load4(c[28:]) >> 7) - var carry [23]int64 - - s0 := c0 + a0*b0 - s1 := c1 + a0*b1 + a1*b0 - s2 := c2 + a0*b2 + a1*b1 + a2*b0 - s3 := c3 + a0*b3 + a1*b2 + a2*b1 + a3*b0 - s4 := c4 + a0*b4 + a1*b3 + a2*b2 + a3*b1 + a4*b0 - s5 := c5 + a0*b5 + a1*b4 + a2*b3 + a3*b2 + a4*b1 + a5*b0 - s6 := c6 + a0*b6 + a1*b5 + a2*b4 + a3*b3 + a4*b2 + a5*b1 + a6*b0 - s7 := c7 + a0*b7 + a1*b6 + a2*b5 + a3*b4 + a4*b3 + a5*b2 + a6*b1 + a7*b0 - s8 := c8 + a0*b8 + a1*b7 + a2*b6 + a3*b5 + a4*b4 + a5*b3 + a6*b2 + a7*b1 + a8*b0 - s9 := c9 + a0*b9 + a1*b8 + a2*b7 + a3*b6 + a4*b5 + a5*b4 + a6*b3 + a7*b2 + a8*b1 + a9*b0 - s10 := c10 + a0*b10 + a1*b9 + a2*b8 + a3*b7 + a4*b6 + a5*b5 + a6*b4 + a7*b3 + a8*b2 + a9*b1 + a10*b0 - s11 := c11 + a0*b11 + a1*b10 + a2*b9 + a3*b8 + a4*b7 + a5*b6 + a6*b5 + a7*b4 + a8*b3 + a9*b2 + a10*b1 + a11*b0 - s12 := a1*b11 + a2*b10 + a3*b9 + a4*b8 + a5*b7 + a6*b6 + a7*b5 + a8*b4 + a9*b3 + a10*b2 + a11*b1 - s13 := a2*b11 + a3*b10 + a4*b9 + a5*b8 + a6*b7 + a7*b6 + a8*b5 + a9*b4 + a10*b3 + a11*b2 - s14 := a3*b11 + a4*b10 + a5*b9 + a6*b8 + a7*b7 + a8*b6 + a9*b5 + a10*b4 + a11*b3 - s15 := a4*b11 + a5*b10 + a6*b9 + a7*b8 + a8*b7 + a9*b6 + a10*b5 + a11*b4 - s16 := a5*b11 + a6*b10 + a7*b9 + a8*b8 + a9*b7 + a10*b6 + a11*b5 - s17 := a6*b11 + a7*b10 + a8*b9 + a9*b8 + a10*b7 + a11*b6 - s18 := a7*b11 + a8*b10 + a9*b9 + a10*b8 + a11*b7 - s19 := a8*b11 + a9*b10 + a10*b9 + a11*b8 - s20 := a9*b11 + a10*b10 + a11*b9 - s21 := a10*b11 + a11*b10 - s22 := a11 * b11 - s23 := int64(0) - - carry[0] = (s0 + (1 << 20)) >> 21 - s1 += carry[0] - s0 -= carry[0] << 21 - carry[2] = (s2 + (1 << 20)) >> 21 - s3 += carry[2] - s2 -= carry[2] << 21 - carry[4] = (s4 + (1 << 20)) >> 21 - s5 += carry[4] - s4 -= carry[4] << 21 - carry[6] = (s6 + (1 << 20)) >> 21 - s7 += carry[6] - s6 -= carry[6] << 21 - carry[8] = (s8 + (1 << 20)) >> 21 - s9 += carry[8] - s8 -= carry[8] << 21 - carry[10] = (s10 + (1 << 20)) >> 21 - s11 += carry[10] - s10 -= carry[10] << 21 - carry[12] = (s12 + (1 << 20)) >> 21 - s13 += carry[12] - s12 -= carry[12] << 21 - carry[14] = (s14 + (1 << 20)) >> 21 - s15 += carry[14] - s14 -= carry[14] << 21 - carry[16] = (s16 + (1 << 20)) >> 21 - s17 += carry[16] - s16 -= carry[16] << 21 - carry[18] = (s18 + (1 << 20)) >> 21 - s19 += carry[18] - s18 -= carry[18] << 21 - carry[20] = (s20 + (1 << 20)) >> 21 - s21 += carry[20] - s20 -= carry[20] << 21 - carry[22] = (s22 + (1 << 20)) >> 21 - s23 += carry[22] - s22 -= carry[22] << 21 - - carry[1] = (s1 + (1 << 20)) >> 21 - s2 += carry[1] - s1 -= carry[1] << 21 - carry[3] = (s3 + (1 << 20)) >> 21 - s4 += carry[3] - s3 -= carry[3] << 21 - carry[5] = (s5 + (1 << 20)) >> 21 - s6 += carry[5] - s5 -= carry[5] << 21 - carry[7] = (s7 + (1 << 20)) >> 21 - s8 += carry[7] - s7 -= carry[7] << 21 - carry[9] = (s9 + (1 << 20)) >> 21 - s10 += carry[9] - s9 -= carry[9] << 21 - carry[11] = (s11 + (1 << 20)) >> 21 - s12 += carry[11] - s11 -= carry[11] << 21 - carry[13] = (s13 + (1 << 20)) >> 21 - s14 += carry[13] - s13 -= carry[13] << 21 - carry[15] = (s15 + (1 << 20)) >> 21 - s16 += carry[15] - s15 -= carry[15] << 21 - carry[17] = (s17 + (1 << 20)) >> 21 - s18 += carry[17] - s17 -= carry[17] << 21 - carry[19] = (s19 + (1 << 20)) >> 21 - s20 += carry[19] - s19 -= carry[19] << 21 - carry[21] = (s21 + (1 << 20)) >> 21 - s22 += carry[21] - s21 -= carry[21] << 21 - - s11 += s23 * 666643 - s12 += s23 * 470296 - s13 += s23 * 654183 - s14 -= s23 * 997805 - s15 += s23 * 136657 - s16 -= s23 * 683901 - s23 = 0 - - s10 += s22 * 666643 - s11 += s22 * 470296 - s12 += s22 * 654183 - s13 -= s22 * 997805 - s14 += s22 * 136657 - s15 -= s22 * 683901 - s22 = 0 - - s9 += s21 * 666643 - s10 += s21 * 470296 - s11 += s21 * 654183 - s12 -= s21 * 997805 - s13 += s21 * 136657 - s14 -= s21 * 683901 - s21 = 0 - - s8 += s20 * 666643 - s9 += s20 * 470296 - s10 += s20 * 654183 - s11 -= s20 * 997805 - s12 += s20 * 136657 - s13 -= s20 * 683901 - s20 = 0 - - s7 += s19 * 666643 - s8 += s19 * 470296 - s9 += s19 * 654183 - s10 -= s19 * 997805 - s11 += s19 * 136657 - s12 -= s19 * 683901 - s19 = 0 - - s6 += s18 * 666643 - s7 += s18 * 470296 - s8 += s18 * 654183 - s9 -= s18 * 997805 - s10 += s18 * 136657 - s11 -= s18 * 683901 - s18 = 0 - - carry[6] = (s6 + (1 << 20)) >> 21 - s7 += carry[6] - s6 -= carry[6] << 21 - carry[8] = (s8 + (1 << 20)) >> 21 - s9 += carry[8] - s8 -= carry[8] << 21 - carry[10] = (s10 + (1 << 20)) >> 21 - s11 += carry[10] - s10 -= carry[10] << 21 - carry[12] = (s12 + (1 << 20)) >> 21 - s13 += carry[12] - s12 -= carry[12] << 21 - carry[14] = (s14 + (1 << 20)) >> 21 - s15 += carry[14] - s14 -= carry[14] << 21 - carry[16] = (s16 + (1 << 20)) >> 21 - s17 += carry[16] - s16 -= carry[16] << 21 - - carry[7] = (s7 + (1 << 20)) >> 21 - s8 += carry[7] - s7 -= carry[7] << 21 - carry[9] = (s9 + (1 << 20)) >> 21 - s10 += carry[9] - s9 -= carry[9] << 21 - carry[11] = (s11 + (1 << 20)) >> 21 - s12 += carry[11] - s11 -= carry[11] << 21 - carry[13] = (s13 + (1 << 20)) >> 21 - s14 += carry[13] - s13 -= carry[13] << 21 - carry[15] = (s15 + (1 << 20)) >> 21 - s16 += carry[15] - s15 -= carry[15] << 21 - - s5 += s17 * 666643 - s6 += s17 * 470296 - s7 += s17 * 654183 - s8 -= s17 * 997805 - s9 += s17 * 136657 - s10 -= s17 * 683901 - s17 = 0 - - s4 += s16 * 666643 - s5 += s16 * 470296 - s6 += s16 * 654183 - s7 -= s16 * 997805 - s8 += s16 * 136657 - s9 -= s16 * 683901 - s16 = 0 - - s3 += s15 * 666643 - s4 += s15 * 470296 - s5 += s15 * 654183 - s6 -= s15 * 997805 - s7 += s15 * 136657 - s8 -= s15 * 683901 - s15 = 0 - - s2 += s14 * 666643 - s3 += s14 * 470296 - s4 += s14 * 654183 - s5 -= s14 * 997805 - s6 += s14 * 136657 - s7 -= s14 * 683901 - s14 = 0 - - s1 += s13 * 666643 - s2 += s13 * 470296 - s3 += s13 * 654183 - s4 -= s13 * 997805 - s5 += s13 * 136657 - s6 -= s13 * 683901 - s13 = 0 - - s0 += s12 * 666643 - s1 += s12 * 470296 - s2 += s12 * 654183 - s3 -= s12 * 997805 - s4 += s12 * 136657 - s5 -= s12 * 683901 - s12 = 0 - - carry[0] = (s0 + (1 << 20)) >> 21 - s1 += carry[0] - s0 -= carry[0] << 21 - carry[2] = (s2 + (1 << 20)) >> 21 - s3 += carry[2] - s2 -= carry[2] << 21 - carry[4] = (s4 + (1 << 20)) >> 21 - s5 += carry[4] - s4 -= carry[4] << 21 - carry[6] = (s6 + (1 << 20)) >> 21 - s7 += carry[6] - s6 -= carry[6] << 21 - carry[8] = (s8 + (1 << 20)) >> 21 - s9 += carry[8] - s8 -= carry[8] << 21 - carry[10] = (s10 + (1 << 20)) >> 21 - s11 += carry[10] - s10 -= carry[10] << 21 - - carry[1] = (s1 + (1 << 20)) >> 21 - s2 += carry[1] - s1 -= carry[1] << 21 - carry[3] = (s3 + (1 << 20)) >> 21 - s4 += carry[3] - s3 -= carry[3] << 21 - carry[5] = (s5 + (1 << 20)) >> 21 - s6 += carry[5] - s5 -= carry[5] << 21 - carry[7] = (s7 + (1 << 20)) >> 21 - s8 += carry[7] - s7 -= carry[7] << 21 - carry[9] = (s9 + (1 << 20)) >> 21 - s10 += carry[9] - s9 -= carry[9] << 21 - carry[11] = (s11 + (1 << 20)) >> 21 - s12 += carry[11] - s11 -= carry[11] << 21 - - s0 += s12 * 666643 - s1 += s12 * 470296 - s2 += s12 * 654183 - s3 -= s12 * 997805 - s4 += s12 * 136657 - s5 -= s12 * 683901 - s12 = 0 - - carry[0] = s0 >> 21 - s1 += carry[0] - s0 -= carry[0] << 21 - carry[1] = s1 >> 21 - s2 += carry[1] - s1 -= carry[1] << 21 - carry[2] = s2 >> 21 - s3 += carry[2] - s2 -= carry[2] << 21 - carry[3] = s3 >> 21 - s4 += carry[3] - s3 -= carry[3] << 21 - carry[4] = s4 >> 21 - s5 += carry[4] - s4 -= carry[4] << 21 - carry[5] = s5 >> 21 - s6 += carry[5] - s5 -= carry[5] << 21 - carry[6] = s6 >> 21 - s7 += carry[6] - s6 -= carry[6] << 21 - carry[7] = s7 >> 21 - s8 += carry[7] - s7 -= carry[7] << 21 - carry[8] = s8 >> 21 - s9 += carry[8] - s8 -= carry[8] << 21 - carry[9] = s9 >> 21 - s10 += carry[9] - s9 -= carry[9] << 21 - carry[10] = s10 >> 21 - s11 += carry[10] - s10 -= carry[10] << 21 - carry[11] = s11 >> 21 - s12 += carry[11] - s11 -= carry[11] << 21 - - s0 += s12 * 666643 - s1 += s12 * 470296 - s2 += s12 * 654183 - s3 -= s12 * 997805 - s4 += s12 * 136657 - s5 -= s12 * 683901 - s12 = 0 - - carry[0] = s0 >> 21 - s1 += carry[0] - s0 -= carry[0] << 21 - carry[1] = s1 >> 21 - s2 += carry[1] - s1 -= carry[1] << 21 - carry[2] = s2 >> 21 - s3 += carry[2] - s2 -= carry[2] << 21 - carry[3] = s3 >> 21 - s4 += carry[3] - s3 -= carry[3] << 21 - carry[4] = s4 >> 21 - s5 += carry[4] - s4 -= carry[4] << 21 - carry[5] = s5 >> 21 - s6 += carry[5] - s5 -= carry[5] << 21 - carry[6] = s6 >> 21 - s7 += carry[6] - s6 -= carry[6] << 21 - carry[7] = s7 >> 21 - s8 += carry[7] - s7 -= carry[7] << 21 - carry[8] = s8 >> 21 - s9 += carry[8] - s8 -= carry[8] << 21 - carry[9] = s9 >> 21 - s10 += carry[9] - s9 -= carry[9] << 21 - carry[10] = s10 >> 21 - s11 += carry[10] - s10 -= carry[10] << 21 - - s[0] = byte(s0 >> 0) - s[1] = byte(s0 >> 8) - s[2] = byte((s0 >> 16) | (s1 << 5)) - s[3] = byte(s1 >> 3) - s[4] = byte(s1 >> 11) - s[5] = byte((s1 >> 19) | (s2 << 2)) - s[6] = byte(s2 >> 6) - s[7] = byte((s2 >> 14) | (s3 << 7)) - s[8] = byte(s3 >> 1) - s[9] = byte(s3 >> 9) - s[10] = byte((s3 >> 17) | (s4 << 4)) - s[11] = byte(s4 >> 4) - s[12] = byte(s4 >> 12) - s[13] = byte((s4 >> 20) | (s5 << 1)) - s[14] = byte(s5 >> 7) - s[15] = byte((s5 >> 15) | (s6 << 6)) - s[16] = byte(s6 >> 2) - s[17] = byte(s6 >> 10) - s[18] = byte((s6 >> 18) | (s7 << 3)) - s[19] = byte(s7 >> 5) - s[20] = byte(s7 >> 13) - s[21] = byte(s8 >> 0) - s[22] = byte(s8 >> 8) - s[23] = byte((s8 >> 16) | (s9 << 5)) - s[24] = byte(s9 >> 3) - s[25] = byte(s9 >> 11) - s[26] = byte((s9 >> 19) | (s10 << 2)) - s[27] = byte(s10 >> 6) - s[28] = byte((s10 >> 14) | (s11 << 7)) - s[29] = byte(s11 >> 1) - s[30] = byte(s11 >> 9) - s[31] = byte(s11 >> 17) -} - -// Input: -// s[0]+256*s[1]+...+256^63*s[63] = s -// -// Output: -// s[0]+256*s[1]+...+256^31*s[31] = s mod l -// where l = 2^252 + 27742317777372353535851937790883648493. -func ScReduce(out *[32]byte, s *[64]byte) { - s0 := 2097151 & load3(s[:]) - s1 := 2097151 & (load4(s[2:]) >> 5) - s2 := 2097151 & (load3(s[5:]) >> 2) - s3 := 2097151 & (load4(s[7:]) >> 7) - s4 := 2097151 & (load4(s[10:]) >> 4) - s5 := 2097151 & (load3(s[13:]) >> 1) - s6 := 2097151 & (load4(s[15:]) >> 6) - s7 := 2097151 & (load3(s[18:]) >> 3) - s8 := 2097151 & load3(s[21:]) - s9 := 2097151 & (load4(s[23:]) >> 5) - s10 := 2097151 & (load3(s[26:]) >> 2) - s11 := 2097151 & (load4(s[28:]) >> 7) - s12 := 2097151 & (load4(s[31:]) >> 4) - s13 := 2097151 & (load3(s[34:]) >> 1) - s14 := 2097151 & (load4(s[36:]) >> 6) - s15 := 2097151 & (load3(s[39:]) >> 3) - s16 := 2097151 & load3(s[42:]) - s17 := 2097151 & (load4(s[44:]) >> 5) - s18 := 2097151 & (load3(s[47:]) >> 2) - s19 := 2097151 & (load4(s[49:]) >> 7) - s20 := 2097151 & (load4(s[52:]) >> 4) - s21 := 2097151 & (load3(s[55:]) >> 1) - s22 := 2097151 & (load4(s[57:]) >> 6) - s23 := (load4(s[60:]) >> 3) - - s11 += s23 * 666643 - s12 += s23 * 470296 - s13 += s23 * 654183 - s14 -= s23 * 997805 - s15 += s23 * 136657 - s16 -= s23 * 683901 - s23 = 0 - - s10 += s22 * 666643 - s11 += s22 * 470296 - s12 += s22 * 654183 - s13 -= s22 * 997805 - s14 += s22 * 136657 - s15 -= s22 * 683901 - s22 = 0 - - s9 += s21 * 666643 - s10 += s21 * 470296 - s11 += s21 * 654183 - s12 -= s21 * 997805 - s13 += s21 * 136657 - s14 -= s21 * 683901 - s21 = 0 - - s8 += s20 * 666643 - s9 += s20 * 470296 - s10 += s20 * 654183 - s11 -= s20 * 997805 - s12 += s20 * 136657 - s13 -= s20 * 683901 - s20 = 0 - - s7 += s19 * 666643 - s8 += s19 * 470296 - s9 += s19 * 654183 - s10 -= s19 * 997805 - s11 += s19 * 136657 - s12 -= s19 * 683901 - s19 = 0 - - s6 += s18 * 666643 - s7 += s18 * 470296 - s8 += s18 * 654183 - s9 -= s18 * 997805 - s10 += s18 * 136657 - s11 -= s18 * 683901 - s18 = 0 - - var carry [17]int64 - - carry[6] = (s6 + (1 << 20)) >> 21 - s7 += carry[6] - s6 -= carry[6] << 21 - carry[8] = (s8 + (1 << 20)) >> 21 - s9 += carry[8] - s8 -= carry[8] << 21 - carry[10] = (s10 + (1 << 20)) >> 21 - s11 += carry[10] - s10 -= carry[10] << 21 - carry[12] = (s12 + (1 << 20)) >> 21 - s13 += carry[12] - s12 -= carry[12] << 21 - carry[14] = (s14 + (1 << 20)) >> 21 - s15 += carry[14] - s14 -= carry[14] << 21 - carry[16] = (s16 + (1 << 20)) >> 21 - s17 += carry[16] - s16 -= carry[16] << 21 - - carry[7] = (s7 + (1 << 20)) >> 21 - s8 += carry[7] - s7 -= carry[7] << 21 - carry[9] = (s9 + (1 << 20)) >> 21 - s10 += carry[9] - s9 -= carry[9] << 21 - carry[11] = (s11 + (1 << 20)) >> 21 - s12 += carry[11] - s11 -= carry[11] << 21 - carry[13] = (s13 + (1 << 20)) >> 21 - s14 += carry[13] - s13 -= carry[13] << 21 - carry[15] = (s15 + (1 << 20)) >> 21 - s16 += carry[15] - s15 -= carry[15] << 21 - - s5 += s17 * 666643 - s6 += s17 * 470296 - s7 += s17 * 654183 - s8 -= s17 * 997805 - s9 += s17 * 136657 - s10 -= s17 * 683901 - s17 = 0 - - s4 += s16 * 666643 - s5 += s16 * 470296 - s6 += s16 * 654183 - s7 -= s16 * 997805 - s8 += s16 * 136657 - s9 -= s16 * 683901 - s16 = 0 - - s3 += s15 * 666643 - s4 += s15 * 470296 - s5 += s15 * 654183 - s6 -= s15 * 997805 - s7 += s15 * 136657 - s8 -= s15 * 683901 - s15 = 0 - - s2 += s14 * 666643 - s3 += s14 * 470296 - s4 += s14 * 654183 - s5 -= s14 * 997805 - s6 += s14 * 136657 - s7 -= s14 * 683901 - s14 = 0 - - s1 += s13 * 666643 - s2 += s13 * 470296 - s3 += s13 * 654183 - s4 -= s13 * 997805 - s5 += s13 * 136657 - s6 -= s13 * 683901 - s13 = 0 - - s0 += s12 * 666643 - s1 += s12 * 470296 - s2 += s12 * 654183 - s3 -= s12 * 997805 - s4 += s12 * 136657 - s5 -= s12 * 683901 - s12 = 0 - - carry[0] = (s0 + (1 << 20)) >> 21 - s1 += carry[0] - s0 -= carry[0] << 21 - carry[2] = (s2 + (1 << 20)) >> 21 - s3 += carry[2] - s2 -= carry[2] << 21 - carry[4] = (s4 + (1 << 20)) >> 21 - s5 += carry[4] - s4 -= carry[4] << 21 - carry[6] = (s6 + (1 << 20)) >> 21 - s7 += carry[6] - s6 -= carry[6] << 21 - carry[8] = (s8 + (1 << 20)) >> 21 - s9 += carry[8] - s8 -= carry[8] << 21 - carry[10] = (s10 + (1 << 20)) >> 21 - s11 += carry[10] - s10 -= carry[10] << 21 - - carry[1] = (s1 + (1 << 20)) >> 21 - s2 += carry[1] - s1 -= carry[1] << 21 - carry[3] = (s3 + (1 << 20)) >> 21 - s4 += carry[3] - s3 -= carry[3] << 21 - carry[5] = (s5 + (1 << 20)) >> 21 - s6 += carry[5] - s5 -= carry[5] << 21 - carry[7] = (s7 + (1 << 20)) >> 21 - s8 += carry[7] - s7 -= carry[7] << 21 - carry[9] = (s9 + (1 << 20)) >> 21 - s10 += carry[9] - s9 -= carry[9] << 21 - carry[11] = (s11 + (1 << 20)) >> 21 - s12 += carry[11] - s11 -= carry[11] << 21 - - s0 += s12 * 666643 - s1 += s12 * 470296 - s2 += s12 * 654183 - s3 -= s12 * 997805 - s4 += s12 * 136657 - s5 -= s12 * 683901 - s12 = 0 - - carry[0] = s0 >> 21 - s1 += carry[0] - s0 -= carry[0] << 21 - carry[1] = s1 >> 21 - s2 += carry[1] - s1 -= carry[1] << 21 - carry[2] = s2 >> 21 - s3 += carry[2] - s2 -= carry[2] << 21 - carry[3] = s3 >> 21 - s4 += carry[3] - s3 -= carry[3] << 21 - carry[4] = s4 >> 21 - s5 += carry[4] - s4 -= carry[4] << 21 - carry[5] = s5 >> 21 - s6 += carry[5] - s5 -= carry[5] << 21 - carry[6] = s6 >> 21 - s7 += carry[6] - s6 -= carry[6] << 21 - carry[7] = s7 >> 21 - s8 += carry[7] - s7 -= carry[7] << 21 - carry[8] = s8 >> 21 - s9 += carry[8] - s8 -= carry[8] << 21 - carry[9] = s9 >> 21 - s10 += carry[9] - s9 -= carry[9] << 21 - carry[10] = s10 >> 21 - s11 += carry[10] - s10 -= carry[10] << 21 - carry[11] = s11 >> 21 - s12 += carry[11] - s11 -= carry[11] << 21 - - s0 += s12 * 666643 - s1 += s12 * 470296 - s2 += s12 * 654183 - s3 -= s12 * 997805 - s4 += s12 * 136657 - s5 -= s12 * 683901 - s12 = 0 - - carry[0] = s0 >> 21 - s1 += carry[0] - s0 -= carry[0] << 21 - carry[1] = s1 >> 21 - s2 += carry[1] - s1 -= carry[1] << 21 - carry[2] = s2 >> 21 - s3 += carry[2] - s2 -= carry[2] << 21 - carry[3] = s3 >> 21 - s4 += carry[3] - s3 -= carry[3] << 21 - carry[4] = s4 >> 21 - s5 += carry[4] - s4 -= carry[4] << 21 - carry[5] = s5 >> 21 - s6 += carry[5] - s5 -= carry[5] << 21 - carry[6] = s6 >> 21 - s7 += carry[6] - s6 -= carry[6] << 21 - carry[7] = s7 >> 21 - s8 += carry[7] - s7 -= carry[7] << 21 - carry[8] = s8 >> 21 - s9 += carry[8] - s8 -= carry[8] << 21 - carry[9] = s9 >> 21 - s10 += carry[9] - s9 -= carry[9] << 21 - carry[10] = s10 >> 21 - s11 += carry[10] - s10 -= carry[10] << 21 - - out[0] = byte(s0 >> 0) - out[1] = byte(s0 >> 8) - out[2] = byte((s0 >> 16) | (s1 << 5)) - out[3] = byte(s1 >> 3) - out[4] = byte(s1 >> 11) - out[5] = byte((s1 >> 19) | (s2 << 2)) - out[6] = byte(s2 >> 6) - out[7] = byte((s2 >> 14) | (s3 << 7)) - out[8] = byte(s3 >> 1) - out[9] = byte(s3 >> 9) - out[10] = byte((s3 >> 17) | (s4 << 4)) - out[11] = byte(s4 >> 4) - out[12] = byte(s4 >> 12) - out[13] = byte((s4 >> 20) | (s5 << 1)) - out[14] = byte(s5 >> 7) - out[15] = byte((s5 >> 15) | (s6 << 6)) - out[16] = byte(s6 >> 2) - out[17] = byte(s6 >> 10) - out[18] = byte((s6 >> 18) | (s7 << 3)) - out[19] = byte(s7 >> 5) - out[20] = byte(s7 >> 13) - out[21] = byte(s8 >> 0) - out[22] = byte(s8 >> 8) - out[23] = byte((s8 >> 16) | (s9 << 5)) - out[24] = byte(s9 >> 3) - out[25] = byte(s9 >> 11) - out[26] = byte((s9 >> 19) | (s10 << 2)) - out[27] = byte(s10 >> 6) - out[28] = byte((s10 >> 14) | (s11 << 7)) - out[29] = byte(s11 >> 1) - out[30] = byte(s11 >> 9) - out[31] = byte(s11 >> 17) -} diff --git a/vendor/golang.org/x/crypto/ed25519/testdata/sign.input.gz b/vendor/golang.org/x/crypto/ed25519/testdata/sign.input.gz deleted file mode 100644 index 41030690c..000000000 Binary files a/vendor/golang.org/x/crypto/ed25519/testdata/sign.input.gz and /dev/null differ diff --git a/vendor/golang.org/x/crypto/hkdf/example_test.go b/vendor/golang.org/x/crypto/hkdf/example_test.go deleted file mode 100644 index df8439512..000000000 --- a/vendor/golang.org/x/crypto/hkdf/example_test.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package hkdf_test - -import ( - "bytes" - "crypto/rand" - "crypto/sha256" - "fmt" - "golang.org/x/crypto/hkdf" - "io" -) - -// Usage example that expands one master key into three other cryptographically -// secure keys. -func Example_usage() { - // Underlying hash function to use - hash := sha256.New - - // Cryptographically secure master key. - master := []byte{0x00, 0x01, 0x02, 0x03} // i.e. NOT this. - - // Non secret salt, optional (can be nil) - // Recommended: hash-length sized random - salt := make([]byte, hash().Size()) - n, err := io.ReadFull(rand.Reader, salt) - if n != len(salt) || err != nil { - fmt.Println("error:", err) - return - } - - // Non secret context specific info, optional (can be nil). - // Note, independent from the master key. - info := []byte{0x03, 0x14, 0x15, 0x92, 0x65} - - // Create the key derivation function - hkdf := hkdf.New(hash, master, salt, info) - - // Generate the required keys - keys := make([][]byte, 3) - for i := 0; i < len(keys); i++ { - keys[i] = make([]byte, 24) - n, err := io.ReadFull(hkdf, keys[i]) - if n != len(keys[i]) || err != nil { - fmt.Println("error:", err) - return - } - } - - // Keys should contain 192 bit random keys - for i := 1; i <= len(keys); i++ { - fmt.Printf("Key #%d: %v\n", i, !bytes.Equal(keys[i-1], make([]byte, 24))) - } - - // Output: - // Key #1: true - // Key #2: true - // Key #3: true -} diff --git a/vendor/golang.org/x/crypto/hkdf/hkdf.go b/vendor/golang.org/x/crypto/hkdf/hkdf.go deleted file mode 100644 index 5bc246355..000000000 --- a/vendor/golang.org/x/crypto/hkdf/hkdf.go +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package hkdf implements the HMAC-based Extract-and-Expand Key Derivation -// Function (HKDF) as defined in RFC 5869. -// -// HKDF is a cryptographic key derivation function (KDF) with the goal of -// expanding limited input keying material into one or more cryptographically -// strong secret keys. -// -// RFC 5869: https://tools.ietf.org/html/rfc5869 -package hkdf // import "golang.org/x/crypto/hkdf" - -import ( - "crypto/hmac" - "errors" - "hash" - "io" -) - -type hkdf struct { - expander hash.Hash - size int - - info []byte - counter byte - - prev []byte - cache []byte -} - -func (f *hkdf) Read(p []byte) (int, error) { - // Check whether enough data can be generated - need := len(p) - remains := len(f.cache) + int(255-f.counter+1)*f.size - if remains < need { - return 0, errors.New("hkdf: entropy limit reached") - } - // Read from the cache, if enough data is present - n := copy(p, f.cache) - p = p[n:] - - // Fill the buffer - for len(p) > 0 { - f.expander.Reset() - f.expander.Write(f.prev) - f.expander.Write(f.info) - f.expander.Write([]byte{f.counter}) - f.prev = f.expander.Sum(f.prev[:0]) - f.counter++ - - // Copy the new batch into p - f.cache = f.prev - n = copy(p, f.cache) - p = p[n:] - } - // Save leftovers for next run - f.cache = f.cache[n:] - - return need, nil -} - -// New returns a new HKDF using the given hash, the secret keying material to expand -// and optional salt and info fields. -func New(hash func() hash.Hash, secret, salt, info []byte) io.Reader { - if salt == nil { - salt = make([]byte, hash().Size()) - } - extractor := hmac.New(hash, salt) - extractor.Write(secret) - prk := extractor.Sum(nil) - - return &hkdf{hmac.New(hash, prk), extractor.Size(), info, 1, nil, nil} -} diff --git a/vendor/golang.org/x/crypto/hkdf/hkdf_test.go b/vendor/golang.org/x/crypto/hkdf/hkdf_test.go deleted file mode 100644 index cee659bcd..000000000 --- a/vendor/golang.org/x/crypto/hkdf/hkdf_test.go +++ /dev/null @@ -1,370 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. -package hkdf - -import ( - "bytes" - "crypto/md5" - "crypto/sha1" - "crypto/sha256" - "crypto/sha512" - "hash" - "io" - "testing" -) - -type hkdfTest struct { - hash func() hash.Hash - master []byte - salt []byte - info []byte - out []byte -} - -var hkdfTests = []hkdfTest{ - // Tests from RFC 5869 - { - sha256.New, - []byte{ - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, - }, - []byte{ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, - }, - []byte{ - 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, - 0xf8, 0xf9, - }, - []byte{ - 0x3c, 0xb2, 0x5f, 0x25, 0xfa, 0xac, 0xd5, 0x7a, - 0x90, 0x43, 0x4f, 0x64, 0xd0, 0x36, 0x2f, 0x2a, - 0x2d, 0x2d, 0x0a, 0x90, 0xcf, 0x1a, 0x5a, 0x4c, - 0x5d, 0xb0, 0x2d, 0x56, 0xec, 0xc4, 0xc5, 0xbf, - 0x34, 0x00, 0x72, 0x08, 0xd5, 0xb8, 0x87, 0x18, - 0x58, 0x65, - }, - }, - { - sha256.New, - []byte{ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, - 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, - 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, - 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, - 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, - 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, - 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, - }, - []byte{ - 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, - 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, - 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, - 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, - 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, - 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, - 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, - 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, - 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, - 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, - }, - []byte{ - 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, - 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, - 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, - 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, - 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, - 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, - 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, - 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, - 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, - 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, - }, - []byte{ - 0xb1, 0x1e, 0x39, 0x8d, 0xc8, 0x03, 0x27, 0xa1, - 0xc8, 0xe7, 0xf7, 0x8c, 0x59, 0x6a, 0x49, 0x34, - 0x4f, 0x01, 0x2e, 0xda, 0x2d, 0x4e, 0xfa, 0xd8, - 0xa0, 0x50, 0xcc, 0x4c, 0x19, 0xaf, 0xa9, 0x7c, - 0x59, 0x04, 0x5a, 0x99, 0xca, 0xc7, 0x82, 0x72, - 0x71, 0xcb, 0x41, 0xc6, 0x5e, 0x59, 0x0e, 0x09, - 0xda, 0x32, 0x75, 0x60, 0x0c, 0x2f, 0x09, 0xb8, - 0x36, 0x77, 0x93, 0xa9, 0xac, 0xa3, 0xdb, 0x71, - 0xcc, 0x30, 0xc5, 0x81, 0x79, 0xec, 0x3e, 0x87, - 0xc1, 0x4c, 0x01, 0xd5, 0xc1, 0xf3, 0x43, 0x4f, - 0x1d, 0x87, - }, - }, - { - sha256.New, - []byte{ - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, - }, - []byte{}, - []byte{}, - []byte{ - 0x8d, 0xa4, 0xe7, 0x75, 0xa5, 0x63, 0xc1, 0x8f, - 0x71, 0x5f, 0x80, 0x2a, 0x06, 0x3c, 0x5a, 0x31, - 0xb8, 0xa1, 0x1f, 0x5c, 0x5e, 0xe1, 0x87, 0x9e, - 0xc3, 0x45, 0x4e, 0x5f, 0x3c, 0x73, 0x8d, 0x2d, - 0x9d, 0x20, 0x13, 0x95, 0xfa, 0xa4, 0xb6, 0x1a, - 0x96, 0xc8, - }, - }, - { - sha1.New, - []byte{ - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, - 0x0b, 0x0b, 0x0b, - }, - []byte{ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, - }, - []byte{ - 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, - 0xf8, 0xf9, - }, - []byte{ - 0x08, 0x5a, 0x01, 0xea, 0x1b, 0x10, 0xf3, 0x69, - 0x33, 0x06, 0x8b, 0x56, 0xef, 0xa5, 0xad, 0x81, - 0xa4, 0xf1, 0x4b, 0x82, 0x2f, 0x5b, 0x09, 0x15, - 0x68, 0xa9, 0xcd, 0xd4, 0xf1, 0x55, 0xfd, 0xa2, - 0xc2, 0x2e, 0x42, 0x24, 0x78, 0xd3, 0x05, 0xf3, - 0xf8, 0x96, - }, - }, - { - sha1.New, - []byte{ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, - 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, - 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, - 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, - 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, - 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, - 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, - }, - []byte{ - 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, - 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, - 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, - 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, - 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, - 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, - 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, - 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, - 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, - 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, - }, - []byte{ - 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, - 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, - 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, - 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, - 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, - 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, - 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, - 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, - 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, - 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, - }, - []byte{ - 0x0b, 0xd7, 0x70, 0xa7, 0x4d, 0x11, 0x60, 0xf7, - 0xc9, 0xf1, 0x2c, 0xd5, 0x91, 0x2a, 0x06, 0xeb, - 0xff, 0x6a, 0xdc, 0xae, 0x89, 0x9d, 0x92, 0x19, - 0x1f, 0xe4, 0x30, 0x56, 0x73, 0xba, 0x2f, 0xfe, - 0x8f, 0xa3, 0xf1, 0xa4, 0xe5, 0xad, 0x79, 0xf3, - 0xf3, 0x34, 0xb3, 0xb2, 0x02, 0xb2, 0x17, 0x3c, - 0x48, 0x6e, 0xa3, 0x7c, 0xe3, 0xd3, 0x97, 0xed, - 0x03, 0x4c, 0x7f, 0x9d, 0xfe, 0xb1, 0x5c, 0x5e, - 0x92, 0x73, 0x36, 0xd0, 0x44, 0x1f, 0x4c, 0x43, - 0x00, 0xe2, 0xcf, 0xf0, 0xd0, 0x90, 0x0b, 0x52, - 0xd3, 0xb4, - }, - }, - { - sha1.New, - []byte{ - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, - }, - []byte{}, - []byte{}, - []byte{ - 0x0a, 0xc1, 0xaf, 0x70, 0x02, 0xb3, 0xd7, 0x61, - 0xd1, 0xe5, 0x52, 0x98, 0xda, 0x9d, 0x05, 0x06, - 0xb9, 0xae, 0x52, 0x05, 0x72, 0x20, 0xa3, 0x06, - 0xe0, 0x7b, 0x6b, 0x87, 0xe8, 0xdf, 0x21, 0xd0, - 0xea, 0x00, 0x03, 0x3d, 0xe0, 0x39, 0x84, 0xd3, - 0x49, 0x18, - }, - }, - { - sha1.New, - []byte{ - 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, - 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, - 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, - }, - nil, - []byte{}, - []byte{ - 0x2c, 0x91, 0x11, 0x72, 0x04, 0xd7, 0x45, 0xf3, - 0x50, 0x0d, 0x63, 0x6a, 0x62, 0xf6, 0x4f, 0x0a, - 0xb3, 0xba, 0xe5, 0x48, 0xaa, 0x53, 0xd4, 0x23, - 0xb0, 0xd1, 0xf2, 0x7e, 0xbb, 0xa6, 0xf5, 0xe5, - 0x67, 0x3a, 0x08, 0x1d, 0x70, 0xcc, 0xe7, 0xac, - 0xfc, 0x48, - }, - }, -} - -func TestHKDF(t *testing.T) { - for i, tt := range hkdfTests { - hkdf := New(tt.hash, tt.master, tt.salt, tt.info) - out := make([]byte, len(tt.out)) - - n, err := io.ReadFull(hkdf, out) - if n != len(tt.out) || err != nil { - t.Errorf("test %d: not enough output bytes: %d.", i, n) - } - - if !bytes.Equal(out, tt.out) { - t.Errorf("test %d: incorrect output: have %v, need %v.", i, out, tt.out) - } - } -} - -func TestHKDFMultiRead(t *testing.T) { - for i, tt := range hkdfTests { - hkdf := New(tt.hash, tt.master, tt.salt, tt.info) - out := make([]byte, len(tt.out)) - - for b := 0; b < len(tt.out); b++ { - n, err := io.ReadFull(hkdf, out[b:b+1]) - if n != 1 || err != nil { - t.Errorf("test %d.%d: not enough output bytes: have %d, need %d .", i, b, n, len(tt.out)) - } - } - - if !bytes.Equal(out, tt.out) { - t.Errorf("test %d: incorrect output: have %v, need %v.", i, out, tt.out) - } - } -} - -func TestHKDFLimit(t *testing.T) { - hash := sha1.New - master := []byte{0x00, 0x01, 0x02, 0x03} - info := []byte{} - - hkdf := New(hash, master, nil, info) - limit := hash().Size() * 255 - out := make([]byte, limit) - - // The maximum output bytes should be extractable - n, err := io.ReadFull(hkdf, out) - if n != limit || err != nil { - t.Errorf("not enough output bytes: %d, %v.", n, err) - } - - // Reading one more should fail - n, err = io.ReadFull(hkdf, make([]byte, 1)) - if n > 0 || err == nil { - t.Errorf("key expansion overflowed: n = %d, err = %v", n, err) - } -} - -func Benchmark16ByteMD5Single(b *testing.B) { - benchmarkHKDFSingle(md5.New, 16, b) -} - -func Benchmark20ByteSHA1Single(b *testing.B) { - benchmarkHKDFSingle(sha1.New, 20, b) -} - -func Benchmark32ByteSHA256Single(b *testing.B) { - benchmarkHKDFSingle(sha256.New, 32, b) -} - -func Benchmark64ByteSHA512Single(b *testing.B) { - benchmarkHKDFSingle(sha512.New, 64, b) -} - -func Benchmark8ByteMD5Stream(b *testing.B) { - benchmarkHKDFStream(md5.New, 8, b) -} - -func Benchmark16ByteMD5Stream(b *testing.B) { - benchmarkHKDFStream(md5.New, 16, b) -} - -func Benchmark8ByteSHA1Stream(b *testing.B) { - benchmarkHKDFStream(sha1.New, 8, b) -} - -func Benchmark20ByteSHA1Stream(b *testing.B) { - benchmarkHKDFStream(sha1.New, 20, b) -} - -func Benchmark8ByteSHA256Stream(b *testing.B) { - benchmarkHKDFStream(sha256.New, 8, b) -} - -func Benchmark32ByteSHA256Stream(b *testing.B) { - benchmarkHKDFStream(sha256.New, 32, b) -} - -func Benchmark8ByteSHA512Stream(b *testing.B) { - benchmarkHKDFStream(sha512.New, 8, b) -} - -func Benchmark64ByteSHA512Stream(b *testing.B) { - benchmarkHKDFStream(sha512.New, 64, b) -} - -func benchmarkHKDFSingle(hasher func() hash.Hash, block int, b *testing.B) { - master := []byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07} - salt := []byte{0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17} - info := []byte{0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27} - out := make([]byte, block) - - b.SetBytes(int64(block)) - b.ResetTimer() - - for i := 0; i < b.N; i++ { - hkdf := New(hasher, master, salt, info) - io.ReadFull(hkdf, out) - } -} - -func benchmarkHKDFStream(hasher func() hash.Hash, block int, b *testing.B) { - master := []byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07} - salt := []byte{0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17} - info := []byte{0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27} - out := make([]byte, block) - - b.SetBytes(int64(block)) - b.ResetTimer() - - hkdf := New(hasher, master, salt, info) - for i := 0; i < b.N; i++ { - _, err := io.ReadFull(hkdf, out) - if err != nil { - hkdf = New(hasher, master, salt, info) - i-- - } - } -} diff --git a/vendor/golang.org/x/crypto/md4/md4.go b/vendor/golang.org/x/crypto/md4/md4.go deleted file mode 100644 index 6d9ba9e5f..000000000 --- a/vendor/golang.org/x/crypto/md4/md4.go +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package md4 implements the MD4 hash algorithm as defined in RFC 1320. -package md4 // import "golang.org/x/crypto/md4" - -import ( - "crypto" - "hash" -) - -func init() { - crypto.RegisterHash(crypto.MD4, New) -} - -// The size of an MD4 checksum in bytes. -const Size = 16 - -// The blocksize of MD4 in bytes. -const BlockSize = 64 - -const ( - _Chunk = 64 - _Init0 = 0x67452301 - _Init1 = 0xEFCDAB89 - _Init2 = 0x98BADCFE - _Init3 = 0x10325476 -) - -// digest represents the partial evaluation of a checksum. -type digest struct { - s [4]uint32 - x [_Chunk]byte - nx int - len uint64 -} - -func (d *digest) Reset() { - d.s[0] = _Init0 - d.s[1] = _Init1 - d.s[2] = _Init2 - d.s[3] = _Init3 - d.nx = 0 - d.len = 0 -} - -// New returns a new hash.Hash computing the MD4 checksum. -func New() hash.Hash { - d := new(digest) - d.Reset() - return d -} - -func (d *digest) Size() int { return Size } - -func (d *digest) BlockSize() int { return BlockSize } - -func (d *digest) Write(p []byte) (nn int, err error) { - nn = len(p) - d.len += uint64(nn) - if d.nx > 0 { - n := len(p) - if n > _Chunk-d.nx { - n = _Chunk - d.nx - } - for i := 0; i < n; i++ { - d.x[d.nx+i] = p[i] - } - d.nx += n - if d.nx == _Chunk { - _Block(d, d.x[0:]) - d.nx = 0 - } - p = p[n:] - } - n := _Block(d, p) - p = p[n:] - if len(p) > 0 { - d.nx = copy(d.x[:], p) - } - return -} - -func (d0 *digest) Sum(in []byte) []byte { - // Make a copy of d0, so that caller can keep writing and summing. - d := new(digest) - *d = *d0 - - // Padding. Add a 1 bit and 0 bits until 56 bytes mod 64. - len := d.len - var tmp [64]byte - tmp[0] = 0x80 - if len%64 < 56 { - d.Write(tmp[0 : 56-len%64]) - } else { - d.Write(tmp[0 : 64+56-len%64]) - } - - // Length in bits. - len <<= 3 - for i := uint(0); i < 8; i++ { - tmp[i] = byte(len >> (8 * i)) - } - d.Write(tmp[0:8]) - - if d.nx != 0 { - panic("d.nx != 0") - } - - for _, s := range d.s { - in = append(in, byte(s>>0)) - in = append(in, byte(s>>8)) - in = append(in, byte(s>>16)) - in = append(in, byte(s>>24)) - } - return in -} diff --git a/vendor/golang.org/x/crypto/md4/md4_test.go b/vendor/golang.org/x/crypto/md4/md4_test.go deleted file mode 100644 index b56edd787..000000000 --- a/vendor/golang.org/x/crypto/md4/md4_test.go +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package md4 - -import ( - "fmt" - "io" - "testing" -) - -type md4Test struct { - out string - in string -} - -var golden = []md4Test{ - {"31d6cfe0d16ae931b73c59d7e0c089c0", ""}, - {"bde52cb31de33e46245e05fbdbd6fb24", "a"}, - {"ec388dd78999dfc7cf4632465693b6bf", "ab"}, - {"a448017aaf21d8525fc10ae87aa6729d", "abc"}, - {"41decd8f579255c5200f86a4bb3ba740", "abcd"}, - {"9803f4a34e8eb14f96adba49064a0c41", "abcde"}, - {"804e7f1c2586e50b49ac65db5b645131", "abcdef"}, - {"752f4adfe53d1da0241b5bc216d098fc", "abcdefg"}, - {"ad9daf8d49d81988590a6f0e745d15dd", "abcdefgh"}, - {"1e4e28b05464316b56402b3815ed2dfd", "abcdefghi"}, - {"dc959c6f5d6f9e04e4380777cc964b3d", "abcdefghij"}, - {"1b5701e265778898ef7de5623bbe7cc0", "Discard medicine more than two years old."}, - {"d7f087e090fe7ad4a01cb59dacc9a572", "He who has a shady past knows that nice guys finish last."}, - {"a6f8fd6df617c72837592fc3570595c9", "I wouldn't marry him with a ten foot pole."}, - {"c92a84a9526da8abc240c05d6b1a1ce0", "Free! Free!/A trip/to Mars/for 900/empty jars/Burma Shave"}, - {"f6013160c4dcb00847069fee3bb09803", "The days of the digital watch are numbered. -Tom Stoppard"}, - {"2c3bb64f50b9107ed57640fe94bec09f", "Nepal premier won't resign."}, - {"45b7d8a32c7806f2f7f897332774d6e4", "For every action there is an equal and opposite government program."}, - {"b5b4f9026b175c62d7654bdc3a1cd438", "His money is twice tainted: 'taint yours and 'taint mine."}, - {"caf44e80f2c20ce19b5ba1cab766e7bd", "There is no reason for any individual to have a computer in their home. -Ken Olsen, 1977"}, - {"191fae6707f496aa54a6bce9f2ecf74d", "It's a tiny change to the code and not completely disgusting. - Bob Manchek"}, - {"9ddc753e7a4ccee6081cd1b45b23a834", "size: a.out: bad magic"}, - {"8d050f55b1cadb9323474564be08a521", "The major problem is with sendmail. -Mark Horton"}, - {"ad6e2587f74c3e3cc19146f6127fa2e3", "Give me a rock, paper and scissors and I will move the world. CCFestoon"}, - {"1d616d60a5fabe85589c3f1566ca7fca", "If the enemy is within range, then so are you."}, - {"aec3326a4f496a2ced65a1963f84577f", "It's well we cannot hear the screams/That we create in others' dreams."}, - {"77b4fd762d6b9245e61c50bf6ebf118b", "You remind me of a TV show, but that's all right: I watch it anyway."}, - {"e8f48c726bae5e516f6ddb1a4fe62438", "C is as portable as Stonehedge!!"}, - {"a3a84366e7219e887423b01f9be7166e", "Even if I could be Shakespeare, I think I should still choose to be Faraday. - A. Huxley"}, - {"a6b7aa35157e984ef5d9b7f32e5fbb52", "The fugacity of a constituent in a mixture of gases at a given temperature is proportional to its mole fraction. Lewis-Randall Rule"}, - {"75661f0545955f8f9abeeb17845f3fd6", "How can you write a big system without C++? -Paul Glick"}, -} - -func TestGolden(t *testing.T) { - for i := 0; i < len(golden); i++ { - g := golden[i] - c := New() - for j := 0; j < 3; j++ { - if j < 2 { - io.WriteString(c, g.in) - } else { - io.WriteString(c, g.in[0:len(g.in)/2]) - c.Sum(nil) - io.WriteString(c, g.in[len(g.in)/2:]) - } - s := fmt.Sprintf("%x", c.Sum(nil)) - if s != g.out { - t.Fatalf("md4[%d](%s) = %s want %s", j, g.in, s, g.out) - } - c.Reset() - } - } -} diff --git a/vendor/golang.org/x/crypto/md4/md4block.go b/vendor/golang.org/x/crypto/md4/md4block.go deleted file mode 100644 index 3fed475f3..000000000 --- a/vendor/golang.org/x/crypto/md4/md4block.go +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// MD4 block step. -// In its own file so that a faster assembly or C version -// can be substituted easily. - -package md4 - -var shift1 = []uint{3, 7, 11, 19} -var shift2 = []uint{3, 5, 9, 13} -var shift3 = []uint{3, 9, 11, 15} - -var xIndex2 = []uint{0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15} -var xIndex3 = []uint{0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15} - -func _Block(dig *digest, p []byte) int { - a := dig.s[0] - b := dig.s[1] - c := dig.s[2] - d := dig.s[3] - n := 0 - var X [16]uint32 - for len(p) >= _Chunk { - aa, bb, cc, dd := a, b, c, d - - j := 0 - for i := 0; i < 16; i++ { - X[i] = uint32(p[j]) | uint32(p[j+1])<<8 | uint32(p[j+2])<<16 | uint32(p[j+3])<<24 - j += 4 - } - - // If this needs to be made faster in the future, - // the usual trick is to unroll each of these - // loops by a factor of 4; that lets you replace - // the shift[] lookups with constants and, - // with suitable variable renaming in each - // unrolled body, delete the a, b, c, d = d, a, b, c - // (or you can let the optimizer do the renaming). - // - // The index variables are uint so that % by a power - // of two can be optimized easily by a compiler. - - // Round 1. - for i := uint(0); i < 16; i++ { - x := i - s := shift1[i%4] - f := ((c ^ d) & b) ^ d - a += f + X[x] - a = a<>(32-s) - a, b, c, d = d, a, b, c - } - - // Round 2. - for i := uint(0); i < 16; i++ { - x := xIndex2[i] - s := shift2[i%4] - g := (b & c) | (b & d) | (c & d) - a += g + X[x] + 0x5a827999 - a = a<>(32-s) - a, b, c, d = d, a, b, c - } - - // Round 3. - for i := uint(0); i < 16; i++ { - x := xIndex3[i] - s := shift3[i%4] - h := b ^ c ^ d - a += h + X[x] + 0x6ed9eba1 - a = a<>(32-s) - a, b, c, d = d, a, b, c - } - - a += aa - b += bb - c += cc - d += dd - - p = p[_Chunk:] - n += _Chunk - } - - dig.s[0] = a - dig.s[1] = b - dig.s[2] = c - dig.s[3] = d - return n -} diff --git a/vendor/golang.org/x/crypto/nacl/box/box.go b/vendor/golang.org/x/crypto/nacl/box/box.go deleted file mode 100644 index 7ed1864f7..000000000 --- a/vendor/golang.org/x/crypto/nacl/box/box.go +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -/* -Package box authenticates and encrypts messages using public-key cryptography. - -Box uses Curve25519, XSalsa20 and Poly1305 to encrypt and authenticate -messages. The length of messages is not hidden. - -It is the caller's responsibility to ensure the uniqueness of nonces—for -example, by using nonce 1 for the first message, nonce 2 for the second -message, etc. Nonces are long enough that randomly generated nonces have -negligible risk of collision. - -This package is interoperable with NaCl: https://nacl.cr.yp.to/box.html. -*/ -package box // import "golang.org/x/crypto/nacl/box" - -import ( - "io" - - "golang.org/x/crypto/curve25519" - "golang.org/x/crypto/nacl/secretbox" - "golang.org/x/crypto/salsa20/salsa" -) - -// Overhead is the number of bytes of overhead when boxing a message. -const Overhead = secretbox.Overhead - -// GenerateKey generates a new public/private key pair suitable for use with -// Seal and Open. -func GenerateKey(rand io.Reader) (publicKey, privateKey *[32]byte, err error) { - publicKey = new([32]byte) - privateKey = new([32]byte) - _, err = io.ReadFull(rand, privateKey[:]) - if err != nil { - publicKey = nil - privateKey = nil - return - } - - curve25519.ScalarBaseMult(publicKey, privateKey) - return -} - -var zeros [16]byte - -// Precompute calculates the shared key between peersPublicKey and privateKey -// and writes it to sharedKey. The shared key can be used with -// OpenAfterPrecomputation and SealAfterPrecomputation to speed up processing -// when using the same pair of keys repeatedly. -func Precompute(sharedKey, peersPublicKey, privateKey *[32]byte) { - curve25519.ScalarMult(sharedKey, privateKey, peersPublicKey) - salsa.HSalsa20(sharedKey, &zeros, sharedKey, &salsa.Sigma) -} - -// Seal appends an encrypted and authenticated copy of message to out, which -// will be Overhead bytes longer than the original and must not overlap. The -// nonce must be unique for each distinct message for a given pair of keys. -func Seal(out, message []byte, nonce *[24]byte, peersPublicKey, privateKey *[32]byte) []byte { - var sharedKey [32]byte - Precompute(&sharedKey, peersPublicKey, privateKey) - return secretbox.Seal(out, message, nonce, &sharedKey) -} - -// SealAfterPrecomputation performs the same actions as Seal, but takes a -// shared key as generated by Precompute. -func SealAfterPrecomputation(out, message []byte, nonce *[24]byte, sharedKey *[32]byte) []byte { - return secretbox.Seal(out, message, nonce, sharedKey) -} - -// Open authenticates and decrypts a box produced by Seal and appends the -// message to out, which must not overlap box. The output will be Overhead -// bytes smaller than box. -func Open(out, box []byte, nonce *[24]byte, peersPublicKey, privateKey *[32]byte) ([]byte, bool) { - var sharedKey [32]byte - Precompute(&sharedKey, peersPublicKey, privateKey) - return secretbox.Open(out, box, nonce, &sharedKey) -} - -// OpenAfterPrecomputation performs the same actions as Open, but takes a -// shared key as generated by Precompute. -func OpenAfterPrecomputation(out, box []byte, nonce *[24]byte, sharedKey *[32]byte) ([]byte, bool) { - return secretbox.Open(out, box, nonce, sharedKey) -} diff --git a/vendor/golang.org/x/crypto/nacl/box/box_test.go b/vendor/golang.org/x/crypto/nacl/box/box_test.go deleted file mode 100644 index 481ade28a..000000000 --- a/vendor/golang.org/x/crypto/nacl/box/box_test.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package box - -import ( - "bytes" - "crypto/rand" - "encoding/hex" - "testing" - - "golang.org/x/crypto/curve25519" -) - -func TestSealOpen(t *testing.T) { - publicKey1, privateKey1, _ := GenerateKey(rand.Reader) - publicKey2, privateKey2, _ := GenerateKey(rand.Reader) - - if *privateKey1 == *privateKey2 { - t.Fatalf("private keys are equal!") - } - if *publicKey1 == *publicKey2 { - t.Fatalf("public keys are equal!") - } - message := []byte("test message") - var nonce [24]byte - - box := Seal(nil, message, &nonce, publicKey1, privateKey2) - opened, ok := Open(nil, box, &nonce, publicKey2, privateKey1) - if !ok { - t.Fatalf("failed to open box") - } - - if !bytes.Equal(opened, message) { - t.Fatalf("got %x, want %x", opened, message) - } - - for i := range box { - box[i] ^= 0x40 - _, ok := Open(nil, box, &nonce, publicKey2, privateKey1) - if ok { - t.Fatalf("opened box with byte %d corrupted", i) - } - box[i] ^= 0x40 - } -} - -func TestBox(t *testing.T) { - var privateKey1, privateKey2 [32]byte - for i := range privateKey1[:] { - privateKey1[i] = 1 - } - for i := range privateKey2[:] { - privateKey2[i] = 2 - } - - var publicKey1 [32]byte - curve25519.ScalarBaseMult(&publicKey1, &privateKey1) - var message [64]byte - for i := range message[:] { - message[i] = 3 - } - - var nonce [24]byte - for i := range nonce[:] { - nonce[i] = 4 - } - - box := Seal(nil, message[:], &nonce, &publicKey1, &privateKey2) - - // expected was generated using the C implementation of NaCl. - expected, _ := hex.DecodeString("78ea30b19d2341ebbdba54180f821eec265cf86312549bea8a37652a8bb94f07b78a73ed1708085e6ddd0e943bbdeb8755079a37eb31d86163ce241164a47629c0539f330b4914cd135b3855bc2a2dfc") - - if !bytes.Equal(box, expected) { - t.Fatalf("box didn't match, got\n%x\n, expected\n%x", box, expected) - } -} diff --git a/vendor/golang.org/x/crypto/nacl/secretbox/example_test.go b/vendor/golang.org/x/crypto/nacl/secretbox/example_test.go deleted file mode 100644 index b25e663a8..000000000 --- a/vendor/golang.org/x/crypto/nacl/secretbox/example_test.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package secretbox_test - -import ( - "crypto/rand" - "encoding/hex" - "fmt" - "io" - - "golang.org/x/crypto/nacl/secretbox" -) - -func Example() { - // Load your secret key from a safe place and reuse it across multiple - // Seal calls. (Obviously don't use this example key for anything - // real.) If you want to convert a passphrase to a key, use a suitable - // package like bcrypt or scrypt. - secretKeyBytes, err := hex.DecodeString("6368616e676520746869732070617373776f726420746f206120736563726574") - if err != nil { - panic(err) - } - - var secretKey [32]byte - copy(secretKey[:], secretKeyBytes) - - // You must use a different nonce for each message you encrypt with the - // same key. Since the nonce here is 192 bits long, a random value - // provides a sufficiently small probability of repeats. - var nonce [24]byte - if _, err := io.ReadFull(rand.Reader, nonce[:]); err != nil { - panic(err) - } - - // This encrypts "hello world" and appends the result to the nonce. - encrypted := secretbox.Seal(nonce[:], []byte("hello world"), &nonce, &secretKey) - - // When you decrypt, you must use the same nonce and key you used to - // encrypt the message. One way to achieve this is to store the nonce - // alongside the encrypted message. Above, we stored the nonce in the first - // 24 bytes of the encrypted text. - var decryptNonce [24]byte - copy(decryptNonce[:], encrypted[:24]) - decrypted, ok := secretbox.Open([]byte{}, encrypted[24:], &decryptNonce, &secretKey) - if !ok { - panic("decryption error") - } - - fmt.Println(string(decrypted)) - // Output: hello world -} diff --git a/vendor/golang.org/x/crypto/nacl/secretbox/secretbox.go b/vendor/golang.org/x/crypto/nacl/secretbox/secretbox.go deleted file mode 100644 index 1e1dff506..000000000 --- a/vendor/golang.org/x/crypto/nacl/secretbox/secretbox.go +++ /dev/null @@ -1,149 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -/* -Package secretbox encrypts and authenticates small messages. - -Secretbox uses XSalsa20 and Poly1305 to encrypt and authenticate messages with -secret-key cryptography. The length of messages is not hidden. - -It is the caller's responsibility to ensure the uniqueness of nonces—for -example, by using nonce 1 for the first message, nonce 2 for the second -message, etc. Nonces are long enough that randomly generated nonces have -negligible risk of collision. - -This package is interoperable with NaCl: https://nacl.cr.yp.to/secretbox.html. -*/ -package secretbox // import "golang.org/x/crypto/nacl/secretbox" - -import ( - "golang.org/x/crypto/poly1305" - "golang.org/x/crypto/salsa20/salsa" -) - -// Overhead is the number of bytes of overhead when boxing a message. -const Overhead = poly1305.TagSize - -// setup produces a sub-key and Salsa20 counter given a nonce and key. -func setup(subKey *[32]byte, counter *[16]byte, nonce *[24]byte, key *[32]byte) { - // We use XSalsa20 for encryption so first we need to generate a - // key and nonce with HSalsa20. - var hNonce [16]byte - copy(hNonce[:], nonce[:]) - salsa.HSalsa20(subKey, &hNonce, key, &salsa.Sigma) - - // The final 8 bytes of the original nonce form the new nonce. - copy(counter[:], nonce[16:]) -} - -// sliceForAppend takes a slice and a requested number of bytes. It returns a -// slice with the contents of the given slice followed by that many bytes and a -// second slice that aliases into it and contains only the extra bytes. If the -// original slice has sufficient capacity then no allocation is performed. -func sliceForAppend(in []byte, n int) (head, tail []byte) { - if total := len(in) + n; cap(in) >= total { - head = in[:total] - } else { - head = make([]byte, total) - copy(head, in) - } - tail = head[len(in):] - return -} - -// Seal appends an encrypted and authenticated copy of message to out, which -// must not overlap message. The key and nonce pair must be unique for each -// distinct message and the output will be Overhead bytes longer than message. -func Seal(out, message []byte, nonce *[24]byte, key *[32]byte) []byte { - var subKey [32]byte - var counter [16]byte - setup(&subKey, &counter, nonce, key) - - // The Poly1305 key is generated by encrypting 32 bytes of zeros. Since - // Salsa20 works with 64-byte blocks, we also generate 32 bytes of - // keystream as a side effect. - var firstBlock [64]byte - salsa.XORKeyStream(firstBlock[:], firstBlock[:], &counter, &subKey) - - var poly1305Key [32]byte - copy(poly1305Key[:], firstBlock[:]) - - ret, out := sliceForAppend(out, len(message)+poly1305.TagSize) - - // We XOR up to 32 bytes of message with the keystream generated from - // the first block. - firstMessageBlock := message - if len(firstMessageBlock) > 32 { - firstMessageBlock = firstMessageBlock[:32] - } - - tagOut := out - out = out[poly1305.TagSize:] - for i, x := range firstMessageBlock { - out[i] = firstBlock[32+i] ^ x - } - message = message[len(firstMessageBlock):] - ciphertext := out - out = out[len(firstMessageBlock):] - - // Now encrypt the rest. - counter[8] = 1 - salsa.XORKeyStream(out, message, &counter, &subKey) - - var tag [poly1305.TagSize]byte - poly1305.Sum(&tag, ciphertext, &poly1305Key) - copy(tagOut, tag[:]) - - return ret -} - -// Open authenticates and decrypts a box produced by Seal and appends the -// message to out, which must not overlap box. The output will be Overhead -// bytes smaller than box. -func Open(out []byte, box []byte, nonce *[24]byte, key *[32]byte) ([]byte, bool) { - if len(box) < Overhead { - return nil, false - } - - var subKey [32]byte - var counter [16]byte - setup(&subKey, &counter, nonce, key) - - // The Poly1305 key is generated by encrypting 32 bytes of zeros. Since - // Salsa20 works with 64-byte blocks, we also generate 32 bytes of - // keystream as a side effect. - var firstBlock [64]byte - salsa.XORKeyStream(firstBlock[:], firstBlock[:], &counter, &subKey) - - var poly1305Key [32]byte - copy(poly1305Key[:], firstBlock[:]) - var tag [poly1305.TagSize]byte - copy(tag[:], box) - - if !poly1305.Verify(&tag, box[poly1305.TagSize:], &poly1305Key) { - return nil, false - } - - ret, out := sliceForAppend(out, len(box)-Overhead) - - // We XOR up to 32 bytes of box with the keystream generated from - // the first block. - box = box[Overhead:] - firstMessageBlock := box - if len(firstMessageBlock) > 32 { - firstMessageBlock = firstMessageBlock[:32] - } - for i, x := range firstMessageBlock { - out[i] = firstBlock[32+i] ^ x - } - - box = box[len(firstMessageBlock):] - out = out[len(firstMessageBlock):] - - // Now decrypt the rest. - counter[8] = 1 - salsa.XORKeyStream(out, box, &counter, &subKey) - - return ret, true -} diff --git a/vendor/golang.org/x/crypto/nacl/secretbox/secretbox_test.go b/vendor/golang.org/x/crypto/nacl/secretbox/secretbox_test.go deleted file mode 100644 index 664dc1521..000000000 --- a/vendor/golang.org/x/crypto/nacl/secretbox/secretbox_test.go +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package secretbox - -import ( - "bytes" - "crypto/rand" - "encoding/hex" - "testing" -) - -func TestSealOpen(t *testing.T) { - var key [32]byte - var nonce [24]byte - - rand.Reader.Read(key[:]) - rand.Reader.Read(nonce[:]) - - var box, opened []byte - - for msgLen := 0; msgLen < 128; msgLen += 17 { - message := make([]byte, msgLen) - rand.Reader.Read(message) - - box = Seal(box[:0], message, &nonce, &key) - var ok bool - opened, ok = Open(opened[:0], box, &nonce, &key) - if !ok { - t.Errorf("%d: failed to open box", msgLen) - continue - } - - if !bytes.Equal(opened, message) { - t.Errorf("%d: got %x, expected %x", msgLen, opened, message) - continue - } - } - - for i := range box { - box[i] ^= 0x20 - _, ok := Open(opened[:0], box, &nonce, &key) - if ok { - t.Errorf("box was opened after corrupting byte %d", i) - } - box[i] ^= 0x20 - } -} - -func TestSecretBox(t *testing.T) { - var key [32]byte - var nonce [24]byte - var message [64]byte - - for i := range key[:] { - key[i] = 1 - } - for i := range nonce[:] { - nonce[i] = 2 - } - for i := range message[:] { - message[i] = 3 - } - - box := Seal(nil, message[:], &nonce, &key) - // expected was generated using the C implementation of NaCl. - expected, _ := hex.DecodeString("8442bc313f4626f1359e3b50122b6ce6fe66ddfe7d39d14e637eb4fd5b45beadab55198df6ab5368439792a23c87db70acb6156dc5ef957ac04f6276cf6093b84be77ff0849cc33e34b7254d5a8f65ad") - - if !bytes.Equal(box, expected) { - t.Fatalf("box didn't match, got\n%x\n, expected\n%x", box, expected) - } -} - -func TestAppend(t *testing.T) { - var key [32]byte - var nonce [24]byte - var message [8]byte - - out := make([]byte, 4) - box := Seal(out, message[:], &nonce, &key) - if !bytes.Equal(box[:4], out[:4]) { - t.Fatalf("Seal didn't correctly append") - } - - out = make([]byte, 4, 100) - box = Seal(out, message[:], &nonce, &key) - if !bytes.Equal(box[:4], out[:4]) { - t.Fatalf("Seal didn't correctly append with sufficient capacity.") - } -} diff --git a/vendor/golang.org/x/crypto/ocsp/ocsp.go b/vendor/golang.org/x/crypto/ocsp/ocsp.go deleted file mode 100644 index 8ed8796fd..000000000 --- a/vendor/golang.org/x/crypto/ocsp/ocsp.go +++ /dev/null @@ -1,771 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package ocsp parses OCSP responses as specified in RFC 2560. OCSP responses -// are signed messages attesting to the validity of a certificate for a small -// period of time. This is used to manage revocation for X.509 certificates. -package ocsp // import "golang.org/x/crypto/ocsp" - -import ( - "crypto" - "crypto/ecdsa" - "crypto/elliptic" - "crypto/rand" - "crypto/rsa" - _ "crypto/sha1" - _ "crypto/sha256" - _ "crypto/sha512" - "crypto/x509" - "crypto/x509/pkix" - "encoding/asn1" - "errors" - "fmt" - "math/big" - "strconv" - "time" -) - -var idPKIXOCSPBasic = asn1.ObjectIdentifier([]int{1, 3, 6, 1, 5, 5, 7, 48, 1, 1}) - -// ResponseStatus contains the result of an OCSP request. See -// https://tools.ietf.org/html/rfc6960#section-2.3 -type ResponseStatus int - -const ( - Success ResponseStatus = 0 - Malformed ResponseStatus = 1 - InternalError ResponseStatus = 2 - TryLater ResponseStatus = 3 - // Status code four is unused in OCSP. See - // https://tools.ietf.org/html/rfc6960#section-4.2.1 - SignatureRequired ResponseStatus = 5 - Unauthorized ResponseStatus = 6 -) - -func (r ResponseStatus) String() string { - switch r { - case Success: - return "success" - case Malformed: - return "malformed" - case InternalError: - return "internal error" - case TryLater: - return "try later" - case SignatureRequired: - return "signature required" - case Unauthorized: - return "unauthorized" - default: - return "unknown OCSP status: " + strconv.Itoa(int(r)) - } -} - -// ResponseError is an error that may be returned by ParseResponse to indicate -// that the response itself is an error, not just that its indicating that a -// certificate is revoked, unknown, etc. -type ResponseError struct { - Status ResponseStatus -} - -func (r ResponseError) Error() string { - return "ocsp: error from server: " + r.Status.String() -} - -// These are internal structures that reflect the ASN.1 structure of an OCSP -// response. See RFC 2560, section 4.2. - -type certID struct { - HashAlgorithm pkix.AlgorithmIdentifier - NameHash []byte - IssuerKeyHash []byte - SerialNumber *big.Int -} - -// https://tools.ietf.org/html/rfc2560#section-4.1.1 -type ocspRequest struct { - TBSRequest tbsRequest -} - -type tbsRequest struct { - Version int `asn1:"explicit,tag:0,default:0,optional"` - RequestorName pkix.RDNSequence `asn1:"explicit,tag:1,optional"` - RequestList []request -} - -type request struct { - Cert certID -} - -type responseASN1 struct { - Status asn1.Enumerated - Response responseBytes `asn1:"explicit,tag:0,optional"` -} - -type responseBytes struct { - ResponseType asn1.ObjectIdentifier - Response []byte -} - -type basicResponse struct { - TBSResponseData responseData - SignatureAlgorithm pkix.AlgorithmIdentifier - Signature asn1.BitString - Certificates []asn1.RawValue `asn1:"explicit,tag:0,optional"` -} - -type responseData struct { - Raw asn1.RawContent - Version int `asn1:"optional,default:0,explicit,tag:0"` - RawResponderID asn1.RawValue - ProducedAt time.Time `asn1:"generalized"` - Responses []singleResponse -} - -type singleResponse struct { - CertID certID - Good asn1.Flag `asn1:"tag:0,optional"` - Revoked revokedInfo `asn1:"tag:1,optional"` - Unknown asn1.Flag `asn1:"tag:2,optional"` - ThisUpdate time.Time `asn1:"generalized"` - NextUpdate time.Time `asn1:"generalized,explicit,tag:0,optional"` - SingleExtensions []pkix.Extension `asn1:"explicit,tag:1,optional"` -} - -type revokedInfo struct { - RevocationTime time.Time `asn1:"generalized"` - Reason asn1.Enumerated `asn1:"explicit,tag:0,optional"` -} - -var ( - oidSignatureMD2WithRSA = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 1, 2} - oidSignatureMD5WithRSA = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 1, 4} - oidSignatureSHA1WithRSA = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 1, 5} - oidSignatureSHA256WithRSA = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 1, 11} - oidSignatureSHA384WithRSA = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 1, 12} - oidSignatureSHA512WithRSA = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 1, 13} - oidSignatureDSAWithSHA1 = asn1.ObjectIdentifier{1, 2, 840, 10040, 4, 3} - oidSignatureDSAWithSHA256 = asn1.ObjectIdentifier{2, 16, 840, 1, 101, 3, 4, 3, 2} - oidSignatureECDSAWithSHA1 = asn1.ObjectIdentifier{1, 2, 840, 10045, 4, 1} - oidSignatureECDSAWithSHA256 = asn1.ObjectIdentifier{1, 2, 840, 10045, 4, 3, 2} - oidSignatureECDSAWithSHA384 = asn1.ObjectIdentifier{1, 2, 840, 10045, 4, 3, 3} - oidSignatureECDSAWithSHA512 = asn1.ObjectIdentifier{1, 2, 840, 10045, 4, 3, 4} -) - -var hashOIDs = map[crypto.Hash]asn1.ObjectIdentifier{ - crypto.SHA1: asn1.ObjectIdentifier([]int{1, 3, 14, 3, 2, 26}), - crypto.SHA256: asn1.ObjectIdentifier([]int{2, 16, 840, 1, 101, 3, 4, 2, 1}), - crypto.SHA384: asn1.ObjectIdentifier([]int{2, 16, 840, 1, 101, 3, 4, 2, 2}), - crypto.SHA512: asn1.ObjectIdentifier([]int{2, 16, 840, 1, 101, 3, 4, 2, 3}), -} - -// TODO(rlb): This is also from crypto/x509, so same comment as AGL's below -var signatureAlgorithmDetails = []struct { - algo x509.SignatureAlgorithm - oid asn1.ObjectIdentifier - pubKeyAlgo x509.PublicKeyAlgorithm - hash crypto.Hash -}{ - {x509.MD2WithRSA, oidSignatureMD2WithRSA, x509.RSA, crypto.Hash(0) /* no value for MD2 */}, - {x509.MD5WithRSA, oidSignatureMD5WithRSA, x509.RSA, crypto.MD5}, - {x509.SHA1WithRSA, oidSignatureSHA1WithRSA, x509.RSA, crypto.SHA1}, - {x509.SHA256WithRSA, oidSignatureSHA256WithRSA, x509.RSA, crypto.SHA256}, - {x509.SHA384WithRSA, oidSignatureSHA384WithRSA, x509.RSA, crypto.SHA384}, - {x509.SHA512WithRSA, oidSignatureSHA512WithRSA, x509.RSA, crypto.SHA512}, - {x509.DSAWithSHA1, oidSignatureDSAWithSHA1, x509.DSA, crypto.SHA1}, - {x509.DSAWithSHA256, oidSignatureDSAWithSHA256, x509.DSA, crypto.SHA256}, - {x509.ECDSAWithSHA1, oidSignatureECDSAWithSHA1, x509.ECDSA, crypto.SHA1}, - {x509.ECDSAWithSHA256, oidSignatureECDSAWithSHA256, x509.ECDSA, crypto.SHA256}, - {x509.ECDSAWithSHA384, oidSignatureECDSAWithSHA384, x509.ECDSA, crypto.SHA384}, - {x509.ECDSAWithSHA512, oidSignatureECDSAWithSHA512, x509.ECDSA, crypto.SHA512}, -} - -// TODO(rlb): This is also from crypto/x509, so same comment as AGL's below -func signingParamsForPublicKey(pub interface{}, requestedSigAlgo x509.SignatureAlgorithm) (hashFunc crypto.Hash, sigAlgo pkix.AlgorithmIdentifier, err error) { - var pubType x509.PublicKeyAlgorithm - - switch pub := pub.(type) { - case *rsa.PublicKey: - pubType = x509.RSA - hashFunc = crypto.SHA256 - sigAlgo.Algorithm = oidSignatureSHA256WithRSA - sigAlgo.Parameters = asn1.RawValue{ - Tag: 5, - } - - case *ecdsa.PublicKey: - pubType = x509.ECDSA - - switch pub.Curve { - case elliptic.P224(), elliptic.P256(): - hashFunc = crypto.SHA256 - sigAlgo.Algorithm = oidSignatureECDSAWithSHA256 - case elliptic.P384(): - hashFunc = crypto.SHA384 - sigAlgo.Algorithm = oidSignatureECDSAWithSHA384 - case elliptic.P521(): - hashFunc = crypto.SHA512 - sigAlgo.Algorithm = oidSignatureECDSAWithSHA512 - default: - err = errors.New("x509: unknown elliptic curve") - } - - default: - err = errors.New("x509: only RSA and ECDSA keys supported") - } - - if err != nil { - return - } - - if requestedSigAlgo == 0 { - return - } - - found := false - for _, details := range signatureAlgorithmDetails { - if details.algo == requestedSigAlgo { - if details.pubKeyAlgo != pubType { - err = errors.New("x509: requested SignatureAlgorithm does not match private key type") - return - } - sigAlgo.Algorithm, hashFunc = details.oid, details.hash - if hashFunc == 0 { - err = errors.New("x509: cannot sign with hash function requested") - return - } - found = true - break - } - } - - if !found { - err = errors.New("x509: unknown SignatureAlgorithm") - } - - return -} - -// TODO(agl): this is taken from crypto/x509 and so should probably be exported -// from crypto/x509 or crypto/x509/pkix. -func getSignatureAlgorithmFromOID(oid asn1.ObjectIdentifier) x509.SignatureAlgorithm { - for _, details := range signatureAlgorithmDetails { - if oid.Equal(details.oid) { - return details.algo - } - } - return x509.UnknownSignatureAlgorithm -} - -// TODO(rlb): This is not taken from crypto/x509, but it's of the same general form. -func getHashAlgorithmFromOID(target asn1.ObjectIdentifier) crypto.Hash { - for hash, oid := range hashOIDs { - if oid.Equal(target) { - return hash - } - } - return crypto.Hash(0) -} - -func getOIDFromHashAlgorithm(target crypto.Hash) asn1.ObjectIdentifier { - for hash, oid := range hashOIDs { - if hash == target { - return oid - } - } - return nil -} - -// This is the exposed reflection of the internal OCSP structures. - -// The status values that can be expressed in OCSP. See RFC 6960. -const ( - // Good means that the certificate is valid. - Good = iota - // Revoked means that the certificate has been deliberately revoked. - Revoked - // Unknown means that the OCSP responder doesn't know about the certificate. - Unknown - // ServerFailed is unused and was never used (see - // https://go-review.googlesource.com/#/c/18944). ParseResponse will - // return a ResponseError when an error response is parsed. - ServerFailed -) - -// The enumerated reasons for revoking a certificate. See RFC 5280. -const ( - Unspecified = iota - KeyCompromise = iota - CACompromise = iota - AffiliationChanged = iota - Superseded = iota - CessationOfOperation = iota - CertificateHold = iota - _ = iota - RemoveFromCRL = iota - PrivilegeWithdrawn = iota - AACompromise = iota -) - -// Request represents an OCSP request. See RFC 6960. -type Request struct { - HashAlgorithm crypto.Hash - IssuerNameHash []byte - IssuerKeyHash []byte - SerialNumber *big.Int -} - -// Marshal marshals the OCSP request to ASN.1 DER encoded form. -func (req *Request) Marshal() ([]byte, error) { - hashAlg := getOIDFromHashAlgorithm(req.HashAlgorithm) - if hashAlg == nil { - return nil, errors.New("Unknown hash algorithm") - } - return asn1.Marshal(ocspRequest{ - tbsRequest{ - Version: 0, - RequestList: []request{ - { - Cert: certID{ - pkix.AlgorithmIdentifier{ - Algorithm: hashAlg, - Parameters: asn1.RawValue{Tag: 5 /* ASN.1 NULL */}, - }, - req.IssuerNameHash, - req.IssuerKeyHash, - req.SerialNumber, - }, - }, - }, - }, - }) -} - -// Response represents an OCSP response containing a single SingleResponse. See -// RFC 6960. -type Response struct { - // Status is one of {Good, Revoked, Unknown} - Status int - SerialNumber *big.Int - ProducedAt, ThisUpdate, NextUpdate, RevokedAt time.Time - RevocationReason int - Certificate *x509.Certificate - // TBSResponseData contains the raw bytes of the signed response. If - // Certificate is nil then this can be used to verify Signature. - TBSResponseData []byte - Signature []byte - SignatureAlgorithm x509.SignatureAlgorithm - - // IssuerHash is the hash used to compute the IssuerNameHash and IssuerKeyHash. - // Valid values are crypto.SHA1, crypto.SHA256, crypto.SHA384, and crypto.SHA512. - // If zero, the default is crypto.SHA1. - IssuerHash crypto.Hash - - // RawResponderName optionally contains the DER-encoded subject of the - // responder certificate. Exactly one of RawResponderName and - // ResponderKeyHash is set. - RawResponderName []byte - // ResponderKeyHash optionally contains the SHA-1 hash of the - // responder's public key. Exactly one of RawResponderName and - // ResponderKeyHash is set. - ResponderKeyHash []byte - - // Extensions contains raw X.509 extensions from the singleExtensions field - // of the OCSP response. When parsing certificates, this can be used to - // extract non-critical extensions that are not parsed by this package. When - // marshaling OCSP responses, the Extensions field is ignored, see - // ExtraExtensions. - Extensions []pkix.Extension - - // ExtraExtensions contains extensions to be copied, raw, into any marshaled - // OCSP response (in the singleExtensions field). Values override any - // extensions that would otherwise be produced based on the other fields. The - // ExtraExtensions field is not populated when parsing certificates, see - // Extensions. - ExtraExtensions []pkix.Extension -} - -// These are pre-serialized error responses for the various non-success codes -// defined by OCSP. The Unauthorized code in particular can be used by an OCSP -// responder that supports only pre-signed responses as a response to requests -// for certificates with unknown status. See RFC 5019. -var ( - MalformedRequestErrorResponse = []byte{0x30, 0x03, 0x0A, 0x01, 0x01} - InternalErrorErrorResponse = []byte{0x30, 0x03, 0x0A, 0x01, 0x02} - TryLaterErrorResponse = []byte{0x30, 0x03, 0x0A, 0x01, 0x03} - SigRequredErrorResponse = []byte{0x30, 0x03, 0x0A, 0x01, 0x05} - UnauthorizedErrorResponse = []byte{0x30, 0x03, 0x0A, 0x01, 0x06} -) - -// CheckSignatureFrom checks that the signature in resp is a valid signature -// from issuer. This should only be used if resp.Certificate is nil. Otherwise, -// the OCSP response contained an intermediate certificate that created the -// signature. That signature is checked by ParseResponse and only -// resp.Certificate remains to be validated. -func (resp *Response) CheckSignatureFrom(issuer *x509.Certificate) error { - return issuer.CheckSignature(resp.SignatureAlgorithm, resp.TBSResponseData, resp.Signature) -} - -// ParseError results from an invalid OCSP response. -type ParseError string - -func (p ParseError) Error() string { - return string(p) -} - -// ParseRequest parses an OCSP request in DER form. It only supports -// requests for a single certificate. Signed requests are not supported. -// If a request includes a signature, it will result in a ParseError. -func ParseRequest(bytes []byte) (*Request, error) { - var req ocspRequest - rest, err := asn1.Unmarshal(bytes, &req) - if err != nil { - return nil, err - } - if len(rest) > 0 { - return nil, ParseError("trailing data in OCSP request") - } - - if len(req.TBSRequest.RequestList) == 0 { - return nil, ParseError("OCSP request contains no request body") - } - innerRequest := req.TBSRequest.RequestList[0] - - hashFunc := getHashAlgorithmFromOID(innerRequest.Cert.HashAlgorithm.Algorithm) - if hashFunc == crypto.Hash(0) { - return nil, ParseError("OCSP request uses unknown hash function") - } - - return &Request{ - HashAlgorithm: hashFunc, - IssuerNameHash: innerRequest.Cert.NameHash, - IssuerKeyHash: innerRequest.Cert.IssuerKeyHash, - SerialNumber: innerRequest.Cert.SerialNumber, - }, nil -} - -// ParseResponse parses an OCSP response in DER form. It only supports -// responses for a single certificate. If the response contains a certificate -// then the signature over the response is checked. If issuer is not nil then -// it will be used to validate the signature or embedded certificate. -// -// Invalid signatures or parse failures will result in a ParseError. Error -// responses will result in a ResponseError. -func ParseResponse(bytes []byte, issuer *x509.Certificate) (*Response, error) { - return ParseResponseForCert(bytes, nil, issuer) -} - -// ParseResponseForCert parses an OCSP response in DER form and searches for a -// Response relating to cert. If such a Response is found and the OCSP response -// contains a certificate then the signature over the response is checked. If -// issuer is not nil then it will be used to validate the signature or embedded -// certificate. -// -// Invalid signatures or parse failures will result in a ParseError. Error -// responses will result in a ResponseError. -func ParseResponseForCert(bytes []byte, cert, issuer *x509.Certificate) (*Response, error) { - var resp responseASN1 - rest, err := asn1.Unmarshal(bytes, &resp) - if err != nil { - return nil, err - } - if len(rest) > 0 { - return nil, ParseError("trailing data in OCSP response") - } - - if status := ResponseStatus(resp.Status); status != Success { - return nil, ResponseError{status} - } - - if !resp.Response.ResponseType.Equal(idPKIXOCSPBasic) { - return nil, ParseError("bad OCSP response type") - } - - var basicResp basicResponse - rest, err = asn1.Unmarshal(resp.Response.Response, &basicResp) - if err != nil { - return nil, err - } - - if len(basicResp.Certificates) > 1 { - return nil, ParseError("OCSP response contains bad number of certificates") - } - - if n := len(basicResp.TBSResponseData.Responses); n == 0 || cert == nil && n > 1 { - return nil, ParseError("OCSP response contains bad number of responses") - } - - ret := &Response{ - TBSResponseData: basicResp.TBSResponseData.Raw, - Signature: basicResp.Signature.RightAlign(), - SignatureAlgorithm: getSignatureAlgorithmFromOID(basicResp.SignatureAlgorithm.Algorithm), - } - - // Handle the ResponderID CHOICE tag. ResponderID can be flattened into - // TBSResponseData once https://go-review.googlesource.com/34503 has been - // released. - rawResponderID := basicResp.TBSResponseData.RawResponderID - switch rawResponderID.Tag { - case 1: // Name - var rdn pkix.RDNSequence - if rest, err := asn1.Unmarshal(rawResponderID.Bytes, &rdn); err != nil || len(rest) != 0 { - return nil, ParseError("invalid responder name") - } - ret.RawResponderName = rawResponderID.Bytes - case 2: // KeyHash - if rest, err := asn1.Unmarshal(rawResponderID.Bytes, &ret.ResponderKeyHash); err != nil || len(rest) != 0 { - return nil, ParseError("invalid responder key hash") - } - default: - return nil, ParseError("invalid responder id tag") - } - - if len(basicResp.Certificates) > 0 { - ret.Certificate, err = x509.ParseCertificate(basicResp.Certificates[0].FullBytes) - if err != nil { - return nil, err - } - - if err := ret.CheckSignatureFrom(ret.Certificate); err != nil { - return nil, ParseError("bad signature on embedded certificate: " + err.Error()) - } - - if issuer != nil { - if err := issuer.CheckSignature(ret.Certificate.SignatureAlgorithm, ret.Certificate.RawTBSCertificate, ret.Certificate.Signature); err != nil { - return nil, ParseError("bad OCSP signature: " + err.Error()) - } - } - } else if issuer != nil { - if err := ret.CheckSignatureFrom(issuer); err != nil { - return nil, ParseError("bad OCSP signature: " + err.Error()) - } - } - - var r singleResponse - for _, resp := range basicResp.TBSResponseData.Responses { - if cert == nil || cert.SerialNumber.Cmp(resp.CertID.SerialNumber) == 0 { - r = resp - break - } - } - - for _, ext := range r.SingleExtensions { - if ext.Critical { - return nil, ParseError("unsupported critical extension") - } - } - ret.Extensions = r.SingleExtensions - - ret.SerialNumber = r.CertID.SerialNumber - - for h, oid := range hashOIDs { - if r.CertID.HashAlgorithm.Algorithm.Equal(oid) { - ret.IssuerHash = h - break - } - } - if ret.IssuerHash == 0 { - return nil, ParseError("unsupported issuer hash algorithm") - } - - switch { - case bool(r.Good): - ret.Status = Good - case bool(r.Unknown): - ret.Status = Unknown - default: - ret.Status = Revoked - ret.RevokedAt = r.Revoked.RevocationTime - ret.RevocationReason = int(r.Revoked.Reason) - } - - ret.ProducedAt = basicResp.TBSResponseData.ProducedAt - ret.ThisUpdate = r.ThisUpdate - ret.NextUpdate = r.NextUpdate - - return ret, nil -} - -// RequestOptions contains options for constructing OCSP requests. -type RequestOptions struct { - // Hash contains the hash function that should be used when - // constructing the OCSP request. If zero, SHA-1 will be used. - Hash crypto.Hash -} - -func (opts *RequestOptions) hash() crypto.Hash { - if opts == nil || opts.Hash == 0 { - // SHA-1 is nearly universally used in OCSP. - return crypto.SHA1 - } - return opts.Hash -} - -// CreateRequest returns a DER-encoded, OCSP request for the status of cert. If -// opts is nil then sensible defaults are used. -func CreateRequest(cert, issuer *x509.Certificate, opts *RequestOptions) ([]byte, error) { - hashFunc := opts.hash() - - // OCSP seems to be the only place where these raw hash identifiers are - // used. I took the following from - // http://msdn.microsoft.com/en-us/library/ff635603.aspx - _, ok := hashOIDs[hashFunc] - if !ok { - return nil, x509.ErrUnsupportedAlgorithm - } - - if !hashFunc.Available() { - return nil, x509.ErrUnsupportedAlgorithm - } - h := opts.hash().New() - - var publicKeyInfo struct { - Algorithm pkix.AlgorithmIdentifier - PublicKey asn1.BitString - } - if _, err := asn1.Unmarshal(issuer.RawSubjectPublicKeyInfo, &publicKeyInfo); err != nil { - return nil, err - } - - h.Write(publicKeyInfo.PublicKey.RightAlign()) - issuerKeyHash := h.Sum(nil) - - h.Reset() - h.Write(issuer.RawSubject) - issuerNameHash := h.Sum(nil) - - req := &Request{ - HashAlgorithm: hashFunc, - IssuerNameHash: issuerNameHash, - IssuerKeyHash: issuerKeyHash, - SerialNumber: cert.SerialNumber, - } - return req.Marshal() -} - -// CreateResponse returns a DER-encoded OCSP response with the specified contents. -// The fields in the response are populated as follows: -// -// The responder cert is used to populate the responder's name field, and the -// certificate itself is provided alongside the OCSP response signature. -// -// The issuer cert is used to puplate the IssuerNameHash and IssuerKeyHash fields. -// -// The template is used to populate the SerialNumber, RevocationStatus, RevokedAt, -// RevocationReason, ThisUpdate, and NextUpdate fields. -// -// If template.IssuerHash is not set, SHA1 will be used. -// -// The ProducedAt date is automatically set to the current date, to the nearest minute. -func CreateResponse(issuer, responderCert *x509.Certificate, template Response, priv crypto.Signer) ([]byte, error) { - var publicKeyInfo struct { - Algorithm pkix.AlgorithmIdentifier - PublicKey asn1.BitString - } - if _, err := asn1.Unmarshal(issuer.RawSubjectPublicKeyInfo, &publicKeyInfo); err != nil { - return nil, err - } - - if template.IssuerHash == 0 { - template.IssuerHash = crypto.SHA1 - } - hashOID := getOIDFromHashAlgorithm(template.IssuerHash) - if hashOID == nil { - return nil, errors.New("unsupported issuer hash algorithm") - } - - if !template.IssuerHash.Available() { - return nil, fmt.Errorf("issuer hash algorithm %v not linked into binary", template.IssuerHash) - } - h := template.IssuerHash.New() - h.Write(publicKeyInfo.PublicKey.RightAlign()) - issuerKeyHash := h.Sum(nil) - - h.Reset() - h.Write(issuer.RawSubject) - issuerNameHash := h.Sum(nil) - - innerResponse := singleResponse{ - CertID: certID{ - HashAlgorithm: pkix.AlgorithmIdentifier{ - Algorithm: hashOID, - Parameters: asn1.RawValue{Tag: 5 /* ASN.1 NULL */}, - }, - NameHash: issuerNameHash, - IssuerKeyHash: issuerKeyHash, - SerialNumber: template.SerialNumber, - }, - ThisUpdate: template.ThisUpdate.UTC(), - NextUpdate: template.NextUpdate.UTC(), - SingleExtensions: template.ExtraExtensions, - } - - switch template.Status { - case Good: - innerResponse.Good = true - case Unknown: - innerResponse.Unknown = true - case Revoked: - innerResponse.Revoked = revokedInfo{ - RevocationTime: template.RevokedAt.UTC(), - Reason: asn1.Enumerated(template.RevocationReason), - } - } - - rawResponderID := asn1.RawValue{ - Class: 2, // context-specific - Tag: 1, // Name (explicit tag) - IsCompound: true, - Bytes: responderCert.RawSubject, - } - tbsResponseData := responseData{ - Version: 0, - RawResponderID: rawResponderID, - ProducedAt: time.Now().Truncate(time.Minute).UTC(), - Responses: []singleResponse{innerResponse}, - } - - tbsResponseDataDER, err := asn1.Marshal(tbsResponseData) - if err != nil { - return nil, err - } - - hashFunc, signatureAlgorithm, err := signingParamsForPublicKey(priv.Public(), template.SignatureAlgorithm) - if err != nil { - return nil, err - } - - responseHash := hashFunc.New() - responseHash.Write(tbsResponseDataDER) - signature, err := priv.Sign(rand.Reader, responseHash.Sum(nil), hashFunc) - if err != nil { - return nil, err - } - - response := basicResponse{ - TBSResponseData: tbsResponseData, - SignatureAlgorithm: signatureAlgorithm, - Signature: asn1.BitString{ - Bytes: signature, - BitLength: 8 * len(signature), - }, - } - if template.Certificate != nil { - response.Certificates = []asn1.RawValue{ - asn1.RawValue{FullBytes: template.Certificate.Raw}, - } - } - responseDER, err := asn1.Marshal(response) - if err != nil { - return nil, err - } - - return asn1.Marshal(responseASN1{ - Status: asn1.Enumerated(Success), - Response: responseBytes{ - ResponseType: idPKIXOCSPBasic, - Response: responseDER, - }, - }) -} diff --git a/vendor/golang.org/x/crypto/ocsp/ocsp_test.go b/vendor/golang.org/x/crypto/ocsp/ocsp_test.go deleted file mode 100644 index d325d851e..000000000 --- a/vendor/golang.org/x/crypto/ocsp/ocsp_test.go +++ /dev/null @@ -1,860 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build go1.7 - -package ocsp - -import ( - "bytes" - "crypto" - "crypto/sha1" - "crypto/x509" - "crypto/x509/pkix" - "encoding/asn1" - "encoding/hex" - "math/big" - "reflect" - "testing" - "time" -) - -func TestOCSPDecode(t *testing.T) { - responseBytes, _ := hex.DecodeString(ocspResponseHex) - resp, err := ParseResponse(responseBytes, nil) - if err != nil { - t.Fatal(err) - } - - responderCert, _ := hex.DecodeString(startComResponderCertHex) - responder, err := x509.ParseCertificate(responderCert) - if err != nil { - t.Fatal(err) - } - - expected := Response{ - Status: Good, - SerialNumber: big.NewInt(0x1d0fa), - RevocationReason: Unspecified, - ThisUpdate: time.Date(2010, 7, 7, 15, 1, 5, 0, time.UTC), - NextUpdate: time.Date(2010, 7, 7, 18, 35, 17, 0, time.UTC), - RawResponderName: responder.RawSubject, - } - - if !reflect.DeepEqual(resp.ThisUpdate, expected.ThisUpdate) { - t.Errorf("resp.ThisUpdate: got %d, want %d", resp.ThisUpdate, expected.ThisUpdate) - } - - if !reflect.DeepEqual(resp.NextUpdate, expected.NextUpdate) { - t.Errorf("resp.NextUpdate: got %d, want %d", resp.NextUpdate, expected.NextUpdate) - } - - if resp.Status != expected.Status { - t.Errorf("resp.Status: got %d, want %d", resp.Status, expected.Status) - } - - if resp.SerialNumber.Cmp(expected.SerialNumber) != 0 { - t.Errorf("resp.SerialNumber: got %x, want %x", resp.SerialNumber, expected.SerialNumber) - } - - if resp.RevocationReason != expected.RevocationReason { - t.Errorf("resp.RevocationReason: got %d, want %d", resp.RevocationReason, expected.RevocationReason) - } - - if !bytes.Equal(resp.RawResponderName, expected.RawResponderName) { - t.Errorf("resp.RawResponderName: got %x, want %x", resp.RawResponderName, expected.RawResponderName) - } - - if !bytes.Equal(resp.ResponderKeyHash, expected.ResponderKeyHash) { - t.Errorf("resp.ResponderKeyHash: got %x, want %x", resp.ResponderKeyHash, expected.ResponderKeyHash) - } -} - -func TestOCSPDecodeWithoutCert(t *testing.T) { - responseBytes, _ := hex.DecodeString(ocspResponseWithoutCertHex) - _, err := ParseResponse(responseBytes, nil) - if err != nil { - t.Error(err) - } -} - -func TestOCSPDecodeWithExtensions(t *testing.T) { - responseBytes, _ := hex.DecodeString(ocspResponseWithCriticalExtensionHex) - _, err := ParseResponse(responseBytes, nil) - if err == nil { - t.Error(err) - } - - responseBytes, _ = hex.DecodeString(ocspResponseWithExtensionHex) - response, err := ParseResponse(responseBytes, nil) - if err != nil { - t.Fatal(err) - } - - if len(response.Extensions) != 1 { - t.Errorf("len(response.Extensions): got %v, want %v", len(response.Extensions), 1) - } - - extensionBytes := response.Extensions[0].Value - expectedBytes, _ := hex.DecodeString(ocspExtensionValueHex) - if !bytes.Equal(extensionBytes, expectedBytes) { - t.Errorf("response.Extensions[0]: got %x, want %x", extensionBytes, expectedBytes) - } -} - -func TestOCSPSignature(t *testing.T) { - issuerCert, _ := hex.DecodeString(startComHex) - issuer, err := x509.ParseCertificate(issuerCert) - if err != nil { - t.Fatal(err) - } - - response, _ := hex.DecodeString(ocspResponseHex) - if _, err := ParseResponse(response, issuer); err != nil { - t.Error(err) - } -} - -func TestOCSPRequest(t *testing.T) { - leafCert, _ := hex.DecodeString(leafCertHex) - cert, err := x509.ParseCertificate(leafCert) - if err != nil { - t.Fatal(err) - } - - issuerCert, _ := hex.DecodeString(issuerCertHex) - issuer, err := x509.ParseCertificate(issuerCert) - if err != nil { - t.Fatal(err) - } - - request, err := CreateRequest(cert, issuer, nil) - if err != nil { - t.Fatal(err) - } - - expectedBytes, _ := hex.DecodeString(ocspRequestHex) - if !bytes.Equal(request, expectedBytes) { - t.Errorf("request: got %x, wanted %x", request, expectedBytes) - } - - decodedRequest, err := ParseRequest(expectedBytes) - if err != nil { - t.Fatal(err) - } - - if decodedRequest.HashAlgorithm != crypto.SHA1 { - t.Errorf("request.HashAlgorithm: got %v, want %v", decodedRequest.HashAlgorithm, crypto.SHA1) - } - - var publicKeyInfo struct { - Algorithm pkix.AlgorithmIdentifier - PublicKey asn1.BitString - } - _, err = asn1.Unmarshal(issuer.RawSubjectPublicKeyInfo, &publicKeyInfo) - if err != nil { - t.Fatal(err) - } - - h := sha1.New() - h.Write(publicKeyInfo.PublicKey.RightAlign()) - issuerKeyHash := h.Sum(nil) - - h.Reset() - h.Write(issuer.RawSubject) - issuerNameHash := h.Sum(nil) - - if got := decodedRequest.IssuerKeyHash; !bytes.Equal(got, issuerKeyHash) { - t.Errorf("request.IssuerKeyHash: got %x, want %x", got, issuerKeyHash) - } - - if got := decodedRequest.IssuerNameHash; !bytes.Equal(got, issuerNameHash) { - t.Errorf("request.IssuerKeyHash: got %x, want %x", got, issuerNameHash) - } - - if got := decodedRequest.SerialNumber; got.Cmp(cert.SerialNumber) != 0 { - t.Errorf("request.SerialNumber: got %x, want %x", got, cert.SerialNumber) - } - - marshaledRequest, err := decodedRequest.Marshal() - if err != nil { - t.Fatal(err) - } - - if bytes.Compare(expectedBytes, marshaledRequest) != 0 { - t.Errorf( - "Marshaled request doesn't match expected: wanted %x, got %x", - expectedBytes, - marshaledRequest, - ) - } -} - -func TestOCSPResponse(t *testing.T) { - leafCert, _ := hex.DecodeString(leafCertHex) - leaf, err := x509.ParseCertificate(leafCert) - if err != nil { - t.Fatal(err) - } - - issuerCert, _ := hex.DecodeString(issuerCertHex) - issuer, err := x509.ParseCertificate(issuerCert) - if err != nil { - t.Fatal(err) - } - - responderCert, _ := hex.DecodeString(responderCertHex) - responder, err := x509.ParseCertificate(responderCert) - if err != nil { - t.Fatal(err) - } - - responderPrivateKeyDER, _ := hex.DecodeString(responderPrivateKeyHex) - responderPrivateKey, err := x509.ParsePKCS1PrivateKey(responderPrivateKeyDER) - if err != nil { - t.Fatal(err) - } - - extensionBytes, _ := hex.DecodeString(ocspExtensionValueHex) - extensions := []pkix.Extension{ - pkix.Extension{ - Id: ocspExtensionOID, - Critical: false, - Value: extensionBytes, - }, - } - - thisUpdate := time.Date(2010, 7, 7, 15, 1, 5, 0, time.UTC) - nextUpdate := time.Date(2010, 7, 7, 18, 35, 17, 0, time.UTC) - template := Response{ - Status: Revoked, - SerialNumber: leaf.SerialNumber, - ThisUpdate: thisUpdate, - NextUpdate: nextUpdate, - RevokedAt: thisUpdate, - RevocationReason: KeyCompromise, - Certificate: responder, - ExtraExtensions: extensions, - } - - template.IssuerHash = crypto.MD5 - _, err = CreateResponse(issuer, responder, template, responderPrivateKey) - if err == nil { - t.Fatal("CreateResponse didn't fail with non-valid template.IssuerHash value crypto.MD5") - } - - testCases := []struct { - name string - issuerHash crypto.Hash - }{ - {"Zero value", 0}, - {"crypto.SHA1", crypto.SHA1}, - {"crypto.SHA256", crypto.SHA256}, - {"crypto.SHA384", crypto.SHA384}, - {"crypto.SHA512", crypto.SHA512}, - } - for _, tc := range testCases { - t.Run(tc.name, func(t *testing.T) { - template.IssuerHash = tc.issuerHash - responseBytes, err := CreateResponse(issuer, responder, template, responderPrivateKey) - if err != nil { - t.Fatalf("CreateResponse failed: %s", err) - } - - resp, err := ParseResponse(responseBytes, nil) - if err != nil { - t.Fatalf("ParseResponse failed: %s", err) - } - - if !reflect.DeepEqual(resp.ThisUpdate, template.ThisUpdate) { - t.Errorf("resp.ThisUpdate: got %d, want %d", resp.ThisUpdate, template.ThisUpdate) - } - - if !reflect.DeepEqual(resp.NextUpdate, template.NextUpdate) { - t.Errorf("resp.NextUpdate: got %d, want %d", resp.NextUpdate, template.NextUpdate) - } - - if !reflect.DeepEqual(resp.RevokedAt, template.RevokedAt) { - t.Errorf("resp.RevokedAt: got %d, want %d", resp.RevokedAt, template.RevokedAt) - } - - if !reflect.DeepEqual(resp.Extensions, template.ExtraExtensions) { - t.Errorf("resp.Extensions: got %v, want %v", resp.Extensions, template.ExtraExtensions) - } - - delay := time.Since(resp.ProducedAt) - if delay < -time.Hour || delay > time.Hour { - t.Errorf("resp.ProducedAt: got %s, want close to current time (%s)", resp.ProducedAt, time.Now()) - } - - if resp.Status != template.Status { - t.Errorf("resp.Status: got %d, want %d", resp.Status, template.Status) - } - - if resp.SerialNumber.Cmp(template.SerialNumber) != 0 { - t.Errorf("resp.SerialNumber: got %x, want %x", resp.SerialNumber, template.SerialNumber) - } - - if resp.RevocationReason != template.RevocationReason { - t.Errorf("resp.RevocationReason: got %d, want %d", resp.RevocationReason, template.RevocationReason) - } - - expectedHash := tc.issuerHash - if tc.issuerHash == 0 { - expectedHash = crypto.SHA1 - } - - if resp.IssuerHash != expectedHash { - t.Errorf("resp.IssuerHash: got %d, want %d", resp.IssuerHash, expectedHash) - } - }) - } -} - -func TestErrorResponse(t *testing.T) { - responseBytes, _ := hex.DecodeString(errorResponseHex) - _, err := ParseResponse(responseBytes, nil) - - respErr, ok := err.(ResponseError) - if !ok { - t.Fatalf("expected ResponseError from ParseResponse but got %#v", err) - } - if respErr.Status != Malformed { - t.Fatalf("expected Malformed status from ParseResponse but got %d", respErr.Status) - } -} - -func TestOCSPDecodeMultiResponse(t *testing.T) { - inclCert, _ := hex.DecodeString(ocspMultiResponseCertHex) - cert, err := x509.ParseCertificate(inclCert) - if err != nil { - t.Fatal(err) - } - - responseBytes, _ := hex.DecodeString(ocspMultiResponseHex) - resp, err := ParseResponseForCert(responseBytes, cert, nil) - if err != nil { - t.Fatal(err) - } - - if resp.SerialNumber.Cmp(cert.SerialNumber) != 0 { - t.Errorf("resp.SerialNumber: got %x, want %x", resp.SerialNumber, cert.SerialNumber) - } -} - -// This OCSP response was taken from Thawte's public OCSP responder. -// To recreate: -// $ openssl s_client -tls1 -showcerts -servername www.google.com -connect www.google.com:443 -// Copy and paste the first certificate into /tmp/cert.crt and the second into -// /tmp/intermediate.crt -// $ openssl ocsp -issuer /tmp/intermediate.crt -cert /tmp/cert.crt -url http://ocsp.thawte.com -resp_text -respout /tmp/ocsp.der -// Then hex encode the result: -// $ python -c 'print file("/tmp/ocsp.der", "r").read().encode("hex")' - -const ocspResponseHex = "308206bc0a0100a08206b5308206b106092b0601050507300101048206a23082069e3081" + - "c9a14e304c310b300906035504061302494c31163014060355040a130d5374617274436f" + - "6d204c74642e312530230603550403131c5374617274436f6d20436c6173732031204f43" + - "5350205369676e6572180f32303130303730373137333531375a30663064303c30090605" + - "2b0e03021a050004146568874f40750f016a3475625e1f5c93e5a26d580414eb4234d098" + - "b0ab9ff41b6b08f7cc642eef0e2c45020301d0fa8000180f323031303037303731353031" + - "30355aa011180f32303130303730373138333531375a300d06092a864886f70d01010505" + - "000382010100ab557ff070d1d7cebbb5f0ec91a15c3fed22eb2e1b8244f1b84545f013a4" + - "fb46214c5e3fbfbebb8a56acc2b9db19f68fd3c3201046b3824d5ba689f99864328710cb" + - "467195eb37d84f539e49f859316b32964dc3e47e36814ce94d6c56dd02733b1d0802f7ff" + - "4eebdbbd2927dcf580f16cbc290f91e81b53cb365e7223f1d6e20a88ea064104875e0145" + - "672b20fc14829d51ca122f5f5d77d3ad6c83889c55c7dc43680ba2fe3cef8b05dbcabdc0" + - "d3e09aaf9725597f8c858c2fa38c0d6aed2e6318194420dd1a1137445d13e1c97ab47896" + - "17a4e08925f46f867b72e3a4dc1f08cb870b2b0717f7207faa0ac512e628a029aba7457a" + - "e63dcf3281e2162d9349a08204ba308204b6308204b23082039aa003020102020101300d" + - "06092a864886f70d010105050030818c310b300906035504061302494c31163014060355" + - "040a130d5374617274436f6d204c74642e312b3029060355040b13225365637572652044" + - "69676974616c204365727469666963617465205369676e696e6731383036060355040313" + - "2f5374617274436f6d20436c6173732031205072696d61727920496e7465726d65646961" + - "746520536572766572204341301e170d3037313032353030323330365a170d3132313032" + - "333030323330365a304c310b300906035504061302494c31163014060355040a130d5374" + - "617274436f6d204c74642e312530230603550403131c5374617274436f6d20436c617373" + - "2031204f435350205369676e657230820122300d06092a864886f70d0101010500038201" + - "0f003082010a0282010100b9561b4c45318717178084e96e178df2255e18ed8d8ecc7c2b" + - "7b51a6c1c2e6bf0aa3603066f132fe10ae97b50e99fa24b83fc53dd2777496387d14e1c3" + - "a9b6a4933e2ac12413d085570a95b8147414a0bc007c7bcf222446ef7f1a156d7ea1c577" + - "fc5f0facdfd42eb0f5974990cb2f5cefebceef4d1bdc7ae5c1075c5a99a93171f2b0845b" + - "4ff0864e973fcfe32f9d7511ff87a3e943410c90a4493a306b6944359340a9ca96f02b66" + - "ce67f028df2980a6aaee8d5d5d452b8b0eb93f923cc1e23fcccbdbe7ffcb114d08fa7a6a" + - "3c404f825d1a0e715935cf623a8c7b59670014ed0622f6089a9447a7a19010f7fe58f841" + - "29a2765ea367824d1c3bb2fda308530203010001a382015c30820158300c0603551d1301" + - "01ff04023000300b0603551d0f0404030203a8301e0603551d250417301506082b060105" + - "0507030906092b0601050507300105301d0603551d0e0416041445e0a36695414c5dd449" + - "bc00e33cdcdbd2343e173081a80603551d230481a030819d8014eb4234d098b0ab9ff41b" + - "6b08f7cc642eef0e2c45a18181a47f307d310b300906035504061302494c311630140603" + - "55040a130d5374617274436f6d204c74642e312b3029060355040b132253656375726520" + - "4469676974616c204365727469666963617465205369676e696e67312930270603550403" + - "13205374617274436f6d2043657274696669636174696f6e20417574686f726974798201" + - "0a30230603551d12041c301a8618687474703a2f2f7777772e737461727473736c2e636f" + - "6d2f302c06096086480186f842010d041f161d5374617274436f6d205265766f63617469" + - "6f6e20417574686f72697479300d06092a864886f70d01010505000382010100182d2215" + - "8f0fc0291324fa8574c49bb8ff2835085adcbf7b7fc4191c397ab6951328253fffe1e5ec" + - "2a7da0d50fca1a404e6968481366939e666c0a6209073eca57973e2fefa9ed1718e8176f" + - "1d85527ff522c08db702e3b2b180f1cbff05d98128252cf0f450f7dd2772f4188047f19d" + - "c85317366f94bc52d60f453a550af58e308aaab00ced33040b62bf37f5b1ab2a4f7f0f80" + - "f763bf4d707bc8841d7ad9385ee2a4244469260b6f2bf085977af9074796048ecc2f9d48" + - "a1d24ce16e41a9941568fec5b42771e118f16c106a54ccc339a4b02166445a167902e75e" + - "6d8620b0825dcd18a069b90fd851d10fa8effd409deec02860d26d8d833f304b10669b42" - -const startComResponderCertHex = "308204b23082039aa003020102020101300d06092a864886f70d010105050030818c310b" + - "300906035504061302494c31163014060355040a130d5374617274436f6d204c74642e31" + - "2b3029060355040b1322536563757265204469676974616c204365727469666963617465" + - "205369676e696e67313830360603550403132f5374617274436f6d20436c617373203120" + - "5072696d61727920496e7465726d65646961746520536572766572204341301e170d3037" + - "313032353030323330365a170d3132313032333030323330365a304c310b300906035504" + - "061302494c31163014060355040a130d5374617274436f6d204c74642e31253023060355" + - "0403131c5374617274436f6d20436c6173732031204f435350205369676e657230820122" + - "300d06092a864886f70d01010105000382010f003082010a0282010100b9561b4c453187" + - "17178084e96e178df2255e18ed8d8ecc7c2b7b51a6c1c2e6bf0aa3603066f132fe10ae97" + - "b50e99fa24b83fc53dd2777496387d14e1c3a9b6a4933e2ac12413d085570a95b8147414" + - "a0bc007c7bcf222446ef7f1a156d7ea1c577fc5f0facdfd42eb0f5974990cb2f5cefebce" + - "ef4d1bdc7ae5c1075c5a99a93171f2b0845b4ff0864e973fcfe32f9d7511ff87a3e94341" + - "0c90a4493a306b6944359340a9ca96f02b66ce67f028df2980a6aaee8d5d5d452b8b0eb9" + - "3f923cc1e23fcccbdbe7ffcb114d08fa7a6a3c404f825d1a0e715935cf623a8c7b596700" + - "14ed0622f6089a9447a7a19010f7fe58f84129a2765ea367824d1c3bb2fda30853020301" + - "0001a382015c30820158300c0603551d130101ff04023000300b0603551d0f0404030203" + - "a8301e0603551d250417301506082b0601050507030906092b0601050507300105301d06" + - "03551d0e0416041445e0a36695414c5dd449bc00e33cdcdbd2343e173081a80603551d23" + - "0481a030819d8014eb4234d098b0ab9ff41b6b08f7cc642eef0e2c45a18181a47f307d31" + - "0b300906035504061302494c31163014060355040a130d5374617274436f6d204c74642e" + - "312b3029060355040b1322536563757265204469676974616c2043657274696669636174" + - "65205369676e696e6731293027060355040313205374617274436f6d2043657274696669" + - "636174696f6e20417574686f7269747982010a30230603551d12041c301a861868747470" + - "3a2f2f7777772e737461727473736c2e636f6d2f302c06096086480186f842010d041f16" + - "1d5374617274436f6d205265766f636174696f6e20417574686f72697479300d06092a86" + - "4886f70d01010505000382010100182d22158f0fc0291324fa8574c49bb8ff2835085adc" + - "bf7b7fc4191c397ab6951328253fffe1e5ec2a7da0d50fca1a404e6968481366939e666c" + - "0a6209073eca57973e2fefa9ed1718e8176f1d85527ff522c08db702e3b2b180f1cbff05" + - "d98128252cf0f450f7dd2772f4188047f19dc85317366f94bc52d60f453a550af58e308a" + - "aab00ced33040b62bf37f5b1ab2a4f7f0f80f763bf4d707bc8841d7ad9385ee2a4244469" + - "260b6f2bf085977af9074796048ecc2f9d48a1d24ce16e41a9941568fec5b42771e118f1" + - "6c106a54ccc339a4b02166445a167902e75e6d8620b0825dcd18a069b90fd851d10fa8ef" + - "fd409deec02860d26d8d833f304b10669b42" - -const startComHex = "308206343082041ca003020102020118300d06092a864886f70d0101050500307d310b30" + - "0906035504061302494c31163014060355040a130d5374617274436f6d204c74642e312b" + - "3029060355040b1322536563757265204469676974616c20436572746966696361746520" + - "5369676e696e6731293027060355040313205374617274436f6d20436572746966696361" + - "74696f6e20417574686f72697479301e170d3037313032343230353431375a170d313731" + - "3032343230353431375a30818c310b300906035504061302494c31163014060355040a13" + - "0d5374617274436f6d204c74642e312b3029060355040b13225365637572652044696769" + - "74616c204365727469666963617465205369676e696e67313830360603550403132f5374" + - "617274436f6d20436c6173732031205072696d61727920496e7465726d65646961746520" + - "53657276657220434130820122300d06092a864886f70d01010105000382010f00308201" + - "0a0282010100b689c6acef09527807ac9263d0f44418188480561f91aee187fa3250b4d3" + - "4706f0e6075f700e10f71dc0ce103634855a0f92ac83c6ac58523fba38e8fce7a724e240" + - "a60876c0926e9e2a6d4d3f6e61200adb59ded27d63b33e46fefa215118d7cd30a6ed076e" + - "3b7087b4f9faebee823c056f92f7a4dc0a301e9373fe07cad75f809d225852ae06da8b87" + - "2369b0e42ad8ea83d2bdf371db705a280faf5a387045123f304dcd3baf17e50fcba0a95d" + - "48aab16150cb34cd3c5cc30be810c08c9bf0030362feb26c3e720eee1c432ac9480e5739" + - "c43121c810c12c87fe5495521f523c31129b7fe7c0a0a559d5e28f3ef0d5a8e1d77031a9" + - "c4b3cfaf6d532f06f4a70203010001a38201ad308201a9300f0603551d130101ff040530" + - "030101ff300e0603551d0f0101ff040403020106301d0603551d0e04160414eb4234d098" + - "b0ab9ff41b6b08f7cc642eef0e2c45301f0603551d230418301680144e0bef1aa4405ba5" + - "17698730ca346843d041aef2306606082b06010505070101045a3058302706082b060105" + - "05073001861b687474703a2f2f6f6373702e737461727473736c2e636f6d2f6361302d06" + - "082b060105050730028621687474703a2f2f7777772e737461727473736c2e636f6d2f73" + - "667363612e637274305b0603551d1f045430523027a025a0238621687474703a2f2f7777" + - "772e737461727473736c2e636f6d2f73667363612e63726c3027a025a023862168747470" + - "3a2f2f63726c2e737461727473736c2e636f6d2f73667363612e63726c3081800603551d" + - "20047930773075060b2b0601040181b5370102013066302e06082b060105050702011622" + - "687474703a2f2f7777772e737461727473736c2e636f6d2f706f6c6963792e7064663034" + - "06082b060105050702011628687474703a2f2f7777772e737461727473736c2e636f6d2f" + - "696e7465726d6564696174652e706466300d06092a864886f70d01010505000382020100" + - "2109493ea5886ee00b8b48da314d8ff75657a2e1d36257e9b556f38545753be5501f048b" + - "e6a05a3ee700ae85d0fbff200364cbad02e1c69172f8a34dd6dee8cc3fa18aa2e37c37a7" + - "c64f8f35d6f4d66e067bdd21d9cf56ffcb302249fe8904f385e5aaf1e71fe875904dddf9" + - "46f74234f745580c110d84b0c6da5d3ef9019ee7e1da5595be741c7bfc4d144fac7e5547" + - "7d7bf4a50d491e95e8f712c1ccff76a62547d0f37535be97b75816ebaa5c786fec5330af" + - "ea044dcca902e3f0b60412f630b1113d904e5664d7dc3c435f7339ef4baf87ebf6fe6888" + - "4472ead207c669b0c1a18bef1749d761b145485f3b2021e95bb2ccf4d7e931f50b15613b" + - "7a94e3ebd9bc7f94ae6ae3626296a8647cb887f399327e92a252bebbf865cfc9f230fc8b" + - "c1c2a696d75f89e15c3480f58f47072fb491bfb1a27e5f4b5ad05b9f248605515a690365" + - "434971c5e06f94346bf61bd8a9b04c7e53eb8f48dfca33b548fa364a1a53a6330cd089cd" + - "4915cd89313c90c072d7654b52358a461144b93d8e2865a63e799e5c084429adb035112e" + - "214eb8d2e7103e5d8483b3c3c2e4d2c6fd094b7409ddf1b3d3193e800da20b19f038e7c5" + - "c2afe223db61e29d5c6e2089492e236ab262c145b49faf8ba7f1223bf87de290d07a19fb" + - "4a4ce3d27d5f4a8303ed27d6239e6b8db459a2d9ef6c8229dd75193c3f4c108defbb7527" + - "d2ae83a7a8ce5ba7" - -const ocspResponseWithoutCertHex = "308201d40a0100a08201cd308201c906092b0601050507300101048201ba3082" + - "01b630819fa2160414884451ff502a695e2d88f421bad90cf2cecbea7c180f3230313330" + - "3631383037323434335a30743072304a300906052b0e03021a0500041448b60d38238df8" + - "456e4ee5843ea394111802979f0414884451ff502a695e2d88f421bad90cf2cecbea7c02" + - "1100f78b13b946fc9635d8ab49de9d2148218000180f3230313330363138303732343433" + - "5aa011180f32303133303632323037323434335a300d06092a864886f70d010105050003" + - "82010100103e18b3d297a5e7a6c07a4fc52ac46a15c0eba96f3be17f0ffe84de5b8c8e05" + - "5a8f577586a849dc4abd6440eb6fedde4622451e2823c1cbf3558b4e8184959c9fe96eff" + - "8bc5f95866c58c6d087519faabfdae37e11d9874f1bc0db292208f645dd848185e4dd38b" + - "6a8547dfa7b74d514a8470015719064d35476b95bebb03d4d2845c5ca15202d2784878f2" + - "0f904c24f09736f044609e9c271381713400e563023d212db422236440c6f377bbf24b2b" + - "9e7dec8698e36a8df68b7592ad3489fb2937afb90eb85d2aa96b81c94c25057dbd4759d9" + - "20a1a65c7f0b6427a224b3c98edd96b9b61f706099951188b0289555ad30a216fb774651" + - "5a35fca2e054dfa8" - -// PKIX nonce extension -var ocspExtensionOID = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 48, 1, 2} -var ocspExtensionValueHex = "0403000000" - -const ocspResponseWithCriticalExtensionHex = "308204fe0a0100a08204f7308204f306092b0601050507300101048204e4308204e03081" + - "dba003020100a11b3019311730150603550403130e4f43535020526573706f6e64657218" + - "0f32303136303130343137303130305a3081a53081a23049300906052b0e03021a050004" + - "14c0fe0278fc99188891b3f212e9c7e1b21ab7bfc004140dfc1df0a9e0f01ce7f2b21317" + - "7e6f8d157cd4f60210017f77deb3bcbb235d44ccc7dba62e72a116180f32303130303730" + - "373135303130355aa0030a0101180f32303130303730373135303130355aa011180f3230" + - "3130303730373138333531375aa1193017301506092b06010505073001020101ff040504" + - "03000000300d06092a864886f70d01010b0500038201010031c730ca60a7a0d92d8e4010" + - "911b469de95b4d27e89de6537552436237967694f76f701cf6b45c932bd308bca4a8d092" + - "5c604ba94796903091d9e6c000178e72c1f0a24a277dd262835af5d17d3f9d7869606c9f" + - "e7c8e708a41645699895beee38bfa63bb46296683761c5d1d65439b8ab868dc3017c9eeb" + - "b70b82dbf3a31c55b457d48bb9e82b335ed49f445042eaf606b06a3e0639824924c89c63" + - "eccddfe85e6694314138b2536f5e15e07085d0f6e26d4b2f8244bab0d70de07283ac6384" + - "a0501fc3dea7cf0adfd4c7f34871080900e252ddc403e3f0265f2a704af905d3727504ed" + - "28f3214a219d898a022463c78439799ca81c8cbafdbcec34ea937cd6a08202ea308202e6" + - "308202e2308201caa003020102020101300d06092a864886f70d01010b05003019311730" + - "150603550403130e4f43535020526573706f6e646572301e170d31353031333031353530" + - "33335a170d3136303133303135353033335a3019311730150603550403130e4f43535020" + - "526573706f6e64657230820122300d06092a864886f70d01010105000382010f00308201" + - "0a0282010100e8155f2d3e6f2e8d14c62a788bd462f9f844e7a6977c83ef1099f0f6616e" + - "c5265b56f356e62c5400f0b06a2e7945a82752c636df32a895152d6074df1701dc6ccfbc" + - "bec75a70bd2b55ae2be7e6cad3b5fd4cd5b7790ab401a436d3f5f346074ffde8a99d5b72" + - "3350f0a112076614b12ef79c78991b119453445acf2416ab0046b540db14c9fc0f27b898" + - "9ad0f63aa4b8aefc91aa8a72160c36307c60fec78a93d3fddf4259902aa77e7332971c7d" + - "285b6a04f648993c6922a3e9da9adf5f81508c3228791843e5d49f24db2f1290bafd97e6" + - "55b1049a199f652cd603c4fafa330c390b0da78fbbc67e8fa021cbd74eb96222b12ace31" + - "a77dcf920334dc94581b0203010001a3353033300e0603551d0f0101ff04040302078030" + - "130603551d25040c300a06082b06010505070309300c0603551d130101ff04023000300d" + - "06092a864886f70d01010b05000382010100718012761b5063e18f0dc44644d8e6ab8612" + - "31c15fd5357805425d82aec1de85bf6d3e30fce205e3e3b8b795bbe52e40a439286d2288" + - "9064f4aeeb150359b9425f1da51b3a5c939018555d13ac42c565a0603786a919328f3267" + - "09dce52c22ad958ecb7873b9771d1148b1c4be2efe80ba868919fc9f68b6090c2f33c156" + - "d67156e42766a50b5d51e79637b7e58af74c2a951b1e642fa7741fec982cc937de37eff5" + - "9e2005d5939bfc031589ca143e6e8ab83f40ee08cc20a6b4a95a318352c28d18528dcaf9" + - "66705de17afa19d6e8ae91ddf33179d16ebb6ac2c69cae8373d408ebf8c55308be6c04d9" + - "3a25439a94299a65a709756c7a3e568be049d5c38839" - -const ocspResponseWithExtensionHex = "308204fb0a0100a08204f4308204f006092b0601050507300101048204e1308204dd3081" + - "d8a003020100a11b3019311730150603550403130e4f43535020526573706f6e64657218" + - "0f32303136303130343136353930305a3081a230819f3049300906052b0e03021a050004" + - "14c0fe0278fc99188891b3f212e9c7e1b21ab7bfc004140dfc1df0a9e0f01ce7f2b21317" + - "7e6f8d157cd4f60210017f77deb3bcbb235d44ccc7dba62e72a116180f32303130303730" + - "373135303130355aa0030a0101180f32303130303730373135303130355aa011180f3230" + - "3130303730373138333531375aa1163014301206092b0601050507300102040504030000" + - "00300d06092a864886f70d01010b05000382010100c09a33e0b2324c852421bb83f85ac9" + - "9113f5426012bd2d2279a8166e9241d18a33c870894250622ffc7ed0c4601b16d624f90b" + - "779265442cdb6868cf40ab304ab4b66e7315ed02cf663b1601d1d4751772b31bc299db23" + - "9aebac78ed6797c06ed815a7a8d18d63cfbb609cafb47ec2e89e37db255216eb09307848" + - "d01be0a3e943653c78212b96ff524b74c9ec456b17cdfb950cc97645c577b2e09ff41dde" + - "b03afb3adaa381cc0f7c1d95663ef22a0f72f2c45613ae8e2b2d1efc96e8463c7d1d8a1d" + - "7e3b35df8fe73a301fc3f804b942b2b3afa337ff105fc1462b7b1c1d75eb4566c8665e59" + - "f80393b0adbf8004ff6c3327ed34f007cb4a3348a7d55e06e3a08202ea308202e6308202" + - "e2308201caa003020102020101300d06092a864886f70d01010b05003019311730150603" + - "550403130e4f43535020526573706f6e646572301e170d3135303133303135353033335a" + - "170d3136303133303135353033335a3019311730150603550403130e4f43535020526573" + - "706f6e64657230820122300d06092a864886f70d01010105000382010f003082010a0282" + - "010100e8155f2d3e6f2e8d14c62a788bd462f9f844e7a6977c83ef1099f0f6616ec5265b" + - "56f356e62c5400f0b06a2e7945a82752c636df32a895152d6074df1701dc6ccfbcbec75a" + - "70bd2b55ae2be7e6cad3b5fd4cd5b7790ab401a436d3f5f346074ffde8a99d5b723350f0" + - "a112076614b12ef79c78991b119453445acf2416ab0046b540db14c9fc0f27b8989ad0f6" + - "3aa4b8aefc91aa8a72160c36307c60fec78a93d3fddf4259902aa77e7332971c7d285b6a" + - "04f648993c6922a3e9da9adf5f81508c3228791843e5d49f24db2f1290bafd97e655b104" + - "9a199f652cd603c4fafa330c390b0da78fbbc67e8fa021cbd74eb96222b12ace31a77dcf" + - "920334dc94581b0203010001a3353033300e0603551d0f0101ff04040302078030130603" + - "551d25040c300a06082b06010505070309300c0603551d130101ff04023000300d06092a" + - "864886f70d01010b05000382010100718012761b5063e18f0dc44644d8e6ab861231c15f" + - "d5357805425d82aec1de85bf6d3e30fce205e3e3b8b795bbe52e40a439286d22889064f4" + - "aeeb150359b9425f1da51b3a5c939018555d13ac42c565a0603786a919328f326709dce5" + - "2c22ad958ecb7873b9771d1148b1c4be2efe80ba868919fc9f68b6090c2f33c156d67156" + - "e42766a50b5d51e79637b7e58af74c2a951b1e642fa7741fec982cc937de37eff59e2005" + - "d5939bfc031589ca143e6e8ab83f40ee08cc20a6b4a95a318352c28d18528dcaf966705d" + - "e17afa19d6e8ae91ddf33179d16ebb6ac2c69cae8373d408ebf8c55308be6c04d93a2543" + - "9a94299a65a709756c7a3e568be049d5c38839" - -const ocspMultiResponseHex = "30820ee60a0100a0820edf30820edb06092b060105050730010104820ecc30820ec83082" + - "0839a216041445ac2ecd75f53f1cf6e4c51d3de0047ad0aa7465180f3230313530363032" + - "3130303033305a3082080c3065303d300906052b0e03021a05000414f7452a0080601527" + - "72e4a135e76e9e52fde0f1580414edd8f2ee977252853a330b297a18f5c993853b3f0204" + - "5456656a8000180f32303135303630323039303230375aa011180f323031353036303331" + - "30303033305a3065303d300906052b0e03021a05000414f7452a008060152772e4a135e7" + - "6e9e52fde0f1580414edd8f2ee977252853a330b297a18f5c993853b3f02045456656b80" + - "00180f32303135303630323039303230375aa011180f3230313530363033313030303330" + - "5a3065303d300906052b0e03021a05000414f7452a008060152772e4a135e76e9e52fde0" + - "f1580414edd8f2ee977252853a330b297a18f5c993853b3f02045456656c8000180f3230" + - "3135303630323039303230375aa011180f32303135303630333130303033305a3065303d" + - "300906052b0e03021a05000414f7452a008060152772e4a135e76e9e52fde0f1580414ed" + - "d8f2ee977252853a330b297a18f5c993853b3f02045456656d8000180f32303135303630" + - "323039303230375aa011180f32303135303630333130303033305a3065303d300906052b" + - "0e03021a05000414f7452a008060152772e4a135e76e9e52fde0f1580414edd8f2ee9772" + - "52853a330b297a18f5c993853b3f02045456656e8000180f323031353036303230393032" + - "30375aa011180f32303135303630333130303033305a3065303d300906052b0e03021a05" + - "000414f7452a008060152772e4a135e76e9e52fde0f1580414edd8f2ee977252853a330b" + - "297a18f5c993853b3f02045456656f8000180f32303135303630323039303230375aa011" + - "180f32303135303630333130303033305a3065303d300906052b0e03021a05000414f745" + - "2a008060152772e4a135e76e9e52fde0f1580414edd8f2ee977252853a330b297a18f5c9" + - "93853b3f0204545665708000180f32303135303630323039303230375aa011180f323031" + - "35303630333130303033305a3065303d300906052b0e03021a05000414f7452a00806015" + - "2772e4a135e76e9e52fde0f1580414edd8f2ee977252853a330b297a18f5c993853b3f02" + - "04545665718000180f32303135303630323039303230375aa011180f3230313530363033" + - "3130303033305a3065303d300906052b0e03021a05000414f7452a008060152772e4a135" + - "e76e9e52fde0f1580414edd8f2ee977252853a330b297a18f5c993853b3f020454566572" + - "8000180f32303135303630323039303230375aa011180f32303135303630333130303033" + - "305a3065303d300906052b0e03021a05000414f7452a008060152772e4a135e76e9e52fd" + - "e0f1580414edd8f2ee977252853a330b297a18f5c993853b3f0204545665738000180f32" + - "303135303630323039303230375aa011180f32303135303630333130303033305a306530" + - "3d300906052b0e03021a05000414f7452a008060152772e4a135e76e9e52fde0f1580414" + - "edd8f2ee977252853a330b297a18f5c993853b3f0204545665748000180f323031353036" + - "30323039303230375aa011180f32303135303630333130303033305a3065303d30090605" + - "2b0e03021a05000414f7452a008060152772e4a135e76e9e52fde0f1580414edd8f2ee97" + - "7252853a330b297a18f5c993853b3f0204545665758000180f3230313530363032303930" + - "3230375aa011180f32303135303630333130303033305a3065303d300906052b0e03021a" + - "05000414f7452a008060152772e4a135e76e9e52fde0f1580414edd8f2ee977252853a33" + - "0b297a18f5c993853b3f0204545665768000180f32303135303630323039303230375aa0" + - "11180f32303135303630333130303033305a3065303d300906052b0e03021a05000414f7" + - "452a008060152772e4a135e76e9e52fde0f1580414edd8f2ee977252853a330b297a18f5" + - "c993853b3f0204545665778000180f32303135303630323039303230375aa011180f3230" + - "3135303630333130303033305a3065303d300906052b0e03021a05000414f7452a008060" + - "152772e4a135e76e9e52fde0f1580414edd8f2ee977252853a330b297a18f5c993853b3f" + - "0204545665788000180f32303135303630323039303230375aa011180f32303135303630" + - "333130303033305a3065303d300906052b0e03021a05000414f7452a008060152772e4a1" + - "35e76e9e52fde0f1580414edd8f2ee977252853a330b297a18f5c993853b3f0204545665" + - "798000180f32303135303630323039303230375aa011180f323031353036303331303030" + - "33305a3065303d300906052b0e03021a05000414f7452a008060152772e4a135e76e9e52" + - "fde0f1580414edd8f2ee977252853a330b297a18f5c993853b3f02045456657a8000180f" + - "32303135303630323039303230375aa011180f32303135303630333130303033305a3065" + - "303d300906052b0e03021a05000414f7452a008060152772e4a135e76e9e52fde0f15804" + - "14edd8f2ee977252853a330b297a18f5c993853b3f02045456657b8000180f3230313530" + - "3630323039303230375aa011180f32303135303630333130303033305a3065303d300906" + - "052b0e03021a05000414f7452a008060152772e4a135e76e9e52fde0f1580414edd8f2ee" + - "977252853a330b297a18f5c993853b3f02045456657c8000180f32303135303630323039" + - "303230375aa011180f32303135303630333130303033305a3065303d300906052b0e0302" + - "1a05000414f7452a008060152772e4a135e76e9e52fde0f1580414edd8f2ee977252853a" + - "330b297a18f5c993853b3f02045456657d8000180f32303135303630323039303230375a" + - "a011180f32303135303630333130303033305a300d06092a864886f70d01010505000382" + - "01010016b73b92859979f27d15eb018cf069eed39c3d280213565f3026de11ba15bdb94d" + - "764cf2d0fdd204ef926c588d7b183483c8a2b1995079c7ed04dcefcc650c1965be4b6832" + - "a8839e832f7f60f638425eccdf9bc3a81fbe700fda426ddf4f06c29bee431bbbe81effda" + - "a60b7da5b378f199af2f3c8380be7ba6c21c8e27124f8a4d8989926aea19055700848d33" + - "799e833512945fd75364edbd2dd18b783c1e96e332266b17979a0b88c35b43f47c87c493" + - "19155056ad8dbbae5ff2afad3c0e1c69ed111206ffda49875e8e4efc0926264823bc4423" + - "c8a002f34288c4bc22516f98f54fc609943721f590ddd8d24f989457526b599b0eb75cb5" + - "a80da1ad93a621a08205733082056f3082056b30820453a0030201020204545638c4300d" + - "06092a864886f70d01010b0500308182310b300906035504061302555331183016060355" + - "040a130f552e532e20476f7665726e6d656e7431233021060355040b131a446570617274" + - "6d656e74206f662074686520547265617375727931223020060355040b13194365727469" + - "6669636174696f6e20417574686f7269746965733110300e060355040b13074f43494f20" + - "4341301e170d3135303332303131353531335a170d3135303633303034303030305a3081" + - "98310b300906035504061302555331183016060355040a130f552e532e20476f7665726e" + - "6d656e7431233021060355040b131a4465706172746d656e74206f662074686520547265" + - "617375727931223020060355040b131943657274696669636174696f6e20417574686f72" + - "69746965733110300e060355040b13074f43494f204341311430120603550403130b4f43" + - "5350205369676e657230820122300d06092a864886f70d01010105000382010f00308201" + - "0a0282010100c1b6fe1ba1ad50bb98c855811acbd67fe68057f48b8e08d3800e7f2c51b7" + - "9e20551934971fd92b9c9e6c49453097927cba83a94c0b2fea7124ba5ac442b38e37dba6" + - "7303d4962dd7d92b22a04b0e0e182e9ea67620b1c6ce09ee607c19e0e6e3adae81151db1" + - "2bb7f706149349a292e21c1eb28565b6839df055e1a838a772ff34b5a1452618e2c26042" + - "705d53f0af4b57aae6163f58216af12f3887813fe44b0321827b3a0c52b0e47d0aab94a2" + - "f768ab0ba3901d22f8bb263823090b0e37a7f8856db4b0d165c42f3aa7e94f5f6ce1855e" + - "98dc57adea0ae98ad39f67ecdec00b88685566e9e8d69f6cefb6ddced53015d0d3b862bc" + - "be21f3d72251eefcec730203010001a38201cf308201cb300e0603551d0f0101ff040403" + - "020780306b0603551d2004643062300c060a60864801650302010502300c060a60864801" + - "650302010503300c060a60864801650302010504300c060a60864801650302010507300c" + - "060a60864801650302010508300c060a6086480165030201030d300c060a608648016503" + - "020103113081e506082b060105050701010481d83081d5303006082b0601050507300286" + - "24687474703a2f2f706b692e74726561732e676f762f746f63615f65655f6169612e7037" + - "633081a006082b060105050730028681936c6461703a2f2f6c6461702e74726561732e67" + - "6f762f6f753d4f43494f25323043412c6f753d43657274696669636174696f6e25323041" + - "7574686f7269746965732c6f753d4465706172746d656e742532306f6625323074686525" + - "323054726561737572792c6f3d552e532e253230476f7665726e6d656e742c633d55533f" + - "634143657274696669636174653b62696e61727930130603551d25040c300a06082b0601" + - "0505070309300f06092b060105050730010504020500301f0603551d23041830168014a2" + - "13a8e5c607546c243d4eb72b27a2a7711ab5af301d0603551d0e0416041451f98046818a" + - "e46d953ac90c210ccfaa1a06980c300d06092a864886f70d01010b050003820101003a37" + - "0b301d14ffdeb370883639bec5ae6f572dcbddadd672af16ee2a8303316b14e1fbdca8c2" + - "8f4bad9c7b1410250e149c14e9830ca6f17370a8d13151205d956e28c141cc0500379596" + - "c5b9239fcfa3d2de8f1d4f1a2b1bf2d1851bed1c86012ee8135bdc395cd4496ce69fadd0" + - "3b682b90350ca7b4f458190b7a0ab5c33a04cf1347a77d541877a380a4c94988c5658908" + - "44fdc22637a72b9fa410333e2caf969477f9fe07f50e3681c204fb3bf073b9da01cd8d91" + - "8044c40b1159955af12a3263ab1d34119d7f59bfa6cae88ed058addc4e08250263f8f836" + - "2f5bdffd45636fea7474c60a55c535954477b2f286e1b2535f0dd12c162f1b353c370e08" + - "be67" - -const ocspMultiResponseCertHex = "308207943082067ca003020102020454566573300d06092a864886f70d01010b05003081" + - "82310b300906035504061302555331183016060355040a130f552e532e20476f7665726e" + - "6d656e7431233021060355040b131a4465706172746d656e74206f662074686520547265" + - "617375727931223020060355040b131943657274696669636174696f6e20417574686f72" + - "69746965733110300e060355040b13074f43494f204341301e170d313530343130313535" + - "3733385a170d3138303431303136323733385a30819d310b300906035504061302555331" + - "183016060355040a130f552e532e20476f7665726e6d656e7431233021060355040b131a" + - "4465706172746d656e74206f662074686520547265617375727931253023060355040b13" + - "1c427572656175206f66207468652046697363616c20536572766963653110300e060355" + - "040b130744657669636573311630140603550403130d706b692e74726561732e676f7630" + - "820122300d06092a864886f70d01010105000382010f003082010a0282010100c7273623" + - "8c49c48bf501515a2490ef6e5ae0c06e0ad2aa9a6bb77f3d0370d846b2571581ebf38fd3" + - "1948daad3dec7a4da095f1dcbe9654e65bcf7acdfd4ee802421dad9b90536c721d2bca58" + - "8413e6bfd739a72470560bb7d64f9a09284f90ff8af1d5a3c5c84d0f95a00f9c6d988dd0" + - "d87f1d0d3344580901c955139f54d09de0acdbd3322b758cb0c58881bf04913243401f44" + - "013fd9f6d8348044cc8bb0a71978ad93366b2a4687a5274b2ee07d0fb40225453eb244ed" + - "b20152251ac77c59455260ff07eeceb3cb3c60fb8121cf92afd3daa2a4650e1942ccb555" + - "de10b3d481feb299838ef05d0fd1810b146753472ae80da65dd34da25ca1f89971f10039" + - "0203010001a38203f3308203ef300e0603551d0f0101ff0404030205a030170603551d20" + - "0410300e300c060a60864801650302010503301106096086480186f84201010404030206" + - "4030130603551d25040c300a06082b060105050703013082010806082b06010505070101" + - "0481fb3081f8303006082b060105050730028624687474703a2f2f706b692e7472656173" + - "2e676f762f746f63615f65655f6169612e7037633081a006082b06010505073002868193" + - "6c6461703a2f2f6c6461702e74726561732e676f762f6f753d4f43494f25323043412c6f" + - "753d43657274696669636174696f6e253230417574686f7269746965732c6f753d446570" + - "6172746d656e742532306f6625323074686525323054726561737572792c6f3d552e532e" + - "253230476f7665726e6d656e742c633d55533f634143657274696669636174653b62696e" + - "617279302106082b060105050730018615687474703a2f2f6f6373702e74726561732e67" + - "6f76307b0603551d1104743072811c6373612d7465616d4066697363616c2e7472656173" + - "7572792e676f768210706b692e74726561737572792e676f768210706b692e64696d632e" + - "6468732e676f76820d706b692e74726561732e676f76811f6563622d686f7374696e6740" + - "66697363616c2e74726561737572792e676f76308201890603551d1f048201803082017c" + - "3027a025a0238621687474703a2f2f706b692e74726561732e676f762f4f43494f5f4341" + - "332e63726c3082014fa082014ba0820147a48197308194310b3009060355040613025553" + - "31183016060355040a130f552e532e20476f7665726e6d656e7431233021060355040b13" + - "1a4465706172746d656e74206f662074686520547265617375727931223020060355040b" + - "131943657274696669636174696f6e20417574686f7269746965733110300e060355040b" + - "13074f43494f2043413110300e0603550403130743524c313430398681aa6c6461703a2f" + - "2f6c6461702e74726561732e676f762f636e3d43524c313430392c6f753d4f43494f2532" + - "3043412c6f753d43657274696669636174696f6e253230417574686f7269746965732c6f" + - "753d4465706172746d656e742532306f6625323074686525323054726561737572792c6f" + - "3d552e532e253230476f7665726e6d656e742c633d55533f636572746966696361746552" + - "65766f636174696f6e4c6973743b62696e617279302b0603551d1004243022800f323031" + - "35303431303135353733385a810f32303138303431303136323733385a301f0603551d23" + - "041830168014a213a8e5c607546c243d4eb72b27a2a7711ab5af301d0603551d0e041604" + - "14b0869c12c293914cd460e33ed43e6c5a26e0d68f301906092a864886f67d074100040c" + - "300a1b0456382e31030203a8300d06092a864886f70d01010b050003820101004968d182" + - "8f9efdc147e747bb5dda15536a42a079b32d3d7f87e619b483aeee70b7e26bda393c6028" + - "7c733ecb468fe8b8b11bf809ff76add6b90eb25ad8d3a1052e43ee281e48a3a1ebe7efb5" + - "9e2c4a48765dedeb23f5346242145786cc988c762d230d28dd33bf4c2405d80cbb2cb1d6" + - "4c8f10ba130d50cb174f6ffb9cfc12808297a2cefba385f4fad170f39b51ebd87c12abf9" + - "3c51fc000af90d8aaba78f48923908804a5eb35f617ccf71d201e3708a559e6d16f9f13e" + - "074361eb9007e28d86bb4e0bfa13aad0e9ddd9124e84519de60e2fc6040b18d9fd602b02" + - "684b4c071c3019fc842197d00c120c41654bcbfbc4a096a1c637b79112b81ce1fa3899f9" - -const ocspRequestHex = "3051304f304d304b3049300906052b0e03021a05000414c0fe0278fc99188891b3f212e9" + - "c7e1b21ab7bfc004140dfc1df0a9e0f01ce7f2b213177e6f8d157cd4f60210017f77deb3" + - "bcbb235d44ccc7dba62e72" - -const leafCertHex = "308203c830820331a0030201020210017f77deb3bcbb235d44ccc7dba62e72300d06092a" + - "864886f70d01010505003081ba311f301d060355040a1316566572695369676e20547275" + - "7374204e6574776f726b31173015060355040b130e566572695369676e2c20496e632e31" + - "333031060355040b132a566572695369676e20496e7465726e6174696f6e616c20536572" + - "766572204341202d20436c617373203331493047060355040b13407777772e7665726973" + - "69676e2e636f6d2f43505320496e636f72702e6279205265662e204c494142494c495459" + - "204c54442e286329393720566572695369676e301e170d3132303632313030303030305a" + - "170d3133313233313233353935395a3068310b3009060355040613025553311330110603" + - "550408130a43616c69666f726e6961311230100603550407130950616c6f20416c746f31" + - "173015060355040a130e46616365626f6f6b2c20496e632e311730150603550403140e2a" + - "2e66616365626f6f6b2e636f6d30819f300d06092a864886f70d010101050003818d0030" + - "818902818100ae94b171e2deccc1693e051063240102e0689ae83c39b6b3e74b97d48d7b" + - "23689100b0b496ee62f0e6d356bcf4aa0f50643402f5d1766aa972835a7564723f39bbef" + - "5290ded9bcdbf9d3d55dfad23aa03dc604c54d29cf1d4b3bdbd1a809cfae47b44c7eae17" + - "c5109bee24a9cf4a8d911bb0fd0415ae4c3f430aa12a557e2ae10203010001a382011e30" + - "82011a30090603551d130402300030440603551d20043d303b3039060b6086480186f845" + - "01071703302a302806082b06010505070201161c68747470733a2f2f7777772e76657269" + - "7369676e2e636f6d2f727061303c0603551d1f043530333031a02fa02d862b687474703a" + - "2f2f535652496e746c2d63726c2e766572697369676e2e636f6d2f535652496e746c2e63" + - "726c301d0603551d250416301406082b0601050507030106082b06010505070302300b06" + - "03551d0f0404030205a0303406082b0601050507010104283026302406082b0601050507" + - "30018618687474703a2f2f6f6373702e766572697369676e2e636f6d30270603551d1104" + - "20301e820e2a2e66616365626f6f6b2e636f6d820c66616365626f6f6b2e636f6d300d06" + - "092a864886f70d0101050500038181005b6c2b75f8ed30aa51aad36aba595e555141951f" + - "81a53b447910ac1f76ff78fc2781616b58f3122afc1c87010425e9ed43df1a7ba6498060" + - "67e2688af03db58c7df4ee03309a6afc247ccb134dc33e54c6bc1d5133a532a73273b1d7" + - "9cadc08e7e1a83116d34523340b0305427a21742827c98916698ee7eaf8c3bdd71700817" - -const issuerCertHex = "30820383308202eca003020102021046fcebbab4d02f0f926098233f93078f300d06092a" + - "864886f70d0101050500305f310b300906035504061302555331173015060355040a130e" + - "566572695369676e2c20496e632e31373035060355040b132e436c617373203320507562" + - "6c6963205072696d6172792043657274696669636174696f6e20417574686f7269747930" + - "1e170d3937303431373030303030305a170d3136313032343233353935395a3081ba311f" + - "301d060355040a1316566572695369676e205472757374204e6574776f726b3117301506" + - "0355040b130e566572695369676e2c20496e632e31333031060355040b132a5665726953" + - "69676e20496e7465726e6174696f6e616c20536572766572204341202d20436c61737320" + - "3331493047060355040b13407777772e766572697369676e2e636f6d2f43505320496e63" + - "6f72702e6279205265662e204c494142494c495459204c54442e28632939372056657269" + - "5369676e30819f300d06092a864886f70d010101050003818d0030818902818100d88280" + - "e8d619027d1f85183925a2652be1bfd405d3bce6363baaf04c6c5bb6e7aa3c734555b2f1" + - "bdea9742ed9a340a15d4a95cf54025ddd907c132b2756cc4cabba3fe56277143aa63f530" + - "3e9328e5faf1093bf3b74d4e39f75c495ab8c11dd3b28afe70309542cbfe2b518b5a3c3a" + - "f9224f90b202a7539c4f34e7ab04b27b6f0203010001a381e33081e0300f0603551d1304" + - "0830060101ff02010030440603551d20043d303b3039060b6086480186f8450107010130" + - "2a302806082b06010505070201161c68747470733a2f2f7777772e766572697369676e2e" + - "636f6d2f43505330340603551d25042d302b06082b0601050507030106082b0601050507" + - "030206096086480186f8420401060a6086480186f845010801300b0603551d0f04040302" + - "0106301106096086480186f842010104040302010630310603551d1f042a30283026a024" + - "a0228620687474703a2f2f63726c2e766572697369676e2e636f6d2f706361332e63726c" + - "300d06092a864886f70d010105050003818100408e4997968a73dd8e4def3e61b7caa062" + - "adf40e0abb753de26ed82cc7bff4b98c369bcaa2d09c724639f6a682036511c4bcbf2da6" + - "f5d93b0ab598fab378b91ef22b4c62d5fdb27a1ddf33fd73f9a5d82d8c2aead1fcb028b6" + - "e94948134b838a1b487b24f738de6f4154b8ab576b06dfc7a2d4a9f6f136628088f28b75" + - "d68071" - -// Key and certificate for the OCSP responder were not taken from the Thawte -// responder, since CreateResponse requires that we have the private key. -// Instead, they were generated randomly. -const responderPrivateKeyHex = "308204a40201000282010100e8155f2d3e6f2e8d14c62a788bd462f9f844e7a6977c83ef" + - "1099f0f6616ec5265b56f356e62c5400f0b06a2e7945a82752c636df32a895152d6074df" + - "1701dc6ccfbcbec75a70bd2b55ae2be7e6cad3b5fd4cd5b7790ab401a436d3f5f346074f" + - "fde8a99d5b723350f0a112076614b12ef79c78991b119453445acf2416ab0046b540db14" + - "c9fc0f27b8989ad0f63aa4b8aefc91aa8a72160c36307c60fec78a93d3fddf4259902aa7" + - "7e7332971c7d285b6a04f648993c6922a3e9da9adf5f81508c3228791843e5d49f24db2f" + - "1290bafd97e655b1049a199f652cd603c4fafa330c390b0da78fbbc67e8fa021cbd74eb9" + - "6222b12ace31a77dcf920334dc94581b02030100010282010100bcf0b93d7238bda329a8" + - "72e7149f61bcb37c154330ccb3f42a85c9002c2e2bdea039d77d8581cd19bed94078794e" + - "56293d601547fc4bf6a2f9002fe5772b92b21b254403b403585e3130cc99ccf08f0ef81a" + - "575b38f597ba4660448b54f44bfbb97072b5a2bf043bfeca828cf7741d13698e3f38162b" + - "679faa646b82abd9a72c5c7d722c5fc577a76d2c2daac588accad18516d1bbad10b0dfa2" + - "05cfe246b59e28608a43942e1b71b0c80498075121de5b900d727c31c42c78cf1db5c0aa" + - "5b491e10ea4ed5c0962aaf2ae025dd81fa4ce490d9d6b4a4465411d8e542fc88617e5695" + - "1aa4fc8ea166f2b4d0eb89ef17f2b206bd5f1014bf8fe0e71fe62f2cccf102818100f2dc" + - "ddf878d553286daad68bac4070a82ffec3dc4666a2750f47879eec913f91836f1d976b60" + - "daf9356e078446dafab5bd2e489e5d64f8572ba24a4ba4f3729b5e106c4dd831cc2497a7" + - "e6c7507df05cb64aeb1bbc81c1e340d58b5964cf39cff84ea30c29ec5d3f005ee1362698" + - "07395037955955655292c3e85f6187fa1f9502818100f4a33c102630840705f8c778a47b" + - "87e8da31e68809af981ac5e5999cf1551685d761cdf0d6520361b99aebd5777a940fa64d" + - "327c09fa63746fbb3247ec73a86edf115f1fe5c83598db803881ade71c33c6e956118345" + - "497b98b5e07bb5be75971465ec78f2f9467e1b74956ca9d4c7c3e314e742a72d8b33889c" + - "6c093a466cef0281801d3df0d02124766dd0be98349b19eb36a508c4e679e793ba0a8bef" + - "4d786888c1e9947078b1ea28938716677b4ad8c5052af12eb73ac194915264a913709a0b" + - "7b9f98d4a18edd781a13d49899f91c20dbd8eb2e61d991ba19b5cdc08893f5cb9d39e5a6" + - "0629ea16d426244673b1b3ee72bd30e41fac8395acac40077403de5efd028180050731dd" + - "d71b1a2b96c8d538ba90bb6b62c8b1c74c03aae9a9f59d21a7a82b0d572ef06fa9c807bf" + - "c373d6b30d809c7871df96510c577421d9860c7383fda0919ece19996b3ca13562159193" + - "c0c246471e287f975e8e57034e5136aaf44254e2650def3d51292474c515b1588969112e" + - "0a85cc77073e9d64d2c2fc497844284b02818100d71d63eabf416cf677401ebf965f8314" + - "120b568a57dd3bd9116c629c40dc0c6948bab3a13cc544c31c7da40e76132ef5dd3f7534" + - "45a635930c74326ae3df0edd1bfb1523e3aa259873ac7cf1ac31151ec8f37b528c275622" + - "48f99b8bed59fd4da2576aa6ee20d93a684900bf907e80c66d6e2261ae15e55284b4ed9d" + - "6bdaa059" - -const responderCertHex = "308202e2308201caa003020102020101300d06092a864886f70d01010b05003019311730" + - "150603550403130e4f43535020526573706f6e646572301e170d31353031333031353530" + - "33335a170d3136303133303135353033335a3019311730150603550403130e4f43535020" + - "526573706f6e64657230820122300d06092a864886f70d01010105000382010f00308201" + - "0a0282010100e8155f2d3e6f2e8d14c62a788bd462f9f844e7a6977c83ef1099f0f6616e" + - "c5265b56f356e62c5400f0b06a2e7945a82752c636df32a895152d6074df1701dc6ccfbc" + - "bec75a70bd2b55ae2be7e6cad3b5fd4cd5b7790ab401a436d3f5f346074ffde8a99d5b72" + - "3350f0a112076614b12ef79c78991b119453445acf2416ab0046b540db14c9fc0f27b898" + - "9ad0f63aa4b8aefc91aa8a72160c36307c60fec78a93d3fddf4259902aa77e7332971c7d" + - "285b6a04f648993c6922a3e9da9adf5f81508c3228791843e5d49f24db2f1290bafd97e6" + - "55b1049a199f652cd603c4fafa330c390b0da78fbbc67e8fa021cbd74eb96222b12ace31" + - "a77dcf920334dc94581b0203010001a3353033300e0603551d0f0101ff04040302078030" + - "130603551d25040c300a06082b06010505070309300c0603551d130101ff04023000300d" + - "06092a864886f70d01010b05000382010100718012761b5063e18f0dc44644d8e6ab8612" + - "31c15fd5357805425d82aec1de85bf6d3e30fce205e3e3b8b795bbe52e40a439286d2288" + - "9064f4aeeb150359b9425f1da51b3a5c939018555d13ac42c565a0603786a919328f3267" + - "09dce52c22ad958ecb7873b9771d1148b1c4be2efe80ba868919fc9f68b6090c2f33c156" + - "d67156e42766a50b5d51e79637b7e58af74c2a951b1e642fa7741fec982cc937de37eff5" + - "9e2005d5939bfc031589ca143e6e8ab83f40ee08cc20a6b4a95a318352c28d18528dcaf9" + - "66705de17afa19d6e8ae91ddf33179d16ebb6ac2c69cae8373d408ebf8c55308be6c04d9" + - "3a25439a94299a65a709756c7a3e568be049d5c38839" - -const errorResponseHex = "30030a0101" diff --git a/vendor/golang.org/x/crypto/openpgp/armor/armor.go b/vendor/golang.org/x/crypto/openpgp/armor/armor.go deleted file mode 100644 index 592d18643..000000000 --- a/vendor/golang.org/x/crypto/openpgp/armor/armor.go +++ /dev/null @@ -1,219 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package armor implements OpenPGP ASCII Armor, see RFC 4880. OpenPGP Armor is -// very similar to PEM except that it has an additional CRC checksum. -package armor // import "golang.org/x/crypto/openpgp/armor" - -import ( - "bufio" - "bytes" - "encoding/base64" - "golang.org/x/crypto/openpgp/errors" - "io" -) - -// A Block represents an OpenPGP armored structure. -// -// The encoded form is: -// -----BEGIN Type----- -// Headers -// -// base64-encoded Bytes -// '=' base64 encoded checksum -// -----END Type----- -// where Headers is a possibly empty sequence of Key: Value lines. -// -// Since the armored data can be very large, this package presents a streaming -// interface. -type Block struct { - Type string // The type, taken from the preamble (i.e. "PGP SIGNATURE"). - Header map[string]string // Optional headers. - Body io.Reader // A Reader from which the contents can be read - lReader lineReader - oReader openpgpReader -} - -var ArmorCorrupt error = errors.StructuralError("armor invalid") - -const crc24Init = 0xb704ce -const crc24Poly = 0x1864cfb -const crc24Mask = 0xffffff - -// crc24 calculates the OpenPGP checksum as specified in RFC 4880, section 6.1 -func crc24(crc uint32, d []byte) uint32 { - for _, b := range d { - crc ^= uint32(b) << 16 - for i := 0; i < 8; i++ { - crc <<= 1 - if crc&0x1000000 != 0 { - crc ^= crc24Poly - } - } - } - return crc -} - -var armorStart = []byte("-----BEGIN ") -var armorEnd = []byte("-----END ") -var armorEndOfLine = []byte("-----") - -// lineReader wraps a line based reader. It watches for the end of an armor -// block and records the expected CRC value. -type lineReader struct { - in *bufio.Reader - buf []byte - eof bool - crc uint32 -} - -func (l *lineReader) Read(p []byte) (n int, err error) { - if l.eof { - return 0, io.EOF - } - - if len(l.buf) > 0 { - n = copy(p, l.buf) - l.buf = l.buf[n:] - return - } - - line, isPrefix, err := l.in.ReadLine() - if err != nil { - return - } - if isPrefix { - return 0, ArmorCorrupt - } - - if len(line) == 5 && line[0] == '=' { - // This is the checksum line - var expectedBytes [3]byte - var m int - m, err = base64.StdEncoding.Decode(expectedBytes[0:], line[1:]) - if m != 3 || err != nil { - return - } - l.crc = uint32(expectedBytes[0])<<16 | - uint32(expectedBytes[1])<<8 | - uint32(expectedBytes[2]) - - line, _, err = l.in.ReadLine() - if err != nil && err != io.EOF { - return - } - if !bytes.HasPrefix(line, armorEnd) { - return 0, ArmorCorrupt - } - - l.eof = true - return 0, io.EOF - } - - if len(line) > 96 { - return 0, ArmorCorrupt - } - - n = copy(p, line) - bytesToSave := len(line) - n - if bytesToSave > 0 { - if cap(l.buf) < bytesToSave { - l.buf = make([]byte, 0, bytesToSave) - } - l.buf = l.buf[0:bytesToSave] - copy(l.buf, line[n:]) - } - - return -} - -// openpgpReader passes Read calls to the underlying base64 decoder, but keeps -// a running CRC of the resulting data and checks the CRC against the value -// found by the lineReader at EOF. -type openpgpReader struct { - lReader *lineReader - b64Reader io.Reader - currentCRC uint32 -} - -func (r *openpgpReader) Read(p []byte) (n int, err error) { - n, err = r.b64Reader.Read(p) - r.currentCRC = crc24(r.currentCRC, p[:n]) - - if err == io.EOF { - if r.lReader.crc != uint32(r.currentCRC&crc24Mask) { - return 0, ArmorCorrupt - } - } - - return -} - -// Decode reads a PGP armored block from the given Reader. It will ignore -// leading garbage. If it doesn't find a block, it will return nil, io.EOF. The -// given Reader is not usable after calling this function: an arbitrary amount -// of data may have been read past the end of the block. -func Decode(in io.Reader) (p *Block, err error) { - r := bufio.NewReaderSize(in, 100) - var line []byte - ignoreNext := false - -TryNextBlock: - p = nil - - // Skip leading garbage - for { - ignoreThis := ignoreNext - line, ignoreNext, err = r.ReadLine() - if err != nil { - return - } - if ignoreNext || ignoreThis { - continue - } - line = bytes.TrimSpace(line) - if len(line) > len(armorStart)+len(armorEndOfLine) && bytes.HasPrefix(line, armorStart) { - break - } - } - - p = new(Block) - p.Type = string(line[len(armorStart) : len(line)-len(armorEndOfLine)]) - p.Header = make(map[string]string) - nextIsContinuation := false - var lastKey string - - // Read headers - for { - isContinuation := nextIsContinuation - line, nextIsContinuation, err = r.ReadLine() - if err != nil { - p = nil - return - } - if isContinuation { - p.Header[lastKey] += string(line) - continue - } - line = bytes.TrimSpace(line) - if len(line) == 0 { - break - } - - i := bytes.Index(line, []byte(": ")) - if i == -1 { - goto TryNextBlock - } - lastKey = string(line[:i]) - p.Header[lastKey] = string(line[i+2:]) - } - - p.lReader.in = r - p.oReader.currentCRC = crc24Init - p.oReader.lReader = &p.lReader - p.oReader.b64Reader = base64.NewDecoder(base64.StdEncoding, &p.lReader) - p.Body = &p.oReader - - return -} diff --git a/vendor/golang.org/x/crypto/openpgp/armor/armor_test.go b/vendor/golang.org/x/crypto/openpgp/armor/armor_test.go deleted file mode 100644 index 9334e94e9..000000000 --- a/vendor/golang.org/x/crypto/openpgp/armor/armor_test.go +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package armor - -import ( - "bytes" - "hash/adler32" - "io/ioutil" - "testing" -) - -func TestDecodeEncode(t *testing.T) { - buf := bytes.NewBuffer([]byte(armorExample1)) - result, err := Decode(buf) - if err != nil { - t.Error(err) - } - expectedType := "PGP SIGNATURE" - if result.Type != expectedType { - t.Errorf("result.Type: got:%s want:%s", result.Type, expectedType) - } - if len(result.Header) != 1 { - t.Errorf("len(result.Header): got:%d want:1", len(result.Header)) - } - v, ok := result.Header["Version"] - if !ok || v != "GnuPG v1.4.10 (GNU/Linux)" { - t.Errorf("result.Header: got:%#v", result.Header) - } - - contents, err := ioutil.ReadAll(result.Body) - if err != nil { - t.Error(err) - } - - if adler32.Checksum(contents) != 0x27b144be { - t.Errorf("contents: got: %x", contents) - } - - buf = bytes.NewBuffer(nil) - w, err := Encode(buf, result.Type, result.Header) - if err != nil { - t.Error(err) - } - _, err = w.Write(contents) - if err != nil { - t.Error(err) - } - w.Close() - - if !bytes.Equal(buf.Bytes(), []byte(armorExample1)) { - t.Errorf("got: %s\nwant: %s", string(buf.Bytes()), armorExample1) - } -} - -func TestLongHeader(t *testing.T) { - buf := bytes.NewBuffer([]byte(armorLongLine)) - result, err := Decode(buf) - if err != nil { - t.Error(err) - return - } - value, ok := result.Header["Version"] - if !ok { - t.Errorf("missing Version header") - } - if value != longValueExpected { - t.Errorf("got: %s want: %s", value, longValueExpected) - } -} - -const armorExample1 = `-----BEGIN PGP SIGNATURE----- -Version: GnuPG v1.4.10 (GNU/Linux) - -iJwEAAECAAYFAk1Fv/0ACgkQo01+GMIMMbsYTwQAiAw+QAaNfY6WBdplZ/uMAccm -4g+81QPmTSGHnetSb6WBiY13kVzK4HQiZH8JSkmmroMLuGeJwsRTEL4wbjRyUKEt -p1xwUZDECs234F1xiG5enc5SGlRtP7foLBz9lOsjx+LEcA4sTl5/2eZR9zyFZqWW -TxRjs+fJCIFuo71xb1g= -=/teI ------END PGP SIGNATURE-----` - -const armorLongLine = `-----BEGIN PGP SIGNATURE----- -Version: 0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz - -iQEcBAABAgAGBQJMtFESAAoJEKsQXJGvOPsVj40H/1WW6jaMXv4BW+1ueDSMDwM8 -kx1fLOXbVM5/Kn5LStZNt1jWWnpxdz7eq3uiqeCQjmqUoRde3YbB2EMnnwRbAhpp -cacnAvy9ZQ78OTxUdNW1mhX5bS6q1MTEJnl+DcyigD70HG/yNNQD7sOPMdYQw0TA -byQBwmLwmTsuZsrYqB68QyLHI+DUugn+kX6Hd2WDB62DKa2suoIUIHQQCd/ofwB3 -WfCYInXQKKOSxu2YOg2Eb4kLNhSMc1i9uKUWAH+sdgJh7NBgdoE4MaNtBFkHXRvv -okWuf3+xA9ksp1npSY/mDvgHijmjvtpRDe6iUeqfCn8N9u9CBg8geANgaG8+QA4= -=wfQG ------END PGP SIGNATURE-----` - -const longValueExpected = "0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz" diff --git a/vendor/golang.org/x/crypto/openpgp/armor/encode.go b/vendor/golang.org/x/crypto/openpgp/armor/encode.go deleted file mode 100644 index 6f07582c3..000000000 --- a/vendor/golang.org/x/crypto/openpgp/armor/encode.go +++ /dev/null @@ -1,160 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package armor - -import ( - "encoding/base64" - "io" -) - -var armorHeaderSep = []byte(": ") -var blockEnd = []byte("\n=") -var newline = []byte("\n") -var armorEndOfLineOut = []byte("-----\n") - -// writeSlices writes its arguments to the given Writer. -func writeSlices(out io.Writer, slices ...[]byte) (err error) { - for _, s := range slices { - _, err = out.Write(s) - if err != nil { - return err - } - } - return -} - -// lineBreaker breaks data across several lines, all of the same byte length -// (except possibly the last). Lines are broken with a single '\n'. -type lineBreaker struct { - lineLength int - line []byte - used int - out io.Writer - haveWritten bool -} - -func newLineBreaker(out io.Writer, lineLength int) *lineBreaker { - return &lineBreaker{ - lineLength: lineLength, - line: make([]byte, lineLength), - used: 0, - out: out, - } -} - -func (l *lineBreaker) Write(b []byte) (n int, err error) { - n = len(b) - - if n == 0 { - return - } - - if l.used == 0 && l.haveWritten { - _, err = l.out.Write([]byte{'\n'}) - if err != nil { - return - } - } - - if l.used+len(b) < l.lineLength { - l.used += copy(l.line[l.used:], b) - return - } - - l.haveWritten = true - _, err = l.out.Write(l.line[0:l.used]) - if err != nil { - return - } - excess := l.lineLength - l.used - l.used = 0 - - _, err = l.out.Write(b[0:excess]) - if err != nil { - return - } - - _, err = l.Write(b[excess:]) - return -} - -func (l *lineBreaker) Close() (err error) { - if l.used > 0 { - _, err = l.out.Write(l.line[0:l.used]) - if err != nil { - return - } - } - - return -} - -// encoding keeps track of a running CRC24 over the data which has been written -// to it and outputs a OpenPGP checksum when closed, followed by an armor -// trailer. -// -// It's built into a stack of io.Writers: -// encoding -> base64 encoder -> lineBreaker -> out -type encoding struct { - out io.Writer - breaker *lineBreaker - b64 io.WriteCloser - crc uint32 - blockType []byte -} - -func (e *encoding) Write(data []byte) (n int, err error) { - e.crc = crc24(e.crc, data) - return e.b64.Write(data) -} - -func (e *encoding) Close() (err error) { - err = e.b64.Close() - if err != nil { - return - } - e.breaker.Close() - - var checksumBytes [3]byte - checksumBytes[0] = byte(e.crc >> 16) - checksumBytes[1] = byte(e.crc >> 8) - checksumBytes[2] = byte(e.crc) - - var b64ChecksumBytes [4]byte - base64.StdEncoding.Encode(b64ChecksumBytes[:], checksumBytes[:]) - - return writeSlices(e.out, blockEnd, b64ChecksumBytes[:], newline, armorEnd, e.blockType, armorEndOfLine) -} - -// Encode returns a WriteCloser which will encode the data written to it in -// OpenPGP armor. -func Encode(out io.Writer, blockType string, headers map[string]string) (w io.WriteCloser, err error) { - bType := []byte(blockType) - err = writeSlices(out, armorStart, bType, armorEndOfLineOut) - if err != nil { - return - } - - for k, v := range headers { - err = writeSlices(out, []byte(k), armorHeaderSep, []byte(v), newline) - if err != nil { - return - } - } - - _, err = out.Write(newline) - if err != nil { - return - } - - e := &encoding{ - out: out, - breaker: newLineBreaker(out, 64), - crc: crc24Init, - blockType: bType, - } - e.b64 = base64.NewEncoder(base64.StdEncoding, e.breaker) - return e, nil -} diff --git a/vendor/golang.org/x/crypto/openpgp/canonical_text.go b/vendor/golang.org/x/crypto/openpgp/canonical_text.go deleted file mode 100644 index e601e389f..000000000 --- a/vendor/golang.org/x/crypto/openpgp/canonical_text.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package openpgp - -import "hash" - -// NewCanonicalTextHash reformats text written to it into the canonical -// form and then applies the hash h. See RFC 4880, section 5.2.1. -func NewCanonicalTextHash(h hash.Hash) hash.Hash { - return &canonicalTextHash{h, 0} -} - -type canonicalTextHash struct { - h hash.Hash - s int -} - -var newline = []byte{'\r', '\n'} - -func (cth *canonicalTextHash) Write(buf []byte) (int, error) { - start := 0 - - for i, c := range buf { - switch cth.s { - case 0: - if c == '\r' { - cth.s = 1 - } else if c == '\n' { - cth.h.Write(buf[start:i]) - cth.h.Write(newline) - start = i + 1 - } - case 1: - cth.s = 0 - } - } - - cth.h.Write(buf[start:]) - return len(buf), nil -} - -func (cth *canonicalTextHash) Sum(in []byte) []byte { - return cth.h.Sum(in) -} - -func (cth *canonicalTextHash) Reset() { - cth.h.Reset() - cth.s = 0 -} - -func (cth *canonicalTextHash) Size() int { - return cth.h.Size() -} - -func (cth *canonicalTextHash) BlockSize() int { - return cth.h.BlockSize() -} diff --git a/vendor/golang.org/x/crypto/openpgp/canonical_text_test.go b/vendor/golang.org/x/crypto/openpgp/canonical_text_test.go deleted file mode 100644 index 8f3ba2a88..000000000 --- a/vendor/golang.org/x/crypto/openpgp/canonical_text_test.go +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package openpgp - -import ( - "bytes" - "testing" -) - -type recordingHash struct { - buf *bytes.Buffer -} - -func (r recordingHash) Write(b []byte) (n int, err error) { - return r.buf.Write(b) -} - -func (r recordingHash) Sum(in []byte) []byte { - return append(in, r.buf.Bytes()...) -} - -func (r recordingHash) Reset() { - panic("shouldn't be called") -} - -func (r recordingHash) Size() int { - panic("shouldn't be called") -} - -func (r recordingHash) BlockSize() int { - panic("shouldn't be called") -} - -func testCanonicalText(t *testing.T, input, expected string) { - r := recordingHash{bytes.NewBuffer(nil)} - c := NewCanonicalTextHash(r) - c.Write([]byte(input)) - result := c.Sum(nil) - if expected != string(result) { - t.Errorf("input: %x got: %x want: %x", input, result, expected) - } -} - -func TestCanonicalText(t *testing.T) { - testCanonicalText(t, "foo\n", "foo\r\n") - testCanonicalText(t, "foo", "foo") - testCanonicalText(t, "foo\r\n", "foo\r\n") - testCanonicalText(t, "foo\r\nbar", "foo\r\nbar") - testCanonicalText(t, "foo\r\nbar\n\n", "foo\r\nbar\r\n\r\n") -} diff --git a/vendor/golang.org/x/crypto/openpgp/clearsign/clearsign.go b/vendor/golang.org/x/crypto/openpgp/clearsign/clearsign.go deleted file mode 100644 index def4cabaf..000000000 --- a/vendor/golang.org/x/crypto/openpgp/clearsign/clearsign.go +++ /dev/null @@ -1,376 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package clearsign generates and processes OpenPGP, clear-signed data. See -// RFC 4880, section 7. -// -// Clearsigned messages are cryptographically signed, but the contents of the -// message are kept in plaintext so that it can be read without special tools. -package clearsign // import "golang.org/x/crypto/openpgp/clearsign" - -import ( - "bufio" - "bytes" - "crypto" - "hash" - "io" - "net/textproto" - "strconv" - - "golang.org/x/crypto/openpgp/armor" - "golang.org/x/crypto/openpgp/errors" - "golang.org/x/crypto/openpgp/packet" -) - -// A Block represents a clearsigned message. A signature on a Block can -// be checked by passing Bytes into openpgp.CheckDetachedSignature. -type Block struct { - Headers textproto.MIMEHeader // Optional message headers - Plaintext []byte // The original message text - Bytes []byte // The signed message - ArmoredSignature *armor.Block // The signature block -} - -// start is the marker which denotes the beginning of a clearsigned message. -var start = []byte("\n-----BEGIN PGP SIGNED MESSAGE-----") - -// dashEscape is prefixed to any lines that begin with a hyphen so that they -// can't be confused with endText. -var dashEscape = []byte("- ") - -// endText is a marker which denotes the end of the message and the start of -// an armored signature. -var endText = []byte("-----BEGIN PGP SIGNATURE-----") - -// end is a marker which denotes the end of the armored signature. -var end = []byte("\n-----END PGP SIGNATURE-----") - -var crlf = []byte("\r\n") -var lf = byte('\n') - -// getLine returns the first \r\n or \n delineated line from the given byte -// array. The line does not include the \r\n or \n. The remainder of the byte -// array (also not including the new line bytes) is also returned and this will -// always be smaller than the original argument. -func getLine(data []byte) (line, rest []byte) { - i := bytes.Index(data, []byte{'\n'}) - var j int - if i < 0 { - i = len(data) - j = i - } else { - j = i + 1 - if i > 0 && data[i-1] == '\r' { - i-- - } - } - return data[0:i], data[j:] -} - -// Decode finds the first clearsigned message in data and returns it, as well -// as the suffix of data which remains after the message. -func Decode(data []byte) (b *Block, rest []byte) { - // start begins with a newline. However, at the very beginning of - // the byte array, we'll accept the start string without it. - rest = data - if bytes.HasPrefix(data, start[1:]) { - rest = rest[len(start)-1:] - } else if i := bytes.Index(data, start); i >= 0 { - rest = rest[i+len(start):] - } else { - return nil, data - } - - // Consume the start line. - _, rest = getLine(rest) - - var line []byte - b = &Block{ - Headers: make(textproto.MIMEHeader), - } - - // Next come a series of header lines. - for { - // This loop terminates because getLine's second result is - // always smaller than its argument. - if len(rest) == 0 { - return nil, data - } - // An empty line marks the end of the headers. - if line, rest = getLine(rest); len(line) == 0 { - break - } - - i := bytes.Index(line, []byte{':'}) - if i == -1 { - return nil, data - } - - key, val := line[0:i], line[i+1:] - key = bytes.TrimSpace(key) - val = bytes.TrimSpace(val) - b.Headers.Add(string(key), string(val)) - } - - firstLine := true - for { - start := rest - - line, rest = getLine(rest) - if len(line) == 0 && len(rest) == 0 { - // No armored data was found, so this isn't a complete message. - return nil, data - } - if bytes.Equal(line, endText) { - // Back up to the start of the line because armor expects to see the - // header line. - rest = start - break - } - - // The final CRLF isn't included in the hash so we don't write it until - // we've seen the next line. - if firstLine { - firstLine = false - } else { - b.Bytes = append(b.Bytes, crlf...) - } - - if bytes.HasPrefix(line, dashEscape) { - line = line[2:] - } - line = bytes.TrimRight(line, " \t") - b.Bytes = append(b.Bytes, line...) - - b.Plaintext = append(b.Plaintext, line...) - b.Plaintext = append(b.Plaintext, lf) - } - - // We want to find the extent of the armored data (including any newlines at - // the end). - i := bytes.Index(rest, end) - if i == -1 { - return nil, data - } - i += len(end) - for i < len(rest) && (rest[i] == '\r' || rest[i] == '\n') { - i++ - } - armored := rest[:i] - rest = rest[i:] - - var err error - b.ArmoredSignature, err = armor.Decode(bytes.NewBuffer(armored)) - if err != nil { - return nil, data - } - - return b, rest -} - -// A dashEscaper is an io.WriteCloser which processes the body of a clear-signed -// message. The clear-signed message is written to buffered and a hash, suitable -// for signing, is maintained in h. -// -// When closed, an armored signature is created and written to complete the -// message. -type dashEscaper struct { - buffered *bufio.Writer - h hash.Hash - hashType crypto.Hash - - atBeginningOfLine bool - isFirstLine bool - - whitespace []byte - byteBuf []byte // a one byte buffer to save allocations - - privateKey *packet.PrivateKey - config *packet.Config -} - -func (d *dashEscaper) Write(data []byte) (n int, err error) { - for _, b := range data { - d.byteBuf[0] = b - - if d.atBeginningOfLine { - // The final CRLF isn't included in the hash so we have to wait - // until this point (the start of the next line) before writing it. - if !d.isFirstLine { - d.h.Write(crlf) - } - d.isFirstLine = false - } - - // Any whitespace at the end of the line has to be removed so we - // buffer it until we find out whether there's more on this line. - if b == ' ' || b == '\t' || b == '\r' { - d.whitespace = append(d.whitespace, b) - d.atBeginningOfLine = false - continue - } - - if d.atBeginningOfLine { - // At the beginning of a line, hyphens have to be escaped. - if b == '-' { - // The signature isn't calculated over the dash-escaped text so - // the escape is only written to buffered. - if _, err = d.buffered.Write(dashEscape); err != nil { - return - } - d.h.Write(d.byteBuf) - d.atBeginningOfLine = false - } else if b == '\n' { - // Nothing to do because we delay writing CRLF to the hash. - } else { - d.h.Write(d.byteBuf) - d.atBeginningOfLine = false - } - if err = d.buffered.WriteByte(b); err != nil { - return - } - } else { - if b == '\n' { - // We got a raw \n. Drop any trailing whitespace and write a - // CRLF. - d.whitespace = d.whitespace[:0] - // We delay writing CRLF to the hash until the start of the - // next line. - if err = d.buffered.WriteByte(b); err != nil { - return - } - d.atBeginningOfLine = true - } else { - // Any buffered whitespace wasn't at the end of the line so - // we need to write it out. - if len(d.whitespace) > 0 { - d.h.Write(d.whitespace) - if _, err = d.buffered.Write(d.whitespace); err != nil { - return - } - d.whitespace = d.whitespace[:0] - } - d.h.Write(d.byteBuf) - if err = d.buffered.WriteByte(b); err != nil { - return - } - } - } - } - - n = len(data) - return -} - -func (d *dashEscaper) Close() (err error) { - if !d.atBeginningOfLine { - if err = d.buffered.WriteByte(lf); err != nil { - return - } - } - sig := new(packet.Signature) - sig.SigType = packet.SigTypeText - sig.PubKeyAlgo = d.privateKey.PubKeyAlgo - sig.Hash = d.hashType - sig.CreationTime = d.config.Now() - sig.IssuerKeyId = &d.privateKey.KeyId - - if err = sig.Sign(d.h, d.privateKey, d.config); err != nil { - return - } - - out, err := armor.Encode(d.buffered, "PGP SIGNATURE", nil) - if err != nil { - return - } - - if err = sig.Serialize(out); err != nil { - return - } - if err = out.Close(); err != nil { - return - } - if err = d.buffered.Flush(); err != nil { - return - } - return -} - -// Encode returns a WriteCloser which will clear-sign a message with privateKey -// and write it to w. If config is nil, sensible defaults are used. -func Encode(w io.Writer, privateKey *packet.PrivateKey, config *packet.Config) (plaintext io.WriteCloser, err error) { - if privateKey.Encrypted { - return nil, errors.InvalidArgumentError("signing key is encrypted") - } - - hashType := config.Hash() - name := nameOfHash(hashType) - if len(name) == 0 { - return nil, errors.UnsupportedError("unknown hash type: " + strconv.Itoa(int(hashType))) - } - - if !hashType.Available() { - return nil, errors.UnsupportedError("unsupported hash type: " + strconv.Itoa(int(hashType))) - } - h := hashType.New() - - buffered := bufio.NewWriter(w) - // start has a \n at the beginning that we don't want here. - if _, err = buffered.Write(start[1:]); err != nil { - return - } - if err = buffered.WriteByte(lf); err != nil { - return - } - if _, err = buffered.WriteString("Hash: "); err != nil { - return - } - if _, err = buffered.WriteString(name); err != nil { - return - } - if err = buffered.WriteByte(lf); err != nil { - return - } - if err = buffered.WriteByte(lf); err != nil { - return - } - - plaintext = &dashEscaper{ - buffered: buffered, - h: h, - hashType: hashType, - - atBeginningOfLine: true, - isFirstLine: true, - - byteBuf: make([]byte, 1), - - privateKey: privateKey, - config: config, - } - - return -} - -// nameOfHash returns the OpenPGP name for the given hash, or the empty string -// if the name isn't known. See RFC 4880, section 9.4. -func nameOfHash(h crypto.Hash) string { - switch h { - case crypto.MD5: - return "MD5" - case crypto.SHA1: - return "SHA1" - case crypto.RIPEMD160: - return "RIPEMD160" - case crypto.SHA224: - return "SHA224" - case crypto.SHA256: - return "SHA256" - case crypto.SHA384: - return "SHA384" - case crypto.SHA512: - return "SHA512" - } - return "" -} diff --git a/vendor/golang.org/x/crypto/openpgp/clearsign/clearsign_test.go b/vendor/golang.org/x/crypto/openpgp/clearsign/clearsign_test.go deleted file mode 100644 index 2c0948078..000000000 --- a/vendor/golang.org/x/crypto/openpgp/clearsign/clearsign_test.go +++ /dev/null @@ -1,210 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package clearsign - -import ( - "bytes" - "golang.org/x/crypto/openpgp" - "testing" -) - -func testParse(t *testing.T, input []byte, expected, expectedPlaintext string) { - b, rest := Decode(input) - if b == nil { - t.Fatal("failed to decode clearsign message") - } - if !bytes.Equal(rest, []byte("trailing")) { - t.Errorf("unexpected remaining bytes returned: %s", string(rest)) - } - if b.ArmoredSignature.Type != "PGP SIGNATURE" { - t.Errorf("bad armor type, got:%s, want:PGP SIGNATURE", b.ArmoredSignature.Type) - } - if !bytes.Equal(b.Bytes, []byte(expected)) { - t.Errorf("bad body, got:%x want:%x", b.Bytes, expected) - } - - if !bytes.Equal(b.Plaintext, []byte(expectedPlaintext)) { - t.Errorf("bad plaintext, got:%x want:%x", b.Plaintext, expectedPlaintext) - } - - keyring, err := openpgp.ReadArmoredKeyRing(bytes.NewBufferString(signingKey)) - if err != nil { - t.Errorf("failed to parse public key: %s", err) - } - - if _, err := openpgp.CheckDetachedSignature(keyring, bytes.NewBuffer(b.Bytes), b.ArmoredSignature.Body); err != nil { - t.Errorf("failed to check signature: %s", err) - } -} - -func TestParse(t *testing.T) { - testParse(t, clearsignInput, "Hello world\r\nline 2", "Hello world\nline 2\n") - testParse(t, clearsignInput2, "\r\n\r\n(This message has a couple of blank lines at the start and end.)\r\n\r\n", "\n\n(This message has a couple of blank lines at the start and end.)\n\n\n") -} - -func TestParseInvalid(t *testing.T) { - if b, _ := Decode(clearsignInput3); b != nil { - t.Fatal("decoded a bad clearsigned message without any error") - } -} - -func TestParseWithNoNewlineAtEnd(t *testing.T) { - input := clearsignInput - input = input[:len(input)-len("trailing")-1] - b, rest := Decode(input) - if b == nil { - t.Fatal("failed to decode clearsign message") - } - if len(rest) > 0 { - t.Errorf("unexpected remaining bytes returned: %s", string(rest)) - } -} - -var signingTests = []struct { - in, signed, plaintext string -}{ - {"", "", ""}, - {"a", "a", "a\n"}, - {"a\n", "a", "a\n"}, - {"-a\n", "-a", "-a\n"}, - {"--a\nb", "--a\r\nb", "--a\nb\n"}, - // leading whitespace - {" a\n", " a", " a\n"}, - {" a\n", " a", " a\n"}, - // trailing whitespace (should be stripped) - {"a \n", "a", "a\n"}, - {"a ", "a", "a\n"}, - // whitespace-only lines (should be stripped) - {" \n", "", "\n"}, - {" ", "", "\n"}, - {"a\n \n \nb\n", "a\r\n\r\n\r\nb", "a\n\n\nb\n"}, -} - -func TestSigning(t *testing.T) { - keyring, err := openpgp.ReadArmoredKeyRing(bytes.NewBufferString(signingKey)) - if err != nil { - t.Errorf("failed to parse public key: %s", err) - } - - for i, test := range signingTests { - var buf bytes.Buffer - - plaintext, err := Encode(&buf, keyring[0].PrivateKey, nil) - if err != nil { - t.Errorf("#%d: error from Encode: %s", i, err) - continue - } - if _, err := plaintext.Write([]byte(test.in)); err != nil { - t.Errorf("#%d: error from Write: %s", i, err) - continue - } - if err := plaintext.Close(); err != nil { - t.Fatalf("#%d: error from Close: %s", i, err) - continue - } - - b, _ := Decode(buf.Bytes()) - if b == nil { - t.Errorf("#%d: failed to decode clearsign message", i) - continue - } - if !bytes.Equal(b.Bytes, []byte(test.signed)) { - t.Errorf("#%d: bad result, got:%x, want:%x", i, b.Bytes, test.signed) - continue - } - if !bytes.Equal(b.Plaintext, []byte(test.plaintext)) { - t.Errorf("#%d: bad result, got:%x, want:%x", i, b.Plaintext, test.plaintext) - continue - } - - if _, err := openpgp.CheckDetachedSignature(keyring, bytes.NewBuffer(b.Bytes), b.ArmoredSignature.Body); err != nil { - t.Errorf("#%d: failed to check signature: %s", i, err) - } - } -} - -var clearsignInput = []byte(` -;lasjlkfdsa - ------BEGIN PGP SIGNED MESSAGE----- -Hash: SHA1 - -Hello world -line 2 ------BEGIN PGP SIGNATURE----- -Version: GnuPG v1.4.10 (GNU/Linux) - -iJwEAQECAAYFAk8kMuEACgkQO9o98PRieSpMsAQAhmY/vwmNpflrPgmfWsYhk5O8 -pjnBUzZwqTDoDeINjZEoPDSpQAHGhjFjgaDx/Gj4fAl0dM4D0wuUEBb6QOrwflog -2A2k9kfSOMOtk0IH/H5VuFN1Mie9L/erYXjTQIptv9t9J7NoRBMU0QOOaFU0JaO9 -MyTpno24AjIAGb+mH1U= -=hIJ6 ------END PGP SIGNATURE----- -trailing`) - -var clearsignInput2 = []byte(` -asdlfkjasdlkfjsadf - ------BEGIN PGP SIGNED MESSAGE----- -Hash: SHA256 - - - -(This message has a couple of blank lines at the start and end.) - - ------BEGIN PGP SIGNATURE----- -Version: GnuPG v1.4.11 (GNU/Linux) - -iJwEAQEIAAYFAlPpSREACgkQO9o98PRieSpZTAP+M8QUoCt/7Rf3YbXPcdzIL32v -pt1I+cMNeopzfLy0u4ioEFi8s5VkwpL1AFmirvgViCwlf82inoRxzZRiW05JQ5LI -ESEzeCoy2LIdRCQ2hcrG8pIUPzUO4TqO5D/dMbdHwNH4h5nNmGJUAEG6FpURlPm+ -qZg6BaTvOxepqOxnhVU= -=e+C6 ------END PGP SIGNATURE----- - -trailing`) - -var clearsignInput3 = []byte(` ------BEGIN PGP SIGNED MESSAGE----- -Hash: SHA256 - -(This message was truncated.) -`) - -var signingKey = `-----BEGIN PGP PRIVATE KEY BLOCK----- -Version: GnuPG v1.4.10 (GNU/Linux) - -lQHYBE2rFNoBBADFwqWQIW/DSqcB4yCQqnAFTJ27qS5AnB46ccAdw3u4Greeu3Bp -idpoHdjULy7zSKlwR1EA873dO/k/e11Ml3dlAFUinWeejWaK2ugFP6JjiieSsrKn -vWNicdCS4HTWn0X4sjl0ZiAygw6GNhqEQ3cpLeL0g8E9hnYzJKQ0LWJa0QARAQAB -AAP/TB81EIo2VYNmTq0pK1ZXwUpxCrvAAIG3hwKjEzHcbQznsjNvPUihZ+NZQ6+X -0HCfPAdPkGDCLCb6NavcSW+iNnLTrdDnSI6+3BbIONqWWdRDYJhqZCkqmG6zqSfL -IdkJgCw94taUg5BWP/AAeQrhzjChvpMQTVKQL5mnuZbUCeMCAN5qrYMP2S9iKdnk -VANIFj7656ARKt/nf4CBzxcpHTyB8+d2CtPDKCmlJP6vL8t58Jmih+kHJMvC0dzn -gr5f5+sCAOOe5gt9e0am7AvQWhdbHVfJU0TQJx+m2OiCJAqGTB1nvtBLHdJnfdC9 -TnXXQ6ZXibqLyBies/xeY2sCKL5qtTMCAKnX9+9d/5yQxRyrQUHt1NYhaXZnJbHx -q4ytu0eWz+5i68IYUSK69jJ1NWPM0T6SkqpB3KCAIv68VFm9PxqG1KmhSrQIVGVz -dCBLZXmIuAQTAQIAIgUCTasU2gIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AA -CgkQO9o98PRieSoLhgQAkLEZex02Qt7vGhZzMwuN0R22w3VwyYyjBx+fM3JFETy1 -ut4xcLJoJfIaF5ZS38UplgakHG0FQ+b49i8dMij0aZmDqGxrew1m4kBfjXw9B/v+ -eIqpODryb6cOSwyQFH0lQkXC040pjq9YqDsO5w0WYNXYKDnzRV0p4H1pweo2VDid -AdgETasU2gEEAN46UPeWRqKHvA99arOxee38fBt2CI08iiWyI8T3J6ivtFGixSqV -bRcPxYO/qLpVe5l84Nb3X71GfVXlc9hyv7CD6tcowL59hg1E/DC5ydI8K8iEpUmK -/UnHdIY5h8/kqgGxkY/T/hgp5fRQgW1ZoZxLajVlMRZ8W4tFtT0DeA+JABEBAAEA -A/0bE1jaaZKj6ndqcw86jd+QtD1SF+Cf21CWRNeLKnUds4FRRvclzTyUMuWPkUeX -TaNNsUOFqBsf6QQ2oHUBBK4VCHffHCW4ZEX2cd6umz7mpHW6XzN4DECEzOVksXtc -lUC1j4UB91DC/RNQqwX1IV2QLSwssVotPMPqhOi0ZLNY7wIA3n7DWKInxYZZ4K+6 -rQ+POsz6brEoRHwr8x6XlHenq1Oki855pSa1yXIARoTrSJkBtn5oI+f8AzrnN0BN -oyeQAwIA/7E++3HDi5aweWrViiul9cd3rcsS0dEnksPhvS0ozCJiHsq/6GFmy7J8 -QSHZPteedBnZyNp5jR+H7cIfVN3KgwH/Skq4PsuPhDq5TKK6i8Pc1WW8MA6DXTdU -nLkX7RGmMwjC0DBf7KWAlPjFaONAX3a8ndnz//fy1q7u2l9AZwrj1qa1iJ8EGAEC -AAkFAk2rFNoCGwwACgkQO9o98PRieSo2/QP/WTzr4ioINVsvN1akKuekmEMI3LAp -BfHwatufxxP1U+3Si/6YIk7kuPB9Hs+pRqCXzbvPRrI8NHZBmc8qIGthishdCYad -AHcVnXjtxrULkQFGbGvhKURLvS9WnzD/m1K2zzwxzkPTzT9/Yf06O6Mal5AdugPL -VrM0m72/jnpKo04= -=zNCn ------END PGP PRIVATE KEY BLOCK----- -` diff --git a/vendor/golang.org/x/crypto/openpgp/elgamal/elgamal.go b/vendor/golang.org/x/crypto/openpgp/elgamal/elgamal.go deleted file mode 100644 index 73f4fe378..000000000 --- a/vendor/golang.org/x/crypto/openpgp/elgamal/elgamal.go +++ /dev/null @@ -1,122 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package elgamal implements ElGamal encryption, suitable for OpenPGP, -// as specified in "A Public-Key Cryptosystem and a Signature Scheme Based on -// Discrete Logarithms," IEEE Transactions on Information Theory, v. IT-31, -// n. 4, 1985, pp. 469-472. -// -// This form of ElGamal embeds PKCS#1 v1.5 padding, which may make it -// unsuitable for other protocols. RSA should be used in preference in any -// case. -package elgamal // import "golang.org/x/crypto/openpgp/elgamal" - -import ( - "crypto/rand" - "crypto/subtle" - "errors" - "io" - "math/big" -) - -// PublicKey represents an ElGamal public key. -type PublicKey struct { - G, P, Y *big.Int -} - -// PrivateKey represents an ElGamal private key. -type PrivateKey struct { - PublicKey - X *big.Int -} - -// Encrypt encrypts the given message to the given public key. The result is a -// pair of integers. Errors can result from reading random, or because msg is -// too large to be encrypted to the public key. -func Encrypt(random io.Reader, pub *PublicKey, msg []byte) (c1, c2 *big.Int, err error) { - pLen := (pub.P.BitLen() + 7) / 8 - if len(msg) > pLen-11 { - err = errors.New("elgamal: message too long") - return - } - - // EM = 0x02 || PS || 0x00 || M - em := make([]byte, pLen-1) - em[0] = 2 - ps, mm := em[1:len(em)-len(msg)-1], em[len(em)-len(msg):] - err = nonZeroRandomBytes(ps, random) - if err != nil { - return - } - em[len(em)-len(msg)-1] = 0 - copy(mm, msg) - - m := new(big.Int).SetBytes(em) - - k, err := rand.Int(random, pub.P) - if err != nil { - return - } - - c1 = new(big.Int).Exp(pub.G, k, pub.P) - s := new(big.Int).Exp(pub.Y, k, pub.P) - c2 = s.Mul(s, m) - c2.Mod(c2, pub.P) - - return -} - -// Decrypt takes two integers, resulting from an ElGamal encryption, and -// returns the plaintext of the message. An error can result only if the -// ciphertext is invalid. Users should keep in mind that this is a padding -// oracle and thus, if exposed to an adaptive chosen ciphertext attack, can -// be used to break the cryptosystem. See ``Chosen Ciphertext Attacks -// Against Protocols Based on the RSA Encryption Standard PKCS #1'', Daniel -// Bleichenbacher, Advances in Cryptology (Crypto '98), -func Decrypt(priv *PrivateKey, c1, c2 *big.Int) (msg []byte, err error) { - s := new(big.Int).Exp(c1, priv.X, priv.P) - s.ModInverse(s, priv.P) - s.Mul(s, c2) - s.Mod(s, priv.P) - em := s.Bytes() - - firstByteIsTwo := subtle.ConstantTimeByteEq(em[0], 2) - - // The remainder of the plaintext must be a string of non-zero random - // octets, followed by a 0, followed by the message. - // lookingForIndex: 1 iff we are still looking for the zero. - // index: the offset of the first zero byte. - var lookingForIndex, index int - lookingForIndex = 1 - - for i := 1; i < len(em); i++ { - equals0 := subtle.ConstantTimeByteEq(em[i], 0) - index = subtle.ConstantTimeSelect(lookingForIndex&equals0, i, index) - lookingForIndex = subtle.ConstantTimeSelect(equals0, 0, lookingForIndex) - } - - if firstByteIsTwo != 1 || lookingForIndex != 0 || index < 9 { - return nil, errors.New("elgamal: decryption error") - } - return em[index+1:], nil -} - -// nonZeroRandomBytes fills the given slice with non-zero random octets. -func nonZeroRandomBytes(s []byte, rand io.Reader) (err error) { - _, err = io.ReadFull(rand, s) - if err != nil { - return - } - - for i := 0; i < len(s); i++ { - for s[i] == 0 { - _, err = io.ReadFull(rand, s[i:i+1]) - if err != nil { - return - } - } - } - - return -} diff --git a/vendor/golang.org/x/crypto/openpgp/elgamal/elgamal_test.go b/vendor/golang.org/x/crypto/openpgp/elgamal/elgamal_test.go deleted file mode 100644 index c4f99f5c4..000000000 --- a/vendor/golang.org/x/crypto/openpgp/elgamal/elgamal_test.go +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package elgamal - -import ( - "bytes" - "crypto/rand" - "math/big" - "testing" -) - -// This is the 1024-bit MODP group from RFC 5114, section 2.1: -const primeHex = "B10B8F96A080E01DDE92DE5EAE5D54EC52C99FBCFB06A3C69A6A9DCA52D23B616073E28675A23D189838EF1E2EE652C013ECB4AEA906112324975C3CD49B83BFACCBDD7D90C4BD7098488E9C219A73724EFFD6FAE5644738FAA31A4FF55BCCC0A151AF5F0DC8B4BD45BF37DF365C1A65E68CFDA76D4DA708DF1FB2BC2E4A4371" - -const generatorHex = "A4D1CBD5C3FD34126765A442EFB99905F8104DD258AC507FD6406CFF14266D31266FEA1E5C41564B777E690F5504F213160217B4B01B886A5E91547F9E2749F4D7FBD7D3B9A92EE1909D0D2263F80A76A6A24C087A091F531DBF0A0169B6A28AD662A4D18E73AFA32D779D5918D08BC8858F4DCEF97C2A24855E6EEB22B3B2E5" - -func fromHex(hex string) *big.Int { - n, ok := new(big.Int).SetString(hex, 16) - if !ok { - panic("failed to parse hex number") - } - return n -} - -func TestEncryptDecrypt(t *testing.T) { - priv := &PrivateKey{ - PublicKey: PublicKey{ - G: fromHex(generatorHex), - P: fromHex(primeHex), - }, - X: fromHex("42"), - } - priv.Y = new(big.Int).Exp(priv.G, priv.X, priv.P) - - message := []byte("hello world") - c1, c2, err := Encrypt(rand.Reader, &priv.PublicKey, message) - if err != nil { - t.Errorf("error encrypting: %s", err) - } - message2, err := Decrypt(priv, c1, c2) - if err != nil { - t.Errorf("error decrypting: %s", err) - } - if !bytes.Equal(message2, message) { - t.Errorf("decryption failed, got: %x, want: %x", message2, message) - } -} diff --git a/vendor/golang.org/x/crypto/openpgp/errors/errors.go b/vendor/golang.org/x/crypto/openpgp/errors/errors.go deleted file mode 100644 index eb0550b2d..000000000 --- a/vendor/golang.org/x/crypto/openpgp/errors/errors.go +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package errors contains common error types for the OpenPGP packages. -package errors // import "golang.org/x/crypto/openpgp/errors" - -import ( - "strconv" -) - -// A StructuralError is returned when OpenPGP data is found to be syntactically -// invalid. -type StructuralError string - -func (s StructuralError) Error() string { - return "openpgp: invalid data: " + string(s) -} - -// UnsupportedError indicates that, although the OpenPGP data is valid, it -// makes use of currently unimplemented features. -type UnsupportedError string - -func (s UnsupportedError) Error() string { - return "openpgp: unsupported feature: " + string(s) -} - -// InvalidArgumentError indicates that the caller is in error and passed an -// incorrect value. -type InvalidArgumentError string - -func (i InvalidArgumentError) Error() string { - return "openpgp: invalid argument: " + string(i) -} - -// SignatureError indicates that a syntactically valid signature failed to -// validate. -type SignatureError string - -func (b SignatureError) Error() string { - return "openpgp: invalid signature: " + string(b) -} - -type keyIncorrectError int - -func (ki keyIncorrectError) Error() string { - return "openpgp: incorrect key" -} - -var ErrKeyIncorrect error = keyIncorrectError(0) - -type unknownIssuerError int - -func (unknownIssuerError) Error() string { - return "openpgp: signature made by unknown entity" -} - -var ErrUnknownIssuer error = unknownIssuerError(0) - -type keyRevokedError int - -func (keyRevokedError) Error() string { - return "openpgp: signature made by revoked key" -} - -var ErrKeyRevoked error = keyRevokedError(0) - -type UnknownPacketTypeError uint8 - -func (upte UnknownPacketTypeError) Error() string { - return "openpgp: unknown packet type: " + strconv.Itoa(int(upte)) -} diff --git a/vendor/golang.org/x/crypto/openpgp/keys.go b/vendor/golang.org/x/crypto/openpgp/keys.go deleted file mode 100644 index 68b14c6ae..000000000 --- a/vendor/golang.org/x/crypto/openpgp/keys.go +++ /dev/null @@ -1,637 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package openpgp - -import ( - "crypto/rsa" - "io" - "time" - - "golang.org/x/crypto/openpgp/armor" - "golang.org/x/crypto/openpgp/errors" - "golang.org/x/crypto/openpgp/packet" -) - -// PublicKeyType is the armor type for a PGP public key. -var PublicKeyType = "PGP PUBLIC KEY BLOCK" - -// PrivateKeyType is the armor type for a PGP private key. -var PrivateKeyType = "PGP PRIVATE KEY BLOCK" - -// An Entity represents the components of an OpenPGP key: a primary public key -// (which must be a signing key), one or more identities claimed by that key, -// and zero or more subkeys, which may be encryption keys. -type Entity struct { - PrimaryKey *packet.PublicKey - PrivateKey *packet.PrivateKey - Identities map[string]*Identity // indexed by Identity.Name - Revocations []*packet.Signature - Subkeys []Subkey -} - -// An Identity represents an identity claimed by an Entity and zero or more -// assertions by other entities about that claim. -type Identity struct { - Name string // by convention, has the form "Full Name (comment) " - UserId *packet.UserId - SelfSignature *packet.Signature - Signatures []*packet.Signature -} - -// A Subkey is an additional public key in an Entity. Subkeys can be used for -// encryption. -type Subkey struct { - PublicKey *packet.PublicKey - PrivateKey *packet.PrivateKey - Sig *packet.Signature -} - -// A Key identifies a specific public key in an Entity. This is either the -// Entity's primary key or a subkey. -type Key struct { - Entity *Entity - PublicKey *packet.PublicKey - PrivateKey *packet.PrivateKey - SelfSignature *packet.Signature -} - -// A KeyRing provides access to public and private keys. -type KeyRing interface { - // KeysById returns the set of keys that have the given key id. - KeysById(id uint64) []Key - // KeysByIdAndUsage returns the set of keys with the given id - // that also meet the key usage given by requiredUsage. - // The requiredUsage is expressed as the bitwise-OR of - // packet.KeyFlag* values. - KeysByIdUsage(id uint64, requiredUsage byte) []Key - // DecryptionKeys returns all private keys that are valid for - // decryption. - DecryptionKeys() []Key -} - -// primaryIdentity returns the Identity marked as primary or the first identity -// if none are so marked. -func (e *Entity) primaryIdentity() *Identity { - var firstIdentity *Identity - for _, ident := range e.Identities { - if firstIdentity == nil { - firstIdentity = ident - } - if ident.SelfSignature.IsPrimaryId != nil && *ident.SelfSignature.IsPrimaryId { - return ident - } - } - return firstIdentity -} - -// encryptionKey returns the best candidate Key for encrypting a message to the -// given Entity. -func (e *Entity) encryptionKey(now time.Time) (Key, bool) { - candidateSubkey := -1 - - // Iterate the keys to find the newest key - var maxTime time.Time - for i, subkey := range e.Subkeys { - if subkey.Sig.FlagsValid && - subkey.Sig.FlagEncryptCommunications && - subkey.PublicKey.PubKeyAlgo.CanEncrypt() && - !subkey.Sig.KeyExpired(now) && - (maxTime.IsZero() || subkey.Sig.CreationTime.After(maxTime)) { - candidateSubkey = i - maxTime = subkey.Sig.CreationTime - } - } - - if candidateSubkey != -1 { - subkey := e.Subkeys[candidateSubkey] - return Key{e, subkey.PublicKey, subkey.PrivateKey, subkey.Sig}, true - } - - // If we don't have any candidate subkeys for encryption and - // the primary key doesn't have any usage metadata then we - // assume that the primary key is ok. Or, if the primary key is - // marked as ok to encrypt to, then we can obviously use it. - i := e.primaryIdentity() - if !i.SelfSignature.FlagsValid || i.SelfSignature.FlagEncryptCommunications && - e.PrimaryKey.PubKeyAlgo.CanEncrypt() && - !i.SelfSignature.KeyExpired(now) { - return Key{e, e.PrimaryKey, e.PrivateKey, i.SelfSignature}, true - } - - // This Entity appears to be signing only. - return Key{}, false -} - -// signingKey return the best candidate Key for signing a message with this -// Entity. -func (e *Entity) signingKey(now time.Time) (Key, bool) { - candidateSubkey := -1 - - for i, subkey := range e.Subkeys { - if subkey.Sig.FlagsValid && - subkey.Sig.FlagSign && - subkey.PublicKey.PubKeyAlgo.CanSign() && - !subkey.Sig.KeyExpired(now) { - candidateSubkey = i - break - } - } - - if candidateSubkey != -1 { - subkey := e.Subkeys[candidateSubkey] - return Key{e, subkey.PublicKey, subkey.PrivateKey, subkey.Sig}, true - } - - // If we have no candidate subkey then we assume that it's ok to sign - // with the primary key. - i := e.primaryIdentity() - if !i.SelfSignature.FlagsValid || i.SelfSignature.FlagSign && - !i.SelfSignature.KeyExpired(now) { - return Key{e, e.PrimaryKey, e.PrivateKey, i.SelfSignature}, true - } - - return Key{}, false -} - -// An EntityList contains one or more Entities. -type EntityList []*Entity - -// KeysById returns the set of keys that have the given key id. -func (el EntityList) KeysById(id uint64) (keys []Key) { - for _, e := range el { - if e.PrimaryKey.KeyId == id { - var selfSig *packet.Signature - for _, ident := range e.Identities { - if selfSig == nil { - selfSig = ident.SelfSignature - } else if ident.SelfSignature.IsPrimaryId != nil && *ident.SelfSignature.IsPrimaryId { - selfSig = ident.SelfSignature - break - } - } - keys = append(keys, Key{e, e.PrimaryKey, e.PrivateKey, selfSig}) - } - - for _, subKey := range e.Subkeys { - if subKey.PublicKey.KeyId == id { - keys = append(keys, Key{e, subKey.PublicKey, subKey.PrivateKey, subKey.Sig}) - } - } - } - return -} - -// KeysByIdAndUsage returns the set of keys with the given id that also meet -// the key usage given by requiredUsage. The requiredUsage is expressed as -// the bitwise-OR of packet.KeyFlag* values. -func (el EntityList) KeysByIdUsage(id uint64, requiredUsage byte) (keys []Key) { - for _, key := range el.KeysById(id) { - if len(key.Entity.Revocations) > 0 { - continue - } - - if key.SelfSignature.RevocationReason != nil { - continue - } - - if key.SelfSignature.FlagsValid && requiredUsage != 0 { - var usage byte - if key.SelfSignature.FlagCertify { - usage |= packet.KeyFlagCertify - } - if key.SelfSignature.FlagSign { - usage |= packet.KeyFlagSign - } - if key.SelfSignature.FlagEncryptCommunications { - usage |= packet.KeyFlagEncryptCommunications - } - if key.SelfSignature.FlagEncryptStorage { - usage |= packet.KeyFlagEncryptStorage - } - if usage&requiredUsage != requiredUsage { - continue - } - } - - keys = append(keys, key) - } - return -} - -// DecryptionKeys returns all private keys that are valid for decryption. -func (el EntityList) DecryptionKeys() (keys []Key) { - for _, e := range el { - for _, subKey := range e.Subkeys { - if subKey.PrivateKey != nil && (!subKey.Sig.FlagsValid || subKey.Sig.FlagEncryptStorage || subKey.Sig.FlagEncryptCommunications) { - keys = append(keys, Key{e, subKey.PublicKey, subKey.PrivateKey, subKey.Sig}) - } - } - } - return -} - -// ReadArmoredKeyRing reads one or more public/private keys from an armor keyring file. -func ReadArmoredKeyRing(r io.Reader) (EntityList, error) { - block, err := armor.Decode(r) - if err == io.EOF { - return nil, errors.InvalidArgumentError("no armored data found") - } - if err != nil { - return nil, err - } - if block.Type != PublicKeyType && block.Type != PrivateKeyType { - return nil, errors.InvalidArgumentError("expected public or private key block, got: " + block.Type) - } - - return ReadKeyRing(block.Body) -} - -// ReadKeyRing reads one or more public/private keys. Unsupported keys are -// ignored as long as at least a single valid key is found. -func ReadKeyRing(r io.Reader) (el EntityList, err error) { - packets := packet.NewReader(r) - var lastUnsupportedError error - - for { - var e *Entity - e, err = ReadEntity(packets) - if err != nil { - // TODO: warn about skipped unsupported/unreadable keys - if _, ok := err.(errors.UnsupportedError); ok { - lastUnsupportedError = err - err = readToNextPublicKey(packets) - } else if _, ok := err.(errors.StructuralError); ok { - // Skip unreadable, badly-formatted keys - lastUnsupportedError = err - err = readToNextPublicKey(packets) - } - if err == io.EOF { - err = nil - break - } - if err != nil { - el = nil - break - } - } else { - el = append(el, e) - } - } - - if len(el) == 0 && err == nil { - err = lastUnsupportedError - } - return -} - -// readToNextPublicKey reads packets until the start of the entity and leaves -// the first packet of the new entity in the Reader. -func readToNextPublicKey(packets *packet.Reader) (err error) { - var p packet.Packet - for { - p, err = packets.Next() - if err == io.EOF { - return - } else if err != nil { - if _, ok := err.(errors.UnsupportedError); ok { - err = nil - continue - } - return - } - - if pk, ok := p.(*packet.PublicKey); ok && !pk.IsSubkey { - packets.Unread(p) - return - } - } -} - -// ReadEntity reads an entity (public key, identities, subkeys etc) from the -// given Reader. -func ReadEntity(packets *packet.Reader) (*Entity, error) { - e := new(Entity) - e.Identities = make(map[string]*Identity) - - p, err := packets.Next() - if err != nil { - return nil, err - } - - var ok bool - if e.PrimaryKey, ok = p.(*packet.PublicKey); !ok { - if e.PrivateKey, ok = p.(*packet.PrivateKey); !ok { - packets.Unread(p) - return nil, errors.StructuralError("first packet was not a public/private key") - } else { - e.PrimaryKey = &e.PrivateKey.PublicKey - } - } - - if !e.PrimaryKey.PubKeyAlgo.CanSign() { - return nil, errors.StructuralError("primary key cannot be used for signatures") - } - - var current *Identity - var revocations []*packet.Signature -EachPacket: - for { - p, err := packets.Next() - if err == io.EOF { - break - } else if err != nil { - return nil, err - } - - switch pkt := p.(type) { - case *packet.UserId: - current = new(Identity) - current.Name = pkt.Id - current.UserId = pkt - e.Identities[pkt.Id] = current - - for { - p, err = packets.Next() - if err == io.EOF { - return nil, io.ErrUnexpectedEOF - } else if err != nil { - return nil, err - } - - sig, ok := p.(*packet.Signature) - if !ok { - return nil, errors.StructuralError("user ID packet not followed by self-signature") - } - - if (sig.SigType == packet.SigTypePositiveCert || sig.SigType == packet.SigTypeGenericCert) && sig.IssuerKeyId != nil && *sig.IssuerKeyId == e.PrimaryKey.KeyId { - if err = e.PrimaryKey.VerifyUserIdSignature(pkt.Id, e.PrimaryKey, sig); err != nil { - return nil, errors.StructuralError("user ID self-signature invalid: " + err.Error()) - } - current.SelfSignature = sig - break - } - current.Signatures = append(current.Signatures, sig) - } - case *packet.Signature: - if pkt.SigType == packet.SigTypeKeyRevocation { - revocations = append(revocations, pkt) - } else if pkt.SigType == packet.SigTypeDirectSignature { - // TODO: RFC4880 5.2.1 permits signatures - // directly on keys (eg. to bind additional - // revocation keys). - } else if current == nil { - return nil, errors.StructuralError("signature packet found before user id packet") - } else { - current.Signatures = append(current.Signatures, pkt) - } - case *packet.PrivateKey: - if pkt.IsSubkey == false { - packets.Unread(p) - break EachPacket - } - err = addSubkey(e, packets, &pkt.PublicKey, pkt) - if err != nil { - return nil, err - } - case *packet.PublicKey: - if pkt.IsSubkey == false { - packets.Unread(p) - break EachPacket - } - err = addSubkey(e, packets, pkt, nil) - if err != nil { - return nil, err - } - default: - // we ignore unknown packets - } - } - - if len(e.Identities) == 0 { - return nil, errors.StructuralError("entity without any identities") - } - - for _, revocation := range revocations { - err = e.PrimaryKey.VerifyRevocationSignature(revocation) - if err == nil { - e.Revocations = append(e.Revocations, revocation) - } else { - // TODO: RFC 4880 5.2.3.15 defines revocation keys. - return nil, errors.StructuralError("revocation signature signed by alternate key") - } - } - - return e, nil -} - -func addSubkey(e *Entity, packets *packet.Reader, pub *packet.PublicKey, priv *packet.PrivateKey) error { - var subKey Subkey - subKey.PublicKey = pub - subKey.PrivateKey = priv - p, err := packets.Next() - if err == io.EOF { - return io.ErrUnexpectedEOF - } - if err != nil { - return errors.StructuralError("subkey signature invalid: " + err.Error()) - } - var ok bool - subKey.Sig, ok = p.(*packet.Signature) - if !ok { - return errors.StructuralError("subkey packet not followed by signature") - } - if subKey.Sig.SigType != packet.SigTypeSubkeyBinding && subKey.Sig.SigType != packet.SigTypeSubkeyRevocation { - return errors.StructuralError("subkey signature with wrong type") - } - err = e.PrimaryKey.VerifyKeySignature(subKey.PublicKey, subKey.Sig) - if err != nil { - return errors.StructuralError("subkey signature invalid: " + err.Error()) - } - e.Subkeys = append(e.Subkeys, subKey) - return nil -} - -const defaultRSAKeyBits = 2048 - -// NewEntity returns an Entity that contains a fresh RSA/RSA keypair with a -// single identity composed of the given full name, comment and email, any of -// which may be empty but must not contain any of "()<>\x00". -// If config is nil, sensible defaults will be used. -func NewEntity(name, comment, email string, config *packet.Config) (*Entity, error) { - currentTime := config.Now() - - bits := defaultRSAKeyBits - if config != nil && config.RSABits != 0 { - bits = config.RSABits - } - - uid := packet.NewUserId(name, comment, email) - if uid == nil { - return nil, errors.InvalidArgumentError("user id field contained invalid characters") - } - signingPriv, err := rsa.GenerateKey(config.Random(), bits) - if err != nil { - return nil, err - } - encryptingPriv, err := rsa.GenerateKey(config.Random(), bits) - if err != nil { - return nil, err - } - - e := &Entity{ - PrimaryKey: packet.NewRSAPublicKey(currentTime, &signingPriv.PublicKey), - PrivateKey: packet.NewRSAPrivateKey(currentTime, signingPriv), - Identities: make(map[string]*Identity), - } - isPrimaryId := true - e.Identities[uid.Id] = &Identity{ - Name: uid.Name, - UserId: uid, - SelfSignature: &packet.Signature{ - CreationTime: currentTime, - SigType: packet.SigTypePositiveCert, - PubKeyAlgo: packet.PubKeyAlgoRSA, - Hash: config.Hash(), - IsPrimaryId: &isPrimaryId, - FlagsValid: true, - FlagSign: true, - FlagCertify: true, - IssuerKeyId: &e.PrimaryKey.KeyId, - }, - } - - // If the user passes in a DefaultHash via packet.Config, - // set the PreferredHash for the SelfSignature. - if config != nil && config.DefaultHash != 0 { - e.Identities[uid.Id].SelfSignature.PreferredHash = []uint8{hashToHashId(config.DefaultHash)} - } - - e.Subkeys = make([]Subkey, 1) - e.Subkeys[0] = Subkey{ - PublicKey: packet.NewRSAPublicKey(currentTime, &encryptingPriv.PublicKey), - PrivateKey: packet.NewRSAPrivateKey(currentTime, encryptingPriv), - Sig: &packet.Signature{ - CreationTime: currentTime, - SigType: packet.SigTypeSubkeyBinding, - PubKeyAlgo: packet.PubKeyAlgoRSA, - Hash: config.Hash(), - FlagsValid: true, - FlagEncryptStorage: true, - FlagEncryptCommunications: true, - IssuerKeyId: &e.PrimaryKey.KeyId, - }, - } - e.Subkeys[0].PublicKey.IsSubkey = true - e.Subkeys[0].PrivateKey.IsSubkey = true - - return e, nil -} - -// SerializePrivate serializes an Entity, including private key material, to -// the given Writer. For now, it must only be used on an Entity returned from -// NewEntity. -// If config is nil, sensible defaults will be used. -func (e *Entity) SerializePrivate(w io.Writer, config *packet.Config) (err error) { - err = e.PrivateKey.Serialize(w) - if err != nil { - return - } - for _, ident := range e.Identities { - err = ident.UserId.Serialize(w) - if err != nil { - return - } - err = ident.SelfSignature.SignUserId(ident.UserId.Id, e.PrimaryKey, e.PrivateKey, config) - if err != nil { - return - } - err = ident.SelfSignature.Serialize(w) - if err != nil { - return - } - } - for _, subkey := range e.Subkeys { - err = subkey.PrivateKey.Serialize(w) - if err != nil { - return - } - err = subkey.Sig.SignKey(subkey.PublicKey, e.PrivateKey, config) - if err != nil { - return - } - err = subkey.Sig.Serialize(w) - if err != nil { - return - } - } - return nil -} - -// Serialize writes the public part of the given Entity to w. (No private -// key material will be output). -func (e *Entity) Serialize(w io.Writer) error { - err := e.PrimaryKey.Serialize(w) - if err != nil { - return err - } - for _, ident := range e.Identities { - err = ident.UserId.Serialize(w) - if err != nil { - return err - } - err = ident.SelfSignature.Serialize(w) - if err != nil { - return err - } - for _, sig := range ident.Signatures { - err = sig.Serialize(w) - if err != nil { - return err - } - } - } - for _, subkey := range e.Subkeys { - err = subkey.PublicKey.Serialize(w) - if err != nil { - return err - } - err = subkey.Sig.Serialize(w) - if err != nil { - return err - } - } - return nil -} - -// SignIdentity adds a signature to e, from signer, attesting that identity is -// associated with e. The provided identity must already be an element of -// e.Identities and the private key of signer must have been decrypted if -// necessary. -// If config is nil, sensible defaults will be used. -func (e *Entity) SignIdentity(identity string, signer *Entity, config *packet.Config) error { - if signer.PrivateKey == nil { - return errors.InvalidArgumentError("signing Entity must have a private key") - } - if signer.PrivateKey.Encrypted { - return errors.InvalidArgumentError("signing Entity's private key must be decrypted") - } - ident, ok := e.Identities[identity] - if !ok { - return errors.InvalidArgumentError("given identity string not found in Entity") - } - - sig := &packet.Signature{ - SigType: packet.SigTypeGenericCert, - PubKeyAlgo: signer.PrivateKey.PubKeyAlgo, - Hash: config.Hash(), - CreationTime: config.Now(), - IssuerKeyId: &signer.PrivateKey.KeyId, - } - if err := sig.SignUserId(identity, e.PrimaryKey, signer.PrivateKey, config); err != nil { - return err - } - ident.Signatures = append(ident.Signatures, sig) - return nil -} diff --git a/vendor/golang.org/x/crypto/openpgp/keys_test.go b/vendor/golang.org/x/crypto/openpgp/keys_test.go deleted file mode 100644 index f768e68a6..000000000 --- a/vendor/golang.org/x/crypto/openpgp/keys_test.go +++ /dev/null @@ -1,404 +0,0 @@ -package openpgp - -import ( - "bytes" - "crypto" - "strings" - "testing" - "time" - - "golang.org/x/crypto/openpgp/errors" - "golang.org/x/crypto/openpgp/packet" -) - -func TestKeyExpiry(t *testing.T) { - kring, _ := ReadKeyRing(readerFromHex(expiringKeyHex)) - entity := kring[0] - - const timeFormat = "2006-01-02" - time1, _ := time.Parse(timeFormat, "2013-07-01") - - // The expiringKeyHex key is structured as: - // - // pub 1024R/5E237D8C created: 2013-07-01 expires: 2013-07-31 usage: SC - // sub 1024R/1ABB25A0 created: 2013-07-01 23:11:07 +0200 CEST expires: 2013-07-08 usage: E - // sub 1024R/96A672F5 created: 2013-07-01 23:11:23 +0200 CEST expires: 2013-07-31 usage: E - // - // So this should select the newest, non-expired encryption key. - key, _ := entity.encryptionKey(time1) - if id := key.PublicKey.KeyIdShortString(); id != "96A672F5" { - t.Errorf("Expected key 1ABB25A0 at time %s, but got key %s", time1.Format(timeFormat), id) - } - - // Once the first encryption subkey has expired, the second should be - // selected. - time2, _ := time.Parse(timeFormat, "2013-07-09") - key, _ = entity.encryptionKey(time2) - if id := key.PublicKey.KeyIdShortString(); id != "96A672F5" { - t.Errorf("Expected key 96A672F5 at time %s, but got key %s", time2.Format(timeFormat), id) - } - - // Once all the keys have expired, nothing should be returned. - time3, _ := time.Parse(timeFormat, "2013-08-01") - if key, ok := entity.encryptionKey(time3); ok { - t.Errorf("Expected no key at time %s, but got key %s", time3.Format(timeFormat), key.PublicKey.KeyIdShortString()) - } -} - -func TestMissingCrossSignature(t *testing.T) { - // This public key has a signing subkey, but the subkey does not - // contain a cross-signature. - keys, err := ReadArmoredKeyRing(bytes.NewBufferString(missingCrossSignatureKey)) - if len(keys) != 0 { - t.Errorf("Accepted key with missing cross signature") - } - if err == nil { - t.Fatal("Failed to detect error in keyring with missing cross signature") - } - structural, ok := err.(errors.StructuralError) - if !ok { - t.Fatalf("Unexpected class of error: %T. Wanted StructuralError", err) - } - const expectedMsg = "signing subkey is missing cross-signature" - if !strings.Contains(string(structural), expectedMsg) { - t.Fatalf("Unexpected error: %q. Expected it to contain %q", err, expectedMsg) - } -} - -func TestInvalidCrossSignature(t *testing.T) { - // This public key has a signing subkey, and the subkey has an - // embedded cross-signature. However, the cross-signature does - // not correctly validate over the primary and subkey. - keys, err := ReadArmoredKeyRing(bytes.NewBufferString(invalidCrossSignatureKey)) - if len(keys) != 0 { - t.Errorf("Accepted key with invalid cross signature") - } - if err == nil { - t.Fatal("Failed to detect error in keyring with an invalid cross signature") - } - structural, ok := err.(errors.StructuralError) - if !ok { - t.Fatalf("Unexpected class of error: %T. Wanted StructuralError", err) - } - const expectedMsg = "subkey signature invalid" - if !strings.Contains(string(structural), expectedMsg) { - t.Fatalf("Unexpected error: %q. Expected it to contain %q", err, expectedMsg) - } -} - -func TestGoodCrossSignature(t *testing.T) { - // This public key has a signing subkey, and the subkey has an - // embedded cross-signature which correctly validates over the - // primary and subkey. - keys, err := ReadArmoredKeyRing(bytes.NewBufferString(goodCrossSignatureKey)) - if err != nil { - t.Fatal(err) - } - if len(keys) != 1 { - t.Errorf("Failed to accept key with good cross signature, %d", len(keys)) - } - if len(keys[0].Subkeys) != 1 { - t.Errorf("Failed to accept good subkey, %d", len(keys[0].Subkeys)) - } -} - -// TestExternallyRevokableKey attempts to load and parse a key with a third party revocation permission. -func TestExternallyRevocableKey(t *testing.T) { - kring, _ := ReadKeyRing(readerFromHex(subkeyUsageHex)) - - // The 0xA42704B92866382A key can be revoked by 0xBE3893CB843D0FE70C - // according to this signature that appears within the key: - // :signature packet: algo 1, keyid A42704B92866382A - // version 4, created 1396409682, md5len 0, sigclass 0x1f - // digest algo 2, begin of digest a9 84 - // hashed subpkt 2 len 4 (sig created 2014-04-02) - // hashed subpkt 12 len 22 (revocation key: c=80 a=1 f=CE094AA433F7040BB2DDF0BE3893CB843D0FE70C) - // hashed subpkt 7 len 1 (not revocable) - // subpkt 16 len 8 (issuer key ID A42704B92866382A) - // data: [1024 bits] - - id := uint64(0xA42704B92866382A) - keys := kring.KeysById(id) - if len(keys) != 1 { - t.Errorf("Expected to find key id %X, but got %d matches", id, len(keys)) - } -} - -func TestKeyRevocation(t *testing.T) { - kring, _ := ReadKeyRing(readerFromHex(revokedKeyHex)) - - // revokedKeyHex contains these keys: - // pub 1024R/9A34F7C0 2014-03-25 [revoked: 2014-03-25] - // sub 1024R/1BA3CD60 2014-03-25 [revoked: 2014-03-25] - ids := []uint64{0xA401D9F09A34F7C0, 0x5CD3BE0A1BA3CD60} - - for _, id := range ids { - keys := kring.KeysById(id) - if len(keys) != 1 { - t.Errorf("Expected KeysById to find revoked key %X, but got %d matches", id, len(keys)) - } - keys = kring.KeysByIdUsage(id, 0) - if len(keys) != 0 { - t.Errorf("Expected KeysByIdUsage to filter out revoked key %X, but got %d matches", id, len(keys)) - } - } -} - -func TestSubkeyRevocation(t *testing.T) { - kring, _ := ReadKeyRing(readerFromHex(revokedSubkeyHex)) - - // revokedSubkeyHex contains these keys: - // pub 1024R/4EF7E4BECCDE97F0 2014-03-25 - // sub 1024R/D63636E2B96AE423 2014-03-25 - // sub 1024D/DBCE4EE19529437F 2014-03-25 - // sub 1024R/677815E371C2FD23 2014-03-25 [revoked: 2014-03-25] - validKeys := []uint64{0x4EF7E4BECCDE97F0, 0xD63636E2B96AE423, 0xDBCE4EE19529437F} - revokedKey := uint64(0x677815E371C2FD23) - - for _, id := range validKeys { - keys := kring.KeysById(id) - if len(keys) != 1 { - t.Errorf("Expected KeysById to find key %X, but got %d matches", id, len(keys)) - } - keys = kring.KeysByIdUsage(id, 0) - if len(keys) != 1 { - t.Errorf("Expected KeysByIdUsage to find key %X, but got %d matches", id, len(keys)) - } - } - - keys := kring.KeysById(revokedKey) - if len(keys) != 1 { - t.Errorf("Expected KeysById to find key %X, but got %d matches", revokedKey, len(keys)) - } - - keys = kring.KeysByIdUsage(revokedKey, 0) - if len(keys) != 0 { - t.Errorf("Expected KeysByIdUsage to filter out revoked key %X, but got %d matches", revokedKey, len(keys)) - } -} - -func TestKeyUsage(t *testing.T) { - kring, _ := ReadKeyRing(readerFromHex(subkeyUsageHex)) - - // subkeyUsageHex contains these keys: - // pub 1024R/2866382A created: 2014-04-01 expires: never usage: SC - // sub 1024R/936C9153 created: 2014-04-01 expires: never usage: E - // sub 1024R/64D5F5BB created: 2014-04-02 expires: never usage: E - // sub 1024D/BC0BA992 created: 2014-04-02 expires: never usage: S - certifiers := []uint64{0xA42704B92866382A} - signers := []uint64{0xA42704B92866382A, 0x42CE2C64BC0BA992} - encrypters := []uint64{0x09C0C7D9936C9153, 0xC104E98664D5F5BB} - - for _, id := range certifiers { - keys := kring.KeysByIdUsage(id, packet.KeyFlagCertify) - if len(keys) == 1 { - if keys[0].PublicKey.KeyId != id { - t.Errorf("Expected to find certifier key id %X, but got %X", id, keys[0].PublicKey.KeyId) - } - } else { - t.Errorf("Expected one match for certifier key id %X, but got %d matches", id, len(keys)) - } - } - - for _, id := range signers { - keys := kring.KeysByIdUsage(id, packet.KeyFlagSign) - if len(keys) == 1 { - if keys[0].PublicKey.KeyId != id { - t.Errorf("Expected to find signing key id %X, but got %X", id, keys[0].PublicKey.KeyId) - } - } else { - t.Errorf("Expected one match for signing key id %X, but got %d matches", id, len(keys)) - } - - // This keyring contains no encryption keys that are also good for signing. - keys = kring.KeysByIdUsage(id, packet.KeyFlagEncryptStorage|packet.KeyFlagEncryptCommunications) - if len(keys) != 0 { - t.Errorf("Unexpected match for encryption key id %X", id) - } - } - - for _, id := range encrypters { - keys := kring.KeysByIdUsage(id, packet.KeyFlagEncryptStorage|packet.KeyFlagEncryptCommunications) - if len(keys) == 1 { - if keys[0].PublicKey.KeyId != id { - t.Errorf("Expected to find encryption key id %X, but got %X", id, keys[0].PublicKey.KeyId) - } - } else { - t.Errorf("Expected one match for encryption key id %X, but got %d matches", id, len(keys)) - } - - // This keyring contains no encryption keys that are also good for signing. - keys = kring.KeysByIdUsage(id, packet.KeyFlagSign) - if len(keys) != 0 { - t.Errorf("Unexpected match for signing key id %X", id) - } - } -} - -func TestIdVerification(t *testing.T) { - kring, err := ReadKeyRing(readerFromHex(testKeys1And2PrivateHex)) - if err != nil { - t.Fatal(err) - } - if err := kring[1].PrivateKey.Decrypt([]byte("passphrase")); err != nil { - t.Fatal(err) - } - - const identity = "Test Key 1 (RSA)" - if err := kring[0].SignIdentity(identity, kring[1], nil); err != nil { - t.Fatal(err) - } - - ident, ok := kring[0].Identities[identity] - if !ok { - t.Fatal("identity missing from key after signing") - } - - checked := false - for _, sig := range ident.Signatures { - if sig.IssuerKeyId == nil || *sig.IssuerKeyId != kring[1].PrimaryKey.KeyId { - continue - } - - if err := kring[1].PrimaryKey.VerifyUserIdSignature(identity, kring[0].PrimaryKey, sig); err != nil { - t.Fatalf("error verifying new identity signature: %s", err) - } - checked = true - break - } - - if !checked { - t.Fatal("didn't find identity signature in Entity") - } -} - -func TestNewEntityWithPreferredHash(t *testing.T) { - c := &packet.Config{ - DefaultHash: crypto.SHA256, - } - entity, err := NewEntity("Golang Gopher", "Test Key", "no-reply@golang.com", c) - if err != nil { - t.Fatal(err) - } - - for _, identity := range entity.Identities { - if len(identity.SelfSignature.PreferredHash) == 0 { - t.Fatal("didn't find a preferred hash in self signature") - } - ph := hashToHashId(c.DefaultHash) - if identity.SelfSignature.PreferredHash[0] != ph { - t.Fatalf("Expected preferred hash to be %d, got %d", ph, identity.SelfSignature.PreferredHash[0]) - } - } -} - -func TestNewEntityWithoutPreferredHash(t *testing.T) { - entity, err := NewEntity("Golang Gopher", "Test Key", "no-reply@golang.com", nil) - if err != nil { - t.Fatal(err) - } - - for _, identity := range entity.Identities { - if len(identity.SelfSignature.PreferredHash) != 0 { - t.Fatalf("Expected preferred hash to be empty but got length %d", len(identity.SelfSignature.PreferredHash)) - } - } -} - -const expiringKeyHex = "988d0451d1ec5d010400ba3385721f2dc3f4ab096b2ee867ab77213f0a27a8538441c35d2fa225b08798a1439a66a5150e6bdc3f40f5d28d588c712394c632b6299f77db8c0d48d37903fb72ebd794d61be6aa774688839e5fdecfe06b2684cc115d240c98c66cb1ef22ae84e3aa0c2b0c28665c1e7d4d044e7f270706193f5223c8d44e0d70b7b8da830011010001b40f4578706972792074657374206b657988be041301020028050251d1ec5d021b03050900278d00060b090807030206150802090a0b0416020301021e01021780000a091072589ad75e237d8c033503fd10506d72837834eb7f994117740723adc39227104b0d326a1161871c0b415d25b4aedef946ca77ea4c05af9c22b32cf98be86ab890111fced1ee3f75e87b7cc3c00dc63bbc85dfab91c0dc2ad9de2c4d13a34659333a85c6acc1a669c5e1d6cecb0cf1e56c10e72d855ae177ddc9e766f9b2dda57ccbb75f57156438bbdb4e42b88d0451d1ec5d0104009c64906559866c5cb61578f5846a94fcee142a489c9b41e67b12bb54cfe86eb9bc8566460f9a720cb00d6526fbccfd4f552071a8e3f7744b1882d01036d811ee5a3fb91a1c568055758f43ba5d2c6a9676b012f3a1a89e47bbf624f1ad571b208f3cc6224eb378f1645dd3d47584463f9eadeacfd1ce6f813064fbfdcc4b5a53001101000188a504180102000f021b0c050251d1f06b050900093e89000a091072589ad75e237d8c20e00400ab8310a41461425b37889c4da28129b5fae6084fafbc0a47dd1adc74a264c6e9c9cc125f40462ee1433072a58384daef88c961c390ed06426a81b464a53194c4e291ddd7e2e2ba3efced01537d713bd111f48437bde2363446200995e8e0d4e528dda377fd1e8f8ede9c8e2198b393bd86852ce7457a7e3daf74d510461a5b77b88d0451d1ece8010400b3a519f83ab0010307e83bca895170acce8964a044190a2b368892f7a244758d9fc193482648acb1fb9780d28cc22d171931f38bb40279389fc9bf2110876d4f3db4fcfb13f22f7083877fe56592b3b65251312c36f83ffcb6d313c6a17f197dd471f0712aad15a8537b435a92471ba2e5b0c72a6c72536c3b567c558d7b6051001101000188a504180102000f021b0c050251d1f07b050900279091000a091072589ad75e237d8ce69e03fe286026afacf7c97ee20673864d4459a2240b5655219950643c7dba0ac384b1d4359c67805b21d98211f7b09c2a0ccf6410c8c04d4ff4a51293725d8d6570d9d8bb0e10c07d22357caeb49626df99c180be02d77d1fe8ed25e7a54481237646083a9f89a11566cd20b9e995b1487c5f9e02aeb434f3a1897cd416dd0a87861838da3e9e" -const subkeyUsageHex = "988d04533a52bc010400d26af43085558f65b9e7dbc90cb9238015259aed5e954637adcfa2181548b2d0b60c65f1f42ec5081cbf1bc0a8aa4900acfb77070837c58f26012fbce297d70afe96e759ad63531f0037538e70dbf8e384569b9720d99d8eb39d8d0a2947233ed242436cb6ac7dfe74123354b3d0119b5c235d3dd9c9d6c004f8ffaf67ad8583001101000188b7041f010200210502533b8552170c8001ce094aa433f7040bb2ddf0be3893cb843d0fe70c020700000a0910a42704b92866382aa98404009d63d916a27543da4221c60087c33f1c44bec9998c5438018ed370cca4962876c748e94b73eb39c58eb698063f3fd6346d58dd2a11c0247934c4a9d71f24754f7468f96fb24c3e791dd2392b62f626148ad724189498cbf993db2df7c0cdc2d677c35da0f16cb16c9ce7c33b4de65a4a91b1d21a130ae9cc26067718910ef8e2b417556d627261203c756d627261407379642e65642e61753e88b80413010200220502533a52bc021b03060b090807030206150802090a0b0416020301021e01021780000a0910a42704b92866382a47840400c0c2bd04f5fca586de408b395b3c280a278259c93eaaa8b79a53b97003f8ed502a8a00446dd9947fb462677e4fcac0dac2f0701847d15130aadb6cd9e0705ea0cf5f92f129136c7be21a718d46c8e641eb7f044f2adae573e11ae423a0a9ca51324f03a8a2f34b91fa40c3cc764bee4dccadedb54c768ba0469b683ea53f1c29b88d04533a52bc01040099c92a5d6f8b744224da27bc2369127c35269b58bec179de6bbc038f749344222f85a31933224f26b70243c4e4b2d242f0c4777eaef7b5502f9dad6d8bf3aaeb471210674b74de2d7078af497d55f5cdad97c7bedfbc1b41e8065a97c9c3d344b21fc81d27723af8e374bc595da26ea242dccb6ae497be26eea57e563ed517e90011010001889f0418010200090502533a52bc021b0c000a0910a42704b92866382afa1403ff70284c2de8a043ff51d8d29772602fa98009b7861c540535f874f2c230af8caf5638151a636b21f8255003997ccd29747fdd06777bb24f9593bd7d98a3e887689bf902f999915fcc94625ae487e5d13e6616f89090ebc4fdc7eb5cad8943e4056995bb61c6af37f8043016876a958ec7ebf39c43d20d53b7f546cfa83e8d2604b88d04533b8283010400c0b529316dbdf58b4c54461e7e669dc11c09eb7f73819f178ccd4177b9182b91d138605fcf1e463262fabefa73f94a52b5e15d1904635541c7ea540f07050ce0fb51b73e6f88644cec86e91107c957a114f69554548a85295d2b70bd0b203992f76eb5d493d86d9eabcaa7ef3fc7db7e458438db3fcdb0ca1cc97c638439a9170011010001889f0418010200090502533b8283021b0c000a0910a42704b92866382adc6d0400cfff6258485a21675adb7a811c3e19ebca18851533f75a7ba317950b9997fda8d1a4c8c76505c08c04b6c2cc31dc704d33da36a21273f2b388a1a706f7c3378b66d887197a525936ed9a69acb57fe7f718133da85ec742001c5d1864e9c6c8ea1b94f1c3759cebfd93b18606066c063a63be86085b7e37bdbc65f9a915bf084bb901a204533b85cd110400aed3d2c52af2b38b5b67904b0ef73d6dd7aef86adb770e2b153cd22489654dcc91730892087bb9856ae2d9f7ed1eb48f214243fe86bfe87b349ebd7c30e630e49c07b21fdabf78b7a95c8b7f969e97e3d33f2e074c63552ba64a2ded7badc05ce0ea2be6d53485f6900c7860c7aa76560376ce963d7271b9b54638a4028b573f00a0d8854bfcdb04986141568046202192263b9b67350400aaa1049dbc7943141ef590a70dcb028d730371d92ea4863de715f7f0f16d168bd3dc266c2450457d46dcbbf0b071547e5fbee7700a820c3750b236335d8d5848adb3c0da010e998908dfd93d961480084f3aea20b247034f8988eccb5546efaa35a92d0451df3aaf1aee5aa36a4c4d462c760ecd9cebcabfbe1412b1f21450f203fd126687cd486496e971a87fd9e1a8a765fe654baa219a6871ab97768596ab05c26c1aeea8f1a2c72395a58dbc12ef9640d2b95784e974a4d2d5a9b17c25fedacfe551bda52602de8f6d2e48443f5dd1a2a2a8e6a5e70ecdb88cd6e766ad9745c7ee91d78cc55c3d06536b49c3fee6c3d0b6ff0fb2bf13a314f57c953b8f4d93bf88e70418010200090502533b85cd021b0200520910a42704b92866382a47200419110200060502533b85cd000a091042ce2c64bc0ba99214b2009e26b26852c8b13b10c35768e40e78fbbb48bd084100a0c79d9ea0844fa5853dd3c85ff3ecae6f2c9dd6c557aa04008bbbc964cd65b9b8299d4ebf31f41cc7264b8cf33a00e82c5af022331fac79efc9563a822497ba012953cefe2629f1242fcdcb911dbb2315985bab060bfd58261ace3c654bdbbe2e8ed27a46e836490145c86dc7bae15c011f7e1ffc33730109b9338cd9f483e7cef3d2f396aab5bd80efb6646d7e778270ee99d934d187dd98" -const revokedKeyHex = "988d045331ce82010400c4fdf7b40a5477f206e6ee278eaef888ca73bf9128a9eef9f2f1ddb8b7b71a4c07cfa241f028a04edb405e4d916c61d6beabc333813dc7b484d2b3c52ee233c6a79b1eea4e9cc51596ba9cd5ac5aeb9df62d86ea051055b79d03f8a4fa9f38386f5bd17529138f3325d46801514ea9047977e0829ed728e68636802796801be10011010001889f04200102000905025331d0e3021d03000a0910a401d9f09a34f7c042aa040086631196405b7e6af71026b88e98012eab44aa9849f6ef3fa930c7c9f23deaedba9db1538830f8652fb7648ec3fcade8dbcbf9eaf428e83c6cbcc272201bfe2fbb90d41963397a7c0637a1a9d9448ce695d9790db2dc95433ad7be19eb3de72dacf1d6db82c3644c13eae2a3d072b99bb341debba012c5ce4006a7d34a1f4b94b444526567205265766f6b657220283c52656727732022424d204261726973746122204b657920262530305c303e5c29203c72656740626d626172697374612e636f2e61753e88b704130102002205025331ce82021b03060b090807030206150802090a0b0416020301021e01021780000a0910a401d9f09a34f7c0019c03f75edfbeb6a73e7225ad3cc52724e2872e04260d7daf0d693c170d8c4b243b8767bc7785763533febc62ec2600c30603c433c095453ede59ff2fcabeb84ce32e0ed9d5cf15ffcbc816202b64370d4d77c1e9077d74e94a16fb4fa2e5bec23a56d7a73cf275f91691ae1801a976fcde09e981a2f6327ac27ea1fecf3185df0d56889c04100102000605025331cfb5000a0910fe9645554e8266b64b4303fc084075396674fb6f778d302ac07cef6bc0b5d07b66b2004c44aef711cbac79617ef06d836b4957522d8772dd94bf41a2f4ac8b1ee6d70c57503f837445a74765a076d07b829b8111fc2a918423ddb817ead7ca2a613ef0bfb9c6b3562aec6c3cf3c75ef3031d81d95f6563e4cdcc9960bcb386c5d757b104fcca5fe11fc709df884604101102000605025331cfe7000a09107b15a67f0b3ddc0317f6009e360beea58f29c1d963a22b962b80788c3fa6c84e009d148cfde6b351469b8eae91187eff07ad9d08fcaab88d045331ce820104009f25e20a42b904f3fa555530fe5c46737cf7bd076c35a2a0d22b11f7e0b61a69320b768f4a80fe13980ce380d1cfc4a0cd8fbe2d2e2ef85416668b77208baa65bf973fe8e500e78cc310d7c8705cdb34328bf80e24f0385fce5845c33bc7943cf6b11b02348a23da0bf6428e57c05135f2dc6bd7c1ce325d666d5a5fd2fd5e410011010001889f04180102000905025331ce82021b0c000a0910a401d9f09a34f7c0418003fe34feafcbeaef348a800a0d908a7a6809cc7304017d820f70f0474d5e23cb17e38b67dc6dca282c6ca00961f4ec9edf2738d0f087b1d81e4871ef08e1798010863afb4eac4c44a376cb343be929c5be66a78cfd4456ae9ec6a99d97f4e1c3ff3583351db2147a65c0acef5c003fb544ab3a2e2dc4d43646f58b811a6c3a369d1f" -const revokedSubkeyHex = "988d04533121f6010400aefc803a3e4bb1a61c86e8a86d2726c6a43e0079e9f2713f1fa017e9854c83877f4aced8e331d675c67ea83ddab80aacbfa0b9040bb12d96f5a3d6be09455e2a76546cbd21677537db941cab710216b6d24ec277ee0bd65b910f416737ed120f6b93a9d3b306245c8cfd8394606fdb462e5cf43c551438d2864506c63367fc890011010001b41d416c696365203c616c69636540626d626172697374612e636f2e61753e88bb041301020025021b03060b090807030206150802090a0b0416020301021e01021780050253312798021901000a09104ef7e4beccde97f015a803ff5448437780f63263b0df8442a995e7f76c221351a51edd06f2063d8166cf3157aada4923dfc44aa0f2a6a4da5cf83b7fe722ba8ab416c976e77c6b5682e7f1069026673bd0de56ba06fd5d7a9f177607f277d9b55ff940a638c3e68525c67517e2b3d976899b93ca267f705b3e5efad7d61220e96b618a4497eab8d04403d23f8846041011020006050253312910000a09107b15a67f0b3ddc03d96e009f50b6365d86c4be5d5e9d0ea42d5e56f5794c617700a0ab274e19c2827780016d23417ce89e0a2c0d987d889c04100102000605025331cf7a000a0910a401d9f09a34f7c0ee970400aca292f213041c9f3b3fc49148cbda9d84afee6183c8dd6c5ff2600b29482db5fecd4303797be1ee6d544a20a858080fec43412061c9a71fae4039fd58013b4ae341273e6c66ad4c7cdd9e68245bedb260562e7b166f2461a1032f2b38c0e0e5715fb3d1656979e052b55ca827a76f872b78a9fdae64bc298170bfcebedc1271b41a416c696365203c616c696365407379646973702e6f722e61753e88b804130102002205025331278b021b03060b090807030206150802090a0b0416020301021e01021780000a09104ef7e4beccde97f06a7003fa03c3af68d272ebc1fa08aa72a03b02189c26496a2833d90450801c4e42c5b5f51ad96ce2d2c9cef4b7c02a6a2fcf1412d6a2d486098eb762f5010a201819c17fd2888aec8eda20c65a3b75744de7ee5cc8ac7bfc470cbe3cb982720405a27a3c6a8c229cfe36905f881b02ed5680f6a8f05866efb9d6c5844897e631deb949ca8846041011020006050253312910000a09107b15a67f0b3ddc0347bc009f7fa35db59147469eb6f2c5aaf6428accb138b22800a0caa2f5f0874bacc5909c652a57a31beda65eddd5889c04100102000605025331cf7a000a0910a401d9f09a34f7c0316403ff46f2a5c101256627f16384d34a38fb47a6c88ba60506843e532d91614339fccae5f884a5741e7582ffaf292ba38ee10a270a05f139bde3814b6a077e8cd2db0f105ebea2a83af70d385f13b507fac2ad93ff79d84950328bb86f3074745a8b7f9b64990fb142e2a12976e27e8d09a28dc5621f957ac49091116da410ac3cbde1b88d04533121f6010400cbd785b56905e4192e2fb62a720727d43c4fa487821203cf72138b884b78b701093243e1d8c92a0248a6c0203a5a88693da34af357499abacaf4b3309c640797d03093870a323b4b6f37865f6eaa2838148a67df4735d43a90ca87942554cdf1c4a751b1e75f9fd4ce4e97e278d6c1c7ed59d33441df7d084f3f02beb68896c70011010001889f0418010200090502533121f6021b0c000a09104ef7e4beccde97f0b98b03fc0a5ccf6a372995835a2f5da33b282a7d612c0ab2a97f59cf9fff73e9110981aac2858c41399afa29624a7fd8a0add11654e3d882c0fd199e161bdad65e5e2548f7b68a437ea64293db1246e3011cbb94dc1bcdeaf0f2539bd88ff16d95547144d97cead6a8c5927660a91e6db0d16eb36b7b49a3525b54d1644e65599b032b7eb901a204533127a0110400bd3edaa09eff9809c4edc2c2a0ebe52e53c50a19c1e49ab78e6167bf61473bb08f2050d78a5cbbc6ed66aff7b42cd503f16b4a0b99fa1609681fca9b7ce2bbb1a5b3864d6cdda4d7ef7849d156d534dea30fb0efb9e4cf8959a2b2ce623905882d5430b995a15c3b9fe92906086788b891002924f94abe139b42cbbfaaabe42f00a0b65dc1a1ad27d798adbcb5b5ad02d2688c89477b03ff4eebb6f7b15a73b96a96bed201c0e5e4ea27e4c6e2dd1005b94d4b90137a5b1cf5e01c6226c070c4cc999938101578877ee76d296b9aab8246d57049caacf489e80a3f40589cade790a020b1ac146d6f7a6241184b8c7fcde680eae3188f5dcbe846d7f7bdad34f6fcfca08413e19c1d5df83fc7c7c627d493492e009c2f52a80400a2fe82de87136fd2e8845888c4431b032ba29d9a29a804277e31002a8201fb8591a3e55c7a0d0881496caf8b9fb07544a5a4879291d0dc026a0ea9e5bd88eb4aa4947bbd694b25012e208a250d65ddc6f1eea59d3aed3b4ec15fcab85e2afaa23a40ab1ef9ce3e11e1bc1c34a0e758e7aa64deb8739276df0af7d4121f834a9b88e70418010200090502533127a0021b02005209104ef7e4beccde97f047200419110200060502533127a0000a0910dbce4ee19529437fe045009c0b32f5ead48ee8a7e98fac0dea3d3e6c0e2c552500a0ad71fadc5007cfaf842d9b7db3335a8cdad15d3d1a6404009b08e2c68fe8f3b45c1bb72a4b3278cdf3012aa0f229883ad74aa1f6000bb90b18301b2f85372ca5d6b9bf478d235b733b1b197d19ccca48e9daf8e890cb64546b4ce1b178faccfff07003c172a2d4f5ebaba9f57153955f3f61a9b80a4f5cb959908f8b211b03b7026a8a82fc612bfedd3794969bcf458c4ce92be215a1176ab88d045331d144010400a5063000c5aaf34953c1aa3bfc95045b3aab9882b9a8027fecfe2142dc6b47ba8aca667399990244d513dd0504716908c17d92c65e74219e004f7b83fc125e575dd58efec3ab6dd22e3580106998523dea42ec75bf9aa111734c82df54630bebdff20fe981cfc36c76f865eb1c2fb62c9e85bc3a6e5015a361a2eb1c8431578d0011010001889f04280102000905025331d433021d03000a09104ef7e4beccde97f02e5503ff5e0630d1b65291f4882b6d40a29da4616bb5088717d469fbcc3648b8276de04a04988b1f1b9f3e18f52265c1f8b6c85861691c1a6b8a3a25a1809a0b32ad330aec5667cb4262f4450649184e8113849b05e5ad06a316ea80c001e8e71838190339a6e48bbde30647bcf245134b9a97fa875c1d83a9862cae87ffd7e2c4ce3a1b89013d04180102000905025331d144021b0200a809104ef7e4beccde97f09d2004190102000605025331d144000a0910677815e371c2fd23522203fe22ab62b8e7a151383cea3edd3a12995693911426f8ccf125e1f6426388c0010f88d9ca7da2224aee8d1c12135998640c5e1813d55a93df472faae75bef858457248db41b4505827590aeccf6f9eb646da7f980655dd3050c6897feddddaca90676dee856d66db8923477d251712bb9b3186b4d0114daf7d6b59272b53218dd1da94a03ff64006fcbe71211e5daecd9961fba66cdb6de3f914882c58ba5beddeba7dcb950c1156d7fba18c19ea880dccc800eae335deec34e3b84ac75ffa24864f782f87815cda1c0f634b3dd2fa67cea30811d21723d21d9551fa12ccbcfa62b6d3a15d01307b99925707992556d50065505b090aadb8579083a20fe65bd2a270da9b011" -const missingCrossSignatureKey = `-----BEGIN PGP PUBLIC KEY BLOCK----- -Charset: UTF-8 - -mQENBFMYynYBCACVOZ3/e8Bm2b9KH9QyIlHGo/i1bnkpqsgXj8tpJ2MIUOnXMMAY -ztW7kKFLCmgVdLIC0vSoLA4yhaLcMojznh/2CcUglZeb6Ao8Gtelr//Rd5DRfPpG -zqcfUo+m+eO1co2Orabw0tZDfGpg5p3AYl0hmxhUyYSc/xUq93xL1UJzBFgYXY54 -QsM8dgeQgFseSk/YvdP5SMx1ev+eraUyiiUtWzWrWC1TdyRa5p4UZg6Rkoppf+WJ -QrW6BWrhAtqATHc8ozV7uJjeONjUEq24roRc/OFZdmQQGK6yrzKnnbA6MdHhqpdo -9kWDcXYb7pSE63Lc+OBa5X2GUVvXJLS/3nrtABEBAAG0F2ludmFsaWQtc2lnbmlu -Zy1zdWJrZXlziQEoBBMBAgASBQJTnKB5AhsBAgsHAhUIAh4BAAoJEO3UDQUIHpI/ -dN4H/idX4FQ1LIZCnpHS/oxoWQWfpRgdKAEM0qCqjMgiipJeEwSQbqjTCynuh5/R -JlODDz85ABR06aoF4l5ebGLQWFCYifPnJZ/Yf5OYcMGtb7dIbqxWVFL9iLMO/oDL -ioI3dotjPui5e+2hI9pVH1UHB/bZ/GvMGo6Zg0XxLPolKQODMVjpjLAQ0YJ3spew -RAmOGre6tIvbDsMBnm8qREt7a07cBJ6XK7xjxYaZHQBiHVxyEWDa6gyANONx8duW -/fhQ/zDTnyVM/ik6VO0Ty9BhPpcEYLFwh5c1ilFari1ta3e6qKo6ZGa9YMk/REhu -yBHd9nTkI+0CiQUmbckUiVjDKKe5AQ0EUxjKdgEIAJcXQeP+NmuciE99YcJoffxv -2gVLU4ZXBNHEaP0mgaJ1+tmMD089vUQAcyGRvw8jfsNsVZQIOAuRxY94aHQhIRHR -bUzBN28ofo/AJJtfx62C15xt6fDKRV6HXYqAiygrHIpEoRLyiN69iScUsjIJeyFL -C8wa72e8pSL6dkHoaV1N9ZH/xmrJ+k0vsgkQaAh9CzYufncDxcwkoP+aOlGtX1gP -WwWoIbz0JwLEMPHBWvDDXQcQPQTYQyj+LGC9U6f9VZHN25E94subM1MjuT9OhN9Y -MLfWaaIc5WyhLFyQKW2Upofn9wSFi8ubyBnv640Dfd0rVmaWv7LNTZpoZ/GbJAMA -EQEAAYkBHwQYAQIACQUCU5ygeQIbAgAKCRDt1A0FCB6SP0zCB/sEzaVR38vpx+OQ -MMynCBJrakiqDmUZv9xtplY7zsHSQjpd6xGflbU2n+iX99Q+nav0ETQZifNUEd4N -1ljDGQejcTyKD6Pkg6wBL3x9/RJye7Zszazm4+toJXZ8xJ3800+BtaPoI39akYJm -+ijzbskvN0v/j5GOFJwQO0pPRAFtdHqRs9Kf4YanxhedB4dIUblzlIJuKsxFit6N -lgGRblagG3Vv2eBszbxzPbJjHCgVLR3RmrVezKOsZjr/2i7X+xLWIR0uD3IN1qOW -CXQxLBizEEmSNVNxsp7KPGTLnqO3bPtqFirxS9PJLIMPTPLNBY7ZYuPNTMqVIUWF -4artDmrG -=7FfJ ------END PGP PUBLIC KEY BLOCK-----` - -const invalidCrossSignatureKey = `-----BEGIN PGP PUBLIC KEY BLOCK----- - -mQENBFMYynYBCACVOZ3/e8Bm2b9KH9QyIlHGo/i1bnkpqsgXj8tpJ2MIUOnXMMAY -ztW7kKFLCmgVdLIC0vSoLA4yhaLcMojznh/2CcUglZeb6Ao8Gtelr//Rd5DRfPpG -zqcfUo+m+eO1co2Orabw0tZDfGpg5p3AYl0hmxhUyYSc/xUq93xL1UJzBFgYXY54 -QsM8dgeQgFseSk/YvdP5SMx1ev+eraUyiiUtWzWrWC1TdyRa5p4UZg6Rkoppf+WJ -QrW6BWrhAtqATHc8ozV7uJjeONjUEq24roRc/OFZdmQQGK6yrzKnnbA6MdHhqpdo -9kWDcXYb7pSE63Lc+OBa5X2GUVvXJLS/3nrtABEBAAG0F2ludmFsaWQtc2lnbmlu -Zy1zdWJrZXlziQEoBBMBAgASBQJTnKB5AhsBAgsHAhUIAh4BAAoJEO3UDQUIHpI/ -dN4H/idX4FQ1LIZCnpHS/oxoWQWfpRgdKAEM0qCqjMgiipJeEwSQbqjTCynuh5/R -JlODDz85ABR06aoF4l5ebGLQWFCYifPnJZ/Yf5OYcMGtb7dIbqxWVFL9iLMO/oDL -ioI3dotjPui5e+2hI9pVH1UHB/bZ/GvMGo6Zg0XxLPolKQODMVjpjLAQ0YJ3spew -RAmOGre6tIvbDsMBnm8qREt7a07cBJ6XK7xjxYaZHQBiHVxyEWDa6gyANONx8duW -/fhQ/zDTnyVM/ik6VO0Ty9BhPpcEYLFwh5c1ilFari1ta3e6qKo6ZGa9YMk/REhu -yBHd9nTkI+0CiQUmbckUiVjDKKe5AQ0EUxjKdgEIAIINDqlj7X6jYKc6DjwrOkjQ -UIRWbQQar0LwmNilehmt70g5DCL1SYm9q4LcgJJ2Nhxj0/5qqsYib50OSWMcKeEe -iRXpXzv1ObpcQtI5ithp0gR53YPXBib80t3bUzomQ5UyZqAAHzMp3BKC54/vUrSK -FeRaxDzNLrCeyI00+LHNUtwghAqHvdNcsIf8VRumK8oTm3RmDh0TyjASWYbrt9c8 -R1Um3zuoACOVy+mEIgIzsfHq0u7dwYwJB5+KeM7ZLx+HGIYdUYzHuUE1sLwVoELh -+SHIGHI1HDicOjzqgajShuIjj5hZTyQySVprrsLKiXS6NEwHAP20+XjayJ/R3tEA -EQEAAYkCPgQYAQIBKAUCU5ygeQIbAsBdIAQZAQIABgUCU5ygeQAKCRCpVlnFZmhO -52RJB/9uD1MSa0wjY6tHOIgquZcP3bHBvHmrHNMw9HR2wRCMO91ZkhrpdS3ZHtgb -u3/55etj0FdvDo1tb8P8FGSVtO5Vcwf5APM8sbbqoi8L951Q3i7qt847lfhu6sMl -w0LWFvPTOLHrliZHItPRjOltS1WAWfr2jUYhsU9ytaDAJmvf9DujxEOsN5G1YJep -54JCKVCkM/y585Zcnn+yxk/XwqoNQ0/iJUT9qRrZWvoeasxhl1PQcwihCwss44A+ -YXaAt3hbk+6LEQuZoYS73yR3WHj+42tfm7YxRGeubXfgCEz/brETEWXMh4pe0vCL -bfWrmfSPq2rDegYcAybxRQz0lF8PAAoJEO3UDQUIHpI/exkH/0vQfdHA8g/N4T6E -i6b1CUVBAkvtdJpCATZjWPhXmShOw62gkDw306vHPilL4SCvEEi4KzG72zkp6VsB -DSRcpxCwT4mHue+duiy53/aRMtSJ+vDfiV1Vhq+3sWAck/yUtfDU9/u4eFaiNok1 -8/Gd7reyuZt5CiJnpdPpjCwelK21l2w7sHAnJF55ITXdOxI8oG3BRKufz0z5lyDY -s2tXYmhhQIggdgelN8LbcMhWs/PBbtUr6uZlNJG2lW1yscD4aI529VjwJlCeo745 -U7pO4eF05VViUJ2mmfoivL3tkhoTUWhx8xs8xCUcCg8DoEoSIhxtOmoTPR22Z9BL -6LCg2mg= -=Dhm4 ------END PGP PUBLIC KEY BLOCK-----` - -const goodCrossSignatureKey = `-----BEGIN PGP PUBLIC KEY BLOCK----- -Version: GnuPG v1 - -mI0EVUqeVwEEAMufHRrMPWK3gyvi0O0tABCs/oON9zV9KDZlr1a1M91ShCSFwCPo -7r80PxdWVWcj0V5h50/CJYtpN3eE/mUIgW2z1uDYQF1OzrQ8ubrksfsJvpAhENom -lTQEppv9mV8qhcM278teb7TX0pgrUHLYF5CfPdp1L957JLLXoQR/lwLVABEBAAG0 -E2dvb2Qtc2lnbmluZy1zdWJrZXmIuAQTAQIAIgUCVUqeVwIbAwYLCQgHAwIGFQgC -CQoLBBYCAwECHgECF4AACgkQNRjL95IRWP69XQQAlH6+eyXJN4DZTLX78KGjHrsw -6FCvxxClEPtPUjcJy/1KCRQmtLAt9PbbA78dvgzjDeZMZqRAwdjyJhjyg/fkU2OH -7wq4ktjUu+dLcOBb+BFMEY+YjKZhf6EJuVfxoTVr5f82XNPbYHfTho9/OABKH6kv -X70PaKZhbwnwij8Nts65AaIEVUqftREEAJ3WxZfqAX0bTDbQPf2CMT2IVMGDfhK7 -GyubOZgDFFjwUJQvHNvsrbeGLZ0xOBumLINyPO1amIfTgJNm1iiWFWfmnHReGcDl -y5mpYG60Mb79Whdcer7CMm3AqYh/dW4g6IB02NwZMKoUHo3PXmFLxMKXnWyJ0clw -R0LI/Qn509yXAKDh1SO20rqrBM+EAP2c5bfI98kyNwQAi3buu94qo3RR1ZbvfxgW -CKXDVm6N99jdZGNK7FbRifXqzJJDLcXZKLnstnC4Sd3uyfyf1uFhmDLIQRryn5m+ -LBYHfDBPN3kdm7bsZDDq9GbTHiFZUfm/tChVKXWxkhpAmHhU/tH6GGzNSMXuIWSO -aOz3Rqq0ED4NXyNKjdF9MiwD/i83S0ZBc0LmJYt4Z10jtH2B6tYdqnAK29uQaadx -yZCX2scE09UIm32/w7pV77CKr1Cp/4OzAXS1tmFzQ+bX7DR+Gl8t4wxr57VeEMvl -BGw4Vjh3X8//m3xynxycQU18Q1zJ6PkiMyPw2owZ/nss3hpSRKFJsxMLhW3fKmKr -Ey2KiOcEGAECAAkFAlVKn7UCGwIAUgkQNRjL95IRWP5HIAQZEQIABgUCVUqftQAK -CRD98VjDN10SqkWrAKDTpEY8D8HC02E/KVC5YUI01B30wgCgurpILm20kXEDCeHp -C5pygfXw1DJrhAP+NyPJ4um/bU1I+rXaHHJYroYJs8YSweiNcwiHDQn0Engh/mVZ -SqLHvbKh2dL/RXymC3+rjPvQf5cup9bPxNMa6WagdYBNAfzWGtkVISeaQW+cTEp/ -MtgVijRGXR/lGLGETPg2X3Afwn9N9bLMBkBprKgbBqU7lpaoPupxT61bL70= -=vtbN ------END PGP PUBLIC KEY BLOCK-----` diff --git a/vendor/golang.org/x/crypto/openpgp/packet/compressed.go b/vendor/golang.org/x/crypto/openpgp/packet/compressed.go deleted file mode 100644 index e8f0b5caa..000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/compressed.go +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package packet - -import ( - "compress/bzip2" - "compress/flate" - "compress/zlib" - "golang.org/x/crypto/openpgp/errors" - "io" - "strconv" -) - -// Compressed represents a compressed OpenPGP packet. The decompressed contents -// will contain more OpenPGP packets. See RFC 4880, section 5.6. -type Compressed struct { - Body io.Reader -} - -const ( - NoCompression = flate.NoCompression - BestSpeed = flate.BestSpeed - BestCompression = flate.BestCompression - DefaultCompression = flate.DefaultCompression -) - -// CompressionConfig contains compressor configuration settings. -type CompressionConfig struct { - // Level is the compression level to use. It must be set to - // between -1 and 9, with -1 causing the compressor to use the - // default compression level, 0 causing the compressor to use - // no compression and 1 to 9 representing increasing (better, - // slower) compression levels. If Level is less than -1 or - // more then 9, a non-nil error will be returned during - // encryption. See the constants above for convenient common - // settings for Level. - Level int -} - -func (c *Compressed) parse(r io.Reader) error { - var buf [1]byte - _, err := readFull(r, buf[:]) - if err != nil { - return err - } - - switch buf[0] { - case 1: - c.Body = flate.NewReader(r) - case 2: - c.Body, err = zlib.NewReader(r) - case 3: - c.Body = bzip2.NewReader(r) - default: - err = errors.UnsupportedError("unknown compression algorithm: " + strconv.Itoa(int(buf[0]))) - } - - return err -} - -// compressedWriterCloser represents the serialized compression stream -// header and the compressor. Its Close() method ensures that both the -// compressor and serialized stream header are closed. Its Write() -// method writes to the compressor. -type compressedWriteCloser struct { - sh io.Closer // Stream Header - c io.WriteCloser // Compressor -} - -func (cwc compressedWriteCloser) Write(p []byte) (int, error) { - return cwc.c.Write(p) -} - -func (cwc compressedWriteCloser) Close() (err error) { - err = cwc.c.Close() - if err != nil { - return err - } - - return cwc.sh.Close() -} - -// SerializeCompressed serializes a compressed data packet to w and -// returns a WriteCloser to which the literal data packets themselves -// can be written and which MUST be closed on completion. If cc is -// nil, sensible defaults will be used to configure the compression -// algorithm. -func SerializeCompressed(w io.WriteCloser, algo CompressionAlgo, cc *CompressionConfig) (literaldata io.WriteCloser, err error) { - compressed, err := serializeStreamHeader(w, packetTypeCompressed) - if err != nil { - return - } - - _, err = compressed.Write([]byte{uint8(algo)}) - if err != nil { - return - } - - level := DefaultCompression - if cc != nil { - level = cc.Level - } - - var compressor io.WriteCloser - switch algo { - case CompressionZIP: - compressor, err = flate.NewWriter(compressed, level) - case CompressionZLIB: - compressor, err = zlib.NewWriterLevel(compressed, level) - default: - s := strconv.Itoa(int(algo)) - err = errors.UnsupportedError("Unsupported compression algorithm: " + s) - } - if err != nil { - return - } - - literaldata = compressedWriteCloser{compressed, compressor} - - return -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/compressed_test.go b/vendor/golang.org/x/crypto/openpgp/packet/compressed_test.go deleted file mode 100644 index cb2d70bd4..000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/compressed_test.go +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package packet - -import ( - "bytes" - "encoding/hex" - "io" - "io/ioutil" - "testing" -) - -func TestCompressed(t *testing.T) { - packet, err := Read(readerFromHex(compressedHex)) - if err != nil { - t.Errorf("failed to read Compressed: %s", err) - return - } - - c, ok := packet.(*Compressed) - if !ok { - t.Error("didn't find Compressed packet") - return - } - - contents, err := ioutil.ReadAll(c.Body) - if err != nil && err != io.EOF { - t.Error(err) - return - } - - expected, _ := hex.DecodeString(compressedExpectedHex) - if !bytes.Equal(expected, contents) { - t.Errorf("got:%x want:%x", contents, expected) - } -} - -const compressedHex = "a3013b2d90c4e02b72e25f727e5e496a5e49b11e1700" -const compressedExpectedHex = "cb1062004d14c8fe636f6e74656e74732e0a" diff --git a/vendor/golang.org/x/crypto/openpgp/packet/config.go b/vendor/golang.org/x/crypto/openpgp/packet/config.go deleted file mode 100644 index c76eecc96..000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/config.go +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package packet - -import ( - "crypto" - "crypto/rand" - "io" - "time" -) - -// Config collects a number of parameters along with sensible defaults. -// A nil *Config is valid and results in all default values. -type Config struct { - // Rand provides the source of entropy. - // If nil, the crypto/rand Reader is used. - Rand io.Reader - // DefaultHash is the default hash function to be used. - // If zero, SHA-256 is used. - DefaultHash crypto.Hash - // DefaultCipher is the cipher to be used. - // If zero, AES-128 is used. - DefaultCipher CipherFunction - // Time returns the current time as the number of seconds since the - // epoch. If Time is nil, time.Now is used. - Time func() time.Time - // DefaultCompressionAlgo is the compression algorithm to be - // applied to the plaintext before encryption. If zero, no - // compression is done. - DefaultCompressionAlgo CompressionAlgo - // CompressionConfig configures the compression settings. - CompressionConfig *CompressionConfig - // S2KCount is only used for symmetric encryption. It - // determines the strength of the passphrase stretching when - // the said passphrase is hashed to produce a key. S2KCount - // should be between 1024 and 65011712, inclusive. If Config - // is nil or S2KCount is 0, the value 65536 used. Not all - // values in the above range can be represented. S2KCount will - // be rounded up to the next representable value if it cannot - // be encoded exactly. When set, it is strongly encrouraged to - // use a value that is at least 65536. See RFC 4880 Section - // 3.7.1.3. - S2KCount int - // RSABits is the number of bits in new RSA keys made with NewEntity. - // If zero, then 2048 bit keys are created. - RSABits int -} - -func (c *Config) Random() io.Reader { - if c == nil || c.Rand == nil { - return rand.Reader - } - return c.Rand -} - -func (c *Config) Hash() crypto.Hash { - if c == nil || uint(c.DefaultHash) == 0 { - return crypto.SHA256 - } - return c.DefaultHash -} - -func (c *Config) Cipher() CipherFunction { - if c == nil || uint8(c.DefaultCipher) == 0 { - return CipherAES128 - } - return c.DefaultCipher -} - -func (c *Config) Now() time.Time { - if c == nil || c.Time == nil { - return time.Now() - } - return c.Time() -} - -func (c *Config) Compression() CompressionAlgo { - if c == nil { - return CompressionNone - } - return c.DefaultCompressionAlgo -} - -func (c *Config) PasswordHashIterations() int { - if c == nil || c.S2KCount == 0 { - return 0 - } - return c.S2KCount -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/encrypted_key.go b/vendor/golang.org/x/crypto/openpgp/packet/encrypted_key.go deleted file mode 100644 index 266840d05..000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/encrypted_key.go +++ /dev/null @@ -1,199 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package packet - -import ( - "crypto/rsa" - "encoding/binary" - "io" - "math/big" - "strconv" - - "golang.org/x/crypto/openpgp/elgamal" - "golang.org/x/crypto/openpgp/errors" -) - -const encryptedKeyVersion = 3 - -// EncryptedKey represents a public-key encrypted session key. See RFC 4880, -// section 5.1. -type EncryptedKey struct { - KeyId uint64 - Algo PublicKeyAlgorithm - CipherFunc CipherFunction // only valid after a successful Decrypt - Key []byte // only valid after a successful Decrypt - - encryptedMPI1, encryptedMPI2 parsedMPI -} - -func (e *EncryptedKey) parse(r io.Reader) (err error) { - var buf [10]byte - _, err = readFull(r, buf[:]) - if err != nil { - return - } - if buf[0] != encryptedKeyVersion { - return errors.UnsupportedError("unknown EncryptedKey version " + strconv.Itoa(int(buf[0]))) - } - e.KeyId = binary.BigEndian.Uint64(buf[1:9]) - e.Algo = PublicKeyAlgorithm(buf[9]) - switch e.Algo { - case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly: - e.encryptedMPI1.bytes, e.encryptedMPI1.bitLength, err = readMPI(r) - case PubKeyAlgoElGamal: - e.encryptedMPI1.bytes, e.encryptedMPI1.bitLength, err = readMPI(r) - if err != nil { - return - } - e.encryptedMPI2.bytes, e.encryptedMPI2.bitLength, err = readMPI(r) - } - _, err = consumeAll(r) - return -} - -func checksumKeyMaterial(key []byte) uint16 { - var checksum uint16 - for _, v := range key { - checksum += uint16(v) - } - return checksum -} - -// Decrypt decrypts an encrypted session key with the given private key. The -// private key must have been decrypted first. -// If config is nil, sensible defaults will be used. -func (e *EncryptedKey) Decrypt(priv *PrivateKey, config *Config) error { - var err error - var b []byte - - // TODO(agl): use session key decryption routines here to avoid - // padding oracle attacks. - switch priv.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly: - b, err = rsa.DecryptPKCS1v15(config.Random(), priv.PrivateKey.(*rsa.PrivateKey), e.encryptedMPI1.bytes) - case PubKeyAlgoElGamal: - c1 := new(big.Int).SetBytes(e.encryptedMPI1.bytes) - c2 := new(big.Int).SetBytes(e.encryptedMPI2.bytes) - b, err = elgamal.Decrypt(priv.PrivateKey.(*elgamal.PrivateKey), c1, c2) - default: - err = errors.InvalidArgumentError("cannot decrypted encrypted session key with private key of type " + strconv.Itoa(int(priv.PubKeyAlgo))) - } - - if err != nil { - return err - } - - e.CipherFunc = CipherFunction(b[0]) - e.Key = b[1 : len(b)-2] - expectedChecksum := uint16(b[len(b)-2])<<8 | uint16(b[len(b)-1]) - checksum := checksumKeyMaterial(e.Key) - if checksum != expectedChecksum { - return errors.StructuralError("EncryptedKey checksum incorrect") - } - - return nil -} - -// Serialize writes the encrypted key packet, e, to w. -func (e *EncryptedKey) Serialize(w io.Writer) error { - var mpiLen int - switch e.Algo { - case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly: - mpiLen = 2 + len(e.encryptedMPI1.bytes) - case PubKeyAlgoElGamal: - mpiLen = 2 + len(e.encryptedMPI1.bytes) + 2 + len(e.encryptedMPI2.bytes) - default: - return errors.InvalidArgumentError("don't know how to serialize encrypted key type " + strconv.Itoa(int(e.Algo))) - } - - serializeHeader(w, packetTypeEncryptedKey, 1 /* version */ +8 /* key id */ +1 /* algo */ +mpiLen) - - w.Write([]byte{encryptedKeyVersion}) - binary.Write(w, binary.BigEndian, e.KeyId) - w.Write([]byte{byte(e.Algo)}) - - switch e.Algo { - case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly: - writeMPIs(w, e.encryptedMPI1) - case PubKeyAlgoElGamal: - writeMPIs(w, e.encryptedMPI1, e.encryptedMPI2) - default: - panic("internal error") - } - - return nil -} - -// SerializeEncryptedKey serializes an encrypted key packet to w that contains -// key, encrypted to pub. -// If config is nil, sensible defaults will be used. -func SerializeEncryptedKey(w io.Writer, pub *PublicKey, cipherFunc CipherFunction, key []byte, config *Config) error { - var buf [10]byte - buf[0] = encryptedKeyVersion - binary.BigEndian.PutUint64(buf[1:9], pub.KeyId) - buf[9] = byte(pub.PubKeyAlgo) - - keyBlock := make([]byte, 1 /* cipher type */ +len(key)+2 /* checksum */) - keyBlock[0] = byte(cipherFunc) - copy(keyBlock[1:], key) - checksum := checksumKeyMaterial(key) - keyBlock[1+len(key)] = byte(checksum >> 8) - keyBlock[1+len(key)+1] = byte(checksum) - - switch pub.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly: - return serializeEncryptedKeyRSA(w, config.Random(), buf, pub.PublicKey.(*rsa.PublicKey), keyBlock) - case PubKeyAlgoElGamal: - return serializeEncryptedKeyElGamal(w, config.Random(), buf, pub.PublicKey.(*elgamal.PublicKey), keyBlock) - case PubKeyAlgoDSA, PubKeyAlgoRSASignOnly: - return errors.InvalidArgumentError("cannot encrypt to public key of type " + strconv.Itoa(int(pub.PubKeyAlgo))) - } - - return errors.UnsupportedError("encrypting a key to public key of type " + strconv.Itoa(int(pub.PubKeyAlgo))) -} - -func serializeEncryptedKeyRSA(w io.Writer, rand io.Reader, header [10]byte, pub *rsa.PublicKey, keyBlock []byte) error { - cipherText, err := rsa.EncryptPKCS1v15(rand, pub, keyBlock) - if err != nil { - return errors.InvalidArgumentError("RSA encryption failed: " + err.Error()) - } - - packetLen := 10 /* header length */ + 2 /* mpi size */ + len(cipherText) - - err = serializeHeader(w, packetTypeEncryptedKey, packetLen) - if err != nil { - return err - } - _, err = w.Write(header[:]) - if err != nil { - return err - } - return writeMPI(w, 8*uint16(len(cipherText)), cipherText) -} - -func serializeEncryptedKeyElGamal(w io.Writer, rand io.Reader, header [10]byte, pub *elgamal.PublicKey, keyBlock []byte) error { - c1, c2, err := elgamal.Encrypt(rand, pub, keyBlock) - if err != nil { - return errors.InvalidArgumentError("ElGamal encryption failed: " + err.Error()) - } - - packetLen := 10 /* header length */ - packetLen += 2 /* mpi size */ + (c1.BitLen()+7)/8 - packetLen += 2 /* mpi size */ + (c2.BitLen()+7)/8 - - err = serializeHeader(w, packetTypeEncryptedKey, packetLen) - if err != nil { - return err - } - _, err = w.Write(header[:]) - if err != nil { - return err - } - err = writeBig(w, c1) - if err != nil { - return err - } - return writeBig(w, c2) -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/encrypted_key_test.go b/vendor/golang.org/x/crypto/openpgp/packet/encrypted_key_test.go deleted file mode 100644 index fee14cf3c..000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/encrypted_key_test.go +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package packet - -import ( - "bytes" - "crypto/rsa" - "encoding/hex" - "fmt" - "math/big" - "testing" -) - -func bigFromBase10(s string) *big.Int { - b, ok := new(big.Int).SetString(s, 10) - if !ok { - panic("bigFromBase10 failed") - } - return b -} - -var encryptedKeyPub = rsa.PublicKey{ - E: 65537, - N: bigFromBase10("115804063926007623305902631768113868327816898845124614648849934718568541074358183759250136204762053879858102352159854352727097033322663029387610959884180306668628526686121021235757016368038585212410610742029286439607686208110250133174279811431933746643015923132833417396844716207301518956640020862630546868823"), -} - -var encryptedKeyRSAPriv = &rsa.PrivateKey{ - PublicKey: encryptedKeyPub, - D: bigFromBase10("32355588668219869544751561565313228297765464314098552250409557267371233892496951383426602439009993875125222579159850054973310859166139474359774543943714622292329487391199285040721944491839695981199720170366763547754915493640685849961780092241140181198779299712578774460837139360803883139311171713302987058393"), -} - -var encryptedKeyPriv = &PrivateKey{ - PublicKey: PublicKey{ - PubKeyAlgo: PubKeyAlgoRSA, - }, - PrivateKey: encryptedKeyRSAPriv, -} - -func TestDecryptingEncryptedKey(t *testing.T) { - const encryptedKeyHex = "c18c032a67d68660df41c70104005789d0de26b6a50c985a02a13131ca829c413a35d0e6fa8d6842599252162808ac7439c72151c8c6183e76923fe3299301414d0c25a2f06a2257db3839e7df0ec964773f6e4c4ac7ff3b48c444237166dd46ba8ff443a5410dc670cb486672fdbe7c9dfafb75b4fea83af3a204fe2a7dfa86bd20122b4f3d2646cbeecb8f7be8" - const expectedKeyHex = "d930363f7e0308c333b9618617ea728963d8df993665ae7be1092d4926fd864b" - - p, err := Read(readerFromHex(encryptedKeyHex)) - if err != nil { - t.Errorf("error from Read: %s", err) - return - } - ek, ok := p.(*EncryptedKey) - if !ok { - t.Errorf("didn't parse an EncryptedKey, got %#v", p) - return - } - - if ek.KeyId != 0x2a67d68660df41c7 || ek.Algo != PubKeyAlgoRSA { - t.Errorf("unexpected EncryptedKey contents: %#v", ek) - return - } - - err = ek.Decrypt(encryptedKeyPriv, nil) - if err != nil { - t.Errorf("error from Decrypt: %s", err) - return - } - - if ek.CipherFunc != CipherAES256 { - t.Errorf("unexpected EncryptedKey contents: %#v", ek) - return - } - - keyHex := fmt.Sprintf("%x", ek.Key) - if keyHex != expectedKeyHex { - t.Errorf("bad key, got %s want %x", keyHex, expectedKeyHex) - } -} - -func TestEncryptingEncryptedKey(t *testing.T) { - key := []byte{1, 2, 3, 4} - const expectedKeyHex = "01020304" - const keyId = 42 - - pub := &PublicKey{ - PublicKey: &encryptedKeyPub, - KeyId: keyId, - PubKeyAlgo: PubKeyAlgoRSAEncryptOnly, - } - - buf := new(bytes.Buffer) - err := SerializeEncryptedKey(buf, pub, CipherAES128, key, nil) - if err != nil { - t.Errorf("error writing encrypted key packet: %s", err) - } - - p, err := Read(buf) - if err != nil { - t.Errorf("error from Read: %s", err) - return - } - ek, ok := p.(*EncryptedKey) - if !ok { - t.Errorf("didn't parse an EncryptedKey, got %#v", p) - return - } - - if ek.KeyId != keyId || ek.Algo != PubKeyAlgoRSAEncryptOnly { - t.Errorf("unexpected EncryptedKey contents: %#v", ek) - return - } - - err = ek.Decrypt(encryptedKeyPriv, nil) - if err != nil { - t.Errorf("error from Decrypt: %s", err) - return - } - - if ek.CipherFunc != CipherAES128 { - t.Errorf("unexpected EncryptedKey contents: %#v", ek) - return - } - - keyHex := fmt.Sprintf("%x", ek.Key) - if keyHex != expectedKeyHex { - t.Errorf("bad key, got %s want %x", keyHex, expectedKeyHex) - } -} - -func TestSerializingEncryptedKey(t *testing.T) { - const encryptedKeyHex = "c18c032a67d68660df41c70104005789d0de26b6a50c985a02a13131ca829c413a35d0e6fa8d6842599252162808ac7439c72151c8c6183e76923fe3299301414d0c25a2f06a2257db3839e7df0ec964773f6e4c4ac7ff3b48c444237166dd46ba8ff443a5410dc670cb486672fdbe7c9dfafb75b4fea83af3a204fe2a7dfa86bd20122b4f3d2646cbeecb8f7be8" - - p, err := Read(readerFromHex(encryptedKeyHex)) - if err != nil { - t.Fatalf("error from Read: %s", err) - } - ek, ok := p.(*EncryptedKey) - if !ok { - t.Fatalf("didn't parse an EncryptedKey, got %#v", p) - } - - var buf bytes.Buffer - ek.Serialize(&buf) - - if bufHex := hex.EncodeToString(buf.Bytes()); bufHex != encryptedKeyHex { - t.Fatalf("serialization of encrypted key differed from original. Original was %s, but reserialized as %s", encryptedKeyHex, bufHex) - } -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/literal.go b/vendor/golang.org/x/crypto/openpgp/packet/literal.go deleted file mode 100644 index 1a9ec6e51..000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/literal.go +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package packet - -import ( - "encoding/binary" - "io" -) - -// LiteralData represents an encrypted file. See RFC 4880, section 5.9. -type LiteralData struct { - IsBinary bool - FileName string - Time uint32 // Unix epoch time. Either creation time or modification time. 0 means undefined. - Body io.Reader -} - -// ForEyesOnly returns whether the contents of the LiteralData have been marked -// as especially sensitive. -func (l *LiteralData) ForEyesOnly() bool { - return l.FileName == "_CONSOLE" -} - -func (l *LiteralData) parse(r io.Reader) (err error) { - var buf [256]byte - - _, err = readFull(r, buf[:2]) - if err != nil { - return - } - - l.IsBinary = buf[0] == 'b' - fileNameLen := int(buf[1]) - - _, err = readFull(r, buf[:fileNameLen]) - if err != nil { - return - } - - l.FileName = string(buf[:fileNameLen]) - - _, err = readFull(r, buf[:4]) - if err != nil { - return - } - - l.Time = binary.BigEndian.Uint32(buf[:4]) - l.Body = r - return -} - -// SerializeLiteral serializes a literal data packet to w and returns a -// WriteCloser to which the data itself can be written and which MUST be closed -// on completion. The fileName is truncated to 255 bytes. -func SerializeLiteral(w io.WriteCloser, isBinary bool, fileName string, time uint32) (plaintext io.WriteCloser, err error) { - var buf [4]byte - buf[0] = 't' - if isBinary { - buf[0] = 'b' - } - if len(fileName) > 255 { - fileName = fileName[:255] - } - buf[1] = byte(len(fileName)) - - inner, err := serializeStreamHeader(w, packetTypeLiteralData) - if err != nil { - return - } - - _, err = inner.Write(buf[:2]) - if err != nil { - return - } - _, err = inner.Write([]byte(fileName)) - if err != nil { - return - } - binary.BigEndian.PutUint32(buf[:], time) - _, err = inner.Write(buf[:]) - if err != nil { - return - } - - plaintext = inner - return -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/ocfb.go b/vendor/golang.org/x/crypto/openpgp/packet/ocfb.go deleted file mode 100644 index ce2a33a54..000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/ocfb.go +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// OpenPGP CFB Mode. http://tools.ietf.org/html/rfc4880#section-13.9 - -package packet - -import ( - "crypto/cipher" -) - -type ocfbEncrypter struct { - b cipher.Block - fre []byte - outUsed int -} - -// An OCFBResyncOption determines if the "resynchronization step" of OCFB is -// performed. -type OCFBResyncOption bool - -const ( - OCFBResync OCFBResyncOption = true - OCFBNoResync OCFBResyncOption = false -) - -// NewOCFBEncrypter returns a cipher.Stream which encrypts data with OpenPGP's -// cipher feedback mode using the given cipher.Block, and an initial amount of -// ciphertext. randData must be random bytes and be the same length as the -// cipher.Block's block size. Resync determines if the "resynchronization step" -// from RFC 4880, 13.9 step 7 is performed. Different parts of OpenPGP vary on -// this point. -func NewOCFBEncrypter(block cipher.Block, randData []byte, resync OCFBResyncOption) (cipher.Stream, []byte) { - blockSize := block.BlockSize() - if len(randData) != blockSize { - return nil, nil - } - - x := &ocfbEncrypter{ - b: block, - fre: make([]byte, blockSize), - outUsed: 0, - } - prefix := make([]byte, blockSize+2) - - block.Encrypt(x.fre, x.fre) - for i := 0; i < blockSize; i++ { - prefix[i] = randData[i] ^ x.fre[i] - } - - block.Encrypt(x.fre, prefix[:blockSize]) - prefix[blockSize] = x.fre[0] ^ randData[blockSize-2] - prefix[blockSize+1] = x.fre[1] ^ randData[blockSize-1] - - if resync { - block.Encrypt(x.fre, prefix[2:]) - } else { - x.fre[0] = prefix[blockSize] - x.fre[1] = prefix[blockSize+1] - x.outUsed = 2 - } - return x, prefix -} - -func (x *ocfbEncrypter) XORKeyStream(dst, src []byte) { - for i := 0; i < len(src); i++ { - if x.outUsed == len(x.fre) { - x.b.Encrypt(x.fre, x.fre) - x.outUsed = 0 - } - - x.fre[x.outUsed] ^= src[i] - dst[i] = x.fre[x.outUsed] - x.outUsed++ - } -} - -type ocfbDecrypter struct { - b cipher.Block - fre []byte - outUsed int -} - -// NewOCFBDecrypter returns a cipher.Stream which decrypts data with OpenPGP's -// cipher feedback mode using the given cipher.Block. Prefix must be the first -// blockSize + 2 bytes of the ciphertext, where blockSize is the cipher.Block's -// block size. If an incorrect key is detected then nil is returned. On -// successful exit, blockSize+2 bytes of decrypted data are written into -// prefix. Resync determines if the "resynchronization step" from RFC 4880, -// 13.9 step 7 is performed. Different parts of OpenPGP vary on this point. -func NewOCFBDecrypter(block cipher.Block, prefix []byte, resync OCFBResyncOption) cipher.Stream { - blockSize := block.BlockSize() - if len(prefix) != blockSize+2 { - return nil - } - - x := &ocfbDecrypter{ - b: block, - fre: make([]byte, blockSize), - outUsed: 0, - } - prefixCopy := make([]byte, len(prefix)) - copy(prefixCopy, prefix) - - block.Encrypt(x.fre, x.fre) - for i := 0; i < blockSize; i++ { - prefixCopy[i] ^= x.fre[i] - } - - block.Encrypt(x.fre, prefix[:blockSize]) - prefixCopy[blockSize] ^= x.fre[0] - prefixCopy[blockSize+1] ^= x.fre[1] - - if prefixCopy[blockSize-2] != prefixCopy[blockSize] || - prefixCopy[blockSize-1] != prefixCopy[blockSize+1] { - return nil - } - - if resync { - block.Encrypt(x.fre, prefix[2:]) - } else { - x.fre[0] = prefix[blockSize] - x.fre[1] = prefix[blockSize+1] - x.outUsed = 2 - } - copy(prefix, prefixCopy) - return x -} - -func (x *ocfbDecrypter) XORKeyStream(dst, src []byte) { - for i := 0; i < len(src); i++ { - if x.outUsed == len(x.fre) { - x.b.Encrypt(x.fre, x.fre) - x.outUsed = 0 - } - - c := src[i] - dst[i] = x.fre[x.outUsed] ^ src[i] - x.fre[x.outUsed] = c - x.outUsed++ - } -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/ocfb_test.go b/vendor/golang.org/x/crypto/openpgp/packet/ocfb_test.go deleted file mode 100644 index 91022c042..000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/ocfb_test.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package packet - -import ( - "bytes" - "crypto/aes" - "crypto/rand" - "testing" -) - -var commonKey128 = []byte{0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c} - -func testOCFB(t *testing.T, resync OCFBResyncOption) { - block, err := aes.NewCipher(commonKey128) - if err != nil { - t.Error(err) - return - } - - plaintext := []byte("this is the plaintext, which is long enough to span several blocks.") - randData := make([]byte, block.BlockSize()) - rand.Reader.Read(randData) - ocfb, prefix := NewOCFBEncrypter(block, randData, resync) - ciphertext := make([]byte, len(plaintext)) - ocfb.XORKeyStream(ciphertext, plaintext) - - ocfbdec := NewOCFBDecrypter(block, prefix, resync) - if ocfbdec == nil { - t.Errorf("NewOCFBDecrypter failed (resync: %t)", resync) - return - } - plaintextCopy := make([]byte, len(plaintext)) - ocfbdec.XORKeyStream(plaintextCopy, ciphertext) - - if !bytes.Equal(plaintextCopy, plaintext) { - t.Errorf("got: %x, want: %x (resync: %t)", plaintextCopy, plaintext, resync) - } -} - -func TestOCFB(t *testing.T) { - testOCFB(t, OCFBNoResync) - testOCFB(t, OCFBResync) -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/one_pass_signature.go b/vendor/golang.org/x/crypto/openpgp/packet/one_pass_signature.go deleted file mode 100644 index 171350339..000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/one_pass_signature.go +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package packet - -import ( - "crypto" - "encoding/binary" - "golang.org/x/crypto/openpgp/errors" - "golang.org/x/crypto/openpgp/s2k" - "io" - "strconv" -) - -// OnePassSignature represents a one-pass signature packet. See RFC 4880, -// section 5.4. -type OnePassSignature struct { - SigType SignatureType - Hash crypto.Hash - PubKeyAlgo PublicKeyAlgorithm - KeyId uint64 - IsLast bool -} - -const onePassSignatureVersion = 3 - -func (ops *OnePassSignature) parse(r io.Reader) (err error) { - var buf [13]byte - - _, err = readFull(r, buf[:]) - if err != nil { - return - } - if buf[0] != onePassSignatureVersion { - err = errors.UnsupportedError("one-pass-signature packet version " + strconv.Itoa(int(buf[0]))) - } - - var ok bool - ops.Hash, ok = s2k.HashIdToHash(buf[2]) - if !ok { - return errors.UnsupportedError("hash function: " + strconv.Itoa(int(buf[2]))) - } - - ops.SigType = SignatureType(buf[1]) - ops.PubKeyAlgo = PublicKeyAlgorithm(buf[3]) - ops.KeyId = binary.BigEndian.Uint64(buf[4:12]) - ops.IsLast = buf[12] != 0 - return -} - -// Serialize marshals the given OnePassSignature to w. -func (ops *OnePassSignature) Serialize(w io.Writer) error { - var buf [13]byte - buf[0] = onePassSignatureVersion - buf[1] = uint8(ops.SigType) - var ok bool - buf[2], ok = s2k.HashToHashId(ops.Hash) - if !ok { - return errors.UnsupportedError("hash type: " + strconv.Itoa(int(ops.Hash))) - } - buf[3] = uint8(ops.PubKeyAlgo) - binary.BigEndian.PutUint64(buf[4:12], ops.KeyId) - if ops.IsLast { - buf[12] = 1 - } - - if err := serializeHeader(w, packetTypeOnePassSignature, len(buf)); err != nil { - return err - } - _, err := w.Write(buf[:]) - return err -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/opaque.go b/vendor/golang.org/x/crypto/openpgp/packet/opaque.go deleted file mode 100644 index 456d807f2..000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/opaque.go +++ /dev/null @@ -1,162 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package packet - -import ( - "bytes" - "io" - "io/ioutil" - - "golang.org/x/crypto/openpgp/errors" -) - -// OpaquePacket represents an OpenPGP packet as raw, unparsed data. This is -// useful for splitting and storing the original packet contents separately, -// handling unsupported packet types or accessing parts of the packet not yet -// implemented by this package. -type OpaquePacket struct { - // Packet type - Tag uint8 - // Reason why the packet was parsed opaquely - Reason error - // Binary contents of the packet data - Contents []byte -} - -func (op *OpaquePacket) parse(r io.Reader) (err error) { - op.Contents, err = ioutil.ReadAll(r) - return -} - -// Serialize marshals the packet to a writer in its original form, including -// the packet header. -func (op *OpaquePacket) Serialize(w io.Writer) (err error) { - err = serializeHeader(w, packetType(op.Tag), len(op.Contents)) - if err == nil { - _, err = w.Write(op.Contents) - } - return -} - -// Parse attempts to parse the opaque contents into a structure supported by -// this package. If the packet is not known then the result will be another -// OpaquePacket. -func (op *OpaquePacket) Parse() (p Packet, err error) { - hdr := bytes.NewBuffer(nil) - err = serializeHeader(hdr, packetType(op.Tag), len(op.Contents)) - if err != nil { - op.Reason = err - return op, err - } - p, err = Read(io.MultiReader(hdr, bytes.NewBuffer(op.Contents))) - if err != nil { - op.Reason = err - p = op - } - return -} - -// OpaqueReader reads OpaquePackets from an io.Reader. -type OpaqueReader struct { - r io.Reader -} - -func NewOpaqueReader(r io.Reader) *OpaqueReader { - return &OpaqueReader{r: r} -} - -// Read the next OpaquePacket. -func (or *OpaqueReader) Next() (op *OpaquePacket, err error) { - tag, _, contents, err := readHeader(or.r) - if err != nil { - return - } - op = &OpaquePacket{Tag: uint8(tag), Reason: err} - err = op.parse(contents) - if err != nil { - consumeAll(contents) - } - return -} - -// OpaqueSubpacket represents an unparsed OpenPGP subpacket, -// as found in signature and user attribute packets. -type OpaqueSubpacket struct { - SubType uint8 - Contents []byte -} - -// OpaqueSubpackets extracts opaque, unparsed OpenPGP subpackets from -// their byte representation. -func OpaqueSubpackets(contents []byte) (result []*OpaqueSubpacket, err error) { - var ( - subHeaderLen int - subPacket *OpaqueSubpacket - ) - for len(contents) > 0 { - subHeaderLen, subPacket, err = nextSubpacket(contents) - if err != nil { - break - } - result = append(result, subPacket) - contents = contents[subHeaderLen+len(subPacket.Contents):] - } - return -} - -func nextSubpacket(contents []byte) (subHeaderLen int, subPacket *OpaqueSubpacket, err error) { - // RFC 4880, section 5.2.3.1 - var subLen uint32 - if len(contents) < 1 { - goto Truncated - } - subPacket = &OpaqueSubpacket{} - switch { - case contents[0] < 192: - subHeaderLen = 2 // 1 length byte, 1 subtype byte - if len(contents) < subHeaderLen { - goto Truncated - } - subLen = uint32(contents[0]) - contents = contents[1:] - case contents[0] < 255: - subHeaderLen = 3 // 2 length bytes, 1 subtype - if len(contents) < subHeaderLen { - goto Truncated - } - subLen = uint32(contents[0]-192)<<8 + uint32(contents[1]) + 192 - contents = contents[2:] - default: - subHeaderLen = 6 // 5 length bytes, 1 subtype - if len(contents) < subHeaderLen { - goto Truncated - } - subLen = uint32(contents[1])<<24 | - uint32(contents[2])<<16 | - uint32(contents[3])<<8 | - uint32(contents[4]) - contents = contents[5:] - } - if subLen > uint32(len(contents)) || subLen == 0 { - goto Truncated - } - subPacket.SubType = contents[0] - subPacket.Contents = contents[1:subLen] - return -Truncated: - err = errors.StructuralError("subpacket truncated") - return -} - -func (osp *OpaqueSubpacket) Serialize(w io.Writer) (err error) { - buf := make([]byte, 6) - n := serializeSubpacketLength(buf, len(osp.Contents)+1) - buf[n] = osp.SubType - if _, err = w.Write(buf[:n+1]); err != nil { - return - } - _, err = w.Write(osp.Contents) - return -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/opaque_test.go b/vendor/golang.org/x/crypto/openpgp/packet/opaque_test.go deleted file mode 100644 index f27bbfe09..000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/opaque_test.go +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package packet - -import ( - "bytes" - "encoding/hex" - "io" - "testing" -) - -// Test packet.Read error handling in OpaquePacket.Parse, -// which attempts to re-read an OpaquePacket as a supported -// Packet type. -func TestOpaqueParseReason(t *testing.T) { - buf, err := hex.DecodeString(UnsupportedKeyHex) - if err != nil { - t.Fatal(err) - } - or := NewOpaqueReader(bytes.NewBuffer(buf)) - count := 0 - badPackets := 0 - var uid *UserId - for { - op, err := or.Next() - if err == io.EOF { - break - } else if err != nil { - t.Errorf("#%d: opaque read error: %v", count, err) - break - } - // try to parse opaque packet - p, err := op.Parse() - switch pkt := p.(type) { - case *UserId: - uid = pkt - case *OpaquePacket: - // If an OpaquePacket can't re-parse, packet.Read - // certainly had its reasons. - if pkt.Reason == nil { - t.Errorf("#%d: opaque packet, no reason", count) - } else { - badPackets++ - } - } - count++ - } - - const expectedBad = 3 - // Test post-conditions, make sure we actually parsed packets as expected. - if badPackets != expectedBad { - t.Errorf("unexpected # unparseable packets: %d (want %d)", badPackets, expectedBad) - } - if uid == nil { - t.Errorf("failed to find expected UID in unsupported keyring") - } else if uid.Id != "Armin M. Warda " { - t.Errorf("unexpected UID: %v", uid.Id) - } -} - -// This key material has public key and signature packet versions modified to -// an unsupported value (1), so that trying to parse the OpaquePacket to -// a typed packet will get an error. It also contains a GnuPG trust packet. -// (Created with: od -An -t x1 pubring.gpg | xargs | sed 's/ //g') -const UnsupportedKeyHex = `988d012e7a18a20000010400d6ac00d92b89c1f4396c243abb9b76d2e9673ad63483291fed88e22b82e255e441c078c6abbbf7d2d195e50b62eeaa915b85b0ec20c225ce2c64c167cacb6e711daf2e45da4a8356a059b8160e3b3628ac0dd8437b31f06d53d6e8ea4214d4a26406a6b63e1001406ef23e0bb3069fac9a99a91f77dfafd5de0f188a5da5e3c9000511b42741726d696e204d2e205761726461203c7761726461406e657068696c696d2e727568722e64653e8900950105102e8936c705d1eb399e58489901013f0e03ff5a0c4f421e34fcfa388129166420c08cd76987bcdec6f01bd0271459a85cc22048820dd4e44ac2c7d23908d540f54facf1b36b0d9c20488781ce9dca856531e76e2e846826e9951338020a03a09b57aa5faa82e9267458bd76105399885ac35af7dc1cbb6aaed7c39e1039f3b5beda2c0e916bd38560509bab81235d1a0ead83b0020000` diff --git a/vendor/golang.org/x/crypto/openpgp/packet/packet.go b/vendor/golang.org/x/crypto/openpgp/packet/packet.go deleted file mode 100644 index 3eded93f0..000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/packet.go +++ /dev/null @@ -1,537 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package packet implements parsing and serialization of OpenPGP packets, as -// specified in RFC 4880. -package packet // import "golang.org/x/crypto/openpgp/packet" - -import ( - "bufio" - "crypto/aes" - "crypto/cipher" - "crypto/des" - "golang.org/x/crypto/cast5" - "golang.org/x/crypto/openpgp/errors" - "io" - "math/big" -) - -// readFull is the same as io.ReadFull except that reading zero bytes returns -// ErrUnexpectedEOF rather than EOF. -func readFull(r io.Reader, buf []byte) (n int, err error) { - n, err = io.ReadFull(r, buf) - if err == io.EOF { - err = io.ErrUnexpectedEOF - } - return -} - -// readLength reads an OpenPGP length from r. See RFC 4880, section 4.2.2. -func readLength(r io.Reader) (length int64, isPartial bool, err error) { - var buf [4]byte - _, err = readFull(r, buf[:1]) - if err != nil { - return - } - switch { - case buf[0] < 192: - length = int64(buf[0]) - case buf[0] < 224: - length = int64(buf[0]-192) << 8 - _, err = readFull(r, buf[0:1]) - if err != nil { - return - } - length += int64(buf[0]) + 192 - case buf[0] < 255: - length = int64(1) << (buf[0] & 0x1f) - isPartial = true - default: - _, err = readFull(r, buf[0:4]) - if err != nil { - return - } - length = int64(buf[0])<<24 | - int64(buf[1])<<16 | - int64(buf[2])<<8 | - int64(buf[3]) - } - return -} - -// partialLengthReader wraps an io.Reader and handles OpenPGP partial lengths. -// The continuation lengths are parsed and removed from the stream and EOF is -// returned at the end of the packet. See RFC 4880, section 4.2.2.4. -type partialLengthReader struct { - r io.Reader - remaining int64 - isPartial bool -} - -func (r *partialLengthReader) Read(p []byte) (n int, err error) { - for r.remaining == 0 { - if !r.isPartial { - return 0, io.EOF - } - r.remaining, r.isPartial, err = readLength(r.r) - if err != nil { - return 0, err - } - } - - toRead := int64(len(p)) - if toRead > r.remaining { - toRead = r.remaining - } - - n, err = r.r.Read(p[:int(toRead)]) - r.remaining -= int64(n) - if n < int(toRead) && err == io.EOF { - err = io.ErrUnexpectedEOF - } - return -} - -// partialLengthWriter writes a stream of data using OpenPGP partial lengths. -// See RFC 4880, section 4.2.2.4. -type partialLengthWriter struct { - w io.WriteCloser - lengthByte [1]byte -} - -func (w *partialLengthWriter) Write(p []byte) (n int, err error) { - for len(p) > 0 { - for power := uint(14); power < 32; power-- { - l := 1 << power - if len(p) >= l { - w.lengthByte[0] = 224 + uint8(power) - _, err = w.w.Write(w.lengthByte[:]) - if err != nil { - return - } - var m int - m, err = w.w.Write(p[:l]) - n += m - if err != nil { - return - } - p = p[l:] - break - } - } - } - return -} - -func (w *partialLengthWriter) Close() error { - w.lengthByte[0] = 0 - _, err := w.w.Write(w.lengthByte[:]) - if err != nil { - return err - } - return w.w.Close() -} - -// A spanReader is an io.LimitReader, but it returns ErrUnexpectedEOF if the -// underlying Reader returns EOF before the limit has been reached. -type spanReader struct { - r io.Reader - n int64 -} - -func (l *spanReader) Read(p []byte) (n int, err error) { - if l.n <= 0 { - return 0, io.EOF - } - if int64(len(p)) > l.n { - p = p[0:l.n] - } - n, err = l.r.Read(p) - l.n -= int64(n) - if l.n > 0 && err == io.EOF { - err = io.ErrUnexpectedEOF - } - return -} - -// readHeader parses a packet header and returns an io.Reader which will return -// the contents of the packet. See RFC 4880, section 4.2. -func readHeader(r io.Reader) (tag packetType, length int64, contents io.Reader, err error) { - var buf [4]byte - _, err = io.ReadFull(r, buf[:1]) - if err != nil { - return - } - if buf[0]&0x80 == 0 { - err = errors.StructuralError("tag byte does not have MSB set") - return - } - if buf[0]&0x40 == 0 { - // Old format packet - tag = packetType((buf[0] & 0x3f) >> 2) - lengthType := buf[0] & 3 - if lengthType == 3 { - length = -1 - contents = r - return - } - lengthBytes := 1 << lengthType - _, err = readFull(r, buf[0:lengthBytes]) - if err != nil { - return - } - for i := 0; i < lengthBytes; i++ { - length <<= 8 - length |= int64(buf[i]) - } - contents = &spanReader{r, length} - return - } - - // New format packet - tag = packetType(buf[0] & 0x3f) - length, isPartial, err := readLength(r) - if err != nil { - return - } - if isPartial { - contents = &partialLengthReader{ - remaining: length, - isPartial: true, - r: r, - } - length = -1 - } else { - contents = &spanReader{r, length} - } - return -} - -// serializeHeader writes an OpenPGP packet header to w. See RFC 4880, section -// 4.2. -func serializeHeader(w io.Writer, ptype packetType, length int) (err error) { - var buf [6]byte - var n int - - buf[0] = 0x80 | 0x40 | byte(ptype) - if length < 192 { - buf[1] = byte(length) - n = 2 - } else if length < 8384 { - length -= 192 - buf[1] = 192 + byte(length>>8) - buf[2] = byte(length) - n = 3 - } else { - buf[1] = 255 - buf[2] = byte(length >> 24) - buf[3] = byte(length >> 16) - buf[4] = byte(length >> 8) - buf[5] = byte(length) - n = 6 - } - - _, err = w.Write(buf[:n]) - return -} - -// serializeStreamHeader writes an OpenPGP packet header to w where the -// length of the packet is unknown. It returns a io.WriteCloser which can be -// used to write the contents of the packet. See RFC 4880, section 4.2. -func serializeStreamHeader(w io.WriteCloser, ptype packetType) (out io.WriteCloser, err error) { - var buf [1]byte - buf[0] = 0x80 | 0x40 | byte(ptype) - _, err = w.Write(buf[:]) - if err != nil { - return - } - out = &partialLengthWriter{w: w} - return -} - -// Packet represents an OpenPGP packet. Users are expected to try casting -// instances of this interface to specific packet types. -type Packet interface { - parse(io.Reader) error -} - -// consumeAll reads from the given Reader until error, returning the number of -// bytes read. -func consumeAll(r io.Reader) (n int64, err error) { - var m int - var buf [1024]byte - - for { - m, err = r.Read(buf[:]) - n += int64(m) - if err == io.EOF { - err = nil - return - } - if err != nil { - return - } - } -} - -// packetType represents the numeric ids of the different OpenPGP packet types. See -// http://www.iana.org/assignments/pgp-parameters/pgp-parameters.xhtml#pgp-parameters-2 -type packetType uint8 - -const ( - packetTypeEncryptedKey packetType = 1 - packetTypeSignature packetType = 2 - packetTypeSymmetricKeyEncrypted packetType = 3 - packetTypeOnePassSignature packetType = 4 - packetTypePrivateKey packetType = 5 - packetTypePublicKey packetType = 6 - packetTypePrivateSubkey packetType = 7 - packetTypeCompressed packetType = 8 - packetTypeSymmetricallyEncrypted packetType = 9 - packetTypeLiteralData packetType = 11 - packetTypeUserId packetType = 13 - packetTypePublicSubkey packetType = 14 - packetTypeUserAttribute packetType = 17 - packetTypeSymmetricallyEncryptedMDC packetType = 18 -) - -// peekVersion detects the version of a public key packet about to -// be read. A bufio.Reader at the original position of the io.Reader -// is returned. -func peekVersion(r io.Reader) (bufr *bufio.Reader, ver byte, err error) { - bufr = bufio.NewReader(r) - var verBuf []byte - if verBuf, err = bufr.Peek(1); err != nil { - return - } - ver = verBuf[0] - return -} - -// Read reads a single OpenPGP packet from the given io.Reader. If there is an -// error parsing a packet, the whole packet is consumed from the input. -func Read(r io.Reader) (p Packet, err error) { - tag, _, contents, err := readHeader(r) - if err != nil { - return - } - - switch tag { - case packetTypeEncryptedKey: - p = new(EncryptedKey) - case packetTypeSignature: - var version byte - // Detect signature version - if contents, version, err = peekVersion(contents); err != nil { - return - } - if version < 4 { - p = new(SignatureV3) - } else { - p = new(Signature) - } - case packetTypeSymmetricKeyEncrypted: - p = new(SymmetricKeyEncrypted) - case packetTypeOnePassSignature: - p = new(OnePassSignature) - case packetTypePrivateKey, packetTypePrivateSubkey: - pk := new(PrivateKey) - if tag == packetTypePrivateSubkey { - pk.IsSubkey = true - } - p = pk - case packetTypePublicKey, packetTypePublicSubkey: - var version byte - if contents, version, err = peekVersion(contents); err != nil { - return - } - isSubkey := tag == packetTypePublicSubkey - if version < 4 { - p = &PublicKeyV3{IsSubkey: isSubkey} - } else { - p = &PublicKey{IsSubkey: isSubkey} - } - case packetTypeCompressed: - p = new(Compressed) - case packetTypeSymmetricallyEncrypted: - p = new(SymmetricallyEncrypted) - case packetTypeLiteralData: - p = new(LiteralData) - case packetTypeUserId: - p = new(UserId) - case packetTypeUserAttribute: - p = new(UserAttribute) - case packetTypeSymmetricallyEncryptedMDC: - se := new(SymmetricallyEncrypted) - se.MDC = true - p = se - default: - err = errors.UnknownPacketTypeError(tag) - } - if p != nil { - err = p.parse(contents) - } - if err != nil { - consumeAll(contents) - } - return -} - -// SignatureType represents the different semantic meanings of an OpenPGP -// signature. See RFC 4880, section 5.2.1. -type SignatureType uint8 - -const ( - SigTypeBinary SignatureType = 0 - SigTypeText = 1 - SigTypeGenericCert = 0x10 - SigTypePersonaCert = 0x11 - SigTypeCasualCert = 0x12 - SigTypePositiveCert = 0x13 - SigTypeSubkeyBinding = 0x18 - SigTypePrimaryKeyBinding = 0x19 - SigTypeDirectSignature = 0x1F - SigTypeKeyRevocation = 0x20 - SigTypeSubkeyRevocation = 0x28 -) - -// PublicKeyAlgorithm represents the different public key system specified for -// OpenPGP. See -// http://www.iana.org/assignments/pgp-parameters/pgp-parameters.xhtml#pgp-parameters-12 -type PublicKeyAlgorithm uint8 - -const ( - PubKeyAlgoRSA PublicKeyAlgorithm = 1 - PubKeyAlgoRSAEncryptOnly PublicKeyAlgorithm = 2 - PubKeyAlgoRSASignOnly PublicKeyAlgorithm = 3 - PubKeyAlgoElGamal PublicKeyAlgorithm = 16 - PubKeyAlgoDSA PublicKeyAlgorithm = 17 - // RFC 6637, Section 5. - PubKeyAlgoECDH PublicKeyAlgorithm = 18 - PubKeyAlgoECDSA PublicKeyAlgorithm = 19 -) - -// CanEncrypt returns true if it's possible to encrypt a message to a public -// key of the given type. -func (pka PublicKeyAlgorithm) CanEncrypt() bool { - switch pka { - case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoElGamal: - return true - } - return false -} - -// CanSign returns true if it's possible for a public key of the given type to -// sign a message. -func (pka PublicKeyAlgorithm) CanSign() bool { - switch pka { - case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly, PubKeyAlgoDSA, PubKeyAlgoECDSA: - return true - } - return false -} - -// CipherFunction represents the different block ciphers specified for OpenPGP. See -// http://www.iana.org/assignments/pgp-parameters/pgp-parameters.xhtml#pgp-parameters-13 -type CipherFunction uint8 - -const ( - Cipher3DES CipherFunction = 2 - CipherCAST5 CipherFunction = 3 - CipherAES128 CipherFunction = 7 - CipherAES192 CipherFunction = 8 - CipherAES256 CipherFunction = 9 -) - -// KeySize returns the key size, in bytes, of cipher. -func (cipher CipherFunction) KeySize() int { - switch cipher { - case Cipher3DES: - return 24 - case CipherCAST5: - return cast5.KeySize - case CipherAES128: - return 16 - case CipherAES192: - return 24 - case CipherAES256: - return 32 - } - return 0 -} - -// blockSize returns the block size, in bytes, of cipher. -func (cipher CipherFunction) blockSize() int { - switch cipher { - case Cipher3DES: - return des.BlockSize - case CipherCAST5: - return 8 - case CipherAES128, CipherAES192, CipherAES256: - return 16 - } - return 0 -} - -// new returns a fresh instance of the given cipher. -func (cipher CipherFunction) new(key []byte) (block cipher.Block) { - switch cipher { - case Cipher3DES: - block, _ = des.NewTripleDESCipher(key) - case CipherCAST5: - block, _ = cast5.NewCipher(key) - case CipherAES128, CipherAES192, CipherAES256: - block, _ = aes.NewCipher(key) - } - return -} - -// readMPI reads a big integer from r. The bit length returned is the bit -// length that was specified in r. This is preserved so that the integer can be -// reserialized exactly. -func readMPI(r io.Reader) (mpi []byte, bitLength uint16, err error) { - var buf [2]byte - _, err = readFull(r, buf[0:]) - if err != nil { - return - } - bitLength = uint16(buf[0])<<8 | uint16(buf[1]) - numBytes := (int(bitLength) + 7) / 8 - mpi = make([]byte, numBytes) - _, err = readFull(r, mpi) - return -} - -// mpiLength returns the length of the given *big.Int when serialized as an -// MPI. -func mpiLength(n *big.Int) (mpiLengthInBytes int) { - mpiLengthInBytes = 2 /* MPI length */ - mpiLengthInBytes += (n.BitLen() + 7) / 8 - return -} - -// writeMPI serializes a big integer to w. -func writeMPI(w io.Writer, bitLength uint16, mpiBytes []byte) (err error) { - _, err = w.Write([]byte{byte(bitLength >> 8), byte(bitLength)}) - if err == nil { - _, err = w.Write(mpiBytes) - } - return -} - -// writeBig serializes a *big.Int to w. -func writeBig(w io.Writer, i *big.Int) error { - return writeMPI(w, uint16(i.BitLen()), i.Bytes()) -} - -// CompressionAlgo Represents the different compression algorithms -// supported by OpenPGP (except for BZIP2, which is not currently -// supported). See Section 9.3 of RFC 4880. -type CompressionAlgo uint8 - -const ( - CompressionNone CompressionAlgo = 0 - CompressionZIP CompressionAlgo = 1 - CompressionZLIB CompressionAlgo = 2 -) diff --git a/vendor/golang.org/x/crypto/openpgp/packet/packet_test.go b/vendor/golang.org/x/crypto/openpgp/packet/packet_test.go deleted file mode 100644 index 1dab5c3d5..000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/packet_test.go +++ /dev/null @@ -1,255 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package packet - -import ( - "bytes" - "encoding/hex" - "fmt" - "golang.org/x/crypto/openpgp/errors" - "io" - "io/ioutil" - "testing" -) - -func TestReadFull(t *testing.T) { - var out [4]byte - - b := bytes.NewBufferString("foo") - n, err := readFull(b, out[:3]) - if n != 3 || err != nil { - t.Errorf("full read failed n:%d err:%s", n, err) - } - - b = bytes.NewBufferString("foo") - n, err = readFull(b, out[:4]) - if n != 3 || err != io.ErrUnexpectedEOF { - t.Errorf("partial read failed n:%d err:%s", n, err) - } - - b = bytes.NewBuffer(nil) - n, err = readFull(b, out[:3]) - if n != 0 || err != io.ErrUnexpectedEOF { - t.Errorf("empty read failed n:%d err:%s", n, err) - } -} - -func readerFromHex(s string) io.Reader { - data, err := hex.DecodeString(s) - if err != nil { - panic("readerFromHex: bad input") - } - return bytes.NewBuffer(data) -} - -var readLengthTests = []struct { - hexInput string - length int64 - isPartial bool - err error -}{ - {"", 0, false, io.ErrUnexpectedEOF}, - {"1f", 31, false, nil}, - {"c0", 0, false, io.ErrUnexpectedEOF}, - {"c101", 256 + 1 + 192, false, nil}, - {"e0", 1, true, nil}, - {"e1", 2, true, nil}, - {"e2", 4, true, nil}, - {"ff", 0, false, io.ErrUnexpectedEOF}, - {"ff00", 0, false, io.ErrUnexpectedEOF}, - {"ff0000", 0, false, io.ErrUnexpectedEOF}, - {"ff000000", 0, false, io.ErrUnexpectedEOF}, - {"ff00000000", 0, false, nil}, - {"ff01020304", 16909060, false, nil}, -} - -func TestReadLength(t *testing.T) { - for i, test := range readLengthTests { - length, isPartial, err := readLength(readerFromHex(test.hexInput)) - if test.err != nil { - if err != test.err { - t.Errorf("%d: expected different error got:%s want:%s", i, err, test.err) - } - continue - } - if err != nil { - t.Errorf("%d: unexpected error: %s", i, err) - continue - } - if length != test.length || isPartial != test.isPartial { - t.Errorf("%d: bad result got:(%d,%t) want:(%d,%t)", i, length, isPartial, test.length, test.isPartial) - } - } -} - -var partialLengthReaderTests = []struct { - hexInput string - err error - hexOutput string -}{ - {"e0", io.ErrUnexpectedEOF, ""}, - {"e001", io.ErrUnexpectedEOF, ""}, - {"e0010102", nil, "0102"}, - {"ff00000000", nil, ""}, - {"e10102e1030400", nil, "01020304"}, - {"e101", io.ErrUnexpectedEOF, ""}, -} - -func TestPartialLengthReader(t *testing.T) { - for i, test := range partialLengthReaderTests { - r := &partialLengthReader{readerFromHex(test.hexInput), 0, true} - out, err := ioutil.ReadAll(r) - if test.err != nil { - if err != test.err { - t.Errorf("%d: expected different error got:%s want:%s", i, err, test.err) - } - continue - } - if err != nil { - t.Errorf("%d: unexpected error: %s", i, err) - continue - } - - got := fmt.Sprintf("%x", out) - if got != test.hexOutput { - t.Errorf("%d: got:%s want:%s", i, test.hexOutput, got) - } - } -} - -var readHeaderTests = []struct { - hexInput string - structuralError bool - unexpectedEOF bool - tag int - length int64 - hexOutput string -}{ - {"", false, false, 0, 0, ""}, - {"7f", true, false, 0, 0, ""}, - - // Old format headers - {"80", false, true, 0, 0, ""}, - {"8001", false, true, 0, 1, ""}, - {"800102", false, false, 0, 1, "02"}, - {"81000102", false, false, 0, 1, "02"}, - {"820000000102", false, false, 0, 1, "02"}, - {"860000000102", false, false, 1, 1, "02"}, - {"83010203", false, false, 0, -1, "010203"}, - - // New format headers - {"c0", false, true, 0, 0, ""}, - {"c000", false, false, 0, 0, ""}, - {"c00102", false, false, 0, 1, "02"}, - {"c0020203", false, false, 0, 2, "0203"}, - {"c00202", false, true, 0, 2, ""}, - {"c3020203", false, false, 3, 2, "0203"}, -} - -func TestReadHeader(t *testing.T) { - for i, test := range readHeaderTests { - tag, length, contents, err := readHeader(readerFromHex(test.hexInput)) - if test.structuralError { - if _, ok := err.(errors.StructuralError); ok { - continue - } - t.Errorf("%d: expected StructuralError, got:%s", i, err) - continue - } - if err != nil { - if len(test.hexInput) == 0 && err == io.EOF { - continue - } - if !test.unexpectedEOF || err != io.ErrUnexpectedEOF { - t.Errorf("%d: unexpected error from readHeader: %s", i, err) - } - continue - } - if int(tag) != test.tag || length != test.length { - t.Errorf("%d: got:(%d,%d) want:(%d,%d)", i, int(tag), length, test.tag, test.length) - continue - } - - body, err := ioutil.ReadAll(contents) - if err != nil { - if !test.unexpectedEOF || err != io.ErrUnexpectedEOF { - t.Errorf("%d: unexpected error from contents: %s", i, err) - } - continue - } - if test.unexpectedEOF { - t.Errorf("%d: expected ErrUnexpectedEOF from contents but got no error", i) - continue - } - got := fmt.Sprintf("%x", body) - if got != test.hexOutput { - t.Errorf("%d: got:%s want:%s", i, got, test.hexOutput) - } - } -} - -func TestSerializeHeader(t *testing.T) { - tag := packetTypePublicKey - lengths := []int{0, 1, 2, 64, 192, 193, 8000, 8384, 8385, 10000} - - for _, length := range lengths { - buf := bytes.NewBuffer(nil) - serializeHeader(buf, tag, length) - tag2, length2, _, err := readHeader(buf) - if err != nil { - t.Errorf("length %d, err: %s", length, err) - } - if tag2 != tag { - t.Errorf("length %d, tag incorrect (got %d, want %d)", length, tag2, tag) - } - if int(length2) != length { - t.Errorf("length %d, length incorrect (got %d)", length, length2) - } - } -} - -func TestPartialLengths(t *testing.T) { - buf := bytes.NewBuffer(nil) - w := new(partialLengthWriter) - w.w = noOpCloser{buf} - - const maxChunkSize = 64 - - var b [maxChunkSize]byte - var n uint8 - for l := 1; l <= maxChunkSize; l++ { - for i := 0; i < l; i++ { - b[i] = n - n++ - } - m, err := w.Write(b[:l]) - if m != l { - t.Errorf("short write got: %d want: %d", m, l) - } - if err != nil { - t.Errorf("error from write: %s", err) - } - } - w.Close() - - want := (maxChunkSize * (maxChunkSize + 1)) / 2 - copyBuf := bytes.NewBuffer(nil) - r := &partialLengthReader{buf, 0, true} - m, err := io.Copy(copyBuf, r) - if m != int64(want) { - t.Errorf("short copy got: %d want: %d", m, want) - } - if err != nil { - t.Errorf("error from copy: %s", err) - } - - copyBytes := copyBuf.Bytes() - for i := 0; i < want; i++ { - if copyBytes[i] != uint8(i) { - t.Errorf("bad pattern in copy at %d", i) - break - } - } -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/private_key.go b/vendor/golang.org/x/crypto/openpgp/packet/private_key.go deleted file mode 100644 index 34734cc63..000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/private_key.go +++ /dev/null @@ -1,380 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package packet - -import ( - "bytes" - "crypto" - "crypto/cipher" - "crypto/dsa" - "crypto/ecdsa" - "crypto/rsa" - "crypto/sha1" - "io" - "io/ioutil" - "math/big" - "strconv" - "time" - - "golang.org/x/crypto/openpgp/elgamal" - "golang.org/x/crypto/openpgp/errors" - "golang.org/x/crypto/openpgp/s2k" -) - -// PrivateKey represents a possibly encrypted private key. See RFC 4880, -// section 5.5.3. -type PrivateKey struct { - PublicKey - Encrypted bool // if true then the private key is unavailable until Decrypt has been called. - encryptedData []byte - cipher CipherFunction - s2k func(out, in []byte) - PrivateKey interface{} // An *{rsa|dsa|ecdsa}.PrivateKey or a crypto.Signer. - sha1Checksum bool - iv []byte -} - -func NewRSAPrivateKey(currentTime time.Time, priv *rsa.PrivateKey) *PrivateKey { - pk := new(PrivateKey) - pk.PublicKey = *NewRSAPublicKey(currentTime, &priv.PublicKey) - pk.PrivateKey = priv - return pk -} - -func NewDSAPrivateKey(currentTime time.Time, priv *dsa.PrivateKey) *PrivateKey { - pk := new(PrivateKey) - pk.PublicKey = *NewDSAPublicKey(currentTime, &priv.PublicKey) - pk.PrivateKey = priv - return pk -} - -func NewElGamalPrivateKey(currentTime time.Time, priv *elgamal.PrivateKey) *PrivateKey { - pk := new(PrivateKey) - pk.PublicKey = *NewElGamalPublicKey(currentTime, &priv.PublicKey) - pk.PrivateKey = priv - return pk -} - -func NewECDSAPrivateKey(currentTime time.Time, priv *ecdsa.PrivateKey) *PrivateKey { - pk := new(PrivateKey) - pk.PublicKey = *NewECDSAPublicKey(currentTime, &priv.PublicKey) - pk.PrivateKey = priv - return pk -} - -// NewSignerPrivateKey creates a sign-only PrivateKey from a crypto.Signer that -// implements RSA or ECDSA. -func NewSignerPrivateKey(currentTime time.Time, signer crypto.Signer) *PrivateKey { - pk := new(PrivateKey) - switch pubkey := signer.Public().(type) { - case rsa.PublicKey: - pk.PublicKey = *NewRSAPublicKey(currentTime, &pubkey) - pk.PubKeyAlgo = PubKeyAlgoRSASignOnly - case ecdsa.PublicKey: - pk.PublicKey = *NewECDSAPublicKey(currentTime, &pubkey) - default: - panic("openpgp: unknown crypto.Signer type in NewSignerPrivateKey") - } - pk.PrivateKey = signer - return pk -} - -func (pk *PrivateKey) parse(r io.Reader) (err error) { - err = (&pk.PublicKey).parse(r) - if err != nil { - return - } - var buf [1]byte - _, err = readFull(r, buf[:]) - if err != nil { - return - } - - s2kType := buf[0] - - switch s2kType { - case 0: - pk.s2k = nil - pk.Encrypted = false - case 254, 255: - _, err = readFull(r, buf[:]) - if err != nil { - return - } - pk.cipher = CipherFunction(buf[0]) - pk.Encrypted = true - pk.s2k, err = s2k.Parse(r) - if err != nil { - return - } - if s2kType == 254 { - pk.sha1Checksum = true - } - default: - return errors.UnsupportedError("deprecated s2k function in private key") - } - - if pk.Encrypted { - blockSize := pk.cipher.blockSize() - if blockSize == 0 { - return errors.UnsupportedError("unsupported cipher in private key: " + strconv.Itoa(int(pk.cipher))) - } - pk.iv = make([]byte, blockSize) - _, err = readFull(r, pk.iv) - if err != nil { - return - } - } - - pk.encryptedData, err = ioutil.ReadAll(r) - if err != nil { - return - } - - if !pk.Encrypted { - return pk.parsePrivateKey(pk.encryptedData) - } - - return -} - -func mod64kHash(d []byte) uint16 { - var h uint16 - for _, b := range d { - h += uint16(b) - } - return h -} - -func (pk *PrivateKey) Serialize(w io.Writer) (err error) { - // TODO(agl): support encrypted private keys - buf := bytes.NewBuffer(nil) - err = pk.PublicKey.serializeWithoutHeaders(buf) - if err != nil { - return - } - buf.WriteByte(0 /* no encryption */) - - privateKeyBuf := bytes.NewBuffer(nil) - - switch priv := pk.PrivateKey.(type) { - case *rsa.PrivateKey: - err = serializeRSAPrivateKey(privateKeyBuf, priv) - case *dsa.PrivateKey: - err = serializeDSAPrivateKey(privateKeyBuf, priv) - case *elgamal.PrivateKey: - err = serializeElGamalPrivateKey(privateKeyBuf, priv) - case *ecdsa.PrivateKey: - err = serializeECDSAPrivateKey(privateKeyBuf, priv) - default: - err = errors.InvalidArgumentError("unknown private key type") - } - if err != nil { - return - } - - ptype := packetTypePrivateKey - contents := buf.Bytes() - privateKeyBytes := privateKeyBuf.Bytes() - if pk.IsSubkey { - ptype = packetTypePrivateSubkey - } - err = serializeHeader(w, ptype, len(contents)+len(privateKeyBytes)+2) - if err != nil { - return - } - _, err = w.Write(contents) - if err != nil { - return - } - _, err = w.Write(privateKeyBytes) - if err != nil { - return - } - - checksum := mod64kHash(privateKeyBytes) - var checksumBytes [2]byte - checksumBytes[0] = byte(checksum >> 8) - checksumBytes[1] = byte(checksum) - _, err = w.Write(checksumBytes[:]) - - return -} - -func serializeRSAPrivateKey(w io.Writer, priv *rsa.PrivateKey) error { - err := writeBig(w, priv.D) - if err != nil { - return err - } - err = writeBig(w, priv.Primes[1]) - if err != nil { - return err - } - err = writeBig(w, priv.Primes[0]) - if err != nil { - return err - } - return writeBig(w, priv.Precomputed.Qinv) -} - -func serializeDSAPrivateKey(w io.Writer, priv *dsa.PrivateKey) error { - return writeBig(w, priv.X) -} - -func serializeElGamalPrivateKey(w io.Writer, priv *elgamal.PrivateKey) error { - return writeBig(w, priv.X) -} - -func serializeECDSAPrivateKey(w io.Writer, priv *ecdsa.PrivateKey) error { - return writeBig(w, priv.D) -} - -// Decrypt decrypts an encrypted private key using a passphrase. -func (pk *PrivateKey) Decrypt(passphrase []byte) error { - if !pk.Encrypted { - return nil - } - - key := make([]byte, pk.cipher.KeySize()) - pk.s2k(key, passphrase) - block := pk.cipher.new(key) - cfb := cipher.NewCFBDecrypter(block, pk.iv) - - data := make([]byte, len(pk.encryptedData)) - cfb.XORKeyStream(data, pk.encryptedData) - - if pk.sha1Checksum { - if len(data) < sha1.Size { - return errors.StructuralError("truncated private key data") - } - h := sha1.New() - h.Write(data[:len(data)-sha1.Size]) - sum := h.Sum(nil) - if !bytes.Equal(sum, data[len(data)-sha1.Size:]) { - return errors.StructuralError("private key checksum failure") - } - data = data[:len(data)-sha1.Size] - } else { - if len(data) < 2 { - return errors.StructuralError("truncated private key data") - } - var sum uint16 - for i := 0; i < len(data)-2; i++ { - sum += uint16(data[i]) - } - if data[len(data)-2] != uint8(sum>>8) || - data[len(data)-1] != uint8(sum) { - return errors.StructuralError("private key checksum failure") - } - data = data[:len(data)-2] - } - - return pk.parsePrivateKey(data) -} - -func (pk *PrivateKey) parsePrivateKey(data []byte) (err error) { - switch pk.PublicKey.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly, PubKeyAlgoRSAEncryptOnly: - return pk.parseRSAPrivateKey(data) - case PubKeyAlgoDSA: - return pk.parseDSAPrivateKey(data) - case PubKeyAlgoElGamal: - return pk.parseElGamalPrivateKey(data) - case PubKeyAlgoECDSA: - return pk.parseECDSAPrivateKey(data) - } - panic("impossible") -} - -func (pk *PrivateKey) parseRSAPrivateKey(data []byte) (err error) { - rsaPub := pk.PublicKey.PublicKey.(*rsa.PublicKey) - rsaPriv := new(rsa.PrivateKey) - rsaPriv.PublicKey = *rsaPub - - buf := bytes.NewBuffer(data) - d, _, err := readMPI(buf) - if err != nil { - return - } - p, _, err := readMPI(buf) - if err != nil { - return - } - q, _, err := readMPI(buf) - if err != nil { - return - } - - rsaPriv.D = new(big.Int).SetBytes(d) - rsaPriv.Primes = make([]*big.Int, 2) - rsaPriv.Primes[0] = new(big.Int).SetBytes(p) - rsaPriv.Primes[1] = new(big.Int).SetBytes(q) - if err := rsaPriv.Validate(); err != nil { - return err - } - rsaPriv.Precompute() - pk.PrivateKey = rsaPriv - pk.Encrypted = false - pk.encryptedData = nil - - return nil -} - -func (pk *PrivateKey) parseDSAPrivateKey(data []byte) (err error) { - dsaPub := pk.PublicKey.PublicKey.(*dsa.PublicKey) - dsaPriv := new(dsa.PrivateKey) - dsaPriv.PublicKey = *dsaPub - - buf := bytes.NewBuffer(data) - x, _, err := readMPI(buf) - if err != nil { - return - } - - dsaPriv.X = new(big.Int).SetBytes(x) - pk.PrivateKey = dsaPriv - pk.Encrypted = false - pk.encryptedData = nil - - return nil -} - -func (pk *PrivateKey) parseElGamalPrivateKey(data []byte) (err error) { - pub := pk.PublicKey.PublicKey.(*elgamal.PublicKey) - priv := new(elgamal.PrivateKey) - priv.PublicKey = *pub - - buf := bytes.NewBuffer(data) - x, _, err := readMPI(buf) - if err != nil { - return - } - - priv.X = new(big.Int).SetBytes(x) - pk.PrivateKey = priv - pk.Encrypted = false - pk.encryptedData = nil - - return nil -} - -func (pk *PrivateKey) parseECDSAPrivateKey(data []byte) (err error) { - ecdsaPub := pk.PublicKey.PublicKey.(*ecdsa.PublicKey) - - buf := bytes.NewBuffer(data) - d, _, err := readMPI(buf) - if err != nil { - return - } - - pk.PrivateKey = &ecdsa.PrivateKey{ - PublicKey: *ecdsaPub, - D: new(big.Int).SetBytes(d), - } - pk.Encrypted = false - pk.encryptedData = nil - - return nil -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/private_key_test.go b/vendor/golang.org/x/crypto/openpgp/packet/private_key_test.go deleted file mode 100644 index c16ef78ab..000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/private_key_test.go +++ /dev/null @@ -1,270 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package packet - -import ( - "bytes" - "crypto" - "crypto/ecdsa" - "crypto/elliptic" - "crypto/rand" - "crypto/rsa" - "crypto/x509" - "encoding/hex" - "hash" - "io" - "testing" - "time" -) - -var privateKeyTests = []struct { - privateKeyHex string - creationTime time.Time -}{ - { - privKeyRSAHex, - time.Unix(0x4cc349a8, 0), - }, - { - privKeyElGamalHex, - time.Unix(0x4df9ee1a, 0), - }, -} - -func TestPrivateKeyRead(t *testing.T) { - for i, test := range privateKeyTests { - packet, err := Read(readerFromHex(test.privateKeyHex)) - if err != nil { - t.Errorf("#%d: failed to parse: %s", i, err) - continue - } - - privKey := packet.(*PrivateKey) - - if !privKey.Encrypted { - t.Errorf("#%d: private key isn't encrypted", i) - continue - } - - err = privKey.Decrypt([]byte("wrong password")) - if err == nil { - t.Errorf("#%d: decrypted with incorrect key", i) - continue - } - - err = privKey.Decrypt([]byte("testing")) - if err != nil { - t.Errorf("#%d: failed to decrypt: %s", i, err) - continue - } - - if !privKey.CreationTime.Equal(test.creationTime) || privKey.Encrypted { - t.Errorf("#%d: bad result, got: %#v", i, privKey) - } - } -} - -func populateHash(hashFunc crypto.Hash, msg []byte) (hash.Hash, error) { - h := hashFunc.New() - if _, err := h.Write(msg); err != nil { - return nil, err - } - return h, nil -} - -func TestRSAPrivateKey(t *testing.T) { - privKeyDER, _ := hex.DecodeString(pkcs1PrivKeyHex) - rsaPriv, err := x509.ParsePKCS1PrivateKey(privKeyDER) - if err != nil { - t.Fatal(err) - } - - var buf bytes.Buffer - if err := NewRSAPrivateKey(time.Now(), rsaPriv).Serialize(&buf); err != nil { - t.Fatal(err) - } - - p, err := Read(&buf) - if err != nil { - t.Fatal(err) - } - - priv, ok := p.(*PrivateKey) - if !ok { - t.Fatal("didn't parse private key") - } - - sig := &Signature{ - PubKeyAlgo: PubKeyAlgoRSA, - Hash: crypto.SHA256, - } - msg := []byte("Hello World!") - - h, err := populateHash(sig.Hash, msg) - if err != nil { - t.Fatal(err) - } - if err := sig.Sign(h, priv, nil); err != nil { - t.Fatal(err) - } - - if h, err = populateHash(sig.Hash, msg); err != nil { - t.Fatal(err) - } - if err := priv.VerifySignature(h, sig); err != nil { - t.Fatal(err) - } -} - -func TestECDSAPrivateKey(t *testing.T) { - ecdsaPriv, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) - if err != nil { - t.Fatal(err) - } - - var buf bytes.Buffer - if err := NewECDSAPrivateKey(time.Now(), ecdsaPriv).Serialize(&buf); err != nil { - t.Fatal(err) - } - - p, err := Read(&buf) - if err != nil { - t.Fatal(err) - } - - priv, ok := p.(*PrivateKey) - if !ok { - t.Fatal("didn't parse private key") - } - - sig := &Signature{ - PubKeyAlgo: PubKeyAlgoECDSA, - Hash: crypto.SHA256, - } - msg := []byte("Hello World!") - - h, err := populateHash(sig.Hash, msg) - if err != nil { - t.Fatal(err) - } - if err := sig.Sign(h, priv, nil); err != nil { - t.Fatal(err) - } - - if h, err = populateHash(sig.Hash, msg); err != nil { - t.Fatal(err) - } - if err := priv.VerifySignature(h, sig); err != nil { - t.Fatal(err) - } -} - -type rsaSigner struct { - priv *rsa.PrivateKey -} - -func (s *rsaSigner) Public() crypto.PublicKey { - return s.priv.PublicKey -} - -func (s *rsaSigner) Sign(rand io.Reader, msg []byte, opts crypto.SignerOpts) ([]byte, error) { - return s.priv.Sign(rand, msg, opts) -} - -func TestRSASignerPrivateKey(t *testing.T) { - rsaPriv, err := rsa.GenerateKey(rand.Reader, 1024) - if err != nil { - t.Fatal(err) - } - - priv := NewSignerPrivateKey(time.Now(), &rsaSigner{rsaPriv}) - - if priv.PubKeyAlgo != PubKeyAlgoRSASignOnly { - t.Fatal("NewSignerPrivateKey should have made a sign-only RSA private key") - } - - sig := &Signature{ - PubKeyAlgo: PubKeyAlgoRSASignOnly, - Hash: crypto.SHA256, - } - msg := []byte("Hello World!") - - h, err := populateHash(sig.Hash, msg) - if err != nil { - t.Fatal(err) - } - if err := sig.Sign(h, priv, nil); err != nil { - t.Fatal(err) - } - - if h, err = populateHash(sig.Hash, msg); err != nil { - t.Fatal(err) - } - if err := priv.VerifySignature(h, sig); err != nil { - t.Fatal(err) - } -} - -type ecdsaSigner struct { - priv *ecdsa.PrivateKey -} - -func (s *ecdsaSigner) Public() crypto.PublicKey { - return s.priv.PublicKey -} - -func (s *ecdsaSigner) Sign(rand io.Reader, msg []byte, opts crypto.SignerOpts) ([]byte, error) { - return s.priv.Sign(rand, msg, opts) -} - -func TestECDSASignerPrivateKey(t *testing.T) { - ecdsaPriv, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) - if err != nil { - t.Fatal(err) - } - - priv := NewSignerPrivateKey(time.Now(), &ecdsaSigner{ecdsaPriv}) - - if priv.PubKeyAlgo != PubKeyAlgoECDSA { - t.Fatal("NewSignerPrivateKey should have made a ECSDA private key") - } - - sig := &Signature{ - PubKeyAlgo: PubKeyAlgoECDSA, - Hash: crypto.SHA256, - } - msg := []byte("Hello World!") - - h, err := populateHash(sig.Hash, msg) - if err != nil { - t.Fatal(err) - } - if err := sig.Sign(h, priv, nil); err != nil { - t.Fatal(err) - } - - if h, err = populateHash(sig.Hash, msg); err != nil { - t.Fatal(err) - } - if err := priv.VerifySignature(h, sig); err != nil { - t.Fatal(err) - } -} - -func TestIssue11505(t *testing.T) { - // parsing a rsa private key with p or q == 1 used to panic due to a divide by zero - _, _ = Read(readerFromHex("9c3004303030300100000011303030000000000000010130303030303030303030303030303030303030303030303030303030303030303030303030303030303030")) -} - -// Generated with `gpg --export-secret-keys "Test Key 2"` -const privKeyRSAHex = "9501fe044cc349a8010400b70ca0010e98c090008d45d1ee8f9113bd5861fd57b88bacb7c68658747663f1e1a3b5a98f32fda6472373c024b97359cd2efc88ff60f77751adfbf6af5e615e6a1408cfad8bf0cea30b0d5f53aa27ad59089ba9b15b7ebc2777a25d7b436144027e3bcd203909f147d0e332b240cf63d3395f5dfe0df0a6c04e8655af7eacdf0011010001fe0303024a252e7d475fd445607de39a265472aa74a9320ba2dac395faa687e9e0336aeb7e9a7397e511b5afd9dc84557c80ac0f3d4d7bfec5ae16f20d41c8c84a04552a33870b930420e230e179564f6d19bb153145e76c33ae993886c388832b0fa042ddda7f133924f3854481533e0ede31d51278c0519b29abc3bf53da673e13e3e1214b52413d179d7f66deee35cac8eacb060f78379d70ef4af8607e68131ff529439668fc39c9ce6dfef8a5ac234d234802cbfb749a26107db26406213ae5c06d4673253a3cbee1fcbae58d6ab77e38d6e2c0e7c6317c48e054edadb5a40d0d48acb44643d998139a8a66bb820be1f3f80185bc777d14b5954b60effe2448a036d565c6bc0b915fcea518acdd20ab07bc1529f561c58cd044f723109b93f6fd99f876ff891d64306b5d08f48bab59f38695e9109c4dec34013ba3153488ce070268381ba923ee1eb77125b36afcb4347ec3478c8f2735b06ef17351d872e577fa95d0c397c88c71b59629a36aec" - -// Generated by `gpg --export-secret-keys` followed by a manual extraction of -// the ElGamal subkey from the packets. -const privKeyElGamalHex = "9d0157044df9ee1a100400eb8e136a58ec39b582629cdadf830bc64e0a94ed8103ca8bb247b27b11b46d1d25297ef4bcc3071785ba0c0bedfe89eabc5287fcc0edf81ab5896c1c8e4b20d27d79813c7aede75320b33eaeeaa586edc00fd1036c10133e6ba0ff277245d0d59d04b2b3421b7244aca5f4a8d870c6f1c1fbff9e1c26699a860b9504f35ca1d700030503fd1ededd3b840795be6d9ccbe3c51ee42e2f39233c432b831ddd9c4e72b7025a819317e47bf94f9ee316d7273b05d5fcf2999c3a681f519b1234bbfa6d359b4752bd9c3f77d6b6456cde152464763414ca130f4e91d91041432f90620fec0e6d6b5116076c2985d5aeaae13be492b9b329efcaf7ee25120159a0a30cd976b42d7afe030302dae7eb80db744d4960c4df930d57e87fe81412eaace9f900e6c839817a614ddb75ba6603b9417c33ea7b6c93967dfa2bcff3fa3c74a5ce2c962db65b03aece14c96cbd0038fc" - -// pkcs1PrivKeyHex is a PKCS#1, RSA private key. -// Generated by `openssl genrsa 1024 | openssl rsa -outform DER | xxd -p` -const pkcs1PrivKeyHex = "3082025d02010002818100e98edfa1c3b35884a54d0b36a6a603b0290fa85e49e30fa23fc94fef9c6790bc4849928607aa48d809da326fb42a969d06ad756b98b9c1a90f5d4a2b6d0ac05953c97f4da3120164a21a679793ce181c906dc01d235cc085ddcdf6ea06c389b6ab8885dfd685959e693138856a68a7e5db263337ff82a088d583a897cf2d59e9020301000102818100b6d5c9eb70b02d5369b3ee5b520a14490b5bde8a317d36f7e4c74b7460141311d1e5067735f8f01d6f5908b2b96fbd881f7a1ab9a84d82753e39e19e2d36856be960d05ac9ef8e8782ea1b6d65aee28fdfe1d61451e8cff0adfe84322f12cf455028b581cf60eb9e0e140ba5d21aeba6c2634d7c65318b9a665fc01c3191ca21024100fa5e818da3705b0fa33278bb28d4b6f6050388af2d4b75ec9375dd91ccf2e7d7068086a8b82a8f6282e4fbbdb8a7f2622eb97295249d87acea7f5f816f54d347024100eecf9406d7dc49cdfb95ab1eff4064de84c7a30f64b2798936a0d2018ba9eb52e4b636f82e96c49cc63b80b675e91e40d1b2e4017d4b9adaf33ab3d9cf1c214f024100c173704ace742c082323066226a4655226819a85304c542b9dacbeacbf5d1881ee863485fcf6f59f3a604f9b42289282067447f2b13dfeed3eab7851fc81e0550240741fc41f3fc002b382eed8730e33c5d8de40256e4accee846667f536832f711ab1d4590e7db91a8a116ac5bff3be13d3f9243ff2e976662aa9b395d907f8e9c9024046a5696c9ef882363e06c9fa4e2f5b580906452befba03f4a99d0f873697ef1f851d2226ca7934b30b7c3e80cb634a67172bbbf4781735fe3e09263e2dd723e7" diff --git a/vendor/golang.org/x/crypto/openpgp/packet/public_key.go b/vendor/golang.org/x/crypto/openpgp/packet/public_key.go deleted file mode 100644 index ead26233d..000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/public_key.go +++ /dev/null @@ -1,748 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package packet - -import ( - "bytes" - "crypto" - "crypto/dsa" - "crypto/ecdsa" - "crypto/elliptic" - "crypto/rsa" - "crypto/sha1" - _ "crypto/sha256" - _ "crypto/sha512" - "encoding/binary" - "fmt" - "hash" - "io" - "math/big" - "strconv" - "time" - - "golang.org/x/crypto/openpgp/elgamal" - "golang.org/x/crypto/openpgp/errors" -) - -var ( - // NIST curve P-256 - oidCurveP256 []byte = []byte{0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07} - // NIST curve P-384 - oidCurveP384 []byte = []byte{0x2B, 0x81, 0x04, 0x00, 0x22} - // NIST curve P-521 - oidCurveP521 []byte = []byte{0x2B, 0x81, 0x04, 0x00, 0x23} -) - -const maxOIDLength = 8 - -// ecdsaKey stores the algorithm-specific fields for ECDSA keys. -// as defined in RFC 6637, Section 9. -type ecdsaKey struct { - // oid contains the OID byte sequence identifying the elliptic curve used - oid []byte - // p contains the elliptic curve point that represents the public key - p parsedMPI -} - -// parseOID reads the OID for the curve as defined in RFC 6637, Section 9. -func parseOID(r io.Reader) (oid []byte, err error) { - buf := make([]byte, maxOIDLength) - if _, err = readFull(r, buf[:1]); err != nil { - return - } - oidLen := buf[0] - if int(oidLen) > len(buf) { - err = errors.UnsupportedError("invalid oid length: " + strconv.Itoa(int(oidLen))) - return - } - oid = buf[:oidLen] - _, err = readFull(r, oid) - return -} - -func (f *ecdsaKey) parse(r io.Reader) (err error) { - if f.oid, err = parseOID(r); err != nil { - return err - } - f.p.bytes, f.p.bitLength, err = readMPI(r) - return -} - -func (f *ecdsaKey) serialize(w io.Writer) (err error) { - buf := make([]byte, maxOIDLength+1) - buf[0] = byte(len(f.oid)) - copy(buf[1:], f.oid) - if _, err = w.Write(buf[:len(f.oid)+1]); err != nil { - return - } - return writeMPIs(w, f.p) -} - -func (f *ecdsaKey) newECDSA() (*ecdsa.PublicKey, error) { - var c elliptic.Curve - if bytes.Equal(f.oid, oidCurveP256) { - c = elliptic.P256() - } else if bytes.Equal(f.oid, oidCurveP384) { - c = elliptic.P384() - } else if bytes.Equal(f.oid, oidCurveP521) { - c = elliptic.P521() - } else { - return nil, errors.UnsupportedError(fmt.Sprintf("unsupported oid: %x", f.oid)) - } - x, y := elliptic.Unmarshal(c, f.p.bytes) - if x == nil { - return nil, errors.UnsupportedError("failed to parse EC point") - } - return &ecdsa.PublicKey{Curve: c, X: x, Y: y}, nil -} - -func (f *ecdsaKey) byteLen() int { - return 1 + len(f.oid) + 2 + len(f.p.bytes) -} - -type kdfHashFunction byte -type kdfAlgorithm byte - -// ecdhKdf stores key derivation function parameters -// used for ECDH encryption. See RFC 6637, Section 9. -type ecdhKdf struct { - KdfHash kdfHashFunction - KdfAlgo kdfAlgorithm -} - -func (f *ecdhKdf) parse(r io.Reader) (err error) { - buf := make([]byte, 1) - if _, err = readFull(r, buf); err != nil { - return - } - kdfLen := int(buf[0]) - if kdfLen < 3 { - return errors.UnsupportedError("Unsupported ECDH KDF length: " + strconv.Itoa(kdfLen)) - } - buf = make([]byte, kdfLen) - if _, err = readFull(r, buf); err != nil { - return - } - reserved := int(buf[0]) - f.KdfHash = kdfHashFunction(buf[1]) - f.KdfAlgo = kdfAlgorithm(buf[2]) - if reserved != 0x01 { - return errors.UnsupportedError("Unsupported KDF reserved field: " + strconv.Itoa(reserved)) - } - return -} - -func (f *ecdhKdf) serialize(w io.Writer) (err error) { - buf := make([]byte, 4) - // See RFC 6637, Section 9, Algorithm-Specific Fields for ECDH keys. - buf[0] = byte(0x03) // Length of the following fields - buf[1] = byte(0x01) // Reserved for future extensions, must be 1 for now - buf[2] = byte(f.KdfHash) - buf[3] = byte(f.KdfAlgo) - _, err = w.Write(buf[:]) - return -} - -func (f *ecdhKdf) byteLen() int { - return 4 -} - -// PublicKey represents an OpenPGP public key. See RFC 4880, section 5.5.2. -type PublicKey struct { - CreationTime time.Time - PubKeyAlgo PublicKeyAlgorithm - PublicKey interface{} // *rsa.PublicKey, *dsa.PublicKey or *ecdsa.PublicKey - Fingerprint [20]byte - KeyId uint64 - IsSubkey bool - - n, e, p, q, g, y parsedMPI - - // RFC 6637 fields - ec *ecdsaKey - ecdh *ecdhKdf -} - -// signingKey provides a convenient abstraction over signature verification -// for v3 and v4 public keys. -type signingKey interface { - SerializeSignaturePrefix(io.Writer) - serializeWithoutHeaders(io.Writer) error -} - -func fromBig(n *big.Int) parsedMPI { - return parsedMPI{ - bytes: n.Bytes(), - bitLength: uint16(n.BitLen()), - } -} - -// NewRSAPublicKey returns a PublicKey that wraps the given rsa.PublicKey. -func NewRSAPublicKey(creationTime time.Time, pub *rsa.PublicKey) *PublicKey { - pk := &PublicKey{ - CreationTime: creationTime, - PubKeyAlgo: PubKeyAlgoRSA, - PublicKey: pub, - n: fromBig(pub.N), - e: fromBig(big.NewInt(int64(pub.E))), - } - - pk.setFingerPrintAndKeyId() - return pk -} - -// NewDSAPublicKey returns a PublicKey that wraps the given dsa.PublicKey. -func NewDSAPublicKey(creationTime time.Time, pub *dsa.PublicKey) *PublicKey { - pk := &PublicKey{ - CreationTime: creationTime, - PubKeyAlgo: PubKeyAlgoDSA, - PublicKey: pub, - p: fromBig(pub.P), - q: fromBig(pub.Q), - g: fromBig(pub.G), - y: fromBig(pub.Y), - } - - pk.setFingerPrintAndKeyId() - return pk -} - -// NewElGamalPublicKey returns a PublicKey that wraps the given elgamal.PublicKey. -func NewElGamalPublicKey(creationTime time.Time, pub *elgamal.PublicKey) *PublicKey { - pk := &PublicKey{ - CreationTime: creationTime, - PubKeyAlgo: PubKeyAlgoElGamal, - PublicKey: pub, - p: fromBig(pub.P), - g: fromBig(pub.G), - y: fromBig(pub.Y), - } - - pk.setFingerPrintAndKeyId() - return pk -} - -func NewECDSAPublicKey(creationTime time.Time, pub *ecdsa.PublicKey) *PublicKey { - pk := &PublicKey{ - CreationTime: creationTime, - PubKeyAlgo: PubKeyAlgoECDSA, - PublicKey: pub, - ec: new(ecdsaKey), - } - - switch pub.Curve { - case elliptic.P256(): - pk.ec.oid = oidCurveP256 - case elliptic.P384(): - pk.ec.oid = oidCurveP384 - case elliptic.P521(): - pk.ec.oid = oidCurveP521 - default: - panic("unknown elliptic curve") - } - - pk.ec.p.bytes = elliptic.Marshal(pub.Curve, pub.X, pub.Y) - pk.ec.p.bitLength = uint16(8 * len(pk.ec.p.bytes)) - - pk.setFingerPrintAndKeyId() - return pk -} - -func (pk *PublicKey) parse(r io.Reader) (err error) { - // RFC 4880, section 5.5.2 - var buf [6]byte - _, err = readFull(r, buf[:]) - if err != nil { - return - } - if buf[0] != 4 { - return errors.UnsupportedError("public key version") - } - pk.CreationTime = time.Unix(int64(uint32(buf[1])<<24|uint32(buf[2])<<16|uint32(buf[3])<<8|uint32(buf[4])), 0) - pk.PubKeyAlgo = PublicKeyAlgorithm(buf[5]) - switch pk.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly: - err = pk.parseRSA(r) - case PubKeyAlgoDSA: - err = pk.parseDSA(r) - case PubKeyAlgoElGamal: - err = pk.parseElGamal(r) - case PubKeyAlgoECDSA: - pk.ec = new(ecdsaKey) - if err = pk.ec.parse(r); err != nil { - return err - } - pk.PublicKey, err = pk.ec.newECDSA() - case PubKeyAlgoECDH: - pk.ec = new(ecdsaKey) - if err = pk.ec.parse(r); err != nil { - return - } - pk.ecdh = new(ecdhKdf) - if err = pk.ecdh.parse(r); err != nil { - return - } - // The ECDH key is stored in an ecdsa.PublicKey for convenience. - pk.PublicKey, err = pk.ec.newECDSA() - default: - err = errors.UnsupportedError("public key type: " + strconv.Itoa(int(pk.PubKeyAlgo))) - } - if err != nil { - return - } - - pk.setFingerPrintAndKeyId() - return -} - -func (pk *PublicKey) setFingerPrintAndKeyId() { - // RFC 4880, section 12.2 - fingerPrint := sha1.New() - pk.SerializeSignaturePrefix(fingerPrint) - pk.serializeWithoutHeaders(fingerPrint) - copy(pk.Fingerprint[:], fingerPrint.Sum(nil)) - pk.KeyId = binary.BigEndian.Uint64(pk.Fingerprint[12:20]) -} - -// parseRSA parses RSA public key material from the given Reader. See RFC 4880, -// section 5.5.2. -func (pk *PublicKey) parseRSA(r io.Reader) (err error) { - pk.n.bytes, pk.n.bitLength, err = readMPI(r) - if err != nil { - return - } - pk.e.bytes, pk.e.bitLength, err = readMPI(r) - if err != nil { - return - } - - if len(pk.e.bytes) > 3 { - err = errors.UnsupportedError("large public exponent") - return - } - rsa := &rsa.PublicKey{ - N: new(big.Int).SetBytes(pk.n.bytes), - E: 0, - } - for i := 0; i < len(pk.e.bytes); i++ { - rsa.E <<= 8 - rsa.E |= int(pk.e.bytes[i]) - } - pk.PublicKey = rsa - return -} - -// parseDSA parses DSA public key material from the given Reader. See RFC 4880, -// section 5.5.2. -func (pk *PublicKey) parseDSA(r io.Reader) (err error) { - pk.p.bytes, pk.p.bitLength, err = readMPI(r) - if err != nil { - return - } - pk.q.bytes, pk.q.bitLength, err = readMPI(r) - if err != nil { - return - } - pk.g.bytes, pk.g.bitLength, err = readMPI(r) - if err != nil { - return - } - pk.y.bytes, pk.y.bitLength, err = readMPI(r) - if err != nil { - return - } - - dsa := new(dsa.PublicKey) - dsa.P = new(big.Int).SetBytes(pk.p.bytes) - dsa.Q = new(big.Int).SetBytes(pk.q.bytes) - dsa.G = new(big.Int).SetBytes(pk.g.bytes) - dsa.Y = new(big.Int).SetBytes(pk.y.bytes) - pk.PublicKey = dsa - return -} - -// parseElGamal parses ElGamal public key material from the given Reader. See -// RFC 4880, section 5.5.2. -func (pk *PublicKey) parseElGamal(r io.Reader) (err error) { - pk.p.bytes, pk.p.bitLength, err = readMPI(r) - if err != nil { - return - } - pk.g.bytes, pk.g.bitLength, err = readMPI(r) - if err != nil { - return - } - pk.y.bytes, pk.y.bitLength, err = readMPI(r) - if err != nil { - return - } - - elgamal := new(elgamal.PublicKey) - elgamal.P = new(big.Int).SetBytes(pk.p.bytes) - elgamal.G = new(big.Int).SetBytes(pk.g.bytes) - elgamal.Y = new(big.Int).SetBytes(pk.y.bytes) - pk.PublicKey = elgamal - return -} - -// SerializeSignaturePrefix writes the prefix for this public key to the given Writer. -// The prefix is used when calculating a signature over this public key. See -// RFC 4880, section 5.2.4. -func (pk *PublicKey) SerializeSignaturePrefix(h io.Writer) { - var pLength uint16 - switch pk.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly: - pLength += 2 + uint16(len(pk.n.bytes)) - pLength += 2 + uint16(len(pk.e.bytes)) - case PubKeyAlgoDSA: - pLength += 2 + uint16(len(pk.p.bytes)) - pLength += 2 + uint16(len(pk.q.bytes)) - pLength += 2 + uint16(len(pk.g.bytes)) - pLength += 2 + uint16(len(pk.y.bytes)) - case PubKeyAlgoElGamal: - pLength += 2 + uint16(len(pk.p.bytes)) - pLength += 2 + uint16(len(pk.g.bytes)) - pLength += 2 + uint16(len(pk.y.bytes)) - case PubKeyAlgoECDSA: - pLength += uint16(pk.ec.byteLen()) - case PubKeyAlgoECDH: - pLength += uint16(pk.ec.byteLen()) - pLength += uint16(pk.ecdh.byteLen()) - default: - panic("unknown public key algorithm") - } - pLength += 6 - h.Write([]byte{0x99, byte(pLength >> 8), byte(pLength)}) - return -} - -func (pk *PublicKey) Serialize(w io.Writer) (err error) { - length := 6 // 6 byte header - - switch pk.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly: - length += 2 + len(pk.n.bytes) - length += 2 + len(pk.e.bytes) - case PubKeyAlgoDSA: - length += 2 + len(pk.p.bytes) - length += 2 + len(pk.q.bytes) - length += 2 + len(pk.g.bytes) - length += 2 + len(pk.y.bytes) - case PubKeyAlgoElGamal: - length += 2 + len(pk.p.bytes) - length += 2 + len(pk.g.bytes) - length += 2 + len(pk.y.bytes) - case PubKeyAlgoECDSA: - length += pk.ec.byteLen() - case PubKeyAlgoECDH: - length += pk.ec.byteLen() - length += pk.ecdh.byteLen() - default: - panic("unknown public key algorithm") - } - - packetType := packetTypePublicKey - if pk.IsSubkey { - packetType = packetTypePublicSubkey - } - err = serializeHeader(w, packetType, length) - if err != nil { - return - } - return pk.serializeWithoutHeaders(w) -} - -// serializeWithoutHeaders marshals the PublicKey to w in the form of an -// OpenPGP public key packet, not including the packet header. -func (pk *PublicKey) serializeWithoutHeaders(w io.Writer) (err error) { - var buf [6]byte - buf[0] = 4 - t := uint32(pk.CreationTime.Unix()) - buf[1] = byte(t >> 24) - buf[2] = byte(t >> 16) - buf[3] = byte(t >> 8) - buf[4] = byte(t) - buf[5] = byte(pk.PubKeyAlgo) - - _, err = w.Write(buf[:]) - if err != nil { - return - } - - switch pk.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly: - return writeMPIs(w, pk.n, pk.e) - case PubKeyAlgoDSA: - return writeMPIs(w, pk.p, pk.q, pk.g, pk.y) - case PubKeyAlgoElGamal: - return writeMPIs(w, pk.p, pk.g, pk.y) - case PubKeyAlgoECDSA: - return pk.ec.serialize(w) - case PubKeyAlgoECDH: - if err = pk.ec.serialize(w); err != nil { - return - } - return pk.ecdh.serialize(w) - } - return errors.InvalidArgumentError("bad public-key algorithm") -} - -// CanSign returns true iff this public key can generate signatures -func (pk *PublicKey) CanSign() bool { - return pk.PubKeyAlgo != PubKeyAlgoRSAEncryptOnly && pk.PubKeyAlgo != PubKeyAlgoElGamal -} - -// VerifySignature returns nil iff sig is a valid signature, made by this -// public key, of the data hashed into signed. signed is mutated by this call. -func (pk *PublicKey) VerifySignature(signed hash.Hash, sig *Signature) (err error) { - if !pk.CanSign() { - return errors.InvalidArgumentError("public key cannot generate signatures") - } - - signed.Write(sig.HashSuffix) - hashBytes := signed.Sum(nil) - - if hashBytes[0] != sig.HashTag[0] || hashBytes[1] != sig.HashTag[1] { - return errors.SignatureError("hash tag doesn't match") - } - - if pk.PubKeyAlgo != sig.PubKeyAlgo { - return errors.InvalidArgumentError("public key and signature use different algorithms") - } - - switch pk.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly: - rsaPublicKey, _ := pk.PublicKey.(*rsa.PublicKey) - err = rsa.VerifyPKCS1v15(rsaPublicKey, sig.Hash, hashBytes, sig.RSASignature.bytes) - if err != nil { - return errors.SignatureError("RSA verification failure") - } - return nil - case PubKeyAlgoDSA: - dsaPublicKey, _ := pk.PublicKey.(*dsa.PublicKey) - // Need to truncate hashBytes to match FIPS 186-3 section 4.6. - subgroupSize := (dsaPublicKey.Q.BitLen() + 7) / 8 - if len(hashBytes) > subgroupSize { - hashBytes = hashBytes[:subgroupSize] - } - if !dsa.Verify(dsaPublicKey, hashBytes, new(big.Int).SetBytes(sig.DSASigR.bytes), new(big.Int).SetBytes(sig.DSASigS.bytes)) { - return errors.SignatureError("DSA verification failure") - } - return nil - case PubKeyAlgoECDSA: - ecdsaPublicKey := pk.PublicKey.(*ecdsa.PublicKey) - if !ecdsa.Verify(ecdsaPublicKey, hashBytes, new(big.Int).SetBytes(sig.ECDSASigR.bytes), new(big.Int).SetBytes(sig.ECDSASigS.bytes)) { - return errors.SignatureError("ECDSA verification failure") - } - return nil - default: - return errors.SignatureError("Unsupported public key algorithm used in signature") - } -} - -// VerifySignatureV3 returns nil iff sig is a valid signature, made by this -// public key, of the data hashed into signed. signed is mutated by this call. -func (pk *PublicKey) VerifySignatureV3(signed hash.Hash, sig *SignatureV3) (err error) { - if !pk.CanSign() { - return errors.InvalidArgumentError("public key cannot generate signatures") - } - - suffix := make([]byte, 5) - suffix[0] = byte(sig.SigType) - binary.BigEndian.PutUint32(suffix[1:], uint32(sig.CreationTime.Unix())) - signed.Write(suffix) - hashBytes := signed.Sum(nil) - - if hashBytes[0] != sig.HashTag[0] || hashBytes[1] != sig.HashTag[1] { - return errors.SignatureError("hash tag doesn't match") - } - - if pk.PubKeyAlgo != sig.PubKeyAlgo { - return errors.InvalidArgumentError("public key and signature use different algorithms") - } - - switch pk.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly: - rsaPublicKey := pk.PublicKey.(*rsa.PublicKey) - if err = rsa.VerifyPKCS1v15(rsaPublicKey, sig.Hash, hashBytes, sig.RSASignature.bytes); err != nil { - return errors.SignatureError("RSA verification failure") - } - return - case PubKeyAlgoDSA: - dsaPublicKey := pk.PublicKey.(*dsa.PublicKey) - // Need to truncate hashBytes to match FIPS 186-3 section 4.6. - subgroupSize := (dsaPublicKey.Q.BitLen() + 7) / 8 - if len(hashBytes) > subgroupSize { - hashBytes = hashBytes[:subgroupSize] - } - if !dsa.Verify(dsaPublicKey, hashBytes, new(big.Int).SetBytes(sig.DSASigR.bytes), new(big.Int).SetBytes(sig.DSASigS.bytes)) { - return errors.SignatureError("DSA verification failure") - } - return nil - default: - panic("shouldn't happen") - } -} - -// keySignatureHash returns a Hash of the message that needs to be signed for -// pk to assert a subkey relationship to signed. -func keySignatureHash(pk, signed signingKey, hashFunc crypto.Hash) (h hash.Hash, err error) { - if !hashFunc.Available() { - return nil, errors.UnsupportedError("hash function") - } - h = hashFunc.New() - - // RFC 4880, section 5.2.4 - pk.SerializeSignaturePrefix(h) - pk.serializeWithoutHeaders(h) - signed.SerializeSignaturePrefix(h) - signed.serializeWithoutHeaders(h) - return -} - -// VerifyKeySignature returns nil iff sig is a valid signature, made by this -// public key, of signed. -func (pk *PublicKey) VerifyKeySignature(signed *PublicKey, sig *Signature) error { - h, err := keySignatureHash(pk, signed, sig.Hash) - if err != nil { - return err - } - if err = pk.VerifySignature(h, sig); err != nil { - return err - } - - if sig.FlagSign { - // Signing subkeys must be cross-signed. See - // https://www.gnupg.org/faq/subkey-cross-certify.html. - if sig.EmbeddedSignature == nil { - return errors.StructuralError("signing subkey is missing cross-signature") - } - // Verify the cross-signature. This is calculated over the same - // data as the main signature, so we cannot just recursively - // call signed.VerifyKeySignature(...) - if h, err = keySignatureHash(pk, signed, sig.EmbeddedSignature.Hash); err != nil { - return errors.StructuralError("error while hashing for cross-signature: " + err.Error()) - } - if err := signed.VerifySignature(h, sig.EmbeddedSignature); err != nil { - return errors.StructuralError("error while verifying cross-signature: " + err.Error()) - } - } - - return nil -} - -func keyRevocationHash(pk signingKey, hashFunc crypto.Hash) (h hash.Hash, err error) { - if !hashFunc.Available() { - return nil, errors.UnsupportedError("hash function") - } - h = hashFunc.New() - - // RFC 4880, section 5.2.4 - pk.SerializeSignaturePrefix(h) - pk.serializeWithoutHeaders(h) - - return -} - -// VerifyRevocationSignature returns nil iff sig is a valid signature, made by this -// public key. -func (pk *PublicKey) VerifyRevocationSignature(sig *Signature) (err error) { - h, err := keyRevocationHash(pk, sig.Hash) - if err != nil { - return err - } - return pk.VerifySignature(h, sig) -} - -// userIdSignatureHash returns a Hash of the message that needs to be signed -// to assert that pk is a valid key for id. -func userIdSignatureHash(id string, pk *PublicKey, hashFunc crypto.Hash) (h hash.Hash, err error) { - if !hashFunc.Available() { - return nil, errors.UnsupportedError("hash function") - } - h = hashFunc.New() - - // RFC 4880, section 5.2.4 - pk.SerializeSignaturePrefix(h) - pk.serializeWithoutHeaders(h) - - var buf [5]byte - buf[0] = 0xb4 - buf[1] = byte(len(id) >> 24) - buf[2] = byte(len(id) >> 16) - buf[3] = byte(len(id) >> 8) - buf[4] = byte(len(id)) - h.Write(buf[:]) - h.Write([]byte(id)) - - return -} - -// VerifyUserIdSignature returns nil iff sig is a valid signature, made by this -// public key, that id is the identity of pub. -func (pk *PublicKey) VerifyUserIdSignature(id string, pub *PublicKey, sig *Signature) (err error) { - h, err := userIdSignatureHash(id, pub, sig.Hash) - if err != nil { - return err - } - return pk.VerifySignature(h, sig) -} - -// VerifyUserIdSignatureV3 returns nil iff sig is a valid signature, made by this -// public key, that id is the identity of pub. -func (pk *PublicKey) VerifyUserIdSignatureV3(id string, pub *PublicKey, sig *SignatureV3) (err error) { - h, err := userIdSignatureV3Hash(id, pub, sig.Hash) - if err != nil { - return err - } - return pk.VerifySignatureV3(h, sig) -} - -// KeyIdString returns the public key's fingerprint in capital hex -// (e.g. "6C7EE1B8621CC013"). -func (pk *PublicKey) KeyIdString() string { - return fmt.Sprintf("%X", pk.Fingerprint[12:20]) -} - -// KeyIdShortString returns the short form of public key's fingerprint -// in capital hex, as shown by gpg --list-keys (e.g. "621CC013"). -func (pk *PublicKey) KeyIdShortString() string { - return fmt.Sprintf("%X", pk.Fingerprint[16:20]) -} - -// A parsedMPI is used to store the contents of a big integer, along with the -// bit length that was specified in the original input. This allows the MPI to -// be reserialized exactly. -type parsedMPI struct { - bytes []byte - bitLength uint16 -} - -// writeMPIs is a utility function for serializing several big integers to the -// given Writer. -func writeMPIs(w io.Writer, mpis ...parsedMPI) (err error) { - for _, mpi := range mpis { - err = writeMPI(w, mpi.bitLength, mpi.bytes) - if err != nil { - return - } - } - return -} - -// BitLength returns the bit length for the given public key. -func (pk *PublicKey) BitLength() (bitLength uint16, err error) { - switch pk.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly: - bitLength = pk.n.bitLength - case PubKeyAlgoDSA: - bitLength = pk.p.bitLength - case PubKeyAlgoElGamal: - bitLength = pk.p.bitLength - default: - err = errors.InvalidArgumentError("bad public-key algorithm") - } - return -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/public_key_test.go b/vendor/golang.org/x/crypto/openpgp/packet/public_key_test.go deleted file mode 100644 index 7ad7d9185..000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/public_key_test.go +++ /dev/null @@ -1,202 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package packet - -import ( - "bytes" - "encoding/hex" - "testing" - "time" -) - -var pubKeyTests = []struct { - hexData string - hexFingerprint string - creationTime time.Time - pubKeyAlgo PublicKeyAlgorithm - keyId uint64 - keyIdString string - keyIdShort string -}{ - {rsaPkDataHex, rsaFingerprintHex, time.Unix(0x4d3c5c10, 0), PubKeyAlgoRSA, 0xa34d7e18c20c31bb, "A34D7E18C20C31BB", "C20C31BB"}, - {dsaPkDataHex, dsaFingerprintHex, time.Unix(0x4d432f89, 0), PubKeyAlgoDSA, 0x8e8fbe54062f19ed, "8E8FBE54062F19ED", "062F19ED"}, - {ecdsaPkDataHex, ecdsaFingerprintHex, time.Unix(0x5071c294, 0), PubKeyAlgoECDSA, 0x43fe956c542ca00b, "43FE956C542CA00B", "542CA00B"}, -} - -func TestPublicKeyRead(t *testing.T) { - for i, test := range pubKeyTests { - packet, err := Read(readerFromHex(test.hexData)) - if err != nil { - t.Errorf("#%d: Read error: %s", i, err) - continue - } - pk, ok := packet.(*PublicKey) - if !ok { - t.Errorf("#%d: failed to parse, got: %#v", i, packet) - continue - } - if pk.PubKeyAlgo != test.pubKeyAlgo { - t.Errorf("#%d: bad public key algorithm got:%x want:%x", i, pk.PubKeyAlgo, test.pubKeyAlgo) - } - if !pk.CreationTime.Equal(test.creationTime) { - t.Errorf("#%d: bad creation time got:%v want:%v", i, pk.CreationTime, test.creationTime) - } - expectedFingerprint, _ := hex.DecodeString(test.hexFingerprint) - if !bytes.Equal(expectedFingerprint, pk.Fingerprint[:]) { - t.Errorf("#%d: bad fingerprint got:%x want:%x", i, pk.Fingerprint[:], expectedFingerprint) - } - if pk.KeyId != test.keyId { - t.Errorf("#%d: bad keyid got:%x want:%x", i, pk.KeyId, test.keyId) - } - if g, e := pk.KeyIdString(), test.keyIdString; g != e { - t.Errorf("#%d: bad KeyIdString got:%q want:%q", i, g, e) - } - if g, e := pk.KeyIdShortString(), test.keyIdShort; g != e { - t.Errorf("#%d: bad KeyIdShortString got:%q want:%q", i, g, e) - } - } -} - -func TestPublicKeySerialize(t *testing.T) { - for i, test := range pubKeyTests { - packet, err := Read(readerFromHex(test.hexData)) - if err != nil { - t.Errorf("#%d: Read error: %s", i, err) - continue - } - pk, ok := packet.(*PublicKey) - if !ok { - t.Errorf("#%d: failed to parse, got: %#v", i, packet) - continue - } - serializeBuf := bytes.NewBuffer(nil) - err = pk.Serialize(serializeBuf) - if err != nil { - t.Errorf("#%d: failed to serialize: %s", i, err) - continue - } - - packet, err = Read(serializeBuf) - if err != nil { - t.Errorf("#%d: Read error (from serialized data): %s", i, err) - continue - } - pk, ok = packet.(*PublicKey) - if !ok { - t.Errorf("#%d: failed to parse serialized data, got: %#v", i, packet) - continue - } - } -} - -func TestEcc384Serialize(t *testing.T) { - r := readerFromHex(ecc384PubHex) - var w bytes.Buffer - for i := 0; i < 2; i++ { - // Public key - p, err := Read(r) - if err != nil { - t.Error(err) - } - pubkey := p.(*PublicKey) - if !bytes.Equal(pubkey.ec.oid, []byte{0x2b, 0x81, 0x04, 0x00, 0x22}) { - t.Errorf("Unexpected pubkey OID: %x", pubkey.ec.oid) - } - if !bytes.Equal(pubkey.ec.p.bytes[:5], []byte{0x04, 0xf6, 0xb8, 0xc5, 0xac}) { - t.Errorf("Unexpected pubkey P[:5]: %x", pubkey.ec.p.bytes) - } - if pubkey.KeyId != 0x098033880F54719F { - t.Errorf("Unexpected pubkey ID: %x", pubkey.KeyId) - } - err = pubkey.Serialize(&w) - if err != nil { - t.Error(err) - } - // User ID - p, err = Read(r) - if err != nil { - t.Error(err) - } - uid := p.(*UserId) - if uid.Id != "ec_dsa_dh_384 " { - t.Error("Unexpected UID:", uid.Id) - } - err = uid.Serialize(&w) - if err != nil { - t.Error(err) - } - // User ID Sig - p, err = Read(r) - if err != nil { - t.Error(err) - } - uidSig := p.(*Signature) - err = pubkey.VerifyUserIdSignature(uid.Id, pubkey, uidSig) - if err != nil { - t.Error(err, ": UID") - } - err = uidSig.Serialize(&w) - if err != nil { - t.Error(err) - } - // Subkey - p, err = Read(r) - if err != nil { - t.Error(err) - } - subkey := p.(*PublicKey) - if !bytes.Equal(subkey.ec.oid, []byte{0x2b, 0x81, 0x04, 0x00, 0x22}) { - t.Errorf("Unexpected subkey OID: %x", subkey.ec.oid) - } - if !bytes.Equal(subkey.ec.p.bytes[:5], []byte{0x04, 0x2f, 0xaa, 0x84, 0x02}) { - t.Errorf("Unexpected subkey P[:5]: %x", subkey.ec.p.bytes) - } - if subkey.ecdh.KdfHash != 0x09 { - t.Error("Expected KDF hash function SHA384 (0x09), got", subkey.ecdh.KdfHash) - } - if subkey.ecdh.KdfAlgo != 0x09 { - t.Error("Expected KDF symmetric alg AES256 (0x09), got", subkey.ecdh.KdfAlgo) - } - if subkey.KeyId != 0xAA8B938F9A201946 { - t.Errorf("Unexpected subkey ID: %x", subkey.KeyId) - } - err = subkey.Serialize(&w) - if err != nil { - t.Error(err) - } - // Subkey Sig - p, err = Read(r) - if err != nil { - t.Error(err) - } - subkeySig := p.(*Signature) - err = pubkey.VerifyKeySignature(subkey, subkeySig) - if err != nil { - t.Error(err) - } - err = subkeySig.Serialize(&w) - if err != nil { - t.Error(err) - } - // Now read back what we've written again - r = bytes.NewBuffer(w.Bytes()) - w.Reset() - } -} - -const rsaFingerprintHex = "5fb74b1d03b1e3cb31bc2f8aa34d7e18c20c31bb" - -const rsaPkDataHex = "988d044d3c5c10010400b1d13382944bd5aba23a4312968b5095d14f947f600eb478e14a6fcb16b0e0cac764884909c020bc495cfcc39a935387c661507bdb236a0612fb582cac3af9b29cc2c8c70090616c41b662f4da4c1201e195472eb7f4ae1ccbcbf9940fe21d985e379a5563dde5b9a23d35f1cfaa5790da3b79db26f23695107bfaca8e7b5bcd0011010001" - -const dsaFingerprintHex = "eece4c094db002103714c63c8e8fbe54062f19ed" - -const dsaPkDataHex = "9901a2044d432f89110400cd581334f0d7a1e1bdc8b9d6d8c0baf68793632735d2bb0903224cbaa1dfbf35a60ee7a13b92643421e1eb41aa8d79bea19a115a677f6b8ba3c7818ce53a6c2a24a1608bd8b8d6e55c5090cbde09dd26e356267465ae25e69ec8bdd57c7bbb2623e4d73336f73a0a9098f7f16da2e25252130fd694c0e8070c55a812a423ae7f00a0ebf50e70c2f19c3520a551bd4b08d30f23530d3d03ff7d0bf4a53a64a09dc5e6e6e35854b7d70c882b0c60293401958b1bd9e40abec3ea05ba87cf64899299d4bd6aa7f459c201d3fbbd6c82004bdc5e8a9eb8082d12054cc90fa9d4ec251a843236a588bf49552441817436c4f43326966fe85447d4e6d0acf8fa1ef0f014730770603ad7634c3088dc52501c237328417c31c89ed70400b2f1a98b0bf42f11fefc430704bebbaa41d9f355600c3facee1e490f64208e0e094ea55e3a598a219a58500bf78ac677b670a14f4e47e9cf8eab4f368cc1ddcaa18cc59309d4cc62dd4f680e73e6cc3e1ce87a84d0925efbcb26c575c093fc42eecf45135fabf6403a25c2016e1774c0484e440a18319072c617cc97ac0a3bb0" - -const ecdsaFingerprintHex = "9892270b38b8980b05c8d56d43fe956c542ca00b" - -const ecdsaPkDataHex = "9893045071c29413052b8104002304230401f4867769cedfa52c325018896245443968e52e51d0c2df8d939949cb5b330f2921711fbee1c9b9dddb95d15cb0255e99badeddda7cc23d9ddcaacbc290969b9f24019375d61c2e4e3b36953a28d8b2bc95f78c3f1d592fb24499be348656a7b17e3963187b4361afe497bc5f9f81213f04069f8e1fb9e6a6290ae295ca1a92b894396cb4" - -// Source: https://sites.google.com/site/brainhub/pgpecckeys#TOC-ECC-NIST-P-384-key -const ecc384PubHex = `99006f044d53059213052b81040022030304f6b8c5aced5b84ef9f4a209db2e4a9dfb70d28cb8c10ecd57674a9fa5a67389942b62d5e51367df4c7bfd3f8e500feecf07ed265a621a8ebbbe53e947ec78c677eba143bd1533c2b350e1c29f82313e1e1108eba063be1e64b10e6950e799c2db42465635f6473615f64685f333834203c6f70656e70677040627261696e6875622e6f72673e8900cb04101309005305024d530592301480000000002000077072656665727265642d656d61696c2d656e636f64696e67407067702e636f6d7067706d696d65040b090807021901051b03000000021602051e010000000415090a08000a0910098033880f54719fca2b0180aa37350968bd5f115afd8ce7bc7b103822152dbff06d0afcda835329510905b98cb469ba208faab87c7412b799e7b633017f58364ea480e8a1a3f253a0c5f22c446e8be9a9fce6210136ee30811abbd49139de28b5bdf8dc36d06ae748579e9ff503b90073044d53059212052b810400220303042faa84024a20b6735c4897efa5bfb41bf85b7eefeab5ca0cb9ffc8ea04a46acb25534a577694f9e25340a4ab5223a9dd1eda530c8aa2e6718db10d7e672558c7736fe09369ea5739a2a3554bf16d41faa50562f11c6d39bbd5dffb6b9a9ec9180301090989008404181309000c05024d530592051b0c000000000a0910098033880f54719f80970180eee7a6d8fcee41ee4f9289df17f9bcf9d955dca25c583b94336f3a2b2d4986dc5cf417b8d2dc86f741a9e1a6d236c0e3017d1c76575458a0cfb93ae8a2b274fcc65ceecd7a91eec83656ba13219969f06945b48c56bd04152c3a0553c5f2f4bd1267` diff --git a/vendor/golang.org/x/crypto/openpgp/packet/public_key_v3.go b/vendor/golang.org/x/crypto/openpgp/packet/public_key_v3.go deleted file mode 100644 index 5daf7b6cf..000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/public_key_v3.go +++ /dev/null @@ -1,279 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package packet - -import ( - "crypto" - "crypto/md5" - "crypto/rsa" - "encoding/binary" - "fmt" - "hash" - "io" - "math/big" - "strconv" - "time" - - "golang.org/x/crypto/openpgp/errors" -) - -// PublicKeyV3 represents older, version 3 public keys. These keys are less secure and -// should not be used for signing or encrypting. They are supported here only for -// parsing version 3 key material and validating signatures. -// See RFC 4880, section 5.5.2. -type PublicKeyV3 struct { - CreationTime time.Time - DaysToExpire uint16 - PubKeyAlgo PublicKeyAlgorithm - PublicKey *rsa.PublicKey - Fingerprint [16]byte - KeyId uint64 - IsSubkey bool - - n, e parsedMPI -} - -// newRSAPublicKeyV3 returns a PublicKey that wraps the given rsa.PublicKey. -// Included here for testing purposes only. RFC 4880, section 5.5.2: -// "an implementation MUST NOT generate a V3 key, but MAY accept it." -func newRSAPublicKeyV3(creationTime time.Time, pub *rsa.PublicKey) *PublicKeyV3 { - pk := &PublicKeyV3{ - CreationTime: creationTime, - PublicKey: pub, - n: fromBig(pub.N), - e: fromBig(big.NewInt(int64(pub.E))), - } - - pk.setFingerPrintAndKeyId() - return pk -} - -func (pk *PublicKeyV3) parse(r io.Reader) (err error) { - // RFC 4880, section 5.5.2 - var buf [8]byte - if _, err = readFull(r, buf[:]); err != nil { - return - } - if buf[0] < 2 || buf[0] > 3 { - return errors.UnsupportedError("public key version") - } - pk.CreationTime = time.Unix(int64(uint32(buf[1])<<24|uint32(buf[2])<<16|uint32(buf[3])<<8|uint32(buf[4])), 0) - pk.DaysToExpire = binary.BigEndian.Uint16(buf[5:7]) - pk.PubKeyAlgo = PublicKeyAlgorithm(buf[7]) - switch pk.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly: - err = pk.parseRSA(r) - default: - err = errors.UnsupportedError("public key type: " + strconv.Itoa(int(pk.PubKeyAlgo))) - } - if err != nil { - return - } - - pk.setFingerPrintAndKeyId() - return -} - -func (pk *PublicKeyV3) setFingerPrintAndKeyId() { - // RFC 4880, section 12.2 - fingerPrint := md5.New() - fingerPrint.Write(pk.n.bytes) - fingerPrint.Write(pk.e.bytes) - fingerPrint.Sum(pk.Fingerprint[:0]) - pk.KeyId = binary.BigEndian.Uint64(pk.n.bytes[len(pk.n.bytes)-8:]) -} - -// parseRSA parses RSA public key material from the given Reader. See RFC 4880, -// section 5.5.2. -func (pk *PublicKeyV3) parseRSA(r io.Reader) (err error) { - if pk.n.bytes, pk.n.bitLength, err = readMPI(r); err != nil { - return - } - if pk.e.bytes, pk.e.bitLength, err = readMPI(r); err != nil { - return - } - - // RFC 4880 Section 12.2 requires the low 8 bytes of the - // modulus to form the key id. - if len(pk.n.bytes) < 8 { - return errors.StructuralError("v3 public key modulus is too short") - } - if len(pk.e.bytes) > 3 { - err = errors.UnsupportedError("large public exponent") - return - } - rsa := &rsa.PublicKey{N: new(big.Int).SetBytes(pk.n.bytes)} - for i := 0; i < len(pk.e.bytes); i++ { - rsa.E <<= 8 - rsa.E |= int(pk.e.bytes[i]) - } - pk.PublicKey = rsa - return -} - -// SerializeSignaturePrefix writes the prefix for this public key to the given Writer. -// The prefix is used when calculating a signature over this public key. See -// RFC 4880, section 5.2.4. -func (pk *PublicKeyV3) SerializeSignaturePrefix(w io.Writer) { - var pLength uint16 - switch pk.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly: - pLength += 2 + uint16(len(pk.n.bytes)) - pLength += 2 + uint16(len(pk.e.bytes)) - default: - panic("unknown public key algorithm") - } - pLength += 6 - w.Write([]byte{0x99, byte(pLength >> 8), byte(pLength)}) - return -} - -func (pk *PublicKeyV3) Serialize(w io.Writer) (err error) { - length := 8 // 8 byte header - - switch pk.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly: - length += 2 + len(pk.n.bytes) - length += 2 + len(pk.e.bytes) - default: - panic("unknown public key algorithm") - } - - packetType := packetTypePublicKey - if pk.IsSubkey { - packetType = packetTypePublicSubkey - } - if err = serializeHeader(w, packetType, length); err != nil { - return - } - return pk.serializeWithoutHeaders(w) -} - -// serializeWithoutHeaders marshals the PublicKey to w in the form of an -// OpenPGP public key packet, not including the packet header. -func (pk *PublicKeyV3) serializeWithoutHeaders(w io.Writer) (err error) { - var buf [8]byte - // Version 3 - buf[0] = 3 - // Creation time - t := uint32(pk.CreationTime.Unix()) - buf[1] = byte(t >> 24) - buf[2] = byte(t >> 16) - buf[3] = byte(t >> 8) - buf[4] = byte(t) - // Days to expire - buf[5] = byte(pk.DaysToExpire >> 8) - buf[6] = byte(pk.DaysToExpire) - // Public key algorithm - buf[7] = byte(pk.PubKeyAlgo) - - if _, err = w.Write(buf[:]); err != nil { - return - } - - switch pk.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly: - return writeMPIs(w, pk.n, pk.e) - } - return errors.InvalidArgumentError("bad public-key algorithm") -} - -// CanSign returns true iff this public key can generate signatures -func (pk *PublicKeyV3) CanSign() bool { - return pk.PubKeyAlgo != PubKeyAlgoRSAEncryptOnly -} - -// VerifySignatureV3 returns nil iff sig is a valid signature, made by this -// public key, of the data hashed into signed. signed is mutated by this call. -func (pk *PublicKeyV3) VerifySignatureV3(signed hash.Hash, sig *SignatureV3) (err error) { - if !pk.CanSign() { - return errors.InvalidArgumentError("public key cannot generate signatures") - } - - suffix := make([]byte, 5) - suffix[0] = byte(sig.SigType) - binary.BigEndian.PutUint32(suffix[1:], uint32(sig.CreationTime.Unix())) - signed.Write(suffix) - hashBytes := signed.Sum(nil) - - if hashBytes[0] != sig.HashTag[0] || hashBytes[1] != sig.HashTag[1] { - return errors.SignatureError("hash tag doesn't match") - } - - if pk.PubKeyAlgo != sig.PubKeyAlgo { - return errors.InvalidArgumentError("public key and signature use different algorithms") - } - - switch pk.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly: - if err = rsa.VerifyPKCS1v15(pk.PublicKey, sig.Hash, hashBytes, sig.RSASignature.bytes); err != nil { - return errors.SignatureError("RSA verification failure") - } - return - default: - // V3 public keys only support RSA. - panic("shouldn't happen") - } -} - -// VerifyUserIdSignatureV3 returns nil iff sig is a valid signature, made by this -// public key, that id is the identity of pub. -func (pk *PublicKeyV3) VerifyUserIdSignatureV3(id string, pub *PublicKeyV3, sig *SignatureV3) (err error) { - h, err := userIdSignatureV3Hash(id, pk, sig.Hash) - if err != nil { - return err - } - return pk.VerifySignatureV3(h, sig) -} - -// VerifyKeySignatureV3 returns nil iff sig is a valid signature, made by this -// public key, of signed. -func (pk *PublicKeyV3) VerifyKeySignatureV3(signed *PublicKeyV3, sig *SignatureV3) (err error) { - h, err := keySignatureHash(pk, signed, sig.Hash) - if err != nil { - return err - } - return pk.VerifySignatureV3(h, sig) -} - -// userIdSignatureV3Hash returns a Hash of the message that needs to be signed -// to assert that pk is a valid key for id. -func userIdSignatureV3Hash(id string, pk signingKey, hfn crypto.Hash) (h hash.Hash, err error) { - if !hfn.Available() { - return nil, errors.UnsupportedError("hash function") - } - h = hfn.New() - - // RFC 4880, section 5.2.4 - pk.SerializeSignaturePrefix(h) - pk.serializeWithoutHeaders(h) - - h.Write([]byte(id)) - - return -} - -// KeyIdString returns the public key's fingerprint in capital hex -// (e.g. "6C7EE1B8621CC013"). -func (pk *PublicKeyV3) KeyIdString() string { - return fmt.Sprintf("%X", pk.KeyId) -} - -// KeyIdShortString returns the short form of public key's fingerprint -// in capital hex, as shown by gpg --list-keys (e.g. "621CC013"). -func (pk *PublicKeyV3) KeyIdShortString() string { - return fmt.Sprintf("%X", pk.KeyId&0xFFFFFFFF) -} - -// BitLength returns the bit length for the given public key. -func (pk *PublicKeyV3) BitLength() (bitLength uint16, err error) { - switch pk.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly: - bitLength = pk.n.bitLength - default: - err = errors.InvalidArgumentError("bad public-key algorithm") - } - return -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/public_key_v3_test.go b/vendor/golang.org/x/crypto/openpgp/packet/public_key_v3_test.go deleted file mode 100644 index e06405904..000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/public_key_v3_test.go +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package packet - -import ( - "bytes" - "encoding/hex" - "testing" - "time" -) - -var pubKeyV3Test = struct { - hexFingerprint string - creationTime time.Time - pubKeyAlgo PublicKeyAlgorithm - keyId uint64 - keyIdString string - keyIdShort string -}{ - "103BECF5BD1E837C89D19E98487767F7", - time.Unix(779753634, 0), - PubKeyAlgoRSA, - 0xDE0F188A5DA5E3C9, - "DE0F188A5DA5E3C9", - "5DA5E3C9"} - -func TestPublicKeyV3Read(t *testing.T) { - i, test := 0, pubKeyV3Test - packet, err := Read(v3KeyReader(t)) - if err != nil { - t.Fatalf("#%d: Read error: %s", i, err) - } - pk, ok := packet.(*PublicKeyV3) - if !ok { - t.Fatalf("#%d: failed to parse, got: %#v", i, packet) - } - if pk.PubKeyAlgo != test.pubKeyAlgo { - t.Errorf("#%d: bad public key algorithm got:%x want:%x", i, pk.PubKeyAlgo, test.pubKeyAlgo) - } - if !pk.CreationTime.Equal(test.creationTime) { - t.Errorf("#%d: bad creation time got:%v want:%v", i, pk.CreationTime, test.creationTime) - } - expectedFingerprint, _ := hex.DecodeString(test.hexFingerprint) - if !bytes.Equal(expectedFingerprint, pk.Fingerprint[:]) { - t.Errorf("#%d: bad fingerprint got:%x want:%x", i, pk.Fingerprint[:], expectedFingerprint) - } - if pk.KeyId != test.keyId { - t.Errorf("#%d: bad keyid got:%x want:%x", i, pk.KeyId, test.keyId) - } - if g, e := pk.KeyIdString(), test.keyIdString; g != e { - t.Errorf("#%d: bad KeyIdString got:%q want:%q", i, g, e) - } - if g, e := pk.KeyIdShortString(), test.keyIdShort; g != e { - t.Errorf("#%d: bad KeyIdShortString got:%q want:%q", i, g, e) - } -} - -func TestPublicKeyV3Serialize(t *testing.T) { - //for i, test := range pubKeyV3Tests { - i := 0 - packet, err := Read(v3KeyReader(t)) - if err != nil { - t.Fatalf("#%d: Read error: %s", i, err) - } - pk, ok := packet.(*PublicKeyV3) - if !ok { - t.Fatalf("#%d: failed to parse, got: %#v", i, packet) - } - var serializeBuf bytes.Buffer - if err = pk.Serialize(&serializeBuf); err != nil { - t.Fatalf("#%d: failed to serialize: %s", i, err) - } - - if packet, err = Read(bytes.NewBuffer(serializeBuf.Bytes())); err != nil { - t.Fatalf("#%d: Read error (from serialized data): %s", i, err) - } - if pk, ok = packet.(*PublicKeyV3); !ok { - t.Fatalf("#%d: failed to parse serialized data, got: %#v", i, packet) - } -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/reader.go b/vendor/golang.org/x/crypto/openpgp/packet/reader.go deleted file mode 100644 index 34bc7c613..000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/reader.go +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package packet - -import ( - "golang.org/x/crypto/openpgp/errors" - "io" -) - -// Reader reads packets from an io.Reader and allows packets to be 'unread' so -// that they result from the next call to Next. -type Reader struct { - q []Packet - readers []io.Reader -} - -// New io.Readers are pushed when a compressed or encrypted packet is processed -// and recursively treated as a new source of packets. However, a carefully -// crafted packet can trigger an infinite recursive sequence of packets. See -// http://mumble.net/~campbell/misc/pgp-quine -// https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2013-4402 -// This constant limits the number of recursive packets that may be pushed. -const maxReaders = 32 - -// Next returns the most recently unread Packet, or reads another packet from -// the top-most io.Reader. Unknown packet types are skipped. -func (r *Reader) Next() (p Packet, err error) { - if len(r.q) > 0 { - p = r.q[len(r.q)-1] - r.q = r.q[:len(r.q)-1] - return - } - - for len(r.readers) > 0 { - p, err = Read(r.readers[len(r.readers)-1]) - if err == nil { - return - } - if err == io.EOF { - r.readers = r.readers[:len(r.readers)-1] - continue - } - if _, ok := err.(errors.UnknownPacketTypeError); !ok { - return nil, err - } - } - - return nil, io.EOF -} - -// Push causes the Reader to start reading from a new io.Reader. When an EOF -// error is seen from the new io.Reader, it is popped and the Reader continues -// to read from the next most recent io.Reader. Push returns a StructuralError -// if pushing the reader would exceed the maximum recursion level, otherwise it -// returns nil. -func (r *Reader) Push(reader io.Reader) (err error) { - if len(r.readers) >= maxReaders { - return errors.StructuralError("too many layers of packets") - } - r.readers = append(r.readers, reader) - return nil -} - -// Unread causes the given Packet to be returned from the next call to Next. -func (r *Reader) Unread(p Packet) { - r.q = append(r.q, p) -} - -func NewReader(r io.Reader) *Reader { - return &Reader{ - q: nil, - readers: []io.Reader{r}, - } -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/signature.go b/vendor/golang.org/x/crypto/openpgp/packet/signature.go deleted file mode 100644 index 6ce0cbedb..000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/signature.go +++ /dev/null @@ -1,731 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package packet - -import ( - "bytes" - "crypto" - "crypto/dsa" - "crypto/ecdsa" - "encoding/asn1" - "encoding/binary" - "hash" - "io" - "math/big" - "strconv" - "time" - - "golang.org/x/crypto/openpgp/errors" - "golang.org/x/crypto/openpgp/s2k" -) - -const ( - // See RFC 4880, section 5.2.3.21 for details. - KeyFlagCertify = 1 << iota - KeyFlagSign - KeyFlagEncryptCommunications - KeyFlagEncryptStorage -) - -// Signature represents a signature. See RFC 4880, section 5.2. -type Signature struct { - SigType SignatureType - PubKeyAlgo PublicKeyAlgorithm - Hash crypto.Hash - - // HashSuffix is extra data that is hashed in after the signed data. - HashSuffix []byte - // HashTag contains the first two bytes of the hash for fast rejection - // of bad signed data. - HashTag [2]byte - CreationTime time.Time - - RSASignature parsedMPI - DSASigR, DSASigS parsedMPI - ECDSASigR, ECDSASigS parsedMPI - - // rawSubpackets contains the unparsed subpackets, in order. - rawSubpackets []outputSubpacket - - // The following are optional so are nil when not included in the - // signature. - - SigLifetimeSecs, KeyLifetimeSecs *uint32 - PreferredSymmetric, PreferredHash, PreferredCompression []uint8 - IssuerKeyId *uint64 - IsPrimaryId *bool - - // FlagsValid is set if any flags were given. See RFC 4880, section - // 5.2.3.21 for details. - FlagsValid bool - FlagCertify, FlagSign, FlagEncryptCommunications, FlagEncryptStorage bool - - // RevocationReason is set if this signature has been revoked. - // See RFC 4880, section 5.2.3.23 for details. - RevocationReason *uint8 - RevocationReasonText string - - // MDC is set if this signature has a feature packet that indicates - // support for MDC subpackets. - MDC bool - - // EmbeddedSignature, if non-nil, is a signature of the parent key, by - // this key. This prevents an attacker from claiming another's signing - // subkey as their own. - EmbeddedSignature *Signature - - outSubpackets []outputSubpacket -} - -func (sig *Signature) parse(r io.Reader) (err error) { - // RFC 4880, section 5.2.3 - var buf [5]byte - _, err = readFull(r, buf[:1]) - if err != nil { - return - } - if buf[0] != 4 { - err = errors.UnsupportedError("signature packet version " + strconv.Itoa(int(buf[0]))) - return - } - - _, err = readFull(r, buf[:5]) - if err != nil { - return - } - sig.SigType = SignatureType(buf[0]) - sig.PubKeyAlgo = PublicKeyAlgorithm(buf[1]) - switch sig.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly, PubKeyAlgoDSA, PubKeyAlgoECDSA: - default: - err = errors.UnsupportedError("public key algorithm " + strconv.Itoa(int(sig.PubKeyAlgo))) - return - } - - var ok bool - sig.Hash, ok = s2k.HashIdToHash(buf[2]) - if !ok { - return errors.UnsupportedError("hash function " + strconv.Itoa(int(buf[2]))) - } - - hashedSubpacketsLength := int(buf[3])<<8 | int(buf[4]) - l := 6 + hashedSubpacketsLength - sig.HashSuffix = make([]byte, l+6) - sig.HashSuffix[0] = 4 - copy(sig.HashSuffix[1:], buf[:5]) - hashedSubpackets := sig.HashSuffix[6:l] - _, err = readFull(r, hashedSubpackets) - if err != nil { - return - } - // See RFC 4880, section 5.2.4 - trailer := sig.HashSuffix[l:] - trailer[0] = 4 - trailer[1] = 0xff - trailer[2] = uint8(l >> 24) - trailer[3] = uint8(l >> 16) - trailer[4] = uint8(l >> 8) - trailer[5] = uint8(l) - - err = parseSignatureSubpackets(sig, hashedSubpackets, true) - if err != nil { - return - } - - _, err = readFull(r, buf[:2]) - if err != nil { - return - } - unhashedSubpacketsLength := int(buf[0])<<8 | int(buf[1]) - unhashedSubpackets := make([]byte, unhashedSubpacketsLength) - _, err = readFull(r, unhashedSubpackets) - if err != nil { - return - } - err = parseSignatureSubpackets(sig, unhashedSubpackets, false) - if err != nil { - return - } - - _, err = readFull(r, sig.HashTag[:2]) - if err != nil { - return - } - - switch sig.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly: - sig.RSASignature.bytes, sig.RSASignature.bitLength, err = readMPI(r) - case PubKeyAlgoDSA: - sig.DSASigR.bytes, sig.DSASigR.bitLength, err = readMPI(r) - if err == nil { - sig.DSASigS.bytes, sig.DSASigS.bitLength, err = readMPI(r) - } - case PubKeyAlgoECDSA: - sig.ECDSASigR.bytes, sig.ECDSASigR.bitLength, err = readMPI(r) - if err == nil { - sig.ECDSASigS.bytes, sig.ECDSASigS.bitLength, err = readMPI(r) - } - default: - panic("unreachable") - } - return -} - -// parseSignatureSubpackets parses subpackets of the main signature packet. See -// RFC 4880, section 5.2.3.1. -func parseSignatureSubpackets(sig *Signature, subpackets []byte, isHashed bool) (err error) { - for len(subpackets) > 0 { - subpackets, err = parseSignatureSubpacket(sig, subpackets, isHashed) - if err != nil { - return - } - } - - if sig.CreationTime.IsZero() { - err = errors.StructuralError("no creation time in signature") - } - - return -} - -type signatureSubpacketType uint8 - -const ( - creationTimeSubpacket signatureSubpacketType = 2 - signatureExpirationSubpacket signatureSubpacketType = 3 - keyExpirationSubpacket signatureSubpacketType = 9 - prefSymmetricAlgosSubpacket signatureSubpacketType = 11 - issuerSubpacket signatureSubpacketType = 16 - prefHashAlgosSubpacket signatureSubpacketType = 21 - prefCompressionSubpacket signatureSubpacketType = 22 - primaryUserIdSubpacket signatureSubpacketType = 25 - keyFlagsSubpacket signatureSubpacketType = 27 - reasonForRevocationSubpacket signatureSubpacketType = 29 - featuresSubpacket signatureSubpacketType = 30 - embeddedSignatureSubpacket signatureSubpacketType = 32 -) - -// parseSignatureSubpacket parses a single subpacket. len(subpacket) is >= 1. -func parseSignatureSubpacket(sig *Signature, subpacket []byte, isHashed bool) (rest []byte, err error) { - // RFC 4880, section 5.2.3.1 - var ( - length uint32 - packetType signatureSubpacketType - isCritical bool - ) - switch { - case subpacket[0] < 192: - length = uint32(subpacket[0]) - subpacket = subpacket[1:] - case subpacket[0] < 255: - if len(subpacket) < 2 { - goto Truncated - } - length = uint32(subpacket[0]-192)<<8 + uint32(subpacket[1]) + 192 - subpacket = subpacket[2:] - default: - if len(subpacket) < 5 { - goto Truncated - } - length = uint32(subpacket[1])<<24 | - uint32(subpacket[2])<<16 | - uint32(subpacket[3])<<8 | - uint32(subpacket[4]) - subpacket = subpacket[5:] - } - if length > uint32(len(subpacket)) { - goto Truncated - } - rest = subpacket[length:] - subpacket = subpacket[:length] - if len(subpacket) == 0 { - err = errors.StructuralError("zero length signature subpacket") - return - } - packetType = signatureSubpacketType(subpacket[0] & 0x7f) - isCritical = subpacket[0]&0x80 == 0x80 - subpacket = subpacket[1:] - sig.rawSubpackets = append(sig.rawSubpackets, outputSubpacket{isHashed, packetType, isCritical, subpacket}) - switch packetType { - case creationTimeSubpacket: - if !isHashed { - err = errors.StructuralError("signature creation time in non-hashed area") - return - } - if len(subpacket) != 4 { - err = errors.StructuralError("signature creation time not four bytes") - return - } - t := binary.BigEndian.Uint32(subpacket) - sig.CreationTime = time.Unix(int64(t), 0) - case signatureExpirationSubpacket: - // Signature expiration time, section 5.2.3.10 - if !isHashed { - return - } - if len(subpacket) != 4 { - err = errors.StructuralError("expiration subpacket with bad length") - return - } - sig.SigLifetimeSecs = new(uint32) - *sig.SigLifetimeSecs = binary.BigEndian.Uint32(subpacket) - case keyExpirationSubpacket: - // Key expiration time, section 5.2.3.6 - if !isHashed { - return - } - if len(subpacket) != 4 { - err = errors.StructuralError("key expiration subpacket with bad length") - return - } - sig.KeyLifetimeSecs = new(uint32) - *sig.KeyLifetimeSecs = binary.BigEndian.Uint32(subpacket) - case prefSymmetricAlgosSubpacket: - // Preferred symmetric algorithms, section 5.2.3.7 - if !isHashed { - return - } - sig.PreferredSymmetric = make([]byte, len(subpacket)) - copy(sig.PreferredSymmetric, subpacket) - case issuerSubpacket: - // Issuer, section 5.2.3.5 - if len(subpacket) != 8 { - err = errors.StructuralError("issuer subpacket with bad length") - return - } - sig.IssuerKeyId = new(uint64) - *sig.IssuerKeyId = binary.BigEndian.Uint64(subpacket) - case prefHashAlgosSubpacket: - // Preferred hash algorithms, section 5.2.3.8 - if !isHashed { - return - } - sig.PreferredHash = make([]byte, len(subpacket)) - copy(sig.PreferredHash, subpacket) - case prefCompressionSubpacket: - // Preferred compression algorithms, section 5.2.3.9 - if !isHashed { - return - } - sig.PreferredCompression = make([]byte, len(subpacket)) - copy(sig.PreferredCompression, subpacket) - case primaryUserIdSubpacket: - // Primary User ID, section 5.2.3.19 - if !isHashed { - return - } - if len(subpacket) != 1 { - err = errors.StructuralError("primary user id subpacket with bad length") - return - } - sig.IsPrimaryId = new(bool) - if subpacket[0] > 0 { - *sig.IsPrimaryId = true - } - case keyFlagsSubpacket: - // Key flags, section 5.2.3.21 - if !isHashed { - return - } - if len(subpacket) == 0 { - err = errors.StructuralError("empty key flags subpacket") - return - } - sig.FlagsValid = true - if subpacket[0]&KeyFlagCertify != 0 { - sig.FlagCertify = true - } - if subpacket[0]&KeyFlagSign != 0 { - sig.FlagSign = true - } - if subpacket[0]&KeyFlagEncryptCommunications != 0 { - sig.FlagEncryptCommunications = true - } - if subpacket[0]&KeyFlagEncryptStorage != 0 { - sig.FlagEncryptStorage = true - } - case reasonForRevocationSubpacket: - // Reason For Revocation, section 5.2.3.23 - if !isHashed { - return - } - if len(subpacket) == 0 { - err = errors.StructuralError("empty revocation reason subpacket") - return - } - sig.RevocationReason = new(uint8) - *sig.RevocationReason = subpacket[0] - sig.RevocationReasonText = string(subpacket[1:]) - case featuresSubpacket: - // Features subpacket, section 5.2.3.24 specifies a very general - // mechanism for OpenPGP implementations to signal support for new - // features. In practice, the subpacket is used exclusively to - // indicate support for MDC-protected encryption. - sig.MDC = len(subpacket) >= 1 && subpacket[0]&1 == 1 - case embeddedSignatureSubpacket: - // Only usage is in signatures that cross-certify - // signing subkeys. section 5.2.3.26 describes the - // format, with its usage described in section 11.1 - if sig.EmbeddedSignature != nil { - err = errors.StructuralError("Cannot have multiple embedded signatures") - return - } - sig.EmbeddedSignature = new(Signature) - // Embedded signatures are required to be v4 signatures see - // section 12.1. However, we only parse v4 signatures in this - // file anyway. - if err := sig.EmbeddedSignature.parse(bytes.NewBuffer(subpacket)); err != nil { - return nil, err - } - if sigType := sig.EmbeddedSignature.SigType; sigType != SigTypePrimaryKeyBinding { - return nil, errors.StructuralError("cross-signature has unexpected type " + strconv.Itoa(int(sigType))) - } - default: - if isCritical { - err = errors.UnsupportedError("unknown critical signature subpacket type " + strconv.Itoa(int(packetType))) - return - } - } - return - -Truncated: - err = errors.StructuralError("signature subpacket truncated") - return -} - -// subpacketLengthLength returns the length, in bytes, of an encoded length value. -func subpacketLengthLength(length int) int { - if length < 192 { - return 1 - } - if length < 16320 { - return 2 - } - return 5 -} - -// serializeSubpacketLength marshals the given length into to. -func serializeSubpacketLength(to []byte, length int) int { - // RFC 4880, Section 4.2.2. - if length < 192 { - to[0] = byte(length) - return 1 - } - if length < 16320 { - length -= 192 - to[0] = byte((length >> 8) + 192) - to[1] = byte(length) - return 2 - } - to[0] = 255 - to[1] = byte(length >> 24) - to[2] = byte(length >> 16) - to[3] = byte(length >> 8) - to[4] = byte(length) - return 5 -} - -// subpacketsLength returns the serialized length, in bytes, of the given -// subpackets. -func subpacketsLength(subpackets []outputSubpacket, hashed bool) (length int) { - for _, subpacket := range subpackets { - if subpacket.hashed == hashed { - length += subpacketLengthLength(len(subpacket.contents) + 1) - length += 1 // type byte - length += len(subpacket.contents) - } - } - return -} - -// serializeSubpackets marshals the given subpackets into to. -func serializeSubpackets(to []byte, subpackets []outputSubpacket, hashed bool) { - for _, subpacket := range subpackets { - if subpacket.hashed == hashed { - n := serializeSubpacketLength(to, len(subpacket.contents)+1) - to[n] = byte(subpacket.subpacketType) - to = to[1+n:] - n = copy(to, subpacket.contents) - to = to[n:] - } - } - return -} - -// KeyExpired returns whether sig is a self-signature of a key that has -// expired. -func (sig *Signature) KeyExpired(currentTime time.Time) bool { - if sig.KeyLifetimeSecs == nil { - return false - } - expiry := sig.CreationTime.Add(time.Duration(*sig.KeyLifetimeSecs) * time.Second) - return currentTime.After(expiry) -} - -// buildHashSuffix constructs the HashSuffix member of sig in preparation for signing. -func (sig *Signature) buildHashSuffix() (err error) { - hashedSubpacketsLen := subpacketsLength(sig.outSubpackets, true) - - var ok bool - l := 6 + hashedSubpacketsLen - sig.HashSuffix = make([]byte, l+6) - sig.HashSuffix[0] = 4 - sig.HashSuffix[1] = uint8(sig.SigType) - sig.HashSuffix[2] = uint8(sig.PubKeyAlgo) - sig.HashSuffix[3], ok = s2k.HashToHashId(sig.Hash) - if !ok { - sig.HashSuffix = nil - return errors.InvalidArgumentError("hash cannot be represented in OpenPGP: " + strconv.Itoa(int(sig.Hash))) - } - sig.HashSuffix[4] = byte(hashedSubpacketsLen >> 8) - sig.HashSuffix[5] = byte(hashedSubpacketsLen) - serializeSubpackets(sig.HashSuffix[6:l], sig.outSubpackets, true) - trailer := sig.HashSuffix[l:] - trailer[0] = 4 - trailer[1] = 0xff - trailer[2] = byte(l >> 24) - trailer[3] = byte(l >> 16) - trailer[4] = byte(l >> 8) - trailer[5] = byte(l) - return -} - -func (sig *Signature) signPrepareHash(h hash.Hash) (digest []byte, err error) { - err = sig.buildHashSuffix() - if err != nil { - return - } - - h.Write(sig.HashSuffix) - digest = h.Sum(nil) - copy(sig.HashTag[:], digest) - return -} - -// Sign signs a message with a private key. The hash, h, must contain -// the hash of the message to be signed and will be mutated by this function. -// On success, the signature is stored in sig. Call Serialize to write it out. -// If config is nil, sensible defaults will be used. -func (sig *Signature) Sign(h hash.Hash, priv *PrivateKey, config *Config) (err error) { - sig.outSubpackets = sig.buildSubpackets() - digest, err := sig.signPrepareHash(h) - if err != nil { - return - } - - switch priv.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly: - // supports both *rsa.PrivateKey and crypto.Signer - sig.RSASignature.bytes, err = priv.PrivateKey.(crypto.Signer).Sign(config.Random(), digest, sig.Hash) - sig.RSASignature.bitLength = uint16(8 * len(sig.RSASignature.bytes)) - case PubKeyAlgoDSA: - dsaPriv := priv.PrivateKey.(*dsa.PrivateKey) - - // Need to truncate hashBytes to match FIPS 186-3 section 4.6. - subgroupSize := (dsaPriv.Q.BitLen() + 7) / 8 - if len(digest) > subgroupSize { - digest = digest[:subgroupSize] - } - r, s, err := dsa.Sign(config.Random(), dsaPriv, digest) - if err == nil { - sig.DSASigR.bytes = r.Bytes() - sig.DSASigR.bitLength = uint16(8 * len(sig.DSASigR.bytes)) - sig.DSASigS.bytes = s.Bytes() - sig.DSASigS.bitLength = uint16(8 * len(sig.DSASigS.bytes)) - } - case PubKeyAlgoECDSA: - var r, s *big.Int - if pk, ok := priv.PrivateKey.(*ecdsa.PrivateKey); ok { - // direct support, avoid asn1 wrapping/unwrapping - r, s, err = ecdsa.Sign(config.Random(), pk, digest) - } else { - var b []byte - b, err = priv.PrivateKey.(crypto.Signer).Sign(config.Random(), digest, nil) - if err == nil { - r, s, err = unwrapECDSASig(b) - } - } - if err == nil { - sig.ECDSASigR = fromBig(r) - sig.ECDSASigS = fromBig(s) - } - default: - err = errors.UnsupportedError("public key algorithm: " + strconv.Itoa(int(sig.PubKeyAlgo))) - } - - return -} - -// unwrapECDSASig parses the two integer components of an ASN.1-encoded ECDSA -// signature. -func unwrapECDSASig(b []byte) (r, s *big.Int, err error) { - var ecsdaSig struct { - R, S *big.Int - } - _, err = asn1.Unmarshal(b, &ecsdaSig) - if err != nil { - return - } - return ecsdaSig.R, ecsdaSig.S, nil -} - -// SignUserId computes a signature from priv, asserting that pub is a valid -// key for the identity id. On success, the signature is stored in sig. Call -// Serialize to write it out. -// If config is nil, sensible defaults will be used. -func (sig *Signature) SignUserId(id string, pub *PublicKey, priv *PrivateKey, config *Config) error { - h, err := userIdSignatureHash(id, pub, sig.Hash) - if err != nil { - return err - } - return sig.Sign(h, priv, config) -} - -// SignKey computes a signature from priv, asserting that pub is a subkey. On -// success, the signature is stored in sig. Call Serialize to write it out. -// If config is nil, sensible defaults will be used. -func (sig *Signature) SignKey(pub *PublicKey, priv *PrivateKey, config *Config) error { - h, err := keySignatureHash(&priv.PublicKey, pub, sig.Hash) - if err != nil { - return err - } - return sig.Sign(h, priv, config) -} - -// Serialize marshals sig to w. Sign, SignUserId or SignKey must have been -// called first. -func (sig *Signature) Serialize(w io.Writer) (err error) { - if len(sig.outSubpackets) == 0 { - sig.outSubpackets = sig.rawSubpackets - } - if sig.RSASignature.bytes == nil && sig.DSASigR.bytes == nil && sig.ECDSASigR.bytes == nil { - return errors.InvalidArgumentError("Signature: need to call Sign, SignUserId or SignKey before Serialize") - } - - sigLength := 0 - switch sig.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly: - sigLength = 2 + len(sig.RSASignature.bytes) - case PubKeyAlgoDSA: - sigLength = 2 + len(sig.DSASigR.bytes) - sigLength += 2 + len(sig.DSASigS.bytes) - case PubKeyAlgoECDSA: - sigLength = 2 + len(sig.ECDSASigR.bytes) - sigLength += 2 + len(sig.ECDSASigS.bytes) - default: - panic("impossible") - } - - unhashedSubpacketsLen := subpacketsLength(sig.outSubpackets, false) - length := len(sig.HashSuffix) - 6 /* trailer not included */ + - 2 /* length of unhashed subpackets */ + unhashedSubpacketsLen + - 2 /* hash tag */ + sigLength - err = serializeHeader(w, packetTypeSignature, length) - if err != nil { - return - } - - _, err = w.Write(sig.HashSuffix[:len(sig.HashSuffix)-6]) - if err != nil { - return - } - - unhashedSubpackets := make([]byte, 2+unhashedSubpacketsLen) - unhashedSubpackets[0] = byte(unhashedSubpacketsLen >> 8) - unhashedSubpackets[1] = byte(unhashedSubpacketsLen) - serializeSubpackets(unhashedSubpackets[2:], sig.outSubpackets, false) - - _, err = w.Write(unhashedSubpackets) - if err != nil { - return - } - _, err = w.Write(sig.HashTag[:]) - if err != nil { - return - } - - switch sig.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly: - err = writeMPIs(w, sig.RSASignature) - case PubKeyAlgoDSA: - err = writeMPIs(w, sig.DSASigR, sig.DSASigS) - case PubKeyAlgoECDSA: - err = writeMPIs(w, sig.ECDSASigR, sig.ECDSASigS) - default: - panic("impossible") - } - return -} - -// outputSubpacket represents a subpacket to be marshaled. -type outputSubpacket struct { - hashed bool // true if this subpacket is in the hashed area. - subpacketType signatureSubpacketType - isCritical bool - contents []byte -} - -func (sig *Signature) buildSubpackets() (subpackets []outputSubpacket) { - creationTime := make([]byte, 4) - binary.BigEndian.PutUint32(creationTime, uint32(sig.CreationTime.Unix())) - subpackets = append(subpackets, outputSubpacket{true, creationTimeSubpacket, false, creationTime}) - - if sig.IssuerKeyId != nil { - keyId := make([]byte, 8) - binary.BigEndian.PutUint64(keyId, *sig.IssuerKeyId) - subpackets = append(subpackets, outputSubpacket{true, issuerSubpacket, false, keyId}) - } - - if sig.SigLifetimeSecs != nil && *sig.SigLifetimeSecs != 0 { - sigLifetime := make([]byte, 4) - binary.BigEndian.PutUint32(sigLifetime, *sig.SigLifetimeSecs) - subpackets = append(subpackets, outputSubpacket{true, signatureExpirationSubpacket, true, sigLifetime}) - } - - // Key flags may only appear in self-signatures or certification signatures. - - if sig.FlagsValid { - var flags byte - if sig.FlagCertify { - flags |= KeyFlagCertify - } - if sig.FlagSign { - flags |= KeyFlagSign - } - if sig.FlagEncryptCommunications { - flags |= KeyFlagEncryptCommunications - } - if sig.FlagEncryptStorage { - flags |= KeyFlagEncryptStorage - } - subpackets = append(subpackets, outputSubpacket{true, keyFlagsSubpacket, false, []byte{flags}}) - } - - // The following subpackets may only appear in self-signatures - - if sig.KeyLifetimeSecs != nil && *sig.KeyLifetimeSecs != 0 { - keyLifetime := make([]byte, 4) - binary.BigEndian.PutUint32(keyLifetime, *sig.KeyLifetimeSecs) - subpackets = append(subpackets, outputSubpacket{true, keyExpirationSubpacket, true, keyLifetime}) - } - - if sig.IsPrimaryId != nil && *sig.IsPrimaryId { - subpackets = append(subpackets, outputSubpacket{true, primaryUserIdSubpacket, false, []byte{1}}) - } - - if len(sig.PreferredSymmetric) > 0 { - subpackets = append(subpackets, outputSubpacket{true, prefSymmetricAlgosSubpacket, false, sig.PreferredSymmetric}) - } - - if len(sig.PreferredHash) > 0 { - subpackets = append(subpackets, outputSubpacket{true, prefHashAlgosSubpacket, false, sig.PreferredHash}) - } - - if len(sig.PreferredCompression) > 0 { - subpackets = append(subpackets, outputSubpacket{true, prefCompressionSubpacket, false, sig.PreferredCompression}) - } - - return -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/signature_test.go b/vendor/golang.org/x/crypto/openpgp/packet/signature_test.go deleted file mode 100644 index 56e761179..000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/signature_test.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package packet - -import ( - "bytes" - "crypto" - "encoding/hex" - "testing" -) - -func TestSignatureRead(t *testing.T) { - packet, err := Read(readerFromHex(signatureDataHex)) - if err != nil { - t.Error(err) - return - } - sig, ok := packet.(*Signature) - if !ok || sig.SigType != SigTypeBinary || sig.PubKeyAlgo != PubKeyAlgoRSA || sig.Hash != crypto.SHA1 { - t.Errorf("failed to parse, got: %#v", packet) - } -} - -func TestSignatureReserialize(t *testing.T) { - packet, _ := Read(readerFromHex(signatureDataHex)) - sig := packet.(*Signature) - out := new(bytes.Buffer) - err := sig.Serialize(out) - if err != nil { - t.Errorf("error reserializing: %s", err) - return - } - - expected, _ := hex.DecodeString(signatureDataHex) - if !bytes.Equal(expected, out.Bytes()) { - t.Errorf("output doesn't match input (got vs expected):\n%s\n%s", hex.Dump(out.Bytes()), hex.Dump(expected)) - } -} - -func TestSignUserId(t *testing.T) { - sig := &Signature{ - SigType: SigTypeGenericCert, - PubKeyAlgo: PubKeyAlgoRSA, - Hash: 0, // invalid hash function - } - - packet, err := Read(readerFromHex(rsaPkDataHex)) - if err != nil { - t.Fatalf("failed to deserialize public key: %v", err) - } - pubKey := packet.(*PublicKey) - - packet, err = Read(readerFromHex(privKeyRSAHex)) - if err != nil { - t.Fatalf("failed to deserialize private key: %v", err) - } - privKey := packet.(*PrivateKey) - - err = sig.SignUserId("", pubKey, privKey, nil) - if err == nil { - t.Errorf("did not receive an error when expected") - } - - sig.Hash = crypto.SHA256 - err = privKey.Decrypt([]byte("testing")) - if err != nil { - t.Fatalf("failed to decrypt private key: %v", err) - } - - err = sig.SignUserId("", pubKey, privKey, nil) - if err != nil { - t.Errorf("failed to sign user id: %v", err) - } -} - -const signatureDataHex = "c2c05c04000102000605024cb45112000a0910ab105c91af38fb158f8d07ff5596ea368c5efe015bed6e78348c0f033c931d5f2ce5db54ce7f2a7e4b4ad64db758d65a7a71773edeab7ba2a9e0908e6a94a1175edd86c1d843279f045b021a6971a72702fcbd650efc393c5474d5b59a15f96d2eaad4c4c426797e0dcca2803ef41c6ff234d403eec38f31d610c344c06f2401c262f0993b2e66cad8a81ebc4322c723e0d4ba09fe917e8777658307ad8329adacba821420741009dfe87f007759f0982275d028a392c6ed983a0d846f890b36148c7358bdb8a516007fac760261ecd06076813831a36d0459075d1befa245ae7f7fb103d92ca759e9498fe60ef8078a39a3beda510deea251ea9f0a7f0df6ef42060f20780360686f3e400e" diff --git a/vendor/golang.org/x/crypto/openpgp/packet/signature_v3.go b/vendor/golang.org/x/crypto/openpgp/packet/signature_v3.go deleted file mode 100644 index 6edff8893..000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/signature_v3.go +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package packet - -import ( - "crypto" - "encoding/binary" - "fmt" - "io" - "strconv" - "time" - - "golang.org/x/crypto/openpgp/errors" - "golang.org/x/crypto/openpgp/s2k" -) - -// SignatureV3 represents older version 3 signatures. These signatures are less secure -// than version 4 and should not be used to create new signatures. They are included -// here for backwards compatibility to read and validate with older key material. -// See RFC 4880, section 5.2.2. -type SignatureV3 struct { - SigType SignatureType - CreationTime time.Time - IssuerKeyId uint64 - PubKeyAlgo PublicKeyAlgorithm - Hash crypto.Hash - HashTag [2]byte - - RSASignature parsedMPI - DSASigR, DSASigS parsedMPI -} - -func (sig *SignatureV3) parse(r io.Reader) (err error) { - // RFC 4880, section 5.2.2 - var buf [8]byte - if _, err = readFull(r, buf[:1]); err != nil { - return - } - if buf[0] < 2 || buf[0] > 3 { - err = errors.UnsupportedError("signature packet version " + strconv.Itoa(int(buf[0]))) - return - } - if _, err = readFull(r, buf[:1]); err != nil { - return - } - if buf[0] != 5 { - err = errors.UnsupportedError( - "invalid hashed material length " + strconv.Itoa(int(buf[0]))) - return - } - - // Read hashed material: signature type + creation time - if _, err = readFull(r, buf[:5]); err != nil { - return - } - sig.SigType = SignatureType(buf[0]) - t := binary.BigEndian.Uint32(buf[1:5]) - sig.CreationTime = time.Unix(int64(t), 0) - - // Eight-octet Key ID of signer. - if _, err = readFull(r, buf[:8]); err != nil { - return - } - sig.IssuerKeyId = binary.BigEndian.Uint64(buf[:]) - - // Public-key and hash algorithm - if _, err = readFull(r, buf[:2]); err != nil { - return - } - sig.PubKeyAlgo = PublicKeyAlgorithm(buf[0]) - switch sig.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly, PubKeyAlgoDSA: - default: - err = errors.UnsupportedError("public key algorithm " + strconv.Itoa(int(sig.PubKeyAlgo))) - return - } - var ok bool - if sig.Hash, ok = s2k.HashIdToHash(buf[1]); !ok { - return errors.UnsupportedError("hash function " + strconv.Itoa(int(buf[2]))) - } - - // Two-octet field holding left 16 bits of signed hash value. - if _, err = readFull(r, sig.HashTag[:2]); err != nil { - return - } - - switch sig.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly: - sig.RSASignature.bytes, sig.RSASignature.bitLength, err = readMPI(r) - case PubKeyAlgoDSA: - if sig.DSASigR.bytes, sig.DSASigR.bitLength, err = readMPI(r); err != nil { - return - } - sig.DSASigS.bytes, sig.DSASigS.bitLength, err = readMPI(r) - default: - panic("unreachable") - } - return -} - -// Serialize marshals sig to w. Sign, SignUserId or SignKey must have been -// called first. -func (sig *SignatureV3) Serialize(w io.Writer) (err error) { - buf := make([]byte, 8) - - // Write the sig type and creation time - buf[0] = byte(sig.SigType) - binary.BigEndian.PutUint32(buf[1:5], uint32(sig.CreationTime.Unix())) - if _, err = w.Write(buf[:5]); err != nil { - return - } - - // Write the issuer long key ID - binary.BigEndian.PutUint64(buf[:8], sig.IssuerKeyId) - if _, err = w.Write(buf[:8]); err != nil { - return - } - - // Write public key algorithm, hash ID, and hash value - buf[0] = byte(sig.PubKeyAlgo) - hashId, ok := s2k.HashToHashId(sig.Hash) - if !ok { - return errors.UnsupportedError(fmt.Sprintf("hash function %v", sig.Hash)) - } - buf[1] = hashId - copy(buf[2:4], sig.HashTag[:]) - if _, err = w.Write(buf[:4]); err != nil { - return - } - - if sig.RSASignature.bytes == nil && sig.DSASigR.bytes == nil { - return errors.InvalidArgumentError("Signature: need to call Sign, SignUserId or SignKey before Serialize") - } - - switch sig.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly: - err = writeMPIs(w, sig.RSASignature) - case PubKeyAlgoDSA: - err = writeMPIs(w, sig.DSASigR, sig.DSASigS) - default: - panic("impossible") - } - return -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/signature_v3_test.go b/vendor/golang.org/x/crypto/openpgp/packet/signature_v3_test.go deleted file mode 100644 index ad7b62ac1..000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/signature_v3_test.go +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package packet - -import ( - "bytes" - "crypto" - "encoding/hex" - "io" - "io/ioutil" - "testing" - - "golang.org/x/crypto/openpgp/armor" -) - -func TestSignatureV3Read(t *testing.T) { - r := v3KeyReader(t) - Read(r) // Skip public key - Read(r) // Skip uid - packet, err := Read(r) // Signature - if err != nil { - t.Error(err) - return - } - sig, ok := packet.(*SignatureV3) - if !ok || sig.SigType != SigTypeGenericCert || sig.PubKeyAlgo != PubKeyAlgoRSA || sig.Hash != crypto.MD5 { - t.Errorf("failed to parse, got: %#v", packet) - } -} - -func TestSignatureV3Reserialize(t *testing.T) { - r := v3KeyReader(t) - Read(r) // Skip public key - Read(r) // Skip uid - packet, err := Read(r) - if err != nil { - t.Error(err) - return - } - sig := packet.(*SignatureV3) - out := new(bytes.Buffer) - if err = sig.Serialize(out); err != nil { - t.Errorf("error reserializing: %s", err) - return - } - expected, err := ioutil.ReadAll(v3KeyReader(t)) - if err != nil { - t.Error(err) - return - } - expected = expected[4+141+4+39:] // See pgpdump offsets below, this is where the sig starts - if !bytes.Equal(expected, out.Bytes()) { - t.Errorf("output doesn't match input (got vs expected):\n%s\n%s", hex.Dump(out.Bytes()), hex.Dump(expected)) - } -} - -func v3KeyReader(t *testing.T) io.Reader { - armorBlock, err := armor.Decode(bytes.NewBufferString(keySigV3Armor)) - if err != nil { - t.Fatalf("armor Decode failed: %v", err) - } - return armorBlock.Body -} - -// keySigV3Armor is some V3 public key I found in an SKS dump. -// Old: Public Key Packet(tag 6)(141 bytes) -// Ver 4 - new -// Public key creation time - Fri Sep 16 17:13:54 CDT 1994 -// Pub alg - unknown(pub 0) -// Unknown public key(pub 0) -// Old: User ID Packet(tag 13)(39 bytes) -// User ID - Armin M. Warda -// Old: Signature Packet(tag 2)(149 bytes) -// Ver 4 - new -// Sig type - unknown(05) -// Pub alg - ElGamal Encrypt-Only(pub 16) -// Hash alg - unknown(hash 46) -// Hashed Sub: unknown(sub 81, critical)(1988 bytes) -const keySigV3Armor = `-----BEGIN PGP PUBLIC KEY BLOCK----- -Version: SKS 1.0.10 - -mI0CLnoYogAAAQQA1qwA2SuJwfQ5bCQ6u5t20ulnOtY0gykf7YjiK4LiVeRBwHjGq7v30tGV -5Qti7qqRW4Ww7CDCJc4sZMFnystucR2vLkXaSoNWoFm4Fg47NiisDdhDezHwbVPW6OpCFNSi -ZAamtj4QAUBu8j4LswafrJqZqR9336/V3g8Yil2l48kABRG0J0FybWluIE0uIFdhcmRhIDx3 -YXJkYUBuZXBoaWxpbS5ydWhyLmRlPoiVAgUQLok2xwXR6zmeWEiZAQE/DgP/WgxPQh40/Po4 -gSkWZCDAjNdph7zexvAb0CcUWahcwiBIgg3U5ErCx9I5CNVA9U+s8bNrDZwgSIeBzp3KhWUx -524uhGgm6ZUTOAIKA6CbV6pfqoLpJnRYvXYQU5mIWsNa99wcu2qu18OeEDnztb7aLA6Ra9OF -YFCbq4EjXRoOrYM= -=LPjs ------END PGP PUBLIC KEY BLOCK-----` diff --git a/vendor/golang.org/x/crypto/openpgp/packet/symmetric_key_encrypted.go b/vendor/golang.org/x/crypto/openpgp/packet/symmetric_key_encrypted.go deleted file mode 100644 index 4b1105b6f..000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/symmetric_key_encrypted.go +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package packet - -import ( - "bytes" - "crypto/cipher" - "io" - "strconv" - - "golang.org/x/crypto/openpgp/errors" - "golang.org/x/crypto/openpgp/s2k" -) - -// This is the largest session key that we'll support. Since no 512-bit cipher -// has even been seriously used, this is comfortably large. -const maxSessionKeySizeInBytes = 64 - -// SymmetricKeyEncrypted represents a passphrase protected session key. See RFC -// 4880, section 5.3. -type SymmetricKeyEncrypted struct { - CipherFunc CipherFunction - s2k func(out, in []byte) - encryptedKey []byte -} - -const symmetricKeyEncryptedVersion = 4 - -func (ske *SymmetricKeyEncrypted) parse(r io.Reader) error { - // RFC 4880, section 5.3. - var buf [2]byte - if _, err := readFull(r, buf[:]); err != nil { - return err - } - if buf[0] != symmetricKeyEncryptedVersion { - return errors.UnsupportedError("SymmetricKeyEncrypted version") - } - ske.CipherFunc = CipherFunction(buf[1]) - - if ske.CipherFunc.KeySize() == 0 { - return errors.UnsupportedError("unknown cipher: " + strconv.Itoa(int(buf[1]))) - } - - var err error - ske.s2k, err = s2k.Parse(r) - if err != nil { - return err - } - - encryptedKey := make([]byte, maxSessionKeySizeInBytes) - // The session key may follow. We just have to try and read to find - // out. If it exists then we limit it to maxSessionKeySizeInBytes. - n, err := readFull(r, encryptedKey) - if err != nil && err != io.ErrUnexpectedEOF { - return err - } - - if n != 0 { - if n == maxSessionKeySizeInBytes { - return errors.UnsupportedError("oversized encrypted session key") - } - ske.encryptedKey = encryptedKey[:n] - } - - return nil -} - -// Decrypt attempts to decrypt an encrypted session key and returns the key and -// the cipher to use when decrypting a subsequent Symmetrically Encrypted Data -// packet. -func (ske *SymmetricKeyEncrypted) Decrypt(passphrase []byte) ([]byte, CipherFunction, error) { - key := make([]byte, ske.CipherFunc.KeySize()) - ske.s2k(key, passphrase) - - if len(ske.encryptedKey) == 0 { - return key, ske.CipherFunc, nil - } - - // the IV is all zeros - iv := make([]byte, ske.CipherFunc.blockSize()) - c := cipher.NewCFBDecrypter(ske.CipherFunc.new(key), iv) - plaintextKey := make([]byte, len(ske.encryptedKey)) - c.XORKeyStream(plaintextKey, ske.encryptedKey) - cipherFunc := CipherFunction(plaintextKey[0]) - if cipherFunc.blockSize() == 0 { - return nil, ske.CipherFunc, errors.UnsupportedError("unknown cipher: " + strconv.Itoa(int(cipherFunc))) - } - plaintextKey = plaintextKey[1:] - if l := len(plaintextKey); l == 0 || l%cipherFunc.blockSize() != 0 { - return nil, cipherFunc, errors.StructuralError("length of decrypted key not a multiple of block size") - } - - return plaintextKey, cipherFunc, nil -} - -// SerializeSymmetricKeyEncrypted serializes a symmetric key packet to w. The -// packet contains a random session key, encrypted by a key derived from the -// given passphrase. The session key is returned and must be passed to -// SerializeSymmetricallyEncrypted. -// If config is nil, sensible defaults will be used. -func SerializeSymmetricKeyEncrypted(w io.Writer, passphrase []byte, config *Config) (key []byte, err error) { - cipherFunc := config.Cipher() - keySize := cipherFunc.KeySize() - if keySize == 0 { - return nil, errors.UnsupportedError("unknown cipher: " + strconv.Itoa(int(cipherFunc))) - } - - s2kBuf := new(bytes.Buffer) - keyEncryptingKey := make([]byte, keySize) - // s2k.Serialize salts and stretches the passphrase, and writes the - // resulting key to keyEncryptingKey and the s2k descriptor to s2kBuf. - err = s2k.Serialize(s2kBuf, keyEncryptingKey, config.Random(), passphrase, &s2k.Config{Hash: config.Hash(), S2KCount: config.PasswordHashIterations()}) - if err != nil { - return - } - s2kBytes := s2kBuf.Bytes() - - packetLength := 2 /* header */ + len(s2kBytes) + 1 /* cipher type */ + keySize - err = serializeHeader(w, packetTypeSymmetricKeyEncrypted, packetLength) - if err != nil { - return - } - - var buf [2]byte - buf[0] = symmetricKeyEncryptedVersion - buf[1] = byte(cipherFunc) - _, err = w.Write(buf[:]) - if err != nil { - return - } - _, err = w.Write(s2kBytes) - if err != nil { - return - } - - sessionKey := make([]byte, keySize) - _, err = io.ReadFull(config.Random(), sessionKey) - if err != nil { - return - } - iv := make([]byte, cipherFunc.blockSize()) - c := cipher.NewCFBEncrypter(cipherFunc.new(keyEncryptingKey), iv) - encryptedCipherAndKey := make([]byte, keySize+1) - c.XORKeyStream(encryptedCipherAndKey, buf[1:]) - c.XORKeyStream(encryptedCipherAndKey[1:], sessionKey) - _, err = w.Write(encryptedCipherAndKey) - if err != nil { - return - } - - key = sessionKey - return -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/symmetric_key_encrypted_test.go b/vendor/golang.org/x/crypto/openpgp/packet/symmetric_key_encrypted_test.go deleted file mode 100644 index 19538df77..000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/symmetric_key_encrypted_test.go +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package packet - -import ( - "bytes" - "encoding/hex" - "io" - "io/ioutil" - "testing" -) - -func TestSymmetricKeyEncrypted(t *testing.T) { - buf := readerFromHex(symmetricallyEncryptedHex) - packet, err := Read(buf) - if err != nil { - t.Errorf("failed to read SymmetricKeyEncrypted: %s", err) - return - } - ske, ok := packet.(*SymmetricKeyEncrypted) - if !ok { - t.Error("didn't find SymmetricKeyEncrypted packet") - return - } - key, cipherFunc, err := ske.Decrypt([]byte("password")) - if err != nil { - t.Error(err) - return - } - - packet, err = Read(buf) - if err != nil { - t.Errorf("failed to read SymmetricallyEncrypted: %s", err) - return - } - se, ok := packet.(*SymmetricallyEncrypted) - if !ok { - t.Error("didn't find SymmetricallyEncrypted packet") - return - } - r, err := se.Decrypt(cipherFunc, key) - if err != nil { - t.Error(err) - return - } - - contents, err := ioutil.ReadAll(r) - if err != nil && err != io.EOF { - t.Error(err) - return - } - - expectedContents, _ := hex.DecodeString(symmetricallyEncryptedContentsHex) - if !bytes.Equal(expectedContents, contents) { - t.Errorf("bad contents got:%x want:%x", contents, expectedContents) - } -} - -const symmetricallyEncryptedHex = "8c0d04030302371a0b38d884f02060c91cf97c9973b8e58e028e9501708ccfe618fb92afef7fa2d80ddadd93cf" -const symmetricallyEncryptedContentsHex = "cb1062004d14c4df636f6e74656e74732e0a" - -func TestSerializeSymmetricKeyEncrypted(t *testing.T) { - buf := bytes.NewBuffer(nil) - passphrase := []byte("testing") - const cipherFunc = CipherAES128 - config := &Config{ - DefaultCipher: cipherFunc, - } - - key, err := SerializeSymmetricKeyEncrypted(buf, passphrase, config) - if err != nil { - t.Errorf("failed to serialize: %s", err) - return - } - - p, err := Read(buf) - if err != nil { - t.Errorf("failed to reparse: %s", err) - return - } - ske, ok := p.(*SymmetricKeyEncrypted) - if !ok { - t.Errorf("parsed a different packet type: %#v", p) - return - } - - if ske.CipherFunc != config.DefaultCipher { - t.Errorf("SKE cipher function is %d (expected %d)", ske.CipherFunc, config.DefaultCipher) - } - parsedKey, parsedCipherFunc, err := ske.Decrypt(passphrase) - if err != nil { - t.Errorf("failed to decrypt reparsed SKE: %s", err) - return - } - if !bytes.Equal(key, parsedKey) { - t.Errorf("keys don't match after Decrypt: %x (original) vs %x (parsed)", key, parsedKey) - } - if parsedCipherFunc != cipherFunc { - t.Errorf("cipher function doesn't match after Decrypt: %d (original) vs %d (parsed)", cipherFunc, parsedCipherFunc) - } -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/symmetrically_encrypted.go b/vendor/golang.org/x/crypto/openpgp/packet/symmetrically_encrypted.go deleted file mode 100644 index 6126030eb..000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/symmetrically_encrypted.go +++ /dev/null @@ -1,290 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package packet - -import ( - "crypto/cipher" - "crypto/sha1" - "crypto/subtle" - "golang.org/x/crypto/openpgp/errors" - "hash" - "io" - "strconv" -) - -// SymmetricallyEncrypted represents a symmetrically encrypted byte string. The -// encrypted contents will consist of more OpenPGP packets. See RFC 4880, -// sections 5.7 and 5.13. -type SymmetricallyEncrypted struct { - MDC bool // true iff this is a type 18 packet and thus has an embedded MAC. - contents io.Reader - prefix []byte -} - -const symmetricallyEncryptedVersion = 1 - -func (se *SymmetricallyEncrypted) parse(r io.Reader) error { - if se.MDC { - // See RFC 4880, section 5.13. - var buf [1]byte - _, err := readFull(r, buf[:]) - if err != nil { - return err - } - if buf[0] != symmetricallyEncryptedVersion { - return errors.UnsupportedError("unknown SymmetricallyEncrypted version") - } - } - se.contents = r - return nil -} - -// Decrypt returns a ReadCloser, from which the decrypted contents of the -// packet can be read. An incorrect key can, with high probability, be detected -// immediately and this will result in a KeyIncorrect error being returned. -func (se *SymmetricallyEncrypted) Decrypt(c CipherFunction, key []byte) (io.ReadCloser, error) { - keySize := c.KeySize() - if keySize == 0 { - return nil, errors.UnsupportedError("unknown cipher: " + strconv.Itoa(int(c))) - } - if len(key) != keySize { - return nil, errors.InvalidArgumentError("SymmetricallyEncrypted: incorrect key length") - } - - if se.prefix == nil { - se.prefix = make([]byte, c.blockSize()+2) - _, err := readFull(se.contents, se.prefix) - if err != nil { - return nil, err - } - } else if len(se.prefix) != c.blockSize()+2 { - return nil, errors.InvalidArgumentError("can't try ciphers with different block lengths") - } - - ocfbResync := OCFBResync - if se.MDC { - // MDC packets use a different form of OCFB mode. - ocfbResync = OCFBNoResync - } - - s := NewOCFBDecrypter(c.new(key), se.prefix, ocfbResync) - if s == nil { - return nil, errors.ErrKeyIncorrect - } - - plaintext := cipher.StreamReader{S: s, R: se.contents} - - if se.MDC { - // MDC packets have an embedded hash that we need to check. - h := sha1.New() - h.Write(se.prefix) - return &seMDCReader{in: plaintext, h: h}, nil - } - - // Otherwise, we just need to wrap plaintext so that it's a valid ReadCloser. - return seReader{plaintext}, nil -} - -// seReader wraps an io.Reader with a no-op Close method. -type seReader struct { - in io.Reader -} - -func (ser seReader) Read(buf []byte) (int, error) { - return ser.in.Read(buf) -} - -func (ser seReader) Close() error { - return nil -} - -const mdcTrailerSize = 1 /* tag byte */ + 1 /* length byte */ + sha1.Size - -// An seMDCReader wraps an io.Reader, maintains a running hash and keeps hold -// of the most recent 22 bytes (mdcTrailerSize). Upon EOF, those bytes form an -// MDC packet containing a hash of the previous contents which is checked -// against the running hash. See RFC 4880, section 5.13. -type seMDCReader struct { - in io.Reader - h hash.Hash - trailer [mdcTrailerSize]byte - scratch [mdcTrailerSize]byte - trailerUsed int - error bool - eof bool -} - -func (ser *seMDCReader) Read(buf []byte) (n int, err error) { - if ser.error { - err = io.ErrUnexpectedEOF - return - } - if ser.eof { - err = io.EOF - return - } - - // If we haven't yet filled the trailer buffer then we must do that - // first. - for ser.trailerUsed < mdcTrailerSize { - n, err = ser.in.Read(ser.trailer[ser.trailerUsed:]) - ser.trailerUsed += n - if err == io.EOF { - if ser.trailerUsed != mdcTrailerSize { - n = 0 - err = io.ErrUnexpectedEOF - ser.error = true - return - } - ser.eof = true - n = 0 - return - } - - if err != nil { - n = 0 - return - } - } - - // If it's a short read then we read into a temporary buffer and shift - // the data into the caller's buffer. - if len(buf) <= mdcTrailerSize { - n, err = readFull(ser.in, ser.scratch[:len(buf)]) - copy(buf, ser.trailer[:n]) - ser.h.Write(buf[:n]) - copy(ser.trailer[:], ser.trailer[n:]) - copy(ser.trailer[mdcTrailerSize-n:], ser.scratch[:]) - if n < len(buf) { - ser.eof = true - err = io.EOF - } - return - } - - n, err = ser.in.Read(buf[mdcTrailerSize:]) - copy(buf, ser.trailer[:]) - ser.h.Write(buf[:n]) - copy(ser.trailer[:], buf[n:]) - - if err == io.EOF { - ser.eof = true - } - return -} - -// This is a new-format packet tag byte for a type 19 (MDC) packet. -const mdcPacketTagByte = byte(0x80) | 0x40 | 19 - -func (ser *seMDCReader) Close() error { - if ser.error { - return errors.SignatureError("error during reading") - } - - for !ser.eof { - // We haven't seen EOF so we need to read to the end - var buf [1024]byte - _, err := ser.Read(buf[:]) - if err == io.EOF { - break - } - if err != nil { - return errors.SignatureError("error during reading") - } - } - - if ser.trailer[0] != mdcPacketTagByte || ser.trailer[1] != sha1.Size { - return errors.SignatureError("MDC packet not found") - } - ser.h.Write(ser.trailer[:2]) - - final := ser.h.Sum(nil) - if subtle.ConstantTimeCompare(final, ser.trailer[2:]) != 1 { - return errors.SignatureError("hash mismatch") - } - return nil -} - -// An seMDCWriter writes through to an io.WriteCloser while maintains a running -// hash of the data written. On close, it emits an MDC packet containing the -// running hash. -type seMDCWriter struct { - w io.WriteCloser - h hash.Hash -} - -func (w *seMDCWriter) Write(buf []byte) (n int, err error) { - w.h.Write(buf) - return w.w.Write(buf) -} - -func (w *seMDCWriter) Close() (err error) { - var buf [mdcTrailerSize]byte - - buf[0] = mdcPacketTagByte - buf[1] = sha1.Size - w.h.Write(buf[:2]) - digest := w.h.Sum(nil) - copy(buf[2:], digest) - - _, err = w.w.Write(buf[:]) - if err != nil { - return - } - return w.w.Close() -} - -// noOpCloser is like an ioutil.NopCloser, but for an io.Writer. -type noOpCloser struct { - w io.Writer -} - -func (c noOpCloser) Write(data []byte) (n int, err error) { - return c.w.Write(data) -} - -func (c noOpCloser) Close() error { - return nil -} - -// SerializeSymmetricallyEncrypted serializes a symmetrically encrypted packet -// to w and returns a WriteCloser to which the to-be-encrypted packets can be -// written. -// If config is nil, sensible defaults will be used. -func SerializeSymmetricallyEncrypted(w io.Writer, c CipherFunction, key []byte, config *Config) (contents io.WriteCloser, err error) { - if c.KeySize() != len(key) { - return nil, errors.InvalidArgumentError("SymmetricallyEncrypted.Serialize: bad key length") - } - writeCloser := noOpCloser{w} - ciphertext, err := serializeStreamHeader(writeCloser, packetTypeSymmetricallyEncryptedMDC) - if err != nil { - return - } - - _, err = ciphertext.Write([]byte{symmetricallyEncryptedVersion}) - if err != nil { - return - } - - block := c.new(key) - blockSize := block.BlockSize() - iv := make([]byte, blockSize) - _, err = config.Random().Read(iv) - if err != nil { - return - } - s, prefix := NewOCFBEncrypter(block, iv, OCFBNoResync) - _, err = ciphertext.Write(prefix) - if err != nil { - return - } - plaintext := cipher.StreamWriter{S: s, W: ciphertext} - - h := sha1.New() - h.Write(iv) - h.Write(iv[blockSize-2:]) - contents = &seMDCWriter{w: plaintext, h: h} - return -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/symmetrically_encrypted_test.go b/vendor/golang.org/x/crypto/openpgp/packet/symmetrically_encrypted_test.go deleted file mode 100644 index c5c00f7b9..000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/symmetrically_encrypted_test.go +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package packet - -import ( - "bytes" - "crypto/sha1" - "encoding/hex" - "golang.org/x/crypto/openpgp/errors" - "io" - "io/ioutil" - "testing" -) - -// TestReader wraps a []byte and returns reads of a specific length. -type testReader struct { - data []byte - stride int -} - -func (t *testReader) Read(buf []byte) (n int, err error) { - n = t.stride - if n > len(t.data) { - n = len(t.data) - } - if n > len(buf) { - n = len(buf) - } - copy(buf, t.data) - t.data = t.data[n:] - if len(t.data) == 0 { - err = io.EOF - } - return -} - -func testMDCReader(t *testing.T) { - mdcPlaintext, _ := hex.DecodeString(mdcPlaintextHex) - - for stride := 1; stride < len(mdcPlaintext)/2; stride++ { - r := &testReader{data: mdcPlaintext, stride: stride} - mdcReader := &seMDCReader{in: r, h: sha1.New()} - body, err := ioutil.ReadAll(mdcReader) - if err != nil { - t.Errorf("stride: %d, error: %s", stride, err) - continue - } - if !bytes.Equal(body, mdcPlaintext[:len(mdcPlaintext)-22]) { - t.Errorf("stride: %d: bad contents %x", stride, body) - continue - } - - err = mdcReader.Close() - if err != nil { - t.Errorf("stride: %d, error on Close: %s", stride, err) - } - } - - mdcPlaintext[15] ^= 80 - - r := &testReader{data: mdcPlaintext, stride: 2} - mdcReader := &seMDCReader{in: r, h: sha1.New()} - _, err := ioutil.ReadAll(mdcReader) - if err != nil { - t.Errorf("corruption test, error: %s", err) - return - } - err = mdcReader.Close() - if err == nil { - t.Error("corruption: no error") - } else if _, ok := err.(*errors.SignatureError); !ok { - t.Errorf("corruption: expected SignatureError, got: %s", err) - } -} - -const mdcPlaintextHex = "a302789c3b2d93c4e0eb9aba22283539b3203335af44a134afb800c849cb4c4de10200aff40b45d31432c80cb384299a0655966d6939dfdeed1dddf980" - -func TestSerialize(t *testing.T) { - buf := bytes.NewBuffer(nil) - c := CipherAES128 - key := make([]byte, c.KeySize()) - - w, err := SerializeSymmetricallyEncrypted(buf, c, key, nil) - if err != nil { - t.Errorf("error from SerializeSymmetricallyEncrypted: %s", err) - return - } - - contents := []byte("hello world\n") - - w.Write(contents) - w.Close() - - p, err := Read(buf) - if err != nil { - t.Errorf("error from Read: %s", err) - return - } - - se, ok := p.(*SymmetricallyEncrypted) - if !ok { - t.Errorf("didn't read a *SymmetricallyEncrypted") - return - } - - r, err := se.Decrypt(c, key) - if err != nil { - t.Errorf("error from Decrypt: %s", err) - return - } - - contentsCopy := bytes.NewBuffer(nil) - _, err = io.Copy(contentsCopy, r) - if err != nil { - t.Errorf("error from io.Copy: %s", err) - return - } - if !bytes.Equal(contentsCopy.Bytes(), contents) { - t.Errorf("contents not equal got: %x want: %x", contentsCopy.Bytes(), contents) - } -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/userattribute.go b/vendor/golang.org/x/crypto/openpgp/packet/userattribute.go deleted file mode 100644 index 96a2b382a..000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/userattribute.go +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package packet - -import ( - "bytes" - "image" - "image/jpeg" - "io" - "io/ioutil" -) - -const UserAttrImageSubpacket = 1 - -// UserAttribute is capable of storing other types of data about a user -// beyond name, email and a text comment. In practice, user attributes are typically used -// to store a signed thumbnail photo JPEG image of the user. -// See RFC 4880, section 5.12. -type UserAttribute struct { - Contents []*OpaqueSubpacket -} - -// NewUserAttributePhoto creates a user attribute packet -// containing the given images. -func NewUserAttributePhoto(photos ...image.Image) (uat *UserAttribute, err error) { - uat = new(UserAttribute) - for _, photo := range photos { - var buf bytes.Buffer - // RFC 4880, Section 5.12.1. - data := []byte{ - 0x10, 0x00, // Little-endian image header length (16 bytes) - 0x01, // Image header version 1 - 0x01, // JPEG - 0, 0, 0, 0, // 12 reserved octets, must be all zero. - 0, 0, 0, 0, - 0, 0, 0, 0} - if _, err = buf.Write(data); err != nil { - return - } - if err = jpeg.Encode(&buf, photo, nil); err != nil { - return - } - uat.Contents = append(uat.Contents, &OpaqueSubpacket{ - SubType: UserAttrImageSubpacket, - Contents: buf.Bytes()}) - } - return -} - -// NewUserAttribute creates a new user attribute packet containing the given subpackets. -func NewUserAttribute(contents ...*OpaqueSubpacket) *UserAttribute { - return &UserAttribute{Contents: contents} -} - -func (uat *UserAttribute) parse(r io.Reader) (err error) { - // RFC 4880, section 5.13 - b, err := ioutil.ReadAll(r) - if err != nil { - return - } - uat.Contents, err = OpaqueSubpackets(b) - return -} - -// Serialize marshals the user attribute to w in the form of an OpenPGP packet, including -// header. -func (uat *UserAttribute) Serialize(w io.Writer) (err error) { - var buf bytes.Buffer - for _, sp := range uat.Contents { - sp.Serialize(&buf) - } - if err = serializeHeader(w, packetTypeUserAttribute, buf.Len()); err != nil { - return err - } - _, err = w.Write(buf.Bytes()) - return -} - -// ImageData returns zero or more byte slices, each containing -// JPEG File Interchange Format (JFIF), for each photo in the -// the user attribute packet. -func (uat *UserAttribute) ImageData() (imageData [][]byte) { - for _, sp := range uat.Contents { - if sp.SubType == UserAttrImageSubpacket && len(sp.Contents) > 16 { - imageData = append(imageData, sp.Contents[16:]) - } - } - return -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/userattribute_test.go b/vendor/golang.org/x/crypto/openpgp/packet/userattribute_test.go deleted file mode 100644 index 13ca5143c..000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/userattribute_test.go +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package packet - -import ( - "bytes" - "encoding/base64" - "image/color" - "image/jpeg" - "testing" -) - -func TestParseUserAttribute(t *testing.T) { - r := base64.NewDecoder(base64.StdEncoding, bytes.NewBufferString(userAttributePacket)) - for i := 0; i < 2; i++ { - p, err := Read(r) - if err != nil { - t.Fatal(err) - } - uat := p.(*UserAttribute) - imgs := uat.ImageData() - if len(imgs) != 1 { - t.Errorf("Unexpected number of images in user attribute packet: %d", len(imgs)) - } - if len(imgs[0]) != 3395 { - t.Errorf("Unexpected JPEG image size: %d", len(imgs[0])) - } - img, err := jpeg.Decode(bytes.NewBuffer(imgs[0])) - if err != nil { - t.Errorf("Error decoding JPEG image: %v", err) - } - // A pixel in my right eye. - pixel := color.NRGBAModel.Convert(img.At(56, 36)) - ref := color.NRGBA{R: 157, G: 128, B: 124, A: 255} - if pixel != ref { - t.Errorf("Unexpected pixel color: %v", pixel) - } - w := bytes.NewBuffer(nil) - err = uat.Serialize(w) - if err != nil { - t.Errorf("Error writing user attribute: %v", err) - } - r = bytes.NewBuffer(w.Bytes()) - } -} - -const userAttributePacket = ` -0cyWzJQBEAABAQAAAAAAAAAAAAAAAP/Y/+AAEEpGSUYAAQIAAAEAAQAA/9sAQwAFAwQEBAMFBAQE -BQUFBgcMCAcHBwcPCgsJDBEPEhIRDxEQExYcFxMUGhUQERghGBocHR8fHxMXIiQiHiQcHh8e/9sA -QwEFBQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e -Hh4eHh4eHh4e/8AAEQgAZABkAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYH -CAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHw -JDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6 -g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk -5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIB -AgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEX -GBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKT -lJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX2 -9/j5+v/aAAwDAQACEQMRAD8A5uGP06VehQ4pIox04q5EnHSvAep+hIIl4zVuMHGPWmRrUWtalaaN -pU2oXsgSGJSxPr6ClvoitErs0Itqjc7BQOpPAFYmrfEnwjojtHNqaXEynBjtx5hH4jj9a8B8d+Od -W8UXZjWR4LJT+7t0Jwfc+prnIdO1CWZEW2mZ3HyDactXXDB3V5s8evm1namj6r0H4weCLtxG+ova -ueP30RA/MV6not1bX0Ed1ZzxzwyDKvGwZSPqK+Ff+ES8R8t/ZV2oHUmM10Hgbxp4m8BatEfNnWBH -/eWshOxx9Kmpg4te49RUM1kn+8Wh9zQ4P1FaMC7l465rjPh14y0fxnoseoaXOpfaPOgJ+eI98j09 -67W19M15bi4uzPSqTU480WXkjZkAyAR61DPE6OCSOalWRRgZxjvTb598sfU4FBwx5uY4T4feIm8P -TeJbAgc65NIM+8cX+FFeLfF3Vr3SfiNrMFrMypJMJcDPUqP8KK+kpVFyLU+ar037SXqX4hxVpMY7 -1UhPpVlT2rybKx9smWYz3NeH/EDVLzxt40j8O6bITaQybPlbKkjq39K9O8fasdH8IahfKxWQRFIy -Ou9uB/OuE/Z/0y3j1d9TuyoZCMs5xjuea1pLli5nn46q240l13PcfhN8EvDNtpcEl/CklyVBLuMk -mvU/Dfwo0BL/AO13FjEDD/qyV7Vn+CvGPg8zRpJrVm8ikLtEg6+1ew2dxZ3EQaJgysuQPasH7eXW -1zzsbVhT92kk/PsYieEND+zlPs6c/wCyAPyryH4wfCPRtW0u6j+xRLOxLxSoADkDpXY+MPjJ4c0S -9k082d3O8ZKkxw5XI96ytK+IGk+IpFjRpod+Qq3C7QT6A1E6NenaXbqRg6rlLlqS0fRnxjpd1r/w -w8afa7GWRPKbZLGeBKmeVNfZngLxNaeKfDdprVjxHcLlkJ5Vh1H5185/tDad9h8XOsqAw3Cb0cjq -CfX61P8AsveKf7L8T3fhe5nxa3g324YniQdh9R/KuivTdSmp9TXB1/Z1nRlsfU249QBx1pWfcwI7 -Cq6u2Ovamb9rYz16V5x7Psz5q/aJhZfibcupIElvE3H+7j+lFbXx9szP45jlUfeso8/99OKK9elL -3EeNVopzZVharCtxVRGGMk02S5JyFOB69zWTieypnL/GksfB+0cr9oQt69awPhPpD69Y3Ky3DWth -CWluGU4LAdq3vibGs/g68BJygVxjrwRW5+ztoRv/AAs8EeCZnO/J/hzz/Kumi4wp3kePjlOdZKPY -ml8Mvo6WM9ppi7J0EkQYMzkb1X0wW+bJHGACa+ivg14huZPCkjXUO6SImIYOQAP6UQ2sGneHmiWF -CYoSAAuM8etXfhBpMr+EZ3SSNRcMx6ZxWdes6ytBGSwkMNFuo7pnP614Ut9Zn1C4uLySKcwObGFA -Qnm4+XcR71h+CfDHiKCQWuv2YWFtw+bBZQD8rcE8n2Ney+GbGGQSM6I7xvtI681rXdp8hKRRp6t3 -FYPE1VDlsY1nQjWdl+J8w/tOeDZZ/AMd/EGefTHyxxyYjwfyODXg3waRh8UtEcFh+8Jb8FNfZPxh -Ak8J6nbPIsiyW7LnseK+Ofh99ptPHFnf2lu0y2twGcKuSEPB/Q1WHk50miq1o14TXU+xop+On61H -NMC6Nis1LgsAcUTSt1APFcXJZn0EqmhyvxA037friTYziBV6f7Tf40Vr3k4aXLx5OMZIzRXZB2ik -efJXbPHJJcnaD9aN2R1qoGO8/WkuLlIV+YjdjpXSonQ5lTxfiTwzqCnkeQxx9BWx+zPrQsrBFYja -zEfrXL6lfie3khcjY6lSPUGud+G3iA6FrY0uQ/KJsA9gCa0jSvFpnBi6tpKSPu++nsIfDFxeXciR -qIicscY4rxTwB8RUkn1axsPEf2LTYx85kTGzqCUP8VcJ47+JOs+I0Hhq1njjt/ufIeSvq1VtE+Gs -eoaUbSHUrkHdu3WtuX5Ix81XRh7OL5jirVpV5Whdn0F8C/iX4auVn0i612T7bASoe8wjTAd89K9g -vtSt5NMa4t5lkRhgOh3Dn6V8aaz8KZrIR3OlQ6r56LySmSxxz06Vo/CHx34h0rxBP4XvJ5AjK2RP -nEbAEj6ZxjPrWM6fMmoswqJxqJ1VZnqHxn1NLPwveqWHmNC2BnnNcD8DfDkGi+CH1m+ijN1qMzNA -4GSIiAMf+hVxPxU8Tapc3c0F9MGCn5GU5BX0Pau3+HmrT3XgXSIJCBHDGdgAx1NYSpezha52Yauq -1dya2Wh2onAIwTj1p0lxxWWLkhRyCKWa5O3ORXOos9KVQluZm83j0oqi84JyWH50Vdmc7ep43d3I -t1Z2Iz2FYdxeSTsxyRnvTdVuDNcNluM9KrKcg817NOnZGNbEXdkNckjrXGeIIprPxFFdRHAlIwem -COtdmxrG8Q2cd/ZNExw45RvQ1bVjim+dWNzw7eaTD4mN3dndCQCo6hmI5zXpj/Ea/wBHjkh0kwRW -xXEfl4yTxXzXZalJDL9nuWKMmRnHcV2Hh3WreCyYXW2SWQhd5P3F6n+lS43d2cTm6d7Ox9EWPxH1 -ODQxPqWpCaSU/ukUc4z3/WvKW8UhviAdaMewYZG98gj9c1ymoa8LyWOJHwkTDaVPb0qpr+q2m6Nb -cfvNo349az9mou9iZVXNWbub3jm98/Vza2ReV7lsJg/e3dsV654UR9N0K0sZP9ZDGFbHr3rzL4P+ -H7rXfEEWr3I3W1qf3IYdW9fwqDxf4k8UeH/G95p08kscHmk25dPlZT0we9YTj7SXKjpw1aNG8mj3 -FLv5ccU959ycnmvKPDnxB82YQarGsZPAlTp+IrvIr1ZIgySKwIyCOhFYTpyg9T0qWIhVV4svzPvf -IdhgY4orPachj81FRdmtzxqdiZmJ9aQEgdqZcPtmbJ71DJcAZ5r20kkeXJtsfPIQDwPzrG1a+S3i -LyHAHvmp7y7HOD1rlNdm+1T7Acovf3o+J2RMpezjzMvrob67pX9o2ShZlYgg/wAWKxZLLWLZ/Ke3 -mVh14yK9M+BMC3dre2ko3LHKCB7EV7EngeGQJdQ7HyBkMKS0djgq1W3c+XtK03U522RwzsTwNiEk -ntXoHgf4calql9El/G8UZbLfLyfr7V9FeGvh+s+0Lbxxcglu2K1NW1nwN4Gk/wBLuI57tV5jjwzE -/QVNS+0dWYRqNvXRFv4eeCodKsY1ggVIY1G3K4z714h+1Jqul3GpwaXYeXJLbzgyyrg4b+6D+HNb -vjz436zq9m+naHF/ZdkeGfOZXH17V4Vqt2b29K+ZuOc5bnce5zWdPBShL2lTfojSeJhy+zp/NjVz -1Bwa6DSfFGq6fbJFDKrov8DjPFcu97ZxsUe4jVhwVJ5Bpp1mwQiLewJPXacVq6fNpYyjOUXdHoKf -EG8VQHsInbuVcgflRXnt5fIs2FYHgcgUVi8LG+xusdW/mN7U2KgEVkTzPt60UVfQ9eHxGHrV1MGi -iD4V25x1qvdgLAMd6KK0pbHm4x++dp8FtUubLxJ5EIjMc+A4Za+qfD8pe1JZVOBmiinW3RyRPMfi -R8QPE638+k2l6LK0Hylbddhb6nOa80mlkcmWR2kcnlnOSaKK7qCXKcNdu5narcSrAoBxvODWJIga -VckjDdqKKwq/EaQ0gUdbjQ6mr7QGBUcd6tPBC6gtGpOOuKKKie5qn7qIpEXd0HSiiimSf//Z` diff --git a/vendor/golang.org/x/crypto/openpgp/packet/userid.go b/vendor/golang.org/x/crypto/openpgp/packet/userid.go deleted file mode 100644 index d6bea7d4a..000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/userid.go +++ /dev/null @@ -1,160 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package packet - -import ( - "io" - "io/ioutil" - "strings" -) - -// UserId contains text that is intended to represent the name and email -// address of the key holder. See RFC 4880, section 5.11. By convention, this -// takes the form "Full Name (Comment) " -type UserId struct { - Id string // By convention, this takes the form "Full Name (Comment) " which is split out in the fields below. - - Name, Comment, Email string -} - -func hasInvalidCharacters(s string) bool { - for _, c := range s { - switch c { - case '(', ')', '<', '>', 0: - return true - } - } - return false -} - -// NewUserId returns a UserId or nil if any of the arguments contain invalid -// characters. The invalid characters are '\x00', '(', ')', '<' and '>' -func NewUserId(name, comment, email string) *UserId { - // RFC 4880 doesn't deal with the structure of userid strings; the - // name, comment and email form is just a convention. However, there's - // no convention about escaping the metacharacters and GPG just refuses - // to create user ids where, say, the name contains a '('. We mirror - // this behaviour. - - if hasInvalidCharacters(name) || hasInvalidCharacters(comment) || hasInvalidCharacters(email) { - return nil - } - - uid := new(UserId) - uid.Name, uid.Comment, uid.Email = name, comment, email - uid.Id = name - if len(comment) > 0 { - if len(uid.Id) > 0 { - uid.Id += " " - } - uid.Id += "(" - uid.Id += comment - uid.Id += ")" - } - if len(email) > 0 { - if len(uid.Id) > 0 { - uid.Id += " " - } - uid.Id += "<" - uid.Id += email - uid.Id += ">" - } - return uid -} - -func (uid *UserId) parse(r io.Reader) (err error) { - // RFC 4880, section 5.11 - b, err := ioutil.ReadAll(r) - if err != nil { - return - } - uid.Id = string(b) - uid.Name, uid.Comment, uid.Email = parseUserId(uid.Id) - return -} - -// Serialize marshals uid to w in the form of an OpenPGP packet, including -// header. -func (uid *UserId) Serialize(w io.Writer) error { - err := serializeHeader(w, packetTypeUserId, len(uid.Id)) - if err != nil { - return err - } - _, err = w.Write([]byte(uid.Id)) - return err -} - -// parseUserId extracts the name, comment and email from a user id string that -// is formatted as "Full Name (Comment) ". -func parseUserId(id string) (name, comment, email string) { - var n, c, e struct { - start, end int - } - var state int - - for offset, rune := range id { - switch state { - case 0: - // Entering name - n.start = offset - state = 1 - fallthrough - case 1: - // In name - if rune == '(' { - state = 2 - n.end = offset - } else if rune == '<' { - state = 5 - n.end = offset - } - case 2: - // Entering comment - c.start = offset - state = 3 - fallthrough - case 3: - // In comment - if rune == ')' { - state = 4 - c.end = offset - } - case 4: - // Between comment and email - if rune == '<' { - state = 5 - } - case 5: - // Entering email - e.start = offset - state = 6 - fallthrough - case 6: - // In email - if rune == '>' { - state = 7 - e.end = offset - } - default: - // After email - } - } - switch state { - case 1: - // ended in the name - n.end = len(id) - case 3: - // ended in comment - c.end = len(id) - case 6: - // ended in email - e.end = len(id) - } - - name = strings.TrimSpace(id[n.start:n.end]) - comment = strings.TrimSpace(id[c.start:c.end]) - email = strings.TrimSpace(id[e.start:e.end]) - return -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/userid_test.go b/vendor/golang.org/x/crypto/openpgp/packet/userid_test.go deleted file mode 100644 index 296819389..000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/userid_test.go +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package packet - -import ( - "testing" -) - -var userIdTests = []struct { - id string - name, comment, email string -}{ - {"", "", "", ""}, - {"John Smith", "John Smith", "", ""}, - {"John Smith ()", "John Smith", "", ""}, - {"John Smith () <>", "John Smith", "", ""}, - {"(comment", "", "comment", ""}, - {"(comment)", "", "comment", ""}, - {" sdfk", "", "", "email"}, - {" John Smith ( Comment ) asdkflj < email > lksdfj", "John Smith", "Comment", "email"}, - {" John Smith < email > lksdfj", "John Smith", "", "email"}, - {"("}, - {"foo", "bar", "", "foo (bar)"}, - {"foo", "", "baz", "foo "}, - {"", "bar", "baz", "(bar) "}, - {"foo", "bar", "baz", "foo (bar) "}, -} - -func TestNewUserId(t *testing.T) { - for i, test := range newUserIdTests { - uid := NewUserId(test.name, test.comment, test.email) - if uid == nil { - t.Errorf("#%d: returned nil", i) - continue - } - if uid.Id != test.id { - t.Errorf("#%d: got '%s', want '%s'", i, uid.Id, test.id) - } - } -} - -var invalidNewUserIdTests = []struct { - name, comment, email string -}{ - {"foo(", "", ""}, - {"foo<", "", ""}, - {"", "bar)", ""}, - {"", "bar<", ""}, - {"", "", "baz>"}, - {"", "", "baz)"}, - {"", "", "baz\x00"}, -} - -func TestNewUserIdWithInvalidInput(t *testing.T) { - for i, test := range invalidNewUserIdTests { - if uid := NewUserId(test.name, test.comment, test.email); uid != nil { - t.Errorf("#%d: returned non-nil value: %#v", i, uid) - } - } -} diff --git a/vendor/golang.org/x/crypto/openpgp/read.go b/vendor/golang.org/x/crypto/openpgp/read.go deleted file mode 100644 index 6ec664f44..000000000 --- a/vendor/golang.org/x/crypto/openpgp/read.go +++ /dev/null @@ -1,442 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package openpgp implements high level operations on OpenPGP messages. -package openpgp // import "golang.org/x/crypto/openpgp" - -import ( - "crypto" - _ "crypto/sha256" - "hash" - "io" - "strconv" - - "golang.org/x/crypto/openpgp/armor" - "golang.org/x/crypto/openpgp/errors" - "golang.org/x/crypto/openpgp/packet" -) - -// SignatureType is the armor type for a PGP signature. -var SignatureType = "PGP SIGNATURE" - -// readArmored reads an armored block with the given type. -func readArmored(r io.Reader, expectedType string) (body io.Reader, err error) { - block, err := armor.Decode(r) - if err != nil { - return - } - - if block.Type != expectedType { - return nil, errors.InvalidArgumentError("expected '" + expectedType + "', got: " + block.Type) - } - - return block.Body, nil -} - -// MessageDetails contains the result of parsing an OpenPGP encrypted and/or -// signed message. -type MessageDetails struct { - IsEncrypted bool // true if the message was encrypted. - EncryptedToKeyIds []uint64 // the list of recipient key ids. - IsSymmetricallyEncrypted bool // true if a passphrase could have decrypted the message. - DecryptedWith Key // the private key used to decrypt the message, if any. - IsSigned bool // true if the message is signed. - SignedByKeyId uint64 // the key id of the signer, if any. - SignedBy *Key // the key of the signer, if available. - LiteralData *packet.LiteralData // the metadata of the contents - UnverifiedBody io.Reader // the contents of the message. - - // If IsSigned is true and SignedBy is non-zero then the signature will - // be verified as UnverifiedBody is read. The signature cannot be - // checked until the whole of UnverifiedBody is read so UnverifiedBody - // must be consumed until EOF before the data can be trusted. Even if a - // message isn't signed (or the signer is unknown) the data may contain - // an authentication code that is only checked once UnverifiedBody has - // been consumed. Once EOF has been seen, the following fields are - // valid. (An authentication code failure is reported as a - // SignatureError error when reading from UnverifiedBody.) - SignatureError error // nil if the signature is good. - Signature *packet.Signature // the signature packet itself, if v4 (default) - SignatureV3 *packet.SignatureV3 // the signature packet if it is a v2 or v3 signature - - decrypted io.ReadCloser -} - -// A PromptFunction is used as a callback by functions that may need to decrypt -// a private key, or prompt for a passphrase. It is called with a list of -// acceptable, encrypted private keys and a boolean that indicates whether a -// passphrase is usable. It should either decrypt a private key or return a -// passphrase to try. If the decrypted private key or given passphrase isn't -// correct, the function will be called again, forever. Any error returned will -// be passed up. -type PromptFunction func(keys []Key, symmetric bool) ([]byte, error) - -// A keyEnvelopePair is used to store a private key with the envelope that -// contains a symmetric key, encrypted with that key. -type keyEnvelopePair struct { - key Key - encryptedKey *packet.EncryptedKey -} - -// ReadMessage parses an OpenPGP message that may be signed and/or encrypted. -// The given KeyRing should contain both public keys (for signature -// verification) and, possibly encrypted, private keys for decrypting. -// If config is nil, sensible defaults will be used. -func ReadMessage(r io.Reader, keyring KeyRing, prompt PromptFunction, config *packet.Config) (md *MessageDetails, err error) { - var p packet.Packet - - var symKeys []*packet.SymmetricKeyEncrypted - var pubKeys []keyEnvelopePair - var se *packet.SymmetricallyEncrypted - - packets := packet.NewReader(r) - md = new(MessageDetails) - md.IsEncrypted = true - - // The message, if encrypted, starts with a number of packets - // containing an encrypted decryption key. The decryption key is either - // encrypted to a public key, or with a passphrase. This loop - // collects these packets. -ParsePackets: - for { - p, err = packets.Next() - if err != nil { - return nil, err - } - switch p := p.(type) { - case *packet.SymmetricKeyEncrypted: - // This packet contains the decryption key encrypted with a passphrase. - md.IsSymmetricallyEncrypted = true - symKeys = append(symKeys, p) - case *packet.EncryptedKey: - // This packet contains the decryption key encrypted to a public key. - md.EncryptedToKeyIds = append(md.EncryptedToKeyIds, p.KeyId) - switch p.Algo { - case packet.PubKeyAlgoRSA, packet.PubKeyAlgoRSAEncryptOnly, packet.PubKeyAlgoElGamal: - break - default: - continue - } - var keys []Key - if p.KeyId == 0 { - keys = keyring.DecryptionKeys() - } else { - keys = keyring.KeysById(p.KeyId) - } - for _, k := range keys { - pubKeys = append(pubKeys, keyEnvelopePair{k, p}) - } - case *packet.SymmetricallyEncrypted: - se = p - break ParsePackets - case *packet.Compressed, *packet.LiteralData, *packet.OnePassSignature: - // This message isn't encrypted. - if len(symKeys) != 0 || len(pubKeys) != 0 { - return nil, errors.StructuralError("key material not followed by encrypted message") - } - packets.Unread(p) - return readSignedMessage(packets, nil, keyring) - } - } - - var candidates []Key - var decrypted io.ReadCloser - - // Now that we have the list of encrypted keys we need to decrypt at - // least one of them or, if we cannot, we need to call the prompt - // function so that it can decrypt a key or give us a passphrase. -FindKey: - for { - // See if any of the keys already have a private key available - candidates = candidates[:0] - candidateFingerprints := make(map[string]bool) - - for _, pk := range pubKeys { - if pk.key.PrivateKey == nil { - continue - } - if !pk.key.PrivateKey.Encrypted { - if len(pk.encryptedKey.Key) == 0 { - pk.encryptedKey.Decrypt(pk.key.PrivateKey, config) - } - if len(pk.encryptedKey.Key) == 0 { - continue - } - decrypted, err = se.Decrypt(pk.encryptedKey.CipherFunc, pk.encryptedKey.Key) - if err != nil && err != errors.ErrKeyIncorrect { - return nil, err - } - if decrypted != nil { - md.DecryptedWith = pk.key - break FindKey - } - } else { - fpr := string(pk.key.PublicKey.Fingerprint[:]) - if v := candidateFingerprints[fpr]; v { - continue - } - candidates = append(candidates, pk.key) - candidateFingerprints[fpr] = true - } - } - - if len(candidates) == 0 && len(symKeys) == 0 { - return nil, errors.ErrKeyIncorrect - } - - if prompt == nil { - return nil, errors.ErrKeyIncorrect - } - - passphrase, err := prompt(candidates, len(symKeys) != 0) - if err != nil { - return nil, err - } - - // Try the symmetric passphrase first - if len(symKeys) != 0 && passphrase != nil { - for _, s := range symKeys { - key, cipherFunc, err := s.Decrypt(passphrase) - if err == nil { - decrypted, err = se.Decrypt(cipherFunc, key) - if err != nil && err != errors.ErrKeyIncorrect { - return nil, err - } - if decrypted != nil { - break FindKey - } - } - - } - } - } - - md.decrypted = decrypted - if err := packets.Push(decrypted); err != nil { - return nil, err - } - return readSignedMessage(packets, md, keyring) -} - -// readSignedMessage reads a possibly signed message if mdin is non-zero then -// that structure is updated and returned. Otherwise a fresh MessageDetails is -// used. -func readSignedMessage(packets *packet.Reader, mdin *MessageDetails, keyring KeyRing) (md *MessageDetails, err error) { - if mdin == nil { - mdin = new(MessageDetails) - } - md = mdin - - var p packet.Packet - var h hash.Hash - var wrappedHash hash.Hash -FindLiteralData: - for { - p, err = packets.Next() - if err != nil { - return nil, err - } - switch p := p.(type) { - case *packet.Compressed: - if err := packets.Push(p.Body); err != nil { - return nil, err - } - case *packet.OnePassSignature: - if !p.IsLast { - return nil, errors.UnsupportedError("nested signatures") - } - - h, wrappedHash, err = hashForSignature(p.Hash, p.SigType) - if err != nil { - md = nil - return - } - - md.IsSigned = true - md.SignedByKeyId = p.KeyId - keys := keyring.KeysByIdUsage(p.KeyId, packet.KeyFlagSign) - if len(keys) > 0 { - md.SignedBy = &keys[0] - } - case *packet.LiteralData: - md.LiteralData = p - break FindLiteralData - } - } - - if md.SignedBy != nil { - md.UnverifiedBody = &signatureCheckReader{packets, h, wrappedHash, md} - } else if md.decrypted != nil { - md.UnverifiedBody = checkReader{md} - } else { - md.UnverifiedBody = md.LiteralData.Body - } - - return md, nil -} - -// hashForSignature returns a pair of hashes that can be used to verify a -// signature. The signature may specify that the contents of the signed message -// should be preprocessed (i.e. to normalize line endings). Thus this function -// returns two hashes. The second should be used to hash the message itself and -// performs any needed preprocessing. -func hashForSignature(hashId crypto.Hash, sigType packet.SignatureType) (hash.Hash, hash.Hash, error) { - if !hashId.Available() { - return nil, nil, errors.UnsupportedError("hash not available: " + strconv.Itoa(int(hashId))) - } - h := hashId.New() - - switch sigType { - case packet.SigTypeBinary: - return h, h, nil - case packet.SigTypeText: - return h, NewCanonicalTextHash(h), nil - } - - return nil, nil, errors.UnsupportedError("unsupported signature type: " + strconv.Itoa(int(sigType))) -} - -// checkReader wraps an io.Reader from a LiteralData packet. When it sees EOF -// it closes the ReadCloser from any SymmetricallyEncrypted packet to trigger -// MDC checks. -type checkReader struct { - md *MessageDetails -} - -func (cr checkReader) Read(buf []byte) (n int, err error) { - n, err = cr.md.LiteralData.Body.Read(buf) - if err == io.EOF { - mdcErr := cr.md.decrypted.Close() - if mdcErr != nil { - err = mdcErr - } - } - return -} - -// signatureCheckReader wraps an io.Reader from a LiteralData packet and hashes -// the data as it is read. When it sees an EOF from the underlying io.Reader -// it parses and checks a trailing Signature packet and triggers any MDC checks. -type signatureCheckReader struct { - packets *packet.Reader - h, wrappedHash hash.Hash - md *MessageDetails -} - -func (scr *signatureCheckReader) Read(buf []byte) (n int, err error) { - n, err = scr.md.LiteralData.Body.Read(buf) - scr.wrappedHash.Write(buf[:n]) - if err == io.EOF { - var p packet.Packet - p, scr.md.SignatureError = scr.packets.Next() - if scr.md.SignatureError != nil { - return - } - - var ok bool - if scr.md.Signature, ok = p.(*packet.Signature); ok { - scr.md.SignatureError = scr.md.SignedBy.PublicKey.VerifySignature(scr.h, scr.md.Signature) - } else if scr.md.SignatureV3, ok = p.(*packet.SignatureV3); ok { - scr.md.SignatureError = scr.md.SignedBy.PublicKey.VerifySignatureV3(scr.h, scr.md.SignatureV3) - } else { - scr.md.SignatureError = errors.StructuralError("LiteralData not followed by Signature") - return - } - - // The SymmetricallyEncrypted packet, if any, might have an - // unsigned hash of its own. In order to check this we need to - // close that Reader. - if scr.md.decrypted != nil { - mdcErr := scr.md.decrypted.Close() - if mdcErr != nil { - err = mdcErr - } - } - } - return -} - -// CheckDetachedSignature takes a signed file and a detached signature and -// returns the signer if the signature is valid. If the signer isn't known, -// ErrUnknownIssuer is returned. -func CheckDetachedSignature(keyring KeyRing, signed, signature io.Reader) (signer *Entity, err error) { - var issuerKeyId uint64 - var hashFunc crypto.Hash - var sigType packet.SignatureType - var keys []Key - var p packet.Packet - - packets := packet.NewReader(signature) - for { - p, err = packets.Next() - if err == io.EOF { - return nil, errors.ErrUnknownIssuer - } - if err != nil { - return nil, err - } - - switch sig := p.(type) { - case *packet.Signature: - if sig.IssuerKeyId == nil { - return nil, errors.StructuralError("signature doesn't have an issuer") - } - issuerKeyId = *sig.IssuerKeyId - hashFunc = sig.Hash - sigType = sig.SigType - case *packet.SignatureV3: - issuerKeyId = sig.IssuerKeyId - hashFunc = sig.Hash - sigType = sig.SigType - default: - return nil, errors.StructuralError("non signature packet found") - } - - keys = keyring.KeysByIdUsage(issuerKeyId, packet.KeyFlagSign) - if len(keys) > 0 { - break - } - } - - if len(keys) == 0 { - panic("unreachable") - } - - h, wrappedHash, err := hashForSignature(hashFunc, sigType) - if err != nil { - return nil, err - } - - if _, err := io.Copy(wrappedHash, signed); err != nil && err != io.EOF { - return nil, err - } - - for _, key := range keys { - switch sig := p.(type) { - case *packet.Signature: - err = key.PublicKey.VerifySignature(h, sig) - case *packet.SignatureV3: - err = key.PublicKey.VerifySignatureV3(h, sig) - default: - panic("unreachable") - } - - if err == nil { - return key.Entity, nil - } - } - - return nil, err -} - -// CheckArmoredDetachedSignature performs the same actions as -// CheckDetachedSignature but expects the signature to be armored. -func CheckArmoredDetachedSignature(keyring KeyRing, signed, signature io.Reader) (signer *Entity, err error) { - body, err := readArmored(signature, SignatureType) - if err != nil { - return - } - - return CheckDetachedSignature(keyring, signed, body) -} diff --git a/vendor/golang.org/x/crypto/openpgp/read_test.go b/vendor/golang.org/x/crypto/openpgp/read_test.go deleted file mode 100644 index 1fbfbac4c..000000000 --- a/vendor/golang.org/x/crypto/openpgp/read_test.go +++ /dev/null @@ -1,613 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package openpgp - -import ( - "bytes" - _ "crypto/sha512" - "encoding/hex" - "io" - "io/ioutil" - "strings" - "testing" - - "golang.org/x/crypto/openpgp/armor" - "golang.org/x/crypto/openpgp/errors" -) - -func readerFromHex(s string) io.Reader { - data, err := hex.DecodeString(s) - if err != nil { - panic("readerFromHex: bad input") - } - return bytes.NewBuffer(data) -} - -func TestReadKeyRing(t *testing.T) { - kring, err := ReadKeyRing(readerFromHex(testKeys1And2Hex)) - if err != nil { - t.Error(err) - return - } - if len(kring) != 2 || uint32(kring[0].PrimaryKey.KeyId) != 0xC20C31BB || uint32(kring[1].PrimaryKey.KeyId) != 0x1E35246B { - t.Errorf("bad keyring: %#v", kring) - } -} - -func TestRereadKeyRing(t *testing.T) { - kring, err := ReadKeyRing(readerFromHex(testKeys1And2Hex)) - if err != nil { - t.Errorf("error in initial parse: %s", err) - return - } - out := new(bytes.Buffer) - err = kring[0].Serialize(out) - if err != nil { - t.Errorf("error in serialization: %s", err) - return - } - kring, err = ReadKeyRing(out) - if err != nil { - t.Errorf("error in second parse: %s", err) - return - } - - if len(kring) != 1 || uint32(kring[0].PrimaryKey.KeyId) != 0xC20C31BB { - t.Errorf("bad keyring: %#v", kring) - } -} - -func TestReadPrivateKeyRing(t *testing.T) { - kring, err := ReadKeyRing(readerFromHex(testKeys1And2PrivateHex)) - if err != nil { - t.Error(err) - return - } - if len(kring) != 2 || uint32(kring[0].PrimaryKey.KeyId) != 0xC20C31BB || uint32(kring[1].PrimaryKey.KeyId) != 0x1E35246B || kring[0].PrimaryKey == nil { - t.Errorf("bad keyring: %#v", kring) - } -} - -func TestReadDSAKey(t *testing.T) { - kring, err := ReadKeyRing(readerFromHex(dsaTestKeyHex)) - if err != nil { - t.Error(err) - return - } - if len(kring) != 1 || uint32(kring[0].PrimaryKey.KeyId) != 0x0CCC0360 { - t.Errorf("bad parse: %#v", kring) - } -} - -func TestReadP256Key(t *testing.T) { - kring, err := ReadKeyRing(readerFromHex(p256TestKeyHex)) - if err != nil { - t.Error(err) - return - } - if len(kring) != 1 || uint32(kring[0].PrimaryKey.KeyId) != 0x5918513E { - t.Errorf("bad parse: %#v", kring) - } -} - -func TestDSAHashTruncatation(t *testing.T) { - // dsaKeyWithSHA512 was generated with GnuPG and --cert-digest-algo - // SHA512 in order to require DSA hash truncation to verify correctly. - _, err := ReadKeyRing(readerFromHex(dsaKeyWithSHA512)) - if err != nil { - t.Error(err) - } -} - -func TestGetKeyById(t *testing.T) { - kring, _ := ReadKeyRing(readerFromHex(testKeys1And2Hex)) - - keys := kring.KeysById(0xa34d7e18c20c31bb) - if len(keys) != 1 || keys[0].Entity != kring[0] { - t.Errorf("bad result for 0xa34d7e18c20c31bb: %#v", keys) - } - - keys = kring.KeysById(0xfd94408d4543314f) - if len(keys) != 1 || keys[0].Entity != kring[0] { - t.Errorf("bad result for 0xa34d7e18c20c31bb: %#v", keys) - } -} - -func checkSignedMessage(t *testing.T, signedHex, expected string) { - kring, _ := ReadKeyRing(readerFromHex(testKeys1And2Hex)) - - md, err := ReadMessage(readerFromHex(signedHex), kring, nil, nil) - if err != nil { - t.Error(err) - return - } - - if !md.IsSigned || md.SignedByKeyId != 0xa34d7e18c20c31bb || md.SignedBy == nil || md.IsEncrypted || md.IsSymmetricallyEncrypted || len(md.EncryptedToKeyIds) != 0 || md.IsSymmetricallyEncrypted { - t.Errorf("bad MessageDetails: %#v", md) - } - - contents, err := ioutil.ReadAll(md.UnverifiedBody) - if err != nil { - t.Errorf("error reading UnverifiedBody: %s", err) - } - if string(contents) != expected { - t.Errorf("bad UnverifiedBody got:%s want:%s", string(contents), expected) - } - if md.SignatureError != nil || md.Signature == nil { - t.Errorf("failed to validate: %s", md.SignatureError) - } -} - -func TestSignedMessage(t *testing.T) { - checkSignedMessage(t, signedMessageHex, signedInput) -} - -func TestTextSignedMessage(t *testing.T) { - checkSignedMessage(t, signedTextMessageHex, signedTextInput) -} - -// The reader should detect "compressed quines", which are compressed -// packets that expand into themselves and cause an infinite recursive -// parsing loop. -// The packet in this test case comes from Taylor R. Campbell at -// http://mumble.net/~campbell/misc/pgp-quine/ -func TestCampbellQuine(t *testing.T) { - md, err := ReadMessage(readerFromHex(campbellQuine), nil, nil, nil) - if md != nil { - t.Errorf("Reading a compressed quine should not return any data: %#v", md) - } - structural, ok := err.(errors.StructuralError) - if !ok { - t.Fatalf("Unexpected class of error: %T", err) - } - if !strings.Contains(string(structural), "too many layers of packets") { - t.Fatalf("Unexpected error: %s", err) - } -} - -var signedEncryptedMessageTests = []struct { - keyRingHex string - messageHex string - signedByKeyId uint64 - encryptedToKeyId uint64 -}{ - { - testKeys1And2PrivateHex, - signedEncryptedMessageHex, - 0xa34d7e18c20c31bb, - 0x2a67d68660df41c7, - }, - { - dsaElGamalTestKeysHex, - signedEncryptedMessage2Hex, - 0x33af447ccd759b09, - 0xcf6a7abcd43e3673, - }, -} - -func TestSignedEncryptedMessage(t *testing.T) { - for i, test := range signedEncryptedMessageTests { - expected := "Signed and encrypted message\n" - kring, _ := ReadKeyRing(readerFromHex(test.keyRingHex)) - prompt := func(keys []Key, symmetric bool) ([]byte, error) { - if symmetric { - t.Errorf("prompt: message was marked as symmetrically encrypted") - return nil, errors.ErrKeyIncorrect - } - - if len(keys) == 0 { - t.Error("prompt: no keys requested") - return nil, errors.ErrKeyIncorrect - } - - err := keys[0].PrivateKey.Decrypt([]byte("passphrase")) - if err != nil { - t.Errorf("prompt: error decrypting key: %s", err) - return nil, errors.ErrKeyIncorrect - } - - return nil, nil - } - - md, err := ReadMessage(readerFromHex(test.messageHex), kring, prompt, nil) - if err != nil { - t.Errorf("#%d: error reading message: %s", i, err) - return - } - - if !md.IsSigned || md.SignedByKeyId != test.signedByKeyId || md.SignedBy == nil || !md.IsEncrypted || md.IsSymmetricallyEncrypted || len(md.EncryptedToKeyIds) == 0 || md.EncryptedToKeyIds[0] != test.encryptedToKeyId { - t.Errorf("#%d: bad MessageDetails: %#v", i, md) - } - - contents, err := ioutil.ReadAll(md.UnverifiedBody) - if err != nil { - t.Errorf("#%d: error reading UnverifiedBody: %s", i, err) - } - if string(contents) != expected { - t.Errorf("#%d: bad UnverifiedBody got:%s want:%s", i, string(contents), expected) - } - - if md.SignatureError != nil || md.Signature == nil { - t.Errorf("#%d: failed to validate: %s", i, md.SignatureError) - } - } -} - -func TestUnspecifiedRecipient(t *testing.T) { - expected := "Recipient unspecified\n" - kring, _ := ReadKeyRing(readerFromHex(testKeys1And2PrivateHex)) - - md, err := ReadMessage(readerFromHex(recipientUnspecifiedHex), kring, nil, nil) - if err != nil { - t.Errorf("error reading message: %s", err) - return - } - - contents, err := ioutil.ReadAll(md.UnverifiedBody) - if err != nil { - t.Errorf("error reading UnverifiedBody: %s", err) - } - if string(contents) != expected { - t.Errorf("bad UnverifiedBody got:%s want:%s", string(contents), expected) - } -} - -func TestSymmetricallyEncrypted(t *testing.T) { - firstTimeCalled := true - - prompt := func(keys []Key, symmetric bool) ([]byte, error) { - if len(keys) != 0 { - t.Errorf("prompt: len(keys) = %d (want 0)", len(keys)) - } - - if !symmetric { - t.Errorf("symmetric is not set") - } - - if firstTimeCalled { - firstTimeCalled = false - return []byte("wrongpassword"), nil - } - - return []byte("password"), nil - } - - md, err := ReadMessage(readerFromHex(symmetricallyEncryptedCompressedHex), nil, prompt, nil) - if err != nil { - t.Errorf("ReadMessage: %s", err) - return - } - - contents, err := ioutil.ReadAll(md.UnverifiedBody) - if err != nil { - t.Errorf("ReadAll: %s", err) - } - - expectedCreationTime := uint32(1295992998) - if md.LiteralData.Time != expectedCreationTime { - t.Errorf("LiteralData.Time is %d, want %d", md.LiteralData.Time, expectedCreationTime) - } - - const expected = "Symmetrically encrypted.\n" - if string(contents) != expected { - t.Errorf("contents got: %s want: %s", string(contents), expected) - } -} - -func testDetachedSignature(t *testing.T, kring KeyRing, signature io.Reader, sigInput, tag string, expectedSignerKeyId uint64) { - signed := bytes.NewBufferString(sigInput) - signer, err := CheckDetachedSignature(kring, signed, signature) - if err != nil { - t.Errorf("%s: signature error: %s", tag, err) - return - } - if signer == nil { - t.Errorf("%s: signer is nil", tag) - return - } - if signer.PrimaryKey.KeyId != expectedSignerKeyId { - t.Errorf("%s: wrong signer got:%x want:%x", tag, signer.PrimaryKey.KeyId, expectedSignerKeyId) - } -} - -func TestDetachedSignature(t *testing.T) { - kring, _ := ReadKeyRing(readerFromHex(testKeys1And2Hex)) - testDetachedSignature(t, kring, readerFromHex(detachedSignatureHex), signedInput, "binary", testKey1KeyId) - testDetachedSignature(t, kring, readerFromHex(detachedSignatureTextHex), signedInput, "text", testKey1KeyId) - testDetachedSignature(t, kring, readerFromHex(detachedSignatureV3TextHex), signedInput, "v3", testKey1KeyId) - - incorrectSignedInput := signedInput + "X" - _, err := CheckDetachedSignature(kring, bytes.NewBufferString(incorrectSignedInput), readerFromHex(detachedSignatureHex)) - if err == nil { - t.Fatal("CheckDetachedSignature returned without error for bad signature") - } - if err == errors.ErrUnknownIssuer { - t.Fatal("CheckDetachedSignature returned ErrUnknownIssuer when the signer was known, but the signature invalid") - } -} - -func TestDetachedSignatureDSA(t *testing.T) { - kring, _ := ReadKeyRing(readerFromHex(dsaTestKeyHex)) - testDetachedSignature(t, kring, readerFromHex(detachedSignatureDSAHex), signedInput, "binary", testKey3KeyId) -} - -func TestMultipleSignaturePacketsDSA(t *testing.T) { - kring, _ := ReadKeyRing(readerFromHex(dsaTestKeyHex)) - testDetachedSignature(t, kring, readerFromHex(missingHashFunctionHex+detachedSignatureDSAHex), signedInput, "binary", testKey3KeyId) -} - -func TestDetachedSignatureP256(t *testing.T) { - kring, _ := ReadKeyRing(readerFromHex(p256TestKeyHex)) - testDetachedSignature(t, kring, readerFromHex(detachedSignatureP256Hex), signedInput, "binary", testKeyP256KeyId) -} - -func testHashFunctionError(t *testing.T, signatureHex string) { - kring, _ := ReadKeyRing(readerFromHex(testKeys1And2Hex)) - _, err := CheckDetachedSignature(kring, nil, readerFromHex(signatureHex)) - if err == nil { - t.Fatal("Packet with bad hash type was correctly parsed") - } - unsupported, ok := err.(errors.UnsupportedError) - if !ok { - t.Fatalf("Unexpected class of error: %s", err) - } - if !strings.Contains(string(unsupported), "hash ") { - t.Fatalf("Unexpected error: %s", err) - } -} - -func TestUnknownHashFunction(t *testing.T) { - // unknownHashFunctionHex contains a signature packet with hash - // function type 153 (which isn't a real hash function id). - testHashFunctionError(t, unknownHashFunctionHex) -} - -func TestMissingHashFunction(t *testing.T) { - // missingHashFunctionHex contains a signature packet that uses - // RIPEMD160, which isn't compiled in. Since that's the only signature - // packet we don't find any suitable packets and end up with ErrUnknownIssuer - kring, _ := ReadKeyRing(readerFromHex(testKeys1And2Hex)) - _, err := CheckDetachedSignature(kring, nil, readerFromHex(missingHashFunctionHex)) - if err == nil { - t.Fatal("Packet with missing hash type was correctly parsed") - } - if err != errors.ErrUnknownIssuer { - t.Fatalf("Unexpected class of error: %s", err) - } -} - -func TestReadingArmoredPrivateKey(t *testing.T) { - el, err := ReadArmoredKeyRing(bytes.NewBufferString(armoredPrivateKeyBlock)) - if err != nil { - t.Error(err) - } - if len(el) != 1 { - t.Errorf("got %d entities, wanted 1\n", len(el)) - } -} - -func TestReadingArmoredPublicKey(t *testing.T) { - el, err := ReadArmoredKeyRing(bytes.NewBufferString(e2ePublicKey)) - if err != nil { - t.Error(err) - } - if len(el) != 1 { - t.Errorf("didn't get a valid entity") - } -} - -func TestNoArmoredData(t *testing.T) { - _, err := ReadArmoredKeyRing(bytes.NewBufferString("foo")) - if _, ok := err.(errors.InvalidArgumentError); !ok { - t.Errorf("error was not an InvalidArgumentError: %s", err) - } -} - -func testReadMessageError(t *testing.T, messageHex string) { - buf, err := hex.DecodeString(messageHex) - if err != nil { - t.Errorf("hex.DecodeString(): %v", err) - } - - kr, err := ReadKeyRing(new(bytes.Buffer)) - if err != nil { - t.Errorf("ReadKeyring(): %v", err) - } - - _, err = ReadMessage(bytes.NewBuffer(buf), kr, - func([]Key, bool) ([]byte, error) { - return []byte("insecure"), nil - }, nil) - - if err == nil { - t.Errorf("ReadMessage(): Unexpected nil error") - } -} - -func TestIssue11503(t *testing.T) { - testReadMessageError(t, "8c040402000aa430aa8228b9248b01fc899a91197130303030") -} - -func TestIssue11504(t *testing.T) { - testReadMessageError(t, "9303000130303030303030303030983002303030303030030000000130") -} - -// TestSignatureV3Message tests the verification of V3 signature, generated -// with a modern V4-style key. Some people have their clients set to generate -// V3 signatures, so it's useful to be able to verify them. -func TestSignatureV3Message(t *testing.T) { - sig, err := armor.Decode(strings.NewReader(signedMessageV3)) - if err != nil { - t.Error(err) - return - } - key, err := ReadArmoredKeyRing(strings.NewReader(keyV4forVerifyingSignedMessageV3)) - if err != nil { - t.Error(err) - return - } - md, err := ReadMessage(sig.Body, key, nil, nil) - if err != nil { - t.Error(err) - return - } - - _, err = ioutil.ReadAll(md.UnverifiedBody) - if err != nil { - t.Error(err) - return - } - - // We'll see a sig error here after reading in the UnverifiedBody above, - // if there was one to see. - if err = md.SignatureError; err != nil { - t.Error(err) - return - } - - if md.SignatureV3 == nil { - t.Errorf("No available signature after checking signature") - return - } - if md.Signature != nil { - t.Errorf("Did not expect a signature V4 back") - return - } - return -} - -const testKey1KeyId = 0xA34D7E18C20C31BB -const testKey3KeyId = 0x338934250CCC0360 -const testKeyP256KeyId = 0xd44a2c495918513e - -const signedInput = "Signed message\nline 2\nline 3\n" -const signedTextInput = "Signed message\r\nline 2\r\nline 3\r\n" - -const recipientUnspecifiedHex = "848c0300000000000000000103ff62d4d578d03cf40c3da998dfe216c074fa6ddec5e31c197c9666ba292830d91d18716a80f699f9d897389a90e6d62d0238f5f07a5248073c0f24920e4bc4a30c2d17ee4e0cae7c3d4aaa4e8dced50e3010a80ee692175fa0385f62ecca4b56ee6e9980aa3ec51b61b077096ac9e800edaf161268593eedb6cc7027ff5cb32745d250010d407a6221ae22ef18469b444f2822478c4d190b24d36371a95cb40087cdd42d9399c3d06a53c0673349bfb607927f20d1e122bde1e2bf3aa6cae6edf489629bcaa0689539ae3b718914d88ededc3b" - -const detachedSignatureHex = "889c04000102000605024d449cd1000a0910a34d7e18c20c31bb167603ff57718d09f28a519fdc7b5a68b6a3336da04df85e38c5cd5d5bd2092fa4629848a33d85b1729402a2aab39c3ac19f9d573f773cc62c264dc924c067a79dfd8a863ae06c7c8686120760749f5fd9b1e03a64d20a7df3446ddc8f0aeadeaeba7cbaee5c1e366d65b6a0c6cc749bcb912d2f15013f812795c2e29eb7f7b77f39ce77" - -const detachedSignatureTextHex = "889c04010102000605024d449d21000a0910a34d7e18c20c31bbc8c60400a24fbef7342603a41cb1165767bd18985d015fb72fe05db42db36cfb2f1d455967f1e491194fbf6cf88146222b23bf6ffbd50d17598d976a0417d3192ff9cc0034fd00f287b02e90418bbefe609484b09231e4e7a5f3562e199bf39909ab5276c4d37382fe088f6b5c3426fc1052865da8b3ab158672d58b6264b10823dc4b39" - -const detachedSignatureV3TextHex = "8900950305005255c25ca34d7e18c20c31bb0102bb3f04009f6589ef8a028d6e54f6eaf25432e590d31c3a41f4710897585e10c31e5e332c7f9f409af8512adceaff24d0da1474ab07aa7bce4f674610b010fccc5b579ae5eb00a127f272fb799f988ab8e4574c141da6dbfecfef7e6b2c478d9a3d2551ba741f260ee22bec762812f0053e05380bfdd55ad0f22d8cdf71b233fe51ae8a24" - -const detachedSignatureDSAHex = "884604001102000605024d6c4eac000a0910338934250ccc0360f18d00a087d743d6405ed7b87755476629600b8b694a39e900a0abff8126f46faf1547c1743c37b21b4ea15b8f83" - -const detachedSignatureP256Hex = "885e0400130a0006050256e5bb00000a0910d44a2c495918513edef001009841a4f792beb0befccb35c8838a6a87d9b936beaa86db6745ddc7b045eee0cf00fd1ac1f78306b17e965935dd3f8bae4587a76587e4af231efe19cc4011a8434817" - -const testKeys1And2Hex = "988d044d3c5c10010400b1d13382944bd5aba23a4312968b5095d14f947f600eb478e14a6fcb16b0e0cac764884909c020bc495cfcc39a935387c661507bdb236a0612fb582cac3af9b29cc2c8c70090616c41b662f4da4c1201e195472eb7f4ae1ccbcbf9940fe21d985e379a5563dde5b9a23d35f1cfaa5790da3b79db26f23695107bfaca8e7b5bcd0011010001b41054657374204b6579203120285253412988b804130102002205024d3c5c10021b03060b090807030206150802090a0b0416020301021e01021780000a0910a34d7e18c20c31bbb5b304009cc45fe610b641a2c146331be94dade0a396e73ca725e1b25c21708d9cab46ecca5ccebc23055879df8f99eea39b377962a400f2ebdc36a7c99c333d74aeba346315137c3ff9d0a09b0273299090343048afb8107cf94cbd1400e3026f0ccac7ecebbc4d78588eb3e478fe2754d3ca664bcf3eac96ca4a6b0c8d7df5102f60f6b0020003b88d044d3c5c10010400b201df61d67487301f11879d514f4248ade90c8f68c7af1284c161098de4c28c2850f1ec7b8e30f959793e571542ffc6532189409cb51c3d30dad78c4ad5165eda18b20d9826d8707d0f742e2ab492103a85bbd9ddf4f5720f6de7064feb0d39ee002219765bb07bcfb8b877f47abe270ddeda4f676108cecb6b9bb2ad484a4f0011010001889f04180102000905024d3c5c10021b0c000a0910a34d7e18c20c31bb1a03040085c8d62e16d05dc4e9dad64953c8a2eed8b6c12f92b1575eeaa6dcf7be9473dd5b24b37b6dffbb4e7c99ed1bd3cb11634be19b3e6e207bed7505c7ca111ccf47cb323bf1f8851eb6360e8034cbff8dd149993c959de89f8f77f38e7e98b8e3076323aa719328e2b408db5ec0d03936efd57422ba04f925cdc7b4c1af7590e40ab0020003988d044d3c5c33010400b488c3e5f83f4d561f317817538d9d0397981e9aef1321ca68ebfae1cf8b7d388e19f4b5a24a82e2fbbf1c6c26557a6c5845307a03d815756f564ac7325b02bc83e87d5480a8fae848f07cb891f2d51ce7df83dcafdc12324517c86d472cc0ee10d47a68fd1d9ae49a6c19bbd36d82af597a0d88cc9c49de9df4e696fc1f0b5d0011010001b42754657374204b6579203220285253412c20656e637279707465642070726976617465206b65792988b804130102002205024d3c5c33021b03060b090807030206150802090a0b0416020301021e01021780000a0910d4984f961e35246b98940400908a73b6a6169f700434f076c6c79015a49bee37130eaf23aaa3cfa9ce60bfe4acaa7bc95f1146ada5867e0079babb38804891f4f0b8ebca57a86b249dee786161a755b7a342e68ccf3f78ed6440a93a6626beb9a37aa66afcd4f888790cb4bb46d94a4ae3eb3d7d3e6b00f6bfec940303e89ec5b32a1eaaacce66497d539328b0020003b88d044d3c5c33010400a4e913f9442abcc7f1804ccab27d2f787ffa592077ca935a8bb23165bd8d57576acac647cc596b2c3f814518cc8c82953c7a4478f32e0cf645630a5ba38d9618ef2bc3add69d459ae3dece5cab778938d988239f8c5ae437807075e06c828019959c644ff05ef6a5a1dab72227c98e3a040b0cf219026640698d7a13d8538a570011010001889f04180102000905024d3c5c33021b0c000a0910d4984f961e35246b26c703ff7ee29ef53bc1ae1ead533c408fa136db508434e233d6e62be621e031e5940bbd4c08142aed0f82217e7c3e1ec8de574bc06ccf3c36633be41ad78a9eacd209f861cae7b064100758545cc9dd83db71806dc1cfd5fb9ae5c7474bba0c19c44034ae61bae5eca379383339dece94ff56ff7aa44a582f3e5c38f45763af577c0934b0020003" - -const testKeys1And2PrivateHex = "9501d8044d3c5c10010400b1d13382944bd5aba23a4312968b5095d14f947f600eb478e14a6fcb16b0e0cac764884909c020bc495cfcc39a935387c661507bdb236a0612fb582cac3af9b29cc2c8c70090616c41b662f4da4c1201e195472eb7f4ae1ccbcbf9940fe21d985e379a5563dde5b9a23d35f1cfaa5790da3b79db26f23695107bfaca8e7b5bcd00110100010003ff4d91393b9a8e3430b14d6209df42f98dc927425b881f1209f319220841273a802a97c7bdb8b3a7740b3ab5866c4d1d308ad0d3a79bd1e883aacf1ac92dfe720285d10d08752a7efe3c609b1d00f17f2805b217be53999a7da7e493bfc3e9618fd17018991b8128aea70a05dbce30e4fbe626aa45775fa255dd9177aabf4df7cf0200c1ded12566e4bc2bb590455e5becfb2e2c9796482270a943343a7835de41080582c2be3caf5981aa838140e97afa40ad652a0b544f83eb1833b0957dce26e47b0200eacd6046741e9ce2ec5beb6fb5e6335457844fb09477f83b050a96be7da043e17f3a9523567ed40e7a521f818813a8b8a72209f1442844843ccc7eb9805442570200bdafe0438d97ac36e773c7162028d65844c4d463e2420aa2228c6e50dc2743c3d6c72d0d782a5173fe7be2169c8a9f4ef8a7cf3e37165e8c61b89c346cdc6c1799d2b41054657374204b6579203120285253412988b804130102002205024d3c5c10021b03060b090807030206150802090a0b0416020301021e01021780000a0910a34d7e18c20c31bbb5b304009cc45fe610b641a2c146331be94dade0a396e73ca725e1b25c21708d9cab46ecca5ccebc23055879df8f99eea39b377962a400f2ebdc36a7c99c333d74aeba346315137c3ff9d0a09b0273299090343048afb8107cf94cbd1400e3026f0ccac7ecebbc4d78588eb3e478fe2754d3ca664bcf3eac96ca4a6b0c8d7df5102f60f6b00200009d01d8044d3c5c10010400b201df61d67487301f11879d514f4248ade90c8f68c7af1284c161098de4c28c2850f1ec7b8e30f959793e571542ffc6532189409cb51c3d30dad78c4ad5165eda18b20d9826d8707d0f742e2ab492103a85bbd9ddf4f5720f6de7064feb0d39ee002219765bb07bcfb8b877f47abe270ddeda4f676108cecb6b9bb2ad484a4f00110100010003fd17a7490c22a79c59281fb7b20f5e6553ec0c1637ae382e8adaea295f50241037f8997cf42c1ce26417e015091451b15424b2c59eb8d4161b0975630408e394d3b00f88d4b4e18e2cc85e8251d4753a27c639c83f5ad4a571c4f19d7cd460b9b73c25ade730c99df09637bd173d8e3e981ac64432078263bb6dc30d3e974150dd0200d0ee05be3d4604d2146fb0457f31ba17c057560785aa804e8ca5530a7cd81d3440d0f4ba6851efcfd3954b7e68908fc0ba47f7ac37bf559c6c168b70d3a7c8cd0200da1c677c4bce06a068070f2b3733b0a714e88d62aa3f9a26c6f5216d48d5c2b5624144f3807c0df30be66b3268eeeca4df1fbded58faf49fc95dc3c35f134f8b01fd1396b6c0fc1b6c4f0eb8f5e44b8eace1e6073e20d0b8bc5385f86f1cf3f050f66af789f3ef1fc107b7f4421e19e0349c730c68f0a226981f4e889054fdb4dc149e8e889f04180102000905024d3c5c10021b0c000a0910a34d7e18c20c31bb1a03040085c8d62e16d05dc4e9dad64953c8a2eed8b6c12f92b1575eeaa6dcf7be9473dd5b24b37b6dffbb4e7c99ed1bd3cb11634be19b3e6e207bed7505c7ca111ccf47cb323bf1f8851eb6360e8034cbff8dd149993c959de89f8f77f38e7e98b8e3076323aa719328e2b408db5ec0d03936efd57422ba04f925cdc7b4c1af7590e40ab00200009501fe044d3c5c33010400b488c3e5f83f4d561f317817538d9d0397981e9aef1321ca68ebfae1cf8b7d388e19f4b5a24a82e2fbbf1c6c26557a6c5845307a03d815756f564ac7325b02bc83e87d5480a8fae848f07cb891f2d51ce7df83dcafdc12324517c86d472cc0ee10d47a68fd1d9ae49a6c19bbd36d82af597a0d88cc9c49de9df4e696fc1f0b5d0011010001fe030302e9030f3c783e14856063f16938530e148bc57a7aa3f3e4f90df9dceccdc779bc0835e1ad3d006e4a8d7b36d08b8e0de5a0d947254ecfbd22037e6572b426bcfdc517796b224b0036ff90bc574b5509bede85512f2eefb520fb4b02aa523ba739bff424a6fe81c5041f253f8d757e69a503d3563a104d0d49e9e890b9d0c26f96b55b743883b472caa7050c4acfd4a21f875bdf1258d88bd61224d303dc9df77f743137d51e6d5246b88c406780528fd9a3e15bab5452e5b93970d9dcc79f48b38651b9f15bfbcf6da452837e9cc70683d1bdca94507870f743e4ad902005812488dd342f836e72869afd00ce1850eea4cfa53ce10e3608e13d3c149394ee3cbd0e23d018fcbcb6e2ec5a1a22972d1d462ca05355d0d290dd2751e550d5efb38c6c89686344df64852bf4ff86638708f644e8ec6bd4af9b50d8541cb91891a431326ab2e332faa7ae86cfb6e0540aa63160c1e5cdd5a4add518b303fff0a20117c6bc77f7cfbaf36b04c865c6c2b42754657374204b6579203220285253412c20656e637279707465642070726976617465206b65792988b804130102002205024d3c5c33021b03060b090807030206150802090a0b0416020301021e01021780000a0910d4984f961e35246b98940400908a73b6a6169f700434f076c6c79015a49bee37130eaf23aaa3cfa9ce60bfe4acaa7bc95f1146ada5867e0079babb38804891f4f0b8ebca57a86b249dee786161a755b7a342e68ccf3f78ed6440a93a6626beb9a37aa66afcd4f888790cb4bb46d94a4ae3eb3d7d3e6b00f6bfec940303e89ec5b32a1eaaacce66497d539328b00200009d01fe044d3c5c33010400a4e913f9442abcc7f1804ccab27d2f787ffa592077ca935a8bb23165bd8d57576acac647cc596b2c3f814518cc8c82953c7a4478f32e0cf645630a5ba38d9618ef2bc3add69d459ae3dece5cab778938d988239f8c5ae437807075e06c828019959c644ff05ef6a5a1dab72227c98e3a040b0cf219026640698d7a13d8538a570011010001fe030302e9030f3c783e148560f936097339ae381d63116efcf802ff8b1c9360767db5219cc987375702a4123fd8657d3e22700f23f95020d1b261eda5257e9a72f9a918e8ef22dd5b3323ae03bbc1923dd224db988cadc16acc04b120a9f8b7e84da9716c53e0334d7b66586ddb9014df604b41be1e960dcfcbc96f4ed150a1a0dd070b9eb14276b9b6be413a769a75b519a53d3ecc0c220e85cd91ca354d57e7344517e64b43b6e29823cbd87eae26e2b2e78e6dedfbb76e3e9f77bcb844f9a8932eb3db2c3f9e44316e6f5d60e9e2a56e46b72abe6b06dc9a31cc63f10023d1f5e12d2a3ee93b675c96f504af0001220991c88db759e231b3320dcedf814dcf723fd9857e3d72d66a0f2af26950b915abdf56c1596f46a325bf17ad4810d3535fb02a259b247ac3dbd4cc3ecf9c51b6c07cebb009c1506fba0a89321ec8683e3fd009a6e551d50243e2d5092fefb3321083a4bad91320dc624bd6b5dddf93553e3d53924c05bfebec1fb4bd47e89a1a889f04180102000905024d3c5c33021b0c000a0910d4984f961e35246b26c703ff7ee29ef53bc1ae1ead533c408fa136db508434e233d6e62be621e031e5940bbd4c08142aed0f82217e7c3e1ec8de574bc06ccf3c36633be41ad78a9eacd209f861cae7b064100758545cc9dd83db71806dc1cfd5fb9ae5c7474bba0c19c44034ae61bae5eca379383339dece94ff56ff7aa44a582f3e5c38f45763af577c0934b0020000" - -const dsaElGamalTestKeysHex = "9501e1044dfcb16a110400aa3e5c1a1f43dd28c2ffae8abf5cfce555ee874134d8ba0a0f7b868ce2214beddc74e5e1e21ded354a95d18acdaf69e5e342371a71fbb9093162e0c5f3427de413a7f2c157d83f5cd2f9d791256dc4f6f0e13f13c3302af27f2384075ab3021dff7a050e14854bbde0a1094174855fc02f0bae8e00a340d94a1f22b32e48485700a0cec672ac21258fb95f61de2ce1af74b2c4fa3e6703ff698edc9be22c02ae4d916e4fa223f819d46582c0516235848a77b577ea49018dcd5e9e15cff9dbb4663a1ae6dd7580fa40946d40c05f72814b0f88481207e6c0832c3bded4853ebba0a7e3bd8e8c66df33d5a537cd4acf946d1080e7a3dcea679cb2b11a72a33a2b6a9dc85f466ad2ddf4c3db6283fa645343286971e3dd700703fc0c4e290d45767f370831a90187e74e9972aae5bff488eeff7d620af0362bfb95c1a6c3413ab5d15a2e4139e5d07a54d72583914661ed6a87cce810be28a0aa8879a2dd39e52fb6fe800f4f181ac7e328f740cde3d09a05cecf9483e4cca4253e60d4429ffd679d9996a520012aad119878c941e3cf151459873bdfc2a9563472fe0303027a728f9feb3b864260a1babe83925ce794710cfd642ee4ae0e5b9d74cee49e9c67b6cd0ea5dfbb582132195a121356a1513e1bca73e5b80c58c7ccb4164453412f456c47616d616c2054657374204b65792031886204131102002205024dfcb16a021b03060b090807030206150802090a0b0416020301021e01021780000a091033af447ccd759b09fadd00a0b8fd6f5a790bad7e9f2dbb7632046dc4493588db009c087c6a9ba9f7f49fab221587a74788c00db4889ab00200009d0157044dfcb16a1004008dec3f9291205255ccff8c532318133a6840739dd68b03ba942676f9038612071447bf07d00d559c5c0875724ea16a4c774f80d8338b55fca691a0522e530e604215b467bbc9ccfd483a1da99d7bc2648b4318fdbd27766fc8bfad3fddb37c62b8ae7ccfe9577e9b8d1e77c1d417ed2c2ef02d52f4da11600d85d3229607943700030503ff506c94c87c8cab778e963b76cf63770f0a79bf48fb49d3b4e52234620fc9f7657f9f8d56c96a2b7c7826ae6b57ebb2221a3fe154b03b6637cea7e6d98e3e45d87cf8dc432f723d3d71f89c5192ac8d7290684d2c25ce55846a80c9a7823f6acd9bb29fa6cd71f20bc90eccfca20451d0c976e460e672b000df49466408d527affe0303027a728f9feb3b864260abd761730327bca2aaa4ea0525c175e92bf240682a0e83b226f97ecb2e935b62c9a133858ce31b271fa8eb41f6a1b3cd72a63025ce1a75ee4180dcc284884904181102000905024dfcb16a021b0c000a091033af447ccd759b09dd0b009e3c3e7296092c81bee5a19929462caaf2fff3ae26009e218c437a2340e7ea628149af1ec98ec091a43992b00200009501e1044dfcb1be1104009f61faa61aa43df75d128cbe53de528c4aec49ce9360c992e70c77072ad5623de0a3a6212771b66b39a30dad6781799e92608316900518ec01184a85d872365b7d2ba4bacfb5882ea3c2473d3750dc6178cc1cf82147fb58caa28b28e9f12f6d1efcb0534abed644156c91cca4ab78834268495160b2400bc422beb37d237c2300a0cac94911b6d493bda1e1fbc6feeca7cb7421d34b03fe22cec6ccb39675bb7b94a335c2b7be888fd3906a1125f33301d8aa6ec6ee6878f46f73961c8d57a3e9544d8ef2a2cbfd4d52da665b1266928cfe4cb347a58c412815f3b2d2369dec04b41ac9a71cc9547426d5ab941cccf3b18575637ccfb42df1a802df3cfe0a999f9e7109331170e3a221991bf868543960f8c816c28097e503fe319db10fb98049f3a57d7c80c420da66d56f3644371631fad3f0ff4040a19a4fedc2d07727a1b27576f75a4d28c47d8246f27071e12d7a8de62aad216ddbae6aa02efd6b8a3e2818cda48526549791ab277e447b3a36c57cefe9b592f5eab73959743fcc8e83cbefec03a329b55018b53eec196765ae40ef9e20521a603c551efe0303020950d53a146bf9c66034d00c23130cce95576a2ff78016ca471276e8227fb30b1ffbd92e61804fb0c3eff9e30b1a826ee8f3e4730b4d86273ca977b4164453412f456c47616d616c2054657374204b65792032886204131102002205024dfcb1be021b03060b090807030206150802090a0b0416020301021e01021780000a0910a86bf526325b21b22bd9009e34511620415c974750a20df5cb56b182f3b48e6600a0a9466cb1a1305a84953445f77d461593f1d42bc1b00200009d0157044dfcb1be1004009565a951da1ee87119d600c077198f1c1bceb0f7aa54552489298e41ff788fa8f0d43a69871f0f6f77ebdfb14a4260cf9fbeb65d5844b4272a1904dd95136d06c3da745dc46327dd44a0f16f60135914368c8039a34033862261806bb2c5ce1152e2840254697872c85441ccb7321431d75a747a4bfb1d2c66362b51ce76311700030503fc0ea76601c196768070b7365a200e6ddb09307f262d5f39eec467b5f5784e22abdf1aa49226f59ab37cb49969d8f5230ea65caf56015abda62604544ed526c5c522bf92bed178a078789f6c807b6d34885688024a5bed9e9f8c58d11d4b82487b44c5f470c5606806a0443b79cadb45e0f897a561a53f724e5349b9267c75ca17fe0303020950d53a146bf9c660bc5f4ce8f072465e2d2466434320c1e712272fafc20e342fe7608101580fa1a1a367e60486a7cd1246b7ef5586cf5e10b32762b710a30144f12dd17dd4884904181102000905024dfcb1be021b0c000a0910a86bf526325b21b2904c00a0b2b66b4b39ccffda1d10f3ea8d58f827e30a8b8e009f4255b2d8112a184e40cde43a34e8655ca7809370b0020000" - -const signedMessageHex = "a3019bc0cbccc0c4b8d8b74ee2108fe16ec6d3ca490cbe362d3f8333d3f352531472538b8b13d353b97232f352158c20943157c71c16064626063656269052062e4e01987e9b6fccff4b7df3a34c534b23e679cbec3bc0f8f6e64dfb4b55fe3f8efa9ce110ddb5cd79faf1d753c51aecfa669f7e7aa043436596cccc3359cb7dd6bbe9ecaa69e5989d9e57209571edc0b2fa7f57b9b79a64ee6e99ce1371395fee92fec2796f7b15a77c386ff668ee27f6d38f0baa6c438b561657377bf6acff3c5947befd7bf4c196252f1d6e5c524d0300" - -const signedTextMessageHex = "a3019bc0cbccc8c4b8d8b74ee2108fe16ec6d36a250cbece0c178233d3f352531472538b8b13d35379b97232f352158ca0b4312f57c71c1646462606365626906a062e4e019811591798ff99bf8afee860b0d8a8c2a85c3387e3bcf0bb3b17987f2bbcfab2aa526d930cbfd3d98757184df3995c9f3e7790e36e3e9779f06089d4c64e9e47dd6202cb6e9bc73c5d11bb59fbaf89d22d8dc7cf199ddf17af96e77c5f65f9bbed56f427bd8db7af37f6c9984bf9385efaf5f184f986fb3e6adb0ecfe35bbf92d16a7aa2a344fb0bc52fb7624f0200" - -const signedEncryptedMessageHex = "848c032a67d68660df41c70103ff5789d0de26b6a50c985a02a13131ca829c413a35d0e6fa8d6842599252162808ac7439c72151c8c6183e76923fe3299301414d0c25a2f06a2257db3839e7df0ec964773f6e4c4ac7ff3b48c444237166dd46ba8ff443a5410dc670cb486672fdbe7c9dfafb75b4fea83af3a204fe2a7dfa86bd20122b4f3d2646cbeecb8f7be8d2c03b018bd210b1d3791e1aba74b0f1034e122ab72e760492c192383cf5e20b5628bd043272d63df9b923f147eb6091cd897553204832aba48fec54aa447547bb16305a1024713b90e77fd0065f1918271947549205af3c74891af22ee0b56cd29bfec6d6e351901cd4ab3ece7c486f1e32a792d4e474aed98ee84b3f591c7dff37b64e0ecd68fd036d517e412dcadf85840ce184ad7921ad446c4ee28db80447aea1ca8d4f574db4d4e37688158ddd19e14ee2eab4873d46947d65d14a23e788d912cf9a19624ca7352469b72a83866b7c23cb5ace3deab3c7018061b0ba0f39ed2befe27163e5083cf9b8271e3e3d52cc7ad6e2a3bd81d4c3d7022f8d" - -const signedEncryptedMessage2Hex = "85010e03cf6a7abcd43e36731003fb057f5495b79db367e277cdbe4ab90d924ddee0c0381494112ff8c1238fb0184af35d1731573b01bc4c55ecacd2aafbe2003d36310487d1ecc9ac994f3fada7f9f7f5c3a64248ab7782906c82c6ff1303b69a84d9a9529c31ecafbcdb9ba87e05439897d87e8a2a3dec55e14df19bba7f7bd316291c002ae2efd24f83f9e3441203fc081c0c23dc3092a454ca8a082b27f631abf73aca341686982e8fbda7e0e7d863941d68f3de4a755c2964407f4b5e0477b3196b8c93d551dd23c8beef7d0f03fbb1b6066f78907faf4bf1677d8fcec72651124080e0b7feae6b476e72ab207d38d90b958759fdedfc3c6c35717c9dbfc979b3cfbbff0a76d24a5e57056bb88acbd2a901ef64bc6e4db02adc05b6250ff378de81dca18c1910ab257dff1b9771b85bb9bbe0a69f5989e6d1710a35e6dfcceb7d8fb5ccea8db3932b3d9ff3fe0d327597c68b3622aec8e3716c83a6c93f497543b459b58ba504ed6bcaa747d37d2ca746fe49ae0a6ce4a8b694234e941b5159ff8bd34b9023da2814076163b86f40eed7c9472f81b551452d5ab87004a373c0172ec87ea6ce42ccfa7dbdad66b745496c4873d8019e8c28d6b3" - -const symmetricallyEncryptedCompressedHex = "8c0d04030302eb4a03808145d0d260c92f714339e13de5a79881216431925bf67ee2898ea61815f07894cd0703c50d0a76ef64d482196f47a8bc729af9b80bb6" - -const dsaTestKeyHex = "9901a2044d6c49de110400cb5ce438cf9250907ac2ba5bf6547931270b89f7c4b53d9d09f4d0213a5ef2ec1f26806d3d259960f872a4a102ef1581ea3f6d6882d15134f21ef6a84de933cc34c47cc9106efe3bd84c6aec12e78523661e29bc1a61f0aab17fa58a627fd5fd33f5149153fbe8cd70edf3d963bc287ef875270ff14b5bfdd1bca4483793923b00a0fe46d76cb6e4cbdc568435cd5480af3266d610d303fe33ae8273f30a96d4d34f42fa28ce1112d425b2e3bf7ea553d526e2db6b9255e9dc7419045ce817214d1a0056dbc8d5289956a4b1b69f20f1105124096e6a438f41f2e2495923b0f34b70642607d45559595c7fe94d7fa85fc41bf7d68c1fd509ebeaa5f315f6059a446b9369c277597e4f474a9591535354c7e7f4fd98a08aa60400b130c24ff20bdfbf683313f5daebf1c9b34b3bdadfc77f2ddd72ee1fb17e56c473664bc21d66467655dd74b9005e3a2bacce446f1920cd7017231ae447b67036c9b431b8179deacd5120262d894c26bc015bffe3d827ba7087ad9b700d2ca1f6d16cc1786581e5dd065f293c31209300f9b0afcc3f7c08dd26d0a22d87580b4db41054657374204b65792033202844534129886204131102002205024d6c49de021b03060b090807030206150802090a0b0416020301021e01021780000a0910338934250ccc03607e0400a0bdb9193e8a6b96fc2dfc108ae848914b504481f100a09c4dc148cb693293a67af24dd40d2b13a9e36794" - -const dsaTestKeyPrivateHex = "9501bb044d6c49de110400cb5ce438cf9250907ac2ba5bf6547931270b89f7c4b53d9d09f4d0213a5ef2ec1f26806d3d259960f872a4a102ef1581ea3f6d6882d15134f21ef6a84de933cc34c47cc9106efe3bd84c6aec12e78523661e29bc1a61f0aab17fa58a627fd5fd33f5149153fbe8cd70edf3d963bc287ef875270ff14b5bfdd1bca4483793923b00a0fe46d76cb6e4cbdc568435cd5480af3266d610d303fe33ae8273f30a96d4d34f42fa28ce1112d425b2e3bf7ea553d526e2db6b9255e9dc7419045ce817214d1a0056dbc8d5289956a4b1b69f20f1105124096e6a438f41f2e2495923b0f34b70642607d45559595c7fe94d7fa85fc41bf7d68c1fd509ebeaa5f315f6059a446b9369c277597e4f474a9591535354c7e7f4fd98a08aa60400b130c24ff20bdfbf683313f5daebf1c9b34b3bdadfc77f2ddd72ee1fb17e56c473664bc21d66467655dd74b9005e3a2bacce446f1920cd7017231ae447b67036c9b431b8179deacd5120262d894c26bc015bffe3d827ba7087ad9b700d2ca1f6d16cc1786581e5dd065f293c31209300f9b0afcc3f7c08dd26d0a22d87580b4d00009f592e0619d823953577d4503061706843317e4fee083db41054657374204b65792033202844534129886204131102002205024d6c49de021b03060b090807030206150802090a0b0416020301021e01021780000a0910338934250ccc03607e0400a0bdb9193e8a6b96fc2dfc108ae848914b504481f100a09c4dc148cb693293a67af24dd40d2b13a9e36794" - -const p256TestKeyHex = "98520456e5b83813082a8648ce3d030107020304a2072cd6d21321266c758cc5b83fab0510f751cb8d91897cddb7047d8d6f185546e2107111b0a95cb8ef063c33245502af7a65f004d5919d93ee74eb71a66253b424502d3235362054657374204b6579203c696e76616c6964406578616d706c652e636f6d3e8879041313080021050256e5b838021b03050b09080702061508090a0b020416020301021e01021780000a0910d44a2c495918513e54e50100dfa64f97d9b47766fc1943c6314ba3f2b2a103d71ad286dc5b1efb96a345b0c80100dbc8150b54241f559da6ef4baacea6d31902b4f4b1bdc09b34bf0502334b7754b8560456e5b83812082a8648ce3d030107020304bfe3cea9cee13486f8d518aa487fecab451f25467d2bf08e58f63e5fa525d5482133e6a79299c274b068ef0be448152ad65cf11cf764348588ca4f6a0bcf22b6030108078861041813080009050256e5b838021b0c000a0910d44a2c495918513e4a4800ff49d589fa64024ad30be363a032e3a0e0e6f5db56ba4c73db850518bf0121b8f20100fd78e065f4c70ea5be9df319ea67e493b936fc78da834a71828043d3154af56e" - -const p256TestKeyPrivateHex = "94a50456e5b83813082a8648ce3d030107020304a2072cd6d21321266c758cc5b83fab0510f751cb8d91897cddb7047d8d6f185546e2107111b0a95cb8ef063c33245502af7a65f004d5919d93ee74eb71a66253fe070302f0c2bfb0b6c30f87ee1599472b8636477eab23ced13b271886a4b50ed34c9d8436af5af5b8f88921f0efba6ef8c37c459bbb88bc1c6a13bbd25c4ce9b1e97679569ee77645d469bf4b43de637f5561b424502d3235362054657374204b6579203c696e76616c6964406578616d706c652e636f6d3e8879041313080021050256e5b838021b03050b09080702061508090a0b020416020301021e01021780000a0910d44a2c495918513e54e50100dfa64f97d9b47766fc1943c6314ba3f2b2a103d71ad286dc5b1efb96a345b0c80100dbc8150b54241f559da6ef4baacea6d31902b4f4b1bdc09b34bf0502334b77549ca90456e5b83812082a8648ce3d030107020304bfe3cea9cee13486f8d518aa487fecab451f25467d2bf08e58f63e5fa525d5482133e6a79299c274b068ef0be448152ad65cf11cf764348588ca4f6a0bcf22b603010807fe0703027510012471a603cfee2968dce19f732721ddf03e966fd133b4e3c7a685b788705cbc46fb026dc94724b830c9edbaecd2fb2c662f23169516cacd1fe423f0475c364ecc10abcabcfd4bbbda1a36a1bd8861041813080009050256e5b838021b0c000a0910d44a2c495918513e4a4800ff49d589fa64024ad30be363a032e3a0e0e6f5db56ba4c73db850518bf0121b8f20100fd78e065f4c70ea5be9df319ea67e493b936fc78da834a71828043d3154af56e" - -const armoredPrivateKeyBlock = `-----BEGIN PGP PRIVATE KEY BLOCK----- -Version: GnuPG v1.4.10 (GNU/Linux) - -lQHYBE2rFNoBBADFwqWQIW/DSqcB4yCQqnAFTJ27qS5AnB46ccAdw3u4Greeu3Bp -idpoHdjULy7zSKlwR1EA873dO/k/e11Ml3dlAFUinWeejWaK2ugFP6JjiieSsrKn -vWNicdCS4HTWn0X4sjl0ZiAygw6GNhqEQ3cpLeL0g8E9hnYzJKQ0LWJa0QARAQAB -AAP/TB81EIo2VYNmTq0pK1ZXwUpxCrvAAIG3hwKjEzHcbQznsjNvPUihZ+NZQ6+X -0HCfPAdPkGDCLCb6NavcSW+iNnLTrdDnSI6+3BbIONqWWdRDYJhqZCkqmG6zqSfL -IdkJgCw94taUg5BWP/AAeQrhzjChvpMQTVKQL5mnuZbUCeMCAN5qrYMP2S9iKdnk -VANIFj7656ARKt/nf4CBzxcpHTyB8+d2CtPDKCmlJP6vL8t58Jmih+kHJMvC0dzn -gr5f5+sCAOOe5gt9e0am7AvQWhdbHVfJU0TQJx+m2OiCJAqGTB1nvtBLHdJnfdC9 -TnXXQ6ZXibqLyBies/xeY2sCKL5qtTMCAKnX9+9d/5yQxRyrQUHt1NYhaXZnJbHx -q4ytu0eWz+5i68IYUSK69jJ1NWPM0T6SkqpB3KCAIv68VFm9PxqG1KmhSrQIVGVz -dCBLZXmIuAQTAQIAIgUCTasU2gIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AA -CgkQO9o98PRieSoLhgQAkLEZex02Qt7vGhZzMwuN0R22w3VwyYyjBx+fM3JFETy1 -ut4xcLJoJfIaF5ZS38UplgakHG0FQ+b49i8dMij0aZmDqGxrew1m4kBfjXw9B/v+ -eIqpODryb6cOSwyQFH0lQkXC040pjq9YqDsO5w0WYNXYKDnzRV0p4H1pweo2VDid -AdgETasU2gEEAN46UPeWRqKHvA99arOxee38fBt2CI08iiWyI8T3J6ivtFGixSqV -bRcPxYO/qLpVe5l84Nb3X71GfVXlc9hyv7CD6tcowL59hg1E/DC5ydI8K8iEpUmK -/UnHdIY5h8/kqgGxkY/T/hgp5fRQgW1ZoZxLajVlMRZ8W4tFtT0DeA+JABEBAAEA -A/0bE1jaaZKj6ndqcw86jd+QtD1SF+Cf21CWRNeLKnUds4FRRvclzTyUMuWPkUeX -TaNNsUOFqBsf6QQ2oHUBBK4VCHffHCW4ZEX2cd6umz7mpHW6XzN4DECEzOVksXtc -lUC1j4UB91DC/RNQqwX1IV2QLSwssVotPMPqhOi0ZLNY7wIA3n7DWKInxYZZ4K+6 -rQ+POsz6brEoRHwr8x6XlHenq1Oki855pSa1yXIARoTrSJkBtn5oI+f8AzrnN0BN -oyeQAwIA/7E++3HDi5aweWrViiul9cd3rcsS0dEnksPhvS0ozCJiHsq/6GFmy7J8 -QSHZPteedBnZyNp5jR+H7cIfVN3KgwH/Skq4PsuPhDq5TKK6i8Pc1WW8MA6DXTdU -nLkX7RGmMwjC0DBf7KWAlPjFaONAX3a8ndnz//fy1q7u2l9AZwrj1qa1iJ8EGAEC -AAkFAk2rFNoCGwwACgkQO9o98PRieSo2/QP/WTzr4ioINVsvN1akKuekmEMI3LAp -BfHwatufxxP1U+3Si/6YIk7kuPB9Hs+pRqCXzbvPRrI8NHZBmc8qIGthishdCYad -AHcVnXjtxrULkQFGbGvhKURLvS9WnzD/m1K2zzwxzkPTzT9/Yf06O6Mal5AdugPL -VrM0m72/jnpKo04= -=zNCn ------END PGP PRIVATE KEY BLOCK-----` - -const e2ePublicKey = `-----BEGIN PGP PUBLIC KEY BLOCK----- -Charset: UTF-8 - -xv8AAABSBAAAAAATCCqGSM49AwEHAgME1LRoXSpOxtHXDUdmuvzchyg6005qIBJ4 -sfaSxX7QgH9RV2ONUhC+WiayCNADq+UMzuR/vunSr4aQffXvuGnR383/AAAAFDxk -Z2lsQHlhaG9vLWluYy5jb20+wv8AAACGBBATCAA4/wAAAAWCVGvAG/8AAAACiwn/ -AAAACZC2VkQCOjdvYf8AAAAFlQgJCgv/AAAAA5YBAv8AAAACngEAAE1BAP0X8veD -24IjmI5/C6ZAfVNXxgZZFhTAACFX75jUA3oD6AEAzoSwKf1aqH6oq62qhCN/pekX -+WAsVMBhNwzLpqtCRjLO/wAAAFYEAAAAABIIKoZIzj0DAQcCAwT50ain7vXiIRv8 -B1DO3x3cE/aattZ5sHNixJzRCXi2vQIA5QmOxZ6b5jjUekNbdHG3SZi1a2Ak5mfX -fRxC/5VGAwEIB8L/AAAAZQQYEwgAGP8AAAAFglRrwBz/AAAACZC2VkQCOjdvYQAA -FJAA9isX3xtGyMLYwp2F3nXm7QEdY5bq5VUcD/RJlj792VwA/1wH0pCzVLl4Q9F9 -ex7En5r7rHR5xwX82Msc+Rq9dSyO -=7MrZ ------END PGP PUBLIC KEY BLOCK-----` - -const dsaKeyWithSHA512 = `9901a2044f04b07f110400db244efecc7316553ee08d179972aab87bb1214de7692593fcf5b6feb1c80fba268722dd464748539b85b81d574cd2d7ad0ca2444de4d849b8756bad7768c486c83a824f9bba4af773d11742bdfb4ac3b89ef8cc9452d4aad31a37e4b630d33927bff68e879284a1672659b8b298222fc68f370f3e24dccacc4a862442b9438b00a0ea444a24088dc23e26df7daf8f43cba3bffc4fe703fe3d6cd7fdca199d54ed8ae501c30e3ec7871ea9cdd4cf63cfe6fc82281d70a5b8bb493f922cd99fba5f088935596af087c8d818d5ec4d0b9afa7f070b3d7c1dd32a84fca08d8280b4890c8da1dde334de8e3cad8450eed2a4a4fcc2db7b8e5528b869a74a7f0189e11ef097ef1253582348de072bb07a9fa8ab838e993cef0ee203ff49298723e2d1f549b00559f886cd417a41692ce58d0ac1307dc71d85a8af21b0cf6eaa14baf2922d3a70389bedf17cc514ba0febbd107675a372fe84b90162a9e88b14d4b1c6be855b96b33fb198c46f058568817780435b6936167ebb3724b680f32bf27382ada2e37a879b3d9de2abe0c3f399350afd1ad438883f4791e2e3b4184453412068617368207472756e636174696f6e207465737488620413110a002205024f04b07f021b03060b090807030206150802090a0b0416020301021e01021780000a0910ef20e0cefca131581318009e2bf3bf047a44d75a9bacd00161ee04d435522397009a03a60d51bd8a568c6c021c8d7cf1be8d990d6417b0020003` - -const unknownHashFunctionHex = `8a00000040040001990006050253863c24000a09103b4fe6acc0b21f32ffff01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101` - -const missingHashFunctionHex = `8a00000040040001030006050253863c24000a09103b4fe6acc0b21f32ffff0101010101010101010101010101010101010101010101010101010101010101010101010101` - -const campbellQuine = `a0b001000300fcffa0b001000d00f2ff000300fcffa0b001000d00f2ff8270a01c00000500faff8270a01c00000500faff000500faff001400ebff8270a01c00000500faff000500faff001400ebff428821c400001400ebff428821c400001400ebff428821c400001400ebff428821c400001400ebff428821c400000000ffff000000ffff000b00f4ff428821c400000000ffff000000ffff000b00f4ff0233214c40000100feff000233214c40000100feff0000` - -const keyV4forVerifyingSignedMessageV3 = `-----BEGIN PGP PUBLIC KEY BLOCK----- -Comment: GPGTools - https://gpgtools.org - -mI0EVfxoFQEEAMBIqmbDfYygcvP6Phr1wr1XI41IF7Qixqybs/foBF8qqblD9gIY -BKpXjnBOtbkcVOJ0nljd3/sQIfH4E0vQwK5/4YRQSI59eKOqd6Fx+fWQOLG+uu6z -tewpeCj9LLHvibx/Sc7VWRnrznia6ftrXxJ/wHMezSab3tnGC0YPVdGNABEBAAG0 -JEdvY3J5cHRvIFRlc3QgS2V5IDx0aGVtYXhAZ21haWwuY29tPoi5BBMBCgAjBQJV -/GgVAhsDBwsJCAcDAgEGFQgCCQoLBBYCAwECHgECF4AACgkQeXnQmhdGW9PFVAP+ -K7TU0qX5ArvIONIxh/WAweyOk884c5cE8f+3NOPOOCRGyVy0FId5A7MmD5GOQh4H -JseOZVEVCqlmngEvtHZb3U1VYtVGE5WZ+6rQhGsMcWP5qaT4soYwMBlSYxgYwQcx -YhN9qOr292f9j2Y//TTIJmZT4Oa+lMxhWdqTfX+qMgG4jQRV/GgVAQQArhFSiij1 -b+hT3dnapbEU+23Z1yTu1DfF6zsxQ4XQWEV3eR8v+8mEDDNcz8oyyF56k6UQ3rXi -UMTIwRDg4V6SbZmaFbZYCOwp/EmXJ3rfhm7z7yzXj2OFN22luuqbyVhuL7LRdB0M -pxgmjXb4tTvfgKd26x34S+QqUJ7W6uprY4sAEQEAAYifBBgBCgAJBQJV/GgVAhsM -AAoJEHl50JoXRlvT7y8D/02ckx4OMkKBZo7viyrBw0MLG92i+DC2bs35PooHR6zz -786mitjOp5z2QWNLBvxC70S0qVfCIz8jKupO1J6rq6Z8CcbLF3qjm6h1omUBf8Nd -EfXKD2/2HV6zMKVknnKzIEzauh+eCKS2CeJUSSSryap/QLVAjRnckaES/OsEWhNB -=RZia ------END PGP PUBLIC KEY BLOCK----- -` - -const signedMessageV3 = `-----BEGIN PGP MESSAGE----- -Comment: GPGTools - https://gpgtools.org - -owGbwMvMwMVYWXlhlrhb9GXG03JJDKF/MtxDMjKLFYAoUaEktbhEITe1uDgxPVWP -q5NhKjMrWAVcC9evD8z/bF/uWNjqtk/X3y5/38XGRQHm/57rrDRYuGnTw597Xqka -uM3137/hH3Os+Jf2dc0fXOITKwJvXJvecPVs0ta+Vg7ZO1MLn8w58Xx+6L58mbka -DGHyU9yTueZE8D+QF/Tz28Y78dqtF56R1VPn9Xw4uJqrWYdd7b3vIZ1V6R4Nh05d -iT57d/OhWwA= -=hG7R ------END PGP MESSAGE----- -` diff --git a/vendor/golang.org/x/crypto/openpgp/s2k/s2k.go b/vendor/golang.org/x/crypto/openpgp/s2k/s2k.go deleted file mode 100644 index 4b9a44ca2..000000000 --- a/vendor/golang.org/x/crypto/openpgp/s2k/s2k.go +++ /dev/null @@ -1,273 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package s2k implements the various OpenPGP string-to-key transforms as -// specified in RFC 4800 section 3.7.1. -package s2k // import "golang.org/x/crypto/openpgp/s2k" - -import ( - "crypto" - "hash" - "io" - "strconv" - - "golang.org/x/crypto/openpgp/errors" -) - -// Config collects configuration parameters for s2k key-stretching -// transformatioms. A nil *Config is valid and results in all default -// values. Currently, Config is used only by the Serialize function in -// this package. -type Config struct { - // Hash is the default hash function to be used. If - // nil, SHA1 is used. - Hash crypto.Hash - // S2KCount is only used for symmetric encryption. It - // determines the strength of the passphrase stretching when - // the said passphrase is hashed to produce a key. S2KCount - // should be between 1024 and 65011712, inclusive. If Config - // is nil or S2KCount is 0, the value 65536 used. Not all - // values in the above range can be represented. S2KCount will - // be rounded up to the next representable value if it cannot - // be encoded exactly. When set, it is strongly encrouraged to - // use a value that is at least 65536. See RFC 4880 Section - // 3.7.1.3. - S2KCount int -} - -func (c *Config) hash() crypto.Hash { - if c == nil || uint(c.Hash) == 0 { - // SHA1 is the historical default in this package. - return crypto.SHA1 - } - - return c.Hash -} - -func (c *Config) encodedCount() uint8 { - if c == nil || c.S2KCount == 0 { - return 96 // The common case. Correspoding to 65536 - } - - i := c.S2KCount - switch { - // Behave like GPG. Should we make 65536 the lowest value used? - case i < 1024: - i = 1024 - case i > 65011712: - i = 65011712 - } - - return encodeCount(i) -} - -// encodeCount converts an iterative "count" in the range 1024 to -// 65011712, inclusive, to an encoded count. The return value is the -// octet that is actually stored in the GPG file. encodeCount panics -// if i is not in the above range (encodedCount above takes care to -// pass i in the correct range). See RFC 4880 Section 3.7.7.1. -func encodeCount(i int) uint8 { - if i < 1024 || i > 65011712 { - panic("count arg i outside the required range") - } - - for encoded := 0; encoded < 256; encoded++ { - count := decodeCount(uint8(encoded)) - if count >= i { - return uint8(encoded) - } - } - - return 255 -} - -// decodeCount returns the s2k mode 3 iterative "count" corresponding to -// the encoded octet c. -func decodeCount(c uint8) int { - return (16 + int(c&15)) << (uint32(c>>4) + 6) -} - -// Simple writes to out the result of computing the Simple S2K function (RFC -// 4880, section 3.7.1.1) using the given hash and input passphrase. -func Simple(out []byte, h hash.Hash, in []byte) { - Salted(out, h, in, nil) -} - -var zero [1]byte - -// Salted writes to out the result of computing the Salted S2K function (RFC -// 4880, section 3.7.1.2) using the given hash, input passphrase and salt. -func Salted(out []byte, h hash.Hash, in []byte, salt []byte) { - done := 0 - var digest []byte - - for i := 0; done < len(out); i++ { - h.Reset() - for j := 0; j < i; j++ { - h.Write(zero[:]) - } - h.Write(salt) - h.Write(in) - digest = h.Sum(digest[:0]) - n := copy(out[done:], digest) - done += n - } -} - -// Iterated writes to out the result of computing the Iterated and Salted S2K -// function (RFC 4880, section 3.7.1.3) using the given hash, input passphrase, -// salt and iteration count. -func Iterated(out []byte, h hash.Hash, in []byte, salt []byte, count int) { - combined := make([]byte, len(in)+len(salt)) - copy(combined, salt) - copy(combined[len(salt):], in) - - if count < len(combined) { - count = len(combined) - } - - done := 0 - var digest []byte - for i := 0; done < len(out); i++ { - h.Reset() - for j := 0; j < i; j++ { - h.Write(zero[:]) - } - written := 0 - for written < count { - if written+len(combined) > count { - todo := count - written - h.Write(combined[:todo]) - written = count - } else { - h.Write(combined) - written += len(combined) - } - } - digest = h.Sum(digest[:0]) - n := copy(out[done:], digest) - done += n - } -} - -// Parse reads a binary specification for a string-to-key transformation from r -// and returns a function which performs that transform. -func Parse(r io.Reader) (f func(out, in []byte), err error) { - var buf [9]byte - - _, err = io.ReadFull(r, buf[:2]) - if err != nil { - return - } - - hash, ok := HashIdToHash(buf[1]) - if !ok { - return nil, errors.UnsupportedError("hash for S2K function: " + strconv.Itoa(int(buf[1]))) - } - if !hash.Available() { - return nil, errors.UnsupportedError("hash not available: " + strconv.Itoa(int(hash))) - } - h := hash.New() - - switch buf[0] { - case 0: - f := func(out, in []byte) { - Simple(out, h, in) - } - return f, nil - case 1: - _, err = io.ReadFull(r, buf[:8]) - if err != nil { - return - } - f := func(out, in []byte) { - Salted(out, h, in, buf[:8]) - } - return f, nil - case 3: - _, err = io.ReadFull(r, buf[:9]) - if err != nil { - return - } - count := decodeCount(buf[8]) - f := func(out, in []byte) { - Iterated(out, h, in, buf[:8], count) - } - return f, nil - } - - return nil, errors.UnsupportedError("S2K function") -} - -// Serialize salts and stretches the given passphrase and writes the -// resulting key into key. It also serializes an S2K descriptor to -// w. The key stretching can be configured with c, which may be -// nil. In that case, sensible defaults will be used. -func Serialize(w io.Writer, key []byte, rand io.Reader, passphrase []byte, c *Config) error { - var buf [11]byte - buf[0] = 3 /* iterated and salted */ - buf[1], _ = HashToHashId(c.hash()) - salt := buf[2:10] - if _, err := io.ReadFull(rand, salt); err != nil { - return err - } - encodedCount := c.encodedCount() - count := decodeCount(encodedCount) - buf[10] = encodedCount - if _, err := w.Write(buf[:]); err != nil { - return err - } - - Iterated(key, c.hash().New(), passphrase, salt, count) - return nil -} - -// hashToHashIdMapping contains pairs relating OpenPGP's hash identifier with -// Go's crypto.Hash type. See RFC 4880, section 9.4. -var hashToHashIdMapping = []struct { - id byte - hash crypto.Hash - name string -}{ - {1, crypto.MD5, "MD5"}, - {2, crypto.SHA1, "SHA1"}, - {3, crypto.RIPEMD160, "RIPEMD160"}, - {8, crypto.SHA256, "SHA256"}, - {9, crypto.SHA384, "SHA384"}, - {10, crypto.SHA512, "SHA512"}, - {11, crypto.SHA224, "SHA224"}, -} - -// HashIdToHash returns a crypto.Hash which corresponds to the given OpenPGP -// hash id. -func HashIdToHash(id byte) (h crypto.Hash, ok bool) { - for _, m := range hashToHashIdMapping { - if m.id == id { - return m.hash, true - } - } - return 0, false -} - -// HashIdToString returns the name of the hash function corresponding to the -// given OpenPGP hash id. -func HashIdToString(id byte) (name string, ok bool) { - for _, m := range hashToHashIdMapping { - if m.id == id { - return m.name, true - } - } - - return "", false -} - -// HashIdToHash returns an OpenPGP hash id which corresponds the given Hash. -func HashToHashId(h crypto.Hash) (id byte, ok bool) { - for _, m := range hashToHashIdMapping { - if m.hash == h { - return m.id, true - } - } - return 0, false -} diff --git a/vendor/golang.org/x/crypto/openpgp/s2k/s2k_test.go b/vendor/golang.org/x/crypto/openpgp/s2k/s2k_test.go deleted file mode 100644 index 183d26056..000000000 --- a/vendor/golang.org/x/crypto/openpgp/s2k/s2k_test.go +++ /dev/null @@ -1,137 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package s2k - -import ( - "bytes" - "crypto" - _ "crypto/md5" - "crypto/rand" - "crypto/sha1" - _ "crypto/sha256" - _ "crypto/sha512" - "encoding/hex" - "testing" - - _ "golang.org/x/crypto/ripemd160" -) - -var saltedTests = []struct { - in, out string -}{ - {"hello", "10295ac1"}, - {"world", "ac587a5e"}, - {"foo", "4dda8077"}, - {"bar", "bd8aac6b9ea9cae04eae6a91c6133b58b5d9a61c14f355516ed9370456"}, - {"x", "f1d3f289"}, - {"xxxxxxxxxxxxxxxxxxxxxxx", "e00d7b45"}, -} - -func TestSalted(t *testing.T) { - h := sha1.New() - salt := [4]byte{1, 2, 3, 4} - - for i, test := range saltedTests { - expected, _ := hex.DecodeString(test.out) - out := make([]byte, len(expected)) - Salted(out, h, []byte(test.in), salt[:]) - if !bytes.Equal(expected, out) { - t.Errorf("#%d, got: %x want: %x", i, out, expected) - } - } -} - -var iteratedTests = []struct { - in, out string -}{ - {"hello", "83126105"}, - {"world", "6fa317f9"}, - {"foo", "8fbc35b9"}, - {"bar", "2af5a99b54f093789fd657f19bd245af7604d0f6ae06f66602a46a08ae"}, - {"x", "5a684dfe"}, - {"xxxxxxxxxxxxxxxxxxxxxxx", "18955174"}, -} - -func TestIterated(t *testing.T) { - h := sha1.New() - salt := [4]byte{4, 3, 2, 1} - - for i, test := range iteratedTests { - expected, _ := hex.DecodeString(test.out) - out := make([]byte, len(expected)) - Iterated(out, h, []byte(test.in), salt[:], 31) - if !bytes.Equal(expected, out) { - t.Errorf("#%d, got: %x want: %x", i, out, expected) - } - } -} - -var parseTests = []struct { - spec, in, out string -}{ - /* Simple with SHA1 */ - {"0002", "hello", "aaf4c61d"}, - /* Salted with SHA1 */ - {"01020102030405060708", "hello", "f4f7d67e"}, - /* Iterated with SHA1 */ - {"03020102030405060708f1", "hello", "f2a57b7c"}, -} - -func TestParse(t *testing.T) { - for i, test := range parseTests { - spec, _ := hex.DecodeString(test.spec) - buf := bytes.NewBuffer(spec) - f, err := Parse(buf) - if err != nil { - t.Errorf("%d: Parse returned error: %s", i, err) - continue - } - - expected, _ := hex.DecodeString(test.out) - out := make([]byte, len(expected)) - f(out, []byte(test.in)) - if !bytes.Equal(out, expected) { - t.Errorf("%d: output got: %x want: %x", i, out, expected) - } - if testing.Short() { - break - } - } -} - -func TestSerialize(t *testing.T) { - hashes := []crypto.Hash{crypto.MD5, crypto.SHA1, crypto.RIPEMD160, - crypto.SHA256, crypto.SHA384, crypto.SHA512, crypto.SHA224} - testCounts := []int{-1, 0, 1024, 65536, 4063232, 65011712} - for _, h := range hashes { - for _, c := range testCounts { - testSerializeConfig(t, &Config{Hash: h, S2KCount: c}) - } - } -} - -func testSerializeConfig(t *testing.T, c *Config) { - t.Logf("Running testSerializeConfig() with config: %+v", c) - - buf := bytes.NewBuffer(nil) - key := make([]byte, 16) - passphrase := []byte("testing") - err := Serialize(buf, key, rand.Reader, passphrase, c) - if err != nil { - t.Errorf("failed to serialize: %s", err) - return - } - - f, err := Parse(buf) - if err != nil { - t.Errorf("failed to reparse: %s", err) - return - } - key2 := make([]byte, len(key)) - f(key2, passphrase) - if !bytes.Equal(key2, key) { - t.Errorf("keys don't match: %x (serialied) vs %x (parsed)", key, key2) - } -} diff --git a/vendor/golang.org/x/crypto/openpgp/write.go b/vendor/golang.org/x/crypto/openpgp/write.go deleted file mode 100644 index 65a304cc8..000000000 --- a/vendor/golang.org/x/crypto/openpgp/write.go +++ /dev/null @@ -1,378 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package openpgp - -import ( - "crypto" - "hash" - "io" - "strconv" - "time" - - "golang.org/x/crypto/openpgp/armor" - "golang.org/x/crypto/openpgp/errors" - "golang.org/x/crypto/openpgp/packet" - "golang.org/x/crypto/openpgp/s2k" -) - -// DetachSign signs message with the private key from signer (which must -// already have been decrypted) and writes the signature to w. -// If config is nil, sensible defaults will be used. -func DetachSign(w io.Writer, signer *Entity, message io.Reader, config *packet.Config) error { - return detachSign(w, signer, message, packet.SigTypeBinary, config) -} - -// ArmoredDetachSign signs message with the private key from signer (which -// must already have been decrypted) and writes an armored signature to w. -// If config is nil, sensible defaults will be used. -func ArmoredDetachSign(w io.Writer, signer *Entity, message io.Reader, config *packet.Config) (err error) { - return armoredDetachSign(w, signer, message, packet.SigTypeBinary, config) -} - -// DetachSignText signs message (after canonicalising the line endings) with -// the private key from signer (which must already have been decrypted) and -// writes the signature to w. -// If config is nil, sensible defaults will be used. -func DetachSignText(w io.Writer, signer *Entity, message io.Reader, config *packet.Config) error { - return detachSign(w, signer, message, packet.SigTypeText, config) -} - -// ArmoredDetachSignText signs message (after canonicalising the line endings) -// with the private key from signer (which must already have been decrypted) -// and writes an armored signature to w. -// If config is nil, sensible defaults will be used. -func ArmoredDetachSignText(w io.Writer, signer *Entity, message io.Reader, config *packet.Config) error { - return armoredDetachSign(w, signer, message, packet.SigTypeText, config) -} - -func armoredDetachSign(w io.Writer, signer *Entity, message io.Reader, sigType packet.SignatureType, config *packet.Config) (err error) { - out, err := armor.Encode(w, SignatureType, nil) - if err != nil { - return - } - err = detachSign(out, signer, message, sigType, config) - if err != nil { - return - } - return out.Close() -} - -func detachSign(w io.Writer, signer *Entity, message io.Reader, sigType packet.SignatureType, config *packet.Config) (err error) { - if signer.PrivateKey == nil { - return errors.InvalidArgumentError("signing key doesn't have a private key") - } - if signer.PrivateKey.Encrypted { - return errors.InvalidArgumentError("signing key is encrypted") - } - - sig := new(packet.Signature) - sig.SigType = sigType - sig.PubKeyAlgo = signer.PrivateKey.PubKeyAlgo - sig.Hash = config.Hash() - sig.CreationTime = config.Now() - sig.IssuerKeyId = &signer.PrivateKey.KeyId - - h, wrappedHash, err := hashForSignature(sig.Hash, sig.SigType) - if err != nil { - return - } - io.Copy(wrappedHash, message) - - err = sig.Sign(h, signer.PrivateKey, config) - if err != nil { - return - } - - return sig.Serialize(w) -} - -// FileHints contains metadata about encrypted files. This metadata is, itself, -// encrypted. -type FileHints struct { - // IsBinary can be set to hint that the contents are binary data. - IsBinary bool - // FileName hints at the name of the file that should be written. It's - // truncated to 255 bytes if longer. It may be empty to suggest that the - // file should not be written to disk. It may be equal to "_CONSOLE" to - // suggest the data should not be written to disk. - FileName string - // ModTime contains the modification time of the file, or the zero time if not applicable. - ModTime time.Time -} - -// SymmetricallyEncrypt acts like gpg -c: it encrypts a file with a passphrase. -// The resulting WriteCloser must be closed after the contents of the file have -// been written. -// If config is nil, sensible defaults will be used. -func SymmetricallyEncrypt(ciphertext io.Writer, passphrase []byte, hints *FileHints, config *packet.Config) (plaintext io.WriteCloser, err error) { - if hints == nil { - hints = &FileHints{} - } - - key, err := packet.SerializeSymmetricKeyEncrypted(ciphertext, passphrase, config) - if err != nil { - return - } - w, err := packet.SerializeSymmetricallyEncrypted(ciphertext, config.Cipher(), key, config) - if err != nil { - return - } - - literaldata := w - if algo := config.Compression(); algo != packet.CompressionNone { - var compConfig *packet.CompressionConfig - if config != nil { - compConfig = config.CompressionConfig - } - literaldata, err = packet.SerializeCompressed(w, algo, compConfig) - if err != nil { - return - } - } - - var epochSeconds uint32 - if !hints.ModTime.IsZero() { - epochSeconds = uint32(hints.ModTime.Unix()) - } - return packet.SerializeLiteral(literaldata, hints.IsBinary, hints.FileName, epochSeconds) -} - -// intersectPreferences mutates and returns a prefix of a that contains only -// the values in the intersection of a and b. The order of a is preserved. -func intersectPreferences(a []uint8, b []uint8) (intersection []uint8) { - var j int - for _, v := range a { - for _, v2 := range b { - if v == v2 { - a[j] = v - j++ - break - } - } - } - - return a[:j] -} - -func hashToHashId(h crypto.Hash) uint8 { - v, ok := s2k.HashToHashId(h) - if !ok { - panic("tried to convert unknown hash") - } - return v -} - -// Encrypt encrypts a message to a number of recipients and, optionally, signs -// it. hints contains optional information, that is also encrypted, that aids -// the recipients in processing the message. The resulting WriteCloser must -// be closed after the contents of the file have been written. -// If config is nil, sensible defaults will be used. -func Encrypt(ciphertext io.Writer, to []*Entity, signed *Entity, hints *FileHints, config *packet.Config) (plaintext io.WriteCloser, err error) { - var signer *packet.PrivateKey - if signed != nil { - signKey, ok := signed.signingKey(config.Now()) - if !ok { - return nil, errors.InvalidArgumentError("no valid signing keys") - } - signer = signKey.PrivateKey - if signer == nil { - return nil, errors.InvalidArgumentError("no private key in signing key") - } - if signer.Encrypted { - return nil, errors.InvalidArgumentError("signing key must be decrypted") - } - } - - // These are the possible ciphers that we'll use for the message. - candidateCiphers := []uint8{ - uint8(packet.CipherAES128), - uint8(packet.CipherAES256), - uint8(packet.CipherCAST5), - } - // These are the possible hash functions that we'll use for the signature. - candidateHashes := []uint8{ - hashToHashId(crypto.SHA256), - hashToHashId(crypto.SHA512), - hashToHashId(crypto.SHA1), - hashToHashId(crypto.RIPEMD160), - } - // In the event that a recipient doesn't specify any supported ciphers - // or hash functions, these are the ones that we assume that every - // implementation supports. - defaultCiphers := candidateCiphers[len(candidateCiphers)-1:] - defaultHashes := candidateHashes[len(candidateHashes)-1:] - - encryptKeys := make([]Key, len(to)) - for i := range to { - var ok bool - encryptKeys[i], ok = to[i].encryptionKey(config.Now()) - if !ok { - return nil, errors.InvalidArgumentError("cannot encrypt a message to key id " + strconv.FormatUint(to[i].PrimaryKey.KeyId, 16) + " because it has no encryption keys") - } - - sig := to[i].primaryIdentity().SelfSignature - - preferredSymmetric := sig.PreferredSymmetric - if len(preferredSymmetric) == 0 { - preferredSymmetric = defaultCiphers - } - preferredHashes := sig.PreferredHash - if len(preferredHashes) == 0 { - preferredHashes = defaultHashes - } - candidateCiphers = intersectPreferences(candidateCiphers, preferredSymmetric) - candidateHashes = intersectPreferences(candidateHashes, preferredHashes) - } - - if len(candidateCiphers) == 0 || len(candidateHashes) == 0 { - return nil, errors.InvalidArgumentError("cannot encrypt because recipient set shares no common algorithms") - } - - cipher := packet.CipherFunction(candidateCiphers[0]) - // If the cipher specified by config is a candidate, we'll use that. - configuredCipher := config.Cipher() - for _, c := range candidateCiphers { - cipherFunc := packet.CipherFunction(c) - if cipherFunc == configuredCipher { - cipher = cipherFunc - break - } - } - - var hash crypto.Hash - for _, hashId := range candidateHashes { - if h, ok := s2k.HashIdToHash(hashId); ok && h.Available() { - hash = h - break - } - } - - // If the hash specified by config is a candidate, we'll use that. - if configuredHash := config.Hash(); configuredHash.Available() { - for _, hashId := range candidateHashes { - if h, ok := s2k.HashIdToHash(hashId); ok && h == configuredHash { - hash = h - break - } - } - } - - if hash == 0 { - hashId := candidateHashes[0] - name, ok := s2k.HashIdToString(hashId) - if !ok { - name = "#" + strconv.Itoa(int(hashId)) - } - return nil, errors.InvalidArgumentError("cannot encrypt because no candidate hash functions are compiled in. (Wanted " + name + " in this case.)") - } - - symKey := make([]byte, cipher.KeySize()) - if _, err := io.ReadFull(config.Random(), symKey); err != nil { - return nil, err - } - - for _, key := range encryptKeys { - if err := packet.SerializeEncryptedKey(ciphertext, key.PublicKey, cipher, symKey, config); err != nil { - return nil, err - } - } - - encryptedData, err := packet.SerializeSymmetricallyEncrypted(ciphertext, cipher, symKey, config) - if err != nil { - return - } - - if signer != nil { - ops := &packet.OnePassSignature{ - SigType: packet.SigTypeBinary, - Hash: hash, - PubKeyAlgo: signer.PubKeyAlgo, - KeyId: signer.KeyId, - IsLast: true, - } - if err := ops.Serialize(encryptedData); err != nil { - return nil, err - } - } - - if hints == nil { - hints = &FileHints{} - } - - w := encryptedData - if signer != nil { - // If we need to write a signature packet after the literal - // data then we need to stop literalData from closing - // encryptedData. - w = noOpCloser{encryptedData} - - } - var epochSeconds uint32 - if !hints.ModTime.IsZero() { - epochSeconds = uint32(hints.ModTime.Unix()) - } - literalData, err := packet.SerializeLiteral(w, hints.IsBinary, hints.FileName, epochSeconds) - if err != nil { - return nil, err - } - - if signer != nil { - return signatureWriter{encryptedData, literalData, hash, hash.New(), signer, config}, nil - } - return literalData, nil -} - -// signatureWriter hashes the contents of a message while passing it along to -// literalData. When closed, it closes literalData, writes a signature packet -// to encryptedData and then also closes encryptedData. -type signatureWriter struct { - encryptedData io.WriteCloser - literalData io.WriteCloser - hashType crypto.Hash - h hash.Hash - signer *packet.PrivateKey - config *packet.Config -} - -func (s signatureWriter) Write(data []byte) (int, error) { - s.h.Write(data) - return s.literalData.Write(data) -} - -func (s signatureWriter) Close() error { - sig := &packet.Signature{ - SigType: packet.SigTypeBinary, - PubKeyAlgo: s.signer.PubKeyAlgo, - Hash: s.hashType, - CreationTime: s.config.Now(), - IssuerKeyId: &s.signer.KeyId, - } - - if err := sig.Sign(s.h, s.signer, s.config); err != nil { - return err - } - if err := s.literalData.Close(); err != nil { - return err - } - if err := sig.Serialize(s.encryptedData); err != nil { - return err - } - return s.encryptedData.Close() -} - -// noOpCloser is like an ioutil.NopCloser, but for an io.Writer. -// TODO: we have two of these in OpenPGP packages alone. This probably needs -// to be promoted somewhere more common. -type noOpCloser struct { - w io.Writer -} - -func (c noOpCloser) Write(data []byte) (n int, err error) { - return c.w.Write(data) -} - -func (c noOpCloser) Close() error { - return nil -} diff --git a/vendor/golang.org/x/crypto/openpgp/write_test.go b/vendor/golang.org/x/crypto/openpgp/write_test.go deleted file mode 100644 index f2d50a0cf..000000000 --- a/vendor/golang.org/x/crypto/openpgp/write_test.go +++ /dev/null @@ -1,273 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package openpgp - -import ( - "bytes" - "io" - "io/ioutil" - "testing" - "time" - - "golang.org/x/crypto/openpgp/packet" -) - -func TestSignDetached(t *testing.T) { - kring, _ := ReadKeyRing(readerFromHex(testKeys1And2PrivateHex)) - out := bytes.NewBuffer(nil) - message := bytes.NewBufferString(signedInput) - err := DetachSign(out, kring[0], message, nil) - if err != nil { - t.Error(err) - } - - testDetachedSignature(t, kring, out, signedInput, "check", testKey1KeyId) -} - -func TestSignTextDetached(t *testing.T) { - kring, _ := ReadKeyRing(readerFromHex(testKeys1And2PrivateHex)) - out := bytes.NewBuffer(nil) - message := bytes.NewBufferString(signedInput) - err := DetachSignText(out, kring[0], message, nil) - if err != nil { - t.Error(err) - } - - testDetachedSignature(t, kring, out, signedInput, "check", testKey1KeyId) -} - -func TestSignDetachedDSA(t *testing.T) { - kring, _ := ReadKeyRing(readerFromHex(dsaTestKeyPrivateHex)) - out := bytes.NewBuffer(nil) - message := bytes.NewBufferString(signedInput) - err := DetachSign(out, kring[0], message, nil) - if err != nil { - t.Error(err) - } - - testDetachedSignature(t, kring, out, signedInput, "check", testKey3KeyId) -} - -func TestSignDetachedP256(t *testing.T) { - kring, _ := ReadKeyRing(readerFromHex(p256TestKeyPrivateHex)) - kring[0].PrivateKey.Decrypt([]byte("passphrase")) - - out := bytes.NewBuffer(nil) - message := bytes.NewBufferString(signedInput) - err := DetachSign(out, kring[0], message, nil) - if err != nil { - t.Error(err) - } - - testDetachedSignature(t, kring, out, signedInput, "check", testKeyP256KeyId) -} - -func TestNewEntity(t *testing.T) { - if testing.Short() { - return - } - - // Check bit-length with no config. - e, err := NewEntity("Test User", "test", "test@example.com", nil) - if err != nil { - t.Errorf("failed to create entity: %s", err) - return - } - bl, err := e.PrimaryKey.BitLength() - if err != nil { - t.Errorf("failed to find bit length: %s", err) - } - if int(bl) != defaultRSAKeyBits { - t.Errorf("BitLength %v, expected %v", int(bl), defaultRSAKeyBits) - } - - // Check bit-length with a config. - cfg := &packet.Config{RSABits: 1024} - e, err = NewEntity("Test User", "test", "test@example.com", cfg) - if err != nil { - t.Errorf("failed to create entity: %s", err) - return - } - bl, err = e.PrimaryKey.BitLength() - if err != nil { - t.Errorf("failed to find bit length: %s", err) - } - if int(bl) != cfg.RSABits { - t.Errorf("BitLength %v, expected %v", bl, cfg.RSABits) - } - - w := bytes.NewBuffer(nil) - if err := e.SerializePrivate(w, nil); err != nil { - t.Errorf("failed to serialize entity: %s", err) - return - } - serialized := w.Bytes() - - el, err := ReadKeyRing(w) - if err != nil { - t.Errorf("failed to reparse entity: %s", err) - return - } - - if len(el) != 1 { - t.Errorf("wrong number of entities found, got %d, want 1", len(el)) - } - - w = bytes.NewBuffer(nil) - if err := e.SerializePrivate(w, nil); err != nil { - t.Errorf("failed to serialize entity second time: %s", err) - return - } - - if !bytes.Equal(w.Bytes(), serialized) { - t.Errorf("results differed") - } -} - -func TestSymmetricEncryption(t *testing.T) { - buf := new(bytes.Buffer) - plaintext, err := SymmetricallyEncrypt(buf, []byte("testing"), nil, nil) - if err != nil { - t.Errorf("error writing headers: %s", err) - return - } - message := []byte("hello world\n") - _, err = plaintext.Write(message) - if err != nil { - t.Errorf("error writing to plaintext writer: %s", err) - } - err = plaintext.Close() - if err != nil { - t.Errorf("error closing plaintext writer: %s", err) - } - - md, err := ReadMessage(buf, nil, func(keys []Key, symmetric bool) ([]byte, error) { - return []byte("testing"), nil - }, nil) - if err != nil { - t.Errorf("error rereading message: %s", err) - } - messageBuf := bytes.NewBuffer(nil) - _, err = io.Copy(messageBuf, md.UnverifiedBody) - if err != nil { - t.Errorf("error rereading message: %s", err) - } - if !bytes.Equal(message, messageBuf.Bytes()) { - t.Errorf("recovered message incorrect got '%s', want '%s'", messageBuf.Bytes(), message) - } -} - -var testEncryptionTests = []struct { - keyRingHex string - isSigned bool -}{ - { - testKeys1And2PrivateHex, - false, - }, - { - testKeys1And2PrivateHex, - true, - }, - { - dsaElGamalTestKeysHex, - false, - }, - { - dsaElGamalTestKeysHex, - true, - }, -} - -func TestEncryption(t *testing.T) { - for i, test := range testEncryptionTests { - kring, _ := ReadKeyRing(readerFromHex(test.keyRingHex)) - - passphrase := []byte("passphrase") - for _, entity := range kring { - if entity.PrivateKey != nil && entity.PrivateKey.Encrypted { - err := entity.PrivateKey.Decrypt(passphrase) - if err != nil { - t.Errorf("#%d: failed to decrypt key", i) - } - } - for _, subkey := range entity.Subkeys { - if subkey.PrivateKey != nil && subkey.PrivateKey.Encrypted { - err := subkey.PrivateKey.Decrypt(passphrase) - if err != nil { - t.Errorf("#%d: failed to decrypt subkey", i) - } - } - } - } - - var signed *Entity - if test.isSigned { - signed = kring[0] - } - - buf := new(bytes.Buffer) - w, err := Encrypt(buf, kring[:1], signed, nil /* no hints */, nil) - if err != nil { - t.Errorf("#%d: error in Encrypt: %s", i, err) - continue - } - - const message = "testing" - _, err = w.Write([]byte(message)) - if err != nil { - t.Errorf("#%d: error writing plaintext: %s", i, err) - continue - } - err = w.Close() - if err != nil { - t.Errorf("#%d: error closing WriteCloser: %s", i, err) - continue - } - - md, err := ReadMessage(buf, kring, nil /* no prompt */, nil) - if err != nil { - t.Errorf("#%d: error reading message: %s", i, err) - continue - } - - testTime, _ := time.Parse("2006-01-02", "2013-07-01") - if test.isSigned { - signKey, _ := kring[0].signingKey(testTime) - expectedKeyId := signKey.PublicKey.KeyId - if md.SignedByKeyId != expectedKeyId { - t.Errorf("#%d: message signed by wrong key id, got: %v, want: %v", i, *md.SignedBy, expectedKeyId) - } - if md.SignedBy == nil { - t.Errorf("#%d: failed to find the signing Entity", i) - } - } - - plaintext, err := ioutil.ReadAll(md.UnverifiedBody) - if err != nil { - t.Errorf("#%d: error reading encrypted contents: %s", i, err) - continue - } - - encryptKey, _ := kring[0].encryptionKey(testTime) - expectedKeyId := encryptKey.PublicKey.KeyId - if len(md.EncryptedToKeyIds) != 1 || md.EncryptedToKeyIds[0] != expectedKeyId { - t.Errorf("#%d: expected message to be encrypted to %v, but got %#v", i, expectedKeyId, md.EncryptedToKeyIds) - } - - if string(plaintext) != message { - t.Errorf("#%d: got: %s, want: %s", i, string(plaintext), message) - } - - if test.isSigned { - if md.SignatureError != nil { - t.Errorf("#%d: signature error: %s", i, md.SignatureError) - } - if md.Signature == nil { - t.Error("signature missing") - } - } - } -} diff --git a/vendor/golang.org/x/crypto/otr/libotr_test_helper.c b/vendor/golang.org/x/crypto/otr/libotr_test_helper.c deleted file mode 100644 index b3ca072d4..000000000 --- a/vendor/golang.org/x/crypto/otr/libotr_test_helper.c +++ /dev/null @@ -1,197 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This code can be compiled and used to test the otr package against libotr. -// See otr_test.go. - -// +build ignore - -#include -#include -#include - -#include -#include -#include - -static int g_session_established = 0; - -OtrlPolicy policy(void *opdata, ConnContext *context) { - return OTRL_POLICY_ALWAYS; -} - -int is_logged_in(void *opdata, const char *accountname, const char *protocol, - const char *recipient) { - return 1; -} - -void inject_message(void *opdata, const char *accountname, const char *protocol, - const char *recipient, const char *message) { - printf("%s\n", message); - fflush(stdout); - fprintf(stderr, "libotr helper sent: %s\n", message); -} - -void update_context_list(void *opdata) {} - -void new_fingerprint(void *opdata, OtrlUserState us, const char *accountname, - const char *protocol, const char *username, - unsigned char fingerprint[20]) { - fprintf(stderr, "NEW FINGERPRINT\n"); - g_session_established = 1; -} - -void write_fingerprints(void *opdata) {} - -void gone_secure(void *opdata, ConnContext *context) {} - -void gone_insecure(void *opdata, ConnContext *context) {} - -void still_secure(void *opdata, ConnContext *context, int is_reply) {} - -int max_message_size(void *opdata, ConnContext *context) { return 99999; } - -const char *account_name(void *opdata, const char *account, - const char *protocol) { - return "ACCOUNT"; -} - -void account_name_free(void *opdata, const char *account_name) {} - -const char *error_message(void *opdata, ConnContext *context, - OtrlErrorCode err_code) { - return "ERR"; -} - -void error_message_free(void *opdata, const char *msg) {} - -void resent_msg_prefix_free(void *opdata, const char *prefix) {} - -void handle_smp_event(void *opdata, OtrlSMPEvent smp_event, - ConnContext *context, unsigned short progress_event, - char *question) {} - -void handle_msg_event(void *opdata, OtrlMessageEvent msg_event, - ConnContext *context, const char *message, - gcry_error_t err) { - fprintf(stderr, "msg event: %d %s\n", msg_event, message); -} - -OtrlMessageAppOps uiops = { - policy, - NULL, - is_logged_in, - inject_message, - update_context_list, - new_fingerprint, - write_fingerprints, - gone_secure, - gone_insecure, - still_secure, - max_message_size, - account_name, - account_name_free, - NULL, /* received_symkey */ - error_message, - error_message_free, - NULL, /* resent_msg_prefix */ - resent_msg_prefix_free, - handle_smp_event, - handle_msg_event, - NULL /* create_instag */, - NULL /* convert_msg */, - NULL /* convert_free */, - NULL /* timer_control */, -}; - -static const char kPrivateKeyData[] = - "(privkeys (account (name \"account\") (protocol proto) (private-key (dsa " - "(p " - "#00FC07ABCF0DC916AFF6E9AE47BEF60C7AB9B4D6B2469E436630E36F8A489BE812486A09F" - "30B71224508654940A835301ACC525A4FF133FC152CC53DCC59D65C30A54F1993FE13FE63E" - "5823D4C746DB21B90F9B9C00B49EC7404AB1D929BA7FBA12F2E45C6E0A651689750E8528AB" - "8C031D3561FECEE72EBB4A090D450A9B7A857#) (q " - "#00997BD266EF7B1F60A5C23F3A741F2AEFD07A2081#) (g " - "#535E360E8A95EBA46A4F7DE50AD6E9B2A6DB785A66B64EB9F20338D2A3E8FB0E94725848F" - "1AA6CC567CB83A1CC517EC806F2E92EAE71457E80B2210A189B91250779434B41FC8A8873F" - "6DB94BEA7D177F5D59E7E114EE10A49CFD9CEF88AE43387023B672927BA74B04EB6BBB5E57" - "597766A2F9CE3857D7ACE3E1E3BC1FC6F26#) (y " - "#0AC8670AD767D7A8D9D14CC1AC6744CD7D76F993B77FFD9E39DF01E5A6536EF65E775FCEF" - "2A983E2A19BD6415500F6979715D9FD1257E1FE2B6F5E1E74B333079E7C880D39868462A93" - "454B41877BE62E5EF0A041C2EE9C9E76BD1E12AE25D9628DECB097025DD625EF49C3258A1A" - "3C0FF501E3DC673B76D7BABF349009B6ECF#) (x " - "#14D0345A3562C480A039E3C72764F72D79043216#)))))\n"; - -int main() { - OTRL_INIT; - - // We have to write the private key information to a file because the libotr - // API demands a filename to read from. - const char *tmpdir = "/tmp"; - if (getenv("TMP")) { - tmpdir = getenv("TMP"); - } - - char private_key_file[256]; - snprintf(private_key_file, sizeof(private_key_file), - "%s/libotr_test_helper_privatekeys-XXXXXX", tmpdir); - int fd = mkstemp(private_key_file); - if (fd == -1) { - perror("creating temp file"); - } - write(fd, kPrivateKeyData, sizeof(kPrivateKeyData) - 1); - close(fd); - - OtrlUserState userstate = otrl_userstate_create(); - otrl_privkey_read(userstate, private_key_file); - unlink(private_key_file); - - fprintf(stderr, "libotr helper started\n"); - - char buf[4096]; - - for (;;) { - char *message = fgets(buf, sizeof(buf), stdin); - if (strlen(message) == 0) { - break; - } - message[strlen(message) - 1] = 0; - fprintf(stderr, "libotr helper got: %s\n", message); - - char *newmessage = NULL; - OtrlTLV *tlvs; - int ignore_message = otrl_message_receiving( - userstate, &uiops, NULL, "account", "proto", "peer", message, - &newmessage, &tlvs, NULL, NULL, NULL); - if (tlvs) { - otrl_tlv_free(tlvs); - } - - if (newmessage != NULL) { - fprintf(stderr, "libotr got: %s\n", newmessage); - otrl_message_free(newmessage); - - gcry_error_t err; - char *newmessage = NULL; - - err = otrl_message_sending(userstate, &uiops, NULL, "account", "proto", - "peer", 0, "test message", NULL, &newmessage, - OTRL_FRAGMENT_SEND_SKIP, NULL, NULL, NULL); - if (newmessage == NULL) { - fprintf(stderr, "libotr didn't encrypt message\n"); - return 1; - } - write(1, newmessage, strlen(newmessage)); - write(1, "\n", 1); - fprintf(stderr, "libotr sent: %s\n", newmessage); - otrl_message_free(newmessage); - - g_session_established = 0; - write(1, "?OTRv2?\n", 8); - fprintf(stderr, "libotr sent: ?OTRv2\n"); - } - } - - return 0; -} diff --git a/vendor/golang.org/x/crypto/otr/otr.go b/vendor/golang.org/x/crypto/otr/otr.go deleted file mode 100644 index 173b753db..000000000 --- a/vendor/golang.org/x/crypto/otr/otr.go +++ /dev/null @@ -1,1415 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package otr implements the Off The Record protocol as specified in -// http://www.cypherpunks.ca/otr/Protocol-v2-3.1.0.html -package otr // import "golang.org/x/crypto/otr" - -import ( - "bytes" - "crypto/aes" - "crypto/cipher" - "crypto/dsa" - "crypto/hmac" - "crypto/rand" - "crypto/sha1" - "crypto/sha256" - "crypto/subtle" - "encoding/base64" - "encoding/hex" - "errors" - "hash" - "io" - "math/big" - "strconv" -) - -// SecurityChange describes a change in the security state of a Conversation. -type SecurityChange int - -const ( - NoChange SecurityChange = iota - // NewKeys indicates that a key exchange has completed. This occurs - // when a conversation first becomes encrypted, and when the keys are - // renegotiated within an encrypted conversation. - NewKeys - // SMPSecretNeeded indicates that the peer has started an - // authentication and that we need to supply a secret. Call SMPQuestion - // to get the optional, human readable challenge and then Authenticate - // to supply the matching secret. - SMPSecretNeeded - // SMPComplete indicates that an authentication completed. The identity - // of the peer has now been confirmed. - SMPComplete - // SMPFailed indicates that an authentication failed. - SMPFailed - // ConversationEnded indicates that the peer ended the secure - // conversation. - ConversationEnded -) - -// QueryMessage can be sent to a peer to start an OTR conversation. -var QueryMessage = "?OTRv2?" - -// ErrorPrefix can be used to make an OTR error by appending an error message -// to it. -var ErrorPrefix = "?OTR Error:" - -var ( - fragmentPartSeparator = []byte(",") - fragmentPrefix = []byte("?OTR,") - msgPrefix = []byte("?OTR:") - queryMarker = []byte("?OTR") -) - -// isQuery attempts to parse an OTR query from msg and returns the greatest -// common version, or 0 if msg is not an OTR query. -func isQuery(msg []byte) (greatestCommonVersion int) { - pos := bytes.Index(msg, queryMarker) - if pos == -1 { - return 0 - } - for i, c := range msg[pos+len(queryMarker):] { - if i == 0 { - if c == '?' { - // Indicates support for version 1, but we don't - // implement that. - continue - } - - if c != 'v' { - // Invalid message - return 0 - } - - continue - } - - if c == '?' { - // End of message - return - } - - if c == ' ' || c == '\t' { - // Probably an invalid message - return 0 - } - - if c == '2' { - greatestCommonVersion = 2 - } - } - - return 0 -} - -const ( - statePlaintext = iota - stateEncrypted - stateFinished -) - -const ( - authStateNone = iota - authStateAwaitingDHKey - authStateAwaitingRevealSig - authStateAwaitingSig -) - -const ( - msgTypeDHCommit = 2 - msgTypeData = 3 - msgTypeDHKey = 10 - msgTypeRevealSig = 17 - msgTypeSig = 18 -) - -const ( - // If the requested fragment size is less than this, it will be ignored. - minFragmentSize = 18 - // Messages are padded to a multiple of this number of bytes. - paddingGranularity = 256 - // The number of bytes in a Diffie-Hellman private value (320-bits). - dhPrivateBytes = 40 - // The number of bytes needed to represent an element of the DSA - // subgroup (160-bits). - dsaSubgroupBytes = 20 - // The number of bytes of the MAC that are sent on the wire (160-bits). - macPrefixBytes = 20 -) - -// These are the global, common group parameters for OTR. -var ( - p *big.Int // group prime - g *big.Int // group generator - q *big.Int // group order - pMinus2 *big.Int -) - -func init() { - p, _ = new(big.Int).SetString("FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA237327FFFFFFFFFFFFFFFF", 16) - q, _ = new(big.Int).SetString("7FFFFFFFFFFFFFFFE487ED5110B4611A62633145C06E0E68948127044533E63A0105DF531D89CD9128A5043CC71A026EF7CA8CD9E69D218D98158536F92F8A1BA7F09AB6B6A8E122F242DABB312F3F637A262174D31BF6B585FFAE5B7A035BF6F71C35FDAD44CFD2D74F9208BE258FF324943328F6722D9EE1003E5C50B1DF82CC6D241B0E2AE9CD348B1FD47E9267AFC1B2AE91EE51D6CB0E3179AB1042A95DCF6A9483B84B4B36B3861AA7255E4C0278BA36046511B993FFFFFFFFFFFFFFFF", 16) - g = new(big.Int).SetInt64(2) - pMinus2 = new(big.Int).Sub(p, g) -} - -// Conversation represents a relation with a peer. The zero value is a valid -// Conversation, although PrivateKey must be set. -// -// When communicating with a peer, all inbound messages should be passed to -// Conversation.Receive and all outbound messages to Conversation.Send. The -// Conversation will take care of maintaining the encryption state and -// negotiating encryption as needed. -type Conversation struct { - // PrivateKey contains the private key to use to sign key exchanges. - PrivateKey *PrivateKey - - // Rand can be set to override the entropy source. Otherwise, - // crypto/rand will be used. - Rand io.Reader - // If FragmentSize is set, all messages produced by Receive and Send - // will be fragmented into messages of, at most, this number of bytes. - FragmentSize int - - // Once Receive has returned NewKeys once, the following fields are - // valid. - SSID [8]byte - TheirPublicKey PublicKey - - state, authState int - - r [16]byte - x, y *big.Int - gx, gy *big.Int - gxBytes []byte - digest [sha256.Size]byte - - revealKeys, sigKeys akeKeys - - myKeyId uint32 - myCurrentDHPub *big.Int - myCurrentDHPriv *big.Int - myLastDHPub *big.Int - myLastDHPriv *big.Int - - theirKeyId uint32 - theirCurrentDHPub *big.Int - theirLastDHPub *big.Int - - keySlots [4]keySlot - - myCounter [8]byte - theirLastCtr [8]byte - oldMACs []byte - - k, n int // fragment state - frag []byte - - smp smpState -} - -// A keySlot contains key material for a specific (their keyid, my keyid) pair. -type keySlot struct { - // used is true if this slot is valid. If false, it's free for reuse. - used bool - theirKeyId uint32 - myKeyId uint32 - sendAESKey, recvAESKey []byte - sendMACKey, recvMACKey []byte - theirLastCtr [8]byte -} - -// akeKeys are generated during key exchange. There's one set for the reveal -// signature message and another for the signature message. In the protocol -// spec the latter are indicated with a prime mark. -type akeKeys struct { - c [16]byte - m1, m2 [32]byte -} - -func (c *Conversation) rand() io.Reader { - if c.Rand != nil { - return c.Rand - } - return rand.Reader -} - -func (c *Conversation) randMPI(buf []byte) *big.Int { - _, err := io.ReadFull(c.rand(), buf) - if err != nil { - panic("otr: short read from random source") - } - - return new(big.Int).SetBytes(buf) -} - -// tlv represents the type-length value from the protocol. -type tlv struct { - typ, length uint16 - data []byte -} - -const ( - tlvTypePadding = 0 - tlvTypeDisconnected = 1 - tlvTypeSMP1 = 2 - tlvTypeSMP2 = 3 - tlvTypeSMP3 = 4 - tlvTypeSMP4 = 5 - tlvTypeSMPAbort = 6 - tlvTypeSMP1WithQuestion = 7 -) - -// Receive handles a message from a peer. It returns a human readable message, -// an indicator of whether that message was encrypted, a hint about the -// encryption state and zero or more messages to send back to the peer. -// These messages do not need to be passed to Send before transmission. -func (c *Conversation) Receive(in []byte) (out []byte, encrypted bool, change SecurityChange, toSend [][]byte, err error) { - if bytes.HasPrefix(in, fragmentPrefix) { - in, err = c.processFragment(in) - if in == nil || err != nil { - return - } - } - - if bytes.HasPrefix(in, msgPrefix) && in[len(in)-1] == '.' { - in = in[len(msgPrefix) : len(in)-1] - } else if version := isQuery(in); version > 0 { - c.authState = authStateAwaitingDHKey - c.reset() - toSend = c.encode(c.generateDHCommit()) - return - } else { - // plaintext message - out = in - return - } - - msg := make([]byte, base64.StdEncoding.DecodedLen(len(in))) - msgLen, err := base64.StdEncoding.Decode(msg, in) - if err != nil { - err = errors.New("otr: invalid base64 encoding in message") - return - } - msg = msg[:msgLen] - - // The first two bytes are the protocol version (2) - if len(msg) < 3 || msg[0] != 0 || msg[1] != 2 { - err = errors.New("otr: invalid OTR message") - return - } - - msgType := int(msg[2]) - msg = msg[3:] - - switch msgType { - case msgTypeDHCommit: - switch c.authState { - case authStateNone: - c.authState = authStateAwaitingRevealSig - if err = c.processDHCommit(msg); err != nil { - return - } - c.reset() - toSend = c.encode(c.generateDHKey()) - return - case authStateAwaitingDHKey: - // This is a 'SYN-crossing'. The greater digest wins. - var cmp int - if cmp, err = c.compareToDHCommit(msg); err != nil { - return - } - if cmp > 0 { - // We win. Retransmit DH commit. - toSend = c.encode(c.serializeDHCommit()) - return - } else { - // They win. We forget about our DH commit. - c.authState = authStateAwaitingRevealSig - if err = c.processDHCommit(msg); err != nil { - return - } - c.reset() - toSend = c.encode(c.generateDHKey()) - return - } - case authStateAwaitingRevealSig: - if err = c.processDHCommit(msg); err != nil { - return - } - toSend = c.encode(c.serializeDHKey()) - case authStateAwaitingSig: - if err = c.processDHCommit(msg); err != nil { - return - } - c.reset() - toSend = c.encode(c.generateDHKey()) - c.authState = authStateAwaitingRevealSig - default: - panic("bad state") - } - case msgTypeDHKey: - switch c.authState { - case authStateAwaitingDHKey: - var isSame bool - if isSame, err = c.processDHKey(msg); err != nil { - return - } - if isSame { - err = errors.New("otr: unexpected duplicate DH key") - return - } - toSend = c.encode(c.generateRevealSig()) - c.authState = authStateAwaitingSig - case authStateAwaitingSig: - var isSame bool - if isSame, err = c.processDHKey(msg); err != nil { - return - } - if isSame { - toSend = c.encode(c.serializeDHKey()) - } - } - case msgTypeRevealSig: - if c.authState != authStateAwaitingRevealSig { - return - } - if err = c.processRevealSig(msg); err != nil { - return - } - toSend = c.encode(c.generateSig()) - c.authState = authStateNone - c.state = stateEncrypted - change = NewKeys - case msgTypeSig: - if c.authState != authStateAwaitingSig { - return - } - if err = c.processSig(msg); err != nil { - return - } - c.authState = authStateNone - c.state = stateEncrypted - change = NewKeys - case msgTypeData: - if c.state != stateEncrypted { - err = errors.New("otr: encrypted message received without encrypted session established") - return - } - var tlvs []tlv - out, tlvs, err = c.processData(msg) - encrypted = true - - EachTLV: - for _, inTLV := range tlvs { - switch inTLV.typ { - case tlvTypeDisconnected: - change = ConversationEnded - c.state = stateFinished - break EachTLV - case tlvTypeSMP1, tlvTypeSMP2, tlvTypeSMP3, tlvTypeSMP4, tlvTypeSMPAbort, tlvTypeSMP1WithQuestion: - var reply tlv - var complete bool - reply, complete, err = c.processSMP(inTLV) - if err == smpSecretMissingError { - err = nil - change = SMPSecretNeeded - c.smp.saved = &inTLV - return - } - if err == smpFailureError { - err = nil - change = SMPFailed - } else if complete { - change = SMPComplete - } - if reply.typ != 0 { - toSend = c.encode(c.generateData(nil, &reply)) - } - break EachTLV - default: - // skip unknown TLVs - } - } - default: - err = errors.New("otr: unknown message type " + strconv.Itoa(msgType)) - } - - return -} - -// Send takes a human readable message from the local user, possibly encrypts -// it and returns zero one or more messages to send to the peer. -func (c *Conversation) Send(msg []byte) ([][]byte, error) { - switch c.state { - case statePlaintext: - return [][]byte{msg}, nil - case stateEncrypted: - return c.encode(c.generateData(msg, nil)), nil - case stateFinished: - return nil, errors.New("otr: cannot send message because secure conversation has finished") - } - - return nil, errors.New("otr: cannot send message in current state") -} - -// SMPQuestion returns the human readable challenge question from the peer. -// It's only valid after Receive has returned SMPSecretNeeded. -func (c *Conversation) SMPQuestion() string { - return c.smp.question -} - -// Authenticate begins an authentication with the peer. Authentication involves -// an optional challenge message and a shared secret. The authentication -// proceeds until either Receive returns SMPComplete, SMPSecretNeeded (which -// indicates that a new authentication is happening and thus this one was -// aborted) or SMPFailed. -func (c *Conversation) Authenticate(question string, mutualSecret []byte) (toSend [][]byte, err error) { - if c.state != stateEncrypted { - err = errors.New("otr: can't authenticate a peer without a secure conversation established") - return - } - - if c.smp.saved != nil { - c.calcSMPSecret(mutualSecret, false /* they started it */) - - var out tlv - var complete bool - out, complete, err = c.processSMP(*c.smp.saved) - if complete { - panic("SMP completed on the first message") - } - c.smp.saved = nil - if out.typ != 0 { - toSend = c.encode(c.generateData(nil, &out)) - } - return - } - - c.calcSMPSecret(mutualSecret, true /* we started it */) - outs := c.startSMP(question) - for _, out := range outs { - toSend = append(toSend, c.encode(c.generateData(nil, &out))...) - } - return -} - -// End ends a secure conversation by generating a termination message for -// the peer and switches to unencrypted communication. -func (c *Conversation) End() (toSend [][]byte) { - switch c.state { - case statePlaintext: - return nil - case stateEncrypted: - c.state = statePlaintext - return c.encode(c.generateData(nil, &tlv{typ: tlvTypeDisconnected})) - case stateFinished: - c.state = statePlaintext - return nil - } - panic("unreachable") -} - -// IsEncrypted returns true if a message passed to Send would be encrypted -// before transmission. This result remains valid until the next call to -// Receive or End, which may change the state of the Conversation. -func (c *Conversation) IsEncrypted() bool { - return c.state == stateEncrypted -} - -var fragmentError = errors.New("otr: invalid OTR fragment") - -// processFragment processes a fragmented OTR message and possibly returns a -// complete message. Fragmented messages look like "?OTR,k,n,msg," where k is -// the fragment number (starting from 1), n is the number of fragments in this -// message and msg is a substring of the base64 encoded message. -func (c *Conversation) processFragment(in []byte) (out []byte, err error) { - in = in[len(fragmentPrefix):] // remove "?OTR," - parts := bytes.Split(in, fragmentPartSeparator) - if len(parts) != 4 || len(parts[3]) != 0 { - return nil, fragmentError - } - - k, err := strconv.Atoi(string(parts[0])) - if err != nil { - return nil, fragmentError - } - - n, err := strconv.Atoi(string(parts[1])) - if err != nil { - return nil, fragmentError - } - - if k < 1 || n < 1 || k > n { - return nil, fragmentError - } - - if k == 1 { - c.frag = append(c.frag[:0], parts[2]...) - c.k, c.n = k, n - } else if n == c.n && k == c.k+1 { - c.frag = append(c.frag, parts[2]...) - c.k++ - } else { - c.frag = c.frag[:0] - c.n, c.k = 0, 0 - } - - if c.n > 0 && c.k == c.n { - c.n, c.k = 0, 0 - return c.frag, nil - } - - return nil, nil -} - -func (c *Conversation) generateDHCommit() []byte { - _, err := io.ReadFull(c.rand(), c.r[:]) - if err != nil { - panic("otr: short read from random source") - } - - var xBytes [dhPrivateBytes]byte - c.x = c.randMPI(xBytes[:]) - c.gx = new(big.Int).Exp(g, c.x, p) - c.gy = nil - c.gxBytes = appendMPI(nil, c.gx) - - h := sha256.New() - h.Write(c.gxBytes) - h.Sum(c.digest[:0]) - - aesCipher, err := aes.NewCipher(c.r[:]) - if err != nil { - panic(err.Error()) - } - - var iv [aes.BlockSize]byte - ctr := cipher.NewCTR(aesCipher, iv[:]) - ctr.XORKeyStream(c.gxBytes, c.gxBytes) - - return c.serializeDHCommit() -} - -func (c *Conversation) serializeDHCommit() []byte { - var ret []byte - ret = appendU16(ret, 2) // protocol version - ret = append(ret, msgTypeDHCommit) - ret = appendData(ret, c.gxBytes) - ret = appendData(ret, c.digest[:]) - return ret -} - -func (c *Conversation) processDHCommit(in []byte) error { - var ok1, ok2 bool - c.gxBytes, in, ok1 = getData(in) - digest, in, ok2 := getData(in) - if !ok1 || !ok2 || len(in) > 0 { - return errors.New("otr: corrupt DH commit message") - } - copy(c.digest[:], digest) - return nil -} - -func (c *Conversation) compareToDHCommit(in []byte) (int, error) { - _, in, ok1 := getData(in) - digest, in, ok2 := getData(in) - if !ok1 || !ok2 || len(in) > 0 { - return 0, errors.New("otr: corrupt DH commit message") - } - return bytes.Compare(c.digest[:], digest), nil -} - -func (c *Conversation) generateDHKey() []byte { - var yBytes [dhPrivateBytes]byte - c.y = c.randMPI(yBytes[:]) - c.gy = new(big.Int).Exp(g, c.y, p) - return c.serializeDHKey() -} - -func (c *Conversation) serializeDHKey() []byte { - var ret []byte - ret = appendU16(ret, 2) // protocol version - ret = append(ret, msgTypeDHKey) - ret = appendMPI(ret, c.gy) - return ret -} - -func (c *Conversation) processDHKey(in []byte) (isSame bool, err error) { - gy, in, ok := getMPI(in) - if !ok { - err = errors.New("otr: corrupt DH key message") - return - } - if gy.Cmp(g) < 0 || gy.Cmp(pMinus2) > 0 { - err = errors.New("otr: DH value out of range") - return - } - if c.gy != nil { - isSame = c.gy.Cmp(gy) == 0 - return - } - c.gy = gy - return -} - -func (c *Conversation) generateEncryptedSignature(keys *akeKeys, xFirst bool) ([]byte, []byte) { - var xb []byte - xb = c.PrivateKey.PublicKey.Serialize(xb) - - var verifyData []byte - if xFirst { - verifyData = appendMPI(verifyData, c.gx) - verifyData = appendMPI(verifyData, c.gy) - } else { - verifyData = appendMPI(verifyData, c.gy) - verifyData = appendMPI(verifyData, c.gx) - } - verifyData = append(verifyData, xb...) - verifyData = appendU32(verifyData, c.myKeyId) - - mac := hmac.New(sha256.New, keys.m1[:]) - mac.Write(verifyData) - mb := mac.Sum(nil) - - xb = appendU32(xb, c.myKeyId) - xb = append(xb, c.PrivateKey.Sign(c.rand(), mb)...) - - aesCipher, err := aes.NewCipher(keys.c[:]) - if err != nil { - panic(err.Error()) - } - var iv [aes.BlockSize]byte - ctr := cipher.NewCTR(aesCipher, iv[:]) - ctr.XORKeyStream(xb, xb) - - mac = hmac.New(sha256.New, keys.m2[:]) - encryptedSig := appendData(nil, xb) - mac.Write(encryptedSig) - - return encryptedSig, mac.Sum(nil) -} - -func (c *Conversation) generateRevealSig() []byte { - s := new(big.Int).Exp(c.gy, c.x, p) - c.calcAKEKeys(s) - c.myKeyId++ - - encryptedSig, mac := c.generateEncryptedSignature(&c.revealKeys, true /* gx comes first */) - - c.myCurrentDHPub = c.gx - c.myCurrentDHPriv = c.x - c.rotateDHKeys() - incCounter(&c.myCounter) - - var ret []byte - ret = appendU16(ret, 2) - ret = append(ret, msgTypeRevealSig) - ret = appendData(ret, c.r[:]) - ret = append(ret, encryptedSig...) - ret = append(ret, mac[:20]...) - return ret -} - -func (c *Conversation) processEncryptedSig(encryptedSig, theirMAC []byte, keys *akeKeys, xFirst bool) error { - mac := hmac.New(sha256.New, keys.m2[:]) - mac.Write(appendData(nil, encryptedSig)) - myMAC := mac.Sum(nil)[:20] - - if len(myMAC) != len(theirMAC) || subtle.ConstantTimeCompare(myMAC, theirMAC) == 0 { - return errors.New("bad signature MAC in encrypted signature") - } - - aesCipher, err := aes.NewCipher(keys.c[:]) - if err != nil { - panic(err.Error()) - } - var iv [aes.BlockSize]byte - ctr := cipher.NewCTR(aesCipher, iv[:]) - ctr.XORKeyStream(encryptedSig, encryptedSig) - - sig := encryptedSig - sig, ok1 := c.TheirPublicKey.Parse(sig) - keyId, sig, ok2 := getU32(sig) - if !ok1 || !ok2 { - return errors.New("otr: corrupt encrypted signature") - } - - var verifyData []byte - if xFirst { - verifyData = appendMPI(verifyData, c.gx) - verifyData = appendMPI(verifyData, c.gy) - } else { - verifyData = appendMPI(verifyData, c.gy) - verifyData = appendMPI(verifyData, c.gx) - } - verifyData = c.TheirPublicKey.Serialize(verifyData) - verifyData = appendU32(verifyData, keyId) - - mac = hmac.New(sha256.New, keys.m1[:]) - mac.Write(verifyData) - mb := mac.Sum(nil) - - sig, ok1 = c.TheirPublicKey.Verify(mb, sig) - if !ok1 { - return errors.New("bad signature in encrypted signature") - } - if len(sig) > 0 { - return errors.New("corrupt encrypted signature") - } - - c.theirKeyId = keyId - zero(c.theirLastCtr[:]) - return nil -} - -func (c *Conversation) processRevealSig(in []byte) error { - r, in, ok1 := getData(in) - encryptedSig, in, ok2 := getData(in) - theirMAC := in - if !ok1 || !ok2 || len(theirMAC) != 20 { - return errors.New("otr: corrupt reveal signature message") - } - - aesCipher, err := aes.NewCipher(r) - if err != nil { - return errors.New("otr: cannot create AES cipher from reveal signature message: " + err.Error()) - } - var iv [aes.BlockSize]byte - ctr := cipher.NewCTR(aesCipher, iv[:]) - ctr.XORKeyStream(c.gxBytes, c.gxBytes) - h := sha256.New() - h.Write(c.gxBytes) - digest := h.Sum(nil) - if len(digest) != len(c.digest) || subtle.ConstantTimeCompare(digest, c.digest[:]) == 0 { - return errors.New("otr: bad commit MAC in reveal signature message") - } - var rest []byte - c.gx, rest, ok1 = getMPI(c.gxBytes) - if !ok1 || len(rest) > 0 { - return errors.New("otr: gx corrupt after decryption") - } - if c.gx.Cmp(g) < 0 || c.gx.Cmp(pMinus2) > 0 { - return errors.New("otr: DH value out of range") - } - s := new(big.Int).Exp(c.gx, c.y, p) - c.calcAKEKeys(s) - - if err := c.processEncryptedSig(encryptedSig, theirMAC, &c.revealKeys, true /* gx comes first */); err != nil { - return errors.New("otr: in reveal signature message: " + err.Error()) - } - - c.theirCurrentDHPub = c.gx - c.theirLastDHPub = nil - - return nil -} - -func (c *Conversation) generateSig() []byte { - c.myKeyId++ - - encryptedSig, mac := c.generateEncryptedSignature(&c.sigKeys, false /* gy comes first */) - - c.myCurrentDHPub = c.gy - c.myCurrentDHPriv = c.y - c.rotateDHKeys() - incCounter(&c.myCounter) - - var ret []byte - ret = appendU16(ret, 2) - ret = append(ret, msgTypeSig) - ret = append(ret, encryptedSig...) - ret = append(ret, mac[:macPrefixBytes]...) - return ret -} - -func (c *Conversation) processSig(in []byte) error { - encryptedSig, in, ok1 := getData(in) - theirMAC := in - if !ok1 || len(theirMAC) != macPrefixBytes { - return errors.New("otr: corrupt signature message") - } - - if err := c.processEncryptedSig(encryptedSig, theirMAC, &c.sigKeys, false /* gy comes first */); err != nil { - return errors.New("otr: in signature message: " + err.Error()) - } - - c.theirCurrentDHPub = c.gy - c.theirLastDHPub = nil - - return nil -} - -func (c *Conversation) rotateDHKeys() { - // evict slots using our retired key id - for i := range c.keySlots { - slot := &c.keySlots[i] - if slot.used && slot.myKeyId == c.myKeyId-1 { - slot.used = false - c.oldMACs = append(c.oldMACs, slot.recvMACKey...) - } - } - - c.myLastDHPriv = c.myCurrentDHPriv - c.myLastDHPub = c.myCurrentDHPub - - var xBytes [dhPrivateBytes]byte - c.myCurrentDHPriv = c.randMPI(xBytes[:]) - c.myCurrentDHPub = new(big.Int).Exp(g, c.myCurrentDHPriv, p) - c.myKeyId++ -} - -func (c *Conversation) processData(in []byte) (out []byte, tlvs []tlv, err error) { - origIn := in - flags, in, ok1 := getU8(in) - theirKeyId, in, ok2 := getU32(in) - myKeyId, in, ok3 := getU32(in) - y, in, ok4 := getMPI(in) - counter, in, ok5 := getNBytes(in, 8) - encrypted, in, ok6 := getData(in) - macedData := origIn[:len(origIn)-len(in)] - theirMAC, in, ok7 := getNBytes(in, macPrefixBytes) - _, in, ok8 := getData(in) - if !ok1 || !ok2 || !ok3 || !ok4 || !ok5 || !ok6 || !ok7 || !ok8 || len(in) > 0 { - err = errors.New("otr: corrupt data message") - return - } - - ignoreErrors := flags&1 != 0 - - slot, err := c.calcDataKeys(myKeyId, theirKeyId) - if err != nil { - if ignoreErrors { - err = nil - } - return - } - - mac := hmac.New(sha1.New, slot.recvMACKey) - mac.Write([]byte{0, 2, 3}) - mac.Write(macedData) - myMAC := mac.Sum(nil) - if len(myMAC) != len(theirMAC) || subtle.ConstantTimeCompare(myMAC, theirMAC) == 0 { - if !ignoreErrors { - err = errors.New("otr: bad MAC on data message") - } - return - } - - if bytes.Compare(counter, slot.theirLastCtr[:]) <= 0 { - err = errors.New("otr: counter regressed") - return - } - copy(slot.theirLastCtr[:], counter) - - var iv [aes.BlockSize]byte - copy(iv[:], counter) - aesCipher, err := aes.NewCipher(slot.recvAESKey) - if err != nil { - panic(err.Error()) - } - ctr := cipher.NewCTR(aesCipher, iv[:]) - ctr.XORKeyStream(encrypted, encrypted) - decrypted := encrypted - - if myKeyId == c.myKeyId { - c.rotateDHKeys() - } - if theirKeyId == c.theirKeyId { - // evict slots using their retired key id - for i := range c.keySlots { - slot := &c.keySlots[i] - if slot.used && slot.theirKeyId == theirKeyId-1 { - slot.used = false - c.oldMACs = append(c.oldMACs, slot.recvMACKey...) - } - } - - c.theirLastDHPub = c.theirCurrentDHPub - c.theirKeyId++ - c.theirCurrentDHPub = y - } - - if nulPos := bytes.IndexByte(decrypted, 0); nulPos >= 0 { - out = decrypted[:nulPos] - tlvData := decrypted[nulPos+1:] - for len(tlvData) > 0 { - var t tlv - var ok1, ok2, ok3 bool - - t.typ, tlvData, ok1 = getU16(tlvData) - t.length, tlvData, ok2 = getU16(tlvData) - t.data, tlvData, ok3 = getNBytes(tlvData, int(t.length)) - if !ok1 || !ok2 || !ok3 { - err = errors.New("otr: corrupt tlv data") - return - } - tlvs = append(tlvs, t) - } - } else { - out = decrypted - } - - return -} - -func (c *Conversation) generateData(msg []byte, extra *tlv) []byte { - slot, err := c.calcDataKeys(c.myKeyId-1, c.theirKeyId) - if err != nil { - panic("otr: failed to generate sending keys: " + err.Error()) - } - - var plaintext []byte - plaintext = append(plaintext, msg...) - plaintext = append(plaintext, 0) - - padding := paddingGranularity - ((len(plaintext) + 4) % paddingGranularity) - plaintext = appendU16(plaintext, tlvTypePadding) - plaintext = appendU16(plaintext, uint16(padding)) - for i := 0; i < padding; i++ { - plaintext = append(plaintext, 0) - } - - if extra != nil { - plaintext = appendU16(plaintext, extra.typ) - plaintext = appendU16(plaintext, uint16(len(extra.data))) - plaintext = append(plaintext, extra.data...) - } - - encrypted := make([]byte, len(plaintext)) - - var iv [aes.BlockSize]byte - copy(iv[:], c.myCounter[:]) - aesCipher, err := aes.NewCipher(slot.sendAESKey) - if err != nil { - panic(err.Error()) - } - ctr := cipher.NewCTR(aesCipher, iv[:]) - ctr.XORKeyStream(encrypted, plaintext) - - var ret []byte - ret = appendU16(ret, 2) - ret = append(ret, msgTypeData) - ret = append(ret, 0 /* flags */) - ret = appendU32(ret, c.myKeyId-1) - ret = appendU32(ret, c.theirKeyId) - ret = appendMPI(ret, c.myCurrentDHPub) - ret = append(ret, c.myCounter[:]...) - ret = appendData(ret, encrypted) - - mac := hmac.New(sha1.New, slot.sendMACKey) - mac.Write(ret) - ret = append(ret, mac.Sum(nil)[:macPrefixBytes]...) - ret = appendData(ret, c.oldMACs) - c.oldMACs = nil - incCounter(&c.myCounter) - - return ret -} - -func incCounter(counter *[8]byte) { - for i := 7; i >= 0; i-- { - counter[i]++ - if counter[i] > 0 { - break - } - } -} - -// calcDataKeys computes the keys used to encrypt a data message given the key -// IDs. -func (c *Conversation) calcDataKeys(myKeyId, theirKeyId uint32) (slot *keySlot, err error) { - // Check for a cache hit. - for i := range c.keySlots { - slot = &c.keySlots[i] - if slot.used && slot.theirKeyId == theirKeyId && slot.myKeyId == myKeyId { - return - } - } - - // Find an empty slot to write into. - slot = nil - for i := range c.keySlots { - if !c.keySlots[i].used { - slot = &c.keySlots[i] - break - } - } - if slot == nil { - return nil, errors.New("otr: internal error: no more key slots") - } - - var myPriv, myPub, theirPub *big.Int - - if myKeyId == c.myKeyId { - myPriv = c.myCurrentDHPriv - myPub = c.myCurrentDHPub - } else if myKeyId == c.myKeyId-1 { - myPriv = c.myLastDHPriv - myPub = c.myLastDHPub - } else { - err = errors.New("otr: peer requested keyid " + strconv.FormatUint(uint64(myKeyId), 10) + " when I'm on " + strconv.FormatUint(uint64(c.myKeyId), 10)) - return - } - - if theirKeyId == c.theirKeyId { - theirPub = c.theirCurrentDHPub - } else if theirKeyId == c.theirKeyId-1 && c.theirLastDHPub != nil { - theirPub = c.theirLastDHPub - } else { - err = errors.New("otr: peer requested keyid " + strconv.FormatUint(uint64(myKeyId), 10) + " when they're on " + strconv.FormatUint(uint64(c.myKeyId), 10)) - return - } - - var sendPrefixByte, recvPrefixByte [1]byte - - if myPub.Cmp(theirPub) > 0 { - // we're the high end - sendPrefixByte[0], recvPrefixByte[0] = 1, 2 - } else { - // we're the low end - sendPrefixByte[0], recvPrefixByte[0] = 2, 1 - } - - s := new(big.Int).Exp(theirPub, myPriv, p) - sBytes := appendMPI(nil, s) - - h := sha1.New() - h.Write(sendPrefixByte[:]) - h.Write(sBytes) - slot.sendAESKey = h.Sum(slot.sendAESKey[:0])[:16] - - h.Reset() - h.Write(slot.sendAESKey) - slot.sendMACKey = h.Sum(slot.sendMACKey[:0]) - - h.Reset() - h.Write(recvPrefixByte[:]) - h.Write(sBytes) - slot.recvAESKey = h.Sum(slot.recvAESKey[:0])[:16] - - h.Reset() - h.Write(slot.recvAESKey) - slot.recvMACKey = h.Sum(slot.recvMACKey[:0]) - - slot.theirKeyId = theirKeyId - slot.myKeyId = myKeyId - slot.used = true - - zero(slot.theirLastCtr[:]) - return -} - -func (c *Conversation) calcAKEKeys(s *big.Int) { - mpi := appendMPI(nil, s) - h := sha256.New() - - var cBytes [32]byte - hashWithPrefix(c.SSID[:], 0, mpi, h) - - hashWithPrefix(cBytes[:], 1, mpi, h) - copy(c.revealKeys.c[:], cBytes[:16]) - copy(c.sigKeys.c[:], cBytes[16:]) - - hashWithPrefix(c.revealKeys.m1[:], 2, mpi, h) - hashWithPrefix(c.revealKeys.m2[:], 3, mpi, h) - hashWithPrefix(c.sigKeys.m1[:], 4, mpi, h) - hashWithPrefix(c.sigKeys.m2[:], 5, mpi, h) -} - -func hashWithPrefix(out []byte, prefix byte, in []byte, h hash.Hash) { - h.Reset() - var p [1]byte - p[0] = prefix - h.Write(p[:]) - h.Write(in) - if len(out) == h.Size() { - h.Sum(out[:0]) - } else { - digest := h.Sum(nil) - copy(out, digest) - } -} - -func (c *Conversation) encode(msg []byte) [][]byte { - b64 := make([]byte, base64.StdEncoding.EncodedLen(len(msg))+len(msgPrefix)+1) - base64.StdEncoding.Encode(b64[len(msgPrefix):], msg) - copy(b64, msgPrefix) - b64[len(b64)-1] = '.' - - if c.FragmentSize < minFragmentSize || len(b64) <= c.FragmentSize { - // We can encode this in a single fragment. - return [][]byte{b64} - } - - // We have to fragment this message. - var ret [][]byte - bytesPerFragment := c.FragmentSize - minFragmentSize - numFragments := (len(b64) + bytesPerFragment) / bytesPerFragment - - for i := 0; i < numFragments; i++ { - frag := []byte("?OTR," + strconv.Itoa(i+1) + "," + strconv.Itoa(numFragments) + ",") - todo := bytesPerFragment - if todo > len(b64) { - todo = len(b64) - } - frag = append(frag, b64[:todo]...) - b64 = b64[todo:] - frag = append(frag, ',') - ret = append(ret, frag) - } - - return ret -} - -func (c *Conversation) reset() { - c.myKeyId = 0 - - for i := range c.keySlots { - c.keySlots[i].used = false - } -} - -type PublicKey struct { - dsa.PublicKey -} - -func (pk *PublicKey) Parse(in []byte) ([]byte, bool) { - var ok bool - var pubKeyType uint16 - - if pubKeyType, in, ok = getU16(in); !ok || pubKeyType != 0 { - return nil, false - } - if pk.P, in, ok = getMPI(in); !ok { - return nil, false - } - if pk.Q, in, ok = getMPI(in); !ok { - return nil, false - } - if pk.G, in, ok = getMPI(in); !ok { - return nil, false - } - if pk.Y, in, ok = getMPI(in); !ok { - return nil, false - } - - return in, true -} - -func (pk *PublicKey) Serialize(in []byte) []byte { - in = appendU16(in, 0) - in = appendMPI(in, pk.P) - in = appendMPI(in, pk.Q) - in = appendMPI(in, pk.G) - in = appendMPI(in, pk.Y) - return in -} - -// Fingerprint returns the 20-byte, binary fingerprint of the PublicKey. -func (pk *PublicKey) Fingerprint() []byte { - b := pk.Serialize(nil) - h := sha1.New() - h.Write(b[2:]) - return h.Sum(nil) -} - -func (pk *PublicKey) Verify(hashed, sig []byte) ([]byte, bool) { - if len(sig) != 2*dsaSubgroupBytes { - return nil, false - } - r := new(big.Int).SetBytes(sig[:dsaSubgroupBytes]) - s := new(big.Int).SetBytes(sig[dsaSubgroupBytes:]) - ok := dsa.Verify(&pk.PublicKey, hashed, r, s) - return sig[dsaSubgroupBytes*2:], ok -} - -type PrivateKey struct { - PublicKey - dsa.PrivateKey -} - -func (priv *PrivateKey) Sign(rand io.Reader, hashed []byte) []byte { - r, s, err := dsa.Sign(rand, &priv.PrivateKey, hashed) - if err != nil { - panic(err.Error()) - } - rBytes := r.Bytes() - sBytes := s.Bytes() - if len(rBytes) > dsaSubgroupBytes || len(sBytes) > dsaSubgroupBytes { - panic("DSA signature too large") - } - - out := make([]byte, 2*dsaSubgroupBytes) - copy(out[dsaSubgroupBytes-len(rBytes):], rBytes) - copy(out[len(out)-len(sBytes):], sBytes) - return out -} - -func (priv *PrivateKey) Serialize(in []byte) []byte { - in = priv.PublicKey.Serialize(in) - in = appendMPI(in, priv.PrivateKey.X) - return in -} - -func (priv *PrivateKey) Parse(in []byte) ([]byte, bool) { - in, ok := priv.PublicKey.Parse(in) - if !ok { - return in, ok - } - priv.PrivateKey.PublicKey = priv.PublicKey.PublicKey - priv.PrivateKey.X, in, ok = getMPI(in) - return in, ok -} - -func (priv *PrivateKey) Generate(rand io.Reader) { - if err := dsa.GenerateParameters(&priv.PrivateKey.PublicKey.Parameters, rand, dsa.L1024N160); err != nil { - panic(err.Error()) - } - if err := dsa.GenerateKey(&priv.PrivateKey, rand); err != nil { - panic(err.Error()) - } - priv.PublicKey.PublicKey = priv.PrivateKey.PublicKey -} - -func notHex(r rune) bool { - if r >= '0' && r <= '9' || - r >= 'a' && r <= 'f' || - r >= 'A' && r <= 'F' { - return false - } - - return true -} - -// Import parses the contents of a libotr private key file. -func (priv *PrivateKey) Import(in []byte) bool { - mpiStart := []byte(" #") - - mpis := make([]*big.Int, 5) - - for i := 0; i < len(mpis); i++ { - start := bytes.Index(in, mpiStart) - if start == -1 { - return false - } - in = in[start+len(mpiStart):] - end := bytes.IndexFunc(in, notHex) - if end == -1 { - return false - } - hexBytes := in[:end] - in = in[end:] - - if len(hexBytes)&1 != 0 { - return false - } - - mpiBytes := make([]byte, len(hexBytes)/2) - if _, err := hex.Decode(mpiBytes, hexBytes); err != nil { - return false - } - - mpis[i] = new(big.Int).SetBytes(mpiBytes) - } - - for _, mpi := range mpis { - if mpi.Sign() <= 0 { - return false - } - } - - priv.PrivateKey.P = mpis[0] - priv.PrivateKey.Q = mpis[1] - priv.PrivateKey.G = mpis[2] - priv.PrivateKey.Y = mpis[3] - priv.PrivateKey.X = mpis[4] - priv.PublicKey.PublicKey = priv.PrivateKey.PublicKey - - a := new(big.Int).Exp(priv.PrivateKey.G, priv.PrivateKey.X, priv.PrivateKey.P) - return a.Cmp(priv.PrivateKey.Y) == 0 -} - -func getU8(in []byte) (uint8, []byte, bool) { - if len(in) < 1 { - return 0, in, false - } - return in[0], in[1:], true -} - -func getU16(in []byte) (uint16, []byte, bool) { - if len(in) < 2 { - return 0, in, false - } - r := uint16(in[0])<<8 | uint16(in[1]) - return r, in[2:], true -} - -func getU32(in []byte) (uint32, []byte, bool) { - if len(in) < 4 { - return 0, in, false - } - r := uint32(in[0])<<24 | uint32(in[1])<<16 | uint32(in[2])<<8 | uint32(in[3]) - return r, in[4:], true -} - -func getMPI(in []byte) (*big.Int, []byte, bool) { - l, in, ok := getU32(in) - if !ok || uint32(len(in)) < l { - return nil, in, false - } - r := new(big.Int).SetBytes(in[:l]) - return r, in[l:], true -} - -func getData(in []byte) ([]byte, []byte, bool) { - l, in, ok := getU32(in) - if !ok || uint32(len(in)) < l { - return nil, in, false - } - return in[:l], in[l:], true -} - -func getNBytes(in []byte, n int) ([]byte, []byte, bool) { - if len(in) < n { - return nil, in, false - } - return in[:n], in[n:], true -} - -func appendU16(out []byte, v uint16) []byte { - out = append(out, byte(v>>8), byte(v)) - return out -} - -func appendU32(out []byte, v uint32) []byte { - out = append(out, byte(v>>24), byte(v>>16), byte(v>>8), byte(v)) - return out -} - -func appendData(out, v []byte) []byte { - out = appendU32(out, uint32(len(v))) - out = append(out, v...) - return out -} - -func appendMPI(out []byte, v *big.Int) []byte { - vBytes := v.Bytes() - out = appendU32(out, uint32(len(vBytes))) - out = append(out, vBytes...) - return out -} - -func appendMPIs(out []byte, mpis ...*big.Int) []byte { - for _, mpi := range mpis { - out = appendMPI(out, mpi) - } - return out -} - -func zero(b []byte) { - for i := range b { - b[i] = 0 - } -} diff --git a/vendor/golang.org/x/crypto/otr/otr_test.go b/vendor/golang.org/x/crypto/otr/otr_test.go deleted file mode 100644 index cfcd062b2..000000000 --- a/vendor/golang.org/x/crypto/otr/otr_test.go +++ /dev/null @@ -1,470 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package otr - -import ( - "bufio" - "bytes" - "crypto/rand" - "encoding/hex" - "math/big" - "os" - "os/exec" - "testing" -) - -var isQueryTests = []struct { - msg string - expectedVersion int -}{ - {"foo", 0}, - {"?OtR", 0}, - {"?OtR?", 0}, - {"?OTR?", 0}, - {"?OTRv?", 0}, - {"?OTRv1?", 0}, - {"?OTR?v1?", 0}, - {"?OTR?v?", 0}, - {"?OTR?v2?", 2}, - {"?OTRv2?", 2}, - {"?OTRv23?", 2}, - {"?OTRv23 ?", 0}, -} - -func TestIsQuery(t *testing.T) { - for i, test := range isQueryTests { - version := isQuery([]byte(test.msg)) - if version != test.expectedVersion { - t.Errorf("#%d: got %d, want %d", i, version, test.expectedVersion) - } - } -} - -var alicePrivateKeyHex = "000000000080c81c2cb2eb729b7e6fd48e975a932c638b3a9055478583afa46755683e30102447f6da2d8bec9f386bbb5da6403b0040fee8650b6ab2d7f32c55ab017ae9b6aec8c324ab5844784e9a80e194830d548fb7f09a0410df2c4d5c8bc2b3e9ad484e65412be689cf0834694e0839fb2954021521ffdffb8f5c32c14dbf2020b3ce7500000014da4591d58def96de61aea7b04a8405fe1609308d000000808ddd5cb0b9d66956e3dea5a915d9aba9d8a6e7053b74dadb2fc52f9fe4e5bcc487d2305485ed95fed026ad93f06ebb8c9e8baf693b7887132c7ffdd3b0f72f4002ff4ed56583ca7c54458f8c068ca3e8a4dfa309d1dd5d34e2a4b68e6f4338835e5e0fb4317c9e4c7e4806dafda3ef459cd563775a586dd91b1319f72621bf3f00000080b8147e74d8c45e6318c37731b8b33b984a795b3653c2cd1d65cc99efe097cb7eb2fa49569bab5aab6e8a1c261a27d0f7840a5e80b317e6683042b59b6dceca2879c6ffc877a465be690c15e4a42f9a7588e79b10faac11b1ce3741fcef7aba8ce05327a2c16d279ee1b3d77eb783fb10e3356caa25635331e26dd42b8396c4d00000001420bec691fea37ecea58a5c717142f0b804452f57" - -var aliceFingerprintHex = "0bb01c360424522e94ee9c346ce877a1a4288b2f" - -var bobPrivateKeyHex = "000000000080a5138eb3d3eb9c1d85716faecadb718f87d31aaed1157671d7fee7e488f95e8e0ba60ad449ec732710a7dec5190f7182af2e2f98312d98497221dff160fd68033dd4f3a33b7c078d0d9f66e26847e76ca7447d4bab35486045090572863d9e4454777f24d6706f63e02548dfec2d0a620af37bbc1d24f884708a212c343b480d00000014e9c58f0ea21a5e4dfd9f44b6a9f7f6a9961a8fa9000000803c4d111aebd62d3c50c2889d420a32cdf1e98b70affcc1fcf44d59cca2eb019f6b774ef88153fb9b9615441a5fe25ea2d11b74ce922ca0232bd81b3c0fcac2a95b20cb6e6c0c5c1ace2e26f65dc43c751af0edbb10d669890e8ab6beea91410b8b2187af1a8347627a06ecea7e0f772c28aae9461301e83884860c9b656c722f0000008065af8625a555ea0e008cd04743671a3cda21162e83af045725db2eb2bb52712708dc0cc1a84c08b3649b88a966974bde27d8612c2861792ec9f08786a246fcadd6d8d3a81a32287745f309238f47618c2bd7612cb8b02d940571e0f30b96420bcd462ff542901b46109b1e5ad6423744448d20a57818a8cbb1647d0fea3b664e0000001440f9f2eb554cb00d45a5826b54bfa419b6980e48" - -func TestKeySerialization(t *testing.T) { - var priv PrivateKey - alicePrivateKey, _ := hex.DecodeString(alicePrivateKeyHex) - rest, ok := priv.Parse(alicePrivateKey) - if !ok { - t.Error("failed to parse private key") - } - if len(rest) > 0 { - t.Error("data remaining after parsing private key") - } - - out := priv.Serialize(nil) - if !bytes.Equal(alicePrivateKey, out) { - t.Errorf("serialization (%x) is not equal to original (%x)", out, alicePrivateKey) - } - - aliceFingerprint, _ := hex.DecodeString(aliceFingerprintHex) - fingerprint := priv.PublicKey.Fingerprint() - if !bytes.Equal(aliceFingerprint, fingerprint) { - t.Errorf("fingerprint (%x) is not equal to expected value (%x)", fingerprint, aliceFingerprint) - } -} - -const libOTRPrivateKey = `(privkeys - (account -(name "foo@example.com") -(protocol prpl-jabber) -(private-key - (dsa - (p #00FC07ABCF0DC916AFF6E9AE47BEF60C7AB9B4D6B2469E436630E36F8A489BE812486A09F30B71224508654940A835301ACC525A4FF133FC152CC53DCC59D65C30A54F1993FE13FE63E5823D4C746DB21B90F9B9C00B49EC7404AB1D929BA7FBA12F2E45C6E0A651689750E8528AB8C031D3561FECEE72EBB4A090D450A9B7A857#) - (q #00997BD266EF7B1F60A5C23F3A741F2AEFD07A2081#) - (g #535E360E8A95EBA46A4F7DE50AD6E9B2A6DB785A66B64EB9F20338D2A3E8FB0E94725848F1AA6CC567CB83A1CC517EC806F2E92EAE71457E80B2210A189B91250779434B41FC8A8873F6DB94BEA7D177F5D59E7E114EE10A49CFD9CEF88AE43387023B672927BA74B04EB6BBB5E57597766A2F9CE3857D7ACE3E1E3BC1FC6F26#) - (y #0AC8670AD767D7A8D9D14CC1AC6744CD7D76F993B77FFD9E39DF01E5A6536EF65E775FCEF2A983E2A19BD6415500F6979715D9FD1257E1FE2B6F5E1E74B333079E7C880D39868462A93454B41877BE62E5EF0A041C2EE9C9E76BD1E12AE25D9628DECB097025DD625EF49C3258A1A3C0FF501E3DC673B76D7BABF349009B6ECF#) - (x #14D0345A3562C480A039E3C72764F72D79043216#) - ) - ) - ) -)` - -func TestParseLibOTRPrivateKey(t *testing.T) { - var priv PrivateKey - - if !priv.Import([]byte(libOTRPrivateKey)) { - t.Fatalf("Failed to import sample private key") - } -} - -func TestSignVerify(t *testing.T) { - var priv PrivateKey - alicePrivateKey, _ := hex.DecodeString(alicePrivateKeyHex) - _, ok := priv.Parse(alicePrivateKey) - if !ok { - t.Error("failed to parse private key") - } - - var msg [32]byte - rand.Reader.Read(msg[:]) - - sig := priv.Sign(rand.Reader, msg[:]) - rest, ok := priv.PublicKey.Verify(msg[:], sig) - if !ok { - t.Errorf("signature (%x) of %x failed to verify", sig, msg[:]) - } else if len(rest) > 0 { - t.Error("signature data remains after verification") - } - - sig[10] ^= 80 - _, ok = priv.PublicKey.Verify(msg[:], sig) - if ok { - t.Errorf("corrupted signature (%x) of %x verified", sig, msg[:]) - } -} - -func setupConversation(t *testing.T) (alice, bob *Conversation) { - alicePrivateKey, _ := hex.DecodeString(alicePrivateKeyHex) - bobPrivateKey, _ := hex.DecodeString(bobPrivateKeyHex) - - alice, bob = new(Conversation), new(Conversation) - - alice.PrivateKey = new(PrivateKey) - bob.PrivateKey = new(PrivateKey) - alice.PrivateKey.Parse(alicePrivateKey) - bob.PrivateKey.Parse(bobPrivateKey) - alice.FragmentSize = 100 - bob.FragmentSize = 100 - - if alice.IsEncrypted() { - t.Error("Alice believes that the conversation is secure before we've started") - } - if bob.IsEncrypted() { - t.Error("Bob believes that the conversation is secure before we've started") - } - - performHandshake(t, alice, bob) - return alice, bob -} - -func performHandshake(t *testing.T, alice, bob *Conversation) { - var alicesMessage, bobsMessage [][]byte - var out []byte - var aliceChange, bobChange SecurityChange - var err error - alicesMessage = append(alicesMessage, []byte(QueryMessage)) - - for round := 0; len(alicesMessage) > 0 || len(bobsMessage) > 0; round++ { - bobsMessage = nil - for i, msg := range alicesMessage { - out, _, bobChange, bobsMessage, err = bob.Receive(msg) - if len(out) > 0 { - t.Errorf("Bob generated output during key exchange, round %d, message %d", round, i) - } - if err != nil { - t.Fatalf("Bob returned an error, round %d, message %d (%x): %s", round, i, msg, err) - } - if len(bobsMessage) > 0 && i != len(alicesMessage)-1 { - t.Errorf("Bob produced output while processing a fragment, round %d, message %d", round, i) - } - } - - alicesMessage = nil - for i, msg := range bobsMessage { - out, _, aliceChange, alicesMessage, err = alice.Receive(msg) - if len(out) > 0 { - t.Errorf("Alice generated output during key exchange, round %d, message %d", round, i) - } - if err != nil { - t.Fatalf("Alice returned an error, round %d, message %d (%x): %s", round, i, msg, err) - } - if len(alicesMessage) > 0 && i != len(bobsMessage)-1 { - t.Errorf("Alice produced output while processing a fragment, round %d, message %d", round, i) - } - } - } - - if aliceChange != NewKeys { - t.Errorf("Alice terminated without signaling new keys") - } - if bobChange != NewKeys { - t.Errorf("Bob terminated without signaling new keys") - } - - if !bytes.Equal(alice.SSID[:], bob.SSID[:]) { - t.Errorf("Session identifiers don't match. Alice has %x, Bob has %x", alice.SSID[:], bob.SSID[:]) - } - - if !alice.IsEncrypted() { - t.Error("Alice doesn't believe that the conversation is secure") - } - if !bob.IsEncrypted() { - t.Error("Bob doesn't believe that the conversation is secure") - } -} - -const ( - firstRoundTrip = iota - subsequentRoundTrip - noMACKeyCheck -) - -func roundTrip(t *testing.T, alice, bob *Conversation, message []byte, macKeyCheck int) { - alicesMessage, err := alice.Send(message) - if err != nil { - t.Errorf("Error from Alice sending message: %s", err) - } - - if len(alice.oldMACs) != 0 { - t.Errorf("Alice has not revealed all MAC keys") - } - - for i, msg := range alicesMessage { - out, encrypted, _, _, err := bob.Receive(msg) - - if err != nil { - t.Errorf("Error generated while processing test message: %s", err.Error()) - } - if len(out) > 0 { - if i != len(alicesMessage)-1 { - t.Fatal("Bob produced a message while processing a fragment of Alice's") - } - if !encrypted { - t.Errorf("Message was not marked as encrypted") - } - if !bytes.Equal(out, message) { - t.Errorf("Message corrupted: got %x, want %x", out, message) - } - } - } - - switch macKeyCheck { - case firstRoundTrip: - if len(bob.oldMACs) != 0 { - t.Errorf("Bob should not have MAC keys to reveal") - } - case subsequentRoundTrip: - if len(bob.oldMACs) != 40 { - t.Errorf("Bob has %d bytes of MAC keys to reveal, but should have 40", len(bob.oldMACs)) - } - } - - bobsMessage, err := bob.Send(message) - if err != nil { - t.Errorf("Error from Bob sending message: %s", err) - } - - if len(bob.oldMACs) != 0 { - t.Errorf("Bob has not revealed all MAC keys") - } - - for i, msg := range bobsMessage { - out, encrypted, _, _, err := alice.Receive(msg) - - if err != nil { - t.Errorf("Error generated while processing test message: %s", err.Error()) - } - if len(out) > 0 { - if i != len(bobsMessage)-1 { - t.Fatal("Alice produced a message while processing a fragment of Bob's") - } - if !encrypted { - t.Errorf("Message was not marked as encrypted") - } - if !bytes.Equal(out, message) { - t.Errorf("Message corrupted: got %x, want %x", out, message) - } - } - } - - switch macKeyCheck { - case firstRoundTrip: - if len(alice.oldMACs) != 20 { - t.Errorf("Alice has %d bytes of MAC keys to reveal, but should have 20", len(alice.oldMACs)) - } - case subsequentRoundTrip: - if len(alice.oldMACs) != 40 { - t.Errorf("Alice has %d bytes of MAC keys to reveal, but should have 40", len(alice.oldMACs)) - } - } -} - -func TestConversation(t *testing.T) { - alice, bob := setupConversation(t) - - var testMessages = [][]byte{ - []byte("hello"), []byte("bye"), - } - - roundTripType := firstRoundTrip - - for _, testMessage := range testMessages { - roundTrip(t, alice, bob, testMessage, roundTripType) - roundTripType = subsequentRoundTrip - } -} - -func TestGoodSMP(t *testing.T) { - var alice, bob Conversation - - alice.smp.secret = new(big.Int).SetInt64(42) - bob.smp.secret = alice.smp.secret - - var alicesMessages, bobsMessages []tlv - var aliceComplete, bobComplete bool - var err error - var out tlv - - alicesMessages = alice.startSMP("") - for round := 0; len(alicesMessages) > 0 || len(bobsMessages) > 0; round++ { - bobsMessages = bobsMessages[:0] - for i, msg := range alicesMessages { - out, bobComplete, err = bob.processSMP(msg) - if err != nil { - t.Errorf("Error from Bob in round %d: %s", round, err) - } - if bobComplete && i != len(alicesMessages)-1 { - t.Errorf("Bob returned a completed signal before processing all of Alice's messages in round %d", round) - } - if out.typ != 0 { - bobsMessages = append(bobsMessages, out) - } - } - - alicesMessages = alicesMessages[:0] - for i, msg := range bobsMessages { - out, aliceComplete, err = alice.processSMP(msg) - if err != nil { - t.Errorf("Error from Alice in round %d: %s", round, err) - } - if aliceComplete && i != len(bobsMessages)-1 { - t.Errorf("Alice returned a completed signal before processing all of Bob's messages in round %d", round) - } - if out.typ != 0 { - alicesMessages = append(alicesMessages, out) - } - } - } - - if !aliceComplete || !bobComplete { - t.Errorf("SMP completed without both sides reporting success: alice: %v, bob: %v\n", aliceComplete, bobComplete) - } -} - -func TestBadSMP(t *testing.T) { - var alice, bob Conversation - - alice.smp.secret = new(big.Int).SetInt64(42) - bob.smp.secret = new(big.Int).SetInt64(43) - - var alicesMessages, bobsMessages []tlv - - alicesMessages = alice.startSMP("") - for round := 0; len(alicesMessages) > 0 || len(bobsMessages) > 0; round++ { - bobsMessages = bobsMessages[:0] - for _, msg := range alicesMessages { - out, complete, _ := bob.processSMP(msg) - if complete { - t.Errorf("Bob signaled completion in round %d", round) - } - if out.typ != 0 { - bobsMessages = append(bobsMessages, out) - } - } - - alicesMessages = alicesMessages[:0] - for _, msg := range bobsMessages { - out, complete, _ := alice.processSMP(msg) - if complete { - t.Errorf("Alice signaled completion in round %d", round) - } - if out.typ != 0 { - alicesMessages = append(alicesMessages, out) - } - } - } -} - -func TestRehandshaking(t *testing.T) { - alice, bob := setupConversation(t) - roundTrip(t, alice, bob, []byte("test"), firstRoundTrip) - roundTrip(t, alice, bob, []byte("test 2"), subsequentRoundTrip) - roundTrip(t, alice, bob, []byte("test 3"), subsequentRoundTrip) - roundTrip(t, alice, bob, []byte("test 4"), subsequentRoundTrip) - roundTrip(t, alice, bob, []byte("test 5"), subsequentRoundTrip) - roundTrip(t, alice, bob, []byte("test 6"), subsequentRoundTrip) - roundTrip(t, alice, bob, []byte("test 7"), subsequentRoundTrip) - roundTrip(t, alice, bob, []byte("test 8"), subsequentRoundTrip) - performHandshake(t, alice, bob) - roundTrip(t, alice, bob, []byte("test"), noMACKeyCheck) - roundTrip(t, alice, bob, []byte("test 2"), noMACKeyCheck) -} - -func TestAgainstLibOTR(t *testing.T) { - // This test requires otr.c.test to be built as /tmp/a.out. - // If enabled, this tests runs forever performing OTR handshakes in a - // loop. - return - - alicePrivateKey, _ := hex.DecodeString(alicePrivateKeyHex) - var alice Conversation - alice.PrivateKey = new(PrivateKey) - alice.PrivateKey.Parse(alicePrivateKey) - - cmd := exec.Command("/tmp/a.out") - cmd.Stderr = os.Stderr - - out, err := cmd.StdinPipe() - if err != nil { - t.Fatal(err) - } - defer out.Close() - stdout, err := cmd.StdoutPipe() - if err != nil { - t.Fatal(err) - } - in := bufio.NewReader(stdout) - - if err := cmd.Start(); err != nil { - t.Fatal(err) - } - - out.Write([]byte(QueryMessage)) - out.Write([]byte("\n")) - var expectedText = []byte("test message") - - for { - line, isPrefix, err := in.ReadLine() - if isPrefix { - t.Fatal("line from subprocess too long") - } - if err != nil { - t.Fatal(err) - } - text, encrypted, change, alicesMessage, err := alice.Receive(line) - if err != nil { - t.Fatal(err) - } - for _, msg := range alicesMessage { - out.Write(msg) - out.Write([]byte("\n")) - } - if change == NewKeys { - alicesMessage, err := alice.Send([]byte("Go -> libotr test message")) - if err != nil { - t.Fatalf("error sending message: %s", err.Error()) - } else { - for _, msg := range alicesMessage { - out.Write(msg) - out.Write([]byte("\n")) - } - } - } - if len(text) > 0 { - if !bytes.Equal(text, expectedText) { - t.Fatalf("expected %x, but got %x", expectedText, text) - } - if !encrypted { - t.Fatal("message wasn't encrypted") - } - } - } -} diff --git a/vendor/golang.org/x/crypto/otr/smp.go b/vendor/golang.org/x/crypto/otr/smp.go deleted file mode 100644 index dc6de4ee0..000000000 --- a/vendor/golang.org/x/crypto/otr/smp.go +++ /dev/null @@ -1,572 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This file implements the Socialist Millionaires Protocol as described in -// http://www.cypherpunks.ca/otr/Protocol-v2-3.1.0.html. The protocol -// specification is required in order to understand this code and, where -// possible, the variable names in the code match up with the spec. - -package otr - -import ( - "bytes" - "crypto/sha256" - "errors" - "hash" - "math/big" -) - -type smpFailure string - -func (s smpFailure) Error() string { - return string(s) -} - -var smpFailureError = smpFailure("otr: SMP protocol failed") -var smpSecretMissingError = smpFailure("otr: mutual secret needed") - -const smpVersion = 1 - -const ( - smpState1 = iota - smpState2 - smpState3 - smpState4 -) - -type smpState struct { - state int - a2, a3, b2, b3, pb, qb *big.Int - g2a, g3a *big.Int - g2, g3 *big.Int - g3b, papb, qaqb, ra *big.Int - saved *tlv - secret *big.Int - question string -} - -func (c *Conversation) startSMP(question string) (tlvs []tlv) { - if c.smp.state != smpState1 { - tlvs = append(tlvs, c.generateSMPAbort()) - } - tlvs = append(tlvs, c.generateSMP1(question)) - c.smp.question = "" - c.smp.state = smpState2 - return -} - -func (c *Conversation) resetSMP() { - c.smp.state = smpState1 - c.smp.secret = nil - c.smp.question = "" -} - -func (c *Conversation) processSMP(in tlv) (out tlv, complete bool, err error) { - data := in.data - - switch in.typ { - case tlvTypeSMPAbort: - if c.smp.state != smpState1 { - err = smpFailureError - } - c.resetSMP() - return - case tlvTypeSMP1WithQuestion: - // We preprocess this into a SMP1 message. - nulPos := bytes.IndexByte(data, 0) - if nulPos == -1 { - err = errors.New("otr: SMP message with question didn't contain a NUL byte") - return - } - c.smp.question = string(data[:nulPos]) - data = data[nulPos+1:] - } - - numMPIs, data, ok := getU32(data) - if !ok || numMPIs > 20 { - err = errors.New("otr: corrupt SMP message") - return - } - - mpis := make([]*big.Int, numMPIs) - for i := range mpis { - var ok bool - mpis[i], data, ok = getMPI(data) - if !ok { - err = errors.New("otr: corrupt SMP message") - return - } - } - - switch in.typ { - case tlvTypeSMP1, tlvTypeSMP1WithQuestion: - if c.smp.state != smpState1 { - c.resetSMP() - out = c.generateSMPAbort() - return - } - if c.smp.secret == nil { - err = smpSecretMissingError - return - } - if err = c.processSMP1(mpis); err != nil { - return - } - c.smp.state = smpState3 - out = c.generateSMP2() - case tlvTypeSMP2: - if c.smp.state != smpState2 { - c.resetSMP() - out = c.generateSMPAbort() - return - } - if out, err = c.processSMP2(mpis); err != nil { - out = c.generateSMPAbort() - return - } - c.smp.state = smpState4 - case tlvTypeSMP3: - if c.smp.state != smpState3 { - c.resetSMP() - out = c.generateSMPAbort() - return - } - if out, err = c.processSMP3(mpis); err != nil { - return - } - c.smp.state = smpState1 - c.smp.secret = nil - complete = true - case tlvTypeSMP4: - if c.smp.state != smpState4 { - c.resetSMP() - out = c.generateSMPAbort() - return - } - if err = c.processSMP4(mpis); err != nil { - out = c.generateSMPAbort() - return - } - c.smp.state = smpState1 - c.smp.secret = nil - complete = true - default: - panic("unknown SMP message") - } - - return -} - -func (c *Conversation) calcSMPSecret(mutualSecret []byte, weStarted bool) { - h := sha256.New() - h.Write([]byte{smpVersion}) - if weStarted { - h.Write(c.PrivateKey.PublicKey.Fingerprint()) - h.Write(c.TheirPublicKey.Fingerprint()) - } else { - h.Write(c.TheirPublicKey.Fingerprint()) - h.Write(c.PrivateKey.PublicKey.Fingerprint()) - } - h.Write(c.SSID[:]) - h.Write(mutualSecret) - c.smp.secret = new(big.Int).SetBytes(h.Sum(nil)) -} - -func (c *Conversation) generateSMP1(question string) tlv { - var randBuf [16]byte - c.smp.a2 = c.randMPI(randBuf[:]) - c.smp.a3 = c.randMPI(randBuf[:]) - g2a := new(big.Int).Exp(g, c.smp.a2, p) - g3a := new(big.Int).Exp(g, c.smp.a3, p) - h := sha256.New() - - r2 := c.randMPI(randBuf[:]) - r := new(big.Int).Exp(g, r2, p) - c2 := new(big.Int).SetBytes(hashMPIs(h, 1, r)) - d2 := new(big.Int).Mul(c.smp.a2, c2) - d2.Sub(r2, d2) - d2.Mod(d2, q) - if d2.Sign() < 0 { - d2.Add(d2, q) - } - - r3 := c.randMPI(randBuf[:]) - r.Exp(g, r3, p) - c3 := new(big.Int).SetBytes(hashMPIs(h, 2, r)) - d3 := new(big.Int).Mul(c.smp.a3, c3) - d3.Sub(r3, d3) - d3.Mod(d3, q) - if d3.Sign() < 0 { - d3.Add(d3, q) - } - - var ret tlv - if len(question) > 0 { - ret.typ = tlvTypeSMP1WithQuestion - ret.data = append(ret.data, question...) - ret.data = append(ret.data, 0) - } else { - ret.typ = tlvTypeSMP1 - } - ret.data = appendU32(ret.data, 6) - ret.data = appendMPIs(ret.data, g2a, c2, d2, g3a, c3, d3) - return ret -} - -func (c *Conversation) processSMP1(mpis []*big.Int) error { - if len(mpis) != 6 { - return errors.New("otr: incorrect number of arguments in SMP1 message") - } - g2a := mpis[0] - c2 := mpis[1] - d2 := mpis[2] - g3a := mpis[3] - c3 := mpis[4] - d3 := mpis[5] - h := sha256.New() - - r := new(big.Int).Exp(g, d2, p) - s := new(big.Int).Exp(g2a, c2, p) - r.Mul(r, s) - r.Mod(r, p) - t := new(big.Int).SetBytes(hashMPIs(h, 1, r)) - if c2.Cmp(t) != 0 { - return errors.New("otr: ZKP c2 incorrect in SMP1 message") - } - r.Exp(g, d3, p) - s.Exp(g3a, c3, p) - r.Mul(r, s) - r.Mod(r, p) - t.SetBytes(hashMPIs(h, 2, r)) - if c3.Cmp(t) != 0 { - return errors.New("otr: ZKP c3 incorrect in SMP1 message") - } - - c.smp.g2a = g2a - c.smp.g3a = g3a - return nil -} - -func (c *Conversation) generateSMP2() tlv { - var randBuf [16]byte - b2 := c.randMPI(randBuf[:]) - c.smp.b3 = c.randMPI(randBuf[:]) - r2 := c.randMPI(randBuf[:]) - r3 := c.randMPI(randBuf[:]) - r4 := c.randMPI(randBuf[:]) - r5 := c.randMPI(randBuf[:]) - r6 := c.randMPI(randBuf[:]) - - g2b := new(big.Int).Exp(g, b2, p) - g3b := new(big.Int).Exp(g, c.smp.b3, p) - - r := new(big.Int).Exp(g, r2, p) - h := sha256.New() - c2 := new(big.Int).SetBytes(hashMPIs(h, 3, r)) - d2 := new(big.Int).Mul(b2, c2) - d2.Sub(r2, d2) - d2.Mod(d2, q) - if d2.Sign() < 0 { - d2.Add(d2, q) - } - - r.Exp(g, r3, p) - c3 := new(big.Int).SetBytes(hashMPIs(h, 4, r)) - d3 := new(big.Int).Mul(c.smp.b3, c3) - d3.Sub(r3, d3) - d3.Mod(d3, q) - if d3.Sign() < 0 { - d3.Add(d3, q) - } - - c.smp.g2 = new(big.Int).Exp(c.smp.g2a, b2, p) - c.smp.g3 = new(big.Int).Exp(c.smp.g3a, c.smp.b3, p) - c.smp.pb = new(big.Int).Exp(c.smp.g3, r4, p) - c.smp.qb = new(big.Int).Exp(g, r4, p) - r.Exp(c.smp.g2, c.smp.secret, p) - c.smp.qb.Mul(c.smp.qb, r) - c.smp.qb.Mod(c.smp.qb, p) - - s := new(big.Int) - s.Exp(c.smp.g2, r6, p) - r.Exp(g, r5, p) - s.Mul(r, s) - s.Mod(s, p) - r.Exp(c.smp.g3, r5, p) - cp := new(big.Int).SetBytes(hashMPIs(h, 5, r, s)) - - // D5 = r5 - r4 cP mod q and D6 = r6 - y cP mod q - - s.Mul(r4, cp) - r.Sub(r5, s) - d5 := new(big.Int).Mod(r, q) - if d5.Sign() < 0 { - d5.Add(d5, q) - } - - s.Mul(c.smp.secret, cp) - r.Sub(r6, s) - d6 := new(big.Int).Mod(r, q) - if d6.Sign() < 0 { - d6.Add(d6, q) - } - - var ret tlv - ret.typ = tlvTypeSMP2 - ret.data = appendU32(ret.data, 11) - ret.data = appendMPIs(ret.data, g2b, c2, d2, g3b, c3, d3, c.smp.pb, c.smp.qb, cp, d5, d6) - return ret -} - -func (c *Conversation) processSMP2(mpis []*big.Int) (out tlv, err error) { - if len(mpis) != 11 { - err = errors.New("otr: incorrect number of arguments in SMP2 message") - return - } - g2b := mpis[0] - c2 := mpis[1] - d2 := mpis[2] - g3b := mpis[3] - c3 := mpis[4] - d3 := mpis[5] - pb := mpis[6] - qb := mpis[7] - cp := mpis[8] - d5 := mpis[9] - d6 := mpis[10] - h := sha256.New() - - r := new(big.Int).Exp(g, d2, p) - s := new(big.Int).Exp(g2b, c2, p) - r.Mul(r, s) - r.Mod(r, p) - s.SetBytes(hashMPIs(h, 3, r)) - if c2.Cmp(s) != 0 { - err = errors.New("otr: ZKP c2 failed in SMP2 message") - return - } - - r.Exp(g, d3, p) - s.Exp(g3b, c3, p) - r.Mul(r, s) - r.Mod(r, p) - s.SetBytes(hashMPIs(h, 4, r)) - if c3.Cmp(s) != 0 { - err = errors.New("otr: ZKP c3 failed in SMP2 message") - return - } - - c.smp.g2 = new(big.Int).Exp(g2b, c.smp.a2, p) - c.smp.g3 = new(big.Int).Exp(g3b, c.smp.a3, p) - - r.Exp(g, d5, p) - s.Exp(c.smp.g2, d6, p) - r.Mul(r, s) - s.Exp(qb, cp, p) - r.Mul(r, s) - r.Mod(r, p) - - s.Exp(c.smp.g3, d5, p) - t := new(big.Int).Exp(pb, cp, p) - s.Mul(s, t) - s.Mod(s, p) - t.SetBytes(hashMPIs(h, 5, s, r)) - if cp.Cmp(t) != 0 { - err = errors.New("otr: ZKP cP failed in SMP2 message") - return - } - - var randBuf [16]byte - r4 := c.randMPI(randBuf[:]) - r5 := c.randMPI(randBuf[:]) - r6 := c.randMPI(randBuf[:]) - r7 := c.randMPI(randBuf[:]) - - pa := new(big.Int).Exp(c.smp.g3, r4, p) - r.Exp(c.smp.g2, c.smp.secret, p) - qa := new(big.Int).Exp(g, r4, p) - qa.Mul(qa, r) - qa.Mod(qa, p) - - r.Exp(g, r5, p) - s.Exp(c.smp.g2, r6, p) - r.Mul(r, s) - r.Mod(r, p) - - s.Exp(c.smp.g3, r5, p) - cp.SetBytes(hashMPIs(h, 6, s, r)) - - r.Mul(r4, cp) - d5 = new(big.Int).Sub(r5, r) - d5.Mod(d5, q) - if d5.Sign() < 0 { - d5.Add(d5, q) - } - - r.Mul(c.smp.secret, cp) - d6 = new(big.Int).Sub(r6, r) - d6.Mod(d6, q) - if d6.Sign() < 0 { - d6.Add(d6, q) - } - - r.ModInverse(qb, p) - qaqb := new(big.Int).Mul(qa, r) - qaqb.Mod(qaqb, p) - - ra := new(big.Int).Exp(qaqb, c.smp.a3, p) - r.Exp(qaqb, r7, p) - s.Exp(g, r7, p) - cr := new(big.Int).SetBytes(hashMPIs(h, 7, s, r)) - - r.Mul(c.smp.a3, cr) - d7 := new(big.Int).Sub(r7, r) - d7.Mod(d7, q) - if d7.Sign() < 0 { - d7.Add(d7, q) - } - - c.smp.g3b = g3b - c.smp.qaqb = qaqb - - r.ModInverse(pb, p) - c.smp.papb = new(big.Int).Mul(pa, r) - c.smp.papb.Mod(c.smp.papb, p) - c.smp.ra = ra - - out.typ = tlvTypeSMP3 - out.data = appendU32(out.data, 8) - out.data = appendMPIs(out.data, pa, qa, cp, d5, d6, ra, cr, d7) - return -} - -func (c *Conversation) processSMP3(mpis []*big.Int) (out tlv, err error) { - if len(mpis) != 8 { - err = errors.New("otr: incorrect number of arguments in SMP3 message") - return - } - pa := mpis[0] - qa := mpis[1] - cp := mpis[2] - d5 := mpis[3] - d6 := mpis[4] - ra := mpis[5] - cr := mpis[6] - d7 := mpis[7] - h := sha256.New() - - r := new(big.Int).Exp(g, d5, p) - s := new(big.Int).Exp(c.smp.g2, d6, p) - r.Mul(r, s) - s.Exp(qa, cp, p) - r.Mul(r, s) - r.Mod(r, p) - - s.Exp(c.smp.g3, d5, p) - t := new(big.Int).Exp(pa, cp, p) - s.Mul(s, t) - s.Mod(s, p) - t.SetBytes(hashMPIs(h, 6, s, r)) - if t.Cmp(cp) != 0 { - err = errors.New("otr: ZKP cP failed in SMP3 message") - return - } - - r.ModInverse(c.smp.qb, p) - qaqb := new(big.Int).Mul(qa, r) - qaqb.Mod(qaqb, p) - - r.Exp(qaqb, d7, p) - s.Exp(ra, cr, p) - r.Mul(r, s) - r.Mod(r, p) - - s.Exp(g, d7, p) - t.Exp(c.smp.g3a, cr, p) - s.Mul(s, t) - s.Mod(s, p) - t.SetBytes(hashMPIs(h, 7, s, r)) - if t.Cmp(cr) != 0 { - err = errors.New("otr: ZKP cR failed in SMP3 message") - return - } - - var randBuf [16]byte - r7 := c.randMPI(randBuf[:]) - rb := new(big.Int).Exp(qaqb, c.smp.b3, p) - - r.Exp(qaqb, r7, p) - s.Exp(g, r7, p) - cr = new(big.Int).SetBytes(hashMPIs(h, 8, s, r)) - - r.Mul(c.smp.b3, cr) - d7 = new(big.Int).Sub(r7, r) - d7.Mod(d7, q) - if d7.Sign() < 0 { - d7.Add(d7, q) - } - - out.typ = tlvTypeSMP4 - out.data = appendU32(out.data, 3) - out.data = appendMPIs(out.data, rb, cr, d7) - - r.ModInverse(c.smp.pb, p) - r.Mul(pa, r) - r.Mod(r, p) - s.Exp(ra, c.smp.b3, p) - if r.Cmp(s) != 0 { - err = smpFailureError - } - - return -} - -func (c *Conversation) processSMP4(mpis []*big.Int) error { - if len(mpis) != 3 { - return errors.New("otr: incorrect number of arguments in SMP4 message") - } - rb := mpis[0] - cr := mpis[1] - d7 := mpis[2] - h := sha256.New() - - r := new(big.Int).Exp(c.smp.qaqb, d7, p) - s := new(big.Int).Exp(rb, cr, p) - r.Mul(r, s) - r.Mod(r, p) - - s.Exp(g, d7, p) - t := new(big.Int).Exp(c.smp.g3b, cr, p) - s.Mul(s, t) - s.Mod(s, p) - t.SetBytes(hashMPIs(h, 8, s, r)) - if t.Cmp(cr) != 0 { - return errors.New("otr: ZKP cR failed in SMP4 message") - } - - r.Exp(rb, c.smp.a3, p) - if r.Cmp(c.smp.papb) != 0 { - return smpFailureError - } - - return nil -} - -func (c *Conversation) generateSMPAbort() tlv { - return tlv{typ: tlvTypeSMPAbort} -} - -func hashMPIs(h hash.Hash, magic byte, mpis ...*big.Int) []byte { - if h != nil { - h.Reset() - } else { - h = sha256.New() - } - - h.Write([]byte{magic}) - for _, mpi := range mpis { - h.Write(appendMPI(nil, mpi)) - } - return h.Sum(nil) -} diff --git a/vendor/golang.org/x/crypto/pbkdf2/pbkdf2.go b/vendor/golang.org/x/crypto/pbkdf2/pbkdf2.go deleted file mode 100644 index 593f65300..000000000 --- a/vendor/golang.org/x/crypto/pbkdf2/pbkdf2.go +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -/* -Package pbkdf2 implements the key derivation function PBKDF2 as defined in RFC -2898 / PKCS #5 v2.0. - -A key derivation function is useful when encrypting data based on a password -or any other not-fully-random data. It uses a pseudorandom function to derive -a secure encryption key based on the password. - -While v2.0 of the standard defines only one pseudorandom function to use, -HMAC-SHA1, the drafted v2.1 specification allows use of all five FIPS Approved -Hash Functions SHA-1, SHA-224, SHA-256, SHA-384 and SHA-512 for HMAC. To -choose, you can pass the `New` functions from the different SHA packages to -pbkdf2.Key. -*/ -package pbkdf2 // import "golang.org/x/crypto/pbkdf2" - -import ( - "crypto/hmac" - "hash" -) - -// Key derives a key from the password, salt and iteration count, returning a -// []byte of length keylen that can be used as cryptographic key. The key is -// derived based on the method described as PBKDF2 with the HMAC variant using -// the supplied hash function. -// -// For example, to use a HMAC-SHA-1 based PBKDF2 key derivation function, you -// can get a derived key for e.g. AES-256 (which needs a 32-byte key) by -// doing: -// -// dk := pbkdf2.Key([]byte("some password"), salt, 4096, 32, sha1.New) -// -// Remember to get a good random salt. At least 8 bytes is recommended by the -// RFC. -// -// Using a higher iteration count will increase the cost of an exhaustive -// search but will also make derivation proportionally slower. -func Key(password, salt []byte, iter, keyLen int, h func() hash.Hash) []byte { - prf := hmac.New(h, password) - hashLen := prf.Size() - numBlocks := (keyLen + hashLen - 1) / hashLen - - var buf [4]byte - dk := make([]byte, 0, numBlocks*hashLen) - U := make([]byte, hashLen) - for block := 1; block <= numBlocks; block++ { - // N.B.: || means concatenation, ^ means XOR - // for each block T_i = U_1 ^ U_2 ^ ... ^ U_iter - // U_1 = PRF(password, salt || uint(i)) - prf.Reset() - prf.Write(salt) - buf[0] = byte(block >> 24) - buf[1] = byte(block >> 16) - buf[2] = byte(block >> 8) - buf[3] = byte(block) - prf.Write(buf[:4]) - dk = prf.Sum(dk) - T := dk[len(dk)-hashLen:] - copy(U, T) - - // U_n = PRF(password, U_(n-1)) - for n := 2; n <= iter; n++ { - prf.Reset() - prf.Write(U) - U = U[:0] - U = prf.Sum(U) - for x := range U { - T[x] ^= U[x] - } - } - } - return dk[:keyLen] -} diff --git a/vendor/golang.org/x/crypto/pbkdf2/pbkdf2_test.go b/vendor/golang.org/x/crypto/pbkdf2/pbkdf2_test.go deleted file mode 100644 index 137924061..000000000 --- a/vendor/golang.org/x/crypto/pbkdf2/pbkdf2_test.go +++ /dev/null @@ -1,157 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package pbkdf2 - -import ( - "bytes" - "crypto/sha1" - "crypto/sha256" - "hash" - "testing" -) - -type testVector struct { - password string - salt string - iter int - output []byte -} - -// Test vectors from RFC 6070, http://tools.ietf.org/html/rfc6070 -var sha1TestVectors = []testVector{ - { - "password", - "salt", - 1, - []byte{ - 0x0c, 0x60, 0xc8, 0x0f, 0x96, 0x1f, 0x0e, 0x71, - 0xf3, 0xa9, 0xb5, 0x24, 0xaf, 0x60, 0x12, 0x06, - 0x2f, 0xe0, 0x37, 0xa6, - }, - }, - { - "password", - "salt", - 2, - []byte{ - 0xea, 0x6c, 0x01, 0x4d, 0xc7, 0x2d, 0x6f, 0x8c, - 0xcd, 0x1e, 0xd9, 0x2a, 0xce, 0x1d, 0x41, 0xf0, - 0xd8, 0xde, 0x89, 0x57, - }, - }, - { - "password", - "salt", - 4096, - []byte{ - 0x4b, 0x00, 0x79, 0x01, 0xb7, 0x65, 0x48, 0x9a, - 0xbe, 0xad, 0x49, 0xd9, 0x26, 0xf7, 0x21, 0xd0, - 0x65, 0xa4, 0x29, 0xc1, - }, - }, - // // This one takes too long - // { - // "password", - // "salt", - // 16777216, - // []byte{ - // 0xee, 0xfe, 0x3d, 0x61, 0xcd, 0x4d, 0xa4, 0xe4, - // 0xe9, 0x94, 0x5b, 0x3d, 0x6b, 0xa2, 0x15, 0x8c, - // 0x26, 0x34, 0xe9, 0x84, - // }, - // }, - { - "passwordPASSWORDpassword", - "saltSALTsaltSALTsaltSALTsaltSALTsalt", - 4096, - []byte{ - 0x3d, 0x2e, 0xec, 0x4f, 0xe4, 0x1c, 0x84, 0x9b, - 0x80, 0xc8, 0xd8, 0x36, 0x62, 0xc0, 0xe4, 0x4a, - 0x8b, 0x29, 0x1a, 0x96, 0x4c, 0xf2, 0xf0, 0x70, - 0x38, - }, - }, - { - "pass\000word", - "sa\000lt", - 4096, - []byte{ - 0x56, 0xfa, 0x6a, 0xa7, 0x55, 0x48, 0x09, 0x9d, - 0xcc, 0x37, 0xd7, 0xf0, 0x34, 0x25, 0xe0, 0xc3, - }, - }, -} - -// Test vectors from -// http://stackoverflow.com/questions/5130513/pbkdf2-hmac-sha2-test-vectors -var sha256TestVectors = []testVector{ - { - "password", - "salt", - 1, - []byte{ - 0x12, 0x0f, 0xb6, 0xcf, 0xfc, 0xf8, 0xb3, 0x2c, - 0x43, 0xe7, 0x22, 0x52, 0x56, 0xc4, 0xf8, 0x37, - 0xa8, 0x65, 0x48, 0xc9, - }, - }, - { - "password", - "salt", - 2, - []byte{ - 0xae, 0x4d, 0x0c, 0x95, 0xaf, 0x6b, 0x46, 0xd3, - 0x2d, 0x0a, 0xdf, 0xf9, 0x28, 0xf0, 0x6d, 0xd0, - 0x2a, 0x30, 0x3f, 0x8e, - }, - }, - { - "password", - "salt", - 4096, - []byte{ - 0xc5, 0xe4, 0x78, 0xd5, 0x92, 0x88, 0xc8, 0x41, - 0xaa, 0x53, 0x0d, 0xb6, 0x84, 0x5c, 0x4c, 0x8d, - 0x96, 0x28, 0x93, 0xa0, - }, - }, - { - "passwordPASSWORDpassword", - "saltSALTsaltSALTsaltSALTsaltSALTsalt", - 4096, - []byte{ - 0x34, 0x8c, 0x89, 0xdb, 0xcb, 0xd3, 0x2b, 0x2f, - 0x32, 0xd8, 0x14, 0xb8, 0x11, 0x6e, 0x84, 0xcf, - 0x2b, 0x17, 0x34, 0x7e, 0xbc, 0x18, 0x00, 0x18, - 0x1c, - }, - }, - { - "pass\000word", - "sa\000lt", - 4096, - []byte{ - 0x89, 0xb6, 0x9d, 0x05, 0x16, 0xf8, 0x29, 0x89, - 0x3c, 0x69, 0x62, 0x26, 0x65, 0x0a, 0x86, 0x87, - }, - }, -} - -func testHash(t *testing.T, h func() hash.Hash, hashName string, vectors []testVector) { - for i, v := range vectors { - o := Key([]byte(v.password), []byte(v.salt), v.iter, len(v.output), h) - if !bytes.Equal(o, v.output) { - t.Errorf("%s %d: expected %x, got %x", hashName, i, v.output, o) - } - } -} - -func TestWithHMACSHA1(t *testing.T) { - testHash(t, sha1.New, "SHA1", sha1TestVectors) -} - -func TestWithHMACSHA256(t *testing.T) { - testHash(t, sha256.New, "SHA256", sha256TestVectors) -} diff --git a/vendor/golang.org/x/crypto/pkcs12/bmp-string.go b/vendor/golang.org/x/crypto/pkcs12/bmp-string.go deleted file mode 100644 index 284d2a68f..000000000 --- a/vendor/golang.org/x/crypto/pkcs12/bmp-string.go +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package pkcs12 - -import ( - "errors" - "unicode/utf16" -) - -// bmpString returns s encoded in UCS-2 with a zero terminator. -func bmpString(s string) ([]byte, error) { - // References: - // https://tools.ietf.org/html/rfc7292#appendix-B.1 - // http://en.wikipedia.org/wiki/Plane_(Unicode)#Basic_Multilingual_Plane - // - non-BMP characters are encoded in UTF 16 by using a surrogate pair of 16-bit codes - // EncodeRune returns 0xfffd if the rune does not need special encoding - // - the above RFC provides the info that BMPStrings are NULL terminated. - - ret := make([]byte, 0, 2*len(s)+2) - - for _, r := range s { - if t, _ := utf16.EncodeRune(r); t != 0xfffd { - return nil, errors.New("pkcs12: string contains characters that cannot be encoded in UCS-2") - } - ret = append(ret, byte(r/256), byte(r%256)) - } - - return append(ret, 0, 0), nil -} - -func decodeBMPString(bmpString []byte) (string, error) { - if len(bmpString)%2 != 0 { - return "", errors.New("pkcs12: odd-length BMP string") - } - - // strip terminator if present - if l := len(bmpString); l >= 2 && bmpString[l-1] == 0 && bmpString[l-2] == 0 { - bmpString = bmpString[:l-2] - } - - s := make([]uint16, 0, len(bmpString)/2) - for len(bmpString) > 0 { - s = append(s, uint16(bmpString[0])<<8+uint16(bmpString[1])) - bmpString = bmpString[2:] - } - - return string(utf16.Decode(s)), nil -} diff --git a/vendor/golang.org/x/crypto/pkcs12/bmp-string_test.go b/vendor/golang.org/x/crypto/pkcs12/bmp-string_test.go deleted file mode 100644 index 7fca55f4e..000000000 --- a/vendor/golang.org/x/crypto/pkcs12/bmp-string_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package pkcs12 - -import ( - "bytes" - "encoding/hex" - "testing" -) - -var bmpStringTests = []struct { - in string - expectedHex string - shouldFail bool -}{ - {"", "0000", false}, - // Example from https://tools.ietf.org/html/rfc7292#appendix-B. - {"Beavis", "0042006500610076006900730000", false}, - // Some characters from the "Letterlike Symbols Unicode block". - {"\u2115 - Double-struck N", "21150020002d00200044006f00750062006c0065002d00730074007200750063006b0020004e0000", false}, - // any character outside the BMP should trigger an error. - {"\U0001f000 East wind (Mahjong)", "", true}, -} - -func TestBMPString(t *testing.T) { - for i, test := range bmpStringTests { - expected, err := hex.DecodeString(test.expectedHex) - if err != nil { - t.Fatalf("#%d: failed to decode expectation", i) - } - - out, err := bmpString(test.in) - if err == nil && test.shouldFail { - t.Errorf("#%d: expected to fail, but produced %x", i, out) - continue - } - - if err != nil && !test.shouldFail { - t.Errorf("#%d: failed unexpectedly: %s", i, err) - continue - } - - if !test.shouldFail { - if !bytes.Equal(out, expected) { - t.Errorf("#%d: expected %s, got %x", i, test.expectedHex, out) - continue - } - - roundTrip, err := decodeBMPString(out) - if err != nil { - t.Errorf("#%d: decoding output gave an error: %s", i, err) - continue - } - - if roundTrip != test.in { - t.Errorf("#%d: decoding output resulted in %q, but it should have been %q", i, roundTrip, test.in) - continue - } - } - } -} diff --git a/vendor/golang.org/x/crypto/pkcs12/crypto.go b/vendor/golang.org/x/crypto/pkcs12/crypto.go deleted file mode 100644 index 4bd4470ec..000000000 --- a/vendor/golang.org/x/crypto/pkcs12/crypto.go +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package pkcs12 - -import ( - "bytes" - "crypto/cipher" - "crypto/des" - "crypto/x509/pkix" - "encoding/asn1" - "errors" - - "golang.org/x/crypto/pkcs12/internal/rc2" -) - -var ( - oidPBEWithSHAAnd3KeyTripleDESCBC = asn1.ObjectIdentifier([]int{1, 2, 840, 113549, 1, 12, 1, 3}) - oidPBEWithSHAAnd40BitRC2CBC = asn1.ObjectIdentifier([]int{1, 2, 840, 113549, 1, 12, 1, 6}) -) - -// pbeCipher is an abstraction of a PKCS#12 cipher. -type pbeCipher interface { - // create returns a cipher.Block given a key. - create(key []byte) (cipher.Block, error) - // deriveKey returns a key derived from the given password and salt. - deriveKey(salt, password []byte, iterations int) []byte - // deriveKey returns an IV derived from the given password and salt. - deriveIV(salt, password []byte, iterations int) []byte -} - -type shaWithTripleDESCBC struct{} - -func (shaWithTripleDESCBC) create(key []byte) (cipher.Block, error) { - return des.NewTripleDESCipher(key) -} - -func (shaWithTripleDESCBC) deriveKey(salt, password []byte, iterations int) []byte { - return pbkdf(sha1Sum, 20, 64, salt, password, iterations, 1, 24) -} - -func (shaWithTripleDESCBC) deriveIV(salt, password []byte, iterations int) []byte { - return pbkdf(sha1Sum, 20, 64, salt, password, iterations, 2, 8) -} - -type shaWith40BitRC2CBC struct{} - -func (shaWith40BitRC2CBC) create(key []byte) (cipher.Block, error) { - return rc2.New(key, len(key)*8) -} - -func (shaWith40BitRC2CBC) deriveKey(salt, password []byte, iterations int) []byte { - return pbkdf(sha1Sum, 20, 64, salt, password, iterations, 1, 5) -} - -func (shaWith40BitRC2CBC) deriveIV(salt, password []byte, iterations int) []byte { - return pbkdf(sha1Sum, 20, 64, salt, password, iterations, 2, 8) -} - -type pbeParams struct { - Salt []byte - Iterations int -} - -func pbDecrypterFor(algorithm pkix.AlgorithmIdentifier, password []byte) (cipher.BlockMode, int, error) { - var cipherType pbeCipher - - switch { - case algorithm.Algorithm.Equal(oidPBEWithSHAAnd3KeyTripleDESCBC): - cipherType = shaWithTripleDESCBC{} - case algorithm.Algorithm.Equal(oidPBEWithSHAAnd40BitRC2CBC): - cipherType = shaWith40BitRC2CBC{} - default: - return nil, 0, NotImplementedError("algorithm " + algorithm.Algorithm.String() + " is not supported") - } - - var params pbeParams - if err := unmarshal(algorithm.Parameters.FullBytes, ¶ms); err != nil { - return nil, 0, err - } - - key := cipherType.deriveKey(params.Salt, password, params.Iterations) - iv := cipherType.deriveIV(params.Salt, password, params.Iterations) - - block, err := cipherType.create(key) - if err != nil { - return nil, 0, err - } - - return cipher.NewCBCDecrypter(block, iv), block.BlockSize(), nil -} - -func pbDecrypt(info decryptable, password []byte) (decrypted []byte, err error) { - cbc, blockSize, err := pbDecrypterFor(info.Algorithm(), password) - if err != nil { - return nil, err - } - - encrypted := info.Data() - if len(encrypted) == 0 { - return nil, errors.New("pkcs12: empty encrypted data") - } - if len(encrypted)%blockSize != 0 { - return nil, errors.New("pkcs12: input is not a multiple of the block size") - } - decrypted = make([]byte, len(encrypted)) - cbc.CryptBlocks(decrypted, encrypted) - - psLen := int(decrypted[len(decrypted)-1]) - if psLen == 0 || psLen > blockSize { - return nil, ErrDecryption - } - - if len(decrypted) < psLen { - return nil, ErrDecryption - } - ps := decrypted[len(decrypted)-psLen:] - decrypted = decrypted[:len(decrypted)-psLen] - if bytes.Compare(ps, bytes.Repeat([]byte{byte(psLen)}, psLen)) != 0 { - return nil, ErrDecryption - } - - return -} - -// decryptable abstracts a object that contains ciphertext. -type decryptable interface { - Algorithm() pkix.AlgorithmIdentifier - Data() []byte -} diff --git a/vendor/golang.org/x/crypto/pkcs12/crypto_test.go b/vendor/golang.org/x/crypto/pkcs12/crypto_test.go deleted file mode 100644 index eb4dae8fc..000000000 --- a/vendor/golang.org/x/crypto/pkcs12/crypto_test.go +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package pkcs12 - -import ( - "bytes" - "crypto/x509/pkix" - "encoding/asn1" - "testing" -) - -var sha1WithTripleDES = asn1.ObjectIdentifier([]int{1, 2, 840, 113549, 1, 12, 1, 3}) - -func TestPbDecrypterFor(t *testing.T) { - params, _ := asn1.Marshal(pbeParams{ - Salt: []byte{1, 2, 3, 4, 5, 6, 7, 8}, - Iterations: 2048, - }) - alg := pkix.AlgorithmIdentifier{ - Algorithm: asn1.ObjectIdentifier([]int{1, 2, 3}), - Parameters: asn1.RawValue{ - FullBytes: params, - }, - } - - pass, _ := bmpString("Sesame open") - - _, _, err := pbDecrypterFor(alg, pass) - if _, ok := err.(NotImplementedError); !ok { - t.Errorf("expected not implemented error, got: %T %s", err, err) - } - - alg.Algorithm = sha1WithTripleDES - cbc, blockSize, err := pbDecrypterFor(alg, pass) - if err != nil { - t.Errorf("unexpected error from pbDecrypterFor %v", err) - } - if blockSize != 8 { - t.Errorf("unexpected block size %d, wanted 8", blockSize) - } - - plaintext := []byte{1, 2, 3, 4, 5, 6, 7, 8} - expectedCiphertext := []byte{185, 73, 135, 249, 137, 1, 122, 247} - ciphertext := make([]byte, len(plaintext)) - cbc.CryptBlocks(ciphertext, plaintext) - - if bytes.Compare(ciphertext, expectedCiphertext) != 0 { - t.Errorf("bad ciphertext, got %x but wanted %x", ciphertext, expectedCiphertext) - } -} - -var pbDecryptTests = []struct { - in []byte - expected []byte - expectedError error -}{ - { - []byte("\x33\x73\xf3\x9f\xda\x49\xae\xfc\xa0\x9a\xdf\x5a\x58\xa0\xea\x46"), // 7 padding bytes - []byte("A secret!"), - nil, - }, - { - []byte("\x33\x73\xf3\x9f\xda\x49\xae\xfc\x96\x24\x2f\x71\x7e\x32\x3f\xe7"), // 8 padding bytes - []byte("A secret"), - nil, - }, - { - []byte("\x35\x0c\xc0\x8d\xab\xa9\x5d\x30\x7f\x9a\xec\x6a\xd8\x9b\x9c\xd9"), // 9 padding bytes, incorrect - nil, - ErrDecryption, - }, - { - []byte("\xb2\xf9\x6e\x06\x60\xae\x20\xcf\x08\xa0\x7b\xd9\x6b\x20\xef\x41"), // incorrect padding bytes: [ ... 0x04 0x02 ] - nil, - ErrDecryption, - }, -} - -func TestPbDecrypt(t *testing.T) { - for i, test := range pbDecryptTests { - decryptable := testDecryptable{ - data: test.in, - algorithm: pkix.AlgorithmIdentifier{ - Algorithm: sha1WithTripleDES, - Parameters: pbeParams{ - Salt: []byte("\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8"), - Iterations: 4096, - }.RawASN1(), - }, - } - password, _ := bmpString("sesame") - - plaintext, err := pbDecrypt(decryptable, password) - if err != test.expectedError { - t.Errorf("#%d: got error %q, but wanted %q", i, err, test.expectedError) - continue - } - - if !bytes.Equal(plaintext, test.expected) { - t.Errorf("#%d: got %x, but wanted %x", i, plaintext, test.expected) - } - } -} - -type testDecryptable struct { - data []byte - algorithm pkix.AlgorithmIdentifier -} - -func (d testDecryptable) Algorithm() pkix.AlgorithmIdentifier { return d.algorithm } -func (d testDecryptable) Data() []byte { return d.data } - -func (params pbeParams) RawASN1() (raw asn1.RawValue) { - asn1Bytes, err := asn1.Marshal(params) - if err != nil { - panic(err) - } - _, err = asn1.Unmarshal(asn1Bytes, &raw) - if err != nil { - panic(err) - } - return -} diff --git a/vendor/golang.org/x/crypto/pkcs12/errors.go b/vendor/golang.org/x/crypto/pkcs12/errors.go deleted file mode 100644 index 7377ce6fb..000000000 --- a/vendor/golang.org/x/crypto/pkcs12/errors.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package pkcs12 - -import "errors" - -var ( - // ErrDecryption represents a failure to decrypt the input. - ErrDecryption = errors.New("pkcs12: decryption error, incorrect padding") - - // ErrIncorrectPassword is returned when an incorrect password is detected. - // Usually, P12/PFX data is signed to be able to verify the password. - ErrIncorrectPassword = errors.New("pkcs12: decryption password incorrect") -) - -// NotImplementedError indicates that the input is not currently supported. -type NotImplementedError string - -func (e NotImplementedError) Error() string { - return "pkcs12: " + string(e) -} diff --git a/vendor/golang.org/x/crypto/pkcs12/internal/rc2/bench_test.go b/vendor/golang.org/x/crypto/pkcs12/internal/rc2/bench_test.go deleted file mode 100644 index 3347f338c..000000000 --- a/vendor/golang.org/x/crypto/pkcs12/internal/rc2/bench_test.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package rc2 - -import ( - "testing" -) - -func BenchmarkEncrypt(b *testing.B) { - r, _ := New([]byte{0, 0, 0, 0, 0, 0, 0, 0}, 64) - b.ResetTimer() - var src [8]byte - for i := 0; i < b.N; i++ { - r.Encrypt(src[:], src[:]) - } -} - -func BenchmarkDecrypt(b *testing.B) { - r, _ := New([]byte{0, 0, 0, 0, 0, 0, 0, 0}, 64) - b.ResetTimer() - var src [8]byte - for i := 0; i < b.N; i++ { - r.Decrypt(src[:], src[:]) - } -} diff --git a/vendor/golang.org/x/crypto/pkcs12/internal/rc2/rc2.go b/vendor/golang.org/x/crypto/pkcs12/internal/rc2/rc2.go deleted file mode 100644 index 8c7090258..000000000 --- a/vendor/golang.org/x/crypto/pkcs12/internal/rc2/rc2.go +++ /dev/null @@ -1,274 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package rc2 implements the RC2 cipher -/* -https://www.ietf.org/rfc/rfc2268.txt -http://people.csail.mit.edu/rivest/pubs/KRRR98.pdf - -This code is licensed under the MIT license. -*/ -package rc2 - -import ( - "crypto/cipher" - "encoding/binary" -) - -// The rc2 block size in bytes -const BlockSize = 8 - -type rc2Cipher struct { - k [64]uint16 -} - -// New returns a new rc2 cipher with the given key and effective key length t1 -func New(key []byte, t1 int) (cipher.Block, error) { - // TODO(dgryski): error checking for key length - return &rc2Cipher{ - k: expandKey(key, t1), - }, nil -} - -func (*rc2Cipher) BlockSize() int { return BlockSize } - -var piTable = [256]byte{ - 0xd9, 0x78, 0xf9, 0xc4, 0x19, 0xdd, 0xb5, 0xed, 0x28, 0xe9, 0xfd, 0x79, 0x4a, 0xa0, 0xd8, 0x9d, - 0xc6, 0x7e, 0x37, 0x83, 0x2b, 0x76, 0x53, 0x8e, 0x62, 0x4c, 0x64, 0x88, 0x44, 0x8b, 0xfb, 0xa2, - 0x17, 0x9a, 0x59, 0xf5, 0x87, 0xb3, 0x4f, 0x13, 0x61, 0x45, 0x6d, 0x8d, 0x09, 0x81, 0x7d, 0x32, - 0xbd, 0x8f, 0x40, 0xeb, 0x86, 0xb7, 0x7b, 0x0b, 0xf0, 0x95, 0x21, 0x22, 0x5c, 0x6b, 0x4e, 0x82, - 0x54, 0xd6, 0x65, 0x93, 0xce, 0x60, 0xb2, 0x1c, 0x73, 0x56, 0xc0, 0x14, 0xa7, 0x8c, 0xf1, 0xdc, - 0x12, 0x75, 0xca, 0x1f, 0x3b, 0xbe, 0xe4, 0xd1, 0x42, 0x3d, 0xd4, 0x30, 0xa3, 0x3c, 0xb6, 0x26, - 0x6f, 0xbf, 0x0e, 0xda, 0x46, 0x69, 0x07, 0x57, 0x27, 0xf2, 0x1d, 0x9b, 0xbc, 0x94, 0x43, 0x03, - 0xf8, 0x11, 0xc7, 0xf6, 0x90, 0xef, 0x3e, 0xe7, 0x06, 0xc3, 0xd5, 0x2f, 0xc8, 0x66, 0x1e, 0xd7, - 0x08, 0xe8, 0xea, 0xde, 0x80, 0x52, 0xee, 0xf7, 0x84, 0xaa, 0x72, 0xac, 0x35, 0x4d, 0x6a, 0x2a, - 0x96, 0x1a, 0xd2, 0x71, 0x5a, 0x15, 0x49, 0x74, 0x4b, 0x9f, 0xd0, 0x5e, 0x04, 0x18, 0xa4, 0xec, - 0xc2, 0xe0, 0x41, 0x6e, 0x0f, 0x51, 0xcb, 0xcc, 0x24, 0x91, 0xaf, 0x50, 0xa1, 0xf4, 0x70, 0x39, - 0x99, 0x7c, 0x3a, 0x85, 0x23, 0xb8, 0xb4, 0x7a, 0xfc, 0x02, 0x36, 0x5b, 0x25, 0x55, 0x97, 0x31, - 0x2d, 0x5d, 0xfa, 0x98, 0xe3, 0x8a, 0x92, 0xae, 0x05, 0xdf, 0x29, 0x10, 0x67, 0x6c, 0xba, 0xc9, - 0xd3, 0x00, 0xe6, 0xcf, 0xe1, 0x9e, 0xa8, 0x2c, 0x63, 0x16, 0x01, 0x3f, 0x58, 0xe2, 0x89, 0xa9, - 0x0d, 0x38, 0x34, 0x1b, 0xab, 0x33, 0xff, 0xb0, 0xbb, 0x48, 0x0c, 0x5f, 0xb9, 0xb1, 0xcd, 0x2e, - 0xc5, 0xf3, 0xdb, 0x47, 0xe5, 0xa5, 0x9c, 0x77, 0x0a, 0xa6, 0x20, 0x68, 0xfe, 0x7f, 0xc1, 0xad, -} - -func expandKey(key []byte, t1 int) [64]uint16 { - - l := make([]byte, 128) - copy(l, key) - - var t = len(key) - var t8 = (t1 + 7) / 8 - var tm = byte(255 % uint(1<<(8+uint(t1)-8*uint(t8)))) - - for i := len(key); i < 128; i++ { - l[i] = piTable[l[i-1]+l[uint8(i-t)]] - } - - l[128-t8] = piTable[l[128-t8]&tm] - - for i := 127 - t8; i >= 0; i-- { - l[i] = piTable[l[i+1]^l[i+t8]] - } - - var k [64]uint16 - - for i := range k { - k[i] = uint16(l[2*i]) + uint16(l[2*i+1])*256 - } - - return k -} - -func rotl16(x uint16, b uint) uint16 { - return (x >> (16 - b)) | (x << b) -} - -func (c *rc2Cipher) Encrypt(dst, src []byte) { - - r0 := binary.LittleEndian.Uint16(src[0:]) - r1 := binary.LittleEndian.Uint16(src[2:]) - r2 := binary.LittleEndian.Uint16(src[4:]) - r3 := binary.LittleEndian.Uint16(src[6:]) - - var j int - - for j <= 16 { - // mix r0 - r0 = r0 + c.k[j] + (r3 & r2) + ((^r3) & r1) - r0 = rotl16(r0, 1) - j++ - - // mix r1 - r1 = r1 + c.k[j] + (r0 & r3) + ((^r0) & r2) - r1 = rotl16(r1, 2) - j++ - - // mix r2 - r2 = r2 + c.k[j] + (r1 & r0) + ((^r1) & r3) - r2 = rotl16(r2, 3) - j++ - - // mix r3 - r3 = r3 + c.k[j] + (r2 & r1) + ((^r2) & r0) - r3 = rotl16(r3, 5) - j++ - - } - - r0 = r0 + c.k[r3&63] - r1 = r1 + c.k[r0&63] - r2 = r2 + c.k[r1&63] - r3 = r3 + c.k[r2&63] - - for j <= 40 { - - // mix r0 - r0 = r0 + c.k[j] + (r3 & r2) + ((^r3) & r1) - r0 = rotl16(r0, 1) - j++ - - // mix r1 - r1 = r1 + c.k[j] + (r0 & r3) + ((^r0) & r2) - r1 = rotl16(r1, 2) - j++ - - // mix r2 - r2 = r2 + c.k[j] + (r1 & r0) + ((^r1) & r3) - r2 = rotl16(r2, 3) - j++ - - // mix r3 - r3 = r3 + c.k[j] + (r2 & r1) + ((^r2) & r0) - r3 = rotl16(r3, 5) - j++ - - } - - r0 = r0 + c.k[r3&63] - r1 = r1 + c.k[r0&63] - r2 = r2 + c.k[r1&63] - r3 = r3 + c.k[r2&63] - - for j <= 60 { - - // mix r0 - r0 = r0 + c.k[j] + (r3 & r2) + ((^r3) & r1) - r0 = rotl16(r0, 1) - j++ - - // mix r1 - r1 = r1 + c.k[j] + (r0 & r3) + ((^r0) & r2) - r1 = rotl16(r1, 2) - j++ - - // mix r2 - r2 = r2 + c.k[j] + (r1 & r0) + ((^r1) & r3) - r2 = rotl16(r2, 3) - j++ - - // mix r3 - r3 = r3 + c.k[j] + (r2 & r1) + ((^r2) & r0) - r3 = rotl16(r3, 5) - j++ - } - - binary.LittleEndian.PutUint16(dst[0:], r0) - binary.LittleEndian.PutUint16(dst[2:], r1) - binary.LittleEndian.PutUint16(dst[4:], r2) - binary.LittleEndian.PutUint16(dst[6:], r3) -} - -func (c *rc2Cipher) Decrypt(dst, src []byte) { - - r0 := binary.LittleEndian.Uint16(src[0:]) - r1 := binary.LittleEndian.Uint16(src[2:]) - r2 := binary.LittleEndian.Uint16(src[4:]) - r3 := binary.LittleEndian.Uint16(src[6:]) - - j := 63 - - for j >= 44 { - // unmix r3 - r3 = rotl16(r3, 16-5) - r3 = r3 - c.k[j] - (r2 & r1) - ((^r2) & r0) - j-- - - // unmix r2 - r2 = rotl16(r2, 16-3) - r2 = r2 - c.k[j] - (r1 & r0) - ((^r1) & r3) - j-- - - // unmix r1 - r1 = rotl16(r1, 16-2) - r1 = r1 - c.k[j] - (r0 & r3) - ((^r0) & r2) - j-- - - // unmix r0 - r0 = rotl16(r0, 16-1) - r0 = r0 - c.k[j] - (r3 & r2) - ((^r3) & r1) - j-- - } - - r3 = r3 - c.k[r2&63] - r2 = r2 - c.k[r1&63] - r1 = r1 - c.k[r0&63] - r0 = r0 - c.k[r3&63] - - for j >= 20 { - // unmix r3 - r3 = rotl16(r3, 16-5) - r3 = r3 - c.k[j] - (r2 & r1) - ((^r2) & r0) - j-- - - // unmix r2 - r2 = rotl16(r2, 16-3) - r2 = r2 - c.k[j] - (r1 & r0) - ((^r1) & r3) - j-- - - // unmix r1 - r1 = rotl16(r1, 16-2) - r1 = r1 - c.k[j] - (r0 & r3) - ((^r0) & r2) - j-- - - // unmix r0 - r0 = rotl16(r0, 16-1) - r0 = r0 - c.k[j] - (r3 & r2) - ((^r3) & r1) - j-- - - } - - r3 = r3 - c.k[r2&63] - r2 = r2 - c.k[r1&63] - r1 = r1 - c.k[r0&63] - r0 = r0 - c.k[r3&63] - - for j >= 0 { - - // unmix r3 - r3 = rotl16(r3, 16-5) - r3 = r3 - c.k[j] - (r2 & r1) - ((^r2) & r0) - j-- - - // unmix r2 - r2 = rotl16(r2, 16-3) - r2 = r2 - c.k[j] - (r1 & r0) - ((^r1) & r3) - j-- - - // unmix r1 - r1 = rotl16(r1, 16-2) - r1 = r1 - c.k[j] - (r0 & r3) - ((^r0) & r2) - j-- - - // unmix r0 - r0 = rotl16(r0, 16-1) - r0 = r0 - c.k[j] - (r3 & r2) - ((^r3) & r1) - j-- - - } - - binary.LittleEndian.PutUint16(dst[0:], r0) - binary.LittleEndian.PutUint16(dst[2:], r1) - binary.LittleEndian.PutUint16(dst[4:], r2) - binary.LittleEndian.PutUint16(dst[6:], r3) -} diff --git a/vendor/golang.org/x/crypto/pkcs12/internal/rc2/rc2_test.go b/vendor/golang.org/x/crypto/pkcs12/internal/rc2/rc2_test.go deleted file mode 100644 index 8a49dfaf3..000000000 --- a/vendor/golang.org/x/crypto/pkcs12/internal/rc2/rc2_test.go +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package rc2 - -import ( - "bytes" - "encoding/hex" - "testing" -) - -func TestEncryptDecrypt(t *testing.T) { - - // TODO(dgryski): add the rest of the test vectors from the RFC - var tests = []struct { - key string - plain string - cipher string - t1 int - }{ - { - "0000000000000000", - "0000000000000000", - "ebb773f993278eff", - 63, - }, - { - "ffffffffffffffff", - "ffffffffffffffff", - "278b27e42e2f0d49", - 64, - }, - { - "3000000000000000", - "1000000000000001", - "30649edf9be7d2c2", - 64, - }, - { - "88", - "0000000000000000", - "61a8a244adacccf0", - 64, - }, - { - "88bca90e90875a", - "0000000000000000", - "6ccf4308974c267f", - 64, - }, - { - "88bca90e90875a7f0f79c384627bafb2", - "0000000000000000", - "1a807d272bbe5db1", - 64, - }, - { - "88bca90e90875a7f0f79c384627bafb2", - "0000000000000000", - "2269552ab0f85ca6", - 128, - }, - { - "88bca90e90875a7f0f79c384627bafb216f80a6f85920584c42fceb0be255daf1e", - "0000000000000000", - "5b78d3a43dfff1f1", - 129, - }, - } - - for _, tt := range tests { - k, _ := hex.DecodeString(tt.key) - p, _ := hex.DecodeString(tt.plain) - c, _ := hex.DecodeString(tt.cipher) - - b, _ := New(k, tt.t1) - - var dst [8]byte - - b.Encrypt(dst[:], p) - - if !bytes.Equal(dst[:], c) { - t.Errorf("encrypt failed: got % 2x wanted % 2x\n", dst, c) - } - - b.Decrypt(dst[:], c) - - if !bytes.Equal(dst[:], p) { - t.Errorf("decrypt failed: got % 2x wanted % 2x\n", dst, p) - } - } -} diff --git a/vendor/golang.org/x/crypto/pkcs12/mac.go b/vendor/golang.org/x/crypto/pkcs12/mac.go deleted file mode 100644 index 5f38aa7de..000000000 --- a/vendor/golang.org/x/crypto/pkcs12/mac.go +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package pkcs12 - -import ( - "crypto/hmac" - "crypto/sha1" - "crypto/x509/pkix" - "encoding/asn1" -) - -type macData struct { - Mac digestInfo - MacSalt []byte - Iterations int `asn1:"optional,default:1"` -} - -// from PKCS#7: -type digestInfo struct { - Algorithm pkix.AlgorithmIdentifier - Digest []byte -} - -var ( - oidSHA1 = asn1.ObjectIdentifier([]int{1, 3, 14, 3, 2, 26}) -) - -func verifyMac(macData *macData, message, password []byte) error { - if !macData.Mac.Algorithm.Algorithm.Equal(oidSHA1) { - return NotImplementedError("unknown digest algorithm: " + macData.Mac.Algorithm.Algorithm.String()) - } - - key := pbkdf(sha1Sum, 20, 64, macData.MacSalt, password, macData.Iterations, 3, 20) - - mac := hmac.New(sha1.New, key) - mac.Write(message) - expectedMAC := mac.Sum(nil) - - if !hmac.Equal(macData.Mac.Digest, expectedMAC) { - return ErrIncorrectPassword - } - return nil -} diff --git a/vendor/golang.org/x/crypto/pkcs12/mac_test.go b/vendor/golang.org/x/crypto/pkcs12/mac_test.go deleted file mode 100644 index 1ed4ff21e..000000000 --- a/vendor/golang.org/x/crypto/pkcs12/mac_test.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package pkcs12 - -import ( - "encoding/asn1" - "testing" -) - -func TestVerifyMac(t *testing.T) { - td := macData{ - Mac: digestInfo{ - Digest: []byte{0x18, 0x20, 0x3d, 0xff, 0x1e, 0x16, 0xf4, 0x92, 0xf2, 0xaf, 0xc8, 0x91, 0xa9, 0xba, 0xd6, 0xca, 0x9d, 0xee, 0x51, 0x93}, - }, - MacSalt: []byte{1, 2, 3, 4, 5, 6, 7, 8}, - Iterations: 2048, - } - - message := []byte{11, 12, 13, 14, 15} - password, _ := bmpString("") - - td.Mac.Algorithm.Algorithm = asn1.ObjectIdentifier([]int{1, 2, 3}) - err := verifyMac(&td, message, password) - if _, ok := err.(NotImplementedError); !ok { - t.Errorf("err: %v", err) - } - - td.Mac.Algorithm.Algorithm = asn1.ObjectIdentifier([]int{1, 3, 14, 3, 2, 26}) - err = verifyMac(&td, message, password) - if err != ErrIncorrectPassword { - t.Errorf("Expected incorrect password, got err: %v", err) - } - - password, _ = bmpString("Sesame open") - err = verifyMac(&td, message, password) - if err != nil { - t.Errorf("err: %v", err) - } - -} diff --git a/vendor/golang.org/x/crypto/pkcs12/pbkdf.go b/vendor/golang.org/x/crypto/pkcs12/pbkdf.go deleted file mode 100644 index 5c419d41e..000000000 --- a/vendor/golang.org/x/crypto/pkcs12/pbkdf.go +++ /dev/null @@ -1,170 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package pkcs12 - -import ( - "bytes" - "crypto/sha1" - "math/big" -) - -var ( - one = big.NewInt(1) -) - -// sha1Sum returns the SHA-1 hash of in. -func sha1Sum(in []byte) []byte { - sum := sha1.Sum(in) - return sum[:] -} - -// fillWithRepeats returns v*ceiling(len(pattern) / v) bytes consisting of -// repeats of pattern. -func fillWithRepeats(pattern []byte, v int) []byte { - if len(pattern) == 0 { - return nil - } - outputLen := v * ((len(pattern) + v - 1) / v) - return bytes.Repeat(pattern, (outputLen+len(pattern)-1)/len(pattern))[:outputLen] -} - -func pbkdf(hash func([]byte) []byte, u, v int, salt, password []byte, r int, ID byte, size int) (key []byte) { - // implementation of https://tools.ietf.org/html/rfc7292#appendix-B.2 , RFC text verbatim in comments - - // Let H be a hash function built around a compression function f: - - // Z_2^u x Z_2^v -> Z_2^u - - // (that is, H has a chaining variable and output of length u bits, and - // the message input to the compression function of H is v bits). The - // values for u and v are as follows: - - // HASH FUNCTION VALUE u VALUE v - // MD2, MD5 128 512 - // SHA-1 160 512 - // SHA-224 224 512 - // SHA-256 256 512 - // SHA-384 384 1024 - // SHA-512 512 1024 - // SHA-512/224 224 1024 - // SHA-512/256 256 1024 - - // Furthermore, let r be the iteration count. - - // We assume here that u and v are both multiples of 8, as are the - // lengths of the password and salt strings (which we denote by p and s, - // respectively) and the number n of pseudorandom bits required. In - // addition, u and v are of course non-zero. - - // For information on security considerations for MD5 [19], see [25] and - // [1], and on those for MD2, see [18]. - - // The following procedure can be used to produce pseudorandom bits for - // a particular "purpose" that is identified by a byte called "ID". - // This standard specifies 3 different values for the ID byte: - - // 1. If ID=1, then the pseudorandom bits being produced are to be used - // as key material for performing encryption or decryption. - - // 2. If ID=2, then the pseudorandom bits being produced are to be used - // as an IV (Initial Value) for encryption or decryption. - - // 3. If ID=3, then the pseudorandom bits being produced are to be used - // as an integrity key for MACing. - - // 1. Construct a string, D (the "diversifier"), by concatenating v/8 - // copies of ID. - var D []byte - for i := 0; i < v; i++ { - D = append(D, ID) - } - - // 2. Concatenate copies of the salt together to create a string S of - // length v(ceiling(s/v)) bits (the final copy of the salt may be - // truncated to create S). Note that if the salt is the empty - // string, then so is S. - - S := fillWithRepeats(salt, v) - - // 3. Concatenate copies of the password together to create a string P - // of length v(ceiling(p/v)) bits (the final copy of the password - // may be truncated to create P). Note that if the password is the - // empty string, then so is P. - - P := fillWithRepeats(password, v) - - // 4. Set I=S||P to be the concatenation of S and P. - I := append(S, P...) - - // 5. Set c=ceiling(n/u). - c := (size + u - 1) / u - - // 6. For i=1, 2, ..., c, do the following: - A := make([]byte, c*20) - var IjBuf []byte - for i := 0; i < c; i++ { - // A. Set A2=H^r(D||I). (i.e., the r-th hash of D||1, - // H(H(H(... H(D||I)))) - Ai := hash(append(D, I...)) - for j := 1; j < r; j++ { - Ai = hash(Ai) - } - copy(A[i*20:], Ai[:]) - - if i < c-1 { // skip on last iteration - // B. Concatenate copies of Ai to create a string B of length v - // bits (the final copy of Ai may be truncated to create B). - var B []byte - for len(B) < v { - B = append(B, Ai[:]...) - } - B = B[:v] - - // C. Treating I as a concatenation I_0, I_1, ..., I_(k-1) of v-bit - // blocks, where k=ceiling(s/v)+ceiling(p/v), modify I by - // setting I_j=(I_j+B+1) mod 2^v for each j. - { - Bbi := new(big.Int).SetBytes(B) - Ij := new(big.Int) - - for j := 0; j < len(I)/v; j++ { - Ij.SetBytes(I[j*v : (j+1)*v]) - Ij.Add(Ij, Bbi) - Ij.Add(Ij, one) - Ijb := Ij.Bytes() - // We expect Ijb to be exactly v bytes, - // if it is longer or shorter we must - // adjust it accordingly. - if len(Ijb) > v { - Ijb = Ijb[len(Ijb)-v:] - } - if len(Ijb) < v { - if IjBuf == nil { - IjBuf = make([]byte, v) - } - bytesShort := v - len(Ijb) - for i := 0; i < bytesShort; i++ { - IjBuf[i] = 0 - } - copy(IjBuf[bytesShort:], Ijb) - Ijb = IjBuf - } - copy(I[j*v:(j+1)*v], Ijb) - } - } - } - } - // 7. Concatenate A_1, A_2, ..., A_c together to form a pseudorandom - // bit string, A. - - // 8. Use the first n bits of A as the output of this entire process. - return A[:size] - - // If the above process is being used to generate a DES key, the process - // should be used to create 64 random bits, and the key's parity bits - // should be set after the 64 bits have been produced. Similar concerns - // hold for 2-key and 3-key triple-DES keys, for CDMF keys, and for any - // similar keys with parity bits "built into them". -} diff --git a/vendor/golang.org/x/crypto/pkcs12/pbkdf_test.go b/vendor/golang.org/x/crypto/pkcs12/pbkdf_test.go deleted file mode 100644 index 262037d7e..000000000 --- a/vendor/golang.org/x/crypto/pkcs12/pbkdf_test.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package pkcs12 - -import ( - "bytes" - "testing" -) - -func TestThatPBKDFWorksCorrectlyForLongKeys(t *testing.T) { - cipherInfo := shaWithTripleDESCBC{} - - salt := []byte("\xff\xff\xff\xff\xff\xff\xff\xff") - password, _ := bmpString("sesame") - key := cipherInfo.deriveKey(salt, password, 2048) - - if expected := []byte("\x7c\xd9\xfd\x3e\x2b\x3b\xe7\x69\x1a\x44\xe3\xbe\xf0\xf9\xea\x0f\xb9\xb8\x97\xd4\xe3\x25\xd9\xd1"); bytes.Compare(key, expected) != 0 { - t.Fatalf("expected key '%x', but found '%x'", expected, key) - } -} - -func TestThatPBKDFHandlesLeadingZeros(t *testing.T) { - // This test triggers a case where I_j (in step 6C) ends up with leading zero - // byte, meaning that len(Ijb) < v (leading zeros get stripped by big.Int). - // This was previously causing bug whereby certain inputs would break the - // derivation and produce the wrong output. - key := pbkdf(sha1Sum, 20, 64, []byte("\xf3\x7e\x05\xb5\x18\x32\x4b\x4b"), []byte("\x00\x00"), 2048, 1, 24) - expected := []byte("\x00\xf7\x59\xff\x47\xd1\x4d\xd0\x36\x65\xd5\x94\x3c\xb3\xc4\xa3\x9a\x25\x55\xc0\x2a\xed\x66\xe1") - if bytes.Compare(key, expected) != 0 { - t.Fatalf("expected key '%x', but found '%x'", expected, key) - } -} diff --git a/vendor/golang.org/x/crypto/pkcs12/pkcs12.go b/vendor/golang.org/x/crypto/pkcs12/pkcs12.go deleted file mode 100644 index eff9ad3a9..000000000 --- a/vendor/golang.org/x/crypto/pkcs12/pkcs12.go +++ /dev/null @@ -1,346 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package pkcs12 implements some of PKCS#12. -// -// This implementation is distilled from https://tools.ietf.org/html/rfc7292 -// and referenced documents. It is intended for decoding P12/PFX-stored -// certificates and keys for use with the crypto/tls package. -package pkcs12 - -import ( - "crypto/ecdsa" - "crypto/rsa" - "crypto/x509" - "crypto/x509/pkix" - "encoding/asn1" - "encoding/hex" - "encoding/pem" - "errors" -) - -var ( - oidDataContentType = asn1.ObjectIdentifier([]int{1, 2, 840, 113549, 1, 7, 1}) - oidEncryptedDataContentType = asn1.ObjectIdentifier([]int{1, 2, 840, 113549, 1, 7, 6}) - - oidFriendlyName = asn1.ObjectIdentifier([]int{1, 2, 840, 113549, 1, 9, 20}) - oidLocalKeyID = asn1.ObjectIdentifier([]int{1, 2, 840, 113549, 1, 9, 21}) - oidMicrosoftCSPName = asn1.ObjectIdentifier([]int{1, 3, 6, 1, 4, 1, 311, 17, 1}) -) - -type pfxPdu struct { - Version int - AuthSafe contentInfo - MacData macData `asn1:"optional"` -} - -type contentInfo struct { - ContentType asn1.ObjectIdentifier - Content asn1.RawValue `asn1:"tag:0,explicit,optional"` -} - -type encryptedData struct { - Version int - EncryptedContentInfo encryptedContentInfo -} - -type encryptedContentInfo struct { - ContentType asn1.ObjectIdentifier - ContentEncryptionAlgorithm pkix.AlgorithmIdentifier - EncryptedContent []byte `asn1:"tag:0,optional"` -} - -func (i encryptedContentInfo) Algorithm() pkix.AlgorithmIdentifier { - return i.ContentEncryptionAlgorithm -} - -func (i encryptedContentInfo) Data() []byte { return i.EncryptedContent } - -type safeBag struct { - Id asn1.ObjectIdentifier - Value asn1.RawValue `asn1:"tag:0,explicit"` - Attributes []pkcs12Attribute `asn1:"set,optional"` -} - -type pkcs12Attribute struct { - Id asn1.ObjectIdentifier - Value asn1.RawValue `asn1:"set"` -} - -type encryptedPrivateKeyInfo struct { - AlgorithmIdentifier pkix.AlgorithmIdentifier - EncryptedData []byte -} - -func (i encryptedPrivateKeyInfo) Algorithm() pkix.AlgorithmIdentifier { - return i.AlgorithmIdentifier -} - -func (i encryptedPrivateKeyInfo) Data() []byte { - return i.EncryptedData -} - -// PEM block types -const ( - certificateType = "CERTIFICATE" - privateKeyType = "PRIVATE KEY" -) - -// unmarshal calls asn1.Unmarshal, but also returns an error if there is any -// trailing data after unmarshaling. -func unmarshal(in []byte, out interface{}) error { - trailing, err := asn1.Unmarshal(in, out) - if err != nil { - return err - } - if len(trailing) != 0 { - return errors.New("pkcs12: trailing data found") - } - return nil -} - -// ConvertToPEM converts all "safe bags" contained in pfxData to PEM blocks. -func ToPEM(pfxData []byte, password string) ([]*pem.Block, error) { - encodedPassword, err := bmpString(password) - if err != nil { - return nil, ErrIncorrectPassword - } - - bags, encodedPassword, err := getSafeContents(pfxData, encodedPassword) - - if err != nil { - return nil, err - } - - blocks := make([]*pem.Block, 0, len(bags)) - for _, bag := range bags { - block, err := convertBag(&bag, encodedPassword) - if err != nil { - return nil, err - } - blocks = append(blocks, block) - } - - return blocks, nil -} - -func convertBag(bag *safeBag, password []byte) (*pem.Block, error) { - block := &pem.Block{ - Headers: make(map[string]string), - } - - for _, attribute := range bag.Attributes { - k, v, err := convertAttribute(&attribute) - if err != nil { - return nil, err - } - block.Headers[k] = v - } - - switch { - case bag.Id.Equal(oidCertBag): - block.Type = certificateType - certsData, err := decodeCertBag(bag.Value.Bytes) - if err != nil { - return nil, err - } - block.Bytes = certsData - case bag.Id.Equal(oidPKCS8ShroundedKeyBag): - block.Type = privateKeyType - - key, err := decodePkcs8ShroudedKeyBag(bag.Value.Bytes, password) - if err != nil { - return nil, err - } - - switch key := key.(type) { - case *rsa.PrivateKey: - block.Bytes = x509.MarshalPKCS1PrivateKey(key) - case *ecdsa.PrivateKey: - block.Bytes, err = x509.MarshalECPrivateKey(key) - if err != nil { - return nil, err - } - default: - return nil, errors.New("found unknown private key type in PKCS#8 wrapping") - } - default: - return nil, errors.New("don't know how to convert a safe bag of type " + bag.Id.String()) - } - return block, nil -} - -func convertAttribute(attribute *pkcs12Attribute) (key, value string, err error) { - isString := false - - switch { - case attribute.Id.Equal(oidFriendlyName): - key = "friendlyName" - isString = true - case attribute.Id.Equal(oidLocalKeyID): - key = "localKeyId" - case attribute.Id.Equal(oidMicrosoftCSPName): - // This key is chosen to match OpenSSL. - key = "Microsoft CSP Name" - isString = true - default: - return "", "", errors.New("pkcs12: unknown attribute with OID " + attribute.Id.String()) - } - - if isString { - if err := unmarshal(attribute.Value.Bytes, &attribute.Value); err != nil { - return "", "", err - } - if value, err = decodeBMPString(attribute.Value.Bytes); err != nil { - return "", "", err - } - } else { - var id []byte - if err := unmarshal(attribute.Value.Bytes, &id); err != nil { - return "", "", err - } - value = hex.EncodeToString(id) - } - - return key, value, nil -} - -// Decode extracts a certificate and private key from pfxData. This function -// assumes that there is only one certificate and only one private key in the -// pfxData. -func Decode(pfxData []byte, password string) (privateKey interface{}, certificate *x509.Certificate, err error) { - encodedPassword, err := bmpString(password) - if err != nil { - return nil, nil, err - } - - bags, encodedPassword, err := getSafeContents(pfxData, encodedPassword) - if err != nil { - return nil, nil, err - } - - if len(bags) != 2 { - err = errors.New("pkcs12: expected exactly two safe bags in the PFX PDU") - return - } - - for _, bag := range bags { - switch { - case bag.Id.Equal(oidCertBag): - if certificate != nil { - err = errors.New("pkcs12: expected exactly one certificate bag") - } - - certsData, err := decodeCertBag(bag.Value.Bytes) - if err != nil { - return nil, nil, err - } - certs, err := x509.ParseCertificates(certsData) - if err != nil { - return nil, nil, err - } - if len(certs) != 1 { - err = errors.New("pkcs12: expected exactly one certificate in the certBag") - return nil, nil, err - } - certificate = certs[0] - - case bag.Id.Equal(oidPKCS8ShroundedKeyBag): - if privateKey != nil { - err = errors.New("pkcs12: expected exactly one key bag") - } - - if privateKey, err = decodePkcs8ShroudedKeyBag(bag.Value.Bytes, encodedPassword); err != nil { - return nil, nil, err - } - } - } - - if certificate == nil { - return nil, nil, errors.New("pkcs12: certificate missing") - } - if privateKey == nil { - return nil, nil, errors.New("pkcs12: private key missing") - } - - return -} - -func getSafeContents(p12Data, password []byte) (bags []safeBag, updatedPassword []byte, err error) { - pfx := new(pfxPdu) - if err := unmarshal(p12Data, pfx); err != nil { - return nil, nil, errors.New("pkcs12: error reading P12 data: " + err.Error()) - } - - if pfx.Version != 3 { - return nil, nil, NotImplementedError("can only decode v3 PFX PDU's") - } - - if !pfx.AuthSafe.ContentType.Equal(oidDataContentType) { - return nil, nil, NotImplementedError("only password-protected PFX is implemented") - } - - // unmarshal the explicit bytes in the content for type 'data' - if err := unmarshal(pfx.AuthSafe.Content.Bytes, &pfx.AuthSafe.Content); err != nil { - return nil, nil, err - } - - if len(pfx.MacData.Mac.Algorithm.Algorithm) == 0 { - return nil, nil, errors.New("pkcs12: no MAC in data") - } - - if err := verifyMac(&pfx.MacData, pfx.AuthSafe.Content.Bytes, password); err != nil { - if err == ErrIncorrectPassword && len(password) == 2 && password[0] == 0 && password[1] == 0 { - // some implementations use an empty byte array - // for the empty string password try one more - // time with empty-empty password - password = nil - err = verifyMac(&pfx.MacData, pfx.AuthSafe.Content.Bytes, password) - } - if err != nil { - return nil, nil, err - } - } - - var authenticatedSafe []contentInfo - if err := unmarshal(pfx.AuthSafe.Content.Bytes, &authenticatedSafe); err != nil { - return nil, nil, err - } - - if len(authenticatedSafe) != 2 { - return nil, nil, NotImplementedError("expected exactly two items in the authenticated safe") - } - - for _, ci := range authenticatedSafe { - var data []byte - - switch { - case ci.ContentType.Equal(oidDataContentType): - if err := unmarshal(ci.Content.Bytes, &data); err != nil { - return nil, nil, err - } - case ci.ContentType.Equal(oidEncryptedDataContentType): - var encryptedData encryptedData - if err := unmarshal(ci.Content.Bytes, &encryptedData); err != nil { - return nil, nil, err - } - if encryptedData.Version != 0 { - return nil, nil, NotImplementedError("only version 0 of EncryptedData is supported") - } - if data, err = pbDecrypt(encryptedData.EncryptedContentInfo, password); err != nil { - return nil, nil, err - } - default: - return nil, nil, NotImplementedError("only data and encryptedData content types are supported in authenticated safe") - } - - var safeContents []safeBag - if err := unmarshal(data, &safeContents); err != nil { - return nil, nil, err - } - bags = append(bags, safeContents...) - } - - return bags, password, nil -} diff --git a/vendor/golang.org/x/crypto/pkcs12/pkcs12_test.go b/vendor/golang.org/x/crypto/pkcs12/pkcs12_test.go deleted file mode 100644 index 14dd2a6c5..000000000 --- a/vendor/golang.org/x/crypto/pkcs12/pkcs12_test.go +++ /dev/null @@ -1,138 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package pkcs12 - -import ( - "crypto/rsa" - "crypto/tls" - "encoding/base64" - "encoding/pem" - "testing" -) - -func TestPfx(t *testing.T) { - for commonName, base64P12 := range testdata { - p12, _ := base64.StdEncoding.DecodeString(base64P12) - - priv, cert, err := Decode(p12, "") - if err != nil { - t.Fatal(err) - } - - if err := priv.(*rsa.PrivateKey).Validate(); err != nil { - t.Errorf("error while validating private key: %v", err) - } - - if cert.Subject.CommonName != commonName { - t.Errorf("expected common name to be %q, but found %q", commonName, cert.Subject.CommonName) - } - } -} - -func TestPEM(t *testing.T) { - for commonName, base64P12 := range testdata { - p12, _ := base64.StdEncoding.DecodeString(base64P12) - - blocks, err := ToPEM(p12, "") - if err != nil { - t.Fatalf("error while converting to PEM: %s", err) - } - - var pemData []byte - for _, b := range blocks { - pemData = append(pemData, pem.EncodeToMemory(b)...) - } - - cert, err := tls.X509KeyPair(pemData, pemData) - if err != nil { - t.Errorf("err while converting to key pair: %v", err) - } - config := tls.Config{ - Certificates: []tls.Certificate{cert}, - } - config.BuildNameToCertificate() - - if _, exists := config.NameToCertificate[commonName]; !exists { - t.Errorf("did not find our cert in PEM?: %v", config.NameToCertificate) - } - } -} - -func ExampleToPEM() { - p12, _ := base64.StdEncoding.DecodeString(`MIIJzgIBAzCCCZQGCS ... CA+gwggPk==`) - - blocks, err := ToPEM(p12, "password") - if err != nil { - panic(err) - } - - var pemData []byte - for _, b := range blocks { - pemData = append(pemData, pem.EncodeToMemory(b)...) - } - - // then use PEM data for tls to construct tls certificate: - cert, err := tls.X509KeyPair(pemData, pemData) - if err != nil { - panic(err) - } - - config := &tls.Config{ - Certificates: []tls.Certificate{cert}, - } - - _ = config -} - -var testdata = map[string]string{ - // 'null' password test case - "Windows Azure Tools": `MIIKDAIBAzCCCcwGCSqGSIb3DQEHAaCCCb0Eggm5MIIJtTCCBe4GCSqGSIb3DQEHAaCCBd8EggXbMIIF1zCCBdMGCyqGSIb3DQEMCgECoIIE7jCCBOowHAYKKoZIhvcNAQwBAzAOBAhStUNnlTGV+gICB9AEggTIJ81JIossF6boFWpPtkiQRPtI6DW6e9QD4/WvHAVrM2bKdpMzSMsCML5NyuddANTKHBVq00Jc9keqGNAqJPKkjhSUebzQFyhe0E1oI9T4zY5UKr/I8JclOeccH4QQnsySzYUG2SnniXnQ+JrG3juetli7EKth9h6jLc6xbubPadY5HMB3wL/eG/kJymiXwU2KQ9Mgd4X6jbcV+NNCE/8jbZHvSTCPeYTJIjxfeX61Sj5kFKUCzERbsnpyevhY3X0eYtEDezZQarvGmXtMMdzf8HJHkWRdk9VLDLgjk8uiJif/+X4FohZ37ig0CpgC2+dP4DGugaZZ51hb8tN9GeCKIsrmWogMXDIVd0OACBp/EjJVmFB6y0kUCXxUE0TZt0XA1tjAGJcjDUpBvTntZjPsnH/4ZySy+s2d9OOhJ6pzRQBRm360TzkFdSwk9DLiLdGfv4pwMMu/vNGBlqjP/1sQtj+jprJiD1sDbCl4AdQZVoMBQHadF2uSD4/o17XG/Ci0r2h6Htc2yvZMAbEY4zMjjIn2a+vqIxD6onexaek1R3zbkS9j19D6EN9EWn8xgz80YRCyW65znZk8xaIhhvlU/mg7sTxeyuqroBZNcq6uDaQTehDpyH7bY2l4zWRpoj10a6JfH2q5shYz8Y6UZC/kOTfuGqbZDNZWro/9pYquvNNW0M847E5t9bsf9VkAAMHRGBbWoVoU9VpI0UnoXSfvpOo+aXa2DSq5sHHUTVY7A9eov3z5IqT+pligx11xcs+YhDWcU8di3BTJisohKvv5Y8WSkm/rloiZd4ig269k0jTRk1olP/vCksPli4wKG2wdsd5o42nX1yL7mFfXocOANZbB+5qMkiwdyoQSk+Vq+C8nAZx2bbKhUq2MbrORGMzOe0Hh0x2a0PeObycN1Bpyv7Mp3ZI9h5hBnONKCnqMhtyQHUj/nNvbJUnDVYNfoOEqDiEqqEwB7YqWzAKz8KW0OIqdlM8uiQ4JqZZlFllnWJUfaiDrdFM3lYSnFQBkzeVlts6GpDOOBjCYd7dcCNS6kq6pZC6p6HN60Twu0JnurZD6RT7rrPkIGE8vAenFt4iGe/yF52fahCSY8Ws4K0UTwN7bAS+4xRHVCWvE8sMRZsRCHizb5laYsVrPZJhE6+hux6OBb6w8kwPYXc+ud5v6UxawUWgt6uPwl8mlAtU9Z7Miw4Nn/wtBkiLL/ke1UI1gqJtcQXgHxx6mzsjh41+nAgTvdbsSEyU6vfOmxGj3Rwc1eOrIhJUqn5YjOWfzzsz/D5DzWKmwXIwdspt1p+u+kol1N3f2wT9fKPnd/RGCb4g/1hc3Aju4DQYgGY782l89CEEdalpQ/35bQczMFk6Fje12HykakWEXd/bGm9Unh82gH84USiRpeOfQvBDYoqEyrY3zkFZzBjhDqa+jEcAj41tcGx47oSfDq3iVYCdL7HSIjtnyEktVXd7mISZLoMt20JACFcMw+mrbjlug+eU7o2GR7T+LwtOp/p4LZqyLa7oQJDwde1BNZtm3TCK2P1mW94QDL0nDUps5KLtr1DaZXEkRbjSJub2ZE9WqDHyU3KA8G84Tq/rN1IoNu/if45jacyPje1Npj9IftUZSP22nV7HMwZtwQ4P4MYHRMBMGCSqGSIb3DQEJFTEGBAQBAAAAMFsGCSqGSIb3DQEJFDFOHkwAewBCADQAQQA0AEYARQBCADAALQBBADEAOABBAC0ANAA0AEIAQgAtAEIANQBGADIALQA0ADkAMQBFAEYAMQA1ADIAQgBBADEANgB9MF0GCSsGAQQBgjcRATFQHk4ATQBpAGMAcgBvAHMAbwBmAHQAIABTAG8AZgB0AHcAYQByAGUAIABLAGUAeQAgAFMAdABvAHIAYQBnAGUAIABQAHIAbwB2AGkAZABlAHIwggO/BgkqhkiG9w0BBwagggOwMIIDrAIBADCCA6UGCSqGSIb3DQEHATAcBgoqhkiG9w0BDAEGMA4ECEBk5ZAYpu0WAgIH0ICCA3hik4mQFGpw9Ha8TQPtk+j2jwWdxfF0+sTk6S8PTsEfIhB7wPltjiCK92Uv2tCBQnodBUmatIfkpnRDEySmgmdglmOCzj204lWAMRs94PoALGn3JVBXbO1vIDCbAPOZ7Z0Hd0/1t2hmk8v3//QJGUg+qr59/4y/MuVfIg4qfkPcC2QSvYWcK3oTf6SFi5rv9B1IOWFgN5D0+C+x/9Lb/myPYX+rbOHrwtJ4W1fWKoz9g7wwmGFA9IJ2DYGuH8ifVFbDFT1Vcgsvs8arSX7oBsJVW0qrP7XkuDRe3EqCmKW7rBEwYrFznhxZcRDEpMwbFoSvgSIZ4XhFY9VKYglT+JpNH5iDceYEBOQL4vBLpxNUk3l5jKaBNxVa14AIBxq18bVHJ+STInhLhad4u10v/Xbx7wIL3f9DX1yLAkPrpBYbNHS2/ew6H/ySDJnoIDxkw2zZ4qJ+qUJZ1S0lbZVG+VT0OP5uF6tyOSpbMlcGkdl3z254n6MlCrTifcwkzscysDsgKXaYQw06rzrPW6RDub+t+hXzGny799fS9jhQMLDmOggaQ7+LA4oEZsfT89HLMWxJYDqjo3gIfjciV2mV54R684qLDS+AO09U49e6yEbwGlq8lpmO/pbXCbpGbB1b3EomcQbxdWxW2WEkkEd/VBn81K4M3obmywwXJkw+tPXDXfBmzzaqqCR+onMQ5ME1nMkY8ybnfoCc1bDIupjVWsEL2Wvq752RgI6KqzVNr1ew1IdqV5AWN2fOfek+0vi3Jd9FHF3hx8JMwjJL9dZsETV5kHtYJtE7wJ23J68BnCt2eI0GEuwXcCf5EdSKN/xXCTlIokc4Qk/gzRdIZsvcEJ6B1lGovKG54X4IohikqTjiepjbsMWj38yxDmK3mtENZ9ci8FPfbbvIEcOCZIinuY3qFUlRSbx7VUerEoV1IP3clUwexVQo4lHFee2jd7ocWsdSqSapW7OWUupBtDzRkqVhE7tGria+i1W2d6YLlJ21QTjyapWJehAMO637OdbJCCzDs1cXbodRRE7bsP492ocJy8OX66rKdhYbg8srSFNKdb3pF3UDNbN9jhI/t8iagRhNBhlQtTr1me2E/c86Q18qcRXl4bcXTt6acgCeffK6Y26LcVlrgjlD33AEYRRUeyC+rpxbT0aMjdFderlndKRIyG23mSp0HaUwNzAfMAcGBSsOAwIaBBRlviCbIyRrhIysg2dc/KbLFTc2vQQUg4rfwHMM4IKYRD/fsd1x6dda+wQ=`, - // empty string password test case - "testing@example.com": `MIIJzgIBAzCCCZQGCSqGSIb3DQEHAaCCCYUEggmBMIIJfTCCA/cGCSqGSIb3DQEHBqCCA+gwggPk -AgEAMIID3QYJKoZIhvcNAQcBMBwGCiqGSIb3DQEMAQYwDgQIIszfRGqcmPcCAggAgIIDsOZ9Eg1L -s5Wx8JhYoV3HAL4aRnkAWvTYB5NISZOgSgIQTssmt/3A7134dibTmaT/93LikkL3cTKLnQzJ4wDf -YZ1bprpVJvUqz+HFT79m27bP9zYXFrvxWBJbxjYKTSjQMgz+h8LAEpXXGajCmxMJ1oCOtdXkhhzc -LdZN6SAYgtmtyFnCdMEDskSggGuLb3fw84QEJ/Sj6FAULXunW/CPaS7Ce0TMsKmNU/jfFWj3yXXw -ro0kwjKiVLpVFlnBlHo2OoVU7hmkm59YpGhLgS7nxLD3n7nBroQ0ID1+8R01NnV9XLGoGzxMm1te -6UyTCkr5mj+kEQ8EP1Ys7g/TC411uhVWySMt/rcpkx7Vz1r9kYEAzJpONAfr6cuEVkPKrxpq4Fh0 -2fzlKBky0i/hrfIEUmngh+ERHUb/Mtv/fkv1j5w9suESbhsMLLiCXAlsP1UWMX+3bNizi3WVMEts -FM2k9byn+p8IUD/A8ULlE4kEaWeoc+2idkCNQkLGuIdGUXUFVm58se0auUkVRoRJx8x4CkMesT8j -b1H831W66YRWoEwwDQp2kK1lA2vQXxdVHWlFevMNxJeromLzj3ayiaFrfByeUXhR2S+Hpm+c0yNR -4UVU9WED2kacsZcpRm9nlEa5sr28mri5JdBrNa/K02OOhvKCxr5ZGmbOVzUQKla2z4w+Ku9k8POm -dfDNU/fGx1b5hcFWtghXe3msWVsSJrQihnN6q1ughzNiYZlJUGcHdZDRtiWwCFI0bR8h/Dmg9uO9 -4rawQQrjIRT7B8yF3UbkZyAqs8Ppb1TsMeNPHh1rxEfGVQknh/48ouJYsmtbnzugTUt3mJCXXiL+ -XcPMV6bBVAUu4aaVKSmg9+yJtY4/VKv10iw88ktv29fViIdBe3t6l/oPuvQgbQ8dqf4T8w0l/uKZ -9lS1Na9jfT1vCoS7F5TRi+tmyj1vL5kr/amEIW6xKEP6oeAMvCMtbPAzVEj38zdJ1R22FfuIBxkh -f0Zl7pdVbmzRxl/SBx9iIBJSqAvcXItiT0FIj8HxQ+0iZKqMQMiBuNWJf5pYOLWGrIyntCWwHuaQ -wrx0sTGuEL9YXLEAsBDrsvzLkx/56E4INGZFrH8G7HBdW6iGqb22IMI4GHltYSyBRKbB0gadYTyv -abPEoqww8o7/85aPSzOTJ/53ozD438Q+d0u9SyDuOb60SzCD/zPuCEd78YgtXJwBYTuUNRT27FaM -3LGMX8Hz+6yPNRnmnA2XKPn7dx/IlaqAjIs8MIIFfgYJKoZIhvcNAQcBoIIFbwSCBWswggVnMIIF -YwYLKoZIhvcNAQwKAQKgggTuMIIE6jAcBgoqhkiG9w0BDAEDMA4ECJr0cClYqOlcAgIIAASCBMhe -OQSiP2s0/46ONXcNeVAkz2ksW3u/+qorhSiskGZ0b3dFa1hhgBU2Q7JVIkc4Hf7OXaT1eVQ8oqND -uhqsNz83/kqYo70+LS8Hocj49jFgWAKrf/yQkdyP1daHa2yzlEw4mkpqOfnIORQHvYCa8nEApspZ -wVu8y6WVuLHKU67mel7db2xwstQp7PRuSAYqGjTfAylElog8ASdaqqYbYIrCXucF8iF9oVgmb/Qo -xrXshJ9aSLO4MuXlTPELmWgj07AXKSb90FKNihE+y0bWb9LPVFY1Sly3AX9PfrtkSXIZwqW3phpv -MxGxQl/R6mr1z+hlTfY9Wdpb5vlKXPKA0L0Rt8d2pOesylFi6esJoS01QgP1kJILjbrV731kvDc0 -Jsd+Oxv4BMwA7ClG8w1EAOInc/GrV1MWFGw/HeEqj3CZ/l/0jv9bwkbVeVCiIhoL6P6lVx9pXq4t -KZ0uKg/tk5TVJmG2vLcMLvezD0Yk3G2ZOMrywtmskrwoF7oAUpO9e87szoH6fEvUZlkDkPVW1NV4 -cZk3DBSQiuA3VOOg8qbo/tx/EE3H59P0axZWno2GSB0wFPWd1aj+b//tJEJHaaNR6qPRj4IWj9ru -Qbc8eRAcVWleHg8uAehSvUXlFpyMQREyrnpvMGddpiTC8N4UMrrBRhV7+UbCOWhxPCbItnInBqgl -1JpSZIP7iUtsIMdu3fEC2cdbXMTRul+4rdzUR7F9OaezV3jjvcAbDvgbK1CpyC+MJ1Mxm/iTgk9V -iUArydhlR8OniN84GyGYoYCW9O/KUwb6ASmeFOu/msx8x6kAsSQHIkKqMKv0TUR3kZnkxUvdpBGP -KTl4YCTvNGX4dYALBqrAETRDhua2KVBD/kEttDHwBNVbN2xi81+Mc7ml461aADfk0c66R/m2sjHB -2tN9+wG12OIWFQjL6wF/UfJMYamxx2zOOExiId29Opt57uYiNVLOO4ourPewHPeH0u8Gz35aero7 -lkt7cZAe1Q0038JUuE/QGlnK4lESK9UkSIQAjSaAlTsrcfwtQxB2EjoOoLhwH5mvxUEmcNGNnXUc -9xj3M5BD3zBz3Ft7G3YMMDwB1+zC2l+0UG0MGVjMVaeoy32VVNvxgX7jk22OXG1iaOB+PY9kdk+O -X+52BGSf/rD6X0EnqY7XuRPkMGgjtpZeAYxRQnFtCZgDY4wYheuxqSSpdF49yNczSPLkgB3CeCfS -+9NTKN7aC6hBbmW/8yYh6OvSiCEwY0lFS/T+7iaVxr1loE4zI1y/FFp4Pe1qfLlLttVlkygga2UU -SCunTQ8UB/M5IXWKkhMOO11dP4niWwb39Y7pCWpau7mwbXOKfRPX96cgHnQJK5uG+BesDD1oYnX0 -6frN7FOnTSHKruRIwuI8KnOQ/I+owmyz71wiv5LMQt+yM47UrEjB/EZa5X8dpEwOZvkdqL7utcyo -l0XH5kWMXdW856LL/FYftAqJIDAmtX1TXF/rbP6mPyN/IlDC0gjP84Uzd/a2UyTIWr+wk49Ek3vQ -/uDamq6QrwAxVmNh5Tset5Vhpc1e1kb7mRMZIzxSP8JcTuYd45oFKi98I8YjvueHVZce1g7OudQP -SbFQoJvdT46iBg1TTatlltpOiH2mFaxWVS0xYjAjBgkqhkiG9w0BCRUxFgQUdA9eVqvETX4an/c8 -p8SsTugkit8wOwYJKoZIhvcNAQkUMS4eLABGAHIAaQBlAG4AZABsAHkAIABuAGEAbQBlACAAZgBv -AHIAIABjAGUAcgB0MDEwITAJBgUrDgMCGgUABBRFsNz3Zd1O1GI8GTuFwCWuDOjEEwQIuBEfIcAy -HQ8CAggA`, -} diff --git a/vendor/golang.org/x/crypto/pkcs12/safebags.go b/vendor/golang.org/x/crypto/pkcs12/safebags.go deleted file mode 100644 index def1f7b98..000000000 --- a/vendor/golang.org/x/crypto/pkcs12/safebags.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package pkcs12 - -import ( - "crypto/x509" - "encoding/asn1" - "errors" -) - -var ( - // see https://tools.ietf.org/html/rfc7292#appendix-D - oidCertTypeX509Certificate = asn1.ObjectIdentifier([]int{1, 2, 840, 113549, 1, 9, 22, 1}) - oidPKCS8ShroundedKeyBag = asn1.ObjectIdentifier([]int{1, 2, 840, 113549, 1, 12, 10, 1, 2}) - oidCertBag = asn1.ObjectIdentifier([]int{1, 2, 840, 113549, 1, 12, 10, 1, 3}) -) - -type certBag struct { - Id asn1.ObjectIdentifier - Data []byte `asn1:"tag:0,explicit"` -} - -func decodePkcs8ShroudedKeyBag(asn1Data, password []byte) (privateKey interface{}, err error) { - pkinfo := new(encryptedPrivateKeyInfo) - if err = unmarshal(asn1Data, pkinfo); err != nil { - return nil, errors.New("pkcs12: error decoding PKCS#8 shrouded key bag: " + err.Error()) - } - - pkData, err := pbDecrypt(pkinfo, password) - if err != nil { - return nil, errors.New("pkcs12: error decrypting PKCS#8 shrouded key bag: " + err.Error()) - } - - ret := new(asn1.RawValue) - if err = unmarshal(pkData, ret); err != nil { - return nil, errors.New("pkcs12: error unmarshaling decrypted private key: " + err.Error()) - } - - if privateKey, err = x509.ParsePKCS8PrivateKey(pkData); err != nil { - return nil, errors.New("pkcs12: error parsing PKCS#8 private key: " + err.Error()) - } - - return privateKey, nil -} - -func decodeCertBag(asn1Data []byte) (x509Certificates []byte, err error) { - bag := new(certBag) - if err := unmarshal(asn1Data, bag); err != nil { - return nil, errors.New("pkcs12: error decoding cert bag: " + err.Error()) - } - if !bag.Id.Equal(oidCertTypeX509Certificate) { - return nil, NotImplementedError("only X509 certificates are supported") - } - return bag.Data, nil -} diff --git a/vendor/golang.org/x/crypto/poly1305/poly1305.go b/vendor/golang.org/x/crypto/poly1305/poly1305.go deleted file mode 100644 index 4a5f826f7..000000000 --- a/vendor/golang.org/x/crypto/poly1305/poly1305.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -/* -Package poly1305 implements Poly1305 one-time message authentication code as specified in http://cr.yp.to/mac/poly1305-20050329.pdf. - -Poly1305 is a fast, one-time authentication function. It is infeasible for an -attacker to generate an authenticator for a message without the key. However, a -key must only be used for a single message. Authenticating two different -messages with the same key allows an attacker to forge authenticators for other -messages with the same key. - -Poly1305 was originally coupled with AES in order to make Poly1305-AES. AES was -used with a fixed key in order to generate one-time keys from an nonce. -However, in this package AES isn't used and the one-time key is specified -directly. -*/ -package poly1305 // import "golang.org/x/crypto/poly1305" - -import "crypto/subtle" - -// TagSize is the size, in bytes, of a poly1305 authenticator. -const TagSize = 16 - -// Verify returns true if mac is a valid authenticator for m with the given -// key. -func Verify(mac *[16]byte, m []byte, key *[32]byte) bool { - var tmp [16]byte - Sum(&tmp, m, key) - return subtle.ConstantTimeCompare(tmp[:], mac[:]) == 1 -} diff --git a/vendor/golang.org/x/crypto/poly1305/poly1305_test.go b/vendor/golang.org/x/crypto/poly1305/poly1305_test.go deleted file mode 100644 index 017027fe6..000000000 --- a/vendor/golang.org/x/crypto/poly1305/poly1305_test.go +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package poly1305 - -import ( - "bytes" - "encoding/hex" - "flag" - "testing" - "unsafe" -) - -var stressFlag = flag.Bool("stress", false, "run slow stress tests") - -var testData = []struct { - in, k, correct []byte -}{ - { - []byte("Hello world!"), - []byte("this is 32-byte key for Poly1305"), - []byte{0xa6, 0xf7, 0x45, 0x00, 0x8f, 0x81, 0xc9, 0x16, 0xa2, 0x0d, 0xcc, 0x74, 0xee, 0xf2, 0xb2, 0xf0}, - }, - { - make([]byte, 32), - []byte("this is 32-byte key for Poly1305"), - []byte{0x49, 0xec, 0x78, 0x09, 0x0e, 0x48, 0x1e, 0xc6, 0xc2, 0x6b, 0x33, 0xb9, 0x1c, 0xcc, 0x03, 0x07}, - }, - { - make([]byte, 2007), - []byte("this is 32-byte key for Poly1305"), - []byte{0xda, 0x84, 0xbc, 0xab, 0x02, 0x67, 0x6c, 0x38, 0xcd, 0xb0, 0x15, 0x60, 0x42, 0x74, 0xc2, 0xaa}, - }, - { - make([]byte, 2007), - make([]byte, 32), - make([]byte, 16), - }, - { - // This test triggers an edge-case. See https://go-review.googlesource.com/#/c/30101/. - []byte{0x81, 0xd8, 0xb2, 0xe4, 0x6a, 0x25, 0x21, 0x3b, 0x58, 0xfe, 0xe4, 0x21, 0x3a, 0x2a, 0x28, 0xe9, 0x21, 0xc1, 0x2a, 0x96, 0x32, 0x51, 0x6d, 0x3b, 0x73, 0x27, 0x27, 0x27, 0xbe, 0xcf, 0x21, 0x29}, - []byte{0x3b, 0x3a, 0x29, 0xe9, 0x3b, 0x21, 0x3a, 0x5c, 0x5c, 0x3b, 0x3b, 0x05, 0x3a, 0x3a, 0x8c, 0x0d}, - []byte{0x6d, 0xc1, 0x8b, 0x8c, 0x34, 0x4c, 0xd7, 0x99, 0x27, 0x11, 0x8b, 0xbe, 0x84, 0xb7, 0xf3, 0x14}, - }, - { - // This test generates a result of (2^130-1) % (2^130-5). - []byte{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }, - []byte{1, 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}, - []byte{4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - }, - { - // This test generates a result of (2^130-6) % (2^130-5). - []byte{ - 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }, - []byte{1, 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}, - []byte{0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, - }, - { - // This test generates a result of (2^130-5) % (2^130-5). - []byte{ - 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }, - []byte{1, 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}, - []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - }, -} - -func testSum(t *testing.T, unaligned bool) { - var out [16]byte - var key [32]byte - - for i, v := range testData { - in := v.in - if unaligned { - in = unalignBytes(in) - } - copy(key[:], v.k) - Sum(&out, in, &key) - if !bytes.Equal(out[:], v.correct) { - t.Errorf("%d: expected %x, got %x", i, v.correct, out[:]) - } - } -} - -func TestBurnin(t *testing.T) { - // This test can be used to sanity-check significant changes. It can - // take about many minutes to run, even on fast machines. It's disabled - // by default. - if !*stressFlag { - t.Skip("skipping without -stress") - } - - var key [32]byte - var input [25]byte - var output [16]byte - - for i := range key { - key[i] = 1 - } - for i := range input { - input[i] = 2 - } - - for i := uint64(0); i < 1e10; i++ { - Sum(&output, input[:], &key) - copy(key[0:], output[:]) - copy(key[16:], output[:]) - copy(input[:], output[:]) - copy(input[16:], output[:]) - } - - const expected = "5e3b866aea0b636d240c83c428f84bfa" - if got := hex.EncodeToString(output[:]); got != expected { - t.Errorf("expected %s, got %s", expected, got) - } -} - -func TestSum(t *testing.T) { testSum(t, false) } -func TestSumUnaligned(t *testing.T) { testSum(t, true) } - -func benchmark(b *testing.B, size int, unaligned bool) { - var out [16]byte - var key [32]byte - in := make([]byte, size) - if unaligned { - in = unalignBytes(in) - } - b.SetBytes(int64(len(in))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - Sum(&out, in, &key) - } -} - -func Benchmark64(b *testing.B) { benchmark(b, 64, false) } -func Benchmark1K(b *testing.B) { benchmark(b, 1024, false) } -func Benchmark64Unaligned(b *testing.B) { benchmark(b, 64, true) } -func Benchmark1KUnaligned(b *testing.B) { benchmark(b, 1024, true) } - -func unalignBytes(in []byte) []byte { - out := make([]byte, len(in)+1) - if uintptr(unsafe.Pointer(&out[0]))&(unsafe.Alignof(uint32(0))-1) == 0 { - out = out[1:] - } else { - out = out[:len(in)] - } - copy(out, in) - return out -} diff --git a/vendor/golang.org/x/crypto/poly1305/sum_amd64.go b/vendor/golang.org/x/crypto/poly1305/sum_amd64.go deleted file mode 100644 index 4dd72fe79..000000000 --- a/vendor/golang.org/x/crypto/poly1305/sum_amd64.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build amd64,!gccgo,!appengine - -package poly1305 - -// This function is implemented in sum_amd64.s -//go:noescape -func poly1305(out *[16]byte, m *byte, mlen uint64, key *[32]byte) - -// Sum generates an authenticator for m using a one-time key and puts the -// 16-byte result into out. Authenticating two different messages with the same -// key allows an attacker to forge messages at will. -func Sum(out *[16]byte, m []byte, key *[32]byte) { - var mPtr *byte - if len(m) > 0 { - mPtr = &m[0] - } - poly1305(out, mPtr, uint64(len(m)), key) -} diff --git a/vendor/golang.org/x/crypto/poly1305/sum_amd64.s b/vendor/golang.org/x/crypto/poly1305/sum_amd64.s deleted file mode 100644 index 2edae6382..000000000 --- a/vendor/golang.org/x/crypto/poly1305/sum_amd64.s +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build amd64,!gccgo,!appengine - -#include "textflag.h" - -#define POLY1305_ADD(msg, h0, h1, h2) \ - ADDQ 0(msg), h0; \ - ADCQ 8(msg), h1; \ - ADCQ $1, h2; \ - LEAQ 16(msg), msg - -#define POLY1305_MUL(h0, h1, h2, r0, r1, t0, t1, t2, t3) \ - MOVQ r0, AX; \ - MULQ h0; \ - MOVQ AX, t0; \ - MOVQ DX, t1; \ - MOVQ r0, AX; \ - MULQ h1; \ - ADDQ AX, t1; \ - ADCQ $0, DX; \ - MOVQ r0, t2; \ - IMULQ h2, t2; \ - ADDQ DX, t2; \ - \ - MOVQ r1, AX; \ - MULQ h0; \ - ADDQ AX, t1; \ - ADCQ $0, DX; \ - MOVQ DX, h0; \ - MOVQ r1, t3; \ - IMULQ h2, t3; \ - MOVQ r1, AX; \ - MULQ h1; \ - ADDQ AX, t2; \ - ADCQ DX, t3; \ - ADDQ h0, t2; \ - ADCQ $0, t3; \ - \ - MOVQ t0, h0; \ - MOVQ t1, h1; \ - MOVQ t2, h2; \ - ANDQ $3, h2; \ - MOVQ t2, t0; \ - ANDQ $0xFFFFFFFFFFFFFFFC, t0; \ - ADDQ t0, h0; \ - ADCQ t3, h1; \ - ADCQ $0, h2; \ - SHRQ $2, t3, t2; \ - SHRQ $2, t3; \ - ADDQ t2, h0; \ - ADCQ t3, h1; \ - ADCQ $0, h2 - -DATA ·poly1305Mask<>+0x00(SB)/8, $0x0FFFFFFC0FFFFFFF -DATA ·poly1305Mask<>+0x08(SB)/8, $0x0FFFFFFC0FFFFFFC -GLOBL ·poly1305Mask<>(SB), RODATA, $16 - -// func poly1305(out *[16]byte, m *byte, mlen uint64, key *[32]key) -TEXT ·poly1305(SB), $0-32 - MOVQ out+0(FP), DI - MOVQ m+8(FP), SI - MOVQ mlen+16(FP), R15 - MOVQ key+24(FP), AX - - MOVQ 0(AX), R11 - MOVQ 8(AX), R12 - ANDQ ·poly1305Mask<>(SB), R11 // r0 - ANDQ ·poly1305Mask<>+8(SB), R12 // r1 - XORQ R8, R8 // h0 - XORQ R9, R9 // h1 - XORQ R10, R10 // h2 - - CMPQ R15, $16 - JB bytes_between_0_and_15 - -loop: - POLY1305_ADD(SI, R8, R9, R10) - -multiply: - POLY1305_MUL(R8, R9, R10, R11, R12, BX, CX, R13, R14) - SUBQ $16, R15 - CMPQ R15, $16 - JAE loop - -bytes_between_0_and_15: - TESTQ R15, R15 - JZ done - MOVQ $1, BX - XORQ CX, CX - XORQ R13, R13 - ADDQ R15, SI - -flush_buffer: - SHLQ $8, BX, CX - SHLQ $8, BX - MOVB -1(SI), R13 - XORQ R13, BX - DECQ SI - DECQ R15 - JNZ flush_buffer - - ADDQ BX, R8 - ADCQ CX, R9 - ADCQ $0, R10 - MOVQ $16, R15 - JMP multiply - -done: - MOVQ R8, AX - MOVQ R9, BX - SUBQ $0xFFFFFFFFFFFFFFFB, AX - SBBQ $0xFFFFFFFFFFFFFFFF, BX - SBBQ $3, R10 - CMOVQCS R8, AX - CMOVQCS R9, BX - MOVQ key+24(FP), R8 - ADDQ 16(R8), AX - ADCQ 24(R8), BX - - MOVQ AX, 0(DI) - MOVQ BX, 8(DI) - RET diff --git a/vendor/golang.org/x/crypto/poly1305/sum_arm.go b/vendor/golang.org/x/crypto/poly1305/sum_arm.go deleted file mode 100644 index 5dc321c2f..000000000 --- a/vendor/golang.org/x/crypto/poly1305/sum_arm.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build arm,!gccgo,!appengine,!nacl - -package poly1305 - -// This function is implemented in sum_arm.s -//go:noescape -func poly1305_auth_armv6(out *[16]byte, m *byte, mlen uint32, key *[32]byte) - -// Sum generates an authenticator for m using a one-time key and puts the -// 16-byte result into out. Authenticating two different messages with the same -// key allows an attacker to forge messages at will. -func Sum(out *[16]byte, m []byte, key *[32]byte) { - var mPtr *byte - if len(m) > 0 { - mPtr = &m[0] - } - poly1305_auth_armv6(out, mPtr, uint32(len(m)), key) -} diff --git a/vendor/golang.org/x/crypto/poly1305/sum_arm.s b/vendor/golang.org/x/crypto/poly1305/sum_arm.s deleted file mode 100644 index f70b4ac48..000000000 --- a/vendor/golang.org/x/crypto/poly1305/sum_arm.s +++ /dev/null @@ -1,427 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build arm,!gccgo,!appengine,!nacl - -#include "textflag.h" - -// This code was translated into a form compatible with 5a from the public -// domain source by Andrew Moon: github.com/floodyberry/poly1305-opt/blob/master/app/extensions/poly1305. - -DATA ·poly1305_init_constants_armv6<>+0x00(SB)/4, $0x3ffffff -DATA ·poly1305_init_constants_armv6<>+0x04(SB)/4, $0x3ffff03 -DATA ·poly1305_init_constants_armv6<>+0x08(SB)/4, $0x3ffc0ff -DATA ·poly1305_init_constants_armv6<>+0x0c(SB)/4, $0x3f03fff -DATA ·poly1305_init_constants_armv6<>+0x10(SB)/4, $0x00fffff -GLOBL ·poly1305_init_constants_armv6<>(SB), 8, $20 - -// Warning: the linker may use R11 to synthesize certain instructions. Please -// take care and verify that no synthetic instructions use it. - -TEXT poly1305_init_ext_armv6<>(SB), NOSPLIT, $0 - // Needs 16 bytes of stack and 64 bytes of space pointed to by R0. (It - // might look like it's only 60 bytes of space but the final four bytes - // will be written by another function.) We need to skip over four - // bytes of stack because that's saving the value of 'g'. - ADD $4, R13, R8 - MOVM.IB [R4-R7], (R8) - MOVM.IA.W (R1), [R2-R5] - MOVW $·poly1305_init_constants_armv6<>(SB), R7 - MOVW R2, R8 - MOVW R2>>26, R9 - MOVW R3>>20, g - MOVW R4>>14, R11 - MOVW R5>>8, R12 - ORR R3<<6, R9, R9 - ORR R4<<12, g, g - ORR R5<<18, R11, R11 - MOVM.IA (R7), [R2-R6] - AND R8, R2, R2 - AND R9, R3, R3 - AND g, R4, R4 - AND R11, R5, R5 - AND R12, R6, R6 - MOVM.IA.W [R2-R6], (R0) - EOR R2, R2, R2 - EOR R3, R3, R3 - EOR R4, R4, R4 - EOR R5, R5, R5 - EOR R6, R6, R6 - MOVM.IA.W [R2-R6], (R0) - MOVM.IA.W (R1), [R2-R5] - MOVM.IA [R2-R6], (R0) - ADD $20, R13, R0 - MOVM.DA (R0), [R4-R7] - RET - -#define MOVW_UNALIGNED(Rsrc, Rdst, Rtmp, offset) \ - MOVBU (offset+0)(Rsrc), Rtmp; \ - MOVBU Rtmp, (offset+0)(Rdst); \ - MOVBU (offset+1)(Rsrc), Rtmp; \ - MOVBU Rtmp, (offset+1)(Rdst); \ - MOVBU (offset+2)(Rsrc), Rtmp; \ - MOVBU Rtmp, (offset+2)(Rdst); \ - MOVBU (offset+3)(Rsrc), Rtmp; \ - MOVBU Rtmp, (offset+3)(Rdst) - -TEXT poly1305_blocks_armv6<>(SB), NOSPLIT, $0 - // Needs 24 bytes of stack for saved registers and then 88 bytes of - // scratch space after that. We assume that 24 bytes at (R13) have - // already been used: four bytes for the link register saved in the - // prelude of poly1305_auth_armv6, four bytes for saving the value of g - // in that function and 16 bytes of scratch space used around - // poly1305_finish_ext_armv6_skip1. - ADD $24, R13, R12 - MOVM.IB [R4-R8, R14], (R12) - MOVW R0, 88(R13) - MOVW R1, 92(R13) - MOVW R2, 96(R13) - MOVW R1, R14 - MOVW R2, R12 - MOVW 56(R0), R8 - WORD $0xe1180008 // TST R8, R8 not working see issue 5921 - EOR R6, R6, R6 - MOVW.EQ $(1<<24), R6 - MOVW R6, 84(R13) - ADD $116, R13, g - MOVM.IA (R0), [R0-R9] - MOVM.IA [R0-R4], (g) - CMP $16, R12 - BLO poly1305_blocks_armv6_done - -poly1305_blocks_armv6_mainloop: - WORD $0xe31e0003 // TST R14, #3 not working see issue 5921 - BEQ poly1305_blocks_armv6_mainloop_aligned - ADD $100, R13, g - MOVW_UNALIGNED(R14, g, R0, 0) - MOVW_UNALIGNED(R14, g, R0, 4) - MOVW_UNALIGNED(R14, g, R0, 8) - MOVW_UNALIGNED(R14, g, R0, 12) - MOVM.IA (g), [R0-R3] - ADD $16, R14 - B poly1305_blocks_armv6_mainloop_loaded - -poly1305_blocks_armv6_mainloop_aligned: - MOVM.IA.W (R14), [R0-R3] - -poly1305_blocks_armv6_mainloop_loaded: - MOVW R0>>26, g - MOVW R1>>20, R11 - MOVW R2>>14, R12 - MOVW R14, 92(R13) - MOVW R3>>8, R4 - ORR R1<<6, g, g - ORR R2<<12, R11, R11 - ORR R3<<18, R12, R12 - BIC $0xfc000000, R0, R0 - BIC $0xfc000000, g, g - MOVW 84(R13), R3 - BIC $0xfc000000, R11, R11 - BIC $0xfc000000, R12, R12 - ADD R0, R5, R5 - ADD g, R6, R6 - ORR R3, R4, R4 - ADD R11, R7, R7 - ADD $116, R13, R14 - ADD R12, R8, R8 - ADD R4, R9, R9 - MOVM.IA (R14), [R0-R4] - MULLU R4, R5, (R11, g) - MULLU R3, R5, (R14, R12) - MULALU R3, R6, (R11, g) - MULALU R2, R6, (R14, R12) - MULALU R2, R7, (R11, g) - MULALU R1, R7, (R14, R12) - ADD R4<<2, R4, R4 - ADD R3<<2, R3, R3 - MULALU R1, R8, (R11, g) - MULALU R0, R8, (R14, R12) - MULALU R0, R9, (R11, g) - MULALU R4, R9, (R14, R12) - MOVW g, 76(R13) - MOVW R11, 80(R13) - MOVW R12, 68(R13) - MOVW R14, 72(R13) - MULLU R2, R5, (R11, g) - MULLU R1, R5, (R14, R12) - MULALU R1, R6, (R11, g) - MULALU R0, R6, (R14, R12) - MULALU R0, R7, (R11, g) - MULALU R4, R7, (R14, R12) - ADD R2<<2, R2, R2 - ADD R1<<2, R1, R1 - MULALU R4, R8, (R11, g) - MULALU R3, R8, (R14, R12) - MULALU R3, R9, (R11, g) - MULALU R2, R9, (R14, R12) - MOVW g, 60(R13) - MOVW R11, 64(R13) - MOVW R12, 52(R13) - MOVW R14, 56(R13) - MULLU R0, R5, (R11, g) - MULALU R4, R6, (R11, g) - MULALU R3, R7, (R11, g) - MULALU R2, R8, (R11, g) - MULALU R1, R9, (R11, g) - ADD $52, R13, R0 - MOVM.IA (R0), [R0-R7] - MOVW g>>26, R12 - MOVW R4>>26, R14 - ORR R11<<6, R12, R12 - ORR R5<<6, R14, R14 - BIC $0xfc000000, g, g - BIC $0xfc000000, R4, R4 - ADD.S R12, R0, R0 - ADC $0, R1, R1 - ADD.S R14, R6, R6 - ADC $0, R7, R7 - MOVW R0>>26, R12 - MOVW R6>>26, R14 - ORR R1<<6, R12, R12 - ORR R7<<6, R14, R14 - BIC $0xfc000000, R0, R0 - BIC $0xfc000000, R6, R6 - ADD R14<<2, R14, R14 - ADD.S R12, R2, R2 - ADC $0, R3, R3 - ADD R14, g, g - MOVW R2>>26, R12 - MOVW g>>26, R14 - ORR R3<<6, R12, R12 - BIC $0xfc000000, g, R5 - BIC $0xfc000000, R2, R7 - ADD R12, R4, R4 - ADD R14, R0, R0 - MOVW R4>>26, R12 - BIC $0xfc000000, R4, R8 - ADD R12, R6, R9 - MOVW 96(R13), R12 - MOVW 92(R13), R14 - MOVW R0, R6 - CMP $32, R12 - SUB $16, R12, R12 - MOVW R12, 96(R13) - BHS poly1305_blocks_armv6_mainloop - -poly1305_blocks_armv6_done: - MOVW 88(R13), R12 - MOVW R5, 20(R12) - MOVW R6, 24(R12) - MOVW R7, 28(R12) - MOVW R8, 32(R12) - MOVW R9, 36(R12) - ADD $48, R13, R0 - MOVM.DA (R0), [R4-R8, R14] - RET - -#define MOVHUP_UNALIGNED(Rsrc, Rdst, Rtmp) \ - MOVBU.P 1(Rsrc), Rtmp; \ - MOVBU.P Rtmp, 1(Rdst); \ - MOVBU.P 1(Rsrc), Rtmp; \ - MOVBU.P Rtmp, 1(Rdst) - -#define MOVWP_UNALIGNED(Rsrc, Rdst, Rtmp) \ - MOVHUP_UNALIGNED(Rsrc, Rdst, Rtmp); \ - MOVHUP_UNALIGNED(Rsrc, Rdst, Rtmp) - -// func poly1305_auth_armv6(out *[16]byte, m *byte, mlen uint32, key *[32]key) -TEXT ·poly1305_auth_armv6(SB), $196-16 - // The value 196, just above, is the sum of 64 (the size of the context - // structure) and 132 (the amount of stack needed). - // - // At this point, the stack pointer (R13) has been moved down. It - // points to the saved link register and there's 196 bytes of free - // space above it. - // - // The stack for this function looks like: - // - // +--------------------- - // | - // | 64 bytes of context structure - // | - // +--------------------- - // | - // | 112 bytes for poly1305_blocks_armv6 - // | - // +--------------------- - // | 16 bytes of final block, constructed at - // | poly1305_finish_ext_armv6_skip8 - // +--------------------- - // | four bytes of saved 'g' - // +--------------------- - // | lr, saved by prelude <- R13 points here - // +--------------------- - MOVW g, 4(R13) - - MOVW out+0(FP), R4 - MOVW m+4(FP), R5 - MOVW mlen+8(FP), R6 - MOVW key+12(FP), R7 - - ADD $136, R13, R0 // 136 = 4 + 4 + 16 + 112 - MOVW R7, R1 - - // poly1305_init_ext_armv6 will write to the stack from R13+4, but - // that's ok because none of the other values have been written yet. - BL poly1305_init_ext_armv6<>(SB) - BIC.S $15, R6, R2 - BEQ poly1305_auth_armv6_noblocks - ADD $136, R13, R0 - MOVW R5, R1 - ADD R2, R5, R5 - SUB R2, R6, R6 - BL poly1305_blocks_armv6<>(SB) - -poly1305_auth_armv6_noblocks: - ADD $136, R13, R0 - MOVW R5, R1 - MOVW R6, R2 - MOVW R4, R3 - - MOVW R0, R5 - MOVW R1, R6 - MOVW R2, R7 - MOVW R3, R8 - AND.S R2, R2, R2 - BEQ poly1305_finish_ext_armv6_noremaining - EOR R0, R0 - ADD $8, R13, R9 // 8 = offset to 16 byte scratch space - MOVW R0, (R9) - MOVW R0, 4(R9) - MOVW R0, 8(R9) - MOVW R0, 12(R9) - WORD $0xe3110003 // TST R1, #3 not working see issue 5921 - BEQ poly1305_finish_ext_armv6_aligned - WORD $0xe3120008 // TST R2, #8 not working see issue 5921 - BEQ poly1305_finish_ext_armv6_skip8 - MOVWP_UNALIGNED(R1, R9, g) - MOVWP_UNALIGNED(R1, R9, g) - -poly1305_finish_ext_armv6_skip8: - WORD $0xe3120004 // TST $4, R2 not working see issue 5921 - BEQ poly1305_finish_ext_armv6_skip4 - MOVWP_UNALIGNED(R1, R9, g) - -poly1305_finish_ext_armv6_skip4: - WORD $0xe3120002 // TST $2, R2 not working see issue 5921 - BEQ poly1305_finish_ext_armv6_skip2 - MOVHUP_UNALIGNED(R1, R9, g) - B poly1305_finish_ext_armv6_skip2 - -poly1305_finish_ext_armv6_aligned: - WORD $0xe3120008 // TST R2, #8 not working see issue 5921 - BEQ poly1305_finish_ext_armv6_skip8_aligned - MOVM.IA.W (R1), [g-R11] - MOVM.IA.W [g-R11], (R9) - -poly1305_finish_ext_armv6_skip8_aligned: - WORD $0xe3120004 // TST $4, R2 not working see issue 5921 - BEQ poly1305_finish_ext_armv6_skip4_aligned - MOVW.P 4(R1), g - MOVW.P g, 4(R9) - -poly1305_finish_ext_armv6_skip4_aligned: - WORD $0xe3120002 // TST $2, R2 not working see issue 5921 - BEQ poly1305_finish_ext_armv6_skip2 - MOVHU.P 2(R1), g - MOVH.P g, 2(R9) - -poly1305_finish_ext_armv6_skip2: - WORD $0xe3120001 // TST $1, R2 not working see issue 5921 - BEQ poly1305_finish_ext_armv6_skip1 - MOVBU.P 1(R1), g - MOVBU.P g, 1(R9) - -poly1305_finish_ext_armv6_skip1: - MOVW $1, R11 - MOVBU R11, 0(R9) - MOVW R11, 56(R5) - MOVW R5, R0 - ADD $8, R13, R1 - MOVW $16, R2 - BL poly1305_blocks_armv6<>(SB) - -poly1305_finish_ext_armv6_noremaining: - MOVW 20(R5), R0 - MOVW 24(R5), R1 - MOVW 28(R5), R2 - MOVW 32(R5), R3 - MOVW 36(R5), R4 - MOVW R4>>26, R12 - BIC $0xfc000000, R4, R4 - ADD R12<<2, R12, R12 - ADD R12, R0, R0 - MOVW R0>>26, R12 - BIC $0xfc000000, R0, R0 - ADD R12, R1, R1 - MOVW R1>>26, R12 - BIC $0xfc000000, R1, R1 - ADD R12, R2, R2 - MOVW R2>>26, R12 - BIC $0xfc000000, R2, R2 - ADD R12, R3, R3 - MOVW R3>>26, R12 - BIC $0xfc000000, R3, R3 - ADD R12, R4, R4 - ADD $5, R0, R6 - MOVW R6>>26, R12 - BIC $0xfc000000, R6, R6 - ADD R12, R1, R7 - MOVW R7>>26, R12 - BIC $0xfc000000, R7, R7 - ADD R12, R2, g - MOVW g>>26, R12 - BIC $0xfc000000, g, g - ADD R12, R3, R11 - MOVW $-(1<<26), R12 - ADD R11>>26, R12, R12 - BIC $0xfc000000, R11, R11 - ADD R12, R4, R9 - MOVW R9>>31, R12 - SUB $1, R12 - AND R12, R6, R6 - AND R12, R7, R7 - AND R12, g, g - AND R12, R11, R11 - AND R12, R9, R9 - MVN R12, R12 - AND R12, R0, R0 - AND R12, R1, R1 - AND R12, R2, R2 - AND R12, R3, R3 - AND R12, R4, R4 - ORR R6, R0, R0 - ORR R7, R1, R1 - ORR g, R2, R2 - ORR R11, R3, R3 - ORR R9, R4, R4 - ORR R1<<26, R0, R0 - MOVW R1>>6, R1 - ORR R2<<20, R1, R1 - MOVW R2>>12, R2 - ORR R3<<14, R2, R2 - MOVW R3>>18, R3 - ORR R4<<8, R3, R3 - MOVW 40(R5), R6 - MOVW 44(R5), R7 - MOVW 48(R5), g - MOVW 52(R5), R11 - ADD.S R6, R0, R0 - ADC.S R7, R1, R1 - ADC.S g, R2, R2 - ADC.S R11, R3, R3 - MOVM.IA [R0-R3], (R8) - MOVW R5, R12 - EOR R0, R0, R0 - EOR R1, R1, R1 - EOR R2, R2, R2 - EOR R3, R3, R3 - EOR R4, R4, R4 - EOR R5, R5, R5 - EOR R6, R6, R6 - EOR R7, R7, R7 - MOVM.IA.W [R0-R7], (R12) - MOVM.IA [R0-R7], (R12) - MOVW 4(R13), g - RET diff --git a/vendor/golang.org/x/crypto/poly1305/sum_ref.go b/vendor/golang.org/x/crypto/poly1305/sum_ref.go deleted file mode 100644 index b2805a5ca..000000000 --- a/vendor/golang.org/x/crypto/poly1305/sum_ref.go +++ /dev/null @@ -1,141 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !amd64,!arm gccgo appengine nacl - -package poly1305 - -import "encoding/binary" - -// Sum generates an authenticator for msg using a one-time key and puts the -// 16-byte result into out. Authenticating two different messages with the same -// key allows an attacker to forge messages at will. -func Sum(out *[TagSize]byte, msg []byte, key *[32]byte) { - var ( - h0, h1, h2, h3, h4 uint32 // the hash accumulators - r0, r1, r2, r3, r4 uint64 // the r part of the key - ) - - r0 = uint64(binary.LittleEndian.Uint32(key[0:]) & 0x3ffffff) - r1 = uint64((binary.LittleEndian.Uint32(key[3:]) >> 2) & 0x3ffff03) - r2 = uint64((binary.LittleEndian.Uint32(key[6:]) >> 4) & 0x3ffc0ff) - r3 = uint64((binary.LittleEndian.Uint32(key[9:]) >> 6) & 0x3f03fff) - r4 = uint64((binary.LittleEndian.Uint32(key[12:]) >> 8) & 0x00fffff) - - R1, R2, R3, R4 := r1*5, r2*5, r3*5, r4*5 - - for len(msg) >= TagSize { - // h += msg - h0 += binary.LittleEndian.Uint32(msg[0:]) & 0x3ffffff - h1 += (binary.LittleEndian.Uint32(msg[3:]) >> 2) & 0x3ffffff - h2 += (binary.LittleEndian.Uint32(msg[6:]) >> 4) & 0x3ffffff - h3 += (binary.LittleEndian.Uint32(msg[9:]) >> 6) & 0x3ffffff - h4 += (binary.LittleEndian.Uint32(msg[12:]) >> 8) | (1 << 24) - - // h *= r - d0 := (uint64(h0) * r0) + (uint64(h1) * R4) + (uint64(h2) * R3) + (uint64(h3) * R2) + (uint64(h4) * R1) - d1 := (d0 >> 26) + (uint64(h0) * r1) + (uint64(h1) * r0) + (uint64(h2) * R4) + (uint64(h3) * R3) + (uint64(h4) * R2) - d2 := (d1 >> 26) + (uint64(h0) * r2) + (uint64(h1) * r1) + (uint64(h2) * r0) + (uint64(h3) * R4) + (uint64(h4) * R3) - d3 := (d2 >> 26) + (uint64(h0) * r3) + (uint64(h1) * r2) + (uint64(h2) * r1) + (uint64(h3) * r0) + (uint64(h4) * R4) - d4 := (d3 >> 26) + (uint64(h0) * r4) + (uint64(h1) * r3) + (uint64(h2) * r2) + (uint64(h3) * r1) + (uint64(h4) * r0) - - // h %= p - h0 = uint32(d0) & 0x3ffffff - h1 = uint32(d1) & 0x3ffffff - h2 = uint32(d2) & 0x3ffffff - h3 = uint32(d3) & 0x3ffffff - h4 = uint32(d4) & 0x3ffffff - - h0 += uint32(d4>>26) * 5 - h1 += h0 >> 26 - h0 = h0 & 0x3ffffff - - msg = msg[TagSize:] - } - - if len(msg) > 0 { - var block [TagSize]byte - off := copy(block[:], msg) - block[off] = 0x01 - - // h += msg - h0 += binary.LittleEndian.Uint32(block[0:]) & 0x3ffffff - h1 += (binary.LittleEndian.Uint32(block[3:]) >> 2) & 0x3ffffff - h2 += (binary.LittleEndian.Uint32(block[6:]) >> 4) & 0x3ffffff - h3 += (binary.LittleEndian.Uint32(block[9:]) >> 6) & 0x3ffffff - h4 += (binary.LittleEndian.Uint32(block[12:]) >> 8) - - // h *= r - d0 := (uint64(h0) * r0) + (uint64(h1) * R4) + (uint64(h2) * R3) + (uint64(h3) * R2) + (uint64(h4) * R1) - d1 := (d0 >> 26) + (uint64(h0) * r1) + (uint64(h1) * r0) + (uint64(h2) * R4) + (uint64(h3) * R3) + (uint64(h4) * R2) - d2 := (d1 >> 26) + (uint64(h0) * r2) + (uint64(h1) * r1) + (uint64(h2) * r0) + (uint64(h3) * R4) + (uint64(h4) * R3) - d3 := (d2 >> 26) + (uint64(h0) * r3) + (uint64(h1) * r2) + (uint64(h2) * r1) + (uint64(h3) * r0) + (uint64(h4) * R4) - d4 := (d3 >> 26) + (uint64(h0) * r4) + (uint64(h1) * r3) + (uint64(h2) * r2) + (uint64(h3) * r1) + (uint64(h4) * r0) - - // h %= p - h0 = uint32(d0) & 0x3ffffff - h1 = uint32(d1) & 0x3ffffff - h2 = uint32(d2) & 0x3ffffff - h3 = uint32(d3) & 0x3ffffff - h4 = uint32(d4) & 0x3ffffff - - h0 += uint32(d4>>26) * 5 - h1 += h0 >> 26 - h0 = h0 & 0x3ffffff - } - - // h %= p reduction - h2 += h1 >> 26 - h1 &= 0x3ffffff - h3 += h2 >> 26 - h2 &= 0x3ffffff - h4 += h3 >> 26 - h3 &= 0x3ffffff - h0 += 5 * (h4 >> 26) - h4 &= 0x3ffffff - h1 += h0 >> 26 - h0 &= 0x3ffffff - - // h - p - t0 := h0 + 5 - t1 := h1 + (t0 >> 26) - t2 := h2 + (t1 >> 26) - t3 := h3 + (t2 >> 26) - t4 := h4 + (t3 >> 26) - (1 << 26) - t0 &= 0x3ffffff - t1 &= 0x3ffffff - t2 &= 0x3ffffff - t3 &= 0x3ffffff - - // select h if h < p else h - p - t_mask := (t4 >> 31) - 1 - h_mask := ^t_mask - h0 = (h0 & h_mask) | (t0 & t_mask) - h1 = (h1 & h_mask) | (t1 & t_mask) - h2 = (h2 & h_mask) | (t2 & t_mask) - h3 = (h3 & h_mask) | (t3 & t_mask) - h4 = (h4 & h_mask) | (t4 & t_mask) - - // h %= 2^128 - h0 |= h1 << 26 - h1 = ((h1 >> 6) | (h2 << 20)) - h2 = ((h2 >> 12) | (h3 << 14)) - h3 = ((h3 >> 18) | (h4 << 8)) - - // s: the s part of the key - // tag = (h + s) % (2^128) - t := uint64(h0) + uint64(binary.LittleEndian.Uint32(key[16:])) - h0 = uint32(t) - t = uint64(h1) + uint64(binary.LittleEndian.Uint32(key[20:])) + (t >> 32) - h1 = uint32(t) - t = uint64(h2) + uint64(binary.LittleEndian.Uint32(key[24:])) + (t >> 32) - h2 = uint32(t) - t = uint64(h3) + uint64(binary.LittleEndian.Uint32(key[28:])) + (t >> 32) - h3 = uint32(t) - - binary.LittleEndian.PutUint32(out[0:], h0) - binary.LittleEndian.PutUint32(out[4:], h1) - binary.LittleEndian.PutUint32(out[8:], h2) - binary.LittleEndian.PutUint32(out[12:], h3) -} diff --git a/vendor/golang.org/x/crypto/ripemd160/ripemd160.go b/vendor/golang.org/x/crypto/ripemd160/ripemd160.go deleted file mode 100644 index 6c6e84236..000000000 --- a/vendor/golang.org/x/crypto/ripemd160/ripemd160.go +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package ripemd160 implements the RIPEMD-160 hash algorithm. -package ripemd160 // import "golang.org/x/crypto/ripemd160" - -// RIPEMD-160 is designed by by Hans Dobbertin, Antoon Bosselaers, and Bart -// Preneel with specifications available at: -// http://homes.esat.kuleuven.be/~cosicart/pdf/AB-9601/AB-9601.pdf. - -import ( - "crypto" - "hash" -) - -func init() { - crypto.RegisterHash(crypto.RIPEMD160, New) -} - -// The size of the checksum in bytes. -const Size = 20 - -// The block size of the hash algorithm in bytes. -const BlockSize = 64 - -const ( - _s0 = 0x67452301 - _s1 = 0xefcdab89 - _s2 = 0x98badcfe - _s3 = 0x10325476 - _s4 = 0xc3d2e1f0 -) - -// digest represents the partial evaluation of a checksum. -type digest struct { - s [5]uint32 // running context - x [BlockSize]byte // temporary buffer - nx int // index into x - tc uint64 // total count of bytes processed -} - -func (d *digest) Reset() { - d.s[0], d.s[1], d.s[2], d.s[3], d.s[4] = _s0, _s1, _s2, _s3, _s4 - d.nx = 0 - d.tc = 0 -} - -// New returns a new hash.Hash computing the checksum. -func New() hash.Hash { - result := new(digest) - result.Reset() - return result -} - -func (d *digest) Size() int { return Size } - -func (d *digest) BlockSize() int { return BlockSize } - -func (d *digest) Write(p []byte) (nn int, err error) { - nn = len(p) - d.tc += uint64(nn) - if d.nx > 0 { - n := len(p) - if n > BlockSize-d.nx { - n = BlockSize - d.nx - } - for i := 0; i < n; i++ { - d.x[d.nx+i] = p[i] - } - d.nx += n - if d.nx == BlockSize { - _Block(d, d.x[0:]) - d.nx = 0 - } - p = p[n:] - } - n := _Block(d, p) - p = p[n:] - if len(p) > 0 { - d.nx = copy(d.x[:], p) - } - return -} - -func (d0 *digest) Sum(in []byte) []byte { - // Make a copy of d0 so that caller can keep writing and summing. - d := *d0 - - // Padding. Add a 1 bit and 0 bits until 56 bytes mod 64. - tc := d.tc - var tmp [64]byte - tmp[0] = 0x80 - if tc%64 < 56 { - d.Write(tmp[0 : 56-tc%64]) - } else { - d.Write(tmp[0 : 64+56-tc%64]) - } - - // Length in bits. - tc <<= 3 - for i := uint(0); i < 8; i++ { - tmp[i] = byte(tc >> (8 * i)) - } - d.Write(tmp[0:8]) - - if d.nx != 0 { - panic("d.nx != 0") - } - - var digest [Size]byte - for i, s := range d.s { - digest[i*4] = byte(s) - digest[i*4+1] = byte(s >> 8) - digest[i*4+2] = byte(s >> 16) - digest[i*4+3] = byte(s >> 24) - } - - return append(in, digest[:]...) -} diff --git a/vendor/golang.org/x/crypto/ripemd160/ripemd160_test.go b/vendor/golang.org/x/crypto/ripemd160/ripemd160_test.go deleted file mode 100644 index 5df1b2593..000000000 --- a/vendor/golang.org/x/crypto/ripemd160/ripemd160_test.go +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ripemd160 - -// Test vectors are from: -// http://homes.esat.kuleuven.be/~bosselae/ripemd160.html - -import ( - "fmt" - "io" - "testing" -) - -type mdTest struct { - out string - in string -} - -var vectors = [...]mdTest{ - {"9c1185a5c5e9fc54612808977ee8f548b2258d31", ""}, - {"0bdc9d2d256b3ee9daae347be6f4dc835a467ffe", "a"}, - {"8eb208f7e05d987a9b044a8e98c6b087f15a0bfc", "abc"}, - {"5d0689ef49d2fae572b881b123a85ffa21595f36", "message digest"}, - {"f71c27109c692c1b56bbdceb5b9d2865b3708dbc", "abcdefghijklmnopqrstuvwxyz"}, - {"12a053384a9c0c88e405a06c27dcf49ada62eb2b", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, - {"b0e20b6e3116640286ed3a87a5713079b21f5189", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, - {"9b752e45573d4b39f4dbd3323cab82bf63326bfb", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, -} - -func TestVectors(t *testing.T) { - for i := 0; i < len(vectors); i++ { - tv := vectors[i] - md := New() - for j := 0; j < 3; j++ { - if j < 2 { - io.WriteString(md, tv.in) - } else { - io.WriteString(md, tv.in[0:len(tv.in)/2]) - md.Sum(nil) - io.WriteString(md, tv.in[len(tv.in)/2:]) - } - s := fmt.Sprintf("%x", md.Sum(nil)) - if s != tv.out { - t.Fatalf("RIPEMD-160[%d](%s) = %s, expected %s", j, tv.in, s, tv.out) - } - md.Reset() - } - } -} - -func TestMillionA(t *testing.T) { - md := New() - for i := 0; i < 100000; i++ { - io.WriteString(md, "aaaaaaaaaa") - } - out := "52783243c1697bdbe16d37f97f68f08325dc1528" - s := fmt.Sprintf("%x", md.Sum(nil)) - if s != out { - t.Fatalf("RIPEMD-160 (1 million 'a') = %s, expected %s", s, out) - } - md.Reset() -} diff --git a/vendor/golang.org/x/crypto/ripemd160/ripemd160block.go b/vendor/golang.org/x/crypto/ripemd160/ripemd160block.go deleted file mode 100644 index 7bc8e6c48..000000000 --- a/vendor/golang.org/x/crypto/ripemd160/ripemd160block.go +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// RIPEMD-160 block step. -// In its own file so that a faster assembly or C version -// can be substituted easily. - -package ripemd160 - -// work buffer indices and roll amounts for one line -var _n = [80]uint{ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, - 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, - 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, - 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13, -} - -var _r = [80]uint{ - 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, - 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, - 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, - 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, - 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6, -} - -// same for the other parallel one -var n_ = [80]uint{ - 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, - 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, - 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, - 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, - 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11, -} - -var r_ = [80]uint{ - 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, - 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, - 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, - 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, - 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11, -} - -func _Block(md *digest, p []byte) int { - n := 0 - var x [16]uint32 - var alpha, beta uint32 - for len(p) >= BlockSize { - a, b, c, d, e := md.s[0], md.s[1], md.s[2], md.s[3], md.s[4] - aa, bb, cc, dd, ee := a, b, c, d, e - j := 0 - for i := 0; i < 16; i++ { - x[i] = uint32(p[j]) | uint32(p[j+1])<<8 | uint32(p[j+2])<<16 | uint32(p[j+3])<<24 - j += 4 - } - - // round 1 - i := 0 - for i < 16 { - alpha = a + (b ^ c ^ d) + x[_n[i]] - s := _r[i] - alpha = (alpha<>(32-s)) + e - beta = c<<10 | c>>22 - a, b, c, d, e = e, alpha, b, beta, d - - // parallel line - alpha = aa + (bb ^ (cc | ^dd)) + x[n_[i]] + 0x50a28be6 - s = r_[i] - alpha = (alpha<>(32-s)) + ee - beta = cc<<10 | cc>>22 - aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd - - i++ - } - - // round 2 - for i < 32 { - alpha = a + (b&c | ^b&d) + x[_n[i]] + 0x5a827999 - s := _r[i] - alpha = (alpha<>(32-s)) + e - beta = c<<10 | c>>22 - a, b, c, d, e = e, alpha, b, beta, d - - // parallel line - alpha = aa + (bb&dd | cc&^dd) + x[n_[i]] + 0x5c4dd124 - s = r_[i] - alpha = (alpha<>(32-s)) + ee - beta = cc<<10 | cc>>22 - aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd - - i++ - } - - // round 3 - for i < 48 { - alpha = a + (b | ^c ^ d) + x[_n[i]] + 0x6ed9eba1 - s := _r[i] - alpha = (alpha<>(32-s)) + e - beta = c<<10 | c>>22 - a, b, c, d, e = e, alpha, b, beta, d - - // parallel line - alpha = aa + (bb | ^cc ^ dd) + x[n_[i]] + 0x6d703ef3 - s = r_[i] - alpha = (alpha<>(32-s)) + ee - beta = cc<<10 | cc>>22 - aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd - - i++ - } - - // round 4 - for i < 64 { - alpha = a + (b&d | c&^d) + x[_n[i]] + 0x8f1bbcdc - s := _r[i] - alpha = (alpha<>(32-s)) + e - beta = c<<10 | c>>22 - a, b, c, d, e = e, alpha, b, beta, d - - // parallel line - alpha = aa + (bb&cc | ^bb&dd) + x[n_[i]] + 0x7a6d76e9 - s = r_[i] - alpha = (alpha<>(32-s)) + ee - beta = cc<<10 | cc>>22 - aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd - - i++ - } - - // round 5 - for i < 80 { - alpha = a + (b ^ (c | ^d)) + x[_n[i]] + 0xa953fd4e - s := _r[i] - alpha = (alpha<>(32-s)) + e - beta = c<<10 | c>>22 - a, b, c, d, e = e, alpha, b, beta, d - - // parallel line - alpha = aa + (bb ^ cc ^ dd) + x[n_[i]] - s = r_[i] - alpha = (alpha<>(32-s)) + ee - beta = cc<<10 | cc>>22 - aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd - - i++ - } - - // combine results - dd += c + md.s[1] - md.s[1] = md.s[2] + d + ee - md.s[2] = md.s[3] + e + aa - md.s[3] = md.s[4] + a + bb - md.s[4] = md.s[0] + b + cc - md.s[0] = dd - - p = p[BlockSize:] - n += BlockSize - } - return n -} diff --git a/vendor/golang.org/x/crypto/salsa20/salsa/hsalsa20.go b/vendor/golang.org/x/crypto/salsa20/salsa/hsalsa20.go deleted file mode 100644 index 4c96147c8..000000000 --- a/vendor/golang.org/x/crypto/salsa20/salsa/hsalsa20.go +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package salsa provides low-level access to functions in the Salsa family. -package salsa // import "golang.org/x/crypto/salsa20/salsa" - -// Sigma is the Salsa20 constant for 256-bit keys. -var Sigma = [16]byte{'e', 'x', 'p', 'a', 'n', 'd', ' ', '3', '2', '-', 'b', 'y', 't', 'e', ' ', 'k'} - -// HSalsa20 applies the HSalsa20 core function to a 16-byte input in, 32-byte -// key k, and 16-byte constant c, and puts the result into the 32-byte array -// out. -func HSalsa20(out *[32]byte, in *[16]byte, k *[32]byte, c *[16]byte) { - x0 := uint32(c[0]) | uint32(c[1])<<8 | uint32(c[2])<<16 | uint32(c[3])<<24 - x1 := uint32(k[0]) | uint32(k[1])<<8 | uint32(k[2])<<16 | uint32(k[3])<<24 - x2 := uint32(k[4]) | uint32(k[5])<<8 | uint32(k[6])<<16 | uint32(k[7])<<24 - x3 := uint32(k[8]) | uint32(k[9])<<8 | uint32(k[10])<<16 | uint32(k[11])<<24 - x4 := uint32(k[12]) | uint32(k[13])<<8 | uint32(k[14])<<16 | uint32(k[15])<<24 - x5 := uint32(c[4]) | uint32(c[5])<<8 | uint32(c[6])<<16 | uint32(c[7])<<24 - x6 := uint32(in[0]) | uint32(in[1])<<8 | uint32(in[2])<<16 | uint32(in[3])<<24 - x7 := uint32(in[4]) | uint32(in[5])<<8 | uint32(in[6])<<16 | uint32(in[7])<<24 - x8 := uint32(in[8]) | uint32(in[9])<<8 | uint32(in[10])<<16 | uint32(in[11])<<24 - x9 := uint32(in[12]) | uint32(in[13])<<8 | uint32(in[14])<<16 | uint32(in[15])<<24 - x10 := uint32(c[8]) | uint32(c[9])<<8 | uint32(c[10])<<16 | uint32(c[11])<<24 - x11 := uint32(k[16]) | uint32(k[17])<<8 | uint32(k[18])<<16 | uint32(k[19])<<24 - x12 := uint32(k[20]) | uint32(k[21])<<8 | uint32(k[22])<<16 | uint32(k[23])<<24 - x13 := uint32(k[24]) | uint32(k[25])<<8 | uint32(k[26])<<16 | uint32(k[27])<<24 - x14 := uint32(k[28]) | uint32(k[29])<<8 | uint32(k[30])<<16 | uint32(k[31])<<24 - x15 := uint32(c[12]) | uint32(c[13])<<8 | uint32(c[14])<<16 | uint32(c[15])<<24 - - for i := 0; i < 20; i += 2 { - u := x0 + x12 - x4 ^= u<<7 | u>>(32-7) - u = x4 + x0 - x8 ^= u<<9 | u>>(32-9) - u = x8 + x4 - x12 ^= u<<13 | u>>(32-13) - u = x12 + x8 - x0 ^= u<<18 | u>>(32-18) - - u = x5 + x1 - x9 ^= u<<7 | u>>(32-7) - u = x9 + x5 - x13 ^= u<<9 | u>>(32-9) - u = x13 + x9 - x1 ^= u<<13 | u>>(32-13) - u = x1 + x13 - x5 ^= u<<18 | u>>(32-18) - - u = x10 + x6 - x14 ^= u<<7 | u>>(32-7) - u = x14 + x10 - x2 ^= u<<9 | u>>(32-9) - u = x2 + x14 - x6 ^= u<<13 | u>>(32-13) - u = x6 + x2 - x10 ^= u<<18 | u>>(32-18) - - u = x15 + x11 - x3 ^= u<<7 | u>>(32-7) - u = x3 + x15 - x7 ^= u<<9 | u>>(32-9) - u = x7 + x3 - x11 ^= u<<13 | u>>(32-13) - u = x11 + x7 - x15 ^= u<<18 | u>>(32-18) - - u = x0 + x3 - x1 ^= u<<7 | u>>(32-7) - u = x1 + x0 - x2 ^= u<<9 | u>>(32-9) - u = x2 + x1 - x3 ^= u<<13 | u>>(32-13) - u = x3 + x2 - x0 ^= u<<18 | u>>(32-18) - - u = x5 + x4 - x6 ^= u<<7 | u>>(32-7) - u = x6 + x5 - x7 ^= u<<9 | u>>(32-9) - u = x7 + x6 - x4 ^= u<<13 | u>>(32-13) - u = x4 + x7 - x5 ^= u<<18 | u>>(32-18) - - u = x10 + x9 - x11 ^= u<<7 | u>>(32-7) - u = x11 + x10 - x8 ^= u<<9 | u>>(32-9) - u = x8 + x11 - x9 ^= u<<13 | u>>(32-13) - u = x9 + x8 - x10 ^= u<<18 | u>>(32-18) - - u = x15 + x14 - x12 ^= u<<7 | u>>(32-7) - u = x12 + x15 - x13 ^= u<<9 | u>>(32-9) - u = x13 + x12 - x14 ^= u<<13 | u>>(32-13) - u = x14 + x13 - x15 ^= u<<18 | u>>(32-18) - } - out[0] = byte(x0) - out[1] = byte(x0 >> 8) - out[2] = byte(x0 >> 16) - out[3] = byte(x0 >> 24) - - out[4] = byte(x5) - out[5] = byte(x5 >> 8) - out[6] = byte(x5 >> 16) - out[7] = byte(x5 >> 24) - - out[8] = byte(x10) - out[9] = byte(x10 >> 8) - out[10] = byte(x10 >> 16) - out[11] = byte(x10 >> 24) - - out[12] = byte(x15) - out[13] = byte(x15 >> 8) - out[14] = byte(x15 >> 16) - out[15] = byte(x15 >> 24) - - out[16] = byte(x6) - out[17] = byte(x6 >> 8) - out[18] = byte(x6 >> 16) - out[19] = byte(x6 >> 24) - - out[20] = byte(x7) - out[21] = byte(x7 >> 8) - out[22] = byte(x7 >> 16) - out[23] = byte(x7 >> 24) - - out[24] = byte(x8) - out[25] = byte(x8 >> 8) - out[26] = byte(x8 >> 16) - out[27] = byte(x8 >> 24) - - out[28] = byte(x9) - out[29] = byte(x9 >> 8) - out[30] = byte(x9 >> 16) - out[31] = byte(x9 >> 24) -} diff --git a/vendor/golang.org/x/crypto/salsa20/salsa/salsa2020_amd64.s b/vendor/golang.org/x/crypto/salsa20/salsa/salsa2020_amd64.s deleted file mode 100644 index 083fe3857..000000000 --- a/vendor/golang.org/x/crypto/salsa20/salsa/salsa2020_amd64.s +++ /dev/null @@ -1,889 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build amd64,!appengine,!gccgo - -// This code was translated into a form compatible with 6a from the public -// domain sources in SUPERCOP: http://bench.cr.yp.to/supercop.html - -// func salsa2020XORKeyStream(out, in *byte, n uint64, nonce, key *byte) -// This needs up to 64 bytes at 360(SP); hence the non-obvious frame size. -TEXT ·salsa2020XORKeyStream(SB),0,$456-40 // frame = 424 + 32 byte alignment - MOVQ out+0(FP),DI - MOVQ in+8(FP),SI - MOVQ n+16(FP),DX - MOVQ nonce+24(FP),CX - MOVQ key+32(FP),R8 - - MOVQ SP,R12 - MOVQ SP,R9 - ADDQ $31, R9 - ANDQ $~31, R9 - MOVQ R9, SP - - MOVQ DX,R9 - MOVQ CX,DX - MOVQ R8,R10 - CMPQ R9,$0 - JBE DONE - START: - MOVL 20(R10),CX - MOVL 0(R10),R8 - MOVL 0(DX),AX - MOVL 16(R10),R11 - MOVL CX,0(SP) - MOVL R8, 4 (SP) - MOVL AX, 8 (SP) - MOVL R11, 12 (SP) - MOVL 8(DX),CX - MOVL 24(R10),R8 - MOVL 4(R10),AX - MOVL 4(DX),R11 - MOVL CX,16(SP) - MOVL R8, 20 (SP) - MOVL AX, 24 (SP) - MOVL R11, 28 (SP) - MOVL 12(DX),CX - MOVL 12(R10),DX - MOVL 28(R10),R8 - MOVL 8(R10),AX - MOVL DX,32(SP) - MOVL CX, 36 (SP) - MOVL R8, 40 (SP) - MOVL AX, 44 (SP) - MOVQ $1634760805,DX - MOVQ $857760878,CX - MOVQ $2036477234,R8 - MOVQ $1797285236,AX - MOVL DX,48(SP) - MOVL CX, 52 (SP) - MOVL R8, 56 (SP) - MOVL AX, 60 (SP) - CMPQ R9,$256 - JB BYTESBETWEEN1AND255 - MOVOA 48(SP),X0 - PSHUFL $0X55,X0,X1 - PSHUFL $0XAA,X0,X2 - PSHUFL $0XFF,X0,X3 - PSHUFL $0X00,X0,X0 - MOVOA X1,64(SP) - MOVOA X2,80(SP) - MOVOA X3,96(SP) - MOVOA X0,112(SP) - MOVOA 0(SP),X0 - PSHUFL $0XAA,X0,X1 - PSHUFL $0XFF,X0,X2 - PSHUFL $0X00,X0,X3 - PSHUFL $0X55,X0,X0 - MOVOA X1,128(SP) - MOVOA X2,144(SP) - MOVOA X3,160(SP) - MOVOA X0,176(SP) - MOVOA 16(SP),X0 - PSHUFL $0XFF,X0,X1 - PSHUFL $0X55,X0,X2 - PSHUFL $0XAA,X0,X0 - MOVOA X1,192(SP) - MOVOA X2,208(SP) - MOVOA X0,224(SP) - MOVOA 32(SP),X0 - PSHUFL $0X00,X0,X1 - PSHUFL $0XAA,X0,X2 - PSHUFL $0XFF,X0,X0 - MOVOA X1,240(SP) - MOVOA X2,256(SP) - MOVOA X0,272(SP) - BYTESATLEAST256: - MOVL 16(SP),DX - MOVL 36 (SP),CX - MOVL DX,288(SP) - MOVL CX,304(SP) - ADDQ $1,DX - SHLQ $32,CX - ADDQ CX,DX - MOVQ DX,CX - SHRQ $32,CX - MOVL DX, 292 (SP) - MOVL CX, 308 (SP) - ADDQ $1,DX - SHLQ $32,CX - ADDQ CX,DX - MOVQ DX,CX - SHRQ $32,CX - MOVL DX, 296 (SP) - MOVL CX, 312 (SP) - ADDQ $1,DX - SHLQ $32,CX - ADDQ CX,DX - MOVQ DX,CX - SHRQ $32,CX - MOVL DX, 300 (SP) - MOVL CX, 316 (SP) - ADDQ $1,DX - SHLQ $32,CX - ADDQ CX,DX - MOVQ DX,CX - SHRQ $32,CX - MOVL DX,16(SP) - MOVL CX, 36 (SP) - MOVQ R9,352(SP) - MOVQ $20,DX - MOVOA 64(SP),X0 - MOVOA 80(SP),X1 - MOVOA 96(SP),X2 - MOVOA 256(SP),X3 - MOVOA 272(SP),X4 - MOVOA 128(SP),X5 - MOVOA 144(SP),X6 - MOVOA 176(SP),X7 - MOVOA 192(SP),X8 - MOVOA 208(SP),X9 - MOVOA 224(SP),X10 - MOVOA 304(SP),X11 - MOVOA 112(SP),X12 - MOVOA 160(SP),X13 - MOVOA 240(SP),X14 - MOVOA 288(SP),X15 - MAINLOOP1: - MOVOA X1,320(SP) - MOVOA X2,336(SP) - MOVOA X13,X1 - PADDL X12,X1 - MOVOA X1,X2 - PSLLL $7,X1 - PXOR X1,X14 - PSRLL $25,X2 - PXOR X2,X14 - MOVOA X7,X1 - PADDL X0,X1 - MOVOA X1,X2 - PSLLL $7,X1 - PXOR X1,X11 - PSRLL $25,X2 - PXOR X2,X11 - MOVOA X12,X1 - PADDL X14,X1 - MOVOA X1,X2 - PSLLL $9,X1 - PXOR X1,X15 - PSRLL $23,X2 - PXOR X2,X15 - MOVOA X0,X1 - PADDL X11,X1 - MOVOA X1,X2 - PSLLL $9,X1 - PXOR X1,X9 - PSRLL $23,X2 - PXOR X2,X9 - MOVOA X14,X1 - PADDL X15,X1 - MOVOA X1,X2 - PSLLL $13,X1 - PXOR X1,X13 - PSRLL $19,X2 - PXOR X2,X13 - MOVOA X11,X1 - PADDL X9,X1 - MOVOA X1,X2 - PSLLL $13,X1 - PXOR X1,X7 - PSRLL $19,X2 - PXOR X2,X7 - MOVOA X15,X1 - PADDL X13,X1 - MOVOA X1,X2 - PSLLL $18,X1 - PXOR X1,X12 - PSRLL $14,X2 - PXOR X2,X12 - MOVOA 320(SP),X1 - MOVOA X12,320(SP) - MOVOA X9,X2 - PADDL X7,X2 - MOVOA X2,X12 - PSLLL $18,X2 - PXOR X2,X0 - PSRLL $14,X12 - PXOR X12,X0 - MOVOA X5,X2 - PADDL X1,X2 - MOVOA X2,X12 - PSLLL $7,X2 - PXOR X2,X3 - PSRLL $25,X12 - PXOR X12,X3 - MOVOA 336(SP),X2 - MOVOA X0,336(SP) - MOVOA X6,X0 - PADDL X2,X0 - MOVOA X0,X12 - PSLLL $7,X0 - PXOR X0,X4 - PSRLL $25,X12 - PXOR X12,X4 - MOVOA X1,X0 - PADDL X3,X0 - MOVOA X0,X12 - PSLLL $9,X0 - PXOR X0,X10 - PSRLL $23,X12 - PXOR X12,X10 - MOVOA X2,X0 - PADDL X4,X0 - MOVOA X0,X12 - PSLLL $9,X0 - PXOR X0,X8 - PSRLL $23,X12 - PXOR X12,X8 - MOVOA X3,X0 - PADDL X10,X0 - MOVOA X0,X12 - PSLLL $13,X0 - PXOR X0,X5 - PSRLL $19,X12 - PXOR X12,X5 - MOVOA X4,X0 - PADDL X8,X0 - MOVOA X0,X12 - PSLLL $13,X0 - PXOR X0,X6 - PSRLL $19,X12 - PXOR X12,X6 - MOVOA X10,X0 - PADDL X5,X0 - MOVOA X0,X12 - PSLLL $18,X0 - PXOR X0,X1 - PSRLL $14,X12 - PXOR X12,X1 - MOVOA 320(SP),X0 - MOVOA X1,320(SP) - MOVOA X4,X1 - PADDL X0,X1 - MOVOA X1,X12 - PSLLL $7,X1 - PXOR X1,X7 - PSRLL $25,X12 - PXOR X12,X7 - MOVOA X8,X1 - PADDL X6,X1 - MOVOA X1,X12 - PSLLL $18,X1 - PXOR X1,X2 - PSRLL $14,X12 - PXOR X12,X2 - MOVOA 336(SP),X12 - MOVOA X2,336(SP) - MOVOA X14,X1 - PADDL X12,X1 - MOVOA X1,X2 - PSLLL $7,X1 - PXOR X1,X5 - PSRLL $25,X2 - PXOR X2,X5 - MOVOA X0,X1 - PADDL X7,X1 - MOVOA X1,X2 - PSLLL $9,X1 - PXOR X1,X10 - PSRLL $23,X2 - PXOR X2,X10 - MOVOA X12,X1 - PADDL X5,X1 - MOVOA X1,X2 - PSLLL $9,X1 - PXOR X1,X8 - PSRLL $23,X2 - PXOR X2,X8 - MOVOA X7,X1 - PADDL X10,X1 - MOVOA X1,X2 - PSLLL $13,X1 - PXOR X1,X4 - PSRLL $19,X2 - PXOR X2,X4 - MOVOA X5,X1 - PADDL X8,X1 - MOVOA X1,X2 - PSLLL $13,X1 - PXOR X1,X14 - PSRLL $19,X2 - PXOR X2,X14 - MOVOA X10,X1 - PADDL X4,X1 - MOVOA X1,X2 - PSLLL $18,X1 - PXOR X1,X0 - PSRLL $14,X2 - PXOR X2,X0 - MOVOA 320(SP),X1 - MOVOA X0,320(SP) - MOVOA X8,X0 - PADDL X14,X0 - MOVOA X0,X2 - PSLLL $18,X0 - PXOR X0,X12 - PSRLL $14,X2 - PXOR X2,X12 - MOVOA X11,X0 - PADDL X1,X0 - MOVOA X0,X2 - PSLLL $7,X0 - PXOR X0,X6 - PSRLL $25,X2 - PXOR X2,X6 - MOVOA 336(SP),X2 - MOVOA X12,336(SP) - MOVOA X3,X0 - PADDL X2,X0 - MOVOA X0,X12 - PSLLL $7,X0 - PXOR X0,X13 - PSRLL $25,X12 - PXOR X12,X13 - MOVOA X1,X0 - PADDL X6,X0 - MOVOA X0,X12 - PSLLL $9,X0 - PXOR X0,X15 - PSRLL $23,X12 - PXOR X12,X15 - MOVOA X2,X0 - PADDL X13,X0 - MOVOA X0,X12 - PSLLL $9,X0 - PXOR X0,X9 - PSRLL $23,X12 - PXOR X12,X9 - MOVOA X6,X0 - PADDL X15,X0 - MOVOA X0,X12 - PSLLL $13,X0 - PXOR X0,X11 - PSRLL $19,X12 - PXOR X12,X11 - MOVOA X13,X0 - PADDL X9,X0 - MOVOA X0,X12 - PSLLL $13,X0 - PXOR X0,X3 - PSRLL $19,X12 - PXOR X12,X3 - MOVOA X15,X0 - PADDL X11,X0 - MOVOA X0,X12 - PSLLL $18,X0 - PXOR X0,X1 - PSRLL $14,X12 - PXOR X12,X1 - MOVOA X9,X0 - PADDL X3,X0 - MOVOA X0,X12 - PSLLL $18,X0 - PXOR X0,X2 - PSRLL $14,X12 - PXOR X12,X2 - MOVOA 320(SP),X12 - MOVOA 336(SP),X0 - SUBQ $2,DX - JA MAINLOOP1 - PADDL 112(SP),X12 - PADDL 176(SP),X7 - PADDL 224(SP),X10 - PADDL 272(SP),X4 - MOVD X12,DX - MOVD X7,CX - MOVD X10,R8 - MOVD X4,R9 - PSHUFL $0X39,X12,X12 - PSHUFL $0X39,X7,X7 - PSHUFL $0X39,X10,X10 - PSHUFL $0X39,X4,X4 - XORL 0(SI),DX - XORL 4(SI),CX - XORL 8(SI),R8 - XORL 12(SI),R9 - MOVL DX,0(DI) - MOVL CX,4(DI) - MOVL R8,8(DI) - MOVL R9,12(DI) - MOVD X12,DX - MOVD X7,CX - MOVD X10,R8 - MOVD X4,R9 - PSHUFL $0X39,X12,X12 - PSHUFL $0X39,X7,X7 - PSHUFL $0X39,X10,X10 - PSHUFL $0X39,X4,X4 - XORL 64(SI),DX - XORL 68(SI),CX - XORL 72(SI),R8 - XORL 76(SI),R9 - MOVL DX,64(DI) - MOVL CX,68(DI) - MOVL R8,72(DI) - MOVL R9,76(DI) - MOVD X12,DX - MOVD X7,CX - MOVD X10,R8 - MOVD X4,R9 - PSHUFL $0X39,X12,X12 - PSHUFL $0X39,X7,X7 - PSHUFL $0X39,X10,X10 - PSHUFL $0X39,X4,X4 - XORL 128(SI),DX - XORL 132(SI),CX - XORL 136(SI),R8 - XORL 140(SI),R9 - MOVL DX,128(DI) - MOVL CX,132(DI) - MOVL R8,136(DI) - MOVL R9,140(DI) - MOVD X12,DX - MOVD X7,CX - MOVD X10,R8 - MOVD X4,R9 - XORL 192(SI),DX - XORL 196(SI),CX - XORL 200(SI),R8 - XORL 204(SI),R9 - MOVL DX,192(DI) - MOVL CX,196(DI) - MOVL R8,200(DI) - MOVL R9,204(DI) - PADDL 240(SP),X14 - PADDL 64(SP),X0 - PADDL 128(SP),X5 - PADDL 192(SP),X8 - MOVD X14,DX - MOVD X0,CX - MOVD X5,R8 - MOVD X8,R9 - PSHUFL $0X39,X14,X14 - PSHUFL $0X39,X0,X0 - PSHUFL $0X39,X5,X5 - PSHUFL $0X39,X8,X8 - XORL 16(SI),DX - XORL 20(SI),CX - XORL 24(SI),R8 - XORL 28(SI),R9 - MOVL DX,16(DI) - MOVL CX,20(DI) - MOVL R8,24(DI) - MOVL R9,28(DI) - MOVD X14,DX - MOVD X0,CX - MOVD X5,R8 - MOVD X8,R9 - PSHUFL $0X39,X14,X14 - PSHUFL $0X39,X0,X0 - PSHUFL $0X39,X5,X5 - PSHUFL $0X39,X8,X8 - XORL 80(SI),DX - XORL 84(SI),CX - XORL 88(SI),R8 - XORL 92(SI),R9 - MOVL DX,80(DI) - MOVL CX,84(DI) - MOVL R8,88(DI) - MOVL R9,92(DI) - MOVD X14,DX - MOVD X0,CX - MOVD X5,R8 - MOVD X8,R9 - PSHUFL $0X39,X14,X14 - PSHUFL $0X39,X0,X0 - PSHUFL $0X39,X5,X5 - PSHUFL $0X39,X8,X8 - XORL 144(SI),DX - XORL 148(SI),CX - XORL 152(SI),R8 - XORL 156(SI),R9 - MOVL DX,144(DI) - MOVL CX,148(DI) - MOVL R8,152(DI) - MOVL R9,156(DI) - MOVD X14,DX - MOVD X0,CX - MOVD X5,R8 - MOVD X8,R9 - XORL 208(SI),DX - XORL 212(SI),CX - XORL 216(SI),R8 - XORL 220(SI),R9 - MOVL DX,208(DI) - MOVL CX,212(DI) - MOVL R8,216(DI) - MOVL R9,220(DI) - PADDL 288(SP),X15 - PADDL 304(SP),X11 - PADDL 80(SP),X1 - PADDL 144(SP),X6 - MOVD X15,DX - MOVD X11,CX - MOVD X1,R8 - MOVD X6,R9 - PSHUFL $0X39,X15,X15 - PSHUFL $0X39,X11,X11 - PSHUFL $0X39,X1,X1 - PSHUFL $0X39,X6,X6 - XORL 32(SI),DX - XORL 36(SI),CX - XORL 40(SI),R8 - XORL 44(SI),R9 - MOVL DX,32(DI) - MOVL CX,36(DI) - MOVL R8,40(DI) - MOVL R9,44(DI) - MOVD X15,DX - MOVD X11,CX - MOVD X1,R8 - MOVD X6,R9 - PSHUFL $0X39,X15,X15 - PSHUFL $0X39,X11,X11 - PSHUFL $0X39,X1,X1 - PSHUFL $0X39,X6,X6 - XORL 96(SI),DX - XORL 100(SI),CX - XORL 104(SI),R8 - XORL 108(SI),R9 - MOVL DX,96(DI) - MOVL CX,100(DI) - MOVL R8,104(DI) - MOVL R9,108(DI) - MOVD X15,DX - MOVD X11,CX - MOVD X1,R8 - MOVD X6,R9 - PSHUFL $0X39,X15,X15 - PSHUFL $0X39,X11,X11 - PSHUFL $0X39,X1,X1 - PSHUFL $0X39,X6,X6 - XORL 160(SI),DX - XORL 164(SI),CX - XORL 168(SI),R8 - XORL 172(SI),R9 - MOVL DX,160(DI) - MOVL CX,164(DI) - MOVL R8,168(DI) - MOVL R9,172(DI) - MOVD X15,DX - MOVD X11,CX - MOVD X1,R8 - MOVD X6,R9 - XORL 224(SI),DX - XORL 228(SI),CX - XORL 232(SI),R8 - XORL 236(SI),R9 - MOVL DX,224(DI) - MOVL CX,228(DI) - MOVL R8,232(DI) - MOVL R9,236(DI) - PADDL 160(SP),X13 - PADDL 208(SP),X9 - PADDL 256(SP),X3 - PADDL 96(SP),X2 - MOVD X13,DX - MOVD X9,CX - MOVD X3,R8 - MOVD X2,R9 - PSHUFL $0X39,X13,X13 - PSHUFL $0X39,X9,X9 - PSHUFL $0X39,X3,X3 - PSHUFL $0X39,X2,X2 - XORL 48(SI),DX - XORL 52(SI),CX - XORL 56(SI),R8 - XORL 60(SI),R9 - MOVL DX,48(DI) - MOVL CX,52(DI) - MOVL R8,56(DI) - MOVL R9,60(DI) - MOVD X13,DX - MOVD X9,CX - MOVD X3,R8 - MOVD X2,R9 - PSHUFL $0X39,X13,X13 - PSHUFL $0X39,X9,X9 - PSHUFL $0X39,X3,X3 - PSHUFL $0X39,X2,X2 - XORL 112(SI),DX - XORL 116(SI),CX - XORL 120(SI),R8 - XORL 124(SI),R9 - MOVL DX,112(DI) - MOVL CX,116(DI) - MOVL R8,120(DI) - MOVL R9,124(DI) - MOVD X13,DX - MOVD X9,CX - MOVD X3,R8 - MOVD X2,R9 - PSHUFL $0X39,X13,X13 - PSHUFL $0X39,X9,X9 - PSHUFL $0X39,X3,X3 - PSHUFL $0X39,X2,X2 - XORL 176(SI),DX - XORL 180(SI),CX - XORL 184(SI),R8 - XORL 188(SI),R9 - MOVL DX,176(DI) - MOVL CX,180(DI) - MOVL R8,184(DI) - MOVL R9,188(DI) - MOVD X13,DX - MOVD X9,CX - MOVD X3,R8 - MOVD X2,R9 - XORL 240(SI),DX - XORL 244(SI),CX - XORL 248(SI),R8 - XORL 252(SI),R9 - MOVL DX,240(DI) - MOVL CX,244(DI) - MOVL R8,248(DI) - MOVL R9,252(DI) - MOVQ 352(SP),R9 - SUBQ $256,R9 - ADDQ $256,SI - ADDQ $256,DI - CMPQ R9,$256 - JAE BYTESATLEAST256 - CMPQ R9,$0 - JBE DONE - BYTESBETWEEN1AND255: - CMPQ R9,$64 - JAE NOCOPY - MOVQ DI,DX - LEAQ 360(SP),DI - MOVQ R9,CX - REP; MOVSB - LEAQ 360(SP),DI - LEAQ 360(SP),SI - NOCOPY: - MOVQ R9,352(SP) - MOVOA 48(SP),X0 - MOVOA 0(SP),X1 - MOVOA 16(SP),X2 - MOVOA 32(SP),X3 - MOVOA X1,X4 - MOVQ $20,CX - MAINLOOP2: - PADDL X0,X4 - MOVOA X0,X5 - MOVOA X4,X6 - PSLLL $7,X4 - PSRLL $25,X6 - PXOR X4,X3 - PXOR X6,X3 - PADDL X3,X5 - MOVOA X3,X4 - MOVOA X5,X6 - PSLLL $9,X5 - PSRLL $23,X6 - PXOR X5,X2 - PSHUFL $0X93,X3,X3 - PXOR X6,X2 - PADDL X2,X4 - MOVOA X2,X5 - MOVOA X4,X6 - PSLLL $13,X4 - PSRLL $19,X6 - PXOR X4,X1 - PSHUFL $0X4E,X2,X2 - PXOR X6,X1 - PADDL X1,X5 - MOVOA X3,X4 - MOVOA X5,X6 - PSLLL $18,X5 - PSRLL $14,X6 - PXOR X5,X0 - PSHUFL $0X39,X1,X1 - PXOR X6,X0 - PADDL X0,X4 - MOVOA X0,X5 - MOVOA X4,X6 - PSLLL $7,X4 - PSRLL $25,X6 - PXOR X4,X1 - PXOR X6,X1 - PADDL X1,X5 - MOVOA X1,X4 - MOVOA X5,X6 - PSLLL $9,X5 - PSRLL $23,X6 - PXOR X5,X2 - PSHUFL $0X93,X1,X1 - PXOR X6,X2 - PADDL X2,X4 - MOVOA X2,X5 - MOVOA X4,X6 - PSLLL $13,X4 - PSRLL $19,X6 - PXOR X4,X3 - PSHUFL $0X4E,X2,X2 - PXOR X6,X3 - PADDL X3,X5 - MOVOA X1,X4 - MOVOA X5,X6 - PSLLL $18,X5 - PSRLL $14,X6 - PXOR X5,X0 - PSHUFL $0X39,X3,X3 - PXOR X6,X0 - PADDL X0,X4 - MOVOA X0,X5 - MOVOA X4,X6 - PSLLL $7,X4 - PSRLL $25,X6 - PXOR X4,X3 - PXOR X6,X3 - PADDL X3,X5 - MOVOA X3,X4 - MOVOA X5,X6 - PSLLL $9,X5 - PSRLL $23,X6 - PXOR X5,X2 - PSHUFL $0X93,X3,X3 - PXOR X6,X2 - PADDL X2,X4 - MOVOA X2,X5 - MOVOA X4,X6 - PSLLL $13,X4 - PSRLL $19,X6 - PXOR X4,X1 - PSHUFL $0X4E,X2,X2 - PXOR X6,X1 - PADDL X1,X5 - MOVOA X3,X4 - MOVOA X5,X6 - PSLLL $18,X5 - PSRLL $14,X6 - PXOR X5,X0 - PSHUFL $0X39,X1,X1 - PXOR X6,X0 - PADDL X0,X4 - MOVOA X0,X5 - MOVOA X4,X6 - PSLLL $7,X4 - PSRLL $25,X6 - PXOR X4,X1 - PXOR X6,X1 - PADDL X1,X5 - MOVOA X1,X4 - MOVOA X5,X6 - PSLLL $9,X5 - PSRLL $23,X6 - PXOR X5,X2 - PSHUFL $0X93,X1,X1 - PXOR X6,X2 - PADDL X2,X4 - MOVOA X2,X5 - MOVOA X4,X6 - PSLLL $13,X4 - PSRLL $19,X6 - PXOR X4,X3 - PSHUFL $0X4E,X2,X2 - PXOR X6,X3 - SUBQ $4,CX - PADDL X3,X5 - MOVOA X1,X4 - MOVOA X5,X6 - PSLLL $18,X5 - PXOR X7,X7 - PSRLL $14,X6 - PXOR X5,X0 - PSHUFL $0X39,X3,X3 - PXOR X6,X0 - JA MAINLOOP2 - PADDL 48(SP),X0 - PADDL 0(SP),X1 - PADDL 16(SP),X2 - PADDL 32(SP),X3 - MOVD X0,CX - MOVD X1,R8 - MOVD X2,R9 - MOVD X3,AX - PSHUFL $0X39,X0,X0 - PSHUFL $0X39,X1,X1 - PSHUFL $0X39,X2,X2 - PSHUFL $0X39,X3,X3 - XORL 0(SI),CX - XORL 48(SI),R8 - XORL 32(SI),R9 - XORL 16(SI),AX - MOVL CX,0(DI) - MOVL R8,48(DI) - MOVL R9,32(DI) - MOVL AX,16(DI) - MOVD X0,CX - MOVD X1,R8 - MOVD X2,R9 - MOVD X3,AX - PSHUFL $0X39,X0,X0 - PSHUFL $0X39,X1,X1 - PSHUFL $0X39,X2,X2 - PSHUFL $0X39,X3,X3 - XORL 20(SI),CX - XORL 4(SI),R8 - XORL 52(SI),R9 - XORL 36(SI),AX - MOVL CX,20(DI) - MOVL R8,4(DI) - MOVL R9,52(DI) - MOVL AX,36(DI) - MOVD X0,CX - MOVD X1,R8 - MOVD X2,R9 - MOVD X3,AX - PSHUFL $0X39,X0,X0 - PSHUFL $0X39,X1,X1 - PSHUFL $0X39,X2,X2 - PSHUFL $0X39,X3,X3 - XORL 40(SI),CX - XORL 24(SI),R8 - XORL 8(SI),R9 - XORL 56(SI),AX - MOVL CX,40(DI) - MOVL R8,24(DI) - MOVL R9,8(DI) - MOVL AX,56(DI) - MOVD X0,CX - MOVD X1,R8 - MOVD X2,R9 - MOVD X3,AX - XORL 60(SI),CX - XORL 44(SI),R8 - XORL 28(SI),R9 - XORL 12(SI),AX - MOVL CX,60(DI) - MOVL R8,44(DI) - MOVL R9,28(DI) - MOVL AX,12(DI) - MOVQ 352(SP),R9 - MOVL 16(SP),CX - MOVL 36 (SP),R8 - ADDQ $1,CX - SHLQ $32,R8 - ADDQ R8,CX - MOVQ CX,R8 - SHRQ $32,R8 - MOVL CX,16(SP) - MOVL R8, 36 (SP) - CMPQ R9,$64 - JA BYTESATLEAST65 - JAE BYTESATLEAST64 - MOVQ DI,SI - MOVQ DX,DI - MOVQ R9,CX - REP; MOVSB - BYTESATLEAST64: - DONE: - MOVQ R12,SP - RET - BYTESATLEAST65: - SUBQ $64,R9 - ADDQ $64,DI - ADDQ $64,SI - JMP BYTESBETWEEN1AND255 diff --git a/vendor/golang.org/x/crypto/salsa20/salsa/salsa208.go b/vendor/golang.org/x/crypto/salsa20/salsa/salsa208.go deleted file mode 100644 index 9bfc0927c..000000000 --- a/vendor/golang.org/x/crypto/salsa20/salsa/salsa208.go +++ /dev/null @@ -1,199 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package salsa - -// Core208 applies the Salsa20/8 core function to the 64-byte array in and puts -// the result into the 64-byte array out. The input and output may be the same array. -func Core208(out *[64]byte, in *[64]byte) { - j0 := uint32(in[0]) | uint32(in[1])<<8 | uint32(in[2])<<16 | uint32(in[3])<<24 - j1 := uint32(in[4]) | uint32(in[5])<<8 | uint32(in[6])<<16 | uint32(in[7])<<24 - j2 := uint32(in[8]) | uint32(in[9])<<8 | uint32(in[10])<<16 | uint32(in[11])<<24 - j3 := uint32(in[12]) | uint32(in[13])<<8 | uint32(in[14])<<16 | uint32(in[15])<<24 - j4 := uint32(in[16]) | uint32(in[17])<<8 | uint32(in[18])<<16 | uint32(in[19])<<24 - j5 := uint32(in[20]) | uint32(in[21])<<8 | uint32(in[22])<<16 | uint32(in[23])<<24 - j6 := uint32(in[24]) | uint32(in[25])<<8 | uint32(in[26])<<16 | uint32(in[27])<<24 - j7 := uint32(in[28]) | uint32(in[29])<<8 | uint32(in[30])<<16 | uint32(in[31])<<24 - j8 := uint32(in[32]) | uint32(in[33])<<8 | uint32(in[34])<<16 | uint32(in[35])<<24 - j9 := uint32(in[36]) | uint32(in[37])<<8 | uint32(in[38])<<16 | uint32(in[39])<<24 - j10 := uint32(in[40]) | uint32(in[41])<<8 | uint32(in[42])<<16 | uint32(in[43])<<24 - j11 := uint32(in[44]) | uint32(in[45])<<8 | uint32(in[46])<<16 | uint32(in[47])<<24 - j12 := uint32(in[48]) | uint32(in[49])<<8 | uint32(in[50])<<16 | uint32(in[51])<<24 - j13 := uint32(in[52]) | uint32(in[53])<<8 | uint32(in[54])<<16 | uint32(in[55])<<24 - j14 := uint32(in[56]) | uint32(in[57])<<8 | uint32(in[58])<<16 | uint32(in[59])<<24 - j15 := uint32(in[60]) | uint32(in[61])<<8 | uint32(in[62])<<16 | uint32(in[63])<<24 - - x0, x1, x2, x3, x4, x5, x6, x7, x8 := j0, j1, j2, j3, j4, j5, j6, j7, j8 - x9, x10, x11, x12, x13, x14, x15 := j9, j10, j11, j12, j13, j14, j15 - - for i := 0; i < 8; i += 2 { - u := x0 + x12 - x4 ^= u<<7 | u>>(32-7) - u = x4 + x0 - x8 ^= u<<9 | u>>(32-9) - u = x8 + x4 - x12 ^= u<<13 | u>>(32-13) - u = x12 + x8 - x0 ^= u<<18 | u>>(32-18) - - u = x5 + x1 - x9 ^= u<<7 | u>>(32-7) - u = x9 + x5 - x13 ^= u<<9 | u>>(32-9) - u = x13 + x9 - x1 ^= u<<13 | u>>(32-13) - u = x1 + x13 - x5 ^= u<<18 | u>>(32-18) - - u = x10 + x6 - x14 ^= u<<7 | u>>(32-7) - u = x14 + x10 - x2 ^= u<<9 | u>>(32-9) - u = x2 + x14 - x6 ^= u<<13 | u>>(32-13) - u = x6 + x2 - x10 ^= u<<18 | u>>(32-18) - - u = x15 + x11 - x3 ^= u<<7 | u>>(32-7) - u = x3 + x15 - x7 ^= u<<9 | u>>(32-9) - u = x7 + x3 - x11 ^= u<<13 | u>>(32-13) - u = x11 + x7 - x15 ^= u<<18 | u>>(32-18) - - u = x0 + x3 - x1 ^= u<<7 | u>>(32-7) - u = x1 + x0 - x2 ^= u<<9 | u>>(32-9) - u = x2 + x1 - x3 ^= u<<13 | u>>(32-13) - u = x3 + x2 - x0 ^= u<<18 | u>>(32-18) - - u = x5 + x4 - x6 ^= u<<7 | u>>(32-7) - u = x6 + x5 - x7 ^= u<<9 | u>>(32-9) - u = x7 + x6 - x4 ^= u<<13 | u>>(32-13) - u = x4 + x7 - x5 ^= u<<18 | u>>(32-18) - - u = x10 + x9 - x11 ^= u<<7 | u>>(32-7) - u = x11 + x10 - x8 ^= u<<9 | u>>(32-9) - u = x8 + x11 - x9 ^= u<<13 | u>>(32-13) - u = x9 + x8 - x10 ^= u<<18 | u>>(32-18) - - u = x15 + x14 - x12 ^= u<<7 | u>>(32-7) - u = x12 + x15 - x13 ^= u<<9 | u>>(32-9) - u = x13 + x12 - x14 ^= u<<13 | u>>(32-13) - u = x14 + x13 - x15 ^= u<<18 | u>>(32-18) - } - x0 += j0 - x1 += j1 - x2 += j2 - x3 += j3 - x4 += j4 - x5 += j5 - x6 += j6 - x7 += j7 - x8 += j8 - x9 += j9 - x10 += j10 - x11 += j11 - x12 += j12 - x13 += j13 - x14 += j14 - x15 += j15 - - out[0] = byte(x0) - out[1] = byte(x0 >> 8) - out[2] = byte(x0 >> 16) - out[3] = byte(x0 >> 24) - - out[4] = byte(x1) - out[5] = byte(x1 >> 8) - out[6] = byte(x1 >> 16) - out[7] = byte(x1 >> 24) - - out[8] = byte(x2) - out[9] = byte(x2 >> 8) - out[10] = byte(x2 >> 16) - out[11] = byte(x2 >> 24) - - out[12] = byte(x3) - out[13] = byte(x3 >> 8) - out[14] = byte(x3 >> 16) - out[15] = byte(x3 >> 24) - - out[16] = byte(x4) - out[17] = byte(x4 >> 8) - out[18] = byte(x4 >> 16) - out[19] = byte(x4 >> 24) - - out[20] = byte(x5) - out[21] = byte(x5 >> 8) - out[22] = byte(x5 >> 16) - out[23] = byte(x5 >> 24) - - out[24] = byte(x6) - out[25] = byte(x6 >> 8) - out[26] = byte(x6 >> 16) - out[27] = byte(x6 >> 24) - - out[28] = byte(x7) - out[29] = byte(x7 >> 8) - out[30] = byte(x7 >> 16) - out[31] = byte(x7 >> 24) - - out[32] = byte(x8) - out[33] = byte(x8 >> 8) - out[34] = byte(x8 >> 16) - out[35] = byte(x8 >> 24) - - out[36] = byte(x9) - out[37] = byte(x9 >> 8) - out[38] = byte(x9 >> 16) - out[39] = byte(x9 >> 24) - - out[40] = byte(x10) - out[41] = byte(x10 >> 8) - out[42] = byte(x10 >> 16) - out[43] = byte(x10 >> 24) - - out[44] = byte(x11) - out[45] = byte(x11 >> 8) - out[46] = byte(x11 >> 16) - out[47] = byte(x11 >> 24) - - out[48] = byte(x12) - out[49] = byte(x12 >> 8) - out[50] = byte(x12 >> 16) - out[51] = byte(x12 >> 24) - - out[52] = byte(x13) - out[53] = byte(x13 >> 8) - out[54] = byte(x13 >> 16) - out[55] = byte(x13 >> 24) - - out[56] = byte(x14) - out[57] = byte(x14 >> 8) - out[58] = byte(x14 >> 16) - out[59] = byte(x14 >> 24) - - out[60] = byte(x15) - out[61] = byte(x15 >> 8) - out[62] = byte(x15 >> 16) - out[63] = byte(x15 >> 24) -} diff --git a/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_amd64.go b/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_amd64.go deleted file mode 100644 index 903c7858e..000000000 --- a/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_amd64.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build amd64,!appengine,!gccgo - -package salsa - -// This function is implemented in salsa2020_amd64.s. - -//go:noescape - -func salsa2020XORKeyStream(out, in *byte, n uint64, nonce, key *byte) - -// XORKeyStream crypts bytes from in to out using the given key and counters. -// In and out may be the same slice but otherwise should not overlap. Counter -// contains the raw salsa20 counter bytes (both nonce and block counter). -func XORKeyStream(out, in []byte, counter *[16]byte, key *[32]byte) { - if len(in) == 0 { - return - } - salsa2020XORKeyStream(&out[0], &in[0], uint64(len(in)), &counter[0], &key[0]) -} diff --git a/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_ref.go b/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_ref.go deleted file mode 100644 index 95f8ca5bb..000000000 --- a/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_ref.go +++ /dev/null @@ -1,234 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !amd64 appengine gccgo - -package salsa - -const rounds = 20 - -// core applies the Salsa20 core function to 16-byte input in, 32-byte key k, -// and 16-byte constant c, and puts the result into 64-byte array out. -func core(out *[64]byte, in *[16]byte, k *[32]byte, c *[16]byte) { - j0 := uint32(c[0]) | uint32(c[1])<<8 | uint32(c[2])<<16 | uint32(c[3])<<24 - j1 := uint32(k[0]) | uint32(k[1])<<8 | uint32(k[2])<<16 | uint32(k[3])<<24 - j2 := uint32(k[4]) | uint32(k[5])<<8 | uint32(k[6])<<16 | uint32(k[7])<<24 - j3 := uint32(k[8]) | uint32(k[9])<<8 | uint32(k[10])<<16 | uint32(k[11])<<24 - j4 := uint32(k[12]) | uint32(k[13])<<8 | uint32(k[14])<<16 | uint32(k[15])<<24 - j5 := uint32(c[4]) | uint32(c[5])<<8 | uint32(c[6])<<16 | uint32(c[7])<<24 - j6 := uint32(in[0]) | uint32(in[1])<<8 | uint32(in[2])<<16 | uint32(in[3])<<24 - j7 := uint32(in[4]) | uint32(in[5])<<8 | uint32(in[6])<<16 | uint32(in[7])<<24 - j8 := uint32(in[8]) | uint32(in[9])<<8 | uint32(in[10])<<16 | uint32(in[11])<<24 - j9 := uint32(in[12]) | uint32(in[13])<<8 | uint32(in[14])<<16 | uint32(in[15])<<24 - j10 := uint32(c[8]) | uint32(c[9])<<8 | uint32(c[10])<<16 | uint32(c[11])<<24 - j11 := uint32(k[16]) | uint32(k[17])<<8 | uint32(k[18])<<16 | uint32(k[19])<<24 - j12 := uint32(k[20]) | uint32(k[21])<<8 | uint32(k[22])<<16 | uint32(k[23])<<24 - j13 := uint32(k[24]) | uint32(k[25])<<8 | uint32(k[26])<<16 | uint32(k[27])<<24 - j14 := uint32(k[28]) | uint32(k[29])<<8 | uint32(k[30])<<16 | uint32(k[31])<<24 - j15 := uint32(c[12]) | uint32(c[13])<<8 | uint32(c[14])<<16 | uint32(c[15])<<24 - - x0, x1, x2, x3, x4, x5, x6, x7, x8 := j0, j1, j2, j3, j4, j5, j6, j7, j8 - x9, x10, x11, x12, x13, x14, x15 := j9, j10, j11, j12, j13, j14, j15 - - for i := 0; i < rounds; i += 2 { - u := x0 + x12 - x4 ^= u<<7 | u>>(32-7) - u = x4 + x0 - x8 ^= u<<9 | u>>(32-9) - u = x8 + x4 - x12 ^= u<<13 | u>>(32-13) - u = x12 + x8 - x0 ^= u<<18 | u>>(32-18) - - u = x5 + x1 - x9 ^= u<<7 | u>>(32-7) - u = x9 + x5 - x13 ^= u<<9 | u>>(32-9) - u = x13 + x9 - x1 ^= u<<13 | u>>(32-13) - u = x1 + x13 - x5 ^= u<<18 | u>>(32-18) - - u = x10 + x6 - x14 ^= u<<7 | u>>(32-7) - u = x14 + x10 - x2 ^= u<<9 | u>>(32-9) - u = x2 + x14 - x6 ^= u<<13 | u>>(32-13) - u = x6 + x2 - x10 ^= u<<18 | u>>(32-18) - - u = x15 + x11 - x3 ^= u<<7 | u>>(32-7) - u = x3 + x15 - x7 ^= u<<9 | u>>(32-9) - u = x7 + x3 - x11 ^= u<<13 | u>>(32-13) - u = x11 + x7 - x15 ^= u<<18 | u>>(32-18) - - u = x0 + x3 - x1 ^= u<<7 | u>>(32-7) - u = x1 + x0 - x2 ^= u<<9 | u>>(32-9) - u = x2 + x1 - x3 ^= u<<13 | u>>(32-13) - u = x3 + x2 - x0 ^= u<<18 | u>>(32-18) - - u = x5 + x4 - x6 ^= u<<7 | u>>(32-7) - u = x6 + x5 - x7 ^= u<<9 | u>>(32-9) - u = x7 + x6 - x4 ^= u<<13 | u>>(32-13) - u = x4 + x7 - x5 ^= u<<18 | u>>(32-18) - - u = x10 + x9 - x11 ^= u<<7 | u>>(32-7) - u = x11 + x10 - x8 ^= u<<9 | u>>(32-9) - u = x8 + x11 - x9 ^= u<<13 | u>>(32-13) - u = x9 + x8 - x10 ^= u<<18 | u>>(32-18) - - u = x15 + x14 - x12 ^= u<<7 | u>>(32-7) - u = x12 + x15 - x13 ^= u<<9 | u>>(32-9) - u = x13 + x12 - x14 ^= u<<13 | u>>(32-13) - u = x14 + x13 - x15 ^= u<<18 | u>>(32-18) - } - x0 += j0 - x1 += j1 - x2 += j2 - x3 += j3 - x4 += j4 - x5 += j5 - x6 += j6 - x7 += j7 - x8 += j8 - x9 += j9 - x10 += j10 - x11 += j11 - x12 += j12 - x13 += j13 - x14 += j14 - x15 += j15 - - out[0] = byte(x0) - out[1] = byte(x0 >> 8) - out[2] = byte(x0 >> 16) - out[3] = byte(x0 >> 24) - - out[4] = byte(x1) - out[5] = byte(x1 >> 8) - out[6] = byte(x1 >> 16) - out[7] = byte(x1 >> 24) - - out[8] = byte(x2) - out[9] = byte(x2 >> 8) - out[10] = byte(x2 >> 16) - out[11] = byte(x2 >> 24) - - out[12] = byte(x3) - out[13] = byte(x3 >> 8) - out[14] = byte(x3 >> 16) - out[15] = byte(x3 >> 24) - - out[16] = byte(x4) - out[17] = byte(x4 >> 8) - out[18] = byte(x4 >> 16) - out[19] = byte(x4 >> 24) - - out[20] = byte(x5) - out[21] = byte(x5 >> 8) - out[22] = byte(x5 >> 16) - out[23] = byte(x5 >> 24) - - out[24] = byte(x6) - out[25] = byte(x6 >> 8) - out[26] = byte(x6 >> 16) - out[27] = byte(x6 >> 24) - - out[28] = byte(x7) - out[29] = byte(x7 >> 8) - out[30] = byte(x7 >> 16) - out[31] = byte(x7 >> 24) - - out[32] = byte(x8) - out[33] = byte(x8 >> 8) - out[34] = byte(x8 >> 16) - out[35] = byte(x8 >> 24) - - out[36] = byte(x9) - out[37] = byte(x9 >> 8) - out[38] = byte(x9 >> 16) - out[39] = byte(x9 >> 24) - - out[40] = byte(x10) - out[41] = byte(x10 >> 8) - out[42] = byte(x10 >> 16) - out[43] = byte(x10 >> 24) - - out[44] = byte(x11) - out[45] = byte(x11 >> 8) - out[46] = byte(x11 >> 16) - out[47] = byte(x11 >> 24) - - out[48] = byte(x12) - out[49] = byte(x12 >> 8) - out[50] = byte(x12 >> 16) - out[51] = byte(x12 >> 24) - - out[52] = byte(x13) - out[53] = byte(x13 >> 8) - out[54] = byte(x13 >> 16) - out[55] = byte(x13 >> 24) - - out[56] = byte(x14) - out[57] = byte(x14 >> 8) - out[58] = byte(x14 >> 16) - out[59] = byte(x14 >> 24) - - out[60] = byte(x15) - out[61] = byte(x15 >> 8) - out[62] = byte(x15 >> 16) - out[63] = byte(x15 >> 24) -} - -// XORKeyStream crypts bytes from in to out using the given key and counters. -// In and out may be the same slice but otherwise should not overlap. Counter -// contains the raw salsa20 counter bytes (both nonce and block counter). -func XORKeyStream(out, in []byte, counter *[16]byte, key *[32]byte) { - var block [64]byte - var counterCopy [16]byte - copy(counterCopy[:], counter[:]) - - for len(in) >= 64 { - core(&block, &counterCopy, key, &Sigma) - for i, x := range block { - out[i] = in[i] ^ x - } - u := uint32(1) - for i := 8; i < 16; i++ { - u += uint32(counterCopy[i]) - counterCopy[i] = byte(u) - u >>= 8 - } - in = in[64:] - out = out[64:] - } - - if len(in) > 0 { - core(&block, &counterCopy, key, &Sigma) - for i, v := range in { - out[i] = v ^ block[i] - } - } -} diff --git a/vendor/golang.org/x/crypto/salsa20/salsa/salsa_test.go b/vendor/golang.org/x/crypto/salsa20/salsa/salsa_test.go deleted file mode 100644 index f8cecd9e6..000000000 --- a/vendor/golang.org/x/crypto/salsa20/salsa/salsa_test.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package salsa - -import "testing" - -func TestCore208(t *testing.T) { - in := [64]byte{ - 0x7e, 0x87, 0x9a, 0x21, 0x4f, 0x3e, 0xc9, 0x86, - 0x7c, 0xa9, 0x40, 0xe6, 0x41, 0x71, 0x8f, 0x26, - 0xba, 0xee, 0x55, 0x5b, 0x8c, 0x61, 0xc1, 0xb5, - 0x0d, 0xf8, 0x46, 0x11, 0x6d, 0xcd, 0x3b, 0x1d, - 0xee, 0x24, 0xf3, 0x19, 0xdf, 0x9b, 0x3d, 0x85, - 0x14, 0x12, 0x1e, 0x4b, 0x5a, 0xc5, 0xaa, 0x32, - 0x76, 0x02, 0x1d, 0x29, 0x09, 0xc7, 0x48, 0x29, - 0xed, 0xeb, 0xc6, 0x8d, 0xb8, 0xb8, 0xc2, 0x5e} - - out := [64]byte{ - 0xa4, 0x1f, 0x85, 0x9c, 0x66, 0x08, 0xcc, 0x99, - 0x3b, 0x81, 0xca, 0xcb, 0x02, 0x0c, 0xef, 0x05, - 0x04, 0x4b, 0x21, 0x81, 0xa2, 0xfd, 0x33, 0x7d, - 0xfd, 0x7b, 0x1c, 0x63, 0x96, 0x68, 0x2f, 0x29, - 0xb4, 0x39, 0x31, 0x68, 0xe3, 0xc9, 0xe6, 0xbc, - 0xfe, 0x6b, 0xc5, 0xb7, 0xa0, 0x6d, 0x96, 0xba, - 0xe4, 0x24, 0xcc, 0x10, 0x2c, 0x91, 0x74, 0x5c, - 0x24, 0xad, 0x67, 0x3d, 0xc7, 0x61, 0x8f, 0x81, - } - - Core208(&in, &in) - if in != out { - t.Errorf("expected %x, got %x", out, in) - } -} diff --git a/vendor/golang.org/x/crypto/salsa20/salsa20.go b/vendor/golang.org/x/crypto/salsa20/salsa20.go deleted file mode 100644 index fde9846b6..000000000 --- a/vendor/golang.org/x/crypto/salsa20/salsa20.go +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -/* -Package salsa20 implements the Salsa20 stream cipher as specified in http://cr.yp.to/snuffle/spec.pdf. - -Salsa20 differs from many other stream ciphers in that it is message orientated -rather than byte orientated. Keystream blocks are not preserved between calls, -therefore each side must encrypt/decrypt data with the same segmentation. - -Another aspect of this difference is that part of the counter is exposed as -an nonce in each call. Encrypting two different messages with the same (key, -nonce) pair leads to trivial plaintext recovery. This is analogous to -encrypting two different messages with the same key with a traditional stream -cipher. - -This package also implements XSalsa20: a version of Salsa20 with a 24-byte -nonce as specified in http://cr.yp.to/snuffle/xsalsa-20081128.pdf. Simply -passing a 24-byte slice as the nonce triggers XSalsa20. -*/ -package salsa20 // import "golang.org/x/crypto/salsa20" - -// TODO(agl): implement XORKeyStream12 and XORKeyStream8 - the reduced round variants of Salsa20. - -import ( - "golang.org/x/crypto/salsa20/salsa" -) - -// XORKeyStream crypts bytes from in to out using the given key and nonce. In -// and out may be the same slice but otherwise should not overlap. Nonce must -// be either 8 or 24 bytes long. -func XORKeyStream(out, in []byte, nonce []byte, key *[32]byte) { - if len(out) < len(in) { - in = in[:len(out)] - } - - var subNonce [16]byte - - if len(nonce) == 24 { - var subKey [32]byte - var hNonce [16]byte - copy(hNonce[:], nonce[:16]) - salsa.HSalsa20(&subKey, &hNonce, key, &salsa.Sigma) - copy(subNonce[:], nonce[16:]) - key = &subKey - } else if len(nonce) == 8 { - copy(subNonce[:], nonce[:]) - } else { - panic("salsa20: nonce must be 8 or 24 bytes") - } - - salsa.XORKeyStream(out, in, &subNonce, key) -} diff --git a/vendor/golang.org/x/crypto/salsa20/salsa20_test.go b/vendor/golang.org/x/crypto/salsa20/salsa20_test.go deleted file mode 100644 index 0ef3328eb..000000000 --- a/vendor/golang.org/x/crypto/salsa20/salsa20_test.go +++ /dev/null @@ -1,139 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package salsa20 - -import ( - "bytes" - "encoding/hex" - "testing" -) - -func fromHex(s string) []byte { - ret, err := hex.DecodeString(s) - if err != nil { - panic(err) - } - return ret -} - -// testVectors was taken from set 6 of the ECRYPT test vectors: -// http://www.ecrypt.eu.org/stream/svn/viewcvs.cgi/ecrypt/trunk/submissions/salsa20/full/verified.test-vectors?logsort=rev&rev=210&view=markup -var testVectors = []struct { - key []byte - iv []byte - numBytes int - xor []byte -}{ - { - fromHex("0053A6F94C9FF24598EB3E91E4378ADD3083D6297CCF2275C81B6EC11467BA0D"), - fromHex("0D74DB42A91077DE"), - 131072, - fromHex("C349B6A51A3EC9B712EAED3F90D8BCEE69B7628645F251A996F55260C62EF31FD6C6B0AEA94E136C9D984AD2DF3578F78E457527B03A0450580DD874F63B1AB9"), - }, - { - fromHex("0558ABFE51A4F74A9DF04396E93C8FE23588DB2E81D4277ACD2073C6196CBF12"), - fromHex("167DE44BB21980E7"), - 131072, - fromHex("C3EAAF32836BACE32D04E1124231EF47E101367D6305413A0EEB07C60698A2876E4D031870A739D6FFDDD208597AFF0A47AC17EDB0167DD67EBA84F1883D4DFD"), - }, - { - fromHex("0A5DB00356A9FC4FA2F5489BEE4194E73A8DE03386D92C7FD22578CB1E71C417"), - fromHex("1F86ED54BB2289F0"), - 131072, - fromHex("3CD23C3DC90201ACC0CF49B440B6C417F0DC8D8410A716D5314C059E14B1A8D9A9FB8EA3D9C8DAE12B21402F674AA95C67B1FC514E994C9D3F3A6E41DFF5BBA6"), - }, - { - fromHex("0F62B5085BAE0154A7FA4DA0F34699EC3F92E5388BDE3184D72A7DD02376C91C"), - fromHex("288FF65DC42B92F9"), - 131072, - fromHex("E00EBCCD70D69152725F9987982178A2E2E139C7BCBE04CA8A0E99E318D9AB76F988C8549F75ADD790BA4F81C176DA653C1A043F11A958E169B6D2319F4EEC1A"), - }, -} - -func TestSalsa20(t *testing.T) { - var inBuf, outBuf []byte - var key [32]byte - - for i, test := range testVectors { - if test.numBytes%64 != 0 { - t.Errorf("#%d: numBytes is not a multiple of 64", i) - continue - } - - if test.numBytes > len(inBuf) { - inBuf = make([]byte, test.numBytes) - outBuf = make([]byte, test.numBytes) - } - in := inBuf[:test.numBytes] - out := outBuf[:test.numBytes] - copy(key[:], test.key) - XORKeyStream(out, in, test.iv, &key) - - var xor [64]byte - for len(out) > 0 { - for i := 0; i < 64; i++ { - xor[i] ^= out[i] - } - out = out[64:] - } - - if !bytes.Equal(xor[:], test.xor) { - t.Errorf("#%d: bad result", i) - } - } -} - -var xSalsa20TestData = []struct { - in, nonce, key, out []byte -}{ - { - []byte("Hello world!"), - []byte("24-byte nonce for xsalsa"), - []byte("this is 32-byte key for xsalsa20"), - []byte{0x00, 0x2d, 0x45, 0x13, 0x84, 0x3f, 0xc2, 0x40, 0xc4, 0x01, 0xe5, 0x41}, - }, - { - make([]byte, 64), - []byte("24-byte nonce for xsalsa"), - []byte("this is 32-byte key for xsalsa20"), - []byte{0x48, 0x48, 0x29, 0x7f, 0xeb, 0x1f, 0xb5, 0x2f, 0xb6, - 0x6d, 0x81, 0x60, 0x9b, 0xd5, 0x47, 0xfa, 0xbc, 0xbe, 0x70, - 0x26, 0xed, 0xc8, 0xb5, 0xe5, 0xe4, 0x49, 0xd0, 0x88, 0xbf, - 0xa6, 0x9c, 0x08, 0x8f, 0x5d, 0x8d, 0xa1, 0xd7, 0x91, 0x26, - 0x7c, 0x2c, 0x19, 0x5a, 0x7f, 0x8c, 0xae, 0x9c, 0x4b, 0x40, - 0x50, 0xd0, 0x8c, 0xe6, 0xd3, 0xa1, 0x51, 0xec, 0x26, 0x5f, - 0x3a, 0x58, 0xe4, 0x76, 0x48}, - }, -} - -func TestXSalsa20(t *testing.T) { - var key [32]byte - - for i, test := range xSalsa20TestData { - out := make([]byte, len(test.in)) - copy(key[:], test.key) - XORKeyStream(out, test.in, test.nonce, &key) - if !bytes.Equal(out, test.out) { - t.Errorf("%d: expected %x, got %x", i, test.out, out) - } - } -} - -var ( - keyArray [32]byte - key = &keyArray - nonce [8]byte - msg = make([]byte, 1<<10) -) - -func BenchmarkXOR1K(b *testing.B) { - b.StopTimer() - out := make([]byte, 1024) - b.StartTimer() - for i := 0; i < b.N; i++ { - XORKeyStream(out, msg[:1024], nonce[:], key) - } - b.SetBytes(1024) -} diff --git a/vendor/golang.org/x/crypto/scrypt/scrypt.go b/vendor/golang.org/x/crypto/scrypt/scrypt.go deleted file mode 100644 index 7455395cf..000000000 --- a/vendor/golang.org/x/crypto/scrypt/scrypt.go +++ /dev/null @@ -1,243 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package scrypt implements the scrypt key derivation function as defined in -// Colin Percival's paper "Stronger Key Derivation via Sequential Memory-Hard -// Functions" (http://www.tarsnap.com/scrypt/scrypt.pdf). -package scrypt // import "golang.org/x/crypto/scrypt" - -import ( - "crypto/sha256" - "errors" - - "golang.org/x/crypto/pbkdf2" -) - -const maxInt = int(^uint(0) >> 1) - -// blockCopy copies n numbers from src into dst. -func blockCopy(dst, src []uint32, n int) { - copy(dst, src[:n]) -} - -// blockXOR XORs numbers from dst with n numbers from src. -func blockXOR(dst, src []uint32, n int) { - for i, v := range src[:n] { - dst[i] ^= v - } -} - -// salsaXOR applies Salsa20/8 to the XOR of 16 numbers from tmp and in, -// and puts the result into both both tmp and out. -func salsaXOR(tmp *[16]uint32, in, out []uint32) { - w0 := tmp[0] ^ in[0] - w1 := tmp[1] ^ in[1] - w2 := tmp[2] ^ in[2] - w3 := tmp[3] ^ in[3] - w4 := tmp[4] ^ in[4] - w5 := tmp[5] ^ in[5] - w6 := tmp[6] ^ in[6] - w7 := tmp[7] ^ in[7] - w8 := tmp[8] ^ in[8] - w9 := tmp[9] ^ in[9] - w10 := tmp[10] ^ in[10] - w11 := tmp[11] ^ in[11] - w12 := tmp[12] ^ in[12] - w13 := tmp[13] ^ in[13] - w14 := tmp[14] ^ in[14] - w15 := tmp[15] ^ in[15] - - x0, x1, x2, x3, x4, x5, x6, x7, x8 := w0, w1, w2, w3, w4, w5, w6, w7, w8 - x9, x10, x11, x12, x13, x14, x15 := w9, w10, w11, w12, w13, w14, w15 - - for i := 0; i < 8; i += 2 { - u := x0 + x12 - x4 ^= u<<7 | u>>(32-7) - u = x4 + x0 - x8 ^= u<<9 | u>>(32-9) - u = x8 + x4 - x12 ^= u<<13 | u>>(32-13) - u = x12 + x8 - x0 ^= u<<18 | u>>(32-18) - - u = x5 + x1 - x9 ^= u<<7 | u>>(32-7) - u = x9 + x5 - x13 ^= u<<9 | u>>(32-9) - u = x13 + x9 - x1 ^= u<<13 | u>>(32-13) - u = x1 + x13 - x5 ^= u<<18 | u>>(32-18) - - u = x10 + x6 - x14 ^= u<<7 | u>>(32-7) - u = x14 + x10 - x2 ^= u<<9 | u>>(32-9) - u = x2 + x14 - x6 ^= u<<13 | u>>(32-13) - u = x6 + x2 - x10 ^= u<<18 | u>>(32-18) - - u = x15 + x11 - x3 ^= u<<7 | u>>(32-7) - u = x3 + x15 - x7 ^= u<<9 | u>>(32-9) - u = x7 + x3 - x11 ^= u<<13 | u>>(32-13) - u = x11 + x7 - x15 ^= u<<18 | u>>(32-18) - - u = x0 + x3 - x1 ^= u<<7 | u>>(32-7) - u = x1 + x0 - x2 ^= u<<9 | u>>(32-9) - u = x2 + x1 - x3 ^= u<<13 | u>>(32-13) - u = x3 + x2 - x0 ^= u<<18 | u>>(32-18) - - u = x5 + x4 - x6 ^= u<<7 | u>>(32-7) - u = x6 + x5 - x7 ^= u<<9 | u>>(32-9) - u = x7 + x6 - x4 ^= u<<13 | u>>(32-13) - u = x4 + x7 - x5 ^= u<<18 | u>>(32-18) - - u = x10 + x9 - x11 ^= u<<7 | u>>(32-7) - u = x11 + x10 - x8 ^= u<<9 | u>>(32-9) - u = x8 + x11 - x9 ^= u<<13 | u>>(32-13) - u = x9 + x8 - x10 ^= u<<18 | u>>(32-18) - - u = x15 + x14 - x12 ^= u<<7 | u>>(32-7) - u = x12 + x15 - x13 ^= u<<9 | u>>(32-9) - u = x13 + x12 - x14 ^= u<<13 | u>>(32-13) - u = x14 + x13 - x15 ^= u<<18 | u>>(32-18) - } - x0 += w0 - x1 += w1 - x2 += w2 - x3 += w3 - x4 += w4 - x5 += w5 - x6 += w6 - x7 += w7 - x8 += w8 - x9 += w9 - x10 += w10 - x11 += w11 - x12 += w12 - x13 += w13 - x14 += w14 - x15 += w15 - - out[0], tmp[0] = x0, x0 - out[1], tmp[1] = x1, x1 - out[2], tmp[2] = x2, x2 - out[3], tmp[3] = x3, x3 - out[4], tmp[4] = x4, x4 - out[5], tmp[5] = x5, x5 - out[6], tmp[6] = x6, x6 - out[7], tmp[7] = x7, x7 - out[8], tmp[8] = x8, x8 - out[9], tmp[9] = x9, x9 - out[10], tmp[10] = x10, x10 - out[11], tmp[11] = x11, x11 - out[12], tmp[12] = x12, x12 - out[13], tmp[13] = x13, x13 - out[14], tmp[14] = x14, x14 - out[15], tmp[15] = x15, x15 -} - -func blockMix(tmp *[16]uint32, in, out []uint32, r int) { - blockCopy(tmp[:], in[(2*r-1)*16:], 16) - for i := 0; i < 2*r; i += 2 { - salsaXOR(tmp, in[i*16:], out[i*8:]) - salsaXOR(tmp, in[i*16+16:], out[i*8+r*16:]) - } -} - -func integer(b []uint32, r int) uint64 { - j := (2*r - 1) * 16 - return uint64(b[j]) | uint64(b[j+1])<<32 -} - -func smix(b []byte, r, N int, v, xy []uint32) { - var tmp [16]uint32 - x := xy - y := xy[32*r:] - - j := 0 - for i := 0; i < 32*r; i++ { - x[i] = uint32(b[j]) | uint32(b[j+1])<<8 | uint32(b[j+2])<<16 | uint32(b[j+3])<<24 - j += 4 - } - for i := 0; i < N; i += 2 { - blockCopy(v[i*(32*r):], x, 32*r) - blockMix(&tmp, x, y, r) - - blockCopy(v[(i+1)*(32*r):], y, 32*r) - blockMix(&tmp, y, x, r) - } - for i := 0; i < N; i += 2 { - j := int(integer(x, r) & uint64(N-1)) - blockXOR(x, v[j*(32*r):], 32*r) - blockMix(&tmp, x, y, r) - - j = int(integer(y, r) & uint64(N-1)) - blockXOR(y, v[j*(32*r):], 32*r) - blockMix(&tmp, y, x, r) - } - j = 0 - for _, v := range x[:32*r] { - b[j+0] = byte(v >> 0) - b[j+1] = byte(v >> 8) - b[j+2] = byte(v >> 16) - b[j+3] = byte(v >> 24) - j += 4 - } -} - -// Key derives a key from the password, salt, and cost parameters, returning -// a byte slice of length keyLen that can be used as cryptographic key. -// -// N is a CPU/memory cost parameter, which must be a power of two greater than 1. -// r and p must satisfy r * p < 2³⁰. If the parameters do not satisfy the -// limits, the function returns a nil byte slice and an error. -// -// For example, you can get a derived key for e.g. AES-256 (which needs a -// 32-byte key) by doing: -// -// dk, err := scrypt.Key([]byte("some password"), salt, 16384, 8, 1, 32) -// -// The recommended parameters for interactive logins as of 2009 are N=16384, -// r=8, p=1. They should be increased as memory latency and CPU parallelism -// increases. Remember to get a good random salt. -func Key(password, salt []byte, N, r, p, keyLen int) ([]byte, error) { - if N <= 1 || N&(N-1) != 0 { - return nil, errors.New("scrypt: N must be > 1 and a power of 2") - } - if uint64(r)*uint64(p) >= 1<<30 || r > maxInt/128/p || r > maxInt/256 || N > maxInt/128/r { - return nil, errors.New("scrypt: parameters are too large") - } - - xy := make([]uint32, 64*r) - v := make([]uint32, 32*N*r) - b := pbkdf2.Key(password, salt, 1, p*128*r, sha256.New) - - for i := 0; i < p; i++ { - smix(b[i*128*r:], r, N, v, xy) - } - - return pbkdf2.Key(password, b, 1, keyLen, sha256.New), nil -} diff --git a/vendor/golang.org/x/crypto/scrypt/scrypt_test.go b/vendor/golang.org/x/crypto/scrypt/scrypt_test.go deleted file mode 100644 index e096c3a31..000000000 --- a/vendor/golang.org/x/crypto/scrypt/scrypt_test.go +++ /dev/null @@ -1,160 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package scrypt - -import ( - "bytes" - "testing" -) - -type testVector struct { - password string - salt string - N, r, p int - output []byte -} - -var good = []testVector{ - { - "password", - "salt", - 2, 10, 10, - []byte{ - 0x48, 0x2c, 0x85, 0x8e, 0x22, 0x90, 0x55, 0xe6, 0x2f, - 0x41, 0xe0, 0xec, 0x81, 0x9a, 0x5e, 0xe1, 0x8b, 0xdb, - 0x87, 0x25, 0x1a, 0x53, 0x4f, 0x75, 0xac, 0xd9, 0x5a, - 0xc5, 0xe5, 0xa, 0xa1, 0x5f, - }, - }, - { - "password", - "salt", - 16, 100, 100, - []byte{ - 0x88, 0xbd, 0x5e, 0xdb, 0x52, 0xd1, 0xdd, 0x0, 0x18, - 0x87, 0x72, 0xad, 0x36, 0x17, 0x12, 0x90, 0x22, 0x4e, - 0x74, 0x82, 0x95, 0x25, 0xb1, 0x8d, 0x73, 0x23, 0xa5, - 0x7f, 0x91, 0x96, 0x3c, 0x37, - }, - }, - { - "this is a long \000 password", - "and this is a long \000 salt", - 16384, 8, 1, - []byte{ - 0xc3, 0xf1, 0x82, 0xee, 0x2d, 0xec, 0x84, 0x6e, 0x70, - 0xa6, 0x94, 0x2f, 0xb5, 0x29, 0x98, 0x5a, 0x3a, 0x09, - 0x76, 0x5e, 0xf0, 0x4c, 0x61, 0x29, 0x23, 0xb1, 0x7f, - 0x18, 0x55, 0x5a, 0x37, 0x07, 0x6d, 0xeb, 0x2b, 0x98, - 0x30, 0xd6, 0x9d, 0xe5, 0x49, 0x26, 0x51, 0xe4, 0x50, - 0x6a, 0xe5, 0x77, 0x6d, 0x96, 0xd4, 0x0f, 0x67, 0xaa, - 0xee, 0x37, 0xe1, 0x77, 0x7b, 0x8a, 0xd5, 0xc3, 0x11, - 0x14, 0x32, 0xbb, 0x3b, 0x6f, 0x7e, 0x12, 0x64, 0x40, - 0x18, 0x79, 0xe6, 0x41, 0xae, - }, - }, - { - "p", - "s", - 2, 1, 1, - []byte{ - 0x48, 0xb0, 0xd2, 0xa8, 0xa3, 0x27, 0x26, 0x11, 0x98, - 0x4c, 0x50, 0xeb, 0xd6, 0x30, 0xaf, 0x52, - }, - }, - - { - "", - "", - 16, 1, 1, - []byte{ - 0x77, 0xd6, 0x57, 0x62, 0x38, 0x65, 0x7b, 0x20, 0x3b, - 0x19, 0xca, 0x42, 0xc1, 0x8a, 0x04, 0x97, 0xf1, 0x6b, - 0x48, 0x44, 0xe3, 0x07, 0x4a, 0xe8, 0xdf, 0xdf, 0xfa, - 0x3f, 0xed, 0xe2, 0x14, 0x42, 0xfc, 0xd0, 0x06, 0x9d, - 0xed, 0x09, 0x48, 0xf8, 0x32, 0x6a, 0x75, 0x3a, 0x0f, - 0xc8, 0x1f, 0x17, 0xe8, 0xd3, 0xe0, 0xfb, 0x2e, 0x0d, - 0x36, 0x28, 0xcf, 0x35, 0xe2, 0x0c, 0x38, 0xd1, 0x89, - 0x06, - }, - }, - { - "password", - "NaCl", - 1024, 8, 16, - []byte{ - 0xfd, 0xba, 0xbe, 0x1c, 0x9d, 0x34, 0x72, 0x00, 0x78, - 0x56, 0xe7, 0x19, 0x0d, 0x01, 0xe9, 0xfe, 0x7c, 0x6a, - 0xd7, 0xcb, 0xc8, 0x23, 0x78, 0x30, 0xe7, 0x73, 0x76, - 0x63, 0x4b, 0x37, 0x31, 0x62, 0x2e, 0xaf, 0x30, 0xd9, - 0x2e, 0x22, 0xa3, 0x88, 0x6f, 0xf1, 0x09, 0x27, 0x9d, - 0x98, 0x30, 0xda, 0xc7, 0x27, 0xaf, 0xb9, 0x4a, 0x83, - 0xee, 0x6d, 0x83, 0x60, 0xcb, 0xdf, 0xa2, 0xcc, 0x06, - 0x40, - }, - }, - { - "pleaseletmein", "SodiumChloride", - 16384, 8, 1, - []byte{ - 0x70, 0x23, 0xbd, 0xcb, 0x3a, 0xfd, 0x73, 0x48, 0x46, - 0x1c, 0x06, 0xcd, 0x81, 0xfd, 0x38, 0xeb, 0xfd, 0xa8, - 0xfb, 0xba, 0x90, 0x4f, 0x8e, 0x3e, 0xa9, 0xb5, 0x43, - 0xf6, 0x54, 0x5d, 0xa1, 0xf2, 0xd5, 0x43, 0x29, 0x55, - 0x61, 0x3f, 0x0f, 0xcf, 0x62, 0xd4, 0x97, 0x05, 0x24, - 0x2a, 0x9a, 0xf9, 0xe6, 0x1e, 0x85, 0xdc, 0x0d, 0x65, - 0x1e, 0x40, 0xdf, 0xcf, 0x01, 0x7b, 0x45, 0x57, 0x58, - 0x87, - }, - }, - /* - // Disabled: needs 1 GiB RAM and takes too long for a simple test. - { - "pleaseletmein", "SodiumChloride", - 1048576, 8, 1, - []byte{ - 0x21, 0x01, 0xcb, 0x9b, 0x6a, 0x51, 0x1a, 0xae, 0xad, - 0xdb, 0xbe, 0x09, 0xcf, 0x70, 0xf8, 0x81, 0xec, 0x56, - 0x8d, 0x57, 0x4a, 0x2f, 0xfd, 0x4d, 0xab, 0xe5, 0xee, - 0x98, 0x20, 0xad, 0xaa, 0x47, 0x8e, 0x56, 0xfd, 0x8f, - 0x4b, 0xa5, 0xd0, 0x9f, 0xfa, 0x1c, 0x6d, 0x92, 0x7c, - 0x40, 0xf4, 0xc3, 0x37, 0x30, 0x40, 0x49, 0xe8, 0xa9, - 0x52, 0xfb, 0xcb, 0xf4, 0x5c, 0x6f, 0xa7, 0x7a, 0x41, - 0xa4, - }, - }, - */ -} - -var bad = []testVector{ - {"p", "s", 0, 1, 1, nil}, // N == 0 - {"p", "s", 1, 1, 1, nil}, // N == 1 - {"p", "s", 7, 8, 1, nil}, // N is not power of 2 - {"p", "s", 16, maxInt / 2, maxInt / 2, nil}, // p * r too large -} - -func TestKey(t *testing.T) { - for i, v := range good { - k, err := Key([]byte(v.password), []byte(v.salt), v.N, v.r, v.p, len(v.output)) - if err != nil { - t.Errorf("%d: got unexpected error: %s", i, err) - } - if !bytes.Equal(k, v.output) { - t.Errorf("%d: expected %x, got %x", i, v.output, k) - } - } - for i, v := range bad { - _, err := Key([]byte(v.password), []byte(v.salt), v.N, v.r, v.p, 32) - if err == nil { - t.Errorf("%d: expected error, got nil", i) - } - } -} - -func BenchmarkKey(b *testing.B) { - for i := 0; i < b.N; i++ { - Key([]byte("password"), []byte("salt"), 16384, 8, 1, 64) - } -} diff --git a/vendor/golang.org/x/crypto/sha3/doc.go b/vendor/golang.org/x/crypto/sha3/doc.go deleted file mode 100644 index a0ee3ae72..000000000 --- a/vendor/golang.org/x/crypto/sha3/doc.go +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package sha3 implements the SHA-3 fixed-output-length hash functions and -// the SHAKE variable-output-length hash functions defined by FIPS-202. -// -// Both types of hash function use the "sponge" construction and the Keccak -// permutation. For a detailed specification see http://keccak.noekeon.org/ -// -// -// Guidance -// -// If you aren't sure what function you need, use SHAKE256 with at least 64 -// bytes of output. The SHAKE instances are faster than the SHA3 instances; -// the latter have to allocate memory to conform to the hash.Hash interface. -// -// If you need a secret-key MAC (message authentication code), prepend the -// secret key to the input, hash with SHAKE256 and read at least 32 bytes of -// output. -// -// -// Security strengths -// -// The SHA3-x (x equals 224, 256, 384, or 512) functions have a security -// strength against preimage attacks of x bits. Since they only produce "x" -// bits of output, their collision-resistance is only "x/2" bits. -// -// The SHAKE-256 and -128 functions have a generic security strength of 256 and -// 128 bits against all attacks, provided that at least 2x bits of their output -// is used. Requesting more than 64 or 32 bytes of output, respectively, does -// not increase the collision-resistance of the SHAKE functions. -// -// -// The sponge construction -// -// A sponge builds a pseudo-random function from a public pseudo-random -// permutation, by applying the permutation to a state of "rate + capacity" -// bytes, but hiding "capacity" of the bytes. -// -// A sponge starts out with a zero state. To hash an input using a sponge, up -// to "rate" bytes of the input are XORed into the sponge's state. The sponge -// is then "full" and the permutation is applied to "empty" it. This process is -// repeated until all the input has been "absorbed". The input is then padded. -// The digest is "squeezed" from the sponge in the same way, except that output -// output is copied out instead of input being XORed in. -// -// A sponge is parameterized by its generic security strength, which is equal -// to half its capacity; capacity + rate is equal to the permutation's width. -// Since the KeccakF-1600 permutation is 1600 bits (200 bytes) wide, this means -// that the security strength of a sponge instance is equal to (1600 - bitrate) / 2. -// -// -// Recommendations -// -// The SHAKE functions are recommended for most new uses. They can produce -// output of arbitrary length. SHAKE256, with an output length of at least -// 64 bytes, provides 256-bit security against all attacks. The Keccak team -// recommends it for most applications upgrading from SHA2-512. (NIST chose a -// much stronger, but much slower, sponge instance for SHA3-512.) -// -// The SHA-3 functions are "drop-in" replacements for the SHA-2 functions. -// They produce output of the same length, with the same security strengths -// against all attacks. This means, in particular, that SHA3-256 only has -// 128-bit collision resistance, because its output length is 32 bytes. -package sha3 // import "golang.org/x/crypto/sha3" diff --git a/vendor/golang.org/x/crypto/sha3/hashes.go b/vendor/golang.org/x/crypto/sha3/hashes.go deleted file mode 100644 index 2b51cf4e9..000000000 --- a/vendor/golang.org/x/crypto/sha3/hashes.go +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package sha3 - -// This file provides functions for creating instances of the SHA-3 -// and SHAKE hash functions, as well as utility functions for hashing -// bytes. - -import ( - "hash" -) - -// New224 creates a new SHA3-224 hash. -// Its generic security strength is 224 bits against preimage attacks, -// and 112 bits against collision attacks. -func New224() hash.Hash { return &state{rate: 144, outputLen: 28, dsbyte: 0x06} } - -// New256 creates a new SHA3-256 hash. -// Its generic security strength is 256 bits against preimage attacks, -// and 128 bits against collision attacks. -func New256() hash.Hash { return &state{rate: 136, outputLen: 32, dsbyte: 0x06} } - -// New384 creates a new SHA3-384 hash. -// Its generic security strength is 384 bits against preimage attacks, -// and 192 bits against collision attacks. -func New384() hash.Hash { return &state{rate: 104, outputLen: 48, dsbyte: 0x06} } - -// New512 creates a new SHA3-512 hash. -// Its generic security strength is 512 bits against preimage attacks, -// and 256 bits against collision attacks. -func New512() hash.Hash { return &state{rate: 72, outputLen: 64, dsbyte: 0x06} } - -// Sum224 returns the SHA3-224 digest of the data. -func Sum224(data []byte) (digest [28]byte) { - h := New224() - h.Write(data) - h.Sum(digest[:0]) - return -} - -// Sum256 returns the SHA3-256 digest of the data. -func Sum256(data []byte) (digest [32]byte) { - h := New256() - h.Write(data) - h.Sum(digest[:0]) - return -} - -// Sum384 returns the SHA3-384 digest of the data. -func Sum384(data []byte) (digest [48]byte) { - h := New384() - h.Write(data) - h.Sum(digest[:0]) - return -} - -// Sum512 returns the SHA3-512 digest of the data. -func Sum512(data []byte) (digest [64]byte) { - h := New512() - h.Write(data) - h.Sum(digest[:0]) - return -} diff --git a/vendor/golang.org/x/crypto/sha3/keccakf.go b/vendor/golang.org/x/crypto/sha3/keccakf.go deleted file mode 100644 index 46d03ed38..000000000 --- a/vendor/golang.org/x/crypto/sha3/keccakf.go +++ /dev/null @@ -1,412 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !amd64 appengine gccgo - -package sha3 - -// rc stores the round constants for use in the ι step. -var rc = [24]uint64{ - 0x0000000000000001, - 0x0000000000008082, - 0x800000000000808A, - 0x8000000080008000, - 0x000000000000808B, - 0x0000000080000001, - 0x8000000080008081, - 0x8000000000008009, - 0x000000000000008A, - 0x0000000000000088, - 0x0000000080008009, - 0x000000008000000A, - 0x000000008000808B, - 0x800000000000008B, - 0x8000000000008089, - 0x8000000000008003, - 0x8000000000008002, - 0x8000000000000080, - 0x000000000000800A, - 0x800000008000000A, - 0x8000000080008081, - 0x8000000000008080, - 0x0000000080000001, - 0x8000000080008008, -} - -// keccakF1600 applies the Keccak permutation to a 1600b-wide -// state represented as a slice of 25 uint64s. -func keccakF1600(a *[25]uint64) { - // Implementation translated from Keccak-inplace.c - // in the keccak reference code. - var t, bc0, bc1, bc2, bc3, bc4, d0, d1, d2, d3, d4 uint64 - - for i := 0; i < 24; i += 4 { - // Combines the 5 steps in each round into 2 steps. - // Unrolls 4 rounds per loop and spreads some steps across rounds. - - // Round 1 - bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] - bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] - bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] - bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] - bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] - d0 = bc4 ^ (bc1<<1 | bc1>>63) - d1 = bc0 ^ (bc2<<1 | bc2>>63) - d2 = bc1 ^ (bc3<<1 | bc3>>63) - d3 = bc2 ^ (bc4<<1 | bc4>>63) - d4 = bc3 ^ (bc0<<1 | bc0>>63) - - bc0 = a[0] ^ d0 - t = a[6] ^ d1 - bc1 = t<<44 | t>>(64-44) - t = a[12] ^ d2 - bc2 = t<<43 | t>>(64-43) - t = a[18] ^ d3 - bc3 = t<<21 | t>>(64-21) - t = a[24] ^ d4 - bc4 = t<<14 | t>>(64-14) - a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i] - a[6] = bc1 ^ (bc3 &^ bc2) - a[12] = bc2 ^ (bc4 &^ bc3) - a[18] = bc3 ^ (bc0 &^ bc4) - a[24] = bc4 ^ (bc1 &^ bc0) - - t = a[10] ^ d0 - bc2 = t<<3 | t>>(64-3) - t = a[16] ^ d1 - bc3 = t<<45 | t>>(64-45) - t = a[22] ^ d2 - bc4 = t<<61 | t>>(64-61) - t = a[3] ^ d3 - bc0 = t<<28 | t>>(64-28) - t = a[9] ^ d4 - bc1 = t<<20 | t>>(64-20) - a[10] = bc0 ^ (bc2 &^ bc1) - a[16] = bc1 ^ (bc3 &^ bc2) - a[22] = bc2 ^ (bc4 &^ bc3) - a[3] = bc3 ^ (bc0 &^ bc4) - a[9] = bc4 ^ (bc1 &^ bc0) - - t = a[20] ^ d0 - bc4 = t<<18 | t>>(64-18) - t = a[1] ^ d1 - bc0 = t<<1 | t>>(64-1) - t = a[7] ^ d2 - bc1 = t<<6 | t>>(64-6) - t = a[13] ^ d3 - bc2 = t<<25 | t>>(64-25) - t = a[19] ^ d4 - bc3 = t<<8 | t>>(64-8) - a[20] = bc0 ^ (bc2 &^ bc1) - a[1] = bc1 ^ (bc3 &^ bc2) - a[7] = bc2 ^ (bc4 &^ bc3) - a[13] = bc3 ^ (bc0 &^ bc4) - a[19] = bc4 ^ (bc1 &^ bc0) - - t = a[5] ^ d0 - bc1 = t<<36 | t>>(64-36) - t = a[11] ^ d1 - bc2 = t<<10 | t>>(64-10) - t = a[17] ^ d2 - bc3 = t<<15 | t>>(64-15) - t = a[23] ^ d3 - bc4 = t<<56 | t>>(64-56) - t = a[4] ^ d4 - bc0 = t<<27 | t>>(64-27) - a[5] = bc0 ^ (bc2 &^ bc1) - a[11] = bc1 ^ (bc3 &^ bc2) - a[17] = bc2 ^ (bc4 &^ bc3) - a[23] = bc3 ^ (bc0 &^ bc4) - a[4] = bc4 ^ (bc1 &^ bc0) - - t = a[15] ^ d0 - bc3 = t<<41 | t>>(64-41) - t = a[21] ^ d1 - bc4 = t<<2 | t>>(64-2) - t = a[2] ^ d2 - bc0 = t<<62 | t>>(64-62) - t = a[8] ^ d3 - bc1 = t<<55 | t>>(64-55) - t = a[14] ^ d4 - bc2 = t<<39 | t>>(64-39) - a[15] = bc0 ^ (bc2 &^ bc1) - a[21] = bc1 ^ (bc3 &^ bc2) - a[2] = bc2 ^ (bc4 &^ bc3) - a[8] = bc3 ^ (bc0 &^ bc4) - a[14] = bc4 ^ (bc1 &^ bc0) - - // Round 2 - bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] - bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] - bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] - bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] - bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] - d0 = bc4 ^ (bc1<<1 | bc1>>63) - d1 = bc0 ^ (bc2<<1 | bc2>>63) - d2 = bc1 ^ (bc3<<1 | bc3>>63) - d3 = bc2 ^ (bc4<<1 | bc4>>63) - d4 = bc3 ^ (bc0<<1 | bc0>>63) - - bc0 = a[0] ^ d0 - t = a[16] ^ d1 - bc1 = t<<44 | t>>(64-44) - t = a[7] ^ d2 - bc2 = t<<43 | t>>(64-43) - t = a[23] ^ d3 - bc3 = t<<21 | t>>(64-21) - t = a[14] ^ d4 - bc4 = t<<14 | t>>(64-14) - a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+1] - a[16] = bc1 ^ (bc3 &^ bc2) - a[7] = bc2 ^ (bc4 &^ bc3) - a[23] = bc3 ^ (bc0 &^ bc4) - a[14] = bc4 ^ (bc1 &^ bc0) - - t = a[20] ^ d0 - bc2 = t<<3 | t>>(64-3) - t = a[11] ^ d1 - bc3 = t<<45 | t>>(64-45) - t = a[2] ^ d2 - bc4 = t<<61 | t>>(64-61) - t = a[18] ^ d3 - bc0 = t<<28 | t>>(64-28) - t = a[9] ^ d4 - bc1 = t<<20 | t>>(64-20) - a[20] = bc0 ^ (bc2 &^ bc1) - a[11] = bc1 ^ (bc3 &^ bc2) - a[2] = bc2 ^ (bc4 &^ bc3) - a[18] = bc3 ^ (bc0 &^ bc4) - a[9] = bc4 ^ (bc1 &^ bc0) - - t = a[15] ^ d0 - bc4 = t<<18 | t>>(64-18) - t = a[6] ^ d1 - bc0 = t<<1 | t>>(64-1) - t = a[22] ^ d2 - bc1 = t<<6 | t>>(64-6) - t = a[13] ^ d3 - bc2 = t<<25 | t>>(64-25) - t = a[4] ^ d4 - bc3 = t<<8 | t>>(64-8) - a[15] = bc0 ^ (bc2 &^ bc1) - a[6] = bc1 ^ (bc3 &^ bc2) - a[22] = bc2 ^ (bc4 &^ bc3) - a[13] = bc3 ^ (bc0 &^ bc4) - a[4] = bc4 ^ (bc1 &^ bc0) - - t = a[10] ^ d0 - bc1 = t<<36 | t>>(64-36) - t = a[1] ^ d1 - bc2 = t<<10 | t>>(64-10) - t = a[17] ^ d2 - bc3 = t<<15 | t>>(64-15) - t = a[8] ^ d3 - bc4 = t<<56 | t>>(64-56) - t = a[24] ^ d4 - bc0 = t<<27 | t>>(64-27) - a[10] = bc0 ^ (bc2 &^ bc1) - a[1] = bc1 ^ (bc3 &^ bc2) - a[17] = bc2 ^ (bc4 &^ bc3) - a[8] = bc3 ^ (bc0 &^ bc4) - a[24] = bc4 ^ (bc1 &^ bc0) - - t = a[5] ^ d0 - bc3 = t<<41 | t>>(64-41) - t = a[21] ^ d1 - bc4 = t<<2 | t>>(64-2) - t = a[12] ^ d2 - bc0 = t<<62 | t>>(64-62) - t = a[3] ^ d3 - bc1 = t<<55 | t>>(64-55) - t = a[19] ^ d4 - bc2 = t<<39 | t>>(64-39) - a[5] = bc0 ^ (bc2 &^ bc1) - a[21] = bc1 ^ (bc3 &^ bc2) - a[12] = bc2 ^ (bc4 &^ bc3) - a[3] = bc3 ^ (bc0 &^ bc4) - a[19] = bc4 ^ (bc1 &^ bc0) - - // Round 3 - bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] - bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] - bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] - bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] - bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] - d0 = bc4 ^ (bc1<<1 | bc1>>63) - d1 = bc0 ^ (bc2<<1 | bc2>>63) - d2 = bc1 ^ (bc3<<1 | bc3>>63) - d3 = bc2 ^ (bc4<<1 | bc4>>63) - d4 = bc3 ^ (bc0<<1 | bc0>>63) - - bc0 = a[0] ^ d0 - t = a[11] ^ d1 - bc1 = t<<44 | t>>(64-44) - t = a[22] ^ d2 - bc2 = t<<43 | t>>(64-43) - t = a[8] ^ d3 - bc3 = t<<21 | t>>(64-21) - t = a[19] ^ d4 - bc4 = t<<14 | t>>(64-14) - a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+2] - a[11] = bc1 ^ (bc3 &^ bc2) - a[22] = bc2 ^ (bc4 &^ bc3) - a[8] = bc3 ^ (bc0 &^ bc4) - a[19] = bc4 ^ (bc1 &^ bc0) - - t = a[15] ^ d0 - bc2 = t<<3 | t>>(64-3) - t = a[1] ^ d1 - bc3 = t<<45 | t>>(64-45) - t = a[12] ^ d2 - bc4 = t<<61 | t>>(64-61) - t = a[23] ^ d3 - bc0 = t<<28 | t>>(64-28) - t = a[9] ^ d4 - bc1 = t<<20 | t>>(64-20) - a[15] = bc0 ^ (bc2 &^ bc1) - a[1] = bc1 ^ (bc3 &^ bc2) - a[12] = bc2 ^ (bc4 &^ bc3) - a[23] = bc3 ^ (bc0 &^ bc4) - a[9] = bc4 ^ (bc1 &^ bc0) - - t = a[5] ^ d0 - bc4 = t<<18 | t>>(64-18) - t = a[16] ^ d1 - bc0 = t<<1 | t>>(64-1) - t = a[2] ^ d2 - bc1 = t<<6 | t>>(64-6) - t = a[13] ^ d3 - bc2 = t<<25 | t>>(64-25) - t = a[24] ^ d4 - bc3 = t<<8 | t>>(64-8) - a[5] = bc0 ^ (bc2 &^ bc1) - a[16] = bc1 ^ (bc3 &^ bc2) - a[2] = bc2 ^ (bc4 &^ bc3) - a[13] = bc3 ^ (bc0 &^ bc4) - a[24] = bc4 ^ (bc1 &^ bc0) - - t = a[20] ^ d0 - bc1 = t<<36 | t>>(64-36) - t = a[6] ^ d1 - bc2 = t<<10 | t>>(64-10) - t = a[17] ^ d2 - bc3 = t<<15 | t>>(64-15) - t = a[3] ^ d3 - bc4 = t<<56 | t>>(64-56) - t = a[14] ^ d4 - bc0 = t<<27 | t>>(64-27) - a[20] = bc0 ^ (bc2 &^ bc1) - a[6] = bc1 ^ (bc3 &^ bc2) - a[17] = bc2 ^ (bc4 &^ bc3) - a[3] = bc3 ^ (bc0 &^ bc4) - a[14] = bc4 ^ (bc1 &^ bc0) - - t = a[10] ^ d0 - bc3 = t<<41 | t>>(64-41) - t = a[21] ^ d1 - bc4 = t<<2 | t>>(64-2) - t = a[7] ^ d2 - bc0 = t<<62 | t>>(64-62) - t = a[18] ^ d3 - bc1 = t<<55 | t>>(64-55) - t = a[4] ^ d4 - bc2 = t<<39 | t>>(64-39) - a[10] = bc0 ^ (bc2 &^ bc1) - a[21] = bc1 ^ (bc3 &^ bc2) - a[7] = bc2 ^ (bc4 &^ bc3) - a[18] = bc3 ^ (bc0 &^ bc4) - a[4] = bc4 ^ (bc1 &^ bc0) - - // Round 4 - bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] - bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] - bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] - bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] - bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] - d0 = bc4 ^ (bc1<<1 | bc1>>63) - d1 = bc0 ^ (bc2<<1 | bc2>>63) - d2 = bc1 ^ (bc3<<1 | bc3>>63) - d3 = bc2 ^ (bc4<<1 | bc4>>63) - d4 = bc3 ^ (bc0<<1 | bc0>>63) - - bc0 = a[0] ^ d0 - t = a[1] ^ d1 - bc1 = t<<44 | t>>(64-44) - t = a[2] ^ d2 - bc2 = t<<43 | t>>(64-43) - t = a[3] ^ d3 - bc3 = t<<21 | t>>(64-21) - t = a[4] ^ d4 - bc4 = t<<14 | t>>(64-14) - a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+3] - a[1] = bc1 ^ (bc3 &^ bc2) - a[2] = bc2 ^ (bc4 &^ bc3) - a[3] = bc3 ^ (bc0 &^ bc4) - a[4] = bc4 ^ (bc1 &^ bc0) - - t = a[5] ^ d0 - bc2 = t<<3 | t>>(64-3) - t = a[6] ^ d1 - bc3 = t<<45 | t>>(64-45) - t = a[7] ^ d2 - bc4 = t<<61 | t>>(64-61) - t = a[8] ^ d3 - bc0 = t<<28 | t>>(64-28) - t = a[9] ^ d4 - bc1 = t<<20 | t>>(64-20) - a[5] = bc0 ^ (bc2 &^ bc1) - a[6] = bc1 ^ (bc3 &^ bc2) - a[7] = bc2 ^ (bc4 &^ bc3) - a[8] = bc3 ^ (bc0 &^ bc4) - a[9] = bc4 ^ (bc1 &^ bc0) - - t = a[10] ^ d0 - bc4 = t<<18 | t>>(64-18) - t = a[11] ^ d1 - bc0 = t<<1 | t>>(64-1) - t = a[12] ^ d2 - bc1 = t<<6 | t>>(64-6) - t = a[13] ^ d3 - bc2 = t<<25 | t>>(64-25) - t = a[14] ^ d4 - bc3 = t<<8 | t>>(64-8) - a[10] = bc0 ^ (bc2 &^ bc1) - a[11] = bc1 ^ (bc3 &^ bc2) - a[12] = bc2 ^ (bc4 &^ bc3) - a[13] = bc3 ^ (bc0 &^ bc4) - a[14] = bc4 ^ (bc1 &^ bc0) - - t = a[15] ^ d0 - bc1 = t<<36 | t>>(64-36) - t = a[16] ^ d1 - bc2 = t<<10 | t>>(64-10) - t = a[17] ^ d2 - bc3 = t<<15 | t>>(64-15) - t = a[18] ^ d3 - bc4 = t<<56 | t>>(64-56) - t = a[19] ^ d4 - bc0 = t<<27 | t>>(64-27) - a[15] = bc0 ^ (bc2 &^ bc1) - a[16] = bc1 ^ (bc3 &^ bc2) - a[17] = bc2 ^ (bc4 &^ bc3) - a[18] = bc3 ^ (bc0 &^ bc4) - a[19] = bc4 ^ (bc1 &^ bc0) - - t = a[20] ^ d0 - bc3 = t<<41 | t>>(64-41) - t = a[21] ^ d1 - bc4 = t<<2 | t>>(64-2) - t = a[22] ^ d2 - bc0 = t<<62 | t>>(64-62) - t = a[23] ^ d3 - bc1 = t<<55 | t>>(64-55) - t = a[24] ^ d4 - bc2 = t<<39 | t>>(64-39) - a[20] = bc0 ^ (bc2 &^ bc1) - a[21] = bc1 ^ (bc3 &^ bc2) - a[22] = bc2 ^ (bc4 &^ bc3) - a[23] = bc3 ^ (bc0 &^ bc4) - a[24] = bc4 ^ (bc1 &^ bc0) - } -} diff --git a/vendor/golang.org/x/crypto/sha3/keccakf_amd64.go b/vendor/golang.org/x/crypto/sha3/keccakf_amd64.go deleted file mode 100644 index 788679585..000000000 --- a/vendor/golang.org/x/crypto/sha3/keccakf_amd64.go +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build amd64,!appengine,!gccgo - -package sha3 - -// This function is implemented in keccakf_amd64.s. - -//go:noescape - -func keccakF1600(a *[25]uint64) diff --git a/vendor/golang.org/x/crypto/sha3/keccakf_amd64.s b/vendor/golang.org/x/crypto/sha3/keccakf_amd64.s deleted file mode 100644 index f88533acc..000000000 --- a/vendor/golang.org/x/crypto/sha3/keccakf_amd64.s +++ /dev/null @@ -1,390 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build amd64,!appengine,!gccgo - -// This code was translated into a form compatible with 6a from the public -// domain sources at https://github.com/gvanas/KeccakCodePackage - -// Offsets in state -#define _ba (0*8) -#define _be (1*8) -#define _bi (2*8) -#define _bo (3*8) -#define _bu (4*8) -#define _ga (5*8) -#define _ge (6*8) -#define _gi (7*8) -#define _go (8*8) -#define _gu (9*8) -#define _ka (10*8) -#define _ke (11*8) -#define _ki (12*8) -#define _ko (13*8) -#define _ku (14*8) -#define _ma (15*8) -#define _me (16*8) -#define _mi (17*8) -#define _mo (18*8) -#define _mu (19*8) -#define _sa (20*8) -#define _se (21*8) -#define _si (22*8) -#define _so (23*8) -#define _su (24*8) - -// Temporary registers -#define rT1 AX - -// Round vars -#define rpState DI -#define rpStack SP - -#define rDa BX -#define rDe CX -#define rDi DX -#define rDo R8 -#define rDu R9 - -#define rBa R10 -#define rBe R11 -#define rBi R12 -#define rBo R13 -#define rBu R14 - -#define rCa SI -#define rCe BP -#define rCi rBi -#define rCo rBo -#define rCu R15 - -#define MOVQ_RBI_RCE MOVQ rBi, rCe -#define XORQ_RT1_RCA XORQ rT1, rCa -#define XORQ_RT1_RCE XORQ rT1, rCe -#define XORQ_RBA_RCU XORQ rBa, rCu -#define XORQ_RBE_RCU XORQ rBe, rCu -#define XORQ_RDU_RCU XORQ rDu, rCu -#define XORQ_RDA_RCA XORQ rDa, rCa -#define XORQ_RDE_RCE XORQ rDe, rCe - -#define mKeccakRound(iState, oState, rc, B_RBI_RCE, G_RT1_RCA, G_RT1_RCE, G_RBA_RCU, K_RT1_RCA, K_RT1_RCE, K_RBA_RCU, M_RT1_RCA, M_RT1_RCE, M_RBE_RCU, S_RDU_RCU, S_RDA_RCA, S_RDE_RCE) \ - /* Prepare round */ \ - MOVQ rCe, rDa; \ - ROLQ $1, rDa; \ - \ - MOVQ _bi(iState), rCi; \ - XORQ _gi(iState), rDi; \ - XORQ rCu, rDa; \ - XORQ _ki(iState), rCi; \ - XORQ _mi(iState), rDi; \ - XORQ rDi, rCi; \ - \ - MOVQ rCi, rDe; \ - ROLQ $1, rDe; \ - \ - MOVQ _bo(iState), rCo; \ - XORQ _go(iState), rDo; \ - XORQ rCa, rDe; \ - XORQ _ko(iState), rCo; \ - XORQ _mo(iState), rDo; \ - XORQ rDo, rCo; \ - \ - MOVQ rCo, rDi; \ - ROLQ $1, rDi; \ - \ - MOVQ rCu, rDo; \ - XORQ rCe, rDi; \ - ROLQ $1, rDo; \ - \ - MOVQ rCa, rDu; \ - XORQ rCi, rDo; \ - ROLQ $1, rDu; \ - \ - /* Result b */ \ - MOVQ _ba(iState), rBa; \ - MOVQ _ge(iState), rBe; \ - XORQ rCo, rDu; \ - MOVQ _ki(iState), rBi; \ - MOVQ _mo(iState), rBo; \ - MOVQ _su(iState), rBu; \ - XORQ rDe, rBe; \ - ROLQ $44, rBe; \ - XORQ rDi, rBi; \ - XORQ rDa, rBa; \ - ROLQ $43, rBi; \ - \ - MOVQ rBe, rCa; \ - MOVQ rc, rT1; \ - ORQ rBi, rCa; \ - XORQ rBa, rT1; \ - XORQ rT1, rCa; \ - MOVQ rCa, _ba(oState); \ - \ - XORQ rDu, rBu; \ - ROLQ $14, rBu; \ - MOVQ rBa, rCu; \ - ANDQ rBe, rCu; \ - XORQ rBu, rCu; \ - MOVQ rCu, _bu(oState); \ - \ - XORQ rDo, rBo; \ - ROLQ $21, rBo; \ - MOVQ rBo, rT1; \ - ANDQ rBu, rT1; \ - XORQ rBi, rT1; \ - MOVQ rT1, _bi(oState); \ - \ - NOTQ rBi; \ - ORQ rBa, rBu; \ - ORQ rBo, rBi; \ - XORQ rBo, rBu; \ - XORQ rBe, rBi; \ - MOVQ rBu, _bo(oState); \ - MOVQ rBi, _be(oState); \ - B_RBI_RCE; \ - \ - /* Result g */ \ - MOVQ _gu(iState), rBe; \ - XORQ rDu, rBe; \ - MOVQ _ka(iState), rBi; \ - ROLQ $20, rBe; \ - XORQ rDa, rBi; \ - ROLQ $3, rBi; \ - MOVQ _bo(iState), rBa; \ - MOVQ rBe, rT1; \ - ORQ rBi, rT1; \ - XORQ rDo, rBa; \ - MOVQ _me(iState), rBo; \ - MOVQ _si(iState), rBu; \ - ROLQ $28, rBa; \ - XORQ rBa, rT1; \ - MOVQ rT1, _ga(oState); \ - G_RT1_RCA; \ - \ - XORQ rDe, rBo; \ - ROLQ $45, rBo; \ - MOVQ rBi, rT1; \ - ANDQ rBo, rT1; \ - XORQ rBe, rT1; \ - MOVQ rT1, _ge(oState); \ - G_RT1_RCE; \ - \ - XORQ rDi, rBu; \ - ROLQ $61, rBu; \ - MOVQ rBu, rT1; \ - ORQ rBa, rT1; \ - XORQ rBo, rT1; \ - MOVQ rT1, _go(oState); \ - \ - ANDQ rBe, rBa; \ - XORQ rBu, rBa; \ - MOVQ rBa, _gu(oState); \ - NOTQ rBu; \ - G_RBA_RCU; \ - \ - ORQ rBu, rBo; \ - XORQ rBi, rBo; \ - MOVQ rBo, _gi(oState); \ - \ - /* Result k */ \ - MOVQ _be(iState), rBa; \ - MOVQ _gi(iState), rBe; \ - MOVQ _ko(iState), rBi; \ - MOVQ _mu(iState), rBo; \ - MOVQ _sa(iState), rBu; \ - XORQ rDi, rBe; \ - ROLQ $6, rBe; \ - XORQ rDo, rBi; \ - ROLQ $25, rBi; \ - MOVQ rBe, rT1; \ - ORQ rBi, rT1; \ - XORQ rDe, rBa; \ - ROLQ $1, rBa; \ - XORQ rBa, rT1; \ - MOVQ rT1, _ka(oState); \ - K_RT1_RCA; \ - \ - XORQ rDu, rBo; \ - ROLQ $8, rBo; \ - MOVQ rBi, rT1; \ - ANDQ rBo, rT1; \ - XORQ rBe, rT1; \ - MOVQ rT1, _ke(oState); \ - K_RT1_RCE; \ - \ - XORQ rDa, rBu; \ - ROLQ $18, rBu; \ - NOTQ rBo; \ - MOVQ rBo, rT1; \ - ANDQ rBu, rT1; \ - XORQ rBi, rT1; \ - MOVQ rT1, _ki(oState); \ - \ - MOVQ rBu, rT1; \ - ORQ rBa, rT1; \ - XORQ rBo, rT1; \ - MOVQ rT1, _ko(oState); \ - \ - ANDQ rBe, rBa; \ - XORQ rBu, rBa; \ - MOVQ rBa, _ku(oState); \ - K_RBA_RCU; \ - \ - /* Result m */ \ - MOVQ _ga(iState), rBe; \ - XORQ rDa, rBe; \ - MOVQ _ke(iState), rBi; \ - ROLQ $36, rBe; \ - XORQ rDe, rBi; \ - MOVQ _bu(iState), rBa; \ - ROLQ $10, rBi; \ - MOVQ rBe, rT1; \ - MOVQ _mi(iState), rBo; \ - ANDQ rBi, rT1; \ - XORQ rDu, rBa; \ - MOVQ _so(iState), rBu; \ - ROLQ $27, rBa; \ - XORQ rBa, rT1; \ - MOVQ rT1, _ma(oState); \ - M_RT1_RCA; \ - \ - XORQ rDi, rBo; \ - ROLQ $15, rBo; \ - MOVQ rBi, rT1; \ - ORQ rBo, rT1; \ - XORQ rBe, rT1; \ - MOVQ rT1, _me(oState); \ - M_RT1_RCE; \ - \ - XORQ rDo, rBu; \ - ROLQ $56, rBu; \ - NOTQ rBo; \ - MOVQ rBo, rT1; \ - ORQ rBu, rT1; \ - XORQ rBi, rT1; \ - MOVQ rT1, _mi(oState); \ - \ - ORQ rBa, rBe; \ - XORQ rBu, rBe; \ - MOVQ rBe, _mu(oState); \ - \ - ANDQ rBa, rBu; \ - XORQ rBo, rBu; \ - MOVQ rBu, _mo(oState); \ - M_RBE_RCU; \ - \ - /* Result s */ \ - MOVQ _bi(iState), rBa; \ - MOVQ _go(iState), rBe; \ - MOVQ _ku(iState), rBi; \ - XORQ rDi, rBa; \ - MOVQ _ma(iState), rBo; \ - ROLQ $62, rBa; \ - XORQ rDo, rBe; \ - MOVQ _se(iState), rBu; \ - ROLQ $55, rBe; \ - \ - XORQ rDu, rBi; \ - MOVQ rBa, rDu; \ - XORQ rDe, rBu; \ - ROLQ $2, rBu; \ - ANDQ rBe, rDu; \ - XORQ rBu, rDu; \ - MOVQ rDu, _su(oState); \ - \ - ROLQ $39, rBi; \ - S_RDU_RCU; \ - NOTQ rBe; \ - XORQ rDa, rBo; \ - MOVQ rBe, rDa; \ - ANDQ rBi, rDa; \ - XORQ rBa, rDa; \ - MOVQ rDa, _sa(oState); \ - S_RDA_RCA; \ - \ - ROLQ $41, rBo; \ - MOVQ rBi, rDe; \ - ORQ rBo, rDe; \ - XORQ rBe, rDe; \ - MOVQ rDe, _se(oState); \ - S_RDE_RCE; \ - \ - MOVQ rBo, rDi; \ - MOVQ rBu, rDo; \ - ANDQ rBu, rDi; \ - ORQ rBa, rDo; \ - XORQ rBi, rDi; \ - XORQ rBo, rDo; \ - MOVQ rDi, _si(oState); \ - MOVQ rDo, _so(oState) \ - -// func keccakF1600(state *[25]uint64) -TEXT ·keccakF1600(SB), 0, $200-8 - MOVQ state+0(FP), rpState - - // Convert the user state into an internal state - NOTQ _be(rpState) - NOTQ _bi(rpState) - NOTQ _go(rpState) - NOTQ _ki(rpState) - NOTQ _mi(rpState) - NOTQ _sa(rpState) - - // Execute the KeccakF permutation - MOVQ _ba(rpState), rCa - MOVQ _be(rpState), rCe - MOVQ _bu(rpState), rCu - - XORQ _ga(rpState), rCa - XORQ _ge(rpState), rCe - XORQ _gu(rpState), rCu - - XORQ _ka(rpState), rCa - XORQ _ke(rpState), rCe - XORQ _ku(rpState), rCu - - XORQ _ma(rpState), rCa - XORQ _me(rpState), rCe - XORQ _mu(rpState), rCu - - XORQ _sa(rpState), rCa - XORQ _se(rpState), rCe - MOVQ _si(rpState), rDi - MOVQ _so(rpState), rDo - XORQ _su(rpState), rCu - - mKeccakRound(rpState, rpStack, $0x0000000000000001, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpStack, rpState, $0x0000000000008082, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpState, rpStack, $0x800000000000808a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpStack, rpState, $0x8000000080008000, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpState, rpStack, $0x000000000000808b, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpStack, rpState, $0x0000000080000001, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpState, rpStack, $0x8000000080008081, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpStack, rpState, $0x8000000000008009, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpState, rpStack, $0x000000000000008a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpStack, rpState, $0x0000000000000088, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpState, rpStack, $0x0000000080008009, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpStack, rpState, $0x000000008000000a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpState, rpStack, $0x000000008000808b, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpStack, rpState, $0x800000000000008b, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpState, rpStack, $0x8000000000008089, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpStack, rpState, $0x8000000000008003, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpState, rpStack, $0x8000000000008002, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpStack, rpState, $0x8000000000000080, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpState, rpStack, $0x000000000000800a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpStack, rpState, $0x800000008000000a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpState, rpStack, $0x8000000080008081, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpStack, rpState, $0x8000000000008080, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpState, rpStack, $0x0000000080000001, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpStack, rpState, $0x8000000080008008, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP) - - // Revert the internal state to the user state - NOTQ _be(rpState) - NOTQ _bi(rpState) - NOTQ _go(rpState) - NOTQ _ki(rpState) - NOTQ _mi(rpState) - NOTQ _sa(rpState) - - RET diff --git a/vendor/golang.org/x/crypto/sha3/register.go b/vendor/golang.org/x/crypto/sha3/register.go deleted file mode 100644 index 3cf6a22e0..000000000 --- a/vendor/golang.org/x/crypto/sha3/register.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build go1.4 - -package sha3 - -import ( - "crypto" -) - -func init() { - crypto.RegisterHash(crypto.SHA3_224, New224) - crypto.RegisterHash(crypto.SHA3_256, New256) - crypto.RegisterHash(crypto.SHA3_384, New384) - crypto.RegisterHash(crypto.SHA3_512, New512) -} diff --git a/vendor/golang.org/x/crypto/sha3/sha3.go b/vendor/golang.org/x/crypto/sha3/sha3.go deleted file mode 100644 index c86167c0b..000000000 --- a/vendor/golang.org/x/crypto/sha3/sha3.go +++ /dev/null @@ -1,193 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package sha3 - -// spongeDirection indicates the direction bytes are flowing through the sponge. -type spongeDirection int - -const ( - // spongeAbsorbing indicates that the sponge is absorbing input. - spongeAbsorbing spongeDirection = iota - // spongeSqueezing indicates that the sponge is being squeezed. - spongeSqueezing -) - -const ( - // maxRate is the maximum size of the internal buffer. SHAKE-256 - // currently needs the largest buffer. - maxRate = 168 -) - -type state struct { - // Generic sponge components. - a [25]uint64 // main state of the hash - buf []byte // points into storage - rate int // the number of bytes of state to use - - // dsbyte contains the "domain separation" bits and the first bit of - // the padding. Sections 6.1 and 6.2 of [1] separate the outputs of the - // SHA-3 and SHAKE functions by appending bitstrings to the message. - // Using a little-endian bit-ordering convention, these are "01" for SHA-3 - // and "1111" for SHAKE, or 00000010b and 00001111b, respectively. Then the - // padding rule from section 5.1 is applied to pad the message to a multiple - // of the rate, which involves adding a "1" bit, zero or more "0" bits, and - // a final "1" bit. We merge the first "1" bit from the padding into dsbyte, - // giving 00000110b (0x06) and 00011111b (0x1f). - // [1] http://csrc.nist.gov/publications/drafts/fips-202/fips_202_draft.pdf - // "Draft FIPS 202: SHA-3 Standard: Permutation-Based Hash and - // Extendable-Output Functions (May 2014)" - dsbyte byte - storage [maxRate]byte - - // Specific to SHA-3 and SHAKE. - fixedOutput bool // whether this is a fixed-output-length instance - outputLen int // the default output size in bytes - state spongeDirection // whether the sponge is absorbing or squeezing -} - -// BlockSize returns the rate of sponge underlying this hash function. -func (d *state) BlockSize() int { return d.rate } - -// Size returns the output size of the hash function in bytes. -func (d *state) Size() int { return d.outputLen } - -// Reset clears the internal state by zeroing the sponge state and -// the byte buffer, and setting Sponge.state to absorbing. -func (d *state) Reset() { - // Zero the permutation's state. - for i := range d.a { - d.a[i] = 0 - } - d.state = spongeAbsorbing - d.buf = d.storage[:0] -} - -func (d *state) clone() *state { - ret := *d - if ret.state == spongeAbsorbing { - ret.buf = ret.storage[:len(ret.buf)] - } else { - ret.buf = ret.storage[d.rate-cap(d.buf) : d.rate] - } - - return &ret -} - -// permute applies the KeccakF-1600 permutation. It handles -// any input-output buffering. -func (d *state) permute() { - switch d.state { - case spongeAbsorbing: - // If we're absorbing, we need to xor the input into the state - // before applying the permutation. - xorIn(d, d.buf) - d.buf = d.storage[:0] - keccakF1600(&d.a) - case spongeSqueezing: - // If we're squeezing, we need to apply the permutatin before - // copying more output. - keccakF1600(&d.a) - d.buf = d.storage[:d.rate] - copyOut(d, d.buf) - } -} - -// pads appends the domain separation bits in dsbyte, applies -// the multi-bitrate 10..1 padding rule, and permutes the state. -func (d *state) padAndPermute(dsbyte byte) { - if d.buf == nil { - d.buf = d.storage[:0] - } - // Pad with this instance's domain-separator bits. We know that there's - // at least one byte of space in d.buf because, if it were full, - // permute would have been called to empty it. dsbyte also contains the - // first one bit for the padding. See the comment in the state struct. - d.buf = append(d.buf, dsbyte) - zerosStart := len(d.buf) - d.buf = d.storage[:d.rate] - for i := zerosStart; i < d.rate; i++ { - d.buf[i] = 0 - } - // This adds the final one bit for the padding. Because of the way that - // bits are numbered from the LSB upwards, the final bit is the MSB of - // the last byte. - d.buf[d.rate-1] ^= 0x80 - // Apply the permutation - d.permute() - d.state = spongeSqueezing - d.buf = d.storage[:d.rate] - copyOut(d, d.buf) -} - -// Write absorbs more data into the hash's state. It produces an error -// if more data is written to the ShakeHash after writing -func (d *state) Write(p []byte) (written int, err error) { - if d.state != spongeAbsorbing { - panic("sha3: write to sponge after read") - } - if d.buf == nil { - d.buf = d.storage[:0] - } - written = len(p) - - for len(p) > 0 { - if len(d.buf) == 0 && len(p) >= d.rate { - // The fast path; absorb a full "rate" bytes of input and apply the permutation. - xorIn(d, p[:d.rate]) - p = p[d.rate:] - keccakF1600(&d.a) - } else { - // The slow path; buffer the input until we can fill the sponge, and then xor it in. - todo := d.rate - len(d.buf) - if todo > len(p) { - todo = len(p) - } - d.buf = append(d.buf, p[:todo]...) - p = p[todo:] - - // If the sponge is full, apply the permutation. - if len(d.buf) == d.rate { - d.permute() - } - } - } - - return -} - -// Read squeezes an arbitrary number of bytes from the sponge. -func (d *state) Read(out []byte) (n int, err error) { - // If we're still absorbing, pad and apply the permutation. - if d.state == spongeAbsorbing { - d.padAndPermute(d.dsbyte) - } - - n = len(out) - - // Now, do the squeezing. - for len(out) > 0 { - n := copy(out, d.buf) - d.buf = d.buf[n:] - out = out[n:] - - // Apply the permutation if we've squeezed the sponge dry. - if len(d.buf) == 0 { - d.permute() - } - } - - return -} - -// Sum applies padding to the hash state and then squeezes out the desired -// number of output bytes. -func (d *state) Sum(in []byte) []byte { - // Make a copy of the original hash so that caller can keep writing - // and summing. - dup := d.clone() - hash := make([]byte, dup.outputLen) - dup.Read(hash) - return append(in, hash...) -} diff --git a/vendor/golang.org/x/crypto/sha3/sha3_test.go b/vendor/golang.org/x/crypto/sha3/sha3_test.go deleted file mode 100644 index caf72f279..000000000 --- a/vendor/golang.org/x/crypto/sha3/sha3_test.go +++ /dev/null @@ -1,306 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package sha3 - -// Tests include all the ShortMsgKATs provided by the Keccak team at -// https://github.com/gvanas/KeccakCodePackage -// -// They only include the zero-bit case of the bitwise testvectors -// published by NIST in the draft of FIPS-202. - -import ( - "bytes" - "compress/flate" - "encoding/hex" - "encoding/json" - "hash" - "os" - "strings" - "testing" -) - -const ( - testString = "brekeccakkeccak koax koax" - katFilename = "testdata/keccakKats.json.deflate" -) - -// Internal-use instances of SHAKE used to test against KATs. -func newHashShake128() hash.Hash { - return &state{rate: 168, dsbyte: 0x1f, outputLen: 512} -} -func newHashShake256() hash.Hash { - return &state{rate: 136, dsbyte: 0x1f, outputLen: 512} -} - -// testDigests contains functions returning hash.Hash instances -// with output-length equal to the KAT length for both SHA-3 and -// SHAKE instances. -var testDigests = map[string]func() hash.Hash{ - "SHA3-224": New224, - "SHA3-256": New256, - "SHA3-384": New384, - "SHA3-512": New512, - "SHAKE128": newHashShake128, - "SHAKE256": newHashShake256, -} - -// testShakes contains functions that return ShakeHash instances for -// testing the ShakeHash-specific interface. -var testShakes = map[string]func() ShakeHash{ - "SHAKE128": NewShake128, - "SHAKE256": NewShake256, -} - -// decodeHex converts a hex-encoded string into a raw byte string. -func decodeHex(s string) []byte { - b, err := hex.DecodeString(s) - if err != nil { - panic(err) - } - return b -} - -// structs used to marshal JSON test-cases. -type KeccakKats struct { - Kats map[string][]struct { - Digest string `json:"digest"` - Length int64 `json:"length"` - Message string `json:"message"` - } -} - -func testUnalignedAndGeneric(t *testing.T, testf func(impl string)) { - xorInOrig, copyOutOrig := xorIn, copyOut - xorIn, copyOut = xorInGeneric, copyOutGeneric - testf("generic") - if xorImplementationUnaligned != "generic" { - xorIn, copyOut = xorInUnaligned, copyOutUnaligned - testf("unaligned") - } - xorIn, copyOut = xorInOrig, copyOutOrig -} - -// TestKeccakKats tests the SHA-3 and Shake implementations against all the -// ShortMsgKATs from https://github.com/gvanas/KeccakCodePackage -// (The testvectors are stored in keccakKats.json.deflate due to their length.) -func TestKeccakKats(t *testing.T) { - testUnalignedAndGeneric(t, func(impl string) { - // Read the KATs. - deflated, err := os.Open(katFilename) - if err != nil { - t.Errorf("error opening %s: %s", katFilename, err) - } - file := flate.NewReader(deflated) - dec := json.NewDecoder(file) - var katSet KeccakKats - err = dec.Decode(&katSet) - if err != nil { - t.Errorf("error decoding KATs: %s", err) - } - - // Do the KATs. - for functionName, kats := range katSet.Kats { - d := testDigests[functionName]() - for _, kat := range kats { - d.Reset() - in, err := hex.DecodeString(kat.Message) - if err != nil { - t.Errorf("error decoding KAT: %s", err) - } - d.Write(in[:kat.Length/8]) - got := strings.ToUpper(hex.EncodeToString(d.Sum(nil))) - if got != kat.Digest { - t.Errorf("function=%s, implementation=%s, length=%d\nmessage:\n %s\ngot:\n %s\nwanted:\n %s", - functionName, impl, kat.Length, kat.Message, got, kat.Digest) - t.Logf("wanted %+v", kat) - t.FailNow() - } - continue - } - } - }) -} - -// TestUnalignedWrite tests that writing data in an arbitrary pattern with -// small input buffers. -func testUnalignedWrite(t *testing.T) { - testUnalignedAndGeneric(t, func(impl string) { - buf := sequentialBytes(0x10000) - for alg, df := range testDigests { - d := df() - d.Reset() - d.Write(buf) - want := d.Sum(nil) - d.Reset() - for i := 0; i < len(buf); { - // Cycle through offsets which make a 137 byte sequence. - // Because 137 is prime this sequence should exercise all corner cases. - offsets := [17]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1} - for _, j := range offsets { - if v := len(buf) - i; v < j { - j = v - } - d.Write(buf[i : i+j]) - i += j - } - } - got := d.Sum(nil) - if !bytes.Equal(got, want) { - t.Errorf("Unaligned writes, implementation=%s, alg=%s\ngot %q, want %q", impl, alg, got, want) - } - } - }) -} - -// TestAppend checks that appending works when reallocation is necessary. -func TestAppend(t *testing.T) { - testUnalignedAndGeneric(t, func(impl string) { - d := New224() - - for capacity := 2; capacity <= 66; capacity += 64 { - // The first time around the loop, Sum will have to reallocate. - // The second time, it will not. - buf := make([]byte, 2, capacity) - d.Reset() - d.Write([]byte{0xcc}) - buf = d.Sum(buf) - expected := "0000DF70ADC49B2E76EEE3A6931B93FA41841C3AF2CDF5B32A18B5478C39" - if got := strings.ToUpper(hex.EncodeToString(buf)); got != expected { - t.Errorf("got %s, want %s", got, expected) - } - } - }) -} - -// TestAppendNoRealloc tests that appending works when no reallocation is necessary. -func TestAppendNoRealloc(t *testing.T) { - testUnalignedAndGeneric(t, func(impl string) { - buf := make([]byte, 1, 200) - d := New224() - d.Write([]byte{0xcc}) - buf = d.Sum(buf) - expected := "00DF70ADC49B2E76EEE3A6931B93FA41841C3AF2CDF5B32A18B5478C39" - if got := strings.ToUpper(hex.EncodeToString(buf)); got != expected { - t.Errorf("%s: got %s, want %s", impl, got, expected) - } - }) -} - -// TestSqueezing checks that squeezing the full output a single time produces -// the same output as repeatedly squeezing the instance. -func TestSqueezing(t *testing.T) { - testUnalignedAndGeneric(t, func(impl string) { - for functionName, newShakeHash := range testShakes { - d0 := newShakeHash() - d0.Write([]byte(testString)) - ref := make([]byte, 32) - d0.Read(ref) - - d1 := newShakeHash() - d1.Write([]byte(testString)) - var multiple []byte - for _ = range ref { - one := make([]byte, 1) - d1.Read(one) - multiple = append(multiple, one...) - } - if !bytes.Equal(ref, multiple) { - t.Errorf("%s (%s): squeezing %d bytes one at a time failed", functionName, impl, len(ref)) - } - } - }) -} - -// sequentialBytes produces a buffer of size consecutive bytes 0x00, 0x01, ..., used for testing. -func sequentialBytes(size int) []byte { - result := make([]byte, size) - for i := range result { - result[i] = byte(i) - } - return result -} - -// BenchmarkPermutationFunction measures the speed of the permutation function -// with no input data. -func BenchmarkPermutationFunction(b *testing.B) { - b.SetBytes(int64(200)) - var lanes [25]uint64 - for i := 0; i < b.N; i++ { - keccakF1600(&lanes) - } -} - -// benchmarkHash tests the speed to hash num buffers of buflen each. -func benchmarkHash(b *testing.B, h hash.Hash, size, num int) { - b.StopTimer() - h.Reset() - data := sequentialBytes(size) - b.SetBytes(int64(size * num)) - b.StartTimer() - - var state []byte - for i := 0; i < b.N; i++ { - for j := 0; j < num; j++ { - h.Write(data) - } - state = h.Sum(state[:0]) - } - b.StopTimer() - h.Reset() -} - -// benchmarkShake is specialized to the Shake instances, which don't -// require a copy on reading output. -func benchmarkShake(b *testing.B, h ShakeHash, size, num int) { - b.StopTimer() - h.Reset() - data := sequentialBytes(size) - d := make([]byte, 32) - - b.SetBytes(int64(size * num)) - b.StartTimer() - - for i := 0; i < b.N; i++ { - h.Reset() - for j := 0; j < num; j++ { - h.Write(data) - } - h.Read(d) - } -} - -func BenchmarkSha3_512_MTU(b *testing.B) { benchmarkHash(b, New512(), 1350, 1) } -func BenchmarkSha3_384_MTU(b *testing.B) { benchmarkHash(b, New384(), 1350, 1) } -func BenchmarkSha3_256_MTU(b *testing.B) { benchmarkHash(b, New256(), 1350, 1) } -func BenchmarkSha3_224_MTU(b *testing.B) { benchmarkHash(b, New224(), 1350, 1) } - -func BenchmarkShake128_MTU(b *testing.B) { benchmarkShake(b, NewShake128(), 1350, 1) } -func BenchmarkShake256_MTU(b *testing.B) { benchmarkShake(b, NewShake256(), 1350, 1) } -func BenchmarkShake256_16x(b *testing.B) { benchmarkShake(b, NewShake256(), 16, 1024) } -func BenchmarkShake256_1MiB(b *testing.B) { benchmarkShake(b, NewShake256(), 1024, 1024) } - -func BenchmarkSha3_512_1MiB(b *testing.B) { benchmarkHash(b, New512(), 1024, 1024) } - -func Example_sum() { - buf := []byte("some data to hash") - // A hash needs to be 64 bytes long to have 256-bit collision resistance. - h := make([]byte, 64) - // Compute a 64-byte hash of buf and put it in h. - ShakeSum256(h, buf) -} - -func Example_mac() { - k := []byte("this is a secret key; you should generate a strong random key that's at least 32 bytes long") - buf := []byte("and this is some data to authenticate") - // A MAC with 32 bytes of output has 256-bit security strength -- if you use at least a 32-byte-long key. - h := make([]byte, 32) - d := NewShake256() - // Write the key into the hash. - d.Write(k) - // Now write the data. - d.Write(buf) - // Read 32 bytes of output from the hash into h. - d.Read(h) -} diff --git a/vendor/golang.org/x/crypto/sha3/shake.go b/vendor/golang.org/x/crypto/sha3/shake.go deleted file mode 100644 index 841f9860f..000000000 --- a/vendor/golang.org/x/crypto/sha3/shake.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package sha3 - -// This file defines the ShakeHash interface, and provides -// functions for creating SHAKE instances, as well as utility -// functions for hashing bytes to arbitrary-length output. - -import ( - "io" -) - -// ShakeHash defines the interface to hash functions that -// support arbitrary-length output. -type ShakeHash interface { - // Write absorbs more data into the hash's state. It panics if input is - // written to it after output has been read from it. - io.Writer - - // Read reads more output from the hash; reading affects the hash's - // state. (ShakeHash.Read is thus very different from Hash.Sum) - // It never returns an error. - io.Reader - - // Clone returns a copy of the ShakeHash in its current state. - Clone() ShakeHash - - // Reset resets the ShakeHash to its initial state. - Reset() -} - -func (d *state) Clone() ShakeHash { - return d.clone() -} - -// NewShake128 creates a new SHAKE128 variable-output-length ShakeHash. -// Its generic security strength is 128 bits against all attacks if at -// least 32 bytes of its output are used. -func NewShake128() ShakeHash { return &state{rate: 168, dsbyte: 0x1f} } - -// NewShake256 creates a new SHAKE128 variable-output-length ShakeHash. -// Its generic security strength is 256 bits against all attacks if -// at least 64 bytes of its output are used. -func NewShake256() ShakeHash { return &state{rate: 136, dsbyte: 0x1f} } - -// ShakeSum128 writes an arbitrary-length digest of data into hash. -func ShakeSum128(hash, data []byte) { - h := NewShake128() - h.Write(data) - h.Read(hash) -} - -// ShakeSum256 writes an arbitrary-length digest of data into hash. -func ShakeSum256(hash, data []byte) { - h := NewShake256() - h.Write(data) - h.Read(hash) -} diff --git a/vendor/golang.org/x/crypto/sha3/testdata/keccakKats.json.deflate b/vendor/golang.org/x/crypto/sha3/testdata/keccakKats.json.deflate deleted file mode 100644 index 62e85ae24..000000000 Binary files a/vendor/golang.org/x/crypto/sha3/testdata/keccakKats.json.deflate and /dev/null differ diff --git a/vendor/golang.org/x/crypto/sha3/xor.go b/vendor/golang.org/x/crypto/sha3/xor.go deleted file mode 100644 index 46a0d63a6..000000000 --- a/vendor/golang.org/x/crypto/sha3/xor.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !amd64,!386,!ppc64le appengine - -package sha3 - -var ( - xorIn = xorInGeneric - copyOut = copyOutGeneric - xorInUnaligned = xorInGeneric - copyOutUnaligned = copyOutGeneric -) - -const xorImplementationUnaligned = "generic" diff --git a/vendor/golang.org/x/crypto/sha3/xor_generic.go b/vendor/golang.org/x/crypto/sha3/xor_generic.go deleted file mode 100644 index fd35f02ef..000000000 --- a/vendor/golang.org/x/crypto/sha3/xor_generic.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package sha3 - -import "encoding/binary" - -// xorInGeneric xors the bytes in buf into the state; it -// makes no non-portable assumptions about memory layout -// or alignment. -func xorInGeneric(d *state, buf []byte) { - n := len(buf) / 8 - - for i := 0; i < n; i++ { - a := binary.LittleEndian.Uint64(buf) - d.a[i] ^= a - buf = buf[8:] - } -} - -// copyOutGeneric copies ulint64s to a byte buffer. -func copyOutGeneric(d *state, b []byte) { - for i := 0; len(b) >= 8; i++ { - binary.LittleEndian.PutUint64(b, d.a[i]) - b = b[8:] - } -} diff --git a/vendor/golang.org/x/crypto/sha3/xor_unaligned.go b/vendor/golang.org/x/crypto/sha3/xor_unaligned.go deleted file mode 100644 index 929a486a7..000000000 --- a/vendor/golang.org/x/crypto/sha3/xor_unaligned.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build amd64 386 ppc64le -// +build !appengine - -package sha3 - -import "unsafe" - -func xorInUnaligned(d *state, buf []byte) { - bw := (*[maxRate / 8]uint64)(unsafe.Pointer(&buf[0])) - n := len(buf) - if n >= 72 { - d.a[0] ^= bw[0] - d.a[1] ^= bw[1] - d.a[2] ^= bw[2] - d.a[3] ^= bw[3] - d.a[4] ^= bw[4] - d.a[5] ^= bw[5] - d.a[6] ^= bw[6] - d.a[7] ^= bw[7] - d.a[8] ^= bw[8] - } - if n >= 104 { - d.a[9] ^= bw[9] - d.a[10] ^= bw[10] - d.a[11] ^= bw[11] - d.a[12] ^= bw[12] - } - if n >= 136 { - d.a[13] ^= bw[13] - d.a[14] ^= bw[14] - d.a[15] ^= bw[15] - d.a[16] ^= bw[16] - } - if n >= 144 { - d.a[17] ^= bw[17] - } - if n >= 168 { - d.a[18] ^= bw[18] - d.a[19] ^= bw[19] - d.a[20] ^= bw[20] - } -} - -func copyOutUnaligned(d *state, buf []byte) { - ab := (*[maxRate]uint8)(unsafe.Pointer(&d.a[0])) - copy(buf, ab[:]) -} - -var ( - xorIn = xorInUnaligned - copyOut = copyOutUnaligned -) - -const xorImplementationUnaligned = "unaligned" diff --git a/vendor/golang.org/x/crypto/ssh/agent/client.go b/vendor/golang.org/x/crypto/ssh/agent/client.go deleted file mode 100644 index ecfd7c58d..000000000 --- a/vendor/golang.org/x/crypto/ssh/agent/client.go +++ /dev/null @@ -1,659 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package agent implements the ssh-agent protocol, and provides both -// a client and a server. The client can talk to a standard ssh-agent -// that uses UNIX sockets, and one could implement an alternative -// ssh-agent process using the sample server. -// -// References: -// [PROTOCOL.agent]: http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/PROTOCOL.agent?rev=HEAD -package agent // import "golang.org/x/crypto/ssh/agent" - -import ( - "bytes" - "crypto/dsa" - "crypto/ecdsa" - "crypto/elliptic" - "crypto/rsa" - "encoding/base64" - "encoding/binary" - "errors" - "fmt" - "io" - "math/big" - "sync" - - "golang.org/x/crypto/ed25519" - "golang.org/x/crypto/ssh" -) - -// Agent represents the capabilities of an ssh-agent. -type Agent interface { - // List returns the identities known to the agent. - List() ([]*Key, error) - - // Sign has the agent sign the data using a protocol 2 key as defined - // in [PROTOCOL.agent] section 2.6.2. - Sign(key ssh.PublicKey, data []byte) (*ssh.Signature, error) - - // Add adds a private key to the agent. - Add(key AddedKey) error - - // Remove removes all identities with the given public key. - Remove(key ssh.PublicKey) error - - // RemoveAll removes all identities. - RemoveAll() error - - // Lock locks the agent. Sign and Remove will fail, and List will empty an empty list. - Lock(passphrase []byte) error - - // Unlock undoes the effect of Lock - Unlock(passphrase []byte) error - - // Signers returns signers for all the known keys. - Signers() ([]ssh.Signer, error) -} - -// AddedKey describes an SSH key to be added to an Agent. -type AddedKey struct { - // PrivateKey must be a *rsa.PrivateKey, *dsa.PrivateKey or - // *ecdsa.PrivateKey, which will be inserted into the agent. - PrivateKey interface{} - // Certificate, if not nil, is communicated to the agent and will be - // stored with the key. - Certificate *ssh.Certificate - // Comment is an optional, free-form string. - Comment string - // LifetimeSecs, if not zero, is the number of seconds that the - // agent will store the key for. - LifetimeSecs uint32 - // ConfirmBeforeUse, if true, requests that the agent confirm with the - // user before each use of this key. - ConfirmBeforeUse bool -} - -// See [PROTOCOL.agent], section 3. -const ( - agentRequestV1Identities = 1 - agentRemoveAllV1Identities = 9 - - // 3.2 Requests from client to agent for protocol 2 key operations - agentAddIdentity = 17 - agentRemoveIdentity = 18 - agentRemoveAllIdentities = 19 - agentAddIdConstrained = 25 - - // 3.3 Key-type independent requests from client to agent - agentAddSmartcardKey = 20 - agentRemoveSmartcardKey = 21 - agentLock = 22 - agentUnlock = 23 - agentAddSmartcardKeyConstrained = 26 - - // 3.7 Key constraint identifiers - agentConstrainLifetime = 1 - agentConstrainConfirm = 2 -) - -// maxAgentResponseBytes is the maximum agent reply size that is accepted. This -// is a sanity check, not a limit in the spec. -const maxAgentResponseBytes = 16 << 20 - -// Agent messages: -// These structures mirror the wire format of the corresponding ssh agent -// messages found in [PROTOCOL.agent]. - -// 3.4 Generic replies from agent to client -const agentFailure = 5 - -type failureAgentMsg struct{} - -const agentSuccess = 6 - -type successAgentMsg struct{} - -// See [PROTOCOL.agent], section 2.5.2. -const agentRequestIdentities = 11 - -type requestIdentitiesAgentMsg struct{} - -// See [PROTOCOL.agent], section 2.5.2. -const agentIdentitiesAnswer = 12 - -type identitiesAnswerAgentMsg struct { - NumKeys uint32 `sshtype:"12"` - Keys []byte `ssh:"rest"` -} - -// See [PROTOCOL.agent], section 2.6.2. -const agentSignRequest = 13 - -type signRequestAgentMsg struct { - KeyBlob []byte `sshtype:"13"` - Data []byte - Flags uint32 -} - -// See [PROTOCOL.agent], section 2.6.2. - -// 3.6 Replies from agent to client for protocol 2 key operations -const agentSignResponse = 14 - -type signResponseAgentMsg struct { - SigBlob []byte `sshtype:"14"` -} - -type publicKey struct { - Format string - Rest []byte `ssh:"rest"` -} - -// Key represents a protocol 2 public key as defined in -// [PROTOCOL.agent], section 2.5.2. -type Key struct { - Format string - Blob []byte - Comment string -} - -func clientErr(err error) error { - return fmt.Errorf("agent: client error: %v", err) -} - -// String returns the storage form of an agent key with the format, base64 -// encoded serialized key, and the comment if it is not empty. -func (k *Key) String() string { - s := string(k.Format) + " " + base64.StdEncoding.EncodeToString(k.Blob) - - if k.Comment != "" { - s += " " + k.Comment - } - - return s -} - -// Type returns the public key type. -func (k *Key) Type() string { - return k.Format -} - -// Marshal returns key blob to satisfy the ssh.PublicKey interface. -func (k *Key) Marshal() []byte { - return k.Blob -} - -// Verify satisfies the ssh.PublicKey interface. -func (k *Key) Verify(data []byte, sig *ssh.Signature) error { - pubKey, err := ssh.ParsePublicKey(k.Blob) - if err != nil { - return fmt.Errorf("agent: bad public key: %v", err) - } - return pubKey.Verify(data, sig) -} - -type wireKey struct { - Format string - Rest []byte `ssh:"rest"` -} - -func parseKey(in []byte) (out *Key, rest []byte, err error) { - var record struct { - Blob []byte - Comment string - Rest []byte `ssh:"rest"` - } - - if err := ssh.Unmarshal(in, &record); err != nil { - return nil, nil, err - } - - var wk wireKey - if err := ssh.Unmarshal(record.Blob, &wk); err != nil { - return nil, nil, err - } - - return &Key{ - Format: wk.Format, - Blob: record.Blob, - Comment: record.Comment, - }, record.Rest, nil -} - -// client is a client for an ssh-agent process. -type client struct { - // conn is typically a *net.UnixConn - conn io.ReadWriter - // mu is used to prevent concurrent access to the agent - mu sync.Mutex -} - -// NewClient returns an Agent that talks to an ssh-agent process over -// the given connection. -func NewClient(rw io.ReadWriter) Agent { - return &client{conn: rw} -} - -// call sends an RPC to the agent. On success, the reply is -// unmarshaled into reply and replyType is set to the first byte of -// the reply, which contains the type of the message. -func (c *client) call(req []byte) (reply interface{}, err error) { - c.mu.Lock() - defer c.mu.Unlock() - - msg := make([]byte, 4+len(req)) - binary.BigEndian.PutUint32(msg, uint32(len(req))) - copy(msg[4:], req) - if _, err = c.conn.Write(msg); err != nil { - return nil, clientErr(err) - } - - var respSizeBuf [4]byte - if _, err = io.ReadFull(c.conn, respSizeBuf[:]); err != nil { - return nil, clientErr(err) - } - respSize := binary.BigEndian.Uint32(respSizeBuf[:]) - if respSize > maxAgentResponseBytes { - return nil, clientErr(err) - } - - buf := make([]byte, respSize) - if _, err = io.ReadFull(c.conn, buf); err != nil { - return nil, clientErr(err) - } - reply, err = unmarshal(buf) - if err != nil { - return nil, clientErr(err) - } - return reply, err -} - -func (c *client) simpleCall(req []byte) error { - resp, err := c.call(req) - if err != nil { - return err - } - if _, ok := resp.(*successAgentMsg); ok { - return nil - } - return errors.New("agent: failure") -} - -func (c *client) RemoveAll() error { - return c.simpleCall([]byte{agentRemoveAllIdentities}) -} - -func (c *client) Remove(key ssh.PublicKey) error { - req := ssh.Marshal(&agentRemoveIdentityMsg{ - KeyBlob: key.Marshal(), - }) - return c.simpleCall(req) -} - -func (c *client) Lock(passphrase []byte) error { - req := ssh.Marshal(&agentLockMsg{ - Passphrase: passphrase, - }) - return c.simpleCall(req) -} - -func (c *client) Unlock(passphrase []byte) error { - req := ssh.Marshal(&agentUnlockMsg{ - Passphrase: passphrase, - }) - return c.simpleCall(req) -} - -// List returns the identities known to the agent. -func (c *client) List() ([]*Key, error) { - // see [PROTOCOL.agent] section 2.5.2. - req := []byte{agentRequestIdentities} - - msg, err := c.call(req) - if err != nil { - return nil, err - } - - switch msg := msg.(type) { - case *identitiesAnswerAgentMsg: - if msg.NumKeys > maxAgentResponseBytes/8 { - return nil, errors.New("agent: too many keys in agent reply") - } - keys := make([]*Key, msg.NumKeys) - data := msg.Keys - for i := uint32(0); i < msg.NumKeys; i++ { - var key *Key - var err error - if key, data, err = parseKey(data); err != nil { - return nil, err - } - keys[i] = key - } - return keys, nil - case *failureAgentMsg: - return nil, errors.New("agent: failed to list keys") - } - panic("unreachable") -} - -// Sign has the agent sign the data using a protocol 2 key as defined -// in [PROTOCOL.agent] section 2.6.2. -func (c *client) Sign(key ssh.PublicKey, data []byte) (*ssh.Signature, error) { - req := ssh.Marshal(signRequestAgentMsg{ - KeyBlob: key.Marshal(), - Data: data, - }) - - msg, err := c.call(req) - if err != nil { - return nil, err - } - - switch msg := msg.(type) { - case *signResponseAgentMsg: - var sig ssh.Signature - if err := ssh.Unmarshal(msg.SigBlob, &sig); err != nil { - return nil, err - } - - return &sig, nil - case *failureAgentMsg: - return nil, errors.New("agent: failed to sign challenge") - } - panic("unreachable") -} - -// unmarshal parses an agent message in packet, returning the parsed -// form and the message type of packet. -func unmarshal(packet []byte) (interface{}, error) { - if len(packet) < 1 { - return nil, errors.New("agent: empty packet") - } - var msg interface{} - switch packet[0] { - case agentFailure: - return new(failureAgentMsg), nil - case agentSuccess: - return new(successAgentMsg), nil - case agentIdentitiesAnswer: - msg = new(identitiesAnswerAgentMsg) - case agentSignResponse: - msg = new(signResponseAgentMsg) - case agentV1IdentitiesAnswer: - msg = new(agentV1IdentityMsg) - default: - return nil, fmt.Errorf("agent: unknown type tag %d", packet[0]) - } - if err := ssh.Unmarshal(packet, msg); err != nil { - return nil, err - } - return msg, nil -} - -type rsaKeyMsg struct { - Type string `sshtype:"17|25"` - N *big.Int - E *big.Int - D *big.Int - Iqmp *big.Int // IQMP = Inverse Q Mod P - P *big.Int - Q *big.Int - Comments string - Constraints []byte `ssh:"rest"` -} - -type dsaKeyMsg struct { - Type string `sshtype:"17|25"` - P *big.Int - Q *big.Int - G *big.Int - Y *big.Int - X *big.Int - Comments string - Constraints []byte `ssh:"rest"` -} - -type ecdsaKeyMsg struct { - Type string `sshtype:"17|25"` - Curve string - KeyBytes []byte - D *big.Int - Comments string - Constraints []byte `ssh:"rest"` -} - -type ed25519KeyMsg struct { - Type string `sshtype:"17|25"` - Pub []byte - Priv []byte - Comments string - Constraints []byte `ssh:"rest"` -} - -// Insert adds a private key to the agent. -func (c *client) insertKey(s interface{}, comment string, constraints []byte) error { - var req []byte - switch k := s.(type) { - case *rsa.PrivateKey: - if len(k.Primes) != 2 { - return fmt.Errorf("agent: unsupported RSA key with %d primes", len(k.Primes)) - } - k.Precompute() - req = ssh.Marshal(rsaKeyMsg{ - Type: ssh.KeyAlgoRSA, - N: k.N, - E: big.NewInt(int64(k.E)), - D: k.D, - Iqmp: k.Precomputed.Qinv, - P: k.Primes[0], - Q: k.Primes[1], - Comments: comment, - Constraints: constraints, - }) - case *dsa.PrivateKey: - req = ssh.Marshal(dsaKeyMsg{ - Type: ssh.KeyAlgoDSA, - P: k.P, - Q: k.Q, - G: k.G, - Y: k.Y, - X: k.X, - Comments: comment, - Constraints: constraints, - }) - case *ecdsa.PrivateKey: - nistID := fmt.Sprintf("nistp%d", k.Params().BitSize) - req = ssh.Marshal(ecdsaKeyMsg{ - Type: "ecdsa-sha2-" + nistID, - Curve: nistID, - KeyBytes: elliptic.Marshal(k.Curve, k.X, k.Y), - D: k.D, - Comments: comment, - Constraints: constraints, - }) - case *ed25519.PrivateKey: - req = ssh.Marshal(ed25519KeyMsg{ - Type: ssh.KeyAlgoED25519, - Pub: []byte(*k)[32:], - Priv: []byte(*k), - Comments: comment, - Constraints: constraints, - }) - default: - return fmt.Errorf("agent: unsupported key type %T", s) - } - - // if constraints are present then the message type needs to be changed. - if len(constraints) != 0 { - req[0] = agentAddIdConstrained - } - - resp, err := c.call(req) - if err != nil { - return err - } - if _, ok := resp.(*successAgentMsg); ok { - return nil - } - return errors.New("agent: failure") -} - -type rsaCertMsg struct { - Type string `sshtype:"17|25"` - CertBytes []byte - D *big.Int - Iqmp *big.Int // IQMP = Inverse Q Mod P - P *big.Int - Q *big.Int - Comments string - Constraints []byte `ssh:"rest"` -} - -type dsaCertMsg struct { - Type string `sshtype:"17|25"` - CertBytes []byte - X *big.Int - Comments string - Constraints []byte `ssh:"rest"` -} - -type ecdsaCertMsg struct { - Type string `sshtype:"17|25"` - CertBytes []byte - D *big.Int - Comments string - Constraints []byte `ssh:"rest"` -} - -type ed25519CertMsg struct { - Type string `sshtype:"17|25"` - CertBytes []byte - Pub []byte - Priv []byte - Comments string - Constraints []byte `ssh:"rest"` -} - -// Add adds a private key to the agent. If a certificate is given, -// that certificate is added instead as public key. -func (c *client) Add(key AddedKey) error { - var constraints []byte - - if secs := key.LifetimeSecs; secs != 0 { - constraints = append(constraints, agentConstrainLifetime) - - var secsBytes [4]byte - binary.BigEndian.PutUint32(secsBytes[:], secs) - constraints = append(constraints, secsBytes[:]...) - } - - if key.ConfirmBeforeUse { - constraints = append(constraints, agentConstrainConfirm) - } - - if cert := key.Certificate; cert == nil { - return c.insertKey(key.PrivateKey, key.Comment, constraints) - } else { - return c.insertCert(key.PrivateKey, cert, key.Comment, constraints) - } -} - -func (c *client) insertCert(s interface{}, cert *ssh.Certificate, comment string, constraints []byte) error { - var req []byte - switch k := s.(type) { - case *rsa.PrivateKey: - if len(k.Primes) != 2 { - return fmt.Errorf("agent: unsupported RSA key with %d primes", len(k.Primes)) - } - k.Precompute() - req = ssh.Marshal(rsaCertMsg{ - Type: cert.Type(), - CertBytes: cert.Marshal(), - D: k.D, - Iqmp: k.Precomputed.Qinv, - P: k.Primes[0], - Q: k.Primes[1], - Comments: comment, - Constraints: constraints, - }) - case *dsa.PrivateKey: - req = ssh.Marshal(dsaCertMsg{ - Type: cert.Type(), - CertBytes: cert.Marshal(), - X: k.X, - Comments: comment, - Constraints: constraints, - }) - case *ecdsa.PrivateKey: - req = ssh.Marshal(ecdsaCertMsg{ - Type: cert.Type(), - CertBytes: cert.Marshal(), - D: k.D, - Comments: comment, - Constraints: constraints, - }) - case *ed25519.PrivateKey: - req = ssh.Marshal(ed25519CertMsg{ - Type: cert.Type(), - CertBytes: cert.Marshal(), - Pub: []byte(*k)[32:], - Priv: []byte(*k), - Comments: comment, - Constraints: constraints, - }) - default: - return fmt.Errorf("agent: unsupported key type %T", s) - } - - // if constraints are present then the message type needs to be changed. - if len(constraints) != 0 { - req[0] = agentAddIdConstrained - } - - signer, err := ssh.NewSignerFromKey(s) - if err != nil { - return err - } - if bytes.Compare(cert.Key.Marshal(), signer.PublicKey().Marshal()) != 0 { - return errors.New("agent: signer and cert have different public key") - } - - resp, err := c.call(req) - if err != nil { - return err - } - if _, ok := resp.(*successAgentMsg); ok { - return nil - } - return errors.New("agent: failure") -} - -// Signers provides a callback for client authentication. -func (c *client) Signers() ([]ssh.Signer, error) { - keys, err := c.List() - if err != nil { - return nil, err - } - - var result []ssh.Signer - for _, k := range keys { - result = append(result, &agentKeyringSigner{c, k}) - } - return result, nil -} - -type agentKeyringSigner struct { - agent *client - pub ssh.PublicKey -} - -func (s *agentKeyringSigner) PublicKey() ssh.PublicKey { - return s.pub -} - -func (s *agentKeyringSigner) Sign(rand io.Reader, data []byte) (*ssh.Signature, error) { - // The agent has its own entropy source, so the rand argument is ignored. - return s.agent.Sign(s.pub, data) -} diff --git a/vendor/golang.org/x/crypto/ssh/agent/client_test.go b/vendor/golang.org/x/crypto/ssh/agent/client_test.go deleted file mode 100644 index 93d3a9cd2..000000000 --- a/vendor/golang.org/x/crypto/ssh/agent/client_test.go +++ /dev/null @@ -1,345 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package agent - -import ( - "bytes" - "crypto/rand" - "errors" - "net" - "os" - "os/exec" - "path/filepath" - "strconv" - "testing" - "time" - - "golang.org/x/crypto/ssh" -) - -// startAgent executes ssh-agent, and returns a Agent interface to it. -func startAgent(t *testing.T) (client Agent, socket string, cleanup func()) { - if testing.Short() { - // ssh-agent is not always available, and the key - // types supported vary by platform. - t.Skip("skipping test due to -short") - } - - bin, err := exec.LookPath("ssh-agent") - if err != nil { - t.Skip("could not find ssh-agent") - } - - cmd := exec.Command(bin, "-s") - out, err := cmd.Output() - if err != nil { - t.Fatalf("cmd.Output: %v", err) - } - - /* Output looks like: - - SSH_AUTH_SOCK=/tmp/ssh-P65gpcqArqvH/agent.15541; export SSH_AUTH_SOCK; - SSH_AGENT_PID=15542; export SSH_AGENT_PID; - echo Agent pid 15542; - */ - fields := bytes.Split(out, []byte(";")) - line := bytes.SplitN(fields[0], []byte("="), 2) - line[0] = bytes.TrimLeft(line[0], "\n") - if string(line[0]) != "SSH_AUTH_SOCK" { - t.Fatalf("could not find key SSH_AUTH_SOCK in %q", fields[0]) - } - socket = string(line[1]) - - line = bytes.SplitN(fields[2], []byte("="), 2) - line[0] = bytes.TrimLeft(line[0], "\n") - if string(line[0]) != "SSH_AGENT_PID" { - t.Fatalf("could not find key SSH_AGENT_PID in %q", fields[2]) - } - pidStr := line[1] - pid, err := strconv.Atoi(string(pidStr)) - if err != nil { - t.Fatalf("Atoi(%q): %v", pidStr, err) - } - - conn, err := net.Dial("unix", string(socket)) - if err != nil { - t.Fatalf("net.Dial: %v", err) - } - - ac := NewClient(conn) - return ac, socket, func() { - proc, _ := os.FindProcess(pid) - if proc != nil { - proc.Kill() - } - conn.Close() - os.RemoveAll(filepath.Dir(socket)) - } -} - -func testAgent(t *testing.T, key interface{}, cert *ssh.Certificate, lifetimeSecs uint32) { - agent, _, cleanup := startAgent(t) - defer cleanup() - - testAgentInterface(t, agent, key, cert, lifetimeSecs) -} - -func testKeyring(t *testing.T, key interface{}, cert *ssh.Certificate, lifetimeSecs uint32) { - a := NewKeyring() - testAgentInterface(t, a, key, cert, lifetimeSecs) -} - -func testAgentInterface(t *testing.T, agent Agent, key interface{}, cert *ssh.Certificate, lifetimeSecs uint32) { - signer, err := ssh.NewSignerFromKey(key) - if err != nil { - t.Fatalf("NewSignerFromKey(%T): %v", key, err) - } - // The agent should start up empty. - if keys, err := agent.List(); err != nil { - t.Fatalf("RequestIdentities: %v", err) - } else if len(keys) > 0 { - t.Fatalf("got %d keys, want 0: %v", len(keys), keys) - } - - // Attempt to insert the key, with certificate if specified. - var pubKey ssh.PublicKey - if cert != nil { - err = agent.Add(AddedKey{ - PrivateKey: key, - Certificate: cert, - Comment: "comment", - LifetimeSecs: lifetimeSecs, - }) - pubKey = cert - } else { - err = agent.Add(AddedKey{PrivateKey: key, Comment: "comment", LifetimeSecs: lifetimeSecs}) - pubKey = signer.PublicKey() - } - if err != nil { - t.Fatalf("insert(%T): %v", key, err) - } - - // Did the key get inserted successfully? - if keys, err := agent.List(); err != nil { - t.Fatalf("List: %v", err) - } else if len(keys) != 1 { - t.Fatalf("got %v, want 1 key", keys) - } else if keys[0].Comment != "comment" { - t.Fatalf("key comment: got %v, want %v", keys[0].Comment, "comment") - } else if !bytes.Equal(keys[0].Blob, pubKey.Marshal()) { - t.Fatalf("key mismatch") - } - - // Can the agent make a valid signature? - data := []byte("hello") - sig, err := agent.Sign(pubKey, data) - if err != nil { - t.Fatalf("Sign(%s): %v", pubKey.Type(), err) - } - - if err := pubKey.Verify(data, sig); err != nil { - t.Fatalf("Verify(%s): %v", pubKey.Type(), err) - } - - // If the key has a lifetime, is it removed when it should be? - if lifetimeSecs > 0 { - time.Sleep(time.Second*time.Duration(lifetimeSecs) + 100*time.Millisecond) - keys, err := agent.List() - if err != nil { - t.Fatalf("List: %v", err) - } - if len(keys) > 0 { - t.Fatalf("key not expired") - } - } - -} - -func TestAgent(t *testing.T) { - for _, keyType := range []string{"rsa", "dsa", "ecdsa", "ed25519"} { - testAgent(t, testPrivateKeys[keyType], nil, 0) - testKeyring(t, testPrivateKeys[keyType], nil, 1) - } -} - -func TestCert(t *testing.T) { - cert := &ssh.Certificate{ - Key: testPublicKeys["rsa"], - ValidBefore: ssh.CertTimeInfinity, - CertType: ssh.UserCert, - } - cert.SignCert(rand.Reader, testSigners["ecdsa"]) - - testAgent(t, testPrivateKeys["rsa"], cert, 0) - testKeyring(t, testPrivateKeys["rsa"], cert, 1) -} - -// netPipe is analogous to net.Pipe, but it uses a real net.Conn, and -// therefore is buffered (net.Pipe deadlocks if both sides start with -// a write.) -func netPipe() (net.Conn, net.Conn, error) { - listener, err := net.Listen("tcp", ":0") - if err != nil { - return nil, nil, err - } - defer listener.Close() - c1, err := net.Dial("tcp", listener.Addr().String()) - if err != nil { - return nil, nil, err - } - - c2, err := listener.Accept() - if err != nil { - c1.Close() - return nil, nil, err - } - - return c1, c2, nil -} - -func TestAuth(t *testing.T) { - a, b, err := netPipe() - if err != nil { - t.Fatalf("netPipe: %v", err) - } - - defer a.Close() - defer b.Close() - - agent, _, cleanup := startAgent(t) - defer cleanup() - - if err := agent.Add(AddedKey{PrivateKey: testPrivateKeys["rsa"], Comment: "comment"}); err != nil { - t.Errorf("Add: %v", err) - } - - serverConf := ssh.ServerConfig{} - serverConf.AddHostKey(testSigners["rsa"]) - serverConf.PublicKeyCallback = func(c ssh.ConnMetadata, key ssh.PublicKey) (*ssh.Permissions, error) { - if bytes.Equal(key.Marshal(), testPublicKeys["rsa"].Marshal()) { - return nil, nil - } - - return nil, errors.New("pubkey rejected") - } - - go func() { - conn, _, _, err := ssh.NewServerConn(a, &serverConf) - if err != nil { - t.Fatalf("Server: %v", err) - } - conn.Close() - }() - - conf := ssh.ClientConfig{ - HostKeyCallback: ssh.InsecureIgnoreHostKey(), - } - conf.Auth = append(conf.Auth, ssh.PublicKeysCallback(agent.Signers)) - conn, _, _, err := ssh.NewClientConn(b, "", &conf) - if err != nil { - t.Fatalf("NewClientConn: %v", err) - } - conn.Close() -} - -func TestLockClient(t *testing.T) { - agent, _, cleanup := startAgent(t) - defer cleanup() - testLockAgent(agent, t) -} - -func testLockAgent(agent Agent, t *testing.T) { - if err := agent.Add(AddedKey{PrivateKey: testPrivateKeys["rsa"], Comment: "comment 1"}); err != nil { - t.Errorf("Add: %v", err) - } - if err := agent.Add(AddedKey{PrivateKey: testPrivateKeys["dsa"], Comment: "comment dsa"}); err != nil { - t.Errorf("Add: %v", err) - } - if keys, err := agent.List(); err != nil { - t.Errorf("List: %v", err) - } else if len(keys) != 2 { - t.Errorf("Want 2 keys, got %v", keys) - } - - passphrase := []byte("secret") - if err := agent.Lock(passphrase); err != nil { - t.Errorf("Lock: %v", err) - } - - if keys, err := agent.List(); err != nil { - t.Errorf("List: %v", err) - } else if len(keys) != 0 { - t.Errorf("Want 0 keys, got %v", keys) - } - - signer, _ := ssh.NewSignerFromKey(testPrivateKeys["rsa"]) - if _, err := agent.Sign(signer.PublicKey(), []byte("hello")); err == nil { - t.Fatalf("Sign did not fail") - } - - if err := agent.Remove(signer.PublicKey()); err == nil { - t.Fatalf("Remove did not fail") - } - - if err := agent.RemoveAll(); err == nil { - t.Fatalf("RemoveAll did not fail") - } - - if err := agent.Unlock(nil); err == nil { - t.Errorf("Unlock with wrong passphrase succeeded") - } - if err := agent.Unlock(passphrase); err != nil { - t.Errorf("Unlock: %v", err) - } - - if err := agent.Remove(signer.PublicKey()); err != nil { - t.Fatalf("Remove: %v", err) - } - - if keys, err := agent.List(); err != nil { - t.Errorf("List: %v", err) - } else if len(keys) != 1 { - t.Errorf("Want 1 keys, got %v", keys) - } -} - -func TestAgentLifetime(t *testing.T) { - agent, _, cleanup := startAgent(t) - defer cleanup() - - for _, keyType := range []string{"rsa", "dsa", "ecdsa"} { - // Add private keys to the agent. - err := agent.Add(AddedKey{ - PrivateKey: testPrivateKeys[keyType], - Comment: "comment", - LifetimeSecs: 1, - }) - if err != nil { - t.Fatalf("add: %v", err) - } - // Add certs to the agent. - cert := &ssh.Certificate{ - Key: testPublicKeys[keyType], - ValidBefore: ssh.CertTimeInfinity, - CertType: ssh.UserCert, - } - cert.SignCert(rand.Reader, testSigners[keyType]) - err = agent.Add(AddedKey{ - PrivateKey: testPrivateKeys[keyType], - Certificate: cert, - Comment: "comment", - LifetimeSecs: 1, - }) - if err != nil { - t.Fatalf("add: %v", err) - } - } - time.Sleep(1100 * time.Millisecond) - if keys, err := agent.List(); err != nil { - t.Errorf("List: %v", err) - } else if len(keys) != 0 { - t.Errorf("Want 0 keys, got %v", len(keys)) - } -} diff --git a/vendor/golang.org/x/crypto/ssh/agent/example_test.go b/vendor/golang.org/x/crypto/ssh/agent/example_test.go deleted file mode 100644 index 85562253e..000000000 --- a/vendor/golang.org/x/crypto/ssh/agent/example_test.go +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package agent_test - -import ( - "log" - "net" - "os" - - "golang.org/x/crypto/ssh" - "golang.org/x/crypto/ssh/agent" -) - -func ExampleClientAgent() { - // ssh-agent has a UNIX socket under $SSH_AUTH_SOCK - socket := os.Getenv("SSH_AUTH_SOCK") - conn, err := net.Dial("unix", socket) - if err != nil { - log.Fatalf("net.Dial: %v", err) - } - agentClient := agent.NewClient(conn) - config := &ssh.ClientConfig{ - User: "username", - Auth: []ssh.AuthMethod{ - // Use a callback rather than PublicKeys - // so we only consult the agent once the remote server - // wants it. - ssh.PublicKeysCallback(agentClient.Signers), - }, - HostKeyCallback: ssh.InsecureIgnoreHostKey(), - } - - sshc, err := ssh.Dial("tcp", "localhost:22", config) - if err != nil { - log.Fatalf("Dial: %v", err) - } - // .. use sshc - sshc.Close() -} diff --git a/vendor/golang.org/x/crypto/ssh/agent/forward.go b/vendor/golang.org/x/crypto/ssh/agent/forward.go deleted file mode 100644 index fd24ba900..000000000 --- a/vendor/golang.org/x/crypto/ssh/agent/forward.go +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package agent - -import ( - "errors" - "io" - "net" - "sync" - - "golang.org/x/crypto/ssh" -) - -// RequestAgentForwarding sets up agent forwarding for the session. -// ForwardToAgent or ForwardToRemote should be called to route -// the authentication requests. -func RequestAgentForwarding(session *ssh.Session) error { - ok, err := session.SendRequest("auth-agent-req@openssh.com", true, nil) - if err != nil { - return err - } - if !ok { - return errors.New("forwarding request denied") - } - return nil -} - -// ForwardToAgent routes authentication requests to the given keyring. -func ForwardToAgent(client *ssh.Client, keyring Agent) error { - channels := client.HandleChannelOpen(channelType) - if channels == nil { - return errors.New("agent: already have handler for " + channelType) - } - - go func() { - for ch := range channels { - channel, reqs, err := ch.Accept() - if err != nil { - continue - } - go ssh.DiscardRequests(reqs) - go func() { - ServeAgent(keyring, channel) - channel.Close() - }() - } - }() - return nil -} - -const channelType = "auth-agent@openssh.com" - -// ForwardToRemote routes authentication requests to the ssh-agent -// process serving on the given unix socket. -func ForwardToRemote(client *ssh.Client, addr string) error { - channels := client.HandleChannelOpen(channelType) - if channels == nil { - return errors.New("agent: already have handler for " + channelType) - } - conn, err := net.Dial("unix", addr) - if err != nil { - return err - } - conn.Close() - - go func() { - for ch := range channels { - channel, reqs, err := ch.Accept() - if err != nil { - continue - } - go ssh.DiscardRequests(reqs) - go forwardUnixSocket(channel, addr) - } - }() - return nil -} - -func forwardUnixSocket(channel ssh.Channel, addr string) { - conn, err := net.Dial("unix", addr) - if err != nil { - return - } - - var wg sync.WaitGroup - wg.Add(2) - go func() { - io.Copy(conn, channel) - conn.(*net.UnixConn).CloseWrite() - wg.Done() - }() - go func() { - io.Copy(channel, conn) - channel.CloseWrite() - wg.Done() - }() - - wg.Wait() - conn.Close() - channel.Close() -} diff --git a/vendor/golang.org/x/crypto/ssh/agent/keyring.go b/vendor/golang.org/x/crypto/ssh/agent/keyring.go deleted file mode 100644 index a6ba06ab3..000000000 --- a/vendor/golang.org/x/crypto/ssh/agent/keyring.go +++ /dev/null @@ -1,215 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package agent - -import ( - "bytes" - "crypto/rand" - "crypto/subtle" - "errors" - "fmt" - "sync" - "time" - - "golang.org/x/crypto/ssh" -) - -type privKey struct { - signer ssh.Signer - comment string - expire *time.Time -} - -type keyring struct { - mu sync.Mutex - keys []privKey - - locked bool - passphrase []byte -} - -var errLocked = errors.New("agent: locked") - -// NewKeyring returns an Agent that holds keys in memory. It is safe -// for concurrent use by multiple goroutines. -func NewKeyring() Agent { - return &keyring{} -} - -// RemoveAll removes all identities. -func (r *keyring) RemoveAll() error { - r.mu.Lock() - defer r.mu.Unlock() - if r.locked { - return errLocked - } - - r.keys = nil - return nil -} - -// removeLocked does the actual key removal. The caller must already be holding the -// keyring mutex. -func (r *keyring) removeLocked(want []byte) error { - found := false - for i := 0; i < len(r.keys); { - if bytes.Equal(r.keys[i].signer.PublicKey().Marshal(), want) { - found = true - r.keys[i] = r.keys[len(r.keys)-1] - r.keys = r.keys[:len(r.keys)-1] - continue - } else { - i++ - } - } - - if !found { - return errors.New("agent: key not found") - } - return nil -} - -// Remove removes all identities with the given public key. -func (r *keyring) Remove(key ssh.PublicKey) error { - r.mu.Lock() - defer r.mu.Unlock() - if r.locked { - return errLocked - } - - return r.removeLocked(key.Marshal()) -} - -// Lock locks the agent. Sign and Remove will fail, and List will return an empty list. -func (r *keyring) Lock(passphrase []byte) error { - r.mu.Lock() - defer r.mu.Unlock() - if r.locked { - return errLocked - } - - r.locked = true - r.passphrase = passphrase - return nil -} - -// Unlock undoes the effect of Lock -func (r *keyring) Unlock(passphrase []byte) error { - r.mu.Lock() - defer r.mu.Unlock() - if !r.locked { - return errors.New("agent: not locked") - } - if len(passphrase) != len(r.passphrase) || 1 != subtle.ConstantTimeCompare(passphrase, r.passphrase) { - return fmt.Errorf("agent: incorrect passphrase") - } - - r.locked = false - r.passphrase = nil - return nil -} - -// expireKeysLocked removes expired keys from the keyring. If a key was added -// with a lifetimesecs contraint and seconds >= lifetimesecs seconds have -// ellapsed, it is removed. The caller *must* be holding the keyring mutex. -func (r *keyring) expireKeysLocked() { - for _, k := range r.keys { - if k.expire != nil && time.Now().After(*k.expire) { - r.removeLocked(k.signer.PublicKey().Marshal()) - } - } -} - -// List returns the identities known to the agent. -func (r *keyring) List() ([]*Key, error) { - r.mu.Lock() - defer r.mu.Unlock() - if r.locked { - // section 2.7: locked agents return empty. - return nil, nil - } - - r.expireKeysLocked() - var ids []*Key - for _, k := range r.keys { - pub := k.signer.PublicKey() - ids = append(ids, &Key{ - Format: pub.Type(), - Blob: pub.Marshal(), - Comment: k.comment}) - } - return ids, nil -} - -// Insert adds a private key to the keyring. If a certificate -// is given, that certificate is added as public key. Note that -// any constraints given are ignored. -func (r *keyring) Add(key AddedKey) error { - r.mu.Lock() - defer r.mu.Unlock() - if r.locked { - return errLocked - } - signer, err := ssh.NewSignerFromKey(key.PrivateKey) - - if err != nil { - return err - } - - if cert := key.Certificate; cert != nil { - signer, err = ssh.NewCertSigner(cert, signer) - if err != nil { - return err - } - } - - p := privKey{ - signer: signer, - comment: key.Comment, - } - - if key.LifetimeSecs > 0 { - t := time.Now().Add(time.Duration(key.LifetimeSecs) * time.Second) - p.expire = &t - } - - r.keys = append(r.keys, p) - - return nil -} - -// Sign returns a signature for the data. -func (r *keyring) Sign(key ssh.PublicKey, data []byte) (*ssh.Signature, error) { - r.mu.Lock() - defer r.mu.Unlock() - if r.locked { - return nil, errLocked - } - - r.expireKeysLocked() - wanted := key.Marshal() - for _, k := range r.keys { - if bytes.Equal(k.signer.PublicKey().Marshal(), wanted) { - return k.signer.Sign(rand.Reader, data) - } - } - return nil, errors.New("not found") -} - -// Signers returns signers for all the known keys. -func (r *keyring) Signers() ([]ssh.Signer, error) { - r.mu.Lock() - defer r.mu.Unlock() - if r.locked { - return nil, errLocked - } - - r.expireKeysLocked() - s := make([]ssh.Signer, 0, len(r.keys)) - for _, k := range r.keys { - s = append(s, k.signer) - } - return s, nil -} diff --git a/vendor/golang.org/x/crypto/ssh/agent/keyring_test.go b/vendor/golang.org/x/crypto/ssh/agent/keyring_test.go deleted file mode 100644 index e5d50e7e0..000000000 --- a/vendor/golang.org/x/crypto/ssh/agent/keyring_test.go +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package agent - -import "testing" - -func addTestKey(t *testing.T, a Agent, keyName string) { - err := a.Add(AddedKey{ - PrivateKey: testPrivateKeys[keyName], - Comment: keyName, - }) - if err != nil { - t.Fatalf("failed to add key %q: %v", keyName, err) - } -} - -func removeTestKey(t *testing.T, a Agent, keyName string) { - err := a.Remove(testPublicKeys[keyName]) - if err != nil { - t.Fatalf("failed to remove key %q: %v", keyName, err) - } -} - -func validateListedKeys(t *testing.T, a Agent, expectedKeys []string) { - listedKeys, err := a.List() - if err != nil { - t.Fatalf("failed to list keys: %v", err) - return - } - actualKeys := make(map[string]bool) - for _, key := range listedKeys { - actualKeys[key.Comment] = true - } - - matchedKeys := make(map[string]bool) - for _, expectedKey := range expectedKeys { - if !actualKeys[expectedKey] { - t.Fatalf("expected key %q, but was not found", expectedKey) - } else { - matchedKeys[expectedKey] = true - } - } - - for actualKey := range actualKeys { - if !matchedKeys[actualKey] { - t.Fatalf("key %q was found, but was not expected", actualKey) - } - } -} - -func TestKeyringAddingAndRemoving(t *testing.T) { - keyNames := []string{"dsa", "ecdsa", "rsa", "user"} - - // add all test private keys - k := NewKeyring() - for _, keyName := range keyNames { - addTestKey(t, k, keyName) - } - validateListedKeys(t, k, keyNames) - - // remove a key in the middle - keyToRemove := keyNames[1] - keyNames = append(keyNames[:1], keyNames[2:]...) - - removeTestKey(t, k, keyToRemove) - validateListedKeys(t, k, keyNames) - - // remove all keys - err := k.RemoveAll() - if err != nil { - t.Fatalf("failed to remove all keys: %v", err) - } - validateListedKeys(t, k, []string{}) -} diff --git a/vendor/golang.org/x/crypto/ssh/agent/server.go b/vendor/golang.org/x/crypto/ssh/agent/server.go deleted file mode 100644 index 68a333fa5..000000000 --- a/vendor/golang.org/x/crypto/ssh/agent/server.go +++ /dev/null @@ -1,451 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package agent - -import ( - "crypto/dsa" - "crypto/ecdsa" - "crypto/elliptic" - "crypto/rsa" - "encoding/binary" - "errors" - "fmt" - "io" - "log" - "math/big" - - "golang.org/x/crypto/ed25519" - "golang.org/x/crypto/ssh" -) - -// Server wraps an Agent and uses it to implement the agent side of -// the SSH-agent, wire protocol. -type server struct { - agent Agent -} - -func (s *server) processRequestBytes(reqData []byte) []byte { - rep, err := s.processRequest(reqData) - if err != nil { - if err != errLocked { - // TODO(hanwen): provide better logging interface? - log.Printf("agent %d: %v", reqData[0], err) - } - return []byte{agentFailure} - } - - if err == nil && rep == nil { - return []byte{agentSuccess} - } - - return ssh.Marshal(rep) -} - -func marshalKey(k *Key) []byte { - var record struct { - Blob []byte - Comment string - } - record.Blob = k.Marshal() - record.Comment = k.Comment - - return ssh.Marshal(&record) -} - -// See [PROTOCOL.agent], section 2.5.1. -const agentV1IdentitiesAnswer = 2 - -type agentV1IdentityMsg struct { - Numkeys uint32 `sshtype:"2"` -} - -type agentRemoveIdentityMsg struct { - KeyBlob []byte `sshtype:"18"` -} - -type agentLockMsg struct { - Passphrase []byte `sshtype:"22"` -} - -type agentUnlockMsg struct { - Passphrase []byte `sshtype:"23"` -} - -func (s *server) processRequest(data []byte) (interface{}, error) { - switch data[0] { - case agentRequestV1Identities: - return &agentV1IdentityMsg{0}, nil - - case agentRemoveAllV1Identities: - return nil, nil - - case agentRemoveIdentity: - var req agentRemoveIdentityMsg - if err := ssh.Unmarshal(data, &req); err != nil { - return nil, err - } - - var wk wireKey - if err := ssh.Unmarshal(req.KeyBlob, &wk); err != nil { - return nil, err - } - - return nil, s.agent.Remove(&Key{Format: wk.Format, Blob: req.KeyBlob}) - - case agentRemoveAllIdentities: - return nil, s.agent.RemoveAll() - - case agentLock: - var req agentLockMsg - if err := ssh.Unmarshal(data, &req); err != nil { - return nil, err - } - - return nil, s.agent.Lock(req.Passphrase) - - case agentUnlock: - var req agentLockMsg - if err := ssh.Unmarshal(data, &req); err != nil { - return nil, err - } - return nil, s.agent.Unlock(req.Passphrase) - - case agentSignRequest: - var req signRequestAgentMsg - if err := ssh.Unmarshal(data, &req); err != nil { - return nil, err - } - - var wk wireKey - if err := ssh.Unmarshal(req.KeyBlob, &wk); err != nil { - return nil, err - } - - k := &Key{ - Format: wk.Format, - Blob: req.KeyBlob, - } - - sig, err := s.agent.Sign(k, req.Data) // TODO(hanwen): flags. - if err != nil { - return nil, err - } - return &signResponseAgentMsg{SigBlob: ssh.Marshal(sig)}, nil - - case agentRequestIdentities: - keys, err := s.agent.List() - if err != nil { - return nil, err - } - - rep := identitiesAnswerAgentMsg{ - NumKeys: uint32(len(keys)), - } - for _, k := range keys { - rep.Keys = append(rep.Keys, marshalKey(k)...) - } - return rep, nil - - case agentAddIdConstrained, agentAddIdentity: - return nil, s.insertIdentity(data) - } - - return nil, fmt.Errorf("unknown opcode %d", data[0]) -} - -func parseRSAKey(req []byte) (*AddedKey, error) { - var k rsaKeyMsg - if err := ssh.Unmarshal(req, &k); err != nil { - return nil, err - } - if k.E.BitLen() > 30 { - return nil, errors.New("agent: RSA public exponent too large") - } - priv := &rsa.PrivateKey{ - PublicKey: rsa.PublicKey{ - E: int(k.E.Int64()), - N: k.N, - }, - D: k.D, - Primes: []*big.Int{k.P, k.Q}, - } - priv.Precompute() - - return &AddedKey{PrivateKey: priv, Comment: k.Comments}, nil -} - -func parseEd25519Key(req []byte) (*AddedKey, error) { - var k ed25519KeyMsg - if err := ssh.Unmarshal(req, &k); err != nil { - return nil, err - } - priv := ed25519.PrivateKey(k.Priv) - return &AddedKey{PrivateKey: &priv, Comment: k.Comments}, nil -} - -func parseDSAKey(req []byte) (*AddedKey, error) { - var k dsaKeyMsg - if err := ssh.Unmarshal(req, &k); err != nil { - return nil, err - } - priv := &dsa.PrivateKey{ - PublicKey: dsa.PublicKey{ - Parameters: dsa.Parameters{ - P: k.P, - Q: k.Q, - G: k.G, - }, - Y: k.Y, - }, - X: k.X, - } - - return &AddedKey{PrivateKey: priv, Comment: k.Comments}, nil -} - -func unmarshalECDSA(curveName string, keyBytes []byte, privScalar *big.Int) (priv *ecdsa.PrivateKey, err error) { - priv = &ecdsa.PrivateKey{ - D: privScalar, - } - - switch curveName { - case "nistp256": - priv.Curve = elliptic.P256() - case "nistp384": - priv.Curve = elliptic.P384() - case "nistp521": - priv.Curve = elliptic.P521() - default: - return nil, fmt.Errorf("agent: unknown curve %q", curveName) - } - - priv.X, priv.Y = elliptic.Unmarshal(priv.Curve, keyBytes) - if priv.X == nil || priv.Y == nil { - return nil, errors.New("agent: point not on curve") - } - - return priv, nil -} - -func parseEd25519Cert(req []byte) (*AddedKey, error) { - var k ed25519CertMsg - if err := ssh.Unmarshal(req, &k); err != nil { - return nil, err - } - pubKey, err := ssh.ParsePublicKey(k.CertBytes) - if err != nil { - return nil, err - } - priv := ed25519.PrivateKey(k.Priv) - cert, ok := pubKey.(*ssh.Certificate) - if !ok { - return nil, errors.New("agent: bad ED25519 certificate") - } - return &AddedKey{PrivateKey: &priv, Certificate: cert, Comment: k.Comments}, nil -} - -func parseECDSAKey(req []byte) (*AddedKey, error) { - var k ecdsaKeyMsg - if err := ssh.Unmarshal(req, &k); err != nil { - return nil, err - } - - priv, err := unmarshalECDSA(k.Curve, k.KeyBytes, k.D) - if err != nil { - return nil, err - } - - return &AddedKey{PrivateKey: priv, Comment: k.Comments}, nil -} - -func parseRSACert(req []byte) (*AddedKey, error) { - var k rsaCertMsg - if err := ssh.Unmarshal(req, &k); err != nil { - return nil, err - } - - pubKey, err := ssh.ParsePublicKey(k.CertBytes) - if err != nil { - return nil, err - } - - cert, ok := pubKey.(*ssh.Certificate) - if !ok { - return nil, errors.New("agent: bad RSA certificate") - } - - // An RSA publickey as marshaled by rsaPublicKey.Marshal() in keys.go - var rsaPub struct { - Name string - E *big.Int - N *big.Int - } - if err := ssh.Unmarshal(cert.Key.Marshal(), &rsaPub); err != nil { - return nil, fmt.Errorf("agent: Unmarshal failed to parse public key: %v", err) - } - - if rsaPub.E.BitLen() > 30 { - return nil, errors.New("agent: RSA public exponent too large") - } - - priv := rsa.PrivateKey{ - PublicKey: rsa.PublicKey{ - E: int(rsaPub.E.Int64()), - N: rsaPub.N, - }, - D: k.D, - Primes: []*big.Int{k.Q, k.P}, - } - priv.Precompute() - - return &AddedKey{PrivateKey: &priv, Certificate: cert, Comment: k.Comments}, nil -} - -func parseDSACert(req []byte) (*AddedKey, error) { - var k dsaCertMsg - if err := ssh.Unmarshal(req, &k); err != nil { - return nil, err - } - pubKey, err := ssh.ParsePublicKey(k.CertBytes) - if err != nil { - return nil, err - } - cert, ok := pubKey.(*ssh.Certificate) - if !ok { - return nil, errors.New("agent: bad DSA certificate") - } - - // A DSA publickey as marshaled by dsaPublicKey.Marshal() in keys.go - var w struct { - Name string - P, Q, G, Y *big.Int - } - if err := ssh.Unmarshal(cert.Key.Marshal(), &w); err != nil { - return nil, fmt.Errorf("agent: Unmarshal failed to parse public key: %v", err) - } - - priv := &dsa.PrivateKey{ - PublicKey: dsa.PublicKey{ - Parameters: dsa.Parameters{ - P: w.P, - Q: w.Q, - G: w.G, - }, - Y: w.Y, - }, - X: k.X, - } - - return &AddedKey{PrivateKey: priv, Certificate: cert, Comment: k.Comments}, nil -} - -func parseECDSACert(req []byte) (*AddedKey, error) { - var k ecdsaCertMsg - if err := ssh.Unmarshal(req, &k); err != nil { - return nil, err - } - - pubKey, err := ssh.ParsePublicKey(k.CertBytes) - if err != nil { - return nil, err - } - cert, ok := pubKey.(*ssh.Certificate) - if !ok { - return nil, errors.New("agent: bad ECDSA certificate") - } - - // An ECDSA publickey as marshaled by ecdsaPublicKey.Marshal() in keys.go - var ecdsaPub struct { - Name string - ID string - Key []byte - } - if err := ssh.Unmarshal(cert.Key.Marshal(), &ecdsaPub); err != nil { - return nil, err - } - - priv, err := unmarshalECDSA(ecdsaPub.ID, ecdsaPub.Key, k.D) - if err != nil { - return nil, err - } - - return &AddedKey{PrivateKey: priv, Certificate: cert, Comment: k.Comments}, nil -} - -func (s *server) insertIdentity(req []byte) error { - var record struct { - Type string `sshtype:"17|25"` - Rest []byte `ssh:"rest"` - } - - if err := ssh.Unmarshal(req, &record); err != nil { - return err - } - - var addedKey *AddedKey - var err error - - switch record.Type { - case ssh.KeyAlgoRSA: - addedKey, err = parseRSAKey(req) - case ssh.KeyAlgoDSA: - addedKey, err = parseDSAKey(req) - case ssh.KeyAlgoECDSA256, ssh.KeyAlgoECDSA384, ssh.KeyAlgoECDSA521: - addedKey, err = parseECDSAKey(req) - case ssh.KeyAlgoED25519: - addedKey, err = parseEd25519Key(req) - case ssh.CertAlgoRSAv01: - addedKey, err = parseRSACert(req) - case ssh.CertAlgoDSAv01: - addedKey, err = parseDSACert(req) - case ssh.CertAlgoECDSA256v01, ssh.CertAlgoECDSA384v01, ssh.CertAlgoECDSA521v01: - addedKey, err = parseECDSACert(req) - case ssh.CertAlgoED25519v01: - addedKey, err = parseEd25519Cert(req) - default: - return fmt.Errorf("agent: not implemented: %q", record.Type) - } - - if err != nil { - return err - } - return s.agent.Add(*addedKey) -} - -// ServeAgent serves the agent protocol on the given connection. It -// returns when an I/O error occurs. -func ServeAgent(agent Agent, c io.ReadWriter) error { - s := &server{agent} - - var length [4]byte - for { - if _, err := io.ReadFull(c, length[:]); err != nil { - return err - } - l := binary.BigEndian.Uint32(length[:]) - if l > maxAgentResponseBytes { - // We also cap requests. - return fmt.Errorf("agent: request too large: %d", l) - } - - req := make([]byte, l) - if _, err := io.ReadFull(c, req); err != nil { - return err - } - - repData := s.processRequestBytes(req) - if len(repData) > maxAgentResponseBytes { - return fmt.Errorf("agent: reply too large: %d bytes", len(repData)) - } - - binary.BigEndian.PutUint32(length[:], uint32(len(repData))) - if _, err := c.Write(length[:]); err != nil { - return err - } - if _, err := c.Write(repData); err != nil { - return err - } - } -} diff --git a/vendor/golang.org/x/crypto/ssh/agent/server_test.go b/vendor/golang.org/x/crypto/ssh/agent/server_test.go deleted file mode 100644 index 6b0837d94..000000000 --- a/vendor/golang.org/x/crypto/ssh/agent/server_test.go +++ /dev/null @@ -1,209 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package agent - -import ( - "crypto" - "crypto/rand" - "fmt" - "testing" - - "golang.org/x/crypto/ssh" -) - -func TestServer(t *testing.T) { - c1, c2, err := netPipe() - if err != nil { - t.Fatalf("netPipe: %v", err) - } - defer c1.Close() - defer c2.Close() - client := NewClient(c1) - - go ServeAgent(NewKeyring(), c2) - - testAgentInterface(t, client, testPrivateKeys["rsa"], nil, 0) -} - -func TestLockServer(t *testing.T) { - testLockAgent(NewKeyring(), t) -} - -func TestSetupForwardAgent(t *testing.T) { - a, b, err := netPipe() - if err != nil { - t.Fatalf("netPipe: %v", err) - } - - defer a.Close() - defer b.Close() - - _, socket, cleanup := startAgent(t) - defer cleanup() - - serverConf := ssh.ServerConfig{ - NoClientAuth: true, - } - serverConf.AddHostKey(testSigners["rsa"]) - incoming := make(chan *ssh.ServerConn, 1) - go func() { - conn, _, _, err := ssh.NewServerConn(a, &serverConf) - if err != nil { - t.Fatalf("Server: %v", err) - } - incoming <- conn - }() - - conf := ssh.ClientConfig{ - HostKeyCallback: ssh.InsecureIgnoreHostKey(), - } - conn, chans, reqs, err := ssh.NewClientConn(b, "", &conf) - if err != nil { - t.Fatalf("NewClientConn: %v", err) - } - client := ssh.NewClient(conn, chans, reqs) - - if err := ForwardToRemote(client, socket); err != nil { - t.Fatalf("SetupForwardAgent: %v", err) - } - - server := <-incoming - ch, reqs, err := server.OpenChannel(channelType, nil) - if err != nil { - t.Fatalf("OpenChannel(%q): %v", channelType, err) - } - go ssh.DiscardRequests(reqs) - - agentClient := NewClient(ch) - testAgentInterface(t, agentClient, testPrivateKeys["rsa"], nil, 0) - conn.Close() -} - -func TestV1ProtocolMessages(t *testing.T) { - c1, c2, err := netPipe() - if err != nil { - t.Fatalf("netPipe: %v", err) - } - defer c1.Close() - defer c2.Close() - c := NewClient(c1) - - go ServeAgent(NewKeyring(), c2) - - testV1ProtocolMessages(t, c.(*client)) -} - -func testV1ProtocolMessages(t *testing.T, c *client) { - reply, err := c.call([]byte{agentRequestV1Identities}) - if err != nil { - t.Fatalf("v1 request all failed: %v", err) - } - if msg, ok := reply.(*agentV1IdentityMsg); !ok || msg.Numkeys != 0 { - t.Fatalf("invalid request all response: %#v", reply) - } - - reply, err = c.call([]byte{agentRemoveAllV1Identities}) - if err != nil { - t.Fatalf("v1 remove all failed: %v", err) - } - if _, ok := reply.(*successAgentMsg); !ok { - t.Fatalf("invalid remove all response: %#v", reply) - } -} - -func verifyKey(sshAgent Agent) error { - keys, err := sshAgent.List() - if err != nil { - return fmt.Errorf("listing keys: %v", err) - } - - if len(keys) != 1 { - return fmt.Errorf("bad number of keys found. expected 1, got %d", len(keys)) - } - - buf := make([]byte, 128) - if _, err := rand.Read(buf); err != nil { - return fmt.Errorf("rand: %v", err) - } - - sig, err := sshAgent.Sign(keys[0], buf) - if err != nil { - return fmt.Errorf("sign: %v", err) - } - - if err := keys[0].Verify(buf, sig); err != nil { - return fmt.Errorf("verify: %v", err) - } - return nil -} - -func addKeyToAgent(key crypto.PrivateKey) error { - sshAgent := NewKeyring() - if err := sshAgent.Add(AddedKey{PrivateKey: key}); err != nil { - return fmt.Errorf("add: %v", err) - } - return verifyKey(sshAgent) -} - -func TestKeyTypes(t *testing.T) { - for k, v := range testPrivateKeys { - if err := addKeyToAgent(v); err != nil { - t.Errorf("error adding key type %s, %v", k, err) - } - if err := addCertToAgentSock(v, nil); err != nil { - t.Errorf("error adding key type %s, %v", k, err) - } - } -} - -func addCertToAgentSock(key crypto.PrivateKey, cert *ssh.Certificate) error { - a, b, err := netPipe() - if err != nil { - return err - } - agentServer := NewKeyring() - go ServeAgent(agentServer, a) - - agentClient := NewClient(b) - if err := agentClient.Add(AddedKey{PrivateKey: key, Certificate: cert}); err != nil { - return fmt.Errorf("add: %v", err) - } - return verifyKey(agentClient) -} - -func addCertToAgent(key crypto.PrivateKey, cert *ssh.Certificate) error { - sshAgent := NewKeyring() - if err := sshAgent.Add(AddedKey{PrivateKey: key, Certificate: cert}); err != nil { - return fmt.Errorf("add: %v", err) - } - return verifyKey(sshAgent) -} - -func TestCertTypes(t *testing.T) { - for keyType, key := range testPublicKeys { - cert := &ssh.Certificate{ - ValidPrincipals: []string{"gopher1"}, - ValidAfter: 0, - ValidBefore: ssh.CertTimeInfinity, - Key: key, - Serial: 1, - CertType: ssh.UserCert, - SignatureKey: testPublicKeys["rsa"], - Permissions: ssh.Permissions{ - CriticalOptions: map[string]string{}, - Extensions: map[string]string{}, - }, - } - if err := cert.SignCert(rand.Reader, testSigners["rsa"]); err != nil { - t.Fatalf("signcert: %v", err) - } - if err := addCertToAgent(testPrivateKeys[keyType], cert); err != nil { - t.Fatalf("%v", err) - } - if err := addCertToAgentSock(testPrivateKeys[keyType], cert); err != nil { - t.Fatalf("%v", err) - } - } -} diff --git a/vendor/golang.org/x/crypto/ssh/agent/testdata_test.go b/vendor/golang.org/x/crypto/ssh/agent/testdata_test.go deleted file mode 100644 index cc42a87cb..000000000 --- a/vendor/golang.org/x/crypto/ssh/agent/testdata_test.go +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// IMPLEMENTATION NOTE: To avoid a package loop, this file is in three places: -// ssh/, ssh/agent, and ssh/test/. It should be kept in sync across all three -// instances. - -package agent - -import ( - "crypto/rand" - "fmt" - - "golang.org/x/crypto/ssh" - "golang.org/x/crypto/ssh/testdata" -) - -var ( - testPrivateKeys map[string]interface{} - testSigners map[string]ssh.Signer - testPublicKeys map[string]ssh.PublicKey -) - -func init() { - var err error - - n := len(testdata.PEMBytes) - testPrivateKeys = make(map[string]interface{}, n) - testSigners = make(map[string]ssh.Signer, n) - testPublicKeys = make(map[string]ssh.PublicKey, n) - for t, k := range testdata.PEMBytes { - testPrivateKeys[t], err = ssh.ParseRawPrivateKey(k) - if err != nil { - panic(fmt.Sprintf("Unable to parse test key %s: %v", t, err)) - } - testSigners[t], err = ssh.NewSignerFromKey(testPrivateKeys[t]) - if err != nil { - panic(fmt.Sprintf("Unable to create signer for test key %s: %v", t, err)) - } - testPublicKeys[t] = testSigners[t].PublicKey() - } - - // Create a cert and sign it for use in tests. - testCert := &ssh.Certificate{ - Nonce: []byte{}, // To pass reflect.DeepEqual after marshal & parse, this must be non-nil - ValidPrincipals: []string{"gopher1", "gopher2"}, // increases test coverage - ValidAfter: 0, // unix epoch - ValidBefore: ssh.CertTimeInfinity, // The end of currently representable time. - Reserved: []byte{}, // To pass reflect.DeepEqual after marshal & parse, this must be non-nil - Key: testPublicKeys["ecdsa"], - SignatureKey: testPublicKeys["rsa"], - Permissions: ssh.Permissions{ - CriticalOptions: map[string]string{}, - Extensions: map[string]string{}, - }, - } - testCert.SignCert(rand.Reader, testSigners["rsa"]) - testPrivateKeys["cert"] = testPrivateKeys["ecdsa"] - testSigners["cert"], err = ssh.NewCertSigner(testCert, testSigners["ecdsa"]) - if err != nil { - panic(fmt.Sprintf("Unable to create certificate signer: %v", err)) - } -} diff --git a/vendor/golang.org/x/crypto/ssh/benchmark_test.go b/vendor/golang.org/x/crypto/ssh/benchmark_test.go deleted file mode 100644 index d9f7eb9b6..000000000 --- a/vendor/golang.org/x/crypto/ssh/benchmark_test.go +++ /dev/null @@ -1,122 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssh - -import ( - "errors" - "io" - "net" - "testing" -) - -type server struct { - *ServerConn - chans <-chan NewChannel -} - -func newServer(c net.Conn, conf *ServerConfig) (*server, error) { - sconn, chans, reqs, err := NewServerConn(c, conf) - if err != nil { - return nil, err - } - go DiscardRequests(reqs) - return &server{sconn, chans}, nil -} - -func (s *server) Accept() (NewChannel, error) { - n, ok := <-s.chans - if !ok { - return nil, io.EOF - } - return n, nil -} - -func sshPipe() (Conn, *server, error) { - c1, c2, err := netPipe() - if err != nil { - return nil, nil, err - } - - clientConf := ClientConfig{ - User: "user", - } - serverConf := ServerConfig{ - NoClientAuth: true, - } - serverConf.AddHostKey(testSigners["ecdsa"]) - done := make(chan *server, 1) - go func() { - server, err := newServer(c2, &serverConf) - if err != nil { - done <- nil - } - done <- server - }() - - client, _, reqs, err := NewClientConn(c1, "", &clientConf) - if err != nil { - return nil, nil, err - } - - server := <-done - if server == nil { - return nil, nil, errors.New("server handshake failed.") - } - go DiscardRequests(reqs) - - return client, server, nil -} - -func BenchmarkEndToEnd(b *testing.B) { - b.StopTimer() - - client, server, err := sshPipe() - if err != nil { - b.Fatalf("sshPipe: %v", err) - } - - defer client.Close() - defer server.Close() - - size := (1 << 20) - input := make([]byte, size) - output := make([]byte, size) - b.SetBytes(int64(size)) - done := make(chan int, 1) - - go func() { - newCh, err := server.Accept() - if err != nil { - b.Fatalf("Client: %v", err) - } - ch, incoming, err := newCh.Accept() - go DiscardRequests(incoming) - for i := 0; i < b.N; i++ { - if _, err := io.ReadFull(ch, output); err != nil { - b.Fatalf("ReadFull: %v", err) - } - } - ch.Close() - done <- 1 - }() - - ch, in, err := client.OpenChannel("speed", nil) - if err != nil { - b.Fatalf("OpenChannel: %v", err) - } - go DiscardRequests(in) - - b.ResetTimer() - b.StartTimer() - for i := 0; i < b.N; i++ { - if _, err := ch.Write(input); err != nil { - b.Fatalf("WriteFull: %v", err) - } - } - ch.Close() - b.StopTimer() - - <-done -} diff --git a/vendor/golang.org/x/crypto/ssh/buffer.go b/vendor/golang.org/x/crypto/ssh/buffer.go deleted file mode 100644 index 6931b5114..000000000 --- a/vendor/golang.org/x/crypto/ssh/buffer.go +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssh - -import ( - "io" - "sync" -) - -// buffer provides a linked list buffer for data exchange -// between producer and consumer. Theoretically the buffer is -// of unlimited capacity as it does no allocation of its own. -type buffer struct { - // protects concurrent access to head, tail and closed - *sync.Cond - - head *element // the buffer that will be read first - tail *element // the buffer that will be read last - - closed bool -} - -// An element represents a single link in a linked list. -type element struct { - buf []byte - next *element -} - -// newBuffer returns an empty buffer that is not closed. -func newBuffer() *buffer { - e := new(element) - b := &buffer{ - Cond: newCond(), - head: e, - tail: e, - } - return b -} - -// write makes buf available for Read to receive. -// buf must not be modified after the call to write. -func (b *buffer) write(buf []byte) { - b.Cond.L.Lock() - e := &element{buf: buf} - b.tail.next = e - b.tail = e - b.Cond.Signal() - b.Cond.L.Unlock() -} - -// eof closes the buffer. Reads from the buffer once all -// the data has been consumed will receive os.EOF. -func (b *buffer) eof() error { - b.Cond.L.Lock() - b.closed = true - b.Cond.Signal() - b.Cond.L.Unlock() - return nil -} - -// Read reads data from the internal buffer in buf. Reads will block -// if no data is available, or until the buffer is closed. -func (b *buffer) Read(buf []byte) (n int, err error) { - b.Cond.L.Lock() - defer b.Cond.L.Unlock() - - for len(buf) > 0 { - // if there is data in b.head, copy it - if len(b.head.buf) > 0 { - r := copy(buf, b.head.buf) - buf, b.head.buf = buf[r:], b.head.buf[r:] - n += r - continue - } - // if there is a next buffer, make it the head - if len(b.head.buf) == 0 && b.head != b.tail { - b.head = b.head.next - continue - } - - // if at least one byte has been copied, return - if n > 0 { - break - } - - // if nothing was read, and there is nothing outstanding - // check to see if the buffer is closed. - if b.closed { - err = io.EOF - break - } - // out of buffers, wait for producer - b.Cond.Wait() - } - return -} diff --git a/vendor/golang.org/x/crypto/ssh/buffer_test.go b/vendor/golang.org/x/crypto/ssh/buffer_test.go deleted file mode 100644 index d5781cb3d..000000000 --- a/vendor/golang.org/x/crypto/ssh/buffer_test.go +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssh - -import ( - "io" - "testing" -) - -var alphabet = []byte("abcdefghijklmnopqrstuvwxyz") - -func TestBufferReadwrite(t *testing.T) { - b := newBuffer() - b.write(alphabet[:10]) - r, _ := b.Read(make([]byte, 10)) - if r != 10 { - t.Fatalf("Expected written == read == 10, written: 10, read %d", r) - } - - b = newBuffer() - b.write(alphabet[:5]) - r, _ = b.Read(make([]byte, 10)) - if r != 5 { - t.Fatalf("Expected written == read == 5, written: 5, read %d", r) - } - - b = newBuffer() - b.write(alphabet[:10]) - r, _ = b.Read(make([]byte, 5)) - if r != 5 { - t.Fatalf("Expected written == 10, read == 5, written: 10, read %d", r) - } - - b = newBuffer() - b.write(alphabet[:5]) - b.write(alphabet[5:15]) - r, _ = b.Read(make([]byte, 10)) - r2, _ := b.Read(make([]byte, 10)) - if r != 10 || r2 != 5 || 15 != r+r2 { - t.Fatal("Expected written == read == 15") - } -} - -func TestBufferClose(t *testing.T) { - b := newBuffer() - b.write(alphabet[:10]) - b.eof() - _, err := b.Read(make([]byte, 5)) - if err != nil { - t.Fatal("expected read of 5 to not return EOF") - } - b = newBuffer() - b.write(alphabet[:10]) - b.eof() - r, err := b.Read(make([]byte, 5)) - r2, err2 := b.Read(make([]byte, 10)) - if r != 5 || r2 != 5 || err != nil || err2 != nil { - t.Fatal("expected reads of 5 and 5") - } - - b = newBuffer() - b.write(alphabet[:10]) - b.eof() - r, err = b.Read(make([]byte, 5)) - r2, err2 = b.Read(make([]byte, 10)) - r3, err3 := b.Read(make([]byte, 10)) - if r != 5 || r2 != 5 || r3 != 0 || err != nil || err2 != nil || err3 != io.EOF { - t.Fatal("expected reads of 5 and 5 and 0, with EOF") - } - - b = newBuffer() - b.write(make([]byte, 5)) - b.write(make([]byte, 10)) - b.eof() - r, err = b.Read(make([]byte, 9)) - r2, err2 = b.Read(make([]byte, 3)) - r3, err3 = b.Read(make([]byte, 3)) - r4, err4 := b.Read(make([]byte, 10)) - if err != nil || err2 != nil || err3 != nil || err4 != io.EOF { - t.Fatalf("Expected EOF on forth read only, err=%v, err2=%v, err3=%v, err4=%v", err, err2, err3, err4) - } - if r != 9 || r2 != 3 || r3 != 3 || r4 != 0 { - t.Fatal("Expected written == read == 15", r, r2, r3, r4) - } -} diff --git a/vendor/golang.org/x/crypto/ssh/certs.go b/vendor/golang.org/x/crypto/ssh/certs.go deleted file mode 100644 index 67600e240..000000000 --- a/vendor/golang.org/x/crypto/ssh/certs.go +++ /dev/null @@ -1,503 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssh - -import ( - "bytes" - "errors" - "fmt" - "io" - "net" - "sort" - "time" -) - -// These constants from [PROTOCOL.certkeys] represent the algorithm names -// for certificate types supported by this package. -const ( - CertAlgoRSAv01 = "ssh-rsa-cert-v01@openssh.com" - CertAlgoDSAv01 = "ssh-dss-cert-v01@openssh.com" - CertAlgoECDSA256v01 = "ecdsa-sha2-nistp256-cert-v01@openssh.com" - CertAlgoECDSA384v01 = "ecdsa-sha2-nistp384-cert-v01@openssh.com" - CertAlgoECDSA521v01 = "ecdsa-sha2-nistp521-cert-v01@openssh.com" - CertAlgoED25519v01 = "ssh-ed25519-cert-v01@openssh.com" -) - -// Certificate types distinguish between host and user -// certificates. The values can be set in the CertType field of -// Certificate. -const ( - UserCert = 1 - HostCert = 2 -) - -// Signature represents a cryptographic signature. -type Signature struct { - Format string - Blob []byte -} - -// CertTimeInfinity can be used for OpenSSHCertV01.ValidBefore to indicate that -// a certificate does not expire. -const CertTimeInfinity = 1<<64 - 1 - -// An Certificate represents an OpenSSH certificate as defined in -// [PROTOCOL.certkeys]?rev=1.8. -type Certificate struct { - Nonce []byte - Key PublicKey - Serial uint64 - CertType uint32 - KeyId string - ValidPrincipals []string - ValidAfter uint64 - ValidBefore uint64 - Permissions - Reserved []byte - SignatureKey PublicKey - Signature *Signature -} - -// genericCertData holds the key-independent part of the certificate data. -// Overall, certificates contain an nonce, public key fields and -// key-independent fields. -type genericCertData struct { - Serial uint64 - CertType uint32 - KeyId string - ValidPrincipals []byte - ValidAfter uint64 - ValidBefore uint64 - CriticalOptions []byte - Extensions []byte - Reserved []byte - SignatureKey []byte - Signature []byte -} - -func marshalStringList(namelist []string) []byte { - var to []byte - for _, name := range namelist { - s := struct{ N string }{name} - to = append(to, Marshal(&s)...) - } - return to -} - -type optionsTuple struct { - Key string - Value []byte -} - -type optionsTupleValue struct { - Value string -} - -// serialize a map of critical options or extensions -// issue #10569 - per [PROTOCOL.certkeys] and SSH implementation, -// we need two length prefixes for a non-empty string value -func marshalTuples(tups map[string]string) []byte { - keys := make([]string, 0, len(tups)) - for key := range tups { - keys = append(keys, key) - } - sort.Strings(keys) - - var ret []byte - for _, key := range keys { - s := optionsTuple{Key: key} - if value := tups[key]; len(value) > 0 { - s.Value = Marshal(&optionsTupleValue{value}) - } - ret = append(ret, Marshal(&s)...) - } - return ret -} - -// issue #10569 - per [PROTOCOL.certkeys] and SSH implementation, -// we need two length prefixes for a non-empty option value -func parseTuples(in []byte) (map[string]string, error) { - tups := map[string]string{} - var lastKey string - var haveLastKey bool - - for len(in) > 0 { - var key, val, extra []byte - var ok bool - - if key, in, ok = parseString(in); !ok { - return nil, errShortRead - } - keyStr := string(key) - // according to [PROTOCOL.certkeys], the names must be in - // lexical order. - if haveLastKey && keyStr <= lastKey { - return nil, fmt.Errorf("ssh: certificate options are not in lexical order") - } - lastKey, haveLastKey = keyStr, true - // the next field is a data field, which if non-empty has a string embedded - if val, in, ok = parseString(in); !ok { - return nil, errShortRead - } - if len(val) > 0 { - val, extra, ok = parseString(val) - if !ok { - return nil, errShortRead - } - if len(extra) > 0 { - return nil, fmt.Errorf("ssh: unexpected trailing data after certificate option value") - } - tups[keyStr] = string(val) - } else { - tups[keyStr] = "" - } - } - return tups, nil -} - -func parseCert(in []byte, privAlgo string) (*Certificate, error) { - nonce, rest, ok := parseString(in) - if !ok { - return nil, errShortRead - } - - key, rest, err := parsePubKey(rest, privAlgo) - if err != nil { - return nil, err - } - - var g genericCertData - if err := Unmarshal(rest, &g); err != nil { - return nil, err - } - - c := &Certificate{ - Nonce: nonce, - Key: key, - Serial: g.Serial, - CertType: g.CertType, - KeyId: g.KeyId, - ValidAfter: g.ValidAfter, - ValidBefore: g.ValidBefore, - } - - for principals := g.ValidPrincipals; len(principals) > 0; { - principal, rest, ok := parseString(principals) - if !ok { - return nil, errShortRead - } - c.ValidPrincipals = append(c.ValidPrincipals, string(principal)) - principals = rest - } - - c.CriticalOptions, err = parseTuples(g.CriticalOptions) - if err != nil { - return nil, err - } - c.Extensions, err = parseTuples(g.Extensions) - if err != nil { - return nil, err - } - c.Reserved = g.Reserved - k, err := ParsePublicKey(g.SignatureKey) - if err != nil { - return nil, err - } - - c.SignatureKey = k - c.Signature, rest, ok = parseSignatureBody(g.Signature) - if !ok || len(rest) > 0 { - return nil, errors.New("ssh: signature parse error") - } - - return c, nil -} - -type openSSHCertSigner struct { - pub *Certificate - signer Signer -} - -// NewCertSigner returns a Signer that signs with the given Certificate, whose -// private key is held by signer. It returns an error if the public key in cert -// doesn't match the key used by signer. -func NewCertSigner(cert *Certificate, signer Signer) (Signer, error) { - if bytes.Compare(cert.Key.Marshal(), signer.PublicKey().Marshal()) != 0 { - return nil, errors.New("ssh: signer and cert have different public key") - } - - return &openSSHCertSigner{cert, signer}, nil -} - -func (s *openSSHCertSigner) Sign(rand io.Reader, data []byte) (*Signature, error) { - return s.signer.Sign(rand, data) -} - -func (s *openSSHCertSigner) PublicKey() PublicKey { - return s.pub -} - -const sourceAddressCriticalOption = "source-address" - -// CertChecker does the work of verifying a certificate. Its methods -// can be plugged into ClientConfig.HostKeyCallback and -// ServerConfig.PublicKeyCallback. For the CertChecker to work, -// minimally, the IsAuthority callback should be set. -type CertChecker struct { - // SupportedCriticalOptions lists the CriticalOptions that the - // server application layer understands. These are only used - // for user certificates. - SupportedCriticalOptions []string - - // IsAuthority should return true if the key is recognized as - // an authority. This allows for certificates to be signed by other - // certificates. - IsAuthority func(auth PublicKey) bool - - // Clock is used for verifying time stamps. If nil, time.Now - // is used. - Clock func() time.Time - - // UserKeyFallback is called when CertChecker.Authenticate encounters a - // public key that is not a certificate. It must implement validation - // of user keys or else, if nil, all such keys are rejected. - UserKeyFallback func(conn ConnMetadata, key PublicKey) (*Permissions, error) - - // HostKeyFallback is called when CertChecker.CheckHostKey encounters a - // public key that is not a certificate. It must implement host key - // validation or else, if nil, all such keys are rejected. - HostKeyFallback HostKeyCallback - - // IsRevoked is called for each certificate so that revocation checking - // can be implemented. It should return true if the given certificate - // is revoked and false otherwise. If nil, no certificates are - // considered to have been revoked. - IsRevoked func(cert *Certificate) bool -} - -// CheckHostKey checks a host key certificate. This method can be -// plugged into ClientConfig.HostKeyCallback. -func (c *CertChecker) CheckHostKey(addr string, remote net.Addr, key PublicKey) error { - cert, ok := key.(*Certificate) - if !ok { - if c.HostKeyFallback != nil { - return c.HostKeyFallback(addr, remote, key) - } - return errors.New("ssh: non-certificate host key") - } - if cert.CertType != HostCert { - return fmt.Errorf("ssh: certificate presented as a host key has type %d", cert.CertType) - } - - return c.CheckCert(addr, cert) -} - -// Authenticate checks a user certificate. Authenticate can be used as -// a value for ServerConfig.PublicKeyCallback. -func (c *CertChecker) Authenticate(conn ConnMetadata, pubKey PublicKey) (*Permissions, error) { - cert, ok := pubKey.(*Certificate) - if !ok { - if c.UserKeyFallback != nil { - return c.UserKeyFallback(conn, pubKey) - } - return nil, errors.New("ssh: normal key pairs not accepted") - } - - if cert.CertType != UserCert { - return nil, fmt.Errorf("ssh: cert has type %d", cert.CertType) - } - - if err := c.CheckCert(conn.User(), cert); err != nil { - return nil, err - } - - return &cert.Permissions, nil -} - -// CheckCert checks CriticalOptions, ValidPrincipals, revocation, timestamp and -// the signature of the certificate. -func (c *CertChecker) CheckCert(principal string, cert *Certificate) error { - if c.IsRevoked != nil && c.IsRevoked(cert) { - return fmt.Errorf("ssh: certicate serial %d revoked", cert.Serial) - } - - for opt, _ := range cert.CriticalOptions { - // sourceAddressCriticalOption will be enforced by - // serverAuthenticate - if opt == sourceAddressCriticalOption { - continue - } - - found := false - for _, supp := range c.SupportedCriticalOptions { - if supp == opt { - found = true - break - } - } - if !found { - return fmt.Errorf("ssh: unsupported critical option %q in certificate", opt) - } - } - - if len(cert.ValidPrincipals) > 0 { - // By default, certs are valid for all users/hosts. - found := false - for _, p := range cert.ValidPrincipals { - if p == principal { - found = true - break - } - } - if !found { - return fmt.Errorf("ssh: principal %q not in the set of valid principals for given certificate: %q", principal, cert.ValidPrincipals) - } - } - - if !c.IsAuthority(cert.SignatureKey) { - return fmt.Errorf("ssh: certificate signed by unrecognized authority") - } - - clock := c.Clock - if clock == nil { - clock = time.Now - } - - unixNow := clock().Unix() - if after := int64(cert.ValidAfter); after < 0 || unixNow < int64(cert.ValidAfter) { - return fmt.Errorf("ssh: cert is not yet valid") - } - if before := int64(cert.ValidBefore); cert.ValidBefore != uint64(CertTimeInfinity) && (unixNow >= before || before < 0) { - return fmt.Errorf("ssh: cert has expired") - } - if err := cert.SignatureKey.Verify(cert.bytesForSigning(), cert.Signature); err != nil { - return fmt.Errorf("ssh: certificate signature does not verify") - } - - return nil -} - -// SignCert sets c.SignatureKey to the authority's public key and stores a -// Signature, by authority, in the certificate. -func (c *Certificate) SignCert(rand io.Reader, authority Signer) error { - c.Nonce = make([]byte, 32) - if _, err := io.ReadFull(rand, c.Nonce); err != nil { - return err - } - c.SignatureKey = authority.PublicKey() - - sig, err := authority.Sign(rand, c.bytesForSigning()) - if err != nil { - return err - } - c.Signature = sig - return nil -} - -var certAlgoNames = map[string]string{ - KeyAlgoRSA: CertAlgoRSAv01, - KeyAlgoDSA: CertAlgoDSAv01, - KeyAlgoECDSA256: CertAlgoECDSA256v01, - KeyAlgoECDSA384: CertAlgoECDSA384v01, - KeyAlgoECDSA521: CertAlgoECDSA521v01, - KeyAlgoED25519: CertAlgoED25519v01, -} - -// certToPrivAlgo returns the underlying algorithm for a certificate algorithm. -// Panics if a non-certificate algorithm is passed. -func certToPrivAlgo(algo string) string { - for privAlgo, pubAlgo := range certAlgoNames { - if pubAlgo == algo { - return privAlgo - } - } - panic("unknown cert algorithm") -} - -func (cert *Certificate) bytesForSigning() []byte { - c2 := *cert - c2.Signature = nil - out := c2.Marshal() - // Drop trailing signature length. - return out[:len(out)-4] -} - -// Marshal serializes c into OpenSSH's wire format. It is part of the -// PublicKey interface. -func (c *Certificate) Marshal() []byte { - generic := genericCertData{ - Serial: c.Serial, - CertType: c.CertType, - KeyId: c.KeyId, - ValidPrincipals: marshalStringList(c.ValidPrincipals), - ValidAfter: uint64(c.ValidAfter), - ValidBefore: uint64(c.ValidBefore), - CriticalOptions: marshalTuples(c.CriticalOptions), - Extensions: marshalTuples(c.Extensions), - Reserved: c.Reserved, - SignatureKey: c.SignatureKey.Marshal(), - } - if c.Signature != nil { - generic.Signature = Marshal(c.Signature) - } - genericBytes := Marshal(&generic) - keyBytes := c.Key.Marshal() - _, keyBytes, _ = parseString(keyBytes) - prefix := Marshal(&struct { - Name string - Nonce []byte - Key []byte `ssh:"rest"` - }{c.Type(), c.Nonce, keyBytes}) - - result := make([]byte, 0, len(prefix)+len(genericBytes)) - result = append(result, prefix...) - result = append(result, genericBytes...) - return result -} - -// Type returns the key name. It is part of the PublicKey interface. -func (c *Certificate) Type() string { - algo, ok := certAlgoNames[c.Key.Type()] - if !ok { - panic("unknown cert key type " + c.Key.Type()) - } - return algo -} - -// Verify verifies a signature against the certificate's public -// key. It is part of the PublicKey interface. -func (c *Certificate) Verify(data []byte, sig *Signature) error { - return c.Key.Verify(data, sig) -} - -func parseSignatureBody(in []byte) (out *Signature, rest []byte, ok bool) { - format, in, ok := parseString(in) - if !ok { - return - } - - out = &Signature{ - Format: string(format), - } - - if out.Blob, in, ok = parseString(in); !ok { - return - } - - return out, in, ok -} - -func parseSignature(in []byte) (out *Signature, rest []byte, ok bool) { - sigBytes, rest, ok := parseString(in) - if !ok { - return - } - - out, trailing, ok := parseSignatureBody(sigBytes) - if !ok || len(trailing) > 0 { - return nil, nil, false - } - return -} diff --git a/vendor/golang.org/x/crypto/ssh/certs_test.go b/vendor/golang.org/x/crypto/ssh/certs_test.go deleted file mode 100644 index c5f2e5330..000000000 --- a/vendor/golang.org/x/crypto/ssh/certs_test.go +++ /dev/null @@ -1,216 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssh - -import ( - "bytes" - "crypto/rand" - "reflect" - "testing" - "time" -) - -// Cert generated by ssh-keygen 6.0p1 Debian-4. -// % ssh-keygen -s ca-key -I test user-key -const exampleSSHCert = `ssh-rsa-cert-v01@openssh.com AAAAHHNzaC1yc2EtY2VydC12MDFAb3BlbnNzaC5jb20AAAAgb1srW/W3ZDjYAO45xLYAwzHBDLsJ4Ux6ICFIkTjb1LEAAAADAQABAAAAYQCkoR51poH0wE8w72cqSB8Sszx+vAhzcMdCO0wqHTj7UNENHWEXGrU0E0UQekD7U+yhkhtoyjbPOVIP7hNa6aRk/ezdh/iUnCIt4Jt1v3Z1h1P+hA4QuYFMHNB+rmjPwAcAAAAAAAAAAAAAAAEAAAAEdGVzdAAAAAAAAAAAAAAAAP//////////AAAAAAAAAIIAAAAVcGVybWl0LVgxMS1mb3J3YXJkaW5nAAAAAAAAABdwZXJtaXQtYWdlbnQtZm9yd2FyZGluZwAAAAAAAAAWcGVybWl0LXBvcnQtZm9yd2FyZGluZwAAAAAAAAAKcGVybWl0LXB0eQAAAAAAAAAOcGVybWl0LXVzZXItcmMAAAAAAAAAAAAAAHcAAAAHc3NoLXJzYQAAAAMBAAEAAABhANFS2kaktpSGc+CcmEKPyw9mJC4nZKxHKTgLVZeaGbFZOvJTNzBspQHdy7Q1uKSfktxpgjZnksiu/tFF9ngyY2KFoc+U88ya95IZUycBGCUbBQ8+bhDtw/icdDGQD5WnUwAAAG8AAAAHc3NoLXJzYQAAAGC8Y9Z2LQKhIhxf52773XaWrXdxP0t3GBVo4A10vUWiYoAGepr6rQIoGGXFxT4B9Gp+nEBJjOwKDXPrAevow0T9ca8gZN+0ykbhSrXLE5Ao48rqr3zP4O1/9P7e6gp0gw8=` - -func TestParseCert(t *testing.T) { - authKeyBytes := []byte(exampleSSHCert) - - key, _, _, rest, err := ParseAuthorizedKey(authKeyBytes) - if err != nil { - t.Fatalf("ParseAuthorizedKey: %v", err) - } - if len(rest) > 0 { - t.Errorf("rest: got %q, want empty", rest) - } - - if _, ok := key.(*Certificate); !ok { - t.Fatalf("got %v (%T), want *Certificate", key, key) - } - - marshaled := MarshalAuthorizedKey(key) - // Before comparison, remove the trailing newline that - // MarshalAuthorizedKey adds. - marshaled = marshaled[:len(marshaled)-1] - if !bytes.Equal(authKeyBytes, marshaled) { - t.Errorf("marshaled certificate does not match original: got %q, want %q", marshaled, authKeyBytes) - } -} - -// Cert generated by ssh-keygen OpenSSH_6.8p1 OS X 10.10.3 -// % ssh-keygen -s ca -I testcert -O source-address=192.168.1.0/24 -O force-command=/bin/sleep user.pub -// user.pub key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDACh1rt2DXfV3hk6fszSQcQ/rueMId0kVD9U7nl8cfEnFxqOCrNT92g4laQIGl2mn8lsGZfTLg8ksHq3gkvgO3oo/0wHy4v32JeBOHTsN5AL4gfHNEhWeWb50ev47hnTsRIt9P4dxogeUo/hTu7j9+s9lLpEQXCvq6xocXQt0j8MV9qZBBXFLXVT3cWIkSqOdwt/5ZBg+1GSrc7WfCXVWgTk4a20uPMuJPxU4RQwZW6X3+O8Pqo8C3cW0OzZRFP6gUYUKUsTI5WntlS+LAxgw1mZNsozFGdbiOPRnEryE3SRldh9vjDR3tin1fGpA5P7+CEB/bqaXtG3V+F2OkqaMN -// Critical Options: -// force-command /bin/sleep -// source-address 192.168.1.0/24 -// Extensions: -// permit-X11-forwarding -// permit-agent-forwarding -// permit-port-forwarding -// permit-pty -// permit-user-rc -const exampleSSHCertWithOptions = `ssh-rsa-cert-v01@openssh.com AAAAHHNzaC1yc2EtY2VydC12MDFAb3BlbnNzaC5jb20AAAAgDyysCJY0XrO1n03EeRRoITnTPdjENFmWDs9X58PP3VUAAAADAQABAAABAQDACh1rt2DXfV3hk6fszSQcQ/rueMId0kVD9U7nl8cfEnFxqOCrNT92g4laQIGl2mn8lsGZfTLg8ksHq3gkvgO3oo/0wHy4v32JeBOHTsN5AL4gfHNEhWeWb50ev47hnTsRIt9P4dxogeUo/hTu7j9+s9lLpEQXCvq6xocXQt0j8MV9qZBBXFLXVT3cWIkSqOdwt/5ZBg+1GSrc7WfCXVWgTk4a20uPMuJPxU4RQwZW6X3+O8Pqo8C3cW0OzZRFP6gUYUKUsTI5WntlS+LAxgw1mZNsozFGdbiOPRnEryE3SRldh9vjDR3tin1fGpA5P7+CEB/bqaXtG3V+F2OkqaMNAAAAAAAAAAAAAAABAAAACHRlc3RjZXJ0AAAAAAAAAAAAAAAA//////////8AAABLAAAADWZvcmNlLWNvbW1hbmQAAAAOAAAACi9iaW4vc2xlZXAAAAAOc291cmNlLWFkZHJlc3MAAAASAAAADjE5Mi4xNjguMS4wLzI0AAAAggAAABVwZXJtaXQtWDExLWZvcndhcmRpbmcAAAAAAAAAF3Blcm1pdC1hZ2VudC1mb3J3YXJkaW5nAAAAAAAAABZwZXJtaXQtcG9ydC1mb3J3YXJkaW5nAAAAAAAAAApwZXJtaXQtcHR5AAAAAAAAAA5wZXJtaXQtdXNlci1yYwAAAAAAAAAAAAABFwAAAAdzc2gtcnNhAAAAAwEAAQAAAQEAwU+c5ui5A8+J/CFpjW8wCa52bEODA808WWQDCSuTG/eMXNf59v9Y8Pk0F1E9dGCosSNyVcB/hacUrc6He+i97+HJCyKavBsE6GDxrjRyxYqAlfcOXi/IVmaUGiO8OQ39d4GHrjToInKvExSUeleQyH4Y4/e27T/pILAqPFL3fyrvMLT5qU9QyIt6zIpa7GBP5+urouNavMprV3zsfIqNBbWypinOQAw823a5wN+zwXnhZrgQiHZ/USG09Y6k98y1dTVz8YHlQVR4D3lpTAsKDKJ5hCH9WU4fdf+lU8OyNGaJ/vz0XNqxcToe1l4numLTnaoSuH89pHryjqurB7lJKwAAAQ8AAAAHc3NoLXJzYQAAAQCaHvUIoPL1zWUHIXLvu96/HU1s/i4CAW2IIEuGgxCUCiFj6vyTyYtgxQxcmbfZf6eaITlS6XJZa7Qq4iaFZh75C1DXTX8labXhRSD4E2t//AIP9MC1rtQC5xo6FmbQ+BoKcDskr+mNACcbRSxs3IL3bwCfWDnIw2WbVox9ZdcthJKk4UoCW4ix4QwdHw7zlddlz++fGEEVhmTbll1SUkycGApPFBsAYRTMupUJcYPIeReBI/m8XfkoMk99bV8ZJQTAd7OekHY2/48Ff53jLmyDjP7kNw1F8OaPtkFs6dGJXta4krmaekPy87j+35In5hFj7yoOqvSbmYUkeX70/GGQ` - -func TestParseCertWithOptions(t *testing.T) { - opts := map[string]string{ - "source-address": "192.168.1.0/24", - "force-command": "/bin/sleep", - } - exts := map[string]string{ - "permit-X11-forwarding": "", - "permit-agent-forwarding": "", - "permit-port-forwarding": "", - "permit-pty": "", - "permit-user-rc": "", - } - authKeyBytes := []byte(exampleSSHCertWithOptions) - - key, _, _, rest, err := ParseAuthorizedKey(authKeyBytes) - if err != nil { - t.Fatalf("ParseAuthorizedKey: %v", err) - } - if len(rest) > 0 { - t.Errorf("rest: got %q, want empty", rest) - } - cert, ok := key.(*Certificate) - if !ok { - t.Fatalf("got %v (%T), want *Certificate", key, key) - } - if !reflect.DeepEqual(cert.CriticalOptions, opts) { - t.Errorf("unexpected critical options - got %v, want %v", cert.CriticalOptions, opts) - } - if !reflect.DeepEqual(cert.Extensions, exts) { - t.Errorf("unexpected Extensions - got %v, want %v", cert.Extensions, exts) - } - marshaled := MarshalAuthorizedKey(key) - // Before comparison, remove the trailing newline that - // MarshalAuthorizedKey adds. - marshaled = marshaled[:len(marshaled)-1] - if !bytes.Equal(authKeyBytes, marshaled) { - t.Errorf("marshaled certificate does not match original: got %q, want %q", marshaled, authKeyBytes) - } -} - -func TestValidateCert(t *testing.T) { - key, _, _, _, err := ParseAuthorizedKey([]byte(exampleSSHCert)) - if err != nil { - t.Fatalf("ParseAuthorizedKey: %v", err) - } - validCert, ok := key.(*Certificate) - if !ok { - t.Fatalf("got %v (%T), want *Certificate", key, key) - } - checker := CertChecker{} - checker.IsAuthority = func(k PublicKey) bool { - return bytes.Equal(k.Marshal(), validCert.SignatureKey.Marshal()) - } - - if err := checker.CheckCert("user", validCert); err != nil { - t.Errorf("Unable to validate certificate: %v", err) - } - invalidCert := &Certificate{ - Key: testPublicKeys["rsa"], - SignatureKey: testPublicKeys["ecdsa"], - ValidBefore: CertTimeInfinity, - Signature: &Signature{}, - } - if err := checker.CheckCert("user", invalidCert); err == nil { - t.Error("Invalid cert signature passed validation") - } -} - -func TestValidateCertTime(t *testing.T) { - cert := Certificate{ - ValidPrincipals: []string{"user"}, - Key: testPublicKeys["rsa"], - ValidAfter: 50, - ValidBefore: 100, - } - - cert.SignCert(rand.Reader, testSigners["ecdsa"]) - - for ts, ok := range map[int64]bool{ - 25: false, - 50: true, - 99: true, - 100: false, - 125: false, - } { - checker := CertChecker{ - Clock: func() time.Time { return time.Unix(ts, 0) }, - } - checker.IsAuthority = func(k PublicKey) bool { - return bytes.Equal(k.Marshal(), - testPublicKeys["ecdsa"].Marshal()) - } - - if v := checker.CheckCert("user", &cert); (v == nil) != ok { - t.Errorf("Authenticate(%d): %v", ts, v) - } - } -} - -// TODO(hanwen): tests for -// -// host keys: -// * fallbacks - -func TestHostKeyCert(t *testing.T) { - cert := &Certificate{ - ValidPrincipals: []string{"hostname", "hostname.domain"}, - Key: testPublicKeys["rsa"], - ValidBefore: CertTimeInfinity, - CertType: HostCert, - } - cert.SignCert(rand.Reader, testSigners["ecdsa"]) - - checker := &CertChecker{ - IsAuthority: func(p PublicKey) bool { - return bytes.Equal(testPublicKeys["ecdsa"].Marshal(), p.Marshal()) - }, - } - - certSigner, err := NewCertSigner(cert, testSigners["rsa"]) - if err != nil { - t.Errorf("NewCertSigner: %v", err) - } - - for _, name := range []string{"hostname", "otherhost"} { - c1, c2, err := netPipe() - if err != nil { - t.Fatalf("netPipe: %v", err) - } - defer c1.Close() - defer c2.Close() - - errc := make(chan error) - - go func() { - conf := ServerConfig{ - NoClientAuth: true, - } - conf.AddHostKey(certSigner) - _, _, _, err := NewServerConn(c1, &conf) - errc <- err - }() - - config := &ClientConfig{ - User: "user", - HostKeyCallback: checker.CheckHostKey, - } - _, _, _, err = NewClientConn(c2, name, config) - - succeed := name == "hostname" - if (err == nil) != succeed { - t.Fatalf("NewClientConn(%q): %v", name, err) - } - - err = <-errc - if (err == nil) != succeed { - t.Fatalf("NewServerConn(%q): %v", name, err) - } - } -} diff --git a/vendor/golang.org/x/crypto/ssh/channel.go b/vendor/golang.org/x/crypto/ssh/channel.go deleted file mode 100644 index 195530ea0..000000000 --- a/vendor/golang.org/x/crypto/ssh/channel.go +++ /dev/null @@ -1,633 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssh - -import ( - "encoding/binary" - "errors" - "fmt" - "io" - "log" - "sync" -) - -const ( - minPacketLength = 9 - // channelMaxPacket contains the maximum number of bytes that will be - // sent in a single packet. As per RFC 4253, section 6.1, 32k is also - // the minimum. - channelMaxPacket = 1 << 15 - // We follow OpenSSH here. - channelWindowSize = 64 * channelMaxPacket -) - -// NewChannel represents an incoming request to a channel. It must either be -// accepted for use by calling Accept, or rejected by calling Reject. -type NewChannel interface { - // Accept accepts the channel creation request. It returns the Channel - // and a Go channel containing SSH requests. The Go channel must be - // serviced otherwise the Channel will hang. - Accept() (Channel, <-chan *Request, error) - - // Reject rejects the channel creation request. After calling - // this, no other methods on the Channel may be called. - Reject(reason RejectionReason, message string) error - - // ChannelType returns the type of the channel, as supplied by the - // client. - ChannelType() string - - // ExtraData returns the arbitrary payload for this channel, as supplied - // by the client. This data is specific to the channel type. - ExtraData() []byte -} - -// A Channel is an ordered, reliable, flow-controlled, duplex stream -// that is multiplexed over an SSH connection. -type Channel interface { - // Read reads up to len(data) bytes from the channel. - Read(data []byte) (int, error) - - // Write writes len(data) bytes to the channel. - Write(data []byte) (int, error) - - // Close signals end of channel use. No data may be sent after this - // call. - Close() error - - // CloseWrite signals the end of sending in-band - // data. Requests may still be sent, and the other side may - // still send data - CloseWrite() error - - // SendRequest sends a channel request. If wantReply is true, - // it will wait for a reply and return the result as a - // boolean, otherwise the return value will be false. Channel - // requests are out-of-band messages so they may be sent even - // if the data stream is closed or blocked by flow control. - // If the channel is closed before a reply is returned, io.EOF - // is returned. - SendRequest(name string, wantReply bool, payload []byte) (bool, error) - - // Stderr returns an io.ReadWriter that writes to this channel - // with the extended data type set to stderr. Stderr may - // safely be read and written from a different goroutine than - // Read and Write respectively. - Stderr() io.ReadWriter -} - -// Request is a request sent outside of the normal stream of -// data. Requests can either be specific to an SSH channel, or they -// can be global. -type Request struct { - Type string - WantReply bool - Payload []byte - - ch *channel - mux *mux -} - -// Reply sends a response to a request. It must be called for all requests -// where WantReply is true and is a no-op otherwise. The payload argument is -// ignored for replies to channel-specific requests. -func (r *Request) Reply(ok bool, payload []byte) error { - if !r.WantReply { - return nil - } - - if r.ch == nil { - return r.mux.ackRequest(ok, payload) - } - - return r.ch.ackRequest(ok) -} - -// RejectionReason is an enumeration used when rejecting channel creation -// requests. See RFC 4254, section 5.1. -type RejectionReason uint32 - -const ( - Prohibited RejectionReason = iota + 1 - ConnectionFailed - UnknownChannelType - ResourceShortage -) - -// String converts the rejection reason to human readable form. -func (r RejectionReason) String() string { - switch r { - case Prohibited: - return "administratively prohibited" - case ConnectionFailed: - return "connect failed" - case UnknownChannelType: - return "unknown channel type" - case ResourceShortage: - return "resource shortage" - } - return fmt.Sprintf("unknown reason %d", int(r)) -} - -func min(a uint32, b int) uint32 { - if a < uint32(b) { - return a - } - return uint32(b) -} - -type channelDirection uint8 - -const ( - channelInbound channelDirection = iota - channelOutbound -) - -// channel is an implementation of the Channel interface that works -// with the mux class. -type channel struct { - // R/O after creation - chanType string - extraData []byte - localId, remoteId uint32 - - // maxIncomingPayload and maxRemotePayload are the maximum - // payload sizes of normal and extended data packets for - // receiving and sending, respectively. The wire packet will - // be 9 or 13 bytes larger (excluding encryption overhead). - maxIncomingPayload uint32 - maxRemotePayload uint32 - - mux *mux - - // decided is set to true if an accept or reject message has been sent - // (for outbound channels) or received (for inbound channels). - decided bool - - // direction contains either channelOutbound, for channels created - // locally, or channelInbound, for channels created by the peer. - direction channelDirection - - // Pending internal channel messages. - msg chan interface{} - - // Since requests have no ID, there can be only one request - // with WantReply=true outstanding. This lock is held by a - // goroutine that has such an outgoing request pending. - sentRequestMu sync.Mutex - - incomingRequests chan *Request - - sentEOF bool - - // thread-safe data - remoteWin window - pending *buffer - extPending *buffer - - // windowMu protects myWindow, the flow-control window. - windowMu sync.Mutex - myWindow uint32 - - // writeMu serializes calls to mux.conn.writePacket() and - // protects sentClose and packetPool. This mutex must be - // different from windowMu, as writePacket can block if there - // is a key exchange pending. - writeMu sync.Mutex - sentClose bool - - // packetPool has a buffer for each extended channel ID to - // save allocations during writes. - packetPool map[uint32][]byte -} - -// writePacket sends a packet. If the packet is a channel close, it updates -// sentClose. This method takes the lock c.writeMu. -func (c *channel) writePacket(packet []byte) error { - c.writeMu.Lock() - if c.sentClose { - c.writeMu.Unlock() - return io.EOF - } - c.sentClose = (packet[0] == msgChannelClose) - err := c.mux.conn.writePacket(packet) - c.writeMu.Unlock() - return err -} - -func (c *channel) sendMessage(msg interface{}) error { - if debugMux { - log.Printf("send(%d): %#v", c.mux.chanList.offset, msg) - } - - p := Marshal(msg) - binary.BigEndian.PutUint32(p[1:], c.remoteId) - return c.writePacket(p) -} - -// WriteExtended writes data to a specific extended stream. These streams are -// used, for example, for stderr. -func (c *channel) WriteExtended(data []byte, extendedCode uint32) (n int, err error) { - if c.sentEOF { - return 0, io.EOF - } - // 1 byte message type, 4 bytes remoteId, 4 bytes data length - opCode := byte(msgChannelData) - headerLength := uint32(9) - if extendedCode > 0 { - headerLength += 4 - opCode = msgChannelExtendedData - } - - c.writeMu.Lock() - packet := c.packetPool[extendedCode] - // We don't remove the buffer from packetPool, so - // WriteExtended calls from different goroutines will be - // flagged as errors by the race detector. - c.writeMu.Unlock() - - for len(data) > 0 { - space := min(c.maxRemotePayload, len(data)) - if space, err = c.remoteWin.reserve(space); err != nil { - return n, err - } - if want := headerLength + space; uint32(cap(packet)) < want { - packet = make([]byte, want) - } else { - packet = packet[:want] - } - - todo := data[:space] - - packet[0] = opCode - binary.BigEndian.PutUint32(packet[1:], c.remoteId) - if extendedCode > 0 { - binary.BigEndian.PutUint32(packet[5:], uint32(extendedCode)) - } - binary.BigEndian.PutUint32(packet[headerLength-4:], uint32(len(todo))) - copy(packet[headerLength:], todo) - if err = c.writePacket(packet); err != nil { - return n, err - } - - n += len(todo) - data = data[len(todo):] - } - - c.writeMu.Lock() - c.packetPool[extendedCode] = packet - c.writeMu.Unlock() - - return n, err -} - -func (c *channel) handleData(packet []byte) error { - headerLen := 9 - isExtendedData := packet[0] == msgChannelExtendedData - if isExtendedData { - headerLen = 13 - } - if len(packet) < headerLen { - // malformed data packet - return parseError(packet[0]) - } - - var extended uint32 - if isExtendedData { - extended = binary.BigEndian.Uint32(packet[5:]) - } - - length := binary.BigEndian.Uint32(packet[headerLen-4 : headerLen]) - if length == 0 { - return nil - } - if length > c.maxIncomingPayload { - // TODO(hanwen): should send Disconnect? - return errors.New("ssh: incoming packet exceeds maximum payload size") - } - - data := packet[headerLen:] - if length != uint32(len(data)) { - return errors.New("ssh: wrong packet length") - } - - c.windowMu.Lock() - if c.myWindow < length { - c.windowMu.Unlock() - // TODO(hanwen): should send Disconnect with reason? - return errors.New("ssh: remote side wrote too much") - } - c.myWindow -= length - c.windowMu.Unlock() - - if extended == 1 { - c.extPending.write(data) - } else if extended > 0 { - // discard other extended data. - } else { - c.pending.write(data) - } - return nil -} - -func (c *channel) adjustWindow(n uint32) error { - c.windowMu.Lock() - // Since myWindow is managed on our side, and can never exceed - // the initial window setting, we don't worry about overflow. - c.myWindow += uint32(n) - c.windowMu.Unlock() - return c.sendMessage(windowAdjustMsg{ - AdditionalBytes: uint32(n), - }) -} - -func (c *channel) ReadExtended(data []byte, extended uint32) (n int, err error) { - switch extended { - case 1: - n, err = c.extPending.Read(data) - case 0: - n, err = c.pending.Read(data) - default: - return 0, fmt.Errorf("ssh: extended code %d unimplemented", extended) - } - - if n > 0 { - err = c.adjustWindow(uint32(n)) - // sendWindowAdjust can return io.EOF if the remote - // peer has closed the connection, however we want to - // defer forwarding io.EOF to the caller of Read until - // the buffer has been drained. - if n > 0 && err == io.EOF { - err = nil - } - } - - return n, err -} - -func (c *channel) close() { - c.pending.eof() - c.extPending.eof() - close(c.msg) - close(c.incomingRequests) - c.writeMu.Lock() - // This is not necessary for a normal channel teardown, but if - // there was another error, it is. - c.sentClose = true - c.writeMu.Unlock() - // Unblock writers. - c.remoteWin.close() -} - -// responseMessageReceived is called when a success or failure message is -// received on a channel to check that such a message is reasonable for the -// given channel. -func (c *channel) responseMessageReceived() error { - if c.direction == channelInbound { - return errors.New("ssh: channel response message received on inbound channel") - } - if c.decided { - return errors.New("ssh: duplicate response received for channel") - } - c.decided = true - return nil -} - -func (c *channel) handlePacket(packet []byte) error { - switch packet[0] { - case msgChannelData, msgChannelExtendedData: - return c.handleData(packet) - case msgChannelClose: - c.sendMessage(channelCloseMsg{PeersId: c.remoteId}) - c.mux.chanList.remove(c.localId) - c.close() - return nil - case msgChannelEOF: - // RFC 4254 is mute on how EOF affects dataExt messages but - // it is logical to signal EOF at the same time. - c.extPending.eof() - c.pending.eof() - return nil - } - - decoded, err := decode(packet) - if err != nil { - return err - } - - switch msg := decoded.(type) { - case *channelOpenFailureMsg: - if err := c.responseMessageReceived(); err != nil { - return err - } - c.mux.chanList.remove(msg.PeersId) - c.msg <- msg - case *channelOpenConfirmMsg: - if err := c.responseMessageReceived(); err != nil { - return err - } - if msg.MaxPacketSize < minPacketLength || msg.MaxPacketSize > 1<<31 { - return fmt.Errorf("ssh: invalid MaxPacketSize %d from peer", msg.MaxPacketSize) - } - c.remoteId = msg.MyId - c.maxRemotePayload = msg.MaxPacketSize - c.remoteWin.add(msg.MyWindow) - c.msg <- msg - case *windowAdjustMsg: - if !c.remoteWin.add(msg.AdditionalBytes) { - return fmt.Errorf("ssh: invalid window update for %d bytes", msg.AdditionalBytes) - } - case *channelRequestMsg: - req := Request{ - Type: msg.Request, - WantReply: msg.WantReply, - Payload: msg.RequestSpecificData, - ch: c, - } - - c.incomingRequests <- &req - default: - c.msg <- msg - } - return nil -} - -func (m *mux) newChannel(chanType string, direction channelDirection, extraData []byte) *channel { - ch := &channel{ - remoteWin: window{Cond: newCond()}, - myWindow: channelWindowSize, - pending: newBuffer(), - extPending: newBuffer(), - direction: direction, - incomingRequests: make(chan *Request, chanSize), - msg: make(chan interface{}, chanSize), - chanType: chanType, - extraData: extraData, - mux: m, - packetPool: make(map[uint32][]byte), - } - ch.localId = m.chanList.add(ch) - return ch -} - -var errUndecided = errors.New("ssh: must Accept or Reject channel") -var errDecidedAlready = errors.New("ssh: can call Accept or Reject only once") - -type extChannel struct { - code uint32 - ch *channel -} - -func (e *extChannel) Write(data []byte) (n int, err error) { - return e.ch.WriteExtended(data, e.code) -} - -func (e *extChannel) Read(data []byte) (n int, err error) { - return e.ch.ReadExtended(data, e.code) -} - -func (c *channel) Accept() (Channel, <-chan *Request, error) { - if c.decided { - return nil, nil, errDecidedAlready - } - c.maxIncomingPayload = channelMaxPacket - confirm := channelOpenConfirmMsg{ - PeersId: c.remoteId, - MyId: c.localId, - MyWindow: c.myWindow, - MaxPacketSize: c.maxIncomingPayload, - } - c.decided = true - if err := c.sendMessage(confirm); err != nil { - return nil, nil, err - } - - return c, c.incomingRequests, nil -} - -func (ch *channel) Reject(reason RejectionReason, message string) error { - if ch.decided { - return errDecidedAlready - } - reject := channelOpenFailureMsg{ - PeersId: ch.remoteId, - Reason: reason, - Message: message, - Language: "en", - } - ch.decided = true - return ch.sendMessage(reject) -} - -func (ch *channel) Read(data []byte) (int, error) { - if !ch.decided { - return 0, errUndecided - } - return ch.ReadExtended(data, 0) -} - -func (ch *channel) Write(data []byte) (int, error) { - if !ch.decided { - return 0, errUndecided - } - return ch.WriteExtended(data, 0) -} - -func (ch *channel) CloseWrite() error { - if !ch.decided { - return errUndecided - } - ch.sentEOF = true - return ch.sendMessage(channelEOFMsg{ - PeersId: ch.remoteId}) -} - -func (ch *channel) Close() error { - if !ch.decided { - return errUndecided - } - - return ch.sendMessage(channelCloseMsg{ - PeersId: ch.remoteId}) -} - -// Extended returns an io.ReadWriter that sends and receives data on the given, -// SSH extended stream. Such streams are used, for example, for stderr. -func (ch *channel) Extended(code uint32) io.ReadWriter { - if !ch.decided { - return nil - } - return &extChannel{code, ch} -} - -func (ch *channel) Stderr() io.ReadWriter { - return ch.Extended(1) -} - -func (ch *channel) SendRequest(name string, wantReply bool, payload []byte) (bool, error) { - if !ch.decided { - return false, errUndecided - } - - if wantReply { - ch.sentRequestMu.Lock() - defer ch.sentRequestMu.Unlock() - } - - msg := channelRequestMsg{ - PeersId: ch.remoteId, - Request: name, - WantReply: wantReply, - RequestSpecificData: payload, - } - - if err := ch.sendMessage(msg); err != nil { - return false, err - } - - if wantReply { - m, ok := (<-ch.msg) - if !ok { - return false, io.EOF - } - switch m.(type) { - case *channelRequestFailureMsg: - return false, nil - case *channelRequestSuccessMsg: - return true, nil - default: - return false, fmt.Errorf("ssh: unexpected response to channel request: %#v", m) - } - } - - return false, nil -} - -// ackRequest either sends an ack or nack to the channel request. -func (ch *channel) ackRequest(ok bool) error { - if !ch.decided { - return errUndecided - } - - var msg interface{} - if !ok { - msg = channelRequestFailureMsg{ - PeersId: ch.remoteId, - } - } else { - msg = channelRequestSuccessMsg{ - PeersId: ch.remoteId, - } - } - return ch.sendMessage(msg) -} - -func (ch *channel) ChannelType() string { - return ch.chanType -} - -func (ch *channel) ExtraData() []byte { - return ch.extraData -} diff --git a/vendor/golang.org/x/crypto/ssh/cipher.go b/vendor/golang.org/x/crypto/ssh/cipher.go deleted file mode 100644 index 13484ab4b..000000000 --- a/vendor/golang.org/x/crypto/ssh/cipher.go +++ /dev/null @@ -1,627 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssh - -import ( - "crypto/aes" - "crypto/cipher" - "crypto/des" - "crypto/rc4" - "crypto/subtle" - "encoding/binary" - "errors" - "fmt" - "hash" - "io" - "io/ioutil" -) - -const ( - packetSizeMultiple = 16 // TODO(huin) this should be determined by the cipher. - - // RFC 4253 section 6.1 defines a minimum packet size of 32768 that implementations - // MUST be able to process (plus a few more kilobytes for padding and mac). The RFC - // indicates implementations SHOULD be able to handle larger packet sizes, but then - // waffles on about reasonable limits. - // - // OpenSSH caps their maxPacket at 256kB so we choose to do - // the same. maxPacket is also used to ensure that uint32 - // length fields do not overflow, so it should remain well - // below 4G. - maxPacket = 256 * 1024 -) - -// noneCipher implements cipher.Stream and provides no encryption. It is used -// by the transport before the first key-exchange. -type noneCipher struct{} - -func (c noneCipher) XORKeyStream(dst, src []byte) { - copy(dst, src) -} - -func newAESCTR(key, iv []byte) (cipher.Stream, error) { - c, err := aes.NewCipher(key) - if err != nil { - return nil, err - } - return cipher.NewCTR(c, iv), nil -} - -func newRC4(key, iv []byte) (cipher.Stream, error) { - return rc4.NewCipher(key) -} - -type streamCipherMode struct { - keySize int - ivSize int - skip int - createFunc func(key, iv []byte) (cipher.Stream, error) -} - -func (c *streamCipherMode) createStream(key, iv []byte) (cipher.Stream, error) { - if len(key) < c.keySize { - panic("ssh: key length too small for cipher") - } - if len(iv) < c.ivSize { - panic("ssh: iv too small for cipher") - } - - stream, err := c.createFunc(key[:c.keySize], iv[:c.ivSize]) - if err != nil { - return nil, err - } - - var streamDump []byte - if c.skip > 0 { - streamDump = make([]byte, 512) - } - - for remainingToDump := c.skip; remainingToDump > 0; { - dumpThisTime := remainingToDump - if dumpThisTime > len(streamDump) { - dumpThisTime = len(streamDump) - } - stream.XORKeyStream(streamDump[:dumpThisTime], streamDump[:dumpThisTime]) - remainingToDump -= dumpThisTime - } - - return stream, nil -} - -// cipherModes documents properties of supported ciphers. Ciphers not included -// are not supported and will not be negotiated, even if explicitly requested in -// ClientConfig.Crypto.Ciphers. -var cipherModes = map[string]*streamCipherMode{ - // Ciphers from RFC4344, which introduced many CTR-based ciphers. Algorithms - // are defined in the order specified in the RFC. - "aes128-ctr": {16, aes.BlockSize, 0, newAESCTR}, - "aes192-ctr": {24, aes.BlockSize, 0, newAESCTR}, - "aes256-ctr": {32, aes.BlockSize, 0, newAESCTR}, - - // Ciphers from RFC4345, which introduces security-improved arcfour ciphers. - // They are defined in the order specified in the RFC. - "arcfour128": {16, 0, 1536, newRC4}, - "arcfour256": {32, 0, 1536, newRC4}, - - // Cipher defined in RFC 4253, which describes SSH Transport Layer Protocol. - // Note that this cipher is not safe, as stated in RFC 4253: "Arcfour (and - // RC4) has problems with weak keys, and should be used with caution." - // RFC4345 introduces improved versions of Arcfour. - "arcfour": {16, 0, 0, newRC4}, - - // AES-GCM is not a stream cipher, so it is constructed with a - // special case. If we add any more non-stream ciphers, we - // should invest a cleaner way to do this. - gcmCipherID: {16, 12, 0, nil}, - - // CBC mode is insecure and so is not included in the default config. - // (See http://www.isg.rhul.ac.uk/~kp/SandPfinal.pdf). If absolutely - // needed, it's possible to specify a custom Config to enable it. - // You should expect that an active attacker can recover plaintext if - // you do. - aes128cbcID: {16, aes.BlockSize, 0, nil}, - - // 3des-cbc is insecure and is disabled by default. - tripledescbcID: {24, des.BlockSize, 0, nil}, -} - -// prefixLen is the length of the packet prefix that contains the packet length -// and number of padding bytes. -const prefixLen = 5 - -// streamPacketCipher is a packetCipher using a stream cipher. -type streamPacketCipher struct { - mac hash.Hash - cipher cipher.Stream - etm bool - - // The following members are to avoid per-packet allocations. - prefix [prefixLen]byte - seqNumBytes [4]byte - padding [2 * packetSizeMultiple]byte - packetData []byte - macResult []byte -} - -// readPacket reads and decrypt a single packet from the reader argument. -func (s *streamPacketCipher) readPacket(seqNum uint32, r io.Reader) ([]byte, error) { - if _, err := io.ReadFull(r, s.prefix[:]); err != nil { - return nil, err - } - - var encryptedPaddingLength [1]byte - if s.mac != nil && s.etm { - copy(encryptedPaddingLength[:], s.prefix[4:5]) - s.cipher.XORKeyStream(s.prefix[4:5], s.prefix[4:5]) - } else { - s.cipher.XORKeyStream(s.prefix[:], s.prefix[:]) - } - - length := binary.BigEndian.Uint32(s.prefix[0:4]) - paddingLength := uint32(s.prefix[4]) - - var macSize uint32 - if s.mac != nil { - s.mac.Reset() - binary.BigEndian.PutUint32(s.seqNumBytes[:], seqNum) - s.mac.Write(s.seqNumBytes[:]) - if s.etm { - s.mac.Write(s.prefix[:4]) - s.mac.Write(encryptedPaddingLength[:]) - } else { - s.mac.Write(s.prefix[:]) - } - macSize = uint32(s.mac.Size()) - } - - if length <= paddingLength+1 { - return nil, errors.New("ssh: invalid packet length, packet too small") - } - - if length > maxPacket { - return nil, errors.New("ssh: invalid packet length, packet too large") - } - - // the maxPacket check above ensures that length-1+macSize - // does not overflow. - if uint32(cap(s.packetData)) < length-1+macSize { - s.packetData = make([]byte, length-1+macSize) - } else { - s.packetData = s.packetData[:length-1+macSize] - } - - if _, err := io.ReadFull(r, s.packetData); err != nil { - return nil, err - } - mac := s.packetData[length-1:] - data := s.packetData[:length-1] - - if s.mac != nil && s.etm { - s.mac.Write(data) - } - - s.cipher.XORKeyStream(data, data) - - if s.mac != nil { - if !s.etm { - s.mac.Write(data) - } - s.macResult = s.mac.Sum(s.macResult[:0]) - if subtle.ConstantTimeCompare(s.macResult, mac) != 1 { - return nil, errors.New("ssh: MAC failure") - } - } - - return s.packetData[:length-paddingLength-1], nil -} - -// writePacket encrypts and sends a packet of data to the writer argument -func (s *streamPacketCipher) writePacket(seqNum uint32, w io.Writer, rand io.Reader, packet []byte) error { - if len(packet) > maxPacket { - return errors.New("ssh: packet too large") - } - - aadlen := 0 - if s.mac != nil && s.etm { - // packet length is not encrypted for EtM modes - aadlen = 4 - } - - paddingLength := packetSizeMultiple - (prefixLen+len(packet)-aadlen)%packetSizeMultiple - if paddingLength < 4 { - paddingLength += packetSizeMultiple - } - - length := len(packet) + 1 + paddingLength - binary.BigEndian.PutUint32(s.prefix[:], uint32(length)) - s.prefix[4] = byte(paddingLength) - padding := s.padding[:paddingLength] - if _, err := io.ReadFull(rand, padding); err != nil { - return err - } - - if s.mac != nil { - s.mac.Reset() - binary.BigEndian.PutUint32(s.seqNumBytes[:], seqNum) - s.mac.Write(s.seqNumBytes[:]) - - if s.etm { - // For EtM algorithms, the packet length must stay unencrypted, - // but the following data (padding length) must be encrypted - s.cipher.XORKeyStream(s.prefix[4:5], s.prefix[4:5]) - } - - s.mac.Write(s.prefix[:]) - - if !s.etm { - // For non-EtM algorithms, the algorithm is applied on unencrypted data - s.mac.Write(packet) - s.mac.Write(padding) - } - } - - if !(s.mac != nil && s.etm) { - // For EtM algorithms, the padding length has already been encrypted - // and the packet length must remain unencrypted - s.cipher.XORKeyStream(s.prefix[:], s.prefix[:]) - } - - s.cipher.XORKeyStream(packet, packet) - s.cipher.XORKeyStream(padding, padding) - - if s.mac != nil && s.etm { - // For EtM algorithms, packet and padding must be encrypted - s.mac.Write(packet) - s.mac.Write(padding) - } - - if _, err := w.Write(s.prefix[:]); err != nil { - return err - } - if _, err := w.Write(packet); err != nil { - return err - } - if _, err := w.Write(padding); err != nil { - return err - } - - if s.mac != nil { - s.macResult = s.mac.Sum(s.macResult[:0]) - if _, err := w.Write(s.macResult); err != nil { - return err - } - } - - return nil -} - -type gcmCipher struct { - aead cipher.AEAD - prefix [4]byte - iv []byte - buf []byte -} - -func newGCMCipher(iv, key, macKey []byte) (packetCipher, error) { - c, err := aes.NewCipher(key) - if err != nil { - return nil, err - } - - aead, err := cipher.NewGCM(c) - if err != nil { - return nil, err - } - - return &gcmCipher{ - aead: aead, - iv: iv, - }, nil -} - -const gcmTagSize = 16 - -func (c *gcmCipher) writePacket(seqNum uint32, w io.Writer, rand io.Reader, packet []byte) error { - // Pad out to multiple of 16 bytes. This is different from the - // stream cipher because that encrypts the length too. - padding := byte(packetSizeMultiple - (1+len(packet))%packetSizeMultiple) - if padding < 4 { - padding += packetSizeMultiple - } - - length := uint32(len(packet) + int(padding) + 1) - binary.BigEndian.PutUint32(c.prefix[:], length) - if _, err := w.Write(c.prefix[:]); err != nil { - return err - } - - if cap(c.buf) < int(length) { - c.buf = make([]byte, length) - } else { - c.buf = c.buf[:length] - } - - c.buf[0] = padding - copy(c.buf[1:], packet) - if _, err := io.ReadFull(rand, c.buf[1+len(packet):]); err != nil { - return err - } - c.buf = c.aead.Seal(c.buf[:0], c.iv, c.buf, c.prefix[:]) - if _, err := w.Write(c.buf); err != nil { - return err - } - c.incIV() - - return nil -} - -func (c *gcmCipher) incIV() { - for i := 4 + 7; i >= 4; i-- { - c.iv[i]++ - if c.iv[i] != 0 { - break - } - } -} - -func (c *gcmCipher) readPacket(seqNum uint32, r io.Reader) ([]byte, error) { - if _, err := io.ReadFull(r, c.prefix[:]); err != nil { - return nil, err - } - length := binary.BigEndian.Uint32(c.prefix[:]) - if length > maxPacket { - return nil, errors.New("ssh: max packet length exceeded.") - } - - if cap(c.buf) < int(length+gcmTagSize) { - c.buf = make([]byte, length+gcmTagSize) - } else { - c.buf = c.buf[:length+gcmTagSize] - } - - if _, err := io.ReadFull(r, c.buf); err != nil { - return nil, err - } - - plain, err := c.aead.Open(c.buf[:0], c.iv, c.buf, c.prefix[:]) - if err != nil { - return nil, err - } - c.incIV() - - padding := plain[0] - if padding < 4 || padding >= 20 { - return nil, fmt.Errorf("ssh: illegal padding %d", padding) - } - - if int(padding+1) >= len(plain) { - return nil, fmt.Errorf("ssh: padding %d too large", padding) - } - plain = plain[1 : length-uint32(padding)] - return plain, nil -} - -// cbcCipher implements aes128-cbc cipher defined in RFC 4253 section 6.1 -type cbcCipher struct { - mac hash.Hash - macSize uint32 - decrypter cipher.BlockMode - encrypter cipher.BlockMode - - // The following members are to avoid per-packet allocations. - seqNumBytes [4]byte - packetData []byte - macResult []byte - - // Amount of data we should still read to hide which - // verification error triggered. - oracleCamouflage uint32 -} - -func newCBCCipher(c cipher.Block, iv, key, macKey []byte, algs directionAlgorithms) (packetCipher, error) { - cbc := &cbcCipher{ - mac: macModes[algs.MAC].new(macKey), - decrypter: cipher.NewCBCDecrypter(c, iv), - encrypter: cipher.NewCBCEncrypter(c, iv), - packetData: make([]byte, 1024), - } - if cbc.mac != nil { - cbc.macSize = uint32(cbc.mac.Size()) - } - - return cbc, nil -} - -func newAESCBCCipher(iv, key, macKey []byte, algs directionAlgorithms) (packetCipher, error) { - c, err := aes.NewCipher(key) - if err != nil { - return nil, err - } - - cbc, err := newCBCCipher(c, iv, key, macKey, algs) - if err != nil { - return nil, err - } - - return cbc, nil -} - -func newTripleDESCBCCipher(iv, key, macKey []byte, algs directionAlgorithms) (packetCipher, error) { - c, err := des.NewTripleDESCipher(key) - if err != nil { - return nil, err - } - - cbc, err := newCBCCipher(c, iv, key, macKey, algs) - if err != nil { - return nil, err - } - - return cbc, nil -} - -func maxUInt32(a, b int) uint32 { - if a > b { - return uint32(a) - } - return uint32(b) -} - -const ( - cbcMinPacketSizeMultiple = 8 - cbcMinPacketSize = 16 - cbcMinPaddingSize = 4 -) - -// cbcError represents a verification error that may leak information. -type cbcError string - -func (e cbcError) Error() string { return string(e) } - -func (c *cbcCipher) readPacket(seqNum uint32, r io.Reader) ([]byte, error) { - p, err := c.readPacketLeaky(seqNum, r) - if err != nil { - if _, ok := err.(cbcError); ok { - // Verification error: read a fixed amount of - // data, to make distinguishing between - // failing MAC and failing length check more - // difficult. - io.CopyN(ioutil.Discard, r, int64(c.oracleCamouflage)) - } - } - return p, err -} - -func (c *cbcCipher) readPacketLeaky(seqNum uint32, r io.Reader) ([]byte, error) { - blockSize := c.decrypter.BlockSize() - - // Read the header, which will include some of the subsequent data in the - // case of block ciphers - this is copied back to the payload later. - // How many bytes of payload/padding will be read with this first read. - firstBlockLength := uint32((prefixLen + blockSize - 1) / blockSize * blockSize) - firstBlock := c.packetData[:firstBlockLength] - if _, err := io.ReadFull(r, firstBlock); err != nil { - return nil, err - } - - c.oracleCamouflage = maxPacket + 4 + c.macSize - firstBlockLength - - c.decrypter.CryptBlocks(firstBlock, firstBlock) - length := binary.BigEndian.Uint32(firstBlock[:4]) - if length > maxPacket { - return nil, cbcError("ssh: packet too large") - } - if length+4 < maxUInt32(cbcMinPacketSize, blockSize) { - // The minimum size of a packet is 16 (or the cipher block size, whichever - // is larger) bytes. - return nil, cbcError("ssh: packet too small") - } - // The length of the packet (including the length field but not the MAC) must - // be a multiple of the block size or 8, whichever is larger. - if (length+4)%maxUInt32(cbcMinPacketSizeMultiple, blockSize) != 0 { - return nil, cbcError("ssh: invalid packet length multiple") - } - - paddingLength := uint32(firstBlock[4]) - if paddingLength < cbcMinPaddingSize || length <= paddingLength+1 { - return nil, cbcError("ssh: invalid packet length") - } - - // Positions within the c.packetData buffer: - macStart := 4 + length - paddingStart := macStart - paddingLength - - // Entire packet size, starting before length, ending at end of mac. - entirePacketSize := macStart + c.macSize - - // Ensure c.packetData is large enough for the entire packet data. - if uint32(cap(c.packetData)) < entirePacketSize { - // Still need to upsize and copy, but this should be rare at runtime, only - // on upsizing the packetData buffer. - c.packetData = make([]byte, entirePacketSize) - copy(c.packetData, firstBlock) - } else { - c.packetData = c.packetData[:entirePacketSize] - } - - if n, err := io.ReadFull(r, c.packetData[firstBlockLength:]); err != nil { - return nil, err - } else { - c.oracleCamouflage -= uint32(n) - } - - remainingCrypted := c.packetData[firstBlockLength:macStart] - c.decrypter.CryptBlocks(remainingCrypted, remainingCrypted) - - mac := c.packetData[macStart:] - if c.mac != nil { - c.mac.Reset() - binary.BigEndian.PutUint32(c.seqNumBytes[:], seqNum) - c.mac.Write(c.seqNumBytes[:]) - c.mac.Write(c.packetData[:macStart]) - c.macResult = c.mac.Sum(c.macResult[:0]) - if subtle.ConstantTimeCompare(c.macResult, mac) != 1 { - return nil, cbcError("ssh: MAC failure") - } - } - - return c.packetData[prefixLen:paddingStart], nil -} - -func (c *cbcCipher) writePacket(seqNum uint32, w io.Writer, rand io.Reader, packet []byte) error { - effectiveBlockSize := maxUInt32(cbcMinPacketSizeMultiple, c.encrypter.BlockSize()) - - // Length of encrypted portion of the packet (header, payload, padding). - // Enforce minimum padding and packet size. - encLength := maxUInt32(prefixLen+len(packet)+cbcMinPaddingSize, cbcMinPaddingSize) - // Enforce block size. - encLength = (encLength + effectiveBlockSize - 1) / effectiveBlockSize * effectiveBlockSize - - length := encLength - 4 - paddingLength := int(length) - (1 + len(packet)) - - // Overall buffer contains: header, payload, padding, mac. - // Space for the MAC is reserved in the capacity but not the slice length. - bufferSize := encLength + c.macSize - if uint32(cap(c.packetData)) < bufferSize { - c.packetData = make([]byte, encLength, bufferSize) - } else { - c.packetData = c.packetData[:encLength] - } - - p := c.packetData - - // Packet header. - binary.BigEndian.PutUint32(p, length) - p = p[4:] - p[0] = byte(paddingLength) - - // Payload. - p = p[1:] - copy(p, packet) - - // Padding. - p = p[len(packet):] - if _, err := io.ReadFull(rand, p); err != nil { - return err - } - - if c.mac != nil { - c.mac.Reset() - binary.BigEndian.PutUint32(c.seqNumBytes[:], seqNum) - c.mac.Write(c.seqNumBytes[:]) - c.mac.Write(c.packetData) - // The MAC is now appended into the capacity reserved for it earlier. - c.packetData = c.mac.Sum(c.packetData) - } - - c.encrypter.CryptBlocks(c.packetData[:encLength], c.packetData[:encLength]) - - if _, err := w.Write(c.packetData); err != nil { - return err - } - - return nil -} diff --git a/vendor/golang.org/x/crypto/ssh/cipher_test.go b/vendor/golang.org/x/crypto/ssh/cipher_test.go deleted file mode 100644 index 5cfa17a62..000000000 --- a/vendor/golang.org/x/crypto/ssh/cipher_test.go +++ /dev/null @@ -1,129 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssh - -import ( - "bytes" - "crypto" - "crypto/aes" - "crypto/rand" - "testing" -) - -func TestDefaultCiphersExist(t *testing.T) { - for _, cipherAlgo := range supportedCiphers { - if _, ok := cipherModes[cipherAlgo]; !ok { - t.Errorf("default cipher %q is unknown", cipherAlgo) - } - } -} - -func TestPacketCiphers(t *testing.T) { - // Still test aes128cbc cipher although it's commented out. - cipherModes[aes128cbcID] = &streamCipherMode{16, aes.BlockSize, 0, nil} - defer delete(cipherModes, aes128cbcID) - - for cipher := range cipherModes { - for mac := range macModes { - kr := &kexResult{Hash: crypto.SHA1} - algs := directionAlgorithms{ - Cipher: cipher, - MAC: mac, - Compression: "none", - } - client, err := newPacketCipher(clientKeys, algs, kr) - if err != nil { - t.Errorf("newPacketCipher(client, %q, %q): %v", cipher, mac, err) - continue - } - server, err := newPacketCipher(clientKeys, algs, kr) - if err != nil { - t.Errorf("newPacketCipher(client, %q, %q): %v", cipher, mac, err) - continue - } - - want := "bla bla" - input := []byte(want) - buf := &bytes.Buffer{} - if err := client.writePacket(0, buf, rand.Reader, input); err != nil { - t.Errorf("writePacket(%q, %q): %v", cipher, mac, err) - continue - } - - packet, err := server.readPacket(0, buf) - if err != nil { - t.Errorf("readPacket(%q, %q): %v", cipher, mac, err) - continue - } - - if string(packet) != want { - t.Errorf("roundtrip(%q, %q): got %q, want %q", cipher, mac, packet, want) - } - } - } -} - -func TestCBCOracleCounterMeasure(t *testing.T) { - cipherModes[aes128cbcID] = &streamCipherMode{16, aes.BlockSize, 0, nil} - defer delete(cipherModes, aes128cbcID) - - kr := &kexResult{Hash: crypto.SHA1} - algs := directionAlgorithms{ - Cipher: aes128cbcID, - MAC: "hmac-sha1", - Compression: "none", - } - client, err := newPacketCipher(clientKeys, algs, kr) - if err != nil { - t.Fatalf("newPacketCipher(client): %v", err) - } - - want := "bla bla" - input := []byte(want) - buf := &bytes.Buffer{} - if err := client.writePacket(0, buf, rand.Reader, input); err != nil { - t.Errorf("writePacket: %v", err) - } - - packetSize := buf.Len() - buf.Write(make([]byte, 2*maxPacket)) - - // We corrupt each byte, but this usually will only test the - // 'packet too large' or 'MAC failure' cases. - lastRead := -1 - for i := 0; i < packetSize; i++ { - server, err := newPacketCipher(clientKeys, algs, kr) - if err != nil { - t.Fatalf("newPacketCipher(client): %v", err) - } - - fresh := &bytes.Buffer{} - fresh.Write(buf.Bytes()) - fresh.Bytes()[i] ^= 0x01 - - before := fresh.Len() - _, err = server.readPacket(0, fresh) - if err == nil { - t.Errorf("corrupt byte %d: readPacket succeeded ", i) - continue - } - if _, ok := err.(cbcError); !ok { - t.Errorf("corrupt byte %d: got %v (%T), want cbcError", i, err, err) - continue - } - - after := fresh.Len() - bytesRead := before - after - if bytesRead < maxPacket { - t.Errorf("corrupt byte %d: read %d bytes, want more than %d", i, bytesRead, maxPacket) - continue - } - - if i > 0 && bytesRead != lastRead { - t.Errorf("corrupt byte %d: read %d bytes, want %d bytes read", i, bytesRead, lastRead) - } - lastRead = bytesRead - } -} diff --git a/vendor/golang.org/x/crypto/ssh/client.go b/vendor/golang.org/x/crypto/ssh/client.go deleted file mode 100644 index 667e37118..000000000 --- a/vendor/golang.org/x/crypto/ssh/client.go +++ /dev/null @@ -1,256 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssh - -import ( - "bytes" - "errors" - "fmt" - "net" - "sync" - "time" -) - -// Client implements a traditional SSH client that supports shells, -// subprocesses, port forwarding and tunneled dialing. -type Client struct { - Conn - - forwards forwardList // forwarded tcpip connections from the remote side - mu sync.Mutex - channelHandlers map[string]chan NewChannel -} - -// HandleChannelOpen returns a channel on which NewChannel requests -// for the given type are sent. If the type already is being handled, -// nil is returned. The channel is closed when the connection is closed. -func (c *Client) HandleChannelOpen(channelType string) <-chan NewChannel { - c.mu.Lock() - defer c.mu.Unlock() - if c.channelHandlers == nil { - // The SSH channel has been closed. - c := make(chan NewChannel) - close(c) - return c - } - - ch := c.channelHandlers[channelType] - if ch != nil { - return nil - } - - ch = make(chan NewChannel, chanSize) - c.channelHandlers[channelType] = ch - return ch -} - -// NewClient creates a Client on top of the given connection. -func NewClient(c Conn, chans <-chan NewChannel, reqs <-chan *Request) *Client { - conn := &Client{ - Conn: c, - channelHandlers: make(map[string]chan NewChannel, 1), - } - - go conn.handleGlobalRequests(reqs) - go conn.handleChannelOpens(chans) - go func() { - conn.Wait() - conn.forwards.closeAll() - }() - go conn.forwards.handleChannels(conn.HandleChannelOpen("forwarded-tcpip")) - return conn -} - -// NewClientConn establishes an authenticated SSH connection using c -// as the underlying transport. The Request and NewChannel channels -// must be serviced or the connection will hang. -func NewClientConn(c net.Conn, addr string, config *ClientConfig) (Conn, <-chan NewChannel, <-chan *Request, error) { - fullConf := *config - fullConf.SetDefaults() - if fullConf.HostKeyCallback == nil { - c.Close() - return nil, nil, nil, errors.New("ssh: must specify HostKeyCallback") - } - - conn := &connection{ - sshConn: sshConn{conn: c}, - } - - if err := conn.clientHandshake(addr, &fullConf); err != nil { - c.Close() - return nil, nil, nil, fmt.Errorf("ssh: handshake failed: %v", err) - } - conn.mux = newMux(conn.transport) - return conn, conn.mux.incomingChannels, conn.mux.incomingRequests, nil -} - -// clientHandshake performs the client side key exchange. See RFC 4253 Section -// 7. -func (c *connection) clientHandshake(dialAddress string, config *ClientConfig) error { - if config.ClientVersion != "" { - c.clientVersion = []byte(config.ClientVersion) - } else { - c.clientVersion = []byte(packageVersion) - } - var err error - c.serverVersion, err = exchangeVersions(c.sshConn.conn, c.clientVersion) - if err != nil { - return err - } - - c.transport = newClientTransport( - newTransport(c.sshConn.conn, config.Rand, true /* is client */), - c.clientVersion, c.serverVersion, config, dialAddress, c.sshConn.RemoteAddr()) - if err := c.transport.waitSession(); err != nil { - return err - } - - c.sessionID = c.transport.getSessionID() - return c.clientAuthenticate(config) -} - -// verifyHostKeySignature verifies the host key obtained in the key -// exchange. -func verifyHostKeySignature(hostKey PublicKey, result *kexResult) error { - sig, rest, ok := parseSignatureBody(result.Signature) - if len(rest) > 0 || !ok { - return errors.New("ssh: signature parse error") - } - - return hostKey.Verify(result.H, sig) -} - -// NewSession opens a new Session for this client. (A session is a remote -// execution of a program.) -func (c *Client) NewSession() (*Session, error) { - ch, in, err := c.OpenChannel("session", nil) - if err != nil { - return nil, err - } - return newSession(ch, in) -} - -func (c *Client) handleGlobalRequests(incoming <-chan *Request) { - for r := range incoming { - // This handles keepalive messages and matches - // the behaviour of OpenSSH. - r.Reply(false, nil) - } -} - -// handleChannelOpens channel open messages from the remote side. -func (c *Client) handleChannelOpens(in <-chan NewChannel) { - for ch := range in { - c.mu.Lock() - handler := c.channelHandlers[ch.ChannelType()] - c.mu.Unlock() - - if handler != nil { - handler <- ch - } else { - ch.Reject(UnknownChannelType, fmt.Sprintf("unknown channel type: %v", ch.ChannelType())) - } - } - - c.mu.Lock() - for _, ch := range c.channelHandlers { - close(ch) - } - c.channelHandlers = nil - c.mu.Unlock() -} - -// Dial starts a client connection to the given SSH server. It is a -// convenience function that connects to the given network address, -// initiates the SSH handshake, and then sets up a Client. For access -// to incoming channels and requests, use net.Dial with NewClientConn -// instead. -func Dial(network, addr string, config *ClientConfig) (*Client, error) { - conn, err := net.DialTimeout(network, addr, config.Timeout) - if err != nil { - return nil, err - } - c, chans, reqs, err := NewClientConn(conn, addr, config) - if err != nil { - return nil, err - } - return NewClient(c, chans, reqs), nil -} - -// HostKeyCallback is the function type used for verifying server -// keys. A HostKeyCallback must return nil if the host key is OK, or -// an error to reject it. It receives the hostname as passed to Dial -// or NewClientConn. The remote address is the RemoteAddr of the -// net.Conn underlying the the SSH connection. -type HostKeyCallback func(hostname string, remote net.Addr, key PublicKey) error - -// A ClientConfig structure is used to configure a Client. It must not be -// modified after having been passed to an SSH function. -type ClientConfig struct { - // Config contains configuration that is shared between clients and - // servers. - Config - - // User contains the username to authenticate as. - User string - - // Auth contains possible authentication methods to use with the - // server. Only the first instance of a particular RFC 4252 method will - // be used during authentication. - Auth []AuthMethod - - // HostKeyCallback is called during the cryptographic - // handshake to validate the server's host key. The client - // configuration must supply this callback for the connection - // to succeed. The functions InsecureIgnoreHostKey or - // FixedHostKey can be used for simplistic host key checks. - HostKeyCallback HostKeyCallback - - // ClientVersion contains the version identification string that will - // be used for the connection. If empty, a reasonable default is used. - ClientVersion string - - // HostKeyAlgorithms lists the key types that the client will - // accept from the server as host key, in order of - // preference. If empty, a reasonable default is used. Any - // string returned from PublicKey.Type method may be used, or - // any of the CertAlgoXxxx and KeyAlgoXxxx constants. - HostKeyAlgorithms []string - - // Timeout is the maximum amount of time for the TCP connection to establish. - // - // A Timeout of zero means no timeout. - Timeout time.Duration -} - -// InsecureIgnoreHostKey returns a function that can be used for -// ClientConfig.HostKeyCallback to accept any host key. It should -// not be used for production code. -func InsecureIgnoreHostKey() HostKeyCallback { - return func(hostname string, remote net.Addr, key PublicKey) error { - return nil - } -} - -type fixedHostKey struct { - key PublicKey -} - -func (f *fixedHostKey) check(hostname string, remote net.Addr, key PublicKey) error { - if f.key == nil { - return fmt.Errorf("ssh: required host key was nil") - } - if !bytes.Equal(key.Marshal(), f.key.Marshal()) { - return fmt.Errorf("ssh: host key mismatch") - } - return nil -} - -// FixedHostKey returns a function for use in -// ClientConfig.HostKeyCallback to accept only a specific host key. -func FixedHostKey(key PublicKey) HostKeyCallback { - hk := &fixedHostKey{key} - return hk.check -} diff --git a/vendor/golang.org/x/crypto/ssh/client_auth.go b/vendor/golang.org/x/crypto/ssh/client_auth.go deleted file mode 100644 index b882da086..000000000 --- a/vendor/golang.org/x/crypto/ssh/client_auth.go +++ /dev/null @@ -1,486 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssh - -import ( - "bytes" - "errors" - "fmt" - "io" -) - -// clientAuthenticate authenticates with the remote server. See RFC 4252. -func (c *connection) clientAuthenticate(config *ClientConfig) error { - // initiate user auth session - if err := c.transport.writePacket(Marshal(&serviceRequestMsg{serviceUserAuth})); err != nil { - return err - } - packet, err := c.transport.readPacket() - if err != nil { - return err - } - var serviceAccept serviceAcceptMsg - if err := Unmarshal(packet, &serviceAccept); err != nil { - return err - } - - // during the authentication phase the client first attempts the "none" method - // then any untried methods suggested by the server. - tried := make(map[string]bool) - var lastMethods []string - - sessionID := c.transport.getSessionID() - for auth := AuthMethod(new(noneAuth)); auth != nil; { - ok, methods, err := auth.auth(sessionID, config.User, c.transport, config.Rand) - if err != nil { - return err - } - if ok { - // success - return nil - } - tried[auth.method()] = true - if methods == nil { - methods = lastMethods - } - lastMethods = methods - - auth = nil - - findNext: - for _, a := range config.Auth { - candidateMethod := a.method() - if tried[candidateMethod] { - continue - } - for _, meth := range methods { - if meth == candidateMethod { - auth = a - break findNext - } - } - } - } - return fmt.Errorf("ssh: unable to authenticate, attempted methods %v, no supported methods remain", keys(tried)) -} - -func keys(m map[string]bool) []string { - s := make([]string, 0, len(m)) - - for key := range m { - s = append(s, key) - } - return s -} - -// An AuthMethod represents an instance of an RFC 4252 authentication method. -type AuthMethod interface { - // auth authenticates user over transport t. - // Returns true if authentication is successful. - // If authentication is not successful, a []string of alternative - // method names is returned. If the slice is nil, it will be ignored - // and the previous set of possible methods will be reused. - auth(session []byte, user string, p packetConn, rand io.Reader) (bool, []string, error) - - // method returns the RFC 4252 method name. - method() string -} - -// "none" authentication, RFC 4252 section 5.2. -type noneAuth int - -func (n *noneAuth) auth(session []byte, user string, c packetConn, rand io.Reader) (bool, []string, error) { - if err := c.writePacket(Marshal(&userAuthRequestMsg{ - User: user, - Service: serviceSSH, - Method: "none", - })); err != nil { - return false, nil, err - } - - return handleAuthResponse(c) -} - -func (n *noneAuth) method() string { - return "none" -} - -// passwordCallback is an AuthMethod that fetches the password through -// a function call, e.g. by prompting the user. -type passwordCallback func() (password string, err error) - -func (cb passwordCallback) auth(session []byte, user string, c packetConn, rand io.Reader) (bool, []string, error) { - type passwordAuthMsg struct { - User string `sshtype:"50"` - Service string - Method string - Reply bool - Password string - } - - pw, err := cb() - // REVIEW NOTE: is there a need to support skipping a password attempt? - // The program may only find out that the user doesn't have a password - // when prompting. - if err != nil { - return false, nil, err - } - - if err := c.writePacket(Marshal(&passwordAuthMsg{ - User: user, - Service: serviceSSH, - Method: cb.method(), - Reply: false, - Password: pw, - })); err != nil { - return false, nil, err - } - - return handleAuthResponse(c) -} - -func (cb passwordCallback) method() string { - return "password" -} - -// Password returns an AuthMethod using the given password. -func Password(secret string) AuthMethod { - return passwordCallback(func() (string, error) { return secret, nil }) -} - -// PasswordCallback returns an AuthMethod that uses a callback for -// fetching a password. -func PasswordCallback(prompt func() (secret string, err error)) AuthMethod { - return passwordCallback(prompt) -} - -type publickeyAuthMsg struct { - User string `sshtype:"50"` - Service string - Method string - // HasSig indicates to the receiver packet that the auth request is signed and - // should be used for authentication of the request. - HasSig bool - Algoname string - PubKey []byte - // Sig is tagged with "rest" so Marshal will exclude it during - // validateKey - Sig []byte `ssh:"rest"` -} - -// publicKeyCallback is an AuthMethod that uses a set of key -// pairs for authentication. -type publicKeyCallback func() ([]Signer, error) - -func (cb publicKeyCallback) method() string { - return "publickey" -} - -func (cb publicKeyCallback) auth(session []byte, user string, c packetConn, rand io.Reader) (bool, []string, error) { - // Authentication is performed by sending an enquiry to test if a key is - // acceptable to the remote. If the key is acceptable, the client will - // attempt to authenticate with the valid key. If not the client will repeat - // the process with the remaining keys. - - signers, err := cb() - if err != nil { - return false, nil, err - } - var methods []string - for _, signer := range signers { - ok, err := validateKey(signer.PublicKey(), user, c) - if err != nil { - return false, nil, err - } - if !ok { - continue - } - - pub := signer.PublicKey() - pubKey := pub.Marshal() - sign, err := signer.Sign(rand, buildDataSignedForAuth(session, userAuthRequestMsg{ - User: user, - Service: serviceSSH, - Method: cb.method(), - }, []byte(pub.Type()), pubKey)) - if err != nil { - return false, nil, err - } - - // manually wrap the serialized signature in a string - s := Marshal(sign) - sig := make([]byte, stringLength(len(s))) - marshalString(sig, s) - msg := publickeyAuthMsg{ - User: user, - Service: serviceSSH, - Method: cb.method(), - HasSig: true, - Algoname: pub.Type(), - PubKey: pubKey, - Sig: sig, - } - p := Marshal(&msg) - if err := c.writePacket(p); err != nil { - return false, nil, err - } - var success bool - success, methods, err = handleAuthResponse(c) - if err != nil { - return false, nil, err - } - - // If authentication succeeds or the list of available methods does not - // contain the "publickey" method, do not attempt to authenticate with any - // other keys. According to RFC 4252 Section 7, the latter can occur when - // additional authentication methods are required. - if success || !containsMethod(methods, cb.method()) { - return success, methods, err - } - } - - return false, methods, nil -} - -func containsMethod(methods []string, method string) bool { - for _, m := range methods { - if m == method { - return true - } - } - - return false -} - -// validateKey validates the key provided is acceptable to the server. -func validateKey(key PublicKey, user string, c packetConn) (bool, error) { - pubKey := key.Marshal() - msg := publickeyAuthMsg{ - User: user, - Service: serviceSSH, - Method: "publickey", - HasSig: false, - Algoname: key.Type(), - PubKey: pubKey, - } - if err := c.writePacket(Marshal(&msg)); err != nil { - return false, err - } - - return confirmKeyAck(key, c) -} - -func confirmKeyAck(key PublicKey, c packetConn) (bool, error) { - pubKey := key.Marshal() - algoname := key.Type() - - for { - packet, err := c.readPacket() - if err != nil { - return false, err - } - switch packet[0] { - case msgUserAuthBanner: - // TODO(gpaul): add callback to present the banner to the user - case msgUserAuthPubKeyOk: - var msg userAuthPubKeyOkMsg - if err := Unmarshal(packet, &msg); err != nil { - return false, err - } - if msg.Algo != algoname || !bytes.Equal(msg.PubKey, pubKey) { - return false, nil - } - return true, nil - case msgUserAuthFailure: - return false, nil - default: - return false, unexpectedMessageError(msgUserAuthSuccess, packet[0]) - } - } -} - -// PublicKeys returns an AuthMethod that uses the given key -// pairs. -func PublicKeys(signers ...Signer) AuthMethod { - return publicKeyCallback(func() ([]Signer, error) { return signers, nil }) -} - -// PublicKeysCallback returns an AuthMethod that runs the given -// function to obtain a list of key pairs. -func PublicKeysCallback(getSigners func() (signers []Signer, err error)) AuthMethod { - return publicKeyCallback(getSigners) -} - -// handleAuthResponse returns whether the preceding authentication request succeeded -// along with a list of remaining authentication methods to try next and -// an error if an unexpected response was received. -func handleAuthResponse(c packetConn) (bool, []string, error) { - for { - packet, err := c.readPacket() - if err != nil { - return false, nil, err - } - - switch packet[0] { - case msgUserAuthBanner: - // TODO: add callback to present the banner to the user - case msgUserAuthFailure: - var msg userAuthFailureMsg - if err := Unmarshal(packet, &msg); err != nil { - return false, nil, err - } - return false, msg.Methods, nil - case msgUserAuthSuccess: - return true, nil, nil - default: - return false, nil, unexpectedMessageError(msgUserAuthSuccess, packet[0]) - } - } -} - -// KeyboardInteractiveChallenge should print questions, optionally -// disabling echoing (e.g. for passwords), and return all the answers. -// Challenge may be called multiple times in a single session. After -// successful authentication, the server may send a challenge with no -// questions, for which the user and instruction messages should be -// printed. RFC 4256 section 3.3 details how the UI should behave for -// both CLI and GUI environments. -type KeyboardInteractiveChallenge func(user, instruction string, questions []string, echos []bool) (answers []string, err error) - -// KeyboardInteractive returns a AuthMethod using a prompt/response -// sequence controlled by the server. -func KeyboardInteractive(challenge KeyboardInteractiveChallenge) AuthMethod { - return challenge -} - -func (cb KeyboardInteractiveChallenge) method() string { - return "keyboard-interactive" -} - -func (cb KeyboardInteractiveChallenge) auth(session []byte, user string, c packetConn, rand io.Reader) (bool, []string, error) { - type initiateMsg struct { - User string `sshtype:"50"` - Service string - Method string - Language string - Submethods string - } - - if err := c.writePacket(Marshal(&initiateMsg{ - User: user, - Service: serviceSSH, - Method: "keyboard-interactive", - })); err != nil { - return false, nil, err - } - - for { - packet, err := c.readPacket() - if err != nil { - return false, nil, err - } - - // like handleAuthResponse, but with less options. - switch packet[0] { - case msgUserAuthBanner: - // TODO: Print banners during userauth. - continue - case msgUserAuthInfoRequest: - // OK - case msgUserAuthFailure: - var msg userAuthFailureMsg - if err := Unmarshal(packet, &msg); err != nil { - return false, nil, err - } - return false, msg.Methods, nil - case msgUserAuthSuccess: - return true, nil, nil - default: - return false, nil, unexpectedMessageError(msgUserAuthInfoRequest, packet[0]) - } - - var msg userAuthInfoRequestMsg - if err := Unmarshal(packet, &msg); err != nil { - return false, nil, err - } - - // Manually unpack the prompt/echo pairs. - rest := msg.Prompts - var prompts []string - var echos []bool - for i := 0; i < int(msg.NumPrompts); i++ { - prompt, r, ok := parseString(rest) - if !ok || len(r) == 0 { - return false, nil, errors.New("ssh: prompt format error") - } - prompts = append(prompts, string(prompt)) - echos = append(echos, r[0] != 0) - rest = r[1:] - } - - if len(rest) != 0 { - return false, nil, errors.New("ssh: extra data following keyboard-interactive pairs") - } - - answers, err := cb(msg.User, msg.Instruction, prompts, echos) - if err != nil { - return false, nil, err - } - - if len(answers) != len(prompts) { - return false, nil, errors.New("ssh: not enough answers from keyboard-interactive callback") - } - responseLength := 1 + 4 - for _, a := range answers { - responseLength += stringLength(len(a)) - } - serialized := make([]byte, responseLength) - p := serialized - p[0] = msgUserAuthInfoResponse - p = p[1:] - p = marshalUint32(p, uint32(len(answers))) - for _, a := range answers { - p = marshalString(p, []byte(a)) - } - - if err := c.writePacket(serialized); err != nil { - return false, nil, err - } - } -} - -type retryableAuthMethod struct { - authMethod AuthMethod - maxTries int -} - -func (r *retryableAuthMethod) auth(session []byte, user string, c packetConn, rand io.Reader) (ok bool, methods []string, err error) { - for i := 0; r.maxTries <= 0 || i < r.maxTries; i++ { - ok, methods, err = r.authMethod.auth(session, user, c, rand) - if ok || err != nil { // either success or error terminate - return ok, methods, err - } - } - return ok, methods, err -} - -func (r *retryableAuthMethod) method() string { - return r.authMethod.method() -} - -// RetryableAuthMethod is a decorator for other auth methods enabling them to -// be retried up to maxTries before considering that AuthMethod itself failed. -// If maxTries is <= 0, will retry indefinitely -// -// This is useful for interactive clients using challenge/response type -// authentication (e.g. Keyboard-Interactive, Password, etc) where the user -// could mistype their response resulting in the server issuing a -// SSH_MSG_USERAUTH_FAILURE (rfc4252 #8 [password] and rfc4256 #3.4 -// [keyboard-interactive]); Without this decorator, the non-retryable -// AuthMethod would be removed from future consideration, and never tried again -// (and so the user would never be able to retry their entry). -func RetryableAuthMethod(auth AuthMethod, maxTries int) AuthMethod { - return &retryableAuthMethod{authMethod: auth, maxTries: maxTries} -} diff --git a/vendor/golang.org/x/crypto/ssh/client_auth_test.go b/vendor/golang.org/x/crypto/ssh/client_auth_test.go deleted file mode 100644 index b526f6625..000000000 --- a/vendor/golang.org/x/crypto/ssh/client_auth_test.go +++ /dev/null @@ -1,484 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssh - -import ( - "bytes" - "crypto/rand" - "errors" - "fmt" - "os" - "strings" - "testing" -) - -type keyboardInteractive map[string]string - -func (cr keyboardInteractive) Challenge(user string, instruction string, questions []string, echos []bool) ([]string, error) { - var answers []string - for _, q := range questions { - answers = append(answers, cr[q]) - } - return answers, nil -} - -// reused internally by tests -var clientPassword = "tiger" - -// tryAuth runs a handshake with a given config against an SSH server -// with config serverConfig -func tryAuth(t *testing.T, config *ClientConfig) error { - c1, c2, err := netPipe() - if err != nil { - t.Fatalf("netPipe: %v", err) - } - defer c1.Close() - defer c2.Close() - - certChecker := CertChecker{ - IsAuthority: func(k PublicKey) bool { - return bytes.Equal(k.Marshal(), testPublicKeys["ecdsa"].Marshal()) - }, - UserKeyFallback: func(conn ConnMetadata, key PublicKey) (*Permissions, error) { - if conn.User() == "testuser" && bytes.Equal(key.Marshal(), testPublicKeys["rsa"].Marshal()) { - return nil, nil - } - - return nil, fmt.Errorf("pubkey for %q not acceptable", conn.User()) - }, - IsRevoked: func(c *Certificate) bool { - return c.Serial == 666 - }, - } - - serverConfig := &ServerConfig{ - PasswordCallback: func(conn ConnMetadata, pass []byte) (*Permissions, error) { - if conn.User() == "testuser" && string(pass) == clientPassword { - return nil, nil - } - return nil, errors.New("password auth failed") - }, - PublicKeyCallback: certChecker.Authenticate, - KeyboardInteractiveCallback: func(conn ConnMetadata, challenge KeyboardInteractiveChallenge) (*Permissions, error) { - ans, err := challenge("user", - "instruction", - []string{"question1", "question2"}, - []bool{true, true}) - if err != nil { - return nil, err - } - ok := conn.User() == "testuser" && ans[0] == "answer1" && ans[1] == "answer2" - if ok { - challenge("user", "motd", nil, nil) - return nil, nil - } - return nil, errors.New("keyboard-interactive failed") - }, - AuthLogCallback: func(conn ConnMetadata, method string, err error) { - }, - } - serverConfig.AddHostKey(testSigners["rsa"]) - - go newServer(c1, serverConfig) - _, _, _, err = NewClientConn(c2, "", config) - return err -} - -func TestClientAuthPublicKey(t *testing.T) { - config := &ClientConfig{ - User: "testuser", - Auth: []AuthMethod{ - PublicKeys(testSigners["rsa"]), - }, - HostKeyCallback: InsecureIgnoreHostKey(), - } - if err := tryAuth(t, config); err != nil { - t.Fatalf("unable to dial remote side: %s", err) - } -} - -func TestAuthMethodPassword(t *testing.T) { - config := &ClientConfig{ - User: "testuser", - Auth: []AuthMethod{ - Password(clientPassword), - }, - HostKeyCallback: InsecureIgnoreHostKey(), - } - - if err := tryAuth(t, config); err != nil { - t.Fatalf("unable to dial remote side: %s", err) - } -} - -func TestAuthMethodFallback(t *testing.T) { - var passwordCalled bool - config := &ClientConfig{ - User: "testuser", - Auth: []AuthMethod{ - PublicKeys(testSigners["rsa"]), - PasswordCallback( - func() (string, error) { - passwordCalled = true - return "WRONG", nil - }), - }, - HostKeyCallback: InsecureIgnoreHostKey(), - } - - if err := tryAuth(t, config); err != nil { - t.Fatalf("unable to dial remote side: %s", err) - } - - if passwordCalled { - t.Errorf("password auth tried before public-key auth.") - } -} - -func TestAuthMethodWrongPassword(t *testing.T) { - config := &ClientConfig{ - User: "testuser", - Auth: []AuthMethod{ - Password("wrong"), - PublicKeys(testSigners["rsa"]), - }, - HostKeyCallback: InsecureIgnoreHostKey(), - } - - if err := tryAuth(t, config); err != nil { - t.Fatalf("unable to dial remote side: %s", err) - } -} - -func TestAuthMethodKeyboardInteractive(t *testing.T) { - answers := keyboardInteractive(map[string]string{ - "question1": "answer1", - "question2": "answer2", - }) - config := &ClientConfig{ - User: "testuser", - Auth: []AuthMethod{ - KeyboardInteractive(answers.Challenge), - }, - HostKeyCallback: InsecureIgnoreHostKey(), - } - - if err := tryAuth(t, config); err != nil { - t.Fatalf("unable to dial remote side: %s", err) - } -} - -func TestAuthMethodWrongKeyboardInteractive(t *testing.T) { - answers := keyboardInteractive(map[string]string{ - "question1": "answer1", - "question2": "WRONG", - }) - config := &ClientConfig{ - User: "testuser", - Auth: []AuthMethod{ - KeyboardInteractive(answers.Challenge), - }, - } - - if err := tryAuth(t, config); err == nil { - t.Fatalf("wrong answers should not have authenticated with KeyboardInteractive") - } -} - -// the mock server will only authenticate ssh-rsa keys -func TestAuthMethodInvalidPublicKey(t *testing.T) { - config := &ClientConfig{ - User: "testuser", - Auth: []AuthMethod{ - PublicKeys(testSigners["dsa"]), - }, - } - - if err := tryAuth(t, config); err == nil { - t.Fatalf("dsa private key should not have authenticated with rsa public key") - } -} - -// the client should authenticate with the second key -func TestAuthMethodRSAandDSA(t *testing.T) { - config := &ClientConfig{ - User: "testuser", - Auth: []AuthMethod{ - PublicKeys(testSigners["dsa"], testSigners["rsa"]), - }, - HostKeyCallback: InsecureIgnoreHostKey(), - } - if err := tryAuth(t, config); err != nil { - t.Fatalf("client could not authenticate with rsa key: %v", err) - } -} - -func TestClientHMAC(t *testing.T) { - for _, mac := range supportedMACs { - config := &ClientConfig{ - User: "testuser", - Auth: []AuthMethod{ - PublicKeys(testSigners["rsa"]), - }, - Config: Config{ - MACs: []string{mac}, - }, - HostKeyCallback: InsecureIgnoreHostKey(), - } - if err := tryAuth(t, config); err != nil { - t.Fatalf("client could not authenticate with mac algo %s: %v", mac, err) - } - } -} - -// issue 4285. -func TestClientUnsupportedCipher(t *testing.T) { - config := &ClientConfig{ - User: "testuser", - Auth: []AuthMethod{ - PublicKeys(), - }, - Config: Config{ - Ciphers: []string{"aes128-cbc"}, // not currently supported - }, - } - if err := tryAuth(t, config); err == nil { - t.Errorf("expected no ciphers in common") - } -} - -func TestClientUnsupportedKex(t *testing.T) { - if os.Getenv("GO_BUILDER_NAME") != "" { - t.Skip("skipping known-flaky test on the Go build dashboard; see golang.org/issue/15198") - } - config := &ClientConfig{ - User: "testuser", - Auth: []AuthMethod{ - PublicKeys(), - }, - Config: Config{ - KeyExchanges: []string{"diffie-hellman-group-exchange-sha256"}, // not currently supported - }, - HostKeyCallback: InsecureIgnoreHostKey(), - } - if err := tryAuth(t, config); err == nil || !strings.Contains(err.Error(), "common algorithm") { - t.Errorf("got %v, expected 'common algorithm'", err) - } -} - -func TestClientLoginCert(t *testing.T) { - cert := &Certificate{ - Key: testPublicKeys["rsa"], - ValidBefore: CertTimeInfinity, - CertType: UserCert, - } - cert.SignCert(rand.Reader, testSigners["ecdsa"]) - certSigner, err := NewCertSigner(cert, testSigners["rsa"]) - if err != nil { - t.Fatalf("NewCertSigner: %v", err) - } - - clientConfig := &ClientConfig{ - User: "user", - HostKeyCallback: InsecureIgnoreHostKey(), - } - clientConfig.Auth = append(clientConfig.Auth, PublicKeys(certSigner)) - - // should succeed - if err := tryAuth(t, clientConfig); err != nil { - t.Errorf("cert login failed: %v", err) - } - - // corrupted signature - cert.Signature.Blob[0]++ - if err := tryAuth(t, clientConfig); err == nil { - t.Errorf("cert login passed with corrupted sig") - } - - // revoked - cert.Serial = 666 - cert.SignCert(rand.Reader, testSigners["ecdsa"]) - if err := tryAuth(t, clientConfig); err == nil { - t.Errorf("revoked cert login succeeded") - } - cert.Serial = 1 - - // sign with wrong key - cert.SignCert(rand.Reader, testSigners["dsa"]) - if err := tryAuth(t, clientConfig); err == nil { - t.Errorf("cert login passed with non-authoritative key") - } - - // host cert - cert.CertType = HostCert - cert.SignCert(rand.Reader, testSigners["ecdsa"]) - if err := tryAuth(t, clientConfig); err == nil { - t.Errorf("cert login passed with wrong type") - } - cert.CertType = UserCert - - // principal specified - cert.ValidPrincipals = []string{"user"} - cert.SignCert(rand.Reader, testSigners["ecdsa"]) - if err := tryAuth(t, clientConfig); err != nil { - t.Errorf("cert login failed: %v", err) - } - - // wrong principal specified - cert.ValidPrincipals = []string{"fred"} - cert.SignCert(rand.Reader, testSigners["ecdsa"]) - if err := tryAuth(t, clientConfig); err == nil { - t.Errorf("cert login passed with wrong principal") - } - cert.ValidPrincipals = nil - - // added critical option - cert.CriticalOptions = map[string]string{"root-access": "yes"} - cert.SignCert(rand.Reader, testSigners["ecdsa"]) - if err := tryAuth(t, clientConfig); err == nil { - t.Errorf("cert login passed with unrecognized critical option") - } - - // allowed source address - cert.CriticalOptions = map[string]string{"source-address": "127.0.0.42/24,::42/120"} - cert.SignCert(rand.Reader, testSigners["ecdsa"]) - if err := tryAuth(t, clientConfig); err != nil { - t.Errorf("cert login with source-address failed: %v", err) - } - - // disallowed source address - cert.CriticalOptions = map[string]string{"source-address": "127.0.0.42,::42"} - cert.SignCert(rand.Reader, testSigners["ecdsa"]) - if err := tryAuth(t, clientConfig); err == nil { - t.Errorf("cert login with source-address succeeded") - } -} - -func testPermissionsPassing(withPermissions bool, t *testing.T) { - serverConfig := &ServerConfig{ - PublicKeyCallback: func(conn ConnMetadata, key PublicKey) (*Permissions, error) { - if conn.User() == "nopermissions" { - return nil, nil - } else { - return &Permissions{}, nil - } - }, - } - serverConfig.AddHostKey(testSigners["rsa"]) - - clientConfig := &ClientConfig{ - Auth: []AuthMethod{ - PublicKeys(testSigners["rsa"]), - }, - HostKeyCallback: InsecureIgnoreHostKey(), - } - if withPermissions { - clientConfig.User = "permissions" - } else { - clientConfig.User = "nopermissions" - } - - c1, c2, err := netPipe() - if err != nil { - t.Fatalf("netPipe: %v", err) - } - defer c1.Close() - defer c2.Close() - - go NewClientConn(c2, "", clientConfig) - serverConn, err := newServer(c1, serverConfig) - if err != nil { - t.Fatal(err) - } - if p := serverConn.Permissions; (p != nil) != withPermissions { - t.Fatalf("withPermissions is %t, but Permissions object is %#v", withPermissions, p) - } -} - -func TestPermissionsPassing(t *testing.T) { - testPermissionsPassing(true, t) -} - -func TestNoPermissionsPassing(t *testing.T) { - testPermissionsPassing(false, t) -} - -func TestRetryableAuth(t *testing.T) { - n := 0 - passwords := []string{"WRONG1", "WRONG2"} - - config := &ClientConfig{ - User: "testuser", - Auth: []AuthMethod{ - RetryableAuthMethod(PasswordCallback(func() (string, error) { - p := passwords[n] - n++ - return p, nil - }), 2), - PublicKeys(testSigners["rsa"]), - }, - HostKeyCallback: InsecureIgnoreHostKey(), - } - - if err := tryAuth(t, config); err != nil { - t.Fatalf("unable to dial remote side: %s", err) - } - if n != 2 { - t.Fatalf("Did not try all passwords") - } -} - -func ExampleRetryableAuthMethod(t *testing.T) { - user := "testuser" - NumberOfPrompts := 3 - - // Normally this would be a callback that prompts the user to answer the - // provided questions - Cb := func(user, instruction string, questions []string, echos []bool) (answers []string, err error) { - return []string{"answer1", "answer2"}, nil - } - - config := &ClientConfig{ - HostKeyCallback: InsecureIgnoreHostKey(), - User: user, - Auth: []AuthMethod{ - RetryableAuthMethod(KeyboardInteractiveChallenge(Cb), NumberOfPrompts), - }, - } - - if err := tryAuth(t, config); err != nil { - t.Fatalf("unable to dial remote side: %s", err) - } -} - -// Test if username is received on server side when NoClientAuth is used -func TestClientAuthNone(t *testing.T) { - user := "testuser" - serverConfig := &ServerConfig{ - NoClientAuth: true, - } - serverConfig.AddHostKey(testSigners["rsa"]) - - clientConfig := &ClientConfig{ - User: user, - HostKeyCallback: InsecureIgnoreHostKey(), - } - - c1, c2, err := netPipe() - if err != nil { - t.Fatalf("netPipe: %v", err) - } - defer c1.Close() - defer c2.Close() - - go NewClientConn(c2, "", clientConfig) - serverConn, err := newServer(c1, serverConfig) - if err != nil { - t.Fatalf("newServer: %v", err) - } - if serverConn.User() != user { - t.Fatalf("server: got %q, want %q", serverConn.User(), user) - } -} diff --git a/vendor/golang.org/x/crypto/ssh/client_test.go b/vendor/golang.org/x/crypto/ssh/client_test.go deleted file mode 100644 index ccf56074d..000000000 --- a/vendor/golang.org/x/crypto/ssh/client_test.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssh - -import ( - "net" - "strings" - "testing" -) - -func testClientVersion(t *testing.T, config *ClientConfig, expected string) { - clientConn, serverConn := net.Pipe() - defer clientConn.Close() - receivedVersion := make(chan string, 1) - config.HostKeyCallback = InsecureIgnoreHostKey() - go func() { - version, err := readVersion(serverConn) - if err != nil { - receivedVersion <- "" - } else { - receivedVersion <- string(version) - } - serverConn.Close() - }() - NewClientConn(clientConn, "", config) - actual := <-receivedVersion - if actual != expected { - t.Fatalf("got %s; want %s", actual, expected) - } -} - -func TestCustomClientVersion(t *testing.T) { - version := "Test-Client-Version-0.0" - testClientVersion(t, &ClientConfig{ClientVersion: version}, version) -} - -func TestDefaultClientVersion(t *testing.T) { - testClientVersion(t, &ClientConfig{}, packageVersion) -} - -func TestHostKeyCheck(t *testing.T) { - for _, tt := range []struct { - name string - wantError string - key PublicKey - }{ - {"no callback", "must specify HostKeyCallback", nil}, - {"correct key", "", testSigners["rsa"].PublicKey()}, - {"mismatch", "mismatch", testSigners["ecdsa"].PublicKey()}, - } { - c1, c2, err := netPipe() - if err != nil { - t.Fatalf("netPipe: %v", err) - } - defer c1.Close() - defer c2.Close() - serverConf := &ServerConfig{ - NoClientAuth: true, - } - serverConf.AddHostKey(testSigners["rsa"]) - - go NewServerConn(c1, serverConf) - clientConf := ClientConfig{ - User: "user", - } - if tt.key != nil { - clientConf.HostKeyCallback = FixedHostKey(tt.key) - } - - _, _, _, err = NewClientConn(c2, "", &clientConf) - if err != nil { - if tt.wantError == "" || !strings.Contains(err.Error(), tt.wantError) { - t.Errorf("%s: got error %q, missing %q", tt.name, err.Error(), tt.wantError) - } - } else if tt.wantError != "" { - t.Errorf("%s: succeeded, but want error string %q", tt.name, tt.wantError) - } - } -} diff --git a/vendor/golang.org/x/crypto/ssh/common.go b/vendor/golang.org/x/crypto/ssh/common.go deleted file mode 100644 index dc39e4d23..000000000 --- a/vendor/golang.org/x/crypto/ssh/common.go +++ /dev/null @@ -1,373 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssh - -import ( - "crypto" - "crypto/rand" - "fmt" - "io" - "math" - "sync" - - _ "crypto/sha1" - _ "crypto/sha256" - _ "crypto/sha512" -) - -// These are string constants in the SSH protocol. -const ( - compressionNone = "none" - serviceUserAuth = "ssh-userauth" - serviceSSH = "ssh-connection" -) - -// supportedCiphers specifies the supported ciphers in preference order. -var supportedCiphers = []string{ - "aes128-ctr", "aes192-ctr", "aes256-ctr", - "aes128-gcm@openssh.com", - "arcfour256", "arcfour128", -} - -// supportedKexAlgos specifies the supported key-exchange algorithms in -// preference order. -var supportedKexAlgos = []string{ - kexAlgoCurve25519SHA256, - // P384 and P521 are not constant-time yet, but since we don't - // reuse ephemeral keys, using them for ECDH should be OK. - kexAlgoECDH256, kexAlgoECDH384, kexAlgoECDH521, - kexAlgoDH14SHA1, kexAlgoDH1SHA1, -} - -// supportedHostKeyAlgos specifies the supported host-key algorithms (i.e. methods -// of authenticating servers) in preference order. -var supportedHostKeyAlgos = []string{ - CertAlgoRSAv01, CertAlgoDSAv01, CertAlgoECDSA256v01, - CertAlgoECDSA384v01, CertAlgoECDSA521v01, CertAlgoED25519v01, - - KeyAlgoECDSA256, KeyAlgoECDSA384, KeyAlgoECDSA521, - KeyAlgoRSA, KeyAlgoDSA, - - KeyAlgoED25519, -} - -// supportedMACs specifies a default set of MAC algorithms in preference order. -// This is based on RFC 4253, section 6.4, but with hmac-md5 variants removed -// because they have reached the end of their useful life. -var supportedMACs = []string{ - "hmac-sha2-256-etm@openssh.com", "hmac-sha2-256", "hmac-sha1", "hmac-sha1-96", -} - -var supportedCompressions = []string{compressionNone} - -// hashFuncs keeps the mapping of supported algorithms to their respective -// hashes needed for signature verification. -var hashFuncs = map[string]crypto.Hash{ - KeyAlgoRSA: crypto.SHA1, - KeyAlgoDSA: crypto.SHA1, - KeyAlgoECDSA256: crypto.SHA256, - KeyAlgoECDSA384: crypto.SHA384, - KeyAlgoECDSA521: crypto.SHA512, - CertAlgoRSAv01: crypto.SHA1, - CertAlgoDSAv01: crypto.SHA1, - CertAlgoECDSA256v01: crypto.SHA256, - CertAlgoECDSA384v01: crypto.SHA384, - CertAlgoECDSA521v01: crypto.SHA512, -} - -// unexpectedMessageError results when the SSH message that we received didn't -// match what we wanted. -func unexpectedMessageError(expected, got uint8) error { - return fmt.Errorf("ssh: unexpected message type %d (expected %d)", got, expected) -} - -// parseError results from a malformed SSH message. -func parseError(tag uint8) error { - return fmt.Errorf("ssh: parse error in message type %d", tag) -} - -func findCommon(what string, client []string, server []string) (common string, err error) { - for _, c := range client { - for _, s := range server { - if c == s { - return c, nil - } - } - } - return "", fmt.Errorf("ssh: no common algorithm for %s; client offered: %v, server offered: %v", what, client, server) -} - -type directionAlgorithms struct { - Cipher string - MAC string - Compression string -} - -// rekeyBytes returns a rekeying intervals in bytes. -func (a *directionAlgorithms) rekeyBytes() int64 { - // According to RFC4344 block ciphers should rekey after - // 2^(BLOCKSIZE/4) blocks. For all AES flavors BLOCKSIZE is - // 128. - switch a.Cipher { - case "aes128-ctr", "aes192-ctr", "aes256-ctr", gcmCipherID, aes128cbcID: - return 16 * (1 << 32) - - } - - // For others, stick with RFC4253 recommendation to rekey after 1 Gb of data. - return 1 << 30 -} - -type algorithms struct { - kex string - hostKey string - w directionAlgorithms - r directionAlgorithms -} - -func findAgreedAlgorithms(clientKexInit, serverKexInit *kexInitMsg) (algs *algorithms, err error) { - result := &algorithms{} - - result.kex, err = findCommon("key exchange", clientKexInit.KexAlgos, serverKexInit.KexAlgos) - if err != nil { - return - } - - result.hostKey, err = findCommon("host key", clientKexInit.ServerHostKeyAlgos, serverKexInit.ServerHostKeyAlgos) - if err != nil { - return - } - - result.w.Cipher, err = findCommon("client to server cipher", clientKexInit.CiphersClientServer, serverKexInit.CiphersClientServer) - if err != nil { - return - } - - result.r.Cipher, err = findCommon("server to client cipher", clientKexInit.CiphersServerClient, serverKexInit.CiphersServerClient) - if err != nil { - return - } - - result.w.MAC, err = findCommon("client to server MAC", clientKexInit.MACsClientServer, serverKexInit.MACsClientServer) - if err != nil { - return - } - - result.r.MAC, err = findCommon("server to client MAC", clientKexInit.MACsServerClient, serverKexInit.MACsServerClient) - if err != nil { - return - } - - result.w.Compression, err = findCommon("client to server compression", clientKexInit.CompressionClientServer, serverKexInit.CompressionClientServer) - if err != nil { - return - } - - result.r.Compression, err = findCommon("server to client compression", clientKexInit.CompressionServerClient, serverKexInit.CompressionServerClient) - if err != nil { - return - } - - return result, nil -} - -// If rekeythreshold is too small, we can't make any progress sending -// stuff. -const minRekeyThreshold uint64 = 256 - -// Config contains configuration data common to both ServerConfig and -// ClientConfig. -type Config struct { - // Rand provides the source of entropy for cryptographic - // primitives. If Rand is nil, the cryptographic random reader - // in package crypto/rand will be used. - Rand io.Reader - - // The maximum number of bytes sent or received after which a - // new key is negotiated. It must be at least 256. If - // unspecified, a size suitable for the chosen cipher is used. - RekeyThreshold uint64 - - // The allowed key exchanges algorithms. If unspecified then a - // default set of algorithms is used. - KeyExchanges []string - - // The allowed cipher algorithms. If unspecified then a sensible - // default is used. - Ciphers []string - - // The allowed MAC algorithms. If unspecified then a sensible default - // is used. - MACs []string -} - -// SetDefaults sets sensible values for unset fields in config. This is -// exported for testing: Configs passed to SSH functions are copied and have -// default values set automatically. -func (c *Config) SetDefaults() { - if c.Rand == nil { - c.Rand = rand.Reader - } - if c.Ciphers == nil { - c.Ciphers = supportedCiphers - } - var ciphers []string - for _, c := range c.Ciphers { - if cipherModes[c] != nil { - // reject the cipher if we have no cipherModes definition - ciphers = append(ciphers, c) - } - } - c.Ciphers = ciphers - - if c.KeyExchanges == nil { - c.KeyExchanges = supportedKexAlgos - } - - if c.MACs == nil { - c.MACs = supportedMACs - } - - if c.RekeyThreshold == 0 { - // cipher specific default - } else if c.RekeyThreshold < minRekeyThreshold { - c.RekeyThreshold = minRekeyThreshold - } else if c.RekeyThreshold >= math.MaxInt64 { - // Avoid weirdness if somebody uses -1 as a threshold. - c.RekeyThreshold = math.MaxInt64 - } -} - -// buildDataSignedForAuth returns the data that is signed in order to prove -// possession of a private key. See RFC 4252, section 7. -func buildDataSignedForAuth(sessionId []byte, req userAuthRequestMsg, algo, pubKey []byte) []byte { - data := struct { - Session []byte - Type byte - User string - Service string - Method string - Sign bool - Algo []byte - PubKey []byte - }{ - sessionId, - msgUserAuthRequest, - req.User, - req.Service, - req.Method, - true, - algo, - pubKey, - } - return Marshal(data) -} - -func appendU16(buf []byte, n uint16) []byte { - return append(buf, byte(n>>8), byte(n)) -} - -func appendU32(buf []byte, n uint32) []byte { - return append(buf, byte(n>>24), byte(n>>16), byte(n>>8), byte(n)) -} - -func appendU64(buf []byte, n uint64) []byte { - return append(buf, - byte(n>>56), byte(n>>48), byte(n>>40), byte(n>>32), - byte(n>>24), byte(n>>16), byte(n>>8), byte(n)) -} - -func appendInt(buf []byte, n int) []byte { - return appendU32(buf, uint32(n)) -} - -func appendString(buf []byte, s string) []byte { - buf = appendU32(buf, uint32(len(s))) - buf = append(buf, s...) - return buf -} - -func appendBool(buf []byte, b bool) []byte { - if b { - return append(buf, 1) - } - return append(buf, 0) -} - -// newCond is a helper to hide the fact that there is no usable zero -// value for sync.Cond. -func newCond() *sync.Cond { return sync.NewCond(new(sync.Mutex)) } - -// window represents the buffer available to clients -// wishing to write to a channel. -type window struct { - *sync.Cond - win uint32 // RFC 4254 5.2 says the window size can grow to 2^32-1 - writeWaiters int - closed bool -} - -// add adds win to the amount of window available -// for consumers. -func (w *window) add(win uint32) bool { - // a zero sized window adjust is a noop. - if win == 0 { - return true - } - w.L.Lock() - if w.win+win < win { - w.L.Unlock() - return false - } - w.win += win - // It is unusual that multiple goroutines would be attempting to reserve - // window space, but not guaranteed. Use broadcast to notify all waiters - // that additional window is available. - w.Broadcast() - w.L.Unlock() - return true -} - -// close sets the window to closed, so all reservations fail -// immediately. -func (w *window) close() { - w.L.Lock() - w.closed = true - w.Broadcast() - w.L.Unlock() -} - -// reserve reserves win from the available window capacity. -// If no capacity remains, reserve will block. reserve may -// return less than requested. -func (w *window) reserve(win uint32) (uint32, error) { - var err error - w.L.Lock() - w.writeWaiters++ - w.Broadcast() - for w.win == 0 && !w.closed { - w.Wait() - } - w.writeWaiters-- - if w.win < win { - win = w.win - } - w.win -= win - if w.closed { - err = io.EOF - } - w.L.Unlock() - return win, err -} - -// waitWriterBlocked waits until some goroutine is blocked for further -// writes. It is used in tests only. -func (w *window) waitWriterBlocked() { - w.Cond.L.Lock() - for w.writeWaiters == 0 { - w.Cond.Wait() - } - w.Cond.L.Unlock() -} diff --git a/vendor/golang.org/x/crypto/ssh/connection.go b/vendor/golang.org/x/crypto/ssh/connection.go deleted file mode 100644 index e786f2f9a..000000000 --- a/vendor/golang.org/x/crypto/ssh/connection.go +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssh - -import ( - "fmt" - "net" -) - -// OpenChannelError is returned if the other side rejects an -// OpenChannel request. -type OpenChannelError struct { - Reason RejectionReason - Message string -} - -func (e *OpenChannelError) Error() string { - return fmt.Sprintf("ssh: rejected: %s (%s)", e.Reason, e.Message) -} - -// ConnMetadata holds metadata for the connection. -type ConnMetadata interface { - // User returns the user ID for this connection. - User() string - - // SessionID returns the sesson hash, also denoted by H. - SessionID() []byte - - // ClientVersion returns the client's version string as hashed - // into the session ID. - ClientVersion() []byte - - // ServerVersion returns the server's version string as hashed - // into the session ID. - ServerVersion() []byte - - // RemoteAddr returns the remote address for this connection. - RemoteAddr() net.Addr - - // LocalAddr returns the local address for this connection. - LocalAddr() net.Addr -} - -// Conn represents an SSH connection for both server and client roles. -// Conn is the basis for implementing an application layer, such -// as ClientConn, which implements the traditional shell access for -// clients. -type Conn interface { - ConnMetadata - - // SendRequest sends a global request, and returns the - // reply. If wantReply is true, it returns the response status - // and payload. See also RFC4254, section 4. - SendRequest(name string, wantReply bool, payload []byte) (bool, []byte, error) - - // OpenChannel tries to open an channel. If the request is - // rejected, it returns *OpenChannelError. On success it returns - // the SSH Channel and a Go channel for incoming, out-of-band - // requests. The Go channel must be serviced, or the - // connection will hang. - OpenChannel(name string, data []byte) (Channel, <-chan *Request, error) - - // Close closes the underlying network connection - Close() error - - // Wait blocks until the connection has shut down, and returns the - // error causing the shutdown. - Wait() error - - // TODO(hanwen): consider exposing: - // RequestKeyChange - // Disconnect -} - -// DiscardRequests consumes and rejects all requests from the -// passed-in channel. -func DiscardRequests(in <-chan *Request) { - for req := range in { - if req.WantReply { - req.Reply(false, nil) - } - } -} - -// A connection represents an incoming connection. -type connection struct { - transport *handshakeTransport - sshConn - - // The connection protocol. - *mux -} - -func (c *connection) Close() error { - return c.sshConn.conn.Close() -} - -// sshconn provides net.Conn metadata, but disallows direct reads and -// writes. -type sshConn struct { - conn net.Conn - - user string - sessionID []byte - clientVersion []byte - serverVersion []byte -} - -func dup(src []byte) []byte { - dst := make([]byte, len(src)) - copy(dst, src) - return dst -} - -func (c *sshConn) User() string { - return c.user -} - -func (c *sshConn) RemoteAddr() net.Addr { - return c.conn.RemoteAddr() -} - -func (c *sshConn) Close() error { - return c.conn.Close() -} - -func (c *sshConn) LocalAddr() net.Addr { - return c.conn.LocalAddr() -} - -func (c *sshConn) SessionID() []byte { - return dup(c.sessionID) -} - -func (c *sshConn) ClientVersion() []byte { - return dup(c.clientVersion) -} - -func (c *sshConn) ServerVersion() []byte { - return dup(c.serverVersion) -} diff --git a/vendor/golang.org/x/crypto/ssh/doc.go b/vendor/golang.org/x/crypto/ssh/doc.go deleted file mode 100644 index 67b7322c0..000000000 --- a/vendor/golang.org/x/crypto/ssh/doc.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -/* -Package ssh implements an SSH client and server. - -SSH is a transport security protocol, an authentication protocol and a -family of application protocols. The most typical application level -protocol is a remote shell and this is specifically implemented. However, -the multiplexed nature of SSH is exposed to users that wish to support -others. - -References: - [PROTOCOL.certkeys]: http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/PROTOCOL.certkeys?rev=HEAD - [SSH-PARAMETERS]: http://www.iana.org/assignments/ssh-parameters/ssh-parameters.xml#ssh-parameters-1 - -This package does not fall under the stability promise of the Go language itself, -so its API may be changed when pressing needs arise. -*/ -package ssh // import "golang.org/x/crypto/ssh" diff --git a/vendor/golang.org/x/crypto/ssh/example_test.go b/vendor/golang.org/x/crypto/ssh/example_test.go deleted file mode 100644 index 618398cea..000000000 --- a/vendor/golang.org/x/crypto/ssh/example_test.go +++ /dev/null @@ -1,313 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssh_test - -import ( - "bufio" - "bytes" - "fmt" - "io/ioutil" - "log" - "net" - "net/http" - "os" - "path/filepath" - "strings" - - "golang.org/x/crypto/ssh" - "golang.org/x/crypto/ssh/terminal" -) - -func ExampleNewServerConn() { - // Public key authentication is done by comparing - // the public key of a received connection - // with the entries in the authorized_keys file. - authorizedKeysBytes, err := ioutil.ReadFile("authorized_keys") - if err != nil { - log.Fatalf("Failed to load authorized_keys, err: %v", err) - } - - authorizedKeysMap := map[string]bool{} - for len(authorizedKeysBytes) > 0 { - pubKey, _, _, rest, err := ssh.ParseAuthorizedKey(authorizedKeysBytes) - if err != nil { - log.Fatal(err) - } - - authorizedKeysMap[string(pubKey.Marshal())] = true - authorizedKeysBytes = rest - } - - // An SSH server is represented by a ServerConfig, which holds - // certificate details and handles authentication of ServerConns. - config := &ssh.ServerConfig{ - // Remove to disable password auth. - PasswordCallback: func(c ssh.ConnMetadata, pass []byte) (*ssh.Permissions, error) { - // Should use constant-time compare (or better, salt+hash) in - // a production setting. - if c.User() == "testuser" && string(pass) == "tiger" { - return nil, nil - } - return nil, fmt.Errorf("password rejected for %q", c.User()) - }, - - // Remove to disable public key auth. - PublicKeyCallback: func(c ssh.ConnMetadata, pubKey ssh.PublicKey) (*ssh.Permissions, error) { - if authorizedKeysMap[string(pubKey.Marshal())] { - return nil, nil - } - return nil, fmt.Errorf("unknown public key for %q", c.User()) - }, - } - - privateBytes, err := ioutil.ReadFile("id_rsa") - if err != nil { - log.Fatal("Failed to load private key: ", err) - } - - private, err := ssh.ParsePrivateKey(privateBytes) - if err != nil { - log.Fatal("Failed to parse private key: ", err) - } - - config.AddHostKey(private) - - // Once a ServerConfig has been configured, connections can be - // accepted. - listener, err := net.Listen("tcp", "0.0.0.0:2022") - if err != nil { - log.Fatal("failed to listen for connection: ", err) - } - nConn, err := listener.Accept() - if err != nil { - log.Fatal("failed to accept incoming connection: ", err) - } - - // Before use, a handshake must be performed on the incoming - // net.Conn. - _, chans, reqs, err := ssh.NewServerConn(nConn, config) - if err != nil { - log.Fatal("failed to handshake: ", err) - } - // The incoming Request channel must be serviced. - go ssh.DiscardRequests(reqs) - - // Service the incoming Channel channel. - for newChannel := range chans { - // Channels have a type, depending on the application level - // protocol intended. In the case of a shell, the type is - // "session" and ServerShell may be used to present a simple - // terminal interface. - if newChannel.ChannelType() != "session" { - newChannel.Reject(ssh.UnknownChannelType, "unknown channel type") - continue - } - channel, requests, err := newChannel.Accept() - if err != nil { - log.Fatalf("Could not accept channel: %v", err) - } - - // Sessions have out-of-band requests such as "shell", - // "pty-req" and "env". Here we handle only the - // "shell" request. - go func(in <-chan *ssh.Request) { - for req := range in { - req.Reply(req.Type == "shell", nil) - } - }(requests) - - term := terminal.NewTerminal(channel, "> ") - - go func() { - defer channel.Close() - for { - line, err := term.ReadLine() - if err != nil { - break - } - fmt.Println(line) - } - }() - } -} - -func ExampleHostKeyCheck() { - // Every client must provide a host key check. Here is a - // simple-minded parse of OpenSSH's known_hosts file - host := "hostname" - file, err := os.Open(filepath.Join(os.Getenv("HOME"), ".ssh", "known_hosts")) - if err != nil { - log.Fatal(err) - } - defer file.Close() - - scanner := bufio.NewScanner(file) - var hostKey ssh.PublicKey - for scanner.Scan() { - fields := strings.Split(scanner.Text(), " ") - if len(fields) != 3 { - continue - } - if strings.Contains(fields[0], host) { - var err error - hostKey, _, _, _, err = ssh.ParseAuthorizedKey(scanner.Bytes()) - if err != nil { - log.Fatalf("error parsing %q: %v", fields[2], err) - } - break - } - } - - if hostKey == nil { - log.Fatalf("no hostkey for %s", host) - } - - config := ssh.ClientConfig{ - User: os.Getenv("USER"), - HostKeyCallback: ssh.FixedHostKey(hostKey), - } - - _, err = ssh.Dial("tcp", host+":22", &config) - log.Println(err) -} - -func ExampleDial() { - var hostKey ssh.PublicKey - // An SSH client is represented with a ClientConn. - // - // To authenticate with the remote server you must pass at least one - // implementation of AuthMethod via the Auth field in ClientConfig, - // and provide a HostKeyCallback. - config := &ssh.ClientConfig{ - User: "username", - Auth: []ssh.AuthMethod{ - ssh.Password("yourpassword"), - }, - HostKeyCallback: ssh.FixedHostKey(hostKey), - } - client, err := ssh.Dial("tcp", "yourserver.com:22", config) - if err != nil { - log.Fatal("Failed to dial: ", err) - } - - // Each ClientConn can support multiple interactive sessions, - // represented by a Session. - session, err := client.NewSession() - if err != nil { - log.Fatal("Failed to create session: ", err) - } - defer session.Close() - - // Once a Session is created, you can execute a single command on - // the remote side using the Run method. - var b bytes.Buffer - session.Stdout = &b - if err := session.Run("/usr/bin/whoami"); err != nil { - log.Fatal("Failed to run: " + err.Error()) - } - fmt.Println(b.String()) -} - -func ExamplePublicKeys() { - var hostKey ssh.PublicKey - // A public key may be used to authenticate against the remote - // server by using an unencrypted PEM-encoded private key file. - // - // If you have an encrypted private key, the crypto/x509 package - // can be used to decrypt it. - key, err := ioutil.ReadFile("/home/user/.ssh/id_rsa") - if err != nil { - log.Fatalf("unable to read private key: %v", err) - } - - // Create the Signer for this private key. - signer, err := ssh.ParsePrivateKey(key) - if err != nil { - log.Fatalf("unable to parse private key: %v", err) - } - - config := &ssh.ClientConfig{ - User: "user", - Auth: []ssh.AuthMethod{ - // Use the PublicKeys method for remote authentication. - ssh.PublicKeys(signer), - }, - HostKeyCallback: ssh.FixedHostKey(hostKey), - } - - // Connect to the remote server and perform the SSH handshake. - client, err := ssh.Dial("tcp", "host.com:22", config) - if err != nil { - log.Fatalf("unable to connect: %v", err) - } - defer client.Close() -} - -func ExampleClient_Listen() { - var hostKey ssh.PublicKey - config := &ssh.ClientConfig{ - User: "username", - Auth: []ssh.AuthMethod{ - ssh.Password("password"), - }, - HostKeyCallback: ssh.FixedHostKey(hostKey), - } - // Dial your ssh server. - conn, err := ssh.Dial("tcp", "localhost:22", config) - if err != nil { - log.Fatal("unable to connect: ", err) - } - defer conn.Close() - - // Request the remote side to open port 8080 on all interfaces. - l, err := conn.Listen("tcp", "0.0.0.0:8080") - if err != nil { - log.Fatal("unable to register tcp forward: ", err) - } - defer l.Close() - - // Serve HTTP with your SSH server acting as a reverse proxy. - http.Serve(l, http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) { - fmt.Fprintf(resp, "Hello world!\n") - })) -} - -func ExampleSession_RequestPty() { - var hostKey ssh.PublicKey - // Create client config - config := &ssh.ClientConfig{ - User: "username", - Auth: []ssh.AuthMethod{ - ssh.Password("password"), - }, - HostKeyCallback: ssh.FixedHostKey(hostKey), - } - // Connect to ssh server - conn, err := ssh.Dial("tcp", "localhost:22", config) - if err != nil { - log.Fatal("unable to connect: ", err) - } - defer conn.Close() - // Create a session - session, err := conn.NewSession() - if err != nil { - log.Fatal("unable to create session: ", err) - } - defer session.Close() - // Set up terminal modes - modes := ssh.TerminalModes{ - ssh.ECHO: 0, // disable echoing - ssh.TTY_OP_ISPEED: 14400, // input speed = 14.4kbaud - ssh.TTY_OP_OSPEED: 14400, // output speed = 14.4kbaud - } - // Request pseudo terminal - if err := session.RequestPty("xterm", 40, 80, modes); err != nil { - log.Fatal("request for pseudo terminal failed: ", err) - } - // Start remote shell - if err := session.Shell(); err != nil { - log.Fatal("failed to start shell: ", err) - } -} diff --git a/vendor/golang.org/x/crypto/ssh/handshake.go b/vendor/golang.org/x/crypto/ssh/handshake.go deleted file mode 100644 index b9a207127..000000000 --- a/vendor/golang.org/x/crypto/ssh/handshake.go +++ /dev/null @@ -1,625 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssh - -import ( - "crypto/rand" - "errors" - "fmt" - "io" - "log" - "net" - "sync" -) - -// debugHandshake, if set, prints messages sent and received. Key -// exchange messages are printed as if DH were used, so the debug -// messages are wrong when using ECDH. -const debugHandshake = false - -// chanSize sets the amount of buffering SSH connections. This is -// primarily for testing: setting chanSize=0 uncovers deadlocks more -// quickly. -const chanSize = 16 - -// keyingTransport is a packet based transport that supports key -// changes. It need not be thread-safe. It should pass through -// msgNewKeys in both directions. -type keyingTransport interface { - packetConn - - // prepareKeyChange sets up a key change. The key change for a - // direction will be effected if a msgNewKeys message is sent - // or received. - prepareKeyChange(*algorithms, *kexResult) error -} - -// handshakeTransport implements rekeying on top of a keyingTransport -// and offers a thread-safe writePacket() interface. -type handshakeTransport struct { - conn keyingTransport - config *Config - - serverVersion []byte - clientVersion []byte - - // hostKeys is non-empty if we are the server. In that case, - // it contains all host keys that can be used to sign the - // connection. - hostKeys []Signer - - // hostKeyAlgorithms is non-empty if we are the client. In that case, - // we accept these key types from the server as host key. - hostKeyAlgorithms []string - - // On read error, incoming is closed, and readError is set. - incoming chan []byte - readError error - - mu sync.Mutex - writeError error - sentInitPacket []byte - sentInitMsg *kexInitMsg - pendingPackets [][]byte // Used when a key exchange is in progress. - - // If the read loop wants to schedule a kex, it pings this - // channel, and the write loop will send out a kex - // message. - requestKex chan struct{} - - // If the other side requests or confirms a kex, its kexInit - // packet is sent here for the write loop to find it. - startKex chan *pendingKex - - // data for host key checking - hostKeyCallback HostKeyCallback - dialAddress string - remoteAddr net.Addr - - // Algorithms agreed in the last key exchange. - algorithms *algorithms - - readPacketsLeft uint32 - readBytesLeft int64 - - writePacketsLeft uint32 - writeBytesLeft int64 - - // The session ID or nil if first kex did not complete yet. - sessionID []byte -} - -type pendingKex struct { - otherInit []byte - done chan error -} - -func newHandshakeTransport(conn keyingTransport, config *Config, clientVersion, serverVersion []byte) *handshakeTransport { - t := &handshakeTransport{ - conn: conn, - serverVersion: serverVersion, - clientVersion: clientVersion, - incoming: make(chan []byte, chanSize), - requestKex: make(chan struct{}, 1), - startKex: make(chan *pendingKex, 1), - - config: config, - } - - // We always start with a mandatory key exchange. - t.requestKex <- struct{}{} - return t -} - -func newClientTransport(conn keyingTransport, clientVersion, serverVersion []byte, config *ClientConfig, dialAddr string, addr net.Addr) *handshakeTransport { - t := newHandshakeTransport(conn, &config.Config, clientVersion, serverVersion) - t.dialAddress = dialAddr - t.remoteAddr = addr - t.hostKeyCallback = config.HostKeyCallback - if config.HostKeyAlgorithms != nil { - t.hostKeyAlgorithms = config.HostKeyAlgorithms - } else { - t.hostKeyAlgorithms = supportedHostKeyAlgos - } - go t.readLoop() - go t.kexLoop() - return t -} - -func newServerTransport(conn keyingTransport, clientVersion, serverVersion []byte, config *ServerConfig) *handshakeTransport { - t := newHandshakeTransport(conn, &config.Config, clientVersion, serverVersion) - t.hostKeys = config.hostKeys - go t.readLoop() - go t.kexLoop() - return t -} - -func (t *handshakeTransport) getSessionID() []byte { - return t.sessionID -} - -// waitSession waits for the session to be established. This should be -// the first thing to call after instantiating handshakeTransport. -func (t *handshakeTransport) waitSession() error { - p, err := t.readPacket() - if err != nil { - return err - } - if p[0] != msgNewKeys { - return fmt.Errorf("ssh: first packet should be msgNewKeys") - } - - return nil -} - -func (t *handshakeTransport) id() string { - if len(t.hostKeys) > 0 { - return "server" - } - return "client" -} - -func (t *handshakeTransport) printPacket(p []byte, write bool) { - action := "got" - if write { - action = "sent" - } - - if p[0] == msgChannelData || p[0] == msgChannelExtendedData { - log.Printf("%s %s data (packet %d bytes)", t.id(), action, len(p)) - } else { - msg, err := decode(p) - log.Printf("%s %s %T %v (%v)", t.id(), action, msg, msg, err) - } -} - -func (t *handshakeTransport) readPacket() ([]byte, error) { - p, ok := <-t.incoming - if !ok { - return nil, t.readError - } - return p, nil -} - -func (t *handshakeTransport) readLoop() { - first := true - for { - p, err := t.readOnePacket(first) - first = false - if err != nil { - t.readError = err - close(t.incoming) - break - } - if p[0] == msgIgnore || p[0] == msgDebug { - continue - } - t.incoming <- p - } - - // Stop writers too. - t.recordWriteError(t.readError) - - // Unblock the writer should it wait for this. - close(t.startKex) - - // Don't close t.requestKex; it's also written to from writePacket. -} - -func (t *handshakeTransport) pushPacket(p []byte) error { - if debugHandshake { - t.printPacket(p, true) - } - return t.conn.writePacket(p) -} - -func (t *handshakeTransport) getWriteError() error { - t.mu.Lock() - defer t.mu.Unlock() - return t.writeError -} - -func (t *handshakeTransport) recordWriteError(err error) { - t.mu.Lock() - defer t.mu.Unlock() - if t.writeError == nil && err != nil { - t.writeError = err - } -} - -func (t *handshakeTransport) requestKeyExchange() { - select { - case t.requestKex <- struct{}{}: - default: - // something already requested a kex, so do nothing. - } -} - -func (t *handshakeTransport) kexLoop() { - -write: - for t.getWriteError() == nil { - var request *pendingKex - var sent bool - - for request == nil || !sent { - var ok bool - select { - case request, ok = <-t.startKex: - if !ok { - break write - } - case <-t.requestKex: - break - } - - if !sent { - if err := t.sendKexInit(); err != nil { - t.recordWriteError(err) - break - } - sent = true - } - } - - if err := t.getWriteError(); err != nil { - if request != nil { - request.done <- err - } - break - } - - // We're not servicing t.requestKex, but that is OK: - // we never block on sending to t.requestKex. - - // We're not servicing t.startKex, but the remote end - // has just sent us a kexInitMsg, so it can't send - // another key change request, until we close the done - // channel on the pendingKex request. - - err := t.enterKeyExchange(request.otherInit) - - t.mu.Lock() - t.writeError = err - t.sentInitPacket = nil - t.sentInitMsg = nil - t.writePacketsLeft = packetRekeyThreshold - if t.config.RekeyThreshold > 0 { - t.writeBytesLeft = int64(t.config.RekeyThreshold) - } else if t.algorithms != nil { - t.writeBytesLeft = t.algorithms.w.rekeyBytes() - } - - // we have completed the key exchange. Since the - // reader is still blocked, it is safe to clear out - // the requestKex channel. This avoids the situation - // where: 1) we consumed our own request for the - // initial kex, and 2) the kex from the remote side - // caused another send on the requestKex channel, - clear: - for { - select { - case <-t.requestKex: - // - default: - break clear - } - } - - request.done <- t.writeError - - // kex finished. Push packets that we received while - // the kex was in progress. Don't look at t.startKex - // and don't increment writtenSinceKex: if we trigger - // another kex while we are still busy with the last - // one, things will become very confusing. - for _, p := range t.pendingPackets { - t.writeError = t.pushPacket(p) - if t.writeError != nil { - break - } - } - t.pendingPackets = t.pendingPackets[:0] - t.mu.Unlock() - } - - // drain startKex channel. We don't service t.requestKex - // because nobody does blocking sends there. - go func() { - for init := range t.startKex { - init.done <- t.writeError - } - }() - - // Unblock reader. - t.conn.Close() -} - -// The protocol uses uint32 for packet counters, so we can't let them -// reach 1<<32. We will actually read and write more packets than -// this, though: the other side may send more packets, and after we -// hit this limit on writing we will send a few more packets for the -// key exchange itself. -const packetRekeyThreshold = (1 << 31) - -func (t *handshakeTransport) readOnePacket(first bool) ([]byte, error) { - p, err := t.conn.readPacket() - if err != nil { - return nil, err - } - - if t.readPacketsLeft > 0 { - t.readPacketsLeft-- - } else { - t.requestKeyExchange() - } - - if t.readBytesLeft > 0 { - t.readBytesLeft -= int64(len(p)) - } else { - t.requestKeyExchange() - } - - if debugHandshake { - t.printPacket(p, false) - } - - if first && p[0] != msgKexInit { - return nil, fmt.Errorf("ssh: first packet should be msgKexInit") - } - - if p[0] != msgKexInit { - return p, nil - } - - firstKex := t.sessionID == nil - - kex := pendingKex{ - done: make(chan error, 1), - otherInit: p, - } - t.startKex <- &kex - err = <-kex.done - - if debugHandshake { - log.Printf("%s exited key exchange (first %v), err %v", t.id(), firstKex, err) - } - - if err != nil { - return nil, err - } - - t.readPacketsLeft = packetRekeyThreshold - if t.config.RekeyThreshold > 0 { - t.readBytesLeft = int64(t.config.RekeyThreshold) - } else { - t.readBytesLeft = t.algorithms.r.rekeyBytes() - } - - // By default, a key exchange is hidden from higher layers by - // translating it into msgIgnore. - successPacket := []byte{msgIgnore} - if firstKex { - // sendKexInit() for the first kex waits for - // msgNewKeys so the authentication process is - // guaranteed to happen over an encrypted transport. - successPacket = []byte{msgNewKeys} - } - - return successPacket, nil -} - -// sendKexInit sends a key change message. -func (t *handshakeTransport) sendKexInit() error { - t.mu.Lock() - defer t.mu.Unlock() - if t.sentInitMsg != nil { - // kexInits may be sent either in response to the other side, - // or because our side wants to initiate a key change, so we - // may have already sent a kexInit. In that case, don't send a - // second kexInit. - return nil - } - - msg := &kexInitMsg{ - KexAlgos: t.config.KeyExchanges, - CiphersClientServer: t.config.Ciphers, - CiphersServerClient: t.config.Ciphers, - MACsClientServer: t.config.MACs, - MACsServerClient: t.config.MACs, - CompressionClientServer: supportedCompressions, - CompressionServerClient: supportedCompressions, - } - io.ReadFull(rand.Reader, msg.Cookie[:]) - - if len(t.hostKeys) > 0 { - for _, k := range t.hostKeys { - msg.ServerHostKeyAlgos = append( - msg.ServerHostKeyAlgos, k.PublicKey().Type()) - } - } else { - msg.ServerHostKeyAlgos = t.hostKeyAlgorithms - } - packet := Marshal(msg) - - // writePacket destroys the contents, so save a copy. - packetCopy := make([]byte, len(packet)) - copy(packetCopy, packet) - - if err := t.pushPacket(packetCopy); err != nil { - return err - } - - t.sentInitMsg = msg - t.sentInitPacket = packet - - return nil -} - -func (t *handshakeTransport) writePacket(p []byte) error { - switch p[0] { - case msgKexInit: - return errors.New("ssh: only handshakeTransport can send kexInit") - case msgNewKeys: - return errors.New("ssh: only handshakeTransport can send newKeys") - } - - t.mu.Lock() - defer t.mu.Unlock() - if t.writeError != nil { - return t.writeError - } - - if t.sentInitMsg != nil { - // Copy the packet so the writer can reuse the buffer. - cp := make([]byte, len(p)) - copy(cp, p) - t.pendingPackets = append(t.pendingPackets, cp) - return nil - } - - if t.writeBytesLeft > 0 { - t.writeBytesLeft -= int64(len(p)) - } else { - t.requestKeyExchange() - } - - if t.writePacketsLeft > 0 { - t.writePacketsLeft-- - } else { - t.requestKeyExchange() - } - - if err := t.pushPacket(p); err != nil { - t.writeError = err - } - - return nil -} - -func (t *handshakeTransport) Close() error { - return t.conn.Close() -} - -func (t *handshakeTransport) enterKeyExchange(otherInitPacket []byte) error { - if debugHandshake { - log.Printf("%s entered key exchange", t.id()) - } - - otherInit := &kexInitMsg{} - if err := Unmarshal(otherInitPacket, otherInit); err != nil { - return err - } - - magics := handshakeMagics{ - clientVersion: t.clientVersion, - serverVersion: t.serverVersion, - clientKexInit: otherInitPacket, - serverKexInit: t.sentInitPacket, - } - - clientInit := otherInit - serverInit := t.sentInitMsg - if len(t.hostKeys) == 0 { - clientInit, serverInit = serverInit, clientInit - - magics.clientKexInit = t.sentInitPacket - magics.serverKexInit = otherInitPacket - } - - var err error - t.algorithms, err = findAgreedAlgorithms(clientInit, serverInit) - if err != nil { - return err - } - - // We don't send FirstKexFollows, but we handle receiving it. - // - // RFC 4253 section 7 defines the kex and the agreement method for - // first_kex_packet_follows. It states that the guessed packet - // should be ignored if the "kex algorithm and/or the host - // key algorithm is guessed wrong (server and client have - // different preferred algorithm), or if any of the other - // algorithms cannot be agreed upon". The other algorithms have - // already been checked above so the kex algorithm and host key - // algorithm are checked here. - if otherInit.FirstKexFollows && (clientInit.KexAlgos[0] != serverInit.KexAlgos[0] || clientInit.ServerHostKeyAlgos[0] != serverInit.ServerHostKeyAlgos[0]) { - // other side sent a kex message for the wrong algorithm, - // which we have to ignore. - if _, err := t.conn.readPacket(); err != nil { - return err - } - } - - kex, ok := kexAlgoMap[t.algorithms.kex] - if !ok { - return fmt.Errorf("ssh: unexpected key exchange algorithm %v", t.algorithms.kex) - } - - var result *kexResult - if len(t.hostKeys) > 0 { - result, err = t.server(kex, t.algorithms, &magics) - } else { - result, err = t.client(kex, t.algorithms, &magics) - } - - if err != nil { - return err - } - - if t.sessionID == nil { - t.sessionID = result.H - } - result.SessionID = t.sessionID - - if err := t.conn.prepareKeyChange(t.algorithms, result); err != nil { - return err - } - if err = t.conn.writePacket([]byte{msgNewKeys}); err != nil { - return err - } - if packet, err := t.conn.readPacket(); err != nil { - return err - } else if packet[0] != msgNewKeys { - return unexpectedMessageError(msgNewKeys, packet[0]) - } - - return nil -} - -func (t *handshakeTransport) server(kex kexAlgorithm, algs *algorithms, magics *handshakeMagics) (*kexResult, error) { - var hostKey Signer - for _, k := range t.hostKeys { - if algs.hostKey == k.PublicKey().Type() { - hostKey = k - } - } - - r, err := kex.Server(t.conn, t.config.Rand, magics, hostKey) - return r, err -} - -func (t *handshakeTransport) client(kex kexAlgorithm, algs *algorithms, magics *handshakeMagics) (*kexResult, error) { - result, err := kex.Client(t.conn, t.config.Rand, magics) - if err != nil { - return nil, err - } - - hostKey, err := ParsePublicKey(result.HostKey) - if err != nil { - return nil, err - } - - if err := verifyHostKeySignature(hostKey, result); err != nil { - return nil, err - } - - err = t.hostKeyCallback(t.dialAddress, t.remoteAddr, hostKey) - if err != nil { - return nil, err - } - - return result, nil -} diff --git a/vendor/golang.org/x/crypto/ssh/handshake_test.go b/vendor/golang.org/x/crypto/ssh/handshake_test.go deleted file mode 100644 index 51a4c5ade..000000000 --- a/vendor/golang.org/x/crypto/ssh/handshake_test.go +++ /dev/null @@ -1,556 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssh - -import ( - "bytes" - "crypto/rand" - "errors" - "fmt" - "io" - "net" - "reflect" - "runtime" - "strings" - "sync" - "testing" -) - -type testChecker struct { - calls []string -} - -func (t *testChecker) Check(dialAddr string, addr net.Addr, key PublicKey) error { - if dialAddr == "bad" { - return fmt.Errorf("dialAddr is bad") - } - - if tcpAddr, ok := addr.(*net.TCPAddr); !ok || tcpAddr == nil { - return fmt.Errorf("testChecker: got %T want *net.TCPAddr", addr) - } - - t.calls = append(t.calls, fmt.Sprintf("%s %v %s %x", dialAddr, addr, key.Type(), key.Marshal())) - - return nil -} - -// netPipe is analogous to net.Pipe, but it uses a real net.Conn, and -// therefore is buffered (net.Pipe deadlocks if both sides start with -// a write.) -func netPipe() (net.Conn, net.Conn, error) { - listener, err := net.Listen("tcp", ":0") - if err != nil { - return nil, nil, err - } - defer listener.Close() - c1, err := net.Dial("tcp", listener.Addr().String()) - if err != nil { - return nil, nil, err - } - - c2, err := listener.Accept() - if err != nil { - c1.Close() - return nil, nil, err - } - - return c1, c2, nil -} - -// noiseTransport inserts ignore messages to check that the read loop -// and the key exchange filters out these messages. -type noiseTransport struct { - keyingTransport -} - -func (t *noiseTransport) writePacket(p []byte) error { - ignore := []byte{msgIgnore} - if err := t.keyingTransport.writePacket(ignore); err != nil { - return err - } - debug := []byte{msgDebug, 1, 2, 3} - if err := t.keyingTransport.writePacket(debug); err != nil { - return err - } - - return t.keyingTransport.writePacket(p) -} - -func addNoiseTransport(t keyingTransport) keyingTransport { - return &noiseTransport{t} -} - -// handshakePair creates two handshakeTransports connected with each -// other. If the noise argument is true, both transports will try to -// confuse the other side by sending ignore and debug messages. -func handshakePair(clientConf *ClientConfig, addr string, noise bool) (client *handshakeTransport, server *handshakeTransport, err error) { - a, b, err := netPipe() - if err != nil { - return nil, nil, err - } - - var trC, trS keyingTransport - - trC = newTransport(a, rand.Reader, true) - trS = newTransport(b, rand.Reader, false) - if noise { - trC = addNoiseTransport(trC) - trS = addNoiseTransport(trS) - } - clientConf.SetDefaults() - - v := []byte("version") - client = newClientTransport(trC, v, v, clientConf, addr, a.RemoteAddr()) - - serverConf := &ServerConfig{} - serverConf.AddHostKey(testSigners["ecdsa"]) - serverConf.AddHostKey(testSigners["rsa"]) - serverConf.SetDefaults() - server = newServerTransport(trS, v, v, serverConf) - - if err := server.waitSession(); err != nil { - return nil, nil, fmt.Errorf("server.waitSession: %v", err) - } - if err := client.waitSession(); err != nil { - return nil, nil, fmt.Errorf("client.waitSession: %v", err) - } - - return client, server, nil -} - -func TestHandshakeBasic(t *testing.T) { - if runtime.GOOS == "plan9" { - t.Skip("see golang.org/issue/7237") - } - - checker := &syncChecker{ - waitCall: make(chan int, 10), - called: make(chan int, 10), - } - - checker.waitCall <- 1 - trC, trS, err := handshakePair(&ClientConfig{HostKeyCallback: checker.Check}, "addr", false) - if err != nil { - t.Fatalf("handshakePair: %v", err) - } - - defer trC.Close() - defer trS.Close() - - // Let first kex complete normally. - <-checker.called - - clientDone := make(chan int, 0) - gotHalf := make(chan int, 0) - const N = 20 - - go func() { - defer close(clientDone) - // Client writes a bunch of stuff, and does a key - // change in the middle. This should not confuse the - // handshake in progress. We do this twice, so we test - // that the packet buffer is reset correctly. - for i := 0; i < N; i++ { - p := []byte{msgRequestSuccess, byte(i)} - if err := trC.writePacket(p); err != nil { - t.Fatalf("sendPacket: %v", err) - } - if (i % 10) == 5 { - <-gotHalf - // halfway through, we request a key change. - trC.requestKeyExchange() - - // Wait until we can be sure the key - // change has really started before we - // write more. - <-checker.called - } - if (i % 10) == 7 { - // write some packets until the kex - // completes, to test buffering of - // packets. - checker.waitCall <- 1 - } - } - }() - - // Server checks that client messages come in cleanly - i := 0 - err = nil - for ; i < N; i++ { - var p []byte - p, err = trS.readPacket() - if err != nil { - break - } - if (i % 10) == 5 { - gotHalf <- 1 - } - - want := []byte{msgRequestSuccess, byte(i)} - if bytes.Compare(p, want) != 0 { - t.Errorf("message %d: got %v, want %v", i, p, want) - } - } - <-clientDone - if err != nil && err != io.EOF { - t.Fatalf("server error: %v", err) - } - if i != N { - t.Errorf("received %d messages, want 10.", i) - } - - close(checker.called) - if _, ok := <-checker.called; ok { - // If all went well, we registered exactly 2 key changes: one - // that establishes the session, and one that we requested - // additionally. - t.Fatalf("got another host key checks after 2 handshakes") - } -} - -func TestForceFirstKex(t *testing.T) { - // like handshakePair, but must access the keyingTransport. - checker := &testChecker{} - clientConf := &ClientConfig{HostKeyCallback: checker.Check} - a, b, err := netPipe() - if err != nil { - t.Fatalf("netPipe: %v", err) - } - - var trC, trS keyingTransport - - trC = newTransport(a, rand.Reader, true) - - // This is the disallowed packet: - trC.writePacket(Marshal(&serviceRequestMsg{serviceUserAuth})) - - // Rest of the setup. - trS = newTransport(b, rand.Reader, false) - clientConf.SetDefaults() - - v := []byte("version") - client := newClientTransport(trC, v, v, clientConf, "addr", a.RemoteAddr()) - - serverConf := &ServerConfig{} - serverConf.AddHostKey(testSigners["ecdsa"]) - serverConf.AddHostKey(testSigners["rsa"]) - serverConf.SetDefaults() - server := newServerTransport(trS, v, v, serverConf) - - defer client.Close() - defer server.Close() - - // We setup the initial key exchange, but the remote side - // tries to send serviceRequestMsg in cleartext, which is - // disallowed. - - if err := server.waitSession(); err == nil { - t.Errorf("server first kex init should reject unexpected packet") - } -} - -func TestHandshakeAutoRekeyWrite(t *testing.T) { - checker := &syncChecker{ - called: make(chan int, 10), - waitCall: nil, - } - clientConf := &ClientConfig{HostKeyCallback: checker.Check} - clientConf.RekeyThreshold = 500 - trC, trS, err := handshakePair(clientConf, "addr", false) - if err != nil { - t.Fatalf("handshakePair: %v", err) - } - defer trC.Close() - defer trS.Close() - - input := make([]byte, 251) - input[0] = msgRequestSuccess - - done := make(chan int, 1) - const numPacket = 5 - go func() { - defer close(done) - j := 0 - for ; j < numPacket; j++ { - if p, err := trS.readPacket(); err != nil { - break - } else if !bytes.Equal(input, p) { - t.Errorf("got packet type %d, want %d", p[0], input[0]) - } - } - - if j != numPacket { - t.Errorf("got %d, want 5 messages", j) - } - }() - - <-checker.called - - for i := 0; i < numPacket; i++ { - p := make([]byte, len(input)) - copy(p, input) - if err := trC.writePacket(p); err != nil { - t.Errorf("writePacket: %v", err) - } - if i == 2 { - // Make sure the kex is in progress. - <-checker.called - } - - } - <-done -} - -type syncChecker struct { - waitCall chan int - called chan int -} - -func (c *syncChecker) Check(dialAddr string, addr net.Addr, key PublicKey) error { - c.called <- 1 - if c.waitCall != nil { - <-c.waitCall - } - return nil -} - -func TestHandshakeAutoRekeyRead(t *testing.T) { - sync := &syncChecker{ - called: make(chan int, 2), - waitCall: nil, - } - clientConf := &ClientConfig{ - HostKeyCallback: sync.Check, - } - clientConf.RekeyThreshold = 500 - - trC, trS, err := handshakePair(clientConf, "addr", false) - if err != nil { - t.Fatalf("handshakePair: %v", err) - } - defer trC.Close() - defer trS.Close() - - packet := make([]byte, 501) - packet[0] = msgRequestSuccess - if err := trS.writePacket(packet); err != nil { - t.Fatalf("writePacket: %v", err) - } - - // While we read out the packet, a key change will be - // initiated. - done := make(chan int, 1) - go func() { - defer close(done) - if _, err := trC.readPacket(); err != nil { - t.Fatalf("readPacket(client): %v", err) - } - - }() - - <-done - <-sync.called -} - -// errorKeyingTransport generates errors after a given number of -// read/write operations. -type errorKeyingTransport struct { - packetConn - readLeft, writeLeft int -} - -func (n *errorKeyingTransport) prepareKeyChange(*algorithms, *kexResult) error { - return nil -} - -func (n *errorKeyingTransport) getSessionID() []byte { - return nil -} - -func (n *errorKeyingTransport) writePacket(packet []byte) error { - if n.writeLeft == 0 { - n.Close() - return errors.New("barf") - } - - n.writeLeft-- - return n.packetConn.writePacket(packet) -} - -func (n *errorKeyingTransport) readPacket() ([]byte, error) { - if n.readLeft == 0 { - n.Close() - return nil, errors.New("barf") - } - - n.readLeft-- - return n.packetConn.readPacket() -} - -func TestHandshakeErrorHandlingRead(t *testing.T) { - for i := 0; i < 20; i++ { - testHandshakeErrorHandlingN(t, i, -1, false) - } -} - -func TestHandshakeErrorHandlingWrite(t *testing.T) { - for i := 0; i < 20; i++ { - testHandshakeErrorHandlingN(t, -1, i, false) - } -} - -func TestHandshakeErrorHandlingReadCoupled(t *testing.T) { - for i := 0; i < 20; i++ { - testHandshakeErrorHandlingN(t, i, -1, true) - } -} - -func TestHandshakeErrorHandlingWriteCoupled(t *testing.T) { - for i := 0; i < 20; i++ { - testHandshakeErrorHandlingN(t, -1, i, true) - } -} - -// testHandshakeErrorHandlingN runs handshakes, injecting errors. If -// handshakeTransport deadlocks, the go runtime will detect it and -// panic. -func testHandshakeErrorHandlingN(t *testing.T, readLimit, writeLimit int, coupled bool) { - msg := Marshal(&serviceRequestMsg{strings.Repeat("x", int(minRekeyThreshold)/4)}) - - a, b := memPipe() - defer a.Close() - defer b.Close() - - key := testSigners["ecdsa"] - serverConf := Config{RekeyThreshold: minRekeyThreshold} - serverConf.SetDefaults() - serverConn := newHandshakeTransport(&errorKeyingTransport{a, readLimit, writeLimit}, &serverConf, []byte{'a'}, []byte{'b'}) - serverConn.hostKeys = []Signer{key} - go serverConn.readLoop() - go serverConn.kexLoop() - - clientConf := Config{RekeyThreshold: 10 * minRekeyThreshold} - clientConf.SetDefaults() - clientConn := newHandshakeTransport(&errorKeyingTransport{b, -1, -1}, &clientConf, []byte{'a'}, []byte{'b'}) - clientConn.hostKeyAlgorithms = []string{key.PublicKey().Type()} - clientConn.hostKeyCallback = InsecureIgnoreHostKey() - go clientConn.readLoop() - go clientConn.kexLoop() - - var wg sync.WaitGroup - - for _, hs := range []packetConn{serverConn, clientConn} { - if !coupled { - wg.Add(2) - go func(c packetConn) { - for i := 0; ; i++ { - str := fmt.Sprintf("%08x", i) + strings.Repeat("x", int(minRekeyThreshold)/4-8) - err := c.writePacket(Marshal(&serviceRequestMsg{str})) - if err != nil { - break - } - } - wg.Done() - c.Close() - }(hs) - go func(c packetConn) { - for { - _, err := c.readPacket() - if err != nil { - break - } - } - wg.Done() - }(hs) - } else { - wg.Add(1) - go func(c packetConn) { - for { - _, err := c.readPacket() - if err != nil { - break - } - if err := c.writePacket(msg); err != nil { - break - } - - } - wg.Done() - }(hs) - } - } - wg.Wait() -} - -func TestDisconnect(t *testing.T) { - if runtime.GOOS == "plan9" { - t.Skip("see golang.org/issue/7237") - } - checker := &testChecker{} - trC, trS, err := handshakePair(&ClientConfig{HostKeyCallback: checker.Check}, "addr", false) - if err != nil { - t.Fatalf("handshakePair: %v", err) - } - - defer trC.Close() - defer trS.Close() - - trC.writePacket([]byte{msgRequestSuccess, 0, 0}) - errMsg := &disconnectMsg{ - Reason: 42, - Message: "such is life", - } - trC.writePacket(Marshal(errMsg)) - trC.writePacket([]byte{msgRequestSuccess, 0, 0}) - - packet, err := trS.readPacket() - if err != nil { - t.Fatalf("readPacket 1: %v", err) - } - if packet[0] != msgRequestSuccess { - t.Errorf("got packet %v, want packet type %d", packet, msgRequestSuccess) - } - - _, err = trS.readPacket() - if err == nil { - t.Errorf("readPacket 2 succeeded") - } else if !reflect.DeepEqual(err, errMsg) { - t.Errorf("got error %#v, want %#v", err, errMsg) - } - - _, err = trS.readPacket() - if err == nil { - t.Errorf("readPacket 3 succeeded") - } -} - -func TestHandshakeRekeyDefault(t *testing.T) { - clientConf := &ClientConfig{ - Config: Config{ - Ciphers: []string{"aes128-ctr"}, - }, - HostKeyCallback: InsecureIgnoreHostKey(), - } - trC, trS, err := handshakePair(clientConf, "addr", false) - if err != nil { - t.Fatalf("handshakePair: %v", err) - } - defer trC.Close() - defer trS.Close() - - trC.writePacket([]byte{msgRequestSuccess, 0, 0}) - trC.Close() - - rgb := (1024 + trC.readBytesLeft) >> 30 - wgb := (1024 + trC.writeBytesLeft) >> 30 - - if rgb != 64 { - t.Errorf("got rekey after %dG read, want 64G", rgb) - } - if wgb != 64 { - t.Errorf("got rekey after %dG write, want 64G", wgb) - } -} diff --git a/vendor/golang.org/x/crypto/ssh/kex.go b/vendor/golang.org/x/crypto/ssh/kex.go deleted file mode 100644 index f91c2770e..000000000 --- a/vendor/golang.org/x/crypto/ssh/kex.go +++ /dev/null @@ -1,540 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssh - -import ( - "crypto" - "crypto/ecdsa" - "crypto/elliptic" - "crypto/rand" - "crypto/subtle" - "errors" - "io" - "math/big" - - "golang.org/x/crypto/curve25519" -) - -const ( - kexAlgoDH1SHA1 = "diffie-hellman-group1-sha1" - kexAlgoDH14SHA1 = "diffie-hellman-group14-sha1" - kexAlgoECDH256 = "ecdh-sha2-nistp256" - kexAlgoECDH384 = "ecdh-sha2-nistp384" - kexAlgoECDH521 = "ecdh-sha2-nistp521" - kexAlgoCurve25519SHA256 = "curve25519-sha256@libssh.org" -) - -// kexResult captures the outcome of a key exchange. -type kexResult struct { - // Session hash. See also RFC 4253, section 8. - H []byte - - // Shared secret. See also RFC 4253, section 8. - K []byte - - // Host key as hashed into H. - HostKey []byte - - // Signature of H. - Signature []byte - - // A cryptographic hash function that matches the security - // level of the key exchange algorithm. It is used for - // calculating H, and for deriving keys from H and K. - Hash crypto.Hash - - // The session ID, which is the first H computed. This is used - // to derive key material inside the transport. - SessionID []byte -} - -// handshakeMagics contains data that is always included in the -// session hash. -type handshakeMagics struct { - clientVersion, serverVersion []byte - clientKexInit, serverKexInit []byte -} - -func (m *handshakeMagics) write(w io.Writer) { - writeString(w, m.clientVersion) - writeString(w, m.serverVersion) - writeString(w, m.clientKexInit) - writeString(w, m.serverKexInit) -} - -// kexAlgorithm abstracts different key exchange algorithms. -type kexAlgorithm interface { - // Server runs server-side key agreement, signing the result - // with a hostkey. - Server(p packetConn, rand io.Reader, magics *handshakeMagics, s Signer) (*kexResult, error) - - // Client runs the client-side key agreement. Caller is - // responsible for verifying the host key signature. - Client(p packetConn, rand io.Reader, magics *handshakeMagics) (*kexResult, error) -} - -// dhGroup is a multiplicative group suitable for implementing Diffie-Hellman key agreement. -type dhGroup struct { - g, p, pMinus1 *big.Int -} - -func (group *dhGroup) diffieHellman(theirPublic, myPrivate *big.Int) (*big.Int, error) { - if theirPublic.Cmp(bigOne) <= 0 || theirPublic.Cmp(group.pMinus1) >= 0 { - return nil, errors.New("ssh: DH parameter out of bounds") - } - return new(big.Int).Exp(theirPublic, myPrivate, group.p), nil -} - -func (group *dhGroup) Client(c packetConn, randSource io.Reader, magics *handshakeMagics) (*kexResult, error) { - hashFunc := crypto.SHA1 - - var x *big.Int - for { - var err error - if x, err = rand.Int(randSource, group.pMinus1); err != nil { - return nil, err - } - if x.Sign() > 0 { - break - } - } - - X := new(big.Int).Exp(group.g, x, group.p) - kexDHInit := kexDHInitMsg{ - X: X, - } - if err := c.writePacket(Marshal(&kexDHInit)); err != nil { - return nil, err - } - - packet, err := c.readPacket() - if err != nil { - return nil, err - } - - var kexDHReply kexDHReplyMsg - if err = Unmarshal(packet, &kexDHReply); err != nil { - return nil, err - } - - kInt, err := group.diffieHellman(kexDHReply.Y, x) - if err != nil { - return nil, err - } - - h := hashFunc.New() - magics.write(h) - writeString(h, kexDHReply.HostKey) - writeInt(h, X) - writeInt(h, kexDHReply.Y) - K := make([]byte, intLength(kInt)) - marshalInt(K, kInt) - h.Write(K) - - return &kexResult{ - H: h.Sum(nil), - K: K, - HostKey: kexDHReply.HostKey, - Signature: kexDHReply.Signature, - Hash: crypto.SHA1, - }, nil -} - -func (group *dhGroup) Server(c packetConn, randSource io.Reader, magics *handshakeMagics, priv Signer) (result *kexResult, err error) { - hashFunc := crypto.SHA1 - packet, err := c.readPacket() - if err != nil { - return - } - var kexDHInit kexDHInitMsg - if err = Unmarshal(packet, &kexDHInit); err != nil { - return - } - - var y *big.Int - for { - if y, err = rand.Int(randSource, group.pMinus1); err != nil { - return - } - if y.Sign() > 0 { - break - } - } - - Y := new(big.Int).Exp(group.g, y, group.p) - kInt, err := group.diffieHellman(kexDHInit.X, y) - if err != nil { - return nil, err - } - - hostKeyBytes := priv.PublicKey().Marshal() - - h := hashFunc.New() - magics.write(h) - writeString(h, hostKeyBytes) - writeInt(h, kexDHInit.X) - writeInt(h, Y) - - K := make([]byte, intLength(kInt)) - marshalInt(K, kInt) - h.Write(K) - - H := h.Sum(nil) - - // H is already a hash, but the hostkey signing will apply its - // own key-specific hash algorithm. - sig, err := signAndMarshal(priv, randSource, H) - if err != nil { - return nil, err - } - - kexDHReply := kexDHReplyMsg{ - HostKey: hostKeyBytes, - Y: Y, - Signature: sig, - } - packet = Marshal(&kexDHReply) - - err = c.writePacket(packet) - return &kexResult{ - H: H, - K: K, - HostKey: hostKeyBytes, - Signature: sig, - Hash: crypto.SHA1, - }, nil -} - -// ecdh performs Elliptic Curve Diffie-Hellman key exchange as -// described in RFC 5656, section 4. -type ecdh struct { - curve elliptic.Curve -} - -func (kex *ecdh) Client(c packetConn, rand io.Reader, magics *handshakeMagics) (*kexResult, error) { - ephKey, err := ecdsa.GenerateKey(kex.curve, rand) - if err != nil { - return nil, err - } - - kexInit := kexECDHInitMsg{ - ClientPubKey: elliptic.Marshal(kex.curve, ephKey.PublicKey.X, ephKey.PublicKey.Y), - } - - serialized := Marshal(&kexInit) - if err := c.writePacket(serialized); err != nil { - return nil, err - } - - packet, err := c.readPacket() - if err != nil { - return nil, err - } - - var reply kexECDHReplyMsg - if err = Unmarshal(packet, &reply); err != nil { - return nil, err - } - - x, y, err := unmarshalECKey(kex.curve, reply.EphemeralPubKey) - if err != nil { - return nil, err - } - - // generate shared secret - secret, _ := kex.curve.ScalarMult(x, y, ephKey.D.Bytes()) - - h := ecHash(kex.curve).New() - magics.write(h) - writeString(h, reply.HostKey) - writeString(h, kexInit.ClientPubKey) - writeString(h, reply.EphemeralPubKey) - K := make([]byte, intLength(secret)) - marshalInt(K, secret) - h.Write(K) - - return &kexResult{ - H: h.Sum(nil), - K: K, - HostKey: reply.HostKey, - Signature: reply.Signature, - Hash: ecHash(kex.curve), - }, nil -} - -// unmarshalECKey parses and checks an EC key. -func unmarshalECKey(curve elliptic.Curve, pubkey []byte) (x, y *big.Int, err error) { - x, y = elliptic.Unmarshal(curve, pubkey) - if x == nil { - return nil, nil, errors.New("ssh: elliptic.Unmarshal failure") - } - if !validateECPublicKey(curve, x, y) { - return nil, nil, errors.New("ssh: public key not on curve") - } - return x, y, nil -} - -// validateECPublicKey checks that the point is a valid public key for -// the given curve. See [SEC1], 3.2.2 -func validateECPublicKey(curve elliptic.Curve, x, y *big.Int) bool { - if x.Sign() == 0 && y.Sign() == 0 { - return false - } - - if x.Cmp(curve.Params().P) >= 0 { - return false - } - - if y.Cmp(curve.Params().P) >= 0 { - return false - } - - if !curve.IsOnCurve(x, y) { - return false - } - - // We don't check if N * PubKey == 0, since - // - // - the NIST curves have cofactor = 1, so this is implicit. - // (We don't foresee an implementation that supports non NIST - // curves) - // - // - for ephemeral keys, we don't need to worry about small - // subgroup attacks. - return true -} - -func (kex *ecdh) Server(c packetConn, rand io.Reader, magics *handshakeMagics, priv Signer) (result *kexResult, err error) { - packet, err := c.readPacket() - if err != nil { - return nil, err - } - - var kexECDHInit kexECDHInitMsg - if err = Unmarshal(packet, &kexECDHInit); err != nil { - return nil, err - } - - clientX, clientY, err := unmarshalECKey(kex.curve, kexECDHInit.ClientPubKey) - if err != nil { - return nil, err - } - - // We could cache this key across multiple users/multiple - // connection attempts, but the benefit is small. OpenSSH - // generates a new key for each incoming connection. - ephKey, err := ecdsa.GenerateKey(kex.curve, rand) - if err != nil { - return nil, err - } - - hostKeyBytes := priv.PublicKey().Marshal() - - serializedEphKey := elliptic.Marshal(kex.curve, ephKey.PublicKey.X, ephKey.PublicKey.Y) - - // generate shared secret - secret, _ := kex.curve.ScalarMult(clientX, clientY, ephKey.D.Bytes()) - - h := ecHash(kex.curve).New() - magics.write(h) - writeString(h, hostKeyBytes) - writeString(h, kexECDHInit.ClientPubKey) - writeString(h, serializedEphKey) - - K := make([]byte, intLength(secret)) - marshalInt(K, secret) - h.Write(K) - - H := h.Sum(nil) - - // H is already a hash, but the hostkey signing will apply its - // own key-specific hash algorithm. - sig, err := signAndMarshal(priv, rand, H) - if err != nil { - return nil, err - } - - reply := kexECDHReplyMsg{ - EphemeralPubKey: serializedEphKey, - HostKey: hostKeyBytes, - Signature: sig, - } - - serialized := Marshal(&reply) - if err := c.writePacket(serialized); err != nil { - return nil, err - } - - return &kexResult{ - H: H, - K: K, - HostKey: reply.HostKey, - Signature: sig, - Hash: ecHash(kex.curve), - }, nil -} - -var kexAlgoMap = map[string]kexAlgorithm{} - -func init() { - // This is the group called diffie-hellman-group1-sha1 in RFC - // 4253 and Oakley Group 2 in RFC 2409. - p, _ := new(big.Int).SetString("FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFF", 16) - kexAlgoMap[kexAlgoDH1SHA1] = &dhGroup{ - g: new(big.Int).SetInt64(2), - p: p, - pMinus1: new(big.Int).Sub(p, bigOne), - } - - // This is the group called diffie-hellman-group14-sha1 in RFC - // 4253 and Oakley Group 14 in RFC 3526. - p, _ = new(big.Int).SetString("FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AACAA68FFFFFFFFFFFFFFFF", 16) - - kexAlgoMap[kexAlgoDH14SHA1] = &dhGroup{ - g: new(big.Int).SetInt64(2), - p: p, - pMinus1: new(big.Int).Sub(p, bigOne), - } - - kexAlgoMap[kexAlgoECDH521] = &ecdh{elliptic.P521()} - kexAlgoMap[kexAlgoECDH384] = &ecdh{elliptic.P384()} - kexAlgoMap[kexAlgoECDH256] = &ecdh{elliptic.P256()} - kexAlgoMap[kexAlgoCurve25519SHA256] = &curve25519sha256{} -} - -// curve25519sha256 implements the curve25519-sha256@libssh.org key -// agreement protocol, as described in -// https://git.libssh.org/projects/libssh.git/tree/doc/curve25519-sha256@libssh.org.txt -type curve25519sha256 struct{} - -type curve25519KeyPair struct { - priv [32]byte - pub [32]byte -} - -func (kp *curve25519KeyPair) generate(rand io.Reader) error { - if _, err := io.ReadFull(rand, kp.priv[:]); err != nil { - return err - } - curve25519.ScalarBaseMult(&kp.pub, &kp.priv) - return nil -} - -// curve25519Zeros is just an array of 32 zero bytes so that we have something -// convenient to compare against in order to reject curve25519 points with the -// wrong order. -var curve25519Zeros [32]byte - -func (kex *curve25519sha256) Client(c packetConn, rand io.Reader, magics *handshakeMagics) (*kexResult, error) { - var kp curve25519KeyPair - if err := kp.generate(rand); err != nil { - return nil, err - } - if err := c.writePacket(Marshal(&kexECDHInitMsg{kp.pub[:]})); err != nil { - return nil, err - } - - packet, err := c.readPacket() - if err != nil { - return nil, err - } - - var reply kexECDHReplyMsg - if err = Unmarshal(packet, &reply); err != nil { - return nil, err - } - if len(reply.EphemeralPubKey) != 32 { - return nil, errors.New("ssh: peer's curve25519 public value has wrong length") - } - - var servPub, secret [32]byte - copy(servPub[:], reply.EphemeralPubKey) - curve25519.ScalarMult(&secret, &kp.priv, &servPub) - if subtle.ConstantTimeCompare(secret[:], curve25519Zeros[:]) == 1 { - return nil, errors.New("ssh: peer's curve25519 public value has wrong order") - } - - h := crypto.SHA256.New() - magics.write(h) - writeString(h, reply.HostKey) - writeString(h, kp.pub[:]) - writeString(h, reply.EphemeralPubKey) - - kInt := new(big.Int).SetBytes(secret[:]) - K := make([]byte, intLength(kInt)) - marshalInt(K, kInt) - h.Write(K) - - return &kexResult{ - H: h.Sum(nil), - K: K, - HostKey: reply.HostKey, - Signature: reply.Signature, - Hash: crypto.SHA256, - }, nil -} - -func (kex *curve25519sha256) Server(c packetConn, rand io.Reader, magics *handshakeMagics, priv Signer) (result *kexResult, err error) { - packet, err := c.readPacket() - if err != nil { - return - } - var kexInit kexECDHInitMsg - if err = Unmarshal(packet, &kexInit); err != nil { - return - } - - if len(kexInit.ClientPubKey) != 32 { - return nil, errors.New("ssh: peer's curve25519 public value has wrong length") - } - - var kp curve25519KeyPair - if err := kp.generate(rand); err != nil { - return nil, err - } - - var clientPub, secret [32]byte - copy(clientPub[:], kexInit.ClientPubKey) - curve25519.ScalarMult(&secret, &kp.priv, &clientPub) - if subtle.ConstantTimeCompare(secret[:], curve25519Zeros[:]) == 1 { - return nil, errors.New("ssh: peer's curve25519 public value has wrong order") - } - - hostKeyBytes := priv.PublicKey().Marshal() - - h := crypto.SHA256.New() - magics.write(h) - writeString(h, hostKeyBytes) - writeString(h, kexInit.ClientPubKey) - writeString(h, kp.pub[:]) - - kInt := new(big.Int).SetBytes(secret[:]) - K := make([]byte, intLength(kInt)) - marshalInt(K, kInt) - h.Write(K) - - H := h.Sum(nil) - - sig, err := signAndMarshal(priv, rand, H) - if err != nil { - return nil, err - } - - reply := kexECDHReplyMsg{ - EphemeralPubKey: kp.pub[:], - HostKey: hostKeyBytes, - Signature: sig, - } - if err := c.writePacket(Marshal(&reply)); err != nil { - return nil, err - } - return &kexResult{ - H: H, - K: K, - HostKey: hostKeyBytes, - Signature: sig, - Hash: crypto.SHA256, - }, nil -} diff --git a/vendor/golang.org/x/crypto/ssh/kex_test.go b/vendor/golang.org/x/crypto/ssh/kex_test.go deleted file mode 100644 index 12ca0acd3..000000000 --- a/vendor/golang.org/x/crypto/ssh/kex_test.go +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssh - -// Key exchange tests. - -import ( - "crypto/rand" - "reflect" - "testing" -) - -func TestKexes(t *testing.T) { - type kexResultErr struct { - result *kexResult - err error - } - - for name, kex := range kexAlgoMap { - a, b := memPipe() - - s := make(chan kexResultErr, 1) - c := make(chan kexResultErr, 1) - var magics handshakeMagics - go func() { - r, e := kex.Client(a, rand.Reader, &magics) - a.Close() - c <- kexResultErr{r, e} - }() - go func() { - r, e := kex.Server(b, rand.Reader, &magics, testSigners["ecdsa"]) - b.Close() - s <- kexResultErr{r, e} - }() - - clientRes := <-c - serverRes := <-s - if clientRes.err != nil { - t.Errorf("client: %v", clientRes.err) - } - if serverRes.err != nil { - t.Errorf("server: %v", serverRes.err) - } - if !reflect.DeepEqual(clientRes.result, serverRes.result) { - t.Errorf("kex %q: mismatch %#v, %#v", name, clientRes.result, serverRes.result) - } - } -} diff --git a/vendor/golang.org/x/crypto/ssh/keys.go b/vendor/golang.org/x/crypto/ssh/keys.go deleted file mode 100644 index cf6853232..000000000 --- a/vendor/golang.org/x/crypto/ssh/keys.go +++ /dev/null @@ -1,957 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssh - -import ( - "bytes" - "crypto" - "crypto/dsa" - "crypto/ecdsa" - "crypto/elliptic" - "crypto/md5" - "crypto/rsa" - "crypto/sha256" - "crypto/x509" - "encoding/asn1" - "encoding/base64" - "encoding/hex" - "encoding/pem" - "errors" - "fmt" - "io" - "math/big" - "strings" - - "golang.org/x/crypto/ed25519" -) - -// These constants represent the algorithm names for key types supported by this -// package. -const ( - KeyAlgoRSA = "ssh-rsa" - KeyAlgoDSA = "ssh-dss" - KeyAlgoECDSA256 = "ecdsa-sha2-nistp256" - KeyAlgoECDSA384 = "ecdsa-sha2-nistp384" - KeyAlgoECDSA521 = "ecdsa-sha2-nistp521" - KeyAlgoED25519 = "ssh-ed25519" -) - -// parsePubKey parses a public key of the given algorithm. -// Use ParsePublicKey for keys with prepended algorithm. -func parsePubKey(in []byte, algo string) (pubKey PublicKey, rest []byte, err error) { - switch algo { - case KeyAlgoRSA: - return parseRSA(in) - case KeyAlgoDSA: - return parseDSA(in) - case KeyAlgoECDSA256, KeyAlgoECDSA384, KeyAlgoECDSA521: - return parseECDSA(in) - case KeyAlgoED25519: - return parseED25519(in) - case CertAlgoRSAv01, CertAlgoDSAv01, CertAlgoECDSA256v01, CertAlgoECDSA384v01, CertAlgoECDSA521v01, CertAlgoED25519v01: - cert, err := parseCert(in, certToPrivAlgo(algo)) - if err != nil { - return nil, nil, err - } - return cert, nil, nil - } - return nil, nil, fmt.Errorf("ssh: unknown key algorithm: %v", algo) -} - -// parseAuthorizedKey parses a public key in OpenSSH authorized_keys format -// (see sshd(8) manual page) once the options and key type fields have been -// removed. -func parseAuthorizedKey(in []byte) (out PublicKey, comment string, err error) { - in = bytes.TrimSpace(in) - - i := bytes.IndexAny(in, " \t") - if i == -1 { - i = len(in) - } - base64Key := in[:i] - - key := make([]byte, base64.StdEncoding.DecodedLen(len(base64Key))) - n, err := base64.StdEncoding.Decode(key, base64Key) - if err != nil { - return nil, "", err - } - key = key[:n] - out, err = ParsePublicKey(key) - if err != nil { - return nil, "", err - } - comment = string(bytes.TrimSpace(in[i:])) - return out, comment, nil -} - -// ParseKnownHosts parses an entry in the format of the known_hosts file. -// -// The known_hosts format is documented in the sshd(8) manual page. This -// function will parse a single entry from in. On successful return, marker -// will contain the optional marker value (i.e. "cert-authority" or "revoked") -// or else be empty, hosts will contain the hosts that this entry matches, -// pubKey will contain the public key and comment will contain any trailing -// comment at the end of the line. See the sshd(8) manual page for the various -// forms that a host string can take. -// -// The unparsed remainder of the input will be returned in rest. This function -// can be called repeatedly to parse multiple entries. -// -// If no entries were found in the input then err will be io.EOF. Otherwise a -// non-nil err value indicates a parse error. -func ParseKnownHosts(in []byte) (marker string, hosts []string, pubKey PublicKey, comment string, rest []byte, err error) { - for len(in) > 0 { - end := bytes.IndexByte(in, '\n') - if end != -1 { - rest = in[end+1:] - in = in[:end] - } else { - rest = nil - } - - end = bytes.IndexByte(in, '\r') - if end != -1 { - in = in[:end] - } - - in = bytes.TrimSpace(in) - if len(in) == 0 || in[0] == '#' { - in = rest - continue - } - - i := bytes.IndexAny(in, " \t") - if i == -1 { - in = rest - continue - } - - // Strip out the beginning of the known_host key. - // This is either an optional marker or a (set of) hostname(s). - keyFields := bytes.Fields(in) - if len(keyFields) < 3 || len(keyFields) > 5 { - return "", nil, nil, "", nil, errors.New("ssh: invalid entry in known_hosts data") - } - - // keyFields[0] is either "@cert-authority", "@revoked" or a comma separated - // list of hosts - marker := "" - if keyFields[0][0] == '@' { - marker = string(keyFields[0][1:]) - keyFields = keyFields[1:] - } - - hosts := string(keyFields[0]) - // keyFields[1] contains the key type (e.g. “ssh-rsa”). - // However, that information is duplicated inside the - // base64-encoded key and so is ignored here. - - key := bytes.Join(keyFields[2:], []byte(" ")) - if pubKey, comment, err = parseAuthorizedKey(key); err != nil { - return "", nil, nil, "", nil, err - } - - return marker, strings.Split(hosts, ","), pubKey, comment, rest, nil - } - - return "", nil, nil, "", nil, io.EOF -} - -// ParseAuthorizedKeys parses a public key from an authorized_keys -// file used in OpenSSH according to the sshd(8) manual page. -func ParseAuthorizedKey(in []byte) (out PublicKey, comment string, options []string, rest []byte, err error) { - for len(in) > 0 { - end := bytes.IndexByte(in, '\n') - if end != -1 { - rest = in[end+1:] - in = in[:end] - } else { - rest = nil - } - - end = bytes.IndexByte(in, '\r') - if end != -1 { - in = in[:end] - } - - in = bytes.TrimSpace(in) - if len(in) == 0 || in[0] == '#' { - in = rest - continue - } - - i := bytes.IndexAny(in, " \t") - if i == -1 { - in = rest - continue - } - - if out, comment, err = parseAuthorizedKey(in[i:]); err == nil { - return out, comment, options, rest, nil - } - - // No key type recognised. Maybe there's an options field at - // the beginning. - var b byte - inQuote := false - var candidateOptions []string - optionStart := 0 - for i, b = range in { - isEnd := !inQuote && (b == ' ' || b == '\t') - if (b == ',' && !inQuote) || isEnd { - if i-optionStart > 0 { - candidateOptions = append(candidateOptions, string(in[optionStart:i])) - } - optionStart = i + 1 - } - if isEnd { - break - } - if b == '"' && (i == 0 || (i > 0 && in[i-1] != '\\')) { - inQuote = !inQuote - } - } - for i < len(in) && (in[i] == ' ' || in[i] == '\t') { - i++ - } - if i == len(in) { - // Invalid line: unmatched quote - in = rest - continue - } - - in = in[i:] - i = bytes.IndexAny(in, " \t") - if i == -1 { - in = rest - continue - } - - if out, comment, err = parseAuthorizedKey(in[i:]); err == nil { - options = candidateOptions - return out, comment, options, rest, nil - } - - in = rest - continue - } - - return nil, "", nil, nil, errors.New("ssh: no key found") -} - -// ParsePublicKey parses an SSH public key formatted for use in -// the SSH wire protocol according to RFC 4253, section 6.6. -func ParsePublicKey(in []byte) (out PublicKey, err error) { - algo, in, ok := parseString(in) - if !ok { - return nil, errShortRead - } - var rest []byte - out, rest, err = parsePubKey(in, string(algo)) - if len(rest) > 0 { - return nil, errors.New("ssh: trailing junk in public key") - } - - return out, err -} - -// MarshalAuthorizedKey serializes key for inclusion in an OpenSSH -// authorized_keys file. The return value ends with newline. -func MarshalAuthorizedKey(key PublicKey) []byte { - b := &bytes.Buffer{} - b.WriteString(key.Type()) - b.WriteByte(' ') - e := base64.NewEncoder(base64.StdEncoding, b) - e.Write(key.Marshal()) - e.Close() - b.WriteByte('\n') - return b.Bytes() -} - -// PublicKey is an abstraction of different types of public keys. -type PublicKey interface { - // Type returns the key's type, e.g. "ssh-rsa". - Type() string - - // Marshal returns the serialized key data in SSH wire format, - // with the name prefix. - Marshal() []byte - - // Verify that sig is a signature on the given data using this - // key. This function will hash the data appropriately first. - Verify(data []byte, sig *Signature) error -} - -// CryptoPublicKey, if implemented by a PublicKey, -// returns the underlying crypto.PublicKey form of the key. -type CryptoPublicKey interface { - CryptoPublicKey() crypto.PublicKey -} - -// A Signer can create signatures that verify against a public key. -type Signer interface { - // PublicKey returns an associated PublicKey instance. - PublicKey() PublicKey - - // Sign returns raw signature for the given data. This method - // will apply the hash specified for the keytype to the data. - Sign(rand io.Reader, data []byte) (*Signature, error) -} - -type rsaPublicKey rsa.PublicKey - -func (r *rsaPublicKey) Type() string { - return "ssh-rsa" -} - -// parseRSA parses an RSA key according to RFC 4253, section 6.6. -func parseRSA(in []byte) (out PublicKey, rest []byte, err error) { - var w struct { - E *big.Int - N *big.Int - Rest []byte `ssh:"rest"` - } - if err := Unmarshal(in, &w); err != nil { - return nil, nil, err - } - - if w.E.BitLen() > 24 { - return nil, nil, errors.New("ssh: exponent too large") - } - e := w.E.Int64() - if e < 3 || e&1 == 0 { - return nil, nil, errors.New("ssh: incorrect exponent") - } - - var key rsa.PublicKey - key.E = int(e) - key.N = w.N - return (*rsaPublicKey)(&key), w.Rest, nil -} - -func (r *rsaPublicKey) Marshal() []byte { - e := new(big.Int).SetInt64(int64(r.E)) - // RSA publickey struct layout should match the struct used by - // parseRSACert in the x/crypto/ssh/agent package. - wirekey := struct { - Name string - E *big.Int - N *big.Int - }{ - KeyAlgoRSA, - e, - r.N, - } - return Marshal(&wirekey) -} - -func (r *rsaPublicKey) Verify(data []byte, sig *Signature) error { - if sig.Format != r.Type() { - return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, r.Type()) - } - h := crypto.SHA1.New() - h.Write(data) - digest := h.Sum(nil) - return rsa.VerifyPKCS1v15((*rsa.PublicKey)(r), crypto.SHA1, digest, sig.Blob) -} - -func (r *rsaPublicKey) CryptoPublicKey() crypto.PublicKey { - return (*rsa.PublicKey)(r) -} - -type dsaPublicKey dsa.PublicKey - -func (r *dsaPublicKey) Type() string { - return "ssh-dss" -} - -// parseDSA parses an DSA key according to RFC 4253, section 6.6. -func parseDSA(in []byte) (out PublicKey, rest []byte, err error) { - var w struct { - P, Q, G, Y *big.Int - Rest []byte `ssh:"rest"` - } - if err := Unmarshal(in, &w); err != nil { - return nil, nil, err - } - - key := &dsaPublicKey{ - Parameters: dsa.Parameters{ - P: w.P, - Q: w.Q, - G: w.G, - }, - Y: w.Y, - } - return key, w.Rest, nil -} - -func (k *dsaPublicKey) Marshal() []byte { - // DSA publickey struct layout should match the struct used by - // parseDSACert in the x/crypto/ssh/agent package. - w := struct { - Name string - P, Q, G, Y *big.Int - }{ - k.Type(), - k.P, - k.Q, - k.G, - k.Y, - } - - return Marshal(&w) -} - -func (k *dsaPublicKey) Verify(data []byte, sig *Signature) error { - if sig.Format != k.Type() { - return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type()) - } - h := crypto.SHA1.New() - h.Write(data) - digest := h.Sum(nil) - - // Per RFC 4253, section 6.6, - // The value for 'dss_signature_blob' is encoded as a string containing - // r, followed by s (which are 160-bit integers, without lengths or - // padding, unsigned, and in network byte order). - // For DSS purposes, sig.Blob should be exactly 40 bytes in length. - if len(sig.Blob) != 40 { - return errors.New("ssh: DSA signature parse error") - } - r := new(big.Int).SetBytes(sig.Blob[:20]) - s := new(big.Int).SetBytes(sig.Blob[20:]) - if dsa.Verify((*dsa.PublicKey)(k), digest, r, s) { - return nil - } - return errors.New("ssh: signature did not verify") -} - -func (k *dsaPublicKey) CryptoPublicKey() crypto.PublicKey { - return (*dsa.PublicKey)(k) -} - -type dsaPrivateKey struct { - *dsa.PrivateKey -} - -func (k *dsaPrivateKey) PublicKey() PublicKey { - return (*dsaPublicKey)(&k.PrivateKey.PublicKey) -} - -func (k *dsaPrivateKey) Sign(rand io.Reader, data []byte) (*Signature, error) { - h := crypto.SHA1.New() - h.Write(data) - digest := h.Sum(nil) - r, s, err := dsa.Sign(rand, k.PrivateKey, digest) - if err != nil { - return nil, err - } - - sig := make([]byte, 40) - rb := r.Bytes() - sb := s.Bytes() - - copy(sig[20-len(rb):20], rb) - copy(sig[40-len(sb):], sb) - - return &Signature{ - Format: k.PublicKey().Type(), - Blob: sig, - }, nil -} - -type ecdsaPublicKey ecdsa.PublicKey - -func (key *ecdsaPublicKey) Type() string { - return "ecdsa-sha2-" + key.nistID() -} - -func (key *ecdsaPublicKey) nistID() string { - switch key.Params().BitSize { - case 256: - return "nistp256" - case 384: - return "nistp384" - case 521: - return "nistp521" - } - panic("ssh: unsupported ecdsa key size") -} - -type ed25519PublicKey ed25519.PublicKey - -func (key ed25519PublicKey) Type() string { - return KeyAlgoED25519 -} - -func parseED25519(in []byte) (out PublicKey, rest []byte, err error) { - var w struct { - KeyBytes []byte - Rest []byte `ssh:"rest"` - } - - if err := Unmarshal(in, &w); err != nil { - return nil, nil, err - } - - key := ed25519.PublicKey(w.KeyBytes) - - return (ed25519PublicKey)(key), w.Rest, nil -} - -func (key ed25519PublicKey) Marshal() []byte { - w := struct { - Name string - KeyBytes []byte - }{ - KeyAlgoED25519, - []byte(key), - } - return Marshal(&w) -} - -func (key ed25519PublicKey) Verify(b []byte, sig *Signature) error { - if sig.Format != key.Type() { - return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, key.Type()) - } - - edKey := (ed25519.PublicKey)(key) - if ok := ed25519.Verify(edKey, b, sig.Blob); !ok { - return errors.New("ssh: signature did not verify") - } - - return nil -} - -func (k ed25519PublicKey) CryptoPublicKey() crypto.PublicKey { - return ed25519.PublicKey(k) -} - -func supportedEllipticCurve(curve elliptic.Curve) bool { - return curve == elliptic.P256() || curve == elliptic.P384() || curve == elliptic.P521() -} - -// ecHash returns the hash to match the given elliptic curve, see RFC -// 5656, section 6.2.1 -func ecHash(curve elliptic.Curve) crypto.Hash { - bitSize := curve.Params().BitSize - switch { - case bitSize <= 256: - return crypto.SHA256 - case bitSize <= 384: - return crypto.SHA384 - } - return crypto.SHA512 -} - -// parseECDSA parses an ECDSA key according to RFC 5656, section 3.1. -func parseECDSA(in []byte) (out PublicKey, rest []byte, err error) { - var w struct { - Curve string - KeyBytes []byte - Rest []byte `ssh:"rest"` - } - - if err := Unmarshal(in, &w); err != nil { - return nil, nil, err - } - - key := new(ecdsa.PublicKey) - - switch w.Curve { - case "nistp256": - key.Curve = elliptic.P256() - case "nistp384": - key.Curve = elliptic.P384() - case "nistp521": - key.Curve = elliptic.P521() - default: - return nil, nil, errors.New("ssh: unsupported curve") - } - - key.X, key.Y = elliptic.Unmarshal(key.Curve, w.KeyBytes) - if key.X == nil || key.Y == nil { - return nil, nil, errors.New("ssh: invalid curve point") - } - return (*ecdsaPublicKey)(key), w.Rest, nil -} - -func (key *ecdsaPublicKey) Marshal() []byte { - // See RFC 5656, section 3.1. - keyBytes := elliptic.Marshal(key.Curve, key.X, key.Y) - // ECDSA publickey struct layout should match the struct used by - // parseECDSACert in the x/crypto/ssh/agent package. - w := struct { - Name string - ID string - Key []byte - }{ - key.Type(), - key.nistID(), - keyBytes, - } - - return Marshal(&w) -} - -func (key *ecdsaPublicKey) Verify(data []byte, sig *Signature) error { - if sig.Format != key.Type() { - return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, key.Type()) - } - - h := ecHash(key.Curve).New() - h.Write(data) - digest := h.Sum(nil) - - // Per RFC 5656, section 3.1.2, - // The ecdsa_signature_blob value has the following specific encoding: - // mpint r - // mpint s - var ecSig struct { - R *big.Int - S *big.Int - } - - if err := Unmarshal(sig.Blob, &ecSig); err != nil { - return err - } - - if ecdsa.Verify((*ecdsa.PublicKey)(key), digest, ecSig.R, ecSig.S) { - return nil - } - return errors.New("ssh: signature did not verify") -} - -func (k *ecdsaPublicKey) CryptoPublicKey() crypto.PublicKey { - return (*ecdsa.PublicKey)(k) -} - -// NewSignerFromKey takes an *rsa.PrivateKey, *dsa.PrivateKey, -// *ecdsa.PrivateKey or any other crypto.Signer and returns a corresponding -// Signer instance. ECDSA keys must use P-256, P-384 or P-521. -func NewSignerFromKey(key interface{}) (Signer, error) { - switch key := key.(type) { - case crypto.Signer: - return NewSignerFromSigner(key) - case *dsa.PrivateKey: - return &dsaPrivateKey{key}, nil - default: - return nil, fmt.Errorf("ssh: unsupported key type %T", key) - } -} - -type wrappedSigner struct { - signer crypto.Signer - pubKey PublicKey -} - -// NewSignerFromSigner takes any crypto.Signer implementation and -// returns a corresponding Signer interface. This can be used, for -// example, with keys kept in hardware modules. -func NewSignerFromSigner(signer crypto.Signer) (Signer, error) { - pubKey, err := NewPublicKey(signer.Public()) - if err != nil { - return nil, err - } - - return &wrappedSigner{signer, pubKey}, nil -} - -func (s *wrappedSigner) PublicKey() PublicKey { - return s.pubKey -} - -func (s *wrappedSigner) Sign(rand io.Reader, data []byte) (*Signature, error) { - var hashFunc crypto.Hash - - switch key := s.pubKey.(type) { - case *rsaPublicKey, *dsaPublicKey: - hashFunc = crypto.SHA1 - case *ecdsaPublicKey: - hashFunc = ecHash(key.Curve) - case ed25519PublicKey: - default: - return nil, fmt.Errorf("ssh: unsupported key type %T", key) - } - - var digest []byte - if hashFunc != 0 { - h := hashFunc.New() - h.Write(data) - digest = h.Sum(nil) - } else { - digest = data - } - - signature, err := s.signer.Sign(rand, digest, hashFunc) - if err != nil { - return nil, err - } - - // crypto.Signer.Sign is expected to return an ASN.1-encoded signature - // for ECDSA and DSA, but that's not the encoding expected by SSH, so - // re-encode. - switch s.pubKey.(type) { - case *ecdsaPublicKey, *dsaPublicKey: - type asn1Signature struct { - R, S *big.Int - } - asn1Sig := new(asn1Signature) - _, err := asn1.Unmarshal(signature, asn1Sig) - if err != nil { - return nil, err - } - - switch s.pubKey.(type) { - case *ecdsaPublicKey: - signature = Marshal(asn1Sig) - - case *dsaPublicKey: - signature = make([]byte, 40) - r := asn1Sig.R.Bytes() - s := asn1Sig.S.Bytes() - copy(signature[20-len(r):20], r) - copy(signature[40-len(s):40], s) - } - } - - return &Signature{ - Format: s.pubKey.Type(), - Blob: signature, - }, nil -} - -// NewPublicKey takes an *rsa.PublicKey, *dsa.PublicKey, *ecdsa.PublicKey, -// or ed25519.PublicKey returns a corresponding PublicKey instance. -// ECDSA keys must use P-256, P-384 or P-521. -func NewPublicKey(key interface{}) (PublicKey, error) { - switch key := key.(type) { - case *rsa.PublicKey: - return (*rsaPublicKey)(key), nil - case *ecdsa.PublicKey: - if !supportedEllipticCurve(key.Curve) { - return nil, errors.New("ssh: only P-256, P-384 and P-521 EC keys are supported.") - } - return (*ecdsaPublicKey)(key), nil - case *dsa.PublicKey: - return (*dsaPublicKey)(key), nil - case ed25519.PublicKey: - return (ed25519PublicKey)(key), nil - default: - return nil, fmt.Errorf("ssh: unsupported key type %T", key) - } -} - -// ParsePrivateKey returns a Signer from a PEM encoded private key. It supports -// the same keys as ParseRawPrivateKey. -func ParsePrivateKey(pemBytes []byte) (Signer, error) { - key, err := ParseRawPrivateKey(pemBytes) - if err != nil { - return nil, err - } - - return NewSignerFromKey(key) -} - -// encryptedBlock tells whether a private key is -// encrypted by examining its Proc-Type header -// for a mention of ENCRYPTED -// according to RFC 1421 Section 4.6.1.1. -func encryptedBlock(block *pem.Block) bool { - return strings.Contains(block.Headers["Proc-Type"], "ENCRYPTED") -} - -// ParseRawPrivateKey returns a private key from a PEM encoded private key. It -// supports RSA (PKCS#1), DSA (OpenSSL), and ECDSA private keys. -func ParseRawPrivateKey(pemBytes []byte) (interface{}, error) { - block, _ := pem.Decode(pemBytes) - if block == nil { - return nil, errors.New("ssh: no key found") - } - - if encryptedBlock(block) { - return nil, errors.New("ssh: cannot decode encrypted private keys") - } - - switch block.Type { - case "RSA PRIVATE KEY": - return x509.ParsePKCS1PrivateKey(block.Bytes) - case "EC PRIVATE KEY": - return x509.ParseECPrivateKey(block.Bytes) - case "DSA PRIVATE KEY": - return ParseDSAPrivateKey(block.Bytes) - case "OPENSSH PRIVATE KEY": - return parseOpenSSHPrivateKey(block.Bytes) - default: - return nil, fmt.Errorf("ssh: unsupported key type %q", block.Type) - } -} - -// ParseDSAPrivateKey returns a DSA private key from its ASN.1 DER encoding, as -// specified by the OpenSSL DSA man page. -func ParseDSAPrivateKey(der []byte) (*dsa.PrivateKey, error) { - var k struct { - Version int - P *big.Int - Q *big.Int - G *big.Int - Pub *big.Int - Priv *big.Int - } - rest, err := asn1.Unmarshal(der, &k) - if err != nil { - return nil, errors.New("ssh: failed to parse DSA key: " + err.Error()) - } - if len(rest) > 0 { - return nil, errors.New("ssh: garbage after DSA key") - } - - return &dsa.PrivateKey{ - PublicKey: dsa.PublicKey{ - Parameters: dsa.Parameters{ - P: k.P, - Q: k.Q, - G: k.G, - }, - Y: k.Pub, - }, - X: k.Priv, - }, nil -} - -// Implemented based on the documentation at -// https://github.com/openssh/openssh-portable/blob/master/PROTOCOL.key -func parseOpenSSHPrivateKey(key []byte) (crypto.PrivateKey, error) { - magic := append([]byte("openssh-key-v1"), 0) - if !bytes.Equal(magic, key[0:len(magic)]) { - return nil, errors.New("ssh: invalid openssh private key format") - } - remaining := key[len(magic):] - - var w struct { - CipherName string - KdfName string - KdfOpts string - NumKeys uint32 - PubKey []byte - PrivKeyBlock []byte - } - - if err := Unmarshal(remaining, &w); err != nil { - return nil, err - } - - if w.KdfName != "none" || w.CipherName != "none" { - return nil, errors.New("ssh: cannot decode encrypted private keys") - } - - pk1 := struct { - Check1 uint32 - Check2 uint32 - Keytype string - Rest []byte `ssh:"rest"` - }{} - - if err := Unmarshal(w.PrivKeyBlock, &pk1); err != nil { - return nil, err - } - - if pk1.Check1 != pk1.Check2 { - return nil, errors.New("ssh: checkint mismatch") - } - - // we only handle ed25519 and rsa keys currently - switch pk1.Keytype { - case KeyAlgoRSA: - // https://github.com/openssh/openssh-portable/blob/master/sshkey.c#L2760-L2773 - key := struct { - N *big.Int - E *big.Int - D *big.Int - Iqmp *big.Int - P *big.Int - Q *big.Int - Comment string - Pad []byte `ssh:"rest"` - }{} - - if err := Unmarshal(pk1.Rest, &key); err != nil { - return nil, err - } - - for i, b := range key.Pad { - if int(b) != i+1 { - return nil, errors.New("ssh: padding not as expected") - } - } - - pk := &rsa.PrivateKey{ - PublicKey: rsa.PublicKey{ - N: key.N, - E: int(key.E.Int64()), - }, - D: key.D, - Primes: []*big.Int{key.P, key.Q}, - } - - if err := pk.Validate(); err != nil { - return nil, err - } - - pk.Precompute() - - return pk, nil - case KeyAlgoED25519: - key := struct { - Pub []byte - Priv []byte - Comment string - Pad []byte `ssh:"rest"` - }{} - - if err := Unmarshal(pk1.Rest, &key); err != nil { - return nil, err - } - - if len(key.Priv) != ed25519.PrivateKeySize { - return nil, errors.New("ssh: private key unexpected length") - } - - for i, b := range key.Pad { - if int(b) != i+1 { - return nil, errors.New("ssh: padding not as expected") - } - } - - pk := ed25519.PrivateKey(make([]byte, ed25519.PrivateKeySize)) - copy(pk, key.Priv) - return &pk, nil - default: - return nil, errors.New("ssh: unhandled key type") - } -} - -// FingerprintLegacyMD5 returns the user presentation of the key's -// fingerprint as described by RFC 4716 section 4. -func FingerprintLegacyMD5(pubKey PublicKey) string { - md5sum := md5.Sum(pubKey.Marshal()) - hexarray := make([]string, len(md5sum)) - for i, c := range md5sum { - hexarray[i] = hex.EncodeToString([]byte{c}) - } - return strings.Join(hexarray, ":") -} - -// FingerprintSHA256 returns the user presentation of the key's -// fingerprint as unpadded base64 encoded sha256 hash. -// This format was introduced from OpenSSH 6.8. -// https://www.openssh.com/txt/release-6.8 -// https://tools.ietf.org/html/rfc4648#section-3.2 (unpadded base64 encoding) -func FingerprintSHA256(pubKey PublicKey) string { - sha256sum := sha256.Sum256(pubKey.Marshal()) - hash := base64.RawStdEncoding.EncodeToString(sha256sum[:]) - return "SHA256:" + hash -} diff --git a/vendor/golang.org/x/crypto/ssh/keys_test.go b/vendor/golang.org/x/crypto/ssh/keys_test.go deleted file mode 100644 index a65e87e53..000000000 --- a/vendor/golang.org/x/crypto/ssh/keys_test.go +++ /dev/null @@ -1,474 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssh - -import ( - "bytes" - "crypto/dsa" - "crypto/ecdsa" - "crypto/elliptic" - "crypto/rand" - "crypto/rsa" - "encoding/base64" - "fmt" - "reflect" - "strings" - "testing" - - "golang.org/x/crypto/ed25519" - "golang.org/x/crypto/ssh/testdata" -) - -func rawKey(pub PublicKey) interface{} { - switch k := pub.(type) { - case *rsaPublicKey: - return (*rsa.PublicKey)(k) - case *dsaPublicKey: - return (*dsa.PublicKey)(k) - case *ecdsaPublicKey: - return (*ecdsa.PublicKey)(k) - case ed25519PublicKey: - return (ed25519.PublicKey)(k) - case *Certificate: - return k - } - panic("unknown key type") -} - -func TestKeyMarshalParse(t *testing.T) { - for _, priv := range testSigners { - pub := priv.PublicKey() - roundtrip, err := ParsePublicKey(pub.Marshal()) - if err != nil { - t.Errorf("ParsePublicKey(%T): %v", pub, err) - } - - k1 := rawKey(pub) - k2 := rawKey(roundtrip) - - if !reflect.DeepEqual(k1, k2) { - t.Errorf("got %#v in roundtrip, want %#v", k2, k1) - } - } -} - -func TestUnsupportedCurves(t *testing.T) { - raw, err := ecdsa.GenerateKey(elliptic.P224(), rand.Reader) - if err != nil { - t.Fatalf("GenerateKey: %v", err) - } - - if _, err = NewSignerFromKey(raw); err == nil || !strings.Contains(err.Error(), "only P-256") { - t.Fatalf("NewPrivateKey should not succeed with P-224, got: %v", err) - } - - if _, err = NewPublicKey(&raw.PublicKey); err == nil || !strings.Contains(err.Error(), "only P-256") { - t.Fatalf("NewPublicKey should not succeed with P-224, got: %v", err) - } -} - -func TestNewPublicKey(t *testing.T) { - for _, k := range testSigners { - raw := rawKey(k.PublicKey()) - // Skip certificates, as NewPublicKey does not support them. - if _, ok := raw.(*Certificate); ok { - continue - } - pub, err := NewPublicKey(raw) - if err != nil { - t.Errorf("NewPublicKey(%#v): %v", raw, err) - } - if !reflect.DeepEqual(k.PublicKey(), pub) { - t.Errorf("NewPublicKey(%#v) = %#v, want %#v", raw, pub, k.PublicKey()) - } - } -} - -func TestKeySignVerify(t *testing.T) { - for _, priv := range testSigners { - pub := priv.PublicKey() - - data := []byte("sign me") - sig, err := priv.Sign(rand.Reader, data) - if err != nil { - t.Fatalf("Sign(%T): %v", priv, err) - } - - if err := pub.Verify(data, sig); err != nil { - t.Errorf("publicKey.Verify(%T): %v", priv, err) - } - sig.Blob[5]++ - if err := pub.Verify(data, sig); err == nil { - t.Errorf("publicKey.Verify on broken sig did not fail") - } - } -} - -func TestParseRSAPrivateKey(t *testing.T) { - key := testPrivateKeys["rsa"] - - rsa, ok := key.(*rsa.PrivateKey) - if !ok { - t.Fatalf("got %T, want *rsa.PrivateKey", rsa) - } - - if err := rsa.Validate(); err != nil { - t.Errorf("Validate: %v", err) - } -} - -func TestParseECPrivateKey(t *testing.T) { - key := testPrivateKeys["ecdsa"] - - ecKey, ok := key.(*ecdsa.PrivateKey) - if !ok { - t.Fatalf("got %T, want *ecdsa.PrivateKey", ecKey) - } - - if !validateECPublicKey(ecKey.Curve, ecKey.X, ecKey.Y) { - t.Fatalf("public key does not validate.") - } -} - -// See Issue https://github.com/golang/go/issues/6650. -func TestParseEncryptedPrivateKeysFails(t *testing.T) { - const wantSubstring = "encrypted" - for i, tt := range testdata.PEMEncryptedKeys { - _, err := ParsePrivateKey(tt.PEMBytes) - if err == nil { - t.Errorf("#%d key %s: ParsePrivateKey successfully parsed, expected an error", i, tt.Name) - continue - } - - if !strings.Contains(err.Error(), wantSubstring) { - t.Errorf("#%d key %s: got error %q, want substring %q", i, tt.Name, err, wantSubstring) - } - } -} - -func TestParseDSA(t *testing.T) { - // We actually exercise the ParsePrivateKey codepath here, as opposed to - // using the ParseRawPrivateKey+NewSignerFromKey path that testdata_test.go - // uses. - s, err := ParsePrivateKey(testdata.PEMBytes["dsa"]) - if err != nil { - t.Fatalf("ParsePrivateKey returned error: %s", err) - } - - data := []byte("sign me") - sig, err := s.Sign(rand.Reader, data) - if err != nil { - t.Fatalf("dsa.Sign: %v", err) - } - - if err := s.PublicKey().Verify(data, sig); err != nil { - t.Errorf("Verify failed: %v", err) - } -} - -// Tests for authorized_keys parsing. - -// getTestKey returns a public key, and its base64 encoding. -func getTestKey() (PublicKey, string) { - k := testPublicKeys["rsa"] - - b := &bytes.Buffer{} - e := base64.NewEncoder(base64.StdEncoding, b) - e.Write(k.Marshal()) - e.Close() - - return k, b.String() -} - -func TestMarshalParsePublicKey(t *testing.T) { - pub, pubSerialized := getTestKey() - line := fmt.Sprintf("%s %s user@host", pub.Type(), pubSerialized) - - authKeys := MarshalAuthorizedKey(pub) - actualFields := strings.Fields(string(authKeys)) - if len(actualFields) == 0 { - t.Fatalf("failed authKeys: %v", authKeys) - } - - // drop the comment - expectedFields := strings.Fields(line)[0:2] - - if !reflect.DeepEqual(actualFields, expectedFields) { - t.Errorf("got %v, expected %v", actualFields, expectedFields) - } - - actPub, _, _, _, err := ParseAuthorizedKey([]byte(line)) - if err != nil { - t.Fatalf("cannot parse %v: %v", line, err) - } - if !reflect.DeepEqual(actPub, pub) { - t.Errorf("got %v, expected %v", actPub, pub) - } -} - -type authResult struct { - pubKey PublicKey - options []string - comments string - rest string - ok bool -} - -func testAuthorizedKeys(t *testing.T, authKeys []byte, expected []authResult) { - rest := authKeys - var values []authResult - for len(rest) > 0 { - var r authResult - var err error - r.pubKey, r.comments, r.options, rest, err = ParseAuthorizedKey(rest) - r.ok = (err == nil) - t.Log(err) - r.rest = string(rest) - values = append(values, r) - } - - if !reflect.DeepEqual(values, expected) { - t.Errorf("got %#v, expected %#v", values, expected) - } -} - -func TestAuthorizedKeyBasic(t *testing.T) { - pub, pubSerialized := getTestKey() - line := "ssh-rsa " + pubSerialized + " user@host" - testAuthorizedKeys(t, []byte(line), - []authResult{ - {pub, nil, "user@host", "", true}, - }) -} - -func TestAuth(t *testing.T) { - pub, pubSerialized := getTestKey() - authWithOptions := []string{ - `# comments to ignore before any keys...`, - ``, - `env="HOME=/home/root",no-port-forwarding ssh-rsa ` + pubSerialized + ` user@host`, - `# comments to ignore, along with a blank line`, - ``, - `env="HOME=/home/root2" ssh-rsa ` + pubSerialized + ` user2@host2`, - ``, - `# more comments, plus a invalid entry`, - `ssh-rsa data-that-will-not-parse user@host3`, - } - for _, eol := range []string{"\n", "\r\n"} { - authOptions := strings.Join(authWithOptions, eol) - rest2 := strings.Join(authWithOptions[3:], eol) - rest3 := strings.Join(authWithOptions[6:], eol) - testAuthorizedKeys(t, []byte(authOptions), []authResult{ - {pub, []string{`env="HOME=/home/root"`, "no-port-forwarding"}, "user@host", rest2, true}, - {pub, []string{`env="HOME=/home/root2"`}, "user2@host2", rest3, true}, - {nil, nil, "", "", false}, - }) - } -} - -func TestAuthWithQuotedSpaceInEnv(t *testing.T) { - pub, pubSerialized := getTestKey() - authWithQuotedSpaceInEnv := []byte(`env="HOME=/home/root dir",no-port-forwarding ssh-rsa ` + pubSerialized + ` user@host`) - testAuthorizedKeys(t, []byte(authWithQuotedSpaceInEnv), []authResult{ - {pub, []string{`env="HOME=/home/root dir"`, "no-port-forwarding"}, "user@host", "", true}, - }) -} - -func TestAuthWithQuotedCommaInEnv(t *testing.T) { - pub, pubSerialized := getTestKey() - authWithQuotedCommaInEnv := []byte(`env="HOME=/home/root,dir",no-port-forwarding ssh-rsa ` + pubSerialized + ` user@host`) - testAuthorizedKeys(t, []byte(authWithQuotedCommaInEnv), []authResult{ - {pub, []string{`env="HOME=/home/root,dir"`, "no-port-forwarding"}, "user@host", "", true}, - }) -} - -func TestAuthWithQuotedQuoteInEnv(t *testing.T) { - pub, pubSerialized := getTestKey() - authWithQuotedQuoteInEnv := []byte(`env="HOME=/home/\"root dir",no-port-forwarding` + "\t" + `ssh-rsa` + "\t" + pubSerialized + ` user@host`) - authWithDoubleQuotedQuote := []byte(`no-port-forwarding,env="HOME=/home/ \"root dir\"" ssh-rsa ` + pubSerialized + "\t" + `user@host`) - testAuthorizedKeys(t, []byte(authWithQuotedQuoteInEnv), []authResult{ - {pub, []string{`env="HOME=/home/\"root dir"`, "no-port-forwarding"}, "user@host", "", true}, - }) - - testAuthorizedKeys(t, []byte(authWithDoubleQuotedQuote), []authResult{ - {pub, []string{"no-port-forwarding", `env="HOME=/home/ \"root dir\""`}, "user@host", "", true}, - }) -} - -func TestAuthWithInvalidSpace(t *testing.T) { - _, pubSerialized := getTestKey() - authWithInvalidSpace := []byte(`env="HOME=/home/root dir", no-port-forwarding ssh-rsa ` + pubSerialized + ` user@host -#more to follow but still no valid keys`) - testAuthorizedKeys(t, []byte(authWithInvalidSpace), []authResult{ - {nil, nil, "", "", false}, - }) -} - -func TestAuthWithMissingQuote(t *testing.T) { - pub, pubSerialized := getTestKey() - authWithMissingQuote := []byte(`env="HOME=/home/root,no-port-forwarding ssh-rsa ` + pubSerialized + ` user@host -env="HOME=/home/root",shared-control ssh-rsa ` + pubSerialized + ` user@host`) - - testAuthorizedKeys(t, []byte(authWithMissingQuote), []authResult{ - {pub, []string{`env="HOME=/home/root"`, `shared-control`}, "user@host", "", true}, - }) -} - -func TestInvalidEntry(t *testing.T) { - authInvalid := []byte(`ssh-rsa`) - _, _, _, _, err := ParseAuthorizedKey(authInvalid) - if err == nil { - t.Errorf("got valid entry for %q", authInvalid) - } -} - -var knownHostsParseTests = []struct { - input string - err string - - marker string - comment string - hosts []string - rest string -}{ - { - "", - "EOF", - - "", "", nil, "", - }, - { - "# Just a comment", - "EOF", - - "", "", nil, "", - }, - { - " \t ", - "EOF", - - "", "", nil, "", - }, - { - "localhost ssh-rsa {RSAPUB}", - "", - - "", "", []string{"localhost"}, "", - }, - { - "localhost\tssh-rsa {RSAPUB}", - "", - - "", "", []string{"localhost"}, "", - }, - { - "localhost\tssh-rsa {RSAPUB}\tcomment comment", - "", - - "", "comment comment", []string{"localhost"}, "", - }, - { - "localhost\tssh-rsa {RSAPUB}\tcomment comment\n", - "", - - "", "comment comment", []string{"localhost"}, "", - }, - { - "localhost\tssh-rsa {RSAPUB}\tcomment comment\r\n", - "", - - "", "comment comment", []string{"localhost"}, "", - }, - { - "localhost\tssh-rsa {RSAPUB}\tcomment comment\r\nnext line", - "", - - "", "comment comment", []string{"localhost"}, "next line", - }, - { - "localhost,[host2:123]\tssh-rsa {RSAPUB}\tcomment comment", - "", - - "", "comment comment", []string{"localhost", "[host2:123]"}, "", - }, - { - "@marker \tlocalhost,[host2:123]\tssh-rsa {RSAPUB}", - "", - - "marker", "", []string{"localhost", "[host2:123]"}, "", - }, - { - "@marker \tlocalhost,[host2:123]\tssh-rsa aabbccdd", - "short read", - - "", "", nil, "", - }, -} - -func TestKnownHostsParsing(t *testing.T) { - rsaPub, rsaPubSerialized := getTestKey() - - for i, test := range knownHostsParseTests { - var expectedKey PublicKey - const rsaKeyToken = "{RSAPUB}" - - input := test.input - if strings.Contains(input, rsaKeyToken) { - expectedKey = rsaPub - input = strings.Replace(test.input, rsaKeyToken, rsaPubSerialized, -1) - } - - marker, hosts, pubKey, comment, rest, err := ParseKnownHosts([]byte(input)) - if err != nil { - if len(test.err) == 0 { - t.Errorf("#%d: unexpectedly failed with %q", i, err) - } else if !strings.Contains(err.Error(), test.err) { - t.Errorf("#%d: expected error containing %q, but got %q", i, test.err, err) - } - continue - } else if len(test.err) != 0 { - t.Errorf("#%d: succeeded but expected error including %q", i, test.err) - continue - } - - if !reflect.DeepEqual(expectedKey, pubKey) { - t.Errorf("#%d: expected key %#v, but got %#v", i, expectedKey, pubKey) - } - - if marker != test.marker { - t.Errorf("#%d: expected marker %q, but got %q", i, test.marker, marker) - } - - if comment != test.comment { - t.Errorf("#%d: expected comment %q, but got %q", i, test.comment, comment) - } - - if !reflect.DeepEqual(test.hosts, hosts) { - t.Errorf("#%d: expected hosts %#v, but got %#v", i, test.hosts, hosts) - } - - if rest := string(rest); rest != test.rest { - t.Errorf("#%d: expected remaining input to be %q, but got %q", i, test.rest, rest) - } - } -} - -func TestFingerprintLegacyMD5(t *testing.T) { - pub, _ := getTestKey() - fingerprint := FingerprintLegacyMD5(pub) - want := "fb:61:6d:1a:e3:f0:95:45:3c:a0:79:be:4a:93:63:66" // ssh-keygen -lf -E md5 rsa - if fingerprint != want { - t.Errorf("got fingerprint %q want %q", fingerprint, want) - } -} - -func TestFingerprintSHA256(t *testing.T) { - pub, _ := getTestKey() - fingerprint := FingerprintSHA256(pub) - want := "SHA256:Anr3LjZK8YVpjrxu79myrW9Hrb/wpcMNpVvTq/RcBm8" // ssh-keygen -lf rsa - if fingerprint != want { - t.Errorf("got fingerprint %q want %q", fingerprint, want) - } -} diff --git a/vendor/golang.org/x/crypto/ssh/mac.go b/vendor/golang.org/x/crypto/ssh/mac.go deleted file mode 100644 index c07a06285..000000000 --- a/vendor/golang.org/x/crypto/ssh/mac.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssh - -// Message authentication support - -import ( - "crypto/hmac" - "crypto/sha1" - "crypto/sha256" - "hash" -) - -type macMode struct { - keySize int - etm bool - new func(key []byte) hash.Hash -} - -// truncatingMAC wraps around a hash.Hash and truncates the output digest to -// a given size. -type truncatingMAC struct { - length int - hmac hash.Hash -} - -func (t truncatingMAC) Write(data []byte) (int, error) { - return t.hmac.Write(data) -} - -func (t truncatingMAC) Sum(in []byte) []byte { - out := t.hmac.Sum(in) - return out[:len(in)+t.length] -} - -func (t truncatingMAC) Reset() { - t.hmac.Reset() -} - -func (t truncatingMAC) Size() int { - return t.length -} - -func (t truncatingMAC) BlockSize() int { return t.hmac.BlockSize() } - -var macModes = map[string]*macMode{ - "hmac-sha2-256-etm@openssh.com": {32, true, func(key []byte) hash.Hash { - return hmac.New(sha256.New, key) - }}, - "hmac-sha2-256": {32, false, func(key []byte) hash.Hash { - return hmac.New(sha256.New, key) - }}, - "hmac-sha1": {20, false, func(key []byte) hash.Hash { - return hmac.New(sha1.New, key) - }}, - "hmac-sha1-96": {20, false, func(key []byte) hash.Hash { - return truncatingMAC{12, hmac.New(sha1.New, key)} - }}, -} diff --git a/vendor/golang.org/x/crypto/ssh/mempipe_test.go b/vendor/golang.org/x/crypto/ssh/mempipe_test.go deleted file mode 100644 index 8697cd614..000000000 --- a/vendor/golang.org/x/crypto/ssh/mempipe_test.go +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssh - -import ( - "io" - "sync" - "testing" -) - -// An in-memory packetConn. It is safe to call Close and writePacket -// from different goroutines. -type memTransport struct { - eof bool - pending [][]byte - write *memTransport - sync.Mutex - *sync.Cond -} - -func (t *memTransport) readPacket() ([]byte, error) { - t.Lock() - defer t.Unlock() - for { - if len(t.pending) > 0 { - r := t.pending[0] - t.pending = t.pending[1:] - return r, nil - } - if t.eof { - return nil, io.EOF - } - t.Cond.Wait() - } -} - -func (t *memTransport) closeSelf() error { - t.Lock() - defer t.Unlock() - if t.eof { - return io.EOF - } - t.eof = true - t.Cond.Broadcast() - return nil -} - -func (t *memTransport) Close() error { - err := t.write.closeSelf() - t.closeSelf() - return err -} - -func (t *memTransport) writePacket(p []byte) error { - t.write.Lock() - defer t.write.Unlock() - if t.write.eof { - return io.EOF - } - c := make([]byte, len(p)) - copy(c, p) - t.write.pending = append(t.write.pending, c) - t.write.Cond.Signal() - return nil -} - -func memPipe() (a, b packetConn) { - t1 := memTransport{} - t2 := memTransport{} - t1.write = &t2 - t2.write = &t1 - t1.Cond = sync.NewCond(&t1.Mutex) - t2.Cond = sync.NewCond(&t2.Mutex) - return &t1, &t2 -} - -func TestMemPipe(t *testing.T) { - a, b := memPipe() - if err := a.writePacket([]byte{42}); err != nil { - t.Fatalf("writePacket: %v", err) - } - if err := a.Close(); err != nil { - t.Fatal("Close: ", err) - } - p, err := b.readPacket() - if err != nil { - t.Fatal("readPacket: ", err) - } - if len(p) != 1 || p[0] != 42 { - t.Fatalf("got %v, want {42}", p) - } - p, err = b.readPacket() - if err != io.EOF { - t.Fatalf("got %v, %v, want EOF", p, err) - } -} - -func TestDoubleClose(t *testing.T) { - a, _ := memPipe() - err := a.Close() - if err != nil { - t.Errorf("Close: %v", err) - } - err = a.Close() - if err != io.EOF { - t.Errorf("expect EOF on double close.") - } -} diff --git a/vendor/golang.org/x/crypto/ssh/messages.go b/vendor/golang.org/x/crypto/ssh/messages.go deleted file mode 100644 index e6ecd3afa..000000000 --- a/vendor/golang.org/x/crypto/ssh/messages.go +++ /dev/null @@ -1,758 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssh - -import ( - "bytes" - "encoding/binary" - "errors" - "fmt" - "io" - "math/big" - "reflect" - "strconv" - "strings" -) - -// These are SSH message type numbers. They are scattered around several -// documents but many were taken from [SSH-PARAMETERS]. -const ( - msgIgnore = 2 - msgUnimplemented = 3 - msgDebug = 4 - msgNewKeys = 21 - - // Standard authentication messages - msgUserAuthSuccess = 52 - msgUserAuthBanner = 53 -) - -// SSH messages: -// -// These structures mirror the wire format of the corresponding SSH messages. -// They are marshaled using reflection with the marshal and unmarshal functions -// in this file. The only wrinkle is that a final member of type []byte with a -// ssh tag of "rest" receives the remainder of a packet when unmarshaling. - -// See RFC 4253, section 11.1. -const msgDisconnect = 1 - -// disconnectMsg is the message that signals a disconnect. It is also -// the error type returned from mux.Wait() -type disconnectMsg struct { - Reason uint32 `sshtype:"1"` - Message string - Language string -} - -func (d *disconnectMsg) Error() string { - return fmt.Sprintf("ssh: disconnect, reason %d: %s", d.Reason, d.Message) -} - -// See RFC 4253, section 7.1. -const msgKexInit = 20 - -type kexInitMsg struct { - Cookie [16]byte `sshtype:"20"` - KexAlgos []string - ServerHostKeyAlgos []string - CiphersClientServer []string - CiphersServerClient []string - MACsClientServer []string - MACsServerClient []string - CompressionClientServer []string - CompressionServerClient []string - LanguagesClientServer []string - LanguagesServerClient []string - FirstKexFollows bool - Reserved uint32 -} - -// See RFC 4253, section 8. - -// Diffie-Helman -const msgKexDHInit = 30 - -type kexDHInitMsg struct { - X *big.Int `sshtype:"30"` -} - -const msgKexECDHInit = 30 - -type kexECDHInitMsg struct { - ClientPubKey []byte `sshtype:"30"` -} - -const msgKexECDHReply = 31 - -type kexECDHReplyMsg struct { - HostKey []byte `sshtype:"31"` - EphemeralPubKey []byte - Signature []byte -} - -const msgKexDHReply = 31 - -type kexDHReplyMsg struct { - HostKey []byte `sshtype:"31"` - Y *big.Int - Signature []byte -} - -// See RFC 4253, section 10. -const msgServiceRequest = 5 - -type serviceRequestMsg struct { - Service string `sshtype:"5"` -} - -// See RFC 4253, section 10. -const msgServiceAccept = 6 - -type serviceAcceptMsg struct { - Service string `sshtype:"6"` -} - -// See RFC 4252, section 5. -const msgUserAuthRequest = 50 - -type userAuthRequestMsg struct { - User string `sshtype:"50"` - Service string - Method string - Payload []byte `ssh:"rest"` -} - -// Used for debug printouts of packets. -type userAuthSuccessMsg struct { -} - -// See RFC 4252, section 5.1 -const msgUserAuthFailure = 51 - -type userAuthFailureMsg struct { - Methods []string `sshtype:"51"` - PartialSuccess bool -} - -// See RFC 4256, section 3.2 -const msgUserAuthInfoRequest = 60 -const msgUserAuthInfoResponse = 61 - -type userAuthInfoRequestMsg struct { - User string `sshtype:"60"` - Instruction string - DeprecatedLanguage string - NumPrompts uint32 - Prompts []byte `ssh:"rest"` -} - -// See RFC 4254, section 5.1. -const msgChannelOpen = 90 - -type channelOpenMsg struct { - ChanType string `sshtype:"90"` - PeersId uint32 - PeersWindow uint32 - MaxPacketSize uint32 - TypeSpecificData []byte `ssh:"rest"` -} - -const msgChannelExtendedData = 95 -const msgChannelData = 94 - -// Used for debug print outs of packets. -type channelDataMsg struct { - PeersId uint32 `sshtype:"94"` - Length uint32 - Rest []byte `ssh:"rest"` -} - -// See RFC 4254, section 5.1. -const msgChannelOpenConfirm = 91 - -type channelOpenConfirmMsg struct { - PeersId uint32 `sshtype:"91"` - MyId uint32 - MyWindow uint32 - MaxPacketSize uint32 - TypeSpecificData []byte `ssh:"rest"` -} - -// See RFC 4254, section 5.1. -const msgChannelOpenFailure = 92 - -type channelOpenFailureMsg struct { - PeersId uint32 `sshtype:"92"` - Reason RejectionReason - Message string - Language string -} - -const msgChannelRequest = 98 - -type channelRequestMsg struct { - PeersId uint32 `sshtype:"98"` - Request string - WantReply bool - RequestSpecificData []byte `ssh:"rest"` -} - -// See RFC 4254, section 5.4. -const msgChannelSuccess = 99 - -type channelRequestSuccessMsg struct { - PeersId uint32 `sshtype:"99"` -} - -// See RFC 4254, section 5.4. -const msgChannelFailure = 100 - -type channelRequestFailureMsg struct { - PeersId uint32 `sshtype:"100"` -} - -// See RFC 4254, section 5.3 -const msgChannelClose = 97 - -type channelCloseMsg struct { - PeersId uint32 `sshtype:"97"` -} - -// See RFC 4254, section 5.3 -const msgChannelEOF = 96 - -type channelEOFMsg struct { - PeersId uint32 `sshtype:"96"` -} - -// See RFC 4254, section 4 -const msgGlobalRequest = 80 - -type globalRequestMsg struct { - Type string `sshtype:"80"` - WantReply bool - Data []byte `ssh:"rest"` -} - -// See RFC 4254, section 4 -const msgRequestSuccess = 81 - -type globalRequestSuccessMsg struct { - Data []byte `ssh:"rest" sshtype:"81"` -} - -// See RFC 4254, section 4 -const msgRequestFailure = 82 - -type globalRequestFailureMsg struct { - Data []byte `ssh:"rest" sshtype:"82"` -} - -// See RFC 4254, section 5.2 -const msgChannelWindowAdjust = 93 - -type windowAdjustMsg struct { - PeersId uint32 `sshtype:"93"` - AdditionalBytes uint32 -} - -// See RFC 4252, section 7 -const msgUserAuthPubKeyOk = 60 - -type userAuthPubKeyOkMsg struct { - Algo string `sshtype:"60"` - PubKey []byte -} - -// typeTags returns the possible type bytes for the given reflect.Type, which -// should be a struct. The possible values are separated by a '|' character. -func typeTags(structType reflect.Type) (tags []byte) { - tagStr := structType.Field(0).Tag.Get("sshtype") - - for _, tag := range strings.Split(tagStr, "|") { - i, err := strconv.Atoi(tag) - if err == nil { - tags = append(tags, byte(i)) - } - } - - return tags -} - -func fieldError(t reflect.Type, field int, problem string) error { - if problem != "" { - problem = ": " + problem - } - return fmt.Errorf("ssh: unmarshal error for field %s of type %s%s", t.Field(field).Name, t.Name(), problem) -} - -var errShortRead = errors.New("ssh: short read") - -// Unmarshal parses data in SSH wire format into a structure. The out -// argument should be a pointer to struct. If the first member of the -// struct has the "sshtype" tag set to a '|'-separated set of numbers -// in decimal, the packet must start with one of those numbers. In -// case of error, Unmarshal returns a ParseError or -// UnexpectedMessageError. -func Unmarshal(data []byte, out interface{}) error { - v := reflect.ValueOf(out).Elem() - structType := v.Type() - expectedTypes := typeTags(structType) - - var expectedType byte - if len(expectedTypes) > 0 { - expectedType = expectedTypes[0] - } - - if len(data) == 0 { - return parseError(expectedType) - } - - if len(expectedTypes) > 0 { - goodType := false - for _, e := range expectedTypes { - if e > 0 && data[0] == e { - goodType = true - break - } - } - if !goodType { - return fmt.Errorf("ssh: unexpected message type %d (expected one of %v)", data[0], expectedTypes) - } - data = data[1:] - } - - var ok bool - for i := 0; i < v.NumField(); i++ { - field := v.Field(i) - t := field.Type() - switch t.Kind() { - case reflect.Bool: - if len(data) < 1 { - return errShortRead - } - field.SetBool(data[0] != 0) - data = data[1:] - case reflect.Array: - if t.Elem().Kind() != reflect.Uint8 { - return fieldError(structType, i, "array of unsupported type") - } - if len(data) < t.Len() { - return errShortRead - } - for j, n := 0, t.Len(); j < n; j++ { - field.Index(j).Set(reflect.ValueOf(data[j])) - } - data = data[t.Len():] - case reflect.Uint64: - var u64 uint64 - if u64, data, ok = parseUint64(data); !ok { - return errShortRead - } - field.SetUint(u64) - case reflect.Uint32: - var u32 uint32 - if u32, data, ok = parseUint32(data); !ok { - return errShortRead - } - field.SetUint(uint64(u32)) - case reflect.Uint8: - if len(data) < 1 { - return errShortRead - } - field.SetUint(uint64(data[0])) - data = data[1:] - case reflect.String: - var s []byte - if s, data, ok = parseString(data); !ok { - return fieldError(structType, i, "") - } - field.SetString(string(s)) - case reflect.Slice: - switch t.Elem().Kind() { - case reflect.Uint8: - if structType.Field(i).Tag.Get("ssh") == "rest" { - field.Set(reflect.ValueOf(data)) - data = nil - } else { - var s []byte - if s, data, ok = parseString(data); !ok { - return errShortRead - } - field.Set(reflect.ValueOf(s)) - } - case reflect.String: - var nl []string - if nl, data, ok = parseNameList(data); !ok { - return errShortRead - } - field.Set(reflect.ValueOf(nl)) - default: - return fieldError(structType, i, "slice of unsupported type") - } - case reflect.Ptr: - if t == bigIntType { - var n *big.Int - if n, data, ok = parseInt(data); !ok { - return errShortRead - } - field.Set(reflect.ValueOf(n)) - } else { - return fieldError(structType, i, "pointer to unsupported type") - } - default: - return fieldError(structType, i, fmt.Sprintf("unsupported type: %v", t)) - } - } - - if len(data) != 0 { - return parseError(expectedType) - } - - return nil -} - -// Marshal serializes the message in msg to SSH wire format. The msg -// argument should be a struct or pointer to struct. If the first -// member has the "sshtype" tag set to a number in decimal, that -// number is prepended to the result. If the last of member has the -// "ssh" tag set to "rest", its contents are appended to the output. -func Marshal(msg interface{}) []byte { - out := make([]byte, 0, 64) - return marshalStruct(out, msg) -} - -func marshalStruct(out []byte, msg interface{}) []byte { - v := reflect.Indirect(reflect.ValueOf(msg)) - msgTypes := typeTags(v.Type()) - if len(msgTypes) > 0 { - out = append(out, msgTypes[0]) - } - - for i, n := 0, v.NumField(); i < n; i++ { - field := v.Field(i) - switch t := field.Type(); t.Kind() { - case reflect.Bool: - var v uint8 - if field.Bool() { - v = 1 - } - out = append(out, v) - case reflect.Array: - if t.Elem().Kind() != reflect.Uint8 { - panic(fmt.Sprintf("array of non-uint8 in field %d: %T", i, field.Interface())) - } - for j, l := 0, t.Len(); j < l; j++ { - out = append(out, uint8(field.Index(j).Uint())) - } - case reflect.Uint32: - out = appendU32(out, uint32(field.Uint())) - case reflect.Uint64: - out = appendU64(out, uint64(field.Uint())) - case reflect.Uint8: - out = append(out, uint8(field.Uint())) - case reflect.String: - s := field.String() - out = appendInt(out, len(s)) - out = append(out, s...) - case reflect.Slice: - switch t.Elem().Kind() { - case reflect.Uint8: - if v.Type().Field(i).Tag.Get("ssh") != "rest" { - out = appendInt(out, field.Len()) - } - out = append(out, field.Bytes()...) - case reflect.String: - offset := len(out) - out = appendU32(out, 0) - if n := field.Len(); n > 0 { - for j := 0; j < n; j++ { - f := field.Index(j) - if j != 0 { - out = append(out, ',') - } - out = append(out, f.String()...) - } - // overwrite length value - binary.BigEndian.PutUint32(out[offset:], uint32(len(out)-offset-4)) - } - default: - panic(fmt.Sprintf("slice of unknown type in field %d: %T", i, field.Interface())) - } - case reflect.Ptr: - if t == bigIntType { - var n *big.Int - nValue := reflect.ValueOf(&n) - nValue.Elem().Set(field) - needed := intLength(n) - oldLength := len(out) - - if cap(out)-len(out) < needed { - newOut := make([]byte, len(out), 2*(len(out)+needed)) - copy(newOut, out) - out = newOut - } - out = out[:oldLength+needed] - marshalInt(out[oldLength:], n) - } else { - panic(fmt.Sprintf("pointer to unknown type in field %d: %T", i, field.Interface())) - } - } - } - - return out -} - -var bigOne = big.NewInt(1) - -func parseString(in []byte) (out, rest []byte, ok bool) { - if len(in) < 4 { - return - } - length := binary.BigEndian.Uint32(in) - in = in[4:] - if uint32(len(in)) < length { - return - } - out = in[:length] - rest = in[length:] - ok = true - return -} - -var ( - comma = []byte{','} - emptyNameList = []string{} -) - -func parseNameList(in []byte) (out []string, rest []byte, ok bool) { - contents, rest, ok := parseString(in) - if !ok { - return - } - if len(contents) == 0 { - out = emptyNameList - return - } - parts := bytes.Split(contents, comma) - out = make([]string, len(parts)) - for i, part := range parts { - out[i] = string(part) - } - return -} - -func parseInt(in []byte) (out *big.Int, rest []byte, ok bool) { - contents, rest, ok := parseString(in) - if !ok { - return - } - out = new(big.Int) - - if len(contents) > 0 && contents[0]&0x80 == 0x80 { - // This is a negative number - notBytes := make([]byte, len(contents)) - for i := range notBytes { - notBytes[i] = ^contents[i] - } - out.SetBytes(notBytes) - out.Add(out, bigOne) - out.Neg(out) - } else { - // Positive number - out.SetBytes(contents) - } - ok = true - return -} - -func parseUint32(in []byte) (uint32, []byte, bool) { - if len(in) < 4 { - return 0, nil, false - } - return binary.BigEndian.Uint32(in), in[4:], true -} - -func parseUint64(in []byte) (uint64, []byte, bool) { - if len(in) < 8 { - return 0, nil, false - } - return binary.BigEndian.Uint64(in), in[8:], true -} - -func intLength(n *big.Int) int { - length := 4 /* length bytes */ - if n.Sign() < 0 { - nMinus1 := new(big.Int).Neg(n) - nMinus1.Sub(nMinus1, bigOne) - bitLen := nMinus1.BitLen() - if bitLen%8 == 0 { - // The number will need 0xff padding - length++ - } - length += (bitLen + 7) / 8 - } else if n.Sign() == 0 { - // A zero is the zero length string - } else { - bitLen := n.BitLen() - if bitLen%8 == 0 { - // The number will need 0x00 padding - length++ - } - length += (bitLen + 7) / 8 - } - - return length -} - -func marshalUint32(to []byte, n uint32) []byte { - binary.BigEndian.PutUint32(to, n) - return to[4:] -} - -func marshalUint64(to []byte, n uint64) []byte { - binary.BigEndian.PutUint64(to, n) - return to[8:] -} - -func marshalInt(to []byte, n *big.Int) []byte { - lengthBytes := to - to = to[4:] - length := 0 - - if n.Sign() < 0 { - // A negative number has to be converted to two's-complement - // form. So we'll subtract 1 and invert. If the - // most-significant-bit isn't set then we'll need to pad the - // beginning with 0xff in order to keep the number negative. - nMinus1 := new(big.Int).Neg(n) - nMinus1.Sub(nMinus1, bigOne) - bytes := nMinus1.Bytes() - for i := range bytes { - bytes[i] ^= 0xff - } - if len(bytes) == 0 || bytes[0]&0x80 == 0 { - to[0] = 0xff - to = to[1:] - length++ - } - nBytes := copy(to, bytes) - to = to[nBytes:] - length += nBytes - } else if n.Sign() == 0 { - // A zero is the zero length string - } else { - bytes := n.Bytes() - if len(bytes) > 0 && bytes[0]&0x80 != 0 { - // We'll have to pad this with a 0x00 in order to - // stop it looking like a negative number. - to[0] = 0 - to = to[1:] - length++ - } - nBytes := copy(to, bytes) - to = to[nBytes:] - length += nBytes - } - - lengthBytes[0] = byte(length >> 24) - lengthBytes[1] = byte(length >> 16) - lengthBytes[2] = byte(length >> 8) - lengthBytes[3] = byte(length) - return to -} - -func writeInt(w io.Writer, n *big.Int) { - length := intLength(n) - buf := make([]byte, length) - marshalInt(buf, n) - w.Write(buf) -} - -func writeString(w io.Writer, s []byte) { - var lengthBytes [4]byte - lengthBytes[0] = byte(len(s) >> 24) - lengthBytes[1] = byte(len(s) >> 16) - lengthBytes[2] = byte(len(s) >> 8) - lengthBytes[3] = byte(len(s)) - w.Write(lengthBytes[:]) - w.Write(s) -} - -func stringLength(n int) int { - return 4 + n -} - -func marshalString(to []byte, s []byte) []byte { - to[0] = byte(len(s) >> 24) - to[1] = byte(len(s) >> 16) - to[2] = byte(len(s) >> 8) - to[3] = byte(len(s)) - to = to[4:] - copy(to, s) - return to[len(s):] -} - -var bigIntType = reflect.TypeOf((*big.Int)(nil)) - -// Decode a packet into its corresponding message. -func decode(packet []byte) (interface{}, error) { - var msg interface{} - switch packet[0] { - case msgDisconnect: - msg = new(disconnectMsg) - case msgServiceRequest: - msg = new(serviceRequestMsg) - case msgServiceAccept: - msg = new(serviceAcceptMsg) - case msgKexInit: - msg = new(kexInitMsg) - case msgKexDHInit: - msg = new(kexDHInitMsg) - case msgKexDHReply: - msg = new(kexDHReplyMsg) - case msgUserAuthRequest: - msg = new(userAuthRequestMsg) - case msgUserAuthSuccess: - return new(userAuthSuccessMsg), nil - case msgUserAuthFailure: - msg = new(userAuthFailureMsg) - case msgUserAuthPubKeyOk: - msg = new(userAuthPubKeyOkMsg) - case msgGlobalRequest: - msg = new(globalRequestMsg) - case msgRequestSuccess: - msg = new(globalRequestSuccessMsg) - case msgRequestFailure: - msg = new(globalRequestFailureMsg) - case msgChannelOpen: - msg = new(channelOpenMsg) - case msgChannelData: - msg = new(channelDataMsg) - case msgChannelOpenConfirm: - msg = new(channelOpenConfirmMsg) - case msgChannelOpenFailure: - msg = new(channelOpenFailureMsg) - case msgChannelWindowAdjust: - msg = new(windowAdjustMsg) - case msgChannelEOF: - msg = new(channelEOFMsg) - case msgChannelClose: - msg = new(channelCloseMsg) - case msgChannelRequest: - msg = new(channelRequestMsg) - case msgChannelSuccess: - msg = new(channelRequestSuccessMsg) - case msgChannelFailure: - msg = new(channelRequestFailureMsg) - default: - return nil, unexpectedMessageError(0, packet[0]) - } - if err := Unmarshal(packet, msg); err != nil { - return nil, err - } - return msg, nil -} diff --git a/vendor/golang.org/x/crypto/ssh/messages_test.go b/vendor/golang.org/x/crypto/ssh/messages_test.go deleted file mode 100644 index e79076412..000000000 --- a/vendor/golang.org/x/crypto/ssh/messages_test.go +++ /dev/null @@ -1,288 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssh - -import ( - "bytes" - "math/big" - "math/rand" - "reflect" - "testing" - "testing/quick" -) - -var intLengthTests = []struct { - val, length int -}{ - {0, 4 + 0}, - {1, 4 + 1}, - {127, 4 + 1}, - {128, 4 + 2}, - {-1, 4 + 1}, -} - -func TestIntLength(t *testing.T) { - for _, test := range intLengthTests { - v := new(big.Int).SetInt64(int64(test.val)) - length := intLength(v) - if length != test.length { - t.Errorf("For %d, got length %d but expected %d", test.val, length, test.length) - } - } -} - -type msgAllTypes struct { - Bool bool `sshtype:"21"` - Array [16]byte - Uint64 uint64 - Uint32 uint32 - Uint8 uint8 - String string - Strings []string - Bytes []byte - Int *big.Int - Rest []byte `ssh:"rest"` -} - -func (t *msgAllTypes) Generate(rand *rand.Rand, size int) reflect.Value { - m := &msgAllTypes{} - m.Bool = rand.Intn(2) == 1 - randomBytes(m.Array[:], rand) - m.Uint64 = uint64(rand.Int63n(1<<63 - 1)) - m.Uint32 = uint32(rand.Intn((1 << 31) - 1)) - m.Uint8 = uint8(rand.Intn(1 << 8)) - m.String = string(m.Array[:]) - m.Strings = randomNameList(rand) - m.Bytes = m.Array[:] - m.Int = randomInt(rand) - m.Rest = m.Array[:] - return reflect.ValueOf(m) -} - -func TestMarshalUnmarshal(t *testing.T) { - rand := rand.New(rand.NewSource(0)) - iface := &msgAllTypes{} - ty := reflect.ValueOf(iface).Type() - - n := 100 - if testing.Short() { - n = 5 - } - for j := 0; j < n; j++ { - v, ok := quick.Value(ty, rand) - if !ok { - t.Errorf("failed to create value") - break - } - - m1 := v.Elem().Interface() - m2 := iface - - marshaled := Marshal(m1) - if err := Unmarshal(marshaled, m2); err != nil { - t.Errorf("Unmarshal %#v: %s", m1, err) - break - } - - if !reflect.DeepEqual(v.Interface(), m2) { - t.Errorf("got: %#v\nwant:%#v\n%x", m2, m1, marshaled) - break - } - } -} - -func TestUnmarshalEmptyPacket(t *testing.T) { - var b []byte - var m channelRequestSuccessMsg - if err := Unmarshal(b, &m); err == nil { - t.Fatalf("unmarshal of empty slice succeeded") - } -} - -func TestUnmarshalUnexpectedPacket(t *testing.T) { - type S struct { - I uint32 `sshtype:"43"` - S string - B bool - } - - s := S{11, "hello", true} - packet := Marshal(s) - packet[0] = 42 - roundtrip := S{} - err := Unmarshal(packet, &roundtrip) - if err == nil { - t.Fatal("expected error, not nil") - } -} - -func TestMarshalPtr(t *testing.T) { - s := struct { - S string - }{"hello"} - - m1 := Marshal(s) - m2 := Marshal(&s) - if !bytes.Equal(m1, m2) { - t.Errorf("got %q, want %q for marshaled pointer", m2, m1) - } -} - -func TestBareMarshalUnmarshal(t *testing.T) { - type S struct { - I uint32 - S string - B bool - } - - s := S{42, "hello", true} - packet := Marshal(s) - roundtrip := S{} - Unmarshal(packet, &roundtrip) - - if !reflect.DeepEqual(s, roundtrip) { - t.Errorf("got %#v, want %#v", roundtrip, s) - } -} - -func TestBareMarshal(t *testing.T) { - type S2 struct { - I uint32 - } - s := S2{42} - packet := Marshal(s) - i, rest, ok := parseUint32(packet) - if len(rest) > 0 || !ok { - t.Errorf("parseInt(%q): parse error", packet) - } - if i != s.I { - t.Errorf("got %d, want %d", i, s.I) - } -} - -func TestUnmarshalShortKexInitPacket(t *testing.T) { - // This used to panic. - // Issue 11348 - packet := []byte{0x14, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0xff, 0xff, 0xff, 0xff} - kim := &kexInitMsg{} - if err := Unmarshal(packet, kim); err == nil { - t.Error("truncated packet unmarshaled without error") - } -} - -func TestMarshalMultiTag(t *testing.T) { - var res struct { - A uint32 `sshtype:"1|2"` - } - - good1 := struct { - A uint32 `sshtype:"1"` - }{ - 1, - } - good2 := struct { - A uint32 `sshtype:"2"` - }{ - 1, - } - - if e := Unmarshal(Marshal(good1), &res); e != nil { - t.Errorf("error unmarshaling multipart tag: %v", e) - } - - if e := Unmarshal(Marshal(good2), &res); e != nil { - t.Errorf("error unmarshaling multipart tag: %v", e) - } - - bad1 := struct { - A uint32 `sshtype:"3"` - }{ - 1, - } - if e := Unmarshal(Marshal(bad1), &res); e == nil { - t.Errorf("bad struct unmarshaled without error") - } -} - -func randomBytes(out []byte, rand *rand.Rand) { - for i := 0; i < len(out); i++ { - out[i] = byte(rand.Int31()) - } -} - -func randomNameList(rand *rand.Rand) []string { - ret := make([]string, rand.Int31()&15) - for i := range ret { - s := make([]byte, 1+(rand.Int31()&15)) - for j := range s { - s[j] = 'a' + uint8(rand.Int31()&15) - } - ret[i] = string(s) - } - return ret -} - -func randomInt(rand *rand.Rand) *big.Int { - return new(big.Int).SetInt64(int64(int32(rand.Uint32()))) -} - -func (*kexInitMsg) Generate(rand *rand.Rand, size int) reflect.Value { - ki := &kexInitMsg{} - randomBytes(ki.Cookie[:], rand) - ki.KexAlgos = randomNameList(rand) - ki.ServerHostKeyAlgos = randomNameList(rand) - ki.CiphersClientServer = randomNameList(rand) - ki.CiphersServerClient = randomNameList(rand) - ki.MACsClientServer = randomNameList(rand) - ki.MACsServerClient = randomNameList(rand) - ki.CompressionClientServer = randomNameList(rand) - ki.CompressionServerClient = randomNameList(rand) - ki.LanguagesClientServer = randomNameList(rand) - ki.LanguagesServerClient = randomNameList(rand) - if rand.Int31()&1 == 1 { - ki.FirstKexFollows = true - } - return reflect.ValueOf(ki) -} - -func (*kexDHInitMsg) Generate(rand *rand.Rand, size int) reflect.Value { - dhi := &kexDHInitMsg{} - dhi.X = randomInt(rand) - return reflect.ValueOf(dhi) -} - -var ( - _kexInitMsg = new(kexInitMsg).Generate(rand.New(rand.NewSource(0)), 10).Elem().Interface() - _kexDHInitMsg = new(kexDHInitMsg).Generate(rand.New(rand.NewSource(0)), 10).Elem().Interface() - - _kexInit = Marshal(_kexInitMsg) - _kexDHInit = Marshal(_kexDHInitMsg) -) - -func BenchmarkMarshalKexInitMsg(b *testing.B) { - for i := 0; i < b.N; i++ { - Marshal(_kexInitMsg) - } -} - -func BenchmarkUnmarshalKexInitMsg(b *testing.B) { - m := new(kexInitMsg) - for i := 0; i < b.N; i++ { - Unmarshal(_kexInit, m) - } -} - -func BenchmarkMarshalKexDHInitMsg(b *testing.B) { - for i := 0; i < b.N; i++ { - Marshal(_kexDHInitMsg) - } -} - -func BenchmarkUnmarshalKexDHInitMsg(b *testing.B) { - m := new(kexDHInitMsg) - for i := 0; i < b.N; i++ { - Unmarshal(_kexDHInit, m) - } -} diff --git a/vendor/golang.org/x/crypto/ssh/mux.go b/vendor/golang.org/x/crypto/ssh/mux.go deleted file mode 100644 index 27a527c10..000000000 --- a/vendor/golang.org/x/crypto/ssh/mux.go +++ /dev/null @@ -1,330 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssh - -import ( - "encoding/binary" - "fmt" - "io" - "log" - "sync" - "sync/atomic" -) - -// debugMux, if set, causes messages in the connection protocol to be -// logged. -const debugMux = false - -// chanList is a thread safe channel list. -type chanList struct { - // protects concurrent access to chans - sync.Mutex - - // chans are indexed by the local id of the channel, which the - // other side should send in the PeersId field. - chans []*channel - - // This is a debugging aid: it offsets all IDs by this - // amount. This helps distinguish otherwise identical - // server/client muxes - offset uint32 -} - -// Assigns a channel ID to the given channel. -func (c *chanList) add(ch *channel) uint32 { - c.Lock() - defer c.Unlock() - for i := range c.chans { - if c.chans[i] == nil { - c.chans[i] = ch - return uint32(i) + c.offset - } - } - c.chans = append(c.chans, ch) - return uint32(len(c.chans)-1) + c.offset -} - -// getChan returns the channel for the given ID. -func (c *chanList) getChan(id uint32) *channel { - id -= c.offset - - c.Lock() - defer c.Unlock() - if id < uint32(len(c.chans)) { - return c.chans[id] - } - return nil -} - -func (c *chanList) remove(id uint32) { - id -= c.offset - c.Lock() - if id < uint32(len(c.chans)) { - c.chans[id] = nil - } - c.Unlock() -} - -// dropAll forgets all channels it knows, returning them in a slice. -func (c *chanList) dropAll() []*channel { - c.Lock() - defer c.Unlock() - var r []*channel - - for _, ch := range c.chans { - if ch == nil { - continue - } - r = append(r, ch) - } - c.chans = nil - return r -} - -// mux represents the state for the SSH connection protocol, which -// multiplexes many channels onto a single packet transport. -type mux struct { - conn packetConn - chanList chanList - - incomingChannels chan NewChannel - - globalSentMu sync.Mutex - globalResponses chan interface{} - incomingRequests chan *Request - - errCond *sync.Cond - err error -} - -// When debugging, each new chanList instantiation has a different -// offset. -var globalOff uint32 - -func (m *mux) Wait() error { - m.errCond.L.Lock() - defer m.errCond.L.Unlock() - for m.err == nil { - m.errCond.Wait() - } - return m.err -} - -// newMux returns a mux that runs over the given connection. -func newMux(p packetConn) *mux { - m := &mux{ - conn: p, - incomingChannels: make(chan NewChannel, chanSize), - globalResponses: make(chan interface{}, 1), - incomingRequests: make(chan *Request, chanSize), - errCond: newCond(), - } - if debugMux { - m.chanList.offset = atomic.AddUint32(&globalOff, 1) - } - - go m.loop() - return m -} - -func (m *mux) sendMessage(msg interface{}) error { - p := Marshal(msg) - if debugMux { - log.Printf("send global(%d): %#v", m.chanList.offset, msg) - } - return m.conn.writePacket(p) -} - -func (m *mux) SendRequest(name string, wantReply bool, payload []byte) (bool, []byte, error) { - if wantReply { - m.globalSentMu.Lock() - defer m.globalSentMu.Unlock() - } - - if err := m.sendMessage(globalRequestMsg{ - Type: name, - WantReply: wantReply, - Data: payload, - }); err != nil { - return false, nil, err - } - - if !wantReply { - return false, nil, nil - } - - msg, ok := <-m.globalResponses - if !ok { - return false, nil, io.EOF - } - switch msg := msg.(type) { - case *globalRequestFailureMsg: - return false, msg.Data, nil - case *globalRequestSuccessMsg: - return true, msg.Data, nil - default: - return false, nil, fmt.Errorf("ssh: unexpected response to request: %#v", msg) - } -} - -// ackRequest must be called after processing a global request that -// has WantReply set. -func (m *mux) ackRequest(ok bool, data []byte) error { - if ok { - return m.sendMessage(globalRequestSuccessMsg{Data: data}) - } - return m.sendMessage(globalRequestFailureMsg{Data: data}) -} - -func (m *mux) Close() error { - return m.conn.Close() -} - -// loop runs the connection machine. It will process packets until an -// error is encountered. To synchronize on loop exit, use mux.Wait. -func (m *mux) loop() { - var err error - for err == nil { - err = m.onePacket() - } - - for _, ch := range m.chanList.dropAll() { - ch.close() - } - - close(m.incomingChannels) - close(m.incomingRequests) - close(m.globalResponses) - - m.conn.Close() - - m.errCond.L.Lock() - m.err = err - m.errCond.Broadcast() - m.errCond.L.Unlock() - - if debugMux { - log.Println("loop exit", err) - } -} - -// onePacket reads and processes one packet. -func (m *mux) onePacket() error { - packet, err := m.conn.readPacket() - if err != nil { - return err - } - - if debugMux { - if packet[0] == msgChannelData || packet[0] == msgChannelExtendedData { - log.Printf("decoding(%d): data packet - %d bytes", m.chanList.offset, len(packet)) - } else { - p, _ := decode(packet) - log.Printf("decoding(%d): %d %#v - %d bytes", m.chanList.offset, packet[0], p, len(packet)) - } - } - - switch packet[0] { - case msgChannelOpen: - return m.handleChannelOpen(packet) - case msgGlobalRequest, msgRequestSuccess, msgRequestFailure: - return m.handleGlobalPacket(packet) - } - - // assume a channel packet. - if len(packet) < 5 { - return parseError(packet[0]) - } - id := binary.BigEndian.Uint32(packet[1:]) - ch := m.chanList.getChan(id) - if ch == nil { - return fmt.Errorf("ssh: invalid channel %d", id) - } - - return ch.handlePacket(packet) -} - -func (m *mux) handleGlobalPacket(packet []byte) error { - msg, err := decode(packet) - if err != nil { - return err - } - - switch msg := msg.(type) { - case *globalRequestMsg: - m.incomingRequests <- &Request{ - Type: msg.Type, - WantReply: msg.WantReply, - Payload: msg.Data, - mux: m, - } - case *globalRequestSuccessMsg, *globalRequestFailureMsg: - m.globalResponses <- msg - default: - panic(fmt.Sprintf("not a global message %#v", msg)) - } - - return nil -} - -// handleChannelOpen schedules a channel to be Accept()ed. -func (m *mux) handleChannelOpen(packet []byte) error { - var msg channelOpenMsg - if err := Unmarshal(packet, &msg); err != nil { - return err - } - - if msg.MaxPacketSize < minPacketLength || msg.MaxPacketSize > 1<<31 { - failMsg := channelOpenFailureMsg{ - PeersId: msg.PeersId, - Reason: ConnectionFailed, - Message: "invalid request", - Language: "en_US.UTF-8", - } - return m.sendMessage(failMsg) - } - - c := m.newChannel(msg.ChanType, channelInbound, msg.TypeSpecificData) - c.remoteId = msg.PeersId - c.maxRemotePayload = msg.MaxPacketSize - c.remoteWin.add(msg.PeersWindow) - m.incomingChannels <- c - return nil -} - -func (m *mux) OpenChannel(chanType string, extra []byte) (Channel, <-chan *Request, error) { - ch, err := m.openChannel(chanType, extra) - if err != nil { - return nil, nil, err - } - - return ch, ch.incomingRequests, nil -} - -func (m *mux) openChannel(chanType string, extra []byte) (*channel, error) { - ch := m.newChannel(chanType, channelOutbound, extra) - - ch.maxIncomingPayload = channelMaxPacket - - open := channelOpenMsg{ - ChanType: chanType, - PeersWindow: ch.myWindow, - MaxPacketSize: ch.maxIncomingPayload, - TypeSpecificData: extra, - PeersId: ch.localId, - } - if err := m.sendMessage(open); err != nil { - return nil, err - } - - switch msg := (<-ch.msg).(type) { - case *channelOpenConfirmMsg: - return ch, nil - case *channelOpenFailureMsg: - return nil, &OpenChannelError{msg.Reason, msg.Message} - default: - return nil, fmt.Errorf("ssh: unexpected packet in response to channel open: %T", msg) - } -} diff --git a/vendor/golang.org/x/crypto/ssh/mux_test.go b/vendor/golang.org/x/crypto/ssh/mux_test.go deleted file mode 100644 index 25d2181d6..000000000 --- a/vendor/golang.org/x/crypto/ssh/mux_test.go +++ /dev/null @@ -1,505 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssh - -import ( - "io" - "io/ioutil" - "sync" - "testing" -) - -func muxPair() (*mux, *mux) { - a, b := memPipe() - - s := newMux(a) - c := newMux(b) - - return s, c -} - -// Returns both ends of a channel, and the mux for the the 2nd -// channel. -func channelPair(t *testing.T) (*channel, *channel, *mux) { - c, s := muxPair() - - res := make(chan *channel, 1) - go func() { - newCh, ok := <-s.incomingChannels - if !ok { - t.Fatalf("No incoming channel") - } - if newCh.ChannelType() != "chan" { - t.Fatalf("got type %q want chan", newCh.ChannelType()) - } - ch, _, err := newCh.Accept() - if err != nil { - t.Fatalf("Accept %v", err) - } - res <- ch.(*channel) - }() - - ch, err := c.openChannel("chan", nil) - if err != nil { - t.Fatalf("OpenChannel: %v", err) - } - - return <-res, ch, c -} - -// Test that stderr and stdout can be addressed from different -// goroutines. This is intended for use with the race detector. -func TestMuxChannelExtendedThreadSafety(t *testing.T) { - writer, reader, mux := channelPair(t) - defer writer.Close() - defer reader.Close() - defer mux.Close() - - var wr, rd sync.WaitGroup - magic := "hello world" - - wr.Add(2) - go func() { - io.WriteString(writer, magic) - wr.Done() - }() - go func() { - io.WriteString(writer.Stderr(), magic) - wr.Done() - }() - - rd.Add(2) - go func() { - c, err := ioutil.ReadAll(reader) - if string(c) != magic { - t.Fatalf("stdout read got %q, want %q (error %s)", c, magic, err) - } - rd.Done() - }() - go func() { - c, err := ioutil.ReadAll(reader.Stderr()) - if string(c) != magic { - t.Fatalf("stderr read got %q, want %q (error %s)", c, magic, err) - } - rd.Done() - }() - - wr.Wait() - writer.CloseWrite() - rd.Wait() -} - -func TestMuxReadWrite(t *testing.T) { - s, c, mux := channelPair(t) - defer s.Close() - defer c.Close() - defer mux.Close() - - magic := "hello world" - magicExt := "hello stderr" - go func() { - _, err := s.Write([]byte(magic)) - if err != nil { - t.Fatalf("Write: %v", err) - } - _, err = s.Extended(1).Write([]byte(magicExt)) - if err != nil { - t.Fatalf("Write: %v", err) - } - err = s.Close() - if err != nil { - t.Fatalf("Close: %v", err) - } - }() - - var buf [1024]byte - n, err := c.Read(buf[:]) - if err != nil { - t.Fatalf("server Read: %v", err) - } - got := string(buf[:n]) - if got != magic { - t.Fatalf("server: got %q want %q", got, magic) - } - - n, err = c.Extended(1).Read(buf[:]) - if err != nil { - t.Fatalf("server Read: %v", err) - } - - got = string(buf[:n]) - if got != magicExt { - t.Fatalf("server: got %q want %q", got, magic) - } -} - -func TestMuxChannelOverflow(t *testing.T) { - reader, writer, mux := channelPair(t) - defer reader.Close() - defer writer.Close() - defer mux.Close() - - wDone := make(chan int, 1) - go func() { - if _, err := writer.Write(make([]byte, channelWindowSize)); err != nil { - t.Errorf("could not fill window: %v", err) - } - writer.Write(make([]byte, 1)) - wDone <- 1 - }() - writer.remoteWin.waitWriterBlocked() - - // Send 1 byte. - packet := make([]byte, 1+4+4+1) - packet[0] = msgChannelData - marshalUint32(packet[1:], writer.remoteId) - marshalUint32(packet[5:], uint32(1)) - packet[9] = 42 - - if err := writer.mux.conn.writePacket(packet); err != nil { - t.Errorf("could not send packet") - } - if _, err := reader.SendRequest("hello", true, nil); err == nil { - t.Errorf("SendRequest succeeded.") - } - <-wDone -} - -func TestMuxChannelCloseWriteUnblock(t *testing.T) { - reader, writer, mux := channelPair(t) - defer reader.Close() - defer writer.Close() - defer mux.Close() - - wDone := make(chan int, 1) - go func() { - if _, err := writer.Write(make([]byte, channelWindowSize)); err != nil { - t.Errorf("could not fill window: %v", err) - } - if _, err := writer.Write(make([]byte, 1)); err != io.EOF { - t.Errorf("got %v, want EOF for unblock write", err) - } - wDone <- 1 - }() - - writer.remoteWin.waitWriterBlocked() - reader.Close() - <-wDone -} - -func TestMuxConnectionCloseWriteUnblock(t *testing.T) { - reader, writer, mux := channelPair(t) - defer reader.Close() - defer writer.Close() - defer mux.Close() - - wDone := make(chan int, 1) - go func() { - if _, err := writer.Write(make([]byte, channelWindowSize)); err != nil { - t.Errorf("could not fill window: %v", err) - } - if _, err := writer.Write(make([]byte, 1)); err != io.EOF { - t.Errorf("got %v, want EOF for unblock write", err) - } - wDone <- 1 - }() - - writer.remoteWin.waitWriterBlocked() - mux.Close() - <-wDone -} - -func TestMuxReject(t *testing.T) { - client, server := muxPair() - defer server.Close() - defer client.Close() - - go func() { - ch, ok := <-server.incomingChannels - if !ok { - t.Fatalf("Accept") - } - if ch.ChannelType() != "ch" || string(ch.ExtraData()) != "extra" { - t.Fatalf("unexpected channel: %q, %q", ch.ChannelType(), ch.ExtraData()) - } - ch.Reject(RejectionReason(42), "message") - }() - - ch, err := client.openChannel("ch", []byte("extra")) - if ch != nil { - t.Fatal("openChannel not rejected") - } - - ocf, ok := err.(*OpenChannelError) - if !ok { - t.Errorf("got %#v want *OpenChannelError", err) - } else if ocf.Reason != 42 || ocf.Message != "message" { - t.Errorf("got %#v, want {Reason: 42, Message: %q}", ocf, "message") - } - - want := "ssh: rejected: unknown reason 42 (message)" - if err.Error() != want { - t.Errorf("got %q, want %q", err.Error(), want) - } -} - -func TestMuxChannelRequest(t *testing.T) { - client, server, mux := channelPair(t) - defer server.Close() - defer client.Close() - defer mux.Close() - - var received int - var wg sync.WaitGroup - wg.Add(1) - go func() { - for r := range server.incomingRequests { - received++ - r.Reply(r.Type == "yes", nil) - } - wg.Done() - }() - _, err := client.SendRequest("yes", false, nil) - if err != nil { - t.Fatalf("SendRequest: %v", err) - } - ok, err := client.SendRequest("yes", true, nil) - if err != nil { - t.Fatalf("SendRequest: %v", err) - } - - if !ok { - t.Errorf("SendRequest(yes): %v", ok) - - } - - ok, err = client.SendRequest("no", true, nil) - if err != nil { - t.Fatalf("SendRequest: %v", err) - } - if ok { - t.Errorf("SendRequest(no): %v", ok) - - } - - client.Close() - wg.Wait() - - if received != 3 { - t.Errorf("got %d requests, want %d", received, 3) - } -} - -func TestMuxGlobalRequest(t *testing.T) { - clientMux, serverMux := muxPair() - defer serverMux.Close() - defer clientMux.Close() - - var seen bool - go func() { - for r := range serverMux.incomingRequests { - seen = seen || r.Type == "peek" - if r.WantReply { - err := r.Reply(r.Type == "yes", - append([]byte(r.Type), r.Payload...)) - if err != nil { - t.Errorf("AckRequest: %v", err) - } - } - } - }() - - _, _, err := clientMux.SendRequest("peek", false, nil) - if err != nil { - t.Errorf("SendRequest: %v", err) - } - - ok, data, err := clientMux.SendRequest("yes", true, []byte("a")) - if !ok || string(data) != "yesa" || err != nil { - t.Errorf("SendRequest(\"yes\", true, \"a\"): %v %v %v", - ok, data, err) - } - if ok, data, err := clientMux.SendRequest("yes", true, []byte("a")); !ok || string(data) != "yesa" || err != nil { - t.Errorf("SendRequest(\"yes\", true, \"a\"): %v %v %v", - ok, data, err) - } - - if ok, data, err := clientMux.SendRequest("no", true, []byte("a")); ok || string(data) != "noa" || err != nil { - t.Errorf("SendRequest(\"no\", true, \"a\"): %v %v %v", - ok, data, err) - } - - if !seen { - t.Errorf("never saw 'peek' request") - } -} - -func TestMuxGlobalRequestUnblock(t *testing.T) { - clientMux, serverMux := muxPair() - defer serverMux.Close() - defer clientMux.Close() - - result := make(chan error, 1) - go func() { - _, _, err := clientMux.SendRequest("hello", true, nil) - result <- err - }() - - <-serverMux.incomingRequests - serverMux.conn.Close() - err := <-result - - if err != io.EOF { - t.Errorf("want EOF, got %v", io.EOF) - } -} - -func TestMuxChannelRequestUnblock(t *testing.T) { - a, b, connB := channelPair(t) - defer a.Close() - defer b.Close() - defer connB.Close() - - result := make(chan error, 1) - go func() { - _, err := a.SendRequest("hello", true, nil) - result <- err - }() - - <-b.incomingRequests - connB.conn.Close() - err := <-result - - if err != io.EOF { - t.Errorf("want EOF, got %v", err) - } -} - -func TestMuxCloseChannel(t *testing.T) { - r, w, mux := channelPair(t) - defer mux.Close() - defer r.Close() - defer w.Close() - - result := make(chan error, 1) - go func() { - var b [1024]byte - _, err := r.Read(b[:]) - result <- err - }() - if err := w.Close(); err != nil { - t.Errorf("w.Close: %v", err) - } - - if _, err := w.Write([]byte("hello")); err != io.EOF { - t.Errorf("got err %v, want io.EOF after Close", err) - } - - if err := <-result; err != io.EOF { - t.Errorf("got %v (%T), want io.EOF", err, err) - } -} - -func TestMuxCloseWriteChannel(t *testing.T) { - r, w, mux := channelPair(t) - defer mux.Close() - - result := make(chan error, 1) - go func() { - var b [1024]byte - _, err := r.Read(b[:]) - result <- err - }() - if err := w.CloseWrite(); err != nil { - t.Errorf("w.CloseWrite: %v", err) - } - - if _, err := w.Write([]byte("hello")); err != io.EOF { - t.Errorf("got err %v, want io.EOF after CloseWrite", err) - } - - if err := <-result; err != io.EOF { - t.Errorf("got %v (%T), want io.EOF", err, err) - } -} - -func TestMuxInvalidRecord(t *testing.T) { - a, b := muxPair() - defer a.Close() - defer b.Close() - - packet := make([]byte, 1+4+4+1) - packet[0] = msgChannelData - marshalUint32(packet[1:], 29348723 /* invalid channel id */) - marshalUint32(packet[5:], 1) - packet[9] = 42 - - a.conn.writePacket(packet) - go a.SendRequest("hello", false, nil) - // 'a' wrote an invalid packet, so 'b' has exited. - req, ok := <-b.incomingRequests - if ok { - t.Errorf("got request %#v after receiving invalid packet", req) - } -} - -func TestZeroWindowAdjust(t *testing.T) { - a, b, mux := channelPair(t) - defer a.Close() - defer b.Close() - defer mux.Close() - - go func() { - io.WriteString(a, "hello") - // bogus adjust. - a.sendMessage(windowAdjustMsg{}) - io.WriteString(a, "world") - a.Close() - }() - - want := "helloworld" - c, _ := ioutil.ReadAll(b) - if string(c) != want { - t.Errorf("got %q want %q", c, want) - } -} - -func TestMuxMaxPacketSize(t *testing.T) { - a, b, mux := channelPair(t) - defer a.Close() - defer b.Close() - defer mux.Close() - - large := make([]byte, a.maxRemotePayload+1) - packet := make([]byte, 1+4+4+1+len(large)) - packet[0] = msgChannelData - marshalUint32(packet[1:], a.remoteId) - marshalUint32(packet[5:], uint32(len(large))) - packet[9] = 42 - - if err := a.mux.conn.writePacket(packet); err != nil { - t.Errorf("could not send packet") - } - - go a.SendRequest("hello", false, nil) - - _, ok := <-b.incomingRequests - if ok { - t.Errorf("connection still alive after receiving large packet.") - } -} - -// Don't ship code with debug=true. -func TestDebug(t *testing.T) { - if debugMux { - t.Error("mux debug switched on") - } - if debugHandshake { - t.Error("handshake debug switched on") - } - if debugTransport { - t.Error("transport debug switched on") - } -} diff --git a/vendor/golang.org/x/crypto/ssh/server.go b/vendor/golang.org/x/crypto/ssh/server.go deleted file mode 100644 index 77c84d165..000000000 --- a/vendor/golang.org/x/crypto/ssh/server.go +++ /dev/null @@ -1,491 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssh - -import ( - "bytes" - "errors" - "fmt" - "io" - "net" - "strings" -) - -// The Permissions type holds fine-grained permissions that are -// specific to a user or a specific authentication method for a -// user. Permissions, except for "source-address", must be enforced in -// the server application layer, after successful authentication. The -// Permissions are passed on in ServerConn so a server implementation -// can honor them. -type Permissions struct { - // Critical options restrict default permissions. Common - // restrictions are "source-address" and "force-command". If - // the server cannot enforce the restriction, or does not - // recognize it, the user should not authenticate. - CriticalOptions map[string]string - - // Extensions are extra functionality that the server may - // offer on authenticated connections. Common extensions are - // "permit-agent-forwarding", "permit-X11-forwarding". Lack of - // support for an extension does not preclude authenticating a - // user. - Extensions map[string]string -} - -// ServerConfig holds server specific configuration data. -type ServerConfig struct { - // Config contains configuration shared between client and server. - Config - - hostKeys []Signer - - // NoClientAuth is true if clients are allowed to connect without - // authenticating. - NoClientAuth bool - - // PasswordCallback, if non-nil, is called when a user - // attempts to authenticate using a password. - PasswordCallback func(conn ConnMetadata, password []byte) (*Permissions, error) - - // PublicKeyCallback, if non-nil, is called when a client attempts public - // key authentication. It must return true if the given public key is - // valid for the given user. For example, see CertChecker.Authenticate. - PublicKeyCallback func(conn ConnMetadata, key PublicKey) (*Permissions, error) - - // KeyboardInteractiveCallback, if non-nil, is called when - // keyboard-interactive authentication is selected (RFC - // 4256). The client object's Challenge function should be - // used to query the user. The callback may offer multiple - // Challenge rounds. To avoid information leaks, the client - // should be presented a challenge even if the user is - // unknown. - KeyboardInteractiveCallback func(conn ConnMetadata, client KeyboardInteractiveChallenge) (*Permissions, error) - - // AuthLogCallback, if non-nil, is called to log all authentication - // attempts. - AuthLogCallback func(conn ConnMetadata, method string, err error) - - // ServerVersion is the version identification string to announce in - // the public handshake. - // If empty, a reasonable default is used. - // Note that RFC 4253 section 4.2 requires that this string start with - // "SSH-2.0-". - ServerVersion string -} - -// AddHostKey adds a private key as a host key. If an existing host -// key exists with the same algorithm, it is overwritten. Each server -// config must have at least one host key. -func (s *ServerConfig) AddHostKey(key Signer) { - for i, k := range s.hostKeys { - if k.PublicKey().Type() == key.PublicKey().Type() { - s.hostKeys[i] = key - return - } - } - - s.hostKeys = append(s.hostKeys, key) -} - -// cachedPubKey contains the results of querying whether a public key is -// acceptable for a user. -type cachedPubKey struct { - user string - pubKeyData []byte - result error - perms *Permissions -} - -const maxCachedPubKeys = 16 - -// pubKeyCache caches tests for public keys. Since SSH clients -// will query whether a public key is acceptable before attempting to -// authenticate with it, we end up with duplicate queries for public -// key validity. The cache only applies to a single ServerConn. -type pubKeyCache struct { - keys []cachedPubKey -} - -// get returns the result for a given user/algo/key tuple. -func (c *pubKeyCache) get(user string, pubKeyData []byte) (cachedPubKey, bool) { - for _, k := range c.keys { - if k.user == user && bytes.Equal(k.pubKeyData, pubKeyData) { - return k, true - } - } - return cachedPubKey{}, false -} - -// add adds the given tuple to the cache. -func (c *pubKeyCache) add(candidate cachedPubKey) { - if len(c.keys) < maxCachedPubKeys { - c.keys = append(c.keys, candidate) - } -} - -// ServerConn is an authenticated SSH connection, as seen from the -// server -type ServerConn struct { - Conn - - // If the succeeding authentication callback returned a - // non-nil Permissions pointer, it is stored here. - Permissions *Permissions -} - -// NewServerConn starts a new SSH server with c as the underlying -// transport. It starts with a handshake and, if the handshake is -// unsuccessful, it closes the connection and returns an error. The -// Request and NewChannel channels must be serviced, or the connection -// will hang. -func NewServerConn(c net.Conn, config *ServerConfig) (*ServerConn, <-chan NewChannel, <-chan *Request, error) { - fullConf := *config - fullConf.SetDefaults() - s := &connection{ - sshConn: sshConn{conn: c}, - } - perms, err := s.serverHandshake(&fullConf) - if err != nil { - c.Close() - return nil, nil, nil, err - } - return &ServerConn{s, perms}, s.mux.incomingChannels, s.mux.incomingRequests, nil -} - -// signAndMarshal signs the data with the appropriate algorithm, -// and serializes the result in SSH wire format. -func signAndMarshal(k Signer, rand io.Reader, data []byte) ([]byte, error) { - sig, err := k.Sign(rand, data) - if err != nil { - return nil, err - } - - return Marshal(sig), nil -} - -// handshake performs key exchange and user authentication. -func (s *connection) serverHandshake(config *ServerConfig) (*Permissions, error) { - if len(config.hostKeys) == 0 { - return nil, errors.New("ssh: server has no host keys") - } - - if !config.NoClientAuth && config.PasswordCallback == nil && config.PublicKeyCallback == nil && config.KeyboardInteractiveCallback == nil { - return nil, errors.New("ssh: no authentication methods configured but NoClientAuth is also false") - } - - if config.ServerVersion != "" { - s.serverVersion = []byte(config.ServerVersion) - } else { - s.serverVersion = []byte(packageVersion) - } - var err error - s.clientVersion, err = exchangeVersions(s.sshConn.conn, s.serverVersion) - if err != nil { - return nil, err - } - - tr := newTransport(s.sshConn.conn, config.Rand, false /* not client */) - s.transport = newServerTransport(tr, s.clientVersion, s.serverVersion, config) - - if err := s.transport.waitSession(); err != nil { - return nil, err - } - - // We just did the key change, so the session ID is established. - s.sessionID = s.transport.getSessionID() - - var packet []byte - if packet, err = s.transport.readPacket(); err != nil { - return nil, err - } - - var serviceRequest serviceRequestMsg - if err = Unmarshal(packet, &serviceRequest); err != nil { - return nil, err - } - if serviceRequest.Service != serviceUserAuth { - return nil, errors.New("ssh: requested service '" + serviceRequest.Service + "' before authenticating") - } - serviceAccept := serviceAcceptMsg{ - Service: serviceUserAuth, - } - if err := s.transport.writePacket(Marshal(&serviceAccept)); err != nil { - return nil, err - } - - perms, err := s.serverAuthenticate(config) - if err != nil { - return nil, err - } - s.mux = newMux(s.transport) - return perms, err -} - -func isAcceptableAlgo(algo string) bool { - switch algo { - case KeyAlgoRSA, KeyAlgoDSA, KeyAlgoECDSA256, KeyAlgoECDSA384, KeyAlgoECDSA521, KeyAlgoED25519, - CertAlgoRSAv01, CertAlgoDSAv01, CertAlgoECDSA256v01, CertAlgoECDSA384v01, CertAlgoECDSA521v01: - return true - } - return false -} - -func checkSourceAddress(addr net.Addr, sourceAddrs string) error { - if addr == nil { - return errors.New("ssh: no address known for client, but source-address match required") - } - - tcpAddr, ok := addr.(*net.TCPAddr) - if !ok { - return fmt.Errorf("ssh: remote address %v is not an TCP address when checking source-address match", addr) - } - - for _, sourceAddr := range strings.Split(sourceAddrs, ",") { - if allowedIP := net.ParseIP(sourceAddr); allowedIP != nil { - if allowedIP.Equal(tcpAddr.IP) { - return nil - } - } else { - _, ipNet, err := net.ParseCIDR(sourceAddr) - if err != nil { - return fmt.Errorf("ssh: error parsing source-address restriction %q: %v", sourceAddr, err) - } - - if ipNet.Contains(tcpAddr.IP) { - return nil - } - } - } - - return fmt.Errorf("ssh: remote address %v is not allowed because of source-address restriction", addr) -} - -func (s *connection) serverAuthenticate(config *ServerConfig) (*Permissions, error) { - sessionID := s.transport.getSessionID() - var cache pubKeyCache - var perms *Permissions - -userAuthLoop: - for { - var userAuthReq userAuthRequestMsg - if packet, err := s.transport.readPacket(); err != nil { - return nil, err - } else if err = Unmarshal(packet, &userAuthReq); err != nil { - return nil, err - } - - if userAuthReq.Service != serviceSSH { - return nil, errors.New("ssh: client attempted to negotiate for unknown service: " + userAuthReq.Service) - } - - s.user = userAuthReq.User - perms = nil - authErr := errors.New("no auth passed yet") - - switch userAuthReq.Method { - case "none": - if config.NoClientAuth { - authErr = nil - } - case "password": - if config.PasswordCallback == nil { - authErr = errors.New("ssh: password auth not configured") - break - } - payload := userAuthReq.Payload - if len(payload) < 1 || payload[0] != 0 { - return nil, parseError(msgUserAuthRequest) - } - payload = payload[1:] - password, payload, ok := parseString(payload) - if !ok || len(payload) > 0 { - return nil, parseError(msgUserAuthRequest) - } - - perms, authErr = config.PasswordCallback(s, password) - case "keyboard-interactive": - if config.KeyboardInteractiveCallback == nil { - authErr = errors.New("ssh: keyboard-interactive auth not configubred") - break - } - - prompter := &sshClientKeyboardInteractive{s} - perms, authErr = config.KeyboardInteractiveCallback(s, prompter.Challenge) - case "publickey": - if config.PublicKeyCallback == nil { - authErr = errors.New("ssh: publickey auth not configured") - break - } - payload := userAuthReq.Payload - if len(payload) < 1 { - return nil, parseError(msgUserAuthRequest) - } - isQuery := payload[0] == 0 - payload = payload[1:] - algoBytes, payload, ok := parseString(payload) - if !ok { - return nil, parseError(msgUserAuthRequest) - } - algo := string(algoBytes) - if !isAcceptableAlgo(algo) { - authErr = fmt.Errorf("ssh: algorithm %q not accepted", algo) - break - } - - pubKeyData, payload, ok := parseString(payload) - if !ok { - return nil, parseError(msgUserAuthRequest) - } - - pubKey, err := ParsePublicKey(pubKeyData) - if err != nil { - return nil, err - } - - candidate, ok := cache.get(s.user, pubKeyData) - if !ok { - candidate.user = s.user - candidate.pubKeyData = pubKeyData - candidate.perms, candidate.result = config.PublicKeyCallback(s, pubKey) - if candidate.result == nil && candidate.perms != nil && candidate.perms.CriticalOptions != nil && candidate.perms.CriticalOptions[sourceAddressCriticalOption] != "" { - candidate.result = checkSourceAddress( - s.RemoteAddr(), - candidate.perms.CriticalOptions[sourceAddressCriticalOption]) - } - cache.add(candidate) - } - - if isQuery { - // The client can query if the given public key - // would be okay. - if len(payload) > 0 { - return nil, parseError(msgUserAuthRequest) - } - - if candidate.result == nil { - okMsg := userAuthPubKeyOkMsg{ - Algo: algo, - PubKey: pubKeyData, - } - if err = s.transport.writePacket(Marshal(&okMsg)); err != nil { - return nil, err - } - continue userAuthLoop - } - authErr = candidate.result - } else { - sig, payload, ok := parseSignature(payload) - if !ok || len(payload) > 0 { - return nil, parseError(msgUserAuthRequest) - } - // Ensure the public key algo and signature algo - // are supported. Compare the private key - // algorithm name that corresponds to algo with - // sig.Format. This is usually the same, but - // for certs, the names differ. - if !isAcceptableAlgo(sig.Format) { - break - } - signedData := buildDataSignedForAuth(sessionID, userAuthReq, algoBytes, pubKeyData) - - if err := pubKey.Verify(signedData, sig); err != nil { - return nil, err - } - - authErr = candidate.result - perms = candidate.perms - } - default: - authErr = fmt.Errorf("ssh: unknown method %q", userAuthReq.Method) - } - - if config.AuthLogCallback != nil { - config.AuthLogCallback(s, userAuthReq.Method, authErr) - } - - if authErr == nil { - break userAuthLoop - } - - var failureMsg userAuthFailureMsg - if config.PasswordCallback != nil { - failureMsg.Methods = append(failureMsg.Methods, "password") - } - if config.PublicKeyCallback != nil { - failureMsg.Methods = append(failureMsg.Methods, "publickey") - } - if config.KeyboardInteractiveCallback != nil { - failureMsg.Methods = append(failureMsg.Methods, "keyboard-interactive") - } - - if len(failureMsg.Methods) == 0 { - return nil, errors.New("ssh: no authentication methods configured but NoClientAuth is also false") - } - - if err := s.transport.writePacket(Marshal(&failureMsg)); err != nil { - return nil, err - } - } - - if err := s.transport.writePacket([]byte{msgUserAuthSuccess}); err != nil { - return nil, err - } - return perms, nil -} - -// sshClientKeyboardInteractive implements a ClientKeyboardInteractive by -// asking the client on the other side of a ServerConn. -type sshClientKeyboardInteractive struct { - *connection -} - -func (c *sshClientKeyboardInteractive) Challenge(user, instruction string, questions []string, echos []bool) (answers []string, err error) { - if len(questions) != len(echos) { - return nil, errors.New("ssh: echos and questions must have equal length") - } - - var prompts []byte - for i := range questions { - prompts = appendString(prompts, questions[i]) - prompts = appendBool(prompts, echos[i]) - } - - if err := c.transport.writePacket(Marshal(&userAuthInfoRequestMsg{ - Instruction: instruction, - NumPrompts: uint32(len(questions)), - Prompts: prompts, - })); err != nil { - return nil, err - } - - packet, err := c.transport.readPacket() - if err != nil { - return nil, err - } - if packet[0] != msgUserAuthInfoResponse { - return nil, unexpectedMessageError(msgUserAuthInfoResponse, packet[0]) - } - packet = packet[1:] - - n, packet, ok := parseUint32(packet) - if !ok || int(n) != len(questions) { - return nil, parseError(msgUserAuthInfoResponse) - } - - for i := uint32(0); i < n; i++ { - ans, rest, ok := parseString(packet) - if !ok { - return nil, parseError(msgUserAuthInfoResponse) - } - - answers = append(answers, string(ans)) - packet = rest - } - if len(packet) != 0 { - return nil, errors.New("ssh: junk at end of message") - } - - return answers, nil -} diff --git a/vendor/golang.org/x/crypto/ssh/session.go b/vendor/golang.org/x/crypto/ssh/session.go deleted file mode 100644 index 17e2aa85c..000000000 --- a/vendor/golang.org/x/crypto/ssh/session.go +++ /dev/null @@ -1,627 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssh - -// Session implements an interactive session described in -// "RFC 4254, section 6". - -import ( - "bytes" - "encoding/binary" - "errors" - "fmt" - "io" - "io/ioutil" - "sync" -) - -type Signal string - -// POSIX signals as listed in RFC 4254 Section 6.10. -const ( - SIGABRT Signal = "ABRT" - SIGALRM Signal = "ALRM" - SIGFPE Signal = "FPE" - SIGHUP Signal = "HUP" - SIGILL Signal = "ILL" - SIGINT Signal = "INT" - SIGKILL Signal = "KILL" - SIGPIPE Signal = "PIPE" - SIGQUIT Signal = "QUIT" - SIGSEGV Signal = "SEGV" - SIGTERM Signal = "TERM" - SIGUSR1 Signal = "USR1" - SIGUSR2 Signal = "USR2" -) - -var signals = map[Signal]int{ - SIGABRT: 6, - SIGALRM: 14, - SIGFPE: 8, - SIGHUP: 1, - SIGILL: 4, - SIGINT: 2, - SIGKILL: 9, - SIGPIPE: 13, - SIGQUIT: 3, - SIGSEGV: 11, - SIGTERM: 15, -} - -type TerminalModes map[uint8]uint32 - -// POSIX terminal mode flags as listed in RFC 4254 Section 8. -const ( - tty_OP_END = 0 - VINTR = 1 - VQUIT = 2 - VERASE = 3 - VKILL = 4 - VEOF = 5 - VEOL = 6 - VEOL2 = 7 - VSTART = 8 - VSTOP = 9 - VSUSP = 10 - VDSUSP = 11 - VREPRINT = 12 - VWERASE = 13 - VLNEXT = 14 - VFLUSH = 15 - VSWTCH = 16 - VSTATUS = 17 - VDISCARD = 18 - IGNPAR = 30 - PARMRK = 31 - INPCK = 32 - ISTRIP = 33 - INLCR = 34 - IGNCR = 35 - ICRNL = 36 - IUCLC = 37 - IXON = 38 - IXANY = 39 - IXOFF = 40 - IMAXBEL = 41 - ISIG = 50 - ICANON = 51 - XCASE = 52 - ECHO = 53 - ECHOE = 54 - ECHOK = 55 - ECHONL = 56 - NOFLSH = 57 - TOSTOP = 58 - IEXTEN = 59 - ECHOCTL = 60 - ECHOKE = 61 - PENDIN = 62 - OPOST = 70 - OLCUC = 71 - ONLCR = 72 - OCRNL = 73 - ONOCR = 74 - ONLRET = 75 - CS7 = 90 - CS8 = 91 - PARENB = 92 - PARODD = 93 - TTY_OP_ISPEED = 128 - TTY_OP_OSPEED = 129 -) - -// A Session represents a connection to a remote command or shell. -type Session struct { - // Stdin specifies the remote process's standard input. - // If Stdin is nil, the remote process reads from an empty - // bytes.Buffer. - Stdin io.Reader - - // Stdout and Stderr specify the remote process's standard - // output and error. - // - // If either is nil, Run connects the corresponding file - // descriptor to an instance of ioutil.Discard. There is a - // fixed amount of buffering that is shared for the two streams. - // If either blocks it may eventually cause the remote - // command to block. - Stdout io.Writer - Stderr io.Writer - - ch Channel // the channel backing this session - started bool // true once Start, Run or Shell is invoked. - copyFuncs []func() error - errors chan error // one send per copyFunc - - // true if pipe method is active - stdinpipe, stdoutpipe, stderrpipe bool - - // stdinPipeWriter is non-nil if StdinPipe has not been called - // and Stdin was specified by the user; it is the write end of - // a pipe connecting Session.Stdin to the stdin channel. - stdinPipeWriter io.WriteCloser - - exitStatus chan error -} - -// SendRequest sends an out-of-band channel request on the SSH channel -// underlying the session. -func (s *Session) SendRequest(name string, wantReply bool, payload []byte) (bool, error) { - return s.ch.SendRequest(name, wantReply, payload) -} - -func (s *Session) Close() error { - return s.ch.Close() -} - -// RFC 4254 Section 6.4. -type setenvRequest struct { - Name string - Value string -} - -// Setenv sets an environment variable that will be applied to any -// command executed by Shell or Run. -func (s *Session) Setenv(name, value string) error { - msg := setenvRequest{ - Name: name, - Value: value, - } - ok, err := s.ch.SendRequest("env", true, Marshal(&msg)) - if err == nil && !ok { - err = errors.New("ssh: setenv failed") - } - return err -} - -// RFC 4254 Section 6.2. -type ptyRequestMsg struct { - Term string - Columns uint32 - Rows uint32 - Width uint32 - Height uint32 - Modelist string -} - -// RequestPty requests the association of a pty with the session on the remote host. -func (s *Session) RequestPty(term string, h, w int, termmodes TerminalModes) error { - var tm []byte - for k, v := range termmodes { - kv := struct { - Key byte - Val uint32 - }{k, v} - - tm = append(tm, Marshal(&kv)...) - } - tm = append(tm, tty_OP_END) - req := ptyRequestMsg{ - Term: term, - Columns: uint32(w), - Rows: uint32(h), - Width: uint32(w * 8), - Height: uint32(h * 8), - Modelist: string(tm), - } - ok, err := s.ch.SendRequest("pty-req", true, Marshal(&req)) - if err == nil && !ok { - err = errors.New("ssh: pty-req failed") - } - return err -} - -// RFC 4254 Section 6.5. -type subsystemRequestMsg struct { - Subsystem string -} - -// RequestSubsystem requests the association of a subsystem with the session on the remote host. -// A subsystem is a predefined command that runs in the background when the ssh session is initiated -func (s *Session) RequestSubsystem(subsystem string) error { - msg := subsystemRequestMsg{ - Subsystem: subsystem, - } - ok, err := s.ch.SendRequest("subsystem", true, Marshal(&msg)) - if err == nil && !ok { - err = errors.New("ssh: subsystem request failed") - } - return err -} - -// RFC 4254 Section 6.9. -type signalMsg struct { - Signal string -} - -// Signal sends the given signal to the remote process. -// sig is one of the SIG* constants. -func (s *Session) Signal(sig Signal) error { - msg := signalMsg{ - Signal: string(sig), - } - - _, err := s.ch.SendRequest("signal", false, Marshal(&msg)) - return err -} - -// RFC 4254 Section 6.5. -type execMsg struct { - Command string -} - -// Start runs cmd on the remote host. Typically, the remote -// server passes cmd to the shell for interpretation. -// A Session only accepts one call to Run, Start or Shell. -func (s *Session) Start(cmd string) error { - if s.started { - return errors.New("ssh: session already started") - } - req := execMsg{ - Command: cmd, - } - - ok, err := s.ch.SendRequest("exec", true, Marshal(&req)) - if err == nil && !ok { - err = fmt.Errorf("ssh: command %v failed", cmd) - } - if err != nil { - return err - } - return s.start() -} - -// Run runs cmd on the remote host. Typically, the remote -// server passes cmd to the shell for interpretation. -// A Session only accepts one call to Run, Start, Shell, Output, -// or CombinedOutput. -// -// The returned error is nil if the command runs, has no problems -// copying stdin, stdout, and stderr, and exits with a zero exit -// status. -// -// If the remote server does not send an exit status, an error of type -// *ExitMissingError is returned. If the command completes -// unsuccessfully or is interrupted by a signal, the error is of type -// *ExitError. Other error types may be returned for I/O problems. -func (s *Session) Run(cmd string) error { - err := s.Start(cmd) - if err != nil { - return err - } - return s.Wait() -} - -// Output runs cmd on the remote host and returns its standard output. -func (s *Session) Output(cmd string) ([]byte, error) { - if s.Stdout != nil { - return nil, errors.New("ssh: Stdout already set") - } - var b bytes.Buffer - s.Stdout = &b - err := s.Run(cmd) - return b.Bytes(), err -} - -type singleWriter struct { - b bytes.Buffer - mu sync.Mutex -} - -func (w *singleWriter) Write(p []byte) (int, error) { - w.mu.Lock() - defer w.mu.Unlock() - return w.b.Write(p) -} - -// CombinedOutput runs cmd on the remote host and returns its combined -// standard output and standard error. -func (s *Session) CombinedOutput(cmd string) ([]byte, error) { - if s.Stdout != nil { - return nil, errors.New("ssh: Stdout already set") - } - if s.Stderr != nil { - return nil, errors.New("ssh: Stderr already set") - } - var b singleWriter - s.Stdout = &b - s.Stderr = &b - err := s.Run(cmd) - return b.b.Bytes(), err -} - -// Shell starts a login shell on the remote host. A Session only -// accepts one call to Run, Start, Shell, Output, or CombinedOutput. -func (s *Session) Shell() error { - if s.started { - return errors.New("ssh: session already started") - } - - ok, err := s.ch.SendRequest("shell", true, nil) - if err == nil && !ok { - return errors.New("ssh: could not start shell") - } - if err != nil { - return err - } - return s.start() -} - -func (s *Session) start() error { - s.started = true - - type F func(*Session) - for _, setupFd := range []F{(*Session).stdin, (*Session).stdout, (*Session).stderr} { - setupFd(s) - } - - s.errors = make(chan error, len(s.copyFuncs)) - for _, fn := range s.copyFuncs { - go func(fn func() error) { - s.errors <- fn() - }(fn) - } - return nil -} - -// Wait waits for the remote command to exit. -// -// The returned error is nil if the command runs, has no problems -// copying stdin, stdout, and stderr, and exits with a zero exit -// status. -// -// If the remote server does not send an exit status, an error of type -// *ExitMissingError is returned. If the command completes -// unsuccessfully or is interrupted by a signal, the error is of type -// *ExitError. Other error types may be returned for I/O problems. -func (s *Session) Wait() error { - if !s.started { - return errors.New("ssh: session not started") - } - waitErr := <-s.exitStatus - - if s.stdinPipeWriter != nil { - s.stdinPipeWriter.Close() - } - var copyError error - for _ = range s.copyFuncs { - if err := <-s.errors; err != nil && copyError == nil { - copyError = err - } - } - if waitErr != nil { - return waitErr - } - return copyError -} - -func (s *Session) wait(reqs <-chan *Request) error { - wm := Waitmsg{status: -1} - // Wait for msg channel to be closed before returning. - for msg := range reqs { - switch msg.Type { - case "exit-status": - wm.status = int(binary.BigEndian.Uint32(msg.Payload)) - case "exit-signal": - var sigval struct { - Signal string - CoreDumped bool - Error string - Lang string - } - if err := Unmarshal(msg.Payload, &sigval); err != nil { - return err - } - - // Must sanitize strings? - wm.signal = sigval.Signal - wm.msg = sigval.Error - wm.lang = sigval.Lang - default: - // This handles keepalives and matches - // OpenSSH's behaviour. - if msg.WantReply { - msg.Reply(false, nil) - } - } - } - if wm.status == 0 { - return nil - } - if wm.status == -1 { - // exit-status was never sent from server - if wm.signal == "" { - // signal was not sent either. RFC 4254 - // section 6.10 recommends against this - // behavior, but it is allowed, so we let - // clients handle it. - return &ExitMissingError{} - } - wm.status = 128 - if _, ok := signals[Signal(wm.signal)]; ok { - wm.status += signals[Signal(wm.signal)] - } - } - - return &ExitError{wm} -} - -// ExitMissingError is returned if a session is torn down cleanly, but -// the server sends no confirmation of the exit status. -type ExitMissingError struct{} - -func (e *ExitMissingError) Error() string { - return "wait: remote command exited without exit status or exit signal" -} - -func (s *Session) stdin() { - if s.stdinpipe { - return - } - var stdin io.Reader - if s.Stdin == nil { - stdin = new(bytes.Buffer) - } else { - r, w := io.Pipe() - go func() { - _, err := io.Copy(w, s.Stdin) - w.CloseWithError(err) - }() - stdin, s.stdinPipeWriter = r, w - } - s.copyFuncs = append(s.copyFuncs, func() error { - _, err := io.Copy(s.ch, stdin) - if err1 := s.ch.CloseWrite(); err == nil && err1 != io.EOF { - err = err1 - } - return err - }) -} - -func (s *Session) stdout() { - if s.stdoutpipe { - return - } - if s.Stdout == nil { - s.Stdout = ioutil.Discard - } - s.copyFuncs = append(s.copyFuncs, func() error { - _, err := io.Copy(s.Stdout, s.ch) - return err - }) -} - -func (s *Session) stderr() { - if s.stderrpipe { - return - } - if s.Stderr == nil { - s.Stderr = ioutil.Discard - } - s.copyFuncs = append(s.copyFuncs, func() error { - _, err := io.Copy(s.Stderr, s.ch.Stderr()) - return err - }) -} - -// sessionStdin reroutes Close to CloseWrite. -type sessionStdin struct { - io.Writer - ch Channel -} - -func (s *sessionStdin) Close() error { - return s.ch.CloseWrite() -} - -// StdinPipe returns a pipe that will be connected to the -// remote command's standard input when the command starts. -func (s *Session) StdinPipe() (io.WriteCloser, error) { - if s.Stdin != nil { - return nil, errors.New("ssh: Stdin already set") - } - if s.started { - return nil, errors.New("ssh: StdinPipe after process started") - } - s.stdinpipe = true - return &sessionStdin{s.ch, s.ch}, nil -} - -// StdoutPipe returns a pipe that will be connected to the -// remote command's standard output when the command starts. -// There is a fixed amount of buffering that is shared between -// stdout and stderr streams. If the StdoutPipe reader is -// not serviced fast enough it may eventually cause the -// remote command to block. -func (s *Session) StdoutPipe() (io.Reader, error) { - if s.Stdout != nil { - return nil, errors.New("ssh: Stdout already set") - } - if s.started { - return nil, errors.New("ssh: StdoutPipe after process started") - } - s.stdoutpipe = true - return s.ch, nil -} - -// StderrPipe returns a pipe that will be connected to the -// remote command's standard error when the command starts. -// There is a fixed amount of buffering that is shared between -// stdout and stderr streams. If the StderrPipe reader is -// not serviced fast enough it may eventually cause the -// remote command to block. -func (s *Session) StderrPipe() (io.Reader, error) { - if s.Stderr != nil { - return nil, errors.New("ssh: Stderr already set") - } - if s.started { - return nil, errors.New("ssh: StderrPipe after process started") - } - s.stderrpipe = true - return s.ch.Stderr(), nil -} - -// newSession returns a new interactive session on the remote host. -func newSession(ch Channel, reqs <-chan *Request) (*Session, error) { - s := &Session{ - ch: ch, - } - s.exitStatus = make(chan error, 1) - go func() { - s.exitStatus <- s.wait(reqs) - }() - - return s, nil -} - -// An ExitError reports unsuccessful completion of a remote command. -type ExitError struct { - Waitmsg -} - -func (e *ExitError) Error() string { - return e.Waitmsg.String() -} - -// Waitmsg stores the information about an exited remote command -// as reported by Wait. -type Waitmsg struct { - status int - signal string - msg string - lang string -} - -// ExitStatus returns the exit status of the remote command. -func (w Waitmsg) ExitStatus() int { - return w.status -} - -// Signal returns the exit signal of the remote command if -// it was terminated violently. -func (w Waitmsg) Signal() string { - return w.signal -} - -// Msg returns the exit message given by the remote command -func (w Waitmsg) Msg() string { - return w.msg -} - -// Lang returns the language tag. See RFC 3066 -func (w Waitmsg) Lang() string { - return w.lang -} - -func (w Waitmsg) String() string { - str := fmt.Sprintf("Process exited with status %v", w.status) - if w.signal != "" { - str += fmt.Sprintf(" from signal %v", w.signal) - } - if w.msg != "" { - str += fmt.Sprintf(". Reason was: %v", w.msg) - } - return str -} diff --git a/vendor/golang.org/x/crypto/ssh/session_test.go b/vendor/golang.org/x/crypto/ssh/session_test.go deleted file mode 100644 index 7dce6dd69..000000000 --- a/vendor/golang.org/x/crypto/ssh/session_test.go +++ /dev/null @@ -1,774 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssh - -// Session tests. - -import ( - "bytes" - crypto_rand "crypto/rand" - "errors" - "io" - "io/ioutil" - "math/rand" - "net" - "testing" - - "golang.org/x/crypto/ssh/terminal" -) - -type serverType func(Channel, <-chan *Request, *testing.T) - -// dial constructs a new test server and returns a *ClientConn. -func dial(handler serverType, t *testing.T) *Client { - c1, c2, err := netPipe() - if err != nil { - t.Fatalf("netPipe: %v", err) - } - - go func() { - defer c1.Close() - conf := ServerConfig{ - NoClientAuth: true, - } - conf.AddHostKey(testSigners["rsa"]) - - _, chans, reqs, err := NewServerConn(c1, &conf) - if err != nil { - t.Fatalf("Unable to handshake: %v", err) - } - go DiscardRequests(reqs) - - for newCh := range chans { - if newCh.ChannelType() != "session" { - newCh.Reject(UnknownChannelType, "unknown channel type") - continue - } - - ch, inReqs, err := newCh.Accept() - if err != nil { - t.Errorf("Accept: %v", err) - continue - } - go func() { - handler(ch, inReqs, t) - }() - } - }() - - config := &ClientConfig{ - User: "testuser", - HostKeyCallback: InsecureIgnoreHostKey(), - } - - conn, chans, reqs, err := NewClientConn(c2, "", config) - if err != nil { - t.Fatalf("unable to dial remote side: %v", err) - } - - return NewClient(conn, chans, reqs) -} - -// Test a simple string is returned to session.Stdout. -func TestSessionShell(t *testing.T) { - conn := dial(shellHandler, t) - defer conn.Close() - session, err := conn.NewSession() - if err != nil { - t.Fatalf("Unable to request new session: %v", err) - } - defer session.Close() - stdout := new(bytes.Buffer) - session.Stdout = stdout - if err := session.Shell(); err != nil { - t.Fatalf("Unable to execute command: %s", err) - } - if err := session.Wait(); err != nil { - t.Fatalf("Remote command did not exit cleanly: %v", err) - } - actual := stdout.String() - if actual != "golang" { - t.Fatalf("Remote shell did not return expected string: expected=golang, actual=%s", actual) - } -} - -// TODO(dfc) add support for Std{in,err}Pipe when the Server supports it. - -// Test a simple string is returned via StdoutPipe. -func TestSessionStdoutPipe(t *testing.T) { - conn := dial(shellHandler, t) - defer conn.Close() - session, err := conn.NewSession() - if err != nil { - t.Fatalf("Unable to request new session: %v", err) - } - defer session.Close() - stdout, err := session.StdoutPipe() - if err != nil { - t.Fatalf("Unable to request StdoutPipe(): %v", err) - } - var buf bytes.Buffer - if err := session.Shell(); err != nil { - t.Fatalf("Unable to execute command: %v", err) - } - done := make(chan bool, 1) - go func() { - if _, err := io.Copy(&buf, stdout); err != nil { - t.Errorf("Copy of stdout failed: %v", err) - } - done <- true - }() - if err := session.Wait(); err != nil { - t.Fatalf("Remote command did not exit cleanly: %v", err) - } - <-done - actual := buf.String() - if actual != "golang" { - t.Fatalf("Remote shell did not return expected string: expected=golang, actual=%s", actual) - } -} - -// Test that a simple string is returned via the Output helper, -// and that stderr is discarded. -func TestSessionOutput(t *testing.T) { - conn := dial(fixedOutputHandler, t) - defer conn.Close() - session, err := conn.NewSession() - if err != nil { - t.Fatalf("Unable to request new session: %v", err) - } - defer session.Close() - - buf, err := session.Output("") // cmd is ignored by fixedOutputHandler - if err != nil { - t.Error("Remote command did not exit cleanly:", err) - } - w := "this-is-stdout." - g := string(buf) - if g != w { - t.Error("Remote command did not return expected string:") - t.Logf("want %q", w) - t.Logf("got %q", g) - } -} - -// Test that both stdout and stderr are returned -// via the CombinedOutput helper. -func TestSessionCombinedOutput(t *testing.T) { - conn := dial(fixedOutputHandler, t) - defer conn.Close() - session, err := conn.NewSession() - if err != nil { - t.Fatalf("Unable to request new session: %v", err) - } - defer session.Close() - - buf, err := session.CombinedOutput("") // cmd is ignored by fixedOutputHandler - if err != nil { - t.Error("Remote command did not exit cleanly:", err) - } - const stdout = "this-is-stdout." - const stderr = "this-is-stderr." - g := string(buf) - if g != stdout+stderr && g != stderr+stdout { - t.Error("Remote command did not return expected string:") - t.Logf("want %q, or %q", stdout+stderr, stderr+stdout) - t.Logf("got %q", g) - } -} - -// Test non-0 exit status is returned correctly. -func TestExitStatusNonZero(t *testing.T) { - conn := dial(exitStatusNonZeroHandler, t) - defer conn.Close() - session, err := conn.NewSession() - if err != nil { - t.Fatalf("Unable to request new session: %v", err) - } - defer session.Close() - if err := session.Shell(); err != nil { - t.Fatalf("Unable to execute command: %v", err) - } - err = session.Wait() - if err == nil { - t.Fatalf("expected command to fail but it didn't") - } - e, ok := err.(*ExitError) - if !ok { - t.Fatalf("expected *ExitError but got %T", err) - } - if e.ExitStatus() != 15 { - t.Fatalf("expected command to exit with 15 but got %v", e.ExitStatus()) - } -} - -// Test 0 exit status is returned correctly. -func TestExitStatusZero(t *testing.T) { - conn := dial(exitStatusZeroHandler, t) - defer conn.Close() - session, err := conn.NewSession() - if err != nil { - t.Fatalf("Unable to request new session: %v", err) - } - defer session.Close() - - if err := session.Shell(); err != nil { - t.Fatalf("Unable to execute command: %v", err) - } - err = session.Wait() - if err != nil { - t.Fatalf("expected nil but got %v", err) - } -} - -// Test exit signal and status are both returned correctly. -func TestExitSignalAndStatus(t *testing.T) { - conn := dial(exitSignalAndStatusHandler, t) - defer conn.Close() - session, err := conn.NewSession() - if err != nil { - t.Fatalf("Unable to request new session: %v", err) - } - defer session.Close() - if err := session.Shell(); err != nil { - t.Fatalf("Unable to execute command: %v", err) - } - err = session.Wait() - if err == nil { - t.Fatalf("expected command to fail but it didn't") - } - e, ok := err.(*ExitError) - if !ok { - t.Fatalf("expected *ExitError but got %T", err) - } - if e.Signal() != "TERM" || e.ExitStatus() != 15 { - t.Fatalf("expected command to exit with signal TERM and status 15 but got signal %s and status %v", e.Signal(), e.ExitStatus()) - } -} - -// Test exit signal and status are both returned correctly. -func TestKnownExitSignalOnly(t *testing.T) { - conn := dial(exitSignalHandler, t) - defer conn.Close() - session, err := conn.NewSession() - if err != nil { - t.Fatalf("Unable to request new session: %v", err) - } - defer session.Close() - if err := session.Shell(); err != nil { - t.Fatalf("Unable to execute command: %v", err) - } - err = session.Wait() - if err == nil { - t.Fatalf("expected command to fail but it didn't") - } - e, ok := err.(*ExitError) - if !ok { - t.Fatalf("expected *ExitError but got %T", err) - } - if e.Signal() != "TERM" || e.ExitStatus() != 143 { - t.Fatalf("expected command to exit with signal TERM and status 143 but got signal %s and status %v", e.Signal(), e.ExitStatus()) - } -} - -// Test exit signal and status are both returned correctly. -func TestUnknownExitSignal(t *testing.T) { - conn := dial(exitSignalUnknownHandler, t) - defer conn.Close() - session, err := conn.NewSession() - if err != nil { - t.Fatalf("Unable to request new session: %v", err) - } - defer session.Close() - if err := session.Shell(); err != nil { - t.Fatalf("Unable to execute command: %v", err) - } - err = session.Wait() - if err == nil { - t.Fatalf("expected command to fail but it didn't") - } - e, ok := err.(*ExitError) - if !ok { - t.Fatalf("expected *ExitError but got %T", err) - } - if e.Signal() != "SYS" || e.ExitStatus() != 128 { - t.Fatalf("expected command to exit with signal SYS and status 128 but got signal %s and status %v", e.Signal(), e.ExitStatus()) - } -} - -func TestExitWithoutStatusOrSignal(t *testing.T) { - conn := dial(exitWithoutSignalOrStatus, t) - defer conn.Close() - session, err := conn.NewSession() - if err != nil { - t.Fatalf("Unable to request new session: %v", err) - } - defer session.Close() - if err := session.Shell(); err != nil { - t.Fatalf("Unable to execute command: %v", err) - } - err = session.Wait() - if err == nil { - t.Fatalf("expected command to fail but it didn't") - } - if _, ok := err.(*ExitMissingError); !ok { - t.Fatalf("got %T want *ExitMissingError", err) - } -} - -// windowTestBytes is the number of bytes that we'll send to the SSH server. -const windowTestBytes = 16000 * 200 - -// TestServerWindow writes random data to the server. The server is expected to echo -// the same data back, which is compared against the original. -func TestServerWindow(t *testing.T) { - origBuf := bytes.NewBuffer(make([]byte, 0, windowTestBytes)) - io.CopyN(origBuf, crypto_rand.Reader, windowTestBytes) - origBytes := origBuf.Bytes() - - conn := dial(echoHandler, t) - defer conn.Close() - session, err := conn.NewSession() - if err != nil { - t.Fatal(err) - } - defer session.Close() - result := make(chan []byte) - - go func() { - defer close(result) - echoedBuf := bytes.NewBuffer(make([]byte, 0, windowTestBytes)) - serverStdout, err := session.StdoutPipe() - if err != nil { - t.Errorf("StdoutPipe failed: %v", err) - return - } - n, err := copyNRandomly("stdout", echoedBuf, serverStdout, windowTestBytes) - if err != nil && err != io.EOF { - t.Errorf("Read only %d bytes from server, expected %d: %v", n, windowTestBytes, err) - } - result <- echoedBuf.Bytes() - }() - - serverStdin, err := session.StdinPipe() - if err != nil { - t.Fatalf("StdinPipe failed: %v", err) - } - written, err := copyNRandomly("stdin", serverStdin, origBuf, windowTestBytes) - if err != nil { - t.Fatalf("failed to copy origBuf to serverStdin: %v", err) - } - if written != windowTestBytes { - t.Fatalf("Wrote only %d of %d bytes to server", written, windowTestBytes) - } - - echoedBytes := <-result - - if !bytes.Equal(origBytes, echoedBytes) { - t.Fatalf("Echoed buffer differed from original, orig %d, echoed %d", len(origBytes), len(echoedBytes)) - } -} - -// Verify the client can handle a keepalive packet from the server. -func TestClientHandlesKeepalives(t *testing.T) { - conn := dial(channelKeepaliveSender, t) - defer conn.Close() - session, err := conn.NewSession() - if err != nil { - t.Fatal(err) - } - defer session.Close() - if err := session.Shell(); err != nil { - t.Fatalf("Unable to execute command: %v", err) - } - err = session.Wait() - if err != nil { - t.Fatalf("expected nil but got: %v", err) - } -} - -type exitStatusMsg struct { - Status uint32 -} - -type exitSignalMsg struct { - Signal string - CoreDumped bool - Errmsg string - Lang string -} - -func handleTerminalRequests(in <-chan *Request) { - for req := range in { - ok := false - switch req.Type { - case "shell": - ok = true - if len(req.Payload) > 0 { - // We don't accept any commands, only the default shell. - ok = false - } - case "env": - ok = true - } - req.Reply(ok, nil) - } -} - -func newServerShell(ch Channel, in <-chan *Request, prompt string) *terminal.Terminal { - term := terminal.NewTerminal(ch, prompt) - go handleTerminalRequests(in) - return term -} - -func exitStatusZeroHandler(ch Channel, in <-chan *Request, t *testing.T) { - defer ch.Close() - // this string is returned to stdout - shell := newServerShell(ch, in, "> ") - readLine(shell, t) - sendStatus(0, ch, t) -} - -func exitStatusNonZeroHandler(ch Channel, in <-chan *Request, t *testing.T) { - defer ch.Close() - shell := newServerShell(ch, in, "> ") - readLine(shell, t) - sendStatus(15, ch, t) -} - -func exitSignalAndStatusHandler(ch Channel, in <-chan *Request, t *testing.T) { - defer ch.Close() - shell := newServerShell(ch, in, "> ") - readLine(shell, t) - sendStatus(15, ch, t) - sendSignal("TERM", ch, t) -} - -func exitSignalHandler(ch Channel, in <-chan *Request, t *testing.T) { - defer ch.Close() - shell := newServerShell(ch, in, "> ") - readLine(shell, t) - sendSignal("TERM", ch, t) -} - -func exitSignalUnknownHandler(ch Channel, in <-chan *Request, t *testing.T) { - defer ch.Close() - shell := newServerShell(ch, in, "> ") - readLine(shell, t) - sendSignal("SYS", ch, t) -} - -func exitWithoutSignalOrStatus(ch Channel, in <-chan *Request, t *testing.T) { - defer ch.Close() - shell := newServerShell(ch, in, "> ") - readLine(shell, t) -} - -func shellHandler(ch Channel, in <-chan *Request, t *testing.T) { - defer ch.Close() - // this string is returned to stdout - shell := newServerShell(ch, in, "golang") - readLine(shell, t) - sendStatus(0, ch, t) -} - -// Ignores the command, writes fixed strings to stderr and stdout. -// Strings are "this-is-stdout." and "this-is-stderr.". -func fixedOutputHandler(ch Channel, in <-chan *Request, t *testing.T) { - defer ch.Close() - _, err := ch.Read(nil) - - req, ok := <-in - if !ok { - t.Fatalf("error: expected channel request, got: %#v", err) - return - } - - // ignore request, always send some text - req.Reply(true, nil) - - _, err = io.WriteString(ch, "this-is-stdout.") - if err != nil { - t.Fatalf("error writing on server: %v", err) - } - _, err = io.WriteString(ch.Stderr(), "this-is-stderr.") - if err != nil { - t.Fatalf("error writing on server: %v", err) - } - sendStatus(0, ch, t) -} - -func readLine(shell *terminal.Terminal, t *testing.T) { - if _, err := shell.ReadLine(); err != nil && err != io.EOF { - t.Errorf("unable to read line: %v", err) - } -} - -func sendStatus(status uint32, ch Channel, t *testing.T) { - msg := exitStatusMsg{ - Status: status, - } - if _, err := ch.SendRequest("exit-status", false, Marshal(&msg)); err != nil { - t.Errorf("unable to send status: %v", err) - } -} - -func sendSignal(signal string, ch Channel, t *testing.T) { - sig := exitSignalMsg{ - Signal: signal, - CoreDumped: false, - Errmsg: "Process terminated", - Lang: "en-GB-oed", - } - if _, err := ch.SendRequest("exit-signal", false, Marshal(&sig)); err != nil { - t.Errorf("unable to send signal: %v", err) - } -} - -func discardHandler(ch Channel, t *testing.T) { - defer ch.Close() - io.Copy(ioutil.Discard, ch) -} - -func echoHandler(ch Channel, in <-chan *Request, t *testing.T) { - defer ch.Close() - if n, err := copyNRandomly("echohandler", ch, ch, windowTestBytes); err != nil { - t.Errorf("short write, wrote %d, expected %d: %v ", n, windowTestBytes, err) - } -} - -// copyNRandomly copies n bytes from src to dst. It uses a variable, and random, -// buffer size to exercise more code paths. -func copyNRandomly(title string, dst io.Writer, src io.Reader, n int) (int, error) { - var ( - buf = make([]byte, 32*1024) - written int - remaining = n - ) - for remaining > 0 { - l := rand.Intn(1 << 15) - if remaining < l { - l = remaining - } - nr, er := src.Read(buf[:l]) - nw, ew := dst.Write(buf[:nr]) - remaining -= nw - written += nw - if ew != nil { - return written, ew - } - if nr != nw { - return written, io.ErrShortWrite - } - if er != nil && er != io.EOF { - return written, er - } - } - return written, nil -} - -func channelKeepaliveSender(ch Channel, in <-chan *Request, t *testing.T) { - defer ch.Close() - shell := newServerShell(ch, in, "> ") - readLine(shell, t) - if _, err := ch.SendRequest("keepalive@openssh.com", true, nil); err != nil { - t.Errorf("unable to send channel keepalive request: %v", err) - } - sendStatus(0, ch, t) -} - -func TestClientWriteEOF(t *testing.T) { - conn := dial(simpleEchoHandler, t) - defer conn.Close() - - session, err := conn.NewSession() - if err != nil { - t.Fatal(err) - } - defer session.Close() - stdin, err := session.StdinPipe() - if err != nil { - t.Fatalf("StdinPipe failed: %v", err) - } - stdout, err := session.StdoutPipe() - if err != nil { - t.Fatalf("StdoutPipe failed: %v", err) - } - - data := []byte(`0000`) - _, err = stdin.Write(data) - if err != nil { - t.Fatalf("Write failed: %v", err) - } - stdin.Close() - - res, err := ioutil.ReadAll(stdout) - if err != nil { - t.Fatalf("Read failed: %v", err) - } - - if !bytes.Equal(data, res) { - t.Fatalf("Read differed from write, wrote: %v, read: %v", data, res) - } -} - -func simpleEchoHandler(ch Channel, in <-chan *Request, t *testing.T) { - defer ch.Close() - data, err := ioutil.ReadAll(ch) - if err != nil { - t.Errorf("handler read error: %v", err) - } - _, err = ch.Write(data) - if err != nil { - t.Errorf("handler write error: %v", err) - } -} - -func TestSessionID(t *testing.T) { - c1, c2, err := netPipe() - if err != nil { - t.Fatalf("netPipe: %v", err) - } - defer c1.Close() - defer c2.Close() - - serverID := make(chan []byte, 1) - clientID := make(chan []byte, 1) - - serverConf := &ServerConfig{ - NoClientAuth: true, - } - serverConf.AddHostKey(testSigners["ecdsa"]) - clientConf := &ClientConfig{ - HostKeyCallback: InsecureIgnoreHostKey(), - User: "user", - } - - go func() { - conn, chans, reqs, err := NewServerConn(c1, serverConf) - if err != nil { - t.Fatalf("server handshake: %v", err) - } - serverID <- conn.SessionID() - go DiscardRequests(reqs) - for ch := range chans { - ch.Reject(Prohibited, "") - } - }() - - go func() { - conn, chans, reqs, err := NewClientConn(c2, "", clientConf) - if err != nil { - t.Fatalf("client handshake: %v", err) - } - clientID <- conn.SessionID() - go DiscardRequests(reqs) - for ch := range chans { - ch.Reject(Prohibited, "") - } - }() - - s := <-serverID - c := <-clientID - if bytes.Compare(s, c) != 0 { - t.Errorf("server session ID (%x) != client session ID (%x)", s, c) - } else if len(s) == 0 { - t.Errorf("client and server SessionID were empty.") - } -} - -type noReadConn struct { - readSeen bool - net.Conn -} - -func (c *noReadConn) Close() error { - return nil -} - -func (c *noReadConn) Read(b []byte) (int, error) { - c.readSeen = true - return 0, errors.New("noReadConn error") -} - -func TestInvalidServerConfiguration(t *testing.T) { - c1, c2, err := netPipe() - if err != nil { - t.Fatalf("netPipe: %v", err) - } - defer c1.Close() - defer c2.Close() - - serveConn := noReadConn{Conn: c1} - serverConf := &ServerConfig{} - - NewServerConn(&serveConn, serverConf) - if serveConn.readSeen { - t.Fatalf("NewServerConn attempted to Read() from Conn while configuration is missing host key") - } - - serverConf.AddHostKey(testSigners["ecdsa"]) - - NewServerConn(&serveConn, serverConf) - if serveConn.readSeen { - t.Fatalf("NewServerConn attempted to Read() from Conn while configuration is missing authentication method") - } -} - -func TestHostKeyAlgorithms(t *testing.T) { - serverConf := &ServerConfig{ - NoClientAuth: true, - } - serverConf.AddHostKey(testSigners["rsa"]) - serverConf.AddHostKey(testSigners["ecdsa"]) - - connect := func(clientConf *ClientConfig, want string) { - var alg string - clientConf.HostKeyCallback = func(h string, a net.Addr, key PublicKey) error { - alg = key.Type() - return nil - } - c1, c2, err := netPipe() - if err != nil { - t.Fatalf("netPipe: %v", err) - } - defer c1.Close() - defer c2.Close() - - go NewServerConn(c1, serverConf) - _, _, _, err = NewClientConn(c2, "", clientConf) - if err != nil { - t.Fatalf("NewClientConn: %v", err) - } - if alg != want { - t.Errorf("selected key algorithm %s, want %s", alg, want) - } - } - - // By default, we get the preferred algorithm, which is ECDSA 256. - - clientConf := &ClientConfig{ - HostKeyCallback: InsecureIgnoreHostKey(), - } - connect(clientConf, KeyAlgoECDSA256) - - // Client asks for RSA explicitly. - clientConf.HostKeyAlgorithms = []string{KeyAlgoRSA} - connect(clientConf, KeyAlgoRSA) - - c1, c2, err := netPipe() - if err != nil { - t.Fatalf("netPipe: %v", err) - } - defer c1.Close() - defer c2.Close() - - go NewServerConn(c1, serverConf) - clientConf.HostKeyAlgorithms = []string{"nonexistent-hostkey-algo"} - _, _, _, err = NewClientConn(c2, "", clientConf) - if err == nil { - t.Fatal("succeeded connecting with unknown hostkey algorithm") - } -} diff --git a/vendor/golang.org/x/crypto/ssh/tcpip.go b/vendor/golang.org/x/crypto/ssh/tcpip.go deleted file mode 100644 index 6151241ff..000000000 --- a/vendor/golang.org/x/crypto/ssh/tcpip.go +++ /dev/null @@ -1,407 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssh - -import ( - "errors" - "fmt" - "io" - "math/rand" - "net" - "strconv" - "strings" - "sync" - "time" -) - -// Listen requests the remote peer open a listening socket on -// addr. Incoming connections will be available by calling Accept on -// the returned net.Listener. The listener must be serviced, or the -// SSH connection may hang. -func (c *Client) Listen(n, addr string) (net.Listener, error) { - laddr, err := net.ResolveTCPAddr(n, addr) - if err != nil { - return nil, err - } - return c.ListenTCP(laddr) -} - -// Automatic port allocation is broken with OpenSSH before 6.0. See -// also https://bugzilla.mindrot.org/show_bug.cgi?id=2017. In -// particular, OpenSSH 5.9 sends a channelOpenMsg with port number 0, -// rather than the actual port number. This means you can never open -// two different listeners with auto allocated ports. We work around -// this by trying explicit ports until we succeed. - -const openSSHPrefix = "OpenSSH_" - -var portRandomizer = rand.New(rand.NewSource(time.Now().UnixNano())) - -// isBrokenOpenSSHVersion returns true if the given version string -// specifies a version of OpenSSH that is known to have a bug in port -// forwarding. -func isBrokenOpenSSHVersion(versionStr string) bool { - i := strings.Index(versionStr, openSSHPrefix) - if i < 0 { - return false - } - i += len(openSSHPrefix) - j := i - for ; j < len(versionStr); j++ { - if versionStr[j] < '0' || versionStr[j] > '9' { - break - } - } - version, _ := strconv.Atoi(versionStr[i:j]) - return version < 6 -} - -// autoPortListenWorkaround simulates automatic port allocation by -// trying random ports repeatedly. -func (c *Client) autoPortListenWorkaround(laddr *net.TCPAddr) (net.Listener, error) { - var sshListener net.Listener - var err error - const tries = 10 - for i := 0; i < tries; i++ { - addr := *laddr - addr.Port = 1024 + portRandomizer.Intn(60000) - sshListener, err = c.ListenTCP(&addr) - if err == nil { - laddr.Port = addr.Port - return sshListener, err - } - } - return nil, fmt.Errorf("ssh: listen on random port failed after %d tries: %v", tries, err) -} - -// RFC 4254 7.1 -type channelForwardMsg struct { - addr string - rport uint32 -} - -// ListenTCP requests the remote peer open a listening socket -// on laddr. Incoming connections will be available by calling -// Accept on the returned net.Listener. -func (c *Client) ListenTCP(laddr *net.TCPAddr) (net.Listener, error) { - if laddr.Port == 0 && isBrokenOpenSSHVersion(string(c.ServerVersion())) { - return c.autoPortListenWorkaround(laddr) - } - - m := channelForwardMsg{ - laddr.IP.String(), - uint32(laddr.Port), - } - // send message - ok, resp, err := c.SendRequest("tcpip-forward", true, Marshal(&m)) - if err != nil { - return nil, err - } - if !ok { - return nil, errors.New("ssh: tcpip-forward request denied by peer") - } - - // If the original port was 0, then the remote side will - // supply a real port number in the response. - if laddr.Port == 0 { - var p struct { - Port uint32 - } - if err := Unmarshal(resp, &p); err != nil { - return nil, err - } - laddr.Port = int(p.Port) - } - - // Register this forward, using the port number we obtained. - ch := c.forwards.add(*laddr) - - return &tcpListener{laddr, c, ch}, nil -} - -// forwardList stores a mapping between remote -// forward requests and the tcpListeners. -type forwardList struct { - sync.Mutex - entries []forwardEntry -} - -// forwardEntry represents an established mapping of a laddr on a -// remote ssh server to a channel connected to a tcpListener. -type forwardEntry struct { - laddr net.TCPAddr - c chan forward -} - -// forward represents an incoming forwarded tcpip connection. The -// arguments to add/remove/lookup should be address as specified in -// the original forward-request. -type forward struct { - newCh NewChannel // the ssh client channel underlying this forward - raddr *net.TCPAddr // the raddr of the incoming connection -} - -func (l *forwardList) add(addr net.TCPAddr) chan forward { - l.Lock() - defer l.Unlock() - f := forwardEntry{ - addr, - make(chan forward, 1), - } - l.entries = append(l.entries, f) - return f.c -} - -// See RFC 4254, section 7.2 -type forwardedTCPPayload struct { - Addr string - Port uint32 - OriginAddr string - OriginPort uint32 -} - -// parseTCPAddr parses the originating address from the remote into a *net.TCPAddr. -func parseTCPAddr(addr string, port uint32) (*net.TCPAddr, error) { - if port == 0 || port > 65535 { - return nil, fmt.Errorf("ssh: port number out of range: %d", port) - } - ip := net.ParseIP(string(addr)) - if ip == nil { - return nil, fmt.Errorf("ssh: cannot parse IP address %q", addr) - } - return &net.TCPAddr{IP: ip, Port: int(port)}, nil -} - -func (l *forwardList) handleChannels(in <-chan NewChannel) { - for ch := range in { - var payload forwardedTCPPayload - if err := Unmarshal(ch.ExtraData(), &payload); err != nil { - ch.Reject(ConnectionFailed, "could not parse forwarded-tcpip payload: "+err.Error()) - continue - } - - // RFC 4254 section 7.2 specifies that incoming - // addresses should list the address, in string - // format. It is implied that this should be an IP - // address, as it would be impossible to connect to it - // otherwise. - laddr, err := parseTCPAddr(payload.Addr, payload.Port) - if err != nil { - ch.Reject(ConnectionFailed, err.Error()) - continue - } - raddr, err := parseTCPAddr(payload.OriginAddr, payload.OriginPort) - if err != nil { - ch.Reject(ConnectionFailed, err.Error()) - continue - } - - if ok := l.forward(*laddr, *raddr, ch); !ok { - // Section 7.2, implementations MUST reject spurious incoming - // connections. - ch.Reject(Prohibited, "no forward for address") - continue - } - } -} - -// remove removes the forward entry, and the channel feeding its -// listener. -func (l *forwardList) remove(addr net.TCPAddr) { - l.Lock() - defer l.Unlock() - for i, f := range l.entries { - if addr.IP.Equal(f.laddr.IP) && addr.Port == f.laddr.Port { - l.entries = append(l.entries[:i], l.entries[i+1:]...) - close(f.c) - return - } - } -} - -// closeAll closes and clears all forwards. -func (l *forwardList) closeAll() { - l.Lock() - defer l.Unlock() - for _, f := range l.entries { - close(f.c) - } - l.entries = nil -} - -func (l *forwardList) forward(laddr, raddr net.TCPAddr, ch NewChannel) bool { - l.Lock() - defer l.Unlock() - for _, f := range l.entries { - if laddr.IP.Equal(f.laddr.IP) && laddr.Port == f.laddr.Port { - f.c <- forward{ch, &raddr} - return true - } - } - return false -} - -type tcpListener struct { - laddr *net.TCPAddr - - conn *Client - in <-chan forward -} - -// Accept waits for and returns the next connection to the listener. -func (l *tcpListener) Accept() (net.Conn, error) { - s, ok := <-l.in - if !ok { - return nil, io.EOF - } - ch, incoming, err := s.newCh.Accept() - if err != nil { - return nil, err - } - go DiscardRequests(incoming) - - return &tcpChanConn{ - Channel: ch, - laddr: l.laddr, - raddr: s.raddr, - }, nil -} - -// Close closes the listener. -func (l *tcpListener) Close() error { - m := channelForwardMsg{ - l.laddr.IP.String(), - uint32(l.laddr.Port), - } - - // this also closes the listener. - l.conn.forwards.remove(*l.laddr) - ok, _, err := l.conn.SendRequest("cancel-tcpip-forward", true, Marshal(&m)) - if err == nil && !ok { - err = errors.New("ssh: cancel-tcpip-forward failed") - } - return err -} - -// Addr returns the listener's network address. -func (l *tcpListener) Addr() net.Addr { - return l.laddr -} - -// Dial initiates a connection to the addr from the remote host. -// The resulting connection has a zero LocalAddr() and RemoteAddr(). -func (c *Client) Dial(n, addr string) (net.Conn, error) { - // Parse the address into host and numeric port. - host, portString, err := net.SplitHostPort(addr) - if err != nil { - return nil, err - } - port, err := strconv.ParseUint(portString, 10, 16) - if err != nil { - return nil, err - } - // Use a zero address for local and remote address. - zeroAddr := &net.TCPAddr{ - IP: net.IPv4zero, - Port: 0, - } - ch, err := c.dial(net.IPv4zero.String(), 0, host, int(port)) - if err != nil { - return nil, err - } - return &tcpChanConn{ - Channel: ch, - laddr: zeroAddr, - raddr: zeroAddr, - }, nil -} - -// DialTCP connects to the remote address raddr on the network net, -// which must be "tcp", "tcp4", or "tcp6". If laddr is not nil, it is used -// as the local address for the connection. -func (c *Client) DialTCP(n string, laddr, raddr *net.TCPAddr) (net.Conn, error) { - if laddr == nil { - laddr = &net.TCPAddr{ - IP: net.IPv4zero, - Port: 0, - } - } - ch, err := c.dial(laddr.IP.String(), laddr.Port, raddr.IP.String(), raddr.Port) - if err != nil { - return nil, err - } - return &tcpChanConn{ - Channel: ch, - laddr: laddr, - raddr: raddr, - }, nil -} - -// RFC 4254 7.2 -type channelOpenDirectMsg struct { - raddr string - rport uint32 - laddr string - lport uint32 -} - -func (c *Client) dial(laddr string, lport int, raddr string, rport int) (Channel, error) { - msg := channelOpenDirectMsg{ - raddr: raddr, - rport: uint32(rport), - laddr: laddr, - lport: uint32(lport), - } - ch, in, err := c.OpenChannel("direct-tcpip", Marshal(&msg)) - if err != nil { - return nil, err - } - go DiscardRequests(in) - return ch, err -} - -type tcpChan struct { - Channel // the backing channel -} - -// tcpChanConn fulfills the net.Conn interface without -// the tcpChan having to hold laddr or raddr directly. -type tcpChanConn struct { - Channel - laddr, raddr net.Addr -} - -// LocalAddr returns the local network address. -func (t *tcpChanConn) LocalAddr() net.Addr { - return t.laddr -} - -// RemoteAddr returns the remote network address. -func (t *tcpChanConn) RemoteAddr() net.Addr { - return t.raddr -} - -// SetDeadline sets the read and write deadlines associated -// with the connection. -func (t *tcpChanConn) SetDeadline(deadline time.Time) error { - if err := t.SetReadDeadline(deadline); err != nil { - return err - } - return t.SetWriteDeadline(deadline) -} - -// SetReadDeadline sets the read deadline. -// A zero value for t means Read will not time out. -// After the deadline, the error from Read will implement net.Error -// with Timeout() == true. -func (t *tcpChanConn) SetReadDeadline(deadline time.Time) error { - return errors.New("ssh: tcpChan: deadline not supported") -} - -// SetWriteDeadline exists to satisfy the net.Conn interface -// but is not implemented by this type. It always returns an error. -func (t *tcpChanConn) SetWriteDeadline(deadline time.Time) error { - return errors.New("ssh: tcpChan: deadline not supported") -} diff --git a/vendor/golang.org/x/crypto/ssh/tcpip_test.go b/vendor/golang.org/x/crypto/ssh/tcpip_test.go deleted file mode 100644 index f1265cb49..000000000 --- a/vendor/golang.org/x/crypto/ssh/tcpip_test.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssh - -import ( - "testing" -) - -func TestAutoPortListenBroken(t *testing.T) { - broken := "SSH-2.0-OpenSSH_5.9hh11" - works := "SSH-2.0-OpenSSH_6.1" - if !isBrokenOpenSSHVersion(broken) { - t.Errorf("version %q not marked as broken", broken) - } - if isBrokenOpenSSHVersion(works) { - t.Errorf("version %q marked as broken", works) - } -} diff --git a/vendor/golang.org/x/crypto/ssh/terminal/terminal.go b/vendor/golang.org/x/crypto/ssh/terminal/terminal.go deleted file mode 100644 index 18379a935..000000000 --- a/vendor/golang.org/x/crypto/ssh/terminal/terminal.go +++ /dev/null @@ -1,951 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package terminal - -import ( - "bytes" - "io" - "sync" - "unicode/utf8" -) - -// EscapeCodes contains escape sequences that can be written to the terminal in -// order to achieve different styles of text. -type EscapeCodes struct { - // Foreground colors - Black, Red, Green, Yellow, Blue, Magenta, Cyan, White []byte - - // Reset all attributes - Reset []byte -} - -var vt100EscapeCodes = EscapeCodes{ - Black: []byte{keyEscape, '[', '3', '0', 'm'}, - Red: []byte{keyEscape, '[', '3', '1', 'm'}, - Green: []byte{keyEscape, '[', '3', '2', 'm'}, - Yellow: []byte{keyEscape, '[', '3', '3', 'm'}, - Blue: []byte{keyEscape, '[', '3', '4', 'm'}, - Magenta: []byte{keyEscape, '[', '3', '5', 'm'}, - Cyan: []byte{keyEscape, '[', '3', '6', 'm'}, - White: []byte{keyEscape, '[', '3', '7', 'm'}, - - Reset: []byte{keyEscape, '[', '0', 'm'}, -} - -// Terminal contains the state for running a VT100 terminal that is capable of -// reading lines of input. -type Terminal struct { - // AutoCompleteCallback, if non-null, is called for each keypress with - // the full input line and the current position of the cursor (in - // bytes, as an index into |line|). If it returns ok=false, the key - // press is processed normally. Otherwise it returns a replacement line - // and the new cursor position. - AutoCompleteCallback func(line string, pos int, key rune) (newLine string, newPos int, ok bool) - - // Escape contains a pointer to the escape codes for this terminal. - // It's always a valid pointer, although the escape codes themselves - // may be empty if the terminal doesn't support them. - Escape *EscapeCodes - - // lock protects the terminal and the state in this object from - // concurrent processing of a key press and a Write() call. - lock sync.Mutex - - c io.ReadWriter - prompt []rune - - // line is the current line being entered. - line []rune - // pos is the logical position of the cursor in line - pos int - // echo is true if local echo is enabled - echo bool - // pasteActive is true iff there is a bracketed paste operation in - // progress. - pasteActive bool - - // cursorX contains the current X value of the cursor where the left - // edge is 0. cursorY contains the row number where the first row of - // the current line is 0. - cursorX, cursorY int - // maxLine is the greatest value of cursorY so far. - maxLine int - - termWidth, termHeight int - - // outBuf contains the terminal data to be sent. - outBuf []byte - // remainder contains the remainder of any partial key sequences after - // a read. It aliases into inBuf. - remainder []byte - inBuf [256]byte - - // history contains previously entered commands so that they can be - // accessed with the up and down keys. - history stRingBuffer - // historyIndex stores the currently accessed history entry, where zero - // means the immediately previous entry. - historyIndex int - // When navigating up and down the history it's possible to return to - // the incomplete, initial line. That value is stored in - // historyPending. - historyPending string -} - -// NewTerminal runs a VT100 terminal on the given ReadWriter. If the ReadWriter is -// a local terminal, that terminal must first have been put into raw mode. -// prompt is a string that is written at the start of each input line (i.e. -// "> "). -func NewTerminal(c io.ReadWriter, prompt string) *Terminal { - return &Terminal{ - Escape: &vt100EscapeCodes, - c: c, - prompt: []rune(prompt), - termWidth: 80, - termHeight: 24, - echo: true, - historyIndex: -1, - } -} - -const ( - keyCtrlD = 4 - keyCtrlU = 21 - keyEnter = '\r' - keyEscape = 27 - keyBackspace = 127 - keyUnknown = 0xd800 /* UTF-16 surrogate area */ + iota - keyUp - keyDown - keyLeft - keyRight - keyAltLeft - keyAltRight - keyHome - keyEnd - keyDeleteWord - keyDeleteLine - keyClearScreen - keyPasteStart - keyPasteEnd -) - -var ( - crlf = []byte{'\r', '\n'} - pasteStart = []byte{keyEscape, '[', '2', '0', '0', '~'} - pasteEnd = []byte{keyEscape, '[', '2', '0', '1', '~'} -) - -// bytesToKey tries to parse a key sequence from b. If successful, it returns -// the key and the remainder of the input. Otherwise it returns utf8.RuneError. -func bytesToKey(b []byte, pasteActive bool) (rune, []byte) { - if len(b) == 0 { - return utf8.RuneError, nil - } - - if !pasteActive { - switch b[0] { - case 1: // ^A - return keyHome, b[1:] - case 5: // ^E - return keyEnd, b[1:] - case 8: // ^H - return keyBackspace, b[1:] - case 11: // ^K - return keyDeleteLine, b[1:] - case 12: // ^L - return keyClearScreen, b[1:] - case 23: // ^W - return keyDeleteWord, b[1:] - } - } - - if b[0] != keyEscape { - if !utf8.FullRune(b) { - return utf8.RuneError, b - } - r, l := utf8.DecodeRune(b) - return r, b[l:] - } - - if !pasteActive && len(b) >= 3 && b[0] == keyEscape && b[1] == '[' { - switch b[2] { - case 'A': - return keyUp, b[3:] - case 'B': - return keyDown, b[3:] - case 'C': - return keyRight, b[3:] - case 'D': - return keyLeft, b[3:] - case 'H': - return keyHome, b[3:] - case 'F': - return keyEnd, b[3:] - } - } - - if !pasteActive && len(b) >= 6 && b[0] == keyEscape && b[1] == '[' && b[2] == '1' && b[3] == ';' && b[4] == '3' { - switch b[5] { - case 'C': - return keyAltRight, b[6:] - case 'D': - return keyAltLeft, b[6:] - } - } - - if !pasteActive && len(b) >= 6 && bytes.Equal(b[:6], pasteStart) { - return keyPasteStart, b[6:] - } - - if pasteActive && len(b) >= 6 && bytes.Equal(b[:6], pasteEnd) { - return keyPasteEnd, b[6:] - } - - // If we get here then we have a key that we don't recognise, or a - // partial sequence. It's not clear how one should find the end of a - // sequence without knowing them all, but it seems that [a-zA-Z~] only - // appears at the end of a sequence. - for i, c := range b[0:] { - if c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c == '~' { - return keyUnknown, b[i+1:] - } - } - - return utf8.RuneError, b -} - -// queue appends data to the end of t.outBuf -func (t *Terminal) queue(data []rune) { - t.outBuf = append(t.outBuf, []byte(string(data))...) -} - -var eraseUnderCursor = []rune{' ', keyEscape, '[', 'D'} -var space = []rune{' '} - -func isPrintable(key rune) bool { - isInSurrogateArea := key >= 0xd800 && key <= 0xdbff - return key >= 32 && !isInSurrogateArea -} - -// moveCursorToPos appends data to t.outBuf which will move the cursor to the -// given, logical position in the text. -func (t *Terminal) moveCursorToPos(pos int) { - if !t.echo { - return - } - - x := visualLength(t.prompt) + pos - y := x / t.termWidth - x = x % t.termWidth - - up := 0 - if y < t.cursorY { - up = t.cursorY - y - } - - down := 0 - if y > t.cursorY { - down = y - t.cursorY - } - - left := 0 - if x < t.cursorX { - left = t.cursorX - x - } - - right := 0 - if x > t.cursorX { - right = x - t.cursorX - } - - t.cursorX = x - t.cursorY = y - t.move(up, down, left, right) -} - -func (t *Terminal) move(up, down, left, right int) { - movement := make([]rune, 3*(up+down+left+right)) - m := movement - for i := 0; i < up; i++ { - m[0] = keyEscape - m[1] = '[' - m[2] = 'A' - m = m[3:] - } - for i := 0; i < down; i++ { - m[0] = keyEscape - m[1] = '[' - m[2] = 'B' - m = m[3:] - } - for i := 0; i < left; i++ { - m[0] = keyEscape - m[1] = '[' - m[2] = 'D' - m = m[3:] - } - for i := 0; i < right; i++ { - m[0] = keyEscape - m[1] = '[' - m[2] = 'C' - m = m[3:] - } - - t.queue(movement) -} - -func (t *Terminal) clearLineToRight() { - op := []rune{keyEscape, '[', 'K'} - t.queue(op) -} - -const maxLineLength = 4096 - -func (t *Terminal) setLine(newLine []rune, newPos int) { - if t.echo { - t.moveCursorToPos(0) - t.writeLine(newLine) - for i := len(newLine); i < len(t.line); i++ { - t.writeLine(space) - } - t.moveCursorToPos(newPos) - } - t.line = newLine - t.pos = newPos -} - -func (t *Terminal) advanceCursor(places int) { - t.cursorX += places - t.cursorY += t.cursorX / t.termWidth - if t.cursorY > t.maxLine { - t.maxLine = t.cursorY - } - t.cursorX = t.cursorX % t.termWidth - - if places > 0 && t.cursorX == 0 { - // Normally terminals will advance the current position - // when writing a character. But that doesn't happen - // for the last character in a line. However, when - // writing a character (except a new line) that causes - // a line wrap, the position will be advanced two - // places. - // - // So, if we are stopping at the end of a line, we - // need to write a newline so that our cursor can be - // advanced to the next line. - t.outBuf = append(t.outBuf, '\r', '\n') - } -} - -func (t *Terminal) eraseNPreviousChars(n int) { - if n == 0 { - return - } - - if t.pos < n { - n = t.pos - } - t.pos -= n - t.moveCursorToPos(t.pos) - - copy(t.line[t.pos:], t.line[n+t.pos:]) - t.line = t.line[:len(t.line)-n] - if t.echo { - t.writeLine(t.line[t.pos:]) - for i := 0; i < n; i++ { - t.queue(space) - } - t.advanceCursor(n) - t.moveCursorToPos(t.pos) - } -} - -// countToLeftWord returns then number of characters from the cursor to the -// start of the previous word. -func (t *Terminal) countToLeftWord() int { - if t.pos == 0 { - return 0 - } - - pos := t.pos - 1 - for pos > 0 { - if t.line[pos] != ' ' { - break - } - pos-- - } - for pos > 0 { - if t.line[pos] == ' ' { - pos++ - break - } - pos-- - } - - return t.pos - pos -} - -// countToRightWord returns then number of characters from the cursor to the -// start of the next word. -func (t *Terminal) countToRightWord() int { - pos := t.pos - for pos < len(t.line) { - if t.line[pos] == ' ' { - break - } - pos++ - } - for pos < len(t.line) { - if t.line[pos] != ' ' { - break - } - pos++ - } - return pos - t.pos -} - -// visualLength returns the number of visible glyphs in s. -func visualLength(runes []rune) int { - inEscapeSeq := false - length := 0 - - for _, r := range runes { - switch { - case inEscapeSeq: - if (r >= 'a' && r <= 'z') || (r >= 'A' && r <= 'Z') { - inEscapeSeq = false - } - case r == '\x1b': - inEscapeSeq = true - default: - length++ - } - } - - return length -} - -// handleKey processes the given key and, optionally, returns a line of text -// that the user has entered. -func (t *Terminal) handleKey(key rune) (line string, ok bool) { - if t.pasteActive && key != keyEnter { - t.addKeyToLine(key) - return - } - - switch key { - case keyBackspace: - if t.pos == 0 { - return - } - t.eraseNPreviousChars(1) - case keyAltLeft: - // move left by a word. - t.pos -= t.countToLeftWord() - t.moveCursorToPos(t.pos) - case keyAltRight: - // move right by a word. - t.pos += t.countToRightWord() - t.moveCursorToPos(t.pos) - case keyLeft: - if t.pos == 0 { - return - } - t.pos-- - t.moveCursorToPos(t.pos) - case keyRight: - if t.pos == len(t.line) { - return - } - t.pos++ - t.moveCursorToPos(t.pos) - case keyHome: - if t.pos == 0 { - return - } - t.pos = 0 - t.moveCursorToPos(t.pos) - case keyEnd: - if t.pos == len(t.line) { - return - } - t.pos = len(t.line) - t.moveCursorToPos(t.pos) - case keyUp: - entry, ok := t.history.NthPreviousEntry(t.historyIndex + 1) - if !ok { - return "", false - } - if t.historyIndex == -1 { - t.historyPending = string(t.line) - } - t.historyIndex++ - runes := []rune(entry) - t.setLine(runes, len(runes)) - case keyDown: - switch t.historyIndex { - case -1: - return - case 0: - runes := []rune(t.historyPending) - t.setLine(runes, len(runes)) - t.historyIndex-- - default: - entry, ok := t.history.NthPreviousEntry(t.historyIndex - 1) - if ok { - t.historyIndex-- - runes := []rune(entry) - t.setLine(runes, len(runes)) - } - } - case keyEnter: - t.moveCursorToPos(len(t.line)) - t.queue([]rune("\r\n")) - line = string(t.line) - ok = true - t.line = t.line[:0] - t.pos = 0 - t.cursorX = 0 - t.cursorY = 0 - t.maxLine = 0 - case keyDeleteWord: - // Delete zero or more spaces and then one or more characters. - t.eraseNPreviousChars(t.countToLeftWord()) - case keyDeleteLine: - // Delete everything from the current cursor position to the - // end of line. - for i := t.pos; i < len(t.line); i++ { - t.queue(space) - t.advanceCursor(1) - } - t.line = t.line[:t.pos] - t.moveCursorToPos(t.pos) - case keyCtrlD: - // Erase the character under the current position. - // The EOF case when the line is empty is handled in - // readLine(). - if t.pos < len(t.line) { - t.pos++ - t.eraseNPreviousChars(1) - } - case keyCtrlU: - t.eraseNPreviousChars(t.pos) - case keyClearScreen: - // Erases the screen and moves the cursor to the home position. - t.queue([]rune("\x1b[2J\x1b[H")) - t.queue(t.prompt) - t.cursorX, t.cursorY = 0, 0 - t.advanceCursor(visualLength(t.prompt)) - t.setLine(t.line, t.pos) - default: - if t.AutoCompleteCallback != nil { - prefix := string(t.line[:t.pos]) - suffix := string(t.line[t.pos:]) - - t.lock.Unlock() - newLine, newPos, completeOk := t.AutoCompleteCallback(prefix+suffix, len(prefix), key) - t.lock.Lock() - - if completeOk { - t.setLine([]rune(newLine), utf8.RuneCount([]byte(newLine)[:newPos])) - return - } - } - if !isPrintable(key) { - return - } - if len(t.line) == maxLineLength { - return - } - t.addKeyToLine(key) - } - return -} - -// addKeyToLine inserts the given key at the current position in the current -// line. -func (t *Terminal) addKeyToLine(key rune) { - if len(t.line) == cap(t.line) { - newLine := make([]rune, len(t.line), 2*(1+len(t.line))) - copy(newLine, t.line) - t.line = newLine - } - t.line = t.line[:len(t.line)+1] - copy(t.line[t.pos+1:], t.line[t.pos:]) - t.line[t.pos] = key - if t.echo { - t.writeLine(t.line[t.pos:]) - } - t.pos++ - t.moveCursorToPos(t.pos) -} - -func (t *Terminal) writeLine(line []rune) { - for len(line) != 0 { - remainingOnLine := t.termWidth - t.cursorX - todo := len(line) - if todo > remainingOnLine { - todo = remainingOnLine - } - t.queue(line[:todo]) - t.advanceCursor(visualLength(line[:todo])) - line = line[todo:] - } -} - -// writeWithCRLF writes buf to w but replaces all occurrences of \n with \r\n. -func writeWithCRLF(w io.Writer, buf []byte) (n int, err error) { - for len(buf) > 0 { - i := bytes.IndexByte(buf, '\n') - todo := len(buf) - if i >= 0 { - todo = i - } - - var nn int - nn, err = w.Write(buf[:todo]) - n += nn - if err != nil { - return n, err - } - buf = buf[todo:] - - if i >= 0 { - if _, err = w.Write(crlf); err != nil { - return n, err - } - n += 1 - buf = buf[1:] - } - } - - return n, nil -} - -func (t *Terminal) Write(buf []byte) (n int, err error) { - t.lock.Lock() - defer t.lock.Unlock() - - if t.cursorX == 0 && t.cursorY == 0 { - // This is the easy case: there's nothing on the screen that we - // have to move out of the way. - return writeWithCRLF(t.c, buf) - } - - // We have a prompt and possibly user input on the screen. We - // have to clear it first. - t.move(0 /* up */, 0 /* down */, t.cursorX /* left */, 0 /* right */) - t.cursorX = 0 - t.clearLineToRight() - - for t.cursorY > 0 { - t.move(1 /* up */, 0, 0, 0) - t.cursorY-- - t.clearLineToRight() - } - - if _, err = t.c.Write(t.outBuf); err != nil { - return - } - t.outBuf = t.outBuf[:0] - - if n, err = writeWithCRLF(t.c, buf); err != nil { - return - } - - t.writeLine(t.prompt) - if t.echo { - t.writeLine(t.line) - } - - t.moveCursorToPos(t.pos) - - if _, err = t.c.Write(t.outBuf); err != nil { - return - } - t.outBuf = t.outBuf[:0] - return -} - -// ReadPassword temporarily changes the prompt and reads a password, without -// echo, from the terminal. -func (t *Terminal) ReadPassword(prompt string) (line string, err error) { - t.lock.Lock() - defer t.lock.Unlock() - - oldPrompt := t.prompt - t.prompt = []rune(prompt) - t.echo = false - - line, err = t.readLine() - - t.prompt = oldPrompt - t.echo = true - - return -} - -// ReadLine returns a line of input from the terminal. -func (t *Terminal) ReadLine() (line string, err error) { - t.lock.Lock() - defer t.lock.Unlock() - - return t.readLine() -} - -func (t *Terminal) readLine() (line string, err error) { - // t.lock must be held at this point - - if t.cursorX == 0 && t.cursorY == 0 { - t.writeLine(t.prompt) - t.c.Write(t.outBuf) - t.outBuf = t.outBuf[:0] - } - - lineIsPasted := t.pasteActive - - for { - rest := t.remainder - lineOk := false - for !lineOk { - var key rune - key, rest = bytesToKey(rest, t.pasteActive) - if key == utf8.RuneError { - break - } - if !t.pasteActive { - if key == keyCtrlD { - if len(t.line) == 0 { - return "", io.EOF - } - } - if key == keyPasteStart { - t.pasteActive = true - if len(t.line) == 0 { - lineIsPasted = true - } - continue - } - } else if key == keyPasteEnd { - t.pasteActive = false - continue - } - if !t.pasteActive { - lineIsPasted = false - } - line, lineOk = t.handleKey(key) - } - if len(rest) > 0 { - n := copy(t.inBuf[:], rest) - t.remainder = t.inBuf[:n] - } else { - t.remainder = nil - } - t.c.Write(t.outBuf) - t.outBuf = t.outBuf[:0] - if lineOk { - if t.echo { - t.historyIndex = -1 - t.history.Add(line) - } - if lineIsPasted { - err = ErrPasteIndicator - } - return - } - - // t.remainder is a slice at the beginning of t.inBuf - // containing a partial key sequence - readBuf := t.inBuf[len(t.remainder):] - var n int - - t.lock.Unlock() - n, err = t.c.Read(readBuf) - t.lock.Lock() - - if err != nil { - return - } - - t.remainder = t.inBuf[:n+len(t.remainder)] - } -} - -// SetPrompt sets the prompt to be used when reading subsequent lines. -func (t *Terminal) SetPrompt(prompt string) { - t.lock.Lock() - defer t.lock.Unlock() - - t.prompt = []rune(prompt) -} - -func (t *Terminal) clearAndRepaintLinePlusNPrevious(numPrevLines int) { - // Move cursor to column zero at the start of the line. - t.move(t.cursorY, 0, t.cursorX, 0) - t.cursorX, t.cursorY = 0, 0 - t.clearLineToRight() - for t.cursorY < numPrevLines { - // Move down a line - t.move(0, 1, 0, 0) - t.cursorY++ - t.clearLineToRight() - } - // Move back to beginning. - t.move(t.cursorY, 0, 0, 0) - t.cursorX, t.cursorY = 0, 0 - - t.queue(t.prompt) - t.advanceCursor(visualLength(t.prompt)) - t.writeLine(t.line) - t.moveCursorToPos(t.pos) -} - -func (t *Terminal) SetSize(width, height int) error { - t.lock.Lock() - defer t.lock.Unlock() - - if width == 0 { - width = 1 - } - - oldWidth := t.termWidth - t.termWidth, t.termHeight = width, height - - switch { - case width == oldWidth: - // If the width didn't change then nothing else needs to be - // done. - return nil - case len(t.line) == 0 && t.cursorX == 0 && t.cursorY == 0: - // If there is nothing on current line and no prompt printed, - // just do nothing - return nil - case width < oldWidth: - // Some terminals (e.g. xterm) will truncate lines that were - // too long when shinking. Others, (e.g. gnome-terminal) will - // attempt to wrap them. For the former, repainting t.maxLine - // works great, but that behaviour goes badly wrong in the case - // of the latter because they have doubled every full line. - - // We assume that we are working on a terminal that wraps lines - // and adjust the cursor position based on every previous line - // wrapping and turning into two. This causes the prompt on - // xterms to move upwards, which isn't great, but it avoids a - // huge mess with gnome-terminal. - if t.cursorX >= t.termWidth { - t.cursorX = t.termWidth - 1 - } - t.cursorY *= 2 - t.clearAndRepaintLinePlusNPrevious(t.maxLine * 2) - case width > oldWidth: - // If the terminal expands then our position calculations will - // be wrong in the future because we think the cursor is - // |t.pos| chars into the string, but there will be a gap at - // the end of any wrapped line. - // - // But the position will actually be correct until we move, so - // we can move back to the beginning and repaint everything. - t.clearAndRepaintLinePlusNPrevious(t.maxLine) - } - - _, err := t.c.Write(t.outBuf) - t.outBuf = t.outBuf[:0] - return err -} - -type pasteIndicatorError struct{} - -func (pasteIndicatorError) Error() string { - return "terminal: ErrPasteIndicator not correctly handled" -} - -// ErrPasteIndicator may be returned from ReadLine as the error, in addition -// to valid line data. It indicates that bracketed paste mode is enabled and -// that the returned line consists only of pasted data. Programs may wish to -// interpret pasted data more literally than typed data. -var ErrPasteIndicator = pasteIndicatorError{} - -// SetBracketedPasteMode requests that the terminal bracket paste operations -// with markers. Not all terminals support this but, if it is supported, then -// enabling this mode will stop any autocomplete callback from running due to -// pastes. Additionally, any lines that are completely pasted will be returned -// from ReadLine with the error set to ErrPasteIndicator. -func (t *Terminal) SetBracketedPasteMode(on bool) { - if on { - io.WriteString(t.c, "\x1b[?2004h") - } else { - io.WriteString(t.c, "\x1b[?2004l") - } -} - -// stRingBuffer is a ring buffer of strings. -type stRingBuffer struct { - // entries contains max elements. - entries []string - max int - // head contains the index of the element most recently added to the ring. - head int - // size contains the number of elements in the ring. - size int -} - -func (s *stRingBuffer) Add(a string) { - if s.entries == nil { - const defaultNumEntries = 100 - s.entries = make([]string, defaultNumEntries) - s.max = defaultNumEntries - } - - s.head = (s.head + 1) % s.max - s.entries[s.head] = a - if s.size < s.max { - s.size++ - } -} - -// NthPreviousEntry returns the value passed to the nth previous call to Add. -// If n is zero then the immediately prior value is returned, if one, then the -// next most recent, and so on. If such an element doesn't exist then ok is -// false. -func (s *stRingBuffer) NthPreviousEntry(n int) (value string, ok bool) { - if n >= s.size { - return "", false - } - index := s.head - n - if index < 0 { - index += s.max - } - return s.entries[index], true -} - -// readPasswordLine reads from reader until it finds \n or io.EOF. -// The slice returned does not include the \n. -// readPasswordLine also ignores any \r it finds. -func readPasswordLine(reader io.Reader) ([]byte, error) { - var buf [1]byte - var ret []byte - - for { - n, err := reader.Read(buf[:]) - if n > 0 { - switch buf[0] { - case '\n': - return ret, nil - case '\r': - // remove \r from passwords on Windows - default: - ret = append(ret, buf[0]) - } - continue - } - if err != nil { - if err == io.EOF && len(ret) > 0 { - return ret, nil - } - return ret, err - } - } -} diff --git a/vendor/golang.org/x/crypto/ssh/terminal/terminal_test.go b/vendor/golang.org/x/crypto/ssh/terminal/terminal_test.go deleted file mode 100644 index 901c72ab3..000000000 --- a/vendor/golang.org/x/crypto/ssh/terminal/terminal_test.go +++ /dev/null @@ -1,350 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package terminal - -import ( - "bytes" - "io" - "os" - "testing" -) - -type MockTerminal struct { - toSend []byte - bytesPerRead int - received []byte -} - -func (c *MockTerminal) Read(data []byte) (n int, err error) { - n = len(data) - if n == 0 { - return - } - if n > len(c.toSend) { - n = len(c.toSend) - } - if n == 0 { - return 0, io.EOF - } - if c.bytesPerRead > 0 && n > c.bytesPerRead { - n = c.bytesPerRead - } - copy(data, c.toSend[:n]) - c.toSend = c.toSend[n:] - return -} - -func (c *MockTerminal) Write(data []byte) (n int, err error) { - c.received = append(c.received, data...) - return len(data), nil -} - -func TestClose(t *testing.T) { - c := &MockTerminal{} - ss := NewTerminal(c, "> ") - line, err := ss.ReadLine() - if line != "" { - t.Errorf("Expected empty line but got: %s", line) - } - if err != io.EOF { - t.Errorf("Error should have been EOF but got: %s", err) - } -} - -var keyPressTests = []struct { - in string - line string - err error - throwAwayLines int -}{ - { - err: io.EOF, - }, - { - in: "\r", - line: "", - }, - { - in: "foo\r", - line: "foo", - }, - { - in: "a\x1b[Cb\r", // right - line: "ab", - }, - { - in: "a\x1b[Db\r", // left - line: "ba", - }, - { - in: "a\177b\r", // backspace - line: "b", - }, - { - in: "\x1b[A\r", // up - }, - { - in: "\x1b[B\r", // down - }, - { - in: "line\x1b[A\x1b[B\r", // up then down - line: "line", - }, - { - in: "line1\rline2\x1b[A\r", // recall previous line. - line: "line1", - throwAwayLines: 1, - }, - { - // recall two previous lines and append. - in: "line1\rline2\rline3\x1b[A\x1b[Axxx\r", - line: "line1xxx", - throwAwayLines: 2, - }, - { - // Ctrl-A to move to beginning of line followed by ^K to kill - // line. - in: "a b \001\013\r", - line: "", - }, - { - // Ctrl-A to move to beginning of line, Ctrl-E to move to end, - // finally ^K to kill nothing. - in: "a b \001\005\013\r", - line: "a b ", - }, - { - in: "\027\r", - line: "", - }, - { - in: "a\027\r", - line: "", - }, - { - in: "a \027\r", - line: "", - }, - { - in: "a b\027\r", - line: "a ", - }, - { - in: "a b \027\r", - line: "a ", - }, - { - in: "one two thr\x1b[D\027\r", - line: "one two r", - }, - { - in: "\013\r", - line: "", - }, - { - in: "a\013\r", - line: "a", - }, - { - in: "ab\x1b[D\013\r", - line: "a", - }, - { - in: "Ξεσκεπάζω\r", - line: "Ξεσκεπάζω", - }, - { - in: "£\r\x1b[A\177\r", // non-ASCII char, enter, up, backspace. - line: "", - throwAwayLines: 1, - }, - { - in: "£\r££\x1b[A\x1b[B\177\r", // non-ASCII char, enter, 2x non-ASCII, up, down, backspace, enter. - line: "£", - throwAwayLines: 1, - }, - { - // Ctrl-D at the end of the line should be ignored. - in: "a\004\r", - line: "a", - }, - { - // a, b, left, Ctrl-D should erase the b. - in: "ab\x1b[D\004\r", - line: "a", - }, - { - // a, b, c, d, left, left, ^U should erase to the beginning of - // the line. - in: "abcd\x1b[D\x1b[D\025\r", - line: "cd", - }, - { - // Bracketed paste mode: control sequences should be returned - // verbatim in paste mode. - in: "abc\x1b[200~de\177f\x1b[201~\177\r", - line: "abcde\177", - }, - { - // Enter in bracketed paste mode should still work. - in: "abc\x1b[200~d\refg\x1b[201~h\r", - line: "efgh", - throwAwayLines: 1, - }, - { - // Lines consisting entirely of pasted data should be indicated as such. - in: "\x1b[200~a\r", - line: "a", - err: ErrPasteIndicator, - }, -} - -func TestKeyPresses(t *testing.T) { - for i, test := range keyPressTests { - for j := 1; j < len(test.in); j++ { - c := &MockTerminal{ - toSend: []byte(test.in), - bytesPerRead: j, - } - ss := NewTerminal(c, "> ") - for k := 0; k < test.throwAwayLines; k++ { - _, err := ss.ReadLine() - if err != nil { - t.Errorf("Throwaway line %d from test %d resulted in error: %s", k, i, err) - } - } - line, err := ss.ReadLine() - if line != test.line { - t.Errorf("Line resulting from test %d (%d bytes per read) was '%s', expected '%s'", i, j, line, test.line) - break - } - if err != test.err { - t.Errorf("Error resulting from test %d (%d bytes per read) was '%v', expected '%v'", i, j, err, test.err) - break - } - } - } -} - -func TestPasswordNotSaved(t *testing.T) { - c := &MockTerminal{ - toSend: []byte("password\r\x1b[A\r"), - bytesPerRead: 1, - } - ss := NewTerminal(c, "> ") - pw, _ := ss.ReadPassword("> ") - if pw != "password" { - t.Fatalf("failed to read password, got %s", pw) - } - line, _ := ss.ReadLine() - if len(line) > 0 { - t.Fatalf("password was saved in history") - } -} - -var setSizeTests = []struct { - width, height int -}{ - {40, 13}, - {80, 24}, - {132, 43}, -} - -func TestTerminalSetSize(t *testing.T) { - for _, setSize := range setSizeTests { - c := &MockTerminal{ - toSend: []byte("password\r\x1b[A\r"), - bytesPerRead: 1, - } - ss := NewTerminal(c, "> ") - ss.SetSize(setSize.width, setSize.height) - pw, _ := ss.ReadPassword("Password: ") - if pw != "password" { - t.Fatalf("failed to read password, got %s", pw) - } - if string(c.received) != "Password: \r\n" { - t.Errorf("failed to set the temporary prompt expected %q, got %q", "Password: ", c.received) - } - } -} - -func TestReadPasswordLineEnd(t *testing.T) { - var tests = []struct { - input string - want string - }{ - {"\n", ""}, - {"\r\n", ""}, - {"test\r\n", "test"}, - {"testtesttesttes\n", "testtesttesttes"}, - {"testtesttesttes\r\n", "testtesttesttes"}, - {"testtesttesttesttest\n", "testtesttesttesttest"}, - {"testtesttesttesttest\r\n", "testtesttesttesttest"}, - } - for _, test := range tests { - buf := new(bytes.Buffer) - if _, err := buf.WriteString(test.input); err != nil { - t.Fatal(err) - } - - have, err := readPasswordLine(buf) - if err != nil { - t.Errorf("readPasswordLine(%q) failed: %v", test.input, err) - continue - } - if string(have) != test.want { - t.Errorf("readPasswordLine(%q) returns %q, but %q is expected", test.input, string(have), test.want) - continue - } - - if _, err = buf.WriteString(test.input); err != nil { - t.Fatal(err) - } - have, err = readPasswordLine(buf) - if err != nil { - t.Errorf("readPasswordLine(%q) failed: %v", test.input, err) - continue - } - if string(have) != test.want { - t.Errorf("readPasswordLine(%q) returns %q, but %q is expected", test.input, string(have), test.want) - continue - } - } -} - -func TestMakeRawState(t *testing.T) { - fd := int(os.Stdout.Fd()) - if !IsTerminal(fd) { - t.Skip("stdout is not a terminal; skipping test") - } - - st, err := GetState(fd) - if err != nil { - t.Fatalf("failed to get terminal state from GetState: %s", err) - } - defer Restore(fd, st) - raw, err := MakeRaw(fd) - if err != nil { - t.Fatalf("failed to get terminal state from MakeRaw: %s", err) - } - - if *st != *raw { - t.Errorf("states do not match; was %v, expected %v", raw, st) - } -} - -func TestOutputNewlines(t *testing.T) { - // \n should be changed to \r\n in terminal output. - buf := new(bytes.Buffer) - term := NewTerminal(buf, ">") - - term.Write([]byte("1\n2\n")) - output := string(buf.Bytes()) - const expected = "1\r\n2\r\n" - - if output != expected { - t.Errorf("incorrect output: was %q, expected %q", output, expected) - } -} diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util.go b/vendor/golang.org/x/crypto/ssh/terminal/util.go deleted file mode 100644 index d01919614..000000000 --- a/vendor/golang.org/x/crypto/ssh/terminal/util.go +++ /dev/null @@ -1,119 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin dragonfly freebsd linux,!appengine netbsd openbsd - -// Package terminal provides support functions for dealing with terminals, as -// commonly found on UNIX systems. -// -// Putting a terminal into raw mode is the most common requirement: -// -// oldState, err := terminal.MakeRaw(0) -// if err != nil { -// panic(err) -// } -// defer terminal.Restore(0, oldState) -package terminal // import "golang.org/x/crypto/ssh/terminal" - -import ( - "syscall" - "unsafe" -) - -// State contains the state of a terminal. -type State struct { - termios syscall.Termios -} - -// IsTerminal returns true if the given file descriptor is a terminal. -func IsTerminal(fd int) bool { - var termios syscall.Termios - _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0) - return err == 0 -} - -// MakeRaw put the terminal connected to the given file descriptor into raw -// mode and returns the previous state of the terminal so that it can be -// restored. -func MakeRaw(fd int) (*State, error) { - var oldState State - if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), ioctlReadTermios, uintptr(unsafe.Pointer(&oldState.termios)), 0, 0, 0); err != 0 { - return nil, err - } - - newState := oldState.termios - // This attempts to replicate the behaviour documented for cfmakeraw in - // the termios(3) manpage. - newState.Iflag &^= syscall.IGNBRK | syscall.BRKINT | syscall.PARMRK | syscall.ISTRIP | syscall.INLCR | syscall.IGNCR | syscall.ICRNL | syscall.IXON - newState.Oflag &^= syscall.OPOST - newState.Lflag &^= syscall.ECHO | syscall.ECHONL | syscall.ICANON | syscall.ISIG | syscall.IEXTEN - newState.Cflag &^= syscall.CSIZE | syscall.PARENB - newState.Cflag |= syscall.CS8 - if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), ioctlWriteTermios, uintptr(unsafe.Pointer(&newState)), 0, 0, 0); err != 0 { - return nil, err - } - - return &oldState, nil -} - -// GetState returns the current state of a terminal which may be useful to -// restore the terminal after a signal. -func GetState(fd int) (*State, error) { - var oldState State - if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), ioctlReadTermios, uintptr(unsafe.Pointer(&oldState.termios)), 0, 0, 0); err != 0 { - return nil, err - } - - return &oldState, nil -} - -// Restore restores the terminal connected to the given file descriptor to a -// previous state. -func Restore(fd int, state *State) error { - if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), ioctlWriteTermios, uintptr(unsafe.Pointer(&state.termios)), 0, 0, 0); err != 0 { - return err - } - return nil -} - -// GetSize returns the dimensions of the given terminal. -func GetSize(fd int) (width, height int, err error) { - var dimensions [4]uint16 - - if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), uintptr(syscall.TIOCGWINSZ), uintptr(unsafe.Pointer(&dimensions)), 0, 0, 0); err != 0 { - return -1, -1, err - } - return int(dimensions[1]), int(dimensions[0]), nil -} - -// passwordReader is an io.Reader that reads from a specific file descriptor. -type passwordReader int - -func (r passwordReader) Read(buf []byte) (int, error) { - return syscall.Read(int(r), buf) -} - -// ReadPassword reads a line of input from a terminal without local echo. This -// is commonly used for inputting passwords and other sensitive data. The slice -// returned does not include the \n. -func ReadPassword(fd int) ([]byte, error) { - var oldState syscall.Termios - if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), ioctlReadTermios, uintptr(unsafe.Pointer(&oldState)), 0, 0, 0); err != 0 { - return nil, err - } - - newState := oldState - newState.Lflag &^= syscall.ECHO - newState.Lflag |= syscall.ICANON | syscall.ISIG - newState.Iflag |= syscall.ICRNL - if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), ioctlWriteTermios, uintptr(unsafe.Pointer(&newState)), 0, 0, 0); err != 0 { - return nil, err - } - - defer func() { - syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), ioctlWriteTermios, uintptr(unsafe.Pointer(&oldState)), 0, 0, 0) - }() - - return readPasswordLine(passwordReader(fd)) -} diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go b/vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go deleted file mode 100644 index 9c1ffd145..000000000 --- a/vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin dragonfly freebsd netbsd openbsd - -package terminal - -import "syscall" - -const ioctlReadTermios = syscall.TIOCGETA -const ioctlWriteTermios = syscall.TIOCSETA diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util_linux.go b/vendor/golang.org/x/crypto/ssh/terminal/util_linux.go deleted file mode 100644 index 5883b22d7..000000000 --- a/vendor/golang.org/x/crypto/ssh/terminal/util_linux.go +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package terminal - -// These constants are declared here, rather than importing -// them from the syscall package as some syscall packages, even -// on linux, for example gccgo, do not declare them. -const ioctlReadTermios = 0x5401 // syscall.TCGETS -const ioctlWriteTermios = 0x5402 // syscall.TCSETS diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go b/vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go deleted file mode 100644 index 799f049f0..000000000 --- a/vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package terminal provides support functions for dealing with terminals, as -// commonly found on UNIX systems. -// -// Putting a terminal into raw mode is the most common requirement: -// -// oldState, err := terminal.MakeRaw(0) -// if err != nil { -// panic(err) -// } -// defer terminal.Restore(0, oldState) -package terminal - -import ( - "fmt" - "runtime" -) - -type State struct{} - -// IsTerminal returns true if the given file descriptor is a terminal. -func IsTerminal(fd int) bool { - return false -} - -// MakeRaw put the terminal connected to the given file descriptor into raw -// mode and returns the previous state of the terminal so that it can be -// restored. -func MakeRaw(fd int) (*State, error) { - return nil, fmt.Errorf("terminal: MakeRaw not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) -} - -// GetState returns the current state of a terminal which may be useful to -// restore the terminal after a signal. -func GetState(fd int) (*State, error) { - return nil, fmt.Errorf("terminal: GetState not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) -} - -// Restore restores the terminal connected to the given file descriptor to a -// previous state. -func Restore(fd int, state *State) error { - return fmt.Errorf("terminal: Restore not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) -} - -// GetSize returns the dimensions of the given terminal. -func GetSize(fd int) (width, height int, err error) { - return 0, 0, fmt.Errorf("terminal: GetSize not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) -} - -// ReadPassword reads a line of input from a terminal without local echo. This -// is commonly used for inputting passwords and other sensitive data. The slice -// returned does not include the \n. -func ReadPassword(fd int) ([]byte, error) { - return nil, fmt.Errorf("terminal: ReadPassword not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) -} diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go b/vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go deleted file mode 100644 index 07eb5edd7..000000000 --- a/vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build solaris - -package terminal // import "golang.org/x/crypto/ssh/terminal" - -import ( - "golang.org/x/sys/unix" - "io" - "syscall" -) - -// State contains the state of a terminal. -type State struct { - termios syscall.Termios -} - -// IsTerminal returns true if the given file descriptor is a terminal. -func IsTerminal(fd int) bool { - // see: http://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libbc/libc/gen/common/isatty.c - var termio unix.Termio - err := unix.IoctlSetTermio(fd, unix.TCGETA, &termio) - return err == nil -} - -// ReadPassword reads a line of input from a terminal without local echo. This -// is commonly used for inputting passwords and other sensitive data. The slice -// returned does not include the \n. -func ReadPassword(fd int) ([]byte, error) { - // see also: http://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libast/common/uwin/getpass.c - val, err := unix.IoctlGetTermios(fd, unix.TCGETS) - if err != nil { - return nil, err - } - oldState := *val - - newState := oldState - newState.Lflag &^= syscall.ECHO - newState.Lflag |= syscall.ICANON | syscall.ISIG - newState.Iflag |= syscall.ICRNL - err = unix.IoctlSetTermios(fd, unix.TCSETS, &newState) - if err != nil { - return nil, err - } - - defer unix.IoctlSetTermios(fd, unix.TCSETS, &oldState) - - var buf [16]byte - var ret []byte - for { - n, err := syscall.Read(fd, buf[:]) - if err != nil { - return nil, err - } - if n == 0 { - if len(ret) == 0 { - return nil, io.EOF - } - break - } - if buf[n-1] == '\n' { - n-- - } - ret = append(ret, buf[:n]...) - if n < len(buf) { - break - } - } - - return ret, nil -} diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go b/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go deleted file mode 100644 index e0a1f36ce..000000000 --- a/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows - -// Package terminal provides support functions for dealing with terminals, as -// commonly found on UNIX systems. -// -// Putting a terminal into raw mode is the most common requirement: -// -// oldState, err := terminal.MakeRaw(0) -// if err != nil { -// panic(err) -// } -// defer terminal.Restore(0, oldState) -package terminal - -import ( - "syscall" - "unsafe" -) - -const ( - enableLineInput = 2 - enableEchoInput = 4 - enableProcessedInput = 1 - enableWindowInput = 8 - enableMouseInput = 16 - enableInsertMode = 32 - enableQuickEditMode = 64 - enableExtendedFlags = 128 - enableAutoPosition = 256 - enableProcessedOutput = 1 - enableWrapAtEolOutput = 2 -) - -var kernel32 = syscall.NewLazyDLL("kernel32.dll") - -var ( - procGetConsoleMode = kernel32.NewProc("GetConsoleMode") - procSetConsoleMode = kernel32.NewProc("SetConsoleMode") - procGetConsoleScreenBufferInfo = kernel32.NewProc("GetConsoleScreenBufferInfo") -) - -type ( - short int16 - word uint16 - - coord struct { - x short - y short - } - smallRect struct { - left short - top short - right short - bottom short - } - consoleScreenBufferInfo struct { - size coord - cursorPosition coord - attributes word - window smallRect - maximumWindowSize coord - } -) - -type State struct { - mode uint32 -} - -// IsTerminal returns true if the given file descriptor is a terminal. -func IsTerminal(fd int) bool { - var st uint32 - r, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, uintptr(fd), uintptr(unsafe.Pointer(&st)), 0) - return r != 0 && e == 0 -} - -// MakeRaw put the terminal connected to the given file descriptor into raw -// mode and returns the previous state of the terminal so that it can be -// restored. -func MakeRaw(fd int) (*State, error) { - var st uint32 - _, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, uintptr(fd), uintptr(unsafe.Pointer(&st)), 0) - if e != 0 { - return nil, error(e) - } - raw := st &^ (enableEchoInput | enableProcessedInput | enableLineInput | enableProcessedOutput) - _, _, e = syscall.Syscall(procSetConsoleMode.Addr(), 2, uintptr(fd), uintptr(raw), 0) - if e != 0 { - return nil, error(e) - } - return &State{st}, nil -} - -// GetState returns the current state of a terminal which may be useful to -// restore the terminal after a signal. -func GetState(fd int) (*State, error) { - var st uint32 - _, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, uintptr(fd), uintptr(unsafe.Pointer(&st)), 0) - if e != 0 { - return nil, error(e) - } - return &State{st}, nil -} - -// Restore restores the terminal connected to the given file descriptor to a -// previous state. -func Restore(fd int, state *State) error { - _, _, err := syscall.Syscall(procSetConsoleMode.Addr(), 2, uintptr(fd), uintptr(state.mode), 0) - return err -} - -// GetSize returns the dimensions of the given terminal. -func GetSize(fd int) (width, height int, err error) { - var info consoleScreenBufferInfo - _, _, e := syscall.Syscall(procGetConsoleScreenBufferInfo.Addr(), 2, uintptr(fd), uintptr(unsafe.Pointer(&info)), 0) - if e != 0 { - return 0, 0, error(e) - } - return int(info.size.x), int(info.size.y), nil -} - -// passwordReader is an io.Reader that reads from a specific Windows HANDLE. -type passwordReader int - -func (r passwordReader) Read(buf []byte) (int, error) { - return syscall.Read(syscall.Handle(r), buf) -} - -// ReadPassword reads a line of input from a terminal without local echo. This -// is commonly used for inputting passwords and other sensitive data. The slice -// returned does not include the \n. -func ReadPassword(fd int) ([]byte, error) { - var st uint32 - _, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, uintptr(fd), uintptr(unsafe.Pointer(&st)), 0) - if e != 0 { - return nil, error(e) - } - old := st - - st &^= (enableEchoInput) - st |= (enableProcessedInput | enableLineInput | enableProcessedOutput) - _, _, e = syscall.Syscall(procSetConsoleMode.Addr(), 2, uintptr(fd), uintptr(st), 0) - if e != 0 { - return nil, error(e) - } - - defer func() { - syscall.Syscall(procSetConsoleMode.Addr(), 2, uintptr(fd), uintptr(old), 0) - }() - - return readPasswordLine(passwordReader(fd)) -} diff --git a/vendor/golang.org/x/crypto/ssh/test/agent_unix_test.go b/vendor/golang.org/x/crypto/ssh/test/agent_unix_test.go deleted file mode 100644 index f481253c9..000000000 --- a/vendor/golang.org/x/crypto/ssh/test/agent_unix_test.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin dragonfly freebsd linux netbsd openbsd - -package test - -import ( - "bytes" - "testing" - - "golang.org/x/crypto/ssh" - "golang.org/x/crypto/ssh/agent" -) - -func TestAgentForward(t *testing.T) { - server := newServer(t) - defer server.Shutdown() - conn := server.Dial(clientConfig()) - defer conn.Close() - - keyring := agent.NewKeyring() - if err := keyring.Add(agent.AddedKey{PrivateKey: testPrivateKeys["dsa"]}); err != nil { - t.Fatalf("Error adding key: %s", err) - } - if err := keyring.Add(agent.AddedKey{ - PrivateKey: testPrivateKeys["dsa"], - ConfirmBeforeUse: true, - LifetimeSecs: 3600, - }); err != nil { - t.Fatalf("Error adding key with constraints: %s", err) - } - pub := testPublicKeys["dsa"] - - sess, err := conn.NewSession() - if err != nil { - t.Fatalf("NewSession: %v", err) - } - if err := agent.RequestAgentForwarding(sess); err != nil { - t.Fatalf("RequestAgentForwarding: %v", err) - } - - if err := agent.ForwardToAgent(conn, keyring); err != nil { - t.Fatalf("SetupForwardKeyring: %v", err) - } - out, err := sess.CombinedOutput("ssh-add -L") - if err != nil { - t.Fatalf("running ssh-add: %v, out %s", err, out) - } - key, _, _, _, err := ssh.ParseAuthorizedKey(out) - if err != nil { - t.Fatalf("ParseAuthorizedKey(%q): %v", out, err) - } - - if !bytes.Equal(key.Marshal(), pub.Marshal()) { - t.Fatalf("got key %s, want %s", ssh.MarshalAuthorizedKey(key), ssh.MarshalAuthorizedKey(pub)) - } -} diff --git a/vendor/golang.org/x/crypto/ssh/test/cert_test.go b/vendor/golang.org/x/crypto/ssh/test/cert_test.go deleted file mode 100644 index bc83e4f5d..000000000 --- a/vendor/golang.org/x/crypto/ssh/test/cert_test.go +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin dragonfly freebsd linux netbsd openbsd - -package test - -import ( - "crypto/rand" - "testing" - - "golang.org/x/crypto/ssh" -) - -func TestCertLogin(t *testing.T) { - s := newServer(t) - defer s.Shutdown() - - // Use a key different from the default. - clientKey := testSigners["dsa"] - caAuthKey := testSigners["ecdsa"] - cert := &ssh.Certificate{ - Key: clientKey.PublicKey(), - ValidPrincipals: []string{username()}, - CertType: ssh.UserCert, - ValidBefore: ssh.CertTimeInfinity, - } - if err := cert.SignCert(rand.Reader, caAuthKey); err != nil { - t.Fatalf("SetSignature: %v", err) - } - - certSigner, err := ssh.NewCertSigner(cert, clientKey) - if err != nil { - t.Fatalf("NewCertSigner: %v", err) - } - - conf := &ssh.ClientConfig{ - User: username(), - HostKeyCallback: ssh.InsecureIgnoreHostKey(), - } - conf.Auth = append(conf.Auth, ssh.PublicKeys(certSigner)) - client, err := s.TryDial(conf) - if err != nil { - t.Fatalf("TryDial: %v", err) - } - client.Close() -} diff --git a/vendor/golang.org/x/crypto/ssh/test/doc.go b/vendor/golang.org/x/crypto/ssh/test/doc.go deleted file mode 100644 index 3f9b3346d..000000000 --- a/vendor/golang.org/x/crypto/ssh/test/doc.go +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This package contains integration tests for the -// golang.org/x/crypto/ssh package. -package test // import "golang.org/x/crypto/ssh/test" diff --git a/vendor/golang.org/x/crypto/ssh/test/forward_unix_test.go b/vendor/golang.org/x/crypto/ssh/test/forward_unix_test.go deleted file mode 100644 index 877a88cde..000000000 --- a/vendor/golang.org/x/crypto/ssh/test/forward_unix_test.go +++ /dev/null @@ -1,160 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin dragonfly freebsd linux netbsd openbsd - -package test - -import ( - "bytes" - "io" - "io/ioutil" - "math/rand" - "net" - "testing" - "time" -) - -func TestPortForward(t *testing.T) { - server := newServer(t) - defer server.Shutdown() - conn := server.Dial(clientConfig()) - defer conn.Close() - - sshListener, err := conn.Listen("tcp", "localhost:0") - if err != nil { - t.Fatal(err) - } - - go func() { - sshConn, err := sshListener.Accept() - if err != nil { - t.Fatalf("listen.Accept failed: %v", err) - } - - _, err = io.Copy(sshConn, sshConn) - if err != nil && err != io.EOF { - t.Fatalf("ssh client copy: %v", err) - } - sshConn.Close() - }() - - forwardedAddr := sshListener.Addr().String() - tcpConn, err := net.Dial("tcp", forwardedAddr) - if err != nil { - t.Fatalf("TCP dial failed: %v", err) - } - - readChan := make(chan []byte) - go func() { - data, _ := ioutil.ReadAll(tcpConn) - readChan <- data - }() - - // Invent some data. - data := make([]byte, 100*1000) - for i := range data { - data[i] = byte(i % 255) - } - - var sent []byte - for len(sent) < 1000*1000 { - // Send random sized chunks - m := rand.Intn(len(data)) - n, err := tcpConn.Write(data[:m]) - if err != nil { - break - } - sent = append(sent, data[:n]...) - } - if err := tcpConn.(*net.TCPConn).CloseWrite(); err != nil { - t.Errorf("tcpConn.CloseWrite: %v", err) - } - - read := <-readChan - - if len(sent) != len(read) { - t.Fatalf("got %d bytes, want %d", len(read), len(sent)) - } - if bytes.Compare(sent, read) != 0 { - t.Fatalf("read back data does not match") - } - - if err := sshListener.Close(); err != nil { - t.Fatalf("sshListener.Close: %v", err) - } - - // Check that the forward disappeared. - tcpConn, err = net.Dial("tcp", forwardedAddr) - if err == nil { - tcpConn.Close() - t.Errorf("still listening to %s after closing", forwardedAddr) - } -} - -func TestAcceptClose(t *testing.T) { - server := newServer(t) - defer server.Shutdown() - conn := server.Dial(clientConfig()) - - sshListener, err := conn.Listen("tcp", "localhost:0") - if err != nil { - t.Fatal(err) - } - - quit := make(chan error, 1) - go func() { - for { - c, err := sshListener.Accept() - if err != nil { - quit <- err - break - } - c.Close() - } - }() - sshListener.Close() - - select { - case <-time.After(1 * time.Second): - t.Errorf("timeout: listener did not close.") - case err := <-quit: - t.Logf("quit as expected (error %v)", err) - } -} - -// Check that listeners exit if the underlying client transport dies. -func TestPortForwardConnectionClose(t *testing.T) { - server := newServer(t) - defer server.Shutdown() - conn := server.Dial(clientConfig()) - - sshListener, err := conn.Listen("tcp", "localhost:0") - if err != nil { - t.Fatal(err) - } - - quit := make(chan error, 1) - go func() { - for { - c, err := sshListener.Accept() - if err != nil { - quit <- err - break - } - c.Close() - } - }() - - // It would be even nicer if we closed the server side, but it - // is more involved as the fd for that side is dup()ed. - server.clientConn.Close() - - select { - case <-time.After(1 * time.Second): - t.Errorf("timeout: listener did not close.") - case err := <-quit: - t.Logf("quit as expected (error %v)", err) - } -} diff --git a/vendor/golang.org/x/crypto/ssh/test/session_test.go b/vendor/golang.org/x/crypto/ssh/test/session_test.go deleted file mode 100644 index fc7e4715b..000000000 --- a/vendor/golang.org/x/crypto/ssh/test/session_test.go +++ /dev/null @@ -1,365 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !windows - -package test - -// Session functional tests. - -import ( - "bytes" - "errors" - "io" - "strings" - "testing" - - "golang.org/x/crypto/ssh" -) - -func TestRunCommandSuccess(t *testing.T) { - server := newServer(t) - defer server.Shutdown() - conn := server.Dial(clientConfig()) - defer conn.Close() - - session, err := conn.NewSession() - if err != nil { - t.Fatalf("session failed: %v", err) - } - defer session.Close() - err = session.Run("true") - if err != nil { - t.Fatalf("session failed: %v", err) - } -} - -func TestHostKeyCheck(t *testing.T) { - server := newServer(t) - defer server.Shutdown() - - conf := clientConfig() - hostDB := hostKeyDB() - conf.HostKeyCallback = hostDB.Check - - // change the keys. - hostDB.keys[ssh.KeyAlgoRSA][25]++ - hostDB.keys[ssh.KeyAlgoDSA][25]++ - hostDB.keys[ssh.KeyAlgoECDSA256][25]++ - - conn, err := server.TryDial(conf) - if err == nil { - conn.Close() - t.Fatalf("dial should have failed.") - } else if !strings.Contains(err.Error(), "host key mismatch") { - t.Fatalf("'host key mismatch' not found in %v", err) - } -} - -func TestRunCommandStdin(t *testing.T) { - server := newServer(t) - defer server.Shutdown() - conn := server.Dial(clientConfig()) - defer conn.Close() - - session, err := conn.NewSession() - if err != nil { - t.Fatalf("session failed: %v", err) - } - defer session.Close() - - r, w := io.Pipe() - defer r.Close() - defer w.Close() - session.Stdin = r - - err = session.Run("true") - if err != nil { - t.Fatalf("session failed: %v", err) - } -} - -func TestRunCommandStdinError(t *testing.T) { - server := newServer(t) - defer server.Shutdown() - conn := server.Dial(clientConfig()) - defer conn.Close() - - session, err := conn.NewSession() - if err != nil { - t.Fatalf("session failed: %v", err) - } - defer session.Close() - - r, w := io.Pipe() - defer r.Close() - session.Stdin = r - pipeErr := errors.New("closing write end of pipe") - w.CloseWithError(pipeErr) - - err = session.Run("true") - if err != pipeErr { - t.Fatalf("expected %v, found %v", pipeErr, err) - } -} - -func TestRunCommandFailed(t *testing.T) { - server := newServer(t) - defer server.Shutdown() - conn := server.Dial(clientConfig()) - defer conn.Close() - - session, err := conn.NewSession() - if err != nil { - t.Fatalf("session failed: %v", err) - } - defer session.Close() - err = session.Run(`bash -c "kill -9 $$"`) - if err == nil { - t.Fatalf("session succeeded: %v", err) - } -} - -func TestRunCommandWeClosed(t *testing.T) { - server := newServer(t) - defer server.Shutdown() - conn := server.Dial(clientConfig()) - defer conn.Close() - - session, err := conn.NewSession() - if err != nil { - t.Fatalf("session failed: %v", err) - } - err = session.Shell() - if err != nil { - t.Fatalf("shell failed: %v", err) - } - err = session.Close() - if err != nil { - t.Fatalf("shell failed: %v", err) - } -} - -func TestFuncLargeRead(t *testing.T) { - server := newServer(t) - defer server.Shutdown() - conn := server.Dial(clientConfig()) - defer conn.Close() - - session, err := conn.NewSession() - if err != nil { - t.Fatalf("unable to create new session: %s", err) - } - - stdout, err := session.StdoutPipe() - if err != nil { - t.Fatalf("unable to acquire stdout pipe: %s", err) - } - - err = session.Start("dd if=/dev/urandom bs=2048 count=1024") - if err != nil { - t.Fatalf("unable to execute remote command: %s", err) - } - - buf := new(bytes.Buffer) - n, err := io.Copy(buf, stdout) - if err != nil { - t.Fatalf("error reading from remote stdout: %s", err) - } - - if n != 2048*1024 { - t.Fatalf("Expected %d bytes but read only %d from remote command", 2048, n) - } -} - -func TestKeyChange(t *testing.T) { - server := newServer(t) - defer server.Shutdown() - conf := clientConfig() - hostDB := hostKeyDB() - conf.HostKeyCallback = hostDB.Check - conf.RekeyThreshold = 1024 - conn := server.Dial(conf) - defer conn.Close() - - for i := 0; i < 4; i++ { - session, err := conn.NewSession() - if err != nil { - t.Fatalf("unable to create new session: %s", err) - } - - stdout, err := session.StdoutPipe() - if err != nil { - t.Fatalf("unable to acquire stdout pipe: %s", err) - } - - err = session.Start("dd if=/dev/urandom bs=1024 count=1") - if err != nil { - t.Fatalf("unable to execute remote command: %s", err) - } - buf := new(bytes.Buffer) - n, err := io.Copy(buf, stdout) - if err != nil { - t.Fatalf("error reading from remote stdout: %s", err) - } - - want := int64(1024) - if n != want { - t.Fatalf("Expected %d bytes but read only %d from remote command", want, n) - } - } - - if changes := hostDB.checkCount; changes < 4 { - t.Errorf("got %d key changes, want 4", changes) - } -} - -func TestInvalidTerminalMode(t *testing.T) { - server := newServer(t) - defer server.Shutdown() - conn := server.Dial(clientConfig()) - defer conn.Close() - - session, err := conn.NewSession() - if err != nil { - t.Fatalf("session failed: %v", err) - } - defer session.Close() - - if err = session.RequestPty("vt100", 80, 40, ssh.TerminalModes{255: 1984}); err == nil { - t.Fatalf("req-pty failed: successful request with invalid mode") - } -} - -func TestValidTerminalMode(t *testing.T) { - server := newServer(t) - defer server.Shutdown() - conn := server.Dial(clientConfig()) - defer conn.Close() - - session, err := conn.NewSession() - if err != nil { - t.Fatalf("session failed: %v", err) - } - defer session.Close() - - stdout, err := session.StdoutPipe() - if err != nil { - t.Fatalf("unable to acquire stdout pipe: %s", err) - } - - stdin, err := session.StdinPipe() - if err != nil { - t.Fatalf("unable to acquire stdin pipe: %s", err) - } - - tm := ssh.TerminalModes{ssh.ECHO: 0} - if err = session.RequestPty("xterm", 80, 40, tm); err != nil { - t.Fatalf("req-pty failed: %s", err) - } - - err = session.Shell() - if err != nil { - t.Fatalf("session failed: %s", err) - } - - stdin.Write([]byte("stty -a && exit\n")) - - var buf bytes.Buffer - if _, err := io.Copy(&buf, stdout); err != nil { - t.Fatalf("reading failed: %s", err) - } - - if sttyOutput := buf.String(); !strings.Contains(sttyOutput, "-echo ") { - t.Fatalf("terminal mode failure: expected -echo in stty output, got %s", sttyOutput) - } -} - -func TestCiphers(t *testing.T) { - var config ssh.Config - config.SetDefaults() - cipherOrder := config.Ciphers - // These ciphers will not be tested when commented out in cipher.go it will - // fallback to the next available as per line 292. - cipherOrder = append(cipherOrder, "aes128-cbc", "3des-cbc") - - for _, ciph := range cipherOrder { - server := newServer(t) - defer server.Shutdown() - conf := clientConfig() - conf.Ciphers = []string{ciph} - // Don't fail if sshd doesn't have the cipher. - conf.Ciphers = append(conf.Ciphers, cipherOrder...) - conn, err := server.TryDial(conf) - if err == nil { - conn.Close() - } else { - t.Fatalf("failed for cipher %q", ciph) - } - } -} - -func TestMACs(t *testing.T) { - var config ssh.Config - config.SetDefaults() - macOrder := config.MACs - - for _, mac := range macOrder { - server := newServer(t) - defer server.Shutdown() - conf := clientConfig() - conf.MACs = []string{mac} - // Don't fail if sshd doesn't have the MAC. - conf.MACs = append(conf.MACs, macOrder...) - if conn, err := server.TryDial(conf); err == nil { - conn.Close() - } else { - t.Fatalf("failed for MAC %q", mac) - } - } -} - -func TestKeyExchanges(t *testing.T) { - var config ssh.Config - config.SetDefaults() - kexOrder := config.KeyExchanges - for _, kex := range kexOrder { - server := newServer(t) - defer server.Shutdown() - conf := clientConfig() - // Don't fail if sshd doesn't have the kex. - conf.KeyExchanges = append([]string{kex}, kexOrder...) - conn, err := server.TryDial(conf) - if err == nil { - conn.Close() - } else { - t.Errorf("failed for kex %q", kex) - } - } -} - -func TestClientAuthAlgorithms(t *testing.T) { - for _, key := range []string{ - "rsa", - "dsa", - "ecdsa", - "ed25519", - } { - server := newServer(t) - conf := clientConfig() - conf.SetDefaults() - conf.Auth = []ssh.AuthMethod{ - ssh.PublicKeys(testSigners[key]), - } - - conn, err := server.TryDial(conf) - if err == nil { - conn.Close() - } else { - t.Errorf("failed for key %q", key) - } - - server.Shutdown() - } -} diff --git a/vendor/golang.org/x/crypto/ssh/test/tcpip_test.go b/vendor/golang.org/x/crypto/ssh/test/tcpip_test.go deleted file mode 100644 index a2eb9358d..000000000 --- a/vendor/golang.org/x/crypto/ssh/test/tcpip_test.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !windows - -package test - -// direct-tcpip functional tests - -import ( - "io" - "net" - "testing" -) - -func TestDial(t *testing.T) { - server := newServer(t) - defer server.Shutdown() - sshConn := server.Dial(clientConfig()) - defer sshConn.Close() - - l, err := net.Listen("tcp", "127.0.0.1:0") - if err != nil { - t.Fatalf("Listen: %v", err) - } - defer l.Close() - - go func() { - for { - c, err := l.Accept() - if err != nil { - break - } - - io.WriteString(c, c.RemoteAddr().String()) - c.Close() - } - }() - - conn, err := sshConn.Dial("tcp", l.Addr().String()) - if err != nil { - t.Fatalf("Dial: %v", err) - } - defer conn.Close() -} diff --git a/vendor/golang.org/x/crypto/ssh/test/test_unix_test.go b/vendor/golang.org/x/crypto/ssh/test/test_unix_test.go deleted file mode 100644 index 3bfd881e4..000000000 --- a/vendor/golang.org/x/crypto/ssh/test/test_unix_test.go +++ /dev/null @@ -1,268 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin dragonfly freebsd linux netbsd openbsd plan9 - -package test - -// functional test harness for unix. - -import ( - "bytes" - "fmt" - "io/ioutil" - "log" - "net" - "os" - "os/exec" - "os/user" - "path/filepath" - "testing" - "text/template" - - "golang.org/x/crypto/ssh" - "golang.org/x/crypto/ssh/testdata" -) - -const sshd_config = ` -Protocol 2 -HostKey {{.Dir}}/id_rsa -HostKey {{.Dir}}/id_dsa -HostKey {{.Dir}}/id_ecdsa -Pidfile {{.Dir}}/sshd.pid -#UsePrivilegeSeparation no -KeyRegenerationInterval 3600 -ServerKeyBits 768 -SyslogFacility AUTH -LogLevel DEBUG2 -LoginGraceTime 120 -PermitRootLogin no -StrictModes no -RSAAuthentication yes -PubkeyAuthentication yes -AuthorizedKeysFile {{.Dir}}/authorized_keys -TrustedUserCAKeys {{.Dir}}/id_ecdsa.pub -IgnoreRhosts yes -RhostsRSAAuthentication no -HostbasedAuthentication no -PubkeyAcceptedKeyTypes=* -` - -var configTmpl = template.Must(template.New("").Parse(sshd_config)) - -type server struct { - t *testing.T - cleanup func() // executed during Shutdown - configfile string - cmd *exec.Cmd - output bytes.Buffer // holds stderr from sshd process - - // Client half of the network connection. - clientConn net.Conn -} - -func username() string { - var username string - if user, err := user.Current(); err == nil { - username = user.Username - } else { - // user.Current() currently requires cgo. If an error is - // returned attempt to get the username from the environment. - log.Printf("user.Current: %v; falling back on $USER", err) - username = os.Getenv("USER") - } - if username == "" { - panic("Unable to get username") - } - return username -} - -type storedHostKey struct { - // keys map from an algorithm string to binary key data. - keys map[string][]byte - - // checkCount counts the Check calls. Used for testing - // rekeying. - checkCount int -} - -func (k *storedHostKey) Add(key ssh.PublicKey) { - if k.keys == nil { - k.keys = map[string][]byte{} - } - k.keys[key.Type()] = key.Marshal() -} - -func (k *storedHostKey) Check(addr string, remote net.Addr, key ssh.PublicKey) error { - k.checkCount++ - algo := key.Type() - - if k.keys == nil || bytes.Compare(key.Marshal(), k.keys[algo]) != 0 { - return fmt.Errorf("host key mismatch. Got %q, want %q", key, k.keys[algo]) - } - return nil -} - -func hostKeyDB() *storedHostKey { - keyChecker := &storedHostKey{} - keyChecker.Add(testPublicKeys["ecdsa"]) - keyChecker.Add(testPublicKeys["rsa"]) - keyChecker.Add(testPublicKeys["dsa"]) - return keyChecker -} - -func clientConfig() *ssh.ClientConfig { - config := &ssh.ClientConfig{ - User: username(), - Auth: []ssh.AuthMethod{ - ssh.PublicKeys(testSigners["user"]), - }, - HostKeyCallback: hostKeyDB().Check, - } - return config -} - -// unixConnection creates two halves of a connected net.UnixConn. It -// is used for connecting the Go SSH client with sshd without opening -// ports. -func unixConnection() (*net.UnixConn, *net.UnixConn, error) { - dir, err := ioutil.TempDir("", "unixConnection") - if err != nil { - return nil, nil, err - } - defer os.Remove(dir) - - addr := filepath.Join(dir, "ssh") - listener, err := net.Listen("unix", addr) - if err != nil { - return nil, nil, err - } - defer listener.Close() - c1, err := net.Dial("unix", addr) - if err != nil { - return nil, nil, err - } - - c2, err := listener.Accept() - if err != nil { - c1.Close() - return nil, nil, err - } - - return c1.(*net.UnixConn), c2.(*net.UnixConn), nil -} - -func (s *server) TryDial(config *ssh.ClientConfig) (*ssh.Client, error) { - sshd, err := exec.LookPath("sshd") - if err != nil { - s.t.Skipf("skipping test: %v", err) - } - - c1, c2, err := unixConnection() - if err != nil { - s.t.Fatalf("unixConnection: %v", err) - } - - s.cmd = exec.Command(sshd, "-f", s.configfile, "-i", "-e") - f, err := c2.File() - if err != nil { - s.t.Fatalf("UnixConn.File: %v", err) - } - defer f.Close() - s.cmd.Stdin = f - s.cmd.Stdout = f - s.cmd.Stderr = &s.output - if err := s.cmd.Start(); err != nil { - s.t.Fail() - s.Shutdown() - s.t.Fatalf("s.cmd.Start: %v", err) - } - s.clientConn = c1 - conn, chans, reqs, err := ssh.NewClientConn(c1, "", config) - if err != nil { - return nil, err - } - return ssh.NewClient(conn, chans, reqs), nil -} - -func (s *server) Dial(config *ssh.ClientConfig) *ssh.Client { - conn, err := s.TryDial(config) - if err != nil { - s.t.Fail() - s.Shutdown() - s.t.Fatalf("ssh.Client: %v", err) - } - return conn -} - -func (s *server) Shutdown() { - if s.cmd != nil && s.cmd.Process != nil { - // Don't check for errors; if it fails it's most - // likely "os: process already finished", and we don't - // care about that. Use os.Interrupt, so child - // processes are killed too. - s.cmd.Process.Signal(os.Interrupt) - s.cmd.Wait() - } - if s.t.Failed() { - // log any output from sshd process - s.t.Logf("sshd: %s", s.output.String()) - } - s.cleanup() -} - -func writeFile(path string, contents []byte) { - f, err := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0600) - if err != nil { - panic(err) - } - defer f.Close() - if _, err := f.Write(contents); err != nil { - panic(err) - } -} - -// newServer returns a new mock ssh server. -func newServer(t *testing.T) *server { - if testing.Short() { - t.Skip("skipping test due to -short") - } - dir, err := ioutil.TempDir("", "sshtest") - if err != nil { - t.Fatal(err) - } - f, err := os.Create(filepath.Join(dir, "sshd_config")) - if err != nil { - t.Fatal(err) - } - err = configTmpl.Execute(f, map[string]string{ - "Dir": dir, - }) - if err != nil { - t.Fatal(err) - } - f.Close() - - for k, v := range testdata.PEMBytes { - filename := "id_" + k - writeFile(filepath.Join(dir, filename), v) - writeFile(filepath.Join(dir, filename+".pub"), ssh.MarshalAuthorizedKey(testPublicKeys[k])) - } - - var authkeys bytes.Buffer - for k, _ := range testdata.PEMBytes { - authkeys.Write(ssh.MarshalAuthorizedKey(testPublicKeys[k])) - } - writeFile(filepath.Join(dir, "authorized_keys"), authkeys.Bytes()) - - return &server{ - t: t, - configfile: f.Name(), - cleanup: func() { - if err := os.RemoveAll(dir); err != nil { - t.Error(err) - } - }, - } -} diff --git a/vendor/golang.org/x/crypto/ssh/test/testdata_test.go b/vendor/golang.org/x/crypto/ssh/test/testdata_test.go deleted file mode 100644 index a053f67ea..000000000 --- a/vendor/golang.org/x/crypto/ssh/test/testdata_test.go +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// IMPLEMENTATION NOTE: To avoid a package loop, this file is in three places: -// ssh/, ssh/agent, and ssh/test/. It should be kept in sync across all three -// instances. - -package test - -import ( - "crypto/rand" - "fmt" - - "golang.org/x/crypto/ssh" - "golang.org/x/crypto/ssh/testdata" -) - -var ( - testPrivateKeys map[string]interface{} - testSigners map[string]ssh.Signer - testPublicKeys map[string]ssh.PublicKey -) - -func init() { - var err error - - n := len(testdata.PEMBytes) - testPrivateKeys = make(map[string]interface{}, n) - testSigners = make(map[string]ssh.Signer, n) - testPublicKeys = make(map[string]ssh.PublicKey, n) - for t, k := range testdata.PEMBytes { - testPrivateKeys[t], err = ssh.ParseRawPrivateKey(k) - if err != nil { - panic(fmt.Sprintf("Unable to parse test key %s: %v", t, err)) - } - testSigners[t], err = ssh.NewSignerFromKey(testPrivateKeys[t]) - if err != nil { - panic(fmt.Sprintf("Unable to create signer for test key %s: %v", t, err)) - } - testPublicKeys[t] = testSigners[t].PublicKey() - } - - // Create a cert and sign it for use in tests. - testCert := &ssh.Certificate{ - Nonce: []byte{}, // To pass reflect.DeepEqual after marshal & parse, this must be non-nil - ValidPrincipals: []string{"gopher1", "gopher2"}, // increases test coverage - ValidAfter: 0, // unix epoch - ValidBefore: ssh.CertTimeInfinity, // The end of currently representable time. - Reserved: []byte{}, // To pass reflect.DeepEqual after marshal & parse, this must be non-nil - Key: testPublicKeys["ecdsa"], - SignatureKey: testPublicKeys["rsa"], - Permissions: ssh.Permissions{ - CriticalOptions: map[string]string{}, - Extensions: map[string]string{}, - }, - } - testCert.SignCert(rand.Reader, testSigners["rsa"]) - testPrivateKeys["cert"] = testPrivateKeys["ecdsa"] - testSigners["cert"], err = ssh.NewCertSigner(testCert, testSigners["ecdsa"]) - if err != nil { - panic(fmt.Sprintf("Unable to create certificate signer: %v", err)) - } -} diff --git a/vendor/golang.org/x/crypto/ssh/testdata/doc.go b/vendor/golang.org/x/crypto/ssh/testdata/doc.go deleted file mode 100644 index fcae47ca6..000000000 --- a/vendor/golang.org/x/crypto/ssh/testdata/doc.go +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This package contains test data shared between the various subpackages of -// the golang.org/x/crypto/ssh package. Under no circumstance should -// this data be used for production code. -package testdata // import "golang.org/x/crypto/ssh/testdata" diff --git a/vendor/golang.org/x/crypto/ssh/testdata/keys.go b/vendor/golang.org/x/crypto/ssh/testdata/keys.go deleted file mode 100644 index 0be2e7e65..000000000 --- a/vendor/golang.org/x/crypto/ssh/testdata/keys.go +++ /dev/null @@ -1,136 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package testdata - -var PEMBytes = map[string][]byte{ - "dsa": []byte(`-----BEGIN DSA PRIVATE KEY----- -MIIBuwIBAAKBgQD6PDSEyXiI9jfNs97WuM46MSDCYlOqWw80ajN16AohtBncs1YB -lHk//dQOvCYOsYaE+gNix2jtoRjwXhDsc25/IqQbU1ahb7mB8/rsaILRGIbA5WH3 -EgFtJmXFovDz3if6F6TzvhFpHgJRmLYVR8cqsezL3hEZOvvs2iH7MorkxwIVAJHD -nD82+lxh2fb4PMsIiaXudAsBAoGAQRf7Q/iaPRn43ZquUhd6WwvirqUj+tkIu6eV -2nZWYmXLlqFQKEy4Tejl7Wkyzr2OSYvbXLzo7TNxLKoWor6ips0phYPPMyXld14r -juhT24CrhOzuLMhDduMDi032wDIZG4Y+K7ElU8Oufn8Sj5Wge8r6ANmmVgmFfynr -FhdYCngCgYEA3ucGJ93/Mx4q4eKRDxcWD3QzWyqpbRVRRV1Vmih9Ha/qC994nJFz -DQIdjxDIT2Rk2AGzMqFEB68Zc3O+Wcsmz5eWWzEwFxaTwOGWTyDqsDRLm3fD+QYj -nOwuxb0Kce+gWI8voWcqC9cyRm09jGzu2Ab3Bhtpg8JJ8L7gS3MRZK4CFEx4UAfY -Fmsr0W6fHB9nhS4/UXM8 ------END DSA PRIVATE KEY----- -`), - "ecdsa": []byte(`-----BEGIN EC PRIVATE KEY----- -MHcCAQEEINGWx0zo6fhJ/0EAfrPzVFyFC9s18lBt3cRoEDhS3ARooAoGCCqGSM49 -AwEHoUQDQgAEi9Hdw6KvZcWxfg2IDhA7UkpDtzzt6ZqJXSsFdLd+Kx4S3Sx4cVO+ -6/ZOXRnPmNAlLUqjShUsUBBngG0u2fqEqA== ------END EC PRIVATE KEY----- -`), - "rsa": []byte(`-----BEGIN RSA PRIVATE KEY----- -MIICXAIBAAKBgQC8A6FGHDiWCSREAXCq6yBfNVr0xCVG2CzvktFNRpue+RXrGs/2 -a6ySEJQb3IYquw7HlJgu6fg3WIWhOmHCjfpG0PrL4CRwbqQ2LaPPXhJErWYejcD8 -Di00cF3677+G10KMZk9RXbmHtuBFZT98wxg8j+ZsBMqGM1+7yrWUvynswQIDAQAB -AoGAJMCk5vqfSRzyXOTXLGIYCuR4Kj6pdsbNSeuuRGfYBeR1F2c/XdFAg7D/8s5R -38p/Ih52/Ty5S8BfJtwtvgVY9ecf/JlU/rl/QzhG8/8KC0NG7KsyXklbQ7gJT8UT -Ojmw5QpMk+rKv17ipDVkQQmPaj+gJXYNAHqImke5mm/K/h0CQQDciPmviQ+DOhOq -2ZBqUfH8oXHgFmp7/6pXw80DpMIxgV3CwkxxIVx6a8lVH9bT/AFySJ6vXq4zTuV9 -6QmZcZzDAkEA2j/UXJPIs1fQ8z/6sONOkU/BjtoePFIWJlRxdN35cZjXnBraX5UR -fFHkePv4YwqmXNqrBOvSu+w2WdSDci+IKwJAcsPRc/jWmsrJW1q3Ha0hSf/WG/Bu -X7MPuXaKpP/DkzGoUmb8ks7yqj6XWnYkPNLjCc8izU5vRwIiyWBRf4mxMwJBAILa -NDvRS0rjwt6lJGv7zPZoqDc65VfrK2aNyHx2PgFyzwrEOtuF57bu7pnvEIxpLTeM -z26i6XVMeYXAWZMTloMCQBbpGgEERQpeUknLBqUHhg/wXF6+lFA+vEGnkY+Dwab2 -KCXFGd+SQ5GdUcEMe9isUH6DYj/6/yCDoFrXXmpQb+M= ------END RSA PRIVATE KEY----- -`), - "ed25519": []byte(`-----BEGIN OPENSSH PRIVATE KEY----- -b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW -QyNTUxOQAAACA+3f7hS7g5UWwXOGVTrMfhmxyrjqz7Sxxbx7I1j8DvvwAAAJhAFfkOQBX5 -DgAAAAtzc2gtZWQyNTUxOQAAACA+3f7hS7g5UWwXOGVTrMfhmxyrjqz7Sxxbx7I1j8Dvvw -AAAEAaYmXltfW6nhRo3iWGglRB48lYq0z0Q3I3KyrdutEr6j7d/uFLuDlRbBc4ZVOsx+Gb -HKuOrPtLHFvHsjWPwO+/AAAAE2dhcnRvbm1AZ2FydG9ubS14cHMBAg== ------END OPENSSH PRIVATE KEY----- -`), - "rsa-openssh-format": []byte(`-----BEGIN OPENSSH PRIVATE KEY----- -b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAlwAAAAdzc2gtcn -NhAAAAAwEAAQAAAIEAwa48yfWFi3uIdqzuf9X7C2Zxfea/Iaaw0zIwHudpF8U92WVIiC5l -oEuW1+OaVi3UWfIEjWMV1tHGysrHOwtwc34BPCJqJknUQO/KtDTBTJ4Pryhw1bWPC999Lz -a+yrCTdNQYBzoROXKExZgPFh9pTMi5wqpHDuOQ2qZFIEI3lT0AAAIQWL0H31i9B98AAAAH -c3NoLXJzYQAAAIEAwa48yfWFi3uIdqzuf9X7C2Zxfea/Iaaw0zIwHudpF8U92WVIiC5loE -uW1+OaVi3UWfIEjWMV1tHGysrHOwtwc34BPCJqJknUQO/KtDTBTJ4Pryhw1bWPC999Lza+ -yrCTdNQYBzoROXKExZgPFh9pTMi5wqpHDuOQ2qZFIEI3lT0AAAADAQABAAAAgCThyTGsT4 -IARDxVMhWl6eiB2ZrgFgWSeJm/NOqtppWgOebsIqPMMg4UVuVFsl422/lE3RkPhVkjGXgE -pWvZAdCnmLmApK8wK12vF334lZhZT7t3Z9EzJps88PWEHo7kguf285HcnUM7FlFeissJdk -kXly34y7/3X/a6Tclm+iABAAAAQE0xR/KxZ39slwfMv64Rz7WKk1PPskaryI29aHE3mKHk -pY2QA+P3QlrKxT/VWUMjHUbNNdYfJm48xu0SGNMRdKMAAABBAORh2NP/06JUV3J9W/2Hju -X1ViJuqqcQnJPVzpgSL826EC2xwOECTqoY8uvFpUdD7CtpksIxNVqRIhuNOlz0lqEAAABB -ANkaHTTaPojClO0dKJ/Zjs7pWOCGliebBYprQ/Y4r9QLBkC/XaWMS26gFIrjgC7D2Rv+rZ -wSD0v0RcmkITP1ZR0AAAAYcHF1ZXJuYUBMdWNreUh5ZHJvLmxvY2FsAQID ------END OPENSSH PRIVATE KEY-----`), - "user": []byte(`-----BEGIN EC PRIVATE KEY----- -MHcCAQEEILYCAeq8f7V4vSSypRw7pxy8yz3V5W4qg8kSC3zJhqpQoAoGCCqGSM49 -AwEHoUQDQgAEYcO2xNKiRUYOLEHM7VYAp57HNyKbOdYtHD83Z4hzNPVC4tM5mdGD -PLL8IEwvYu2wq+lpXfGQnNMbzYf9gspG0w== ------END EC PRIVATE KEY----- -`), -} - -var PEMEncryptedKeys = []struct { - Name string - EncryptionKey string - PEMBytes []byte -}{ - 0: { - Name: "rsa-encrypted", - EncryptionKey: "r54-G0pher_t3st$", - PEMBytes: []byte(`-----BEGIN RSA PRIVATE KEY----- -Proc-Type: 4,ENCRYPTED -DEK-Info: AES-128-CBC,3E1714DE130BC5E81327F36564B05462 - -MqW88sud4fnWk/Jk3fkjh7ydu51ZkHLN5qlQgA4SkAXORPPMj2XvqZOv1v2LOgUV -dUevUn8PZK7a9zbZg4QShUSzwE5k6wdB7XKPyBgI39mJ79GBd2U4W3h6KT6jIdWA -goQpluxkrzr2/X602IaxLEre97FT9mpKC6zxKCLvyFWVIP9n3OSFS47cTTXyFr+l -7PdRhe60nn6jSBgUNk/Q1lAvEQ9fufdPwDYY93F1wyJ6lOr0F1+mzRrMbH67NyKs -rG8J1Fa7cIIre7ueKIAXTIne7OAWqpU9UDgQatDtZTbvA7ciqGsSFgiwwW13N+Rr -hN8MkODKs9cjtONxSKi05s206A3NDU6STtZ3KuPDjFE1gMJODotOuqSM+cxKfyFq -wxpk/CHYCDdMAVBSwxb/vraOHamylL4uCHpJdBHypzf2HABt+lS8Su23uAmL87DR -yvyCS/lmpuNTndef6qHPRkoW2EV3xqD3ovosGf7kgwGJUk2ZpCLVteqmYehKlZDK -r/Jy+J26ooI2jIg9bjvD1PZq+Mv+2dQ1RlDrPG3PB+rEixw6vBaL9x3jatCd4ej7 -XG7lb3qO9xFpLsx89tkEcvpGR+broSpUJ6Mu5LBCVmrvqHjvnDhrZVz1brMiQtU9 -iMZbgXqDLXHd6ERWygk7OTU03u+l1gs+KGMfmS0h0ZYw6KGVLgMnsoxqd6cFSKNB -8Ohk9ZTZGCiovlXBUepyu8wKat1k8YlHSfIHoRUJRhhcd7DrmojC+bcbMIZBU22T -Pl2ftVRGtcQY23lYd0NNKfebF7ncjuLWQGy+vZW+7cgfI6wPIbfYfP6g7QAutk6W -KQx0AoX5woZ6cNxtpIrymaVjSMRRBkKQrJKmRp3pC/lul5E5P2cueMs1fj4OHTbJ -lAUv88ywr+R+mRgYQlFW/XQ653f6DT4t6+njfO9oBcPrQDASZel3LjXLpjjYG/N5 -+BWnVexuJX9ika8HJiFl55oqaKb+WknfNhk5cPY+x7SDV9ywQeMiDZpr0ffeYAEP -LlwwiWRDYpO+uwXHSFF3+JjWwjhs8m8g99iFb7U93yKgBB12dCEPPa2ZeH9wUHMJ -sreYhNuq6f4iWWSXpzN45inQqtTi8jrJhuNLTT543ErW7DtntBO2rWMhff3aiXbn -Uy3qzZM1nPbuCGuBmP9L2dJ3Z5ifDWB4JmOyWY4swTZGt9AVmUxMIKdZpRONx8vz -I9u9nbVPGZBcou50Pa0qTLbkWsSL94MNXrARBxzhHC9Zs6XNEtwN7mOuii7uMkVc -adrxgknBH1J1N+NX/eTKzUwJuPvDtA+Z5ILWNN9wpZT/7ed8zEnKHPNUexyeT5g3 -uw9z9jH7ffGxFYlx87oiVPHGOrCXYZYW5uoZE31SCBkbtNuffNRJRKIFeipmpJ3P -7bpAG+kGHMelQH6b+5K1Qgsv4tpuSyKeTKpPFH9Av5nN4P1ZBm9N80tzbNWqjSJm -S7rYdHnuNEVnUGnRmEUMmVuYZnNBEVN/fP2m2SEwXcP3Uh7TiYlcWw10ygaGmOr7 -MvMLGkYgQ4Utwnd98mtqa0jr0hK2TcOSFir3AqVvXN3XJj4cVULkrXe4Im1laWgp ------END RSA PRIVATE KEY----- -`), - }, - - 1: { - Name: "dsa-encrypted", - EncryptionKey: "qG0pher-dsa_t3st$", - PEMBytes: []byte(`-----BEGIN DSA PRIVATE KEY----- -Proc-Type: 4,ENCRYPTED -DEK-Info: AES-128-CBC,7CE7A6E4A647DC01AF860210B15ADE3E - -hvnBpI99Hceq/55pYRdOzBLntIEis02JFNXuLEydWL+RJBFDn7tA+vXec0ERJd6J -G8JXlSOAhmC2H4uK3q2xR8/Y3yL95n6OIcjvCBiLsV+o3jj1MYJmErxP6zRtq4w3 -JjIjGHWmaYFSxPKQ6e8fs74HEqaeMV9ONUoTtB+aISmgaBL15Fcoayg245dkBvVl -h5Kqspe7yvOBmzA3zjRuxmSCqKJmasXM7mqs3vIrMxZE3XPo1/fWKcPuExgpVQoT -HkJZEoIEIIPnPMwT2uYbFJSGgPJVMDT84xz7yvjCdhLmqrsXgs5Qw7Pw0i0c0BUJ -b7fDJ2UhdiwSckWGmIhTLlJZzr8K+JpjCDlP+REYBI5meB7kosBnlvCEHdw2EJkH -0QDc/2F4xlVrHOLbPRFyu1Oi2Gvbeoo9EsM/DThpd1hKAlb0sF5Y0y0d+owv0PnE -R/4X3HWfIdOHsDUvJ8xVWZ4BZk9Zk9qol045DcFCehpr/3hslCrKSZHakLt9GI58 -vVQJ4L0aYp5nloLfzhViZtKJXRLkySMKdzYkIlNmW1oVGl7tce5UCNI8Nok4j6yn -IiHM7GBn+0nJoKTXsOGMIBe3ulKlKVxLjEuk9yivh/8= ------END DSA PRIVATE KEY----- -`), - }, -} diff --git a/vendor/golang.org/x/crypto/ssh/testdata_test.go b/vendor/golang.org/x/crypto/ssh/testdata_test.go deleted file mode 100644 index 2da8c79dc..000000000 --- a/vendor/golang.org/x/crypto/ssh/testdata_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// IMPLEMENTATION NOTE: To avoid a package loop, this file is in three places: -// ssh/, ssh/agent, and ssh/test/. It should be kept in sync across all three -// instances. - -package ssh - -import ( - "crypto/rand" - "fmt" - - "golang.org/x/crypto/ssh/testdata" -) - -var ( - testPrivateKeys map[string]interface{} - testSigners map[string]Signer - testPublicKeys map[string]PublicKey -) - -func init() { - var err error - - n := len(testdata.PEMBytes) - testPrivateKeys = make(map[string]interface{}, n) - testSigners = make(map[string]Signer, n) - testPublicKeys = make(map[string]PublicKey, n) - for t, k := range testdata.PEMBytes { - testPrivateKeys[t], err = ParseRawPrivateKey(k) - if err != nil { - panic(fmt.Sprintf("Unable to parse test key %s: %v", t, err)) - } - testSigners[t], err = NewSignerFromKey(testPrivateKeys[t]) - if err != nil { - panic(fmt.Sprintf("Unable to create signer for test key %s: %v", t, err)) - } - testPublicKeys[t] = testSigners[t].PublicKey() - } - - // Create a cert and sign it for use in tests. - testCert := &Certificate{ - Nonce: []byte{}, // To pass reflect.DeepEqual after marshal & parse, this must be non-nil - ValidPrincipals: []string{"gopher1", "gopher2"}, // increases test coverage - ValidAfter: 0, // unix epoch - ValidBefore: CertTimeInfinity, // The end of currently representable time. - Reserved: []byte{}, // To pass reflect.DeepEqual after marshal & parse, this must be non-nil - Key: testPublicKeys["ecdsa"], - SignatureKey: testPublicKeys["rsa"], - Permissions: Permissions{ - CriticalOptions: map[string]string{}, - Extensions: map[string]string{}, - }, - } - testCert.SignCert(rand.Reader, testSigners["rsa"]) - testPrivateKeys["cert"] = testPrivateKeys["ecdsa"] - testSigners["cert"], err = NewCertSigner(testCert, testSigners["ecdsa"]) - if err != nil { - panic(fmt.Sprintf("Unable to create certificate signer: %v", err)) - } -} diff --git a/vendor/golang.org/x/crypto/ssh/transport.go b/vendor/golang.org/x/crypto/ssh/transport.go deleted file mode 100644 index f9780e0ae..000000000 --- a/vendor/golang.org/x/crypto/ssh/transport.go +++ /dev/null @@ -1,375 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssh - -import ( - "bufio" - "errors" - "io" - "log" -) - -// debugTransport if set, will print packet types as they go over the -// wire. No message decoding is done, to minimize the impact on timing. -const debugTransport = false - -const ( - gcmCipherID = "aes128-gcm@openssh.com" - aes128cbcID = "aes128-cbc" - tripledescbcID = "3des-cbc" -) - -// packetConn represents a transport that implements packet based -// operations. -type packetConn interface { - // Encrypt and send a packet of data to the remote peer. - writePacket(packet []byte) error - - // Read a packet from the connection. The read is blocking, - // i.e. if error is nil, then the returned byte slice is - // always non-empty. - readPacket() ([]byte, error) - - // Close closes the write-side of the connection. - Close() error -} - -// transport is the keyingTransport that implements the SSH packet -// protocol. -type transport struct { - reader connectionState - writer connectionState - - bufReader *bufio.Reader - bufWriter *bufio.Writer - rand io.Reader - isClient bool - io.Closer -} - -// packetCipher represents a combination of SSH encryption/MAC -// protocol. A single instance should be used for one direction only. -type packetCipher interface { - // writePacket encrypts the packet and writes it to w. The - // contents of the packet are generally scrambled. - writePacket(seqnum uint32, w io.Writer, rand io.Reader, packet []byte) error - - // readPacket reads and decrypts a packet of data. The - // returned packet may be overwritten by future calls of - // readPacket. - readPacket(seqnum uint32, r io.Reader) ([]byte, error) -} - -// connectionState represents one side (read or write) of the -// connection. This is necessary because each direction has its own -// keys, and can even have its own algorithms -type connectionState struct { - packetCipher - seqNum uint32 - dir direction - pendingKeyChange chan packetCipher -} - -// prepareKeyChange sets up key material for a keychange. The key changes in -// both directions are triggered by reading and writing a msgNewKey packet -// respectively. -func (t *transport) prepareKeyChange(algs *algorithms, kexResult *kexResult) error { - if ciph, err := newPacketCipher(t.reader.dir, algs.r, kexResult); err != nil { - return err - } else { - t.reader.pendingKeyChange <- ciph - } - - if ciph, err := newPacketCipher(t.writer.dir, algs.w, kexResult); err != nil { - return err - } else { - t.writer.pendingKeyChange <- ciph - } - - return nil -} - -func (t *transport) printPacket(p []byte, write bool) { - if len(p) == 0 { - return - } - who := "server" - if t.isClient { - who = "client" - } - what := "read" - if write { - what = "write" - } - - log.Println(what, who, p[0]) -} - -// Read and decrypt next packet. -func (t *transport) readPacket() (p []byte, err error) { - for { - p, err = t.reader.readPacket(t.bufReader) - if err != nil { - break - } - if len(p) == 0 || (p[0] != msgIgnore && p[0] != msgDebug) { - break - } - } - if debugTransport { - t.printPacket(p, false) - } - - return p, err -} - -func (s *connectionState) readPacket(r *bufio.Reader) ([]byte, error) { - packet, err := s.packetCipher.readPacket(s.seqNum, r) - s.seqNum++ - if err == nil && len(packet) == 0 { - err = errors.New("ssh: zero length packet") - } - - if len(packet) > 0 { - switch packet[0] { - case msgNewKeys: - select { - case cipher := <-s.pendingKeyChange: - s.packetCipher = cipher - default: - return nil, errors.New("ssh: got bogus newkeys message.") - } - - case msgDisconnect: - // Transform a disconnect message into an - // error. Since this is lowest level at which - // we interpret message types, doing it here - // ensures that we don't have to handle it - // elsewhere. - var msg disconnectMsg - if err := Unmarshal(packet, &msg); err != nil { - return nil, err - } - return nil, &msg - } - } - - // The packet may point to an internal buffer, so copy the - // packet out here. - fresh := make([]byte, len(packet)) - copy(fresh, packet) - - return fresh, err -} - -func (t *transport) writePacket(packet []byte) error { - if debugTransport { - t.printPacket(packet, true) - } - return t.writer.writePacket(t.bufWriter, t.rand, packet) -} - -func (s *connectionState) writePacket(w *bufio.Writer, rand io.Reader, packet []byte) error { - changeKeys := len(packet) > 0 && packet[0] == msgNewKeys - - err := s.packetCipher.writePacket(s.seqNum, w, rand, packet) - if err != nil { - return err - } - if err = w.Flush(); err != nil { - return err - } - s.seqNum++ - if changeKeys { - select { - case cipher := <-s.pendingKeyChange: - s.packetCipher = cipher - default: - panic("ssh: no key material for msgNewKeys") - } - } - return err -} - -func newTransport(rwc io.ReadWriteCloser, rand io.Reader, isClient bool) *transport { - t := &transport{ - bufReader: bufio.NewReader(rwc), - bufWriter: bufio.NewWriter(rwc), - rand: rand, - reader: connectionState{ - packetCipher: &streamPacketCipher{cipher: noneCipher{}}, - pendingKeyChange: make(chan packetCipher, 1), - }, - writer: connectionState{ - packetCipher: &streamPacketCipher{cipher: noneCipher{}}, - pendingKeyChange: make(chan packetCipher, 1), - }, - Closer: rwc, - } - t.isClient = isClient - - if isClient { - t.reader.dir = serverKeys - t.writer.dir = clientKeys - } else { - t.reader.dir = clientKeys - t.writer.dir = serverKeys - } - - return t -} - -type direction struct { - ivTag []byte - keyTag []byte - macKeyTag []byte -} - -var ( - serverKeys = direction{[]byte{'B'}, []byte{'D'}, []byte{'F'}} - clientKeys = direction{[]byte{'A'}, []byte{'C'}, []byte{'E'}} -) - -// generateKeys generates key material for IV, MAC and encryption. -func generateKeys(d direction, algs directionAlgorithms, kex *kexResult) (iv, key, macKey []byte) { - cipherMode := cipherModes[algs.Cipher] - macMode := macModes[algs.MAC] - - iv = make([]byte, cipherMode.ivSize) - key = make([]byte, cipherMode.keySize) - macKey = make([]byte, macMode.keySize) - - generateKeyMaterial(iv, d.ivTag, kex) - generateKeyMaterial(key, d.keyTag, kex) - generateKeyMaterial(macKey, d.macKeyTag, kex) - return -} - -// setupKeys sets the cipher and MAC keys from kex.K, kex.H and sessionId, as -// described in RFC 4253, section 6.4. direction should either be serverKeys -// (to setup server->client keys) or clientKeys (for client->server keys). -func newPacketCipher(d direction, algs directionAlgorithms, kex *kexResult) (packetCipher, error) { - iv, key, macKey := generateKeys(d, algs, kex) - - if algs.Cipher == gcmCipherID { - return newGCMCipher(iv, key, macKey) - } - - if algs.Cipher == aes128cbcID { - return newAESCBCCipher(iv, key, macKey, algs) - } - - if algs.Cipher == tripledescbcID { - return newTripleDESCBCCipher(iv, key, macKey, algs) - } - - c := &streamPacketCipher{ - mac: macModes[algs.MAC].new(macKey), - etm: macModes[algs.MAC].etm, - } - c.macResult = make([]byte, c.mac.Size()) - - var err error - c.cipher, err = cipherModes[algs.Cipher].createStream(key, iv) - if err != nil { - return nil, err - } - - return c, nil -} - -// generateKeyMaterial fills out with key material generated from tag, K, H -// and sessionId, as specified in RFC 4253, section 7.2. -func generateKeyMaterial(out, tag []byte, r *kexResult) { - var digestsSoFar []byte - - h := r.Hash.New() - for len(out) > 0 { - h.Reset() - h.Write(r.K) - h.Write(r.H) - - if len(digestsSoFar) == 0 { - h.Write(tag) - h.Write(r.SessionID) - } else { - h.Write(digestsSoFar) - } - - digest := h.Sum(nil) - n := copy(out, digest) - out = out[n:] - if len(out) > 0 { - digestsSoFar = append(digestsSoFar, digest...) - } - } -} - -const packageVersion = "SSH-2.0-Go" - -// Sends and receives a version line. The versionLine string should -// be US ASCII, start with "SSH-2.0-", and should not include a -// newline. exchangeVersions returns the other side's version line. -func exchangeVersions(rw io.ReadWriter, versionLine []byte) (them []byte, err error) { - // Contrary to the RFC, we do not ignore lines that don't - // start with "SSH-2.0-" to make the library usable with - // nonconforming servers. - for _, c := range versionLine { - // The spec disallows non US-ASCII chars, and - // specifically forbids null chars. - if c < 32 { - return nil, errors.New("ssh: junk character in version line") - } - } - if _, err = rw.Write(append(versionLine, '\r', '\n')); err != nil { - return - } - - them, err = readVersion(rw) - return them, err -} - -// maxVersionStringBytes is the maximum number of bytes that we'll -// accept as a version string. RFC 4253 section 4.2 limits this at 255 -// chars -const maxVersionStringBytes = 255 - -// Read version string as specified by RFC 4253, section 4.2. -func readVersion(r io.Reader) ([]byte, error) { - versionString := make([]byte, 0, 64) - var ok bool - var buf [1]byte - - for len(versionString) < maxVersionStringBytes { - _, err := io.ReadFull(r, buf[:]) - if err != nil { - return nil, err - } - // The RFC says that the version should be terminated with \r\n - // but several SSH servers actually only send a \n. - if buf[0] == '\n' { - ok = true - break - } - - // non ASCII chars are disallowed, but we are lenient, - // since Go doesn't use null-terminated strings. - - // The RFC allows a comment after a space, however, - // all of it (version and comments) goes into the - // session hash. - versionString = append(versionString, buf[0]) - } - - if !ok { - return nil, errors.New("ssh: overflow reading version string") - } - - // There might be a '\r' on the end which we should remove. - if len(versionString) > 0 && versionString[len(versionString)-1] == '\r' { - versionString = versionString[:len(versionString)-1] - } - return versionString, nil -} diff --git a/vendor/golang.org/x/crypto/ssh/transport_test.go b/vendor/golang.org/x/crypto/ssh/transport_test.go deleted file mode 100644 index 92d83abf9..000000000 --- a/vendor/golang.org/x/crypto/ssh/transport_test.go +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssh - -import ( - "bytes" - "crypto/rand" - "encoding/binary" - "strings" - "testing" -) - -func TestReadVersion(t *testing.T) { - longversion := strings.Repeat("SSH-2.0-bla", 50)[:253] - cases := map[string]string{ - "SSH-2.0-bla\r\n": "SSH-2.0-bla", - "SSH-2.0-bla\n": "SSH-2.0-bla", - longversion + "\r\n": longversion, - } - - for in, want := range cases { - result, err := readVersion(bytes.NewBufferString(in)) - if err != nil { - t.Errorf("readVersion(%q): %s", in, err) - } - got := string(result) - if got != want { - t.Errorf("got %q, want %q", got, want) - } - } -} - -func TestReadVersionError(t *testing.T) { - longversion := strings.Repeat("SSH-2.0-bla", 50)[:253] - cases := []string{ - longversion + "too-long\r\n", - } - for _, in := range cases { - if _, err := readVersion(bytes.NewBufferString(in)); err == nil { - t.Errorf("readVersion(%q) should have failed", in) - } - } -} - -func TestExchangeVersionsBasic(t *testing.T) { - v := "SSH-2.0-bla" - buf := bytes.NewBufferString(v + "\r\n") - them, err := exchangeVersions(buf, []byte("xyz")) - if err != nil { - t.Errorf("exchangeVersions: %v", err) - } - - if want := "SSH-2.0-bla"; string(them) != want { - t.Errorf("got %q want %q for our version", them, want) - } -} - -func TestExchangeVersions(t *testing.T) { - cases := []string{ - "not\x000allowed", - "not allowed\n", - } - for _, c := range cases { - buf := bytes.NewBufferString("SSH-2.0-bla\r\n") - if _, err := exchangeVersions(buf, []byte(c)); err == nil { - t.Errorf("exchangeVersions(%q): should have failed", c) - } - } -} - -type closerBuffer struct { - bytes.Buffer -} - -func (b *closerBuffer) Close() error { - return nil -} - -func TestTransportMaxPacketWrite(t *testing.T) { - buf := &closerBuffer{} - tr := newTransport(buf, rand.Reader, true) - huge := make([]byte, maxPacket+1) - err := tr.writePacket(huge) - if err == nil { - t.Errorf("transport accepted write for a huge packet.") - } -} - -func TestTransportMaxPacketReader(t *testing.T) { - var header [5]byte - huge := make([]byte, maxPacket+128) - binary.BigEndian.PutUint32(header[0:], uint32(len(huge))) - // padding. - header[4] = 0 - - buf := &closerBuffer{} - buf.Write(header[:]) - buf.Write(huge) - - tr := newTransport(buf, rand.Reader, true) - _, err := tr.readPacket() - if err == nil { - t.Errorf("transport succeeded reading huge packet.") - } else if !strings.Contains(err.Error(), "large") { - t.Errorf("got %q, should mention %q", err.Error(), "large") - } -} diff --git a/vendor/golang.org/x/crypto/tea/cipher.go b/vendor/golang.org/x/crypto/tea/cipher.go deleted file mode 100644 index 9c13d12a2..000000000 --- a/vendor/golang.org/x/crypto/tea/cipher.go +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package tea implements the TEA algorithm, as defined in Needham and -// Wheeler's 1994 technical report, “TEA, a Tiny Encryption Algorithm”. See -// http://www.cix.co.uk/~klockstone/tea.pdf for details. - -package tea - -import ( - "crypto/cipher" - "encoding/binary" - "errors" -) - -const ( - // BlockSize is the size of a TEA block, in bytes. - BlockSize = 8 - - // KeySize is the size of a TEA key, in bytes. - KeySize = 16 - - // delta is the TEA key schedule constant. - delta = 0x9e3779b9 - - // numRounds is the standard number of rounds in TEA. - numRounds = 64 -) - -// tea is an instance of the TEA cipher with a particular key. -type tea struct { - key [16]byte - rounds int -} - -// NewCipher returns an instance of the TEA cipher with the standard number of -// rounds. The key argument must be 16 bytes long. -func NewCipher(key []byte) (cipher.Block, error) { - return NewCipherWithRounds(key, numRounds) -} - -// NewCipherWithRounds returns an instance of the TEA cipher with a given -// number of rounds, which must be even. The key argument must be 16 bytes -// long. -func NewCipherWithRounds(key []byte, rounds int) (cipher.Block, error) { - if len(key) != 16 { - return nil, errors.New("tea: incorrect key size") - } - - if rounds&1 != 0 { - return nil, errors.New("tea: odd number of rounds specified") - } - - c := &tea{ - rounds: rounds, - } - copy(c.key[:], key) - - return c, nil -} - -// BlockSize returns the TEA block size, which is eight bytes. It is necessary -// to satisfy the Block interface in the package "crypto/cipher". -func (*tea) BlockSize() int { - return BlockSize -} - -// Encrypt encrypts the 8 byte buffer src using the key in t and stores the -// result in dst. Note that for amounts of data larger than a block, it is not -// safe to just call Encrypt on successive blocks; instead, use an encryption -// mode like CBC (see crypto/cipher/cbc.go). -func (t *tea) Encrypt(dst, src []byte) { - e := binary.BigEndian - v0, v1 := e.Uint32(src), e.Uint32(src[4:]) - k0, k1, k2, k3 := e.Uint32(t.key[0:]), e.Uint32(t.key[4:]), e.Uint32(t.key[8:]), e.Uint32(t.key[12:]) - - sum := uint32(0) - delta := uint32(delta) - - for i := 0; i < t.rounds/2; i++ { - sum += delta - v0 += ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1) - v1 += ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3) - } - - e.PutUint32(dst, v0) - e.PutUint32(dst[4:], v1) -} - -// Decrypt decrypts the 8 byte buffer src using the key in t and stores the -// result in dst. -func (t *tea) Decrypt(dst, src []byte) { - e := binary.BigEndian - v0, v1 := e.Uint32(src), e.Uint32(src[4:]) - k0, k1, k2, k3 := e.Uint32(t.key[0:]), e.Uint32(t.key[4:]), e.Uint32(t.key[8:]), e.Uint32(t.key[12:]) - - delta := uint32(delta) - sum := delta * uint32(t.rounds/2) // in general, sum = delta * n - - for i := 0; i < t.rounds/2; i++ { - v1 -= ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3) - v0 -= ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1) - sum -= delta - } - - e.PutUint32(dst, v0) - e.PutUint32(dst[4:], v1) -} diff --git a/vendor/golang.org/x/crypto/tea/tea_test.go b/vendor/golang.org/x/crypto/tea/tea_test.go deleted file mode 100644 index eb98d1e0e..000000000 --- a/vendor/golang.org/x/crypto/tea/tea_test.go +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package tea - -import ( - "bytes" - "testing" -) - -// A sample test key for when we just want to initialize a cipher -var testKey = []byte{0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF} - -// Test that the block size for tea is correct -func TestBlocksize(t *testing.T) { - c, err := NewCipher(testKey) - if err != nil { - t.Fatalf("NewCipher returned error: %s", err) - } - - if result := c.BlockSize(); result != BlockSize { - t.Errorf("cipher.BlockSize returned %d, but expected %d", result, BlockSize) - } -} - -// Test that invalid key sizes return an error -func TestInvalidKeySize(t *testing.T) { - var key [KeySize + 1]byte - - if _, err := NewCipher(key[:]); err == nil { - t.Errorf("invalid key size %d didn't result in an error.", len(key)) - } - - if _, err := NewCipher(key[:KeySize-1]); err == nil { - t.Errorf("invalid key size %d didn't result in an error.", KeySize-1) - } -} - -// Test Vectors -type teaTest struct { - rounds int - key []byte - plaintext []byte - ciphertext []byte -} - -var teaTests = []teaTest{ - // These were sourced from https://github.com/froydnj/ironclad/blob/master/testing/test-vectors/tea.testvec - { - numRounds, - []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - []byte{0x41, 0xea, 0x3a, 0x0a, 0x94, 0xba, 0xa9, 0x40}, - }, - { - numRounds, - []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, - []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, - []byte{0x31, 0x9b, 0xbe, 0xfb, 0x01, 0x6a, 0xbd, 0xb2}, - }, - { - 16, - []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - []byte{0xed, 0x28, 0x5d, 0xa1, 0x45, 0x5b, 0x33, 0xc1}, - }, -} - -// Test encryption -func TestCipherEncrypt(t *testing.T) { - // Test encryption with standard 64 rounds - for i, test := range teaTests { - c, err := NewCipherWithRounds(test.key, test.rounds) - if err != nil { - t.Fatalf("#%d: NewCipher returned error: %s", i, err) - } - - var ciphertext [BlockSize]byte - c.Encrypt(ciphertext[:], test.plaintext) - - if !bytes.Equal(ciphertext[:], test.ciphertext) { - t.Errorf("#%d: incorrect ciphertext. Got %x, wanted %x", i, ciphertext, test.ciphertext) - } - - var plaintext2 [BlockSize]byte - c.Decrypt(plaintext2[:], ciphertext[:]) - - if !bytes.Equal(plaintext2[:], test.plaintext) { - t.Errorf("#%d: incorrect plaintext. Got %x, wanted %x", i, plaintext2, test.plaintext) - } - } -} diff --git a/vendor/golang.org/x/crypto/twofish/twofish.go b/vendor/golang.org/x/crypto/twofish/twofish.go deleted file mode 100644 index 376fa0ec2..000000000 --- a/vendor/golang.org/x/crypto/twofish/twofish.go +++ /dev/null @@ -1,342 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package twofish implements Bruce Schneier's Twofish encryption algorithm. -package twofish // import "golang.org/x/crypto/twofish" - -// Twofish is defined in http://www.schneier.com/paper-twofish-paper.pdf [TWOFISH] - -// This code is a port of the LibTom C implementation. -// See http://libtom.org/?page=features&newsitems=5&whatfile=crypt. -// LibTomCrypt is free for all purposes under the public domain. -// It was heavily inspired by the go blowfish package. - -import "strconv" - -// BlockSize is the constant block size of Twofish. -const BlockSize = 16 - -const mdsPolynomial = 0x169 // x^8 + x^6 + x^5 + x^3 + 1, see [TWOFISH] 4.2 -const rsPolynomial = 0x14d // x^8 + x^6 + x^3 + x^2 + 1, see [TWOFISH] 4.3 - -// A Cipher is an instance of Twofish encryption using a particular key. -type Cipher struct { - s [4][256]uint32 - k [40]uint32 -} - -type KeySizeError int - -func (k KeySizeError) Error() string { - return "crypto/twofish: invalid key size " + strconv.Itoa(int(k)) -} - -// NewCipher creates and returns a Cipher. -// The key argument should be the Twofish key, 16, 24 or 32 bytes. -func NewCipher(key []byte) (*Cipher, error) { - keylen := len(key) - - if keylen != 16 && keylen != 24 && keylen != 32 { - return nil, KeySizeError(keylen) - } - - // k is the number of 64 bit words in key - k := keylen / 8 - - // Create the S[..] words - var S [4 * 4]byte - for i := 0; i < k; i++ { - // Computes [y0 y1 y2 y3] = rs . [x0 x1 x2 x3 x4 x5 x6 x7] - for j, rsRow := range rs { - for k, rsVal := range rsRow { - S[4*i+j] ^= gfMult(key[8*i+k], rsVal, rsPolynomial) - } - } - } - - // Calculate subkeys - c := new(Cipher) - var tmp [4]byte - for i := byte(0); i < 20; i++ { - // A = h(p * 2x, Me) - for j := range tmp { - tmp[j] = 2 * i - } - A := h(tmp[:], key, 0) - - // B = rolc(h(p * (2x + 1), Mo), 8) - for j := range tmp { - tmp[j] = 2*i + 1 - } - B := h(tmp[:], key, 1) - B = rol(B, 8) - - c.k[2*i] = A + B - - // K[2i+1] = (A + 2B) <<< 9 - c.k[2*i+1] = rol(2*B+A, 9) - } - - // Calculate sboxes - switch k { - case 2: - for i := range c.s[0] { - c.s[0][i] = mdsColumnMult(sbox[1][sbox[0][sbox[0][byte(i)]^S[0]]^S[4]], 0) - c.s[1][i] = mdsColumnMult(sbox[0][sbox[0][sbox[1][byte(i)]^S[1]]^S[5]], 1) - c.s[2][i] = mdsColumnMult(sbox[1][sbox[1][sbox[0][byte(i)]^S[2]]^S[6]], 2) - c.s[3][i] = mdsColumnMult(sbox[0][sbox[1][sbox[1][byte(i)]^S[3]]^S[7]], 3) - } - case 3: - for i := range c.s[0] { - c.s[0][i] = mdsColumnMult(sbox[1][sbox[0][sbox[0][sbox[1][byte(i)]^S[0]]^S[4]]^S[8]], 0) - c.s[1][i] = mdsColumnMult(sbox[0][sbox[0][sbox[1][sbox[1][byte(i)]^S[1]]^S[5]]^S[9]], 1) - c.s[2][i] = mdsColumnMult(sbox[1][sbox[1][sbox[0][sbox[0][byte(i)]^S[2]]^S[6]]^S[10]], 2) - c.s[3][i] = mdsColumnMult(sbox[0][sbox[1][sbox[1][sbox[0][byte(i)]^S[3]]^S[7]]^S[11]], 3) - } - default: - for i := range c.s[0] { - c.s[0][i] = mdsColumnMult(sbox[1][sbox[0][sbox[0][sbox[1][sbox[1][byte(i)]^S[0]]^S[4]]^S[8]]^S[12]], 0) - c.s[1][i] = mdsColumnMult(sbox[0][sbox[0][sbox[1][sbox[1][sbox[0][byte(i)]^S[1]]^S[5]]^S[9]]^S[13]], 1) - c.s[2][i] = mdsColumnMult(sbox[1][sbox[1][sbox[0][sbox[0][sbox[0][byte(i)]^S[2]]^S[6]]^S[10]]^S[14]], 2) - c.s[3][i] = mdsColumnMult(sbox[0][sbox[1][sbox[1][sbox[0][sbox[1][byte(i)]^S[3]]^S[7]]^S[11]]^S[15]], 3) - } - } - - return c, nil -} - -// BlockSize returns the Twofish block size, 16 bytes. -func (c *Cipher) BlockSize() int { return BlockSize } - -// store32l stores src in dst in little-endian form. -func store32l(dst []byte, src uint32) { - dst[0] = byte(src) - dst[1] = byte(src >> 8) - dst[2] = byte(src >> 16) - dst[3] = byte(src >> 24) - return -} - -// load32l reads a little-endian uint32 from src. -func load32l(src []byte) uint32 { - return uint32(src[0]) | uint32(src[1])<<8 | uint32(src[2])<<16 | uint32(src[3])<<24 -} - -// rol returns x after a left circular rotation of y bits. -func rol(x, y uint32) uint32 { - return (x << (y & 31)) | (x >> (32 - (y & 31))) -} - -// ror returns x after a right circular rotation of y bits. -func ror(x, y uint32) uint32 { - return (x >> (y & 31)) | (x << (32 - (y & 31))) -} - -// The RS matrix. See [TWOFISH] 4.3 -var rs = [4][8]byte{ - {0x01, 0xA4, 0x55, 0x87, 0x5A, 0x58, 0xDB, 0x9E}, - {0xA4, 0x56, 0x82, 0xF3, 0x1E, 0xC6, 0x68, 0xE5}, - {0x02, 0xA1, 0xFC, 0xC1, 0x47, 0xAE, 0x3D, 0x19}, - {0xA4, 0x55, 0x87, 0x5A, 0x58, 0xDB, 0x9E, 0x03}, -} - -// sbox tables -var sbox = [2][256]byte{ - { - 0xa9, 0x67, 0xb3, 0xe8, 0x04, 0xfd, 0xa3, 0x76, 0x9a, 0x92, 0x80, 0x78, 0xe4, 0xdd, 0xd1, 0x38, - 0x0d, 0xc6, 0x35, 0x98, 0x18, 0xf7, 0xec, 0x6c, 0x43, 0x75, 0x37, 0x26, 0xfa, 0x13, 0x94, 0x48, - 0xf2, 0xd0, 0x8b, 0x30, 0x84, 0x54, 0xdf, 0x23, 0x19, 0x5b, 0x3d, 0x59, 0xf3, 0xae, 0xa2, 0x82, - 0x63, 0x01, 0x83, 0x2e, 0xd9, 0x51, 0x9b, 0x7c, 0xa6, 0xeb, 0xa5, 0xbe, 0x16, 0x0c, 0xe3, 0x61, - 0xc0, 0x8c, 0x3a, 0xf5, 0x73, 0x2c, 0x25, 0x0b, 0xbb, 0x4e, 0x89, 0x6b, 0x53, 0x6a, 0xb4, 0xf1, - 0xe1, 0xe6, 0xbd, 0x45, 0xe2, 0xf4, 0xb6, 0x66, 0xcc, 0x95, 0x03, 0x56, 0xd4, 0x1c, 0x1e, 0xd7, - 0xfb, 0xc3, 0x8e, 0xb5, 0xe9, 0xcf, 0xbf, 0xba, 0xea, 0x77, 0x39, 0xaf, 0x33, 0xc9, 0x62, 0x71, - 0x81, 0x79, 0x09, 0xad, 0x24, 0xcd, 0xf9, 0xd8, 0xe5, 0xc5, 0xb9, 0x4d, 0x44, 0x08, 0x86, 0xe7, - 0xa1, 0x1d, 0xaa, 0xed, 0x06, 0x70, 0xb2, 0xd2, 0x41, 0x7b, 0xa0, 0x11, 0x31, 0xc2, 0x27, 0x90, - 0x20, 0xf6, 0x60, 0xff, 0x96, 0x5c, 0xb1, 0xab, 0x9e, 0x9c, 0x52, 0x1b, 0x5f, 0x93, 0x0a, 0xef, - 0x91, 0x85, 0x49, 0xee, 0x2d, 0x4f, 0x8f, 0x3b, 0x47, 0x87, 0x6d, 0x46, 0xd6, 0x3e, 0x69, 0x64, - 0x2a, 0xce, 0xcb, 0x2f, 0xfc, 0x97, 0x05, 0x7a, 0xac, 0x7f, 0xd5, 0x1a, 0x4b, 0x0e, 0xa7, 0x5a, - 0x28, 0x14, 0x3f, 0x29, 0x88, 0x3c, 0x4c, 0x02, 0xb8, 0xda, 0xb0, 0x17, 0x55, 0x1f, 0x8a, 0x7d, - 0x57, 0xc7, 0x8d, 0x74, 0xb7, 0xc4, 0x9f, 0x72, 0x7e, 0x15, 0x22, 0x12, 0x58, 0x07, 0x99, 0x34, - 0x6e, 0x50, 0xde, 0x68, 0x65, 0xbc, 0xdb, 0xf8, 0xc8, 0xa8, 0x2b, 0x40, 0xdc, 0xfe, 0x32, 0xa4, - 0xca, 0x10, 0x21, 0xf0, 0xd3, 0x5d, 0x0f, 0x00, 0x6f, 0x9d, 0x36, 0x42, 0x4a, 0x5e, 0xc1, 0xe0, - }, - { - 0x75, 0xf3, 0xc6, 0xf4, 0xdb, 0x7b, 0xfb, 0xc8, 0x4a, 0xd3, 0xe6, 0x6b, 0x45, 0x7d, 0xe8, 0x4b, - 0xd6, 0x32, 0xd8, 0xfd, 0x37, 0x71, 0xf1, 0xe1, 0x30, 0x0f, 0xf8, 0x1b, 0x87, 0xfa, 0x06, 0x3f, - 0x5e, 0xba, 0xae, 0x5b, 0x8a, 0x00, 0xbc, 0x9d, 0x6d, 0xc1, 0xb1, 0x0e, 0x80, 0x5d, 0xd2, 0xd5, - 0xa0, 0x84, 0x07, 0x14, 0xb5, 0x90, 0x2c, 0xa3, 0xb2, 0x73, 0x4c, 0x54, 0x92, 0x74, 0x36, 0x51, - 0x38, 0xb0, 0xbd, 0x5a, 0xfc, 0x60, 0x62, 0x96, 0x6c, 0x42, 0xf7, 0x10, 0x7c, 0x28, 0x27, 0x8c, - 0x13, 0x95, 0x9c, 0xc7, 0x24, 0x46, 0x3b, 0x70, 0xca, 0xe3, 0x85, 0xcb, 0x11, 0xd0, 0x93, 0xb8, - 0xa6, 0x83, 0x20, 0xff, 0x9f, 0x77, 0xc3, 0xcc, 0x03, 0x6f, 0x08, 0xbf, 0x40, 0xe7, 0x2b, 0xe2, - 0x79, 0x0c, 0xaa, 0x82, 0x41, 0x3a, 0xea, 0xb9, 0xe4, 0x9a, 0xa4, 0x97, 0x7e, 0xda, 0x7a, 0x17, - 0x66, 0x94, 0xa1, 0x1d, 0x3d, 0xf0, 0xde, 0xb3, 0x0b, 0x72, 0xa7, 0x1c, 0xef, 0xd1, 0x53, 0x3e, - 0x8f, 0x33, 0x26, 0x5f, 0xec, 0x76, 0x2a, 0x49, 0x81, 0x88, 0xee, 0x21, 0xc4, 0x1a, 0xeb, 0xd9, - 0xc5, 0x39, 0x99, 0xcd, 0xad, 0x31, 0x8b, 0x01, 0x18, 0x23, 0xdd, 0x1f, 0x4e, 0x2d, 0xf9, 0x48, - 0x4f, 0xf2, 0x65, 0x8e, 0x78, 0x5c, 0x58, 0x19, 0x8d, 0xe5, 0x98, 0x57, 0x67, 0x7f, 0x05, 0x64, - 0xaf, 0x63, 0xb6, 0xfe, 0xf5, 0xb7, 0x3c, 0xa5, 0xce, 0xe9, 0x68, 0x44, 0xe0, 0x4d, 0x43, 0x69, - 0x29, 0x2e, 0xac, 0x15, 0x59, 0xa8, 0x0a, 0x9e, 0x6e, 0x47, 0xdf, 0x34, 0x35, 0x6a, 0xcf, 0xdc, - 0x22, 0xc9, 0xc0, 0x9b, 0x89, 0xd4, 0xed, 0xab, 0x12, 0xa2, 0x0d, 0x52, 0xbb, 0x02, 0x2f, 0xa9, - 0xd7, 0x61, 0x1e, 0xb4, 0x50, 0x04, 0xf6, 0xc2, 0x16, 0x25, 0x86, 0x56, 0x55, 0x09, 0xbe, 0x91, - }, -} - -// gfMult returns a·b in GF(2^8)/p -func gfMult(a, b byte, p uint32) byte { - B := [2]uint32{0, uint32(b)} - P := [2]uint32{0, p} - var result uint32 - - // branchless GF multiplier - for i := 0; i < 7; i++ { - result ^= B[a&1] - a >>= 1 - B[1] = P[B[1]>>7] ^ (B[1] << 1) - } - result ^= B[a&1] - return byte(result) -} - -// mdsColumnMult calculates y{col} where [y0 y1 y2 y3] = MDS · [x0] -func mdsColumnMult(in byte, col int) uint32 { - mul01 := in - mul5B := gfMult(in, 0x5B, mdsPolynomial) - mulEF := gfMult(in, 0xEF, mdsPolynomial) - - switch col { - case 0: - return uint32(mul01) | uint32(mul5B)<<8 | uint32(mulEF)<<16 | uint32(mulEF)<<24 - case 1: - return uint32(mulEF) | uint32(mulEF)<<8 | uint32(mul5B)<<16 | uint32(mul01)<<24 - case 2: - return uint32(mul5B) | uint32(mulEF)<<8 | uint32(mul01)<<16 | uint32(mulEF)<<24 - case 3: - return uint32(mul5B) | uint32(mul01)<<8 | uint32(mulEF)<<16 | uint32(mul5B)<<24 - } - - panic("unreachable") -} - -// h implements the S-box generation function. See [TWOFISH] 4.3.5 -func h(in, key []byte, offset int) uint32 { - var y [4]byte - for x := range y { - y[x] = in[x] - } - switch len(key) / 8 { - case 4: - y[0] = sbox[1][y[0]] ^ key[4*(6+offset)+0] - y[1] = sbox[0][y[1]] ^ key[4*(6+offset)+1] - y[2] = sbox[0][y[2]] ^ key[4*(6+offset)+2] - y[3] = sbox[1][y[3]] ^ key[4*(6+offset)+3] - fallthrough - case 3: - y[0] = sbox[1][y[0]] ^ key[4*(4+offset)+0] - y[1] = sbox[1][y[1]] ^ key[4*(4+offset)+1] - y[2] = sbox[0][y[2]] ^ key[4*(4+offset)+2] - y[3] = sbox[0][y[3]] ^ key[4*(4+offset)+3] - fallthrough - case 2: - y[0] = sbox[1][sbox[0][sbox[0][y[0]]^key[4*(2+offset)+0]]^key[4*(0+offset)+0]] - y[1] = sbox[0][sbox[0][sbox[1][y[1]]^key[4*(2+offset)+1]]^key[4*(0+offset)+1]] - y[2] = sbox[1][sbox[1][sbox[0][y[2]]^key[4*(2+offset)+2]]^key[4*(0+offset)+2]] - y[3] = sbox[0][sbox[1][sbox[1][y[3]]^key[4*(2+offset)+3]]^key[4*(0+offset)+3]] - } - // [y0 y1 y2 y3] = MDS . [x0 x1 x2 x3] - var mdsMult uint32 - for i := range y { - mdsMult ^= mdsColumnMult(y[i], i) - } - return mdsMult -} - -// Encrypt encrypts a 16-byte block from src to dst, which may overlap. -// Note that for amounts of data larger than a block, -// it is not safe to just call Encrypt on successive blocks; -// instead, use an encryption mode like CBC (see crypto/cipher/cbc.go). -func (c *Cipher) Encrypt(dst, src []byte) { - S1 := c.s[0] - S2 := c.s[1] - S3 := c.s[2] - S4 := c.s[3] - - // Load input - ia := load32l(src[0:4]) - ib := load32l(src[4:8]) - ic := load32l(src[8:12]) - id := load32l(src[12:16]) - - // Pre-whitening - ia ^= c.k[0] - ib ^= c.k[1] - ic ^= c.k[2] - id ^= c.k[3] - - for i := 0; i < 8; i++ { - k := c.k[8+i*4 : 12+i*4] - t2 := S2[byte(ib)] ^ S3[byte(ib>>8)] ^ S4[byte(ib>>16)] ^ S1[byte(ib>>24)] - t1 := S1[byte(ia)] ^ S2[byte(ia>>8)] ^ S3[byte(ia>>16)] ^ S4[byte(ia>>24)] + t2 - ic = ror(ic^(t1+k[0]), 1) - id = rol(id, 1) ^ (t2 + t1 + k[1]) - - t2 = S2[byte(id)] ^ S3[byte(id>>8)] ^ S4[byte(id>>16)] ^ S1[byte(id>>24)] - t1 = S1[byte(ic)] ^ S2[byte(ic>>8)] ^ S3[byte(ic>>16)] ^ S4[byte(ic>>24)] + t2 - ia = ror(ia^(t1+k[2]), 1) - ib = rol(ib, 1) ^ (t2 + t1 + k[3]) - } - - // Output with "undo last swap" - ta := ic ^ c.k[4] - tb := id ^ c.k[5] - tc := ia ^ c.k[6] - td := ib ^ c.k[7] - - store32l(dst[0:4], ta) - store32l(dst[4:8], tb) - store32l(dst[8:12], tc) - store32l(dst[12:16], td) -} - -// Decrypt decrypts a 16-byte block from src to dst, which may overlap. -func (c *Cipher) Decrypt(dst, src []byte) { - S1 := c.s[0] - S2 := c.s[1] - S3 := c.s[2] - S4 := c.s[3] - - // Load input - ta := load32l(src[0:4]) - tb := load32l(src[4:8]) - tc := load32l(src[8:12]) - td := load32l(src[12:16]) - - // Undo undo final swap - ia := tc ^ c.k[6] - ib := td ^ c.k[7] - ic := ta ^ c.k[4] - id := tb ^ c.k[5] - - for i := 8; i > 0; i-- { - k := c.k[4+i*4 : 8+i*4] - t2 := S2[byte(id)] ^ S3[byte(id>>8)] ^ S4[byte(id>>16)] ^ S1[byte(id>>24)] - t1 := S1[byte(ic)] ^ S2[byte(ic>>8)] ^ S3[byte(ic>>16)] ^ S4[byte(ic>>24)] + t2 - ia = rol(ia, 1) ^ (t1 + k[2]) - ib = ror(ib^(t2+t1+k[3]), 1) - - t2 = S2[byte(ib)] ^ S3[byte(ib>>8)] ^ S4[byte(ib>>16)] ^ S1[byte(ib>>24)] - t1 = S1[byte(ia)] ^ S2[byte(ia>>8)] ^ S3[byte(ia>>16)] ^ S4[byte(ia>>24)] + t2 - ic = rol(ic, 1) ^ (t1 + k[0]) - id = ror(id^(t2+t1+k[1]), 1) - } - - // Undo pre-whitening - ia ^= c.k[0] - ib ^= c.k[1] - ic ^= c.k[2] - id ^= c.k[3] - - store32l(dst[0:4], ia) - store32l(dst[4:8], ib) - store32l(dst[8:12], ic) - store32l(dst[12:16], id) -} diff --git a/vendor/golang.org/x/crypto/twofish/twofish_test.go b/vendor/golang.org/x/crypto/twofish/twofish_test.go deleted file mode 100644 index 303081f3f..000000000 --- a/vendor/golang.org/x/crypto/twofish/twofish_test.go +++ /dev/null @@ -1,129 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package twofish - -import ( - "bytes" - "testing" -) - -var qbox = [2][4][16]byte{ - { - {0x8, 0x1, 0x7, 0xD, 0x6, 0xF, 0x3, 0x2, 0x0, 0xB, 0x5, 0x9, 0xE, 0xC, 0xA, 0x4}, - {0xE, 0xC, 0xB, 0x8, 0x1, 0x2, 0x3, 0x5, 0xF, 0x4, 0xA, 0x6, 0x7, 0x0, 0x9, 0xD}, - {0xB, 0xA, 0x5, 0xE, 0x6, 0xD, 0x9, 0x0, 0xC, 0x8, 0xF, 0x3, 0x2, 0x4, 0x7, 0x1}, - {0xD, 0x7, 0xF, 0x4, 0x1, 0x2, 0x6, 0xE, 0x9, 0xB, 0x3, 0x0, 0x8, 0x5, 0xC, 0xA}, - }, - { - {0x2, 0x8, 0xB, 0xD, 0xF, 0x7, 0x6, 0xE, 0x3, 0x1, 0x9, 0x4, 0x0, 0xA, 0xC, 0x5}, - {0x1, 0xE, 0x2, 0xB, 0x4, 0xC, 0x3, 0x7, 0x6, 0xD, 0xA, 0x5, 0xF, 0x9, 0x0, 0x8}, - {0x4, 0xC, 0x7, 0x5, 0x1, 0x6, 0x9, 0xA, 0x0, 0xE, 0xD, 0x8, 0x2, 0xB, 0x3, 0xF}, - {0xB, 0x9, 0x5, 0x1, 0xC, 0x3, 0xD, 0xE, 0x6, 0x4, 0x7, 0xF, 0x2, 0x0, 0x8, 0xA}, - }, -} - -// genSbox generates the variable sbox -func genSbox(qi int, x byte) byte { - a0, b0 := x/16, x%16 - for i := 0; i < 2; i++ { - a1 := a0 ^ b0 - b1 := (a0 ^ ((b0 << 3) | (b0 >> 1)) ^ (a0 << 3)) & 15 - a0 = qbox[qi][2*i][a1] - b0 = qbox[qi][2*i+1][b1] - } - return (b0 << 4) + a0 -} - -func TestSbox(t *testing.T) { - for n := range sbox { - for m := range sbox[n] { - if genSbox(n, byte(m)) != sbox[n][m] { - t.Errorf("#%d|%d: sbox value = %d want %d", n, m, sbox[n][m], genSbox(n, byte(m))) - } - } - } -} - -var testVectors = []struct { - key []byte - dec []byte - enc []byte -}{ - // These tests are extracted from LibTom - { - []byte{0x9F, 0x58, 0x9F, 0x5C, 0xF6, 0x12, 0x2C, 0x32, 0xB6, 0xBF, 0xEC, 0x2F, 0x2A, 0xE8, 0xC3, 0x5A}, - []byte{0xD4, 0x91, 0xDB, 0x16, 0xE7, 0xB1, 0xC3, 0x9E, 0x86, 0xCB, 0x08, 0x6B, 0x78, 0x9F, 0x54, 0x19}, - []byte{0x01, 0x9F, 0x98, 0x09, 0xDE, 0x17, 0x11, 0x85, 0x8F, 0xAA, 0xC3, 0xA3, 0xBA, 0x20, 0xFB, 0xC3}, - }, - { - []byte{0x88, 0xB2, 0xB2, 0x70, 0x6B, 0x10, 0x5E, 0x36, 0xB4, 0x46, 0xBB, 0x6D, 0x73, 0x1A, 0x1E, 0x88, - 0xEF, 0xA7, 0x1F, 0x78, 0x89, 0x65, 0xBD, 0x44}, - []byte{0x39, 0xDA, 0x69, 0xD6, 0xBA, 0x49, 0x97, 0xD5, 0x85, 0xB6, 0xDC, 0x07, 0x3C, 0xA3, 0x41, 0xB2}, - []byte{0x18, 0x2B, 0x02, 0xD8, 0x14, 0x97, 0xEA, 0x45, 0xF9, 0xDA, 0xAC, 0xDC, 0x29, 0x19, 0x3A, 0x65}, - }, - { - []byte{0xD4, 0x3B, 0xB7, 0x55, 0x6E, 0xA3, 0x2E, 0x46, 0xF2, 0xA2, 0x82, 0xB7, 0xD4, 0x5B, 0x4E, 0x0D, - 0x57, 0xFF, 0x73, 0x9D, 0x4D, 0xC9, 0x2C, 0x1B, 0xD7, 0xFC, 0x01, 0x70, 0x0C, 0xC8, 0x21, 0x6F}, - []byte{0x90, 0xAF, 0xE9, 0x1B, 0xB2, 0x88, 0x54, 0x4F, 0x2C, 0x32, 0xDC, 0x23, 0x9B, 0x26, 0x35, 0xE6}, - []byte{0x6C, 0xB4, 0x56, 0x1C, 0x40, 0xBF, 0x0A, 0x97, 0x05, 0x93, 0x1C, 0xB6, 0xD4, 0x08, 0xE7, 0xFA}, - }, - // These test are derived from http://www.schneier.com/code/ecb_ival.txt - { - []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - []byte{0x9F, 0x58, 0x9F, 0x5C, 0xF6, 0x12, 0x2C, 0x32, 0xB6, 0xBF, 0xEC, 0x2F, 0x2A, 0xE8, 0xC3, 0x5A}, - }, - { - []byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, - 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, - }, - []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - []byte{0xCF, 0xD1, 0xD2, 0xE5, 0xA9, 0xBE, 0x9C, 0xDF, 0x50, 0x1F, 0x13, 0xB8, 0x92, 0xBD, 0x22, 0x48}, - }, - { - []byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, - 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF, - }, - []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - []byte{0x37, 0x52, 0x7B, 0xE0, 0x05, 0x23, 0x34, 0xB8, 0x9F, 0x0C, 0xFC, 0xCA, 0xE8, 0x7C, 0xFA, 0x20}, - }, -} - -func TestCipher(t *testing.T) { - for n, tt := range testVectors { - // Test if the plaintext (dec) is encrypts to the given - // ciphertext (enc) using the given key. Test also if enc can - // be decrypted again into dec. - c, err := NewCipher(tt.key) - if err != nil { - t.Errorf("#%d: NewCipher: %v", n, err) - return - } - - buf := make([]byte, 16) - c.Encrypt(buf, tt.dec) - if !bytes.Equal(buf, tt.enc) { - t.Errorf("#%d: encrypt = %x want %x", n, buf, tt.enc) - } - c.Decrypt(buf, tt.enc) - if !bytes.Equal(buf, tt.dec) { - t.Errorf("#%d: decrypt = %x want %x", n, buf, tt.dec) - } - - // Test that 16 zero bytes, encrypted 1000 times then decrypted - // 1000 times results in zero bytes again. - zero := make([]byte, 16) - buf = make([]byte, 16) - for i := 0; i < 1000; i++ { - c.Encrypt(buf, buf) - } - for i := 0; i < 1000; i++ { - c.Decrypt(buf, buf) - } - if !bytes.Equal(buf, zero) { - t.Errorf("#%d: encrypt/decrypt 1000: have %x want %x", n, buf, zero) - } - } -} diff --git a/vendor/golang.org/x/crypto/xtea/block.go b/vendor/golang.org/x/crypto/xtea/block.go deleted file mode 100644 index bf5d24599..000000000 --- a/vendor/golang.org/x/crypto/xtea/block.go +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -/* - Implementation adapted from Needham and Wheeler's paper: - http://www.cix.co.uk/~klockstone/xtea.pdf - - A precalculated look up table is used during encryption/decryption for values that are based purely on the key. -*/ - -package xtea - -// XTEA is based on 64 rounds. -const numRounds = 64 - -// blockToUint32 reads an 8 byte slice into two uint32s. -// The block is treated as big endian. -func blockToUint32(src []byte) (uint32, uint32) { - r0 := uint32(src[0])<<24 | uint32(src[1])<<16 | uint32(src[2])<<8 | uint32(src[3]) - r1 := uint32(src[4])<<24 | uint32(src[5])<<16 | uint32(src[6])<<8 | uint32(src[7]) - return r0, r1 -} - -// uint32ToBlock writes two uint32s into an 8 byte data block. -// Values are written as big endian. -func uint32ToBlock(v0, v1 uint32, dst []byte) { - dst[0] = byte(v0 >> 24) - dst[1] = byte(v0 >> 16) - dst[2] = byte(v0 >> 8) - dst[3] = byte(v0) - dst[4] = byte(v1 >> 24) - dst[5] = byte(v1 >> 16) - dst[6] = byte(v1 >> 8) - dst[7] = byte(v1 >> 0) -} - -// encryptBlock encrypts a single 8 byte block using XTEA. -func encryptBlock(c *Cipher, dst, src []byte) { - v0, v1 := blockToUint32(src) - - // Two rounds of XTEA applied per loop - for i := 0; i < numRounds; { - v0 += ((v1<<4 ^ v1>>5) + v1) ^ c.table[i] - i++ - v1 += ((v0<<4 ^ v0>>5) + v0) ^ c.table[i] - i++ - } - - uint32ToBlock(v0, v1, dst) -} - -// decryptBlock decrypt a single 8 byte block using XTEA. -func decryptBlock(c *Cipher, dst, src []byte) { - v0, v1 := blockToUint32(src) - - // Two rounds of XTEA applied per loop - for i := numRounds; i > 0; { - i-- - v1 -= ((v0<<4 ^ v0>>5) + v0) ^ c.table[i] - i-- - v0 -= ((v1<<4 ^ v1>>5) + v1) ^ c.table[i] - } - - uint32ToBlock(v0, v1, dst) -} diff --git a/vendor/golang.org/x/crypto/xtea/cipher.go b/vendor/golang.org/x/crypto/xtea/cipher.go deleted file mode 100644 index 108b42635..000000000 --- a/vendor/golang.org/x/crypto/xtea/cipher.go +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package xtea implements XTEA encryption, as defined in Needham and Wheeler's -// 1997 technical report, "Tea extensions." -package xtea // import "golang.org/x/crypto/xtea" - -// For details, see http://www.cix.co.uk/~klockstone/xtea.pdf - -import "strconv" - -// The XTEA block size in bytes. -const BlockSize = 8 - -// A Cipher is an instance of an XTEA cipher using a particular key. -// table contains a series of precalculated values that are used each round. -type Cipher struct { - table [64]uint32 -} - -type KeySizeError int - -func (k KeySizeError) Error() string { - return "crypto/xtea: invalid key size " + strconv.Itoa(int(k)) -} - -// NewCipher creates and returns a new Cipher. -// The key argument should be the XTEA key. -// XTEA only supports 128 bit (16 byte) keys. -func NewCipher(key []byte) (*Cipher, error) { - k := len(key) - switch k { - default: - return nil, KeySizeError(k) - case 16: - break - } - - c := new(Cipher) - initCipher(c, key) - - return c, nil -} - -// BlockSize returns the XTEA block size, 8 bytes. -// It is necessary to satisfy the Block interface in the -// package "crypto/cipher". -func (c *Cipher) BlockSize() int { return BlockSize } - -// Encrypt encrypts the 8 byte buffer src using the key and stores the result in dst. -// Note that for amounts of data larger than a block, -// it is not safe to just call Encrypt on successive blocks; -// instead, use an encryption mode like CBC (see crypto/cipher/cbc.go). -func (c *Cipher) Encrypt(dst, src []byte) { encryptBlock(c, dst, src) } - -// Decrypt decrypts the 8 byte buffer src using the key k and stores the result in dst. -func (c *Cipher) Decrypt(dst, src []byte) { decryptBlock(c, dst, src) } - -// initCipher initializes the cipher context by creating a look up table -// of precalculated values that are based on the key. -func initCipher(c *Cipher, key []byte) { - // Load the key into four uint32s - var k [4]uint32 - for i := 0; i < len(k); i++ { - j := i << 2 // Multiply by 4 - k[i] = uint32(key[j+0])<<24 | uint32(key[j+1])<<16 | uint32(key[j+2])<<8 | uint32(key[j+3]) - } - - // Precalculate the table - const delta = 0x9E3779B9 - var sum uint32 = 0 - - // Two rounds of XTEA applied per loop - for i := 0; i < numRounds; { - c.table[i] = sum + k[sum&3] - i++ - sum += delta - c.table[i] = sum + k[(sum>>11)&3] - i++ - } -} diff --git a/vendor/golang.org/x/crypto/xtea/xtea_test.go b/vendor/golang.org/x/crypto/xtea/xtea_test.go deleted file mode 100644 index be711bf5a..000000000 --- a/vendor/golang.org/x/crypto/xtea/xtea_test.go +++ /dev/null @@ -1,229 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xtea - -import ( - "testing" -) - -// A sample test key for when we just want to initialize a cipher -var testKey = []byte{0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF} - -// Test that the block size for XTEA is correct -func TestBlocksize(t *testing.T) { - if BlockSize != 8 { - t.Errorf("BlockSize constant - expected 8, got %d", BlockSize) - return - } - - c, err := NewCipher(testKey) - if err != nil { - t.Errorf("NewCipher(%d bytes) = %s", len(testKey), err) - return - } - - result := c.BlockSize() - if result != 8 { - t.Errorf("BlockSize function - expected 8, got %d", result) - return - } -} - -// A series of test values to confirm that the Cipher.table array was initialized correctly -var testTable = []uint32{ - 0x00112233, 0x6B1568B8, 0xE28CE030, 0xC5089E2D, 0xC5089E2D, 0x1EFBD3A2, 0xA7845C2A, 0x78EF0917, - 0x78EF0917, 0x172682D0, 0x5B6AC714, 0x822AC955, 0x3DE68511, 0xDC1DFECA, 0x2062430E, 0x3611343F, - 0xF1CCEFFB, 0x900469B4, 0xD448ADF8, 0x2E3BE36D, 0xB6C46BF5, 0x994029F2, 0x994029F2, 0xF3335F67, - 0x6AAAD6DF, 0x4D2694DC, 0x4D2694DC, 0xEB5E0E95, 0x2FA252D9, 0x4551440A, 0x121E10D6, 0xB0558A8F, - 0xE388BDC3, 0x0A48C004, 0xC6047BC0, 0x643BF579, 0xA88039BD, 0x02736F32, 0x8AFBF7BA, 0x5C66A4A7, - 0x5C66A4A7, 0xC76AEB2C, 0x3EE262A4, 0x215E20A1, 0x215E20A1, 0x7B515616, 0x03D9DE9E, 0x1988CFCF, - 0xD5448B8B, 0x737C0544, 0xB7C04988, 0xDE804BC9, 0x9A3C0785, 0x3873813E, 0x7CB7C582, 0xD6AAFAF7, - 0x4E22726F, 0x309E306C, 0x309E306C, 0x8A9165E1, 0x1319EE69, 0xF595AC66, 0xF595AC66, 0x4F88E1DB, -} - -// Test that the cipher context is initialized correctly -func TestCipherInit(t *testing.T) { - c, err := NewCipher(testKey) - if err != nil { - t.Errorf("NewCipher(%d bytes) = %s", len(testKey), err) - return - } - - for i := 0; i < len(c.table); i++ { - if c.table[i] != testTable[i] { - t.Errorf("NewCipher() failed to initialize Cipher.table[%d] correctly. Expected %08X, got %08X", i, testTable[i], c.table[i]) - break - } - } -} - -// Test that invalid key sizes return an error -func TestInvalidKeySize(t *testing.T) { - // Test a long key - key := []byte{ - 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF, - 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF, - } - - _, err := NewCipher(key) - if err == nil { - t.Errorf("Invalid key size %d didn't result in an error.", len(key)) - } - - // Test a short key - key = []byte{0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77} - - _, err = NewCipher(key) - if err == nil { - t.Errorf("Invalid key size %d didn't result in an error.", len(key)) - } -} - -// Test that we can correctly decode some bytes we have encoded -func TestEncodeDecode(t *testing.T) { - original := []byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF} - input := original - output := make([]byte, BlockSize) - - c, err := NewCipher(testKey) - if err != nil { - t.Errorf("NewCipher(%d bytes) = %s", len(testKey), err) - return - } - - // Encrypt the input block - c.Encrypt(output, input) - - // Check that the output does not match the input - differs := false - for i := 0; i < len(input); i++ { - if output[i] != input[i] { - differs = true - break - } - } - if differs == false { - t.Error("Cipher.Encrypt: Failed to encrypt the input block.") - return - } - - // Decrypt the block we just encrypted - input = output - output = make([]byte, BlockSize) - c.Decrypt(output, input) - - // Check that the output from decrypt matches our initial input - for i := 0; i < len(input); i++ { - if output[i] != original[i] { - t.Errorf("Decrypted byte %d differed. Expected %02X, got %02X\n", i, original[i], output[i]) - return - } - } -} - -// Test Vectors -type CryptTest struct { - key []byte - plainText []byte - cipherText []byte -} - -var CryptTests = []CryptTest{ - // These were sourced from http://www.freemedialibrary.com/index.php/XTEA_test_vectors - { - []byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, - []byte{0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48}, - []byte{0x49, 0x7d, 0xf3, 0xd0, 0x72, 0x61, 0x2c, 0xb5}, - }, - { - []byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, - []byte{0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41}, - []byte{0xe7, 0x8f, 0x2d, 0x13, 0x74, 0x43, 0x41, 0xd8}, - }, - { - []byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, - []byte{0x5a, 0x5b, 0x6e, 0x27, 0x89, 0x48, 0xd7, 0x7f}, - []byte{0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41}, - }, - { - []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - []byte{0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48}, - []byte{0xa0, 0x39, 0x05, 0x89, 0xf8, 0xb8, 0xef, 0xa5}, - }, - { - []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - []byte{0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41}, - []byte{0xed, 0x23, 0x37, 0x5a, 0x82, 0x1a, 0x8c, 0x2d}, - }, - { - []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - []byte{0x70, 0xe1, 0x22, 0x5d, 0x6e, 0x4e, 0x76, 0x55}, - []byte{0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41}, - }, - - // These vectors are from http://wiki.secondlife.com/wiki/XTEA_Strong_Encryption_Implementation#Bouncy_Castle_C.23_API - { - []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - []byte{0xDE, 0xE9, 0xD4, 0xD8, 0xF7, 0x13, 0x1E, 0xD9}, - }, - { - []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - []byte{0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}, - []byte{0x06, 0x5C, 0x1B, 0x89, 0x75, 0xC6, 0xA8, 0x16}, - }, - { - []byte{0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78, 0x23, 0x45, 0x67, 0x89, 0x34, 0x56, 0x78, 0x9A}, - []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - []byte{0x1F, 0xF9, 0xA0, 0x26, 0x1A, 0xC6, 0x42, 0x64}, - }, - { - []byte{0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78, 0x23, 0x45, 0x67, 0x89, 0x34, 0x56, 0x78, 0x9A}, - []byte{0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}, - []byte{0x8C, 0x67, 0x15, 0x5B, 0x2E, 0xF9, 0x1E, 0xAD}, - }, -} - -// Test encryption -func TestCipherEncrypt(t *testing.T) { - for i, tt := range CryptTests { - c, err := NewCipher(tt.key) - if err != nil { - t.Errorf("NewCipher(%d bytes), vector %d = %s", len(tt.key), i, err) - continue - } - - out := make([]byte, len(tt.plainText)) - c.Encrypt(out, tt.plainText) - - for j := 0; j < len(out); j++ { - if out[j] != tt.cipherText[j] { - t.Errorf("Cipher.Encrypt %d: out[%d] = %02X, expected %02X", i, j, out[j], tt.cipherText[j]) - break - } - } - } -} - -// Test decryption -func TestCipherDecrypt(t *testing.T) { - for i, tt := range CryptTests { - c, err := NewCipher(tt.key) - if err != nil { - t.Errorf("NewCipher(%d bytes), vector %d = %s", len(tt.key), i, err) - continue - } - - out := make([]byte, len(tt.cipherText)) - c.Decrypt(out, tt.cipherText) - - for j := 0; j < len(out); j++ { - if out[j] != tt.plainText[j] { - t.Errorf("Cipher.Decrypt %d: out[%d] = %02X, expected %02X", i, j, out[j], tt.plainText[j]) - break - } - } - } -} diff --git a/vendor/golang.org/x/crypto/xts/xts.go b/vendor/golang.org/x/crypto/xts/xts.go deleted file mode 100644 index c9a283b2e..000000000 --- a/vendor/golang.org/x/crypto/xts/xts.go +++ /dev/null @@ -1,138 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package xts implements the XTS cipher mode as specified in IEEE P1619/D16. -// -// XTS mode is typically used for disk encryption, which presents a number of -// novel problems that make more common modes inapplicable. The disk is -// conceptually an array of sectors and we must be able to encrypt and decrypt -// a sector in isolation. However, an attacker must not be able to transpose -// two sectors of plaintext by transposing their ciphertext. -// -// XTS wraps a block cipher with Rogaway's XEX mode in order to build a -// tweakable block cipher. This allows each sector to have a unique tweak and -// effectively create a unique key for each sector. -// -// XTS does not provide any authentication. An attacker can manipulate the -// ciphertext and randomise a block (16 bytes) of the plaintext. -// -// (Note: this package does not implement ciphertext-stealing so sectors must -// be a multiple of 16 bytes.) -package xts // import "golang.org/x/crypto/xts" - -import ( - "crypto/cipher" - "errors" -) - -// Cipher contains an expanded key structure. It doesn't contain mutable state -// and therefore can be used concurrently. -type Cipher struct { - k1, k2 cipher.Block -} - -// blockSize is the block size that the underlying cipher must have. XTS is -// only defined for 16-byte ciphers. -const blockSize = 16 - -// NewCipher creates a Cipher given a function for creating the underlying -// block cipher (which must have a block size of 16 bytes). The key must be -// twice the length of the underlying cipher's key. -func NewCipher(cipherFunc func([]byte) (cipher.Block, error), key []byte) (c *Cipher, err error) { - c = new(Cipher) - if c.k1, err = cipherFunc(key[:len(key)/2]); err != nil { - return - } - c.k2, err = cipherFunc(key[len(key)/2:]) - - if c.k1.BlockSize() != blockSize { - err = errors.New("xts: cipher does not have a block size of 16") - } - - return -} - -// Encrypt encrypts a sector of plaintext and puts the result into ciphertext. -// Plaintext and ciphertext may be the same slice but should not overlap. -// Sectors must be a multiple of 16 bytes and less than 2²⁴ bytes. -func (c *Cipher) Encrypt(ciphertext, plaintext []byte, sectorNum uint64) { - if len(ciphertext) < len(plaintext) { - panic("xts: ciphertext is smaller than plaintext") - } - if len(plaintext)%blockSize != 0 { - panic("xts: plaintext is not a multiple of the block size") - } - - var tweak [blockSize]byte - for i := 0; i < 8; i++ { - tweak[i] = byte(sectorNum) - sectorNum >>= 8 - } - - c.k2.Encrypt(tweak[:], tweak[:]) - - for i := 0; i < len(plaintext); i += blockSize { - for j := 0; j < blockSize; j++ { - ciphertext[i+j] = plaintext[i+j] ^ tweak[j] - } - c.k1.Encrypt(ciphertext[i:], ciphertext[i:]) - for j := 0; j < blockSize; j++ { - ciphertext[i+j] ^= tweak[j] - } - - mul2(&tweak) - } -} - -// Decrypt decrypts a sector of ciphertext and puts the result into plaintext. -// Plaintext and ciphertext may be the same slice but should not overlap. -// Sectors must be a multiple of 16 bytes and less than 2²⁴ bytes. -func (c *Cipher) Decrypt(plaintext, ciphertext []byte, sectorNum uint64) { - if len(plaintext) < len(ciphertext) { - panic("xts: plaintext is smaller than ciphertext") - } - if len(ciphertext)%blockSize != 0 { - panic("xts: ciphertext is not a multiple of the block size") - } - - var tweak [blockSize]byte - for i := 0; i < 8; i++ { - tweak[i] = byte(sectorNum) - sectorNum >>= 8 - } - - c.k2.Encrypt(tweak[:], tweak[:]) - - for i := 0; i < len(plaintext); i += blockSize { - for j := 0; j < blockSize; j++ { - plaintext[i+j] = ciphertext[i+j] ^ tweak[j] - } - c.k1.Decrypt(plaintext[i:], plaintext[i:]) - for j := 0; j < blockSize; j++ { - plaintext[i+j] ^= tweak[j] - } - - mul2(&tweak) - } -} - -// mul2 multiplies tweak by 2 in GF(2¹²⁸) with an irreducible polynomial of -// x¹²⁸ + x⁷ + x² + x + 1. -func mul2(tweak *[blockSize]byte) { - var carryIn byte - for j := range tweak { - carryOut := tweak[j] >> 7 - tweak[j] = (tweak[j] << 1) + carryIn - carryIn = carryOut - } - if carryIn != 0 { - // If we have a carry bit then we need to subtract a multiple - // of the irreducible polynomial (x¹²⁸ + x⁷ + x² + x + 1). - // By dropping the carry bit, we're subtracting the x^128 term - // so all that remains is to subtract x⁷ + x² + x + 1. - // Subtraction (and addition) in this representation is just - // XOR. - tweak[0] ^= 1<<7 | 1<<2 | 1<<1 | 1 - } -} diff --git a/vendor/golang.org/x/crypto/xts/xts_test.go b/vendor/golang.org/x/crypto/xts/xts_test.go deleted file mode 100644 index 7a5e9fadd..000000000 --- a/vendor/golang.org/x/crypto/xts/xts_test.go +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xts - -import ( - "bytes" - "crypto/aes" - "encoding/hex" - "testing" -) - -// These test vectors have been taken from IEEE P1619/D16, Annex B. -var xtsTestVectors = []struct { - key string - sector uint64 - plaintext string - ciphertext string -}{ - { - "0000000000000000000000000000000000000000000000000000000000000000", - 0, - "0000000000000000000000000000000000000000000000000000000000000000", - "917cf69ebd68b2ec9b9fe9a3eadda692cd43d2f59598ed858c02c2652fbf922e", - }, { - "1111111111111111111111111111111122222222222222222222222222222222", - 0x3333333333, - "4444444444444444444444444444444444444444444444444444444444444444", - "c454185e6a16936e39334038acef838bfb186fff7480adc4289382ecd6d394f0", - }, { - "fffefdfcfbfaf9f8f7f6f5f4f3f2f1f022222222222222222222222222222222", - 0x3333333333, - "4444444444444444444444444444444444444444444444444444444444444444", - "af85336b597afc1a900b2eb21ec949d292df4c047e0b21532186a5971a227a89", - }, { - "2718281828459045235360287471352631415926535897932384626433832795", - 0, - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff", - "27a7479befa1d476489f308cd4cfa6e2a96e4bbe3208ff25287dd3819616e89cc78cf7f5e543445f8333d8fa7f56000005279fa5d8b5e4ad40e736ddb4d35412328063fd2aab53e5ea1e0a9f332500a5df9487d07a5c92cc512c8866c7e860ce93fdf166a24912b422976146ae20ce846bb7dc9ba94a767aaef20c0d61ad02655ea92dc4c4e41a8952c651d33174be51a10c421110e6d81588ede82103a252d8a750e8768defffed9122810aaeb99f9172af82b604dc4b8e51bcb08235a6f4341332e4ca60482a4ba1a03b3e65008fc5da76b70bf1690db4eae29c5f1badd03c5ccf2a55d705ddcd86d449511ceb7ec30bf12b1fa35b913f9f747a8afd1b130e94bff94effd01a91735ca1726acd0b197c4e5b03393697e126826fb6bbde8ecc1e08298516e2c9ed03ff3c1b7860f6de76d4cecd94c8119855ef5297ca67e9f3e7ff72b1e99785ca0a7e7720c5b36dc6d72cac9574c8cbbc2f801e23e56fd344b07f22154beba0f08ce8891e643ed995c94d9a69c9f1b5f499027a78572aeebd74d20cc39881c213ee770b1010e4bea718846977ae119f7a023ab58cca0ad752afe656bb3c17256a9f6e9bf19fdd5a38fc82bbe872c5539edb609ef4f79c203ebb140f2e583cb2ad15b4aa5b655016a8449277dbd477ef2c8d6c017db738b18deb4a427d1923ce3ff262735779a418f20a282df920147beabe421ee5319d0568", - }, { - "2718281828459045235360287471352631415926535897932384626433832795", - 1, - "27a7479befa1d476489f308cd4cfa6e2a96e4bbe3208ff25287dd3819616e89cc78cf7f5e543445f8333d8fa7f56000005279fa5d8b5e4ad40e736ddb4d35412328063fd2aab53e5ea1e0a9f332500a5df9487d07a5c92cc512c8866c7e860ce93fdf166a24912b422976146ae20ce846bb7dc9ba94a767aaef20c0d61ad02655ea92dc4c4e41a8952c651d33174be51a10c421110e6d81588ede82103a252d8a750e8768defffed9122810aaeb99f9172af82b604dc4b8e51bcb08235a6f4341332e4ca60482a4ba1a03b3e65008fc5da76b70bf1690db4eae29c5f1badd03c5ccf2a55d705ddcd86d449511ceb7ec30bf12b1fa35b913f9f747a8afd1b130e94bff94effd01a91735ca1726acd0b197c4e5b03393697e126826fb6bbde8ecc1e08298516e2c9ed03ff3c1b7860f6de76d4cecd94c8119855ef5297ca67e9f3e7ff72b1e99785ca0a7e7720c5b36dc6d72cac9574c8cbbc2f801e23e56fd344b07f22154beba0f08ce8891e643ed995c94d9a69c9f1b5f499027a78572aeebd74d20cc39881c213ee770b1010e4bea718846977ae119f7a023ab58cca0ad752afe656bb3c17256a9f6e9bf19fdd5a38fc82bbe872c5539edb609ef4f79c203ebb140f2e583cb2ad15b4aa5b655016a8449277dbd477ef2c8d6c017db738b18deb4a427d1923ce3ff262735779a418f20a282df920147beabe421ee5319d0568", - "264d3ca8512194fec312c8c9891f279fefdd608d0c027b60483a3fa811d65ee59d52d9e40ec5672d81532b38b6b089ce951f0f9c35590b8b978d175213f329bb1c2fd30f2f7f30492a61a532a79f51d36f5e31a7c9a12c286082ff7d2394d18f783e1a8e72c722caaaa52d8f065657d2631fd25bfd8e5baad6e527d763517501c68c5edc3cdd55435c532d7125c8614deed9adaa3acade5888b87bef641c4c994c8091b5bcd387f3963fb5bc37aa922fbfe3df4e5b915e6eb514717bdd2a74079a5073f5c4bfd46adf7d282e7a393a52579d11a028da4d9cd9c77124f9648ee383b1ac763930e7162a8d37f350b2f74b8472cf09902063c6b32e8c2d9290cefbd7346d1c779a0df50edcde4531da07b099c638e83a755944df2aef1aa31752fd323dcb710fb4bfbb9d22b925bc3577e1b8949e729a90bbafeacf7f7879e7b1147e28ba0bae940db795a61b15ecf4df8db07b824bb062802cc98a9545bb2aaeed77cb3fc6db15dcd7d80d7d5bc406c4970a3478ada8899b329198eb61c193fb6275aa8ca340344a75a862aebe92eee1ce032fd950b47d7704a3876923b4ad62844bf4a09c4dbe8b4397184b7471360c9564880aedddb9baa4af2e75394b08cd32ff479c57a07d3eab5d54de5f9738b8d27f27a9f0ab11799d7b7ffefb2704c95c6ad12c39f1e867a4b7b1d7818a4b753dfd2a89ccb45e001a03a867b187f225dd", - }, { - "27182818284590452353602874713526624977572470936999595749669676273141592653589793238462643383279502884197169399375105820974944592", - 0xff, - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff", - "1c3b3a102f770386e4836c99e370cf9bea00803f5e482357a4ae12d414a3e63b5d31e276f8fe4a8d66b317f9ac683f44680a86ac35adfc3345befecb4bb188fd5776926c49a3095eb108fd1098baec70aaa66999a72a82f27d848b21d4a741b0c5cd4d5fff9dac89aeba122961d03a757123e9870f8acf1000020887891429ca2a3e7a7d7df7b10355165c8b9a6d0a7de8b062c4500dc4cd120c0f7418dae3d0b5781c34803fa75421c790dfe1de1834f280d7667b327f6c8cd7557e12ac3a0f93ec05c52e0493ef31a12d3d9260f79a289d6a379bc70c50841473d1a8cc81ec583e9645e07b8d9670655ba5bbcfecc6dc3966380ad8fecb17b6ba02469a020a84e18e8f84252070c13e9f1f289be54fbc481457778f616015e1327a02b140f1505eb309326d68378f8374595c849d84f4c333ec4423885143cb47bd71c5edae9be69a2ffeceb1bec9de244fbe15992b11b77c040f12bd8f6a975a44a0f90c29a9abc3d4d893927284c58754cce294529f8614dcd2aba991925fedc4ae74ffac6e333b93eb4aff0479da9a410e4450e0dd7ae4c6e2910900575da401fc07059f645e8b7e9bfdef33943054ff84011493c27b3429eaedb4ed5376441a77ed43851ad77f16f541dfd269d50d6a5f14fb0aab1cbb4c1550be97f7ab4066193c4caa773dad38014bd2092fa755c824bb5e54c4f36ffda9fcea70b9c6e693e148c151", - }, -} - -func fromHex(s string) []byte { - ret, err := hex.DecodeString(s) - if err != nil { - panic("xts: invalid hex in test") - } - return ret -} - -func TestXTS(t *testing.T) { - for i, test := range xtsTestVectors { - c, err := NewCipher(aes.NewCipher, fromHex(test.key)) - if err != nil { - t.Errorf("#%d: failed to create cipher: %s", i, err) - continue - } - plaintext := fromHex(test.plaintext) - ciphertext := make([]byte, len(plaintext)) - c.Encrypt(ciphertext, plaintext, test.sector) - - expectedCiphertext := fromHex(test.ciphertext) - if !bytes.Equal(ciphertext, expectedCiphertext) { - t.Errorf("#%d: encrypted failed, got: %x, want: %x", i, ciphertext, expectedCiphertext) - continue - } - - decrypted := make([]byte, len(ciphertext)) - c.Decrypt(decrypted, ciphertext, test.sector) - if !bytes.Equal(decrypted, plaintext) { - t.Errorf("#%d: decryption failed, got: %x, want: %x", i, decrypted, plaintext) - } - } -} diff --git a/vendor/golang.org/x/net/LICENSE b/vendor/golang.org/x/net/LICENSE deleted file mode 100644 index 6a66aea5e..000000000 --- a/vendor/golang.org/x/net/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2009 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * 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. - * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT -OWNER 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. diff --git a/vendor/golang.org/x/net/PATENTS b/vendor/golang.org/x/net/PATENTS deleted file mode 100644 index 733099041..000000000 --- a/vendor/golang.org/x/net/PATENTS +++ /dev/null @@ -1,22 +0,0 @@ -Additional IP Rights Grant (Patents) - -"This implementation" means the copyrightable works distributed by -Google as part of the Go project. - -Google hereby grants to You a perpetual, worldwide, non-exclusive, -no-charge, royalty-free, irrevocable (except as stated in this section) -patent license to make, have made, use, offer to sell, sell, import, -transfer and otherwise run, modify and propagate the contents of this -implementation of Go, where such license applies only to those patent -claims, both currently owned or controlled by Google and acquired in -the future, licensable by Google that are necessarily infringed by this -implementation of Go. This grant does not include claims that would be -infringed only as a consequence of further modification of this -implementation. If you or your agent or exclusive licensee institute or -order or agree to the institution of patent litigation against any -entity (including a cross-claim or counterclaim in a lawsuit) alleging -that this implementation of Go or any code incorporated within this -implementation of Go constitutes direct or contributory patent -infringement, or inducement of patent infringement, then any patent -rights granted to you under this License for this implementation of Go -shall terminate as of the date such litigation is filed. diff --git a/vendor/golang.org/x/net/context/context.go b/vendor/golang.org/x/net/context/context.go deleted file mode 100644 index f143ed6a1..000000000 --- a/vendor/golang.org/x/net/context/context.go +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package context defines the Context type, which carries deadlines, -// cancelation signals, and other request-scoped values across API boundaries -// and between processes. -// -// Incoming requests to a server should create a Context, and outgoing calls to -// servers should accept a Context. The chain of function calls between must -// propagate the Context, optionally replacing it with a modified copy created -// using WithDeadline, WithTimeout, WithCancel, or WithValue. -// -// Programs that use Contexts should follow these rules to keep interfaces -// consistent across packages and enable static analysis tools to check context -// propagation: -// -// Do not store Contexts inside a struct type; instead, pass a Context -// explicitly to each function that needs it. The Context should be the first -// parameter, typically named ctx: -// -// func DoSomething(ctx context.Context, arg Arg) error { -// // ... use ctx ... -// } -// -// Do not pass a nil Context, even if a function permits it. Pass context.TODO -// if you are unsure about which Context to use. -// -// Use context Values only for request-scoped data that transits processes and -// APIs, not for passing optional parameters to functions. -// -// The same Context may be passed to functions running in different goroutines; -// Contexts are safe for simultaneous use by multiple goroutines. -// -// See http://blog.golang.org/context for example code for a server that uses -// Contexts. -package context // import "golang.org/x/net/context" - -import "time" - -// A Context carries a deadline, a cancelation signal, and other values across -// API boundaries. -// -// Context's methods may be called by multiple goroutines simultaneously. -type Context interface { - // Deadline returns the time when work done on behalf of this context - // should be canceled. Deadline returns ok==false when no deadline is - // set. Successive calls to Deadline return the same results. - Deadline() (deadline time.Time, ok bool) - - // Done returns a channel that's closed when work done on behalf of this - // context should be canceled. Done may return nil if this context can - // never be canceled. Successive calls to Done return the same value. - // - // WithCancel arranges for Done to be closed when cancel is called; - // WithDeadline arranges for Done to be closed when the deadline - // expires; WithTimeout arranges for Done to be closed when the timeout - // elapses. - // - // Done is provided for use in select statements: - // - // // Stream generates values with DoSomething and sends them to out - // // until DoSomething returns an error or ctx.Done is closed. - // func Stream(ctx context.Context, out chan<- Value) error { - // for { - // v, err := DoSomething(ctx) - // if err != nil { - // return err - // } - // select { - // case <-ctx.Done(): - // return ctx.Err() - // case out <- v: - // } - // } - // } - // - // See http://blog.golang.org/pipelines for more examples of how to use - // a Done channel for cancelation. - Done() <-chan struct{} - - // Err returns a non-nil error value after Done is closed. Err returns - // Canceled if the context was canceled or DeadlineExceeded if the - // context's deadline passed. No other values for Err are defined. - // After Done is closed, successive calls to Err return the same value. - Err() error - - // Value returns the value associated with this context for key, or nil - // if no value is associated with key. Successive calls to Value with - // the same key returns the same result. - // - // Use context values only for request-scoped data that transits - // processes and API boundaries, not for passing optional parameters to - // functions. - // - // A key identifies a specific value in a Context. Functions that wish - // to store values in Context typically allocate a key in a global - // variable then use that key as the argument to context.WithValue and - // Context.Value. A key can be any type that supports equality; - // packages should define keys as an unexported type to avoid - // collisions. - // - // Packages that define a Context key should provide type-safe accessors - // for the values stores using that key: - // - // // Package user defines a User type that's stored in Contexts. - // package user - // - // import "golang.org/x/net/context" - // - // // User is the type of value stored in the Contexts. - // type User struct {...} - // - // // key is an unexported type for keys defined in this package. - // // This prevents collisions with keys defined in other packages. - // type key int - // - // // userKey is the key for user.User values in Contexts. It is - // // unexported; clients use user.NewContext and user.FromContext - // // instead of using this key directly. - // var userKey key = 0 - // - // // NewContext returns a new Context that carries value u. - // func NewContext(ctx context.Context, u *User) context.Context { - // return context.WithValue(ctx, userKey, u) - // } - // - // // FromContext returns the User value stored in ctx, if any. - // func FromContext(ctx context.Context) (*User, bool) { - // u, ok := ctx.Value(userKey).(*User) - // return u, ok - // } - Value(key interface{}) interface{} -} - -// Background returns a non-nil, empty Context. It is never canceled, has no -// values, and has no deadline. It is typically used by the main function, -// initialization, and tests, and as the top-level Context for incoming -// requests. -func Background() Context { - return background -} - -// TODO returns a non-nil, empty Context. Code should use context.TODO when -// it's unclear which Context to use or it is not yet available (because the -// surrounding function has not yet been extended to accept a Context -// parameter). TODO is recognized by static analysis tools that determine -// whether Contexts are propagated correctly in a program. -func TODO() Context { - return todo -} - -// A CancelFunc tells an operation to abandon its work. -// A CancelFunc does not wait for the work to stop. -// After the first call, subsequent calls to a CancelFunc do nothing. -type CancelFunc func() diff --git a/vendor/golang.org/x/net/context/go17.go b/vendor/golang.org/x/net/context/go17.go deleted file mode 100644 index d20f52b7d..000000000 --- a/vendor/golang.org/x/net/context/go17.go +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build go1.7 - -package context - -import ( - "context" // standard library's context, as of Go 1.7 - "time" -) - -var ( - todo = context.TODO() - background = context.Background() -) - -// Canceled is the error returned by Context.Err when the context is canceled. -var Canceled = context.Canceled - -// DeadlineExceeded is the error returned by Context.Err when the context's -// deadline passes. -var DeadlineExceeded = context.DeadlineExceeded - -// WithCancel returns a copy of parent with a new Done channel. The returned -// context's Done channel is closed when the returned cancel function is called -// or when the parent context's Done channel is closed, whichever happens first. -// -// Canceling this context releases resources associated with it, so code should -// call cancel as soon as the operations running in this Context complete. -func WithCancel(parent Context) (ctx Context, cancel CancelFunc) { - ctx, f := context.WithCancel(parent) - return ctx, CancelFunc(f) -} - -// WithDeadline returns a copy of the parent context with the deadline adjusted -// to be no later than d. If the parent's deadline is already earlier than d, -// WithDeadline(parent, d) is semantically equivalent to parent. The returned -// context's Done channel is closed when the deadline expires, when the returned -// cancel function is called, or when the parent context's Done channel is -// closed, whichever happens first. -// -// Canceling this context releases resources associated with it, so code should -// call cancel as soon as the operations running in this Context complete. -func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc) { - ctx, f := context.WithDeadline(parent, deadline) - return ctx, CancelFunc(f) -} - -// WithTimeout returns WithDeadline(parent, time.Now().Add(timeout)). -// -// Canceling this context releases resources associated with it, so code should -// call cancel as soon as the operations running in this Context complete: -// -// func slowOperationWithTimeout(ctx context.Context) (Result, error) { -// ctx, cancel := context.WithTimeout(ctx, 100*time.Millisecond) -// defer cancel() // releases resources if slowOperation completes before timeout elapses -// return slowOperation(ctx) -// } -func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) { - return WithDeadline(parent, time.Now().Add(timeout)) -} - -// WithValue returns a copy of parent in which the value associated with key is -// val. -// -// Use context Values only for request-scoped data that transits processes and -// APIs, not for passing optional parameters to functions. -func WithValue(parent Context, key interface{}, val interface{}) Context { - return context.WithValue(parent, key, val) -} diff --git a/vendor/golang.org/x/net/context/pre_go17.go b/vendor/golang.org/x/net/context/pre_go17.go deleted file mode 100644 index 0f35592df..000000000 --- a/vendor/golang.org/x/net/context/pre_go17.go +++ /dev/null @@ -1,300 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !go1.7 - -package context - -import ( - "errors" - "fmt" - "sync" - "time" -) - -// An emptyCtx is never canceled, has no values, and has no deadline. It is not -// struct{}, since vars of this type must have distinct addresses. -type emptyCtx int - -func (*emptyCtx) Deadline() (deadline time.Time, ok bool) { - return -} - -func (*emptyCtx) Done() <-chan struct{} { - return nil -} - -func (*emptyCtx) Err() error { - return nil -} - -func (*emptyCtx) Value(key interface{}) interface{} { - return nil -} - -func (e *emptyCtx) String() string { - switch e { - case background: - return "context.Background" - case todo: - return "context.TODO" - } - return "unknown empty Context" -} - -var ( - background = new(emptyCtx) - todo = new(emptyCtx) -) - -// Canceled is the error returned by Context.Err when the context is canceled. -var Canceled = errors.New("context canceled") - -// DeadlineExceeded is the error returned by Context.Err when the context's -// deadline passes. -var DeadlineExceeded = errors.New("context deadline exceeded") - -// WithCancel returns a copy of parent with a new Done channel. The returned -// context's Done channel is closed when the returned cancel function is called -// or when the parent context's Done channel is closed, whichever happens first. -// -// Canceling this context releases resources associated with it, so code should -// call cancel as soon as the operations running in this Context complete. -func WithCancel(parent Context) (ctx Context, cancel CancelFunc) { - c := newCancelCtx(parent) - propagateCancel(parent, c) - return c, func() { c.cancel(true, Canceled) } -} - -// newCancelCtx returns an initialized cancelCtx. -func newCancelCtx(parent Context) *cancelCtx { - return &cancelCtx{ - Context: parent, - done: make(chan struct{}), - } -} - -// propagateCancel arranges for child to be canceled when parent is. -func propagateCancel(parent Context, child canceler) { - if parent.Done() == nil { - return // parent is never canceled - } - if p, ok := parentCancelCtx(parent); ok { - p.mu.Lock() - if p.err != nil { - // parent has already been canceled - child.cancel(false, p.err) - } else { - if p.children == nil { - p.children = make(map[canceler]bool) - } - p.children[child] = true - } - p.mu.Unlock() - } else { - go func() { - select { - case <-parent.Done(): - child.cancel(false, parent.Err()) - case <-child.Done(): - } - }() - } -} - -// parentCancelCtx follows a chain of parent references until it finds a -// *cancelCtx. This function understands how each of the concrete types in this -// package represents its parent. -func parentCancelCtx(parent Context) (*cancelCtx, bool) { - for { - switch c := parent.(type) { - case *cancelCtx: - return c, true - case *timerCtx: - return c.cancelCtx, true - case *valueCtx: - parent = c.Context - default: - return nil, false - } - } -} - -// removeChild removes a context from its parent. -func removeChild(parent Context, child canceler) { - p, ok := parentCancelCtx(parent) - if !ok { - return - } - p.mu.Lock() - if p.children != nil { - delete(p.children, child) - } - p.mu.Unlock() -} - -// A canceler is a context type that can be canceled directly. The -// implementations are *cancelCtx and *timerCtx. -type canceler interface { - cancel(removeFromParent bool, err error) - Done() <-chan struct{} -} - -// A cancelCtx can be canceled. When canceled, it also cancels any children -// that implement canceler. -type cancelCtx struct { - Context - - done chan struct{} // closed by the first cancel call. - - mu sync.Mutex - children map[canceler]bool // set to nil by the first cancel call - err error // set to non-nil by the first cancel call -} - -func (c *cancelCtx) Done() <-chan struct{} { - return c.done -} - -func (c *cancelCtx) Err() error { - c.mu.Lock() - defer c.mu.Unlock() - return c.err -} - -func (c *cancelCtx) String() string { - return fmt.Sprintf("%v.WithCancel", c.Context) -} - -// cancel closes c.done, cancels each of c's children, and, if -// removeFromParent is true, removes c from its parent's children. -func (c *cancelCtx) cancel(removeFromParent bool, err error) { - if err == nil { - panic("context: internal error: missing cancel error") - } - c.mu.Lock() - if c.err != nil { - c.mu.Unlock() - return // already canceled - } - c.err = err - close(c.done) - for child := range c.children { - // NOTE: acquiring the child's lock while holding parent's lock. - child.cancel(false, err) - } - c.children = nil - c.mu.Unlock() - - if removeFromParent { - removeChild(c.Context, c) - } -} - -// WithDeadline returns a copy of the parent context with the deadline adjusted -// to be no later than d. If the parent's deadline is already earlier than d, -// WithDeadline(parent, d) is semantically equivalent to parent. The returned -// context's Done channel is closed when the deadline expires, when the returned -// cancel function is called, or when the parent context's Done channel is -// closed, whichever happens first. -// -// Canceling this context releases resources associated with it, so code should -// call cancel as soon as the operations running in this Context complete. -func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc) { - if cur, ok := parent.Deadline(); ok && cur.Before(deadline) { - // The current deadline is already sooner than the new one. - return WithCancel(parent) - } - c := &timerCtx{ - cancelCtx: newCancelCtx(parent), - deadline: deadline, - } - propagateCancel(parent, c) - d := deadline.Sub(time.Now()) - if d <= 0 { - c.cancel(true, DeadlineExceeded) // deadline has already passed - return c, func() { c.cancel(true, Canceled) } - } - c.mu.Lock() - defer c.mu.Unlock() - if c.err == nil { - c.timer = time.AfterFunc(d, func() { - c.cancel(true, DeadlineExceeded) - }) - } - return c, func() { c.cancel(true, Canceled) } -} - -// A timerCtx carries a timer and a deadline. It embeds a cancelCtx to -// implement Done and Err. It implements cancel by stopping its timer then -// delegating to cancelCtx.cancel. -type timerCtx struct { - *cancelCtx - timer *time.Timer // Under cancelCtx.mu. - - deadline time.Time -} - -func (c *timerCtx) Deadline() (deadline time.Time, ok bool) { - return c.deadline, true -} - -func (c *timerCtx) String() string { - return fmt.Sprintf("%v.WithDeadline(%s [%s])", c.cancelCtx.Context, c.deadline, c.deadline.Sub(time.Now())) -} - -func (c *timerCtx) cancel(removeFromParent bool, err error) { - c.cancelCtx.cancel(false, err) - if removeFromParent { - // Remove this timerCtx from its parent cancelCtx's children. - removeChild(c.cancelCtx.Context, c) - } - c.mu.Lock() - if c.timer != nil { - c.timer.Stop() - c.timer = nil - } - c.mu.Unlock() -} - -// WithTimeout returns WithDeadline(parent, time.Now().Add(timeout)). -// -// Canceling this context releases resources associated with it, so code should -// call cancel as soon as the operations running in this Context complete: -// -// func slowOperationWithTimeout(ctx context.Context) (Result, error) { -// ctx, cancel := context.WithTimeout(ctx, 100*time.Millisecond) -// defer cancel() // releases resources if slowOperation completes before timeout elapses -// return slowOperation(ctx) -// } -func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) { - return WithDeadline(parent, time.Now().Add(timeout)) -} - -// WithValue returns a copy of parent in which the value associated with key is -// val. -// -// Use context Values only for request-scoped data that transits processes and -// APIs, not for passing optional parameters to functions. -func WithValue(parent Context, key interface{}, val interface{}) Context { - return &valueCtx{parent, key, val} -} - -// A valueCtx carries a key-value pair. It implements Value for that key and -// delegates all other calls to the embedded Context. -type valueCtx struct { - Context - key, val interface{} -} - -func (c *valueCtx) String() string { - return fmt.Sprintf("%v.WithValue(%#v, %#v)", c.Context, c.key, c.val) -} - -func (c *valueCtx) Value(key interface{}) interface{} { - if c.key == key { - return c.val - } - return c.Context.Value(key) -} diff --git a/vendor/golang.org/x/net/http2/Dockerfile b/vendor/golang.org/x/net/http2/Dockerfile deleted file mode 100644 index 53fc52579..000000000 --- a/vendor/golang.org/x/net/http2/Dockerfile +++ /dev/null @@ -1,51 +0,0 @@ -# -# This Dockerfile builds a recent curl with HTTP/2 client support, using -# a recent nghttp2 build. -# -# See the Makefile for how to tag it. If Docker and that image is found, the -# Go tests use this curl binary for integration tests. -# - -FROM ubuntu:trusty - -RUN apt-get update && \ - apt-get upgrade -y && \ - apt-get install -y git-core build-essential wget - -RUN apt-get install -y --no-install-recommends \ - autotools-dev libtool pkg-config zlib1g-dev \ - libcunit1-dev libssl-dev libxml2-dev libevent-dev \ - automake autoconf - -# The list of packages nghttp2 recommends for h2load: -RUN apt-get install -y --no-install-recommends make binutils \ - autoconf automake autotools-dev \ - libtool pkg-config zlib1g-dev libcunit1-dev libssl-dev libxml2-dev \ - libev-dev libevent-dev libjansson-dev libjemalloc-dev \ - cython python3.4-dev python-setuptools - -# Note: setting NGHTTP2_VER before the git clone, so an old git clone isn't cached: -ENV NGHTTP2_VER 895da9a -RUN cd /root && git clone https://github.com/tatsuhiro-t/nghttp2.git - -WORKDIR /root/nghttp2 -RUN git reset --hard $NGHTTP2_VER -RUN autoreconf -i -RUN automake -RUN autoconf -RUN ./configure -RUN make -RUN make install - -WORKDIR /root -RUN wget http://curl.haxx.se/download/curl-7.45.0.tar.gz -RUN tar -zxvf curl-7.45.0.tar.gz -WORKDIR /root/curl-7.45.0 -RUN ./configure --with-ssl --with-nghttp2=/usr/local -RUN make -RUN make install -RUN ldconfig - -CMD ["-h"] -ENTRYPOINT ["/usr/local/bin/curl"] - diff --git a/vendor/golang.org/x/net/http2/Makefile b/vendor/golang.org/x/net/http2/Makefile deleted file mode 100644 index 55fd826f7..000000000 --- a/vendor/golang.org/x/net/http2/Makefile +++ /dev/null @@ -1,3 +0,0 @@ -curlimage: - docker build -t gohttp2/curl . - diff --git a/vendor/golang.org/x/net/http2/README b/vendor/golang.org/x/net/http2/README deleted file mode 100644 index 360d5aa37..000000000 --- a/vendor/golang.org/x/net/http2/README +++ /dev/null @@ -1,20 +0,0 @@ -This is a work-in-progress HTTP/2 implementation for Go. - -It will eventually live in the Go standard library and won't require -any changes to your code to use. It will just be automatic. - -Status: - -* The server support is pretty good. A few things are missing - but are being worked on. -* The client work has just started but shares a lot of code - is coming along much quicker. - -Docs are at https://godoc.org/golang.org/x/net/http2 - -Demo test server at https://http2.golang.org/ - -Help & bug reports welcome! - -Contributing: https://golang.org/doc/contribute.html -Bugs: https://golang.org/issue/new?title=x/net/http2:+ diff --git a/vendor/golang.org/x/net/http2/ciphers.go b/vendor/golang.org/x/net/http2/ciphers.go deleted file mode 100644 index 698860b77..000000000 --- a/vendor/golang.org/x/net/http2/ciphers.go +++ /dev/null @@ -1,641 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package http2 - -// A list of the possible cipher suite ids. Taken from -// http://www.iana.org/assignments/tls-parameters/tls-parameters.txt - -const ( - cipher_TLS_NULL_WITH_NULL_NULL uint16 = 0x0000 - cipher_TLS_RSA_WITH_NULL_MD5 uint16 = 0x0001 - cipher_TLS_RSA_WITH_NULL_SHA uint16 = 0x0002 - cipher_TLS_RSA_EXPORT_WITH_RC4_40_MD5 uint16 = 0x0003 - cipher_TLS_RSA_WITH_RC4_128_MD5 uint16 = 0x0004 - cipher_TLS_RSA_WITH_RC4_128_SHA uint16 = 0x0005 - cipher_TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 uint16 = 0x0006 - cipher_TLS_RSA_WITH_IDEA_CBC_SHA uint16 = 0x0007 - cipher_TLS_RSA_EXPORT_WITH_DES40_CBC_SHA uint16 = 0x0008 - cipher_TLS_RSA_WITH_DES_CBC_SHA uint16 = 0x0009 - cipher_TLS_RSA_WITH_3DES_EDE_CBC_SHA uint16 = 0x000A - cipher_TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA uint16 = 0x000B - cipher_TLS_DH_DSS_WITH_DES_CBC_SHA uint16 = 0x000C - cipher_TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA uint16 = 0x000D - cipher_TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA uint16 = 0x000E - cipher_TLS_DH_RSA_WITH_DES_CBC_SHA uint16 = 0x000F - cipher_TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA uint16 = 0x0010 - cipher_TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA uint16 = 0x0011 - cipher_TLS_DHE_DSS_WITH_DES_CBC_SHA uint16 = 0x0012 - cipher_TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA uint16 = 0x0013 - cipher_TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA uint16 = 0x0014 - cipher_TLS_DHE_RSA_WITH_DES_CBC_SHA uint16 = 0x0015 - cipher_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA uint16 = 0x0016 - cipher_TLS_DH_anon_EXPORT_WITH_RC4_40_MD5 uint16 = 0x0017 - cipher_TLS_DH_anon_WITH_RC4_128_MD5 uint16 = 0x0018 - cipher_TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA uint16 = 0x0019 - cipher_TLS_DH_anon_WITH_DES_CBC_SHA uint16 = 0x001A - cipher_TLS_DH_anon_WITH_3DES_EDE_CBC_SHA uint16 = 0x001B - // Reserved uint16 = 0x001C-1D - cipher_TLS_KRB5_WITH_DES_CBC_SHA uint16 = 0x001E - cipher_TLS_KRB5_WITH_3DES_EDE_CBC_SHA uint16 = 0x001F - cipher_TLS_KRB5_WITH_RC4_128_SHA uint16 = 0x0020 - cipher_TLS_KRB5_WITH_IDEA_CBC_SHA uint16 = 0x0021 - cipher_TLS_KRB5_WITH_DES_CBC_MD5 uint16 = 0x0022 - cipher_TLS_KRB5_WITH_3DES_EDE_CBC_MD5 uint16 = 0x0023 - cipher_TLS_KRB5_WITH_RC4_128_MD5 uint16 = 0x0024 - cipher_TLS_KRB5_WITH_IDEA_CBC_MD5 uint16 = 0x0025 - cipher_TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA uint16 = 0x0026 - cipher_TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA uint16 = 0x0027 - cipher_TLS_KRB5_EXPORT_WITH_RC4_40_SHA uint16 = 0x0028 - cipher_TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5 uint16 = 0x0029 - cipher_TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5 uint16 = 0x002A - cipher_TLS_KRB5_EXPORT_WITH_RC4_40_MD5 uint16 = 0x002B - cipher_TLS_PSK_WITH_NULL_SHA uint16 = 0x002C - cipher_TLS_DHE_PSK_WITH_NULL_SHA uint16 = 0x002D - cipher_TLS_RSA_PSK_WITH_NULL_SHA uint16 = 0x002E - cipher_TLS_RSA_WITH_AES_128_CBC_SHA uint16 = 0x002F - cipher_TLS_DH_DSS_WITH_AES_128_CBC_SHA uint16 = 0x0030 - cipher_TLS_DH_RSA_WITH_AES_128_CBC_SHA uint16 = 0x0031 - cipher_TLS_DHE_DSS_WITH_AES_128_CBC_SHA uint16 = 0x0032 - cipher_TLS_DHE_RSA_WITH_AES_128_CBC_SHA uint16 = 0x0033 - cipher_TLS_DH_anon_WITH_AES_128_CBC_SHA uint16 = 0x0034 - cipher_TLS_RSA_WITH_AES_256_CBC_SHA uint16 = 0x0035 - cipher_TLS_DH_DSS_WITH_AES_256_CBC_SHA uint16 = 0x0036 - cipher_TLS_DH_RSA_WITH_AES_256_CBC_SHA uint16 = 0x0037 - cipher_TLS_DHE_DSS_WITH_AES_256_CBC_SHA uint16 = 0x0038 - cipher_TLS_DHE_RSA_WITH_AES_256_CBC_SHA uint16 = 0x0039 - cipher_TLS_DH_anon_WITH_AES_256_CBC_SHA uint16 = 0x003A - cipher_TLS_RSA_WITH_NULL_SHA256 uint16 = 0x003B - cipher_TLS_RSA_WITH_AES_128_CBC_SHA256 uint16 = 0x003C - cipher_TLS_RSA_WITH_AES_256_CBC_SHA256 uint16 = 0x003D - cipher_TLS_DH_DSS_WITH_AES_128_CBC_SHA256 uint16 = 0x003E - cipher_TLS_DH_RSA_WITH_AES_128_CBC_SHA256 uint16 = 0x003F - cipher_TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 uint16 = 0x0040 - cipher_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA uint16 = 0x0041 - cipher_TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA uint16 = 0x0042 - cipher_TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA uint16 = 0x0043 - cipher_TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA uint16 = 0x0044 - cipher_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA uint16 = 0x0045 - cipher_TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA uint16 = 0x0046 - // Reserved uint16 = 0x0047-4F - // Reserved uint16 = 0x0050-58 - // Reserved uint16 = 0x0059-5C - // Unassigned uint16 = 0x005D-5F - // Reserved uint16 = 0x0060-66 - cipher_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 uint16 = 0x0067 - cipher_TLS_DH_DSS_WITH_AES_256_CBC_SHA256 uint16 = 0x0068 - cipher_TLS_DH_RSA_WITH_AES_256_CBC_SHA256 uint16 = 0x0069 - cipher_TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 uint16 = 0x006A - cipher_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 uint16 = 0x006B - cipher_TLS_DH_anon_WITH_AES_128_CBC_SHA256 uint16 = 0x006C - cipher_TLS_DH_anon_WITH_AES_256_CBC_SHA256 uint16 = 0x006D - // Unassigned uint16 = 0x006E-83 - cipher_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA uint16 = 0x0084 - cipher_TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA uint16 = 0x0085 - cipher_TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA uint16 = 0x0086 - cipher_TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA uint16 = 0x0087 - cipher_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA uint16 = 0x0088 - cipher_TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA uint16 = 0x0089 - cipher_TLS_PSK_WITH_RC4_128_SHA uint16 = 0x008A - cipher_TLS_PSK_WITH_3DES_EDE_CBC_SHA uint16 = 0x008B - cipher_TLS_PSK_WITH_AES_128_CBC_SHA uint16 = 0x008C - cipher_TLS_PSK_WITH_AES_256_CBC_SHA uint16 = 0x008D - cipher_TLS_DHE_PSK_WITH_RC4_128_SHA uint16 = 0x008E - cipher_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA uint16 = 0x008F - cipher_TLS_DHE_PSK_WITH_AES_128_CBC_SHA uint16 = 0x0090 - cipher_TLS_DHE_PSK_WITH_AES_256_CBC_SHA uint16 = 0x0091 - cipher_TLS_RSA_PSK_WITH_RC4_128_SHA uint16 = 0x0092 - cipher_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA uint16 = 0x0093 - cipher_TLS_RSA_PSK_WITH_AES_128_CBC_SHA uint16 = 0x0094 - cipher_TLS_RSA_PSK_WITH_AES_256_CBC_SHA uint16 = 0x0095 - cipher_TLS_RSA_WITH_SEED_CBC_SHA uint16 = 0x0096 - cipher_TLS_DH_DSS_WITH_SEED_CBC_SHA uint16 = 0x0097 - cipher_TLS_DH_RSA_WITH_SEED_CBC_SHA uint16 = 0x0098 - cipher_TLS_DHE_DSS_WITH_SEED_CBC_SHA uint16 = 0x0099 - cipher_TLS_DHE_RSA_WITH_SEED_CBC_SHA uint16 = 0x009A - cipher_TLS_DH_anon_WITH_SEED_CBC_SHA uint16 = 0x009B - cipher_TLS_RSA_WITH_AES_128_GCM_SHA256 uint16 = 0x009C - cipher_TLS_RSA_WITH_AES_256_GCM_SHA384 uint16 = 0x009D - cipher_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 uint16 = 0x009E - cipher_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 uint16 = 0x009F - cipher_TLS_DH_RSA_WITH_AES_128_GCM_SHA256 uint16 = 0x00A0 - cipher_TLS_DH_RSA_WITH_AES_256_GCM_SHA384 uint16 = 0x00A1 - cipher_TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 uint16 = 0x00A2 - cipher_TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 uint16 = 0x00A3 - cipher_TLS_DH_DSS_WITH_AES_128_GCM_SHA256 uint16 = 0x00A4 - cipher_TLS_DH_DSS_WITH_AES_256_GCM_SHA384 uint16 = 0x00A5 - cipher_TLS_DH_anon_WITH_AES_128_GCM_SHA256 uint16 = 0x00A6 - cipher_TLS_DH_anon_WITH_AES_256_GCM_SHA384 uint16 = 0x00A7 - cipher_TLS_PSK_WITH_AES_128_GCM_SHA256 uint16 = 0x00A8 - cipher_TLS_PSK_WITH_AES_256_GCM_SHA384 uint16 = 0x00A9 - cipher_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 uint16 = 0x00AA - cipher_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 uint16 = 0x00AB - cipher_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 uint16 = 0x00AC - cipher_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 uint16 = 0x00AD - cipher_TLS_PSK_WITH_AES_128_CBC_SHA256 uint16 = 0x00AE - cipher_TLS_PSK_WITH_AES_256_CBC_SHA384 uint16 = 0x00AF - cipher_TLS_PSK_WITH_NULL_SHA256 uint16 = 0x00B0 - cipher_TLS_PSK_WITH_NULL_SHA384 uint16 = 0x00B1 - cipher_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 uint16 = 0x00B2 - cipher_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 uint16 = 0x00B3 - cipher_TLS_DHE_PSK_WITH_NULL_SHA256 uint16 = 0x00B4 - cipher_TLS_DHE_PSK_WITH_NULL_SHA384 uint16 = 0x00B5 - cipher_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 uint16 = 0x00B6 - cipher_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 uint16 = 0x00B7 - cipher_TLS_RSA_PSK_WITH_NULL_SHA256 uint16 = 0x00B8 - cipher_TLS_RSA_PSK_WITH_NULL_SHA384 uint16 = 0x00B9 - cipher_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0x00BA - cipher_TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0x00BB - cipher_TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0x00BC - cipher_TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0x00BD - cipher_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0x00BE - cipher_TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0x00BF - cipher_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 uint16 = 0x00C0 - cipher_TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256 uint16 = 0x00C1 - cipher_TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256 uint16 = 0x00C2 - cipher_TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256 uint16 = 0x00C3 - cipher_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 uint16 = 0x00C4 - cipher_TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256 uint16 = 0x00C5 - // Unassigned uint16 = 0x00C6-FE - cipher_TLS_EMPTY_RENEGOTIATION_INFO_SCSV uint16 = 0x00FF - // Unassigned uint16 = 0x01-55,* - cipher_TLS_FALLBACK_SCSV uint16 = 0x5600 - // Unassigned uint16 = 0x5601 - 0xC000 - cipher_TLS_ECDH_ECDSA_WITH_NULL_SHA uint16 = 0xC001 - cipher_TLS_ECDH_ECDSA_WITH_RC4_128_SHA uint16 = 0xC002 - cipher_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA uint16 = 0xC003 - cipher_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA uint16 = 0xC004 - cipher_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA uint16 = 0xC005 - cipher_TLS_ECDHE_ECDSA_WITH_NULL_SHA uint16 = 0xC006 - cipher_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA uint16 = 0xC007 - cipher_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA uint16 = 0xC008 - cipher_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA uint16 = 0xC009 - cipher_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA uint16 = 0xC00A - cipher_TLS_ECDH_RSA_WITH_NULL_SHA uint16 = 0xC00B - cipher_TLS_ECDH_RSA_WITH_RC4_128_SHA uint16 = 0xC00C - cipher_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA uint16 = 0xC00D - cipher_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA uint16 = 0xC00E - cipher_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA uint16 = 0xC00F - cipher_TLS_ECDHE_RSA_WITH_NULL_SHA uint16 = 0xC010 - cipher_TLS_ECDHE_RSA_WITH_RC4_128_SHA uint16 = 0xC011 - cipher_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA uint16 = 0xC012 - cipher_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA uint16 = 0xC013 - cipher_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA uint16 = 0xC014 - cipher_TLS_ECDH_anon_WITH_NULL_SHA uint16 = 0xC015 - cipher_TLS_ECDH_anon_WITH_RC4_128_SHA uint16 = 0xC016 - cipher_TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA uint16 = 0xC017 - cipher_TLS_ECDH_anon_WITH_AES_128_CBC_SHA uint16 = 0xC018 - cipher_TLS_ECDH_anon_WITH_AES_256_CBC_SHA uint16 = 0xC019 - cipher_TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA uint16 = 0xC01A - cipher_TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA uint16 = 0xC01B - cipher_TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA uint16 = 0xC01C - cipher_TLS_SRP_SHA_WITH_AES_128_CBC_SHA uint16 = 0xC01D - cipher_TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA uint16 = 0xC01E - cipher_TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA uint16 = 0xC01F - cipher_TLS_SRP_SHA_WITH_AES_256_CBC_SHA uint16 = 0xC020 - cipher_TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA uint16 = 0xC021 - cipher_TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA uint16 = 0xC022 - cipher_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 uint16 = 0xC023 - cipher_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 uint16 = 0xC024 - cipher_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 uint16 = 0xC025 - cipher_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 uint16 = 0xC026 - cipher_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 uint16 = 0xC027 - cipher_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 uint16 = 0xC028 - cipher_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 uint16 = 0xC029 - cipher_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 uint16 = 0xC02A - cipher_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 uint16 = 0xC02B - cipher_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 uint16 = 0xC02C - cipher_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 uint16 = 0xC02D - cipher_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 uint16 = 0xC02E - cipher_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 uint16 = 0xC02F - cipher_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 uint16 = 0xC030 - cipher_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 uint16 = 0xC031 - cipher_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 uint16 = 0xC032 - cipher_TLS_ECDHE_PSK_WITH_RC4_128_SHA uint16 = 0xC033 - cipher_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA uint16 = 0xC034 - cipher_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA uint16 = 0xC035 - cipher_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA uint16 = 0xC036 - cipher_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 uint16 = 0xC037 - cipher_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 uint16 = 0xC038 - cipher_TLS_ECDHE_PSK_WITH_NULL_SHA uint16 = 0xC039 - cipher_TLS_ECDHE_PSK_WITH_NULL_SHA256 uint16 = 0xC03A - cipher_TLS_ECDHE_PSK_WITH_NULL_SHA384 uint16 = 0xC03B - cipher_TLS_RSA_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC03C - cipher_TLS_RSA_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC03D - cipher_TLS_DH_DSS_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC03E - cipher_TLS_DH_DSS_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC03F - cipher_TLS_DH_RSA_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC040 - cipher_TLS_DH_RSA_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC041 - cipher_TLS_DHE_DSS_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC042 - cipher_TLS_DHE_DSS_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC043 - cipher_TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC044 - cipher_TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC045 - cipher_TLS_DH_anon_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC046 - cipher_TLS_DH_anon_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC047 - cipher_TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC048 - cipher_TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC049 - cipher_TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC04A - cipher_TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC04B - cipher_TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC04C - cipher_TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC04D - cipher_TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC04E - cipher_TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC04F - cipher_TLS_RSA_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC050 - cipher_TLS_RSA_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC051 - cipher_TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC052 - cipher_TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC053 - cipher_TLS_DH_RSA_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC054 - cipher_TLS_DH_RSA_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC055 - cipher_TLS_DHE_DSS_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC056 - cipher_TLS_DHE_DSS_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC057 - cipher_TLS_DH_DSS_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC058 - cipher_TLS_DH_DSS_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC059 - cipher_TLS_DH_anon_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC05A - cipher_TLS_DH_anon_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC05B - cipher_TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC05C - cipher_TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC05D - cipher_TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC05E - cipher_TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC05F - cipher_TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC060 - cipher_TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC061 - cipher_TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC062 - cipher_TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC063 - cipher_TLS_PSK_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC064 - cipher_TLS_PSK_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC065 - cipher_TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC066 - cipher_TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC067 - cipher_TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC068 - cipher_TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC069 - cipher_TLS_PSK_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC06A - cipher_TLS_PSK_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC06B - cipher_TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC06C - cipher_TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC06D - cipher_TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC06E - cipher_TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC06F - cipher_TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC070 - cipher_TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC071 - cipher_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0xC072 - cipher_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 uint16 = 0xC073 - cipher_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0xC074 - cipher_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 uint16 = 0xC075 - cipher_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0xC076 - cipher_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 uint16 = 0xC077 - cipher_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0xC078 - cipher_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 uint16 = 0xC079 - cipher_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC07A - cipher_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC07B - cipher_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC07C - cipher_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC07D - cipher_TLS_DH_RSA_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC07E - cipher_TLS_DH_RSA_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC07F - cipher_TLS_DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC080 - cipher_TLS_DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC081 - cipher_TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC082 - cipher_TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC083 - cipher_TLS_DH_anon_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC084 - cipher_TLS_DH_anon_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC085 - cipher_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC086 - cipher_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC087 - cipher_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC088 - cipher_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC089 - cipher_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC08A - cipher_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC08B - cipher_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC08C - cipher_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC08D - cipher_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC08E - cipher_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC08F - cipher_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC090 - cipher_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC091 - cipher_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC092 - cipher_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC093 - cipher_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0xC094 - cipher_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 uint16 = 0xC095 - cipher_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0xC096 - cipher_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 uint16 = 0xC097 - cipher_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0xC098 - cipher_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 uint16 = 0xC099 - cipher_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0xC09A - cipher_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 uint16 = 0xC09B - cipher_TLS_RSA_WITH_AES_128_CCM uint16 = 0xC09C - cipher_TLS_RSA_WITH_AES_256_CCM uint16 = 0xC09D - cipher_TLS_DHE_RSA_WITH_AES_128_CCM uint16 = 0xC09E - cipher_TLS_DHE_RSA_WITH_AES_256_CCM uint16 = 0xC09F - cipher_TLS_RSA_WITH_AES_128_CCM_8 uint16 = 0xC0A0 - cipher_TLS_RSA_WITH_AES_256_CCM_8 uint16 = 0xC0A1 - cipher_TLS_DHE_RSA_WITH_AES_128_CCM_8 uint16 = 0xC0A2 - cipher_TLS_DHE_RSA_WITH_AES_256_CCM_8 uint16 = 0xC0A3 - cipher_TLS_PSK_WITH_AES_128_CCM uint16 = 0xC0A4 - cipher_TLS_PSK_WITH_AES_256_CCM uint16 = 0xC0A5 - cipher_TLS_DHE_PSK_WITH_AES_128_CCM uint16 = 0xC0A6 - cipher_TLS_DHE_PSK_WITH_AES_256_CCM uint16 = 0xC0A7 - cipher_TLS_PSK_WITH_AES_128_CCM_8 uint16 = 0xC0A8 - cipher_TLS_PSK_WITH_AES_256_CCM_8 uint16 = 0xC0A9 - cipher_TLS_PSK_DHE_WITH_AES_128_CCM_8 uint16 = 0xC0AA - cipher_TLS_PSK_DHE_WITH_AES_256_CCM_8 uint16 = 0xC0AB - cipher_TLS_ECDHE_ECDSA_WITH_AES_128_CCM uint16 = 0xC0AC - cipher_TLS_ECDHE_ECDSA_WITH_AES_256_CCM uint16 = 0xC0AD - cipher_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 uint16 = 0xC0AE - cipher_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 uint16 = 0xC0AF - // Unassigned uint16 = 0xC0B0-FF - // Unassigned uint16 = 0xC1-CB,* - // Unassigned uint16 = 0xCC00-A7 - cipher_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 uint16 = 0xCCA8 - cipher_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 uint16 = 0xCCA9 - cipher_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 uint16 = 0xCCAA - cipher_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256 uint16 = 0xCCAB - cipher_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 uint16 = 0xCCAC - cipher_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256 uint16 = 0xCCAD - cipher_TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256 uint16 = 0xCCAE -) - -// isBadCipher reports whether the cipher is blacklisted by the HTTP/2 spec. -// References: -// https://tools.ietf.org/html/rfc7540#appendix-A -// Reject cipher suites from Appendix A. -// "This list includes those cipher suites that do not -// offer an ephemeral key exchange and those that are -// based on the TLS null, stream or block cipher type" -func isBadCipher(cipher uint16) bool { - switch cipher { - case cipher_TLS_NULL_WITH_NULL_NULL, - cipher_TLS_RSA_WITH_NULL_MD5, - cipher_TLS_RSA_WITH_NULL_SHA, - cipher_TLS_RSA_EXPORT_WITH_RC4_40_MD5, - cipher_TLS_RSA_WITH_RC4_128_MD5, - cipher_TLS_RSA_WITH_RC4_128_SHA, - cipher_TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5, - cipher_TLS_RSA_WITH_IDEA_CBC_SHA, - cipher_TLS_RSA_EXPORT_WITH_DES40_CBC_SHA, - cipher_TLS_RSA_WITH_DES_CBC_SHA, - cipher_TLS_RSA_WITH_3DES_EDE_CBC_SHA, - cipher_TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA, - cipher_TLS_DH_DSS_WITH_DES_CBC_SHA, - cipher_TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA, - cipher_TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA, - cipher_TLS_DH_RSA_WITH_DES_CBC_SHA, - cipher_TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA, - cipher_TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA, - cipher_TLS_DHE_DSS_WITH_DES_CBC_SHA, - cipher_TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA, - cipher_TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA, - cipher_TLS_DHE_RSA_WITH_DES_CBC_SHA, - cipher_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, - cipher_TLS_DH_anon_EXPORT_WITH_RC4_40_MD5, - cipher_TLS_DH_anon_WITH_RC4_128_MD5, - cipher_TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA, - cipher_TLS_DH_anon_WITH_DES_CBC_SHA, - cipher_TLS_DH_anon_WITH_3DES_EDE_CBC_SHA, - cipher_TLS_KRB5_WITH_DES_CBC_SHA, - cipher_TLS_KRB5_WITH_3DES_EDE_CBC_SHA, - cipher_TLS_KRB5_WITH_RC4_128_SHA, - cipher_TLS_KRB5_WITH_IDEA_CBC_SHA, - cipher_TLS_KRB5_WITH_DES_CBC_MD5, - cipher_TLS_KRB5_WITH_3DES_EDE_CBC_MD5, - cipher_TLS_KRB5_WITH_RC4_128_MD5, - cipher_TLS_KRB5_WITH_IDEA_CBC_MD5, - cipher_TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA, - cipher_TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA, - cipher_TLS_KRB5_EXPORT_WITH_RC4_40_SHA, - cipher_TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5, - cipher_TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5, - cipher_TLS_KRB5_EXPORT_WITH_RC4_40_MD5, - cipher_TLS_PSK_WITH_NULL_SHA, - cipher_TLS_DHE_PSK_WITH_NULL_SHA, - cipher_TLS_RSA_PSK_WITH_NULL_SHA, - cipher_TLS_RSA_WITH_AES_128_CBC_SHA, - cipher_TLS_DH_DSS_WITH_AES_128_CBC_SHA, - cipher_TLS_DH_RSA_WITH_AES_128_CBC_SHA, - cipher_TLS_DHE_DSS_WITH_AES_128_CBC_SHA, - cipher_TLS_DHE_RSA_WITH_AES_128_CBC_SHA, - cipher_TLS_DH_anon_WITH_AES_128_CBC_SHA, - cipher_TLS_RSA_WITH_AES_256_CBC_SHA, - cipher_TLS_DH_DSS_WITH_AES_256_CBC_SHA, - cipher_TLS_DH_RSA_WITH_AES_256_CBC_SHA, - cipher_TLS_DHE_DSS_WITH_AES_256_CBC_SHA, - cipher_TLS_DHE_RSA_WITH_AES_256_CBC_SHA, - cipher_TLS_DH_anon_WITH_AES_256_CBC_SHA, - cipher_TLS_RSA_WITH_NULL_SHA256, - cipher_TLS_RSA_WITH_AES_128_CBC_SHA256, - cipher_TLS_RSA_WITH_AES_256_CBC_SHA256, - cipher_TLS_DH_DSS_WITH_AES_128_CBC_SHA256, - cipher_TLS_DH_RSA_WITH_AES_128_CBC_SHA256, - cipher_TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, - cipher_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA, - cipher_TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA, - cipher_TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA, - cipher_TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA, - cipher_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA, - cipher_TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA, - cipher_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, - cipher_TLS_DH_DSS_WITH_AES_256_CBC_SHA256, - cipher_TLS_DH_RSA_WITH_AES_256_CBC_SHA256, - cipher_TLS_DHE_DSS_WITH_AES_256_CBC_SHA256, - cipher_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, - cipher_TLS_DH_anon_WITH_AES_128_CBC_SHA256, - cipher_TLS_DH_anon_WITH_AES_256_CBC_SHA256, - cipher_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA, - cipher_TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA, - cipher_TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA, - cipher_TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA, - cipher_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA, - cipher_TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA, - cipher_TLS_PSK_WITH_RC4_128_SHA, - cipher_TLS_PSK_WITH_3DES_EDE_CBC_SHA, - cipher_TLS_PSK_WITH_AES_128_CBC_SHA, - cipher_TLS_PSK_WITH_AES_256_CBC_SHA, - cipher_TLS_DHE_PSK_WITH_RC4_128_SHA, - cipher_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA, - cipher_TLS_DHE_PSK_WITH_AES_128_CBC_SHA, - cipher_TLS_DHE_PSK_WITH_AES_256_CBC_SHA, - cipher_TLS_RSA_PSK_WITH_RC4_128_SHA, - cipher_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA, - cipher_TLS_RSA_PSK_WITH_AES_128_CBC_SHA, - cipher_TLS_RSA_PSK_WITH_AES_256_CBC_SHA, - cipher_TLS_RSA_WITH_SEED_CBC_SHA, - cipher_TLS_DH_DSS_WITH_SEED_CBC_SHA, - cipher_TLS_DH_RSA_WITH_SEED_CBC_SHA, - cipher_TLS_DHE_DSS_WITH_SEED_CBC_SHA, - cipher_TLS_DHE_RSA_WITH_SEED_CBC_SHA, - cipher_TLS_DH_anon_WITH_SEED_CBC_SHA, - cipher_TLS_RSA_WITH_AES_128_GCM_SHA256, - cipher_TLS_RSA_WITH_AES_256_GCM_SHA384, - cipher_TLS_DH_RSA_WITH_AES_128_GCM_SHA256, - cipher_TLS_DH_RSA_WITH_AES_256_GCM_SHA384, - cipher_TLS_DH_DSS_WITH_AES_128_GCM_SHA256, - cipher_TLS_DH_DSS_WITH_AES_256_GCM_SHA384, - cipher_TLS_DH_anon_WITH_AES_128_GCM_SHA256, - cipher_TLS_DH_anon_WITH_AES_256_GCM_SHA384, - cipher_TLS_PSK_WITH_AES_128_GCM_SHA256, - cipher_TLS_PSK_WITH_AES_256_GCM_SHA384, - cipher_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256, - cipher_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384, - cipher_TLS_PSK_WITH_AES_128_CBC_SHA256, - cipher_TLS_PSK_WITH_AES_256_CBC_SHA384, - cipher_TLS_PSK_WITH_NULL_SHA256, - cipher_TLS_PSK_WITH_NULL_SHA384, - cipher_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256, - cipher_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384, - cipher_TLS_DHE_PSK_WITH_NULL_SHA256, - cipher_TLS_DHE_PSK_WITH_NULL_SHA384, - cipher_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256, - cipher_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384, - cipher_TLS_RSA_PSK_WITH_NULL_SHA256, - cipher_TLS_RSA_PSK_WITH_NULL_SHA384, - cipher_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256, - cipher_TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256, - cipher_TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256, - cipher_TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256, - cipher_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256, - cipher_TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256, - cipher_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256, - cipher_TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256, - cipher_TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256, - cipher_TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256, - cipher_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256, - cipher_TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256, - cipher_TLS_EMPTY_RENEGOTIATION_INFO_SCSV, - cipher_TLS_ECDH_ECDSA_WITH_NULL_SHA, - cipher_TLS_ECDH_ECDSA_WITH_RC4_128_SHA, - cipher_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, - cipher_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, - cipher_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA, - cipher_TLS_ECDHE_ECDSA_WITH_NULL_SHA, - cipher_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, - cipher_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, - cipher_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, - cipher_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, - cipher_TLS_ECDH_RSA_WITH_NULL_SHA, - cipher_TLS_ECDH_RSA_WITH_RC4_128_SHA, - cipher_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, - cipher_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, - cipher_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA, - cipher_TLS_ECDHE_RSA_WITH_NULL_SHA, - cipher_TLS_ECDHE_RSA_WITH_RC4_128_SHA, - cipher_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, - cipher_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, - cipher_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, - cipher_TLS_ECDH_anon_WITH_NULL_SHA, - cipher_TLS_ECDH_anon_WITH_RC4_128_SHA, - cipher_TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA, - cipher_TLS_ECDH_anon_WITH_AES_128_CBC_SHA, - cipher_TLS_ECDH_anon_WITH_AES_256_CBC_SHA, - cipher_TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA, - cipher_TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA, - cipher_TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA, - cipher_TLS_SRP_SHA_WITH_AES_128_CBC_SHA, - cipher_TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA, - cipher_TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA, - cipher_TLS_SRP_SHA_WITH_AES_256_CBC_SHA, - cipher_TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA, - cipher_TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA, - cipher_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, - cipher_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, - cipher_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256, - cipher_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384, - cipher_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, - cipher_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, - cipher_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256, - cipher_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384, - cipher_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256, - cipher_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384, - cipher_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256, - cipher_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384, - cipher_TLS_ECDHE_PSK_WITH_RC4_128_SHA, - cipher_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA, - cipher_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA, - cipher_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA, - cipher_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256, - cipher_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384, - cipher_TLS_ECDHE_PSK_WITH_NULL_SHA, - cipher_TLS_ECDHE_PSK_WITH_NULL_SHA256, - cipher_TLS_ECDHE_PSK_WITH_NULL_SHA384, - cipher_TLS_RSA_WITH_ARIA_128_CBC_SHA256, - cipher_TLS_RSA_WITH_ARIA_256_CBC_SHA384, - cipher_TLS_DH_DSS_WITH_ARIA_128_CBC_SHA256, - cipher_TLS_DH_DSS_WITH_ARIA_256_CBC_SHA384, - cipher_TLS_DH_RSA_WITH_ARIA_128_CBC_SHA256, - cipher_TLS_DH_RSA_WITH_ARIA_256_CBC_SHA384, - cipher_TLS_DHE_DSS_WITH_ARIA_128_CBC_SHA256, - cipher_TLS_DHE_DSS_WITH_ARIA_256_CBC_SHA384, - cipher_TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256, - cipher_TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384, - cipher_TLS_DH_anon_WITH_ARIA_128_CBC_SHA256, - cipher_TLS_DH_anon_WITH_ARIA_256_CBC_SHA384, - cipher_TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256, - cipher_TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384, - cipher_TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256, - cipher_TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384, - cipher_TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256, - cipher_TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384, - cipher_TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256, - cipher_TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384, - cipher_TLS_RSA_WITH_ARIA_128_GCM_SHA256, - cipher_TLS_RSA_WITH_ARIA_256_GCM_SHA384, - cipher_TLS_DH_RSA_WITH_ARIA_128_GCM_SHA256, - cipher_TLS_DH_RSA_WITH_ARIA_256_GCM_SHA384, - cipher_TLS_DH_DSS_WITH_ARIA_128_GCM_SHA256, - cipher_TLS_DH_DSS_WITH_ARIA_256_GCM_SHA384, - cipher_TLS_DH_anon_WITH_ARIA_128_GCM_SHA256, - cipher_TLS_DH_anon_WITH_ARIA_256_GCM_SHA384, - cipher_TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256, - cipher_TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384, - cipher_TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256, - cipher_TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384, - cipher_TLS_PSK_WITH_ARIA_128_CBC_SHA256, - cipher_TLS_PSK_WITH_ARIA_256_CBC_SHA384, - cipher_TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256, - cipher_TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384, - cipher_TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256, - cipher_TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384, - cipher_TLS_PSK_WITH_ARIA_128_GCM_SHA256, - cipher_TLS_PSK_WITH_ARIA_256_GCM_SHA384, - cipher_TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256, - cipher_TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384, - cipher_TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256, - cipher_TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384, - cipher_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256, - cipher_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384, - cipher_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256, - cipher_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384, - cipher_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256, - cipher_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384, - cipher_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256, - cipher_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384, - cipher_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256, - cipher_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384, - cipher_TLS_DH_RSA_WITH_CAMELLIA_128_GCM_SHA256, - cipher_TLS_DH_RSA_WITH_CAMELLIA_256_GCM_SHA384, - cipher_TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256, - cipher_TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384, - cipher_TLS_DH_anon_WITH_CAMELLIA_128_GCM_SHA256, - cipher_TLS_DH_anon_WITH_CAMELLIA_256_GCM_SHA384, - cipher_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256, - cipher_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384, - cipher_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256, - cipher_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384, - cipher_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256, - cipher_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384, - cipher_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256, - cipher_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384, - cipher_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256, - cipher_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384, - cipher_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256, - cipher_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384, - cipher_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256, - cipher_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384, - cipher_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256, - cipher_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384, - cipher_TLS_RSA_WITH_AES_128_CCM, - cipher_TLS_RSA_WITH_AES_256_CCM, - cipher_TLS_RSA_WITH_AES_128_CCM_8, - cipher_TLS_RSA_WITH_AES_256_CCM_8, - cipher_TLS_PSK_WITH_AES_128_CCM, - cipher_TLS_PSK_WITH_AES_256_CCM, - cipher_TLS_PSK_WITH_AES_128_CCM_8, - cipher_TLS_PSK_WITH_AES_256_CCM_8: - return true - default: - return false - } -} diff --git a/vendor/golang.org/x/net/http2/client_conn_pool.go b/vendor/golang.org/x/net/http2/client_conn_pool.go deleted file mode 100644 index bdf5652b0..000000000 --- a/vendor/golang.org/x/net/http2/client_conn_pool.go +++ /dev/null @@ -1,256 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Transport code's client connection pooling. - -package http2 - -import ( - "crypto/tls" - "net/http" - "sync" -) - -// ClientConnPool manages a pool of HTTP/2 client connections. -type ClientConnPool interface { - GetClientConn(req *http.Request, addr string) (*ClientConn, error) - MarkDead(*ClientConn) -} - -// clientConnPoolIdleCloser is the interface implemented by ClientConnPool -// implementations which can close their idle connections. -type clientConnPoolIdleCloser interface { - ClientConnPool - closeIdleConnections() -} - -var ( - _ clientConnPoolIdleCloser = (*clientConnPool)(nil) - _ clientConnPoolIdleCloser = noDialClientConnPool{} -) - -// TODO: use singleflight for dialing and addConnCalls? -type clientConnPool struct { - t *Transport - - mu sync.Mutex // TODO: maybe switch to RWMutex - // TODO: add support for sharing conns based on cert names - // (e.g. share conn for googleapis.com and appspot.com) - conns map[string][]*ClientConn // key is host:port - dialing map[string]*dialCall // currently in-flight dials - keys map[*ClientConn][]string - addConnCalls map[string]*addConnCall // in-flight addConnIfNeede calls -} - -func (p *clientConnPool) GetClientConn(req *http.Request, addr string) (*ClientConn, error) { - return p.getClientConn(req, addr, dialOnMiss) -} - -const ( - dialOnMiss = true - noDialOnMiss = false -) - -func (p *clientConnPool) getClientConn(req *http.Request, addr string, dialOnMiss bool) (*ClientConn, error) { - if isConnectionCloseRequest(req) && dialOnMiss { - // It gets its own connection. - const singleUse = true - cc, err := p.t.dialClientConn(addr, singleUse) - if err != nil { - return nil, err - } - return cc, nil - } - p.mu.Lock() - for _, cc := range p.conns[addr] { - if cc.CanTakeNewRequest() { - p.mu.Unlock() - return cc, nil - } - } - if !dialOnMiss { - p.mu.Unlock() - return nil, ErrNoCachedConn - } - call := p.getStartDialLocked(addr) - p.mu.Unlock() - <-call.done - return call.res, call.err -} - -// dialCall is an in-flight Transport dial call to a host. -type dialCall struct { - p *clientConnPool - done chan struct{} // closed when done - res *ClientConn // valid after done is closed - err error // valid after done is closed -} - -// requires p.mu is held. -func (p *clientConnPool) getStartDialLocked(addr string) *dialCall { - if call, ok := p.dialing[addr]; ok { - // A dial is already in-flight. Don't start another. - return call - } - call := &dialCall{p: p, done: make(chan struct{})} - if p.dialing == nil { - p.dialing = make(map[string]*dialCall) - } - p.dialing[addr] = call - go call.dial(addr) - return call -} - -// run in its own goroutine. -func (c *dialCall) dial(addr string) { - const singleUse = false // shared conn - c.res, c.err = c.p.t.dialClientConn(addr, singleUse) - close(c.done) - - c.p.mu.Lock() - delete(c.p.dialing, addr) - if c.err == nil { - c.p.addConnLocked(addr, c.res) - } - c.p.mu.Unlock() -} - -// addConnIfNeeded makes a NewClientConn out of c if a connection for key doesn't -// already exist. It coalesces concurrent calls with the same key. -// This is used by the http1 Transport code when it creates a new connection. Because -// the http1 Transport doesn't de-dup TCP dials to outbound hosts (because it doesn't know -// the protocol), it can get into a situation where it has multiple TLS connections. -// This code decides which ones live or die. -// The return value used is whether c was used. -// c is never closed. -func (p *clientConnPool) addConnIfNeeded(key string, t *Transport, c *tls.Conn) (used bool, err error) { - p.mu.Lock() - for _, cc := range p.conns[key] { - if cc.CanTakeNewRequest() { - p.mu.Unlock() - return false, nil - } - } - call, dup := p.addConnCalls[key] - if !dup { - if p.addConnCalls == nil { - p.addConnCalls = make(map[string]*addConnCall) - } - call = &addConnCall{ - p: p, - done: make(chan struct{}), - } - p.addConnCalls[key] = call - go call.run(t, key, c) - } - p.mu.Unlock() - - <-call.done - if call.err != nil { - return false, call.err - } - return !dup, nil -} - -type addConnCall struct { - p *clientConnPool - done chan struct{} // closed when done - err error -} - -func (c *addConnCall) run(t *Transport, key string, tc *tls.Conn) { - cc, err := t.NewClientConn(tc) - - p := c.p - p.mu.Lock() - if err != nil { - c.err = err - } else { - p.addConnLocked(key, cc) - } - delete(p.addConnCalls, key) - p.mu.Unlock() - close(c.done) -} - -func (p *clientConnPool) addConn(key string, cc *ClientConn) { - p.mu.Lock() - p.addConnLocked(key, cc) - p.mu.Unlock() -} - -// p.mu must be held -func (p *clientConnPool) addConnLocked(key string, cc *ClientConn) { - for _, v := range p.conns[key] { - if v == cc { - return - } - } - if p.conns == nil { - p.conns = make(map[string][]*ClientConn) - } - if p.keys == nil { - p.keys = make(map[*ClientConn][]string) - } - p.conns[key] = append(p.conns[key], cc) - p.keys[cc] = append(p.keys[cc], key) -} - -func (p *clientConnPool) MarkDead(cc *ClientConn) { - p.mu.Lock() - defer p.mu.Unlock() - for _, key := range p.keys[cc] { - vv, ok := p.conns[key] - if !ok { - continue - } - newList := filterOutClientConn(vv, cc) - if len(newList) > 0 { - p.conns[key] = newList - } else { - delete(p.conns, key) - } - } - delete(p.keys, cc) -} - -func (p *clientConnPool) closeIdleConnections() { - p.mu.Lock() - defer p.mu.Unlock() - // TODO: don't close a cc if it was just added to the pool - // milliseconds ago and has never been used. There's currently - // a small race window with the HTTP/1 Transport's integration - // where it can add an idle conn just before using it, and - // somebody else can concurrently call CloseIdleConns and - // break some caller's RoundTrip. - for _, vv := range p.conns { - for _, cc := range vv { - cc.closeIfIdle() - } - } -} - -func filterOutClientConn(in []*ClientConn, exclude *ClientConn) []*ClientConn { - out := in[:0] - for _, v := range in { - if v != exclude { - out = append(out, v) - } - } - // If we filtered it out, zero out the last item to prevent - // the GC from seeing it. - if len(in) != len(out) { - in[len(in)-1] = nil - } - return out -} - -// noDialClientConnPool is an implementation of http2.ClientConnPool -// which never dials. We let the HTTP/1.1 client dial and use its TLS -// connection instead. -type noDialClientConnPool struct{ *clientConnPool } - -func (p noDialClientConnPool) GetClientConn(req *http.Request, addr string) (*ClientConn, error) { - return p.getClientConn(req, addr, noDialOnMiss) -} diff --git a/vendor/golang.org/x/net/http2/configure_transport.go b/vendor/golang.org/x/net/http2/configure_transport.go deleted file mode 100644 index 4f720f530..000000000 --- a/vendor/golang.org/x/net/http2/configure_transport.go +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build go1.6 - -package http2 - -import ( - "crypto/tls" - "fmt" - "net/http" -) - -func configureTransport(t1 *http.Transport) (*Transport, error) { - connPool := new(clientConnPool) - t2 := &Transport{ - ConnPool: noDialClientConnPool{connPool}, - t1: t1, - } - connPool.t = t2 - if err := registerHTTPSProtocol(t1, noDialH2RoundTripper{t2}); err != nil { - return nil, err - } - if t1.TLSClientConfig == nil { - t1.TLSClientConfig = new(tls.Config) - } - if !strSliceContains(t1.TLSClientConfig.NextProtos, "h2") { - t1.TLSClientConfig.NextProtos = append([]string{"h2"}, t1.TLSClientConfig.NextProtos...) - } - if !strSliceContains(t1.TLSClientConfig.NextProtos, "http/1.1") { - t1.TLSClientConfig.NextProtos = append(t1.TLSClientConfig.NextProtos, "http/1.1") - } - upgradeFn := func(authority string, c *tls.Conn) http.RoundTripper { - addr := authorityAddr("https", authority) - if used, err := connPool.addConnIfNeeded(addr, t2, c); err != nil { - go c.Close() - return erringRoundTripper{err} - } else if !used { - // Turns out we don't need this c. - // For example, two goroutines made requests to the same host - // at the same time, both kicking off TCP dials. (since protocol - // was unknown) - go c.Close() - } - return t2 - } - if m := t1.TLSNextProto; len(m) == 0 { - t1.TLSNextProto = map[string]func(string, *tls.Conn) http.RoundTripper{ - "h2": upgradeFn, - } - } else { - m["h2"] = upgradeFn - } - return t2, nil -} - -// registerHTTPSProtocol calls Transport.RegisterProtocol but -// convering panics into errors. -func registerHTTPSProtocol(t *http.Transport, rt http.RoundTripper) (err error) { - defer func() { - if e := recover(); e != nil { - err = fmt.Errorf("%v", e) - } - }() - t.RegisterProtocol("https", rt) - return nil -} - -// noDialH2RoundTripper is a RoundTripper which only tries to complete the request -// if there's already has a cached connection to the host. -type noDialH2RoundTripper struct{ t *Transport } - -func (rt noDialH2RoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { - res, err := rt.t.RoundTrip(req) - if err == ErrNoCachedConn { - return nil, http.ErrSkipAltProtocol - } - return res, err -} diff --git a/vendor/golang.org/x/net/http2/databuffer.go b/vendor/golang.org/x/net/http2/databuffer.go deleted file mode 100644 index a3067f8de..000000000 --- a/vendor/golang.org/x/net/http2/databuffer.go +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package http2 - -import ( - "errors" - "fmt" - "sync" -) - -// Buffer chunks are allocated from a pool to reduce pressure on GC. -// The maximum wasted space per dataBuffer is 2x the largest size class, -// which happens when the dataBuffer has multiple chunks and there is -// one unread byte in both the first and last chunks. We use a few size -// classes to minimize overheads for servers that typically receive very -// small request bodies. -// -// TODO: Benchmark to determine if the pools are necessary. The GC may have -// improved enough that we can instead allocate chunks like this: -// make([]byte, max(16<<10, expectedBytesRemaining)) -var ( - dataChunkSizeClasses = []int{ - 1 << 10, - 2 << 10, - 4 << 10, - 8 << 10, - 16 << 10, - } - dataChunkPools = [...]sync.Pool{ - {New: func() interface{} { return make([]byte, 1<<10) }}, - {New: func() interface{} { return make([]byte, 2<<10) }}, - {New: func() interface{} { return make([]byte, 4<<10) }}, - {New: func() interface{} { return make([]byte, 8<<10) }}, - {New: func() interface{} { return make([]byte, 16<<10) }}, - } -) - -func getDataBufferChunk(size int64) []byte { - i := 0 - for ; i < len(dataChunkSizeClasses)-1; i++ { - if size <= int64(dataChunkSizeClasses[i]) { - break - } - } - return dataChunkPools[i].Get().([]byte) -} - -func putDataBufferChunk(p []byte) { - for i, n := range dataChunkSizeClasses { - if len(p) == n { - dataChunkPools[i].Put(p) - return - } - } - panic(fmt.Sprintf("unexpected buffer len=%v", len(p))) -} - -// dataBuffer is an io.ReadWriter backed by a list of data chunks. -// Each dataBuffer is used to read DATA frames on a single stream. -// The buffer is divided into chunks so the server can limit the -// total memory used by a single connection without limiting the -// request body size on any single stream. -type dataBuffer struct { - chunks [][]byte - r int // next byte to read is chunks[0][r] - w int // next byte to write is chunks[len(chunks)-1][w] - size int // total buffered bytes - expected int64 // we expect at least this many bytes in future Write calls (ignored if <= 0) -} - -var errReadEmpty = errors.New("read from empty dataBuffer") - -// Read copies bytes from the buffer into p. -// It is an error to read when no data is available. -func (b *dataBuffer) Read(p []byte) (int, error) { - if b.size == 0 { - return 0, errReadEmpty - } - var ntotal int - for len(p) > 0 && b.size > 0 { - readFrom := b.bytesFromFirstChunk() - n := copy(p, readFrom) - p = p[n:] - ntotal += n - b.r += n - b.size -= n - // If the first chunk has been consumed, advance to the next chunk. - if b.r == len(b.chunks[0]) { - putDataBufferChunk(b.chunks[0]) - end := len(b.chunks) - 1 - copy(b.chunks[:end], b.chunks[1:]) - b.chunks[end] = nil - b.chunks = b.chunks[:end] - b.r = 0 - } - } - return ntotal, nil -} - -func (b *dataBuffer) bytesFromFirstChunk() []byte { - if len(b.chunks) == 1 { - return b.chunks[0][b.r:b.w] - } - return b.chunks[0][b.r:] -} - -// Len returns the number of bytes of the unread portion of the buffer. -func (b *dataBuffer) Len() int { - return b.size -} - -// Write appends p to the buffer. -func (b *dataBuffer) Write(p []byte) (int, error) { - ntotal := len(p) - for len(p) > 0 { - // If the last chunk is empty, allocate a new chunk. Try to allocate - // enough to fully copy p plus any additional bytes we expect to - // receive. However, this may allocate less than len(p). - want := int64(len(p)) - if b.expected > want { - want = b.expected - } - chunk := b.lastChunkOrAlloc(want) - n := copy(chunk[b.w:], p) - p = p[n:] - b.w += n - b.size += n - b.expected -= int64(n) - } - return ntotal, nil -} - -func (b *dataBuffer) lastChunkOrAlloc(want int64) []byte { - if len(b.chunks) != 0 { - last := b.chunks[len(b.chunks)-1] - if b.w < len(last) { - return last - } - } - chunk := getDataBufferChunk(want) - b.chunks = append(b.chunks, chunk) - b.w = 0 - return chunk -} diff --git a/vendor/golang.org/x/net/http2/errors.go b/vendor/golang.org/x/net/http2/errors.go deleted file mode 100644 index 20fd7626a..000000000 --- a/vendor/golang.org/x/net/http2/errors.go +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package http2 - -import ( - "errors" - "fmt" -) - -// An ErrCode is an unsigned 32-bit error code as defined in the HTTP/2 spec. -type ErrCode uint32 - -const ( - ErrCodeNo ErrCode = 0x0 - ErrCodeProtocol ErrCode = 0x1 - ErrCodeInternal ErrCode = 0x2 - ErrCodeFlowControl ErrCode = 0x3 - ErrCodeSettingsTimeout ErrCode = 0x4 - ErrCodeStreamClosed ErrCode = 0x5 - ErrCodeFrameSize ErrCode = 0x6 - ErrCodeRefusedStream ErrCode = 0x7 - ErrCodeCancel ErrCode = 0x8 - ErrCodeCompression ErrCode = 0x9 - ErrCodeConnect ErrCode = 0xa - ErrCodeEnhanceYourCalm ErrCode = 0xb - ErrCodeInadequateSecurity ErrCode = 0xc - ErrCodeHTTP11Required ErrCode = 0xd -) - -var errCodeName = map[ErrCode]string{ - ErrCodeNo: "NO_ERROR", - ErrCodeProtocol: "PROTOCOL_ERROR", - ErrCodeInternal: "INTERNAL_ERROR", - ErrCodeFlowControl: "FLOW_CONTROL_ERROR", - ErrCodeSettingsTimeout: "SETTINGS_TIMEOUT", - ErrCodeStreamClosed: "STREAM_CLOSED", - ErrCodeFrameSize: "FRAME_SIZE_ERROR", - ErrCodeRefusedStream: "REFUSED_STREAM", - ErrCodeCancel: "CANCEL", - ErrCodeCompression: "COMPRESSION_ERROR", - ErrCodeConnect: "CONNECT_ERROR", - ErrCodeEnhanceYourCalm: "ENHANCE_YOUR_CALM", - ErrCodeInadequateSecurity: "INADEQUATE_SECURITY", - ErrCodeHTTP11Required: "HTTP_1_1_REQUIRED", -} - -func (e ErrCode) String() string { - if s, ok := errCodeName[e]; ok { - return s - } - return fmt.Sprintf("unknown error code 0x%x", uint32(e)) -} - -// ConnectionError is an error that results in the termination of the -// entire connection. -type ConnectionError ErrCode - -func (e ConnectionError) Error() string { return fmt.Sprintf("connection error: %s", ErrCode(e)) } - -// StreamError is an error that only affects one stream within an -// HTTP/2 connection. -type StreamError struct { - StreamID uint32 - Code ErrCode - Cause error // optional additional detail -} - -func streamError(id uint32, code ErrCode) StreamError { - return StreamError{StreamID: id, Code: code} -} - -func (e StreamError) Error() string { - if e.Cause != nil { - return fmt.Sprintf("stream error: stream ID %d; %v; %v", e.StreamID, e.Code, e.Cause) - } - return fmt.Sprintf("stream error: stream ID %d; %v", e.StreamID, e.Code) -} - -// 6.9.1 The Flow Control Window -// "If a sender receives a WINDOW_UPDATE that causes a flow control -// window to exceed this maximum it MUST terminate either the stream -// or the connection, as appropriate. For streams, [...]; for the -// connection, a GOAWAY frame with a FLOW_CONTROL_ERROR code." -type goAwayFlowError struct{} - -func (goAwayFlowError) Error() string { return "connection exceeded flow control window size" } - -// connErrorReason wraps a ConnectionError with an informative error about why it occurs. - -// Errors of this type are only returned by the frame parser functions -// and converted into ConnectionError(ErrCodeProtocol). -type connError struct { - Code ErrCode - Reason string -} - -func (e connError) Error() string { - return fmt.Sprintf("http2: connection error: %v: %v", e.Code, e.Reason) -} - -type pseudoHeaderError string - -func (e pseudoHeaderError) Error() string { - return fmt.Sprintf("invalid pseudo-header %q", string(e)) -} - -type duplicatePseudoHeaderError string - -func (e duplicatePseudoHeaderError) Error() string { - return fmt.Sprintf("duplicate pseudo-header %q", string(e)) -} - -type headerFieldNameError string - -func (e headerFieldNameError) Error() string { - return fmt.Sprintf("invalid header field name %q", string(e)) -} - -type headerFieldValueError string - -func (e headerFieldValueError) Error() string { - return fmt.Sprintf("invalid header field value %q", string(e)) -} - -var ( - errMixPseudoHeaderTypes = errors.New("mix of request and response pseudo headers") - errPseudoAfterRegular = errors.New("pseudo header field after regular") -) diff --git a/vendor/golang.org/x/net/http2/flow.go b/vendor/golang.org/x/net/http2/flow.go deleted file mode 100644 index 957de2542..000000000 --- a/vendor/golang.org/x/net/http2/flow.go +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Flow control - -package http2 - -// flow is the flow control window's size. -type flow struct { - // n is the number of DATA bytes we're allowed to send. - // A flow is kept both on a conn and a per-stream. - n int32 - - // conn points to the shared connection-level flow that is - // shared by all streams on that conn. It is nil for the flow - // that's on the conn directly. - conn *flow -} - -func (f *flow) setConnFlow(cf *flow) { f.conn = cf } - -func (f *flow) available() int32 { - n := f.n - if f.conn != nil && f.conn.n < n { - n = f.conn.n - } - return n -} - -func (f *flow) take(n int32) { - if n > f.available() { - panic("internal error: took too much") - } - f.n -= n - if f.conn != nil { - f.conn.n -= n - } -} - -// add adds n bytes (positive or negative) to the flow control window. -// It returns false if the sum would exceed 2^31-1. -func (f *flow) add(n int32) bool { - remain := (1<<31 - 1) - f.n - if n > remain { - return false - } - f.n += n - return true -} diff --git a/vendor/golang.org/x/net/http2/frame.go b/vendor/golang.org/x/net/http2/frame.go deleted file mode 100644 index 3b1489072..000000000 --- a/vendor/golang.org/x/net/http2/frame.go +++ /dev/null @@ -1,1579 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package http2 - -import ( - "bytes" - "encoding/binary" - "errors" - "fmt" - "io" - "log" - "strings" - "sync" - - "golang.org/x/net/http2/hpack" - "golang.org/x/net/lex/httplex" -) - -const frameHeaderLen = 9 - -var padZeros = make([]byte, 255) // zeros for padding - -// A FrameType is a registered frame type as defined in -// http://http2.github.io/http2-spec/#rfc.section.11.2 -type FrameType uint8 - -const ( - FrameData FrameType = 0x0 - FrameHeaders FrameType = 0x1 - FramePriority FrameType = 0x2 - FrameRSTStream FrameType = 0x3 - FrameSettings FrameType = 0x4 - FramePushPromise FrameType = 0x5 - FramePing FrameType = 0x6 - FrameGoAway FrameType = 0x7 - FrameWindowUpdate FrameType = 0x8 - FrameContinuation FrameType = 0x9 -) - -var frameName = map[FrameType]string{ - FrameData: "DATA", - FrameHeaders: "HEADERS", - FramePriority: "PRIORITY", - FrameRSTStream: "RST_STREAM", - FrameSettings: "SETTINGS", - FramePushPromise: "PUSH_PROMISE", - FramePing: "PING", - FrameGoAway: "GOAWAY", - FrameWindowUpdate: "WINDOW_UPDATE", - FrameContinuation: "CONTINUATION", -} - -func (t FrameType) String() string { - if s, ok := frameName[t]; ok { - return s - } - return fmt.Sprintf("UNKNOWN_FRAME_TYPE_%d", uint8(t)) -} - -// Flags is a bitmask of HTTP/2 flags. -// The meaning of flags varies depending on the frame type. -type Flags uint8 - -// Has reports whether f contains all (0 or more) flags in v. -func (f Flags) Has(v Flags) bool { - return (f & v) == v -} - -// Frame-specific FrameHeader flag bits. -const ( - // Data Frame - FlagDataEndStream Flags = 0x1 - FlagDataPadded Flags = 0x8 - - // Headers Frame - FlagHeadersEndStream Flags = 0x1 - FlagHeadersEndHeaders Flags = 0x4 - FlagHeadersPadded Flags = 0x8 - FlagHeadersPriority Flags = 0x20 - - // Settings Frame - FlagSettingsAck Flags = 0x1 - - // Ping Frame - FlagPingAck Flags = 0x1 - - // Continuation Frame - FlagContinuationEndHeaders Flags = 0x4 - - FlagPushPromiseEndHeaders Flags = 0x4 - FlagPushPromisePadded Flags = 0x8 -) - -var flagName = map[FrameType]map[Flags]string{ - FrameData: { - FlagDataEndStream: "END_STREAM", - FlagDataPadded: "PADDED", - }, - FrameHeaders: { - FlagHeadersEndStream: "END_STREAM", - FlagHeadersEndHeaders: "END_HEADERS", - FlagHeadersPadded: "PADDED", - FlagHeadersPriority: "PRIORITY", - }, - FrameSettings: { - FlagSettingsAck: "ACK", - }, - FramePing: { - FlagPingAck: "ACK", - }, - FrameContinuation: { - FlagContinuationEndHeaders: "END_HEADERS", - }, - FramePushPromise: { - FlagPushPromiseEndHeaders: "END_HEADERS", - FlagPushPromisePadded: "PADDED", - }, -} - -// a frameParser parses a frame given its FrameHeader and payload -// bytes. The length of payload will always equal fh.Length (which -// might be 0). -type frameParser func(fc *frameCache, fh FrameHeader, payload []byte) (Frame, error) - -var frameParsers = map[FrameType]frameParser{ - FrameData: parseDataFrame, - FrameHeaders: parseHeadersFrame, - FramePriority: parsePriorityFrame, - FrameRSTStream: parseRSTStreamFrame, - FrameSettings: parseSettingsFrame, - FramePushPromise: parsePushPromise, - FramePing: parsePingFrame, - FrameGoAway: parseGoAwayFrame, - FrameWindowUpdate: parseWindowUpdateFrame, - FrameContinuation: parseContinuationFrame, -} - -func typeFrameParser(t FrameType) frameParser { - if f := frameParsers[t]; f != nil { - return f - } - return parseUnknownFrame -} - -// A FrameHeader is the 9 byte header of all HTTP/2 frames. -// -// See http://http2.github.io/http2-spec/#FrameHeader -type FrameHeader struct { - valid bool // caller can access []byte fields in the Frame - - // Type is the 1 byte frame type. There are ten standard frame - // types, but extension frame types may be written by WriteRawFrame - // and will be returned by ReadFrame (as UnknownFrame). - Type FrameType - - // Flags are the 1 byte of 8 potential bit flags per frame. - // They are specific to the frame type. - Flags Flags - - // Length is the length of the frame, not including the 9 byte header. - // The maximum size is one byte less than 16MB (uint24), but only - // frames up to 16KB are allowed without peer agreement. - Length uint32 - - // StreamID is which stream this frame is for. Certain frames - // are not stream-specific, in which case this field is 0. - StreamID uint32 -} - -// Header returns h. It exists so FrameHeaders can be embedded in other -// specific frame types and implement the Frame interface. -func (h FrameHeader) Header() FrameHeader { return h } - -func (h FrameHeader) String() string { - var buf bytes.Buffer - buf.WriteString("[FrameHeader ") - h.writeDebug(&buf) - buf.WriteByte(']') - return buf.String() -} - -func (h FrameHeader) writeDebug(buf *bytes.Buffer) { - buf.WriteString(h.Type.String()) - if h.Flags != 0 { - buf.WriteString(" flags=") - set := 0 - for i := uint8(0); i < 8; i++ { - if h.Flags&(1< 1 { - buf.WriteByte('|') - } - name := flagName[h.Type][Flags(1<>24), - byte(streamID>>16), - byte(streamID>>8), - byte(streamID)) -} - -func (f *Framer) endWrite() error { - // Now that we know the final size, fill in the FrameHeader in - // the space previously reserved for it. Abuse append. - length := len(f.wbuf) - frameHeaderLen - if length >= (1 << 24) { - return ErrFrameTooLarge - } - _ = append(f.wbuf[:0], - byte(length>>16), - byte(length>>8), - byte(length)) - if f.logWrites { - f.logWrite() - } - - n, err := f.w.Write(f.wbuf) - if err == nil && n != len(f.wbuf) { - err = io.ErrShortWrite - } - return err -} - -func (f *Framer) logWrite() { - if f.debugFramer == nil { - f.debugFramerBuf = new(bytes.Buffer) - f.debugFramer = NewFramer(nil, f.debugFramerBuf) - f.debugFramer.logReads = false // we log it ourselves, saying "wrote" below - // Let us read anything, even if we accidentally wrote it - // in the wrong order: - f.debugFramer.AllowIllegalReads = true - } - f.debugFramerBuf.Write(f.wbuf) - fr, err := f.debugFramer.ReadFrame() - if err != nil { - f.debugWriteLoggerf("http2: Framer %p: failed to decode just-written frame", f) - return - } - f.debugWriteLoggerf("http2: Framer %p: wrote %v", f, summarizeFrame(fr)) -} - -func (f *Framer) writeByte(v byte) { f.wbuf = append(f.wbuf, v) } -func (f *Framer) writeBytes(v []byte) { f.wbuf = append(f.wbuf, v...) } -func (f *Framer) writeUint16(v uint16) { f.wbuf = append(f.wbuf, byte(v>>8), byte(v)) } -func (f *Framer) writeUint32(v uint32) { - f.wbuf = append(f.wbuf, byte(v>>24), byte(v>>16), byte(v>>8), byte(v)) -} - -const ( - minMaxFrameSize = 1 << 14 - maxFrameSize = 1<<24 - 1 -) - -// SetReuseFrames allows the Framer to reuse Frames. -// If called on a Framer, Frames returned by calls to ReadFrame are only -// valid until the next call to ReadFrame. -func (fr *Framer) SetReuseFrames() { - if fr.frameCache != nil { - return - } - fr.frameCache = &frameCache{} -} - -type frameCache struct { - dataFrame DataFrame -} - -func (fc *frameCache) getDataFrame() *DataFrame { - if fc == nil { - return &DataFrame{} - } - return &fc.dataFrame -} - -// NewFramer returns a Framer that writes frames to w and reads them from r. -func NewFramer(w io.Writer, r io.Reader) *Framer { - fr := &Framer{ - w: w, - r: r, - logReads: logFrameReads, - logWrites: logFrameWrites, - debugReadLoggerf: log.Printf, - debugWriteLoggerf: log.Printf, - } - fr.getReadBuf = func(size uint32) []byte { - if cap(fr.readBuf) >= int(size) { - return fr.readBuf[:size] - } - fr.readBuf = make([]byte, size) - return fr.readBuf - } - fr.SetMaxReadFrameSize(maxFrameSize) - return fr -} - -// SetMaxReadFrameSize sets the maximum size of a frame -// that will be read by a subsequent call to ReadFrame. -// It is the caller's responsibility to advertise this -// limit with a SETTINGS frame. -func (fr *Framer) SetMaxReadFrameSize(v uint32) { - if v > maxFrameSize { - v = maxFrameSize - } - fr.maxReadSize = v -} - -// ErrorDetail returns a more detailed error of the last error -// returned by Framer.ReadFrame. For instance, if ReadFrame -// returns a StreamError with code PROTOCOL_ERROR, ErrorDetail -// will say exactly what was invalid. ErrorDetail is not guaranteed -// to return a non-nil value and like the rest of the http2 package, -// its return value is not protected by an API compatibility promise. -// ErrorDetail is reset after the next call to ReadFrame. -func (fr *Framer) ErrorDetail() error { - return fr.errDetail -} - -// ErrFrameTooLarge is returned from Framer.ReadFrame when the peer -// sends a frame that is larger than declared with SetMaxReadFrameSize. -var ErrFrameTooLarge = errors.New("http2: frame too large") - -// terminalReadFrameError reports whether err is an unrecoverable -// error from ReadFrame and no other frames should be read. -func terminalReadFrameError(err error) bool { - if _, ok := err.(StreamError); ok { - return false - } - return err != nil -} - -// ReadFrame reads a single frame. The returned Frame is only valid -// until the next call to ReadFrame. -// -// If the frame is larger than previously set with SetMaxReadFrameSize, the -// returned error is ErrFrameTooLarge. Other errors may be of type -// ConnectionError, StreamError, or anything else from the underlying -// reader. -func (fr *Framer) ReadFrame() (Frame, error) { - fr.errDetail = nil - if fr.lastFrame != nil { - fr.lastFrame.invalidate() - } - fh, err := readFrameHeader(fr.headerBuf[:], fr.r) - if err != nil { - return nil, err - } - if fh.Length > fr.maxReadSize { - return nil, ErrFrameTooLarge - } - payload := fr.getReadBuf(fh.Length) - if _, err := io.ReadFull(fr.r, payload); err != nil { - return nil, err - } - f, err := typeFrameParser(fh.Type)(fr.frameCache, fh, payload) - if err != nil { - if ce, ok := err.(connError); ok { - return nil, fr.connError(ce.Code, ce.Reason) - } - return nil, err - } - if err := fr.checkFrameOrder(f); err != nil { - return nil, err - } - if fr.logReads { - fr.debugReadLoggerf("http2: Framer %p: read %v", fr, summarizeFrame(f)) - } - if fh.Type == FrameHeaders && fr.ReadMetaHeaders != nil { - return fr.readMetaFrame(f.(*HeadersFrame)) - } - return f, nil -} - -// connError returns ConnectionError(code) but first -// stashes away a public reason to the caller can optionally relay it -// to the peer before hanging up on them. This might help others debug -// their implementations. -func (fr *Framer) connError(code ErrCode, reason string) error { - fr.errDetail = errors.New(reason) - return ConnectionError(code) -} - -// checkFrameOrder reports an error if f is an invalid frame to return -// next from ReadFrame. Mostly it checks whether HEADERS and -// CONTINUATION frames are contiguous. -func (fr *Framer) checkFrameOrder(f Frame) error { - last := fr.lastFrame - fr.lastFrame = f - if fr.AllowIllegalReads { - return nil - } - - fh := f.Header() - if fr.lastHeaderStream != 0 { - if fh.Type != FrameContinuation { - return fr.connError(ErrCodeProtocol, - fmt.Sprintf("got %s for stream %d; expected CONTINUATION following %s for stream %d", - fh.Type, fh.StreamID, - last.Header().Type, fr.lastHeaderStream)) - } - if fh.StreamID != fr.lastHeaderStream { - return fr.connError(ErrCodeProtocol, - fmt.Sprintf("got CONTINUATION for stream %d; expected stream %d", - fh.StreamID, fr.lastHeaderStream)) - } - } else if fh.Type == FrameContinuation { - return fr.connError(ErrCodeProtocol, fmt.Sprintf("unexpected CONTINUATION for stream %d", fh.StreamID)) - } - - switch fh.Type { - case FrameHeaders, FrameContinuation: - if fh.Flags.Has(FlagHeadersEndHeaders) { - fr.lastHeaderStream = 0 - } else { - fr.lastHeaderStream = fh.StreamID - } - } - - return nil -} - -// A DataFrame conveys arbitrary, variable-length sequences of octets -// associated with a stream. -// See http://http2.github.io/http2-spec/#rfc.section.6.1 -type DataFrame struct { - FrameHeader - data []byte -} - -func (f *DataFrame) StreamEnded() bool { - return f.FrameHeader.Flags.Has(FlagDataEndStream) -} - -// Data returns the frame's data octets, not including any padding -// size byte or padding suffix bytes. -// The caller must not retain the returned memory past the next -// call to ReadFrame. -func (f *DataFrame) Data() []byte { - f.checkValid() - return f.data -} - -func parseDataFrame(fc *frameCache, fh FrameHeader, payload []byte) (Frame, error) { - if fh.StreamID == 0 { - // DATA frames MUST be associated with a stream. If a - // DATA frame is received whose stream identifier - // field is 0x0, the recipient MUST respond with a - // connection error (Section 5.4.1) of type - // PROTOCOL_ERROR. - return nil, connError{ErrCodeProtocol, "DATA frame with stream ID 0"} - } - f := fc.getDataFrame() - f.FrameHeader = fh - - var padSize byte - if fh.Flags.Has(FlagDataPadded) { - var err error - payload, padSize, err = readByte(payload) - if err != nil { - return nil, err - } - } - if int(padSize) > len(payload) { - // If the length of the padding is greater than the - // length of the frame payload, the recipient MUST - // treat this as a connection error. - // Filed: https://github.com/http2/http2-spec/issues/610 - return nil, connError{ErrCodeProtocol, "pad size larger than data payload"} - } - f.data = payload[:len(payload)-int(padSize)] - return f, nil -} - -var ( - errStreamID = errors.New("invalid stream ID") - errDepStreamID = errors.New("invalid dependent stream ID") - errPadLength = errors.New("pad length too large") - errPadBytes = errors.New("padding bytes must all be zeros unless AllowIllegalWrites is enabled") -) - -func validStreamIDOrZero(streamID uint32) bool { - return streamID&(1<<31) == 0 -} - -func validStreamID(streamID uint32) bool { - return streamID != 0 && streamID&(1<<31) == 0 -} - -// WriteData writes a DATA frame. -// -// It will perform exactly one Write to the underlying Writer. -// It is the caller's responsibility not to violate the maximum frame size -// and to not call other Write methods concurrently. -func (f *Framer) WriteData(streamID uint32, endStream bool, data []byte) error { - return f.WriteDataPadded(streamID, endStream, data, nil) -} - -// WriteData writes a DATA frame with optional padding. -// -// If pad is nil, the padding bit is not sent. -// The length of pad must not exceed 255 bytes. -// The bytes of pad must all be zero, unless f.AllowIllegalWrites is set. -// -// It will perform exactly one Write to the underlying Writer. -// It is the caller's responsibility not to violate the maximum frame size -// and to not call other Write methods concurrently. -func (f *Framer) WriteDataPadded(streamID uint32, endStream bool, data, pad []byte) error { - if !validStreamID(streamID) && !f.AllowIllegalWrites { - return errStreamID - } - if len(pad) > 0 { - if len(pad) > 255 { - return errPadLength - } - if !f.AllowIllegalWrites { - for _, b := range pad { - if b != 0 { - // "Padding octets MUST be set to zero when sending." - return errPadBytes - } - } - } - } - var flags Flags - if endStream { - flags |= FlagDataEndStream - } - if pad != nil { - flags |= FlagDataPadded - } - f.startWrite(FrameData, flags, streamID) - if pad != nil { - f.wbuf = append(f.wbuf, byte(len(pad))) - } - f.wbuf = append(f.wbuf, data...) - f.wbuf = append(f.wbuf, pad...) - return f.endWrite() -} - -// A SettingsFrame conveys configuration parameters that affect how -// endpoints communicate, such as preferences and constraints on peer -// behavior. -// -// See http://http2.github.io/http2-spec/#SETTINGS -type SettingsFrame struct { - FrameHeader - p []byte -} - -func parseSettingsFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, error) { - if fh.Flags.Has(FlagSettingsAck) && fh.Length > 0 { - // When this (ACK 0x1) bit is set, the payload of the - // SETTINGS frame MUST be empty. Receipt of a - // SETTINGS frame with the ACK flag set and a length - // field value other than 0 MUST be treated as a - // connection error (Section 5.4.1) of type - // FRAME_SIZE_ERROR. - return nil, ConnectionError(ErrCodeFrameSize) - } - if fh.StreamID != 0 { - // SETTINGS frames always apply to a connection, - // never a single stream. The stream identifier for a - // SETTINGS frame MUST be zero (0x0). If an endpoint - // receives a SETTINGS frame whose stream identifier - // field is anything other than 0x0, the endpoint MUST - // respond with a connection error (Section 5.4.1) of - // type PROTOCOL_ERROR. - return nil, ConnectionError(ErrCodeProtocol) - } - if len(p)%6 != 0 { - // Expecting even number of 6 byte settings. - return nil, ConnectionError(ErrCodeFrameSize) - } - f := &SettingsFrame{FrameHeader: fh, p: p} - if v, ok := f.Value(SettingInitialWindowSize); ok && v > (1<<31)-1 { - // Values above the maximum flow control window size of 2^31 - 1 MUST - // be treated as a connection error (Section 5.4.1) of type - // FLOW_CONTROL_ERROR. - return nil, ConnectionError(ErrCodeFlowControl) - } - return f, nil -} - -func (f *SettingsFrame) IsAck() bool { - return f.FrameHeader.Flags.Has(FlagSettingsAck) -} - -func (f *SettingsFrame) Value(s SettingID) (v uint32, ok bool) { - f.checkValid() - buf := f.p - for len(buf) > 0 { - settingID := SettingID(binary.BigEndian.Uint16(buf[:2])) - if settingID == s { - return binary.BigEndian.Uint32(buf[2:6]), true - } - buf = buf[6:] - } - return 0, false -} - -// ForeachSetting runs fn for each setting. -// It stops and returns the first error. -func (f *SettingsFrame) ForeachSetting(fn func(Setting) error) error { - f.checkValid() - buf := f.p - for len(buf) > 0 { - if err := fn(Setting{ - SettingID(binary.BigEndian.Uint16(buf[:2])), - binary.BigEndian.Uint32(buf[2:6]), - }); err != nil { - return err - } - buf = buf[6:] - } - return nil -} - -// WriteSettings writes a SETTINGS frame with zero or more settings -// specified and the ACK bit not set. -// -// It will perform exactly one Write to the underlying Writer. -// It is the caller's responsibility to not call other Write methods concurrently. -func (f *Framer) WriteSettings(settings ...Setting) error { - f.startWrite(FrameSettings, 0, 0) - for _, s := range settings { - f.writeUint16(uint16(s.ID)) - f.writeUint32(s.Val) - } - return f.endWrite() -} - -// WriteSettingsAck writes an empty SETTINGS frame with the ACK bit set. -// -// It will perform exactly one Write to the underlying Writer. -// It is the caller's responsibility to not call other Write methods concurrently. -func (f *Framer) WriteSettingsAck() error { - f.startWrite(FrameSettings, FlagSettingsAck, 0) - return f.endWrite() -} - -// A PingFrame is a mechanism for measuring a minimal round trip time -// from the sender, as well as determining whether an idle connection -// is still functional. -// See http://http2.github.io/http2-spec/#rfc.section.6.7 -type PingFrame struct { - FrameHeader - Data [8]byte -} - -func (f *PingFrame) IsAck() bool { return f.Flags.Has(FlagPingAck) } - -func parsePingFrame(_ *frameCache, fh FrameHeader, payload []byte) (Frame, error) { - if len(payload) != 8 { - return nil, ConnectionError(ErrCodeFrameSize) - } - if fh.StreamID != 0 { - return nil, ConnectionError(ErrCodeProtocol) - } - f := &PingFrame{FrameHeader: fh} - copy(f.Data[:], payload) - return f, nil -} - -func (f *Framer) WritePing(ack bool, data [8]byte) error { - var flags Flags - if ack { - flags = FlagPingAck - } - f.startWrite(FramePing, flags, 0) - f.writeBytes(data[:]) - return f.endWrite() -} - -// A GoAwayFrame informs the remote peer to stop creating streams on this connection. -// See http://http2.github.io/http2-spec/#rfc.section.6.8 -type GoAwayFrame struct { - FrameHeader - LastStreamID uint32 - ErrCode ErrCode - debugData []byte -} - -// DebugData returns any debug data in the GOAWAY frame. Its contents -// are not defined. -// The caller must not retain the returned memory past the next -// call to ReadFrame. -func (f *GoAwayFrame) DebugData() []byte { - f.checkValid() - return f.debugData -} - -func parseGoAwayFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, error) { - if fh.StreamID != 0 { - return nil, ConnectionError(ErrCodeProtocol) - } - if len(p) < 8 { - return nil, ConnectionError(ErrCodeFrameSize) - } - return &GoAwayFrame{ - FrameHeader: fh, - LastStreamID: binary.BigEndian.Uint32(p[:4]) & (1<<31 - 1), - ErrCode: ErrCode(binary.BigEndian.Uint32(p[4:8])), - debugData: p[8:], - }, nil -} - -func (f *Framer) WriteGoAway(maxStreamID uint32, code ErrCode, debugData []byte) error { - f.startWrite(FrameGoAway, 0, 0) - f.writeUint32(maxStreamID & (1<<31 - 1)) - f.writeUint32(uint32(code)) - f.writeBytes(debugData) - return f.endWrite() -} - -// An UnknownFrame is the frame type returned when the frame type is unknown -// or no specific frame type parser exists. -type UnknownFrame struct { - FrameHeader - p []byte -} - -// Payload returns the frame's payload (after the header). It is not -// valid to call this method after a subsequent call to -// Framer.ReadFrame, nor is it valid to retain the returned slice. -// The memory is owned by the Framer and is invalidated when the next -// frame is read. -func (f *UnknownFrame) Payload() []byte { - f.checkValid() - return f.p -} - -func parseUnknownFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, error) { - return &UnknownFrame{fh, p}, nil -} - -// A WindowUpdateFrame is used to implement flow control. -// See http://http2.github.io/http2-spec/#rfc.section.6.9 -type WindowUpdateFrame struct { - FrameHeader - Increment uint32 // never read with high bit set -} - -func parseWindowUpdateFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, error) { - if len(p) != 4 { - return nil, ConnectionError(ErrCodeFrameSize) - } - inc := binary.BigEndian.Uint32(p[:4]) & 0x7fffffff // mask off high reserved bit - if inc == 0 { - // A receiver MUST treat the receipt of a - // WINDOW_UPDATE frame with an flow control window - // increment of 0 as a stream error (Section 5.4.2) of - // type PROTOCOL_ERROR; errors on the connection flow - // control window MUST be treated as a connection - // error (Section 5.4.1). - if fh.StreamID == 0 { - return nil, ConnectionError(ErrCodeProtocol) - } - return nil, streamError(fh.StreamID, ErrCodeProtocol) - } - return &WindowUpdateFrame{ - FrameHeader: fh, - Increment: inc, - }, nil -} - -// WriteWindowUpdate writes a WINDOW_UPDATE frame. -// The increment value must be between 1 and 2,147,483,647, inclusive. -// If the Stream ID is zero, the window update applies to the -// connection as a whole. -func (f *Framer) WriteWindowUpdate(streamID, incr uint32) error { - // "The legal range for the increment to the flow control window is 1 to 2^31-1 (2,147,483,647) octets." - if (incr < 1 || incr > 2147483647) && !f.AllowIllegalWrites { - return errors.New("illegal window increment value") - } - f.startWrite(FrameWindowUpdate, 0, streamID) - f.writeUint32(incr) - return f.endWrite() -} - -// A HeadersFrame is used to open a stream and additionally carries a -// header block fragment. -type HeadersFrame struct { - FrameHeader - - // Priority is set if FlagHeadersPriority is set in the FrameHeader. - Priority PriorityParam - - headerFragBuf []byte // not owned -} - -func (f *HeadersFrame) HeaderBlockFragment() []byte { - f.checkValid() - return f.headerFragBuf -} - -func (f *HeadersFrame) HeadersEnded() bool { - return f.FrameHeader.Flags.Has(FlagHeadersEndHeaders) -} - -func (f *HeadersFrame) StreamEnded() bool { - return f.FrameHeader.Flags.Has(FlagHeadersEndStream) -} - -func (f *HeadersFrame) HasPriority() bool { - return f.FrameHeader.Flags.Has(FlagHeadersPriority) -} - -func parseHeadersFrame(_ *frameCache, fh FrameHeader, p []byte) (_ Frame, err error) { - hf := &HeadersFrame{ - FrameHeader: fh, - } - if fh.StreamID == 0 { - // HEADERS frames MUST be associated with a stream. If a HEADERS frame - // is received whose stream identifier field is 0x0, the recipient MUST - // respond with a connection error (Section 5.4.1) of type - // PROTOCOL_ERROR. - return nil, connError{ErrCodeProtocol, "HEADERS frame with stream ID 0"} - } - var padLength uint8 - if fh.Flags.Has(FlagHeadersPadded) { - if p, padLength, err = readByte(p); err != nil { - return - } - } - if fh.Flags.Has(FlagHeadersPriority) { - var v uint32 - p, v, err = readUint32(p) - if err != nil { - return nil, err - } - hf.Priority.StreamDep = v & 0x7fffffff - hf.Priority.Exclusive = (v != hf.Priority.StreamDep) // high bit was set - p, hf.Priority.Weight, err = readByte(p) - if err != nil { - return nil, err - } - } - if len(p)-int(padLength) <= 0 { - return nil, streamError(fh.StreamID, ErrCodeProtocol) - } - hf.headerFragBuf = p[:len(p)-int(padLength)] - return hf, nil -} - -// HeadersFrameParam are the parameters for writing a HEADERS frame. -type HeadersFrameParam struct { - // StreamID is the required Stream ID to initiate. - StreamID uint32 - // BlockFragment is part (or all) of a Header Block. - BlockFragment []byte - - // EndStream indicates that the header block is the last that - // the endpoint will send for the identified stream. Setting - // this flag causes the stream to enter one of "half closed" - // states. - EndStream bool - - // EndHeaders indicates that this frame contains an entire - // header block and is not followed by any - // CONTINUATION frames. - EndHeaders bool - - // PadLength is the optional number of bytes of zeros to add - // to this frame. - PadLength uint8 - - // Priority, if non-zero, includes stream priority information - // in the HEADER frame. - Priority PriorityParam -} - -// WriteHeaders writes a single HEADERS frame. -// -// This is a low-level header writing method. Encoding headers and -// splitting them into any necessary CONTINUATION frames is handled -// elsewhere. -// -// It will perform exactly one Write to the underlying Writer. -// It is the caller's responsibility to not call other Write methods concurrently. -func (f *Framer) WriteHeaders(p HeadersFrameParam) error { - if !validStreamID(p.StreamID) && !f.AllowIllegalWrites { - return errStreamID - } - var flags Flags - if p.PadLength != 0 { - flags |= FlagHeadersPadded - } - if p.EndStream { - flags |= FlagHeadersEndStream - } - if p.EndHeaders { - flags |= FlagHeadersEndHeaders - } - if !p.Priority.IsZero() { - flags |= FlagHeadersPriority - } - f.startWrite(FrameHeaders, flags, p.StreamID) - if p.PadLength != 0 { - f.writeByte(p.PadLength) - } - if !p.Priority.IsZero() { - v := p.Priority.StreamDep - if !validStreamIDOrZero(v) && !f.AllowIllegalWrites { - return errDepStreamID - } - if p.Priority.Exclusive { - v |= 1 << 31 - } - f.writeUint32(v) - f.writeByte(p.Priority.Weight) - } - f.wbuf = append(f.wbuf, p.BlockFragment...) - f.wbuf = append(f.wbuf, padZeros[:p.PadLength]...) - return f.endWrite() -} - -// A PriorityFrame specifies the sender-advised priority of a stream. -// See http://http2.github.io/http2-spec/#rfc.section.6.3 -type PriorityFrame struct { - FrameHeader - PriorityParam -} - -// PriorityParam are the stream prioritzation parameters. -type PriorityParam struct { - // StreamDep is a 31-bit stream identifier for the - // stream that this stream depends on. Zero means no - // dependency. - StreamDep uint32 - - // Exclusive is whether the dependency is exclusive. - Exclusive bool - - // Weight is the stream's zero-indexed weight. It should be - // set together with StreamDep, or neither should be set. Per - // the spec, "Add one to the value to obtain a weight between - // 1 and 256." - Weight uint8 -} - -func (p PriorityParam) IsZero() bool { - return p == PriorityParam{} -} - -func parsePriorityFrame(_ *frameCache, fh FrameHeader, payload []byte) (Frame, error) { - if fh.StreamID == 0 { - return nil, connError{ErrCodeProtocol, "PRIORITY frame with stream ID 0"} - } - if len(payload) != 5 { - return nil, connError{ErrCodeFrameSize, fmt.Sprintf("PRIORITY frame payload size was %d; want 5", len(payload))} - } - v := binary.BigEndian.Uint32(payload[:4]) - streamID := v & 0x7fffffff // mask off high bit - return &PriorityFrame{ - FrameHeader: fh, - PriorityParam: PriorityParam{ - Weight: payload[4], - StreamDep: streamID, - Exclusive: streamID != v, // was high bit set? - }, - }, nil -} - -// WritePriority writes a PRIORITY frame. -// -// It will perform exactly one Write to the underlying Writer. -// It is the caller's responsibility to not call other Write methods concurrently. -func (f *Framer) WritePriority(streamID uint32, p PriorityParam) error { - if !validStreamID(streamID) && !f.AllowIllegalWrites { - return errStreamID - } - if !validStreamIDOrZero(p.StreamDep) { - return errDepStreamID - } - f.startWrite(FramePriority, 0, streamID) - v := p.StreamDep - if p.Exclusive { - v |= 1 << 31 - } - f.writeUint32(v) - f.writeByte(p.Weight) - return f.endWrite() -} - -// A RSTStreamFrame allows for abnormal termination of a stream. -// See http://http2.github.io/http2-spec/#rfc.section.6.4 -type RSTStreamFrame struct { - FrameHeader - ErrCode ErrCode -} - -func parseRSTStreamFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, error) { - if len(p) != 4 { - return nil, ConnectionError(ErrCodeFrameSize) - } - if fh.StreamID == 0 { - return nil, ConnectionError(ErrCodeProtocol) - } - return &RSTStreamFrame{fh, ErrCode(binary.BigEndian.Uint32(p[:4]))}, nil -} - -// WriteRSTStream writes a RST_STREAM frame. -// -// It will perform exactly one Write to the underlying Writer. -// It is the caller's responsibility to not call other Write methods concurrently. -func (f *Framer) WriteRSTStream(streamID uint32, code ErrCode) error { - if !validStreamID(streamID) && !f.AllowIllegalWrites { - return errStreamID - } - f.startWrite(FrameRSTStream, 0, streamID) - f.writeUint32(uint32(code)) - return f.endWrite() -} - -// A ContinuationFrame is used to continue a sequence of header block fragments. -// See http://http2.github.io/http2-spec/#rfc.section.6.10 -type ContinuationFrame struct { - FrameHeader - headerFragBuf []byte -} - -func parseContinuationFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, error) { - if fh.StreamID == 0 { - return nil, connError{ErrCodeProtocol, "CONTINUATION frame with stream ID 0"} - } - return &ContinuationFrame{fh, p}, nil -} - -func (f *ContinuationFrame) HeaderBlockFragment() []byte { - f.checkValid() - return f.headerFragBuf -} - -func (f *ContinuationFrame) HeadersEnded() bool { - return f.FrameHeader.Flags.Has(FlagContinuationEndHeaders) -} - -// WriteContinuation writes a CONTINUATION frame. -// -// It will perform exactly one Write to the underlying Writer. -// It is the caller's responsibility to not call other Write methods concurrently. -func (f *Framer) WriteContinuation(streamID uint32, endHeaders bool, headerBlockFragment []byte) error { - if !validStreamID(streamID) && !f.AllowIllegalWrites { - return errStreamID - } - var flags Flags - if endHeaders { - flags |= FlagContinuationEndHeaders - } - f.startWrite(FrameContinuation, flags, streamID) - f.wbuf = append(f.wbuf, headerBlockFragment...) - return f.endWrite() -} - -// A PushPromiseFrame is used to initiate a server stream. -// See http://http2.github.io/http2-spec/#rfc.section.6.6 -type PushPromiseFrame struct { - FrameHeader - PromiseID uint32 - headerFragBuf []byte // not owned -} - -func (f *PushPromiseFrame) HeaderBlockFragment() []byte { - f.checkValid() - return f.headerFragBuf -} - -func (f *PushPromiseFrame) HeadersEnded() bool { - return f.FrameHeader.Flags.Has(FlagPushPromiseEndHeaders) -} - -func parsePushPromise(_ *frameCache, fh FrameHeader, p []byte) (_ Frame, err error) { - pp := &PushPromiseFrame{ - FrameHeader: fh, - } - if pp.StreamID == 0 { - // PUSH_PROMISE frames MUST be associated with an existing, - // peer-initiated stream. The stream identifier of a - // PUSH_PROMISE frame indicates the stream it is associated - // with. If the stream identifier field specifies the value - // 0x0, a recipient MUST respond with a connection error - // (Section 5.4.1) of type PROTOCOL_ERROR. - return nil, ConnectionError(ErrCodeProtocol) - } - // The PUSH_PROMISE frame includes optional padding. - // Padding fields and flags are identical to those defined for DATA frames - var padLength uint8 - if fh.Flags.Has(FlagPushPromisePadded) { - if p, padLength, err = readByte(p); err != nil { - return - } - } - - p, pp.PromiseID, err = readUint32(p) - if err != nil { - return - } - pp.PromiseID = pp.PromiseID & (1<<31 - 1) - - if int(padLength) > len(p) { - // like the DATA frame, error out if padding is longer than the body. - return nil, ConnectionError(ErrCodeProtocol) - } - pp.headerFragBuf = p[:len(p)-int(padLength)] - return pp, nil -} - -// PushPromiseParam are the parameters for writing a PUSH_PROMISE frame. -type PushPromiseParam struct { - // StreamID is the required Stream ID to initiate. - StreamID uint32 - - // PromiseID is the required Stream ID which this - // Push Promises - PromiseID uint32 - - // BlockFragment is part (or all) of a Header Block. - BlockFragment []byte - - // EndHeaders indicates that this frame contains an entire - // header block and is not followed by any - // CONTINUATION frames. - EndHeaders bool - - // PadLength is the optional number of bytes of zeros to add - // to this frame. - PadLength uint8 -} - -// WritePushPromise writes a single PushPromise Frame. -// -// As with Header Frames, This is the low level call for writing -// individual frames. Continuation frames are handled elsewhere. -// -// It will perform exactly one Write to the underlying Writer. -// It is the caller's responsibility to not call other Write methods concurrently. -func (f *Framer) WritePushPromise(p PushPromiseParam) error { - if !validStreamID(p.StreamID) && !f.AllowIllegalWrites { - return errStreamID - } - var flags Flags - if p.PadLength != 0 { - flags |= FlagPushPromisePadded - } - if p.EndHeaders { - flags |= FlagPushPromiseEndHeaders - } - f.startWrite(FramePushPromise, flags, p.StreamID) - if p.PadLength != 0 { - f.writeByte(p.PadLength) - } - if !validStreamID(p.PromiseID) && !f.AllowIllegalWrites { - return errStreamID - } - f.writeUint32(p.PromiseID) - f.wbuf = append(f.wbuf, p.BlockFragment...) - f.wbuf = append(f.wbuf, padZeros[:p.PadLength]...) - return f.endWrite() -} - -// WriteRawFrame writes a raw frame. This can be used to write -// extension frames unknown to this package. -func (f *Framer) WriteRawFrame(t FrameType, flags Flags, streamID uint32, payload []byte) error { - f.startWrite(t, flags, streamID) - f.writeBytes(payload) - return f.endWrite() -} - -func readByte(p []byte) (remain []byte, b byte, err error) { - if len(p) == 0 { - return nil, 0, io.ErrUnexpectedEOF - } - return p[1:], p[0], nil -} - -func readUint32(p []byte) (remain []byte, v uint32, err error) { - if len(p) < 4 { - return nil, 0, io.ErrUnexpectedEOF - } - return p[4:], binary.BigEndian.Uint32(p[:4]), nil -} - -type streamEnder interface { - StreamEnded() bool -} - -type headersEnder interface { - HeadersEnded() bool -} - -type headersOrContinuation interface { - headersEnder - HeaderBlockFragment() []byte -} - -// A MetaHeadersFrame is the representation of one HEADERS frame and -// zero or more contiguous CONTINUATION frames and the decoding of -// their HPACK-encoded contents. -// -// This type of frame does not appear on the wire and is only returned -// by the Framer when Framer.ReadMetaHeaders is set. -type MetaHeadersFrame struct { - *HeadersFrame - - // Fields are the fields contained in the HEADERS and - // CONTINUATION frames. The underlying slice is owned by the - // Framer and must not be retained after the next call to - // ReadFrame. - // - // Fields are guaranteed to be in the correct http2 order and - // not have unknown pseudo header fields or invalid header - // field names or values. Required pseudo header fields may be - // missing, however. Use the MetaHeadersFrame.Pseudo accessor - // method access pseudo headers. - Fields []hpack.HeaderField - - // Truncated is whether the max header list size limit was hit - // and Fields is incomplete. The hpack decoder state is still - // valid, however. - Truncated bool -} - -// PseudoValue returns the given pseudo header field's value. -// The provided pseudo field should not contain the leading colon. -func (mh *MetaHeadersFrame) PseudoValue(pseudo string) string { - for _, hf := range mh.Fields { - if !hf.IsPseudo() { - return "" - } - if hf.Name[1:] == pseudo { - return hf.Value - } - } - return "" -} - -// RegularFields returns the regular (non-pseudo) header fields of mh. -// The caller does not own the returned slice. -func (mh *MetaHeadersFrame) RegularFields() []hpack.HeaderField { - for i, hf := range mh.Fields { - if !hf.IsPseudo() { - return mh.Fields[i:] - } - } - return nil -} - -// PseudoFields returns the pseudo header fields of mh. -// The caller does not own the returned slice. -func (mh *MetaHeadersFrame) PseudoFields() []hpack.HeaderField { - for i, hf := range mh.Fields { - if !hf.IsPseudo() { - return mh.Fields[:i] - } - } - return mh.Fields -} - -func (mh *MetaHeadersFrame) checkPseudos() error { - var isRequest, isResponse bool - pf := mh.PseudoFields() - for i, hf := range pf { - switch hf.Name { - case ":method", ":path", ":scheme", ":authority": - isRequest = true - case ":status": - isResponse = true - default: - return pseudoHeaderError(hf.Name) - } - // Check for duplicates. - // This would be a bad algorithm, but N is 4. - // And this doesn't allocate. - for _, hf2 := range pf[:i] { - if hf.Name == hf2.Name { - return duplicatePseudoHeaderError(hf.Name) - } - } - } - if isRequest && isResponse { - return errMixPseudoHeaderTypes - } - return nil -} - -func (fr *Framer) maxHeaderStringLen() int { - v := fr.maxHeaderListSize() - if uint32(int(v)) == v { - return int(v) - } - // They had a crazy big number for MaxHeaderBytes anyway, - // so give them unlimited header lengths: - return 0 -} - -// readMetaFrame returns 0 or more CONTINUATION frames from fr and -// merge them into into the provided hf and returns a MetaHeadersFrame -// with the decoded hpack values. -func (fr *Framer) readMetaFrame(hf *HeadersFrame) (*MetaHeadersFrame, error) { - if fr.AllowIllegalReads { - return nil, errors.New("illegal use of AllowIllegalReads with ReadMetaHeaders") - } - mh := &MetaHeadersFrame{ - HeadersFrame: hf, - } - var remainSize = fr.maxHeaderListSize() - var sawRegular bool - - var invalid error // pseudo header field errors - hdec := fr.ReadMetaHeaders - hdec.SetEmitEnabled(true) - hdec.SetMaxStringLength(fr.maxHeaderStringLen()) - hdec.SetEmitFunc(func(hf hpack.HeaderField) { - if VerboseLogs && fr.logReads { - fr.debugReadLoggerf("http2: decoded hpack field %+v", hf) - } - if !httplex.ValidHeaderFieldValue(hf.Value) { - invalid = headerFieldValueError(hf.Value) - } - isPseudo := strings.HasPrefix(hf.Name, ":") - if isPseudo { - if sawRegular { - invalid = errPseudoAfterRegular - } - } else { - sawRegular = true - if !validWireHeaderFieldName(hf.Name) { - invalid = headerFieldNameError(hf.Name) - } - } - - if invalid != nil { - hdec.SetEmitEnabled(false) - return - } - - size := hf.Size() - if size > remainSize { - hdec.SetEmitEnabled(false) - mh.Truncated = true - return - } - remainSize -= size - - mh.Fields = append(mh.Fields, hf) - }) - // Lose reference to MetaHeadersFrame: - defer hdec.SetEmitFunc(func(hf hpack.HeaderField) {}) - - var hc headersOrContinuation = hf - for { - frag := hc.HeaderBlockFragment() - if _, err := hdec.Write(frag); err != nil { - return nil, ConnectionError(ErrCodeCompression) - } - - if hc.HeadersEnded() { - break - } - if f, err := fr.ReadFrame(); err != nil { - return nil, err - } else { - hc = f.(*ContinuationFrame) // guaranteed by checkFrameOrder - } - } - - mh.HeadersFrame.headerFragBuf = nil - mh.HeadersFrame.invalidate() - - if err := hdec.Close(); err != nil { - return nil, ConnectionError(ErrCodeCompression) - } - if invalid != nil { - fr.errDetail = invalid - if VerboseLogs { - log.Printf("http2: invalid header: %v", invalid) - } - return nil, StreamError{mh.StreamID, ErrCodeProtocol, invalid} - } - if err := mh.checkPseudos(); err != nil { - fr.errDetail = err - if VerboseLogs { - log.Printf("http2: invalid pseudo headers: %v", err) - } - return nil, StreamError{mh.StreamID, ErrCodeProtocol, err} - } - return mh, nil -} - -func summarizeFrame(f Frame) string { - var buf bytes.Buffer - f.Header().writeDebug(&buf) - switch f := f.(type) { - case *SettingsFrame: - n := 0 - f.ForeachSetting(func(s Setting) error { - n++ - if n == 1 { - buf.WriteString(", settings:") - } - fmt.Fprintf(&buf, " %v=%v,", s.ID, s.Val) - return nil - }) - if n > 0 { - buf.Truncate(buf.Len() - 1) // remove trailing comma - } - case *DataFrame: - data := f.Data() - const max = 256 - if len(data) > max { - data = data[:max] - } - fmt.Fprintf(&buf, " data=%q", data) - if len(f.Data()) > max { - fmt.Fprintf(&buf, " (%d bytes omitted)", len(f.Data())-max) - } - case *WindowUpdateFrame: - if f.StreamID == 0 { - buf.WriteString(" (conn)") - } - fmt.Fprintf(&buf, " incr=%v", f.Increment) - case *PingFrame: - fmt.Fprintf(&buf, " ping=%q", f.Data[:]) - case *GoAwayFrame: - fmt.Fprintf(&buf, " LastStreamID=%v ErrCode=%v Debug=%q", - f.LastStreamID, f.ErrCode, f.debugData) - case *RSTStreamFrame: - fmt.Fprintf(&buf, " ErrCode=%v", f.ErrCode) - } - return buf.String() -} diff --git a/vendor/golang.org/x/net/http2/go16.go b/vendor/golang.org/x/net/http2/go16.go deleted file mode 100644 index 00b2e9e3c..000000000 --- a/vendor/golang.org/x/net/http2/go16.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build go1.6 - -package http2 - -import ( - "net/http" - "time" -) - -func transportExpectContinueTimeout(t1 *http.Transport) time.Duration { - return t1.ExpectContinueTimeout -} diff --git a/vendor/golang.org/x/net/http2/go17.go b/vendor/golang.org/x/net/http2/go17.go deleted file mode 100644 index 47b7fae08..000000000 --- a/vendor/golang.org/x/net/http2/go17.go +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build go1.7 - -package http2 - -import ( - "context" - "net" - "net/http" - "net/http/httptrace" - "time" -) - -type contextContext interface { - context.Context -} - -func serverConnBaseContext(c net.Conn, opts *ServeConnOpts) (ctx contextContext, cancel func()) { - ctx, cancel = context.WithCancel(context.Background()) - ctx = context.WithValue(ctx, http.LocalAddrContextKey, c.LocalAddr()) - if hs := opts.baseConfig(); hs != nil { - ctx = context.WithValue(ctx, http.ServerContextKey, hs) - } - return -} - -func contextWithCancel(ctx contextContext) (_ contextContext, cancel func()) { - return context.WithCancel(ctx) -} - -func requestWithContext(req *http.Request, ctx contextContext) *http.Request { - return req.WithContext(ctx) -} - -type clientTrace httptrace.ClientTrace - -func reqContext(r *http.Request) context.Context { return r.Context() } - -func (t *Transport) idleConnTimeout() time.Duration { - if t.t1 != nil { - return t.t1.IdleConnTimeout - } - return 0 -} - -func setResponseUncompressed(res *http.Response) { res.Uncompressed = true } - -func traceGotConn(req *http.Request, cc *ClientConn) { - trace := httptrace.ContextClientTrace(req.Context()) - if trace == nil || trace.GotConn == nil { - return - } - ci := httptrace.GotConnInfo{Conn: cc.tconn} - cc.mu.Lock() - ci.Reused = cc.nextStreamID > 1 - ci.WasIdle = len(cc.streams) == 0 && ci.Reused - if ci.WasIdle && !cc.lastActive.IsZero() { - ci.IdleTime = time.Now().Sub(cc.lastActive) - } - cc.mu.Unlock() - - trace.GotConn(ci) -} - -func traceWroteHeaders(trace *clientTrace) { - if trace != nil && trace.WroteHeaders != nil { - trace.WroteHeaders() - } -} - -func traceGot100Continue(trace *clientTrace) { - if trace != nil && trace.Got100Continue != nil { - trace.Got100Continue() - } -} - -func traceWait100Continue(trace *clientTrace) { - if trace != nil && trace.Wait100Continue != nil { - trace.Wait100Continue() - } -} - -func traceWroteRequest(trace *clientTrace, err error) { - if trace != nil && trace.WroteRequest != nil { - trace.WroteRequest(httptrace.WroteRequestInfo{Err: err}) - } -} - -func traceFirstResponseByte(trace *clientTrace) { - if trace != nil && trace.GotFirstResponseByte != nil { - trace.GotFirstResponseByte() - } -} - -func requestTrace(req *http.Request) *clientTrace { - trace := httptrace.ContextClientTrace(req.Context()) - return (*clientTrace)(trace) -} - -// Ping sends a PING frame to the server and waits for the ack. -func (cc *ClientConn) Ping(ctx context.Context) error { - return cc.ping(ctx) -} diff --git a/vendor/golang.org/x/net/http2/go17_not18.go b/vendor/golang.org/x/net/http2/go17_not18.go deleted file mode 100644 index b4c52ecec..000000000 --- a/vendor/golang.org/x/net/http2/go17_not18.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build go1.7,!go1.8 - -package http2 - -import "crypto/tls" - -// temporary copy of Go 1.7's private tls.Config.clone: -func cloneTLSConfig(c *tls.Config) *tls.Config { - return &tls.Config{ - Rand: c.Rand, - Time: c.Time, - Certificates: c.Certificates, - NameToCertificate: c.NameToCertificate, - GetCertificate: c.GetCertificate, - RootCAs: c.RootCAs, - NextProtos: c.NextProtos, - ServerName: c.ServerName, - ClientAuth: c.ClientAuth, - ClientCAs: c.ClientCAs, - InsecureSkipVerify: c.InsecureSkipVerify, - CipherSuites: c.CipherSuites, - PreferServerCipherSuites: c.PreferServerCipherSuites, - SessionTicketsDisabled: c.SessionTicketsDisabled, - SessionTicketKey: c.SessionTicketKey, - ClientSessionCache: c.ClientSessionCache, - MinVersion: c.MinVersion, - MaxVersion: c.MaxVersion, - CurvePreferences: c.CurvePreferences, - DynamicRecordSizingDisabled: c.DynamicRecordSizingDisabled, - Renegotiation: c.Renegotiation, - } -} diff --git a/vendor/golang.org/x/net/http2/go18.go b/vendor/golang.org/x/net/http2/go18.go deleted file mode 100644 index 73cc2381f..000000000 --- a/vendor/golang.org/x/net/http2/go18.go +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build go1.8 - -package http2 - -import ( - "crypto/tls" - "io" - "net/http" -) - -func cloneTLSConfig(c *tls.Config) *tls.Config { - c2 := c.Clone() - c2.GetClientCertificate = c.GetClientCertificate // golang.org/issue/19264 - return c2 -} - -var _ http.Pusher = (*responseWriter)(nil) - -// Push implements http.Pusher. -func (w *responseWriter) Push(target string, opts *http.PushOptions) error { - internalOpts := pushOptions{} - if opts != nil { - internalOpts.Method = opts.Method - internalOpts.Header = opts.Header - } - return w.push(target, internalOpts) -} - -func configureServer18(h1 *http.Server, h2 *Server) error { - if h2.IdleTimeout == 0 { - if h1.IdleTimeout != 0 { - h2.IdleTimeout = h1.IdleTimeout - } else { - h2.IdleTimeout = h1.ReadTimeout - } - } - return nil -} - -func shouldLogPanic(panicValue interface{}) bool { - return panicValue != nil && panicValue != http.ErrAbortHandler -} - -func reqGetBody(req *http.Request) func() (io.ReadCloser, error) { - return req.GetBody -} - -func reqBodyIsNoBody(body io.ReadCloser) bool { - return body == http.NoBody -} diff --git a/vendor/golang.org/x/net/http2/go19.go b/vendor/golang.org/x/net/http2/go19.go deleted file mode 100644 index 38124ba56..000000000 --- a/vendor/golang.org/x/net/http2/go19.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build go1.9 - -package http2 - -import ( - "net/http" -) - -func configureServer19(s *http.Server, conf *Server) error { - s.RegisterOnShutdown(conf.state.startGracefulShutdown) - return nil -} diff --git a/vendor/golang.org/x/net/http2/gotrack.go b/vendor/golang.org/x/net/http2/gotrack.go deleted file mode 100644 index 9933c9f8c..000000000 --- a/vendor/golang.org/x/net/http2/gotrack.go +++ /dev/null @@ -1,170 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Defensive debug-only utility to track that functions run on the -// goroutine that they're supposed to. - -package http2 - -import ( - "bytes" - "errors" - "fmt" - "os" - "runtime" - "strconv" - "sync" -) - -var DebugGoroutines = os.Getenv("DEBUG_HTTP2_GOROUTINES") == "1" - -type goroutineLock uint64 - -func newGoroutineLock() goroutineLock { - if !DebugGoroutines { - return 0 - } - return goroutineLock(curGoroutineID()) -} - -func (g goroutineLock) check() { - if !DebugGoroutines { - return - } - if curGoroutineID() != uint64(g) { - panic("running on the wrong goroutine") - } -} - -func (g goroutineLock) checkNotOn() { - if !DebugGoroutines { - return - } - if curGoroutineID() == uint64(g) { - panic("running on the wrong goroutine") - } -} - -var goroutineSpace = []byte("goroutine ") - -func curGoroutineID() uint64 { - bp := littleBuf.Get().(*[]byte) - defer littleBuf.Put(bp) - b := *bp - b = b[:runtime.Stack(b, false)] - // Parse the 4707 out of "goroutine 4707 [" - b = bytes.TrimPrefix(b, goroutineSpace) - i := bytes.IndexByte(b, ' ') - if i < 0 { - panic(fmt.Sprintf("No space found in %q", b)) - } - b = b[:i] - n, err := parseUintBytes(b, 10, 64) - if err != nil { - panic(fmt.Sprintf("Failed to parse goroutine ID out of %q: %v", b, err)) - } - return n -} - -var littleBuf = sync.Pool{ - New: func() interface{} { - buf := make([]byte, 64) - return &buf - }, -} - -// parseUintBytes is like strconv.ParseUint, but using a []byte. -func parseUintBytes(s []byte, base int, bitSize int) (n uint64, err error) { - var cutoff, maxVal uint64 - - if bitSize == 0 { - bitSize = int(strconv.IntSize) - } - - s0 := s - switch { - case len(s) < 1: - err = strconv.ErrSyntax - goto Error - - case 2 <= base && base <= 36: - // valid base; nothing to do - - case base == 0: - // Look for octal, hex prefix. - switch { - case s[0] == '0' && len(s) > 1 && (s[1] == 'x' || s[1] == 'X'): - base = 16 - s = s[2:] - if len(s) < 1 { - err = strconv.ErrSyntax - goto Error - } - case s[0] == '0': - base = 8 - default: - base = 10 - } - - default: - err = errors.New("invalid base " + strconv.Itoa(base)) - goto Error - } - - n = 0 - cutoff = cutoff64(base) - maxVal = 1<= base { - n = 0 - err = strconv.ErrSyntax - goto Error - } - - if n >= cutoff { - // n*base overflows - n = 1<<64 - 1 - err = strconv.ErrRange - goto Error - } - n *= uint64(base) - - n1 := n + uint64(v) - if n1 < n || n1 > maxVal { - // n+v overflows - n = 1<<64 - 1 - err = strconv.ErrRange - goto Error - } - n = n1 - } - - return n, nil - -Error: - return n, &strconv.NumError{Func: "ParseUint", Num: string(s0), Err: err} -} - -// Return the first number n such that n*base >= 1<<64. -func cutoff64(base int) uint64 { - if base < 2 { - return 0 - } - return (1<<64-1)/uint64(base) + 1 -} diff --git a/vendor/golang.org/x/net/http2/headermap.go b/vendor/golang.org/x/net/http2/headermap.go deleted file mode 100644 index c2805f6ac..000000000 --- a/vendor/golang.org/x/net/http2/headermap.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package http2 - -import ( - "net/http" - "strings" -) - -var ( - commonLowerHeader = map[string]string{} // Go-Canonical-Case -> lower-case - commonCanonHeader = map[string]string{} // lower-case -> Go-Canonical-Case -) - -func init() { - for _, v := range []string{ - "accept", - "accept-charset", - "accept-encoding", - "accept-language", - "accept-ranges", - "age", - "access-control-allow-origin", - "allow", - "authorization", - "cache-control", - "content-disposition", - "content-encoding", - "content-language", - "content-length", - "content-location", - "content-range", - "content-type", - "cookie", - "date", - "etag", - "expect", - "expires", - "from", - "host", - "if-match", - "if-modified-since", - "if-none-match", - "if-unmodified-since", - "last-modified", - "link", - "location", - "max-forwards", - "proxy-authenticate", - "proxy-authorization", - "range", - "referer", - "refresh", - "retry-after", - "server", - "set-cookie", - "strict-transport-security", - "trailer", - "transfer-encoding", - "user-agent", - "vary", - "via", - "www-authenticate", - } { - chk := http.CanonicalHeaderKey(v) - commonLowerHeader[chk] = v - commonCanonHeader[v] = chk - } -} - -func lowerHeader(v string) string { - if s, ok := commonLowerHeader[v]; ok { - return s - } - return strings.ToLower(v) -} diff --git a/vendor/golang.org/x/net/http2/hpack/encode.go b/vendor/golang.org/x/net/http2/hpack/encode.go deleted file mode 100644 index 54726c2a3..000000000 --- a/vendor/golang.org/x/net/http2/hpack/encode.go +++ /dev/null @@ -1,240 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package hpack - -import ( - "io" -) - -const ( - uint32Max = ^uint32(0) - initialHeaderTableSize = 4096 -) - -type Encoder struct { - dynTab dynamicTable - // minSize is the minimum table size set by - // SetMaxDynamicTableSize after the previous Header Table Size - // Update. - minSize uint32 - // maxSizeLimit is the maximum table size this encoder - // supports. This will protect the encoder from too large - // size. - maxSizeLimit uint32 - // tableSizeUpdate indicates whether "Header Table Size - // Update" is required. - tableSizeUpdate bool - w io.Writer - buf []byte -} - -// NewEncoder returns a new Encoder which performs HPACK encoding. An -// encoded data is written to w. -func NewEncoder(w io.Writer) *Encoder { - e := &Encoder{ - minSize: uint32Max, - maxSizeLimit: initialHeaderTableSize, - tableSizeUpdate: false, - w: w, - } - e.dynTab.table.init() - e.dynTab.setMaxSize(initialHeaderTableSize) - return e -} - -// WriteField encodes f into a single Write to e's underlying Writer. -// This function may also produce bytes for "Header Table Size Update" -// if necessary. If produced, it is done before encoding f. -func (e *Encoder) WriteField(f HeaderField) error { - e.buf = e.buf[:0] - - if e.tableSizeUpdate { - e.tableSizeUpdate = false - if e.minSize < e.dynTab.maxSize { - e.buf = appendTableSize(e.buf, e.minSize) - } - e.minSize = uint32Max - e.buf = appendTableSize(e.buf, e.dynTab.maxSize) - } - - idx, nameValueMatch := e.searchTable(f) - if nameValueMatch { - e.buf = appendIndexed(e.buf, idx) - } else { - indexing := e.shouldIndex(f) - if indexing { - e.dynTab.add(f) - } - - if idx == 0 { - e.buf = appendNewName(e.buf, f, indexing) - } else { - e.buf = appendIndexedName(e.buf, f, idx, indexing) - } - } - n, err := e.w.Write(e.buf) - if err == nil && n != len(e.buf) { - err = io.ErrShortWrite - } - return err -} - -// searchTable searches f in both stable and dynamic header tables. -// The static header table is searched first. Only when there is no -// exact match for both name and value, the dynamic header table is -// then searched. If there is no match, i is 0. If both name and value -// match, i is the matched index and nameValueMatch becomes true. If -// only name matches, i points to that index and nameValueMatch -// becomes false. -func (e *Encoder) searchTable(f HeaderField) (i uint64, nameValueMatch bool) { - i, nameValueMatch = staticTable.search(f) - if nameValueMatch { - return i, true - } - - j, nameValueMatch := e.dynTab.table.search(f) - if nameValueMatch || (i == 0 && j != 0) { - return j + uint64(staticTable.len()), nameValueMatch - } - - return i, false -} - -// SetMaxDynamicTableSize changes the dynamic header table size to v. -// The actual size is bounded by the value passed to -// SetMaxDynamicTableSizeLimit. -func (e *Encoder) SetMaxDynamicTableSize(v uint32) { - if v > e.maxSizeLimit { - v = e.maxSizeLimit - } - if v < e.minSize { - e.minSize = v - } - e.tableSizeUpdate = true - e.dynTab.setMaxSize(v) -} - -// SetMaxDynamicTableSizeLimit changes the maximum value that can be -// specified in SetMaxDynamicTableSize to v. By default, it is set to -// 4096, which is the same size of the default dynamic header table -// size described in HPACK specification. If the current maximum -// dynamic header table size is strictly greater than v, "Header Table -// Size Update" will be done in the next WriteField call and the -// maximum dynamic header table size is truncated to v. -func (e *Encoder) SetMaxDynamicTableSizeLimit(v uint32) { - e.maxSizeLimit = v - if e.dynTab.maxSize > v { - e.tableSizeUpdate = true - e.dynTab.setMaxSize(v) - } -} - -// shouldIndex reports whether f should be indexed. -func (e *Encoder) shouldIndex(f HeaderField) bool { - return !f.Sensitive && f.Size() <= e.dynTab.maxSize -} - -// appendIndexed appends index i, as encoded in "Indexed Header Field" -// representation, to dst and returns the extended buffer. -func appendIndexed(dst []byte, i uint64) []byte { - first := len(dst) - dst = appendVarInt(dst, 7, i) - dst[first] |= 0x80 - return dst -} - -// appendNewName appends f, as encoded in one of "Literal Header field -// - New Name" representation variants, to dst and returns the -// extended buffer. -// -// If f.Sensitive is true, "Never Indexed" representation is used. If -// f.Sensitive is false and indexing is true, "Inremental Indexing" -// representation is used. -func appendNewName(dst []byte, f HeaderField, indexing bool) []byte { - dst = append(dst, encodeTypeByte(indexing, f.Sensitive)) - dst = appendHpackString(dst, f.Name) - return appendHpackString(dst, f.Value) -} - -// appendIndexedName appends f and index i referring indexed name -// entry, as encoded in one of "Literal Header field - Indexed Name" -// representation variants, to dst and returns the extended buffer. -// -// If f.Sensitive is true, "Never Indexed" representation is used. If -// f.Sensitive is false and indexing is true, "Incremental Indexing" -// representation is used. -func appendIndexedName(dst []byte, f HeaderField, i uint64, indexing bool) []byte { - first := len(dst) - var n byte - if indexing { - n = 6 - } else { - n = 4 - } - dst = appendVarInt(dst, n, i) - dst[first] |= encodeTypeByte(indexing, f.Sensitive) - return appendHpackString(dst, f.Value) -} - -// appendTableSize appends v, as encoded in "Header Table Size Update" -// representation, to dst and returns the extended buffer. -func appendTableSize(dst []byte, v uint32) []byte { - first := len(dst) - dst = appendVarInt(dst, 5, uint64(v)) - dst[first] |= 0x20 - return dst -} - -// appendVarInt appends i, as encoded in variable integer form using n -// bit prefix, to dst and returns the extended buffer. -// -// See -// http://http2.github.io/http2-spec/compression.html#integer.representation -func appendVarInt(dst []byte, n byte, i uint64) []byte { - k := uint64((1 << n) - 1) - if i < k { - return append(dst, byte(i)) - } - dst = append(dst, byte(k)) - i -= k - for ; i >= 128; i >>= 7 { - dst = append(dst, byte(0x80|(i&0x7f))) - } - return append(dst, byte(i)) -} - -// appendHpackString appends s, as encoded in "String Literal" -// representation, to dst and returns the the extended buffer. -// -// s will be encoded in Huffman codes only when it produces strictly -// shorter byte string. -func appendHpackString(dst []byte, s string) []byte { - huffmanLength := HuffmanEncodeLength(s) - if huffmanLength < uint64(len(s)) { - first := len(dst) - dst = appendVarInt(dst, 7, huffmanLength) - dst = AppendHuffmanString(dst, s) - dst[first] |= 0x80 - } else { - dst = appendVarInt(dst, 7, uint64(len(s))) - dst = append(dst, s...) - } - return dst -} - -// encodeTypeByte returns type byte. If sensitive is true, type byte -// for "Never Indexed" representation is returned. If sensitive is -// false and indexing is true, type byte for "Incremental Indexing" -// representation is returned. Otherwise, type byte for "Without -// Indexing" is returned. -func encodeTypeByte(indexing, sensitive bool) byte { - if sensitive { - return 0x10 - } - if indexing { - return 0x40 - } - return 0 -} diff --git a/vendor/golang.org/x/net/http2/hpack/hpack.go b/vendor/golang.org/x/net/http2/hpack/hpack.go deleted file mode 100644 index 176644acd..000000000 --- a/vendor/golang.org/x/net/http2/hpack/hpack.go +++ /dev/null @@ -1,490 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package hpack implements HPACK, a compression format for -// efficiently representing HTTP header fields in the context of HTTP/2. -// -// See http://tools.ietf.org/html/draft-ietf-httpbis-header-compression-09 -package hpack - -import ( - "bytes" - "errors" - "fmt" -) - -// A DecodingError is something the spec defines as a decoding error. -type DecodingError struct { - Err error -} - -func (de DecodingError) Error() string { - return fmt.Sprintf("decoding error: %v", de.Err) -} - -// An InvalidIndexError is returned when an encoder references a table -// entry before the static table or after the end of the dynamic table. -type InvalidIndexError int - -func (e InvalidIndexError) Error() string { - return fmt.Sprintf("invalid indexed representation index %d", int(e)) -} - -// A HeaderField is a name-value pair. Both the name and value are -// treated as opaque sequences of octets. -type HeaderField struct { - Name, Value string - - // Sensitive means that this header field should never be - // indexed. - Sensitive bool -} - -// IsPseudo reports whether the header field is an http2 pseudo header. -// That is, it reports whether it starts with a colon. -// It is not otherwise guaranteed to be a valid pseudo header field, -// though. -func (hf HeaderField) IsPseudo() bool { - return len(hf.Name) != 0 && hf.Name[0] == ':' -} - -func (hf HeaderField) String() string { - var suffix string - if hf.Sensitive { - suffix = " (sensitive)" - } - return fmt.Sprintf("header field %q = %q%s", hf.Name, hf.Value, suffix) -} - -// Size returns the size of an entry per RFC 7541 section 4.1. -func (hf HeaderField) Size() uint32 { - // http://http2.github.io/http2-spec/compression.html#rfc.section.4.1 - // "The size of the dynamic table is the sum of the size of - // its entries. The size of an entry is the sum of its name's - // length in octets (as defined in Section 5.2), its value's - // length in octets (see Section 5.2), plus 32. The size of - // an entry is calculated using the length of the name and - // value without any Huffman encoding applied." - - // This can overflow if somebody makes a large HeaderField - // Name and/or Value by hand, but we don't care, because that - // won't happen on the wire because the encoding doesn't allow - // it. - return uint32(len(hf.Name) + len(hf.Value) + 32) -} - -// A Decoder is the decoding context for incremental processing of -// header blocks. -type Decoder struct { - dynTab dynamicTable - emit func(f HeaderField) - - emitEnabled bool // whether calls to emit are enabled - maxStrLen int // 0 means unlimited - - // buf is the unparsed buffer. It's only written to - // saveBuf if it was truncated in the middle of a header - // block. Because it's usually not owned, we can only - // process it under Write. - buf []byte // not owned; only valid during Write - - // saveBuf is previous data passed to Write which we weren't able - // to fully parse before. Unlike buf, we own this data. - saveBuf bytes.Buffer -} - -// NewDecoder returns a new decoder with the provided maximum dynamic -// table size. The emitFunc will be called for each valid field -// parsed, in the same goroutine as calls to Write, before Write returns. -func NewDecoder(maxDynamicTableSize uint32, emitFunc func(f HeaderField)) *Decoder { - d := &Decoder{ - emit: emitFunc, - emitEnabled: true, - } - d.dynTab.table.init() - d.dynTab.allowedMaxSize = maxDynamicTableSize - d.dynTab.setMaxSize(maxDynamicTableSize) - return d -} - -// ErrStringLength is returned by Decoder.Write when the max string length -// (as configured by Decoder.SetMaxStringLength) would be violated. -var ErrStringLength = errors.New("hpack: string too long") - -// SetMaxStringLength sets the maximum size of a HeaderField name or -// value string. If a string exceeds this length (even after any -// decompression), Write will return ErrStringLength. -// A value of 0 means unlimited and is the default from NewDecoder. -func (d *Decoder) SetMaxStringLength(n int) { - d.maxStrLen = n -} - -// SetEmitFunc changes the callback used when new header fields -// are decoded. -// It must be non-nil. It does not affect EmitEnabled. -func (d *Decoder) SetEmitFunc(emitFunc func(f HeaderField)) { - d.emit = emitFunc -} - -// SetEmitEnabled controls whether the emitFunc provided to NewDecoder -// should be called. The default is true. -// -// This facility exists to let servers enforce MAX_HEADER_LIST_SIZE -// while still decoding and keeping in-sync with decoder state, but -// without doing unnecessary decompression or generating unnecessary -// garbage for header fields past the limit. -func (d *Decoder) SetEmitEnabled(v bool) { d.emitEnabled = v } - -// EmitEnabled reports whether calls to the emitFunc provided to NewDecoder -// are currently enabled. The default is true. -func (d *Decoder) EmitEnabled() bool { return d.emitEnabled } - -// TODO: add method *Decoder.Reset(maxSize, emitFunc) to let callers re-use Decoders and their -// underlying buffers for garbage reasons. - -func (d *Decoder) SetMaxDynamicTableSize(v uint32) { - d.dynTab.setMaxSize(v) -} - -// SetAllowedMaxDynamicTableSize sets the upper bound that the encoded -// stream (via dynamic table size updates) may set the maximum size -// to. -func (d *Decoder) SetAllowedMaxDynamicTableSize(v uint32) { - d.dynTab.allowedMaxSize = v -} - -type dynamicTable struct { - // http://http2.github.io/http2-spec/compression.html#rfc.section.2.3.2 - table headerFieldTable - size uint32 // in bytes - maxSize uint32 // current maxSize - allowedMaxSize uint32 // maxSize may go up to this, inclusive -} - -func (dt *dynamicTable) setMaxSize(v uint32) { - dt.maxSize = v - dt.evict() -} - -func (dt *dynamicTable) add(f HeaderField) { - dt.table.addEntry(f) - dt.size += f.Size() - dt.evict() -} - -// If we're too big, evict old stuff. -func (dt *dynamicTable) evict() { - var n int - for dt.size > dt.maxSize && n < dt.table.len() { - dt.size -= dt.table.ents[n].Size() - n++ - } - dt.table.evictOldest(n) -} - -func (d *Decoder) maxTableIndex() int { - // This should never overflow. RFC 7540 Section 6.5.2 limits the size of - // the dynamic table to 2^32 bytes, where each entry will occupy more than - // one byte. Further, the staticTable has a fixed, small length. - return d.dynTab.table.len() + staticTable.len() -} - -func (d *Decoder) at(i uint64) (hf HeaderField, ok bool) { - // See Section 2.3.3. - if i == 0 { - return - } - if i <= uint64(staticTable.len()) { - return staticTable.ents[i-1], true - } - if i > uint64(d.maxTableIndex()) { - return - } - // In the dynamic table, newer entries have lower indices. - // However, dt.ents[0] is the oldest entry. Hence, dt.ents is - // the reversed dynamic table. - dt := d.dynTab.table - return dt.ents[dt.len()-(int(i)-staticTable.len())], true -} - -// Decode decodes an entire block. -// -// TODO: remove this method and make it incremental later? This is -// easier for debugging now. -func (d *Decoder) DecodeFull(p []byte) ([]HeaderField, error) { - var hf []HeaderField - saveFunc := d.emit - defer func() { d.emit = saveFunc }() - d.emit = func(f HeaderField) { hf = append(hf, f) } - if _, err := d.Write(p); err != nil { - return nil, err - } - if err := d.Close(); err != nil { - return nil, err - } - return hf, nil -} - -func (d *Decoder) Close() error { - if d.saveBuf.Len() > 0 { - d.saveBuf.Reset() - return DecodingError{errors.New("truncated headers")} - } - return nil -} - -func (d *Decoder) Write(p []byte) (n int, err error) { - if len(p) == 0 { - // Prevent state machine CPU attacks (making us redo - // work up to the point of finding out we don't have - // enough data) - return - } - // Only copy the data if we have to. Optimistically assume - // that p will contain a complete header block. - if d.saveBuf.Len() == 0 { - d.buf = p - } else { - d.saveBuf.Write(p) - d.buf = d.saveBuf.Bytes() - d.saveBuf.Reset() - } - - for len(d.buf) > 0 { - err = d.parseHeaderFieldRepr() - if err == errNeedMore { - // Extra paranoia, making sure saveBuf won't - // get too large. All the varint and string - // reading code earlier should already catch - // overlong things and return ErrStringLength, - // but keep this as a last resort. - const varIntOverhead = 8 // conservative - if d.maxStrLen != 0 && int64(len(d.buf)) > 2*(int64(d.maxStrLen)+varIntOverhead) { - return 0, ErrStringLength - } - d.saveBuf.Write(d.buf) - return len(p), nil - } - if err != nil { - break - } - } - return len(p), err -} - -// errNeedMore is an internal sentinel error value that means the -// buffer is truncated and we need to read more data before we can -// continue parsing. -var errNeedMore = errors.New("need more data") - -type indexType int - -const ( - indexedTrue indexType = iota - indexedFalse - indexedNever -) - -func (v indexType) indexed() bool { return v == indexedTrue } -func (v indexType) sensitive() bool { return v == indexedNever } - -// returns errNeedMore if there isn't enough data available. -// any other error is fatal. -// consumes d.buf iff it returns nil. -// precondition: must be called with len(d.buf) > 0 -func (d *Decoder) parseHeaderFieldRepr() error { - b := d.buf[0] - switch { - case b&128 != 0: - // Indexed representation. - // High bit set? - // http://http2.github.io/http2-spec/compression.html#rfc.section.6.1 - return d.parseFieldIndexed() - case b&192 == 64: - // 6.2.1 Literal Header Field with Incremental Indexing - // 0b10xxxxxx: top two bits are 10 - // http://http2.github.io/http2-spec/compression.html#rfc.section.6.2.1 - return d.parseFieldLiteral(6, indexedTrue) - case b&240 == 0: - // 6.2.2 Literal Header Field without Indexing - // 0b0000xxxx: top four bits are 0000 - // http://http2.github.io/http2-spec/compression.html#rfc.section.6.2.2 - return d.parseFieldLiteral(4, indexedFalse) - case b&240 == 16: - // 6.2.3 Literal Header Field never Indexed - // 0b0001xxxx: top four bits are 0001 - // http://http2.github.io/http2-spec/compression.html#rfc.section.6.2.3 - return d.parseFieldLiteral(4, indexedNever) - case b&224 == 32: - // 6.3 Dynamic Table Size Update - // Top three bits are '001'. - // http://http2.github.io/http2-spec/compression.html#rfc.section.6.3 - return d.parseDynamicTableSizeUpdate() - } - - return DecodingError{errors.New("invalid encoding")} -} - -// (same invariants and behavior as parseHeaderFieldRepr) -func (d *Decoder) parseFieldIndexed() error { - buf := d.buf - idx, buf, err := readVarInt(7, buf) - if err != nil { - return err - } - hf, ok := d.at(idx) - if !ok { - return DecodingError{InvalidIndexError(idx)} - } - d.buf = buf - return d.callEmit(HeaderField{Name: hf.Name, Value: hf.Value}) -} - -// (same invariants and behavior as parseHeaderFieldRepr) -func (d *Decoder) parseFieldLiteral(n uint8, it indexType) error { - buf := d.buf - nameIdx, buf, err := readVarInt(n, buf) - if err != nil { - return err - } - - var hf HeaderField - wantStr := d.emitEnabled || it.indexed() - if nameIdx > 0 { - ihf, ok := d.at(nameIdx) - if !ok { - return DecodingError{InvalidIndexError(nameIdx)} - } - hf.Name = ihf.Name - } else { - hf.Name, buf, err = d.readString(buf, wantStr) - if err != nil { - return err - } - } - hf.Value, buf, err = d.readString(buf, wantStr) - if err != nil { - return err - } - d.buf = buf - if it.indexed() { - d.dynTab.add(hf) - } - hf.Sensitive = it.sensitive() - return d.callEmit(hf) -} - -func (d *Decoder) callEmit(hf HeaderField) error { - if d.maxStrLen != 0 { - if len(hf.Name) > d.maxStrLen || len(hf.Value) > d.maxStrLen { - return ErrStringLength - } - } - if d.emitEnabled { - d.emit(hf) - } - return nil -} - -// (same invariants and behavior as parseHeaderFieldRepr) -func (d *Decoder) parseDynamicTableSizeUpdate() error { - buf := d.buf - size, buf, err := readVarInt(5, buf) - if err != nil { - return err - } - if size > uint64(d.dynTab.allowedMaxSize) { - return DecodingError{errors.New("dynamic table size update too large")} - } - d.dynTab.setMaxSize(uint32(size)) - d.buf = buf - return nil -} - -var errVarintOverflow = DecodingError{errors.New("varint integer overflow")} - -// readVarInt reads an unsigned variable length integer off the -// beginning of p. n is the parameter as described in -// http://http2.github.io/http2-spec/compression.html#rfc.section.5.1. -// -// n must always be between 1 and 8. -// -// The returned remain buffer is either a smaller suffix of p, or err != nil. -// The error is errNeedMore if p doesn't contain a complete integer. -func readVarInt(n byte, p []byte) (i uint64, remain []byte, err error) { - if n < 1 || n > 8 { - panic("bad n") - } - if len(p) == 0 { - return 0, p, errNeedMore - } - i = uint64(p[0]) - if n < 8 { - i &= (1 << uint64(n)) - 1 - } - if i < (1< 0 { - b := p[0] - p = p[1:] - i += uint64(b&127) << m - if b&128 == 0 { - return i, p, nil - } - m += 7 - if m >= 63 { // TODO: proper overflow check. making this up. - return 0, origP, errVarintOverflow - } - } - return 0, origP, errNeedMore -} - -// readString decodes an hpack string from p. -// -// wantStr is whether s will be used. If false, decompression and -// []byte->string garbage are skipped if s will be ignored -// anyway. This does mean that huffman decoding errors for non-indexed -// strings past the MAX_HEADER_LIST_SIZE are ignored, but the server -// is returning an error anyway, and because they're not indexed, the error -// won't affect the decoding state. -func (d *Decoder) readString(p []byte, wantStr bool) (s string, remain []byte, err error) { - if len(p) == 0 { - return "", p, errNeedMore - } - isHuff := p[0]&128 != 0 - strLen, p, err := readVarInt(7, p) - if err != nil { - return "", p, err - } - if d.maxStrLen != 0 && strLen > uint64(d.maxStrLen) { - return "", nil, ErrStringLength - } - if uint64(len(p)) < strLen { - return "", p, errNeedMore - } - if !isHuff { - if wantStr { - s = string(p[:strLen]) - } - return s, p[strLen:], nil - } - - if wantStr { - buf := bufPool.Get().(*bytes.Buffer) - buf.Reset() // don't trust others - defer bufPool.Put(buf) - if err := huffmanDecode(buf, d.maxStrLen, p[:strLen]); err != nil { - buf.Reset() - return "", nil, err - } - s = buf.String() - buf.Reset() // be nice to GC - } - return s, p[strLen:], nil -} diff --git a/vendor/golang.org/x/net/http2/hpack/huffman.go b/vendor/golang.org/x/net/http2/hpack/huffman.go deleted file mode 100644 index 8850e3946..000000000 --- a/vendor/golang.org/x/net/http2/hpack/huffman.go +++ /dev/null @@ -1,212 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package hpack - -import ( - "bytes" - "errors" - "io" - "sync" -) - -var bufPool = sync.Pool{ - New: func() interface{} { return new(bytes.Buffer) }, -} - -// HuffmanDecode decodes the string in v and writes the expanded -// result to w, returning the number of bytes written to w and the -// Write call's return value. At most one Write call is made. -func HuffmanDecode(w io.Writer, v []byte) (int, error) { - buf := bufPool.Get().(*bytes.Buffer) - buf.Reset() - defer bufPool.Put(buf) - if err := huffmanDecode(buf, 0, v); err != nil { - return 0, err - } - return w.Write(buf.Bytes()) -} - -// HuffmanDecodeToString decodes the string in v. -func HuffmanDecodeToString(v []byte) (string, error) { - buf := bufPool.Get().(*bytes.Buffer) - buf.Reset() - defer bufPool.Put(buf) - if err := huffmanDecode(buf, 0, v); err != nil { - return "", err - } - return buf.String(), nil -} - -// ErrInvalidHuffman is returned for errors found decoding -// Huffman-encoded strings. -var ErrInvalidHuffman = errors.New("hpack: invalid Huffman-encoded data") - -// huffmanDecode decodes v to buf. -// If maxLen is greater than 0, attempts to write more to buf than -// maxLen bytes will return ErrStringLength. -func huffmanDecode(buf *bytes.Buffer, maxLen int, v []byte) error { - n := rootHuffmanNode - // cur is the bit buffer that has not been fed into n. - // cbits is the number of low order bits in cur that are valid. - // sbits is the number of bits of the symbol prefix being decoded. - cur, cbits, sbits := uint(0), uint8(0), uint8(0) - for _, b := range v { - cur = cur<<8 | uint(b) - cbits += 8 - sbits += 8 - for cbits >= 8 { - idx := byte(cur >> (cbits - 8)) - n = n.children[idx] - if n == nil { - return ErrInvalidHuffman - } - if n.children == nil { - if maxLen != 0 && buf.Len() == maxLen { - return ErrStringLength - } - buf.WriteByte(n.sym) - cbits -= n.codeLen - n = rootHuffmanNode - sbits = cbits - } else { - cbits -= 8 - } - } - } - for cbits > 0 { - n = n.children[byte(cur<<(8-cbits))] - if n == nil { - return ErrInvalidHuffman - } - if n.children != nil || n.codeLen > cbits { - break - } - if maxLen != 0 && buf.Len() == maxLen { - return ErrStringLength - } - buf.WriteByte(n.sym) - cbits -= n.codeLen - n = rootHuffmanNode - sbits = cbits - } - if sbits > 7 { - // Either there was an incomplete symbol, or overlong padding. - // Both are decoding errors per RFC 7541 section 5.2. - return ErrInvalidHuffman - } - if mask := uint(1< 8 { - codeLen -= 8 - i := uint8(code >> codeLen) - if cur.children[i] == nil { - cur.children[i] = newInternalNode() - } - cur = cur.children[i] - } - shift := 8 - codeLen - start, end := int(uint8(code<> (nbits - rembits)) - dst[len(dst)-1] |= t - } - - return dst -} - -// HuffmanEncodeLength returns the number of bytes required to encode -// s in Huffman codes. The result is round up to byte boundary. -func HuffmanEncodeLength(s string) uint64 { - n := uint64(0) - for i := 0; i < len(s); i++ { - n += uint64(huffmanCodeLen[s[i]]) - } - return (n + 7) / 8 -} - -// appendByteToHuffmanCode appends Huffman code for c to dst and -// returns the extended buffer and the remaining bits in the last -// element. The appending is not byte aligned and the remaining bits -// in the last element of dst is given in rembits. -func appendByteToHuffmanCode(dst []byte, rembits uint8, c byte) ([]byte, uint8) { - code := huffmanCodes[c] - nbits := huffmanCodeLen[c] - - for { - if rembits > nbits { - t := uint8(code << (rembits - nbits)) - dst[len(dst)-1] |= t - rembits -= nbits - break - } - - t := uint8(code >> (nbits - rembits)) - dst[len(dst)-1] |= t - - nbits -= rembits - rembits = 8 - - if nbits == 0 { - break - } - - dst = append(dst, 0) - } - - return dst, rembits -} diff --git a/vendor/golang.org/x/net/http2/hpack/tables.go b/vendor/golang.org/x/net/http2/hpack/tables.go deleted file mode 100644 index a66cfbea6..000000000 --- a/vendor/golang.org/x/net/http2/hpack/tables.go +++ /dev/null @@ -1,479 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package hpack - -import ( - "fmt" -) - -// headerFieldTable implements a list of HeaderFields. -// This is used to implement the static and dynamic tables. -type headerFieldTable struct { - // For static tables, entries are never evicted. - // - // For dynamic tables, entries are evicted from ents[0] and added to the end. - // Each entry has a unique id that starts at one and increments for each - // entry that is added. This unique id is stable across evictions, meaning - // it can be used as a pointer to a specific entry. As in hpack, unique ids - // are 1-based. The unique id for ents[k] is k + evictCount + 1. - // - // Zero is not a valid unique id. - // - // evictCount should not overflow in any remotely practical situation. In - // practice, we will have one dynamic table per HTTP/2 connection. If we - // assume a very powerful server that handles 1M QPS per connection and each - // request adds (then evicts) 100 entries from the table, it would still take - // 2M years for evictCount to overflow. - ents []HeaderField - evictCount uint64 - - // byName maps a HeaderField name to the unique id of the newest entry with - // the same name. See above for a definition of "unique id". - byName map[string]uint64 - - // byNameValue maps a HeaderField name/value pair to the unique id of the newest - // entry with the same name and value. See above for a definition of "unique id". - byNameValue map[pairNameValue]uint64 -} - -type pairNameValue struct { - name, value string -} - -func (t *headerFieldTable) init() { - t.byName = make(map[string]uint64) - t.byNameValue = make(map[pairNameValue]uint64) -} - -// len reports the number of entries in the table. -func (t *headerFieldTable) len() int { - return len(t.ents) -} - -// addEntry adds a new entry. -func (t *headerFieldTable) addEntry(f HeaderField) { - id := uint64(t.len()) + t.evictCount + 1 - t.byName[f.Name] = id - t.byNameValue[pairNameValue{f.Name, f.Value}] = id - t.ents = append(t.ents, f) -} - -// evictOldest evicts the n oldest entries in the table. -func (t *headerFieldTable) evictOldest(n int) { - if n > t.len() { - panic(fmt.Sprintf("evictOldest(%v) on table with %v entries", n, t.len())) - } - for k := 0; k < n; k++ { - f := t.ents[k] - id := t.evictCount + uint64(k) + 1 - if t.byName[f.Name] == id { - delete(t.byName, f.Name) - } - if p := (pairNameValue{f.Name, f.Value}); t.byNameValue[p] == id { - delete(t.byNameValue, p) - } - } - copy(t.ents, t.ents[n:]) - for k := t.len() - n; k < t.len(); k++ { - t.ents[k] = HeaderField{} // so strings can be garbage collected - } - t.ents = t.ents[:t.len()-n] - if t.evictCount+uint64(n) < t.evictCount { - panic("evictCount overflow") - } - t.evictCount += uint64(n) -} - -// search finds f in the table. If there is no match, i is 0. -// If both name and value match, i is the matched index and nameValueMatch -// becomes true. If only name matches, i points to that index and -// nameValueMatch becomes false. -// -// The returned index is a 1-based HPACK index. For dynamic tables, HPACK says -// that index 1 should be the newest entry, but t.ents[0] is the oldest entry, -// meaning t.ents is reversed for dynamic tables. Hence, when t is a dynamic -// table, the return value i actually refers to the entry t.ents[t.len()-i]. -// -// All tables are assumed to be a dynamic tables except for the global -// staticTable pointer. -// -// See Section 2.3.3. -func (t *headerFieldTable) search(f HeaderField) (i uint64, nameValueMatch bool) { - if !f.Sensitive { - if id := t.byNameValue[pairNameValue{f.Name, f.Value}]; id != 0 { - return t.idToIndex(id), true - } - } - if id := t.byName[f.Name]; id != 0 { - return t.idToIndex(id), false - } - return 0, false -} - -// idToIndex converts a unique id to an HPACK index. -// See Section 2.3.3. -func (t *headerFieldTable) idToIndex(id uint64) uint64 { - if id <= t.evictCount { - panic(fmt.Sprintf("id (%v) <= evictCount (%v)", id, t.evictCount)) - } - k := id - t.evictCount - 1 // convert id to an index t.ents[k] - if t != staticTable { - return uint64(t.len()) - k // dynamic table - } - return k + 1 -} - -// http://tools.ietf.org/html/draft-ietf-httpbis-header-compression-07#appendix-B -var staticTable = newStaticTable() -var staticTableEntries = [...]HeaderField{ - {Name: ":authority"}, - {Name: ":method", Value: "GET"}, - {Name: ":method", Value: "POST"}, - {Name: ":path", Value: "/"}, - {Name: ":path", Value: "/index.html"}, - {Name: ":scheme", Value: "http"}, - {Name: ":scheme", Value: "https"}, - {Name: ":status", Value: "200"}, - {Name: ":status", Value: "204"}, - {Name: ":status", Value: "206"}, - {Name: ":status", Value: "304"}, - {Name: ":status", Value: "400"}, - {Name: ":status", Value: "404"}, - {Name: ":status", Value: "500"}, - {Name: "accept-charset"}, - {Name: "accept-encoding", Value: "gzip, deflate"}, - {Name: "accept-language"}, - {Name: "accept-ranges"}, - {Name: "accept"}, - {Name: "access-control-allow-origin"}, - {Name: "age"}, - {Name: "allow"}, - {Name: "authorization"}, - {Name: "cache-control"}, - {Name: "content-disposition"}, - {Name: "content-encoding"}, - {Name: "content-language"}, - {Name: "content-length"}, - {Name: "content-location"}, - {Name: "content-range"}, - {Name: "content-type"}, - {Name: "cookie"}, - {Name: "date"}, - {Name: "etag"}, - {Name: "expect"}, - {Name: "expires"}, - {Name: "from"}, - {Name: "host"}, - {Name: "if-match"}, - {Name: "if-modified-since"}, - {Name: "if-none-match"}, - {Name: "if-range"}, - {Name: "if-unmodified-since"}, - {Name: "last-modified"}, - {Name: "link"}, - {Name: "location"}, - {Name: "max-forwards"}, - {Name: "proxy-authenticate"}, - {Name: "proxy-authorization"}, - {Name: "range"}, - {Name: "referer"}, - {Name: "refresh"}, - {Name: "retry-after"}, - {Name: "server"}, - {Name: "set-cookie"}, - {Name: "strict-transport-security"}, - {Name: "transfer-encoding"}, - {Name: "user-agent"}, - {Name: "vary"}, - {Name: "via"}, - {Name: "www-authenticate"}, -} - -func newStaticTable() *headerFieldTable { - t := &headerFieldTable{} - t.init() - for _, e := range staticTableEntries[:] { - t.addEntry(e) - } - return t -} - -var huffmanCodes = [256]uint32{ - 0x1ff8, - 0x7fffd8, - 0xfffffe2, - 0xfffffe3, - 0xfffffe4, - 0xfffffe5, - 0xfffffe6, - 0xfffffe7, - 0xfffffe8, - 0xffffea, - 0x3ffffffc, - 0xfffffe9, - 0xfffffea, - 0x3ffffffd, - 0xfffffeb, - 0xfffffec, - 0xfffffed, - 0xfffffee, - 0xfffffef, - 0xffffff0, - 0xffffff1, - 0xffffff2, - 0x3ffffffe, - 0xffffff3, - 0xffffff4, - 0xffffff5, - 0xffffff6, - 0xffffff7, - 0xffffff8, - 0xffffff9, - 0xffffffa, - 0xffffffb, - 0x14, - 0x3f8, - 0x3f9, - 0xffa, - 0x1ff9, - 0x15, - 0xf8, - 0x7fa, - 0x3fa, - 0x3fb, - 0xf9, - 0x7fb, - 0xfa, - 0x16, - 0x17, - 0x18, - 0x0, - 0x1, - 0x2, - 0x19, - 0x1a, - 0x1b, - 0x1c, - 0x1d, - 0x1e, - 0x1f, - 0x5c, - 0xfb, - 0x7ffc, - 0x20, - 0xffb, - 0x3fc, - 0x1ffa, - 0x21, - 0x5d, - 0x5e, - 0x5f, - 0x60, - 0x61, - 0x62, - 0x63, - 0x64, - 0x65, - 0x66, - 0x67, - 0x68, - 0x69, - 0x6a, - 0x6b, - 0x6c, - 0x6d, - 0x6e, - 0x6f, - 0x70, - 0x71, - 0x72, - 0xfc, - 0x73, - 0xfd, - 0x1ffb, - 0x7fff0, - 0x1ffc, - 0x3ffc, - 0x22, - 0x7ffd, - 0x3, - 0x23, - 0x4, - 0x24, - 0x5, - 0x25, - 0x26, - 0x27, - 0x6, - 0x74, - 0x75, - 0x28, - 0x29, - 0x2a, - 0x7, - 0x2b, - 0x76, - 0x2c, - 0x8, - 0x9, - 0x2d, - 0x77, - 0x78, - 0x79, - 0x7a, - 0x7b, - 0x7ffe, - 0x7fc, - 0x3ffd, - 0x1ffd, - 0xffffffc, - 0xfffe6, - 0x3fffd2, - 0xfffe7, - 0xfffe8, - 0x3fffd3, - 0x3fffd4, - 0x3fffd5, - 0x7fffd9, - 0x3fffd6, - 0x7fffda, - 0x7fffdb, - 0x7fffdc, - 0x7fffdd, - 0x7fffde, - 0xffffeb, - 0x7fffdf, - 0xffffec, - 0xffffed, - 0x3fffd7, - 0x7fffe0, - 0xffffee, - 0x7fffe1, - 0x7fffe2, - 0x7fffe3, - 0x7fffe4, - 0x1fffdc, - 0x3fffd8, - 0x7fffe5, - 0x3fffd9, - 0x7fffe6, - 0x7fffe7, - 0xffffef, - 0x3fffda, - 0x1fffdd, - 0xfffe9, - 0x3fffdb, - 0x3fffdc, - 0x7fffe8, - 0x7fffe9, - 0x1fffde, - 0x7fffea, - 0x3fffdd, - 0x3fffde, - 0xfffff0, - 0x1fffdf, - 0x3fffdf, - 0x7fffeb, - 0x7fffec, - 0x1fffe0, - 0x1fffe1, - 0x3fffe0, - 0x1fffe2, - 0x7fffed, - 0x3fffe1, - 0x7fffee, - 0x7fffef, - 0xfffea, - 0x3fffe2, - 0x3fffe3, - 0x3fffe4, - 0x7ffff0, - 0x3fffe5, - 0x3fffe6, - 0x7ffff1, - 0x3ffffe0, - 0x3ffffe1, - 0xfffeb, - 0x7fff1, - 0x3fffe7, - 0x7ffff2, - 0x3fffe8, - 0x1ffffec, - 0x3ffffe2, - 0x3ffffe3, - 0x3ffffe4, - 0x7ffffde, - 0x7ffffdf, - 0x3ffffe5, - 0xfffff1, - 0x1ffffed, - 0x7fff2, - 0x1fffe3, - 0x3ffffe6, - 0x7ffffe0, - 0x7ffffe1, - 0x3ffffe7, - 0x7ffffe2, - 0xfffff2, - 0x1fffe4, - 0x1fffe5, - 0x3ffffe8, - 0x3ffffe9, - 0xffffffd, - 0x7ffffe3, - 0x7ffffe4, - 0x7ffffe5, - 0xfffec, - 0xfffff3, - 0xfffed, - 0x1fffe6, - 0x3fffe9, - 0x1fffe7, - 0x1fffe8, - 0x7ffff3, - 0x3fffea, - 0x3fffeb, - 0x1ffffee, - 0x1ffffef, - 0xfffff4, - 0xfffff5, - 0x3ffffea, - 0x7ffff4, - 0x3ffffeb, - 0x7ffffe6, - 0x3ffffec, - 0x3ffffed, - 0x7ffffe7, - 0x7ffffe8, - 0x7ffffe9, - 0x7ffffea, - 0x7ffffeb, - 0xffffffe, - 0x7ffffec, - 0x7ffffed, - 0x7ffffee, - 0x7ffffef, - 0x7fffff0, - 0x3ffffee, -} - -var huffmanCodeLen = [256]uint8{ - 13, 23, 28, 28, 28, 28, 28, 28, 28, 24, 30, 28, 28, 30, 28, 28, - 28, 28, 28, 28, 28, 28, 30, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 6, 10, 10, 12, 13, 6, 8, 11, 10, 10, 8, 11, 8, 6, 6, 6, - 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 8, 15, 6, 12, 10, - 13, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 8, 7, 8, 13, 19, 13, 14, 6, - 15, 5, 6, 5, 6, 5, 6, 6, 6, 5, 7, 7, 6, 6, 6, 5, - 6, 7, 6, 5, 5, 6, 7, 7, 7, 7, 7, 15, 11, 14, 13, 28, - 20, 22, 20, 20, 22, 22, 22, 23, 22, 23, 23, 23, 23, 23, 24, 23, - 24, 24, 22, 23, 24, 23, 23, 23, 23, 21, 22, 23, 22, 23, 23, 24, - 22, 21, 20, 22, 22, 23, 23, 21, 23, 22, 22, 24, 21, 22, 23, 23, - 21, 21, 22, 21, 23, 22, 23, 23, 20, 22, 22, 22, 23, 22, 22, 23, - 26, 26, 20, 19, 22, 23, 22, 25, 26, 26, 26, 27, 27, 26, 24, 25, - 19, 21, 26, 27, 27, 26, 27, 24, 21, 21, 26, 26, 28, 27, 27, 27, - 20, 24, 20, 21, 22, 21, 21, 23, 22, 22, 25, 25, 24, 24, 26, 23, - 26, 27, 26, 26, 27, 27, 27, 27, 27, 28, 27, 27, 27, 27, 27, 26, -} diff --git a/vendor/golang.org/x/net/http2/http2.go b/vendor/golang.org/x/net/http2/http2.go deleted file mode 100644 index b6b0f9ad1..000000000 --- a/vendor/golang.org/x/net/http2/http2.go +++ /dev/null @@ -1,387 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package http2 implements the HTTP/2 protocol. -// -// This package is low-level and intended to be used directly by very -// few people. Most users will use it indirectly through the automatic -// use by the net/http package (from Go 1.6 and later). -// For use in earlier Go versions see ConfigureServer. (Transport support -// requires Go 1.6 or later) -// -// See https://http2.github.io/ for more information on HTTP/2. -// -// See https://http2.golang.org/ for a test server running this code. -// -package http2 // import "golang.org/x/net/http2" - -import ( - "bufio" - "crypto/tls" - "errors" - "fmt" - "io" - "net/http" - "os" - "sort" - "strconv" - "strings" - "sync" - - "golang.org/x/net/lex/httplex" -) - -var ( - VerboseLogs bool - logFrameWrites bool - logFrameReads bool - inTests bool -) - -func init() { - e := os.Getenv("GODEBUG") - if strings.Contains(e, "http2debug=1") { - VerboseLogs = true - } - if strings.Contains(e, "http2debug=2") { - VerboseLogs = true - logFrameWrites = true - logFrameReads = true - } -} - -const ( - // ClientPreface is the string that must be sent by new - // connections from clients. - ClientPreface = "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n" - - // SETTINGS_MAX_FRAME_SIZE default - // http://http2.github.io/http2-spec/#rfc.section.6.5.2 - initialMaxFrameSize = 16384 - - // NextProtoTLS is the NPN/ALPN protocol negotiated during - // HTTP/2's TLS setup. - NextProtoTLS = "h2" - - // http://http2.github.io/http2-spec/#SettingValues - initialHeaderTableSize = 4096 - - initialWindowSize = 65535 // 6.9.2 Initial Flow Control Window Size - - defaultMaxReadFrameSize = 1 << 20 -) - -var ( - clientPreface = []byte(ClientPreface) -) - -type streamState int - -// HTTP/2 stream states. -// -// See http://tools.ietf.org/html/rfc7540#section-5.1. -// -// For simplicity, the server code merges "reserved (local)" into -// "half-closed (remote)". This is one less state transition to track. -// The only downside is that we send PUSH_PROMISEs slightly less -// liberally than allowable. More discussion here: -// https://lists.w3.org/Archives/Public/ietf-http-wg/2016JulSep/0599.html -// -// "reserved (remote)" is omitted since the client code does not -// support server push. -const ( - stateIdle streamState = iota - stateOpen - stateHalfClosedLocal - stateHalfClosedRemote - stateClosed -) - -var stateName = [...]string{ - stateIdle: "Idle", - stateOpen: "Open", - stateHalfClosedLocal: "HalfClosedLocal", - stateHalfClosedRemote: "HalfClosedRemote", - stateClosed: "Closed", -} - -func (st streamState) String() string { - return stateName[st] -} - -// Setting is a setting parameter: which setting it is, and its value. -type Setting struct { - // ID is which setting is being set. - // See http://http2.github.io/http2-spec/#SettingValues - ID SettingID - - // Val is the value. - Val uint32 -} - -func (s Setting) String() string { - return fmt.Sprintf("[%v = %d]", s.ID, s.Val) -} - -// Valid reports whether the setting is valid. -func (s Setting) Valid() error { - // Limits and error codes from 6.5.2 Defined SETTINGS Parameters - switch s.ID { - case SettingEnablePush: - if s.Val != 1 && s.Val != 0 { - return ConnectionError(ErrCodeProtocol) - } - case SettingInitialWindowSize: - if s.Val > 1<<31-1 { - return ConnectionError(ErrCodeFlowControl) - } - case SettingMaxFrameSize: - if s.Val < 16384 || s.Val > 1<<24-1 { - return ConnectionError(ErrCodeProtocol) - } - } - return nil -} - -// A SettingID is an HTTP/2 setting as defined in -// http://http2.github.io/http2-spec/#iana-settings -type SettingID uint16 - -const ( - SettingHeaderTableSize SettingID = 0x1 - SettingEnablePush SettingID = 0x2 - SettingMaxConcurrentStreams SettingID = 0x3 - SettingInitialWindowSize SettingID = 0x4 - SettingMaxFrameSize SettingID = 0x5 - SettingMaxHeaderListSize SettingID = 0x6 -) - -var settingName = map[SettingID]string{ - SettingHeaderTableSize: "HEADER_TABLE_SIZE", - SettingEnablePush: "ENABLE_PUSH", - SettingMaxConcurrentStreams: "MAX_CONCURRENT_STREAMS", - SettingInitialWindowSize: "INITIAL_WINDOW_SIZE", - SettingMaxFrameSize: "MAX_FRAME_SIZE", - SettingMaxHeaderListSize: "MAX_HEADER_LIST_SIZE", -} - -func (s SettingID) String() string { - if v, ok := settingName[s]; ok { - return v - } - return fmt.Sprintf("UNKNOWN_SETTING_%d", uint16(s)) -} - -var ( - errInvalidHeaderFieldName = errors.New("http2: invalid header field name") - errInvalidHeaderFieldValue = errors.New("http2: invalid header field value") -) - -// validWireHeaderFieldName reports whether v is a valid header field -// name (key). See httplex.ValidHeaderName for the base rules. -// -// Further, http2 says: -// "Just as in HTTP/1.x, header field names are strings of ASCII -// characters that are compared in a case-insensitive -// fashion. However, header field names MUST be converted to -// lowercase prior to their encoding in HTTP/2. " -func validWireHeaderFieldName(v string) bool { - if len(v) == 0 { - return false - } - for _, r := range v { - if !httplex.IsTokenRune(r) { - return false - } - if 'A' <= r && r <= 'Z' { - return false - } - } - return true -} - -var httpCodeStringCommon = map[int]string{} // n -> strconv.Itoa(n) - -func init() { - for i := 100; i <= 999; i++ { - if v := http.StatusText(i); v != "" { - httpCodeStringCommon[i] = strconv.Itoa(i) - } - } -} - -func httpCodeString(code int) string { - if s, ok := httpCodeStringCommon[code]; ok { - return s - } - return strconv.Itoa(code) -} - -// from pkg io -type stringWriter interface { - WriteString(s string) (n int, err error) -} - -// A gate lets two goroutines coordinate their activities. -type gate chan struct{} - -func (g gate) Done() { g <- struct{}{} } -func (g gate) Wait() { <-g } - -// A closeWaiter is like a sync.WaitGroup but only goes 1 to 0 (open to closed). -type closeWaiter chan struct{} - -// Init makes a closeWaiter usable. -// It exists because so a closeWaiter value can be placed inside a -// larger struct and have the Mutex and Cond's memory in the same -// allocation. -func (cw *closeWaiter) Init() { - *cw = make(chan struct{}) -} - -// Close marks the closeWaiter as closed and unblocks any waiters. -func (cw closeWaiter) Close() { - close(cw) -} - -// Wait waits for the closeWaiter to become closed. -func (cw closeWaiter) Wait() { - <-cw -} - -// bufferedWriter is a buffered writer that writes to w. -// Its buffered writer is lazily allocated as needed, to minimize -// idle memory usage with many connections. -type bufferedWriter struct { - w io.Writer // immutable - bw *bufio.Writer // non-nil when data is buffered -} - -func newBufferedWriter(w io.Writer) *bufferedWriter { - return &bufferedWriter{w: w} -} - -// bufWriterPoolBufferSize is the size of bufio.Writer's -// buffers created using bufWriterPool. -// -// TODO: pick a less arbitrary value? this is a bit under -// (3 x typical 1500 byte MTU) at least. Other than that, -// not much thought went into it. -const bufWriterPoolBufferSize = 4 << 10 - -var bufWriterPool = sync.Pool{ - New: func() interface{} { - return bufio.NewWriterSize(nil, bufWriterPoolBufferSize) - }, -} - -func (w *bufferedWriter) Available() int { - if w.bw == nil { - return bufWriterPoolBufferSize - } - return w.bw.Available() -} - -func (w *bufferedWriter) Write(p []byte) (n int, err error) { - if w.bw == nil { - bw := bufWriterPool.Get().(*bufio.Writer) - bw.Reset(w.w) - w.bw = bw - } - return w.bw.Write(p) -} - -func (w *bufferedWriter) Flush() error { - bw := w.bw - if bw == nil { - return nil - } - err := bw.Flush() - bw.Reset(nil) - bufWriterPool.Put(bw) - w.bw = nil - return err -} - -func mustUint31(v int32) uint32 { - if v < 0 || v > 2147483647 { - panic("out of range") - } - return uint32(v) -} - -// bodyAllowedForStatus reports whether a given response status code -// permits a body. See RFC 2616, section 4.4. -func bodyAllowedForStatus(status int) bool { - switch { - case status >= 100 && status <= 199: - return false - case status == 204: - return false - case status == 304: - return false - } - return true -} - -type httpError struct { - msg string - timeout bool -} - -func (e *httpError) Error() string { return e.msg } -func (e *httpError) Timeout() bool { return e.timeout } -func (e *httpError) Temporary() bool { return true } - -var errTimeout error = &httpError{msg: "http2: timeout awaiting response headers", timeout: true} - -type connectionStater interface { - ConnectionState() tls.ConnectionState -} - -var sorterPool = sync.Pool{New: func() interface{} { return new(sorter) }} - -type sorter struct { - v []string // owned by sorter -} - -func (s *sorter) Len() int { return len(s.v) } -func (s *sorter) Swap(i, j int) { s.v[i], s.v[j] = s.v[j], s.v[i] } -func (s *sorter) Less(i, j int) bool { return s.v[i] < s.v[j] } - -// Keys returns the sorted keys of h. -// -// The returned slice is only valid until s used again or returned to -// its pool. -func (s *sorter) Keys(h http.Header) []string { - keys := s.v[:0] - for k := range h { - keys = append(keys, k) - } - s.v = keys - sort.Sort(s) - return keys -} - -func (s *sorter) SortStrings(ss []string) { - // Our sorter works on s.v, which sorter owns, so - // stash it away while we sort the user's buffer. - save := s.v - s.v = ss - sort.Sort(s) - s.v = save -} - -// validPseudoPath reports whether v is a valid :path pseudo-header -// value. It must be either: -// -// *) a non-empty string starting with '/', but not with with "//", -// *) the string '*', for OPTIONS requests. -// -// For now this is only used a quick check for deciding when to clean -// up Opaque URLs before sending requests from the Transport. -// See golang.org/issue/16847 -func validPseudoPath(v string) bool { - return (len(v) > 0 && v[0] == '/' && (len(v) == 1 || v[1] != '/')) || v == "*" -} diff --git a/vendor/golang.org/x/net/http2/not_go16.go b/vendor/golang.org/x/net/http2/not_go16.go deleted file mode 100644 index 508cebcc4..000000000 --- a/vendor/golang.org/x/net/http2/not_go16.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !go1.6 - -package http2 - -import ( - "net/http" - "time" -) - -func configureTransport(t1 *http.Transport) (*Transport, error) { - return nil, errTransportVersion -} - -func transportExpectContinueTimeout(t1 *http.Transport) time.Duration { - return 0 - -} diff --git a/vendor/golang.org/x/net/http2/not_go17.go b/vendor/golang.org/x/net/http2/not_go17.go deleted file mode 100644 index 140434a79..000000000 --- a/vendor/golang.org/x/net/http2/not_go17.go +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !go1.7 - -package http2 - -import ( - "crypto/tls" - "net" - "net/http" - "time" -) - -type contextContext interface { - Done() <-chan struct{} - Err() error -} - -type fakeContext struct{} - -func (fakeContext) Done() <-chan struct{} { return nil } -func (fakeContext) Err() error { panic("should not be called") } - -func reqContext(r *http.Request) fakeContext { - return fakeContext{} -} - -func setResponseUncompressed(res *http.Response) { - // Nothing. -} - -type clientTrace struct{} - -func requestTrace(*http.Request) *clientTrace { return nil } -func traceGotConn(*http.Request, *ClientConn) {} -func traceFirstResponseByte(*clientTrace) {} -func traceWroteHeaders(*clientTrace) {} -func traceWroteRequest(*clientTrace, error) {} -func traceGot100Continue(trace *clientTrace) {} -func traceWait100Continue(trace *clientTrace) {} - -func nop() {} - -func serverConnBaseContext(c net.Conn, opts *ServeConnOpts) (ctx contextContext, cancel func()) { - return nil, nop -} - -func contextWithCancel(ctx contextContext) (_ contextContext, cancel func()) { - return ctx, nop -} - -func requestWithContext(req *http.Request, ctx contextContext) *http.Request { - return req -} - -// temporary copy of Go 1.6's private tls.Config.clone: -func cloneTLSConfig(c *tls.Config) *tls.Config { - return &tls.Config{ - Rand: c.Rand, - Time: c.Time, - Certificates: c.Certificates, - NameToCertificate: c.NameToCertificate, - GetCertificate: c.GetCertificate, - RootCAs: c.RootCAs, - NextProtos: c.NextProtos, - ServerName: c.ServerName, - ClientAuth: c.ClientAuth, - ClientCAs: c.ClientCAs, - InsecureSkipVerify: c.InsecureSkipVerify, - CipherSuites: c.CipherSuites, - PreferServerCipherSuites: c.PreferServerCipherSuites, - SessionTicketsDisabled: c.SessionTicketsDisabled, - SessionTicketKey: c.SessionTicketKey, - ClientSessionCache: c.ClientSessionCache, - MinVersion: c.MinVersion, - MaxVersion: c.MaxVersion, - CurvePreferences: c.CurvePreferences, - } -} - -func (cc *ClientConn) Ping(ctx contextContext) error { - return cc.ping(ctx) -} - -func (t *Transport) idleConnTimeout() time.Duration { return 0 } diff --git a/vendor/golang.org/x/net/http2/not_go18.go b/vendor/golang.org/x/net/http2/not_go18.go deleted file mode 100644 index efbf83c32..000000000 --- a/vendor/golang.org/x/net/http2/not_go18.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !go1.8 - -package http2 - -import ( - "io" - "net/http" -) - -func configureServer18(h1 *http.Server, h2 *Server) error { - // No IdleTimeout to sync prior to Go 1.8. - return nil -} - -func shouldLogPanic(panicValue interface{}) bool { - return panicValue != nil -} - -func reqGetBody(req *http.Request) func() (io.ReadCloser, error) { - return nil -} - -func reqBodyIsNoBody(io.ReadCloser) bool { return false } diff --git a/vendor/golang.org/x/net/http2/not_go19.go b/vendor/golang.org/x/net/http2/not_go19.go deleted file mode 100644 index 5ae07726b..000000000 --- a/vendor/golang.org/x/net/http2/not_go19.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !go1.9 - -package http2 - -import ( - "net/http" -) - -func configureServer19(s *http.Server, conf *Server) error { - // not supported prior to go1.9 - return nil -} diff --git a/vendor/golang.org/x/net/http2/pipe.go b/vendor/golang.org/x/net/http2/pipe.go deleted file mode 100644 index 0b9848be8..000000000 --- a/vendor/golang.org/x/net/http2/pipe.go +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package http2 - -import ( - "errors" - "io" - "sync" -) - -// pipe is a goroutine-safe io.Reader/io.Writer pair. It's like -// io.Pipe except there are no PipeReader/PipeWriter halves, and the -// underlying buffer is an interface. (io.Pipe is always unbuffered) -type pipe struct { - mu sync.Mutex - c sync.Cond // c.L lazily initialized to &p.mu - b pipeBuffer // nil when done reading - err error // read error once empty. non-nil means closed. - breakErr error // immediate read error (caller doesn't see rest of b) - donec chan struct{} // closed on error - readFn func() // optional code to run in Read before error -} - -type pipeBuffer interface { - Len() int - io.Writer - io.Reader -} - -func (p *pipe) Len() int { - p.mu.Lock() - defer p.mu.Unlock() - if p.b == nil { - return 0 - } - return p.b.Len() -} - -// Read waits until data is available and copies bytes -// from the buffer into p. -func (p *pipe) Read(d []byte) (n int, err error) { - p.mu.Lock() - defer p.mu.Unlock() - if p.c.L == nil { - p.c.L = &p.mu - } - for { - if p.breakErr != nil { - return 0, p.breakErr - } - if p.b.Len() > 0 { - return p.b.Read(d) - } - if p.err != nil { - if p.readFn != nil { - p.readFn() // e.g. copy trailers - p.readFn = nil // not sticky like p.err - } - p.b = nil - return 0, p.err - } - p.c.Wait() - } -} - -var errClosedPipeWrite = errors.New("write on closed buffer") - -// Write copies bytes from p into the buffer and wakes a reader. -// It is an error to write more data than the buffer can hold. -func (p *pipe) Write(d []byte) (n int, err error) { - p.mu.Lock() - defer p.mu.Unlock() - if p.c.L == nil { - p.c.L = &p.mu - } - defer p.c.Signal() - if p.err != nil { - return 0, errClosedPipeWrite - } - if p.breakErr != nil { - return len(d), nil // discard when there is no reader - } - return p.b.Write(d) -} - -// CloseWithError causes the next Read (waking up a current blocked -// Read if needed) to return the provided err after all data has been -// read. -// -// The error must be non-nil. -func (p *pipe) CloseWithError(err error) { p.closeWithError(&p.err, err, nil) } - -// BreakWithError causes the next Read (waking up a current blocked -// Read if needed) to return the provided err immediately, without -// waiting for unread data. -func (p *pipe) BreakWithError(err error) { p.closeWithError(&p.breakErr, err, nil) } - -// closeWithErrorAndCode is like CloseWithError but also sets some code to run -// in the caller's goroutine before returning the error. -func (p *pipe) closeWithErrorAndCode(err error, fn func()) { p.closeWithError(&p.err, err, fn) } - -func (p *pipe) closeWithError(dst *error, err error, fn func()) { - if err == nil { - panic("err must be non-nil") - } - p.mu.Lock() - defer p.mu.Unlock() - if p.c.L == nil { - p.c.L = &p.mu - } - defer p.c.Signal() - if *dst != nil { - // Already been done. - return - } - p.readFn = fn - if dst == &p.breakErr { - p.b = nil - } - *dst = err - p.closeDoneLocked() -} - -// requires p.mu be held. -func (p *pipe) closeDoneLocked() { - if p.donec == nil { - return - } - // Close if unclosed. This isn't racy since we always - // hold p.mu while closing. - select { - case <-p.donec: - default: - close(p.donec) - } -} - -// Err returns the error (if any) first set by BreakWithError or CloseWithError. -func (p *pipe) Err() error { - p.mu.Lock() - defer p.mu.Unlock() - if p.breakErr != nil { - return p.breakErr - } - return p.err -} - -// Done returns a channel which is closed if and when this pipe is closed -// with CloseWithError. -func (p *pipe) Done() <-chan struct{} { - p.mu.Lock() - defer p.mu.Unlock() - if p.donec == nil { - p.donec = make(chan struct{}) - if p.err != nil || p.breakErr != nil { - // Already hit an error. - p.closeDoneLocked() - } - } - return p.donec -} diff --git a/vendor/golang.org/x/net/http2/server.go b/vendor/golang.org/x/net/http2/server.go deleted file mode 100644 index 7367b31c5..000000000 --- a/vendor/golang.org/x/net/http2/server.go +++ /dev/null @@ -1,2842 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// TODO: turn off the serve goroutine when idle, so -// an idle conn only has the readFrames goroutine active. (which could -// also be optimized probably to pin less memory in crypto/tls). This -// would involve tracking when the serve goroutine is active (atomic -// int32 read/CAS probably?) and starting it up when frames arrive, -// and shutting it down when all handlers exit. the occasional PING -// packets could use time.AfterFunc to call sc.wakeStartServeLoop() -// (which is a no-op if already running) and then queue the PING write -// as normal. The serve loop would then exit in most cases (if no -// Handlers running) and not be woken up again until the PING packet -// returns. - -// TODO (maybe): add a mechanism for Handlers to going into -// half-closed-local mode (rw.(io.Closer) test?) but not exit their -// handler, and continue to be able to read from the -// Request.Body. This would be a somewhat semantic change from HTTP/1 -// (or at least what we expose in net/http), so I'd probably want to -// add it there too. For now, this package says that returning from -// the Handler ServeHTTP function means you're both done reading and -// done writing, without a way to stop just one or the other. - -package http2 - -import ( - "bufio" - "bytes" - "crypto/tls" - "errors" - "fmt" - "io" - "log" - "math" - "net" - "net/http" - "net/textproto" - "net/url" - "os" - "reflect" - "runtime" - "strconv" - "strings" - "sync" - "time" - - "golang.org/x/net/http2/hpack" -) - -const ( - prefaceTimeout = 10 * time.Second - firstSettingsTimeout = 2 * time.Second // should be in-flight with preface anyway - handlerChunkWriteSize = 4 << 10 - defaultMaxStreams = 250 // TODO: make this 100 as the GFE seems to? -) - -var ( - errClientDisconnected = errors.New("client disconnected") - errClosedBody = errors.New("body closed by handler") - errHandlerComplete = errors.New("http2: request body closed due to handler exiting") - errStreamClosed = errors.New("http2: stream closed") -) - -var responseWriterStatePool = sync.Pool{ - New: func() interface{} { - rws := &responseWriterState{} - rws.bw = bufio.NewWriterSize(chunkWriter{rws}, handlerChunkWriteSize) - return rws - }, -} - -// Test hooks. -var ( - testHookOnConn func() - testHookGetServerConn func(*serverConn) - testHookOnPanicMu *sync.Mutex // nil except in tests - testHookOnPanic func(sc *serverConn, panicVal interface{}) (rePanic bool) -) - -// Server is an HTTP/2 server. -type Server struct { - // MaxHandlers limits the number of http.Handler ServeHTTP goroutines - // which may run at a time over all connections. - // Negative or zero no limit. - // TODO: implement - MaxHandlers int - - // MaxConcurrentStreams optionally specifies the number of - // concurrent streams that each client may have open at a - // time. This is unrelated to the number of http.Handler goroutines - // which may be active globally, which is MaxHandlers. - // If zero, MaxConcurrentStreams defaults to at least 100, per - // the HTTP/2 spec's recommendations. - MaxConcurrentStreams uint32 - - // MaxReadFrameSize optionally specifies the largest frame - // this server is willing to read. A valid value is between - // 16k and 16M, inclusive. If zero or otherwise invalid, a - // default value is used. - MaxReadFrameSize uint32 - - // PermitProhibitedCipherSuites, if true, permits the use of - // cipher suites prohibited by the HTTP/2 spec. - PermitProhibitedCipherSuites bool - - // IdleTimeout specifies how long until idle clients should be - // closed with a GOAWAY frame. PING frames are not considered - // activity for the purposes of IdleTimeout. - IdleTimeout time.Duration - - // MaxUploadBufferPerConnection is the size of the initial flow - // control window for each connections. The HTTP/2 spec does not - // allow this to be smaller than 65535 or larger than 2^32-1. - // If the value is outside this range, a default value will be - // used instead. - MaxUploadBufferPerConnection int32 - - // MaxUploadBufferPerStream is the size of the initial flow control - // window for each stream. The HTTP/2 spec does not allow this to - // be larger than 2^32-1. If the value is zero or larger than the - // maximum, a default value will be used instead. - MaxUploadBufferPerStream int32 - - // NewWriteScheduler constructs a write scheduler for a connection. - // If nil, a default scheduler is chosen. - NewWriteScheduler func() WriteScheduler - - // Internal state. This is a pointer (rather than embedded directly) - // so that we don't embed a Mutex in this struct, which will make the - // struct non-copyable, which might break some callers. - state *serverInternalState -} - -func (s *Server) initialConnRecvWindowSize() int32 { - if s.MaxUploadBufferPerConnection > initialWindowSize { - return s.MaxUploadBufferPerConnection - } - return 1 << 20 -} - -func (s *Server) initialStreamRecvWindowSize() int32 { - if s.MaxUploadBufferPerStream > 0 { - return s.MaxUploadBufferPerStream - } - return 1 << 20 -} - -func (s *Server) maxReadFrameSize() uint32 { - if v := s.MaxReadFrameSize; v >= minMaxFrameSize && v <= maxFrameSize { - return v - } - return defaultMaxReadFrameSize -} - -func (s *Server) maxConcurrentStreams() uint32 { - if v := s.MaxConcurrentStreams; v > 0 { - return v - } - return defaultMaxStreams -} - -type serverInternalState struct { - mu sync.Mutex - activeConns map[*serverConn]struct{} -} - -func (s *serverInternalState) registerConn(sc *serverConn) { - if s == nil { - return // if the Server was used without calling ConfigureServer - } - s.mu.Lock() - s.activeConns[sc] = struct{}{} - s.mu.Unlock() -} - -func (s *serverInternalState) unregisterConn(sc *serverConn) { - if s == nil { - return // if the Server was used without calling ConfigureServer - } - s.mu.Lock() - delete(s.activeConns, sc) - s.mu.Unlock() -} - -func (s *serverInternalState) startGracefulShutdown() { - if s == nil { - return // if the Server was used without calling ConfigureServer - } - s.mu.Lock() - for sc := range s.activeConns { - sc.startGracefulShutdown() - } - s.mu.Unlock() -} - -// ConfigureServer adds HTTP/2 support to a net/http Server. -// -// The configuration conf may be nil. -// -// ConfigureServer must be called before s begins serving. -func ConfigureServer(s *http.Server, conf *Server) error { - if s == nil { - panic("nil *http.Server") - } - if conf == nil { - conf = new(Server) - } - conf.state = &serverInternalState{activeConns: make(map[*serverConn]struct{})} - if err := configureServer18(s, conf); err != nil { - return err - } - if err := configureServer19(s, conf); err != nil { - return err - } - - if s.TLSConfig == nil { - s.TLSConfig = new(tls.Config) - } else if s.TLSConfig.CipherSuites != nil { - // If they already provided a CipherSuite list, return - // an error if it has a bad order or is missing - // ECDHE_RSA_WITH_AES_128_GCM_SHA256. - const requiredCipher = tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 - haveRequired := false - sawBad := false - for i, cs := range s.TLSConfig.CipherSuites { - if cs == requiredCipher { - haveRequired = true - } - if isBadCipher(cs) { - sawBad = true - } else if sawBad { - return fmt.Errorf("http2: TLSConfig.CipherSuites index %d contains an HTTP/2-approved cipher suite (%#04x), but it comes after unapproved cipher suites. With this configuration, clients that don't support previous, approved cipher suites may be given an unapproved one and reject the connection.", i, cs) - } - } - if !haveRequired { - return fmt.Errorf("http2: TLSConfig.CipherSuites is missing HTTP/2-required TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256") - } - } - - // Note: not setting MinVersion to tls.VersionTLS12, - // as we don't want to interfere with HTTP/1.1 traffic - // on the user's server. We enforce TLS 1.2 later once - // we accept a connection. Ideally this should be done - // during next-proto selection, but using TLS <1.2 with - // HTTP/2 is still the client's bug. - - s.TLSConfig.PreferServerCipherSuites = true - - haveNPN := false - for _, p := range s.TLSConfig.NextProtos { - if p == NextProtoTLS { - haveNPN = true - break - } - } - if !haveNPN { - s.TLSConfig.NextProtos = append(s.TLSConfig.NextProtos, NextProtoTLS) - } - - if s.TLSNextProto == nil { - s.TLSNextProto = map[string]func(*http.Server, *tls.Conn, http.Handler){} - } - protoHandler := func(hs *http.Server, c *tls.Conn, h http.Handler) { - if testHookOnConn != nil { - testHookOnConn() - } - conf.ServeConn(c, &ServeConnOpts{ - Handler: h, - BaseConfig: hs, - }) - } - s.TLSNextProto[NextProtoTLS] = protoHandler - return nil -} - -// ServeConnOpts are options for the Server.ServeConn method. -type ServeConnOpts struct { - // BaseConfig optionally sets the base configuration - // for values. If nil, defaults are used. - BaseConfig *http.Server - - // Handler specifies which handler to use for processing - // requests. If nil, BaseConfig.Handler is used. If BaseConfig - // or BaseConfig.Handler is nil, http.DefaultServeMux is used. - Handler http.Handler -} - -func (o *ServeConnOpts) baseConfig() *http.Server { - if o != nil && o.BaseConfig != nil { - return o.BaseConfig - } - return new(http.Server) -} - -func (o *ServeConnOpts) handler() http.Handler { - if o != nil { - if o.Handler != nil { - return o.Handler - } - if o.BaseConfig != nil && o.BaseConfig.Handler != nil { - return o.BaseConfig.Handler - } - } - return http.DefaultServeMux -} - -// ServeConn serves HTTP/2 requests on the provided connection and -// blocks until the connection is no longer readable. -// -// ServeConn starts speaking HTTP/2 assuming that c has not had any -// reads or writes. It writes its initial settings frame and expects -// to be able to read the preface and settings frame from the -// client. If c has a ConnectionState method like a *tls.Conn, the -// ConnectionState is used to verify the TLS ciphersuite and to set -// the Request.TLS field in Handlers. -// -// ServeConn does not support h2c by itself. Any h2c support must be -// implemented in terms of providing a suitably-behaving net.Conn. -// -// The opts parameter is optional. If nil, default values are used. -func (s *Server) ServeConn(c net.Conn, opts *ServeConnOpts) { - baseCtx, cancel := serverConnBaseContext(c, opts) - defer cancel() - - sc := &serverConn{ - srv: s, - hs: opts.baseConfig(), - conn: c, - baseCtx: baseCtx, - remoteAddrStr: c.RemoteAddr().String(), - bw: newBufferedWriter(c), - handler: opts.handler(), - streams: make(map[uint32]*stream), - readFrameCh: make(chan readFrameResult), - wantWriteFrameCh: make(chan FrameWriteRequest, 8), - serveMsgCh: make(chan interface{}, 8), - wroteFrameCh: make(chan frameWriteResult, 1), // buffered; one send in writeFrameAsync - bodyReadCh: make(chan bodyReadMsg), // buffering doesn't matter either way - doneServing: make(chan struct{}), - clientMaxStreams: math.MaxUint32, // Section 6.5.2: "Initially, there is no limit to this value" - advMaxStreams: s.maxConcurrentStreams(), - initialStreamSendWindowSize: initialWindowSize, - maxFrameSize: initialMaxFrameSize, - headerTableSize: initialHeaderTableSize, - serveG: newGoroutineLock(), - pushEnabled: true, - } - - s.state.registerConn(sc) - defer s.state.unregisterConn(sc) - - // The net/http package sets the write deadline from the - // http.Server.WriteTimeout during the TLS handshake, but then - // passes the connection off to us with the deadline already set. - // Write deadlines are set per stream in serverConn.newStream. - // Disarm the net.Conn write deadline here. - if sc.hs.WriteTimeout != 0 { - sc.conn.SetWriteDeadline(time.Time{}) - } - - if s.NewWriteScheduler != nil { - sc.writeSched = s.NewWriteScheduler() - } else { - sc.writeSched = NewRandomWriteScheduler() - } - - // These start at the RFC-specified defaults. If there is a higher - // configured value for inflow, that will be updated when we send a - // WINDOW_UPDATE shortly after sending SETTINGS. - sc.flow.add(initialWindowSize) - sc.inflow.add(initialWindowSize) - sc.hpackEncoder = hpack.NewEncoder(&sc.headerWriteBuf) - - fr := NewFramer(sc.bw, c) - fr.ReadMetaHeaders = hpack.NewDecoder(initialHeaderTableSize, nil) - fr.MaxHeaderListSize = sc.maxHeaderListSize() - fr.SetMaxReadFrameSize(s.maxReadFrameSize()) - sc.framer = fr - - if tc, ok := c.(connectionStater); ok { - sc.tlsState = new(tls.ConnectionState) - *sc.tlsState = tc.ConnectionState() - // 9.2 Use of TLS Features - // An implementation of HTTP/2 over TLS MUST use TLS - // 1.2 or higher with the restrictions on feature set - // and cipher suite described in this section. Due to - // implementation limitations, it might not be - // possible to fail TLS negotiation. An endpoint MUST - // immediately terminate an HTTP/2 connection that - // does not meet the TLS requirements described in - // this section with a connection error (Section - // 5.4.1) of type INADEQUATE_SECURITY. - if sc.tlsState.Version < tls.VersionTLS12 { - sc.rejectConn(ErrCodeInadequateSecurity, "TLS version too low") - return - } - - if sc.tlsState.ServerName == "" { - // Client must use SNI, but we don't enforce that anymore, - // since it was causing problems when connecting to bare IP - // addresses during development. - // - // TODO: optionally enforce? Or enforce at the time we receive - // a new request, and verify the the ServerName matches the :authority? - // But that precludes proxy situations, perhaps. - // - // So for now, do nothing here again. - } - - if !s.PermitProhibitedCipherSuites && isBadCipher(sc.tlsState.CipherSuite) { - // "Endpoints MAY choose to generate a connection error - // (Section 5.4.1) of type INADEQUATE_SECURITY if one of - // the prohibited cipher suites are negotiated." - // - // We choose that. In my opinion, the spec is weak - // here. It also says both parties must support at least - // TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 so there's no - // excuses here. If we really must, we could allow an - // "AllowInsecureWeakCiphers" option on the server later. - // Let's see how it plays out first. - sc.rejectConn(ErrCodeInadequateSecurity, fmt.Sprintf("Prohibited TLS 1.2 Cipher Suite: %x", sc.tlsState.CipherSuite)) - return - } - } - - if hook := testHookGetServerConn; hook != nil { - hook(sc) - } - sc.serve() -} - -func (sc *serverConn) rejectConn(err ErrCode, debug string) { - sc.vlogf("http2: server rejecting conn: %v, %s", err, debug) - // ignoring errors. hanging up anyway. - sc.framer.WriteGoAway(0, err, []byte(debug)) - sc.bw.Flush() - sc.conn.Close() -} - -type serverConn struct { - // Immutable: - srv *Server - hs *http.Server - conn net.Conn - bw *bufferedWriter // writing to conn - handler http.Handler - baseCtx contextContext - framer *Framer - doneServing chan struct{} // closed when serverConn.serve ends - readFrameCh chan readFrameResult // written by serverConn.readFrames - wantWriteFrameCh chan FrameWriteRequest // from handlers -> serve - wroteFrameCh chan frameWriteResult // from writeFrameAsync -> serve, tickles more frame writes - bodyReadCh chan bodyReadMsg // from handlers -> serve - serveMsgCh chan interface{} // misc messages & code to send to / run on the serve loop - flow flow // conn-wide (not stream-specific) outbound flow control - inflow flow // conn-wide inbound flow control - tlsState *tls.ConnectionState // shared by all handlers, like net/http - remoteAddrStr string - writeSched WriteScheduler - - // Everything following is owned by the serve loop; use serveG.check(): - serveG goroutineLock // used to verify funcs are on serve() - pushEnabled bool - sawFirstSettings bool // got the initial SETTINGS frame after the preface - needToSendSettingsAck bool - unackedSettings int // how many SETTINGS have we sent without ACKs? - clientMaxStreams uint32 // SETTINGS_MAX_CONCURRENT_STREAMS from client (our PUSH_PROMISE limit) - advMaxStreams uint32 // our SETTINGS_MAX_CONCURRENT_STREAMS advertised the client - curClientStreams uint32 // number of open streams initiated by the client - curPushedStreams uint32 // number of open streams initiated by server push - maxClientStreamID uint32 // max ever seen from client (odd), or 0 if there have been no client requests - maxPushPromiseID uint32 // ID of the last push promise (even), or 0 if there have been no pushes - streams map[uint32]*stream - initialStreamSendWindowSize int32 - maxFrameSize int32 - headerTableSize uint32 - peerMaxHeaderListSize uint32 // zero means unknown (default) - canonHeader map[string]string // http2-lower-case -> Go-Canonical-Case - writingFrame bool // started writing a frame (on serve goroutine or separate) - writingFrameAsync bool // started a frame on its own goroutine but haven't heard back on wroteFrameCh - needsFrameFlush bool // last frame write wasn't a flush - inGoAway bool // we've started to or sent GOAWAY - inFrameScheduleLoop bool // whether we're in the scheduleFrameWrite loop - needToSendGoAway bool // we need to schedule a GOAWAY frame write - goAwayCode ErrCode - shutdownTimer *time.Timer // nil until used - idleTimer *time.Timer // nil if unused - - // Owned by the writeFrameAsync goroutine: - headerWriteBuf bytes.Buffer - hpackEncoder *hpack.Encoder - - // Used by startGracefulShutdown. - shutdownOnce sync.Once -} - -func (sc *serverConn) maxHeaderListSize() uint32 { - n := sc.hs.MaxHeaderBytes - if n <= 0 { - n = http.DefaultMaxHeaderBytes - } - // http2's count is in a slightly different unit and includes 32 bytes per pair. - // So, take the net/http.Server value and pad it up a bit, assuming 10 headers. - const perFieldOverhead = 32 // per http2 spec - const typicalHeaders = 10 // conservative - return uint32(n + typicalHeaders*perFieldOverhead) -} - -func (sc *serverConn) curOpenStreams() uint32 { - sc.serveG.check() - return sc.curClientStreams + sc.curPushedStreams -} - -// stream represents a stream. This is the minimal metadata needed by -// the serve goroutine. Most of the actual stream state is owned by -// the http.Handler's goroutine in the responseWriter. Because the -// responseWriter's responseWriterState is recycled at the end of a -// handler, this struct intentionally has no pointer to the -// *responseWriter{,State} itself, as the Handler ending nils out the -// responseWriter's state field. -type stream struct { - // immutable: - sc *serverConn - id uint32 - body *pipe // non-nil if expecting DATA frames - cw closeWaiter // closed wait stream transitions to closed state - ctx contextContext - cancelCtx func() - - // owned by serverConn's serve loop: - bodyBytes int64 // body bytes seen so far - declBodyBytes int64 // or -1 if undeclared - flow flow // limits writing from Handler to client - inflow flow // what the client is allowed to POST/etc to us - parent *stream // or nil - numTrailerValues int64 - weight uint8 - state streamState - resetQueued bool // RST_STREAM queued for write; set by sc.resetStream - gotTrailerHeader bool // HEADER frame for trailers was seen - wroteHeaders bool // whether we wrote headers (not status 100) - writeDeadline *time.Timer // nil if unused - - trailer http.Header // accumulated trailers - reqTrailer http.Header // handler's Request.Trailer -} - -func (sc *serverConn) Framer() *Framer { return sc.framer } -func (sc *serverConn) CloseConn() error { return sc.conn.Close() } -func (sc *serverConn) Flush() error { return sc.bw.Flush() } -func (sc *serverConn) HeaderEncoder() (*hpack.Encoder, *bytes.Buffer) { - return sc.hpackEncoder, &sc.headerWriteBuf -} - -func (sc *serverConn) state(streamID uint32) (streamState, *stream) { - sc.serveG.check() - // http://tools.ietf.org/html/rfc7540#section-5.1 - if st, ok := sc.streams[streamID]; ok { - return st.state, st - } - // "The first use of a new stream identifier implicitly closes all - // streams in the "idle" state that might have been initiated by - // that peer with a lower-valued stream identifier. For example, if - // a client sends a HEADERS frame on stream 7 without ever sending a - // frame on stream 5, then stream 5 transitions to the "closed" - // state when the first frame for stream 7 is sent or received." - if streamID%2 == 1 { - if streamID <= sc.maxClientStreamID { - return stateClosed, nil - } - } else { - if streamID <= sc.maxPushPromiseID { - return stateClosed, nil - } - } - return stateIdle, nil -} - -// setConnState calls the net/http ConnState hook for this connection, if configured. -// Note that the net/http package does StateNew and StateClosed for us. -// There is currently no plan for StateHijacked or hijacking HTTP/2 connections. -func (sc *serverConn) setConnState(state http.ConnState) { - if sc.hs.ConnState != nil { - sc.hs.ConnState(sc.conn, state) - } -} - -func (sc *serverConn) vlogf(format string, args ...interface{}) { - if VerboseLogs { - sc.logf(format, args...) - } -} - -func (sc *serverConn) logf(format string, args ...interface{}) { - if lg := sc.hs.ErrorLog; lg != nil { - lg.Printf(format, args...) - } else { - log.Printf(format, args...) - } -} - -// errno returns v's underlying uintptr, else 0. -// -// TODO: remove this helper function once http2 can use build -// tags. See comment in isClosedConnError. -func errno(v error) uintptr { - if rv := reflect.ValueOf(v); rv.Kind() == reflect.Uintptr { - return uintptr(rv.Uint()) - } - return 0 -} - -// isClosedConnError reports whether err is an error from use of a closed -// network connection. -func isClosedConnError(err error) bool { - if err == nil { - return false - } - - // TODO: remove this string search and be more like the Windows - // case below. That might involve modifying the standard library - // to return better error types. - str := err.Error() - if strings.Contains(str, "use of closed network connection") { - return true - } - - // TODO(bradfitz): x/tools/cmd/bundle doesn't really support - // build tags, so I can't make an http2_windows.go file with - // Windows-specific stuff. Fix that and move this, once we - // have a way to bundle this into std's net/http somehow. - if runtime.GOOS == "windows" { - if oe, ok := err.(*net.OpError); ok && oe.Op == "read" { - if se, ok := oe.Err.(*os.SyscallError); ok && se.Syscall == "wsarecv" { - const WSAECONNABORTED = 10053 - const WSAECONNRESET = 10054 - if n := errno(se.Err); n == WSAECONNRESET || n == WSAECONNABORTED { - return true - } - } - } - } - return false -} - -func (sc *serverConn) condlogf(err error, format string, args ...interface{}) { - if err == nil { - return - } - if err == io.EOF || err == io.ErrUnexpectedEOF || isClosedConnError(err) { - // Boring, expected errors. - sc.vlogf(format, args...) - } else { - sc.logf(format, args...) - } -} - -func (sc *serverConn) canonicalHeader(v string) string { - sc.serveG.check() - cv, ok := commonCanonHeader[v] - if ok { - return cv - } - cv, ok = sc.canonHeader[v] - if ok { - return cv - } - if sc.canonHeader == nil { - sc.canonHeader = make(map[string]string) - } - cv = http.CanonicalHeaderKey(v) - sc.canonHeader[v] = cv - return cv -} - -type readFrameResult struct { - f Frame // valid until readMore is called - err error - - // readMore should be called once the consumer no longer needs or - // retains f. After readMore, f is invalid and more frames can be - // read. - readMore func() -} - -// readFrames is the loop that reads incoming frames. -// It takes care to only read one frame at a time, blocking until the -// consumer is done with the frame. -// It's run on its own goroutine. -func (sc *serverConn) readFrames() { - gate := make(gate) - gateDone := gate.Done - for { - f, err := sc.framer.ReadFrame() - select { - case sc.readFrameCh <- readFrameResult{f, err, gateDone}: - case <-sc.doneServing: - return - } - select { - case <-gate: - case <-sc.doneServing: - return - } - if terminalReadFrameError(err) { - return - } - } -} - -// frameWriteResult is the message passed from writeFrameAsync to the serve goroutine. -type frameWriteResult struct { - wr FrameWriteRequest // what was written (or attempted) - err error // result of the writeFrame call -} - -// writeFrameAsync runs in its own goroutine and writes a single frame -// and then reports when it's done. -// At most one goroutine can be running writeFrameAsync at a time per -// serverConn. -func (sc *serverConn) writeFrameAsync(wr FrameWriteRequest) { - err := wr.write.writeFrame(sc) - sc.wroteFrameCh <- frameWriteResult{wr, err} -} - -func (sc *serverConn) closeAllStreamsOnConnClose() { - sc.serveG.check() - for _, st := range sc.streams { - sc.closeStream(st, errClientDisconnected) - } -} - -func (sc *serverConn) stopShutdownTimer() { - sc.serveG.check() - if t := sc.shutdownTimer; t != nil { - t.Stop() - } -} - -func (sc *serverConn) notePanic() { - // Note: this is for serverConn.serve panicking, not http.Handler code. - if testHookOnPanicMu != nil { - testHookOnPanicMu.Lock() - defer testHookOnPanicMu.Unlock() - } - if testHookOnPanic != nil { - if e := recover(); e != nil { - if testHookOnPanic(sc, e) { - panic(e) - } - } - } -} - -func (sc *serverConn) serve() { - sc.serveG.check() - defer sc.notePanic() - defer sc.conn.Close() - defer sc.closeAllStreamsOnConnClose() - defer sc.stopShutdownTimer() - defer close(sc.doneServing) // unblocks handlers trying to send - - if VerboseLogs { - sc.vlogf("http2: server connection from %v on %p", sc.conn.RemoteAddr(), sc.hs) - } - - sc.writeFrame(FrameWriteRequest{ - write: writeSettings{ - {SettingMaxFrameSize, sc.srv.maxReadFrameSize()}, - {SettingMaxConcurrentStreams, sc.advMaxStreams}, - {SettingMaxHeaderListSize, sc.maxHeaderListSize()}, - {SettingInitialWindowSize, uint32(sc.srv.initialStreamRecvWindowSize())}, - }, - }) - sc.unackedSettings++ - - // Each connection starts with intialWindowSize inflow tokens. - // If a higher value is configured, we add more tokens. - if diff := sc.srv.initialConnRecvWindowSize() - initialWindowSize; diff > 0 { - sc.sendWindowUpdate(nil, int(diff)) - } - - if err := sc.readPreface(); err != nil { - sc.condlogf(err, "http2: server: error reading preface from client %v: %v", sc.conn.RemoteAddr(), err) - return - } - // Now that we've got the preface, get us out of the - // "StateNew" state. We can't go directly to idle, though. - // Active means we read some data and anticipate a request. We'll - // do another Active when we get a HEADERS frame. - sc.setConnState(http.StateActive) - sc.setConnState(http.StateIdle) - - if sc.srv.IdleTimeout != 0 { - sc.idleTimer = time.AfterFunc(sc.srv.IdleTimeout, sc.onIdleTimer) - defer sc.idleTimer.Stop() - } - - go sc.readFrames() // closed by defer sc.conn.Close above - - settingsTimer := time.AfterFunc(firstSettingsTimeout, sc.onSettingsTimer) - defer settingsTimer.Stop() - - loopNum := 0 - for { - loopNum++ - select { - case wr := <-sc.wantWriteFrameCh: - if se, ok := wr.write.(StreamError); ok { - sc.resetStream(se) - break - } - sc.writeFrame(wr) - case res := <-sc.wroteFrameCh: - sc.wroteFrame(res) - case res := <-sc.readFrameCh: - if !sc.processFrameFromReader(res) { - return - } - res.readMore() - if settingsTimer != nil { - settingsTimer.Stop() - settingsTimer = nil - } - case m := <-sc.bodyReadCh: - sc.noteBodyRead(m.st, m.n) - case msg := <-sc.serveMsgCh: - switch v := msg.(type) { - case func(int): - v(loopNum) // for testing - case *serverMessage: - switch v { - case settingsTimerMsg: - sc.logf("timeout waiting for SETTINGS frames from %v", sc.conn.RemoteAddr()) - return - case idleTimerMsg: - sc.vlogf("connection is idle") - sc.goAway(ErrCodeNo) - case shutdownTimerMsg: - sc.vlogf("GOAWAY close timer fired; closing conn from %v", sc.conn.RemoteAddr()) - return - case gracefulShutdownMsg: - sc.startGracefulShutdownInternal() - default: - panic("unknown timer") - } - case *startPushRequest: - sc.startPush(v) - default: - panic(fmt.Sprintf("unexpected type %T", v)) - } - } - - if sc.inGoAway && sc.curOpenStreams() == 0 && !sc.needToSendGoAway && !sc.writingFrame { - return - } - } -} - -func (sc *serverConn) awaitGracefulShutdown(sharedCh <-chan struct{}, privateCh chan struct{}) { - select { - case <-sc.doneServing: - case <-sharedCh: - close(privateCh) - } -} - -type serverMessage int - -// Message values sent to serveMsgCh. -var ( - settingsTimerMsg = new(serverMessage) - idleTimerMsg = new(serverMessage) - shutdownTimerMsg = new(serverMessage) - gracefulShutdownMsg = new(serverMessage) -) - -func (sc *serverConn) onSettingsTimer() { sc.sendServeMsg(settingsTimerMsg) } -func (sc *serverConn) onIdleTimer() { sc.sendServeMsg(idleTimerMsg) } -func (sc *serverConn) onShutdownTimer() { sc.sendServeMsg(shutdownTimerMsg) } - -func (sc *serverConn) sendServeMsg(msg interface{}) { - sc.serveG.checkNotOn() // NOT - select { - case sc.serveMsgCh <- msg: - case <-sc.doneServing: - } -} - -// readPreface reads the ClientPreface greeting from the peer -// or returns an error on timeout or an invalid greeting. -func (sc *serverConn) readPreface() error { - errc := make(chan error, 1) - go func() { - // Read the client preface - buf := make([]byte, len(ClientPreface)) - if _, err := io.ReadFull(sc.conn, buf); err != nil { - errc <- err - } else if !bytes.Equal(buf, clientPreface) { - errc <- fmt.Errorf("bogus greeting %q", buf) - } else { - errc <- nil - } - }() - timer := time.NewTimer(prefaceTimeout) // TODO: configurable on *Server? - defer timer.Stop() - select { - case <-timer.C: - return errors.New("timeout waiting for client preface") - case err := <-errc: - if err == nil { - if VerboseLogs { - sc.vlogf("http2: server: client %v said hello", sc.conn.RemoteAddr()) - } - } - return err - } -} - -var errChanPool = sync.Pool{ - New: func() interface{} { return make(chan error, 1) }, -} - -var writeDataPool = sync.Pool{ - New: func() interface{} { return new(writeData) }, -} - -// writeDataFromHandler writes DATA response frames from a handler on -// the given stream. -func (sc *serverConn) writeDataFromHandler(stream *stream, data []byte, endStream bool) error { - ch := errChanPool.Get().(chan error) - writeArg := writeDataPool.Get().(*writeData) - *writeArg = writeData{stream.id, data, endStream} - err := sc.writeFrameFromHandler(FrameWriteRequest{ - write: writeArg, - stream: stream, - done: ch, - }) - if err != nil { - return err - } - var frameWriteDone bool // the frame write is done (successfully or not) - select { - case err = <-ch: - frameWriteDone = true - case <-sc.doneServing: - return errClientDisconnected - case <-stream.cw: - // If both ch and stream.cw were ready (as might - // happen on the final Write after an http.Handler - // ends), prefer the write result. Otherwise this - // might just be us successfully closing the stream. - // The writeFrameAsync and serve goroutines guarantee - // that the ch send will happen before the stream.cw - // close. - select { - case err = <-ch: - frameWriteDone = true - default: - return errStreamClosed - } - } - errChanPool.Put(ch) - if frameWriteDone { - writeDataPool.Put(writeArg) - } - return err -} - -// writeFrameFromHandler sends wr to sc.wantWriteFrameCh, but aborts -// if the connection has gone away. -// -// This must not be run from the serve goroutine itself, else it might -// deadlock writing to sc.wantWriteFrameCh (which is only mildly -// buffered and is read by serve itself). If you're on the serve -// goroutine, call writeFrame instead. -func (sc *serverConn) writeFrameFromHandler(wr FrameWriteRequest) error { - sc.serveG.checkNotOn() // NOT - select { - case sc.wantWriteFrameCh <- wr: - return nil - case <-sc.doneServing: - // Serve loop is gone. - // Client has closed their connection to the server. - return errClientDisconnected - } -} - -// writeFrame schedules a frame to write and sends it if there's nothing -// already being written. -// -// There is no pushback here (the serve goroutine never blocks). It's -// the http.Handlers that block, waiting for their previous frames to -// make it onto the wire -// -// If you're not on the serve goroutine, use writeFrameFromHandler instead. -func (sc *serverConn) writeFrame(wr FrameWriteRequest) { - sc.serveG.check() - - // If true, wr will not be written and wr.done will not be signaled. - var ignoreWrite bool - - // We are not allowed to write frames on closed streams. RFC 7540 Section - // 5.1.1 says: "An endpoint MUST NOT send frames other than PRIORITY on - // a closed stream." Our server never sends PRIORITY, so that exception - // does not apply. - // - // The serverConn might close an open stream while the stream's handler - // is still running. For example, the server might close a stream when it - // receives bad data from the client. If this happens, the handler might - // attempt to write a frame after the stream has been closed (since the - // handler hasn't yet been notified of the close). In this case, we simply - // ignore the frame. The handler will notice that the stream is closed when - // it waits for the frame to be written. - // - // As an exception to this rule, we allow sending RST_STREAM after close. - // This allows us to immediately reject new streams without tracking any - // state for those streams (except for the queued RST_STREAM frame). This - // may result in duplicate RST_STREAMs in some cases, but the client should - // ignore those. - if wr.StreamID() != 0 { - _, isReset := wr.write.(StreamError) - if state, _ := sc.state(wr.StreamID()); state == stateClosed && !isReset { - ignoreWrite = true - } - } - - // Don't send a 100-continue response if we've already sent headers. - // See golang.org/issue/14030. - switch wr.write.(type) { - case *writeResHeaders: - wr.stream.wroteHeaders = true - case write100ContinueHeadersFrame: - if wr.stream.wroteHeaders { - // We do not need to notify wr.done because this frame is - // never written with wr.done != nil. - if wr.done != nil { - panic("wr.done != nil for write100ContinueHeadersFrame") - } - ignoreWrite = true - } - } - - if !ignoreWrite { - sc.writeSched.Push(wr) - } - sc.scheduleFrameWrite() -} - -// startFrameWrite starts a goroutine to write wr (in a separate -// goroutine since that might block on the network), and updates the -// serve goroutine's state about the world, updated from info in wr. -func (sc *serverConn) startFrameWrite(wr FrameWriteRequest) { - sc.serveG.check() - if sc.writingFrame { - panic("internal error: can only be writing one frame at a time") - } - - st := wr.stream - if st != nil { - switch st.state { - case stateHalfClosedLocal: - switch wr.write.(type) { - case StreamError, handlerPanicRST, writeWindowUpdate: - // RFC 7540 Section 5.1 allows sending RST_STREAM, PRIORITY, and WINDOW_UPDATE - // in this state. (We never send PRIORITY from the server, so that is not checked.) - default: - panic(fmt.Sprintf("internal error: attempt to send frame on a half-closed-local stream: %v", wr)) - } - case stateClosed: - panic(fmt.Sprintf("internal error: attempt to send frame on a closed stream: %v", wr)) - } - } - if wpp, ok := wr.write.(*writePushPromise); ok { - var err error - wpp.promisedID, err = wpp.allocatePromisedID() - if err != nil { - sc.writingFrameAsync = false - wr.replyToWriter(err) - return - } - } - - sc.writingFrame = true - sc.needsFrameFlush = true - if wr.write.staysWithinBuffer(sc.bw.Available()) { - sc.writingFrameAsync = false - err := wr.write.writeFrame(sc) - sc.wroteFrame(frameWriteResult{wr, err}) - } else { - sc.writingFrameAsync = true - go sc.writeFrameAsync(wr) - } -} - -// errHandlerPanicked is the error given to any callers blocked in a read from -// Request.Body when the main goroutine panics. Since most handlers read in the -// the main ServeHTTP goroutine, this will show up rarely. -var errHandlerPanicked = errors.New("http2: handler panicked") - -// wroteFrame is called on the serve goroutine with the result of -// whatever happened on writeFrameAsync. -func (sc *serverConn) wroteFrame(res frameWriteResult) { - sc.serveG.check() - if !sc.writingFrame { - panic("internal error: expected to be already writing a frame") - } - sc.writingFrame = false - sc.writingFrameAsync = false - - wr := res.wr - - if writeEndsStream(wr.write) { - st := wr.stream - if st == nil { - panic("internal error: expecting non-nil stream") - } - switch st.state { - case stateOpen: - // Here we would go to stateHalfClosedLocal in - // theory, but since our handler is done and - // the net/http package provides no mechanism - // for closing a ResponseWriter while still - // reading data (see possible TODO at top of - // this file), we go into closed state here - // anyway, after telling the peer we're - // hanging up on them. We'll transition to - // stateClosed after the RST_STREAM frame is - // written. - st.state = stateHalfClosedLocal - // Section 8.1: a server MAY request that the client abort - // transmission of a request without error by sending a - // RST_STREAM with an error code of NO_ERROR after sending - // a complete response. - sc.resetStream(streamError(st.id, ErrCodeNo)) - case stateHalfClosedRemote: - sc.closeStream(st, errHandlerComplete) - } - } else { - switch v := wr.write.(type) { - case StreamError: - // st may be unknown if the RST_STREAM was generated to reject bad input. - if st, ok := sc.streams[v.StreamID]; ok { - sc.closeStream(st, v) - } - case handlerPanicRST: - sc.closeStream(wr.stream, errHandlerPanicked) - } - } - - // Reply (if requested) to unblock the ServeHTTP goroutine. - wr.replyToWriter(res.err) - - sc.scheduleFrameWrite() -} - -// scheduleFrameWrite tickles the frame writing scheduler. -// -// If a frame is already being written, nothing happens. This will be called again -// when the frame is done being written. -// -// If a frame isn't being written we need to send one, the best frame -// to send is selected, preferring first things that aren't -// stream-specific (e.g. ACKing settings), and then finding the -// highest priority stream. -// -// If a frame isn't being written and there's nothing else to send, we -// flush the write buffer. -func (sc *serverConn) scheduleFrameWrite() { - sc.serveG.check() - if sc.writingFrame || sc.inFrameScheduleLoop { - return - } - sc.inFrameScheduleLoop = true - for !sc.writingFrameAsync { - if sc.needToSendGoAway { - sc.needToSendGoAway = false - sc.startFrameWrite(FrameWriteRequest{ - write: &writeGoAway{ - maxStreamID: sc.maxClientStreamID, - code: sc.goAwayCode, - }, - }) - continue - } - if sc.needToSendSettingsAck { - sc.needToSendSettingsAck = false - sc.startFrameWrite(FrameWriteRequest{write: writeSettingsAck{}}) - continue - } - if !sc.inGoAway || sc.goAwayCode == ErrCodeNo { - if wr, ok := sc.writeSched.Pop(); ok { - sc.startFrameWrite(wr) - continue - } - } - if sc.needsFrameFlush { - sc.startFrameWrite(FrameWriteRequest{write: flushFrameWriter{}}) - sc.needsFrameFlush = false // after startFrameWrite, since it sets this true - continue - } - break - } - sc.inFrameScheduleLoop = false -} - -// startGracefulShutdown gracefully shuts down a connection. This -// sends GOAWAY with ErrCodeNo to tell the client we're gracefully -// shutting down. The connection isn't closed until all current -// streams are done. -// -// startGracefulShutdown returns immediately; it does not wait until -// the connection has shut down. -func (sc *serverConn) startGracefulShutdown() { - sc.serveG.checkNotOn() // NOT - sc.shutdownOnce.Do(func() { sc.sendServeMsg(gracefulShutdownMsg) }) -} - -func (sc *serverConn) startGracefulShutdownInternal() { - sc.goAwayIn(ErrCodeNo, 0) -} - -func (sc *serverConn) goAway(code ErrCode) { - sc.serveG.check() - var forceCloseIn time.Duration - if code != ErrCodeNo { - forceCloseIn = 250 * time.Millisecond - } else { - // TODO: configurable - forceCloseIn = 1 * time.Second - } - sc.goAwayIn(code, forceCloseIn) -} - -func (sc *serverConn) goAwayIn(code ErrCode, forceCloseIn time.Duration) { - sc.serveG.check() - if sc.inGoAway { - return - } - if forceCloseIn != 0 { - sc.shutDownIn(forceCloseIn) - } - sc.inGoAway = true - sc.needToSendGoAway = true - sc.goAwayCode = code - sc.scheduleFrameWrite() -} - -func (sc *serverConn) shutDownIn(d time.Duration) { - sc.serveG.check() - sc.shutdownTimer = time.AfterFunc(d, sc.onShutdownTimer) -} - -func (sc *serverConn) resetStream(se StreamError) { - sc.serveG.check() - sc.writeFrame(FrameWriteRequest{write: se}) - if st, ok := sc.streams[se.StreamID]; ok { - st.resetQueued = true - } -} - -// processFrameFromReader processes the serve loop's read from readFrameCh from the -// frame-reading goroutine. -// processFrameFromReader returns whether the connection should be kept open. -func (sc *serverConn) processFrameFromReader(res readFrameResult) bool { - sc.serveG.check() - err := res.err - if err != nil { - if err == ErrFrameTooLarge { - sc.goAway(ErrCodeFrameSize) - return true // goAway will close the loop - } - clientGone := err == io.EOF || err == io.ErrUnexpectedEOF || isClosedConnError(err) - if clientGone { - // TODO: could we also get into this state if - // the peer does a half close - // (e.g. CloseWrite) because they're done - // sending frames but they're still wanting - // our open replies? Investigate. - // TODO: add CloseWrite to crypto/tls.Conn first - // so we have a way to test this? I suppose - // just for testing we could have a non-TLS mode. - return false - } - } else { - f := res.f - if VerboseLogs { - sc.vlogf("http2: server read frame %v", summarizeFrame(f)) - } - err = sc.processFrame(f) - if err == nil { - return true - } - } - - switch ev := err.(type) { - case StreamError: - sc.resetStream(ev) - return true - case goAwayFlowError: - sc.goAway(ErrCodeFlowControl) - return true - case ConnectionError: - sc.logf("http2: server connection error from %v: %v", sc.conn.RemoteAddr(), ev) - sc.goAway(ErrCode(ev)) - return true // goAway will handle shutdown - default: - if res.err != nil { - sc.vlogf("http2: server closing client connection; error reading frame from client %s: %v", sc.conn.RemoteAddr(), err) - } else { - sc.logf("http2: server closing client connection: %v", err) - } - return false - } -} - -func (sc *serverConn) processFrame(f Frame) error { - sc.serveG.check() - - // First frame received must be SETTINGS. - if !sc.sawFirstSettings { - if _, ok := f.(*SettingsFrame); !ok { - return ConnectionError(ErrCodeProtocol) - } - sc.sawFirstSettings = true - } - - switch f := f.(type) { - case *SettingsFrame: - return sc.processSettings(f) - case *MetaHeadersFrame: - return sc.processHeaders(f) - case *WindowUpdateFrame: - return sc.processWindowUpdate(f) - case *PingFrame: - return sc.processPing(f) - case *DataFrame: - return sc.processData(f) - case *RSTStreamFrame: - return sc.processResetStream(f) - case *PriorityFrame: - return sc.processPriority(f) - case *GoAwayFrame: - return sc.processGoAway(f) - case *PushPromiseFrame: - // A client cannot push. Thus, servers MUST treat the receipt of a PUSH_PROMISE - // frame as a connection error (Section 5.4.1) of type PROTOCOL_ERROR. - return ConnectionError(ErrCodeProtocol) - default: - sc.vlogf("http2: server ignoring frame: %v", f.Header()) - return nil - } -} - -func (sc *serverConn) processPing(f *PingFrame) error { - sc.serveG.check() - if f.IsAck() { - // 6.7 PING: " An endpoint MUST NOT respond to PING frames - // containing this flag." - return nil - } - if f.StreamID != 0 { - // "PING frames are not associated with any individual - // stream. If a PING frame is received with a stream - // identifier field value other than 0x0, the recipient MUST - // respond with a connection error (Section 5.4.1) of type - // PROTOCOL_ERROR." - return ConnectionError(ErrCodeProtocol) - } - if sc.inGoAway && sc.goAwayCode != ErrCodeNo { - return nil - } - sc.writeFrame(FrameWriteRequest{write: writePingAck{f}}) - return nil -} - -func (sc *serverConn) processWindowUpdate(f *WindowUpdateFrame) error { - sc.serveG.check() - switch { - case f.StreamID != 0: // stream-level flow control - state, st := sc.state(f.StreamID) - if state == stateIdle { - // Section 5.1: "Receiving any frame other than HEADERS - // or PRIORITY on a stream in this state MUST be - // treated as a connection error (Section 5.4.1) of - // type PROTOCOL_ERROR." - return ConnectionError(ErrCodeProtocol) - } - if st == nil { - // "WINDOW_UPDATE can be sent by a peer that has sent a - // frame bearing the END_STREAM flag. This means that a - // receiver could receive a WINDOW_UPDATE frame on a "half - // closed (remote)" or "closed" stream. A receiver MUST - // NOT treat this as an error, see Section 5.1." - return nil - } - if !st.flow.add(int32(f.Increment)) { - return streamError(f.StreamID, ErrCodeFlowControl) - } - default: // connection-level flow control - if !sc.flow.add(int32(f.Increment)) { - return goAwayFlowError{} - } - } - sc.scheduleFrameWrite() - return nil -} - -func (sc *serverConn) processResetStream(f *RSTStreamFrame) error { - sc.serveG.check() - - state, st := sc.state(f.StreamID) - if state == stateIdle { - // 6.4 "RST_STREAM frames MUST NOT be sent for a - // stream in the "idle" state. If a RST_STREAM frame - // identifying an idle stream is received, the - // recipient MUST treat this as a connection error - // (Section 5.4.1) of type PROTOCOL_ERROR. - return ConnectionError(ErrCodeProtocol) - } - if st != nil { - st.cancelCtx() - sc.closeStream(st, streamError(f.StreamID, f.ErrCode)) - } - return nil -} - -func (sc *serverConn) closeStream(st *stream, err error) { - sc.serveG.check() - if st.state == stateIdle || st.state == stateClosed { - panic(fmt.Sprintf("invariant; can't close stream in state %v", st.state)) - } - st.state = stateClosed - if st.writeDeadline != nil { - st.writeDeadline.Stop() - } - if st.isPushed() { - sc.curPushedStreams-- - } else { - sc.curClientStreams-- - } - delete(sc.streams, st.id) - if len(sc.streams) == 0 { - sc.setConnState(http.StateIdle) - if sc.srv.IdleTimeout != 0 { - sc.idleTimer.Reset(sc.srv.IdleTimeout) - } - if h1ServerKeepAlivesDisabled(sc.hs) { - sc.startGracefulShutdownInternal() - } - } - if p := st.body; p != nil { - // Return any buffered unread bytes worth of conn-level flow control. - // See golang.org/issue/16481 - sc.sendWindowUpdate(nil, p.Len()) - - p.CloseWithError(err) - } - st.cw.Close() // signals Handler's CloseNotifier, unblocks writes, etc - sc.writeSched.CloseStream(st.id) -} - -func (sc *serverConn) processSettings(f *SettingsFrame) error { - sc.serveG.check() - if f.IsAck() { - sc.unackedSettings-- - if sc.unackedSettings < 0 { - // Why is the peer ACKing settings we never sent? - // The spec doesn't mention this case, but - // hang up on them anyway. - return ConnectionError(ErrCodeProtocol) - } - return nil - } - if err := f.ForeachSetting(sc.processSetting); err != nil { - return err - } - sc.needToSendSettingsAck = true - sc.scheduleFrameWrite() - return nil -} - -func (sc *serverConn) processSetting(s Setting) error { - sc.serveG.check() - if err := s.Valid(); err != nil { - return err - } - if VerboseLogs { - sc.vlogf("http2: server processing setting %v", s) - } - switch s.ID { - case SettingHeaderTableSize: - sc.headerTableSize = s.Val - sc.hpackEncoder.SetMaxDynamicTableSize(s.Val) - case SettingEnablePush: - sc.pushEnabled = s.Val != 0 - case SettingMaxConcurrentStreams: - sc.clientMaxStreams = s.Val - case SettingInitialWindowSize: - return sc.processSettingInitialWindowSize(s.Val) - case SettingMaxFrameSize: - sc.maxFrameSize = int32(s.Val) // the maximum valid s.Val is < 2^31 - case SettingMaxHeaderListSize: - sc.peerMaxHeaderListSize = s.Val - default: - // Unknown setting: "An endpoint that receives a SETTINGS - // frame with any unknown or unsupported identifier MUST - // ignore that setting." - if VerboseLogs { - sc.vlogf("http2: server ignoring unknown setting %v", s) - } - } - return nil -} - -func (sc *serverConn) processSettingInitialWindowSize(val uint32) error { - sc.serveG.check() - // Note: val already validated to be within range by - // processSetting's Valid call. - - // "A SETTINGS frame can alter the initial flow control window - // size for all current streams. When the value of - // SETTINGS_INITIAL_WINDOW_SIZE changes, a receiver MUST - // adjust the size of all stream flow control windows that it - // maintains by the difference between the new value and the - // old value." - old := sc.initialStreamSendWindowSize - sc.initialStreamSendWindowSize = int32(val) - growth := int32(val) - old // may be negative - for _, st := range sc.streams { - if !st.flow.add(growth) { - // 6.9.2 Initial Flow Control Window Size - // "An endpoint MUST treat a change to - // SETTINGS_INITIAL_WINDOW_SIZE that causes any flow - // control window to exceed the maximum size as a - // connection error (Section 5.4.1) of type - // FLOW_CONTROL_ERROR." - return ConnectionError(ErrCodeFlowControl) - } - } - return nil -} - -func (sc *serverConn) processData(f *DataFrame) error { - sc.serveG.check() - if sc.inGoAway && sc.goAwayCode != ErrCodeNo { - return nil - } - data := f.Data() - - // "If a DATA frame is received whose stream is not in "open" - // or "half closed (local)" state, the recipient MUST respond - // with a stream error (Section 5.4.2) of type STREAM_CLOSED." - id := f.Header().StreamID - state, st := sc.state(id) - if id == 0 || state == stateIdle { - // Section 5.1: "Receiving any frame other than HEADERS - // or PRIORITY on a stream in this state MUST be - // treated as a connection error (Section 5.4.1) of - // type PROTOCOL_ERROR." - return ConnectionError(ErrCodeProtocol) - } - if st == nil || state != stateOpen || st.gotTrailerHeader || st.resetQueued { - // This includes sending a RST_STREAM if the stream is - // in stateHalfClosedLocal (which currently means that - // the http.Handler returned, so it's done reading & - // done writing). Try to stop the client from sending - // more DATA. - - // But still enforce their connection-level flow control, - // and return any flow control bytes since we're not going - // to consume them. - if sc.inflow.available() < int32(f.Length) { - return streamError(id, ErrCodeFlowControl) - } - // Deduct the flow control from inflow, since we're - // going to immediately add it back in - // sendWindowUpdate, which also schedules sending the - // frames. - sc.inflow.take(int32(f.Length)) - sc.sendWindowUpdate(nil, int(f.Length)) // conn-level - - if st != nil && st.resetQueued { - // Already have a stream error in flight. Don't send another. - return nil - } - return streamError(id, ErrCodeStreamClosed) - } - if st.body == nil { - panic("internal error: should have a body in this state") - } - - // Sender sending more than they'd declared? - if st.declBodyBytes != -1 && st.bodyBytes+int64(len(data)) > st.declBodyBytes { - st.body.CloseWithError(fmt.Errorf("sender tried to send more than declared Content-Length of %d bytes", st.declBodyBytes)) - return streamError(id, ErrCodeStreamClosed) - } - if f.Length > 0 { - // Check whether the client has flow control quota. - if st.inflow.available() < int32(f.Length) { - return streamError(id, ErrCodeFlowControl) - } - st.inflow.take(int32(f.Length)) - - if len(data) > 0 { - wrote, err := st.body.Write(data) - if err != nil { - return streamError(id, ErrCodeStreamClosed) - } - if wrote != len(data) { - panic("internal error: bad Writer") - } - st.bodyBytes += int64(len(data)) - } - - // Return any padded flow control now, since we won't - // refund it later on body reads. - if pad := int32(f.Length) - int32(len(data)); pad > 0 { - sc.sendWindowUpdate32(nil, pad) - sc.sendWindowUpdate32(st, pad) - } - } - if f.StreamEnded() { - st.endStream() - } - return nil -} - -func (sc *serverConn) processGoAway(f *GoAwayFrame) error { - sc.serveG.check() - if f.ErrCode != ErrCodeNo { - sc.logf("http2: received GOAWAY %+v, starting graceful shutdown", f) - } else { - sc.vlogf("http2: received GOAWAY %+v, starting graceful shutdown", f) - } - sc.startGracefulShutdownInternal() - // http://tools.ietf.org/html/rfc7540#section-6.8 - // We should not create any new streams, which means we should disable push. - sc.pushEnabled = false - return nil -} - -// isPushed reports whether the stream is server-initiated. -func (st *stream) isPushed() bool { - return st.id%2 == 0 -} - -// endStream closes a Request.Body's pipe. It is called when a DATA -// frame says a request body is over (or after trailers). -func (st *stream) endStream() { - sc := st.sc - sc.serveG.check() - - if st.declBodyBytes != -1 && st.declBodyBytes != st.bodyBytes { - st.body.CloseWithError(fmt.Errorf("request declared a Content-Length of %d but only wrote %d bytes", - st.declBodyBytes, st.bodyBytes)) - } else { - st.body.closeWithErrorAndCode(io.EOF, st.copyTrailersToHandlerRequest) - st.body.CloseWithError(io.EOF) - } - st.state = stateHalfClosedRemote -} - -// copyTrailersToHandlerRequest is run in the Handler's goroutine in -// its Request.Body.Read just before it gets io.EOF. -func (st *stream) copyTrailersToHandlerRequest() { - for k, vv := range st.trailer { - if _, ok := st.reqTrailer[k]; ok { - // Only copy it over it was pre-declared. - st.reqTrailer[k] = vv - } - } -} - -// onWriteTimeout is run on its own goroutine (from time.AfterFunc) -// when the stream's WriteTimeout has fired. -func (st *stream) onWriteTimeout() { - st.sc.writeFrameFromHandler(FrameWriteRequest{write: streamError(st.id, ErrCodeInternal)}) -} - -func (sc *serverConn) processHeaders(f *MetaHeadersFrame) error { - sc.serveG.check() - id := f.StreamID - if sc.inGoAway { - // Ignore. - return nil - } - // http://tools.ietf.org/html/rfc7540#section-5.1.1 - // Streams initiated by a client MUST use odd-numbered stream - // identifiers. [...] An endpoint that receives an unexpected - // stream identifier MUST respond with a connection error - // (Section 5.4.1) of type PROTOCOL_ERROR. - if id%2 != 1 { - return ConnectionError(ErrCodeProtocol) - } - // A HEADERS frame can be used to create a new stream or - // send a trailer for an open one. If we already have a stream - // open, let it process its own HEADERS frame (trailers at this - // point, if it's valid). - if st := sc.streams[f.StreamID]; st != nil { - if st.resetQueued { - // We're sending RST_STREAM to close the stream, so don't bother - // processing this frame. - return nil - } - return st.processTrailerHeaders(f) - } - - // [...] The identifier of a newly established stream MUST be - // numerically greater than all streams that the initiating - // endpoint has opened or reserved. [...] An endpoint that - // receives an unexpected stream identifier MUST respond with - // a connection error (Section 5.4.1) of type PROTOCOL_ERROR. - if id <= sc.maxClientStreamID { - return ConnectionError(ErrCodeProtocol) - } - sc.maxClientStreamID = id - - if sc.idleTimer != nil { - sc.idleTimer.Stop() - } - - // http://tools.ietf.org/html/rfc7540#section-5.1.2 - // [...] Endpoints MUST NOT exceed the limit set by their peer. An - // endpoint that receives a HEADERS frame that causes their - // advertised concurrent stream limit to be exceeded MUST treat - // this as a stream error (Section 5.4.2) of type PROTOCOL_ERROR - // or REFUSED_STREAM. - if sc.curClientStreams+1 > sc.advMaxStreams { - if sc.unackedSettings == 0 { - // They should know better. - return streamError(id, ErrCodeProtocol) - } - // Assume it's a network race, where they just haven't - // received our last SETTINGS update. But actually - // this can't happen yet, because we don't yet provide - // a way for users to adjust server parameters at - // runtime. - return streamError(id, ErrCodeRefusedStream) - } - - initialState := stateOpen - if f.StreamEnded() { - initialState = stateHalfClosedRemote - } - st := sc.newStream(id, 0, initialState) - - if f.HasPriority() { - if err := checkPriority(f.StreamID, f.Priority); err != nil { - return err - } - sc.writeSched.AdjustStream(st.id, f.Priority) - } - - rw, req, err := sc.newWriterAndRequest(st, f) - if err != nil { - return err - } - st.reqTrailer = req.Trailer - if st.reqTrailer != nil { - st.trailer = make(http.Header) - } - st.body = req.Body.(*requestBody).pipe // may be nil - st.declBodyBytes = req.ContentLength - - handler := sc.handler.ServeHTTP - if f.Truncated { - // Their header list was too long. Send a 431 error. - handler = handleHeaderListTooLong - } else if err := checkValidHTTP2RequestHeaders(req.Header); err != nil { - handler = new400Handler(err) - } - - // The net/http package sets the read deadline from the - // http.Server.ReadTimeout during the TLS handshake, but then - // passes the connection off to us with the deadline already - // set. Disarm it here after the request headers are read, - // similar to how the http1 server works. Here it's - // technically more like the http1 Server's ReadHeaderTimeout - // (in Go 1.8), though. That's a more sane option anyway. - if sc.hs.ReadTimeout != 0 { - sc.conn.SetReadDeadline(time.Time{}) - } - - go sc.runHandler(rw, req, handler) - return nil -} - -func (st *stream) processTrailerHeaders(f *MetaHeadersFrame) error { - sc := st.sc - sc.serveG.check() - if st.gotTrailerHeader { - return ConnectionError(ErrCodeProtocol) - } - st.gotTrailerHeader = true - if !f.StreamEnded() { - return streamError(st.id, ErrCodeProtocol) - } - - if len(f.PseudoFields()) > 0 { - return streamError(st.id, ErrCodeProtocol) - } - if st.trailer != nil { - for _, hf := range f.RegularFields() { - key := sc.canonicalHeader(hf.Name) - if !ValidTrailerHeader(key) { - // TODO: send more details to the peer somehow. But http2 has - // no way to send debug data at a stream level. Discuss with - // HTTP folk. - return streamError(st.id, ErrCodeProtocol) - } - st.trailer[key] = append(st.trailer[key], hf.Value) - } - } - st.endStream() - return nil -} - -func checkPriority(streamID uint32, p PriorityParam) error { - if streamID == p.StreamDep { - // Section 5.3.1: "A stream cannot depend on itself. An endpoint MUST treat - // this as a stream error (Section 5.4.2) of type PROTOCOL_ERROR." - // Section 5.3.3 says that a stream can depend on one of its dependencies, - // so it's only self-dependencies that are forbidden. - return streamError(streamID, ErrCodeProtocol) - } - return nil -} - -func (sc *serverConn) processPriority(f *PriorityFrame) error { - if sc.inGoAway { - return nil - } - if err := checkPriority(f.StreamID, f.PriorityParam); err != nil { - return err - } - sc.writeSched.AdjustStream(f.StreamID, f.PriorityParam) - return nil -} - -func (sc *serverConn) newStream(id, pusherID uint32, state streamState) *stream { - sc.serveG.check() - if id == 0 { - panic("internal error: cannot create stream with id 0") - } - - ctx, cancelCtx := contextWithCancel(sc.baseCtx) - st := &stream{ - sc: sc, - id: id, - state: state, - ctx: ctx, - cancelCtx: cancelCtx, - } - st.cw.Init() - st.flow.conn = &sc.flow // link to conn-level counter - st.flow.add(sc.initialStreamSendWindowSize) - st.inflow.conn = &sc.inflow // link to conn-level counter - st.inflow.add(sc.srv.initialStreamRecvWindowSize()) - if sc.hs.WriteTimeout != 0 { - st.writeDeadline = time.AfterFunc(sc.hs.WriteTimeout, st.onWriteTimeout) - } - - sc.streams[id] = st - sc.writeSched.OpenStream(st.id, OpenStreamOptions{PusherID: pusherID}) - if st.isPushed() { - sc.curPushedStreams++ - } else { - sc.curClientStreams++ - } - if sc.curOpenStreams() == 1 { - sc.setConnState(http.StateActive) - } - - return st -} - -func (sc *serverConn) newWriterAndRequest(st *stream, f *MetaHeadersFrame) (*responseWriter, *http.Request, error) { - sc.serveG.check() - - rp := requestParam{ - method: f.PseudoValue("method"), - scheme: f.PseudoValue("scheme"), - authority: f.PseudoValue("authority"), - path: f.PseudoValue("path"), - } - - isConnect := rp.method == "CONNECT" - if isConnect { - if rp.path != "" || rp.scheme != "" || rp.authority == "" { - return nil, nil, streamError(f.StreamID, ErrCodeProtocol) - } - } else if rp.method == "" || rp.path == "" || (rp.scheme != "https" && rp.scheme != "http") { - // See 8.1.2.6 Malformed Requests and Responses: - // - // Malformed requests or responses that are detected - // MUST be treated as a stream error (Section 5.4.2) - // of type PROTOCOL_ERROR." - // - // 8.1.2.3 Request Pseudo-Header Fields - // "All HTTP/2 requests MUST include exactly one valid - // value for the :method, :scheme, and :path - // pseudo-header fields" - return nil, nil, streamError(f.StreamID, ErrCodeProtocol) - } - - bodyOpen := !f.StreamEnded() - if rp.method == "HEAD" && bodyOpen { - // HEAD requests can't have bodies - return nil, nil, streamError(f.StreamID, ErrCodeProtocol) - } - - rp.header = make(http.Header) - for _, hf := range f.RegularFields() { - rp.header.Add(sc.canonicalHeader(hf.Name), hf.Value) - } - if rp.authority == "" { - rp.authority = rp.header.Get("Host") - } - - rw, req, err := sc.newWriterAndRequestNoBody(st, rp) - if err != nil { - return nil, nil, err - } - if bodyOpen { - if vv, ok := rp.header["Content-Length"]; ok { - req.ContentLength, _ = strconv.ParseInt(vv[0], 10, 64) - } else { - req.ContentLength = -1 - } - req.Body.(*requestBody).pipe = &pipe{ - b: &dataBuffer{expected: req.ContentLength}, - } - } - return rw, req, nil -} - -type requestParam struct { - method string - scheme, authority, path string - header http.Header -} - -func (sc *serverConn) newWriterAndRequestNoBody(st *stream, rp requestParam) (*responseWriter, *http.Request, error) { - sc.serveG.check() - - var tlsState *tls.ConnectionState // nil if not scheme https - if rp.scheme == "https" { - tlsState = sc.tlsState - } - - needsContinue := rp.header.Get("Expect") == "100-continue" - if needsContinue { - rp.header.Del("Expect") - } - // Merge Cookie headers into one "; "-delimited value. - if cookies := rp.header["Cookie"]; len(cookies) > 1 { - rp.header.Set("Cookie", strings.Join(cookies, "; ")) - } - - // Setup Trailers - var trailer http.Header - for _, v := range rp.header["Trailer"] { - for _, key := range strings.Split(v, ",") { - key = http.CanonicalHeaderKey(strings.TrimSpace(key)) - switch key { - case "Transfer-Encoding", "Trailer", "Content-Length": - // Bogus. (copy of http1 rules) - // Ignore. - default: - if trailer == nil { - trailer = make(http.Header) - } - trailer[key] = nil - } - } - } - delete(rp.header, "Trailer") - - var url_ *url.URL - var requestURI string - if rp.method == "CONNECT" { - url_ = &url.URL{Host: rp.authority} - requestURI = rp.authority // mimic HTTP/1 server behavior - } else { - var err error - url_, err = url.ParseRequestURI(rp.path) - if err != nil { - return nil, nil, streamError(st.id, ErrCodeProtocol) - } - requestURI = rp.path - } - - body := &requestBody{ - conn: sc, - stream: st, - needsContinue: needsContinue, - } - req := &http.Request{ - Method: rp.method, - URL: url_, - RemoteAddr: sc.remoteAddrStr, - Header: rp.header, - RequestURI: requestURI, - Proto: "HTTP/2.0", - ProtoMajor: 2, - ProtoMinor: 0, - TLS: tlsState, - Host: rp.authority, - Body: body, - Trailer: trailer, - } - req = requestWithContext(req, st.ctx) - - rws := responseWriterStatePool.Get().(*responseWriterState) - bwSave := rws.bw - *rws = responseWriterState{} // zero all the fields - rws.conn = sc - rws.bw = bwSave - rws.bw.Reset(chunkWriter{rws}) - rws.stream = st - rws.req = req - rws.body = body - - rw := &responseWriter{rws: rws} - return rw, req, nil -} - -// Run on its own goroutine. -func (sc *serverConn) runHandler(rw *responseWriter, req *http.Request, handler func(http.ResponseWriter, *http.Request)) { - didPanic := true - defer func() { - rw.rws.stream.cancelCtx() - if didPanic { - e := recover() - sc.writeFrameFromHandler(FrameWriteRequest{ - write: handlerPanicRST{rw.rws.stream.id}, - stream: rw.rws.stream, - }) - // Same as net/http: - if shouldLogPanic(e) { - const size = 64 << 10 - buf := make([]byte, size) - buf = buf[:runtime.Stack(buf, false)] - sc.logf("http2: panic serving %v: %v\n%s", sc.conn.RemoteAddr(), e, buf) - } - return - } - rw.handlerDone() - }() - handler(rw, req) - didPanic = false -} - -func handleHeaderListTooLong(w http.ResponseWriter, r *http.Request) { - // 10.5.1 Limits on Header Block Size: - // .. "A server that receives a larger header block than it is - // willing to handle can send an HTTP 431 (Request Header Fields Too - // Large) status code" - const statusRequestHeaderFieldsTooLarge = 431 // only in Go 1.6+ - w.WriteHeader(statusRequestHeaderFieldsTooLarge) - io.WriteString(w, "

HTTP Error 431

Request Header Field(s) Too Large

") -} - -// called from handler goroutines. -// h may be nil. -func (sc *serverConn) writeHeaders(st *stream, headerData *writeResHeaders) error { - sc.serveG.checkNotOn() // NOT on - var errc chan error - if headerData.h != nil { - // If there's a header map (which we don't own), so we have to block on - // waiting for this frame to be written, so an http.Flush mid-handler - // writes out the correct value of keys, before a handler later potentially - // mutates it. - errc = errChanPool.Get().(chan error) - } - if err := sc.writeFrameFromHandler(FrameWriteRequest{ - write: headerData, - stream: st, - done: errc, - }); err != nil { - return err - } - if errc != nil { - select { - case err := <-errc: - errChanPool.Put(errc) - return err - case <-sc.doneServing: - return errClientDisconnected - case <-st.cw: - return errStreamClosed - } - } - return nil -} - -// called from handler goroutines. -func (sc *serverConn) write100ContinueHeaders(st *stream) { - sc.writeFrameFromHandler(FrameWriteRequest{ - write: write100ContinueHeadersFrame{st.id}, - stream: st, - }) -} - -// A bodyReadMsg tells the server loop that the http.Handler read n -// bytes of the DATA from the client on the given stream. -type bodyReadMsg struct { - st *stream - n int -} - -// called from handler goroutines. -// Notes that the handler for the given stream ID read n bytes of its body -// and schedules flow control tokens to be sent. -func (sc *serverConn) noteBodyReadFromHandler(st *stream, n int, err error) { - sc.serveG.checkNotOn() // NOT on - if n > 0 { - select { - case sc.bodyReadCh <- bodyReadMsg{st, n}: - case <-sc.doneServing: - } - } -} - -func (sc *serverConn) noteBodyRead(st *stream, n int) { - sc.serveG.check() - sc.sendWindowUpdate(nil, n) // conn-level - if st.state != stateHalfClosedRemote && st.state != stateClosed { - // Don't send this WINDOW_UPDATE if the stream is closed - // remotely. - sc.sendWindowUpdate(st, n) - } -} - -// st may be nil for conn-level -func (sc *serverConn) sendWindowUpdate(st *stream, n int) { - sc.serveG.check() - // "The legal range for the increment to the flow control - // window is 1 to 2^31-1 (2,147,483,647) octets." - // A Go Read call on 64-bit machines could in theory read - // a larger Read than this. Very unlikely, but we handle it here - // rather than elsewhere for now. - const maxUint31 = 1<<31 - 1 - for n >= maxUint31 { - sc.sendWindowUpdate32(st, maxUint31) - n -= maxUint31 - } - sc.sendWindowUpdate32(st, int32(n)) -} - -// st may be nil for conn-level -func (sc *serverConn) sendWindowUpdate32(st *stream, n int32) { - sc.serveG.check() - if n == 0 { - return - } - if n < 0 { - panic("negative update") - } - var streamID uint32 - if st != nil { - streamID = st.id - } - sc.writeFrame(FrameWriteRequest{ - write: writeWindowUpdate{streamID: streamID, n: uint32(n)}, - stream: st, - }) - var ok bool - if st == nil { - ok = sc.inflow.add(n) - } else { - ok = st.inflow.add(n) - } - if !ok { - panic("internal error; sent too many window updates without decrements?") - } -} - -// requestBody is the Handler's Request.Body type. -// Read and Close may be called concurrently. -type requestBody struct { - stream *stream - conn *serverConn - closed bool // for use by Close only - sawEOF bool // for use by Read only - pipe *pipe // non-nil if we have a HTTP entity message body - needsContinue bool // need to send a 100-continue -} - -func (b *requestBody) Close() error { - if b.pipe != nil && !b.closed { - b.pipe.BreakWithError(errClosedBody) - } - b.closed = true - return nil -} - -func (b *requestBody) Read(p []byte) (n int, err error) { - if b.needsContinue { - b.needsContinue = false - b.conn.write100ContinueHeaders(b.stream) - } - if b.pipe == nil || b.sawEOF { - return 0, io.EOF - } - n, err = b.pipe.Read(p) - if err == io.EOF { - b.sawEOF = true - } - if b.conn == nil && inTests { - return - } - b.conn.noteBodyReadFromHandler(b.stream, n, err) - return -} - -// responseWriter is the http.ResponseWriter implementation. It's -// intentionally small (1 pointer wide) to minimize garbage. The -// responseWriterState pointer inside is zeroed at the end of a -// request (in handlerDone) and calls on the responseWriter thereafter -// simply crash (caller's mistake), but the much larger responseWriterState -// and buffers are reused between multiple requests. -type responseWriter struct { - rws *responseWriterState -} - -// Optional http.ResponseWriter interfaces implemented. -var ( - _ http.CloseNotifier = (*responseWriter)(nil) - _ http.Flusher = (*responseWriter)(nil) - _ stringWriter = (*responseWriter)(nil) -) - -type responseWriterState struct { - // immutable within a request: - stream *stream - req *http.Request - body *requestBody // to close at end of request, if DATA frames didn't - conn *serverConn - - // TODO: adjust buffer writing sizes based on server config, frame size updates from peer, etc - bw *bufio.Writer // writing to a chunkWriter{this *responseWriterState} - - // mutated by http.Handler goroutine: - handlerHeader http.Header // nil until called - snapHeader http.Header // snapshot of handlerHeader at WriteHeader time - trailers []string // set in writeChunk - status int // status code passed to WriteHeader - wroteHeader bool // WriteHeader called (explicitly or implicitly). Not necessarily sent to user yet. - sentHeader bool // have we sent the header frame? - handlerDone bool // handler has finished - - sentContentLen int64 // non-zero if handler set a Content-Length header - wroteBytes int64 - - closeNotifierMu sync.Mutex // guards closeNotifierCh - closeNotifierCh chan bool // nil until first used -} - -type chunkWriter struct{ rws *responseWriterState } - -func (cw chunkWriter) Write(p []byte) (n int, err error) { return cw.rws.writeChunk(p) } - -func (rws *responseWriterState) hasTrailers() bool { return len(rws.trailers) != 0 } - -// declareTrailer is called for each Trailer header when the -// response header is written. It notes that a header will need to be -// written in the trailers at the end of the response. -func (rws *responseWriterState) declareTrailer(k string) { - k = http.CanonicalHeaderKey(k) - if !ValidTrailerHeader(k) { - // Forbidden by RFC 2616 14.40. - rws.conn.logf("ignoring invalid trailer %q", k) - return - } - if !strSliceContains(rws.trailers, k) { - rws.trailers = append(rws.trailers, k) - } -} - -// writeChunk writes chunks from the bufio.Writer. But because -// bufio.Writer may bypass its chunking, sometimes p may be -// arbitrarily large. -// -// writeChunk is also responsible (on the first chunk) for sending the -// HEADER response. -func (rws *responseWriterState) writeChunk(p []byte) (n int, err error) { - if !rws.wroteHeader { - rws.writeHeader(200) - } - - isHeadResp := rws.req.Method == "HEAD" - if !rws.sentHeader { - rws.sentHeader = true - var ctype, clen string - if clen = rws.snapHeader.Get("Content-Length"); clen != "" { - rws.snapHeader.Del("Content-Length") - clen64, err := strconv.ParseInt(clen, 10, 64) - if err == nil && clen64 >= 0 { - rws.sentContentLen = clen64 - } else { - clen = "" - } - } - if clen == "" && rws.handlerDone && bodyAllowedForStatus(rws.status) && (len(p) > 0 || !isHeadResp) { - clen = strconv.Itoa(len(p)) - } - _, hasContentType := rws.snapHeader["Content-Type"] - if !hasContentType && bodyAllowedForStatus(rws.status) { - ctype = http.DetectContentType(p) - } - var date string - if _, ok := rws.snapHeader["Date"]; !ok { - // TODO(bradfitz): be faster here, like net/http? measure. - date = time.Now().UTC().Format(http.TimeFormat) - } - - for _, v := range rws.snapHeader["Trailer"] { - foreachHeaderElement(v, rws.declareTrailer) - } - - endStream := (rws.handlerDone && !rws.hasTrailers() && len(p) == 0) || isHeadResp - err = rws.conn.writeHeaders(rws.stream, &writeResHeaders{ - streamID: rws.stream.id, - httpResCode: rws.status, - h: rws.snapHeader, - endStream: endStream, - contentType: ctype, - contentLength: clen, - date: date, - }) - if err != nil { - return 0, err - } - if endStream { - return 0, nil - } - } - if isHeadResp { - return len(p), nil - } - if len(p) == 0 && !rws.handlerDone { - return 0, nil - } - - if rws.handlerDone { - rws.promoteUndeclaredTrailers() - } - - endStream := rws.handlerDone && !rws.hasTrailers() - if len(p) > 0 || endStream { - // only send a 0 byte DATA frame if we're ending the stream. - if err := rws.conn.writeDataFromHandler(rws.stream, p, endStream); err != nil { - return 0, err - } - } - - if rws.handlerDone && rws.hasTrailers() { - err = rws.conn.writeHeaders(rws.stream, &writeResHeaders{ - streamID: rws.stream.id, - h: rws.handlerHeader, - trailers: rws.trailers, - endStream: true, - }) - return len(p), err - } - return len(p), nil -} - -// TrailerPrefix is a magic prefix for ResponseWriter.Header map keys -// that, if present, signals that the map entry is actually for -// the response trailers, and not the response headers. The prefix -// is stripped after the ServeHTTP call finishes and the values are -// sent in the trailers. -// -// This mechanism is intended only for trailers that are not known -// prior to the headers being written. If the set of trailers is fixed -// or known before the header is written, the normal Go trailers mechanism -// is preferred: -// https://golang.org/pkg/net/http/#ResponseWriter -// https://golang.org/pkg/net/http/#example_ResponseWriter_trailers -const TrailerPrefix = "Trailer:" - -// promoteUndeclaredTrailers permits http.Handlers to set trailers -// after the header has already been flushed. Because the Go -// ResponseWriter interface has no way to set Trailers (only the -// Header), and because we didn't want to expand the ResponseWriter -// interface, and because nobody used trailers, and because RFC 2616 -// says you SHOULD (but not must) predeclare any trailers in the -// header, the official ResponseWriter rules said trailers in Go must -// be predeclared, and then we reuse the same ResponseWriter.Header() -// map to mean both Headers and Trailers. When it's time to write the -// Trailers, we pick out the fields of Headers that were declared as -// trailers. That worked for a while, until we found the first major -// user of Trailers in the wild: gRPC (using them only over http2), -// and gRPC libraries permit setting trailers mid-stream without -// predeclarnig them. So: change of plans. We still permit the old -// way, but we also permit this hack: if a Header() key begins with -// "Trailer:", the suffix of that key is a Trailer. Because ':' is an -// invalid token byte anyway, there is no ambiguity. (And it's already -// filtered out) It's mildly hacky, but not terrible. -// -// This method runs after the Handler is done and promotes any Header -// fields to be trailers. -func (rws *responseWriterState) promoteUndeclaredTrailers() { - for k, vv := range rws.handlerHeader { - if !strings.HasPrefix(k, TrailerPrefix) { - continue - } - trailerKey := strings.TrimPrefix(k, TrailerPrefix) - rws.declareTrailer(trailerKey) - rws.handlerHeader[http.CanonicalHeaderKey(trailerKey)] = vv - } - - if len(rws.trailers) > 1 { - sorter := sorterPool.Get().(*sorter) - sorter.SortStrings(rws.trailers) - sorterPool.Put(sorter) - } -} - -func (w *responseWriter) Flush() { - rws := w.rws - if rws == nil { - panic("Header called after Handler finished") - } - if rws.bw.Buffered() > 0 { - if err := rws.bw.Flush(); err != nil { - // Ignore the error. The frame writer already knows. - return - } - } else { - // The bufio.Writer won't call chunkWriter.Write - // (writeChunk with zero bytes, so we have to do it - // ourselves to force the HTTP response header and/or - // final DATA frame (with END_STREAM) to be sent. - rws.writeChunk(nil) - } -} - -func (w *responseWriter) CloseNotify() <-chan bool { - rws := w.rws - if rws == nil { - panic("CloseNotify called after Handler finished") - } - rws.closeNotifierMu.Lock() - ch := rws.closeNotifierCh - if ch == nil { - ch = make(chan bool, 1) - rws.closeNotifierCh = ch - cw := rws.stream.cw - go func() { - cw.Wait() // wait for close - ch <- true - }() - } - rws.closeNotifierMu.Unlock() - return ch -} - -func (w *responseWriter) Header() http.Header { - rws := w.rws - if rws == nil { - panic("Header called after Handler finished") - } - if rws.handlerHeader == nil { - rws.handlerHeader = make(http.Header) - } - return rws.handlerHeader -} - -func (w *responseWriter) WriteHeader(code int) { - rws := w.rws - if rws == nil { - panic("WriteHeader called after Handler finished") - } - rws.writeHeader(code) -} - -func (rws *responseWriterState) writeHeader(code int) { - if !rws.wroteHeader { - rws.wroteHeader = true - rws.status = code - if len(rws.handlerHeader) > 0 { - rws.snapHeader = cloneHeader(rws.handlerHeader) - } - } -} - -func cloneHeader(h http.Header) http.Header { - h2 := make(http.Header, len(h)) - for k, vv := range h { - vv2 := make([]string, len(vv)) - copy(vv2, vv) - h2[k] = vv2 - } - return h2 -} - -// The Life Of A Write is like this: -// -// * Handler calls w.Write or w.WriteString -> -// * -> rws.bw (*bufio.Writer) -> -// * (Handler migth call Flush) -// * -> chunkWriter{rws} -// * -> responseWriterState.writeChunk(p []byte) -// * -> responseWriterState.writeChunk (most of the magic; see comment there) -func (w *responseWriter) Write(p []byte) (n int, err error) { - return w.write(len(p), p, "") -} - -func (w *responseWriter) WriteString(s string) (n int, err error) { - return w.write(len(s), nil, s) -} - -// either dataB or dataS is non-zero. -func (w *responseWriter) write(lenData int, dataB []byte, dataS string) (n int, err error) { - rws := w.rws - if rws == nil { - panic("Write called after Handler finished") - } - if !rws.wroteHeader { - w.WriteHeader(200) - } - if !bodyAllowedForStatus(rws.status) { - return 0, http.ErrBodyNotAllowed - } - rws.wroteBytes += int64(len(dataB)) + int64(len(dataS)) // only one can be set - if rws.sentContentLen != 0 && rws.wroteBytes > rws.sentContentLen { - // TODO: send a RST_STREAM - return 0, errors.New("http2: handler wrote more than declared Content-Length") - } - - if dataB != nil { - return rws.bw.Write(dataB) - } else { - return rws.bw.WriteString(dataS) - } -} - -func (w *responseWriter) handlerDone() { - rws := w.rws - rws.handlerDone = true - w.Flush() - w.rws = nil - responseWriterStatePool.Put(rws) -} - -// Push errors. -var ( - ErrRecursivePush = errors.New("http2: recursive push not allowed") - ErrPushLimitReached = errors.New("http2: push would exceed peer's SETTINGS_MAX_CONCURRENT_STREAMS") -) - -// pushOptions is the internal version of http.PushOptions, which we -// cannot include here because it's only defined in Go 1.8 and later. -type pushOptions struct { - Method string - Header http.Header -} - -func (w *responseWriter) push(target string, opts pushOptions) error { - st := w.rws.stream - sc := st.sc - sc.serveG.checkNotOn() - - // No recursive pushes: "PUSH_PROMISE frames MUST only be sent on a peer-initiated stream." - // http://tools.ietf.org/html/rfc7540#section-6.6 - if st.isPushed() { - return ErrRecursivePush - } - - // Default options. - if opts.Method == "" { - opts.Method = "GET" - } - if opts.Header == nil { - opts.Header = http.Header{} - } - wantScheme := "http" - if w.rws.req.TLS != nil { - wantScheme = "https" - } - - // Validate the request. - u, err := url.Parse(target) - if err != nil { - return err - } - if u.Scheme == "" { - if !strings.HasPrefix(target, "/") { - return fmt.Errorf("target must be an absolute URL or an absolute path: %q", target) - } - u.Scheme = wantScheme - u.Host = w.rws.req.Host - } else { - if u.Scheme != wantScheme { - return fmt.Errorf("cannot push URL with scheme %q from request with scheme %q", u.Scheme, wantScheme) - } - if u.Host == "" { - return errors.New("URL must have a host") - } - } - for k := range opts.Header { - if strings.HasPrefix(k, ":") { - return fmt.Errorf("promised request headers cannot include pseudo header %q", k) - } - // These headers are meaningful only if the request has a body, - // but PUSH_PROMISE requests cannot have a body. - // http://tools.ietf.org/html/rfc7540#section-8.2 - // Also disallow Host, since the promised URL must be absolute. - switch strings.ToLower(k) { - case "content-length", "content-encoding", "trailer", "te", "expect", "host": - return fmt.Errorf("promised request headers cannot include %q", k) - } - } - if err := checkValidHTTP2RequestHeaders(opts.Header); err != nil { - return err - } - - // The RFC effectively limits promised requests to GET and HEAD: - // "Promised requests MUST be cacheable [GET, HEAD, or POST], and MUST be safe [GET or HEAD]" - // http://tools.ietf.org/html/rfc7540#section-8.2 - if opts.Method != "GET" && opts.Method != "HEAD" { - return fmt.Errorf("method %q must be GET or HEAD", opts.Method) - } - - msg := &startPushRequest{ - parent: st, - method: opts.Method, - url: u, - header: cloneHeader(opts.Header), - done: errChanPool.Get().(chan error), - } - - select { - case <-sc.doneServing: - return errClientDisconnected - case <-st.cw: - return errStreamClosed - case sc.serveMsgCh <- msg: - } - - select { - case <-sc.doneServing: - return errClientDisconnected - case <-st.cw: - return errStreamClosed - case err := <-msg.done: - errChanPool.Put(msg.done) - return err - } -} - -type startPushRequest struct { - parent *stream - method string - url *url.URL - header http.Header - done chan error -} - -func (sc *serverConn) startPush(msg *startPushRequest) { - sc.serveG.check() - - // http://tools.ietf.org/html/rfc7540#section-6.6. - // PUSH_PROMISE frames MUST only be sent on a peer-initiated stream that - // is in either the "open" or "half-closed (remote)" state. - if msg.parent.state != stateOpen && msg.parent.state != stateHalfClosedRemote { - // responseWriter.Push checks that the stream is peer-initiaed. - msg.done <- errStreamClosed - return - } - - // http://tools.ietf.org/html/rfc7540#section-6.6. - if !sc.pushEnabled { - msg.done <- http.ErrNotSupported - return - } - - // PUSH_PROMISE frames must be sent in increasing order by stream ID, so - // we allocate an ID for the promised stream lazily, when the PUSH_PROMISE - // is written. Once the ID is allocated, we start the request handler. - allocatePromisedID := func() (uint32, error) { - sc.serveG.check() - - // Check this again, just in case. Technically, we might have received - // an updated SETTINGS by the time we got around to writing this frame. - if !sc.pushEnabled { - return 0, http.ErrNotSupported - } - // http://tools.ietf.org/html/rfc7540#section-6.5.2. - if sc.curPushedStreams+1 > sc.clientMaxStreams { - return 0, ErrPushLimitReached - } - - // http://tools.ietf.org/html/rfc7540#section-5.1.1. - // Streams initiated by the server MUST use even-numbered identifiers. - // A server that is unable to establish a new stream identifier can send a GOAWAY - // frame so that the client is forced to open a new connection for new streams. - if sc.maxPushPromiseID+2 >= 1<<31 { - sc.startGracefulShutdownInternal() - return 0, ErrPushLimitReached - } - sc.maxPushPromiseID += 2 - promisedID := sc.maxPushPromiseID - - // http://tools.ietf.org/html/rfc7540#section-8.2. - // Strictly speaking, the new stream should start in "reserved (local)", then - // transition to "half closed (remote)" after sending the initial HEADERS, but - // we start in "half closed (remote)" for simplicity. - // See further comments at the definition of stateHalfClosedRemote. - promised := sc.newStream(promisedID, msg.parent.id, stateHalfClosedRemote) - rw, req, err := sc.newWriterAndRequestNoBody(promised, requestParam{ - method: msg.method, - scheme: msg.url.Scheme, - authority: msg.url.Host, - path: msg.url.RequestURI(), - header: cloneHeader(msg.header), // clone since handler runs concurrently with writing the PUSH_PROMISE - }) - if err != nil { - // Should not happen, since we've already validated msg.url. - panic(fmt.Sprintf("newWriterAndRequestNoBody(%+v): %v", msg.url, err)) - } - - go sc.runHandler(rw, req, sc.handler.ServeHTTP) - return promisedID, nil - } - - sc.writeFrame(FrameWriteRequest{ - write: &writePushPromise{ - streamID: msg.parent.id, - method: msg.method, - url: msg.url, - h: msg.header, - allocatePromisedID: allocatePromisedID, - }, - stream: msg.parent, - done: msg.done, - }) -} - -// foreachHeaderElement splits v according to the "#rule" construction -// in RFC 2616 section 2.1 and calls fn for each non-empty element. -func foreachHeaderElement(v string, fn func(string)) { - v = textproto.TrimString(v) - if v == "" { - return - } - if !strings.Contains(v, ",") { - fn(v) - return - } - for _, f := range strings.Split(v, ",") { - if f = textproto.TrimString(f); f != "" { - fn(f) - } - } -} - -// From http://httpwg.org/specs/rfc7540.html#rfc.section.8.1.2.2 -var connHeaders = []string{ - "Connection", - "Keep-Alive", - "Proxy-Connection", - "Transfer-Encoding", - "Upgrade", -} - -// checkValidHTTP2RequestHeaders checks whether h is a valid HTTP/2 request, -// per RFC 7540 Section 8.1.2.2. -// The returned error is reported to users. -func checkValidHTTP2RequestHeaders(h http.Header) error { - for _, k := range connHeaders { - if _, ok := h[k]; ok { - return fmt.Errorf("request header %q is not valid in HTTP/2", k) - } - } - te := h["Te"] - if len(te) > 0 && (len(te) > 1 || (te[0] != "trailers" && te[0] != "")) { - return errors.New(`request header "TE" may only be "trailers" in HTTP/2`) - } - return nil -} - -func new400Handler(err error) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - http.Error(w, err.Error(), http.StatusBadRequest) - } -} - -// ValidTrailerHeader reports whether name is a valid header field name to appear -// in trailers. -// See: http://tools.ietf.org/html/rfc7230#section-4.1.2 -func ValidTrailerHeader(name string) bool { - name = http.CanonicalHeaderKey(name) - if strings.HasPrefix(name, "If-") || badTrailer[name] { - return false - } - return true -} - -var badTrailer = map[string]bool{ - "Authorization": true, - "Cache-Control": true, - "Connection": true, - "Content-Encoding": true, - "Content-Length": true, - "Content-Range": true, - "Content-Type": true, - "Expect": true, - "Host": true, - "Keep-Alive": true, - "Max-Forwards": true, - "Pragma": true, - "Proxy-Authenticate": true, - "Proxy-Authorization": true, - "Proxy-Connection": true, - "Range": true, - "Realm": true, - "Te": true, - "Trailer": true, - "Transfer-Encoding": true, - "Www-Authenticate": true, -} - -// h1ServerKeepAlivesDisabled reports whether hs has its keep-alives -// disabled. See comments on h1ServerShutdownChan above for why -// the code is written this way. -func h1ServerKeepAlivesDisabled(hs *http.Server) bool { - var x interface{} = hs - type I interface { - doKeepAlives() bool - } - if hs, ok := x.(I); ok { - return !hs.doKeepAlives() - } - return false -} diff --git a/vendor/golang.org/x/net/http2/transport.go b/vendor/golang.org/x/net/http2/transport.go deleted file mode 100644 index 3a85f25a2..000000000 --- a/vendor/golang.org/x/net/http2/transport.go +++ /dev/null @@ -1,2123 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Transport code. - -package http2 - -import ( - "bufio" - "bytes" - "compress/gzip" - "crypto/rand" - "crypto/tls" - "errors" - "fmt" - "io" - "io/ioutil" - "log" - "math" - "net" - "net/http" - "sort" - "strconv" - "strings" - "sync" - "time" - - "golang.org/x/net/http2/hpack" - "golang.org/x/net/idna" - "golang.org/x/net/lex/httplex" -) - -const ( - // transportDefaultConnFlow is how many connection-level flow control - // tokens we give the server at start-up, past the default 64k. - transportDefaultConnFlow = 1 << 30 - - // transportDefaultStreamFlow is how many stream-level flow - // control tokens we announce to the peer, and how many bytes - // we buffer per stream. - transportDefaultStreamFlow = 4 << 20 - - // transportDefaultStreamMinRefresh is the minimum number of bytes we'll send - // a stream-level WINDOW_UPDATE for at a time. - transportDefaultStreamMinRefresh = 4 << 10 - - defaultUserAgent = "Go-http-client/2.0" -) - -// Transport is an HTTP/2 Transport. -// -// A Transport internally caches connections to servers. It is safe -// for concurrent use by multiple goroutines. -type Transport struct { - // DialTLS specifies an optional dial function for creating - // TLS connections for requests. - // - // If DialTLS is nil, tls.Dial is used. - // - // If the returned net.Conn has a ConnectionState method like tls.Conn, - // it will be used to set http.Response.TLS. - DialTLS func(network, addr string, cfg *tls.Config) (net.Conn, error) - - // TLSClientConfig specifies the TLS configuration to use with - // tls.Client. If nil, the default configuration is used. - TLSClientConfig *tls.Config - - // ConnPool optionally specifies an alternate connection pool to use. - // If nil, the default is used. - ConnPool ClientConnPool - - // DisableCompression, if true, prevents the Transport from - // requesting compression with an "Accept-Encoding: gzip" - // request header when the Request contains no existing - // Accept-Encoding value. If the Transport requests gzip on - // its own and gets a gzipped response, it's transparently - // decoded in the Response.Body. However, if the user - // explicitly requested gzip it is not automatically - // uncompressed. - DisableCompression bool - - // AllowHTTP, if true, permits HTTP/2 requests using the insecure, - // plain-text "http" scheme. Note that this does not enable h2c support. - AllowHTTP bool - - // MaxHeaderListSize is the http2 SETTINGS_MAX_HEADER_LIST_SIZE to - // send in the initial settings frame. It is how many bytes - // of response headers are allow. Unlike the http2 spec, zero here - // means to use a default limit (currently 10MB). If you actually - // want to advertise an ulimited value to the peer, Transport - // interprets the highest possible value here (0xffffffff or 1<<32-1) - // to mean no limit. - MaxHeaderListSize uint32 - - // t1, if non-nil, is the standard library Transport using - // this transport. Its settings are used (but not its - // RoundTrip method, etc). - t1 *http.Transport - - connPoolOnce sync.Once - connPoolOrDef ClientConnPool // non-nil version of ConnPool -} - -func (t *Transport) maxHeaderListSize() uint32 { - if t.MaxHeaderListSize == 0 { - return 10 << 20 - } - if t.MaxHeaderListSize == 0xffffffff { - return 0 - } - return t.MaxHeaderListSize -} - -func (t *Transport) disableCompression() bool { - return t.DisableCompression || (t.t1 != nil && t.t1.DisableCompression) -} - -var errTransportVersion = errors.New("http2: ConfigureTransport is only supported starting at Go 1.6") - -// ConfigureTransport configures a net/http HTTP/1 Transport to use HTTP/2. -// It requires Go 1.6 or later and returns an error if the net/http package is too old -// or if t1 has already been HTTP/2-enabled. -func ConfigureTransport(t1 *http.Transport) error { - _, err := configureTransport(t1) // in configure_transport.go (go1.6) or not_go16.go - return err -} - -func (t *Transport) connPool() ClientConnPool { - t.connPoolOnce.Do(t.initConnPool) - return t.connPoolOrDef -} - -func (t *Transport) initConnPool() { - if t.ConnPool != nil { - t.connPoolOrDef = t.ConnPool - } else { - t.connPoolOrDef = &clientConnPool{t: t} - } -} - -// ClientConn is the state of a single HTTP/2 client connection to an -// HTTP/2 server. -type ClientConn struct { - t *Transport - tconn net.Conn // usually *tls.Conn, except specialized impls - tlsState *tls.ConnectionState // nil only for specialized impls - singleUse bool // whether being used for a single http.Request - - // readLoop goroutine fields: - readerDone chan struct{} // closed on error - readerErr error // set before readerDone is closed - - idleTimeout time.Duration // or 0 for never - idleTimer *time.Timer - - mu sync.Mutex // guards following - cond *sync.Cond // hold mu; broadcast on flow/closed changes - flow flow // our conn-level flow control quota (cs.flow is per stream) - inflow flow // peer's conn-level flow control - closed bool - wantSettingsAck bool // we sent a SETTINGS frame and haven't heard back - goAway *GoAwayFrame // if non-nil, the GoAwayFrame we received - goAwayDebug string // goAway frame's debug data, retained as a string - streams map[uint32]*clientStream // client-initiated - nextStreamID uint32 - pings map[[8]byte]chan struct{} // in flight ping data to notification channel - bw *bufio.Writer - br *bufio.Reader - fr *Framer - lastActive time.Time - // Settings from peer: (also guarded by mu) - maxFrameSize uint32 - maxConcurrentStreams uint32 - initialWindowSize uint32 - - hbuf bytes.Buffer // HPACK encoder writes into this - henc *hpack.Encoder - freeBuf [][]byte - - wmu sync.Mutex // held while writing; acquire AFTER mu if holding both - werr error // first write error that has occurred -} - -// clientStream is the state for a single HTTP/2 stream. One of these -// is created for each Transport.RoundTrip call. -type clientStream struct { - cc *ClientConn - req *http.Request - trace *clientTrace // or nil - ID uint32 - resc chan resAndError - bufPipe pipe // buffered pipe with the flow-controlled response payload - startedWrite bool // started request body write; guarded by cc.mu - requestedGzip bool - on100 func() // optional code to run if get a 100 continue response - - flow flow // guarded by cc.mu - inflow flow // guarded by cc.mu - bytesRemain int64 // -1 means unknown; owned by transportResponseBody.Read - readErr error // sticky read error; owned by transportResponseBody.Read - stopReqBody error // if non-nil, stop writing req body; guarded by cc.mu - didReset bool // whether we sent a RST_STREAM to the server; guarded by cc.mu - - peerReset chan struct{} // closed on peer reset - resetErr error // populated before peerReset is closed - - done chan struct{} // closed when stream remove from cc.streams map; close calls guarded by cc.mu - - // owned by clientConnReadLoop: - firstByte bool // got the first response byte - pastHeaders bool // got first MetaHeadersFrame (actual headers) - pastTrailers bool // got optional second MetaHeadersFrame (trailers) - - trailer http.Header // accumulated trailers - resTrailer *http.Header // client's Response.Trailer -} - -// awaitRequestCancel runs in its own goroutine and waits for the user -// to cancel a RoundTrip request, its context to expire, or for the -// request to be done (any way it might be removed from the cc.streams -// map: peer reset, successful completion, TCP connection breakage, -// etc) -func (cs *clientStream) awaitRequestCancel(req *http.Request) { - ctx := reqContext(req) - if req.Cancel == nil && ctx.Done() == nil { - return - } - select { - case <-req.Cancel: - cs.cancelStream() - cs.bufPipe.CloseWithError(errRequestCanceled) - case <-ctx.Done(): - cs.cancelStream() - cs.bufPipe.CloseWithError(ctx.Err()) - case <-cs.done: - } -} - -func (cs *clientStream) cancelStream() { - cs.cc.mu.Lock() - didReset := cs.didReset - cs.didReset = true - cs.cc.mu.Unlock() - - if !didReset { - cs.cc.writeStreamReset(cs.ID, ErrCodeCancel, nil) - } -} - -// checkResetOrDone reports any error sent in a RST_STREAM frame by the -// server, or errStreamClosed if the stream is complete. -func (cs *clientStream) checkResetOrDone() error { - select { - case <-cs.peerReset: - return cs.resetErr - case <-cs.done: - return errStreamClosed - default: - return nil - } -} - -func (cs *clientStream) abortRequestBodyWrite(err error) { - if err == nil { - panic("nil error") - } - cc := cs.cc - cc.mu.Lock() - cs.stopReqBody = err - cc.cond.Broadcast() - cc.mu.Unlock() -} - -type stickyErrWriter struct { - w io.Writer - err *error -} - -func (sew stickyErrWriter) Write(p []byte) (n int, err error) { - if *sew.err != nil { - return 0, *sew.err - } - n, err = sew.w.Write(p) - *sew.err = err - return -} - -var ErrNoCachedConn = errors.New("http2: no cached connection was available") - -// RoundTripOpt are options for the Transport.RoundTripOpt method. -type RoundTripOpt struct { - // OnlyCachedConn controls whether RoundTripOpt may - // create a new TCP connection. If set true and - // no cached connection is available, RoundTripOpt - // will return ErrNoCachedConn. - OnlyCachedConn bool -} - -func (t *Transport) RoundTrip(req *http.Request) (*http.Response, error) { - return t.RoundTripOpt(req, RoundTripOpt{}) -} - -// authorityAddr returns a given authority (a host/IP, or host:port / ip:port) -// and returns a host:port. The port 443 is added if needed. -func authorityAddr(scheme string, authority string) (addr string) { - host, port, err := net.SplitHostPort(authority) - if err != nil { // authority didn't have a port - port = "443" - if scheme == "http" { - port = "80" - } - host = authority - } - if a, err := idna.ToASCII(host); err == nil { - host = a - } - // IPv6 address literal, without a port: - if strings.HasPrefix(host, "[") && strings.HasSuffix(host, "]") { - return host + ":" + port - } - return net.JoinHostPort(host, port) -} - -// RoundTripOpt is like RoundTrip, but takes options. -func (t *Transport) RoundTripOpt(req *http.Request, opt RoundTripOpt) (*http.Response, error) { - if !(req.URL.Scheme == "https" || (req.URL.Scheme == "http" && t.AllowHTTP)) { - return nil, errors.New("http2: unsupported scheme") - } - - addr := authorityAddr(req.URL.Scheme, req.URL.Host) - for { - cc, err := t.connPool().GetClientConn(req, addr) - if err != nil { - t.vlogf("http2: Transport failed to get client conn for %s: %v", addr, err) - return nil, err - } - traceGotConn(req, cc) - res, err := cc.RoundTrip(req) - if err != nil { - if req, err = shouldRetryRequest(req, err); err == nil { - continue - } - } - if err != nil { - t.vlogf("RoundTrip failure: %v", err) - return nil, err - } - return res, nil - } -} - -// CloseIdleConnections closes any connections which were previously -// connected from previous requests but are now sitting idle. -// It does not interrupt any connections currently in use. -func (t *Transport) CloseIdleConnections() { - if cp, ok := t.connPool().(clientConnPoolIdleCloser); ok { - cp.closeIdleConnections() - } -} - -var ( - errClientConnClosed = errors.New("http2: client conn is closed") - errClientConnUnusable = errors.New("http2: client conn not usable") - - errClientConnGotGoAway = errors.New("http2: Transport received Server's graceful shutdown GOAWAY") - errClientConnGotGoAwayAfterSomeReqBody = errors.New("http2: Transport received Server's graceful shutdown GOAWAY; some request body already written") -) - -// shouldRetryRequest is called by RoundTrip when a request fails to get -// response headers. It is always called with a non-nil error. -// It returns either a request to retry (either the same request, or a -// modified clone), or an error if the request can't be replayed. -func shouldRetryRequest(req *http.Request, err error) (*http.Request, error) { - switch err { - default: - return nil, err - case errClientConnUnusable, errClientConnGotGoAway: - return req, nil - case errClientConnGotGoAwayAfterSomeReqBody: - // If the Body is nil (or http.NoBody), it's safe to reuse - // this request and its Body. - if req.Body == nil || reqBodyIsNoBody(req.Body) { - return req, nil - } - // Otherwise we depend on the Request having its GetBody - // func defined. - getBody := reqGetBody(req) // Go 1.8: getBody = req.GetBody - if getBody == nil { - return nil, errors.New("http2: Transport: peer server initiated graceful shutdown after some of Request.Body was written; define Request.GetBody to avoid this error") - } - body, err := getBody() - if err != nil { - return nil, err - } - newReq := *req - newReq.Body = body - return &newReq, nil - } -} - -func (t *Transport) dialClientConn(addr string, singleUse bool) (*ClientConn, error) { - host, _, err := net.SplitHostPort(addr) - if err != nil { - return nil, err - } - tconn, err := t.dialTLS()("tcp", addr, t.newTLSConfig(host)) - if err != nil { - return nil, err - } - return t.newClientConn(tconn, singleUse) -} - -func (t *Transport) newTLSConfig(host string) *tls.Config { - cfg := new(tls.Config) - if t.TLSClientConfig != nil { - *cfg = *cloneTLSConfig(t.TLSClientConfig) - } - if !strSliceContains(cfg.NextProtos, NextProtoTLS) { - cfg.NextProtos = append([]string{NextProtoTLS}, cfg.NextProtos...) - } - if cfg.ServerName == "" { - cfg.ServerName = host - } - return cfg -} - -func (t *Transport) dialTLS() func(string, string, *tls.Config) (net.Conn, error) { - if t.DialTLS != nil { - return t.DialTLS - } - return t.dialTLSDefault -} - -func (t *Transport) dialTLSDefault(network, addr string, cfg *tls.Config) (net.Conn, error) { - cn, err := tls.Dial(network, addr, cfg) - if err != nil { - return nil, err - } - if err := cn.Handshake(); err != nil { - return nil, err - } - if !cfg.InsecureSkipVerify { - if err := cn.VerifyHostname(cfg.ServerName); err != nil { - return nil, err - } - } - state := cn.ConnectionState() - if p := state.NegotiatedProtocol; p != NextProtoTLS { - return nil, fmt.Errorf("http2: unexpected ALPN protocol %q; want %q", p, NextProtoTLS) - } - if !state.NegotiatedProtocolIsMutual { - return nil, errors.New("http2: could not negotiate protocol mutually") - } - return cn, nil -} - -// disableKeepAlives reports whether connections should be closed as -// soon as possible after handling the first request. -func (t *Transport) disableKeepAlives() bool { - return t.t1 != nil && t.t1.DisableKeepAlives -} - -func (t *Transport) expectContinueTimeout() time.Duration { - if t.t1 == nil { - return 0 - } - return transportExpectContinueTimeout(t.t1) -} - -func (t *Transport) NewClientConn(c net.Conn) (*ClientConn, error) { - return t.newClientConn(c, false) -} - -func (t *Transport) newClientConn(c net.Conn, singleUse bool) (*ClientConn, error) { - cc := &ClientConn{ - t: t, - tconn: c, - readerDone: make(chan struct{}), - nextStreamID: 1, - maxFrameSize: 16 << 10, // spec default - initialWindowSize: 65535, // spec default - maxConcurrentStreams: 1000, // "infinite", per spec. 1000 seems good enough. - streams: make(map[uint32]*clientStream), - singleUse: singleUse, - wantSettingsAck: true, - pings: make(map[[8]byte]chan struct{}), - } - if d := t.idleConnTimeout(); d != 0 { - cc.idleTimeout = d - cc.idleTimer = time.AfterFunc(d, cc.onIdleTimeout) - } - if VerboseLogs { - t.vlogf("http2: Transport creating client conn %p to %v", cc, c.RemoteAddr()) - } - - cc.cond = sync.NewCond(&cc.mu) - cc.flow.add(int32(initialWindowSize)) - - // TODO: adjust this writer size to account for frame size + - // MTU + crypto/tls record padding. - cc.bw = bufio.NewWriter(stickyErrWriter{c, &cc.werr}) - cc.br = bufio.NewReader(c) - cc.fr = NewFramer(cc.bw, cc.br) - cc.fr.ReadMetaHeaders = hpack.NewDecoder(initialHeaderTableSize, nil) - cc.fr.MaxHeaderListSize = t.maxHeaderListSize() - - // TODO: SetMaxDynamicTableSize, SetMaxDynamicTableSizeLimit on - // henc in response to SETTINGS frames? - cc.henc = hpack.NewEncoder(&cc.hbuf) - - if cs, ok := c.(connectionStater); ok { - state := cs.ConnectionState() - cc.tlsState = &state - } - - initialSettings := []Setting{ - {ID: SettingEnablePush, Val: 0}, - {ID: SettingInitialWindowSize, Val: transportDefaultStreamFlow}, - } - if max := t.maxHeaderListSize(); max != 0 { - initialSettings = append(initialSettings, Setting{ID: SettingMaxHeaderListSize, Val: max}) - } - - cc.bw.Write(clientPreface) - cc.fr.WriteSettings(initialSettings...) - cc.fr.WriteWindowUpdate(0, transportDefaultConnFlow) - cc.inflow.add(transportDefaultConnFlow + initialWindowSize) - cc.bw.Flush() - if cc.werr != nil { - return nil, cc.werr - } - - go cc.readLoop() - return cc, nil -} - -func (cc *ClientConn) setGoAway(f *GoAwayFrame) { - cc.mu.Lock() - defer cc.mu.Unlock() - - old := cc.goAway - cc.goAway = f - - // Merge the previous and current GoAway error frames. - if cc.goAwayDebug == "" { - cc.goAwayDebug = string(f.DebugData()) - } - if old != nil && old.ErrCode != ErrCodeNo { - cc.goAway.ErrCode = old.ErrCode - } - last := f.LastStreamID - for streamID, cs := range cc.streams { - if streamID > last { - select { - case cs.resc <- resAndError{err: errClientConnGotGoAway}: - default: - } - } - } -} - -func (cc *ClientConn) CanTakeNewRequest() bool { - cc.mu.Lock() - defer cc.mu.Unlock() - return cc.canTakeNewRequestLocked() -} - -func (cc *ClientConn) canTakeNewRequestLocked() bool { - if cc.singleUse && cc.nextStreamID > 1 { - return false - } - return cc.goAway == nil && !cc.closed && - int64(len(cc.streams)+1) < int64(cc.maxConcurrentStreams) && - cc.nextStreamID < math.MaxInt32 -} - -// onIdleTimeout is called from a time.AfterFunc goroutine. It will -// only be called when we're idle, but because we're coming from a new -// goroutine, there could be a new request coming in at the same time, -// so this simply calls the synchronized closeIfIdle to shut down this -// connection. The timer could just call closeIfIdle, but this is more -// clear. -func (cc *ClientConn) onIdleTimeout() { - cc.closeIfIdle() -} - -func (cc *ClientConn) closeIfIdle() { - cc.mu.Lock() - if len(cc.streams) > 0 { - cc.mu.Unlock() - return - } - cc.closed = true - nextID := cc.nextStreamID - // TODO: do clients send GOAWAY too? maybe? Just Close: - cc.mu.Unlock() - - if VerboseLogs { - cc.vlogf("http2: Transport closing idle conn %p (forSingleUse=%v, maxStream=%v)", cc, cc.singleUse, nextID-2) - } - cc.tconn.Close() -} - -const maxAllocFrameSize = 512 << 10 - -// frameBuffer returns a scratch buffer suitable for writing DATA frames. -// They're capped at the min of the peer's max frame size or 512KB -// (kinda arbitrarily), but definitely capped so we don't allocate 4GB -// bufers. -func (cc *ClientConn) frameScratchBuffer() []byte { - cc.mu.Lock() - size := cc.maxFrameSize - if size > maxAllocFrameSize { - size = maxAllocFrameSize - } - for i, buf := range cc.freeBuf { - if len(buf) >= int(size) { - cc.freeBuf[i] = nil - cc.mu.Unlock() - return buf[:size] - } - } - cc.mu.Unlock() - return make([]byte, size) -} - -func (cc *ClientConn) putFrameScratchBuffer(buf []byte) { - cc.mu.Lock() - defer cc.mu.Unlock() - const maxBufs = 4 // arbitrary; 4 concurrent requests per conn? investigate. - if len(cc.freeBuf) < maxBufs { - cc.freeBuf = append(cc.freeBuf, buf) - return - } - for i, old := range cc.freeBuf { - if old == nil { - cc.freeBuf[i] = buf - return - } - } - // forget about it. -} - -// errRequestCanceled is a copy of net/http's errRequestCanceled because it's not -// exported. At least they'll be DeepEqual for h1-vs-h2 comparisons tests. -var errRequestCanceled = errors.New("net/http: request canceled") - -func commaSeparatedTrailers(req *http.Request) (string, error) { - keys := make([]string, 0, len(req.Trailer)) - for k := range req.Trailer { - k = http.CanonicalHeaderKey(k) - switch k { - case "Transfer-Encoding", "Trailer", "Content-Length": - return "", &badStringError{"invalid Trailer key", k} - } - keys = append(keys, k) - } - if len(keys) > 0 { - sort.Strings(keys) - return strings.Join(keys, ","), nil - } - return "", nil -} - -func (cc *ClientConn) responseHeaderTimeout() time.Duration { - if cc.t.t1 != nil { - return cc.t.t1.ResponseHeaderTimeout - } - // No way to do this (yet?) with just an http2.Transport. Probably - // no need. Request.Cancel this is the new way. We only need to support - // this for compatibility with the old http.Transport fields when - // we're doing transparent http2. - return 0 -} - -// checkConnHeaders checks whether req has any invalid connection-level headers. -// per RFC 7540 section 8.1.2.2: Connection-Specific Header Fields. -// Certain headers are special-cased as okay but not transmitted later. -func checkConnHeaders(req *http.Request) error { - if v := req.Header.Get("Upgrade"); v != "" { - return fmt.Errorf("http2: invalid Upgrade request header: %q", req.Header["Upgrade"]) - } - if vv := req.Header["Transfer-Encoding"]; len(vv) > 0 && (len(vv) > 1 || vv[0] != "" && vv[0] != "chunked") { - return fmt.Errorf("http2: invalid Transfer-Encoding request header: %q", vv) - } - if vv := req.Header["Connection"]; len(vv) > 0 && (len(vv) > 1 || vv[0] != "" && vv[0] != "close" && vv[0] != "keep-alive") { - return fmt.Errorf("http2: invalid Connection request header: %q", vv) - } - return nil -} - -// actualContentLength returns a sanitized version of -// req.ContentLength, where 0 actually means zero (not unknown) and -1 -// means unknown. -func actualContentLength(req *http.Request) int64 { - if req.Body == nil { - return 0 - } - if req.ContentLength != 0 { - return req.ContentLength - } - return -1 -} - -func (cc *ClientConn) RoundTrip(req *http.Request) (*http.Response, error) { - if err := checkConnHeaders(req); err != nil { - return nil, err - } - if cc.idleTimer != nil { - cc.idleTimer.Stop() - } - - trailers, err := commaSeparatedTrailers(req) - if err != nil { - return nil, err - } - hasTrailers := trailers != "" - - cc.mu.Lock() - cc.lastActive = time.Now() - if cc.closed || !cc.canTakeNewRequestLocked() { - cc.mu.Unlock() - return nil, errClientConnUnusable - } - - body := req.Body - hasBody := body != nil - contentLen := actualContentLength(req) - - // TODO(bradfitz): this is a copy of the logic in net/http. Unify somewhere? - var requestedGzip bool - if !cc.t.disableCompression() && - req.Header.Get("Accept-Encoding") == "" && - req.Header.Get("Range") == "" && - req.Method != "HEAD" { - // Request gzip only, not deflate. Deflate is ambiguous and - // not as universally supported anyway. - // See: http://www.gzip.org/zlib/zlib_faq.html#faq38 - // - // Note that we don't request this for HEAD requests, - // due to a bug in nginx: - // http://trac.nginx.org/nginx/ticket/358 - // https://golang.org/issue/5522 - // - // We don't request gzip if the request is for a range, since - // auto-decoding a portion of a gzipped document will just fail - // anyway. See https://golang.org/issue/8923 - requestedGzip = true - } - - // we send: HEADERS{1}, CONTINUATION{0,} + DATA{0,} (DATA is - // sent by writeRequestBody below, along with any Trailers, - // again in form HEADERS{1}, CONTINUATION{0,}) - hdrs, err := cc.encodeHeaders(req, requestedGzip, trailers, contentLen) - if err != nil { - cc.mu.Unlock() - return nil, err - } - - cs := cc.newStream() - cs.req = req - cs.trace = requestTrace(req) - cs.requestedGzip = requestedGzip - bodyWriter := cc.t.getBodyWriterState(cs, body) - cs.on100 = bodyWriter.on100 - - cc.wmu.Lock() - endStream := !hasBody && !hasTrailers - werr := cc.writeHeaders(cs.ID, endStream, hdrs) - cc.wmu.Unlock() - traceWroteHeaders(cs.trace) - cc.mu.Unlock() - - if werr != nil { - if hasBody { - req.Body.Close() // per RoundTripper contract - bodyWriter.cancel() - } - cc.forgetStreamID(cs.ID) - // Don't bother sending a RST_STREAM (our write already failed; - // no need to keep writing) - traceWroteRequest(cs.trace, werr) - return nil, werr - } - - var respHeaderTimer <-chan time.Time - if hasBody { - bodyWriter.scheduleBodyWrite() - } else { - traceWroteRequest(cs.trace, nil) - if d := cc.responseHeaderTimeout(); d != 0 { - timer := time.NewTimer(d) - defer timer.Stop() - respHeaderTimer = timer.C - } - } - - readLoopResCh := cs.resc - bodyWritten := false - ctx := reqContext(req) - - handleReadLoopResponse := func(re resAndError) (*http.Response, error) { - res := re.res - if re.err != nil || res.StatusCode > 299 { - // On error or status code 3xx, 4xx, 5xx, etc abort any - // ongoing write, assuming that the server doesn't care - // about our request body. If the server replied with 1xx or - // 2xx, however, then assume the server DOES potentially - // want our body (e.g. full-duplex streaming: - // golang.org/issue/13444). If it turns out the server - // doesn't, they'll RST_STREAM us soon enough. This is a - // heuristic to avoid adding knobs to Transport. Hopefully - // we can keep it. - bodyWriter.cancel() - cs.abortRequestBodyWrite(errStopReqBodyWrite) - } - if re.err != nil { - if re.err == errClientConnGotGoAway { - cc.mu.Lock() - if cs.startedWrite { - re.err = errClientConnGotGoAwayAfterSomeReqBody - } - cc.mu.Unlock() - } - cc.forgetStreamID(cs.ID) - return nil, re.err - } - res.Request = req - res.TLS = cc.tlsState - return res, nil - } - - for { - select { - case re := <-readLoopResCh: - return handleReadLoopResponse(re) - case <-respHeaderTimer: - cc.forgetStreamID(cs.ID) - if !hasBody || bodyWritten { - cc.writeStreamReset(cs.ID, ErrCodeCancel, nil) - } else { - bodyWriter.cancel() - cs.abortRequestBodyWrite(errStopReqBodyWriteAndCancel) - } - return nil, errTimeout - case <-ctx.Done(): - cc.forgetStreamID(cs.ID) - if !hasBody || bodyWritten { - cc.writeStreamReset(cs.ID, ErrCodeCancel, nil) - } else { - bodyWriter.cancel() - cs.abortRequestBodyWrite(errStopReqBodyWriteAndCancel) - } - return nil, ctx.Err() - case <-req.Cancel: - cc.forgetStreamID(cs.ID) - if !hasBody || bodyWritten { - cc.writeStreamReset(cs.ID, ErrCodeCancel, nil) - } else { - bodyWriter.cancel() - cs.abortRequestBodyWrite(errStopReqBodyWriteAndCancel) - } - return nil, errRequestCanceled - case <-cs.peerReset: - // processResetStream already removed the - // stream from the streams map; no need for - // forgetStreamID. - return nil, cs.resetErr - case err := <-bodyWriter.resc: - // Prefer the read loop's response, if available. Issue 16102. - select { - case re := <-readLoopResCh: - return handleReadLoopResponse(re) - default: - } - if err != nil { - return nil, err - } - bodyWritten = true - if d := cc.responseHeaderTimeout(); d != 0 { - timer := time.NewTimer(d) - defer timer.Stop() - respHeaderTimer = timer.C - } - } - } -} - -// requires cc.wmu be held -func (cc *ClientConn) writeHeaders(streamID uint32, endStream bool, hdrs []byte) error { - first := true // first frame written (HEADERS is first, then CONTINUATION) - frameSize := int(cc.maxFrameSize) - for len(hdrs) > 0 && cc.werr == nil { - chunk := hdrs - if len(chunk) > frameSize { - chunk = chunk[:frameSize] - } - hdrs = hdrs[len(chunk):] - endHeaders := len(hdrs) == 0 - if first { - cc.fr.WriteHeaders(HeadersFrameParam{ - StreamID: streamID, - BlockFragment: chunk, - EndStream: endStream, - EndHeaders: endHeaders, - }) - first = false - } else { - cc.fr.WriteContinuation(streamID, endHeaders, chunk) - } - } - // TODO(bradfitz): this Flush could potentially block (as - // could the WriteHeaders call(s) above), which means they - // wouldn't respond to Request.Cancel being readable. That's - // rare, but this should probably be in a goroutine. - cc.bw.Flush() - return cc.werr -} - -// internal error values; they don't escape to callers -var ( - // abort request body write; don't send cancel - errStopReqBodyWrite = errors.New("http2: aborting request body write") - - // abort request body write, but send stream reset of cancel. - errStopReqBodyWriteAndCancel = errors.New("http2: canceling request") -) - -func (cs *clientStream) writeRequestBody(body io.Reader, bodyCloser io.Closer) (err error) { - cc := cs.cc - sentEnd := false // whether we sent the final DATA frame w/ END_STREAM - buf := cc.frameScratchBuffer() - defer cc.putFrameScratchBuffer(buf) - - defer func() { - traceWroteRequest(cs.trace, err) - // TODO: write h12Compare test showing whether - // Request.Body is closed by the Transport, - // and in multiple cases: server replies <=299 and >299 - // while still writing request body - cerr := bodyCloser.Close() - if err == nil { - err = cerr - } - }() - - req := cs.req - hasTrailers := req.Trailer != nil - - var sawEOF bool - for !sawEOF { - n, err := body.Read(buf) - if err == io.EOF { - sawEOF = true - err = nil - } else if err != nil { - return err - } - - remain := buf[:n] - for len(remain) > 0 && err == nil { - var allowed int32 - allowed, err = cs.awaitFlowControl(len(remain)) - switch { - case err == errStopReqBodyWrite: - return err - case err == errStopReqBodyWriteAndCancel: - cc.writeStreamReset(cs.ID, ErrCodeCancel, nil) - return err - case err != nil: - return err - } - cc.wmu.Lock() - data := remain[:allowed] - remain = remain[allowed:] - sentEnd = sawEOF && len(remain) == 0 && !hasTrailers - err = cc.fr.WriteData(cs.ID, sentEnd, data) - if err == nil { - // TODO(bradfitz): this flush is for latency, not bandwidth. - // Most requests won't need this. Make this opt-in or - // opt-out? Use some heuristic on the body type? Nagel-like - // timers? Based on 'n'? Only last chunk of this for loop, - // unless flow control tokens are low? For now, always. - // If we change this, see comment below. - err = cc.bw.Flush() - } - cc.wmu.Unlock() - } - if err != nil { - return err - } - } - - if sentEnd { - // Already sent END_STREAM (which implies we have no - // trailers) and flushed, because currently all - // WriteData frames above get a flush. So we're done. - return nil - } - - var trls []byte - if hasTrailers { - cc.mu.Lock() - defer cc.mu.Unlock() - trls = cc.encodeTrailers(req) - } - - cc.wmu.Lock() - defer cc.wmu.Unlock() - - // Two ways to send END_STREAM: either with trailers, or - // with an empty DATA frame. - if len(trls) > 0 { - err = cc.writeHeaders(cs.ID, true, trls) - } else { - err = cc.fr.WriteData(cs.ID, true, nil) - } - if ferr := cc.bw.Flush(); ferr != nil && err == nil { - err = ferr - } - return err -} - -// awaitFlowControl waits for [1, min(maxBytes, cc.cs.maxFrameSize)] flow -// control tokens from the server. -// It returns either the non-zero number of tokens taken or an error -// if the stream is dead. -func (cs *clientStream) awaitFlowControl(maxBytes int) (taken int32, err error) { - cc := cs.cc - cc.mu.Lock() - defer cc.mu.Unlock() - for { - if cc.closed { - return 0, errClientConnClosed - } - if cs.stopReqBody != nil { - return 0, cs.stopReqBody - } - if err := cs.checkResetOrDone(); err != nil { - return 0, err - } - if a := cs.flow.available(); a > 0 { - take := a - if int(take) > maxBytes { - - take = int32(maxBytes) // can't truncate int; take is int32 - } - if take > int32(cc.maxFrameSize) { - take = int32(cc.maxFrameSize) - } - cs.flow.take(take) - return take, nil - } - cc.cond.Wait() - } -} - -type badStringError struct { - what string - str string -} - -func (e *badStringError) Error() string { return fmt.Sprintf("%s %q", e.what, e.str) } - -// requires cc.mu be held. -func (cc *ClientConn) encodeHeaders(req *http.Request, addGzipHeader bool, trailers string, contentLength int64) ([]byte, error) { - cc.hbuf.Reset() - - host := req.Host - if host == "" { - host = req.URL.Host - } - host, err := httplex.PunycodeHostPort(host) - if err != nil { - return nil, err - } - - var path string - if req.Method != "CONNECT" { - path = req.URL.RequestURI() - if !validPseudoPath(path) { - orig := path - path = strings.TrimPrefix(path, req.URL.Scheme+"://"+host) - if !validPseudoPath(path) { - if req.URL.Opaque != "" { - return nil, fmt.Errorf("invalid request :path %q from URL.Opaque = %q", orig, req.URL.Opaque) - } else { - return nil, fmt.Errorf("invalid request :path %q", orig) - } - } - } - } - - // Check for any invalid headers and return an error before we - // potentially pollute our hpack state. (We want to be able to - // continue to reuse the hpack encoder for future requests) - for k, vv := range req.Header { - if !httplex.ValidHeaderFieldName(k) { - return nil, fmt.Errorf("invalid HTTP header name %q", k) - } - for _, v := range vv { - if !httplex.ValidHeaderFieldValue(v) { - return nil, fmt.Errorf("invalid HTTP header value %q for header %q", v, k) - } - } - } - - // 8.1.2.3 Request Pseudo-Header Fields - // The :path pseudo-header field includes the path and query parts of the - // target URI (the path-absolute production and optionally a '?' character - // followed by the query production (see Sections 3.3 and 3.4 of - // [RFC3986]). - cc.writeHeader(":authority", host) - cc.writeHeader(":method", req.Method) - if req.Method != "CONNECT" { - cc.writeHeader(":path", path) - cc.writeHeader(":scheme", req.URL.Scheme) - } - if trailers != "" { - cc.writeHeader("trailer", trailers) - } - - var didUA bool - for k, vv := range req.Header { - lowKey := strings.ToLower(k) - switch lowKey { - case "host", "content-length": - // Host is :authority, already sent. - // Content-Length is automatic, set below. - continue - case "connection", "proxy-connection", "transfer-encoding", "upgrade", "keep-alive": - // Per 8.1.2.2 Connection-Specific Header - // Fields, don't send connection-specific - // fields. We have already checked if any - // are error-worthy so just ignore the rest. - continue - case "user-agent": - // Match Go's http1 behavior: at most one - // User-Agent. If set to nil or empty string, - // then omit it. Otherwise if not mentioned, - // include the default (below). - didUA = true - if len(vv) < 1 { - continue - } - vv = vv[:1] - if vv[0] == "" { - continue - } - } - for _, v := range vv { - cc.writeHeader(lowKey, v) - } - } - if shouldSendReqContentLength(req.Method, contentLength) { - cc.writeHeader("content-length", strconv.FormatInt(contentLength, 10)) - } - if addGzipHeader { - cc.writeHeader("accept-encoding", "gzip") - } - if !didUA { - cc.writeHeader("user-agent", defaultUserAgent) - } - return cc.hbuf.Bytes(), nil -} - -// shouldSendReqContentLength reports whether the http2.Transport should send -// a "content-length" request header. This logic is basically a copy of the net/http -// transferWriter.shouldSendContentLength. -// The contentLength is the corrected contentLength (so 0 means actually 0, not unknown). -// -1 means unknown. -func shouldSendReqContentLength(method string, contentLength int64) bool { - if contentLength > 0 { - return true - } - if contentLength < 0 { - return false - } - // For zero bodies, whether we send a content-length depends on the method. - // It also kinda doesn't matter for http2 either way, with END_STREAM. - switch method { - case "POST", "PUT", "PATCH": - return true - default: - return false - } -} - -// requires cc.mu be held. -func (cc *ClientConn) encodeTrailers(req *http.Request) []byte { - cc.hbuf.Reset() - for k, vv := range req.Trailer { - // Transfer-Encoding, etc.. have already been filter at the - // start of RoundTrip - lowKey := strings.ToLower(k) - for _, v := range vv { - cc.writeHeader(lowKey, v) - } - } - return cc.hbuf.Bytes() -} - -func (cc *ClientConn) writeHeader(name, value string) { - if VerboseLogs { - log.Printf("http2: Transport encoding header %q = %q", name, value) - } - cc.henc.WriteField(hpack.HeaderField{Name: name, Value: value}) -} - -type resAndError struct { - res *http.Response - err error -} - -// requires cc.mu be held. -func (cc *ClientConn) newStream() *clientStream { - cs := &clientStream{ - cc: cc, - ID: cc.nextStreamID, - resc: make(chan resAndError, 1), - peerReset: make(chan struct{}), - done: make(chan struct{}), - } - cs.flow.add(int32(cc.initialWindowSize)) - cs.flow.setConnFlow(&cc.flow) - cs.inflow.add(transportDefaultStreamFlow) - cs.inflow.setConnFlow(&cc.inflow) - cc.nextStreamID += 2 - cc.streams[cs.ID] = cs - return cs -} - -func (cc *ClientConn) forgetStreamID(id uint32) { - cc.streamByID(id, true) -} - -func (cc *ClientConn) streamByID(id uint32, andRemove bool) *clientStream { - cc.mu.Lock() - defer cc.mu.Unlock() - cs := cc.streams[id] - if andRemove && cs != nil && !cc.closed { - cc.lastActive = time.Now() - delete(cc.streams, id) - if len(cc.streams) == 0 && cc.idleTimer != nil { - cc.idleTimer.Reset(cc.idleTimeout) - } - close(cs.done) - cc.cond.Broadcast() // wake up checkResetOrDone via clientStream.awaitFlowControl - } - return cs -} - -// clientConnReadLoop is the state owned by the clientConn's frame-reading readLoop. -type clientConnReadLoop struct { - cc *ClientConn - activeRes map[uint32]*clientStream // keyed by streamID - closeWhenIdle bool -} - -// readLoop runs in its own goroutine and reads and dispatches frames. -func (cc *ClientConn) readLoop() { - rl := &clientConnReadLoop{ - cc: cc, - activeRes: make(map[uint32]*clientStream), - } - - defer rl.cleanup() - cc.readerErr = rl.run() - if ce, ok := cc.readerErr.(ConnectionError); ok { - cc.wmu.Lock() - cc.fr.WriteGoAway(0, ErrCode(ce), nil) - cc.wmu.Unlock() - } -} - -// GoAwayError is returned by the Transport when the server closes the -// TCP connection after sending a GOAWAY frame. -type GoAwayError struct { - LastStreamID uint32 - ErrCode ErrCode - DebugData string -} - -func (e GoAwayError) Error() string { - return fmt.Sprintf("http2: server sent GOAWAY and closed the connection; LastStreamID=%v, ErrCode=%v, debug=%q", - e.LastStreamID, e.ErrCode, e.DebugData) -} - -func isEOFOrNetReadError(err error) bool { - if err == io.EOF { - return true - } - ne, ok := err.(*net.OpError) - return ok && ne.Op == "read" -} - -func (rl *clientConnReadLoop) cleanup() { - cc := rl.cc - defer cc.tconn.Close() - defer cc.t.connPool().MarkDead(cc) - defer close(cc.readerDone) - - if cc.idleTimer != nil { - cc.idleTimer.Stop() - } - - // Close any response bodies if the server closes prematurely. - // TODO: also do this if we've written the headers but not - // gotten a response yet. - err := cc.readerErr - cc.mu.Lock() - if cc.goAway != nil && isEOFOrNetReadError(err) { - err = GoAwayError{ - LastStreamID: cc.goAway.LastStreamID, - ErrCode: cc.goAway.ErrCode, - DebugData: cc.goAwayDebug, - } - } else if err == io.EOF { - err = io.ErrUnexpectedEOF - } - for _, cs := range rl.activeRes { - cs.bufPipe.CloseWithError(err) - } - for _, cs := range cc.streams { - select { - case cs.resc <- resAndError{err: err}: - default: - } - close(cs.done) - } - cc.closed = true - cc.cond.Broadcast() - cc.mu.Unlock() -} - -func (rl *clientConnReadLoop) run() error { - cc := rl.cc - rl.closeWhenIdle = cc.t.disableKeepAlives() || cc.singleUse - gotReply := false // ever saw a HEADERS reply - gotSettings := false - for { - f, err := cc.fr.ReadFrame() - if err != nil { - cc.vlogf("http2: Transport readFrame error on conn %p: (%T) %v", cc, err, err) - } - if se, ok := err.(StreamError); ok { - if cs := cc.streamByID(se.StreamID, true /*ended; remove it*/); cs != nil { - cs.cc.writeStreamReset(cs.ID, se.Code, err) - if se.Cause == nil { - se.Cause = cc.fr.errDetail - } - rl.endStreamError(cs, se) - } - continue - } else if err != nil { - return err - } - if VerboseLogs { - cc.vlogf("http2: Transport received %s", summarizeFrame(f)) - } - if !gotSettings { - if _, ok := f.(*SettingsFrame); !ok { - cc.logf("protocol error: received %T before a SETTINGS frame", f) - return ConnectionError(ErrCodeProtocol) - } - gotSettings = true - } - maybeIdle := false // whether frame might transition us to idle - - switch f := f.(type) { - case *MetaHeadersFrame: - err = rl.processHeaders(f) - maybeIdle = true - gotReply = true - case *DataFrame: - err = rl.processData(f) - maybeIdle = true - case *GoAwayFrame: - err = rl.processGoAway(f) - maybeIdle = true - case *RSTStreamFrame: - err = rl.processResetStream(f) - maybeIdle = true - case *SettingsFrame: - err = rl.processSettings(f) - case *PushPromiseFrame: - err = rl.processPushPromise(f) - case *WindowUpdateFrame: - err = rl.processWindowUpdate(f) - case *PingFrame: - err = rl.processPing(f) - default: - cc.logf("Transport: unhandled response frame type %T", f) - } - if err != nil { - if VerboseLogs { - cc.vlogf("http2: Transport conn %p received error from processing frame %v: %v", cc, summarizeFrame(f), err) - } - return err - } - if rl.closeWhenIdle && gotReply && maybeIdle && len(rl.activeRes) == 0 { - cc.closeIfIdle() - } - } -} - -func (rl *clientConnReadLoop) processHeaders(f *MetaHeadersFrame) error { - cc := rl.cc - cs := cc.streamByID(f.StreamID, f.StreamEnded()) - if cs == nil { - // We'd get here if we canceled a request while the - // server had its response still in flight. So if this - // was just something we canceled, ignore it. - return nil - } - if !cs.firstByte { - if cs.trace != nil { - // TODO(bradfitz): move first response byte earlier, - // when we first read the 9 byte header, not waiting - // until all the HEADERS+CONTINUATION frames have been - // merged. This works for now. - traceFirstResponseByte(cs.trace) - } - cs.firstByte = true - } - if !cs.pastHeaders { - cs.pastHeaders = true - } else { - return rl.processTrailers(cs, f) - } - - res, err := rl.handleResponse(cs, f) - if err != nil { - if _, ok := err.(ConnectionError); ok { - return err - } - // Any other error type is a stream error. - cs.cc.writeStreamReset(f.StreamID, ErrCodeProtocol, err) - cs.resc <- resAndError{err: err} - return nil // return nil from process* funcs to keep conn alive - } - if res == nil { - // (nil, nil) special case. See handleResponse docs. - return nil - } - if res.Body != noBody { - rl.activeRes[cs.ID] = cs - } - cs.resTrailer = &res.Trailer - cs.resc <- resAndError{res: res} - return nil -} - -// may return error types nil, or ConnectionError. Any other error value -// is a StreamError of type ErrCodeProtocol. The returned error in that case -// is the detail. -// -// As a special case, handleResponse may return (nil, nil) to skip the -// frame (currently only used for 100 expect continue). This special -// case is going away after Issue 13851 is fixed. -func (rl *clientConnReadLoop) handleResponse(cs *clientStream, f *MetaHeadersFrame) (*http.Response, error) { - if f.Truncated { - return nil, errResponseHeaderListSize - } - - status := f.PseudoValue("status") - if status == "" { - return nil, errors.New("missing status pseudo header") - } - statusCode, err := strconv.Atoi(status) - if err != nil { - return nil, errors.New("malformed non-numeric status pseudo header") - } - - if statusCode == 100 { - traceGot100Continue(cs.trace) - if cs.on100 != nil { - cs.on100() // forces any write delay timer to fire - } - cs.pastHeaders = false // do it all again - return nil, nil - } - - header := make(http.Header) - res := &http.Response{ - Proto: "HTTP/2.0", - ProtoMajor: 2, - Header: header, - StatusCode: statusCode, - Status: status + " " + http.StatusText(statusCode), - } - for _, hf := range f.RegularFields() { - key := http.CanonicalHeaderKey(hf.Name) - if key == "Trailer" { - t := res.Trailer - if t == nil { - t = make(http.Header) - res.Trailer = t - } - foreachHeaderElement(hf.Value, func(v string) { - t[http.CanonicalHeaderKey(v)] = nil - }) - } else { - header[key] = append(header[key], hf.Value) - } - } - - streamEnded := f.StreamEnded() - isHead := cs.req.Method == "HEAD" - if !streamEnded || isHead { - res.ContentLength = -1 - if clens := res.Header["Content-Length"]; len(clens) == 1 { - if clen64, err := strconv.ParseInt(clens[0], 10, 64); err == nil { - res.ContentLength = clen64 - } else { - // TODO: care? unlike http/1, it won't mess up our framing, so it's - // more safe smuggling-wise to ignore. - } - } else if len(clens) > 1 { - // TODO: care? unlike http/1, it won't mess up our framing, so it's - // more safe smuggling-wise to ignore. - } - } - - if streamEnded || isHead { - res.Body = noBody - return res, nil - } - - cs.bufPipe = pipe{b: &dataBuffer{expected: res.ContentLength}} - cs.bytesRemain = res.ContentLength - res.Body = transportResponseBody{cs} - go cs.awaitRequestCancel(cs.req) - - if cs.requestedGzip && res.Header.Get("Content-Encoding") == "gzip" { - res.Header.Del("Content-Encoding") - res.Header.Del("Content-Length") - res.ContentLength = -1 - res.Body = &gzipReader{body: res.Body} - setResponseUncompressed(res) - } - return res, nil -} - -func (rl *clientConnReadLoop) processTrailers(cs *clientStream, f *MetaHeadersFrame) error { - if cs.pastTrailers { - // Too many HEADERS frames for this stream. - return ConnectionError(ErrCodeProtocol) - } - cs.pastTrailers = true - if !f.StreamEnded() { - // We expect that any headers for trailers also - // has END_STREAM. - return ConnectionError(ErrCodeProtocol) - } - if len(f.PseudoFields()) > 0 { - // No pseudo header fields are defined for trailers. - // TODO: ConnectionError might be overly harsh? Check. - return ConnectionError(ErrCodeProtocol) - } - - trailer := make(http.Header) - for _, hf := range f.RegularFields() { - key := http.CanonicalHeaderKey(hf.Name) - trailer[key] = append(trailer[key], hf.Value) - } - cs.trailer = trailer - - rl.endStream(cs) - return nil -} - -// transportResponseBody is the concrete type of Transport.RoundTrip's -// Response.Body. It is an io.ReadCloser. On Read, it reads from cs.body. -// On Close it sends RST_STREAM if EOF wasn't already seen. -type transportResponseBody struct { - cs *clientStream -} - -func (b transportResponseBody) Read(p []byte) (n int, err error) { - cs := b.cs - cc := cs.cc - - if cs.readErr != nil { - return 0, cs.readErr - } - n, err = b.cs.bufPipe.Read(p) - if cs.bytesRemain != -1 { - if int64(n) > cs.bytesRemain { - n = int(cs.bytesRemain) - if err == nil { - err = errors.New("net/http: server replied with more than declared Content-Length; truncated") - cc.writeStreamReset(cs.ID, ErrCodeProtocol, err) - } - cs.readErr = err - return int(cs.bytesRemain), err - } - cs.bytesRemain -= int64(n) - if err == io.EOF && cs.bytesRemain > 0 { - err = io.ErrUnexpectedEOF - cs.readErr = err - return n, err - } - } - if n == 0 { - // No flow control tokens to send back. - return - } - - cc.mu.Lock() - defer cc.mu.Unlock() - - var connAdd, streamAdd int32 - // Check the conn-level first, before the stream-level. - if v := cc.inflow.available(); v < transportDefaultConnFlow/2 { - connAdd = transportDefaultConnFlow - v - cc.inflow.add(connAdd) - } - if err == nil { // No need to refresh if the stream is over or failed. - // Consider any buffered body data (read from the conn but not - // consumed by the client) when computing flow control for this - // stream. - v := int(cs.inflow.available()) + cs.bufPipe.Len() - if v < transportDefaultStreamFlow-transportDefaultStreamMinRefresh { - streamAdd = int32(transportDefaultStreamFlow - v) - cs.inflow.add(streamAdd) - } - } - if connAdd != 0 || streamAdd != 0 { - cc.wmu.Lock() - defer cc.wmu.Unlock() - if connAdd != 0 { - cc.fr.WriteWindowUpdate(0, mustUint31(connAdd)) - } - if streamAdd != 0 { - cc.fr.WriteWindowUpdate(cs.ID, mustUint31(streamAdd)) - } - cc.bw.Flush() - } - return -} - -var errClosedResponseBody = errors.New("http2: response body closed") - -func (b transportResponseBody) Close() error { - cs := b.cs - cc := cs.cc - - serverSentStreamEnd := cs.bufPipe.Err() == io.EOF - unread := cs.bufPipe.Len() - - if unread > 0 || !serverSentStreamEnd { - cc.mu.Lock() - cc.wmu.Lock() - if !serverSentStreamEnd { - cc.fr.WriteRSTStream(cs.ID, ErrCodeCancel) - cs.didReset = true - } - // Return connection-level flow control. - if unread > 0 { - cc.inflow.add(int32(unread)) - cc.fr.WriteWindowUpdate(0, uint32(unread)) - } - cc.bw.Flush() - cc.wmu.Unlock() - cc.mu.Unlock() - } - - cs.bufPipe.BreakWithError(errClosedResponseBody) - return nil -} - -func (rl *clientConnReadLoop) processData(f *DataFrame) error { - cc := rl.cc - cs := cc.streamByID(f.StreamID, f.StreamEnded()) - data := f.Data() - if cs == nil { - cc.mu.Lock() - neverSent := cc.nextStreamID - cc.mu.Unlock() - if f.StreamID >= neverSent { - // We never asked for this. - cc.logf("http2: Transport received unsolicited DATA frame; closing connection") - return ConnectionError(ErrCodeProtocol) - } - // We probably did ask for this, but canceled. Just ignore it. - // TODO: be stricter here? only silently ignore things which - // we canceled, but not things which were closed normally - // by the peer? Tough without accumulating too much state. - - // But at least return their flow control: - if f.Length > 0 { - cc.mu.Lock() - cc.inflow.add(int32(f.Length)) - cc.mu.Unlock() - - cc.wmu.Lock() - cc.fr.WriteWindowUpdate(0, uint32(f.Length)) - cc.bw.Flush() - cc.wmu.Unlock() - } - return nil - } - if f.Length > 0 { - // Check connection-level flow control. - cc.mu.Lock() - if cs.inflow.available() >= int32(f.Length) { - cs.inflow.take(int32(f.Length)) - } else { - cc.mu.Unlock() - return ConnectionError(ErrCodeFlowControl) - } - // Return any padded flow control now, since we won't - // refund it later on body reads. - if pad := int32(f.Length) - int32(len(data)); pad > 0 { - cs.inflow.add(pad) - cc.inflow.add(pad) - cc.wmu.Lock() - cc.fr.WriteWindowUpdate(0, uint32(pad)) - cc.fr.WriteWindowUpdate(cs.ID, uint32(pad)) - cc.bw.Flush() - cc.wmu.Unlock() - } - didReset := cs.didReset - cc.mu.Unlock() - - if len(data) > 0 && !didReset { - if _, err := cs.bufPipe.Write(data); err != nil { - rl.endStreamError(cs, err) - return err - } - } - } - - if f.StreamEnded() { - rl.endStream(cs) - } - return nil -} - -var errInvalidTrailers = errors.New("http2: invalid trailers") - -func (rl *clientConnReadLoop) endStream(cs *clientStream) { - // TODO: check that any declared content-length matches, like - // server.go's (*stream).endStream method. - rl.endStreamError(cs, nil) -} - -func (rl *clientConnReadLoop) endStreamError(cs *clientStream, err error) { - var code func() - if err == nil { - err = io.EOF - code = cs.copyTrailers - } - cs.bufPipe.closeWithErrorAndCode(err, code) - delete(rl.activeRes, cs.ID) - if isConnectionCloseRequest(cs.req) { - rl.closeWhenIdle = true - } - - select { - case cs.resc <- resAndError{err: err}: - default: - } -} - -func (cs *clientStream) copyTrailers() { - for k, vv := range cs.trailer { - t := cs.resTrailer - if *t == nil { - *t = make(http.Header) - } - (*t)[k] = vv - } -} - -func (rl *clientConnReadLoop) processGoAway(f *GoAwayFrame) error { - cc := rl.cc - cc.t.connPool().MarkDead(cc) - if f.ErrCode != 0 { - // TODO: deal with GOAWAY more. particularly the error code - cc.vlogf("transport got GOAWAY with error code = %v", f.ErrCode) - } - cc.setGoAway(f) - return nil -} - -func (rl *clientConnReadLoop) processSettings(f *SettingsFrame) error { - cc := rl.cc - cc.mu.Lock() - defer cc.mu.Unlock() - - if f.IsAck() { - if cc.wantSettingsAck { - cc.wantSettingsAck = false - return nil - } - return ConnectionError(ErrCodeProtocol) - } - - err := f.ForeachSetting(func(s Setting) error { - switch s.ID { - case SettingMaxFrameSize: - cc.maxFrameSize = s.Val - case SettingMaxConcurrentStreams: - cc.maxConcurrentStreams = s.Val - case SettingInitialWindowSize: - // Values above the maximum flow-control - // window size of 2^31-1 MUST be treated as a - // connection error (Section 5.4.1) of type - // FLOW_CONTROL_ERROR. - if s.Val > math.MaxInt32 { - return ConnectionError(ErrCodeFlowControl) - } - - // Adjust flow control of currently-open - // frames by the difference of the old initial - // window size and this one. - delta := int32(s.Val) - int32(cc.initialWindowSize) - for _, cs := range cc.streams { - cs.flow.add(delta) - } - cc.cond.Broadcast() - - cc.initialWindowSize = s.Val - default: - // TODO(bradfitz): handle more settings? SETTINGS_HEADER_TABLE_SIZE probably. - cc.vlogf("Unhandled Setting: %v", s) - } - return nil - }) - if err != nil { - return err - } - - cc.wmu.Lock() - defer cc.wmu.Unlock() - - cc.fr.WriteSettingsAck() - cc.bw.Flush() - return cc.werr -} - -func (rl *clientConnReadLoop) processWindowUpdate(f *WindowUpdateFrame) error { - cc := rl.cc - cs := cc.streamByID(f.StreamID, false) - if f.StreamID != 0 && cs == nil { - return nil - } - - cc.mu.Lock() - defer cc.mu.Unlock() - - fl := &cc.flow - if cs != nil { - fl = &cs.flow - } - if !fl.add(int32(f.Increment)) { - return ConnectionError(ErrCodeFlowControl) - } - cc.cond.Broadcast() - return nil -} - -func (rl *clientConnReadLoop) processResetStream(f *RSTStreamFrame) error { - cs := rl.cc.streamByID(f.StreamID, true) - if cs == nil { - // TODO: return error if server tries to RST_STEAM an idle stream - return nil - } - select { - case <-cs.peerReset: - // Already reset. - // This is the only goroutine - // which closes this, so there - // isn't a race. - default: - err := streamError(cs.ID, f.ErrCode) - cs.resetErr = err - close(cs.peerReset) - cs.bufPipe.CloseWithError(err) - cs.cc.cond.Broadcast() // wake up checkResetOrDone via clientStream.awaitFlowControl - } - delete(rl.activeRes, cs.ID) - return nil -} - -// Ping sends a PING frame to the server and waits for the ack. -// Public implementation is in go17.go and not_go17.go -func (cc *ClientConn) ping(ctx contextContext) error { - c := make(chan struct{}) - // Generate a random payload - var p [8]byte - for { - if _, err := rand.Read(p[:]); err != nil { - return err - } - cc.mu.Lock() - // check for dup before insert - if _, found := cc.pings[p]; !found { - cc.pings[p] = c - cc.mu.Unlock() - break - } - cc.mu.Unlock() - } - cc.wmu.Lock() - if err := cc.fr.WritePing(false, p); err != nil { - cc.wmu.Unlock() - return err - } - if err := cc.bw.Flush(); err != nil { - cc.wmu.Unlock() - return err - } - cc.wmu.Unlock() - select { - case <-c: - return nil - case <-ctx.Done(): - return ctx.Err() - case <-cc.readerDone: - // connection closed - return cc.readerErr - } -} - -func (rl *clientConnReadLoop) processPing(f *PingFrame) error { - if f.IsAck() { - cc := rl.cc - cc.mu.Lock() - defer cc.mu.Unlock() - // If ack, notify listener if any - if c, ok := cc.pings[f.Data]; ok { - close(c) - delete(cc.pings, f.Data) - } - return nil - } - cc := rl.cc - cc.wmu.Lock() - defer cc.wmu.Unlock() - if err := cc.fr.WritePing(true, f.Data); err != nil { - return err - } - return cc.bw.Flush() -} - -func (rl *clientConnReadLoop) processPushPromise(f *PushPromiseFrame) error { - // We told the peer we don't want them. - // Spec says: - // "PUSH_PROMISE MUST NOT be sent if the SETTINGS_ENABLE_PUSH - // setting of the peer endpoint is set to 0. An endpoint that - // has set this setting and has received acknowledgement MUST - // treat the receipt of a PUSH_PROMISE frame as a connection - // error (Section 5.4.1) of type PROTOCOL_ERROR." - return ConnectionError(ErrCodeProtocol) -} - -func (cc *ClientConn) writeStreamReset(streamID uint32, code ErrCode, err error) { - // TODO: map err to more interesting error codes, once the - // HTTP community comes up with some. But currently for - // RST_STREAM there's no equivalent to GOAWAY frame's debug - // data, and the error codes are all pretty vague ("cancel"). - cc.wmu.Lock() - cc.fr.WriteRSTStream(streamID, code) - cc.bw.Flush() - cc.wmu.Unlock() -} - -var ( - errResponseHeaderListSize = errors.New("http2: response header list larger than advertised limit") - errPseudoTrailers = errors.New("http2: invalid pseudo header in trailers") -) - -func (cc *ClientConn) logf(format string, args ...interface{}) { - cc.t.logf(format, args...) -} - -func (cc *ClientConn) vlogf(format string, args ...interface{}) { - cc.t.vlogf(format, args...) -} - -func (t *Transport) vlogf(format string, args ...interface{}) { - if VerboseLogs { - t.logf(format, args...) - } -} - -func (t *Transport) logf(format string, args ...interface{}) { - log.Printf(format, args...) -} - -var noBody io.ReadCloser = ioutil.NopCloser(bytes.NewReader(nil)) - -func strSliceContains(ss []string, s string) bool { - for _, v := range ss { - if v == s { - return true - } - } - return false -} - -type erringRoundTripper struct{ err error } - -func (rt erringRoundTripper) RoundTrip(*http.Request) (*http.Response, error) { return nil, rt.err } - -// gzipReader wraps a response body so it can lazily -// call gzip.NewReader on the first call to Read -type gzipReader struct { - body io.ReadCloser // underlying Response.Body - zr *gzip.Reader // lazily-initialized gzip reader - zerr error // sticky error -} - -func (gz *gzipReader) Read(p []byte) (n int, err error) { - if gz.zerr != nil { - return 0, gz.zerr - } - if gz.zr == nil { - gz.zr, err = gzip.NewReader(gz.body) - if err != nil { - gz.zerr = err - return 0, err - } - } - return gz.zr.Read(p) -} - -func (gz *gzipReader) Close() error { - return gz.body.Close() -} - -type errorReader struct{ err error } - -func (r errorReader) Read(p []byte) (int, error) { return 0, r.err } - -// bodyWriterState encapsulates various state around the Transport's writing -// of the request body, particularly regarding doing delayed writes of the body -// when the request contains "Expect: 100-continue". -type bodyWriterState struct { - cs *clientStream - timer *time.Timer // if non-nil, we're doing a delayed write - fnonce *sync.Once // to call fn with - fn func() // the code to run in the goroutine, writing the body - resc chan error // result of fn's execution - delay time.Duration // how long we should delay a delayed write for -} - -func (t *Transport) getBodyWriterState(cs *clientStream, body io.Reader) (s bodyWriterState) { - s.cs = cs - if body == nil { - return - } - resc := make(chan error, 1) - s.resc = resc - s.fn = func() { - cs.cc.mu.Lock() - cs.startedWrite = true - cs.cc.mu.Unlock() - resc <- cs.writeRequestBody(body, cs.req.Body) - } - s.delay = t.expectContinueTimeout() - if s.delay == 0 || - !httplex.HeaderValuesContainsToken( - cs.req.Header["Expect"], - "100-continue") { - return - } - s.fnonce = new(sync.Once) - - // Arm the timer with a very large duration, which we'll - // intentionally lower later. It has to be large now because - // we need a handle to it before writing the headers, but the - // s.delay value is defined to not start until after the - // request headers were written. - const hugeDuration = 365 * 24 * time.Hour - s.timer = time.AfterFunc(hugeDuration, func() { - s.fnonce.Do(s.fn) - }) - return -} - -func (s bodyWriterState) cancel() { - if s.timer != nil { - s.timer.Stop() - } -} - -func (s bodyWriterState) on100() { - if s.timer == nil { - // If we didn't do a delayed write, ignore the server's - // bogus 100 continue response. - return - } - s.timer.Stop() - go func() { s.fnonce.Do(s.fn) }() -} - -// scheduleBodyWrite starts writing the body, either immediately (in -// the common case) or after the delay timeout. It should not be -// called until after the headers have been written. -func (s bodyWriterState) scheduleBodyWrite() { - if s.timer == nil { - // We're not doing a delayed write (see - // getBodyWriterState), so just start the writing - // goroutine immediately. - go s.fn() - return - } - traceWait100Continue(s.cs.trace) - if s.timer.Stop() { - s.timer.Reset(s.delay) - } -} - -// isConnectionCloseRequest reports whether req should use its own -// connection for a single request and then close the connection. -func isConnectionCloseRequest(req *http.Request) bool { - return req.Close || httplex.HeaderValuesContainsToken(req.Header["Connection"], "close") -} diff --git a/vendor/golang.org/x/net/http2/write.go b/vendor/golang.org/x/net/http2/write.go deleted file mode 100644 index 6b0dfae31..000000000 --- a/vendor/golang.org/x/net/http2/write.go +++ /dev/null @@ -1,370 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package http2 - -import ( - "bytes" - "fmt" - "log" - "net/http" - "net/url" - "time" - - "golang.org/x/net/http2/hpack" - "golang.org/x/net/lex/httplex" -) - -// writeFramer is implemented by any type that is used to write frames. -type writeFramer interface { - writeFrame(writeContext) error - - // staysWithinBuffer reports whether this writer promises that - // it will only write less than or equal to size bytes, and it - // won't Flush the write context. - staysWithinBuffer(size int) bool -} - -// writeContext is the interface needed by the various frame writer -// types below. All the writeFrame methods below are scheduled via the -// frame writing scheduler (see writeScheduler in writesched.go). -// -// This interface is implemented by *serverConn. -// -// TODO: decide whether to a) use this in the client code (which didn't -// end up using this yet, because it has a simpler design, not -// currently implementing priorities), or b) delete this and -// make the server code a bit more concrete. -type writeContext interface { - Framer() *Framer - Flush() error - CloseConn() error - // HeaderEncoder returns an HPACK encoder that writes to the - // returned buffer. - HeaderEncoder() (*hpack.Encoder, *bytes.Buffer) -} - -// writeEndsStream reports whether w writes a frame that will transition -// the stream to a half-closed local state. This returns false for RST_STREAM, -// which closes the entire stream (not just the local half). -func writeEndsStream(w writeFramer) bool { - switch v := w.(type) { - case *writeData: - return v.endStream - case *writeResHeaders: - return v.endStream - case nil: - // This can only happen if the caller reuses w after it's - // been intentionally nil'ed out to prevent use. Keep this - // here to catch future refactoring breaking it. - panic("writeEndsStream called on nil writeFramer") - } - return false -} - -type flushFrameWriter struct{} - -func (flushFrameWriter) writeFrame(ctx writeContext) error { - return ctx.Flush() -} - -func (flushFrameWriter) staysWithinBuffer(max int) bool { return false } - -type writeSettings []Setting - -func (s writeSettings) staysWithinBuffer(max int) bool { - const settingSize = 6 // uint16 + uint32 - return frameHeaderLen+settingSize*len(s) <= max - -} - -func (s writeSettings) writeFrame(ctx writeContext) error { - return ctx.Framer().WriteSettings([]Setting(s)...) -} - -type writeGoAway struct { - maxStreamID uint32 - code ErrCode -} - -func (p *writeGoAway) writeFrame(ctx writeContext) error { - err := ctx.Framer().WriteGoAway(p.maxStreamID, p.code, nil) - if p.code != 0 { - ctx.Flush() // ignore error: we're hanging up on them anyway - time.Sleep(50 * time.Millisecond) - ctx.CloseConn() - } - return err -} - -func (*writeGoAway) staysWithinBuffer(max int) bool { return false } // flushes - -type writeData struct { - streamID uint32 - p []byte - endStream bool -} - -func (w *writeData) String() string { - return fmt.Sprintf("writeData(stream=%d, p=%d, endStream=%v)", w.streamID, len(w.p), w.endStream) -} - -func (w *writeData) writeFrame(ctx writeContext) error { - return ctx.Framer().WriteData(w.streamID, w.endStream, w.p) -} - -func (w *writeData) staysWithinBuffer(max int) bool { - return frameHeaderLen+len(w.p) <= max -} - -// handlerPanicRST is the message sent from handler goroutines when -// the handler panics. -type handlerPanicRST struct { - StreamID uint32 -} - -func (hp handlerPanicRST) writeFrame(ctx writeContext) error { - return ctx.Framer().WriteRSTStream(hp.StreamID, ErrCodeInternal) -} - -func (hp handlerPanicRST) staysWithinBuffer(max int) bool { return frameHeaderLen+4 <= max } - -func (se StreamError) writeFrame(ctx writeContext) error { - return ctx.Framer().WriteRSTStream(se.StreamID, se.Code) -} - -func (se StreamError) staysWithinBuffer(max int) bool { return frameHeaderLen+4 <= max } - -type writePingAck struct{ pf *PingFrame } - -func (w writePingAck) writeFrame(ctx writeContext) error { - return ctx.Framer().WritePing(true, w.pf.Data) -} - -func (w writePingAck) staysWithinBuffer(max int) bool { return frameHeaderLen+len(w.pf.Data) <= max } - -type writeSettingsAck struct{} - -func (writeSettingsAck) writeFrame(ctx writeContext) error { - return ctx.Framer().WriteSettingsAck() -} - -func (writeSettingsAck) staysWithinBuffer(max int) bool { return frameHeaderLen <= max } - -// splitHeaderBlock splits headerBlock into fragments so that each fragment fits -// in a single frame, then calls fn for each fragment. firstFrag/lastFrag are true -// for the first/last fragment, respectively. -func splitHeaderBlock(ctx writeContext, headerBlock []byte, fn func(ctx writeContext, frag []byte, firstFrag, lastFrag bool) error) error { - // For now we're lazy and just pick the minimum MAX_FRAME_SIZE - // that all peers must support (16KB). Later we could care - // more and send larger frames if the peer advertised it, but - // there's little point. Most headers are small anyway (so we - // generally won't have CONTINUATION frames), and extra frames - // only waste 9 bytes anyway. - const maxFrameSize = 16384 - - first := true - for len(headerBlock) > 0 { - frag := headerBlock - if len(frag) > maxFrameSize { - frag = frag[:maxFrameSize] - } - headerBlock = headerBlock[len(frag):] - if err := fn(ctx, frag, first, len(headerBlock) == 0); err != nil { - return err - } - first = false - } - return nil -} - -// writeResHeaders is a request to write a HEADERS and 0+ CONTINUATION frames -// for HTTP response headers or trailers from a server handler. -type writeResHeaders struct { - streamID uint32 - httpResCode int // 0 means no ":status" line - h http.Header // may be nil - trailers []string // if non-nil, which keys of h to write. nil means all. - endStream bool - - date string - contentType string - contentLength string -} - -func encKV(enc *hpack.Encoder, k, v string) { - if VerboseLogs { - log.Printf("http2: server encoding header %q = %q", k, v) - } - enc.WriteField(hpack.HeaderField{Name: k, Value: v}) -} - -func (w *writeResHeaders) staysWithinBuffer(max int) bool { - // TODO: this is a common one. It'd be nice to return true - // here and get into the fast path if we could be clever and - // calculate the size fast enough, or at least a conservative - // uppper bound that usually fires. (Maybe if w.h and - // w.trailers are nil, so we don't need to enumerate it.) - // Otherwise I'm afraid that just calculating the length to - // answer this question would be slower than the ~2µs benefit. - return false -} - -func (w *writeResHeaders) writeFrame(ctx writeContext) error { - enc, buf := ctx.HeaderEncoder() - buf.Reset() - - if w.httpResCode != 0 { - encKV(enc, ":status", httpCodeString(w.httpResCode)) - } - - encodeHeaders(enc, w.h, w.trailers) - - if w.contentType != "" { - encKV(enc, "content-type", w.contentType) - } - if w.contentLength != "" { - encKV(enc, "content-length", w.contentLength) - } - if w.date != "" { - encKV(enc, "date", w.date) - } - - headerBlock := buf.Bytes() - if len(headerBlock) == 0 && w.trailers == nil { - panic("unexpected empty hpack") - } - - return splitHeaderBlock(ctx, headerBlock, w.writeHeaderBlock) -} - -func (w *writeResHeaders) writeHeaderBlock(ctx writeContext, frag []byte, firstFrag, lastFrag bool) error { - if firstFrag { - return ctx.Framer().WriteHeaders(HeadersFrameParam{ - StreamID: w.streamID, - BlockFragment: frag, - EndStream: w.endStream, - EndHeaders: lastFrag, - }) - } else { - return ctx.Framer().WriteContinuation(w.streamID, lastFrag, frag) - } -} - -// writePushPromise is a request to write a PUSH_PROMISE and 0+ CONTINUATION frames. -type writePushPromise struct { - streamID uint32 // pusher stream - method string // for :method - url *url.URL // for :scheme, :authority, :path - h http.Header - - // Creates an ID for a pushed stream. This runs on serveG just before - // the frame is written. The returned ID is copied to promisedID. - allocatePromisedID func() (uint32, error) - promisedID uint32 -} - -func (w *writePushPromise) staysWithinBuffer(max int) bool { - // TODO: see writeResHeaders.staysWithinBuffer - return false -} - -func (w *writePushPromise) writeFrame(ctx writeContext) error { - enc, buf := ctx.HeaderEncoder() - buf.Reset() - - encKV(enc, ":method", w.method) - encKV(enc, ":scheme", w.url.Scheme) - encKV(enc, ":authority", w.url.Host) - encKV(enc, ":path", w.url.RequestURI()) - encodeHeaders(enc, w.h, nil) - - headerBlock := buf.Bytes() - if len(headerBlock) == 0 { - panic("unexpected empty hpack") - } - - return splitHeaderBlock(ctx, headerBlock, w.writeHeaderBlock) -} - -func (w *writePushPromise) writeHeaderBlock(ctx writeContext, frag []byte, firstFrag, lastFrag bool) error { - if firstFrag { - return ctx.Framer().WritePushPromise(PushPromiseParam{ - StreamID: w.streamID, - PromiseID: w.promisedID, - BlockFragment: frag, - EndHeaders: lastFrag, - }) - } else { - return ctx.Framer().WriteContinuation(w.streamID, lastFrag, frag) - } -} - -type write100ContinueHeadersFrame struct { - streamID uint32 -} - -func (w write100ContinueHeadersFrame) writeFrame(ctx writeContext) error { - enc, buf := ctx.HeaderEncoder() - buf.Reset() - encKV(enc, ":status", "100") - return ctx.Framer().WriteHeaders(HeadersFrameParam{ - StreamID: w.streamID, - BlockFragment: buf.Bytes(), - EndStream: false, - EndHeaders: true, - }) -} - -func (w write100ContinueHeadersFrame) staysWithinBuffer(max int) bool { - // Sloppy but conservative: - return 9+2*(len(":status")+len("100")) <= max -} - -type writeWindowUpdate struct { - streamID uint32 // or 0 for conn-level - n uint32 -} - -func (wu writeWindowUpdate) staysWithinBuffer(max int) bool { return frameHeaderLen+4 <= max } - -func (wu writeWindowUpdate) writeFrame(ctx writeContext) error { - return ctx.Framer().WriteWindowUpdate(wu.streamID, wu.n) -} - -// encodeHeaders encodes an http.Header. If keys is not nil, then (k, h[k]) -// is encoded only only if k is in keys. -func encodeHeaders(enc *hpack.Encoder, h http.Header, keys []string) { - if keys == nil { - sorter := sorterPool.Get().(*sorter) - // Using defer here, since the returned keys from the - // sorter.Keys method is only valid until the sorter - // is returned: - defer sorterPool.Put(sorter) - keys = sorter.Keys(h) - } - for _, k := range keys { - vv := h[k] - k = lowerHeader(k) - if !validWireHeaderFieldName(k) { - // Skip it as backup paranoia. Per - // golang.org/issue/14048, these should - // already be rejected at a higher level. - continue - } - isTE := k == "transfer-encoding" - for _, v := range vv { - if !httplex.ValidHeaderFieldValue(v) { - // TODO: return an error? golang.org/issue/14048 - // For now just omit it. - continue - } - // TODO: more of "8.1.2.2 Connection-Specific Header Fields" - if isTE && v != "trailers" { - continue - } - encKV(enc, k, v) - } - } -} diff --git a/vendor/golang.org/x/net/http2/writesched.go b/vendor/golang.org/x/net/http2/writesched.go deleted file mode 100644 index 4fe307307..000000000 --- a/vendor/golang.org/x/net/http2/writesched.go +++ /dev/null @@ -1,242 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package http2 - -import "fmt" - -// WriteScheduler is the interface implemented by HTTP/2 write schedulers. -// Methods are never called concurrently. -type WriteScheduler interface { - // OpenStream opens a new stream in the write scheduler. - // It is illegal to call this with streamID=0 or with a streamID that is - // already open -- the call may panic. - OpenStream(streamID uint32, options OpenStreamOptions) - - // CloseStream closes a stream in the write scheduler. Any frames queued on - // this stream should be discarded. It is illegal to call this on a stream - // that is not open -- the call may panic. - CloseStream(streamID uint32) - - // AdjustStream adjusts the priority of the given stream. This may be called - // on a stream that has not yet been opened or has been closed. Note that - // RFC 7540 allows PRIORITY frames to be sent on streams in any state. See: - // https://tools.ietf.org/html/rfc7540#section-5.1 - AdjustStream(streamID uint32, priority PriorityParam) - - // Push queues a frame in the scheduler. In most cases, this will not be - // called with wr.StreamID()!=0 unless that stream is currently open. The one - // exception is RST_STREAM frames, which may be sent on idle or closed streams. - Push(wr FrameWriteRequest) - - // Pop dequeues the next frame to write. Returns false if no frames can - // be written. Frames with a given wr.StreamID() are Pop'd in the same - // order they are Push'd. - Pop() (wr FrameWriteRequest, ok bool) -} - -// OpenStreamOptions specifies extra options for WriteScheduler.OpenStream. -type OpenStreamOptions struct { - // PusherID is zero if the stream was initiated by the client. Otherwise, - // PusherID names the stream that pushed the newly opened stream. - PusherID uint32 -} - -// FrameWriteRequest is a request to write a frame. -type FrameWriteRequest struct { - // write is the interface value that does the writing, once the - // WriteScheduler has selected this frame to write. The write - // functions are all defined in write.go. - write writeFramer - - // stream is the stream on which this frame will be written. - // nil for non-stream frames like PING and SETTINGS. - stream *stream - - // done, if non-nil, must be a buffered channel with space for - // 1 message and is sent the return value from write (or an - // earlier error) when the frame has been written. - done chan error -} - -// StreamID returns the id of the stream this frame will be written to. -// 0 is used for non-stream frames such as PING and SETTINGS. -func (wr FrameWriteRequest) StreamID() uint32 { - if wr.stream == nil { - if se, ok := wr.write.(StreamError); ok { - // (*serverConn).resetStream doesn't set - // stream because it doesn't necessarily have - // one. So special case this type of write - // message. - return se.StreamID - } - return 0 - } - return wr.stream.id -} - -// DataSize returns the number of flow control bytes that must be consumed -// to write this entire frame. This is 0 for non-DATA frames. -func (wr FrameWriteRequest) DataSize() int { - if wd, ok := wr.write.(*writeData); ok { - return len(wd.p) - } - return 0 -} - -// Consume consumes min(n, available) bytes from this frame, where available -// is the number of flow control bytes available on the stream. Consume returns -// 0, 1, or 2 frames, where the integer return value gives the number of frames -// returned. -// -// If flow control prevents consuming any bytes, this returns (_, _, 0). If -// the entire frame was consumed, this returns (wr, _, 1). Otherwise, this -// returns (consumed, rest, 2), where 'consumed' contains the consumed bytes and -// 'rest' contains the remaining bytes. The consumed bytes are deducted from the -// underlying stream's flow control budget. -func (wr FrameWriteRequest) Consume(n int32) (FrameWriteRequest, FrameWriteRequest, int) { - var empty FrameWriteRequest - - // Non-DATA frames are always consumed whole. - wd, ok := wr.write.(*writeData) - if !ok || len(wd.p) == 0 { - return wr, empty, 1 - } - - // Might need to split after applying limits. - allowed := wr.stream.flow.available() - if n < allowed { - allowed = n - } - if wr.stream.sc.maxFrameSize < allowed { - allowed = wr.stream.sc.maxFrameSize - } - if allowed <= 0 { - return empty, empty, 0 - } - if len(wd.p) > int(allowed) { - wr.stream.flow.take(allowed) - consumed := FrameWriteRequest{ - stream: wr.stream, - write: &writeData{ - streamID: wd.streamID, - p: wd.p[:allowed], - // Even if the original had endStream set, there - // are bytes remaining because len(wd.p) > allowed, - // so we know endStream is false. - endStream: false, - }, - // Our caller is blocking on the final DATA frame, not - // this intermediate frame, so no need to wait. - done: nil, - } - rest := FrameWriteRequest{ - stream: wr.stream, - write: &writeData{ - streamID: wd.streamID, - p: wd.p[allowed:], - endStream: wd.endStream, - }, - done: wr.done, - } - return consumed, rest, 2 - } - - // The frame is consumed whole. - // NB: This cast cannot overflow because allowed is <= math.MaxInt32. - wr.stream.flow.take(int32(len(wd.p))) - return wr, empty, 1 -} - -// String is for debugging only. -func (wr FrameWriteRequest) String() string { - var des string - if s, ok := wr.write.(fmt.Stringer); ok { - des = s.String() - } else { - des = fmt.Sprintf("%T", wr.write) - } - return fmt.Sprintf("[FrameWriteRequest stream=%d, ch=%v, writer=%v]", wr.StreamID(), wr.done != nil, des) -} - -// replyToWriter sends err to wr.done and panics if the send must block -// This does nothing if wr.done is nil. -func (wr *FrameWriteRequest) replyToWriter(err error) { - if wr.done == nil { - return - } - select { - case wr.done <- err: - default: - panic(fmt.Sprintf("unbuffered done channel passed in for type %T", wr.write)) - } - wr.write = nil // prevent use (assume it's tainted after wr.done send) -} - -// writeQueue is used by implementations of WriteScheduler. -type writeQueue struct { - s []FrameWriteRequest -} - -func (q *writeQueue) empty() bool { return len(q.s) == 0 } - -func (q *writeQueue) push(wr FrameWriteRequest) { - q.s = append(q.s, wr) -} - -func (q *writeQueue) shift() FrameWriteRequest { - if len(q.s) == 0 { - panic("invalid use of queue") - } - wr := q.s[0] - // TODO: less copy-happy queue. - copy(q.s, q.s[1:]) - q.s[len(q.s)-1] = FrameWriteRequest{} - q.s = q.s[:len(q.s)-1] - return wr -} - -// consume consumes up to n bytes from q.s[0]. If the frame is -// entirely consumed, it is removed from the queue. If the frame -// is partially consumed, the frame is kept with the consumed -// bytes removed. Returns true iff any bytes were consumed. -func (q *writeQueue) consume(n int32) (FrameWriteRequest, bool) { - if len(q.s) == 0 { - return FrameWriteRequest{}, false - } - consumed, rest, numresult := q.s[0].Consume(n) - switch numresult { - case 0: - return FrameWriteRequest{}, false - case 1: - q.shift() - case 2: - q.s[0] = rest - } - return consumed, true -} - -type writeQueuePool []*writeQueue - -// put inserts an unused writeQueue into the pool. -func (p *writeQueuePool) put(q *writeQueue) { - for i := range q.s { - q.s[i] = FrameWriteRequest{} - } - q.s = q.s[:0] - *p = append(*p, q) -} - -// get returns an empty writeQueue. -func (p *writeQueuePool) get() *writeQueue { - ln := len(*p) - if ln == 0 { - return new(writeQueue) - } - x := ln - 1 - q := (*p)[x] - (*p)[x] = nil - *p = (*p)[:x] - return q -} diff --git a/vendor/golang.org/x/net/http2/writesched_priority.go b/vendor/golang.org/x/net/http2/writesched_priority.go deleted file mode 100644 index 848fed6ec..000000000 --- a/vendor/golang.org/x/net/http2/writesched_priority.go +++ /dev/null @@ -1,452 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package http2 - -import ( - "fmt" - "math" - "sort" -) - -// RFC 7540, Section 5.3.5: the default weight is 16. -const priorityDefaultWeight = 15 // 16 = 15 + 1 - -// PriorityWriteSchedulerConfig configures a priorityWriteScheduler. -type PriorityWriteSchedulerConfig struct { - // MaxClosedNodesInTree controls the maximum number of closed streams to - // retain in the priority tree. Setting this to zero saves a small amount - // of memory at the cost of performance. - // - // See RFC 7540, Section 5.3.4: - // "It is possible for a stream to become closed while prioritization - // information ... is in transit. ... This potentially creates suboptimal - // prioritization, since the stream could be given a priority that is - // different from what is intended. To avoid these problems, an endpoint - // SHOULD retain stream prioritization state for a period after streams - // become closed. The longer state is retained, the lower the chance that - // streams are assigned incorrect or default priority values." - MaxClosedNodesInTree int - - // MaxIdleNodesInTree controls the maximum number of idle streams to - // retain in the priority tree. Setting this to zero saves a small amount - // of memory at the cost of performance. - // - // See RFC 7540, Section 5.3.4: - // Similarly, streams that are in the "idle" state can be assigned - // priority or become a parent of other streams. This allows for the - // creation of a grouping node in the dependency tree, which enables - // more flexible expressions of priority. Idle streams begin with a - // default priority (Section 5.3.5). - MaxIdleNodesInTree int - - // ThrottleOutOfOrderWrites enables write throttling to help ensure that - // data is delivered in priority order. This works around a race where - // stream B depends on stream A and both streams are about to call Write - // to queue DATA frames. If B wins the race, a naive scheduler would eagerly - // write as much data from B as possible, but this is suboptimal because A - // is a higher-priority stream. With throttling enabled, we write a small - // amount of data from B to minimize the amount of bandwidth that B can - // steal from A. - ThrottleOutOfOrderWrites bool -} - -// NewPriorityWriteScheduler constructs a WriteScheduler that schedules -// frames by following HTTP/2 priorities as described in RFC 7540 Section 5.3. -// If cfg is nil, default options are used. -func NewPriorityWriteScheduler(cfg *PriorityWriteSchedulerConfig) WriteScheduler { - if cfg == nil { - // For justification of these defaults, see: - // https://docs.google.com/document/d/1oLhNg1skaWD4_DtaoCxdSRN5erEXrH-KnLrMwEpOtFY - cfg = &PriorityWriteSchedulerConfig{ - MaxClosedNodesInTree: 10, - MaxIdleNodesInTree: 10, - ThrottleOutOfOrderWrites: false, - } - } - - ws := &priorityWriteScheduler{ - nodes: make(map[uint32]*priorityNode), - maxClosedNodesInTree: cfg.MaxClosedNodesInTree, - maxIdleNodesInTree: cfg.MaxIdleNodesInTree, - enableWriteThrottle: cfg.ThrottleOutOfOrderWrites, - } - ws.nodes[0] = &ws.root - if cfg.ThrottleOutOfOrderWrites { - ws.writeThrottleLimit = 1024 - } else { - ws.writeThrottleLimit = math.MaxInt32 - } - return ws -} - -type priorityNodeState int - -const ( - priorityNodeOpen priorityNodeState = iota - priorityNodeClosed - priorityNodeIdle -) - -// priorityNode is a node in an HTTP/2 priority tree. -// Each node is associated with a single stream ID. -// See RFC 7540, Section 5.3. -type priorityNode struct { - q writeQueue // queue of pending frames to write - id uint32 // id of the stream, or 0 for the root of the tree - weight uint8 // the actual weight is weight+1, so the value is in [1,256] - state priorityNodeState // open | closed | idle - bytes int64 // number of bytes written by this node, or 0 if closed - subtreeBytes int64 // sum(node.bytes) of all nodes in this subtree - - // These links form the priority tree. - parent *priorityNode - kids *priorityNode // start of the kids list - prev, next *priorityNode // doubly-linked list of siblings -} - -func (n *priorityNode) setParent(parent *priorityNode) { - if n == parent { - panic("setParent to self") - } - if n.parent == parent { - return - } - // Unlink from current parent. - if parent := n.parent; parent != nil { - if n.prev == nil { - parent.kids = n.next - } else { - n.prev.next = n.next - } - if n.next != nil { - n.next.prev = n.prev - } - } - // Link to new parent. - // If parent=nil, remove n from the tree. - // Always insert at the head of parent.kids (this is assumed by walkReadyInOrder). - n.parent = parent - if parent == nil { - n.next = nil - n.prev = nil - } else { - n.next = parent.kids - n.prev = nil - if n.next != nil { - n.next.prev = n - } - parent.kids = n - } -} - -func (n *priorityNode) addBytes(b int64) { - n.bytes += b - for ; n != nil; n = n.parent { - n.subtreeBytes += b - } -} - -// walkReadyInOrder iterates over the tree in priority order, calling f for each node -// with a non-empty write queue. When f returns true, this funcion returns true and the -// walk halts. tmp is used as scratch space for sorting. -// -// f(n, openParent) takes two arguments: the node to visit, n, and a bool that is true -// if any ancestor p of n is still open (ignoring the root node). -func (n *priorityNode) walkReadyInOrder(openParent bool, tmp *[]*priorityNode, f func(*priorityNode, bool) bool) bool { - if !n.q.empty() && f(n, openParent) { - return true - } - if n.kids == nil { - return false - } - - // Don't consider the root "open" when updating openParent since - // we can't send data frames on the root stream (only control frames). - if n.id != 0 { - openParent = openParent || (n.state == priorityNodeOpen) - } - - // Common case: only one kid or all kids have the same weight. - // Some clients don't use weights; other clients (like web browsers) - // use mostly-linear priority trees. - w := n.kids.weight - needSort := false - for k := n.kids.next; k != nil; k = k.next { - if k.weight != w { - needSort = true - break - } - } - if !needSort { - for k := n.kids; k != nil; k = k.next { - if k.walkReadyInOrder(openParent, tmp, f) { - return true - } - } - return false - } - - // Uncommon case: sort the child nodes. We remove the kids from the parent, - // then re-insert after sorting so we can reuse tmp for future sort calls. - *tmp = (*tmp)[:0] - for n.kids != nil { - *tmp = append(*tmp, n.kids) - n.kids.setParent(nil) - } - sort.Sort(sortPriorityNodeSiblings(*tmp)) - for i := len(*tmp) - 1; i >= 0; i-- { - (*tmp)[i].setParent(n) // setParent inserts at the head of n.kids - } - for k := n.kids; k != nil; k = k.next { - if k.walkReadyInOrder(openParent, tmp, f) { - return true - } - } - return false -} - -type sortPriorityNodeSiblings []*priorityNode - -func (z sortPriorityNodeSiblings) Len() int { return len(z) } -func (z sortPriorityNodeSiblings) Swap(i, k int) { z[i], z[k] = z[k], z[i] } -func (z sortPriorityNodeSiblings) Less(i, k int) bool { - // Prefer the subtree that has sent fewer bytes relative to its weight. - // See sections 5.3.2 and 5.3.4. - wi, bi := float64(z[i].weight+1), float64(z[i].subtreeBytes) - wk, bk := float64(z[k].weight+1), float64(z[k].subtreeBytes) - if bi == 0 && bk == 0 { - return wi >= wk - } - if bk == 0 { - return false - } - return bi/bk <= wi/wk -} - -type priorityWriteScheduler struct { - // root is the root of the priority tree, where root.id = 0. - // The root queues control frames that are not associated with any stream. - root priorityNode - - // nodes maps stream ids to priority tree nodes. - nodes map[uint32]*priorityNode - - // maxID is the maximum stream id in nodes. - maxID uint32 - - // lists of nodes that have been closed or are idle, but are kept in - // the tree for improved prioritization. When the lengths exceed either - // maxClosedNodesInTree or maxIdleNodesInTree, old nodes are discarded. - closedNodes, idleNodes []*priorityNode - - // From the config. - maxClosedNodesInTree int - maxIdleNodesInTree int - writeThrottleLimit int32 - enableWriteThrottle bool - - // tmp is scratch space for priorityNode.walkReadyInOrder to reduce allocations. - tmp []*priorityNode - - // pool of empty queues for reuse. - queuePool writeQueuePool -} - -func (ws *priorityWriteScheduler) OpenStream(streamID uint32, options OpenStreamOptions) { - // The stream may be currently idle but cannot be opened or closed. - if curr := ws.nodes[streamID]; curr != nil { - if curr.state != priorityNodeIdle { - panic(fmt.Sprintf("stream %d already opened", streamID)) - } - curr.state = priorityNodeOpen - return - } - - // RFC 7540, Section 5.3.5: - // "All streams are initially assigned a non-exclusive dependency on stream 0x0. - // Pushed streams initially depend on their associated stream. In both cases, - // streams are assigned a default weight of 16." - parent := ws.nodes[options.PusherID] - if parent == nil { - parent = &ws.root - } - n := &priorityNode{ - q: *ws.queuePool.get(), - id: streamID, - weight: priorityDefaultWeight, - state: priorityNodeOpen, - } - n.setParent(parent) - ws.nodes[streamID] = n - if streamID > ws.maxID { - ws.maxID = streamID - } -} - -func (ws *priorityWriteScheduler) CloseStream(streamID uint32) { - if streamID == 0 { - panic("violation of WriteScheduler interface: cannot close stream 0") - } - if ws.nodes[streamID] == nil { - panic(fmt.Sprintf("violation of WriteScheduler interface: unknown stream %d", streamID)) - } - if ws.nodes[streamID].state != priorityNodeOpen { - panic(fmt.Sprintf("violation of WriteScheduler interface: stream %d already closed", streamID)) - } - - n := ws.nodes[streamID] - n.state = priorityNodeClosed - n.addBytes(-n.bytes) - - q := n.q - ws.queuePool.put(&q) - n.q.s = nil - if ws.maxClosedNodesInTree > 0 { - ws.addClosedOrIdleNode(&ws.closedNodes, ws.maxClosedNodesInTree, n) - } else { - ws.removeNode(n) - } -} - -func (ws *priorityWriteScheduler) AdjustStream(streamID uint32, priority PriorityParam) { - if streamID == 0 { - panic("adjustPriority on root") - } - - // If streamID does not exist, there are two cases: - // - A closed stream that has been removed (this will have ID <= maxID) - // - An idle stream that is being used for "grouping" (this will have ID > maxID) - n := ws.nodes[streamID] - if n == nil { - if streamID <= ws.maxID || ws.maxIdleNodesInTree == 0 { - return - } - ws.maxID = streamID - n = &priorityNode{ - q: *ws.queuePool.get(), - id: streamID, - weight: priorityDefaultWeight, - state: priorityNodeIdle, - } - n.setParent(&ws.root) - ws.nodes[streamID] = n - ws.addClosedOrIdleNode(&ws.idleNodes, ws.maxIdleNodesInTree, n) - } - - // Section 5.3.1: A dependency on a stream that is not currently in the tree - // results in that stream being given a default priority (Section 5.3.5). - parent := ws.nodes[priority.StreamDep] - if parent == nil { - n.setParent(&ws.root) - n.weight = priorityDefaultWeight - return - } - - // Ignore if the client tries to make a node its own parent. - if n == parent { - return - } - - // Section 5.3.3: - // "If a stream is made dependent on one of its own dependencies, the - // formerly dependent stream is first moved to be dependent on the - // reprioritized stream's previous parent. The moved dependency retains - // its weight." - // - // That is: if parent depends on n, move parent to depend on n.parent. - for x := parent.parent; x != nil; x = x.parent { - if x == n { - parent.setParent(n.parent) - break - } - } - - // Section 5.3.3: The exclusive flag causes the stream to become the sole - // dependency of its parent stream, causing other dependencies to become - // dependent on the exclusive stream. - if priority.Exclusive { - k := parent.kids - for k != nil { - next := k.next - if k != n { - k.setParent(n) - } - k = next - } - } - - n.setParent(parent) - n.weight = priority.Weight -} - -func (ws *priorityWriteScheduler) Push(wr FrameWriteRequest) { - var n *priorityNode - if id := wr.StreamID(); id == 0 { - n = &ws.root - } else { - n = ws.nodes[id] - if n == nil { - // id is an idle or closed stream. wr should not be a HEADERS or - // DATA frame. However, wr can be a RST_STREAM. In this case, we - // push wr onto the root, rather than creating a new priorityNode, - // since RST_STREAM is tiny and the stream's priority is unknown - // anyway. See issue #17919. - if wr.DataSize() > 0 { - panic("add DATA on non-open stream") - } - n = &ws.root - } - } - n.q.push(wr) -} - -func (ws *priorityWriteScheduler) Pop() (wr FrameWriteRequest, ok bool) { - ws.root.walkReadyInOrder(false, &ws.tmp, func(n *priorityNode, openParent bool) bool { - limit := int32(math.MaxInt32) - if openParent { - limit = ws.writeThrottleLimit - } - wr, ok = n.q.consume(limit) - if !ok { - return false - } - n.addBytes(int64(wr.DataSize())) - // If B depends on A and B continuously has data available but A - // does not, gradually increase the throttling limit to allow B to - // steal more and more bandwidth from A. - if openParent { - ws.writeThrottleLimit += 1024 - if ws.writeThrottleLimit < 0 { - ws.writeThrottleLimit = math.MaxInt32 - } - } else if ws.enableWriteThrottle { - ws.writeThrottleLimit = 1024 - } - return true - }) - return wr, ok -} - -func (ws *priorityWriteScheduler) addClosedOrIdleNode(list *[]*priorityNode, maxSize int, n *priorityNode) { - if maxSize == 0 { - return - } - if len(*list) == maxSize { - // Remove the oldest node, then shift left. - ws.removeNode((*list)[0]) - x := (*list)[1:] - copy(*list, x) - *list = (*list)[:len(x)] - } - *list = append(*list, n) -} - -func (ws *priorityWriteScheduler) removeNode(n *priorityNode) { - for k := n.kids; k != nil; k = k.next { - k.setParent(n.parent) - } - n.setParent(nil) - delete(ws.nodes, n.id) -} diff --git a/vendor/golang.org/x/net/http2/writesched_random.go b/vendor/golang.org/x/net/http2/writesched_random.go deleted file mode 100644 index 36d7919f1..000000000 --- a/vendor/golang.org/x/net/http2/writesched_random.go +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package http2 - -import "math" - -// NewRandomWriteScheduler constructs a WriteScheduler that ignores HTTP/2 -// priorities. Control frames like SETTINGS and PING are written before DATA -// frames, but if no control frames are queued and multiple streams have queued -// HEADERS or DATA frames, Pop selects a ready stream arbitrarily. -func NewRandomWriteScheduler() WriteScheduler { - return &randomWriteScheduler{sq: make(map[uint32]*writeQueue)} -} - -type randomWriteScheduler struct { - // zero are frames not associated with a specific stream. - zero writeQueue - - // sq contains the stream-specific queues, keyed by stream ID. - // When a stream is idle or closed, it's deleted from the map. - sq map[uint32]*writeQueue - - // pool of empty queues for reuse. - queuePool writeQueuePool -} - -func (ws *randomWriteScheduler) OpenStream(streamID uint32, options OpenStreamOptions) { - // no-op: idle streams are not tracked -} - -func (ws *randomWriteScheduler) CloseStream(streamID uint32) { - q, ok := ws.sq[streamID] - if !ok { - return - } - delete(ws.sq, streamID) - ws.queuePool.put(q) -} - -func (ws *randomWriteScheduler) AdjustStream(streamID uint32, priority PriorityParam) { - // no-op: priorities are ignored -} - -func (ws *randomWriteScheduler) Push(wr FrameWriteRequest) { - id := wr.StreamID() - if id == 0 { - ws.zero.push(wr) - return - } - q, ok := ws.sq[id] - if !ok { - q = ws.queuePool.get() - ws.sq[id] = q - } - q.push(wr) -} - -func (ws *randomWriteScheduler) Pop() (FrameWriteRequest, bool) { - // Control frames first. - if !ws.zero.empty() { - return ws.zero.shift(), true - } - // Iterate over all non-idle streams until finding one that can be consumed. - for _, q := range ws.sq { - if wr, ok := q.consume(math.MaxInt32); ok { - return wr, true - } - } - return FrameWriteRequest{}, false -} diff --git a/vendor/golang.org/x/net/idna/idna.go b/vendor/golang.org/x/net/idna/idna.go deleted file mode 100644 index ee2dbda6d..000000000 --- a/vendor/golang.org/x/net/idna/idna.go +++ /dev/null @@ -1,668 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package idna implements IDNA2008 using the compatibility processing -// defined by UTS (Unicode Technical Standard) #46, which defines a standard to -// deal with the transition from IDNA2003. -// -// IDNA2008 (Internationalized Domain Names for Applications), is defined in RFC -// 5890, RFC 5891, RFC 5892, RFC 5893 and RFC 5894. -// UTS #46 is defined in http://www.unicode.org/reports/tr46. -// See http://unicode.org/cldr/utility/idna.jsp for a visualization of the -// differences between these two standards. -package idna // import "golang.org/x/net/idna" - -import ( - "fmt" - "strings" - "unicode/utf8" - - "golang.org/x/text/secure/bidirule" - "golang.org/x/text/unicode/norm" -) - -// NOTE: Unlike common practice in Go APIs, the functions will return a -// sanitized domain name in case of errors. Browsers sometimes use a partially -// evaluated string as lookup. -// TODO: the current error handling is, in my opinion, the least opinionated. -// Other strategies are also viable, though: -// Option 1) Return an empty string in case of error, but allow the user to -// specify explicitly which errors to ignore. -// Option 2) Return the partially evaluated string if it is itself a valid -// string, otherwise return the empty string in case of error. -// Option 3) Option 1 and 2. -// Option 4) Always return an empty string for now and implement Option 1 as -// needed, and document that the return string may not be empty in case of -// error in the future. -// I think Option 1 is best, but it is quite opinionated. - -// ToASCII is a wrapper for Punycode.ToASCII. -func ToASCII(s string) (string, error) { - return Punycode.process(s, true) -} - -// ToUnicode is a wrapper for Punycode.ToUnicode. -func ToUnicode(s string) (string, error) { - return Punycode.process(s, false) -} - -// An Option configures a Profile at creation time. -type Option func(*options) - -// Transitional sets a Profile to use the Transitional mapping as defined in UTS -// #46. This will cause, for example, "ß" to be mapped to "ss". Using the -// transitional mapping provides a compromise between IDNA2003 and IDNA2008 -// compatibility. It is used by most browsers when resolving domain names. This -// option is only meaningful if combined with MapForLookup. -func Transitional(transitional bool) Option { - return func(o *options) { o.transitional = true } -} - -// VerifyDNSLength sets whether a Profile should fail if any of the IDN parts -// are longer than allowed by the RFC. -func VerifyDNSLength(verify bool) Option { - return func(o *options) { o.verifyDNSLength = verify } -} - -// ValidateLabels sets whether to check the mandatory label validation criteria -// as defined in Section 5.4 of RFC 5891. This includes testing for correct use -// of hyphens ('-'), normalization, validity of runes, and the context rules. -func ValidateLabels(enable bool) Option { - return func(o *options) { - // Don't override existing mappings, but set one that at least checks - // normalization if it is not set. - if o.mapping == nil && enable { - o.mapping = normalize - } - o.trie = trie - o.validateLabels = enable - o.fromPuny = validateFromPunycode - } -} - -// StrictDomainName limits the set of permissable ASCII characters to those -// allowed in domain names as defined in RFC 1034 (A-Z, a-z, 0-9 and the -// hyphen). This is set by default for MapForLookup and ValidateForRegistration. -// -// This option is useful, for instance, for browsers that allow characters -// outside this range, for example a '_' (U+005F LOW LINE). See -// http://www.rfc-editor.org/std/std3.txt for more details This option -// corresponds to the UseSTD3ASCIIRules option in UTS #46. -func StrictDomainName(use bool) Option { - return func(o *options) { - o.trie = trie - o.useSTD3Rules = use - o.fromPuny = validateFromPunycode - } -} - -// NOTE: the following options pull in tables. The tables should not be linked -// in as long as the options are not used. - -// BidiRule enables the Bidi rule as defined in RFC 5893. Any application -// that relies on proper validation of labels should include this rule. -func BidiRule() Option { - return func(o *options) { o.bidirule = bidirule.ValidString } -} - -// ValidateForRegistration sets validation options to verify that a given IDN is -// properly formatted for registration as defined by Section 4 of RFC 5891. -func ValidateForRegistration() Option { - return func(o *options) { - o.mapping = validateRegistration - StrictDomainName(true)(o) - ValidateLabels(true)(o) - VerifyDNSLength(true)(o) - BidiRule()(o) - } -} - -// MapForLookup sets validation and mapping options such that a given IDN is -// transformed for domain name lookup according to the requirements set out in -// Section 5 of RFC 5891. The mappings follow the recommendations of RFC 5894, -// RFC 5895 and UTS 46. It does not add the Bidi Rule. Use the BidiRule option -// to add this check. -// -// The mappings include normalization and mapping case, width and other -// compatibility mappings. -func MapForLookup() Option { - return func(o *options) { - o.mapping = validateAndMap - StrictDomainName(true)(o) - ValidateLabels(true)(o) - } -} - -type options struct { - transitional bool - useSTD3Rules bool - validateLabels bool - verifyDNSLength bool - - trie *idnaTrie - - // fromPuny calls validation rules when converting A-labels to U-labels. - fromPuny func(p *Profile, s string) error - - // mapping implements a validation and mapping step as defined in RFC 5895 - // or UTS 46, tailored to, for example, domain registration or lookup. - mapping func(p *Profile, s string) (string, error) - - // bidirule, if specified, checks whether s conforms to the Bidi Rule - // defined in RFC 5893. - bidirule func(s string) bool -} - -// A Profile defines the configuration of a IDNA mapper. -type Profile struct { - options -} - -func apply(o *options, opts []Option) { - for _, f := range opts { - f(o) - } -} - -// New creates a new Profile. -// -// With no options, the returned Profile is the most permissive and equals the -// Punycode Profile. Options can be passed to further restrict the Profile. The -// MapForLookup and ValidateForRegistration options set a collection of options, -// for lookup and registration purposes respectively, which can be tailored by -// adding more fine-grained options, where later options override earlier -// options. -func New(o ...Option) *Profile { - p := &Profile{} - apply(&p.options, o) - return p -} - -// ToASCII converts a domain or domain label to its ASCII form. For example, -// ToASCII("bücher.example.com") is "xn--bcher-kva.example.com", and -// ToASCII("golang") is "golang". If an error is encountered it will return -// an error and a (partially) processed result. -func (p *Profile) ToASCII(s string) (string, error) { - return p.process(s, true) -} - -// ToUnicode converts a domain or domain label to its Unicode form. For example, -// ToUnicode("xn--bcher-kva.example.com") is "bücher.example.com", and -// ToUnicode("golang") is "golang". If an error is encountered it will return -// an error and a (partially) processed result. -func (p *Profile) ToUnicode(s string) (string, error) { - pp := *p - pp.transitional = false - return pp.process(s, false) -} - -// String reports a string with a description of the profile for debugging -// purposes. The string format may change with different versions. -func (p *Profile) String() string { - s := "" - if p.transitional { - s = "Transitional" - } else { - s = "NonTransitional" - } - if p.useSTD3Rules { - s += ":UseSTD3Rules" - } - if p.validateLabels { - s += ":ValidateLabels" - } - if p.verifyDNSLength { - s += ":VerifyDNSLength" - } - return s -} - -var ( - // Punycode is a Profile that does raw punycode processing with a minimum - // of validation. - Punycode *Profile = punycode - - // Lookup is the recommended profile for looking up domain names, according - // to Section 5 of RFC 5891. The exact configuration of this profile may - // change over time. - Lookup *Profile = lookup - - // Display is the recommended profile for displaying domain names. - // The configuration of this profile may change over time. - Display *Profile = display - - // Registration is the recommended profile for checking whether a given - // IDN is valid for registration, according to Section 4 of RFC 5891. - Registration *Profile = registration - - punycode = &Profile{} - lookup = &Profile{options{ - transitional: true, - useSTD3Rules: true, - validateLabels: true, - trie: trie, - fromPuny: validateFromPunycode, - mapping: validateAndMap, - bidirule: bidirule.ValidString, - }} - display = &Profile{options{ - useSTD3Rules: true, - validateLabels: true, - trie: trie, - fromPuny: validateFromPunycode, - mapping: validateAndMap, - bidirule: bidirule.ValidString, - }} - registration = &Profile{options{ - useSTD3Rules: true, - validateLabels: true, - verifyDNSLength: true, - trie: trie, - fromPuny: validateFromPunycode, - mapping: validateRegistration, - bidirule: bidirule.ValidString, - }} - - // TODO: profiles - // Register: recommended for approving domain names: don't do any mappings - // but rather reject on invalid input. Bundle or block deviation characters. -) - -type labelError struct{ label, code_ string } - -func (e labelError) code() string { return e.code_ } -func (e labelError) Error() string { - return fmt.Sprintf("idna: invalid label %q", e.label) -} - -type runeError rune - -func (e runeError) code() string { return "P1" } -func (e runeError) Error() string { - return fmt.Sprintf("idna: disallowed rune %U", e) -} - -// process implements the algorithm described in section 4 of UTS #46, -// see http://www.unicode.org/reports/tr46. -func (p *Profile) process(s string, toASCII bool) (string, error) { - var err error - if p.mapping != nil { - s, err = p.mapping(p, s) - } - // Remove leading empty labels. - for ; len(s) > 0 && s[0] == '.'; s = s[1:] { - } - // It seems like we should only create this error on ToASCII, but the - // UTS 46 conformance tests suggests we should always check this. - if err == nil && p.verifyDNSLength && s == "" { - err = &labelError{s, "A4"} - } - labels := labelIter{orig: s} - for ; !labels.done(); labels.next() { - label := labels.label() - if label == "" { - // Empty labels are not okay. The label iterator skips the last - // label if it is empty. - if err == nil && p.verifyDNSLength { - err = &labelError{s, "A4"} - } - continue - } - if strings.HasPrefix(label, acePrefix) { - u, err2 := decode(label[len(acePrefix):]) - if err2 != nil { - if err == nil { - err = err2 - } - // Spec says keep the old label. - continue - } - labels.set(u) - if err == nil && p.validateLabels { - err = p.fromPuny(p, u) - } - if err == nil { - // This should be called on NonTransitional, according to the - // spec, but that currently does not have any effect. Use the - // original profile to preserve options. - err = p.validateLabel(u) - } - } else if err == nil { - err = p.validateLabel(label) - } - } - if toASCII { - for labels.reset(); !labels.done(); labels.next() { - label := labels.label() - if !ascii(label) { - a, err2 := encode(acePrefix, label) - if err == nil { - err = err2 - } - label = a - labels.set(a) - } - n := len(label) - if p.verifyDNSLength && err == nil && (n == 0 || n > 63) { - err = &labelError{label, "A4"} - } - } - } - s = labels.result() - if toASCII && p.verifyDNSLength && err == nil { - // Compute the length of the domain name minus the root label and its dot. - n := len(s) - if n > 0 && s[n-1] == '.' { - n-- - } - if len(s) < 1 || n > 253 { - err = &labelError{s, "A4"} - } - } - return s, err -} - -func normalize(p *Profile, s string) (string, error) { - return norm.NFC.String(s), nil -} - -func validateRegistration(p *Profile, s string) (string, error) { - if !norm.NFC.IsNormalString(s) { - return s, &labelError{s, "V1"} - } - var err error - for i := 0; i < len(s); { - v, sz := trie.lookupString(s[i:]) - i += sz - // Copy bytes not copied so far. - switch p.simplify(info(v).category()) { - // TODO: handle the NV8 defined in the Unicode idna data set to allow - // for strict conformance to IDNA2008. - case valid, deviation: - case disallowed, mapped, unknown, ignored: - if err == nil { - r, _ := utf8.DecodeRuneInString(s[i:]) - err = runeError(r) - } - } - } - return s, err -} - -func validateAndMap(p *Profile, s string) (string, error) { - var ( - err error - b []byte - k int - ) - for i := 0; i < len(s); { - v, sz := trie.lookupString(s[i:]) - start := i - i += sz - // Copy bytes not copied so far. - switch p.simplify(info(v).category()) { - case valid: - continue - case disallowed: - if err == nil { - r, _ := utf8.DecodeRuneInString(s[i:]) - err = runeError(r) - } - continue - case mapped, deviation: - b = append(b, s[k:start]...) - b = info(v).appendMapping(b, s[start:i]) - case ignored: - b = append(b, s[k:start]...) - // drop the rune - case unknown: - b = append(b, s[k:start]...) - b = append(b, "\ufffd"...) - } - k = i - } - if k == 0 { - // No changes so far. - s = norm.NFC.String(s) - } else { - b = append(b, s[k:]...) - if norm.NFC.QuickSpan(b) != len(b) { - b = norm.NFC.Bytes(b) - } - // TODO: the punycode converters require strings as input. - s = string(b) - } - return s, err -} - -// A labelIter allows iterating over domain name labels. -type labelIter struct { - orig string - slice []string - curStart int - curEnd int - i int -} - -func (l *labelIter) reset() { - l.curStart = 0 - l.curEnd = 0 - l.i = 0 -} - -func (l *labelIter) done() bool { - return l.curStart >= len(l.orig) -} - -func (l *labelIter) result() string { - if l.slice != nil { - return strings.Join(l.slice, ".") - } - return l.orig -} - -func (l *labelIter) label() string { - if l.slice != nil { - return l.slice[l.i] - } - p := strings.IndexByte(l.orig[l.curStart:], '.') - l.curEnd = l.curStart + p - if p == -1 { - l.curEnd = len(l.orig) - } - return l.orig[l.curStart:l.curEnd] -} - -// next sets the value to the next label. It skips the last label if it is empty. -func (l *labelIter) next() { - l.i++ - if l.slice != nil { - if l.i >= len(l.slice) || l.i == len(l.slice)-1 && l.slice[l.i] == "" { - l.curStart = len(l.orig) - } - } else { - l.curStart = l.curEnd + 1 - if l.curStart == len(l.orig)-1 && l.orig[l.curStart] == '.' { - l.curStart = len(l.orig) - } - } -} - -func (l *labelIter) set(s string) { - if l.slice == nil { - l.slice = strings.Split(l.orig, ".") - } - l.slice[l.i] = s -} - -// acePrefix is the ASCII Compatible Encoding prefix. -const acePrefix = "xn--" - -func (p *Profile) simplify(cat category) category { - switch cat { - case disallowedSTD3Mapped: - if p.useSTD3Rules { - cat = disallowed - } else { - cat = mapped - } - case disallowedSTD3Valid: - if p.useSTD3Rules { - cat = disallowed - } else { - cat = valid - } - case deviation: - if !p.transitional { - cat = valid - } - case validNV8, validXV8: - // TODO: handle V2008 - cat = valid - } - return cat -} - -func validateFromPunycode(p *Profile, s string) error { - if !norm.NFC.IsNormalString(s) { - return &labelError{s, "V1"} - } - for i := 0; i < len(s); { - v, sz := trie.lookupString(s[i:]) - if c := p.simplify(info(v).category()); c != valid && c != deviation { - return &labelError{s, "V6"} - } - i += sz - } - return nil -} - -const ( - zwnj = "\u200c" - zwj = "\u200d" -) - -type joinState int8 - -const ( - stateStart joinState = iota - stateVirama - stateBefore - stateBeforeVirama - stateAfter - stateFAIL -) - -var joinStates = [][numJoinTypes]joinState{ - stateStart: { - joiningL: stateBefore, - joiningD: stateBefore, - joinZWNJ: stateFAIL, - joinZWJ: stateFAIL, - joinVirama: stateVirama, - }, - stateVirama: { - joiningL: stateBefore, - joiningD: stateBefore, - }, - stateBefore: { - joiningL: stateBefore, - joiningD: stateBefore, - joiningT: stateBefore, - joinZWNJ: stateAfter, - joinZWJ: stateFAIL, - joinVirama: stateBeforeVirama, - }, - stateBeforeVirama: { - joiningL: stateBefore, - joiningD: stateBefore, - joiningT: stateBefore, - }, - stateAfter: { - joiningL: stateFAIL, - joiningD: stateBefore, - joiningT: stateAfter, - joiningR: stateStart, - joinZWNJ: stateFAIL, - joinZWJ: stateFAIL, - joinVirama: stateAfter, // no-op as we can't accept joiners here - }, - stateFAIL: { - 0: stateFAIL, - joiningL: stateFAIL, - joiningD: stateFAIL, - joiningT: stateFAIL, - joiningR: stateFAIL, - joinZWNJ: stateFAIL, - joinZWJ: stateFAIL, - joinVirama: stateFAIL, - }, -} - -// validateLabel validates the criteria from Section 4.1. Item 1, 4, and 6 are -// already implicitly satisfied by the overall implementation. -func (p *Profile) validateLabel(s string) error { - if s == "" { - if p.verifyDNSLength { - return &labelError{s, "A4"} - } - return nil - } - if p.bidirule != nil && !p.bidirule(s) { - return &labelError{s, "B"} - } - if !p.validateLabels { - return nil - } - trie := p.trie // p.validateLabels is only set if trie is set. - if len(s) > 4 && s[2] == '-' && s[3] == '-' { - return &labelError{s, "V2"} - } - if s[0] == '-' || s[len(s)-1] == '-' { - return &labelError{s, "V3"} - } - // TODO: merge the use of this in the trie. - v, sz := trie.lookupString(s) - x := info(v) - if x.isModifier() { - return &labelError{s, "V5"} - } - // Quickly return in the absence of zero-width (non) joiners. - if strings.Index(s, zwj) == -1 && strings.Index(s, zwnj) == -1 { - return nil - } - st := stateStart - for i := 0; ; { - jt := x.joinType() - if s[i:i+sz] == zwj { - jt = joinZWJ - } else if s[i:i+sz] == zwnj { - jt = joinZWNJ - } - st = joinStates[st][jt] - if x.isViramaModifier() { - st = joinStates[st][joinVirama] - } - if i += sz; i == len(s) { - break - } - v, sz = trie.lookupString(s[i:]) - x = info(v) - } - if st == stateFAIL || st == stateAfter { - return &labelError{s, "C"} - } - return nil -} - -func ascii(s string) bool { - for i := 0; i < len(s); i++ { - if s[i] >= utf8.RuneSelf { - return false - } - } - return true -} diff --git a/vendor/golang.org/x/net/idna/punycode.go b/vendor/golang.org/x/net/idna/punycode.go deleted file mode 100644 index 02c7d59af..000000000 --- a/vendor/golang.org/x/net/idna/punycode.go +++ /dev/null @@ -1,203 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package idna - -// This file implements the Punycode algorithm from RFC 3492. - -import ( - "math" - "strings" - "unicode/utf8" -) - -// These parameter values are specified in section 5. -// -// All computation is done with int32s, so that overflow behavior is identical -// regardless of whether int is 32-bit or 64-bit. -const ( - base int32 = 36 - damp int32 = 700 - initialBias int32 = 72 - initialN int32 = 128 - skew int32 = 38 - tmax int32 = 26 - tmin int32 = 1 -) - -func punyError(s string) error { return &labelError{s, "A3"} } - -// decode decodes a string as specified in section 6.2. -func decode(encoded string) (string, error) { - if encoded == "" { - return "", nil - } - pos := 1 + strings.LastIndex(encoded, "-") - if pos == 1 { - return "", punyError(encoded) - } - if pos == len(encoded) { - return encoded[:len(encoded)-1], nil - } - output := make([]rune, 0, len(encoded)) - if pos != 0 { - for _, r := range encoded[:pos-1] { - output = append(output, r) - } - } - i, n, bias := int32(0), initialN, initialBias - for pos < len(encoded) { - oldI, w := i, int32(1) - for k := base; ; k += base { - if pos == len(encoded) { - return "", punyError(encoded) - } - digit, ok := decodeDigit(encoded[pos]) - if !ok { - return "", punyError(encoded) - } - pos++ - i += digit * w - if i < 0 { - return "", punyError(encoded) - } - t := k - bias - if t < tmin { - t = tmin - } else if t > tmax { - t = tmax - } - if digit < t { - break - } - w *= base - t - if w >= math.MaxInt32/base { - return "", punyError(encoded) - } - } - x := int32(len(output) + 1) - bias = adapt(i-oldI, x, oldI == 0) - n += i / x - i %= x - if n > utf8.MaxRune || len(output) >= 1024 { - return "", punyError(encoded) - } - output = append(output, 0) - copy(output[i+1:], output[i:]) - output[i] = n - i++ - } - return string(output), nil -} - -// encode encodes a string as specified in section 6.3 and prepends prefix to -// the result. -// -// The "while h < length(input)" line in the specification becomes "for -// remaining != 0" in the Go code, because len(s) in Go is in bytes, not runes. -func encode(prefix, s string) (string, error) { - output := make([]byte, len(prefix), len(prefix)+1+2*len(s)) - copy(output, prefix) - delta, n, bias := int32(0), initialN, initialBias - b, remaining := int32(0), int32(0) - for _, r := range s { - if r < 0x80 { - b++ - output = append(output, byte(r)) - } else { - remaining++ - } - } - h := b - if b > 0 { - output = append(output, '-') - } - for remaining != 0 { - m := int32(0x7fffffff) - for _, r := range s { - if m > r && r >= n { - m = r - } - } - delta += (m - n) * (h + 1) - if delta < 0 { - return "", punyError(s) - } - n = m - for _, r := range s { - if r < n { - delta++ - if delta < 0 { - return "", punyError(s) - } - continue - } - if r > n { - continue - } - q := delta - for k := base; ; k += base { - t := k - bias - if t < tmin { - t = tmin - } else if t > tmax { - t = tmax - } - if q < t { - break - } - output = append(output, encodeDigit(t+(q-t)%(base-t))) - q = (q - t) / (base - t) - } - output = append(output, encodeDigit(q)) - bias = adapt(delta, h+1, h == b) - delta = 0 - h++ - remaining-- - } - delta++ - n++ - } - return string(output), nil -} - -func decodeDigit(x byte) (digit int32, ok bool) { - switch { - case '0' <= x && x <= '9': - return int32(x - ('0' - 26)), true - case 'A' <= x && x <= 'Z': - return int32(x - 'A'), true - case 'a' <= x && x <= 'z': - return int32(x - 'a'), true - } - return 0, false -} - -func encodeDigit(digit int32) byte { - switch { - case 0 <= digit && digit < 26: - return byte(digit + 'a') - case 26 <= digit && digit < 36: - return byte(digit + ('0' - 26)) - } - panic("idna: internal error in punycode encoding") -} - -// adapt is the bias adaptation function specified in section 6.1. -func adapt(delta, numPoints int32, firstTime bool) int32 { - if firstTime { - delta /= damp - } else { - delta /= 2 - } - delta += delta / numPoints - k := int32(0) - for delta > ((base-tmin)*tmax)/2 { - delta /= base - tmin - k += base - } - return k + (base-tmin+1)*delta/(delta+skew) -} diff --git a/vendor/golang.org/x/net/idna/tables.go b/vendor/golang.org/x/net/idna/tables.go deleted file mode 100644 index d2819345f..000000000 --- a/vendor/golang.org/x/net/idna/tables.go +++ /dev/null @@ -1,4477 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -package idna - -// UnicodeVersion is the Unicode version from which the tables in this package are derived. -const UnicodeVersion = "9.0.0" - -var mappings string = "" + // Size: 8176 bytes - "\x00\x01 \x03 ̈\x01a\x03 ̄\x012\x013\x03 ́\x03 ̧\x011\x01o\x051⁄4\x051⁄2" + - "\x053⁄4\x03i̇\x03l·\x03ʼn\x01s\x03dž\x03ⱥ\x03ⱦ\x01h\x01j\x01r\x01w\x01y" + - "\x03 ̆\x03 ̇\x03 ̊\x03 ̨\x03 ̃\x03 ̋\x01l\x01x\x04̈́\x03 ι\x01;\x05 ̈́" + - "\x04եւ\x04اٴ\x04وٴ\x04ۇٴ\x04يٴ\x06क़\x06ख़\x06ग़\x06ज़\x06ड़\x06ढ़\x06फ़" + - "\x06य़\x06ড়\x06ঢ়\x06য়\x06ਲ਼\x06ਸ਼\x06ਖ਼\x06ਗ਼\x06ਜ਼\x06ਫ਼\x06ଡ଼\x06ଢ଼" + - "\x06ํา\x06ໍາ\x06ຫນ\x06ຫມ\x06གྷ\x06ཌྷ\x06དྷ\x06བྷ\x06ཛྷ\x06ཀྵ\x06ཱི\x06ཱུ" + - "\x06ྲྀ\x09ྲཱྀ\x06ླྀ\x09ླཱྀ\x06ཱྀ\x06ྒྷ\x06ྜྷ\x06ྡྷ\x06ྦྷ\x06ྫྷ\x06ྐྵ\x02" + - "в\x02д\x02о\x02с\x02т\x02ъ\x02ѣ\x02æ\x01b\x01d\x01e\x02ǝ\x01g\x01i\x01k" + - "\x01m\x01n\x02ȣ\x01p\x01t\x01u\x02ɐ\x02ɑ\x02ə\x02ɛ\x02ɜ\x02ŋ\x02ɔ\x02ɯ" + - "\x01v\x02β\x02γ\x02δ\x02φ\x02χ\x02ρ\x02н\x02ɒ\x01c\x02ɕ\x02ð\x01f\x02ɟ" + - "\x02ɡ\x02ɥ\x02ɨ\x02ɩ\x02ɪ\x02ʝ\x02ɭ\x02ʟ\x02ɱ\x02ɰ\x02ɲ\x02ɳ\x02ɴ\x02ɵ" + - "\x02ɸ\x02ʂ\x02ʃ\x02ƫ\x02ʉ\x02ʊ\x02ʋ\x02ʌ\x01z\x02ʐ\x02ʑ\x02ʒ\x02θ\x02ss" + - "\x02ά\x02έ\x02ή\x02ί\x02ό\x02ύ\x02ώ\x05ἀι\x05ἁι\x05ἂι\x05ἃι\x05ἄι\x05ἅι" + - "\x05ἆι\x05ἇι\x05ἠι\x05ἡι\x05ἢι\x05ἣι\x05ἤι\x05ἥι\x05ἦι\x05ἧι\x05ὠι\x05ὡι" + - "\x05ὢι\x05ὣι\x05ὤι\x05ὥι\x05ὦι\x05ὧι\x05ὰι\x04αι\x04άι\x05ᾶι\x02ι\x05 ̈͂" + - "\x05ὴι\x04ηι\x04ήι\x05ῆι\x05 ̓̀\x05 ̓́\x05 ̓͂\x02ΐ\x05 ̔̀\x05 ̔́\x05 ̔͂" + - "\x02ΰ\x05 ̈̀\x01`\x05ὼι\x04ωι\x04ώι\x05ῶι\x06′′\x09′′′\x06‵‵\x09‵‵‵\x02!" + - "!\x02??\x02?!\x02!?\x0c′′′′\x010\x014\x015\x016\x017\x018\x019\x01+\x01=" + - "\x01(\x01)\x02rs\x02ħ\x02no\x01q\x02sm\x02tm\x02ω\x02å\x02א\x02ב\x02ג" + - "\x02ד\x02π\x051⁄7\x051⁄9\x061⁄10\x051⁄3\x052⁄3\x051⁄5\x052⁄5\x053⁄5\x054" + - "⁄5\x051⁄6\x055⁄6\x051⁄8\x053⁄8\x055⁄8\x057⁄8\x041⁄\x02ii\x02iv\x02vi" + - "\x04viii\x02ix\x02xi\x050⁄3\x06∫∫\x09∫∫∫\x06∮∮\x09∮∮∮\x0210\x0211\x0212" + - "\x0213\x0214\x0215\x0216\x0217\x0218\x0219\x0220\x04(10)\x04(11)\x04(12)" + - "\x04(13)\x04(14)\x04(15)\x04(16)\x04(17)\x04(18)\x04(19)\x04(20)\x0c∫∫∫∫" + - "\x02==\x05⫝̸\x02ɫ\x02ɽ\x02ȿ\x02ɀ\x01.\x04 ゙\x04 ゚\x06より\x06コト\x05(ᄀ)\x05" + - "(ᄂ)\x05(ᄃ)\x05(ᄅ)\x05(ᄆ)\x05(ᄇ)\x05(ᄉ)\x05(ᄋ)\x05(ᄌ)\x05(ᄎ)\x05(ᄏ)\x05(ᄐ" + - ")\x05(ᄑ)\x05(ᄒ)\x05(가)\x05(나)\x05(다)\x05(라)\x05(마)\x05(바)\x05(사)\x05(아)" + - "\x05(자)\x05(차)\x05(카)\x05(타)\x05(파)\x05(하)\x05(주)\x08(오전)\x08(오후)\x05(一)" + - "\x05(二)\x05(三)\x05(四)\x05(五)\x05(六)\x05(七)\x05(八)\x05(九)\x05(十)\x05(月)" + - "\x05(火)\x05(水)\x05(木)\x05(金)\x05(土)\x05(日)\x05(株)\x05(有)\x05(社)\x05(名)" + - "\x05(特)\x05(財)\x05(祝)\x05(労)\x05(代)\x05(呼)\x05(学)\x05(監)\x05(企)\x05(資)" + - "\x05(協)\x05(祭)\x05(休)\x05(自)\x05(至)\x0221\x0222\x0223\x0224\x0225\x0226" + - "\x0227\x0228\x0229\x0230\x0231\x0232\x0233\x0234\x0235\x06참고\x06주의\x0236" + - "\x0237\x0238\x0239\x0240\x0241\x0242\x0243\x0244\x0245\x0246\x0247\x0248" + - "\x0249\x0250\x041月\x042月\x043月\x044月\x045月\x046月\x047月\x048月\x049月\x0510" + - "月\x0511月\x0512月\x02hg\x02ev\x0cアパート\x0cアルファ\x0cアンペア\x09アール\x0cイニング\x09" + - "インチ\x09ウォン\x0fエスクード\x0cエーカー\x09オンス\x09オーム\x09カイリ\x0cカラット\x0cカロリー\x09ガロ" + - "ン\x09ガンマ\x06ギガ\x09ギニー\x0cキュリー\x0cギルダー\x06キロ\x0fキログラム\x12キロメートル\x0fキロワッ" + - "ト\x09グラム\x0fグラムトン\x0fクルゼイロ\x0cクローネ\x09ケース\x09コルナ\x09コーポ\x0cサイクル\x0fサンチ" + - "ーム\x0cシリング\x09センチ\x09セント\x09ダース\x06デシ\x06ドル\x06トン\x06ナノ\x09ノット\x09ハイツ" + - "\x0fパーセント\x09パーツ\x0cバーレル\x0fピアストル\x09ピクル\x06ピコ\x06ビル\x0fファラッド\x0cフィート" + - "\x0fブッシェル\x09フラン\x0fヘクタール\x06ペソ\x09ペニヒ\x09ヘルツ\x09ペンス\x09ページ\x09ベータ\x0cポイ" + - "ント\x09ボルト\x06ホン\x09ポンド\x09ホール\x09ホーン\x0cマイクロ\x09マイル\x09マッハ\x09マルク\x0fマ" + - "ンション\x0cミクロン\x06ミリ\x0fミリバール\x06メガ\x0cメガトン\x0cメートル\x09ヤード\x09ヤール\x09ユアン" + - "\x0cリットル\x06リラ\x09ルピー\x0cルーブル\x06レム\x0fレントゲン\x09ワット\x040点\x041点\x042点" + - "\x043点\x044点\x045点\x046点\x047点\x048点\x049点\x0510点\x0511点\x0512点\x0513点" + - "\x0514点\x0515点\x0516点\x0517点\x0518点\x0519点\x0520点\x0521点\x0522点\x0523点" + - "\x0524点\x02da\x02au\x02ov\x02pc\x02dm\x02iu\x06平成\x06昭和\x06大正\x06明治\x0c株" + - "式会社\x02pa\x02na\x02ma\x02ka\x02kb\x02mb\x02gb\x04kcal\x02pf\x02nf\x02m" + - "g\x02kg\x02hz\x02ml\x02dl\x02kl\x02fm\x02nm\x02mm\x02cm\x02km\x02m2\x02m" + - "3\x05m∕s\x06m∕s2\x07rad∕s\x08rad∕s2\x02ps\x02ns\x02ms\x02pv\x02nv\x02mv" + - "\x02kv\x02pw\x02nw\x02mw\x02kw\x02bq\x02cc\x02cd\x06c∕kg\x02db\x02gy\x02" + - "ha\x02hp\x02in\x02kk\x02kt\x02lm\x02ln\x02lx\x02ph\x02pr\x02sr\x02sv\x02" + - "wb\x05v∕m\x05a∕m\x041日\x042日\x043日\x044日\x045日\x046日\x047日\x048日\x049日" + - "\x0510日\x0511日\x0512日\x0513日\x0514日\x0515日\x0516日\x0517日\x0518日\x0519日" + - "\x0520日\x0521日\x0522日\x0523日\x0524日\x0525日\x0526日\x0527日\x0528日\x0529日" + - "\x0530日\x0531日\x02ь\x02ɦ\x02ɬ\x02ʞ\x02ʇ\x02œ\x04𤋮\x04𢡊\x04𢡄\x04𣏕\x04𥉉" + - "\x04𥳐\x04𧻓\x02ff\x02fi\x02fl\x02st\x04մն\x04մե\x04մի\x04վն\x04մխ\x04יִ" + - "\x04ײַ\x02ע\x02ה\x02כ\x02ל\x02ם\x02ר\x02ת\x04שׁ\x04שׂ\x06שּׁ\x06שּׂ\x04א" + - "ַ\x04אָ\x04אּ\x04בּ\x04גּ\x04דּ\x04הּ\x04וּ\x04זּ\x04טּ\x04יּ\x04ךּ\x04" + - "כּ\x04לּ\x04מּ\x04נּ\x04סּ\x04ףּ\x04פּ\x04צּ\x04קּ\x04רּ\x04שּ\x04תּ" + - "\x04וֹ\x04בֿ\x04כֿ\x04פֿ\x04אל\x02ٱ\x02ٻ\x02پ\x02ڀ\x02ٺ\x02ٿ\x02ٹ\x02ڤ" + - "\x02ڦ\x02ڄ\x02ڃ\x02چ\x02ڇ\x02ڍ\x02ڌ\x02ڎ\x02ڈ\x02ژ\x02ڑ\x02ک\x02گ\x02ڳ" + - "\x02ڱ\x02ں\x02ڻ\x02ۀ\x02ہ\x02ھ\x02ے\x02ۓ\x02ڭ\x02ۇ\x02ۆ\x02ۈ\x02ۋ\x02ۅ" + - "\x02ۉ\x02ې\x02ى\x04ئا\x04ئە\x04ئو\x04ئۇ\x04ئۆ\x04ئۈ\x04ئې\x04ئى\x02ی\x04" + - "ئج\x04ئح\x04ئم\x04ئي\x04بج\x04بح\x04بخ\x04بم\x04بى\x04بي\x04تج\x04تح" + - "\x04تخ\x04تم\x04تى\x04تي\x04ثج\x04ثم\x04ثى\x04ثي\x04جح\x04جم\x04حج\x04حم" + - "\x04خج\x04خح\x04خم\x04سج\x04سح\x04سخ\x04سم\x04صح\x04صم\x04ضج\x04ضح\x04ضخ" + - "\x04ضم\x04طح\x04طم\x04ظم\x04عج\x04عم\x04غج\x04غم\x04فج\x04فح\x04فخ\x04فم" + - "\x04فى\x04في\x04قح\x04قم\x04قى\x04قي\x04كا\x04كج\x04كح\x04كخ\x04كل\x04كم" + - "\x04كى\x04كي\x04لج\x04لح\x04لخ\x04لم\x04لى\x04لي\x04مج\x04مح\x04مخ\x04مم" + - "\x04مى\x04مي\x04نج\x04نح\x04نخ\x04نم\x04نى\x04ني\x04هج\x04هم\x04هى\x04هي" + - "\x04يج\x04يح\x04يخ\x04يم\x04يى\x04يي\x04ذٰ\x04رٰ\x04ىٰ\x05 ٌّ\x05 ٍّ\x05" + - " َّ\x05 ُّ\x05 ِّ\x05 ّٰ\x04ئر\x04ئز\x04ئن\x04بر\x04بز\x04بن\x04تر\x04تز" + - "\x04تن\x04ثر\x04ثز\x04ثن\x04ما\x04نر\x04نز\x04نن\x04ير\x04يز\x04ين\x04ئخ" + - "\x04ئه\x04به\x04ته\x04صخ\x04له\x04نه\x04هٰ\x04يه\x04ثه\x04سه\x04شم\x04شه" + - "\x06ـَّ\x06ـُّ\x06ـِّ\x04طى\x04طي\x04عى\x04عي\x04غى\x04غي\x04سى\x04سي" + - "\x04شى\x04شي\x04حى\x04حي\x04جى\x04جي\x04خى\x04خي\x04صى\x04صي\x04ضى\x04ضي" + - "\x04شج\x04شح\x04شخ\x04شر\x04سر\x04صر\x04ضر\x04اً\x06تجم\x06تحج\x06تحم" + - "\x06تخم\x06تمج\x06تمح\x06تمخ\x06جمح\x06حمي\x06حمى\x06سحج\x06سجح\x06سجى" + - "\x06سمح\x06سمج\x06سمم\x06صحح\x06صمم\x06شحم\x06شجي\x06شمخ\x06شمم\x06ضحى" + - "\x06ضخم\x06طمح\x06طمم\x06طمي\x06عجم\x06عمم\x06عمى\x06غمم\x06غمي\x06غمى" + - "\x06فخم\x06قمح\x06قمم\x06لحم\x06لحي\x06لحى\x06لجج\x06لخم\x06لمح\x06محج" + - "\x06محم\x06محي\x06مجح\x06مجم\x06مخج\x06مخم\x06مجخ\x06همج\x06همم\x06نحم" + - "\x06نحى\x06نجم\x06نجى\x06نمي\x06نمى\x06يمم\x06بخي\x06تجي\x06تجى\x06تخي" + - "\x06تخى\x06تمي\x06تمى\x06جمي\x06جحى\x06جمى\x06سخى\x06صحي\x06شحي\x06ضحي" + - "\x06لجي\x06لمي\x06يحي\x06يجي\x06يمي\x06ممي\x06قمي\x06نحي\x06عمي\x06كمي" + - "\x06نجح\x06مخي\x06لجم\x06كمم\x06جحي\x06حجي\x06مجي\x06فمي\x06بحي\x06سخي" + - "\x06نجي\x06صلے\x06قلے\x08الله\x08اكبر\x08محمد\x08صلعم\x08رسول\x08عليه" + - "\x08وسلم\x06صلى!صلى الله عليه وسلم\x0fجل جلاله\x08ریال\x01,\x01:\x01!" + - "\x01?\x01_\x01{\x01}\x01[\x01]\x01#\x01&\x01*\x01-\x01<\x01>\x01\\\x01$" + - "\x01%\x01@\x04ـً\x04ـَ\x04ـُ\x04ـِ\x04ـّ\x04ـْ\x02ء\x02آ\x02أ\x02ؤ\x02إ" + - "\x02ئ\x02ا\x02ب\x02ة\x02ت\x02ث\x02ج\x02ح\x02خ\x02د\x02ذ\x02ر\x02ز\x02س" + - "\x02ش\x02ص\x02ض\x02ط\x02ظ\x02ع\x02غ\x02ف\x02ق\x02ك\x02ل\x02م\x02ن\x02ه" + - "\x02و\x02ي\x04لآ\x04لأ\x04لإ\x04لا\x01\x22\x01'\x01/\x01^\x01|\x01~\x02¢" + - "\x02£\x02¬\x02¦\x02¥\x08𝅗𝅥\x08𝅘𝅥\x0c𝅘𝅥𝅮\x0c𝅘𝅥𝅯\x0c𝅘𝅥𝅰\x0c𝅘𝅥𝅱\x0c𝅘𝅥𝅲\x08𝆹" + - "𝅥\x08𝆺𝅥\x0c𝆹𝅥𝅮\x0c𝆺𝅥𝅮\x0c𝆹𝅥𝅯\x0c𝆺𝅥𝅯\x02ı\x02ȷ\x02α\x02ε\x02ζ\x02η\x02" + - "κ\x02λ\x02μ\x02ν\x02ξ\x02ο\x02σ\x02τ\x02υ\x02ψ\x03∇\x03∂\x02ϝ\x02ٮ\x02ڡ" + - "\x02ٯ\x020,\x021,\x022,\x023,\x024,\x025,\x026,\x027,\x028,\x029,\x03(a)" + - "\x03(b)\x03(c)\x03(d)\x03(e)\x03(f)\x03(g)\x03(h)\x03(i)\x03(j)\x03(k)" + - "\x03(l)\x03(m)\x03(n)\x03(o)\x03(p)\x03(q)\x03(r)\x03(s)\x03(t)\x03(u)" + - "\x03(v)\x03(w)\x03(x)\x03(y)\x03(z)\x07〔s〕\x02wz\x02hv\x02sd\x03ppv\x02w" + - "c\x02mc\x02md\x02dj\x06ほか\x06ココ\x03サ\x03手\x03字\x03双\x03デ\x03二\x03多\x03解" + - "\x03天\x03交\x03映\x03無\x03料\x03前\x03後\x03再\x03新\x03初\x03終\x03生\x03販\x03声" + - "\x03吹\x03演\x03投\x03捕\x03一\x03三\x03遊\x03左\x03中\x03右\x03指\x03走\x03打\x03禁" + - "\x03空\x03合\x03満\x03有\x03月\x03申\x03割\x03営\x03配\x09〔本〕\x09〔三〕\x09〔二〕\x09〔安" + - "〕\x09〔点〕\x09〔打〕\x09〔盗〕\x09〔勝〕\x09〔敗〕\x03得\x03可\x03丽\x03丸\x03乁\x03你\x03" + - "侮\x03侻\x03倂\x03偺\x03備\x03僧\x03像\x03㒞\x03免\x03兔\x03兤\x03具\x03㒹\x03內\x03" + - "冗\x03冤\x03仌\x03冬\x03况\x03凵\x03刃\x03㓟\x03刻\x03剆\x03剷\x03㔕\x03勇\x03勉\x03" + - "勤\x03勺\x03包\x03匆\x03北\x03卉\x03卑\x03博\x03即\x03卽\x03卿\x03灰\x03及\x03叟\x03" + - "叫\x03叱\x03吆\x03咞\x03吸\x03呈\x03周\x03咢\x03哶\x03唐\x03啓\x03啣\x03善\x03喙\x03" + - "喫\x03喳\x03嗂\x03圖\x03嘆\x03圗\x03噑\x03噴\x03切\x03壮\x03城\x03埴\x03堍\x03型\x03" + - "堲\x03報\x03墬\x03売\x03壷\x03夆\x03夢\x03奢\x03姬\x03娛\x03娧\x03姘\x03婦\x03㛮\x03" + - "嬈\x03嬾\x03寃\x03寘\x03寧\x03寳\x03寿\x03将\x03尢\x03㞁\x03屠\x03屮\x03峀\x03岍\x03" + - "嵃\x03嵮\x03嵫\x03嵼\x03巡\x03巢\x03㠯\x03巽\x03帨\x03帽\x03幩\x03㡢\x03㡼\x03庰\x03" + - "庳\x03庶\x03廊\x03廾\x03舁\x03弢\x03㣇\x03形\x03彫\x03㣣\x03徚\x03忍\x03志\x03忹\x03" + - "悁\x03㤺\x03㤜\x03悔\x03惇\x03慈\x03慌\x03慎\x03慺\x03憎\x03憲\x03憤\x03憯\x03懞\x03" + - "懲\x03懶\x03成\x03戛\x03扝\x03抱\x03拔\x03捐\x03挽\x03拼\x03捨\x03掃\x03揤\x03搢\x03" + - "揅\x03掩\x03㨮\x03摩\x03摾\x03撝\x03摷\x03㩬\x03敏\x03敬\x03旣\x03書\x03晉\x03㬙\x03" + - "暑\x03㬈\x03㫤\x03冒\x03冕\x03最\x03暜\x03肭\x03䏙\x03朗\x03望\x03朡\x03杞\x03杓\x03" + - "㭉\x03柺\x03枅\x03桒\x03梅\x03梎\x03栟\x03椔\x03㮝\x03楂\x03榣\x03槪\x03檨\x03櫛\x03" + - "㰘\x03次\x03歔\x03㱎\x03歲\x03殟\x03殺\x03殻\x03汎\x03沿\x03泍\x03汧\x03洖\x03派\x03" + - "海\x03流\x03浩\x03浸\x03涅\x03洴\x03港\x03湮\x03㴳\x03滋\x03滇\x03淹\x03潮\x03濆\x03" + - "瀹\x03瀞\x03瀛\x03㶖\x03灊\x03災\x03灷\x03炭\x03煅\x03熜\x03爨\x03爵\x03牐\x03犀\x03" + - "犕\x03獺\x03王\x03㺬\x03玥\x03㺸\x03瑇\x03瑜\x03瑱\x03璅\x03瓊\x03㼛\x03甤\x03甾\x03" + - "異\x03瘐\x03㿼\x03䀈\x03直\x03眞\x03真\x03睊\x03䀹\x03瞋\x03䁆\x03䂖\x03硎\x03碌\x03" + - "磌\x03䃣\x03祖\x03福\x03秫\x03䄯\x03穀\x03穊\x03穏\x03䈂\x03篆\x03築\x03䈧\x03糒\x03" + - "䊠\x03糨\x03糣\x03紀\x03絣\x03䌁\x03緇\x03縂\x03繅\x03䌴\x03䍙\x03罺\x03羕\x03翺\x03" + - "者\x03聠\x03聰\x03䏕\x03育\x03脃\x03䐋\x03脾\x03媵\x03舄\x03辞\x03䑫\x03芑\x03芋\x03" + - "芝\x03劳\x03花\x03芳\x03芽\x03苦\x03若\x03茝\x03荣\x03莭\x03茣\x03莽\x03菧\x03著\x03" + - "荓\x03菊\x03菌\x03菜\x03䔫\x03蓱\x03蓳\x03蔖\x03蕤\x03䕝\x03䕡\x03䕫\x03虐\x03虜\x03" + - "虧\x03虩\x03蚩\x03蚈\x03蜎\x03蛢\x03蝹\x03蜨\x03蝫\x03螆\x03蟡\x03蠁\x03䗹\x03衠\x03" + - "衣\x03裗\x03裞\x03䘵\x03裺\x03㒻\x03䚾\x03䛇\x03誠\x03諭\x03變\x03豕\x03貫\x03賁\x03" + - "贛\x03起\x03跋\x03趼\x03跰\x03軔\x03輸\x03邔\x03郱\x03鄑\x03鄛\x03鈸\x03鋗\x03鋘\x03" + - "鉼\x03鏹\x03鐕\x03開\x03䦕\x03閷\x03䧦\x03雃\x03嶲\x03霣\x03䩮\x03䩶\x03韠\x03䪲\x03" + - "頋\x03頩\x03飢\x03䬳\x03餩\x03馧\x03駂\x03駾\x03䯎\x03鬒\x03鱀\x03鳽\x03䳎\x03䳭\x03" + - "鵧\x03䳸\x03麻\x03䵖\x03黹\x03黾\x03鼅\x03鼏\x03鼖\x03鼻" - -var xorData string = "" + // Size: 4855 bytes - "\x02\x0c\x09\x02\xb0\xec\x02\xad\xd8\x02\xad\xd9\x02\x06\x07\x02\x0f\x12" + - "\x02\x0f\x1f\x02\x0f\x1d\x02\x01\x13\x02\x0f\x16\x02\x0f\x0b\x02\x0f3" + - "\x02\x0f7\x02\x0f?\x02\x0f/\x02\x0f*\x02\x0c&\x02\x0c*\x02\x0c;\x02\x0c9" + - "\x02\x0c%\x02\xab\xed\x02\xab\xe2\x02\xab\xe3\x02\xa9\xe0\x02\xa9\xe1" + - "\x02\xa9\xe6\x02\xa3\xcb\x02\xa3\xc8\x02\xa3\xc9\x02\x01#\x02\x01\x08" + - "\x02\x0e>\x02\x0e'\x02\x0f\x03\x02\x03\x0d\x02\x03\x09\x02\x03\x17\x02" + - "\x03\x0e\x02\x02\x03\x02\x011\x02\x01\x00\x02\x01\x10\x02\x03<\x02\x07" + - "\x0d\x02\x02\x0c\x02\x0c0\x02\x01\x03\x02\x01\x01\x02\x01 \x02\x01\x22" + - "\x02\x01)\x02\x01\x0a\x02\x01\x0c\x02\x02\x06\x02\x02\x02\x02\x03\x10" + - "\x03\x037 \x03\x0b+\x03\x02\x01\x04\x02\x01\x02\x02\x019\x02\x03\x1c\x02" + - "\x02$\x03\x80p$\x02\x03:\x02\x03\x0a\x03\xc1r.\x03\xc1r,\x03\xc1r\x02" + - "\x02\x02:\x02\x02>\x02\x02,\x02\x02\x10\x02\x02\x00\x03\xc1s<\x03\xc1s*" + - "\x03\xc2L$\x03\xc2L;\x02\x09)\x02\x0a\x19\x03\x83\xab\xe3\x03\x83\xab" + - "\xf2\x03 4\xe0\x03\x81\xab\xea\x03\x81\xab\xf3\x03 4\xef\x03\x96\xe1\xcd" + - "\x03\x84\xe5\xc3\x02\x0d\x11\x03\x8b\xec\xcb\x03\x94\xec\xcf\x03\x9a\xec" + - "\xc2\x03\x8b\xec\xdb\x03\x94\xec\xdf\x03\x9a\xec\xd2\x03\x01\x0c!\x03" + - "\x01\x0c#\x03ʠ\x9d\x03ʣ\x9c\x03ʢ\x9f\x03ʥ\x9e\x03ʤ\x91\x03ʧ\x90\x03ʦ\x93" + - "\x03ʩ\x92\x03ʨ\x95\x03\xca\xf3\xb5\x03\xca\xf0\xb4\x03\xca\xf1\xb7\x03" + - "\xca\xf6\xb6\x03\xca\xf7\x89\x03\xca\xf4\x88\x03\xca\xf5\x8b\x03\xca\xfa" + - "\x8a\x03\xca\xfb\x8d\x03\xca\xf8\x8c\x03\xca\xf9\x8f\x03\xca\xfe\x8e\x03" + - "\xca\xff\x81\x03\xca\xfc\x80\x03\xca\xfd\x83\x03\xca\xe2\x82\x03\xca\xe3" + - "\x85\x03\xca\xe0\x84\x03\xca\xe1\x87\x03\xca\xe6\x86\x03\xca\xe7\x99\x03" + - "\xca\xe4\x98\x03\xca\xe5\x9b\x03\xca\xea\x9a\x03\xca\xeb\x9d\x03\xca\xe8" + - "\x9c\x03ؓ\x89\x03ߔ\x8b\x02\x010\x03\x03\x04\x1e\x03\x04\x15\x12\x03\x0b" + - "\x05,\x03\x06\x04\x00\x03\x06\x04)\x03\x06\x044\x03\x06\x04<\x03\x06\x05" + - "\x1d\x03\x06\x06\x00\x03\x06\x06\x0a\x03\x06\x06'\x03\x06\x062\x03\x0786" + - "\x03\x079/\x03\x079 \x03\x07:\x0e\x03\x07:\x1b\x03\x07:%\x03\x07;/\x03" + - "\x07;%\x03\x074\x11\x03\x076\x09\x03\x077*\x03\x070\x01\x03\x070\x0f\x03" + - "\x070.\x03\x071\x16\x03\x071\x04\x03\x0710\x03\x072\x18\x03\x072-\x03" + - "\x073\x14\x03\x073>\x03\x07'\x09\x03\x07 \x00\x03\x07\x1f\x0b\x03\x07" + - "\x18#\x03\x07\x18(\x03\x07\x186\x03\x07\x18\x03\x03\x07\x19\x16\x03\x07" + - "\x116\x03\x07\x12'\x03\x07\x13\x10\x03\x07\x0c&\x03\x07\x0c\x08\x03\x07" + - "\x0c\x13\x03\x07\x0d\x02\x03\x07\x0d\x1c\x03\x07\x0b5\x03\x07\x0b\x0a" + - "\x03\x07\x0b\x01\x03\x07\x0b\x0f\x03\x07\x05\x00\x03\x07\x05\x09\x03\x07" + - "\x05\x0b\x03\x07\x07\x01\x03\x07\x07\x08\x03\x07\x00<\x03\x07\x00+\x03" + - "\x07\x01)\x03\x07\x01\x1b\x03\x07\x01\x08\x03\x07\x03?\x03\x0445\x03\x04" + - "4\x08\x03\x0454\x03\x04)/\x03\x04)5\x03\x04+\x05\x03\x04+\x14\x03\x04+ " + - "\x03\x04+<\x03\x04*&\x03\x04*\x22\x03\x04&8\x03\x04!\x01\x03\x04!\x22" + - "\x03\x04\x11+\x03\x04\x10.\x03\x04\x104\x03\x04\x13=\x03\x04\x12\x04\x03" + - "\x04\x12\x0a\x03\x04\x0d\x1d\x03\x04\x0d\x07\x03\x04\x0d \x03\x05<>\x03" + - "\x055<\x03\x055!\x03\x055#\x03\x055&\x03\x054\x1d\x03\x054\x02\x03\x054" + - "\x07\x03\x0571\x03\x053\x1a\x03\x053\x16\x03\x05.<\x03\x05.\x07\x03\x05)" + - ":\x03\x05)<\x03\x05)\x0c\x03\x05)\x15\x03\x05+-\x03\x05+5\x03\x05$\x1e" + - "\x03\x05$\x14\x03\x05'\x04\x03\x05'\x14\x03\x05&\x02\x03\x05\x226\x03" + - "\x05\x22\x0c\x03\x05\x22\x1c\x03\x05\x19\x0a\x03\x05\x1b\x09\x03\x05\x1b" + - "\x0c\x03\x05\x14\x07\x03\x05\x16?\x03\x05\x16\x0c\x03\x05\x0c\x05\x03" + - "\x05\x0e\x0f\x03\x05\x01\x0e\x03\x05\x00(\x03\x05\x030\x03\x05\x03\x06" + - "\x03\x0a==\x03\x0a=1\x03\x0a=,\x03\x0a=\x0c\x03\x0a??\x03\x0a<\x08\x03" + - "\x0a9!\x03\x0a9)\x03\x0a97\x03\x0a99\x03\x0a6\x0a\x03\x0a6\x1c\x03\x0a6" + - "\x17\x03\x0a7'\x03\x0a78\x03\x0a73\x03\x0a'\x01\x03\x0a'&\x03\x0a\x1f" + - "\x0e\x03\x0a\x1f\x03\x03\x0a\x1f3\x03\x0a\x1b/\x03\x0a\x18\x19\x03\x0a" + - "\x19\x01\x03\x0a\x16\x14\x03\x0a\x0e\x22\x03\x0a\x0f\x10\x03\x0a\x0f\x02" + - "\x03\x0a\x0f \x03\x0a\x0c\x04\x03\x0a\x0b>\x03\x0a\x0b+\x03\x0a\x08/\x03" + - "\x0a\x046\x03\x0a\x05\x14\x03\x0a\x00\x04\x03\x0a\x00\x10\x03\x0a\x00" + - "\x14\x03\x0b<3\x03\x0b;*\x03\x0b9\x22\x03\x0b9)\x03\x0b97\x03\x0b+\x10" + - "\x03\x0b((\x03\x0b&5\x03\x0b$\x1c\x03\x0b$\x12\x03\x0b%\x04\x03\x0b#<" + - "\x03\x0b#0\x03\x0b#\x0d\x03\x0b#\x19\x03\x0b!:\x03\x0b!\x1f\x03\x0b!\x00" + - "\x03\x0b\x1e5\x03\x0b\x1c\x1d\x03\x0b\x1d-\x03\x0b\x1d(\x03\x0b\x18.\x03" + - "\x0b\x18 \x03\x0b\x18\x16\x03\x0b\x14\x13\x03\x0b\x15$\x03\x0b\x15\x22" + - "\x03\x0b\x12\x1b\x03\x0b\x12\x10\x03\x0b\x132\x03\x0b\x13=\x03\x0b\x12" + - "\x18\x03\x0b\x0c&\x03\x0b\x061\x03\x0b\x06:\x03\x0b\x05#\x03\x0b\x05<" + - "\x03\x0b\x04\x0b\x03\x0b\x04\x04\x03\x0b\x04\x1b\x03\x0b\x042\x03\x0b" + - "\x041\x03\x0b\x03\x03\x03\x0b\x03\x1d\x03\x0b\x03/\x03\x0b\x03+\x03\x0b" + - "\x02\x1b\x03\x0b\x02\x00\x03\x0b\x01\x1e\x03\x0b\x01\x08\x03\x0b\x015" + - "\x03\x06\x0d9\x03\x06\x0d=\x03\x06\x0d?\x03\x02\x001\x03\x02\x003\x03" + - "\x02\x02\x19\x03\x02\x006\x03\x02\x02\x1b\x03\x02\x004\x03\x02\x00<\x03" + - "\x02\x02\x0a\x03\x02\x02\x0e\x03\x02\x01\x1a\x03\x02\x01\x07\x03\x02\x01" + - "\x05\x03\x02\x01\x0b\x03\x02\x01%\x03\x02\x01\x0c\x03\x02\x01\x04\x03" + - "\x02\x01\x1c\x03\x02\x00.\x03\x02\x002\x03\x02\x00>\x03\x02\x00\x12\x03" + - "\x02\x00\x16\x03\x02\x011\x03\x02\x013\x03\x02\x02 \x03\x02\x02%\x03\x02" + - "\x02$\x03\x02\x028\x03\x02\x02;\x03\x02\x024\x03\x02\x012\x03\x02\x022" + - "\x03\x02\x02/\x03\x02\x01,\x03\x02\x01\x13\x03\x02\x01\x16\x03\x02\x01" + - "\x11\x03\x02\x01\x1e\x03\x02\x01\x15\x03\x02\x01\x17\x03\x02\x01\x0f\x03" + - "\x02\x01\x08\x03\x02\x00?\x03\x02\x03\x07\x03\x02\x03\x0d\x03\x02\x03" + - "\x13\x03\x02\x03\x1d\x03\x02\x03\x1f\x03\x02\x00\x03\x03\x02\x00\x0d\x03" + - "\x02\x00\x01\x03\x02\x00\x1b\x03\x02\x00\x19\x03\x02\x00\x18\x03\x02\x00" + - "\x13\x03\x02\x00/\x03\x07>\x12\x03\x07<\x1f\x03\x07>\x1d\x03\x06\x1d\x0e" + - "\x03\x07>\x1c\x03\x07>:\x03\x07>\x13\x03\x04\x12+\x03\x07?\x03\x03\x07>" + - "\x02\x03\x06\x224\x03\x06\x1a.\x03\x07<%\x03\x06\x1c\x0b\x03\x0609\x03" + - "\x05\x1f\x01\x03\x04'\x08\x03\x93\xfd\xf5\x03\x02\x0d \x03\x02\x0d#\x03" + - "\x02\x0d!\x03\x02\x0d&\x03\x02\x0d\x22\x03\x02\x0d/\x03\x02\x0d,\x03\x02" + - "\x0d$\x03\x02\x0d'\x03\x02\x0d%\x03\x02\x0d;\x03\x02\x0d=\x03\x02\x0d?" + - "\x03\x099.\x03\x08\x0b7\x03\x08\x02\x14\x03\x08\x14\x0d\x03\x08.:\x03" + - "\x089'\x03\x0f\x0b\x18\x03\x0f\x1c1\x03\x0f\x17&\x03\x0f9\x1f\x03\x0f0" + - "\x0c\x03\x0e\x0a9\x03\x0e\x056\x03\x0e\x1c#\x03\x0f\x13\x0e\x03\x072\x00" + - "\x03\x070\x0d\x03\x072\x0b\x03\x06\x11\x18\x03\x070\x10\x03\x06\x0f(\x03" + - "\x072\x05\x03\x06\x0f,\x03\x073\x15\x03\x06\x07\x08\x03\x05\x16\x02\x03" + - "\x04\x0b \x03\x05:8\x03\x05\x16%\x03\x0a\x0d\x1f\x03\x06\x16\x10\x03\x05" + - "\x1d5\x03\x05*;\x03\x05\x16\x1b\x03\x04.-\x03\x06\x1a\x19\x03\x04\x03," + - "\x03\x0b87\x03\x04/\x0a\x03\x06\x00,\x03\x04-\x01\x03\x04\x1e-\x03\x06/(" + - "\x03\x0a\x0b5\x03\x06\x0e7\x03\x06\x07.\x03\x0597\x03\x0a*%\x03\x0760" + - "\x03\x06\x0c;\x03\x05'\x00\x03\x072.\x03\x072\x08\x03\x06=\x01\x03\x06" + - "\x05\x1b\x03\x06\x06\x12\x03\x06$=\x03\x06'\x0d\x03\x04\x11\x0f\x03\x076" + - ",\x03\x06\x07;\x03\x06.,\x03\x86\xf9\xea\x03\x8f\xff\xeb\x02\x092\x02" + - "\x095\x02\x094\x02\x09;\x02\x09>\x02\x098\x02\x09*\x02\x09/\x02\x09,\x02" + - "\x09%\x02\x09&\x02\x09#\x02\x09 \x02\x08!\x02\x08%\x02\x08$\x02\x08+\x02" + - "\x08.\x02\x08*\x02\x08&\x02\x088\x02\x08>\x02\x084\x02\x086\x02\x080\x02" + - "\x08\x10\x02\x08\x17\x02\x08\x12\x02\x08\x1d\x02\x08\x1f\x02\x08\x13\x02" + - "\x08\x15\x02\x08\x14\x02\x08\x0c\x03\x8b\xfd\xd0\x03\x81\xec\xc6\x03\x87" + - "\xe0\x8a\x03-2\xe3\x03\x80\xef\xe4\x03-2\xea\x03\x88\xe6\xeb\x03\x8e\xe6" + - "\xe8\x03\x84\xe6\xe9\x03\x97\xe6\xee\x03-2\xf9\x03-2\xf6\x03\x8e\xe3\xad" + - "\x03\x80\xe3\x92\x03\x88\xe3\x90\x03\x8e\xe3\x90\x03\x80\xe3\x97\x03\x88" + - "\xe3\x95\x03\x88\xfe\xcb\x03\x8e\xfe\xca\x03\x84\xfe\xcd\x03\x91\xef\xc9" + - "\x03-2\xc1\x03-2\xc0\x03-2\xcb\x03\x88@\x09\x03\x8e@\x08\x03\x8f\xe0\xf5" + - "\x03\x8e\xe6\xf9\x03\x8e\xe0\xfa\x03\x93\xff\xf4\x03\x84\xee\xd3\x03\x0b" + - "(\x04\x023 \x021;\x02\x01*\x03\x0b#\x10\x03\x0b 0\x03\x0b!\x10\x03\x0b!0" + - "\x03\x07\x15\x08\x03\x09?5\x03\x07\x1f\x08\x03\x07\x17\x0b\x03\x09\x1f" + - "\x15\x03\x0b\x1c7\x03\x0a+#\x03\x06\x1a\x1b\x03\x06\x1a\x14\x03\x0a\x01" + - "\x18\x03\x06#\x1b\x03\x0a2\x0c\x03\x0a\x01\x04\x03\x09#;\x03\x08='\x03" + - "\x08\x1a\x0a\x03\x07\x03\x0a\x111\x03\x09\x1b\x09\x03\x073.\x03\x07\x01\x00" + - "\x03\x09/,\x03\x07#>\x03\x07\x048\x03\x0a\x1f\x22\x03\x098>\x03\x09\x11" + - "\x00\x03\x08/\x17\x03\x06'\x22\x03\x0b\x1a+\x03\x0a\x22\x19\x03\x0a/1" + - "\x03\x0974\x03\x09\x0f\x22\x03\x08,\x22\x03\x08?\x14\x03\x07$5\x03\x07<3" + - "\x03\x07=*\x03\x07\x13\x18\x03\x068\x0a\x03\x06\x09\x16\x03\x06\x13\x00" + - "\x03\x08\x067\x03\x08\x01\x03\x03\x08\x12\x1d\x03\x07+7\x03\x06(;\x03" + - "\x06\x1c?\x03\x07\x0e\x17\x03\x0a\x06\x1d\x03\x0a\x19\x07\x03\x08\x14$" + - "\x03\x07$;\x03\x08,$\x03\x08\x06\x0d\x03\x07\x16\x0a\x03\x06>>\x03\x0a" + - "\x06\x12\x03\x0a\x14)\x03\x09\x0d\x1f\x03\x09\x12\x17\x03\x09\x19\x01" + - "\x03\x08\x11 \x03\x08\x1d'\x03\x06<\x1a\x03\x0a.\x00\x03\x07'\x18\x03" + - "\x0a\x22\x08\x03\x08\x0d\x0a\x03\x08\x13)\x03\x07*)\x03\x06<,\x03\x07" + - "\x0b\x1a\x03\x09.\x14\x03\x09\x0d\x1e\x03\x07\x0e#\x03\x0b\x1d'\x03\x0a" + - "\x0a8\x03\x09%2\x03\x08+&\x03\x080\x12\x03\x0a)4\x03\x08\x06\x1f\x03\x0b" + - "\x1b\x1a\x03\x0a\x1b\x0f\x03\x0b\x1d*\x03\x09\x16$\x03\x090\x11\x03\x08" + - "\x11\x08\x03\x0a*(\x03\x0a\x042\x03\x089,\x03\x074'\x03\x07\x0f\x05\x03" + - "\x09\x0b\x0a\x03\x07\x1b\x01\x03\x09\x17:\x03\x09.\x0d\x03\x07.\x11\x03" + - "\x09+\x15\x03\x080\x13\x03\x0b\x1f\x19\x03\x0a \x11\x03\x0a\x220\x03\x09" + - "\x07;\x03\x08\x16\x1c\x03\x07,\x13\x03\x07\x0e/\x03\x06\x221\x03\x0a." + - "\x0a\x03\x0a7\x02\x03\x0a\x032\x03\x0a\x1d.\x03\x091\x06\x03\x09\x19:" + - "\x03\x08\x02/\x03\x060+\x03\x06\x0f-\x03\x06\x1c\x1f\x03\x06\x1d\x07\x03" + - "\x0a,\x11\x03\x09=\x0d\x03\x09\x0b;\x03\x07\x1b/\x03\x0a\x1f:\x03\x09 " + - "\x1f\x03\x09.\x10\x03\x094\x0b\x03\x09\x1a1\x03\x08#\x1a\x03\x084\x1d" + - "\x03\x08\x01\x1f\x03\x08\x11\x22\x03\x07'8\x03\x07\x1a>\x03\x0757\x03" + - "\x06&9\x03\x06+\x11\x03\x0a.\x0b\x03\x0a,>\x03\x0a4#\x03\x08%\x17\x03" + - "\x07\x05\x22\x03\x07\x0c\x0b\x03\x0a\x1d+\x03\x0a\x19\x16\x03\x09+\x1f" + - "\x03\x09\x08\x0b\x03\x08\x16\x18\x03\x08+\x12\x03\x0b\x1d\x0c\x03\x0a=" + - "\x10\x03\x0a\x09\x0d\x03\x0a\x10\x11\x03\x09&0\x03\x08(\x1f\x03\x087\x07" + - "\x03\x08\x185\x03\x07'6\x03\x06.\x05\x03\x06=\x04\x03\x06;;\x03\x06\x06," + - "\x03\x0b\x18>\x03\x08\x00\x18\x03\x06 \x03\x03\x06<\x00\x03\x09%\x18\x03" + - "\x0b\x1c<\x03\x0a%!\x03\x0a\x09\x12\x03\x0a\x16\x02\x03\x090'\x03\x09" + - "\x0e=\x03\x08 \x0e\x03\x08>\x03\x03\x074>\x03\x06&?\x03\x06\x19\x09\x03" + - "\x06?(\x03\x0a-\x0e\x03\x09:3\x03\x098:\x03\x09\x12\x0b\x03\x09\x1d\x17" + - "\x03\x087\x05\x03\x082\x14\x03\x08\x06%\x03\x08\x13\x1f\x03\x06\x06\x0e" + - "\x03\x0a\x22<\x03\x09/<\x03\x06>+\x03\x0a'?\x03\x0a\x13\x0c\x03\x09\x10<" + - "\x03\x07\x1b=\x03\x0a\x19\x13\x03\x09\x22\x1d\x03\x09\x07\x0d\x03\x08)" + - "\x1c\x03\x06=\x1a\x03\x0a/4\x03\x0a7\x11\x03\x0a\x16:\x03\x09?3\x03\x09:" + - "/\x03\x09\x05\x0a\x03\x09\x14\x06\x03\x087\x22\x03\x080\x07\x03\x08\x1a" + - "\x1f\x03\x07\x04(\x03\x07\x04\x09\x03\x06 %\x03\x06<\x08\x03\x0a+\x14" + - "\x03\x09\x1d\x16\x03\x0a70\x03\x08 >\x03\x0857\x03\x070\x0a\x03\x06=\x12" + - "\x03\x06\x16%\x03\x06\x1d,\x03\x099#\x03\x09\x10>\x03\x07 \x1e\x03\x08" + - "\x0c<\x03\x08\x0b\x18\x03\x08\x15+\x03\x08,:\x03\x08%\x22\x03\x07\x0a$" + - "\x03\x0b\x1c=\x03\x07+\x08\x03\x0a/\x05\x03\x0a \x07\x03\x0a\x12'\x03" + - "\x09#\x11\x03\x08\x1b\x15\x03\x0a\x06\x01\x03\x09\x1c\x1b\x03\x0922\x03" + - "\x07\x14<\x03\x07\x09\x04\x03\x061\x04\x03\x07\x0e\x01\x03\x0a\x13\x18" + - "\x03\x0a-\x0c\x03\x0a?\x0d\x03\x0a\x09\x0a\x03\x091&\x03\x0a/\x0b\x03" + - "\x08$<\x03\x083\x1d\x03\x08\x0c$\x03\x08\x0d\x07\x03\x08\x0d?\x03\x08" + - "\x0e\x14\x03\x065\x0a\x03\x08\x1a#\x03\x08\x16#\x03\x0702\x03\x07\x03" + - "\x1a\x03\x06(\x1d\x03\x06+\x1b\x03\x06\x0b\x05\x03\x06\x0b\x17\x03\x06" + - "\x0c\x04\x03\x06\x1e\x19\x03\x06+0\x03\x062\x18\x03\x0b\x16\x1e\x03\x0a+" + - "\x16\x03\x0a-?\x03\x0a#:\x03\x0a#\x10\x03\x0a%$\x03\x0a>+\x03\x0a01\x03" + - "\x0a1\x10\x03\x0a\x099\x03\x0a\x0a\x12\x03\x0a\x19\x1f\x03\x0a\x19\x12" + - "\x03\x09*)\x03\x09-\x16\x03\x09.1\x03\x09.2\x03\x09<\x0e\x03\x09> \x03" + - "\x093\x12\x03\x09\x0b\x01\x03\x09\x1c2\x03\x09\x11\x1c\x03\x09\x15%\x03" + - "\x08,&\x03\x08!\x22\x03\x089(\x03\x08\x0b\x1a\x03\x08\x0d2\x03\x08\x0c" + - "\x04\x03\x08\x0c\x06\x03\x08\x0c\x1f\x03\x08\x0c\x0c\x03\x08\x0f\x1f\x03" + - "\x08\x0f\x1d\x03\x08\x00\x14\x03\x08\x03\x14\x03\x08\x06\x16\x03\x08\x1e" + - "#\x03\x08\x11\x11\x03\x08\x10\x18\x03\x08\x14(\x03\x07)\x1e\x03\x07.1" + - "\x03\x07 $\x03\x07 '\x03\x078\x08\x03\x07\x0d0\x03\x07\x0f7\x03\x07\x05#" + - "\x03\x07\x05\x1a\x03\x07\x1a7\x03\x07\x1d-\x03\x07\x17\x10\x03\x06)\x1f" + - "\x03\x062\x0b\x03\x066\x16\x03\x06\x09\x11\x03\x09(\x1e\x03\x07!5\x03" + - "\x0b\x11\x16\x03\x0a/\x04\x03\x0a,\x1a\x03\x0b\x173\x03\x0a,1\x03\x0a/5" + - "\x03\x0a\x221\x03\x0a\x22\x0d\x03\x0a?%\x03\x0a<,\x03\x0a?#\x03\x0a>\x19" + - "\x03\x0a\x08&\x03\x0a\x0b\x0e\x03\x0a\x0c:\x03\x0a\x0c+\x03\x0a\x03\x22" + - "\x03\x0a\x06)\x03\x0a\x11\x10\x03\x0a\x11\x1a\x03\x0a\x17-\x03\x0a\x14(" + - "\x03\x09)\x1e\x03\x09/\x09\x03\x09.\x00\x03\x09,\x07\x03\x09/*\x03\x09-9" + - "\x03\x09\x228\x03\x09%\x09\x03\x09:\x12\x03\x09;\x1d\x03\x09?\x06\x03" + - "\x093%\x03\x096\x05\x03\x096\x08\x03\x097\x02\x03\x09\x07,\x03\x09\x04," + - "\x03\x09\x1f\x16\x03\x09\x11\x03\x03\x09\x11\x12\x03\x09\x168\x03\x08*" + - "\x05\x03\x08/2\x03\x084:\x03\x08\x22+\x03\x08 0\x03\x08&\x0a\x03\x08;" + - "\x10\x03\x08>$\x03\x08>\x18\x03\x0829\x03\x082:\x03\x081,\x03\x081<\x03" + - "\x081\x1c\x03\x087#\x03\x087*\x03\x08\x09'\x03\x08\x00\x1d\x03\x08\x05-" + - "\x03\x08\x1f4\x03\x08\x1d\x04\x03\x08\x16\x0f\x03\x07*7\x03\x07'!\x03" + - "\x07%\x1b\x03\x077\x0c\x03\x07\x0c1\x03\x07\x0c.\x03\x07\x00\x06\x03\x07" + - "\x01\x02\x03\x07\x010\x03\x07\x06=\x03\x07\x01\x03\x03\x07\x01\x13\x03" + - "\x07\x06\x06\x03\x07\x05\x0a\x03\x07\x1f\x09\x03\x07\x17:\x03\x06*1\x03" + - "\x06-\x1d\x03\x06\x223\x03\x062:\x03\x060$\x03\x066\x1e\x03\x064\x12\x03" + - "\x0645\x03\x06\x0b\x00\x03\x06\x0b7\x03\x06\x07\x1f\x03\x06\x15\x12\x03" + - "\x0c\x05\x0f\x03\x0b+\x0b\x03\x0b+-\x03\x06\x16\x1b\x03\x06\x15\x17\x03" + - "\x89\xca\xea\x03\x89\xca\xe8\x03\x0c8\x10\x03\x0c8\x01\x03\x0c8\x0f\x03" + - "\x0d8%\x03\x0d8!\x03\x0c8-\x03\x0c8/\x03\x0c8+\x03\x0c87\x03\x0c85\x03" + - "\x0c9\x09\x03\x0c9\x0d\x03\x0c9\x0f\x03\x0c9\x0b\x03\xcfu\x0c\x03\xcfu" + - "\x0f\x03\xcfu\x0e\x03\xcfu\x09\x03\x0c9\x10\x03\x0d9\x0c\x03\xcf`;\x03" + - "\xcf`>\x03\xcf`9\x03\xcf`8\x03\xcf`7\x03\xcf`*\x03\xcf`-\x03\xcf`,\x03" + - "\x0d\x1b\x1a\x03\x0d\x1b&\x03\x0c=.\x03\x0c=%\x03\x0c>\x1e\x03\x0c>\x14" + - "\x03\x0c?\x06\x03\x0c?\x0b\x03\x0c?\x0c\x03\x0c?\x0d\x03\x0c?\x02\x03" + - "\x0c>\x0f\x03\x0c>\x08\x03\x0c>\x09\x03\x0c>,\x03\x0c>\x0c\x03\x0c?\x13" + - "\x03\x0c?\x16\x03\x0c?\x15\x03\x0c?\x1c\x03\x0c?\x1f\x03\x0c?\x1d\x03" + - "\x0c?\x1a\x03\x0c?\x17\x03\x0c?\x08\x03\x0c?\x09\x03\x0c?\x0e\x03\x0c?" + - "\x04\x03\x0c?\x05\x03\x0c" + - "\x03\x0c=2\x03\x0c=6\x03\x0c<\x07\x03\x0c<\x05\x03\x0e:!\x03\x0e:#\x03" + - "\x0e8\x09\x03\x0e:&\x03\x0e8\x0b\x03\x0e:$\x03\x0e:,\x03\x0e8\x1a\x03" + - "\x0e8\x1e\x03\x0e:*\x03\x0e:7\x03\x0e:5\x03\x0e:;\x03\x0e:\x15\x03\x0e:<" + - "\x03\x0e:4\x03\x0e:'\x03\x0e:-\x03\x0e:%\x03\x0e:?\x03\x0e:=\x03\x0e:)" + - "\x03\x0e:/\x03\xcfs'\x03\x0d=\x0f\x03\x0d+*\x03\x0d99\x03\x0d9;\x03\x0d9" + - "?\x03\x0d)\x0d\x03\x0d(%\x02\x01\x18\x02\x01(\x02\x01\x1e\x03\x0f$!\x03" + - "\x0f87\x03\x0f4\x0e\x03\x0f5\x1d\x03\x06'\x03\x03\x0f\x08\x18\x03\x0f" + - "\x0d\x1b\x03\x0e2=\x03\x0e;\x08\x03\x0e:\x0b\x03\x0e\x06$\x03\x0e\x0d)" + - "\x03\x0e\x16\x1f\x03\x0e\x16\x1b\x03\x0d$\x0a\x03\x05,\x1d\x03\x0d. \x03" + - "\x0d.#\x03\x0c(/\x03\x09%\x02\x03\x0d90\x03\x0d\x0e4\x03\x0d\x0d\x0f\x03" + - "\x0c#\x00\x03\x0c,\x1e\x03\x0c2\x0e\x03\x0c\x01\x17\x03\x0c\x09:\x03\x0e" + - "\x173\x03\x0c\x08\x03\x03\x0c\x11\x07\x03\x0c\x10\x18\x03\x0c\x1f\x1c" + - "\x03\x0c\x19\x0e\x03\x0c\x1a\x1f\x03\x0f0>\x03\x0b->\x03\x0b<+\x03\x0b8" + - "\x13\x03\x0b\x043\x03\x0b\x14\x03\x03\x0b\x16%\x03\x0d\x22&\x03\x0b\x1a" + - "\x1a\x03\x0b\x1a\x04\x03\x0a%9\x03\x0a&2\x03\x0a&0\x03\x0a!\x1a\x03\x0a!" + - "7\x03\x0a5\x10\x03\x0a=4\x03\x0a?\x0e\x03\x0a>\x10\x03\x0a\x00 \x03\x0a" + - "\x0f:\x03\x0a\x0f9\x03\x0a\x0b\x0a\x03\x0a\x17%\x03\x0a\x1b-\x03\x09-" + - "\x1a\x03\x09,4\x03\x09.,\x03\x09)\x09\x03\x096!\x03\x091\x1f\x03\x093" + - "\x16\x03\x0c+\x1f\x03\x098 \x03\x098=\x03\x0c(\x1a\x03\x0c(\x16\x03\x09" + - "\x0a+\x03\x09\x16\x12\x03\x09\x13\x0e\x03\x09\x153\x03\x08)!\x03\x09\x1a" + - "\x01\x03\x09\x18\x01\x03\x08%#\x03\x08>\x22\x03\x08\x05%\x03\x08\x02*" + - "\x03\x08\x15;\x03\x08\x1b7\x03\x0f\x07\x1d\x03\x0f\x04\x03\x03\x070\x0c" + - "\x03\x07;\x0b\x03\x07\x08\x17\x03\x07\x12\x06\x03\x06/-\x03\x0671\x03" + - "\x065+\x03\x06>7\x03\x06\x049\x03\x05+\x1e\x03\x05,\x17\x03\x05 \x1d\x03" + - "\x05\x22\x05\x03\x050\x1d" - -// lookup returns the trie value for the first UTF-8 encoding in s and -// the width in bytes of this encoding. The size will be 0 if s does not -// hold enough bytes to complete the encoding. len(s) must be greater than 0. -func (t *idnaTrie) lookup(s []byte) (v uint16, sz int) { - c0 := s[0] - switch { - case c0 < 0x80: // is ASCII - return idnaValues[c0], 1 - case c0 < 0xC2: - return 0, 1 // Illegal UTF-8: not a starter, not ASCII. - case c0 < 0xE0: // 2-byte UTF-8 - if len(s) < 2 { - return 0, 0 - } - i := idnaIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c1), 2 - case c0 < 0xF0: // 3-byte UTF-8 - if len(s) < 3 { - return 0, 0 - } - i := idnaIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - o := uint32(i)<<6 + uint32(c1) - i = idnaIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return 0, 2 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c2), 3 - case c0 < 0xF8: // 4-byte UTF-8 - if len(s) < 4 { - return 0, 0 - } - i := idnaIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - o := uint32(i)<<6 + uint32(c1) - i = idnaIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return 0, 2 // Illegal UTF-8: not a continuation byte. - } - o = uint32(i)<<6 + uint32(c2) - i = idnaIndex[o] - c3 := s[3] - if c3 < 0x80 || 0xC0 <= c3 { - return 0, 3 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c3), 4 - } - // Illegal rune - return 0, 1 -} - -// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. -// s must start with a full and valid UTF-8 encoded rune. -func (t *idnaTrie) lookupUnsafe(s []byte) uint16 { - c0 := s[0] - if c0 < 0x80 { // is ASCII - return idnaValues[c0] - } - i := idnaIndex[c0] - if c0 < 0xE0 { // 2-byte UTF-8 - return t.lookupValue(uint32(i), s[1]) - } - i = idnaIndex[uint32(i)<<6+uint32(s[1])] - if c0 < 0xF0 { // 3-byte UTF-8 - return t.lookupValue(uint32(i), s[2]) - } - i = idnaIndex[uint32(i)<<6+uint32(s[2])] - if c0 < 0xF8 { // 4-byte UTF-8 - return t.lookupValue(uint32(i), s[3]) - } - return 0 -} - -// lookupString returns the trie value for the first UTF-8 encoding in s and -// the width in bytes of this encoding. The size will be 0 if s does not -// hold enough bytes to complete the encoding. len(s) must be greater than 0. -func (t *idnaTrie) lookupString(s string) (v uint16, sz int) { - c0 := s[0] - switch { - case c0 < 0x80: // is ASCII - return idnaValues[c0], 1 - case c0 < 0xC2: - return 0, 1 // Illegal UTF-8: not a starter, not ASCII. - case c0 < 0xE0: // 2-byte UTF-8 - if len(s) < 2 { - return 0, 0 - } - i := idnaIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c1), 2 - case c0 < 0xF0: // 3-byte UTF-8 - if len(s) < 3 { - return 0, 0 - } - i := idnaIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - o := uint32(i)<<6 + uint32(c1) - i = idnaIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return 0, 2 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c2), 3 - case c0 < 0xF8: // 4-byte UTF-8 - if len(s) < 4 { - return 0, 0 - } - i := idnaIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - o := uint32(i)<<6 + uint32(c1) - i = idnaIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return 0, 2 // Illegal UTF-8: not a continuation byte. - } - o = uint32(i)<<6 + uint32(c2) - i = idnaIndex[o] - c3 := s[3] - if c3 < 0x80 || 0xC0 <= c3 { - return 0, 3 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c3), 4 - } - // Illegal rune - return 0, 1 -} - -// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. -// s must start with a full and valid UTF-8 encoded rune. -func (t *idnaTrie) lookupStringUnsafe(s string) uint16 { - c0 := s[0] - if c0 < 0x80 { // is ASCII - return idnaValues[c0] - } - i := idnaIndex[c0] - if c0 < 0xE0 { // 2-byte UTF-8 - return t.lookupValue(uint32(i), s[1]) - } - i = idnaIndex[uint32(i)<<6+uint32(s[1])] - if c0 < 0xF0 { // 3-byte UTF-8 - return t.lookupValue(uint32(i), s[2]) - } - i = idnaIndex[uint32(i)<<6+uint32(s[2])] - if c0 < 0xF8 { // 4-byte UTF-8 - return t.lookupValue(uint32(i), s[3]) - } - return 0 -} - -// idnaTrie. Total size: 28496 bytes (27.83 KiB). Checksum: 43288b883596640e. -type idnaTrie struct{} - -func newIdnaTrie(i int) *idnaTrie { - return &idnaTrie{} -} - -// lookupValue determines the type of block n and looks up the value for b. -func (t *idnaTrie) lookupValue(n uint32, b byte) uint16 { - switch { - case n < 123: - return uint16(idnaValues[n<<6+uint32(b)]) - default: - n -= 123 - return uint16(idnaSparse.lookup(n, b)) - } -} - -// idnaValues: 125 blocks, 8000 entries, 16000 bytes -// The third block is the zero block. -var idnaValues = [8000]uint16{ - // Block 0x0, offset 0x0 - 0x00: 0x0080, 0x01: 0x0080, 0x02: 0x0080, 0x03: 0x0080, 0x04: 0x0080, 0x05: 0x0080, - 0x06: 0x0080, 0x07: 0x0080, 0x08: 0x0080, 0x09: 0x0080, 0x0a: 0x0080, 0x0b: 0x0080, - 0x0c: 0x0080, 0x0d: 0x0080, 0x0e: 0x0080, 0x0f: 0x0080, 0x10: 0x0080, 0x11: 0x0080, - 0x12: 0x0080, 0x13: 0x0080, 0x14: 0x0080, 0x15: 0x0080, 0x16: 0x0080, 0x17: 0x0080, - 0x18: 0x0080, 0x19: 0x0080, 0x1a: 0x0080, 0x1b: 0x0080, 0x1c: 0x0080, 0x1d: 0x0080, - 0x1e: 0x0080, 0x1f: 0x0080, 0x20: 0x0080, 0x21: 0x0080, 0x22: 0x0080, 0x23: 0x0080, - 0x24: 0x0080, 0x25: 0x0080, 0x26: 0x0080, 0x27: 0x0080, 0x28: 0x0080, 0x29: 0x0080, - 0x2a: 0x0080, 0x2b: 0x0080, 0x2c: 0x0080, 0x2d: 0x0008, 0x2e: 0x0008, 0x2f: 0x0080, - 0x30: 0x0008, 0x31: 0x0008, 0x32: 0x0008, 0x33: 0x0008, 0x34: 0x0008, 0x35: 0x0008, - 0x36: 0x0008, 0x37: 0x0008, 0x38: 0x0008, 0x39: 0x0008, 0x3a: 0x0080, 0x3b: 0x0080, - 0x3c: 0x0080, 0x3d: 0x0080, 0x3e: 0x0080, 0x3f: 0x0080, - // Block 0x1, offset 0x40 - 0x40: 0x0080, 0x41: 0xe105, 0x42: 0xe105, 0x43: 0xe105, 0x44: 0xe105, 0x45: 0xe105, - 0x46: 0xe105, 0x47: 0xe105, 0x48: 0xe105, 0x49: 0xe105, 0x4a: 0xe105, 0x4b: 0xe105, - 0x4c: 0xe105, 0x4d: 0xe105, 0x4e: 0xe105, 0x4f: 0xe105, 0x50: 0xe105, 0x51: 0xe105, - 0x52: 0xe105, 0x53: 0xe105, 0x54: 0xe105, 0x55: 0xe105, 0x56: 0xe105, 0x57: 0xe105, - 0x58: 0xe105, 0x59: 0xe105, 0x5a: 0xe105, 0x5b: 0x0080, 0x5c: 0x0080, 0x5d: 0x0080, - 0x5e: 0x0080, 0x5f: 0x0080, 0x60: 0x0080, 0x61: 0x0008, 0x62: 0x0008, 0x63: 0x0008, - 0x64: 0x0008, 0x65: 0x0008, 0x66: 0x0008, 0x67: 0x0008, 0x68: 0x0008, 0x69: 0x0008, - 0x6a: 0x0008, 0x6b: 0x0008, 0x6c: 0x0008, 0x6d: 0x0008, 0x6e: 0x0008, 0x6f: 0x0008, - 0x70: 0x0008, 0x71: 0x0008, 0x72: 0x0008, 0x73: 0x0008, 0x74: 0x0008, 0x75: 0x0008, - 0x76: 0x0008, 0x77: 0x0008, 0x78: 0x0008, 0x79: 0x0008, 0x7a: 0x0008, 0x7b: 0x0080, - 0x7c: 0x0080, 0x7d: 0x0080, 0x7e: 0x0080, 0x7f: 0x0080, - // Block 0x2, offset 0x80 - // Block 0x3, offset 0xc0 - 0xc0: 0x0040, 0xc1: 0x0040, 0xc2: 0x0040, 0xc3: 0x0040, 0xc4: 0x0040, 0xc5: 0x0040, - 0xc6: 0x0040, 0xc7: 0x0040, 0xc8: 0x0040, 0xc9: 0x0040, 0xca: 0x0040, 0xcb: 0x0040, - 0xcc: 0x0040, 0xcd: 0x0040, 0xce: 0x0040, 0xcf: 0x0040, 0xd0: 0x0040, 0xd1: 0x0040, - 0xd2: 0x0040, 0xd3: 0x0040, 0xd4: 0x0040, 0xd5: 0x0040, 0xd6: 0x0040, 0xd7: 0x0040, - 0xd8: 0x0040, 0xd9: 0x0040, 0xda: 0x0040, 0xdb: 0x0040, 0xdc: 0x0040, 0xdd: 0x0040, - 0xde: 0x0040, 0xdf: 0x0040, 0xe0: 0x000a, 0xe1: 0x0018, 0xe2: 0x0018, 0xe3: 0x0018, - 0xe4: 0x0018, 0xe5: 0x0018, 0xe6: 0x0018, 0xe7: 0x0018, 0xe8: 0x001a, 0xe9: 0x0018, - 0xea: 0x0039, 0xeb: 0x0018, 0xec: 0x0018, 0xed: 0x03c0, 0xee: 0x0018, 0xef: 0x004a, - 0xf0: 0x0018, 0xf1: 0x0018, 0xf2: 0x0069, 0xf3: 0x0079, 0xf4: 0x008a, 0xf5: 0x0005, - 0xf6: 0x0018, 0xf7: 0x0008, 0xf8: 0x00aa, 0xf9: 0x00c9, 0xfa: 0x00d9, 0xfb: 0x0018, - 0xfc: 0x00e9, 0xfd: 0x0119, 0xfe: 0x0149, 0xff: 0x0018, - // Block 0x4, offset 0x100 - 0x100: 0xe00d, 0x101: 0x0008, 0x102: 0xe00d, 0x103: 0x0008, 0x104: 0xe00d, 0x105: 0x0008, - 0x106: 0xe00d, 0x107: 0x0008, 0x108: 0xe00d, 0x109: 0x0008, 0x10a: 0xe00d, 0x10b: 0x0008, - 0x10c: 0xe00d, 0x10d: 0x0008, 0x10e: 0xe00d, 0x10f: 0x0008, 0x110: 0xe00d, 0x111: 0x0008, - 0x112: 0xe00d, 0x113: 0x0008, 0x114: 0xe00d, 0x115: 0x0008, 0x116: 0xe00d, 0x117: 0x0008, - 0x118: 0xe00d, 0x119: 0x0008, 0x11a: 0xe00d, 0x11b: 0x0008, 0x11c: 0xe00d, 0x11d: 0x0008, - 0x11e: 0xe00d, 0x11f: 0x0008, 0x120: 0xe00d, 0x121: 0x0008, 0x122: 0xe00d, 0x123: 0x0008, - 0x124: 0xe00d, 0x125: 0x0008, 0x126: 0xe00d, 0x127: 0x0008, 0x128: 0xe00d, 0x129: 0x0008, - 0x12a: 0xe00d, 0x12b: 0x0008, 0x12c: 0xe00d, 0x12d: 0x0008, 0x12e: 0xe00d, 0x12f: 0x0008, - 0x130: 0x0179, 0x131: 0x0008, 0x132: 0x0035, 0x133: 0x004d, 0x134: 0xe00d, 0x135: 0x0008, - 0x136: 0xe00d, 0x137: 0x0008, 0x138: 0x0008, 0x139: 0xe01d, 0x13a: 0x0008, 0x13b: 0xe03d, - 0x13c: 0x0008, 0x13d: 0xe01d, 0x13e: 0x0008, 0x13f: 0x0199, - // Block 0x5, offset 0x140 - 0x140: 0x0199, 0x141: 0xe01d, 0x142: 0x0008, 0x143: 0xe03d, 0x144: 0x0008, 0x145: 0xe01d, - 0x146: 0x0008, 0x147: 0xe07d, 0x148: 0x0008, 0x149: 0x01b9, 0x14a: 0xe00d, 0x14b: 0x0008, - 0x14c: 0xe00d, 0x14d: 0x0008, 0x14e: 0xe00d, 0x14f: 0x0008, 0x150: 0xe00d, 0x151: 0x0008, - 0x152: 0xe00d, 0x153: 0x0008, 0x154: 0xe00d, 0x155: 0x0008, 0x156: 0xe00d, 0x157: 0x0008, - 0x158: 0xe00d, 0x159: 0x0008, 0x15a: 0xe00d, 0x15b: 0x0008, 0x15c: 0xe00d, 0x15d: 0x0008, - 0x15e: 0xe00d, 0x15f: 0x0008, 0x160: 0xe00d, 0x161: 0x0008, 0x162: 0xe00d, 0x163: 0x0008, - 0x164: 0xe00d, 0x165: 0x0008, 0x166: 0xe00d, 0x167: 0x0008, 0x168: 0xe00d, 0x169: 0x0008, - 0x16a: 0xe00d, 0x16b: 0x0008, 0x16c: 0xe00d, 0x16d: 0x0008, 0x16e: 0xe00d, 0x16f: 0x0008, - 0x170: 0xe00d, 0x171: 0x0008, 0x172: 0xe00d, 0x173: 0x0008, 0x174: 0xe00d, 0x175: 0x0008, - 0x176: 0xe00d, 0x177: 0x0008, 0x178: 0x0065, 0x179: 0xe01d, 0x17a: 0x0008, 0x17b: 0xe03d, - 0x17c: 0x0008, 0x17d: 0xe01d, 0x17e: 0x0008, 0x17f: 0x01d9, - // Block 0x6, offset 0x180 - 0x180: 0x0008, 0x181: 0x007d, 0x182: 0xe00d, 0x183: 0x0008, 0x184: 0xe00d, 0x185: 0x0008, - 0x186: 0x007d, 0x187: 0xe07d, 0x188: 0x0008, 0x189: 0x0095, 0x18a: 0x00ad, 0x18b: 0xe03d, - 0x18c: 0x0008, 0x18d: 0x0008, 0x18e: 0x00c5, 0x18f: 0x00dd, 0x190: 0x00f5, 0x191: 0xe01d, - 0x192: 0x0008, 0x193: 0x010d, 0x194: 0x0125, 0x195: 0x0008, 0x196: 0x013d, 0x197: 0x013d, - 0x198: 0xe00d, 0x199: 0x0008, 0x19a: 0x0008, 0x19b: 0x0008, 0x19c: 0x010d, 0x19d: 0x0155, - 0x19e: 0x0008, 0x19f: 0x016d, 0x1a0: 0xe00d, 0x1a1: 0x0008, 0x1a2: 0xe00d, 0x1a3: 0x0008, - 0x1a4: 0xe00d, 0x1a5: 0x0008, 0x1a6: 0x0185, 0x1a7: 0xe07d, 0x1a8: 0x0008, 0x1a9: 0x019d, - 0x1aa: 0x0008, 0x1ab: 0x0008, 0x1ac: 0xe00d, 0x1ad: 0x0008, 0x1ae: 0x0185, 0x1af: 0xe0fd, - 0x1b0: 0x0008, 0x1b1: 0x01b5, 0x1b2: 0x01cd, 0x1b3: 0xe03d, 0x1b4: 0x0008, 0x1b5: 0xe01d, - 0x1b6: 0x0008, 0x1b7: 0x01e5, 0x1b8: 0xe00d, 0x1b9: 0x0008, 0x1ba: 0x0008, 0x1bb: 0x0008, - 0x1bc: 0xe00d, 0x1bd: 0x0008, 0x1be: 0x0008, 0x1bf: 0x0008, - // Block 0x7, offset 0x1c0 - 0x1c0: 0x0008, 0x1c1: 0x0008, 0x1c2: 0x0008, 0x1c3: 0x0008, 0x1c4: 0x01e9, 0x1c5: 0x01e9, - 0x1c6: 0x01e9, 0x1c7: 0x01fd, 0x1c8: 0x0215, 0x1c9: 0x022d, 0x1ca: 0x0245, 0x1cb: 0x025d, - 0x1cc: 0x0275, 0x1cd: 0xe01d, 0x1ce: 0x0008, 0x1cf: 0xe0fd, 0x1d0: 0x0008, 0x1d1: 0xe01d, - 0x1d2: 0x0008, 0x1d3: 0xe03d, 0x1d4: 0x0008, 0x1d5: 0xe01d, 0x1d6: 0x0008, 0x1d7: 0xe07d, - 0x1d8: 0x0008, 0x1d9: 0xe01d, 0x1da: 0x0008, 0x1db: 0xe03d, 0x1dc: 0x0008, 0x1dd: 0x0008, - 0x1de: 0xe00d, 0x1df: 0x0008, 0x1e0: 0xe00d, 0x1e1: 0x0008, 0x1e2: 0xe00d, 0x1e3: 0x0008, - 0x1e4: 0xe00d, 0x1e5: 0x0008, 0x1e6: 0xe00d, 0x1e7: 0x0008, 0x1e8: 0xe00d, 0x1e9: 0x0008, - 0x1ea: 0xe00d, 0x1eb: 0x0008, 0x1ec: 0xe00d, 0x1ed: 0x0008, 0x1ee: 0xe00d, 0x1ef: 0x0008, - 0x1f0: 0x0008, 0x1f1: 0x028d, 0x1f2: 0x02a5, 0x1f3: 0x02bd, 0x1f4: 0xe00d, 0x1f5: 0x0008, - 0x1f6: 0x02d5, 0x1f7: 0x02ed, 0x1f8: 0xe00d, 0x1f9: 0x0008, 0x1fa: 0xe00d, 0x1fb: 0x0008, - 0x1fc: 0xe00d, 0x1fd: 0x0008, 0x1fe: 0xe00d, 0x1ff: 0x0008, - // Block 0x8, offset 0x200 - 0x200: 0xe00d, 0x201: 0x0008, 0x202: 0xe00d, 0x203: 0x0008, 0x204: 0xe00d, 0x205: 0x0008, - 0x206: 0xe00d, 0x207: 0x0008, 0x208: 0xe00d, 0x209: 0x0008, 0x20a: 0xe00d, 0x20b: 0x0008, - 0x20c: 0xe00d, 0x20d: 0x0008, 0x20e: 0xe00d, 0x20f: 0x0008, 0x210: 0xe00d, 0x211: 0x0008, - 0x212: 0xe00d, 0x213: 0x0008, 0x214: 0xe00d, 0x215: 0x0008, 0x216: 0xe00d, 0x217: 0x0008, - 0x218: 0xe00d, 0x219: 0x0008, 0x21a: 0xe00d, 0x21b: 0x0008, 0x21c: 0xe00d, 0x21d: 0x0008, - 0x21e: 0xe00d, 0x21f: 0x0008, 0x220: 0x0305, 0x221: 0x0008, 0x222: 0xe00d, 0x223: 0x0008, - 0x224: 0xe00d, 0x225: 0x0008, 0x226: 0xe00d, 0x227: 0x0008, 0x228: 0xe00d, 0x229: 0x0008, - 0x22a: 0xe00d, 0x22b: 0x0008, 0x22c: 0xe00d, 0x22d: 0x0008, 0x22e: 0xe00d, 0x22f: 0x0008, - 0x230: 0xe00d, 0x231: 0x0008, 0x232: 0xe00d, 0x233: 0x0008, 0x234: 0x0008, 0x235: 0x0008, - 0x236: 0x0008, 0x237: 0x0008, 0x238: 0x0008, 0x239: 0x0008, 0x23a: 0x0209, 0x23b: 0xe03d, - 0x23c: 0x0008, 0x23d: 0x031d, 0x23e: 0x0229, 0x23f: 0x0008, - // Block 0x9, offset 0x240 - 0x240: 0x0008, 0x241: 0x0008, 0x242: 0x0018, 0x243: 0x0018, 0x244: 0x0018, 0x245: 0x0018, - 0x246: 0x0008, 0x247: 0x0008, 0x248: 0x0008, 0x249: 0x0008, 0x24a: 0x0008, 0x24b: 0x0008, - 0x24c: 0x0008, 0x24d: 0x0008, 0x24e: 0x0008, 0x24f: 0x0008, 0x250: 0x0008, 0x251: 0x0008, - 0x252: 0x0018, 0x253: 0x0018, 0x254: 0x0018, 0x255: 0x0018, 0x256: 0x0018, 0x257: 0x0018, - 0x258: 0x029a, 0x259: 0x02ba, 0x25a: 0x02da, 0x25b: 0x02fa, 0x25c: 0x031a, 0x25d: 0x033a, - 0x25e: 0x0018, 0x25f: 0x0018, 0x260: 0x03ad, 0x261: 0x0359, 0x262: 0x01d9, 0x263: 0x0369, - 0x264: 0x03c5, 0x265: 0x0018, 0x266: 0x0018, 0x267: 0x0018, 0x268: 0x0018, 0x269: 0x0018, - 0x26a: 0x0018, 0x26b: 0x0018, 0x26c: 0x0008, 0x26d: 0x0018, 0x26e: 0x0008, 0x26f: 0x0018, - 0x270: 0x0018, 0x271: 0x0018, 0x272: 0x0018, 0x273: 0x0018, 0x274: 0x0018, 0x275: 0x0018, - 0x276: 0x0018, 0x277: 0x0018, 0x278: 0x0018, 0x279: 0x0018, 0x27a: 0x0018, 0x27b: 0x0018, - 0x27c: 0x0018, 0x27d: 0x0018, 0x27e: 0x0018, 0x27f: 0x0018, - // Block 0xa, offset 0x280 - 0x280: 0x03dd, 0x281: 0x03dd, 0x282: 0x1308, 0x283: 0x03f5, 0x284: 0x0379, 0x285: 0x040d, - 0x286: 0x1308, 0x287: 0x1308, 0x288: 0x1308, 0x289: 0x1308, 0x28a: 0x1308, 0x28b: 0x1308, - 0x28c: 0x1308, 0x28d: 0x1308, 0x28e: 0x1308, 0x28f: 0x13c0, 0x290: 0x1308, 0x291: 0x1308, - 0x292: 0x1308, 0x293: 0x1308, 0x294: 0x1308, 0x295: 0x1308, 0x296: 0x1308, 0x297: 0x1308, - 0x298: 0x1308, 0x299: 0x1308, 0x29a: 0x1308, 0x29b: 0x1308, 0x29c: 0x1308, 0x29d: 0x1308, - 0x29e: 0x1308, 0x29f: 0x1308, 0x2a0: 0x1308, 0x2a1: 0x1308, 0x2a2: 0x1308, 0x2a3: 0x1308, - 0x2a4: 0x1308, 0x2a5: 0x1308, 0x2a6: 0x1308, 0x2a7: 0x1308, 0x2a8: 0x1308, 0x2a9: 0x1308, - 0x2aa: 0x1308, 0x2ab: 0x1308, 0x2ac: 0x1308, 0x2ad: 0x1308, 0x2ae: 0x1308, 0x2af: 0x1308, - 0x2b0: 0xe00d, 0x2b1: 0x0008, 0x2b2: 0xe00d, 0x2b3: 0x0008, 0x2b4: 0x0425, 0x2b5: 0x0008, - 0x2b6: 0xe00d, 0x2b7: 0x0008, 0x2b8: 0x0040, 0x2b9: 0x0040, 0x2ba: 0x03a2, 0x2bb: 0x0008, - 0x2bc: 0x0008, 0x2bd: 0x0008, 0x2be: 0x03c2, 0x2bf: 0x043d, - // Block 0xb, offset 0x2c0 - 0x2c0: 0x0040, 0x2c1: 0x0040, 0x2c2: 0x0040, 0x2c3: 0x0040, 0x2c4: 0x008a, 0x2c5: 0x03d2, - 0x2c6: 0xe155, 0x2c7: 0x0455, 0x2c8: 0xe12d, 0x2c9: 0xe13d, 0x2ca: 0xe12d, 0x2cb: 0x0040, - 0x2cc: 0x03dd, 0x2cd: 0x0040, 0x2ce: 0x046d, 0x2cf: 0x0485, 0x2d0: 0x0008, 0x2d1: 0xe105, - 0x2d2: 0xe105, 0x2d3: 0xe105, 0x2d4: 0xe105, 0x2d5: 0xe105, 0x2d6: 0xe105, 0x2d7: 0xe105, - 0x2d8: 0xe105, 0x2d9: 0xe105, 0x2da: 0xe105, 0x2db: 0xe105, 0x2dc: 0xe105, 0x2dd: 0xe105, - 0x2de: 0xe105, 0x2df: 0xe105, 0x2e0: 0x049d, 0x2e1: 0x049d, 0x2e2: 0x0040, 0x2e3: 0x049d, - 0x2e4: 0x049d, 0x2e5: 0x049d, 0x2e6: 0x049d, 0x2e7: 0x049d, 0x2e8: 0x049d, 0x2e9: 0x049d, - 0x2ea: 0x049d, 0x2eb: 0x049d, 0x2ec: 0x0008, 0x2ed: 0x0008, 0x2ee: 0x0008, 0x2ef: 0x0008, - 0x2f0: 0x0008, 0x2f1: 0x0008, 0x2f2: 0x0008, 0x2f3: 0x0008, 0x2f4: 0x0008, 0x2f5: 0x0008, - 0x2f6: 0x0008, 0x2f7: 0x0008, 0x2f8: 0x0008, 0x2f9: 0x0008, 0x2fa: 0x0008, 0x2fb: 0x0008, - 0x2fc: 0x0008, 0x2fd: 0x0008, 0x2fe: 0x0008, 0x2ff: 0x0008, - // Block 0xc, offset 0x300 - 0x300: 0x0008, 0x301: 0x0008, 0x302: 0xe00f, 0x303: 0x0008, 0x304: 0x0008, 0x305: 0x0008, - 0x306: 0x0008, 0x307: 0x0008, 0x308: 0x0008, 0x309: 0x0008, 0x30a: 0x0008, 0x30b: 0x0008, - 0x30c: 0x0008, 0x30d: 0x0008, 0x30e: 0x0008, 0x30f: 0xe0c5, 0x310: 0x04b5, 0x311: 0x04cd, - 0x312: 0xe0bd, 0x313: 0xe0f5, 0x314: 0xe0fd, 0x315: 0xe09d, 0x316: 0xe0b5, 0x317: 0x0008, - 0x318: 0xe00d, 0x319: 0x0008, 0x31a: 0xe00d, 0x31b: 0x0008, 0x31c: 0xe00d, 0x31d: 0x0008, - 0x31e: 0xe00d, 0x31f: 0x0008, 0x320: 0xe00d, 0x321: 0x0008, 0x322: 0xe00d, 0x323: 0x0008, - 0x324: 0xe00d, 0x325: 0x0008, 0x326: 0xe00d, 0x327: 0x0008, 0x328: 0xe00d, 0x329: 0x0008, - 0x32a: 0xe00d, 0x32b: 0x0008, 0x32c: 0xe00d, 0x32d: 0x0008, 0x32e: 0xe00d, 0x32f: 0x0008, - 0x330: 0x04e5, 0x331: 0xe185, 0x332: 0xe18d, 0x333: 0x0008, 0x334: 0x04fd, 0x335: 0x03dd, - 0x336: 0x0018, 0x337: 0xe07d, 0x338: 0x0008, 0x339: 0xe1d5, 0x33a: 0xe00d, 0x33b: 0x0008, - 0x33c: 0x0008, 0x33d: 0x0515, 0x33e: 0x052d, 0x33f: 0x052d, - // Block 0xd, offset 0x340 - 0x340: 0x0008, 0x341: 0x0008, 0x342: 0x0008, 0x343: 0x0008, 0x344: 0x0008, 0x345: 0x0008, - 0x346: 0x0008, 0x347: 0x0008, 0x348: 0x0008, 0x349: 0x0008, 0x34a: 0x0008, 0x34b: 0x0008, - 0x34c: 0x0008, 0x34d: 0x0008, 0x34e: 0x0008, 0x34f: 0x0008, 0x350: 0x0008, 0x351: 0x0008, - 0x352: 0x0008, 0x353: 0x0008, 0x354: 0x0008, 0x355: 0x0008, 0x356: 0x0008, 0x357: 0x0008, - 0x358: 0x0008, 0x359: 0x0008, 0x35a: 0x0008, 0x35b: 0x0008, 0x35c: 0x0008, 0x35d: 0x0008, - 0x35e: 0x0008, 0x35f: 0x0008, 0x360: 0xe00d, 0x361: 0x0008, 0x362: 0xe00d, 0x363: 0x0008, - 0x364: 0xe00d, 0x365: 0x0008, 0x366: 0xe00d, 0x367: 0x0008, 0x368: 0xe00d, 0x369: 0x0008, - 0x36a: 0xe00d, 0x36b: 0x0008, 0x36c: 0xe00d, 0x36d: 0x0008, 0x36e: 0xe00d, 0x36f: 0x0008, - 0x370: 0xe00d, 0x371: 0x0008, 0x372: 0xe00d, 0x373: 0x0008, 0x374: 0xe00d, 0x375: 0x0008, - 0x376: 0xe00d, 0x377: 0x0008, 0x378: 0xe00d, 0x379: 0x0008, 0x37a: 0xe00d, 0x37b: 0x0008, - 0x37c: 0xe00d, 0x37d: 0x0008, 0x37e: 0xe00d, 0x37f: 0x0008, - // Block 0xe, offset 0x380 - 0x380: 0xe00d, 0x381: 0x0008, 0x382: 0x0018, 0x383: 0x1308, 0x384: 0x1308, 0x385: 0x1308, - 0x386: 0x1308, 0x387: 0x1308, 0x388: 0x1318, 0x389: 0x1318, 0x38a: 0xe00d, 0x38b: 0x0008, - 0x38c: 0xe00d, 0x38d: 0x0008, 0x38e: 0xe00d, 0x38f: 0x0008, 0x390: 0xe00d, 0x391: 0x0008, - 0x392: 0xe00d, 0x393: 0x0008, 0x394: 0xe00d, 0x395: 0x0008, 0x396: 0xe00d, 0x397: 0x0008, - 0x398: 0xe00d, 0x399: 0x0008, 0x39a: 0xe00d, 0x39b: 0x0008, 0x39c: 0xe00d, 0x39d: 0x0008, - 0x39e: 0xe00d, 0x39f: 0x0008, 0x3a0: 0xe00d, 0x3a1: 0x0008, 0x3a2: 0xe00d, 0x3a3: 0x0008, - 0x3a4: 0xe00d, 0x3a5: 0x0008, 0x3a6: 0xe00d, 0x3a7: 0x0008, 0x3a8: 0xe00d, 0x3a9: 0x0008, - 0x3aa: 0xe00d, 0x3ab: 0x0008, 0x3ac: 0xe00d, 0x3ad: 0x0008, 0x3ae: 0xe00d, 0x3af: 0x0008, - 0x3b0: 0xe00d, 0x3b1: 0x0008, 0x3b2: 0xe00d, 0x3b3: 0x0008, 0x3b4: 0xe00d, 0x3b5: 0x0008, - 0x3b6: 0xe00d, 0x3b7: 0x0008, 0x3b8: 0xe00d, 0x3b9: 0x0008, 0x3ba: 0xe00d, 0x3bb: 0x0008, - 0x3bc: 0xe00d, 0x3bd: 0x0008, 0x3be: 0xe00d, 0x3bf: 0x0008, - // Block 0xf, offset 0x3c0 - 0x3c0: 0x0040, 0x3c1: 0xe01d, 0x3c2: 0x0008, 0x3c3: 0xe03d, 0x3c4: 0x0008, 0x3c5: 0xe01d, - 0x3c6: 0x0008, 0x3c7: 0xe07d, 0x3c8: 0x0008, 0x3c9: 0xe01d, 0x3ca: 0x0008, 0x3cb: 0xe03d, - 0x3cc: 0x0008, 0x3cd: 0xe01d, 0x3ce: 0x0008, 0x3cf: 0x0008, 0x3d0: 0xe00d, 0x3d1: 0x0008, - 0x3d2: 0xe00d, 0x3d3: 0x0008, 0x3d4: 0xe00d, 0x3d5: 0x0008, 0x3d6: 0xe00d, 0x3d7: 0x0008, - 0x3d8: 0xe00d, 0x3d9: 0x0008, 0x3da: 0xe00d, 0x3db: 0x0008, 0x3dc: 0xe00d, 0x3dd: 0x0008, - 0x3de: 0xe00d, 0x3df: 0x0008, 0x3e0: 0xe00d, 0x3e1: 0x0008, 0x3e2: 0xe00d, 0x3e3: 0x0008, - 0x3e4: 0xe00d, 0x3e5: 0x0008, 0x3e6: 0xe00d, 0x3e7: 0x0008, 0x3e8: 0xe00d, 0x3e9: 0x0008, - 0x3ea: 0xe00d, 0x3eb: 0x0008, 0x3ec: 0xe00d, 0x3ed: 0x0008, 0x3ee: 0xe00d, 0x3ef: 0x0008, - 0x3f0: 0xe00d, 0x3f1: 0x0008, 0x3f2: 0xe00d, 0x3f3: 0x0008, 0x3f4: 0xe00d, 0x3f5: 0x0008, - 0x3f6: 0xe00d, 0x3f7: 0x0008, 0x3f8: 0xe00d, 0x3f9: 0x0008, 0x3fa: 0xe00d, 0x3fb: 0x0008, - 0x3fc: 0xe00d, 0x3fd: 0x0008, 0x3fe: 0xe00d, 0x3ff: 0x0008, - // Block 0x10, offset 0x400 - 0x400: 0xe00d, 0x401: 0x0008, 0x402: 0xe00d, 0x403: 0x0008, 0x404: 0xe00d, 0x405: 0x0008, - 0x406: 0xe00d, 0x407: 0x0008, 0x408: 0xe00d, 0x409: 0x0008, 0x40a: 0xe00d, 0x40b: 0x0008, - 0x40c: 0xe00d, 0x40d: 0x0008, 0x40e: 0xe00d, 0x40f: 0x0008, 0x410: 0xe00d, 0x411: 0x0008, - 0x412: 0xe00d, 0x413: 0x0008, 0x414: 0xe00d, 0x415: 0x0008, 0x416: 0xe00d, 0x417: 0x0008, - 0x418: 0xe00d, 0x419: 0x0008, 0x41a: 0xe00d, 0x41b: 0x0008, 0x41c: 0xe00d, 0x41d: 0x0008, - 0x41e: 0xe00d, 0x41f: 0x0008, 0x420: 0xe00d, 0x421: 0x0008, 0x422: 0xe00d, 0x423: 0x0008, - 0x424: 0xe00d, 0x425: 0x0008, 0x426: 0xe00d, 0x427: 0x0008, 0x428: 0xe00d, 0x429: 0x0008, - 0x42a: 0xe00d, 0x42b: 0x0008, 0x42c: 0xe00d, 0x42d: 0x0008, 0x42e: 0xe00d, 0x42f: 0x0008, - 0x430: 0x0040, 0x431: 0x03f5, 0x432: 0x03f5, 0x433: 0x03f5, 0x434: 0x03f5, 0x435: 0x03f5, - 0x436: 0x03f5, 0x437: 0x03f5, 0x438: 0x03f5, 0x439: 0x03f5, 0x43a: 0x03f5, 0x43b: 0x03f5, - 0x43c: 0x03f5, 0x43d: 0x03f5, 0x43e: 0x03f5, 0x43f: 0x03f5, - // Block 0x11, offset 0x440 - 0x440: 0x0040, 0x441: 0x0040, 0x442: 0x0040, 0x443: 0x0040, 0x444: 0x0040, 0x445: 0x0040, - 0x446: 0x0018, 0x447: 0x0018, 0x448: 0x0018, 0x449: 0x0018, 0x44a: 0x0018, 0x44b: 0x0018, - 0x44c: 0x0018, 0x44d: 0x0018, 0x44e: 0x0018, 0x44f: 0x0018, 0x450: 0x1308, 0x451: 0x1308, - 0x452: 0x1308, 0x453: 0x1308, 0x454: 0x1308, 0x455: 0x1308, 0x456: 0x1308, 0x457: 0x1308, - 0x458: 0x1308, 0x459: 0x1308, 0x45a: 0x1308, 0x45b: 0x0018, 0x45c: 0x0340, 0x45d: 0x0040, - 0x45e: 0x0018, 0x45f: 0x0018, 0x460: 0x0208, 0x461: 0x0008, 0x462: 0x0408, 0x463: 0x0408, - 0x464: 0x0408, 0x465: 0x0408, 0x466: 0x0208, 0x467: 0x0408, 0x468: 0x0208, 0x469: 0x0408, - 0x46a: 0x0208, 0x46b: 0x0208, 0x46c: 0x0208, 0x46d: 0x0208, 0x46e: 0x0208, 0x46f: 0x0408, - 0x470: 0x0408, 0x471: 0x0408, 0x472: 0x0408, 0x473: 0x0208, 0x474: 0x0208, 0x475: 0x0208, - 0x476: 0x0208, 0x477: 0x0208, 0x478: 0x0208, 0x479: 0x0208, 0x47a: 0x0208, 0x47b: 0x0208, - 0x47c: 0x0208, 0x47d: 0x0208, 0x47e: 0x0208, 0x47f: 0x0208, - // Block 0x12, offset 0x480 - 0x480: 0x0408, 0x481: 0x0208, 0x482: 0x0208, 0x483: 0x0408, 0x484: 0x0408, 0x485: 0x0408, - 0x486: 0x0408, 0x487: 0x0408, 0x488: 0x0408, 0x489: 0x0408, 0x48a: 0x0408, 0x48b: 0x0408, - 0x48c: 0x0208, 0x48d: 0x0408, 0x48e: 0x0208, 0x48f: 0x0408, 0x490: 0x0208, 0x491: 0x0208, - 0x492: 0x0408, 0x493: 0x0408, 0x494: 0x0018, 0x495: 0x0408, 0x496: 0x1308, 0x497: 0x1308, - 0x498: 0x1308, 0x499: 0x1308, 0x49a: 0x1308, 0x49b: 0x1308, 0x49c: 0x1308, 0x49d: 0x0040, - 0x49e: 0x0018, 0x49f: 0x1308, 0x4a0: 0x1308, 0x4a1: 0x1308, 0x4a2: 0x1308, 0x4a3: 0x1308, - 0x4a4: 0x1308, 0x4a5: 0x0008, 0x4a6: 0x0008, 0x4a7: 0x1308, 0x4a8: 0x1308, 0x4a9: 0x0018, - 0x4aa: 0x1308, 0x4ab: 0x1308, 0x4ac: 0x1308, 0x4ad: 0x1308, 0x4ae: 0x0408, 0x4af: 0x0408, - 0x4b0: 0x0008, 0x4b1: 0x0008, 0x4b2: 0x0008, 0x4b3: 0x0008, 0x4b4: 0x0008, 0x4b5: 0x0008, - 0x4b6: 0x0008, 0x4b7: 0x0008, 0x4b8: 0x0008, 0x4b9: 0x0008, 0x4ba: 0x0208, 0x4bb: 0x0208, - 0x4bc: 0x0208, 0x4bd: 0x0008, 0x4be: 0x0008, 0x4bf: 0x0208, - // Block 0x13, offset 0x4c0 - 0x4c0: 0x0018, 0x4c1: 0x0018, 0x4c2: 0x0018, 0x4c3: 0x0018, 0x4c4: 0x0018, 0x4c5: 0x0018, - 0x4c6: 0x0018, 0x4c7: 0x0018, 0x4c8: 0x0018, 0x4c9: 0x0018, 0x4ca: 0x0018, 0x4cb: 0x0018, - 0x4cc: 0x0018, 0x4cd: 0x0018, 0x4ce: 0x0040, 0x4cf: 0x0340, 0x4d0: 0x0408, 0x4d1: 0x1308, - 0x4d2: 0x0208, 0x4d3: 0x0208, 0x4d4: 0x0208, 0x4d5: 0x0408, 0x4d6: 0x0408, 0x4d7: 0x0408, - 0x4d8: 0x0408, 0x4d9: 0x0408, 0x4da: 0x0208, 0x4db: 0x0208, 0x4dc: 0x0208, 0x4dd: 0x0208, - 0x4de: 0x0408, 0x4df: 0x0208, 0x4e0: 0x0208, 0x4e1: 0x0208, 0x4e2: 0x0208, 0x4e3: 0x0208, - 0x4e4: 0x0208, 0x4e5: 0x0208, 0x4e6: 0x0208, 0x4e7: 0x0208, 0x4e8: 0x0408, 0x4e9: 0x0208, - 0x4ea: 0x0408, 0x4eb: 0x0208, 0x4ec: 0x0408, 0x4ed: 0x0208, 0x4ee: 0x0208, 0x4ef: 0x0408, - 0x4f0: 0x1308, 0x4f1: 0x1308, 0x4f2: 0x1308, 0x4f3: 0x1308, 0x4f4: 0x1308, 0x4f5: 0x1308, - 0x4f6: 0x1308, 0x4f7: 0x1308, 0x4f8: 0x1308, 0x4f9: 0x1308, 0x4fa: 0x1308, 0x4fb: 0x1308, - 0x4fc: 0x1308, 0x4fd: 0x1308, 0x4fe: 0x1308, 0x4ff: 0x1308, - // Block 0x14, offset 0x500 - 0x500: 0x1008, 0x501: 0x1308, 0x502: 0x1308, 0x503: 0x1308, 0x504: 0x1308, 0x505: 0x1308, - 0x506: 0x1308, 0x507: 0x1308, 0x508: 0x1308, 0x509: 0x1008, 0x50a: 0x1008, 0x50b: 0x1008, - 0x50c: 0x1008, 0x50d: 0x1b08, 0x50e: 0x1008, 0x50f: 0x1008, 0x510: 0x0008, 0x511: 0x1308, - 0x512: 0x1308, 0x513: 0x1308, 0x514: 0x1308, 0x515: 0x1308, 0x516: 0x1308, 0x517: 0x1308, - 0x518: 0x04c9, 0x519: 0x0501, 0x51a: 0x0539, 0x51b: 0x0571, 0x51c: 0x05a9, 0x51d: 0x05e1, - 0x51e: 0x0619, 0x51f: 0x0651, 0x520: 0x0008, 0x521: 0x0008, 0x522: 0x1308, 0x523: 0x1308, - 0x524: 0x0018, 0x525: 0x0018, 0x526: 0x0008, 0x527: 0x0008, 0x528: 0x0008, 0x529: 0x0008, - 0x52a: 0x0008, 0x52b: 0x0008, 0x52c: 0x0008, 0x52d: 0x0008, 0x52e: 0x0008, 0x52f: 0x0008, - 0x530: 0x0018, 0x531: 0x0008, 0x532: 0x0008, 0x533: 0x0008, 0x534: 0x0008, 0x535: 0x0008, - 0x536: 0x0008, 0x537: 0x0008, 0x538: 0x0008, 0x539: 0x0008, 0x53a: 0x0008, 0x53b: 0x0008, - 0x53c: 0x0008, 0x53d: 0x0008, 0x53e: 0x0008, 0x53f: 0x0008, - // Block 0x15, offset 0x540 - 0x540: 0x0008, 0x541: 0x1308, 0x542: 0x1008, 0x543: 0x1008, 0x544: 0x0040, 0x545: 0x0008, - 0x546: 0x0008, 0x547: 0x0008, 0x548: 0x0008, 0x549: 0x0008, 0x54a: 0x0008, 0x54b: 0x0008, - 0x54c: 0x0008, 0x54d: 0x0040, 0x54e: 0x0040, 0x54f: 0x0008, 0x550: 0x0008, 0x551: 0x0040, - 0x552: 0x0040, 0x553: 0x0008, 0x554: 0x0008, 0x555: 0x0008, 0x556: 0x0008, 0x557: 0x0008, - 0x558: 0x0008, 0x559: 0x0008, 0x55a: 0x0008, 0x55b: 0x0008, 0x55c: 0x0008, 0x55d: 0x0008, - 0x55e: 0x0008, 0x55f: 0x0008, 0x560: 0x0008, 0x561: 0x0008, 0x562: 0x0008, 0x563: 0x0008, - 0x564: 0x0008, 0x565: 0x0008, 0x566: 0x0008, 0x567: 0x0008, 0x568: 0x0008, 0x569: 0x0040, - 0x56a: 0x0008, 0x56b: 0x0008, 0x56c: 0x0008, 0x56d: 0x0008, 0x56e: 0x0008, 0x56f: 0x0008, - 0x570: 0x0008, 0x571: 0x0040, 0x572: 0x0008, 0x573: 0x0040, 0x574: 0x0040, 0x575: 0x0040, - 0x576: 0x0008, 0x577: 0x0008, 0x578: 0x0008, 0x579: 0x0008, 0x57a: 0x0040, 0x57b: 0x0040, - 0x57c: 0x1308, 0x57d: 0x0008, 0x57e: 0x1008, 0x57f: 0x1008, - // Block 0x16, offset 0x580 - 0x580: 0x1008, 0x581: 0x1308, 0x582: 0x1308, 0x583: 0x1308, 0x584: 0x1308, 0x585: 0x0040, - 0x586: 0x0040, 0x587: 0x1008, 0x588: 0x1008, 0x589: 0x0040, 0x58a: 0x0040, 0x58b: 0x1008, - 0x58c: 0x1008, 0x58d: 0x1b08, 0x58e: 0x0008, 0x58f: 0x0040, 0x590: 0x0040, 0x591: 0x0040, - 0x592: 0x0040, 0x593: 0x0040, 0x594: 0x0040, 0x595: 0x0040, 0x596: 0x0040, 0x597: 0x1008, - 0x598: 0x0040, 0x599: 0x0040, 0x59a: 0x0040, 0x59b: 0x0040, 0x59c: 0x0689, 0x59d: 0x06c1, - 0x59e: 0x0040, 0x59f: 0x06f9, 0x5a0: 0x0008, 0x5a1: 0x0008, 0x5a2: 0x1308, 0x5a3: 0x1308, - 0x5a4: 0x0040, 0x5a5: 0x0040, 0x5a6: 0x0008, 0x5a7: 0x0008, 0x5a8: 0x0008, 0x5a9: 0x0008, - 0x5aa: 0x0008, 0x5ab: 0x0008, 0x5ac: 0x0008, 0x5ad: 0x0008, 0x5ae: 0x0008, 0x5af: 0x0008, - 0x5b0: 0x0008, 0x5b1: 0x0008, 0x5b2: 0x0018, 0x5b3: 0x0018, 0x5b4: 0x0018, 0x5b5: 0x0018, - 0x5b6: 0x0018, 0x5b7: 0x0018, 0x5b8: 0x0018, 0x5b9: 0x0018, 0x5ba: 0x0018, 0x5bb: 0x0018, - 0x5bc: 0x0040, 0x5bd: 0x0040, 0x5be: 0x0040, 0x5bf: 0x0040, - // Block 0x17, offset 0x5c0 - 0x5c0: 0x0040, 0x5c1: 0x1308, 0x5c2: 0x1308, 0x5c3: 0x1008, 0x5c4: 0x0040, 0x5c5: 0x0008, - 0x5c6: 0x0008, 0x5c7: 0x0008, 0x5c8: 0x0008, 0x5c9: 0x0008, 0x5ca: 0x0008, 0x5cb: 0x0040, - 0x5cc: 0x0040, 0x5cd: 0x0040, 0x5ce: 0x0040, 0x5cf: 0x0008, 0x5d0: 0x0008, 0x5d1: 0x0040, - 0x5d2: 0x0040, 0x5d3: 0x0008, 0x5d4: 0x0008, 0x5d5: 0x0008, 0x5d6: 0x0008, 0x5d7: 0x0008, - 0x5d8: 0x0008, 0x5d9: 0x0008, 0x5da: 0x0008, 0x5db: 0x0008, 0x5dc: 0x0008, 0x5dd: 0x0008, - 0x5de: 0x0008, 0x5df: 0x0008, 0x5e0: 0x0008, 0x5e1: 0x0008, 0x5e2: 0x0008, 0x5e3: 0x0008, - 0x5e4: 0x0008, 0x5e5: 0x0008, 0x5e6: 0x0008, 0x5e7: 0x0008, 0x5e8: 0x0008, 0x5e9: 0x0040, - 0x5ea: 0x0008, 0x5eb: 0x0008, 0x5ec: 0x0008, 0x5ed: 0x0008, 0x5ee: 0x0008, 0x5ef: 0x0008, - 0x5f0: 0x0008, 0x5f1: 0x0040, 0x5f2: 0x0008, 0x5f3: 0x0731, 0x5f4: 0x0040, 0x5f5: 0x0008, - 0x5f6: 0x0769, 0x5f7: 0x0040, 0x5f8: 0x0008, 0x5f9: 0x0008, 0x5fa: 0x0040, 0x5fb: 0x0040, - 0x5fc: 0x1308, 0x5fd: 0x0040, 0x5fe: 0x1008, 0x5ff: 0x1008, - // Block 0x18, offset 0x600 - 0x600: 0x1008, 0x601: 0x1308, 0x602: 0x1308, 0x603: 0x0040, 0x604: 0x0040, 0x605: 0x0040, - 0x606: 0x0040, 0x607: 0x1308, 0x608: 0x1308, 0x609: 0x0040, 0x60a: 0x0040, 0x60b: 0x1308, - 0x60c: 0x1308, 0x60d: 0x1b08, 0x60e: 0x0040, 0x60f: 0x0040, 0x610: 0x0040, 0x611: 0x1308, - 0x612: 0x0040, 0x613: 0x0040, 0x614: 0x0040, 0x615: 0x0040, 0x616: 0x0040, 0x617: 0x0040, - 0x618: 0x0040, 0x619: 0x07a1, 0x61a: 0x07d9, 0x61b: 0x0811, 0x61c: 0x0008, 0x61d: 0x0040, - 0x61e: 0x0849, 0x61f: 0x0040, 0x620: 0x0040, 0x621: 0x0040, 0x622: 0x0040, 0x623: 0x0040, - 0x624: 0x0040, 0x625: 0x0040, 0x626: 0x0008, 0x627: 0x0008, 0x628: 0x0008, 0x629: 0x0008, - 0x62a: 0x0008, 0x62b: 0x0008, 0x62c: 0x0008, 0x62d: 0x0008, 0x62e: 0x0008, 0x62f: 0x0008, - 0x630: 0x1308, 0x631: 0x1308, 0x632: 0x0008, 0x633: 0x0008, 0x634: 0x0008, 0x635: 0x1308, - 0x636: 0x0040, 0x637: 0x0040, 0x638: 0x0040, 0x639: 0x0040, 0x63a: 0x0040, 0x63b: 0x0040, - 0x63c: 0x0040, 0x63d: 0x0040, 0x63e: 0x0040, 0x63f: 0x0040, - // Block 0x19, offset 0x640 - 0x640: 0x0040, 0x641: 0x1308, 0x642: 0x1308, 0x643: 0x1008, 0x644: 0x0040, 0x645: 0x0008, - 0x646: 0x0008, 0x647: 0x0008, 0x648: 0x0008, 0x649: 0x0008, 0x64a: 0x0008, 0x64b: 0x0008, - 0x64c: 0x0008, 0x64d: 0x0008, 0x64e: 0x0040, 0x64f: 0x0008, 0x650: 0x0008, 0x651: 0x0008, - 0x652: 0x0040, 0x653: 0x0008, 0x654: 0x0008, 0x655: 0x0008, 0x656: 0x0008, 0x657: 0x0008, - 0x658: 0x0008, 0x659: 0x0008, 0x65a: 0x0008, 0x65b: 0x0008, 0x65c: 0x0008, 0x65d: 0x0008, - 0x65e: 0x0008, 0x65f: 0x0008, 0x660: 0x0008, 0x661: 0x0008, 0x662: 0x0008, 0x663: 0x0008, - 0x664: 0x0008, 0x665: 0x0008, 0x666: 0x0008, 0x667: 0x0008, 0x668: 0x0008, 0x669: 0x0040, - 0x66a: 0x0008, 0x66b: 0x0008, 0x66c: 0x0008, 0x66d: 0x0008, 0x66e: 0x0008, 0x66f: 0x0008, - 0x670: 0x0008, 0x671: 0x0040, 0x672: 0x0008, 0x673: 0x0008, 0x674: 0x0040, 0x675: 0x0008, - 0x676: 0x0008, 0x677: 0x0008, 0x678: 0x0008, 0x679: 0x0008, 0x67a: 0x0040, 0x67b: 0x0040, - 0x67c: 0x1308, 0x67d: 0x0008, 0x67e: 0x1008, 0x67f: 0x1008, - // Block 0x1a, offset 0x680 - 0x680: 0x1008, 0x681: 0x1308, 0x682: 0x1308, 0x683: 0x1308, 0x684: 0x1308, 0x685: 0x1308, - 0x686: 0x0040, 0x687: 0x1308, 0x688: 0x1308, 0x689: 0x1008, 0x68a: 0x0040, 0x68b: 0x1008, - 0x68c: 0x1008, 0x68d: 0x1b08, 0x68e: 0x0040, 0x68f: 0x0040, 0x690: 0x0008, 0x691: 0x0040, - 0x692: 0x0040, 0x693: 0x0040, 0x694: 0x0040, 0x695: 0x0040, 0x696: 0x0040, 0x697: 0x0040, - 0x698: 0x0040, 0x699: 0x0040, 0x69a: 0x0040, 0x69b: 0x0040, 0x69c: 0x0040, 0x69d: 0x0040, - 0x69e: 0x0040, 0x69f: 0x0040, 0x6a0: 0x0008, 0x6a1: 0x0008, 0x6a2: 0x1308, 0x6a3: 0x1308, - 0x6a4: 0x0040, 0x6a5: 0x0040, 0x6a6: 0x0008, 0x6a7: 0x0008, 0x6a8: 0x0008, 0x6a9: 0x0008, - 0x6aa: 0x0008, 0x6ab: 0x0008, 0x6ac: 0x0008, 0x6ad: 0x0008, 0x6ae: 0x0008, 0x6af: 0x0008, - 0x6b0: 0x0018, 0x6b1: 0x0018, 0x6b2: 0x0040, 0x6b3: 0x0040, 0x6b4: 0x0040, 0x6b5: 0x0040, - 0x6b6: 0x0040, 0x6b7: 0x0040, 0x6b8: 0x0040, 0x6b9: 0x0008, 0x6ba: 0x0040, 0x6bb: 0x0040, - 0x6bc: 0x0040, 0x6bd: 0x0040, 0x6be: 0x0040, 0x6bf: 0x0040, - // Block 0x1b, offset 0x6c0 - 0x6c0: 0x0040, 0x6c1: 0x1308, 0x6c2: 0x1008, 0x6c3: 0x1008, 0x6c4: 0x0040, 0x6c5: 0x0008, - 0x6c6: 0x0008, 0x6c7: 0x0008, 0x6c8: 0x0008, 0x6c9: 0x0008, 0x6ca: 0x0008, 0x6cb: 0x0008, - 0x6cc: 0x0008, 0x6cd: 0x0040, 0x6ce: 0x0040, 0x6cf: 0x0008, 0x6d0: 0x0008, 0x6d1: 0x0040, - 0x6d2: 0x0040, 0x6d3: 0x0008, 0x6d4: 0x0008, 0x6d5: 0x0008, 0x6d6: 0x0008, 0x6d7: 0x0008, - 0x6d8: 0x0008, 0x6d9: 0x0008, 0x6da: 0x0008, 0x6db: 0x0008, 0x6dc: 0x0008, 0x6dd: 0x0008, - 0x6de: 0x0008, 0x6df: 0x0008, 0x6e0: 0x0008, 0x6e1: 0x0008, 0x6e2: 0x0008, 0x6e3: 0x0008, - 0x6e4: 0x0008, 0x6e5: 0x0008, 0x6e6: 0x0008, 0x6e7: 0x0008, 0x6e8: 0x0008, 0x6e9: 0x0040, - 0x6ea: 0x0008, 0x6eb: 0x0008, 0x6ec: 0x0008, 0x6ed: 0x0008, 0x6ee: 0x0008, 0x6ef: 0x0008, - 0x6f0: 0x0008, 0x6f1: 0x0040, 0x6f2: 0x0008, 0x6f3: 0x0008, 0x6f4: 0x0040, 0x6f5: 0x0008, - 0x6f6: 0x0008, 0x6f7: 0x0008, 0x6f8: 0x0008, 0x6f9: 0x0008, 0x6fa: 0x0040, 0x6fb: 0x0040, - 0x6fc: 0x1308, 0x6fd: 0x0008, 0x6fe: 0x1008, 0x6ff: 0x1308, - // Block 0x1c, offset 0x700 - 0x700: 0x1008, 0x701: 0x1308, 0x702: 0x1308, 0x703: 0x1308, 0x704: 0x1308, 0x705: 0x0040, - 0x706: 0x0040, 0x707: 0x1008, 0x708: 0x1008, 0x709: 0x0040, 0x70a: 0x0040, 0x70b: 0x1008, - 0x70c: 0x1008, 0x70d: 0x1b08, 0x70e: 0x0040, 0x70f: 0x0040, 0x710: 0x0040, 0x711: 0x0040, - 0x712: 0x0040, 0x713: 0x0040, 0x714: 0x0040, 0x715: 0x0040, 0x716: 0x1308, 0x717: 0x1008, - 0x718: 0x0040, 0x719: 0x0040, 0x71a: 0x0040, 0x71b: 0x0040, 0x71c: 0x0881, 0x71d: 0x08b9, - 0x71e: 0x0040, 0x71f: 0x0008, 0x720: 0x0008, 0x721: 0x0008, 0x722: 0x1308, 0x723: 0x1308, - 0x724: 0x0040, 0x725: 0x0040, 0x726: 0x0008, 0x727: 0x0008, 0x728: 0x0008, 0x729: 0x0008, - 0x72a: 0x0008, 0x72b: 0x0008, 0x72c: 0x0008, 0x72d: 0x0008, 0x72e: 0x0008, 0x72f: 0x0008, - 0x730: 0x0018, 0x731: 0x0008, 0x732: 0x0018, 0x733: 0x0018, 0x734: 0x0018, 0x735: 0x0018, - 0x736: 0x0018, 0x737: 0x0018, 0x738: 0x0040, 0x739: 0x0040, 0x73a: 0x0040, 0x73b: 0x0040, - 0x73c: 0x0040, 0x73d: 0x0040, 0x73e: 0x0040, 0x73f: 0x0040, - // Block 0x1d, offset 0x740 - 0x740: 0x0040, 0x741: 0x0040, 0x742: 0x1308, 0x743: 0x0008, 0x744: 0x0040, 0x745: 0x0008, - 0x746: 0x0008, 0x747: 0x0008, 0x748: 0x0008, 0x749: 0x0008, 0x74a: 0x0008, 0x74b: 0x0040, - 0x74c: 0x0040, 0x74d: 0x0040, 0x74e: 0x0008, 0x74f: 0x0008, 0x750: 0x0008, 0x751: 0x0040, - 0x752: 0x0008, 0x753: 0x0008, 0x754: 0x0008, 0x755: 0x0008, 0x756: 0x0040, 0x757: 0x0040, - 0x758: 0x0040, 0x759: 0x0008, 0x75a: 0x0008, 0x75b: 0x0040, 0x75c: 0x0008, 0x75d: 0x0040, - 0x75e: 0x0008, 0x75f: 0x0008, 0x760: 0x0040, 0x761: 0x0040, 0x762: 0x0040, 0x763: 0x0008, - 0x764: 0x0008, 0x765: 0x0040, 0x766: 0x0040, 0x767: 0x0040, 0x768: 0x0008, 0x769: 0x0008, - 0x76a: 0x0008, 0x76b: 0x0040, 0x76c: 0x0040, 0x76d: 0x0040, 0x76e: 0x0008, 0x76f: 0x0008, - 0x770: 0x0008, 0x771: 0x0008, 0x772: 0x0008, 0x773: 0x0008, 0x774: 0x0008, 0x775: 0x0008, - 0x776: 0x0008, 0x777: 0x0008, 0x778: 0x0008, 0x779: 0x0008, 0x77a: 0x0040, 0x77b: 0x0040, - 0x77c: 0x0040, 0x77d: 0x0040, 0x77e: 0x1008, 0x77f: 0x1008, - // Block 0x1e, offset 0x780 - 0x780: 0x1308, 0x781: 0x1008, 0x782: 0x1008, 0x783: 0x1008, 0x784: 0x1008, 0x785: 0x0040, - 0x786: 0x1308, 0x787: 0x1308, 0x788: 0x1308, 0x789: 0x0040, 0x78a: 0x1308, 0x78b: 0x1308, - 0x78c: 0x1308, 0x78d: 0x1b08, 0x78e: 0x0040, 0x78f: 0x0040, 0x790: 0x0040, 0x791: 0x0040, - 0x792: 0x0040, 0x793: 0x0040, 0x794: 0x0040, 0x795: 0x1308, 0x796: 0x1308, 0x797: 0x0040, - 0x798: 0x0008, 0x799: 0x0008, 0x79a: 0x0008, 0x79b: 0x0040, 0x79c: 0x0040, 0x79d: 0x0040, - 0x79e: 0x0040, 0x79f: 0x0040, 0x7a0: 0x0008, 0x7a1: 0x0008, 0x7a2: 0x1308, 0x7a3: 0x1308, - 0x7a4: 0x0040, 0x7a5: 0x0040, 0x7a6: 0x0008, 0x7a7: 0x0008, 0x7a8: 0x0008, 0x7a9: 0x0008, - 0x7aa: 0x0008, 0x7ab: 0x0008, 0x7ac: 0x0008, 0x7ad: 0x0008, 0x7ae: 0x0008, 0x7af: 0x0008, - 0x7b0: 0x0040, 0x7b1: 0x0040, 0x7b2: 0x0040, 0x7b3: 0x0040, 0x7b4: 0x0040, 0x7b5: 0x0040, - 0x7b6: 0x0040, 0x7b7: 0x0040, 0x7b8: 0x0018, 0x7b9: 0x0018, 0x7ba: 0x0018, 0x7bb: 0x0018, - 0x7bc: 0x0018, 0x7bd: 0x0018, 0x7be: 0x0018, 0x7bf: 0x0018, - // Block 0x1f, offset 0x7c0 - 0x7c0: 0x0008, 0x7c1: 0x1308, 0x7c2: 0x1008, 0x7c3: 0x1008, 0x7c4: 0x0040, 0x7c5: 0x0008, - 0x7c6: 0x0008, 0x7c7: 0x0008, 0x7c8: 0x0008, 0x7c9: 0x0008, 0x7ca: 0x0008, 0x7cb: 0x0008, - 0x7cc: 0x0008, 0x7cd: 0x0040, 0x7ce: 0x0008, 0x7cf: 0x0008, 0x7d0: 0x0008, 0x7d1: 0x0040, - 0x7d2: 0x0008, 0x7d3: 0x0008, 0x7d4: 0x0008, 0x7d5: 0x0008, 0x7d6: 0x0008, 0x7d7: 0x0008, - 0x7d8: 0x0008, 0x7d9: 0x0008, 0x7da: 0x0008, 0x7db: 0x0008, 0x7dc: 0x0008, 0x7dd: 0x0008, - 0x7de: 0x0008, 0x7df: 0x0008, 0x7e0: 0x0008, 0x7e1: 0x0008, 0x7e2: 0x0008, 0x7e3: 0x0008, - 0x7e4: 0x0008, 0x7e5: 0x0008, 0x7e6: 0x0008, 0x7e7: 0x0008, 0x7e8: 0x0008, 0x7e9: 0x0040, - 0x7ea: 0x0008, 0x7eb: 0x0008, 0x7ec: 0x0008, 0x7ed: 0x0008, 0x7ee: 0x0008, 0x7ef: 0x0008, - 0x7f0: 0x0008, 0x7f1: 0x0008, 0x7f2: 0x0008, 0x7f3: 0x0008, 0x7f4: 0x0040, 0x7f5: 0x0008, - 0x7f6: 0x0008, 0x7f7: 0x0008, 0x7f8: 0x0008, 0x7f9: 0x0008, 0x7fa: 0x0040, 0x7fb: 0x0040, - 0x7fc: 0x1308, 0x7fd: 0x0008, 0x7fe: 0x1008, 0x7ff: 0x1308, - // Block 0x20, offset 0x800 - 0x800: 0x1008, 0x801: 0x1008, 0x802: 0x1008, 0x803: 0x1008, 0x804: 0x1008, 0x805: 0x0040, - 0x806: 0x1308, 0x807: 0x1008, 0x808: 0x1008, 0x809: 0x0040, 0x80a: 0x1008, 0x80b: 0x1008, - 0x80c: 0x1308, 0x80d: 0x1b08, 0x80e: 0x0040, 0x80f: 0x0040, 0x810: 0x0040, 0x811: 0x0040, - 0x812: 0x0040, 0x813: 0x0040, 0x814: 0x0040, 0x815: 0x1008, 0x816: 0x1008, 0x817: 0x0040, - 0x818: 0x0040, 0x819: 0x0040, 0x81a: 0x0040, 0x81b: 0x0040, 0x81c: 0x0040, 0x81d: 0x0040, - 0x81e: 0x0008, 0x81f: 0x0040, 0x820: 0x0008, 0x821: 0x0008, 0x822: 0x1308, 0x823: 0x1308, - 0x824: 0x0040, 0x825: 0x0040, 0x826: 0x0008, 0x827: 0x0008, 0x828: 0x0008, 0x829: 0x0008, - 0x82a: 0x0008, 0x82b: 0x0008, 0x82c: 0x0008, 0x82d: 0x0008, 0x82e: 0x0008, 0x82f: 0x0008, - 0x830: 0x0040, 0x831: 0x0008, 0x832: 0x0008, 0x833: 0x0040, 0x834: 0x0040, 0x835: 0x0040, - 0x836: 0x0040, 0x837: 0x0040, 0x838: 0x0040, 0x839: 0x0040, 0x83a: 0x0040, 0x83b: 0x0040, - 0x83c: 0x0040, 0x83d: 0x0040, 0x83e: 0x0040, 0x83f: 0x0040, - // Block 0x21, offset 0x840 - 0x840: 0x1008, 0x841: 0x1308, 0x842: 0x1308, 0x843: 0x1308, 0x844: 0x1308, 0x845: 0x0040, - 0x846: 0x1008, 0x847: 0x1008, 0x848: 0x1008, 0x849: 0x0040, 0x84a: 0x1008, 0x84b: 0x1008, - 0x84c: 0x1008, 0x84d: 0x1b08, 0x84e: 0x0008, 0x84f: 0x0018, 0x850: 0x0040, 0x851: 0x0040, - 0x852: 0x0040, 0x853: 0x0040, 0x854: 0x0008, 0x855: 0x0008, 0x856: 0x0008, 0x857: 0x1008, - 0x858: 0x0018, 0x859: 0x0018, 0x85a: 0x0018, 0x85b: 0x0018, 0x85c: 0x0018, 0x85d: 0x0018, - 0x85e: 0x0018, 0x85f: 0x0008, 0x860: 0x0008, 0x861: 0x0008, 0x862: 0x1308, 0x863: 0x1308, - 0x864: 0x0040, 0x865: 0x0040, 0x866: 0x0008, 0x867: 0x0008, 0x868: 0x0008, 0x869: 0x0008, - 0x86a: 0x0008, 0x86b: 0x0008, 0x86c: 0x0008, 0x86d: 0x0008, 0x86e: 0x0008, 0x86f: 0x0008, - 0x870: 0x0018, 0x871: 0x0018, 0x872: 0x0018, 0x873: 0x0018, 0x874: 0x0018, 0x875: 0x0018, - 0x876: 0x0018, 0x877: 0x0018, 0x878: 0x0018, 0x879: 0x0018, 0x87a: 0x0008, 0x87b: 0x0008, - 0x87c: 0x0008, 0x87d: 0x0008, 0x87e: 0x0008, 0x87f: 0x0008, - // Block 0x22, offset 0x880 - 0x880: 0x0040, 0x881: 0x0008, 0x882: 0x0008, 0x883: 0x0040, 0x884: 0x0008, 0x885: 0x0040, - 0x886: 0x0040, 0x887: 0x0008, 0x888: 0x0008, 0x889: 0x0040, 0x88a: 0x0008, 0x88b: 0x0040, - 0x88c: 0x0040, 0x88d: 0x0008, 0x88e: 0x0040, 0x88f: 0x0040, 0x890: 0x0040, 0x891: 0x0040, - 0x892: 0x0040, 0x893: 0x0040, 0x894: 0x0008, 0x895: 0x0008, 0x896: 0x0008, 0x897: 0x0008, - 0x898: 0x0040, 0x899: 0x0008, 0x89a: 0x0008, 0x89b: 0x0008, 0x89c: 0x0008, 0x89d: 0x0008, - 0x89e: 0x0008, 0x89f: 0x0008, 0x8a0: 0x0040, 0x8a1: 0x0008, 0x8a2: 0x0008, 0x8a3: 0x0008, - 0x8a4: 0x0040, 0x8a5: 0x0008, 0x8a6: 0x0040, 0x8a7: 0x0008, 0x8a8: 0x0040, 0x8a9: 0x0040, - 0x8aa: 0x0008, 0x8ab: 0x0008, 0x8ac: 0x0040, 0x8ad: 0x0008, 0x8ae: 0x0008, 0x8af: 0x0008, - 0x8b0: 0x0008, 0x8b1: 0x1308, 0x8b2: 0x0008, 0x8b3: 0x0929, 0x8b4: 0x1308, 0x8b5: 0x1308, - 0x8b6: 0x1308, 0x8b7: 0x1308, 0x8b8: 0x1308, 0x8b9: 0x1308, 0x8ba: 0x0040, 0x8bb: 0x1308, - 0x8bc: 0x1308, 0x8bd: 0x0008, 0x8be: 0x0040, 0x8bf: 0x0040, - // Block 0x23, offset 0x8c0 - 0x8c0: 0x0008, 0x8c1: 0x0008, 0x8c2: 0x0008, 0x8c3: 0x09d1, 0x8c4: 0x0008, 0x8c5: 0x0008, - 0x8c6: 0x0008, 0x8c7: 0x0008, 0x8c8: 0x0040, 0x8c9: 0x0008, 0x8ca: 0x0008, 0x8cb: 0x0008, - 0x8cc: 0x0008, 0x8cd: 0x0a09, 0x8ce: 0x0008, 0x8cf: 0x0008, 0x8d0: 0x0008, 0x8d1: 0x0008, - 0x8d2: 0x0a41, 0x8d3: 0x0008, 0x8d4: 0x0008, 0x8d5: 0x0008, 0x8d6: 0x0008, 0x8d7: 0x0a79, - 0x8d8: 0x0008, 0x8d9: 0x0008, 0x8da: 0x0008, 0x8db: 0x0008, 0x8dc: 0x0ab1, 0x8dd: 0x0008, - 0x8de: 0x0008, 0x8df: 0x0008, 0x8e0: 0x0008, 0x8e1: 0x0008, 0x8e2: 0x0008, 0x8e3: 0x0008, - 0x8e4: 0x0008, 0x8e5: 0x0008, 0x8e6: 0x0008, 0x8e7: 0x0008, 0x8e8: 0x0008, 0x8e9: 0x0ae9, - 0x8ea: 0x0008, 0x8eb: 0x0008, 0x8ec: 0x0008, 0x8ed: 0x0040, 0x8ee: 0x0040, 0x8ef: 0x0040, - 0x8f0: 0x0040, 0x8f1: 0x1308, 0x8f2: 0x1308, 0x8f3: 0x0b21, 0x8f4: 0x1308, 0x8f5: 0x0b59, - 0x8f6: 0x0b91, 0x8f7: 0x0bc9, 0x8f8: 0x0c19, 0x8f9: 0x0c51, 0x8fa: 0x1308, 0x8fb: 0x1308, - 0x8fc: 0x1308, 0x8fd: 0x1308, 0x8fe: 0x1308, 0x8ff: 0x1008, - // Block 0x24, offset 0x900 - 0x900: 0x1308, 0x901: 0x0ca1, 0x902: 0x1308, 0x903: 0x1308, 0x904: 0x1b08, 0x905: 0x0018, - 0x906: 0x1308, 0x907: 0x1308, 0x908: 0x0008, 0x909: 0x0008, 0x90a: 0x0008, 0x90b: 0x0008, - 0x90c: 0x0008, 0x90d: 0x1308, 0x90e: 0x1308, 0x90f: 0x1308, 0x910: 0x1308, 0x911: 0x1308, - 0x912: 0x1308, 0x913: 0x0cd9, 0x914: 0x1308, 0x915: 0x1308, 0x916: 0x1308, 0x917: 0x1308, - 0x918: 0x0040, 0x919: 0x1308, 0x91a: 0x1308, 0x91b: 0x1308, 0x91c: 0x1308, 0x91d: 0x0d11, - 0x91e: 0x1308, 0x91f: 0x1308, 0x920: 0x1308, 0x921: 0x1308, 0x922: 0x0d49, 0x923: 0x1308, - 0x924: 0x1308, 0x925: 0x1308, 0x926: 0x1308, 0x927: 0x0d81, 0x928: 0x1308, 0x929: 0x1308, - 0x92a: 0x1308, 0x92b: 0x1308, 0x92c: 0x0db9, 0x92d: 0x1308, 0x92e: 0x1308, 0x92f: 0x1308, - 0x930: 0x1308, 0x931: 0x1308, 0x932: 0x1308, 0x933: 0x1308, 0x934: 0x1308, 0x935: 0x1308, - 0x936: 0x1308, 0x937: 0x1308, 0x938: 0x1308, 0x939: 0x0df1, 0x93a: 0x1308, 0x93b: 0x1308, - 0x93c: 0x1308, 0x93d: 0x0040, 0x93e: 0x0018, 0x93f: 0x0018, - // Block 0x25, offset 0x940 - 0x940: 0x0008, 0x941: 0x0008, 0x942: 0x0008, 0x943: 0x0008, 0x944: 0x0008, 0x945: 0x0008, - 0x946: 0x0008, 0x947: 0x0008, 0x948: 0x0008, 0x949: 0x0008, 0x94a: 0x0008, 0x94b: 0x0008, - 0x94c: 0x0008, 0x94d: 0x0008, 0x94e: 0x0008, 0x94f: 0x0008, 0x950: 0x0008, 0x951: 0x0008, - 0x952: 0x0008, 0x953: 0x0008, 0x954: 0x0008, 0x955: 0x0008, 0x956: 0x0008, 0x957: 0x0008, - 0x958: 0x0008, 0x959: 0x0008, 0x95a: 0x0008, 0x95b: 0x0008, 0x95c: 0x0008, 0x95d: 0x0008, - 0x95e: 0x0008, 0x95f: 0x0008, 0x960: 0x0008, 0x961: 0x0008, 0x962: 0x0008, 0x963: 0x0008, - 0x964: 0x0008, 0x965: 0x0008, 0x966: 0x0008, 0x967: 0x0008, 0x968: 0x0008, 0x969: 0x0008, - 0x96a: 0x0008, 0x96b: 0x0008, 0x96c: 0x0039, 0x96d: 0x0ed1, 0x96e: 0x0ee9, 0x96f: 0x0008, - 0x970: 0x0ef9, 0x971: 0x0f09, 0x972: 0x0f19, 0x973: 0x0f31, 0x974: 0x0249, 0x975: 0x0f41, - 0x976: 0x0259, 0x977: 0x0f51, 0x978: 0x0359, 0x979: 0x0f61, 0x97a: 0x0f71, 0x97b: 0x0008, - 0x97c: 0x00d9, 0x97d: 0x0f81, 0x97e: 0x0f99, 0x97f: 0x0269, - // Block 0x26, offset 0x980 - 0x980: 0x0fa9, 0x981: 0x0fb9, 0x982: 0x0279, 0x983: 0x0039, 0x984: 0x0fc9, 0x985: 0x0fe1, - 0x986: 0x059d, 0x987: 0x0ee9, 0x988: 0x0ef9, 0x989: 0x0f09, 0x98a: 0x0ff9, 0x98b: 0x1011, - 0x98c: 0x1029, 0x98d: 0x0f31, 0x98e: 0x0008, 0x98f: 0x0f51, 0x990: 0x0f61, 0x991: 0x1041, - 0x992: 0x00d9, 0x993: 0x1059, 0x994: 0x05b5, 0x995: 0x05b5, 0x996: 0x0f99, 0x997: 0x0fa9, - 0x998: 0x0fb9, 0x999: 0x059d, 0x99a: 0x1071, 0x99b: 0x1089, 0x99c: 0x05cd, 0x99d: 0x1099, - 0x99e: 0x10b1, 0x99f: 0x10c9, 0x9a0: 0x10e1, 0x9a1: 0x10f9, 0x9a2: 0x0f41, 0x9a3: 0x0269, - 0x9a4: 0x0fb9, 0x9a5: 0x1089, 0x9a6: 0x1099, 0x9a7: 0x10b1, 0x9a8: 0x1111, 0x9a9: 0x10e1, - 0x9aa: 0x10f9, 0x9ab: 0x0008, 0x9ac: 0x0008, 0x9ad: 0x0008, 0x9ae: 0x0008, 0x9af: 0x0008, - 0x9b0: 0x0008, 0x9b1: 0x0008, 0x9b2: 0x0008, 0x9b3: 0x0008, 0x9b4: 0x0008, 0x9b5: 0x0008, - 0x9b6: 0x0008, 0x9b7: 0x0008, 0x9b8: 0x1129, 0x9b9: 0x0008, 0x9ba: 0x0008, 0x9bb: 0x0008, - 0x9bc: 0x0008, 0x9bd: 0x0008, 0x9be: 0x0008, 0x9bf: 0x0008, - // Block 0x27, offset 0x9c0 - 0x9c0: 0x0008, 0x9c1: 0x0008, 0x9c2: 0x0008, 0x9c3: 0x0008, 0x9c4: 0x0008, 0x9c5: 0x0008, - 0x9c6: 0x0008, 0x9c7: 0x0008, 0x9c8: 0x0008, 0x9c9: 0x0008, 0x9ca: 0x0008, 0x9cb: 0x0008, - 0x9cc: 0x0008, 0x9cd: 0x0008, 0x9ce: 0x0008, 0x9cf: 0x0008, 0x9d0: 0x0008, 0x9d1: 0x0008, - 0x9d2: 0x0008, 0x9d3: 0x0008, 0x9d4: 0x0008, 0x9d5: 0x0008, 0x9d6: 0x0008, 0x9d7: 0x0008, - 0x9d8: 0x0008, 0x9d9: 0x0008, 0x9da: 0x0008, 0x9db: 0x1141, 0x9dc: 0x1159, 0x9dd: 0x1169, - 0x9de: 0x1181, 0x9df: 0x1029, 0x9e0: 0x1199, 0x9e1: 0x11a9, 0x9e2: 0x11c1, 0x9e3: 0x11d9, - 0x9e4: 0x11f1, 0x9e5: 0x1209, 0x9e6: 0x1221, 0x9e7: 0x05e5, 0x9e8: 0x1239, 0x9e9: 0x1251, - 0x9ea: 0xe17d, 0x9eb: 0x1269, 0x9ec: 0x1281, 0x9ed: 0x1299, 0x9ee: 0x12b1, 0x9ef: 0x12c9, - 0x9f0: 0x12e1, 0x9f1: 0x12f9, 0x9f2: 0x1311, 0x9f3: 0x1329, 0x9f4: 0x1341, 0x9f5: 0x1359, - 0x9f6: 0x1371, 0x9f7: 0x1389, 0x9f8: 0x05fd, 0x9f9: 0x13a1, 0x9fa: 0x13b9, 0x9fb: 0x13d1, - 0x9fc: 0x13e1, 0x9fd: 0x13f9, 0x9fe: 0x1411, 0x9ff: 0x1429, - // Block 0x28, offset 0xa00 - 0xa00: 0xe00d, 0xa01: 0x0008, 0xa02: 0xe00d, 0xa03: 0x0008, 0xa04: 0xe00d, 0xa05: 0x0008, - 0xa06: 0xe00d, 0xa07: 0x0008, 0xa08: 0xe00d, 0xa09: 0x0008, 0xa0a: 0xe00d, 0xa0b: 0x0008, - 0xa0c: 0xe00d, 0xa0d: 0x0008, 0xa0e: 0xe00d, 0xa0f: 0x0008, 0xa10: 0xe00d, 0xa11: 0x0008, - 0xa12: 0xe00d, 0xa13: 0x0008, 0xa14: 0xe00d, 0xa15: 0x0008, 0xa16: 0xe00d, 0xa17: 0x0008, - 0xa18: 0xe00d, 0xa19: 0x0008, 0xa1a: 0xe00d, 0xa1b: 0x0008, 0xa1c: 0xe00d, 0xa1d: 0x0008, - 0xa1e: 0xe00d, 0xa1f: 0x0008, 0xa20: 0xe00d, 0xa21: 0x0008, 0xa22: 0xe00d, 0xa23: 0x0008, - 0xa24: 0xe00d, 0xa25: 0x0008, 0xa26: 0xe00d, 0xa27: 0x0008, 0xa28: 0xe00d, 0xa29: 0x0008, - 0xa2a: 0xe00d, 0xa2b: 0x0008, 0xa2c: 0xe00d, 0xa2d: 0x0008, 0xa2e: 0xe00d, 0xa2f: 0x0008, - 0xa30: 0xe00d, 0xa31: 0x0008, 0xa32: 0xe00d, 0xa33: 0x0008, 0xa34: 0xe00d, 0xa35: 0x0008, - 0xa36: 0xe00d, 0xa37: 0x0008, 0xa38: 0xe00d, 0xa39: 0x0008, 0xa3a: 0xe00d, 0xa3b: 0x0008, - 0xa3c: 0xe00d, 0xa3d: 0x0008, 0xa3e: 0xe00d, 0xa3f: 0x0008, - // Block 0x29, offset 0xa40 - 0xa40: 0xe00d, 0xa41: 0x0008, 0xa42: 0xe00d, 0xa43: 0x0008, 0xa44: 0xe00d, 0xa45: 0x0008, - 0xa46: 0xe00d, 0xa47: 0x0008, 0xa48: 0xe00d, 0xa49: 0x0008, 0xa4a: 0xe00d, 0xa4b: 0x0008, - 0xa4c: 0xe00d, 0xa4d: 0x0008, 0xa4e: 0xe00d, 0xa4f: 0x0008, 0xa50: 0xe00d, 0xa51: 0x0008, - 0xa52: 0xe00d, 0xa53: 0x0008, 0xa54: 0xe00d, 0xa55: 0x0008, 0xa56: 0x0008, 0xa57: 0x0008, - 0xa58: 0x0008, 0xa59: 0x0008, 0xa5a: 0x0615, 0xa5b: 0x0635, 0xa5c: 0x0008, 0xa5d: 0x0008, - 0xa5e: 0x1441, 0xa5f: 0x0008, 0xa60: 0xe00d, 0xa61: 0x0008, 0xa62: 0xe00d, 0xa63: 0x0008, - 0xa64: 0xe00d, 0xa65: 0x0008, 0xa66: 0xe00d, 0xa67: 0x0008, 0xa68: 0xe00d, 0xa69: 0x0008, - 0xa6a: 0xe00d, 0xa6b: 0x0008, 0xa6c: 0xe00d, 0xa6d: 0x0008, 0xa6e: 0xe00d, 0xa6f: 0x0008, - 0xa70: 0xe00d, 0xa71: 0x0008, 0xa72: 0xe00d, 0xa73: 0x0008, 0xa74: 0xe00d, 0xa75: 0x0008, - 0xa76: 0xe00d, 0xa77: 0x0008, 0xa78: 0xe00d, 0xa79: 0x0008, 0xa7a: 0xe00d, 0xa7b: 0x0008, - 0xa7c: 0xe00d, 0xa7d: 0x0008, 0xa7e: 0xe00d, 0xa7f: 0x0008, - // Block 0x2a, offset 0xa80 - 0xa80: 0x0008, 0xa81: 0x0008, 0xa82: 0x0008, 0xa83: 0x0008, 0xa84: 0x0008, 0xa85: 0x0008, - 0xa86: 0x0040, 0xa87: 0x0040, 0xa88: 0xe045, 0xa89: 0xe045, 0xa8a: 0xe045, 0xa8b: 0xe045, - 0xa8c: 0xe045, 0xa8d: 0xe045, 0xa8e: 0x0040, 0xa8f: 0x0040, 0xa90: 0x0008, 0xa91: 0x0008, - 0xa92: 0x0008, 0xa93: 0x0008, 0xa94: 0x0008, 0xa95: 0x0008, 0xa96: 0x0008, 0xa97: 0x0008, - 0xa98: 0x0040, 0xa99: 0xe045, 0xa9a: 0x0040, 0xa9b: 0xe045, 0xa9c: 0x0040, 0xa9d: 0xe045, - 0xa9e: 0x0040, 0xa9f: 0xe045, 0xaa0: 0x0008, 0xaa1: 0x0008, 0xaa2: 0x0008, 0xaa3: 0x0008, - 0xaa4: 0x0008, 0xaa5: 0x0008, 0xaa6: 0x0008, 0xaa7: 0x0008, 0xaa8: 0xe045, 0xaa9: 0xe045, - 0xaaa: 0xe045, 0xaab: 0xe045, 0xaac: 0xe045, 0xaad: 0xe045, 0xaae: 0xe045, 0xaaf: 0xe045, - 0xab0: 0x0008, 0xab1: 0x1459, 0xab2: 0x0008, 0xab3: 0x1471, 0xab4: 0x0008, 0xab5: 0x1489, - 0xab6: 0x0008, 0xab7: 0x14a1, 0xab8: 0x0008, 0xab9: 0x14b9, 0xaba: 0x0008, 0xabb: 0x14d1, - 0xabc: 0x0008, 0xabd: 0x14e9, 0xabe: 0x0040, 0xabf: 0x0040, - // Block 0x2b, offset 0xac0 - 0xac0: 0x1501, 0xac1: 0x1531, 0xac2: 0x1561, 0xac3: 0x1591, 0xac4: 0x15c1, 0xac5: 0x15f1, - 0xac6: 0x1621, 0xac7: 0x1651, 0xac8: 0x1501, 0xac9: 0x1531, 0xaca: 0x1561, 0xacb: 0x1591, - 0xacc: 0x15c1, 0xacd: 0x15f1, 0xace: 0x1621, 0xacf: 0x1651, 0xad0: 0x1681, 0xad1: 0x16b1, - 0xad2: 0x16e1, 0xad3: 0x1711, 0xad4: 0x1741, 0xad5: 0x1771, 0xad6: 0x17a1, 0xad7: 0x17d1, - 0xad8: 0x1681, 0xad9: 0x16b1, 0xada: 0x16e1, 0xadb: 0x1711, 0xadc: 0x1741, 0xadd: 0x1771, - 0xade: 0x17a1, 0xadf: 0x17d1, 0xae0: 0x1801, 0xae1: 0x1831, 0xae2: 0x1861, 0xae3: 0x1891, - 0xae4: 0x18c1, 0xae5: 0x18f1, 0xae6: 0x1921, 0xae7: 0x1951, 0xae8: 0x1801, 0xae9: 0x1831, - 0xaea: 0x1861, 0xaeb: 0x1891, 0xaec: 0x18c1, 0xaed: 0x18f1, 0xaee: 0x1921, 0xaef: 0x1951, - 0xaf0: 0x0008, 0xaf1: 0x0008, 0xaf2: 0x1981, 0xaf3: 0x19b1, 0xaf4: 0x19d9, 0xaf5: 0x0040, - 0xaf6: 0x0008, 0xaf7: 0x1a01, 0xaf8: 0xe045, 0xaf9: 0xe045, 0xafa: 0x064d, 0xafb: 0x1459, - 0xafc: 0x19b1, 0xafd: 0x0666, 0xafe: 0x1a31, 0xaff: 0x0686, - // Block 0x2c, offset 0xb00 - 0xb00: 0x06a6, 0xb01: 0x1a4a, 0xb02: 0x1a79, 0xb03: 0x1aa9, 0xb04: 0x1ad1, 0xb05: 0x0040, - 0xb06: 0x0008, 0xb07: 0x1af9, 0xb08: 0x06c5, 0xb09: 0x1471, 0xb0a: 0x06dd, 0xb0b: 0x1489, - 0xb0c: 0x1aa9, 0xb0d: 0x1b2a, 0xb0e: 0x1b5a, 0xb0f: 0x1b8a, 0xb10: 0x0008, 0xb11: 0x0008, - 0xb12: 0x0008, 0xb13: 0x1bb9, 0xb14: 0x0040, 0xb15: 0x0040, 0xb16: 0x0008, 0xb17: 0x0008, - 0xb18: 0xe045, 0xb19: 0xe045, 0xb1a: 0x06f5, 0xb1b: 0x14a1, 0xb1c: 0x0040, 0xb1d: 0x1bd2, - 0xb1e: 0x1c02, 0xb1f: 0x1c32, 0xb20: 0x0008, 0xb21: 0x0008, 0xb22: 0x0008, 0xb23: 0x1c61, - 0xb24: 0x0008, 0xb25: 0x0008, 0xb26: 0x0008, 0xb27: 0x0008, 0xb28: 0xe045, 0xb29: 0xe045, - 0xb2a: 0x070d, 0xb2b: 0x14d1, 0xb2c: 0xe04d, 0xb2d: 0x1c7a, 0xb2e: 0x03d2, 0xb2f: 0x1caa, - 0xb30: 0x0040, 0xb31: 0x0040, 0xb32: 0x1cb9, 0xb33: 0x1ce9, 0xb34: 0x1d11, 0xb35: 0x0040, - 0xb36: 0x0008, 0xb37: 0x1d39, 0xb38: 0x0725, 0xb39: 0x14b9, 0xb3a: 0x0515, 0xb3b: 0x14e9, - 0xb3c: 0x1ce9, 0xb3d: 0x073e, 0xb3e: 0x075e, 0xb3f: 0x0040, - // Block 0x2d, offset 0xb40 - 0xb40: 0x000a, 0xb41: 0x000a, 0xb42: 0x000a, 0xb43: 0x000a, 0xb44: 0x000a, 0xb45: 0x000a, - 0xb46: 0x000a, 0xb47: 0x000a, 0xb48: 0x000a, 0xb49: 0x000a, 0xb4a: 0x000a, 0xb4b: 0x03c0, - 0xb4c: 0x0003, 0xb4d: 0x0003, 0xb4e: 0x0340, 0xb4f: 0x0340, 0xb50: 0x0018, 0xb51: 0xe00d, - 0xb52: 0x0018, 0xb53: 0x0018, 0xb54: 0x0018, 0xb55: 0x0018, 0xb56: 0x0018, 0xb57: 0x077e, - 0xb58: 0x0018, 0xb59: 0x0018, 0xb5a: 0x0018, 0xb5b: 0x0018, 0xb5c: 0x0018, 0xb5d: 0x0018, - 0xb5e: 0x0018, 0xb5f: 0x0018, 0xb60: 0x0018, 0xb61: 0x0018, 0xb62: 0x0018, 0xb63: 0x0018, - 0xb64: 0x0040, 0xb65: 0x0040, 0xb66: 0x0040, 0xb67: 0x0018, 0xb68: 0x0040, 0xb69: 0x0040, - 0xb6a: 0x0340, 0xb6b: 0x0340, 0xb6c: 0x0340, 0xb6d: 0x0340, 0xb6e: 0x0340, 0xb6f: 0x000a, - 0xb70: 0x0018, 0xb71: 0x0018, 0xb72: 0x0018, 0xb73: 0x1d69, 0xb74: 0x1da1, 0xb75: 0x0018, - 0xb76: 0x1df1, 0xb77: 0x1e29, 0xb78: 0x0018, 0xb79: 0x0018, 0xb7a: 0x0018, 0xb7b: 0x0018, - 0xb7c: 0x1e7a, 0xb7d: 0x0018, 0xb7e: 0x079e, 0xb7f: 0x0018, - // Block 0x2e, offset 0xb80 - 0xb80: 0x0018, 0xb81: 0x0018, 0xb82: 0x0018, 0xb83: 0x0018, 0xb84: 0x0018, 0xb85: 0x0018, - 0xb86: 0x0018, 0xb87: 0x1e92, 0xb88: 0x1eaa, 0xb89: 0x1ec2, 0xb8a: 0x0018, 0xb8b: 0x0018, - 0xb8c: 0x0018, 0xb8d: 0x0018, 0xb8e: 0x0018, 0xb8f: 0x0018, 0xb90: 0x0018, 0xb91: 0x0018, - 0xb92: 0x0018, 0xb93: 0x0018, 0xb94: 0x0018, 0xb95: 0x0018, 0xb96: 0x0018, 0xb97: 0x1ed9, - 0xb98: 0x0018, 0xb99: 0x0018, 0xb9a: 0x0018, 0xb9b: 0x0018, 0xb9c: 0x0018, 0xb9d: 0x0018, - 0xb9e: 0x0018, 0xb9f: 0x000a, 0xba0: 0x03c0, 0xba1: 0x0340, 0xba2: 0x0340, 0xba3: 0x0340, - 0xba4: 0x03c0, 0xba5: 0x0040, 0xba6: 0x0040, 0xba7: 0x0040, 0xba8: 0x0040, 0xba9: 0x0040, - 0xbaa: 0x0340, 0xbab: 0x0340, 0xbac: 0x0340, 0xbad: 0x0340, 0xbae: 0x0340, 0xbaf: 0x0340, - 0xbb0: 0x1f41, 0xbb1: 0x0f41, 0xbb2: 0x0040, 0xbb3: 0x0040, 0xbb4: 0x1f51, 0xbb5: 0x1f61, - 0xbb6: 0x1f71, 0xbb7: 0x1f81, 0xbb8: 0x1f91, 0xbb9: 0x1fa1, 0xbba: 0x1fb2, 0xbbb: 0x07bd, - 0xbbc: 0x1fc2, 0xbbd: 0x1fd2, 0xbbe: 0x1fe2, 0xbbf: 0x0f71, - // Block 0x2f, offset 0xbc0 - 0xbc0: 0x1f41, 0xbc1: 0x00c9, 0xbc2: 0x0069, 0xbc3: 0x0079, 0xbc4: 0x1f51, 0xbc5: 0x1f61, - 0xbc6: 0x1f71, 0xbc7: 0x1f81, 0xbc8: 0x1f91, 0xbc9: 0x1fa1, 0xbca: 0x1fb2, 0xbcb: 0x07d5, - 0xbcc: 0x1fc2, 0xbcd: 0x1fd2, 0xbce: 0x1fe2, 0xbcf: 0x0040, 0xbd0: 0x0039, 0xbd1: 0x0f09, - 0xbd2: 0x00d9, 0xbd3: 0x0369, 0xbd4: 0x0ff9, 0xbd5: 0x0249, 0xbd6: 0x0f51, 0xbd7: 0x0359, - 0xbd8: 0x0f61, 0xbd9: 0x0f71, 0xbda: 0x0f99, 0xbdb: 0x01d9, 0xbdc: 0x0fa9, 0xbdd: 0x0040, - 0xbde: 0x0040, 0xbdf: 0x0040, 0xbe0: 0x0018, 0xbe1: 0x0018, 0xbe2: 0x0018, 0xbe3: 0x0018, - 0xbe4: 0x0018, 0xbe5: 0x0018, 0xbe6: 0x0018, 0xbe7: 0x0018, 0xbe8: 0x1ff1, 0xbe9: 0x0018, - 0xbea: 0x0018, 0xbeb: 0x0018, 0xbec: 0x0018, 0xbed: 0x0018, 0xbee: 0x0018, 0xbef: 0x0018, - 0xbf0: 0x0018, 0xbf1: 0x0018, 0xbf2: 0x0018, 0xbf3: 0x0018, 0xbf4: 0x0018, 0xbf5: 0x0018, - 0xbf6: 0x0018, 0xbf7: 0x0018, 0xbf8: 0x0018, 0xbf9: 0x0018, 0xbfa: 0x0018, 0xbfb: 0x0018, - 0xbfc: 0x0018, 0xbfd: 0x0018, 0xbfe: 0x0018, 0xbff: 0x0040, - // Block 0x30, offset 0xc00 - 0xc00: 0x07ee, 0xc01: 0x080e, 0xc02: 0x1159, 0xc03: 0x082d, 0xc04: 0x0018, 0xc05: 0x084e, - 0xc06: 0x086e, 0xc07: 0x1011, 0xc08: 0x0018, 0xc09: 0x088d, 0xc0a: 0x0f31, 0xc0b: 0x0249, - 0xc0c: 0x0249, 0xc0d: 0x0249, 0xc0e: 0x0249, 0xc0f: 0x2009, 0xc10: 0x0f41, 0xc11: 0x0f41, - 0xc12: 0x0359, 0xc13: 0x0359, 0xc14: 0x0018, 0xc15: 0x0f71, 0xc16: 0x2021, 0xc17: 0x0018, - 0xc18: 0x0018, 0xc19: 0x0f99, 0xc1a: 0x2039, 0xc1b: 0x0269, 0xc1c: 0x0269, 0xc1d: 0x0269, - 0xc1e: 0x0018, 0xc1f: 0x0018, 0xc20: 0x2049, 0xc21: 0x08ad, 0xc22: 0x2061, 0xc23: 0x0018, - 0xc24: 0x13d1, 0xc25: 0x0018, 0xc26: 0x2079, 0xc27: 0x0018, 0xc28: 0x13d1, 0xc29: 0x0018, - 0xc2a: 0x0f51, 0xc2b: 0x2091, 0xc2c: 0x0ee9, 0xc2d: 0x1159, 0xc2e: 0x0018, 0xc2f: 0x0f09, - 0xc30: 0x0f09, 0xc31: 0x1199, 0xc32: 0x0040, 0xc33: 0x0f61, 0xc34: 0x00d9, 0xc35: 0x20a9, - 0xc36: 0x20c1, 0xc37: 0x20d9, 0xc38: 0x20f1, 0xc39: 0x0f41, 0xc3a: 0x0018, 0xc3b: 0x08cd, - 0xc3c: 0x2109, 0xc3d: 0x10b1, 0xc3e: 0x10b1, 0xc3f: 0x2109, - // Block 0x31, offset 0xc40 - 0xc40: 0x08ed, 0xc41: 0x0018, 0xc42: 0x0018, 0xc43: 0x0018, 0xc44: 0x0018, 0xc45: 0x0ef9, - 0xc46: 0x0ef9, 0xc47: 0x0f09, 0xc48: 0x0f41, 0xc49: 0x0259, 0xc4a: 0x0018, 0xc4b: 0x0018, - 0xc4c: 0x0018, 0xc4d: 0x0018, 0xc4e: 0x0008, 0xc4f: 0x0018, 0xc50: 0x2121, 0xc51: 0x2151, - 0xc52: 0x2181, 0xc53: 0x21b9, 0xc54: 0x21e9, 0xc55: 0x2219, 0xc56: 0x2249, 0xc57: 0x2279, - 0xc58: 0x22a9, 0xc59: 0x22d9, 0xc5a: 0x2309, 0xc5b: 0x2339, 0xc5c: 0x2369, 0xc5d: 0x2399, - 0xc5e: 0x23c9, 0xc5f: 0x23f9, 0xc60: 0x0f41, 0xc61: 0x2421, 0xc62: 0x0905, 0xc63: 0x2439, - 0xc64: 0x1089, 0xc65: 0x2451, 0xc66: 0x0925, 0xc67: 0x2469, 0xc68: 0x2491, 0xc69: 0x0369, - 0xc6a: 0x24a9, 0xc6b: 0x0945, 0xc6c: 0x0359, 0xc6d: 0x1159, 0xc6e: 0x0ef9, 0xc6f: 0x0f61, - 0xc70: 0x0f41, 0xc71: 0x2421, 0xc72: 0x0965, 0xc73: 0x2439, 0xc74: 0x1089, 0xc75: 0x2451, - 0xc76: 0x0985, 0xc77: 0x2469, 0xc78: 0x2491, 0xc79: 0x0369, 0xc7a: 0x24a9, 0xc7b: 0x09a5, - 0xc7c: 0x0359, 0xc7d: 0x1159, 0xc7e: 0x0ef9, 0xc7f: 0x0f61, - // Block 0x32, offset 0xc80 - 0xc80: 0x0018, 0xc81: 0x0018, 0xc82: 0x0018, 0xc83: 0x0018, 0xc84: 0x0018, 0xc85: 0x0018, - 0xc86: 0x0018, 0xc87: 0x0018, 0xc88: 0x0018, 0xc89: 0x0018, 0xc8a: 0x0018, 0xc8b: 0x0040, - 0xc8c: 0x0040, 0xc8d: 0x0040, 0xc8e: 0x0040, 0xc8f: 0x0040, 0xc90: 0x0040, 0xc91: 0x0040, - 0xc92: 0x0040, 0xc93: 0x0040, 0xc94: 0x0040, 0xc95: 0x0040, 0xc96: 0x0040, 0xc97: 0x0040, - 0xc98: 0x0040, 0xc99: 0x0040, 0xc9a: 0x0040, 0xc9b: 0x0040, 0xc9c: 0x0040, 0xc9d: 0x0040, - 0xc9e: 0x0040, 0xc9f: 0x0040, 0xca0: 0x00c9, 0xca1: 0x0069, 0xca2: 0x0079, 0xca3: 0x1f51, - 0xca4: 0x1f61, 0xca5: 0x1f71, 0xca6: 0x1f81, 0xca7: 0x1f91, 0xca8: 0x1fa1, 0xca9: 0x2601, - 0xcaa: 0x2619, 0xcab: 0x2631, 0xcac: 0x2649, 0xcad: 0x2661, 0xcae: 0x2679, 0xcaf: 0x2691, - 0xcb0: 0x26a9, 0xcb1: 0x26c1, 0xcb2: 0x26d9, 0xcb3: 0x26f1, 0xcb4: 0x0a06, 0xcb5: 0x0a26, - 0xcb6: 0x0a46, 0xcb7: 0x0a66, 0xcb8: 0x0a86, 0xcb9: 0x0aa6, 0xcba: 0x0ac6, 0xcbb: 0x0ae6, - 0xcbc: 0x0b06, 0xcbd: 0x270a, 0xcbe: 0x2732, 0xcbf: 0x275a, - // Block 0x33, offset 0xcc0 - 0xcc0: 0x2782, 0xcc1: 0x27aa, 0xcc2: 0x27d2, 0xcc3: 0x27fa, 0xcc4: 0x2822, 0xcc5: 0x284a, - 0xcc6: 0x2872, 0xcc7: 0x289a, 0xcc8: 0x0040, 0xcc9: 0x0040, 0xcca: 0x0040, 0xccb: 0x0040, - 0xccc: 0x0040, 0xccd: 0x0040, 0xcce: 0x0040, 0xccf: 0x0040, 0xcd0: 0x0040, 0xcd1: 0x0040, - 0xcd2: 0x0040, 0xcd3: 0x0040, 0xcd4: 0x0040, 0xcd5: 0x0040, 0xcd6: 0x0040, 0xcd7: 0x0040, - 0xcd8: 0x0040, 0xcd9: 0x0040, 0xcda: 0x0040, 0xcdb: 0x0040, 0xcdc: 0x0b26, 0xcdd: 0x0b46, - 0xcde: 0x0b66, 0xcdf: 0x0b86, 0xce0: 0x0ba6, 0xce1: 0x0bc6, 0xce2: 0x0be6, 0xce3: 0x0c06, - 0xce4: 0x0c26, 0xce5: 0x0c46, 0xce6: 0x0c66, 0xce7: 0x0c86, 0xce8: 0x0ca6, 0xce9: 0x0cc6, - 0xcea: 0x0ce6, 0xceb: 0x0d06, 0xcec: 0x0d26, 0xced: 0x0d46, 0xcee: 0x0d66, 0xcef: 0x0d86, - 0xcf0: 0x0da6, 0xcf1: 0x0dc6, 0xcf2: 0x0de6, 0xcf3: 0x0e06, 0xcf4: 0x0e26, 0xcf5: 0x0e46, - 0xcf6: 0x0039, 0xcf7: 0x0ee9, 0xcf8: 0x1159, 0xcf9: 0x0ef9, 0xcfa: 0x0f09, 0xcfb: 0x1199, - 0xcfc: 0x0f31, 0xcfd: 0x0249, 0xcfe: 0x0f41, 0xcff: 0x0259, - // Block 0x34, offset 0xd00 - 0xd00: 0x0f51, 0xd01: 0x0359, 0xd02: 0x0f61, 0xd03: 0x0f71, 0xd04: 0x00d9, 0xd05: 0x0f99, - 0xd06: 0x2039, 0xd07: 0x0269, 0xd08: 0x01d9, 0xd09: 0x0fa9, 0xd0a: 0x0fb9, 0xd0b: 0x1089, - 0xd0c: 0x0279, 0xd0d: 0x0369, 0xd0e: 0x0289, 0xd0f: 0x13d1, 0xd10: 0x0039, 0xd11: 0x0ee9, - 0xd12: 0x1159, 0xd13: 0x0ef9, 0xd14: 0x0f09, 0xd15: 0x1199, 0xd16: 0x0f31, 0xd17: 0x0249, - 0xd18: 0x0f41, 0xd19: 0x0259, 0xd1a: 0x0f51, 0xd1b: 0x0359, 0xd1c: 0x0f61, 0xd1d: 0x0f71, - 0xd1e: 0x00d9, 0xd1f: 0x0f99, 0xd20: 0x2039, 0xd21: 0x0269, 0xd22: 0x01d9, 0xd23: 0x0fa9, - 0xd24: 0x0fb9, 0xd25: 0x1089, 0xd26: 0x0279, 0xd27: 0x0369, 0xd28: 0x0289, 0xd29: 0x13d1, - 0xd2a: 0x1f41, 0xd2b: 0x0018, 0xd2c: 0x0018, 0xd2d: 0x0018, 0xd2e: 0x0018, 0xd2f: 0x0018, - 0xd30: 0x0018, 0xd31: 0x0018, 0xd32: 0x0018, 0xd33: 0x0018, 0xd34: 0x0018, 0xd35: 0x0018, - 0xd36: 0x0018, 0xd37: 0x0018, 0xd38: 0x0018, 0xd39: 0x0018, 0xd3a: 0x0018, 0xd3b: 0x0018, - 0xd3c: 0x0018, 0xd3d: 0x0018, 0xd3e: 0x0018, 0xd3f: 0x0018, - // Block 0x35, offset 0xd40 - 0xd40: 0x0008, 0xd41: 0x0008, 0xd42: 0x0008, 0xd43: 0x0008, 0xd44: 0x0008, 0xd45: 0x0008, - 0xd46: 0x0008, 0xd47: 0x0008, 0xd48: 0x0008, 0xd49: 0x0008, 0xd4a: 0x0008, 0xd4b: 0x0008, - 0xd4c: 0x0008, 0xd4d: 0x0008, 0xd4e: 0x0008, 0xd4f: 0x0008, 0xd50: 0x0008, 0xd51: 0x0008, - 0xd52: 0x0008, 0xd53: 0x0008, 0xd54: 0x0008, 0xd55: 0x0008, 0xd56: 0x0008, 0xd57: 0x0008, - 0xd58: 0x0008, 0xd59: 0x0008, 0xd5a: 0x0008, 0xd5b: 0x0008, 0xd5c: 0x0008, 0xd5d: 0x0008, - 0xd5e: 0x0008, 0xd5f: 0x0040, 0xd60: 0xe00d, 0xd61: 0x0008, 0xd62: 0x2971, 0xd63: 0x0ebd, - 0xd64: 0x2989, 0xd65: 0x0008, 0xd66: 0x0008, 0xd67: 0xe07d, 0xd68: 0x0008, 0xd69: 0xe01d, - 0xd6a: 0x0008, 0xd6b: 0xe03d, 0xd6c: 0x0008, 0xd6d: 0x0fe1, 0xd6e: 0x1281, 0xd6f: 0x0fc9, - 0xd70: 0x1141, 0xd71: 0x0008, 0xd72: 0xe00d, 0xd73: 0x0008, 0xd74: 0x0008, 0xd75: 0xe01d, - 0xd76: 0x0008, 0xd77: 0x0008, 0xd78: 0x0008, 0xd79: 0x0008, 0xd7a: 0x0008, 0xd7b: 0x0008, - 0xd7c: 0x0259, 0xd7d: 0x1089, 0xd7e: 0x29a1, 0xd7f: 0x29b9, - // Block 0x36, offset 0xd80 - 0xd80: 0xe00d, 0xd81: 0x0008, 0xd82: 0xe00d, 0xd83: 0x0008, 0xd84: 0xe00d, 0xd85: 0x0008, - 0xd86: 0xe00d, 0xd87: 0x0008, 0xd88: 0xe00d, 0xd89: 0x0008, 0xd8a: 0xe00d, 0xd8b: 0x0008, - 0xd8c: 0xe00d, 0xd8d: 0x0008, 0xd8e: 0xe00d, 0xd8f: 0x0008, 0xd90: 0xe00d, 0xd91: 0x0008, - 0xd92: 0xe00d, 0xd93: 0x0008, 0xd94: 0xe00d, 0xd95: 0x0008, 0xd96: 0xe00d, 0xd97: 0x0008, - 0xd98: 0xe00d, 0xd99: 0x0008, 0xd9a: 0xe00d, 0xd9b: 0x0008, 0xd9c: 0xe00d, 0xd9d: 0x0008, - 0xd9e: 0xe00d, 0xd9f: 0x0008, 0xda0: 0xe00d, 0xda1: 0x0008, 0xda2: 0xe00d, 0xda3: 0x0008, - 0xda4: 0x0008, 0xda5: 0x0018, 0xda6: 0x0018, 0xda7: 0x0018, 0xda8: 0x0018, 0xda9: 0x0018, - 0xdaa: 0x0018, 0xdab: 0xe03d, 0xdac: 0x0008, 0xdad: 0xe01d, 0xdae: 0x0008, 0xdaf: 0x1308, - 0xdb0: 0x1308, 0xdb1: 0x1308, 0xdb2: 0xe00d, 0xdb3: 0x0008, 0xdb4: 0x0040, 0xdb5: 0x0040, - 0xdb6: 0x0040, 0xdb7: 0x0040, 0xdb8: 0x0040, 0xdb9: 0x0018, 0xdba: 0x0018, 0xdbb: 0x0018, - 0xdbc: 0x0018, 0xdbd: 0x0018, 0xdbe: 0x0018, 0xdbf: 0x0018, - // Block 0x37, offset 0xdc0 - 0xdc0: 0x26fd, 0xdc1: 0x271d, 0xdc2: 0x273d, 0xdc3: 0x275d, 0xdc4: 0x277d, 0xdc5: 0x279d, - 0xdc6: 0x27bd, 0xdc7: 0x27dd, 0xdc8: 0x27fd, 0xdc9: 0x281d, 0xdca: 0x283d, 0xdcb: 0x285d, - 0xdcc: 0x287d, 0xdcd: 0x289d, 0xdce: 0x28bd, 0xdcf: 0x28dd, 0xdd0: 0x28fd, 0xdd1: 0x291d, - 0xdd2: 0x293d, 0xdd3: 0x295d, 0xdd4: 0x297d, 0xdd5: 0x299d, 0xdd6: 0x0040, 0xdd7: 0x0040, - 0xdd8: 0x0040, 0xdd9: 0x0040, 0xdda: 0x0040, 0xddb: 0x0040, 0xddc: 0x0040, 0xddd: 0x0040, - 0xdde: 0x0040, 0xddf: 0x0040, 0xde0: 0x0040, 0xde1: 0x0040, 0xde2: 0x0040, 0xde3: 0x0040, - 0xde4: 0x0040, 0xde5: 0x0040, 0xde6: 0x0040, 0xde7: 0x0040, 0xde8: 0x0040, 0xde9: 0x0040, - 0xdea: 0x0040, 0xdeb: 0x0040, 0xdec: 0x0040, 0xded: 0x0040, 0xdee: 0x0040, 0xdef: 0x0040, - 0xdf0: 0x0040, 0xdf1: 0x0040, 0xdf2: 0x0040, 0xdf3: 0x0040, 0xdf4: 0x0040, 0xdf5: 0x0040, - 0xdf6: 0x0040, 0xdf7: 0x0040, 0xdf8: 0x0040, 0xdf9: 0x0040, 0xdfa: 0x0040, 0xdfb: 0x0040, - 0xdfc: 0x0040, 0xdfd: 0x0040, 0xdfe: 0x0040, 0xdff: 0x0040, - // Block 0x38, offset 0xe00 - 0xe00: 0x000a, 0xe01: 0x0018, 0xe02: 0x29d1, 0xe03: 0x0018, 0xe04: 0x0018, 0xe05: 0x0008, - 0xe06: 0x0008, 0xe07: 0x0008, 0xe08: 0x0018, 0xe09: 0x0018, 0xe0a: 0x0018, 0xe0b: 0x0018, - 0xe0c: 0x0018, 0xe0d: 0x0018, 0xe0e: 0x0018, 0xe0f: 0x0018, 0xe10: 0x0018, 0xe11: 0x0018, - 0xe12: 0x0018, 0xe13: 0x0018, 0xe14: 0x0018, 0xe15: 0x0018, 0xe16: 0x0018, 0xe17: 0x0018, - 0xe18: 0x0018, 0xe19: 0x0018, 0xe1a: 0x0018, 0xe1b: 0x0018, 0xe1c: 0x0018, 0xe1d: 0x0018, - 0xe1e: 0x0018, 0xe1f: 0x0018, 0xe20: 0x0018, 0xe21: 0x0018, 0xe22: 0x0018, 0xe23: 0x0018, - 0xe24: 0x0018, 0xe25: 0x0018, 0xe26: 0x0018, 0xe27: 0x0018, 0xe28: 0x0018, 0xe29: 0x0018, - 0xe2a: 0x1308, 0xe2b: 0x1308, 0xe2c: 0x1308, 0xe2d: 0x1308, 0xe2e: 0x1018, 0xe2f: 0x1018, - 0xe30: 0x0018, 0xe31: 0x0018, 0xe32: 0x0018, 0xe33: 0x0018, 0xe34: 0x0018, 0xe35: 0x0018, - 0xe36: 0xe125, 0xe37: 0x0018, 0xe38: 0x29bd, 0xe39: 0x29dd, 0xe3a: 0x29fd, 0xe3b: 0x0018, - 0xe3c: 0x0008, 0xe3d: 0x0018, 0xe3e: 0x0018, 0xe3f: 0x0018, - // Block 0x39, offset 0xe40 - 0xe40: 0x2b3d, 0xe41: 0x2b5d, 0xe42: 0x2b7d, 0xe43: 0x2b9d, 0xe44: 0x2bbd, 0xe45: 0x2bdd, - 0xe46: 0x2bdd, 0xe47: 0x2bdd, 0xe48: 0x2bfd, 0xe49: 0x2bfd, 0xe4a: 0x2bfd, 0xe4b: 0x2bfd, - 0xe4c: 0x2c1d, 0xe4d: 0x2c1d, 0xe4e: 0x2c1d, 0xe4f: 0x2c3d, 0xe50: 0x2c5d, 0xe51: 0x2c5d, - 0xe52: 0x2a7d, 0xe53: 0x2a7d, 0xe54: 0x2c5d, 0xe55: 0x2c5d, 0xe56: 0x2c7d, 0xe57: 0x2c7d, - 0xe58: 0x2c5d, 0xe59: 0x2c5d, 0xe5a: 0x2a7d, 0xe5b: 0x2a7d, 0xe5c: 0x2c5d, 0xe5d: 0x2c5d, - 0xe5e: 0x2c3d, 0xe5f: 0x2c3d, 0xe60: 0x2c9d, 0xe61: 0x2c9d, 0xe62: 0x2cbd, 0xe63: 0x2cbd, - 0xe64: 0x0040, 0xe65: 0x2cdd, 0xe66: 0x2cfd, 0xe67: 0x2d1d, 0xe68: 0x2d1d, 0xe69: 0x2d3d, - 0xe6a: 0x2d5d, 0xe6b: 0x2d7d, 0xe6c: 0x2d9d, 0xe6d: 0x2dbd, 0xe6e: 0x2ddd, 0xe6f: 0x2dfd, - 0xe70: 0x2e1d, 0xe71: 0x2e3d, 0xe72: 0x2e3d, 0xe73: 0x2e5d, 0xe74: 0x2e7d, 0xe75: 0x2e7d, - 0xe76: 0x2e9d, 0xe77: 0x2ebd, 0xe78: 0x2e5d, 0xe79: 0x2edd, 0xe7a: 0x2efd, 0xe7b: 0x2edd, - 0xe7c: 0x2e5d, 0xe7d: 0x2f1d, 0xe7e: 0x2f3d, 0xe7f: 0x2f5d, - // Block 0x3a, offset 0xe80 - 0xe80: 0x2f7d, 0xe81: 0x2f9d, 0xe82: 0x2cfd, 0xe83: 0x2cdd, 0xe84: 0x2fbd, 0xe85: 0x2fdd, - 0xe86: 0x2ffd, 0xe87: 0x301d, 0xe88: 0x303d, 0xe89: 0x305d, 0xe8a: 0x307d, 0xe8b: 0x309d, - 0xe8c: 0x30bd, 0xe8d: 0x30dd, 0xe8e: 0x30fd, 0xe8f: 0x0040, 0xe90: 0x0018, 0xe91: 0x0018, - 0xe92: 0x311d, 0xe93: 0x313d, 0xe94: 0x315d, 0xe95: 0x317d, 0xe96: 0x319d, 0xe97: 0x31bd, - 0xe98: 0x31dd, 0xe99: 0x31fd, 0xe9a: 0x321d, 0xe9b: 0x323d, 0xe9c: 0x315d, 0xe9d: 0x325d, - 0xe9e: 0x327d, 0xe9f: 0x329d, 0xea0: 0x0008, 0xea1: 0x0008, 0xea2: 0x0008, 0xea3: 0x0008, - 0xea4: 0x0008, 0xea5: 0x0008, 0xea6: 0x0008, 0xea7: 0x0008, 0xea8: 0x0008, 0xea9: 0x0008, - 0xeaa: 0x0008, 0xeab: 0x0008, 0xeac: 0x0008, 0xead: 0x0008, 0xeae: 0x0008, 0xeaf: 0x0008, - 0xeb0: 0x0008, 0xeb1: 0x0008, 0xeb2: 0x0008, 0xeb3: 0x0008, 0xeb4: 0x0008, 0xeb5: 0x0008, - 0xeb6: 0x0008, 0xeb7: 0x0008, 0xeb8: 0x0008, 0xeb9: 0x0008, 0xeba: 0x0008, 0xebb: 0x0040, - 0xebc: 0x0040, 0xebd: 0x0040, 0xebe: 0x0040, 0xebf: 0x0040, - // Block 0x3b, offset 0xec0 - 0xec0: 0x36a2, 0xec1: 0x36d2, 0xec2: 0x3702, 0xec3: 0x3732, 0xec4: 0x32bd, 0xec5: 0x32dd, - 0xec6: 0x32fd, 0xec7: 0x331d, 0xec8: 0x0018, 0xec9: 0x0018, 0xeca: 0x0018, 0xecb: 0x0018, - 0xecc: 0x0018, 0xecd: 0x0018, 0xece: 0x0018, 0xecf: 0x0018, 0xed0: 0x333d, 0xed1: 0x3761, - 0xed2: 0x3779, 0xed3: 0x3791, 0xed4: 0x37a9, 0xed5: 0x37c1, 0xed6: 0x37d9, 0xed7: 0x37f1, - 0xed8: 0x3809, 0xed9: 0x3821, 0xeda: 0x3839, 0xedb: 0x3851, 0xedc: 0x3869, 0xedd: 0x3881, - 0xede: 0x3899, 0xedf: 0x38b1, 0xee0: 0x335d, 0xee1: 0x337d, 0xee2: 0x339d, 0xee3: 0x33bd, - 0xee4: 0x33dd, 0xee5: 0x33dd, 0xee6: 0x33fd, 0xee7: 0x341d, 0xee8: 0x343d, 0xee9: 0x345d, - 0xeea: 0x347d, 0xeeb: 0x349d, 0xeec: 0x34bd, 0xeed: 0x34dd, 0xeee: 0x34fd, 0xeef: 0x351d, - 0xef0: 0x353d, 0xef1: 0x355d, 0xef2: 0x357d, 0xef3: 0x359d, 0xef4: 0x35bd, 0xef5: 0x35dd, - 0xef6: 0x35fd, 0xef7: 0x361d, 0xef8: 0x363d, 0xef9: 0x365d, 0xefa: 0x367d, 0xefb: 0x369d, - 0xefc: 0x38c9, 0xefd: 0x3901, 0xefe: 0x36bd, 0xeff: 0x0018, - // Block 0x3c, offset 0xf00 - 0xf00: 0x36dd, 0xf01: 0x36fd, 0xf02: 0x371d, 0xf03: 0x373d, 0xf04: 0x375d, 0xf05: 0x377d, - 0xf06: 0x379d, 0xf07: 0x37bd, 0xf08: 0x37dd, 0xf09: 0x37fd, 0xf0a: 0x381d, 0xf0b: 0x383d, - 0xf0c: 0x385d, 0xf0d: 0x387d, 0xf0e: 0x389d, 0xf0f: 0x38bd, 0xf10: 0x38dd, 0xf11: 0x38fd, - 0xf12: 0x391d, 0xf13: 0x393d, 0xf14: 0x395d, 0xf15: 0x397d, 0xf16: 0x399d, 0xf17: 0x39bd, - 0xf18: 0x39dd, 0xf19: 0x39fd, 0xf1a: 0x3a1d, 0xf1b: 0x3a3d, 0xf1c: 0x3a5d, 0xf1d: 0x3a7d, - 0xf1e: 0x3a9d, 0xf1f: 0x3abd, 0xf20: 0x3add, 0xf21: 0x3afd, 0xf22: 0x3b1d, 0xf23: 0x3b3d, - 0xf24: 0x3b5d, 0xf25: 0x3b7d, 0xf26: 0x127d, 0xf27: 0x3b9d, 0xf28: 0x3bbd, 0xf29: 0x3bdd, - 0xf2a: 0x3bfd, 0xf2b: 0x3c1d, 0xf2c: 0x3c3d, 0xf2d: 0x3c5d, 0xf2e: 0x239d, 0xf2f: 0x3c7d, - 0xf30: 0x3c9d, 0xf31: 0x3939, 0xf32: 0x3951, 0xf33: 0x3969, 0xf34: 0x3981, 0xf35: 0x3999, - 0xf36: 0x39b1, 0xf37: 0x39c9, 0xf38: 0x39e1, 0xf39: 0x39f9, 0xf3a: 0x3a11, 0xf3b: 0x3a29, - 0xf3c: 0x3a41, 0xf3d: 0x3a59, 0xf3e: 0x3a71, 0xf3f: 0x3a89, - // Block 0x3d, offset 0xf40 - 0xf40: 0x3aa1, 0xf41: 0x3ac9, 0xf42: 0x3af1, 0xf43: 0x3b19, 0xf44: 0x3b41, 0xf45: 0x3b69, - 0xf46: 0x3b91, 0xf47: 0x3bb9, 0xf48: 0x3be1, 0xf49: 0x3c09, 0xf4a: 0x3c39, 0xf4b: 0x3c69, - 0xf4c: 0x3c99, 0xf4d: 0x3cbd, 0xf4e: 0x3cb1, 0xf4f: 0x3cdd, 0xf50: 0x3cfd, 0xf51: 0x3d15, - 0xf52: 0x3d2d, 0xf53: 0x3d45, 0xf54: 0x3d5d, 0xf55: 0x3d5d, 0xf56: 0x3d45, 0xf57: 0x3d75, - 0xf58: 0x07bd, 0xf59: 0x3d8d, 0xf5a: 0x3da5, 0xf5b: 0x3dbd, 0xf5c: 0x3dd5, 0xf5d: 0x3ded, - 0xf5e: 0x3e05, 0xf5f: 0x3e1d, 0xf60: 0x3e35, 0xf61: 0x3e4d, 0xf62: 0x3e65, 0xf63: 0x3e7d, - 0xf64: 0x3e95, 0xf65: 0x3e95, 0xf66: 0x3ead, 0xf67: 0x3ead, 0xf68: 0x3ec5, 0xf69: 0x3ec5, - 0xf6a: 0x3edd, 0xf6b: 0x3ef5, 0xf6c: 0x3f0d, 0xf6d: 0x3f25, 0xf6e: 0x3f3d, 0xf6f: 0x3f3d, - 0xf70: 0x3f55, 0xf71: 0x3f55, 0xf72: 0x3f55, 0xf73: 0x3f6d, 0xf74: 0x3f85, 0xf75: 0x3f9d, - 0xf76: 0x3fb5, 0xf77: 0x3f9d, 0xf78: 0x3fcd, 0xf79: 0x3fe5, 0xf7a: 0x3f6d, 0xf7b: 0x3ffd, - 0xf7c: 0x4015, 0xf7d: 0x4015, 0xf7e: 0x4015, 0xf7f: 0x0040, - // Block 0x3e, offset 0xf80 - 0xf80: 0x3cc9, 0xf81: 0x3d31, 0xf82: 0x3d99, 0xf83: 0x3e01, 0xf84: 0x3e51, 0xf85: 0x3eb9, - 0xf86: 0x3f09, 0xf87: 0x3f59, 0xf88: 0x3fd9, 0xf89: 0x4041, 0xf8a: 0x4091, 0xf8b: 0x40e1, - 0xf8c: 0x4131, 0xf8d: 0x4199, 0xf8e: 0x4201, 0xf8f: 0x4251, 0xf90: 0x42a1, 0xf91: 0x42d9, - 0xf92: 0x4329, 0xf93: 0x4391, 0xf94: 0x43f9, 0xf95: 0x4431, 0xf96: 0x44b1, 0xf97: 0x4549, - 0xf98: 0x45c9, 0xf99: 0x4619, 0xf9a: 0x4699, 0xf9b: 0x4719, 0xf9c: 0x4781, 0xf9d: 0x47d1, - 0xf9e: 0x4821, 0xf9f: 0x4871, 0xfa0: 0x48d9, 0xfa1: 0x4959, 0xfa2: 0x49c1, 0xfa3: 0x4a11, - 0xfa4: 0x4a61, 0xfa5: 0x4ab1, 0xfa6: 0x4ae9, 0xfa7: 0x4b21, 0xfa8: 0x4b59, 0xfa9: 0x4b91, - 0xfaa: 0x4be1, 0xfab: 0x4c31, 0xfac: 0x4cb1, 0xfad: 0x4d01, 0xfae: 0x4d69, 0xfaf: 0x4de9, - 0xfb0: 0x4e39, 0xfb1: 0x4e71, 0xfb2: 0x4ea9, 0xfb3: 0x4f29, 0xfb4: 0x4f91, 0xfb5: 0x5011, - 0xfb6: 0x5061, 0xfb7: 0x50e1, 0xfb8: 0x5119, 0xfb9: 0x5169, 0xfba: 0x51b9, 0xfbb: 0x5209, - 0xfbc: 0x5259, 0xfbd: 0x52a9, 0xfbe: 0x5311, 0xfbf: 0x5361, - // Block 0x3f, offset 0xfc0 - 0xfc0: 0x5399, 0xfc1: 0x53e9, 0xfc2: 0x5439, 0xfc3: 0x5489, 0xfc4: 0x54f1, 0xfc5: 0x5541, - 0xfc6: 0x5591, 0xfc7: 0x55e1, 0xfc8: 0x5661, 0xfc9: 0x56c9, 0xfca: 0x5701, 0xfcb: 0x5781, - 0xfcc: 0x57b9, 0xfcd: 0x5821, 0xfce: 0x5889, 0xfcf: 0x58d9, 0xfd0: 0x5929, 0xfd1: 0x5979, - 0xfd2: 0x59e1, 0xfd3: 0x5a19, 0xfd4: 0x5a69, 0xfd5: 0x5ad1, 0xfd6: 0x5b09, 0xfd7: 0x5b89, - 0xfd8: 0x5bd9, 0xfd9: 0x5c01, 0xfda: 0x5c29, 0xfdb: 0x5c51, 0xfdc: 0x5c79, 0xfdd: 0x5ca1, - 0xfde: 0x5cc9, 0xfdf: 0x5cf1, 0xfe0: 0x5d19, 0xfe1: 0x5d41, 0xfe2: 0x5d69, 0xfe3: 0x5d99, - 0xfe4: 0x5dc9, 0xfe5: 0x5df9, 0xfe6: 0x5e29, 0xfe7: 0x5e59, 0xfe8: 0x5e89, 0xfe9: 0x5eb9, - 0xfea: 0x5ee9, 0xfeb: 0x5f19, 0xfec: 0x5f49, 0xfed: 0x5f79, 0xfee: 0x5fa9, 0xfef: 0x5fd9, - 0xff0: 0x6009, 0xff1: 0x402d, 0xff2: 0x6039, 0xff3: 0x6051, 0xff4: 0x404d, 0xff5: 0x6069, - 0xff6: 0x6081, 0xff7: 0x6099, 0xff8: 0x406d, 0xff9: 0x406d, 0xffa: 0x60b1, 0xffb: 0x60c9, - 0xffc: 0x6101, 0xffd: 0x6139, 0xffe: 0x6171, 0xfff: 0x61a9, - // Block 0x40, offset 0x1000 - 0x1000: 0x6211, 0x1001: 0x6229, 0x1002: 0x408d, 0x1003: 0x6241, 0x1004: 0x6259, 0x1005: 0x6271, - 0x1006: 0x6289, 0x1007: 0x62a1, 0x1008: 0x40ad, 0x1009: 0x62b9, 0x100a: 0x62e1, 0x100b: 0x62f9, - 0x100c: 0x40cd, 0x100d: 0x40cd, 0x100e: 0x6311, 0x100f: 0x6329, 0x1010: 0x6341, 0x1011: 0x40ed, - 0x1012: 0x410d, 0x1013: 0x412d, 0x1014: 0x414d, 0x1015: 0x416d, 0x1016: 0x6359, 0x1017: 0x6371, - 0x1018: 0x6389, 0x1019: 0x63a1, 0x101a: 0x63b9, 0x101b: 0x418d, 0x101c: 0x63d1, 0x101d: 0x63e9, - 0x101e: 0x6401, 0x101f: 0x41ad, 0x1020: 0x41cd, 0x1021: 0x6419, 0x1022: 0x41ed, 0x1023: 0x420d, - 0x1024: 0x422d, 0x1025: 0x6431, 0x1026: 0x424d, 0x1027: 0x6449, 0x1028: 0x6479, 0x1029: 0x6211, - 0x102a: 0x426d, 0x102b: 0x428d, 0x102c: 0x42ad, 0x102d: 0x42cd, 0x102e: 0x64b1, 0x102f: 0x64f1, - 0x1030: 0x6539, 0x1031: 0x6551, 0x1032: 0x42ed, 0x1033: 0x6569, 0x1034: 0x6581, 0x1035: 0x6599, - 0x1036: 0x430d, 0x1037: 0x65b1, 0x1038: 0x65c9, 0x1039: 0x65b1, 0x103a: 0x65e1, 0x103b: 0x65f9, - 0x103c: 0x432d, 0x103d: 0x6611, 0x103e: 0x6629, 0x103f: 0x6611, - // Block 0x41, offset 0x1040 - 0x1040: 0x434d, 0x1041: 0x436d, 0x1042: 0x0040, 0x1043: 0x6641, 0x1044: 0x6659, 0x1045: 0x6671, - 0x1046: 0x6689, 0x1047: 0x0040, 0x1048: 0x66c1, 0x1049: 0x66d9, 0x104a: 0x66f1, 0x104b: 0x6709, - 0x104c: 0x6721, 0x104d: 0x6739, 0x104e: 0x6401, 0x104f: 0x6751, 0x1050: 0x6769, 0x1051: 0x6781, - 0x1052: 0x438d, 0x1053: 0x6799, 0x1054: 0x6289, 0x1055: 0x43ad, 0x1056: 0x43cd, 0x1057: 0x67b1, - 0x1058: 0x0040, 0x1059: 0x43ed, 0x105a: 0x67c9, 0x105b: 0x67e1, 0x105c: 0x67f9, 0x105d: 0x6811, - 0x105e: 0x6829, 0x105f: 0x6859, 0x1060: 0x6889, 0x1061: 0x68b1, 0x1062: 0x68d9, 0x1063: 0x6901, - 0x1064: 0x6929, 0x1065: 0x6951, 0x1066: 0x6979, 0x1067: 0x69a1, 0x1068: 0x69c9, 0x1069: 0x69f1, - 0x106a: 0x6a21, 0x106b: 0x6a51, 0x106c: 0x6a81, 0x106d: 0x6ab1, 0x106e: 0x6ae1, 0x106f: 0x6b11, - 0x1070: 0x6b41, 0x1071: 0x6b71, 0x1072: 0x6ba1, 0x1073: 0x6bd1, 0x1074: 0x6c01, 0x1075: 0x6c31, - 0x1076: 0x6c61, 0x1077: 0x6c91, 0x1078: 0x6cc1, 0x1079: 0x6cf1, 0x107a: 0x6d21, 0x107b: 0x6d51, - 0x107c: 0x6d81, 0x107d: 0x6db1, 0x107e: 0x6de1, 0x107f: 0x440d, - // Block 0x42, offset 0x1080 - 0x1080: 0xe00d, 0x1081: 0x0008, 0x1082: 0xe00d, 0x1083: 0x0008, 0x1084: 0xe00d, 0x1085: 0x0008, - 0x1086: 0xe00d, 0x1087: 0x0008, 0x1088: 0xe00d, 0x1089: 0x0008, 0x108a: 0xe00d, 0x108b: 0x0008, - 0x108c: 0xe00d, 0x108d: 0x0008, 0x108e: 0xe00d, 0x108f: 0x0008, 0x1090: 0xe00d, 0x1091: 0x0008, - 0x1092: 0xe00d, 0x1093: 0x0008, 0x1094: 0xe00d, 0x1095: 0x0008, 0x1096: 0xe00d, 0x1097: 0x0008, - 0x1098: 0xe00d, 0x1099: 0x0008, 0x109a: 0xe00d, 0x109b: 0x0008, 0x109c: 0xe00d, 0x109d: 0x0008, - 0x109e: 0xe00d, 0x109f: 0x0008, 0x10a0: 0xe00d, 0x10a1: 0x0008, 0x10a2: 0xe00d, 0x10a3: 0x0008, - 0x10a4: 0xe00d, 0x10a5: 0x0008, 0x10a6: 0xe00d, 0x10a7: 0x0008, 0x10a8: 0xe00d, 0x10a9: 0x0008, - 0x10aa: 0xe00d, 0x10ab: 0x0008, 0x10ac: 0xe00d, 0x10ad: 0x0008, 0x10ae: 0x0008, 0x10af: 0x1308, - 0x10b0: 0x1318, 0x10b1: 0x1318, 0x10b2: 0x1318, 0x10b3: 0x0018, 0x10b4: 0x1308, 0x10b5: 0x1308, - 0x10b6: 0x1308, 0x10b7: 0x1308, 0x10b8: 0x1308, 0x10b9: 0x1308, 0x10ba: 0x1308, 0x10bb: 0x1308, - 0x10bc: 0x1308, 0x10bd: 0x1308, 0x10be: 0x0018, 0x10bf: 0x0008, - // Block 0x43, offset 0x10c0 - 0x10c0: 0xe00d, 0x10c1: 0x0008, 0x10c2: 0xe00d, 0x10c3: 0x0008, 0x10c4: 0xe00d, 0x10c5: 0x0008, - 0x10c6: 0xe00d, 0x10c7: 0x0008, 0x10c8: 0xe00d, 0x10c9: 0x0008, 0x10ca: 0xe00d, 0x10cb: 0x0008, - 0x10cc: 0xe00d, 0x10cd: 0x0008, 0x10ce: 0xe00d, 0x10cf: 0x0008, 0x10d0: 0xe00d, 0x10d1: 0x0008, - 0x10d2: 0xe00d, 0x10d3: 0x0008, 0x10d4: 0xe00d, 0x10d5: 0x0008, 0x10d6: 0xe00d, 0x10d7: 0x0008, - 0x10d8: 0xe00d, 0x10d9: 0x0008, 0x10da: 0xe00d, 0x10db: 0x0008, 0x10dc: 0x0ea1, 0x10dd: 0x6e11, - 0x10de: 0x1308, 0x10df: 0x1308, 0x10e0: 0x0008, 0x10e1: 0x0008, 0x10e2: 0x0008, 0x10e3: 0x0008, - 0x10e4: 0x0008, 0x10e5: 0x0008, 0x10e6: 0x0008, 0x10e7: 0x0008, 0x10e8: 0x0008, 0x10e9: 0x0008, - 0x10ea: 0x0008, 0x10eb: 0x0008, 0x10ec: 0x0008, 0x10ed: 0x0008, 0x10ee: 0x0008, 0x10ef: 0x0008, - 0x10f0: 0x0008, 0x10f1: 0x0008, 0x10f2: 0x0008, 0x10f3: 0x0008, 0x10f4: 0x0008, 0x10f5: 0x0008, - 0x10f6: 0x0008, 0x10f7: 0x0008, 0x10f8: 0x0008, 0x10f9: 0x0008, 0x10fa: 0x0008, 0x10fb: 0x0008, - 0x10fc: 0x0008, 0x10fd: 0x0008, 0x10fe: 0x0008, 0x10ff: 0x0008, - // Block 0x44, offset 0x1100 - 0x1100: 0x0018, 0x1101: 0x0018, 0x1102: 0x0018, 0x1103: 0x0018, 0x1104: 0x0018, 0x1105: 0x0018, - 0x1106: 0x0018, 0x1107: 0x0018, 0x1108: 0x0018, 0x1109: 0x0018, 0x110a: 0x0018, 0x110b: 0x0018, - 0x110c: 0x0018, 0x110d: 0x0018, 0x110e: 0x0018, 0x110f: 0x0018, 0x1110: 0x0018, 0x1111: 0x0018, - 0x1112: 0x0018, 0x1113: 0x0018, 0x1114: 0x0018, 0x1115: 0x0018, 0x1116: 0x0018, 0x1117: 0x0008, - 0x1118: 0x0008, 0x1119: 0x0008, 0x111a: 0x0008, 0x111b: 0x0008, 0x111c: 0x0008, 0x111d: 0x0008, - 0x111e: 0x0008, 0x111f: 0x0008, 0x1120: 0x0018, 0x1121: 0x0018, 0x1122: 0xe00d, 0x1123: 0x0008, - 0x1124: 0xe00d, 0x1125: 0x0008, 0x1126: 0xe00d, 0x1127: 0x0008, 0x1128: 0xe00d, 0x1129: 0x0008, - 0x112a: 0xe00d, 0x112b: 0x0008, 0x112c: 0xe00d, 0x112d: 0x0008, 0x112e: 0xe00d, 0x112f: 0x0008, - 0x1130: 0x0008, 0x1131: 0x0008, 0x1132: 0xe00d, 0x1133: 0x0008, 0x1134: 0xe00d, 0x1135: 0x0008, - 0x1136: 0xe00d, 0x1137: 0x0008, 0x1138: 0xe00d, 0x1139: 0x0008, 0x113a: 0xe00d, 0x113b: 0x0008, - 0x113c: 0xe00d, 0x113d: 0x0008, 0x113e: 0xe00d, 0x113f: 0x0008, - // Block 0x45, offset 0x1140 - 0x1140: 0xe00d, 0x1141: 0x0008, 0x1142: 0xe00d, 0x1143: 0x0008, 0x1144: 0xe00d, 0x1145: 0x0008, - 0x1146: 0xe00d, 0x1147: 0x0008, 0x1148: 0xe00d, 0x1149: 0x0008, 0x114a: 0xe00d, 0x114b: 0x0008, - 0x114c: 0xe00d, 0x114d: 0x0008, 0x114e: 0xe00d, 0x114f: 0x0008, 0x1150: 0xe00d, 0x1151: 0x0008, - 0x1152: 0xe00d, 0x1153: 0x0008, 0x1154: 0xe00d, 0x1155: 0x0008, 0x1156: 0xe00d, 0x1157: 0x0008, - 0x1158: 0xe00d, 0x1159: 0x0008, 0x115a: 0xe00d, 0x115b: 0x0008, 0x115c: 0xe00d, 0x115d: 0x0008, - 0x115e: 0xe00d, 0x115f: 0x0008, 0x1160: 0xe00d, 0x1161: 0x0008, 0x1162: 0xe00d, 0x1163: 0x0008, - 0x1164: 0xe00d, 0x1165: 0x0008, 0x1166: 0xe00d, 0x1167: 0x0008, 0x1168: 0xe00d, 0x1169: 0x0008, - 0x116a: 0xe00d, 0x116b: 0x0008, 0x116c: 0xe00d, 0x116d: 0x0008, 0x116e: 0xe00d, 0x116f: 0x0008, - 0x1170: 0xe0fd, 0x1171: 0x0008, 0x1172: 0x0008, 0x1173: 0x0008, 0x1174: 0x0008, 0x1175: 0x0008, - 0x1176: 0x0008, 0x1177: 0x0008, 0x1178: 0x0008, 0x1179: 0xe01d, 0x117a: 0x0008, 0x117b: 0xe03d, - 0x117c: 0x0008, 0x117d: 0x442d, 0x117e: 0xe00d, 0x117f: 0x0008, - // Block 0x46, offset 0x1180 - 0x1180: 0xe00d, 0x1181: 0x0008, 0x1182: 0xe00d, 0x1183: 0x0008, 0x1184: 0xe00d, 0x1185: 0x0008, - 0x1186: 0xe00d, 0x1187: 0x0008, 0x1188: 0x0008, 0x1189: 0x0018, 0x118a: 0x0018, 0x118b: 0xe03d, - 0x118c: 0x0008, 0x118d: 0x11d9, 0x118e: 0x0008, 0x118f: 0x0008, 0x1190: 0xe00d, 0x1191: 0x0008, - 0x1192: 0xe00d, 0x1193: 0x0008, 0x1194: 0x0008, 0x1195: 0x0008, 0x1196: 0xe00d, 0x1197: 0x0008, - 0x1198: 0xe00d, 0x1199: 0x0008, 0x119a: 0xe00d, 0x119b: 0x0008, 0x119c: 0xe00d, 0x119d: 0x0008, - 0x119e: 0xe00d, 0x119f: 0x0008, 0x11a0: 0xe00d, 0x11a1: 0x0008, 0x11a2: 0xe00d, 0x11a3: 0x0008, - 0x11a4: 0xe00d, 0x11a5: 0x0008, 0x11a6: 0xe00d, 0x11a7: 0x0008, 0x11a8: 0xe00d, 0x11a9: 0x0008, - 0x11aa: 0x6e29, 0x11ab: 0x1029, 0x11ac: 0x11c1, 0x11ad: 0x6e41, 0x11ae: 0x1221, 0x11af: 0x0040, - 0x11b0: 0x6e59, 0x11b1: 0x6e71, 0x11b2: 0x1239, 0x11b3: 0x444d, 0x11b4: 0xe00d, 0x11b5: 0x0008, - 0x11b6: 0xe00d, 0x11b7: 0x0008, 0x11b8: 0x0040, 0x11b9: 0x0040, 0x11ba: 0x0040, 0x11bb: 0x0040, - 0x11bc: 0x0040, 0x11bd: 0x0040, 0x11be: 0x0040, 0x11bf: 0x0040, - // Block 0x47, offset 0x11c0 - 0x11c0: 0x64d5, 0x11c1: 0x64f5, 0x11c2: 0x6515, 0x11c3: 0x6535, 0x11c4: 0x6555, 0x11c5: 0x6575, - 0x11c6: 0x6595, 0x11c7: 0x65b5, 0x11c8: 0x65d5, 0x11c9: 0x65f5, 0x11ca: 0x6615, 0x11cb: 0x6635, - 0x11cc: 0x6655, 0x11cd: 0x6675, 0x11ce: 0x0008, 0x11cf: 0x0008, 0x11d0: 0x6695, 0x11d1: 0x0008, - 0x11d2: 0x66b5, 0x11d3: 0x0008, 0x11d4: 0x0008, 0x11d5: 0x66d5, 0x11d6: 0x66f5, 0x11d7: 0x6715, - 0x11d8: 0x6735, 0x11d9: 0x6755, 0x11da: 0x6775, 0x11db: 0x6795, 0x11dc: 0x67b5, 0x11dd: 0x67d5, - 0x11de: 0x67f5, 0x11df: 0x0008, 0x11e0: 0x6815, 0x11e1: 0x0008, 0x11e2: 0x6835, 0x11e3: 0x0008, - 0x11e4: 0x0008, 0x11e5: 0x6855, 0x11e6: 0x6875, 0x11e7: 0x0008, 0x11e8: 0x0008, 0x11e9: 0x0008, - 0x11ea: 0x6895, 0x11eb: 0x68b5, 0x11ec: 0x68d5, 0x11ed: 0x68f5, 0x11ee: 0x6915, 0x11ef: 0x6935, - 0x11f0: 0x6955, 0x11f1: 0x6975, 0x11f2: 0x6995, 0x11f3: 0x69b5, 0x11f4: 0x69d5, 0x11f5: 0x69f5, - 0x11f6: 0x6a15, 0x11f7: 0x6a35, 0x11f8: 0x6a55, 0x11f9: 0x6a75, 0x11fa: 0x6a95, 0x11fb: 0x6ab5, - 0x11fc: 0x6ad5, 0x11fd: 0x6af5, 0x11fe: 0x6b15, 0x11ff: 0x6b35, - // Block 0x48, offset 0x1200 - 0x1200: 0x7a95, 0x1201: 0x7ab5, 0x1202: 0x7ad5, 0x1203: 0x7af5, 0x1204: 0x7b15, 0x1205: 0x7b35, - 0x1206: 0x7b55, 0x1207: 0x7b75, 0x1208: 0x7b95, 0x1209: 0x7bb5, 0x120a: 0x7bd5, 0x120b: 0x7bf5, - 0x120c: 0x7c15, 0x120d: 0x7c35, 0x120e: 0x7c55, 0x120f: 0x6ec9, 0x1210: 0x6ef1, 0x1211: 0x6f19, - 0x1212: 0x7c75, 0x1213: 0x7c95, 0x1214: 0x7cb5, 0x1215: 0x6f41, 0x1216: 0x6f69, 0x1217: 0x6f91, - 0x1218: 0x7cd5, 0x1219: 0x7cf5, 0x121a: 0x0040, 0x121b: 0x0040, 0x121c: 0x0040, 0x121d: 0x0040, - 0x121e: 0x0040, 0x121f: 0x0040, 0x1220: 0x0040, 0x1221: 0x0040, 0x1222: 0x0040, 0x1223: 0x0040, - 0x1224: 0x0040, 0x1225: 0x0040, 0x1226: 0x0040, 0x1227: 0x0040, 0x1228: 0x0040, 0x1229: 0x0040, - 0x122a: 0x0040, 0x122b: 0x0040, 0x122c: 0x0040, 0x122d: 0x0040, 0x122e: 0x0040, 0x122f: 0x0040, - 0x1230: 0x0040, 0x1231: 0x0040, 0x1232: 0x0040, 0x1233: 0x0040, 0x1234: 0x0040, 0x1235: 0x0040, - 0x1236: 0x0040, 0x1237: 0x0040, 0x1238: 0x0040, 0x1239: 0x0040, 0x123a: 0x0040, 0x123b: 0x0040, - 0x123c: 0x0040, 0x123d: 0x0040, 0x123e: 0x0040, 0x123f: 0x0040, - // Block 0x49, offset 0x1240 - 0x1240: 0x6fb9, 0x1241: 0x6fd1, 0x1242: 0x6fe9, 0x1243: 0x7d15, 0x1244: 0x7d35, 0x1245: 0x7001, - 0x1246: 0x7001, 0x1247: 0x0040, 0x1248: 0x0040, 0x1249: 0x0040, 0x124a: 0x0040, 0x124b: 0x0040, - 0x124c: 0x0040, 0x124d: 0x0040, 0x124e: 0x0040, 0x124f: 0x0040, 0x1250: 0x0040, 0x1251: 0x0040, - 0x1252: 0x0040, 0x1253: 0x7019, 0x1254: 0x7041, 0x1255: 0x7069, 0x1256: 0x7091, 0x1257: 0x70b9, - 0x1258: 0x0040, 0x1259: 0x0040, 0x125a: 0x0040, 0x125b: 0x0040, 0x125c: 0x0040, 0x125d: 0x70e1, - 0x125e: 0x1308, 0x125f: 0x7109, 0x1260: 0x7131, 0x1261: 0x20a9, 0x1262: 0x20f1, 0x1263: 0x7149, - 0x1264: 0x7161, 0x1265: 0x7179, 0x1266: 0x7191, 0x1267: 0x71a9, 0x1268: 0x71c1, 0x1269: 0x1fb2, - 0x126a: 0x71d9, 0x126b: 0x7201, 0x126c: 0x7229, 0x126d: 0x7261, 0x126e: 0x7299, 0x126f: 0x72c1, - 0x1270: 0x72e9, 0x1271: 0x7311, 0x1272: 0x7339, 0x1273: 0x7361, 0x1274: 0x7389, 0x1275: 0x73b1, - 0x1276: 0x73d9, 0x1277: 0x0040, 0x1278: 0x7401, 0x1279: 0x7429, 0x127a: 0x7451, 0x127b: 0x7479, - 0x127c: 0x74a1, 0x127d: 0x0040, 0x127e: 0x74c9, 0x127f: 0x0040, - // Block 0x4a, offset 0x1280 - 0x1280: 0x74f1, 0x1281: 0x7519, 0x1282: 0x0040, 0x1283: 0x7541, 0x1284: 0x7569, 0x1285: 0x0040, - 0x1286: 0x7591, 0x1287: 0x75b9, 0x1288: 0x75e1, 0x1289: 0x7609, 0x128a: 0x7631, 0x128b: 0x7659, - 0x128c: 0x7681, 0x128d: 0x76a9, 0x128e: 0x76d1, 0x128f: 0x76f9, 0x1290: 0x7721, 0x1291: 0x7721, - 0x1292: 0x7739, 0x1293: 0x7739, 0x1294: 0x7739, 0x1295: 0x7739, 0x1296: 0x7751, 0x1297: 0x7751, - 0x1298: 0x7751, 0x1299: 0x7751, 0x129a: 0x7769, 0x129b: 0x7769, 0x129c: 0x7769, 0x129d: 0x7769, - 0x129e: 0x7781, 0x129f: 0x7781, 0x12a0: 0x7781, 0x12a1: 0x7781, 0x12a2: 0x7799, 0x12a3: 0x7799, - 0x12a4: 0x7799, 0x12a5: 0x7799, 0x12a6: 0x77b1, 0x12a7: 0x77b1, 0x12a8: 0x77b1, 0x12a9: 0x77b1, - 0x12aa: 0x77c9, 0x12ab: 0x77c9, 0x12ac: 0x77c9, 0x12ad: 0x77c9, 0x12ae: 0x77e1, 0x12af: 0x77e1, - 0x12b0: 0x77e1, 0x12b1: 0x77e1, 0x12b2: 0x77f9, 0x12b3: 0x77f9, 0x12b4: 0x77f9, 0x12b5: 0x77f9, - 0x12b6: 0x7811, 0x12b7: 0x7811, 0x12b8: 0x7811, 0x12b9: 0x7811, 0x12ba: 0x7829, 0x12bb: 0x7829, - 0x12bc: 0x7829, 0x12bd: 0x7829, 0x12be: 0x7841, 0x12bf: 0x7841, - // Block 0x4b, offset 0x12c0 - 0x12c0: 0x7841, 0x12c1: 0x7841, 0x12c2: 0x7859, 0x12c3: 0x7859, 0x12c4: 0x7871, 0x12c5: 0x7871, - 0x12c6: 0x7889, 0x12c7: 0x7889, 0x12c8: 0x78a1, 0x12c9: 0x78a1, 0x12ca: 0x78b9, 0x12cb: 0x78b9, - 0x12cc: 0x78d1, 0x12cd: 0x78d1, 0x12ce: 0x78e9, 0x12cf: 0x78e9, 0x12d0: 0x78e9, 0x12d1: 0x78e9, - 0x12d2: 0x7901, 0x12d3: 0x7901, 0x12d4: 0x7901, 0x12d5: 0x7901, 0x12d6: 0x7919, 0x12d7: 0x7919, - 0x12d8: 0x7919, 0x12d9: 0x7919, 0x12da: 0x7931, 0x12db: 0x7931, 0x12dc: 0x7931, 0x12dd: 0x7931, - 0x12de: 0x7949, 0x12df: 0x7949, 0x12e0: 0x7961, 0x12e1: 0x7961, 0x12e2: 0x7961, 0x12e3: 0x7961, - 0x12e4: 0x7979, 0x12e5: 0x7979, 0x12e6: 0x7991, 0x12e7: 0x7991, 0x12e8: 0x7991, 0x12e9: 0x7991, - 0x12ea: 0x79a9, 0x12eb: 0x79a9, 0x12ec: 0x79a9, 0x12ed: 0x79a9, 0x12ee: 0x79c1, 0x12ef: 0x79c1, - 0x12f0: 0x79d9, 0x12f1: 0x79d9, 0x12f2: 0x0018, 0x12f3: 0x0018, 0x12f4: 0x0018, 0x12f5: 0x0018, - 0x12f6: 0x0018, 0x12f7: 0x0018, 0x12f8: 0x0018, 0x12f9: 0x0018, 0x12fa: 0x0018, 0x12fb: 0x0018, - 0x12fc: 0x0018, 0x12fd: 0x0018, 0x12fe: 0x0018, 0x12ff: 0x0018, - // Block 0x4c, offset 0x1300 - 0x1300: 0x0018, 0x1301: 0x0018, 0x1302: 0x0040, 0x1303: 0x0040, 0x1304: 0x0040, 0x1305: 0x0040, - 0x1306: 0x0040, 0x1307: 0x0040, 0x1308: 0x0040, 0x1309: 0x0040, 0x130a: 0x0040, 0x130b: 0x0040, - 0x130c: 0x0040, 0x130d: 0x0040, 0x130e: 0x0040, 0x130f: 0x0040, 0x1310: 0x0040, 0x1311: 0x0040, - 0x1312: 0x0040, 0x1313: 0x79f1, 0x1314: 0x79f1, 0x1315: 0x79f1, 0x1316: 0x79f1, 0x1317: 0x7a09, - 0x1318: 0x7a09, 0x1319: 0x7a21, 0x131a: 0x7a21, 0x131b: 0x7a39, 0x131c: 0x7a39, 0x131d: 0x0479, - 0x131e: 0x7a51, 0x131f: 0x7a51, 0x1320: 0x7a69, 0x1321: 0x7a69, 0x1322: 0x7a81, 0x1323: 0x7a81, - 0x1324: 0x7a99, 0x1325: 0x7a99, 0x1326: 0x7a99, 0x1327: 0x7a99, 0x1328: 0x7ab1, 0x1329: 0x7ab1, - 0x132a: 0x7ac9, 0x132b: 0x7ac9, 0x132c: 0x7af1, 0x132d: 0x7af1, 0x132e: 0x7b19, 0x132f: 0x7b19, - 0x1330: 0x7b41, 0x1331: 0x7b41, 0x1332: 0x7b69, 0x1333: 0x7b69, 0x1334: 0x7b91, 0x1335: 0x7b91, - 0x1336: 0x7bb9, 0x1337: 0x7bb9, 0x1338: 0x7bb9, 0x1339: 0x7be1, 0x133a: 0x7be1, 0x133b: 0x7be1, - 0x133c: 0x7c09, 0x133d: 0x7c09, 0x133e: 0x7c09, 0x133f: 0x7c09, - // Block 0x4d, offset 0x1340 - 0x1340: 0x85f9, 0x1341: 0x8621, 0x1342: 0x8649, 0x1343: 0x8671, 0x1344: 0x8699, 0x1345: 0x86c1, - 0x1346: 0x86e9, 0x1347: 0x8711, 0x1348: 0x8739, 0x1349: 0x8761, 0x134a: 0x8789, 0x134b: 0x87b1, - 0x134c: 0x87d9, 0x134d: 0x8801, 0x134e: 0x8829, 0x134f: 0x8851, 0x1350: 0x8879, 0x1351: 0x88a1, - 0x1352: 0x88c9, 0x1353: 0x88f1, 0x1354: 0x8919, 0x1355: 0x8941, 0x1356: 0x8969, 0x1357: 0x8991, - 0x1358: 0x89b9, 0x1359: 0x89e1, 0x135a: 0x8a09, 0x135b: 0x8a31, 0x135c: 0x8a59, 0x135d: 0x8a81, - 0x135e: 0x8aaa, 0x135f: 0x8ada, 0x1360: 0x8b0a, 0x1361: 0x8b3a, 0x1362: 0x8b6a, 0x1363: 0x8b9a, - 0x1364: 0x8bc9, 0x1365: 0x8bf1, 0x1366: 0x7c71, 0x1367: 0x8c19, 0x1368: 0x7be1, 0x1369: 0x7c99, - 0x136a: 0x8c41, 0x136b: 0x8c69, 0x136c: 0x7d39, 0x136d: 0x8c91, 0x136e: 0x7d61, 0x136f: 0x7d89, - 0x1370: 0x8cb9, 0x1371: 0x8ce1, 0x1372: 0x7e29, 0x1373: 0x8d09, 0x1374: 0x7e51, 0x1375: 0x7e79, - 0x1376: 0x8d31, 0x1377: 0x8d59, 0x1378: 0x7ec9, 0x1379: 0x8d81, 0x137a: 0x7ef1, 0x137b: 0x7f19, - 0x137c: 0x83a1, 0x137d: 0x83c9, 0x137e: 0x8441, 0x137f: 0x8469, - // Block 0x4e, offset 0x1380 - 0x1380: 0x8491, 0x1381: 0x8531, 0x1382: 0x8559, 0x1383: 0x8581, 0x1384: 0x85a9, 0x1385: 0x8649, - 0x1386: 0x8671, 0x1387: 0x8699, 0x1388: 0x8da9, 0x1389: 0x8739, 0x138a: 0x8dd1, 0x138b: 0x8df9, - 0x138c: 0x8829, 0x138d: 0x8e21, 0x138e: 0x8851, 0x138f: 0x8879, 0x1390: 0x8a81, 0x1391: 0x8e49, - 0x1392: 0x8e71, 0x1393: 0x89b9, 0x1394: 0x8e99, 0x1395: 0x89e1, 0x1396: 0x8a09, 0x1397: 0x7c21, - 0x1398: 0x7c49, 0x1399: 0x8ec1, 0x139a: 0x7c71, 0x139b: 0x8ee9, 0x139c: 0x7cc1, 0x139d: 0x7ce9, - 0x139e: 0x7d11, 0x139f: 0x7d39, 0x13a0: 0x8f11, 0x13a1: 0x7db1, 0x13a2: 0x7dd9, 0x13a3: 0x7e01, - 0x13a4: 0x7e29, 0x13a5: 0x8f39, 0x13a6: 0x7ec9, 0x13a7: 0x7f41, 0x13a8: 0x7f69, 0x13a9: 0x7f91, - 0x13aa: 0x7fb9, 0x13ab: 0x7fe1, 0x13ac: 0x8031, 0x13ad: 0x8059, 0x13ae: 0x8081, 0x13af: 0x80a9, - 0x13b0: 0x80d1, 0x13b1: 0x80f9, 0x13b2: 0x8f61, 0x13b3: 0x8121, 0x13b4: 0x8149, 0x13b5: 0x8171, - 0x13b6: 0x8199, 0x13b7: 0x81c1, 0x13b8: 0x81e9, 0x13b9: 0x8239, 0x13ba: 0x8261, 0x13bb: 0x8289, - 0x13bc: 0x82b1, 0x13bd: 0x82d9, 0x13be: 0x8301, 0x13bf: 0x8329, - // Block 0x4f, offset 0x13c0 - 0x13c0: 0x8351, 0x13c1: 0x8379, 0x13c2: 0x83f1, 0x13c3: 0x8419, 0x13c4: 0x84b9, 0x13c5: 0x84e1, - 0x13c6: 0x8509, 0x13c7: 0x8531, 0x13c8: 0x8559, 0x13c9: 0x85d1, 0x13ca: 0x85f9, 0x13cb: 0x8621, - 0x13cc: 0x8649, 0x13cd: 0x8f89, 0x13ce: 0x86c1, 0x13cf: 0x86e9, 0x13d0: 0x8711, 0x13d1: 0x8739, - 0x13d2: 0x87b1, 0x13d3: 0x87d9, 0x13d4: 0x8801, 0x13d5: 0x8829, 0x13d6: 0x8fb1, 0x13d7: 0x88a1, - 0x13d8: 0x88c9, 0x13d9: 0x8fd9, 0x13da: 0x8941, 0x13db: 0x8969, 0x13dc: 0x8991, 0x13dd: 0x89b9, - 0x13de: 0x9001, 0x13df: 0x7c71, 0x13e0: 0x8ee9, 0x13e1: 0x7d39, 0x13e2: 0x8f11, 0x13e3: 0x7e29, - 0x13e4: 0x8f39, 0x13e5: 0x7ec9, 0x13e6: 0x9029, 0x13e7: 0x80d1, 0x13e8: 0x9051, 0x13e9: 0x9079, - 0x13ea: 0x90a1, 0x13eb: 0x8531, 0x13ec: 0x8559, 0x13ed: 0x8649, 0x13ee: 0x8829, 0x13ef: 0x8fb1, - 0x13f0: 0x89b9, 0x13f1: 0x9001, 0x13f2: 0x90c9, 0x13f3: 0x9101, 0x13f4: 0x9139, 0x13f5: 0x9171, - 0x13f6: 0x9199, 0x13f7: 0x91c1, 0x13f8: 0x91e9, 0x13f9: 0x9211, 0x13fa: 0x9239, 0x13fb: 0x9261, - 0x13fc: 0x9289, 0x13fd: 0x92b1, 0x13fe: 0x92d9, 0x13ff: 0x9301, - // Block 0x50, offset 0x1400 - 0x1400: 0x9329, 0x1401: 0x9351, 0x1402: 0x9379, 0x1403: 0x93a1, 0x1404: 0x93c9, 0x1405: 0x93f1, - 0x1406: 0x9419, 0x1407: 0x9441, 0x1408: 0x9469, 0x1409: 0x9491, 0x140a: 0x94b9, 0x140b: 0x94e1, - 0x140c: 0x9079, 0x140d: 0x9509, 0x140e: 0x9531, 0x140f: 0x9559, 0x1410: 0x9581, 0x1411: 0x9171, - 0x1412: 0x9199, 0x1413: 0x91c1, 0x1414: 0x91e9, 0x1415: 0x9211, 0x1416: 0x9239, 0x1417: 0x9261, - 0x1418: 0x9289, 0x1419: 0x92b1, 0x141a: 0x92d9, 0x141b: 0x9301, 0x141c: 0x9329, 0x141d: 0x9351, - 0x141e: 0x9379, 0x141f: 0x93a1, 0x1420: 0x93c9, 0x1421: 0x93f1, 0x1422: 0x9419, 0x1423: 0x9441, - 0x1424: 0x9469, 0x1425: 0x9491, 0x1426: 0x94b9, 0x1427: 0x94e1, 0x1428: 0x9079, 0x1429: 0x9509, - 0x142a: 0x9531, 0x142b: 0x9559, 0x142c: 0x9581, 0x142d: 0x9491, 0x142e: 0x94b9, 0x142f: 0x94e1, - 0x1430: 0x9079, 0x1431: 0x9051, 0x1432: 0x90a1, 0x1433: 0x8211, 0x1434: 0x8059, 0x1435: 0x8081, - 0x1436: 0x80a9, 0x1437: 0x9491, 0x1438: 0x94b9, 0x1439: 0x94e1, 0x143a: 0x8211, 0x143b: 0x8239, - 0x143c: 0x95a9, 0x143d: 0x95a9, 0x143e: 0x0018, 0x143f: 0x0018, - // Block 0x51, offset 0x1440 - 0x1440: 0x0040, 0x1441: 0x0040, 0x1442: 0x0040, 0x1443: 0x0040, 0x1444: 0x0040, 0x1445: 0x0040, - 0x1446: 0x0040, 0x1447: 0x0040, 0x1448: 0x0040, 0x1449: 0x0040, 0x144a: 0x0040, 0x144b: 0x0040, - 0x144c: 0x0040, 0x144d: 0x0040, 0x144e: 0x0040, 0x144f: 0x0040, 0x1450: 0x95d1, 0x1451: 0x9609, - 0x1452: 0x9609, 0x1453: 0x9641, 0x1454: 0x9679, 0x1455: 0x96b1, 0x1456: 0x96e9, 0x1457: 0x9721, - 0x1458: 0x9759, 0x1459: 0x9759, 0x145a: 0x9791, 0x145b: 0x97c9, 0x145c: 0x9801, 0x145d: 0x9839, - 0x145e: 0x9871, 0x145f: 0x98a9, 0x1460: 0x98a9, 0x1461: 0x98e1, 0x1462: 0x9919, 0x1463: 0x9919, - 0x1464: 0x9951, 0x1465: 0x9951, 0x1466: 0x9989, 0x1467: 0x99c1, 0x1468: 0x99c1, 0x1469: 0x99f9, - 0x146a: 0x9a31, 0x146b: 0x9a31, 0x146c: 0x9a69, 0x146d: 0x9a69, 0x146e: 0x9aa1, 0x146f: 0x9ad9, - 0x1470: 0x9ad9, 0x1471: 0x9b11, 0x1472: 0x9b11, 0x1473: 0x9b49, 0x1474: 0x9b81, 0x1475: 0x9bb9, - 0x1476: 0x9bf1, 0x1477: 0x9bf1, 0x1478: 0x9c29, 0x1479: 0x9c61, 0x147a: 0x9c99, 0x147b: 0x9cd1, - 0x147c: 0x9d09, 0x147d: 0x9d09, 0x147e: 0x9d41, 0x147f: 0x9d79, - // Block 0x52, offset 0x1480 - 0x1480: 0xa949, 0x1481: 0xa981, 0x1482: 0xa9b9, 0x1483: 0xa8a1, 0x1484: 0x9bb9, 0x1485: 0x9989, - 0x1486: 0xa9f1, 0x1487: 0xaa29, 0x1488: 0x0040, 0x1489: 0x0040, 0x148a: 0x0040, 0x148b: 0x0040, - 0x148c: 0x0040, 0x148d: 0x0040, 0x148e: 0x0040, 0x148f: 0x0040, 0x1490: 0x0040, 0x1491: 0x0040, - 0x1492: 0x0040, 0x1493: 0x0040, 0x1494: 0x0040, 0x1495: 0x0040, 0x1496: 0x0040, 0x1497: 0x0040, - 0x1498: 0x0040, 0x1499: 0x0040, 0x149a: 0x0040, 0x149b: 0x0040, 0x149c: 0x0040, 0x149d: 0x0040, - 0x149e: 0x0040, 0x149f: 0x0040, 0x14a0: 0x0040, 0x14a1: 0x0040, 0x14a2: 0x0040, 0x14a3: 0x0040, - 0x14a4: 0x0040, 0x14a5: 0x0040, 0x14a6: 0x0040, 0x14a7: 0x0040, 0x14a8: 0x0040, 0x14a9: 0x0040, - 0x14aa: 0x0040, 0x14ab: 0x0040, 0x14ac: 0x0040, 0x14ad: 0x0040, 0x14ae: 0x0040, 0x14af: 0x0040, - 0x14b0: 0xaa61, 0x14b1: 0xaa99, 0x14b2: 0xaad1, 0x14b3: 0xab19, 0x14b4: 0xab61, 0x14b5: 0xaba9, - 0x14b6: 0xabf1, 0x14b7: 0xac39, 0x14b8: 0xac81, 0x14b9: 0xacc9, 0x14ba: 0xad02, 0x14bb: 0xae12, - 0x14bc: 0xae91, 0x14bd: 0x0018, 0x14be: 0x0040, 0x14bf: 0x0040, - // Block 0x53, offset 0x14c0 - 0x14c0: 0x13c0, 0x14c1: 0x13c0, 0x14c2: 0x13c0, 0x14c3: 0x13c0, 0x14c4: 0x13c0, 0x14c5: 0x13c0, - 0x14c6: 0x13c0, 0x14c7: 0x13c0, 0x14c8: 0x13c0, 0x14c9: 0x13c0, 0x14ca: 0x13c0, 0x14cb: 0x13c0, - 0x14cc: 0x13c0, 0x14cd: 0x13c0, 0x14ce: 0x13c0, 0x14cf: 0x13c0, 0x14d0: 0xaeda, 0x14d1: 0x7d55, - 0x14d2: 0x0040, 0x14d3: 0xaeea, 0x14d4: 0x03c2, 0x14d5: 0xaefa, 0x14d6: 0xaf0a, 0x14d7: 0x7d75, - 0x14d8: 0x7d95, 0x14d9: 0x0040, 0x14da: 0x0040, 0x14db: 0x0040, 0x14dc: 0x0040, 0x14dd: 0x0040, - 0x14de: 0x0040, 0x14df: 0x0040, 0x14e0: 0x1308, 0x14e1: 0x1308, 0x14e2: 0x1308, 0x14e3: 0x1308, - 0x14e4: 0x1308, 0x14e5: 0x1308, 0x14e6: 0x1308, 0x14e7: 0x1308, 0x14e8: 0x1308, 0x14e9: 0x1308, - 0x14ea: 0x1308, 0x14eb: 0x1308, 0x14ec: 0x1308, 0x14ed: 0x1308, 0x14ee: 0x1308, 0x14ef: 0x1308, - 0x14f0: 0x0040, 0x14f1: 0x7db5, 0x14f2: 0x7dd5, 0x14f3: 0xaf1a, 0x14f4: 0xaf1a, 0x14f5: 0x1fd2, - 0x14f6: 0x1fe2, 0x14f7: 0xaf2a, 0x14f8: 0xaf3a, 0x14f9: 0x7df5, 0x14fa: 0x7e15, 0x14fb: 0x7e35, - 0x14fc: 0x7df5, 0x14fd: 0x7e55, 0x14fe: 0x7e75, 0x14ff: 0x7e55, - // Block 0x54, offset 0x1500 - 0x1500: 0x7e95, 0x1501: 0x7eb5, 0x1502: 0x7ed5, 0x1503: 0x7eb5, 0x1504: 0x7ef5, 0x1505: 0x0018, - 0x1506: 0x0018, 0x1507: 0xaf4a, 0x1508: 0xaf5a, 0x1509: 0x7f16, 0x150a: 0x7f36, 0x150b: 0x7f56, - 0x150c: 0x7f76, 0x150d: 0xaf1a, 0x150e: 0xaf1a, 0x150f: 0xaf1a, 0x1510: 0xaeda, 0x1511: 0x7f95, - 0x1512: 0x0040, 0x1513: 0x0040, 0x1514: 0x03c2, 0x1515: 0xaeea, 0x1516: 0xaf0a, 0x1517: 0xaefa, - 0x1518: 0x7fb5, 0x1519: 0x1fd2, 0x151a: 0x1fe2, 0x151b: 0xaf2a, 0x151c: 0xaf3a, 0x151d: 0x7e95, - 0x151e: 0x7ef5, 0x151f: 0xaf6a, 0x1520: 0xaf7a, 0x1521: 0xaf8a, 0x1522: 0x1fb2, 0x1523: 0xaf99, - 0x1524: 0xafaa, 0x1525: 0xafba, 0x1526: 0x1fc2, 0x1527: 0x0040, 0x1528: 0xafca, 0x1529: 0xafda, - 0x152a: 0xafea, 0x152b: 0xaffa, 0x152c: 0x0040, 0x152d: 0x0040, 0x152e: 0x0040, 0x152f: 0x0040, - 0x1530: 0x7fd6, 0x1531: 0xb009, 0x1532: 0x7ff6, 0x1533: 0x0008, 0x1534: 0x8016, 0x1535: 0x0040, - 0x1536: 0x8036, 0x1537: 0xb031, 0x1538: 0x8056, 0x1539: 0xb059, 0x153a: 0x8076, 0x153b: 0xb081, - 0x153c: 0x8096, 0x153d: 0xb0a9, 0x153e: 0x80b6, 0x153f: 0xb0d1, - // Block 0x55, offset 0x1540 - 0x1540: 0xb0f9, 0x1541: 0xb111, 0x1542: 0xb111, 0x1543: 0xb129, 0x1544: 0xb129, 0x1545: 0xb141, - 0x1546: 0xb141, 0x1547: 0xb159, 0x1548: 0xb159, 0x1549: 0xb171, 0x154a: 0xb171, 0x154b: 0xb171, - 0x154c: 0xb171, 0x154d: 0xb189, 0x154e: 0xb189, 0x154f: 0xb1a1, 0x1550: 0xb1a1, 0x1551: 0xb1a1, - 0x1552: 0xb1a1, 0x1553: 0xb1b9, 0x1554: 0xb1b9, 0x1555: 0xb1d1, 0x1556: 0xb1d1, 0x1557: 0xb1d1, - 0x1558: 0xb1d1, 0x1559: 0xb1e9, 0x155a: 0xb1e9, 0x155b: 0xb1e9, 0x155c: 0xb1e9, 0x155d: 0xb201, - 0x155e: 0xb201, 0x155f: 0xb201, 0x1560: 0xb201, 0x1561: 0xb219, 0x1562: 0xb219, 0x1563: 0xb219, - 0x1564: 0xb219, 0x1565: 0xb231, 0x1566: 0xb231, 0x1567: 0xb231, 0x1568: 0xb231, 0x1569: 0xb249, - 0x156a: 0xb249, 0x156b: 0xb261, 0x156c: 0xb261, 0x156d: 0xb279, 0x156e: 0xb279, 0x156f: 0xb291, - 0x1570: 0xb291, 0x1571: 0xb2a9, 0x1572: 0xb2a9, 0x1573: 0xb2a9, 0x1574: 0xb2a9, 0x1575: 0xb2c1, - 0x1576: 0xb2c1, 0x1577: 0xb2c1, 0x1578: 0xb2c1, 0x1579: 0xb2d9, 0x157a: 0xb2d9, 0x157b: 0xb2d9, - 0x157c: 0xb2d9, 0x157d: 0xb2f1, 0x157e: 0xb2f1, 0x157f: 0xb2f1, - // Block 0x56, offset 0x1580 - 0x1580: 0xb2f1, 0x1581: 0xb309, 0x1582: 0xb309, 0x1583: 0xb309, 0x1584: 0xb309, 0x1585: 0xb321, - 0x1586: 0xb321, 0x1587: 0xb321, 0x1588: 0xb321, 0x1589: 0xb339, 0x158a: 0xb339, 0x158b: 0xb339, - 0x158c: 0xb339, 0x158d: 0xb351, 0x158e: 0xb351, 0x158f: 0xb351, 0x1590: 0xb351, 0x1591: 0xb369, - 0x1592: 0xb369, 0x1593: 0xb369, 0x1594: 0xb369, 0x1595: 0xb381, 0x1596: 0xb381, 0x1597: 0xb381, - 0x1598: 0xb381, 0x1599: 0xb399, 0x159a: 0xb399, 0x159b: 0xb399, 0x159c: 0xb399, 0x159d: 0xb3b1, - 0x159e: 0xb3b1, 0x159f: 0xb3b1, 0x15a0: 0xb3b1, 0x15a1: 0xb3c9, 0x15a2: 0xb3c9, 0x15a3: 0xb3c9, - 0x15a4: 0xb3c9, 0x15a5: 0xb3e1, 0x15a6: 0xb3e1, 0x15a7: 0xb3e1, 0x15a8: 0xb3e1, 0x15a9: 0xb3f9, - 0x15aa: 0xb3f9, 0x15ab: 0xb3f9, 0x15ac: 0xb3f9, 0x15ad: 0xb411, 0x15ae: 0xb411, 0x15af: 0x7ab1, - 0x15b0: 0x7ab1, 0x15b1: 0xb429, 0x15b2: 0xb429, 0x15b3: 0xb429, 0x15b4: 0xb429, 0x15b5: 0xb441, - 0x15b6: 0xb441, 0x15b7: 0xb469, 0x15b8: 0xb469, 0x15b9: 0xb491, 0x15ba: 0xb491, 0x15bb: 0xb4b9, - 0x15bc: 0xb4b9, 0x15bd: 0x0040, 0x15be: 0x0040, 0x15bf: 0x03c0, - // Block 0x57, offset 0x15c0 - 0x15c0: 0x0040, 0x15c1: 0xaefa, 0x15c2: 0xb4e2, 0x15c3: 0xaf6a, 0x15c4: 0xafda, 0x15c5: 0xafea, - 0x15c6: 0xaf7a, 0x15c7: 0xb4f2, 0x15c8: 0x1fd2, 0x15c9: 0x1fe2, 0x15ca: 0xaf8a, 0x15cb: 0x1fb2, - 0x15cc: 0xaeda, 0x15cd: 0xaf99, 0x15ce: 0x29d1, 0x15cf: 0xb502, 0x15d0: 0x1f41, 0x15d1: 0x00c9, - 0x15d2: 0x0069, 0x15d3: 0x0079, 0x15d4: 0x1f51, 0x15d5: 0x1f61, 0x15d6: 0x1f71, 0x15d7: 0x1f81, - 0x15d8: 0x1f91, 0x15d9: 0x1fa1, 0x15da: 0xaeea, 0x15db: 0x03c2, 0x15dc: 0xafaa, 0x15dd: 0x1fc2, - 0x15de: 0xafba, 0x15df: 0xaf0a, 0x15e0: 0xaffa, 0x15e1: 0x0039, 0x15e2: 0x0ee9, 0x15e3: 0x1159, - 0x15e4: 0x0ef9, 0x15e5: 0x0f09, 0x15e6: 0x1199, 0x15e7: 0x0f31, 0x15e8: 0x0249, 0x15e9: 0x0f41, - 0x15ea: 0x0259, 0x15eb: 0x0f51, 0x15ec: 0x0359, 0x15ed: 0x0f61, 0x15ee: 0x0f71, 0x15ef: 0x00d9, - 0x15f0: 0x0f99, 0x15f1: 0x2039, 0x15f2: 0x0269, 0x15f3: 0x01d9, 0x15f4: 0x0fa9, 0x15f5: 0x0fb9, - 0x15f6: 0x1089, 0x15f7: 0x0279, 0x15f8: 0x0369, 0x15f9: 0x0289, 0x15fa: 0x13d1, 0x15fb: 0xaf4a, - 0x15fc: 0xafca, 0x15fd: 0xaf5a, 0x15fe: 0xb512, 0x15ff: 0xaf1a, - // Block 0x58, offset 0x1600 - 0x1600: 0x1caa, 0x1601: 0x0039, 0x1602: 0x0ee9, 0x1603: 0x1159, 0x1604: 0x0ef9, 0x1605: 0x0f09, - 0x1606: 0x1199, 0x1607: 0x0f31, 0x1608: 0x0249, 0x1609: 0x0f41, 0x160a: 0x0259, 0x160b: 0x0f51, - 0x160c: 0x0359, 0x160d: 0x0f61, 0x160e: 0x0f71, 0x160f: 0x00d9, 0x1610: 0x0f99, 0x1611: 0x2039, - 0x1612: 0x0269, 0x1613: 0x01d9, 0x1614: 0x0fa9, 0x1615: 0x0fb9, 0x1616: 0x1089, 0x1617: 0x0279, - 0x1618: 0x0369, 0x1619: 0x0289, 0x161a: 0x13d1, 0x161b: 0xaf2a, 0x161c: 0xb522, 0x161d: 0xaf3a, - 0x161e: 0xb532, 0x161f: 0x80d5, 0x1620: 0x80f5, 0x1621: 0x29d1, 0x1622: 0x8115, 0x1623: 0x8115, - 0x1624: 0x8135, 0x1625: 0x8155, 0x1626: 0x8175, 0x1627: 0x8195, 0x1628: 0x81b5, 0x1629: 0x81d5, - 0x162a: 0x81f5, 0x162b: 0x8215, 0x162c: 0x8235, 0x162d: 0x8255, 0x162e: 0x8275, 0x162f: 0x8295, - 0x1630: 0x82b5, 0x1631: 0x82d5, 0x1632: 0x82f5, 0x1633: 0x8315, 0x1634: 0x8335, 0x1635: 0x8355, - 0x1636: 0x8375, 0x1637: 0x8395, 0x1638: 0x83b5, 0x1639: 0x83d5, 0x163a: 0x83f5, 0x163b: 0x8415, - 0x163c: 0x81b5, 0x163d: 0x8435, 0x163e: 0x8455, 0x163f: 0x8215, - // Block 0x59, offset 0x1640 - 0x1640: 0x8475, 0x1641: 0x8495, 0x1642: 0x84b5, 0x1643: 0x84d5, 0x1644: 0x84f5, 0x1645: 0x8515, - 0x1646: 0x8535, 0x1647: 0x8555, 0x1648: 0x84d5, 0x1649: 0x8575, 0x164a: 0x84d5, 0x164b: 0x8595, - 0x164c: 0x8595, 0x164d: 0x85b5, 0x164e: 0x85b5, 0x164f: 0x85d5, 0x1650: 0x8515, 0x1651: 0x85f5, - 0x1652: 0x8615, 0x1653: 0x85f5, 0x1654: 0x8635, 0x1655: 0x8615, 0x1656: 0x8655, 0x1657: 0x8655, - 0x1658: 0x8675, 0x1659: 0x8675, 0x165a: 0x8695, 0x165b: 0x8695, 0x165c: 0x8615, 0x165d: 0x8115, - 0x165e: 0x86b5, 0x165f: 0x86d5, 0x1660: 0x0040, 0x1661: 0x86f5, 0x1662: 0x8715, 0x1663: 0x8735, - 0x1664: 0x8755, 0x1665: 0x8735, 0x1666: 0x8775, 0x1667: 0x8795, 0x1668: 0x87b5, 0x1669: 0x87b5, - 0x166a: 0x87d5, 0x166b: 0x87d5, 0x166c: 0x87f5, 0x166d: 0x87f5, 0x166e: 0x87d5, 0x166f: 0x87d5, - 0x1670: 0x8815, 0x1671: 0x8835, 0x1672: 0x8855, 0x1673: 0x8875, 0x1674: 0x8895, 0x1675: 0x88b5, - 0x1676: 0x88b5, 0x1677: 0x88b5, 0x1678: 0x88d5, 0x1679: 0x88d5, 0x167a: 0x88d5, 0x167b: 0x88d5, - 0x167c: 0x87b5, 0x167d: 0x87b5, 0x167e: 0x87b5, 0x167f: 0x0040, - // Block 0x5a, offset 0x1680 - 0x1680: 0x0040, 0x1681: 0x0040, 0x1682: 0x8715, 0x1683: 0x86f5, 0x1684: 0x88f5, 0x1685: 0x86f5, - 0x1686: 0x8715, 0x1687: 0x86f5, 0x1688: 0x0040, 0x1689: 0x0040, 0x168a: 0x8915, 0x168b: 0x8715, - 0x168c: 0x8935, 0x168d: 0x88f5, 0x168e: 0x8935, 0x168f: 0x8715, 0x1690: 0x0040, 0x1691: 0x0040, - 0x1692: 0x8955, 0x1693: 0x8975, 0x1694: 0x8875, 0x1695: 0x8935, 0x1696: 0x88f5, 0x1697: 0x8935, - 0x1698: 0x0040, 0x1699: 0x0040, 0x169a: 0x8995, 0x169b: 0x89b5, 0x169c: 0x8995, 0x169d: 0x0040, - 0x169e: 0x0040, 0x169f: 0x0040, 0x16a0: 0xb541, 0x16a1: 0xb559, 0x16a2: 0xb571, 0x16a3: 0x89d6, - 0x16a4: 0xb589, 0x16a5: 0xb5a1, 0x16a6: 0x89f5, 0x16a7: 0x0040, 0x16a8: 0x8a15, 0x16a9: 0x8a35, - 0x16aa: 0x8a55, 0x16ab: 0x8a35, 0x16ac: 0x8a75, 0x16ad: 0x8a95, 0x16ae: 0x8ab5, 0x16af: 0x0040, - 0x16b0: 0x0040, 0x16b1: 0x0040, 0x16b2: 0x0040, 0x16b3: 0x0040, 0x16b4: 0x0040, 0x16b5: 0x0040, - 0x16b6: 0x0040, 0x16b7: 0x0040, 0x16b8: 0x0040, 0x16b9: 0x0340, 0x16ba: 0x0340, 0x16bb: 0x0340, - 0x16bc: 0x0040, 0x16bd: 0x0040, 0x16be: 0x0040, 0x16bf: 0x0040, - // Block 0x5b, offset 0x16c0 - 0x16c0: 0x0208, 0x16c1: 0x0208, 0x16c2: 0x0208, 0x16c3: 0x0208, 0x16c4: 0x0208, 0x16c5: 0x0408, - 0x16c6: 0x0008, 0x16c7: 0x0408, 0x16c8: 0x0018, 0x16c9: 0x0408, 0x16ca: 0x0408, 0x16cb: 0x0008, - 0x16cc: 0x0008, 0x16cd: 0x0108, 0x16ce: 0x0408, 0x16cf: 0x0408, 0x16d0: 0x0408, 0x16d1: 0x0408, - 0x16d2: 0x0408, 0x16d3: 0x0208, 0x16d4: 0x0208, 0x16d5: 0x0208, 0x16d6: 0x0208, 0x16d7: 0x0108, - 0x16d8: 0x0208, 0x16d9: 0x0208, 0x16da: 0x0208, 0x16db: 0x0208, 0x16dc: 0x0208, 0x16dd: 0x0408, - 0x16de: 0x0208, 0x16df: 0x0208, 0x16e0: 0x0208, 0x16e1: 0x0408, 0x16e2: 0x0008, 0x16e3: 0x0008, - 0x16e4: 0x0408, 0x16e5: 0x1308, 0x16e6: 0x1308, 0x16e7: 0x0040, 0x16e8: 0x0040, 0x16e9: 0x0040, - 0x16ea: 0x0040, 0x16eb: 0x0218, 0x16ec: 0x0218, 0x16ed: 0x0218, 0x16ee: 0x0218, 0x16ef: 0x0418, - 0x16f0: 0x0018, 0x16f1: 0x0018, 0x16f2: 0x0018, 0x16f3: 0x0018, 0x16f4: 0x0018, 0x16f5: 0x0018, - 0x16f6: 0x0018, 0x16f7: 0x0040, 0x16f8: 0x0040, 0x16f9: 0x0040, 0x16fa: 0x0040, 0x16fb: 0x0040, - 0x16fc: 0x0040, 0x16fd: 0x0040, 0x16fe: 0x0040, 0x16ff: 0x0040, - // Block 0x5c, offset 0x1700 - 0x1700: 0x0208, 0x1701: 0x0408, 0x1702: 0x0208, 0x1703: 0x0408, 0x1704: 0x0408, 0x1705: 0x0408, - 0x1706: 0x0208, 0x1707: 0x0208, 0x1708: 0x0208, 0x1709: 0x0408, 0x170a: 0x0208, 0x170b: 0x0208, - 0x170c: 0x0408, 0x170d: 0x0208, 0x170e: 0x0408, 0x170f: 0x0408, 0x1710: 0x0208, 0x1711: 0x0408, - 0x1712: 0x0040, 0x1713: 0x0040, 0x1714: 0x0040, 0x1715: 0x0040, 0x1716: 0x0040, 0x1717: 0x0040, - 0x1718: 0x0040, 0x1719: 0x0018, 0x171a: 0x0018, 0x171b: 0x0018, 0x171c: 0x0018, 0x171d: 0x0040, - 0x171e: 0x0040, 0x171f: 0x0040, 0x1720: 0x0040, 0x1721: 0x0040, 0x1722: 0x0040, 0x1723: 0x0040, - 0x1724: 0x0040, 0x1725: 0x0040, 0x1726: 0x0040, 0x1727: 0x0040, 0x1728: 0x0040, 0x1729: 0x0418, - 0x172a: 0x0418, 0x172b: 0x0418, 0x172c: 0x0418, 0x172d: 0x0218, 0x172e: 0x0218, 0x172f: 0x0018, - 0x1730: 0x0040, 0x1731: 0x0040, 0x1732: 0x0040, 0x1733: 0x0040, 0x1734: 0x0040, 0x1735: 0x0040, - 0x1736: 0x0040, 0x1737: 0x0040, 0x1738: 0x0040, 0x1739: 0x0040, 0x173a: 0x0040, 0x173b: 0x0040, - 0x173c: 0x0040, 0x173d: 0x0040, 0x173e: 0x0040, 0x173f: 0x0040, - // Block 0x5d, offset 0x1740 - 0x1740: 0x1308, 0x1741: 0x1308, 0x1742: 0x1008, 0x1743: 0x1008, 0x1744: 0x0040, 0x1745: 0x0008, - 0x1746: 0x0008, 0x1747: 0x0008, 0x1748: 0x0008, 0x1749: 0x0008, 0x174a: 0x0008, 0x174b: 0x0008, - 0x174c: 0x0008, 0x174d: 0x0040, 0x174e: 0x0040, 0x174f: 0x0008, 0x1750: 0x0008, 0x1751: 0x0040, - 0x1752: 0x0040, 0x1753: 0x0008, 0x1754: 0x0008, 0x1755: 0x0008, 0x1756: 0x0008, 0x1757: 0x0008, - 0x1758: 0x0008, 0x1759: 0x0008, 0x175a: 0x0008, 0x175b: 0x0008, 0x175c: 0x0008, 0x175d: 0x0008, - 0x175e: 0x0008, 0x175f: 0x0008, 0x1760: 0x0008, 0x1761: 0x0008, 0x1762: 0x0008, 0x1763: 0x0008, - 0x1764: 0x0008, 0x1765: 0x0008, 0x1766: 0x0008, 0x1767: 0x0008, 0x1768: 0x0008, 0x1769: 0x0040, - 0x176a: 0x0008, 0x176b: 0x0008, 0x176c: 0x0008, 0x176d: 0x0008, 0x176e: 0x0008, 0x176f: 0x0008, - 0x1770: 0x0008, 0x1771: 0x0040, 0x1772: 0x0008, 0x1773: 0x0008, 0x1774: 0x0040, 0x1775: 0x0008, - 0x1776: 0x0008, 0x1777: 0x0008, 0x1778: 0x0008, 0x1779: 0x0008, 0x177a: 0x0040, 0x177b: 0x0040, - 0x177c: 0x1308, 0x177d: 0x0008, 0x177e: 0x1008, 0x177f: 0x1008, - // Block 0x5e, offset 0x1780 - 0x1780: 0x1308, 0x1781: 0x1008, 0x1782: 0x1008, 0x1783: 0x1008, 0x1784: 0x1008, 0x1785: 0x0040, - 0x1786: 0x0040, 0x1787: 0x1008, 0x1788: 0x1008, 0x1789: 0x0040, 0x178a: 0x0040, 0x178b: 0x1008, - 0x178c: 0x1008, 0x178d: 0x1808, 0x178e: 0x0040, 0x178f: 0x0040, 0x1790: 0x0008, 0x1791: 0x0040, - 0x1792: 0x0040, 0x1793: 0x0040, 0x1794: 0x0040, 0x1795: 0x0040, 0x1796: 0x0040, 0x1797: 0x1008, - 0x1798: 0x0040, 0x1799: 0x0040, 0x179a: 0x0040, 0x179b: 0x0040, 0x179c: 0x0040, 0x179d: 0x0008, - 0x179e: 0x0008, 0x179f: 0x0008, 0x17a0: 0x0008, 0x17a1: 0x0008, 0x17a2: 0x1008, 0x17a3: 0x1008, - 0x17a4: 0x0040, 0x17a5: 0x0040, 0x17a6: 0x1308, 0x17a7: 0x1308, 0x17a8: 0x1308, 0x17a9: 0x1308, - 0x17aa: 0x1308, 0x17ab: 0x1308, 0x17ac: 0x1308, 0x17ad: 0x0040, 0x17ae: 0x0040, 0x17af: 0x0040, - 0x17b0: 0x1308, 0x17b1: 0x1308, 0x17b2: 0x1308, 0x17b3: 0x1308, 0x17b4: 0x1308, 0x17b5: 0x0040, - 0x17b6: 0x0040, 0x17b7: 0x0040, 0x17b8: 0x0040, 0x17b9: 0x0040, 0x17ba: 0x0040, 0x17bb: 0x0040, - 0x17bc: 0x0040, 0x17bd: 0x0040, 0x17be: 0x0040, 0x17bf: 0x0040, - // Block 0x5f, offset 0x17c0 - 0x17c0: 0x0039, 0x17c1: 0x0ee9, 0x17c2: 0x1159, 0x17c3: 0x0ef9, 0x17c4: 0x0f09, 0x17c5: 0x1199, - 0x17c6: 0x0f31, 0x17c7: 0x0249, 0x17c8: 0x0f41, 0x17c9: 0x0259, 0x17ca: 0x0f51, 0x17cb: 0x0359, - 0x17cc: 0x0f61, 0x17cd: 0x0f71, 0x17ce: 0x00d9, 0x17cf: 0x0f99, 0x17d0: 0x2039, 0x17d1: 0x0269, - 0x17d2: 0x01d9, 0x17d3: 0x0fa9, 0x17d4: 0x0fb9, 0x17d5: 0x1089, 0x17d6: 0x0279, 0x17d7: 0x0369, - 0x17d8: 0x0289, 0x17d9: 0x13d1, 0x17da: 0x0039, 0x17db: 0x0ee9, 0x17dc: 0x1159, 0x17dd: 0x0ef9, - 0x17de: 0x0f09, 0x17df: 0x1199, 0x17e0: 0x0f31, 0x17e1: 0x0249, 0x17e2: 0x0f41, 0x17e3: 0x0259, - 0x17e4: 0x0f51, 0x17e5: 0x0359, 0x17e6: 0x0f61, 0x17e7: 0x0f71, 0x17e8: 0x00d9, 0x17e9: 0x0f99, - 0x17ea: 0x2039, 0x17eb: 0x0269, 0x17ec: 0x01d9, 0x17ed: 0x0fa9, 0x17ee: 0x0fb9, 0x17ef: 0x1089, - 0x17f0: 0x0279, 0x17f1: 0x0369, 0x17f2: 0x0289, 0x17f3: 0x13d1, 0x17f4: 0x0039, 0x17f5: 0x0ee9, - 0x17f6: 0x1159, 0x17f7: 0x0ef9, 0x17f8: 0x0f09, 0x17f9: 0x1199, 0x17fa: 0x0f31, 0x17fb: 0x0249, - 0x17fc: 0x0f41, 0x17fd: 0x0259, 0x17fe: 0x0f51, 0x17ff: 0x0359, - // Block 0x60, offset 0x1800 - 0x1800: 0x0f61, 0x1801: 0x0f71, 0x1802: 0x00d9, 0x1803: 0x0f99, 0x1804: 0x2039, 0x1805: 0x0269, - 0x1806: 0x01d9, 0x1807: 0x0fa9, 0x1808: 0x0fb9, 0x1809: 0x1089, 0x180a: 0x0279, 0x180b: 0x0369, - 0x180c: 0x0289, 0x180d: 0x13d1, 0x180e: 0x0039, 0x180f: 0x0ee9, 0x1810: 0x1159, 0x1811: 0x0ef9, - 0x1812: 0x0f09, 0x1813: 0x1199, 0x1814: 0x0f31, 0x1815: 0x0040, 0x1816: 0x0f41, 0x1817: 0x0259, - 0x1818: 0x0f51, 0x1819: 0x0359, 0x181a: 0x0f61, 0x181b: 0x0f71, 0x181c: 0x00d9, 0x181d: 0x0f99, - 0x181e: 0x2039, 0x181f: 0x0269, 0x1820: 0x01d9, 0x1821: 0x0fa9, 0x1822: 0x0fb9, 0x1823: 0x1089, - 0x1824: 0x0279, 0x1825: 0x0369, 0x1826: 0x0289, 0x1827: 0x13d1, 0x1828: 0x0039, 0x1829: 0x0ee9, - 0x182a: 0x1159, 0x182b: 0x0ef9, 0x182c: 0x0f09, 0x182d: 0x1199, 0x182e: 0x0f31, 0x182f: 0x0249, - 0x1830: 0x0f41, 0x1831: 0x0259, 0x1832: 0x0f51, 0x1833: 0x0359, 0x1834: 0x0f61, 0x1835: 0x0f71, - 0x1836: 0x00d9, 0x1837: 0x0f99, 0x1838: 0x2039, 0x1839: 0x0269, 0x183a: 0x01d9, 0x183b: 0x0fa9, - 0x183c: 0x0fb9, 0x183d: 0x1089, 0x183e: 0x0279, 0x183f: 0x0369, - // Block 0x61, offset 0x1840 - 0x1840: 0x0289, 0x1841: 0x13d1, 0x1842: 0x0039, 0x1843: 0x0ee9, 0x1844: 0x1159, 0x1845: 0x0ef9, - 0x1846: 0x0f09, 0x1847: 0x1199, 0x1848: 0x0f31, 0x1849: 0x0249, 0x184a: 0x0f41, 0x184b: 0x0259, - 0x184c: 0x0f51, 0x184d: 0x0359, 0x184e: 0x0f61, 0x184f: 0x0f71, 0x1850: 0x00d9, 0x1851: 0x0f99, - 0x1852: 0x2039, 0x1853: 0x0269, 0x1854: 0x01d9, 0x1855: 0x0fa9, 0x1856: 0x0fb9, 0x1857: 0x1089, - 0x1858: 0x0279, 0x1859: 0x0369, 0x185a: 0x0289, 0x185b: 0x13d1, 0x185c: 0x0039, 0x185d: 0x0040, - 0x185e: 0x1159, 0x185f: 0x0ef9, 0x1860: 0x0040, 0x1861: 0x0040, 0x1862: 0x0f31, 0x1863: 0x0040, - 0x1864: 0x0040, 0x1865: 0x0259, 0x1866: 0x0f51, 0x1867: 0x0040, 0x1868: 0x0040, 0x1869: 0x0f71, - 0x186a: 0x00d9, 0x186b: 0x0f99, 0x186c: 0x2039, 0x186d: 0x0040, 0x186e: 0x01d9, 0x186f: 0x0fa9, - 0x1870: 0x0fb9, 0x1871: 0x1089, 0x1872: 0x0279, 0x1873: 0x0369, 0x1874: 0x0289, 0x1875: 0x13d1, - 0x1876: 0x0039, 0x1877: 0x0ee9, 0x1878: 0x1159, 0x1879: 0x0ef9, 0x187a: 0x0040, 0x187b: 0x1199, - 0x187c: 0x0040, 0x187d: 0x0249, 0x187e: 0x0f41, 0x187f: 0x0259, - // Block 0x62, offset 0x1880 - 0x1880: 0x0f51, 0x1881: 0x0359, 0x1882: 0x0f61, 0x1883: 0x0f71, 0x1884: 0x0040, 0x1885: 0x0f99, - 0x1886: 0x2039, 0x1887: 0x0269, 0x1888: 0x01d9, 0x1889: 0x0fa9, 0x188a: 0x0fb9, 0x188b: 0x1089, - 0x188c: 0x0279, 0x188d: 0x0369, 0x188e: 0x0289, 0x188f: 0x13d1, 0x1890: 0x0039, 0x1891: 0x0ee9, - 0x1892: 0x1159, 0x1893: 0x0ef9, 0x1894: 0x0f09, 0x1895: 0x1199, 0x1896: 0x0f31, 0x1897: 0x0249, - 0x1898: 0x0f41, 0x1899: 0x0259, 0x189a: 0x0f51, 0x189b: 0x0359, 0x189c: 0x0f61, 0x189d: 0x0f71, - 0x189e: 0x00d9, 0x189f: 0x0f99, 0x18a0: 0x2039, 0x18a1: 0x0269, 0x18a2: 0x01d9, 0x18a3: 0x0fa9, - 0x18a4: 0x0fb9, 0x18a5: 0x1089, 0x18a6: 0x0279, 0x18a7: 0x0369, 0x18a8: 0x0289, 0x18a9: 0x13d1, - 0x18aa: 0x0039, 0x18ab: 0x0ee9, 0x18ac: 0x1159, 0x18ad: 0x0ef9, 0x18ae: 0x0f09, 0x18af: 0x1199, - 0x18b0: 0x0f31, 0x18b1: 0x0249, 0x18b2: 0x0f41, 0x18b3: 0x0259, 0x18b4: 0x0f51, 0x18b5: 0x0359, - 0x18b6: 0x0f61, 0x18b7: 0x0f71, 0x18b8: 0x00d9, 0x18b9: 0x0f99, 0x18ba: 0x2039, 0x18bb: 0x0269, - 0x18bc: 0x01d9, 0x18bd: 0x0fa9, 0x18be: 0x0fb9, 0x18bf: 0x1089, - // Block 0x63, offset 0x18c0 - 0x18c0: 0x0279, 0x18c1: 0x0369, 0x18c2: 0x0289, 0x18c3: 0x13d1, 0x18c4: 0x0039, 0x18c5: 0x0ee9, - 0x18c6: 0x0040, 0x18c7: 0x0ef9, 0x18c8: 0x0f09, 0x18c9: 0x1199, 0x18ca: 0x0f31, 0x18cb: 0x0040, - 0x18cc: 0x0040, 0x18cd: 0x0259, 0x18ce: 0x0f51, 0x18cf: 0x0359, 0x18d0: 0x0f61, 0x18d1: 0x0f71, - 0x18d2: 0x00d9, 0x18d3: 0x0f99, 0x18d4: 0x2039, 0x18d5: 0x0040, 0x18d6: 0x01d9, 0x18d7: 0x0fa9, - 0x18d8: 0x0fb9, 0x18d9: 0x1089, 0x18da: 0x0279, 0x18db: 0x0369, 0x18dc: 0x0289, 0x18dd: 0x0040, - 0x18de: 0x0039, 0x18df: 0x0ee9, 0x18e0: 0x1159, 0x18e1: 0x0ef9, 0x18e2: 0x0f09, 0x18e3: 0x1199, - 0x18e4: 0x0f31, 0x18e5: 0x0249, 0x18e6: 0x0f41, 0x18e7: 0x0259, 0x18e8: 0x0f51, 0x18e9: 0x0359, - 0x18ea: 0x0f61, 0x18eb: 0x0f71, 0x18ec: 0x00d9, 0x18ed: 0x0f99, 0x18ee: 0x2039, 0x18ef: 0x0269, - 0x18f0: 0x01d9, 0x18f1: 0x0fa9, 0x18f2: 0x0fb9, 0x18f3: 0x1089, 0x18f4: 0x0279, 0x18f5: 0x0369, - 0x18f6: 0x0289, 0x18f7: 0x13d1, 0x18f8: 0x0039, 0x18f9: 0x0ee9, 0x18fa: 0x0040, 0x18fb: 0x0ef9, - 0x18fc: 0x0f09, 0x18fd: 0x1199, 0x18fe: 0x0f31, 0x18ff: 0x0040, - // Block 0x64, offset 0x1900 - 0x1900: 0x0f41, 0x1901: 0x0259, 0x1902: 0x0f51, 0x1903: 0x0359, 0x1904: 0x0f61, 0x1905: 0x0040, - 0x1906: 0x00d9, 0x1907: 0x0040, 0x1908: 0x0040, 0x1909: 0x0040, 0x190a: 0x01d9, 0x190b: 0x0fa9, - 0x190c: 0x0fb9, 0x190d: 0x1089, 0x190e: 0x0279, 0x190f: 0x0369, 0x1910: 0x0289, 0x1911: 0x0040, - 0x1912: 0x0039, 0x1913: 0x0ee9, 0x1914: 0x1159, 0x1915: 0x0ef9, 0x1916: 0x0f09, 0x1917: 0x1199, - 0x1918: 0x0f31, 0x1919: 0x0249, 0x191a: 0x0f41, 0x191b: 0x0259, 0x191c: 0x0f51, 0x191d: 0x0359, - 0x191e: 0x0f61, 0x191f: 0x0f71, 0x1920: 0x00d9, 0x1921: 0x0f99, 0x1922: 0x2039, 0x1923: 0x0269, - 0x1924: 0x01d9, 0x1925: 0x0fa9, 0x1926: 0x0fb9, 0x1927: 0x1089, 0x1928: 0x0279, 0x1929: 0x0369, - 0x192a: 0x0289, 0x192b: 0x13d1, 0x192c: 0x0039, 0x192d: 0x0ee9, 0x192e: 0x1159, 0x192f: 0x0ef9, - 0x1930: 0x0f09, 0x1931: 0x1199, 0x1932: 0x0f31, 0x1933: 0x0249, 0x1934: 0x0f41, 0x1935: 0x0259, - 0x1936: 0x0f51, 0x1937: 0x0359, 0x1938: 0x0f61, 0x1939: 0x0f71, 0x193a: 0x00d9, 0x193b: 0x0f99, - 0x193c: 0x2039, 0x193d: 0x0269, 0x193e: 0x01d9, 0x193f: 0x0fa9, - // Block 0x65, offset 0x1940 - 0x1940: 0x0fb9, 0x1941: 0x1089, 0x1942: 0x0279, 0x1943: 0x0369, 0x1944: 0x0289, 0x1945: 0x13d1, - 0x1946: 0x0039, 0x1947: 0x0ee9, 0x1948: 0x1159, 0x1949: 0x0ef9, 0x194a: 0x0f09, 0x194b: 0x1199, - 0x194c: 0x0f31, 0x194d: 0x0249, 0x194e: 0x0f41, 0x194f: 0x0259, 0x1950: 0x0f51, 0x1951: 0x0359, - 0x1952: 0x0f61, 0x1953: 0x0f71, 0x1954: 0x00d9, 0x1955: 0x0f99, 0x1956: 0x2039, 0x1957: 0x0269, - 0x1958: 0x01d9, 0x1959: 0x0fa9, 0x195a: 0x0fb9, 0x195b: 0x1089, 0x195c: 0x0279, 0x195d: 0x0369, - 0x195e: 0x0289, 0x195f: 0x13d1, 0x1960: 0x0039, 0x1961: 0x0ee9, 0x1962: 0x1159, 0x1963: 0x0ef9, - 0x1964: 0x0f09, 0x1965: 0x1199, 0x1966: 0x0f31, 0x1967: 0x0249, 0x1968: 0x0f41, 0x1969: 0x0259, - 0x196a: 0x0f51, 0x196b: 0x0359, 0x196c: 0x0f61, 0x196d: 0x0f71, 0x196e: 0x00d9, 0x196f: 0x0f99, - 0x1970: 0x2039, 0x1971: 0x0269, 0x1972: 0x01d9, 0x1973: 0x0fa9, 0x1974: 0x0fb9, 0x1975: 0x1089, - 0x1976: 0x0279, 0x1977: 0x0369, 0x1978: 0x0289, 0x1979: 0x13d1, 0x197a: 0x0039, 0x197b: 0x0ee9, - 0x197c: 0x1159, 0x197d: 0x0ef9, 0x197e: 0x0f09, 0x197f: 0x1199, - // Block 0x66, offset 0x1980 - 0x1980: 0x0f31, 0x1981: 0x0249, 0x1982: 0x0f41, 0x1983: 0x0259, 0x1984: 0x0f51, 0x1985: 0x0359, - 0x1986: 0x0f61, 0x1987: 0x0f71, 0x1988: 0x00d9, 0x1989: 0x0f99, 0x198a: 0x2039, 0x198b: 0x0269, - 0x198c: 0x01d9, 0x198d: 0x0fa9, 0x198e: 0x0fb9, 0x198f: 0x1089, 0x1990: 0x0279, 0x1991: 0x0369, - 0x1992: 0x0289, 0x1993: 0x13d1, 0x1994: 0x0039, 0x1995: 0x0ee9, 0x1996: 0x1159, 0x1997: 0x0ef9, - 0x1998: 0x0f09, 0x1999: 0x1199, 0x199a: 0x0f31, 0x199b: 0x0249, 0x199c: 0x0f41, 0x199d: 0x0259, - 0x199e: 0x0f51, 0x199f: 0x0359, 0x19a0: 0x0f61, 0x19a1: 0x0f71, 0x19a2: 0x00d9, 0x19a3: 0x0f99, - 0x19a4: 0x2039, 0x19a5: 0x0269, 0x19a6: 0x01d9, 0x19a7: 0x0fa9, 0x19a8: 0x0fb9, 0x19a9: 0x1089, - 0x19aa: 0x0279, 0x19ab: 0x0369, 0x19ac: 0x0289, 0x19ad: 0x13d1, 0x19ae: 0x0039, 0x19af: 0x0ee9, - 0x19b0: 0x1159, 0x19b1: 0x0ef9, 0x19b2: 0x0f09, 0x19b3: 0x1199, 0x19b4: 0x0f31, 0x19b5: 0x0249, - 0x19b6: 0x0f41, 0x19b7: 0x0259, 0x19b8: 0x0f51, 0x19b9: 0x0359, 0x19ba: 0x0f61, 0x19bb: 0x0f71, - 0x19bc: 0x00d9, 0x19bd: 0x0f99, 0x19be: 0x2039, 0x19bf: 0x0269, - // Block 0x67, offset 0x19c0 - 0x19c0: 0x01d9, 0x19c1: 0x0fa9, 0x19c2: 0x0fb9, 0x19c3: 0x1089, 0x19c4: 0x0279, 0x19c5: 0x0369, - 0x19c6: 0x0289, 0x19c7: 0x13d1, 0x19c8: 0x0039, 0x19c9: 0x0ee9, 0x19ca: 0x1159, 0x19cb: 0x0ef9, - 0x19cc: 0x0f09, 0x19cd: 0x1199, 0x19ce: 0x0f31, 0x19cf: 0x0249, 0x19d0: 0x0f41, 0x19d1: 0x0259, - 0x19d2: 0x0f51, 0x19d3: 0x0359, 0x19d4: 0x0f61, 0x19d5: 0x0f71, 0x19d6: 0x00d9, 0x19d7: 0x0f99, - 0x19d8: 0x2039, 0x19d9: 0x0269, 0x19da: 0x01d9, 0x19db: 0x0fa9, 0x19dc: 0x0fb9, 0x19dd: 0x1089, - 0x19de: 0x0279, 0x19df: 0x0369, 0x19e0: 0x0289, 0x19e1: 0x13d1, 0x19e2: 0x0039, 0x19e3: 0x0ee9, - 0x19e4: 0x1159, 0x19e5: 0x0ef9, 0x19e6: 0x0f09, 0x19e7: 0x1199, 0x19e8: 0x0f31, 0x19e9: 0x0249, - 0x19ea: 0x0f41, 0x19eb: 0x0259, 0x19ec: 0x0f51, 0x19ed: 0x0359, 0x19ee: 0x0f61, 0x19ef: 0x0f71, - 0x19f0: 0x00d9, 0x19f1: 0x0f99, 0x19f2: 0x2039, 0x19f3: 0x0269, 0x19f4: 0x01d9, 0x19f5: 0x0fa9, - 0x19f6: 0x0fb9, 0x19f7: 0x1089, 0x19f8: 0x0279, 0x19f9: 0x0369, 0x19fa: 0x0289, 0x19fb: 0x13d1, - 0x19fc: 0x0039, 0x19fd: 0x0ee9, 0x19fe: 0x1159, 0x19ff: 0x0ef9, - // Block 0x68, offset 0x1a00 - 0x1a00: 0x0f09, 0x1a01: 0x1199, 0x1a02: 0x0f31, 0x1a03: 0x0249, 0x1a04: 0x0f41, 0x1a05: 0x0259, - 0x1a06: 0x0f51, 0x1a07: 0x0359, 0x1a08: 0x0f61, 0x1a09: 0x0f71, 0x1a0a: 0x00d9, 0x1a0b: 0x0f99, - 0x1a0c: 0x2039, 0x1a0d: 0x0269, 0x1a0e: 0x01d9, 0x1a0f: 0x0fa9, 0x1a10: 0x0fb9, 0x1a11: 0x1089, - 0x1a12: 0x0279, 0x1a13: 0x0369, 0x1a14: 0x0289, 0x1a15: 0x13d1, 0x1a16: 0x0039, 0x1a17: 0x0ee9, - 0x1a18: 0x1159, 0x1a19: 0x0ef9, 0x1a1a: 0x0f09, 0x1a1b: 0x1199, 0x1a1c: 0x0f31, 0x1a1d: 0x0249, - 0x1a1e: 0x0f41, 0x1a1f: 0x0259, 0x1a20: 0x0f51, 0x1a21: 0x0359, 0x1a22: 0x0f61, 0x1a23: 0x0f71, - 0x1a24: 0x00d9, 0x1a25: 0x0f99, 0x1a26: 0x2039, 0x1a27: 0x0269, 0x1a28: 0x01d9, 0x1a29: 0x0fa9, - 0x1a2a: 0x0fb9, 0x1a2b: 0x1089, 0x1a2c: 0x0279, 0x1a2d: 0x0369, 0x1a2e: 0x0289, 0x1a2f: 0x13d1, - 0x1a30: 0x0039, 0x1a31: 0x0ee9, 0x1a32: 0x1159, 0x1a33: 0x0ef9, 0x1a34: 0x0f09, 0x1a35: 0x1199, - 0x1a36: 0x0f31, 0x1a37: 0x0249, 0x1a38: 0x0f41, 0x1a39: 0x0259, 0x1a3a: 0x0f51, 0x1a3b: 0x0359, - 0x1a3c: 0x0f61, 0x1a3d: 0x0f71, 0x1a3e: 0x00d9, 0x1a3f: 0x0f99, - // Block 0x69, offset 0x1a40 - 0x1a40: 0x2039, 0x1a41: 0x0269, 0x1a42: 0x01d9, 0x1a43: 0x0fa9, 0x1a44: 0x0fb9, 0x1a45: 0x1089, - 0x1a46: 0x0279, 0x1a47: 0x0369, 0x1a48: 0x0289, 0x1a49: 0x13d1, 0x1a4a: 0x0039, 0x1a4b: 0x0ee9, - 0x1a4c: 0x1159, 0x1a4d: 0x0ef9, 0x1a4e: 0x0f09, 0x1a4f: 0x1199, 0x1a50: 0x0f31, 0x1a51: 0x0249, - 0x1a52: 0x0f41, 0x1a53: 0x0259, 0x1a54: 0x0f51, 0x1a55: 0x0359, 0x1a56: 0x0f61, 0x1a57: 0x0f71, - 0x1a58: 0x00d9, 0x1a59: 0x0f99, 0x1a5a: 0x2039, 0x1a5b: 0x0269, 0x1a5c: 0x01d9, 0x1a5d: 0x0fa9, - 0x1a5e: 0x0fb9, 0x1a5f: 0x1089, 0x1a60: 0x0279, 0x1a61: 0x0369, 0x1a62: 0x0289, 0x1a63: 0x13d1, - 0x1a64: 0xba81, 0x1a65: 0xba99, 0x1a66: 0x0040, 0x1a67: 0x0040, 0x1a68: 0xbab1, 0x1a69: 0x1099, - 0x1a6a: 0x10b1, 0x1a6b: 0x10c9, 0x1a6c: 0xbac9, 0x1a6d: 0xbae1, 0x1a6e: 0xbaf9, 0x1a6f: 0x1429, - 0x1a70: 0x1a31, 0x1a71: 0xbb11, 0x1a72: 0xbb29, 0x1a73: 0xbb41, 0x1a74: 0xbb59, 0x1a75: 0xbb71, - 0x1a76: 0xbb89, 0x1a77: 0x2109, 0x1a78: 0x1111, 0x1a79: 0x1429, 0x1a7a: 0xbba1, 0x1a7b: 0xbbb9, - 0x1a7c: 0xbbd1, 0x1a7d: 0x10e1, 0x1a7e: 0x10f9, 0x1a7f: 0xbbe9, - // Block 0x6a, offset 0x1a80 - 0x1a80: 0x2079, 0x1a81: 0xbc01, 0x1a82: 0xbab1, 0x1a83: 0x1099, 0x1a84: 0x10b1, 0x1a85: 0x10c9, - 0x1a86: 0xbac9, 0x1a87: 0xbae1, 0x1a88: 0xbaf9, 0x1a89: 0x1429, 0x1a8a: 0x1a31, 0x1a8b: 0xbb11, - 0x1a8c: 0xbb29, 0x1a8d: 0xbb41, 0x1a8e: 0xbb59, 0x1a8f: 0xbb71, 0x1a90: 0xbb89, 0x1a91: 0x2109, - 0x1a92: 0x1111, 0x1a93: 0xbba1, 0x1a94: 0xbba1, 0x1a95: 0xbbb9, 0x1a96: 0xbbd1, 0x1a97: 0x10e1, - 0x1a98: 0x10f9, 0x1a99: 0xbbe9, 0x1a9a: 0x2079, 0x1a9b: 0xbc21, 0x1a9c: 0xbac9, 0x1a9d: 0x1429, - 0x1a9e: 0xbb11, 0x1a9f: 0x10e1, 0x1aa0: 0x1111, 0x1aa1: 0x2109, 0x1aa2: 0xbab1, 0x1aa3: 0x1099, - 0x1aa4: 0x10b1, 0x1aa5: 0x10c9, 0x1aa6: 0xbac9, 0x1aa7: 0xbae1, 0x1aa8: 0xbaf9, 0x1aa9: 0x1429, - 0x1aaa: 0x1a31, 0x1aab: 0xbb11, 0x1aac: 0xbb29, 0x1aad: 0xbb41, 0x1aae: 0xbb59, 0x1aaf: 0xbb71, - 0x1ab0: 0xbb89, 0x1ab1: 0x2109, 0x1ab2: 0x1111, 0x1ab3: 0x1429, 0x1ab4: 0xbba1, 0x1ab5: 0xbbb9, - 0x1ab6: 0xbbd1, 0x1ab7: 0x10e1, 0x1ab8: 0x10f9, 0x1ab9: 0xbbe9, 0x1aba: 0x2079, 0x1abb: 0xbc01, - 0x1abc: 0xbab1, 0x1abd: 0x1099, 0x1abe: 0x10b1, 0x1abf: 0x10c9, - // Block 0x6b, offset 0x1ac0 - 0x1ac0: 0xbac9, 0x1ac1: 0xbae1, 0x1ac2: 0xbaf9, 0x1ac3: 0x1429, 0x1ac4: 0x1a31, 0x1ac5: 0xbb11, - 0x1ac6: 0xbb29, 0x1ac7: 0xbb41, 0x1ac8: 0xbb59, 0x1ac9: 0xbb71, 0x1aca: 0xbb89, 0x1acb: 0x2109, - 0x1acc: 0x1111, 0x1acd: 0xbba1, 0x1ace: 0xbba1, 0x1acf: 0xbbb9, 0x1ad0: 0xbbd1, 0x1ad1: 0x10e1, - 0x1ad2: 0x10f9, 0x1ad3: 0xbbe9, 0x1ad4: 0x2079, 0x1ad5: 0xbc21, 0x1ad6: 0xbac9, 0x1ad7: 0x1429, - 0x1ad8: 0xbb11, 0x1ad9: 0x10e1, 0x1ada: 0x1111, 0x1adb: 0x2109, 0x1adc: 0xbab1, 0x1add: 0x1099, - 0x1ade: 0x10b1, 0x1adf: 0x10c9, 0x1ae0: 0xbac9, 0x1ae1: 0xbae1, 0x1ae2: 0xbaf9, 0x1ae3: 0x1429, - 0x1ae4: 0x1a31, 0x1ae5: 0xbb11, 0x1ae6: 0xbb29, 0x1ae7: 0xbb41, 0x1ae8: 0xbb59, 0x1ae9: 0xbb71, - 0x1aea: 0xbb89, 0x1aeb: 0x2109, 0x1aec: 0x1111, 0x1aed: 0x1429, 0x1aee: 0xbba1, 0x1aef: 0xbbb9, - 0x1af0: 0xbbd1, 0x1af1: 0x10e1, 0x1af2: 0x10f9, 0x1af3: 0xbbe9, 0x1af4: 0x2079, 0x1af5: 0xbc01, - 0x1af6: 0xbab1, 0x1af7: 0x1099, 0x1af8: 0x10b1, 0x1af9: 0x10c9, 0x1afa: 0xbac9, 0x1afb: 0xbae1, - 0x1afc: 0xbaf9, 0x1afd: 0x1429, 0x1afe: 0x1a31, 0x1aff: 0xbb11, - // Block 0x6c, offset 0x1b00 - 0x1b00: 0xbb29, 0x1b01: 0xbb41, 0x1b02: 0xbb59, 0x1b03: 0xbb71, 0x1b04: 0xbb89, 0x1b05: 0x2109, - 0x1b06: 0x1111, 0x1b07: 0xbba1, 0x1b08: 0xbba1, 0x1b09: 0xbbb9, 0x1b0a: 0xbbd1, 0x1b0b: 0x10e1, - 0x1b0c: 0x10f9, 0x1b0d: 0xbbe9, 0x1b0e: 0x2079, 0x1b0f: 0xbc21, 0x1b10: 0xbac9, 0x1b11: 0x1429, - 0x1b12: 0xbb11, 0x1b13: 0x10e1, 0x1b14: 0x1111, 0x1b15: 0x2109, 0x1b16: 0xbab1, 0x1b17: 0x1099, - 0x1b18: 0x10b1, 0x1b19: 0x10c9, 0x1b1a: 0xbac9, 0x1b1b: 0xbae1, 0x1b1c: 0xbaf9, 0x1b1d: 0x1429, - 0x1b1e: 0x1a31, 0x1b1f: 0xbb11, 0x1b20: 0xbb29, 0x1b21: 0xbb41, 0x1b22: 0xbb59, 0x1b23: 0xbb71, - 0x1b24: 0xbb89, 0x1b25: 0x2109, 0x1b26: 0x1111, 0x1b27: 0x1429, 0x1b28: 0xbba1, 0x1b29: 0xbbb9, - 0x1b2a: 0xbbd1, 0x1b2b: 0x10e1, 0x1b2c: 0x10f9, 0x1b2d: 0xbbe9, 0x1b2e: 0x2079, 0x1b2f: 0xbc01, - 0x1b30: 0xbab1, 0x1b31: 0x1099, 0x1b32: 0x10b1, 0x1b33: 0x10c9, 0x1b34: 0xbac9, 0x1b35: 0xbae1, - 0x1b36: 0xbaf9, 0x1b37: 0x1429, 0x1b38: 0x1a31, 0x1b39: 0xbb11, 0x1b3a: 0xbb29, 0x1b3b: 0xbb41, - 0x1b3c: 0xbb59, 0x1b3d: 0xbb71, 0x1b3e: 0xbb89, 0x1b3f: 0x2109, - // Block 0x6d, offset 0x1b40 - 0x1b40: 0x1111, 0x1b41: 0xbba1, 0x1b42: 0xbba1, 0x1b43: 0xbbb9, 0x1b44: 0xbbd1, 0x1b45: 0x10e1, - 0x1b46: 0x10f9, 0x1b47: 0xbbe9, 0x1b48: 0x2079, 0x1b49: 0xbc21, 0x1b4a: 0xbac9, 0x1b4b: 0x1429, - 0x1b4c: 0xbb11, 0x1b4d: 0x10e1, 0x1b4e: 0x1111, 0x1b4f: 0x2109, 0x1b50: 0xbab1, 0x1b51: 0x1099, - 0x1b52: 0x10b1, 0x1b53: 0x10c9, 0x1b54: 0xbac9, 0x1b55: 0xbae1, 0x1b56: 0xbaf9, 0x1b57: 0x1429, - 0x1b58: 0x1a31, 0x1b59: 0xbb11, 0x1b5a: 0xbb29, 0x1b5b: 0xbb41, 0x1b5c: 0xbb59, 0x1b5d: 0xbb71, - 0x1b5e: 0xbb89, 0x1b5f: 0x2109, 0x1b60: 0x1111, 0x1b61: 0x1429, 0x1b62: 0xbba1, 0x1b63: 0xbbb9, - 0x1b64: 0xbbd1, 0x1b65: 0x10e1, 0x1b66: 0x10f9, 0x1b67: 0xbbe9, 0x1b68: 0x2079, 0x1b69: 0xbc01, - 0x1b6a: 0xbab1, 0x1b6b: 0x1099, 0x1b6c: 0x10b1, 0x1b6d: 0x10c9, 0x1b6e: 0xbac9, 0x1b6f: 0xbae1, - 0x1b70: 0xbaf9, 0x1b71: 0x1429, 0x1b72: 0x1a31, 0x1b73: 0xbb11, 0x1b74: 0xbb29, 0x1b75: 0xbb41, - 0x1b76: 0xbb59, 0x1b77: 0xbb71, 0x1b78: 0xbb89, 0x1b79: 0x2109, 0x1b7a: 0x1111, 0x1b7b: 0xbba1, - 0x1b7c: 0xbba1, 0x1b7d: 0xbbb9, 0x1b7e: 0xbbd1, 0x1b7f: 0x10e1, - // Block 0x6e, offset 0x1b80 - 0x1b80: 0x10f9, 0x1b81: 0xbbe9, 0x1b82: 0x2079, 0x1b83: 0xbc21, 0x1b84: 0xbac9, 0x1b85: 0x1429, - 0x1b86: 0xbb11, 0x1b87: 0x10e1, 0x1b88: 0x1111, 0x1b89: 0x2109, 0x1b8a: 0xbc41, 0x1b8b: 0xbc41, - 0x1b8c: 0x0040, 0x1b8d: 0x0040, 0x1b8e: 0x1f41, 0x1b8f: 0x00c9, 0x1b90: 0x0069, 0x1b91: 0x0079, - 0x1b92: 0x1f51, 0x1b93: 0x1f61, 0x1b94: 0x1f71, 0x1b95: 0x1f81, 0x1b96: 0x1f91, 0x1b97: 0x1fa1, - 0x1b98: 0x1f41, 0x1b99: 0x00c9, 0x1b9a: 0x0069, 0x1b9b: 0x0079, 0x1b9c: 0x1f51, 0x1b9d: 0x1f61, - 0x1b9e: 0x1f71, 0x1b9f: 0x1f81, 0x1ba0: 0x1f91, 0x1ba1: 0x1fa1, 0x1ba2: 0x1f41, 0x1ba3: 0x00c9, - 0x1ba4: 0x0069, 0x1ba5: 0x0079, 0x1ba6: 0x1f51, 0x1ba7: 0x1f61, 0x1ba8: 0x1f71, 0x1ba9: 0x1f81, - 0x1baa: 0x1f91, 0x1bab: 0x1fa1, 0x1bac: 0x1f41, 0x1bad: 0x00c9, 0x1bae: 0x0069, 0x1baf: 0x0079, - 0x1bb0: 0x1f51, 0x1bb1: 0x1f61, 0x1bb2: 0x1f71, 0x1bb3: 0x1f81, 0x1bb4: 0x1f91, 0x1bb5: 0x1fa1, - 0x1bb6: 0x1f41, 0x1bb7: 0x00c9, 0x1bb8: 0x0069, 0x1bb9: 0x0079, 0x1bba: 0x1f51, 0x1bbb: 0x1f61, - 0x1bbc: 0x1f71, 0x1bbd: 0x1f81, 0x1bbe: 0x1f91, 0x1bbf: 0x1fa1, - // Block 0x6f, offset 0x1bc0 - 0x1bc0: 0xe115, 0x1bc1: 0xe115, 0x1bc2: 0xe135, 0x1bc3: 0xe135, 0x1bc4: 0xe115, 0x1bc5: 0xe115, - 0x1bc6: 0xe175, 0x1bc7: 0xe175, 0x1bc8: 0xe115, 0x1bc9: 0xe115, 0x1bca: 0xe135, 0x1bcb: 0xe135, - 0x1bcc: 0xe115, 0x1bcd: 0xe115, 0x1bce: 0xe1f5, 0x1bcf: 0xe1f5, 0x1bd0: 0xe115, 0x1bd1: 0xe115, - 0x1bd2: 0xe135, 0x1bd3: 0xe135, 0x1bd4: 0xe115, 0x1bd5: 0xe115, 0x1bd6: 0xe175, 0x1bd7: 0xe175, - 0x1bd8: 0xe115, 0x1bd9: 0xe115, 0x1bda: 0xe135, 0x1bdb: 0xe135, 0x1bdc: 0xe115, 0x1bdd: 0xe115, - 0x1bde: 0x8b05, 0x1bdf: 0x8b05, 0x1be0: 0x04b5, 0x1be1: 0x04b5, 0x1be2: 0x0208, 0x1be3: 0x0208, - 0x1be4: 0x0208, 0x1be5: 0x0208, 0x1be6: 0x0208, 0x1be7: 0x0208, 0x1be8: 0x0208, 0x1be9: 0x0208, - 0x1bea: 0x0208, 0x1beb: 0x0208, 0x1bec: 0x0208, 0x1bed: 0x0208, 0x1bee: 0x0208, 0x1bef: 0x0208, - 0x1bf0: 0x0208, 0x1bf1: 0x0208, 0x1bf2: 0x0208, 0x1bf3: 0x0208, 0x1bf4: 0x0208, 0x1bf5: 0x0208, - 0x1bf6: 0x0208, 0x1bf7: 0x0208, 0x1bf8: 0x0208, 0x1bf9: 0x0208, 0x1bfa: 0x0208, 0x1bfb: 0x0208, - 0x1bfc: 0x0208, 0x1bfd: 0x0208, 0x1bfe: 0x0208, 0x1bff: 0x0208, - // Block 0x70, offset 0x1c00 - 0x1c00: 0xb189, 0x1c01: 0xb1a1, 0x1c02: 0xb201, 0x1c03: 0xb249, 0x1c04: 0x0040, 0x1c05: 0xb411, - 0x1c06: 0xb291, 0x1c07: 0xb219, 0x1c08: 0xb309, 0x1c09: 0xb429, 0x1c0a: 0xb399, 0x1c0b: 0xb3b1, - 0x1c0c: 0xb3c9, 0x1c0d: 0xb3e1, 0x1c0e: 0xb2a9, 0x1c0f: 0xb339, 0x1c10: 0xb369, 0x1c11: 0xb2d9, - 0x1c12: 0xb381, 0x1c13: 0xb279, 0x1c14: 0xb2c1, 0x1c15: 0xb1d1, 0x1c16: 0xb1e9, 0x1c17: 0xb231, - 0x1c18: 0xb261, 0x1c19: 0xb2f1, 0x1c1a: 0xb321, 0x1c1b: 0xb351, 0x1c1c: 0xbc59, 0x1c1d: 0x7949, - 0x1c1e: 0xbc71, 0x1c1f: 0xbc89, 0x1c20: 0x0040, 0x1c21: 0xb1a1, 0x1c22: 0xb201, 0x1c23: 0x0040, - 0x1c24: 0xb3f9, 0x1c25: 0x0040, 0x1c26: 0x0040, 0x1c27: 0xb219, 0x1c28: 0x0040, 0x1c29: 0xb429, - 0x1c2a: 0xb399, 0x1c2b: 0xb3b1, 0x1c2c: 0xb3c9, 0x1c2d: 0xb3e1, 0x1c2e: 0xb2a9, 0x1c2f: 0xb339, - 0x1c30: 0xb369, 0x1c31: 0xb2d9, 0x1c32: 0xb381, 0x1c33: 0x0040, 0x1c34: 0xb2c1, 0x1c35: 0xb1d1, - 0x1c36: 0xb1e9, 0x1c37: 0xb231, 0x1c38: 0x0040, 0x1c39: 0xb2f1, 0x1c3a: 0x0040, 0x1c3b: 0xb351, - 0x1c3c: 0x0040, 0x1c3d: 0x0040, 0x1c3e: 0x0040, 0x1c3f: 0x0040, - // Block 0x71, offset 0x1c40 - 0x1c40: 0x0040, 0x1c41: 0x0040, 0x1c42: 0xb201, 0x1c43: 0x0040, 0x1c44: 0x0040, 0x1c45: 0x0040, - 0x1c46: 0x0040, 0x1c47: 0xb219, 0x1c48: 0x0040, 0x1c49: 0xb429, 0x1c4a: 0x0040, 0x1c4b: 0xb3b1, - 0x1c4c: 0x0040, 0x1c4d: 0xb3e1, 0x1c4e: 0xb2a9, 0x1c4f: 0xb339, 0x1c50: 0x0040, 0x1c51: 0xb2d9, - 0x1c52: 0xb381, 0x1c53: 0x0040, 0x1c54: 0xb2c1, 0x1c55: 0x0040, 0x1c56: 0x0040, 0x1c57: 0xb231, - 0x1c58: 0x0040, 0x1c59: 0xb2f1, 0x1c5a: 0x0040, 0x1c5b: 0xb351, 0x1c5c: 0x0040, 0x1c5d: 0x7949, - 0x1c5e: 0x0040, 0x1c5f: 0xbc89, 0x1c60: 0x0040, 0x1c61: 0xb1a1, 0x1c62: 0xb201, 0x1c63: 0x0040, - 0x1c64: 0xb3f9, 0x1c65: 0x0040, 0x1c66: 0x0040, 0x1c67: 0xb219, 0x1c68: 0xb309, 0x1c69: 0xb429, - 0x1c6a: 0xb399, 0x1c6b: 0x0040, 0x1c6c: 0xb3c9, 0x1c6d: 0xb3e1, 0x1c6e: 0xb2a9, 0x1c6f: 0xb339, - 0x1c70: 0xb369, 0x1c71: 0xb2d9, 0x1c72: 0xb381, 0x1c73: 0x0040, 0x1c74: 0xb2c1, 0x1c75: 0xb1d1, - 0x1c76: 0xb1e9, 0x1c77: 0xb231, 0x1c78: 0x0040, 0x1c79: 0xb2f1, 0x1c7a: 0xb321, 0x1c7b: 0xb351, - 0x1c7c: 0xbc59, 0x1c7d: 0x0040, 0x1c7e: 0xbc71, 0x1c7f: 0x0040, - // Block 0x72, offset 0x1c80 - 0x1c80: 0xb189, 0x1c81: 0xb1a1, 0x1c82: 0xb201, 0x1c83: 0xb249, 0x1c84: 0xb3f9, 0x1c85: 0xb411, - 0x1c86: 0xb291, 0x1c87: 0xb219, 0x1c88: 0xb309, 0x1c89: 0xb429, 0x1c8a: 0x0040, 0x1c8b: 0xb3b1, - 0x1c8c: 0xb3c9, 0x1c8d: 0xb3e1, 0x1c8e: 0xb2a9, 0x1c8f: 0xb339, 0x1c90: 0xb369, 0x1c91: 0xb2d9, - 0x1c92: 0xb381, 0x1c93: 0xb279, 0x1c94: 0xb2c1, 0x1c95: 0xb1d1, 0x1c96: 0xb1e9, 0x1c97: 0xb231, - 0x1c98: 0xb261, 0x1c99: 0xb2f1, 0x1c9a: 0xb321, 0x1c9b: 0xb351, 0x1c9c: 0x0040, 0x1c9d: 0x0040, - 0x1c9e: 0x0040, 0x1c9f: 0x0040, 0x1ca0: 0x0040, 0x1ca1: 0xb1a1, 0x1ca2: 0xb201, 0x1ca3: 0xb249, - 0x1ca4: 0x0040, 0x1ca5: 0xb411, 0x1ca6: 0xb291, 0x1ca7: 0xb219, 0x1ca8: 0xb309, 0x1ca9: 0xb429, - 0x1caa: 0x0040, 0x1cab: 0xb3b1, 0x1cac: 0xb3c9, 0x1cad: 0xb3e1, 0x1cae: 0xb2a9, 0x1caf: 0xb339, - 0x1cb0: 0xb369, 0x1cb1: 0xb2d9, 0x1cb2: 0xb381, 0x1cb3: 0xb279, 0x1cb4: 0xb2c1, 0x1cb5: 0xb1d1, - 0x1cb6: 0xb1e9, 0x1cb7: 0xb231, 0x1cb8: 0xb261, 0x1cb9: 0xb2f1, 0x1cba: 0xb321, 0x1cbb: 0xb351, - 0x1cbc: 0x0040, 0x1cbd: 0x0040, 0x1cbe: 0x0040, 0x1cbf: 0x0040, - // Block 0x73, offset 0x1cc0 - 0x1cc0: 0x0040, 0x1cc1: 0xbca2, 0x1cc2: 0xbcba, 0x1cc3: 0xbcd2, 0x1cc4: 0xbcea, 0x1cc5: 0xbd02, - 0x1cc6: 0xbd1a, 0x1cc7: 0xbd32, 0x1cc8: 0xbd4a, 0x1cc9: 0xbd62, 0x1cca: 0xbd7a, 0x1ccb: 0x0018, - 0x1ccc: 0x0018, 0x1ccd: 0x0040, 0x1cce: 0x0040, 0x1ccf: 0x0040, 0x1cd0: 0xbd92, 0x1cd1: 0xbdb2, - 0x1cd2: 0xbdd2, 0x1cd3: 0xbdf2, 0x1cd4: 0xbe12, 0x1cd5: 0xbe32, 0x1cd6: 0xbe52, 0x1cd7: 0xbe72, - 0x1cd8: 0xbe92, 0x1cd9: 0xbeb2, 0x1cda: 0xbed2, 0x1cdb: 0xbef2, 0x1cdc: 0xbf12, 0x1cdd: 0xbf32, - 0x1cde: 0xbf52, 0x1cdf: 0xbf72, 0x1ce0: 0xbf92, 0x1ce1: 0xbfb2, 0x1ce2: 0xbfd2, 0x1ce3: 0xbff2, - 0x1ce4: 0xc012, 0x1ce5: 0xc032, 0x1ce6: 0xc052, 0x1ce7: 0xc072, 0x1ce8: 0xc092, 0x1ce9: 0xc0b2, - 0x1cea: 0xc0d1, 0x1ceb: 0x1159, 0x1cec: 0x0269, 0x1ced: 0x6671, 0x1cee: 0xc111, 0x1cef: 0x0040, - 0x1cf0: 0x0039, 0x1cf1: 0x0ee9, 0x1cf2: 0x1159, 0x1cf3: 0x0ef9, 0x1cf4: 0x0f09, 0x1cf5: 0x1199, - 0x1cf6: 0x0f31, 0x1cf7: 0x0249, 0x1cf8: 0x0f41, 0x1cf9: 0x0259, 0x1cfa: 0x0f51, 0x1cfb: 0x0359, - 0x1cfc: 0x0f61, 0x1cfd: 0x0f71, 0x1cfe: 0x00d9, 0x1cff: 0x0f99, - // Block 0x74, offset 0x1d00 - 0x1d00: 0x2039, 0x1d01: 0x0269, 0x1d02: 0x01d9, 0x1d03: 0x0fa9, 0x1d04: 0x0fb9, 0x1d05: 0x1089, - 0x1d06: 0x0279, 0x1d07: 0x0369, 0x1d08: 0x0289, 0x1d09: 0x13d1, 0x1d0a: 0xc129, 0x1d0b: 0x65b1, - 0x1d0c: 0xc141, 0x1d0d: 0x1441, 0x1d0e: 0xc159, 0x1d0f: 0xc179, 0x1d10: 0x0018, 0x1d11: 0x0018, - 0x1d12: 0x0018, 0x1d13: 0x0018, 0x1d14: 0x0018, 0x1d15: 0x0018, 0x1d16: 0x0018, 0x1d17: 0x0018, - 0x1d18: 0x0018, 0x1d19: 0x0018, 0x1d1a: 0x0018, 0x1d1b: 0x0018, 0x1d1c: 0x0018, 0x1d1d: 0x0018, - 0x1d1e: 0x0018, 0x1d1f: 0x0018, 0x1d20: 0x0018, 0x1d21: 0x0018, 0x1d22: 0x0018, 0x1d23: 0x0018, - 0x1d24: 0x0018, 0x1d25: 0x0018, 0x1d26: 0x0018, 0x1d27: 0x0018, 0x1d28: 0x0018, 0x1d29: 0x0018, - 0x1d2a: 0xc191, 0x1d2b: 0xc1a9, 0x1d2c: 0x0040, 0x1d2d: 0x0040, 0x1d2e: 0x0040, 0x1d2f: 0x0040, - 0x1d30: 0x0018, 0x1d31: 0x0018, 0x1d32: 0x0018, 0x1d33: 0x0018, 0x1d34: 0x0018, 0x1d35: 0x0018, - 0x1d36: 0x0018, 0x1d37: 0x0018, 0x1d38: 0x0018, 0x1d39: 0x0018, 0x1d3a: 0x0018, 0x1d3b: 0x0018, - 0x1d3c: 0x0018, 0x1d3d: 0x0018, 0x1d3e: 0x0018, 0x1d3f: 0x0018, - // Block 0x75, offset 0x1d40 - 0x1d40: 0xc1d9, 0x1d41: 0xc211, 0x1d42: 0xc249, 0x1d43: 0x0040, 0x1d44: 0x0040, 0x1d45: 0x0040, - 0x1d46: 0x0040, 0x1d47: 0x0040, 0x1d48: 0x0040, 0x1d49: 0x0040, 0x1d4a: 0x0040, 0x1d4b: 0x0040, - 0x1d4c: 0x0040, 0x1d4d: 0x0040, 0x1d4e: 0x0040, 0x1d4f: 0x0040, 0x1d50: 0xc269, 0x1d51: 0xc289, - 0x1d52: 0xc2a9, 0x1d53: 0xc2c9, 0x1d54: 0xc2e9, 0x1d55: 0xc309, 0x1d56: 0xc329, 0x1d57: 0xc349, - 0x1d58: 0xc369, 0x1d59: 0xc389, 0x1d5a: 0xc3a9, 0x1d5b: 0xc3c9, 0x1d5c: 0xc3e9, 0x1d5d: 0xc409, - 0x1d5e: 0xc429, 0x1d5f: 0xc449, 0x1d60: 0xc469, 0x1d61: 0xc489, 0x1d62: 0xc4a9, 0x1d63: 0xc4c9, - 0x1d64: 0xc4e9, 0x1d65: 0xc509, 0x1d66: 0xc529, 0x1d67: 0xc549, 0x1d68: 0xc569, 0x1d69: 0xc589, - 0x1d6a: 0xc5a9, 0x1d6b: 0xc5c9, 0x1d6c: 0xc5e9, 0x1d6d: 0xc609, 0x1d6e: 0xc629, 0x1d6f: 0xc649, - 0x1d70: 0xc669, 0x1d71: 0xc689, 0x1d72: 0xc6a9, 0x1d73: 0xc6c9, 0x1d74: 0xc6e9, 0x1d75: 0xc709, - 0x1d76: 0xc729, 0x1d77: 0xc749, 0x1d78: 0xc769, 0x1d79: 0xc789, 0x1d7a: 0xc7a9, 0x1d7b: 0xc7c9, - 0x1d7c: 0x0040, 0x1d7d: 0x0040, 0x1d7e: 0x0040, 0x1d7f: 0x0040, - // Block 0x76, offset 0x1d80 - 0x1d80: 0xcaf9, 0x1d81: 0xcb19, 0x1d82: 0xcb39, 0x1d83: 0x8b1d, 0x1d84: 0xcb59, 0x1d85: 0xcb79, - 0x1d86: 0xcb99, 0x1d87: 0xcbb9, 0x1d88: 0xcbd9, 0x1d89: 0xcbf9, 0x1d8a: 0xcc19, 0x1d8b: 0xcc39, - 0x1d8c: 0xcc59, 0x1d8d: 0x8b3d, 0x1d8e: 0xcc79, 0x1d8f: 0xcc99, 0x1d90: 0xccb9, 0x1d91: 0xccd9, - 0x1d92: 0x8b5d, 0x1d93: 0xccf9, 0x1d94: 0xcd19, 0x1d95: 0xc429, 0x1d96: 0x8b7d, 0x1d97: 0xcd39, - 0x1d98: 0xcd59, 0x1d99: 0xcd79, 0x1d9a: 0xcd99, 0x1d9b: 0xcdb9, 0x1d9c: 0x8b9d, 0x1d9d: 0xcdd9, - 0x1d9e: 0xcdf9, 0x1d9f: 0xce19, 0x1da0: 0xce39, 0x1da1: 0xce59, 0x1da2: 0xc789, 0x1da3: 0xce79, - 0x1da4: 0xce99, 0x1da5: 0xceb9, 0x1da6: 0xced9, 0x1da7: 0xcef9, 0x1da8: 0xcf19, 0x1da9: 0xcf39, - 0x1daa: 0xcf59, 0x1dab: 0xcf79, 0x1dac: 0xcf99, 0x1dad: 0xcfb9, 0x1dae: 0xcfd9, 0x1daf: 0xcff9, - 0x1db0: 0xd019, 0x1db1: 0xd039, 0x1db2: 0xd039, 0x1db3: 0xd039, 0x1db4: 0x8bbd, 0x1db5: 0xd059, - 0x1db6: 0xd079, 0x1db7: 0xd099, 0x1db8: 0x8bdd, 0x1db9: 0xd0b9, 0x1dba: 0xd0d9, 0x1dbb: 0xd0f9, - 0x1dbc: 0xd119, 0x1dbd: 0xd139, 0x1dbe: 0xd159, 0x1dbf: 0xd179, - // Block 0x77, offset 0x1dc0 - 0x1dc0: 0xd199, 0x1dc1: 0xd1b9, 0x1dc2: 0xd1d9, 0x1dc3: 0xd1f9, 0x1dc4: 0xd219, 0x1dc5: 0xd239, - 0x1dc6: 0xd239, 0x1dc7: 0xd259, 0x1dc8: 0xd279, 0x1dc9: 0xd299, 0x1dca: 0xd2b9, 0x1dcb: 0xd2d9, - 0x1dcc: 0xd2f9, 0x1dcd: 0xd319, 0x1dce: 0xd339, 0x1dcf: 0xd359, 0x1dd0: 0xd379, 0x1dd1: 0xd399, - 0x1dd2: 0xd3b9, 0x1dd3: 0xd3d9, 0x1dd4: 0xd3f9, 0x1dd5: 0xd419, 0x1dd6: 0xd439, 0x1dd7: 0xd459, - 0x1dd8: 0xd479, 0x1dd9: 0x8bfd, 0x1dda: 0xd499, 0x1ddb: 0xd4b9, 0x1ddc: 0xd4d9, 0x1ddd: 0xc309, - 0x1dde: 0xd4f9, 0x1ddf: 0xd519, 0x1de0: 0x8c1d, 0x1de1: 0x8c3d, 0x1de2: 0xd539, 0x1de3: 0xd559, - 0x1de4: 0xd579, 0x1de5: 0xd599, 0x1de6: 0xd5b9, 0x1de7: 0xd5d9, 0x1de8: 0x0040, 0x1de9: 0xd5f9, - 0x1dea: 0xd619, 0x1deb: 0xd619, 0x1dec: 0x8c5d, 0x1ded: 0xd639, 0x1dee: 0xd659, 0x1def: 0xd679, - 0x1df0: 0xd699, 0x1df1: 0x8c7d, 0x1df2: 0xd6b9, 0x1df3: 0xd6d9, 0x1df4: 0x0040, 0x1df5: 0xd6f9, - 0x1df6: 0xd719, 0x1df7: 0xd739, 0x1df8: 0xd759, 0x1df9: 0xd779, 0x1dfa: 0xd799, 0x1dfb: 0x8c9d, - 0x1dfc: 0xd7b9, 0x1dfd: 0x8cbd, 0x1dfe: 0xd7d9, 0x1dff: 0xd7f9, - // Block 0x78, offset 0x1e00 - 0x1e00: 0xd819, 0x1e01: 0xd839, 0x1e02: 0xd859, 0x1e03: 0xd879, 0x1e04: 0xd899, 0x1e05: 0xd8b9, - 0x1e06: 0xd8d9, 0x1e07: 0xd8f9, 0x1e08: 0xd919, 0x1e09: 0x8cdd, 0x1e0a: 0xd939, 0x1e0b: 0xd959, - 0x1e0c: 0xd979, 0x1e0d: 0xd999, 0x1e0e: 0xd9b9, 0x1e0f: 0x8cfd, 0x1e10: 0xd9d9, 0x1e11: 0x8d1d, - 0x1e12: 0x8d3d, 0x1e13: 0xd9f9, 0x1e14: 0xda19, 0x1e15: 0xda19, 0x1e16: 0xda39, 0x1e17: 0x8d5d, - 0x1e18: 0x8d7d, 0x1e19: 0xda59, 0x1e1a: 0xda79, 0x1e1b: 0xda99, 0x1e1c: 0xdab9, 0x1e1d: 0xdad9, - 0x1e1e: 0xdaf9, 0x1e1f: 0xdb19, 0x1e20: 0xdb39, 0x1e21: 0xdb59, 0x1e22: 0xdb79, 0x1e23: 0xdb99, - 0x1e24: 0x8d9d, 0x1e25: 0xdbb9, 0x1e26: 0xdbd9, 0x1e27: 0xdbf9, 0x1e28: 0xdc19, 0x1e29: 0xdbf9, - 0x1e2a: 0xdc39, 0x1e2b: 0xdc59, 0x1e2c: 0xdc79, 0x1e2d: 0xdc99, 0x1e2e: 0xdcb9, 0x1e2f: 0xdcd9, - 0x1e30: 0xdcf9, 0x1e31: 0xdd19, 0x1e32: 0xdd39, 0x1e33: 0xdd59, 0x1e34: 0xdd79, 0x1e35: 0xdd99, - 0x1e36: 0xddb9, 0x1e37: 0xddd9, 0x1e38: 0x8dbd, 0x1e39: 0xddf9, 0x1e3a: 0xde19, 0x1e3b: 0xde39, - 0x1e3c: 0xde59, 0x1e3d: 0xde79, 0x1e3e: 0x8ddd, 0x1e3f: 0xde99, - // Block 0x79, offset 0x1e40 - 0x1e40: 0xe599, 0x1e41: 0xe5b9, 0x1e42: 0xe5d9, 0x1e43: 0xe5f9, 0x1e44: 0xe619, 0x1e45: 0xe639, - 0x1e46: 0x8efd, 0x1e47: 0xe659, 0x1e48: 0xe679, 0x1e49: 0xe699, 0x1e4a: 0xe6b9, 0x1e4b: 0xe6d9, - 0x1e4c: 0xe6f9, 0x1e4d: 0x8f1d, 0x1e4e: 0xe719, 0x1e4f: 0xe739, 0x1e50: 0x8f3d, 0x1e51: 0x8f5d, - 0x1e52: 0xe759, 0x1e53: 0xe779, 0x1e54: 0xe799, 0x1e55: 0xe7b9, 0x1e56: 0xe7d9, 0x1e57: 0xe7f9, - 0x1e58: 0xe819, 0x1e59: 0xe839, 0x1e5a: 0xe859, 0x1e5b: 0x8f7d, 0x1e5c: 0xe879, 0x1e5d: 0x8f9d, - 0x1e5e: 0xe899, 0x1e5f: 0x0040, 0x1e60: 0xe8b9, 0x1e61: 0xe8d9, 0x1e62: 0xe8f9, 0x1e63: 0x8fbd, - 0x1e64: 0xe919, 0x1e65: 0xe939, 0x1e66: 0x8fdd, 0x1e67: 0x8ffd, 0x1e68: 0xe959, 0x1e69: 0xe979, - 0x1e6a: 0xe999, 0x1e6b: 0xe9b9, 0x1e6c: 0xe9d9, 0x1e6d: 0xe9d9, 0x1e6e: 0xe9f9, 0x1e6f: 0xea19, - 0x1e70: 0xea39, 0x1e71: 0xea59, 0x1e72: 0xea79, 0x1e73: 0xea99, 0x1e74: 0xeab9, 0x1e75: 0x901d, - 0x1e76: 0xead9, 0x1e77: 0x903d, 0x1e78: 0xeaf9, 0x1e79: 0x905d, 0x1e7a: 0xeb19, 0x1e7b: 0x907d, - 0x1e7c: 0x909d, 0x1e7d: 0x90bd, 0x1e7e: 0xeb39, 0x1e7f: 0xeb59, - // Block 0x7a, offset 0x1e80 - 0x1e80: 0xeb79, 0x1e81: 0x90dd, 0x1e82: 0x90fd, 0x1e83: 0x911d, 0x1e84: 0x913d, 0x1e85: 0xeb99, - 0x1e86: 0xebb9, 0x1e87: 0xebb9, 0x1e88: 0xebd9, 0x1e89: 0xebf9, 0x1e8a: 0xec19, 0x1e8b: 0xec39, - 0x1e8c: 0xec59, 0x1e8d: 0x915d, 0x1e8e: 0xec79, 0x1e8f: 0xec99, 0x1e90: 0xecb9, 0x1e91: 0xecd9, - 0x1e92: 0x917d, 0x1e93: 0xecf9, 0x1e94: 0x919d, 0x1e95: 0x91bd, 0x1e96: 0xed19, 0x1e97: 0xed39, - 0x1e98: 0xed59, 0x1e99: 0xed79, 0x1e9a: 0xed99, 0x1e9b: 0xedb9, 0x1e9c: 0x91dd, 0x1e9d: 0x91fd, - 0x1e9e: 0x921d, 0x1e9f: 0x0040, 0x1ea0: 0xedd9, 0x1ea1: 0x923d, 0x1ea2: 0xedf9, 0x1ea3: 0xee19, - 0x1ea4: 0xee39, 0x1ea5: 0x925d, 0x1ea6: 0xee59, 0x1ea7: 0xee79, 0x1ea8: 0xee99, 0x1ea9: 0xeeb9, - 0x1eaa: 0xeed9, 0x1eab: 0x927d, 0x1eac: 0xeef9, 0x1ead: 0xef19, 0x1eae: 0xef39, 0x1eaf: 0xef59, - 0x1eb0: 0xef79, 0x1eb1: 0xef99, 0x1eb2: 0x929d, 0x1eb3: 0x92bd, 0x1eb4: 0xefb9, 0x1eb5: 0x92dd, - 0x1eb6: 0xefd9, 0x1eb7: 0x92fd, 0x1eb8: 0xeff9, 0x1eb9: 0xf019, 0x1eba: 0xf039, 0x1ebb: 0x931d, - 0x1ebc: 0x933d, 0x1ebd: 0xf059, 0x1ebe: 0x935d, 0x1ebf: 0xf079, - // Block 0x7b, offset 0x1ec0 - 0x1ec0: 0xf6b9, 0x1ec1: 0xf6d9, 0x1ec2: 0xf6f9, 0x1ec3: 0xf719, 0x1ec4: 0xf739, 0x1ec5: 0x951d, - 0x1ec6: 0xf759, 0x1ec7: 0xf779, 0x1ec8: 0xf799, 0x1ec9: 0xf7b9, 0x1eca: 0xf7d9, 0x1ecb: 0x953d, - 0x1ecc: 0x955d, 0x1ecd: 0xf7f9, 0x1ece: 0xf819, 0x1ecf: 0xf839, 0x1ed0: 0xf859, 0x1ed1: 0xf879, - 0x1ed2: 0xf899, 0x1ed3: 0x957d, 0x1ed4: 0xf8b9, 0x1ed5: 0xf8d9, 0x1ed6: 0xf8f9, 0x1ed7: 0xf919, - 0x1ed8: 0x959d, 0x1ed9: 0x95bd, 0x1eda: 0xf939, 0x1edb: 0xf959, 0x1edc: 0xf979, 0x1edd: 0x95dd, - 0x1ede: 0xf999, 0x1edf: 0xf9b9, 0x1ee0: 0x6815, 0x1ee1: 0x95fd, 0x1ee2: 0xf9d9, 0x1ee3: 0xf9f9, - 0x1ee4: 0xfa19, 0x1ee5: 0x961d, 0x1ee6: 0xfa39, 0x1ee7: 0xfa59, 0x1ee8: 0xfa79, 0x1ee9: 0xfa99, - 0x1eea: 0xfab9, 0x1eeb: 0xfad9, 0x1eec: 0xfaf9, 0x1eed: 0x963d, 0x1eee: 0xfb19, 0x1eef: 0xfb39, - 0x1ef0: 0xfb59, 0x1ef1: 0x965d, 0x1ef2: 0xfb79, 0x1ef3: 0xfb99, 0x1ef4: 0xfbb9, 0x1ef5: 0xfbd9, - 0x1ef6: 0x7b35, 0x1ef7: 0x967d, 0x1ef8: 0xfbf9, 0x1ef9: 0xfc19, 0x1efa: 0xfc39, 0x1efb: 0x969d, - 0x1efc: 0xfc59, 0x1efd: 0x96bd, 0x1efe: 0xfc79, 0x1eff: 0xfc79, - // Block 0x7c, offset 0x1f00 - 0x1f00: 0xfc99, 0x1f01: 0x96dd, 0x1f02: 0xfcb9, 0x1f03: 0xfcd9, 0x1f04: 0xfcf9, 0x1f05: 0xfd19, - 0x1f06: 0xfd39, 0x1f07: 0xfd59, 0x1f08: 0xfd79, 0x1f09: 0x96fd, 0x1f0a: 0xfd99, 0x1f0b: 0xfdb9, - 0x1f0c: 0xfdd9, 0x1f0d: 0xfdf9, 0x1f0e: 0xfe19, 0x1f0f: 0xfe39, 0x1f10: 0x971d, 0x1f11: 0xfe59, - 0x1f12: 0x973d, 0x1f13: 0x975d, 0x1f14: 0x977d, 0x1f15: 0xfe79, 0x1f16: 0xfe99, 0x1f17: 0xfeb9, - 0x1f18: 0xfed9, 0x1f19: 0xfef9, 0x1f1a: 0xff19, 0x1f1b: 0xff39, 0x1f1c: 0xff59, 0x1f1d: 0x979d, - 0x1f1e: 0x0040, 0x1f1f: 0x0040, 0x1f20: 0x0040, 0x1f21: 0x0040, 0x1f22: 0x0040, 0x1f23: 0x0040, - 0x1f24: 0x0040, 0x1f25: 0x0040, 0x1f26: 0x0040, 0x1f27: 0x0040, 0x1f28: 0x0040, 0x1f29: 0x0040, - 0x1f2a: 0x0040, 0x1f2b: 0x0040, 0x1f2c: 0x0040, 0x1f2d: 0x0040, 0x1f2e: 0x0040, 0x1f2f: 0x0040, - 0x1f30: 0x0040, 0x1f31: 0x0040, 0x1f32: 0x0040, 0x1f33: 0x0040, 0x1f34: 0x0040, 0x1f35: 0x0040, - 0x1f36: 0x0040, 0x1f37: 0x0040, 0x1f38: 0x0040, 0x1f39: 0x0040, 0x1f3a: 0x0040, 0x1f3b: 0x0040, - 0x1f3c: 0x0040, 0x1f3d: 0x0040, 0x1f3e: 0x0040, 0x1f3f: 0x0040, -} - -// idnaIndex: 35 blocks, 2240 entries, 4480 bytes -// Block 0 is the zero block. -var idnaIndex = [2240]uint16{ - // Block 0x0, offset 0x0 - // Block 0x1, offset 0x40 - // Block 0x2, offset 0x80 - // Block 0x3, offset 0xc0 - 0xc2: 0x01, 0xc3: 0x7b, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x04, 0xc7: 0x05, - 0xc8: 0x06, 0xc9: 0x7c, 0xca: 0x7d, 0xcb: 0x07, 0xcc: 0x7e, 0xcd: 0x08, 0xce: 0x09, 0xcf: 0x0a, - 0xd0: 0x7f, 0xd1: 0x0b, 0xd2: 0x0c, 0xd3: 0x0d, 0xd4: 0x0e, 0xd5: 0x80, 0xd6: 0x81, 0xd7: 0x82, - 0xd8: 0x0f, 0xd9: 0x83, 0xda: 0x84, 0xdb: 0x10, 0xdc: 0x11, 0xdd: 0x85, 0xde: 0x86, 0xdf: 0x87, - 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06, 0xe5: 0x07, 0xe6: 0x07, 0xe7: 0x07, - 0xe8: 0x07, 0xe9: 0x08, 0xea: 0x09, 0xeb: 0x07, 0xec: 0x07, 0xed: 0x0a, 0xee: 0x0b, 0xef: 0x0c, - 0xf0: 0x1c, 0xf1: 0x1d, 0xf2: 0x1d, 0xf3: 0x1f, 0xf4: 0x20, - // Block 0x4, offset 0x100 - 0x120: 0x88, 0x121: 0x89, 0x122: 0x8a, 0x123: 0x8b, 0x124: 0x8c, 0x125: 0x12, 0x126: 0x13, 0x127: 0x14, - 0x128: 0x15, 0x129: 0x16, 0x12a: 0x17, 0x12b: 0x18, 0x12c: 0x19, 0x12d: 0x1a, 0x12e: 0x1b, 0x12f: 0x8d, - 0x130: 0x8e, 0x131: 0x1c, 0x132: 0x1d, 0x133: 0x1e, 0x134: 0x8f, 0x135: 0x1f, 0x136: 0x90, 0x137: 0x91, - 0x138: 0x92, 0x139: 0x93, 0x13a: 0x20, 0x13b: 0x94, 0x13c: 0x95, 0x13d: 0x21, 0x13e: 0x22, 0x13f: 0x96, - // Block 0x5, offset 0x140 - 0x140: 0x97, 0x141: 0x98, 0x142: 0x99, 0x143: 0x9a, 0x144: 0x9b, 0x145: 0x9c, 0x146: 0x9b, 0x147: 0x9b, - 0x148: 0x9d, 0x149: 0x9e, 0x14a: 0x9f, 0x14b: 0xa0, 0x14c: 0xa1, 0x14d: 0xa2, 0x14e: 0xa3, 0x14f: 0xa4, - 0x150: 0xa5, 0x151: 0x9d, 0x152: 0x9d, 0x153: 0x9d, 0x154: 0x9d, 0x155: 0x9d, 0x156: 0x9d, 0x157: 0x9d, - 0x158: 0x9d, 0x159: 0xa6, 0x15a: 0xa7, 0x15b: 0xa8, 0x15c: 0xa9, 0x15d: 0xaa, 0x15e: 0xab, 0x15f: 0xac, - 0x160: 0xad, 0x161: 0xae, 0x162: 0xaf, 0x163: 0xb0, 0x164: 0xb1, 0x165: 0xb2, 0x166: 0xb3, 0x167: 0xb4, - 0x168: 0xb5, 0x169: 0xb6, 0x16a: 0xb7, 0x16b: 0xb8, 0x16c: 0xb9, 0x16d: 0xba, 0x16e: 0xbb, 0x16f: 0xbc, - 0x170: 0xbd, 0x171: 0xbe, 0x172: 0xbf, 0x173: 0xc0, 0x174: 0x23, 0x175: 0x24, 0x176: 0x25, 0x177: 0xc1, - 0x178: 0x26, 0x179: 0x26, 0x17a: 0x27, 0x17b: 0x26, 0x17c: 0xc2, 0x17d: 0x28, 0x17e: 0x29, 0x17f: 0x2a, - // Block 0x6, offset 0x180 - 0x180: 0x2b, 0x181: 0x2c, 0x182: 0x2d, 0x183: 0xc3, 0x184: 0x2e, 0x185: 0x2f, 0x186: 0xc4, 0x187: 0x9b, - 0x188: 0xc5, 0x189: 0xc6, 0x18a: 0x9b, 0x18b: 0x9b, 0x18c: 0xc7, 0x18d: 0x9b, 0x18e: 0x9b, 0x18f: 0xc8, - 0x190: 0xc9, 0x191: 0x30, 0x192: 0x31, 0x193: 0x32, 0x194: 0x9b, 0x195: 0x9b, 0x196: 0x9b, 0x197: 0x9b, - 0x198: 0x9b, 0x199: 0x9b, 0x19a: 0x9b, 0x19b: 0x9b, 0x19c: 0x9b, 0x19d: 0x9b, 0x19e: 0x9b, 0x19f: 0x9b, - 0x1a0: 0x9b, 0x1a1: 0x9b, 0x1a2: 0x9b, 0x1a3: 0x9b, 0x1a4: 0x9b, 0x1a5: 0x9b, 0x1a6: 0x9b, 0x1a7: 0x9b, - 0x1a8: 0xca, 0x1a9: 0xcb, 0x1aa: 0x9b, 0x1ab: 0xcc, 0x1ac: 0x9b, 0x1ad: 0xcd, 0x1ae: 0xce, 0x1af: 0xcf, - 0x1b0: 0xd0, 0x1b1: 0x33, 0x1b2: 0x26, 0x1b3: 0x34, 0x1b4: 0xd1, 0x1b5: 0xd2, 0x1b6: 0xd3, 0x1b7: 0xd4, - 0x1b8: 0xd5, 0x1b9: 0xd6, 0x1ba: 0xd7, 0x1bb: 0xd8, 0x1bc: 0xd9, 0x1bd: 0xda, 0x1be: 0xdb, 0x1bf: 0x35, - // Block 0x7, offset 0x1c0 - 0x1c0: 0x36, 0x1c1: 0xdc, 0x1c2: 0xdd, 0x1c3: 0xde, 0x1c4: 0xdf, 0x1c5: 0x37, 0x1c6: 0x38, 0x1c7: 0xe0, - 0x1c8: 0xe1, 0x1c9: 0x39, 0x1ca: 0x3a, 0x1cb: 0x3b, 0x1cc: 0x3c, 0x1cd: 0x3d, 0x1ce: 0x3e, 0x1cf: 0x3f, - 0x1d0: 0x9d, 0x1d1: 0x9d, 0x1d2: 0x9d, 0x1d3: 0x9d, 0x1d4: 0x9d, 0x1d5: 0x9d, 0x1d6: 0x9d, 0x1d7: 0x9d, - 0x1d8: 0x9d, 0x1d9: 0x9d, 0x1da: 0x9d, 0x1db: 0x9d, 0x1dc: 0x9d, 0x1dd: 0x9d, 0x1de: 0x9d, 0x1df: 0x9d, - 0x1e0: 0x9d, 0x1e1: 0x9d, 0x1e2: 0x9d, 0x1e3: 0x9d, 0x1e4: 0x9d, 0x1e5: 0x9d, 0x1e6: 0x9d, 0x1e7: 0x9d, - 0x1e8: 0x9d, 0x1e9: 0x9d, 0x1ea: 0x9d, 0x1eb: 0x9d, 0x1ec: 0x9d, 0x1ed: 0x9d, 0x1ee: 0x9d, 0x1ef: 0x9d, - 0x1f0: 0x9d, 0x1f1: 0x9d, 0x1f2: 0x9d, 0x1f3: 0x9d, 0x1f4: 0x9d, 0x1f5: 0x9d, 0x1f6: 0x9d, 0x1f7: 0x9d, - 0x1f8: 0x9d, 0x1f9: 0x9d, 0x1fa: 0x9d, 0x1fb: 0x9d, 0x1fc: 0x9d, 0x1fd: 0x9d, 0x1fe: 0x9d, 0x1ff: 0x9d, - // Block 0x8, offset 0x200 - 0x200: 0x9d, 0x201: 0x9d, 0x202: 0x9d, 0x203: 0x9d, 0x204: 0x9d, 0x205: 0x9d, 0x206: 0x9d, 0x207: 0x9d, - 0x208: 0x9d, 0x209: 0x9d, 0x20a: 0x9d, 0x20b: 0x9d, 0x20c: 0x9d, 0x20d: 0x9d, 0x20e: 0x9d, 0x20f: 0x9d, - 0x210: 0x9d, 0x211: 0x9d, 0x212: 0x9d, 0x213: 0x9d, 0x214: 0x9d, 0x215: 0x9d, 0x216: 0x9d, 0x217: 0x9d, - 0x218: 0x9d, 0x219: 0x9d, 0x21a: 0x9d, 0x21b: 0x9d, 0x21c: 0x9d, 0x21d: 0x9d, 0x21e: 0x9d, 0x21f: 0x9d, - 0x220: 0x9d, 0x221: 0x9d, 0x222: 0x9d, 0x223: 0x9d, 0x224: 0x9d, 0x225: 0x9d, 0x226: 0x9d, 0x227: 0x9d, - 0x228: 0x9d, 0x229: 0x9d, 0x22a: 0x9d, 0x22b: 0x9d, 0x22c: 0x9d, 0x22d: 0x9d, 0x22e: 0x9d, 0x22f: 0x9d, - 0x230: 0x9d, 0x231: 0x9d, 0x232: 0x9d, 0x233: 0x9d, 0x234: 0x9d, 0x235: 0x9d, 0x236: 0xb0, 0x237: 0x9b, - 0x238: 0x9d, 0x239: 0x9d, 0x23a: 0x9d, 0x23b: 0x9d, 0x23c: 0x9d, 0x23d: 0x9d, 0x23e: 0x9d, 0x23f: 0x9d, - // Block 0x9, offset 0x240 - 0x240: 0x9d, 0x241: 0x9d, 0x242: 0x9d, 0x243: 0x9d, 0x244: 0x9d, 0x245: 0x9d, 0x246: 0x9d, 0x247: 0x9d, - 0x248: 0x9d, 0x249: 0x9d, 0x24a: 0x9d, 0x24b: 0x9d, 0x24c: 0x9d, 0x24d: 0x9d, 0x24e: 0x9d, 0x24f: 0x9d, - 0x250: 0x9d, 0x251: 0x9d, 0x252: 0x9d, 0x253: 0x9d, 0x254: 0x9d, 0x255: 0x9d, 0x256: 0x9d, 0x257: 0x9d, - 0x258: 0x9d, 0x259: 0x9d, 0x25a: 0x9d, 0x25b: 0x9d, 0x25c: 0x9d, 0x25d: 0x9d, 0x25e: 0x9d, 0x25f: 0x9d, - 0x260: 0x9d, 0x261: 0x9d, 0x262: 0x9d, 0x263: 0x9d, 0x264: 0x9d, 0x265: 0x9d, 0x266: 0x9d, 0x267: 0x9d, - 0x268: 0x9d, 0x269: 0x9d, 0x26a: 0x9d, 0x26b: 0x9d, 0x26c: 0x9d, 0x26d: 0x9d, 0x26e: 0x9d, 0x26f: 0x9d, - 0x270: 0x9d, 0x271: 0x9d, 0x272: 0x9d, 0x273: 0x9d, 0x274: 0x9d, 0x275: 0x9d, 0x276: 0x9d, 0x277: 0x9d, - 0x278: 0x9d, 0x279: 0x9d, 0x27a: 0x9d, 0x27b: 0x9d, 0x27c: 0x9d, 0x27d: 0x9d, 0x27e: 0x9d, 0x27f: 0x9d, - // Block 0xa, offset 0x280 - 0x280: 0x9d, 0x281: 0x9d, 0x282: 0x9d, 0x283: 0x9d, 0x284: 0x9d, 0x285: 0x9d, 0x286: 0x9d, 0x287: 0x9d, - 0x288: 0x9d, 0x289: 0x9d, 0x28a: 0x9d, 0x28b: 0x9d, 0x28c: 0x9d, 0x28d: 0x9d, 0x28e: 0x9d, 0x28f: 0x9d, - 0x290: 0x9d, 0x291: 0x9d, 0x292: 0x9d, 0x293: 0x9d, 0x294: 0x9d, 0x295: 0x9d, 0x296: 0x9d, 0x297: 0x9d, - 0x298: 0x9d, 0x299: 0x9d, 0x29a: 0x9d, 0x29b: 0x9d, 0x29c: 0x9d, 0x29d: 0x9d, 0x29e: 0x9d, 0x29f: 0x9d, - 0x2a0: 0x9d, 0x2a1: 0x9d, 0x2a2: 0x9d, 0x2a3: 0x9d, 0x2a4: 0x9d, 0x2a5: 0x9d, 0x2a6: 0x9d, 0x2a7: 0x9d, - 0x2a8: 0x9d, 0x2a9: 0x9d, 0x2aa: 0x9d, 0x2ab: 0x9d, 0x2ac: 0x9d, 0x2ad: 0x9d, 0x2ae: 0x9d, 0x2af: 0x9d, - 0x2b0: 0x9d, 0x2b1: 0x9d, 0x2b2: 0x9d, 0x2b3: 0x9d, 0x2b4: 0x9d, 0x2b5: 0x9d, 0x2b6: 0x9d, 0x2b7: 0x9d, - 0x2b8: 0x9d, 0x2b9: 0x9d, 0x2ba: 0x9d, 0x2bb: 0x9d, 0x2bc: 0x9d, 0x2bd: 0x9d, 0x2be: 0x9d, 0x2bf: 0xe2, - // Block 0xb, offset 0x2c0 - 0x2c0: 0x9d, 0x2c1: 0x9d, 0x2c2: 0x9d, 0x2c3: 0x9d, 0x2c4: 0x9d, 0x2c5: 0x9d, 0x2c6: 0x9d, 0x2c7: 0x9d, - 0x2c8: 0x9d, 0x2c9: 0x9d, 0x2ca: 0x9d, 0x2cb: 0x9d, 0x2cc: 0x9d, 0x2cd: 0x9d, 0x2ce: 0x9d, 0x2cf: 0x9d, - 0x2d0: 0x9d, 0x2d1: 0x9d, 0x2d2: 0xe3, 0x2d3: 0xe4, 0x2d4: 0x9d, 0x2d5: 0x9d, 0x2d6: 0x9d, 0x2d7: 0x9d, - 0x2d8: 0xe5, 0x2d9: 0x40, 0x2da: 0x41, 0x2db: 0xe6, 0x2dc: 0x42, 0x2dd: 0x43, 0x2de: 0x44, 0x2df: 0xe7, - 0x2e0: 0xe8, 0x2e1: 0xe9, 0x2e2: 0xea, 0x2e3: 0xeb, 0x2e4: 0xec, 0x2e5: 0xed, 0x2e6: 0xee, 0x2e7: 0xef, - 0x2e8: 0xf0, 0x2e9: 0xf1, 0x2ea: 0xf2, 0x2eb: 0xf3, 0x2ec: 0xf4, 0x2ed: 0xf5, 0x2ee: 0xf6, 0x2ef: 0xf7, - 0x2f0: 0x9d, 0x2f1: 0x9d, 0x2f2: 0x9d, 0x2f3: 0x9d, 0x2f4: 0x9d, 0x2f5: 0x9d, 0x2f6: 0x9d, 0x2f7: 0x9d, - 0x2f8: 0x9d, 0x2f9: 0x9d, 0x2fa: 0x9d, 0x2fb: 0x9d, 0x2fc: 0x9d, 0x2fd: 0x9d, 0x2fe: 0x9d, 0x2ff: 0x9d, - // Block 0xc, offset 0x300 - 0x300: 0x9d, 0x301: 0x9d, 0x302: 0x9d, 0x303: 0x9d, 0x304: 0x9d, 0x305: 0x9d, 0x306: 0x9d, 0x307: 0x9d, - 0x308: 0x9d, 0x309: 0x9d, 0x30a: 0x9d, 0x30b: 0x9d, 0x30c: 0x9d, 0x30d: 0x9d, 0x30e: 0x9d, 0x30f: 0x9d, - 0x310: 0x9d, 0x311: 0x9d, 0x312: 0x9d, 0x313: 0x9d, 0x314: 0x9d, 0x315: 0x9d, 0x316: 0x9d, 0x317: 0x9d, - 0x318: 0x9d, 0x319: 0x9d, 0x31a: 0x9d, 0x31b: 0x9d, 0x31c: 0x9d, 0x31d: 0x9d, 0x31e: 0xf8, 0x31f: 0xf9, - // Block 0xd, offset 0x340 - 0x340: 0xb8, 0x341: 0xb8, 0x342: 0xb8, 0x343: 0xb8, 0x344: 0xb8, 0x345: 0xb8, 0x346: 0xb8, 0x347: 0xb8, - 0x348: 0xb8, 0x349: 0xb8, 0x34a: 0xb8, 0x34b: 0xb8, 0x34c: 0xb8, 0x34d: 0xb8, 0x34e: 0xb8, 0x34f: 0xb8, - 0x350: 0xb8, 0x351: 0xb8, 0x352: 0xb8, 0x353: 0xb8, 0x354: 0xb8, 0x355: 0xb8, 0x356: 0xb8, 0x357: 0xb8, - 0x358: 0xb8, 0x359: 0xb8, 0x35a: 0xb8, 0x35b: 0xb8, 0x35c: 0xb8, 0x35d: 0xb8, 0x35e: 0xb8, 0x35f: 0xb8, - 0x360: 0xb8, 0x361: 0xb8, 0x362: 0xb8, 0x363: 0xb8, 0x364: 0xb8, 0x365: 0xb8, 0x366: 0xb8, 0x367: 0xb8, - 0x368: 0xb8, 0x369: 0xb8, 0x36a: 0xb8, 0x36b: 0xb8, 0x36c: 0xb8, 0x36d: 0xb8, 0x36e: 0xb8, 0x36f: 0xb8, - 0x370: 0xb8, 0x371: 0xb8, 0x372: 0xb8, 0x373: 0xb8, 0x374: 0xb8, 0x375: 0xb8, 0x376: 0xb8, 0x377: 0xb8, - 0x378: 0xb8, 0x379: 0xb8, 0x37a: 0xb8, 0x37b: 0xb8, 0x37c: 0xb8, 0x37d: 0xb8, 0x37e: 0xb8, 0x37f: 0xb8, - // Block 0xe, offset 0x380 - 0x380: 0xb8, 0x381: 0xb8, 0x382: 0xb8, 0x383: 0xb8, 0x384: 0xb8, 0x385: 0xb8, 0x386: 0xb8, 0x387: 0xb8, - 0x388: 0xb8, 0x389: 0xb8, 0x38a: 0xb8, 0x38b: 0xb8, 0x38c: 0xb8, 0x38d: 0xb8, 0x38e: 0xb8, 0x38f: 0xb8, - 0x390: 0xb8, 0x391: 0xb8, 0x392: 0xb8, 0x393: 0xb8, 0x394: 0xb8, 0x395: 0xb8, 0x396: 0xb8, 0x397: 0xb8, - 0x398: 0xb8, 0x399: 0xb8, 0x39a: 0xb8, 0x39b: 0xb8, 0x39c: 0xb8, 0x39d: 0xb8, 0x39e: 0xb8, 0x39f: 0xb8, - 0x3a0: 0xb8, 0x3a1: 0xb8, 0x3a2: 0xb8, 0x3a3: 0xb8, 0x3a4: 0xfa, 0x3a5: 0xfb, 0x3a6: 0xfc, 0x3a7: 0xfd, - 0x3a8: 0x45, 0x3a9: 0xfe, 0x3aa: 0xff, 0x3ab: 0x46, 0x3ac: 0x47, 0x3ad: 0x48, 0x3ae: 0x49, 0x3af: 0x4a, - 0x3b0: 0x100, 0x3b1: 0x4b, 0x3b2: 0x4c, 0x3b3: 0x4d, 0x3b4: 0x4e, 0x3b5: 0x4f, 0x3b6: 0x101, 0x3b7: 0x50, - 0x3b8: 0x51, 0x3b9: 0x52, 0x3ba: 0x53, 0x3bb: 0x54, 0x3bc: 0x55, 0x3bd: 0x56, 0x3be: 0x57, 0x3bf: 0x58, - // Block 0xf, offset 0x3c0 - 0x3c0: 0x102, 0x3c1: 0x103, 0x3c2: 0x9d, 0x3c3: 0x104, 0x3c4: 0x105, 0x3c5: 0x9b, 0x3c6: 0x106, 0x3c7: 0x107, - 0x3c8: 0xb8, 0x3c9: 0xb8, 0x3ca: 0x108, 0x3cb: 0x109, 0x3cc: 0x10a, 0x3cd: 0x10b, 0x3ce: 0x10c, 0x3cf: 0x10d, - 0x3d0: 0x10e, 0x3d1: 0x9d, 0x3d2: 0x10f, 0x3d3: 0x110, 0x3d4: 0x111, 0x3d5: 0x112, 0x3d6: 0xb8, 0x3d7: 0xb8, - 0x3d8: 0x9d, 0x3d9: 0x9d, 0x3da: 0x9d, 0x3db: 0x9d, 0x3dc: 0x113, 0x3dd: 0x114, 0x3de: 0xb8, 0x3df: 0xb8, - 0x3e0: 0x115, 0x3e1: 0x116, 0x3e2: 0x117, 0x3e3: 0x118, 0x3e4: 0x119, 0x3e5: 0xb8, 0x3e6: 0x11a, 0x3e7: 0x11b, - 0x3e8: 0x11c, 0x3e9: 0x11d, 0x3ea: 0x11e, 0x3eb: 0x59, 0x3ec: 0x11f, 0x3ed: 0x120, 0x3ee: 0x5a, 0x3ef: 0xb8, - 0x3f0: 0x9d, 0x3f1: 0x121, 0x3f2: 0x122, 0x3f3: 0x123, 0x3f4: 0xb8, 0x3f5: 0xb8, 0x3f6: 0xb8, 0x3f7: 0xb8, - 0x3f8: 0xb8, 0x3f9: 0x124, 0x3fa: 0xb8, 0x3fb: 0xb8, 0x3fc: 0xb8, 0x3fd: 0xb8, 0x3fe: 0xb8, 0x3ff: 0xb8, - // Block 0x10, offset 0x400 - 0x400: 0x125, 0x401: 0x126, 0x402: 0x127, 0x403: 0x128, 0x404: 0x129, 0x405: 0x12a, 0x406: 0x12b, 0x407: 0x12c, - 0x408: 0x12d, 0x409: 0xb8, 0x40a: 0x12e, 0x40b: 0x12f, 0x40c: 0x5b, 0x40d: 0x5c, 0x40e: 0xb8, 0x40f: 0xb8, - 0x410: 0x130, 0x411: 0x131, 0x412: 0x132, 0x413: 0x133, 0x414: 0xb8, 0x415: 0xb8, 0x416: 0x134, 0x417: 0x135, - 0x418: 0x136, 0x419: 0x137, 0x41a: 0x138, 0x41b: 0x139, 0x41c: 0x13a, 0x41d: 0xb8, 0x41e: 0xb8, 0x41f: 0xb8, - 0x420: 0xb8, 0x421: 0xb8, 0x422: 0x13b, 0x423: 0x13c, 0x424: 0xb8, 0x425: 0xb8, 0x426: 0xb8, 0x427: 0xb8, - 0x428: 0xb8, 0x429: 0xb8, 0x42a: 0xb8, 0x42b: 0x13d, 0x42c: 0xb8, 0x42d: 0xb8, 0x42e: 0xb8, 0x42f: 0xb8, - 0x430: 0x13e, 0x431: 0x13f, 0x432: 0x140, 0x433: 0xb8, 0x434: 0xb8, 0x435: 0xb8, 0x436: 0xb8, 0x437: 0xb8, - 0x438: 0xb8, 0x439: 0xb8, 0x43a: 0xb8, 0x43b: 0xb8, 0x43c: 0xb8, 0x43d: 0xb8, 0x43e: 0xb8, 0x43f: 0xb8, - // Block 0x11, offset 0x440 - 0x440: 0x9d, 0x441: 0x9d, 0x442: 0x9d, 0x443: 0x9d, 0x444: 0x9d, 0x445: 0x9d, 0x446: 0x9d, 0x447: 0x9d, - 0x448: 0x9d, 0x449: 0x9d, 0x44a: 0x9d, 0x44b: 0x9d, 0x44c: 0x9d, 0x44d: 0x9d, 0x44e: 0x141, 0x44f: 0xb8, - 0x450: 0x9b, 0x451: 0x142, 0x452: 0x9d, 0x453: 0x9d, 0x454: 0x9d, 0x455: 0x143, 0x456: 0xb8, 0x457: 0xb8, - 0x458: 0xb8, 0x459: 0xb8, 0x45a: 0xb8, 0x45b: 0xb8, 0x45c: 0xb8, 0x45d: 0xb8, 0x45e: 0xb8, 0x45f: 0xb8, - 0x460: 0xb8, 0x461: 0xb8, 0x462: 0xb8, 0x463: 0xb8, 0x464: 0xb8, 0x465: 0xb8, 0x466: 0xb8, 0x467: 0xb8, - 0x468: 0xb8, 0x469: 0xb8, 0x46a: 0xb8, 0x46b: 0xb8, 0x46c: 0xb8, 0x46d: 0xb8, 0x46e: 0xb8, 0x46f: 0xb8, - 0x470: 0xb8, 0x471: 0xb8, 0x472: 0xb8, 0x473: 0xb8, 0x474: 0xb8, 0x475: 0xb8, 0x476: 0xb8, 0x477: 0xb8, - 0x478: 0xb8, 0x479: 0xb8, 0x47a: 0xb8, 0x47b: 0xb8, 0x47c: 0xb8, 0x47d: 0xb8, 0x47e: 0xb8, 0x47f: 0xb8, - // Block 0x12, offset 0x480 - 0x480: 0x9d, 0x481: 0x9d, 0x482: 0x9d, 0x483: 0x9d, 0x484: 0x9d, 0x485: 0x9d, 0x486: 0x9d, 0x487: 0x9d, - 0x488: 0x9d, 0x489: 0x9d, 0x48a: 0x9d, 0x48b: 0x9d, 0x48c: 0x9d, 0x48d: 0x9d, 0x48e: 0x9d, 0x48f: 0x9d, - 0x490: 0x144, 0x491: 0xb8, 0x492: 0xb8, 0x493: 0xb8, 0x494: 0xb8, 0x495: 0xb8, 0x496: 0xb8, 0x497: 0xb8, - 0x498: 0xb8, 0x499: 0xb8, 0x49a: 0xb8, 0x49b: 0xb8, 0x49c: 0xb8, 0x49d: 0xb8, 0x49e: 0xb8, 0x49f: 0xb8, - 0x4a0: 0xb8, 0x4a1: 0xb8, 0x4a2: 0xb8, 0x4a3: 0xb8, 0x4a4: 0xb8, 0x4a5: 0xb8, 0x4a6: 0xb8, 0x4a7: 0xb8, - 0x4a8: 0xb8, 0x4a9: 0xb8, 0x4aa: 0xb8, 0x4ab: 0xb8, 0x4ac: 0xb8, 0x4ad: 0xb8, 0x4ae: 0xb8, 0x4af: 0xb8, - 0x4b0: 0xb8, 0x4b1: 0xb8, 0x4b2: 0xb8, 0x4b3: 0xb8, 0x4b4: 0xb8, 0x4b5: 0xb8, 0x4b6: 0xb8, 0x4b7: 0xb8, - 0x4b8: 0xb8, 0x4b9: 0xb8, 0x4ba: 0xb8, 0x4bb: 0xb8, 0x4bc: 0xb8, 0x4bd: 0xb8, 0x4be: 0xb8, 0x4bf: 0xb8, - // Block 0x13, offset 0x4c0 - 0x4c0: 0xb8, 0x4c1: 0xb8, 0x4c2: 0xb8, 0x4c3: 0xb8, 0x4c4: 0xb8, 0x4c5: 0xb8, 0x4c6: 0xb8, 0x4c7: 0xb8, - 0x4c8: 0xb8, 0x4c9: 0xb8, 0x4ca: 0xb8, 0x4cb: 0xb8, 0x4cc: 0xb8, 0x4cd: 0xb8, 0x4ce: 0xb8, 0x4cf: 0xb8, - 0x4d0: 0x9d, 0x4d1: 0x9d, 0x4d2: 0x9d, 0x4d3: 0x9d, 0x4d4: 0x9d, 0x4d5: 0x9d, 0x4d6: 0x9d, 0x4d7: 0x9d, - 0x4d8: 0x9d, 0x4d9: 0x145, 0x4da: 0xb8, 0x4db: 0xb8, 0x4dc: 0xb8, 0x4dd: 0xb8, 0x4de: 0xb8, 0x4df: 0xb8, - 0x4e0: 0xb8, 0x4e1: 0xb8, 0x4e2: 0xb8, 0x4e3: 0xb8, 0x4e4: 0xb8, 0x4e5: 0xb8, 0x4e6: 0xb8, 0x4e7: 0xb8, - 0x4e8: 0xb8, 0x4e9: 0xb8, 0x4ea: 0xb8, 0x4eb: 0xb8, 0x4ec: 0xb8, 0x4ed: 0xb8, 0x4ee: 0xb8, 0x4ef: 0xb8, - 0x4f0: 0xb8, 0x4f1: 0xb8, 0x4f2: 0xb8, 0x4f3: 0xb8, 0x4f4: 0xb8, 0x4f5: 0xb8, 0x4f6: 0xb8, 0x4f7: 0xb8, - 0x4f8: 0xb8, 0x4f9: 0xb8, 0x4fa: 0xb8, 0x4fb: 0xb8, 0x4fc: 0xb8, 0x4fd: 0xb8, 0x4fe: 0xb8, 0x4ff: 0xb8, - // Block 0x14, offset 0x500 - 0x500: 0xb8, 0x501: 0xb8, 0x502: 0xb8, 0x503: 0xb8, 0x504: 0xb8, 0x505: 0xb8, 0x506: 0xb8, 0x507: 0xb8, - 0x508: 0xb8, 0x509: 0xb8, 0x50a: 0xb8, 0x50b: 0xb8, 0x50c: 0xb8, 0x50d: 0xb8, 0x50e: 0xb8, 0x50f: 0xb8, - 0x510: 0xb8, 0x511: 0xb8, 0x512: 0xb8, 0x513: 0xb8, 0x514: 0xb8, 0x515: 0xb8, 0x516: 0xb8, 0x517: 0xb8, - 0x518: 0xb8, 0x519: 0xb8, 0x51a: 0xb8, 0x51b: 0xb8, 0x51c: 0xb8, 0x51d: 0xb8, 0x51e: 0xb8, 0x51f: 0xb8, - 0x520: 0x9d, 0x521: 0x9d, 0x522: 0x9d, 0x523: 0x9d, 0x524: 0x9d, 0x525: 0x9d, 0x526: 0x9d, 0x527: 0x9d, - 0x528: 0x13d, 0x529: 0x146, 0x52a: 0xb8, 0x52b: 0x147, 0x52c: 0x148, 0x52d: 0x149, 0x52e: 0x14a, 0x52f: 0xb8, - 0x530: 0xb8, 0x531: 0xb8, 0x532: 0xb8, 0x533: 0xb8, 0x534: 0xb8, 0x535: 0xb8, 0x536: 0xb8, 0x537: 0xb8, - 0x538: 0xb8, 0x539: 0xb8, 0x53a: 0xb8, 0x53b: 0xb8, 0x53c: 0x9d, 0x53d: 0x14b, 0x53e: 0x14c, 0x53f: 0x14d, - // Block 0x15, offset 0x540 - 0x540: 0x9d, 0x541: 0x9d, 0x542: 0x9d, 0x543: 0x9d, 0x544: 0x9d, 0x545: 0x9d, 0x546: 0x9d, 0x547: 0x9d, - 0x548: 0x9d, 0x549: 0x9d, 0x54a: 0x9d, 0x54b: 0x9d, 0x54c: 0x9d, 0x54d: 0x9d, 0x54e: 0x9d, 0x54f: 0x9d, - 0x550: 0x9d, 0x551: 0x9d, 0x552: 0x9d, 0x553: 0x9d, 0x554: 0x9d, 0x555: 0x9d, 0x556: 0x9d, 0x557: 0x9d, - 0x558: 0x9d, 0x559: 0x9d, 0x55a: 0x9d, 0x55b: 0x9d, 0x55c: 0x9d, 0x55d: 0x9d, 0x55e: 0x9d, 0x55f: 0x14e, - 0x560: 0x9d, 0x561: 0x9d, 0x562: 0x9d, 0x563: 0x9d, 0x564: 0x9d, 0x565: 0x9d, 0x566: 0x9d, 0x567: 0x9d, - 0x568: 0x9d, 0x569: 0x9d, 0x56a: 0x9d, 0x56b: 0x14f, 0x56c: 0xb8, 0x56d: 0xb8, 0x56e: 0xb8, 0x56f: 0xb8, - 0x570: 0xb8, 0x571: 0xb8, 0x572: 0xb8, 0x573: 0xb8, 0x574: 0xb8, 0x575: 0xb8, 0x576: 0xb8, 0x577: 0xb8, - 0x578: 0xb8, 0x579: 0xb8, 0x57a: 0xb8, 0x57b: 0xb8, 0x57c: 0xb8, 0x57d: 0xb8, 0x57e: 0xb8, 0x57f: 0xb8, - // Block 0x16, offset 0x580 - 0x580: 0x150, 0x581: 0xb8, 0x582: 0xb8, 0x583: 0xb8, 0x584: 0xb8, 0x585: 0xb8, 0x586: 0xb8, 0x587: 0xb8, - 0x588: 0xb8, 0x589: 0xb8, 0x58a: 0xb8, 0x58b: 0xb8, 0x58c: 0xb8, 0x58d: 0xb8, 0x58e: 0xb8, 0x58f: 0xb8, - 0x590: 0xb8, 0x591: 0xb8, 0x592: 0xb8, 0x593: 0xb8, 0x594: 0xb8, 0x595: 0xb8, 0x596: 0xb8, 0x597: 0xb8, - 0x598: 0xb8, 0x599: 0xb8, 0x59a: 0xb8, 0x59b: 0xb8, 0x59c: 0xb8, 0x59d: 0xb8, 0x59e: 0xb8, 0x59f: 0xb8, - 0x5a0: 0xb8, 0x5a1: 0xb8, 0x5a2: 0xb8, 0x5a3: 0xb8, 0x5a4: 0xb8, 0x5a5: 0xb8, 0x5a6: 0xb8, 0x5a7: 0xb8, - 0x5a8: 0xb8, 0x5a9: 0xb8, 0x5aa: 0xb8, 0x5ab: 0xb8, 0x5ac: 0xb8, 0x5ad: 0xb8, 0x5ae: 0xb8, 0x5af: 0xb8, - 0x5b0: 0x9d, 0x5b1: 0x151, 0x5b2: 0x152, 0x5b3: 0xb8, 0x5b4: 0xb8, 0x5b5: 0xb8, 0x5b6: 0xb8, 0x5b7: 0xb8, - 0x5b8: 0xb8, 0x5b9: 0xb8, 0x5ba: 0xb8, 0x5bb: 0xb8, 0x5bc: 0xb8, 0x5bd: 0xb8, 0x5be: 0xb8, 0x5bf: 0xb8, - // Block 0x17, offset 0x5c0 - 0x5c0: 0x9b, 0x5c1: 0x9b, 0x5c2: 0x9b, 0x5c3: 0x153, 0x5c4: 0x154, 0x5c5: 0x155, 0x5c6: 0x156, 0x5c7: 0x157, - 0x5c8: 0x9b, 0x5c9: 0x158, 0x5ca: 0xb8, 0x5cb: 0xb8, 0x5cc: 0x9b, 0x5cd: 0x159, 0x5ce: 0xb8, 0x5cf: 0xb8, - 0x5d0: 0x5d, 0x5d1: 0x5e, 0x5d2: 0x5f, 0x5d3: 0x60, 0x5d4: 0x61, 0x5d5: 0x62, 0x5d6: 0x63, 0x5d7: 0x64, - 0x5d8: 0x65, 0x5d9: 0x66, 0x5da: 0x67, 0x5db: 0x68, 0x5dc: 0x69, 0x5dd: 0x6a, 0x5de: 0x6b, 0x5df: 0x6c, - 0x5e0: 0x9b, 0x5e1: 0x9b, 0x5e2: 0x9b, 0x5e3: 0x9b, 0x5e4: 0x9b, 0x5e5: 0x9b, 0x5e6: 0x9b, 0x5e7: 0x9b, - 0x5e8: 0x15a, 0x5e9: 0x15b, 0x5ea: 0x15c, 0x5eb: 0xb8, 0x5ec: 0xb8, 0x5ed: 0xb8, 0x5ee: 0xb8, 0x5ef: 0xb8, - 0x5f0: 0xb8, 0x5f1: 0xb8, 0x5f2: 0xb8, 0x5f3: 0xb8, 0x5f4: 0xb8, 0x5f5: 0xb8, 0x5f6: 0xb8, 0x5f7: 0xb8, - 0x5f8: 0xb8, 0x5f9: 0xb8, 0x5fa: 0xb8, 0x5fb: 0xb8, 0x5fc: 0xb8, 0x5fd: 0xb8, 0x5fe: 0xb8, 0x5ff: 0xb8, - // Block 0x18, offset 0x600 - 0x600: 0x15d, 0x601: 0xb8, 0x602: 0xb8, 0x603: 0xb8, 0x604: 0xb8, 0x605: 0xb8, 0x606: 0xb8, 0x607: 0xb8, - 0x608: 0xb8, 0x609: 0xb8, 0x60a: 0xb8, 0x60b: 0xb8, 0x60c: 0xb8, 0x60d: 0xb8, 0x60e: 0xb8, 0x60f: 0xb8, - 0x610: 0xb8, 0x611: 0xb8, 0x612: 0xb8, 0x613: 0xb8, 0x614: 0xb8, 0x615: 0xb8, 0x616: 0xb8, 0x617: 0xb8, - 0x618: 0xb8, 0x619: 0xb8, 0x61a: 0xb8, 0x61b: 0xb8, 0x61c: 0xb8, 0x61d: 0xb8, 0x61e: 0xb8, 0x61f: 0xb8, - 0x620: 0x9d, 0x621: 0x9d, 0x622: 0x9d, 0x623: 0x15e, 0x624: 0x6d, 0x625: 0x15f, 0x626: 0xb8, 0x627: 0xb8, - 0x628: 0xb8, 0x629: 0xb8, 0x62a: 0xb8, 0x62b: 0xb8, 0x62c: 0xb8, 0x62d: 0xb8, 0x62e: 0xb8, 0x62f: 0xb8, - 0x630: 0xb8, 0x631: 0xb8, 0x632: 0xb8, 0x633: 0xb8, 0x634: 0xb8, 0x635: 0xb8, 0x636: 0xb8, 0x637: 0xb8, - 0x638: 0x6e, 0x639: 0x6f, 0x63a: 0x70, 0x63b: 0x160, 0x63c: 0xb8, 0x63d: 0xb8, 0x63e: 0xb8, 0x63f: 0xb8, - // Block 0x19, offset 0x640 - 0x640: 0x161, 0x641: 0x9b, 0x642: 0x162, 0x643: 0x163, 0x644: 0x71, 0x645: 0x72, 0x646: 0x164, 0x647: 0x165, - 0x648: 0x73, 0x649: 0x166, 0x64a: 0xb8, 0x64b: 0xb8, 0x64c: 0x9b, 0x64d: 0x9b, 0x64e: 0x9b, 0x64f: 0x9b, - 0x650: 0x9b, 0x651: 0x9b, 0x652: 0x9b, 0x653: 0x9b, 0x654: 0x9b, 0x655: 0x9b, 0x656: 0x9b, 0x657: 0x9b, - 0x658: 0x9b, 0x659: 0x9b, 0x65a: 0x9b, 0x65b: 0x167, 0x65c: 0x9b, 0x65d: 0x168, 0x65e: 0x9b, 0x65f: 0x169, - 0x660: 0x16a, 0x661: 0x16b, 0x662: 0x16c, 0x663: 0xb8, 0x664: 0x16d, 0x665: 0x16e, 0x666: 0x16f, 0x667: 0x170, - 0x668: 0xb8, 0x669: 0xb8, 0x66a: 0xb8, 0x66b: 0xb8, 0x66c: 0xb8, 0x66d: 0xb8, 0x66e: 0xb8, 0x66f: 0xb8, - 0x670: 0xb8, 0x671: 0xb8, 0x672: 0xb8, 0x673: 0xb8, 0x674: 0xb8, 0x675: 0xb8, 0x676: 0xb8, 0x677: 0xb8, - 0x678: 0xb8, 0x679: 0xb8, 0x67a: 0xb8, 0x67b: 0xb8, 0x67c: 0xb8, 0x67d: 0xb8, 0x67e: 0xb8, 0x67f: 0xb8, - // Block 0x1a, offset 0x680 - 0x680: 0x9d, 0x681: 0x9d, 0x682: 0x9d, 0x683: 0x9d, 0x684: 0x9d, 0x685: 0x9d, 0x686: 0x9d, 0x687: 0x9d, - 0x688: 0x9d, 0x689: 0x9d, 0x68a: 0x9d, 0x68b: 0x9d, 0x68c: 0x9d, 0x68d: 0x9d, 0x68e: 0x9d, 0x68f: 0x9d, - 0x690: 0x9d, 0x691: 0x9d, 0x692: 0x9d, 0x693: 0x9d, 0x694: 0x9d, 0x695: 0x9d, 0x696: 0x9d, 0x697: 0x9d, - 0x698: 0x9d, 0x699: 0x9d, 0x69a: 0x9d, 0x69b: 0x171, 0x69c: 0x9d, 0x69d: 0x9d, 0x69e: 0x9d, 0x69f: 0x9d, - 0x6a0: 0x9d, 0x6a1: 0x9d, 0x6a2: 0x9d, 0x6a3: 0x9d, 0x6a4: 0x9d, 0x6a5: 0x9d, 0x6a6: 0x9d, 0x6a7: 0x9d, - 0x6a8: 0x9d, 0x6a9: 0x9d, 0x6aa: 0x9d, 0x6ab: 0x9d, 0x6ac: 0x9d, 0x6ad: 0x9d, 0x6ae: 0x9d, 0x6af: 0x9d, - 0x6b0: 0x9d, 0x6b1: 0x9d, 0x6b2: 0x9d, 0x6b3: 0x9d, 0x6b4: 0x9d, 0x6b5: 0x9d, 0x6b6: 0x9d, 0x6b7: 0x9d, - 0x6b8: 0x9d, 0x6b9: 0x9d, 0x6ba: 0x9d, 0x6bb: 0x9d, 0x6bc: 0x9d, 0x6bd: 0x9d, 0x6be: 0x9d, 0x6bf: 0x9d, - // Block 0x1b, offset 0x6c0 - 0x6c0: 0x9d, 0x6c1: 0x9d, 0x6c2: 0x9d, 0x6c3: 0x9d, 0x6c4: 0x9d, 0x6c5: 0x9d, 0x6c6: 0x9d, 0x6c7: 0x9d, - 0x6c8: 0x9d, 0x6c9: 0x9d, 0x6ca: 0x9d, 0x6cb: 0x9d, 0x6cc: 0x9d, 0x6cd: 0x9d, 0x6ce: 0x9d, 0x6cf: 0x9d, - 0x6d0: 0x9d, 0x6d1: 0x9d, 0x6d2: 0x9d, 0x6d3: 0x9d, 0x6d4: 0x9d, 0x6d5: 0x9d, 0x6d6: 0x9d, 0x6d7: 0x9d, - 0x6d8: 0x9d, 0x6d9: 0x9d, 0x6da: 0x9d, 0x6db: 0x9d, 0x6dc: 0x172, 0x6dd: 0x9d, 0x6de: 0x9d, 0x6df: 0x9d, - 0x6e0: 0x173, 0x6e1: 0x9d, 0x6e2: 0x9d, 0x6e3: 0x9d, 0x6e4: 0x9d, 0x6e5: 0x9d, 0x6e6: 0x9d, 0x6e7: 0x9d, - 0x6e8: 0x9d, 0x6e9: 0x9d, 0x6ea: 0x9d, 0x6eb: 0x9d, 0x6ec: 0x9d, 0x6ed: 0x9d, 0x6ee: 0x9d, 0x6ef: 0x9d, - 0x6f0: 0x9d, 0x6f1: 0x9d, 0x6f2: 0x9d, 0x6f3: 0x9d, 0x6f4: 0x9d, 0x6f5: 0x9d, 0x6f6: 0x9d, 0x6f7: 0x9d, - 0x6f8: 0x9d, 0x6f9: 0x9d, 0x6fa: 0x9d, 0x6fb: 0x9d, 0x6fc: 0x9d, 0x6fd: 0x9d, 0x6fe: 0x9d, 0x6ff: 0x9d, - // Block 0x1c, offset 0x700 - 0x700: 0x9d, 0x701: 0x9d, 0x702: 0x9d, 0x703: 0x9d, 0x704: 0x9d, 0x705: 0x9d, 0x706: 0x9d, 0x707: 0x9d, - 0x708: 0x9d, 0x709: 0x9d, 0x70a: 0x9d, 0x70b: 0x9d, 0x70c: 0x9d, 0x70d: 0x9d, 0x70e: 0x9d, 0x70f: 0x9d, - 0x710: 0x9d, 0x711: 0x9d, 0x712: 0x9d, 0x713: 0x9d, 0x714: 0x9d, 0x715: 0x9d, 0x716: 0x9d, 0x717: 0x9d, - 0x718: 0x9d, 0x719: 0x9d, 0x71a: 0x9d, 0x71b: 0x9d, 0x71c: 0x9d, 0x71d: 0x9d, 0x71e: 0x9d, 0x71f: 0x9d, - 0x720: 0x9d, 0x721: 0x9d, 0x722: 0x9d, 0x723: 0x9d, 0x724: 0x9d, 0x725: 0x9d, 0x726: 0x9d, 0x727: 0x9d, - 0x728: 0x9d, 0x729: 0x9d, 0x72a: 0x9d, 0x72b: 0x9d, 0x72c: 0x9d, 0x72d: 0x9d, 0x72e: 0x9d, 0x72f: 0x9d, - 0x730: 0x9d, 0x731: 0x9d, 0x732: 0x9d, 0x733: 0x9d, 0x734: 0x9d, 0x735: 0x9d, 0x736: 0x9d, 0x737: 0x9d, - 0x738: 0x9d, 0x739: 0x9d, 0x73a: 0x174, 0x73b: 0xb8, 0x73c: 0xb8, 0x73d: 0xb8, 0x73e: 0xb8, 0x73f: 0xb8, - // Block 0x1d, offset 0x740 - 0x740: 0xb8, 0x741: 0xb8, 0x742: 0xb8, 0x743: 0xb8, 0x744: 0xb8, 0x745: 0xb8, 0x746: 0xb8, 0x747: 0xb8, - 0x748: 0xb8, 0x749: 0xb8, 0x74a: 0xb8, 0x74b: 0xb8, 0x74c: 0xb8, 0x74d: 0xb8, 0x74e: 0xb8, 0x74f: 0xb8, - 0x750: 0xb8, 0x751: 0xb8, 0x752: 0xb8, 0x753: 0xb8, 0x754: 0xb8, 0x755: 0xb8, 0x756: 0xb8, 0x757: 0xb8, - 0x758: 0xb8, 0x759: 0xb8, 0x75a: 0xb8, 0x75b: 0xb8, 0x75c: 0xb8, 0x75d: 0xb8, 0x75e: 0xb8, 0x75f: 0xb8, - 0x760: 0x74, 0x761: 0x75, 0x762: 0x76, 0x763: 0x175, 0x764: 0x77, 0x765: 0x78, 0x766: 0x176, 0x767: 0x79, - 0x768: 0x7a, 0x769: 0xb8, 0x76a: 0xb8, 0x76b: 0xb8, 0x76c: 0xb8, 0x76d: 0xb8, 0x76e: 0xb8, 0x76f: 0xb8, - 0x770: 0xb8, 0x771: 0xb8, 0x772: 0xb8, 0x773: 0xb8, 0x774: 0xb8, 0x775: 0xb8, 0x776: 0xb8, 0x777: 0xb8, - 0x778: 0xb8, 0x779: 0xb8, 0x77a: 0xb8, 0x77b: 0xb8, 0x77c: 0xb8, 0x77d: 0xb8, 0x77e: 0xb8, 0x77f: 0xb8, - // Block 0x1e, offset 0x780 - 0x790: 0x0d, 0x791: 0x0e, 0x792: 0x0f, 0x793: 0x10, 0x794: 0x11, 0x795: 0x0b, 0x796: 0x12, 0x797: 0x07, - 0x798: 0x13, 0x799: 0x0b, 0x79a: 0x0b, 0x79b: 0x14, 0x79c: 0x0b, 0x79d: 0x15, 0x79e: 0x16, 0x79f: 0x17, - 0x7a0: 0x07, 0x7a1: 0x07, 0x7a2: 0x07, 0x7a3: 0x07, 0x7a4: 0x07, 0x7a5: 0x07, 0x7a6: 0x07, 0x7a7: 0x07, - 0x7a8: 0x07, 0x7a9: 0x07, 0x7aa: 0x18, 0x7ab: 0x19, 0x7ac: 0x1a, 0x7ad: 0x0b, 0x7ae: 0x0b, 0x7af: 0x1b, - 0x7b0: 0x0b, 0x7b1: 0x0b, 0x7b2: 0x0b, 0x7b3: 0x0b, 0x7b4: 0x0b, 0x7b5: 0x0b, 0x7b6: 0x0b, 0x7b7: 0x0b, - 0x7b8: 0x0b, 0x7b9: 0x0b, 0x7ba: 0x0b, 0x7bb: 0x0b, 0x7bc: 0x0b, 0x7bd: 0x0b, 0x7be: 0x0b, 0x7bf: 0x0b, - // Block 0x1f, offset 0x7c0 - 0x7c0: 0x0b, 0x7c1: 0x0b, 0x7c2: 0x0b, 0x7c3: 0x0b, 0x7c4: 0x0b, 0x7c5: 0x0b, 0x7c6: 0x0b, 0x7c7: 0x0b, - 0x7c8: 0x0b, 0x7c9: 0x0b, 0x7ca: 0x0b, 0x7cb: 0x0b, 0x7cc: 0x0b, 0x7cd: 0x0b, 0x7ce: 0x0b, 0x7cf: 0x0b, - 0x7d0: 0x0b, 0x7d1: 0x0b, 0x7d2: 0x0b, 0x7d3: 0x0b, 0x7d4: 0x0b, 0x7d5: 0x0b, 0x7d6: 0x0b, 0x7d7: 0x0b, - 0x7d8: 0x0b, 0x7d9: 0x0b, 0x7da: 0x0b, 0x7db: 0x0b, 0x7dc: 0x0b, 0x7dd: 0x0b, 0x7de: 0x0b, 0x7df: 0x0b, - 0x7e0: 0x0b, 0x7e1: 0x0b, 0x7e2: 0x0b, 0x7e3: 0x0b, 0x7e4: 0x0b, 0x7e5: 0x0b, 0x7e6: 0x0b, 0x7e7: 0x0b, - 0x7e8: 0x0b, 0x7e9: 0x0b, 0x7ea: 0x0b, 0x7eb: 0x0b, 0x7ec: 0x0b, 0x7ed: 0x0b, 0x7ee: 0x0b, 0x7ef: 0x0b, - 0x7f0: 0x0b, 0x7f1: 0x0b, 0x7f2: 0x0b, 0x7f3: 0x0b, 0x7f4: 0x0b, 0x7f5: 0x0b, 0x7f6: 0x0b, 0x7f7: 0x0b, - 0x7f8: 0x0b, 0x7f9: 0x0b, 0x7fa: 0x0b, 0x7fb: 0x0b, 0x7fc: 0x0b, 0x7fd: 0x0b, 0x7fe: 0x0b, 0x7ff: 0x0b, - // Block 0x20, offset 0x800 - 0x800: 0x177, 0x801: 0x178, 0x802: 0xb8, 0x803: 0xb8, 0x804: 0x179, 0x805: 0x179, 0x806: 0x179, 0x807: 0x17a, - 0x808: 0xb8, 0x809: 0xb8, 0x80a: 0xb8, 0x80b: 0xb8, 0x80c: 0xb8, 0x80d: 0xb8, 0x80e: 0xb8, 0x80f: 0xb8, - 0x810: 0xb8, 0x811: 0xb8, 0x812: 0xb8, 0x813: 0xb8, 0x814: 0xb8, 0x815: 0xb8, 0x816: 0xb8, 0x817: 0xb8, - 0x818: 0xb8, 0x819: 0xb8, 0x81a: 0xb8, 0x81b: 0xb8, 0x81c: 0xb8, 0x81d: 0xb8, 0x81e: 0xb8, 0x81f: 0xb8, - 0x820: 0xb8, 0x821: 0xb8, 0x822: 0xb8, 0x823: 0xb8, 0x824: 0xb8, 0x825: 0xb8, 0x826: 0xb8, 0x827: 0xb8, - 0x828: 0xb8, 0x829: 0xb8, 0x82a: 0xb8, 0x82b: 0xb8, 0x82c: 0xb8, 0x82d: 0xb8, 0x82e: 0xb8, 0x82f: 0xb8, - 0x830: 0xb8, 0x831: 0xb8, 0x832: 0xb8, 0x833: 0xb8, 0x834: 0xb8, 0x835: 0xb8, 0x836: 0xb8, 0x837: 0xb8, - 0x838: 0xb8, 0x839: 0xb8, 0x83a: 0xb8, 0x83b: 0xb8, 0x83c: 0xb8, 0x83d: 0xb8, 0x83e: 0xb8, 0x83f: 0xb8, - // Block 0x21, offset 0x840 - 0x840: 0x0b, 0x841: 0x0b, 0x842: 0x0b, 0x843: 0x0b, 0x844: 0x0b, 0x845: 0x0b, 0x846: 0x0b, 0x847: 0x0b, - 0x848: 0x0b, 0x849: 0x0b, 0x84a: 0x0b, 0x84b: 0x0b, 0x84c: 0x0b, 0x84d: 0x0b, 0x84e: 0x0b, 0x84f: 0x0b, - 0x850: 0x0b, 0x851: 0x0b, 0x852: 0x0b, 0x853: 0x0b, 0x854: 0x0b, 0x855: 0x0b, 0x856: 0x0b, 0x857: 0x0b, - 0x858: 0x0b, 0x859: 0x0b, 0x85a: 0x0b, 0x85b: 0x0b, 0x85c: 0x0b, 0x85d: 0x0b, 0x85e: 0x0b, 0x85f: 0x0b, - 0x860: 0x1e, 0x861: 0x0b, 0x862: 0x0b, 0x863: 0x0b, 0x864: 0x0b, 0x865: 0x0b, 0x866: 0x0b, 0x867: 0x0b, - 0x868: 0x0b, 0x869: 0x0b, 0x86a: 0x0b, 0x86b: 0x0b, 0x86c: 0x0b, 0x86d: 0x0b, 0x86e: 0x0b, 0x86f: 0x0b, - 0x870: 0x0b, 0x871: 0x0b, 0x872: 0x0b, 0x873: 0x0b, 0x874: 0x0b, 0x875: 0x0b, 0x876: 0x0b, 0x877: 0x0b, - 0x878: 0x0b, 0x879: 0x0b, 0x87a: 0x0b, 0x87b: 0x0b, 0x87c: 0x0b, 0x87d: 0x0b, 0x87e: 0x0b, 0x87f: 0x0b, - // Block 0x22, offset 0x880 - 0x880: 0x0b, 0x881: 0x0b, 0x882: 0x0b, 0x883: 0x0b, 0x884: 0x0b, 0x885: 0x0b, 0x886: 0x0b, 0x887: 0x0b, - 0x888: 0x0b, 0x889: 0x0b, 0x88a: 0x0b, 0x88b: 0x0b, 0x88c: 0x0b, 0x88d: 0x0b, 0x88e: 0x0b, 0x88f: 0x0b, -} - -// idnaSparseOffset: 256 entries, 512 bytes -var idnaSparseOffset = []uint16{0x0, 0x8, 0x19, 0x25, 0x27, 0x2c, 0x34, 0x3f, 0x4b, 0x5c, 0x60, 0x6f, 0x74, 0x7b, 0x87, 0x95, 0xa3, 0xa8, 0xb1, 0xc1, 0xcf, 0xdc, 0xe8, 0xf9, 0x103, 0x10a, 0x117, 0x128, 0x12f, 0x13a, 0x149, 0x157, 0x161, 0x163, 0x167, 0x169, 0x175, 0x180, 0x188, 0x18e, 0x194, 0x199, 0x19e, 0x1a1, 0x1a5, 0x1ab, 0x1b0, 0x1bc, 0x1c6, 0x1cc, 0x1dd, 0x1e7, 0x1ea, 0x1f2, 0x1f5, 0x202, 0x20a, 0x20e, 0x215, 0x21d, 0x22d, 0x239, 0x23b, 0x245, 0x251, 0x25d, 0x269, 0x271, 0x276, 0x280, 0x291, 0x295, 0x2a0, 0x2a4, 0x2ad, 0x2b5, 0x2bb, 0x2c0, 0x2c3, 0x2c6, 0x2ca, 0x2d0, 0x2d4, 0x2d8, 0x2de, 0x2e5, 0x2eb, 0x2f3, 0x2fa, 0x305, 0x30f, 0x313, 0x316, 0x31c, 0x320, 0x322, 0x325, 0x327, 0x32a, 0x334, 0x337, 0x346, 0x34a, 0x34f, 0x352, 0x356, 0x35b, 0x360, 0x366, 0x36c, 0x37b, 0x381, 0x385, 0x394, 0x399, 0x3a1, 0x3ab, 0x3b6, 0x3be, 0x3cf, 0x3d8, 0x3e8, 0x3f5, 0x3ff, 0x404, 0x411, 0x415, 0x41a, 0x41c, 0x420, 0x422, 0x426, 0x42f, 0x435, 0x439, 0x449, 0x453, 0x458, 0x45b, 0x461, 0x468, 0x46d, 0x471, 0x477, 0x47c, 0x485, 0x48a, 0x490, 0x497, 0x49e, 0x4a5, 0x4a9, 0x4ae, 0x4b1, 0x4b6, 0x4c2, 0x4c8, 0x4cd, 0x4d4, 0x4dc, 0x4e1, 0x4e5, 0x4f5, 0x4fc, 0x500, 0x504, 0x50b, 0x50e, 0x511, 0x515, 0x519, 0x51f, 0x528, 0x534, 0x53b, 0x544, 0x54c, 0x553, 0x561, 0x56e, 0x57b, 0x584, 0x588, 0x596, 0x59e, 0x5a9, 0x5b2, 0x5b8, 0x5c0, 0x5c9, 0x5d3, 0x5d6, 0x5e2, 0x5e5, 0x5ea, 0x5ed, 0x5f7, 0x600, 0x60c, 0x60f, 0x614, 0x617, 0x61a, 0x61d, 0x624, 0x62b, 0x62f, 0x63a, 0x63d, 0x643, 0x648, 0x64c, 0x64f, 0x652, 0x655, 0x65a, 0x664, 0x667, 0x66b, 0x67a, 0x686, 0x68a, 0x68f, 0x694, 0x698, 0x69d, 0x6a6, 0x6b1, 0x6b7, 0x6bf, 0x6c3, 0x6c7, 0x6cd, 0x6d3, 0x6d8, 0x6db, 0x6e9, 0x6f0, 0x6f3, 0x6f6, 0x6fa, 0x700, 0x705, 0x70f, 0x714, 0x717, 0x71a, 0x71d, 0x720, 0x724, 0x727, 0x737, 0x748, 0x74d, 0x74f, 0x751} - -// idnaSparseValues: 1876 entries, 7504 bytes -var idnaSparseValues = [1876]valueRange{ - // Block 0x0, offset 0x0 - {value: 0x0000, lo: 0x07}, - {value: 0xe105, lo: 0x80, hi: 0x96}, - {value: 0x0018, lo: 0x97, hi: 0x97}, - {value: 0xe105, lo: 0x98, hi: 0x9e}, - {value: 0x001f, lo: 0x9f, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xb6}, - {value: 0x0018, lo: 0xb7, hi: 0xb7}, - {value: 0x0008, lo: 0xb8, hi: 0xbf}, - // Block 0x1, offset 0x8 - {value: 0x0000, lo: 0x10}, - {value: 0x0008, lo: 0x80, hi: 0x80}, - {value: 0xe01d, lo: 0x81, hi: 0x81}, - {value: 0x0008, lo: 0x82, hi: 0x82}, - {value: 0x0335, lo: 0x83, hi: 0x83}, - {value: 0x034d, lo: 0x84, hi: 0x84}, - {value: 0x0365, lo: 0x85, hi: 0x85}, - {value: 0xe00d, lo: 0x86, hi: 0x86}, - {value: 0x0008, lo: 0x87, hi: 0x87}, - {value: 0xe00d, lo: 0x88, hi: 0x88}, - {value: 0x0008, lo: 0x89, hi: 0x89}, - {value: 0xe00d, lo: 0x8a, hi: 0x8a}, - {value: 0x0008, lo: 0x8b, hi: 0x8b}, - {value: 0xe00d, lo: 0x8c, hi: 0x8c}, - {value: 0x0008, lo: 0x8d, hi: 0x8d}, - {value: 0xe00d, lo: 0x8e, hi: 0x8e}, - {value: 0x0008, lo: 0x8f, hi: 0xbf}, - // Block 0x2, offset 0x19 - {value: 0x0000, lo: 0x0b}, - {value: 0x0008, lo: 0x80, hi: 0xaf}, - {value: 0x0249, lo: 0xb0, hi: 0xb0}, - {value: 0x037d, lo: 0xb1, hi: 0xb1}, - {value: 0x0259, lo: 0xb2, hi: 0xb2}, - {value: 0x0269, lo: 0xb3, hi: 0xb3}, - {value: 0x034d, lo: 0xb4, hi: 0xb4}, - {value: 0x0395, lo: 0xb5, hi: 0xb5}, - {value: 0xe1bd, lo: 0xb6, hi: 0xb6}, - {value: 0x0279, lo: 0xb7, hi: 0xb7}, - {value: 0x0289, lo: 0xb8, hi: 0xb8}, - {value: 0x0008, lo: 0xb9, hi: 0xbf}, - // Block 0x3, offset 0x25 - {value: 0x0000, lo: 0x01}, - {value: 0x1308, lo: 0x80, hi: 0xbf}, - // Block 0x4, offset 0x27 - {value: 0x0000, lo: 0x04}, - {value: 0x03f5, lo: 0x80, hi: 0x8f}, - {value: 0xe105, lo: 0x90, hi: 0x9f}, - {value: 0x049d, lo: 0xa0, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xbf}, - // Block 0x5, offset 0x2c - {value: 0x0000, lo: 0x07}, - {value: 0xe185, lo: 0x80, hi: 0x8f}, - {value: 0x0545, lo: 0x90, hi: 0x96}, - {value: 0x0040, lo: 0x97, hi: 0x98}, - {value: 0x0008, lo: 0x99, hi: 0x99}, - {value: 0x0018, lo: 0x9a, hi: 0x9f}, - {value: 0x0040, lo: 0xa0, hi: 0xa0}, - {value: 0x0008, lo: 0xa1, hi: 0xbf}, - // Block 0x6, offset 0x34 - {value: 0x0000, lo: 0x0a}, - {value: 0x0008, lo: 0x80, hi: 0x86}, - {value: 0x0401, lo: 0x87, hi: 0x87}, - {value: 0x0040, lo: 0x88, hi: 0x88}, - {value: 0x0018, lo: 0x89, hi: 0x8a}, - {value: 0x0040, lo: 0x8b, hi: 0x8c}, - {value: 0x0018, lo: 0x8d, hi: 0x8f}, - {value: 0x0040, lo: 0x90, hi: 0x90}, - {value: 0x1308, lo: 0x91, hi: 0xbd}, - {value: 0x0018, lo: 0xbe, hi: 0xbe}, - {value: 0x1308, lo: 0xbf, hi: 0xbf}, - // Block 0x7, offset 0x3f - {value: 0x0000, lo: 0x0b}, - {value: 0x0018, lo: 0x80, hi: 0x80}, - {value: 0x1308, lo: 0x81, hi: 0x82}, - {value: 0x0018, lo: 0x83, hi: 0x83}, - {value: 0x1308, lo: 0x84, hi: 0x85}, - {value: 0x0018, lo: 0x86, hi: 0x86}, - {value: 0x1308, lo: 0x87, hi: 0x87}, - {value: 0x0040, lo: 0x88, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0xaa}, - {value: 0x0040, lo: 0xab, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xb4}, - {value: 0x0040, lo: 0xb5, hi: 0xbf}, - // Block 0x8, offset 0x4b - {value: 0x0000, lo: 0x10}, - {value: 0x0018, lo: 0x80, hi: 0x80}, - {value: 0x0208, lo: 0x81, hi: 0x87}, - {value: 0x0408, lo: 0x88, hi: 0x88}, - {value: 0x0208, lo: 0x89, hi: 0x8a}, - {value: 0x1308, lo: 0x8b, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xa9}, - {value: 0x0018, lo: 0xaa, hi: 0xad}, - {value: 0x0208, lo: 0xae, hi: 0xaf}, - {value: 0x1308, lo: 0xb0, hi: 0xb0}, - {value: 0x0408, lo: 0xb1, hi: 0xb3}, - {value: 0x0008, lo: 0xb4, hi: 0xb4}, - {value: 0x0429, lo: 0xb5, hi: 0xb5}, - {value: 0x0451, lo: 0xb6, hi: 0xb6}, - {value: 0x0479, lo: 0xb7, hi: 0xb7}, - {value: 0x04a1, lo: 0xb8, hi: 0xb8}, - {value: 0x0208, lo: 0xb9, hi: 0xbf}, - // Block 0x9, offset 0x5c - {value: 0x0000, lo: 0x03}, - {value: 0x0208, lo: 0x80, hi: 0x87}, - {value: 0x0408, lo: 0x88, hi: 0x99}, - {value: 0x0208, lo: 0x9a, hi: 0xbf}, - // Block 0xa, offset 0x60 - {value: 0x0000, lo: 0x0e}, - {value: 0x1308, lo: 0x80, hi: 0x8a}, - {value: 0x0040, lo: 0x8b, hi: 0x8c}, - {value: 0x0408, lo: 0x8d, hi: 0x8d}, - {value: 0x0208, lo: 0x8e, hi: 0x98}, - {value: 0x0408, lo: 0x99, hi: 0x9b}, - {value: 0x0208, lo: 0x9c, hi: 0xaa}, - {value: 0x0408, lo: 0xab, hi: 0xac}, - {value: 0x0208, lo: 0xad, hi: 0xb0}, - {value: 0x0408, lo: 0xb1, hi: 0xb1}, - {value: 0x0208, lo: 0xb2, hi: 0xb2}, - {value: 0x0408, lo: 0xb3, hi: 0xb4}, - {value: 0x0208, lo: 0xb5, hi: 0xb7}, - {value: 0x0408, lo: 0xb8, hi: 0xb9}, - {value: 0x0208, lo: 0xba, hi: 0xbf}, - // Block 0xb, offset 0x6f - {value: 0x0000, lo: 0x04}, - {value: 0x0008, lo: 0x80, hi: 0xa5}, - {value: 0x1308, lo: 0xa6, hi: 0xb0}, - {value: 0x0008, lo: 0xb1, hi: 0xb1}, - {value: 0x0040, lo: 0xb2, hi: 0xbf}, - // Block 0xc, offset 0x74 - {value: 0x0000, lo: 0x06}, - {value: 0x0008, lo: 0x80, hi: 0x89}, - {value: 0x0208, lo: 0x8a, hi: 0xaa}, - {value: 0x1308, lo: 0xab, hi: 0xb3}, - {value: 0x0008, lo: 0xb4, hi: 0xb5}, - {value: 0x0018, lo: 0xb6, hi: 0xba}, - {value: 0x0040, lo: 0xbb, hi: 0xbf}, - // Block 0xd, offset 0x7b - {value: 0x0000, lo: 0x0b}, - {value: 0x0008, lo: 0x80, hi: 0x95}, - {value: 0x1308, lo: 0x96, hi: 0x99}, - {value: 0x0008, lo: 0x9a, hi: 0x9a}, - {value: 0x1308, lo: 0x9b, hi: 0xa3}, - {value: 0x0008, lo: 0xa4, hi: 0xa4}, - {value: 0x1308, lo: 0xa5, hi: 0xa7}, - {value: 0x0008, lo: 0xa8, hi: 0xa8}, - {value: 0x1308, lo: 0xa9, hi: 0xad}, - {value: 0x0040, lo: 0xae, hi: 0xaf}, - {value: 0x0018, lo: 0xb0, hi: 0xbe}, - {value: 0x0040, lo: 0xbf, hi: 0xbf}, - // Block 0xe, offset 0x87 - {value: 0x0000, lo: 0x0d}, - {value: 0x0408, lo: 0x80, hi: 0x80}, - {value: 0x0208, lo: 0x81, hi: 0x85}, - {value: 0x0408, lo: 0x86, hi: 0x87}, - {value: 0x0208, lo: 0x88, hi: 0x88}, - {value: 0x0408, lo: 0x89, hi: 0x89}, - {value: 0x0208, lo: 0x8a, hi: 0x93}, - {value: 0x0408, lo: 0x94, hi: 0x94}, - {value: 0x0208, lo: 0x95, hi: 0x95}, - {value: 0x0008, lo: 0x96, hi: 0x98}, - {value: 0x1308, lo: 0x99, hi: 0x9b}, - {value: 0x0040, lo: 0x9c, hi: 0x9d}, - {value: 0x0018, lo: 0x9e, hi: 0x9e}, - {value: 0x0040, lo: 0x9f, hi: 0xbf}, - // Block 0xf, offset 0x95 - {value: 0x0000, lo: 0x0d}, - {value: 0x0040, lo: 0x80, hi: 0x9f}, - {value: 0x0208, lo: 0xa0, hi: 0xa9}, - {value: 0x0408, lo: 0xaa, hi: 0xac}, - {value: 0x0008, lo: 0xad, hi: 0xad}, - {value: 0x0408, lo: 0xae, hi: 0xae}, - {value: 0x0208, lo: 0xaf, hi: 0xb0}, - {value: 0x0408, lo: 0xb1, hi: 0xb2}, - {value: 0x0208, lo: 0xb3, hi: 0xb4}, - {value: 0x0040, lo: 0xb5, hi: 0xb5}, - {value: 0x0208, lo: 0xb6, hi: 0xb8}, - {value: 0x0408, lo: 0xb9, hi: 0xb9}, - {value: 0x0208, lo: 0xba, hi: 0xbd}, - {value: 0x0040, lo: 0xbe, hi: 0xbf}, - // Block 0x10, offset 0xa3 - {value: 0x0000, lo: 0x04}, - {value: 0x0040, lo: 0x80, hi: 0x93}, - {value: 0x1308, lo: 0x94, hi: 0xa1}, - {value: 0x0040, lo: 0xa2, hi: 0xa2}, - {value: 0x1308, lo: 0xa3, hi: 0xbf}, - // Block 0x11, offset 0xa8 - {value: 0x0000, lo: 0x08}, - {value: 0x1308, lo: 0x80, hi: 0x82}, - {value: 0x1008, lo: 0x83, hi: 0x83}, - {value: 0x0008, lo: 0x84, hi: 0xb9}, - {value: 0x1308, lo: 0xba, hi: 0xba}, - {value: 0x1008, lo: 0xbb, hi: 0xbb}, - {value: 0x1308, lo: 0xbc, hi: 0xbc}, - {value: 0x0008, lo: 0xbd, hi: 0xbd}, - {value: 0x1008, lo: 0xbe, hi: 0xbf}, - // Block 0x12, offset 0xb1 - {value: 0x0000, lo: 0x0f}, - {value: 0x1308, lo: 0x80, hi: 0x80}, - {value: 0x1008, lo: 0x81, hi: 0x82}, - {value: 0x0040, lo: 0x83, hi: 0x85}, - {value: 0x1008, lo: 0x86, hi: 0x88}, - {value: 0x0040, lo: 0x89, hi: 0x89}, - {value: 0x1008, lo: 0x8a, hi: 0x8c}, - {value: 0x1b08, lo: 0x8d, hi: 0x8d}, - {value: 0x0040, lo: 0x8e, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x90}, - {value: 0x0040, lo: 0x91, hi: 0x96}, - {value: 0x1008, lo: 0x97, hi: 0x97}, - {value: 0x0040, lo: 0x98, hi: 0xa5}, - {value: 0x0008, lo: 0xa6, hi: 0xaf}, - {value: 0x0018, lo: 0xb0, hi: 0xba}, - {value: 0x0040, lo: 0xbb, hi: 0xbf}, - // Block 0x13, offset 0xc1 - {value: 0x0000, lo: 0x0d}, - {value: 0x1308, lo: 0x80, hi: 0x80}, - {value: 0x1008, lo: 0x81, hi: 0x83}, - {value: 0x0040, lo: 0x84, hi: 0x84}, - {value: 0x0008, lo: 0x85, hi: 0x8c}, - {value: 0x0040, lo: 0x8d, hi: 0x8d}, - {value: 0x0008, lo: 0x8e, hi: 0x90}, - {value: 0x0040, lo: 0x91, hi: 0x91}, - {value: 0x0008, lo: 0x92, hi: 0xa8}, - {value: 0x0040, lo: 0xa9, hi: 0xa9}, - {value: 0x0008, lo: 0xaa, hi: 0xb9}, - {value: 0x0040, lo: 0xba, hi: 0xbc}, - {value: 0x0008, lo: 0xbd, hi: 0xbd}, - {value: 0x1308, lo: 0xbe, hi: 0xbf}, - // Block 0x14, offset 0xcf - {value: 0x0000, lo: 0x0c}, - {value: 0x0040, lo: 0x80, hi: 0x80}, - {value: 0x1308, lo: 0x81, hi: 0x81}, - {value: 0x1008, lo: 0x82, hi: 0x83}, - {value: 0x0040, lo: 0x84, hi: 0x84}, - {value: 0x0008, lo: 0x85, hi: 0x8c}, - {value: 0x0040, lo: 0x8d, hi: 0x8d}, - {value: 0x0008, lo: 0x8e, hi: 0x90}, - {value: 0x0040, lo: 0x91, hi: 0x91}, - {value: 0x0008, lo: 0x92, hi: 0xba}, - {value: 0x0040, lo: 0xbb, hi: 0xbc}, - {value: 0x0008, lo: 0xbd, hi: 0xbd}, - {value: 0x1008, lo: 0xbe, hi: 0xbf}, - // Block 0x15, offset 0xdc - {value: 0x0000, lo: 0x0b}, - {value: 0x0040, lo: 0x80, hi: 0x81}, - {value: 0x1008, lo: 0x82, hi: 0x83}, - {value: 0x0040, lo: 0x84, hi: 0x84}, - {value: 0x0008, lo: 0x85, hi: 0x96}, - {value: 0x0040, lo: 0x97, hi: 0x99}, - {value: 0x0008, lo: 0x9a, hi: 0xb1}, - {value: 0x0040, lo: 0xb2, hi: 0xb2}, - {value: 0x0008, lo: 0xb3, hi: 0xbb}, - {value: 0x0040, lo: 0xbc, hi: 0xbc}, - {value: 0x0008, lo: 0xbd, hi: 0xbd}, - {value: 0x0040, lo: 0xbe, hi: 0xbf}, - // Block 0x16, offset 0xe8 - {value: 0x0000, lo: 0x10}, - {value: 0x0008, lo: 0x80, hi: 0x86}, - {value: 0x0040, lo: 0x87, hi: 0x89}, - {value: 0x1b08, lo: 0x8a, hi: 0x8a}, - {value: 0x0040, lo: 0x8b, hi: 0x8e}, - {value: 0x1008, lo: 0x8f, hi: 0x91}, - {value: 0x1308, lo: 0x92, hi: 0x94}, - {value: 0x0040, lo: 0x95, hi: 0x95}, - {value: 0x1308, lo: 0x96, hi: 0x96}, - {value: 0x0040, lo: 0x97, hi: 0x97}, - {value: 0x1008, lo: 0x98, hi: 0x9f}, - {value: 0x0040, lo: 0xa0, hi: 0xa5}, - {value: 0x0008, lo: 0xa6, hi: 0xaf}, - {value: 0x0040, lo: 0xb0, hi: 0xb1}, - {value: 0x1008, lo: 0xb2, hi: 0xb3}, - {value: 0x0018, lo: 0xb4, hi: 0xb4}, - {value: 0x0040, lo: 0xb5, hi: 0xbf}, - // Block 0x17, offset 0xf9 - {value: 0x0000, lo: 0x09}, - {value: 0x0040, lo: 0x80, hi: 0x80}, - {value: 0x0008, lo: 0x81, hi: 0xb0}, - {value: 0x1308, lo: 0xb1, hi: 0xb1}, - {value: 0x0008, lo: 0xb2, hi: 0xb2}, - {value: 0x08f1, lo: 0xb3, hi: 0xb3}, - {value: 0x1308, lo: 0xb4, hi: 0xb9}, - {value: 0x1b08, lo: 0xba, hi: 0xba}, - {value: 0x0040, lo: 0xbb, hi: 0xbe}, - {value: 0x0018, lo: 0xbf, hi: 0xbf}, - // Block 0x18, offset 0x103 - {value: 0x0000, lo: 0x06}, - {value: 0x0008, lo: 0x80, hi: 0x86}, - {value: 0x1308, lo: 0x87, hi: 0x8e}, - {value: 0x0018, lo: 0x8f, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x99}, - {value: 0x0018, lo: 0x9a, hi: 0x9b}, - {value: 0x0040, lo: 0x9c, hi: 0xbf}, - // Block 0x19, offset 0x10a - {value: 0x0000, lo: 0x0c}, - {value: 0x0008, lo: 0x80, hi: 0x84}, - {value: 0x0040, lo: 0x85, hi: 0x85}, - {value: 0x0008, lo: 0x86, hi: 0x86}, - {value: 0x0040, lo: 0x87, hi: 0x87}, - {value: 0x1308, lo: 0x88, hi: 0x8d}, - {value: 0x0040, lo: 0x8e, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x99}, - {value: 0x0040, lo: 0x9a, hi: 0x9b}, - {value: 0x0961, lo: 0x9c, hi: 0x9c}, - {value: 0x0999, lo: 0x9d, hi: 0x9d}, - {value: 0x0008, lo: 0x9e, hi: 0x9f}, - {value: 0x0040, lo: 0xa0, hi: 0xbf}, - // Block 0x1a, offset 0x117 - {value: 0x0000, lo: 0x10}, - {value: 0x0008, lo: 0x80, hi: 0x80}, - {value: 0x0018, lo: 0x81, hi: 0x8a}, - {value: 0x0008, lo: 0x8b, hi: 0x8b}, - {value: 0xe03d, lo: 0x8c, hi: 0x8c}, - {value: 0x0018, lo: 0x8d, hi: 0x97}, - {value: 0x1308, lo: 0x98, hi: 0x99}, - {value: 0x0018, lo: 0x9a, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xa9}, - {value: 0x0018, lo: 0xaa, hi: 0xb4}, - {value: 0x1308, lo: 0xb5, hi: 0xb5}, - {value: 0x0018, lo: 0xb6, hi: 0xb6}, - {value: 0x1308, lo: 0xb7, hi: 0xb7}, - {value: 0x0018, lo: 0xb8, hi: 0xb8}, - {value: 0x1308, lo: 0xb9, hi: 0xb9}, - {value: 0x0018, lo: 0xba, hi: 0xbd}, - {value: 0x1008, lo: 0xbe, hi: 0xbf}, - // Block 0x1b, offset 0x128 - {value: 0x0000, lo: 0x06}, - {value: 0x0018, lo: 0x80, hi: 0x85}, - {value: 0x1308, lo: 0x86, hi: 0x86}, - {value: 0x0018, lo: 0x87, hi: 0x8c}, - {value: 0x0040, lo: 0x8d, hi: 0x8d}, - {value: 0x0018, lo: 0x8e, hi: 0x9a}, - {value: 0x0040, lo: 0x9b, hi: 0xbf}, - // Block 0x1c, offset 0x12f - {value: 0x0000, lo: 0x0a}, - {value: 0x0008, lo: 0x80, hi: 0xaa}, - {value: 0x1008, lo: 0xab, hi: 0xac}, - {value: 0x1308, lo: 0xad, hi: 0xb0}, - {value: 0x1008, lo: 0xb1, hi: 0xb1}, - {value: 0x1308, lo: 0xb2, hi: 0xb7}, - {value: 0x1008, lo: 0xb8, hi: 0xb8}, - {value: 0x1b08, lo: 0xb9, hi: 0xba}, - {value: 0x1008, lo: 0xbb, hi: 0xbc}, - {value: 0x1308, lo: 0xbd, hi: 0xbe}, - {value: 0x0008, lo: 0xbf, hi: 0xbf}, - // Block 0x1d, offset 0x13a - {value: 0x0000, lo: 0x0e}, - {value: 0x0008, lo: 0x80, hi: 0x89}, - {value: 0x0018, lo: 0x8a, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x95}, - {value: 0x1008, lo: 0x96, hi: 0x97}, - {value: 0x1308, lo: 0x98, hi: 0x99}, - {value: 0x0008, lo: 0x9a, hi: 0x9d}, - {value: 0x1308, lo: 0x9e, hi: 0xa0}, - {value: 0x0008, lo: 0xa1, hi: 0xa1}, - {value: 0x1008, lo: 0xa2, hi: 0xa4}, - {value: 0x0008, lo: 0xa5, hi: 0xa6}, - {value: 0x1008, lo: 0xa7, hi: 0xad}, - {value: 0x0008, lo: 0xae, hi: 0xb0}, - {value: 0x1308, lo: 0xb1, hi: 0xb4}, - {value: 0x0008, lo: 0xb5, hi: 0xbf}, - // Block 0x1e, offset 0x149 - {value: 0x0000, lo: 0x0d}, - {value: 0x0008, lo: 0x80, hi: 0x81}, - {value: 0x1308, lo: 0x82, hi: 0x82}, - {value: 0x1008, lo: 0x83, hi: 0x84}, - {value: 0x1308, lo: 0x85, hi: 0x86}, - {value: 0x1008, lo: 0x87, hi: 0x8c}, - {value: 0x1308, lo: 0x8d, hi: 0x8d}, - {value: 0x0008, lo: 0x8e, hi: 0x8e}, - {value: 0x1008, lo: 0x8f, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x99}, - {value: 0x1008, lo: 0x9a, hi: 0x9c}, - {value: 0x1308, lo: 0x9d, hi: 0x9d}, - {value: 0x0018, lo: 0x9e, hi: 0x9f}, - {value: 0x0040, lo: 0xa0, hi: 0xbf}, - // Block 0x1f, offset 0x157 - {value: 0x0000, lo: 0x09}, - {value: 0x0040, lo: 0x80, hi: 0x86}, - {value: 0x055d, lo: 0x87, hi: 0x87}, - {value: 0x0040, lo: 0x88, hi: 0x8c}, - {value: 0x055d, lo: 0x8d, hi: 0x8d}, - {value: 0x0040, lo: 0x8e, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0xba}, - {value: 0x0018, lo: 0xbb, hi: 0xbb}, - {value: 0xe105, lo: 0xbc, hi: 0xbc}, - {value: 0x0008, lo: 0xbd, hi: 0xbf}, - // Block 0x20, offset 0x161 - {value: 0x0000, lo: 0x01}, - {value: 0x0018, lo: 0x80, hi: 0xbf}, - // Block 0x21, offset 0x163 - {value: 0x0000, lo: 0x03}, - {value: 0x0018, lo: 0x80, hi: 0x9e}, - {value: 0x0040, lo: 0x9f, hi: 0xa0}, - {value: 0x0018, lo: 0xa1, hi: 0xbf}, - // Block 0x22, offset 0x167 - {value: 0x0000, lo: 0x01}, - {value: 0x0008, lo: 0x80, hi: 0xbf}, - // Block 0x23, offset 0x169 - {value: 0x0000, lo: 0x0b}, - {value: 0x0008, lo: 0x80, hi: 0x88}, - {value: 0x0040, lo: 0x89, hi: 0x89}, - {value: 0x0008, lo: 0x8a, hi: 0x8d}, - {value: 0x0040, lo: 0x8e, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x96}, - {value: 0x0040, lo: 0x97, hi: 0x97}, - {value: 0x0008, lo: 0x98, hi: 0x98}, - {value: 0x0040, lo: 0x99, hi: 0x99}, - {value: 0x0008, lo: 0x9a, hi: 0x9d}, - {value: 0x0040, lo: 0x9e, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xbf}, - // Block 0x24, offset 0x175 - {value: 0x0000, lo: 0x0a}, - {value: 0x0008, lo: 0x80, hi: 0x88}, - {value: 0x0040, lo: 0x89, hi: 0x89}, - {value: 0x0008, lo: 0x8a, hi: 0x8d}, - {value: 0x0040, lo: 0x8e, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0xb0}, - {value: 0x0040, lo: 0xb1, hi: 0xb1}, - {value: 0x0008, lo: 0xb2, hi: 0xb5}, - {value: 0x0040, lo: 0xb6, hi: 0xb7}, - {value: 0x0008, lo: 0xb8, hi: 0xbe}, - {value: 0x0040, lo: 0xbf, hi: 0xbf}, - // Block 0x25, offset 0x180 - {value: 0x0000, lo: 0x07}, - {value: 0x0008, lo: 0x80, hi: 0x80}, - {value: 0x0040, lo: 0x81, hi: 0x81}, - {value: 0x0008, lo: 0x82, hi: 0x85}, - {value: 0x0040, lo: 0x86, hi: 0x87}, - {value: 0x0008, lo: 0x88, hi: 0x96}, - {value: 0x0040, lo: 0x97, hi: 0x97}, - {value: 0x0008, lo: 0x98, hi: 0xbf}, - // Block 0x26, offset 0x188 - {value: 0x0000, lo: 0x05}, - {value: 0x0008, lo: 0x80, hi: 0x90}, - {value: 0x0040, lo: 0x91, hi: 0x91}, - {value: 0x0008, lo: 0x92, hi: 0x95}, - {value: 0x0040, lo: 0x96, hi: 0x97}, - {value: 0x0008, lo: 0x98, hi: 0xbf}, - // Block 0x27, offset 0x18e - {value: 0x0000, lo: 0x05}, - {value: 0x0008, lo: 0x80, hi: 0x9a}, - {value: 0x0040, lo: 0x9b, hi: 0x9c}, - {value: 0x1308, lo: 0x9d, hi: 0x9f}, - {value: 0x0018, lo: 0xa0, hi: 0xbc}, - {value: 0x0040, lo: 0xbd, hi: 0xbf}, - // Block 0x28, offset 0x194 - {value: 0x0000, lo: 0x04}, - {value: 0x0008, lo: 0x80, hi: 0x8f}, - {value: 0x0018, lo: 0x90, hi: 0x99}, - {value: 0x0040, lo: 0x9a, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xbf}, - // Block 0x29, offset 0x199 - {value: 0x0000, lo: 0x04}, - {value: 0x0008, lo: 0x80, hi: 0xb5}, - {value: 0x0040, lo: 0xb6, hi: 0xb7}, - {value: 0xe045, lo: 0xb8, hi: 0xbd}, - {value: 0x0040, lo: 0xbe, hi: 0xbf}, - // Block 0x2a, offset 0x19e - {value: 0x0000, lo: 0x02}, - {value: 0x0018, lo: 0x80, hi: 0x80}, - {value: 0x0008, lo: 0x81, hi: 0xbf}, - // Block 0x2b, offset 0x1a1 - {value: 0x0000, lo: 0x03}, - {value: 0x0008, lo: 0x80, hi: 0xac}, - {value: 0x0018, lo: 0xad, hi: 0xae}, - {value: 0x0008, lo: 0xaf, hi: 0xbf}, - // Block 0x2c, offset 0x1a5 - {value: 0x0000, lo: 0x05}, - {value: 0x0040, lo: 0x80, hi: 0x80}, - {value: 0x0008, lo: 0x81, hi: 0x9a}, - {value: 0x0018, lo: 0x9b, hi: 0x9c}, - {value: 0x0040, lo: 0x9d, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xbf}, - // Block 0x2d, offset 0x1ab - {value: 0x0000, lo: 0x04}, - {value: 0x0008, lo: 0x80, hi: 0xaa}, - {value: 0x0018, lo: 0xab, hi: 0xb0}, - {value: 0x0008, lo: 0xb1, hi: 0xb8}, - {value: 0x0040, lo: 0xb9, hi: 0xbf}, - // Block 0x2e, offset 0x1b0 - {value: 0x0000, lo: 0x0b}, - {value: 0x0008, lo: 0x80, hi: 0x8c}, - {value: 0x0040, lo: 0x8d, hi: 0x8d}, - {value: 0x0008, lo: 0x8e, hi: 0x91}, - {value: 0x1308, lo: 0x92, hi: 0x93}, - {value: 0x1b08, lo: 0x94, hi: 0x94}, - {value: 0x0040, lo: 0x95, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xb1}, - {value: 0x1308, lo: 0xb2, hi: 0xb3}, - {value: 0x1b08, lo: 0xb4, hi: 0xb4}, - {value: 0x0018, lo: 0xb5, hi: 0xb6}, - {value: 0x0040, lo: 0xb7, hi: 0xbf}, - // Block 0x2f, offset 0x1bc - {value: 0x0000, lo: 0x09}, - {value: 0x0008, lo: 0x80, hi: 0x91}, - {value: 0x1308, lo: 0x92, hi: 0x93}, - {value: 0x0040, lo: 0x94, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xac}, - {value: 0x0040, lo: 0xad, hi: 0xad}, - {value: 0x0008, lo: 0xae, hi: 0xb0}, - {value: 0x0040, lo: 0xb1, hi: 0xb1}, - {value: 0x1308, lo: 0xb2, hi: 0xb3}, - {value: 0x0040, lo: 0xb4, hi: 0xbf}, - // Block 0x30, offset 0x1c6 - {value: 0x0000, lo: 0x05}, - {value: 0x0008, lo: 0x80, hi: 0xb3}, - {value: 0x1340, lo: 0xb4, hi: 0xb5}, - {value: 0x1008, lo: 0xb6, hi: 0xb6}, - {value: 0x1308, lo: 0xb7, hi: 0xbd}, - {value: 0x1008, lo: 0xbe, hi: 0xbf}, - // Block 0x31, offset 0x1cc - {value: 0x0000, lo: 0x10}, - {value: 0x1008, lo: 0x80, hi: 0x85}, - {value: 0x1308, lo: 0x86, hi: 0x86}, - {value: 0x1008, lo: 0x87, hi: 0x88}, - {value: 0x1308, lo: 0x89, hi: 0x91}, - {value: 0x1b08, lo: 0x92, hi: 0x92}, - {value: 0x1308, lo: 0x93, hi: 0x93}, - {value: 0x0018, lo: 0x94, hi: 0x96}, - {value: 0x0008, lo: 0x97, hi: 0x97}, - {value: 0x0018, lo: 0x98, hi: 0x9b}, - {value: 0x0008, lo: 0x9c, hi: 0x9c}, - {value: 0x1308, lo: 0x9d, hi: 0x9d}, - {value: 0x0040, lo: 0x9e, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xa9}, - {value: 0x0040, lo: 0xaa, hi: 0xaf}, - {value: 0x0018, lo: 0xb0, hi: 0xb9}, - {value: 0x0040, lo: 0xba, hi: 0xbf}, - // Block 0x32, offset 0x1dd - {value: 0x0000, lo: 0x09}, - {value: 0x0018, lo: 0x80, hi: 0x85}, - {value: 0x0040, lo: 0x86, hi: 0x86}, - {value: 0x0218, lo: 0x87, hi: 0x87}, - {value: 0x0018, lo: 0x88, hi: 0x8a}, - {value: 0x13c0, lo: 0x8b, hi: 0x8d}, - {value: 0x0040, lo: 0x8e, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x99}, - {value: 0x0040, lo: 0x9a, hi: 0x9f}, - {value: 0x0208, lo: 0xa0, hi: 0xbf}, - // Block 0x33, offset 0x1e7 - {value: 0x0000, lo: 0x02}, - {value: 0x0208, lo: 0x80, hi: 0xb7}, - {value: 0x0040, lo: 0xb8, hi: 0xbf}, - // Block 0x34, offset 0x1ea - {value: 0x0000, lo: 0x07}, - {value: 0x0008, lo: 0x80, hi: 0x84}, - {value: 0x1308, lo: 0x85, hi: 0x86}, - {value: 0x0208, lo: 0x87, hi: 0xa8}, - {value: 0x1308, lo: 0xa9, hi: 0xa9}, - {value: 0x0208, lo: 0xaa, hi: 0xaa}, - {value: 0x0040, lo: 0xab, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xbf}, - // Block 0x35, offset 0x1f2 - {value: 0x0000, lo: 0x02}, - {value: 0x0008, lo: 0x80, hi: 0xb5}, - {value: 0x0040, lo: 0xb6, hi: 0xbf}, - // Block 0x36, offset 0x1f5 - {value: 0x0000, lo: 0x0c}, - {value: 0x0008, lo: 0x80, hi: 0x9e}, - {value: 0x0040, lo: 0x9f, hi: 0x9f}, - {value: 0x1308, lo: 0xa0, hi: 0xa2}, - {value: 0x1008, lo: 0xa3, hi: 0xa6}, - {value: 0x1308, lo: 0xa7, hi: 0xa8}, - {value: 0x1008, lo: 0xa9, hi: 0xab}, - {value: 0x0040, lo: 0xac, hi: 0xaf}, - {value: 0x1008, lo: 0xb0, hi: 0xb1}, - {value: 0x1308, lo: 0xb2, hi: 0xb2}, - {value: 0x1008, lo: 0xb3, hi: 0xb8}, - {value: 0x1308, lo: 0xb9, hi: 0xbb}, - {value: 0x0040, lo: 0xbc, hi: 0xbf}, - // Block 0x37, offset 0x202 - {value: 0x0000, lo: 0x07}, - {value: 0x0018, lo: 0x80, hi: 0x80}, - {value: 0x0040, lo: 0x81, hi: 0x83}, - {value: 0x0018, lo: 0x84, hi: 0x85}, - {value: 0x0008, lo: 0x86, hi: 0xad}, - {value: 0x0040, lo: 0xae, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xb4}, - {value: 0x0040, lo: 0xb5, hi: 0xbf}, - // Block 0x38, offset 0x20a - {value: 0x0000, lo: 0x03}, - {value: 0x0008, lo: 0x80, hi: 0xab}, - {value: 0x0040, lo: 0xac, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xbf}, - // Block 0x39, offset 0x20e - {value: 0x0000, lo: 0x06}, - {value: 0x0008, lo: 0x80, hi: 0x89}, - {value: 0x0040, lo: 0x8a, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x99}, - {value: 0x0028, lo: 0x9a, hi: 0x9a}, - {value: 0x0040, lo: 0x9b, hi: 0x9d}, - {value: 0x0018, lo: 0x9e, hi: 0xbf}, - // Block 0x3a, offset 0x215 - {value: 0x0000, lo: 0x07}, - {value: 0x0008, lo: 0x80, hi: 0x96}, - {value: 0x1308, lo: 0x97, hi: 0x98}, - {value: 0x1008, lo: 0x99, hi: 0x9a}, - {value: 0x1308, lo: 0x9b, hi: 0x9b}, - {value: 0x0040, lo: 0x9c, hi: 0x9d}, - {value: 0x0018, lo: 0x9e, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xbf}, - // Block 0x3b, offset 0x21d - {value: 0x0000, lo: 0x0f}, - {value: 0x0008, lo: 0x80, hi: 0x94}, - {value: 0x1008, lo: 0x95, hi: 0x95}, - {value: 0x1308, lo: 0x96, hi: 0x96}, - {value: 0x1008, lo: 0x97, hi: 0x97}, - {value: 0x1308, lo: 0x98, hi: 0x9e}, - {value: 0x0040, lo: 0x9f, hi: 0x9f}, - {value: 0x1b08, lo: 0xa0, hi: 0xa0}, - {value: 0x1008, lo: 0xa1, hi: 0xa1}, - {value: 0x1308, lo: 0xa2, hi: 0xa2}, - {value: 0x1008, lo: 0xa3, hi: 0xa4}, - {value: 0x1308, lo: 0xa5, hi: 0xac}, - {value: 0x1008, lo: 0xad, hi: 0xb2}, - {value: 0x1308, lo: 0xb3, hi: 0xbc}, - {value: 0x0040, lo: 0xbd, hi: 0xbe}, - {value: 0x1308, lo: 0xbf, hi: 0xbf}, - // Block 0x3c, offset 0x22d - {value: 0x0000, lo: 0x0b}, - {value: 0x0008, lo: 0x80, hi: 0x89}, - {value: 0x0040, lo: 0x8a, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x99}, - {value: 0x0040, lo: 0x9a, hi: 0x9f}, - {value: 0x0018, lo: 0xa0, hi: 0xa6}, - {value: 0x0008, lo: 0xa7, hi: 0xa7}, - {value: 0x0018, lo: 0xa8, hi: 0xad}, - {value: 0x0040, lo: 0xae, hi: 0xaf}, - {value: 0x1308, lo: 0xb0, hi: 0xbd}, - {value: 0x1318, lo: 0xbe, hi: 0xbe}, - {value: 0x0040, lo: 0xbf, hi: 0xbf}, - // Block 0x3d, offset 0x239 - {value: 0x0000, lo: 0x01}, - {value: 0x0040, lo: 0x80, hi: 0xbf}, - // Block 0x3e, offset 0x23b - {value: 0x0000, lo: 0x09}, - {value: 0x1308, lo: 0x80, hi: 0x83}, - {value: 0x1008, lo: 0x84, hi: 0x84}, - {value: 0x0008, lo: 0x85, hi: 0xb3}, - {value: 0x1308, lo: 0xb4, hi: 0xb4}, - {value: 0x1008, lo: 0xb5, hi: 0xb5}, - {value: 0x1308, lo: 0xb6, hi: 0xba}, - {value: 0x1008, lo: 0xbb, hi: 0xbb}, - {value: 0x1308, lo: 0xbc, hi: 0xbc}, - {value: 0x1008, lo: 0xbd, hi: 0xbf}, - // Block 0x3f, offset 0x245 - {value: 0x0000, lo: 0x0b}, - {value: 0x1008, lo: 0x80, hi: 0x81}, - {value: 0x1308, lo: 0x82, hi: 0x82}, - {value: 0x1008, lo: 0x83, hi: 0x83}, - {value: 0x1808, lo: 0x84, hi: 0x84}, - {value: 0x0008, lo: 0x85, hi: 0x8b}, - {value: 0x0040, lo: 0x8c, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x99}, - {value: 0x0018, lo: 0x9a, hi: 0xaa}, - {value: 0x1308, lo: 0xab, hi: 0xb3}, - {value: 0x0018, lo: 0xb4, hi: 0xbc}, - {value: 0x0040, lo: 0xbd, hi: 0xbf}, - // Block 0x40, offset 0x251 - {value: 0x0000, lo: 0x0b}, - {value: 0x1308, lo: 0x80, hi: 0x81}, - {value: 0x1008, lo: 0x82, hi: 0x82}, - {value: 0x0008, lo: 0x83, hi: 0xa0}, - {value: 0x1008, lo: 0xa1, hi: 0xa1}, - {value: 0x1308, lo: 0xa2, hi: 0xa5}, - {value: 0x1008, lo: 0xa6, hi: 0xa7}, - {value: 0x1308, lo: 0xa8, hi: 0xa9}, - {value: 0x1808, lo: 0xaa, hi: 0xaa}, - {value: 0x1b08, lo: 0xab, hi: 0xab}, - {value: 0x1308, lo: 0xac, hi: 0xad}, - {value: 0x0008, lo: 0xae, hi: 0xbf}, - // Block 0x41, offset 0x25d - {value: 0x0000, lo: 0x0b}, - {value: 0x0008, lo: 0x80, hi: 0xa5}, - {value: 0x1308, lo: 0xa6, hi: 0xa6}, - {value: 0x1008, lo: 0xa7, hi: 0xa7}, - {value: 0x1308, lo: 0xa8, hi: 0xa9}, - {value: 0x1008, lo: 0xaa, hi: 0xac}, - {value: 0x1308, lo: 0xad, hi: 0xad}, - {value: 0x1008, lo: 0xae, hi: 0xae}, - {value: 0x1308, lo: 0xaf, hi: 0xb1}, - {value: 0x1808, lo: 0xb2, hi: 0xb3}, - {value: 0x0040, lo: 0xb4, hi: 0xbb}, - {value: 0x0018, lo: 0xbc, hi: 0xbf}, - // Block 0x42, offset 0x269 - {value: 0x0000, lo: 0x07}, - {value: 0x0008, lo: 0x80, hi: 0xa3}, - {value: 0x1008, lo: 0xa4, hi: 0xab}, - {value: 0x1308, lo: 0xac, hi: 0xb3}, - {value: 0x1008, lo: 0xb4, hi: 0xb5}, - {value: 0x1308, lo: 0xb6, hi: 0xb7}, - {value: 0x0040, lo: 0xb8, hi: 0xba}, - {value: 0x0018, lo: 0xbb, hi: 0xbf}, - // Block 0x43, offset 0x271 - {value: 0x0000, lo: 0x04}, - {value: 0x0008, lo: 0x80, hi: 0x89}, - {value: 0x0040, lo: 0x8a, hi: 0x8c}, - {value: 0x0008, lo: 0x8d, hi: 0xbd}, - {value: 0x0018, lo: 0xbe, hi: 0xbf}, - // Block 0x44, offset 0x276 - {value: 0x0000, lo: 0x09}, - {value: 0x0e29, lo: 0x80, hi: 0x80}, - {value: 0x0e41, lo: 0x81, hi: 0x81}, - {value: 0x0e59, lo: 0x82, hi: 0x82}, - {value: 0x0e71, lo: 0x83, hi: 0x83}, - {value: 0x0e89, lo: 0x84, hi: 0x85}, - {value: 0x0ea1, lo: 0x86, hi: 0x86}, - {value: 0x0eb9, lo: 0x87, hi: 0x87}, - {value: 0x057d, lo: 0x88, hi: 0x88}, - {value: 0x0040, lo: 0x89, hi: 0xbf}, - // Block 0x45, offset 0x280 - {value: 0x0000, lo: 0x10}, - {value: 0x0018, lo: 0x80, hi: 0x87}, - {value: 0x0040, lo: 0x88, hi: 0x8f}, - {value: 0x1308, lo: 0x90, hi: 0x92}, - {value: 0x0018, lo: 0x93, hi: 0x93}, - {value: 0x1308, lo: 0x94, hi: 0xa0}, - {value: 0x1008, lo: 0xa1, hi: 0xa1}, - {value: 0x1308, lo: 0xa2, hi: 0xa8}, - {value: 0x0008, lo: 0xa9, hi: 0xac}, - {value: 0x1308, lo: 0xad, hi: 0xad}, - {value: 0x0008, lo: 0xae, hi: 0xb1}, - {value: 0x1008, lo: 0xb2, hi: 0xb3}, - {value: 0x1308, lo: 0xb4, hi: 0xb4}, - {value: 0x0008, lo: 0xb5, hi: 0xb6}, - {value: 0x0040, lo: 0xb7, hi: 0xb7}, - {value: 0x1308, lo: 0xb8, hi: 0xb9}, - {value: 0x0040, lo: 0xba, hi: 0xbf}, - // Block 0x46, offset 0x291 - {value: 0x0000, lo: 0x03}, - {value: 0x1308, lo: 0x80, hi: 0xb5}, - {value: 0x0040, lo: 0xb6, hi: 0xba}, - {value: 0x1308, lo: 0xbb, hi: 0xbf}, - // Block 0x47, offset 0x295 - {value: 0x0000, lo: 0x0a}, - {value: 0x0008, lo: 0x80, hi: 0x87}, - {value: 0xe045, lo: 0x88, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x95}, - {value: 0x0040, lo: 0x96, hi: 0x97}, - {value: 0xe045, lo: 0x98, hi: 0x9d}, - {value: 0x0040, lo: 0x9e, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xa7}, - {value: 0xe045, lo: 0xa8, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xb7}, - {value: 0xe045, lo: 0xb8, hi: 0xbf}, - // Block 0x48, offset 0x2a0 - {value: 0x0000, lo: 0x03}, - {value: 0x0040, lo: 0x80, hi: 0x8f}, - {value: 0x1318, lo: 0x90, hi: 0xb0}, - {value: 0x0040, lo: 0xb1, hi: 0xbf}, - // Block 0x49, offset 0x2a4 - {value: 0x0000, lo: 0x08}, - {value: 0x0018, lo: 0x80, hi: 0x82}, - {value: 0x0040, lo: 0x83, hi: 0x83}, - {value: 0x0008, lo: 0x84, hi: 0x84}, - {value: 0x0018, lo: 0x85, hi: 0x88}, - {value: 0x24c1, lo: 0x89, hi: 0x89}, - {value: 0x0018, lo: 0x8a, hi: 0x8b}, - {value: 0x0040, lo: 0x8c, hi: 0x8f}, - {value: 0x0018, lo: 0x90, hi: 0xbf}, - // Block 0x4a, offset 0x2ad - {value: 0x0000, lo: 0x07}, - {value: 0x0018, lo: 0x80, hi: 0xab}, - {value: 0x24f1, lo: 0xac, hi: 0xac}, - {value: 0x2529, lo: 0xad, hi: 0xad}, - {value: 0x0018, lo: 0xae, hi: 0xae}, - {value: 0x2579, lo: 0xaf, hi: 0xaf}, - {value: 0x25b1, lo: 0xb0, hi: 0xb0}, - {value: 0x0018, lo: 0xb1, hi: 0xbf}, - // Block 0x4b, offset 0x2b5 - {value: 0x0000, lo: 0x05}, - {value: 0x0018, lo: 0x80, hi: 0x9f}, - {value: 0x0080, lo: 0xa0, hi: 0xa0}, - {value: 0x0018, lo: 0xa1, hi: 0xad}, - {value: 0x0080, lo: 0xae, hi: 0xaf}, - {value: 0x0018, lo: 0xb0, hi: 0xbf}, - // Block 0x4c, offset 0x2bb - {value: 0x0000, lo: 0x04}, - {value: 0x0018, lo: 0x80, hi: 0xa8}, - {value: 0x09c5, lo: 0xa9, hi: 0xa9}, - {value: 0x09e5, lo: 0xaa, hi: 0xaa}, - {value: 0x0018, lo: 0xab, hi: 0xbf}, - // Block 0x4d, offset 0x2c0 - {value: 0x0000, lo: 0x02}, - {value: 0x0018, lo: 0x80, hi: 0xbe}, - {value: 0x0040, lo: 0xbf, hi: 0xbf}, - // Block 0x4e, offset 0x2c3 - {value: 0x0000, lo: 0x02}, - {value: 0x0018, lo: 0x80, hi: 0xa6}, - {value: 0x0040, lo: 0xa7, hi: 0xbf}, - // Block 0x4f, offset 0x2c6 - {value: 0x0000, lo: 0x03}, - {value: 0x0018, lo: 0x80, hi: 0x8b}, - {value: 0x28c1, lo: 0x8c, hi: 0x8c}, - {value: 0x0018, lo: 0x8d, hi: 0xbf}, - // Block 0x50, offset 0x2ca - {value: 0x0000, lo: 0x05}, - {value: 0x0018, lo: 0x80, hi: 0xb3}, - {value: 0x0e66, lo: 0xb4, hi: 0xb4}, - {value: 0x292a, lo: 0xb5, hi: 0xb5}, - {value: 0x0e86, lo: 0xb6, hi: 0xb6}, - {value: 0x0018, lo: 0xb7, hi: 0xbf}, - // Block 0x51, offset 0x2d0 - {value: 0x0000, lo: 0x03}, - {value: 0x0018, lo: 0x80, hi: 0x9b}, - {value: 0x2941, lo: 0x9c, hi: 0x9c}, - {value: 0x0018, lo: 0x9d, hi: 0xbf}, - // Block 0x52, offset 0x2d4 - {value: 0x0000, lo: 0x03}, - {value: 0x0018, lo: 0x80, hi: 0xb3}, - {value: 0x0040, lo: 0xb4, hi: 0xb5}, - {value: 0x0018, lo: 0xb6, hi: 0xbf}, - // Block 0x53, offset 0x2d8 - {value: 0x0000, lo: 0x05}, - {value: 0x0018, lo: 0x80, hi: 0x95}, - {value: 0x0040, lo: 0x96, hi: 0x97}, - {value: 0x0018, lo: 0x98, hi: 0xb9}, - {value: 0x0040, lo: 0xba, hi: 0xbc}, - {value: 0x0018, lo: 0xbd, hi: 0xbf}, - // Block 0x54, offset 0x2de - {value: 0x0000, lo: 0x06}, - {value: 0x0018, lo: 0x80, hi: 0x88}, - {value: 0x0040, lo: 0x89, hi: 0x89}, - {value: 0x0018, lo: 0x8a, hi: 0x91}, - {value: 0x0040, lo: 0x92, hi: 0xab}, - {value: 0x0018, lo: 0xac, hi: 0xaf}, - {value: 0x0040, lo: 0xb0, hi: 0xbf}, - // Block 0x55, offset 0x2e5 - {value: 0x0000, lo: 0x05}, - {value: 0xe185, lo: 0x80, hi: 0x8f}, - {value: 0x03f5, lo: 0x90, hi: 0x9f}, - {value: 0x0ea5, lo: 0xa0, hi: 0xae}, - {value: 0x0040, lo: 0xaf, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xbf}, - // Block 0x56, offset 0x2eb - {value: 0x0000, lo: 0x07}, - {value: 0x0008, lo: 0x80, hi: 0xa5}, - {value: 0x0040, lo: 0xa6, hi: 0xa6}, - {value: 0x0008, lo: 0xa7, hi: 0xa7}, - {value: 0x0040, lo: 0xa8, hi: 0xac}, - {value: 0x0008, lo: 0xad, hi: 0xad}, - {value: 0x0040, lo: 0xae, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xbf}, - // Block 0x57, offset 0x2f3 - {value: 0x0000, lo: 0x06}, - {value: 0x0008, lo: 0x80, hi: 0xa7}, - {value: 0x0040, lo: 0xa8, hi: 0xae}, - {value: 0xe075, lo: 0xaf, hi: 0xaf}, - {value: 0x0018, lo: 0xb0, hi: 0xb0}, - {value: 0x0040, lo: 0xb1, hi: 0xbe}, - {value: 0x1b08, lo: 0xbf, hi: 0xbf}, - // Block 0x58, offset 0x2fa - {value: 0x0000, lo: 0x0a}, - {value: 0x0008, lo: 0x80, hi: 0x96}, - {value: 0x0040, lo: 0x97, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xa6}, - {value: 0x0040, lo: 0xa7, hi: 0xa7}, - {value: 0x0008, lo: 0xa8, hi: 0xae}, - {value: 0x0040, lo: 0xaf, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xb6}, - {value: 0x0040, lo: 0xb7, hi: 0xb7}, - {value: 0x0008, lo: 0xb8, hi: 0xbe}, - {value: 0x0040, lo: 0xbf, hi: 0xbf}, - // Block 0x59, offset 0x305 - {value: 0x0000, lo: 0x09}, - {value: 0x0008, lo: 0x80, hi: 0x86}, - {value: 0x0040, lo: 0x87, hi: 0x87}, - {value: 0x0008, lo: 0x88, hi: 0x8e}, - {value: 0x0040, lo: 0x8f, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x96}, - {value: 0x0040, lo: 0x97, hi: 0x97}, - {value: 0x0008, lo: 0x98, hi: 0x9e}, - {value: 0x0040, lo: 0x9f, hi: 0x9f}, - {value: 0x1308, lo: 0xa0, hi: 0xbf}, - // Block 0x5a, offset 0x30f - {value: 0x0000, lo: 0x03}, - {value: 0x0018, lo: 0x80, hi: 0xae}, - {value: 0x0008, lo: 0xaf, hi: 0xaf}, - {value: 0x0018, lo: 0xb0, hi: 0xbf}, - // Block 0x5b, offset 0x313 - {value: 0x0000, lo: 0x02}, - {value: 0x0018, lo: 0x80, hi: 0x84}, - {value: 0x0040, lo: 0x85, hi: 0xbf}, - // Block 0x5c, offset 0x316 - {value: 0x0000, lo: 0x05}, - {value: 0x0018, lo: 0x80, hi: 0x99}, - {value: 0x0040, lo: 0x9a, hi: 0x9a}, - {value: 0x0018, lo: 0x9b, hi: 0x9e}, - {value: 0x0edd, lo: 0x9f, hi: 0x9f}, - {value: 0x0018, lo: 0xa0, hi: 0xbf}, - // Block 0x5d, offset 0x31c - {value: 0x0000, lo: 0x03}, - {value: 0x0018, lo: 0x80, hi: 0xb2}, - {value: 0x0efd, lo: 0xb3, hi: 0xb3}, - {value: 0x0040, lo: 0xb4, hi: 0xbf}, - // Block 0x5e, offset 0x320 - {value: 0x0020, lo: 0x01}, - {value: 0x0f1d, lo: 0x80, hi: 0xbf}, - // Block 0x5f, offset 0x322 - {value: 0x0020, lo: 0x02}, - {value: 0x171d, lo: 0x80, hi: 0x8f}, - {value: 0x18fd, lo: 0x90, hi: 0xbf}, - // Block 0x60, offset 0x325 - {value: 0x0020, lo: 0x01}, - {value: 0x1efd, lo: 0x80, hi: 0xbf}, - // Block 0x61, offset 0x327 - {value: 0x0000, lo: 0x02}, - {value: 0x0040, lo: 0x80, hi: 0x80}, - {value: 0x0008, lo: 0x81, hi: 0xbf}, - // Block 0x62, offset 0x32a - {value: 0x0000, lo: 0x09}, - {value: 0x0008, lo: 0x80, hi: 0x96}, - {value: 0x0040, lo: 0x97, hi: 0x98}, - {value: 0x1308, lo: 0x99, hi: 0x9a}, - {value: 0x29e2, lo: 0x9b, hi: 0x9b}, - {value: 0x2a0a, lo: 0x9c, hi: 0x9c}, - {value: 0x0008, lo: 0x9d, hi: 0x9e}, - {value: 0x2a31, lo: 0x9f, hi: 0x9f}, - {value: 0x0018, lo: 0xa0, hi: 0xa0}, - {value: 0x0008, lo: 0xa1, hi: 0xbf}, - // Block 0x63, offset 0x334 - {value: 0x0000, lo: 0x02}, - {value: 0x0008, lo: 0x80, hi: 0xbe}, - {value: 0x2a69, lo: 0xbf, hi: 0xbf}, - // Block 0x64, offset 0x337 - {value: 0x0000, lo: 0x0e}, - {value: 0x0040, lo: 0x80, hi: 0x84}, - {value: 0x0008, lo: 0x85, hi: 0xad}, - {value: 0x0040, lo: 0xae, hi: 0xb0}, - {value: 0x2a1d, lo: 0xb1, hi: 0xb1}, - {value: 0x2a3d, lo: 0xb2, hi: 0xb2}, - {value: 0x2a5d, lo: 0xb3, hi: 0xb3}, - {value: 0x2a7d, lo: 0xb4, hi: 0xb4}, - {value: 0x2a5d, lo: 0xb5, hi: 0xb5}, - {value: 0x2a9d, lo: 0xb6, hi: 0xb6}, - {value: 0x2abd, lo: 0xb7, hi: 0xb7}, - {value: 0x2add, lo: 0xb8, hi: 0xb9}, - {value: 0x2afd, lo: 0xba, hi: 0xbb}, - {value: 0x2b1d, lo: 0xbc, hi: 0xbd}, - {value: 0x2afd, lo: 0xbe, hi: 0xbf}, - // Block 0x65, offset 0x346 - {value: 0x0000, lo: 0x03}, - {value: 0x0018, lo: 0x80, hi: 0xa3}, - {value: 0x0040, lo: 0xa4, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xbf}, - // Block 0x66, offset 0x34a - {value: 0x0030, lo: 0x04}, - {value: 0x2aa2, lo: 0x80, hi: 0x9d}, - {value: 0x305a, lo: 0x9e, hi: 0x9e}, - {value: 0x0040, lo: 0x9f, hi: 0x9f}, - {value: 0x30a2, lo: 0xa0, hi: 0xbf}, - // Block 0x67, offset 0x34f - {value: 0x0000, lo: 0x02}, - {value: 0x0008, lo: 0x80, hi: 0x95}, - {value: 0x0040, lo: 0x96, hi: 0xbf}, - // Block 0x68, offset 0x352 - {value: 0x0000, lo: 0x03}, - {value: 0x0008, lo: 0x80, hi: 0x8c}, - {value: 0x0040, lo: 0x8d, hi: 0x8f}, - {value: 0x0018, lo: 0x90, hi: 0xbf}, - // Block 0x69, offset 0x356 - {value: 0x0000, lo: 0x04}, - {value: 0x0018, lo: 0x80, hi: 0x86}, - {value: 0x0040, lo: 0x87, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0xbd}, - {value: 0x0018, lo: 0xbe, hi: 0xbf}, - // Block 0x6a, offset 0x35b - {value: 0x0000, lo: 0x04}, - {value: 0x0008, lo: 0x80, hi: 0x8c}, - {value: 0x0018, lo: 0x8d, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0xab}, - {value: 0x0040, lo: 0xac, hi: 0xbf}, - // Block 0x6b, offset 0x360 - {value: 0x0000, lo: 0x05}, - {value: 0x0008, lo: 0x80, hi: 0xa5}, - {value: 0x0018, lo: 0xa6, hi: 0xaf}, - {value: 0x1308, lo: 0xb0, hi: 0xb1}, - {value: 0x0018, lo: 0xb2, hi: 0xb7}, - {value: 0x0040, lo: 0xb8, hi: 0xbf}, - // Block 0x6c, offset 0x366 - {value: 0x0000, lo: 0x05}, - {value: 0x0040, lo: 0x80, hi: 0xb6}, - {value: 0x0008, lo: 0xb7, hi: 0xb7}, - {value: 0x2009, lo: 0xb8, hi: 0xb8}, - {value: 0x6e89, lo: 0xb9, hi: 0xb9}, - {value: 0x0008, lo: 0xba, hi: 0xbf}, - // Block 0x6d, offset 0x36c - {value: 0x0000, lo: 0x0e}, - {value: 0x0008, lo: 0x80, hi: 0x81}, - {value: 0x1308, lo: 0x82, hi: 0x82}, - {value: 0x0008, lo: 0x83, hi: 0x85}, - {value: 0x1b08, lo: 0x86, hi: 0x86}, - {value: 0x0008, lo: 0x87, hi: 0x8a}, - {value: 0x1308, lo: 0x8b, hi: 0x8b}, - {value: 0x0008, lo: 0x8c, hi: 0xa2}, - {value: 0x1008, lo: 0xa3, hi: 0xa4}, - {value: 0x1308, lo: 0xa5, hi: 0xa6}, - {value: 0x1008, lo: 0xa7, hi: 0xa7}, - {value: 0x0018, lo: 0xa8, hi: 0xab}, - {value: 0x0040, lo: 0xac, hi: 0xaf}, - {value: 0x0018, lo: 0xb0, hi: 0xb9}, - {value: 0x0040, lo: 0xba, hi: 0xbf}, - // Block 0x6e, offset 0x37b - {value: 0x0000, lo: 0x05}, - {value: 0x0208, lo: 0x80, hi: 0xb1}, - {value: 0x0108, lo: 0xb2, hi: 0xb2}, - {value: 0x0008, lo: 0xb3, hi: 0xb3}, - {value: 0x0018, lo: 0xb4, hi: 0xb7}, - {value: 0x0040, lo: 0xb8, hi: 0xbf}, - // Block 0x6f, offset 0x381 - {value: 0x0000, lo: 0x03}, - {value: 0x1008, lo: 0x80, hi: 0x81}, - {value: 0x0008, lo: 0x82, hi: 0xb3}, - {value: 0x1008, lo: 0xb4, hi: 0xbf}, - // Block 0x70, offset 0x385 - {value: 0x0000, lo: 0x0e}, - {value: 0x1008, lo: 0x80, hi: 0x83}, - {value: 0x1b08, lo: 0x84, hi: 0x84}, - {value: 0x1308, lo: 0x85, hi: 0x85}, - {value: 0x0040, lo: 0x86, hi: 0x8d}, - {value: 0x0018, lo: 0x8e, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x99}, - {value: 0x0040, lo: 0x9a, hi: 0x9f}, - {value: 0x1308, lo: 0xa0, hi: 0xb1}, - {value: 0x0008, lo: 0xb2, hi: 0xb7}, - {value: 0x0018, lo: 0xb8, hi: 0xba}, - {value: 0x0008, lo: 0xbb, hi: 0xbb}, - {value: 0x0018, lo: 0xbc, hi: 0xbc}, - {value: 0x0008, lo: 0xbd, hi: 0xbd}, - {value: 0x0040, lo: 0xbe, hi: 0xbf}, - // Block 0x71, offset 0x394 - {value: 0x0000, lo: 0x04}, - {value: 0x0008, lo: 0x80, hi: 0xa5}, - {value: 0x1308, lo: 0xa6, hi: 0xad}, - {value: 0x0018, lo: 0xae, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xbf}, - // Block 0x72, offset 0x399 - {value: 0x0000, lo: 0x07}, - {value: 0x0008, lo: 0x80, hi: 0x86}, - {value: 0x1308, lo: 0x87, hi: 0x91}, - {value: 0x1008, lo: 0x92, hi: 0x92}, - {value: 0x1808, lo: 0x93, hi: 0x93}, - {value: 0x0040, lo: 0x94, hi: 0x9e}, - {value: 0x0018, lo: 0x9f, hi: 0xbc}, - {value: 0x0040, lo: 0xbd, hi: 0xbf}, - // Block 0x73, offset 0x3a1 - {value: 0x0000, lo: 0x09}, - {value: 0x1308, lo: 0x80, hi: 0x82}, - {value: 0x1008, lo: 0x83, hi: 0x83}, - {value: 0x0008, lo: 0x84, hi: 0xb2}, - {value: 0x1308, lo: 0xb3, hi: 0xb3}, - {value: 0x1008, lo: 0xb4, hi: 0xb5}, - {value: 0x1308, lo: 0xb6, hi: 0xb9}, - {value: 0x1008, lo: 0xba, hi: 0xbb}, - {value: 0x1308, lo: 0xbc, hi: 0xbc}, - {value: 0x1008, lo: 0xbd, hi: 0xbf}, - // Block 0x74, offset 0x3ab - {value: 0x0000, lo: 0x0a}, - {value: 0x1808, lo: 0x80, hi: 0x80}, - {value: 0x0018, lo: 0x81, hi: 0x8d}, - {value: 0x0040, lo: 0x8e, hi: 0x8e}, - {value: 0x0008, lo: 0x8f, hi: 0x99}, - {value: 0x0040, lo: 0x9a, hi: 0x9d}, - {value: 0x0018, lo: 0x9e, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xa4}, - {value: 0x1308, lo: 0xa5, hi: 0xa5}, - {value: 0x0008, lo: 0xa6, hi: 0xbe}, - {value: 0x0040, lo: 0xbf, hi: 0xbf}, - // Block 0x75, offset 0x3b6 - {value: 0x0000, lo: 0x07}, - {value: 0x0008, lo: 0x80, hi: 0xa8}, - {value: 0x1308, lo: 0xa9, hi: 0xae}, - {value: 0x1008, lo: 0xaf, hi: 0xb0}, - {value: 0x1308, lo: 0xb1, hi: 0xb2}, - {value: 0x1008, lo: 0xb3, hi: 0xb4}, - {value: 0x1308, lo: 0xb5, hi: 0xb6}, - {value: 0x0040, lo: 0xb7, hi: 0xbf}, - // Block 0x76, offset 0x3be - {value: 0x0000, lo: 0x10}, - {value: 0x0008, lo: 0x80, hi: 0x82}, - {value: 0x1308, lo: 0x83, hi: 0x83}, - {value: 0x0008, lo: 0x84, hi: 0x8b}, - {value: 0x1308, lo: 0x8c, hi: 0x8c}, - {value: 0x1008, lo: 0x8d, hi: 0x8d}, - {value: 0x0040, lo: 0x8e, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x99}, - {value: 0x0040, lo: 0x9a, hi: 0x9b}, - {value: 0x0018, lo: 0x9c, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xb6}, - {value: 0x0018, lo: 0xb7, hi: 0xb9}, - {value: 0x0008, lo: 0xba, hi: 0xba}, - {value: 0x1008, lo: 0xbb, hi: 0xbb}, - {value: 0x1308, lo: 0xbc, hi: 0xbc}, - {value: 0x1008, lo: 0xbd, hi: 0xbd}, - {value: 0x0008, lo: 0xbe, hi: 0xbf}, - // Block 0x77, offset 0x3cf - {value: 0x0000, lo: 0x08}, - {value: 0x0008, lo: 0x80, hi: 0xaf}, - {value: 0x1308, lo: 0xb0, hi: 0xb0}, - {value: 0x0008, lo: 0xb1, hi: 0xb1}, - {value: 0x1308, lo: 0xb2, hi: 0xb4}, - {value: 0x0008, lo: 0xb5, hi: 0xb6}, - {value: 0x1308, lo: 0xb7, hi: 0xb8}, - {value: 0x0008, lo: 0xb9, hi: 0xbd}, - {value: 0x1308, lo: 0xbe, hi: 0xbf}, - // Block 0x78, offset 0x3d8 - {value: 0x0000, lo: 0x0f}, - {value: 0x0008, lo: 0x80, hi: 0x80}, - {value: 0x1308, lo: 0x81, hi: 0x81}, - {value: 0x0008, lo: 0x82, hi: 0x82}, - {value: 0x0040, lo: 0x83, hi: 0x9a}, - {value: 0x0008, lo: 0x9b, hi: 0x9d}, - {value: 0x0018, lo: 0x9e, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xaa}, - {value: 0x1008, lo: 0xab, hi: 0xab}, - {value: 0x1308, lo: 0xac, hi: 0xad}, - {value: 0x1008, lo: 0xae, hi: 0xaf}, - {value: 0x0018, lo: 0xb0, hi: 0xb1}, - {value: 0x0008, lo: 0xb2, hi: 0xb4}, - {value: 0x1008, lo: 0xb5, hi: 0xb5}, - {value: 0x1b08, lo: 0xb6, hi: 0xb6}, - {value: 0x0040, lo: 0xb7, hi: 0xbf}, - // Block 0x79, offset 0x3e8 - {value: 0x0000, lo: 0x0c}, - {value: 0x0040, lo: 0x80, hi: 0x80}, - {value: 0x0008, lo: 0x81, hi: 0x86}, - {value: 0x0040, lo: 0x87, hi: 0x88}, - {value: 0x0008, lo: 0x89, hi: 0x8e}, - {value: 0x0040, lo: 0x8f, hi: 0x90}, - {value: 0x0008, lo: 0x91, hi: 0x96}, - {value: 0x0040, lo: 0x97, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xa6}, - {value: 0x0040, lo: 0xa7, hi: 0xa7}, - {value: 0x0008, lo: 0xa8, hi: 0xae}, - {value: 0x0040, lo: 0xaf, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xbf}, - // Block 0x7a, offset 0x3f5 - {value: 0x0000, lo: 0x09}, - {value: 0x0008, lo: 0x80, hi: 0x9a}, - {value: 0x0018, lo: 0x9b, hi: 0x9b}, - {value: 0x4465, lo: 0x9c, hi: 0x9c}, - {value: 0x447d, lo: 0x9d, hi: 0x9d}, - {value: 0x2971, lo: 0x9e, hi: 0x9e}, - {value: 0xe06d, lo: 0x9f, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xa5}, - {value: 0x0040, lo: 0xa6, hi: 0xaf}, - {value: 0x4495, lo: 0xb0, hi: 0xbf}, - // Block 0x7b, offset 0x3ff - {value: 0x0000, lo: 0x04}, - {value: 0x44b5, lo: 0x80, hi: 0x8f}, - {value: 0x44d5, lo: 0x90, hi: 0x9f}, - {value: 0x44f5, lo: 0xa0, hi: 0xaf}, - {value: 0x44d5, lo: 0xb0, hi: 0xbf}, - // Block 0x7c, offset 0x404 - {value: 0x0000, lo: 0x0c}, - {value: 0x0008, lo: 0x80, hi: 0xa2}, - {value: 0x1008, lo: 0xa3, hi: 0xa4}, - {value: 0x1308, lo: 0xa5, hi: 0xa5}, - {value: 0x1008, lo: 0xa6, hi: 0xa7}, - {value: 0x1308, lo: 0xa8, hi: 0xa8}, - {value: 0x1008, lo: 0xa9, hi: 0xaa}, - {value: 0x0018, lo: 0xab, hi: 0xab}, - {value: 0x1008, lo: 0xac, hi: 0xac}, - {value: 0x1b08, lo: 0xad, hi: 0xad}, - {value: 0x0040, lo: 0xae, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xb9}, - {value: 0x0040, lo: 0xba, hi: 0xbf}, - // Block 0x7d, offset 0x411 - {value: 0x0000, lo: 0x03}, - {value: 0x0008, lo: 0x80, hi: 0xa3}, - {value: 0x0040, lo: 0xa4, hi: 0xaf}, - {value: 0x0018, lo: 0xb0, hi: 0xbf}, - // Block 0x7e, offset 0x415 - {value: 0x0000, lo: 0x04}, - {value: 0x0018, lo: 0x80, hi: 0x86}, - {value: 0x0040, lo: 0x87, hi: 0x8a}, - {value: 0x0018, lo: 0x8b, hi: 0xbb}, - {value: 0x0040, lo: 0xbc, hi: 0xbf}, - // Block 0x7f, offset 0x41a - {value: 0x0020, lo: 0x01}, - {value: 0x4515, lo: 0x80, hi: 0xbf}, - // Block 0x80, offset 0x41c - {value: 0x0020, lo: 0x03}, - {value: 0x4d15, lo: 0x80, hi: 0x94}, - {value: 0x4ad5, lo: 0x95, hi: 0x95}, - {value: 0x4fb5, lo: 0x96, hi: 0xbf}, - // Block 0x81, offset 0x420 - {value: 0x0020, lo: 0x01}, - {value: 0x54f5, lo: 0x80, hi: 0xbf}, - // Block 0x82, offset 0x422 - {value: 0x0020, lo: 0x03}, - {value: 0x5cf5, lo: 0x80, hi: 0x84}, - {value: 0x5655, lo: 0x85, hi: 0x85}, - {value: 0x5d95, lo: 0x86, hi: 0xbf}, - // Block 0x83, offset 0x426 - {value: 0x0020, lo: 0x08}, - {value: 0x6b55, lo: 0x80, hi: 0x8f}, - {value: 0x6d15, lo: 0x90, hi: 0x90}, - {value: 0x6d55, lo: 0x91, hi: 0xab}, - {value: 0x6ea1, lo: 0xac, hi: 0xac}, - {value: 0x70b5, lo: 0xad, hi: 0xad}, - {value: 0x0040, lo: 0xae, hi: 0xae}, - {value: 0x0040, lo: 0xaf, hi: 0xaf}, - {value: 0x70d5, lo: 0xb0, hi: 0xbf}, - // Block 0x84, offset 0x42f - {value: 0x0020, lo: 0x05}, - {value: 0x72d5, lo: 0x80, hi: 0xad}, - {value: 0x6535, lo: 0xae, hi: 0xae}, - {value: 0x7895, lo: 0xaf, hi: 0xb5}, - {value: 0x6f55, lo: 0xb6, hi: 0xb6}, - {value: 0x7975, lo: 0xb7, hi: 0xbf}, - // Block 0x85, offset 0x435 - {value: 0x0028, lo: 0x03}, - {value: 0x7c21, lo: 0x80, hi: 0x82}, - {value: 0x7be1, lo: 0x83, hi: 0x83}, - {value: 0x7c99, lo: 0x84, hi: 0xbf}, - // Block 0x86, offset 0x439 - {value: 0x0038, lo: 0x0f}, - {value: 0x9db1, lo: 0x80, hi: 0x83}, - {value: 0x9e59, lo: 0x84, hi: 0x85}, - {value: 0x9e91, lo: 0x86, hi: 0x87}, - {value: 0x9ec9, lo: 0x88, hi: 0x8f}, - {value: 0x0040, lo: 0x90, hi: 0x90}, - {value: 0x0040, lo: 0x91, hi: 0x91}, - {value: 0xa089, lo: 0x92, hi: 0x97}, - {value: 0xa1a1, lo: 0x98, hi: 0x9c}, - {value: 0xa281, lo: 0x9d, hi: 0xb3}, - {value: 0x9d41, lo: 0xb4, hi: 0xb4}, - {value: 0x9db1, lo: 0xb5, hi: 0xb5}, - {value: 0xa789, lo: 0xb6, hi: 0xbb}, - {value: 0xa869, lo: 0xbc, hi: 0xbc}, - {value: 0xa7f9, lo: 0xbd, hi: 0xbd}, - {value: 0xa8d9, lo: 0xbe, hi: 0xbf}, - // Block 0x87, offset 0x449 - {value: 0x0000, lo: 0x09}, - {value: 0x0008, lo: 0x80, hi: 0x8b}, - {value: 0x0040, lo: 0x8c, hi: 0x8c}, - {value: 0x0008, lo: 0x8d, hi: 0xa6}, - {value: 0x0040, lo: 0xa7, hi: 0xa7}, - {value: 0x0008, lo: 0xa8, hi: 0xba}, - {value: 0x0040, lo: 0xbb, hi: 0xbb}, - {value: 0x0008, lo: 0xbc, hi: 0xbd}, - {value: 0x0040, lo: 0xbe, hi: 0xbe}, - {value: 0x0008, lo: 0xbf, hi: 0xbf}, - // Block 0x88, offset 0x453 - {value: 0x0000, lo: 0x04}, - {value: 0x0008, lo: 0x80, hi: 0x8d}, - {value: 0x0040, lo: 0x8e, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x9d}, - {value: 0x0040, lo: 0x9e, hi: 0xbf}, - // Block 0x89, offset 0x458 - {value: 0x0000, lo: 0x02}, - {value: 0x0008, lo: 0x80, hi: 0xba}, - {value: 0x0040, lo: 0xbb, hi: 0xbf}, - // Block 0x8a, offset 0x45b - {value: 0x0000, lo: 0x05}, - {value: 0x0018, lo: 0x80, hi: 0x82}, - {value: 0x0040, lo: 0x83, hi: 0x86}, - {value: 0x0018, lo: 0x87, hi: 0xb3}, - {value: 0x0040, lo: 0xb4, hi: 0xb6}, - {value: 0x0018, lo: 0xb7, hi: 0xbf}, - // Block 0x8b, offset 0x461 - {value: 0x0000, lo: 0x06}, - {value: 0x0018, lo: 0x80, hi: 0x8e}, - {value: 0x0040, lo: 0x8f, hi: 0x8f}, - {value: 0x0018, lo: 0x90, hi: 0x9b}, - {value: 0x0040, lo: 0x9c, hi: 0x9f}, - {value: 0x0018, lo: 0xa0, hi: 0xa0}, - {value: 0x0040, lo: 0xa1, hi: 0xbf}, - // Block 0x8c, offset 0x468 - {value: 0x0000, lo: 0x04}, - {value: 0x0040, lo: 0x80, hi: 0x8f}, - {value: 0x0018, lo: 0x90, hi: 0xbc}, - {value: 0x1308, lo: 0xbd, hi: 0xbd}, - {value: 0x0040, lo: 0xbe, hi: 0xbf}, - // Block 0x8d, offset 0x46d - {value: 0x0000, lo: 0x03}, - {value: 0x0008, lo: 0x80, hi: 0x9c}, - {value: 0x0040, lo: 0x9d, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xbf}, - // Block 0x8e, offset 0x471 - {value: 0x0000, lo: 0x05}, - {value: 0x0008, lo: 0x80, hi: 0x90}, - {value: 0x0040, lo: 0x91, hi: 0x9f}, - {value: 0x1308, lo: 0xa0, hi: 0xa0}, - {value: 0x0018, lo: 0xa1, hi: 0xbb}, - {value: 0x0040, lo: 0xbc, hi: 0xbf}, - // Block 0x8f, offset 0x477 - {value: 0x0000, lo: 0x04}, - {value: 0x0008, lo: 0x80, hi: 0x9f}, - {value: 0x0018, lo: 0xa0, hi: 0xa3}, - {value: 0x0040, lo: 0xa4, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xbf}, - // Block 0x90, offset 0x47c - {value: 0x0000, lo: 0x08}, - {value: 0x0008, lo: 0x80, hi: 0x80}, - {value: 0x0018, lo: 0x81, hi: 0x81}, - {value: 0x0008, lo: 0x82, hi: 0x89}, - {value: 0x0018, lo: 0x8a, hi: 0x8a}, - {value: 0x0040, lo: 0x8b, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0xb5}, - {value: 0x1308, lo: 0xb6, hi: 0xba}, - {value: 0x0040, lo: 0xbb, hi: 0xbf}, - // Block 0x91, offset 0x485 - {value: 0x0000, lo: 0x04}, - {value: 0x0008, lo: 0x80, hi: 0x9d}, - {value: 0x0040, lo: 0x9e, hi: 0x9e}, - {value: 0x0018, lo: 0x9f, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xbf}, - // Block 0x92, offset 0x48a - {value: 0x0000, lo: 0x05}, - {value: 0x0008, lo: 0x80, hi: 0x83}, - {value: 0x0040, lo: 0x84, hi: 0x87}, - {value: 0x0008, lo: 0x88, hi: 0x8f}, - {value: 0x0018, lo: 0x90, hi: 0x95}, - {value: 0x0040, lo: 0x96, hi: 0xbf}, - // Block 0x93, offset 0x490 - {value: 0x0000, lo: 0x06}, - {value: 0xe145, lo: 0x80, hi: 0x87}, - {value: 0xe1c5, lo: 0x88, hi: 0x8f}, - {value: 0xe145, lo: 0x90, hi: 0x97}, - {value: 0x8ad5, lo: 0x98, hi: 0x9f}, - {value: 0x8aed, lo: 0xa0, hi: 0xa7}, - {value: 0x0008, lo: 0xa8, hi: 0xbf}, - // Block 0x94, offset 0x497 - {value: 0x0000, lo: 0x06}, - {value: 0x0008, lo: 0x80, hi: 0x9d}, - {value: 0x0040, lo: 0x9e, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xa9}, - {value: 0x0040, lo: 0xaa, hi: 0xaf}, - {value: 0x8aed, lo: 0xb0, hi: 0xb7}, - {value: 0x8ad5, lo: 0xb8, hi: 0xbf}, - // Block 0x95, offset 0x49e - {value: 0x0000, lo: 0x06}, - {value: 0xe145, lo: 0x80, hi: 0x87}, - {value: 0xe1c5, lo: 0x88, hi: 0x8f}, - {value: 0xe145, lo: 0x90, hi: 0x93}, - {value: 0x0040, lo: 0x94, hi: 0x97}, - {value: 0x0008, lo: 0x98, hi: 0xbb}, - {value: 0x0040, lo: 0xbc, hi: 0xbf}, - // Block 0x96, offset 0x4a5 - {value: 0x0000, lo: 0x03}, - {value: 0x0008, lo: 0x80, hi: 0xa7}, - {value: 0x0040, lo: 0xa8, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xbf}, - // Block 0x97, offset 0x4a9 - {value: 0x0000, lo: 0x04}, - {value: 0x0008, lo: 0x80, hi: 0xa3}, - {value: 0x0040, lo: 0xa4, hi: 0xae}, - {value: 0x0018, lo: 0xaf, hi: 0xaf}, - {value: 0x0040, lo: 0xb0, hi: 0xbf}, - // Block 0x98, offset 0x4ae - {value: 0x0000, lo: 0x02}, - {value: 0x0008, lo: 0x80, hi: 0xb6}, - {value: 0x0040, lo: 0xb7, hi: 0xbf}, - // Block 0x99, offset 0x4b1 - {value: 0x0000, lo: 0x04}, - {value: 0x0008, lo: 0x80, hi: 0x95}, - {value: 0x0040, lo: 0x96, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xa7}, - {value: 0x0040, lo: 0xa8, hi: 0xbf}, - // Block 0x9a, offset 0x4b6 - {value: 0x0000, lo: 0x0b}, - {value: 0x0008, lo: 0x80, hi: 0x85}, - {value: 0x0040, lo: 0x86, hi: 0x87}, - {value: 0x0008, lo: 0x88, hi: 0x88}, - {value: 0x0040, lo: 0x89, hi: 0x89}, - {value: 0x0008, lo: 0x8a, hi: 0xb5}, - {value: 0x0040, lo: 0xb6, hi: 0xb6}, - {value: 0x0008, lo: 0xb7, hi: 0xb8}, - {value: 0x0040, lo: 0xb9, hi: 0xbb}, - {value: 0x0008, lo: 0xbc, hi: 0xbc}, - {value: 0x0040, lo: 0xbd, hi: 0xbe}, - {value: 0x0008, lo: 0xbf, hi: 0xbf}, - // Block 0x9b, offset 0x4c2 - {value: 0x0000, lo: 0x05}, - {value: 0x0008, lo: 0x80, hi: 0x95}, - {value: 0x0040, lo: 0x96, hi: 0x96}, - {value: 0x0018, lo: 0x97, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xb6}, - {value: 0x0018, lo: 0xb7, hi: 0xbf}, - // Block 0x9c, offset 0x4c8 - {value: 0x0000, lo: 0x04}, - {value: 0x0008, lo: 0x80, hi: 0x9e}, - {value: 0x0040, lo: 0x9f, hi: 0xa6}, - {value: 0x0018, lo: 0xa7, hi: 0xaf}, - {value: 0x0040, lo: 0xb0, hi: 0xbf}, - // Block 0x9d, offset 0x4cd - {value: 0x0000, lo: 0x06}, - {value: 0x0040, lo: 0x80, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xb2}, - {value: 0x0040, lo: 0xb3, hi: 0xb3}, - {value: 0x0008, lo: 0xb4, hi: 0xb5}, - {value: 0x0040, lo: 0xb6, hi: 0xba}, - {value: 0x0018, lo: 0xbb, hi: 0xbf}, - // Block 0x9e, offset 0x4d4 - {value: 0x0000, lo: 0x07}, - {value: 0x0008, lo: 0x80, hi: 0x95}, - {value: 0x0018, lo: 0x96, hi: 0x9b}, - {value: 0x0040, lo: 0x9c, hi: 0x9e}, - {value: 0x0018, lo: 0x9f, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xb9}, - {value: 0x0040, lo: 0xba, hi: 0xbe}, - {value: 0x0018, lo: 0xbf, hi: 0xbf}, - // Block 0x9f, offset 0x4dc - {value: 0x0000, lo: 0x04}, - {value: 0x0008, lo: 0x80, hi: 0xb7}, - {value: 0x0040, lo: 0xb8, hi: 0xbb}, - {value: 0x0018, lo: 0xbc, hi: 0xbd}, - {value: 0x0008, lo: 0xbe, hi: 0xbf}, - // Block 0xa0, offset 0x4e1 - {value: 0x0000, lo: 0x03}, - {value: 0x0018, lo: 0x80, hi: 0x8f}, - {value: 0x0040, lo: 0x90, hi: 0x91}, - {value: 0x0018, lo: 0x92, hi: 0xbf}, - // Block 0xa1, offset 0x4e5 - {value: 0x0000, lo: 0x0f}, - {value: 0x0008, lo: 0x80, hi: 0x80}, - {value: 0x1308, lo: 0x81, hi: 0x83}, - {value: 0x0040, lo: 0x84, hi: 0x84}, - {value: 0x1308, lo: 0x85, hi: 0x86}, - {value: 0x0040, lo: 0x87, hi: 0x8b}, - {value: 0x1308, lo: 0x8c, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x93}, - {value: 0x0040, lo: 0x94, hi: 0x94}, - {value: 0x0008, lo: 0x95, hi: 0x97}, - {value: 0x0040, lo: 0x98, hi: 0x98}, - {value: 0x0008, lo: 0x99, hi: 0xb3}, - {value: 0x0040, lo: 0xb4, hi: 0xb7}, - {value: 0x1308, lo: 0xb8, hi: 0xba}, - {value: 0x0040, lo: 0xbb, hi: 0xbe}, - {value: 0x1b08, lo: 0xbf, hi: 0xbf}, - // Block 0xa2, offset 0x4f5 - {value: 0x0000, lo: 0x06}, - {value: 0x0018, lo: 0x80, hi: 0x87}, - {value: 0x0040, lo: 0x88, hi: 0x8f}, - {value: 0x0018, lo: 0x90, hi: 0x98}, - {value: 0x0040, lo: 0x99, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xbc}, - {value: 0x0018, lo: 0xbd, hi: 0xbf}, - // Block 0xa3, offset 0x4fc - {value: 0x0000, lo: 0x03}, - {value: 0x0008, lo: 0x80, hi: 0x9c}, - {value: 0x0018, lo: 0x9d, hi: 0x9f}, - {value: 0x0040, lo: 0xa0, hi: 0xbf}, - // Block 0xa4, offset 0x500 - {value: 0x0000, lo: 0x03}, - {value: 0x0008, lo: 0x80, hi: 0xb5}, - {value: 0x0040, lo: 0xb6, hi: 0xb8}, - {value: 0x0018, lo: 0xb9, hi: 0xbf}, - // Block 0xa5, offset 0x504 - {value: 0x0000, lo: 0x06}, - {value: 0x0008, lo: 0x80, hi: 0x95}, - {value: 0x0040, lo: 0x96, hi: 0x97}, - {value: 0x0018, lo: 0x98, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xb2}, - {value: 0x0040, lo: 0xb3, hi: 0xb7}, - {value: 0x0018, lo: 0xb8, hi: 0xbf}, - // Block 0xa6, offset 0x50b - {value: 0x0000, lo: 0x02}, - {value: 0x0008, lo: 0x80, hi: 0x88}, - {value: 0x0040, lo: 0x89, hi: 0xbf}, - // Block 0xa7, offset 0x50e - {value: 0x0000, lo: 0x02}, - {value: 0x03dd, lo: 0x80, hi: 0xb2}, - {value: 0x0040, lo: 0xb3, hi: 0xbf}, - // Block 0xa8, offset 0x511 - {value: 0x0000, lo: 0x03}, - {value: 0x0008, lo: 0x80, hi: 0xb2}, - {value: 0x0040, lo: 0xb3, hi: 0xb9}, - {value: 0x0018, lo: 0xba, hi: 0xbf}, - // Block 0xa9, offset 0x515 - {value: 0x0000, lo: 0x03}, - {value: 0x0040, lo: 0x80, hi: 0x9f}, - {value: 0x0018, lo: 0xa0, hi: 0xbe}, - {value: 0x0040, lo: 0xbf, hi: 0xbf}, - // Block 0xaa, offset 0x519 - {value: 0x0000, lo: 0x05}, - {value: 0x1008, lo: 0x80, hi: 0x80}, - {value: 0x1308, lo: 0x81, hi: 0x81}, - {value: 0x1008, lo: 0x82, hi: 0x82}, - {value: 0x0008, lo: 0x83, hi: 0xb7}, - {value: 0x1308, lo: 0xb8, hi: 0xbf}, - // Block 0xab, offset 0x51f - {value: 0x0000, lo: 0x08}, - {value: 0x1308, lo: 0x80, hi: 0x85}, - {value: 0x1b08, lo: 0x86, hi: 0x86}, - {value: 0x0018, lo: 0x87, hi: 0x8d}, - {value: 0x0040, lo: 0x8e, hi: 0x91}, - {value: 0x0018, lo: 0x92, hi: 0xa5}, - {value: 0x0008, lo: 0xa6, hi: 0xaf}, - {value: 0x0040, lo: 0xb0, hi: 0xbe}, - {value: 0x1b08, lo: 0xbf, hi: 0xbf}, - // Block 0xac, offset 0x528 - {value: 0x0000, lo: 0x0b}, - {value: 0x1308, lo: 0x80, hi: 0x81}, - {value: 0x1008, lo: 0x82, hi: 0x82}, - {value: 0x0008, lo: 0x83, hi: 0xaf}, - {value: 0x1008, lo: 0xb0, hi: 0xb2}, - {value: 0x1308, lo: 0xb3, hi: 0xb6}, - {value: 0x1008, lo: 0xb7, hi: 0xb8}, - {value: 0x1b08, lo: 0xb9, hi: 0xb9}, - {value: 0x1308, lo: 0xba, hi: 0xba}, - {value: 0x0018, lo: 0xbb, hi: 0xbc}, - {value: 0x0340, lo: 0xbd, hi: 0xbd}, - {value: 0x0018, lo: 0xbe, hi: 0xbf}, - // Block 0xad, offset 0x534 - {value: 0x0000, lo: 0x06}, - {value: 0x0018, lo: 0x80, hi: 0x81}, - {value: 0x0040, lo: 0x82, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0xa8}, - {value: 0x0040, lo: 0xa9, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xb9}, - {value: 0x0040, lo: 0xba, hi: 0xbf}, - // Block 0xae, offset 0x53b - {value: 0x0000, lo: 0x08}, - {value: 0x1308, lo: 0x80, hi: 0x82}, - {value: 0x0008, lo: 0x83, hi: 0xa6}, - {value: 0x1308, lo: 0xa7, hi: 0xab}, - {value: 0x1008, lo: 0xac, hi: 0xac}, - {value: 0x1308, lo: 0xad, hi: 0xb2}, - {value: 0x1b08, lo: 0xb3, hi: 0xb4}, - {value: 0x0040, lo: 0xb5, hi: 0xb5}, - {value: 0x0008, lo: 0xb6, hi: 0xbf}, - // Block 0xaf, offset 0x544 - {value: 0x0000, lo: 0x07}, - {value: 0x0018, lo: 0x80, hi: 0x83}, - {value: 0x0040, lo: 0x84, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0xb2}, - {value: 0x1308, lo: 0xb3, hi: 0xb3}, - {value: 0x0018, lo: 0xb4, hi: 0xb5}, - {value: 0x0008, lo: 0xb6, hi: 0xb6}, - {value: 0x0040, lo: 0xb7, hi: 0xbf}, - // Block 0xb0, offset 0x54c - {value: 0x0000, lo: 0x06}, - {value: 0x1308, lo: 0x80, hi: 0x81}, - {value: 0x1008, lo: 0x82, hi: 0x82}, - {value: 0x0008, lo: 0x83, hi: 0xb2}, - {value: 0x1008, lo: 0xb3, hi: 0xb5}, - {value: 0x1308, lo: 0xb6, hi: 0xbe}, - {value: 0x1008, lo: 0xbf, hi: 0xbf}, - // Block 0xb1, offset 0x553 - {value: 0x0000, lo: 0x0d}, - {value: 0x1808, lo: 0x80, hi: 0x80}, - {value: 0x0008, lo: 0x81, hi: 0x84}, - {value: 0x0018, lo: 0x85, hi: 0x89}, - {value: 0x1308, lo: 0x8a, hi: 0x8c}, - {value: 0x0018, lo: 0x8d, hi: 0x8d}, - {value: 0x0040, lo: 0x8e, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x9a}, - {value: 0x0018, lo: 0x9b, hi: 0x9b}, - {value: 0x0008, lo: 0x9c, hi: 0x9c}, - {value: 0x0018, lo: 0x9d, hi: 0x9f}, - {value: 0x0040, lo: 0xa0, hi: 0xa0}, - {value: 0x0018, lo: 0xa1, hi: 0xb4}, - {value: 0x0040, lo: 0xb5, hi: 0xbf}, - // Block 0xb2, offset 0x561 - {value: 0x0000, lo: 0x0c}, - {value: 0x0008, lo: 0x80, hi: 0x91}, - {value: 0x0040, lo: 0x92, hi: 0x92}, - {value: 0x0008, lo: 0x93, hi: 0xab}, - {value: 0x1008, lo: 0xac, hi: 0xae}, - {value: 0x1308, lo: 0xaf, hi: 0xb1}, - {value: 0x1008, lo: 0xb2, hi: 0xb3}, - {value: 0x1308, lo: 0xb4, hi: 0xb4}, - {value: 0x1808, lo: 0xb5, hi: 0xb5}, - {value: 0x1308, lo: 0xb6, hi: 0xb7}, - {value: 0x0018, lo: 0xb8, hi: 0xbd}, - {value: 0x1308, lo: 0xbe, hi: 0xbe}, - {value: 0x0040, lo: 0xbf, hi: 0xbf}, - // Block 0xb3, offset 0x56e - {value: 0x0000, lo: 0x0c}, - {value: 0x0008, lo: 0x80, hi: 0x86}, - {value: 0x0040, lo: 0x87, hi: 0x87}, - {value: 0x0008, lo: 0x88, hi: 0x88}, - {value: 0x0040, lo: 0x89, hi: 0x89}, - {value: 0x0008, lo: 0x8a, hi: 0x8d}, - {value: 0x0040, lo: 0x8e, hi: 0x8e}, - {value: 0x0008, lo: 0x8f, hi: 0x9d}, - {value: 0x0040, lo: 0x9e, hi: 0x9e}, - {value: 0x0008, lo: 0x9f, hi: 0xa8}, - {value: 0x0018, lo: 0xa9, hi: 0xa9}, - {value: 0x0040, lo: 0xaa, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xbf}, - // Block 0xb4, offset 0x57b - {value: 0x0000, lo: 0x08}, - {value: 0x0008, lo: 0x80, hi: 0x9e}, - {value: 0x1308, lo: 0x9f, hi: 0x9f}, - {value: 0x1008, lo: 0xa0, hi: 0xa2}, - {value: 0x1308, lo: 0xa3, hi: 0xa9}, - {value: 0x1b08, lo: 0xaa, hi: 0xaa}, - {value: 0x0040, lo: 0xab, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xb9}, - {value: 0x0040, lo: 0xba, hi: 0xbf}, - // Block 0xb5, offset 0x584 - {value: 0x0000, lo: 0x03}, - {value: 0x0008, lo: 0x80, hi: 0xb4}, - {value: 0x1008, lo: 0xb5, hi: 0xb7}, - {value: 0x1308, lo: 0xb8, hi: 0xbf}, - // Block 0xb6, offset 0x588 - {value: 0x0000, lo: 0x0d}, - {value: 0x1008, lo: 0x80, hi: 0x81}, - {value: 0x1b08, lo: 0x82, hi: 0x82}, - {value: 0x1308, lo: 0x83, hi: 0x84}, - {value: 0x1008, lo: 0x85, hi: 0x85}, - {value: 0x1308, lo: 0x86, hi: 0x86}, - {value: 0x0008, lo: 0x87, hi: 0x8a}, - {value: 0x0018, lo: 0x8b, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x99}, - {value: 0x0040, lo: 0x9a, hi: 0x9a}, - {value: 0x0018, lo: 0x9b, hi: 0x9b}, - {value: 0x0040, lo: 0x9c, hi: 0x9c}, - {value: 0x0018, lo: 0x9d, hi: 0x9d}, - {value: 0x0040, lo: 0x9e, hi: 0xbf}, - // Block 0xb7, offset 0x596 - {value: 0x0000, lo: 0x07}, - {value: 0x0008, lo: 0x80, hi: 0xaf}, - {value: 0x1008, lo: 0xb0, hi: 0xb2}, - {value: 0x1308, lo: 0xb3, hi: 0xb8}, - {value: 0x1008, lo: 0xb9, hi: 0xb9}, - {value: 0x1308, lo: 0xba, hi: 0xba}, - {value: 0x1008, lo: 0xbb, hi: 0xbe}, - {value: 0x1308, lo: 0xbf, hi: 0xbf}, - // Block 0xb8, offset 0x59e - {value: 0x0000, lo: 0x0a}, - {value: 0x1308, lo: 0x80, hi: 0x80}, - {value: 0x1008, lo: 0x81, hi: 0x81}, - {value: 0x1b08, lo: 0x82, hi: 0x82}, - {value: 0x1308, lo: 0x83, hi: 0x83}, - {value: 0x0008, lo: 0x84, hi: 0x85}, - {value: 0x0018, lo: 0x86, hi: 0x86}, - {value: 0x0008, lo: 0x87, hi: 0x87}, - {value: 0x0040, lo: 0x88, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x99}, - {value: 0x0040, lo: 0x9a, hi: 0xbf}, - // Block 0xb9, offset 0x5a9 - {value: 0x0000, lo: 0x08}, - {value: 0x0008, lo: 0x80, hi: 0xae}, - {value: 0x1008, lo: 0xaf, hi: 0xb1}, - {value: 0x1308, lo: 0xb2, hi: 0xb5}, - {value: 0x0040, lo: 0xb6, hi: 0xb7}, - {value: 0x1008, lo: 0xb8, hi: 0xbb}, - {value: 0x1308, lo: 0xbc, hi: 0xbd}, - {value: 0x1008, lo: 0xbe, hi: 0xbe}, - {value: 0x1b08, lo: 0xbf, hi: 0xbf}, - // Block 0xba, offset 0x5b2 - {value: 0x0000, lo: 0x05}, - {value: 0x1308, lo: 0x80, hi: 0x80}, - {value: 0x0018, lo: 0x81, hi: 0x97}, - {value: 0x0008, lo: 0x98, hi: 0x9b}, - {value: 0x1308, lo: 0x9c, hi: 0x9d}, - {value: 0x0040, lo: 0x9e, hi: 0xbf}, - // Block 0xbb, offset 0x5b8 - {value: 0x0000, lo: 0x07}, - {value: 0x0008, lo: 0x80, hi: 0xaf}, - {value: 0x1008, lo: 0xb0, hi: 0xb2}, - {value: 0x1308, lo: 0xb3, hi: 0xba}, - {value: 0x1008, lo: 0xbb, hi: 0xbc}, - {value: 0x1308, lo: 0xbd, hi: 0xbd}, - {value: 0x1008, lo: 0xbe, hi: 0xbe}, - {value: 0x1b08, lo: 0xbf, hi: 0xbf}, - // Block 0xbc, offset 0x5c0 - {value: 0x0000, lo: 0x08}, - {value: 0x1308, lo: 0x80, hi: 0x80}, - {value: 0x0018, lo: 0x81, hi: 0x83}, - {value: 0x0008, lo: 0x84, hi: 0x84}, - {value: 0x0040, lo: 0x85, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x99}, - {value: 0x0040, lo: 0x9a, hi: 0x9f}, - {value: 0x0018, lo: 0xa0, hi: 0xac}, - {value: 0x0040, lo: 0xad, hi: 0xbf}, - // Block 0xbd, offset 0x5c9 - {value: 0x0000, lo: 0x09}, - {value: 0x0008, lo: 0x80, hi: 0xaa}, - {value: 0x1308, lo: 0xab, hi: 0xab}, - {value: 0x1008, lo: 0xac, hi: 0xac}, - {value: 0x1308, lo: 0xad, hi: 0xad}, - {value: 0x1008, lo: 0xae, hi: 0xaf}, - {value: 0x1308, lo: 0xb0, hi: 0xb5}, - {value: 0x1808, lo: 0xb6, hi: 0xb6}, - {value: 0x1308, lo: 0xb7, hi: 0xb7}, - {value: 0x0040, lo: 0xb8, hi: 0xbf}, - // Block 0xbe, offset 0x5d3 - {value: 0x0000, lo: 0x02}, - {value: 0x0008, lo: 0x80, hi: 0x89}, - {value: 0x0040, lo: 0x8a, hi: 0xbf}, - // Block 0xbf, offset 0x5d6 - {value: 0x0000, lo: 0x0b}, - {value: 0x0008, lo: 0x80, hi: 0x99}, - {value: 0x0040, lo: 0x9a, hi: 0x9c}, - {value: 0x1308, lo: 0x9d, hi: 0x9f}, - {value: 0x1008, lo: 0xa0, hi: 0xa1}, - {value: 0x1308, lo: 0xa2, hi: 0xa5}, - {value: 0x1008, lo: 0xa6, hi: 0xa6}, - {value: 0x1308, lo: 0xa7, hi: 0xaa}, - {value: 0x1b08, lo: 0xab, hi: 0xab}, - {value: 0x0040, lo: 0xac, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xb9}, - {value: 0x0018, lo: 0xba, hi: 0xbf}, - // Block 0xc0, offset 0x5e2 - {value: 0x0000, lo: 0x02}, - {value: 0x0040, lo: 0x80, hi: 0x9f}, - {value: 0x049d, lo: 0xa0, hi: 0xbf}, - // Block 0xc1, offset 0x5e5 - {value: 0x0000, lo: 0x04}, - {value: 0x0008, lo: 0x80, hi: 0xa9}, - {value: 0x0018, lo: 0xaa, hi: 0xb2}, - {value: 0x0040, lo: 0xb3, hi: 0xbe}, - {value: 0x0008, lo: 0xbf, hi: 0xbf}, - // Block 0xc2, offset 0x5ea - {value: 0x0000, lo: 0x02}, - {value: 0x0008, lo: 0x80, hi: 0xb8}, - {value: 0x0040, lo: 0xb9, hi: 0xbf}, - // Block 0xc3, offset 0x5ed - {value: 0x0000, lo: 0x09}, - {value: 0x0008, lo: 0x80, hi: 0x88}, - {value: 0x0040, lo: 0x89, hi: 0x89}, - {value: 0x0008, lo: 0x8a, hi: 0xae}, - {value: 0x1008, lo: 0xaf, hi: 0xaf}, - {value: 0x1308, lo: 0xb0, hi: 0xb6}, - {value: 0x0040, lo: 0xb7, hi: 0xb7}, - {value: 0x1308, lo: 0xb8, hi: 0xbd}, - {value: 0x1008, lo: 0xbe, hi: 0xbe}, - {value: 0x1b08, lo: 0xbf, hi: 0xbf}, - // Block 0xc4, offset 0x5f7 - {value: 0x0000, lo: 0x08}, - {value: 0x0008, lo: 0x80, hi: 0x80}, - {value: 0x0018, lo: 0x81, hi: 0x85}, - {value: 0x0040, lo: 0x86, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x99}, - {value: 0x0018, lo: 0x9a, hi: 0xac}, - {value: 0x0040, lo: 0xad, hi: 0xaf}, - {value: 0x0018, lo: 0xb0, hi: 0xb1}, - {value: 0x0008, lo: 0xb2, hi: 0xbf}, - // Block 0xc5, offset 0x600 - {value: 0x0000, lo: 0x0b}, - {value: 0x0008, lo: 0x80, hi: 0x8f}, - {value: 0x0040, lo: 0x90, hi: 0x91}, - {value: 0x1308, lo: 0x92, hi: 0xa7}, - {value: 0x0040, lo: 0xa8, hi: 0xa8}, - {value: 0x1008, lo: 0xa9, hi: 0xa9}, - {value: 0x1308, lo: 0xaa, hi: 0xb0}, - {value: 0x1008, lo: 0xb1, hi: 0xb1}, - {value: 0x1308, lo: 0xb2, hi: 0xb3}, - {value: 0x1008, lo: 0xb4, hi: 0xb4}, - {value: 0x1308, lo: 0xb5, hi: 0xb6}, - {value: 0x0040, lo: 0xb7, hi: 0xbf}, - // Block 0xc6, offset 0x60c - {value: 0x0000, lo: 0x02}, - {value: 0x0008, lo: 0x80, hi: 0x99}, - {value: 0x0040, lo: 0x9a, hi: 0xbf}, - // Block 0xc7, offset 0x60f - {value: 0x0000, lo: 0x04}, - {value: 0x0018, lo: 0x80, hi: 0xae}, - {value: 0x0040, lo: 0xaf, hi: 0xaf}, - {value: 0x0018, lo: 0xb0, hi: 0xb4}, - {value: 0x0040, lo: 0xb5, hi: 0xbf}, - // Block 0xc8, offset 0x614 - {value: 0x0000, lo: 0x02}, - {value: 0x0008, lo: 0x80, hi: 0x83}, - {value: 0x0040, lo: 0x84, hi: 0xbf}, - // Block 0xc9, offset 0x617 - {value: 0x0000, lo: 0x02}, - {value: 0x0008, lo: 0x80, hi: 0xae}, - {value: 0x0040, lo: 0xaf, hi: 0xbf}, - // Block 0xca, offset 0x61a - {value: 0x0000, lo: 0x02}, - {value: 0x0008, lo: 0x80, hi: 0x86}, - {value: 0x0040, lo: 0x87, hi: 0xbf}, - // Block 0xcb, offset 0x61d - {value: 0x0000, lo: 0x06}, - {value: 0x0008, lo: 0x80, hi: 0x9e}, - {value: 0x0040, lo: 0x9f, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xa9}, - {value: 0x0040, lo: 0xaa, hi: 0xad}, - {value: 0x0018, lo: 0xae, hi: 0xaf}, - {value: 0x0040, lo: 0xb0, hi: 0xbf}, - // Block 0xcc, offset 0x624 - {value: 0x0000, lo: 0x06}, - {value: 0x0040, lo: 0x80, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0xad}, - {value: 0x0040, lo: 0xae, hi: 0xaf}, - {value: 0x1308, lo: 0xb0, hi: 0xb4}, - {value: 0x0018, lo: 0xb5, hi: 0xb5}, - {value: 0x0040, lo: 0xb6, hi: 0xbf}, - // Block 0xcd, offset 0x62b - {value: 0x0000, lo: 0x03}, - {value: 0x0008, lo: 0x80, hi: 0xaf}, - {value: 0x1308, lo: 0xb0, hi: 0xb6}, - {value: 0x0018, lo: 0xb7, hi: 0xbf}, - // Block 0xce, offset 0x62f - {value: 0x0000, lo: 0x0a}, - {value: 0x0008, lo: 0x80, hi: 0x83}, - {value: 0x0018, lo: 0x84, hi: 0x85}, - {value: 0x0040, lo: 0x86, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x99}, - {value: 0x0040, lo: 0x9a, hi: 0x9a}, - {value: 0x0018, lo: 0x9b, hi: 0xa1}, - {value: 0x0040, lo: 0xa2, hi: 0xa2}, - {value: 0x0008, lo: 0xa3, hi: 0xb7}, - {value: 0x0040, lo: 0xb8, hi: 0xbc}, - {value: 0x0008, lo: 0xbd, hi: 0xbf}, - // Block 0xcf, offset 0x63a - {value: 0x0000, lo: 0x02}, - {value: 0x0008, lo: 0x80, hi: 0x8f}, - {value: 0x0040, lo: 0x90, hi: 0xbf}, - // Block 0xd0, offset 0x63d - {value: 0x0000, lo: 0x05}, - {value: 0x0008, lo: 0x80, hi: 0x84}, - {value: 0x0040, lo: 0x85, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x90}, - {value: 0x1008, lo: 0x91, hi: 0xbe}, - {value: 0x0040, lo: 0xbf, hi: 0xbf}, - // Block 0xd1, offset 0x643 - {value: 0x0000, lo: 0x04}, - {value: 0x0040, lo: 0x80, hi: 0x8e}, - {value: 0x1308, lo: 0x8f, hi: 0x92}, - {value: 0x0008, lo: 0x93, hi: 0x9f}, - {value: 0x0040, lo: 0xa0, hi: 0xbf}, - // Block 0xd2, offset 0x648 - {value: 0x0000, lo: 0x03}, - {value: 0x0040, lo: 0x80, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xa0}, - {value: 0x0040, lo: 0xa1, hi: 0xbf}, - // Block 0xd3, offset 0x64c - {value: 0x0000, lo: 0x02}, - {value: 0x0008, lo: 0x80, hi: 0xac}, - {value: 0x0040, lo: 0xad, hi: 0xbf}, - // Block 0xd4, offset 0x64f - {value: 0x0000, lo: 0x02}, - {value: 0x0008, lo: 0x80, hi: 0xb2}, - {value: 0x0040, lo: 0xb3, hi: 0xbf}, - // Block 0xd5, offset 0x652 - {value: 0x0000, lo: 0x02}, - {value: 0x0008, lo: 0x80, hi: 0x81}, - {value: 0x0040, lo: 0x82, hi: 0xbf}, - // Block 0xd6, offset 0x655 - {value: 0x0000, lo: 0x04}, - {value: 0x0008, lo: 0x80, hi: 0xaa}, - {value: 0x0040, lo: 0xab, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xbc}, - {value: 0x0040, lo: 0xbd, hi: 0xbf}, - // Block 0xd7, offset 0x65a - {value: 0x0000, lo: 0x09}, - {value: 0x0008, lo: 0x80, hi: 0x88}, - {value: 0x0040, lo: 0x89, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x99}, - {value: 0x0040, lo: 0x9a, hi: 0x9b}, - {value: 0x0018, lo: 0x9c, hi: 0x9c}, - {value: 0x1308, lo: 0x9d, hi: 0x9e}, - {value: 0x0018, lo: 0x9f, hi: 0x9f}, - {value: 0x03c0, lo: 0xa0, hi: 0xa3}, - {value: 0x0040, lo: 0xa4, hi: 0xbf}, - // Block 0xd8, offset 0x664 - {value: 0x0000, lo: 0x02}, - {value: 0x0018, lo: 0x80, hi: 0xb5}, - {value: 0x0040, lo: 0xb6, hi: 0xbf}, - // Block 0xd9, offset 0x667 - {value: 0x0000, lo: 0x03}, - {value: 0x0018, lo: 0x80, hi: 0xa6}, - {value: 0x0040, lo: 0xa7, hi: 0xa8}, - {value: 0x0018, lo: 0xa9, hi: 0xbf}, - // Block 0xda, offset 0x66b - {value: 0x0000, lo: 0x0e}, - {value: 0x0018, lo: 0x80, hi: 0x9d}, - {value: 0xb5b9, lo: 0x9e, hi: 0x9e}, - {value: 0xb601, lo: 0x9f, hi: 0x9f}, - {value: 0xb649, lo: 0xa0, hi: 0xa0}, - {value: 0xb6b1, lo: 0xa1, hi: 0xa1}, - {value: 0xb719, lo: 0xa2, hi: 0xa2}, - {value: 0xb781, lo: 0xa3, hi: 0xa3}, - {value: 0xb7e9, lo: 0xa4, hi: 0xa4}, - {value: 0x1018, lo: 0xa5, hi: 0xa6}, - {value: 0x1318, lo: 0xa7, hi: 0xa9}, - {value: 0x0018, lo: 0xaa, hi: 0xac}, - {value: 0x1018, lo: 0xad, hi: 0xb2}, - {value: 0x0340, lo: 0xb3, hi: 0xba}, - {value: 0x1318, lo: 0xbb, hi: 0xbf}, - // Block 0xdb, offset 0x67a - {value: 0x0000, lo: 0x0b}, - {value: 0x1318, lo: 0x80, hi: 0x82}, - {value: 0x0018, lo: 0x83, hi: 0x84}, - {value: 0x1318, lo: 0x85, hi: 0x8b}, - {value: 0x0018, lo: 0x8c, hi: 0xa9}, - {value: 0x1318, lo: 0xaa, hi: 0xad}, - {value: 0x0018, lo: 0xae, hi: 0xba}, - {value: 0xb851, lo: 0xbb, hi: 0xbb}, - {value: 0xb899, lo: 0xbc, hi: 0xbc}, - {value: 0xb8e1, lo: 0xbd, hi: 0xbd}, - {value: 0xb949, lo: 0xbe, hi: 0xbe}, - {value: 0xb9b1, lo: 0xbf, hi: 0xbf}, - // Block 0xdc, offset 0x686 - {value: 0x0000, lo: 0x03}, - {value: 0xba19, lo: 0x80, hi: 0x80}, - {value: 0x0018, lo: 0x81, hi: 0xa8}, - {value: 0x0040, lo: 0xa9, hi: 0xbf}, - // Block 0xdd, offset 0x68a - {value: 0x0000, lo: 0x04}, - {value: 0x0018, lo: 0x80, hi: 0x81}, - {value: 0x1318, lo: 0x82, hi: 0x84}, - {value: 0x0018, lo: 0x85, hi: 0x85}, - {value: 0x0040, lo: 0x86, hi: 0xbf}, - // Block 0xde, offset 0x68f - {value: 0x0000, lo: 0x04}, - {value: 0x0018, lo: 0x80, hi: 0x96}, - {value: 0x0040, lo: 0x97, hi: 0x9f}, - {value: 0x0018, lo: 0xa0, hi: 0xb1}, - {value: 0x0040, lo: 0xb2, hi: 0xbf}, - // Block 0xdf, offset 0x694 - {value: 0x0000, lo: 0x03}, - {value: 0x1308, lo: 0x80, hi: 0xb6}, - {value: 0x0018, lo: 0xb7, hi: 0xba}, - {value: 0x1308, lo: 0xbb, hi: 0xbf}, - // Block 0xe0, offset 0x698 - {value: 0x0000, lo: 0x04}, - {value: 0x1308, lo: 0x80, hi: 0xac}, - {value: 0x0018, lo: 0xad, hi: 0xb4}, - {value: 0x1308, lo: 0xb5, hi: 0xb5}, - {value: 0x0018, lo: 0xb6, hi: 0xbf}, - // Block 0xe1, offset 0x69d - {value: 0x0000, lo: 0x08}, - {value: 0x0018, lo: 0x80, hi: 0x83}, - {value: 0x1308, lo: 0x84, hi: 0x84}, - {value: 0x0018, lo: 0x85, hi: 0x8b}, - {value: 0x0040, lo: 0x8c, hi: 0x9a}, - {value: 0x1308, lo: 0x9b, hi: 0x9f}, - {value: 0x0040, lo: 0xa0, hi: 0xa0}, - {value: 0x1308, lo: 0xa1, hi: 0xaf}, - {value: 0x0040, lo: 0xb0, hi: 0xbf}, - // Block 0xe2, offset 0x6a6 - {value: 0x0000, lo: 0x0a}, - {value: 0x1308, lo: 0x80, hi: 0x86}, - {value: 0x0040, lo: 0x87, hi: 0x87}, - {value: 0x1308, lo: 0x88, hi: 0x98}, - {value: 0x0040, lo: 0x99, hi: 0x9a}, - {value: 0x1308, lo: 0x9b, hi: 0xa1}, - {value: 0x0040, lo: 0xa2, hi: 0xa2}, - {value: 0x1308, lo: 0xa3, hi: 0xa4}, - {value: 0x0040, lo: 0xa5, hi: 0xa5}, - {value: 0x1308, lo: 0xa6, hi: 0xaa}, - {value: 0x0040, lo: 0xab, hi: 0xbf}, - // Block 0xe3, offset 0x6b1 - {value: 0x0000, lo: 0x05}, - {value: 0x0008, lo: 0x80, hi: 0x84}, - {value: 0x0040, lo: 0x85, hi: 0x86}, - {value: 0x0018, lo: 0x87, hi: 0x8f}, - {value: 0x1308, lo: 0x90, hi: 0x96}, - {value: 0x0040, lo: 0x97, hi: 0xbf}, - // Block 0xe4, offset 0x6b7 - {value: 0x0000, lo: 0x07}, - {value: 0x0208, lo: 0x80, hi: 0x83}, - {value: 0x1308, lo: 0x84, hi: 0x8a}, - {value: 0x0040, lo: 0x8b, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x99}, - {value: 0x0040, lo: 0x9a, hi: 0x9d}, - {value: 0x0018, lo: 0x9e, hi: 0x9f}, - {value: 0x0040, lo: 0xa0, hi: 0xbf}, - // Block 0xe5, offset 0x6bf - {value: 0x0000, lo: 0x03}, - {value: 0x0040, lo: 0x80, hi: 0xaf}, - {value: 0x0018, lo: 0xb0, hi: 0xb1}, - {value: 0x0040, lo: 0xb2, hi: 0xbf}, - // Block 0xe6, offset 0x6c3 - {value: 0x0000, lo: 0x03}, - {value: 0x0018, lo: 0x80, hi: 0xab}, - {value: 0x0040, lo: 0xac, hi: 0xaf}, - {value: 0x0018, lo: 0xb0, hi: 0xbf}, - // Block 0xe7, offset 0x6c7 - {value: 0x0000, lo: 0x05}, - {value: 0x0018, lo: 0x80, hi: 0x93}, - {value: 0x0040, lo: 0x94, hi: 0x9f}, - {value: 0x0018, lo: 0xa0, hi: 0xae}, - {value: 0x0040, lo: 0xaf, hi: 0xb0}, - {value: 0x0018, lo: 0xb1, hi: 0xbf}, - // Block 0xe8, offset 0x6cd - {value: 0x0000, lo: 0x05}, - {value: 0x0040, lo: 0x80, hi: 0x80}, - {value: 0x0018, lo: 0x81, hi: 0x8f}, - {value: 0x0040, lo: 0x90, hi: 0x90}, - {value: 0x0018, lo: 0x91, hi: 0xb5}, - {value: 0x0040, lo: 0xb6, hi: 0xbf}, - // Block 0xe9, offset 0x6d3 - {value: 0x0000, lo: 0x04}, - {value: 0x0018, lo: 0x80, hi: 0x8f}, - {value: 0xc1c1, lo: 0x90, hi: 0x90}, - {value: 0x0018, lo: 0x91, hi: 0xac}, - {value: 0x0040, lo: 0xad, hi: 0xbf}, - // Block 0xea, offset 0x6d8 - {value: 0x0000, lo: 0x02}, - {value: 0x0040, lo: 0x80, hi: 0xa5}, - {value: 0x0018, lo: 0xa6, hi: 0xbf}, - // Block 0xeb, offset 0x6db - {value: 0x0000, lo: 0x0d}, - {value: 0xc7e9, lo: 0x80, hi: 0x80}, - {value: 0xc839, lo: 0x81, hi: 0x81}, - {value: 0xc889, lo: 0x82, hi: 0x82}, - {value: 0xc8d9, lo: 0x83, hi: 0x83}, - {value: 0xc929, lo: 0x84, hi: 0x84}, - {value: 0xc979, lo: 0x85, hi: 0x85}, - {value: 0xc9c9, lo: 0x86, hi: 0x86}, - {value: 0xca19, lo: 0x87, hi: 0x87}, - {value: 0xca69, lo: 0x88, hi: 0x88}, - {value: 0x0040, lo: 0x89, hi: 0x8f}, - {value: 0xcab9, lo: 0x90, hi: 0x90}, - {value: 0xcad9, lo: 0x91, hi: 0x91}, - {value: 0x0040, lo: 0x92, hi: 0xbf}, - // Block 0xec, offset 0x6e9 - {value: 0x0000, lo: 0x06}, - {value: 0x0018, lo: 0x80, hi: 0x92}, - {value: 0x0040, lo: 0x93, hi: 0x9f}, - {value: 0x0018, lo: 0xa0, hi: 0xac}, - {value: 0x0040, lo: 0xad, hi: 0xaf}, - {value: 0x0018, lo: 0xb0, hi: 0xb6}, - {value: 0x0040, lo: 0xb7, hi: 0xbf}, - // Block 0xed, offset 0x6f0 - {value: 0x0000, lo: 0x02}, - {value: 0x0018, lo: 0x80, hi: 0xb3}, - {value: 0x0040, lo: 0xb4, hi: 0xbf}, - // Block 0xee, offset 0x6f3 - {value: 0x0000, lo: 0x02}, - {value: 0x0018, lo: 0x80, hi: 0x94}, - {value: 0x0040, lo: 0x95, hi: 0xbf}, - // Block 0xef, offset 0x6f6 - {value: 0x0000, lo: 0x03}, - {value: 0x0018, lo: 0x80, hi: 0x8b}, - {value: 0x0040, lo: 0x8c, hi: 0x8f}, - {value: 0x0018, lo: 0x90, hi: 0xbf}, - // Block 0xf0, offset 0x6fa - {value: 0x0000, lo: 0x05}, - {value: 0x0018, lo: 0x80, hi: 0x87}, - {value: 0x0040, lo: 0x88, hi: 0x8f}, - {value: 0x0018, lo: 0x90, hi: 0x99}, - {value: 0x0040, lo: 0x9a, hi: 0x9f}, - {value: 0x0018, lo: 0xa0, hi: 0xbf}, - // Block 0xf1, offset 0x700 - {value: 0x0000, lo: 0x04}, - {value: 0x0018, lo: 0x80, hi: 0x87}, - {value: 0x0040, lo: 0x88, hi: 0x8f}, - {value: 0x0018, lo: 0x90, hi: 0xad}, - {value: 0x0040, lo: 0xae, hi: 0xbf}, - // Block 0xf2, offset 0x705 - {value: 0x0000, lo: 0x09}, - {value: 0x0040, lo: 0x80, hi: 0x8f}, - {value: 0x0018, lo: 0x90, hi: 0x9e}, - {value: 0x0040, lo: 0x9f, hi: 0x9f}, - {value: 0x0018, lo: 0xa0, hi: 0xa7}, - {value: 0x0040, lo: 0xa8, hi: 0xaf}, - {value: 0x0018, lo: 0xb0, hi: 0xb0}, - {value: 0x0040, lo: 0xb1, hi: 0xb2}, - {value: 0x0018, lo: 0xb3, hi: 0xbe}, - {value: 0x0040, lo: 0xbf, hi: 0xbf}, - // Block 0xf3, offset 0x70f - {value: 0x0000, lo: 0x04}, - {value: 0x0018, lo: 0x80, hi: 0x8b}, - {value: 0x0040, lo: 0x8c, hi: 0x8f}, - {value: 0x0018, lo: 0x90, hi: 0x9e}, - {value: 0x0040, lo: 0x9f, hi: 0xbf}, - // Block 0xf4, offset 0x714 - {value: 0x0000, lo: 0x02}, - {value: 0x0018, lo: 0x80, hi: 0x91}, - {value: 0x0040, lo: 0x92, hi: 0xbf}, - // Block 0xf5, offset 0x717 - {value: 0x0000, lo: 0x02}, - {value: 0x0018, lo: 0x80, hi: 0x80}, - {value: 0x0040, lo: 0x81, hi: 0xbf}, - // Block 0xf6, offset 0x71a - {value: 0x0000, lo: 0x02}, - {value: 0x0008, lo: 0x80, hi: 0x96}, - {value: 0x0040, lo: 0x97, hi: 0xbf}, - // Block 0xf7, offset 0x71d - {value: 0x0000, lo: 0x02}, - {value: 0x0008, lo: 0x80, hi: 0xb4}, - {value: 0x0040, lo: 0xb5, hi: 0xbf}, - // Block 0xf8, offset 0x720 - {value: 0x0000, lo: 0x03}, - {value: 0x0008, lo: 0x80, hi: 0x9d}, - {value: 0x0040, lo: 0x9e, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xbf}, - // Block 0xf9, offset 0x724 - {value: 0x0000, lo: 0x02}, - {value: 0x0008, lo: 0x80, hi: 0xa1}, - {value: 0x0040, lo: 0xa2, hi: 0xbf}, - // Block 0xfa, offset 0x727 - {value: 0x0020, lo: 0x0f}, - {value: 0xdeb9, lo: 0x80, hi: 0x89}, - {value: 0x8dfd, lo: 0x8a, hi: 0x8a}, - {value: 0xdff9, lo: 0x8b, hi: 0x9c}, - {value: 0x8e1d, lo: 0x9d, hi: 0x9d}, - {value: 0xe239, lo: 0x9e, hi: 0xa2}, - {value: 0x8e3d, lo: 0xa3, hi: 0xa3}, - {value: 0xe2d9, lo: 0xa4, hi: 0xab}, - {value: 0x7ed5, lo: 0xac, hi: 0xac}, - {value: 0xe3d9, lo: 0xad, hi: 0xaf}, - {value: 0x8e5d, lo: 0xb0, hi: 0xb0}, - {value: 0xe439, lo: 0xb1, hi: 0xb6}, - {value: 0x8e7d, lo: 0xb7, hi: 0xb9}, - {value: 0xe4f9, lo: 0xba, hi: 0xba}, - {value: 0x8edd, lo: 0xbb, hi: 0xbb}, - {value: 0xe519, lo: 0xbc, hi: 0xbf}, - // Block 0xfb, offset 0x737 - {value: 0x0020, lo: 0x10}, - {value: 0x937d, lo: 0x80, hi: 0x80}, - {value: 0xf099, lo: 0x81, hi: 0x86}, - {value: 0x939d, lo: 0x87, hi: 0x8a}, - {value: 0xd9f9, lo: 0x8b, hi: 0x8b}, - {value: 0xf159, lo: 0x8c, hi: 0x96}, - {value: 0x941d, lo: 0x97, hi: 0x97}, - {value: 0xf2b9, lo: 0x98, hi: 0xa3}, - {value: 0x943d, lo: 0xa4, hi: 0xa6}, - {value: 0xf439, lo: 0xa7, hi: 0xaa}, - {value: 0x949d, lo: 0xab, hi: 0xab}, - {value: 0xf4b9, lo: 0xac, hi: 0xac}, - {value: 0x94bd, lo: 0xad, hi: 0xad}, - {value: 0xf4d9, lo: 0xae, hi: 0xaf}, - {value: 0x94dd, lo: 0xb0, hi: 0xb1}, - {value: 0xf519, lo: 0xb2, hi: 0xbe}, - {value: 0x0040, lo: 0xbf, hi: 0xbf}, - // Block 0xfc, offset 0x748 - {value: 0x0000, lo: 0x04}, - {value: 0x0040, lo: 0x80, hi: 0x80}, - {value: 0x0340, lo: 0x81, hi: 0x81}, - {value: 0x0040, lo: 0x82, hi: 0x9f}, - {value: 0x0340, lo: 0xa0, hi: 0xbf}, - // Block 0xfd, offset 0x74d - {value: 0x0000, lo: 0x01}, - {value: 0x0340, lo: 0x80, hi: 0xbf}, - // Block 0xfe, offset 0x74f - {value: 0x0000, lo: 0x01}, - {value: 0x13c0, lo: 0x80, hi: 0xbf}, - // Block 0xff, offset 0x751 - {value: 0x0000, lo: 0x02}, - {value: 0x13c0, lo: 0x80, hi: 0xaf}, - {value: 0x0040, lo: 0xb0, hi: 0xbf}, -} - -// Total table size 41559 bytes (40KiB); checksum: F4A1FA4E diff --git a/vendor/golang.org/x/net/idna/trie.go b/vendor/golang.org/x/net/idna/trie.go deleted file mode 100644 index c4ef847e7..000000000 --- a/vendor/golang.org/x/net/idna/trie.go +++ /dev/null @@ -1,72 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package idna - -// appendMapping appends the mapping for the respective rune. isMapped must be -// true. A mapping is a categorization of a rune as defined in UTS #46. -func (c info) appendMapping(b []byte, s string) []byte { - index := int(c >> indexShift) - if c&xorBit == 0 { - s := mappings[index:] - return append(b, s[1:s[0]+1]...) - } - b = append(b, s...) - if c&inlineXOR == inlineXOR { - // TODO: support and handle two-byte inline masks - b[len(b)-1] ^= byte(index) - } else { - for p := len(b) - int(xorData[index]); p < len(b); p++ { - index++ - b[p] ^= xorData[index] - } - } - return b -} - -// Sparse block handling code. - -type valueRange struct { - value uint16 // header: value:stride - lo, hi byte // header: lo:n -} - -type sparseBlocks struct { - values []valueRange - offset []uint16 -} - -var idnaSparse = sparseBlocks{ - values: idnaSparseValues[:], - offset: idnaSparseOffset[:], -} - -// Don't use newIdnaTrie to avoid unconditional linking in of the table. -var trie = &idnaTrie{} - -// lookup determines the type of block n and looks up the value for b. -// For n < t.cutoff, the block is a simple lookup table. Otherwise, the block -// is a list of ranges with an accompanying value. Given a matching range r, -// the value for b is by r.value + (b - r.lo) * stride. -func (t *sparseBlocks) lookup(n uint32, b byte) uint16 { - offset := t.offset[n] - header := t.values[offset] - lo := offset + 1 - hi := lo + uint16(header.lo) - for lo < hi { - m := lo + (hi-lo)/2 - r := t.values[m] - if r.lo <= b && b <= r.hi { - return r.value + uint16(b-r.lo)*header.value - } - if b < r.lo { - hi = m - } else { - lo = m + 1 - } - } - return 0 -} diff --git a/vendor/golang.org/x/net/idna/trieval.go b/vendor/golang.org/x/net/idna/trieval.go deleted file mode 100644 index 63cb03b59..000000000 --- a/vendor/golang.org/x/net/idna/trieval.go +++ /dev/null @@ -1,114 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -package idna - -// This file contains definitions for interpreting the trie value of the idna -// trie generated by "go run gen*.go". It is shared by both the generator -// program and the resultant package. Sharing is achieved by the generator -// copying gen_trieval.go to trieval.go and changing what's above this comment. - -// info holds information from the IDNA mapping table for a single rune. It is -// the value returned by a trie lookup. In most cases, all information fits in -// a 16-bit value. For mappings, this value may contain an index into a slice -// with the mapped string. Such mappings can consist of the actual mapped value -// or an XOR pattern to be applied to the bytes of the UTF8 encoding of the -// input rune. This technique is used by the cases packages and reduces the -// table size significantly. -// -// The per-rune values have the following format: -// -// if mapped { -// if inlinedXOR { -// 15..13 inline XOR marker -// 12..11 unused -// 10..3 inline XOR mask -// } else { -// 15..3 index into xor or mapping table -// } -// } else { -// 15..13 unused -// 12 modifier (including virama) -// 11 virama modifier -// 10..8 joining type -// 7..3 category type -// } -// 2 use xor pattern -// 1..0 mapped category -// -// See the definitions below for a more detailed description of the various -// bits. -type info uint16 - -const ( - catSmallMask = 0x3 - catBigMask = 0xF8 - indexShift = 3 - xorBit = 0x4 // interpret the index as an xor pattern - inlineXOR = 0xE000 // These bits are set if the XOR pattern is inlined. - - joinShift = 8 - joinMask = 0x07 - - viramaModifier = 0x0800 - modifier = 0x1000 -) - -// A category corresponds to a category defined in the IDNA mapping table. -type category uint16 - -const ( - unknown category = 0 // not defined currently in unicode. - mapped category = 1 - disallowedSTD3Mapped category = 2 - deviation category = 3 -) - -const ( - valid category = 0x08 - validNV8 category = 0x18 - validXV8 category = 0x28 - disallowed category = 0x40 - disallowedSTD3Valid category = 0x80 - ignored category = 0xC0 -) - -// join types and additional rune information -const ( - joiningL = (iota + 1) - joiningD - joiningT - joiningR - - //the following types are derived during processing - joinZWJ - joinZWNJ - joinVirama - numJoinTypes -) - -func (c info) isMapped() bool { - return c&0x3 != 0 -} - -func (c info) category() category { - small := c & catSmallMask - if small != 0 { - return category(small) - } - return category(c & catBigMask) -} - -func (c info) joinType() info { - if c.isMapped() { - return 0 - } - return (c >> joinShift) & joinMask -} - -func (c info) isModifier() bool { - return c&(modifier|catSmallMask) == modifier -} - -func (c info) isViramaModifier() bool { - return c&(viramaModifier|catSmallMask) == viramaModifier -} diff --git a/vendor/golang.org/x/net/internal/timeseries/timeseries.go b/vendor/golang.org/x/net/internal/timeseries/timeseries.go deleted file mode 100644 index 685f0e7ea..000000000 --- a/vendor/golang.org/x/net/internal/timeseries/timeseries.go +++ /dev/null @@ -1,525 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package timeseries implements a time series structure for stats collection. -package timeseries // import "golang.org/x/net/internal/timeseries" - -import ( - "fmt" - "log" - "time" -) - -const ( - timeSeriesNumBuckets = 64 - minuteHourSeriesNumBuckets = 60 -) - -var timeSeriesResolutions = []time.Duration{ - 1 * time.Second, - 10 * time.Second, - 1 * time.Minute, - 10 * time.Minute, - 1 * time.Hour, - 6 * time.Hour, - 24 * time.Hour, // 1 day - 7 * 24 * time.Hour, // 1 week - 4 * 7 * 24 * time.Hour, // 4 weeks - 16 * 7 * 24 * time.Hour, // 16 weeks -} - -var minuteHourSeriesResolutions = []time.Duration{ - 1 * time.Second, - 1 * time.Minute, -} - -// An Observable is a kind of data that can be aggregated in a time series. -type Observable interface { - Multiply(ratio float64) // Multiplies the data in self by a given ratio - Add(other Observable) // Adds the data from a different observation to self - Clear() // Clears the observation so it can be reused. - CopyFrom(other Observable) // Copies the contents of a given observation to self -} - -// Float attaches the methods of Observable to a float64. -type Float float64 - -// NewFloat returns a Float. -func NewFloat() Observable { - f := Float(0) - return &f -} - -// String returns the float as a string. -func (f *Float) String() string { return fmt.Sprintf("%g", f.Value()) } - -// Value returns the float's value. -func (f *Float) Value() float64 { return float64(*f) } - -func (f *Float) Multiply(ratio float64) { *f *= Float(ratio) } - -func (f *Float) Add(other Observable) { - o := other.(*Float) - *f += *o -} - -func (f *Float) Clear() { *f = 0 } - -func (f *Float) CopyFrom(other Observable) { - o := other.(*Float) - *f = *o -} - -// A Clock tells the current time. -type Clock interface { - Time() time.Time -} - -type defaultClock int - -var defaultClockInstance defaultClock - -func (defaultClock) Time() time.Time { return time.Now() } - -// Information kept per level. Each level consists of a circular list of -// observations. The start of the level may be derived from end and the -// len(buckets) * sizeInMillis. -type tsLevel struct { - oldest int // index to oldest bucketed Observable - newest int // index to newest bucketed Observable - end time.Time // end timestamp for this level - size time.Duration // duration of the bucketed Observable - buckets []Observable // collections of observations - provider func() Observable // used for creating new Observable -} - -func (l *tsLevel) Clear() { - l.oldest = 0 - l.newest = len(l.buckets) - 1 - l.end = time.Time{} - for i := range l.buckets { - if l.buckets[i] != nil { - l.buckets[i].Clear() - l.buckets[i] = nil - } - } -} - -func (l *tsLevel) InitLevel(size time.Duration, numBuckets int, f func() Observable) { - l.size = size - l.provider = f - l.buckets = make([]Observable, numBuckets) -} - -// Keeps a sequence of levels. Each level is responsible for storing data at -// a given resolution. For example, the first level stores data at a one -// minute resolution while the second level stores data at a one hour -// resolution. - -// Each level is represented by a sequence of buckets. Each bucket spans an -// interval equal to the resolution of the level. New observations are added -// to the last bucket. -type timeSeries struct { - provider func() Observable // make more Observable - numBuckets int // number of buckets in each level - levels []*tsLevel // levels of bucketed Observable - lastAdd time.Time // time of last Observable tracked - total Observable // convenient aggregation of all Observable - clock Clock // Clock for getting current time - pending Observable // observations not yet bucketed - pendingTime time.Time // what time are we keeping in pending - dirty bool // if there are pending observations -} - -// init initializes a level according to the supplied criteria. -func (ts *timeSeries) init(resolutions []time.Duration, f func() Observable, numBuckets int, clock Clock) { - ts.provider = f - ts.numBuckets = numBuckets - ts.clock = clock - ts.levels = make([]*tsLevel, len(resolutions)) - - for i := range resolutions { - if i > 0 && resolutions[i-1] >= resolutions[i] { - log.Print("timeseries: resolutions must be monotonically increasing") - break - } - newLevel := new(tsLevel) - newLevel.InitLevel(resolutions[i], ts.numBuckets, ts.provider) - ts.levels[i] = newLevel - } - - ts.Clear() -} - -// Clear removes all observations from the time series. -func (ts *timeSeries) Clear() { - ts.lastAdd = time.Time{} - ts.total = ts.resetObservation(ts.total) - ts.pending = ts.resetObservation(ts.pending) - ts.pendingTime = time.Time{} - ts.dirty = false - - for i := range ts.levels { - ts.levels[i].Clear() - } -} - -// Add records an observation at the current time. -func (ts *timeSeries) Add(observation Observable) { - ts.AddWithTime(observation, ts.clock.Time()) -} - -// AddWithTime records an observation at the specified time. -func (ts *timeSeries) AddWithTime(observation Observable, t time.Time) { - - smallBucketDuration := ts.levels[0].size - - if t.After(ts.lastAdd) { - ts.lastAdd = t - } - - if t.After(ts.pendingTime) { - ts.advance(t) - ts.mergePendingUpdates() - ts.pendingTime = ts.levels[0].end - ts.pending.CopyFrom(observation) - ts.dirty = true - } else if t.After(ts.pendingTime.Add(-1 * smallBucketDuration)) { - // The observation is close enough to go into the pending bucket. - // This compensates for clock skewing and small scheduling delays - // by letting the update stay in the fast path. - ts.pending.Add(observation) - ts.dirty = true - } else { - ts.mergeValue(observation, t) - } -} - -// mergeValue inserts the observation at the specified time in the past into all levels. -func (ts *timeSeries) mergeValue(observation Observable, t time.Time) { - for _, level := range ts.levels { - index := (ts.numBuckets - 1) - int(level.end.Sub(t)/level.size) - if 0 <= index && index < ts.numBuckets { - bucketNumber := (level.oldest + index) % ts.numBuckets - if level.buckets[bucketNumber] == nil { - level.buckets[bucketNumber] = level.provider() - } - level.buckets[bucketNumber].Add(observation) - } - } - ts.total.Add(observation) -} - -// mergePendingUpdates applies the pending updates into all levels. -func (ts *timeSeries) mergePendingUpdates() { - if ts.dirty { - ts.mergeValue(ts.pending, ts.pendingTime) - ts.pending = ts.resetObservation(ts.pending) - ts.dirty = false - } -} - -// advance cycles the buckets at each level until the latest bucket in -// each level can hold the time specified. -func (ts *timeSeries) advance(t time.Time) { - if !t.After(ts.levels[0].end) { - return - } - for i := 0; i < len(ts.levels); i++ { - level := ts.levels[i] - if !level.end.Before(t) { - break - } - - // If the time is sufficiently far, just clear the level and advance - // directly. - if !t.Before(level.end.Add(level.size * time.Duration(ts.numBuckets))) { - for _, b := range level.buckets { - ts.resetObservation(b) - } - level.end = time.Unix(0, (t.UnixNano()/level.size.Nanoseconds())*level.size.Nanoseconds()) - } - - for t.After(level.end) { - level.end = level.end.Add(level.size) - level.newest = level.oldest - level.oldest = (level.oldest + 1) % ts.numBuckets - ts.resetObservation(level.buckets[level.newest]) - } - - t = level.end - } -} - -// Latest returns the sum of the num latest buckets from the level. -func (ts *timeSeries) Latest(level, num int) Observable { - now := ts.clock.Time() - if ts.levels[0].end.Before(now) { - ts.advance(now) - } - - ts.mergePendingUpdates() - - result := ts.provider() - l := ts.levels[level] - index := l.newest - - for i := 0; i < num; i++ { - if l.buckets[index] != nil { - result.Add(l.buckets[index]) - } - if index == 0 { - index = ts.numBuckets - } - index-- - } - - return result -} - -// LatestBuckets returns a copy of the num latest buckets from level. -func (ts *timeSeries) LatestBuckets(level, num int) []Observable { - if level < 0 || level > len(ts.levels) { - log.Print("timeseries: bad level argument: ", level) - return nil - } - if num < 0 || num >= ts.numBuckets { - log.Print("timeseries: bad num argument: ", num) - return nil - } - - results := make([]Observable, num) - now := ts.clock.Time() - if ts.levels[0].end.Before(now) { - ts.advance(now) - } - - ts.mergePendingUpdates() - - l := ts.levels[level] - index := l.newest - - for i := 0; i < num; i++ { - result := ts.provider() - results[i] = result - if l.buckets[index] != nil { - result.CopyFrom(l.buckets[index]) - } - - if index == 0 { - index = ts.numBuckets - } - index -= 1 - } - return results -} - -// ScaleBy updates observations by scaling by factor. -func (ts *timeSeries) ScaleBy(factor float64) { - for _, l := range ts.levels { - for i := 0; i < ts.numBuckets; i++ { - l.buckets[i].Multiply(factor) - } - } - - ts.total.Multiply(factor) - ts.pending.Multiply(factor) -} - -// Range returns the sum of observations added over the specified time range. -// If start or finish times don't fall on bucket boundaries of the same -// level, then return values are approximate answers. -func (ts *timeSeries) Range(start, finish time.Time) Observable { - return ts.ComputeRange(start, finish, 1)[0] -} - -// Recent returns the sum of observations from the last delta. -func (ts *timeSeries) Recent(delta time.Duration) Observable { - now := ts.clock.Time() - return ts.Range(now.Add(-delta), now) -} - -// Total returns the total of all observations. -func (ts *timeSeries) Total() Observable { - ts.mergePendingUpdates() - return ts.total -} - -// ComputeRange computes a specified number of values into a slice using -// the observations recorded over the specified time period. The return -// values are approximate if the start or finish times don't fall on the -// bucket boundaries at the same level or if the number of buckets spanning -// the range is not an integral multiple of num. -func (ts *timeSeries) ComputeRange(start, finish time.Time, num int) []Observable { - if start.After(finish) { - log.Printf("timeseries: start > finish, %v>%v", start, finish) - return nil - } - - if num < 0 { - log.Printf("timeseries: num < 0, %v", num) - return nil - } - - results := make([]Observable, num) - - for _, l := range ts.levels { - if !start.Before(l.end.Add(-l.size * time.Duration(ts.numBuckets))) { - ts.extract(l, start, finish, num, results) - return results - } - } - - // Failed to find a level that covers the desired range. So just - // extract from the last level, even if it doesn't cover the entire - // desired range. - ts.extract(ts.levels[len(ts.levels)-1], start, finish, num, results) - - return results -} - -// RecentList returns the specified number of values in slice over the most -// recent time period of the specified range. -func (ts *timeSeries) RecentList(delta time.Duration, num int) []Observable { - if delta < 0 { - return nil - } - now := ts.clock.Time() - return ts.ComputeRange(now.Add(-delta), now, num) -} - -// extract returns a slice of specified number of observations from a given -// level over a given range. -func (ts *timeSeries) extract(l *tsLevel, start, finish time.Time, num int, results []Observable) { - ts.mergePendingUpdates() - - srcInterval := l.size - dstInterval := finish.Sub(start) / time.Duration(num) - dstStart := start - srcStart := l.end.Add(-srcInterval * time.Duration(ts.numBuckets)) - - srcIndex := 0 - - // Where should scanning start? - if dstStart.After(srcStart) { - advance := dstStart.Sub(srcStart) / srcInterval - srcIndex += int(advance) - srcStart = srcStart.Add(advance * srcInterval) - } - - // The i'th value is computed as show below. - // interval = (finish/start)/num - // i'th value = sum of observation in range - // [ start + i * interval, - // start + (i + 1) * interval ) - for i := 0; i < num; i++ { - results[i] = ts.resetObservation(results[i]) - dstEnd := dstStart.Add(dstInterval) - for srcIndex < ts.numBuckets && srcStart.Before(dstEnd) { - srcEnd := srcStart.Add(srcInterval) - if srcEnd.After(ts.lastAdd) { - srcEnd = ts.lastAdd - } - - if !srcEnd.Before(dstStart) { - srcValue := l.buckets[(srcIndex+l.oldest)%ts.numBuckets] - if !srcStart.Before(dstStart) && !srcEnd.After(dstEnd) { - // dst completely contains src. - if srcValue != nil { - results[i].Add(srcValue) - } - } else { - // dst partially overlaps src. - overlapStart := maxTime(srcStart, dstStart) - overlapEnd := minTime(srcEnd, dstEnd) - base := srcEnd.Sub(srcStart) - fraction := overlapEnd.Sub(overlapStart).Seconds() / base.Seconds() - - used := ts.provider() - if srcValue != nil { - used.CopyFrom(srcValue) - } - used.Multiply(fraction) - results[i].Add(used) - } - - if srcEnd.After(dstEnd) { - break - } - } - srcIndex++ - srcStart = srcStart.Add(srcInterval) - } - dstStart = dstStart.Add(dstInterval) - } -} - -// resetObservation clears the content so the struct may be reused. -func (ts *timeSeries) resetObservation(observation Observable) Observable { - if observation == nil { - observation = ts.provider() - } else { - observation.Clear() - } - return observation -} - -// TimeSeries tracks data at granularities from 1 second to 16 weeks. -type TimeSeries struct { - timeSeries -} - -// NewTimeSeries creates a new TimeSeries using the function provided for creating new Observable. -func NewTimeSeries(f func() Observable) *TimeSeries { - return NewTimeSeriesWithClock(f, defaultClockInstance) -} - -// NewTimeSeriesWithClock creates a new TimeSeries using the function provided for creating new Observable and the clock for -// assigning timestamps. -func NewTimeSeriesWithClock(f func() Observable, clock Clock) *TimeSeries { - ts := new(TimeSeries) - ts.timeSeries.init(timeSeriesResolutions, f, timeSeriesNumBuckets, clock) - return ts -} - -// MinuteHourSeries tracks data at granularities of 1 minute and 1 hour. -type MinuteHourSeries struct { - timeSeries -} - -// NewMinuteHourSeries creates a new MinuteHourSeries using the function provided for creating new Observable. -func NewMinuteHourSeries(f func() Observable) *MinuteHourSeries { - return NewMinuteHourSeriesWithClock(f, defaultClockInstance) -} - -// NewMinuteHourSeriesWithClock creates a new MinuteHourSeries using the function provided for creating new Observable and the clock for -// assigning timestamps. -func NewMinuteHourSeriesWithClock(f func() Observable, clock Clock) *MinuteHourSeries { - ts := new(MinuteHourSeries) - ts.timeSeries.init(minuteHourSeriesResolutions, f, - minuteHourSeriesNumBuckets, clock) - return ts -} - -func (ts *MinuteHourSeries) Minute() Observable { - return ts.timeSeries.Latest(0, 60) -} - -func (ts *MinuteHourSeries) Hour() Observable { - return ts.timeSeries.Latest(1, 60) -} - -func minTime(a, b time.Time) time.Time { - if a.Before(b) { - return a - } - return b -} - -func maxTime(a, b time.Time) time.Time { - if a.After(b) { - return a - } - return b -} diff --git a/vendor/golang.org/x/net/lex/httplex/httplex.go b/vendor/golang.org/x/net/lex/httplex/httplex.go deleted file mode 100644 index 20f2b8940..000000000 --- a/vendor/golang.org/x/net/lex/httplex/httplex.go +++ /dev/null @@ -1,351 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package httplex contains rules around lexical matters of various -// HTTP-related specifications. -// -// This package is shared by the standard library (which vendors it) -// and x/net/http2. It comes with no API stability promise. -package httplex - -import ( - "net" - "strings" - "unicode/utf8" - - "golang.org/x/net/idna" -) - -var isTokenTable = [127]bool{ - '!': true, - '#': true, - '$': true, - '%': true, - '&': true, - '\'': true, - '*': true, - '+': true, - '-': true, - '.': true, - '0': true, - '1': true, - '2': true, - '3': true, - '4': true, - '5': true, - '6': true, - '7': true, - '8': true, - '9': true, - 'A': true, - 'B': true, - 'C': true, - 'D': true, - 'E': true, - 'F': true, - 'G': true, - 'H': true, - 'I': true, - 'J': true, - 'K': true, - 'L': true, - 'M': true, - 'N': true, - 'O': true, - 'P': true, - 'Q': true, - 'R': true, - 'S': true, - 'T': true, - 'U': true, - 'W': true, - 'V': true, - 'X': true, - 'Y': true, - 'Z': true, - '^': true, - '_': true, - '`': true, - 'a': true, - 'b': true, - 'c': true, - 'd': true, - 'e': true, - 'f': true, - 'g': true, - 'h': true, - 'i': true, - 'j': true, - 'k': true, - 'l': true, - 'm': true, - 'n': true, - 'o': true, - 'p': true, - 'q': true, - 'r': true, - 's': true, - 't': true, - 'u': true, - 'v': true, - 'w': true, - 'x': true, - 'y': true, - 'z': true, - '|': true, - '~': true, -} - -func IsTokenRune(r rune) bool { - i := int(r) - return i < len(isTokenTable) && isTokenTable[i] -} - -func isNotToken(r rune) bool { - return !IsTokenRune(r) -} - -// HeaderValuesContainsToken reports whether any string in values -// contains the provided token, ASCII case-insensitively. -func HeaderValuesContainsToken(values []string, token string) bool { - for _, v := range values { - if headerValueContainsToken(v, token) { - return true - } - } - return false -} - -// isOWS reports whether b is an optional whitespace byte, as defined -// by RFC 7230 section 3.2.3. -func isOWS(b byte) bool { return b == ' ' || b == '\t' } - -// trimOWS returns x with all optional whitespace removes from the -// beginning and end. -func trimOWS(x string) string { - // TODO: consider using strings.Trim(x, " \t") instead, - // if and when it's fast enough. See issue 10292. - // But this ASCII-only code will probably always beat UTF-8 - // aware code. - for len(x) > 0 && isOWS(x[0]) { - x = x[1:] - } - for len(x) > 0 && isOWS(x[len(x)-1]) { - x = x[:len(x)-1] - } - return x -} - -// headerValueContainsToken reports whether v (assumed to be a -// 0#element, in the ABNF extension described in RFC 7230 section 7) -// contains token amongst its comma-separated tokens, ASCII -// case-insensitively. -func headerValueContainsToken(v string, token string) bool { - v = trimOWS(v) - if comma := strings.IndexByte(v, ','); comma != -1 { - return tokenEqual(trimOWS(v[:comma]), token) || headerValueContainsToken(v[comma+1:], token) - } - return tokenEqual(v, token) -} - -// lowerASCII returns the ASCII lowercase version of b. -func lowerASCII(b byte) byte { - if 'A' <= b && b <= 'Z' { - return b + ('a' - 'A') - } - return b -} - -// tokenEqual reports whether t1 and t2 are equal, ASCII case-insensitively. -func tokenEqual(t1, t2 string) bool { - if len(t1) != len(t2) { - return false - } - for i, b := range t1 { - if b >= utf8.RuneSelf { - // No UTF-8 or non-ASCII allowed in tokens. - return false - } - if lowerASCII(byte(b)) != lowerASCII(t2[i]) { - return false - } - } - return true -} - -// isLWS reports whether b is linear white space, according -// to http://www.w3.org/Protocols/rfc2616/rfc2616-sec2.html#sec2.2 -// LWS = [CRLF] 1*( SP | HT ) -func isLWS(b byte) bool { return b == ' ' || b == '\t' } - -// isCTL reports whether b is a control byte, according -// to http://www.w3.org/Protocols/rfc2616/rfc2616-sec2.html#sec2.2 -// CTL = -func isCTL(b byte) bool { - const del = 0x7f // a CTL - return b < ' ' || b == del -} - -// ValidHeaderFieldName reports whether v is a valid HTTP/1.x header name. -// HTTP/2 imposes the additional restriction that uppercase ASCII -// letters are not allowed. -// -// RFC 7230 says: -// header-field = field-name ":" OWS field-value OWS -// field-name = token -// token = 1*tchar -// tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "." / -// "^" / "_" / "`" / "|" / "~" / DIGIT / ALPHA -func ValidHeaderFieldName(v string) bool { - if len(v) == 0 { - return false - } - for _, r := range v { - if !IsTokenRune(r) { - return false - } - } - return true -} - -// ValidHostHeader reports whether h is a valid host header. -func ValidHostHeader(h string) bool { - // The latest spec is actually this: - // - // http://tools.ietf.org/html/rfc7230#section-5.4 - // Host = uri-host [ ":" port ] - // - // Where uri-host is: - // http://tools.ietf.org/html/rfc3986#section-3.2.2 - // - // But we're going to be much more lenient for now and just - // search for any byte that's not a valid byte in any of those - // expressions. - for i := 0; i < len(h); i++ { - if !validHostByte[h[i]] { - return false - } - } - return true -} - -// See the validHostHeader comment. -var validHostByte = [256]bool{ - '0': true, '1': true, '2': true, '3': true, '4': true, '5': true, '6': true, '7': true, - '8': true, '9': true, - - 'a': true, 'b': true, 'c': true, 'd': true, 'e': true, 'f': true, 'g': true, 'h': true, - 'i': true, 'j': true, 'k': true, 'l': true, 'm': true, 'n': true, 'o': true, 'p': true, - 'q': true, 'r': true, 's': true, 't': true, 'u': true, 'v': true, 'w': true, 'x': true, - 'y': true, 'z': true, - - 'A': true, 'B': true, 'C': true, 'D': true, 'E': true, 'F': true, 'G': true, 'H': true, - 'I': true, 'J': true, 'K': true, 'L': true, 'M': true, 'N': true, 'O': true, 'P': true, - 'Q': true, 'R': true, 'S': true, 'T': true, 'U': true, 'V': true, 'W': true, 'X': true, - 'Y': true, 'Z': true, - - '!': true, // sub-delims - '$': true, // sub-delims - '%': true, // pct-encoded (and used in IPv6 zones) - '&': true, // sub-delims - '(': true, // sub-delims - ')': true, // sub-delims - '*': true, // sub-delims - '+': true, // sub-delims - ',': true, // sub-delims - '-': true, // unreserved - '.': true, // unreserved - ':': true, // IPv6address + Host expression's optional port - ';': true, // sub-delims - '=': true, // sub-delims - '[': true, - '\'': true, // sub-delims - ']': true, - '_': true, // unreserved - '~': true, // unreserved -} - -// ValidHeaderFieldValue reports whether v is a valid "field-value" according to -// http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2 : -// -// message-header = field-name ":" [ field-value ] -// field-value = *( field-content | LWS ) -// field-content = -// -// http://www.w3.org/Protocols/rfc2616/rfc2616-sec2.html#sec2.2 : -// -// TEXT = -// LWS = [CRLF] 1*( SP | HT ) -// CTL = -// -// RFC 7230 says: -// field-value = *( field-content / obs-fold ) -// obj-fold = N/A to http2, and deprecated -// field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ] -// field-vchar = VCHAR / obs-text -// obs-text = %x80-FF -// VCHAR = "any visible [USASCII] character" -// -// http2 further says: "Similarly, HTTP/2 allows header field values -// that are not valid. While most of the values that can be encoded -// will not alter header field parsing, carriage return (CR, ASCII -// 0xd), line feed (LF, ASCII 0xa), and the zero character (NUL, ASCII -// 0x0) might be exploited by an attacker if they are translated -// verbatim. Any request or response that contains a character not -// permitted in a header field value MUST be treated as malformed -// (Section 8.1.2.6). Valid characters are defined by the -// field-content ABNF rule in Section 3.2 of [RFC7230]." -// -// This function does not (yet?) properly handle the rejection of -// strings that begin or end with SP or HTAB. -func ValidHeaderFieldValue(v string) bool { - for i := 0; i < len(v); i++ { - b := v[i] - if isCTL(b) && !isLWS(b) { - return false - } - } - return true -} - -func isASCII(s string) bool { - for i := 0; i < len(s); i++ { - if s[i] >= utf8.RuneSelf { - return false - } - } - return true -} - -// PunycodeHostPort returns the IDNA Punycode version -// of the provided "host" or "host:port" string. -func PunycodeHostPort(v string) (string, error) { - if isASCII(v) { - return v, nil - } - - host, port, err := net.SplitHostPort(v) - if err != nil { - // The input 'v' argument was just a "host" argument, - // without a port. This error should not be returned - // to the caller. - host = v - port = "" - } - host, err = idna.ToASCII(host) - if err != nil { - // Non-UTF-8? Not representable in Punycode, in any - // case. - return "", err - } - if port == "" { - return host, nil - } - return net.JoinHostPort(host, port), nil -} diff --git a/vendor/golang.org/x/net/trace/events.go b/vendor/golang.org/x/net/trace/events.go deleted file mode 100644 index d8daec1a7..000000000 --- a/vendor/golang.org/x/net/trace/events.go +++ /dev/null @@ -1,532 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package trace - -import ( - "bytes" - "fmt" - "html/template" - "io" - "log" - "net/http" - "runtime" - "sort" - "strconv" - "strings" - "sync" - "sync/atomic" - "text/tabwriter" - "time" -) - -const maxEventsPerLog = 100 - -type bucket struct { - MaxErrAge time.Duration - String string -} - -var buckets = []bucket{ - {0, "total"}, - {10 * time.Second, "errs<10s"}, - {1 * time.Minute, "errs<1m"}, - {10 * time.Minute, "errs<10m"}, - {1 * time.Hour, "errs<1h"}, - {10 * time.Hour, "errs<10h"}, - {24000 * time.Hour, "errors"}, -} - -// RenderEvents renders the HTML page typically served at /debug/events. -// It does not do any auth checking; see AuthRequest for the default auth check -// used by the handler registered on http.DefaultServeMux. -// req may be nil. -func RenderEvents(w http.ResponseWriter, req *http.Request, sensitive bool) { - now := time.Now() - data := &struct { - Families []string // family names - Buckets []bucket - Counts [][]int // eventLog count per family/bucket - - // Set when a bucket has been selected. - Family string - Bucket int - EventLogs eventLogs - Expanded bool - }{ - Buckets: buckets, - } - - data.Families = make([]string, 0, len(families)) - famMu.RLock() - for name := range families { - data.Families = append(data.Families, name) - } - famMu.RUnlock() - sort.Strings(data.Families) - - // Count the number of eventLogs in each family for each error age. - data.Counts = make([][]int, len(data.Families)) - for i, name := range data.Families { - // TODO(sameer): move this loop under the family lock. - f := getEventFamily(name) - data.Counts[i] = make([]int, len(data.Buckets)) - for j, b := range data.Buckets { - data.Counts[i][j] = f.Count(now, b.MaxErrAge) - } - } - - if req != nil { - var ok bool - data.Family, data.Bucket, ok = parseEventsArgs(req) - if !ok { - // No-op - } else { - data.EventLogs = getEventFamily(data.Family).Copy(now, buckets[data.Bucket].MaxErrAge) - } - if data.EventLogs != nil { - defer data.EventLogs.Free() - sort.Sort(data.EventLogs) - } - if exp, err := strconv.ParseBool(req.FormValue("exp")); err == nil { - data.Expanded = exp - } - } - - famMu.RLock() - defer famMu.RUnlock() - if err := eventsTmpl().Execute(w, data); err != nil { - log.Printf("net/trace: Failed executing template: %v", err) - } -} - -func parseEventsArgs(req *http.Request) (fam string, b int, ok bool) { - fam, bStr := req.FormValue("fam"), req.FormValue("b") - if fam == "" || bStr == "" { - return "", 0, false - } - b, err := strconv.Atoi(bStr) - if err != nil || b < 0 || b >= len(buckets) { - return "", 0, false - } - return fam, b, true -} - -// An EventLog provides a log of events associated with a specific object. -type EventLog interface { - // Printf formats its arguments with fmt.Sprintf and adds the - // result to the event log. - Printf(format string, a ...interface{}) - - // Errorf is like Printf, but it marks this event as an error. - Errorf(format string, a ...interface{}) - - // Finish declares that this event log is complete. - // The event log should not be used after calling this method. - Finish() -} - -// NewEventLog returns a new EventLog with the specified family name -// and title. -func NewEventLog(family, title string) EventLog { - el := newEventLog() - el.ref() - el.Family, el.Title = family, title - el.Start = time.Now() - el.events = make([]logEntry, 0, maxEventsPerLog) - el.stack = make([]uintptr, 32) - n := runtime.Callers(2, el.stack) - el.stack = el.stack[:n] - - getEventFamily(family).add(el) - return el -} - -func (el *eventLog) Finish() { - getEventFamily(el.Family).remove(el) - el.unref() // matches ref in New -} - -var ( - famMu sync.RWMutex - families = make(map[string]*eventFamily) // family name => family -) - -func getEventFamily(fam string) *eventFamily { - famMu.Lock() - defer famMu.Unlock() - f := families[fam] - if f == nil { - f = &eventFamily{} - families[fam] = f - } - return f -} - -type eventFamily struct { - mu sync.RWMutex - eventLogs eventLogs -} - -func (f *eventFamily) add(el *eventLog) { - f.mu.Lock() - f.eventLogs = append(f.eventLogs, el) - f.mu.Unlock() -} - -func (f *eventFamily) remove(el *eventLog) { - f.mu.Lock() - defer f.mu.Unlock() - for i, el0 := range f.eventLogs { - if el == el0 { - copy(f.eventLogs[i:], f.eventLogs[i+1:]) - f.eventLogs = f.eventLogs[:len(f.eventLogs)-1] - return - } - } -} - -func (f *eventFamily) Count(now time.Time, maxErrAge time.Duration) (n int) { - f.mu.RLock() - defer f.mu.RUnlock() - for _, el := range f.eventLogs { - if el.hasRecentError(now, maxErrAge) { - n++ - } - } - return -} - -func (f *eventFamily) Copy(now time.Time, maxErrAge time.Duration) (els eventLogs) { - f.mu.RLock() - defer f.mu.RUnlock() - els = make(eventLogs, 0, len(f.eventLogs)) - for _, el := range f.eventLogs { - if el.hasRecentError(now, maxErrAge) { - el.ref() - els = append(els, el) - } - } - return -} - -type eventLogs []*eventLog - -// Free calls unref on each element of the list. -func (els eventLogs) Free() { - for _, el := range els { - el.unref() - } -} - -// eventLogs may be sorted in reverse chronological order. -func (els eventLogs) Len() int { return len(els) } -func (els eventLogs) Less(i, j int) bool { return els[i].Start.After(els[j].Start) } -func (els eventLogs) Swap(i, j int) { els[i], els[j] = els[j], els[i] } - -// A logEntry is a timestamped log entry in an event log. -type logEntry struct { - When time.Time - Elapsed time.Duration // since previous event in log - NewDay bool // whether this event is on a different day to the previous event - What string - IsErr bool -} - -// WhenString returns a string representation of the elapsed time of the event. -// It will include the date if midnight was crossed. -func (e logEntry) WhenString() string { - if e.NewDay { - return e.When.Format("2006/01/02 15:04:05.000000") - } - return e.When.Format("15:04:05.000000") -} - -// An eventLog represents an active event log. -type eventLog struct { - // Family is the top-level grouping of event logs to which this belongs. - Family string - - // Title is the title of this event log. - Title string - - // Timing information. - Start time.Time - - // Call stack where this event log was created. - stack []uintptr - - // Append-only sequence of events. - // - // TODO(sameer): change this to a ring buffer to avoid the array copy - // when we hit maxEventsPerLog. - mu sync.RWMutex - events []logEntry - LastErrorTime time.Time - discarded int - - refs int32 // how many buckets this is in -} - -func (el *eventLog) reset() { - // Clear all but the mutex. Mutexes may not be copied, even when unlocked. - el.Family = "" - el.Title = "" - el.Start = time.Time{} - el.stack = nil - el.events = nil - el.LastErrorTime = time.Time{} - el.discarded = 0 - el.refs = 0 -} - -func (el *eventLog) hasRecentError(now time.Time, maxErrAge time.Duration) bool { - if maxErrAge == 0 { - return true - } - el.mu.RLock() - defer el.mu.RUnlock() - return now.Sub(el.LastErrorTime) < maxErrAge -} - -// delta returns the elapsed time since the last event or the log start, -// and whether it spans midnight. -// L >= el.mu -func (el *eventLog) delta(t time.Time) (time.Duration, bool) { - if len(el.events) == 0 { - return t.Sub(el.Start), false - } - prev := el.events[len(el.events)-1].When - return t.Sub(prev), prev.Day() != t.Day() - -} - -func (el *eventLog) Printf(format string, a ...interface{}) { - el.printf(false, format, a...) -} - -func (el *eventLog) Errorf(format string, a ...interface{}) { - el.printf(true, format, a...) -} - -func (el *eventLog) printf(isErr bool, format string, a ...interface{}) { - e := logEntry{When: time.Now(), IsErr: isErr, What: fmt.Sprintf(format, a...)} - el.mu.Lock() - e.Elapsed, e.NewDay = el.delta(e.When) - if len(el.events) < maxEventsPerLog { - el.events = append(el.events, e) - } else { - // Discard the oldest event. - if el.discarded == 0 { - // el.discarded starts at two to count for the event it - // is replacing, plus the next one that we are about to - // drop. - el.discarded = 2 - } else { - el.discarded++ - } - // TODO(sameer): if this causes allocations on a critical path, - // change eventLog.What to be a fmt.Stringer, as in trace.go. - el.events[0].What = fmt.Sprintf("(%d events discarded)", el.discarded) - // The timestamp of the discarded meta-event should be - // the time of the last event it is representing. - el.events[0].When = el.events[1].When - copy(el.events[1:], el.events[2:]) - el.events[maxEventsPerLog-1] = e - } - if e.IsErr { - el.LastErrorTime = e.When - } - el.mu.Unlock() -} - -func (el *eventLog) ref() { - atomic.AddInt32(&el.refs, 1) -} - -func (el *eventLog) unref() { - if atomic.AddInt32(&el.refs, -1) == 0 { - freeEventLog(el) - } -} - -func (el *eventLog) When() string { - return el.Start.Format("2006/01/02 15:04:05.000000") -} - -func (el *eventLog) ElapsedTime() string { - elapsed := time.Since(el.Start) - return fmt.Sprintf("%.6f", elapsed.Seconds()) -} - -func (el *eventLog) Stack() string { - buf := new(bytes.Buffer) - tw := tabwriter.NewWriter(buf, 1, 8, 1, '\t', 0) - printStackRecord(tw, el.stack) - tw.Flush() - return buf.String() -} - -// printStackRecord prints the function + source line information -// for a single stack trace. -// Adapted from runtime/pprof/pprof.go. -func printStackRecord(w io.Writer, stk []uintptr) { - for _, pc := range stk { - f := runtime.FuncForPC(pc) - if f == nil { - continue - } - file, line := f.FileLine(pc) - name := f.Name() - // Hide runtime.goexit and any runtime functions at the beginning. - if strings.HasPrefix(name, "runtime.") { - continue - } - fmt.Fprintf(w, "# %s\t%s:%d\n", name, file, line) - } -} - -func (el *eventLog) Events() []logEntry { - el.mu.RLock() - defer el.mu.RUnlock() - return el.events -} - -// freeEventLogs is a freelist of *eventLog -var freeEventLogs = make(chan *eventLog, 1000) - -// newEventLog returns a event log ready to use. -func newEventLog() *eventLog { - select { - case el := <-freeEventLogs: - return el - default: - return new(eventLog) - } -} - -// freeEventLog adds el to freeEventLogs if there's room. -// This is non-blocking. -func freeEventLog(el *eventLog) { - el.reset() - select { - case freeEventLogs <- el: - default: - } -} - -var eventsTmplCache *template.Template -var eventsTmplOnce sync.Once - -func eventsTmpl() *template.Template { - eventsTmplOnce.Do(func() { - eventsTmplCache = template.Must(template.New("events").Funcs(template.FuncMap{ - "elapsed": elapsed, - "trimSpace": strings.TrimSpace, - }).Parse(eventsHTML)) - }) - return eventsTmplCache -} - -const eventsHTML = ` - - - events - - - - -

/debug/events

- -
- {{range $i, $fam := .Families}} - - - - {{range $j, $bucket := $.Buckets}} - {{$n := index $.Counts $i $j}} - - {{end}} - - {{end}} -
{{$fam}} - {{if $n}}{{end}} - [{{$n}} {{$bucket.String}}] - {{if $n}}{{end}} -
- -{{if $.EventLogs}} -
-

Family: {{$.Family}}

- -{{if $.Expanded}}{{end}} -[Summary]{{if $.Expanded}}{{end}} - -{{if not $.Expanded}}{{end}} -[Expanded]{{if not $.Expanded}}{{end}} - - - - {{range $el := $.EventLogs}} - - - - - {{if $.Expanded}} - - - - - - {{range $el.Events}} - - - - - - {{end}} - {{end}} - {{end}} -
WhenElapsed
{{$el.When}}{{$el.ElapsedTime}}{{$el.Title}} -
{{$el.Stack|trimSpace}}
{{.WhenString}}{{elapsed .Elapsed}}.{{if .IsErr}}E{{else}}.{{end}}. {{.What}}
-{{end}} - - -` diff --git a/vendor/golang.org/x/net/trace/histogram.go b/vendor/golang.org/x/net/trace/histogram.go deleted file mode 100644 index 9bf4286c7..000000000 --- a/vendor/golang.org/x/net/trace/histogram.go +++ /dev/null @@ -1,365 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package trace - -// This file implements histogramming for RPC statistics collection. - -import ( - "bytes" - "fmt" - "html/template" - "log" - "math" - "sync" - - "golang.org/x/net/internal/timeseries" -) - -const ( - bucketCount = 38 -) - -// histogram keeps counts of values in buckets that are spaced -// out in powers of 2: 0-1, 2-3, 4-7... -// histogram implements timeseries.Observable -type histogram struct { - sum int64 // running total of measurements - sumOfSquares float64 // square of running total - buckets []int64 // bucketed values for histogram - value int // holds a single value as an optimization - valueCount int64 // number of values recorded for single value -} - -// AddMeasurement records a value measurement observation to the histogram. -func (h *histogram) addMeasurement(value int64) { - // TODO: assert invariant - h.sum += value - h.sumOfSquares += float64(value) * float64(value) - - bucketIndex := getBucket(value) - - if h.valueCount == 0 || (h.valueCount > 0 && h.value == bucketIndex) { - h.value = bucketIndex - h.valueCount++ - } else { - h.allocateBuckets() - h.buckets[bucketIndex]++ - } -} - -func (h *histogram) allocateBuckets() { - if h.buckets == nil { - h.buckets = make([]int64, bucketCount) - h.buckets[h.value] = h.valueCount - h.value = 0 - h.valueCount = -1 - } -} - -func log2(i int64) int { - n := 0 - for ; i >= 0x100; i >>= 8 { - n += 8 - } - for ; i > 0; i >>= 1 { - n += 1 - } - return n -} - -func getBucket(i int64) (index int) { - index = log2(i) - 1 - if index < 0 { - index = 0 - } - if index >= bucketCount { - index = bucketCount - 1 - } - return -} - -// Total returns the number of recorded observations. -func (h *histogram) total() (total int64) { - if h.valueCount >= 0 { - total = h.valueCount - } - for _, val := range h.buckets { - total += int64(val) - } - return -} - -// Average returns the average value of recorded observations. -func (h *histogram) average() float64 { - t := h.total() - if t == 0 { - return 0 - } - return float64(h.sum) / float64(t) -} - -// Variance returns the variance of recorded observations. -func (h *histogram) variance() float64 { - t := float64(h.total()) - if t == 0 { - return 0 - } - s := float64(h.sum) / t - return h.sumOfSquares/t - s*s -} - -// StandardDeviation returns the standard deviation of recorded observations. -func (h *histogram) standardDeviation() float64 { - return math.Sqrt(h.variance()) -} - -// PercentileBoundary estimates the value that the given fraction of recorded -// observations are less than. -func (h *histogram) percentileBoundary(percentile float64) int64 { - total := h.total() - - // Corner cases (make sure result is strictly less than Total()) - if total == 0 { - return 0 - } else if total == 1 { - return int64(h.average()) - } - - percentOfTotal := round(float64(total) * percentile) - var runningTotal int64 - - for i := range h.buckets { - value := h.buckets[i] - runningTotal += value - if runningTotal == percentOfTotal { - // We hit an exact bucket boundary. If the next bucket has data, it is a - // good estimate of the value. If the bucket is empty, we interpolate the - // midpoint between the next bucket's boundary and the next non-zero - // bucket. If the remaining buckets are all empty, then we use the - // boundary for the next bucket as the estimate. - j := uint8(i + 1) - min := bucketBoundary(j) - if runningTotal < total { - for h.buckets[j] == 0 { - j++ - } - } - max := bucketBoundary(j) - return min + round(float64(max-min)/2) - } else if runningTotal > percentOfTotal { - // The value is in this bucket. Interpolate the value. - delta := runningTotal - percentOfTotal - percentBucket := float64(value-delta) / float64(value) - bucketMin := bucketBoundary(uint8(i)) - nextBucketMin := bucketBoundary(uint8(i + 1)) - bucketSize := nextBucketMin - bucketMin - return bucketMin + round(percentBucket*float64(bucketSize)) - } - } - return bucketBoundary(bucketCount - 1) -} - -// Median returns the estimated median of the observed values. -func (h *histogram) median() int64 { - return h.percentileBoundary(0.5) -} - -// Add adds other to h. -func (h *histogram) Add(other timeseries.Observable) { - o := other.(*histogram) - if o.valueCount == 0 { - // Other histogram is empty - } else if h.valueCount >= 0 && o.valueCount > 0 && h.value == o.value { - // Both have a single bucketed value, aggregate them - h.valueCount += o.valueCount - } else { - // Two different values necessitate buckets in this histogram - h.allocateBuckets() - if o.valueCount >= 0 { - h.buckets[o.value] += o.valueCount - } else { - for i := range h.buckets { - h.buckets[i] += o.buckets[i] - } - } - } - h.sumOfSquares += o.sumOfSquares - h.sum += o.sum -} - -// Clear resets the histogram to an empty state, removing all observed values. -func (h *histogram) Clear() { - h.buckets = nil - h.value = 0 - h.valueCount = 0 - h.sum = 0 - h.sumOfSquares = 0 -} - -// CopyFrom copies from other, which must be a *histogram, into h. -func (h *histogram) CopyFrom(other timeseries.Observable) { - o := other.(*histogram) - if o.valueCount == -1 { - h.allocateBuckets() - copy(h.buckets, o.buckets) - } - h.sum = o.sum - h.sumOfSquares = o.sumOfSquares - h.value = o.value - h.valueCount = o.valueCount -} - -// Multiply scales the histogram by the specified ratio. -func (h *histogram) Multiply(ratio float64) { - if h.valueCount == -1 { - for i := range h.buckets { - h.buckets[i] = int64(float64(h.buckets[i]) * ratio) - } - } else { - h.valueCount = int64(float64(h.valueCount) * ratio) - } - h.sum = int64(float64(h.sum) * ratio) - h.sumOfSquares = h.sumOfSquares * ratio -} - -// New creates a new histogram. -func (h *histogram) New() timeseries.Observable { - r := new(histogram) - r.Clear() - return r -} - -func (h *histogram) String() string { - return fmt.Sprintf("%d, %f, %d, %d, %v", - h.sum, h.sumOfSquares, h.value, h.valueCount, h.buckets) -} - -// round returns the closest int64 to the argument -func round(in float64) int64 { - return int64(math.Floor(in + 0.5)) -} - -// bucketBoundary returns the first value in the bucket. -func bucketBoundary(bucket uint8) int64 { - if bucket == 0 { - return 0 - } - return 1 << bucket -} - -// bucketData holds data about a specific bucket for use in distTmpl. -type bucketData struct { - Lower, Upper int64 - N int64 - Pct, CumulativePct float64 - GraphWidth int -} - -// data holds data about a Distribution for use in distTmpl. -type data struct { - Buckets []*bucketData - Count, Median int64 - Mean, StandardDeviation float64 -} - -// maxHTMLBarWidth is the maximum width of the HTML bar for visualizing buckets. -const maxHTMLBarWidth = 350.0 - -// newData returns data representing h for use in distTmpl. -func (h *histogram) newData() *data { - // Force the allocation of buckets to simplify the rendering implementation - h.allocateBuckets() - // We scale the bars on the right so that the largest bar is - // maxHTMLBarWidth pixels in width. - maxBucket := int64(0) - for _, n := range h.buckets { - if n > maxBucket { - maxBucket = n - } - } - total := h.total() - barsizeMult := maxHTMLBarWidth / float64(maxBucket) - var pctMult float64 - if total == 0 { - pctMult = 1.0 - } else { - pctMult = 100.0 / float64(total) - } - - buckets := make([]*bucketData, len(h.buckets)) - runningTotal := int64(0) - for i, n := range h.buckets { - if n == 0 { - continue - } - runningTotal += n - var upperBound int64 - if i < bucketCount-1 { - upperBound = bucketBoundary(uint8(i + 1)) - } else { - upperBound = math.MaxInt64 - } - buckets[i] = &bucketData{ - Lower: bucketBoundary(uint8(i)), - Upper: upperBound, - N: n, - Pct: float64(n) * pctMult, - CumulativePct: float64(runningTotal) * pctMult, - GraphWidth: int(float64(n) * barsizeMult), - } - } - return &data{ - Buckets: buckets, - Count: total, - Median: h.median(), - Mean: h.average(), - StandardDeviation: h.standardDeviation(), - } -} - -func (h *histogram) html() template.HTML { - buf := new(bytes.Buffer) - if err := distTmpl().Execute(buf, h.newData()); err != nil { - buf.Reset() - log.Printf("net/trace: couldn't execute template: %v", err) - } - return template.HTML(buf.String()) -} - -var distTmplCache *template.Template -var distTmplOnce sync.Once - -func distTmpl() *template.Template { - distTmplOnce.Do(func() { - // Input: data - distTmplCache = template.Must(template.New("distTmpl").Parse(` - - - - - - - -
Count: {{.Count}}Mean: {{printf "%.0f" .Mean}}StdDev: {{printf "%.0f" .StandardDeviation}}Median: {{.Median}}
-
- -{{range $b := .Buckets}} -{{if $b}} - - - - - - - - - -{{end}} -{{end}} -
[{{.Lower}},{{.Upper}}){{.N}}{{printf "%#.3f" .Pct}}%{{printf "%#.3f" .CumulativePct}}%
-`)) - }) - return distTmplCache -} diff --git a/vendor/golang.org/x/net/trace/trace.go b/vendor/golang.org/x/net/trace/trace.go deleted file mode 100644 index 3d9b64611..000000000 --- a/vendor/golang.org/x/net/trace/trace.go +++ /dev/null @@ -1,1066 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -/* -Package trace implements tracing of requests and long-lived objects. -It exports HTTP interfaces on /debug/requests and /debug/events. - -A trace.Trace provides tracing for short-lived objects, usually requests. -A request handler might be implemented like this: - - func fooHandler(w http.ResponseWriter, req *http.Request) { - tr := trace.New("mypkg.Foo", req.URL.Path) - defer tr.Finish() - ... - tr.LazyPrintf("some event %q happened", str) - ... - if err := somethingImportant(); err != nil { - tr.LazyPrintf("somethingImportant failed: %v", err) - tr.SetError() - } - } - -The /debug/requests HTTP endpoint organizes the traces by family, -errors, and duration. It also provides histogram of request duration -for each family. - -A trace.EventLog provides tracing for long-lived objects, such as RPC -connections. - - // A Fetcher fetches URL paths for a single domain. - type Fetcher struct { - domain string - events trace.EventLog - } - - func NewFetcher(domain string) *Fetcher { - return &Fetcher{ - domain, - trace.NewEventLog("mypkg.Fetcher", domain), - } - } - - func (f *Fetcher) Fetch(path string) (string, error) { - resp, err := http.Get("http://" + f.domain + "/" + path) - if err != nil { - f.events.Errorf("Get(%q) = %v", path, err) - return "", err - } - f.events.Printf("Get(%q) = %s", path, resp.Status) - ... - } - - func (f *Fetcher) Close() error { - f.events.Finish() - return nil - } - -The /debug/events HTTP endpoint organizes the event logs by family and -by time since the last error. The expanded view displays recent log -entries and the log's call stack. -*/ -package trace // import "golang.org/x/net/trace" - -import ( - "bytes" - "fmt" - "html/template" - "io" - "log" - "net" - "net/http" - "runtime" - "sort" - "strconv" - "sync" - "sync/atomic" - "time" - - "golang.org/x/net/internal/timeseries" -) - -// DebugUseAfterFinish controls whether to debug uses of Trace values after finishing. -// FOR DEBUGGING ONLY. This will slow down the program. -var DebugUseAfterFinish = false - -// AuthRequest determines whether a specific request is permitted to load the -// /debug/requests or /debug/events pages. -// -// It returns two bools; the first indicates whether the page may be viewed at all, -// and the second indicates whether sensitive events will be shown. -// -// AuthRequest may be replaced by a program to customize its authorization requirements. -// -// The default AuthRequest function returns (true, true) if and only if the request -// comes from localhost/127.0.0.1/[::1]. -var AuthRequest = func(req *http.Request) (any, sensitive bool) { - // RemoteAddr is commonly in the form "IP" or "IP:port". - // If it is in the form "IP:port", split off the port. - host, _, err := net.SplitHostPort(req.RemoteAddr) - if err != nil { - host = req.RemoteAddr - } - switch host { - case "localhost", "127.0.0.1", "::1": - return true, true - default: - return false, false - } -} - -func init() { - http.HandleFunc("/debug/requests", func(w http.ResponseWriter, req *http.Request) { - any, sensitive := AuthRequest(req) - if !any { - http.Error(w, "not allowed", http.StatusUnauthorized) - return - } - w.Header().Set("Content-Type", "text/html; charset=utf-8") - Render(w, req, sensitive) - }) - http.HandleFunc("/debug/events", func(w http.ResponseWriter, req *http.Request) { - any, sensitive := AuthRequest(req) - if !any { - http.Error(w, "not allowed", http.StatusUnauthorized) - return - } - w.Header().Set("Content-Type", "text/html; charset=utf-8") - RenderEvents(w, req, sensitive) - }) -} - -// Render renders the HTML page typically served at /debug/requests. -// It does not do any auth checking; see AuthRequest for the default auth check -// used by the handler registered on http.DefaultServeMux. -// req may be nil. -func Render(w io.Writer, req *http.Request, sensitive bool) { - data := &struct { - Families []string - ActiveTraceCount map[string]int - CompletedTraces map[string]*family - - // Set when a bucket has been selected. - Traces traceList - Family string - Bucket int - Expanded bool - Traced bool - Active bool - ShowSensitive bool // whether to show sensitive events - - Histogram template.HTML - HistogramWindow string // e.g. "last minute", "last hour", "all time" - - // If non-zero, the set of traces is a partial set, - // and this is the total number. - Total int - }{ - CompletedTraces: completedTraces, - } - - data.ShowSensitive = sensitive - if req != nil { - // Allow show_sensitive=0 to force hiding of sensitive data for testing. - // This only goes one way; you can't use show_sensitive=1 to see things. - if req.FormValue("show_sensitive") == "0" { - data.ShowSensitive = false - } - - if exp, err := strconv.ParseBool(req.FormValue("exp")); err == nil { - data.Expanded = exp - } - if exp, err := strconv.ParseBool(req.FormValue("rtraced")); err == nil { - data.Traced = exp - } - } - - completedMu.RLock() - data.Families = make([]string, 0, len(completedTraces)) - for fam := range completedTraces { - data.Families = append(data.Families, fam) - } - completedMu.RUnlock() - sort.Strings(data.Families) - - // We are careful here to minimize the time spent locking activeMu, - // since that lock is required every time an RPC starts and finishes. - data.ActiveTraceCount = make(map[string]int, len(data.Families)) - activeMu.RLock() - for fam, s := range activeTraces { - data.ActiveTraceCount[fam] = s.Len() - } - activeMu.RUnlock() - - var ok bool - data.Family, data.Bucket, ok = parseArgs(req) - switch { - case !ok: - // No-op - case data.Bucket == -1: - data.Active = true - n := data.ActiveTraceCount[data.Family] - data.Traces = getActiveTraces(data.Family) - if len(data.Traces) < n { - data.Total = n - } - case data.Bucket < bucketsPerFamily: - if b := lookupBucket(data.Family, data.Bucket); b != nil { - data.Traces = b.Copy(data.Traced) - } - default: - if f := getFamily(data.Family, false); f != nil { - var obs timeseries.Observable - f.LatencyMu.RLock() - switch o := data.Bucket - bucketsPerFamily; o { - case 0: - obs = f.Latency.Minute() - data.HistogramWindow = "last minute" - case 1: - obs = f.Latency.Hour() - data.HistogramWindow = "last hour" - case 2: - obs = f.Latency.Total() - data.HistogramWindow = "all time" - } - f.LatencyMu.RUnlock() - if obs != nil { - data.Histogram = obs.(*histogram).html() - } - } - } - - if data.Traces != nil { - defer data.Traces.Free() - sort.Sort(data.Traces) - } - - completedMu.RLock() - defer completedMu.RUnlock() - if err := pageTmpl().ExecuteTemplate(w, "Page", data); err != nil { - log.Printf("net/trace: Failed executing template: %v", err) - } -} - -func parseArgs(req *http.Request) (fam string, b int, ok bool) { - if req == nil { - return "", 0, false - } - fam, bStr := req.FormValue("fam"), req.FormValue("b") - if fam == "" || bStr == "" { - return "", 0, false - } - b, err := strconv.Atoi(bStr) - if err != nil || b < -1 { - return "", 0, false - } - - return fam, b, true -} - -func lookupBucket(fam string, b int) *traceBucket { - f := getFamily(fam, false) - if f == nil || b < 0 || b >= len(f.Buckets) { - return nil - } - return f.Buckets[b] -} - -type contextKeyT string - -var contextKey = contextKeyT("golang.org/x/net/trace.Trace") - -// Trace represents an active request. -type Trace interface { - // LazyLog adds x to the event log. It will be evaluated each time the - // /debug/requests page is rendered. Any memory referenced by x will be - // pinned until the trace is finished and later discarded. - LazyLog(x fmt.Stringer, sensitive bool) - - // LazyPrintf evaluates its arguments with fmt.Sprintf each time the - // /debug/requests page is rendered. Any memory referenced by a will be - // pinned until the trace is finished and later discarded. - LazyPrintf(format string, a ...interface{}) - - // SetError declares that this trace resulted in an error. - SetError() - - // SetRecycler sets a recycler for the trace. - // f will be called for each event passed to LazyLog at a time when - // it is no longer required, whether while the trace is still active - // and the event is discarded, or when a completed trace is discarded. - SetRecycler(f func(interface{})) - - // SetTraceInfo sets the trace info for the trace. - // This is currently unused. - SetTraceInfo(traceID, spanID uint64) - - // SetMaxEvents sets the maximum number of events that will be stored - // in the trace. This has no effect if any events have already been - // added to the trace. - SetMaxEvents(m int) - - // Finish declares that this trace is complete. - // The trace should not be used after calling this method. - Finish() -} - -type lazySprintf struct { - format string - a []interface{} -} - -func (l *lazySprintf) String() string { - return fmt.Sprintf(l.format, l.a...) -} - -// New returns a new Trace with the specified family and title. -func New(family, title string) Trace { - tr := newTrace() - tr.ref() - tr.Family, tr.Title = family, title - tr.Start = time.Now() - tr.maxEvents = maxEventsPerTrace - tr.events = tr.eventsBuf[:0] - - activeMu.RLock() - s := activeTraces[tr.Family] - activeMu.RUnlock() - if s == nil { - activeMu.Lock() - s = activeTraces[tr.Family] // check again - if s == nil { - s = new(traceSet) - activeTraces[tr.Family] = s - } - activeMu.Unlock() - } - s.Add(tr) - - // Trigger allocation of the completed trace structure for this family. - // This will cause the family to be present in the request page during - // the first trace of this family. We don't care about the return value, - // nor is there any need for this to run inline, so we execute it in its - // own goroutine, but only if the family isn't allocated yet. - completedMu.RLock() - if _, ok := completedTraces[tr.Family]; !ok { - go allocFamily(tr.Family) - } - completedMu.RUnlock() - - return tr -} - -func (tr *trace) Finish() { - tr.Elapsed = time.Now().Sub(tr.Start) - if DebugUseAfterFinish { - buf := make([]byte, 4<<10) // 4 KB should be enough - n := runtime.Stack(buf, false) - tr.finishStack = buf[:n] - } - - activeMu.RLock() - m := activeTraces[tr.Family] - activeMu.RUnlock() - m.Remove(tr) - - f := getFamily(tr.Family, true) - for _, b := range f.Buckets { - if b.Cond.match(tr) { - b.Add(tr) - } - } - // Add a sample of elapsed time as microseconds to the family's timeseries - h := new(histogram) - h.addMeasurement(tr.Elapsed.Nanoseconds() / 1e3) - f.LatencyMu.Lock() - f.Latency.Add(h) - f.LatencyMu.Unlock() - - tr.unref() // matches ref in New -} - -const ( - bucketsPerFamily = 9 - tracesPerBucket = 10 - maxActiveTraces = 20 // Maximum number of active traces to show. - maxEventsPerTrace = 10 - numHistogramBuckets = 38 -) - -var ( - // The active traces. - activeMu sync.RWMutex - activeTraces = make(map[string]*traceSet) // family -> traces - - // Families of completed traces. - completedMu sync.RWMutex - completedTraces = make(map[string]*family) // family -> traces -) - -type traceSet struct { - mu sync.RWMutex - m map[*trace]bool - - // We could avoid the entire map scan in FirstN by having a slice of all the traces - // ordered by start time, and an index into that from the trace struct, with a periodic - // repack of the slice after enough traces finish; we could also use a skip list or similar. - // However, that would shift some of the expense from /debug/requests time to RPC time, - // which is probably the wrong trade-off. -} - -func (ts *traceSet) Len() int { - ts.mu.RLock() - defer ts.mu.RUnlock() - return len(ts.m) -} - -func (ts *traceSet) Add(tr *trace) { - ts.mu.Lock() - if ts.m == nil { - ts.m = make(map[*trace]bool) - } - ts.m[tr] = true - ts.mu.Unlock() -} - -func (ts *traceSet) Remove(tr *trace) { - ts.mu.Lock() - delete(ts.m, tr) - ts.mu.Unlock() -} - -// FirstN returns the first n traces ordered by time. -func (ts *traceSet) FirstN(n int) traceList { - ts.mu.RLock() - defer ts.mu.RUnlock() - - if n > len(ts.m) { - n = len(ts.m) - } - trl := make(traceList, 0, n) - - // Fast path for when no selectivity is needed. - if n == len(ts.m) { - for tr := range ts.m { - tr.ref() - trl = append(trl, tr) - } - sort.Sort(trl) - return trl - } - - // Pick the oldest n traces. - // This is inefficient. See the comment in the traceSet struct. - for tr := range ts.m { - // Put the first n traces into trl in the order they occur. - // When we have n, sort trl, and thereafter maintain its order. - if len(trl) < n { - tr.ref() - trl = append(trl, tr) - if len(trl) == n { - // This is guaranteed to happen exactly once during this loop. - sort.Sort(trl) - } - continue - } - if tr.Start.After(trl[n-1].Start) { - continue - } - - // Find where to insert this one. - tr.ref() - i := sort.Search(n, func(i int) bool { return trl[i].Start.After(tr.Start) }) - trl[n-1].unref() - copy(trl[i+1:], trl[i:]) - trl[i] = tr - } - - return trl -} - -func getActiveTraces(fam string) traceList { - activeMu.RLock() - s := activeTraces[fam] - activeMu.RUnlock() - if s == nil { - return nil - } - return s.FirstN(maxActiveTraces) -} - -func getFamily(fam string, allocNew bool) *family { - completedMu.RLock() - f := completedTraces[fam] - completedMu.RUnlock() - if f == nil && allocNew { - f = allocFamily(fam) - } - return f -} - -func allocFamily(fam string) *family { - completedMu.Lock() - defer completedMu.Unlock() - f := completedTraces[fam] - if f == nil { - f = newFamily() - completedTraces[fam] = f - } - return f -} - -// family represents a set of trace buckets and associated latency information. -type family struct { - // traces may occur in multiple buckets. - Buckets [bucketsPerFamily]*traceBucket - - // latency time series - LatencyMu sync.RWMutex - Latency *timeseries.MinuteHourSeries -} - -func newFamily() *family { - return &family{ - Buckets: [bucketsPerFamily]*traceBucket{ - {Cond: minCond(0)}, - {Cond: minCond(50 * time.Millisecond)}, - {Cond: minCond(100 * time.Millisecond)}, - {Cond: minCond(200 * time.Millisecond)}, - {Cond: minCond(500 * time.Millisecond)}, - {Cond: minCond(1 * time.Second)}, - {Cond: minCond(10 * time.Second)}, - {Cond: minCond(100 * time.Second)}, - {Cond: errorCond{}}, - }, - Latency: timeseries.NewMinuteHourSeries(func() timeseries.Observable { return new(histogram) }), - } -} - -// traceBucket represents a size-capped bucket of historic traces, -// along with a condition for a trace to belong to the bucket. -type traceBucket struct { - Cond cond - - // Ring buffer implementation of a fixed-size FIFO queue. - mu sync.RWMutex - buf [tracesPerBucket]*trace - start int // < tracesPerBucket - length int // <= tracesPerBucket -} - -func (b *traceBucket) Add(tr *trace) { - b.mu.Lock() - defer b.mu.Unlock() - - i := b.start + b.length - if i >= tracesPerBucket { - i -= tracesPerBucket - } - if b.length == tracesPerBucket { - // "Remove" an element from the bucket. - b.buf[i].unref() - b.start++ - if b.start == tracesPerBucket { - b.start = 0 - } - } - b.buf[i] = tr - if b.length < tracesPerBucket { - b.length++ - } - tr.ref() -} - -// Copy returns a copy of the traces in the bucket. -// If tracedOnly is true, only the traces with trace information will be returned. -// The logs will be ref'd before returning; the caller should call -// the Free method when it is done with them. -// TODO(dsymonds): keep track of traced requests in separate buckets. -func (b *traceBucket) Copy(tracedOnly bool) traceList { - b.mu.RLock() - defer b.mu.RUnlock() - - trl := make(traceList, 0, b.length) - for i, x := 0, b.start; i < b.length; i++ { - tr := b.buf[x] - if !tracedOnly || tr.spanID != 0 { - tr.ref() - trl = append(trl, tr) - } - x++ - if x == b.length { - x = 0 - } - } - return trl -} - -func (b *traceBucket) Empty() bool { - b.mu.RLock() - defer b.mu.RUnlock() - return b.length == 0 -} - -// cond represents a condition on a trace. -type cond interface { - match(t *trace) bool - String() string -} - -type minCond time.Duration - -func (m minCond) match(t *trace) bool { return t.Elapsed >= time.Duration(m) } -func (m minCond) String() string { return fmt.Sprintf("≥%gs", time.Duration(m).Seconds()) } - -type errorCond struct{} - -func (e errorCond) match(t *trace) bool { return t.IsError } -func (e errorCond) String() string { return "errors" } - -type traceList []*trace - -// Free calls unref on each element of the list. -func (trl traceList) Free() { - for _, t := range trl { - t.unref() - } -} - -// traceList may be sorted in reverse chronological order. -func (trl traceList) Len() int { return len(trl) } -func (trl traceList) Less(i, j int) bool { return trl[i].Start.After(trl[j].Start) } -func (trl traceList) Swap(i, j int) { trl[i], trl[j] = trl[j], trl[i] } - -// An event is a timestamped log entry in a trace. -type event struct { - When time.Time - Elapsed time.Duration // since previous event in trace - NewDay bool // whether this event is on a different day to the previous event - Recyclable bool // whether this event was passed via LazyLog - Sensitive bool // whether this event contains sensitive information - What interface{} // string or fmt.Stringer -} - -// WhenString returns a string representation of the elapsed time of the event. -// It will include the date if midnight was crossed. -func (e event) WhenString() string { - if e.NewDay { - return e.When.Format("2006/01/02 15:04:05.000000") - } - return e.When.Format("15:04:05.000000") -} - -// discarded represents a number of discarded events. -// It is stored as *discarded to make it easier to update in-place. -type discarded int - -func (d *discarded) String() string { - return fmt.Sprintf("(%d events discarded)", int(*d)) -} - -// trace represents an active or complete request, -// either sent or received by this program. -type trace struct { - // Family is the top-level grouping of traces to which this belongs. - Family string - - // Title is the title of this trace. - Title string - - // Timing information. - Start time.Time - Elapsed time.Duration // zero while active - - // Trace information if non-zero. - traceID uint64 - spanID uint64 - - // Whether this trace resulted in an error. - IsError bool - - // Append-only sequence of events (modulo discards). - mu sync.RWMutex - events []event - maxEvents int - - refs int32 // how many buckets this is in - recycler func(interface{}) - disc discarded // scratch space to avoid allocation - - finishStack []byte // where finish was called, if DebugUseAfterFinish is set - - eventsBuf [4]event // preallocated buffer in case we only log a few events -} - -func (tr *trace) reset() { - // Clear all but the mutex. Mutexes may not be copied, even when unlocked. - tr.Family = "" - tr.Title = "" - tr.Start = time.Time{} - tr.Elapsed = 0 - tr.traceID = 0 - tr.spanID = 0 - tr.IsError = false - tr.maxEvents = 0 - tr.events = nil - tr.refs = 0 - tr.recycler = nil - tr.disc = 0 - tr.finishStack = nil - for i := range tr.eventsBuf { - tr.eventsBuf[i] = event{} - } -} - -// delta returns the elapsed time since the last event or the trace start, -// and whether it spans midnight. -// L >= tr.mu -func (tr *trace) delta(t time.Time) (time.Duration, bool) { - if len(tr.events) == 0 { - return t.Sub(tr.Start), false - } - prev := tr.events[len(tr.events)-1].When - return t.Sub(prev), prev.Day() != t.Day() -} - -func (tr *trace) addEvent(x interface{}, recyclable, sensitive bool) { - if DebugUseAfterFinish && tr.finishStack != nil { - buf := make([]byte, 4<<10) // 4 KB should be enough - n := runtime.Stack(buf, false) - log.Printf("net/trace: trace used after finish:\nFinished at:\n%s\nUsed at:\n%s", tr.finishStack, buf[:n]) - } - - /* - NOTE TO DEBUGGERS - - If you are here because your program panicked in this code, - it is almost definitely the fault of code using this package, - and very unlikely to be the fault of this code. - - The most likely scenario is that some code elsewhere is using - a trace.Trace after its Finish method is called. - You can temporarily set the DebugUseAfterFinish var - to help discover where that is; do not leave that var set, - since it makes this package much less efficient. - */ - - e := event{When: time.Now(), What: x, Recyclable: recyclable, Sensitive: sensitive} - tr.mu.Lock() - e.Elapsed, e.NewDay = tr.delta(e.When) - if len(tr.events) < tr.maxEvents { - tr.events = append(tr.events, e) - } else { - // Discard the middle events. - di := int((tr.maxEvents - 1) / 2) - if d, ok := tr.events[di].What.(*discarded); ok { - (*d)++ - } else { - // disc starts at two to count for the event it is replacing, - // plus the next one that we are about to drop. - tr.disc = 2 - if tr.recycler != nil && tr.events[di].Recyclable { - go tr.recycler(tr.events[di].What) - } - tr.events[di].What = &tr.disc - } - // The timestamp of the discarded meta-event should be - // the time of the last event it is representing. - tr.events[di].When = tr.events[di+1].When - - if tr.recycler != nil && tr.events[di+1].Recyclable { - go tr.recycler(tr.events[di+1].What) - } - copy(tr.events[di+1:], tr.events[di+2:]) - tr.events[tr.maxEvents-1] = e - } - tr.mu.Unlock() -} - -func (tr *trace) LazyLog(x fmt.Stringer, sensitive bool) { - tr.addEvent(x, true, sensitive) -} - -func (tr *trace) LazyPrintf(format string, a ...interface{}) { - tr.addEvent(&lazySprintf{format, a}, false, false) -} - -func (tr *trace) SetError() { tr.IsError = true } - -func (tr *trace) SetRecycler(f func(interface{})) { - tr.recycler = f -} - -func (tr *trace) SetTraceInfo(traceID, spanID uint64) { - tr.traceID, tr.spanID = traceID, spanID -} - -func (tr *trace) SetMaxEvents(m int) { - // Always keep at least three events: first, discarded count, last. - if len(tr.events) == 0 && m > 3 { - tr.maxEvents = m - } -} - -func (tr *trace) ref() { - atomic.AddInt32(&tr.refs, 1) -} - -func (tr *trace) unref() { - if atomic.AddInt32(&tr.refs, -1) == 0 { - if tr.recycler != nil { - // freeTrace clears tr, so we hold tr.recycler and tr.events here. - go func(f func(interface{}), es []event) { - for _, e := range es { - if e.Recyclable { - f(e.What) - } - } - }(tr.recycler, tr.events) - } - - freeTrace(tr) - } -} - -func (tr *trace) When() string { - return tr.Start.Format("2006/01/02 15:04:05.000000") -} - -func (tr *trace) ElapsedTime() string { - t := tr.Elapsed - if t == 0 { - // Active trace. - t = time.Since(tr.Start) - } - return fmt.Sprintf("%.6f", t.Seconds()) -} - -func (tr *trace) Events() []event { - tr.mu.RLock() - defer tr.mu.RUnlock() - return tr.events -} - -var traceFreeList = make(chan *trace, 1000) // TODO(dsymonds): Use sync.Pool? - -// newTrace returns a trace ready to use. -func newTrace() *trace { - select { - case tr := <-traceFreeList: - return tr - default: - return new(trace) - } -} - -// freeTrace adds tr to traceFreeList if there's room. -// This is non-blocking. -func freeTrace(tr *trace) { - if DebugUseAfterFinish { - return // never reuse - } - tr.reset() - select { - case traceFreeList <- tr: - default: - } -} - -func elapsed(d time.Duration) string { - b := []byte(fmt.Sprintf("%.6f", d.Seconds())) - - // For subsecond durations, blank all zeros before decimal point, - // and all zeros between the decimal point and the first non-zero digit. - if d < time.Second { - dot := bytes.IndexByte(b, '.') - for i := 0; i < dot; i++ { - b[i] = ' ' - } - for i := dot + 1; i < len(b); i++ { - if b[i] == '0' { - b[i] = ' ' - } else { - break - } - } - } - - return string(b) -} - -var pageTmplCache *template.Template -var pageTmplOnce sync.Once - -func pageTmpl() *template.Template { - pageTmplOnce.Do(func() { - pageTmplCache = template.Must(template.New("Page").Funcs(template.FuncMap{ - "elapsed": elapsed, - "add": func(a, b int) int { return a + b }, - }).Parse(pageHTML)) - }) - return pageTmplCache -} - -const pageHTML = ` -{{template "Prolog" .}} -{{template "StatusTable" .}} -{{template "Epilog" .}} - -{{define "Prolog"}} - - - /debug/requests - - - - -

/debug/requests

-{{end}} {{/* end of Prolog */}} - -{{define "StatusTable"}} - - {{range $fam := .Families}} - - - - {{$n := index $.ActiveTraceCount $fam}} - - - {{$f := index $.CompletedTraces $fam}} - {{range $i, $b := $f.Buckets}} - {{$empty := $b.Empty}} - - {{end}} - - {{$nb := len $f.Buckets}} - - - - - - {{end}} -
{{$fam}} - {{if $n}}{{end}} - [{{$n}} active] - {{if $n}}{{end}} - - {{if not $empty}}{{end}} - [{{.Cond}}] - {{if not $empty}}{{end}} - - [minute] - - [hour] - - [total] -
-{{end}} {{/* end of StatusTable */}} - -{{define "Epilog"}} -{{if $.Traces}} -
-

Family: {{$.Family}}

- -{{if or $.Expanded $.Traced}} - [Normal/Summary] -{{else}} - [Normal/Summary] -{{end}} - -{{if or (not $.Expanded) $.Traced}} - [Normal/Expanded] -{{else}} - [Normal/Expanded] -{{end}} - -{{if not $.Active}} - {{if or $.Expanded (not $.Traced)}} - [Traced/Summary] - {{else}} - [Traced/Summary] - {{end}} - {{if or (not $.Expanded) (not $.Traced)}} - [Traced/Expanded] - {{else}} - [Traced/Expanded] - {{end}} -{{end}} - -{{if $.Total}} -

Showing {{len $.Traces}} of {{$.Total}} traces.

-{{end}} - - - - - {{range $tr := $.Traces}} - - - - - {{/* TODO: include traceID/spanID */}} - - {{if $.Expanded}} - {{range $tr.Events}} - - - - - - {{end}} - {{end}} - {{end}} -
- {{if $.Active}}Active{{else}}Completed{{end}} Requests -
WhenElapsed (s)
{{$tr.When}}{{$tr.ElapsedTime}}{{$tr.Title}}
{{.WhenString}}{{elapsed .Elapsed}}{{if or $.ShowSensitive (not .Sensitive)}}... {{.What}}{{else}}[redacted]{{end}}
-{{end}} {{/* if $.Traces */}} - -{{if $.Histogram}} -

Latency (µs) of {{$.Family}} over {{$.HistogramWindow}}

-{{$.Histogram}} -{{end}} {{/* if $.Histogram */}} - - - -{{end}} {{/* end of Epilog */}} -` diff --git a/vendor/golang.org/x/net/trace/trace_go16.go b/vendor/golang.org/x/net/trace/trace_go16.go deleted file mode 100644 index d60819118..000000000 --- a/vendor/golang.org/x/net/trace/trace_go16.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !go1.7 - -package trace - -import "golang.org/x/net/context" - -// NewContext returns a copy of the parent context -// and associates it with a Trace. -func NewContext(ctx context.Context, tr Trace) context.Context { - return context.WithValue(ctx, contextKey, tr) -} - -// FromContext returns the Trace bound to the context, if any. -func FromContext(ctx context.Context) (tr Trace, ok bool) { - tr, ok = ctx.Value(contextKey).(Trace) - return -} diff --git a/vendor/golang.org/x/net/trace/trace_go17.go b/vendor/golang.org/x/net/trace/trace_go17.go deleted file mode 100644 index df6e1fba7..000000000 --- a/vendor/golang.org/x/net/trace/trace_go17.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build go1.7 - -package trace - -import "context" - -// NewContext returns a copy of the parent context -// and associates it with a Trace. -func NewContext(ctx context.Context, tr Trace) context.Context { - return context.WithValue(ctx, contextKey, tr) -} - -// FromContext returns the Trace bound to the context, if any. -func FromContext(ctx context.Context) (tr Trace, ok bool) { - tr, ok = ctx.Value(contextKey).(Trace) - return -} diff --git a/vendor/golang.org/x/text/LICENSE b/vendor/golang.org/x/text/LICENSE deleted file mode 100644 index 6a66aea5e..000000000 --- a/vendor/golang.org/x/text/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2009 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * 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. - * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT -OWNER 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. diff --git a/vendor/golang.org/x/text/PATENTS b/vendor/golang.org/x/text/PATENTS deleted file mode 100644 index 733099041..000000000 --- a/vendor/golang.org/x/text/PATENTS +++ /dev/null @@ -1,22 +0,0 @@ -Additional IP Rights Grant (Patents) - -"This implementation" means the copyrightable works distributed by -Google as part of the Go project. - -Google hereby grants to You a perpetual, worldwide, non-exclusive, -no-charge, royalty-free, irrevocable (except as stated in this section) -patent license to make, have made, use, offer to sell, sell, import, -transfer and otherwise run, modify and propagate the contents of this -implementation of Go, where such license applies only to those patent -claims, both currently owned or controlled by Google and acquired in -the future, licensable by Google that are necessarily infringed by this -implementation of Go. This grant does not include claims that would be -infringed only as a consequence of further modification of this -implementation. If you or your agent or exclusive licensee institute or -order or agree to the institution of patent litigation against any -entity (including a cross-claim or counterclaim in a lawsuit) alleging -that this implementation of Go or any code incorporated within this -implementation of Go constitutes direct or contributory patent -infringement, or inducement of patent infringement, then any patent -rights granted to you under this License for this implementation of Go -shall terminate as of the date such litigation is filed. diff --git a/vendor/golang.org/x/text/secure/bidirule/bidirule.go b/vendor/golang.org/x/text/secure/bidirule/bidirule.go deleted file mode 100644 index a7161bdd9..000000000 --- a/vendor/golang.org/x/text/secure/bidirule/bidirule.go +++ /dev/null @@ -1,342 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package bidirule implements the Bidi Rule defined by RFC 5893. -// -// This package is under development. The API may change without notice and -// without preserving backward compatibility. -package bidirule - -import ( - "errors" - "unicode/utf8" - - "golang.org/x/text/transform" - "golang.org/x/text/unicode/bidi" -) - -// This file contains an implementation of RFC 5893: Right-to-Left Scripts for -// Internationalized Domain Names for Applications (IDNA) -// -// A label is an individual component of a domain name. Labels are usually -// shown separated by dots; for example, the domain name "www.example.com" is -// composed of three labels: "www", "example", and "com". -// -// An RTL label is a label that contains at least one character of class R, AL, -// or AN. An LTR label is any label that is not an RTL label. -// -// A "Bidi domain name" is a domain name that contains at least one RTL label. -// -// The following guarantees can be made based on the above: -// -// o In a domain name consisting of only labels that satisfy the rule, -// the requirements of Section 3 are satisfied. Note that even LTR -// labels and pure ASCII labels have to be tested. -// -// o In a domain name consisting of only LDH labels (as defined in the -// Definitions document [RFC5890]) and labels that satisfy the rule, -// the requirements of Section 3 are satisfied as long as a label -// that starts with an ASCII digit does not come after a -// right-to-left label. -// -// No guarantee is given for other combinations. - -// ErrInvalid indicates a label is invalid according to the Bidi Rule. -var ErrInvalid = errors.New("bidirule: failed Bidi Rule") - -type ruleState uint8 - -const ( - ruleInitial ruleState = iota - ruleLTR - ruleLTRFinal - ruleRTL - ruleRTLFinal - ruleInvalid -) - -type ruleTransition struct { - next ruleState - mask uint16 -} - -var transitions = [...][2]ruleTransition{ - // [2.1] The first character must be a character with Bidi property L, R, or - // AL. If it has the R or AL property, it is an RTL label; if it has the L - // property, it is an LTR label. - ruleInitial: { - {ruleLTRFinal, 1 << bidi.L}, - {ruleRTLFinal, 1< 0 bytes returned - // before considering the error". - if r.src0 != r.src1 || r.err != nil { - r.dst0 = 0 - r.dst1, n, err = r.t.Transform(r.dst, r.src[r.src0:r.src1], r.err == io.EOF) - r.src0 += n - - switch { - case err == nil: - if r.src0 != r.src1 { - r.err = errInconsistentByteCount - } - // The Transform call was successful; we are complete if we - // cannot read more bytes into src. - r.transformComplete = r.err != nil - continue - case err == ErrShortDst && (r.dst1 != 0 || n != 0): - // Make room in dst by copying out, and try again. - continue - case err == ErrShortSrc && r.src1-r.src0 != len(r.src) && r.err == nil: - // Read more bytes into src via the code below, and try again. - default: - r.transformComplete = true - // The reader error (r.err) takes precedence over the - // transformer error (err) unless r.err is nil or io.EOF. - if r.err == nil || r.err == io.EOF { - r.err = err - } - continue - } - } - - // Move any untransformed source bytes to the start of the buffer - // and read more bytes. - if r.src0 != 0 { - r.src0, r.src1 = 0, copy(r.src, r.src[r.src0:r.src1]) - } - n, r.err = r.r.Read(r.src[r.src1:]) - r.src1 += n - } -} - -// TODO: implement ReadByte (and ReadRune??). - -// Writer wraps another io.Writer by transforming the bytes read. -// The user needs to call Close to flush unwritten bytes that may -// be buffered. -type Writer struct { - w io.Writer - t Transformer - dst []byte - - // src[:n] contains bytes that have not yet passed through t. - src []byte - n int -} - -// NewWriter returns a new Writer that wraps w by transforming the bytes written -// via t. It calls Reset on t. -func NewWriter(w io.Writer, t Transformer) *Writer { - t.Reset() - return &Writer{ - w: w, - t: t, - dst: make([]byte, defaultBufSize), - src: make([]byte, defaultBufSize), - } -} - -// Write implements the io.Writer interface. If there are not enough -// bytes available to complete a Transform, the bytes will be buffered -// for the next write. Call Close to convert the remaining bytes. -func (w *Writer) Write(data []byte) (n int, err error) { - src := data - if w.n > 0 { - // Append bytes from data to the last remainder. - // TODO: limit the amount copied on first try. - n = copy(w.src[w.n:], data) - w.n += n - src = w.src[:w.n] - } - for { - nDst, nSrc, err := w.t.Transform(w.dst, src, false) - if _, werr := w.w.Write(w.dst[:nDst]); werr != nil { - return n, werr - } - src = src[nSrc:] - if w.n == 0 { - n += nSrc - } else if len(src) <= n { - // Enough bytes from w.src have been consumed. We make src point - // to data instead to reduce the copying. - w.n = 0 - n -= len(src) - src = data[n:] - if n < len(data) && (err == nil || err == ErrShortSrc) { - continue - } - } - switch err { - case ErrShortDst: - // This error is okay as long as we are making progress. - if nDst > 0 || nSrc > 0 { - continue - } - case ErrShortSrc: - if len(src) < len(w.src) { - m := copy(w.src, src) - // If w.n > 0, bytes from data were already copied to w.src and n - // was already set to the number of bytes consumed. - if w.n == 0 { - n += m - } - w.n = m - err = nil - } else if nDst > 0 || nSrc > 0 { - // Not enough buffer to store the remainder. Keep processing as - // long as there is progress. Without this case, transforms that - // require a lookahead larger than the buffer may result in an - // error. This is not something one may expect to be common in - // practice, but it may occur when buffers are set to small - // sizes during testing. - continue - } - case nil: - if w.n > 0 { - err = errInconsistentByteCount - } - } - return n, err - } -} - -// Close implements the io.Closer interface. -func (w *Writer) Close() error { - src := w.src[:w.n] - for { - nDst, nSrc, err := w.t.Transform(w.dst, src, true) - if _, werr := w.w.Write(w.dst[:nDst]); werr != nil { - return werr - } - if err != ErrShortDst { - return err - } - src = src[nSrc:] - } -} - -type nop struct{ NopResetter } - -func (nop) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - n := copy(dst, src) - if n < len(src) { - err = ErrShortDst - } - return n, n, err -} - -func (nop) Span(src []byte, atEOF bool) (n int, err error) { - return len(src), nil -} - -type discard struct{ NopResetter } - -func (discard) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - return 0, len(src), nil -} - -var ( - // Discard is a Transformer for which all Transform calls succeed - // by consuming all bytes and writing nothing. - Discard Transformer = discard{} - - // Nop is a SpanningTransformer that copies src to dst. - Nop SpanningTransformer = nop{} -) - -// chain is a sequence of links. A chain with N Transformers has N+1 links and -// N+1 buffers. Of those N+1 buffers, the first and last are the src and dst -// buffers given to chain.Transform and the middle N-1 buffers are intermediate -// buffers owned by the chain. The i'th link transforms bytes from the i'th -// buffer chain.link[i].b at read offset chain.link[i].p to the i+1'th buffer -// chain.link[i+1].b at write offset chain.link[i+1].n, for i in [0, N). -type chain struct { - link []link - err error - // errStart is the index at which the error occurred plus 1. Processing - // errStart at this level at the next call to Transform. As long as - // errStart > 0, chain will not consume any more source bytes. - errStart int -} - -func (c *chain) fatalError(errIndex int, err error) { - if i := errIndex + 1; i > c.errStart { - c.errStart = i - c.err = err - } -} - -type link struct { - t Transformer - // b[p:n] holds the bytes to be transformed by t. - b []byte - p int - n int -} - -func (l *link) src() []byte { - return l.b[l.p:l.n] -} - -func (l *link) dst() []byte { - return l.b[l.n:] -} - -// Chain returns a Transformer that applies t in sequence. -func Chain(t ...Transformer) Transformer { - if len(t) == 0 { - return nop{} - } - c := &chain{link: make([]link, len(t)+1)} - for i, tt := range t { - c.link[i].t = tt - } - // Allocate intermediate buffers. - b := make([][defaultBufSize]byte, len(t)-1) - for i := range b { - c.link[i+1].b = b[i][:] - } - return c -} - -// Reset resets the state of Chain. It calls Reset on all the Transformers. -func (c *chain) Reset() { - for i, l := range c.link { - if l.t != nil { - l.t.Reset() - } - c.link[i].p, c.link[i].n = 0, 0 - } -} - -// TODO: make chain use Span (is going to be fun to implement!) - -// Transform applies the transformers of c in sequence. -func (c *chain) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - // Set up src and dst in the chain. - srcL := &c.link[0] - dstL := &c.link[len(c.link)-1] - srcL.b, srcL.p, srcL.n = src, 0, len(src) - dstL.b, dstL.n = dst, 0 - var lastFull, needProgress bool // for detecting progress - - // i is the index of the next Transformer to apply, for i in [low, high]. - // low is the lowest index for which c.link[low] may still produce bytes. - // high is the highest index for which c.link[high] has a Transformer. - // The error returned by Transform determines whether to increase or - // decrease i. We try to completely fill a buffer before converting it. - for low, i, high := c.errStart, c.errStart, len(c.link)-2; low <= i && i <= high; { - in, out := &c.link[i], &c.link[i+1] - nDst, nSrc, err0 := in.t.Transform(out.dst(), in.src(), atEOF && low == i) - out.n += nDst - in.p += nSrc - if i > 0 && in.p == in.n { - in.p, in.n = 0, 0 - } - needProgress, lastFull = lastFull, false - switch err0 { - case ErrShortDst: - // Process the destination buffer next. Return if we are already - // at the high index. - if i == high { - return dstL.n, srcL.p, ErrShortDst - } - if out.n != 0 { - i++ - // If the Transformer at the next index is not able to process any - // source bytes there is nothing that can be done to make progress - // and the bytes will remain unprocessed. lastFull is used to - // detect this and break out of the loop with a fatal error. - lastFull = true - continue - } - // The destination buffer was too small, but is completely empty. - // Return a fatal error as this transformation can never complete. - c.fatalError(i, errShortInternal) - case ErrShortSrc: - if i == 0 { - // Save ErrShortSrc in err. All other errors take precedence. - err = ErrShortSrc - break - } - // Source bytes were depleted before filling up the destination buffer. - // Verify we made some progress, move the remaining bytes to the errStart - // and try to get more source bytes. - if needProgress && nSrc == 0 || in.n-in.p == len(in.b) { - // There were not enough source bytes to proceed while the source - // buffer cannot hold any more bytes. Return a fatal error as this - // transformation can never complete. - c.fatalError(i, errShortInternal) - break - } - // in.b is an internal buffer and we can make progress. - in.p, in.n = 0, copy(in.b, in.src()) - fallthrough - case nil: - // if i == low, we have depleted the bytes at index i or any lower levels. - // In that case we increase low and i. In all other cases we decrease i to - // fetch more bytes before proceeding to the next index. - if i > low { - i-- - continue - } - default: - c.fatalError(i, err0) - } - // Exhausted level low or fatal error: increase low and continue - // to process the bytes accepted so far. - i++ - low = i - } - - // If c.errStart > 0, this means we found a fatal error. We will clear - // all upstream buffers. At this point, no more progress can be made - // downstream, as Transform would have bailed while handling ErrShortDst. - if c.errStart > 0 { - for i := 1; i < c.errStart; i++ { - c.link[i].p, c.link[i].n = 0, 0 - } - err, c.errStart, c.err = c.err, 0, nil - } - return dstL.n, srcL.p, err -} - -// Deprecated: use runes.Remove instead. -func RemoveFunc(f func(r rune) bool) Transformer { - return removeF(f) -} - -type removeF func(r rune) bool - -func (removeF) Reset() {} - -// Transform implements the Transformer interface. -func (t removeF) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - for r, sz := rune(0), 0; len(src) > 0; src = src[sz:] { - - if r = rune(src[0]); r < utf8.RuneSelf { - sz = 1 - } else { - r, sz = utf8.DecodeRune(src) - - if sz == 1 { - // Invalid rune. - if !atEOF && !utf8.FullRune(src) { - err = ErrShortSrc - break - } - // We replace illegal bytes with RuneError. Not doing so might - // otherwise turn a sequence of invalid UTF-8 into valid UTF-8. - // The resulting byte sequence may subsequently contain runes - // for which t(r) is true that were passed unnoticed. - if !t(r) { - if nDst+3 > len(dst) { - err = ErrShortDst - break - } - nDst += copy(dst[nDst:], "\uFFFD") - } - nSrc++ - continue - } - } - - if !t(r) { - if nDst+sz > len(dst) { - err = ErrShortDst - break - } - nDst += copy(dst[nDst:], src[:sz]) - } - nSrc += sz - } - return -} - -// grow returns a new []byte that is longer than b, and copies the first n bytes -// of b to the start of the new slice. -func grow(b []byte, n int) []byte { - m := len(b) - if m <= 32 { - m = 64 - } else if m <= 256 { - m *= 2 - } else { - m += m >> 1 - } - buf := make([]byte, m) - copy(buf, b[:n]) - return buf -} - -const initialBufSize = 128 - -// String returns a string with the result of converting s[:n] using t, where -// n <= len(s). If err == nil, n will be len(s). It calls Reset on t. -func String(t Transformer, s string) (result string, n int, err error) { - t.Reset() - if s == "" { - // Fast path for the common case for empty input. Results in about a - // 86% reduction of running time for BenchmarkStringLowerEmpty. - if _, _, err := t.Transform(nil, nil, true); err == nil { - return "", 0, nil - } - } - - // Allocate only once. Note that both dst and src escape when passed to - // Transform. - buf := [2 * initialBufSize]byte{} - dst := buf[:initialBufSize:initialBufSize] - src := buf[initialBufSize : 2*initialBufSize] - - // The input string s is transformed in multiple chunks (starting with a - // chunk size of initialBufSize). nDst and nSrc are per-chunk (or - // per-Transform-call) indexes, pDst and pSrc are overall indexes. - nDst, nSrc := 0, 0 - pDst, pSrc := 0, 0 - - // pPrefix is the length of a common prefix: the first pPrefix bytes of the - // result will equal the first pPrefix bytes of s. It is not guaranteed to - // be the largest such value, but if pPrefix, len(result) and len(s) are - // all equal after the final transform (i.e. calling Transform with atEOF - // being true returned nil error) then we don't need to allocate a new - // result string. - pPrefix := 0 - for { - // Invariant: pDst == pPrefix && pSrc == pPrefix. - - n := copy(src, s[pSrc:]) - nDst, nSrc, err = t.Transform(dst, src[:n], pSrc+n == len(s)) - pDst += nDst - pSrc += nSrc - - // TODO: let transformers implement an optional Spanner interface, akin - // to norm's QuickSpan. This would even allow us to avoid any allocation. - if !bytes.Equal(dst[:nDst], src[:nSrc]) { - break - } - pPrefix = pSrc - if err == ErrShortDst { - // A buffer can only be short if a transformer modifies its input. - break - } else if err == ErrShortSrc { - if nSrc == 0 { - // No progress was made. - break - } - // Equal so far and !atEOF, so continue checking. - } else if err != nil || pPrefix == len(s) { - return string(s[:pPrefix]), pPrefix, err - } - } - // Post-condition: pDst == pPrefix + nDst && pSrc == pPrefix + nSrc. - - // We have transformed the first pSrc bytes of the input s to become pDst - // transformed bytes. Those transformed bytes are discontiguous: the first - // pPrefix of them equal s[:pPrefix] and the last nDst of them equal - // dst[:nDst]. We copy them around, into a new dst buffer if necessary, so - // that they become one contiguous slice: dst[:pDst]. - if pPrefix != 0 { - newDst := dst - if pDst > len(newDst) { - newDst = make([]byte, len(s)+nDst-nSrc) - } - copy(newDst[pPrefix:pDst], dst[:nDst]) - copy(newDst[:pPrefix], s[:pPrefix]) - dst = newDst - } - - // Prevent duplicate Transform calls with atEOF being true at the end of - // the input. Also return if we have an unrecoverable error. - if (err == nil && pSrc == len(s)) || - (err != nil && err != ErrShortDst && err != ErrShortSrc) { - return string(dst[:pDst]), pSrc, err - } - - // Transform the remaining input, growing dst and src buffers as necessary. - for { - n := copy(src, s[pSrc:]) - nDst, nSrc, err := t.Transform(dst[pDst:], src[:n], pSrc+n == len(s)) - pDst += nDst - pSrc += nSrc - - // If we got ErrShortDst or ErrShortSrc, do not grow as long as we can - // make progress. This may avoid excessive allocations. - if err == ErrShortDst { - if nDst == 0 { - dst = grow(dst, pDst) - } - } else if err == ErrShortSrc { - if nSrc == 0 { - src = grow(src, 0) - } - } else if err != nil || pSrc == len(s) { - return string(dst[:pDst]), pSrc, err - } - } -} - -// Bytes returns a new byte slice with the result of converting b[:n] using t, -// where n <= len(b). If err == nil, n will be len(b). It calls Reset on t. -func Bytes(t Transformer, b []byte) (result []byte, n int, err error) { - return doAppend(t, 0, make([]byte, len(b)), b) -} - -// Append appends the result of converting src[:n] using t to dst, where -// n <= len(src), If err == nil, n will be len(src). It calls Reset on t. -func Append(t Transformer, dst, src []byte) (result []byte, n int, err error) { - if len(dst) == cap(dst) { - n := len(src) + len(dst) // It is okay for this to be 0. - b := make([]byte, n) - dst = b[:copy(b, dst)] - } - return doAppend(t, len(dst), dst[:cap(dst)], src) -} - -func doAppend(t Transformer, pDst int, dst, src []byte) (result []byte, n int, err error) { - t.Reset() - pSrc := 0 - for { - nDst, nSrc, err := t.Transform(dst[pDst:], src[pSrc:], true) - pDst += nDst - pSrc += nSrc - if err != ErrShortDst { - return dst[:pDst], pSrc, err - } - - // Grow the destination buffer, but do not grow as long as we can make - // progress. This may avoid excessive allocations. - if nDst == 0 { - dst = grow(dst, pDst) - } - } -} diff --git a/vendor/golang.org/x/text/unicode/bidi/bidi.go b/vendor/golang.org/x/text/unicode/bidi/bidi.go deleted file mode 100644 index 3fc4a6252..000000000 --- a/vendor/golang.org/x/text/unicode/bidi/bidi.go +++ /dev/null @@ -1,198 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:generate go run gen.go gen_trieval.go gen_ranges.go - -// Package bidi contains functionality for bidirectional text support. -// -// See http://www.unicode.org/reports/tr9. -// -// NOTE: UNDER CONSTRUCTION. This API may change in backwards incompatible ways -// and without notice. -package bidi // import "golang.org/x/text/unicode/bidi" - -// TODO: -// The following functionality would not be hard to implement, but hinges on -// the definition of a Segmenter interface. For now this is up to the user. -// - Iterate over paragraphs -// - Segmenter to iterate over runs directly from a given text. -// Also: -// - Transformer for reordering? -// - Transformer (validator, really) for Bidi Rule. - -// This API tries to avoid dealing with embedding levels for now. Under the hood -// these will be computed, but the question is to which extent the user should -// know they exist. We should at some point allow the user to specify an -// embedding hierarchy, though. - -// A Direction indicates the overall flow of text. -type Direction int - -const ( - // LeftToRight indicates the text contains no right-to-left characters and - // that either there are some left-to-right characters or the option - // DefaultDirection(LeftToRight) was passed. - LeftToRight Direction = iota - - // RightToLeft indicates the text contains no left-to-right characters and - // that either there are some right-to-left characters or the option - // DefaultDirection(RightToLeft) was passed. - RightToLeft - - // Mixed indicates text contains both left-to-right and right-to-left - // characters. - Mixed - - // Neutral means that text contains no left-to-right and right-to-left - // characters and that no default direction has been set. - Neutral -) - -type options struct{} - -// An Option is an option for Bidi processing. -type Option func(*options) - -// ICU allows the user to define embedding levels. This may be used, for example, -// to use hierarchical structure of markup languages to define embeddings. -// The following option may be a way to expose this functionality in this API. -// // LevelFunc sets a function that associates nesting levels with the given text. -// // The levels function will be called with monotonically increasing values for p. -// func LevelFunc(levels func(p int) int) Option { -// panic("unimplemented") -// } - -// DefaultDirection sets the default direction for a Paragraph. The direction is -// overridden if the text contains directional characters. -func DefaultDirection(d Direction) Option { - panic("unimplemented") -} - -// A Paragraph holds a single Paragraph for Bidi processing. -type Paragraph struct { - // buffers -} - -// SetBytes configures p for the given paragraph text. It replaces text -// previously set by SetBytes or SetString. If b contains a paragraph separator -// it will only process the first paragraph and report the number of bytes -// consumed from b including this separator. Error may be non-nil if options are -// given. -func (p *Paragraph) SetBytes(b []byte, opts ...Option) (n int, err error) { - panic("unimplemented") -} - -// SetString configures p for the given paragraph text. It replaces text -// previously set by SetBytes or SetString. If b contains a paragraph separator -// it will only process the first paragraph and report the number of bytes -// consumed from b including this separator. Error may be non-nil if options are -// given. -func (p *Paragraph) SetString(s string, opts ...Option) (n int, err error) { - panic("unimplemented") -} - -// IsLeftToRight reports whether the principle direction of rendering for this -// paragraphs is left-to-right. If this returns false, the principle direction -// of rendering is right-to-left. -func (p *Paragraph) IsLeftToRight() bool { - panic("unimplemented") -} - -// Direction returns the direction of the text of this paragraph. -// -// The direction may be LeftToRight, RightToLeft, Mixed, or Neutral. -func (p *Paragraph) Direction() Direction { - panic("unimplemented") -} - -// RunAt reports the Run at the given position of the input text. -// -// This method can be used for computing line breaks on paragraphs. -func (p *Paragraph) RunAt(pos int) Run { - panic("unimplemented") -} - -// Order computes the visual ordering of all the runs in a Paragraph. -func (p *Paragraph) Order() (Ordering, error) { - panic("unimplemented") -} - -// Line computes the visual ordering of runs for a single line starting and -// ending at the given positions in the original text. -func (p *Paragraph) Line(start, end int) (Ordering, error) { - panic("unimplemented") -} - -// An Ordering holds the computed visual order of runs of a Paragraph. Calling -// SetBytes or SetString on the originating Paragraph invalidates an Ordering. -// The methods of an Ordering should only be called by one goroutine at a time. -type Ordering struct{} - -// Direction reports the directionality of the runs. -// -// The direction may be LeftToRight, RightToLeft, Mixed, or Neutral. -func (o *Ordering) Direction() Direction { - panic("unimplemented") -} - -// NumRuns returns the number of runs. -func (o *Ordering) NumRuns() int { - panic("unimplemented") -} - -// Run returns the ith run within the ordering. -func (o *Ordering) Run(i int) Run { - panic("unimplemented") -} - -// TODO: perhaps with options. -// // Reorder creates a reader that reads the runes in visual order per character. -// // Modifiers remain after the runes they modify. -// func (l *Runs) Reorder() io.Reader { -// panic("unimplemented") -// } - -// A Run is a continuous sequence of characters of a single direction. -type Run struct { -} - -// String returns the text of the run in its original order. -func (r *Run) String() string { - panic("unimplemented") -} - -// Bytes returns the text of the run in its original order. -func (r *Run) Bytes() []byte { - panic("unimplemented") -} - -// TODO: methods for -// - Display order -// - headers and footers -// - bracket replacement. - -// Direction reports the direction of the run. -func (r *Run) Direction() Direction { - panic("unimplemented") -} - -// Position of the Run within the text passed to SetBytes or SetString of the -// originating Paragraph value. -func (r *Run) Pos() (start, end int) { - panic("unimplemented") -} - -// AppendReverse reverses the order of characters of in, appends them to out, -// and returns the result. Modifiers will still follow the runes they modify. -// Brackets are replaced with their counterparts. -func AppendReverse(out, in []byte) []byte { - panic("unimplemented") -} - -// ReverseString reverses the order of characters in s and returns a new string. -// Modifiers will still follow the runes they modify. Brackets are replaced with -// their counterparts. -func ReverseString(s string) string { - panic("unimplemented") -} diff --git a/vendor/golang.org/x/text/unicode/bidi/bracket.go b/vendor/golang.org/x/text/unicode/bidi/bracket.go deleted file mode 100644 index 601e25920..000000000 --- a/vendor/golang.org/x/text/unicode/bidi/bracket.go +++ /dev/null @@ -1,335 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bidi - -import ( - "container/list" - "fmt" - "sort" -) - -// This file contains a port of the reference implementation of the -// Bidi Parentheses Algorithm: -// http://www.unicode.org/Public/PROGRAMS/BidiReferenceJava/BidiPBAReference.java -// -// The implementation in this file covers definitions BD14-BD16 and rule N0 -// of UAX#9. -// -// Some preprocessing is done for each rune before data is passed to this -// algorithm: -// - opening and closing brackets are identified -// - a bracket pair type, like '(' and ')' is assigned a unique identifier that -// is identical for the opening and closing bracket. It is left to do these -// mappings. -// - The BPA algorithm requires that bracket characters that are canonical -// equivalents of each other be able to be substituted for each other. -// It is the responsibility of the caller to do this canonicalization. -// -// In implementing BD16, this implementation departs slightly from the "logical" -// algorithm defined in UAX#9. In particular, the stack referenced there -// supports operations that go beyond a "basic" stack. An equivalent -// implementation based on a linked list is used here. - -// Bidi_Paired_Bracket_Type -// BD14. An opening paired bracket is a character whose -// Bidi_Paired_Bracket_Type property value is Open. -// -// BD15. A closing paired bracket is a character whose -// Bidi_Paired_Bracket_Type property value is Close. -type bracketType byte - -const ( - bpNone bracketType = iota - bpOpen - bpClose -) - -// bracketPair holds a pair of index values for opening and closing bracket -// location of a bracket pair. -type bracketPair struct { - opener int - closer int -} - -func (b *bracketPair) String() string { - return fmt.Sprintf("(%v, %v)", b.opener, b.closer) -} - -// bracketPairs is a slice of bracketPairs with a sort.Interface implementation. -type bracketPairs []bracketPair - -func (b bracketPairs) Len() int { return len(b) } -func (b bracketPairs) Swap(i, j int) { b[i], b[j] = b[j], b[i] } -func (b bracketPairs) Less(i, j int) bool { return b[i].opener < b[j].opener } - -// resolvePairedBrackets runs the paired bracket part of the UBA algorithm. -// -// For each rune, it takes the indexes into the original string, the class the -// bracket type (in pairTypes) and the bracket identifier (pairValues). It also -// takes the direction type for the start-of-sentence and the embedding level. -// -// The identifiers for bracket types are the rune of the canonicalized opening -// bracket for brackets (open or close) or 0 for runes that are not brackets. -func resolvePairedBrackets(s *isolatingRunSequence) { - p := bracketPairer{ - sos: s.sos, - openers: list.New(), - codesIsolatedRun: s.types, - indexes: s.indexes, - } - dirEmbed := L - if s.level&1 != 0 { - dirEmbed = R - } - p.locateBrackets(s.p.pairTypes, s.p.pairValues) - p.resolveBrackets(dirEmbed, s.p.initialTypes) -} - -type bracketPairer struct { - sos Class // direction corresponding to start of sequence - - // The following is a restatement of BD 16 using non-algorithmic language. - // - // A bracket pair is a pair of characters consisting of an opening - // paired bracket and a closing paired bracket such that the - // Bidi_Paired_Bracket property value of the former equals the latter, - // subject to the following constraints. - // - both characters of a pair occur in the same isolating run sequence - // - the closing character of a pair follows the opening character - // - any bracket character can belong at most to one pair, the earliest possible one - // - any bracket character not part of a pair is treated like an ordinary character - // - pairs may nest properly, but their spans may not overlap otherwise - - // Bracket characters with canonical decompositions are supposed to be - // treated as if they had been normalized, to allow normalized and non- - // normalized text to give the same result. In this implementation that step - // is pushed out to the caller. The caller has to ensure that the pairValue - // slices contain the rune of the opening bracket after normalization for - // any opening or closing bracket. - - openers *list.List // list of positions for opening brackets - - // bracket pair positions sorted by location of opening bracket - pairPositions bracketPairs - - codesIsolatedRun []Class // directional bidi codes for an isolated run - indexes []int // array of index values into the original string - -} - -// matchOpener reports whether characters at given positions form a matching -// bracket pair. -func (p *bracketPairer) matchOpener(pairValues []rune, opener, closer int) bool { - return pairValues[p.indexes[opener]] == pairValues[p.indexes[closer]] -} - -const maxPairingDepth = 63 - -// locateBrackets locates matching bracket pairs according to BD16. -// -// This implementation uses a linked list instead of a stack, because, while -// elements are added at the front (like a push) they are not generally removed -// in atomic 'pop' operations, reducing the benefit of the stack archetype. -func (p *bracketPairer) locateBrackets(pairTypes []bracketType, pairValues []rune) { - // traverse the run - // do that explicitly (not in a for-each) so we can record position - for i, index := range p.indexes { - - // look at the bracket type for each character - if pairTypes[index] == bpNone || p.codesIsolatedRun[i] != ON { - // continue scanning - continue - } - switch pairTypes[index] { - case bpOpen: - // check if maximum pairing depth reached - if p.openers.Len() == maxPairingDepth { - p.openers.Init() - return - } - // remember opener location, most recent first - p.openers.PushFront(i) - - case bpClose: - // see if there is a match - count := 0 - for elem := p.openers.Front(); elem != nil; elem = elem.Next() { - count++ - opener := elem.Value.(int) - if p.matchOpener(pairValues, opener, i) { - // if the opener matches, add nested pair to the ordered list - p.pairPositions = append(p.pairPositions, bracketPair{opener, i}) - // remove up to and including matched opener - for ; count > 0; count-- { - p.openers.Remove(p.openers.Front()) - } - break - } - } - sort.Sort(p.pairPositions) - // if we get here, the closing bracket matched no openers - // and gets ignored - } - } -} - -// Bracket pairs within an isolating run sequence are processed as units so -// that both the opening and the closing paired bracket in a pair resolve to -// the same direction. -// -// N0. Process bracket pairs in an isolating run sequence sequentially in -// the logical order of the text positions of the opening paired brackets -// using the logic given below. Within this scope, bidirectional types EN -// and AN are treated as R. -// -// Identify the bracket pairs in the current isolating run sequence -// according to BD16. For each bracket-pair element in the list of pairs of -// text positions: -// -// a Inspect the bidirectional types of the characters enclosed within the -// bracket pair. -// -// b If any strong type (either L or R) matching the embedding direction is -// found, set the type for both brackets in the pair to match the embedding -// direction. -// -// o [ e ] o -> o e e e o -// -// o [ o e ] -> o e o e e -// -// o [ NI e ] -> o e NI e e -// -// c Otherwise, if a strong type (opposite the embedding direction) is -// found, test for adjacent strong types as follows: 1 First, check -// backwards before the opening paired bracket until the first strong type -// (L, R, or sos) is found. If that first preceding strong type is opposite -// the embedding direction, then set the type for both brackets in the pair -// to that type. 2 Otherwise, set the type for both brackets in the pair to -// the embedding direction. -// -// o [ o ] e -> o o o o e -// -// o [ o NI ] o -> o o o NI o o -// -// e [ o ] o -> e e o e o -// -// e [ o ] e -> e e o e e -// -// e ( o [ o ] NI ) e -> e e o o o o NI e e -// -// d Otherwise, do not set the type for the current bracket pair. Note that -// if the enclosed text contains no strong types the paired brackets will -// both resolve to the same level when resolved individually using rules N1 -// and N2. -// -// e ( NI ) o -> e ( NI ) o - -// getStrongTypeN0 maps character's directional code to strong type as required -// by rule N0. -// -// TODO: have separate type for "strong" directionality. -func (p *bracketPairer) getStrongTypeN0(index int) Class { - switch p.codesIsolatedRun[index] { - // in the scope of N0, number types are treated as R - case EN, AN, AL, R: - return R - case L: - return L - default: - return ON - } -} - -// classifyPairContent reports the strong types contained inside a Bracket Pair, -// assuming the given embedding direction. -// -// It returns ON if no strong type is found. If a single strong type is found, -// it returns this this type. Otherwise it returns the embedding direction. -// -// TODO: use separate type for "strong" directionality. -func (p *bracketPairer) classifyPairContent(loc bracketPair, dirEmbed Class) Class { - dirOpposite := ON - for i := loc.opener + 1; i < loc.closer; i++ { - dir := p.getStrongTypeN0(i) - if dir == ON { - continue - } - if dir == dirEmbed { - return dir // type matching embedding direction found - } - dirOpposite = dir - } - // return ON if no strong type found, or class opposite to dirEmbed - return dirOpposite -} - -// classBeforePair determines which strong types are present before a Bracket -// Pair. Return R or L if strong type found, otherwise ON. -func (p *bracketPairer) classBeforePair(loc bracketPair) Class { - for i := loc.opener - 1; i >= 0; i-- { - if dir := p.getStrongTypeN0(i); dir != ON { - return dir - } - } - // no strong types found, return sos - return p.sos -} - -// assignBracketType implements rule N0 for a single bracket pair. -func (p *bracketPairer) assignBracketType(loc bracketPair, dirEmbed Class, initialTypes []Class) { - // rule "N0, a", inspect contents of pair - dirPair := p.classifyPairContent(loc, dirEmbed) - - // dirPair is now L, R, or N (no strong type found) - - // the following logical tests are performed out of order compared to - // the statement of the rules but yield the same results - if dirPair == ON { - return // case "d" - nothing to do - } - - if dirPair != dirEmbed { - // case "c": strong type found, opposite - check before (c.1) - dirPair = p.classBeforePair(loc) - if dirPair == dirEmbed || dirPair == ON { - // no strong opposite type found before - use embedding (c.2) - dirPair = dirEmbed - } - } - // else: case "b", strong type found matching embedding, - // no explicit action needed, as dirPair is already set to embedding - // direction - - // set the bracket types to the type found - p.setBracketsToType(loc, dirPair, initialTypes) -} - -func (p *bracketPairer) setBracketsToType(loc bracketPair, dirPair Class, initialTypes []Class) { - p.codesIsolatedRun[loc.opener] = dirPair - p.codesIsolatedRun[loc.closer] = dirPair - - for i := loc.opener + 1; i < loc.closer; i++ { - index := p.indexes[i] - if initialTypes[index] != NSM { - break - } - p.codesIsolatedRun[i] = dirPair - } - - for i := loc.closer + 1; i < len(p.indexes); i++ { - index := p.indexes[i] - if initialTypes[index] != NSM { - break - } - p.codesIsolatedRun[i] = dirPair - } -} - -// resolveBrackets implements rule N0 for a list of pairs. -func (p *bracketPairer) resolveBrackets(dirEmbed Class, initialTypes []Class) { - for _, loc := range p.pairPositions { - p.assignBracketType(loc, dirEmbed, initialTypes) - } -} diff --git a/vendor/golang.org/x/text/unicode/bidi/core.go b/vendor/golang.org/x/text/unicode/bidi/core.go deleted file mode 100644 index d4c1399f0..000000000 --- a/vendor/golang.org/x/text/unicode/bidi/core.go +++ /dev/null @@ -1,1058 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bidi - -import "log" - -// This implementation is a port based on the reference implementation found at: -// http://www.unicode.org/Public/PROGRAMS/BidiReferenceJava/ -// -// described in Unicode Bidirectional Algorithm (UAX #9). -// -// Input: -// There are two levels of input to the algorithm, since clients may prefer to -// supply some information from out-of-band sources rather than relying on the -// default behavior. -// -// - Bidi class array -// - Bidi class array, with externally supplied base line direction -// -// Output: -// Output is separated into several stages: -// -// - levels array over entire paragraph -// - reordering array over entire paragraph -// - levels array over line -// - reordering array over line -// -// Note that for conformance to the Unicode Bidirectional Algorithm, -// implementations are only required to generate correct reordering and -// character directionality (odd or even levels) over a line. Generating -// identical level arrays over a line is not required. Bidi explicit format -// codes (LRE, RLE, LRO, RLO, PDF) and BN can be assigned arbitrary levels and -// positions as long as the rest of the input is properly reordered. -// -// As the algorithm is defined to operate on a single paragraph at a time, this -// implementation is written to handle single paragraphs. Thus rule P1 is -// presumed by this implementation-- the data provided to the implementation is -// assumed to be a single paragraph, and either contains no 'B' codes, or a -// single 'B' code at the end of the input. 'B' is allowed as input to -// illustrate how the algorithm assigns it a level. -// -// Also note that rules L3 and L4 depend on the rendering engine that uses the -// result of the bidi algorithm. This implementation assumes that the rendering -// engine expects combining marks in visual order (e.g. to the left of their -// base character in RTL runs) and that it adjusts the glyphs used to render -// mirrored characters that are in RTL runs so that they render appropriately. - -// level is the embedding level of a character. Even embedding levels indicate -// left-to-right order and odd levels indicate right-to-left order. The special -// level of -1 is reserved for undefined order. -type level int8 - -const implicitLevel level = -1 - -// in returns if x is equal to any of the values in set. -func (c Class) in(set ...Class) bool { - for _, s := range set { - if c == s { - return true - } - } - return false -} - -// A paragraph contains the state of a paragraph. -type paragraph struct { - initialTypes []Class - - // Arrays of properties needed for paired bracket evaluation in N0 - pairTypes []bracketType // paired Bracket types for paragraph - pairValues []rune // rune for opening bracket or pbOpen and pbClose; 0 for pbNone - - embeddingLevel level // default: = implicitLevel; - - // at the paragraph levels - resultTypes []Class - resultLevels []level - - // Index of matching PDI for isolate initiator characters. For other - // characters, the value of matchingPDI will be set to -1. For isolate - // initiators with no matching PDI, matchingPDI will be set to the length of - // the input string. - matchingPDI []int - - // Index of matching isolate initiator for PDI characters. For other - // characters, and for PDIs with no matching isolate initiator, the value of - // matchingIsolateInitiator will be set to -1. - matchingIsolateInitiator []int -} - -// newParagraph initializes a paragraph. The user needs to supply a few arrays -// corresponding to the preprocessed text input. The types correspond to the -// Unicode BiDi classes for each rune. pairTypes indicates the bracket type for -// each rune. pairValues provides a unique bracket class identifier for each -// rune (suggested is the rune of the open bracket for opening and matching -// close brackets, after normalization). The embedding levels are optional, but -// may be supplied to encode embedding levels of styled text. -// -// TODO: return an error. -func newParagraph(types []Class, pairTypes []bracketType, pairValues []rune, levels level) *paragraph { - validateTypes(types) - validatePbTypes(pairTypes) - validatePbValues(pairValues, pairTypes) - validateParagraphEmbeddingLevel(levels) - - p := ¶graph{ - initialTypes: append([]Class(nil), types...), - embeddingLevel: levels, - - pairTypes: pairTypes, - pairValues: pairValues, - - resultTypes: append([]Class(nil), types...), - } - p.run() - return p -} - -func (p *paragraph) Len() int { return len(p.initialTypes) } - -// The algorithm. Does not include line-based processing (Rules L1, L2). -// These are applied later in the line-based phase of the algorithm. -func (p *paragraph) run() { - p.determineMatchingIsolates() - - // 1) determining the paragraph level - // Rule P1 is the requirement for entering this algorithm. - // Rules P2, P3. - // If no externally supplied paragraph embedding level, use default. - if p.embeddingLevel == implicitLevel { - p.embeddingLevel = p.determineParagraphEmbeddingLevel(0, p.Len()) - } - - // Initialize result levels to paragraph embedding level. - p.resultLevels = make([]level, p.Len()) - setLevels(p.resultLevels, p.embeddingLevel) - - // 2) Explicit levels and directions - // Rules X1-X8. - p.determineExplicitEmbeddingLevels() - - // Rule X9. - // We do not remove the embeddings, the overrides, the PDFs, and the BNs - // from the string explicitly. But they are not copied into isolating run - // sequences when they are created, so they are removed for all - // practical purposes. - - // Rule X10. - // Run remainder of algorithm one isolating run sequence at a time - for _, seq := range p.determineIsolatingRunSequences() { - // 3) resolving weak types - // Rules W1-W7. - seq.resolveWeakTypes() - - // 4a) resolving paired brackets - // Rule N0 - resolvePairedBrackets(seq) - - // 4b) resolving neutral types - // Rules N1-N3. - seq.resolveNeutralTypes() - - // 5) resolving implicit embedding levels - // Rules I1, I2. - seq.resolveImplicitLevels() - - // Apply the computed levels and types - seq.applyLevelsAndTypes() - } - - // Assign appropriate levels to 'hide' LREs, RLEs, LROs, RLOs, PDFs, and - // BNs. This is for convenience, so the resulting level array will have - // a value for every character. - p.assignLevelsToCharactersRemovedByX9() -} - -// determineMatchingIsolates determines the matching PDI for each isolate -// initiator and vice versa. -// -// Definition BD9. -// -// At the end of this function: -// -// - The member variable matchingPDI is set to point to the index of the -// matching PDI character for each isolate initiator character. If there is -// no matching PDI, it is set to the length of the input text. For other -// characters, it is set to -1. -// - The member variable matchingIsolateInitiator is set to point to the -// index of the matching isolate initiator character for each PDI character. -// If there is no matching isolate initiator, or the character is not a PDI, -// it is set to -1. -func (p *paragraph) determineMatchingIsolates() { - p.matchingPDI = make([]int, p.Len()) - p.matchingIsolateInitiator = make([]int, p.Len()) - - for i := range p.matchingIsolateInitiator { - p.matchingIsolateInitiator[i] = -1 - } - - for i := range p.matchingPDI { - p.matchingPDI[i] = -1 - - if t := p.resultTypes[i]; t.in(LRI, RLI, FSI) { - depthCounter := 1 - for j := i + 1; j < p.Len(); j++ { - if u := p.resultTypes[j]; u.in(LRI, RLI, FSI) { - depthCounter++ - } else if u == PDI { - if depthCounter--; depthCounter == 0 { - p.matchingPDI[i] = j - p.matchingIsolateInitiator[j] = i - break - } - } - } - if p.matchingPDI[i] == -1 { - p.matchingPDI[i] = p.Len() - } - } - } -} - -// determineParagraphEmbeddingLevel reports the resolved paragraph direction of -// the substring limited by the given range [start, end). -// -// Determines the paragraph level based on rules P2, P3. This is also used -// in rule X5c to find if an FSI should resolve to LRI or RLI. -func (p *paragraph) determineParagraphEmbeddingLevel(start, end int) level { - var strongType Class = unknownClass - - // Rule P2. - for i := start; i < end; i++ { - if t := p.resultTypes[i]; t.in(L, AL, R) { - strongType = t - break - } else if t.in(FSI, LRI, RLI) { - i = p.matchingPDI[i] // skip over to the matching PDI - if i > end { - log.Panic("assert (i <= end)") - } - } - } - // Rule P3. - switch strongType { - case unknownClass: // none found - // default embedding level when no strong types found is 0. - return 0 - case L: - return 0 - default: // AL, R - return 1 - } -} - -const maxDepth = 125 - -// This stack will store the embedding levels and override and isolated -// statuses -type directionalStatusStack struct { - stackCounter int - embeddingLevelStack [maxDepth + 1]level - overrideStatusStack [maxDepth + 1]Class - isolateStatusStack [maxDepth + 1]bool -} - -func (s *directionalStatusStack) empty() { s.stackCounter = 0 } -func (s *directionalStatusStack) pop() { s.stackCounter-- } -func (s *directionalStatusStack) depth() int { return s.stackCounter } - -func (s *directionalStatusStack) push(level level, overrideStatus Class, isolateStatus bool) { - s.embeddingLevelStack[s.stackCounter] = level - s.overrideStatusStack[s.stackCounter] = overrideStatus - s.isolateStatusStack[s.stackCounter] = isolateStatus - s.stackCounter++ -} - -func (s *directionalStatusStack) lastEmbeddingLevel() level { - return s.embeddingLevelStack[s.stackCounter-1] -} - -func (s *directionalStatusStack) lastDirectionalOverrideStatus() Class { - return s.overrideStatusStack[s.stackCounter-1] -} - -func (s *directionalStatusStack) lastDirectionalIsolateStatus() bool { - return s.isolateStatusStack[s.stackCounter-1] -} - -// Determine explicit levels using rules X1 - X8 -func (p *paragraph) determineExplicitEmbeddingLevels() { - var stack directionalStatusStack - var overflowIsolateCount, overflowEmbeddingCount, validIsolateCount int - - // Rule X1. - stack.push(p.embeddingLevel, ON, false) - - for i, t := range p.resultTypes { - // Rules X2, X3, X4, X5, X5a, X5b, X5c - switch t { - case RLE, LRE, RLO, LRO, RLI, LRI, FSI: - isIsolate := t.in(RLI, LRI, FSI) - isRTL := t.in(RLE, RLO, RLI) - - // override if this is an FSI that resolves to RLI - if t == FSI { - isRTL = (p.determineParagraphEmbeddingLevel(i+1, p.matchingPDI[i]) == 1) - } - if isIsolate { - p.resultLevels[i] = stack.lastEmbeddingLevel() - if stack.lastDirectionalOverrideStatus() != ON { - p.resultTypes[i] = stack.lastDirectionalOverrideStatus() - } - } - - var newLevel level - if isRTL { - // least greater odd - newLevel = (stack.lastEmbeddingLevel() + 1) | 1 - } else { - // least greater even - newLevel = (stack.lastEmbeddingLevel() + 2) &^ 1 - } - - if newLevel <= maxDepth && overflowIsolateCount == 0 && overflowEmbeddingCount == 0 { - if isIsolate { - validIsolateCount++ - } - // Push new embedding level, override status, and isolated - // status. - // No check for valid stack counter, since the level check - // suffices. - switch t { - case LRO: - stack.push(newLevel, L, isIsolate) - case RLO: - stack.push(newLevel, R, isIsolate) - default: - stack.push(newLevel, ON, isIsolate) - } - // Not really part of the spec - if !isIsolate { - p.resultLevels[i] = newLevel - } - } else { - // This is an invalid explicit formatting character, - // so apply the "Otherwise" part of rules X2-X5b. - if isIsolate { - overflowIsolateCount++ - } else { // !isIsolate - if overflowIsolateCount == 0 { - overflowEmbeddingCount++ - } - } - } - - // Rule X6a - case PDI: - if overflowIsolateCount > 0 { - overflowIsolateCount-- - } else if validIsolateCount == 0 { - // do nothing - } else { - overflowEmbeddingCount = 0 - for !stack.lastDirectionalIsolateStatus() { - stack.pop() - } - stack.pop() - validIsolateCount-- - } - p.resultLevels[i] = stack.lastEmbeddingLevel() - - // Rule X7 - case PDF: - // Not really part of the spec - p.resultLevels[i] = stack.lastEmbeddingLevel() - - if overflowIsolateCount > 0 { - // do nothing - } else if overflowEmbeddingCount > 0 { - overflowEmbeddingCount-- - } else if !stack.lastDirectionalIsolateStatus() && stack.depth() >= 2 { - stack.pop() - } - - case B: // paragraph separator. - // Rule X8. - - // These values are reset for clarity, in this implementation B - // can only occur as the last code in the array. - stack.empty() - overflowIsolateCount = 0 - overflowEmbeddingCount = 0 - validIsolateCount = 0 - p.resultLevels[i] = p.embeddingLevel - - default: - p.resultLevels[i] = stack.lastEmbeddingLevel() - if stack.lastDirectionalOverrideStatus() != ON { - p.resultTypes[i] = stack.lastDirectionalOverrideStatus() - } - } - } -} - -type isolatingRunSequence struct { - p *paragraph - - indexes []int // indexes to the original string - - types []Class // type of each character using the index - resolvedLevels []level // resolved levels after application of rules - level level - sos, eos Class -} - -func (i *isolatingRunSequence) Len() int { return len(i.indexes) } - -func maxLevel(a, b level) level { - if a > b { - return a - } - return b -} - -// Rule X10, second bullet: Determine the start-of-sequence (sos) and end-of-sequence (eos) types, -// either L or R, for each isolating run sequence. -func (p *paragraph) isolatingRunSequence(indexes []int) *isolatingRunSequence { - length := len(indexes) - types := make([]Class, length) - for i, x := range indexes { - types[i] = p.resultTypes[x] - } - - // assign level, sos and eos - prevChar := indexes[0] - 1 - for prevChar >= 0 && isRemovedByX9(p.initialTypes[prevChar]) { - prevChar-- - } - prevLevel := p.embeddingLevel - if prevChar >= 0 { - prevLevel = p.resultLevels[prevChar] - } - - var succLevel level - lastType := types[length-1] - if lastType.in(LRI, RLI, FSI) { - succLevel = p.embeddingLevel - } else { - // the first character after the end of run sequence - limit := indexes[length-1] + 1 - for ; limit < p.Len() && isRemovedByX9(p.initialTypes[limit]); limit++ { - - } - succLevel = p.embeddingLevel - if limit < p.Len() { - succLevel = p.resultLevels[limit] - } - } - level := p.resultLevels[indexes[0]] - return &isolatingRunSequence{ - p: p, - indexes: indexes, - types: types, - level: level, - sos: typeForLevel(maxLevel(prevLevel, level)), - eos: typeForLevel(maxLevel(succLevel, level)), - } -} - -// Resolving weak types Rules W1-W7. -// -// Note that some weak types (EN, AN) remain after this processing is -// complete. -func (s *isolatingRunSequence) resolveWeakTypes() { - - // on entry, only these types remain - s.assertOnly(L, R, AL, EN, ES, ET, AN, CS, B, S, WS, ON, NSM, LRI, RLI, FSI, PDI) - - // Rule W1. - // Changes all NSMs. - preceedingCharacterType := s.sos - for i, t := range s.types { - if t == NSM { - s.types[i] = preceedingCharacterType - } else { - if t.in(LRI, RLI, FSI, PDI) { - preceedingCharacterType = ON - } - preceedingCharacterType = t - } - } - - // Rule W2. - // EN does not change at the start of the run, because sos != AL. - for i, t := range s.types { - if t == EN { - for j := i - 1; j >= 0; j-- { - if t := s.types[j]; t.in(L, R, AL) { - if t == AL { - s.types[i] = AN - } - break - } - } - } - } - - // Rule W3. - for i, t := range s.types { - if t == AL { - s.types[i] = R - } - } - - // Rule W4. - // Since there must be values on both sides for this rule to have an - // effect, the scan skips the first and last value. - // - // Although the scan proceeds left to right, and changes the type - // values in a way that would appear to affect the computations - // later in the scan, there is actually no problem. A change in the - // current value can only affect the value to its immediate right, - // and only affect it if it is ES or CS. But the current value can - // only change if the value to its right is not ES or CS. Thus - // either the current value will not change, or its change will have - // no effect on the remainder of the analysis. - - for i := 1; i < s.Len()-1; i++ { - t := s.types[i] - if t == ES || t == CS { - prevSepType := s.types[i-1] - succSepType := s.types[i+1] - if prevSepType == EN && succSepType == EN { - s.types[i] = EN - } else if s.types[i] == CS && prevSepType == AN && succSepType == AN { - s.types[i] = AN - } - } - } - - // Rule W5. - for i, t := range s.types { - if t == ET { - // locate end of sequence - runStart := i - runEnd := s.findRunLimit(runStart, ET) - - // check values at ends of sequence - t := s.sos - if runStart > 0 { - t = s.types[runStart-1] - } - if t != EN { - t = s.eos - if runEnd < len(s.types) { - t = s.types[runEnd] - } - } - if t == EN { - setTypes(s.types[runStart:runEnd], EN) - } - // continue at end of sequence - i = runEnd - } - } - - // Rule W6. - for i, t := range s.types { - if t.in(ES, ET, CS) { - s.types[i] = ON - } - } - - // Rule W7. - for i, t := range s.types { - if t == EN { - // set default if we reach start of run - prevStrongType := s.sos - for j := i - 1; j >= 0; j-- { - t = s.types[j] - if t == L || t == R { // AL's have been changed to R - prevStrongType = t - break - } - } - if prevStrongType == L { - s.types[i] = L - } - } - } -} - -// 6) resolving neutral types Rules N1-N2. -func (s *isolatingRunSequence) resolveNeutralTypes() { - - // on entry, only these types can be in resultTypes - s.assertOnly(L, R, EN, AN, B, S, WS, ON, RLI, LRI, FSI, PDI) - - for i, t := range s.types { - switch t { - case WS, ON, B, S, RLI, LRI, FSI, PDI: - // find bounds of run of neutrals - runStart := i - runEnd := s.findRunLimit(runStart, B, S, WS, ON, RLI, LRI, FSI, PDI) - - // determine effective types at ends of run - var leadType, trailType Class - - // Note that the character found can only be L, R, AN, or - // EN. - if runStart == 0 { - leadType = s.sos - } else { - leadType = s.types[runStart-1] - if leadType.in(AN, EN) { - leadType = R - } - } - if runEnd == len(s.types) { - trailType = s.eos - } else { - trailType = s.types[runEnd] - if trailType.in(AN, EN) { - trailType = R - } - } - - var resolvedType Class - if leadType == trailType { - // Rule N1. - resolvedType = leadType - } else { - // Rule N2. - // Notice the embedding level of the run is used, not - // the paragraph embedding level. - resolvedType = typeForLevel(s.level) - } - - setTypes(s.types[runStart:runEnd], resolvedType) - - // skip over run of (former) neutrals - i = runEnd - } - } -} - -func setLevels(levels []level, newLevel level) { - for i := range levels { - levels[i] = newLevel - } -} - -func setTypes(types []Class, newType Class) { - for i := range types { - types[i] = newType - } -} - -// 7) resolving implicit embedding levels Rules I1, I2. -func (s *isolatingRunSequence) resolveImplicitLevels() { - - // on entry, only these types can be in resultTypes - s.assertOnly(L, R, EN, AN) - - s.resolvedLevels = make([]level, len(s.types)) - setLevels(s.resolvedLevels, s.level) - - if (s.level & 1) == 0 { // even level - for i, t := range s.types { - // Rule I1. - if t == L { - // no change - } else if t == R { - s.resolvedLevels[i] += 1 - } else { // t == AN || t == EN - s.resolvedLevels[i] += 2 - } - } - } else { // odd level - for i, t := range s.types { - // Rule I2. - if t == R { - // no change - } else { // t == L || t == AN || t == EN - s.resolvedLevels[i] += 1 - } - } - } -} - -// Applies the levels and types resolved in rules W1-I2 to the -// resultLevels array. -func (s *isolatingRunSequence) applyLevelsAndTypes() { - for i, x := range s.indexes { - s.p.resultTypes[x] = s.types[i] - s.p.resultLevels[x] = s.resolvedLevels[i] - } -} - -// Return the limit of the run consisting only of the types in validSet -// starting at index. This checks the value at index, and will return -// index if that value is not in validSet. -func (s *isolatingRunSequence) findRunLimit(index int, validSet ...Class) int { -loop: - for ; index < len(s.types); index++ { - t := s.types[index] - for _, valid := range validSet { - if t == valid { - continue loop - } - } - return index // didn't find a match in validSet - } - return len(s.types) -} - -// Algorithm validation. Assert that all values in types are in the -// provided set. -func (s *isolatingRunSequence) assertOnly(codes ...Class) { -loop: - for i, t := range s.types { - for _, c := range codes { - if t == c { - continue loop - } - } - log.Panicf("invalid bidi code %v present in assertOnly at position %d", t, s.indexes[i]) - } -} - -// determineLevelRuns returns an array of level runs. Each level run is -// described as an array of indexes into the input string. -// -// Determines the level runs. Rule X9 will be applied in determining the -// runs, in the way that makes sure the characters that are supposed to be -// removed are not included in the runs. -func (p *paragraph) determineLevelRuns() [][]int { - run := []int{} - allRuns := [][]int{} - currentLevel := implicitLevel - - for i := range p.initialTypes { - if !isRemovedByX9(p.initialTypes[i]) { - if p.resultLevels[i] != currentLevel { - // we just encountered a new run; wrap up last run - if currentLevel >= 0 { // only wrap it up if there was a run - allRuns = append(allRuns, run) - run = nil - } - // Start new run - currentLevel = p.resultLevels[i] - } - run = append(run, i) - } - } - // Wrap up the final run, if any - if len(run) > 0 { - allRuns = append(allRuns, run) - } - return allRuns -} - -// Definition BD13. Determine isolating run sequences. -func (p *paragraph) determineIsolatingRunSequences() []*isolatingRunSequence { - levelRuns := p.determineLevelRuns() - - // Compute the run that each character belongs to - runForCharacter := make([]int, p.Len()) - for i, run := range levelRuns { - for _, index := range run { - runForCharacter[index] = i - } - } - - sequences := []*isolatingRunSequence{} - - var currentRunSequence []int - - for _, run := range levelRuns { - first := run[0] - if p.initialTypes[first] != PDI || p.matchingIsolateInitiator[first] == -1 { - currentRunSequence = nil - // int run = i; - for { - // Copy this level run into currentRunSequence - currentRunSequence = append(currentRunSequence, run...) - - last := currentRunSequence[len(currentRunSequence)-1] - lastT := p.initialTypes[last] - if lastT.in(LRI, RLI, FSI) && p.matchingPDI[last] != p.Len() { - run = levelRuns[runForCharacter[p.matchingPDI[last]]] - } else { - break - } - } - sequences = append(sequences, p.isolatingRunSequence(currentRunSequence)) - } - } - return sequences -} - -// Assign level information to characters removed by rule X9. This is for -// ease of relating the level information to the original input data. Note -// that the levels assigned to these codes are arbitrary, they're chosen so -// as to avoid breaking level runs. -func (p *paragraph) assignLevelsToCharactersRemovedByX9() { - for i, t := range p.initialTypes { - if t.in(LRE, RLE, LRO, RLO, PDF, BN) { - p.resultTypes[i] = t - p.resultLevels[i] = -1 - } - } - // now propagate forward the levels information (could have - // propagated backward, the main thing is not to introduce a level - // break where one doesn't already exist). - - if p.resultLevels[0] == -1 { - p.resultLevels[0] = p.embeddingLevel - } - for i := 1; i < len(p.initialTypes); i++ { - if p.resultLevels[i] == -1 { - p.resultLevels[i] = p.resultLevels[i-1] - } - } - // Embedding information is for informational purposes only so need not be - // adjusted. -} - -// -// Output -// - -// getLevels computes levels array breaking lines at offsets in linebreaks. -// Rule L1. -// -// The linebreaks array must include at least one value. The values must be -// in strictly increasing order (no duplicates) between 1 and the length of -// the text, inclusive. The last value must be the length of the text. -func (p *paragraph) getLevels(linebreaks []int) []level { - // Note that since the previous processing has removed all - // P, S, and WS values from resultTypes, the values referred to - // in these rules are the initial types, before any processing - // has been applied (including processing of overrides). - // - // This example implementation has reinserted explicit format codes - // and BN, in order that the levels array correspond to the - // initial text. Their final placement is not normative. - // These codes are treated like WS in this implementation, - // so they don't interrupt sequences of WS. - - validateLineBreaks(linebreaks, p.Len()) - - result := append([]level(nil), p.resultLevels...) - - // don't worry about linebreaks since if there is a break within - // a series of WS values preceding S, the linebreak itself - // causes the reset. - for i, t := range p.initialTypes { - if t.in(B, S) { - // Rule L1, clauses one and two. - result[i] = p.embeddingLevel - - // Rule L1, clause three. - for j := i - 1; j >= 0; j-- { - if isWhitespace(p.initialTypes[j]) { // including format codes - result[j] = p.embeddingLevel - } else { - break - } - } - } - } - - // Rule L1, clause four. - start := 0 - for _, limit := range linebreaks { - for j := limit - 1; j >= start; j-- { - if isWhitespace(p.initialTypes[j]) { // including format codes - result[j] = p.embeddingLevel - } else { - break - } - } - start = limit - } - - return result -} - -// getReordering returns the reordering of lines from a visual index to a -// logical index for line breaks at the given offsets. -// -// Lines are concatenated from left to right. So for example, the fifth -// character from the left on the third line is -// -// getReordering(linebreaks)[linebreaks[1] + 4] -// -// (linebreaks[1] is the position after the last character of the second -// line, which is also the index of the first character on the third line, -// and adding four gets the fifth character from the left). -// -// The linebreaks array must include at least one value. The values must be -// in strictly increasing order (no duplicates) between 1 and the length of -// the text, inclusive. The last value must be the length of the text. -func (p *paragraph) getReordering(linebreaks []int) []int { - validateLineBreaks(linebreaks, p.Len()) - - return computeMultilineReordering(p.getLevels(linebreaks), linebreaks) -} - -// Return multiline reordering array for a given level array. Reordering -// does not occur across a line break. -func computeMultilineReordering(levels []level, linebreaks []int) []int { - result := make([]int, len(levels)) - - start := 0 - for _, limit := range linebreaks { - tempLevels := make([]level, limit-start) - copy(tempLevels, levels[start:]) - - for j, order := range computeReordering(tempLevels) { - result[start+j] = order + start - } - start = limit - } - return result -} - -// Return reordering array for a given level array. This reorders a single -// line. The reordering is a visual to logical map. For example, the -// leftmost char is string.charAt(order[0]). Rule L2. -func computeReordering(levels []level) []int { - result := make([]int, len(levels)) - // initialize order - for i := range result { - result[i] = i - } - - // locate highest level found on line. - // Note the rules say text, but no reordering across line bounds is - // performed, so this is sufficient. - highestLevel := level(0) - lowestOddLevel := level(maxDepth + 2) - for _, level := range levels { - if level > highestLevel { - highestLevel = level - } - if level&1 != 0 && level < lowestOddLevel { - lowestOddLevel = level - } - } - - for level := highestLevel; level >= lowestOddLevel; level-- { - for i := 0; i < len(levels); i++ { - if levels[i] >= level { - // find range of text at or above this level - start := i - limit := i + 1 - for limit < len(levels) && levels[limit] >= level { - limit++ - } - - for j, k := start, limit-1; j < k; j, k = j+1, k-1 { - result[j], result[k] = result[k], result[j] - } - // skip to end of level run - i = limit - } - } - } - - return result -} - -// isWhitespace reports whether the type is considered a whitespace type for the -// line break rules. -func isWhitespace(c Class) bool { - switch c { - case LRE, RLE, LRO, RLO, PDF, LRI, RLI, FSI, PDI, BN, WS: - return true - } - return false -} - -// isRemovedByX9 reports whether the type is one of the types removed in X9. -func isRemovedByX9(c Class) bool { - switch c { - case LRE, RLE, LRO, RLO, PDF, BN: - return true - } - return false -} - -// typeForLevel reports the strong type (L or R) corresponding to the level. -func typeForLevel(level level) Class { - if (level & 0x1) == 0 { - return L - } - return R -} - -// TODO: change validation to not panic - -func validateTypes(types []Class) { - if len(types) == 0 { - log.Panic("types is null") - } - for i, t := range types[:len(types)-1] { - if t == B { - log.Panicf("B type before end of paragraph at index: %d", i) - } - } -} - -func validateParagraphEmbeddingLevel(embeddingLevel level) { - if embeddingLevel != implicitLevel && - embeddingLevel != 0 && - embeddingLevel != 1 { - log.Panicf("illegal paragraph embedding level: %d", embeddingLevel) - } -} - -func validateLineBreaks(linebreaks []int, textLength int) { - prev := 0 - for i, next := range linebreaks { - if next <= prev { - log.Panicf("bad linebreak: %d at index: %d", next, i) - } - prev = next - } - if prev != textLength { - log.Panicf("last linebreak was %d, want %d", prev, textLength) - } -} - -func validatePbTypes(pairTypes []bracketType) { - if len(pairTypes) == 0 { - log.Panic("pairTypes is null") - } - for i, pt := range pairTypes { - switch pt { - case bpNone, bpOpen, bpClose: - default: - log.Panicf("illegal pairType value at %d: %v", i, pairTypes[i]) - } - } -} - -func validatePbValues(pairValues []rune, pairTypes []bracketType) { - if pairValues == nil { - log.Panic("pairValues is null") - } - if len(pairTypes) != len(pairValues) { - log.Panic("pairTypes is different length from pairValues") - } -} diff --git a/vendor/golang.org/x/text/unicode/bidi/gen.go b/vendor/golang.org/x/text/unicode/bidi/gen.go deleted file mode 100644 index 040f3013d..000000000 --- a/vendor/golang.org/x/text/unicode/bidi/gen.go +++ /dev/null @@ -1,133 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -import ( - "flag" - "log" - - "golang.org/x/text/internal/gen" - "golang.org/x/text/internal/triegen" - "golang.org/x/text/internal/ucd" -) - -var outputFile = flag.String("out", "tables.go", "output file") - -func main() { - gen.Init() - gen.Repackage("gen_trieval.go", "trieval.go", "bidi") - gen.Repackage("gen_ranges.go", "ranges_test.go", "bidi") - - genTables() -} - -// bidiClass names and codes taken from class "bc" in -// http://www.unicode.org/Public/8.0.0/ucd/PropertyValueAliases.txt -var bidiClass = map[string]Class{ - "AL": AL, // ArabicLetter - "AN": AN, // ArabicNumber - "B": B, // ParagraphSeparator - "BN": BN, // BoundaryNeutral - "CS": CS, // CommonSeparator - "EN": EN, // EuropeanNumber - "ES": ES, // EuropeanSeparator - "ET": ET, // EuropeanTerminator - "L": L, // LeftToRight - "NSM": NSM, // NonspacingMark - "ON": ON, // OtherNeutral - "R": R, // RightToLeft - "S": S, // SegmentSeparator - "WS": WS, // WhiteSpace - - "FSI": Control, - "PDF": Control, - "PDI": Control, - "LRE": Control, - "LRI": Control, - "LRO": Control, - "RLE": Control, - "RLI": Control, - "RLO": Control, -} - -func genTables() { - if numClass > 0x0F { - log.Fatalf("Too many Class constants (%#x > 0x0F).", numClass) - } - w := gen.NewCodeWriter() - defer w.WriteGoFile(*outputFile, "bidi") - - gen.WriteUnicodeVersion(w) - - t := triegen.NewTrie("bidi") - - // Build data about bracket mapping. These bits need to be or-ed with - // any other bits. - orMask := map[rune]uint64{} - - xorMap := map[rune]int{} - xorMasks := []rune{0} // First value is no-op. - - ucd.Parse(gen.OpenUCDFile("BidiBrackets.txt"), func(p *ucd.Parser) { - r1 := p.Rune(0) - r2 := p.Rune(1) - xor := r1 ^ r2 - if _, ok := xorMap[xor]; !ok { - xorMap[xor] = len(xorMasks) - xorMasks = append(xorMasks, xor) - } - entry := uint64(xorMap[xor]) << xorMaskShift - switch p.String(2) { - case "o": - entry |= openMask - case "c", "n": - default: - log.Fatalf("Unknown bracket class %q.", p.String(2)) - } - orMask[r1] = entry - }) - - w.WriteComment(` - xorMasks contains masks to be xor-ed with brackets to get the reverse - version.`) - w.WriteVar("xorMasks", xorMasks) - - done := map[rune]bool{} - - insert := func(r rune, c Class) { - if !done[r] { - t.Insert(r, orMask[r]|uint64(c)) - done[r] = true - } - } - - // Insert the derived BiDi properties. - ucd.Parse(gen.OpenUCDFile("extracted/DerivedBidiClass.txt"), func(p *ucd.Parser) { - r := p.Rune(0) - class, ok := bidiClass[p.String(1)] - if !ok { - log.Fatalf("%U: Unknown BiDi class %q", r, p.String(1)) - } - insert(r, class) - }) - visitDefaults(insert) - - // TODO: use sparse blocks. This would reduce table size considerably - // from the looks of it. - - sz, err := t.Gen(w) - if err != nil { - log.Fatal(err) - } - w.Size += sz -} - -// dummy values to make methods in gen_common compile. The real versions -// will be generated by this file to tables.go. -var ( - xorMasks []rune -) diff --git a/vendor/golang.org/x/text/unicode/bidi/gen_ranges.go b/vendor/golang.org/x/text/unicode/bidi/gen_ranges.go deleted file mode 100644 index 51bd68fa7..000000000 --- a/vendor/golang.org/x/text/unicode/bidi/gen_ranges.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -import ( - "unicode" - - "golang.org/x/text/internal/gen" - "golang.org/x/text/internal/ucd" - "golang.org/x/text/unicode/rangetable" -) - -// These tables are hand-extracted from: -// http://www.unicode.org/Public/8.0.0/ucd/extracted/DerivedBidiClass.txt -func visitDefaults(fn func(r rune, c Class)) { - // first write default values for ranges listed above. - visitRunes(fn, AL, []rune{ - 0x0600, 0x07BF, // Arabic - 0x08A0, 0x08FF, // Arabic Extended-A - 0xFB50, 0xFDCF, // Arabic Presentation Forms - 0xFDF0, 0xFDFF, - 0xFE70, 0xFEFF, - 0x0001EE00, 0x0001EEFF, // Arabic Mathematical Alpha Symbols - }) - visitRunes(fn, R, []rune{ - 0x0590, 0x05FF, // Hebrew - 0x07C0, 0x089F, // Nko et al. - 0xFB1D, 0xFB4F, - 0x00010800, 0x00010FFF, // Cypriot Syllabary et. al. - 0x0001E800, 0x0001EDFF, - 0x0001EF00, 0x0001EFFF, - }) - visitRunes(fn, ET, []rune{ // European Terminator - 0x20A0, 0x20Cf, // Currency symbols - }) - rangetable.Visit(unicode.Noncharacter_Code_Point, func(r rune) { - fn(r, BN) // Boundary Neutral - }) - ucd.Parse(gen.OpenUCDFile("DerivedCoreProperties.txt"), func(p *ucd.Parser) { - if p.String(1) == "Default_Ignorable_Code_Point" { - fn(p.Rune(0), BN) // Boundary Neutral - } - }) -} - -func visitRunes(fn func(r rune, c Class), c Class, runes []rune) { - for i := 0; i < len(runes); i += 2 { - lo, hi := runes[i], runes[i+1] - for j := lo; j <= hi; j++ { - fn(j, c) - } - } -} diff --git a/vendor/golang.org/x/text/unicode/bidi/gen_trieval.go b/vendor/golang.org/x/text/unicode/bidi/gen_trieval.go deleted file mode 100644 index 9cb994289..000000000 --- a/vendor/golang.org/x/text/unicode/bidi/gen_trieval.go +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -// Class is the Unicode BiDi class. Each rune has a single class. -type Class uint - -const ( - L Class = iota // LeftToRight - R // RightToLeft - EN // EuropeanNumber - ES // EuropeanSeparator - ET // EuropeanTerminator - AN // ArabicNumber - CS // CommonSeparator - B // ParagraphSeparator - S // SegmentSeparator - WS // WhiteSpace - ON // OtherNeutral - BN // BoundaryNeutral - NSM // NonspacingMark - AL // ArabicLetter - Control // Control LRO - PDI - - numClass - - LRO // LeftToRightOverride - RLO // RightToLeftOverride - LRE // LeftToRightEmbedding - RLE // RightToLeftEmbedding - PDF // PopDirectionalFormat - LRI // LeftToRightIsolate - RLI // RightToLeftIsolate - FSI // FirstStrongIsolate - PDI // PopDirectionalIsolate - - unknownClass = ^Class(0) -) - -var controlToClass = map[rune]Class{ - 0x202D: LRO, // LeftToRightOverride, - 0x202E: RLO, // RightToLeftOverride, - 0x202A: LRE, // LeftToRightEmbedding, - 0x202B: RLE, // RightToLeftEmbedding, - 0x202C: PDF, // PopDirectionalFormat, - 0x2066: LRI, // LeftToRightIsolate, - 0x2067: RLI, // RightToLeftIsolate, - 0x2068: FSI, // FirstStrongIsolate, - 0x2069: PDI, // PopDirectionalIsolate, -} - -// A trie entry has the following bits: -// 7..5 XOR mask for brackets -// 4 1: Bracket open, 0: Bracket close -// 3..0 Class type - -const ( - openMask = 0x10 - xorMaskShift = 5 -) diff --git a/vendor/golang.org/x/text/unicode/bidi/prop.go b/vendor/golang.org/x/text/unicode/bidi/prop.go deleted file mode 100644 index 7c9484e1f..000000000 --- a/vendor/golang.org/x/text/unicode/bidi/prop.go +++ /dev/null @@ -1,206 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bidi - -import "unicode/utf8" - -// Properties provides access to BiDi properties of runes. -type Properties struct { - entry uint8 - last uint8 -} - -var trie = newBidiTrie(0) - -// TODO: using this for bidirule reduces the running time by about 5%. Consider -// if this is worth exposing or if we can find a way to speed up the Class -// method. -// -// // CompactClass is like Class, but maps all of the BiDi control classes -// // (LRO, RLO, LRE, RLE, PDF, LRI, RLI, FSI, PDI) to the class Control. -// func (p Properties) CompactClass() Class { -// return Class(p.entry & 0x0F) -// } - -// Class returns the Bidi class for p. -func (p Properties) Class() Class { - c := Class(p.entry & 0x0F) - if c == Control { - c = controlByteToClass[p.last&0xF] - } - return c -} - -// IsBracket reports whether the rune is a bracket. -func (p Properties) IsBracket() bool { return p.entry&0xF0 != 0 } - -// IsOpeningBracket reports whether the rune is an opening bracket. -// IsBracket must return true. -func (p Properties) IsOpeningBracket() bool { return p.entry&openMask != 0 } - -// TODO: find a better API and expose. -func (p Properties) reverseBracket(r rune) rune { - return xorMasks[p.entry>>xorMaskShift] ^ r -} - -var controlByteToClass = [16]Class{ - 0xD: LRO, // U+202D LeftToRightOverride, - 0xE: RLO, // U+202E RightToLeftOverride, - 0xA: LRE, // U+202A LeftToRightEmbedding, - 0xB: RLE, // U+202B RightToLeftEmbedding, - 0xC: PDF, // U+202C PopDirectionalFormat, - 0x6: LRI, // U+2066 LeftToRightIsolate, - 0x7: RLI, // U+2067 RightToLeftIsolate, - 0x8: FSI, // U+2068 FirstStrongIsolate, - 0x9: PDI, // U+2069 PopDirectionalIsolate, -} - -// LookupRune returns properties for r. -func LookupRune(r rune) (p Properties, size int) { - var buf [4]byte - n := utf8.EncodeRune(buf[:], r) - return Lookup(buf[:n]) -} - -// TODO: these lookup methods are based on the generated trie code. The returned -// sizes have slightly different semantics from the generated code, in that it -// always returns size==1 for an illegal UTF-8 byte (instead of the length -// of the maximum invalid subsequence). Most Transformers, like unicode/norm, -// leave invalid UTF-8 untouched, in which case it has performance benefits to -// do so (without changing the semantics). Bidi requires the semantics used here -// for the bidirule implementation to be compatible with the Go semantics. -// They ultimately should perhaps be adopted by all trie implementations, for -// convenience sake. -// This unrolled code also boosts performance of the secure/bidirule package by -// about 30%. -// So, to remove this code: -// - add option to trie generator to define return type. -// - always return 1 byte size for ill-formed UTF-8 runes. - -// Lookup returns properties for the first rune in s and the width in bytes of -// its encoding. The size will be 0 if s does not hold enough bytes to complete -// the encoding. -func Lookup(s []byte) (p Properties, sz int) { - c0 := s[0] - switch { - case c0 < 0x80: // is ASCII - return Properties{entry: bidiValues[c0]}, 1 - case c0 < 0xC2: - return Properties{}, 1 - case c0 < 0xE0: // 2-byte UTF-8 - if len(s) < 2 { - return Properties{}, 0 - } - i := bidiIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return Properties{}, 1 - } - return Properties{entry: trie.lookupValue(uint32(i), c1)}, 2 - case c0 < 0xF0: // 3-byte UTF-8 - if len(s) < 3 { - return Properties{}, 0 - } - i := bidiIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return Properties{}, 1 - } - o := uint32(i)<<6 + uint32(c1) - i = bidiIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return Properties{}, 1 - } - return Properties{entry: trie.lookupValue(uint32(i), c2), last: c2}, 3 - case c0 < 0xF8: // 4-byte UTF-8 - if len(s) < 4 { - return Properties{}, 0 - } - i := bidiIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return Properties{}, 1 - } - o := uint32(i)<<6 + uint32(c1) - i = bidiIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return Properties{}, 1 - } - o = uint32(i)<<6 + uint32(c2) - i = bidiIndex[o] - c3 := s[3] - if c3 < 0x80 || 0xC0 <= c3 { - return Properties{}, 1 - } - return Properties{entry: trie.lookupValue(uint32(i), c3)}, 4 - } - // Illegal rune - return Properties{}, 1 -} - -// LookupString returns properties for the first rune in s and the width in -// bytes of its encoding. The size will be 0 if s does not hold enough bytes to -// complete the encoding. -func LookupString(s string) (p Properties, sz int) { - c0 := s[0] - switch { - case c0 < 0x80: // is ASCII - return Properties{entry: bidiValues[c0]}, 1 - case c0 < 0xC2: - return Properties{}, 1 - case c0 < 0xE0: // 2-byte UTF-8 - if len(s) < 2 { - return Properties{}, 0 - } - i := bidiIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return Properties{}, 1 - } - return Properties{entry: trie.lookupValue(uint32(i), c1)}, 2 - case c0 < 0xF0: // 3-byte UTF-8 - if len(s) < 3 { - return Properties{}, 0 - } - i := bidiIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return Properties{}, 1 - } - o := uint32(i)<<6 + uint32(c1) - i = bidiIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return Properties{}, 1 - } - return Properties{entry: trie.lookupValue(uint32(i), c2), last: c2}, 3 - case c0 < 0xF8: // 4-byte UTF-8 - if len(s) < 4 { - return Properties{}, 0 - } - i := bidiIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return Properties{}, 1 - } - o := uint32(i)<<6 + uint32(c1) - i = bidiIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return Properties{}, 1 - } - o = uint32(i)<<6 + uint32(c2) - i = bidiIndex[o] - c3 := s[3] - if c3 < 0x80 || 0xC0 <= c3 { - return Properties{}, 1 - } - return Properties{entry: trie.lookupValue(uint32(i), c3)}, 4 - } - // Illegal rune - return Properties{}, 1 -} diff --git a/vendor/golang.org/x/text/unicode/bidi/tables.go b/vendor/golang.org/x/text/unicode/bidi/tables.go deleted file mode 100644 index 7212d5add..000000000 --- a/vendor/golang.org/x/text/unicode/bidi/tables.go +++ /dev/null @@ -1,1779 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -package bidi - -// UnicodeVersion is the Unicode version from which the tables in this package are derived. -const UnicodeVersion = "9.0.0" - -// xorMasks contains masks to be xor-ed with brackets to get the reverse -// version. -var xorMasks = []int32{ // 8 elements - 0, 1, 6, 7, 3, 15, 29, 63, -} // Size: 56 bytes - -// lookup returns the trie value for the first UTF-8 encoding in s and -// the width in bytes of this encoding. The size will be 0 if s does not -// hold enough bytes to complete the encoding. len(s) must be greater than 0. -func (t *bidiTrie) lookup(s []byte) (v uint8, sz int) { - c0 := s[0] - switch { - case c0 < 0x80: // is ASCII - return bidiValues[c0], 1 - case c0 < 0xC2: - return 0, 1 // Illegal UTF-8: not a starter, not ASCII. - case c0 < 0xE0: // 2-byte UTF-8 - if len(s) < 2 { - return 0, 0 - } - i := bidiIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c1), 2 - case c0 < 0xF0: // 3-byte UTF-8 - if len(s) < 3 { - return 0, 0 - } - i := bidiIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - o := uint32(i)<<6 + uint32(c1) - i = bidiIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return 0, 2 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c2), 3 - case c0 < 0xF8: // 4-byte UTF-8 - if len(s) < 4 { - return 0, 0 - } - i := bidiIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - o := uint32(i)<<6 + uint32(c1) - i = bidiIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return 0, 2 // Illegal UTF-8: not a continuation byte. - } - o = uint32(i)<<6 + uint32(c2) - i = bidiIndex[o] - c3 := s[3] - if c3 < 0x80 || 0xC0 <= c3 { - return 0, 3 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c3), 4 - } - // Illegal rune - return 0, 1 -} - -// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. -// s must start with a full and valid UTF-8 encoded rune. -func (t *bidiTrie) lookupUnsafe(s []byte) uint8 { - c0 := s[0] - if c0 < 0x80 { // is ASCII - return bidiValues[c0] - } - i := bidiIndex[c0] - if c0 < 0xE0 { // 2-byte UTF-8 - return t.lookupValue(uint32(i), s[1]) - } - i = bidiIndex[uint32(i)<<6+uint32(s[1])] - if c0 < 0xF0 { // 3-byte UTF-8 - return t.lookupValue(uint32(i), s[2]) - } - i = bidiIndex[uint32(i)<<6+uint32(s[2])] - if c0 < 0xF8 { // 4-byte UTF-8 - return t.lookupValue(uint32(i), s[3]) - } - return 0 -} - -// lookupString returns the trie value for the first UTF-8 encoding in s and -// the width in bytes of this encoding. The size will be 0 if s does not -// hold enough bytes to complete the encoding. len(s) must be greater than 0. -func (t *bidiTrie) lookupString(s string) (v uint8, sz int) { - c0 := s[0] - switch { - case c0 < 0x80: // is ASCII - return bidiValues[c0], 1 - case c0 < 0xC2: - return 0, 1 // Illegal UTF-8: not a starter, not ASCII. - case c0 < 0xE0: // 2-byte UTF-8 - if len(s) < 2 { - return 0, 0 - } - i := bidiIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c1), 2 - case c0 < 0xF0: // 3-byte UTF-8 - if len(s) < 3 { - return 0, 0 - } - i := bidiIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - o := uint32(i)<<6 + uint32(c1) - i = bidiIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return 0, 2 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c2), 3 - case c0 < 0xF8: // 4-byte UTF-8 - if len(s) < 4 { - return 0, 0 - } - i := bidiIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - o := uint32(i)<<6 + uint32(c1) - i = bidiIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return 0, 2 // Illegal UTF-8: not a continuation byte. - } - o = uint32(i)<<6 + uint32(c2) - i = bidiIndex[o] - c3 := s[3] - if c3 < 0x80 || 0xC0 <= c3 { - return 0, 3 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c3), 4 - } - // Illegal rune - return 0, 1 -} - -// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. -// s must start with a full and valid UTF-8 encoded rune. -func (t *bidiTrie) lookupStringUnsafe(s string) uint8 { - c0 := s[0] - if c0 < 0x80 { // is ASCII - return bidiValues[c0] - } - i := bidiIndex[c0] - if c0 < 0xE0 { // 2-byte UTF-8 - return t.lookupValue(uint32(i), s[1]) - } - i = bidiIndex[uint32(i)<<6+uint32(s[1])] - if c0 < 0xF0 { // 3-byte UTF-8 - return t.lookupValue(uint32(i), s[2]) - } - i = bidiIndex[uint32(i)<<6+uint32(s[2])] - if c0 < 0xF8 { // 4-byte UTF-8 - return t.lookupValue(uint32(i), s[3]) - } - return 0 -} - -// bidiTrie. Total size: 15744 bytes (15.38 KiB). Checksum: b4c3b70954803b86. -type bidiTrie struct{} - -func newBidiTrie(i int) *bidiTrie { - return &bidiTrie{} -} - -// lookupValue determines the type of block n and looks up the value for b. -func (t *bidiTrie) lookupValue(n uint32, b byte) uint8 { - switch { - default: - return uint8(bidiValues[n<<6+uint32(b)]) - } -} - -// bidiValues: 222 blocks, 14208 entries, 14208 bytes -// The third block is the zero block. -var bidiValues = [14208]uint8{ - // Block 0x0, offset 0x0 - 0x00: 0x000b, 0x01: 0x000b, 0x02: 0x000b, 0x03: 0x000b, 0x04: 0x000b, 0x05: 0x000b, - 0x06: 0x000b, 0x07: 0x000b, 0x08: 0x000b, 0x09: 0x0008, 0x0a: 0x0007, 0x0b: 0x0008, - 0x0c: 0x0009, 0x0d: 0x0007, 0x0e: 0x000b, 0x0f: 0x000b, 0x10: 0x000b, 0x11: 0x000b, - 0x12: 0x000b, 0x13: 0x000b, 0x14: 0x000b, 0x15: 0x000b, 0x16: 0x000b, 0x17: 0x000b, - 0x18: 0x000b, 0x19: 0x000b, 0x1a: 0x000b, 0x1b: 0x000b, 0x1c: 0x0007, 0x1d: 0x0007, - 0x1e: 0x0007, 0x1f: 0x0008, 0x20: 0x0009, 0x21: 0x000a, 0x22: 0x000a, 0x23: 0x0004, - 0x24: 0x0004, 0x25: 0x0004, 0x26: 0x000a, 0x27: 0x000a, 0x28: 0x003a, 0x29: 0x002a, - 0x2a: 0x000a, 0x2b: 0x0003, 0x2c: 0x0006, 0x2d: 0x0003, 0x2e: 0x0006, 0x2f: 0x0006, - 0x30: 0x0002, 0x31: 0x0002, 0x32: 0x0002, 0x33: 0x0002, 0x34: 0x0002, 0x35: 0x0002, - 0x36: 0x0002, 0x37: 0x0002, 0x38: 0x0002, 0x39: 0x0002, 0x3a: 0x0006, 0x3b: 0x000a, - 0x3c: 0x000a, 0x3d: 0x000a, 0x3e: 0x000a, 0x3f: 0x000a, - // Block 0x1, offset 0x40 - 0x40: 0x000a, - 0x5b: 0x005a, 0x5c: 0x000a, 0x5d: 0x004a, - 0x5e: 0x000a, 0x5f: 0x000a, 0x60: 0x000a, - 0x7b: 0x005a, - 0x7c: 0x000a, 0x7d: 0x004a, 0x7e: 0x000a, 0x7f: 0x000b, - // Block 0x2, offset 0x80 - // Block 0x3, offset 0xc0 - 0xc0: 0x000b, 0xc1: 0x000b, 0xc2: 0x000b, 0xc3: 0x000b, 0xc4: 0x000b, 0xc5: 0x0007, - 0xc6: 0x000b, 0xc7: 0x000b, 0xc8: 0x000b, 0xc9: 0x000b, 0xca: 0x000b, 0xcb: 0x000b, - 0xcc: 0x000b, 0xcd: 0x000b, 0xce: 0x000b, 0xcf: 0x000b, 0xd0: 0x000b, 0xd1: 0x000b, - 0xd2: 0x000b, 0xd3: 0x000b, 0xd4: 0x000b, 0xd5: 0x000b, 0xd6: 0x000b, 0xd7: 0x000b, - 0xd8: 0x000b, 0xd9: 0x000b, 0xda: 0x000b, 0xdb: 0x000b, 0xdc: 0x000b, 0xdd: 0x000b, - 0xde: 0x000b, 0xdf: 0x000b, 0xe0: 0x0006, 0xe1: 0x000a, 0xe2: 0x0004, 0xe3: 0x0004, - 0xe4: 0x0004, 0xe5: 0x0004, 0xe6: 0x000a, 0xe7: 0x000a, 0xe8: 0x000a, 0xe9: 0x000a, - 0xeb: 0x000a, 0xec: 0x000a, 0xed: 0x000b, 0xee: 0x000a, 0xef: 0x000a, - 0xf0: 0x0004, 0xf1: 0x0004, 0xf2: 0x0002, 0xf3: 0x0002, 0xf4: 0x000a, - 0xf6: 0x000a, 0xf7: 0x000a, 0xf8: 0x000a, 0xf9: 0x0002, 0xfb: 0x000a, - 0xfc: 0x000a, 0xfd: 0x000a, 0xfe: 0x000a, 0xff: 0x000a, - // Block 0x4, offset 0x100 - 0x117: 0x000a, - 0x137: 0x000a, - // Block 0x5, offset 0x140 - 0x179: 0x000a, 0x17a: 0x000a, - // Block 0x6, offset 0x180 - 0x182: 0x000a, 0x183: 0x000a, 0x184: 0x000a, 0x185: 0x000a, - 0x186: 0x000a, 0x187: 0x000a, 0x188: 0x000a, 0x189: 0x000a, 0x18a: 0x000a, 0x18b: 0x000a, - 0x18c: 0x000a, 0x18d: 0x000a, 0x18e: 0x000a, 0x18f: 0x000a, - 0x192: 0x000a, 0x193: 0x000a, 0x194: 0x000a, 0x195: 0x000a, 0x196: 0x000a, 0x197: 0x000a, - 0x198: 0x000a, 0x199: 0x000a, 0x19a: 0x000a, 0x19b: 0x000a, 0x19c: 0x000a, 0x19d: 0x000a, - 0x19e: 0x000a, 0x19f: 0x000a, - 0x1a5: 0x000a, 0x1a6: 0x000a, 0x1a7: 0x000a, 0x1a8: 0x000a, 0x1a9: 0x000a, - 0x1aa: 0x000a, 0x1ab: 0x000a, 0x1ac: 0x000a, 0x1ad: 0x000a, 0x1af: 0x000a, - 0x1b0: 0x000a, 0x1b1: 0x000a, 0x1b2: 0x000a, 0x1b3: 0x000a, 0x1b4: 0x000a, 0x1b5: 0x000a, - 0x1b6: 0x000a, 0x1b7: 0x000a, 0x1b8: 0x000a, 0x1b9: 0x000a, 0x1ba: 0x000a, 0x1bb: 0x000a, - 0x1bc: 0x000a, 0x1bd: 0x000a, 0x1be: 0x000a, 0x1bf: 0x000a, - // Block 0x7, offset 0x1c0 - 0x1c0: 0x000c, 0x1c1: 0x000c, 0x1c2: 0x000c, 0x1c3: 0x000c, 0x1c4: 0x000c, 0x1c5: 0x000c, - 0x1c6: 0x000c, 0x1c7: 0x000c, 0x1c8: 0x000c, 0x1c9: 0x000c, 0x1ca: 0x000c, 0x1cb: 0x000c, - 0x1cc: 0x000c, 0x1cd: 0x000c, 0x1ce: 0x000c, 0x1cf: 0x000c, 0x1d0: 0x000c, 0x1d1: 0x000c, - 0x1d2: 0x000c, 0x1d3: 0x000c, 0x1d4: 0x000c, 0x1d5: 0x000c, 0x1d6: 0x000c, 0x1d7: 0x000c, - 0x1d8: 0x000c, 0x1d9: 0x000c, 0x1da: 0x000c, 0x1db: 0x000c, 0x1dc: 0x000c, 0x1dd: 0x000c, - 0x1de: 0x000c, 0x1df: 0x000c, 0x1e0: 0x000c, 0x1e1: 0x000c, 0x1e2: 0x000c, 0x1e3: 0x000c, - 0x1e4: 0x000c, 0x1e5: 0x000c, 0x1e6: 0x000c, 0x1e7: 0x000c, 0x1e8: 0x000c, 0x1e9: 0x000c, - 0x1ea: 0x000c, 0x1eb: 0x000c, 0x1ec: 0x000c, 0x1ed: 0x000c, 0x1ee: 0x000c, 0x1ef: 0x000c, - 0x1f0: 0x000c, 0x1f1: 0x000c, 0x1f2: 0x000c, 0x1f3: 0x000c, 0x1f4: 0x000c, 0x1f5: 0x000c, - 0x1f6: 0x000c, 0x1f7: 0x000c, 0x1f8: 0x000c, 0x1f9: 0x000c, 0x1fa: 0x000c, 0x1fb: 0x000c, - 0x1fc: 0x000c, 0x1fd: 0x000c, 0x1fe: 0x000c, 0x1ff: 0x000c, - // Block 0x8, offset 0x200 - 0x200: 0x000c, 0x201: 0x000c, 0x202: 0x000c, 0x203: 0x000c, 0x204: 0x000c, 0x205: 0x000c, - 0x206: 0x000c, 0x207: 0x000c, 0x208: 0x000c, 0x209: 0x000c, 0x20a: 0x000c, 0x20b: 0x000c, - 0x20c: 0x000c, 0x20d: 0x000c, 0x20e: 0x000c, 0x20f: 0x000c, 0x210: 0x000c, 0x211: 0x000c, - 0x212: 0x000c, 0x213: 0x000c, 0x214: 0x000c, 0x215: 0x000c, 0x216: 0x000c, 0x217: 0x000c, - 0x218: 0x000c, 0x219: 0x000c, 0x21a: 0x000c, 0x21b: 0x000c, 0x21c: 0x000c, 0x21d: 0x000c, - 0x21e: 0x000c, 0x21f: 0x000c, 0x220: 0x000c, 0x221: 0x000c, 0x222: 0x000c, 0x223: 0x000c, - 0x224: 0x000c, 0x225: 0x000c, 0x226: 0x000c, 0x227: 0x000c, 0x228: 0x000c, 0x229: 0x000c, - 0x22a: 0x000c, 0x22b: 0x000c, 0x22c: 0x000c, 0x22d: 0x000c, 0x22e: 0x000c, 0x22f: 0x000c, - 0x234: 0x000a, 0x235: 0x000a, - 0x23e: 0x000a, - // Block 0x9, offset 0x240 - 0x244: 0x000a, 0x245: 0x000a, - 0x247: 0x000a, - // Block 0xa, offset 0x280 - 0x2b6: 0x000a, - // Block 0xb, offset 0x2c0 - 0x2c3: 0x000c, 0x2c4: 0x000c, 0x2c5: 0x000c, - 0x2c6: 0x000c, 0x2c7: 0x000c, 0x2c8: 0x000c, 0x2c9: 0x000c, - // Block 0xc, offset 0x300 - 0x30a: 0x000a, - 0x30d: 0x000a, 0x30e: 0x000a, 0x30f: 0x0004, 0x310: 0x0001, 0x311: 0x000c, - 0x312: 0x000c, 0x313: 0x000c, 0x314: 0x000c, 0x315: 0x000c, 0x316: 0x000c, 0x317: 0x000c, - 0x318: 0x000c, 0x319: 0x000c, 0x31a: 0x000c, 0x31b: 0x000c, 0x31c: 0x000c, 0x31d: 0x000c, - 0x31e: 0x000c, 0x31f: 0x000c, 0x320: 0x000c, 0x321: 0x000c, 0x322: 0x000c, 0x323: 0x000c, - 0x324: 0x000c, 0x325: 0x000c, 0x326: 0x000c, 0x327: 0x000c, 0x328: 0x000c, 0x329: 0x000c, - 0x32a: 0x000c, 0x32b: 0x000c, 0x32c: 0x000c, 0x32d: 0x000c, 0x32e: 0x000c, 0x32f: 0x000c, - 0x330: 0x000c, 0x331: 0x000c, 0x332: 0x000c, 0x333: 0x000c, 0x334: 0x000c, 0x335: 0x000c, - 0x336: 0x000c, 0x337: 0x000c, 0x338: 0x000c, 0x339: 0x000c, 0x33a: 0x000c, 0x33b: 0x000c, - 0x33c: 0x000c, 0x33d: 0x000c, 0x33e: 0x0001, 0x33f: 0x000c, - // Block 0xd, offset 0x340 - 0x340: 0x0001, 0x341: 0x000c, 0x342: 0x000c, 0x343: 0x0001, 0x344: 0x000c, 0x345: 0x000c, - 0x346: 0x0001, 0x347: 0x000c, 0x348: 0x0001, 0x349: 0x0001, 0x34a: 0x0001, 0x34b: 0x0001, - 0x34c: 0x0001, 0x34d: 0x0001, 0x34e: 0x0001, 0x34f: 0x0001, 0x350: 0x0001, 0x351: 0x0001, - 0x352: 0x0001, 0x353: 0x0001, 0x354: 0x0001, 0x355: 0x0001, 0x356: 0x0001, 0x357: 0x0001, - 0x358: 0x0001, 0x359: 0x0001, 0x35a: 0x0001, 0x35b: 0x0001, 0x35c: 0x0001, 0x35d: 0x0001, - 0x35e: 0x0001, 0x35f: 0x0001, 0x360: 0x0001, 0x361: 0x0001, 0x362: 0x0001, 0x363: 0x0001, - 0x364: 0x0001, 0x365: 0x0001, 0x366: 0x0001, 0x367: 0x0001, 0x368: 0x0001, 0x369: 0x0001, - 0x36a: 0x0001, 0x36b: 0x0001, 0x36c: 0x0001, 0x36d: 0x0001, 0x36e: 0x0001, 0x36f: 0x0001, - 0x370: 0x0001, 0x371: 0x0001, 0x372: 0x0001, 0x373: 0x0001, 0x374: 0x0001, 0x375: 0x0001, - 0x376: 0x0001, 0x377: 0x0001, 0x378: 0x0001, 0x379: 0x0001, 0x37a: 0x0001, 0x37b: 0x0001, - 0x37c: 0x0001, 0x37d: 0x0001, 0x37e: 0x0001, 0x37f: 0x0001, - // Block 0xe, offset 0x380 - 0x380: 0x0005, 0x381: 0x0005, 0x382: 0x0005, 0x383: 0x0005, 0x384: 0x0005, 0x385: 0x0005, - 0x386: 0x000a, 0x387: 0x000a, 0x388: 0x000d, 0x389: 0x0004, 0x38a: 0x0004, 0x38b: 0x000d, - 0x38c: 0x0006, 0x38d: 0x000d, 0x38e: 0x000a, 0x38f: 0x000a, 0x390: 0x000c, 0x391: 0x000c, - 0x392: 0x000c, 0x393: 0x000c, 0x394: 0x000c, 0x395: 0x000c, 0x396: 0x000c, 0x397: 0x000c, - 0x398: 0x000c, 0x399: 0x000c, 0x39a: 0x000c, 0x39b: 0x000d, 0x39c: 0x000d, 0x39d: 0x000d, - 0x39e: 0x000d, 0x39f: 0x000d, 0x3a0: 0x000d, 0x3a1: 0x000d, 0x3a2: 0x000d, 0x3a3: 0x000d, - 0x3a4: 0x000d, 0x3a5: 0x000d, 0x3a6: 0x000d, 0x3a7: 0x000d, 0x3a8: 0x000d, 0x3a9: 0x000d, - 0x3aa: 0x000d, 0x3ab: 0x000d, 0x3ac: 0x000d, 0x3ad: 0x000d, 0x3ae: 0x000d, 0x3af: 0x000d, - 0x3b0: 0x000d, 0x3b1: 0x000d, 0x3b2: 0x000d, 0x3b3: 0x000d, 0x3b4: 0x000d, 0x3b5: 0x000d, - 0x3b6: 0x000d, 0x3b7: 0x000d, 0x3b8: 0x000d, 0x3b9: 0x000d, 0x3ba: 0x000d, 0x3bb: 0x000d, - 0x3bc: 0x000d, 0x3bd: 0x000d, 0x3be: 0x000d, 0x3bf: 0x000d, - // Block 0xf, offset 0x3c0 - 0x3c0: 0x000d, 0x3c1: 0x000d, 0x3c2: 0x000d, 0x3c3: 0x000d, 0x3c4: 0x000d, 0x3c5: 0x000d, - 0x3c6: 0x000d, 0x3c7: 0x000d, 0x3c8: 0x000d, 0x3c9: 0x000d, 0x3ca: 0x000d, 0x3cb: 0x000c, - 0x3cc: 0x000c, 0x3cd: 0x000c, 0x3ce: 0x000c, 0x3cf: 0x000c, 0x3d0: 0x000c, 0x3d1: 0x000c, - 0x3d2: 0x000c, 0x3d3: 0x000c, 0x3d4: 0x000c, 0x3d5: 0x000c, 0x3d6: 0x000c, 0x3d7: 0x000c, - 0x3d8: 0x000c, 0x3d9: 0x000c, 0x3da: 0x000c, 0x3db: 0x000c, 0x3dc: 0x000c, 0x3dd: 0x000c, - 0x3de: 0x000c, 0x3df: 0x000c, 0x3e0: 0x0005, 0x3e1: 0x0005, 0x3e2: 0x0005, 0x3e3: 0x0005, - 0x3e4: 0x0005, 0x3e5: 0x0005, 0x3e6: 0x0005, 0x3e7: 0x0005, 0x3e8: 0x0005, 0x3e9: 0x0005, - 0x3ea: 0x0004, 0x3eb: 0x0005, 0x3ec: 0x0005, 0x3ed: 0x000d, 0x3ee: 0x000d, 0x3ef: 0x000d, - 0x3f0: 0x000c, 0x3f1: 0x000d, 0x3f2: 0x000d, 0x3f3: 0x000d, 0x3f4: 0x000d, 0x3f5: 0x000d, - 0x3f6: 0x000d, 0x3f7: 0x000d, 0x3f8: 0x000d, 0x3f9: 0x000d, 0x3fa: 0x000d, 0x3fb: 0x000d, - 0x3fc: 0x000d, 0x3fd: 0x000d, 0x3fe: 0x000d, 0x3ff: 0x000d, - // Block 0x10, offset 0x400 - 0x400: 0x000d, 0x401: 0x000d, 0x402: 0x000d, 0x403: 0x000d, 0x404: 0x000d, 0x405: 0x000d, - 0x406: 0x000d, 0x407: 0x000d, 0x408: 0x000d, 0x409: 0x000d, 0x40a: 0x000d, 0x40b: 0x000d, - 0x40c: 0x000d, 0x40d: 0x000d, 0x40e: 0x000d, 0x40f: 0x000d, 0x410: 0x000d, 0x411: 0x000d, - 0x412: 0x000d, 0x413: 0x000d, 0x414: 0x000d, 0x415: 0x000d, 0x416: 0x000d, 0x417: 0x000d, - 0x418: 0x000d, 0x419: 0x000d, 0x41a: 0x000d, 0x41b: 0x000d, 0x41c: 0x000d, 0x41d: 0x000d, - 0x41e: 0x000d, 0x41f: 0x000d, 0x420: 0x000d, 0x421: 0x000d, 0x422: 0x000d, 0x423: 0x000d, - 0x424: 0x000d, 0x425: 0x000d, 0x426: 0x000d, 0x427: 0x000d, 0x428: 0x000d, 0x429: 0x000d, - 0x42a: 0x000d, 0x42b: 0x000d, 0x42c: 0x000d, 0x42d: 0x000d, 0x42e: 0x000d, 0x42f: 0x000d, - 0x430: 0x000d, 0x431: 0x000d, 0x432: 0x000d, 0x433: 0x000d, 0x434: 0x000d, 0x435: 0x000d, - 0x436: 0x000d, 0x437: 0x000d, 0x438: 0x000d, 0x439: 0x000d, 0x43a: 0x000d, 0x43b: 0x000d, - 0x43c: 0x000d, 0x43d: 0x000d, 0x43e: 0x000d, 0x43f: 0x000d, - // Block 0x11, offset 0x440 - 0x440: 0x000d, 0x441: 0x000d, 0x442: 0x000d, 0x443: 0x000d, 0x444: 0x000d, 0x445: 0x000d, - 0x446: 0x000d, 0x447: 0x000d, 0x448: 0x000d, 0x449: 0x000d, 0x44a: 0x000d, 0x44b: 0x000d, - 0x44c: 0x000d, 0x44d: 0x000d, 0x44e: 0x000d, 0x44f: 0x000d, 0x450: 0x000d, 0x451: 0x000d, - 0x452: 0x000d, 0x453: 0x000d, 0x454: 0x000d, 0x455: 0x000d, 0x456: 0x000c, 0x457: 0x000c, - 0x458: 0x000c, 0x459: 0x000c, 0x45a: 0x000c, 0x45b: 0x000c, 0x45c: 0x000c, 0x45d: 0x0005, - 0x45e: 0x000a, 0x45f: 0x000c, 0x460: 0x000c, 0x461: 0x000c, 0x462: 0x000c, 0x463: 0x000c, - 0x464: 0x000c, 0x465: 0x000d, 0x466: 0x000d, 0x467: 0x000c, 0x468: 0x000c, 0x469: 0x000a, - 0x46a: 0x000c, 0x46b: 0x000c, 0x46c: 0x000c, 0x46d: 0x000c, 0x46e: 0x000d, 0x46f: 0x000d, - 0x470: 0x0002, 0x471: 0x0002, 0x472: 0x0002, 0x473: 0x0002, 0x474: 0x0002, 0x475: 0x0002, - 0x476: 0x0002, 0x477: 0x0002, 0x478: 0x0002, 0x479: 0x0002, 0x47a: 0x000d, 0x47b: 0x000d, - 0x47c: 0x000d, 0x47d: 0x000d, 0x47e: 0x000d, 0x47f: 0x000d, - // Block 0x12, offset 0x480 - 0x480: 0x000d, 0x481: 0x000d, 0x482: 0x000d, 0x483: 0x000d, 0x484: 0x000d, 0x485: 0x000d, - 0x486: 0x000d, 0x487: 0x000d, 0x488: 0x000d, 0x489: 0x000d, 0x48a: 0x000d, 0x48b: 0x000d, - 0x48c: 0x000d, 0x48d: 0x000d, 0x48e: 0x000d, 0x48f: 0x000d, 0x490: 0x000d, 0x491: 0x000c, - 0x492: 0x000d, 0x493: 0x000d, 0x494: 0x000d, 0x495: 0x000d, 0x496: 0x000d, 0x497: 0x000d, - 0x498: 0x000d, 0x499: 0x000d, 0x49a: 0x000d, 0x49b: 0x000d, 0x49c: 0x000d, 0x49d: 0x000d, - 0x49e: 0x000d, 0x49f: 0x000d, 0x4a0: 0x000d, 0x4a1: 0x000d, 0x4a2: 0x000d, 0x4a3: 0x000d, - 0x4a4: 0x000d, 0x4a5: 0x000d, 0x4a6: 0x000d, 0x4a7: 0x000d, 0x4a8: 0x000d, 0x4a9: 0x000d, - 0x4aa: 0x000d, 0x4ab: 0x000d, 0x4ac: 0x000d, 0x4ad: 0x000d, 0x4ae: 0x000d, 0x4af: 0x000d, - 0x4b0: 0x000c, 0x4b1: 0x000c, 0x4b2: 0x000c, 0x4b3: 0x000c, 0x4b4: 0x000c, 0x4b5: 0x000c, - 0x4b6: 0x000c, 0x4b7: 0x000c, 0x4b8: 0x000c, 0x4b9: 0x000c, 0x4ba: 0x000c, 0x4bb: 0x000c, - 0x4bc: 0x000c, 0x4bd: 0x000c, 0x4be: 0x000c, 0x4bf: 0x000c, - // Block 0x13, offset 0x4c0 - 0x4c0: 0x000c, 0x4c1: 0x000c, 0x4c2: 0x000c, 0x4c3: 0x000c, 0x4c4: 0x000c, 0x4c5: 0x000c, - 0x4c6: 0x000c, 0x4c7: 0x000c, 0x4c8: 0x000c, 0x4c9: 0x000c, 0x4ca: 0x000c, 0x4cb: 0x000d, - 0x4cc: 0x000d, 0x4cd: 0x000d, 0x4ce: 0x000d, 0x4cf: 0x000d, 0x4d0: 0x000d, 0x4d1: 0x000d, - 0x4d2: 0x000d, 0x4d3: 0x000d, 0x4d4: 0x000d, 0x4d5: 0x000d, 0x4d6: 0x000d, 0x4d7: 0x000d, - 0x4d8: 0x000d, 0x4d9: 0x000d, 0x4da: 0x000d, 0x4db: 0x000d, 0x4dc: 0x000d, 0x4dd: 0x000d, - 0x4de: 0x000d, 0x4df: 0x000d, 0x4e0: 0x000d, 0x4e1: 0x000d, 0x4e2: 0x000d, 0x4e3: 0x000d, - 0x4e4: 0x000d, 0x4e5: 0x000d, 0x4e6: 0x000d, 0x4e7: 0x000d, 0x4e8: 0x000d, 0x4e9: 0x000d, - 0x4ea: 0x000d, 0x4eb: 0x000d, 0x4ec: 0x000d, 0x4ed: 0x000d, 0x4ee: 0x000d, 0x4ef: 0x000d, - 0x4f0: 0x000d, 0x4f1: 0x000d, 0x4f2: 0x000d, 0x4f3: 0x000d, 0x4f4: 0x000d, 0x4f5: 0x000d, - 0x4f6: 0x000d, 0x4f7: 0x000d, 0x4f8: 0x000d, 0x4f9: 0x000d, 0x4fa: 0x000d, 0x4fb: 0x000d, - 0x4fc: 0x000d, 0x4fd: 0x000d, 0x4fe: 0x000d, 0x4ff: 0x000d, - // Block 0x14, offset 0x500 - 0x500: 0x000d, 0x501: 0x000d, 0x502: 0x000d, 0x503: 0x000d, 0x504: 0x000d, 0x505: 0x000d, - 0x506: 0x000d, 0x507: 0x000d, 0x508: 0x000d, 0x509: 0x000d, 0x50a: 0x000d, 0x50b: 0x000d, - 0x50c: 0x000d, 0x50d: 0x000d, 0x50e: 0x000d, 0x50f: 0x000d, 0x510: 0x000d, 0x511: 0x000d, - 0x512: 0x000d, 0x513: 0x000d, 0x514: 0x000d, 0x515: 0x000d, 0x516: 0x000d, 0x517: 0x000d, - 0x518: 0x000d, 0x519: 0x000d, 0x51a: 0x000d, 0x51b: 0x000d, 0x51c: 0x000d, 0x51d: 0x000d, - 0x51e: 0x000d, 0x51f: 0x000d, 0x520: 0x000d, 0x521: 0x000d, 0x522: 0x000d, 0x523: 0x000d, - 0x524: 0x000d, 0x525: 0x000d, 0x526: 0x000c, 0x527: 0x000c, 0x528: 0x000c, 0x529: 0x000c, - 0x52a: 0x000c, 0x52b: 0x000c, 0x52c: 0x000c, 0x52d: 0x000c, 0x52e: 0x000c, 0x52f: 0x000c, - 0x530: 0x000c, 0x531: 0x000d, 0x532: 0x000d, 0x533: 0x000d, 0x534: 0x000d, 0x535: 0x000d, - 0x536: 0x000d, 0x537: 0x000d, 0x538: 0x000d, 0x539: 0x000d, 0x53a: 0x000d, 0x53b: 0x000d, - 0x53c: 0x000d, 0x53d: 0x000d, 0x53e: 0x000d, 0x53f: 0x000d, - // Block 0x15, offset 0x540 - 0x540: 0x0001, 0x541: 0x0001, 0x542: 0x0001, 0x543: 0x0001, 0x544: 0x0001, 0x545: 0x0001, - 0x546: 0x0001, 0x547: 0x0001, 0x548: 0x0001, 0x549: 0x0001, 0x54a: 0x0001, 0x54b: 0x0001, - 0x54c: 0x0001, 0x54d: 0x0001, 0x54e: 0x0001, 0x54f: 0x0001, 0x550: 0x0001, 0x551: 0x0001, - 0x552: 0x0001, 0x553: 0x0001, 0x554: 0x0001, 0x555: 0x0001, 0x556: 0x0001, 0x557: 0x0001, - 0x558: 0x0001, 0x559: 0x0001, 0x55a: 0x0001, 0x55b: 0x0001, 0x55c: 0x0001, 0x55d: 0x0001, - 0x55e: 0x0001, 0x55f: 0x0001, 0x560: 0x0001, 0x561: 0x0001, 0x562: 0x0001, 0x563: 0x0001, - 0x564: 0x0001, 0x565: 0x0001, 0x566: 0x0001, 0x567: 0x0001, 0x568: 0x0001, 0x569: 0x0001, - 0x56a: 0x0001, 0x56b: 0x000c, 0x56c: 0x000c, 0x56d: 0x000c, 0x56e: 0x000c, 0x56f: 0x000c, - 0x570: 0x000c, 0x571: 0x000c, 0x572: 0x000c, 0x573: 0x000c, 0x574: 0x0001, 0x575: 0x0001, - 0x576: 0x000a, 0x577: 0x000a, 0x578: 0x000a, 0x579: 0x000a, 0x57a: 0x0001, 0x57b: 0x0001, - 0x57c: 0x0001, 0x57d: 0x0001, 0x57e: 0x0001, 0x57f: 0x0001, - // Block 0x16, offset 0x580 - 0x580: 0x0001, 0x581: 0x0001, 0x582: 0x0001, 0x583: 0x0001, 0x584: 0x0001, 0x585: 0x0001, - 0x586: 0x0001, 0x587: 0x0001, 0x588: 0x0001, 0x589: 0x0001, 0x58a: 0x0001, 0x58b: 0x0001, - 0x58c: 0x0001, 0x58d: 0x0001, 0x58e: 0x0001, 0x58f: 0x0001, 0x590: 0x0001, 0x591: 0x0001, - 0x592: 0x0001, 0x593: 0x0001, 0x594: 0x0001, 0x595: 0x0001, 0x596: 0x000c, 0x597: 0x000c, - 0x598: 0x000c, 0x599: 0x000c, 0x59a: 0x0001, 0x59b: 0x000c, 0x59c: 0x000c, 0x59d: 0x000c, - 0x59e: 0x000c, 0x59f: 0x000c, 0x5a0: 0x000c, 0x5a1: 0x000c, 0x5a2: 0x000c, 0x5a3: 0x000c, - 0x5a4: 0x0001, 0x5a5: 0x000c, 0x5a6: 0x000c, 0x5a7: 0x000c, 0x5a8: 0x0001, 0x5a9: 0x000c, - 0x5aa: 0x000c, 0x5ab: 0x000c, 0x5ac: 0x000c, 0x5ad: 0x000c, 0x5ae: 0x0001, 0x5af: 0x0001, - 0x5b0: 0x0001, 0x5b1: 0x0001, 0x5b2: 0x0001, 0x5b3: 0x0001, 0x5b4: 0x0001, 0x5b5: 0x0001, - 0x5b6: 0x0001, 0x5b7: 0x0001, 0x5b8: 0x0001, 0x5b9: 0x0001, 0x5ba: 0x0001, 0x5bb: 0x0001, - 0x5bc: 0x0001, 0x5bd: 0x0001, 0x5be: 0x0001, 0x5bf: 0x0001, - // Block 0x17, offset 0x5c0 - 0x5c0: 0x0001, 0x5c1: 0x0001, 0x5c2: 0x0001, 0x5c3: 0x0001, 0x5c4: 0x0001, 0x5c5: 0x0001, - 0x5c6: 0x0001, 0x5c7: 0x0001, 0x5c8: 0x0001, 0x5c9: 0x0001, 0x5ca: 0x0001, 0x5cb: 0x0001, - 0x5cc: 0x0001, 0x5cd: 0x0001, 0x5ce: 0x0001, 0x5cf: 0x0001, 0x5d0: 0x0001, 0x5d1: 0x0001, - 0x5d2: 0x0001, 0x5d3: 0x0001, 0x5d4: 0x0001, 0x5d5: 0x0001, 0x5d6: 0x0001, 0x5d7: 0x0001, - 0x5d8: 0x0001, 0x5d9: 0x000c, 0x5da: 0x000c, 0x5db: 0x000c, 0x5dc: 0x0001, 0x5dd: 0x0001, - 0x5de: 0x0001, 0x5df: 0x0001, 0x5e0: 0x0001, 0x5e1: 0x0001, 0x5e2: 0x0001, 0x5e3: 0x0001, - 0x5e4: 0x0001, 0x5e5: 0x0001, 0x5e6: 0x0001, 0x5e7: 0x0001, 0x5e8: 0x0001, 0x5e9: 0x0001, - 0x5ea: 0x0001, 0x5eb: 0x0001, 0x5ec: 0x0001, 0x5ed: 0x0001, 0x5ee: 0x0001, 0x5ef: 0x0001, - 0x5f0: 0x0001, 0x5f1: 0x0001, 0x5f2: 0x0001, 0x5f3: 0x0001, 0x5f4: 0x0001, 0x5f5: 0x0001, - 0x5f6: 0x0001, 0x5f7: 0x0001, 0x5f8: 0x0001, 0x5f9: 0x0001, 0x5fa: 0x0001, 0x5fb: 0x0001, - 0x5fc: 0x0001, 0x5fd: 0x0001, 0x5fe: 0x0001, 0x5ff: 0x0001, - // Block 0x18, offset 0x600 - 0x600: 0x0001, 0x601: 0x0001, 0x602: 0x0001, 0x603: 0x0001, 0x604: 0x0001, 0x605: 0x0001, - 0x606: 0x0001, 0x607: 0x0001, 0x608: 0x0001, 0x609: 0x0001, 0x60a: 0x0001, 0x60b: 0x0001, - 0x60c: 0x0001, 0x60d: 0x0001, 0x60e: 0x0001, 0x60f: 0x0001, 0x610: 0x0001, 0x611: 0x0001, - 0x612: 0x0001, 0x613: 0x0001, 0x614: 0x0001, 0x615: 0x0001, 0x616: 0x0001, 0x617: 0x0001, - 0x618: 0x0001, 0x619: 0x0001, 0x61a: 0x0001, 0x61b: 0x0001, 0x61c: 0x0001, 0x61d: 0x0001, - 0x61e: 0x0001, 0x61f: 0x0001, 0x620: 0x000d, 0x621: 0x000d, 0x622: 0x000d, 0x623: 0x000d, - 0x624: 0x000d, 0x625: 0x000d, 0x626: 0x000d, 0x627: 0x000d, 0x628: 0x000d, 0x629: 0x000d, - 0x62a: 0x000d, 0x62b: 0x000d, 0x62c: 0x000d, 0x62d: 0x000d, 0x62e: 0x000d, 0x62f: 0x000d, - 0x630: 0x000d, 0x631: 0x000d, 0x632: 0x000d, 0x633: 0x000d, 0x634: 0x000d, 0x635: 0x000d, - 0x636: 0x000d, 0x637: 0x000d, 0x638: 0x000d, 0x639: 0x000d, 0x63a: 0x000d, 0x63b: 0x000d, - 0x63c: 0x000d, 0x63d: 0x000d, 0x63e: 0x000d, 0x63f: 0x000d, - // Block 0x19, offset 0x640 - 0x640: 0x000d, 0x641: 0x000d, 0x642: 0x000d, 0x643: 0x000d, 0x644: 0x000d, 0x645: 0x000d, - 0x646: 0x000d, 0x647: 0x000d, 0x648: 0x000d, 0x649: 0x000d, 0x64a: 0x000d, 0x64b: 0x000d, - 0x64c: 0x000d, 0x64d: 0x000d, 0x64e: 0x000d, 0x64f: 0x000d, 0x650: 0x000d, 0x651: 0x000d, - 0x652: 0x000d, 0x653: 0x000d, 0x654: 0x000c, 0x655: 0x000c, 0x656: 0x000c, 0x657: 0x000c, - 0x658: 0x000c, 0x659: 0x000c, 0x65a: 0x000c, 0x65b: 0x000c, 0x65c: 0x000c, 0x65d: 0x000c, - 0x65e: 0x000c, 0x65f: 0x000c, 0x660: 0x000c, 0x661: 0x000c, 0x662: 0x0005, 0x663: 0x000c, - 0x664: 0x000c, 0x665: 0x000c, 0x666: 0x000c, 0x667: 0x000c, 0x668: 0x000c, 0x669: 0x000c, - 0x66a: 0x000c, 0x66b: 0x000c, 0x66c: 0x000c, 0x66d: 0x000c, 0x66e: 0x000c, 0x66f: 0x000c, - 0x670: 0x000c, 0x671: 0x000c, 0x672: 0x000c, 0x673: 0x000c, 0x674: 0x000c, 0x675: 0x000c, - 0x676: 0x000c, 0x677: 0x000c, 0x678: 0x000c, 0x679: 0x000c, 0x67a: 0x000c, 0x67b: 0x000c, - 0x67c: 0x000c, 0x67d: 0x000c, 0x67e: 0x000c, 0x67f: 0x000c, - // Block 0x1a, offset 0x680 - 0x680: 0x000c, 0x681: 0x000c, 0x682: 0x000c, - 0x6ba: 0x000c, - 0x6bc: 0x000c, - // Block 0x1b, offset 0x6c0 - 0x6c1: 0x000c, 0x6c2: 0x000c, 0x6c3: 0x000c, 0x6c4: 0x000c, 0x6c5: 0x000c, - 0x6c6: 0x000c, 0x6c7: 0x000c, 0x6c8: 0x000c, - 0x6cd: 0x000c, 0x6d1: 0x000c, - 0x6d2: 0x000c, 0x6d3: 0x000c, 0x6d4: 0x000c, 0x6d5: 0x000c, 0x6d6: 0x000c, 0x6d7: 0x000c, - 0x6e2: 0x000c, 0x6e3: 0x000c, - // Block 0x1c, offset 0x700 - 0x701: 0x000c, - 0x73c: 0x000c, - // Block 0x1d, offset 0x740 - 0x741: 0x000c, 0x742: 0x000c, 0x743: 0x000c, 0x744: 0x000c, - 0x74d: 0x000c, - 0x762: 0x000c, 0x763: 0x000c, - 0x772: 0x0004, 0x773: 0x0004, - 0x77b: 0x0004, - // Block 0x1e, offset 0x780 - 0x781: 0x000c, 0x782: 0x000c, - 0x7bc: 0x000c, - // Block 0x1f, offset 0x7c0 - 0x7c1: 0x000c, 0x7c2: 0x000c, - 0x7c7: 0x000c, 0x7c8: 0x000c, 0x7cb: 0x000c, - 0x7cc: 0x000c, 0x7cd: 0x000c, 0x7d1: 0x000c, - 0x7f0: 0x000c, 0x7f1: 0x000c, 0x7f5: 0x000c, - // Block 0x20, offset 0x800 - 0x801: 0x000c, 0x802: 0x000c, 0x803: 0x000c, 0x804: 0x000c, 0x805: 0x000c, - 0x807: 0x000c, 0x808: 0x000c, - 0x80d: 0x000c, - 0x822: 0x000c, 0x823: 0x000c, - 0x831: 0x0004, - // Block 0x21, offset 0x840 - 0x841: 0x000c, - 0x87c: 0x000c, 0x87f: 0x000c, - // Block 0x22, offset 0x880 - 0x881: 0x000c, 0x882: 0x000c, 0x883: 0x000c, 0x884: 0x000c, - 0x88d: 0x000c, - 0x896: 0x000c, - 0x8a2: 0x000c, 0x8a3: 0x000c, - // Block 0x23, offset 0x8c0 - 0x8c2: 0x000c, - // Block 0x24, offset 0x900 - 0x900: 0x000c, - 0x90d: 0x000c, - 0x933: 0x000a, 0x934: 0x000a, 0x935: 0x000a, - 0x936: 0x000a, 0x937: 0x000a, 0x938: 0x000a, 0x939: 0x0004, 0x93a: 0x000a, - // Block 0x25, offset 0x940 - 0x940: 0x000c, - 0x97e: 0x000c, 0x97f: 0x000c, - // Block 0x26, offset 0x980 - 0x980: 0x000c, - 0x986: 0x000c, 0x987: 0x000c, 0x988: 0x000c, 0x98a: 0x000c, 0x98b: 0x000c, - 0x98c: 0x000c, 0x98d: 0x000c, - 0x995: 0x000c, 0x996: 0x000c, - 0x9a2: 0x000c, 0x9a3: 0x000c, - 0x9b8: 0x000a, 0x9b9: 0x000a, 0x9ba: 0x000a, 0x9bb: 0x000a, - 0x9bc: 0x000a, 0x9bd: 0x000a, 0x9be: 0x000a, - // Block 0x27, offset 0x9c0 - 0x9cc: 0x000c, 0x9cd: 0x000c, - 0x9e2: 0x000c, 0x9e3: 0x000c, - // Block 0x28, offset 0xa00 - 0xa01: 0x000c, - // Block 0x29, offset 0xa40 - 0xa41: 0x000c, 0xa42: 0x000c, 0xa43: 0x000c, 0xa44: 0x000c, - 0xa4d: 0x000c, - 0xa62: 0x000c, 0xa63: 0x000c, - // Block 0x2a, offset 0xa80 - 0xa8a: 0x000c, - 0xa92: 0x000c, 0xa93: 0x000c, 0xa94: 0x000c, 0xa96: 0x000c, - // Block 0x2b, offset 0xac0 - 0xaf1: 0x000c, 0xaf4: 0x000c, 0xaf5: 0x000c, - 0xaf6: 0x000c, 0xaf7: 0x000c, 0xaf8: 0x000c, 0xaf9: 0x000c, 0xafa: 0x000c, - 0xaff: 0x0004, - // Block 0x2c, offset 0xb00 - 0xb07: 0x000c, 0xb08: 0x000c, 0xb09: 0x000c, 0xb0a: 0x000c, 0xb0b: 0x000c, - 0xb0c: 0x000c, 0xb0d: 0x000c, 0xb0e: 0x000c, - // Block 0x2d, offset 0xb40 - 0xb71: 0x000c, 0xb74: 0x000c, 0xb75: 0x000c, - 0xb76: 0x000c, 0xb77: 0x000c, 0xb78: 0x000c, 0xb79: 0x000c, 0xb7b: 0x000c, - 0xb7c: 0x000c, - // Block 0x2e, offset 0xb80 - 0xb88: 0x000c, 0xb89: 0x000c, 0xb8a: 0x000c, 0xb8b: 0x000c, - 0xb8c: 0x000c, 0xb8d: 0x000c, - // Block 0x2f, offset 0xbc0 - 0xbd8: 0x000c, 0xbd9: 0x000c, - 0xbf5: 0x000c, - 0xbf7: 0x000c, 0xbf9: 0x000c, 0xbfa: 0x003a, 0xbfb: 0x002a, - 0xbfc: 0x003a, 0xbfd: 0x002a, - // Block 0x30, offset 0xc00 - 0xc31: 0x000c, 0xc32: 0x000c, 0xc33: 0x000c, 0xc34: 0x000c, 0xc35: 0x000c, - 0xc36: 0x000c, 0xc37: 0x000c, 0xc38: 0x000c, 0xc39: 0x000c, 0xc3a: 0x000c, 0xc3b: 0x000c, - 0xc3c: 0x000c, 0xc3d: 0x000c, 0xc3e: 0x000c, - // Block 0x31, offset 0xc40 - 0xc40: 0x000c, 0xc41: 0x000c, 0xc42: 0x000c, 0xc43: 0x000c, 0xc44: 0x000c, - 0xc46: 0x000c, 0xc47: 0x000c, - 0xc4d: 0x000c, 0xc4e: 0x000c, 0xc4f: 0x000c, 0xc50: 0x000c, 0xc51: 0x000c, - 0xc52: 0x000c, 0xc53: 0x000c, 0xc54: 0x000c, 0xc55: 0x000c, 0xc56: 0x000c, 0xc57: 0x000c, - 0xc59: 0x000c, 0xc5a: 0x000c, 0xc5b: 0x000c, 0xc5c: 0x000c, 0xc5d: 0x000c, - 0xc5e: 0x000c, 0xc5f: 0x000c, 0xc60: 0x000c, 0xc61: 0x000c, 0xc62: 0x000c, 0xc63: 0x000c, - 0xc64: 0x000c, 0xc65: 0x000c, 0xc66: 0x000c, 0xc67: 0x000c, 0xc68: 0x000c, 0xc69: 0x000c, - 0xc6a: 0x000c, 0xc6b: 0x000c, 0xc6c: 0x000c, 0xc6d: 0x000c, 0xc6e: 0x000c, 0xc6f: 0x000c, - 0xc70: 0x000c, 0xc71: 0x000c, 0xc72: 0x000c, 0xc73: 0x000c, 0xc74: 0x000c, 0xc75: 0x000c, - 0xc76: 0x000c, 0xc77: 0x000c, 0xc78: 0x000c, 0xc79: 0x000c, 0xc7a: 0x000c, 0xc7b: 0x000c, - 0xc7c: 0x000c, - // Block 0x32, offset 0xc80 - 0xc86: 0x000c, - // Block 0x33, offset 0xcc0 - 0xced: 0x000c, 0xcee: 0x000c, 0xcef: 0x000c, - 0xcf0: 0x000c, 0xcf2: 0x000c, 0xcf3: 0x000c, 0xcf4: 0x000c, 0xcf5: 0x000c, - 0xcf6: 0x000c, 0xcf7: 0x000c, 0xcf9: 0x000c, 0xcfa: 0x000c, - 0xcfd: 0x000c, 0xcfe: 0x000c, - // Block 0x34, offset 0xd00 - 0xd18: 0x000c, 0xd19: 0x000c, - 0xd1e: 0x000c, 0xd1f: 0x000c, 0xd20: 0x000c, - 0xd31: 0x000c, 0xd32: 0x000c, 0xd33: 0x000c, 0xd34: 0x000c, - // Block 0x35, offset 0xd40 - 0xd42: 0x000c, 0xd45: 0x000c, - 0xd46: 0x000c, - 0xd4d: 0x000c, - 0xd5d: 0x000c, - // Block 0x36, offset 0xd80 - 0xd9d: 0x000c, - 0xd9e: 0x000c, 0xd9f: 0x000c, - // Block 0x37, offset 0xdc0 - 0xdd0: 0x000a, 0xdd1: 0x000a, - 0xdd2: 0x000a, 0xdd3: 0x000a, 0xdd4: 0x000a, 0xdd5: 0x000a, 0xdd6: 0x000a, 0xdd7: 0x000a, - 0xdd8: 0x000a, 0xdd9: 0x000a, - // Block 0x38, offset 0xe00 - 0xe00: 0x000a, - // Block 0x39, offset 0xe40 - 0xe40: 0x0009, - 0xe5b: 0x007a, 0xe5c: 0x006a, - // Block 0x3a, offset 0xe80 - 0xe92: 0x000c, 0xe93: 0x000c, 0xe94: 0x000c, - 0xeb2: 0x000c, 0xeb3: 0x000c, 0xeb4: 0x000c, - // Block 0x3b, offset 0xec0 - 0xed2: 0x000c, 0xed3: 0x000c, - 0xef2: 0x000c, 0xef3: 0x000c, - // Block 0x3c, offset 0xf00 - 0xf34: 0x000c, 0xf35: 0x000c, - 0xf37: 0x000c, 0xf38: 0x000c, 0xf39: 0x000c, 0xf3a: 0x000c, 0xf3b: 0x000c, - 0xf3c: 0x000c, 0xf3d: 0x000c, - // Block 0x3d, offset 0xf40 - 0xf46: 0x000c, 0xf49: 0x000c, 0xf4a: 0x000c, 0xf4b: 0x000c, - 0xf4c: 0x000c, 0xf4d: 0x000c, 0xf4e: 0x000c, 0xf4f: 0x000c, 0xf50: 0x000c, 0xf51: 0x000c, - 0xf52: 0x000c, 0xf53: 0x000c, - 0xf5b: 0x0004, 0xf5d: 0x000c, - 0xf70: 0x000a, 0xf71: 0x000a, 0xf72: 0x000a, 0xf73: 0x000a, 0xf74: 0x000a, 0xf75: 0x000a, - 0xf76: 0x000a, 0xf77: 0x000a, 0xf78: 0x000a, 0xf79: 0x000a, - // Block 0x3e, offset 0xf80 - 0xf80: 0x000a, 0xf81: 0x000a, 0xf82: 0x000a, 0xf83: 0x000a, 0xf84: 0x000a, 0xf85: 0x000a, - 0xf86: 0x000a, 0xf87: 0x000a, 0xf88: 0x000a, 0xf89: 0x000a, 0xf8a: 0x000a, 0xf8b: 0x000c, - 0xf8c: 0x000c, 0xf8d: 0x000c, 0xf8e: 0x000b, - // Block 0x3f, offset 0xfc0 - 0xfc5: 0x000c, - 0xfc6: 0x000c, - 0xfe9: 0x000c, - // Block 0x40, offset 0x1000 - 0x1020: 0x000c, 0x1021: 0x000c, 0x1022: 0x000c, - 0x1027: 0x000c, 0x1028: 0x000c, - 0x1032: 0x000c, - 0x1039: 0x000c, 0x103a: 0x000c, 0x103b: 0x000c, - // Block 0x41, offset 0x1040 - 0x1040: 0x000a, 0x1044: 0x000a, 0x1045: 0x000a, - // Block 0x42, offset 0x1080 - 0x109e: 0x000a, 0x109f: 0x000a, 0x10a0: 0x000a, 0x10a1: 0x000a, 0x10a2: 0x000a, 0x10a3: 0x000a, - 0x10a4: 0x000a, 0x10a5: 0x000a, 0x10a6: 0x000a, 0x10a7: 0x000a, 0x10a8: 0x000a, 0x10a9: 0x000a, - 0x10aa: 0x000a, 0x10ab: 0x000a, 0x10ac: 0x000a, 0x10ad: 0x000a, 0x10ae: 0x000a, 0x10af: 0x000a, - 0x10b0: 0x000a, 0x10b1: 0x000a, 0x10b2: 0x000a, 0x10b3: 0x000a, 0x10b4: 0x000a, 0x10b5: 0x000a, - 0x10b6: 0x000a, 0x10b7: 0x000a, 0x10b8: 0x000a, 0x10b9: 0x000a, 0x10ba: 0x000a, 0x10bb: 0x000a, - 0x10bc: 0x000a, 0x10bd: 0x000a, 0x10be: 0x000a, 0x10bf: 0x000a, - // Block 0x43, offset 0x10c0 - 0x10d7: 0x000c, - 0x10d8: 0x000c, 0x10db: 0x000c, - // Block 0x44, offset 0x1100 - 0x1116: 0x000c, - 0x1118: 0x000c, 0x1119: 0x000c, 0x111a: 0x000c, 0x111b: 0x000c, 0x111c: 0x000c, 0x111d: 0x000c, - 0x111e: 0x000c, 0x1120: 0x000c, 0x1122: 0x000c, - 0x1125: 0x000c, 0x1126: 0x000c, 0x1127: 0x000c, 0x1128: 0x000c, 0x1129: 0x000c, - 0x112a: 0x000c, 0x112b: 0x000c, 0x112c: 0x000c, - 0x1133: 0x000c, 0x1134: 0x000c, 0x1135: 0x000c, - 0x1136: 0x000c, 0x1137: 0x000c, 0x1138: 0x000c, 0x1139: 0x000c, 0x113a: 0x000c, 0x113b: 0x000c, - 0x113c: 0x000c, 0x113f: 0x000c, - // Block 0x45, offset 0x1140 - 0x1170: 0x000c, 0x1171: 0x000c, 0x1172: 0x000c, 0x1173: 0x000c, 0x1174: 0x000c, 0x1175: 0x000c, - 0x1176: 0x000c, 0x1177: 0x000c, 0x1178: 0x000c, 0x1179: 0x000c, 0x117a: 0x000c, 0x117b: 0x000c, - 0x117c: 0x000c, 0x117d: 0x000c, 0x117e: 0x000c, - // Block 0x46, offset 0x1180 - 0x1180: 0x000c, 0x1181: 0x000c, 0x1182: 0x000c, 0x1183: 0x000c, - 0x11b4: 0x000c, - 0x11b6: 0x000c, 0x11b7: 0x000c, 0x11b8: 0x000c, 0x11b9: 0x000c, 0x11ba: 0x000c, - 0x11bc: 0x000c, - // Block 0x47, offset 0x11c0 - 0x11c2: 0x000c, - 0x11eb: 0x000c, 0x11ec: 0x000c, 0x11ed: 0x000c, 0x11ee: 0x000c, 0x11ef: 0x000c, - 0x11f0: 0x000c, 0x11f1: 0x000c, 0x11f2: 0x000c, 0x11f3: 0x000c, - // Block 0x48, offset 0x1200 - 0x1200: 0x000c, 0x1201: 0x000c, - 0x1222: 0x000c, 0x1223: 0x000c, - 0x1224: 0x000c, 0x1225: 0x000c, 0x1228: 0x000c, 0x1229: 0x000c, - 0x122b: 0x000c, 0x122c: 0x000c, 0x122d: 0x000c, - // Block 0x49, offset 0x1240 - 0x1266: 0x000c, 0x1268: 0x000c, 0x1269: 0x000c, - 0x126d: 0x000c, 0x126f: 0x000c, - 0x1270: 0x000c, 0x1271: 0x000c, - // Block 0x4a, offset 0x1280 - 0x12ac: 0x000c, 0x12ad: 0x000c, 0x12ae: 0x000c, 0x12af: 0x000c, - 0x12b0: 0x000c, 0x12b1: 0x000c, 0x12b2: 0x000c, 0x12b3: 0x000c, - 0x12b6: 0x000c, 0x12b7: 0x000c, - // Block 0x4b, offset 0x12c0 - 0x12d0: 0x000c, 0x12d1: 0x000c, - 0x12d2: 0x000c, 0x12d4: 0x000c, 0x12d5: 0x000c, 0x12d6: 0x000c, 0x12d7: 0x000c, - 0x12d8: 0x000c, 0x12d9: 0x000c, 0x12da: 0x000c, 0x12db: 0x000c, 0x12dc: 0x000c, 0x12dd: 0x000c, - 0x12de: 0x000c, 0x12df: 0x000c, 0x12e0: 0x000c, 0x12e2: 0x000c, 0x12e3: 0x000c, - 0x12e4: 0x000c, 0x12e5: 0x000c, 0x12e6: 0x000c, 0x12e7: 0x000c, 0x12e8: 0x000c, - 0x12ed: 0x000c, - 0x12f4: 0x000c, - 0x12f8: 0x000c, 0x12f9: 0x000c, - // Block 0x4c, offset 0x1300 - 0x1300: 0x000c, 0x1301: 0x000c, 0x1302: 0x000c, 0x1303: 0x000c, 0x1304: 0x000c, 0x1305: 0x000c, - 0x1306: 0x000c, 0x1307: 0x000c, 0x1308: 0x000c, 0x1309: 0x000c, 0x130a: 0x000c, 0x130b: 0x000c, - 0x130c: 0x000c, 0x130d: 0x000c, 0x130e: 0x000c, 0x130f: 0x000c, 0x1310: 0x000c, 0x1311: 0x000c, - 0x1312: 0x000c, 0x1313: 0x000c, 0x1314: 0x000c, 0x1315: 0x000c, 0x1316: 0x000c, 0x1317: 0x000c, - 0x1318: 0x000c, 0x1319: 0x000c, 0x131a: 0x000c, 0x131b: 0x000c, 0x131c: 0x000c, 0x131d: 0x000c, - 0x131e: 0x000c, 0x131f: 0x000c, 0x1320: 0x000c, 0x1321: 0x000c, 0x1322: 0x000c, 0x1323: 0x000c, - 0x1324: 0x000c, 0x1325: 0x000c, 0x1326: 0x000c, 0x1327: 0x000c, 0x1328: 0x000c, 0x1329: 0x000c, - 0x132a: 0x000c, 0x132b: 0x000c, 0x132c: 0x000c, 0x132d: 0x000c, 0x132e: 0x000c, 0x132f: 0x000c, - 0x1330: 0x000c, 0x1331: 0x000c, 0x1332: 0x000c, 0x1333: 0x000c, 0x1334: 0x000c, 0x1335: 0x000c, - 0x133b: 0x000c, - 0x133c: 0x000c, 0x133d: 0x000c, 0x133e: 0x000c, 0x133f: 0x000c, - // Block 0x4d, offset 0x1340 - 0x137d: 0x000a, 0x137f: 0x000a, - // Block 0x4e, offset 0x1380 - 0x1380: 0x000a, 0x1381: 0x000a, - 0x138d: 0x000a, 0x138e: 0x000a, 0x138f: 0x000a, - 0x139d: 0x000a, - 0x139e: 0x000a, 0x139f: 0x000a, - 0x13ad: 0x000a, 0x13ae: 0x000a, 0x13af: 0x000a, - 0x13bd: 0x000a, 0x13be: 0x000a, - // Block 0x4f, offset 0x13c0 - 0x13c0: 0x0009, 0x13c1: 0x0009, 0x13c2: 0x0009, 0x13c3: 0x0009, 0x13c4: 0x0009, 0x13c5: 0x0009, - 0x13c6: 0x0009, 0x13c7: 0x0009, 0x13c8: 0x0009, 0x13c9: 0x0009, 0x13ca: 0x0009, 0x13cb: 0x000b, - 0x13cc: 0x000b, 0x13cd: 0x000b, 0x13cf: 0x0001, 0x13d0: 0x000a, 0x13d1: 0x000a, - 0x13d2: 0x000a, 0x13d3: 0x000a, 0x13d4: 0x000a, 0x13d5: 0x000a, 0x13d6: 0x000a, 0x13d7: 0x000a, - 0x13d8: 0x000a, 0x13d9: 0x000a, 0x13da: 0x000a, 0x13db: 0x000a, 0x13dc: 0x000a, 0x13dd: 0x000a, - 0x13de: 0x000a, 0x13df: 0x000a, 0x13e0: 0x000a, 0x13e1: 0x000a, 0x13e2: 0x000a, 0x13e3: 0x000a, - 0x13e4: 0x000a, 0x13e5: 0x000a, 0x13e6: 0x000a, 0x13e7: 0x000a, 0x13e8: 0x0009, 0x13e9: 0x0007, - 0x13ea: 0x000e, 0x13eb: 0x000e, 0x13ec: 0x000e, 0x13ed: 0x000e, 0x13ee: 0x000e, 0x13ef: 0x0006, - 0x13f0: 0x0004, 0x13f1: 0x0004, 0x13f2: 0x0004, 0x13f3: 0x0004, 0x13f4: 0x0004, 0x13f5: 0x000a, - 0x13f6: 0x000a, 0x13f7: 0x000a, 0x13f8: 0x000a, 0x13f9: 0x000a, 0x13fa: 0x000a, 0x13fb: 0x000a, - 0x13fc: 0x000a, 0x13fd: 0x000a, 0x13fe: 0x000a, 0x13ff: 0x000a, - // Block 0x50, offset 0x1400 - 0x1400: 0x000a, 0x1401: 0x000a, 0x1402: 0x000a, 0x1403: 0x000a, 0x1404: 0x0006, 0x1405: 0x009a, - 0x1406: 0x008a, 0x1407: 0x000a, 0x1408: 0x000a, 0x1409: 0x000a, 0x140a: 0x000a, 0x140b: 0x000a, - 0x140c: 0x000a, 0x140d: 0x000a, 0x140e: 0x000a, 0x140f: 0x000a, 0x1410: 0x000a, 0x1411: 0x000a, - 0x1412: 0x000a, 0x1413: 0x000a, 0x1414: 0x000a, 0x1415: 0x000a, 0x1416: 0x000a, 0x1417: 0x000a, - 0x1418: 0x000a, 0x1419: 0x000a, 0x141a: 0x000a, 0x141b: 0x000a, 0x141c: 0x000a, 0x141d: 0x000a, - 0x141e: 0x000a, 0x141f: 0x0009, 0x1420: 0x000b, 0x1421: 0x000b, 0x1422: 0x000b, 0x1423: 0x000b, - 0x1424: 0x000b, 0x1425: 0x000b, 0x1426: 0x000e, 0x1427: 0x000e, 0x1428: 0x000e, 0x1429: 0x000e, - 0x142a: 0x000b, 0x142b: 0x000b, 0x142c: 0x000b, 0x142d: 0x000b, 0x142e: 0x000b, 0x142f: 0x000b, - 0x1430: 0x0002, 0x1434: 0x0002, 0x1435: 0x0002, - 0x1436: 0x0002, 0x1437: 0x0002, 0x1438: 0x0002, 0x1439: 0x0002, 0x143a: 0x0003, 0x143b: 0x0003, - 0x143c: 0x000a, 0x143d: 0x009a, 0x143e: 0x008a, - // Block 0x51, offset 0x1440 - 0x1440: 0x0002, 0x1441: 0x0002, 0x1442: 0x0002, 0x1443: 0x0002, 0x1444: 0x0002, 0x1445: 0x0002, - 0x1446: 0x0002, 0x1447: 0x0002, 0x1448: 0x0002, 0x1449: 0x0002, 0x144a: 0x0003, 0x144b: 0x0003, - 0x144c: 0x000a, 0x144d: 0x009a, 0x144e: 0x008a, - 0x1460: 0x0004, 0x1461: 0x0004, 0x1462: 0x0004, 0x1463: 0x0004, - 0x1464: 0x0004, 0x1465: 0x0004, 0x1466: 0x0004, 0x1467: 0x0004, 0x1468: 0x0004, 0x1469: 0x0004, - 0x146a: 0x0004, 0x146b: 0x0004, 0x146c: 0x0004, 0x146d: 0x0004, 0x146e: 0x0004, 0x146f: 0x0004, - 0x1470: 0x0004, 0x1471: 0x0004, 0x1472: 0x0004, 0x1473: 0x0004, 0x1474: 0x0004, 0x1475: 0x0004, - 0x1476: 0x0004, 0x1477: 0x0004, 0x1478: 0x0004, 0x1479: 0x0004, 0x147a: 0x0004, 0x147b: 0x0004, - 0x147c: 0x0004, 0x147d: 0x0004, 0x147e: 0x0004, 0x147f: 0x0004, - // Block 0x52, offset 0x1480 - 0x1480: 0x0004, 0x1481: 0x0004, 0x1482: 0x0004, 0x1483: 0x0004, 0x1484: 0x0004, 0x1485: 0x0004, - 0x1486: 0x0004, 0x1487: 0x0004, 0x1488: 0x0004, 0x1489: 0x0004, 0x148a: 0x0004, 0x148b: 0x0004, - 0x148c: 0x0004, 0x148d: 0x0004, 0x148e: 0x0004, 0x148f: 0x0004, 0x1490: 0x000c, 0x1491: 0x000c, - 0x1492: 0x000c, 0x1493: 0x000c, 0x1494: 0x000c, 0x1495: 0x000c, 0x1496: 0x000c, 0x1497: 0x000c, - 0x1498: 0x000c, 0x1499: 0x000c, 0x149a: 0x000c, 0x149b: 0x000c, 0x149c: 0x000c, 0x149d: 0x000c, - 0x149e: 0x000c, 0x149f: 0x000c, 0x14a0: 0x000c, 0x14a1: 0x000c, 0x14a2: 0x000c, 0x14a3: 0x000c, - 0x14a4: 0x000c, 0x14a5: 0x000c, 0x14a6: 0x000c, 0x14a7: 0x000c, 0x14a8: 0x000c, 0x14a9: 0x000c, - 0x14aa: 0x000c, 0x14ab: 0x000c, 0x14ac: 0x000c, 0x14ad: 0x000c, 0x14ae: 0x000c, 0x14af: 0x000c, - 0x14b0: 0x000c, - // Block 0x53, offset 0x14c0 - 0x14c0: 0x000a, 0x14c1: 0x000a, 0x14c3: 0x000a, 0x14c4: 0x000a, 0x14c5: 0x000a, - 0x14c6: 0x000a, 0x14c8: 0x000a, 0x14c9: 0x000a, - 0x14d4: 0x000a, 0x14d6: 0x000a, 0x14d7: 0x000a, - 0x14d8: 0x000a, - 0x14de: 0x000a, 0x14df: 0x000a, 0x14e0: 0x000a, 0x14e1: 0x000a, 0x14e2: 0x000a, 0x14e3: 0x000a, - 0x14e5: 0x000a, 0x14e7: 0x000a, 0x14e9: 0x000a, - 0x14ee: 0x0004, - 0x14fa: 0x000a, 0x14fb: 0x000a, - // Block 0x54, offset 0x1500 - 0x1500: 0x000a, 0x1501: 0x000a, 0x1502: 0x000a, 0x1503: 0x000a, 0x1504: 0x000a, - 0x150a: 0x000a, 0x150b: 0x000a, - 0x150c: 0x000a, 0x150d: 0x000a, 0x1510: 0x000a, 0x1511: 0x000a, - 0x1512: 0x000a, 0x1513: 0x000a, 0x1514: 0x000a, 0x1515: 0x000a, 0x1516: 0x000a, 0x1517: 0x000a, - 0x1518: 0x000a, 0x1519: 0x000a, 0x151a: 0x000a, 0x151b: 0x000a, 0x151c: 0x000a, 0x151d: 0x000a, - 0x151e: 0x000a, 0x151f: 0x000a, - // Block 0x55, offset 0x1540 - 0x1549: 0x000a, 0x154a: 0x000a, 0x154b: 0x000a, - 0x1550: 0x000a, 0x1551: 0x000a, - 0x1552: 0x000a, 0x1553: 0x000a, 0x1554: 0x000a, 0x1555: 0x000a, 0x1556: 0x000a, 0x1557: 0x000a, - 0x1558: 0x000a, 0x1559: 0x000a, 0x155a: 0x000a, 0x155b: 0x000a, 0x155c: 0x000a, 0x155d: 0x000a, - 0x155e: 0x000a, 0x155f: 0x000a, 0x1560: 0x000a, 0x1561: 0x000a, 0x1562: 0x000a, 0x1563: 0x000a, - 0x1564: 0x000a, 0x1565: 0x000a, 0x1566: 0x000a, 0x1567: 0x000a, 0x1568: 0x000a, 0x1569: 0x000a, - 0x156a: 0x000a, 0x156b: 0x000a, 0x156c: 0x000a, 0x156d: 0x000a, 0x156e: 0x000a, 0x156f: 0x000a, - 0x1570: 0x000a, 0x1571: 0x000a, 0x1572: 0x000a, 0x1573: 0x000a, 0x1574: 0x000a, 0x1575: 0x000a, - 0x1576: 0x000a, 0x1577: 0x000a, 0x1578: 0x000a, 0x1579: 0x000a, 0x157a: 0x000a, 0x157b: 0x000a, - 0x157c: 0x000a, 0x157d: 0x000a, 0x157e: 0x000a, 0x157f: 0x000a, - // Block 0x56, offset 0x1580 - 0x1580: 0x000a, 0x1581: 0x000a, 0x1582: 0x000a, 0x1583: 0x000a, 0x1584: 0x000a, 0x1585: 0x000a, - 0x1586: 0x000a, 0x1587: 0x000a, 0x1588: 0x000a, 0x1589: 0x000a, 0x158a: 0x000a, 0x158b: 0x000a, - 0x158c: 0x000a, 0x158d: 0x000a, 0x158e: 0x000a, 0x158f: 0x000a, 0x1590: 0x000a, 0x1591: 0x000a, - 0x1592: 0x000a, 0x1593: 0x000a, 0x1594: 0x000a, 0x1595: 0x000a, 0x1596: 0x000a, 0x1597: 0x000a, - 0x1598: 0x000a, 0x1599: 0x000a, 0x159a: 0x000a, 0x159b: 0x000a, 0x159c: 0x000a, 0x159d: 0x000a, - 0x159e: 0x000a, 0x159f: 0x000a, 0x15a0: 0x000a, 0x15a1: 0x000a, 0x15a2: 0x000a, 0x15a3: 0x000a, - 0x15a4: 0x000a, 0x15a5: 0x000a, 0x15a6: 0x000a, 0x15a7: 0x000a, 0x15a8: 0x000a, 0x15a9: 0x000a, - 0x15aa: 0x000a, 0x15ab: 0x000a, 0x15ac: 0x000a, 0x15ad: 0x000a, 0x15ae: 0x000a, 0x15af: 0x000a, - 0x15b0: 0x000a, 0x15b1: 0x000a, 0x15b2: 0x000a, 0x15b3: 0x000a, 0x15b4: 0x000a, 0x15b5: 0x000a, - 0x15b6: 0x000a, 0x15b7: 0x000a, 0x15b8: 0x000a, 0x15b9: 0x000a, 0x15ba: 0x000a, 0x15bb: 0x000a, - 0x15bc: 0x000a, 0x15bd: 0x000a, 0x15be: 0x000a, 0x15bf: 0x000a, - // Block 0x57, offset 0x15c0 - 0x15c0: 0x000a, 0x15c1: 0x000a, 0x15c2: 0x000a, 0x15c3: 0x000a, 0x15c4: 0x000a, 0x15c5: 0x000a, - 0x15c6: 0x000a, 0x15c7: 0x000a, 0x15c8: 0x000a, 0x15c9: 0x000a, 0x15ca: 0x000a, 0x15cb: 0x000a, - 0x15cc: 0x000a, 0x15cd: 0x000a, 0x15ce: 0x000a, 0x15cf: 0x000a, 0x15d0: 0x000a, 0x15d1: 0x000a, - 0x15d2: 0x0003, 0x15d3: 0x0004, 0x15d4: 0x000a, 0x15d5: 0x000a, 0x15d6: 0x000a, 0x15d7: 0x000a, - 0x15d8: 0x000a, 0x15d9: 0x000a, 0x15da: 0x000a, 0x15db: 0x000a, 0x15dc: 0x000a, 0x15dd: 0x000a, - 0x15de: 0x000a, 0x15df: 0x000a, 0x15e0: 0x000a, 0x15e1: 0x000a, 0x15e2: 0x000a, 0x15e3: 0x000a, - 0x15e4: 0x000a, 0x15e5: 0x000a, 0x15e6: 0x000a, 0x15e7: 0x000a, 0x15e8: 0x000a, 0x15e9: 0x000a, - 0x15ea: 0x000a, 0x15eb: 0x000a, 0x15ec: 0x000a, 0x15ed: 0x000a, 0x15ee: 0x000a, 0x15ef: 0x000a, - 0x15f0: 0x000a, 0x15f1: 0x000a, 0x15f2: 0x000a, 0x15f3: 0x000a, 0x15f4: 0x000a, 0x15f5: 0x000a, - 0x15f6: 0x000a, 0x15f7: 0x000a, 0x15f8: 0x000a, 0x15f9: 0x000a, 0x15fa: 0x000a, 0x15fb: 0x000a, - 0x15fc: 0x000a, 0x15fd: 0x000a, 0x15fe: 0x000a, 0x15ff: 0x000a, - // Block 0x58, offset 0x1600 - 0x1600: 0x000a, 0x1601: 0x000a, 0x1602: 0x000a, 0x1603: 0x000a, 0x1604: 0x000a, 0x1605: 0x000a, - 0x1606: 0x000a, 0x1607: 0x000a, 0x1608: 0x003a, 0x1609: 0x002a, 0x160a: 0x003a, 0x160b: 0x002a, - 0x160c: 0x000a, 0x160d: 0x000a, 0x160e: 0x000a, 0x160f: 0x000a, 0x1610: 0x000a, 0x1611: 0x000a, - 0x1612: 0x000a, 0x1613: 0x000a, 0x1614: 0x000a, 0x1615: 0x000a, 0x1616: 0x000a, 0x1617: 0x000a, - 0x1618: 0x000a, 0x1619: 0x000a, 0x161a: 0x000a, 0x161b: 0x000a, 0x161c: 0x000a, 0x161d: 0x000a, - 0x161e: 0x000a, 0x161f: 0x000a, 0x1620: 0x000a, 0x1621: 0x000a, 0x1622: 0x000a, 0x1623: 0x000a, - 0x1624: 0x000a, 0x1625: 0x000a, 0x1626: 0x000a, 0x1627: 0x000a, 0x1628: 0x000a, 0x1629: 0x009a, - 0x162a: 0x008a, 0x162b: 0x000a, 0x162c: 0x000a, 0x162d: 0x000a, 0x162e: 0x000a, 0x162f: 0x000a, - 0x1630: 0x000a, 0x1631: 0x000a, 0x1632: 0x000a, 0x1633: 0x000a, 0x1634: 0x000a, 0x1635: 0x000a, - // Block 0x59, offset 0x1640 - 0x167b: 0x000a, - 0x167c: 0x000a, 0x167d: 0x000a, 0x167e: 0x000a, 0x167f: 0x000a, - // Block 0x5a, offset 0x1680 - 0x1680: 0x000a, 0x1681: 0x000a, 0x1682: 0x000a, 0x1683: 0x000a, 0x1684: 0x000a, 0x1685: 0x000a, - 0x1686: 0x000a, 0x1687: 0x000a, 0x1688: 0x000a, 0x1689: 0x000a, 0x168a: 0x000a, 0x168b: 0x000a, - 0x168c: 0x000a, 0x168d: 0x000a, 0x168e: 0x000a, 0x168f: 0x000a, 0x1690: 0x000a, 0x1691: 0x000a, - 0x1692: 0x000a, 0x1693: 0x000a, 0x1694: 0x000a, 0x1696: 0x000a, 0x1697: 0x000a, - 0x1698: 0x000a, 0x1699: 0x000a, 0x169a: 0x000a, 0x169b: 0x000a, 0x169c: 0x000a, 0x169d: 0x000a, - 0x169e: 0x000a, 0x169f: 0x000a, 0x16a0: 0x000a, 0x16a1: 0x000a, 0x16a2: 0x000a, 0x16a3: 0x000a, - 0x16a4: 0x000a, 0x16a5: 0x000a, 0x16a6: 0x000a, 0x16a7: 0x000a, 0x16a8: 0x000a, 0x16a9: 0x000a, - 0x16aa: 0x000a, 0x16ab: 0x000a, 0x16ac: 0x000a, 0x16ad: 0x000a, 0x16ae: 0x000a, 0x16af: 0x000a, - 0x16b0: 0x000a, 0x16b1: 0x000a, 0x16b2: 0x000a, 0x16b3: 0x000a, 0x16b4: 0x000a, 0x16b5: 0x000a, - 0x16b6: 0x000a, 0x16b7: 0x000a, 0x16b8: 0x000a, 0x16b9: 0x000a, 0x16ba: 0x000a, 0x16bb: 0x000a, - 0x16bc: 0x000a, 0x16bd: 0x000a, 0x16be: 0x000a, 0x16bf: 0x000a, - // Block 0x5b, offset 0x16c0 - 0x16c0: 0x000a, 0x16c1: 0x000a, 0x16c2: 0x000a, 0x16c3: 0x000a, 0x16c4: 0x000a, 0x16c5: 0x000a, - 0x16c6: 0x000a, 0x16c7: 0x000a, 0x16c8: 0x000a, 0x16c9: 0x000a, 0x16ca: 0x000a, 0x16cb: 0x000a, - 0x16cc: 0x000a, 0x16cd: 0x000a, 0x16ce: 0x000a, 0x16cf: 0x000a, 0x16d0: 0x000a, 0x16d1: 0x000a, - 0x16d2: 0x000a, 0x16d3: 0x000a, 0x16d4: 0x000a, 0x16d5: 0x000a, 0x16d6: 0x000a, 0x16d7: 0x000a, - 0x16d8: 0x000a, 0x16d9: 0x000a, 0x16da: 0x000a, 0x16db: 0x000a, 0x16dc: 0x000a, 0x16dd: 0x000a, - 0x16de: 0x000a, 0x16df: 0x000a, 0x16e0: 0x000a, 0x16e1: 0x000a, 0x16e2: 0x000a, 0x16e3: 0x000a, - 0x16e4: 0x000a, 0x16e5: 0x000a, 0x16e6: 0x000a, 0x16e7: 0x000a, 0x16e8: 0x000a, 0x16e9: 0x000a, - 0x16ea: 0x000a, 0x16eb: 0x000a, 0x16ec: 0x000a, 0x16ed: 0x000a, 0x16ee: 0x000a, 0x16ef: 0x000a, - 0x16f0: 0x000a, 0x16f1: 0x000a, 0x16f2: 0x000a, 0x16f3: 0x000a, 0x16f4: 0x000a, 0x16f5: 0x000a, - 0x16f6: 0x000a, 0x16f7: 0x000a, 0x16f8: 0x000a, 0x16f9: 0x000a, 0x16fa: 0x000a, 0x16fb: 0x000a, - 0x16fc: 0x000a, 0x16fd: 0x000a, 0x16fe: 0x000a, - // Block 0x5c, offset 0x1700 - 0x1700: 0x000a, 0x1701: 0x000a, 0x1702: 0x000a, 0x1703: 0x000a, 0x1704: 0x000a, 0x1705: 0x000a, - 0x1706: 0x000a, 0x1707: 0x000a, 0x1708: 0x000a, 0x1709: 0x000a, 0x170a: 0x000a, 0x170b: 0x000a, - 0x170c: 0x000a, 0x170d: 0x000a, 0x170e: 0x000a, 0x170f: 0x000a, 0x1710: 0x000a, 0x1711: 0x000a, - 0x1712: 0x000a, 0x1713: 0x000a, 0x1714: 0x000a, 0x1715: 0x000a, 0x1716: 0x000a, 0x1717: 0x000a, - 0x1718: 0x000a, 0x1719: 0x000a, 0x171a: 0x000a, 0x171b: 0x000a, 0x171c: 0x000a, 0x171d: 0x000a, - 0x171e: 0x000a, 0x171f: 0x000a, 0x1720: 0x000a, 0x1721: 0x000a, 0x1722: 0x000a, 0x1723: 0x000a, - 0x1724: 0x000a, 0x1725: 0x000a, 0x1726: 0x000a, - // Block 0x5d, offset 0x1740 - 0x1740: 0x000a, 0x1741: 0x000a, 0x1742: 0x000a, 0x1743: 0x000a, 0x1744: 0x000a, 0x1745: 0x000a, - 0x1746: 0x000a, 0x1747: 0x000a, 0x1748: 0x000a, 0x1749: 0x000a, 0x174a: 0x000a, - 0x1760: 0x000a, 0x1761: 0x000a, 0x1762: 0x000a, 0x1763: 0x000a, - 0x1764: 0x000a, 0x1765: 0x000a, 0x1766: 0x000a, 0x1767: 0x000a, 0x1768: 0x000a, 0x1769: 0x000a, - 0x176a: 0x000a, 0x176b: 0x000a, 0x176c: 0x000a, 0x176d: 0x000a, 0x176e: 0x000a, 0x176f: 0x000a, - 0x1770: 0x000a, 0x1771: 0x000a, 0x1772: 0x000a, 0x1773: 0x000a, 0x1774: 0x000a, 0x1775: 0x000a, - 0x1776: 0x000a, 0x1777: 0x000a, 0x1778: 0x000a, 0x1779: 0x000a, 0x177a: 0x000a, 0x177b: 0x000a, - 0x177c: 0x000a, 0x177d: 0x000a, 0x177e: 0x000a, 0x177f: 0x000a, - // Block 0x5e, offset 0x1780 - 0x1780: 0x000a, 0x1781: 0x000a, 0x1782: 0x000a, 0x1783: 0x000a, 0x1784: 0x000a, 0x1785: 0x000a, - 0x1786: 0x000a, 0x1787: 0x000a, 0x1788: 0x0002, 0x1789: 0x0002, 0x178a: 0x0002, 0x178b: 0x0002, - 0x178c: 0x0002, 0x178d: 0x0002, 0x178e: 0x0002, 0x178f: 0x0002, 0x1790: 0x0002, 0x1791: 0x0002, - 0x1792: 0x0002, 0x1793: 0x0002, 0x1794: 0x0002, 0x1795: 0x0002, 0x1796: 0x0002, 0x1797: 0x0002, - 0x1798: 0x0002, 0x1799: 0x0002, 0x179a: 0x0002, 0x179b: 0x0002, - // Block 0x5f, offset 0x17c0 - 0x17ea: 0x000a, 0x17eb: 0x000a, 0x17ec: 0x000a, 0x17ed: 0x000a, 0x17ee: 0x000a, 0x17ef: 0x000a, - 0x17f0: 0x000a, 0x17f1: 0x000a, 0x17f2: 0x000a, 0x17f3: 0x000a, 0x17f4: 0x000a, 0x17f5: 0x000a, - 0x17f6: 0x000a, 0x17f7: 0x000a, 0x17f8: 0x000a, 0x17f9: 0x000a, 0x17fa: 0x000a, 0x17fb: 0x000a, - 0x17fc: 0x000a, 0x17fd: 0x000a, 0x17fe: 0x000a, 0x17ff: 0x000a, - // Block 0x60, offset 0x1800 - 0x1800: 0x000a, 0x1801: 0x000a, 0x1802: 0x000a, 0x1803: 0x000a, 0x1804: 0x000a, 0x1805: 0x000a, - 0x1806: 0x000a, 0x1807: 0x000a, 0x1808: 0x000a, 0x1809: 0x000a, 0x180a: 0x000a, 0x180b: 0x000a, - 0x180c: 0x000a, 0x180d: 0x000a, 0x180e: 0x000a, 0x180f: 0x000a, 0x1810: 0x000a, 0x1811: 0x000a, - 0x1812: 0x000a, 0x1813: 0x000a, 0x1814: 0x000a, 0x1815: 0x000a, 0x1816: 0x000a, 0x1817: 0x000a, - 0x1818: 0x000a, 0x1819: 0x000a, 0x181a: 0x000a, 0x181b: 0x000a, 0x181c: 0x000a, 0x181d: 0x000a, - 0x181e: 0x000a, 0x181f: 0x000a, 0x1820: 0x000a, 0x1821: 0x000a, 0x1822: 0x000a, 0x1823: 0x000a, - 0x1824: 0x000a, 0x1825: 0x000a, 0x1826: 0x000a, 0x1827: 0x000a, 0x1828: 0x000a, 0x1829: 0x000a, - 0x182a: 0x000a, 0x182b: 0x000a, 0x182d: 0x000a, 0x182e: 0x000a, 0x182f: 0x000a, - 0x1830: 0x000a, 0x1831: 0x000a, 0x1832: 0x000a, 0x1833: 0x000a, 0x1834: 0x000a, 0x1835: 0x000a, - 0x1836: 0x000a, 0x1837: 0x000a, 0x1838: 0x000a, 0x1839: 0x000a, 0x183a: 0x000a, 0x183b: 0x000a, - 0x183c: 0x000a, 0x183d: 0x000a, 0x183e: 0x000a, 0x183f: 0x000a, - // Block 0x61, offset 0x1840 - 0x1840: 0x000a, 0x1841: 0x000a, 0x1842: 0x000a, 0x1843: 0x000a, 0x1844: 0x000a, 0x1845: 0x000a, - 0x1846: 0x000a, 0x1847: 0x000a, 0x1848: 0x000a, 0x1849: 0x000a, 0x184a: 0x000a, 0x184b: 0x000a, - 0x184c: 0x000a, 0x184d: 0x000a, 0x184e: 0x000a, 0x184f: 0x000a, 0x1850: 0x000a, 0x1851: 0x000a, - 0x1852: 0x000a, 0x1853: 0x000a, 0x1854: 0x000a, 0x1855: 0x000a, 0x1856: 0x000a, 0x1857: 0x000a, - 0x1858: 0x000a, 0x1859: 0x000a, 0x185a: 0x000a, 0x185b: 0x000a, 0x185c: 0x000a, 0x185d: 0x000a, - 0x185e: 0x000a, 0x185f: 0x000a, 0x1860: 0x000a, 0x1861: 0x000a, 0x1862: 0x000a, 0x1863: 0x000a, - 0x1864: 0x000a, 0x1865: 0x000a, 0x1866: 0x000a, 0x1867: 0x000a, 0x1868: 0x003a, 0x1869: 0x002a, - 0x186a: 0x003a, 0x186b: 0x002a, 0x186c: 0x003a, 0x186d: 0x002a, 0x186e: 0x003a, 0x186f: 0x002a, - 0x1870: 0x003a, 0x1871: 0x002a, 0x1872: 0x003a, 0x1873: 0x002a, 0x1874: 0x003a, 0x1875: 0x002a, - 0x1876: 0x000a, 0x1877: 0x000a, 0x1878: 0x000a, 0x1879: 0x000a, 0x187a: 0x000a, 0x187b: 0x000a, - 0x187c: 0x000a, 0x187d: 0x000a, 0x187e: 0x000a, 0x187f: 0x000a, - // Block 0x62, offset 0x1880 - 0x1880: 0x000a, 0x1881: 0x000a, 0x1882: 0x000a, 0x1883: 0x000a, 0x1884: 0x000a, 0x1885: 0x009a, - 0x1886: 0x008a, 0x1887: 0x000a, 0x1888: 0x000a, 0x1889: 0x000a, 0x188a: 0x000a, 0x188b: 0x000a, - 0x188c: 0x000a, 0x188d: 0x000a, 0x188e: 0x000a, 0x188f: 0x000a, 0x1890: 0x000a, 0x1891: 0x000a, - 0x1892: 0x000a, 0x1893: 0x000a, 0x1894: 0x000a, 0x1895: 0x000a, 0x1896: 0x000a, 0x1897: 0x000a, - 0x1898: 0x000a, 0x1899: 0x000a, 0x189a: 0x000a, 0x189b: 0x000a, 0x189c: 0x000a, 0x189d: 0x000a, - 0x189e: 0x000a, 0x189f: 0x000a, 0x18a0: 0x000a, 0x18a1: 0x000a, 0x18a2: 0x000a, 0x18a3: 0x000a, - 0x18a4: 0x000a, 0x18a5: 0x000a, 0x18a6: 0x003a, 0x18a7: 0x002a, 0x18a8: 0x003a, 0x18a9: 0x002a, - 0x18aa: 0x003a, 0x18ab: 0x002a, 0x18ac: 0x003a, 0x18ad: 0x002a, 0x18ae: 0x003a, 0x18af: 0x002a, - 0x18b0: 0x000a, 0x18b1: 0x000a, 0x18b2: 0x000a, 0x18b3: 0x000a, 0x18b4: 0x000a, 0x18b5: 0x000a, - 0x18b6: 0x000a, 0x18b7: 0x000a, 0x18b8: 0x000a, 0x18b9: 0x000a, 0x18ba: 0x000a, 0x18bb: 0x000a, - 0x18bc: 0x000a, 0x18bd: 0x000a, 0x18be: 0x000a, 0x18bf: 0x000a, - // Block 0x63, offset 0x18c0 - 0x18c0: 0x000a, 0x18c1: 0x000a, 0x18c2: 0x000a, 0x18c3: 0x007a, 0x18c4: 0x006a, 0x18c5: 0x009a, - 0x18c6: 0x008a, 0x18c7: 0x00ba, 0x18c8: 0x00aa, 0x18c9: 0x009a, 0x18ca: 0x008a, 0x18cb: 0x007a, - 0x18cc: 0x006a, 0x18cd: 0x00da, 0x18ce: 0x002a, 0x18cf: 0x003a, 0x18d0: 0x00ca, 0x18d1: 0x009a, - 0x18d2: 0x008a, 0x18d3: 0x007a, 0x18d4: 0x006a, 0x18d5: 0x009a, 0x18d6: 0x008a, 0x18d7: 0x00ba, - 0x18d8: 0x00aa, 0x18d9: 0x000a, 0x18da: 0x000a, 0x18db: 0x000a, 0x18dc: 0x000a, 0x18dd: 0x000a, - 0x18de: 0x000a, 0x18df: 0x000a, 0x18e0: 0x000a, 0x18e1: 0x000a, 0x18e2: 0x000a, 0x18e3: 0x000a, - 0x18e4: 0x000a, 0x18e5: 0x000a, 0x18e6: 0x000a, 0x18e7: 0x000a, 0x18e8: 0x000a, 0x18e9: 0x000a, - 0x18ea: 0x000a, 0x18eb: 0x000a, 0x18ec: 0x000a, 0x18ed: 0x000a, 0x18ee: 0x000a, 0x18ef: 0x000a, - 0x18f0: 0x000a, 0x18f1: 0x000a, 0x18f2: 0x000a, 0x18f3: 0x000a, 0x18f4: 0x000a, 0x18f5: 0x000a, - 0x18f6: 0x000a, 0x18f7: 0x000a, 0x18f8: 0x000a, 0x18f9: 0x000a, 0x18fa: 0x000a, 0x18fb: 0x000a, - 0x18fc: 0x000a, 0x18fd: 0x000a, 0x18fe: 0x000a, 0x18ff: 0x000a, - // Block 0x64, offset 0x1900 - 0x1900: 0x000a, 0x1901: 0x000a, 0x1902: 0x000a, 0x1903: 0x000a, 0x1904: 0x000a, 0x1905: 0x000a, - 0x1906: 0x000a, 0x1907: 0x000a, 0x1908: 0x000a, 0x1909: 0x000a, 0x190a: 0x000a, 0x190b: 0x000a, - 0x190c: 0x000a, 0x190d: 0x000a, 0x190e: 0x000a, 0x190f: 0x000a, 0x1910: 0x000a, 0x1911: 0x000a, - 0x1912: 0x000a, 0x1913: 0x000a, 0x1914: 0x000a, 0x1915: 0x000a, 0x1916: 0x000a, 0x1917: 0x000a, - 0x1918: 0x003a, 0x1919: 0x002a, 0x191a: 0x003a, 0x191b: 0x002a, 0x191c: 0x000a, 0x191d: 0x000a, - 0x191e: 0x000a, 0x191f: 0x000a, 0x1920: 0x000a, 0x1921: 0x000a, 0x1922: 0x000a, 0x1923: 0x000a, - 0x1924: 0x000a, 0x1925: 0x000a, 0x1926: 0x000a, 0x1927: 0x000a, 0x1928: 0x000a, 0x1929: 0x000a, - 0x192a: 0x000a, 0x192b: 0x000a, 0x192c: 0x000a, 0x192d: 0x000a, 0x192e: 0x000a, 0x192f: 0x000a, - 0x1930: 0x000a, 0x1931: 0x000a, 0x1932: 0x000a, 0x1933: 0x000a, 0x1934: 0x000a, 0x1935: 0x000a, - 0x1936: 0x000a, 0x1937: 0x000a, 0x1938: 0x000a, 0x1939: 0x000a, 0x193a: 0x000a, 0x193b: 0x000a, - 0x193c: 0x003a, 0x193d: 0x002a, 0x193e: 0x000a, 0x193f: 0x000a, - // Block 0x65, offset 0x1940 - 0x1940: 0x000a, 0x1941: 0x000a, 0x1942: 0x000a, 0x1943: 0x000a, 0x1944: 0x000a, 0x1945: 0x000a, - 0x1946: 0x000a, 0x1947: 0x000a, 0x1948: 0x000a, 0x1949: 0x000a, 0x194a: 0x000a, 0x194b: 0x000a, - 0x194c: 0x000a, 0x194d: 0x000a, 0x194e: 0x000a, 0x194f: 0x000a, 0x1950: 0x000a, 0x1951: 0x000a, - 0x1952: 0x000a, 0x1953: 0x000a, 0x1954: 0x000a, 0x1955: 0x000a, 0x1956: 0x000a, 0x1957: 0x000a, - 0x1958: 0x000a, 0x1959: 0x000a, 0x195a: 0x000a, 0x195b: 0x000a, 0x195c: 0x000a, 0x195d: 0x000a, - 0x195e: 0x000a, 0x195f: 0x000a, 0x1960: 0x000a, 0x1961: 0x000a, 0x1962: 0x000a, 0x1963: 0x000a, - 0x1964: 0x000a, 0x1965: 0x000a, 0x1966: 0x000a, 0x1967: 0x000a, 0x1968: 0x000a, 0x1969: 0x000a, - 0x196a: 0x000a, 0x196b: 0x000a, 0x196c: 0x000a, 0x196d: 0x000a, 0x196e: 0x000a, 0x196f: 0x000a, - 0x1970: 0x000a, 0x1971: 0x000a, 0x1972: 0x000a, 0x1973: 0x000a, - 0x1976: 0x000a, 0x1977: 0x000a, 0x1978: 0x000a, 0x1979: 0x000a, 0x197a: 0x000a, 0x197b: 0x000a, - 0x197c: 0x000a, 0x197d: 0x000a, 0x197e: 0x000a, 0x197f: 0x000a, - // Block 0x66, offset 0x1980 - 0x1980: 0x000a, 0x1981: 0x000a, 0x1982: 0x000a, 0x1983: 0x000a, 0x1984: 0x000a, 0x1985: 0x000a, - 0x1986: 0x000a, 0x1987: 0x000a, 0x1988: 0x000a, 0x1989: 0x000a, 0x198a: 0x000a, 0x198b: 0x000a, - 0x198c: 0x000a, 0x198d: 0x000a, 0x198e: 0x000a, 0x198f: 0x000a, 0x1990: 0x000a, 0x1991: 0x000a, - 0x1992: 0x000a, 0x1993: 0x000a, 0x1994: 0x000a, 0x1995: 0x000a, - 0x1998: 0x000a, 0x1999: 0x000a, 0x199a: 0x000a, 0x199b: 0x000a, 0x199c: 0x000a, 0x199d: 0x000a, - 0x199e: 0x000a, 0x199f: 0x000a, 0x19a0: 0x000a, 0x19a1: 0x000a, 0x19a2: 0x000a, 0x19a3: 0x000a, - 0x19a4: 0x000a, 0x19a5: 0x000a, 0x19a6: 0x000a, 0x19a7: 0x000a, 0x19a8: 0x000a, 0x19a9: 0x000a, - 0x19aa: 0x000a, 0x19ab: 0x000a, 0x19ac: 0x000a, 0x19ad: 0x000a, 0x19ae: 0x000a, 0x19af: 0x000a, - 0x19b0: 0x000a, 0x19b1: 0x000a, 0x19b2: 0x000a, 0x19b3: 0x000a, 0x19b4: 0x000a, 0x19b5: 0x000a, - 0x19b6: 0x000a, 0x19b7: 0x000a, 0x19b8: 0x000a, 0x19b9: 0x000a, - 0x19bd: 0x000a, 0x19be: 0x000a, 0x19bf: 0x000a, - // Block 0x67, offset 0x19c0 - 0x19c0: 0x000a, 0x19c1: 0x000a, 0x19c2: 0x000a, 0x19c3: 0x000a, 0x19c4: 0x000a, 0x19c5: 0x000a, - 0x19c6: 0x000a, 0x19c7: 0x000a, 0x19c8: 0x000a, 0x19ca: 0x000a, 0x19cb: 0x000a, - 0x19cc: 0x000a, 0x19cd: 0x000a, 0x19ce: 0x000a, 0x19cf: 0x000a, 0x19d0: 0x000a, 0x19d1: 0x000a, - 0x19ec: 0x000a, 0x19ed: 0x000a, 0x19ee: 0x000a, 0x19ef: 0x000a, - // Block 0x68, offset 0x1a00 - 0x1a25: 0x000a, 0x1a26: 0x000a, 0x1a27: 0x000a, 0x1a28: 0x000a, 0x1a29: 0x000a, - 0x1a2a: 0x000a, 0x1a2f: 0x000c, - 0x1a30: 0x000c, 0x1a31: 0x000c, - 0x1a39: 0x000a, 0x1a3a: 0x000a, 0x1a3b: 0x000a, - 0x1a3c: 0x000a, 0x1a3d: 0x000a, 0x1a3e: 0x000a, 0x1a3f: 0x000a, - // Block 0x69, offset 0x1a40 - 0x1a7f: 0x000c, - // Block 0x6a, offset 0x1a80 - 0x1aa0: 0x000c, 0x1aa1: 0x000c, 0x1aa2: 0x000c, 0x1aa3: 0x000c, - 0x1aa4: 0x000c, 0x1aa5: 0x000c, 0x1aa6: 0x000c, 0x1aa7: 0x000c, 0x1aa8: 0x000c, 0x1aa9: 0x000c, - 0x1aaa: 0x000c, 0x1aab: 0x000c, 0x1aac: 0x000c, 0x1aad: 0x000c, 0x1aae: 0x000c, 0x1aaf: 0x000c, - 0x1ab0: 0x000c, 0x1ab1: 0x000c, 0x1ab2: 0x000c, 0x1ab3: 0x000c, 0x1ab4: 0x000c, 0x1ab5: 0x000c, - 0x1ab6: 0x000c, 0x1ab7: 0x000c, 0x1ab8: 0x000c, 0x1ab9: 0x000c, 0x1aba: 0x000c, 0x1abb: 0x000c, - 0x1abc: 0x000c, 0x1abd: 0x000c, 0x1abe: 0x000c, 0x1abf: 0x000c, - // Block 0x6b, offset 0x1ac0 - 0x1ac0: 0x000a, 0x1ac1: 0x000a, 0x1ac2: 0x000a, 0x1ac3: 0x000a, 0x1ac4: 0x000a, 0x1ac5: 0x000a, - 0x1ac6: 0x000a, 0x1ac7: 0x000a, 0x1ac8: 0x000a, 0x1ac9: 0x000a, 0x1aca: 0x000a, 0x1acb: 0x000a, - 0x1acc: 0x000a, 0x1acd: 0x000a, 0x1ace: 0x000a, 0x1acf: 0x000a, 0x1ad0: 0x000a, 0x1ad1: 0x000a, - 0x1ad2: 0x000a, 0x1ad3: 0x000a, 0x1ad4: 0x000a, 0x1ad5: 0x000a, 0x1ad6: 0x000a, 0x1ad7: 0x000a, - 0x1ad8: 0x000a, 0x1ad9: 0x000a, 0x1ada: 0x000a, 0x1adb: 0x000a, 0x1adc: 0x000a, 0x1add: 0x000a, - 0x1ade: 0x000a, 0x1adf: 0x000a, 0x1ae0: 0x000a, 0x1ae1: 0x000a, 0x1ae2: 0x003a, 0x1ae3: 0x002a, - 0x1ae4: 0x003a, 0x1ae5: 0x002a, 0x1ae6: 0x003a, 0x1ae7: 0x002a, 0x1ae8: 0x003a, 0x1ae9: 0x002a, - 0x1aea: 0x000a, 0x1aeb: 0x000a, 0x1aec: 0x000a, 0x1aed: 0x000a, 0x1aee: 0x000a, 0x1aef: 0x000a, - 0x1af0: 0x000a, 0x1af1: 0x000a, 0x1af2: 0x000a, 0x1af3: 0x000a, 0x1af4: 0x000a, 0x1af5: 0x000a, - 0x1af6: 0x000a, 0x1af7: 0x000a, 0x1af8: 0x000a, 0x1af9: 0x000a, 0x1afa: 0x000a, 0x1afb: 0x000a, - 0x1afc: 0x000a, 0x1afd: 0x000a, 0x1afe: 0x000a, 0x1aff: 0x000a, - // Block 0x6c, offset 0x1b00 - 0x1b00: 0x000a, 0x1b01: 0x000a, 0x1b02: 0x000a, 0x1b03: 0x000a, 0x1b04: 0x000a, - // Block 0x6d, offset 0x1b40 - 0x1b40: 0x000a, 0x1b41: 0x000a, 0x1b42: 0x000a, 0x1b43: 0x000a, 0x1b44: 0x000a, 0x1b45: 0x000a, - 0x1b46: 0x000a, 0x1b47: 0x000a, 0x1b48: 0x000a, 0x1b49: 0x000a, 0x1b4a: 0x000a, 0x1b4b: 0x000a, - 0x1b4c: 0x000a, 0x1b4d: 0x000a, 0x1b4e: 0x000a, 0x1b4f: 0x000a, 0x1b50: 0x000a, 0x1b51: 0x000a, - 0x1b52: 0x000a, 0x1b53: 0x000a, 0x1b54: 0x000a, 0x1b55: 0x000a, 0x1b56: 0x000a, 0x1b57: 0x000a, - 0x1b58: 0x000a, 0x1b59: 0x000a, 0x1b5b: 0x000a, 0x1b5c: 0x000a, 0x1b5d: 0x000a, - 0x1b5e: 0x000a, 0x1b5f: 0x000a, 0x1b60: 0x000a, 0x1b61: 0x000a, 0x1b62: 0x000a, 0x1b63: 0x000a, - 0x1b64: 0x000a, 0x1b65: 0x000a, 0x1b66: 0x000a, 0x1b67: 0x000a, 0x1b68: 0x000a, 0x1b69: 0x000a, - 0x1b6a: 0x000a, 0x1b6b: 0x000a, 0x1b6c: 0x000a, 0x1b6d: 0x000a, 0x1b6e: 0x000a, 0x1b6f: 0x000a, - 0x1b70: 0x000a, 0x1b71: 0x000a, 0x1b72: 0x000a, 0x1b73: 0x000a, 0x1b74: 0x000a, 0x1b75: 0x000a, - 0x1b76: 0x000a, 0x1b77: 0x000a, 0x1b78: 0x000a, 0x1b79: 0x000a, 0x1b7a: 0x000a, 0x1b7b: 0x000a, - 0x1b7c: 0x000a, 0x1b7d: 0x000a, 0x1b7e: 0x000a, 0x1b7f: 0x000a, - // Block 0x6e, offset 0x1b80 - 0x1b80: 0x000a, 0x1b81: 0x000a, 0x1b82: 0x000a, 0x1b83: 0x000a, 0x1b84: 0x000a, 0x1b85: 0x000a, - 0x1b86: 0x000a, 0x1b87: 0x000a, 0x1b88: 0x000a, 0x1b89: 0x000a, 0x1b8a: 0x000a, 0x1b8b: 0x000a, - 0x1b8c: 0x000a, 0x1b8d: 0x000a, 0x1b8e: 0x000a, 0x1b8f: 0x000a, 0x1b90: 0x000a, 0x1b91: 0x000a, - 0x1b92: 0x000a, 0x1b93: 0x000a, 0x1b94: 0x000a, 0x1b95: 0x000a, 0x1b96: 0x000a, 0x1b97: 0x000a, - 0x1b98: 0x000a, 0x1b99: 0x000a, 0x1b9a: 0x000a, 0x1b9b: 0x000a, 0x1b9c: 0x000a, 0x1b9d: 0x000a, - 0x1b9e: 0x000a, 0x1b9f: 0x000a, 0x1ba0: 0x000a, 0x1ba1: 0x000a, 0x1ba2: 0x000a, 0x1ba3: 0x000a, - 0x1ba4: 0x000a, 0x1ba5: 0x000a, 0x1ba6: 0x000a, 0x1ba7: 0x000a, 0x1ba8: 0x000a, 0x1ba9: 0x000a, - 0x1baa: 0x000a, 0x1bab: 0x000a, 0x1bac: 0x000a, 0x1bad: 0x000a, 0x1bae: 0x000a, 0x1baf: 0x000a, - 0x1bb0: 0x000a, 0x1bb1: 0x000a, 0x1bb2: 0x000a, 0x1bb3: 0x000a, - // Block 0x6f, offset 0x1bc0 - 0x1bc0: 0x000a, 0x1bc1: 0x000a, 0x1bc2: 0x000a, 0x1bc3: 0x000a, 0x1bc4: 0x000a, 0x1bc5: 0x000a, - 0x1bc6: 0x000a, 0x1bc7: 0x000a, 0x1bc8: 0x000a, 0x1bc9: 0x000a, 0x1bca: 0x000a, 0x1bcb: 0x000a, - 0x1bcc: 0x000a, 0x1bcd: 0x000a, 0x1bce: 0x000a, 0x1bcf: 0x000a, 0x1bd0: 0x000a, 0x1bd1: 0x000a, - 0x1bd2: 0x000a, 0x1bd3: 0x000a, 0x1bd4: 0x000a, 0x1bd5: 0x000a, - 0x1bf0: 0x000a, 0x1bf1: 0x000a, 0x1bf2: 0x000a, 0x1bf3: 0x000a, 0x1bf4: 0x000a, 0x1bf5: 0x000a, - 0x1bf6: 0x000a, 0x1bf7: 0x000a, 0x1bf8: 0x000a, 0x1bf9: 0x000a, 0x1bfa: 0x000a, 0x1bfb: 0x000a, - // Block 0x70, offset 0x1c00 - 0x1c00: 0x0009, 0x1c01: 0x000a, 0x1c02: 0x000a, 0x1c03: 0x000a, 0x1c04: 0x000a, - 0x1c08: 0x003a, 0x1c09: 0x002a, 0x1c0a: 0x003a, 0x1c0b: 0x002a, - 0x1c0c: 0x003a, 0x1c0d: 0x002a, 0x1c0e: 0x003a, 0x1c0f: 0x002a, 0x1c10: 0x003a, 0x1c11: 0x002a, - 0x1c12: 0x000a, 0x1c13: 0x000a, 0x1c14: 0x003a, 0x1c15: 0x002a, 0x1c16: 0x003a, 0x1c17: 0x002a, - 0x1c18: 0x003a, 0x1c19: 0x002a, 0x1c1a: 0x003a, 0x1c1b: 0x002a, 0x1c1c: 0x000a, 0x1c1d: 0x000a, - 0x1c1e: 0x000a, 0x1c1f: 0x000a, 0x1c20: 0x000a, - 0x1c2a: 0x000c, 0x1c2b: 0x000c, 0x1c2c: 0x000c, 0x1c2d: 0x000c, - 0x1c30: 0x000a, - 0x1c36: 0x000a, 0x1c37: 0x000a, - 0x1c3d: 0x000a, 0x1c3e: 0x000a, 0x1c3f: 0x000a, - // Block 0x71, offset 0x1c40 - 0x1c59: 0x000c, 0x1c5a: 0x000c, 0x1c5b: 0x000a, 0x1c5c: 0x000a, - 0x1c60: 0x000a, - // Block 0x72, offset 0x1c80 - 0x1cbb: 0x000a, - // Block 0x73, offset 0x1cc0 - 0x1cc0: 0x000a, 0x1cc1: 0x000a, 0x1cc2: 0x000a, 0x1cc3: 0x000a, 0x1cc4: 0x000a, 0x1cc5: 0x000a, - 0x1cc6: 0x000a, 0x1cc7: 0x000a, 0x1cc8: 0x000a, 0x1cc9: 0x000a, 0x1cca: 0x000a, 0x1ccb: 0x000a, - 0x1ccc: 0x000a, 0x1ccd: 0x000a, 0x1cce: 0x000a, 0x1ccf: 0x000a, 0x1cd0: 0x000a, 0x1cd1: 0x000a, - 0x1cd2: 0x000a, 0x1cd3: 0x000a, 0x1cd4: 0x000a, 0x1cd5: 0x000a, 0x1cd6: 0x000a, 0x1cd7: 0x000a, - 0x1cd8: 0x000a, 0x1cd9: 0x000a, 0x1cda: 0x000a, 0x1cdb: 0x000a, 0x1cdc: 0x000a, 0x1cdd: 0x000a, - 0x1cde: 0x000a, 0x1cdf: 0x000a, 0x1ce0: 0x000a, 0x1ce1: 0x000a, 0x1ce2: 0x000a, 0x1ce3: 0x000a, - // Block 0x74, offset 0x1d00 - 0x1d1d: 0x000a, - 0x1d1e: 0x000a, - // Block 0x75, offset 0x1d40 - 0x1d50: 0x000a, 0x1d51: 0x000a, - 0x1d52: 0x000a, 0x1d53: 0x000a, 0x1d54: 0x000a, 0x1d55: 0x000a, 0x1d56: 0x000a, 0x1d57: 0x000a, - 0x1d58: 0x000a, 0x1d59: 0x000a, 0x1d5a: 0x000a, 0x1d5b: 0x000a, 0x1d5c: 0x000a, 0x1d5d: 0x000a, - 0x1d5e: 0x000a, 0x1d5f: 0x000a, - 0x1d7c: 0x000a, 0x1d7d: 0x000a, 0x1d7e: 0x000a, - // Block 0x76, offset 0x1d80 - 0x1db1: 0x000a, 0x1db2: 0x000a, 0x1db3: 0x000a, 0x1db4: 0x000a, 0x1db5: 0x000a, - 0x1db6: 0x000a, 0x1db7: 0x000a, 0x1db8: 0x000a, 0x1db9: 0x000a, 0x1dba: 0x000a, 0x1dbb: 0x000a, - 0x1dbc: 0x000a, 0x1dbd: 0x000a, 0x1dbe: 0x000a, 0x1dbf: 0x000a, - // Block 0x77, offset 0x1dc0 - 0x1dcc: 0x000a, 0x1dcd: 0x000a, 0x1dce: 0x000a, 0x1dcf: 0x000a, - // Block 0x78, offset 0x1e00 - 0x1e37: 0x000a, 0x1e38: 0x000a, 0x1e39: 0x000a, 0x1e3a: 0x000a, - // Block 0x79, offset 0x1e40 - 0x1e5e: 0x000a, 0x1e5f: 0x000a, - 0x1e7f: 0x000a, - // Block 0x7a, offset 0x1e80 - 0x1e90: 0x000a, 0x1e91: 0x000a, - 0x1e92: 0x000a, 0x1e93: 0x000a, 0x1e94: 0x000a, 0x1e95: 0x000a, 0x1e96: 0x000a, 0x1e97: 0x000a, - 0x1e98: 0x000a, 0x1e99: 0x000a, 0x1e9a: 0x000a, 0x1e9b: 0x000a, 0x1e9c: 0x000a, 0x1e9d: 0x000a, - 0x1e9e: 0x000a, 0x1e9f: 0x000a, 0x1ea0: 0x000a, 0x1ea1: 0x000a, 0x1ea2: 0x000a, 0x1ea3: 0x000a, - 0x1ea4: 0x000a, 0x1ea5: 0x000a, 0x1ea6: 0x000a, 0x1ea7: 0x000a, 0x1ea8: 0x000a, 0x1ea9: 0x000a, - 0x1eaa: 0x000a, 0x1eab: 0x000a, 0x1eac: 0x000a, 0x1ead: 0x000a, 0x1eae: 0x000a, 0x1eaf: 0x000a, - 0x1eb0: 0x000a, 0x1eb1: 0x000a, 0x1eb2: 0x000a, 0x1eb3: 0x000a, 0x1eb4: 0x000a, 0x1eb5: 0x000a, - 0x1eb6: 0x000a, 0x1eb7: 0x000a, 0x1eb8: 0x000a, 0x1eb9: 0x000a, 0x1eba: 0x000a, 0x1ebb: 0x000a, - 0x1ebc: 0x000a, 0x1ebd: 0x000a, 0x1ebe: 0x000a, 0x1ebf: 0x000a, - // Block 0x7b, offset 0x1ec0 - 0x1ec0: 0x000a, 0x1ec1: 0x000a, 0x1ec2: 0x000a, 0x1ec3: 0x000a, 0x1ec4: 0x000a, 0x1ec5: 0x000a, - 0x1ec6: 0x000a, - // Block 0x7c, offset 0x1f00 - 0x1f0d: 0x000a, 0x1f0e: 0x000a, 0x1f0f: 0x000a, - // Block 0x7d, offset 0x1f40 - 0x1f6f: 0x000c, - 0x1f70: 0x000c, 0x1f71: 0x000c, 0x1f72: 0x000c, 0x1f73: 0x000a, 0x1f74: 0x000c, 0x1f75: 0x000c, - 0x1f76: 0x000c, 0x1f77: 0x000c, 0x1f78: 0x000c, 0x1f79: 0x000c, 0x1f7a: 0x000c, 0x1f7b: 0x000c, - 0x1f7c: 0x000c, 0x1f7d: 0x000c, 0x1f7e: 0x000a, 0x1f7f: 0x000a, - // Block 0x7e, offset 0x1f80 - 0x1f9e: 0x000c, 0x1f9f: 0x000c, - // Block 0x7f, offset 0x1fc0 - 0x1ff0: 0x000c, 0x1ff1: 0x000c, - // Block 0x80, offset 0x2000 - 0x2000: 0x000a, 0x2001: 0x000a, 0x2002: 0x000a, 0x2003: 0x000a, 0x2004: 0x000a, 0x2005: 0x000a, - 0x2006: 0x000a, 0x2007: 0x000a, 0x2008: 0x000a, 0x2009: 0x000a, 0x200a: 0x000a, 0x200b: 0x000a, - 0x200c: 0x000a, 0x200d: 0x000a, 0x200e: 0x000a, 0x200f: 0x000a, 0x2010: 0x000a, 0x2011: 0x000a, - 0x2012: 0x000a, 0x2013: 0x000a, 0x2014: 0x000a, 0x2015: 0x000a, 0x2016: 0x000a, 0x2017: 0x000a, - 0x2018: 0x000a, 0x2019: 0x000a, 0x201a: 0x000a, 0x201b: 0x000a, 0x201c: 0x000a, 0x201d: 0x000a, - 0x201e: 0x000a, 0x201f: 0x000a, 0x2020: 0x000a, 0x2021: 0x000a, - // Block 0x81, offset 0x2040 - 0x2048: 0x000a, - // Block 0x82, offset 0x2080 - 0x2082: 0x000c, - 0x2086: 0x000c, 0x208b: 0x000c, - 0x20a5: 0x000c, 0x20a6: 0x000c, 0x20a8: 0x000a, 0x20a9: 0x000a, - 0x20aa: 0x000a, 0x20ab: 0x000a, - 0x20b8: 0x0004, 0x20b9: 0x0004, - // Block 0x83, offset 0x20c0 - 0x20f4: 0x000a, 0x20f5: 0x000a, - 0x20f6: 0x000a, 0x20f7: 0x000a, - // Block 0x84, offset 0x2100 - 0x2104: 0x000c, 0x2105: 0x000c, - 0x2120: 0x000c, 0x2121: 0x000c, 0x2122: 0x000c, 0x2123: 0x000c, - 0x2124: 0x000c, 0x2125: 0x000c, 0x2126: 0x000c, 0x2127: 0x000c, 0x2128: 0x000c, 0x2129: 0x000c, - 0x212a: 0x000c, 0x212b: 0x000c, 0x212c: 0x000c, 0x212d: 0x000c, 0x212e: 0x000c, 0x212f: 0x000c, - 0x2130: 0x000c, 0x2131: 0x000c, - // Block 0x85, offset 0x2140 - 0x2166: 0x000c, 0x2167: 0x000c, 0x2168: 0x000c, 0x2169: 0x000c, - 0x216a: 0x000c, 0x216b: 0x000c, 0x216c: 0x000c, 0x216d: 0x000c, - // Block 0x86, offset 0x2180 - 0x2187: 0x000c, 0x2188: 0x000c, 0x2189: 0x000c, 0x218a: 0x000c, 0x218b: 0x000c, - 0x218c: 0x000c, 0x218d: 0x000c, 0x218e: 0x000c, 0x218f: 0x000c, 0x2190: 0x000c, 0x2191: 0x000c, - // Block 0x87, offset 0x21c0 - 0x21c0: 0x000c, 0x21c1: 0x000c, 0x21c2: 0x000c, - 0x21f3: 0x000c, - 0x21f6: 0x000c, 0x21f7: 0x000c, 0x21f8: 0x000c, 0x21f9: 0x000c, - 0x21fc: 0x000c, - // Block 0x88, offset 0x2200 - 0x2225: 0x000c, - // Block 0x89, offset 0x2240 - 0x2269: 0x000c, - 0x226a: 0x000c, 0x226b: 0x000c, 0x226c: 0x000c, 0x226d: 0x000c, 0x226e: 0x000c, - 0x2271: 0x000c, 0x2272: 0x000c, 0x2275: 0x000c, - 0x2276: 0x000c, - // Block 0x8a, offset 0x2280 - 0x2283: 0x000c, - 0x228c: 0x000c, - 0x22bc: 0x000c, - // Block 0x8b, offset 0x22c0 - 0x22f0: 0x000c, 0x22f2: 0x000c, 0x22f3: 0x000c, 0x22f4: 0x000c, - 0x22f7: 0x000c, 0x22f8: 0x000c, - 0x22fe: 0x000c, 0x22ff: 0x000c, - // Block 0x8c, offset 0x2300 - 0x2301: 0x000c, - 0x232c: 0x000c, 0x232d: 0x000c, - 0x2336: 0x000c, - // Block 0x8d, offset 0x2340 - 0x2365: 0x000c, 0x2368: 0x000c, - 0x236d: 0x000c, - // Block 0x8e, offset 0x2380 - 0x239d: 0x0001, - 0x239e: 0x000c, 0x239f: 0x0001, 0x23a0: 0x0001, 0x23a1: 0x0001, 0x23a2: 0x0001, 0x23a3: 0x0001, - 0x23a4: 0x0001, 0x23a5: 0x0001, 0x23a6: 0x0001, 0x23a7: 0x0001, 0x23a8: 0x0001, 0x23a9: 0x0003, - 0x23aa: 0x0001, 0x23ab: 0x0001, 0x23ac: 0x0001, 0x23ad: 0x0001, 0x23ae: 0x0001, 0x23af: 0x0001, - 0x23b0: 0x0001, 0x23b1: 0x0001, 0x23b2: 0x0001, 0x23b3: 0x0001, 0x23b4: 0x0001, 0x23b5: 0x0001, - 0x23b6: 0x0001, 0x23b7: 0x0001, 0x23b8: 0x0001, 0x23b9: 0x0001, 0x23ba: 0x0001, 0x23bb: 0x0001, - 0x23bc: 0x0001, 0x23bd: 0x0001, 0x23be: 0x0001, 0x23bf: 0x0001, - // Block 0x8f, offset 0x23c0 - 0x23c0: 0x0001, 0x23c1: 0x0001, 0x23c2: 0x0001, 0x23c3: 0x0001, 0x23c4: 0x0001, 0x23c5: 0x0001, - 0x23c6: 0x0001, 0x23c7: 0x0001, 0x23c8: 0x0001, 0x23c9: 0x0001, 0x23ca: 0x0001, 0x23cb: 0x0001, - 0x23cc: 0x0001, 0x23cd: 0x0001, 0x23ce: 0x0001, 0x23cf: 0x0001, 0x23d0: 0x000d, 0x23d1: 0x000d, - 0x23d2: 0x000d, 0x23d3: 0x000d, 0x23d4: 0x000d, 0x23d5: 0x000d, 0x23d6: 0x000d, 0x23d7: 0x000d, - 0x23d8: 0x000d, 0x23d9: 0x000d, 0x23da: 0x000d, 0x23db: 0x000d, 0x23dc: 0x000d, 0x23dd: 0x000d, - 0x23de: 0x000d, 0x23df: 0x000d, 0x23e0: 0x000d, 0x23e1: 0x000d, 0x23e2: 0x000d, 0x23e3: 0x000d, - 0x23e4: 0x000d, 0x23e5: 0x000d, 0x23e6: 0x000d, 0x23e7: 0x000d, 0x23e8: 0x000d, 0x23e9: 0x000d, - 0x23ea: 0x000d, 0x23eb: 0x000d, 0x23ec: 0x000d, 0x23ed: 0x000d, 0x23ee: 0x000d, 0x23ef: 0x000d, - 0x23f0: 0x000d, 0x23f1: 0x000d, 0x23f2: 0x000d, 0x23f3: 0x000d, 0x23f4: 0x000d, 0x23f5: 0x000d, - 0x23f6: 0x000d, 0x23f7: 0x000d, 0x23f8: 0x000d, 0x23f9: 0x000d, 0x23fa: 0x000d, 0x23fb: 0x000d, - 0x23fc: 0x000d, 0x23fd: 0x000d, 0x23fe: 0x000d, 0x23ff: 0x000d, - // Block 0x90, offset 0x2400 - 0x2400: 0x000d, 0x2401: 0x000d, 0x2402: 0x000d, 0x2403: 0x000d, 0x2404: 0x000d, 0x2405: 0x000d, - 0x2406: 0x000d, 0x2407: 0x000d, 0x2408: 0x000d, 0x2409: 0x000d, 0x240a: 0x000d, 0x240b: 0x000d, - 0x240c: 0x000d, 0x240d: 0x000d, 0x240e: 0x000d, 0x240f: 0x000d, 0x2410: 0x000d, 0x2411: 0x000d, - 0x2412: 0x000d, 0x2413: 0x000d, 0x2414: 0x000d, 0x2415: 0x000d, 0x2416: 0x000d, 0x2417: 0x000d, - 0x2418: 0x000d, 0x2419: 0x000d, 0x241a: 0x000d, 0x241b: 0x000d, 0x241c: 0x000d, 0x241d: 0x000d, - 0x241e: 0x000d, 0x241f: 0x000d, 0x2420: 0x000d, 0x2421: 0x000d, 0x2422: 0x000d, 0x2423: 0x000d, - 0x2424: 0x000d, 0x2425: 0x000d, 0x2426: 0x000d, 0x2427: 0x000d, 0x2428: 0x000d, 0x2429: 0x000d, - 0x242a: 0x000d, 0x242b: 0x000d, 0x242c: 0x000d, 0x242d: 0x000d, 0x242e: 0x000d, 0x242f: 0x000d, - 0x2430: 0x000d, 0x2431: 0x000d, 0x2432: 0x000d, 0x2433: 0x000d, 0x2434: 0x000d, 0x2435: 0x000d, - 0x2436: 0x000d, 0x2437: 0x000d, 0x2438: 0x000d, 0x2439: 0x000d, 0x243a: 0x000d, 0x243b: 0x000d, - 0x243c: 0x000d, 0x243d: 0x000d, 0x243e: 0x000a, 0x243f: 0x000a, - // Block 0x91, offset 0x2440 - 0x2440: 0x000d, 0x2441: 0x000d, 0x2442: 0x000d, 0x2443: 0x000d, 0x2444: 0x000d, 0x2445: 0x000d, - 0x2446: 0x000d, 0x2447: 0x000d, 0x2448: 0x000d, 0x2449: 0x000d, 0x244a: 0x000d, 0x244b: 0x000d, - 0x244c: 0x000d, 0x244d: 0x000d, 0x244e: 0x000d, 0x244f: 0x000d, 0x2450: 0x000b, 0x2451: 0x000b, - 0x2452: 0x000b, 0x2453: 0x000b, 0x2454: 0x000b, 0x2455: 0x000b, 0x2456: 0x000b, 0x2457: 0x000b, - 0x2458: 0x000b, 0x2459: 0x000b, 0x245a: 0x000b, 0x245b: 0x000b, 0x245c: 0x000b, 0x245d: 0x000b, - 0x245e: 0x000b, 0x245f: 0x000b, 0x2460: 0x000b, 0x2461: 0x000b, 0x2462: 0x000b, 0x2463: 0x000b, - 0x2464: 0x000b, 0x2465: 0x000b, 0x2466: 0x000b, 0x2467: 0x000b, 0x2468: 0x000b, 0x2469: 0x000b, - 0x246a: 0x000b, 0x246b: 0x000b, 0x246c: 0x000b, 0x246d: 0x000b, 0x246e: 0x000b, 0x246f: 0x000b, - 0x2470: 0x000d, 0x2471: 0x000d, 0x2472: 0x000d, 0x2473: 0x000d, 0x2474: 0x000d, 0x2475: 0x000d, - 0x2476: 0x000d, 0x2477: 0x000d, 0x2478: 0x000d, 0x2479: 0x000d, 0x247a: 0x000d, 0x247b: 0x000d, - 0x247c: 0x000d, 0x247d: 0x000a, 0x247e: 0x000d, 0x247f: 0x000d, - // Block 0x92, offset 0x2480 - 0x2480: 0x000c, 0x2481: 0x000c, 0x2482: 0x000c, 0x2483: 0x000c, 0x2484: 0x000c, 0x2485: 0x000c, - 0x2486: 0x000c, 0x2487: 0x000c, 0x2488: 0x000c, 0x2489: 0x000c, 0x248a: 0x000c, 0x248b: 0x000c, - 0x248c: 0x000c, 0x248d: 0x000c, 0x248e: 0x000c, 0x248f: 0x000c, 0x2490: 0x000a, 0x2491: 0x000a, - 0x2492: 0x000a, 0x2493: 0x000a, 0x2494: 0x000a, 0x2495: 0x000a, 0x2496: 0x000a, 0x2497: 0x000a, - 0x2498: 0x000a, 0x2499: 0x000a, - 0x24a0: 0x000c, 0x24a1: 0x000c, 0x24a2: 0x000c, 0x24a3: 0x000c, - 0x24a4: 0x000c, 0x24a5: 0x000c, 0x24a6: 0x000c, 0x24a7: 0x000c, 0x24a8: 0x000c, 0x24a9: 0x000c, - 0x24aa: 0x000c, 0x24ab: 0x000c, 0x24ac: 0x000c, 0x24ad: 0x000c, 0x24ae: 0x000c, 0x24af: 0x000c, - 0x24b0: 0x000a, 0x24b1: 0x000a, 0x24b2: 0x000a, 0x24b3: 0x000a, 0x24b4: 0x000a, 0x24b5: 0x000a, - 0x24b6: 0x000a, 0x24b7: 0x000a, 0x24b8: 0x000a, 0x24b9: 0x000a, 0x24ba: 0x000a, 0x24bb: 0x000a, - 0x24bc: 0x000a, 0x24bd: 0x000a, 0x24be: 0x000a, 0x24bf: 0x000a, - // Block 0x93, offset 0x24c0 - 0x24c0: 0x000a, 0x24c1: 0x000a, 0x24c2: 0x000a, 0x24c3: 0x000a, 0x24c4: 0x000a, 0x24c5: 0x000a, - 0x24c6: 0x000a, 0x24c7: 0x000a, 0x24c8: 0x000a, 0x24c9: 0x000a, 0x24ca: 0x000a, 0x24cb: 0x000a, - 0x24cc: 0x000a, 0x24cd: 0x000a, 0x24ce: 0x000a, 0x24cf: 0x000a, 0x24d0: 0x0006, 0x24d1: 0x000a, - 0x24d2: 0x0006, 0x24d4: 0x000a, 0x24d5: 0x0006, 0x24d6: 0x000a, 0x24d7: 0x000a, - 0x24d8: 0x000a, 0x24d9: 0x009a, 0x24da: 0x008a, 0x24db: 0x007a, 0x24dc: 0x006a, 0x24dd: 0x009a, - 0x24de: 0x008a, 0x24df: 0x0004, 0x24e0: 0x000a, 0x24e1: 0x000a, 0x24e2: 0x0003, 0x24e3: 0x0003, - 0x24e4: 0x000a, 0x24e5: 0x000a, 0x24e6: 0x000a, 0x24e8: 0x000a, 0x24e9: 0x0004, - 0x24ea: 0x0004, 0x24eb: 0x000a, - 0x24f0: 0x000d, 0x24f1: 0x000d, 0x24f2: 0x000d, 0x24f3: 0x000d, 0x24f4: 0x000d, 0x24f5: 0x000d, - 0x24f6: 0x000d, 0x24f7: 0x000d, 0x24f8: 0x000d, 0x24f9: 0x000d, 0x24fa: 0x000d, 0x24fb: 0x000d, - 0x24fc: 0x000d, 0x24fd: 0x000d, 0x24fe: 0x000d, 0x24ff: 0x000d, - // Block 0x94, offset 0x2500 - 0x2500: 0x000d, 0x2501: 0x000d, 0x2502: 0x000d, 0x2503: 0x000d, 0x2504: 0x000d, 0x2505: 0x000d, - 0x2506: 0x000d, 0x2507: 0x000d, 0x2508: 0x000d, 0x2509: 0x000d, 0x250a: 0x000d, 0x250b: 0x000d, - 0x250c: 0x000d, 0x250d: 0x000d, 0x250e: 0x000d, 0x250f: 0x000d, 0x2510: 0x000d, 0x2511: 0x000d, - 0x2512: 0x000d, 0x2513: 0x000d, 0x2514: 0x000d, 0x2515: 0x000d, 0x2516: 0x000d, 0x2517: 0x000d, - 0x2518: 0x000d, 0x2519: 0x000d, 0x251a: 0x000d, 0x251b: 0x000d, 0x251c: 0x000d, 0x251d: 0x000d, - 0x251e: 0x000d, 0x251f: 0x000d, 0x2520: 0x000d, 0x2521: 0x000d, 0x2522: 0x000d, 0x2523: 0x000d, - 0x2524: 0x000d, 0x2525: 0x000d, 0x2526: 0x000d, 0x2527: 0x000d, 0x2528: 0x000d, 0x2529: 0x000d, - 0x252a: 0x000d, 0x252b: 0x000d, 0x252c: 0x000d, 0x252d: 0x000d, 0x252e: 0x000d, 0x252f: 0x000d, - 0x2530: 0x000d, 0x2531: 0x000d, 0x2532: 0x000d, 0x2533: 0x000d, 0x2534: 0x000d, 0x2535: 0x000d, - 0x2536: 0x000d, 0x2537: 0x000d, 0x2538: 0x000d, 0x2539: 0x000d, 0x253a: 0x000d, 0x253b: 0x000d, - 0x253c: 0x000d, 0x253d: 0x000d, 0x253e: 0x000d, 0x253f: 0x000b, - // Block 0x95, offset 0x2540 - 0x2541: 0x000a, 0x2542: 0x000a, 0x2543: 0x0004, 0x2544: 0x0004, 0x2545: 0x0004, - 0x2546: 0x000a, 0x2547: 0x000a, 0x2548: 0x003a, 0x2549: 0x002a, 0x254a: 0x000a, 0x254b: 0x0003, - 0x254c: 0x0006, 0x254d: 0x0003, 0x254e: 0x0006, 0x254f: 0x0006, 0x2550: 0x0002, 0x2551: 0x0002, - 0x2552: 0x0002, 0x2553: 0x0002, 0x2554: 0x0002, 0x2555: 0x0002, 0x2556: 0x0002, 0x2557: 0x0002, - 0x2558: 0x0002, 0x2559: 0x0002, 0x255a: 0x0006, 0x255b: 0x000a, 0x255c: 0x000a, 0x255d: 0x000a, - 0x255e: 0x000a, 0x255f: 0x000a, 0x2560: 0x000a, - 0x257b: 0x005a, - 0x257c: 0x000a, 0x257d: 0x004a, 0x257e: 0x000a, 0x257f: 0x000a, - // Block 0x96, offset 0x2580 - 0x2580: 0x000a, - 0x259b: 0x005a, 0x259c: 0x000a, 0x259d: 0x004a, - 0x259e: 0x000a, 0x259f: 0x00fa, 0x25a0: 0x00ea, 0x25a1: 0x000a, 0x25a2: 0x003a, 0x25a3: 0x002a, - 0x25a4: 0x000a, 0x25a5: 0x000a, - // Block 0x97, offset 0x25c0 - 0x25e0: 0x0004, 0x25e1: 0x0004, 0x25e2: 0x000a, 0x25e3: 0x000a, - 0x25e4: 0x000a, 0x25e5: 0x0004, 0x25e6: 0x0004, 0x25e8: 0x000a, 0x25e9: 0x000a, - 0x25ea: 0x000a, 0x25eb: 0x000a, 0x25ec: 0x000a, 0x25ed: 0x000a, 0x25ee: 0x000a, - 0x25f0: 0x000b, 0x25f1: 0x000b, 0x25f2: 0x000b, 0x25f3: 0x000b, 0x25f4: 0x000b, 0x25f5: 0x000b, - 0x25f6: 0x000b, 0x25f7: 0x000b, 0x25f8: 0x000b, 0x25f9: 0x000a, 0x25fa: 0x000a, 0x25fb: 0x000a, - 0x25fc: 0x000a, 0x25fd: 0x000a, 0x25fe: 0x000b, 0x25ff: 0x000b, - // Block 0x98, offset 0x2600 - 0x2601: 0x000a, - // Block 0x99, offset 0x2640 - 0x2640: 0x000a, 0x2641: 0x000a, 0x2642: 0x000a, 0x2643: 0x000a, 0x2644: 0x000a, 0x2645: 0x000a, - 0x2646: 0x000a, 0x2647: 0x000a, 0x2648: 0x000a, 0x2649: 0x000a, 0x264a: 0x000a, 0x264b: 0x000a, - 0x264c: 0x000a, 0x2650: 0x000a, 0x2651: 0x000a, - 0x2652: 0x000a, 0x2653: 0x000a, 0x2654: 0x000a, 0x2655: 0x000a, 0x2656: 0x000a, 0x2657: 0x000a, - 0x2658: 0x000a, 0x2659: 0x000a, 0x265a: 0x000a, 0x265b: 0x000a, - 0x2660: 0x000a, - // Block 0x9a, offset 0x2680 - 0x26bd: 0x000c, - // Block 0x9b, offset 0x26c0 - 0x26e0: 0x000c, 0x26e1: 0x0002, 0x26e2: 0x0002, 0x26e3: 0x0002, - 0x26e4: 0x0002, 0x26e5: 0x0002, 0x26e6: 0x0002, 0x26e7: 0x0002, 0x26e8: 0x0002, 0x26e9: 0x0002, - 0x26ea: 0x0002, 0x26eb: 0x0002, 0x26ec: 0x0002, 0x26ed: 0x0002, 0x26ee: 0x0002, 0x26ef: 0x0002, - 0x26f0: 0x0002, 0x26f1: 0x0002, 0x26f2: 0x0002, 0x26f3: 0x0002, 0x26f4: 0x0002, 0x26f5: 0x0002, - 0x26f6: 0x0002, 0x26f7: 0x0002, 0x26f8: 0x0002, 0x26f9: 0x0002, 0x26fa: 0x0002, 0x26fb: 0x0002, - // Block 0x9c, offset 0x2700 - 0x2736: 0x000c, 0x2737: 0x000c, 0x2738: 0x000c, 0x2739: 0x000c, 0x273a: 0x000c, - // Block 0x9d, offset 0x2740 - 0x2740: 0x0001, 0x2741: 0x0001, 0x2742: 0x0001, 0x2743: 0x0001, 0x2744: 0x0001, 0x2745: 0x0001, - 0x2746: 0x0001, 0x2747: 0x0001, 0x2748: 0x0001, 0x2749: 0x0001, 0x274a: 0x0001, 0x274b: 0x0001, - 0x274c: 0x0001, 0x274d: 0x0001, 0x274e: 0x0001, 0x274f: 0x0001, 0x2750: 0x0001, 0x2751: 0x0001, - 0x2752: 0x0001, 0x2753: 0x0001, 0x2754: 0x0001, 0x2755: 0x0001, 0x2756: 0x0001, 0x2757: 0x0001, - 0x2758: 0x0001, 0x2759: 0x0001, 0x275a: 0x0001, 0x275b: 0x0001, 0x275c: 0x0001, 0x275d: 0x0001, - 0x275e: 0x0001, 0x275f: 0x0001, 0x2760: 0x0001, 0x2761: 0x0001, 0x2762: 0x0001, 0x2763: 0x0001, - 0x2764: 0x0001, 0x2765: 0x0001, 0x2766: 0x0001, 0x2767: 0x0001, 0x2768: 0x0001, 0x2769: 0x0001, - 0x276a: 0x0001, 0x276b: 0x0001, 0x276c: 0x0001, 0x276d: 0x0001, 0x276e: 0x0001, 0x276f: 0x0001, - 0x2770: 0x0001, 0x2771: 0x0001, 0x2772: 0x0001, 0x2773: 0x0001, 0x2774: 0x0001, 0x2775: 0x0001, - 0x2776: 0x0001, 0x2777: 0x0001, 0x2778: 0x0001, 0x2779: 0x0001, 0x277a: 0x0001, 0x277b: 0x0001, - 0x277c: 0x0001, 0x277d: 0x0001, 0x277e: 0x0001, 0x277f: 0x0001, - // Block 0x9e, offset 0x2780 - 0x2780: 0x0001, 0x2781: 0x0001, 0x2782: 0x0001, 0x2783: 0x0001, 0x2784: 0x0001, 0x2785: 0x0001, - 0x2786: 0x0001, 0x2787: 0x0001, 0x2788: 0x0001, 0x2789: 0x0001, 0x278a: 0x0001, 0x278b: 0x0001, - 0x278c: 0x0001, 0x278d: 0x0001, 0x278e: 0x0001, 0x278f: 0x0001, 0x2790: 0x0001, 0x2791: 0x0001, - 0x2792: 0x0001, 0x2793: 0x0001, 0x2794: 0x0001, 0x2795: 0x0001, 0x2796: 0x0001, 0x2797: 0x0001, - 0x2798: 0x0001, 0x2799: 0x0001, 0x279a: 0x0001, 0x279b: 0x0001, 0x279c: 0x0001, 0x279d: 0x0001, - 0x279e: 0x0001, 0x279f: 0x000a, 0x27a0: 0x0001, 0x27a1: 0x0001, 0x27a2: 0x0001, 0x27a3: 0x0001, - 0x27a4: 0x0001, 0x27a5: 0x0001, 0x27a6: 0x0001, 0x27a7: 0x0001, 0x27a8: 0x0001, 0x27a9: 0x0001, - 0x27aa: 0x0001, 0x27ab: 0x0001, 0x27ac: 0x0001, 0x27ad: 0x0001, 0x27ae: 0x0001, 0x27af: 0x0001, - 0x27b0: 0x0001, 0x27b1: 0x0001, 0x27b2: 0x0001, 0x27b3: 0x0001, 0x27b4: 0x0001, 0x27b5: 0x0001, - 0x27b6: 0x0001, 0x27b7: 0x0001, 0x27b8: 0x0001, 0x27b9: 0x0001, 0x27ba: 0x0001, 0x27bb: 0x0001, - 0x27bc: 0x0001, 0x27bd: 0x0001, 0x27be: 0x0001, 0x27bf: 0x0001, - // Block 0x9f, offset 0x27c0 - 0x27c0: 0x0001, 0x27c1: 0x000c, 0x27c2: 0x000c, 0x27c3: 0x000c, 0x27c4: 0x0001, 0x27c5: 0x000c, - 0x27c6: 0x000c, 0x27c7: 0x0001, 0x27c8: 0x0001, 0x27c9: 0x0001, 0x27ca: 0x0001, 0x27cb: 0x0001, - 0x27cc: 0x000c, 0x27cd: 0x000c, 0x27ce: 0x000c, 0x27cf: 0x000c, 0x27d0: 0x0001, 0x27d1: 0x0001, - 0x27d2: 0x0001, 0x27d3: 0x0001, 0x27d4: 0x0001, 0x27d5: 0x0001, 0x27d6: 0x0001, 0x27d7: 0x0001, - 0x27d8: 0x0001, 0x27d9: 0x0001, 0x27da: 0x0001, 0x27db: 0x0001, 0x27dc: 0x0001, 0x27dd: 0x0001, - 0x27de: 0x0001, 0x27df: 0x0001, 0x27e0: 0x0001, 0x27e1: 0x0001, 0x27e2: 0x0001, 0x27e3: 0x0001, - 0x27e4: 0x0001, 0x27e5: 0x0001, 0x27e6: 0x0001, 0x27e7: 0x0001, 0x27e8: 0x0001, 0x27e9: 0x0001, - 0x27ea: 0x0001, 0x27eb: 0x0001, 0x27ec: 0x0001, 0x27ed: 0x0001, 0x27ee: 0x0001, 0x27ef: 0x0001, - 0x27f0: 0x0001, 0x27f1: 0x0001, 0x27f2: 0x0001, 0x27f3: 0x0001, 0x27f4: 0x0001, 0x27f5: 0x0001, - 0x27f6: 0x0001, 0x27f7: 0x0001, 0x27f8: 0x000c, 0x27f9: 0x000c, 0x27fa: 0x000c, 0x27fb: 0x0001, - 0x27fc: 0x0001, 0x27fd: 0x0001, 0x27fe: 0x0001, 0x27ff: 0x000c, - // Block 0xa0, offset 0x2800 - 0x2800: 0x0001, 0x2801: 0x0001, 0x2802: 0x0001, 0x2803: 0x0001, 0x2804: 0x0001, 0x2805: 0x0001, - 0x2806: 0x0001, 0x2807: 0x0001, 0x2808: 0x0001, 0x2809: 0x0001, 0x280a: 0x0001, 0x280b: 0x0001, - 0x280c: 0x0001, 0x280d: 0x0001, 0x280e: 0x0001, 0x280f: 0x0001, 0x2810: 0x0001, 0x2811: 0x0001, - 0x2812: 0x0001, 0x2813: 0x0001, 0x2814: 0x0001, 0x2815: 0x0001, 0x2816: 0x0001, 0x2817: 0x0001, - 0x2818: 0x0001, 0x2819: 0x0001, 0x281a: 0x0001, 0x281b: 0x0001, 0x281c: 0x0001, 0x281d: 0x0001, - 0x281e: 0x0001, 0x281f: 0x0001, 0x2820: 0x0001, 0x2821: 0x0001, 0x2822: 0x0001, 0x2823: 0x0001, - 0x2824: 0x0001, 0x2825: 0x000c, 0x2826: 0x000c, 0x2827: 0x0001, 0x2828: 0x0001, 0x2829: 0x0001, - 0x282a: 0x0001, 0x282b: 0x0001, 0x282c: 0x0001, 0x282d: 0x0001, 0x282e: 0x0001, 0x282f: 0x0001, - 0x2830: 0x0001, 0x2831: 0x0001, 0x2832: 0x0001, 0x2833: 0x0001, 0x2834: 0x0001, 0x2835: 0x0001, - 0x2836: 0x0001, 0x2837: 0x0001, 0x2838: 0x0001, 0x2839: 0x0001, 0x283a: 0x0001, 0x283b: 0x0001, - 0x283c: 0x0001, 0x283d: 0x0001, 0x283e: 0x0001, 0x283f: 0x0001, - // Block 0xa1, offset 0x2840 - 0x2840: 0x0001, 0x2841: 0x0001, 0x2842: 0x0001, 0x2843: 0x0001, 0x2844: 0x0001, 0x2845: 0x0001, - 0x2846: 0x0001, 0x2847: 0x0001, 0x2848: 0x0001, 0x2849: 0x0001, 0x284a: 0x0001, 0x284b: 0x0001, - 0x284c: 0x0001, 0x284d: 0x0001, 0x284e: 0x0001, 0x284f: 0x0001, 0x2850: 0x0001, 0x2851: 0x0001, - 0x2852: 0x0001, 0x2853: 0x0001, 0x2854: 0x0001, 0x2855: 0x0001, 0x2856: 0x0001, 0x2857: 0x0001, - 0x2858: 0x0001, 0x2859: 0x0001, 0x285a: 0x0001, 0x285b: 0x0001, 0x285c: 0x0001, 0x285d: 0x0001, - 0x285e: 0x0001, 0x285f: 0x0001, 0x2860: 0x0001, 0x2861: 0x0001, 0x2862: 0x0001, 0x2863: 0x0001, - 0x2864: 0x0001, 0x2865: 0x0001, 0x2866: 0x0001, 0x2867: 0x0001, 0x2868: 0x0001, 0x2869: 0x0001, - 0x286a: 0x0001, 0x286b: 0x0001, 0x286c: 0x0001, 0x286d: 0x0001, 0x286e: 0x0001, 0x286f: 0x0001, - 0x2870: 0x0001, 0x2871: 0x0001, 0x2872: 0x0001, 0x2873: 0x0001, 0x2874: 0x0001, 0x2875: 0x0001, - 0x2876: 0x0001, 0x2877: 0x0001, 0x2878: 0x0001, 0x2879: 0x000a, 0x287a: 0x000a, 0x287b: 0x000a, - 0x287c: 0x000a, 0x287d: 0x000a, 0x287e: 0x000a, 0x287f: 0x000a, - // Block 0xa2, offset 0x2880 - 0x2880: 0x0001, 0x2881: 0x0001, 0x2882: 0x0001, 0x2883: 0x0001, 0x2884: 0x0001, 0x2885: 0x0001, - 0x2886: 0x0001, 0x2887: 0x0001, 0x2888: 0x0001, 0x2889: 0x0001, 0x288a: 0x0001, 0x288b: 0x0001, - 0x288c: 0x0001, 0x288d: 0x0001, 0x288e: 0x0001, 0x288f: 0x0001, 0x2890: 0x0001, 0x2891: 0x0001, - 0x2892: 0x0001, 0x2893: 0x0001, 0x2894: 0x0001, 0x2895: 0x0001, 0x2896: 0x0001, 0x2897: 0x0001, - 0x2898: 0x0001, 0x2899: 0x0001, 0x289a: 0x0001, 0x289b: 0x0001, 0x289c: 0x0001, 0x289d: 0x0001, - 0x289e: 0x0001, 0x289f: 0x0001, 0x28a0: 0x0005, 0x28a1: 0x0005, 0x28a2: 0x0005, 0x28a3: 0x0005, - 0x28a4: 0x0005, 0x28a5: 0x0005, 0x28a6: 0x0005, 0x28a7: 0x0005, 0x28a8: 0x0005, 0x28a9: 0x0005, - 0x28aa: 0x0005, 0x28ab: 0x0005, 0x28ac: 0x0005, 0x28ad: 0x0005, 0x28ae: 0x0005, 0x28af: 0x0005, - 0x28b0: 0x0005, 0x28b1: 0x0005, 0x28b2: 0x0005, 0x28b3: 0x0005, 0x28b4: 0x0005, 0x28b5: 0x0005, - 0x28b6: 0x0005, 0x28b7: 0x0005, 0x28b8: 0x0005, 0x28b9: 0x0005, 0x28ba: 0x0005, 0x28bb: 0x0005, - 0x28bc: 0x0005, 0x28bd: 0x0005, 0x28be: 0x0005, 0x28bf: 0x0001, - // Block 0xa3, offset 0x28c0 - 0x28c1: 0x000c, - 0x28f8: 0x000c, 0x28f9: 0x000c, 0x28fa: 0x000c, 0x28fb: 0x000c, - 0x28fc: 0x000c, 0x28fd: 0x000c, 0x28fe: 0x000c, 0x28ff: 0x000c, - // Block 0xa4, offset 0x2900 - 0x2900: 0x000c, 0x2901: 0x000c, 0x2902: 0x000c, 0x2903: 0x000c, 0x2904: 0x000c, 0x2905: 0x000c, - 0x2906: 0x000c, - 0x2912: 0x000a, 0x2913: 0x000a, 0x2914: 0x000a, 0x2915: 0x000a, 0x2916: 0x000a, 0x2917: 0x000a, - 0x2918: 0x000a, 0x2919: 0x000a, 0x291a: 0x000a, 0x291b: 0x000a, 0x291c: 0x000a, 0x291d: 0x000a, - 0x291e: 0x000a, 0x291f: 0x000a, 0x2920: 0x000a, 0x2921: 0x000a, 0x2922: 0x000a, 0x2923: 0x000a, - 0x2924: 0x000a, 0x2925: 0x000a, - 0x293f: 0x000c, - // Block 0xa5, offset 0x2940 - 0x2940: 0x000c, 0x2941: 0x000c, - 0x2973: 0x000c, 0x2974: 0x000c, 0x2975: 0x000c, - 0x2976: 0x000c, 0x2979: 0x000c, 0x297a: 0x000c, - // Block 0xa6, offset 0x2980 - 0x2980: 0x000c, 0x2981: 0x000c, 0x2982: 0x000c, - 0x29a7: 0x000c, 0x29a8: 0x000c, 0x29a9: 0x000c, - 0x29aa: 0x000c, 0x29ab: 0x000c, 0x29ad: 0x000c, 0x29ae: 0x000c, 0x29af: 0x000c, - 0x29b0: 0x000c, 0x29b1: 0x000c, 0x29b2: 0x000c, 0x29b3: 0x000c, 0x29b4: 0x000c, - // Block 0xa7, offset 0x29c0 - 0x29f3: 0x000c, - // Block 0xa8, offset 0x2a00 - 0x2a00: 0x000c, 0x2a01: 0x000c, - 0x2a36: 0x000c, 0x2a37: 0x000c, 0x2a38: 0x000c, 0x2a39: 0x000c, 0x2a3a: 0x000c, 0x2a3b: 0x000c, - 0x2a3c: 0x000c, 0x2a3d: 0x000c, 0x2a3e: 0x000c, - // Block 0xa9, offset 0x2a40 - 0x2a4a: 0x000c, 0x2a4b: 0x000c, - 0x2a4c: 0x000c, - // Block 0xaa, offset 0x2a80 - 0x2aaf: 0x000c, - 0x2ab0: 0x000c, 0x2ab1: 0x000c, 0x2ab4: 0x000c, - 0x2ab6: 0x000c, 0x2ab7: 0x000c, - 0x2abe: 0x000c, - // Block 0xab, offset 0x2ac0 - 0x2adf: 0x000c, 0x2ae3: 0x000c, - 0x2ae4: 0x000c, 0x2ae5: 0x000c, 0x2ae6: 0x000c, 0x2ae7: 0x000c, 0x2ae8: 0x000c, 0x2ae9: 0x000c, - 0x2aea: 0x000c, - // Block 0xac, offset 0x2b00 - 0x2b00: 0x000c, 0x2b01: 0x000c, - 0x2b3c: 0x000c, - // Block 0xad, offset 0x2b40 - 0x2b40: 0x000c, - 0x2b66: 0x000c, 0x2b67: 0x000c, 0x2b68: 0x000c, 0x2b69: 0x000c, - 0x2b6a: 0x000c, 0x2b6b: 0x000c, 0x2b6c: 0x000c, - 0x2b70: 0x000c, 0x2b71: 0x000c, 0x2b72: 0x000c, 0x2b73: 0x000c, 0x2b74: 0x000c, - // Block 0xae, offset 0x2b80 - 0x2bb8: 0x000c, 0x2bb9: 0x000c, 0x2bba: 0x000c, 0x2bbb: 0x000c, - 0x2bbc: 0x000c, 0x2bbd: 0x000c, 0x2bbe: 0x000c, 0x2bbf: 0x000c, - // Block 0xaf, offset 0x2bc0 - 0x2bc2: 0x000c, 0x2bc3: 0x000c, 0x2bc4: 0x000c, - 0x2bc6: 0x000c, - // Block 0xb0, offset 0x2c00 - 0x2c33: 0x000c, 0x2c34: 0x000c, 0x2c35: 0x000c, - 0x2c36: 0x000c, 0x2c37: 0x000c, 0x2c38: 0x000c, 0x2c3a: 0x000c, - 0x2c3f: 0x000c, - // Block 0xb1, offset 0x2c40 - 0x2c40: 0x000c, 0x2c42: 0x000c, 0x2c43: 0x000c, - // Block 0xb2, offset 0x2c80 - 0x2cb2: 0x000c, 0x2cb3: 0x000c, 0x2cb4: 0x000c, 0x2cb5: 0x000c, - 0x2cbc: 0x000c, 0x2cbd: 0x000c, 0x2cbf: 0x000c, - // Block 0xb3, offset 0x2cc0 - 0x2cc0: 0x000c, - 0x2cdc: 0x000c, 0x2cdd: 0x000c, - // Block 0xb4, offset 0x2d00 - 0x2d33: 0x000c, 0x2d34: 0x000c, 0x2d35: 0x000c, - 0x2d36: 0x000c, 0x2d37: 0x000c, 0x2d38: 0x000c, 0x2d39: 0x000c, 0x2d3a: 0x000c, - 0x2d3d: 0x000c, 0x2d3f: 0x000c, - // Block 0xb5, offset 0x2d40 - 0x2d40: 0x000c, - 0x2d60: 0x000a, 0x2d61: 0x000a, 0x2d62: 0x000a, 0x2d63: 0x000a, - 0x2d64: 0x000a, 0x2d65: 0x000a, 0x2d66: 0x000a, 0x2d67: 0x000a, 0x2d68: 0x000a, 0x2d69: 0x000a, - 0x2d6a: 0x000a, 0x2d6b: 0x000a, 0x2d6c: 0x000a, - // Block 0xb6, offset 0x2d80 - 0x2dab: 0x000c, 0x2dad: 0x000c, - 0x2db0: 0x000c, 0x2db1: 0x000c, 0x2db2: 0x000c, 0x2db3: 0x000c, 0x2db4: 0x000c, 0x2db5: 0x000c, - 0x2db7: 0x000c, - // Block 0xb7, offset 0x2dc0 - 0x2ddd: 0x000c, - 0x2dde: 0x000c, 0x2ddf: 0x000c, 0x2de2: 0x000c, 0x2de3: 0x000c, - 0x2de4: 0x000c, 0x2de5: 0x000c, 0x2de7: 0x000c, 0x2de8: 0x000c, 0x2de9: 0x000c, - 0x2dea: 0x000c, 0x2deb: 0x000c, - // Block 0xb8, offset 0x2e00 - 0x2e30: 0x000c, 0x2e31: 0x000c, 0x2e32: 0x000c, 0x2e33: 0x000c, 0x2e34: 0x000c, 0x2e35: 0x000c, - 0x2e36: 0x000c, 0x2e38: 0x000c, 0x2e39: 0x000c, 0x2e3a: 0x000c, 0x2e3b: 0x000c, - 0x2e3c: 0x000c, 0x2e3d: 0x000c, - // Block 0xb9, offset 0x2e40 - 0x2e52: 0x000c, 0x2e53: 0x000c, 0x2e54: 0x000c, 0x2e55: 0x000c, 0x2e56: 0x000c, 0x2e57: 0x000c, - 0x2e58: 0x000c, 0x2e59: 0x000c, 0x2e5a: 0x000c, 0x2e5b: 0x000c, 0x2e5c: 0x000c, 0x2e5d: 0x000c, - 0x2e5e: 0x000c, 0x2e5f: 0x000c, 0x2e60: 0x000c, 0x2e61: 0x000c, 0x2e62: 0x000c, 0x2e63: 0x000c, - 0x2e64: 0x000c, 0x2e65: 0x000c, 0x2e66: 0x000c, 0x2e67: 0x000c, - 0x2e6a: 0x000c, 0x2e6b: 0x000c, 0x2e6c: 0x000c, 0x2e6d: 0x000c, 0x2e6e: 0x000c, 0x2e6f: 0x000c, - 0x2e70: 0x000c, 0x2e72: 0x000c, 0x2e73: 0x000c, 0x2e75: 0x000c, - 0x2e76: 0x000c, - // Block 0xba, offset 0x2e80 - 0x2eb0: 0x000c, 0x2eb1: 0x000c, 0x2eb2: 0x000c, 0x2eb3: 0x000c, 0x2eb4: 0x000c, - // Block 0xbb, offset 0x2ec0 - 0x2ef0: 0x000c, 0x2ef1: 0x000c, 0x2ef2: 0x000c, 0x2ef3: 0x000c, 0x2ef4: 0x000c, 0x2ef5: 0x000c, - 0x2ef6: 0x000c, - // Block 0xbc, offset 0x2f00 - 0x2f0f: 0x000c, 0x2f10: 0x000c, 0x2f11: 0x000c, - 0x2f12: 0x000c, - // Block 0xbd, offset 0x2f40 - 0x2f5d: 0x000c, - 0x2f5e: 0x000c, 0x2f60: 0x000b, 0x2f61: 0x000b, 0x2f62: 0x000b, 0x2f63: 0x000b, - // Block 0xbe, offset 0x2f80 - 0x2fa7: 0x000c, 0x2fa8: 0x000c, 0x2fa9: 0x000c, - 0x2fb3: 0x000b, 0x2fb4: 0x000b, 0x2fb5: 0x000b, - 0x2fb6: 0x000b, 0x2fb7: 0x000b, 0x2fb8: 0x000b, 0x2fb9: 0x000b, 0x2fba: 0x000b, 0x2fbb: 0x000c, - 0x2fbc: 0x000c, 0x2fbd: 0x000c, 0x2fbe: 0x000c, 0x2fbf: 0x000c, - // Block 0xbf, offset 0x2fc0 - 0x2fc0: 0x000c, 0x2fc1: 0x000c, 0x2fc2: 0x000c, 0x2fc5: 0x000c, - 0x2fc6: 0x000c, 0x2fc7: 0x000c, 0x2fc8: 0x000c, 0x2fc9: 0x000c, 0x2fca: 0x000c, 0x2fcb: 0x000c, - 0x2fea: 0x000c, 0x2feb: 0x000c, 0x2fec: 0x000c, 0x2fed: 0x000c, - // Block 0xc0, offset 0x3000 - 0x3000: 0x000a, 0x3001: 0x000a, 0x3002: 0x000c, 0x3003: 0x000c, 0x3004: 0x000c, 0x3005: 0x000a, - // Block 0xc1, offset 0x3040 - 0x3040: 0x000a, 0x3041: 0x000a, 0x3042: 0x000a, 0x3043: 0x000a, 0x3044: 0x000a, 0x3045: 0x000a, - 0x3046: 0x000a, 0x3047: 0x000a, 0x3048: 0x000a, 0x3049: 0x000a, 0x304a: 0x000a, 0x304b: 0x000a, - 0x304c: 0x000a, 0x304d: 0x000a, 0x304e: 0x000a, 0x304f: 0x000a, 0x3050: 0x000a, 0x3051: 0x000a, - 0x3052: 0x000a, 0x3053: 0x000a, 0x3054: 0x000a, 0x3055: 0x000a, 0x3056: 0x000a, - // Block 0xc2, offset 0x3080 - 0x309b: 0x000a, - // Block 0xc3, offset 0x30c0 - 0x30d5: 0x000a, - // Block 0xc4, offset 0x3100 - 0x310f: 0x000a, - // Block 0xc5, offset 0x3140 - 0x3149: 0x000a, - // Block 0xc6, offset 0x3180 - 0x3183: 0x000a, - 0x318e: 0x0002, 0x318f: 0x0002, 0x3190: 0x0002, 0x3191: 0x0002, - 0x3192: 0x0002, 0x3193: 0x0002, 0x3194: 0x0002, 0x3195: 0x0002, 0x3196: 0x0002, 0x3197: 0x0002, - 0x3198: 0x0002, 0x3199: 0x0002, 0x319a: 0x0002, 0x319b: 0x0002, 0x319c: 0x0002, 0x319d: 0x0002, - 0x319e: 0x0002, 0x319f: 0x0002, 0x31a0: 0x0002, 0x31a1: 0x0002, 0x31a2: 0x0002, 0x31a3: 0x0002, - 0x31a4: 0x0002, 0x31a5: 0x0002, 0x31a6: 0x0002, 0x31a7: 0x0002, 0x31a8: 0x0002, 0x31a9: 0x0002, - 0x31aa: 0x0002, 0x31ab: 0x0002, 0x31ac: 0x0002, 0x31ad: 0x0002, 0x31ae: 0x0002, 0x31af: 0x0002, - 0x31b0: 0x0002, 0x31b1: 0x0002, 0x31b2: 0x0002, 0x31b3: 0x0002, 0x31b4: 0x0002, 0x31b5: 0x0002, - 0x31b6: 0x0002, 0x31b7: 0x0002, 0x31b8: 0x0002, 0x31b9: 0x0002, 0x31ba: 0x0002, 0x31bb: 0x0002, - 0x31bc: 0x0002, 0x31bd: 0x0002, 0x31be: 0x0002, 0x31bf: 0x0002, - // Block 0xc7, offset 0x31c0 - 0x31c0: 0x000c, 0x31c1: 0x000c, 0x31c2: 0x000c, 0x31c3: 0x000c, 0x31c4: 0x000c, 0x31c5: 0x000c, - 0x31c6: 0x000c, 0x31c7: 0x000c, 0x31c8: 0x000c, 0x31c9: 0x000c, 0x31ca: 0x000c, 0x31cb: 0x000c, - 0x31cc: 0x000c, 0x31cd: 0x000c, 0x31ce: 0x000c, 0x31cf: 0x000c, 0x31d0: 0x000c, 0x31d1: 0x000c, - 0x31d2: 0x000c, 0x31d3: 0x000c, 0x31d4: 0x000c, 0x31d5: 0x000c, 0x31d6: 0x000c, 0x31d7: 0x000c, - 0x31d8: 0x000c, 0x31d9: 0x000c, 0x31da: 0x000c, 0x31db: 0x000c, 0x31dc: 0x000c, 0x31dd: 0x000c, - 0x31de: 0x000c, 0x31df: 0x000c, 0x31e0: 0x000c, 0x31e1: 0x000c, 0x31e2: 0x000c, 0x31e3: 0x000c, - 0x31e4: 0x000c, 0x31e5: 0x000c, 0x31e6: 0x000c, 0x31e7: 0x000c, 0x31e8: 0x000c, 0x31e9: 0x000c, - 0x31ea: 0x000c, 0x31eb: 0x000c, 0x31ec: 0x000c, 0x31ed: 0x000c, 0x31ee: 0x000c, 0x31ef: 0x000c, - 0x31f0: 0x000c, 0x31f1: 0x000c, 0x31f2: 0x000c, 0x31f3: 0x000c, 0x31f4: 0x000c, 0x31f5: 0x000c, - 0x31f6: 0x000c, 0x31fb: 0x000c, - 0x31fc: 0x000c, 0x31fd: 0x000c, 0x31fe: 0x000c, 0x31ff: 0x000c, - // Block 0xc8, offset 0x3200 - 0x3200: 0x000c, 0x3201: 0x000c, 0x3202: 0x000c, 0x3203: 0x000c, 0x3204: 0x000c, 0x3205: 0x000c, - 0x3206: 0x000c, 0x3207: 0x000c, 0x3208: 0x000c, 0x3209: 0x000c, 0x320a: 0x000c, 0x320b: 0x000c, - 0x320c: 0x000c, 0x320d: 0x000c, 0x320e: 0x000c, 0x320f: 0x000c, 0x3210: 0x000c, 0x3211: 0x000c, - 0x3212: 0x000c, 0x3213: 0x000c, 0x3214: 0x000c, 0x3215: 0x000c, 0x3216: 0x000c, 0x3217: 0x000c, - 0x3218: 0x000c, 0x3219: 0x000c, 0x321a: 0x000c, 0x321b: 0x000c, 0x321c: 0x000c, 0x321d: 0x000c, - 0x321e: 0x000c, 0x321f: 0x000c, 0x3220: 0x000c, 0x3221: 0x000c, 0x3222: 0x000c, 0x3223: 0x000c, - 0x3224: 0x000c, 0x3225: 0x000c, 0x3226: 0x000c, 0x3227: 0x000c, 0x3228: 0x000c, 0x3229: 0x000c, - 0x322a: 0x000c, 0x322b: 0x000c, 0x322c: 0x000c, - 0x3235: 0x000c, - // Block 0xc9, offset 0x3240 - 0x3244: 0x000c, - 0x325b: 0x000c, 0x325c: 0x000c, 0x325d: 0x000c, - 0x325e: 0x000c, 0x325f: 0x000c, 0x3261: 0x000c, 0x3262: 0x000c, 0x3263: 0x000c, - 0x3264: 0x000c, 0x3265: 0x000c, 0x3266: 0x000c, 0x3267: 0x000c, 0x3268: 0x000c, 0x3269: 0x000c, - 0x326a: 0x000c, 0x326b: 0x000c, 0x326c: 0x000c, 0x326d: 0x000c, 0x326e: 0x000c, 0x326f: 0x000c, - // Block 0xca, offset 0x3280 - 0x3280: 0x000c, 0x3281: 0x000c, 0x3282: 0x000c, 0x3283: 0x000c, 0x3284: 0x000c, 0x3285: 0x000c, - 0x3286: 0x000c, 0x3288: 0x000c, 0x3289: 0x000c, 0x328a: 0x000c, 0x328b: 0x000c, - 0x328c: 0x000c, 0x328d: 0x000c, 0x328e: 0x000c, 0x328f: 0x000c, 0x3290: 0x000c, 0x3291: 0x000c, - 0x3292: 0x000c, 0x3293: 0x000c, 0x3294: 0x000c, 0x3295: 0x000c, 0x3296: 0x000c, 0x3297: 0x000c, - 0x3298: 0x000c, 0x329b: 0x000c, 0x329c: 0x000c, 0x329d: 0x000c, - 0x329e: 0x000c, 0x329f: 0x000c, 0x32a0: 0x000c, 0x32a1: 0x000c, 0x32a3: 0x000c, - 0x32a4: 0x000c, 0x32a6: 0x000c, 0x32a7: 0x000c, 0x32a8: 0x000c, 0x32a9: 0x000c, - 0x32aa: 0x000c, - // Block 0xcb, offset 0x32c0 - 0x32c0: 0x0001, 0x32c1: 0x0001, 0x32c2: 0x0001, 0x32c3: 0x0001, 0x32c4: 0x0001, 0x32c5: 0x0001, - 0x32c6: 0x0001, 0x32c7: 0x0001, 0x32c8: 0x0001, 0x32c9: 0x0001, 0x32ca: 0x0001, 0x32cb: 0x0001, - 0x32cc: 0x0001, 0x32cd: 0x0001, 0x32ce: 0x0001, 0x32cf: 0x0001, 0x32d0: 0x000c, 0x32d1: 0x000c, - 0x32d2: 0x000c, 0x32d3: 0x000c, 0x32d4: 0x000c, 0x32d5: 0x000c, 0x32d6: 0x000c, 0x32d7: 0x0001, - 0x32d8: 0x0001, 0x32d9: 0x0001, 0x32da: 0x0001, 0x32db: 0x0001, 0x32dc: 0x0001, 0x32dd: 0x0001, - 0x32de: 0x0001, 0x32df: 0x0001, 0x32e0: 0x0001, 0x32e1: 0x0001, 0x32e2: 0x0001, 0x32e3: 0x0001, - 0x32e4: 0x0001, 0x32e5: 0x0001, 0x32e6: 0x0001, 0x32e7: 0x0001, 0x32e8: 0x0001, 0x32e9: 0x0001, - 0x32ea: 0x0001, 0x32eb: 0x0001, 0x32ec: 0x0001, 0x32ed: 0x0001, 0x32ee: 0x0001, 0x32ef: 0x0001, - 0x32f0: 0x0001, 0x32f1: 0x0001, 0x32f2: 0x0001, 0x32f3: 0x0001, 0x32f4: 0x0001, 0x32f5: 0x0001, - 0x32f6: 0x0001, 0x32f7: 0x0001, 0x32f8: 0x0001, 0x32f9: 0x0001, 0x32fa: 0x0001, 0x32fb: 0x0001, - 0x32fc: 0x0001, 0x32fd: 0x0001, 0x32fe: 0x0001, 0x32ff: 0x0001, - // Block 0xcc, offset 0x3300 - 0x3300: 0x0001, 0x3301: 0x0001, 0x3302: 0x0001, 0x3303: 0x0001, 0x3304: 0x000c, 0x3305: 0x000c, - 0x3306: 0x000c, 0x3307: 0x000c, 0x3308: 0x000c, 0x3309: 0x000c, 0x330a: 0x000c, 0x330b: 0x0001, - 0x330c: 0x0001, 0x330d: 0x0001, 0x330e: 0x0001, 0x330f: 0x0001, 0x3310: 0x0001, 0x3311: 0x0001, - 0x3312: 0x0001, 0x3313: 0x0001, 0x3314: 0x0001, 0x3315: 0x0001, 0x3316: 0x0001, 0x3317: 0x0001, - 0x3318: 0x0001, 0x3319: 0x0001, 0x331a: 0x0001, 0x331b: 0x0001, 0x331c: 0x0001, 0x331d: 0x0001, - 0x331e: 0x0001, 0x331f: 0x0001, 0x3320: 0x0001, 0x3321: 0x0001, 0x3322: 0x0001, 0x3323: 0x0001, - 0x3324: 0x0001, 0x3325: 0x0001, 0x3326: 0x0001, 0x3327: 0x0001, 0x3328: 0x0001, 0x3329: 0x0001, - 0x332a: 0x0001, 0x332b: 0x0001, 0x332c: 0x0001, 0x332d: 0x0001, 0x332e: 0x0001, 0x332f: 0x0001, - 0x3330: 0x0001, 0x3331: 0x0001, 0x3332: 0x0001, 0x3333: 0x0001, 0x3334: 0x0001, 0x3335: 0x0001, - 0x3336: 0x0001, 0x3337: 0x0001, 0x3338: 0x0001, 0x3339: 0x0001, 0x333a: 0x0001, 0x333b: 0x0001, - 0x333c: 0x0001, 0x333d: 0x0001, 0x333e: 0x0001, 0x333f: 0x0001, - // Block 0xcd, offset 0x3340 - 0x3340: 0x000d, 0x3341: 0x000d, 0x3342: 0x000d, 0x3343: 0x000d, 0x3344: 0x000d, 0x3345: 0x000d, - 0x3346: 0x000d, 0x3347: 0x000d, 0x3348: 0x000d, 0x3349: 0x000d, 0x334a: 0x000d, 0x334b: 0x000d, - 0x334c: 0x000d, 0x334d: 0x000d, 0x334e: 0x000d, 0x334f: 0x000d, 0x3350: 0x000d, 0x3351: 0x000d, - 0x3352: 0x000d, 0x3353: 0x000d, 0x3354: 0x000d, 0x3355: 0x000d, 0x3356: 0x000d, 0x3357: 0x000d, - 0x3358: 0x000d, 0x3359: 0x000d, 0x335a: 0x000d, 0x335b: 0x000d, 0x335c: 0x000d, 0x335d: 0x000d, - 0x335e: 0x000d, 0x335f: 0x000d, 0x3360: 0x000d, 0x3361: 0x000d, 0x3362: 0x000d, 0x3363: 0x000d, - 0x3364: 0x000d, 0x3365: 0x000d, 0x3366: 0x000d, 0x3367: 0x000d, 0x3368: 0x000d, 0x3369: 0x000d, - 0x336a: 0x000d, 0x336b: 0x000d, 0x336c: 0x000d, 0x336d: 0x000d, 0x336e: 0x000d, 0x336f: 0x000d, - 0x3370: 0x000a, 0x3371: 0x000a, 0x3372: 0x000d, 0x3373: 0x000d, 0x3374: 0x000d, 0x3375: 0x000d, - 0x3376: 0x000d, 0x3377: 0x000d, 0x3378: 0x000d, 0x3379: 0x000d, 0x337a: 0x000d, 0x337b: 0x000d, - 0x337c: 0x000d, 0x337d: 0x000d, 0x337e: 0x000d, 0x337f: 0x000d, - // Block 0xce, offset 0x3380 - 0x3380: 0x000a, 0x3381: 0x000a, 0x3382: 0x000a, 0x3383: 0x000a, 0x3384: 0x000a, 0x3385: 0x000a, - 0x3386: 0x000a, 0x3387: 0x000a, 0x3388: 0x000a, 0x3389: 0x000a, 0x338a: 0x000a, 0x338b: 0x000a, - 0x338c: 0x000a, 0x338d: 0x000a, 0x338e: 0x000a, 0x338f: 0x000a, 0x3390: 0x000a, 0x3391: 0x000a, - 0x3392: 0x000a, 0x3393: 0x000a, 0x3394: 0x000a, 0x3395: 0x000a, 0x3396: 0x000a, 0x3397: 0x000a, - 0x3398: 0x000a, 0x3399: 0x000a, 0x339a: 0x000a, 0x339b: 0x000a, 0x339c: 0x000a, 0x339d: 0x000a, - 0x339e: 0x000a, 0x339f: 0x000a, 0x33a0: 0x000a, 0x33a1: 0x000a, 0x33a2: 0x000a, 0x33a3: 0x000a, - 0x33a4: 0x000a, 0x33a5: 0x000a, 0x33a6: 0x000a, 0x33a7: 0x000a, 0x33a8: 0x000a, 0x33a9: 0x000a, - 0x33aa: 0x000a, 0x33ab: 0x000a, - 0x33b0: 0x000a, 0x33b1: 0x000a, 0x33b2: 0x000a, 0x33b3: 0x000a, 0x33b4: 0x000a, 0x33b5: 0x000a, - 0x33b6: 0x000a, 0x33b7: 0x000a, 0x33b8: 0x000a, 0x33b9: 0x000a, 0x33ba: 0x000a, 0x33bb: 0x000a, - 0x33bc: 0x000a, 0x33bd: 0x000a, 0x33be: 0x000a, 0x33bf: 0x000a, - // Block 0xcf, offset 0x33c0 - 0x33c0: 0x000a, 0x33c1: 0x000a, 0x33c2: 0x000a, 0x33c3: 0x000a, 0x33c4: 0x000a, 0x33c5: 0x000a, - 0x33c6: 0x000a, 0x33c7: 0x000a, 0x33c8: 0x000a, 0x33c9: 0x000a, 0x33ca: 0x000a, 0x33cb: 0x000a, - 0x33cc: 0x000a, 0x33cd: 0x000a, 0x33ce: 0x000a, 0x33cf: 0x000a, 0x33d0: 0x000a, 0x33d1: 0x000a, - 0x33d2: 0x000a, 0x33d3: 0x000a, - 0x33e0: 0x000a, 0x33e1: 0x000a, 0x33e2: 0x000a, 0x33e3: 0x000a, - 0x33e4: 0x000a, 0x33e5: 0x000a, 0x33e6: 0x000a, 0x33e7: 0x000a, 0x33e8: 0x000a, 0x33e9: 0x000a, - 0x33ea: 0x000a, 0x33eb: 0x000a, 0x33ec: 0x000a, 0x33ed: 0x000a, 0x33ee: 0x000a, - 0x33f1: 0x000a, 0x33f2: 0x000a, 0x33f3: 0x000a, 0x33f4: 0x000a, 0x33f5: 0x000a, - 0x33f6: 0x000a, 0x33f7: 0x000a, 0x33f8: 0x000a, 0x33f9: 0x000a, 0x33fa: 0x000a, 0x33fb: 0x000a, - 0x33fc: 0x000a, 0x33fd: 0x000a, 0x33fe: 0x000a, 0x33ff: 0x000a, - // Block 0xd0, offset 0x3400 - 0x3401: 0x000a, 0x3402: 0x000a, 0x3403: 0x000a, 0x3404: 0x000a, 0x3405: 0x000a, - 0x3406: 0x000a, 0x3407: 0x000a, 0x3408: 0x000a, 0x3409: 0x000a, 0x340a: 0x000a, 0x340b: 0x000a, - 0x340c: 0x000a, 0x340d: 0x000a, 0x340e: 0x000a, 0x340f: 0x000a, 0x3411: 0x000a, - 0x3412: 0x000a, 0x3413: 0x000a, 0x3414: 0x000a, 0x3415: 0x000a, 0x3416: 0x000a, 0x3417: 0x000a, - 0x3418: 0x000a, 0x3419: 0x000a, 0x341a: 0x000a, 0x341b: 0x000a, 0x341c: 0x000a, 0x341d: 0x000a, - 0x341e: 0x000a, 0x341f: 0x000a, 0x3420: 0x000a, 0x3421: 0x000a, 0x3422: 0x000a, 0x3423: 0x000a, - 0x3424: 0x000a, 0x3425: 0x000a, 0x3426: 0x000a, 0x3427: 0x000a, 0x3428: 0x000a, 0x3429: 0x000a, - 0x342a: 0x000a, 0x342b: 0x000a, 0x342c: 0x000a, 0x342d: 0x000a, 0x342e: 0x000a, 0x342f: 0x000a, - 0x3430: 0x000a, 0x3431: 0x000a, 0x3432: 0x000a, 0x3433: 0x000a, 0x3434: 0x000a, 0x3435: 0x000a, - // Block 0xd1, offset 0x3440 - 0x3440: 0x0002, 0x3441: 0x0002, 0x3442: 0x0002, 0x3443: 0x0002, 0x3444: 0x0002, 0x3445: 0x0002, - 0x3446: 0x0002, 0x3447: 0x0002, 0x3448: 0x0002, 0x3449: 0x0002, 0x344a: 0x0002, 0x344b: 0x000a, - 0x344c: 0x000a, - // Block 0xd2, offset 0x3480 - 0x34aa: 0x000a, 0x34ab: 0x000a, - // Block 0xd3, offset 0x34c0 - 0x34c0: 0x000a, 0x34c1: 0x000a, 0x34c2: 0x000a, 0x34c3: 0x000a, 0x34c4: 0x000a, 0x34c5: 0x000a, - 0x34c6: 0x000a, 0x34c7: 0x000a, 0x34c8: 0x000a, 0x34c9: 0x000a, 0x34ca: 0x000a, 0x34cb: 0x000a, - 0x34cc: 0x000a, 0x34cd: 0x000a, 0x34ce: 0x000a, 0x34cf: 0x000a, 0x34d0: 0x000a, 0x34d1: 0x000a, - 0x34d2: 0x000a, - 0x34e0: 0x000a, 0x34e1: 0x000a, 0x34e2: 0x000a, 0x34e3: 0x000a, - 0x34e4: 0x000a, 0x34e5: 0x000a, 0x34e6: 0x000a, 0x34e7: 0x000a, 0x34e8: 0x000a, 0x34e9: 0x000a, - 0x34ea: 0x000a, 0x34eb: 0x000a, 0x34ec: 0x000a, - 0x34f0: 0x000a, 0x34f1: 0x000a, 0x34f2: 0x000a, 0x34f3: 0x000a, 0x34f4: 0x000a, 0x34f5: 0x000a, - 0x34f6: 0x000a, - // Block 0xd4, offset 0x3500 - 0x3500: 0x000a, 0x3501: 0x000a, 0x3502: 0x000a, 0x3503: 0x000a, 0x3504: 0x000a, 0x3505: 0x000a, - 0x3506: 0x000a, 0x3507: 0x000a, 0x3508: 0x000a, 0x3509: 0x000a, 0x350a: 0x000a, 0x350b: 0x000a, - 0x350c: 0x000a, 0x350d: 0x000a, 0x350e: 0x000a, 0x350f: 0x000a, 0x3510: 0x000a, 0x3511: 0x000a, - 0x3512: 0x000a, 0x3513: 0x000a, 0x3514: 0x000a, - // Block 0xd5, offset 0x3540 - 0x3540: 0x000a, 0x3541: 0x000a, 0x3542: 0x000a, 0x3543: 0x000a, 0x3544: 0x000a, 0x3545: 0x000a, - 0x3546: 0x000a, 0x3547: 0x000a, 0x3548: 0x000a, 0x3549: 0x000a, 0x354a: 0x000a, 0x354b: 0x000a, - 0x3550: 0x000a, 0x3551: 0x000a, - 0x3552: 0x000a, 0x3553: 0x000a, 0x3554: 0x000a, 0x3555: 0x000a, 0x3556: 0x000a, 0x3557: 0x000a, - 0x3558: 0x000a, 0x3559: 0x000a, 0x355a: 0x000a, 0x355b: 0x000a, 0x355c: 0x000a, 0x355d: 0x000a, - 0x355e: 0x000a, 0x355f: 0x000a, 0x3560: 0x000a, 0x3561: 0x000a, 0x3562: 0x000a, 0x3563: 0x000a, - 0x3564: 0x000a, 0x3565: 0x000a, 0x3566: 0x000a, 0x3567: 0x000a, 0x3568: 0x000a, 0x3569: 0x000a, - 0x356a: 0x000a, 0x356b: 0x000a, 0x356c: 0x000a, 0x356d: 0x000a, 0x356e: 0x000a, 0x356f: 0x000a, - 0x3570: 0x000a, 0x3571: 0x000a, 0x3572: 0x000a, 0x3573: 0x000a, 0x3574: 0x000a, 0x3575: 0x000a, - 0x3576: 0x000a, 0x3577: 0x000a, 0x3578: 0x000a, 0x3579: 0x000a, 0x357a: 0x000a, 0x357b: 0x000a, - 0x357c: 0x000a, 0x357d: 0x000a, 0x357e: 0x000a, 0x357f: 0x000a, - // Block 0xd6, offset 0x3580 - 0x3580: 0x000a, 0x3581: 0x000a, 0x3582: 0x000a, 0x3583: 0x000a, 0x3584: 0x000a, 0x3585: 0x000a, - 0x3586: 0x000a, 0x3587: 0x000a, - 0x3590: 0x000a, 0x3591: 0x000a, - 0x3592: 0x000a, 0x3593: 0x000a, 0x3594: 0x000a, 0x3595: 0x000a, 0x3596: 0x000a, 0x3597: 0x000a, - 0x3598: 0x000a, 0x3599: 0x000a, - 0x35a0: 0x000a, 0x35a1: 0x000a, 0x35a2: 0x000a, 0x35a3: 0x000a, - 0x35a4: 0x000a, 0x35a5: 0x000a, 0x35a6: 0x000a, 0x35a7: 0x000a, 0x35a8: 0x000a, 0x35a9: 0x000a, - 0x35aa: 0x000a, 0x35ab: 0x000a, 0x35ac: 0x000a, 0x35ad: 0x000a, 0x35ae: 0x000a, 0x35af: 0x000a, - 0x35b0: 0x000a, 0x35b1: 0x000a, 0x35b2: 0x000a, 0x35b3: 0x000a, 0x35b4: 0x000a, 0x35b5: 0x000a, - 0x35b6: 0x000a, 0x35b7: 0x000a, 0x35b8: 0x000a, 0x35b9: 0x000a, 0x35ba: 0x000a, 0x35bb: 0x000a, - 0x35bc: 0x000a, 0x35bd: 0x000a, 0x35be: 0x000a, 0x35bf: 0x000a, - // Block 0xd7, offset 0x35c0 - 0x35c0: 0x000a, 0x35c1: 0x000a, 0x35c2: 0x000a, 0x35c3: 0x000a, 0x35c4: 0x000a, 0x35c5: 0x000a, - 0x35c6: 0x000a, 0x35c7: 0x000a, - 0x35d0: 0x000a, 0x35d1: 0x000a, - 0x35d2: 0x000a, 0x35d3: 0x000a, 0x35d4: 0x000a, 0x35d5: 0x000a, 0x35d6: 0x000a, 0x35d7: 0x000a, - 0x35d8: 0x000a, 0x35d9: 0x000a, 0x35da: 0x000a, 0x35db: 0x000a, 0x35dc: 0x000a, 0x35dd: 0x000a, - 0x35de: 0x000a, 0x35df: 0x000a, 0x35e0: 0x000a, 0x35e1: 0x000a, 0x35e2: 0x000a, 0x35e3: 0x000a, - 0x35e4: 0x000a, 0x35e5: 0x000a, 0x35e6: 0x000a, 0x35e7: 0x000a, 0x35e8: 0x000a, 0x35e9: 0x000a, - 0x35ea: 0x000a, 0x35eb: 0x000a, 0x35ec: 0x000a, 0x35ed: 0x000a, - // Block 0xd8, offset 0x3600 - 0x3610: 0x000a, 0x3611: 0x000a, - 0x3612: 0x000a, 0x3613: 0x000a, 0x3614: 0x000a, 0x3615: 0x000a, 0x3616: 0x000a, 0x3617: 0x000a, - 0x3618: 0x000a, 0x3619: 0x000a, 0x361a: 0x000a, 0x361b: 0x000a, 0x361c: 0x000a, 0x361d: 0x000a, - 0x361e: 0x000a, 0x3620: 0x000a, 0x3621: 0x000a, 0x3622: 0x000a, 0x3623: 0x000a, - 0x3624: 0x000a, 0x3625: 0x000a, 0x3626: 0x000a, 0x3627: 0x000a, - 0x3630: 0x000a, 0x3633: 0x000a, 0x3634: 0x000a, 0x3635: 0x000a, - 0x3636: 0x000a, 0x3637: 0x000a, 0x3638: 0x000a, 0x3639: 0x000a, 0x363a: 0x000a, 0x363b: 0x000a, - 0x363c: 0x000a, 0x363d: 0x000a, 0x363e: 0x000a, - // Block 0xd9, offset 0x3640 - 0x3640: 0x000a, 0x3641: 0x000a, 0x3642: 0x000a, 0x3643: 0x000a, 0x3644: 0x000a, 0x3645: 0x000a, - 0x3646: 0x000a, 0x3647: 0x000a, 0x3648: 0x000a, 0x3649: 0x000a, 0x364a: 0x000a, 0x364b: 0x000a, - 0x3650: 0x000a, 0x3651: 0x000a, - 0x3652: 0x000a, 0x3653: 0x000a, 0x3654: 0x000a, 0x3655: 0x000a, 0x3656: 0x000a, 0x3657: 0x000a, - 0x3658: 0x000a, 0x3659: 0x000a, 0x365a: 0x000a, 0x365b: 0x000a, 0x365c: 0x000a, 0x365d: 0x000a, - 0x365e: 0x000a, - // Block 0xda, offset 0x3680 - 0x3680: 0x000a, 0x3681: 0x000a, 0x3682: 0x000a, 0x3683: 0x000a, 0x3684: 0x000a, 0x3685: 0x000a, - 0x3686: 0x000a, 0x3687: 0x000a, 0x3688: 0x000a, 0x3689: 0x000a, 0x368a: 0x000a, 0x368b: 0x000a, - 0x368c: 0x000a, 0x368d: 0x000a, 0x368e: 0x000a, 0x368f: 0x000a, 0x3690: 0x000a, 0x3691: 0x000a, - // Block 0xdb, offset 0x36c0 - 0x36fe: 0x000b, 0x36ff: 0x000b, - // Block 0xdc, offset 0x3700 - 0x3700: 0x000b, 0x3701: 0x000b, 0x3702: 0x000b, 0x3703: 0x000b, 0x3704: 0x000b, 0x3705: 0x000b, - 0x3706: 0x000b, 0x3707: 0x000b, 0x3708: 0x000b, 0x3709: 0x000b, 0x370a: 0x000b, 0x370b: 0x000b, - 0x370c: 0x000b, 0x370d: 0x000b, 0x370e: 0x000b, 0x370f: 0x000b, 0x3710: 0x000b, 0x3711: 0x000b, - 0x3712: 0x000b, 0x3713: 0x000b, 0x3714: 0x000b, 0x3715: 0x000b, 0x3716: 0x000b, 0x3717: 0x000b, - 0x3718: 0x000b, 0x3719: 0x000b, 0x371a: 0x000b, 0x371b: 0x000b, 0x371c: 0x000b, 0x371d: 0x000b, - 0x371e: 0x000b, 0x371f: 0x000b, 0x3720: 0x000b, 0x3721: 0x000b, 0x3722: 0x000b, 0x3723: 0x000b, - 0x3724: 0x000b, 0x3725: 0x000b, 0x3726: 0x000b, 0x3727: 0x000b, 0x3728: 0x000b, 0x3729: 0x000b, - 0x372a: 0x000b, 0x372b: 0x000b, 0x372c: 0x000b, 0x372d: 0x000b, 0x372e: 0x000b, 0x372f: 0x000b, - 0x3730: 0x000b, 0x3731: 0x000b, 0x3732: 0x000b, 0x3733: 0x000b, 0x3734: 0x000b, 0x3735: 0x000b, - 0x3736: 0x000b, 0x3737: 0x000b, 0x3738: 0x000b, 0x3739: 0x000b, 0x373a: 0x000b, 0x373b: 0x000b, - 0x373c: 0x000b, 0x373d: 0x000b, 0x373e: 0x000b, 0x373f: 0x000b, - // Block 0xdd, offset 0x3740 - 0x3740: 0x000c, 0x3741: 0x000c, 0x3742: 0x000c, 0x3743: 0x000c, 0x3744: 0x000c, 0x3745: 0x000c, - 0x3746: 0x000c, 0x3747: 0x000c, 0x3748: 0x000c, 0x3749: 0x000c, 0x374a: 0x000c, 0x374b: 0x000c, - 0x374c: 0x000c, 0x374d: 0x000c, 0x374e: 0x000c, 0x374f: 0x000c, 0x3750: 0x000c, 0x3751: 0x000c, - 0x3752: 0x000c, 0x3753: 0x000c, 0x3754: 0x000c, 0x3755: 0x000c, 0x3756: 0x000c, 0x3757: 0x000c, - 0x3758: 0x000c, 0x3759: 0x000c, 0x375a: 0x000c, 0x375b: 0x000c, 0x375c: 0x000c, 0x375d: 0x000c, - 0x375e: 0x000c, 0x375f: 0x000c, 0x3760: 0x000c, 0x3761: 0x000c, 0x3762: 0x000c, 0x3763: 0x000c, - 0x3764: 0x000c, 0x3765: 0x000c, 0x3766: 0x000c, 0x3767: 0x000c, 0x3768: 0x000c, 0x3769: 0x000c, - 0x376a: 0x000c, 0x376b: 0x000c, 0x376c: 0x000c, 0x376d: 0x000c, 0x376e: 0x000c, 0x376f: 0x000c, - 0x3770: 0x000b, 0x3771: 0x000b, 0x3772: 0x000b, 0x3773: 0x000b, 0x3774: 0x000b, 0x3775: 0x000b, - 0x3776: 0x000b, 0x3777: 0x000b, 0x3778: 0x000b, 0x3779: 0x000b, 0x377a: 0x000b, 0x377b: 0x000b, - 0x377c: 0x000b, 0x377d: 0x000b, 0x377e: 0x000b, 0x377f: 0x000b, -} - -// bidiIndex: 24 blocks, 1536 entries, 1536 bytes -// Block 0 is the zero block. -var bidiIndex = [1536]uint8{ - // Block 0x0, offset 0x0 - // Block 0x1, offset 0x40 - // Block 0x2, offset 0x80 - // Block 0x3, offset 0xc0 - 0xc2: 0x01, 0xc3: 0x02, - 0xca: 0x03, 0xcb: 0x04, 0xcc: 0x05, 0xcd: 0x06, 0xce: 0x07, 0xcf: 0x08, - 0xd2: 0x09, 0xd6: 0x0a, 0xd7: 0x0b, - 0xd8: 0x0c, 0xd9: 0x0d, 0xda: 0x0e, 0xdb: 0x0f, 0xdc: 0x10, 0xdd: 0x11, 0xde: 0x12, 0xdf: 0x13, - 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06, - 0xea: 0x07, 0xef: 0x08, - 0xf0: 0x11, 0xf1: 0x12, 0xf2: 0x12, 0xf3: 0x14, 0xf4: 0x15, - // Block 0x4, offset 0x100 - 0x120: 0x14, 0x121: 0x15, 0x122: 0x16, 0x123: 0x17, 0x124: 0x18, 0x125: 0x19, 0x126: 0x1a, 0x127: 0x1b, - 0x128: 0x1c, 0x129: 0x1d, 0x12a: 0x1c, 0x12b: 0x1e, 0x12c: 0x1f, 0x12d: 0x20, 0x12e: 0x21, 0x12f: 0x22, - 0x130: 0x23, 0x131: 0x24, 0x132: 0x1a, 0x133: 0x25, 0x134: 0x26, 0x135: 0x27, 0x137: 0x28, - 0x138: 0x29, 0x139: 0x2a, 0x13a: 0x2b, 0x13b: 0x2c, 0x13c: 0x2d, 0x13d: 0x2e, 0x13e: 0x2f, 0x13f: 0x30, - // Block 0x5, offset 0x140 - 0x140: 0x31, 0x141: 0x32, 0x142: 0x33, - 0x14d: 0x34, 0x14e: 0x35, - 0x150: 0x36, - 0x15a: 0x37, 0x15c: 0x38, 0x15d: 0x39, 0x15e: 0x3a, 0x15f: 0x3b, - 0x160: 0x3c, 0x162: 0x3d, 0x164: 0x3e, 0x165: 0x3f, 0x167: 0x40, - 0x168: 0x41, 0x169: 0x42, 0x16a: 0x43, 0x16c: 0x44, 0x16d: 0x45, 0x16e: 0x46, 0x16f: 0x47, - 0x170: 0x48, 0x173: 0x49, 0x177: 0x4a, - 0x17e: 0x4b, 0x17f: 0x4c, - // Block 0x6, offset 0x180 - 0x180: 0x4d, 0x181: 0x4e, 0x182: 0x4f, 0x183: 0x50, 0x184: 0x51, 0x185: 0x52, 0x186: 0x53, 0x187: 0x54, - 0x188: 0x55, 0x189: 0x54, 0x18a: 0x54, 0x18b: 0x54, 0x18c: 0x56, 0x18d: 0x57, 0x18e: 0x58, 0x18f: 0x59, - 0x190: 0x5a, 0x191: 0x5b, 0x192: 0x5c, 0x193: 0x5d, 0x194: 0x54, 0x195: 0x54, 0x196: 0x54, 0x197: 0x54, - 0x198: 0x54, 0x199: 0x54, 0x19a: 0x5e, 0x19b: 0x54, 0x19c: 0x54, 0x19d: 0x5f, 0x19e: 0x54, 0x19f: 0x60, - 0x1a4: 0x54, 0x1a5: 0x54, 0x1a6: 0x61, 0x1a7: 0x62, - 0x1a8: 0x54, 0x1a9: 0x54, 0x1aa: 0x54, 0x1ab: 0x54, 0x1ac: 0x54, 0x1ad: 0x63, 0x1ae: 0x64, 0x1af: 0x65, - 0x1b3: 0x66, 0x1b5: 0x67, 0x1b7: 0x68, - 0x1b8: 0x69, 0x1b9: 0x6a, 0x1ba: 0x6b, 0x1bb: 0x6c, 0x1bc: 0x54, 0x1bd: 0x54, 0x1be: 0x54, 0x1bf: 0x6d, - // Block 0x7, offset 0x1c0 - 0x1c0: 0x6e, 0x1c2: 0x6f, 0x1c3: 0x70, 0x1c7: 0x71, - 0x1c8: 0x72, 0x1c9: 0x73, 0x1ca: 0x74, 0x1cb: 0x75, 0x1cd: 0x76, 0x1cf: 0x77, - // Block 0x8, offset 0x200 - 0x237: 0x54, - // Block 0x9, offset 0x240 - 0x252: 0x78, 0x253: 0x79, - 0x258: 0x7a, 0x259: 0x7b, 0x25a: 0x7c, 0x25b: 0x7d, 0x25c: 0x7e, 0x25e: 0x7f, - 0x260: 0x80, 0x261: 0x81, 0x263: 0x82, 0x264: 0x83, 0x265: 0x84, 0x266: 0x85, 0x267: 0x86, - 0x268: 0x87, 0x269: 0x88, 0x26a: 0x89, 0x26b: 0x8a, 0x26f: 0x8b, - // Block 0xa, offset 0x280 - 0x2ac: 0x8c, 0x2ad: 0x8d, 0x2ae: 0x0e, 0x2af: 0x0e, - 0x2b0: 0x0e, 0x2b1: 0x0e, 0x2b2: 0x0e, 0x2b3: 0x0e, 0x2b4: 0x8e, 0x2b5: 0x0e, 0x2b6: 0x0e, 0x2b7: 0x8f, - 0x2b8: 0x90, 0x2b9: 0x91, 0x2ba: 0x0e, 0x2bb: 0x92, 0x2bc: 0x93, 0x2bd: 0x94, 0x2bf: 0x95, - // Block 0xb, offset 0x2c0 - 0x2c4: 0x96, 0x2c5: 0x54, 0x2c6: 0x97, 0x2c7: 0x98, - 0x2cb: 0x99, 0x2cd: 0x9a, - 0x2e0: 0x9b, 0x2e1: 0x9b, 0x2e2: 0x9b, 0x2e3: 0x9b, 0x2e4: 0x9c, 0x2e5: 0x9b, 0x2e6: 0x9b, 0x2e7: 0x9b, - 0x2e8: 0x9d, 0x2e9: 0x9b, 0x2ea: 0x9b, 0x2eb: 0x9e, 0x2ec: 0x9f, 0x2ed: 0x9b, 0x2ee: 0x9b, 0x2ef: 0x9b, - 0x2f0: 0x9b, 0x2f1: 0x9b, 0x2f2: 0x9b, 0x2f3: 0x9b, 0x2f4: 0x9b, 0x2f5: 0x9b, 0x2f6: 0x9b, 0x2f7: 0x9b, - 0x2f8: 0x9b, 0x2f9: 0xa0, 0x2fa: 0x9b, 0x2fb: 0x9b, 0x2fc: 0x9b, 0x2fd: 0x9b, 0x2fe: 0x9b, 0x2ff: 0x9b, - // Block 0xc, offset 0x300 - 0x300: 0xa1, 0x301: 0xa2, 0x302: 0xa3, 0x304: 0xa4, 0x305: 0xa5, 0x306: 0xa6, 0x307: 0xa7, - 0x308: 0xa8, 0x30b: 0xa9, 0x30c: 0xaa, 0x30d: 0xab, - 0x310: 0xac, 0x311: 0xad, 0x312: 0xae, 0x313: 0xaf, 0x316: 0xb0, 0x317: 0xb1, - 0x318: 0xb2, 0x319: 0xb3, 0x31a: 0xb4, 0x31c: 0xb5, - 0x330: 0xb6, 0x332: 0xb7, - // Block 0xd, offset 0x340 - 0x36b: 0xb8, 0x36c: 0xb9, - 0x37e: 0xba, - // Block 0xe, offset 0x380 - 0x3b2: 0xbb, - // Block 0xf, offset 0x3c0 - 0x3c5: 0xbc, 0x3c6: 0xbd, - 0x3c8: 0x54, 0x3c9: 0xbe, 0x3cc: 0x54, 0x3cd: 0xbf, - 0x3db: 0xc0, 0x3dc: 0xc1, 0x3dd: 0xc2, 0x3de: 0xc3, 0x3df: 0xc4, - 0x3e8: 0xc5, 0x3e9: 0xc6, 0x3ea: 0xc7, - // Block 0x10, offset 0x400 - 0x400: 0xc8, - 0x420: 0x9b, 0x421: 0x9b, 0x422: 0x9b, 0x423: 0xc9, 0x424: 0x9b, 0x425: 0xca, 0x426: 0x9b, 0x427: 0x9b, - 0x428: 0x9b, 0x429: 0x9b, 0x42a: 0x9b, 0x42b: 0x9b, 0x42c: 0x9b, 0x42d: 0x9b, 0x42e: 0x9b, 0x42f: 0x9b, - 0x430: 0x9b, 0x431: 0x9b, 0x432: 0x9b, 0x433: 0x9b, 0x434: 0x9b, 0x435: 0x9b, 0x436: 0x9b, 0x437: 0x9b, - 0x438: 0x0e, 0x439: 0x0e, 0x43a: 0x0e, 0x43b: 0xcb, 0x43c: 0x9b, 0x43d: 0x9b, 0x43e: 0x9b, 0x43f: 0x9b, - // Block 0x11, offset 0x440 - 0x440: 0xcc, 0x441: 0x54, 0x442: 0xcd, 0x443: 0xce, 0x444: 0xcf, 0x445: 0xd0, - 0x44c: 0x54, 0x44d: 0x54, 0x44e: 0x54, 0x44f: 0x54, - 0x450: 0x54, 0x451: 0x54, 0x452: 0x54, 0x453: 0x54, 0x454: 0x54, 0x455: 0x54, 0x456: 0x54, 0x457: 0x54, - 0x458: 0x54, 0x459: 0x54, 0x45a: 0x54, 0x45b: 0xd1, 0x45c: 0x54, 0x45d: 0x6c, 0x45e: 0x54, 0x45f: 0xd2, - 0x460: 0xd3, 0x461: 0xd4, 0x462: 0xd5, 0x464: 0xd6, 0x465: 0xd7, 0x466: 0xd8, 0x467: 0x36, - 0x47f: 0xd9, - // Block 0x12, offset 0x480 - 0x4bf: 0xd9, - // Block 0x13, offset 0x4c0 - 0x4d0: 0x09, 0x4d1: 0x0a, 0x4d6: 0x0b, - 0x4db: 0x0c, 0x4dd: 0x0d, 0x4de: 0x0e, 0x4df: 0x0f, - 0x4ef: 0x10, - 0x4ff: 0x10, - // Block 0x14, offset 0x500 - 0x50f: 0x10, - 0x51f: 0x10, - 0x52f: 0x10, - 0x53f: 0x10, - // Block 0x15, offset 0x540 - 0x540: 0xda, 0x541: 0xda, 0x542: 0xda, 0x543: 0xda, 0x544: 0x05, 0x545: 0x05, 0x546: 0x05, 0x547: 0xdb, - 0x548: 0xda, 0x549: 0xda, 0x54a: 0xda, 0x54b: 0xda, 0x54c: 0xda, 0x54d: 0xda, 0x54e: 0xda, 0x54f: 0xda, - 0x550: 0xda, 0x551: 0xda, 0x552: 0xda, 0x553: 0xda, 0x554: 0xda, 0x555: 0xda, 0x556: 0xda, 0x557: 0xda, - 0x558: 0xda, 0x559: 0xda, 0x55a: 0xda, 0x55b: 0xda, 0x55c: 0xda, 0x55d: 0xda, 0x55e: 0xda, 0x55f: 0xda, - 0x560: 0xda, 0x561: 0xda, 0x562: 0xda, 0x563: 0xda, 0x564: 0xda, 0x565: 0xda, 0x566: 0xda, 0x567: 0xda, - 0x568: 0xda, 0x569: 0xda, 0x56a: 0xda, 0x56b: 0xda, 0x56c: 0xda, 0x56d: 0xda, 0x56e: 0xda, 0x56f: 0xda, - 0x570: 0xda, 0x571: 0xda, 0x572: 0xda, 0x573: 0xda, 0x574: 0xda, 0x575: 0xda, 0x576: 0xda, 0x577: 0xda, - 0x578: 0xda, 0x579: 0xda, 0x57a: 0xda, 0x57b: 0xda, 0x57c: 0xda, 0x57d: 0xda, 0x57e: 0xda, 0x57f: 0xda, - // Block 0x16, offset 0x580 - 0x58f: 0x10, - 0x59f: 0x10, - 0x5a0: 0x13, - 0x5af: 0x10, - 0x5bf: 0x10, - // Block 0x17, offset 0x5c0 - 0x5cf: 0x10, -} - -// Total table size 15800 bytes (15KiB); checksum: F50EF68C diff --git a/vendor/golang.org/x/text/unicode/bidi/trieval.go b/vendor/golang.org/x/text/unicode/bidi/trieval.go deleted file mode 100644 index 4c459c4b7..000000000 --- a/vendor/golang.org/x/text/unicode/bidi/trieval.go +++ /dev/null @@ -1,60 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -package bidi - -// Class is the Unicode BiDi class. Each rune has a single class. -type Class uint - -const ( - L Class = iota // LeftToRight - R // RightToLeft - EN // EuropeanNumber - ES // EuropeanSeparator - ET // EuropeanTerminator - AN // ArabicNumber - CS // CommonSeparator - B // ParagraphSeparator - S // SegmentSeparator - WS // WhiteSpace - ON // OtherNeutral - BN // BoundaryNeutral - NSM // NonspacingMark - AL // ArabicLetter - Control // Control LRO - PDI - - numClass - - LRO // LeftToRightOverride - RLO // RightToLeftOverride - LRE // LeftToRightEmbedding - RLE // RightToLeftEmbedding - PDF // PopDirectionalFormat - LRI // LeftToRightIsolate - RLI // RightToLeftIsolate - FSI // FirstStrongIsolate - PDI // PopDirectionalIsolate - - unknownClass = ^Class(0) -) - -var controlToClass = map[rune]Class{ - 0x202D: LRO, // LeftToRightOverride, - 0x202E: RLO, // RightToLeftOverride, - 0x202A: LRE, // LeftToRightEmbedding, - 0x202B: RLE, // RightToLeftEmbedding, - 0x202C: PDF, // PopDirectionalFormat, - 0x2066: LRI, // LeftToRightIsolate, - 0x2067: RLI, // RightToLeftIsolate, - 0x2068: FSI, // FirstStrongIsolate, - 0x2069: PDI, // PopDirectionalIsolate, -} - -// A trie entry has the following bits: -// 7..5 XOR mask for brackets -// 4 1: Bracket open, 0: Bracket close -// 3..0 Class type - -const ( - openMask = 0x10 - xorMaskShift = 5 -) diff --git a/vendor/golang.org/x/text/unicode/norm/composition.go b/vendor/golang.org/x/text/unicode/norm/composition.go deleted file mode 100644 index bab4c5de0..000000000 --- a/vendor/golang.org/x/text/unicode/norm/composition.go +++ /dev/null @@ -1,508 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package norm - -import "unicode/utf8" - -const ( - maxNonStarters = 30 - // The maximum number of characters needed for a buffer is - // maxNonStarters + 1 for the starter + 1 for the GCJ - maxBufferSize = maxNonStarters + 2 - maxNFCExpansion = 3 // NFC(0x1D160) - maxNFKCExpansion = 18 // NFKC(0xFDFA) - - maxByteBufferSize = utf8.UTFMax * maxBufferSize // 128 -) - -// ssState is used for reporting the segment state after inserting a rune. -// It is returned by streamSafe.next. -type ssState int - -const ( - // Indicates a rune was successfully added to the segment. - ssSuccess ssState = iota - // Indicates a rune starts a new segment and should not be added. - ssStarter - // Indicates a rune caused a segment overflow and a CGJ should be inserted. - ssOverflow -) - -// streamSafe implements the policy of when a CGJ should be inserted. -type streamSafe uint8 - -// first inserts the first rune of a segment. It is a faster version of next if -// it is known p represents the first rune in a segment. -func (ss *streamSafe) first(p Properties) { - *ss = streamSafe(p.nTrailingNonStarters()) -} - -// insert returns a ssState value to indicate whether a rune represented by p -// can be inserted. -func (ss *streamSafe) next(p Properties) ssState { - if *ss > maxNonStarters { - panic("streamSafe was not reset") - } - n := p.nLeadingNonStarters() - if *ss += streamSafe(n); *ss > maxNonStarters { - *ss = 0 - return ssOverflow - } - // The Stream-Safe Text Processing prescribes that the counting can stop - // as soon as a starter is encountered. However, there are some starters, - // like Jamo V and T, that can combine with other runes, leaving their - // successive non-starters appended to the previous, possibly causing an - // overflow. We will therefore consider any rune with a non-zero nLead to - // be a non-starter. Note that it always hold that if nLead > 0 then - // nLead == nTrail. - if n == 0 { - *ss = streamSafe(p.nTrailingNonStarters()) - return ssStarter - } - return ssSuccess -} - -// backwards is used for checking for overflow and segment starts -// when traversing a string backwards. Users do not need to call first -// for the first rune. The state of the streamSafe retains the count of -// the non-starters loaded. -func (ss *streamSafe) backwards(p Properties) ssState { - if *ss > maxNonStarters { - panic("streamSafe was not reset") - } - c := *ss + streamSafe(p.nTrailingNonStarters()) - if c > maxNonStarters { - return ssOverflow - } - *ss = c - if p.nLeadingNonStarters() == 0 { - return ssStarter - } - return ssSuccess -} - -func (ss streamSafe) isMax() bool { - return ss == maxNonStarters -} - -// GraphemeJoiner is inserted after maxNonStarters non-starter runes. -const GraphemeJoiner = "\u034F" - -// reorderBuffer is used to normalize a single segment. Characters inserted with -// insert are decomposed and reordered based on CCC. The compose method can -// be used to recombine characters. Note that the byte buffer does not hold -// the UTF-8 characters in order. Only the rune array is maintained in sorted -// order. flush writes the resulting segment to a byte array. -type reorderBuffer struct { - rune [maxBufferSize]Properties // Per character info. - byte [maxByteBufferSize]byte // UTF-8 buffer. Referenced by runeInfo.pos. - nbyte uint8 // Number or bytes. - ss streamSafe // For limiting length of non-starter sequence. - nrune int // Number of runeInfos. - f formInfo - - src input - nsrc int - tmpBytes input - - out []byte - flushF func(*reorderBuffer) bool -} - -func (rb *reorderBuffer) init(f Form, src []byte) { - rb.f = *formTable[f] - rb.src.setBytes(src) - rb.nsrc = len(src) - rb.ss = 0 -} - -func (rb *reorderBuffer) initString(f Form, src string) { - rb.f = *formTable[f] - rb.src.setString(src) - rb.nsrc = len(src) - rb.ss = 0 -} - -func (rb *reorderBuffer) setFlusher(out []byte, f func(*reorderBuffer) bool) { - rb.out = out - rb.flushF = f -} - -// reset discards all characters from the buffer. -func (rb *reorderBuffer) reset() { - rb.nrune = 0 - rb.nbyte = 0 -} - -func (rb *reorderBuffer) doFlush() bool { - if rb.f.composing { - rb.compose() - } - res := rb.flushF(rb) - rb.reset() - return res -} - -// appendFlush appends the normalized segment to rb.out. -func appendFlush(rb *reorderBuffer) bool { - for i := 0; i < rb.nrune; i++ { - start := rb.rune[i].pos - end := start + rb.rune[i].size - rb.out = append(rb.out, rb.byte[start:end]...) - } - return true -} - -// flush appends the normalized segment to out and resets rb. -func (rb *reorderBuffer) flush(out []byte) []byte { - for i := 0; i < rb.nrune; i++ { - start := rb.rune[i].pos - end := start + rb.rune[i].size - out = append(out, rb.byte[start:end]...) - } - rb.reset() - return out -} - -// flushCopy copies the normalized segment to buf and resets rb. -// It returns the number of bytes written to buf. -func (rb *reorderBuffer) flushCopy(buf []byte) int { - p := 0 - for i := 0; i < rb.nrune; i++ { - runep := rb.rune[i] - p += copy(buf[p:], rb.byte[runep.pos:runep.pos+runep.size]) - } - rb.reset() - return p -} - -// insertOrdered inserts a rune in the buffer, ordered by Canonical Combining Class. -// It returns false if the buffer is not large enough to hold the rune. -// It is used internally by insert and insertString only. -func (rb *reorderBuffer) insertOrdered(info Properties) { - n := rb.nrune - b := rb.rune[:] - cc := info.ccc - if cc > 0 { - // Find insertion position + move elements to make room. - for ; n > 0; n-- { - if b[n-1].ccc <= cc { - break - } - b[n] = b[n-1] - } - } - rb.nrune += 1 - pos := uint8(rb.nbyte) - rb.nbyte += utf8.UTFMax - info.pos = pos - b[n] = info -} - -// insertErr is an error code returned by insert. Using this type instead -// of error improves performance up to 20% for many of the benchmarks. -type insertErr int - -const ( - iSuccess insertErr = -iota - iShortDst - iShortSrc -) - -// insertFlush inserts the given rune in the buffer ordered by CCC. -// If a decomposition with multiple segments are encountered, they leading -// ones are flushed. -// It returns a non-zero error code if the rune was not inserted. -func (rb *reorderBuffer) insertFlush(src input, i int, info Properties) insertErr { - if rune := src.hangul(i); rune != 0 { - rb.decomposeHangul(rune) - return iSuccess - } - if info.hasDecomposition() { - return rb.insertDecomposed(info.Decomposition()) - } - rb.insertSingle(src, i, info) - return iSuccess -} - -// insertUnsafe inserts the given rune in the buffer ordered by CCC. -// It is assumed there is sufficient space to hold the runes. It is the -// responsibility of the caller to ensure this. This can be done by checking -// the state returned by the streamSafe type. -func (rb *reorderBuffer) insertUnsafe(src input, i int, info Properties) { - if rune := src.hangul(i); rune != 0 { - rb.decomposeHangul(rune) - } - if info.hasDecomposition() { - // TODO: inline. - rb.insertDecomposed(info.Decomposition()) - } else { - rb.insertSingle(src, i, info) - } -} - -// insertDecomposed inserts an entry in to the reorderBuffer for each rune -// in dcomp. dcomp must be a sequence of decomposed UTF-8-encoded runes. -// It flushes the buffer on each new segment start. -func (rb *reorderBuffer) insertDecomposed(dcomp []byte) insertErr { - rb.tmpBytes.setBytes(dcomp) - // As the streamSafe accounting already handles the counting for modifiers, - // we don't have to call next. However, we do need to keep the accounting - // intact when flushing the buffer. - for i := 0; i < len(dcomp); { - info := rb.f.info(rb.tmpBytes, i) - if info.BoundaryBefore() && rb.nrune > 0 && !rb.doFlush() { - return iShortDst - } - i += copy(rb.byte[rb.nbyte:], dcomp[i:i+int(info.size)]) - rb.insertOrdered(info) - } - return iSuccess -} - -// insertSingle inserts an entry in the reorderBuffer for the rune at -// position i. info is the runeInfo for the rune at position i. -func (rb *reorderBuffer) insertSingle(src input, i int, info Properties) { - src.copySlice(rb.byte[rb.nbyte:], i, i+int(info.size)) - rb.insertOrdered(info) -} - -// insertCGJ inserts a Combining Grapheme Joiner (0x034f) into rb. -func (rb *reorderBuffer) insertCGJ() { - rb.insertSingle(input{str: GraphemeJoiner}, 0, Properties{size: uint8(len(GraphemeJoiner))}) -} - -// appendRune inserts a rune at the end of the buffer. It is used for Hangul. -func (rb *reorderBuffer) appendRune(r rune) { - bn := rb.nbyte - sz := utf8.EncodeRune(rb.byte[bn:], rune(r)) - rb.nbyte += utf8.UTFMax - rb.rune[rb.nrune] = Properties{pos: bn, size: uint8(sz)} - rb.nrune++ -} - -// assignRune sets a rune at position pos. It is used for Hangul and recomposition. -func (rb *reorderBuffer) assignRune(pos int, r rune) { - bn := rb.rune[pos].pos - sz := utf8.EncodeRune(rb.byte[bn:], rune(r)) - rb.rune[pos] = Properties{pos: bn, size: uint8(sz)} -} - -// runeAt returns the rune at position n. It is used for Hangul and recomposition. -func (rb *reorderBuffer) runeAt(n int) rune { - inf := rb.rune[n] - r, _ := utf8.DecodeRune(rb.byte[inf.pos : inf.pos+inf.size]) - return r -} - -// bytesAt returns the UTF-8 encoding of the rune at position n. -// It is used for Hangul and recomposition. -func (rb *reorderBuffer) bytesAt(n int) []byte { - inf := rb.rune[n] - return rb.byte[inf.pos : int(inf.pos)+int(inf.size)] -} - -// For Hangul we combine algorithmically, instead of using tables. -const ( - hangulBase = 0xAC00 // UTF-8(hangulBase) -> EA B0 80 - hangulBase0 = 0xEA - hangulBase1 = 0xB0 - hangulBase2 = 0x80 - - hangulEnd = hangulBase + jamoLVTCount // UTF-8(0xD7A4) -> ED 9E A4 - hangulEnd0 = 0xED - hangulEnd1 = 0x9E - hangulEnd2 = 0xA4 - - jamoLBase = 0x1100 // UTF-8(jamoLBase) -> E1 84 00 - jamoLBase0 = 0xE1 - jamoLBase1 = 0x84 - jamoLEnd = 0x1113 - jamoVBase = 0x1161 - jamoVEnd = 0x1176 - jamoTBase = 0x11A7 - jamoTEnd = 0x11C3 - - jamoTCount = 28 - jamoVCount = 21 - jamoVTCount = 21 * 28 - jamoLVTCount = 19 * 21 * 28 -) - -const hangulUTF8Size = 3 - -func isHangul(b []byte) bool { - if len(b) < hangulUTF8Size { - return false - } - b0 := b[0] - if b0 < hangulBase0 { - return false - } - b1 := b[1] - switch { - case b0 == hangulBase0: - return b1 >= hangulBase1 - case b0 < hangulEnd0: - return true - case b0 > hangulEnd0: - return false - case b1 < hangulEnd1: - return true - } - return b1 == hangulEnd1 && b[2] < hangulEnd2 -} - -func isHangulString(b string) bool { - if len(b) < hangulUTF8Size { - return false - } - b0 := b[0] - if b0 < hangulBase0 { - return false - } - b1 := b[1] - switch { - case b0 == hangulBase0: - return b1 >= hangulBase1 - case b0 < hangulEnd0: - return true - case b0 > hangulEnd0: - return false - case b1 < hangulEnd1: - return true - } - return b1 == hangulEnd1 && b[2] < hangulEnd2 -} - -// Caller must ensure len(b) >= 2. -func isJamoVT(b []byte) bool { - // True if (rune & 0xff00) == jamoLBase - return b[0] == jamoLBase0 && (b[1]&0xFC) == jamoLBase1 -} - -func isHangulWithoutJamoT(b []byte) bool { - c, _ := utf8.DecodeRune(b) - c -= hangulBase - return c < jamoLVTCount && c%jamoTCount == 0 -} - -// decomposeHangul writes the decomposed Hangul to buf and returns the number -// of bytes written. len(buf) should be at least 9. -func decomposeHangul(buf []byte, r rune) int { - const JamoUTF8Len = 3 - r -= hangulBase - x := r % jamoTCount - r /= jamoTCount - utf8.EncodeRune(buf, jamoLBase+r/jamoVCount) - utf8.EncodeRune(buf[JamoUTF8Len:], jamoVBase+r%jamoVCount) - if x != 0 { - utf8.EncodeRune(buf[2*JamoUTF8Len:], jamoTBase+x) - return 3 * JamoUTF8Len - } - return 2 * JamoUTF8Len -} - -// decomposeHangul algorithmically decomposes a Hangul rune into -// its Jamo components. -// See http://unicode.org/reports/tr15/#Hangul for details on decomposing Hangul. -func (rb *reorderBuffer) decomposeHangul(r rune) { - r -= hangulBase - x := r % jamoTCount - r /= jamoTCount - rb.appendRune(jamoLBase + r/jamoVCount) - rb.appendRune(jamoVBase + r%jamoVCount) - if x != 0 { - rb.appendRune(jamoTBase + x) - } -} - -// combineHangul algorithmically combines Jamo character components into Hangul. -// See http://unicode.org/reports/tr15/#Hangul for details on combining Hangul. -func (rb *reorderBuffer) combineHangul(s, i, k int) { - b := rb.rune[:] - bn := rb.nrune - for ; i < bn; i++ { - cccB := b[k-1].ccc - cccC := b[i].ccc - if cccB == 0 { - s = k - 1 - } - if s != k-1 && cccB >= cccC { - // b[i] is blocked by greater-equal cccX below it - b[k] = b[i] - k++ - } else { - l := rb.runeAt(s) // also used to compare to hangulBase - v := rb.runeAt(i) // also used to compare to jamoT - switch { - case jamoLBase <= l && l < jamoLEnd && - jamoVBase <= v && v < jamoVEnd: - // 11xx plus 116x to LV - rb.assignRune(s, hangulBase+ - (l-jamoLBase)*jamoVTCount+(v-jamoVBase)*jamoTCount) - case hangulBase <= l && l < hangulEnd && - jamoTBase < v && v < jamoTEnd && - ((l-hangulBase)%jamoTCount) == 0: - // ACxx plus 11Ax to LVT - rb.assignRune(s, l+v-jamoTBase) - default: - b[k] = b[i] - k++ - } - } - } - rb.nrune = k -} - -// compose recombines the runes in the buffer. -// It should only be used to recompose a single segment, as it will not -// handle alternations between Hangul and non-Hangul characters correctly. -func (rb *reorderBuffer) compose() { - // UAX #15, section X5 , including Corrigendum #5 - // "In any character sequence beginning with starter S, a character C is - // blocked from S if and only if there is some character B between S - // and C, and either B is a starter or it has the same or higher - // combining class as C." - bn := rb.nrune - if bn == 0 { - return - } - k := 1 - b := rb.rune[:] - for s, i := 0, 1; i < bn; i++ { - if isJamoVT(rb.bytesAt(i)) { - // Redo from start in Hangul mode. Necessary to support - // U+320E..U+321E in NFKC mode. - rb.combineHangul(s, i, k) - return - } - ii := b[i] - // We can only use combineForward as a filter if we later - // get the info for the combined character. This is more - // expensive than using the filter. Using combinesBackward() - // is safe. - if ii.combinesBackward() { - cccB := b[k-1].ccc - cccC := ii.ccc - blocked := false // b[i] blocked by starter or greater or equal CCC? - if cccB == 0 { - s = k - 1 - } else { - blocked = s != k-1 && cccB >= cccC - } - if !blocked { - combined := combine(rb.runeAt(s), rb.runeAt(i)) - if combined != 0 { - rb.assignRune(s, combined) - continue - } - } - } - b[k] = b[i] - k++ - } - rb.nrune = k -} diff --git a/vendor/golang.org/x/text/unicode/norm/forminfo.go b/vendor/golang.org/x/text/unicode/norm/forminfo.go deleted file mode 100644 index e67e7655c..000000000 --- a/vendor/golang.org/x/text/unicode/norm/forminfo.go +++ /dev/null @@ -1,259 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package norm - -// This file contains Form-specific logic and wrappers for data in tables.go. - -// Rune info is stored in a separate trie per composing form. A composing form -// and its corresponding decomposing form share the same trie. Each trie maps -// a rune to a uint16. The values take two forms. For v >= 0x8000: -// bits -// 15: 1 (inverse of NFD_QC bit of qcInfo) -// 13..7: qcInfo (see below). isYesD is always true (no decompostion). -// 6..0: ccc (compressed CCC value). -// For v < 0x8000, the respective rune has a decomposition and v is an index -// into a byte array of UTF-8 decomposition sequences and additional info and -// has the form: -//
* [ []] -// The header contains the number of bytes in the decomposition (excluding this -// length byte). The two most significant bits of this length byte correspond -// to bit 5 and 4 of qcInfo (see below). The byte sequence itself starts at v+1. -// The byte sequence is followed by a trailing and leading CCC if the values -// for these are not zero. The value of v determines which ccc are appended -// to the sequences. For v < firstCCC, there are none, for v >= firstCCC, -// the sequence is followed by a trailing ccc, and for v >= firstLeadingCC -// there is an additional leading ccc. The value of tccc itself is the -// trailing CCC shifted left 2 bits. The two least-significant bits of tccc -// are the number of trailing non-starters. - -const ( - qcInfoMask = 0x3F // to clear all but the relevant bits in a qcInfo - headerLenMask = 0x3F // extract the length value from the header byte - headerFlagsMask = 0xC0 // extract the qcInfo bits from the header byte -) - -// Properties provides access to normalization properties of a rune. -type Properties struct { - pos uint8 // start position in reorderBuffer; used in composition.go - size uint8 // length of UTF-8 encoding of this rune - ccc uint8 // leading canonical combining class (ccc if not decomposition) - tccc uint8 // trailing canonical combining class (ccc if not decomposition) - nLead uint8 // number of leading non-starters. - flags qcInfo // quick check flags - index uint16 -} - -// functions dispatchable per form -type lookupFunc func(b input, i int) Properties - -// formInfo holds Form-specific functions and tables. -type formInfo struct { - form Form - composing, compatibility bool // form type - info lookupFunc - nextMain iterFunc -} - -var formTable = []*formInfo{{ - form: NFC, - composing: true, - compatibility: false, - info: lookupInfoNFC, - nextMain: nextComposed, -}, { - form: NFD, - composing: false, - compatibility: false, - info: lookupInfoNFC, - nextMain: nextDecomposed, -}, { - form: NFKC, - composing: true, - compatibility: true, - info: lookupInfoNFKC, - nextMain: nextComposed, -}, { - form: NFKD, - composing: false, - compatibility: true, - info: lookupInfoNFKC, - nextMain: nextDecomposed, -}} - -// We do not distinguish between boundaries for NFC, NFD, etc. to avoid -// unexpected behavior for the user. For example, in NFD, there is a boundary -// after 'a'. However, 'a' might combine with modifiers, so from the application's -// perspective it is not a good boundary. We will therefore always use the -// boundaries for the combining variants. - -// BoundaryBefore returns true if this rune starts a new segment and -// cannot combine with any rune on the left. -func (p Properties) BoundaryBefore() bool { - if p.ccc == 0 && !p.combinesBackward() { - return true - } - // We assume that the CCC of the first character in a decomposition - // is always non-zero if different from info.ccc and that we can return - // false at this point. This is verified by maketables. - return false -} - -// BoundaryAfter returns true if runes cannot combine with or otherwise -// interact with this or previous runes. -func (p Properties) BoundaryAfter() bool { - // TODO: loosen these conditions. - return p.isInert() -} - -// We pack quick check data in 4 bits: -// 5: Combines forward (0 == false, 1 == true) -// 4..3: NFC_QC Yes(00), No (10), or Maybe (11) -// 2: NFD_QC Yes (0) or No (1). No also means there is a decomposition. -// 1..0: Number of trailing non-starters. -// -// When all 4 bits are zero, the character is inert, meaning it is never -// influenced by normalization. -type qcInfo uint8 - -func (p Properties) isYesC() bool { return p.flags&0x10 == 0 } -func (p Properties) isYesD() bool { return p.flags&0x4 == 0 } - -func (p Properties) combinesForward() bool { return p.flags&0x20 != 0 } -func (p Properties) combinesBackward() bool { return p.flags&0x8 != 0 } // == isMaybe -func (p Properties) hasDecomposition() bool { return p.flags&0x4 != 0 } // == isNoD - -func (p Properties) isInert() bool { - return p.flags&qcInfoMask == 0 && p.ccc == 0 -} - -func (p Properties) multiSegment() bool { - return p.index >= firstMulti && p.index < endMulti -} - -func (p Properties) nLeadingNonStarters() uint8 { - return p.nLead -} - -func (p Properties) nTrailingNonStarters() uint8 { - return uint8(p.flags & 0x03) -} - -// Decomposition returns the decomposition for the underlying rune -// or nil if there is none. -func (p Properties) Decomposition() []byte { - // TODO: create the decomposition for Hangul? - if p.index == 0 { - return nil - } - i := p.index - n := decomps[i] & headerLenMask - i++ - return decomps[i : i+uint16(n)] -} - -// Size returns the length of UTF-8 encoding of the rune. -func (p Properties) Size() int { - return int(p.size) -} - -// CCC returns the canonical combining class of the underlying rune. -func (p Properties) CCC() uint8 { - if p.index >= firstCCCZeroExcept { - return 0 - } - return ccc[p.ccc] -} - -// LeadCCC returns the CCC of the first rune in the decomposition. -// If there is no decomposition, LeadCCC equals CCC. -func (p Properties) LeadCCC() uint8 { - return ccc[p.ccc] -} - -// TrailCCC returns the CCC of the last rune in the decomposition. -// If there is no decomposition, TrailCCC equals CCC. -func (p Properties) TrailCCC() uint8 { - return ccc[p.tccc] -} - -// Recomposition -// We use 32-bit keys instead of 64-bit for the two codepoint keys. -// This clips off the bits of three entries, but we know this will not -// result in a collision. In the unlikely event that changes to -// UnicodeData.txt introduce collisions, the compiler will catch it. -// Note that the recomposition map for NFC and NFKC are identical. - -// combine returns the combined rune or 0 if it doesn't exist. -func combine(a, b rune) rune { - key := uint32(uint16(a))<<16 + uint32(uint16(b)) - return recompMap[key] -} - -func lookupInfoNFC(b input, i int) Properties { - v, sz := b.charinfoNFC(i) - return compInfo(v, sz) -} - -func lookupInfoNFKC(b input, i int) Properties { - v, sz := b.charinfoNFKC(i) - return compInfo(v, sz) -} - -// Properties returns properties for the first rune in s. -func (f Form) Properties(s []byte) Properties { - if f == NFC || f == NFD { - return compInfo(nfcData.lookup(s)) - } - return compInfo(nfkcData.lookup(s)) -} - -// PropertiesString returns properties for the first rune in s. -func (f Form) PropertiesString(s string) Properties { - if f == NFC || f == NFD { - return compInfo(nfcData.lookupString(s)) - } - return compInfo(nfkcData.lookupString(s)) -} - -// compInfo converts the information contained in v and sz -// to a Properties. See the comment at the top of the file -// for more information on the format. -func compInfo(v uint16, sz int) Properties { - if v == 0 { - return Properties{size: uint8(sz)} - } else if v >= 0x8000 { - p := Properties{ - size: uint8(sz), - ccc: uint8(v), - tccc: uint8(v), - flags: qcInfo(v >> 8), - } - if p.ccc > 0 || p.combinesBackward() { - p.nLead = uint8(p.flags & 0x3) - } - return p - } - // has decomposition - h := decomps[v] - f := (qcInfo(h&headerFlagsMask) >> 2) | 0x4 - p := Properties{size: uint8(sz), flags: f, index: v} - if v >= firstCCC { - v += uint16(h&headerLenMask) + 1 - c := decomps[v] - p.tccc = c >> 2 - p.flags |= qcInfo(c & 0x3) - if v >= firstLeadingCCC { - p.nLead = c & 0x3 - if v >= firstStarterWithNLead { - // We were tricked. Remove the decomposition. - p.flags &= 0x03 - p.index = 0 - return p - } - p.ccc = decomps[v+1] - } - } - return p -} diff --git a/vendor/golang.org/x/text/unicode/norm/input.go b/vendor/golang.org/x/text/unicode/norm/input.go deleted file mode 100644 index 479e35bc2..000000000 --- a/vendor/golang.org/x/text/unicode/norm/input.go +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package norm - -import "unicode/utf8" - -type input struct { - str string - bytes []byte -} - -func inputBytes(str []byte) input { - return input{bytes: str} -} - -func inputString(str string) input { - return input{str: str} -} - -func (in *input) setBytes(str []byte) { - in.str = "" - in.bytes = str -} - -func (in *input) setString(str string) { - in.str = str - in.bytes = nil -} - -func (in *input) _byte(p int) byte { - if in.bytes == nil { - return in.str[p] - } - return in.bytes[p] -} - -func (in *input) skipASCII(p, max int) int { - if in.bytes == nil { - for ; p < max && in.str[p] < utf8.RuneSelf; p++ { - } - } else { - for ; p < max && in.bytes[p] < utf8.RuneSelf; p++ { - } - } - return p -} - -func (in *input) skipContinuationBytes(p int) int { - if in.bytes == nil { - for ; p < len(in.str) && !utf8.RuneStart(in.str[p]); p++ { - } - } else { - for ; p < len(in.bytes) && !utf8.RuneStart(in.bytes[p]); p++ { - } - } - return p -} - -func (in *input) appendSlice(buf []byte, b, e int) []byte { - if in.bytes != nil { - return append(buf, in.bytes[b:e]...) - } - for i := b; i < e; i++ { - buf = append(buf, in.str[i]) - } - return buf -} - -func (in *input) copySlice(buf []byte, b, e int) int { - if in.bytes == nil { - return copy(buf, in.str[b:e]) - } - return copy(buf, in.bytes[b:e]) -} - -func (in *input) charinfoNFC(p int) (uint16, int) { - if in.bytes == nil { - return nfcData.lookupString(in.str[p:]) - } - return nfcData.lookup(in.bytes[p:]) -} - -func (in *input) charinfoNFKC(p int) (uint16, int) { - if in.bytes == nil { - return nfkcData.lookupString(in.str[p:]) - } - return nfkcData.lookup(in.bytes[p:]) -} - -func (in *input) hangul(p int) (r rune) { - var size int - if in.bytes == nil { - if !isHangulString(in.str[p:]) { - return 0 - } - r, size = utf8.DecodeRuneInString(in.str[p:]) - } else { - if !isHangul(in.bytes[p:]) { - return 0 - } - r, size = utf8.DecodeRune(in.bytes[p:]) - } - if size != hangulUTF8Size { - return 0 - } - return r -} diff --git a/vendor/golang.org/x/text/unicode/norm/iter.go b/vendor/golang.org/x/text/unicode/norm/iter.go deleted file mode 100644 index ce17f96c2..000000000 --- a/vendor/golang.org/x/text/unicode/norm/iter.go +++ /dev/null @@ -1,457 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package norm - -import ( - "fmt" - "unicode/utf8" -) - -// MaxSegmentSize is the maximum size of a byte buffer needed to consider any -// sequence of starter and non-starter runes for the purpose of normalization. -const MaxSegmentSize = maxByteBufferSize - -// An Iter iterates over a string or byte slice, while normalizing it -// to a given Form. -type Iter struct { - rb reorderBuffer - buf [maxByteBufferSize]byte - info Properties // first character saved from previous iteration - next iterFunc // implementation of next depends on form - asciiF iterFunc - - p int // current position in input source - multiSeg []byte // remainder of multi-segment decomposition -} - -type iterFunc func(*Iter) []byte - -// Init initializes i to iterate over src after normalizing it to Form f. -func (i *Iter) Init(f Form, src []byte) { - i.p = 0 - if len(src) == 0 { - i.setDone() - i.rb.nsrc = 0 - return - } - i.multiSeg = nil - i.rb.init(f, src) - i.next = i.rb.f.nextMain - i.asciiF = nextASCIIBytes - i.info = i.rb.f.info(i.rb.src, i.p) - i.rb.ss.first(i.info) -} - -// InitString initializes i to iterate over src after normalizing it to Form f. -func (i *Iter) InitString(f Form, src string) { - i.p = 0 - if len(src) == 0 { - i.setDone() - i.rb.nsrc = 0 - return - } - i.multiSeg = nil - i.rb.initString(f, src) - i.next = i.rb.f.nextMain - i.asciiF = nextASCIIString - i.info = i.rb.f.info(i.rb.src, i.p) - i.rb.ss.first(i.info) -} - -// Seek sets the segment to be returned by the next call to Next to start -// at position p. It is the responsibility of the caller to set p to the -// start of a segment. -func (i *Iter) Seek(offset int64, whence int) (int64, error) { - var abs int64 - switch whence { - case 0: - abs = offset - case 1: - abs = int64(i.p) + offset - case 2: - abs = int64(i.rb.nsrc) + offset - default: - return 0, fmt.Errorf("norm: invalid whence") - } - if abs < 0 { - return 0, fmt.Errorf("norm: negative position") - } - if int(abs) >= i.rb.nsrc { - i.setDone() - return int64(i.p), nil - } - i.p = int(abs) - i.multiSeg = nil - i.next = i.rb.f.nextMain - i.info = i.rb.f.info(i.rb.src, i.p) - i.rb.ss.first(i.info) - return abs, nil -} - -// returnSlice returns a slice of the underlying input type as a byte slice. -// If the underlying is of type []byte, it will simply return a slice. -// If the underlying is of type string, it will copy the slice to the buffer -// and return that. -func (i *Iter) returnSlice(a, b int) []byte { - if i.rb.src.bytes == nil { - return i.buf[:copy(i.buf[:], i.rb.src.str[a:b])] - } - return i.rb.src.bytes[a:b] -} - -// Pos returns the byte position at which the next call to Next will commence processing. -func (i *Iter) Pos() int { - return i.p -} - -func (i *Iter) setDone() { - i.next = nextDone - i.p = i.rb.nsrc -} - -// Done returns true if there is no more input to process. -func (i *Iter) Done() bool { - return i.p >= i.rb.nsrc -} - -// Next returns f(i.input[i.Pos():n]), where n is a boundary of i.input. -// For any input a and b for which f(a) == f(b), subsequent calls -// to Next will return the same segments. -// Modifying runes are grouped together with the preceding starter, if such a starter exists. -// Although not guaranteed, n will typically be the smallest possible n. -func (i *Iter) Next() []byte { - return i.next(i) -} - -func nextASCIIBytes(i *Iter) []byte { - p := i.p + 1 - if p >= i.rb.nsrc { - i.setDone() - return i.rb.src.bytes[i.p:p] - } - if i.rb.src.bytes[p] < utf8.RuneSelf { - p0 := i.p - i.p = p - return i.rb.src.bytes[p0:p] - } - i.info = i.rb.f.info(i.rb.src, i.p) - i.next = i.rb.f.nextMain - return i.next(i) -} - -func nextASCIIString(i *Iter) []byte { - p := i.p + 1 - if p >= i.rb.nsrc { - i.buf[0] = i.rb.src.str[i.p] - i.setDone() - return i.buf[:1] - } - if i.rb.src.str[p] < utf8.RuneSelf { - i.buf[0] = i.rb.src.str[i.p] - i.p = p - return i.buf[:1] - } - i.info = i.rb.f.info(i.rb.src, i.p) - i.next = i.rb.f.nextMain - return i.next(i) -} - -func nextHangul(i *Iter) []byte { - p := i.p - next := p + hangulUTF8Size - if next >= i.rb.nsrc { - i.setDone() - } else if i.rb.src.hangul(next) == 0 { - i.rb.ss.next(i.info) - i.info = i.rb.f.info(i.rb.src, i.p) - i.next = i.rb.f.nextMain - return i.next(i) - } - i.p = next - return i.buf[:decomposeHangul(i.buf[:], i.rb.src.hangul(p))] -} - -func nextDone(i *Iter) []byte { - return nil -} - -// nextMulti is used for iterating over multi-segment decompositions -// for decomposing normal forms. -func nextMulti(i *Iter) []byte { - j := 0 - d := i.multiSeg - // skip first rune - for j = 1; j < len(d) && !utf8.RuneStart(d[j]); j++ { - } - for j < len(d) { - info := i.rb.f.info(input{bytes: d}, j) - if info.BoundaryBefore() { - i.multiSeg = d[j:] - return d[:j] - } - j += int(info.size) - } - // treat last segment as normal decomposition - i.next = i.rb.f.nextMain - return i.next(i) -} - -// nextMultiNorm is used for iterating over multi-segment decompositions -// for composing normal forms. -func nextMultiNorm(i *Iter) []byte { - j := 0 - d := i.multiSeg - for j < len(d) { - info := i.rb.f.info(input{bytes: d}, j) - if info.BoundaryBefore() { - i.rb.compose() - seg := i.buf[:i.rb.flushCopy(i.buf[:])] - i.rb.insertUnsafe(input{bytes: d}, j, info) - i.multiSeg = d[j+int(info.size):] - return seg - } - i.rb.insertUnsafe(input{bytes: d}, j, info) - j += int(info.size) - } - i.multiSeg = nil - i.next = nextComposed - return doNormComposed(i) -} - -// nextDecomposed is the implementation of Next for forms NFD and NFKD. -func nextDecomposed(i *Iter) (next []byte) { - outp := 0 - inCopyStart, outCopyStart := i.p, 0 - for { - if sz := int(i.info.size); sz <= 1 { - i.rb.ss = 0 - p := i.p - i.p++ // ASCII or illegal byte. Either way, advance by 1. - if i.p >= i.rb.nsrc { - i.setDone() - return i.returnSlice(p, i.p) - } else if i.rb.src._byte(i.p) < utf8.RuneSelf { - i.next = i.asciiF - return i.returnSlice(p, i.p) - } - outp++ - } else if d := i.info.Decomposition(); d != nil { - // Note: If leading CCC != 0, then len(d) == 2 and last is also non-zero. - // Case 1: there is a leftover to copy. In this case the decomposition - // must begin with a modifier and should always be appended. - // Case 2: no leftover. Simply return d if followed by a ccc == 0 value. - p := outp + len(d) - if outp > 0 { - i.rb.src.copySlice(i.buf[outCopyStart:], inCopyStart, i.p) - // TODO: this condition should not be possible, but we leave it - // in for defensive purposes. - if p > len(i.buf) { - return i.buf[:outp] - } - } else if i.info.multiSegment() { - // outp must be 0 as multi-segment decompositions always - // start a new segment. - if i.multiSeg == nil { - i.multiSeg = d - i.next = nextMulti - return nextMulti(i) - } - // We are in the last segment. Treat as normal decomposition. - d = i.multiSeg - i.multiSeg = nil - p = len(d) - } - prevCC := i.info.tccc - if i.p += sz; i.p >= i.rb.nsrc { - i.setDone() - i.info = Properties{} // Force BoundaryBefore to succeed. - } else { - i.info = i.rb.f.info(i.rb.src, i.p) - } - switch i.rb.ss.next(i.info) { - case ssOverflow: - i.next = nextCGJDecompose - fallthrough - case ssStarter: - if outp > 0 { - copy(i.buf[outp:], d) - return i.buf[:p] - } - return d - } - copy(i.buf[outp:], d) - outp = p - inCopyStart, outCopyStart = i.p, outp - if i.info.ccc < prevCC { - goto doNorm - } - continue - } else if r := i.rb.src.hangul(i.p); r != 0 { - outp = decomposeHangul(i.buf[:], r) - i.p += hangulUTF8Size - inCopyStart, outCopyStart = i.p, outp - if i.p >= i.rb.nsrc { - i.setDone() - break - } else if i.rb.src.hangul(i.p) != 0 { - i.next = nextHangul - return i.buf[:outp] - } - } else { - p := outp + sz - if p > len(i.buf) { - break - } - outp = p - i.p += sz - } - if i.p >= i.rb.nsrc { - i.setDone() - break - } - prevCC := i.info.tccc - i.info = i.rb.f.info(i.rb.src, i.p) - if v := i.rb.ss.next(i.info); v == ssStarter { - break - } else if v == ssOverflow { - i.next = nextCGJDecompose - break - } - if i.info.ccc < prevCC { - goto doNorm - } - } - if outCopyStart == 0 { - return i.returnSlice(inCopyStart, i.p) - } else if inCopyStart < i.p { - i.rb.src.copySlice(i.buf[outCopyStart:], inCopyStart, i.p) - } - return i.buf[:outp] -doNorm: - // Insert what we have decomposed so far in the reorderBuffer. - // As we will only reorder, there will always be enough room. - i.rb.src.copySlice(i.buf[outCopyStart:], inCopyStart, i.p) - i.rb.insertDecomposed(i.buf[0:outp]) - return doNormDecomposed(i) -} - -func doNormDecomposed(i *Iter) []byte { - for { - i.rb.insertUnsafe(i.rb.src, i.p, i.info) - if i.p += int(i.info.size); i.p >= i.rb.nsrc { - i.setDone() - break - } - i.info = i.rb.f.info(i.rb.src, i.p) - if i.info.ccc == 0 { - break - } - if s := i.rb.ss.next(i.info); s == ssOverflow { - i.next = nextCGJDecompose - break - } - } - // new segment or too many combining characters: exit normalization - return i.buf[:i.rb.flushCopy(i.buf[:])] -} - -func nextCGJDecompose(i *Iter) []byte { - i.rb.ss = 0 - i.rb.insertCGJ() - i.next = nextDecomposed - i.rb.ss.first(i.info) - buf := doNormDecomposed(i) - return buf -} - -// nextComposed is the implementation of Next for forms NFC and NFKC. -func nextComposed(i *Iter) []byte { - outp, startp := 0, i.p - var prevCC uint8 - for { - if !i.info.isYesC() { - goto doNorm - } - prevCC = i.info.tccc - sz := int(i.info.size) - if sz == 0 { - sz = 1 // illegal rune: copy byte-by-byte - } - p := outp + sz - if p > len(i.buf) { - break - } - outp = p - i.p += sz - if i.p >= i.rb.nsrc { - i.setDone() - break - } else if i.rb.src._byte(i.p) < utf8.RuneSelf { - i.rb.ss = 0 - i.next = i.asciiF - break - } - i.info = i.rb.f.info(i.rb.src, i.p) - if v := i.rb.ss.next(i.info); v == ssStarter { - break - } else if v == ssOverflow { - i.next = nextCGJCompose - break - } - if i.info.ccc < prevCC { - goto doNorm - } - } - return i.returnSlice(startp, i.p) -doNorm: - // reset to start position - i.p = startp - i.info = i.rb.f.info(i.rb.src, i.p) - i.rb.ss.first(i.info) - if i.info.multiSegment() { - d := i.info.Decomposition() - info := i.rb.f.info(input{bytes: d}, 0) - i.rb.insertUnsafe(input{bytes: d}, 0, info) - i.multiSeg = d[int(info.size):] - i.next = nextMultiNorm - return nextMultiNorm(i) - } - i.rb.ss.first(i.info) - i.rb.insertUnsafe(i.rb.src, i.p, i.info) - return doNormComposed(i) -} - -func doNormComposed(i *Iter) []byte { - // First rune should already be inserted. - for { - if i.p += int(i.info.size); i.p >= i.rb.nsrc { - i.setDone() - break - } - i.info = i.rb.f.info(i.rb.src, i.p) - if s := i.rb.ss.next(i.info); s == ssStarter { - break - } else if s == ssOverflow { - i.next = nextCGJCompose - break - } - i.rb.insertUnsafe(i.rb.src, i.p, i.info) - } - i.rb.compose() - seg := i.buf[:i.rb.flushCopy(i.buf[:])] - return seg -} - -func nextCGJCompose(i *Iter) []byte { - i.rb.ss = 0 // instead of first - i.rb.insertCGJ() - i.next = nextComposed - // Note that we treat any rune with nLeadingNonStarters > 0 as a non-starter, - // even if they are not. This is particularly dubious for U+FF9E and UFF9A. - // If we ever change that, insert a check here. - i.rb.ss.first(i.info) - i.rb.insertUnsafe(i.rb.src, i.p, i.info) - return doNormComposed(i) -} diff --git a/vendor/golang.org/x/text/unicode/norm/maketables.go b/vendor/golang.org/x/text/unicode/norm/maketables.go deleted file mode 100644 index 8d418160c..000000000 --- a/vendor/golang.org/x/text/unicode/norm/maketables.go +++ /dev/null @@ -1,976 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// Normalization table generator. -// Data read from the web. -// See forminfo.go for a description of the trie values associated with each rune. - -package main - -import ( - "bytes" - "flag" - "fmt" - "io" - "log" - "sort" - "strconv" - "strings" - - "golang.org/x/text/internal/gen" - "golang.org/x/text/internal/triegen" - "golang.org/x/text/internal/ucd" -) - -func main() { - gen.Init() - loadUnicodeData() - compactCCC() - loadCompositionExclusions() - completeCharFields(FCanonical) - completeCharFields(FCompatibility) - computeNonStarterCounts() - verifyComputed() - printChars() - testDerived() - printTestdata() - makeTables() -} - -var ( - tablelist = flag.String("tables", - "all", - "comma-separated list of which tables to generate; "+ - "can be 'decomp', 'recomp', 'info' and 'all'") - test = flag.Bool("test", - false, - "test existing tables against DerivedNormalizationProps and generate test data for regression testing") - verbose = flag.Bool("verbose", - false, - "write data to stdout as it is parsed") -) - -const MaxChar = 0x10FFFF // anything above this shouldn't exist - -// Quick Check properties of runes allow us to quickly -// determine whether a rune may occur in a normal form. -// For a given normal form, a rune may be guaranteed to occur -// verbatim (QC=Yes), may or may not combine with another -// rune (QC=Maybe), or may not occur (QC=No). -type QCResult int - -const ( - QCUnknown QCResult = iota - QCYes - QCNo - QCMaybe -) - -func (r QCResult) String() string { - switch r { - case QCYes: - return "Yes" - case QCNo: - return "No" - case QCMaybe: - return "Maybe" - } - return "***UNKNOWN***" -} - -const ( - FCanonical = iota // NFC or NFD - FCompatibility // NFKC or NFKD - FNumberOfFormTypes -) - -const ( - MComposed = iota // NFC or NFKC - MDecomposed // NFD or NFKD - MNumberOfModes -) - -// This contains only the properties we're interested in. -type Char struct { - name string - codePoint rune // if zero, this index is not a valid code point. - ccc uint8 // canonical combining class - origCCC uint8 - excludeInComp bool // from CompositionExclusions.txt - compatDecomp bool // it has a compatibility expansion - - nTrailingNonStarters uint8 - nLeadingNonStarters uint8 // must be equal to trailing if non-zero - - forms [FNumberOfFormTypes]FormInfo // For FCanonical and FCompatibility - - state State -} - -var chars = make([]Char, MaxChar+1) -var cccMap = make(map[uint8]uint8) - -func (c Char) String() string { - buf := new(bytes.Buffer) - - fmt.Fprintf(buf, "%U [%s]:\n", c.codePoint, c.name) - fmt.Fprintf(buf, " ccc: %v\n", c.ccc) - fmt.Fprintf(buf, " excludeInComp: %v\n", c.excludeInComp) - fmt.Fprintf(buf, " compatDecomp: %v\n", c.compatDecomp) - fmt.Fprintf(buf, " state: %v\n", c.state) - fmt.Fprintf(buf, " NFC:\n") - fmt.Fprint(buf, c.forms[FCanonical]) - fmt.Fprintf(buf, " NFKC:\n") - fmt.Fprint(buf, c.forms[FCompatibility]) - - return buf.String() -} - -// In UnicodeData.txt, some ranges are marked like this: -// 3400;;Lo;0;L;;;;;N;;;;; -// 4DB5;;Lo;0;L;;;;;N;;;;; -// parseCharacter keeps a state variable indicating the weirdness. -type State int - -const ( - SNormal State = iota // known to be zero for the type - SFirst - SLast - SMissing -) - -var lastChar = rune('\u0000') - -func (c Char) isValid() bool { - return c.codePoint != 0 && c.state != SMissing -} - -type FormInfo struct { - quickCheck [MNumberOfModes]QCResult // index: MComposed or MDecomposed - verified [MNumberOfModes]bool // index: MComposed or MDecomposed - - combinesForward bool // May combine with rune on the right - combinesBackward bool // May combine with rune on the left - isOneWay bool // Never appears in result - inDecomp bool // Some decompositions result in this char. - decomp Decomposition - expandedDecomp Decomposition -} - -func (f FormInfo) String() string { - buf := bytes.NewBuffer(make([]byte, 0)) - - fmt.Fprintf(buf, " quickCheck[C]: %v\n", f.quickCheck[MComposed]) - fmt.Fprintf(buf, " quickCheck[D]: %v\n", f.quickCheck[MDecomposed]) - fmt.Fprintf(buf, " cmbForward: %v\n", f.combinesForward) - fmt.Fprintf(buf, " cmbBackward: %v\n", f.combinesBackward) - fmt.Fprintf(buf, " isOneWay: %v\n", f.isOneWay) - fmt.Fprintf(buf, " inDecomp: %v\n", f.inDecomp) - fmt.Fprintf(buf, " decomposition: %X\n", f.decomp) - fmt.Fprintf(buf, " expandedDecomp: %X\n", f.expandedDecomp) - - return buf.String() -} - -type Decomposition []rune - -func parseDecomposition(s string, skipfirst bool) (a []rune, err error) { - decomp := strings.Split(s, " ") - if len(decomp) > 0 && skipfirst { - decomp = decomp[1:] - } - for _, d := range decomp { - point, err := strconv.ParseUint(d, 16, 64) - if err != nil { - return a, err - } - a = append(a, rune(point)) - } - return a, nil -} - -func loadUnicodeData() { - f := gen.OpenUCDFile("UnicodeData.txt") - defer f.Close() - p := ucd.New(f) - for p.Next() { - r := p.Rune(ucd.CodePoint) - char := &chars[r] - - char.ccc = uint8(p.Uint(ucd.CanonicalCombiningClass)) - decmap := p.String(ucd.DecompMapping) - - exp, err := parseDecomposition(decmap, false) - isCompat := false - if err != nil { - if len(decmap) > 0 { - exp, err = parseDecomposition(decmap, true) - if err != nil { - log.Fatalf(`%U: bad decomp |%v|: "%s"`, r, decmap, err) - } - isCompat = true - } - } - - char.name = p.String(ucd.Name) - char.codePoint = r - char.forms[FCompatibility].decomp = exp - if !isCompat { - char.forms[FCanonical].decomp = exp - } else { - char.compatDecomp = true - } - if len(decmap) > 0 { - char.forms[FCompatibility].decomp = exp - } - } - if err := p.Err(); err != nil { - log.Fatal(err) - } -} - -// compactCCC converts the sparse set of CCC values to a continguous one, -// reducing the number of bits needed from 8 to 6. -func compactCCC() { - m := make(map[uint8]uint8) - for i := range chars { - c := &chars[i] - m[c.ccc] = 0 - } - cccs := []int{} - for v, _ := range m { - cccs = append(cccs, int(v)) - } - sort.Ints(cccs) - for i, c := range cccs { - cccMap[uint8(i)] = uint8(c) - m[uint8(c)] = uint8(i) - } - for i := range chars { - c := &chars[i] - c.origCCC = c.ccc - c.ccc = m[c.ccc] - } - if len(m) >= 1<<6 { - log.Fatalf("too many difference CCC values: %d >= 64", len(m)) - } -} - -// CompositionExclusions.txt has form: -// 0958 # ... -// See http://unicode.org/reports/tr44/ for full explanation -func loadCompositionExclusions() { - f := gen.OpenUCDFile("CompositionExclusions.txt") - defer f.Close() - p := ucd.New(f) - for p.Next() { - c := &chars[p.Rune(0)] - if c.excludeInComp { - log.Fatalf("%U: Duplicate entry in exclusions.", c.codePoint) - } - c.excludeInComp = true - } - if e := p.Err(); e != nil { - log.Fatal(e) - } -} - -// hasCompatDecomp returns true if any of the recursive -// decompositions contains a compatibility expansion. -// In this case, the character may not occur in NFK*. -func hasCompatDecomp(r rune) bool { - c := &chars[r] - if c.compatDecomp { - return true - } - for _, d := range c.forms[FCompatibility].decomp { - if hasCompatDecomp(d) { - return true - } - } - return false -} - -// Hangul related constants. -const ( - HangulBase = 0xAC00 - HangulEnd = 0xD7A4 // hangulBase + Jamo combinations (19 * 21 * 28) - - JamoLBase = 0x1100 - JamoLEnd = 0x1113 - JamoVBase = 0x1161 - JamoVEnd = 0x1176 - JamoTBase = 0x11A8 - JamoTEnd = 0x11C3 - - JamoLVTCount = 19 * 21 * 28 - JamoTCount = 28 -) - -func isHangul(r rune) bool { - return HangulBase <= r && r < HangulEnd -} - -func isHangulWithoutJamoT(r rune) bool { - if !isHangul(r) { - return false - } - r -= HangulBase - return r < JamoLVTCount && r%JamoTCount == 0 -} - -func ccc(r rune) uint8 { - return chars[r].ccc -} - -// Insert a rune in a buffer, ordered by Canonical Combining Class. -func insertOrdered(b Decomposition, r rune) Decomposition { - n := len(b) - b = append(b, 0) - cc := ccc(r) - if cc > 0 { - // Use bubble sort. - for ; n > 0; n-- { - if ccc(b[n-1]) <= cc { - break - } - b[n] = b[n-1] - } - } - b[n] = r - return b -} - -// Recursively decompose. -func decomposeRecursive(form int, r rune, d Decomposition) Decomposition { - dcomp := chars[r].forms[form].decomp - if len(dcomp) == 0 { - return insertOrdered(d, r) - } - for _, c := range dcomp { - d = decomposeRecursive(form, c, d) - } - return d -} - -func completeCharFields(form int) { - // Phase 0: pre-expand decomposition. - for i := range chars { - f := &chars[i].forms[form] - if len(f.decomp) == 0 { - continue - } - exp := make(Decomposition, 0) - for _, c := range f.decomp { - exp = decomposeRecursive(form, c, exp) - } - f.expandedDecomp = exp - } - - // Phase 1: composition exclusion, mark decomposition. - for i := range chars { - c := &chars[i] - f := &c.forms[form] - - // Marks script-specific exclusions and version restricted. - f.isOneWay = c.excludeInComp - - // Singletons - f.isOneWay = f.isOneWay || len(f.decomp) == 1 - - // Non-starter decompositions - if len(f.decomp) > 1 { - chk := c.ccc != 0 || chars[f.decomp[0]].ccc != 0 - f.isOneWay = f.isOneWay || chk - } - - // Runes that decompose into more than two runes. - f.isOneWay = f.isOneWay || len(f.decomp) > 2 - - if form == FCompatibility { - f.isOneWay = f.isOneWay || hasCompatDecomp(c.codePoint) - } - - for _, r := range f.decomp { - chars[r].forms[form].inDecomp = true - } - } - - // Phase 2: forward and backward combining. - for i := range chars { - c := &chars[i] - f := &c.forms[form] - - if !f.isOneWay && len(f.decomp) == 2 { - f0 := &chars[f.decomp[0]].forms[form] - f1 := &chars[f.decomp[1]].forms[form] - if !f0.isOneWay { - f0.combinesForward = true - } - if !f1.isOneWay { - f1.combinesBackward = true - } - } - if isHangulWithoutJamoT(rune(i)) { - f.combinesForward = true - } - } - - // Phase 3: quick check values. - for i := range chars { - c := &chars[i] - f := &c.forms[form] - - switch { - case len(f.decomp) > 0: - f.quickCheck[MDecomposed] = QCNo - case isHangul(rune(i)): - f.quickCheck[MDecomposed] = QCNo - default: - f.quickCheck[MDecomposed] = QCYes - } - switch { - case f.isOneWay: - f.quickCheck[MComposed] = QCNo - case (i & 0xffff00) == JamoLBase: - f.quickCheck[MComposed] = QCYes - if JamoLBase <= i && i < JamoLEnd { - f.combinesForward = true - } - if JamoVBase <= i && i < JamoVEnd { - f.quickCheck[MComposed] = QCMaybe - f.combinesBackward = true - f.combinesForward = true - } - if JamoTBase <= i && i < JamoTEnd { - f.quickCheck[MComposed] = QCMaybe - f.combinesBackward = true - } - case !f.combinesBackward: - f.quickCheck[MComposed] = QCYes - default: - f.quickCheck[MComposed] = QCMaybe - } - } -} - -func computeNonStarterCounts() { - // Phase 4: leading and trailing non-starter count - for i := range chars { - c := &chars[i] - - runes := []rune{rune(i)} - // We always use FCompatibility so that the CGJ insertion points do not - // change for repeated normalizations with different forms. - if exp := c.forms[FCompatibility].expandedDecomp; len(exp) > 0 { - runes = exp - } - // We consider runes that combine backwards to be non-starters for the - // purpose of Stream-Safe Text Processing. - for _, r := range runes { - if cr := &chars[r]; cr.ccc == 0 && !cr.forms[FCompatibility].combinesBackward { - break - } - c.nLeadingNonStarters++ - } - for i := len(runes) - 1; i >= 0; i-- { - if cr := &chars[runes[i]]; cr.ccc == 0 && !cr.forms[FCompatibility].combinesBackward { - break - } - c.nTrailingNonStarters++ - } - if c.nTrailingNonStarters > 3 { - log.Fatalf("%U: Decomposition with more than 3 (%d) trailing modifiers (%U)", i, c.nTrailingNonStarters, runes) - } - - if isHangul(rune(i)) { - c.nTrailingNonStarters = 2 - if isHangulWithoutJamoT(rune(i)) { - c.nTrailingNonStarters = 1 - } - } - - if l, t := c.nLeadingNonStarters, c.nTrailingNonStarters; l > 0 && l != t { - log.Fatalf("%U: number of leading and trailing non-starters should be equal (%d vs %d)", i, l, t) - } - if t := c.nTrailingNonStarters; t > 3 { - log.Fatalf("%U: number of trailing non-starters is %d > 3", t) - } - } -} - -func printBytes(w io.Writer, b []byte, name string) { - fmt.Fprintf(w, "// %s: %d bytes\n", name, len(b)) - fmt.Fprintf(w, "var %s = [...]byte {", name) - for i, c := range b { - switch { - case i%64 == 0: - fmt.Fprintf(w, "\n// Bytes %x - %x\n", i, i+63) - case i%8 == 0: - fmt.Fprintf(w, "\n") - } - fmt.Fprintf(w, "0x%.2X, ", c) - } - fmt.Fprint(w, "\n}\n\n") -} - -// See forminfo.go for format. -func makeEntry(f *FormInfo, c *Char) uint16 { - e := uint16(0) - if r := c.codePoint; HangulBase <= r && r < HangulEnd { - e |= 0x40 - } - if f.combinesForward { - e |= 0x20 - } - if f.quickCheck[MDecomposed] == QCNo { - e |= 0x4 - } - switch f.quickCheck[MComposed] { - case QCYes: - case QCNo: - e |= 0x10 - case QCMaybe: - e |= 0x18 - default: - log.Fatalf("Illegal quickcheck value %v.", f.quickCheck[MComposed]) - } - e |= uint16(c.nTrailingNonStarters) - return e -} - -// decompSet keeps track of unique decompositions, grouped by whether -// the decomposition is followed by a trailing and/or leading CCC. -type decompSet [7]map[string]bool - -const ( - normalDecomp = iota - firstMulti - firstCCC - endMulti - firstLeadingCCC - firstCCCZeroExcept - firstStarterWithNLead - lastDecomp -) - -var cname = []string{"firstMulti", "firstCCC", "endMulti", "firstLeadingCCC", "firstCCCZeroExcept", "firstStarterWithNLead", "lastDecomp"} - -func makeDecompSet() decompSet { - m := decompSet{} - for i := range m { - m[i] = make(map[string]bool) - } - return m -} -func (m *decompSet) insert(key int, s string) { - m[key][s] = true -} - -func printCharInfoTables(w io.Writer) int { - mkstr := func(r rune, f *FormInfo) (int, string) { - d := f.expandedDecomp - s := string([]rune(d)) - if max := 1 << 6; len(s) >= max { - const msg = "%U: too many bytes in decomposition: %d >= %d" - log.Fatalf(msg, r, len(s), max) - } - head := uint8(len(s)) - if f.quickCheck[MComposed] != QCYes { - head |= 0x40 - } - if f.combinesForward { - head |= 0x80 - } - s = string([]byte{head}) + s - - lccc := ccc(d[0]) - tccc := ccc(d[len(d)-1]) - cc := ccc(r) - if cc != 0 && lccc == 0 && tccc == 0 { - log.Fatalf("%U: trailing and leading ccc are 0 for non-zero ccc %d", r, cc) - } - if tccc < lccc && lccc != 0 { - const msg = "%U: lccc (%d) must be <= tcc (%d)" - log.Fatalf(msg, r, lccc, tccc) - } - index := normalDecomp - nTrail := chars[r].nTrailingNonStarters - nLead := chars[r].nLeadingNonStarters - if tccc > 0 || lccc > 0 || nTrail > 0 { - tccc <<= 2 - tccc |= nTrail - s += string([]byte{tccc}) - index = endMulti - for _, r := range d[1:] { - if ccc(r) == 0 { - index = firstCCC - } - } - if lccc > 0 || nLead > 0 { - s += string([]byte{lccc}) - if index == firstCCC { - log.Fatalf("%U: multi-segment decomposition not supported for decompositions with leading CCC != 0", r) - } - index = firstLeadingCCC - } - if cc != lccc { - if cc != 0 { - log.Fatalf("%U: for lccc != ccc, expected ccc to be 0; was %d", r, cc) - } - index = firstCCCZeroExcept - } - } else if len(d) > 1 { - index = firstMulti - } - return index, s - } - - decompSet := makeDecompSet() - const nLeadStr = "\x00\x01" // 0-byte length and tccc with nTrail. - decompSet.insert(firstStarterWithNLead, nLeadStr) - - // Store the uniqued decompositions in a byte buffer, - // preceded by their byte length. - for _, c := range chars { - for _, f := range c.forms { - if len(f.expandedDecomp) == 0 { - continue - } - if f.combinesBackward { - log.Fatalf("%U: combinesBackward and decompose", c.codePoint) - } - index, s := mkstr(c.codePoint, &f) - decompSet.insert(index, s) - } - } - - decompositions := bytes.NewBuffer(make([]byte, 0, 10000)) - size := 0 - positionMap := make(map[string]uint16) - decompositions.WriteString("\000") - fmt.Fprintln(w, "const (") - for i, m := range decompSet { - sa := []string{} - for s := range m { - sa = append(sa, s) - } - sort.Strings(sa) - for _, s := range sa { - p := decompositions.Len() - decompositions.WriteString(s) - positionMap[s] = uint16(p) - } - if cname[i] != "" { - fmt.Fprintf(w, "%s = 0x%X\n", cname[i], decompositions.Len()) - } - } - fmt.Fprintln(w, "maxDecomp = 0x8000") - fmt.Fprintln(w, ")") - b := decompositions.Bytes() - printBytes(w, b, "decomps") - size += len(b) - - varnames := []string{"nfc", "nfkc"} - for i := 0; i < FNumberOfFormTypes; i++ { - trie := triegen.NewTrie(varnames[i]) - - for r, c := range chars { - f := c.forms[i] - d := f.expandedDecomp - if len(d) != 0 { - _, key := mkstr(c.codePoint, &f) - trie.Insert(rune(r), uint64(positionMap[key])) - if c.ccc != ccc(d[0]) { - // We assume the lead ccc of a decomposition !=0 in this case. - if ccc(d[0]) == 0 { - log.Fatalf("Expected leading CCC to be non-zero; ccc is %d", c.ccc) - } - } - } else if c.nLeadingNonStarters > 0 && len(f.expandedDecomp) == 0 && c.ccc == 0 && !f.combinesBackward { - // Handle cases where it can't be detected that the nLead should be equal - // to nTrail. - trie.Insert(c.codePoint, uint64(positionMap[nLeadStr])) - } else if v := makeEntry(&f, &c)<<8 | uint16(c.ccc); v != 0 { - trie.Insert(c.codePoint, uint64(0x8000|v)) - } - } - sz, err := trie.Gen(w, triegen.Compact(&normCompacter{name: varnames[i]})) - if err != nil { - log.Fatal(err) - } - size += sz - } - return size -} - -func contains(sa []string, s string) bool { - for _, a := range sa { - if a == s { - return true - } - } - return false -} - -func makeTables() { - w := &bytes.Buffer{} - - size := 0 - if *tablelist == "" { - return - } - list := strings.Split(*tablelist, ",") - if *tablelist == "all" { - list = []string{"recomp", "info"} - } - - // Compute maximum decomposition size. - max := 0 - for _, c := range chars { - if n := len(string(c.forms[FCompatibility].expandedDecomp)); n > max { - max = n - } - } - - fmt.Fprintln(w, "const (") - fmt.Fprintln(w, "\t// Version is the Unicode edition from which the tables are derived.") - fmt.Fprintf(w, "\tVersion = %q\n", gen.UnicodeVersion()) - fmt.Fprintln(w) - fmt.Fprintln(w, "\t// MaxTransformChunkSize indicates the maximum number of bytes that Transform") - fmt.Fprintln(w, "\t// may need to write atomically for any Form. Making a destination buffer at") - fmt.Fprintln(w, "\t// least this size ensures that Transform can always make progress and that") - fmt.Fprintln(w, "\t// the user does not need to grow the buffer on an ErrShortDst.") - fmt.Fprintf(w, "\tMaxTransformChunkSize = %d+maxNonStarters*4\n", len(string(0x034F))+max) - fmt.Fprintln(w, ")\n") - - // Print the CCC remap table. - size += len(cccMap) - fmt.Fprintf(w, "var ccc = [%d]uint8{", len(cccMap)) - for i := 0; i < len(cccMap); i++ { - if i%8 == 0 { - fmt.Fprintln(w) - } - fmt.Fprintf(w, "%3d, ", cccMap[uint8(i)]) - } - fmt.Fprintln(w, "\n}\n") - - if contains(list, "info") { - size += printCharInfoTables(w) - } - - if contains(list, "recomp") { - // Note that we use 32 bit keys, instead of 64 bit. - // This clips the bits of three entries, but we know - // this won't cause a collision. The compiler will catch - // any changes made to UnicodeData.txt that introduces - // a collision. - // Note that the recomposition map for NFC and NFKC - // are identical. - - // Recomposition map - nrentries := 0 - for _, c := range chars { - f := c.forms[FCanonical] - if !f.isOneWay && len(f.decomp) > 0 { - nrentries++ - } - } - sz := nrentries * 8 - size += sz - fmt.Fprintf(w, "// recompMap: %d bytes (entries only)\n", sz) - fmt.Fprintln(w, "var recompMap = map[uint32]rune{") - for i, c := range chars { - f := c.forms[FCanonical] - d := f.decomp - if !f.isOneWay && len(d) > 0 { - key := uint32(uint16(d[0]))<<16 + uint32(uint16(d[1])) - fmt.Fprintf(w, "0x%.8X: 0x%.4X,\n", key, i) - } - } - fmt.Fprintf(w, "}\n\n") - } - - fmt.Fprintf(w, "// Total size of tables: %dKB (%d bytes)\n", (size+512)/1024, size) - gen.WriteGoFile("tables.go", "norm", w.Bytes()) -} - -func printChars() { - if *verbose { - for _, c := range chars { - if !c.isValid() || c.state == SMissing { - continue - } - fmt.Println(c) - } - } -} - -// verifyComputed does various consistency tests. -func verifyComputed() { - for i, c := range chars { - for _, f := range c.forms { - isNo := (f.quickCheck[MDecomposed] == QCNo) - if (len(f.decomp) > 0) != isNo && !isHangul(rune(i)) { - log.Fatalf("%U: NF*D QC must be No if rune decomposes", i) - } - - isMaybe := f.quickCheck[MComposed] == QCMaybe - if f.combinesBackward != isMaybe { - log.Fatalf("%U: NF*C QC must be Maybe if combinesBackward", i) - } - if len(f.decomp) > 0 && f.combinesForward && isMaybe { - log.Fatalf("%U: NF*C QC must be Yes or No if combinesForward and decomposes", i) - } - - if len(f.expandedDecomp) != 0 { - continue - } - if a, b := c.nLeadingNonStarters > 0, (c.ccc > 0 || f.combinesBackward); a != b { - // We accept these runes to be treated differently (it only affects - // segment breaking in iteration, most likely on improper use), but - // reconsider if more characters are added. - // U+FF9E HALFWIDTH KATAKANA VOICED SOUND MARK;Lm;0;L; 3099;;;;N;;;;; - // U+FF9F HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK;Lm;0;L; 309A;;;;N;;;;; - // U+3133 HANGUL LETTER KIYEOK-SIOS;Lo;0;L; 11AA;;;;N;HANGUL LETTER GIYEOG SIOS;;;; - // U+318E HANGUL LETTER ARAEAE;Lo;0;L; 11A1;;;;N;HANGUL LETTER ALAE AE;;;; - // U+FFA3 HALFWIDTH HANGUL LETTER KIYEOK-SIOS;Lo;0;L; 3133;;;;N;HALFWIDTH HANGUL LETTER GIYEOG SIOS;;;; - // U+FFDC HALFWIDTH HANGUL LETTER I;Lo;0;L; 3163;;;;N;;;;; - if i != 0xFF9E && i != 0xFF9F && !(0x3133 <= i && i <= 0x318E) && !(0xFFA3 <= i && i <= 0xFFDC) { - log.Fatalf("%U: nLead was %v; want %v", i, a, b) - } - } - } - nfc := c.forms[FCanonical] - nfkc := c.forms[FCompatibility] - if nfc.combinesBackward != nfkc.combinesBackward { - log.Fatalf("%U: Cannot combine combinesBackward\n", c.codePoint) - } - } -} - -// Use values in DerivedNormalizationProps.txt to compare against the -// values we computed. -// DerivedNormalizationProps.txt has form: -// 00C0..00C5 ; NFD_QC; N # ... -// 0374 ; NFD_QC; N # ... -// See http://unicode.org/reports/tr44/ for full explanation -func testDerived() { - f := gen.OpenUCDFile("DerivedNormalizationProps.txt") - defer f.Close() - p := ucd.New(f) - for p.Next() { - r := p.Rune(0) - c := &chars[r] - - var ftype, mode int - qt := p.String(1) - switch qt { - case "NFC_QC": - ftype, mode = FCanonical, MComposed - case "NFD_QC": - ftype, mode = FCanonical, MDecomposed - case "NFKC_QC": - ftype, mode = FCompatibility, MComposed - case "NFKD_QC": - ftype, mode = FCompatibility, MDecomposed - default: - continue - } - var qr QCResult - switch p.String(2) { - case "Y": - qr = QCYes - case "N": - qr = QCNo - case "M": - qr = QCMaybe - default: - log.Fatalf(`Unexpected quick check value "%s"`, p.String(2)) - } - if got := c.forms[ftype].quickCheck[mode]; got != qr { - log.Printf("%U: FAILED %s (was %v need %v)\n", r, qt, got, qr) - } - c.forms[ftype].verified[mode] = true - } - if err := p.Err(); err != nil { - log.Fatal(err) - } - // Any unspecified value must be QCYes. Verify this. - for i, c := range chars { - for j, fd := range c.forms { - for k, qr := range fd.quickCheck { - if !fd.verified[k] && qr != QCYes { - m := "%U: FAIL F:%d M:%d (was %v need Yes) %s\n" - log.Printf(m, i, j, k, qr, c.name) - } - } - } - } -} - -var testHeader = `const ( - Yes = iota - No - Maybe -) - -type formData struct { - qc uint8 - combinesForward bool - decomposition string -} - -type runeData struct { - r rune - ccc uint8 - nLead uint8 - nTrail uint8 - f [2]formData // 0: canonical; 1: compatibility -} - -func f(qc uint8, cf bool, dec string) [2]formData { - return [2]formData{{qc, cf, dec}, {qc, cf, dec}} -} - -func g(qc, qck uint8, cf, cfk bool, d, dk string) [2]formData { - return [2]formData{{qc, cf, d}, {qck, cfk, dk}} -} - -var testData = []runeData{ -` - -func printTestdata() { - type lastInfo struct { - ccc uint8 - nLead uint8 - nTrail uint8 - f string - } - - last := lastInfo{} - w := &bytes.Buffer{} - fmt.Fprintf(w, testHeader) - for r, c := range chars { - f := c.forms[FCanonical] - qc, cf, d := f.quickCheck[MComposed], f.combinesForward, string(f.expandedDecomp) - f = c.forms[FCompatibility] - qck, cfk, dk := f.quickCheck[MComposed], f.combinesForward, string(f.expandedDecomp) - s := "" - if d == dk && qc == qck && cf == cfk { - s = fmt.Sprintf("f(%s, %v, %q)", qc, cf, d) - } else { - s = fmt.Sprintf("g(%s, %s, %v, %v, %q, %q)", qc, qck, cf, cfk, d, dk) - } - current := lastInfo{c.ccc, c.nLeadingNonStarters, c.nTrailingNonStarters, s} - if last != current { - fmt.Fprintf(w, "\t{0x%x, %d, %d, %d, %s},\n", r, c.origCCC, c.nLeadingNonStarters, c.nTrailingNonStarters, s) - last = current - } - } - fmt.Fprintln(w, "}") - gen.WriteGoFile("data_test.go", "norm", w.Bytes()) -} diff --git a/vendor/golang.org/x/text/unicode/norm/normalize.go b/vendor/golang.org/x/text/unicode/norm/normalize.go deleted file mode 100644 index e28ac641a..000000000 --- a/vendor/golang.org/x/text/unicode/norm/normalize.go +++ /dev/null @@ -1,609 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Note: the file data_test.go that is generated should not be checked in. -//go:generate go run maketables.go triegen.go -//go:generate go test -tags test - -// Package norm contains types and functions for normalizing Unicode strings. -package norm // import "golang.org/x/text/unicode/norm" - -import ( - "unicode/utf8" - - "golang.org/x/text/transform" -) - -// A Form denotes a canonical representation of Unicode code points. -// The Unicode-defined normalization and equivalence forms are: -// -// NFC Unicode Normalization Form C -// NFD Unicode Normalization Form D -// NFKC Unicode Normalization Form KC -// NFKD Unicode Normalization Form KD -// -// For a Form f, this documentation uses the notation f(x) to mean -// the bytes or string x converted to the given form. -// A position n in x is called a boundary if conversion to the form can -// proceed independently on both sides: -// f(x) == append(f(x[0:n]), f(x[n:])...) -// -// References: http://unicode.org/reports/tr15/ and -// http://unicode.org/notes/tn5/. -type Form int - -const ( - NFC Form = iota - NFD - NFKC - NFKD -) - -// Bytes returns f(b). May return b if f(b) = b. -func (f Form) Bytes(b []byte) []byte { - src := inputBytes(b) - ft := formTable[f] - n, ok := ft.quickSpan(src, 0, len(b), true) - if ok { - return b - } - out := make([]byte, n, len(b)) - copy(out, b[0:n]) - rb := reorderBuffer{f: *ft, src: src, nsrc: len(b), out: out, flushF: appendFlush} - return doAppendInner(&rb, n) -} - -// String returns f(s). -func (f Form) String(s string) string { - src := inputString(s) - ft := formTable[f] - n, ok := ft.quickSpan(src, 0, len(s), true) - if ok { - return s - } - out := make([]byte, n, len(s)) - copy(out, s[0:n]) - rb := reorderBuffer{f: *ft, src: src, nsrc: len(s), out: out, flushF: appendFlush} - return string(doAppendInner(&rb, n)) -} - -// IsNormal returns true if b == f(b). -func (f Form) IsNormal(b []byte) bool { - src := inputBytes(b) - ft := formTable[f] - bp, ok := ft.quickSpan(src, 0, len(b), true) - if ok { - return true - } - rb := reorderBuffer{f: *ft, src: src, nsrc: len(b)} - rb.setFlusher(nil, cmpNormalBytes) - for bp < len(b) { - rb.out = b[bp:] - if bp = decomposeSegment(&rb, bp, true); bp < 0 { - return false - } - bp, _ = rb.f.quickSpan(rb.src, bp, len(b), true) - } - return true -} - -func cmpNormalBytes(rb *reorderBuffer) bool { - b := rb.out - for i := 0; i < rb.nrune; i++ { - info := rb.rune[i] - if int(info.size) > len(b) { - return false - } - p := info.pos - pe := p + info.size - for ; p < pe; p++ { - if b[0] != rb.byte[p] { - return false - } - b = b[1:] - } - } - return true -} - -// IsNormalString returns true if s == f(s). -func (f Form) IsNormalString(s string) bool { - src := inputString(s) - ft := formTable[f] - bp, ok := ft.quickSpan(src, 0, len(s), true) - if ok { - return true - } - rb := reorderBuffer{f: *ft, src: src, nsrc: len(s)} - rb.setFlusher(nil, func(rb *reorderBuffer) bool { - for i := 0; i < rb.nrune; i++ { - info := rb.rune[i] - if bp+int(info.size) > len(s) { - return false - } - p := info.pos - pe := p + info.size - for ; p < pe; p++ { - if s[bp] != rb.byte[p] { - return false - } - bp++ - } - } - return true - }) - for bp < len(s) { - if bp = decomposeSegment(&rb, bp, true); bp < 0 { - return false - } - bp, _ = rb.f.quickSpan(rb.src, bp, len(s), true) - } - return true -} - -// patchTail fixes a case where a rune may be incorrectly normalized -// if it is followed by illegal continuation bytes. It returns the -// patched buffer and whether the decomposition is still in progress. -func patchTail(rb *reorderBuffer) bool { - info, p := lastRuneStart(&rb.f, rb.out) - if p == -1 || info.size == 0 { - return true - } - end := p + int(info.size) - extra := len(rb.out) - end - if extra > 0 { - // Potentially allocating memory. However, this only - // happens with ill-formed UTF-8. - x := make([]byte, 0) - x = append(x, rb.out[len(rb.out)-extra:]...) - rb.out = rb.out[:end] - decomposeToLastBoundary(rb) - rb.doFlush() - rb.out = append(rb.out, x...) - return false - } - buf := rb.out[p:] - rb.out = rb.out[:p] - decomposeToLastBoundary(rb) - if s := rb.ss.next(info); s == ssStarter { - rb.doFlush() - rb.ss.first(info) - } else if s == ssOverflow { - rb.doFlush() - rb.insertCGJ() - rb.ss = 0 - } - rb.insertUnsafe(inputBytes(buf), 0, info) - return true -} - -func appendQuick(rb *reorderBuffer, i int) int { - if rb.nsrc == i { - return i - } - end, _ := rb.f.quickSpan(rb.src, i, rb.nsrc, true) - rb.out = rb.src.appendSlice(rb.out, i, end) - return end -} - -// Append returns f(append(out, b...)). -// The buffer out must be nil, empty, or equal to f(out). -func (f Form) Append(out []byte, src ...byte) []byte { - return f.doAppend(out, inputBytes(src), len(src)) -} - -func (f Form) doAppend(out []byte, src input, n int) []byte { - if n == 0 { - return out - } - ft := formTable[f] - // Attempt to do a quickSpan first so we can avoid initializing the reorderBuffer. - if len(out) == 0 { - p, _ := ft.quickSpan(src, 0, n, true) - out = src.appendSlice(out, 0, p) - if p == n { - return out - } - rb := reorderBuffer{f: *ft, src: src, nsrc: n, out: out, flushF: appendFlush} - return doAppendInner(&rb, p) - } - rb := reorderBuffer{f: *ft, src: src, nsrc: n} - return doAppend(&rb, out, 0) -} - -func doAppend(rb *reorderBuffer, out []byte, p int) []byte { - rb.setFlusher(out, appendFlush) - src, n := rb.src, rb.nsrc - doMerge := len(out) > 0 - if q := src.skipContinuationBytes(p); q > p { - // Move leading non-starters to destination. - rb.out = src.appendSlice(rb.out, p, q) - p = q - doMerge = patchTail(rb) - } - fd := &rb.f - if doMerge { - var info Properties - if p < n { - info = fd.info(src, p) - if !info.BoundaryBefore() || info.nLeadingNonStarters() > 0 { - if p == 0 { - decomposeToLastBoundary(rb) - } - p = decomposeSegment(rb, p, true) - } - } - if info.size == 0 { - rb.doFlush() - // Append incomplete UTF-8 encoding. - return src.appendSlice(rb.out, p, n) - } - if rb.nrune > 0 { - return doAppendInner(rb, p) - } - } - p = appendQuick(rb, p) - return doAppendInner(rb, p) -} - -func doAppendInner(rb *reorderBuffer, p int) []byte { - for n := rb.nsrc; p < n; { - p = decomposeSegment(rb, p, true) - p = appendQuick(rb, p) - } - return rb.out -} - -// AppendString returns f(append(out, []byte(s))). -// The buffer out must be nil, empty, or equal to f(out). -func (f Form) AppendString(out []byte, src string) []byte { - return f.doAppend(out, inputString(src), len(src)) -} - -// QuickSpan returns a boundary n such that b[0:n] == f(b[0:n]). -// It is not guaranteed to return the largest such n. -func (f Form) QuickSpan(b []byte) int { - n, _ := formTable[f].quickSpan(inputBytes(b), 0, len(b), true) - return n -} - -// Span implements transform.SpanningTransformer. It returns a boundary n such -// that b[0:n] == f(b[0:n]). It is not guaranteed to return the largest such n. -func (f Form) Span(b []byte, atEOF bool) (n int, err error) { - n, ok := formTable[f].quickSpan(inputBytes(b), 0, len(b), atEOF) - if n < len(b) { - if !ok { - err = transform.ErrEndOfSpan - } else { - err = transform.ErrShortSrc - } - } - return n, err -} - -// SpanString returns a boundary n such that s[0:n] == f(s[0:n]). -// It is not guaranteed to return the largest such n. -func (f Form) SpanString(s string, atEOF bool) (n int, err error) { - n, ok := formTable[f].quickSpan(inputString(s), 0, len(s), atEOF) - if n < len(s) { - if !ok { - err = transform.ErrEndOfSpan - } else { - err = transform.ErrShortSrc - } - } - return n, err -} - -// quickSpan returns a boundary n such that src[0:n] == f(src[0:n]) and -// whether any non-normalized parts were found. If atEOF is false, n will -// not point past the last segment if this segment might be become -// non-normalized by appending other runes. -func (f *formInfo) quickSpan(src input, i, end int, atEOF bool) (n int, ok bool) { - var lastCC uint8 - ss := streamSafe(0) - lastSegStart := i - for n = end; i < n; { - if j := src.skipASCII(i, n); i != j { - i = j - lastSegStart = i - 1 - lastCC = 0 - ss = 0 - continue - } - info := f.info(src, i) - if info.size == 0 { - if atEOF { - // include incomplete runes - return n, true - } - return lastSegStart, true - } - // This block needs to be before the next, because it is possible to - // have an overflow for runes that are starters (e.g. with U+FF9E). - switch ss.next(info) { - case ssStarter: - lastSegStart = i - case ssOverflow: - return lastSegStart, false - case ssSuccess: - if lastCC > info.ccc { - return lastSegStart, false - } - } - if f.composing { - if !info.isYesC() { - break - } - } else { - if !info.isYesD() { - break - } - } - lastCC = info.ccc - i += int(info.size) - } - if i == n { - if !atEOF { - n = lastSegStart - } - return n, true - } - return lastSegStart, false -} - -// QuickSpanString returns a boundary n such that s[0:n] == f(s[0:n]). -// It is not guaranteed to return the largest such n. -func (f Form) QuickSpanString(s string) int { - n, _ := formTable[f].quickSpan(inputString(s), 0, len(s), true) - return n -} - -// FirstBoundary returns the position i of the first boundary in b -// or -1 if b contains no boundary. -func (f Form) FirstBoundary(b []byte) int { - return f.firstBoundary(inputBytes(b), len(b)) -} - -func (f Form) firstBoundary(src input, nsrc int) int { - i := src.skipContinuationBytes(0) - if i >= nsrc { - return -1 - } - fd := formTable[f] - ss := streamSafe(0) - // We should call ss.first here, but we can't as the first rune is - // skipped already. This means FirstBoundary can't really determine - // CGJ insertion points correctly. Luckily it doesn't have to. - for { - info := fd.info(src, i) - if info.size == 0 { - return -1 - } - if s := ss.next(info); s != ssSuccess { - return i - } - i += int(info.size) - if i >= nsrc { - if !info.BoundaryAfter() && !ss.isMax() { - return -1 - } - return nsrc - } - } -} - -// FirstBoundaryInString returns the position i of the first boundary in s -// or -1 if s contains no boundary. -func (f Form) FirstBoundaryInString(s string) int { - return f.firstBoundary(inputString(s), len(s)) -} - -// NextBoundary reports the index of the boundary between the first and next -// segment in b or -1 if atEOF is false and there are not enough bytes to -// determine this boundary. -func (f Form) NextBoundary(b []byte, atEOF bool) int { - return f.nextBoundary(inputBytes(b), len(b), atEOF) -} - -// NextBoundaryInString reports the index of the boundary between the first and -// next segment in b or -1 if atEOF is false and there are not enough bytes to -// determine this boundary. -func (f Form) NextBoundaryInString(s string, atEOF bool) int { - return f.nextBoundary(inputString(s), len(s), atEOF) -} - -func (f Form) nextBoundary(src input, nsrc int, atEOF bool) int { - if nsrc == 0 { - if atEOF { - return 0 - } - return -1 - } - fd := formTable[f] - info := fd.info(src, 0) - if info.size == 0 { - if atEOF { - return 1 - } - return -1 - } - ss := streamSafe(0) - ss.first(info) - - for i := int(info.size); i < nsrc; i += int(info.size) { - info = fd.info(src, i) - if info.size == 0 { - if atEOF { - return i - } - return -1 - } - // TODO: Using streamSafe to determine the boundary isn't the same as - // using BoundaryBefore. Determine which should be used. - if s := ss.next(info); s != ssSuccess { - return i - } - } - if !atEOF && !info.BoundaryAfter() && !ss.isMax() { - return -1 - } - return nsrc -} - -// LastBoundary returns the position i of the last boundary in b -// or -1 if b contains no boundary. -func (f Form) LastBoundary(b []byte) int { - return lastBoundary(formTable[f], b) -} - -func lastBoundary(fd *formInfo, b []byte) int { - i := len(b) - info, p := lastRuneStart(fd, b) - if p == -1 { - return -1 - } - if info.size == 0 { // ends with incomplete rune - if p == 0 { // starts with incomplete rune - return -1 - } - i = p - info, p = lastRuneStart(fd, b[:i]) - if p == -1 { // incomplete UTF-8 encoding or non-starter bytes without a starter - return i - } - } - if p+int(info.size) != i { // trailing non-starter bytes: illegal UTF-8 - return i - } - if info.BoundaryAfter() { - return i - } - ss := streamSafe(0) - v := ss.backwards(info) - for i = p; i >= 0 && v != ssStarter; i = p { - info, p = lastRuneStart(fd, b[:i]) - if v = ss.backwards(info); v == ssOverflow { - break - } - if p+int(info.size) != i { - if p == -1 { // no boundary found - return -1 - } - return i // boundary after an illegal UTF-8 encoding - } - } - return i -} - -// decomposeSegment scans the first segment in src into rb. It inserts 0x034f -// (Grapheme Joiner) when it encounters a sequence of more than 30 non-starters -// and returns the number of bytes consumed from src or iShortDst or iShortSrc. -func decomposeSegment(rb *reorderBuffer, sp int, atEOF bool) int { - // Force one character to be consumed. - info := rb.f.info(rb.src, sp) - if info.size == 0 { - return 0 - } - if s := rb.ss.next(info); s == ssStarter { - // TODO: this could be removed if we don't support merging. - if rb.nrune > 0 { - goto end - } - } else if s == ssOverflow { - rb.insertCGJ() - goto end - } - if err := rb.insertFlush(rb.src, sp, info); err != iSuccess { - return int(err) - } - for { - sp += int(info.size) - if sp >= rb.nsrc { - if !atEOF && !info.BoundaryAfter() { - return int(iShortSrc) - } - break - } - info = rb.f.info(rb.src, sp) - if info.size == 0 { - if !atEOF { - return int(iShortSrc) - } - break - } - if s := rb.ss.next(info); s == ssStarter { - break - } else if s == ssOverflow { - rb.insertCGJ() - break - } - if err := rb.insertFlush(rb.src, sp, info); err != iSuccess { - return int(err) - } - } -end: - if !rb.doFlush() { - return int(iShortDst) - } - return sp -} - -// lastRuneStart returns the runeInfo and position of the last -// rune in buf or the zero runeInfo and -1 if no rune was found. -func lastRuneStart(fd *formInfo, buf []byte) (Properties, int) { - p := len(buf) - 1 - for ; p >= 0 && !utf8.RuneStart(buf[p]); p-- { - } - if p < 0 { - return Properties{}, -1 - } - return fd.info(inputBytes(buf), p), p -} - -// decomposeToLastBoundary finds an open segment at the end of the buffer -// and scans it into rb. Returns the buffer minus the last segment. -func decomposeToLastBoundary(rb *reorderBuffer) { - fd := &rb.f - info, i := lastRuneStart(fd, rb.out) - if int(info.size) != len(rb.out)-i { - // illegal trailing continuation bytes - return - } - if info.BoundaryAfter() { - return - } - var add [maxNonStarters + 1]Properties // stores runeInfo in reverse order - padd := 0 - ss := streamSafe(0) - p := len(rb.out) - for { - add[padd] = info - v := ss.backwards(info) - if v == ssOverflow { - // Note that if we have an overflow, it the string we are appending to - // is not correctly normalized. In this case the behavior is undefined. - break - } - padd++ - p -= int(info.size) - if v == ssStarter || p < 0 { - break - } - info, i = lastRuneStart(fd, rb.out[:p]) - if int(info.size) != p-i { - break - } - } - rb.ss = ss - // Copy bytes for insertion as we may need to overwrite rb.out. - var buf [maxBufferSize * utf8.UTFMax]byte - cp := buf[:copy(buf[:], rb.out[p:])] - rb.out = rb.out[:p] - for padd--; padd >= 0; padd-- { - info = add[padd] - rb.insertUnsafe(inputBytes(cp), 0, info) - cp = cp[info.size:] - } -} diff --git a/vendor/golang.org/x/text/unicode/norm/readwriter.go b/vendor/golang.org/x/text/unicode/norm/readwriter.go deleted file mode 100644 index d926ee903..000000000 --- a/vendor/golang.org/x/text/unicode/norm/readwriter.go +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package norm - -import "io" - -type normWriter struct { - rb reorderBuffer - w io.Writer - buf []byte -} - -// Write implements the standard write interface. If the last characters are -// not at a normalization boundary, the bytes will be buffered for the next -// write. The remaining bytes will be written on close. -func (w *normWriter) Write(data []byte) (n int, err error) { - // Process data in pieces to keep w.buf size bounded. - const chunk = 4000 - - for len(data) > 0 { - // Normalize into w.buf. - m := len(data) - if m > chunk { - m = chunk - } - w.rb.src = inputBytes(data[:m]) - w.rb.nsrc = m - w.buf = doAppend(&w.rb, w.buf, 0) - data = data[m:] - n += m - - // Write out complete prefix, save remainder. - // Note that lastBoundary looks back at most 31 runes. - i := lastBoundary(&w.rb.f, w.buf) - if i == -1 { - i = 0 - } - if i > 0 { - if _, err = w.w.Write(w.buf[:i]); err != nil { - break - } - bn := copy(w.buf, w.buf[i:]) - w.buf = w.buf[:bn] - } - } - return n, err -} - -// Close forces data that remains in the buffer to be written. -func (w *normWriter) Close() error { - if len(w.buf) > 0 { - _, err := w.w.Write(w.buf) - if err != nil { - return err - } - } - return nil -} - -// Writer returns a new writer that implements Write(b) -// by writing f(b) to w. The returned writer may use an -// an internal buffer to maintain state across Write calls. -// Calling its Close method writes any buffered data to w. -func (f Form) Writer(w io.Writer) io.WriteCloser { - wr := &normWriter{rb: reorderBuffer{}, w: w} - wr.rb.init(f, nil) - return wr -} - -type normReader struct { - rb reorderBuffer - r io.Reader - inbuf []byte - outbuf []byte - bufStart int - lastBoundary int - err error -} - -// Read implements the standard read interface. -func (r *normReader) Read(p []byte) (int, error) { - for { - if r.lastBoundary-r.bufStart > 0 { - n := copy(p, r.outbuf[r.bufStart:r.lastBoundary]) - r.bufStart += n - if r.lastBoundary-r.bufStart > 0 { - return n, nil - } - return n, r.err - } - if r.err != nil { - return 0, r.err - } - outn := copy(r.outbuf, r.outbuf[r.lastBoundary:]) - r.outbuf = r.outbuf[0:outn] - r.bufStart = 0 - - n, err := r.r.Read(r.inbuf) - r.rb.src = inputBytes(r.inbuf[0:n]) - r.rb.nsrc, r.err = n, err - if n > 0 { - r.outbuf = doAppend(&r.rb, r.outbuf, 0) - } - if err == io.EOF { - r.lastBoundary = len(r.outbuf) - } else { - r.lastBoundary = lastBoundary(&r.rb.f, r.outbuf) - if r.lastBoundary == -1 { - r.lastBoundary = 0 - } - } - } -} - -// Reader returns a new reader that implements Read -// by reading data from r and returning f(data). -func (f Form) Reader(r io.Reader) io.Reader { - const chunk = 4000 - buf := make([]byte, chunk) - rr := &normReader{rb: reorderBuffer{}, r: r, inbuf: buf} - rr.rb.init(f, buf) - return rr -} diff --git a/vendor/golang.org/x/text/unicode/norm/tables.go b/vendor/golang.org/x/text/unicode/norm/tables.go deleted file mode 100644 index bf9ff8038..000000000 --- a/vendor/golang.org/x/text/unicode/norm/tables.go +++ /dev/null @@ -1,7631 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -package norm - -const ( - // Version is the Unicode edition from which the tables are derived. - Version = "9.0.0" - - // MaxTransformChunkSize indicates the maximum number of bytes that Transform - // may need to write atomically for any Form. Making a destination buffer at - // least this size ensures that Transform can always make progress and that - // the user does not need to grow the buffer on an ErrShortDst. - MaxTransformChunkSize = 35 + maxNonStarters*4 -) - -var ccc = [55]uint8{ - 0, 1, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, - 84, 91, 103, 107, 118, 122, 129, 130, - 132, 202, 214, 216, 218, 220, 222, 224, - 226, 228, 230, 232, 233, 234, 240, -} - -const ( - firstMulti = 0x186D - firstCCC = 0x2C9E - endMulti = 0x2F60 - firstLeadingCCC = 0x49AE - firstCCCZeroExcept = 0x4A78 - firstStarterWithNLead = 0x4A9F - lastDecomp = 0x4AA1 - maxDecomp = 0x8000 -) - -// decomps: 19105 bytes -var decomps = [...]byte{ - // Bytes 0 - 3f - 0x00, 0x41, 0x20, 0x41, 0x21, 0x41, 0x22, 0x41, - 0x23, 0x41, 0x24, 0x41, 0x25, 0x41, 0x26, 0x41, - 0x27, 0x41, 0x28, 0x41, 0x29, 0x41, 0x2A, 0x41, - 0x2B, 0x41, 0x2C, 0x41, 0x2D, 0x41, 0x2E, 0x41, - 0x2F, 0x41, 0x30, 0x41, 0x31, 0x41, 0x32, 0x41, - 0x33, 0x41, 0x34, 0x41, 0x35, 0x41, 0x36, 0x41, - 0x37, 0x41, 0x38, 0x41, 0x39, 0x41, 0x3A, 0x41, - 0x3B, 0x41, 0x3C, 0x41, 0x3D, 0x41, 0x3E, 0x41, - // Bytes 40 - 7f - 0x3F, 0x41, 0x40, 0x41, 0x41, 0x41, 0x42, 0x41, - 0x43, 0x41, 0x44, 0x41, 0x45, 0x41, 0x46, 0x41, - 0x47, 0x41, 0x48, 0x41, 0x49, 0x41, 0x4A, 0x41, - 0x4B, 0x41, 0x4C, 0x41, 0x4D, 0x41, 0x4E, 0x41, - 0x4F, 0x41, 0x50, 0x41, 0x51, 0x41, 0x52, 0x41, - 0x53, 0x41, 0x54, 0x41, 0x55, 0x41, 0x56, 0x41, - 0x57, 0x41, 0x58, 0x41, 0x59, 0x41, 0x5A, 0x41, - 0x5B, 0x41, 0x5C, 0x41, 0x5D, 0x41, 0x5E, 0x41, - // Bytes 80 - bf - 0x5F, 0x41, 0x60, 0x41, 0x61, 0x41, 0x62, 0x41, - 0x63, 0x41, 0x64, 0x41, 0x65, 0x41, 0x66, 0x41, - 0x67, 0x41, 0x68, 0x41, 0x69, 0x41, 0x6A, 0x41, - 0x6B, 0x41, 0x6C, 0x41, 0x6D, 0x41, 0x6E, 0x41, - 0x6F, 0x41, 0x70, 0x41, 0x71, 0x41, 0x72, 0x41, - 0x73, 0x41, 0x74, 0x41, 0x75, 0x41, 0x76, 0x41, - 0x77, 0x41, 0x78, 0x41, 0x79, 0x41, 0x7A, 0x41, - 0x7B, 0x41, 0x7C, 0x41, 0x7D, 0x41, 0x7E, 0x42, - // Bytes c0 - ff - 0xC2, 0xA2, 0x42, 0xC2, 0xA3, 0x42, 0xC2, 0xA5, - 0x42, 0xC2, 0xA6, 0x42, 0xC2, 0xAC, 0x42, 0xC2, - 0xB7, 0x42, 0xC3, 0x86, 0x42, 0xC3, 0xB0, 0x42, - 0xC4, 0xA6, 0x42, 0xC4, 0xA7, 0x42, 0xC4, 0xB1, - 0x42, 0xC5, 0x8B, 0x42, 0xC5, 0x93, 0x42, 0xC6, - 0x8E, 0x42, 0xC6, 0x90, 0x42, 0xC6, 0xAB, 0x42, - 0xC8, 0xA2, 0x42, 0xC8, 0xB7, 0x42, 0xC9, 0x90, - 0x42, 0xC9, 0x91, 0x42, 0xC9, 0x92, 0x42, 0xC9, - // Bytes 100 - 13f - 0x94, 0x42, 0xC9, 0x95, 0x42, 0xC9, 0x99, 0x42, - 0xC9, 0x9B, 0x42, 0xC9, 0x9C, 0x42, 0xC9, 0x9F, - 0x42, 0xC9, 0xA1, 0x42, 0xC9, 0xA3, 0x42, 0xC9, - 0xA5, 0x42, 0xC9, 0xA6, 0x42, 0xC9, 0xA8, 0x42, - 0xC9, 0xA9, 0x42, 0xC9, 0xAA, 0x42, 0xC9, 0xAB, - 0x42, 0xC9, 0xAD, 0x42, 0xC9, 0xAF, 0x42, 0xC9, - 0xB0, 0x42, 0xC9, 0xB1, 0x42, 0xC9, 0xB2, 0x42, - 0xC9, 0xB3, 0x42, 0xC9, 0xB4, 0x42, 0xC9, 0xB5, - // Bytes 140 - 17f - 0x42, 0xC9, 0xB8, 0x42, 0xC9, 0xB9, 0x42, 0xC9, - 0xBB, 0x42, 0xCA, 0x81, 0x42, 0xCA, 0x82, 0x42, - 0xCA, 0x83, 0x42, 0xCA, 0x89, 0x42, 0xCA, 0x8A, - 0x42, 0xCA, 0x8B, 0x42, 0xCA, 0x8C, 0x42, 0xCA, - 0x90, 0x42, 0xCA, 0x91, 0x42, 0xCA, 0x92, 0x42, - 0xCA, 0x95, 0x42, 0xCA, 0x9D, 0x42, 0xCA, 0x9F, - 0x42, 0xCA, 0xB9, 0x42, 0xCE, 0x91, 0x42, 0xCE, - 0x92, 0x42, 0xCE, 0x93, 0x42, 0xCE, 0x94, 0x42, - // Bytes 180 - 1bf - 0xCE, 0x95, 0x42, 0xCE, 0x96, 0x42, 0xCE, 0x97, - 0x42, 0xCE, 0x98, 0x42, 0xCE, 0x99, 0x42, 0xCE, - 0x9A, 0x42, 0xCE, 0x9B, 0x42, 0xCE, 0x9C, 0x42, - 0xCE, 0x9D, 0x42, 0xCE, 0x9E, 0x42, 0xCE, 0x9F, - 0x42, 0xCE, 0xA0, 0x42, 0xCE, 0xA1, 0x42, 0xCE, - 0xA3, 0x42, 0xCE, 0xA4, 0x42, 0xCE, 0xA5, 0x42, - 0xCE, 0xA6, 0x42, 0xCE, 0xA7, 0x42, 0xCE, 0xA8, - 0x42, 0xCE, 0xA9, 0x42, 0xCE, 0xB1, 0x42, 0xCE, - // Bytes 1c0 - 1ff - 0xB2, 0x42, 0xCE, 0xB3, 0x42, 0xCE, 0xB4, 0x42, - 0xCE, 0xB5, 0x42, 0xCE, 0xB6, 0x42, 0xCE, 0xB7, - 0x42, 0xCE, 0xB8, 0x42, 0xCE, 0xB9, 0x42, 0xCE, - 0xBA, 0x42, 0xCE, 0xBB, 0x42, 0xCE, 0xBC, 0x42, - 0xCE, 0xBD, 0x42, 0xCE, 0xBE, 0x42, 0xCE, 0xBF, - 0x42, 0xCF, 0x80, 0x42, 0xCF, 0x81, 0x42, 0xCF, - 0x82, 0x42, 0xCF, 0x83, 0x42, 0xCF, 0x84, 0x42, - 0xCF, 0x85, 0x42, 0xCF, 0x86, 0x42, 0xCF, 0x87, - // Bytes 200 - 23f - 0x42, 0xCF, 0x88, 0x42, 0xCF, 0x89, 0x42, 0xCF, - 0x9C, 0x42, 0xCF, 0x9D, 0x42, 0xD0, 0xBD, 0x42, - 0xD1, 0x8A, 0x42, 0xD1, 0x8C, 0x42, 0xD7, 0x90, - 0x42, 0xD7, 0x91, 0x42, 0xD7, 0x92, 0x42, 0xD7, - 0x93, 0x42, 0xD7, 0x94, 0x42, 0xD7, 0x9B, 0x42, - 0xD7, 0x9C, 0x42, 0xD7, 0x9D, 0x42, 0xD7, 0xA2, - 0x42, 0xD7, 0xA8, 0x42, 0xD7, 0xAA, 0x42, 0xD8, - 0xA1, 0x42, 0xD8, 0xA7, 0x42, 0xD8, 0xA8, 0x42, - // Bytes 240 - 27f - 0xD8, 0xA9, 0x42, 0xD8, 0xAA, 0x42, 0xD8, 0xAB, - 0x42, 0xD8, 0xAC, 0x42, 0xD8, 0xAD, 0x42, 0xD8, - 0xAE, 0x42, 0xD8, 0xAF, 0x42, 0xD8, 0xB0, 0x42, - 0xD8, 0xB1, 0x42, 0xD8, 0xB2, 0x42, 0xD8, 0xB3, - 0x42, 0xD8, 0xB4, 0x42, 0xD8, 0xB5, 0x42, 0xD8, - 0xB6, 0x42, 0xD8, 0xB7, 0x42, 0xD8, 0xB8, 0x42, - 0xD8, 0xB9, 0x42, 0xD8, 0xBA, 0x42, 0xD9, 0x81, - 0x42, 0xD9, 0x82, 0x42, 0xD9, 0x83, 0x42, 0xD9, - // Bytes 280 - 2bf - 0x84, 0x42, 0xD9, 0x85, 0x42, 0xD9, 0x86, 0x42, - 0xD9, 0x87, 0x42, 0xD9, 0x88, 0x42, 0xD9, 0x89, - 0x42, 0xD9, 0x8A, 0x42, 0xD9, 0xAE, 0x42, 0xD9, - 0xAF, 0x42, 0xD9, 0xB1, 0x42, 0xD9, 0xB9, 0x42, - 0xD9, 0xBA, 0x42, 0xD9, 0xBB, 0x42, 0xD9, 0xBE, - 0x42, 0xD9, 0xBF, 0x42, 0xDA, 0x80, 0x42, 0xDA, - 0x83, 0x42, 0xDA, 0x84, 0x42, 0xDA, 0x86, 0x42, - 0xDA, 0x87, 0x42, 0xDA, 0x88, 0x42, 0xDA, 0x8C, - // Bytes 2c0 - 2ff - 0x42, 0xDA, 0x8D, 0x42, 0xDA, 0x8E, 0x42, 0xDA, - 0x91, 0x42, 0xDA, 0x98, 0x42, 0xDA, 0xA1, 0x42, - 0xDA, 0xA4, 0x42, 0xDA, 0xA6, 0x42, 0xDA, 0xA9, - 0x42, 0xDA, 0xAD, 0x42, 0xDA, 0xAF, 0x42, 0xDA, - 0xB1, 0x42, 0xDA, 0xB3, 0x42, 0xDA, 0xBA, 0x42, - 0xDA, 0xBB, 0x42, 0xDA, 0xBE, 0x42, 0xDB, 0x81, - 0x42, 0xDB, 0x85, 0x42, 0xDB, 0x86, 0x42, 0xDB, - 0x87, 0x42, 0xDB, 0x88, 0x42, 0xDB, 0x89, 0x42, - // Bytes 300 - 33f - 0xDB, 0x8B, 0x42, 0xDB, 0x8C, 0x42, 0xDB, 0x90, - 0x42, 0xDB, 0x92, 0x43, 0xE0, 0xBC, 0x8B, 0x43, - 0xE1, 0x83, 0x9C, 0x43, 0xE1, 0x84, 0x80, 0x43, - 0xE1, 0x84, 0x81, 0x43, 0xE1, 0x84, 0x82, 0x43, - 0xE1, 0x84, 0x83, 0x43, 0xE1, 0x84, 0x84, 0x43, - 0xE1, 0x84, 0x85, 0x43, 0xE1, 0x84, 0x86, 0x43, - 0xE1, 0x84, 0x87, 0x43, 0xE1, 0x84, 0x88, 0x43, - 0xE1, 0x84, 0x89, 0x43, 0xE1, 0x84, 0x8A, 0x43, - // Bytes 340 - 37f - 0xE1, 0x84, 0x8B, 0x43, 0xE1, 0x84, 0x8C, 0x43, - 0xE1, 0x84, 0x8D, 0x43, 0xE1, 0x84, 0x8E, 0x43, - 0xE1, 0x84, 0x8F, 0x43, 0xE1, 0x84, 0x90, 0x43, - 0xE1, 0x84, 0x91, 0x43, 0xE1, 0x84, 0x92, 0x43, - 0xE1, 0x84, 0x94, 0x43, 0xE1, 0x84, 0x95, 0x43, - 0xE1, 0x84, 0x9A, 0x43, 0xE1, 0x84, 0x9C, 0x43, - 0xE1, 0x84, 0x9D, 0x43, 0xE1, 0x84, 0x9E, 0x43, - 0xE1, 0x84, 0xA0, 0x43, 0xE1, 0x84, 0xA1, 0x43, - // Bytes 380 - 3bf - 0xE1, 0x84, 0xA2, 0x43, 0xE1, 0x84, 0xA3, 0x43, - 0xE1, 0x84, 0xA7, 0x43, 0xE1, 0x84, 0xA9, 0x43, - 0xE1, 0x84, 0xAB, 0x43, 0xE1, 0x84, 0xAC, 0x43, - 0xE1, 0x84, 0xAD, 0x43, 0xE1, 0x84, 0xAE, 0x43, - 0xE1, 0x84, 0xAF, 0x43, 0xE1, 0x84, 0xB2, 0x43, - 0xE1, 0x84, 0xB6, 0x43, 0xE1, 0x85, 0x80, 0x43, - 0xE1, 0x85, 0x87, 0x43, 0xE1, 0x85, 0x8C, 0x43, - 0xE1, 0x85, 0x97, 0x43, 0xE1, 0x85, 0x98, 0x43, - // Bytes 3c0 - 3ff - 0xE1, 0x85, 0x99, 0x43, 0xE1, 0x85, 0xA0, 0x43, - 0xE1, 0x86, 0x84, 0x43, 0xE1, 0x86, 0x85, 0x43, - 0xE1, 0x86, 0x88, 0x43, 0xE1, 0x86, 0x91, 0x43, - 0xE1, 0x86, 0x92, 0x43, 0xE1, 0x86, 0x94, 0x43, - 0xE1, 0x86, 0x9E, 0x43, 0xE1, 0x86, 0xA1, 0x43, - 0xE1, 0x87, 0x87, 0x43, 0xE1, 0x87, 0x88, 0x43, - 0xE1, 0x87, 0x8C, 0x43, 0xE1, 0x87, 0x8E, 0x43, - 0xE1, 0x87, 0x93, 0x43, 0xE1, 0x87, 0x97, 0x43, - // Bytes 400 - 43f - 0xE1, 0x87, 0x99, 0x43, 0xE1, 0x87, 0x9D, 0x43, - 0xE1, 0x87, 0x9F, 0x43, 0xE1, 0x87, 0xB1, 0x43, - 0xE1, 0x87, 0xB2, 0x43, 0xE1, 0xB4, 0x82, 0x43, - 0xE1, 0xB4, 0x96, 0x43, 0xE1, 0xB4, 0x97, 0x43, - 0xE1, 0xB4, 0x9C, 0x43, 0xE1, 0xB4, 0x9D, 0x43, - 0xE1, 0xB4, 0xA5, 0x43, 0xE1, 0xB5, 0xBB, 0x43, - 0xE1, 0xB6, 0x85, 0x43, 0xE2, 0x80, 0x82, 0x43, - 0xE2, 0x80, 0x83, 0x43, 0xE2, 0x80, 0x90, 0x43, - // Bytes 440 - 47f - 0xE2, 0x80, 0x93, 0x43, 0xE2, 0x80, 0x94, 0x43, - 0xE2, 0x82, 0xA9, 0x43, 0xE2, 0x86, 0x90, 0x43, - 0xE2, 0x86, 0x91, 0x43, 0xE2, 0x86, 0x92, 0x43, - 0xE2, 0x86, 0x93, 0x43, 0xE2, 0x88, 0x82, 0x43, - 0xE2, 0x88, 0x87, 0x43, 0xE2, 0x88, 0x91, 0x43, - 0xE2, 0x88, 0x92, 0x43, 0xE2, 0x94, 0x82, 0x43, - 0xE2, 0x96, 0xA0, 0x43, 0xE2, 0x97, 0x8B, 0x43, - 0xE2, 0xA6, 0x85, 0x43, 0xE2, 0xA6, 0x86, 0x43, - // Bytes 480 - 4bf - 0xE2, 0xB5, 0xA1, 0x43, 0xE3, 0x80, 0x81, 0x43, - 0xE3, 0x80, 0x82, 0x43, 0xE3, 0x80, 0x88, 0x43, - 0xE3, 0x80, 0x89, 0x43, 0xE3, 0x80, 0x8A, 0x43, - 0xE3, 0x80, 0x8B, 0x43, 0xE3, 0x80, 0x8C, 0x43, - 0xE3, 0x80, 0x8D, 0x43, 0xE3, 0x80, 0x8E, 0x43, - 0xE3, 0x80, 0x8F, 0x43, 0xE3, 0x80, 0x90, 0x43, - 0xE3, 0x80, 0x91, 0x43, 0xE3, 0x80, 0x92, 0x43, - 0xE3, 0x80, 0x94, 0x43, 0xE3, 0x80, 0x95, 0x43, - // Bytes 4c0 - 4ff - 0xE3, 0x80, 0x96, 0x43, 0xE3, 0x80, 0x97, 0x43, - 0xE3, 0x82, 0xA1, 0x43, 0xE3, 0x82, 0xA2, 0x43, - 0xE3, 0x82, 0xA3, 0x43, 0xE3, 0x82, 0xA4, 0x43, - 0xE3, 0x82, 0xA5, 0x43, 0xE3, 0x82, 0xA6, 0x43, - 0xE3, 0x82, 0xA7, 0x43, 0xE3, 0x82, 0xA8, 0x43, - 0xE3, 0x82, 0xA9, 0x43, 0xE3, 0x82, 0xAA, 0x43, - 0xE3, 0x82, 0xAB, 0x43, 0xE3, 0x82, 0xAD, 0x43, - 0xE3, 0x82, 0xAF, 0x43, 0xE3, 0x82, 0xB1, 0x43, - // Bytes 500 - 53f - 0xE3, 0x82, 0xB3, 0x43, 0xE3, 0x82, 0xB5, 0x43, - 0xE3, 0x82, 0xB7, 0x43, 0xE3, 0x82, 0xB9, 0x43, - 0xE3, 0x82, 0xBB, 0x43, 0xE3, 0x82, 0xBD, 0x43, - 0xE3, 0x82, 0xBF, 0x43, 0xE3, 0x83, 0x81, 0x43, - 0xE3, 0x83, 0x83, 0x43, 0xE3, 0x83, 0x84, 0x43, - 0xE3, 0x83, 0x86, 0x43, 0xE3, 0x83, 0x88, 0x43, - 0xE3, 0x83, 0x8A, 0x43, 0xE3, 0x83, 0x8B, 0x43, - 0xE3, 0x83, 0x8C, 0x43, 0xE3, 0x83, 0x8D, 0x43, - // Bytes 540 - 57f - 0xE3, 0x83, 0x8E, 0x43, 0xE3, 0x83, 0x8F, 0x43, - 0xE3, 0x83, 0x92, 0x43, 0xE3, 0x83, 0x95, 0x43, - 0xE3, 0x83, 0x98, 0x43, 0xE3, 0x83, 0x9B, 0x43, - 0xE3, 0x83, 0x9E, 0x43, 0xE3, 0x83, 0x9F, 0x43, - 0xE3, 0x83, 0xA0, 0x43, 0xE3, 0x83, 0xA1, 0x43, - 0xE3, 0x83, 0xA2, 0x43, 0xE3, 0x83, 0xA3, 0x43, - 0xE3, 0x83, 0xA4, 0x43, 0xE3, 0x83, 0xA5, 0x43, - 0xE3, 0x83, 0xA6, 0x43, 0xE3, 0x83, 0xA7, 0x43, - // Bytes 580 - 5bf - 0xE3, 0x83, 0xA8, 0x43, 0xE3, 0x83, 0xA9, 0x43, - 0xE3, 0x83, 0xAA, 0x43, 0xE3, 0x83, 0xAB, 0x43, - 0xE3, 0x83, 0xAC, 0x43, 0xE3, 0x83, 0xAD, 0x43, - 0xE3, 0x83, 0xAF, 0x43, 0xE3, 0x83, 0xB0, 0x43, - 0xE3, 0x83, 0xB1, 0x43, 0xE3, 0x83, 0xB2, 0x43, - 0xE3, 0x83, 0xB3, 0x43, 0xE3, 0x83, 0xBB, 0x43, - 0xE3, 0x83, 0xBC, 0x43, 0xE3, 0x92, 0x9E, 0x43, - 0xE3, 0x92, 0xB9, 0x43, 0xE3, 0x92, 0xBB, 0x43, - // Bytes 5c0 - 5ff - 0xE3, 0x93, 0x9F, 0x43, 0xE3, 0x94, 0x95, 0x43, - 0xE3, 0x9B, 0xAE, 0x43, 0xE3, 0x9B, 0xBC, 0x43, - 0xE3, 0x9E, 0x81, 0x43, 0xE3, 0xA0, 0xAF, 0x43, - 0xE3, 0xA1, 0xA2, 0x43, 0xE3, 0xA1, 0xBC, 0x43, - 0xE3, 0xA3, 0x87, 0x43, 0xE3, 0xA3, 0xA3, 0x43, - 0xE3, 0xA4, 0x9C, 0x43, 0xE3, 0xA4, 0xBA, 0x43, - 0xE3, 0xA8, 0xAE, 0x43, 0xE3, 0xA9, 0xAC, 0x43, - 0xE3, 0xAB, 0xA4, 0x43, 0xE3, 0xAC, 0x88, 0x43, - // Bytes 600 - 63f - 0xE3, 0xAC, 0x99, 0x43, 0xE3, 0xAD, 0x89, 0x43, - 0xE3, 0xAE, 0x9D, 0x43, 0xE3, 0xB0, 0x98, 0x43, - 0xE3, 0xB1, 0x8E, 0x43, 0xE3, 0xB4, 0xB3, 0x43, - 0xE3, 0xB6, 0x96, 0x43, 0xE3, 0xBA, 0xAC, 0x43, - 0xE3, 0xBA, 0xB8, 0x43, 0xE3, 0xBC, 0x9B, 0x43, - 0xE3, 0xBF, 0xBC, 0x43, 0xE4, 0x80, 0x88, 0x43, - 0xE4, 0x80, 0x98, 0x43, 0xE4, 0x80, 0xB9, 0x43, - 0xE4, 0x81, 0x86, 0x43, 0xE4, 0x82, 0x96, 0x43, - // Bytes 640 - 67f - 0xE4, 0x83, 0xA3, 0x43, 0xE4, 0x84, 0xAF, 0x43, - 0xE4, 0x88, 0x82, 0x43, 0xE4, 0x88, 0xA7, 0x43, - 0xE4, 0x8A, 0xA0, 0x43, 0xE4, 0x8C, 0x81, 0x43, - 0xE4, 0x8C, 0xB4, 0x43, 0xE4, 0x8D, 0x99, 0x43, - 0xE4, 0x8F, 0x95, 0x43, 0xE4, 0x8F, 0x99, 0x43, - 0xE4, 0x90, 0x8B, 0x43, 0xE4, 0x91, 0xAB, 0x43, - 0xE4, 0x94, 0xAB, 0x43, 0xE4, 0x95, 0x9D, 0x43, - 0xE4, 0x95, 0xA1, 0x43, 0xE4, 0x95, 0xAB, 0x43, - // Bytes 680 - 6bf - 0xE4, 0x97, 0x97, 0x43, 0xE4, 0x97, 0xB9, 0x43, - 0xE4, 0x98, 0xB5, 0x43, 0xE4, 0x9A, 0xBE, 0x43, - 0xE4, 0x9B, 0x87, 0x43, 0xE4, 0xA6, 0x95, 0x43, - 0xE4, 0xA7, 0xA6, 0x43, 0xE4, 0xA9, 0xAE, 0x43, - 0xE4, 0xA9, 0xB6, 0x43, 0xE4, 0xAA, 0xB2, 0x43, - 0xE4, 0xAC, 0xB3, 0x43, 0xE4, 0xAF, 0x8E, 0x43, - 0xE4, 0xB3, 0x8E, 0x43, 0xE4, 0xB3, 0xAD, 0x43, - 0xE4, 0xB3, 0xB8, 0x43, 0xE4, 0xB5, 0x96, 0x43, - // Bytes 6c0 - 6ff - 0xE4, 0xB8, 0x80, 0x43, 0xE4, 0xB8, 0x81, 0x43, - 0xE4, 0xB8, 0x83, 0x43, 0xE4, 0xB8, 0x89, 0x43, - 0xE4, 0xB8, 0x8A, 0x43, 0xE4, 0xB8, 0x8B, 0x43, - 0xE4, 0xB8, 0x8D, 0x43, 0xE4, 0xB8, 0x99, 0x43, - 0xE4, 0xB8, 0xA6, 0x43, 0xE4, 0xB8, 0xA8, 0x43, - 0xE4, 0xB8, 0xAD, 0x43, 0xE4, 0xB8, 0xB2, 0x43, - 0xE4, 0xB8, 0xB6, 0x43, 0xE4, 0xB8, 0xB8, 0x43, - 0xE4, 0xB8, 0xB9, 0x43, 0xE4, 0xB8, 0xBD, 0x43, - // Bytes 700 - 73f - 0xE4, 0xB8, 0xBF, 0x43, 0xE4, 0xB9, 0x81, 0x43, - 0xE4, 0xB9, 0x99, 0x43, 0xE4, 0xB9, 0x9D, 0x43, - 0xE4, 0xBA, 0x82, 0x43, 0xE4, 0xBA, 0x85, 0x43, - 0xE4, 0xBA, 0x86, 0x43, 0xE4, 0xBA, 0x8C, 0x43, - 0xE4, 0xBA, 0x94, 0x43, 0xE4, 0xBA, 0xA0, 0x43, - 0xE4, 0xBA, 0xA4, 0x43, 0xE4, 0xBA, 0xAE, 0x43, - 0xE4, 0xBA, 0xBA, 0x43, 0xE4, 0xBB, 0x80, 0x43, - 0xE4, 0xBB, 0x8C, 0x43, 0xE4, 0xBB, 0xA4, 0x43, - // Bytes 740 - 77f - 0xE4, 0xBC, 0x81, 0x43, 0xE4, 0xBC, 0x91, 0x43, - 0xE4, 0xBD, 0xA0, 0x43, 0xE4, 0xBE, 0x80, 0x43, - 0xE4, 0xBE, 0x86, 0x43, 0xE4, 0xBE, 0x8B, 0x43, - 0xE4, 0xBE, 0xAE, 0x43, 0xE4, 0xBE, 0xBB, 0x43, - 0xE4, 0xBE, 0xBF, 0x43, 0xE5, 0x80, 0x82, 0x43, - 0xE5, 0x80, 0xAB, 0x43, 0xE5, 0x81, 0xBA, 0x43, - 0xE5, 0x82, 0x99, 0x43, 0xE5, 0x83, 0x8F, 0x43, - 0xE5, 0x83, 0x9A, 0x43, 0xE5, 0x83, 0xA7, 0x43, - // Bytes 780 - 7bf - 0xE5, 0x84, 0xAA, 0x43, 0xE5, 0x84, 0xBF, 0x43, - 0xE5, 0x85, 0x80, 0x43, 0xE5, 0x85, 0x85, 0x43, - 0xE5, 0x85, 0x8D, 0x43, 0xE5, 0x85, 0x94, 0x43, - 0xE5, 0x85, 0xA4, 0x43, 0xE5, 0x85, 0xA5, 0x43, - 0xE5, 0x85, 0xA7, 0x43, 0xE5, 0x85, 0xA8, 0x43, - 0xE5, 0x85, 0xA9, 0x43, 0xE5, 0x85, 0xAB, 0x43, - 0xE5, 0x85, 0xAD, 0x43, 0xE5, 0x85, 0xB7, 0x43, - 0xE5, 0x86, 0x80, 0x43, 0xE5, 0x86, 0x82, 0x43, - // Bytes 7c0 - 7ff - 0xE5, 0x86, 0x8D, 0x43, 0xE5, 0x86, 0x92, 0x43, - 0xE5, 0x86, 0x95, 0x43, 0xE5, 0x86, 0x96, 0x43, - 0xE5, 0x86, 0x97, 0x43, 0xE5, 0x86, 0x99, 0x43, - 0xE5, 0x86, 0xA4, 0x43, 0xE5, 0x86, 0xAB, 0x43, - 0xE5, 0x86, 0xAC, 0x43, 0xE5, 0x86, 0xB5, 0x43, - 0xE5, 0x86, 0xB7, 0x43, 0xE5, 0x87, 0x89, 0x43, - 0xE5, 0x87, 0x8C, 0x43, 0xE5, 0x87, 0x9C, 0x43, - 0xE5, 0x87, 0x9E, 0x43, 0xE5, 0x87, 0xA0, 0x43, - // Bytes 800 - 83f - 0xE5, 0x87, 0xB5, 0x43, 0xE5, 0x88, 0x80, 0x43, - 0xE5, 0x88, 0x83, 0x43, 0xE5, 0x88, 0x87, 0x43, - 0xE5, 0x88, 0x97, 0x43, 0xE5, 0x88, 0x9D, 0x43, - 0xE5, 0x88, 0xA9, 0x43, 0xE5, 0x88, 0xBA, 0x43, - 0xE5, 0x88, 0xBB, 0x43, 0xE5, 0x89, 0x86, 0x43, - 0xE5, 0x89, 0x8D, 0x43, 0xE5, 0x89, 0xB2, 0x43, - 0xE5, 0x89, 0xB7, 0x43, 0xE5, 0x8A, 0x89, 0x43, - 0xE5, 0x8A, 0x9B, 0x43, 0xE5, 0x8A, 0xA3, 0x43, - // Bytes 840 - 87f - 0xE5, 0x8A, 0xB3, 0x43, 0xE5, 0x8A, 0xB4, 0x43, - 0xE5, 0x8B, 0x87, 0x43, 0xE5, 0x8B, 0x89, 0x43, - 0xE5, 0x8B, 0x92, 0x43, 0xE5, 0x8B, 0x9E, 0x43, - 0xE5, 0x8B, 0xA4, 0x43, 0xE5, 0x8B, 0xB5, 0x43, - 0xE5, 0x8B, 0xB9, 0x43, 0xE5, 0x8B, 0xBA, 0x43, - 0xE5, 0x8C, 0x85, 0x43, 0xE5, 0x8C, 0x86, 0x43, - 0xE5, 0x8C, 0x95, 0x43, 0xE5, 0x8C, 0x97, 0x43, - 0xE5, 0x8C, 0x9A, 0x43, 0xE5, 0x8C, 0xB8, 0x43, - // Bytes 880 - 8bf - 0xE5, 0x8C, 0xBB, 0x43, 0xE5, 0x8C, 0xBF, 0x43, - 0xE5, 0x8D, 0x81, 0x43, 0xE5, 0x8D, 0x84, 0x43, - 0xE5, 0x8D, 0x85, 0x43, 0xE5, 0x8D, 0x89, 0x43, - 0xE5, 0x8D, 0x91, 0x43, 0xE5, 0x8D, 0x94, 0x43, - 0xE5, 0x8D, 0x9A, 0x43, 0xE5, 0x8D, 0x9C, 0x43, - 0xE5, 0x8D, 0xA9, 0x43, 0xE5, 0x8D, 0xB0, 0x43, - 0xE5, 0x8D, 0xB3, 0x43, 0xE5, 0x8D, 0xB5, 0x43, - 0xE5, 0x8D, 0xBD, 0x43, 0xE5, 0x8D, 0xBF, 0x43, - // Bytes 8c0 - 8ff - 0xE5, 0x8E, 0x82, 0x43, 0xE5, 0x8E, 0xB6, 0x43, - 0xE5, 0x8F, 0x83, 0x43, 0xE5, 0x8F, 0x88, 0x43, - 0xE5, 0x8F, 0x8A, 0x43, 0xE5, 0x8F, 0x8C, 0x43, - 0xE5, 0x8F, 0x9F, 0x43, 0xE5, 0x8F, 0xA3, 0x43, - 0xE5, 0x8F, 0xA5, 0x43, 0xE5, 0x8F, 0xAB, 0x43, - 0xE5, 0x8F, 0xAF, 0x43, 0xE5, 0x8F, 0xB1, 0x43, - 0xE5, 0x8F, 0xB3, 0x43, 0xE5, 0x90, 0x86, 0x43, - 0xE5, 0x90, 0x88, 0x43, 0xE5, 0x90, 0x8D, 0x43, - // Bytes 900 - 93f - 0xE5, 0x90, 0x8F, 0x43, 0xE5, 0x90, 0x9D, 0x43, - 0xE5, 0x90, 0xB8, 0x43, 0xE5, 0x90, 0xB9, 0x43, - 0xE5, 0x91, 0x82, 0x43, 0xE5, 0x91, 0x88, 0x43, - 0xE5, 0x91, 0xA8, 0x43, 0xE5, 0x92, 0x9E, 0x43, - 0xE5, 0x92, 0xA2, 0x43, 0xE5, 0x92, 0xBD, 0x43, - 0xE5, 0x93, 0xB6, 0x43, 0xE5, 0x94, 0x90, 0x43, - 0xE5, 0x95, 0x8F, 0x43, 0xE5, 0x95, 0x93, 0x43, - 0xE5, 0x95, 0x95, 0x43, 0xE5, 0x95, 0xA3, 0x43, - // Bytes 940 - 97f - 0xE5, 0x96, 0x84, 0x43, 0xE5, 0x96, 0x87, 0x43, - 0xE5, 0x96, 0x99, 0x43, 0xE5, 0x96, 0x9D, 0x43, - 0xE5, 0x96, 0xAB, 0x43, 0xE5, 0x96, 0xB3, 0x43, - 0xE5, 0x96, 0xB6, 0x43, 0xE5, 0x97, 0x80, 0x43, - 0xE5, 0x97, 0x82, 0x43, 0xE5, 0x97, 0xA2, 0x43, - 0xE5, 0x98, 0x86, 0x43, 0xE5, 0x99, 0x91, 0x43, - 0xE5, 0x99, 0xA8, 0x43, 0xE5, 0x99, 0xB4, 0x43, - 0xE5, 0x9B, 0x97, 0x43, 0xE5, 0x9B, 0x9B, 0x43, - // Bytes 980 - 9bf - 0xE5, 0x9B, 0xB9, 0x43, 0xE5, 0x9C, 0x96, 0x43, - 0xE5, 0x9C, 0x97, 0x43, 0xE5, 0x9C, 0x9F, 0x43, - 0xE5, 0x9C, 0xB0, 0x43, 0xE5, 0x9E, 0x8B, 0x43, - 0xE5, 0x9F, 0x8E, 0x43, 0xE5, 0x9F, 0xB4, 0x43, - 0xE5, 0xA0, 0x8D, 0x43, 0xE5, 0xA0, 0xB1, 0x43, - 0xE5, 0xA0, 0xB2, 0x43, 0xE5, 0xA1, 0x80, 0x43, - 0xE5, 0xA1, 0x9A, 0x43, 0xE5, 0xA1, 0x9E, 0x43, - 0xE5, 0xA2, 0xA8, 0x43, 0xE5, 0xA2, 0xAC, 0x43, - // Bytes 9c0 - 9ff - 0xE5, 0xA2, 0xB3, 0x43, 0xE5, 0xA3, 0x98, 0x43, - 0xE5, 0xA3, 0x9F, 0x43, 0xE5, 0xA3, 0xAB, 0x43, - 0xE5, 0xA3, 0xAE, 0x43, 0xE5, 0xA3, 0xB0, 0x43, - 0xE5, 0xA3, 0xB2, 0x43, 0xE5, 0xA3, 0xB7, 0x43, - 0xE5, 0xA4, 0x82, 0x43, 0xE5, 0xA4, 0x86, 0x43, - 0xE5, 0xA4, 0x8A, 0x43, 0xE5, 0xA4, 0x95, 0x43, - 0xE5, 0xA4, 0x9A, 0x43, 0xE5, 0xA4, 0x9C, 0x43, - 0xE5, 0xA4, 0xA2, 0x43, 0xE5, 0xA4, 0xA7, 0x43, - // Bytes a00 - a3f - 0xE5, 0xA4, 0xA9, 0x43, 0xE5, 0xA5, 0x84, 0x43, - 0xE5, 0xA5, 0x88, 0x43, 0xE5, 0xA5, 0x91, 0x43, - 0xE5, 0xA5, 0x94, 0x43, 0xE5, 0xA5, 0xA2, 0x43, - 0xE5, 0xA5, 0xB3, 0x43, 0xE5, 0xA7, 0x98, 0x43, - 0xE5, 0xA7, 0xAC, 0x43, 0xE5, 0xA8, 0x9B, 0x43, - 0xE5, 0xA8, 0xA7, 0x43, 0xE5, 0xA9, 0xA2, 0x43, - 0xE5, 0xA9, 0xA6, 0x43, 0xE5, 0xAA, 0xB5, 0x43, - 0xE5, 0xAC, 0x88, 0x43, 0xE5, 0xAC, 0xA8, 0x43, - // Bytes a40 - a7f - 0xE5, 0xAC, 0xBE, 0x43, 0xE5, 0xAD, 0x90, 0x43, - 0xE5, 0xAD, 0x97, 0x43, 0xE5, 0xAD, 0xA6, 0x43, - 0xE5, 0xAE, 0x80, 0x43, 0xE5, 0xAE, 0x85, 0x43, - 0xE5, 0xAE, 0x97, 0x43, 0xE5, 0xAF, 0x83, 0x43, - 0xE5, 0xAF, 0x98, 0x43, 0xE5, 0xAF, 0xA7, 0x43, - 0xE5, 0xAF, 0xAE, 0x43, 0xE5, 0xAF, 0xB3, 0x43, - 0xE5, 0xAF, 0xB8, 0x43, 0xE5, 0xAF, 0xBF, 0x43, - 0xE5, 0xB0, 0x86, 0x43, 0xE5, 0xB0, 0x8F, 0x43, - // Bytes a80 - abf - 0xE5, 0xB0, 0xA2, 0x43, 0xE5, 0xB0, 0xB8, 0x43, - 0xE5, 0xB0, 0xBF, 0x43, 0xE5, 0xB1, 0xA0, 0x43, - 0xE5, 0xB1, 0xA2, 0x43, 0xE5, 0xB1, 0xA4, 0x43, - 0xE5, 0xB1, 0xA5, 0x43, 0xE5, 0xB1, 0xAE, 0x43, - 0xE5, 0xB1, 0xB1, 0x43, 0xE5, 0xB2, 0x8D, 0x43, - 0xE5, 0xB3, 0x80, 0x43, 0xE5, 0xB4, 0x99, 0x43, - 0xE5, 0xB5, 0x83, 0x43, 0xE5, 0xB5, 0x90, 0x43, - 0xE5, 0xB5, 0xAB, 0x43, 0xE5, 0xB5, 0xAE, 0x43, - // Bytes ac0 - aff - 0xE5, 0xB5, 0xBC, 0x43, 0xE5, 0xB6, 0xB2, 0x43, - 0xE5, 0xB6, 0xBA, 0x43, 0xE5, 0xB7, 0x9B, 0x43, - 0xE5, 0xB7, 0xA1, 0x43, 0xE5, 0xB7, 0xA2, 0x43, - 0xE5, 0xB7, 0xA5, 0x43, 0xE5, 0xB7, 0xA6, 0x43, - 0xE5, 0xB7, 0xB1, 0x43, 0xE5, 0xB7, 0xBD, 0x43, - 0xE5, 0xB7, 0xBE, 0x43, 0xE5, 0xB8, 0xA8, 0x43, - 0xE5, 0xB8, 0xBD, 0x43, 0xE5, 0xB9, 0xA9, 0x43, - 0xE5, 0xB9, 0xB2, 0x43, 0xE5, 0xB9, 0xB4, 0x43, - // Bytes b00 - b3f - 0xE5, 0xB9, 0xBA, 0x43, 0xE5, 0xB9, 0xBC, 0x43, - 0xE5, 0xB9, 0xBF, 0x43, 0xE5, 0xBA, 0xA6, 0x43, - 0xE5, 0xBA, 0xB0, 0x43, 0xE5, 0xBA, 0xB3, 0x43, - 0xE5, 0xBA, 0xB6, 0x43, 0xE5, 0xBB, 0x89, 0x43, - 0xE5, 0xBB, 0x8A, 0x43, 0xE5, 0xBB, 0x92, 0x43, - 0xE5, 0xBB, 0x93, 0x43, 0xE5, 0xBB, 0x99, 0x43, - 0xE5, 0xBB, 0xAC, 0x43, 0xE5, 0xBB, 0xB4, 0x43, - 0xE5, 0xBB, 0xBE, 0x43, 0xE5, 0xBC, 0x84, 0x43, - // Bytes b40 - b7f - 0xE5, 0xBC, 0x8B, 0x43, 0xE5, 0xBC, 0x93, 0x43, - 0xE5, 0xBC, 0xA2, 0x43, 0xE5, 0xBD, 0x90, 0x43, - 0xE5, 0xBD, 0x93, 0x43, 0xE5, 0xBD, 0xA1, 0x43, - 0xE5, 0xBD, 0xA2, 0x43, 0xE5, 0xBD, 0xA9, 0x43, - 0xE5, 0xBD, 0xAB, 0x43, 0xE5, 0xBD, 0xB3, 0x43, - 0xE5, 0xBE, 0x8B, 0x43, 0xE5, 0xBE, 0x8C, 0x43, - 0xE5, 0xBE, 0x97, 0x43, 0xE5, 0xBE, 0x9A, 0x43, - 0xE5, 0xBE, 0xA9, 0x43, 0xE5, 0xBE, 0xAD, 0x43, - // Bytes b80 - bbf - 0xE5, 0xBF, 0x83, 0x43, 0xE5, 0xBF, 0x8D, 0x43, - 0xE5, 0xBF, 0x97, 0x43, 0xE5, 0xBF, 0xB5, 0x43, - 0xE5, 0xBF, 0xB9, 0x43, 0xE6, 0x80, 0x92, 0x43, - 0xE6, 0x80, 0x9C, 0x43, 0xE6, 0x81, 0xB5, 0x43, - 0xE6, 0x82, 0x81, 0x43, 0xE6, 0x82, 0x94, 0x43, - 0xE6, 0x83, 0x87, 0x43, 0xE6, 0x83, 0x98, 0x43, - 0xE6, 0x83, 0xA1, 0x43, 0xE6, 0x84, 0x88, 0x43, - 0xE6, 0x85, 0x84, 0x43, 0xE6, 0x85, 0x88, 0x43, - // Bytes bc0 - bff - 0xE6, 0x85, 0x8C, 0x43, 0xE6, 0x85, 0x8E, 0x43, - 0xE6, 0x85, 0xA0, 0x43, 0xE6, 0x85, 0xA8, 0x43, - 0xE6, 0x85, 0xBA, 0x43, 0xE6, 0x86, 0x8E, 0x43, - 0xE6, 0x86, 0x90, 0x43, 0xE6, 0x86, 0xA4, 0x43, - 0xE6, 0x86, 0xAF, 0x43, 0xE6, 0x86, 0xB2, 0x43, - 0xE6, 0x87, 0x9E, 0x43, 0xE6, 0x87, 0xB2, 0x43, - 0xE6, 0x87, 0xB6, 0x43, 0xE6, 0x88, 0x80, 0x43, - 0xE6, 0x88, 0x88, 0x43, 0xE6, 0x88, 0x90, 0x43, - // Bytes c00 - c3f - 0xE6, 0x88, 0x9B, 0x43, 0xE6, 0x88, 0xAE, 0x43, - 0xE6, 0x88, 0xB4, 0x43, 0xE6, 0x88, 0xB6, 0x43, - 0xE6, 0x89, 0x8B, 0x43, 0xE6, 0x89, 0x93, 0x43, - 0xE6, 0x89, 0x9D, 0x43, 0xE6, 0x8A, 0x95, 0x43, - 0xE6, 0x8A, 0xB1, 0x43, 0xE6, 0x8B, 0x89, 0x43, - 0xE6, 0x8B, 0x8F, 0x43, 0xE6, 0x8B, 0x93, 0x43, - 0xE6, 0x8B, 0x94, 0x43, 0xE6, 0x8B, 0xBC, 0x43, - 0xE6, 0x8B, 0xBE, 0x43, 0xE6, 0x8C, 0x87, 0x43, - // Bytes c40 - c7f - 0xE6, 0x8C, 0xBD, 0x43, 0xE6, 0x8D, 0x90, 0x43, - 0xE6, 0x8D, 0x95, 0x43, 0xE6, 0x8D, 0xA8, 0x43, - 0xE6, 0x8D, 0xBB, 0x43, 0xE6, 0x8E, 0x83, 0x43, - 0xE6, 0x8E, 0xA0, 0x43, 0xE6, 0x8E, 0xA9, 0x43, - 0xE6, 0x8F, 0x84, 0x43, 0xE6, 0x8F, 0x85, 0x43, - 0xE6, 0x8F, 0xA4, 0x43, 0xE6, 0x90, 0x9C, 0x43, - 0xE6, 0x90, 0xA2, 0x43, 0xE6, 0x91, 0x92, 0x43, - 0xE6, 0x91, 0xA9, 0x43, 0xE6, 0x91, 0xB7, 0x43, - // Bytes c80 - cbf - 0xE6, 0x91, 0xBE, 0x43, 0xE6, 0x92, 0x9A, 0x43, - 0xE6, 0x92, 0x9D, 0x43, 0xE6, 0x93, 0x84, 0x43, - 0xE6, 0x94, 0xAF, 0x43, 0xE6, 0x94, 0xB4, 0x43, - 0xE6, 0x95, 0x8F, 0x43, 0xE6, 0x95, 0x96, 0x43, - 0xE6, 0x95, 0xAC, 0x43, 0xE6, 0x95, 0xB8, 0x43, - 0xE6, 0x96, 0x87, 0x43, 0xE6, 0x96, 0x97, 0x43, - 0xE6, 0x96, 0x99, 0x43, 0xE6, 0x96, 0xA4, 0x43, - 0xE6, 0x96, 0xB0, 0x43, 0xE6, 0x96, 0xB9, 0x43, - // Bytes cc0 - cff - 0xE6, 0x97, 0x85, 0x43, 0xE6, 0x97, 0xA0, 0x43, - 0xE6, 0x97, 0xA2, 0x43, 0xE6, 0x97, 0xA3, 0x43, - 0xE6, 0x97, 0xA5, 0x43, 0xE6, 0x98, 0x93, 0x43, - 0xE6, 0x98, 0xA0, 0x43, 0xE6, 0x99, 0x89, 0x43, - 0xE6, 0x99, 0xB4, 0x43, 0xE6, 0x9A, 0x88, 0x43, - 0xE6, 0x9A, 0x91, 0x43, 0xE6, 0x9A, 0x9C, 0x43, - 0xE6, 0x9A, 0xB4, 0x43, 0xE6, 0x9B, 0x86, 0x43, - 0xE6, 0x9B, 0xB0, 0x43, 0xE6, 0x9B, 0xB4, 0x43, - // Bytes d00 - d3f - 0xE6, 0x9B, 0xB8, 0x43, 0xE6, 0x9C, 0x80, 0x43, - 0xE6, 0x9C, 0x88, 0x43, 0xE6, 0x9C, 0x89, 0x43, - 0xE6, 0x9C, 0x97, 0x43, 0xE6, 0x9C, 0x9B, 0x43, - 0xE6, 0x9C, 0xA1, 0x43, 0xE6, 0x9C, 0xA8, 0x43, - 0xE6, 0x9D, 0x8E, 0x43, 0xE6, 0x9D, 0x93, 0x43, - 0xE6, 0x9D, 0x96, 0x43, 0xE6, 0x9D, 0x9E, 0x43, - 0xE6, 0x9D, 0xBB, 0x43, 0xE6, 0x9E, 0x85, 0x43, - 0xE6, 0x9E, 0x97, 0x43, 0xE6, 0x9F, 0xB3, 0x43, - // Bytes d40 - d7f - 0xE6, 0x9F, 0xBA, 0x43, 0xE6, 0xA0, 0x97, 0x43, - 0xE6, 0xA0, 0x9F, 0x43, 0xE6, 0xA0, 0xAA, 0x43, - 0xE6, 0xA1, 0x92, 0x43, 0xE6, 0xA2, 0x81, 0x43, - 0xE6, 0xA2, 0x85, 0x43, 0xE6, 0xA2, 0x8E, 0x43, - 0xE6, 0xA2, 0xA8, 0x43, 0xE6, 0xA4, 0x94, 0x43, - 0xE6, 0xA5, 0x82, 0x43, 0xE6, 0xA6, 0xA3, 0x43, - 0xE6, 0xA7, 0xAA, 0x43, 0xE6, 0xA8, 0x82, 0x43, - 0xE6, 0xA8, 0x93, 0x43, 0xE6, 0xAA, 0xA8, 0x43, - // Bytes d80 - dbf - 0xE6, 0xAB, 0x93, 0x43, 0xE6, 0xAB, 0x9B, 0x43, - 0xE6, 0xAC, 0x84, 0x43, 0xE6, 0xAC, 0xA0, 0x43, - 0xE6, 0xAC, 0xA1, 0x43, 0xE6, 0xAD, 0x94, 0x43, - 0xE6, 0xAD, 0xA2, 0x43, 0xE6, 0xAD, 0xA3, 0x43, - 0xE6, 0xAD, 0xB2, 0x43, 0xE6, 0xAD, 0xB7, 0x43, - 0xE6, 0xAD, 0xB9, 0x43, 0xE6, 0xAE, 0x9F, 0x43, - 0xE6, 0xAE, 0xAE, 0x43, 0xE6, 0xAE, 0xB3, 0x43, - 0xE6, 0xAE, 0xBA, 0x43, 0xE6, 0xAE, 0xBB, 0x43, - // Bytes dc0 - dff - 0xE6, 0xAF, 0x8B, 0x43, 0xE6, 0xAF, 0x8D, 0x43, - 0xE6, 0xAF, 0x94, 0x43, 0xE6, 0xAF, 0x9B, 0x43, - 0xE6, 0xB0, 0x8F, 0x43, 0xE6, 0xB0, 0x94, 0x43, - 0xE6, 0xB0, 0xB4, 0x43, 0xE6, 0xB1, 0x8E, 0x43, - 0xE6, 0xB1, 0xA7, 0x43, 0xE6, 0xB2, 0x88, 0x43, - 0xE6, 0xB2, 0xBF, 0x43, 0xE6, 0xB3, 0x8C, 0x43, - 0xE6, 0xB3, 0x8D, 0x43, 0xE6, 0xB3, 0xA5, 0x43, - 0xE6, 0xB3, 0xA8, 0x43, 0xE6, 0xB4, 0x96, 0x43, - // Bytes e00 - e3f - 0xE6, 0xB4, 0x9B, 0x43, 0xE6, 0xB4, 0x9E, 0x43, - 0xE6, 0xB4, 0xB4, 0x43, 0xE6, 0xB4, 0xBE, 0x43, - 0xE6, 0xB5, 0x81, 0x43, 0xE6, 0xB5, 0xA9, 0x43, - 0xE6, 0xB5, 0xAA, 0x43, 0xE6, 0xB5, 0xB7, 0x43, - 0xE6, 0xB5, 0xB8, 0x43, 0xE6, 0xB6, 0x85, 0x43, - 0xE6, 0xB7, 0x8B, 0x43, 0xE6, 0xB7, 0x9A, 0x43, - 0xE6, 0xB7, 0xAA, 0x43, 0xE6, 0xB7, 0xB9, 0x43, - 0xE6, 0xB8, 0x9A, 0x43, 0xE6, 0xB8, 0xAF, 0x43, - // Bytes e40 - e7f - 0xE6, 0xB9, 0xAE, 0x43, 0xE6, 0xBA, 0x80, 0x43, - 0xE6, 0xBA, 0x9C, 0x43, 0xE6, 0xBA, 0xBA, 0x43, - 0xE6, 0xBB, 0x87, 0x43, 0xE6, 0xBB, 0x8B, 0x43, - 0xE6, 0xBB, 0x91, 0x43, 0xE6, 0xBB, 0x9B, 0x43, - 0xE6, 0xBC, 0x8F, 0x43, 0xE6, 0xBC, 0x94, 0x43, - 0xE6, 0xBC, 0xA2, 0x43, 0xE6, 0xBC, 0xA3, 0x43, - 0xE6, 0xBD, 0xAE, 0x43, 0xE6, 0xBF, 0x86, 0x43, - 0xE6, 0xBF, 0xAB, 0x43, 0xE6, 0xBF, 0xBE, 0x43, - // Bytes e80 - ebf - 0xE7, 0x80, 0x9B, 0x43, 0xE7, 0x80, 0x9E, 0x43, - 0xE7, 0x80, 0xB9, 0x43, 0xE7, 0x81, 0x8A, 0x43, - 0xE7, 0x81, 0xAB, 0x43, 0xE7, 0x81, 0xB0, 0x43, - 0xE7, 0x81, 0xB7, 0x43, 0xE7, 0x81, 0xBD, 0x43, - 0xE7, 0x82, 0x99, 0x43, 0xE7, 0x82, 0xAD, 0x43, - 0xE7, 0x83, 0x88, 0x43, 0xE7, 0x83, 0x99, 0x43, - 0xE7, 0x84, 0xA1, 0x43, 0xE7, 0x85, 0x85, 0x43, - 0xE7, 0x85, 0x89, 0x43, 0xE7, 0x85, 0xAE, 0x43, - // Bytes ec0 - eff - 0xE7, 0x86, 0x9C, 0x43, 0xE7, 0x87, 0x8E, 0x43, - 0xE7, 0x87, 0x90, 0x43, 0xE7, 0x88, 0x90, 0x43, - 0xE7, 0x88, 0x9B, 0x43, 0xE7, 0x88, 0xA8, 0x43, - 0xE7, 0x88, 0xAA, 0x43, 0xE7, 0x88, 0xAB, 0x43, - 0xE7, 0x88, 0xB5, 0x43, 0xE7, 0x88, 0xB6, 0x43, - 0xE7, 0x88, 0xBB, 0x43, 0xE7, 0x88, 0xBF, 0x43, - 0xE7, 0x89, 0x87, 0x43, 0xE7, 0x89, 0x90, 0x43, - 0xE7, 0x89, 0x99, 0x43, 0xE7, 0x89, 0x9B, 0x43, - // Bytes f00 - f3f - 0xE7, 0x89, 0xA2, 0x43, 0xE7, 0x89, 0xB9, 0x43, - 0xE7, 0x8A, 0x80, 0x43, 0xE7, 0x8A, 0x95, 0x43, - 0xE7, 0x8A, 0xAC, 0x43, 0xE7, 0x8A, 0xAF, 0x43, - 0xE7, 0x8B, 0x80, 0x43, 0xE7, 0x8B, 0xBC, 0x43, - 0xE7, 0x8C, 0xAA, 0x43, 0xE7, 0x8D, 0xB5, 0x43, - 0xE7, 0x8D, 0xBA, 0x43, 0xE7, 0x8E, 0x84, 0x43, - 0xE7, 0x8E, 0x87, 0x43, 0xE7, 0x8E, 0x89, 0x43, - 0xE7, 0x8E, 0x8B, 0x43, 0xE7, 0x8E, 0xA5, 0x43, - // Bytes f40 - f7f - 0xE7, 0x8E, 0xB2, 0x43, 0xE7, 0x8F, 0x9E, 0x43, - 0xE7, 0x90, 0x86, 0x43, 0xE7, 0x90, 0x89, 0x43, - 0xE7, 0x90, 0xA2, 0x43, 0xE7, 0x91, 0x87, 0x43, - 0xE7, 0x91, 0x9C, 0x43, 0xE7, 0x91, 0xA9, 0x43, - 0xE7, 0x91, 0xB1, 0x43, 0xE7, 0x92, 0x85, 0x43, - 0xE7, 0x92, 0x89, 0x43, 0xE7, 0x92, 0x98, 0x43, - 0xE7, 0x93, 0x8A, 0x43, 0xE7, 0x93, 0x9C, 0x43, - 0xE7, 0x93, 0xA6, 0x43, 0xE7, 0x94, 0x86, 0x43, - // Bytes f80 - fbf - 0xE7, 0x94, 0x98, 0x43, 0xE7, 0x94, 0x9F, 0x43, - 0xE7, 0x94, 0xA4, 0x43, 0xE7, 0x94, 0xA8, 0x43, - 0xE7, 0x94, 0xB0, 0x43, 0xE7, 0x94, 0xB2, 0x43, - 0xE7, 0x94, 0xB3, 0x43, 0xE7, 0x94, 0xB7, 0x43, - 0xE7, 0x94, 0xBB, 0x43, 0xE7, 0x94, 0xBE, 0x43, - 0xE7, 0x95, 0x99, 0x43, 0xE7, 0x95, 0xA5, 0x43, - 0xE7, 0x95, 0xB0, 0x43, 0xE7, 0x96, 0x8B, 0x43, - 0xE7, 0x96, 0x92, 0x43, 0xE7, 0x97, 0xA2, 0x43, - // Bytes fc0 - fff - 0xE7, 0x98, 0x90, 0x43, 0xE7, 0x98, 0x9D, 0x43, - 0xE7, 0x98, 0x9F, 0x43, 0xE7, 0x99, 0x82, 0x43, - 0xE7, 0x99, 0xA9, 0x43, 0xE7, 0x99, 0xB6, 0x43, - 0xE7, 0x99, 0xBD, 0x43, 0xE7, 0x9A, 0xAE, 0x43, - 0xE7, 0x9A, 0xBF, 0x43, 0xE7, 0x9B, 0x8A, 0x43, - 0xE7, 0x9B, 0x9B, 0x43, 0xE7, 0x9B, 0xA3, 0x43, - 0xE7, 0x9B, 0xA7, 0x43, 0xE7, 0x9B, 0xAE, 0x43, - 0xE7, 0x9B, 0xB4, 0x43, 0xE7, 0x9C, 0x81, 0x43, - // Bytes 1000 - 103f - 0xE7, 0x9C, 0x9E, 0x43, 0xE7, 0x9C, 0x9F, 0x43, - 0xE7, 0x9D, 0x80, 0x43, 0xE7, 0x9D, 0x8A, 0x43, - 0xE7, 0x9E, 0x8B, 0x43, 0xE7, 0x9E, 0xA7, 0x43, - 0xE7, 0x9F, 0x9B, 0x43, 0xE7, 0x9F, 0xA2, 0x43, - 0xE7, 0x9F, 0xB3, 0x43, 0xE7, 0xA1, 0x8E, 0x43, - 0xE7, 0xA1, 0xAB, 0x43, 0xE7, 0xA2, 0x8C, 0x43, - 0xE7, 0xA2, 0x91, 0x43, 0xE7, 0xA3, 0x8A, 0x43, - 0xE7, 0xA3, 0x8C, 0x43, 0xE7, 0xA3, 0xBB, 0x43, - // Bytes 1040 - 107f - 0xE7, 0xA4, 0xAA, 0x43, 0xE7, 0xA4, 0xBA, 0x43, - 0xE7, 0xA4, 0xBC, 0x43, 0xE7, 0xA4, 0xBE, 0x43, - 0xE7, 0xA5, 0x88, 0x43, 0xE7, 0xA5, 0x89, 0x43, - 0xE7, 0xA5, 0x90, 0x43, 0xE7, 0xA5, 0x96, 0x43, - 0xE7, 0xA5, 0x9D, 0x43, 0xE7, 0xA5, 0x9E, 0x43, - 0xE7, 0xA5, 0xA5, 0x43, 0xE7, 0xA5, 0xBF, 0x43, - 0xE7, 0xA6, 0x81, 0x43, 0xE7, 0xA6, 0x8D, 0x43, - 0xE7, 0xA6, 0x8E, 0x43, 0xE7, 0xA6, 0x8F, 0x43, - // Bytes 1080 - 10bf - 0xE7, 0xA6, 0xAE, 0x43, 0xE7, 0xA6, 0xB8, 0x43, - 0xE7, 0xA6, 0xBE, 0x43, 0xE7, 0xA7, 0x8A, 0x43, - 0xE7, 0xA7, 0x98, 0x43, 0xE7, 0xA7, 0xAB, 0x43, - 0xE7, 0xA8, 0x9C, 0x43, 0xE7, 0xA9, 0x80, 0x43, - 0xE7, 0xA9, 0x8A, 0x43, 0xE7, 0xA9, 0x8F, 0x43, - 0xE7, 0xA9, 0xB4, 0x43, 0xE7, 0xA9, 0xBA, 0x43, - 0xE7, 0xAA, 0x81, 0x43, 0xE7, 0xAA, 0xB1, 0x43, - 0xE7, 0xAB, 0x8B, 0x43, 0xE7, 0xAB, 0xAE, 0x43, - // Bytes 10c0 - 10ff - 0xE7, 0xAB, 0xB9, 0x43, 0xE7, 0xAC, 0xA0, 0x43, - 0xE7, 0xAE, 0x8F, 0x43, 0xE7, 0xAF, 0x80, 0x43, - 0xE7, 0xAF, 0x86, 0x43, 0xE7, 0xAF, 0x89, 0x43, - 0xE7, 0xB0, 0xBE, 0x43, 0xE7, 0xB1, 0xA0, 0x43, - 0xE7, 0xB1, 0xB3, 0x43, 0xE7, 0xB1, 0xBB, 0x43, - 0xE7, 0xB2, 0x92, 0x43, 0xE7, 0xB2, 0xBE, 0x43, - 0xE7, 0xB3, 0x92, 0x43, 0xE7, 0xB3, 0x96, 0x43, - 0xE7, 0xB3, 0xA3, 0x43, 0xE7, 0xB3, 0xA7, 0x43, - // Bytes 1100 - 113f - 0xE7, 0xB3, 0xA8, 0x43, 0xE7, 0xB3, 0xB8, 0x43, - 0xE7, 0xB4, 0x80, 0x43, 0xE7, 0xB4, 0x90, 0x43, - 0xE7, 0xB4, 0xA2, 0x43, 0xE7, 0xB4, 0xAF, 0x43, - 0xE7, 0xB5, 0x82, 0x43, 0xE7, 0xB5, 0x9B, 0x43, - 0xE7, 0xB5, 0xA3, 0x43, 0xE7, 0xB6, 0xA0, 0x43, - 0xE7, 0xB6, 0xBE, 0x43, 0xE7, 0xB7, 0x87, 0x43, - 0xE7, 0xB7, 0xB4, 0x43, 0xE7, 0xB8, 0x82, 0x43, - 0xE7, 0xB8, 0x89, 0x43, 0xE7, 0xB8, 0xB7, 0x43, - // Bytes 1140 - 117f - 0xE7, 0xB9, 0x81, 0x43, 0xE7, 0xB9, 0x85, 0x43, - 0xE7, 0xBC, 0xB6, 0x43, 0xE7, 0xBC, 0xBE, 0x43, - 0xE7, 0xBD, 0x91, 0x43, 0xE7, 0xBD, 0xB2, 0x43, - 0xE7, 0xBD, 0xB9, 0x43, 0xE7, 0xBD, 0xBA, 0x43, - 0xE7, 0xBE, 0x85, 0x43, 0xE7, 0xBE, 0x8A, 0x43, - 0xE7, 0xBE, 0x95, 0x43, 0xE7, 0xBE, 0x9A, 0x43, - 0xE7, 0xBE, 0xBD, 0x43, 0xE7, 0xBF, 0xBA, 0x43, - 0xE8, 0x80, 0x81, 0x43, 0xE8, 0x80, 0x85, 0x43, - // Bytes 1180 - 11bf - 0xE8, 0x80, 0x8C, 0x43, 0xE8, 0x80, 0x92, 0x43, - 0xE8, 0x80, 0xB3, 0x43, 0xE8, 0x81, 0x86, 0x43, - 0xE8, 0x81, 0xA0, 0x43, 0xE8, 0x81, 0xAF, 0x43, - 0xE8, 0x81, 0xB0, 0x43, 0xE8, 0x81, 0xBE, 0x43, - 0xE8, 0x81, 0xBF, 0x43, 0xE8, 0x82, 0x89, 0x43, - 0xE8, 0x82, 0x8B, 0x43, 0xE8, 0x82, 0xAD, 0x43, - 0xE8, 0x82, 0xB2, 0x43, 0xE8, 0x84, 0x83, 0x43, - 0xE8, 0x84, 0xBE, 0x43, 0xE8, 0x87, 0x98, 0x43, - // Bytes 11c0 - 11ff - 0xE8, 0x87, 0xA3, 0x43, 0xE8, 0x87, 0xA8, 0x43, - 0xE8, 0x87, 0xAA, 0x43, 0xE8, 0x87, 0xAD, 0x43, - 0xE8, 0x87, 0xB3, 0x43, 0xE8, 0x87, 0xBC, 0x43, - 0xE8, 0x88, 0x81, 0x43, 0xE8, 0x88, 0x84, 0x43, - 0xE8, 0x88, 0x8C, 0x43, 0xE8, 0x88, 0x98, 0x43, - 0xE8, 0x88, 0x9B, 0x43, 0xE8, 0x88, 0x9F, 0x43, - 0xE8, 0x89, 0xAE, 0x43, 0xE8, 0x89, 0xAF, 0x43, - 0xE8, 0x89, 0xB2, 0x43, 0xE8, 0x89, 0xB8, 0x43, - // Bytes 1200 - 123f - 0xE8, 0x89, 0xB9, 0x43, 0xE8, 0x8A, 0x8B, 0x43, - 0xE8, 0x8A, 0x91, 0x43, 0xE8, 0x8A, 0x9D, 0x43, - 0xE8, 0x8A, 0xB1, 0x43, 0xE8, 0x8A, 0xB3, 0x43, - 0xE8, 0x8A, 0xBD, 0x43, 0xE8, 0x8B, 0xA5, 0x43, - 0xE8, 0x8B, 0xA6, 0x43, 0xE8, 0x8C, 0x9D, 0x43, - 0xE8, 0x8C, 0xA3, 0x43, 0xE8, 0x8C, 0xB6, 0x43, - 0xE8, 0x8D, 0x92, 0x43, 0xE8, 0x8D, 0x93, 0x43, - 0xE8, 0x8D, 0xA3, 0x43, 0xE8, 0x8E, 0xAD, 0x43, - // Bytes 1240 - 127f - 0xE8, 0x8E, 0xBD, 0x43, 0xE8, 0x8F, 0x89, 0x43, - 0xE8, 0x8F, 0x8A, 0x43, 0xE8, 0x8F, 0x8C, 0x43, - 0xE8, 0x8F, 0x9C, 0x43, 0xE8, 0x8F, 0xA7, 0x43, - 0xE8, 0x8F, 0xAF, 0x43, 0xE8, 0x8F, 0xB1, 0x43, - 0xE8, 0x90, 0xBD, 0x43, 0xE8, 0x91, 0x89, 0x43, - 0xE8, 0x91, 0x97, 0x43, 0xE8, 0x93, 0xAE, 0x43, - 0xE8, 0x93, 0xB1, 0x43, 0xE8, 0x93, 0xB3, 0x43, - 0xE8, 0x93, 0xBC, 0x43, 0xE8, 0x94, 0x96, 0x43, - // Bytes 1280 - 12bf - 0xE8, 0x95, 0xA4, 0x43, 0xE8, 0x97, 0x8D, 0x43, - 0xE8, 0x97, 0xBA, 0x43, 0xE8, 0x98, 0x86, 0x43, - 0xE8, 0x98, 0x92, 0x43, 0xE8, 0x98, 0xAD, 0x43, - 0xE8, 0x98, 0xBF, 0x43, 0xE8, 0x99, 0x8D, 0x43, - 0xE8, 0x99, 0x90, 0x43, 0xE8, 0x99, 0x9C, 0x43, - 0xE8, 0x99, 0xA7, 0x43, 0xE8, 0x99, 0xA9, 0x43, - 0xE8, 0x99, 0xAB, 0x43, 0xE8, 0x9A, 0x88, 0x43, - 0xE8, 0x9A, 0xA9, 0x43, 0xE8, 0x9B, 0xA2, 0x43, - // Bytes 12c0 - 12ff - 0xE8, 0x9C, 0x8E, 0x43, 0xE8, 0x9C, 0xA8, 0x43, - 0xE8, 0x9D, 0xAB, 0x43, 0xE8, 0x9D, 0xB9, 0x43, - 0xE8, 0x9E, 0x86, 0x43, 0xE8, 0x9E, 0xBA, 0x43, - 0xE8, 0x9F, 0xA1, 0x43, 0xE8, 0xA0, 0x81, 0x43, - 0xE8, 0xA0, 0x9F, 0x43, 0xE8, 0xA1, 0x80, 0x43, - 0xE8, 0xA1, 0x8C, 0x43, 0xE8, 0xA1, 0xA0, 0x43, - 0xE8, 0xA1, 0xA3, 0x43, 0xE8, 0xA3, 0x82, 0x43, - 0xE8, 0xA3, 0x8F, 0x43, 0xE8, 0xA3, 0x97, 0x43, - // Bytes 1300 - 133f - 0xE8, 0xA3, 0x9E, 0x43, 0xE8, 0xA3, 0xA1, 0x43, - 0xE8, 0xA3, 0xB8, 0x43, 0xE8, 0xA3, 0xBA, 0x43, - 0xE8, 0xA4, 0x90, 0x43, 0xE8, 0xA5, 0x81, 0x43, - 0xE8, 0xA5, 0xA4, 0x43, 0xE8, 0xA5, 0xBE, 0x43, - 0xE8, 0xA6, 0x86, 0x43, 0xE8, 0xA6, 0x8B, 0x43, - 0xE8, 0xA6, 0x96, 0x43, 0xE8, 0xA7, 0x92, 0x43, - 0xE8, 0xA7, 0xA3, 0x43, 0xE8, 0xA8, 0x80, 0x43, - 0xE8, 0xAA, 0xA0, 0x43, 0xE8, 0xAA, 0xAA, 0x43, - // Bytes 1340 - 137f - 0xE8, 0xAA, 0xBF, 0x43, 0xE8, 0xAB, 0x8B, 0x43, - 0xE8, 0xAB, 0x92, 0x43, 0xE8, 0xAB, 0x96, 0x43, - 0xE8, 0xAB, 0xAD, 0x43, 0xE8, 0xAB, 0xB8, 0x43, - 0xE8, 0xAB, 0xBE, 0x43, 0xE8, 0xAC, 0x81, 0x43, - 0xE8, 0xAC, 0xB9, 0x43, 0xE8, 0xAD, 0x98, 0x43, - 0xE8, 0xAE, 0x80, 0x43, 0xE8, 0xAE, 0x8A, 0x43, - 0xE8, 0xB0, 0xB7, 0x43, 0xE8, 0xB1, 0x86, 0x43, - 0xE8, 0xB1, 0x88, 0x43, 0xE8, 0xB1, 0x95, 0x43, - // Bytes 1380 - 13bf - 0xE8, 0xB1, 0xB8, 0x43, 0xE8, 0xB2, 0x9D, 0x43, - 0xE8, 0xB2, 0xA1, 0x43, 0xE8, 0xB2, 0xA9, 0x43, - 0xE8, 0xB2, 0xAB, 0x43, 0xE8, 0xB3, 0x81, 0x43, - 0xE8, 0xB3, 0x82, 0x43, 0xE8, 0xB3, 0x87, 0x43, - 0xE8, 0xB3, 0x88, 0x43, 0xE8, 0xB3, 0x93, 0x43, - 0xE8, 0xB4, 0x88, 0x43, 0xE8, 0xB4, 0x9B, 0x43, - 0xE8, 0xB5, 0xA4, 0x43, 0xE8, 0xB5, 0xB0, 0x43, - 0xE8, 0xB5, 0xB7, 0x43, 0xE8, 0xB6, 0xB3, 0x43, - // Bytes 13c0 - 13ff - 0xE8, 0xB6, 0xBC, 0x43, 0xE8, 0xB7, 0x8B, 0x43, - 0xE8, 0xB7, 0xAF, 0x43, 0xE8, 0xB7, 0xB0, 0x43, - 0xE8, 0xBA, 0xAB, 0x43, 0xE8, 0xBB, 0x8A, 0x43, - 0xE8, 0xBB, 0x94, 0x43, 0xE8, 0xBC, 0xA6, 0x43, - 0xE8, 0xBC, 0xAA, 0x43, 0xE8, 0xBC, 0xB8, 0x43, - 0xE8, 0xBC, 0xBB, 0x43, 0xE8, 0xBD, 0xA2, 0x43, - 0xE8, 0xBE, 0x9B, 0x43, 0xE8, 0xBE, 0x9E, 0x43, - 0xE8, 0xBE, 0xB0, 0x43, 0xE8, 0xBE, 0xB5, 0x43, - // Bytes 1400 - 143f - 0xE8, 0xBE, 0xB6, 0x43, 0xE9, 0x80, 0xA3, 0x43, - 0xE9, 0x80, 0xB8, 0x43, 0xE9, 0x81, 0x8A, 0x43, - 0xE9, 0x81, 0xA9, 0x43, 0xE9, 0x81, 0xB2, 0x43, - 0xE9, 0x81, 0xBC, 0x43, 0xE9, 0x82, 0x8F, 0x43, - 0xE9, 0x82, 0x91, 0x43, 0xE9, 0x82, 0x94, 0x43, - 0xE9, 0x83, 0x8E, 0x43, 0xE9, 0x83, 0x9E, 0x43, - 0xE9, 0x83, 0xB1, 0x43, 0xE9, 0x83, 0xBD, 0x43, - 0xE9, 0x84, 0x91, 0x43, 0xE9, 0x84, 0x9B, 0x43, - // Bytes 1440 - 147f - 0xE9, 0x85, 0x89, 0x43, 0xE9, 0x85, 0x8D, 0x43, - 0xE9, 0x85, 0xAA, 0x43, 0xE9, 0x86, 0x99, 0x43, - 0xE9, 0x86, 0xB4, 0x43, 0xE9, 0x87, 0x86, 0x43, - 0xE9, 0x87, 0x8C, 0x43, 0xE9, 0x87, 0x8F, 0x43, - 0xE9, 0x87, 0x91, 0x43, 0xE9, 0x88, 0xB4, 0x43, - 0xE9, 0x88, 0xB8, 0x43, 0xE9, 0x89, 0xB6, 0x43, - 0xE9, 0x89, 0xBC, 0x43, 0xE9, 0x8B, 0x97, 0x43, - 0xE9, 0x8B, 0x98, 0x43, 0xE9, 0x8C, 0x84, 0x43, - // Bytes 1480 - 14bf - 0xE9, 0x8D, 0x8A, 0x43, 0xE9, 0x8F, 0xB9, 0x43, - 0xE9, 0x90, 0x95, 0x43, 0xE9, 0x95, 0xB7, 0x43, - 0xE9, 0x96, 0x80, 0x43, 0xE9, 0x96, 0x8B, 0x43, - 0xE9, 0x96, 0xAD, 0x43, 0xE9, 0x96, 0xB7, 0x43, - 0xE9, 0x98, 0x9C, 0x43, 0xE9, 0x98, 0xAE, 0x43, - 0xE9, 0x99, 0x8B, 0x43, 0xE9, 0x99, 0x8D, 0x43, - 0xE9, 0x99, 0xB5, 0x43, 0xE9, 0x99, 0xB8, 0x43, - 0xE9, 0x99, 0xBC, 0x43, 0xE9, 0x9A, 0x86, 0x43, - // Bytes 14c0 - 14ff - 0xE9, 0x9A, 0xA3, 0x43, 0xE9, 0x9A, 0xB6, 0x43, - 0xE9, 0x9A, 0xB7, 0x43, 0xE9, 0x9A, 0xB8, 0x43, - 0xE9, 0x9A, 0xB9, 0x43, 0xE9, 0x9B, 0x83, 0x43, - 0xE9, 0x9B, 0xA2, 0x43, 0xE9, 0x9B, 0xA3, 0x43, - 0xE9, 0x9B, 0xA8, 0x43, 0xE9, 0x9B, 0xB6, 0x43, - 0xE9, 0x9B, 0xB7, 0x43, 0xE9, 0x9C, 0xA3, 0x43, - 0xE9, 0x9C, 0xB2, 0x43, 0xE9, 0x9D, 0x88, 0x43, - 0xE9, 0x9D, 0x91, 0x43, 0xE9, 0x9D, 0x96, 0x43, - // Bytes 1500 - 153f - 0xE9, 0x9D, 0x9E, 0x43, 0xE9, 0x9D, 0xA2, 0x43, - 0xE9, 0x9D, 0xA9, 0x43, 0xE9, 0x9F, 0x8B, 0x43, - 0xE9, 0x9F, 0x9B, 0x43, 0xE9, 0x9F, 0xA0, 0x43, - 0xE9, 0x9F, 0xAD, 0x43, 0xE9, 0x9F, 0xB3, 0x43, - 0xE9, 0x9F, 0xBF, 0x43, 0xE9, 0xA0, 0x81, 0x43, - 0xE9, 0xA0, 0x85, 0x43, 0xE9, 0xA0, 0x8B, 0x43, - 0xE9, 0xA0, 0x98, 0x43, 0xE9, 0xA0, 0xA9, 0x43, - 0xE9, 0xA0, 0xBB, 0x43, 0xE9, 0xA1, 0x9E, 0x43, - // Bytes 1540 - 157f - 0xE9, 0xA2, 0xA8, 0x43, 0xE9, 0xA3, 0x9B, 0x43, - 0xE9, 0xA3, 0x9F, 0x43, 0xE9, 0xA3, 0xA2, 0x43, - 0xE9, 0xA3, 0xAF, 0x43, 0xE9, 0xA3, 0xBC, 0x43, - 0xE9, 0xA4, 0xA8, 0x43, 0xE9, 0xA4, 0xA9, 0x43, - 0xE9, 0xA6, 0x96, 0x43, 0xE9, 0xA6, 0x99, 0x43, - 0xE9, 0xA6, 0xA7, 0x43, 0xE9, 0xA6, 0xAC, 0x43, - 0xE9, 0xA7, 0x82, 0x43, 0xE9, 0xA7, 0xB1, 0x43, - 0xE9, 0xA7, 0xBE, 0x43, 0xE9, 0xA9, 0xAA, 0x43, - // Bytes 1580 - 15bf - 0xE9, 0xAA, 0xA8, 0x43, 0xE9, 0xAB, 0x98, 0x43, - 0xE9, 0xAB, 0x9F, 0x43, 0xE9, 0xAC, 0x92, 0x43, - 0xE9, 0xAC, 0xA5, 0x43, 0xE9, 0xAC, 0xAF, 0x43, - 0xE9, 0xAC, 0xB2, 0x43, 0xE9, 0xAC, 0xBC, 0x43, - 0xE9, 0xAD, 0x9A, 0x43, 0xE9, 0xAD, 0xAF, 0x43, - 0xE9, 0xB1, 0x80, 0x43, 0xE9, 0xB1, 0x97, 0x43, - 0xE9, 0xB3, 0xA5, 0x43, 0xE9, 0xB3, 0xBD, 0x43, - 0xE9, 0xB5, 0xA7, 0x43, 0xE9, 0xB6, 0xB4, 0x43, - // Bytes 15c0 - 15ff - 0xE9, 0xB7, 0xBA, 0x43, 0xE9, 0xB8, 0x9E, 0x43, - 0xE9, 0xB9, 0xB5, 0x43, 0xE9, 0xB9, 0xBF, 0x43, - 0xE9, 0xBA, 0x97, 0x43, 0xE9, 0xBA, 0x9F, 0x43, - 0xE9, 0xBA, 0xA5, 0x43, 0xE9, 0xBA, 0xBB, 0x43, - 0xE9, 0xBB, 0x83, 0x43, 0xE9, 0xBB, 0x8D, 0x43, - 0xE9, 0xBB, 0x8E, 0x43, 0xE9, 0xBB, 0x91, 0x43, - 0xE9, 0xBB, 0xB9, 0x43, 0xE9, 0xBB, 0xBD, 0x43, - 0xE9, 0xBB, 0xBE, 0x43, 0xE9, 0xBC, 0x85, 0x43, - // Bytes 1600 - 163f - 0xE9, 0xBC, 0x8E, 0x43, 0xE9, 0xBC, 0x8F, 0x43, - 0xE9, 0xBC, 0x93, 0x43, 0xE9, 0xBC, 0x96, 0x43, - 0xE9, 0xBC, 0xA0, 0x43, 0xE9, 0xBC, 0xBB, 0x43, - 0xE9, 0xBD, 0x83, 0x43, 0xE9, 0xBD, 0x8A, 0x43, - 0xE9, 0xBD, 0x92, 0x43, 0xE9, 0xBE, 0x8D, 0x43, - 0xE9, 0xBE, 0x8E, 0x43, 0xE9, 0xBE, 0x9C, 0x43, - 0xE9, 0xBE, 0x9F, 0x43, 0xE9, 0xBE, 0xA0, 0x43, - 0xEA, 0x9C, 0xA7, 0x43, 0xEA, 0x9D, 0xAF, 0x43, - // Bytes 1640 - 167f - 0xEA, 0xAC, 0xB7, 0x43, 0xEA, 0xAD, 0x92, 0x44, - 0xF0, 0xA0, 0x84, 0xA2, 0x44, 0xF0, 0xA0, 0x94, - 0x9C, 0x44, 0xF0, 0xA0, 0x94, 0xA5, 0x44, 0xF0, - 0xA0, 0x95, 0x8B, 0x44, 0xF0, 0xA0, 0x98, 0xBA, - 0x44, 0xF0, 0xA0, 0xA0, 0x84, 0x44, 0xF0, 0xA0, - 0xA3, 0x9E, 0x44, 0xF0, 0xA0, 0xA8, 0xAC, 0x44, - 0xF0, 0xA0, 0xAD, 0xA3, 0x44, 0xF0, 0xA1, 0x93, - 0xA4, 0x44, 0xF0, 0xA1, 0x9A, 0xA8, 0x44, 0xF0, - // Bytes 1680 - 16bf - 0xA1, 0x9B, 0xAA, 0x44, 0xF0, 0xA1, 0xA7, 0x88, - 0x44, 0xF0, 0xA1, 0xAC, 0x98, 0x44, 0xF0, 0xA1, - 0xB4, 0x8B, 0x44, 0xF0, 0xA1, 0xB7, 0xA4, 0x44, - 0xF0, 0xA1, 0xB7, 0xA6, 0x44, 0xF0, 0xA2, 0x86, - 0x83, 0x44, 0xF0, 0xA2, 0x86, 0x9F, 0x44, 0xF0, - 0xA2, 0x8C, 0xB1, 0x44, 0xF0, 0xA2, 0x9B, 0x94, - 0x44, 0xF0, 0xA2, 0xA1, 0x84, 0x44, 0xF0, 0xA2, - 0xA1, 0x8A, 0x44, 0xF0, 0xA2, 0xAC, 0x8C, 0x44, - // Bytes 16c0 - 16ff - 0xF0, 0xA2, 0xAF, 0xB1, 0x44, 0xF0, 0xA3, 0x80, - 0x8A, 0x44, 0xF0, 0xA3, 0x8A, 0xB8, 0x44, 0xF0, - 0xA3, 0x8D, 0x9F, 0x44, 0xF0, 0xA3, 0x8E, 0x93, - 0x44, 0xF0, 0xA3, 0x8E, 0x9C, 0x44, 0xF0, 0xA3, - 0x8F, 0x83, 0x44, 0xF0, 0xA3, 0x8F, 0x95, 0x44, - 0xF0, 0xA3, 0x91, 0xAD, 0x44, 0xF0, 0xA3, 0x9A, - 0xA3, 0x44, 0xF0, 0xA3, 0xA2, 0xA7, 0x44, 0xF0, - 0xA3, 0xAA, 0x8D, 0x44, 0xF0, 0xA3, 0xAB, 0xBA, - // Bytes 1700 - 173f - 0x44, 0xF0, 0xA3, 0xB2, 0xBC, 0x44, 0xF0, 0xA3, - 0xB4, 0x9E, 0x44, 0xF0, 0xA3, 0xBB, 0x91, 0x44, - 0xF0, 0xA3, 0xBD, 0x9E, 0x44, 0xF0, 0xA3, 0xBE, - 0x8E, 0x44, 0xF0, 0xA4, 0x89, 0xA3, 0x44, 0xF0, - 0xA4, 0x8B, 0xAE, 0x44, 0xF0, 0xA4, 0x8E, 0xAB, - 0x44, 0xF0, 0xA4, 0x98, 0x88, 0x44, 0xF0, 0xA4, - 0x9C, 0xB5, 0x44, 0xF0, 0xA4, 0xA0, 0x94, 0x44, - 0xF0, 0xA4, 0xB0, 0xB6, 0x44, 0xF0, 0xA4, 0xB2, - // Bytes 1740 - 177f - 0x92, 0x44, 0xF0, 0xA4, 0xBE, 0xA1, 0x44, 0xF0, - 0xA4, 0xBE, 0xB8, 0x44, 0xF0, 0xA5, 0x81, 0x84, - 0x44, 0xF0, 0xA5, 0x83, 0xB2, 0x44, 0xF0, 0xA5, - 0x83, 0xB3, 0x44, 0xF0, 0xA5, 0x84, 0x99, 0x44, - 0xF0, 0xA5, 0x84, 0xB3, 0x44, 0xF0, 0xA5, 0x89, - 0x89, 0x44, 0xF0, 0xA5, 0x90, 0x9D, 0x44, 0xF0, - 0xA5, 0x98, 0xA6, 0x44, 0xF0, 0xA5, 0x9A, 0x9A, - 0x44, 0xF0, 0xA5, 0x9B, 0x85, 0x44, 0xF0, 0xA5, - // Bytes 1780 - 17bf - 0xA5, 0xBC, 0x44, 0xF0, 0xA5, 0xAA, 0xA7, 0x44, - 0xF0, 0xA5, 0xAE, 0xAB, 0x44, 0xF0, 0xA5, 0xB2, - 0x80, 0x44, 0xF0, 0xA5, 0xB3, 0x90, 0x44, 0xF0, - 0xA5, 0xBE, 0x86, 0x44, 0xF0, 0xA6, 0x87, 0x9A, - 0x44, 0xF0, 0xA6, 0x88, 0xA8, 0x44, 0xF0, 0xA6, - 0x89, 0x87, 0x44, 0xF0, 0xA6, 0x8B, 0x99, 0x44, - 0xF0, 0xA6, 0x8C, 0xBE, 0x44, 0xF0, 0xA6, 0x93, - 0x9A, 0x44, 0xF0, 0xA6, 0x94, 0xA3, 0x44, 0xF0, - // Bytes 17c0 - 17ff - 0xA6, 0x96, 0xA8, 0x44, 0xF0, 0xA6, 0x9E, 0xA7, - 0x44, 0xF0, 0xA6, 0x9E, 0xB5, 0x44, 0xF0, 0xA6, - 0xAC, 0xBC, 0x44, 0xF0, 0xA6, 0xB0, 0xB6, 0x44, - 0xF0, 0xA6, 0xB3, 0x95, 0x44, 0xF0, 0xA6, 0xB5, - 0xAB, 0x44, 0xF0, 0xA6, 0xBC, 0xAC, 0x44, 0xF0, - 0xA6, 0xBE, 0xB1, 0x44, 0xF0, 0xA7, 0x83, 0x92, - 0x44, 0xF0, 0xA7, 0x8F, 0x8A, 0x44, 0xF0, 0xA7, - 0x99, 0xA7, 0x44, 0xF0, 0xA7, 0xA2, 0xAE, 0x44, - // Bytes 1800 - 183f - 0xF0, 0xA7, 0xA5, 0xA6, 0x44, 0xF0, 0xA7, 0xB2, - 0xA8, 0x44, 0xF0, 0xA7, 0xBB, 0x93, 0x44, 0xF0, - 0xA7, 0xBC, 0xAF, 0x44, 0xF0, 0xA8, 0x97, 0x92, - 0x44, 0xF0, 0xA8, 0x97, 0xAD, 0x44, 0xF0, 0xA8, - 0x9C, 0xAE, 0x44, 0xF0, 0xA8, 0xAF, 0xBA, 0x44, - 0xF0, 0xA8, 0xB5, 0xB7, 0x44, 0xF0, 0xA9, 0x85, - 0x85, 0x44, 0xF0, 0xA9, 0x87, 0x9F, 0x44, 0xF0, - 0xA9, 0x88, 0x9A, 0x44, 0xF0, 0xA9, 0x90, 0x8A, - // Bytes 1840 - 187f - 0x44, 0xF0, 0xA9, 0x92, 0x96, 0x44, 0xF0, 0xA9, - 0x96, 0xB6, 0x44, 0xF0, 0xA9, 0xAC, 0xB0, 0x44, - 0xF0, 0xAA, 0x83, 0x8E, 0x44, 0xF0, 0xAA, 0x84, - 0x85, 0x44, 0xF0, 0xAA, 0x88, 0x8E, 0x44, 0xF0, - 0xAA, 0x8A, 0x91, 0x44, 0xF0, 0xAA, 0x8E, 0x92, - 0x44, 0xF0, 0xAA, 0x98, 0x80, 0x42, 0x21, 0x21, - 0x42, 0x21, 0x3F, 0x42, 0x2E, 0x2E, 0x42, 0x30, - 0x2C, 0x42, 0x30, 0x2E, 0x42, 0x31, 0x2C, 0x42, - // Bytes 1880 - 18bf - 0x31, 0x2E, 0x42, 0x31, 0x30, 0x42, 0x31, 0x31, - 0x42, 0x31, 0x32, 0x42, 0x31, 0x33, 0x42, 0x31, - 0x34, 0x42, 0x31, 0x35, 0x42, 0x31, 0x36, 0x42, - 0x31, 0x37, 0x42, 0x31, 0x38, 0x42, 0x31, 0x39, - 0x42, 0x32, 0x2C, 0x42, 0x32, 0x2E, 0x42, 0x32, - 0x30, 0x42, 0x32, 0x31, 0x42, 0x32, 0x32, 0x42, - 0x32, 0x33, 0x42, 0x32, 0x34, 0x42, 0x32, 0x35, - 0x42, 0x32, 0x36, 0x42, 0x32, 0x37, 0x42, 0x32, - // Bytes 18c0 - 18ff - 0x38, 0x42, 0x32, 0x39, 0x42, 0x33, 0x2C, 0x42, - 0x33, 0x2E, 0x42, 0x33, 0x30, 0x42, 0x33, 0x31, - 0x42, 0x33, 0x32, 0x42, 0x33, 0x33, 0x42, 0x33, - 0x34, 0x42, 0x33, 0x35, 0x42, 0x33, 0x36, 0x42, - 0x33, 0x37, 0x42, 0x33, 0x38, 0x42, 0x33, 0x39, - 0x42, 0x34, 0x2C, 0x42, 0x34, 0x2E, 0x42, 0x34, - 0x30, 0x42, 0x34, 0x31, 0x42, 0x34, 0x32, 0x42, - 0x34, 0x33, 0x42, 0x34, 0x34, 0x42, 0x34, 0x35, - // Bytes 1900 - 193f - 0x42, 0x34, 0x36, 0x42, 0x34, 0x37, 0x42, 0x34, - 0x38, 0x42, 0x34, 0x39, 0x42, 0x35, 0x2C, 0x42, - 0x35, 0x2E, 0x42, 0x35, 0x30, 0x42, 0x36, 0x2C, - 0x42, 0x36, 0x2E, 0x42, 0x37, 0x2C, 0x42, 0x37, - 0x2E, 0x42, 0x38, 0x2C, 0x42, 0x38, 0x2E, 0x42, - 0x39, 0x2C, 0x42, 0x39, 0x2E, 0x42, 0x3D, 0x3D, - 0x42, 0x3F, 0x21, 0x42, 0x3F, 0x3F, 0x42, 0x41, - 0x55, 0x42, 0x42, 0x71, 0x42, 0x43, 0x44, 0x42, - // Bytes 1940 - 197f - 0x44, 0x4A, 0x42, 0x44, 0x5A, 0x42, 0x44, 0x7A, - 0x42, 0x47, 0x42, 0x42, 0x47, 0x79, 0x42, 0x48, - 0x50, 0x42, 0x48, 0x56, 0x42, 0x48, 0x67, 0x42, - 0x48, 0x7A, 0x42, 0x49, 0x49, 0x42, 0x49, 0x4A, - 0x42, 0x49, 0x55, 0x42, 0x49, 0x56, 0x42, 0x49, - 0x58, 0x42, 0x4B, 0x42, 0x42, 0x4B, 0x4B, 0x42, - 0x4B, 0x4D, 0x42, 0x4C, 0x4A, 0x42, 0x4C, 0x6A, - 0x42, 0x4D, 0x42, 0x42, 0x4D, 0x43, 0x42, 0x4D, - // Bytes 1980 - 19bf - 0x44, 0x42, 0x4D, 0x56, 0x42, 0x4D, 0x57, 0x42, - 0x4E, 0x4A, 0x42, 0x4E, 0x6A, 0x42, 0x4E, 0x6F, - 0x42, 0x50, 0x48, 0x42, 0x50, 0x52, 0x42, 0x50, - 0x61, 0x42, 0x52, 0x73, 0x42, 0x53, 0x44, 0x42, - 0x53, 0x4D, 0x42, 0x53, 0x53, 0x42, 0x53, 0x76, - 0x42, 0x54, 0x4D, 0x42, 0x56, 0x49, 0x42, 0x57, - 0x43, 0x42, 0x57, 0x5A, 0x42, 0x57, 0x62, 0x42, - 0x58, 0x49, 0x42, 0x63, 0x63, 0x42, 0x63, 0x64, - // Bytes 19c0 - 19ff - 0x42, 0x63, 0x6D, 0x42, 0x64, 0x42, 0x42, 0x64, - 0x61, 0x42, 0x64, 0x6C, 0x42, 0x64, 0x6D, 0x42, - 0x64, 0x7A, 0x42, 0x65, 0x56, 0x42, 0x66, 0x66, - 0x42, 0x66, 0x69, 0x42, 0x66, 0x6C, 0x42, 0x66, - 0x6D, 0x42, 0x68, 0x61, 0x42, 0x69, 0x69, 0x42, - 0x69, 0x6A, 0x42, 0x69, 0x6E, 0x42, 0x69, 0x76, - 0x42, 0x69, 0x78, 0x42, 0x6B, 0x41, 0x42, 0x6B, - 0x56, 0x42, 0x6B, 0x57, 0x42, 0x6B, 0x67, 0x42, - // Bytes 1a00 - 1a3f - 0x6B, 0x6C, 0x42, 0x6B, 0x6D, 0x42, 0x6B, 0x74, - 0x42, 0x6C, 0x6A, 0x42, 0x6C, 0x6D, 0x42, 0x6C, - 0x6E, 0x42, 0x6C, 0x78, 0x42, 0x6D, 0x32, 0x42, - 0x6D, 0x33, 0x42, 0x6D, 0x41, 0x42, 0x6D, 0x56, - 0x42, 0x6D, 0x57, 0x42, 0x6D, 0x62, 0x42, 0x6D, - 0x67, 0x42, 0x6D, 0x6C, 0x42, 0x6D, 0x6D, 0x42, - 0x6D, 0x73, 0x42, 0x6E, 0x41, 0x42, 0x6E, 0x46, - 0x42, 0x6E, 0x56, 0x42, 0x6E, 0x57, 0x42, 0x6E, - // Bytes 1a40 - 1a7f - 0x6A, 0x42, 0x6E, 0x6D, 0x42, 0x6E, 0x73, 0x42, - 0x6F, 0x56, 0x42, 0x70, 0x41, 0x42, 0x70, 0x46, - 0x42, 0x70, 0x56, 0x42, 0x70, 0x57, 0x42, 0x70, - 0x63, 0x42, 0x70, 0x73, 0x42, 0x73, 0x72, 0x42, - 0x73, 0x74, 0x42, 0x76, 0x69, 0x42, 0x78, 0x69, - 0x43, 0x28, 0x31, 0x29, 0x43, 0x28, 0x32, 0x29, - 0x43, 0x28, 0x33, 0x29, 0x43, 0x28, 0x34, 0x29, - 0x43, 0x28, 0x35, 0x29, 0x43, 0x28, 0x36, 0x29, - // Bytes 1a80 - 1abf - 0x43, 0x28, 0x37, 0x29, 0x43, 0x28, 0x38, 0x29, - 0x43, 0x28, 0x39, 0x29, 0x43, 0x28, 0x41, 0x29, - 0x43, 0x28, 0x42, 0x29, 0x43, 0x28, 0x43, 0x29, - 0x43, 0x28, 0x44, 0x29, 0x43, 0x28, 0x45, 0x29, - 0x43, 0x28, 0x46, 0x29, 0x43, 0x28, 0x47, 0x29, - 0x43, 0x28, 0x48, 0x29, 0x43, 0x28, 0x49, 0x29, - 0x43, 0x28, 0x4A, 0x29, 0x43, 0x28, 0x4B, 0x29, - 0x43, 0x28, 0x4C, 0x29, 0x43, 0x28, 0x4D, 0x29, - // Bytes 1ac0 - 1aff - 0x43, 0x28, 0x4E, 0x29, 0x43, 0x28, 0x4F, 0x29, - 0x43, 0x28, 0x50, 0x29, 0x43, 0x28, 0x51, 0x29, - 0x43, 0x28, 0x52, 0x29, 0x43, 0x28, 0x53, 0x29, - 0x43, 0x28, 0x54, 0x29, 0x43, 0x28, 0x55, 0x29, - 0x43, 0x28, 0x56, 0x29, 0x43, 0x28, 0x57, 0x29, - 0x43, 0x28, 0x58, 0x29, 0x43, 0x28, 0x59, 0x29, - 0x43, 0x28, 0x5A, 0x29, 0x43, 0x28, 0x61, 0x29, - 0x43, 0x28, 0x62, 0x29, 0x43, 0x28, 0x63, 0x29, - // Bytes 1b00 - 1b3f - 0x43, 0x28, 0x64, 0x29, 0x43, 0x28, 0x65, 0x29, - 0x43, 0x28, 0x66, 0x29, 0x43, 0x28, 0x67, 0x29, - 0x43, 0x28, 0x68, 0x29, 0x43, 0x28, 0x69, 0x29, - 0x43, 0x28, 0x6A, 0x29, 0x43, 0x28, 0x6B, 0x29, - 0x43, 0x28, 0x6C, 0x29, 0x43, 0x28, 0x6D, 0x29, - 0x43, 0x28, 0x6E, 0x29, 0x43, 0x28, 0x6F, 0x29, - 0x43, 0x28, 0x70, 0x29, 0x43, 0x28, 0x71, 0x29, - 0x43, 0x28, 0x72, 0x29, 0x43, 0x28, 0x73, 0x29, - // Bytes 1b40 - 1b7f - 0x43, 0x28, 0x74, 0x29, 0x43, 0x28, 0x75, 0x29, - 0x43, 0x28, 0x76, 0x29, 0x43, 0x28, 0x77, 0x29, - 0x43, 0x28, 0x78, 0x29, 0x43, 0x28, 0x79, 0x29, - 0x43, 0x28, 0x7A, 0x29, 0x43, 0x2E, 0x2E, 0x2E, - 0x43, 0x31, 0x30, 0x2E, 0x43, 0x31, 0x31, 0x2E, - 0x43, 0x31, 0x32, 0x2E, 0x43, 0x31, 0x33, 0x2E, - 0x43, 0x31, 0x34, 0x2E, 0x43, 0x31, 0x35, 0x2E, - 0x43, 0x31, 0x36, 0x2E, 0x43, 0x31, 0x37, 0x2E, - // Bytes 1b80 - 1bbf - 0x43, 0x31, 0x38, 0x2E, 0x43, 0x31, 0x39, 0x2E, - 0x43, 0x32, 0x30, 0x2E, 0x43, 0x3A, 0x3A, 0x3D, - 0x43, 0x3D, 0x3D, 0x3D, 0x43, 0x43, 0x6F, 0x2E, - 0x43, 0x46, 0x41, 0x58, 0x43, 0x47, 0x48, 0x7A, - 0x43, 0x47, 0x50, 0x61, 0x43, 0x49, 0x49, 0x49, - 0x43, 0x4C, 0x54, 0x44, 0x43, 0x4C, 0xC2, 0xB7, - 0x43, 0x4D, 0x48, 0x7A, 0x43, 0x4D, 0x50, 0x61, - 0x43, 0x4D, 0xCE, 0xA9, 0x43, 0x50, 0x50, 0x4D, - // Bytes 1bc0 - 1bff - 0x43, 0x50, 0x50, 0x56, 0x43, 0x50, 0x54, 0x45, - 0x43, 0x54, 0x45, 0x4C, 0x43, 0x54, 0x48, 0x7A, - 0x43, 0x56, 0x49, 0x49, 0x43, 0x58, 0x49, 0x49, - 0x43, 0x61, 0x2F, 0x63, 0x43, 0x61, 0x2F, 0x73, - 0x43, 0x61, 0xCA, 0xBE, 0x43, 0x62, 0x61, 0x72, - 0x43, 0x63, 0x2F, 0x6F, 0x43, 0x63, 0x2F, 0x75, - 0x43, 0x63, 0x61, 0x6C, 0x43, 0x63, 0x6D, 0x32, - 0x43, 0x63, 0x6D, 0x33, 0x43, 0x64, 0x6D, 0x32, - // Bytes 1c00 - 1c3f - 0x43, 0x64, 0x6D, 0x33, 0x43, 0x65, 0x72, 0x67, - 0x43, 0x66, 0x66, 0x69, 0x43, 0x66, 0x66, 0x6C, - 0x43, 0x67, 0x61, 0x6C, 0x43, 0x68, 0x50, 0x61, - 0x43, 0x69, 0x69, 0x69, 0x43, 0x6B, 0x48, 0x7A, - 0x43, 0x6B, 0x50, 0x61, 0x43, 0x6B, 0x6D, 0x32, - 0x43, 0x6B, 0x6D, 0x33, 0x43, 0x6B, 0xCE, 0xA9, - 0x43, 0x6C, 0x6F, 0x67, 0x43, 0x6C, 0xC2, 0xB7, - 0x43, 0x6D, 0x69, 0x6C, 0x43, 0x6D, 0x6D, 0x32, - // Bytes 1c40 - 1c7f - 0x43, 0x6D, 0x6D, 0x33, 0x43, 0x6D, 0x6F, 0x6C, - 0x43, 0x72, 0x61, 0x64, 0x43, 0x76, 0x69, 0x69, - 0x43, 0x78, 0x69, 0x69, 0x43, 0xC2, 0xB0, 0x43, - 0x43, 0xC2, 0xB0, 0x46, 0x43, 0xCA, 0xBC, 0x6E, - 0x43, 0xCE, 0xBC, 0x41, 0x43, 0xCE, 0xBC, 0x46, - 0x43, 0xCE, 0xBC, 0x56, 0x43, 0xCE, 0xBC, 0x57, - 0x43, 0xCE, 0xBC, 0x67, 0x43, 0xCE, 0xBC, 0x6C, - 0x43, 0xCE, 0xBC, 0x6D, 0x43, 0xCE, 0xBC, 0x73, - // Bytes 1c80 - 1cbf - 0x44, 0x28, 0x31, 0x30, 0x29, 0x44, 0x28, 0x31, - 0x31, 0x29, 0x44, 0x28, 0x31, 0x32, 0x29, 0x44, - 0x28, 0x31, 0x33, 0x29, 0x44, 0x28, 0x31, 0x34, - 0x29, 0x44, 0x28, 0x31, 0x35, 0x29, 0x44, 0x28, - 0x31, 0x36, 0x29, 0x44, 0x28, 0x31, 0x37, 0x29, - 0x44, 0x28, 0x31, 0x38, 0x29, 0x44, 0x28, 0x31, - 0x39, 0x29, 0x44, 0x28, 0x32, 0x30, 0x29, 0x44, - 0x30, 0xE7, 0x82, 0xB9, 0x44, 0x31, 0xE2, 0x81, - // Bytes 1cc0 - 1cff - 0x84, 0x44, 0x31, 0xE6, 0x97, 0xA5, 0x44, 0x31, - 0xE6, 0x9C, 0x88, 0x44, 0x31, 0xE7, 0x82, 0xB9, - 0x44, 0x32, 0xE6, 0x97, 0xA5, 0x44, 0x32, 0xE6, - 0x9C, 0x88, 0x44, 0x32, 0xE7, 0x82, 0xB9, 0x44, - 0x33, 0xE6, 0x97, 0xA5, 0x44, 0x33, 0xE6, 0x9C, - 0x88, 0x44, 0x33, 0xE7, 0x82, 0xB9, 0x44, 0x34, - 0xE6, 0x97, 0xA5, 0x44, 0x34, 0xE6, 0x9C, 0x88, - 0x44, 0x34, 0xE7, 0x82, 0xB9, 0x44, 0x35, 0xE6, - // Bytes 1d00 - 1d3f - 0x97, 0xA5, 0x44, 0x35, 0xE6, 0x9C, 0x88, 0x44, - 0x35, 0xE7, 0x82, 0xB9, 0x44, 0x36, 0xE6, 0x97, - 0xA5, 0x44, 0x36, 0xE6, 0x9C, 0x88, 0x44, 0x36, - 0xE7, 0x82, 0xB9, 0x44, 0x37, 0xE6, 0x97, 0xA5, - 0x44, 0x37, 0xE6, 0x9C, 0x88, 0x44, 0x37, 0xE7, - 0x82, 0xB9, 0x44, 0x38, 0xE6, 0x97, 0xA5, 0x44, - 0x38, 0xE6, 0x9C, 0x88, 0x44, 0x38, 0xE7, 0x82, - 0xB9, 0x44, 0x39, 0xE6, 0x97, 0xA5, 0x44, 0x39, - // Bytes 1d40 - 1d7f - 0xE6, 0x9C, 0x88, 0x44, 0x39, 0xE7, 0x82, 0xB9, - 0x44, 0x56, 0x49, 0x49, 0x49, 0x44, 0x61, 0x2E, - 0x6D, 0x2E, 0x44, 0x6B, 0x63, 0x61, 0x6C, 0x44, - 0x70, 0x2E, 0x6D, 0x2E, 0x44, 0x76, 0x69, 0x69, - 0x69, 0x44, 0xD5, 0xA5, 0xD6, 0x82, 0x44, 0xD5, - 0xB4, 0xD5, 0xA5, 0x44, 0xD5, 0xB4, 0xD5, 0xAB, - 0x44, 0xD5, 0xB4, 0xD5, 0xAD, 0x44, 0xD5, 0xB4, - 0xD5, 0xB6, 0x44, 0xD5, 0xBE, 0xD5, 0xB6, 0x44, - // Bytes 1d80 - 1dbf - 0xD7, 0x90, 0xD7, 0x9C, 0x44, 0xD8, 0xA7, 0xD9, - 0xB4, 0x44, 0xD8, 0xA8, 0xD8, 0xAC, 0x44, 0xD8, - 0xA8, 0xD8, 0xAD, 0x44, 0xD8, 0xA8, 0xD8, 0xAE, - 0x44, 0xD8, 0xA8, 0xD8, 0xB1, 0x44, 0xD8, 0xA8, - 0xD8, 0xB2, 0x44, 0xD8, 0xA8, 0xD9, 0x85, 0x44, - 0xD8, 0xA8, 0xD9, 0x86, 0x44, 0xD8, 0xA8, 0xD9, - 0x87, 0x44, 0xD8, 0xA8, 0xD9, 0x89, 0x44, 0xD8, - 0xA8, 0xD9, 0x8A, 0x44, 0xD8, 0xAA, 0xD8, 0xAC, - // Bytes 1dc0 - 1dff - 0x44, 0xD8, 0xAA, 0xD8, 0xAD, 0x44, 0xD8, 0xAA, - 0xD8, 0xAE, 0x44, 0xD8, 0xAA, 0xD8, 0xB1, 0x44, - 0xD8, 0xAA, 0xD8, 0xB2, 0x44, 0xD8, 0xAA, 0xD9, - 0x85, 0x44, 0xD8, 0xAA, 0xD9, 0x86, 0x44, 0xD8, - 0xAA, 0xD9, 0x87, 0x44, 0xD8, 0xAA, 0xD9, 0x89, - 0x44, 0xD8, 0xAA, 0xD9, 0x8A, 0x44, 0xD8, 0xAB, - 0xD8, 0xAC, 0x44, 0xD8, 0xAB, 0xD8, 0xB1, 0x44, - 0xD8, 0xAB, 0xD8, 0xB2, 0x44, 0xD8, 0xAB, 0xD9, - // Bytes 1e00 - 1e3f - 0x85, 0x44, 0xD8, 0xAB, 0xD9, 0x86, 0x44, 0xD8, - 0xAB, 0xD9, 0x87, 0x44, 0xD8, 0xAB, 0xD9, 0x89, - 0x44, 0xD8, 0xAB, 0xD9, 0x8A, 0x44, 0xD8, 0xAC, - 0xD8, 0xAD, 0x44, 0xD8, 0xAC, 0xD9, 0x85, 0x44, - 0xD8, 0xAC, 0xD9, 0x89, 0x44, 0xD8, 0xAC, 0xD9, - 0x8A, 0x44, 0xD8, 0xAD, 0xD8, 0xAC, 0x44, 0xD8, - 0xAD, 0xD9, 0x85, 0x44, 0xD8, 0xAD, 0xD9, 0x89, - 0x44, 0xD8, 0xAD, 0xD9, 0x8A, 0x44, 0xD8, 0xAE, - // Bytes 1e40 - 1e7f - 0xD8, 0xAC, 0x44, 0xD8, 0xAE, 0xD8, 0xAD, 0x44, - 0xD8, 0xAE, 0xD9, 0x85, 0x44, 0xD8, 0xAE, 0xD9, - 0x89, 0x44, 0xD8, 0xAE, 0xD9, 0x8A, 0x44, 0xD8, - 0xB3, 0xD8, 0xAC, 0x44, 0xD8, 0xB3, 0xD8, 0xAD, - 0x44, 0xD8, 0xB3, 0xD8, 0xAE, 0x44, 0xD8, 0xB3, - 0xD8, 0xB1, 0x44, 0xD8, 0xB3, 0xD9, 0x85, 0x44, - 0xD8, 0xB3, 0xD9, 0x87, 0x44, 0xD8, 0xB3, 0xD9, - 0x89, 0x44, 0xD8, 0xB3, 0xD9, 0x8A, 0x44, 0xD8, - // Bytes 1e80 - 1ebf - 0xB4, 0xD8, 0xAC, 0x44, 0xD8, 0xB4, 0xD8, 0xAD, - 0x44, 0xD8, 0xB4, 0xD8, 0xAE, 0x44, 0xD8, 0xB4, - 0xD8, 0xB1, 0x44, 0xD8, 0xB4, 0xD9, 0x85, 0x44, - 0xD8, 0xB4, 0xD9, 0x87, 0x44, 0xD8, 0xB4, 0xD9, - 0x89, 0x44, 0xD8, 0xB4, 0xD9, 0x8A, 0x44, 0xD8, - 0xB5, 0xD8, 0xAD, 0x44, 0xD8, 0xB5, 0xD8, 0xAE, - 0x44, 0xD8, 0xB5, 0xD8, 0xB1, 0x44, 0xD8, 0xB5, - 0xD9, 0x85, 0x44, 0xD8, 0xB5, 0xD9, 0x89, 0x44, - // Bytes 1ec0 - 1eff - 0xD8, 0xB5, 0xD9, 0x8A, 0x44, 0xD8, 0xB6, 0xD8, - 0xAC, 0x44, 0xD8, 0xB6, 0xD8, 0xAD, 0x44, 0xD8, - 0xB6, 0xD8, 0xAE, 0x44, 0xD8, 0xB6, 0xD8, 0xB1, - 0x44, 0xD8, 0xB6, 0xD9, 0x85, 0x44, 0xD8, 0xB6, - 0xD9, 0x89, 0x44, 0xD8, 0xB6, 0xD9, 0x8A, 0x44, - 0xD8, 0xB7, 0xD8, 0xAD, 0x44, 0xD8, 0xB7, 0xD9, - 0x85, 0x44, 0xD8, 0xB7, 0xD9, 0x89, 0x44, 0xD8, - 0xB7, 0xD9, 0x8A, 0x44, 0xD8, 0xB8, 0xD9, 0x85, - // Bytes 1f00 - 1f3f - 0x44, 0xD8, 0xB9, 0xD8, 0xAC, 0x44, 0xD8, 0xB9, - 0xD9, 0x85, 0x44, 0xD8, 0xB9, 0xD9, 0x89, 0x44, - 0xD8, 0xB9, 0xD9, 0x8A, 0x44, 0xD8, 0xBA, 0xD8, - 0xAC, 0x44, 0xD8, 0xBA, 0xD9, 0x85, 0x44, 0xD8, - 0xBA, 0xD9, 0x89, 0x44, 0xD8, 0xBA, 0xD9, 0x8A, - 0x44, 0xD9, 0x81, 0xD8, 0xAC, 0x44, 0xD9, 0x81, - 0xD8, 0xAD, 0x44, 0xD9, 0x81, 0xD8, 0xAE, 0x44, - 0xD9, 0x81, 0xD9, 0x85, 0x44, 0xD9, 0x81, 0xD9, - // Bytes 1f40 - 1f7f - 0x89, 0x44, 0xD9, 0x81, 0xD9, 0x8A, 0x44, 0xD9, - 0x82, 0xD8, 0xAD, 0x44, 0xD9, 0x82, 0xD9, 0x85, - 0x44, 0xD9, 0x82, 0xD9, 0x89, 0x44, 0xD9, 0x82, - 0xD9, 0x8A, 0x44, 0xD9, 0x83, 0xD8, 0xA7, 0x44, - 0xD9, 0x83, 0xD8, 0xAC, 0x44, 0xD9, 0x83, 0xD8, - 0xAD, 0x44, 0xD9, 0x83, 0xD8, 0xAE, 0x44, 0xD9, - 0x83, 0xD9, 0x84, 0x44, 0xD9, 0x83, 0xD9, 0x85, - 0x44, 0xD9, 0x83, 0xD9, 0x89, 0x44, 0xD9, 0x83, - // Bytes 1f80 - 1fbf - 0xD9, 0x8A, 0x44, 0xD9, 0x84, 0xD8, 0xA7, 0x44, - 0xD9, 0x84, 0xD8, 0xAC, 0x44, 0xD9, 0x84, 0xD8, - 0xAD, 0x44, 0xD9, 0x84, 0xD8, 0xAE, 0x44, 0xD9, - 0x84, 0xD9, 0x85, 0x44, 0xD9, 0x84, 0xD9, 0x87, - 0x44, 0xD9, 0x84, 0xD9, 0x89, 0x44, 0xD9, 0x84, - 0xD9, 0x8A, 0x44, 0xD9, 0x85, 0xD8, 0xA7, 0x44, - 0xD9, 0x85, 0xD8, 0xAC, 0x44, 0xD9, 0x85, 0xD8, - 0xAD, 0x44, 0xD9, 0x85, 0xD8, 0xAE, 0x44, 0xD9, - // Bytes 1fc0 - 1fff - 0x85, 0xD9, 0x85, 0x44, 0xD9, 0x85, 0xD9, 0x89, - 0x44, 0xD9, 0x85, 0xD9, 0x8A, 0x44, 0xD9, 0x86, - 0xD8, 0xAC, 0x44, 0xD9, 0x86, 0xD8, 0xAD, 0x44, - 0xD9, 0x86, 0xD8, 0xAE, 0x44, 0xD9, 0x86, 0xD8, - 0xB1, 0x44, 0xD9, 0x86, 0xD8, 0xB2, 0x44, 0xD9, - 0x86, 0xD9, 0x85, 0x44, 0xD9, 0x86, 0xD9, 0x86, - 0x44, 0xD9, 0x86, 0xD9, 0x87, 0x44, 0xD9, 0x86, - 0xD9, 0x89, 0x44, 0xD9, 0x86, 0xD9, 0x8A, 0x44, - // Bytes 2000 - 203f - 0xD9, 0x87, 0xD8, 0xAC, 0x44, 0xD9, 0x87, 0xD9, - 0x85, 0x44, 0xD9, 0x87, 0xD9, 0x89, 0x44, 0xD9, - 0x87, 0xD9, 0x8A, 0x44, 0xD9, 0x88, 0xD9, 0xB4, - 0x44, 0xD9, 0x8A, 0xD8, 0xAC, 0x44, 0xD9, 0x8A, - 0xD8, 0xAD, 0x44, 0xD9, 0x8A, 0xD8, 0xAE, 0x44, - 0xD9, 0x8A, 0xD8, 0xB1, 0x44, 0xD9, 0x8A, 0xD8, - 0xB2, 0x44, 0xD9, 0x8A, 0xD9, 0x85, 0x44, 0xD9, - 0x8A, 0xD9, 0x86, 0x44, 0xD9, 0x8A, 0xD9, 0x87, - // Bytes 2040 - 207f - 0x44, 0xD9, 0x8A, 0xD9, 0x89, 0x44, 0xD9, 0x8A, - 0xD9, 0x8A, 0x44, 0xD9, 0x8A, 0xD9, 0xB4, 0x44, - 0xDB, 0x87, 0xD9, 0xB4, 0x45, 0x28, 0xE1, 0x84, - 0x80, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x82, 0x29, - 0x45, 0x28, 0xE1, 0x84, 0x83, 0x29, 0x45, 0x28, - 0xE1, 0x84, 0x85, 0x29, 0x45, 0x28, 0xE1, 0x84, - 0x86, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x87, 0x29, - 0x45, 0x28, 0xE1, 0x84, 0x89, 0x29, 0x45, 0x28, - // Bytes 2080 - 20bf - 0xE1, 0x84, 0x8B, 0x29, 0x45, 0x28, 0xE1, 0x84, - 0x8C, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x8E, 0x29, - 0x45, 0x28, 0xE1, 0x84, 0x8F, 0x29, 0x45, 0x28, - 0xE1, 0x84, 0x90, 0x29, 0x45, 0x28, 0xE1, 0x84, - 0x91, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x92, 0x29, - 0x45, 0x28, 0xE4, 0xB8, 0x80, 0x29, 0x45, 0x28, - 0xE4, 0xB8, 0x83, 0x29, 0x45, 0x28, 0xE4, 0xB8, - 0x89, 0x29, 0x45, 0x28, 0xE4, 0xB9, 0x9D, 0x29, - // Bytes 20c0 - 20ff - 0x45, 0x28, 0xE4, 0xBA, 0x8C, 0x29, 0x45, 0x28, - 0xE4, 0xBA, 0x94, 0x29, 0x45, 0x28, 0xE4, 0xBB, - 0xA3, 0x29, 0x45, 0x28, 0xE4, 0xBC, 0x81, 0x29, - 0x45, 0x28, 0xE4, 0xBC, 0x91, 0x29, 0x45, 0x28, - 0xE5, 0x85, 0xAB, 0x29, 0x45, 0x28, 0xE5, 0x85, - 0xAD, 0x29, 0x45, 0x28, 0xE5, 0x8A, 0xB4, 0x29, - 0x45, 0x28, 0xE5, 0x8D, 0x81, 0x29, 0x45, 0x28, - 0xE5, 0x8D, 0x94, 0x29, 0x45, 0x28, 0xE5, 0x90, - // Bytes 2100 - 213f - 0x8D, 0x29, 0x45, 0x28, 0xE5, 0x91, 0xBC, 0x29, - 0x45, 0x28, 0xE5, 0x9B, 0x9B, 0x29, 0x45, 0x28, - 0xE5, 0x9C, 0x9F, 0x29, 0x45, 0x28, 0xE5, 0xAD, - 0xA6, 0x29, 0x45, 0x28, 0xE6, 0x97, 0xA5, 0x29, - 0x45, 0x28, 0xE6, 0x9C, 0x88, 0x29, 0x45, 0x28, - 0xE6, 0x9C, 0x89, 0x29, 0x45, 0x28, 0xE6, 0x9C, - 0xA8, 0x29, 0x45, 0x28, 0xE6, 0xA0, 0xAA, 0x29, - 0x45, 0x28, 0xE6, 0xB0, 0xB4, 0x29, 0x45, 0x28, - // Bytes 2140 - 217f - 0xE7, 0x81, 0xAB, 0x29, 0x45, 0x28, 0xE7, 0x89, - 0xB9, 0x29, 0x45, 0x28, 0xE7, 0x9B, 0xA3, 0x29, - 0x45, 0x28, 0xE7, 0xA4, 0xBE, 0x29, 0x45, 0x28, - 0xE7, 0xA5, 0x9D, 0x29, 0x45, 0x28, 0xE7, 0xA5, - 0xAD, 0x29, 0x45, 0x28, 0xE8, 0x87, 0xAA, 0x29, - 0x45, 0x28, 0xE8, 0x87, 0xB3, 0x29, 0x45, 0x28, - 0xE8, 0xB2, 0xA1, 0x29, 0x45, 0x28, 0xE8, 0xB3, - 0x87, 0x29, 0x45, 0x28, 0xE9, 0x87, 0x91, 0x29, - // Bytes 2180 - 21bf - 0x45, 0x30, 0xE2, 0x81, 0x84, 0x33, 0x45, 0x31, - 0x30, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x30, 0xE6, - 0x9C, 0x88, 0x45, 0x31, 0x30, 0xE7, 0x82, 0xB9, - 0x45, 0x31, 0x31, 0xE6, 0x97, 0xA5, 0x45, 0x31, - 0x31, 0xE6, 0x9C, 0x88, 0x45, 0x31, 0x31, 0xE7, - 0x82, 0xB9, 0x45, 0x31, 0x32, 0xE6, 0x97, 0xA5, - 0x45, 0x31, 0x32, 0xE6, 0x9C, 0x88, 0x45, 0x31, - 0x32, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x33, 0xE6, - // Bytes 21c0 - 21ff - 0x97, 0xA5, 0x45, 0x31, 0x33, 0xE7, 0x82, 0xB9, - 0x45, 0x31, 0x34, 0xE6, 0x97, 0xA5, 0x45, 0x31, - 0x34, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x35, 0xE6, - 0x97, 0xA5, 0x45, 0x31, 0x35, 0xE7, 0x82, 0xB9, - 0x45, 0x31, 0x36, 0xE6, 0x97, 0xA5, 0x45, 0x31, - 0x36, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x37, 0xE6, - 0x97, 0xA5, 0x45, 0x31, 0x37, 0xE7, 0x82, 0xB9, - 0x45, 0x31, 0x38, 0xE6, 0x97, 0xA5, 0x45, 0x31, - // Bytes 2200 - 223f - 0x38, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x39, 0xE6, - 0x97, 0xA5, 0x45, 0x31, 0x39, 0xE7, 0x82, 0xB9, - 0x45, 0x31, 0xE2, 0x81, 0x84, 0x32, 0x45, 0x31, - 0xE2, 0x81, 0x84, 0x33, 0x45, 0x31, 0xE2, 0x81, - 0x84, 0x34, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x35, - 0x45, 0x31, 0xE2, 0x81, 0x84, 0x36, 0x45, 0x31, - 0xE2, 0x81, 0x84, 0x37, 0x45, 0x31, 0xE2, 0x81, - 0x84, 0x38, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x39, - // Bytes 2240 - 227f - 0x45, 0x32, 0x30, 0xE6, 0x97, 0xA5, 0x45, 0x32, - 0x30, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x31, 0xE6, - 0x97, 0xA5, 0x45, 0x32, 0x31, 0xE7, 0x82, 0xB9, - 0x45, 0x32, 0x32, 0xE6, 0x97, 0xA5, 0x45, 0x32, - 0x32, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x33, 0xE6, - 0x97, 0xA5, 0x45, 0x32, 0x33, 0xE7, 0x82, 0xB9, - 0x45, 0x32, 0x34, 0xE6, 0x97, 0xA5, 0x45, 0x32, - 0x34, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x35, 0xE6, - // Bytes 2280 - 22bf - 0x97, 0xA5, 0x45, 0x32, 0x36, 0xE6, 0x97, 0xA5, - 0x45, 0x32, 0x37, 0xE6, 0x97, 0xA5, 0x45, 0x32, - 0x38, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x39, 0xE6, - 0x97, 0xA5, 0x45, 0x32, 0xE2, 0x81, 0x84, 0x33, - 0x45, 0x32, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x33, - 0x30, 0xE6, 0x97, 0xA5, 0x45, 0x33, 0x31, 0xE6, - 0x97, 0xA5, 0x45, 0x33, 0xE2, 0x81, 0x84, 0x34, - 0x45, 0x33, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x33, - // Bytes 22c0 - 22ff - 0xE2, 0x81, 0x84, 0x38, 0x45, 0x34, 0xE2, 0x81, - 0x84, 0x35, 0x45, 0x35, 0xE2, 0x81, 0x84, 0x36, - 0x45, 0x35, 0xE2, 0x81, 0x84, 0x38, 0x45, 0x37, - 0xE2, 0x81, 0x84, 0x38, 0x45, 0x41, 0xE2, 0x88, - 0x95, 0x6D, 0x45, 0x56, 0xE2, 0x88, 0x95, 0x6D, - 0x45, 0x6D, 0xE2, 0x88, 0x95, 0x73, 0x46, 0x31, - 0xE2, 0x81, 0x84, 0x31, 0x30, 0x46, 0x43, 0xE2, - 0x88, 0x95, 0x6B, 0x67, 0x46, 0x6D, 0xE2, 0x88, - // Bytes 2300 - 233f - 0x95, 0x73, 0x32, 0x46, 0xD8, 0xA8, 0xD8, 0xAD, - 0xD9, 0x8A, 0x46, 0xD8, 0xA8, 0xD8, 0xAE, 0xD9, - 0x8A, 0x46, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x85, - 0x46, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x89, 0x46, - 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD8, - 0xAA, 0xD8, 0xAD, 0xD8, 0xAC, 0x46, 0xD8, 0xAA, - 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD8, 0xAA, 0xD8, - 0xAE, 0xD9, 0x85, 0x46, 0xD8, 0xAA, 0xD8, 0xAE, - // Bytes 2340 - 237f - 0xD9, 0x89, 0x46, 0xD8, 0xAA, 0xD8, 0xAE, 0xD9, - 0x8A, 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAC, - 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAD, 0x46, - 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAE, 0x46, 0xD8, - 0xAA, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xAA, - 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xAC, 0xD8, - 0xAD, 0xD9, 0x89, 0x46, 0xD8, 0xAC, 0xD8, 0xAD, - 0xD9, 0x8A, 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD8, - // Bytes 2380 - 23bf - 0xAD, 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD9, 0x89, - 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD9, 0x8A, 0x46, - 0xD8, 0xAD, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD8, - 0xAD, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xAD, - 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xB3, 0xD8, - 0xAC, 0xD8, 0xAD, 0x46, 0xD8, 0xB3, 0xD8, 0xAC, - 0xD9, 0x89, 0x46, 0xD8, 0xB3, 0xD8, 0xAD, 0xD8, - 0xAC, 0x46, 0xD8, 0xB3, 0xD8, 0xAE, 0xD9, 0x89, - // Bytes 23c0 - 23ff - 0x46, 0xD8, 0xB3, 0xD8, 0xAE, 0xD9, 0x8A, 0x46, - 0xD8, 0xB3, 0xD9, 0x85, 0xD8, 0xAC, 0x46, 0xD8, - 0xB3, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD8, 0xB3, - 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB4, 0xD8, - 0xAC, 0xD9, 0x8A, 0x46, 0xD8, 0xB4, 0xD8, 0xAD, - 0xD9, 0x85, 0x46, 0xD8, 0xB4, 0xD8, 0xAD, 0xD9, - 0x8A, 0x46, 0xD8, 0xB4, 0xD9, 0x85, 0xD8, 0xAE, - 0x46, 0xD8, 0xB4, 0xD9, 0x85, 0xD9, 0x85, 0x46, - // Bytes 2400 - 243f - 0xD8, 0xB5, 0xD8, 0xAD, 0xD8, 0xAD, 0x46, 0xD8, - 0xB5, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD8, 0xB5, - 0xD9, 0x84, 0xD9, 0x89, 0x46, 0xD8, 0xB5, 0xD9, - 0x84, 0xDB, 0x92, 0x46, 0xD8, 0xB5, 0xD9, 0x85, - 0xD9, 0x85, 0x46, 0xD8, 0xB6, 0xD8, 0xAD, 0xD9, - 0x89, 0x46, 0xD8, 0xB6, 0xD8, 0xAD, 0xD9, 0x8A, - 0x46, 0xD8, 0xB6, 0xD8, 0xAE, 0xD9, 0x85, 0x46, - 0xD8, 0xB7, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD8, - // Bytes 2440 - 247f - 0xB7, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB7, - 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xB9, 0xD8, - 0xAC, 0xD9, 0x85, 0x46, 0xD8, 0xB9, 0xD9, 0x85, - 0xD9, 0x85, 0x46, 0xD8, 0xB9, 0xD9, 0x85, 0xD9, - 0x89, 0x46, 0xD8, 0xB9, 0xD9, 0x85, 0xD9, 0x8A, - 0x46, 0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x85, 0x46, - 0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, - 0xBA, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x81, - // Bytes 2480 - 24bf - 0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD9, 0x81, 0xD9, - 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x82, 0xD9, 0x84, - 0xDB, 0x92, 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD8, - 0xAD, 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD9, 0x85, - 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD9, 0x8A, 0x46, - 0xD9, 0x83, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9, - 0x83, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x84, - 0xD8, 0xAC, 0xD8, 0xAC, 0x46, 0xD9, 0x84, 0xD8, - // Bytes 24c0 - 24ff - 0xAC, 0xD9, 0x85, 0x46, 0xD9, 0x84, 0xD8, 0xAC, - 0xD9, 0x8A, 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, - 0x85, 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x89, - 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, - 0xD9, 0x84, 0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD9, - 0x84, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD9, 0x84, - 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD8, - 0xAC, 0xD8, 0xAD, 0x46, 0xD9, 0x85, 0xD8, 0xAC, - // Bytes 2500 - 253f - 0xD8, 0xAE, 0x46, 0xD9, 0x85, 0xD8, 0xAC, 0xD9, - 0x85, 0x46, 0xD9, 0x85, 0xD8, 0xAC, 0xD9, 0x8A, - 0x46, 0xD9, 0x85, 0xD8, 0xAD, 0xD8, 0xAC, 0x46, - 0xD9, 0x85, 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD9, - 0x85, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x85, - 0xD8, 0xAE, 0xD8, 0xAC, 0x46, 0xD9, 0x85, 0xD8, - 0xAE, 0xD9, 0x85, 0x46, 0xD9, 0x85, 0xD8, 0xAE, - 0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD9, 0x85, 0xD9, - // Bytes 2540 - 257f - 0x8A, 0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD8, 0xAD, - 0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD9, 0x85, 0x46, - 0xD9, 0x86, 0xD8, 0xAC, 0xD9, 0x89, 0x46, 0xD9, - 0x86, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x86, - 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD9, 0x86, 0xD8, - 0xAD, 0xD9, 0x89, 0x46, 0xD9, 0x86, 0xD8, 0xAD, - 0xD9, 0x8A, 0x46, 0xD9, 0x86, 0xD9, 0x85, 0xD9, - 0x89, 0x46, 0xD9, 0x86, 0xD9, 0x85, 0xD9, 0x8A, - // Bytes 2580 - 25bf - 0x46, 0xD9, 0x87, 0xD9, 0x85, 0xD8, 0xAC, 0x46, - 0xD9, 0x87, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9, - 0x8A, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x8A, - 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x8A, 0xD9, - 0x85, 0xD9, 0x85, 0x46, 0xD9, 0x8A, 0xD9, 0x85, - 0xD9, 0x8A, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, - 0xA7, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAC, - 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAD, 0x46, - // Bytes 25c0 - 25ff - 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAE, 0x46, 0xD9, - 0x8A, 0xD9, 0x94, 0xD8, 0xB1, 0x46, 0xD9, 0x8A, - 0xD9, 0x94, 0xD8, 0xB2, 0x46, 0xD9, 0x8A, 0xD9, - 0x94, 0xD9, 0x85, 0x46, 0xD9, 0x8A, 0xD9, 0x94, - 0xD9, 0x86, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, - 0x87, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x88, - 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x89, 0x46, - 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x8A, 0x46, 0xD9, - // Bytes 2600 - 263f - 0x8A, 0xD9, 0x94, 0xDB, 0x86, 0x46, 0xD9, 0x8A, - 0xD9, 0x94, 0xDB, 0x87, 0x46, 0xD9, 0x8A, 0xD9, - 0x94, 0xDB, 0x88, 0x46, 0xD9, 0x8A, 0xD9, 0x94, - 0xDB, 0x90, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xDB, - 0x95, 0x46, 0xE0, 0xB9, 0x8D, 0xE0, 0xB8, 0xB2, - 0x46, 0xE0, 0xBA, 0xAB, 0xE0, 0xBA, 0x99, 0x46, - 0xE0, 0xBA, 0xAB, 0xE0, 0xBA, 0xA1, 0x46, 0xE0, - 0xBB, 0x8D, 0xE0, 0xBA, 0xB2, 0x46, 0xE0, 0xBD, - // Bytes 2640 - 267f - 0x80, 0xE0, 0xBE, 0xB5, 0x46, 0xE0, 0xBD, 0x82, - 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x8C, 0xE0, - 0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x91, 0xE0, 0xBE, - 0xB7, 0x46, 0xE0, 0xBD, 0x96, 0xE0, 0xBE, 0xB7, - 0x46, 0xE0, 0xBD, 0x9B, 0xE0, 0xBE, 0xB7, 0x46, - 0xE0, 0xBE, 0x90, 0xE0, 0xBE, 0xB5, 0x46, 0xE0, - 0xBE, 0x92, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, - 0x9C, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xA1, - // Bytes 2680 - 26bf - 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xA6, 0xE0, - 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xAB, 0xE0, 0xBE, - 0xB7, 0x46, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, - 0x46, 0xE2, 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0x46, - 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0x46, 0xE2, - 0x88, 0xAE, 0xE2, 0x88, 0xAE, 0x46, 0xE3, 0x81, - 0xBB, 0xE3, 0x81, 0x8B, 0x46, 0xE3, 0x82, 0x88, - 0xE3, 0x82, 0x8A, 0x46, 0xE3, 0x82, 0xAD, 0xE3, - // Bytes 26c0 - 26ff - 0x83, 0xAD, 0x46, 0xE3, 0x82, 0xB3, 0xE3, 0x82, - 0xB3, 0x46, 0xE3, 0x82, 0xB3, 0xE3, 0x83, 0x88, - 0x46, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xB3, 0x46, - 0xE3, 0x83, 0x8A, 0xE3, 0x83, 0x8E, 0x46, 0xE3, - 0x83, 0x9B, 0xE3, 0x83, 0xB3, 0x46, 0xE3, 0x83, - 0x9F, 0xE3, 0x83, 0xAA, 0x46, 0xE3, 0x83, 0xAA, - 0xE3, 0x83, 0xA9, 0x46, 0xE3, 0x83, 0xAC, 0xE3, - 0x83, 0xA0, 0x46, 0xE5, 0xA4, 0xA7, 0xE6, 0xAD, - // Bytes 2700 - 273f - 0xA3, 0x46, 0xE5, 0xB9, 0xB3, 0xE6, 0x88, 0x90, - 0x46, 0xE6, 0x98, 0x8E, 0xE6, 0xB2, 0xBB, 0x46, - 0xE6, 0x98, 0xAD, 0xE5, 0x92, 0x8C, 0x47, 0x72, - 0x61, 0x64, 0xE2, 0x88, 0x95, 0x73, 0x47, 0xE3, - 0x80, 0x94, 0x53, 0xE3, 0x80, 0x95, 0x48, 0x28, - 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xA1, 0x29, 0x48, - 0x28, 0xE1, 0x84, 0x82, 0xE1, 0x85, 0xA1, 0x29, - 0x48, 0x28, 0xE1, 0x84, 0x83, 0xE1, 0x85, 0xA1, - // Bytes 2740 - 277f - 0x29, 0x48, 0x28, 0xE1, 0x84, 0x85, 0xE1, 0x85, - 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x86, 0xE1, - 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x87, - 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, - 0x89, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, - 0x84, 0x8B, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, - 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xA1, 0x29, 0x48, - 0x28, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xAE, 0x29, - // Bytes 2780 - 27bf - 0x48, 0x28, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1, - 0x29, 0x48, 0x28, 0xE1, 0x84, 0x8F, 0xE1, 0x85, - 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x90, 0xE1, - 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x91, - 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, - 0x92, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x72, 0x61, - 0x64, 0xE2, 0x88, 0x95, 0x73, 0x32, 0x48, 0xD8, - 0xA7, 0xD9, 0x83, 0xD8, 0xA8, 0xD8, 0xB1, 0x48, - // Bytes 27c0 - 27ff - 0xD8, 0xA7, 0xD9, 0x84, 0xD9, 0x84, 0xD9, 0x87, - 0x48, 0xD8, 0xB1, 0xD8, 0xB3, 0xD9, 0x88, 0xD9, - 0x84, 0x48, 0xD8, 0xB1, 0xDB, 0x8C, 0xD8, 0xA7, - 0xD9, 0x84, 0x48, 0xD8, 0xB5, 0xD9, 0x84, 0xD8, - 0xB9, 0xD9, 0x85, 0x48, 0xD8, 0xB9, 0xD9, 0x84, - 0xD9, 0x8A, 0xD9, 0x87, 0x48, 0xD9, 0x85, 0xD8, - 0xAD, 0xD9, 0x85, 0xD8, 0xAF, 0x48, 0xD9, 0x88, - 0xD8, 0xB3, 0xD9, 0x84, 0xD9, 0x85, 0x49, 0xE2, - // Bytes 2800 - 283f - 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, - 0x49, 0xE2, 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0xE2, - 0x80, 0xB5, 0x49, 0xE2, 0x88, 0xAB, 0xE2, 0x88, - 0xAB, 0xE2, 0x88, 0xAB, 0x49, 0xE2, 0x88, 0xAE, - 0xE2, 0x88, 0xAE, 0xE2, 0x88, 0xAE, 0x49, 0xE3, - 0x80, 0x94, 0xE4, 0xB8, 0x89, 0xE3, 0x80, 0x95, - 0x49, 0xE3, 0x80, 0x94, 0xE4, 0xBA, 0x8C, 0xE3, - 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE5, 0x8B, - // Bytes 2840 - 287f - 0x9D, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, - 0xE5, 0xAE, 0x89, 0xE3, 0x80, 0x95, 0x49, 0xE3, - 0x80, 0x94, 0xE6, 0x89, 0x93, 0xE3, 0x80, 0x95, - 0x49, 0xE3, 0x80, 0x94, 0xE6, 0x95, 0x97, 0xE3, - 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE6, 0x9C, - 0xAC, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, - 0xE7, 0x82, 0xB9, 0xE3, 0x80, 0x95, 0x49, 0xE3, - 0x80, 0x94, 0xE7, 0x9B, 0x97, 0xE3, 0x80, 0x95, - // Bytes 2880 - 28bf - 0x49, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xBC, 0xE3, - 0x83, 0xAB, 0x49, 0xE3, 0x82, 0xA4, 0xE3, 0x83, - 0xB3, 0xE3, 0x83, 0x81, 0x49, 0xE3, 0x82, 0xA6, - 0xE3, 0x82, 0xA9, 0xE3, 0x83, 0xB3, 0x49, 0xE3, - 0x82, 0xAA, 0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xB9, - 0x49, 0xE3, 0x82, 0xAA, 0xE3, 0x83, 0xBC, 0xE3, - 0x83, 0xA0, 0x49, 0xE3, 0x82, 0xAB, 0xE3, 0x82, - 0xA4, 0xE3, 0x83, 0xAA, 0x49, 0xE3, 0x82, 0xB1, - // Bytes 28c0 - 28ff - 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xB9, 0x49, 0xE3, - 0x82, 0xB3, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x8A, - 0x49, 0xE3, 0x82, 0xBB, 0xE3, 0x83, 0xB3, 0xE3, - 0x83, 0x81, 0x49, 0xE3, 0x82, 0xBB, 0xE3, 0x83, - 0xB3, 0xE3, 0x83, 0x88, 0x49, 0xE3, 0x83, 0x86, - 0xE3, 0x82, 0x99, 0xE3, 0x82, 0xB7, 0x49, 0xE3, - 0x83, 0x88, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, - 0x49, 0xE3, 0x83, 0x8E, 0xE3, 0x83, 0x83, 0xE3, - // Bytes 2900 - 293f - 0x83, 0x88, 0x49, 0xE3, 0x83, 0x8F, 0xE3, 0x82, - 0xA4, 0xE3, 0x83, 0x84, 0x49, 0xE3, 0x83, 0x92, - 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, 0x49, 0xE3, - 0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xB3, - 0x49, 0xE3, 0x83, 0x95, 0xE3, 0x83, 0xA9, 0xE3, - 0x83, 0xB3, 0x49, 0xE3, 0x83, 0x98, 0xE3, 0x82, - 0x9A, 0xE3, 0x82, 0xBD, 0x49, 0xE3, 0x83, 0x98, - 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x84, 0x49, 0xE3, - // Bytes 2940 - 297f - 0x83, 0x9B, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB, - 0x49, 0xE3, 0x83, 0x9B, 0xE3, 0x83, 0xBC, 0xE3, - 0x83, 0xB3, 0x49, 0xE3, 0x83, 0x9E, 0xE3, 0x82, - 0xA4, 0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x83, 0x9E, - 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x8F, 0x49, 0xE3, - 0x83, 0x9E, 0xE3, 0x83, 0xAB, 0xE3, 0x82, 0xAF, - 0x49, 0xE3, 0x83, 0xA4, 0xE3, 0x83, 0xBC, 0xE3, - 0x83, 0xAB, 0x49, 0xE3, 0x83, 0xA6, 0xE3, 0x82, - // Bytes 2980 - 29bf - 0xA2, 0xE3, 0x83, 0xB3, 0x49, 0xE3, 0x83, 0xAF, - 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, 0x4C, 0xE2, - 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, - 0xE2, 0x80, 0xB2, 0x4C, 0xE2, 0x88, 0xAB, 0xE2, - 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, - 0x4C, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xAB, 0xE3, - 0x83, 0x95, 0xE3, 0x82, 0xA1, 0x4C, 0xE3, 0x82, - 0xA8, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xAB, 0xE3, - // Bytes 29c0 - 29ff - 0x83, 0xBC, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x82, - 0x99, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xB3, 0x4C, - 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83, - 0xB3, 0xE3, 0x83, 0x9E, 0x4C, 0xE3, 0x82, 0xAB, - 0xE3, 0x83, 0xA9, 0xE3, 0x83, 0x83, 0xE3, 0x83, - 0x88, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x83, 0xAD, - 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xBC, 0x4C, 0xE3, - 0x82, 0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0x8B, - // Bytes 2a00 - 2a3f - 0xE3, 0x83, 0xBC, 0x4C, 0xE3, 0x82, 0xAD, 0xE3, - 0x83, 0xA5, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xBC, - 0x4C, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, - 0x83, 0xA9, 0xE3, 0x83, 0xA0, 0x4C, 0xE3, 0x82, - 0xAF, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xBC, 0xE3, - 0x83, 0x8D, 0x4C, 0xE3, 0x82, 0xB5, 0xE3, 0x82, - 0xA4, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0x4C, - 0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, 0xE3, 0x83, - // Bytes 2a40 - 2a7f - 0xBC, 0xE3, 0x82, 0xB9, 0x4C, 0xE3, 0x83, 0x8F, - 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, 0x83, - 0x84, 0x4C, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, - 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0x4C, 0xE3, - 0x83, 0x95, 0xE3, 0x82, 0xA3, 0xE3, 0x83, 0xBC, - 0xE3, 0x83, 0x88, 0x4C, 0xE3, 0x83, 0x98, 0xE3, - 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xBF, - 0x4C, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, - // Bytes 2a80 - 2abf - 0x83, 0x8B, 0xE3, 0x83, 0x92, 0x4C, 0xE3, 0x83, - 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xB3, 0xE3, - 0x82, 0xB9, 0x4C, 0xE3, 0x83, 0x9B, 0xE3, 0x82, - 0x99, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x88, 0x4C, - 0xE3, 0x83, 0x9E, 0xE3, 0x82, 0xA4, 0xE3, 0x82, - 0xAF, 0xE3, 0x83, 0xAD, 0x4C, 0xE3, 0x83, 0x9F, - 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAD, 0xE3, 0x83, - 0xB3, 0x4C, 0xE3, 0x83, 0xA1, 0xE3, 0x83, 0xBC, - // Bytes 2ac0 - 2aff - 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x4C, 0xE3, - 0x83, 0xAA, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, - 0xE3, 0x83, 0xAB, 0x4C, 0xE3, 0x83, 0xAB, 0xE3, - 0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, - 0x4C, 0xE6, 0xA0, 0xAA, 0xE5, 0xBC, 0x8F, 0xE4, - 0xBC, 0x9A, 0xE7, 0xA4, 0xBE, 0x4E, 0x28, 0xE1, - 0x84, 0x8B, 0xE1, 0x85, 0xA9, 0xE1, 0x84, 0x92, - 0xE1, 0x85, 0xAE, 0x29, 0x4F, 0xD8, 0xAC, 0xD9, - // Bytes 2b00 - 2b3f - 0x84, 0x20, 0xD8, 0xAC, 0xD9, 0x84, 0xD8, 0xA7, - 0xD9, 0x84, 0xD9, 0x87, 0x4F, 0xE3, 0x82, 0xA2, - 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x9A, 0xE3, 0x83, - 0xBC, 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x82, 0xA2, - 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x98, 0xE3, 0x82, - 0x9A, 0xE3, 0x82, 0xA2, 0x4F, 0xE3, 0x82, 0xAD, - 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xAF, 0xE3, 0x83, - 0x83, 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x82, 0xB5, - // Bytes 2b40 - 2b7f - 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x81, 0xE3, 0x83, - 0xBC, 0xE3, 0x83, 0xA0, 0x4F, 0xE3, 0x83, 0x8F, - 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x83, - 0xAC, 0xE3, 0x83, 0xAB, 0x4F, 0xE3, 0x83, 0x98, - 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0xBF, 0xE3, 0x83, - 0xBC, 0xE3, 0x83, 0xAB, 0x4F, 0xE3, 0x83, 0x9B, - 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xA4, 0xE3, 0x83, - 0xB3, 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x83, 0x9E, - // Bytes 2b80 - 2bbf - 0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xB7, 0xE3, 0x83, - 0xA7, 0xE3, 0x83, 0xB3, 0x4F, 0xE3, 0x83, 0xA1, - 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83, - 0x88, 0xE3, 0x83, 0xB3, 0x4F, 0xE3, 0x83, 0xAB, - 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x95, 0xE3, 0x82, - 0x99, 0xE3, 0x83, 0xAB, 0x51, 0x28, 0xE1, 0x84, - 0x8B, 0xE1, 0x85, 0xA9, 0xE1, 0x84, 0x8C, 0xE1, - 0x85, 0xA5, 0xE1, 0x86, 0xAB, 0x29, 0x52, 0xE3, - // Bytes 2bc0 - 2bff - 0x82, 0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, - 0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, 0xE3, 0x83, - 0xBC, 0x52, 0xE3, 0x82, 0xAD, 0xE3, 0x83, 0xAD, - 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83, - 0xA9, 0xE3, 0x83, 0xA0, 0x52, 0xE3, 0x82, 0xAD, - 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xA1, 0xE3, 0x83, - 0xBC, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x52, - 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83, - // Bytes 2c00 - 2c3f - 0xA9, 0xE3, 0x83, 0xA0, 0xE3, 0x83, 0x88, 0xE3, - 0x83, 0xB3, 0x52, 0xE3, 0x82, 0xAF, 0xE3, 0x83, - 0xAB, 0xE3, 0x82, 0xBB, 0xE3, 0x82, 0x99, 0xE3, - 0x82, 0xA4, 0xE3, 0x83, 0xAD, 0x52, 0xE3, 0x83, - 0x8F, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, - 0x82, 0xBB, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88, - 0x52, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, - 0x82, 0xA2, 0xE3, 0x82, 0xB9, 0xE3, 0x83, 0x88, - // Bytes 2c40 - 2c7f - 0xE3, 0x83, 0xAB, 0x52, 0xE3, 0x83, 0x95, 0xE3, - 0x82, 0x99, 0xE3, 0x83, 0x83, 0xE3, 0x82, 0xB7, - 0xE3, 0x82, 0xA7, 0xE3, 0x83, 0xAB, 0x52, 0xE3, - 0x83, 0x9F, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0x8F, - 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x83, - 0xAB, 0x52, 0xE3, 0x83, 0xAC, 0xE3, 0x83, 0xB3, - 0xE3, 0x83, 0x88, 0xE3, 0x82, 0xB1, 0xE3, 0x82, - 0x99, 0xE3, 0x83, 0xB3, 0x61, 0xD8, 0xB5, 0xD9, - // Bytes 2c80 - 2cbf - 0x84, 0xD9, 0x89, 0x20, 0xD8, 0xA7, 0xD9, 0x84, - 0xD9, 0x84, 0xD9, 0x87, 0x20, 0xD8, 0xB9, 0xD9, - 0x84, 0xD9, 0x8A, 0xD9, 0x87, 0x20, 0xD9, 0x88, - 0xD8, 0xB3, 0xD9, 0x84, 0xD9, 0x85, 0x06, 0xE0, - 0xA7, 0x87, 0xE0, 0xA6, 0xBE, 0x01, 0x06, 0xE0, - 0xA7, 0x87, 0xE0, 0xA7, 0x97, 0x01, 0x06, 0xE0, - 0xAD, 0x87, 0xE0, 0xAC, 0xBE, 0x01, 0x06, 0xE0, - 0xAD, 0x87, 0xE0, 0xAD, 0x96, 0x01, 0x06, 0xE0, - // Bytes 2cc0 - 2cff - 0xAD, 0x87, 0xE0, 0xAD, 0x97, 0x01, 0x06, 0xE0, - 0xAE, 0x92, 0xE0, 0xAF, 0x97, 0x01, 0x06, 0xE0, - 0xAF, 0x86, 0xE0, 0xAE, 0xBE, 0x01, 0x06, 0xE0, - 0xAF, 0x86, 0xE0, 0xAF, 0x97, 0x01, 0x06, 0xE0, - 0xAF, 0x87, 0xE0, 0xAE, 0xBE, 0x01, 0x06, 0xE0, - 0xB2, 0xBF, 0xE0, 0xB3, 0x95, 0x01, 0x06, 0xE0, - 0xB3, 0x86, 0xE0, 0xB3, 0x95, 0x01, 0x06, 0xE0, - 0xB3, 0x86, 0xE0, 0xB3, 0x96, 0x01, 0x06, 0xE0, - // Bytes 2d00 - 2d3f - 0xB5, 0x86, 0xE0, 0xB4, 0xBE, 0x01, 0x06, 0xE0, - 0xB5, 0x86, 0xE0, 0xB5, 0x97, 0x01, 0x06, 0xE0, - 0xB5, 0x87, 0xE0, 0xB4, 0xBE, 0x01, 0x06, 0xE0, - 0xB7, 0x99, 0xE0, 0xB7, 0x9F, 0x01, 0x06, 0xE1, - 0x80, 0xA5, 0xE1, 0x80, 0xAE, 0x01, 0x06, 0xE1, - 0xAC, 0x85, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, - 0xAC, 0x87, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, - 0xAC, 0x89, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, - // Bytes 2d40 - 2d7f - 0xAC, 0x8B, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, - 0xAC, 0x8D, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, - 0xAC, 0x91, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, - 0xAC, 0xBA, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, - 0xAC, 0xBC, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, - 0xAC, 0xBE, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, - 0xAC, 0xBF, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, - 0xAD, 0x82, 0xE1, 0xAC, 0xB5, 0x01, 0x08, 0xF0, - // Bytes 2d80 - 2dbf - 0x91, 0x84, 0xB1, 0xF0, 0x91, 0x84, 0xA7, 0x01, - 0x08, 0xF0, 0x91, 0x84, 0xB2, 0xF0, 0x91, 0x84, - 0xA7, 0x01, 0x08, 0xF0, 0x91, 0x8D, 0x87, 0xF0, - 0x91, 0x8C, 0xBE, 0x01, 0x08, 0xF0, 0x91, 0x8D, - 0x87, 0xF0, 0x91, 0x8D, 0x97, 0x01, 0x08, 0xF0, - 0x91, 0x92, 0xB9, 0xF0, 0x91, 0x92, 0xB0, 0x01, - 0x08, 0xF0, 0x91, 0x92, 0xB9, 0xF0, 0x91, 0x92, - 0xBA, 0x01, 0x08, 0xF0, 0x91, 0x92, 0xB9, 0xF0, - // Bytes 2dc0 - 2dff - 0x91, 0x92, 0xBD, 0x01, 0x08, 0xF0, 0x91, 0x96, - 0xB8, 0xF0, 0x91, 0x96, 0xAF, 0x01, 0x08, 0xF0, - 0x91, 0x96, 0xB9, 0xF0, 0x91, 0x96, 0xAF, 0x01, - 0x09, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x82, 0xE0, - 0xB3, 0x95, 0x02, 0x09, 0xE0, 0xB7, 0x99, 0xE0, - 0xB7, 0x8F, 0xE0, 0xB7, 0x8A, 0x12, 0x44, 0x44, - 0x5A, 0xCC, 0x8C, 0xC9, 0x44, 0x44, 0x7A, 0xCC, - 0x8C, 0xC9, 0x44, 0x64, 0x7A, 0xCC, 0x8C, 0xC9, - // Bytes 2e00 - 2e3f - 0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x93, 0xC9, - 0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x94, 0xC9, - 0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x95, 0xB5, - 0x46, 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xA1, 0x01, - 0x46, 0xE1, 0x84, 0x82, 0xE1, 0x85, 0xA1, 0x01, - 0x46, 0xE1, 0x84, 0x83, 0xE1, 0x85, 0xA1, 0x01, - 0x46, 0xE1, 0x84, 0x85, 0xE1, 0x85, 0xA1, 0x01, - 0x46, 0xE1, 0x84, 0x86, 0xE1, 0x85, 0xA1, 0x01, - // Bytes 2e40 - 2e7f - 0x46, 0xE1, 0x84, 0x87, 0xE1, 0x85, 0xA1, 0x01, - 0x46, 0xE1, 0x84, 0x89, 0xE1, 0x85, 0xA1, 0x01, - 0x46, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xA1, 0x01, - 0x46, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xAE, 0x01, - 0x46, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xA1, 0x01, - 0x46, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1, 0x01, - 0x46, 0xE1, 0x84, 0x8F, 0xE1, 0x85, 0xA1, 0x01, - 0x46, 0xE1, 0x84, 0x90, 0xE1, 0x85, 0xA1, 0x01, - // Bytes 2e80 - 2ebf - 0x46, 0xE1, 0x84, 0x91, 0xE1, 0x85, 0xA1, 0x01, - 0x46, 0xE1, 0x84, 0x92, 0xE1, 0x85, 0xA1, 0x01, - 0x49, 0xE3, 0x83, 0xA1, 0xE3, 0x82, 0xAB, 0xE3, - 0x82, 0x99, 0x0D, 0x4C, 0xE1, 0x84, 0x8C, 0xE1, - 0x85, 0xAE, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xB4, - 0x01, 0x4C, 0xE3, 0x82, 0xAD, 0xE3, 0x82, 0x99, - 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0x0D, 0x4C, - 0xE3, 0x82, 0xB3, 0xE3, 0x83, 0xBC, 0xE3, 0x83, - // Bytes 2ec0 - 2eff - 0x9B, 0xE3, 0x82, 0x9A, 0x0D, 0x4C, 0xE3, 0x83, - 0xA4, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, 0xE3, - 0x82, 0x99, 0x0D, 0x4F, 0xE1, 0x84, 0x8E, 0xE1, - 0x85, 0xA1, 0xE1, 0x86, 0xB7, 0xE1, 0x84, 0x80, - 0xE1, 0x85, 0xA9, 0x01, 0x4F, 0xE3, 0x82, 0xA4, - 0xE3, 0x83, 0x8B, 0xE3, 0x83, 0xB3, 0xE3, 0x82, - 0xAF, 0xE3, 0x82, 0x99, 0x0D, 0x4F, 0xE3, 0x82, - 0xB7, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xB3, 0xE3, - // Bytes 2f00 - 2f3f - 0x82, 0xAF, 0xE3, 0x82, 0x99, 0x0D, 0x4F, 0xE3, - 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, - 0xE3, 0x82, 0xB7, 0xE3, 0x82, 0x99, 0x0D, 0x4F, - 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0xE3, 0x83, - 0xB3, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D, - 0x52, 0xE3, 0x82, 0xA8, 0xE3, 0x82, 0xB9, 0xE3, - 0x82, 0xAF, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, - 0xE3, 0x82, 0x99, 0x0D, 0x52, 0xE3, 0x83, 0x95, - // Bytes 2f40 - 2f7f - 0xE3, 0x82, 0xA1, 0xE3, 0x83, 0xA9, 0xE3, 0x83, - 0x83, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D, - 0x86, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x82, 0x01, - 0x86, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, 0x8F, 0x01, - 0x03, 0x3C, 0xCC, 0xB8, 0x05, 0x03, 0x3D, 0xCC, - 0xB8, 0x05, 0x03, 0x3E, 0xCC, 0xB8, 0x05, 0x03, - 0x41, 0xCC, 0x80, 0xC9, 0x03, 0x41, 0xCC, 0x81, - 0xC9, 0x03, 0x41, 0xCC, 0x83, 0xC9, 0x03, 0x41, - // Bytes 2f80 - 2fbf - 0xCC, 0x84, 0xC9, 0x03, 0x41, 0xCC, 0x89, 0xC9, - 0x03, 0x41, 0xCC, 0x8C, 0xC9, 0x03, 0x41, 0xCC, - 0x8F, 0xC9, 0x03, 0x41, 0xCC, 0x91, 0xC9, 0x03, - 0x41, 0xCC, 0xA5, 0xB5, 0x03, 0x41, 0xCC, 0xA8, - 0xA5, 0x03, 0x42, 0xCC, 0x87, 0xC9, 0x03, 0x42, - 0xCC, 0xA3, 0xB5, 0x03, 0x42, 0xCC, 0xB1, 0xB5, - 0x03, 0x43, 0xCC, 0x81, 0xC9, 0x03, 0x43, 0xCC, - 0x82, 0xC9, 0x03, 0x43, 0xCC, 0x87, 0xC9, 0x03, - // Bytes 2fc0 - 2fff - 0x43, 0xCC, 0x8C, 0xC9, 0x03, 0x44, 0xCC, 0x87, - 0xC9, 0x03, 0x44, 0xCC, 0x8C, 0xC9, 0x03, 0x44, - 0xCC, 0xA3, 0xB5, 0x03, 0x44, 0xCC, 0xA7, 0xA5, - 0x03, 0x44, 0xCC, 0xAD, 0xB5, 0x03, 0x44, 0xCC, - 0xB1, 0xB5, 0x03, 0x45, 0xCC, 0x80, 0xC9, 0x03, - 0x45, 0xCC, 0x81, 0xC9, 0x03, 0x45, 0xCC, 0x83, - 0xC9, 0x03, 0x45, 0xCC, 0x86, 0xC9, 0x03, 0x45, - 0xCC, 0x87, 0xC9, 0x03, 0x45, 0xCC, 0x88, 0xC9, - // Bytes 3000 - 303f - 0x03, 0x45, 0xCC, 0x89, 0xC9, 0x03, 0x45, 0xCC, - 0x8C, 0xC9, 0x03, 0x45, 0xCC, 0x8F, 0xC9, 0x03, - 0x45, 0xCC, 0x91, 0xC9, 0x03, 0x45, 0xCC, 0xA8, - 0xA5, 0x03, 0x45, 0xCC, 0xAD, 0xB5, 0x03, 0x45, - 0xCC, 0xB0, 0xB5, 0x03, 0x46, 0xCC, 0x87, 0xC9, - 0x03, 0x47, 0xCC, 0x81, 0xC9, 0x03, 0x47, 0xCC, - 0x82, 0xC9, 0x03, 0x47, 0xCC, 0x84, 0xC9, 0x03, - 0x47, 0xCC, 0x86, 0xC9, 0x03, 0x47, 0xCC, 0x87, - // Bytes 3040 - 307f - 0xC9, 0x03, 0x47, 0xCC, 0x8C, 0xC9, 0x03, 0x47, - 0xCC, 0xA7, 0xA5, 0x03, 0x48, 0xCC, 0x82, 0xC9, - 0x03, 0x48, 0xCC, 0x87, 0xC9, 0x03, 0x48, 0xCC, - 0x88, 0xC9, 0x03, 0x48, 0xCC, 0x8C, 0xC9, 0x03, - 0x48, 0xCC, 0xA3, 0xB5, 0x03, 0x48, 0xCC, 0xA7, - 0xA5, 0x03, 0x48, 0xCC, 0xAE, 0xB5, 0x03, 0x49, - 0xCC, 0x80, 0xC9, 0x03, 0x49, 0xCC, 0x81, 0xC9, - 0x03, 0x49, 0xCC, 0x82, 0xC9, 0x03, 0x49, 0xCC, - // Bytes 3080 - 30bf - 0x83, 0xC9, 0x03, 0x49, 0xCC, 0x84, 0xC9, 0x03, - 0x49, 0xCC, 0x86, 0xC9, 0x03, 0x49, 0xCC, 0x87, - 0xC9, 0x03, 0x49, 0xCC, 0x89, 0xC9, 0x03, 0x49, - 0xCC, 0x8C, 0xC9, 0x03, 0x49, 0xCC, 0x8F, 0xC9, - 0x03, 0x49, 0xCC, 0x91, 0xC9, 0x03, 0x49, 0xCC, - 0xA3, 0xB5, 0x03, 0x49, 0xCC, 0xA8, 0xA5, 0x03, - 0x49, 0xCC, 0xB0, 0xB5, 0x03, 0x4A, 0xCC, 0x82, - 0xC9, 0x03, 0x4B, 0xCC, 0x81, 0xC9, 0x03, 0x4B, - // Bytes 30c0 - 30ff - 0xCC, 0x8C, 0xC9, 0x03, 0x4B, 0xCC, 0xA3, 0xB5, - 0x03, 0x4B, 0xCC, 0xA7, 0xA5, 0x03, 0x4B, 0xCC, - 0xB1, 0xB5, 0x03, 0x4C, 0xCC, 0x81, 0xC9, 0x03, - 0x4C, 0xCC, 0x8C, 0xC9, 0x03, 0x4C, 0xCC, 0xA7, - 0xA5, 0x03, 0x4C, 0xCC, 0xAD, 0xB5, 0x03, 0x4C, - 0xCC, 0xB1, 0xB5, 0x03, 0x4D, 0xCC, 0x81, 0xC9, - 0x03, 0x4D, 0xCC, 0x87, 0xC9, 0x03, 0x4D, 0xCC, - 0xA3, 0xB5, 0x03, 0x4E, 0xCC, 0x80, 0xC9, 0x03, - // Bytes 3100 - 313f - 0x4E, 0xCC, 0x81, 0xC9, 0x03, 0x4E, 0xCC, 0x83, - 0xC9, 0x03, 0x4E, 0xCC, 0x87, 0xC9, 0x03, 0x4E, - 0xCC, 0x8C, 0xC9, 0x03, 0x4E, 0xCC, 0xA3, 0xB5, - 0x03, 0x4E, 0xCC, 0xA7, 0xA5, 0x03, 0x4E, 0xCC, - 0xAD, 0xB5, 0x03, 0x4E, 0xCC, 0xB1, 0xB5, 0x03, - 0x4F, 0xCC, 0x80, 0xC9, 0x03, 0x4F, 0xCC, 0x81, - 0xC9, 0x03, 0x4F, 0xCC, 0x86, 0xC9, 0x03, 0x4F, - 0xCC, 0x89, 0xC9, 0x03, 0x4F, 0xCC, 0x8B, 0xC9, - // Bytes 3140 - 317f - 0x03, 0x4F, 0xCC, 0x8C, 0xC9, 0x03, 0x4F, 0xCC, - 0x8F, 0xC9, 0x03, 0x4F, 0xCC, 0x91, 0xC9, 0x03, - 0x50, 0xCC, 0x81, 0xC9, 0x03, 0x50, 0xCC, 0x87, - 0xC9, 0x03, 0x52, 0xCC, 0x81, 0xC9, 0x03, 0x52, - 0xCC, 0x87, 0xC9, 0x03, 0x52, 0xCC, 0x8C, 0xC9, - 0x03, 0x52, 0xCC, 0x8F, 0xC9, 0x03, 0x52, 0xCC, - 0x91, 0xC9, 0x03, 0x52, 0xCC, 0xA7, 0xA5, 0x03, - 0x52, 0xCC, 0xB1, 0xB5, 0x03, 0x53, 0xCC, 0x82, - // Bytes 3180 - 31bf - 0xC9, 0x03, 0x53, 0xCC, 0x87, 0xC9, 0x03, 0x53, - 0xCC, 0xA6, 0xB5, 0x03, 0x53, 0xCC, 0xA7, 0xA5, - 0x03, 0x54, 0xCC, 0x87, 0xC9, 0x03, 0x54, 0xCC, - 0x8C, 0xC9, 0x03, 0x54, 0xCC, 0xA3, 0xB5, 0x03, - 0x54, 0xCC, 0xA6, 0xB5, 0x03, 0x54, 0xCC, 0xA7, - 0xA5, 0x03, 0x54, 0xCC, 0xAD, 0xB5, 0x03, 0x54, - 0xCC, 0xB1, 0xB5, 0x03, 0x55, 0xCC, 0x80, 0xC9, - 0x03, 0x55, 0xCC, 0x81, 0xC9, 0x03, 0x55, 0xCC, - // Bytes 31c0 - 31ff - 0x82, 0xC9, 0x03, 0x55, 0xCC, 0x86, 0xC9, 0x03, - 0x55, 0xCC, 0x89, 0xC9, 0x03, 0x55, 0xCC, 0x8A, - 0xC9, 0x03, 0x55, 0xCC, 0x8B, 0xC9, 0x03, 0x55, - 0xCC, 0x8C, 0xC9, 0x03, 0x55, 0xCC, 0x8F, 0xC9, - 0x03, 0x55, 0xCC, 0x91, 0xC9, 0x03, 0x55, 0xCC, - 0xA3, 0xB5, 0x03, 0x55, 0xCC, 0xA4, 0xB5, 0x03, - 0x55, 0xCC, 0xA8, 0xA5, 0x03, 0x55, 0xCC, 0xAD, - 0xB5, 0x03, 0x55, 0xCC, 0xB0, 0xB5, 0x03, 0x56, - // Bytes 3200 - 323f - 0xCC, 0x83, 0xC9, 0x03, 0x56, 0xCC, 0xA3, 0xB5, - 0x03, 0x57, 0xCC, 0x80, 0xC9, 0x03, 0x57, 0xCC, - 0x81, 0xC9, 0x03, 0x57, 0xCC, 0x82, 0xC9, 0x03, - 0x57, 0xCC, 0x87, 0xC9, 0x03, 0x57, 0xCC, 0x88, - 0xC9, 0x03, 0x57, 0xCC, 0xA3, 0xB5, 0x03, 0x58, - 0xCC, 0x87, 0xC9, 0x03, 0x58, 0xCC, 0x88, 0xC9, - 0x03, 0x59, 0xCC, 0x80, 0xC9, 0x03, 0x59, 0xCC, - 0x81, 0xC9, 0x03, 0x59, 0xCC, 0x82, 0xC9, 0x03, - // Bytes 3240 - 327f - 0x59, 0xCC, 0x83, 0xC9, 0x03, 0x59, 0xCC, 0x84, - 0xC9, 0x03, 0x59, 0xCC, 0x87, 0xC9, 0x03, 0x59, - 0xCC, 0x88, 0xC9, 0x03, 0x59, 0xCC, 0x89, 0xC9, - 0x03, 0x59, 0xCC, 0xA3, 0xB5, 0x03, 0x5A, 0xCC, - 0x81, 0xC9, 0x03, 0x5A, 0xCC, 0x82, 0xC9, 0x03, - 0x5A, 0xCC, 0x87, 0xC9, 0x03, 0x5A, 0xCC, 0x8C, - 0xC9, 0x03, 0x5A, 0xCC, 0xA3, 0xB5, 0x03, 0x5A, - 0xCC, 0xB1, 0xB5, 0x03, 0x61, 0xCC, 0x80, 0xC9, - // Bytes 3280 - 32bf - 0x03, 0x61, 0xCC, 0x81, 0xC9, 0x03, 0x61, 0xCC, - 0x83, 0xC9, 0x03, 0x61, 0xCC, 0x84, 0xC9, 0x03, - 0x61, 0xCC, 0x89, 0xC9, 0x03, 0x61, 0xCC, 0x8C, - 0xC9, 0x03, 0x61, 0xCC, 0x8F, 0xC9, 0x03, 0x61, - 0xCC, 0x91, 0xC9, 0x03, 0x61, 0xCC, 0xA5, 0xB5, - 0x03, 0x61, 0xCC, 0xA8, 0xA5, 0x03, 0x62, 0xCC, - 0x87, 0xC9, 0x03, 0x62, 0xCC, 0xA3, 0xB5, 0x03, - 0x62, 0xCC, 0xB1, 0xB5, 0x03, 0x63, 0xCC, 0x81, - // Bytes 32c0 - 32ff - 0xC9, 0x03, 0x63, 0xCC, 0x82, 0xC9, 0x03, 0x63, - 0xCC, 0x87, 0xC9, 0x03, 0x63, 0xCC, 0x8C, 0xC9, - 0x03, 0x64, 0xCC, 0x87, 0xC9, 0x03, 0x64, 0xCC, - 0x8C, 0xC9, 0x03, 0x64, 0xCC, 0xA3, 0xB5, 0x03, - 0x64, 0xCC, 0xA7, 0xA5, 0x03, 0x64, 0xCC, 0xAD, - 0xB5, 0x03, 0x64, 0xCC, 0xB1, 0xB5, 0x03, 0x65, - 0xCC, 0x80, 0xC9, 0x03, 0x65, 0xCC, 0x81, 0xC9, - 0x03, 0x65, 0xCC, 0x83, 0xC9, 0x03, 0x65, 0xCC, - // Bytes 3300 - 333f - 0x86, 0xC9, 0x03, 0x65, 0xCC, 0x87, 0xC9, 0x03, - 0x65, 0xCC, 0x88, 0xC9, 0x03, 0x65, 0xCC, 0x89, - 0xC9, 0x03, 0x65, 0xCC, 0x8C, 0xC9, 0x03, 0x65, - 0xCC, 0x8F, 0xC9, 0x03, 0x65, 0xCC, 0x91, 0xC9, - 0x03, 0x65, 0xCC, 0xA8, 0xA5, 0x03, 0x65, 0xCC, - 0xAD, 0xB5, 0x03, 0x65, 0xCC, 0xB0, 0xB5, 0x03, - 0x66, 0xCC, 0x87, 0xC9, 0x03, 0x67, 0xCC, 0x81, - 0xC9, 0x03, 0x67, 0xCC, 0x82, 0xC9, 0x03, 0x67, - // Bytes 3340 - 337f - 0xCC, 0x84, 0xC9, 0x03, 0x67, 0xCC, 0x86, 0xC9, - 0x03, 0x67, 0xCC, 0x87, 0xC9, 0x03, 0x67, 0xCC, - 0x8C, 0xC9, 0x03, 0x67, 0xCC, 0xA7, 0xA5, 0x03, - 0x68, 0xCC, 0x82, 0xC9, 0x03, 0x68, 0xCC, 0x87, - 0xC9, 0x03, 0x68, 0xCC, 0x88, 0xC9, 0x03, 0x68, - 0xCC, 0x8C, 0xC9, 0x03, 0x68, 0xCC, 0xA3, 0xB5, - 0x03, 0x68, 0xCC, 0xA7, 0xA5, 0x03, 0x68, 0xCC, - 0xAE, 0xB5, 0x03, 0x68, 0xCC, 0xB1, 0xB5, 0x03, - // Bytes 3380 - 33bf - 0x69, 0xCC, 0x80, 0xC9, 0x03, 0x69, 0xCC, 0x81, - 0xC9, 0x03, 0x69, 0xCC, 0x82, 0xC9, 0x03, 0x69, - 0xCC, 0x83, 0xC9, 0x03, 0x69, 0xCC, 0x84, 0xC9, - 0x03, 0x69, 0xCC, 0x86, 0xC9, 0x03, 0x69, 0xCC, - 0x89, 0xC9, 0x03, 0x69, 0xCC, 0x8C, 0xC9, 0x03, - 0x69, 0xCC, 0x8F, 0xC9, 0x03, 0x69, 0xCC, 0x91, - 0xC9, 0x03, 0x69, 0xCC, 0xA3, 0xB5, 0x03, 0x69, - 0xCC, 0xA8, 0xA5, 0x03, 0x69, 0xCC, 0xB0, 0xB5, - // Bytes 33c0 - 33ff - 0x03, 0x6A, 0xCC, 0x82, 0xC9, 0x03, 0x6A, 0xCC, - 0x8C, 0xC9, 0x03, 0x6B, 0xCC, 0x81, 0xC9, 0x03, - 0x6B, 0xCC, 0x8C, 0xC9, 0x03, 0x6B, 0xCC, 0xA3, - 0xB5, 0x03, 0x6B, 0xCC, 0xA7, 0xA5, 0x03, 0x6B, - 0xCC, 0xB1, 0xB5, 0x03, 0x6C, 0xCC, 0x81, 0xC9, - 0x03, 0x6C, 0xCC, 0x8C, 0xC9, 0x03, 0x6C, 0xCC, - 0xA7, 0xA5, 0x03, 0x6C, 0xCC, 0xAD, 0xB5, 0x03, - 0x6C, 0xCC, 0xB1, 0xB5, 0x03, 0x6D, 0xCC, 0x81, - // Bytes 3400 - 343f - 0xC9, 0x03, 0x6D, 0xCC, 0x87, 0xC9, 0x03, 0x6D, - 0xCC, 0xA3, 0xB5, 0x03, 0x6E, 0xCC, 0x80, 0xC9, - 0x03, 0x6E, 0xCC, 0x81, 0xC9, 0x03, 0x6E, 0xCC, - 0x83, 0xC9, 0x03, 0x6E, 0xCC, 0x87, 0xC9, 0x03, - 0x6E, 0xCC, 0x8C, 0xC9, 0x03, 0x6E, 0xCC, 0xA3, - 0xB5, 0x03, 0x6E, 0xCC, 0xA7, 0xA5, 0x03, 0x6E, - 0xCC, 0xAD, 0xB5, 0x03, 0x6E, 0xCC, 0xB1, 0xB5, - 0x03, 0x6F, 0xCC, 0x80, 0xC9, 0x03, 0x6F, 0xCC, - // Bytes 3440 - 347f - 0x81, 0xC9, 0x03, 0x6F, 0xCC, 0x86, 0xC9, 0x03, - 0x6F, 0xCC, 0x89, 0xC9, 0x03, 0x6F, 0xCC, 0x8B, - 0xC9, 0x03, 0x6F, 0xCC, 0x8C, 0xC9, 0x03, 0x6F, - 0xCC, 0x8F, 0xC9, 0x03, 0x6F, 0xCC, 0x91, 0xC9, - 0x03, 0x70, 0xCC, 0x81, 0xC9, 0x03, 0x70, 0xCC, - 0x87, 0xC9, 0x03, 0x72, 0xCC, 0x81, 0xC9, 0x03, - 0x72, 0xCC, 0x87, 0xC9, 0x03, 0x72, 0xCC, 0x8C, - 0xC9, 0x03, 0x72, 0xCC, 0x8F, 0xC9, 0x03, 0x72, - // Bytes 3480 - 34bf - 0xCC, 0x91, 0xC9, 0x03, 0x72, 0xCC, 0xA7, 0xA5, - 0x03, 0x72, 0xCC, 0xB1, 0xB5, 0x03, 0x73, 0xCC, - 0x82, 0xC9, 0x03, 0x73, 0xCC, 0x87, 0xC9, 0x03, - 0x73, 0xCC, 0xA6, 0xB5, 0x03, 0x73, 0xCC, 0xA7, - 0xA5, 0x03, 0x74, 0xCC, 0x87, 0xC9, 0x03, 0x74, - 0xCC, 0x88, 0xC9, 0x03, 0x74, 0xCC, 0x8C, 0xC9, - 0x03, 0x74, 0xCC, 0xA3, 0xB5, 0x03, 0x74, 0xCC, - 0xA6, 0xB5, 0x03, 0x74, 0xCC, 0xA7, 0xA5, 0x03, - // Bytes 34c0 - 34ff - 0x74, 0xCC, 0xAD, 0xB5, 0x03, 0x74, 0xCC, 0xB1, - 0xB5, 0x03, 0x75, 0xCC, 0x80, 0xC9, 0x03, 0x75, - 0xCC, 0x81, 0xC9, 0x03, 0x75, 0xCC, 0x82, 0xC9, - 0x03, 0x75, 0xCC, 0x86, 0xC9, 0x03, 0x75, 0xCC, - 0x89, 0xC9, 0x03, 0x75, 0xCC, 0x8A, 0xC9, 0x03, - 0x75, 0xCC, 0x8B, 0xC9, 0x03, 0x75, 0xCC, 0x8C, - 0xC9, 0x03, 0x75, 0xCC, 0x8F, 0xC9, 0x03, 0x75, - 0xCC, 0x91, 0xC9, 0x03, 0x75, 0xCC, 0xA3, 0xB5, - // Bytes 3500 - 353f - 0x03, 0x75, 0xCC, 0xA4, 0xB5, 0x03, 0x75, 0xCC, - 0xA8, 0xA5, 0x03, 0x75, 0xCC, 0xAD, 0xB5, 0x03, - 0x75, 0xCC, 0xB0, 0xB5, 0x03, 0x76, 0xCC, 0x83, - 0xC9, 0x03, 0x76, 0xCC, 0xA3, 0xB5, 0x03, 0x77, - 0xCC, 0x80, 0xC9, 0x03, 0x77, 0xCC, 0x81, 0xC9, - 0x03, 0x77, 0xCC, 0x82, 0xC9, 0x03, 0x77, 0xCC, - 0x87, 0xC9, 0x03, 0x77, 0xCC, 0x88, 0xC9, 0x03, - 0x77, 0xCC, 0x8A, 0xC9, 0x03, 0x77, 0xCC, 0xA3, - // Bytes 3540 - 357f - 0xB5, 0x03, 0x78, 0xCC, 0x87, 0xC9, 0x03, 0x78, - 0xCC, 0x88, 0xC9, 0x03, 0x79, 0xCC, 0x80, 0xC9, - 0x03, 0x79, 0xCC, 0x81, 0xC9, 0x03, 0x79, 0xCC, - 0x82, 0xC9, 0x03, 0x79, 0xCC, 0x83, 0xC9, 0x03, - 0x79, 0xCC, 0x84, 0xC9, 0x03, 0x79, 0xCC, 0x87, - 0xC9, 0x03, 0x79, 0xCC, 0x88, 0xC9, 0x03, 0x79, - 0xCC, 0x89, 0xC9, 0x03, 0x79, 0xCC, 0x8A, 0xC9, - 0x03, 0x79, 0xCC, 0xA3, 0xB5, 0x03, 0x7A, 0xCC, - // Bytes 3580 - 35bf - 0x81, 0xC9, 0x03, 0x7A, 0xCC, 0x82, 0xC9, 0x03, - 0x7A, 0xCC, 0x87, 0xC9, 0x03, 0x7A, 0xCC, 0x8C, - 0xC9, 0x03, 0x7A, 0xCC, 0xA3, 0xB5, 0x03, 0x7A, - 0xCC, 0xB1, 0xB5, 0x04, 0xC2, 0xA8, 0xCC, 0x80, - 0xCA, 0x04, 0xC2, 0xA8, 0xCC, 0x81, 0xCA, 0x04, - 0xC2, 0xA8, 0xCD, 0x82, 0xCA, 0x04, 0xC3, 0x86, - 0xCC, 0x81, 0xC9, 0x04, 0xC3, 0x86, 0xCC, 0x84, - 0xC9, 0x04, 0xC3, 0x98, 0xCC, 0x81, 0xC9, 0x04, - // Bytes 35c0 - 35ff - 0xC3, 0xA6, 0xCC, 0x81, 0xC9, 0x04, 0xC3, 0xA6, - 0xCC, 0x84, 0xC9, 0x04, 0xC3, 0xB8, 0xCC, 0x81, - 0xC9, 0x04, 0xC5, 0xBF, 0xCC, 0x87, 0xC9, 0x04, - 0xC6, 0xB7, 0xCC, 0x8C, 0xC9, 0x04, 0xCA, 0x92, - 0xCC, 0x8C, 0xC9, 0x04, 0xCE, 0x91, 0xCC, 0x80, - 0xC9, 0x04, 0xCE, 0x91, 0xCC, 0x81, 0xC9, 0x04, - 0xCE, 0x91, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0x91, - 0xCC, 0x86, 0xC9, 0x04, 0xCE, 0x91, 0xCD, 0x85, - // Bytes 3600 - 363f - 0xD9, 0x04, 0xCE, 0x95, 0xCC, 0x80, 0xC9, 0x04, - 0xCE, 0x95, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0x97, - 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x97, 0xCC, 0x81, - 0xC9, 0x04, 0xCE, 0x97, 0xCD, 0x85, 0xD9, 0x04, - 0xCE, 0x99, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x99, - 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0x99, 0xCC, 0x84, - 0xC9, 0x04, 0xCE, 0x99, 0xCC, 0x86, 0xC9, 0x04, - 0xCE, 0x99, 0xCC, 0x88, 0xC9, 0x04, 0xCE, 0x9F, - // Bytes 3640 - 367f - 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x9F, 0xCC, 0x81, - 0xC9, 0x04, 0xCE, 0xA1, 0xCC, 0x94, 0xC9, 0x04, - 0xCE, 0xA5, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0xA5, - 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0xA5, 0xCC, 0x84, - 0xC9, 0x04, 0xCE, 0xA5, 0xCC, 0x86, 0xC9, 0x04, - 0xCE, 0xA5, 0xCC, 0x88, 0xC9, 0x04, 0xCE, 0xA9, - 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0xA9, 0xCC, 0x81, - 0xC9, 0x04, 0xCE, 0xA9, 0xCD, 0x85, 0xD9, 0x04, - // Bytes 3680 - 36bf - 0xCE, 0xB1, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0xB1, - 0xCC, 0x86, 0xC9, 0x04, 0xCE, 0xB1, 0xCD, 0x85, - 0xD9, 0x04, 0xCE, 0xB5, 0xCC, 0x80, 0xC9, 0x04, - 0xCE, 0xB5, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0xB7, - 0xCD, 0x85, 0xD9, 0x04, 0xCE, 0xB9, 0xCC, 0x80, - 0xC9, 0x04, 0xCE, 0xB9, 0xCC, 0x81, 0xC9, 0x04, - 0xCE, 0xB9, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0xB9, - 0xCC, 0x86, 0xC9, 0x04, 0xCE, 0xB9, 0xCD, 0x82, - // Bytes 36c0 - 36ff - 0xC9, 0x04, 0xCE, 0xBF, 0xCC, 0x80, 0xC9, 0x04, - 0xCE, 0xBF, 0xCC, 0x81, 0xC9, 0x04, 0xCF, 0x81, - 0xCC, 0x93, 0xC9, 0x04, 0xCF, 0x81, 0xCC, 0x94, - 0xC9, 0x04, 0xCF, 0x85, 0xCC, 0x80, 0xC9, 0x04, - 0xCF, 0x85, 0xCC, 0x81, 0xC9, 0x04, 0xCF, 0x85, - 0xCC, 0x84, 0xC9, 0x04, 0xCF, 0x85, 0xCC, 0x86, - 0xC9, 0x04, 0xCF, 0x85, 0xCD, 0x82, 0xC9, 0x04, - 0xCF, 0x89, 0xCD, 0x85, 0xD9, 0x04, 0xCF, 0x92, - // Bytes 3700 - 373f - 0xCC, 0x81, 0xC9, 0x04, 0xCF, 0x92, 0xCC, 0x88, - 0xC9, 0x04, 0xD0, 0x86, 0xCC, 0x88, 0xC9, 0x04, - 0xD0, 0x90, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0x90, - 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x93, 0xCC, 0x81, - 0xC9, 0x04, 0xD0, 0x95, 0xCC, 0x80, 0xC9, 0x04, - 0xD0, 0x95, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0x95, - 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x96, 0xCC, 0x86, - 0xC9, 0x04, 0xD0, 0x96, 0xCC, 0x88, 0xC9, 0x04, - // Bytes 3740 - 377f - 0xD0, 0x97, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x98, - 0xCC, 0x80, 0xC9, 0x04, 0xD0, 0x98, 0xCC, 0x84, - 0xC9, 0x04, 0xD0, 0x98, 0xCC, 0x86, 0xC9, 0x04, - 0xD0, 0x98, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x9A, - 0xCC, 0x81, 0xC9, 0x04, 0xD0, 0x9E, 0xCC, 0x88, - 0xC9, 0x04, 0xD0, 0xA3, 0xCC, 0x84, 0xC9, 0x04, - 0xD0, 0xA3, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xA3, - 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xA3, 0xCC, 0x8B, - // Bytes 3780 - 37bf - 0xC9, 0x04, 0xD0, 0xA7, 0xCC, 0x88, 0xC9, 0x04, - 0xD0, 0xAB, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xAD, - 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xB0, 0xCC, 0x86, - 0xC9, 0x04, 0xD0, 0xB0, 0xCC, 0x88, 0xC9, 0x04, - 0xD0, 0xB3, 0xCC, 0x81, 0xC9, 0x04, 0xD0, 0xB5, - 0xCC, 0x80, 0xC9, 0x04, 0xD0, 0xB5, 0xCC, 0x86, - 0xC9, 0x04, 0xD0, 0xB5, 0xCC, 0x88, 0xC9, 0x04, - 0xD0, 0xB6, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xB6, - // Bytes 37c0 - 37ff - 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xB7, 0xCC, 0x88, - 0xC9, 0x04, 0xD0, 0xB8, 0xCC, 0x80, 0xC9, 0x04, - 0xD0, 0xB8, 0xCC, 0x84, 0xC9, 0x04, 0xD0, 0xB8, - 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xB8, 0xCC, 0x88, - 0xC9, 0x04, 0xD0, 0xBA, 0xCC, 0x81, 0xC9, 0x04, - 0xD0, 0xBE, 0xCC, 0x88, 0xC9, 0x04, 0xD1, 0x83, - 0xCC, 0x84, 0xC9, 0x04, 0xD1, 0x83, 0xCC, 0x86, - 0xC9, 0x04, 0xD1, 0x83, 0xCC, 0x88, 0xC9, 0x04, - // Bytes 3800 - 383f - 0xD1, 0x83, 0xCC, 0x8B, 0xC9, 0x04, 0xD1, 0x87, - 0xCC, 0x88, 0xC9, 0x04, 0xD1, 0x8B, 0xCC, 0x88, - 0xC9, 0x04, 0xD1, 0x8D, 0xCC, 0x88, 0xC9, 0x04, - 0xD1, 0x96, 0xCC, 0x88, 0xC9, 0x04, 0xD1, 0xB4, - 0xCC, 0x8F, 0xC9, 0x04, 0xD1, 0xB5, 0xCC, 0x8F, - 0xC9, 0x04, 0xD3, 0x98, 0xCC, 0x88, 0xC9, 0x04, - 0xD3, 0x99, 0xCC, 0x88, 0xC9, 0x04, 0xD3, 0xA8, - 0xCC, 0x88, 0xC9, 0x04, 0xD3, 0xA9, 0xCC, 0x88, - // Bytes 3840 - 387f - 0xC9, 0x04, 0xD8, 0xA7, 0xD9, 0x93, 0xC9, 0x04, - 0xD8, 0xA7, 0xD9, 0x94, 0xC9, 0x04, 0xD8, 0xA7, - 0xD9, 0x95, 0xB5, 0x04, 0xD9, 0x88, 0xD9, 0x94, - 0xC9, 0x04, 0xD9, 0x8A, 0xD9, 0x94, 0xC9, 0x04, - 0xDB, 0x81, 0xD9, 0x94, 0xC9, 0x04, 0xDB, 0x92, - 0xD9, 0x94, 0xC9, 0x04, 0xDB, 0x95, 0xD9, 0x94, - 0xC9, 0x05, 0x41, 0xCC, 0x82, 0xCC, 0x80, 0xCA, - 0x05, 0x41, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05, - // Bytes 3880 - 38bf - 0x41, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x41, - 0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x41, 0xCC, - 0x86, 0xCC, 0x80, 0xCA, 0x05, 0x41, 0xCC, 0x86, - 0xCC, 0x81, 0xCA, 0x05, 0x41, 0xCC, 0x86, 0xCC, - 0x83, 0xCA, 0x05, 0x41, 0xCC, 0x86, 0xCC, 0x89, - 0xCA, 0x05, 0x41, 0xCC, 0x87, 0xCC, 0x84, 0xCA, - 0x05, 0x41, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, - 0x41, 0xCC, 0x8A, 0xCC, 0x81, 0xCA, 0x05, 0x41, - // Bytes 38c0 - 38ff - 0xCC, 0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x41, 0xCC, - 0xA3, 0xCC, 0x86, 0xCA, 0x05, 0x43, 0xCC, 0xA7, - 0xCC, 0x81, 0xCA, 0x05, 0x45, 0xCC, 0x82, 0xCC, - 0x80, 0xCA, 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x81, - 0xCA, 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x83, 0xCA, - 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, - 0x45, 0xCC, 0x84, 0xCC, 0x80, 0xCA, 0x05, 0x45, - 0xCC, 0x84, 0xCC, 0x81, 0xCA, 0x05, 0x45, 0xCC, - // Bytes 3900 - 393f - 0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x45, 0xCC, 0xA7, - 0xCC, 0x86, 0xCA, 0x05, 0x49, 0xCC, 0x88, 0xCC, - 0x81, 0xCA, 0x05, 0x4C, 0xCC, 0xA3, 0xCC, 0x84, - 0xCA, 0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x80, 0xCA, - 0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05, - 0x4F, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x4F, - 0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x4F, 0xCC, - 0x83, 0xCC, 0x81, 0xCA, 0x05, 0x4F, 0xCC, 0x83, - // Bytes 3940 - 397f - 0xCC, 0x84, 0xCA, 0x05, 0x4F, 0xCC, 0x83, 0xCC, - 0x88, 0xCA, 0x05, 0x4F, 0xCC, 0x84, 0xCC, 0x80, - 0xCA, 0x05, 0x4F, 0xCC, 0x84, 0xCC, 0x81, 0xCA, - 0x05, 0x4F, 0xCC, 0x87, 0xCC, 0x84, 0xCA, 0x05, - 0x4F, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x4F, - 0xCC, 0x9B, 0xCC, 0x80, 0xCA, 0x05, 0x4F, 0xCC, - 0x9B, 0xCC, 0x81, 0xCA, 0x05, 0x4F, 0xCC, 0x9B, - 0xCC, 0x83, 0xCA, 0x05, 0x4F, 0xCC, 0x9B, 0xCC, - // Bytes 3980 - 39bf - 0x89, 0xCA, 0x05, 0x4F, 0xCC, 0x9B, 0xCC, 0xA3, - 0xB6, 0x05, 0x4F, 0xCC, 0xA3, 0xCC, 0x82, 0xCA, - 0x05, 0x4F, 0xCC, 0xA8, 0xCC, 0x84, 0xCA, 0x05, - 0x52, 0xCC, 0xA3, 0xCC, 0x84, 0xCA, 0x05, 0x53, - 0xCC, 0x81, 0xCC, 0x87, 0xCA, 0x05, 0x53, 0xCC, - 0x8C, 0xCC, 0x87, 0xCA, 0x05, 0x53, 0xCC, 0xA3, - 0xCC, 0x87, 0xCA, 0x05, 0x55, 0xCC, 0x83, 0xCC, - 0x81, 0xCA, 0x05, 0x55, 0xCC, 0x84, 0xCC, 0x88, - // Bytes 39c0 - 39ff - 0xCA, 0x05, 0x55, 0xCC, 0x88, 0xCC, 0x80, 0xCA, - 0x05, 0x55, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x05, - 0x55, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x55, - 0xCC, 0x88, 0xCC, 0x8C, 0xCA, 0x05, 0x55, 0xCC, - 0x9B, 0xCC, 0x80, 0xCA, 0x05, 0x55, 0xCC, 0x9B, - 0xCC, 0x81, 0xCA, 0x05, 0x55, 0xCC, 0x9B, 0xCC, - 0x83, 0xCA, 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0x89, - 0xCA, 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0xA3, 0xB6, - // Bytes 3a00 - 3a3f - 0x05, 0x61, 0xCC, 0x82, 0xCC, 0x80, 0xCA, 0x05, - 0x61, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05, 0x61, - 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x61, 0xCC, - 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x61, 0xCC, 0x86, - 0xCC, 0x80, 0xCA, 0x05, 0x61, 0xCC, 0x86, 0xCC, - 0x81, 0xCA, 0x05, 0x61, 0xCC, 0x86, 0xCC, 0x83, - 0xCA, 0x05, 0x61, 0xCC, 0x86, 0xCC, 0x89, 0xCA, - 0x05, 0x61, 0xCC, 0x87, 0xCC, 0x84, 0xCA, 0x05, - // Bytes 3a40 - 3a7f - 0x61, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x61, - 0xCC, 0x8A, 0xCC, 0x81, 0xCA, 0x05, 0x61, 0xCC, - 0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x61, 0xCC, 0xA3, - 0xCC, 0x86, 0xCA, 0x05, 0x63, 0xCC, 0xA7, 0xCC, - 0x81, 0xCA, 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x80, - 0xCA, 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x81, 0xCA, - 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, - 0x65, 0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x65, - // Bytes 3a80 - 3abf - 0xCC, 0x84, 0xCC, 0x80, 0xCA, 0x05, 0x65, 0xCC, - 0x84, 0xCC, 0x81, 0xCA, 0x05, 0x65, 0xCC, 0xA3, - 0xCC, 0x82, 0xCA, 0x05, 0x65, 0xCC, 0xA7, 0xCC, - 0x86, 0xCA, 0x05, 0x69, 0xCC, 0x88, 0xCC, 0x81, - 0xCA, 0x05, 0x6C, 0xCC, 0xA3, 0xCC, 0x84, 0xCA, - 0x05, 0x6F, 0xCC, 0x82, 0xCC, 0x80, 0xCA, 0x05, - 0x6F, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05, 0x6F, - 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x6F, 0xCC, - // Bytes 3ac0 - 3aff - 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x6F, 0xCC, 0x83, - 0xCC, 0x81, 0xCA, 0x05, 0x6F, 0xCC, 0x83, 0xCC, - 0x84, 0xCA, 0x05, 0x6F, 0xCC, 0x83, 0xCC, 0x88, - 0xCA, 0x05, 0x6F, 0xCC, 0x84, 0xCC, 0x80, 0xCA, - 0x05, 0x6F, 0xCC, 0x84, 0xCC, 0x81, 0xCA, 0x05, - 0x6F, 0xCC, 0x87, 0xCC, 0x84, 0xCA, 0x05, 0x6F, - 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x6F, 0xCC, - 0x9B, 0xCC, 0x80, 0xCA, 0x05, 0x6F, 0xCC, 0x9B, - // Bytes 3b00 - 3b3f - 0xCC, 0x81, 0xCA, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, - 0x83, 0xCA, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, 0x89, - 0xCA, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, 0xA3, 0xB6, - 0x05, 0x6F, 0xCC, 0xA3, 0xCC, 0x82, 0xCA, 0x05, - 0x6F, 0xCC, 0xA8, 0xCC, 0x84, 0xCA, 0x05, 0x72, - 0xCC, 0xA3, 0xCC, 0x84, 0xCA, 0x05, 0x73, 0xCC, - 0x81, 0xCC, 0x87, 0xCA, 0x05, 0x73, 0xCC, 0x8C, - 0xCC, 0x87, 0xCA, 0x05, 0x73, 0xCC, 0xA3, 0xCC, - // Bytes 3b40 - 3b7f - 0x87, 0xCA, 0x05, 0x75, 0xCC, 0x83, 0xCC, 0x81, - 0xCA, 0x05, 0x75, 0xCC, 0x84, 0xCC, 0x88, 0xCA, - 0x05, 0x75, 0xCC, 0x88, 0xCC, 0x80, 0xCA, 0x05, - 0x75, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x05, 0x75, - 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x75, 0xCC, - 0x88, 0xCC, 0x8C, 0xCA, 0x05, 0x75, 0xCC, 0x9B, - 0xCC, 0x80, 0xCA, 0x05, 0x75, 0xCC, 0x9B, 0xCC, - 0x81, 0xCA, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0x83, - // Bytes 3b80 - 3bbf - 0xCA, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0x89, 0xCA, - 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0xA3, 0xB6, 0x05, - 0xE1, 0xBE, 0xBF, 0xCC, 0x80, 0xCA, 0x05, 0xE1, - 0xBE, 0xBF, 0xCC, 0x81, 0xCA, 0x05, 0xE1, 0xBE, - 0xBF, 0xCD, 0x82, 0xCA, 0x05, 0xE1, 0xBF, 0xBE, - 0xCC, 0x80, 0xCA, 0x05, 0xE1, 0xBF, 0xBE, 0xCC, - 0x81, 0xCA, 0x05, 0xE1, 0xBF, 0xBE, 0xCD, 0x82, - 0xCA, 0x05, 0xE2, 0x86, 0x90, 0xCC, 0xB8, 0x05, - // Bytes 3bc0 - 3bff - 0x05, 0xE2, 0x86, 0x92, 0xCC, 0xB8, 0x05, 0x05, - 0xE2, 0x86, 0x94, 0xCC, 0xB8, 0x05, 0x05, 0xE2, - 0x87, 0x90, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x87, - 0x92, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x87, 0x94, - 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x88, 0x83, 0xCC, - 0xB8, 0x05, 0x05, 0xE2, 0x88, 0x88, 0xCC, 0xB8, - 0x05, 0x05, 0xE2, 0x88, 0x8B, 0xCC, 0xB8, 0x05, - 0x05, 0xE2, 0x88, 0xA3, 0xCC, 0xB8, 0x05, 0x05, - // Bytes 3c00 - 3c3f - 0xE2, 0x88, 0xA5, 0xCC, 0xB8, 0x05, 0x05, 0xE2, - 0x88, 0xBC, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, - 0x83, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x85, - 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x88, 0xCC, - 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x8D, 0xCC, 0xB8, - 0x05, 0x05, 0xE2, 0x89, 0xA1, 0xCC, 0xB8, 0x05, - 0x05, 0xE2, 0x89, 0xA4, 0xCC, 0xB8, 0x05, 0x05, - 0xE2, 0x89, 0xA5, 0xCC, 0xB8, 0x05, 0x05, 0xE2, - // Bytes 3c40 - 3c7f - 0x89, 0xB2, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, - 0xB3, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xB6, - 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xB7, 0xCC, - 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xBA, 0xCC, 0xB8, - 0x05, 0x05, 0xE2, 0x89, 0xBB, 0xCC, 0xB8, 0x05, - 0x05, 0xE2, 0x89, 0xBC, 0xCC, 0xB8, 0x05, 0x05, - 0xE2, 0x89, 0xBD, 0xCC, 0xB8, 0x05, 0x05, 0xE2, - 0x8A, 0x82, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, - // Bytes 3c80 - 3cbf - 0x83, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x86, - 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x87, 0xCC, - 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x91, 0xCC, 0xB8, - 0x05, 0x05, 0xE2, 0x8A, 0x92, 0xCC, 0xB8, 0x05, - 0x05, 0xE2, 0x8A, 0xA2, 0xCC, 0xB8, 0x05, 0x05, - 0xE2, 0x8A, 0xA8, 0xCC, 0xB8, 0x05, 0x05, 0xE2, - 0x8A, 0xA9, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, - 0xAB, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB2, - // Bytes 3cc0 - 3cff - 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB3, 0xCC, - 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB4, 0xCC, 0xB8, - 0x05, 0x05, 0xE2, 0x8A, 0xB5, 0xCC, 0xB8, 0x05, - 0x06, 0xCE, 0x91, 0xCC, 0x93, 0xCD, 0x85, 0xDA, - 0x06, 0xCE, 0x91, 0xCC, 0x94, 0xCD, 0x85, 0xDA, - 0x06, 0xCE, 0x95, 0xCC, 0x93, 0xCC, 0x80, 0xCA, - 0x06, 0xCE, 0x95, 0xCC, 0x93, 0xCC, 0x81, 0xCA, - 0x06, 0xCE, 0x95, 0xCC, 0x94, 0xCC, 0x80, 0xCA, - // Bytes 3d00 - 3d3f - 0x06, 0xCE, 0x95, 0xCC, 0x94, 0xCC, 0x81, 0xCA, - 0x06, 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x85, 0xDA, - 0x06, 0xCE, 0x97, 0xCC, 0x94, 0xCD, 0x85, 0xDA, - 0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCC, 0x80, 0xCA, - 0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCC, 0x81, 0xCA, - 0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCD, 0x82, 0xCA, - 0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCC, 0x80, 0xCA, - 0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCC, 0x81, 0xCA, - // Bytes 3d40 - 3d7f - 0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCD, 0x82, 0xCA, - 0x06, 0xCE, 0x9F, 0xCC, 0x93, 0xCC, 0x80, 0xCA, - 0x06, 0xCE, 0x9F, 0xCC, 0x93, 0xCC, 0x81, 0xCA, - 0x06, 0xCE, 0x9F, 0xCC, 0x94, 0xCC, 0x80, 0xCA, - 0x06, 0xCE, 0x9F, 0xCC, 0x94, 0xCC, 0x81, 0xCA, - 0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCC, 0x80, 0xCA, - 0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCC, 0x81, 0xCA, - 0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCD, 0x82, 0xCA, - // Bytes 3d80 - 3dbf - 0x06, 0xCE, 0xA9, 0xCC, 0x93, 0xCD, 0x85, 0xDA, - 0x06, 0xCE, 0xA9, 0xCC, 0x94, 0xCD, 0x85, 0xDA, - 0x06, 0xCE, 0xB1, 0xCC, 0x80, 0xCD, 0x85, 0xDA, - 0x06, 0xCE, 0xB1, 0xCC, 0x81, 0xCD, 0x85, 0xDA, - 0x06, 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x85, 0xDA, - 0x06, 0xCE, 0xB1, 0xCC, 0x94, 0xCD, 0x85, 0xDA, - 0x06, 0xCE, 0xB1, 0xCD, 0x82, 0xCD, 0x85, 0xDA, - 0x06, 0xCE, 0xB5, 0xCC, 0x93, 0xCC, 0x80, 0xCA, - // Bytes 3dc0 - 3dff - 0x06, 0xCE, 0xB5, 0xCC, 0x93, 0xCC, 0x81, 0xCA, - 0x06, 0xCE, 0xB5, 0xCC, 0x94, 0xCC, 0x80, 0xCA, - 0x06, 0xCE, 0xB5, 0xCC, 0x94, 0xCC, 0x81, 0xCA, - 0x06, 0xCE, 0xB7, 0xCC, 0x80, 0xCD, 0x85, 0xDA, - 0x06, 0xCE, 0xB7, 0xCC, 0x81, 0xCD, 0x85, 0xDA, - 0x06, 0xCE, 0xB7, 0xCC, 0x93, 0xCD, 0x85, 0xDA, - 0x06, 0xCE, 0xB7, 0xCC, 0x94, 0xCD, 0x85, 0xDA, - 0x06, 0xCE, 0xB7, 0xCD, 0x82, 0xCD, 0x85, 0xDA, - // Bytes 3e00 - 3e3f - 0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x80, 0xCA, - 0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x81, 0xCA, - 0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCD, 0x82, 0xCA, - 0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCC, 0x80, 0xCA, - 0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCC, 0x81, 0xCA, - 0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCD, 0x82, 0xCA, - 0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCC, 0x80, 0xCA, - 0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCC, 0x81, 0xCA, - // Bytes 3e40 - 3e7f - 0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCD, 0x82, 0xCA, - 0x06, 0xCE, 0xBF, 0xCC, 0x93, 0xCC, 0x80, 0xCA, - 0x06, 0xCE, 0xBF, 0xCC, 0x93, 0xCC, 0x81, 0xCA, - 0x06, 0xCE, 0xBF, 0xCC, 0x94, 0xCC, 0x80, 0xCA, - 0x06, 0xCE, 0xBF, 0xCC, 0x94, 0xCC, 0x81, 0xCA, - 0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCC, 0x80, 0xCA, - 0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCC, 0x81, 0xCA, - 0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCD, 0x82, 0xCA, - // Bytes 3e80 - 3ebf - 0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCC, 0x80, 0xCA, - 0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCC, 0x81, 0xCA, - 0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCD, 0x82, 0xCA, - 0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCC, 0x80, 0xCA, - 0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCC, 0x81, 0xCA, - 0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCD, 0x82, 0xCA, - 0x06, 0xCF, 0x89, 0xCC, 0x80, 0xCD, 0x85, 0xDA, - 0x06, 0xCF, 0x89, 0xCC, 0x81, 0xCD, 0x85, 0xDA, - // Bytes 3ec0 - 3eff - 0x06, 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x85, 0xDA, - 0x06, 0xCF, 0x89, 0xCC, 0x94, 0xCD, 0x85, 0xDA, - 0x06, 0xCF, 0x89, 0xCD, 0x82, 0xCD, 0x85, 0xDA, - 0x06, 0xE0, 0xA4, 0xA8, 0xE0, 0xA4, 0xBC, 0x09, - 0x06, 0xE0, 0xA4, 0xB0, 0xE0, 0xA4, 0xBC, 0x09, - 0x06, 0xE0, 0xA4, 0xB3, 0xE0, 0xA4, 0xBC, 0x09, - 0x06, 0xE0, 0xB1, 0x86, 0xE0, 0xB1, 0x96, 0x85, - 0x06, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, 0x8A, 0x11, - // Bytes 3f00 - 3f3f - 0x06, 0xE3, 0x81, 0x86, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x81, 0x8B, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x81, 0x8D, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x81, 0x8F, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x81, 0x91, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x81, 0x93, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x81, 0x95, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x81, 0x97, 0xE3, 0x82, 0x99, 0x0D, - // Bytes 3f40 - 3f7f - 0x06, 0xE3, 0x81, 0x99, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x81, 0x9D, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x81, 0x9F, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x81, 0xA1, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x81, 0xA4, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x81, 0xA6, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x81, 0xA8, 0xE3, 0x82, 0x99, 0x0D, - // Bytes 3f80 - 3fbf - 0x06, 0xE3, 0x81, 0xAF, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x81, 0xAF, 0xE3, 0x82, 0x9A, 0x0D, - 0x06, 0xE3, 0x81, 0xB2, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x81, 0xB2, 0xE3, 0x82, 0x9A, 0x0D, - 0x06, 0xE3, 0x81, 0xB5, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x81, 0xB5, 0xE3, 0x82, 0x9A, 0x0D, - 0x06, 0xE3, 0x81, 0xB8, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x81, 0xB8, 0xE3, 0x82, 0x9A, 0x0D, - // Bytes 3fc0 - 3fff - 0x06, 0xE3, 0x81, 0xBB, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x81, 0xBB, 0xE3, 0x82, 0x9A, 0x0D, - 0x06, 0xE3, 0x82, 0x9D, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x82, 0xA6, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x82, 0xAD, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x82, 0xB1, 0xE3, 0x82, 0x99, 0x0D, - // Bytes 4000 - 403f - 0x06, 0xE3, 0x82, 0xB3, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x82, 0xB5, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x82, 0xB7, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x82, 0xB9, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x82, 0xBB, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x82, 0xBD, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x83, 0x81, 0xE3, 0x82, 0x99, 0x0D, - // Bytes 4040 - 407f - 0x06, 0xE3, 0x83, 0x84, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x83, 0x86, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x9A, 0x0D, - 0x06, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0x0D, - 0x06, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x99, 0x0D, - // Bytes 4080 - 40bf - 0x06, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x9A, 0x0D, - 0x06, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0x0D, - 0x06, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0x0D, - 0x06, 0xE3, 0x83, 0xAF, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x83, 0xB0, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x83, 0xB1, 0xE3, 0x82, 0x99, 0x0D, - // Bytes 40c0 - 40ff - 0x06, 0xE3, 0x83, 0xB2, 0xE3, 0x82, 0x99, 0x0D, - 0x06, 0xE3, 0x83, 0xBD, 0xE3, 0x82, 0x99, 0x0D, - 0x08, 0xCE, 0x91, 0xCC, 0x93, 0xCC, 0x80, 0xCD, - 0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC, 0x93, 0xCC, - 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC, - 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, - 0x91, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB, - 0x08, 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x81, 0xCD, - // Bytes 4100 - 413f - 0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC, 0x94, 0xCD, - 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC, - 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, - 0x97, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB, - 0x08, 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x82, 0xCD, - 0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC, 0x94, 0xCC, - 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC, - 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, - // Bytes 4140 - 417f - 0x97, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB, - 0x08, 0xCE, 0xA9, 0xCC, 0x93, 0xCC, 0x80, 0xCD, - 0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC, 0x93, 0xCC, - 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC, - 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, - 0xA9, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB, - 0x08, 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x81, 0xCD, - 0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC, 0x94, 0xCD, - // Bytes 4180 - 41bf - 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC, - 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, - 0xB1, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB, - 0x08, 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x82, 0xCD, - 0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC, 0x94, 0xCC, - 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC, - 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, - 0xB1, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB, - // Bytes 41c0 - 41ff - 0x08, 0xCE, 0xB7, 0xCC, 0x93, 0xCC, 0x80, 0xCD, - 0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC, 0x93, 0xCC, - 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC, - 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, - 0xB7, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB, - 0x08, 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x81, 0xCD, - 0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC, 0x94, 0xCD, - 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC, - // Bytes 4200 - 423f - 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCF, - 0x89, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB, - 0x08, 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x82, 0xCD, - 0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC, 0x94, 0xCC, - 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC, - 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCF, - 0x89, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB, - 0x08, 0xF0, 0x91, 0x82, 0x99, 0xF0, 0x91, 0x82, - // Bytes 4240 - 427f - 0xBA, 0x09, 0x08, 0xF0, 0x91, 0x82, 0x9B, 0xF0, - 0x91, 0x82, 0xBA, 0x09, 0x08, 0xF0, 0x91, 0x82, - 0xA5, 0xF0, 0x91, 0x82, 0xBA, 0x09, 0x42, 0xC2, - 0xB4, 0x01, 0x43, 0x20, 0xCC, 0x81, 0xC9, 0x43, - 0x20, 0xCC, 0x83, 0xC9, 0x43, 0x20, 0xCC, 0x84, - 0xC9, 0x43, 0x20, 0xCC, 0x85, 0xC9, 0x43, 0x20, - 0xCC, 0x86, 0xC9, 0x43, 0x20, 0xCC, 0x87, 0xC9, - 0x43, 0x20, 0xCC, 0x88, 0xC9, 0x43, 0x20, 0xCC, - // Bytes 4280 - 42bf - 0x8A, 0xC9, 0x43, 0x20, 0xCC, 0x8B, 0xC9, 0x43, - 0x20, 0xCC, 0x93, 0xC9, 0x43, 0x20, 0xCC, 0x94, - 0xC9, 0x43, 0x20, 0xCC, 0xA7, 0xA5, 0x43, 0x20, - 0xCC, 0xA8, 0xA5, 0x43, 0x20, 0xCC, 0xB3, 0xB5, - 0x43, 0x20, 0xCD, 0x82, 0xC9, 0x43, 0x20, 0xCD, - 0x85, 0xD9, 0x43, 0x20, 0xD9, 0x8B, 0x59, 0x43, - 0x20, 0xD9, 0x8C, 0x5D, 0x43, 0x20, 0xD9, 0x8D, - 0x61, 0x43, 0x20, 0xD9, 0x8E, 0x65, 0x43, 0x20, - // Bytes 42c0 - 42ff - 0xD9, 0x8F, 0x69, 0x43, 0x20, 0xD9, 0x90, 0x6D, - 0x43, 0x20, 0xD9, 0x91, 0x71, 0x43, 0x20, 0xD9, - 0x92, 0x75, 0x43, 0x41, 0xCC, 0x8A, 0xC9, 0x43, - 0x73, 0xCC, 0x87, 0xC9, 0x44, 0x20, 0xE3, 0x82, - 0x99, 0x0D, 0x44, 0x20, 0xE3, 0x82, 0x9A, 0x0D, - 0x44, 0xC2, 0xA8, 0xCC, 0x81, 0xCA, 0x44, 0xCE, - 0x91, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0x95, 0xCC, - 0x81, 0xC9, 0x44, 0xCE, 0x97, 0xCC, 0x81, 0xC9, - // Bytes 4300 - 433f - 0x44, 0xCE, 0x99, 0xCC, 0x81, 0xC9, 0x44, 0xCE, - 0x9F, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xA5, 0xCC, - 0x81, 0xC9, 0x44, 0xCE, 0xA5, 0xCC, 0x88, 0xC9, - 0x44, 0xCE, 0xA9, 0xCC, 0x81, 0xC9, 0x44, 0xCE, - 0xB1, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xB5, 0xCC, - 0x81, 0xC9, 0x44, 0xCE, 0xB7, 0xCC, 0x81, 0xC9, - 0x44, 0xCE, 0xB9, 0xCC, 0x81, 0xC9, 0x44, 0xCE, - 0xBF, 0xCC, 0x81, 0xC9, 0x44, 0xCF, 0x85, 0xCC, - // Bytes 4340 - 437f - 0x81, 0xC9, 0x44, 0xCF, 0x89, 0xCC, 0x81, 0xC9, - 0x44, 0xD7, 0x90, 0xD6, 0xB7, 0x31, 0x44, 0xD7, - 0x90, 0xD6, 0xB8, 0x35, 0x44, 0xD7, 0x90, 0xD6, - 0xBC, 0x41, 0x44, 0xD7, 0x91, 0xD6, 0xBC, 0x41, - 0x44, 0xD7, 0x91, 0xD6, 0xBF, 0x49, 0x44, 0xD7, - 0x92, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x93, 0xD6, - 0xBC, 0x41, 0x44, 0xD7, 0x94, 0xD6, 0xBC, 0x41, - 0x44, 0xD7, 0x95, 0xD6, 0xB9, 0x39, 0x44, 0xD7, - // Bytes 4380 - 43bf - 0x95, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x96, 0xD6, - 0xBC, 0x41, 0x44, 0xD7, 0x98, 0xD6, 0xBC, 0x41, - 0x44, 0xD7, 0x99, 0xD6, 0xB4, 0x25, 0x44, 0xD7, - 0x99, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x9A, 0xD6, - 0xBC, 0x41, 0x44, 0xD7, 0x9B, 0xD6, 0xBC, 0x41, - 0x44, 0xD7, 0x9B, 0xD6, 0xBF, 0x49, 0x44, 0xD7, - 0x9C, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x9E, 0xD6, - 0xBC, 0x41, 0x44, 0xD7, 0xA0, 0xD6, 0xBC, 0x41, - // Bytes 43c0 - 43ff - 0x44, 0xD7, 0xA1, 0xD6, 0xBC, 0x41, 0x44, 0xD7, - 0xA3, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA4, 0xD6, - 0xBC, 0x41, 0x44, 0xD7, 0xA4, 0xD6, 0xBF, 0x49, - 0x44, 0xD7, 0xA6, 0xD6, 0xBC, 0x41, 0x44, 0xD7, - 0xA7, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA8, 0xD6, - 0xBC, 0x41, 0x44, 0xD7, 0xA9, 0xD6, 0xBC, 0x41, - 0x44, 0xD7, 0xA9, 0xD7, 0x81, 0x4D, 0x44, 0xD7, - 0xA9, 0xD7, 0x82, 0x51, 0x44, 0xD7, 0xAA, 0xD6, - // Bytes 4400 - 443f - 0xBC, 0x41, 0x44, 0xD7, 0xB2, 0xD6, 0xB7, 0x31, - 0x44, 0xD8, 0xA7, 0xD9, 0x8B, 0x59, 0x44, 0xD8, - 0xA7, 0xD9, 0x93, 0xC9, 0x44, 0xD8, 0xA7, 0xD9, - 0x94, 0xC9, 0x44, 0xD8, 0xA7, 0xD9, 0x95, 0xB5, - 0x44, 0xD8, 0xB0, 0xD9, 0xB0, 0x79, 0x44, 0xD8, - 0xB1, 0xD9, 0xB0, 0x79, 0x44, 0xD9, 0x80, 0xD9, - 0x8B, 0x59, 0x44, 0xD9, 0x80, 0xD9, 0x8E, 0x65, - 0x44, 0xD9, 0x80, 0xD9, 0x8F, 0x69, 0x44, 0xD9, - // Bytes 4440 - 447f - 0x80, 0xD9, 0x90, 0x6D, 0x44, 0xD9, 0x80, 0xD9, - 0x91, 0x71, 0x44, 0xD9, 0x80, 0xD9, 0x92, 0x75, - 0x44, 0xD9, 0x87, 0xD9, 0xB0, 0x79, 0x44, 0xD9, - 0x88, 0xD9, 0x94, 0xC9, 0x44, 0xD9, 0x89, 0xD9, - 0xB0, 0x79, 0x44, 0xD9, 0x8A, 0xD9, 0x94, 0xC9, - 0x44, 0xDB, 0x92, 0xD9, 0x94, 0xC9, 0x44, 0xDB, - 0x95, 0xD9, 0x94, 0xC9, 0x45, 0x20, 0xCC, 0x88, - 0xCC, 0x80, 0xCA, 0x45, 0x20, 0xCC, 0x88, 0xCC, - // Bytes 4480 - 44bf - 0x81, 0xCA, 0x45, 0x20, 0xCC, 0x88, 0xCD, 0x82, - 0xCA, 0x45, 0x20, 0xCC, 0x93, 0xCC, 0x80, 0xCA, - 0x45, 0x20, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x45, - 0x20, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x45, 0x20, - 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x45, 0x20, 0xCC, - 0x94, 0xCC, 0x81, 0xCA, 0x45, 0x20, 0xCC, 0x94, - 0xCD, 0x82, 0xCA, 0x45, 0x20, 0xD9, 0x8C, 0xD9, - 0x91, 0x72, 0x45, 0x20, 0xD9, 0x8D, 0xD9, 0x91, - // Bytes 44c0 - 44ff - 0x72, 0x45, 0x20, 0xD9, 0x8E, 0xD9, 0x91, 0x72, - 0x45, 0x20, 0xD9, 0x8F, 0xD9, 0x91, 0x72, 0x45, - 0x20, 0xD9, 0x90, 0xD9, 0x91, 0x72, 0x45, 0x20, - 0xD9, 0x91, 0xD9, 0xB0, 0x7A, 0x45, 0xE2, 0xAB, - 0x9D, 0xCC, 0xB8, 0x05, 0x46, 0xCE, 0xB9, 0xCC, - 0x88, 0xCC, 0x81, 0xCA, 0x46, 0xCF, 0x85, 0xCC, - 0x88, 0xCC, 0x81, 0xCA, 0x46, 0xD7, 0xA9, 0xD6, - 0xBC, 0xD7, 0x81, 0x4E, 0x46, 0xD7, 0xA9, 0xD6, - // Bytes 4500 - 453f - 0xBC, 0xD7, 0x82, 0x52, 0x46, 0xD9, 0x80, 0xD9, - 0x8E, 0xD9, 0x91, 0x72, 0x46, 0xD9, 0x80, 0xD9, - 0x8F, 0xD9, 0x91, 0x72, 0x46, 0xD9, 0x80, 0xD9, - 0x90, 0xD9, 0x91, 0x72, 0x46, 0xE0, 0xA4, 0x95, - 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x96, - 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x97, - 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x9C, - 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xA1, - // Bytes 4540 - 457f - 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xA2, - 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xAB, - 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xAF, - 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xA1, - 0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xA2, - 0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xAF, - 0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x96, - 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x97, - // Bytes 4580 - 45bf - 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x9C, - 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xAB, - 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xB2, - 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xB8, - 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xAC, 0xA1, - 0xE0, 0xAC, 0xBC, 0x09, 0x46, 0xE0, 0xAC, 0xA2, - 0xE0, 0xAC, 0xBC, 0x09, 0x46, 0xE0, 0xBE, 0xB2, - 0xE0, 0xBE, 0x80, 0x9D, 0x46, 0xE0, 0xBE, 0xB3, - // Bytes 45c0 - 45ff - 0xE0, 0xBE, 0x80, 0x9D, 0x46, 0xE3, 0x83, 0x86, - 0xE3, 0x82, 0x99, 0x0D, 0x48, 0xF0, 0x9D, 0x85, - 0x97, 0xF0, 0x9D, 0x85, 0xA5, 0xAD, 0x48, 0xF0, - 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xAD, - 0x48, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85, - 0xA5, 0xAD, 0x48, 0xF0, 0x9D, 0x86, 0xBA, 0xF0, - 0x9D, 0x85, 0xA5, 0xAD, 0x49, 0xE0, 0xBE, 0xB2, - 0xE0, 0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0x9E, 0x49, - // Bytes 4600 - 463f - 0xE0, 0xBE, 0xB3, 0xE0, 0xBD, 0xB1, 0xE0, 0xBE, - 0x80, 0x9E, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, - 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAE, 0xAE, - 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, - 0xA5, 0xF0, 0x9D, 0x85, 0xAF, 0xAE, 0x4C, 0xF0, - 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, - 0x9D, 0x85, 0xB0, 0xAE, 0x4C, 0xF0, 0x9D, 0x85, - 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, - // Bytes 4640 - 467f - 0xB1, 0xAE, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, - 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xB2, 0xAE, - 0x4C, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85, - 0xA5, 0xF0, 0x9D, 0x85, 0xAE, 0xAE, 0x4C, 0xF0, - 0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, - 0x9D, 0x85, 0xAF, 0xAE, 0x4C, 0xF0, 0x9D, 0x86, - 0xBA, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, - 0xAE, 0xAE, 0x4C, 0xF0, 0x9D, 0x86, 0xBA, 0xF0, - // Bytes 4680 - 46bf - 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAF, 0xAE, - 0x83, 0x41, 0xCC, 0x82, 0xC9, 0x83, 0x41, 0xCC, - 0x86, 0xC9, 0x83, 0x41, 0xCC, 0x87, 0xC9, 0x83, - 0x41, 0xCC, 0x88, 0xC9, 0x83, 0x41, 0xCC, 0x8A, - 0xC9, 0x83, 0x41, 0xCC, 0xA3, 0xB5, 0x83, 0x43, - 0xCC, 0xA7, 0xA5, 0x83, 0x45, 0xCC, 0x82, 0xC9, - 0x83, 0x45, 0xCC, 0x84, 0xC9, 0x83, 0x45, 0xCC, - 0xA3, 0xB5, 0x83, 0x45, 0xCC, 0xA7, 0xA5, 0x83, - // Bytes 46c0 - 46ff - 0x49, 0xCC, 0x88, 0xC9, 0x83, 0x4C, 0xCC, 0xA3, - 0xB5, 0x83, 0x4F, 0xCC, 0x82, 0xC9, 0x83, 0x4F, - 0xCC, 0x83, 0xC9, 0x83, 0x4F, 0xCC, 0x84, 0xC9, - 0x83, 0x4F, 0xCC, 0x87, 0xC9, 0x83, 0x4F, 0xCC, - 0x88, 0xC9, 0x83, 0x4F, 0xCC, 0x9B, 0xAD, 0x83, - 0x4F, 0xCC, 0xA3, 0xB5, 0x83, 0x4F, 0xCC, 0xA8, - 0xA5, 0x83, 0x52, 0xCC, 0xA3, 0xB5, 0x83, 0x53, - 0xCC, 0x81, 0xC9, 0x83, 0x53, 0xCC, 0x8C, 0xC9, - // Bytes 4700 - 473f - 0x83, 0x53, 0xCC, 0xA3, 0xB5, 0x83, 0x55, 0xCC, - 0x83, 0xC9, 0x83, 0x55, 0xCC, 0x84, 0xC9, 0x83, - 0x55, 0xCC, 0x88, 0xC9, 0x83, 0x55, 0xCC, 0x9B, - 0xAD, 0x83, 0x61, 0xCC, 0x82, 0xC9, 0x83, 0x61, - 0xCC, 0x86, 0xC9, 0x83, 0x61, 0xCC, 0x87, 0xC9, - 0x83, 0x61, 0xCC, 0x88, 0xC9, 0x83, 0x61, 0xCC, - 0x8A, 0xC9, 0x83, 0x61, 0xCC, 0xA3, 0xB5, 0x83, - 0x63, 0xCC, 0xA7, 0xA5, 0x83, 0x65, 0xCC, 0x82, - // Bytes 4740 - 477f - 0xC9, 0x83, 0x65, 0xCC, 0x84, 0xC9, 0x83, 0x65, - 0xCC, 0xA3, 0xB5, 0x83, 0x65, 0xCC, 0xA7, 0xA5, - 0x83, 0x69, 0xCC, 0x88, 0xC9, 0x83, 0x6C, 0xCC, - 0xA3, 0xB5, 0x83, 0x6F, 0xCC, 0x82, 0xC9, 0x83, - 0x6F, 0xCC, 0x83, 0xC9, 0x83, 0x6F, 0xCC, 0x84, - 0xC9, 0x83, 0x6F, 0xCC, 0x87, 0xC9, 0x83, 0x6F, - 0xCC, 0x88, 0xC9, 0x83, 0x6F, 0xCC, 0x9B, 0xAD, - 0x83, 0x6F, 0xCC, 0xA3, 0xB5, 0x83, 0x6F, 0xCC, - // Bytes 4780 - 47bf - 0xA8, 0xA5, 0x83, 0x72, 0xCC, 0xA3, 0xB5, 0x83, - 0x73, 0xCC, 0x81, 0xC9, 0x83, 0x73, 0xCC, 0x8C, - 0xC9, 0x83, 0x73, 0xCC, 0xA3, 0xB5, 0x83, 0x75, - 0xCC, 0x83, 0xC9, 0x83, 0x75, 0xCC, 0x84, 0xC9, - 0x83, 0x75, 0xCC, 0x88, 0xC9, 0x83, 0x75, 0xCC, - 0x9B, 0xAD, 0x84, 0xCE, 0x91, 0xCC, 0x93, 0xC9, - 0x84, 0xCE, 0x91, 0xCC, 0x94, 0xC9, 0x84, 0xCE, - 0x95, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0x95, 0xCC, - // Bytes 47c0 - 47ff - 0x94, 0xC9, 0x84, 0xCE, 0x97, 0xCC, 0x93, 0xC9, - 0x84, 0xCE, 0x97, 0xCC, 0x94, 0xC9, 0x84, 0xCE, - 0x99, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0x99, 0xCC, - 0x94, 0xC9, 0x84, 0xCE, 0x9F, 0xCC, 0x93, 0xC9, - 0x84, 0xCE, 0x9F, 0xCC, 0x94, 0xC9, 0x84, 0xCE, - 0xA5, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0xA9, 0xCC, - 0x93, 0xC9, 0x84, 0xCE, 0xA9, 0xCC, 0x94, 0xC9, - 0x84, 0xCE, 0xB1, 0xCC, 0x80, 0xC9, 0x84, 0xCE, - // Bytes 4800 - 483f - 0xB1, 0xCC, 0x81, 0xC9, 0x84, 0xCE, 0xB1, 0xCC, - 0x93, 0xC9, 0x84, 0xCE, 0xB1, 0xCC, 0x94, 0xC9, - 0x84, 0xCE, 0xB1, 0xCD, 0x82, 0xC9, 0x84, 0xCE, - 0xB5, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB5, 0xCC, - 0x94, 0xC9, 0x84, 0xCE, 0xB7, 0xCC, 0x80, 0xC9, - 0x84, 0xCE, 0xB7, 0xCC, 0x81, 0xC9, 0x84, 0xCE, - 0xB7, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB7, 0xCC, - 0x94, 0xC9, 0x84, 0xCE, 0xB7, 0xCD, 0x82, 0xC9, - // Bytes 4840 - 487f - 0x84, 0xCE, 0xB9, 0xCC, 0x88, 0xC9, 0x84, 0xCE, - 0xB9, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB9, 0xCC, - 0x94, 0xC9, 0x84, 0xCE, 0xBF, 0xCC, 0x93, 0xC9, - 0x84, 0xCE, 0xBF, 0xCC, 0x94, 0xC9, 0x84, 0xCF, - 0x85, 0xCC, 0x88, 0xC9, 0x84, 0xCF, 0x85, 0xCC, - 0x93, 0xC9, 0x84, 0xCF, 0x85, 0xCC, 0x94, 0xC9, - 0x84, 0xCF, 0x89, 0xCC, 0x80, 0xC9, 0x84, 0xCF, - 0x89, 0xCC, 0x81, 0xC9, 0x84, 0xCF, 0x89, 0xCC, - // Bytes 4880 - 48bf - 0x93, 0xC9, 0x84, 0xCF, 0x89, 0xCC, 0x94, 0xC9, - 0x84, 0xCF, 0x89, 0xCD, 0x82, 0xC9, 0x86, 0xCE, - 0x91, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE, - 0x91, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE, - 0x91, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE, - 0x91, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE, - 0x91, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE, - 0x91, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE, - // Bytes 48c0 - 48ff - 0x97, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE, - 0x97, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE, - 0x97, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE, - 0x97, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE, - 0x97, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE, - 0x97, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE, - 0xA9, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE, - 0xA9, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE, - // Bytes 4900 - 493f - 0xA9, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE, - 0xA9, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE, - 0xA9, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE, - 0xA9, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE, - 0xB1, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE, - 0xB1, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE, - 0xB1, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE, - 0xB1, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE, - // Bytes 4940 - 497f - 0xB1, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE, - 0xB1, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE, - 0xB7, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE, - 0xB7, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE, - 0xB7, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE, - 0xB7, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE, - 0xB7, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE, - 0xB7, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCF, - // Bytes 4980 - 49bf - 0x89, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCF, - 0x89, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCF, - 0x89, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCF, - 0x89, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCF, - 0x89, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCF, - 0x89, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x42, 0xCC, - 0x80, 0xC9, 0x32, 0x42, 0xCC, 0x81, 0xC9, 0x32, - 0x42, 0xCC, 0x93, 0xC9, 0x32, 0x43, 0xE1, 0x85, - // Bytes 49c0 - 49ff - 0xA1, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA2, 0x01, - 0x00, 0x43, 0xE1, 0x85, 0xA3, 0x01, 0x00, 0x43, - 0xE1, 0x85, 0xA4, 0x01, 0x00, 0x43, 0xE1, 0x85, - 0xA5, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA6, 0x01, - 0x00, 0x43, 0xE1, 0x85, 0xA7, 0x01, 0x00, 0x43, - 0xE1, 0x85, 0xA8, 0x01, 0x00, 0x43, 0xE1, 0x85, - 0xA9, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAA, 0x01, - 0x00, 0x43, 0xE1, 0x85, 0xAB, 0x01, 0x00, 0x43, - // Bytes 4a00 - 4a3f - 0xE1, 0x85, 0xAC, 0x01, 0x00, 0x43, 0xE1, 0x85, - 0xAD, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAE, 0x01, - 0x00, 0x43, 0xE1, 0x85, 0xAF, 0x01, 0x00, 0x43, - 0xE1, 0x85, 0xB0, 0x01, 0x00, 0x43, 0xE1, 0x85, - 0xB1, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xB2, 0x01, - 0x00, 0x43, 0xE1, 0x85, 0xB3, 0x01, 0x00, 0x43, - 0xE1, 0x85, 0xB4, 0x01, 0x00, 0x43, 0xE1, 0x85, - 0xB5, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xAA, 0x01, - // Bytes 4a40 - 4a7f - 0x00, 0x43, 0xE1, 0x86, 0xAC, 0x01, 0x00, 0x43, - 0xE1, 0x86, 0xAD, 0x01, 0x00, 0x43, 0xE1, 0x86, - 0xB0, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB1, 0x01, - 0x00, 0x43, 0xE1, 0x86, 0xB2, 0x01, 0x00, 0x43, - 0xE1, 0x86, 0xB3, 0x01, 0x00, 0x43, 0xE1, 0x86, - 0xB4, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB5, 0x01, - 0x00, 0x44, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x32, - 0x43, 0xE3, 0x82, 0x99, 0x0D, 0x03, 0x43, 0xE3, - // Bytes 4a80 - 4abf - 0x82, 0x9A, 0x0D, 0x03, 0x46, 0xE0, 0xBD, 0xB1, - 0xE0, 0xBD, 0xB2, 0x9E, 0x26, 0x46, 0xE0, 0xBD, - 0xB1, 0xE0, 0xBD, 0xB4, 0xA2, 0x26, 0x46, 0xE0, - 0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0x9E, 0x26, 0x00, - 0x01, -} - -// lookup returns the trie value for the first UTF-8 encoding in s and -// the width in bytes of this encoding. The size will be 0 if s does not -// hold enough bytes to complete the encoding. len(s) must be greater than 0. -func (t *nfcTrie) lookup(s []byte) (v uint16, sz int) { - c0 := s[0] - switch { - case c0 < 0x80: // is ASCII - return nfcValues[c0], 1 - case c0 < 0xC2: - return 0, 1 // Illegal UTF-8: not a starter, not ASCII. - case c0 < 0xE0: // 2-byte UTF-8 - if len(s) < 2 { - return 0, 0 - } - i := nfcIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c1), 2 - case c0 < 0xF0: // 3-byte UTF-8 - if len(s) < 3 { - return 0, 0 - } - i := nfcIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - o := uint32(i)<<6 + uint32(c1) - i = nfcIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return 0, 2 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c2), 3 - case c0 < 0xF8: // 4-byte UTF-8 - if len(s) < 4 { - return 0, 0 - } - i := nfcIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - o := uint32(i)<<6 + uint32(c1) - i = nfcIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return 0, 2 // Illegal UTF-8: not a continuation byte. - } - o = uint32(i)<<6 + uint32(c2) - i = nfcIndex[o] - c3 := s[3] - if c3 < 0x80 || 0xC0 <= c3 { - return 0, 3 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c3), 4 - } - // Illegal rune - return 0, 1 -} - -// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. -// s must start with a full and valid UTF-8 encoded rune. -func (t *nfcTrie) lookupUnsafe(s []byte) uint16 { - c0 := s[0] - if c0 < 0x80 { // is ASCII - return nfcValues[c0] - } - i := nfcIndex[c0] - if c0 < 0xE0 { // 2-byte UTF-8 - return t.lookupValue(uint32(i), s[1]) - } - i = nfcIndex[uint32(i)<<6+uint32(s[1])] - if c0 < 0xF0 { // 3-byte UTF-8 - return t.lookupValue(uint32(i), s[2]) - } - i = nfcIndex[uint32(i)<<6+uint32(s[2])] - if c0 < 0xF8 { // 4-byte UTF-8 - return t.lookupValue(uint32(i), s[3]) - } - return 0 -} - -// lookupString returns the trie value for the first UTF-8 encoding in s and -// the width in bytes of this encoding. The size will be 0 if s does not -// hold enough bytes to complete the encoding. len(s) must be greater than 0. -func (t *nfcTrie) lookupString(s string) (v uint16, sz int) { - c0 := s[0] - switch { - case c0 < 0x80: // is ASCII - return nfcValues[c0], 1 - case c0 < 0xC2: - return 0, 1 // Illegal UTF-8: not a starter, not ASCII. - case c0 < 0xE0: // 2-byte UTF-8 - if len(s) < 2 { - return 0, 0 - } - i := nfcIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c1), 2 - case c0 < 0xF0: // 3-byte UTF-8 - if len(s) < 3 { - return 0, 0 - } - i := nfcIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - o := uint32(i)<<6 + uint32(c1) - i = nfcIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return 0, 2 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c2), 3 - case c0 < 0xF8: // 4-byte UTF-8 - if len(s) < 4 { - return 0, 0 - } - i := nfcIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - o := uint32(i)<<6 + uint32(c1) - i = nfcIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return 0, 2 // Illegal UTF-8: not a continuation byte. - } - o = uint32(i)<<6 + uint32(c2) - i = nfcIndex[o] - c3 := s[3] - if c3 < 0x80 || 0xC0 <= c3 { - return 0, 3 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c3), 4 - } - // Illegal rune - return 0, 1 -} - -// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. -// s must start with a full and valid UTF-8 encoded rune. -func (t *nfcTrie) lookupStringUnsafe(s string) uint16 { - c0 := s[0] - if c0 < 0x80 { // is ASCII - return nfcValues[c0] - } - i := nfcIndex[c0] - if c0 < 0xE0 { // 2-byte UTF-8 - return t.lookupValue(uint32(i), s[1]) - } - i = nfcIndex[uint32(i)<<6+uint32(s[1])] - if c0 < 0xF0 { // 3-byte UTF-8 - return t.lookupValue(uint32(i), s[2]) - } - i = nfcIndex[uint32(i)<<6+uint32(s[2])] - if c0 < 0xF8 { // 4-byte UTF-8 - return t.lookupValue(uint32(i), s[3]) - } - return 0 -} - -// nfcTrie. Total size: 10332 bytes (10.09 KiB). Checksum: 51cc525b297fc970. -type nfcTrie struct{} - -func newNfcTrie(i int) *nfcTrie { - return &nfcTrie{} -} - -// lookupValue determines the type of block n and looks up the value for b. -func (t *nfcTrie) lookupValue(n uint32, b byte) uint16 { - switch { - case n < 44: - return uint16(nfcValues[n<<6+uint32(b)]) - default: - n -= 44 - return uint16(nfcSparse.lookup(n, b)) - } -} - -// nfcValues: 46 blocks, 2944 entries, 5888 bytes -// The third block is the zero block. -var nfcValues = [2944]uint16{ - // Block 0x0, offset 0x0 - 0x3c: 0xa000, 0x3d: 0xa000, 0x3e: 0xa000, - // Block 0x1, offset 0x40 - 0x41: 0xa000, 0x42: 0xa000, 0x43: 0xa000, 0x44: 0xa000, 0x45: 0xa000, - 0x46: 0xa000, 0x47: 0xa000, 0x48: 0xa000, 0x49: 0xa000, 0x4a: 0xa000, 0x4b: 0xa000, - 0x4c: 0xa000, 0x4d: 0xa000, 0x4e: 0xa000, 0x4f: 0xa000, 0x50: 0xa000, - 0x52: 0xa000, 0x53: 0xa000, 0x54: 0xa000, 0x55: 0xa000, 0x56: 0xa000, 0x57: 0xa000, - 0x58: 0xa000, 0x59: 0xa000, 0x5a: 0xa000, - 0x61: 0xa000, 0x62: 0xa000, 0x63: 0xa000, - 0x64: 0xa000, 0x65: 0xa000, 0x66: 0xa000, 0x67: 0xa000, 0x68: 0xa000, 0x69: 0xa000, - 0x6a: 0xa000, 0x6b: 0xa000, 0x6c: 0xa000, 0x6d: 0xa000, 0x6e: 0xa000, 0x6f: 0xa000, - 0x70: 0xa000, 0x72: 0xa000, 0x73: 0xa000, 0x74: 0xa000, 0x75: 0xa000, - 0x76: 0xa000, 0x77: 0xa000, 0x78: 0xa000, 0x79: 0xa000, 0x7a: 0xa000, - // Block 0x2, offset 0x80 - // Block 0x3, offset 0xc0 - 0xc0: 0x2f6f, 0xc1: 0x2f74, 0xc2: 0x4688, 0xc3: 0x2f79, 0xc4: 0x4697, 0xc5: 0x469c, - 0xc6: 0xa000, 0xc7: 0x46a6, 0xc8: 0x2fe2, 0xc9: 0x2fe7, 0xca: 0x46ab, 0xcb: 0x2ffb, - 0xcc: 0x306e, 0xcd: 0x3073, 0xce: 0x3078, 0xcf: 0x46bf, 0xd1: 0x3104, - 0xd2: 0x3127, 0xd3: 0x312c, 0xd4: 0x46c9, 0xd5: 0x46ce, 0xd6: 0x46dd, - 0xd8: 0xa000, 0xd9: 0x31b3, 0xda: 0x31b8, 0xdb: 0x31bd, 0xdc: 0x470f, 0xdd: 0x3235, - 0xe0: 0x327b, 0xe1: 0x3280, 0xe2: 0x4719, 0xe3: 0x3285, - 0xe4: 0x4728, 0xe5: 0x472d, 0xe6: 0xa000, 0xe7: 0x4737, 0xe8: 0x32ee, 0xe9: 0x32f3, - 0xea: 0x473c, 0xeb: 0x3307, 0xec: 0x337f, 0xed: 0x3384, 0xee: 0x3389, 0xef: 0x4750, - 0xf1: 0x3415, 0xf2: 0x3438, 0xf3: 0x343d, 0xf4: 0x475a, 0xf5: 0x475f, - 0xf6: 0x476e, 0xf8: 0xa000, 0xf9: 0x34c9, 0xfa: 0x34ce, 0xfb: 0x34d3, - 0xfc: 0x47a0, 0xfd: 0x3550, 0xff: 0x3569, - // Block 0x4, offset 0x100 - 0x100: 0x2f7e, 0x101: 0x328a, 0x102: 0x468d, 0x103: 0x471e, 0x104: 0x2f9c, 0x105: 0x32a8, - 0x106: 0x2fb0, 0x107: 0x32bc, 0x108: 0x2fb5, 0x109: 0x32c1, 0x10a: 0x2fba, 0x10b: 0x32c6, - 0x10c: 0x2fbf, 0x10d: 0x32cb, 0x10e: 0x2fc9, 0x10f: 0x32d5, - 0x112: 0x46b0, 0x113: 0x4741, 0x114: 0x2ff1, 0x115: 0x32fd, 0x116: 0x2ff6, 0x117: 0x3302, - 0x118: 0x3014, 0x119: 0x3320, 0x11a: 0x3005, 0x11b: 0x3311, 0x11c: 0x302d, 0x11d: 0x3339, - 0x11e: 0x3037, 0x11f: 0x3343, 0x120: 0x303c, 0x121: 0x3348, 0x122: 0x3046, 0x123: 0x3352, - 0x124: 0x304b, 0x125: 0x3357, 0x128: 0x307d, 0x129: 0x338e, - 0x12a: 0x3082, 0x12b: 0x3393, 0x12c: 0x3087, 0x12d: 0x3398, 0x12e: 0x30aa, 0x12f: 0x33b6, - 0x130: 0x308c, 0x134: 0x30b4, 0x135: 0x33c0, - 0x136: 0x30c8, 0x137: 0x33d9, 0x139: 0x30d2, 0x13a: 0x33e3, 0x13b: 0x30dc, - 0x13c: 0x33ed, 0x13d: 0x30d7, 0x13e: 0x33e8, - // Block 0x5, offset 0x140 - 0x143: 0x30ff, 0x144: 0x3410, 0x145: 0x3118, - 0x146: 0x3429, 0x147: 0x310e, 0x148: 0x341f, - 0x14c: 0x46d3, 0x14d: 0x4764, 0x14e: 0x3131, 0x14f: 0x3442, 0x150: 0x313b, 0x151: 0x344c, - 0x154: 0x3159, 0x155: 0x346a, 0x156: 0x3172, 0x157: 0x3483, - 0x158: 0x3163, 0x159: 0x3474, 0x15a: 0x46f6, 0x15b: 0x4787, 0x15c: 0x317c, 0x15d: 0x348d, - 0x15e: 0x318b, 0x15f: 0x349c, 0x160: 0x46fb, 0x161: 0x478c, 0x162: 0x31a4, 0x163: 0x34ba, - 0x164: 0x3195, 0x165: 0x34ab, 0x168: 0x4705, 0x169: 0x4796, - 0x16a: 0x470a, 0x16b: 0x479b, 0x16c: 0x31c2, 0x16d: 0x34d8, 0x16e: 0x31cc, 0x16f: 0x34e2, - 0x170: 0x31d1, 0x171: 0x34e7, 0x172: 0x31ef, 0x173: 0x3505, 0x174: 0x3212, 0x175: 0x3528, - 0x176: 0x323a, 0x177: 0x3555, 0x178: 0x324e, 0x179: 0x325d, 0x17a: 0x357d, 0x17b: 0x3267, - 0x17c: 0x3587, 0x17d: 0x326c, 0x17e: 0x358c, 0x17f: 0xa000, - // Block 0x6, offset 0x180 - 0x184: 0x8100, 0x185: 0x8100, - 0x186: 0x8100, - 0x18d: 0x2f88, 0x18e: 0x3294, 0x18f: 0x3096, 0x190: 0x33a2, 0x191: 0x3140, - 0x192: 0x3451, 0x193: 0x31d6, 0x194: 0x34ec, 0x195: 0x39cf, 0x196: 0x3b5e, 0x197: 0x39c8, - 0x198: 0x3b57, 0x199: 0x39d6, 0x19a: 0x3b65, 0x19b: 0x39c1, 0x19c: 0x3b50, - 0x19e: 0x38b0, 0x19f: 0x3a3f, 0x1a0: 0x38a9, 0x1a1: 0x3a38, 0x1a2: 0x35b3, 0x1a3: 0x35c5, - 0x1a6: 0x3041, 0x1a7: 0x334d, 0x1a8: 0x30be, 0x1a9: 0x33cf, - 0x1aa: 0x46ec, 0x1ab: 0x477d, 0x1ac: 0x3990, 0x1ad: 0x3b1f, 0x1ae: 0x35d7, 0x1af: 0x35dd, - 0x1b0: 0x33c5, 0x1b4: 0x3028, 0x1b5: 0x3334, - 0x1b8: 0x30fa, 0x1b9: 0x340b, 0x1ba: 0x38b7, 0x1bb: 0x3a46, - 0x1bc: 0x35ad, 0x1bd: 0x35bf, 0x1be: 0x35b9, 0x1bf: 0x35cb, - // Block 0x7, offset 0x1c0 - 0x1c0: 0x2f8d, 0x1c1: 0x3299, 0x1c2: 0x2f92, 0x1c3: 0x329e, 0x1c4: 0x300a, 0x1c5: 0x3316, - 0x1c6: 0x300f, 0x1c7: 0x331b, 0x1c8: 0x309b, 0x1c9: 0x33a7, 0x1ca: 0x30a0, 0x1cb: 0x33ac, - 0x1cc: 0x3145, 0x1cd: 0x3456, 0x1ce: 0x314a, 0x1cf: 0x345b, 0x1d0: 0x3168, 0x1d1: 0x3479, - 0x1d2: 0x316d, 0x1d3: 0x347e, 0x1d4: 0x31db, 0x1d5: 0x34f1, 0x1d6: 0x31e0, 0x1d7: 0x34f6, - 0x1d8: 0x3186, 0x1d9: 0x3497, 0x1da: 0x319f, 0x1db: 0x34b5, - 0x1de: 0x305a, 0x1df: 0x3366, - 0x1e6: 0x4692, 0x1e7: 0x4723, 0x1e8: 0x46ba, 0x1e9: 0x474b, - 0x1ea: 0x395f, 0x1eb: 0x3aee, 0x1ec: 0x393c, 0x1ed: 0x3acb, 0x1ee: 0x46d8, 0x1ef: 0x4769, - 0x1f0: 0x3958, 0x1f1: 0x3ae7, 0x1f2: 0x3244, 0x1f3: 0x355f, - // Block 0x8, offset 0x200 - 0x200: 0x9932, 0x201: 0x9932, 0x202: 0x9932, 0x203: 0x9932, 0x204: 0x9932, 0x205: 0x8132, - 0x206: 0x9932, 0x207: 0x9932, 0x208: 0x9932, 0x209: 0x9932, 0x20a: 0x9932, 0x20b: 0x9932, - 0x20c: 0x9932, 0x20d: 0x8132, 0x20e: 0x8132, 0x20f: 0x9932, 0x210: 0x8132, 0x211: 0x9932, - 0x212: 0x8132, 0x213: 0x9932, 0x214: 0x9932, 0x215: 0x8133, 0x216: 0x812d, 0x217: 0x812d, - 0x218: 0x812d, 0x219: 0x812d, 0x21a: 0x8133, 0x21b: 0x992b, 0x21c: 0x812d, 0x21d: 0x812d, - 0x21e: 0x812d, 0x21f: 0x812d, 0x220: 0x812d, 0x221: 0x8129, 0x222: 0x8129, 0x223: 0x992d, - 0x224: 0x992d, 0x225: 0x992d, 0x226: 0x992d, 0x227: 0x9929, 0x228: 0x9929, 0x229: 0x812d, - 0x22a: 0x812d, 0x22b: 0x812d, 0x22c: 0x812d, 0x22d: 0x992d, 0x22e: 0x992d, 0x22f: 0x812d, - 0x230: 0x992d, 0x231: 0x992d, 0x232: 0x812d, 0x233: 0x812d, 0x234: 0x8101, 0x235: 0x8101, - 0x236: 0x8101, 0x237: 0x8101, 0x238: 0x9901, 0x239: 0x812d, 0x23a: 0x812d, 0x23b: 0x812d, - 0x23c: 0x812d, 0x23d: 0x8132, 0x23e: 0x8132, 0x23f: 0x8132, - // Block 0x9, offset 0x240 - 0x240: 0x49ae, 0x241: 0x49b3, 0x242: 0x9932, 0x243: 0x49b8, 0x244: 0x4a71, 0x245: 0x9936, - 0x246: 0x8132, 0x247: 0x812d, 0x248: 0x812d, 0x249: 0x812d, 0x24a: 0x8132, 0x24b: 0x8132, - 0x24c: 0x8132, 0x24d: 0x812d, 0x24e: 0x812d, 0x250: 0x8132, 0x251: 0x8132, - 0x252: 0x8132, 0x253: 0x812d, 0x254: 0x812d, 0x255: 0x812d, 0x256: 0x812d, 0x257: 0x8132, - 0x258: 0x8133, 0x259: 0x812d, 0x25a: 0x812d, 0x25b: 0x8132, 0x25c: 0x8134, 0x25d: 0x8135, - 0x25e: 0x8135, 0x25f: 0x8134, 0x260: 0x8135, 0x261: 0x8135, 0x262: 0x8134, 0x263: 0x8132, - 0x264: 0x8132, 0x265: 0x8132, 0x266: 0x8132, 0x267: 0x8132, 0x268: 0x8132, 0x269: 0x8132, - 0x26a: 0x8132, 0x26b: 0x8132, 0x26c: 0x8132, 0x26d: 0x8132, 0x26e: 0x8132, 0x26f: 0x8132, - 0x274: 0x0170, - 0x27a: 0x8100, - 0x27e: 0x0037, - // Block 0xa, offset 0x280 - 0x284: 0x8100, 0x285: 0x35a1, - 0x286: 0x35e9, 0x287: 0x00ce, 0x288: 0x3607, 0x289: 0x3613, 0x28a: 0x3625, - 0x28c: 0x3643, 0x28e: 0x3655, 0x28f: 0x3673, 0x290: 0x3e08, 0x291: 0xa000, - 0x295: 0xa000, 0x297: 0xa000, - 0x299: 0xa000, - 0x29f: 0xa000, 0x2a1: 0xa000, - 0x2a5: 0xa000, 0x2a9: 0xa000, - 0x2aa: 0x3637, 0x2ab: 0x3667, 0x2ac: 0x47fe, 0x2ad: 0x3697, 0x2ae: 0x4828, 0x2af: 0x36a9, - 0x2b0: 0x3e70, 0x2b1: 0xa000, 0x2b5: 0xa000, - 0x2b7: 0xa000, 0x2b9: 0xa000, - 0x2bf: 0xa000, - // Block 0xb, offset 0x2c0 - 0x2c0: 0x3721, 0x2c1: 0x372d, 0x2c3: 0x371b, - 0x2c6: 0xa000, 0x2c7: 0x3709, - 0x2cc: 0x375d, 0x2cd: 0x3745, 0x2ce: 0x376f, 0x2d0: 0xa000, - 0x2d3: 0xa000, 0x2d5: 0xa000, 0x2d6: 0xa000, 0x2d7: 0xa000, - 0x2d8: 0xa000, 0x2d9: 0x3751, 0x2da: 0xa000, - 0x2de: 0xa000, 0x2e3: 0xa000, - 0x2e7: 0xa000, - 0x2eb: 0xa000, 0x2ed: 0xa000, - 0x2f0: 0xa000, 0x2f3: 0xa000, 0x2f5: 0xa000, - 0x2f6: 0xa000, 0x2f7: 0xa000, 0x2f8: 0xa000, 0x2f9: 0x37d5, 0x2fa: 0xa000, - 0x2fe: 0xa000, - // Block 0xc, offset 0x300 - 0x301: 0x3733, 0x302: 0x37b7, - 0x310: 0x370f, 0x311: 0x3793, - 0x312: 0x3715, 0x313: 0x3799, 0x316: 0x3727, 0x317: 0x37ab, - 0x318: 0xa000, 0x319: 0xa000, 0x31a: 0x3829, 0x31b: 0x382f, 0x31c: 0x3739, 0x31d: 0x37bd, - 0x31e: 0x373f, 0x31f: 0x37c3, 0x322: 0x374b, 0x323: 0x37cf, - 0x324: 0x3757, 0x325: 0x37db, 0x326: 0x3763, 0x327: 0x37e7, 0x328: 0xa000, 0x329: 0xa000, - 0x32a: 0x3835, 0x32b: 0x383b, 0x32c: 0x378d, 0x32d: 0x3811, 0x32e: 0x3769, 0x32f: 0x37ed, - 0x330: 0x3775, 0x331: 0x37f9, 0x332: 0x377b, 0x333: 0x37ff, 0x334: 0x3781, 0x335: 0x3805, - 0x338: 0x3787, 0x339: 0x380b, - // Block 0xd, offset 0x340 - 0x351: 0x812d, - 0x352: 0x8132, 0x353: 0x8132, 0x354: 0x8132, 0x355: 0x8132, 0x356: 0x812d, 0x357: 0x8132, - 0x358: 0x8132, 0x359: 0x8132, 0x35a: 0x812e, 0x35b: 0x812d, 0x35c: 0x8132, 0x35d: 0x8132, - 0x35e: 0x8132, 0x35f: 0x8132, 0x360: 0x8132, 0x361: 0x8132, 0x362: 0x812d, 0x363: 0x812d, - 0x364: 0x812d, 0x365: 0x812d, 0x366: 0x812d, 0x367: 0x812d, 0x368: 0x8132, 0x369: 0x8132, - 0x36a: 0x812d, 0x36b: 0x8132, 0x36c: 0x8132, 0x36d: 0x812e, 0x36e: 0x8131, 0x36f: 0x8132, - 0x370: 0x8105, 0x371: 0x8106, 0x372: 0x8107, 0x373: 0x8108, 0x374: 0x8109, 0x375: 0x810a, - 0x376: 0x810b, 0x377: 0x810c, 0x378: 0x810d, 0x379: 0x810e, 0x37a: 0x810e, 0x37b: 0x810f, - 0x37c: 0x8110, 0x37d: 0x8111, 0x37f: 0x8112, - // Block 0xe, offset 0x380 - 0x388: 0xa000, 0x38a: 0xa000, 0x38b: 0x8116, - 0x38c: 0x8117, 0x38d: 0x8118, 0x38e: 0x8119, 0x38f: 0x811a, 0x390: 0x811b, 0x391: 0x811c, - 0x392: 0x811d, 0x393: 0x9932, 0x394: 0x9932, 0x395: 0x992d, 0x396: 0x812d, 0x397: 0x8132, - 0x398: 0x8132, 0x399: 0x8132, 0x39a: 0x8132, 0x39b: 0x8132, 0x39c: 0x812d, 0x39d: 0x8132, - 0x39e: 0x8132, 0x39f: 0x812d, - 0x3b0: 0x811e, - // Block 0xf, offset 0x3c0 - 0x3c5: 0xa000, - 0x3c6: 0x2d26, 0x3c7: 0xa000, 0x3c8: 0x2d2e, 0x3c9: 0xa000, 0x3ca: 0x2d36, 0x3cb: 0xa000, - 0x3cc: 0x2d3e, 0x3cd: 0xa000, 0x3ce: 0x2d46, 0x3d1: 0xa000, - 0x3d2: 0x2d4e, - 0x3f4: 0x8102, 0x3f5: 0x9900, - 0x3fa: 0xa000, 0x3fb: 0x2d56, - 0x3fc: 0xa000, 0x3fd: 0x2d5e, 0x3fe: 0xa000, 0x3ff: 0xa000, - // Block 0x10, offset 0x400 - 0x400: 0x2f97, 0x401: 0x32a3, 0x402: 0x2fa1, 0x403: 0x32ad, 0x404: 0x2fa6, 0x405: 0x32b2, - 0x406: 0x2fab, 0x407: 0x32b7, 0x408: 0x38cc, 0x409: 0x3a5b, 0x40a: 0x2fc4, 0x40b: 0x32d0, - 0x40c: 0x2fce, 0x40d: 0x32da, 0x40e: 0x2fdd, 0x40f: 0x32e9, 0x410: 0x2fd3, 0x411: 0x32df, - 0x412: 0x2fd8, 0x413: 0x32e4, 0x414: 0x38ef, 0x415: 0x3a7e, 0x416: 0x38f6, 0x417: 0x3a85, - 0x418: 0x3019, 0x419: 0x3325, 0x41a: 0x301e, 0x41b: 0x332a, 0x41c: 0x3904, 0x41d: 0x3a93, - 0x41e: 0x3023, 0x41f: 0x332f, 0x420: 0x3032, 0x421: 0x333e, 0x422: 0x3050, 0x423: 0x335c, - 0x424: 0x305f, 0x425: 0x336b, 0x426: 0x3055, 0x427: 0x3361, 0x428: 0x3064, 0x429: 0x3370, - 0x42a: 0x3069, 0x42b: 0x3375, 0x42c: 0x30af, 0x42d: 0x33bb, 0x42e: 0x390b, 0x42f: 0x3a9a, - 0x430: 0x30b9, 0x431: 0x33ca, 0x432: 0x30c3, 0x433: 0x33d4, 0x434: 0x30cd, 0x435: 0x33de, - 0x436: 0x46c4, 0x437: 0x4755, 0x438: 0x3912, 0x439: 0x3aa1, 0x43a: 0x30e6, 0x43b: 0x33f7, - 0x43c: 0x30e1, 0x43d: 0x33f2, 0x43e: 0x30eb, 0x43f: 0x33fc, - // Block 0x11, offset 0x440 - 0x440: 0x30f0, 0x441: 0x3401, 0x442: 0x30f5, 0x443: 0x3406, 0x444: 0x3109, 0x445: 0x341a, - 0x446: 0x3113, 0x447: 0x3424, 0x448: 0x3122, 0x449: 0x3433, 0x44a: 0x311d, 0x44b: 0x342e, - 0x44c: 0x3935, 0x44d: 0x3ac4, 0x44e: 0x3943, 0x44f: 0x3ad2, 0x450: 0x394a, 0x451: 0x3ad9, - 0x452: 0x3951, 0x453: 0x3ae0, 0x454: 0x314f, 0x455: 0x3460, 0x456: 0x3154, 0x457: 0x3465, - 0x458: 0x315e, 0x459: 0x346f, 0x45a: 0x46f1, 0x45b: 0x4782, 0x45c: 0x3997, 0x45d: 0x3b26, - 0x45e: 0x3177, 0x45f: 0x3488, 0x460: 0x3181, 0x461: 0x3492, 0x462: 0x4700, 0x463: 0x4791, - 0x464: 0x399e, 0x465: 0x3b2d, 0x466: 0x39a5, 0x467: 0x3b34, 0x468: 0x39ac, 0x469: 0x3b3b, - 0x46a: 0x3190, 0x46b: 0x34a1, 0x46c: 0x319a, 0x46d: 0x34b0, 0x46e: 0x31ae, 0x46f: 0x34c4, - 0x470: 0x31a9, 0x471: 0x34bf, 0x472: 0x31ea, 0x473: 0x3500, 0x474: 0x31f9, 0x475: 0x350f, - 0x476: 0x31f4, 0x477: 0x350a, 0x478: 0x39b3, 0x479: 0x3b42, 0x47a: 0x39ba, 0x47b: 0x3b49, - 0x47c: 0x31fe, 0x47d: 0x3514, 0x47e: 0x3203, 0x47f: 0x3519, - // Block 0x12, offset 0x480 - 0x480: 0x3208, 0x481: 0x351e, 0x482: 0x320d, 0x483: 0x3523, 0x484: 0x321c, 0x485: 0x3532, - 0x486: 0x3217, 0x487: 0x352d, 0x488: 0x3221, 0x489: 0x353c, 0x48a: 0x3226, 0x48b: 0x3541, - 0x48c: 0x322b, 0x48d: 0x3546, 0x48e: 0x3249, 0x48f: 0x3564, 0x490: 0x3262, 0x491: 0x3582, - 0x492: 0x3271, 0x493: 0x3591, 0x494: 0x3276, 0x495: 0x3596, 0x496: 0x337a, 0x497: 0x34a6, - 0x498: 0x3537, 0x499: 0x3573, 0x49b: 0x35d1, - 0x4a0: 0x46a1, 0x4a1: 0x4732, 0x4a2: 0x2f83, 0x4a3: 0x328f, - 0x4a4: 0x3878, 0x4a5: 0x3a07, 0x4a6: 0x3871, 0x4a7: 0x3a00, 0x4a8: 0x3886, 0x4a9: 0x3a15, - 0x4aa: 0x387f, 0x4ab: 0x3a0e, 0x4ac: 0x38be, 0x4ad: 0x3a4d, 0x4ae: 0x3894, 0x4af: 0x3a23, - 0x4b0: 0x388d, 0x4b1: 0x3a1c, 0x4b2: 0x38a2, 0x4b3: 0x3a31, 0x4b4: 0x389b, 0x4b5: 0x3a2a, - 0x4b6: 0x38c5, 0x4b7: 0x3a54, 0x4b8: 0x46b5, 0x4b9: 0x4746, 0x4ba: 0x3000, 0x4bb: 0x330c, - 0x4bc: 0x2fec, 0x4bd: 0x32f8, 0x4be: 0x38da, 0x4bf: 0x3a69, - // Block 0x13, offset 0x4c0 - 0x4c0: 0x38d3, 0x4c1: 0x3a62, 0x4c2: 0x38e8, 0x4c3: 0x3a77, 0x4c4: 0x38e1, 0x4c5: 0x3a70, - 0x4c6: 0x38fd, 0x4c7: 0x3a8c, 0x4c8: 0x3091, 0x4c9: 0x339d, 0x4ca: 0x30a5, 0x4cb: 0x33b1, - 0x4cc: 0x46e7, 0x4cd: 0x4778, 0x4ce: 0x3136, 0x4cf: 0x3447, 0x4d0: 0x3920, 0x4d1: 0x3aaf, - 0x4d2: 0x3919, 0x4d3: 0x3aa8, 0x4d4: 0x392e, 0x4d5: 0x3abd, 0x4d6: 0x3927, 0x4d7: 0x3ab6, - 0x4d8: 0x3989, 0x4d9: 0x3b18, 0x4da: 0x396d, 0x4db: 0x3afc, 0x4dc: 0x3966, 0x4dd: 0x3af5, - 0x4de: 0x397b, 0x4df: 0x3b0a, 0x4e0: 0x3974, 0x4e1: 0x3b03, 0x4e2: 0x3982, 0x4e3: 0x3b11, - 0x4e4: 0x31e5, 0x4e5: 0x34fb, 0x4e6: 0x31c7, 0x4e7: 0x34dd, 0x4e8: 0x39e4, 0x4e9: 0x3b73, - 0x4ea: 0x39dd, 0x4eb: 0x3b6c, 0x4ec: 0x39f2, 0x4ed: 0x3b81, 0x4ee: 0x39eb, 0x4ef: 0x3b7a, - 0x4f0: 0x39f9, 0x4f1: 0x3b88, 0x4f2: 0x3230, 0x4f3: 0x354b, 0x4f4: 0x3258, 0x4f5: 0x3578, - 0x4f6: 0x3253, 0x4f7: 0x356e, 0x4f8: 0x323f, 0x4f9: 0x355a, - // Block 0x14, offset 0x500 - 0x500: 0x4804, 0x501: 0x480a, 0x502: 0x491e, 0x503: 0x4936, 0x504: 0x4926, 0x505: 0x493e, - 0x506: 0x492e, 0x507: 0x4946, 0x508: 0x47aa, 0x509: 0x47b0, 0x50a: 0x488e, 0x50b: 0x48a6, - 0x50c: 0x4896, 0x50d: 0x48ae, 0x50e: 0x489e, 0x50f: 0x48b6, 0x510: 0x4816, 0x511: 0x481c, - 0x512: 0x3db8, 0x513: 0x3dc8, 0x514: 0x3dc0, 0x515: 0x3dd0, - 0x518: 0x47b6, 0x519: 0x47bc, 0x51a: 0x3ce8, 0x51b: 0x3cf8, 0x51c: 0x3cf0, 0x51d: 0x3d00, - 0x520: 0x482e, 0x521: 0x4834, 0x522: 0x494e, 0x523: 0x4966, - 0x524: 0x4956, 0x525: 0x496e, 0x526: 0x495e, 0x527: 0x4976, 0x528: 0x47c2, 0x529: 0x47c8, - 0x52a: 0x48be, 0x52b: 0x48d6, 0x52c: 0x48c6, 0x52d: 0x48de, 0x52e: 0x48ce, 0x52f: 0x48e6, - 0x530: 0x4846, 0x531: 0x484c, 0x532: 0x3e18, 0x533: 0x3e30, 0x534: 0x3e20, 0x535: 0x3e38, - 0x536: 0x3e28, 0x537: 0x3e40, 0x538: 0x47ce, 0x539: 0x47d4, 0x53a: 0x3d18, 0x53b: 0x3d30, - 0x53c: 0x3d20, 0x53d: 0x3d38, 0x53e: 0x3d28, 0x53f: 0x3d40, - // Block 0x15, offset 0x540 - 0x540: 0x4852, 0x541: 0x4858, 0x542: 0x3e48, 0x543: 0x3e58, 0x544: 0x3e50, 0x545: 0x3e60, - 0x548: 0x47da, 0x549: 0x47e0, 0x54a: 0x3d48, 0x54b: 0x3d58, - 0x54c: 0x3d50, 0x54d: 0x3d60, 0x550: 0x4864, 0x551: 0x486a, - 0x552: 0x3e80, 0x553: 0x3e98, 0x554: 0x3e88, 0x555: 0x3ea0, 0x556: 0x3e90, 0x557: 0x3ea8, - 0x559: 0x47e6, 0x55b: 0x3d68, 0x55d: 0x3d70, - 0x55f: 0x3d78, 0x560: 0x487c, 0x561: 0x4882, 0x562: 0x497e, 0x563: 0x4996, - 0x564: 0x4986, 0x565: 0x499e, 0x566: 0x498e, 0x567: 0x49a6, 0x568: 0x47ec, 0x569: 0x47f2, - 0x56a: 0x48ee, 0x56b: 0x4906, 0x56c: 0x48f6, 0x56d: 0x490e, 0x56e: 0x48fe, 0x56f: 0x4916, - 0x570: 0x47f8, 0x571: 0x431e, 0x572: 0x3691, 0x573: 0x4324, 0x574: 0x4822, 0x575: 0x432a, - 0x576: 0x36a3, 0x577: 0x4330, 0x578: 0x36c1, 0x579: 0x4336, 0x57a: 0x36d9, 0x57b: 0x433c, - 0x57c: 0x4870, 0x57d: 0x4342, - // Block 0x16, offset 0x580 - 0x580: 0x3da0, 0x581: 0x3da8, 0x582: 0x4184, 0x583: 0x41a2, 0x584: 0x418e, 0x585: 0x41ac, - 0x586: 0x4198, 0x587: 0x41b6, 0x588: 0x3cd8, 0x589: 0x3ce0, 0x58a: 0x40d0, 0x58b: 0x40ee, - 0x58c: 0x40da, 0x58d: 0x40f8, 0x58e: 0x40e4, 0x58f: 0x4102, 0x590: 0x3de8, 0x591: 0x3df0, - 0x592: 0x41c0, 0x593: 0x41de, 0x594: 0x41ca, 0x595: 0x41e8, 0x596: 0x41d4, 0x597: 0x41f2, - 0x598: 0x3d08, 0x599: 0x3d10, 0x59a: 0x410c, 0x59b: 0x412a, 0x59c: 0x4116, 0x59d: 0x4134, - 0x59e: 0x4120, 0x59f: 0x413e, 0x5a0: 0x3ec0, 0x5a1: 0x3ec8, 0x5a2: 0x41fc, 0x5a3: 0x421a, - 0x5a4: 0x4206, 0x5a5: 0x4224, 0x5a6: 0x4210, 0x5a7: 0x422e, 0x5a8: 0x3d80, 0x5a9: 0x3d88, - 0x5aa: 0x4148, 0x5ab: 0x4166, 0x5ac: 0x4152, 0x5ad: 0x4170, 0x5ae: 0x415c, 0x5af: 0x417a, - 0x5b0: 0x3685, 0x5b1: 0x367f, 0x5b2: 0x3d90, 0x5b3: 0x368b, 0x5b4: 0x3d98, - 0x5b6: 0x4810, 0x5b7: 0x3db0, 0x5b8: 0x35f5, 0x5b9: 0x35ef, 0x5ba: 0x35e3, 0x5bb: 0x42ee, - 0x5bc: 0x35fb, 0x5bd: 0x8100, 0x5be: 0x01d3, 0x5bf: 0xa100, - // Block 0x17, offset 0x5c0 - 0x5c0: 0x8100, 0x5c1: 0x35a7, 0x5c2: 0x3dd8, 0x5c3: 0x369d, 0x5c4: 0x3de0, - 0x5c6: 0x483a, 0x5c7: 0x3df8, 0x5c8: 0x3601, 0x5c9: 0x42f4, 0x5ca: 0x360d, 0x5cb: 0x42fa, - 0x5cc: 0x3619, 0x5cd: 0x3b8f, 0x5ce: 0x3b96, 0x5cf: 0x3b9d, 0x5d0: 0x36b5, 0x5d1: 0x36af, - 0x5d2: 0x3e00, 0x5d3: 0x44e4, 0x5d6: 0x36bb, 0x5d7: 0x3e10, - 0x5d8: 0x3631, 0x5d9: 0x362b, 0x5da: 0x361f, 0x5db: 0x4300, 0x5dd: 0x3ba4, - 0x5de: 0x3bab, 0x5df: 0x3bb2, 0x5e0: 0x36eb, 0x5e1: 0x36e5, 0x5e2: 0x3e68, 0x5e3: 0x44ec, - 0x5e4: 0x36cd, 0x5e5: 0x36d3, 0x5e6: 0x36f1, 0x5e7: 0x3e78, 0x5e8: 0x3661, 0x5e9: 0x365b, - 0x5ea: 0x364f, 0x5eb: 0x430c, 0x5ec: 0x3649, 0x5ed: 0x359b, 0x5ee: 0x42e8, 0x5ef: 0x0081, - 0x5f2: 0x3eb0, 0x5f3: 0x36f7, 0x5f4: 0x3eb8, - 0x5f6: 0x4888, 0x5f7: 0x3ed0, 0x5f8: 0x363d, 0x5f9: 0x4306, 0x5fa: 0x366d, 0x5fb: 0x4318, - 0x5fc: 0x3679, 0x5fd: 0x4256, 0x5fe: 0xa100, - // Block 0x18, offset 0x600 - 0x601: 0x3c06, 0x603: 0xa000, 0x604: 0x3c0d, 0x605: 0xa000, - 0x607: 0x3c14, 0x608: 0xa000, 0x609: 0x3c1b, - 0x60d: 0xa000, - 0x620: 0x2f65, 0x621: 0xa000, 0x622: 0x3c29, - 0x624: 0xa000, 0x625: 0xa000, - 0x62d: 0x3c22, 0x62e: 0x2f60, 0x62f: 0x2f6a, - 0x630: 0x3c30, 0x631: 0x3c37, 0x632: 0xa000, 0x633: 0xa000, 0x634: 0x3c3e, 0x635: 0x3c45, - 0x636: 0xa000, 0x637: 0xa000, 0x638: 0x3c4c, 0x639: 0x3c53, 0x63a: 0xa000, 0x63b: 0xa000, - 0x63c: 0xa000, 0x63d: 0xa000, - // Block 0x19, offset 0x640 - 0x640: 0x3c5a, 0x641: 0x3c61, 0x642: 0xa000, 0x643: 0xa000, 0x644: 0x3c76, 0x645: 0x3c7d, - 0x646: 0xa000, 0x647: 0xa000, 0x648: 0x3c84, 0x649: 0x3c8b, - 0x651: 0xa000, - 0x652: 0xa000, - 0x662: 0xa000, - 0x668: 0xa000, 0x669: 0xa000, - 0x66b: 0xa000, 0x66c: 0x3ca0, 0x66d: 0x3ca7, 0x66e: 0x3cae, 0x66f: 0x3cb5, - 0x672: 0xa000, 0x673: 0xa000, 0x674: 0xa000, 0x675: 0xa000, - // Block 0x1a, offset 0x680 - 0x686: 0xa000, 0x68b: 0xa000, - 0x68c: 0x3f08, 0x68d: 0xa000, 0x68e: 0x3f10, 0x68f: 0xa000, 0x690: 0x3f18, 0x691: 0xa000, - 0x692: 0x3f20, 0x693: 0xa000, 0x694: 0x3f28, 0x695: 0xa000, 0x696: 0x3f30, 0x697: 0xa000, - 0x698: 0x3f38, 0x699: 0xa000, 0x69a: 0x3f40, 0x69b: 0xa000, 0x69c: 0x3f48, 0x69d: 0xa000, - 0x69e: 0x3f50, 0x69f: 0xa000, 0x6a0: 0x3f58, 0x6a1: 0xa000, 0x6a2: 0x3f60, - 0x6a4: 0xa000, 0x6a5: 0x3f68, 0x6a6: 0xa000, 0x6a7: 0x3f70, 0x6a8: 0xa000, 0x6a9: 0x3f78, - 0x6af: 0xa000, - 0x6b0: 0x3f80, 0x6b1: 0x3f88, 0x6b2: 0xa000, 0x6b3: 0x3f90, 0x6b4: 0x3f98, 0x6b5: 0xa000, - 0x6b6: 0x3fa0, 0x6b7: 0x3fa8, 0x6b8: 0xa000, 0x6b9: 0x3fb0, 0x6ba: 0x3fb8, 0x6bb: 0xa000, - 0x6bc: 0x3fc0, 0x6bd: 0x3fc8, - // Block 0x1b, offset 0x6c0 - 0x6d4: 0x3f00, - 0x6d9: 0x9903, 0x6da: 0x9903, 0x6db: 0x8100, 0x6dc: 0x8100, 0x6dd: 0xa000, - 0x6de: 0x3fd0, - 0x6e6: 0xa000, - 0x6eb: 0xa000, 0x6ec: 0x3fe0, 0x6ed: 0xa000, 0x6ee: 0x3fe8, 0x6ef: 0xa000, - 0x6f0: 0x3ff0, 0x6f1: 0xa000, 0x6f2: 0x3ff8, 0x6f3: 0xa000, 0x6f4: 0x4000, 0x6f5: 0xa000, - 0x6f6: 0x4008, 0x6f7: 0xa000, 0x6f8: 0x4010, 0x6f9: 0xa000, 0x6fa: 0x4018, 0x6fb: 0xa000, - 0x6fc: 0x4020, 0x6fd: 0xa000, 0x6fe: 0x4028, 0x6ff: 0xa000, - // Block 0x1c, offset 0x700 - 0x700: 0x4030, 0x701: 0xa000, 0x702: 0x4038, 0x704: 0xa000, 0x705: 0x4040, - 0x706: 0xa000, 0x707: 0x4048, 0x708: 0xa000, 0x709: 0x4050, - 0x70f: 0xa000, 0x710: 0x4058, 0x711: 0x4060, - 0x712: 0xa000, 0x713: 0x4068, 0x714: 0x4070, 0x715: 0xa000, 0x716: 0x4078, 0x717: 0x4080, - 0x718: 0xa000, 0x719: 0x4088, 0x71a: 0x4090, 0x71b: 0xa000, 0x71c: 0x4098, 0x71d: 0x40a0, - 0x72f: 0xa000, - 0x730: 0xa000, 0x731: 0xa000, 0x732: 0xa000, 0x734: 0x3fd8, - 0x737: 0x40a8, 0x738: 0x40b0, 0x739: 0x40b8, 0x73a: 0x40c0, - 0x73d: 0xa000, 0x73e: 0x40c8, - // Block 0x1d, offset 0x740 - 0x740: 0x1377, 0x741: 0x0cfb, 0x742: 0x13d3, 0x743: 0x139f, 0x744: 0x0e57, 0x745: 0x06eb, - 0x746: 0x08df, 0x747: 0x162b, 0x748: 0x162b, 0x749: 0x0a0b, 0x74a: 0x145f, 0x74b: 0x0943, - 0x74c: 0x0a07, 0x74d: 0x0bef, 0x74e: 0x0fcf, 0x74f: 0x115f, 0x750: 0x1297, 0x751: 0x12d3, - 0x752: 0x1307, 0x753: 0x141b, 0x754: 0x0d73, 0x755: 0x0dff, 0x756: 0x0eab, 0x757: 0x0f43, - 0x758: 0x125f, 0x759: 0x1447, 0x75a: 0x1573, 0x75b: 0x070f, 0x75c: 0x08b3, 0x75d: 0x0d87, - 0x75e: 0x0ecf, 0x75f: 0x1293, 0x760: 0x15c3, 0x761: 0x0ab3, 0x762: 0x0e77, 0x763: 0x1283, - 0x764: 0x1317, 0x765: 0x0c23, 0x766: 0x11bb, 0x767: 0x12df, 0x768: 0x0b1f, 0x769: 0x0d0f, - 0x76a: 0x0e17, 0x76b: 0x0f1b, 0x76c: 0x1427, 0x76d: 0x074f, 0x76e: 0x07e7, 0x76f: 0x0853, - 0x770: 0x0c8b, 0x771: 0x0d7f, 0x772: 0x0ecb, 0x773: 0x0fef, 0x774: 0x1177, 0x775: 0x128b, - 0x776: 0x12a3, 0x777: 0x13c7, 0x778: 0x14ef, 0x779: 0x15a3, 0x77a: 0x15bf, 0x77b: 0x102b, - 0x77c: 0x106b, 0x77d: 0x1123, 0x77e: 0x1243, 0x77f: 0x147b, - // Block 0x1e, offset 0x780 - 0x780: 0x15cb, 0x781: 0x134b, 0x782: 0x09c7, 0x783: 0x0b3b, 0x784: 0x10db, 0x785: 0x119b, - 0x786: 0x0eff, 0x787: 0x1033, 0x788: 0x1397, 0x789: 0x14e7, 0x78a: 0x09c3, 0x78b: 0x0a8f, - 0x78c: 0x0d77, 0x78d: 0x0e2b, 0x78e: 0x0e5f, 0x78f: 0x1113, 0x790: 0x113b, 0x791: 0x14a7, - 0x792: 0x084f, 0x793: 0x11a7, 0x794: 0x07f3, 0x795: 0x07ef, 0x796: 0x1097, 0x797: 0x1127, - 0x798: 0x125b, 0x799: 0x14af, 0x79a: 0x1367, 0x79b: 0x0c27, 0x79c: 0x0d73, 0x79d: 0x1357, - 0x79e: 0x06f7, 0x79f: 0x0a63, 0x7a0: 0x0b93, 0x7a1: 0x0f2f, 0x7a2: 0x0faf, 0x7a3: 0x0873, - 0x7a4: 0x103b, 0x7a5: 0x075f, 0x7a6: 0x0b77, 0x7a7: 0x06d7, 0x7a8: 0x0deb, 0x7a9: 0x0ca3, - 0x7aa: 0x110f, 0x7ab: 0x08c7, 0x7ac: 0x09b3, 0x7ad: 0x0ffb, 0x7ae: 0x1263, 0x7af: 0x133b, - 0x7b0: 0x0db7, 0x7b1: 0x13f7, 0x7b2: 0x0de3, 0x7b3: 0x0c37, 0x7b4: 0x121b, 0x7b5: 0x0c57, - 0x7b6: 0x0fab, 0x7b7: 0x072b, 0x7b8: 0x07a7, 0x7b9: 0x07eb, 0x7ba: 0x0d53, 0x7bb: 0x10fb, - 0x7bc: 0x11f3, 0x7bd: 0x1347, 0x7be: 0x145b, 0x7bf: 0x085b, - // Block 0x1f, offset 0x7c0 - 0x7c0: 0x090f, 0x7c1: 0x0a17, 0x7c2: 0x0b2f, 0x7c3: 0x0cbf, 0x7c4: 0x0e7b, 0x7c5: 0x103f, - 0x7c6: 0x1497, 0x7c7: 0x157b, 0x7c8: 0x15cf, 0x7c9: 0x15e7, 0x7ca: 0x0837, 0x7cb: 0x0cf3, - 0x7cc: 0x0da3, 0x7cd: 0x13eb, 0x7ce: 0x0afb, 0x7cf: 0x0bd7, 0x7d0: 0x0bf3, 0x7d1: 0x0c83, - 0x7d2: 0x0e6b, 0x7d3: 0x0eb7, 0x7d4: 0x0f67, 0x7d5: 0x108b, 0x7d6: 0x112f, 0x7d7: 0x1193, - 0x7d8: 0x13db, 0x7d9: 0x126b, 0x7da: 0x1403, 0x7db: 0x147f, 0x7dc: 0x080f, 0x7dd: 0x083b, - 0x7de: 0x0923, 0x7df: 0x0ea7, 0x7e0: 0x12f3, 0x7e1: 0x133b, 0x7e2: 0x0b1b, 0x7e3: 0x0b8b, - 0x7e4: 0x0c4f, 0x7e5: 0x0daf, 0x7e6: 0x10d7, 0x7e7: 0x0f23, 0x7e8: 0x073b, 0x7e9: 0x097f, - 0x7ea: 0x0a63, 0x7eb: 0x0ac7, 0x7ec: 0x0b97, 0x7ed: 0x0f3f, 0x7ee: 0x0f5b, 0x7ef: 0x116b, - 0x7f0: 0x118b, 0x7f1: 0x1463, 0x7f2: 0x14e3, 0x7f3: 0x14f3, 0x7f4: 0x152f, 0x7f5: 0x0753, - 0x7f6: 0x107f, 0x7f7: 0x144f, 0x7f8: 0x14cb, 0x7f9: 0x0baf, 0x7fa: 0x0717, 0x7fb: 0x0777, - 0x7fc: 0x0a67, 0x7fd: 0x0a87, 0x7fe: 0x0caf, 0x7ff: 0x0d73, - // Block 0x20, offset 0x800 - 0x800: 0x0ec3, 0x801: 0x0fcb, 0x802: 0x1277, 0x803: 0x1417, 0x804: 0x1623, 0x805: 0x0ce3, - 0x806: 0x14a3, 0x807: 0x0833, 0x808: 0x0d2f, 0x809: 0x0d3b, 0x80a: 0x0e0f, 0x80b: 0x0e47, - 0x80c: 0x0f4b, 0x80d: 0x0fa7, 0x80e: 0x1027, 0x80f: 0x110b, 0x810: 0x153b, 0x811: 0x07af, - 0x812: 0x0c03, 0x813: 0x14b3, 0x814: 0x0767, 0x815: 0x0aab, 0x816: 0x0e2f, 0x817: 0x13df, - 0x818: 0x0b67, 0x819: 0x0bb7, 0x81a: 0x0d43, 0x81b: 0x0f2f, 0x81c: 0x14bb, 0x81d: 0x0817, - 0x81e: 0x08ff, 0x81f: 0x0a97, 0x820: 0x0cd3, 0x821: 0x0d1f, 0x822: 0x0d5f, 0x823: 0x0df3, - 0x824: 0x0f47, 0x825: 0x0fbb, 0x826: 0x1157, 0x827: 0x12f7, 0x828: 0x1303, 0x829: 0x1457, - 0x82a: 0x14d7, 0x82b: 0x0883, 0x82c: 0x0e4b, 0x82d: 0x0903, 0x82e: 0x0ec7, 0x82f: 0x0f6b, - 0x830: 0x1287, 0x831: 0x14bf, 0x832: 0x15ab, 0x833: 0x15d3, 0x834: 0x0d37, 0x835: 0x0e27, - 0x836: 0x11c3, 0x837: 0x10b7, 0x838: 0x10c3, 0x839: 0x10e7, 0x83a: 0x0f17, 0x83b: 0x0e9f, - 0x83c: 0x1363, 0x83d: 0x0733, 0x83e: 0x122b, 0x83f: 0x081b, - // Block 0x21, offset 0x840 - 0x840: 0x080b, 0x841: 0x0b0b, 0x842: 0x0c2b, 0x843: 0x10f3, 0x844: 0x0a53, 0x845: 0x0e03, - 0x846: 0x0cef, 0x847: 0x13e7, 0x848: 0x12e7, 0x849: 0x14ab, 0x84a: 0x1323, 0x84b: 0x0b27, - 0x84c: 0x0787, 0x84d: 0x095b, 0x850: 0x09af, - 0x852: 0x0cdf, 0x855: 0x07f7, 0x856: 0x0f1f, 0x857: 0x0fe3, - 0x858: 0x1047, 0x859: 0x1063, 0x85a: 0x1067, 0x85b: 0x107b, 0x85c: 0x14fb, 0x85d: 0x10eb, - 0x85e: 0x116f, 0x860: 0x128f, 0x862: 0x1353, - 0x865: 0x1407, 0x866: 0x1433, - 0x86a: 0x154f, 0x86b: 0x1553, 0x86c: 0x1557, 0x86d: 0x15bb, 0x86e: 0x142b, 0x86f: 0x14c7, - 0x870: 0x0757, 0x871: 0x077b, 0x872: 0x078f, 0x873: 0x084b, 0x874: 0x0857, 0x875: 0x0897, - 0x876: 0x094b, 0x877: 0x0967, 0x878: 0x096f, 0x879: 0x09ab, 0x87a: 0x09b7, 0x87b: 0x0a93, - 0x87c: 0x0a9b, 0x87d: 0x0ba3, 0x87e: 0x0bcb, 0x87f: 0x0bd3, - // Block 0x22, offset 0x880 - 0x880: 0x0beb, 0x881: 0x0c97, 0x882: 0x0cc7, 0x883: 0x0ce7, 0x884: 0x0d57, 0x885: 0x0e1b, - 0x886: 0x0e37, 0x887: 0x0e67, 0x888: 0x0ebb, 0x889: 0x0edb, 0x88a: 0x0f4f, 0x88b: 0x102f, - 0x88c: 0x104b, 0x88d: 0x1053, 0x88e: 0x104f, 0x88f: 0x1057, 0x890: 0x105b, 0x891: 0x105f, - 0x892: 0x1073, 0x893: 0x1077, 0x894: 0x109b, 0x895: 0x10af, 0x896: 0x10cb, 0x897: 0x112f, - 0x898: 0x1137, 0x899: 0x113f, 0x89a: 0x1153, 0x89b: 0x117b, 0x89c: 0x11cb, 0x89d: 0x11ff, - 0x89e: 0x11ff, 0x89f: 0x1267, 0x8a0: 0x130f, 0x8a1: 0x1327, 0x8a2: 0x135b, 0x8a3: 0x135f, - 0x8a4: 0x13a3, 0x8a5: 0x13a7, 0x8a6: 0x13ff, 0x8a7: 0x1407, 0x8a8: 0x14db, 0x8a9: 0x151f, - 0x8aa: 0x1537, 0x8ab: 0x0b9b, 0x8ac: 0x171e, 0x8ad: 0x11e3, - 0x8b0: 0x06df, 0x8b1: 0x07e3, 0x8b2: 0x07a3, 0x8b3: 0x074b, 0x8b4: 0x078b, 0x8b5: 0x07b7, - 0x8b6: 0x0847, 0x8b7: 0x0863, 0x8b8: 0x094b, 0x8b9: 0x0937, 0x8ba: 0x0947, 0x8bb: 0x0963, - 0x8bc: 0x09af, 0x8bd: 0x09bf, 0x8be: 0x0a03, 0x8bf: 0x0a0f, - // Block 0x23, offset 0x8c0 - 0x8c0: 0x0a2b, 0x8c1: 0x0a3b, 0x8c2: 0x0b23, 0x8c3: 0x0b2b, 0x8c4: 0x0b5b, 0x8c5: 0x0b7b, - 0x8c6: 0x0bab, 0x8c7: 0x0bc3, 0x8c8: 0x0bb3, 0x8c9: 0x0bd3, 0x8ca: 0x0bc7, 0x8cb: 0x0beb, - 0x8cc: 0x0c07, 0x8cd: 0x0c5f, 0x8ce: 0x0c6b, 0x8cf: 0x0c73, 0x8d0: 0x0c9b, 0x8d1: 0x0cdf, - 0x8d2: 0x0d0f, 0x8d3: 0x0d13, 0x8d4: 0x0d27, 0x8d5: 0x0da7, 0x8d6: 0x0db7, 0x8d7: 0x0e0f, - 0x8d8: 0x0e5b, 0x8d9: 0x0e53, 0x8da: 0x0e67, 0x8db: 0x0e83, 0x8dc: 0x0ebb, 0x8dd: 0x1013, - 0x8de: 0x0edf, 0x8df: 0x0f13, 0x8e0: 0x0f1f, 0x8e1: 0x0f5f, 0x8e2: 0x0f7b, 0x8e3: 0x0f9f, - 0x8e4: 0x0fc3, 0x8e5: 0x0fc7, 0x8e6: 0x0fe3, 0x8e7: 0x0fe7, 0x8e8: 0x0ff7, 0x8e9: 0x100b, - 0x8ea: 0x1007, 0x8eb: 0x1037, 0x8ec: 0x10b3, 0x8ed: 0x10cb, 0x8ee: 0x10e3, 0x8ef: 0x111b, - 0x8f0: 0x112f, 0x8f1: 0x114b, 0x8f2: 0x117b, 0x8f3: 0x122f, 0x8f4: 0x1257, 0x8f5: 0x12cb, - 0x8f6: 0x1313, 0x8f7: 0x131f, 0x8f8: 0x1327, 0x8f9: 0x133f, 0x8fa: 0x1353, 0x8fb: 0x1343, - 0x8fc: 0x135b, 0x8fd: 0x1357, 0x8fe: 0x134f, 0x8ff: 0x135f, - // Block 0x24, offset 0x900 - 0x900: 0x136b, 0x901: 0x13a7, 0x902: 0x13e3, 0x903: 0x1413, 0x904: 0x144b, 0x905: 0x146b, - 0x906: 0x14b7, 0x907: 0x14db, 0x908: 0x14fb, 0x909: 0x150f, 0x90a: 0x151f, 0x90b: 0x152b, - 0x90c: 0x1537, 0x90d: 0x158b, 0x90e: 0x162b, 0x90f: 0x16b5, 0x910: 0x16b0, 0x911: 0x16e2, - 0x912: 0x0607, 0x913: 0x062f, 0x914: 0x0633, 0x915: 0x1764, 0x916: 0x1791, 0x917: 0x1809, - 0x918: 0x1617, 0x919: 0x1627, - // Block 0x25, offset 0x940 - 0x940: 0x06fb, 0x941: 0x06f3, 0x942: 0x0703, 0x943: 0x1647, 0x944: 0x0747, 0x945: 0x0757, - 0x946: 0x075b, 0x947: 0x0763, 0x948: 0x076b, 0x949: 0x076f, 0x94a: 0x077b, 0x94b: 0x0773, - 0x94c: 0x05b3, 0x94d: 0x165b, 0x94e: 0x078f, 0x94f: 0x0793, 0x950: 0x0797, 0x951: 0x07b3, - 0x952: 0x164c, 0x953: 0x05b7, 0x954: 0x079f, 0x955: 0x07bf, 0x956: 0x1656, 0x957: 0x07cf, - 0x958: 0x07d7, 0x959: 0x0737, 0x95a: 0x07df, 0x95b: 0x07e3, 0x95c: 0x1831, 0x95d: 0x07ff, - 0x95e: 0x0807, 0x95f: 0x05bf, 0x960: 0x081f, 0x961: 0x0823, 0x962: 0x082b, 0x963: 0x082f, - 0x964: 0x05c3, 0x965: 0x0847, 0x966: 0x084b, 0x967: 0x0857, 0x968: 0x0863, 0x969: 0x0867, - 0x96a: 0x086b, 0x96b: 0x0873, 0x96c: 0x0893, 0x96d: 0x0897, 0x96e: 0x089f, 0x96f: 0x08af, - 0x970: 0x08b7, 0x971: 0x08bb, 0x972: 0x08bb, 0x973: 0x08bb, 0x974: 0x166a, 0x975: 0x0e93, - 0x976: 0x08cf, 0x977: 0x08d7, 0x978: 0x166f, 0x979: 0x08e3, 0x97a: 0x08eb, 0x97b: 0x08f3, - 0x97c: 0x091b, 0x97d: 0x0907, 0x97e: 0x0913, 0x97f: 0x0917, - // Block 0x26, offset 0x980 - 0x980: 0x091f, 0x981: 0x0927, 0x982: 0x092b, 0x983: 0x0933, 0x984: 0x093b, 0x985: 0x093f, - 0x986: 0x093f, 0x987: 0x0947, 0x988: 0x094f, 0x989: 0x0953, 0x98a: 0x095f, 0x98b: 0x0983, - 0x98c: 0x0967, 0x98d: 0x0987, 0x98e: 0x096b, 0x98f: 0x0973, 0x990: 0x080b, 0x991: 0x09cf, - 0x992: 0x0997, 0x993: 0x099b, 0x994: 0x099f, 0x995: 0x0993, 0x996: 0x09a7, 0x997: 0x09a3, - 0x998: 0x09bb, 0x999: 0x1674, 0x99a: 0x09d7, 0x99b: 0x09db, 0x99c: 0x09e3, 0x99d: 0x09ef, - 0x99e: 0x09f7, 0x99f: 0x0a13, 0x9a0: 0x1679, 0x9a1: 0x167e, 0x9a2: 0x0a1f, 0x9a3: 0x0a23, - 0x9a4: 0x0a27, 0x9a5: 0x0a1b, 0x9a6: 0x0a2f, 0x9a7: 0x05c7, 0x9a8: 0x05cb, 0x9a9: 0x0a37, - 0x9aa: 0x0a3f, 0x9ab: 0x0a3f, 0x9ac: 0x1683, 0x9ad: 0x0a5b, 0x9ae: 0x0a5f, 0x9af: 0x0a63, - 0x9b0: 0x0a6b, 0x9b1: 0x1688, 0x9b2: 0x0a73, 0x9b3: 0x0a77, 0x9b4: 0x0b4f, 0x9b5: 0x0a7f, - 0x9b6: 0x05cf, 0x9b7: 0x0a8b, 0x9b8: 0x0a9b, 0x9b9: 0x0aa7, 0x9ba: 0x0aa3, 0x9bb: 0x1692, - 0x9bc: 0x0aaf, 0x9bd: 0x1697, 0x9be: 0x0abb, 0x9bf: 0x0ab7, - // Block 0x27, offset 0x9c0 - 0x9c0: 0x0abf, 0x9c1: 0x0acf, 0x9c2: 0x0ad3, 0x9c3: 0x05d3, 0x9c4: 0x0ae3, 0x9c5: 0x0aeb, - 0x9c6: 0x0aef, 0x9c7: 0x0af3, 0x9c8: 0x05d7, 0x9c9: 0x169c, 0x9ca: 0x05db, 0x9cb: 0x0b0f, - 0x9cc: 0x0b13, 0x9cd: 0x0b17, 0x9ce: 0x0b1f, 0x9cf: 0x1863, 0x9d0: 0x0b37, 0x9d1: 0x16a6, - 0x9d2: 0x16a6, 0x9d3: 0x11d7, 0x9d4: 0x0b47, 0x9d5: 0x0b47, 0x9d6: 0x05df, 0x9d7: 0x16c9, - 0x9d8: 0x179b, 0x9d9: 0x0b57, 0x9da: 0x0b5f, 0x9db: 0x05e3, 0x9dc: 0x0b73, 0x9dd: 0x0b83, - 0x9de: 0x0b87, 0x9df: 0x0b8f, 0x9e0: 0x0b9f, 0x9e1: 0x05eb, 0x9e2: 0x05e7, 0x9e3: 0x0ba3, - 0x9e4: 0x16ab, 0x9e5: 0x0ba7, 0x9e6: 0x0bbb, 0x9e7: 0x0bbf, 0x9e8: 0x0bc3, 0x9e9: 0x0bbf, - 0x9ea: 0x0bcf, 0x9eb: 0x0bd3, 0x9ec: 0x0be3, 0x9ed: 0x0bdb, 0x9ee: 0x0bdf, 0x9ef: 0x0be7, - 0x9f0: 0x0beb, 0x9f1: 0x0bef, 0x9f2: 0x0bfb, 0x9f3: 0x0bff, 0x9f4: 0x0c17, 0x9f5: 0x0c1f, - 0x9f6: 0x0c2f, 0x9f7: 0x0c43, 0x9f8: 0x16ba, 0x9f9: 0x0c3f, 0x9fa: 0x0c33, 0x9fb: 0x0c4b, - 0x9fc: 0x0c53, 0x9fd: 0x0c67, 0x9fe: 0x16bf, 0x9ff: 0x0c6f, - // Block 0x28, offset 0xa00 - 0xa00: 0x0c63, 0xa01: 0x0c5b, 0xa02: 0x05ef, 0xa03: 0x0c77, 0xa04: 0x0c7f, 0xa05: 0x0c87, - 0xa06: 0x0c7b, 0xa07: 0x05f3, 0xa08: 0x0c97, 0xa09: 0x0c9f, 0xa0a: 0x16c4, 0xa0b: 0x0ccb, - 0xa0c: 0x0cff, 0xa0d: 0x0cdb, 0xa0e: 0x05ff, 0xa0f: 0x0ce7, 0xa10: 0x05fb, 0xa11: 0x05f7, - 0xa12: 0x07c3, 0xa13: 0x07c7, 0xa14: 0x0d03, 0xa15: 0x0ceb, 0xa16: 0x11ab, 0xa17: 0x0663, - 0xa18: 0x0d0f, 0xa19: 0x0d13, 0xa1a: 0x0d17, 0xa1b: 0x0d2b, 0xa1c: 0x0d23, 0xa1d: 0x16dd, - 0xa1e: 0x0603, 0xa1f: 0x0d3f, 0xa20: 0x0d33, 0xa21: 0x0d4f, 0xa22: 0x0d57, 0xa23: 0x16e7, - 0xa24: 0x0d5b, 0xa25: 0x0d47, 0xa26: 0x0d63, 0xa27: 0x0607, 0xa28: 0x0d67, 0xa29: 0x0d6b, - 0xa2a: 0x0d6f, 0xa2b: 0x0d7b, 0xa2c: 0x16ec, 0xa2d: 0x0d83, 0xa2e: 0x060b, 0xa2f: 0x0d8f, - 0xa30: 0x16f1, 0xa31: 0x0d93, 0xa32: 0x060f, 0xa33: 0x0d9f, 0xa34: 0x0dab, 0xa35: 0x0db7, - 0xa36: 0x0dbb, 0xa37: 0x16f6, 0xa38: 0x168d, 0xa39: 0x16fb, 0xa3a: 0x0ddb, 0xa3b: 0x1700, - 0xa3c: 0x0de7, 0xa3d: 0x0def, 0xa3e: 0x0ddf, 0xa3f: 0x0dfb, - // Block 0x29, offset 0xa40 - 0xa40: 0x0e0b, 0xa41: 0x0e1b, 0xa42: 0x0e0f, 0xa43: 0x0e13, 0xa44: 0x0e1f, 0xa45: 0x0e23, - 0xa46: 0x1705, 0xa47: 0x0e07, 0xa48: 0x0e3b, 0xa49: 0x0e3f, 0xa4a: 0x0613, 0xa4b: 0x0e53, - 0xa4c: 0x0e4f, 0xa4d: 0x170a, 0xa4e: 0x0e33, 0xa4f: 0x0e6f, 0xa50: 0x170f, 0xa51: 0x1714, - 0xa52: 0x0e73, 0xa53: 0x0e87, 0xa54: 0x0e83, 0xa55: 0x0e7f, 0xa56: 0x0617, 0xa57: 0x0e8b, - 0xa58: 0x0e9b, 0xa59: 0x0e97, 0xa5a: 0x0ea3, 0xa5b: 0x1651, 0xa5c: 0x0eb3, 0xa5d: 0x1719, - 0xa5e: 0x0ebf, 0xa5f: 0x1723, 0xa60: 0x0ed3, 0xa61: 0x0edf, 0xa62: 0x0ef3, 0xa63: 0x1728, - 0xa64: 0x0f07, 0xa65: 0x0f0b, 0xa66: 0x172d, 0xa67: 0x1732, 0xa68: 0x0f27, 0xa69: 0x0f37, - 0xa6a: 0x061b, 0xa6b: 0x0f3b, 0xa6c: 0x061f, 0xa6d: 0x061f, 0xa6e: 0x0f53, 0xa6f: 0x0f57, - 0xa70: 0x0f5f, 0xa71: 0x0f63, 0xa72: 0x0f6f, 0xa73: 0x0623, 0xa74: 0x0f87, 0xa75: 0x1737, - 0xa76: 0x0fa3, 0xa77: 0x173c, 0xa78: 0x0faf, 0xa79: 0x16a1, 0xa7a: 0x0fbf, 0xa7b: 0x1741, - 0xa7c: 0x1746, 0xa7d: 0x174b, 0xa7e: 0x0627, 0xa7f: 0x062b, - // Block 0x2a, offset 0xa80 - 0xa80: 0x0ff7, 0xa81: 0x1755, 0xa82: 0x1750, 0xa83: 0x175a, 0xa84: 0x175f, 0xa85: 0x0fff, - 0xa86: 0x1003, 0xa87: 0x1003, 0xa88: 0x100b, 0xa89: 0x0633, 0xa8a: 0x100f, 0xa8b: 0x0637, - 0xa8c: 0x063b, 0xa8d: 0x1769, 0xa8e: 0x1023, 0xa8f: 0x102b, 0xa90: 0x1037, 0xa91: 0x063f, - 0xa92: 0x176e, 0xa93: 0x105b, 0xa94: 0x1773, 0xa95: 0x1778, 0xa96: 0x107b, 0xa97: 0x1093, - 0xa98: 0x0643, 0xa99: 0x109b, 0xa9a: 0x109f, 0xa9b: 0x10a3, 0xa9c: 0x177d, 0xa9d: 0x1782, - 0xa9e: 0x1782, 0xa9f: 0x10bb, 0xaa0: 0x0647, 0xaa1: 0x1787, 0xaa2: 0x10cf, 0xaa3: 0x10d3, - 0xaa4: 0x064b, 0xaa5: 0x178c, 0xaa6: 0x10ef, 0xaa7: 0x064f, 0xaa8: 0x10ff, 0xaa9: 0x10f7, - 0xaaa: 0x1107, 0xaab: 0x1796, 0xaac: 0x111f, 0xaad: 0x0653, 0xaae: 0x112b, 0xaaf: 0x1133, - 0xab0: 0x1143, 0xab1: 0x0657, 0xab2: 0x17a0, 0xab3: 0x17a5, 0xab4: 0x065b, 0xab5: 0x17aa, - 0xab6: 0x115b, 0xab7: 0x17af, 0xab8: 0x1167, 0xab9: 0x1173, 0xaba: 0x117b, 0xabb: 0x17b4, - 0xabc: 0x17b9, 0xabd: 0x118f, 0xabe: 0x17be, 0xabf: 0x1197, - // Block 0x2b, offset 0xac0 - 0xac0: 0x16ce, 0xac1: 0x065f, 0xac2: 0x11af, 0xac3: 0x11b3, 0xac4: 0x0667, 0xac5: 0x11b7, - 0xac6: 0x0a33, 0xac7: 0x17c3, 0xac8: 0x17c8, 0xac9: 0x16d3, 0xaca: 0x16d8, 0xacb: 0x11d7, - 0xacc: 0x11db, 0xacd: 0x13f3, 0xace: 0x066b, 0xacf: 0x1207, 0xad0: 0x1203, 0xad1: 0x120b, - 0xad2: 0x083f, 0xad3: 0x120f, 0xad4: 0x1213, 0xad5: 0x1217, 0xad6: 0x121f, 0xad7: 0x17cd, - 0xad8: 0x121b, 0xad9: 0x1223, 0xada: 0x1237, 0xadb: 0x123b, 0xadc: 0x1227, 0xadd: 0x123f, - 0xade: 0x1253, 0xadf: 0x1267, 0xae0: 0x1233, 0xae1: 0x1247, 0xae2: 0x124b, 0xae3: 0x124f, - 0xae4: 0x17d2, 0xae5: 0x17dc, 0xae6: 0x17d7, 0xae7: 0x066f, 0xae8: 0x126f, 0xae9: 0x1273, - 0xaea: 0x127b, 0xaeb: 0x17f0, 0xaec: 0x127f, 0xaed: 0x17e1, 0xaee: 0x0673, 0xaef: 0x0677, - 0xaf0: 0x17e6, 0xaf1: 0x17eb, 0xaf2: 0x067b, 0xaf3: 0x129f, 0xaf4: 0x12a3, 0xaf5: 0x12a7, - 0xaf6: 0x12ab, 0xaf7: 0x12b7, 0xaf8: 0x12b3, 0xaf9: 0x12bf, 0xafa: 0x12bb, 0xafb: 0x12cb, - 0xafc: 0x12c3, 0xafd: 0x12c7, 0xafe: 0x12cf, 0xaff: 0x067f, - // Block 0x2c, offset 0xb00 - 0xb00: 0x12d7, 0xb01: 0x12db, 0xb02: 0x0683, 0xb03: 0x12eb, 0xb04: 0x12ef, 0xb05: 0x17f5, - 0xb06: 0x12fb, 0xb07: 0x12ff, 0xb08: 0x0687, 0xb09: 0x130b, 0xb0a: 0x05bb, 0xb0b: 0x17fa, - 0xb0c: 0x17ff, 0xb0d: 0x068b, 0xb0e: 0x068f, 0xb0f: 0x1337, 0xb10: 0x134f, 0xb11: 0x136b, - 0xb12: 0x137b, 0xb13: 0x1804, 0xb14: 0x138f, 0xb15: 0x1393, 0xb16: 0x13ab, 0xb17: 0x13b7, - 0xb18: 0x180e, 0xb19: 0x1660, 0xb1a: 0x13c3, 0xb1b: 0x13bf, 0xb1c: 0x13cb, 0xb1d: 0x1665, - 0xb1e: 0x13d7, 0xb1f: 0x13e3, 0xb20: 0x1813, 0xb21: 0x1818, 0xb22: 0x1423, 0xb23: 0x142f, - 0xb24: 0x1437, 0xb25: 0x181d, 0xb26: 0x143b, 0xb27: 0x1467, 0xb28: 0x1473, 0xb29: 0x1477, - 0xb2a: 0x146f, 0xb2b: 0x1483, 0xb2c: 0x1487, 0xb2d: 0x1822, 0xb2e: 0x1493, 0xb2f: 0x0693, - 0xb30: 0x149b, 0xb31: 0x1827, 0xb32: 0x0697, 0xb33: 0x14d3, 0xb34: 0x0ac3, 0xb35: 0x14eb, - 0xb36: 0x182c, 0xb37: 0x1836, 0xb38: 0x069b, 0xb39: 0x069f, 0xb3a: 0x1513, 0xb3b: 0x183b, - 0xb3c: 0x06a3, 0xb3d: 0x1840, 0xb3e: 0x152b, 0xb3f: 0x152b, - // Block 0x2d, offset 0xb40 - 0xb40: 0x1533, 0xb41: 0x1845, 0xb42: 0x154b, 0xb43: 0x06a7, 0xb44: 0x155b, 0xb45: 0x1567, - 0xb46: 0x156f, 0xb47: 0x1577, 0xb48: 0x06ab, 0xb49: 0x184a, 0xb4a: 0x158b, 0xb4b: 0x15a7, - 0xb4c: 0x15b3, 0xb4d: 0x06af, 0xb4e: 0x06b3, 0xb4f: 0x15b7, 0xb50: 0x184f, 0xb51: 0x06b7, - 0xb52: 0x1854, 0xb53: 0x1859, 0xb54: 0x185e, 0xb55: 0x15db, 0xb56: 0x06bb, 0xb57: 0x15ef, - 0xb58: 0x15f7, 0xb59: 0x15fb, 0xb5a: 0x1603, 0xb5b: 0x160b, 0xb5c: 0x1613, 0xb5d: 0x1868, -} - -// nfcIndex: 22 blocks, 1408 entries, 1408 bytes -// Block 0 is the zero block. -var nfcIndex = [1408]uint8{ - // Block 0x0, offset 0x0 - // Block 0x1, offset 0x40 - // Block 0x2, offset 0x80 - // Block 0x3, offset 0xc0 - 0xc2: 0x2c, 0xc3: 0x01, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x2d, 0xc7: 0x04, - 0xc8: 0x05, 0xca: 0x2e, 0xcb: 0x2f, 0xcc: 0x06, 0xcd: 0x07, 0xce: 0x08, 0xcf: 0x30, - 0xd0: 0x09, 0xd1: 0x31, 0xd2: 0x32, 0xd3: 0x0a, 0xd6: 0x0b, 0xd7: 0x33, - 0xd8: 0x34, 0xd9: 0x0c, 0xdb: 0x35, 0xdc: 0x36, 0xdd: 0x37, 0xdf: 0x38, - 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, - 0xea: 0x06, 0xeb: 0x07, 0xec: 0x08, 0xed: 0x09, 0xef: 0x0a, - 0xf0: 0x13, - // Block 0x4, offset 0x100 - 0x120: 0x39, 0x121: 0x3a, 0x123: 0x3b, 0x124: 0x3c, 0x125: 0x3d, 0x126: 0x3e, 0x127: 0x3f, - 0x128: 0x40, 0x129: 0x41, 0x12a: 0x42, 0x12b: 0x43, 0x12c: 0x3e, 0x12d: 0x44, 0x12e: 0x45, 0x12f: 0x46, - 0x131: 0x47, 0x132: 0x48, 0x133: 0x49, 0x134: 0x4a, 0x135: 0x4b, 0x137: 0x4c, - 0x138: 0x4d, 0x139: 0x4e, 0x13a: 0x4f, 0x13b: 0x50, 0x13c: 0x51, 0x13d: 0x52, 0x13e: 0x53, 0x13f: 0x54, - // Block 0x5, offset 0x140 - 0x140: 0x55, 0x142: 0x56, 0x144: 0x57, 0x145: 0x58, 0x146: 0x59, 0x147: 0x5a, - 0x14d: 0x5b, - 0x15c: 0x5c, 0x15f: 0x5d, - 0x162: 0x5e, 0x164: 0x5f, - 0x168: 0x60, 0x169: 0x61, 0x16a: 0x62, 0x16c: 0x0d, 0x16d: 0x63, 0x16e: 0x64, 0x16f: 0x65, - 0x170: 0x66, 0x173: 0x67, 0x177: 0x68, - 0x178: 0x0e, 0x179: 0x0f, 0x17a: 0x10, 0x17b: 0x11, 0x17c: 0x12, 0x17d: 0x13, 0x17e: 0x14, 0x17f: 0x15, - // Block 0x6, offset 0x180 - 0x180: 0x69, 0x183: 0x6a, 0x184: 0x6b, 0x186: 0x6c, 0x187: 0x6d, - 0x188: 0x6e, 0x189: 0x16, 0x18a: 0x17, 0x18b: 0x6f, 0x18c: 0x70, - 0x1ab: 0x71, - 0x1b3: 0x72, 0x1b5: 0x73, 0x1b7: 0x74, - // Block 0x7, offset 0x1c0 - 0x1c0: 0x75, 0x1c1: 0x18, 0x1c2: 0x19, 0x1c3: 0x1a, 0x1c4: 0x76, 0x1c5: 0x77, - 0x1c9: 0x78, 0x1cc: 0x79, 0x1cd: 0x7a, - // Block 0x8, offset 0x200 - 0x219: 0x7b, 0x21a: 0x7c, 0x21b: 0x7d, - 0x220: 0x7e, 0x223: 0x7f, 0x224: 0x80, 0x225: 0x81, 0x226: 0x82, 0x227: 0x83, - 0x22a: 0x84, 0x22b: 0x85, 0x22f: 0x86, - 0x230: 0x87, 0x231: 0x88, 0x232: 0x89, 0x233: 0x8a, 0x234: 0x8b, 0x235: 0x8c, 0x236: 0x8d, 0x237: 0x87, - 0x238: 0x88, 0x239: 0x89, 0x23a: 0x8a, 0x23b: 0x8b, 0x23c: 0x8c, 0x23d: 0x8d, 0x23e: 0x87, 0x23f: 0x88, - // Block 0x9, offset 0x240 - 0x240: 0x89, 0x241: 0x8a, 0x242: 0x8b, 0x243: 0x8c, 0x244: 0x8d, 0x245: 0x87, 0x246: 0x88, 0x247: 0x89, - 0x248: 0x8a, 0x249: 0x8b, 0x24a: 0x8c, 0x24b: 0x8d, 0x24c: 0x87, 0x24d: 0x88, 0x24e: 0x89, 0x24f: 0x8a, - 0x250: 0x8b, 0x251: 0x8c, 0x252: 0x8d, 0x253: 0x87, 0x254: 0x88, 0x255: 0x89, 0x256: 0x8a, 0x257: 0x8b, - 0x258: 0x8c, 0x259: 0x8d, 0x25a: 0x87, 0x25b: 0x88, 0x25c: 0x89, 0x25d: 0x8a, 0x25e: 0x8b, 0x25f: 0x8c, - 0x260: 0x8d, 0x261: 0x87, 0x262: 0x88, 0x263: 0x89, 0x264: 0x8a, 0x265: 0x8b, 0x266: 0x8c, 0x267: 0x8d, - 0x268: 0x87, 0x269: 0x88, 0x26a: 0x89, 0x26b: 0x8a, 0x26c: 0x8b, 0x26d: 0x8c, 0x26e: 0x8d, 0x26f: 0x87, - 0x270: 0x88, 0x271: 0x89, 0x272: 0x8a, 0x273: 0x8b, 0x274: 0x8c, 0x275: 0x8d, 0x276: 0x87, 0x277: 0x88, - 0x278: 0x89, 0x279: 0x8a, 0x27a: 0x8b, 0x27b: 0x8c, 0x27c: 0x8d, 0x27d: 0x87, 0x27e: 0x88, 0x27f: 0x89, - // Block 0xa, offset 0x280 - 0x280: 0x8a, 0x281: 0x8b, 0x282: 0x8c, 0x283: 0x8d, 0x284: 0x87, 0x285: 0x88, 0x286: 0x89, 0x287: 0x8a, - 0x288: 0x8b, 0x289: 0x8c, 0x28a: 0x8d, 0x28b: 0x87, 0x28c: 0x88, 0x28d: 0x89, 0x28e: 0x8a, 0x28f: 0x8b, - 0x290: 0x8c, 0x291: 0x8d, 0x292: 0x87, 0x293: 0x88, 0x294: 0x89, 0x295: 0x8a, 0x296: 0x8b, 0x297: 0x8c, - 0x298: 0x8d, 0x299: 0x87, 0x29a: 0x88, 0x29b: 0x89, 0x29c: 0x8a, 0x29d: 0x8b, 0x29e: 0x8c, 0x29f: 0x8d, - 0x2a0: 0x87, 0x2a1: 0x88, 0x2a2: 0x89, 0x2a3: 0x8a, 0x2a4: 0x8b, 0x2a5: 0x8c, 0x2a6: 0x8d, 0x2a7: 0x87, - 0x2a8: 0x88, 0x2a9: 0x89, 0x2aa: 0x8a, 0x2ab: 0x8b, 0x2ac: 0x8c, 0x2ad: 0x8d, 0x2ae: 0x87, 0x2af: 0x88, - 0x2b0: 0x89, 0x2b1: 0x8a, 0x2b2: 0x8b, 0x2b3: 0x8c, 0x2b4: 0x8d, 0x2b5: 0x87, 0x2b6: 0x88, 0x2b7: 0x89, - 0x2b8: 0x8a, 0x2b9: 0x8b, 0x2ba: 0x8c, 0x2bb: 0x8d, 0x2bc: 0x87, 0x2bd: 0x88, 0x2be: 0x89, 0x2bf: 0x8a, - // Block 0xb, offset 0x2c0 - 0x2c0: 0x8b, 0x2c1: 0x8c, 0x2c2: 0x8d, 0x2c3: 0x87, 0x2c4: 0x88, 0x2c5: 0x89, 0x2c6: 0x8a, 0x2c7: 0x8b, - 0x2c8: 0x8c, 0x2c9: 0x8d, 0x2ca: 0x87, 0x2cb: 0x88, 0x2cc: 0x89, 0x2cd: 0x8a, 0x2ce: 0x8b, 0x2cf: 0x8c, - 0x2d0: 0x8d, 0x2d1: 0x87, 0x2d2: 0x88, 0x2d3: 0x89, 0x2d4: 0x8a, 0x2d5: 0x8b, 0x2d6: 0x8c, 0x2d7: 0x8d, - 0x2d8: 0x87, 0x2d9: 0x88, 0x2da: 0x89, 0x2db: 0x8a, 0x2dc: 0x8b, 0x2dd: 0x8c, 0x2de: 0x8e, - // Block 0xc, offset 0x300 - 0x324: 0x1b, 0x325: 0x1c, 0x326: 0x1d, 0x327: 0x1e, - 0x328: 0x1f, 0x329: 0x20, 0x32a: 0x21, 0x32b: 0x22, 0x32c: 0x8f, 0x32d: 0x90, 0x32e: 0x91, - 0x331: 0x92, 0x332: 0x93, 0x333: 0x94, 0x334: 0x95, - 0x338: 0x96, 0x339: 0x97, 0x33a: 0x98, 0x33b: 0x99, 0x33e: 0x9a, 0x33f: 0x9b, - // Block 0xd, offset 0x340 - 0x347: 0x9c, - 0x34b: 0x9d, 0x34d: 0x9e, - 0x368: 0x9f, 0x36b: 0xa0, - // Block 0xe, offset 0x380 - 0x381: 0xa1, 0x382: 0xa2, 0x384: 0xa3, 0x385: 0x82, 0x387: 0xa4, - 0x388: 0xa5, 0x38b: 0xa6, 0x38c: 0x3e, 0x38d: 0xa7, - 0x391: 0xa8, 0x392: 0xa9, 0x393: 0xaa, 0x396: 0xab, 0x397: 0xac, - 0x398: 0x73, 0x39a: 0xad, 0x39c: 0xae, - 0x3b0: 0x73, - // Block 0xf, offset 0x3c0 - 0x3eb: 0xaf, 0x3ec: 0xb0, - // Block 0x10, offset 0x400 - 0x432: 0xb1, - // Block 0x11, offset 0x440 - 0x445: 0xb2, 0x446: 0xb3, 0x447: 0xb4, - 0x449: 0xb5, - // Block 0x12, offset 0x480 - 0x480: 0xb6, - 0x4a3: 0xb7, 0x4a5: 0xb8, - // Block 0x13, offset 0x4c0 - 0x4c8: 0xb9, - // Block 0x14, offset 0x500 - 0x520: 0x23, 0x521: 0x24, 0x522: 0x25, 0x523: 0x26, 0x524: 0x27, 0x525: 0x28, 0x526: 0x29, 0x527: 0x2a, - 0x528: 0x2b, - // Block 0x15, offset 0x540 - 0x550: 0x0b, 0x551: 0x0c, 0x556: 0x0d, - 0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11, - 0x56f: 0x12, -} - -// nfcSparseOffset: 142 entries, 284 bytes -var nfcSparseOffset = []uint16{0x0, 0x5, 0x9, 0xb, 0xd, 0x18, 0x28, 0x2a, 0x2f, 0x3a, 0x49, 0x56, 0x5e, 0x62, 0x67, 0x69, 0x7a, 0x82, 0x89, 0x8c, 0x93, 0x97, 0x9b, 0x9d, 0x9f, 0xa8, 0xac, 0xb3, 0xb8, 0xbb, 0xc5, 0xc7, 0xce, 0xd6, 0xd9, 0xdb, 0xdd, 0xdf, 0xe4, 0xf5, 0x101, 0x103, 0x109, 0x10b, 0x10d, 0x10f, 0x111, 0x113, 0x115, 0x118, 0x11b, 0x11d, 0x120, 0x123, 0x127, 0x12c, 0x135, 0x137, 0x13a, 0x13c, 0x147, 0x157, 0x15b, 0x169, 0x16c, 0x172, 0x178, 0x183, 0x187, 0x189, 0x18b, 0x18d, 0x18f, 0x191, 0x197, 0x19b, 0x19d, 0x19f, 0x1a7, 0x1ab, 0x1ae, 0x1b0, 0x1b2, 0x1b4, 0x1b7, 0x1b9, 0x1bb, 0x1bd, 0x1bf, 0x1c5, 0x1c8, 0x1ca, 0x1d1, 0x1d7, 0x1dd, 0x1e5, 0x1eb, 0x1f1, 0x1f7, 0x1fb, 0x209, 0x212, 0x215, 0x218, 0x21a, 0x21d, 0x21f, 0x223, 0x228, 0x22a, 0x22c, 0x231, 0x237, 0x239, 0x23b, 0x23d, 0x243, 0x246, 0x249, 0x251, 0x258, 0x25b, 0x25e, 0x260, 0x268, 0x26b, 0x272, 0x275, 0x27b, 0x27d, 0x280, 0x282, 0x284, 0x286, 0x288, 0x295, 0x29f, 0x2a1, 0x2a3, 0x2a9, 0x2ab, 0x2ae} - -// nfcSparseValues: 688 entries, 2752 bytes -var nfcSparseValues = [688]valueRange{ - // Block 0x0, offset 0x0 - {value: 0x0000, lo: 0x04}, - {value: 0xa100, lo: 0xa8, hi: 0xa8}, - {value: 0x8100, lo: 0xaf, hi: 0xaf}, - {value: 0x8100, lo: 0xb4, hi: 0xb4}, - {value: 0x8100, lo: 0xb8, hi: 0xb8}, - // Block 0x1, offset 0x5 - {value: 0x0091, lo: 0x03}, - {value: 0x46e2, lo: 0xa0, hi: 0xa1}, - {value: 0x4714, lo: 0xaf, hi: 0xb0}, - {value: 0xa000, lo: 0xb7, hi: 0xb7}, - // Block 0x2, offset 0x9 - {value: 0x0000, lo: 0x01}, - {value: 0xa000, lo: 0x92, hi: 0x92}, - // Block 0x3, offset 0xb - {value: 0x0000, lo: 0x01}, - {value: 0x8100, lo: 0x98, hi: 0x9d}, - // Block 0x4, offset 0xd - {value: 0x0006, lo: 0x0a}, - {value: 0xa000, lo: 0x81, hi: 0x81}, - {value: 0xa000, lo: 0x85, hi: 0x85}, - {value: 0xa000, lo: 0x89, hi: 0x89}, - {value: 0x4840, lo: 0x8a, hi: 0x8a}, - {value: 0x485e, lo: 0x8b, hi: 0x8b}, - {value: 0x36c7, lo: 0x8c, hi: 0x8c}, - {value: 0x36df, lo: 0x8d, hi: 0x8d}, - {value: 0x4876, lo: 0x8e, hi: 0x8e}, - {value: 0xa000, lo: 0x92, hi: 0x92}, - {value: 0x36fd, lo: 0x93, hi: 0x94}, - // Block 0x5, offset 0x18 - {value: 0x0000, lo: 0x0f}, - {value: 0xa000, lo: 0x83, hi: 0x83}, - {value: 0xa000, lo: 0x87, hi: 0x87}, - {value: 0xa000, lo: 0x8b, hi: 0x8b}, - {value: 0xa000, lo: 0x8d, hi: 0x8d}, - {value: 0x37a5, lo: 0x90, hi: 0x90}, - {value: 0x37b1, lo: 0x91, hi: 0x91}, - {value: 0x379f, lo: 0x93, hi: 0x93}, - {value: 0xa000, lo: 0x96, hi: 0x96}, - {value: 0x3817, lo: 0x97, hi: 0x97}, - {value: 0x37e1, lo: 0x9c, hi: 0x9c}, - {value: 0x37c9, lo: 0x9d, hi: 0x9d}, - {value: 0x37f3, lo: 0x9e, hi: 0x9e}, - {value: 0xa000, lo: 0xb4, hi: 0xb5}, - {value: 0x381d, lo: 0xb6, hi: 0xb6}, - {value: 0x3823, lo: 0xb7, hi: 0xb7}, - // Block 0x6, offset 0x28 - {value: 0x0000, lo: 0x01}, - {value: 0x8132, lo: 0x83, hi: 0x87}, - // Block 0x7, offset 0x2a - {value: 0x0001, lo: 0x04}, - {value: 0x8113, lo: 0x81, hi: 0x82}, - {value: 0x8132, lo: 0x84, hi: 0x84}, - {value: 0x812d, lo: 0x85, hi: 0x85}, - {value: 0x810d, lo: 0x87, hi: 0x87}, - // Block 0x8, offset 0x2f - {value: 0x0000, lo: 0x0a}, - {value: 0x8132, lo: 0x90, hi: 0x97}, - {value: 0x8119, lo: 0x98, hi: 0x98}, - {value: 0x811a, lo: 0x99, hi: 0x99}, - {value: 0x811b, lo: 0x9a, hi: 0x9a}, - {value: 0x3841, lo: 0xa2, hi: 0xa2}, - {value: 0x3847, lo: 0xa3, hi: 0xa3}, - {value: 0x3853, lo: 0xa4, hi: 0xa4}, - {value: 0x384d, lo: 0xa5, hi: 0xa5}, - {value: 0x3859, lo: 0xa6, hi: 0xa6}, - {value: 0xa000, lo: 0xa7, hi: 0xa7}, - // Block 0x9, offset 0x3a - {value: 0x0000, lo: 0x0e}, - {value: 0x386b, lo: 0x80, hi: 0x80}, - {value: 0xa000, lo: 0x81, hi: 0x81}, - {value: 0x385f, lo: 0x82, hi: 0x82}, - {value: 0xa000, lo: 0x92, hi: 0x92}, - {value: 0x3865, lo: 0x93, hi: 0x93}, - {value: 0xa000, lo: 0x95, hi: 0x95}, - {value: 0x8132, lo: 0x96, hi: 0x9c}, - {value: 0x8132, lo: 0x9f, hi: 0xa2}, - {value: 0x812d, lo: 0xa3, hi: 0xa3}, - {value: 0x8132, lo: 0xa4, hi: 0xa4}, - {value: 0x8132, lo: 0xa7, hi: 0xa8}, - {value: 0x812d, lo: 0xaa, hi: 0xaa}, - {value: 0x8132, lo: 0xab, hi: 0xac}, - {value: 0x812d, lo: 0xad, hi: 0xad}, - // Block 0xa, offset 0x49 - {value: 0x0000, lo: 0x0c}, - {value: 0x811f, lo: 0x91, hi: 0x91}, - {value: 0x8132, lo: 0xb0, hi: 0xb0}, - {value: 0x812d, lo: 0xb1, hi: 0xb1}, - {value: 0x8132, lo: 0xb2, hi: 0xb3}, - {value: 0x812d, lo: 0xb4, hi: 0xb4}, - {value: 0x8132, lo: 0xb5, hi: 0xb6}, - {value: 0x812d, lo: 0xb7, hi: 0xb9}, - {value: 0x8132, lo: 0xba, hi: 0xba}, - {value: 0x812d, lo: 0xbb, hi: 0xbc}, - {value: 0x8132, lo: 0xbd, hi: 0xbd}, - {value: 0x812d, lo: 0xbe, hi: 0xbe}, - {value: 0x8132, lo: 0xbf, hi: 0xbf}, - // Block 0xb, offset 0x56 - {value: 0x0005, lo: 0x07}, - {value: 0x8132, lo: 0x80, hi: 0x80}, - {value: 0x8132, lo: 0x81, hi: 0x81}, - {value: 0x812d, lo: 0x82, hi: 0x83}, - {value: 0x812d, lo: 0x84, hi: 0x85}, - {value: 0x812d, lo: 0x86, hi: 0x87}, - {value: 0x812d, lo: 0x88, hi: 0x89}, - {value: 0x8132, lo: 0x8a, hi: 0x8a}, - // Block 0xc, offset 0x5e - {value: 0x0000, lo: 0x03}, - {value: 0x8132, lo: 0xab, hi: 0xb1}, - {value: 0x812d, lo: 0xb2, hi: 0xb2}, - {value: 0x8132, lo: 0xb3, hi: 0xb3}, - // Block 0xd, offset 0x62 - {value: 0x0000, lo: 0x04}, - {value: 0x8132, lo: 0x96, hi: 0x99}, - {value: 0x8132, lo: 0x9b, hi: 0xa3}, - {value: 0x8132, lo: 0xa5, hi: 0xa7}, - {value: 0x8132, lo: 0xa9, hi: 0xad}, - // Block 0xe, offset 0x67 - {value: 0x0000, lo: 0x01}, - {value: 0x812d, lo: 0x99, hi: 0x9b}, - // Block 0xf, offset 0x69 - {value: 0x0000, lo: 0x10}, - {value: 0x8132, lo: 0x94, hi: 0xa1}, - {value: 0x812d, lo: 0xa3, hi: 0xa3}, - {value: 0x8132, lo: 0xa4, hi: 0xa5}, - {value: 0x812d, lo: 0xa6, hi: 0xa6}, - {value: 0x8132, lo: 0xa7, hi: 0xa8}, - {value: 0x812d, lo: 0xa9, hi: 0xa9}, - {value: 0x8132, lo: 0xaa, hi: 0xac}, - {value: 0x812d, lo: 0xad, hi: 0xaf}, - {value: 0x8116, lo: 0xb0, hi: 0xb0}, - {value: 0x8117, lo: 0xb1, hi: 0xb1}, - {value: 0x8118, lo: 0xb2, hi: 0xb2}, - {value: 0x8132, lo: 0xb3, hi: 0xb5}, - {value: 0x812d, lo: 0xb6, hi: 0xb6}, - {value: 0x8132, lo: 0xb7, hi: 0xb8}, - {value: 0x812d, lo: 0xb9, hi: 0xba}, - {value: 0x8132, lo: 0xbb, hi: 0xbf}, - // Block 0x10, offset 0x7a - {value: 0x0000, lo: 0x07}, - {value: 0xa000, lo: 0xa8, hi: 0xa8}, - {value: 0x3ed8, lo: 0xa9, hi: 0xa9}, - {value: 0xa000, lo: 0xb0, hi: 0xb0}, - {value: 0x3ee0, lo: 0xb1, hi: 0xb1}, - {value: 0xa000, lo: 0xb3, hi: 0xb3}, - {value: 0x3ee8, lo: 0xb4, hi: 0xb4}, - {value: 0x9902, lo: 0xbc, hi: 0xbc}, - // Block 0x11, offset 0x82 - {value: 0x0008, lo: 0x06}, - {value: 0x8104, lo: 0x8d, hi: 0x8d}, - {value: 0x8132, lo: 0x91, hi: 0x91}, - {value: 0x812d, lo: 0x92, hi: 0x92}, - {value: 0x8132, lo: 0x93, hi: 0x93}, - {value: 0x8132, lo: 0x94, hi: 0x94}, - {value: 0x451c, lo: 0x98, hi: 0x9f}, - // Block 0x12, offset 0x89 - {value: 0x0000, lo: 0x02}, - {value: 0x8102, lo: 0xbc, hi: 0xbc}, - {value: 0x9900, lo: 0xbe, hi: 0xbe}, - // Block 0x13, offset 0x8c - {value: 0x0008, lo: 0x06}, - {value: 0xa000, lo: 0x87, hi: 0x87}, - {value: 0x2c9e, lo: 0x8b, hi: 0x8c}, - {value: 0x8104, lo: 0x8d, hi: 0x8d}, - {value: 0x9900, lo: 0x97, hi: 0x97}, - {value: 0x455c, lo: 0x9c, hi: 0x9d}, - {value: 0x456c, lo: 0x9f, hi: 0x9f}, - // Block 0x14, offset 0x93 - {value: 0x0000, lo: 0x03}, - {value: 0x4594, lo: 0xb3, hi: 0xb3}, - {value: 0x459c, lo: 0xb6, hi: 0xb6}, - {value: 0x8102, lo: 0xbc, hi: 0xbc}, - // Block 0x15, offset 0x97 - {value: 0x0008, lo: 0x03}, - {value: 0x8104, lo: 0x8d, hi: 0x8d}, - {value: 0x4574, lo: 0x99, hi: 0x9b}, - {value: 0x458c, lo: 0x9e, hi: 0x9e}, - // Block 0x16, offset 0x9b - {value: 0x0000, lo: 0x01}, - {value: 0x8102, lo: 0xbc, hi: 0xbc}, - // Block 0x17, offset 0x9d - {value: 0x0000, lo: 0x01}, - {value: 0x8104, lo: 0x8d, hi: 0x8d}, - // Block 0x18, offset 0x9f - {value: 0x0000, lo: 0x08}, - {value: 0xa000, lo: 0x87, hi: 0x87}, - {value: 0x2cb6, lo: 0x88, hi: 0x88}, - {value: 0x2cae, lo: 0x8b, hi: 0x8b}, - {value: 0x2cbe, lo: 0x8c, hi: 0x8c}, - {value: 0x8104, lo: 0x8d, hi: 0x8d}, - {value: 0x9900, lo: 0x96, hi: 0x97}, - {value: 0x45a4, lo: 0x9c, hi: 0x9c}, - {value: 0x45ac, lo: 0x9d, hi: 0x9d}, - // Block 0x19, offset 0xa8 - {value: 0x0000, lo: 0x03}, - {value: 0xa000, lo: 0x92, hi: 0x92}, - {value: 0x2cc6, lo: 0x94, hi: 0x94}, - {value: 0x9900, lo: 0xbe, hi: 0xbe}, - // Block 0x1a, offset 0xac - {value: 0x0000, lo: 0x06}, - {value: 0xa000, lo: 0x86, hi: 0x87}, - {value: 0x2cce, lo: 0x8a, hi: 0x8a}, - {value: 0x2cde, lo: 0x8b, hi: 0x8b}, - {value: 0x2cd6, lo: 0x8c, hi: 0x8c}, - {value: 0x8104, lo: 0x8d, hi: 0x8d}, - {value: 0x9900, lo: 0x97, hi: 0x97}, - // Block 0x1b, offset 0xb3 - {value: 0x1801, lo: 0x04}, - {value: 0xa000, lo: 0x86, hi: 0x86}, - {value: 0x3ef0, lo: 0x88, hi: 0x88}, - {value: 0x8104, lo: 0x8d, hi: 0x8d}, - {value: 0x8120, lo: 0x95, hi: 0x96}, - // Block 0x1c, offset 0xb8 - {value: 0x0000, lo: 0x02}, - {value: 0x8102, lo: 0xbc, hi: 0xbc}, - {value: 0xa000, lo: 0xbf, hi: 0xbf}, - // Block 0x1d, offset 0xbb - {value: 0x0000, lo: 0x09}, - {value: 0x2ce6, lo: 0x80, hi: 0x80}, - {value: 0x9900, lo: 0x82, hi: 0x82}, - {value: 0xa000, lo: 0x86, hi: 0x86}, - {value: 0x2cee, lo: 0x87, hi: 0x87}, - {value: 0x2cf6, lo: 0x88, hi: 0x88}, - {value: 0x2f50, lo: 0x8a, hi: 0x8a}, - {value: 0x2dd8, lo: 0x8b, hi: 0x8b}, - {value: 0x8104, lo: 0x8d, hi: 0x8d}, - {value: 0x9900, lo: 0x95, hi: 0x96}, - // Block 0x1e, offset 0xc5 - {value: 0x0000, lo: 0x01}, - {value: 0x9900, lo: 0xbe, hi: 0xbe}, - // Block 0x1f, offset 0xc7 - {value: 0x0000, lo: 0x06}, - {value: 0xa000, lo: 0x86, hi: 0x87}, - {value: 0x2cfe, lo: 0x8a, hi: 0x8a}, - {value: 0x2d0e, lo: 0x8b, hi: 0x8b}, - {value: 0x2d06, lo: 0x8c, hi: 0x8c}, - {value: 0x8104, lo: 0x8d, hi: 0x8d}, - {value: 0x9900, lo: 0x97, hi: 0x97}, - // Block 0x20, offset 0xce - {value: 0x6bea, lo: 0x07}, - {value: 0x9904, lo: 0x8a, hi: 0x8a}, - {value: 0x9900, lo: 0x8f, hi: 0x8f}, - {value: 0xa000, lo: 0x99, hi: 0x99}, - {value: 0x3ef8, lo: 0x9a, hi: 0x9a}, - {value: 0x2f58, lo: 0x9c, hi: 0x9c}, - {value: 0x2de3, lo: 0x9d, hi: 0x9d}, - {value: 0x2d16, lo: 0x9e, hi: 0x9f}, - // Block 0x21, offset 0xd6 - {value: 0x0000, lo: 0x02}, - {value: 0x8122, lo: 0xb8, hi: 0xb9}, - {value: 0x8104, lo: 0xba, hi: 0xba}, - // Block 0x22, offset 0xd9 - {value: 0x0000, lo: 0x01}, - {value: 0x8123, lo: 0x88, hi: 0x8b}, - // Block 0x23, offset 0xdb - {value: 0x0000, lo: 0x01}, - {value: 0x8124, lo: 0xb8, hi: 0xb9}, - // Block 0x24, offset 0xdd - {value: 0x0000, lo: 0x01}, - {value: 0x8125, lo: 0x88, hi: 0x8b}, - // Block 0x25, offset 0xdf - {value: 0x0000, lo: 0x04}, - {value: 0x812d, lo: 0x98, hi: 0x99}, - {value: 0x812d, lo: 0xb5, hi: 0xb5}, - {value: 0x812d, lo: 0xb7, hi: 0xb7}, - {value: 0x812b, lo: 0xb9, hi: 0xb9}, - // Block 0x26, offset 0xe4 - {value: 0x0000, lo: 0x10}, - {value: 0x2644, lo: 0x83, hi: 0x83}, - {value: 0x264b, lo: 0x8d, hi: 0x8d}, - {value: 0x2652, lo: 0x92, hi: 0x92}, - {value: 0x2659, lo: 0x97, hi: 0x97}, - {value: 0x2660, lo: 0x9c, hi: 0x9c}, - {value: 0x263d, lo: 0xa9, hi: 0xa9}, - {value: 0x8126, lo: 0xb1, hi: 0xb1}, - {value: 0x8127, lo: 0xb2, hi: 0xb2}, - {value: 0x4a84, lo: 0xb3, hi: 0xb3}, - {value: 0x8128, lo: 0xb4, hi: 0xb4}, - {value: 0x4a8d, lo: 0xb5, hi: 0xb5}, - {value: 0x45b4, lo: 0xb6, hi: 0xb6}, - {value: 0x8200, lo: 0xb7, hi: 0xb7}, - {value: 0x45bc, lo: 0xb8, hi: 0xb8}, - {value: 0x8200, lo: 0xb9, hi: 0xb9}, - {value: 0x8127, lo: 0xba, hi: 0xbd}, - // Block 0x27, offset 0xf5 - {value: 0x0000, lo: 0x0b}, - {value: 0x8127, lo: 0x80, hi: 0x80}, - {value: 0x4a96, lo: 0x81, hi: 0x81}, - {value: 0x8132, lo: 0x82, hi: 0x83}, - {value: 0x8104, lo: 0x84, hi: 0x84}, - {value: 0x8132, lo: 0x86, hi: 0x87}, - {value: 0x266e, lo: 0x93, hi: 0x93}, - {value: 0x2675, lo: 0x9d, hi: 0x9d}, - {value: 0x267c, lo: 0xa2, hi: 0xa2}, - {value: 0x2683, lo: 0xa7, hi: 0xa7}, - {value: 0x268a, lo: 0xac, hi: 0xac}, - {value: 0x2667, lo: 0xb9, hi: 0xb9}, - // Block 0x28, offset 0x101 - {value: 0x0000, lo: 0x01}, - {value: 0x812d, lo: 0x86, hi: 0x86}, - // Block 0x29, offset 0x103 - {value: 0x0000, lo: 0x05}, - {value: 0xa000, lo: 0xa5, hi: 0xa5}, - {value: 0x2d1e, lo: 0xa6, hi: 0xa6}, - {value: 0x9900, lo: 0xae, hi: 0xae}, - {value: 0x8102, lo: 0xb7, hi: 0xb7}, - {value: 0x8104, lo: 0xb9, hi: 0xba}, - // Block 0x2a, offset 0x109 - {value: 0x0000, lo: 0x01}, - {value: 0x812d, lo: 0x8d, hi: 0x8d}, - // Block 0x2b, offset 0x10b - {value: 0x0000, lo: 0x01}, - {value: 0xa000, lo: 0x80, hi: 0x92}, - // Block 0x2c, offset 0x10d - {value: 0x0000, lo: 0x01}, - {value: 0xb900, lo: 0xa1, hi: 0xb5}, - // Block 0x2d, offset 0x10f - {value: 0x0000, lo: 0x01}, - {value: 0x9900, lo: 0xa8, hi: 0xbf}, - // Block 0x2e, offset 0x111 - {value: 0x0000, lo: 0x01}, - {value: 0x9900, lo: 0x80, hi: 0x82}, - // Block 0x2f, offset 0x113 - {value: 0x0000, lo: 0x01}, - {value: 0x8132, lo: 0x9d, hi: 0x9f}, - // Block 0x30, offset 0x115 - {value: 0x0000, lo: 0x02}, - {value: 0x8104, lo: 0x94, hi: 0x94}, - {value: 0x8104, lo: 0xb4, hi: 0xb4}, - // Block 0x31, offset 0x118 - {value: 0x0000, lo: 0x02}, - {value: 0x8104, lo: 0x92, hi: 0x92}, - {value: 0x8132, lo: 0x9d, hi: 0x9d}, - // Block 0x32, offset 0x11b - {value: 0x0000, lo: 0x01}, - {value: 0x8131, lo: 0xa9, hi: 0xa9}, - // Block 0x33, offset 0x11d - {value: 0x0004, lo: 0x02}, - {value: 0x812e, lo: 0xb9, hi: 0xba}, - {value: 0x812d, lo: 0xbb, hi: 0xbb}, - // Block 0x34, offset 0x120 - {value: 0x0000, lo: 0x02}, - {value: 0x8132, lo: 0x97, hi: 0x97}, - {value: 0x812d, lo: 0x98, hi: 0x98}, - // Block 0x35, offset 0x123 - {value: 0x0000, lo: 0x03}, - {value: 0x8104, lo: 0xa0, hi: 0xa0}, - {value: 0x8132, lo: 0xb5, hi: 0xbc}, - {value: 0x812d, lo: 0xbf, hi: 0xbf}, - // Block 0x36, offset 0x127 - {value: 0x0000, lo: 0x04}, - {value: 0x8132, lo: 0xb0, hi: 0xb4}, - {value: 0x812d, lo: 0xb5, hi: 0xba}, - {value: 0x8132, lo: 0xbb, hi: 0xbc}, - {value: 0x812d, lo: 0xbd, hi: 0xbd}, - // Block 0x37, offset 0x12c - {value: 0x0000, lo: 0x08}, - {value: 0x2d66, lo: 0x80, hi: 0x80}, - {value: 0x2d6e, lo: 0x81, hi: 0x81}, - {value: 0xa000, lo: 0x82, hi: 0x82}, - {value: 0x2d76, lo: 0x83, hi: 0x83}, - {value: 0x8104, lo: 0x84, hi: 0x84}, - {value: 0x8132, lo: 0xab, hi: 0xab}, - {value: 0x812d, lo: 0xac, hi: 0xac}, - {value: 0x8132, lo: 0xad, hi: 0xb3}, - // Block 0x38, offset 0x135 - {value: 0x0000, lo: 0x01}, - {value: 0x8104, lo: 0xaa, hi: 0xab}, - // Block 0x39, offset 0x137 - {value: 0x0000, lo: 0x02}, - {value: 0x8102, lo: 0xa6, hi: 0xa6}, - {value: 0x8104, lo: 0xb2, hi: 0xb3}, - // Block 0x3a, offset 0x13a - {value: 0x0000, lo: 0x01}, - {value: 0x8102, lo: 0xb7, hi: 0xb7}, - // Block 0x3b, offset 0x13c - {value: 0x0000, lo: 0x0a}, - {value: 0x8132, lo: 0x90, hi: 0x92}, - {value: 0x8101, lo: 0x94, hi: 0x94}, - {value: 0x812d, lo: 0x95, hi: 0x99}, - {value: 0x8132, lo: 0x9a, hi: 0x9b}, - {value: 0x812d, lo: 0x9c, hi: 0x9f}, - {value: 0x8132, lo: 0xa0, hi: 0xa0}, - {value: 0x8101, lo: 0xa2, hi: 0xa8}, - {value: 0x812d, lo: 0xad, hi: 0xad}, - {value: 0x8132, lo: 0xb4, hi: 0xb4}, - {value: 0x8132, lo: 0xb8, hi: 0xb9}, - // Block 0x3c, offset 0x147 - {value: 0x0000, lo: 0x0f}, - {value: 0x8132, lo: 0x80, hi: 0x81}, - {value: 0x812d, lo: 0x82, hi: 0x82}, - {value: 0x8132, lo: 0x83, hi: 0x89}, - {value: 0x812d, lo: 0x8a, hi: 0x8a}, - {value: 0x8132, lo: 0x8b, hi: 0x8c}, - {value: 0x8135, lo: 0x8d, hi: 0x8d}, - {value: 0x812a, lo: 0x8e, hi: 0x8e}, - {value: 0x812d, lo: 0x8f, hi: 0x8f}, - {value: 0x8129, lo: 0x90, hi: 0x90}, - {value: 0x8132, lo: 0x91, hi: 0xb5}, - {value: 0x8132, lo: 0xbb, hi: 0xbb}, - {value: 0x8134, lo: 0xbc, hi: 0xbc}, - {value: 0x812d, lo: 0xbd, hi: 0xbd}, - {value: 0x8132, lo: 0xbe, hi: 0xbe}, - {value: 0x812d, lo: 0xbf, hi: 0xbf}, - // Block 0x3d, offset 0x157 - {value: 0x0004, lo: 0x03}, - {value: 0x0433, lo: 0x80, hi: 0x81}, - {value: 0x8100, lo: 0x97, hi: 0x97}, - {value: 0x8100, lo: 0xbe, hi: 0xbe}, - // Block 0x3e, offset 0x15b - {value: 0x0000, lo: 0x0d}, - {value: 0x8132, lo: 0x90, hi: 0x91}, - {value: 0x8101, lo: 0x92, hi: 0x93}, - {value: 0x8132, lo: 0x94, hi: 0x97}, - {value: 0x8101, lo: 0x98, hi: 0x9a}, - {value: 0x8132, lo: 0x9b, hi: 0x9c}, - {value: 0x8132, lo: 0xa1, hi: 0xa1}, - {value: 0x8101, lo: 0xa5, hi: 0xa6}, - {value: 0x8132, lo: 0xa7, hi: 0xa7}, - {value: 0x812d, lo: 0xa8, hi: 0xa8}, - {value: 0x8132, lo: 0xa9, hi: 0xa9}, - {value: 0x8101, lo: 0xaa, hi: 0xab}, - {value: 0x812d, lo: 0xac, hi: 0xaf}, - {value: 0x8132, lo: 0xb0, hi: 0xb0}, - // Block 0x3f, offset 0x169 - {value: 0x427b, lo: 0x02}, - {value: 0x01b8, lo: 0xa6, hi: 0xa6}, - {value: 0x0057, lo: 0xaa, hi: 0xab}, - // Block 0x40, offset 0x16c - {value: 0x0007, lo: 0x05}, - {value: 0xa000, lo: 0x90, hi: 0x90}, - {value: 0xa000, lo: 0x92, hi: 0x92}, - {value: 0xa000, lo: 0x94, hi: 0x94}, - {value: 0x3bb9, lo: 0x9a, hi: 0x9b}, - {value: 0x3bc7, lo: 0xae, hi: 0xae}, - // Block 0x41, offset 0x172 - {value: 0x000e, lo: 0x05}, - {value: 0x3bce, lo: 0x8d, hi: 0x8e}, - {value: 0x3bd5, lo: 0x8f, hi: 0x8f}, - {value: 0xa000, lo: 0x90, hi: 0x90}, - {value: 0xa000, lo: 0x92, hi: 0x92}, - {value: 0xa000, lo: 0x94, hi: 0x94}, - // Block 0x42, offset 0x178 - {value: 0x6408, lo: 0x0a}, - {value: 0xa000, lo: 0x83, hi: 0x83}, - {value: 0x3be3, lo: 0x84, hi: 0x84}, - {value: 0xa000, lo: 0x88, hi: 0x88}, - {value: 0x3bea, lo: 0x89, hi: 0x89}, - {value: 0xa000, lo: 0x8b, hi: 0x8b}, - {value: 0x3bf1, lo: 0x8c, hi: 0x8c}, - {value: 0xa000, lo: 0xa3, hi: 0xa3}, - {value: 0x3bf8, lo: 0xa4, hi: 0xa5}, - {value: 0x3bff, lo: 0xa6, hi: 0xa6}, - {value: 0xa000, lo: 0xbc, hi: 0xbc}, - // Block 0x43, offset 0x183 - {value: 0x0007, lo: 0x03}, - {value: 0x3c68, lo: 0xa0, hi: 0xa1}, - {value: 0x3c92, lo: 0xa2, hi: 0xa3}, - {value: 0x3cbc, lo: 0xaa, hi: 0xad}, - // Block 0x44, offset 0x187 - {value: 0x0004, lo: 0x01}, - {value: 0x048b, lo: 0xa9, hi: 0xaa}, - // Block 0x45, offset 0x189 - {value: 0x0000, lo: 0x01}, - {value: 0x44dd, lo: 0x9c, hi: 0x9c}, - // Block 0x46, offset 0x18b - {value: 0x0000, lo: 0x01}, - {value: 0x8132, lo: 0xaf, hi: 0xb1}, - // Block 0x47, offset 0x18d - {value: 0x0000, lo: 0x01}, - {value: 0x8104, lo: 0xbf, hi: 0xbf}, - // Block 0x48, offset 0x18f - {value: 0x0000, lo: 0x01}, - {value: 0x8132, lo: 0xa0, hi: 0xbf}, - // Block 0x49, offset 0x191 - {value: 0x0000, lo: 0x05}, - {value: 0x812c, lo: 0xaa, hi: 0xaa}, - {value: 0x8131, lo: 0xab, hi: 0xab}, - {value: 0x8133, lo: 0xac, hi: 0xac}, - {value: 0x812e, lo: 0xad, hi: 0xad}, - {value: 0x812f, lo: 0xae, hi: 0xaf}, - // Block 0x4a, offset 0x197 - {value: 0x0000, lo: 0x03}, - {value: 0x4a9f, lo: 0xb3, hi: 0xb3}, - {value: 0x4a9f, lo: 0xb5, hi: 0xb6}, - {value: 0x4a9f, lo: 0xba, hi: 0xbf}, - // Block 0x4b, offset 0x19b - {value: 0x0000, lo: 0x01}, - {value: 0x4a9f, lo: 0x8f, hi: 0xa3}, - // Block 0x4c, offset 0x19d - {value: 0x0000, lo: 0x01}, - {value: 0x8100, lo: 0xae, hi: 0xbe}, - // Block 0x4d, offset 0x19f - {value: 0x0000, lo: 0x07}, - {value: 0x8100, lo: 0x84, hi: 0x84}, - {value: 0x8100, lo: 0x87, hi: 0x87}, - {value: 0x8100, lo: 0x90, hi: 0x90}, - {value: 0x8100, lo: 0x9e, hi: 0x9e}, - {value: 0x8100, lo: 0xa1, hi: 0xa1}, - {value: 0x8100, lo: 0xb2, hi: 0xb2}, - {value: 0x8100, lo: 0xbb, hi: 0xbb}, - // Block 0x4e, offset 0x1a7 - {value: 0x0000, lo: 0x03}, - {value: 0x8100, lo: 0x80, hi: 0x80}, - {value: 0x8100, lo: 0x8b, hi: 0x8b}, - {value: 0x8100, lo: 0x8e, hi: 0x8e}, - // Block 0x4f, offset 0x1ab - {value: 0x0000, lo: 0x02}, - {value: 0x8132, lo: 0xaf, hi: 0xaf}, - {value: 0x8132, lo: 0xb4, hi: 0xbd}, - // Block 0x50, offset 0x1ae - {value: 0x0000, lo: 0x01}, - {value: 0x8132, lo: 0x9e, hi: 0x9f}, - // Block 0x51, offset 0x1b0 - {value: 0x0000, lo: 0x01}, - {value: 0x8132, lo: 0xb0, hi: 0xb1}, - // Block 0x52, offset 0x1b2 - {value: 0x0000, lo: 0x01}, - {value: 0x8104, lo: 0x86, hi: 0x86}, - // Block 0x53, offset 0x1b4 - {value: 0x0000, lo: 0x02}, - {value: 0x8104, lo: 0x84, hi: 0x84}, - {value: 0x8132, lo: 0xa0, hi: 0xb1}, - // Block 0x54, offset 0x1b7 - {value: 0x0000, lo: 0x01}, - {value: 0x812d, lo: 0xab, hi: 0xad}, - // Block 0x55, offset 0x1b9 - {value: 0x0000, lo: 0x01}, - {value: 0x8104, lo: 0x93, hi: 0x93}, - // Block 0x56, offset 0x1bb - {value: 0x0000, lo: 0x01}, - {value: 0x8102, lo: 0xb3, hi: 0xb3}, - // Block 0x57, offset 0x1bd - {value: 0x0000, lo: 0x01}, - {value: 0x8104, lo: 0x80, hi: 0x80}, - // Block 0x58, offset 0x1bf - {value: 0x0000, lo: 0x05}, - {value: 0x8132, lo: 0xb0, hi: 0xb0}, - {value: 0x8132, lo: 0xb2, hi: 0xb3}, - {value: 0x812d, lo: 0xb4, hi: 0xb4}, - {value: 0x8132, lo: 0xb7, hi: 0xb8}, - {value: 0x8132, lo: 0xbe, hi: 0xbf}, - // Block 0x59, offset 0x1c5 - {value: 0x0000, lo: 0x02}, - {value: 0x8132, lo: 0x81, hi: 0x81}, - {value: 0x8104, lo: 0xb6, hi: 0xb6}, - // Block 0x5a, offset 0x1c8 - {value: 0x0000, lo: 0x01}, - {value: 0x8104, lo: 0xad, hi: 0xad}, - // Block 0x5b, offset 0x1ca - {value: 0x0000, lo: 0x06}, - {value: 0xe500, lo: 0x80, hi: 0x80}, - {value: 0xc600, lo: 0x81, hi: 0x9b}, - {value: 0xe500, lo: 0x9c, hi: 0x9c}, - {value: 0xc600, lo: 0x9d, hi: 0xb7}, - {value: 0xe500, lo: 0xb8, hi: 0xb8}, - {value: 0xc600, lo: 0xb9, hi: 0xbf}, - // Block 0x5c, offset 0x1d1 - {value: 0x0000, lo: 0x05}, - {value: 0xc600, lo: 0x80, hi: 0x93}, - {value: 0xe500, lo: 0x94, hi: 0x94}, - {value: 0xc600, lo: 0x95, hi: 0xaf}, - {value: 0xe500, lo: 0xb0, hi: 0xb0}, - {value: 0xc600, lo: 0xb1, hi: 0xbf}, - // Block 0x5d, offset 0x1d7 - {value: 0x0000, lo: 0x05}, - {value: 0xc600, lo: 0x80, hi: 0x8b}, - {value: 0xe500, lo: 0x8c, hi: 0x8c}, - {value: 0xc600, lo: 0x8d, hi: 0xa7}, - {value: 0xe500, lo: 0xa8, hi: 0xa8}, - {value: 0xc600, lo: 0xa9, hi: 0xbf}, - // Block 0x5e, offset 0x1dd - {value: 0x0000, lo: 0x07}, - {value: 0xc600, lo: 0x80, hi: 0x83}, - {value: 0xe500, lo: 0x84, hi: 0x84}, - {value: 0xc600, lo: 0x85, hi: 0x9f}, - {value: 0xe500, lo: 0xa0, hi: 0xa0}, - {value: 0xc600, lo: 0xa1, hi: 0xbb}, - {value: 0xe500, lo: 0xbc, hi: 0xbc}, - {value: 0xc600, lo: 0xbd, hi: 0xbf}, - // Block 0x5f, offset 0x1e5 - {value: 0x0000, lo: 0x05}, - {value: 0xc600, lo: 0x80, hi: 0x97}, - {value: 0xe500, lo: 0x98, hi: 0x98}, - {value: 0xc600, lo: 0x99, hi: 0xb3}, - {value: 0xe500, lo: 0xb4, hi: 0xb4}, - {value: 0xc600, lo: 0xb5, hi: 0xbf}, - // Block 0x60, offset 0x1eb - {value: 0x0000, lo: 0x05}, - {value: 0xc600, lo: 0x80, hi: 0x8f}, - {value: 0xe500, lo: 0x90, hi: 0x90}, - {value: 0xc600, lo: 0x91, hi: 0xab}, - {value: 0xe500, lo: 0xac, hi: 0xac}, - {value: 0xc600, lo: 0xad, hi: 0xbf}, - // Block 0x61, offset 0x1f1 - {value: 0x0000, lo: 0x05}, - {value: 0xc600, lo: 0x80, hi: 0x87}, - {value: 0xe500, lo: 0x88, hi: 0x88}, - {value: 0xc600, lo: 0x89, hi: 0xa3}, - {value: 0xe500, lo: 0xa4, hi: 0xa4}, - {value: 0xc600, lo: 0xa5, hi: 0xbf}, - // Block 0x62, offset 0x1f7 - {value: 0x0000, lo: 0x03}, - {value: 0xc600, lo: 0x80, hi: 0x87}, - {value: 0xe500, lo: 0x88, hi: 0x88}, - {value: 0xc600, lo: 0x89, hi: 0xa3}, - // Block 0x63, offset 0x1fb - {value: 0x0006, lo: 0x0d}, - {value: 0x4390, lo: 0x9d, hi: 0x9d}, - {value: 0x8115, lo: 0x9e, hi: 0x9e}, - {value: 0x4402, lo: 0x9f, hi: 0x9f}, - {value: 0x43f0, lo: 0xaa, hi: 0xab}, - {value: 0x44f4, lo: 0xac, hi: 0xac}, - {value: 0x44fc, lo: 0xad, hi: 0xad}, - {value: 0x4348, lo: 0xae, hi: 0xb1}, - {value: 0x4366, lo: 0xb2, hi: 0xb4}, - {value: 0x437e, lo: 0xb5, hi: 0xb6}, - {value: 0x438a, lo: 0xb8, hi: 0xb8}, - {value: 0x4396, lo: 0xb9, hi: 0xbb}, - {value: 0x43ae, lo: 0xbc, hi: 0xbc}, - {value: 0x43b4, lo: 0xbe, hi: 0xbe}, - // Block 0x64, offset 0x209 - {value: 0x0006, lo: 0x08}, - {value: 0x43ba, lo: 0x80, hi: 0x81}, - {value: 0x43c6, lo: 0x83, hi: 0x84}, - {value: 0x43d8, lo: 0x86, hi: 0x89}, - {value: 0x43fc, lo: 0x8a, hi: 0x8a}, - {value: 0x4378, lo: 0x8b, hi: 0x8b}, - {value: 0x4360, lo: 0x8c, hi: 0x8c}, - {value: 0x43a8, lo: 0x8d, hi: 0x8d}, - {value: 0x43d2, lo: 0x8e, hi: 0x8e}, - // Block 0x65, offset 0x212 - {value: 0x0000, lo: 0x02}, - {value: 0x8100, lo: 0xa4, hi: 0xa5}, - {value: 0x8100, lo: 0xb0, hi: 0xb1}, - // Block 0x66, offset 0x215 - {value: 0x0000, lo: 0x02}, - {value: 0x8100, lo: 0x9b, hi: 0x9d}, - {value: 0x8200, lo: 0x9e, hi: 0xa3}, - // Block 0x67, offset 0x218 - {value: 0x0000, lo: 0x01}, - {value: 0x8100, lo: 0x90, hi: 0x90}, - // Block 0x68, offset 0x21a - {value: 0x0000, lo: 0x02}, - {value: 0x8100, lo: 0x99, hi: 0x99}, - {value: 0x8200, lo: 0xb2, hi: 0xb4}, - // Block 0x69, offset 0x21d - {value: 0x0000, lo: 0x01}, - {value: 0x8100, lo: 0xbc, hi: 0xbd}, - // Block 0x6a, offset 0x21f - {value: 0x0000, lo: 0x03}, - {value: 0x8132, lo: 0xa0, hi: 0xa6}, - {value: 0x812d, lo: 0xa7, hi: 0xad}, - {value: 0x8132, lo: 0xae, hi: 0xaf}, - // Block 0x6b, offset 0x223 - {value: 0x0000, lo: 0x04}, - {value: 0x8100, lo: 0x89, hi: 0x8c}, - {value: 0x8100, lo: 0xb0, hi: 0xb2}, - {value: 0x8100, lo: 0xb4, hi: 0xb4}, - {value: 0x8100, lo: 0xb6, hi: 0xbf}, - // Block 0x6c, offset 0x228 - {value: 0x0000, lo: 0x01}, - {value: 0x8100, lo: 0x81, hi: 0x8c}, - // Block 0x6d, offset 0x22a - {value: 0x0000, lo: 0x01}, - {value: 0x8100, lo: 0xb5, hi: 0xba}, - // Block 0x6e, offset 0x22c - {value: 0x0000, lo: 0x04}, - {value: 0x4a9f, lo: 0x9e, hi: 0x9f}, - {value: 0x4a9f, lo: 0xa3, hi: 0xa3}, - {value: 0x4a9f, lo: 0xa5, hi: 0xa6}, - {value: 0x4a9f, lo: 0xaa, hi: 0xaf}, - // Block 0x6f, offset 0x231 - {value: 0x0000, lo: 0x05}, - {value: 0x4a9f, lo: 0x82, hi: 0x87}, - {value: 0x4a9f, lo: 0x8a, hi: 0x8f}, - {value: 0x4a9f, lo: 0x92, hi: 0x97}, - {value: 0x4a9f, lo: 0x9a, hi: 0x9c}, - {value: 0x8100, lo: 0xa3, hi: 0xa3}, - // Block 0x70, offset 0x237 - {value: 0x0000, lo: 0x01}, - {value: 0x812d, lo: 0xbd, hi: 0xbd}, - // Block 0x71, offset 0x239 - {value: 0x0000, lo: 0x01}, - {value: 0x812d, lo: 0xa0, hi: 0xa0}, - // Block 0x72, offset 0x23b - {value: 0x0000, lo: 0x01}, - {value: 0x8132, lo: 0xb6, hi: 0xba}, - // Block 0x73, offset 0x23d - {value: 0x002c, lo: 0x05}, - {value: 0x812d, lo: 0x8d, hi: 0x8d}, - {value: 0x8132, lo: 0x8f, hi: 0x8f}, - {value: 0x8132, lo: 0xb8, hi: 0xb8}, - {value: 0x8101, lo: 0xb9, hi: 0xba}, - {value: 0x8104, lo: 0xbf, hi: 0xbf}, - // Block 0x74, offset 0x243 - {value: 0x0000, lo: 0x02}, - {value: 0x8132, lo: 0xa5, hi: 0xa5}, - {value: 0x812d, lo: 0xa6, hi: 0xa6}, - // Block 0x75, offset 0x246 - {value: 0x0000, lo: 0x02}, - {value: 0x8104, lo: 0x86, hi: 0x86}, - {value: 0x8104, lo: 0xbf, hi: 0xbf}, - // Block 0x76, offset 0x249 - {value: 0x17fe, lo: 0x07}, - {value: 0xa000, lo: 0x99, hi: 0x99}, - {value: 0x4238, lo: 0x9a, hi: 0x9a}, - {value: 0xa000, lo: 0x9b, hi: 0x9b}, - {value: 0x4242, lo: 0x9c, hi: 0x9c}, - {value: 0xa000, lo: 0xa5, hi: 0xa5}, - {value: 0x424c, lo: 0xab, hi: 0xab}, - {value: 0x8104, lo: 0xb9, hi: 0xba}, - // Block 0x77, offset 0x251 - {value: 0x0000, lo: 0x06}, - {value: 0x8132, lo: 0x80, hi: 0x82}, - {value: 0x9900, lo: 0xa7, hi: 0xa7}, - {value: 0x2d7e, lo: 0xae, hi: 0xae}, - {value: 0x2d88, lo: 0xaf, hi: 0xaf}, - {value: 0xa000, lo: 0xb1, hi: 0xb2}, - {value: 0x8104, lo: 0xb3, hi: 0xb4}, - // Block 0x78, offset 0x258 - {value: 0x0000, lo: 0x02}, - {value: 0x8104, lo: 0x80, hi: 0x80}, - {value: 0x8102, lo: 0x8a, hi: 0x8a}, - // Block 0x79, offset 0x25b - {value: 0x0000, lo: 0x02}, - {value: 0x8104, lo: 0xb5, hi: 0xb5}, - {value: 0x8102, lo: 0xb6, hi: 0xb6}, - // Block 0x7a, offset 0x25e - {value: 0x0002, lo: 0x01}, - {value: 0x8102, lo: 0xa9, hi: 0xaa}, - // Block 0x7b, offset 0x260 - {value: 0x0000, lo: 0x07}, - {value: 0xa000, lo: 0x87, hi: 0x87}, - {value: 0x2d92, lo: 0x8b, hi: 0x8b}, - {value: 0x2d9c, lo: 0x8c, hi: 0x8c}, - {value: 0x8104, lo: 0x8d, hi: 0x8d}, - {value: 0x9900, lo: 0x97, hi: 0x97}, - {value: 0x8132, lo: 0xa6, hi: 0xac}, - {value: 0x8132, lo: 0xb0, hi: 0xb4}, - // Block 0x7c, offset 0x268 - {value: 0x0000, lo: 0x02}, - {value: 0x8104, lo: 0x82, hi: 0x82}, - {value: 0x8102, lo: 0x86, hi: 0x86}, - // Block 0x7d, offset 0x26b - {value: 0x6b5a, lo: 0x06}, - {value: 0x9900, lo: 0xb0, hi: 0xb0}, - {value: 0xa000, lo: 0xb9, hi: 0xb9}, - {value: 0x9900, lo: 0xba, hi: 0xba}, - {value: 0x2db0, lo: 0xbb, hi: 0xbb}, - {value: 0x2da6, lo: 0xbc, hi: 0xbd}, - {value: 0x2dba, lo: 0xbe, hi: 0xbe}, - // Block 0x7e, offset 0x272 - {value: 0x0000, lo: 0x02}, - {value: 0x8104, lo: 0x82, hi: 0x82}, - {value: 0x8102, lo: 0x83, hi: 0x83}, - // Block 0x7f, offset 0x275 - {value: 0x0000, lo: 0x05}, - {value: 0x9900, lo: 0xaf, hi: 0xaf}, - {value: 0xa000, lo: 0xb8, hi: 0xb9}, - {value: 0x2dc4, lo: 0xba, hi: 0xba}, - {value: 0x2dce, lo: 0xbb, hi: 0xbb}, - {value: 0x8104, lo: 0xbf, hi: 0xbf}, - // Block 0x80, offset 0x27b - {value: 0x0000, lo: 0x01}, - {value: 0x8102, lo: 0x80, hi: 0x80}, - // Block 0x81, offset 0x27d - {value: 0x0000, lo: 0x02}, - {value: 0x8104, lo: 0xb6, hi: 0xb6}, - {value: 0x8102, lo: 0xb7, hi: 0xb7}, - // Block 0x82, offset 0x280 - {value: 0x0000, lo: 0x01}, - {value: 0x8104, lo: 0xab, hi: 0xab}, - // Block 0x83, offset 0x282 - {value: 0x0000, lo: 0x01}, - {value: 0x8101, lo: 0xb0, hi: 0xb4}, - // Block 0x84, offset 0x284 - {value: 0x0000, lo: 0x01}, - {value: 0x8132, lo: 0xb0, hi: 0xb6}, - // Block 0x85, offset 0x286 - {value: 0x0000, lo: 0x01}, - {value: 0x8101, lo: 0x9e, hi: 0x9e}, - // Block 0x86, offset 0x288 - {value: 0x0000, lo: 0x0c}, - {value: 0x45cc, lo: 0x9e, hi: 0x9e}, - {value: 0x45d6, lo: 0x9f, hi: 0x9f}, - {value: 0x460a, lo: 0xa0, hi: 0xa0}, - {value: 0x4618, lo: 0xa1, hi: 0xa1}, - {value: 0x4626, lo: 0xa2, hi: 0xa2}, - {value: 0x4634, lo: 0xa3, hi: 0xa3}, - {value: 0x4642, lo: 0xa4, hi: 0xa4}, - {value: 0x812b, lo: 0xa5, hi: 0xa6}, - {value: 0x8101, lo: 0xa7, hi: 0xa9}, - {value: 0x8130, lo: 0xad, hi: 0xad}, - {value: 0x812b, lo: 0xae, hi: 0xb2}, - {value: 0x812d, lo: 0xbb, hi: 0xbf}, - // Block 0x87, offset 0x295 - {value: 0x0000, lo: 0x09}, - {value: 0x812d, lo: 0x80, hi: 0x82}, - {value: 0x8132, lo: 0x85, hi: 0x89}, - {value: 0x812d, lo: 0x8a, hi: 0x8b}, - {value: 0x8132, lo: 0xaa, hi: 0xad}, - {value: 0x45e0, lo: 0xbb, hi: 0xbb}, - {value: 0x45ea, lo: 0xbc, hi: 0xbc}, - {value: 0x4650, lo: 0xbd, hi: 0xbd}, - {value: 0x466c, lo: 0xbe, hi: 0xbe}, - {value: 0x465e, lo: 0xbf, hi: 0xbf}, - // Block 0x88, offset 0x29f - {value: 0x0000, lo: 0x01}, - {value: 0x467a, lo: 0x80, hi: 0x80}, - // Block 0x89, offset 0x2a1 - {value: 0x0000, lo: 0x01}, - {value: 0x8132, lo: 0x82, hi: 0x84}, - // Block 0x8a, offset 0x2a3 - {value: 0x0000, lo: 0x05}, - {value: 0x8132, lo: 0x80, hi: 0x86}, - {value: 0x8132, lo: 0x88, hi: 0x98}, - {value: 0x8132, lo: 0x9b, hi: 0xa1}, - {value: 0x8132, lo: 0xa3, hi: 0xa4}, - {value: 0x8132, lo: 0xa6, hi: 0xaa}, - // Block 0x8b, offset 0x2a9 - {value: 0x0000, lo: 0x01}, - {value: 0x812d, lo: 0x90, hi: 0x96}, - // Block 0x8c, offset 0x2ab - {value: 0x0000, lo: 0x02}, - {value: 0x8132, lo: 0x84, hi: 0x89}, - {value: 0x8102, lo: 0x8a, hi: 0x8a}, - // Block 0x8d, offset 0x2ae - {value: 0x0000, lo: 0x01}, - {value: 0x8100, lo: 0x93, hi: 0x93}, -} - -// lookup returns the trie value for the first UTF-8 encoding in s and -// the width in bytes of this encoding. The size will be 0 if s does not -// hold enough bytes to complete the encoding. len(s) must be greater than 0. -func (t *nfkcTrie) lookup(s []byte) (v uint16, sz int) { - c0 := s[0] - switch { - case c0 < 0x80: // is ASCII - return nfkcValues[c0], 1 - case c0 < 0xC2: - return 0, 1 // Illegal UTF-8: not a starter, not ASCII. - case c0 < 0xE0: // 2-byte UTF-8 - if len(s) < 2 { - return 0, 0 - } - i := nfkcIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c1), 2 - case c0 < 0xF0: // 3-byte UTF-8 - if len(s) < 3 { - return 0, 0 - } - i := nfkcIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - o := uint32(i)<<6 + uint32(c1) - i = nfkcIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return 0, 2 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c2), 3 - case c0 < 0xF8: // 4-byte UTF-8 - if len(s) < 4 { - return 0, 0 - } - i := nfkcIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - o := uint32(i)<<6 + uint32(c1) - i = nfkcIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return 0, 2 // Illegal UTF-8: not a continuation byte. - } - o = uint32(i)<<6 + uint32(c2) - i = nfkcIndex[o] - c3 := s[3] - if c3 < 0x80 || 0xC0 <= c3 { - return 0, 3 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c3), 4 - } - // Illegal rune - return 0, 1 -} - -// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. -// s must start with a full and valid UTF-8 encoded rune. -func (t *nfkcTrie) lookupUnsafe(s []byte) uint16 { - c0 := s[0] - if c0 < 0x80 { // is ASCII - return nfkcValues[c0] - } - i := nfkcIndex[c0] - if c0 < 0xE0 { // 2-byte UTF-8 - return t.lookupValue(uint32(i), s[1]) - } - i = nfkcIndex[uint32(i)<<6+uint32(s[1])] - if c0 < 0xF0 { // 3-byte UTF-8 - return t.lookupValue(uint32(i), s[2]) - } - i = nfkcIndex[uint32(i)<<6+uint32(s[2])] - if c0 < 0xF8 { // 4-byte UTF-8 - return t.lookupValue(uint32(i), s[3]) - } - return 0 -} - -// lookupString returns the trie value for the first UTF-8 encoding in s and -// the width in bytes of this encoding. The size will be 0 if s does not -// hold enough bytes to complete the encoding. len(s) must be greater than 0. -func (t *nfkcTrie) lookupString(s string) (v uint16, sz int) { - c0 := s[0] - switch { - case c0 < 0x80: // is ASCII - return nfkcValues[c0], 1 - case c0 < 0xC2: - return 0, 1 // Illegal UTF-8: not a starter, not ASCII. - case c0 < 0xE0: // 2-byte UTF-8 - if len(s) < 2 { - return 0, 0 - } - i := nfkcIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c1), 2 - case c0 < 0xF0: // 3-byte UTF-8 - if len(s) < 3 { - return 0, 0 - } - i := nfkcIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - o := uint32(i)<<6 + uint32(c1) - i = nfkcIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return 0, 2 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c2), 3 - case c0 < 0xF8: // 4-byte UTF-8 - if len(s) < 4 { - return 0, 0 - } - i := nfkcIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - o := uint32(i)<<6 + uint32(c1) - i = nfkcIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return 0, 2 // Illegal UTF-8: not a continuation byte. - } - o = uint32(i)<<6 + uint32(c2) - i = nfkcIndex[o] - c3 := s[3] - if c3 < 0x80 || 0xC0 <= c3 { - return 0, 3 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c3), 4 - } - // Illegal rune - return 0, 1 -} - -// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. -// s must start with a full and valid UTF-8 encoded rune. -func (t *nfkcTrie) lookupStringUnsafe(s string) uint16 { - c0 := s[0] - if c0 < 0x80 { // is ASCII - return nfkcValues[c0] - } - i := nfkcIndex[c0] - if c0 < 0xE0 { // 2-byte UTF-8 - return t.lookupValue(uint32(i), s[1]) - } - i = nfkcIndex[uint32(i)<<6+uint32(s[1])] - if c0 < 0xF0 { // 3-byte UTF-8 - return t.lookupValue(uint32(i), s[2]) - } - i = nfkcIndex[uint32(i)<<6+uint32(s[2])] - if c0 < 0xF8 { // 4-byte UTF-8 - return t.lookupValue(uint32(i), s[3]) - } - return 0 -} - -// nfkcTrie. Total size: 16994 bytes (16.60 KiB). Checksum: c3ed54ee046f3c46. -type nfkcTrie struct{} - -func newNfkcTrie(i int) *nfkcTrie { - return &nfkcTrie{} -} - -// lookupValue determines the type of block n and looks up the value for b. -func (t *nfkcTrie) lookupValue(n uint32, b byte) uint16 { - switch { - case n < 90: - return uint16(nfkcValues[n<<6+uint32(b)]) - default: - n -= 90 - return uint16(nfkcSparse.lookup(n, b)) - } -} - -// nfkcValues: 92 blocks, 5888 entries, 11776 bytes -// The third block is the zero block. -var nfkcValues = [5888]uint16{ - // Block 0x0, offset 0x0 - 0x3c: 0xa000, 0x3d: 0xa000, 0x3e: 0xa000, - // Block 0x1, offset 0x40 - 0x41: 0xa000, 0x42: 0xa000, 0x43: 0xa000, 0x44: 0xa000, 0x45: 0xa000, - 0x46: 0xa000, 0x47: 0xa000, 0x48: 0xa000, 0x49: 0xa000, 0x4a: 0xa000, 0x4b: 0xa000, - 0x4c: 0xa000, 0x4d: 0xa000, 0x4e: 0xa000, 0x4f: 0xa000, 0x50: 0xa000, - 0x52: 0xa000, 0x53: 0xa000, 0x54: 0xa000, 0x55: 0xa000, 0x56: 0xa000, 0x57: 0xa000, - 0x58: 0xa000, 0x59: 0xa000, 0x5a: 0xa000, - 0x61: 0xa000, 0x62: 0xa000, 0x63: 0xa000, - 0x64: 0xa000, 0x65: 0xa000, 0x66: 0xa000, 0x67: 0xa000, 0x68: 0xa000, 0x69: 0xa000, - 0x6a: 0xa000, 0x6b: 0xa000, 0x6c: 0xa000, 0x6d: 0xa000, 0x6e: 0xa000, 0x6f: 0xa000, - 0x70: 0xa000, 0x72: 0xa000, 0x73: 0xa000, 0x74: 0xa000, 0x75: 0xa000, - 0x76: 0xa000, 0x77: 0xa000, 0x78: 0xa000, 0x79: 0xa000, 0x7a: 0xa000, - // Block 0x2, offset 0x80 - // Block 0x3, offset 0xc0 - 0xc0: 0x2f6f, 0xc1: 0x2f74, 0xc2: 0x4688, 0xc3: 0x2f79, 0xc4: 0x4697, 0xc5: 0x469c, - 0xc6: 0xa000, 0xc7: 0x46a6, 0xc8: 0x2fe2, 0xc9: 0x2fe7, 0xca: 0x46ab, 0xcb: 0x2ffb, - 0xcc: 0x306e, 0xcd: 0x3073, 0xce: 0x3078, 0xcf: 0x46bf, 0xd1: 0x3104, - 0xd2: 0x3127, 0xd3: 0x312c, 0xd4: 0x46c9, 0xd5: 0x46ce, 0xd6: 0x46dd, - 0xd8: 0xa000, 0xd9: 0x31b3, 0xda: 0x31b8, 0xdb: 0x31bd, 0xdc: 0x470f, 0xdd: 0x3235, - 0xe0: 0x327b, 0xe1: 0x3280, 0xe2: 0x4719, 0xe3: 0x3285, - 0xe4: 0x4728, 0xe5: 0x472d, 0xe6: 0xa000, 0xe7: 0x4737, 0xe8: 0x32ee, 0xe9: 0x32f3, - 0xea: 0x473c, 0xeb: 0x3307, 0xec: 0x337f, 0xed: 0x3384, 0xee: 0x3389, 0xef: 0x4750, - 0xf1: 0x3415, 0xf2: 0x3438, 0xf3: 0x343d, 0xf4: 0x475a, 0xf5: 0x475f, - 0xf6: 0x476e, 0xf8: 0xa000, 0xf9: 0x34c9, 0xfa: 0x34ce, 0xfb: 0x34d3, - 0xfc: 0x47a0, 0xfd: 0x3550, 0xff: 0x3569, - // Block 0x4, offset 0x100 - 0x100: 0x2f7e, 0x101: 0x328a, 0x102: 0x468d, 0x103: 0x471e, 0x104: 0x2f9c, 0x105: 0x32a8, - 0x106: 0x2fb0, 0x107: 0x32bc, 0x108: 0x2fb5, 0x109: 0x32c1, 0x10a: 0x2fba, 0x10b: 0x32c6, - 0x10c: 0x2fbf, 0x10d: 0x32cb, 0x10e: 0x2fc9, 0x10f: 0x32d5, - 0x112: 0x46b0, 0x113: 0x4741, 0x114: 0x2ff1, 0x115: 0x32fd, 0x116: 0x2ff6, 0x117: 0x3302, - 0x118: 0x3014, 0x119: 0x3320, 0x11a: 0x3005, 0x11b: 0x3311, 0x11c: 0x302d, 0x11d: 0x3339, - 0x11e: 0x3037, 0x11f: 0x3343, 0x120: 0x303c, 0x121: 0x3348, 0x122: 0x3046, 0x123: 0x3352, - 0x124: 0x304b, 0x125: 0x3357, 0x128: 0x307d, 0x129: 0x338e, - 0x12a: 0x3082, 0x12b: 0x3393, 0x12c: 0x3087, 0x12d: 0x3398, 0x12e: 0x30aa, 0x12f: 0x33b6, - 0x130: 0x308c, 0x132: 0x195d, 0x133: 0x19e7, 0x134: 0x30b4, 0x135: 0x33c0, - 0x136: 0x30c8, 0x137: 0x33d9, 0x139: 0x30d2, 0x13a: 0x33e3, 0x13b: 0x30dc, - 0x13c: 0x33ed, 0x13d: 0x30d7, 0x13e: 0x33e8, 0x13f: 0x1bac, - // Block 0x5, offset 0x140 - 0x140: 0x1c34, 0x143: 0x30ff, 0x144: 0x3410, 0x145: 0x3118, - 0x146: 0x3429, 0x147: 0x310e, 0x148: 0x341f, 0x149: 0x1c5c, - 0x14c: 0x46d3, 0x14d: 0x4764, 0x14e: 0x3131, 0x14f: 0x3442, 0x150: 0x313b, 0x151: 0x344c, - 0x154: 0x3159, 0x155: 0x346a, 0x156: 0x3172, 0x157: 0x3483, - 0x158: 0x3163, 0x159: 0x3474, 0x15a: 0x46f6, 0x15b: 0x4787, 0x15c: 0x317c, 0x15d: 0x348d, - 0x15e: 0x318b, 0x15f: 0x349c, 0x160: 0x46fb, 0x161: 0x478c, 0x162: 0x31a4, 0x163: 0x34ba, - 0x164: 0x3195, 0x165: 0x34ab, 0x168: 0x4705, 0x169: 0x4796, - 0x16a: 0x470a, 0x16b: 0x479b, 0x16c: 0x31c2, 0x16d: 0x34d8, 0x16e: 0x31cc, 0x16f: 0x34e2, - 0x170: 0x31d1, 0x171: 0x34e7, 0x172: 0x31ef, 0x173: 0x3505, 0x174: 0x3212, 0x175: 0x3528, - 0x176: 0x323a, 0x177: 0x3555, 0x178: 0x324e, 0x179: 0x325d, 0x17a: 0x357d, 0x17b: 0x3267, - 0x17c: 0x3587, 0x17d: 0x326c, 0x17e: 0x358c, 0x17f: 0x00a7, - // Block 0x6, offset 0x180 - 0x184: 0x2dee, 0x185: 0x2df4, - 0x186: 0x2dfa, 0x187: 0x1972, 0x188: 0x1975, 0x189: 0x1a08, 0x18a: 0x1987, 0x18b: 0x198a, - 0x18c: 0x1a3e, 0x18d: 0x2f88, 0x18e: 0x3294, 0x18f: 0x3096, 0x190: 0x33a2, 0x191: 0x3140, - 0x192: 0x3451, 0x193: 0x31d6, 0x194: 0x34ec, 0x195: 0x39cf, 0x196: 0x3b5e, 0x197: 0x39c8, - 0x198: 0x3b57, 0x199: 0x39d6, 0x19a: 0x3b65, 0x19b: 0x39c1, 0x19c: 0x3b50, - 0x19e: 0x38b0, 0x19f: 0x3a3f, 0x1a0: 0x38a9, 0x1a1: 0x3a38, 0x1a2: 0x35b3, 0x1a3: 0x35c5, - 0x1a6: 0x3041, 0x1a7: 0x334d, 0x1a8: 0x30be, 0x1a9: 0x33cf, - 0x1aa: 0x46ec, 0x1ab: 0x477d, 0x1ac: 0x3990, 0x1ad: 0x3b1f, 0x1ae: 0x35d7, 0x1af: 0x35dd, - 0x1b0: 0x33c5, 0x1b1: 0x1942, 0x1b2: 0x1945, 0x1b3: 0x19cf, 0x1b4: 0x3028, 0x1b5: 0x3334, - 0x1b8: 0x30fa, 0x1b9: 0x340b, 0x1ba: 0x38b7, 0x1bb: 0x3a46, - 0x1bc: 0x35ad, 0x1bd: 0x35bf, 0x1be: 0x35b9, 0x1bf: 0x35cb, - // Block 0x7, offset 0x1c0 - 0x1c0: 0x2f8d, 0x1c1: 0x3299, 0x1c2: 0x2f92, 0x1c3: 0x329e, 0x1c4: 0x300a, 0x1c5: 0x3316, - 0x1c6: 0x300f, 0x1c7: 0x331b, 0x1c8: 0x309b, 0x1c9: 0x33a7, 0x1ca: 0x30a0, 0x1cb: 0x33ac, - 0x1cc: 0x3145, 0x1cd: 0x3456, 0x1ce: 0x314a, 0x1cf: 0x345b, 0x1d0: 0x3168, 0x1d1: 0x3479, - 0x1d2: 0x316d, 0x1d3: 0x347e, 0x1d4: 0x31db, 0x1d5: 0x34f1, 0x1d6: 0x31e0, 0x1d7: 0x34f6, - 0x1d8: 0x3186, 0x1d9: 0x3497, 0x1da: 0x319f, 0x1db: 0x34b5, - 0x1de: 0x305a, 0x1df: 0x3366, - 0x1e6: 0x4692, 0x1e7: 0x4723, 0x1e8: 0x46ba, 0x1e9: 0x474b, - 0x1ea: 0x395f, 0x1eb: 0x3aee, 0x1ec: 0x393c, 0x1ed: 0x3acb, 0x1ee: 0x46d8, 0x1ef: 0x4769, - 0x1f0: 0x3958, 0x1f1: 0x3ae7, 0x1f2: 0x3244, 0x1f3: 0x355f, - // Block 0x8, offset 0x200 - 0x200: 0x9932, 0x201: 0x9932, 0x202: 0x9932, 0x203: 0x9932, 0x204: 0x9932, 0x205: 0x8132, - 0x206: 0x9932, 0x207: 0x9932, 0x208: 0x9932, 0x209: 0x9932, 0x20a: 0x9932, 0x20b: 0x9932, - 0x20c: 0x9932, 0x20d: 0x8132, 0x20e: 0x8132, 0x20f: 0x9932, 0x210: 0x8132, 0x211: 0x9932, - 0x212: 0x8132, 0x213: 0x9932, 0x214: 0x9932, 0x215: 0x8133, 0x216: 0x812d, 0x217: 0x812d, - 0x218: 0x812d, 0x219: 0x812d, 0x21a: 0x8133, 0x21b: 0x992b, 0x21c: 0x812d, 0x21d: 0x812d, - 0x21e: 0x812d, 0x21f: 0x812d, 0x220: 0x812d, 0x221: 0x8129, 0x222: 0x8129, 0x223: 0x992d, - 0x224: 0x992d, 0x225: 0x992d, 0x226: 0x992d, 0x227: 0x9929, 0x228: 0x9929, 0x229: 0x812d, - 0x22a: 0x812d, 0x22b: 0x812d, 0x22c: 0x812d, 0x22d: 0x992d, 0x22e: 0x992d, 0x22f: 0x812d, - 0x230: 0x992d, 0x231: 0x992d, 0x232: 0x812d, 0x233: 0x812d, 0x234: 0x8101, 0x235: 0x8101, - 0x236: 0x8101, 0x237: 0x8101, 0x238: 0x9901, 0x239: 0x812d, 0x23a: 0x812d, 0x23b: 0x812d, - 0x23c: 0x812d, 0x23d: 0x8132, 0x23e: 0x8132, 0x23f: 0x8132, - // Block 0x9, offset 0x240 - 0x240: 0x49ae, 0x241: 0x49b3, 0x242: 0x9932, 0x243: 0x49b8, 0x244: 0x4a71, 0x245: 0x9936, - 0x246: 0x8132, 0x247: 0x812d, 0x248: 0x812d, 0x249: 0x812d, 0x24a: 0x8132, 0x24b: 0x8132, - 0x24c: 0x8132, 0x24d: 0x812d, 0x24e: 0x812d, 0x250: 0x8132, 0x251: 0x8132, - 0x252: 0x8132, 0x253: 0x812d, 0x254: 0x812d, 0x255: 0x812d, 0x256: 0x812d, 0x257: 0x8132, - 0x258: 0x8133, 0x259: 0x812d, 0x25a: 0x812d, 0x25b: 0x8132, 0x25c: 0x8134, 0x25d: 0x8135, - 0x25e: 0x8135, 0x25f: 0x8134, 0x260: 0x8135, 0x261: 0x8135, 0x262: 0x8134, 0x263: 0x8132, - 0x264: 0x8132, 0x265: 0x8132, 0x266: 0x8132, 0x267: 0x8132, 0x268: 0x8132, 0x269: 0x8132, - 0x26a: 0x8132, 0x26b: 0x8132, 0x26c: 0x8132, 0x26d: 0x8132, 0x26e: 0x8132, 0x26f: 0x8132, - 0x274: 0x0170, - 0x27a: 0x42a5, - 0x27e: 0x0037, - // Block 0xa, offset 0x280 - 0x284: 0x425a, 0x285: 0x447b, - 0x286: 0x35e9, 0x287: 0x00ce, 0x288: 0x3607, 0x289: 0x3613, 0x28a: 0x3625, - 0x28c: 0x3643, 0x28e: 0x3655, 0x28f: 0x3673, 0x290: 0x3e08, 0x291: 0xa000, - 0x295: 0xa000, 0x297: 0xa000, - 0x299: 0xa000, - 0x29f: 0xa000, 0x2a1: 0xa000, - 0x2a5: 0xa000, 0x2a9: 0xa000, - 0x2aa: 0x3637, 0x2ab: 0x3667, 0x2ac: 0x47fe, 0x2ad: 0x3697, 0x2ae: 0x4828, 0x2af: 0x36a9, - 0x2b0: 0x3e70, 0x2b1: 0xa000, 0x2b5: 0xa000, - 0x2b7: 0xa000, 0x2b9: 0xa000, - 0x2bf: 0xa000, - // Block 0xb, offset 0x2c0 - 0x2c1: 0xa000, 0x2c5: 0xa000, - 0x2c9: 0xa000, 0x2ca: 0x4840, 0x2cb: 0x485e, - 0x2cc: 0x36c7, 0x2cd: 0x36df, 0x2ce: 0x4876, 0x2d0: 0x01be, 0x2d1: 0x01d0, - 0x2d2: 0x01ac, 0x2d3: 0x430c, 0x2d4: 0x4312, 0x2d5: 0x01fa, 0x2d6: 0x01e8, - 0x2f0: 0x01d6, 0x2f1: 0x01eb, 0x2f2: 0x01ee, 0x2f4: 0x0188, 0x2f5: 0x01c7, - 0x2f9: 0x01a6, - // Block 0xc, offset 0x300 - 0x300: 0x3721, 0x301: 0x372d, 0x303: 0x371b, - 0x306: 0xa000, 0x307: 0x3709, - 0x30c: 0x375d, 0x30d: 0x3745, 0x30e: 0x376f, 0x310: 0xa000, - 0x313: 0xa000, 0x315: 0xa000, 0x316: 0xa000, 0x317: 0xa000, - 0x318: 0xa000, 0x319: 0x3751, 0x31a: 0xa000, - 0x31e: 0xa000, 0x323: 0xa000, - 0x327: 0xa000, - 0x32b: 0xa000, 0x32d: 0xa000, - 0x330: 0xa000, 0x333: 0xa000, 0x335: 0xa000, - 0x336: 0xa000, 0x337: 0xa000, 0x338: 0xa000, 0x339: 0x37d5, 0x33a: 0xa000, - 0x33e: 0xa000, - // Block 0xd, offset 0x340 - 0x341: 0x3733, 0x342: 0x37b7, - 0x350: 0x370f, 0x351: 0x3793, - 0x352: 0x3715, 0x353: 0x3799, 0x356: 0x3727, 0x357: 0x37ab, - 0x358: 0xa000, 0x359: 0xa000, 0x35a: 0x3829, 0x35b: 0x382f, 0x35c: 0x3739, 0x35d: 0x37bd, - 0x35e: 0x373f, 0x35f: 0x37c3, 0x362: 0x374b, 0x363: 0x37cf, - 0x364: 0x3757, 0x365: 0x37db, 0x366: 0x3763, 0x367: 0x37e7, 0x368: 0xa000, 0x369: 0xa000, - 0x36a: 0x3835, 0x36b: 0x383b, 0x36c: 0x378d, 0x36d: 0x3811, 0x36e: 0x3769, 0x36f: 0x37ed, - 0x370: 0x3775, 0x371: 0x37f9, 0x372: 0x377b, 0x373: 0x37ff, 0x374: 0x3781, 0x375: 0x3805, - 0x378: 0x3787, 0x379: 0x380b, - // Block 0xe, offset 0x380 - 0x387: 0x1d61, - 0x391: 0x812d, - 0x392: 0x8132, 0x393: 0x8132, 0x394: 0x8132, 0x395: 0x8132, 0x396: 0x812d, 0x397: 0x8132, - 0x398: 0x8132, 0x399: 0x8132, 0x39a: 0x812e, 0x39b: 0x812d, 0x39c: 0x8132, 0x39d: 0x8132, - 0x39e: 0x8132, 0x39f: 0x8132, 0x3a0: 0x8132, 0x3a1: 0x8132, 0x3a2: 0x812d, 0x3a3: 0x812d, - 0x3a4: 0x812d, 0x3a5: 0x812d, 0x3a6: 0x812d, 0x3a7: 0x812d, 0x3a8: 0x8132, 0x3a9: 0x8132, - 0x3aa: 0x812d, 0x3ab: 0x8132, 0x3ac: 0x8132, 0x3ad: 0x812e, 0x3ae: 0x8131, 0x3af: 0x8132, - 0x3b0: 0x8105, 0x3b1: 0x8106, 0x3b2: 0x8107, 0x3b3: 0x8108, 0x3b4: 0x8109, 0x3b5: 0x810a, - 0x3b6: 0x810b, 0x3b7: 0x810c, 0x3b8: 0x810d, 0x3b9: 0x810e, 0x3ba: 0x810e, 0x3bb: 0x810f, - 0x3bc: 0x8110, 0x3bd: 0x8111, 0x3bf: 0x8112, - // Block 0xf, offset 0x3c0 - 0x3c8: 0xa000, 0x3ca: 0xa000, 0x3cb: 0x8116, - 0x3cc: 0x8117, 0x3cd: 0x8118, 0x3ce: 0x8119, 0x3cf: 0x811a, 0x3d0: 0x811b, 0x3d1: 0x811c, - 0x3d2: 0x811d, 0x3d3: 0x9932, 0x3d4: 0x9932, 0x3d5: 0x992d, 0x3d6: 0x812d, 0x3d7: 0x8132, - 0x3d8: 0x8132, 0x3d9: 0x8132, 0x3da: 0x8132, 0x3db: 0x8132, 0x3dc: 0x812d, 0x3dd: 0x8132, - 0x3de: 0x8132, 0x3df: 0x812d, - 0x3f0: 0x811e, 0x3f5: 0x1d84, - 0x3f6: 0x2013, 0x3f7: 0x204f, 0x3f8: 0x204a, - // Block 0x10, offset 0x400 - 0x405: 0xa000, - 0x406: 0x2d26, 0x407: 0xa000, 0x408: 0x2d2e, 0x409: 0xa000, 0x40a: 0x2d36, 0x40b: 0xa000, - 0x40c: 0x2d3e, 0x40d: 0xa000, 0x40e: 0x2d46, 0x411: 0xa000, - 0x412: 0x2d4e, - 0x434: 0x8102, 0x435: 0x9900, - 0x43a: 0xa000, 0x43b: 0x2d56, - 0x43c: 0xa000, 0x43d: 0x2d5e, 0x43e: 0xa000, 0x43f: 0xa000, - // Block 0x11, offset 0x440 - 0x440: 0x0069, 0x441: 0x006b, 0x442: 0x006f, 0x443: 0x0083, 0x444: 0x00f5, 0x445: 0x00f8, - 0x446: 0x0413, 0x447: 0x0085, 0x448: 0x0089, 0x449: 0x008b, 0x44a: 0x0104, 0x44b: 0x0107, - 0x44c: 0x010a, 0x44d: 0x008f, 0x44f: 0x0097, 0x450: 0x009b, 0x451: 0x00e0, - 0x452: 0x009f, 0x453: 0x00fe, 0x454: 0x0417, 0x455: 0x041b, 0x456: 0x00a1, 0x457: 0x00a9, - 0x458: 0x00ab, 0x459: 0x0423, 0x45a: 0x012b, 0x45b: 0x00ad, 0x45c: 0x0427, 0x45d: 0x01be, - 0x45e: 0x01c1, 0x45f: 0x01c4, 0x460: 0x01fa, 0x461: 0x01fd, 0x462: 0x0093, 0x463: 0x00a5, - 0x464: 0x00ab, 0x465: 0x00ad, 0x466: 0x01be, 0x467: 0x01c1, 0x468: 0x01eb, 0x469: 0x01fa, - 0x46a: 0x01fd, - 0x478: 0x020c, - // Block 0x12, offset 0x480 - 0x49b: 0x00fb, 0x49c: 0x0087, 0x49d: 0x0101, - 0x49e: 0x00d4, 0x49f: 0x010a, 0x4a0: 0x008d, 0x4a1: 0x010d, 0x4a2: 0x0110, 0x4a3: 0x0116, - 0x4a4: 0x011c, 0x4a5: 0x011f, 0x4a6: 0x0122, 0x4a7: 0x042b, 0x4a8: 0x016a, 0x4a9: 0x0128, - 0x4aa: 0x042f, 0x4ab: 0x016d, 0x4ac: 0x0131, 0x4ad: 0x012e, 0x4ae: 0x0134, 0x4af: 0x0137, - 0x4b0: 0x013a, 0x4b1: 0x013d, 0x4b2: 0x0140, 0x4b3: 0x014c, 0x4b4: 0x014f, 0x4b5: 0x00ec, - 0x4b6: 0x0152, 0x4b7: 0x0155, 0x4b8: 0x041f, 0x4b9: 0x0158, 0x4ba: 0x015b, 0x4bb: 0x00b5, - 0x4bc: 0x015e, 0x4bd: 0x0161, 0x4be: 0x0164, 0x4bf: 0x01d0, - // Block 0x13, offset 0x4c0 - 0x4c0: 0x2f97, 0x4c1: 0x32a3, 0x4c2: 0x2fa1, 0x4c3: 0x32ad, 0x4c4: 0x2fa6, 0x4c5: 0x32b2, - 0x4c6: 0x2fab, 0x4c7: 0x32b7, 0x4c8: 0x38cc, 0x4c9: 0x3a5b, 0x4ca: 0x2fc4, 0x4cb: 0x32d0, - 0x4cc: 0x2fce, 0x4cd: 0x32da, 0x4ce: 0x2fdd, 0x4cf: 0x32e9, 0x4d0: 0x2fd3, 0x4d1: 0x32df, - 0x4d2: 0x2fd8, 0x4d3: 0x32e4, 0x4d4: 0x38ef, 0x4d5: 0x3a7e, 0x4d6: 0x38f6, 0x4d7: 0x3a85, - 0x4d8: 0x3019, 0x4d9: 0x3325, 0x4da: 0x301e, 0x4db: 0x332a, 0x4dc: 0x3904, 0x4dd: 0x3a93, - 0x4de: 0x3023, 0x4df: 0x332f, 0x4e0: 0x3032, 0x4e1: 0x333e, 0x4e2: 0x3050, 0x4e3: 0x335c, - 0x4e4: 0x305f, 0x4e5: 0x336b, 0x4e6: 0x3055, 0x4e7: 0x3361, 0x4e8: 0x3064, 0x4e9: 0x3370, - 0x4ea: 0x3069, 0x4eb: 0x3375, 0x4ec: 0x30af, 0x4ed: 0x33bb, 0x4ee: 0x390b, 0x4ef: 0x3a9a, - 0x4f0: 0x30b9, 0x4f1: 0x33ca, 0x4f2: 0x30c3, 0x4f3: 0x33d4, 0x4f4: 0x30cd, 0x4f5: 0x33de, - 0x4f6: 0x46c4, 0x4f7: 0x4755, 0x4f8: 0x3912, 0x4f9: 0x3aa1, 0x4fa: 0x30e6, 0x4fb: 0x33f7, - 0x4fc: 0x30e1, 0x4fd: 0x33f2, 0x4fe: 0x30eb, 0x4ff: 0x33fc, - // Block 0x14, offset 0x500 - 0x500: 0x30f0, 0x501: 0x3401, 0x502: 0x30f5, 0x503: 0x3406, 0x504: 0x3109, 0x505: 0x341a, - 0x506: 0x3113, 0x507: 0x3424, 0x508: 0x3122, 0x509: 0x3433, 0x50a: 0x311d, 0x50b: 0x342e, - 0x50c: 0x3935, 0x50d: 0x3ac4, 0x50e: 0x3943, 0x50f: 0x3ad2, 0x510: 0x394a, 0x511: 0x3ad9, - 0x512: 0x3951, 0x513: 0x3ae0, 0x514: 0x314f, 0x515: 0x3460, 0x516: 0x3154, 0x517: 0x3465, - 0x518: 0x315e, 0x519: 0x346f, 0x51a: 0x46f1, 0x51b: 0x4782, 0x51c: 0x3997, 0x51d: 0x3b26, - 0x51e: 0x3177, 0x51f: 0x3488, 0x520: 0x3181, 0x521: 0x3492, 0x522: 0x4700, 0x523: 0x4791, - 0x524: 0x399e, 0x525: 0x3b2d, 0x526: 0x39a5, 0x527: 0x3b34, 0x528: 0x39ac, 0x529: 0x3b3b, - 0x52a: 0x3190, 0x52b: 0x34a1, 0x52c: 0x319a, 0x52d: 0x34b0, 0x52e: 0x31ae, 0x52f: 0x34c4, - 0x530: 0x31a9, 0x531: 0x34bf, 0x532: 0x31ea, 0x533: 0x3500, 0x534: 0x31f9, 0x535: 0x350f, - 0x536: 0x31f4, 0x537: 0x350a, 0x538: 0x39b3, 0x539: 0x3b42, 0x53a: 0x39ba, 0x53b: 0x3b49, - 0x53c: 0x31fe, 0x53d: 0x3514, 0x53e: 0x3203, 0x53f: 0x3519, - // Block 0x15, offset 0x540 - 0x540: 0x3208, 0x541: 0x351e, 0x542: 0x320d, 0x543: 0x3523, 0x544: 0x321c, 0x545: 0x3532, - 0x546: 0x3217, 0x547: 0x352d, 0x548: 0x3221, 0x549: 0x353c, 0x54a: 0x3226, 0x54b: 0x3541, - 0x54c: 0x322b, 0x54d: 0x3546, 0x54e: 0x3249, 0x54f: 0x3564, 0x550: 0x3262, 0x551: 0x3582, - 0x552: 0x3271, 0x553: 0x3591, 0x554: 0x3276, 0x555: 0x3596, 0x556: 0x337a, 0x557: 0x34a6, - 0x558: 0x3537, 0x559: 0x3573, 0x55a: 0x1be0, 0x55b: 0x42d7, - 0x560: 0x46a1, 0x561: 0x4732, 0x562: 0x2f83, 0x563: 0x328f, - 0x564: 0x3878, 0x565: 0x3a07, 0x566: 0x3871, 0x567: 0x3a00, 0x568: 0x3886, 0x569: 0x3a15, - 0x56a: 0x387f, 0x56b: 0x3a0e, 0x56c: 0x38be, 0x56d: 0x3a4d, 0x56e: 0x3894, 0x56f: 0x3a23, - 0x570: 0x388d, 0x571: 0x3a1c, 0x572: 0x38a2, 0x573: 0x3a31, 0x574: 0x389b, 0x575: 0x3a2a, - 0x576: 0x38c5, 0x577: 0x3a54, 0x578: 0x46b5, 0x579: 0x4746, 0x57a: 0x3000, 0x57b: 0x330c, - 0x57c: 0x2fec, 0x57d: 0x32f8, 0x57e: 0x38da, 0x57f: 0x3a69, - // Block 0x16, offset 0x580 - 0x580: 0x38d3, 0x581: 0x3a62, 0x582: 0x38e8, 0x583: 0x3a77, 0x584: 0x38e1, 0x585: 0x3a70, - 0x586: 0x38fd, 0x587: 0x3a8c, 0x588: 0x3091, 0x589: 0x339d, 0x58a: 0x30a5, 0x58b: 0x33b1, - 0x58c: 0x46e7, 0x58d: 0x4778, 0x58e: 0x3136, 0x58f: 0x3447, 0x590: 0x3920, 0x591: 0x3aaf, - 0x592: 0x3919, 0x593: 0x3aa8, 0x594: 0x392e, 0x595: 0x3abd, 0x596: 0x3927, 0x597: 0x3ab6, - 0x598: 0x3989, 0x599: 0x3b18, 0x59a: 0x396d, 0x59b: 0x3afc, 0x59c: 0x3966, 0x59d: 0x3af5, - 0x59e: 0x397b, 0x59f: 0x3b0a, 0x5a0: 0x3974, 0x5a1: 0x3b03, 0x5a2: 0x3982, 0x5a3: 0x3b11, - 0x5a4: 0x31e5, 0x5a5: 0x34fb, 0x5a6: 0x31c7, 0x5a7: 0x34dd, 0x5a8: 0x39e4, 0x5a9: 0x3b73, - 0x5aa: 0x39dd, 0x5ab: 0x3b6c, 0x5ac: 0x39f2, 0x5ad: 0x3b81, 0x5ae: 0x39eb, 0x5af: 0x3b7a, - 0x5b0: 0x39f9, 0x5b1: 0x3b88, 0x5b2: 0x3230, 0x5b3: 0x354b, 0x5b4: 0x3258, 0x5b5: 0x3578, - 0x5b6: 0x3253, 0x5b7: 0x356e, 0x5b8: 0x323f, 0x5b9: 0x355a, - // Block 0x17, offset 0x5c0 - 0x5c0: 0x4804, 0x5c1: 0x480a, 0x5c2: 0x491e, 0x5c3: 0x4936, 0x5c4: 0x4926, 0x5c5: 0x493e, - 0x5c6: 0x492e, 0x5c7: 0x4946, 0x5c8: 0x47aa, 0x5c9: 0x47b0, 0x5ca: 0x488e, 0x5cb: 0x48a6, - 0x5cc: 0x4896, 0x5cd: 0x48ae, 0x5ce: 0x489e, 0x5cf: 0x48b6, 0x5d0: 0x4816, 0x5d1: 0x481c, - 0x5d2: 0x3db8, 0x5d3: 0x3dc8, 0x5d4: 0x3dc0, 0x5d5: 0x3dd0, - 0x5d8: 0x47b6, 0x5d9: 0x47bc, 0x5da: 0x3ce8, 0x5db: 0x3cf8, 0x5dc: 0x3cf0, 0x5dd: 0x3d00, - 0x5e0: 0x482e, 0x5e1: 0x4834, 0x5e2: 0x494e, 0x5e3: 0x4966, - 0x5e4: 0x4956, 0x5e5: 0x496e, 0x5e6: 0x495e, 0x5e7: 0x4976, 0x5e8: 0x47c2, 0x5e9: 0x47c8, - 0x5ea: 0x48be, 0x5eb: 0x48d6, 0x5ec: 0x48c6, 0x5ed: 0x48de, 0x5ee: 0x48ce, 0x5ef: 0x48e6, - 0x5f0: 0x4846, 0x5f1: 0x484c, 0x5f2: 0x3e18, 0x5f3: 0x3e30, 0x5f4: 0x3e20, 0x5f5: 0x3e38, - 0x5f6: 0x3e28, 0x5f7: 0x3e40, 0x5f8: 0x47ce, 0x5f9: 0x47d4, 0x5fa: 0x3d18, 0x5fb: 0x3d30, - 0x5fc: 0x3d20, 0x5fd: 0x3d38, 0x5fe: 0x3d28, 0x5ff: 0x3d40, - // Block 0x18, offset 0x600 - 0x600: 0x4852, 0x601: 0x4858, 0x602: 0x3e48, 0x603: 0x3e58, 0x604: 0x3e50, 0x605: 0x3e60, - 0x608: 0x47da, 0x609: 0x47e0, 0x60a: 0x3d48, 0x60b: 0x3d58, - 0x60c: 0x3d50, 0x60d: 0x3d60, 0x610: 0x4864, 0x611: 0x486a, - 0x612: 0x3e80, 0x613: 0x3e98, 0x614: 0x3e88, 0x615: 0x3ea0, 0x616: 0x3e90, 0x617: 0x3ea8, - 0x619: 0x47e6, 0x61b: 0x3d68, 0x61d: 0x3d70, - 0x61f: 0x3d78, 0x620: 0x487c, 0x621: 0x4882, 0x622: 0x497e, 0x623: 0x4996, - 0x624: 0x4986, 0x625: 0x499e, 0x626: 0x498e, 0x627: 0x49a6, 0x628: 0x47ec, 0x629: 0x47f2, - 0x62a: 0x48ee, 0x62b: 0x4906, 0x62c: 0x48f6, 0x62d: 0x490e, 0x62e: 0x48fe, 0x62f: 0x4916, - 0x630: 0x47f8, 0x631: 0x431e, 0x632: 0x3691, 0x633: 0x4324, 0x634: 0x4822, 0x635: 0x432a, - 0x636: 0x36a3, 0x637: 0x4330, 0x638: 0x36c1, 0x639: 0x4336, 0x63a: 0x36d9, 0x63b: 0x433c, - 0x63c: 0x4870, 0x63d: 0x4342, - // Block 0x19, offset 0x640 - 0x640: 0x3da0, 0x641: 0x3da8, 0x642: 0x4184, 0x643: 0x41a2, 0x644: 0x418e, 0x645: 0x41ac, - 0x646: 0x4198, 0x647: 0x41b6, 0x648: 0x3cd8, 0x649: 0x3ce0, 0x64a: 0x40d0, 0x64b: 0x40ee, - 0x64c: 0x40da, 0x64d: 0x40f8, 0x64e: 0x40e4, 0x64f: 0x4102, 0x650: 0x3de8, 0x651: 0x3df0, - 0x652: 0x41c0, 0x653: 0x41de, 0x654: 0x41ca, 0x655: 0x41e8, 0x656: 0x41d4, 0x657: 0x41f2, - 0x658: 0x3d08, 0x659: 0x3d10, 0x65a: 0x410c, 0x65b: 0x412a, 0x65c: 0x4116, 0x65d: 0x4134, - 0x65e: 0x4120, 0x65f: 0x413e, 0x660: 0x3ec0, 0x661: 0x3ec8, 0x662: 0x41fc, 0x663: 0x421a, - 0x664: 0x4206, 0x665: 0x4224, 0x666: 0x4210, 0x667: 0x422e, 0x668: 0x3d80, 0x669: 0x3d88, - 0x66a: 0x4148, 0x66b: 0x4166, 0x66c: 0x4152, 0x66d: 0x4170, 0x66e: 0x415c, 0x66f: 0x417a, - 0x670: 0x3685, 0x671: 0x367f, 0x672: 0x3d90, 0x673: 0x368b, 0x674: 0x3d98, - 0x676: 0x4810, 0x677: 0x3db0, 0x678: 0x35f5, 0x679: 0x35ef, 0x67a: 0x35e3, 0x67b: 0x42ee, - 0x67c: 0x35fb, 0x67d: 0x4287, 0x67e: 0x01d3, 0x67f: 0x4287, - // Block 0x1a, offset 0x680 - 0x680: 0x42a0, 0x681: 0x4482, 0x682: 0x3dd8, 0x683: 0x369d, 0x684: 0x3de0, - 0x686: 0x483a, 0x687: 0x3df8, 0x688: 0x3601, 0x689: 0x42f4, 0x68a: 0x360d, 0x68b: 0x42fa, - 0x68c: 0x3619, 0x68d: 0x4489, 0x68e: 0x4490, 0x68f: 0x4497, 0x690: 0x36b5, 0x691: 0x36af, - 0x692: 0x3e00, 0x693: 0x44e4, 0x696: 0x36bb, 0x697: 0x3e10, - 0x698: 0x3631, 0x699: 0x362b, 0x69a: 0x361f, 0x69b: 0x4300, 0x69d: 0x449e, - 0x69e: 0x44a5, 0x69f: 0x44ac, 0x6a0: 0x36eb, 0x6a1: 0x36e5, 0x6a2: 0x3e68, 0x6a3: 0x44ec, - 0x6a4: 0x36cd, 0x6a5: 0x36d3, 0x6a6: 0x36f1, 0x6a7: 0x3e78, 0x6a8: 0x3661, 0x6a9: 0x365b, - 0x6aa: 0x364f, 0x6ab: 0x430c, 0x6ac: 0x3649, 0x6ad: 0x4474, 0x6ae: 0x447b, 0x6af: 0x0081, - 0x6b2: 0x3eb0, 0x6b3: 0x36f7, 0x6b4: 0x3eb8, - 0x6b6: 0x4888, 0x6b7: 0x3ed0, 0x6b8: 0x363d, 0x6b9: 0x4306, 0x6ba: 0x366d, 0x6bb: 0x4318, - 0x6bc: 0x3679, 0x6bd: 0x425a, 0x6be: 0x428c, - // Block 0x1b, offset 0x6c0 - 0x6c0: 0x1bd8, 0x6c1: 0x1bdc, 0x6c2: 0x0047, 0x6c3: 0x1c54, 0x6c5: 0x1be8, - 0x6c6: 0x1bec, 0x6c7: 0x00e9, 0x6c9: 0x1c58, 0x6ca: 0x008f, 0x6cb: 0x0051, - 0x6cc: 0x0051, 0x6cd: 0x0051, 0x6ce: 0x0091, 0x6cf: 0x00da, 0x6d0: 0x0053, 0x6d1: 0x0053, - 0x6d2: 0x0059, 0x6d3: 0x0099, 0x6d5: 0x005d, 0x6d6: 0x198d, - 0x6d9: 0x0061, 0x6da: 0x0063, 0x6db: 0x0065, 0x6dc: 0x0065, 0x6dd: 0x0065, - 0x6e0: 0x199f, 0x6e1: 0x1bc8, 0x6e2: 0x19a8, - 0x6e4: 0x0075, 0x6e6: 0x01b8, 0x6e8: 0x0075, - 0x6ea: 0x0057, 0x6eb: 0x42d2, 0x6ec: 0x0045, 0x6ed: 0x0047, 0x6ef: 0x008b, - 0x6f0: 0x004b, 0x6f1: 0x004d, 0x6f3: 0x005b, 0x6f4: 0x009f, 0x6f5: 0x0215, - 0x6f6: 0x0218, 0x6f7: 0x021b, 0x6f8: 0x021e, 0x6f9: 0x0093, 0x6fb: 0x1b98, - 0x6fc: 0x01e8, 0x6fd: 0x01c1, 0x6fe: 0x0179, 0x6ff: 0x01a0, - // Block 0x1c, offset 0x700 - 0x700: 0x0463, 0x705: 0x0049, - 0x706: 0x0089, 0x707: 0x008b, 0x708: 0x0093, 0x709: 0x0095, - 0x710: 0x222e, 0x711: 0x223a, - 0x712: 0x22ee, 0x713: 0x2216, 0x714: 0x229a, 0x715: 0x2222, 0x716: 0x22a0, 0x717: 0x22b8, - 0x718: 0x22c4, 0x719: 0x2228, 0x71a: 0x22ca, 0x71b: 0x2234, 0x71c: 0x22be, 0x71d: 0x22d0, - 0x71e: 0x22d6, 0x71f: 0x1cbc, 0x720: 0x0053, 0x721: 0x195a, 0x722: 0x1ba4, 0x723: 0x1963, - 0x724: 0x006d, 0x725: 0x19ab, 0x726: 0x1bd0, 0x727: 0x1d48, 0x728: 0x1966, 0x729: 0x0071, - 0x72a: 0x19b7, 0x72b: 0x1bd4, 0x72c: 0x0059, 0x72d: 0x0047, 0x72e: 0x0049, 0x72f: 0x005b, - 0x730: 0x0093, 0x731: 0x19e4, 0x732: 0x1c18, 0x733: 0x19ed, 0x734: 0x00ad, 0x735: 0x1a62, - 0x736: 0x1c4c, 0x737: 0x1d5c, 0x738: 0x19f0, 0x739: 0x00b1, 0x73a: 0x1a65, 0x73b: 0x1c50, - 0x73c: 0x0099, 0x73d: 0x0087, 0x73e: 0x0089, 0x73f: 0x009b, - // Block 0x1d, offset 0x740 - 0x741: 0x3c06, 0x743: 0xa000, 0x744: 0x3c0d, 0x745: 0xa000, - 0x747: 0x3c14, 0x748: 0xa000, 0x749: 0x3c1b, - 0x74d: 0xa000, - 0x760: 0x2f65, 0x761: 0xa000, 0x762: 0x3c29, - 0x764: 0xa000, 0x765: 0xa000, - 0x76d: 0x3c22, 0x76e: 0x2f60, 0x76f: 0x2f6a, - 0x770: 0x3c30, 0x771: 0x3c37, 0x772: 0xa000, 0x773: 0xa000, 0x774: 0x3c3e, 0x775: 0x3c45, - 0x776: 0xa000, 0x777: 0xa000, 0x778: 0x3c4c, 0x779: 0x3c53, 0x77a: 0xa000, 0x77b: 0xa000, - 0x77c: 0xa000, 0x77d: 0xa000, - // Block 0x1e, offset 0x780 - 0x780: 0x3c5a, 0x781: 0x3c61, 0x782: 0xa000, 0x783: 0xa000, 0x784: 0x3c76, 0x785: 0x3c7d, - 0x786: 0xa000, 0x787: 0xa000, 0x788: 0x3c84, 0x789: 0x3c8b, - 0x791: 0xa000, - 0x792: 0xa000, - 0x7a2: 0xa000, - 0x7a8: 0xa000, 0x7a9: 0xa000, - 0x7ab: 0xa000, 0x7ac: 0x3ca0, 0x7ad: 0x3ca7, 0x7ae: 0x3cae, 0x7af: 0x3cb5, - 0x7b2: 0xa000, 0x7b3: 0xa000, 0x7b4: 0xa000, 0x7b5: 0xa000, - // Block 0x1f, offset 0x7c0 - 0x7e0: 0x0023, 0x7e1: 0x0025, 0x7e2: 0x0027, 0x7e3: 0x0029, - 0x7e4: 0x002b, 0x7e5: 0x002d, 0x7e6: 0x002f, 0x7e7: 0x0031, 0x7e8: 0x0033, 0x7e9: 0x1882, - 0x7ea: 0x1885, 0x7eb: 0x1888, 0x7ec: 0x188b, 0x7ed: 0x188e, 0x7ee: 0x1891, 0x7ef: 0x1894, - 0x7f0: 0x1897, 0x7f1: 0x189a, 0x7f2: 0x189d, 0x7f3: 0x18a6, 0x7f4: 0x1a68, 0x7f5: 0x1a6c, - 0x7f6: 0x1a70, 0x7f7: 0x1a74, 0x7f8: 0x1a78, 0x7f9: 0x1a7c, 0x7fa: 0x1a80, 0x7fb: 0x1a84, - 0x7fc: 0x1a88, 0x7fd: 0x1c80, 0x7fe: 0x1c85, 0x7ff: 0x1c8a, - // Block 0x20, offset 0x800 - 0x800: 0x1c8f, 0x801: 0x1c94, 0x802: 0x1c99, 0x803: 0x1c9e, 0x804: 0x1ca3, 0x805: 0x1ca8, - 0x806: 0x1cad, 0x807: 0x1cb2, 0x808: 0x187f, 0x809: 0x18a3, 0x80a: 0x18c7, 0x80b: 0x18eb, - 0x80c: 0x190f, 0x80d: 0x1918, 0x80e: 0x191e, 0x80f: 0x1924, 0x810: 0x192a, 0x811: 0x1b60, - 0x812: 0x1b64, 0x813: 0x1b68, 0x814: 0x1b6c, 0x815: 0x1b70, 0x816: 0x1b74, 0x817: 0x1b78, - 0x818: 0x1b7c, 0x819: 0x1b80, 0x81a: 0x1b84, 0x81b: 0x1b88, 0x81c: 0x1af4, 0x81d: 0x1af8, - 0x81e: 0x1afc, 0x81f: 0x1b00, 0x820: 0x1b04, 0x821: 0x1b08, 0x822: 0x1b0c, 0x823: 0x1b10, - 0x824: 0x1b14, 0x825: 0x1b18, 0x826: 0x1b1c, 0x827: 0x1b20, 0x828: 0x1b24, 0x829: 0x1b28, - 0x82a: 0x1b2c, 0x82b: 0x1b30, 0x82c: 0x1b34, 0x82d: 0x1b38, 0x82e: 0x1b3c, 0x82f: 0x1b40, - 0x830: 0x1b44, 0x831: 0x1b48, 0x832: 0x1b4c, 0x833: 0x1b50, 0x834: 0x1b54, 0x835: 0x1b58, - 0x836: 0x0043, 0x837: 0x0045, 0x838: 0x0047, 0x839: 0x0049, 0x83a: 0x004b, 0x83b: 0x004d, - 0x83c: 0x004f, 0x83d: 0x0051, 0x83e: 0x0053, 0x83f: 0x0055, - // Block 0x21, offset 0x840 - 0x840: 0x06bf, 0x841: 0x06e3, 0x842: 0x06ef, 0x843: 0x06ff, 0x844: 0x0707, 0x845: 0x0713, - 0x846: 0x071b, 0x847: 0x0723, 0x848: 0x072f, 0x849: 0x0783, 0x84a: 0x079b, 0x84b: 0x07ab, - 0x84c: 0x07bb, 0x84d: 0x07cb, 0x84e: 0x07db, 0x84f: 0x07fb, 0x850: 0x07ff, 0x851: 0x0803, - 0x852: 0x0837, 0x853: 0x085f, 0x854: 0x086f, 0x855: 0x0877, 0x856: 0x087b, 0x857: 0x0887, - 0x858: 0x08a3, 0x859: 0x08a7, 0x85a: 0x08bf, 0x85b: 0x08c3, 0x85c: 0x08cb, 0x85d: 0x08db, - 0x85e: 0x0977, 0x85f: 0x098b, 0x860: 0x09cb, 0x861: 0x09df, 0x862: 0x09e7, 0x863: 0x09eb, - 0x864: 0x09fb, 0x865: 0x0a17, 0x866: 0x0a43, 0x867: 0x0a4f, 0x868: 0x0a6f, 0x869: 0x0a7b, - 0x86a: 0x0a7f, 0x86b: 0x0a83, 0x86c: 0x0a9b, 0x86d: 0x0a9f, 0x86e: 0x0acb, 0x86f: 0x0ad7, - 0x870: 0x0adf, 0x871: 0x0ae7, 0x872: 0x0af7, 0x873: 0x0aff, 0x874: 0x0b07, 0x875: 0x0b33, - 0x876: 0x0b37, 0x877: 0x0b3f, 0x878: 0x0b43, 0x879: 0x0b4b, 0x87a: 0x0b53, 0x87b: 0x0b63, - 0x87c: 0x0b7f, 0x87d: 0x0bf7, 0x87e: 0x0c0b, 0x87f: 0x0c0f, - // Block 0x22, offset 0x880 - 0x880: 0x0c8f, 0x881: 0x0c93, 0x882: 0x0ca7, 0x883: 0x0cab, 0x884: 0x0cb3, 0x885: 0x0cbb, - 0x886: 0x0cc3, 0x887: 0x0ccf, 0x888: 0x0cf7, 0x889: 0x0d07, 0x88a: 0x0d1b, 0x88b: 0x0d8b, - 0x88c: 0x0d97, 0x88d: 0x0da7, 0x88e: 0x0db3, 0x88f: 0x0dbf, 0x890: 0x0dc7, 0x891: 0x0dcb, - 0x892: 0x0dcf, 0x893: 0x0dd3, 0x894: 0x0dd7, 0x895: 0x0e8f, 0x896: 0x0ed7, 0x897: 0x0ee3, - 0x898: 0x0ee7, 0x899: 0x0eeb, 0x89a: 0x0eef, 0x89b: 0x0ef7, 0x89c: 0x0efb, 0x89d: 0x0f0f, - 0x89e: 0x0f2b, 0x89f: 0x0f33, 0x8a0: 0x0f73, 0x8a1: 0x0f77, 0x8a2: 0x0f7f, 0x8a3: 0x0f83, - 0x8a4: 0x0f8b, 0x8a5: 0x0f8f, 0x8a6: 0x0fb3, 0x8a7: 0x0fb7, 0x8a8: 0x0fd3, 0x8a9: 0x0fd7, - 0x8aa: 0x0fdb, 0x8ab: 0x0fdf, 0x8ac: 0x0ff3, 0x8ad: 0x1017, 0x8ae: 0x101b, 0x8af: 0x101f, - 0x8b0: 0x1043, 0x8b1: 0x1083, 0x8b2: 0x1087, 0x8b3: 0x10a7, 0x8b4: 0x10b7, 0x8b5: 0x10bf, - 0x8b6: 0x10df, 0x8b7: 0x1103, 0x8b8: 0x1147, 0x8b9: 0x114f, 0x8ba: 0x1163, 0x8bb: 0x116f, - 0x8bc: 0x1177, 0x8bd: 0x117f, 0x8be: 0x1183, 0x8bf: 0x1187, - // Block 0x23, offset 0x8c0 - 0x8c0: 0x119f, 0x8c1: 0x11a3, 0x8c2: 0x11bf, 0x8c3: 0x11c7, 0x8c4: 0x11cf, 0x8c5: 0x11d3, - 0x8c6: 0x11df, 0x8c7: 0x11e7, 0x8c8: 0x11eb, 0x8c9: 0x11ef, 0x8ca: 0x11f7, 0x8cb: 0x11fb, - 0x8cc: 0x129b, 0x8cd: 0x12af, 0x8ce: 0x12e3, 0x8cf: 0x12e7, 0x8d0: 0x12ef, 0x8d1: 0x131b, - 0x8d2: 0x1323, 0x8d3: 0x132b, 0x8d4: 0x1333, 0x8d5: 0x136f, 0x8d6: 0x1373, 0x8d7: 0x137b, - 0x8d8: 0x137f, 0x8d9: 0x1383, 0x8da: 0x13af, 0x8db: 0x13b3, 0x8dc: 0x13bb, 0x8dd: 0x13cf, - 0x8de: 0x13d3, 0x8df: 0x13ef, 0x8e0: 0x13f7, 0x8e1: 0x13fb, 0x8e2: 0x141f, 0x8e3: 0x143f, - 0x8e4: 0x1453, 0x8e5: 0x1457, 0x8e6: 0x145f, 0x8e7: 0x148b, 0x8e8: 0x148f, 0x8e9: 0x149f, - 0x8ea: 0x14c3, 0x8eb: 0x14cf, 0x8ec: 0x14df, 0x8ed: 0x14f7, 0x8ee: 0x14ff, 0x8ef: 0x1503, - 0x8f0: 0x1507, 0x8f1: 0x150b, 0x8f2: 0x1517, 0x8f3: 0x151b, 0x8f4: 0x1523, 0x8f5: 0x153f, - 0x8f6: 0x1543, 0x8f7: 0x1547, 0x8f8: 0x155f, 0x8f9: 0x1563, 0x8fa: 0x156b, 0x8fb: 0x157f, - 0x8fc: 0x1583, 0x8fd: 0x1587, 0x8fe: 0x158f, 0x8ff: 0x1593, - // Block 0x24, offset 0x900 - 0x906: 0xa000, 0x90b: 0xa000, - 0x90c: 0x3f08, 0x90d: 0xa000, 0x90e: 0x3f10, 0x90f: 0xa000, 0x910: 0x3f18, 0x911: 0xa000, - 0x912: 0x3f20, 0x913: 0xa000, 0x914: 0x3f28, 0x915: 0xa000, 0x916: 0x3f30, 0x917: 0xa000, - 0x918: 0x3f38, 0x919: 0xa000, 0x91a: 0x3f40, 0x91b: 0xa000, 0x91c: 0x3f48, 0x91d: 0xa000, - 0x91e: 0x3f50, 0x91f: 0xa000, 0x920: 0x3f58, 0x921: 0xa000, 0x922: 0x3f60, - 0x924: 0xa000, 0x925: 0x3f68, 0x926: 0xa000, 0x927: 0x3f70, 0x928: 0xa000, 0x929: 0x3f78, - 0x92f: 0xa000, - 0x930: 0x3f80, 0x931: 0x3f88, 0x932: 0xa000, 0x933: 0x3f90, 0x934: 0x3f98, 0x935: 0xa000, - 0x936: 0x3fa0, 0x937: 0x3fa8, 0x938: 0xa000, 0x939: 0x3fb0, 0x93a: 0x3fb8, 0x93b: 0xa000, - 0x93c: 0x3fc0, 0x93d: 0x3fc8, - // Block 0x25, offset 0x940 - 0x954: 0x3f00, - 0x959: 0x9903, 0x95a: 0x9903, 0x95b: 0x42dc, 0x95c: 0x42e2, 0x95d: 0xa000, - 0x95e: 0x3fd0, 0x95f: 0x26b4, - 0x966: 0xa000, - 0x96b: 0xa000, 0x96c: 0x3fe0, 0x96d: 0xa000, 0x96e: 0x3fe8, 0x96f: 0xa000, - 0x970: 0x3ff0, 0x971: 0xa000, 0x972: 0x3ff8, 0x973: 0xa000, 0x974: 0x4000, 0x975: 0xa000, - 0x976: 0x4008, 0x977: 0xa000, 0x978: 0x4010, 0x979: 0xa000, 0x97a: 0x4018, 0x97b: 0xa000, - 0x97c: 0x4020, 0x97d: 0xa000, 0x97e: 0x4028, 0x97f: 0xa000, - // Block 0x26, offset 0x980 - 0x980: 0x4030, 0x981: 0xa000, 0x982: 0x4038, 0x984: 0xa000, 0x985: 0x4040, - 0x986: 0xa000, 0x987: 0x4048, 0x988: 0xa000, 0x989: 0x4050, - 0x98f: 0xa000, 0x990: 0x4058, 0x991: 0x4060, - 0x992: 0xa000, 0x993: 0x4068, 0x994: 0x4070, 0x995: 0xa000, 0x996: 0x4078, 0x997: 0x4080, - 0x998: 0xa000, 0x999: 0x4088, 0x99a: 0x4090, 0x99b: 0xa000, 0x99c: 0x4098, 0x99d: 0x40a0, - 0x9af: 0xa000, - 0x9b0: 0xa000, 0x9b1: 0xa000, 0x9b2: 0xa000, 0x9b4: 0x3fd8, - 0x9b7: 0x40a8, 0x9b8: 0x40b0, 0x9b9: 0x40b8, 0x9ba: 0x40c0, - 0x9bd: 0xa000, 0x9be: 0x40c8, 0x9bf: 0x26c9, - // Block 0x27, offset 0x9c0 - 0x9c0: 0x0367, 0x9c1: 0x032b, 0x9c2: 0x032f, 0x9c3: 0x0333, 0x9c4: 0x037b, 0x9c5: 0x0337, - 0x9c6: 0x033b, 0x9c7: 0x033f, 0x9c8: 0x0343, 0x9c9: 0x0347, 0x9ca: 0x034b, 0x9cb: 0x034f, - 0x9cc: 0x0353, 0x9cd: 0x0357, 0x9ce: 0x035b, 0x9cf: 0x49bd, 0x9d0: 0x49c3, 0x9d1: 0x49c9, - 0x9d2: 0x49cf, 0x9d3: 0x49d5, 0x9d4: 0x49db, 0x9d5: 0x49e1, 0x9d6: 0x49e7, 0x9d7: 0x49ed, - 0x9d8: 0x49f3, 0x9d9: 0x49f9, 0x9da: 0x49ff, 0x9db: 0x4a05, 0x9dc: 0x4a0b, 0x9dd: 0x4a11, - 0x9de: 0x4a17, 0x9df: 0x4a1d, 0x9e0: 0x4a23, 0x9e1: 0x4a29, 0x9e2: 0x4a2f, 0x9e3: 0x4a35, - 0x9e4: 0x03c3, 0x9e5: 0x035f, 0x9e6: 0x0363, 0x9e7: 0x03e7, 0x9e8: 0x03eb, 0x9e9: 0x03ef, - 0x9ea: 0x03f3, 0x9eb: 0x03f7, 0x9ec: 0x03fb, 0x9ed: 0x03ff, 0x9ee: 0x036b, 0x9ef: 0x0403, - 0x9f0: 0x0407, 0x9f1: 0x036f, 0x9f2: 0x0373, 0x9f3: 0x0377, 0x9f4: 0x037f, 0x9f5: 0x0383, - 0x9f6: 0x0387, 0x9f7: 0x038b, 0x9f8: 0x038f, 0x9f9: 0x0393, 0x9fa: 0x0397, 0x9fb: 0x039b, - 0x9fc: 0x039f, 0x9fd: 0x03a3, 0x9fe: 0x03a7, 0x9ff: 0x03ab, - // Block 0x28, offset 0xa00 - 0xa00: 0x03af, 0xa01: 0x03b3, 0xa02: 0x040b, 0xa03: 0x040f, 0xa04: 0x03b7, 0xa05: 0x03bb, - 0xa06: 0x03bf, 0xa07: 0x03c7, 0xa08: 0x03cb, 0xa09: 0x03cf, 0xa0a: 0x03d3, 0xa0b: 0x03d7, - 0xa0c: 0x03db, 0xa0d: 0x03df, 0xa0e: 0x03e3, - 0xa12: 0x06bf, 0xa13: 0x071b, 0xa14: 0x06cb, 0xa15: 0x097b, 0xa16: 0x06cf, 0xa17: 0x06e7, - 0xa18: 0x06d3, 0xa19: 0x0f93, 0xa1a: 0x0707, 0xa1b: 0x06db, 0xa1c: 0x06c3, 0xa1d: 0x09ff, - 0xa1e: 0x098f, 0xa1f: 0x072f, - // Block 0x29, offset 0xa40 - 0xa40: 0x2054, 0xa41: 0x205a, 0xa42: 0x2060, 0xa43: 0x2066, 0xa44: 0x206c, 0xa45: 0x2072, - 0xa46: 0x2078, 0xa47: 0x207e, 0xa48: 0x2084, 0xa49: 0x208a, 0xa4a: 0x2090, 0xa4b: 0x2096, - 0xa4c: 0x209c, 0xa4d: 0x20a2, 0xa4e: 0x2726, 0xa4f: 0x272f, 0xa50: 0x2738, 0xa51: 0x2741, - 0xa52: 0x274a, 0xa53: 0x2753, 0xa54: 0x275c, 0xa55: 0x2765, 0xa56: 0x276e, 0xa57: 0x2780, - 0xa58: 0x2789, 0xa59: 0x2792, 0xa5a: 0x279b, 0xa5b: 0x27a4, 0xa5c: 0x2777, 0xa5d: 0x2bac, - 0xa5e: 0x2aed, 0xa60: 0x20a8, 0xa61: 0x20c0, 0xa62: 0x20b4, 0xa63: 0x2108, - 0xa64: 0x20c6, 0xa65: 0x20e4, 0xa66: 0x20ae, 0xa67: 0x20de, 0xa68: 0x20ba, 0xa69: 0x20f0, - 0xa6a: 0x2120, 0xa6b: 0x213e, 0xa6c: 0x2138, 0xa6d: 0x212c, 0xa6e: 0x217a, 0xa6f: 0x210e, - 0xa70: 0x211a, 0xa71: 0x2132, 0xa72: 0x2126, 0xa73: 0x2150, 0xa74: 0x20fc, 0xa75: 0x2144, - 0xa76: 0x216e, 0xa77: 0x2156, 0xa78: 0x20ea, 0xa79: 0x20cc, 0xa7a: 0x2102, 0xa7b: 0x2114, - 0xa7c: 0x214a, 0xa7d: 0x20d2, 0xa7e: 0x2174, 0xa7f: 0x20f6, - // Block 0x2a, offset 0xa80 - 0xa80: 0x215c, 0xa81: 0x20d8, 0xa82: 0x2162, 0xa83: 0x2168, 0xa84: 0x092f, 0xa85: 0x0b03, - 0xa86: 0x0ca7, 0xa87: 0x10c7, - 0xa90: 0x1bc4, 0xa91: 0x18a9, - 0xa92: 0x18ac, 0xa93: 0x18af, 0xa94: 0x18b2, 0xa95: 0x18b5, 0xa96: 0x18b8, 0xa97: 0x18bb, - 0xa98: 0x18be, 0xa99: 0x18c1, 0xa9a: 0x18ca, 0xa9b: 0x18cd, 0xa9c: 0x18d0, 0xa9d: 0x18d3, - 0xa9e: 0x18d6, 0xa9f: 0x18d9, 0xaa0: 0x0313, 0xaa1: 0x031b, 0xaa2: 0x031f, 0xaa3: 0x0327, - 0xaa4: 0x032b, 0xaa5: 0x032f, 0xaa6: 0x0337, 0xaa7: 0x033f, 0xaa8: 0x0343, 0xaa9: 0x034b, - 0xaaa: 0x034f, 0xaab: 0x0353, 0xaac: 0x0357, 0xaad: 0x035b, 0xaae: 0x2e18, 0xaaf: 0x2e20, - 0xab0: 0x2e28, 0xab1: 0x2e30, 0xab2: 0x2e38, 0xab3: 0x2e40, 0xab4: 0x2e48, 0xab5: 0x2e50, - 0xab6: 0x2e60, 0xab7: 0x2e68, 0xab8: 0x2e70, 0xab9: 0x2e78, 0xaba: 0x2e80, 0xabb: 0x2e88, - 0xabc: 0x2ed3, 0xabd: 0x2e9b, 0xabe: 0x2e58, - // Block 0x2b, offset 0xac0 - 0xac0: 0x06bf, 0xac1: 0x071b, 0xac2: 0x06cb, 0xac3: 0x097b, 0xac4: 0x071f, 0xac5: 0x07af, - 0xac6: 0x06c7, 0xac7: 0x07ab, 0xac8: 0x070b, 0xac9: 0x0887, 0xaca: 0x0d07, 0xacb: 0x0e8f, - 0xacc: 0x0dd7, 0xacd: 0x0d1b, 0xace: 0x145f, 0xacf: 0x098b, 0xad0: 0x0ccf, 0xad1: 0x0d4b, - 0xad2: 0x0d0b, 0xad3: 0x104b, 0xad4: 0x08fb, 0xad5: 0x0f03, 0xad6: 0x1387, 0xad7: 0x105f, - 0xad8: 0x0843, 0xad9: 0x108f, 0xada: 0x0f9b, 0xadb: 0x0a17, 0xadc: 0x140f, 0xadd: 0x077f, - 0xade: 0x08ab, 0xadf: 0x0df7, 0xae0: 0x1527, 0xae1: 0x0743, 0xae2: 0x07d3, 0xae3: 0x0d9b, - 0xae4: 0x06cf, 0xae5: 0x06e7, 0xae6: 0x06d3, 0xae7: 0x0adb, 0xae8: 0x08ef, 0xae9: 0x087f, - 0xaea: 0x0a57, 0xaeb: 0x0a4b, 0xaec: 0x0feb, 0xaed: 0x073f, 0xaee: 0x139b, 0xaef: 0x089b, - 0xaf0: 0x09f3, 0xaf1: 0x18dc, 0xaf2: 0x18df, 0xaf3: 0x18e2, 0xaf4: 0x18e5, 0xaf5: 0x18ee, - 0xaf6: 0x18f1, 0xaf7: 0x18f4, 0xaf8: 0x18f7, 0xaf9: 0x18fa, 0xafa: 0x18fd, 0xafb: 0x1900, - 0xafc: 0x1903, 0xafd: 0x1906, 0xafe: 0x1909, 0xaff: 0x1912, - // Block 0x2c, offset 0xb00 - 0xb00: 0x1cc6, 0xb01: 0x1cd5, 0xb02: 0x1ce4, 0xb03: 0x1cf3, 0xb04: 0x1d02, 0xb05: 0x1d11, - 0xb06: 0x1d20, 0xb07: 0x1d2f, 0xb08: 0x1d3e, 0xb09: 0x218c, 0xb0a: 0x219e, 0xb0b: 0x21b0, - 0xb0c: 0x1954, 0xb0d: 0x1c04, 0xb0e: 0x19d2, 0xb0f: 0x1ba8, 0xb10: 0x04cb, 0xb11: 0x04d3, - 0xb12: 0x04db, 0xb13: 0x04e3, 0xb14: 0x04eb, 0xb15: 0x04ef, 0xb16: 0x04f3, 0xb17: 0x04f7, - 0xb18: 0x04fb, 0xb19: 0x04ff, 0xb1a: 0x0503, 0xb1b: 0x0507, 0xb1c: 0x050b, 0xb1d: 0x050f, - 0xb1e: 0x0513, 0xb1f: 0x0517, 0xb20: 0x051b, 0xb21: 0x0523, 0xb22: 0x0527, 0xb23: 0x052b, - 0xb24: 0x052f, 0xb25: 0x0533, 0xb26: 0x0537, 0xb27: 0x053b, 0xb28: 0x053f, 0xb29: 0x0543, - 0xb2a: 0x0547, 0xb2b: 0x054b, 0xb2c: 0x054f, 0xb2d: 0x0553, 0xb2e: 0x0557, 0xb2f: 0x055b, - 0xb30: 0x055f, 0xb31: 0x0563, 0xb32: 0x0567, 0xb33: 0x056f, 0xb34: 0x0577, 0xb35: 0x057f, - 0xb36: 0x0583, 0xb37: 0x0587, 0xb38: 0x058b, 0xb39: 0x058f, 0xb3a: 0x0593, 0xb3b: 0x0597, - 0xb3c: 0x059b, 0xb3d: 0x059f, 0xb3e: 0x05a3, - // Block 0x2d, offset 0xb40 - 0xb40: 0x2b0c, 0xb41: 0x29a8, 0xb42: 0x2b1c, 0xb43: 0x2880, 0xb44: 0x2ee4, 0xb45: 0x288a, - 0xb46: 0x2894, 0xb47: 0x2f28, 0xb48: 0x29b5, 0xb49: 0x289e, 0xb4a: 0x28a8, 0xb4b: 0x28b2, - 0xb4c: 0x29dc, 0xb4d: 0x29e9, 0xb4e: 0x29c2, 0xb4f: 0x29cf, 0xb50: 0x2ea9, 0xb51: 0x29f6, - 0xb52: 0x2a03, 0xb53: 0x2bbe, 0xb54: 0x26bb, 0xb55: 0x2bd1, 0xb56: 0x2be4, 0xb57: 0x2b2c, - 0xb58: 0x2a10, 0xb59: 0x2bf7, 0xb5a: 0x2c0a, 0xb5b: 0x2a1d, 0xb5c: 0x28bc, 0xb5d: 0x28c6, - 0xb5e: 0x2eb7, 0xb5f: 0x2a2a, 0xb60: 0x2b3c, 0xb61: 0x2ef5, 0xb62: 0x28d0, 0xb63: 0x28da, - 0xb64: 0x2a37, 0xb65: 0x28e4, 0xb66: 0x28ee, 0xb67: 0x26d0, 0xb68: 0x26d7, 0xb69: 0x28f8, - 0xb6a: 0x2902, 0xb6b: 0x2c1d, 0xb6c: 0x2a44, 0xb6d: 0x2b4c, 0xb6e: 0x2c30, 0xb6f: 0x2a51, - 0xb70: 0x2916, 0xb71: 0x290c, 0xb72: 0x2f3c, 0xb73: 0x2a5e, 0xb74: 0x2c43, 0xb75: 0x2920, - 0xb76: 0x2b5c, 0xb77: 0x292a, 0xb78: 0x2a78, 0xb79: 0x2934, 0xb7a: 0x2a85, 0xb7b: 0x2f06, - 0xb7c: 0x2a6b, 0xb7d: 0x2b6c, 0xb7e: 0x2a92, 0xb7f: 0x26de, - // Block 0x2e, offset 0xb80 - 0xb80: 0x2f17, 0xb81: 0x293e, 0xb82: 0x2948, 0xb83: 0x2a9f, 0xb84: 0x2952, 0xb85: 0x295c, - 0xb86: 0x2966, 0xb87: 0x2b7c, 0xb88: 0x2aac, 0xb89: 0x26e5, 0xb8a: 0x2c56, 0xb8b: 0x2e90, - 0xb8c: 0x2b8c, 0xb8d: 0x2ab9, 0xb8e: 0x2ec5, 0xb8f: 0x2970, 0xb90: 0x297a, 0xb91: 0x2ac6, - 0xb92: 0x26ec, 0xb93: 0x2ad3, 0xb94: 0x2b9c, 0xb95: 0x26f3, 0xb96: 0x2c69, 0xb97: 0x2984, - 0xb98: 0x1cb7, 0xb99: 0x1ccb, 0xb9a: 0x1cda, 0xb9b: 0x1ce9, 0xb9c: 0x1cf8, 0xb9d: 0x1d07, - 0xb9e: 0x1d16, 0xb9f: 0x1d25, 0xba0: 0x1d34, 0xba1: 0x1d43, 0xba2: 0x2192, 0xba3: 0x21a4, - 0xba4: 0x21b6, 0xba5: 0x21c2, 0xba6: 0x21ce, 0xba7: 0x21da, 0xba8: 0x21e6, 0xba9: 0x21f2, - 0xbaa: 0x21fe, 0xbab: 0x220a, 0xbac: 0x2246, 0xbad: 0x2252, 0xbae: 0x225e, 0xbaf: 0x226a, - 0xbb0: 0x2276, 0xbb1: 0x1c14, 0xbb2: 0x19c6, 0xbb3: 0x1936, 0xbb4: 0x1be4, 0xbb5: 0x1a47, - 0xbb6: 0x1a56, 0xbb7: 0x19cc, 0xbb8: 0x1bfc, 0xbb9: 0x1c00, 0xbba: 0x1960, 0xbbb: 0x2701, - 0xbbc: 0x270f, 0xbbd: 0x26fa, 0xbbe: 0x2708, 0xbbf: 0x2ae0, - // Block 0x2f, offset 0xbc0 - 0xbc0: 0x1a4a, 0xbc1: 0x1a32, 0xbc2: 0x1c60, 0xbc3: 0x1a1a, 0xbc4: 0x19f3, 0xbc5: 0x1969, - 0xbc6: 0x1978, 0xbc7: 0x1948, 0xbc8: 0x1bf0, 0xbc9: 0x1d52, 0xbca: 0x1a4d, 0xbcb: 0x1a35, - 0xbcc: 0x1c64, 0xbcd: 0x1c70, 0xbce: 0x1a26, 0xbcf: 0x19fc, 0xbd0: 0x1957, 0xbd1: 0x1c1c, - 0xbd2: 0x1bb0, 0xbd3: 0x1b9c, 0xbd4: 0x1bcc, 0xbd5: 0x1c74, 0xbd6: 0x1a29, 0xbd7: 0x19c9, - 0xbd8: 0x19ff, 0xbd9: 0x19de, 0xbda: 0x1a41, 0xbdb: 0x1c78, 0xbdc: 0x1a2c, 0xbdd: 0x19c0, - 0xbde: 0x1a02, 0xbdf: 0x1c3c, 0xbe0: 0x1bf4, 0xbe1: 0x1a14, 0xbe2: 0x1c24, 0xbe3: 0x1c40, - 0xbe4: 0x1bf8, 0xbe5: 0x1a17, 0xbe6: 0x1c28, 0xbe7: 0x22e8, 0xbe8: 0x22fc, 0xbe9: 0x1996, - 0xbea: 0x1c20, 0xbeb: 0x1bb4, 0xbec: 0x1ba0, 0xbed: 0x1c48, 0xbee: 0x2716, 0xbef: 0x27ad, - 0xbf0: 0x1a59, 0xbf1: 0x1a44, 0xbf2: 0x1c7c, 0xbf3: 0x1a2f, 0xbf4: 0x1a50, 0xbf5: 0x1a38, - 0xbf6: 0x1c68, 0xbf7: 0x1a1d, 0xbf8: 0x19f6, 0xbf9: 0x1981, 0xbfa: 0x1a53, 0xbfb: 0x1a3b, - 0xbfc: 0x1c6c, 0xbfd: 0x1a20, 0xbfe: 0x19f9, 0xbff: 0x1984, - // Block 0x30, offset 0xc00 - 0xc00: 0x1c2c, 0xc01: 0x1bb8, 0xc02: 0x1d4d, 0xc03: 0x1939, 0xc04: 0x19ba, 0xc05: 0x19bd, - 0xc06: 0x22f5, 0xc07: 0x1b94, 0xc08: 0x19c3, 0xc09: 0x194b, 0xc0a: 0x19e1, 0xc0b: 0x194e, - 0xc0c: 0x19ea, 0xc0d: 0x196c, 0xc0e: 0x196f, 0xc0f: 0x1a05, 0xc10: 0x1a0b, 0xc11: 0x1a0e, - 0xc12: 0x1c30, 0xc13: 0x1a11, 0xc14: 0x1a23, 0xc15: 0x1c38, 0xc16: 0x1c44, 0xc17: 0x1990, - 0xc18: 0x1d57, 0xc19: 0x1bbc, 0xc1a: 0x1993, 0xc1b: 0x1a5c, 0xc1c: 0x19a5, 0xc1d: 0x19b4, - 0xc1e: 0x22e2, 0xc1f: 0x22dc, 0xc20: 0x1cc1, 0xc21: 0x1cd0, 0xc22: 0x1cdf, 0xc23: 0x1cee, - 0xc24: 0x1cfd, 0xc25: 0x1d0c, 0xc26: 0x1d1b, 0xc27: 0x1d2a, 0xc28: 0x1d39, 0xc29: 0x2186, - 0xc2a: 0x2198, 0xc2b: 0x21aa, 0xc2c: 0x21bc, 0xc2d: 0x21c8, 0xc2e: 0x21d4, 0xc2f: 0x21e0, - 0xc30: 0x21ec, 0xc31: 0x21f8, 0xc32: 0x2204, 0xc33: 0x2240, 0xc34: 0x224c, 0xc35: 0x2258, - 0xc36: 0x2264, 0xc37: 0x2270, 0xc38: 0x227c, 0xc39: 0x2282, 0xc3a: 0x2288, 0xc3b: 0x228e, - 0xc3c: 0x2294, 0xc3d: 0x22a6, 0xc3e: 0x22ac, 0xc3f: 0x1c10, - // Block 0x31, offset 0xc40 - 0xc40: 0x1377, 0xc41: 0x0cfb, 0xc42: 0x13d3, 0xc43: 0x139f, 0xc44: 0x0e57, 0xc45: 0x06eb, - 0xc46: 0x08df, 0xc47: 0x162b, 0xc48: 0x162b, 0xc49: 0x0a0b, 0xc4a: 0x145f, 0xc4b: 0x0943, - 0xc4c: 0x0a07, 0xc4d: 0x0bef, 0xc4e: 0x0fcf, 0xc4f: 0x115f, 0xc50: 0x1297, 0xc51: 0x12d3, - 0xc52: 0x1307, 0xc53: 0x141b, 0xc54: 0x0d73, 0xc55: 0x0dff, 0xc56: 0x0eab, 0xc57: 0x0f43, - 0xc58: 0x125f, 0xc59: 0x1447, 0xc5a: 0x1573, 0xc5b: 0x070f, 0xc5c: 0x08b3, 0xc5d: 0x0d87, - 0xc5e: 0x0ecf, 0xc5f: 0x1293, 0xc60: 0x15c3, 0xc61: 0x0ab3, 0xc62: 0x0e77, 0xc63: 0x1283, - 0xc64: 0x1317, 0xc65: 0x0c23, 0xc66: 0x11bb, 0xc67: 0x12df, 0xc68: 0x0b1f, 0xc69: 0x0d0f, - 0xc6a: 0x0e17, 0xc6b: 0x0f1b, 0xc6c: 0x1427, 0xc6d: 0x074f, 0xc6e: 0x07e7, 0xc6f: 0x0853, - 0xc70: 0x0c8b, 0xc71: 0x0d7f, 0xc72: 0x0ecb, 0xc73: 0x0fef, 0xc74: 0x1177, 0xc75: 0x128b, - 0xc76: 0x12a3, 0xc77: 0x13c7, 0xc78: 0x14ef, 0xc79: 0x15a3, 0xc7a: 0x15bf, 0xc7b: 0x102b, - 0xc7c: 0x106b, 0xc7d: 0x1123, 0xc7e: 0x1243, 0xc7f: 0x147b, - // Block 0x32, offset 0xc80 - 0xc80: 0x15cb, 0xc81: 0x134b, 0xc82: 0x09c7, 0xc83: 0x0b3b, 0xc84: 0x10db, 0xc85: 0x119b, - 0xc86: 0x0eff, 0xc87: 0x1033, 0xc88: 0x1397, 0xc89: 0x14e7, 0xc8a: 0x09c3, 0xc8b: 0x0a8f, - 0xc8c: 0x0d77, 0xc8d: 0x0e2b, 0xc8e: 0x0e5f, 0xc8f: 0x1113, 0xc90: 0x113b, 0xc91: 0x14a7, - 0xc92: 0x084f, 0xc93: 0x11a7, 0xc94: 0x07f3, 0xc95: 0x07ef, 0xc96: 0x1097, 0xc97: 0x1127, - 0xc98: 0x125b, 0xc99: 0x14af, 0xc9a: 0x1367, 0xc9b: 0x0c27, 0xc9c: 0x0d73, 0xc9d: 0x1357, - 0xc9e: 0x06f7, 0xc9f: 0x0a63, 0xca0: 0x0b93, 0xca1: 0x0f2f, 0xca2: 0x0faf, 0xca3: 0x0873, - 0xca4: 0x103b, 0xca5: 0x075f, 0xca6: 0x0b77, 0xca7: 0x06d7, 0xca8: 0x0deb, 0xca9: 0x0ca3, - 0xcaa: 0x110f, 0xcab: 0x08c7, 0xcac: 0x09b3, 0xcad: 0x0ffb, 0xcae: 0x1263, 0xcaf: 0x133b, - 0xcb0: 0x0db7, 0xcb1: 0x13f7, 0xcb2: 0x0de3, 0xcb3: 0x0c37, 0xcb4: 0x121b, 0xcb5: 0x0c57, - 0xcb6: 0x0fab, 0xcb7: 0x072b, 0xcb8: 0x07a7, 0xcb9: 0x07eb, 0xcba: 0x0d53, 0xcbb: 0x10fb, - 0xcbc: 0x11f3, 0xcbd: 0x1347, 0xcbe: 0x145b, 0xcbf: 0x085b, - // Block 0x33, offset 0xcc0 - 0xcc0: 0x090f, 0xcc1: 0x0a17, 0xcc2: 0x0b2f, 0xcc3: 0x0cbf, 0xcc4: 0x0e7b, 0xcc5: 0x103f, - 0xcc6: 0x1497, 0xcc7: 0x157b, 0xcc8: 0x15cf, 0xcc9: 0x15e7, 0xcca: 0x0837, 0xccb: 0x0cf3, - 0xccc: 0x0da3, 0xccd: 0x13eb, 0xcce: 0x0afb, 0xccf: 0x0bd7, 0xcd0: 0x0bf3, 0xcd1: 0x0c83, - 0xcd2: 0x0e6b, 0xcd3: 0x0eb7, 0xcd4: 0x0f67, 0xcd5: 0x108b, 0xcd6: 0x112f, 0xcd7: 0x1193, - 0xcd8: 0x13db, 0xcd9: 0x126b, 0xcda: 0x1403, 0xcdb: 0x147f, 0xcdc: 0x080f, 0xcdd: 0x083b, - 0xcde: 0x0923, 0xcdf: 0x0ea7, 0xce0: 0x12f3, 0xce1: 0x133b, 0xce2: 0x0b1b, 0xce3: 0x0b8b, - 0xce4: 0x0c4f, 0xce5: 0x0daf, 0xce6: 0x10d7, 0xce7: 0x0f23, 0xce8: 0x073b, 0xce9: 0x097f, - 0xcea: 0x0a63, 0xceb: 0x0ac7, 0xcec: 0x0b97, 0xced: 0x0f3f, 0xcee: 0x0f5b, 0xcef: 0x116b, - 0xcf0: 0x118b, 0xcf1: 0x1463, 0xcf2: 0x14e3, 0xcf3: 0x14f3, 0xcf4: 0x152f, 0xcf5: 0x0753, - 0xcf6: 0x107f, 0xcf7: 0x144f, 0xcf8: 0x14cb, 0xcf9: 0x0baf, 0xcfa: 0x0717, 0xcfb: 0x0777, - 0xcfc: 0x0a67, 0xcfd: 0x0a87, 0xcfe: 0x0caf, 0xcff: 0x0d73, - // Block 0x34, offset 0xd00 - 0xd00: 0x0ec3, 0xd01: 0x0fcb, 0xd02: 0x1277, 0xd03: 0x1417, 0xd04: 0x1623, 0xd05: 0x0ce3, - 0xd06: 0x14a3, 0xd07: 0x0833, 0xd08: 0x0d2f, 0xd09: 0x0d3b, 0xd0a: 0x0e0f, 0xd0b: 0x0e47, - 0xd0c: 0x0f4b, 0xd0d: 0x0fa7, 0xd0e: 0x1027, 0xd0f: 0x110b, 0xd10: 0x153b, 0xd11: 0x07af, - 0xd12: 0x0c03, 0xd13: 0x14b3, 0xd14: 0x0767, 0xd15: 0x0aab, 0xd16: 0x0e2f, 0xd17: 0x13df, - 0xd18: 0x0b67, 0xd19: 0x0bb7, 0xd1a: 0x0d43, 0xd1b: 0x0f2f, 0xd1c: 0x14bb, 0xd1d: 0x0817, - 0xd1e: 0x08ff, 0xd1f: 0x0a97, 0xd20: 0x0cd3, 0xd21: 0x0d1f, 0xd22: 0x0d5f, 0xd23: 0x0df3, - 0xd24: 0x0f47, 0xd25: 0x0fbb, 0xd26: 0x1157, 0xd27: 0x12f7, 0xd28: 0x1303, 0xd29: 0x1457, - 0xd2a: 0x14d7, 0xd2b: 0x0883, 0xd2c: 0x0e4b, 0xd2d: 0x0903, 0xd2e: 0x0ec7, 0xd2f: 0x0f6b, - 0xd30: 0x1287, 0xd31: 0x14bf, 0xd32: 0x15ab, 0xd33: 0x15d3, 0xd34: 0x0d37, 0xd35: 0x0e27, - 0xd36: 0x11c3, 0xd37: 0x10b7, 0xd38: 0x10c3, 0xd39: 0x10e7, 0xd3a: 0x0f17, 0xd3b: 0x0e9f, - 0xd3c: 0x1363, 0xd3d: 0x0733, 0xd3e: 0x122b, 0xd3f: 0x081b, - // Block 0x35, offset 0xd40 - 0xd40: 0x080b, 0xd41: 0x0b0b, 0xd42: 0x0c2b, 0xd43: 0x10f3, 0xd44: 0x0a53, 0xd45: 0x0e03, - 0xd46: 0x0cef, 0xd47: 0x13e7, 0xd48: 0x12e7, 0xd49: 0x14ab, 0xd4a: 0x1323, 0xd4b: 0x0b27, - 0xd4c: 0x0787, 0xd4d: 0x095b, 0xd50: 0x09af, - 0xd52: 0x0cdf, 0xd55: 0x07f7, 0xd56: 0x0f1f, 0xd57: 0x0fe3, - 0xd58: 0x1047, 0xd59: 0x1063, 0xd5a: 0x1067, 0xd5b: 0x107b, 0xd5c: 0x14fb, 0xd5d: 0x10eb, - 0xd5e: 0x116f, 0xd60: 0x128f, 0xd62: 0x1353, - 0xd65: 0x1407, 0xd66: 0x1433, - 0xd6a: 0x154f, 0xd6b: 0x1553, 0xd6c: 0x1557, 0xd6d: 0x15bb, 0xd6e: 0x142b, 0xd6f: 0x14c7, - 0xd70: 0x0757, 0xd71: 0x077b, 0xd72: 0x078f, 0xd73: 0x084b, 0xd74: 0x0857, 0xd75: 0x0897, - 0xd76: 0x094b, 0xd77: 0x0967, 0xd78: 0x096f, 0xd79: 0x09ab, 0xd7a: 0x09b7, 0xd7b: 0x0a93, - 0xd7c: 0x0a9b, 0xd7d: 0x0ba3, 0xd7e: 0x0bcb, 0xd7f: 0x0bd3, - // Block 0x36, offset 0xd80 - 0xd80: 0x0beb, 0xd81: 0x0c97, 0xd82: 0x0cc7, 0xd83: 0x0ce7, 0xd84: 0x0d57, 0xd85: 0x0e1b, - 0xd86: 0x0e37, 0xd87: 0x0e67, 0xd88: 0x0ebb, 0xd89: 0x0edb, 0xd8a: 0x0f4f, 0xd8b: 0x102f, - 0xd8c: 0x104b, 0xd8d: 0x1053, 0xd8e: 0x104f, 0xd8f: 0x1057, 0xd90: 0x105b, 0xd91: 0x105f, - 0xd92: 0x1073, 0xd93: 0x1077, 0xd94: 0x109b, 0xd95: 0x10af, 0xd96: 0x10cb, 0xd97: 0x112f, - 0xd98: 0x1137, 0xd99: 0x113f, 0xd9a: 0x1153, 0xd9b: 0x117b, 0xd9c: 0x11cb, 0xd9d: 0x11ff, - 0xd9e: 0x11ff, 0xd9f: 0x1267, 0xda0: 0x130f, 0xda1: 0x1327, 0xda2: 0x135b, 0xda3: 0x135f, - 0xda4: 0x13a3, 0xda5: 0x13a7, 0xda6: 0x13ff, 0xda7: 0x1407, 0xda8: 0x14db, 0xda9: 0x151f, - 0xdaa: 0x1537, 0xdab: 0x0b9b, 0xdac: 0x171e, 0xdad: 0x11e3, - 0xdb0: 0x06df, 0xdb1: 0x07e3, 0xdb2: 0x07a3, 0xdb3: 0x074b, 0xdb4: 0x078b, 0xdb5: 0x07b7, - 0xdb6: 0x0847, 0xdb7: 0x0863, 0xdb8: 0x094b, 0xdb9: 0x0937, 0xdba: 0x0947, 0xdbb: 0x0963, - 0xdbc: 0x09af, 0xdbd: 0x09bf, 0xdbe: 0x0a03, 0xdbf: 0x0a0f, - // Block 0x37, offset 0xdc0 - 0xdc0: 0x0a2b, 0xdc1: 0x0a3b, 0xdc2: 0x0b23, 0xdc3: 0x0b2b, 0xdc4: 0x0b5b, 0xdc5: 0x0b7b, - 0xdc6: 0x0bab, 0xdc7: 0x0bc3, 0xdc8: 0x0bb3, 0xdc9: 0x0bd3, 0xdca: 0x0bc7, 0xdcb: 0x0beb, - 0xdcc: 0x0c07, 0xdcd: 0x0c5f, 0xdce: 0x0c6b, 0xdcf: 0x0c73, 0xdd0: 0x0c9b, 0xdd1: 0x0cdf, - 0xdd2: 0x0d0f, 0xdd3: 0x0d13, 0xdd4: 0x0d27, 0xdd5: 0x0da7, 0xdd6: 0x0db7, 0xdd7: 0x0e0f, - 0xdd8: 0x0e5b, 0xdd9: 0x0e53, 0xdda: 0x0e67, 0xddb: 0x0e83, 0xddc: 0x0ebb, 0xddd: 0x1013, - 0xdde: 0x0edf, 0xddf: 0x0f13, 0xde0: 0x0f1f, 0xde1: 0x0f5f, 0xde2: 0x0f7b, 0xde3: 0x0f9f, - 0xde4: 0x0fc3, 0xde5: 0x0fc7, 0xde6: 0x0fe3, 0xde7: 0x0fe7, 0xde8: 0x0ff7, 0xde9: 0x100b, - 0xdea: 0x1007, 0xdeb: 0x1037, 0xdec: 0x10b3, 0xded: 0x10cb, 0xdee: 0x10e3, 0xdef: 0x111b, - 0xdf0: 0x112f, 0xdf1: 0x114b, 0xdf2: 0x117b, 0xdf3: 0x122f, 0xdf4: 0x1257, 0xdf5: 0x12cb, - 0xdf6: 0x1313, 0xdf7: 0x131f, 0xdf8: 0x1327, 0xdf9: 0x133f, 0xdfa: 0x1353, 0xdfb: 0x1343, - 0xdfc: 0x135b, 0xdfd: 0x1357, 0xdfe: 0x134f, 0xdff: 0x135f, - // Block 0x38, offset 0xe00 - 0xe00: 0x136b, 0xe01: 0x13a7, 0xe02: 0x13e3, 0xe03: 0x1413, 0xe04: 0x144b, 0xe05: 0x146b, - 0xe06: 0x14b7, 0xe07: 0x14db, 0xe08: 0x14fb, 0xe09: 0x150f, 0xe0a: 0x151f, 0xe0b: 0x152b, - 0xe0c: 0x1537, 0xe0d: 0x158b, 0xe0e: 0x162b, 0xe0f: 0x16b5, 0xe10: 0x16b0, 0xe11: 0x16e2, - 0xe12: 0x0607, 0xe13: 0x062f, 0xe14: 0x0633, 0xe15: 0x1764, 0xe16: 0x1791, 0xe17: 0x1809, - 0xe18: 0x1617, 0xe19: 0x1627, - // Block 0x39, offset 0xe40 - 0xe40: 0x19d5, 0xe41: 0x19d8, 0xe42: 0x19db, 0xe43: 0x1c08, 0xe44: 0x1c0c, 0xe45: 0x1a5f, - 0xe46: 0x1a5f, - 0xe53: 0x1d75, 0xe54: 0x1d66, 0xe55: 0x1d6b, 0xe56: 0x1d7a, 0xe57: 0x1d70, - 0xe5d: 0x4390, - 0xe5e: 0x8115, 0xe5f: 0x4402, 0xe60: 0x022d, 0xe61: 0x0215, 0xe62: 0x021e, 0xe63: 0x0221, - 0xe64: 0x0224, 0xe65: 0x0227, 0xe66: 0x022a, 0xe67: 0x0230, 0xe68: 0x0233, 0xe69: 0x0017, - 0xe6a: 0x43f0, 0xe6b: 0x43f6, 0xe6c: 0x44f4, 0xe6d: 0x44fc, 0xe6e: 0x4348, 0xe6f: 0x434e, - 0xe70: 0x4354, 0xe71: 0x435a, 0xe72: 0x4366, 0xe73: 0x436c, 0xe74: 0x4372, 0xe75: 0x437e, - 0xe76: 0x4384, 0xe78: 0x438a, 0xe79: 0x4396, 0xe7a: 0x439c, 0xe7b: 0x43a2, - 0xe7c: 0x43ae, 0xe7e: 0x43b4, - // Block 0x3a, offset 0xe80 - 0xe80: 0x43ba, 0xe81: 0x43c0, 0xe83: 0x43c6, 0xe84: 0x43cc, - 0xe86: 0x43d8, 0xe87: 0x43de, 0xe88: 0x43e4, 0xe89: 0x43ea, 0xe8a: 0x43fc, 0xe8b: 0x4378, - 0xe8c: 0x4360, 0xe8d: 0x43a8, 0xe8e: 0x43d2, 0xe8f: 0x1d7f, 0xe90: 0x0299, 0xe91: 0x0299, - 0xe92: 0x02a2, 0xe93: 0x02a2, 0xe94: 0x02a2, 0xe95: 0x02a2, 0xe96: 0x02a5, 0xe97: 0x02a5, - 0xe98: 0x02a5, 0xe99: 0x02a5, 0xe9a: 0x02ab, 0xe9b: 0x02ab, 0xe9c: 0x02ab, 0xe9d: 0x02ab, - 0xe9e: 0x029f, 0xe9f: 0x029f, 0xea0: 0x029f, 0xea1: 0x029f, 0xea2: 0x02a8, 0xea3: 0x02a8, - 0xea4: 0x02a8, 0xea5: 0x02a8, 0xea6: 0x029c, 0xea7: 0x029c, 0xea8: 0x029c, 0xea9: 0x029c, - 0xeaa: 0x02cf, 0xeab: 0x02cf, 0xeac: 0x02cf, 0xead: 0x02cf, 0xeae: 0x02d2, 0xeaf: 0x02d2, - 0xeb0: 0x02d2, 0xeb1: 0x02d2, 0xeb2: 0x02b1, 0xeb3: 0x02b1, 0xeb4: 0x02b1, 0xeb5: 0x02b1, - 0xeb6: 0x02ae, 0xeb7: 0x02ae, 0xeb8: 0x02ae, 0xeb9: 0x02ae, 0xeba: 0x02b4, 0xebb: 0x02b4, - 0xebc: 0x02b4, 0xebd: 0x02b4, 0xebe: 0x02b7, 0xebf: 0x02b7, - // Block 0x3b, offset 0xec0 - 0xec0: 0x02b7, 0xec1: 0x02b7, 0xec2: 0x02c0, 0xec3: 0x02c0, 0xec4: 0x02bd, 0xec5: 0x02bd, - 0xec6: 0x02c3, 0xec7: 0x02c3, 0xec8: 0x02ba, 0xec9: 0x02ba, 0xeca: 0x02c9, 0xecb: 0x02c9, - 0xecc: 0x02c6, 0xecd: 0x02c6, 0xece: 0x02d5, 0xecf: 0x02d5, 0xed0: 0x02d5, 0xed1: 0x02d5, - 0xed2: 0x02db, 0xed3: 0x02db, 0xed4: 0x02db, 0xed5: 0x02db, 0xed6: 0x02e1, 0xed7: 0x02e1, - 0xed8: 0x02e1, 0xed9: 0x02e1, 0xeda: 0x02de, 0xedb: 0x02de, 0xedc: 0x02de, 0xedd: 0x02de, - 0xede: 0x02e4, 0xedf: 0x02e4, 0xee0: 0x02e7, 0xee1: 0x02e7, 0xee2: 0x02e7, 0xee3: 0x02e7, - 0xee4: 0x446e, 0xee5: 0x446e, 0xee6: 0x02ed, 0xee7: 0x02ed, 0xee8: 0x02ed, 0xee9: 0x02ed, - 0xeea: 0x02ea, 0xeeb: 0x02ea, 0xeec: 0x02ea, 0xeed: 0x02ea, 0xeee: 0x0308, 0xeef: 0x0308, - 0xef0: 0x4468, 0xef1: 0x4468, - // Block 0x3c, offset 0xf00 - 0xf13: 0x02d8, 0xf14: 0x02d8, 0xf15: 0x02d8, 0xf16: 0x02d8, 0xf17: 0x02f6, - 0xf18: 0x02f6, 0xf19: 0x02f3, 0xf1a: 0x02f3, 0xf1b: 0x02f9, 0xf1c: 0x02f9, 0xf1d: 0x204f, - 0xf1e: 0x02ff, 0xf1f: 0x02ff, 0xf20: 0x02f0, 0xf21: 0x02f0, 0xf22: 0x02fc, 0xf23: 0x02fc, - 0xf24: 0x0305, 0xf25: 0x0305, 0xf26: 0x0305, 0xf27: 0x0305, 0xf28: 0x028d, 0xf29: 0x028d, - 0xf2a: 0x25aa, 0xf2b: 0x25aa, 0xf2c: 0x261a, 0xf2d: 0x261a, 0xf2e: 0x25e9, 0xf2f: 0x25e9, - 0xf30: 0x2605, 0xf31: 0x2605, 0xf32: 0x25fe, 0xf33: 0x25fe, 0xf34: 0x260c, 0xf35: 0x260c, - 0xf36: 0x2613, 0xf37: 0x2613, 0xf38: 0x2613, 0xf39: 0x25f0, 0xf3a: 0x25f0, 0xf3b: 0x25f0, - 0xf3c: 0x0302, 0xf3d: 0x0302, 0xf3e: 0x0302, 0xf3f: 0x0302, - // Block 0x3d, offset 0xf40 - 0xf40: 0x25b1, 0xf41: 0x25b8, 0xf42: 0x25d4, 0xf43: 0x25f0, 0xf44: 0x25f7, 0xf45: 0x1d89, - 0xf46: 0x1d8e, 0xf47: 0x1d93, 0xf48: 0x1da2, 0xf49: 0x1db1, 0xf4a: 0x1db6, 0xf4b: 0x1dbb, - 0xf4c: 0x1dc0, 0xf4d: 0x1dc5, 0xf4e: 0x1dd4, 0xf4f: 0x1de3, 0xf50: 0x1de8, 0xf51: 0x1ded, - 0xf52: 0x1dfc, 0xf53: 0x1e0b, 0xf54: 0x1e10, 0xf55: 0x1e15, 0xf56: 0x1e1a, 0xf57: 0x1e29, - 0xf58: 0x1e2e, 0xf59: 0x1e3d, 0xf5a: 0x1e42, 0xf5b: 0x1e47, 0xf5c: 0x1e56, 0xf5d: 0x1e5b, - 0xf5e: 0x1e60, 0xf5f: 0x1e6a, 0xf60: 0x1ea6, 0xf61: 0x1eb5, 0xf62: 0x1ec4, 0xf63: 0x1ec9, - 0xf64: 0x1ece, 0xf65: 0x1ed8, 0xf66: 0x1ee7, 0xf67: 0x1eec, 0xf68: 0x1efb, 0xf69: 0x1f00, - 0xf6a: 0x1f05, 0xf6b: 0x1f14, 0xf6c: 0x1f19, 0xf6d: 0x1f28, 0xf6e: 0x1f2d, 0xf6f: 0x1f32, - 0xf70: 0x1f37, 0xf71: 0x1f3c, 0xf72: 0x1f41, 0xf73: 0x1f46, 0xf74: 0x1f4b, 0xf75: 0x1f50, - 0xf76: 0x1f55, 0xf77: 0x1f5a, 0xf78: 0x1f5f, 0xf79: 0x1f64, 0xf7a: 0x1f69, 0xf7b: 0x1f6e, - 0xf7c: 0x1f73, 0xf7d: 0x1f78, 0xf7e: 0x1f7d, 0xf7f: 0x1f87, - // Block 0x3e, offset 0xf80 - 0xf80: 0x1f8c, 0xf81: 0x1f91, 0xf82: 0x1f96, 0xf83: 0x1fa0, 0xf84: 0x1fa5, 0xf85: 0x1faf, - 0xf86: 0x1fb4, 0xf87: 0x1fb9, 0xf88: 0x1fbe, 0xf89: 0x1fc3, 0xf8a: 0x1fc8, 0xf8b: 0x1fcd, - 0xf8c: 0x1fd2, 0xf8d: 0x1fd7, 0xf8e: 0x1fe6, 0xf8f: 0x1ff5, 0xf90: 0x1ffa, 0xf91: 0x1fff, - 0xf92: 0x2004, 0xf93: 0x2009, 0xf94: 0x200e, 0xf95: 0x2018, 0xf96: 0x201d, 0xf97: 0x2022, - 0xf98: 0x2031, 0xf99: 0x2040, 0xf9a: 0x2045, 0xf9b: 0x4420, 0xf9c: 0x4426, 0xf9d: 0x445c, - 0xf9e: 0x44b3, 0xf9f: 0x44ba, 0xfa0: 0x44c1, 0xfa1: 0x44c8, 0xfa2: 0x44cf, 0xfa3: 0x44d6, - 0xfa4: 0x25c6, 0xfa5: 0x25cd, 0xfa6: 0x25d4, 0xfa7: 0x25db, 0xfa8: 0x25f0, 0xfa9: 0x25f7, - 0xfaa: 0x1d98, 0xfab: 0x1d9d, 0xfac: 0x1da2, 0xfad: 0x1da7, 0xfae: 0x1db1, 0xfaf: 0x1db6, - 0xfb0: 0x1dca, 0xfb1: 0x1dcf, 0xfb2: 0x1dd4, 0xfb3: 0x1dd9, 0xfb4: 0x1de3, 0xfb5: 0x1de8, - 0xfb6: 0x1df2, 0xfb7: 0x1df7, 0xfb8: 0x1dfc, 0xfb9: 0x1e01, 0xfba: 0x1e0b, 0xfbb: 0x1e10, - 0xfbc: 0x1f3c, 0xfbd: 0x1f41, 0xfbe: 0x1f50, 0xfbf: 0x1f55, - // Block 0x3f, offset 0xfc0 - 0xfc0: 0x1f5a, 0xfc1: 0x1f6e, 0xfc2: 0x1f73, 0xfc3: 0x1f78, 0xfc4: 0x1f7d, 0xfc5: 0x1f96, - 0xfc6: 0x1fa0, 0xfc7: 0x1fa5, 0xfc8: 0x1faa, 0xfc9: 0x1fbe, 0xfca: 0x1fdc, 0xfcb: 0x1fe1, - 0xfcc: 0x1fe6, 0xfcd: 0x1feb, 0xfce: 0x1ff5, 0xfcf: 0x1ffa, 0xfd0: 0x445c, 0xfd1: 0x2027, - 0xfd2: 0x202c, 0xfd3: 0x2031, 0xfd4: 0x2036, 0xfd5: 0x2040, 0xfd6: 0x2045, 0xfd7: 0x25b1, - 0xfd8: 0x25b8, 0xfd9: 0x25bf, 0xfda: 0x25d4, 0xfdb: 0x25e2, 0xfdc: 0x1d89, 0xfdd: 0x1d8e, - 0xfde: 0x1d93, 0xfdf: 0x1da2, 0xfe0: 0x1dac, 0xfe1: 0x1dbb, 0xfe2: 0x1dc0, 0xfe3: 0x1dc5, - 0xfe4: 0x1dd4, 0xfe5: 0x1dde, 0xfe6: 0x1dfc, 0xfe7: 0x1e15, 0xfe8: 0x1e1a, 0xfe9: 0x1e29, - 0xfea: 0x1e2e, 0xfeb: 0x1e3d, 0xfec: 0x1e47, 0xfed: 0x1e56, 0xfee: 0x1e5b, 0xfef: 0x1e60, - 0xff0: 0x1e6a, 0xff1: 0x1ea6, 0xff2: 0x1eab, 0xff3: 0x1eb5, 0xff4: 0x1ec4, 0xff5: 0x1ec9, - 0xff6: 0x1ece, 0xff7: 0x1ed8, 0xff8: 0x1ee7, 0xff9: 0x1efb, 0xffa: 0x1f00, 0xffb: 0x1f05, - 0xffc: 0x1f14, 0xffd: 0x1f19, 0xffe: 0x1f28, 0xfff: 0x1f2d, - // Block 0x40, offset 0x1000 - 0x1000: 0x1f32, 0x1001: 0x1f37, 0x1002: 0x1f46, 0x1003: 0x1f4b, 0x1004: 0x1f5f, 0x1005: 0x1f64, - 0x1006: 0x1f69, 0x1007: 0x1f6e, 0x1008: 0x1f73, 0x1009: 0x1f87, 0x100a: 0x1f8c, 0x100b: 0x1f91, - 0x100c: 0x1f96, 0x100d: 0x1f9b, 0x100e: 0x1faf, 0x100f: 0x1fb4, 0x1010: 0x1fb9, 0x1011: 0x1fbe, - 0x1012: 0x1fcd, 0x1013: 0x1fd2, 0x1014: 0x1fd7, 0x1015: 0x1fe6, 0x1016: 0x1ff0, 0x1017: 0x1fff, - 0x1018: 0x2004, 0x1019: 0x4450, 0x101a: 0x2018, 0x101b: 0x201d, 0x101c: 0x2022, 0x101d: 0x2031, - 0x101e: 0x203b, 0x101f: 0x25d4, 0x1020: 0x25e2, 0x1021: 0x1da2, 0x1022: 0x1dac, 0x1023: 0x1dd4, - 0x1024: 0x1dde, 0x1025: 0x1dfc, 0x1026: 0x1e06, 0x1027: 0x1e6a, 0x1028: 0x1e6f, 0x1029: 0x1e92, - 0x102a: 0x1e97, 0x102b: 0x1f6e, 0x102c: 0x1f73, 0x102d: 0x1f96, 0x102e: 0x1fe6, 0x102f: 0x1ff0, - 0x1030: 0x2031, 0x1031: 0x203b, 0x1032: 0x4504, 0x1033: 0x450c, 0x1034: 0x4514, 0x1035: 0x1ef1, - 0x1036: 0x1ef6, 0x1037: 0x1f0a, 0x1038: 0x1f0f, 0x1039: 0x1f1e, 0x103a: 0x1f23, 0x103b: 0x1e74, - 0x103c: 0x1e79, 0x103d: 0x1e9c, 0x103e: 0x1ea1, 0x103f: 0x1e33, - // Block 0x41, offset 0x1040 - 0x1040: 0x1e38, 0x1041: 0x1e1f, 0x1042: 0x1e24, 0x1043: 0x1e4c, 0x1044: 0x1e51, 0x1045: 0x1eba, - 0x1046: 0x1ebf, 0x1047: 0x1edd, 0x1048: 0x1ee2, 0x1049: 0x1e7e, 0x104a: 0x1e83, 0x104b: 0x1e88, - 0x104c: 0x1e92, 0x104d: 0x1e8d, 0x104e: 0x1e65, 0x104f: 0x1eb0, 0x1050: 0x1ed3, 0x1051: 0x1ef1, - 0x1052: 0x1ef6, 0x1053: 0x1f0a, 0x1054: 0x1f0f, 0x1055: 0x1f1e, 0x1056: 0x1f23, 0x1057: 0x1e74, - 0x1058: 0x1e79, 0x1059: 0x1e9c, 0x105a: 0x1ea1, 0x105b: 0x1e33, 0x105c: 0x1e38, 0x105d: 0x1e1f, - 0x105e: 0x1e24, 0x105f: 0x1e4c, 0x1060: 0x1e51, 0x1061: 0x1eba, 0x1062: 0x1ebf, 0x1063: 0x1edd, - 0x1064: 0x1ee2, 0x1065: 0x1e7e, 0x1066: 0x1e83, 0x1067: 0x1e88, 0x1068: 0x1e92, 0x1069: 0x1e8d, - 0x106a: 0x1e65, 0x106b: 0x1eb0, 0x106c: 0x1ed3, 0x106d: 0x1e7e, 0x106e: 0x1e83, 0x106f: 0x1e88, - 0x1070: 0x1e92, 0x1071: 0x1e6f, 0x1072: 0x1e97, 0x1073: 0x1eec, 0x1074: 0x1e56, 0x1075: 0x1e5b, - 0x1076: 0x1e60, 0x1077: 0x1e7e, 0x1078: 0x1e83, 0x1079: 0x1e88, 0x107a: 0x1eec, 0x107b: 0x1efb, - 0x107c: 0x4408, 0x107d: 0x4408, - // Block 0x42, offset 0x1080 - 0x1090: 0x2311, 0x1091: 0x2326, - 0x1092: 0x2326, 0x1093: 0x232d, 0x1094: 0x2334, 0x1095: 0x2349, 0x1096: 0x2350, 0x1097: 0x2357, - 0x1098: 0x237a, 0x1099: 0x237a, 0x109a: 0x239d, 0x109b: 0x2396, 0x109c: 0x23b2, 0x109d: 0x23a4, - 0x109e: 0x23ab, 0x109f: 0x23ce, 0x10a0: 0x23ce, 0x10a1: 0x23c7, 0x10a2: 0x23d5, 0x10a3: 0x23d5, - 0x10a4: 0x23ff, 0x10a5: 0x23ff, 0x10a6: 0x241b, 0x10a7: 0x23e3, 0x10a8: 0x23e3, 0x10a9: 0x23dc, - 0x10aa: 0x23f1, 0x10ab: 0x23f1, 0x10ac: 0x23f8, 0x10ad: 0x23f8, 0x10ae: 0x2422, 0x10af: 0x2430, - 0x10b0: 0x2430, 0x10b1: 0x2437, 0x10b2: 0x2437, 0x10b3: 0x243e, 0x10b4: 0x2445, 0x10b5: 0x244c, - 0x10b6: 0x2453, 0x10b7: 0x2453, 0x10b8: 0x245a, 0x10b9: 0x2468, 0x10ba: 0x2476, 0x10bb: 0x246f, - 0x10bc: 0x247d, 0x10bd: 0x247d, 0x10be: 0x2492, 0x10bf: 0x2499, - // Block 0x43, offset 0x10c0 - 0x10c0: 0x24ca, 0x10c1: 0x24d8, 0x10c2: 0x24d1, 0x10c3: 0x24b5, 0x10c4: 0x24b5, 0x10c5: 0x24df, - 0x10c6: 0x24df, 0x10c7: 0x24e6, 0x10c8: 0x24e6, 0x10c9: 0x2510, 0x10ca: 0x2517, 0x10cb: 0x251e, - 0x10cc: 0x24f4, 0x10cd: 0x2502, 0x10ce: 0x2525, 0x10cf: 0x252c, - 0x10d2: 0x24fb, 0x10d3: 0x2580, 0x10d4: 0x2587, 0x10d5: 0x255d, 0x10d6: 0x2564, 0x10d7: 0x2548, - 0x10d8: 0x2548, 0x10d9: 0x254f, 0x10da: 0x2579, 0x10db: 0x2572, 0x10dc: 0x259c, 0x10dd: 0x259c, - 0x10de: 0x230a, 0x10df: 0x231f, 0x10e0: 0x2318, 0x10e1: 0x2342, 0x10e2: 0x233b, 0x10e3: 0x2365, - 0x10e4: 0x235e, 0x10e5: 0x2388, 0x10e6: 0x236c, 0x10e7: 0x2381, 0x10e8: 0x23b9, 0x10e9: 0x2406, - 0x10ea: 0x23ea, 0x10eb: 0x2429, 0x10ec: 0x24c3, 0x10ed: 0x24ed, 0x10ee: 0x2595, 0x10ef: 0x258e, - 0x10f0: 0x25a3, 0x10f1: 0x253a, 0x10f2: 0x24a0, 0x10f3: 0x256b, 0x10f4: 0x2492, 0x10f5: 0x24ca, - 0x10f6: 0x2461, 0x10f7: 0x24ae, 0x10f8: 0x2541, 0x10f9: 0x2533, 0x10fa: 0x24bc, 0x10fb: 0x24a7, - 0x10fc: 0x24bc, 0x10fd: 0x2541, 0x10fe: 0x2373, 0x10ff: 0x238f, - // Block 0x44, offset 0x1100 - 0x1100: 0x2509, 0x1101: 0x2484, 0x1102: 0x2303, 0x1103: 0x24a7, 0x1104: 0x244c, 0x1105: 0x241b, - 0x1106: 0x23c0, 0x1107: 0x2556, - 0x1130: 0x2414, 0x1131: 0x248b, 0x1132: 0x27bf, 0x1133: 0x27b6, 0x1134: 0x27ec, 0x1135: 0x27da, - 0x1136: 0x27c8, 0x1137: 0x27e3, 0x1138: 0x27f5, 0x1139: 0x240d, 0x113a: 0x2c7c, 0x113b: 0x2afc, - 0x113c: 0x27d1, - // Block 0x45, offset 0x1140 - 0x1150: 0x0019, 0x1151: 0x0483, - 0x1152: 0x0487, 0x1153: 0x0035, 0x1154: 0x0037, 0x1155: 0x0003, 0x1156: 0x003f, 0x1157: 0x04bf, - 0x1158: 0x04c3, 0x1159: 0x1b5c, - 0x1160: 0x8132, 0x1161: 0x8132, 0x1162: 0x8132, 0x1163: 0x8132, - 0x1164: 0x8132, 0x1165: 0x8132, 0x1166: 0x8132, 0x1167: 0x812d, 0x1168: 0x812d, 0x1169: 0x812d, - 0x116a: 0x812d, 0x116b: 0x812d, 0x116c: 0x812d, 0x116d: 0x812d, 0x116e: 0x8132, 0x116f: 0x8132, - 0x1170: 0x1873, 0x1171: 0x0443, 0x1172: 0x043f, 0x1173: 0x007f, 0x1174: 0x007f, 0x1175: 0x0011, - 0x1176: 0x0013, 0x1177: 0x00b7, 0x1178: 0x00bb, 0x1179: 0x04b7, 0x117a: 0x04bb, 0x117b: 0x04ab, - 0x117c: 0x04af, 0x117d: 0x0493, 0x117e: 0x0497, 0x117f: 0x048b, - // Block 0x46, offset 0x1180 - 0x1180: 0x048f, 0x1181: 0x049b, 0x1182: 0x049f, 0x1183: 0x04a3, 0x1184: 0x04a7, - 0x1187: 0x0077, 0x1188: 0x007b, 0x1189: 0x4269, 0x118a: 0x4269, 0x118b: 0x4269, - 0x118c: 0x4269, 0x118d: 0x007f, 0x118e: 0x007f, 0x118f: 0x007f, 0x1190: 0x0019, 0x1191: 0x0483, - 0x1192: 0x001d, 0x1194: 0x0037, 0x1195: 0x0035, 0x1196: 0x003f, 0x1197: 0x0003, - 0x1198: 0x0443, 0x1199: 0x0011, 0x119a: 0x0013, 0x119b: 0x00b7, 0x119c: 0x00bb, 0x119d: 0x04b7, - 0x119e: 0x04bb, 0x119f: 0x0007, 0x11a0: 0x000d, 0x11a1: 0x0015, 0x11a2: 0x0017, 0x11a3: 0x001b, - 0x11a4: 0x0039, 0x11a5: 0x003d, 0x11a6: 0x003b, 0x11a8: 0x0079, 0x11a9: 0x0009, - 0x11aa: 0x000b, 0x11ab: 0x0041, - 0x11b0: 0x42aa, 0x11b1: 0x442c, 0x11b2: 0x42af, 0x11b4: 0x42b4, - 0x11b6: 0x42b9, 0x11b7: 0x4432, 0x11b8: 0x42be, 0x11b9: 0x4438, 0x11ba: 0x42c3, 0x11bb: 0x443e, - 0x11bc: 0x42c8, 0x11bd: 0x4444, 0x11be: 0x42cd, 0x11bf: 0x444a, - // Block 0x47, offset 0x11c0 - 0x11c0: 0x0236, 0x11c1: 0x440e, 0x11c2: 0x440e, 0x11c3: 0x4414, 0x11c4: 0x4414, 0x11c5: 0x4456, - 0x11c6: 0x4456, 0x11c7: 0x441a, 0x11c8: 0x441a, 0x11c9: 0x4462, 0x11ca: 0x4462, 0x11cb: 0x4462, - 0x11cc: 0x4462, 0x11cd: 0x0239, 0x11ce: 0x0239, 0x11cf: 0x023c, 0x11d0: 0x023c, 0x11d1: 0x023c, - 0x11d2: 0x023c, 0x11d3: 0x023f, 0x11d4: 0x023f, 0x11d5: 0x0242, 0x11d6: 0x0242, 0x11d7: 0x0242, - 0x11d8: 0x0242, 0x11d9: 0x0245, 0x11da: 0x0245, 0x11db: 0x0245, 0x11dc: 0x0245, 0x11dd: 0x0248, - 0x11de: 0x0248, 0x11df: 0x0248, 0x11e0: 0x0248, 0x11e1: 0x024b, 0x11e2: 0x024b, 0x11e3: 0x024b, - 0x11e4: 0x024b, 0x11e5: 0x024e, 0x11e6: 0x024e, 0x11e7: 0x024e, 0x11e8: 0x024e, 0x11e9: 0x0251, - 0x11ea: 0x0251, 0x11eb: 0x0254, 0x11ec: 0x0254, 0x11ed: 0x0257, 0x11ee: 0x0257, 0x11ef: 0x025a, - 0x11f0: 0x025a, 0x11f1: 0x025d, 0x11f2: 0x025d, 0x11f3: 0x025d, 0x11f4: 0x025d, 0x11f5: 0x0260, - 0x11f6: 0x0260, 0x11f7: 0x0260, 0x11f8: 0x0260, 0x11f9: 0x0263, 0x11fa: 0x0263, 0x11fb: 0x0263, - 0x11fc: 0x0263, 0x11fd: 0x0266, 0x11fe: 0x0266, 0x11ff: 0x0266, - // Block 0x48, offset 0x1200 - 0x1200: 0x0266, 0x1201: 0x0269, 0x1202: 0x0269, 0x1203: 0x0269, 0x1204: 0x0269, 0x1205: 0x026c, - 0x1206: 0x026c, 0x1207: 0x026c, 0x1208: 0x026c, 0x1209: 0x026f, 0x120a: 0x026f, 0x120b: 0x026f, - 0x120c: 0x026f, 0x120d: 0x0272, 0x120e: 0x0272, 0x120f: 0x0272, 0x1210: 0x0272, 0x1211: 0x0275, - 0x1212: 0x0275, 0x1213: 0x0275, 0x1214: 0x0275, 0x1215: 0x0278, 0x1216: 0x0278, 0x1217: 0x0278, - 0x1218: 0x0278, 0x1219: 0x027b, 0x121a: 0x027b, 0x121b: 0x027b, 0x121c: 0x027b, 0x121d: 0x027e, - 0x121e: 0x027e, 0x121f: 0x027e, 0x1220: 0x027e, 0x1221: 0x0281, 0x1222: 0x0281, 0x1223: 0x0281, - 0x1224: 0x0281, 0x1225: 0x0284, 0x1226: 0x0284, 0x1227: 0x0284, 0x1228: 0x0284, 0x1229: 0x0287, - 0x122a: 0x0287, 0x122b: 0x0287, 0x122c: 0x0287, 0x122d: 0x028a, 0x122e: 0x028a, 0x122f: 0x028d, - 0x1230: 0x028d, 0x1231: 0x0290, 0x1232: 0x0290, 0x1233: 0x0290, 0x1234: 0x0290, 0x1235: 0x2e00, - 0x1236: 0x2e00, 0x1237: 0x2e08, 0x1238: 0x2e08, 0x1239: 0x2e10, 0x123a: 0x2e10, 0x123b: 0x1f82, - 0x123c: 0x1f82, - // Block 0x49, offset 0x1240 - 0x1240: 0x0081, 0x1241: 0x0083, 0x1242: 0x0085, 0x1243: 0x0087, 0x1244: 0x0089, 0x1245: 0x008b, - 0x1246: 0x008d, 0x1247: 0x008f, 0x1248: 0x0091, 0x1249: 0x0093, 0x124a: 0x0095, 0x124b: 0x0097, - 0x124c: 0x0099, 0x124d: 0x009b, 0x124e: 0x009d, 0x124f: 0x009f, 0x1250: 0x00a1, 0x1251: 0x00a3, - 0x1252: 0x00a5, 0x1253: 0x00a7, 0x1254: 0x00a9, 0x1255: 0x00ab, 0x1256: 0x00ad, 0x1257: 0x00af, - 0x1258: 0x00b1, 0x1259: 0x00b3, 0x125a: 0x00b5, 0x125b: 0x00b7, 0x125c: 0x00b9, 0x125d: 0x00bb, - 0x125e: 0x00bd, 0x125f: 0x0477, 0x1260: 0x047b, 0x1261: 0x0487, 0x1262: 0x049b, 0x1263: 0x049f, - 0x1264: 0x0483, 0x1265: 0x05ab, 0x1266: 0x05a3, 0x1267: 0x04c7, 0x1268: 0x04cf, 0x1269: 0x04d7, - 0x126a: 0x04df, 0x126b: 0x04e7, 0x126c: 0x056b, 0x126d: 0x0573, 0x126e: 0x057b, 0x126f: 0x051f, - 0x1270: 0x05af, 0x1271: 0x04cb, 0x1272: 0x04d3, 0x1273: 0x04db, 0x1274: 0x04e3, 0x1275: 0x04eb, - 0x1276: 0x04ef, 0x1277: 0x04f3, 0x1278: 0x04f7, 0x1279: 0x04fb, 0x127a: 0x04ff, 0x127b: 0x0503, - 0x127c: 0x0507, 0x127d: 0x050b, 0x127e: 0x050f, 0x127f: 0x0513, - // Block 0x4a, offset 0x1280 - 0x1280: 0x0517, 0x1281: 0x051b, 0x1282: 0x0523, 0x1283: 0x0527, 0x1284: 0x052b, 0x1285: 0x052f, - 0x1286: 0x0533, 0x1287: 0x0537, 0x1288: 0x053b, 0x1289: 0x053f, 0x128a: 0x0543, 0x128b: 0x0547, - 0x128c: 0x054b, 0x128d: 0x054f, 0x128e: 0x0553, 0x128f: 0x0557, 0x1290: 0x055b, 0x1291: 0x055f, - 0x1292: 0x0563, 0x1293: 0x0567, 0x1294: 0x056f, 0x1295: 0x0577, 0x1296: 0x057f, 0x1297: 0x0583, - 0x1298: 0x0587, 0x1299: 0x058b, 0x129a: 0x058f, 0x129b: 0x0593, 0x129c: 0x0597, 0x129d: 0x05a7, - 0x129e: 0x4a78, 0x129f: 0x4a7e, 0x12a0: 0x03c3, 0x12a1: 0x0313, 0x12a2: 0x0317, 0x12a3: 0x4a3b, - 0x12a4: 0x031b, 0x12a5: 0x4a41, 0x12a6: 0x4a47, 0x12a7: 0x031f, 0x12a8: 0x0323, 0x12a9: 0x0327, - 0x12aa: 0x4a4d, 0x12ab: 0x4a53, 0x12ac: 0x4a59, 0x12ad: 0x4a5f, 0x12ae: 0x4a65, 0x12af: 0x4a6b, - 0x12b0: 0x0367, 0x12b1: 0x032b, 0x12b2: 0x032f, 0x12b3: 0x0333, 0x12b4: 0x037b, 0x12b5: 0x0337, - 0x12b6: 0x033b, 0x12b7: 0x033f, 0x12b8: 0x0343, 0x12b9: 0x0347, 0x12ba: 0x034b, 0x12bb: 0x034f, - 0x12bc: 0x0353, 0x12bd: 0x0357, 0x12be: 0x035b, - // Block 0x4b, offset 0x12c0 - 0x12c2: 0x49bd, 0x12c3: 0x49c3, 0x12c4: 0x49c9, 0x12c5: 0x49cf, - 0x12c6: 0x49d5, 0x12c7: 0x49db, 0x12ca: 0x49e1, 0x12cb: 0x49e7, - 0x12cc: 0x49ed, 0x12cd: 0x49f3, 0x12ce: 0x49f9, 0x12cf: 0x49ff, - 0x12d2: 0x4a05, 0x12d3: 0x4a0b, 0x12d4: 0x4a11, 0x12d5: 0x4a17, 0x12d6: 0x4a1d, 0x12d7: 0x4a23, - 0x12da: 0x4a29, 0x12db: 0x4a2f, 0x12dc: 0x4a35, - 0x12e0: 0x00bf, 0x12e1: 0x00c2, 0x12e2: 0x00cb, 0x12e3: 0x4264, - 0x12e4: 0x00c8, 0x12e5: 0x00c5, 0x12e6: 0x0447, 0x12e8: 0x046b, 0x12e9: 0x044b, - 0x12ea: 0x044f, 0x12eb: 0x0453, 0x12ec: 0x0457, 0x12ed: 0x046f, 0x12ee: 0x0473, - // Block 0x4c, offset 0x1300 - 0x1300: 0x0063, 0x1301: 0x0065, 0x1302: 0x0067, 0x1303: 0x0069, 0x1304: 0x006b, 0x1305: 0x006d, - 0x1306: 0x006f, 0x1307: 0x0071, 0x1308: 0x0073, 0x1309: 0x0075, 0x130a: 0x0083, 0x130b: 0x0085, - 0x130c: 0x0087, 0x130d: 0x0089, 0x130e: 0x008b, 0x130f: 0x008d, 0x1310: 0x008f, 0x1311: 0x0091, - 0x1312: 0x0093, 0x1313: 0x0095, 0x1314: 0x0097, 0x1315: 0x0099, 0x1316: 0x009b, 0x1317: 0x009d, - 0x1318: 0x009f, 0x1319: 0x00a1, 0x131a: 0x00a3, 0x131b: 0x00a5, 0x131c: 0x00a7, 0x131d: 0x00a9, - 0x131e: 0x00ab, 0x131f: 0x00ad, 0x1320: 0x00af, 0x1321: 0x00b1, 0x1322: 0x00b3, 0x1323: 0x00b5, - 0x1324: 0x00dd, 0x1325: 0x00f2, 0x1328: 0x0173, 0x1329: 0x0176, - 0x132a: 0x0179, 0x132b: 0x017c, 0x132c: 0x017f, 0x132d: 0x0182, 0x132e: 0x0185, 0x132f: 0x0188, - 0x1330: 0x018b, 0x1331: 0x018e, 0x1332: 0x0191, 0x1333: 0x0194, 0x1334: 0x0197, 0x1335: 0x019a, - 0x1336: 0x019d, 0x1337: 0x01a0, 0x1338: 0x01a3, 0x1339: 0x0188, 0x133a: 0x01a6, 0x133b: 0x01a9, - 0x133c: 0x01ac, 0x133d: 0x01af, 0x133e: 0x01b2, 0x133f: 0x01b5, - // Block 0x4d, offset 0x1340 - 0x1340: 0x01fd, 0x1341: 0x0200, 0x1342: 0x0203, 0x1343: 0x045b, 0x1344: 0x01c7, 0x1345: 0x01d0, - 0x1346: 0x01d6, 0x1347: 0x01fa, 0x1348: 0x01eb, 0x1349: 0x01e8, 0x134a: 0x0206, 0x134b: 0x0209, - 0x134e: 0x0021, 0x134f: 0x0023, 0x1350: 0x0025, 0x1351: 0x0027, - 0x1352: 0x0029, 0x1353: 0x002b, 0x1354: 0x002d, 0x1355: 0x002f, 0x1356: 0x0031, 0x1357: 0x0033, - 0x1358: 0x0021, 0x1359: 0x0023, 0x135a: 0x0025, 0x135b: 0x0027, 0x135c: 0x0029, 0x135d: 0x002b, - 0x135e: 0x002d, 0x135f: 0x002f, 0x1360: 0x0031, 0x1361: 0x0033, 0x1362: 0x0021, 0x1363: 0x0023, - 0x1364: 0x0025, 0x1365: 0x0027, 0x1366: 0x0029, 0x1367: 0x002b, 0x1368: 0x002d, 0x1369: 0x002f, - 0x136a: 0x0031, 0x136b: 0x0033, 0x136c: 0x0021, 0x136d: 0x0023, 0x136e: 0x0025, 0x136f: 0x0027, - 0x1370: 0x0029, 0x1371: 0x002b, 0x1372: 0x002d, 0x1373: 0x002f, 0x1374: 0x0031, 0x1375: 0x0033, - 0x1376: 0x0021, 0x1377: 0x0023, 0x1378: 0x0025, 0x1379: 0x0027, 0x137a: 0x0029, 0x137b: 0x002b, - 0x137c: 0x002d, 0x137d: 0x002f, 0x137e: 0x0031, 0x137f: 0x0033, - // Block 0x4e, offset 0x1380 - 0x1380: 0x0239, 0x1381: 0x023c, 0x1382: 0x0248, 0x1383: 0x0251, 0x1385: 0x028a, - 0x1386: 0x025a, 0x1387: 0x024b, 0x1388: 0x0269, 0x1389: 0x0290, 0x138a: 0x027b, 0x138b: 0x027e, - 0x138c: 0x0281, 0x138d: 0x0284, 0x138e: 0x025d, 0x138f: 0x026f, 0x1390: 0x0275, 0x1391: 0x0263, - 0x1392: 0x0278, 0x1393: 0x0257, 0x1394: 0x0260, 0x1395: 0x0242, 0x1396: 0x0245, 0x1397: 0x024e, - 0x1398: 0x0254, 0x1399: 0x0266, 0x139a: 0x026c, 0x139b: 0x0272, 0x139c: 0x0293, 0x139d: 0x02e4, - 0x139e: 0x02cc, 0x139f: 0x0296, 0x13a1: 0x023c, 0x13a2: 0x0248, - 0x13a4: 0x0287, 0x13a7: 0x024b, 0x13a9: 0x0290, - 0x13aa: 0x027b, 0x13ab: 0x027e, 0x13ac: 0x0281, 0x13ad: 0x0284, 0x13ae: 0x025d, 0x13af: 0x026f, - 0x13b0: 0x0275, 0x13b1: 0x0263, 0x13b2: 0x0278, 0x13b4: 0x0260, 0x13b5: 0x0242, - 0x13b6: 0x0245, 0x13b7: 0x024e, 0x13b9: 0x0266, 0x13bb: 0x0272, - // Block 0x4f, offset 0x13c0 - 0x13c2: 0x0248, - 0x13c7: 0x024b, 0x13c9: 0x0290, 0x13cb: 0x027e, - 0x13cd: 0x0284, 0x13ce: 0x025d, 0x13cf: 0x026f, 0x13d1: 0x0263, - 0x13d2: 0x0278, 0x13d4: 0x0260, 0x13d7: 0x024e, - 0x13d9: 0x0266, 0x13db: 0x0272, 0x13dd: 0x02e4, - 0x13df: 0x0296, 0x13e1: 0x023c, 0x13e2: 0x0248, - 0x13e4: 0x0287, 0x13e7: 0x024b, 0x13e8: 0x0269, 0x13e9: 0x0290, - 0x13ea: 0x027b, 0x13ec: 0x0281, 0x13ed: 0x0284, 0x13ee: 0x025d, 0x13ef: 0x026f, - 0x13f0: 0x0275, 0x13f1: 0x0263, 0x13f2: 0x0278, 0x13f4: 0x0260, 0x13f5: 0x0242, - 0x13f6: 0x0245, 0x13f7: 0x024e, 0x13f9: 0x0266, 0x13fa: 0x026c, 0x13fb: 0x0272, - 0x13fc: 0x0293, 0x13fe: 0x02cc, - // Block 0x50, offset 0x1400 - 0x1400: 0x0239, 0x1401: 0x023c, 0x1402: 0x0248, 0x1403: 0x0251, 0x1404: 0x0287, 0x1405: 0x028a, - 0x1406: 0x025a, 0x1407: 0x024b, 0x1408: 0x0269, 0x1409: 0x0290, 0x140b: 0x027e, - 0x140c: 0x0281, 0x140d: 0x0284, 0x140e: 0x025d, 0x140f: 0x026f, 0x1410: 0x0275, 0x1411: 0x0263, - 0x1412: 0x0278, 0x1413: 0x0257, 0x1414: 0x0260, 0x1415: 0x0242, 0x1416: 0x0245, 0x1417: 0x024e, - 0x1418: 0x0254, 0x1419: 0x0266, 0x141a: 0x026c, 0x141b: 0x0272, - 0x1421: 0x023c, 0x1422: 0x0248, 0x1423: 0x0251, - 0x1425: 0x028a, 0x1426: 0x025a, 0x1427: 0x024b, 0x1428: 0x0269, 0x1429: 0x0290, - 0x142b: 0x027e, 0x142c: 0x0281, 0x142d: 0x0284, 0x142e: 0x025d, 0x142f: 0x026f, - 0x1430: 0x0275, 0x1431: 0x0263, 0x1432: 0x0278, 0x1433: 0x0257, 0x1434: 0x0260, 0x1435: 0x0242, - 0x1436: 0x0245, 0x1437: 0x024e, 0x1438: 0x0254, 0x1439: 0x0266, 0x143a: 0x026c, 0x143b: 0x0272, - // Block 0x51, offset 0x1440 - 0x1440: 0x1879, 0x1441: 0x1876, 0x1442: 0x187c, 0x1443: 0x18a0, 0x1444: 0x18c4, 0x1445: 0x18e8, - 0x1446: 0x190c, 0x1447: 0x1915, 0x1448: 0x191b, 0x1449: 0x1921, 0x144a: 0x1927, - 0x1450: 0x1a8c, 0x1451: 0x1a90, - 0x1452: 0x1a94, 0x1453: 0x1a98, 0x1454: 0x1a9c, 0x1455: 0x1aa0, 0x1456: 0x1aa4, 0x1457: 0x1aa8, - 0x1458: 0x1aac, 0x1459: 0x1ab0, 0x145a: 0x1ab4, 0x145b: 0x1ab8, 0x145c: 0x1abc, 0x145d: 0x1ac0, - 0x145e: 0x1ac4, 0x145f: 0x1ac8, 0x1460: 0x1acc, 0x1461: 0x1ad0, 0x1462: 0x1ad4, 0x1463: 0x1ad8, - 0x1464: 0x1adc, 0x1465: 0x1ae0, 0x1466: 0x1ae4, 0x1467: 0x1ae8, 0x1468: 0x1aec, 0x1469: 0x1af0, - 0x146a: 0x271e, 0x146b: 0x0047, 0x146c: 0x0065, 0x146d: 0x193c, 0x146e: 0x19b1, - 0x1470: 0x0043, 0x1471: 0x0045, 0x1472: 0x0047, 0x1473: 0x0049, 0x1474: 0x004b, 0x1475: 0x004d, - 0x1476: 0x004f, 0x1477: 0x0051, 0x1478: 0x0053, 0x1479: 0x0055, 0x147a: 0x0057, 0x147b: 0x0059, - 0x147c: 0x005b, 0x147d: 0x005d, 0x147e: 0x005f, 0x147f: 0x0061, - // Block 0x52, offset 0x1480 - 0x1480: 0x26ad, 0x1481: 0x26c2, 0x1482: 0x0503, - 0x1490: 0x0c0f, 0x1491: 0x0a47, - 0x1492: 0x08d3, 0x1493: 0x45c4, 0x1494: 0x071b, 0x1495: 0x09ef, 0x1496: 0x132f, 0x1497: 0x09ff, - 0x1498: 0x0727, 0x1499: 0x0cd7, 0x149a: 0x0eaf, 0x149b: 0x0caf, 0x149c: 0x0827, 0x149d: 0x0b6b, - 0x149e: 0x07bf, 0x149f: 0x0cb7, 0x14a0: 0x0813, 0x14a1: 0x1117, 0x14a2: 0x0f83, 0x14a3: 0x138b, - 0x14a4: 0x09d3, 0x14a5: 0x090b, 0x14a6: 0x0e63, 0x14a7: 0x0c1b, 0x14a8: 0x0c47, 0x14a9: 0x06bf, - 0x14aa: 0x06cb, 0x14ab: 0x140b, 0x14ac: 0x0adb, 0x14ad: 0x06e7, 0x14ae: 0x08ef, 0x14af: 0x0c3b, - 0x14b0: 0x13b3, 0x14b1: 0x0c13, 0x14b2: 0x106f, 0x14b3: 0x10ab, 0x14b4: 0x08f7, 0x14b5: 0x0e43, - 0x14b6: 0x0d0b, 0x14b7: 0x0d07, 0x14b8: 0x0f97, 0x14b9: 0x082b, 0x14ba: 0x0957, 0x14bb: 0x1443, - // Block 0x53, offset 0x14c0 - 0x14c0: 0x06fb, 0x14c1: 0x06f3, 0x14c2: 0x0703, 0x14c3: 0x1647, 0x14c4: 0x0747, 0x14c5: 0x0757, - 0x14c6: 0x075b, 0x14c7: 0x0763, 0x14c8: 0x076b, 0x14c9: 0x076f, 0x14ca: 0x077b, 0x14cb: 0x0773, - 0x14cc: 0x05b3, 0x14cd: 0x165b, 0x14ce: 0x078f, 0x14cf: 0x0793, 0x14d0: 0x0797, 0x14d1: 0x07b3, - 0x14d2: 0x164c, 0x14d3: 0x05b7, 0x14d4: 0x079f, 0x14d5: 0x07bf, 0x14d6: 0x1656, 0x14d7: 0x07cf, - 0x14d8: 0x07d7, 0x14d9: 0x0737, 0x14da: 0x07df, 0x14db: 0x07e3, 0x14dc: 0x1831, 0x14dd: 0x07ff, - 0x14de: 0x0807, 0x14df: 0x05bf, 0x14e0: 0x081f, 0x14e1: 0x0823, 0x14e2: 0x082b, 0x14e3: 0x082f, - 0x14e4: 0x05c3, 0x14e5: 0x0847, 0x14e6: 0x084b, 0x14e7: 0x0857, 0x14e8: 0x0863, 0x14e9: 0x0867, - 0x14ea: 0x086b, 0x14eb: 0x0873, 0x14ec: 0x0893, 0x14ed: 0x0897, 0x14ee: 0x089f, 0x14ef: 0x08af, - 0x14f0: 0x08b7, 0x14f1: 0x08bb, 0x14f2: 0x08bb, 0x14f3: 0x08bb, 0x14f4: 0x166a, 0x14f5: 0x0e93, - 0x14f6: 0x08cf, 0x14f7: 0x08d7, 0x14f8: 0x166f, 0x14f9: 0x08e3, 0x14fa: 0x08eb, 0x14fb: 0x08f3, - 0x14fc: 0x091b, 0x14fd: 0x0907, 0x14fe: 0x0913, 0x14ff: 0x0917, - // Block 0x54, offset 0x1500 - 0x1500: 0x091f, 0x1501: 0x0927, 0x1502: 0x092b, 0x1503: 0x0933, 0x1504: 0x093b, 0x1505: 0x093f, - 0x1506: 0x093f, 0x1507: 0x0947, 0x1508: 0x094f, 0x1509: 0x0953, 0x150a: 0x095f, 0x150b: 0x0983, - 0x150c: 0x0967, 0x150d: 0x0987, 0x150e: 0x096b, 0x150f: 0x0973, 0x1510: 0x080b, 0x1511: 0x09cf, - 0x1512: 0x0997, 0x1513: 0x099b, 0x1514: 0x099f, 0x1515: 0x0993, 0x1516: 0x09a7, 0x1517: 0x09a3, - 0x1518: 0x09bb, 0x1519: 0x1674, 0x151a: 0x09d7, 0x151b: 0x09db, 0x151c: 0x09e3, 0x151d: 0x09ef, - 0x151e: 0x09f7, 0x151f: 0x0a13, 0x1520: 0x1679, 0x1521: 0x167e, 0x1522: 0x0a1f, 0x1523: 0x0a23, - 0x1524: 0x0a27, 0x1525: 0x0a1b, 0x1526: 0x0a2f, 0x1527: 0x05c7, 0x1528: 0x05cb, 0x1529: 0x0a37, - 0x152a: 0x0a3f, 0x152b: 0x0a3f, 0x152c: 0x1683, 0x152d: 0x0a5b, 0x152e: 0x0a5f, 0x152f: 0x0a63, - 0x1530: 0x0a6b, 0x1531: 0x1688, 0x1532: 0x0a73, 0x1533: 0x0a77, 0x1534: 0x0b4f, 0x1535: 0x0a7f, - 0x1536: 0x05cf, 0x1537: 0x0a8b, 0x1538: 0x0a9b, 0x1539: 0x0aa7, 0x153a: 0x0aa3, 0x153b: 0x1692, - 0x153c: 0x0aaf, 0x153d: 0x1697, 0x153e: 0x0abb, 0x153f: 0x0ab7, - // Block 0x55, offset 0x1540 - 0x1540: 0x0abf, 0x1541: 0x0acf, 0x1542: 0x0ad3, 0x1543: 0x05d3, 0x1544: 0x0ae3, 0x1545: 0x0aeb, - 0x1546: 0x0aef, 0x1547: 0x0af3, 0x1548: 0x05d7, 0x1549: 0x169c, 0x154a: 0x05db, 0x154b: 0x0b0f, - 0x154c: 0x0b13, 0x154d: 0x0b17, 0x154e: 0x0b1f, 0x154f: 0x1863, 0x1550: 0x0b37, 0x1551: 0x16a6, - 0x1552: 0x16a6, 0x1553: 0x11d7, 0x1554: 0x0b47, 0x1555: 0x0b47, 0x1556: 0x05df, 0x1557: 0x16c9, - 0x1558: 0x179b, 0x1559: 0x0b57, 0x155a: 0x0b5f, 0x155b: 0x05e3, 0x155c: 0x0b73, 0x155d: 0x0b83, - 0x155e: 0x0b87, 0x155f: 0x0b8f, 0x1560: 0x0b9f, 0x1561: 0x05eb, 0x1562: 0x05e7, 0x1563: 0x0ba3, - 0x1564: 0x16ab, 0x1565: 0x0ba7, 0x1566: 0x0bbb, 0x1567: 0x0bbf, 0x1568: 0x0bc3, 0x1569: 0x0bbf, - 0x156a: 0x0bcf, 0x156b: 0x0bd3, 0x156c: 0x0be3, 0x156d: 0x0bdb, 0x156e: 0x0bdf, 0x156f: 0x0be7, - 0x1570: 0x0beb, 0x1571: 0x0bef, 0x1572: 0x0bfb, 0x1573: 0x0bff, 0x1574: 0x0c17, 0x1575: 0x0c1f, - 0x1576: 0x0c2f, 0x1577: 0x0c43, 0x1578: 0x16ba, 0x1579: 0x0c3f, 0x157a: 0x0c33, 0x157b: 0x0c4b, - 0x157c: 0x0c53, 0x157d: 0x0c67, 0x157e: 0x16bf, 0x157f: 0x0c6f, - // Block 0x56, offset 0x1580 - 0x1580: 0x0c63, 0x1581: 0x0c5b, 0x1582: 0x05ef, 0x1583: 0x0c77, 0x1584: 0x0c7f, 0x1585: 0x0c87, - 0x1586: 0x0c7b, 0x1587: 0x05f3, 0x1588: 0x0c97, 0x1589: 0x0c9f, 0x158a: 0x16c4, 0x158b: 0x0ccb, - 0x158c: 0x0cff, 0x158d: 0x0cdb, 0x158e: 0x05ff, 0x158f: 0x0ce7, 0x1590: 0x05fb, 0x1591: 0x05f7, - 0x1592: 0x07c3, 0x1593: 0x07c7, 0x1594: 0x0d03, 0x1595: 0x0ceb, 0x1596: 0x11ab, 0x1597: 0x0663, - 0x1598: 0x0d0f, 0x1599: 0x0d13, 0x159a: 0x0d17, 0x159b: 0x0d2b, 0x159c: 0x0d23, 0x159d: 0x16dd, - 0x159e: 0x0603, 0x159f: 0x0d3f, 0x15a0: 0x0d33, 0x15a1: 0x0d4f, 0x15a2: 0x0d57, 0x15a3: 0x16e7, - 0x15a4: 0x0d5b, 0x15a5: 0x0d47, 0x15a6: 0x0d63, 0x15a7: 0x0607, 0x15a8: 0x0d67, 0x15a9: 0x0d6b, - 0x15aa: 0x0d6f, 0x15ab: 0x0d7b, 0x15ac: 0x16ec, 0x15ad: 0x0d83, 0x15ae: 0x060b, 0x15af: 0x0d8f, - 0x15b0: 0x16f1, 0x15b1: 0x0d93, 0x15b2: 0x060f, 0x15b3: 0x0d9f, 0x15b4: 0x0dab, 0x15b5: 0x0db7, - 0x15b6: 0x0dbb, 0x15b7: 0x16f6, 0x15b8: 0x168d, 0x15b9: 0x16fb, 0x15ba: 0x0ddb, 0x15bb: 0x1700, - 0x15bc: 0x0de7, 0x15bd: 0x0def, 0x15be: 0x0ddf, 0x15bf: 0x0dfb, - // Block 0x57, offset 0x15c0 - 0x15c0: 0x0e0b, 0x15c1: 0x0e1b, 0x15c2: 0x0e0f, 0x15c3: 0x0e13, 0x15c4: 0x0e1f, 0x15c5: 0x0e23, - 0x15c6: 0x1705, 0x15c7: 0x0e07, 0x15c8: 0x0e3b, 0x15c9: 0x0e3f, 0x15ca: 0x0613, 0x15cb: 0x0e53, - 0x15cc: 0x0e4f, 0x15cd: 0x170a, 0x15ce: 0x0e33, 0x15cf: 0x0e6f, 0x15d0: 0x170f, 0x15d1: 0x1714, - 0x15d2: 0x0e73, 0x15d3: 0x0e87, 0x15d4: 0x0e83, 0x15d5: 0x0e7f, 0x15d6: 0x0617, 0x15d7: 0x0e8b, - 0x15d8: 0x0e9b, 0x15d9: 0x0e97, 0x15da: 0x0ea3, 0x15db: 0x1651, 0x15dc: 0x0eb3, 0x15dd: 0x1719, - 0x15de: 0x0ebf, 0x15df: 0x1723, 0x15e0: 0x0ed3, 0x15e1: 0x0edf, 0x15e2: 0x0ef3, 0x15e3: 0x1728, - 0x15e4: 0x0f07, 0x15e5: 0x0f0b, 0x15e6: 0x172d, 0x15e7: 0x1732, 0x15e8: 0x0f27, 0x15e9: 0x0f37, - 0x15ea: 0x061b, 0x15eb: 0x0f3b, 0x15ec: 0x061f, 0x15ed: 0x061f, 0x15ee: 0x0f53, 0x15ef: 0x0f57, - 0x15f0: 0x0f5f, 0x15f1: 0x0f63, 0x15f2: 0x0f6f, 0x15f3: 0x0623, 0x15f4: 0x0f87, 0x15f5: 0x1737, - 0x15f6: 0x0fa3, 0x15f7: 0x173c, 0x15f8: 0x0faf, 0x15f9: 0x16a1, 0x15fa: 0x0fbf, 0x15fb: 0x1741, - 0x15fc: 0x1746, 0x15fd: 0x174b, 0x15fe: 0x0627, 0x15ff: 0x062b, - // Block 0x58, offset 0x1600 - 0x1600: 0x0ff7, 0x1601: 0x1755, 0x1602: 0x1750, 0x1603: 0x175a, 0x1604: 0x175f, 0x1605: 0x0fff, - 0x1606: 0x1003, 0x1607: 0x1003, 0x1608: 0x100b, 0x1609: 0x0633, 0x160a: 0x100f, 0x160b: 0x0637, - 0x160c: 0x063b, 0x160d: 0x1769, 0x160e: 0x1023, 0x160f: 0x102b, 0x1610: 0x1037, 0x1611: 0x063f, - 0x1612: 0x176e, 0x1613: 0x105b, 0x1614: 0x1773, 0x1615: 0x1778, 0x1616: 0x107b, 0x1617: 0x1093, - 0x1618: 0x0643, 0x1619: 0x109b, 0x161a: 0x109f, 0x161b: 0x10a3, 0x161c: 0x177d, 0x161d: 0x1782, - 0x161e: 0x1782, 0x161f: 0x10bb, 0x1620: 0x0647, 0x1621: 0x1787, 0x1622: 0x10cf, 0x1623: 0x10d3, - 0x1624: 0x064b, 0x1625: 0x178c, 0x1626: 0x10ef, 0x1627: 0x064f, 0x1628: 0x10ff, 0x1629: 0x10f7, - 0x162a: 0x1107, 0x162b: 0x1796, 0x162c: 0x111f, 0x162d: 0x0653, 0x162e: 0x112b, 0x162f: 0x1133, - 0x1630: 0x1143, 0x1631: 0x0657, 0x1632: 0x17a0, 0x1633: 0x17a5, 0x1634: 0x065b, 0x1635: 0x17aa, - 0x1636: 0x115b, 0x1637: 0x17af, 0x1638: 0x1167, 0x1639: 0x1173, 0x163a: 0x117b, 0x163b: 0x17b4, - 0x163c: 0x17b9, 0x163d: 0x118f, 0x163e: 0x17be, 0x163f: 0x1197, - // Block 0x59, offset 0x1640 - 0x1640: 0x16ce, 0x1641: 0x065f, 0x1642: 0x11af, 0x1643: 0x11b3, 0x1644: 0x0667, 0x1645: 0x11b7, - 0x1646: 0x0a33, 0x1647: 0x17c3, 0x1648: 0x17c8, 0x1649: 0x16d3, 0x164a: 0x16d8, 0x164b: 0x11d7, - 0x164c: 0x11db, 0x164d: 0x13f3, 0x164e: 0x066b, 0x164f: 0x1207, 0x1650: 0x1203, 0x1651: 0x120b, - 0x1652: 0x083f, 0x1653: 0x120f, 0x1654: 0x1213, 0x1655: 0x1217, 0x1656: 0x121f, 0x1657: 0x17cd, - 0x1658: 0x121b, 0x1659: 0x1223, 0x165a: 0x1237, 0x165b: 0x123b, 0x165c: 0x1227, 0x165d: 0x123f, - 0x165e: 0x1253, 0x165f: 0x1267, 0x1660: 0x1233, 0x1661: 0x1247, 0x1662: 0x124b, 0x1663: 0x124f, - 0x1664: 0x17d2, 0x1665: 0x17dc, 0x1666: 0x17d7, 0x1667: 0x066f, 0x1668: 0x126f, 0x1669: 0x1273, - 0x166a: 0x127b, 0x166b: 0x17f0, 0x166c: 0x127f, 0x166d: 0x17e1, 0x166e: 0x0673, 0x166f: 0x0677, - 0x1670: 0x17e6, 0x1671: 0x17eb, 0x1672: 0x067b, 0x1673: 0x129f, 0x1674: 0x12a3, 0x1675: 0x12a7, - 0x1676: 0x12ab, 0x1677: 0x12b7, 0x1678: 0x12b3, 0x1679: 0x12bf, 0x167a: 0x12bb, 0x167b: 0x12cb, - 0x167c: 0x12c3, 0x167d: 0x12c7, 0x167e: 0x12cf, 0x167f: 0x067f, - // Block 0x5a, offset 0x1680 - 0x1680: 0x12d7, 0x1681: 0x12db, 0x1682: 0x0683, 0x1683: 0x12eb, 0x1684: 0x12ef, 0x1685: 0x17f5, - 0x1686: 0x12fb, 0x1687: 0x12ff, 0x1688: 0x0687, 0x1689: 0x130b, 0x168a: 0x05bb, 0x168b: 0x17fa, - 0x168c: 0x17ff, 0x168d: 0x068b, 0x168e: 0x068f, 0x168f: 0x1337, 0x1690: 0x134f, 0x1691: 0x136b, - 0x1692: 0x137b, 0x1693: 0x1804, 0x1694: 0x138f, 0x1695: 0x1393, 0x1696: 0x13ab, 0x1697: 0x13b7, - 0x1698: 0x180e, 0x1699: 0x1660, 0x169a: 0x13c3, 0x169b: 0x13bf, 0x169c: 0x13cb, 0x169d: 0x1665, - 0x169e: 0x13d7, 0x169f: 0x13e3, 0x16a0: 0x1813, 0x16a1: 0x1818, 0x16a2: 0x1423, 0x16a3: 0x142f, - 0x16a4: 0x1437, 0x16a5: 0x181d, 0x16a6: 0x143b, 0x16a7: 0x1467, 0x16a8: 0x1473, 0x16a9: 0x1477, - 0x16aa: 0x146f, 0x16ab: 0x1483, 0x16ac: 0x1487, 0x16ad: 0x1822, 0x16ae: 0x1493, 0x16af: 0x0693, - 0x16b0: 0x149b, 0x16b1: 0x1827, 0x16b2: 0x0697, 0x16b3: 0x14d3, 0x16b4: 0x0ac3, 0x16b5: 0x14eb, - 0x16b6: 0x182c, 0x16b7: 0x1836, 0x16b8: 0x069b, 0x16b9: 0x069f, 0x16ba: 0x1513, 0x16bb: 0x183b, - 0x16bc: 0x06a3, 0x16bd: 0x1840, 0x16be: 0x152b, 0x16bf: 0x152b, - // Block 0x5b, offset 0x16c0 - 0x16c0: 0x1533, 0x16c1: 0x1845, 0x16c2: 0x154b, 0x16c3: 0x06a7, 0x16c4: 0x155b, 0x16c5: 0x1567, - 0x16c6: 0x156f, 0x16c7: 0x1577, 0x16c8: 0x06ab, 0x16c9: 0x184a, 0x16ca: 0x158b, 0x16cb: 0x15a7, - 0x16cc: 0x15b3, 0x16cd: 0x06af, 0x16ce: 0x06b3, 0x16cf: 0x15b7, 0x16d0: 0x184f, 0x16d1: 0x06b7, - 0x16d2: 0x1854, 0x16d3: 0x1859, 0x16d4: 0x185e, 0x16d5: 0x15db, 0x16d6: 0x06bb, 0x16d7: 0x15ef, - 0x16d8: 0x15f7, 0x16d9: 0x15fb, 0x16da: 0x1603, 0x16db: 0x160b, 0x16dc: 0x1613, 0x16dd: 0x1868, -} - -// nfkcIndex: 22 blocks, 1408 entries, 1408 bytes -// Block 0 is the zero block. -var nfkcIndex = [1408]uint8{ - // Block 0x0, offset 0x0 - // Block 0x1, offset 0x40 - // Block 0x2, offset 0x80 - // Block 0x3, offset 0xc0 - 0xc2: 0x5a, 0xc3: 0x01, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x5b, 0xc7: 0x04, - 0xc8: 0x05, 0xca: 0x5c, 0xcb: 0x5d, 0xcc: 0x06, 0xcd: 0x07, 0xce: 0x08, 0xcf: 0x09, - 0xd0: 0x0a, 0xd1: 0x5e, 0xd2: 0x5f, 0xd3: 0x0b, 0xd6: 0x0c, 0xd7: 0x60, - 0xd8: 0x61, 0xd9: 0x0d, 0xdb: 0x62, 0xdc: 0x63, 0xdd: 0x64, 0xdf: 0x65, - 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, - 0xea: 0x06, 0xeb: 0x07, 0xec: 0x08, 0xed: 0x09, 0xef: 0x0a, - 0xf0: 0x13, - // Block 0x4, offset 0x100 - 0x120: 0x66, 0x121: 0x67, 0x123: 0x68, 0x124: 0x69, 0x125: 0x6a, 0x126: 0x6b, 0x127: 0x6c, - 0x128: 0x6d, 0x129: 0x6e, 0x12a: 0x6f, 0x12b: 0x70, 0x12c: 0x6b, 0x12d: 0x71, 0x12e: 0x72, 0x12f: 0x73, - 0x131: 0x74, 0x132: 0x75, 0x133: 0x76, 0x134: 0x77, 0x135: 0x78, 0x137: 0x79, - 0x138: 0x7a, 0x139: 0x7b, 0x13a: 0x7c, 0x13b: 0x7d, 0x13c: 0x7e, 0x13d: 0x7f, 0x13e: 0x80, 0x13f: 0x81, - // Block 0x5, offset 0x140 - 0x140: 0x82, 0x142: 0x83, 0x143: 0x84, 0x144: 0x85, 0x145: 0x86, 0x146: 0x87, 0x147: 0x88, - 0x14d: 0x89, - 0x15c: 0x8a, 0x15f: 0x8b, - 0x162: 0x8c, 0x164: 0x8d, - 0x168: 0x8e, 0x169: 0x8f, 0x16a: 0x90, 0x16c: 0x0e, 0x16d: 0x91, 0x16e: 0x92, 0x16f: 0x93, - 0x170: 0x94, 0x173: 0x95, 0x174: 0x96, 0x175: 0x0f, 0x176: 0x10, 0x177: 0x97, - 0x178: 0x11, 0x179: 0x12, 0x17a: 0x13, 0x17b: 0x14, 0x17c: 0x15, 0x17d: 0x16, 0x17e: 0x17, 0x17f: 0x18, - // Block 0x6, offset 0x180 - 0x180: 0x98, 0x181: 0x99, 0x182: 0x9a, 0x183: 0x9b, 0x184: 0x19, 0x185: 0x1a, 0x186: 0x9c, 0x187: 0x9d, - 0x188: 0x9e, 0x189: 0x1b, 0x18a: 0x1c, 0x18b: 0x9f, 0x18c: 0xa0, - 0x191: 0x1d, 0x192: 0x1e, 0x193: 0xa1, - 0x1a8: 0xa2, 0x1a9: 0xa3, 0x1ab: 0xa4, - 0x1b1: 0xa5, 0x1b3: 0xa6, 0x1b5: 0xa7, 0x1b7: 0xa8, - 0x1ba: 0xa9, 0x1bb: 0xaa, 0x1bc: 0x1f, 0x1bd: 0x20, 0x1be: 0x21, 0x1bf: 0xab, - // Block 0x7, offset 0x1c0 - 0x1c0: 0xac, 0x1c1: 0x22, 0x1c2: 0x23, 0x1c3: 0x24, 0x1c4: 0xad, 0x1c5: 0x25, 0x1c6: 0x26, - 0x1c8: 0x27, 0x1c9: 0x28, 0x1ca: 0x29, 0x1cb: 0x2a, 0x1cc: 0x2b, 0x1cd: 0x2c, 0x1ce: 0x2d, 0x1cf: 0x2e, - // Block 0x8, offset 0x200 - 0x219: 0xae, 0x21a: 0xaf, 0x21b: 0xb0, 0x21d: 0xb1, 0x21f: 0xb2, - 0x220: 0xb3, 0x223: 0xb4, 0x224: 0xb5, 0x225: 0xb6, 0x226: 0xb7, 0x227: 0xb8, - 0x22a: 0xb9, 0x22b: 0xba, 0x22d: 0xbb, 0x22f: 0xbc, - 0x230: 0xbd, 0x231: 0xbe, 0x232: 0xbf, 0x233: 0xc0, 0x234: 0xc1, 0x235: 0xc2, 0x236: 0xc3, 0x237: 0xbd, - 0x238: 0xbe, 0x239: 0xbf, 0x23a: 0xc0, 0x23b: 0xc1, 0x23c: 0xc2, 0x23d: 0xc3, 0x23e: 0xbd, 0x23f: 0xbe, - // Block 0x9, offset 0x240 - 0x240: 0xbf, 0x241: 0xc0, 0x242: 0xc1, 0x243: 0xc2, 0x244: 0xc3, 0x245: 0xbd, 0x246: 0xbe, 0x247: 0xbf, - 0x248: 0xc0, 0x249: 0xc1, 0x24a: 0xc2, 0x24b: 0xc3, 0x24c: 0xbd, 0x24d: 0xbe, 0x24e: 0xbf, 0x24f: 0xc0, - 0x250: 0xc1, 0x251: 0xc2, 0x252: 0xc3, 0x253: 0xbd, 0x254: 0xbe, 0x255: 0xbf, 0x256: 0xc0, 0x257: 0xc1, - 0x258: 0xc2, 0x259: 0xc3, 0x25a: 0xbd, 0x25b: 0xbe, 0x25c: 0xbf, 0x25d: 0xc0, 0x25e: 0xc1, 0x25f: 0xc2, - 0x260: 0xc3, 0x261: 0xbd, 0x262: 0xbe, 0x263: 0xbf, 0x264: 0xc0, 0x265: 0xc1, 0x266: 0xc2, 0x267: 0xc3, - 0x268: 0xbd, 0x269: 0xbe, 0x26a: 0xbf, 0x26b: 0xc0, 0x26c: 0xc1, 0x26d: 0xc2, 0x26e: 0xc3, 0x26f: 0xbd, - 0x270: 0xbe, 0x271: 0xbf, 0x272: 0xc0, 0x273: 0xc1, 0x274: 0xc2, 0x275: 0xc3, 0x276: 0xbd, 0x277: 0xbe, - 0x278: 0xbf, 0x279: 0xc0, 0x27a: 0xc1, 0x27b: 0xc2, 0x27c: 0xc3, 0x27d: 0xbd, 0x27e: 0xbe, 0x27f: 0xbf, - // Block 0xa, offset 0x280 - 0x280: 0xc0, 0x281: 0xc1, 0x282: 0xc2, 0x283: 0xc3, 0x284: 0xbd, 0x285: 0xbe, 0x286: 0xbf, 0x287: 0xc0, - 0x288: 0xc1, 0x289: 0xc2, 0x28a: 0xc3, 0x28b: 0xbd, 0x28c: 0xbe, 0x28d: 0xbf, 0x28e: 0xc0, 0x28f: 0xc1, - 0x290: 0xc2, 0x291: 0xc3, 0x292: 0xbd, 0x293: 0xbe, 0x294: 0xbf, 0x295: 0xc0, 0x296: 0xc1, 0x297: 0xc2, - 0x298: 0xc3, 0x299: 0xbd, 0x29a: 0xbe, 0x29b: 0xbf, 0x29c: 0xc0, 0x29d: 0xc1, 0x29e: 0xc2, 0x29f: 0xc3, - 0x2a0: 0xbd, 0x2a1: 0xbe, 0x2a2: 0xbf, 0x2a3: 0xc0, 0x2a4: 0xc1, 0x2a5: 0xc2, 0x2a6: 0xc3, 0x2a7: 0xbd, - 0x2a8: 0xbe, 0x2a9: 0xbf, 0x2aa: 0xc0, 0x2ab: 0xc1, 0x2ac: 0xc2, 0x2ad: 0xc3, 0x2ae: 0xbd, 0x2af: 0xbe, - 0x2b0: 0xbf, 0x2b1: 0xc0, 0x2b2: 0xc1, 0x2b3: 0xc2, 0x2b4: 0xc3, 0x2b5: 0xbd, 0x2b6: 0xbe, 0x2b7: 0xbf, - 0x2b8: 0xc0, 0x2b9: 0xc1, 0x2ba: 0xc2, 0x2bb: 0xc3, 0x2bc: 0xbd, 0x2bd: 0xbe, 0x2be: 0xbf, 0x2bf: 0xc0, - // Block 0xb, offset 0x2c0 - 0x2c0: 0xc1, 0x2c1: 0xc2, 0x2c2: 0xc3, 0x2c3: 0xbd, 0x2c4: 0xbe, 0x2c5: 0xbf, 0x2c6: 0xc0, 0x2c7: 0xc1, - 0x2c8: 0xc2, 0x2c9: 0xc3, 0x2ca: 0xbd, 0x2cb: 0xbe, 0x2cc: 0xbf, 0x2cd: 0xc0, 0x2ce: 0xc1, 0x2cf: 0xc2, - 0x2d0: 0xc3, 0x2d1: 0xbd, 0x2d2: 0xbe, 0x2d3: 0xbf, 0x2d4: 0xc0, 0x2d5: 0xc1, 0x2d6: 0xc2, 0x2d7: 0xc3, - 0x2d8: 0xbd, 0x2d9: 0xbe, 0x2da: 0xbf, 0x2db: 0xc0, 0x2dc: 0xc1, 0x2dd: 0xc2, 0x2de: 0xc4, - // Block 0xc, offset 0x300 - 0x324: 0x2f, 0x325: 0x30, 0x326: 0x31, 0x327: 0x32, - 0x328: 0x33, 0x329: 0x34, 0x32a: 0x35, 0x32b: 0x36, 0x32c: 0x37, 0x32d: 0x38, 0x32e: 0x39, 0x32f: 0x3a, - 0x330: 0x3b, 0x331: 0x3c, 0x332: 0x3d, 0x333: 0x3e, 0x334: 0x3f, 0x335: 0x40, 0x336: 0x41, 0x337: 0x42, - 0x338: 0x43, 0x339: 0x44, 0x33a: 0x45, 0x33b: 0x46, 0x33c: 0xc5, 0x33d: 0x47, 0x33e: 0x48, 0x33f: 0x49, - // Block 0xd, offset 0x340 - 0x347: 0xc6, - 0x34b: 0xc7, 0x34d: 0xc8, - 0x368: 0xc9, 0x36b: 0xca, - // Block 0xe, offset 0x380 - 0x381: 0xcb, 0x382: 0xcc, 0x384: 0xcd, 0x385: 0xb7, 0x387: 0xce, - 0x388: 0xcf, 0x38b: 0xd0, 0x38c: 0x6b, 0x38d: 0xd1, - 0x391: 0xd2, 0x392: 0xd3, 0x393: 0xd4, 0x396: 0xd5, 0x397: 0xd6, - 0x398: 0xd7, 0x39a: 0xd8, 0x39c: 0xd9, - 0x3b0: 0xd7, - // Block 0xf, offset 0x3c0 - 0x3eb: 0xda, 0x3ec: 0xdb, - // Block 0x10, offset 0x400 - 0x432: 0xdc, - // Block 0x11, offset 0x440 - 0x445: 0xdd, 0x446: 0xde, 0x447: 0xdf, - 0x449: 0xe0, - 0x450: 0xe1, 0x451: 0xe2, 0x452: 0xe3, 0x453: 0xe4, 0x454: 0xe5, 0x455: 0xe6, 0x456: 0xe7, 0x457: 0xe8, - 0x458: 0xe9, 0x459: 0xea, 0x45a: 0x4a, 0x45b: 0xeb, 0x45c: 0xec, 0x45d: 0xed, 0x45e: 0xee, 0x45f: 0x4b, - // Block 0x12, offset 0x480 - 0x480: 0xef, - 0x4a3: 0xf0, 0x4a5: 0xf1, - 0x4b8: 0x4c, 0x4b9: 0x4d, 0x4ba: 0x4e, - // Block 0x13, offset 0x4c0 - 0x4c4: 0x4f, 0x4c5: 0xf2, 0x4c6: 0xf3, - 0x4c8: 0x50, 0x4c9: 0xf4, - // Block 0x14, offset 0x500 - 0x520: 0x51, 0x521: 0x52, 0x522: 0x53, 0x523: 0x54, 0x524: 0x55, 0x525: 0x56, 0x526: 0x57, 0x527: 0x58, - 0x528: 0x59, - // Block 0x15, offset 0x540 - 0x550: 0x0b, 0x551: 0x0c, 0x556: 0x0d, - 0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11, - 0x56f: 0x12, -} - -// nfkcSparseOffset: 155 entries, 310 bytes -var nfkcSparseOffset = []uint16{0x0, 0xe, 0x12, 0x1b, 0x25, 0x35, 0x37, 0x3c, 0x47, 0x56, 0x63, 0x6b, 0x6f, 0x74, 0x76, 0x87, 0x8f, 0x96, 0x99, 0xa0, 0xa4, 0xa8, 0xaa, 0xac, 0xb5, 0xb9, 0xc0, 0xc5, 0xc8, 0xd2, 0xd4, 0xdb, 0xe3, 0xe7, 0xe9, 0xec, 0xf0, 0xf6, 0x107, 0x113, 0x115, 0x11b, 0x11d, 0x11f, 0x121, 0x123, 0x125, 0x127, 0x129, 0x12c, 0x12f, 0x131, 0x134, 0x137, 0x13b, 0x140, 0x149, 0x14b, 0x14e, 0x150, 0x15b, 0x166, 0x176, 0x184, 0x192, 0x1a2, 0x1b0, 0x1b7, 0x1bd, 0x1cc, 0x1d0, 0x1d2, 0x1d6, 0x1d8, 0x1db, 0x1dd, 0x1e0, 0x1e2, 0x1e5, 0x1e7, 0x1e9, 0x1eb, 0x1f7, 0x201, 0x20b, 0x20e, 0x212, 0x214, 0x216, 0x218, 0x21a, 0x21d, 0x21f, 0x221, 0x223, 0x225, 0x22b, 0x22e, 0x232, 0x234, 0x23b, 0x241, 0x247, 0x24f, 0x255, 0x25b, 0x261, 0x265, 0x267, 0x269, 0x26b, 0x26d, 0x273, 0x276, 0x279, 0x281, 0x288, 0x28b, 0x28e, 0x290, 0x298, 0x29b, 0x2a2, 0x2a5, 0x2ab, 0x2ad, 0x2af, 0x2b2, 0x2b4, 0x2b6, 0x2b8, 0x2ba, 0x2c7, 0x2d1, 0x2d3, 0x2d5, 0x2d9, 0x2de, 0x2ea, 0x2ef, 0x2f8, 0x2fe, 0x303, 0x307, 0x30c, 0x310, 0x320, 0x32e, 0x33c, 0x34a, 0x350, 0x352, 0x355, 0x35f, 0x361} - -// nfkcSparseValues: 875 entries, 3500 bytes -var nfkcSparseValues = [875]valueRange{ - // Block 0x0, offset 0x0 - {value: 0x0002, lo: 0x0d}, - {value: 0x0001, lo: 0xa0, hi: 0xa0}, - {value: 0x4278, lo: 0xa8, hi: 0xa8}, - {value: 0x0083, lo: 0xaa, hi: 0xaa}, - {value: 0x4264, lo: 0xaf, hi: 0xaf}, - {value: 0x0025, lo: 0xb2, hi: 0xb3}, - {value: 0x425a, lo: 0xb4, hi: 0xb4}, - {value: 0x01dc, lo: 0xb5, hi: 0xb5}, - {value: 0x4291, lo: 0xb8, hi: 0xb8}, - {value: 0x0023, lo: 0xb9, hi: 0xb9}, - {value: 0x009f, lo: 0xba, hi: 0xba}, - {value: 0x221c, lo: 0xbc, hi: 0xbc}, - {value: 0x2210, lo: 0xbd, hi: 0xbd}, - {value: 0x22b2, lo: 0xbe, hi: 0xbe}, - // Block 0x1, offset 0xe - {value: 0x0091, lo: 0x03}, - {value: 0x46e2, lo: 0xa0, hi: 0xa1}, - {value: 0x4714, lo: 0xaf, hi: 0xb0}, - {value: 0xa000, lo: 0xb7, hi: 0xb7}, - // Block 0x2, offset 0x12 - {value: 0x0003, lo: 0x08}, - {value: 0xa000, lo: 0x92, hi: 0x92}, - {value: 0x0091, lo: 0xb0, hi: 0xb0}, - {value: 0x0119, lo: 0xb1, hi: 0xb1}, - {value: 0x0095, lo: 0xb2, hi: 0xb2}, - {value: 0x00a5, lo: 0xb3, hi: 0xb3}, - {value: 0x0143, lo: 0xb4, hi: 0xb6}, - {value: 0x00af, lo: 0xb7, hi: 0xb7}, - {value: 0x00b3, lo: 0xb8, hi: 0xb8}, - // Block 0x3, offset 0x1b - {value: 0x000a, lo: 0x09}, - {value: 0x426e, lo: 0x98, hi: 0x98}, - {value: 0x4273, lo: 0x99, hi: 0x9a}, - {value: 0x4296, lo: 0x9b, hi: 0x9b}, - {value: 0x425f, lo: 0x9c, hi: 0x9c}, - {value: 0x4282, lo: 0x9d, hi: 0x9d}, - {value: 0x0113, lo: 0xa0, hi: 0xa0}, - {value: 0x0099, lo: 0xa1, hi: 0xa1}, - {value: 0x00a7, lo: 0xa2, hi: 0xa3}, - {value: 0x0167, lo: 0xa4, hi: 0xa4}, - // Block 0x4, offset 0x25 - {value: 0x0000, lo: 0x0f}, - {value: 0xa000, lo: 0x83, hi: 0x83}, - {value: 0xa000, lo: 0x87, hi: 0x87}, - {value: 0xa000, lo: 0x8b, hi: 0x8b}, - {value: 0xa000, lo: 0x8d, hi: 0x8d}, - {value: 0x37a5, lo: 0x90, hi: 0x90}, - {value: 0x37b1, lo: 0x91, hi: 0x91}, - {value: 0x379f, lo: 0x93, hi: 0x93}, - {value: 0xa000, lo: 0x96, hi: 0x96}, - {value: 0x3817, lo: 0x97, hi: 0x97}, - {value: 0x37e1, lo: 0x9c, hi: 0x9c}, - {value: 0x37c9, lo: 0x9d, hi: 0x9d}, - {value: 0x37f3, lo: 0x9e, hi: 0x9e}, - {value: 0xa000, lo: 0xb4, hi: 0xb5}, - {value: 0x381d, lo: 0xb6, hi: 0xb6}, - {value: 0x3823, lo: 0xb7, hi: 0xb7}, - // Block 0x5, offset 0x35 - {value: 0x0000, lo: 0x01}, - {value: 0x8132, lo: 0x83, hi: 0x87}, - // Block 0x6, offset 0x37 - {value: 0x0001, lo: 0x04}, - {value: 0x8113, lo: 0x81, hi: 0x82}, - {value: 0x8132, lo: 0x84, hi: 0x84}, - {value: 0x812d, lo: 0x85, hi: 0x85}, - {value: 0x810d, lo: 0x87, hi: 0x87}, - // Block 0x7, offset 0x3c - {value: 0x0000, lo: 0x0a}, - {value: 0x8132, lo: 0x90, hi: 0x97}, - {value: 0x8119, lo: 0x98, hi: 0x98}, - {value: 0x811a, lo: 0x99, hi: 0x99}, - {value: 0x811b, lo: 0x9a, hi: 0x9a}, - {value: 0x3841, lo: 0xa2, hi: 0xa2}, - {value: 0x3847, lo: 0xa3, hi: 0xa3}, - {value: 0x3853, lo: 0xa4, hi: 0xa4}, - {value: 0x384d, lo: 0xa5, hi: 0xa5}, - {value: 0x3859, lo: 0xa6, hi: 0xa6}, - {value: 0xa000, lo: 0xa7, hi: 0xa7}, - // Block 0x8, offset 0x47 - {value: 0x0000, lo: 0x0e}, - {value: 0x386b, lo: 0x80, hi: 0x80}, - {value: 0xa000, lo: 0x81, hi: 0x81}, - {value: 0x385f, lo: 0x82, hi: 0x82}, - {value: 0xa000, lo: 0x92, hi: 0x92}, - {value: 0x3865, lo: 0x93, hi: 0x93}, - {value: 0xa000, lo: 0x95, hi: 0x95}, - {value: 0x8132, lo: 0x96, hi: 0x9c}, - {value: 0x8132, lo: 0x9f, hi: 0xa2}, - {value: 0x812d, lo: 0xa3, hi: 0xa3}, - {value: 0x8132, lo: 0xa4, hi: 0xa4}, - {value: 0x8132, lo: 0xa7, hi: 0xa8}, - {value: 0x812d, lo: 0xaa, hi: 0xaa}, - {value: 0x8132, lo: 0xab, hi: 0xac}, - {value: 0x812d, lo: 0xad, hi: 0xad}, - // Block 0x9, offset 0x56 - {value: 0x0000, lo: 0x0c}, - {value: 0x811f, lo: 0x91, hi: 0x91}, - {value: 0x8132, lo: 0xb0, hi: 0xb0}, - {value: 0x812d, lo: 0xb1, hi: 0xb1}, - {value: 0x8132, lo: 0xb2, hi: 0xb3}, - {value: 0x812d, lo: 0xb4, hi: 0xb4}, - {value: 0x8132, lo: 0xb5, hi: 0xb6}, - {value: 0x812d, lo: 0xb7, hi: 0xb9}, - {value: 0x8132, lo: 0xba, hi: 0xba}, - {value: 0x812d, lo: 0xbb, hi: 0xbc}, - {value: 0x8132, lo: 0xbd, hi: 0xbd}, - {value: 0x812d, lo: 0xbe, hi: 0xbe}, - {value: 0x8132, lo: 0xbf, hi: 0xbf}, - // Block 0xa, offset 0x63 - {value: 0x0005, lo: 0x07}, - {value: 0x8132, lo: 0x80, hi: 0x80}, - {value: 0x8132, lo: 0x81, hi: 0x81}, - {value: 0x812d, lo: 0x82, hi: 0x83}, - {value: 0x812d, lo: 0x84, hi: 0x85}, - {value: 0x812d, lo: 0x86, hi: 0x87}, - {value: 0x812d, lo: 0x88, hi: 0x89}, - {value: 0x8132, lo: 0x8a, hi: 0x8a}, - // Block 0xb, offset 0x6b - {value: 0x0000, lo: 0x03}, - {value: 0x8132, lo: 0xab, hi: 0xb1}, - {value: 0x812d, lo: 0xb2, hi: 0xb2}, - {value: 0x8132, lo: 0xb3, hi: 0xb3}, - // Block 0xc, offset 0x6f - {value: 0x0000, lo: 0x04}, - {value: 0x8132, lo: 0x96, hi: 0x99}, - {value: 0x8132, lo: 0x9b, hi: 0xa3}, - {value: 0x8132, lo: 0xa5, hi: 0xa7}, - {value: 0x8132, lo: 0xa9, hi: 0xad}, - // Block 0xd, offset 0x74 - {value: 0x0000, lo: 0x01}, - {value: 0x812d, lo: 0x99, hi: 0x9b}, - // Block 0xe, offset 0x76 - {value: 0x0000, lo: 0x10}, - {value: 0x8132, lo: 0x94, hi: 0xa1}, - {value: 0x812d, lo: 0xa3, hi: 0xa3}, - {value: 0x8132, lo: 0xa4, hi: 0xa5}, - {value: 0x812d, lo: 0xa6, hi: 0xa6}, - {value: 0x8132, lo: 0xa7, hi: 0xa8}, - {value: 0x812d, lo: 0xa9, hi: 0xa9}, - {value: 0x8132, lo: 0xaa, hi: 0xac}, - {value: 0x812d, lo: 0xad, hi: 0xaf}, - {value: 0x8116, lo: 0xb0, hi: 0xb0}, - {value: 0x8117, lo: 0xb1, hi: 0xb1}, - {value: 0x8118, lo: 0xb2, hi: 0xb2}, - {value: 0x8132, lo: 0xb3, hi: 0xb5}, - {value: 0x812d, lo: 0xb6, hi: 0xb6}, - {value: 0x8132, lo: 0xb7, hi: 0xb8}, - {value: 0x812d, lo: 0xb9, hi: 0xba}, - {value: 0x8132, lo: 0xbb, hi: 0xbf}, - // Block 0xf, offset 0x87 - {value: 0x0000, lo: 0x07}, - {value: 0xa000, lo: 0xa8, hi: 0xa8}, - {value: 0x3ed8, lo: 0xa9, hi: 0xa9}, - {value: 0xa000, lo: 0xb0, hi: 0xb0}, - {value: 0x3ee0, lo: 0xb1, hi: 0xb1}, - {value: 0xa000, lo: 0xb3, hi: 0xb3}, - {value: 0x3ee8, lo: 0xb4, hi: 0xb4}, - {value: 0x9902, lo: 0xbc, hi: 0xbc}, - // Block 0x10, offset 0x8f - {value: 0x0008, lo: 0x06}, - {value: 0x8104, lo: 0x8d, hi: 0x8d}, - {value: 0x8132, lo: 0x91, hi: 0x91}, - {value: 0x812d, lo: 0x92, hi: 0x92}, - {value: 0x8132, lo: 0x93, hi: 0x93}, - {value: 0x8132, lo: 0x94, hi: 0x94}, - {value: 0x451c, lo: 0x98, hi: 0x9f}, - // Block 0x11, offset 0x96 - {value: 0x0000, lo: 0x02}, - {value: 0x8102, lo: 0xbc, hi: 0xbc}, - {value: 0x9900, lo: 0xbe, hi: 0xbe}, - // Block 0x12, offset 0x99 - {value: 0x0008, lo: 0x06}, - {value: 0xa000, lo: 0x87, hi: 0x87}, - {value: 0x2c9e, lo: 0x8b, hi: 0x8c}, - {value: 0x8104, lo: 0x8d, hi: 0x8d}, - {value: 0x9900, lo: 0x97, hi: 0x97}, - {value: 0x455c, lo: 0x9c, hi: 0x9d}, - {value: 0x456c, lo: 0x9f, hi: 0x9f}, - // Block 0x13, offset 0xa0 - {value: 0x0000, lo: 0x03}, - {value: 0x4594, lo: 0xb3, hi: 0xb3}, - {value: 0x459c, lo: 0xb6, hi: 0xb6}, - {value: 0x8102, lo: 0xbc, hi: 0xbc}, - // Block 0x14, offset 0xa4 - {value: 0x0008, lo: 0x03}, - {value: 0x8104, lo: 0x8d, hi: 0x8d}, - {value: 0x4574, lo: 0x99, hi: 0x9b}, - {value: 0x458c, lo: 0x9e, hi: 0x9e}, - // Block 0x15, offset 0xa8 - {value: 0x0000, lo: 0x01}, - {value: 0x8102, lo: 0xbc, hi: 0xbc}, - // Block 0x16, offset 0xaa - {value: 0x0000, lo: 0x01}, - {value: 0x8104, lo: 0x8d, hi: 0x8d}, - // Block 0x17, offset 0xac - {value: 0x0000, lo: 0x08}, - {value: 0xa000, lo: 0x87, hi: 0x87}, - {value: 0x2cb6, lo: 0x88, hi: 0x88}, - {value: 0x2cae, lo: 0x8b, hi: 0x8b}, - {value: 0x2cbe, lo: 0x8c, hi: 0x8c}, - {value: 0x8104, lo: 0x8d, hi: 0x8d}, - {value: 0x9900, lo: 0x96, hi: 0x97}, - {value: 0x45a4, lo: 0x9c, hi: 0x9c}, - {value: 0x45ac, lo: 0x9d, hi: 0x9d}, - // Block 0x18, offset 0xb5 - {value: 0x0000, lo: 0x03}, - {value: 0xa000, lo: 0x92, hi: 0x92}, - {value: 0x2cc6, lo: 0x94, hi: 0x94}, - {value: 0x9900, lo: 0xbe, hi: 0xbe}, - // Block 0x19, offset 0xb9 - {value: 0x0000, lo: 0x06}, - {value: 0xa000, lo: 0x86, hi: 0x87}, - {value: 0x2cce, lo: 0x8a, hi: 0x8a}, - {value: 0x2cde, lo: 0x8b, hi: 0x8b}, - {value: 0x2cd6, lo: 0x8c, hi: 0x8c}, - {value: 0x8104, lo: 0x8d, hi: 0x8d}, - {value: 0x9900, lo: 0x97, hi: 0x97}, - // Block 0x1a, offset 0xc0 - {value: 0x1801, lo: 0x04}, - {value: 0xa000, lo: 0x86, hi: 0x86}, - {value: 0x3ef0, lo: 0x88, hi: 0x88}, - {value: 0x8104, lo: 0x8d, hi: 0x8d}, - {value: 0x8120, lo: 0x95, hi: 0x96}, - // Block 0x1b, offset 0xc5 - {value: 0x0000, lo: 0x02}, - {value: 0x8102, lo: 0xbc, hi: 0xbc}, - {value: 0xa000, lo: 0xbf, hi: 0xbf}, - // Block 0x1c, offset 0xc8 - {value: 0x0000, lo: 0x09}, - {value: 0x2ce6, lo: 0x80, hi: 0x80}, - {value: 0x9900, lo: 0x82, hi: 0x82}, - {value: 0xa000, lo: 0x86, hi: 0x86}, - {value: 0x2cee, lo: 0x87, hi: 0x87}, - {value: 0x2cf6, lo: 0x88, hi: 0x88}, - {value: 0x2f50, lo: 0x8a, hi: 0x8a}, - {value: 0x2dd8, lo: 0x8b, hi: 0x8b}, - {value: 0x8104, lo: 0x8d, hi: 0x8d}, - {value: 0x9900, lo: 0x95, hi: 0x96}, - // Block 0x1d, offset 0xd2 - {value: 0x0000, lo: 0x01}, - {value: 0x9900, lo: 0xbe, hi: 0xbe}, - // Block 0x1e, offset 0xd4 - {value: 0x0000, lo: 0x06}, - {value: 0xa000, lo: 0x86, hi: 0x87}, - {value: 0x2cfe, lo: 0x8a, hi: 0x8a}, - {value: 0x2d0e, lo: 0x8b, hi: 0x8b}, - {value: 0x2d06, lo: 0x8c, hi: 0x8c}, - {value: 0x8104, lo: 0x8d, hi: 0x8d}, - {value: 0x9900, lo: 0x97, hi: 0x97}, - // Block 0x1f, offset 0xdb - {value: 0x6bea, lo: 0x07}, - {value: 0x9904, lo: 0x8a, hi: 0x8a}, - {value: 0x9900, lo: 0x8f, hi: 0x8f}, - {value: 0xa000, lo: 0x99, hi: 0x99}, - {value: 0x3ef8, lo: 0x9a, hi: 0x9a}, - {value: 0x2f58, lo: 0x9c, hi: 0x9c}, - {value: 0x2de3, lo: 0x9d, hi: 0x9d}, - {value: 0x2d16, lo: 0x9e, hi: 0x9f}, - // Block 0x20, offset 0xe3 - {value: 0x0000, lo: 0x03}, - {value: 0x2621, lo: 0xb3, hi: 0xb3}, - {value: 0x8122, lo: 0xb8, hi: 0xb9}, - {value: 0x8104, lo: 0xba, hi: 0xba}, - // Block 0x21, offset 0xe7 - {value: 0x0000, lo: 0x01}, - {value: 0x8123, lo: 0x88, hi: 0x8b}, - // Block 0x22, offset 0xe9 - {value: 0x0000, lo: 0x02}, - {value: 0x2636, lo: 0xb3, hi: 0xb3}, - {value: 0x8124, lo: 0xb8, hi: 0xb9}, - // Block 0x23, offset 0xec - {value: 0x0000, lo: 0x03}, - {value: 0x8125, lo: 0x88, hi: 0x8b}, - {value: 0x2628, lo: 0x9c, hi: 0x9c}, - {value: 0x262f, lo: 0x9d, hi: 0x9d}, - // Block 0x24, offset 0xf0 - {value: 0x0000, lo: 0x05}, - {value: 0x030b, lo: 0x8c, hi: 0x8c}, - {value: 0x812d, lo: 0x98, hi: 0x99}, - {value: 0x812d, lo: 0xb5, hi: 0xb5}, - {value: 0x812d, lo: 0xb7, hi: 0xb7}, - {value: 0x812b, lo: 0xb9, hi: 0xb9}, - // Block 0x25, offset 0xf6 - {value: 0x0000, lo: 0x10}, - {value: 0x2644, lo: 0x83, hi: 0x83}, - {value: 0x264b, lo: 0x8d, hi: 0x8d}, - {value: 0x2652, lo: 0x92, hi: 0x92}, - {value: 0x2659, lo: 0x97, hi: 0x97}, - {value: 0x2660, lo: 0x9c, hi: 0x9c}, - {value: 0x263d, lo: 0xa9, hi: 0xa9}, - {value: 0x8126, lo: 0xb1, hi: 0xb1}, - {value: 0x8127, lo: 0xb2, hi: 0xb2}, - {value: 0x4a84, lo: 0xb3, hi: 0xb3}, - {value: 0x8128, lo: 0xb4, hi: 0xb4}, - {value: 0x4a8d, lo: 0xb5, hi: 0xb5}, - {value: 0x45b4, lo: 0xb6, hi: 0xb6}, - {value: 0x45f4, lo: 0xb7, hi: 0xb7}, - {value: 0x45bc, lo: 0xb8, hi: 0xb8}, - {value: 0x45ff, lo: 0xb9, hi: 0xb9}, - {value: 0x8127, lo: 0xba, hi: 0xbd}, - // Block 0x26, offset 0x107 - {value: 0x0000, lo: 0x0b}, - {value: 0x8127, lo: 0x80, hi: 0x80}, - {value: 0x4a96, lo: 0x81, hi: 0x81}, - {value: 0x8132, lo: 0x82, hi: 0x83}, - {value: 0x8104, lo: 0x84, hi: 0x84}, - {value: 0x8132, lo: 0x86, hi: 0x87}, - {value: 0x266e, lo: 0x93, hi: 0x93}, - {value: 0x2675, lo: 0x9d, hi: 0x9d}, - {value: 0x267c, lo: 0xa2, hi: 0xa2}, - {value: 0x2683, lo: 0xa7, hi: 0xa7}, - {value: 0x268a, lo: 0xac, hi: 0xac}, - {value: 0x2667, lo: 0xb9, hi: 0xb9}, - // Block 0x27, offset 0x113 - {value: 0x0000, lo: 0x01}, - {value: 0x812d, lo: 0x86, hi: 0x86}, - // Block 0x28, offset 0x115 - {value: 0x0000, lo: 0x05}, - {value: 0xa000, lo: 0xa5, hi: 0xa5}, - {value: 0x2d1e, lo: 0xa6, hi: 0xa6}, - {value: 0x9900, lo: 0xae, hi: 0xae}, - {value: 0x8102, lo: 0xb7, hi: 0xb7}, - {value: 0x8104, lo: 0xb9, hi: 0xba}, - // Block 0x29, offset 0x11b - {value: 0x0000, lo: 0x01}, - {value: 0x812d, lo: 0x8d, hi: 0x8d}, - // Block 0x2a, offset 0x11d - {value: 0x0000, lo: 0x01}, - {value: 0x030f, lo: 0xbc, hi: 0xbc}, - // Block 0x2b, offset 0x11f - {value: 0x0000, lo: 0x01}, - {value: 0xa000, lo: 0x80, hi: 0x92}, - // Block 0x2c, offset 0x121 - {value: 0x0000, lo: 0x01}, - {value: 0xb900, lo: 0xa1, hi: 0xb5}, - // Block 0x2d, offset 0x123 - {value: 0x0000, lo: 0x01}, - {value: 0x9900, lo: 0xa8, hi: 0xbf}, - // Block 0x2e, offset 0x125 - {value: 0x0000, lo: 0x01}, - {value: 0x9900, lo: 0x80, hi: 0x82}, - // Block 0x2f, offset 0x127 - {value: 0x0000, lo: 0x01}, - {value: 0x8132, lo: 0x9d, hi: 0x9f}, - // Block 0x30, offset 0x129 - {value: 0x0000, lo: 0x02}, - {value: 0x8104, lo: 0x94, hi: 0x94}, - {value: 0x8104, lo: 0xb4, hi: 0xb4}, - // Block 0x31, offset 0x12c - {value: 0x0000, lo: 0x02}, - {value: 0x8104, lo: 0x92, hi: 0x92}, - {value: 0x8132, lo: 0x9d, hi: 0x9d}, - // Block 0x32, offset 0x12f - {value: 0x0000, lo: 0x01}, - {value: 0x8131, lo: 0xa9, hi: 0xa9}, - // Block 0x33, offset 0x131 - {value: 0x0004, lo: 0x02}, - {value: 0x812e, lo: 0xb9, hi: 0xba}, - {value: 0x812d, lo: 0xbb, hi: 0xbb}, - // Block 0x34, offset 0x134 - {value: 0x0000, lo: 0x02}, - {value: 0x8132, lo: 0x97, hi: 0x97}, - {value: 0x812d, lo: 0x98, hi: 0x98}, - // Block 0x35, offset 0x137 - {value: 0x0000, lo: 0x03}, - {value: 0x8104, lo: 0xa0, hi: 0xa0}, - {value: 0x8132, lo: 0xb5, hi: 0xbc}, - {value: 0x812d, lo: 0xbf, hi: 0xbf}, - // Block 0x36, offset 0x13b - {value: 0x0000, lo: 0x04}, - {value: 0x8132, lo: 0xb0, hi: 0xb4}, - {value: 0x812d, lo: 0xb5, hi: 0xba}, - {value: 0x8132, lo: 0xbb, hi: 0xbc}, - {value: 0x812d, lo: 0xbd, hi: 0xbd}, - // Block 0x37, offset 0x140 - {value: 0x0000, lo: 0x08}, - {value: 0x2d66, lo: 0x80, hi: 0x80}, - {value: 0x2d6e, lo: 0x81, hi: 0x81}, - {value: 0xa000, lo: 0x82, hi: 0x82}, - {value: 0x2d76, lo: 0x83, hi: 0x83}, - {value: 0x8104, lo: 0x84, hi: 0x84}, - {value: 0x8132, lo: 0xab, hi: 0xab}, - {value: 0x812d, lo: 0xac, hi: 0xac}, - {value: 0x8132, lo: 0xad, hi: 0xb3}, - // Block 0x38, offset 0x149 - {value: 0x0000, lo: 0x01}, - {value: 0x8104, lo: 0xaa, hi: 0xab}, - // Block 0x39, offset 0x14b - {value: 0x0000, lo: 0x02}, - {value: 0x8102, lo: 0xa6, hi: 0xa6}, - {value: 0x8104, lo: 0xb2, hi: 0xb3}, - // Block 0x3a, offset 0x14e - {value: 0x0000, lo: 0x01}, - {value: 0x8102, lo: 0xb7, hi: 0xb7}, - // Block 0x3b, offset 0x150 - {value: 0x0000, lo: 0x0a}, - {value: 0x8132, lo: 0x90, hi: 0x92}, - {value: 0x8101, lo: 0x94, hi: 0x94}, - {value: 0x812d, lo: 0x95, hi: 0x99}, - {value: 0x8132, lo: 0x9a, hi: 0x9b}, - {value: 0x812d, lo: 0x9c, hi: 0x9f}, - {value: 0x8132, lo: 0xa0, hi: 0xa0}, - {value: 0x8101, lo: 0xa2, hi: 0xa8}, - {value: 0x812d, lo: 0xad, hi: 0xad}, - {value: 0x8132, lo: 0xb4, hi: 0xb4}, - {value: 0x8132, lo: 0xb8, hi: 0xb9}, - // Block 0x3c, offset 0x15b - {value: 0x0002, lo: 0x0a}, - {value: 0x0043, lo: 0xac, hi: 0xac}, - {value: 0x00d1, lo: 0xad, hi: 0xad}, - {value: 0x0045, lo: 0xae, hi: 0xae}, - {value: 0x0049, lo: 0xb0, hi: 0xb1}, - {value: 0x00e6, lo: 0xb2, hi: 0xb2}, - {value: 0x004f, lo: 0xb3, hi: 0xba}, - {value: 0x005f, lo: 0xbc, hi: 0xbc}, - {value: 0x00ef, lo: 0xbd, hi: 0xbd}, - {value: 0x0061, lo: 0xbe, hi: 0xbe}, - {value: 0x0065, lo: 0xbf, hi: 0xbf}, - // Block 0x3d, offset 0x166 - {value: 0x0000, lo: 0x0f}, - {value: 0x8132, lo: 0x80, hi: 0x81}, - {value: 0x812d, lo: 0x82, hi: 0x82}, - {value: 0x8132, lo: 0x83, hi: 0x89}, - {value: 0x812d, lo: 0x8a, hi: 0x8a}, - {value: 0x8132, lo: 0x8b, hi: 0x8c}, - {value: 0x8135, lo: 0x8d, hi: 0x8d}, - {value: 0x812a, lo: 0x8e, hi: 0x8e}, - {value: 0x812d, lo: 0x8f, hi: 0x8f}, - {value: 0x8129, lo: 0x90, hi: 0x90}, - {value: 0x8132, lo: 0x91, hi: 0xb5}, - {value: 0x8132, lo: 0xbb, hi: 0xbb}, - {value: 0x8134, lo: 0xbc, hi: 0xbc}, - {value: 0x812d, lo: 0xbd, hi: 0xbd}, - {value: 0x8132, lo: 0xbe, hi: 0xbe}, - {value: 0x812d, lo: 0xbf, hi: 0xbf}, - // Block 0x3e, offset 0x176 - {value: 0x0000, lo: 0x0d}, - {value: 0x0001, lo: 0x80, hi: 0x8a}, - {value: 0x043b, lo: 0x91, hi: 0x91}, - {value: 0x429b, lo: 0x97, hi: 0x97}, - {value: 0x001d, lo: 0xa4, hi: 0xa4}, - {value: 0x1873, lo: 0xa5, hi: 0xa5}, - {value: 0x1b5c, lo: 0xa6, hi: 0xa6}, - {value: 0x0001, lo: 0xaf, hi: 0xaf}, - {value: 0x2691, lo: 0xb3, hi: 0xb3}, - {value: 0x27fe, lo: 0xb4, hi: 0xb4}, - {value: 0x2698, lo: 0xb6, hi: 0xb6}, - {value: 0x2808, lo: 0xb7, hi: 0xb7}, - {value: 0x186d, lo: 0xbc, hi: 0xbc}, - {value: 0x4269, lo: 0xbe, hi: 0xbe}, - // Block 0x3f, offset 0x184 - {value: 0x0002, lo: 0x0d}, - {value: 0x1933, lo: 0x87, hi: 0x87}, - {value: 0x1930, lo: 0x88, hi: 0x88}, - {value: 0x1870, lo: 0x89, hi: 0x89}, - {value: 0x298e, lo: 0x97, hi: 0x97}, - {value: 0x0001, lo: 0x9f, hi: 0x9f}, - {value: 0x0021, lo: 0xb0, hi: 0xb0}, - {value: 0x0093, lo: 0xb1, hi: 0xb1}, - {value: 0x0029, lo: 0xb4, hi: 0xb9}, - {value: 0x0017, lo: 0xba, hi: 0xba}, - {value: 0x0467, lo: 0xbb, hi: 0xbb}, - {value: 0x003b, lo: 0xbc, hi: 0xbc}, - {value: 0x0011, lo: 0xbd, hi: 0xbe}, - {value: 0x009d, lo: 0xbf, hi: 0xbf}, - // Block 0x40, offset 0x192 - {value: 0x0002, lo: 0x0f}, - {value: 0x0021, lo: 0x80, hi: 0x89}, - {value: 0x0017, lo: 0x8a, hi: 0x8a}, - {value: 0x0467, lo: 0x8b, hi: 0x8b}, - {value: 0x003b, lo: 0x8c, hi: 0x8c}, - {value: 0x0011, lo: 0x8d, hi: 0x8e}, - {value: 0x0083, lo: 0x90, hi: 0x90}, - {value: 0x008b, lo: 0x91, hi: 0x91}, - {value: 0x009f, lo: 0x92, hi: 0x92}, - {value: 0x00b1, lo: 0x93, hi: 0x93}, - {value: 0x0104, lo: 0x94, hi: 0x94}, - {value: 0x0091, lo: 0x95, hi: 0x95}, - {value: 0x0097, lo: 0x96, hi: 0x99}, - {value: 0x00a1, lo: 0x9a, hi: 0x9a}, - {value: 0x00a7, lo: 0x9b, hi: 0x9c}, - {value: 0x1999, lo: 0xa8, hi: 0xa8}, - // Block 0x41, offset 0x1a2 - {value: 0x0000, lo: 0x0d}, - {value: 0x8132, lo: 0x90, hi: 0x91}, - {value: 0x8101, lo: 0x92, hi: 0x93}, - {value: 0x8132, lo: 0x94, hi: 0x97}, - {value: 0x8101, lo: 0x98, hi: 0x9a}, - {value: 0x8132, lo: 0x9b, hi: 0x9c}, - {value: 0x8132, lo: 0xa1, hi: 0xa1}, - {value: 0x8101, lo: 0xa5, hi: 0xa6}, - {value: 0x8132, lo: 0xa7, hi: 0xa7}, - {value: 0x812d, lo: 0xa8, hi: 0xa8}, - {value: 0x8132, lo: 0xa9, hi: 0xa9}, - {value: 0x8101, lo: 0xaa, hi: 0xab}, - {value: 0x812d, lo: 0xac, hi: 0xaf}, - {value: 0x8132, lo: 0xb0, hi: 0xb0}, - // Block 0x42, offset 0x1b0 - {value: 0x0007, lo: 0x06}, - {value: 0x2180, lo: 0x89, hi: 0x89}, - {value: 0xa000, lo: 0x90, hi: 0x90}, - {value: 0xa000, lo: 0x92, hi: 0x92}, - {value: 0xa000, lo: 0x94, hi: 0x94}, - {value: 0x3bb9, lo: 0x9a, hi: 0x9b}, - {value: 0x3bc7, lo: 0xae, hi: 0xae}, - // Block 0x43, offset 0x1b7 - {value: 0x000e, lo: 0x05}, - {value: 0x3bce, lo: 0x8d, hi: 0x8e}, - {value: 0x3bd5, lo: 0x8f, hi: 0x8f}, - {value: 0xa000, lo: 0x90, hi: 0x90}, - {value: 0xa000, lo: 0x92, hi: 0x92}, - {value: 0xa000, lo: 0x94, hi: 0x94}, - // Block 0x44, offset 0x1bd - {value: 0x0173, lo: 0x0e}, - {value: 0xa000, lo: 0x83, hi: 0x83}, - {value: 0x3be3, lo: 0x84, hi: 0x84}, - {value: 0xa000, lo: 0x88, hi: 0x88}, - {value: 0x3bea, lo: 0x89, hi: 0x89}, - {value: 0xa000, lo: 0x8b, hi: 0x8b}, - {value: 0x3bf1, lo: 0x8c, hi: 0x8c}, - {value: 0xa000, lo: 0xa3, hi: 0xa3}, - {value: 0x3bf8, lo: 0xa4, hi: 0xa4}, - {value: 0xa000, lo: 0xa5, hi: 0xa5}, - {value: 0x3bff, lo: 0xa6, hi: 0xa6}, - {value: 0x269f, lo: 0xac, hi: 0xad}, - {value: 0x26a6, lo: 0xaf, hi: 0xaf}, - {value: 0x281c, lo: 0xb0, hi: 0xb0}, - {value: 0xa000, lo: 0xbc, hi: 0xbc}, - // Block 0x45, offset 0x1cc - {value: 0x0007, lo: 0x03}, - {value: 0x3c68, lo: 0xa0, hi: 0xa1}, - {value: 0x3c92, lo: 0xa2, hi: 0xa3}, - {value: 0x3cbc, lo: 0xaa, hi: 0xad}, - // Block 0x46, offset 0x1d0 - {value: 0x0004, lo: 0x01}, - {value: 0x048b, lo: 0xa9, hi: 0xaa}, - // Block 0x47, offset 0x1d2 - {value: 0x0002, lo: 0x03}, - {value: 0x0057, lo: 0x80, hi: 0x8f}, - {value: 0x0083, lo: 0x90, hi: 0xa9}, - {value: 0x0021, lo: 0xaa, hi: 0xaa}, - // Block 0x48, offset 0x1d6 - {value: 0x0000, lo: 0x01}, - {value: 0x299b, lo: 0x8c, hi: 0x8c}, - // Block 0x49, offset 0x1d8 - {value: 0x0263, lo: 0x02}, - {value: 0x1b8c, lo: 0xb4, hi: 0xb4}, - {value: 0x192d, lo: 0xb5, hi: 0xb6}, - // Block 0x4a, offset 0x1db - {value: 0x0000, lo: 0x01}, - {value: 0x44dd, lo: 0x9c, hi: 0x9c}, - // Block 0x4b, offset 0x1dd - {value: 0x0000, lo: 0x02}, - {value: 0x0095, lo: 0xbc, hi: 0xbc}, - {value: 0x006d, lo: 0xbd, hi: 0xbd}, - // Block 0x4c, offset 0x1e0 - {value: 0x0000, lo: 0x01}, - {value: 0x8132, lo: 0xaf, hi: 0xb1}, - // Block 0x4d, offset 0x1e2 - {value: 0x0000, lo: 0x02}, - {value: 0x047f, lo: 0xaf, hi: 0xaf}, - {value: 0x8104, lo: 0xbf, hi: 0xbf}, - // Block 0x4e, offset 0x1e5 - {value: 0x0000, lo: 0x01}, - {value: 0x8132, lo: 0xa0, hi: 0xbf}, - // Block 0x4f, offset 0x1e7 - {value: 0x0000, lo: 0x01}, - {value: 0x0dc3, lo: 0x9f, hi: 0x9f}, - // Block 0x50, offset 0x1e9 - {value: 0x0000, lo: 0x01}, - {value: 0x162f, lo: 0xb3, hi: 0xb3}, - // Block 0x51, offset 0x1eb - {value: 0x0004, lo: 0x0b}, - {value: 0x1597, lo: 0x80, hi: 0x82}, - {value: 0x15af, lo: 0x83, hi: 0x83}, - {value: 0x15c7, lo: 0x84, hi: 0x85}, - {value: 0x15d7, lo: 0x86, hi: 0x89}, - {value: 0x15eb, lo: 0x8a, hi: 0x8c}, - {value: 0x15ff, lo: 0x8d, hi: 0x8d}, - {value: 0x1607, lo: 0x8e, hi: 0x8e}, - {value: 0x160f, lo: 0x8f, hi: 0x90}, - {value: 0x161b, lo: 0x91, hi: 0x93}, - {value: 0x162b, lo: 0x94, hi: 0x94}, - {value: 0x1633, lo: 0x95, hi: 0x95}, - // Block 0x52, offset 0x1f7 - {value: 0x0004, lo: 0x09}, - {value: 0x0001, lo: 0x80, hi: 0x80}, - {value: 0x812c, lo: 0xaa, hi: 0xaa}, - {value: 0x8131, lo: 0xab, hi: 0xab}, - {value: 0x8133, lo: 0xac, hi: 0xac}, - {value: 0x812e, lo: 0xad, hi: 0xad}, - {value: 0x812f, lo: 0xae, hi: 0xae}, - {value: 0x812f, lo: 0xaf, hi: 0xaf}, - {value: 0x04b3, lo: 0xb6, hi: 0xb6}, - {value: 0x0887, lo: 0xb8, hi: 0xba}, - // Block 0x53, offset 0x201 - {value: 0x0006, lo: 0x09}, - {value: 0x0313, lo: 0xb1, hi: 0xb1}, - {value: 0x0317, lo: 0xb2, hi: 0xb2}, - {value: 0x4a3b, lo: 0xb3, hi: 0xb3}, - {value: 0x031b, lo: 0xb4, hi: 0xb4}, - {value: 0x4a41, lo: 0xb5, hi: 0xb6}, - {value: 0x031f, lo: 0xb7, hi: 0xb7}, - {value: 0x0323, lo: 0xb8, hi: 0xb8}, - {value: 0x0327, lo: 0xb9, hi: 0xb9}, - {value: 0x4a4d, lo: 0xba, hi: 0xbf}, - // Block 0x54, offset 0x20b - {value: 0x0000, lo: 0x02}, - {value: 0x8132, lo: 0xaf, hi: 0xaf}, - {value: 0x8132, lo: 0xb4, hi: 0xbd}, - // Block 0x55, offset 0x20e - {value: 0x0000, lo: 0x03}, - {value: 0x020f, lo: 0x9c, hi: 0x9c}, - {value: 0x0212, lo: 0x9d, hi: 0x9d}, - {value: 0x8132, lo: 0x9e, hi: 0x9f}, - // Block 0x56, offset 0x212 - {value: 0x0000, lo: 0x01}, - {value: 0x8132, lo: 0xb0, hi: 0xb1}, - // Block 0x57, offset 0x214 - {value: 0x0000, lo: 0x01}, - {value: 0x163b, lo: 0xb0, hi: 0xb0}, - // Block 0x58, offset 0x216 - {value: 0x000c, lo: 0x01}, - {value: 0x00d7, lo: 0xb8, hi: 0xb9}, - // Block 0x59, offset 0x218 - {value: 0x0000, lo: 0x01}, - {value: 0x8104, lo: 0x86, hi: 0x86}, - // Block 0x5a, offset 0x21a - {value: 0x0000, lo: 0x02}, - {value: 0x8104, lo: 0x84, hi: 0x84}, - {value: 0x8132, lo: 0xa0, hi: 0xb1}, - // Block 0x5b, offset 0x21d - {value: 0x0000, lo: 0x01}, - {value: 0x812d, lo: 0xab, hi: 0xad}, - // Block 0x5c, offset 0x21f - {value: 0x0000, lo: 0x01}, - {value: 0x8104, lo: 0x93, hi: 0x93}, - // Block 0x5d, offset 0x221 - {value: 0x0000, lo: 0x01}, - {value: 0x8102, lo: 0xb3, hi: 0xb3}, - // Block 0x5e, offset 0x223 - {value: 0x0000, lo: 0x01}, - {value: 0x8104, lo: 0x80, hi: 0x80}, - // Block 0x5f, offset 0x225 - {value: 0x0000, lo: 0x05}, - {value: 0x8132, lo: 0xb0, hi: 0xb0}, - {value: 0x8132, lo: 0xb2, hi: 0xb3}, - {value: 0x812d, lo: 0xb4, hi: 0xb4}, - {value: 0x8132, lo: 0xb7, hi: 0xb8}, - {value: 0x8132, lo: 0xbe, hi: 0xbf}, - // Block 0x60, offset 0x22b - {value: 0x0000, lo: 0x02}, - {value: 0x8132, lo: 0x81, hi: 0x81}, - {value: 0x8104, lo: 0xb6, hi: 0xb6}, - // Block 0x61, offset 0x22e - {value: 0x0008, lo: 0x03}, - {value: 0x1637, lo: 0x9c, hi: 0x9d}, - {value: 0x0125, lo: 0x9e, hi: 0x9e}, - {value: 0x1643, lo: 0x9f, hi: 0x9f}, - // Block 0x62, offset 0x232 - {value: 0x0000, lo: 0x01}, - {value: 0x8104, lo: 0xad, hi: 0xad}, - // Block 0x63, offset 0x234 - {value: 0x0000, lo: 0x06}, - {value: 0xe500, lo: 0x80, hi: 0x80}, - {value: 0xc600, lo: 0x81, hi: 0x9b}, - {value: 0xe500, lo: 0x9c, hi: 0x9c}, - {value: 0xc600, lo: 0x9d, hi: 0xb7}, - {value: 0xe500, lo: 0xb8, hi: 0xb8}, - {value: 0xc600, lo: 0xb9, hi: 0xbf}, - // Block 0x64, offset 0x23b - {value: 0x0000, lo: 0x05}, - {value: 0xc600, lo: 0x80, hi: 0x93}, - {value: 0xe500, lo: 0x94, hi: 0x94}, - {value: 0xc600, lo: 0x95, hi: 0xaf}, - {value: 0xe500, lo: 0xb0, hi: 0xb0}, - {value: 0xc600, lo: 0xb1, hi: 0xbf}, - // Block 0x65, offset 0x241 - {value: 0x0000, lo: 0x05}, - {value: 0xc600, lo: 0x80, hi: 0x8b}, - {value: 0xe500, lo: 0x8c, hi: 0x8c}, - {value: 0xc600, lo: 0x8d, hi: 0xa7}, - {value: 0xe500, lo: 0xa8, hi: 0xa8}, - {value: 0xc600, lo: 0xa9, hi: 0xbf}, - // Block 0x66, offset 0x247 - {value: 0x0000, lo: 0x07}, - {value: 0xc600, lo: 0x80, hi: 0x83}, - {value: 0xe500, lo: 0x84, hi: 0x84}, - {value: 0xc600, lo: 0x85, hi: 0x9f}, - {value: 0xe500, lo: 0xa0, hi: 0xa0}, - {value: 0xc600, lo: 0xa1, hi: 0xbb}, - {value: 0xe500, lo: 0xbc, hi: 0xbc}, - {value: 0xc600, lo: 0xbd, hi: 0xbf}, - // Block 0x67, offset 0x24f - {value: 0x0000, lo: 0x05}, - {value: 0xc600, lo: 0x80, hi: 0x97}, - {value: 0xe500, lo: 0x98, hi: 0x98}, - {value: 0xc600, lo: 0x99, hi: 0xb3}, - {value: 0xe500, lo: 0xb4, hi: 0xb4}, - {value: 0xc600, lo: 0xb5, hi: 0xbf}, - // Block 0x68, offset 0x255 - {value: 0x0000, lo: 0x05}, - {value: 0xc600, lo: 0x80, hi: 0x8f}, - {value: 0xe500, lo: 0x90, hi: 0x90}, - {value: 0xc600, lo: 0x91, hi: 0xab}, - {value: 0xe500, lo: 0xac, hi: 0xac}, - {value: 0xc600, lo: 0xad, hi: 0xbf}, - // Block 0x69, offset 0x25b - {value: 0x0000, lo: 0x05}, - {value: 0xc600, lo: 0x80, hi: 0x87}, - {value: 0xe500, lo: 0x88, hi: 0x88}, - {value: 0xc600, lo: 0x89, hi: 0xa3}, - {value: 0xe500, lo: 0xa4, hi: 0xa4}, - {value: 0xc600, lo: 0xa5, hi: 0xbf}, - // Block 0x6a, offset 0x261 - {value: 0x0000, lo: 0x03}, - {value: 0xc600, lo: 0x80, hi: 0x87}, - {value: 0xe500, lo: 0x88, hi: 0x88}, - {value: 0xc600, lo: 0x89, hi: 0xa3}, - // Block 0x6b, offset 0x265 - {value: 0x0002, lo: 0x01}, - {value: 0x0003, lo: 0x81, hi: 0xbf}, - // Block 0x6c, offset 0x267 - {value: 0x0000, lo: 0x01}, - {value: 0x812d, lo: 0xbd, hi: 0xbd}, - // Block 0x6d, offset 0x269 - {value: 0x0000, lo: 0x01}, - {value: 0x812d, lo: 0xa0, hi: 0xa0}, - // Block 0x6e, offset 0x26b - {value: 0x0000, lo: 0x01}, - {value: 0x8132, lo: 0xb6, hi: 0xba}, - // Block 0x6f, offset 0x26d - {value: 0x002c, lo: 0x05}, - {value: 0x812d, lo: 0x8d, hi: 0x8d}, - {value: 0x8132, lo: 0x8f, hi: 0x8f}, - {value: 0x8132, lo: 0xb8, hi: 0xb8}, - {value: 0x8101, lo: 0xb9, hi: 0xba}, - {value: 0x8104, lo: 0xbf, hi: 0xbf}, - // Block 0x70, offset 0x273 - {value: 0x0000, lo: 0x02}, - {value: 0x8132, lo: 0xa5, hi: 0xa5}, - {value: 0x812d, lo: 0xa6, hi: 0xa6}, - // Block 0x71, offset 0x276 - {value: 0x0000, lo: 0x02}, - {value: 0x8104, lo: 0x86, hi: 0x86}, - {value: 0x8104, lo: 0xbf, hi: 0xbf}, - // Block 0x72, offset 0x279 - {value: 0x17fe, lo: 0x07}, - {value: 0xa000, lo: 0x99, hi: 0x99}, - {value: 0x4238, lo: 0x9a, hi: 0x9a}, - {value: 0xa000, lo: 0x9b, hi: 0x9b}, - {value: 0x4242, lo: 0x9c, hi: 0x9c}, - {value: 0xa000, lo: 0xa5, hi: 0xa5}, - {value: 0x424c, lo: 0xab, hi: 0xab}, - {value: 0x8104, lo: 0xb9, hi: 0xba}, - // Block 0x73, offset 0x281 - {value: 0x0000, lo: 0x06}, - {value: 0x8132, lo: 0x80, hi: 0x82}, - {value: 0x9900, lo: 0xa7, hi: 0xa7}, - {value: 0x2d7e, lo: 0xae, hi: 0xae}, - {value: 0x2d88, lo: 0xaf, hi: 0xaf}, - {value: 0xa000, lo: 0xb1, hi: 0xb2}, - {value: 0x8104, lo: 0xb3, hi: 0xb4}, - // Block 0x74, offset 0x288 - {value: 0x0000, lo: 0x02}, - {value: 0x8104, lo: 0x80, hi: 0x80}, - {value: 0x8102, lo: 0x8a, hi: 0x8a}, - // Block 0x75, offset 0x28b - {value: 0x0000, lo: 0x02}, - {value: 0x8104, lo: 0xb5, hi: 0xb5}, - {value: 0x8102, lo: 0xb6, hi: 0xb6}, - // Block 0x76, offset 0x28e - {value: 0x0002, lo: 0x01}, - {value: 0x8102, lo: 0xa9, hi: 0xaa}, - // Block 0x77, offset 0x290 - {value: 0x0000, lo: 0x07}, - {value: 0xa000, lo: 0x87, hi: 0x87}, - {value: 0x2d92, lo: 0x8b, hi: 0x8b}, - {value: 0x2d9c, lo: 0x8c, hi: 0x8c}, - {value: 0x8104, lo: 0x8d, hi: 0x8d}, - {value: 0x9900, lo: 0x97, hi: 0x97}, - {value: 0x8132, lo: 0xa6, hi: 0xac}, - {value: 0x8132, lo: 0xb0, hi: 0xb4}, - // Block 0x78, offset 0x298 - {value: 0x0000, lo: 0x02}, - {value: 0x8104, lo: 0x82, hi: 0x82}, - {value: 0x8102, lo: 0x86, hi: 0x86}, - // Block 0x79, offset 0x29b - {value: 0x6b5a, lo: 0x06}, - {value: 0x9900, lo: 0xb0, hi: 0xb0}, - {value: 0xa000, lo: 0xb9, hi: 0xb9}, - {value: 0x9900, lo: 0xba, hi: 0xba}, - {value: 0x2db0, lo: 0xbb, hi: 0xbb}, - {value: 0x2da6, lo: 0xbc, hi: 0xbd}, - {value: 0x2dba, lo: 0xbe, hi: 0xbe}, - // Block 0x7a, offset 0x2a2 - {value: 0x0000, lo: 0x02}, - {value: 0x8104, lo: 0x82, hi: 0x82}, - {value: 0x8102, lo: 0x83, hi: 0x83}, - // Block 0x7b, offset 0x2a5 - {value: 0x0000, lo: 0x05}, - {value: 0x9900, lo: 0xaf, hi: 0xaf}, - {value: 0xa000, lo: 0xb8, hi: 0xb9}, - {value: 0x2dc4, lo: 0xba, hi: 0xba}, - {value: 0x2dce, lo: 0xbb, hi: 0xbb}, - {value: 0x8104, lo: 0xbf, hi: 0xbf}, - // Block 0x7c, offset 0x2ab - {value: 0x0000, lo: 0x01}, - {value: 0x8102, lo: 0x80, hi: 0x80}, - // Block 0x7d, offset 0x2ad - {value: 0x0000, lo: 0x01}, - {value: 0x8104, lo: 0xbf, hi: 0xbf}, - // Block 0x7e, offset 0x2af - {value: 0x0000, lo: 0x02}, - {value: 0x8104, lo: 0xb6, hi: 0xb6}, - {value: 0x8102, lo: 0xb7, hi: 0xb7}, - // Block 0x7f, offset 0x2b2 - {value: 0x0000, lo: 0x01}, - {value: 0x8104, lo: 0xab, hi: 0xab}, - // Block 0x80, offset 0x2b4 - {value: 0x0000, lo: 0x01}, - {value: 0x8101, lo: 0xb0, hi: 0xb4}, - // Block 0x81, offset 0x2b6 - {value: 0x0000, lo: 0x01}, - {value: 0x8132, lo: 0xb0, hi: 0xb6}, - // Block 0x82, offset 0x2b8 - {value: 0x0000, lo: 0x01}, - {value: 0x8101, lo: 0x9e, hi: 0x9e}, - // Block 0x83, offset 0x2ba - {value: 0x0000, lo: 0x0c}, - {value: 0x45cc, lo: 0x9e, hi: 0x9e}, - {value: 0x45d6, lo: 0x9f, hi: 0x9f}, - {value: 0x460a, lo: 0xa0, hi: 0xa0}, - {value: 0x4618, lo: 0xa1, hi: 0xa1}, - {value: 0x4626, lo: 0xa2, hi: 0xa2}, - {value: 0x4634, lo: 0xa3, hi: 0xa3}, - {value: 0x4642, lo: 0xa4, hi: 0xa4}, - {value: 0x812b, lo: 0xa5, hi: 0xa6}, - {value: 0x8101, lo: 0xa7, hi: 0xa9}, - {value: 0x8130, lo: 0xad, hi: 0xad}, - {value: 0x812b, lo: 0xae, hi: 0xb2}, - {value: 0x812d, lo: 0xbb, hi: 0xbf}, - // Block 0x84, offset 0x2c7 - {value: 0x0000, lo: 0x09}, - {value: 0x812d, lo: 0x80, hi: 0x82}, - {value: 0x8132, lo: 0x85, hi: 0x89}, - {value: 0x812d, lo: 0x8a, hi: 0x8b}, - {value: 0x8132, lo: 0xaa, hi: 0xad}, - {value: 0x45e0, lo: 0xbb, hi: 0xbb}, - {value: 0x45ea, lo: 0xbc, hi: 0xbc}, - {value: 0x4650, lo: 0xbd, hi: 0xbd}, - {value: 0x466c, lo: 0xbe, hi: 0xbe}, - {value: 0x465e, lo: 0xbf, hi: 0xbf}, - // Block 0x85, offset 0x2d1 - {value: 0x0000, lo: 0x01}, - {value: 0x467a, lo: 0x80, hi: 0x80}, - // Block 0x86, offset 0x2d3 - {value: 0x0000, lo: 0x01}, - {value: 0x8132, lo: 0x82, hi: 0x84}, - // Block 0x87, offset 0x2d5 - {value: 0x0002, lo: 0x03}, - {value: 0x0043, lo: 0x80, hi: 0x99}, - {value: 0x0083, lo: 0x9a, hi: 0xb3}, - {value: 0x0043, lo: 0xb4, hi: 0xbf}, - // Block 0x88, offset 0x2d9 - {value: 0x0002, lo: 0x04}, - {value: 0x005b, lo: 0x80, hi: 0x8d}, - {value: 0x0083, lo: 0x8e, hi: 0x94}, - {value: 0x0093, lo: 0x96, hi: 0xa7}, - {value: 0x0043, lo: 0xa8, hi: 0xbf}, - // Block 0x89, offset 0x2de - {value: 0x0002, lo: 0x0b}, - {value: 0x0073, lo: 0x80, hi: 0x81}, - {value: 0x0083, lo: 0x82, hi: 0x9b}, - {value: 0x0043, lo: 0x9c, hi: 0x9c}, - {value: 0x0047, lo: 0x9e, hi: 0x9f}, - {value: 0x004f, lo: 0xa2, hi: 0xa2}, - {value: 0x0055, lo: 0xa5, hi: 0xa6}, - {value: 0x005d, lo: 0xa9, hi: 0xac}, - {value: 0x0067, lo: 0xae, hi: 0xb5}, - {value: 0x0083, lo: 0xb6, hi: 0xb9}, - {value: 0x008d, lo: 0xbb, hi: 0xbb}, - {value: 0x0091, lo: 0xbd, hi: 0xbf}, - // Block 0x8a, offset 0x2ea - {value: 0x0002, lo: 0x04}, - {value: 0x0097, lo: 0x80, hi: 0x83}, - {value: 0x00a1, lo: 0x85, hi: 0x8f}, - {value: 0x0043, lo: 0x90, hi: 0xa9}, - {value: 0x0083, lo: 0xaa, hi: 0xbf}, - // Block 0x8b, offset 0x2ef - {value: 0x0002, lo: 0x08}, - {value: 0x00af, lo: 0x80, hi: 0x83}, - {value: 0x0043, lo: 0x84, hi: 0x85}, - {value: 0x0049, lo: 0x87, hi: 0x8a}, - {value: 0x0055, lo: 0x8d, hi: 0x94}, - {value: 0x0067, lo: 0x96, hi: 0x9c}, - {value: 0x0083, lo: 0x9e, hi: 0xb7}, - {value: 0x0043, lo: 0xb8, hi: 0xb9}, - {value: 0x0049, lo: 0xbb, hi: 0xbe}, - // Block 0x8c, offset 0x2f8 - {value: 0x0002, lo: 0x05}, - {value: 0x0053, lo: 0x80, hi: 0x84}, - {value: 0x005f, lo: 0x86, hi: 0x86}, - {value: 0x0067, lo: 0x8a, hi: 0x90}, - {value: 0x0083, lo: 0x92, hi: 0xab}, - {value: 0x0043, lo: 0xac, hi: 0xbf}, - // Block 0x8d, offset 0x2fe - {value: 0x0002, lo: 0x04}, - {value: 0x006b, lo: 0x80, hi: 0x85}, - {value: 0x0083, lo: 0x86, hi: 0x9f}, - {value: 0x0043, lo: 0xa0, hi: 0xb9}, - {value: 0x0083, lo: 0xba, hi: 0xbf}, - // Block 0x8e, offset 0x303 - {value: 0x0002, lo: 0x03}, - {value: 0x008f, lo: 0x80, hi: 0x93}, - {value: 0x0043, lo: 0x94, hi: 0xad}, - {value: 0x0083, lo: 0xae, hi: 0xbf}, - // Block 0x8f, offset 0x307 - {value: 0x0002, lo: 0x04}, - {value: 0x00a7, lo: 0x80, hi: 0x87}, - {value: 0x0043, lo: 0x88, hi: 0xa1}, - {value: 0x0083, lo: 0xa2, hi: 0xbb}, - {value: 0x0043, lo: 0xbc, hi: 0xbf}, - // Block 0x90, offset 0x30c - {value: 0x0002, lo: 0x03}, - {value: 0x004b, lo: 0x80, hi: 0x95}, - {value: 0x0083, lo: 0x96, hi: 0xaf}, - {value: 0x0043, lo: 0xb0, hi: 0xbf}, - // Block 0x91, offset 0x310 - {value: 0x0003, lo: 0x0f}, - {value: 0x01b8, lo: 0x80, hi: 0x80}, - {value: 0x045f, lo: 0x81, hi: 0x81}, - {value: 0x01bb, lo: 0x82, hi: 0x9a}, - {value: 0x045b, lo: 0x9b, hi: 0x9b}, - {value: 0x01c7, lo: 0x9c, hi: 0x9c}, - {value: 0x01d0, lo: 0x9d, hi: 0x9d}, - {value: 0x01d6, lo: 0x9e, hi: 0x9e}, - {value: 0x01fa, lo: 0x9f, hi: 0x9f}, - {value: 0x01eb, lo: 0xa0, hi: 0xa0}, - {value: 0x01e8, lo: 0xa1, hi: 0xa1}, - {value: 0x0173, lo: 0xa2, hi: 0xb2}, - {value: 0x0188, lo: 0xb3, hi: 0xb3}, - {value: 0x01a6, lo: 0xb4, hi: 0xba}, - {value: 0x045f, lo: 0xbb, hi: 0xbb}, - {value: 0x01bb, lo: 0xbc, hi: 0xbf}, - // Block 0x92, offset 0x320 - {value: 0x0003, lo: 0x0d}, - {value: 0x01c7, lo: 0x80, hi: 0x94}, - {value: 0x045b, lo: 0x95, hi: 0x95}, - {value: 0x01c7, lo: 0x96, hi: 0x96}, - {value: 0x01d0, lo: 0x97, hi: 0x97}, - {value: 0x01d6, lo: 0x98, hi: 0x98}, - {value: 0x01fa, lo: 0x99, hi: 0x99}, - {value: 0x01eb, lo: 0x9a, hi: 0x9a}, - {value: 0x01e8, lo: 0x9b, hi: 0x9b}, - {value: 0x0173, lo: 0x9c, hi: 0xac}, - {value: 0x0188, lo: 0xad, hi: 0xad}, - {value: 0x01a6, lo: 0xae, hi: 0xb4}, - {value: 0x045f, lo: 0xb5, hi: 0xb5}, - {value: 0x01bb, lo: 0xb6, hi: 0xbf}, - // Block 0x93, offset 0x32e - {value: 0x0003, lo: 0x0d}, - {value: 0x01d9, lo: 0x80, hi: 0x8e}, - {value: 0x045b, lo: 0x8f, hi: 0x8f}, - {value: 0x01c7, lo: 0x90, hi: 0x90}, - {value: 0x01d0, lo: 0x91, hi: 0x91}, - {value: 0x01d6, lo: 0x92, hi: 0x92}, - {value: 0x01fa, lo: 0x93, hi: 0x93}, - {value: 0x01eb, lo: 0x94, hi: 0x94}, - {value: 0x01e8, lo: 0x95, hi: 0x95}, - {value: 0x0173, lo: 0x96, hi: 0xa6}, - {value: 0x0188, lo: 0xa7, hi: 0xa7}, - {value: 0x01a6, lo: 0xa8, hi: 0xae}, - {value: 0x045f, lo: 0xaf, hi: 0xaf}, - {value: 0x01bb, lo: 0xb0, hi: 0xbf}, - // Block 0x94, offset 0x33c - {value: 0x0003, lo: 0x0d}, - {value: 0x01eb, lo: 0x80, hi: 0x88}, - {value: 0x045b, lo: 0x89, hi: 0x89}, - {value: 0x01c7, lo: 0x8a, hi: 0x8a}, - {value: 0x01d0, lo: 0x8b, hi: 0x8b}, - {value: 0x01d6, lo: 0x8c, hi: 0x8c}, - {value: 0x01fa, lo: 0x8d, hi: 0x8d}, - {value: 0x01eb, lo: 0x8e, hi: 0x8e}, - {value: 0x01e8, lo: 0x8f, hi: 0x8f}, - {value: 0x0173, lo: 0x90, hi: 0xa0}, - {value: 0x0188, lo: 0xa1, hi: 0xa1}, - {value: 0x01a6, lo: 0xa2, hi: 0xa8}, - {value: 0x045f, lo: 0xa9, hi: 0xa9}, - {value: 0x01bb, lo: 0xaa, hi: 0xbf}, - // Block 0x95, offset 0x34a - {value: 0x0000, lo: 0x05}, - {value: 0x8132, lo: 0x80, hi: 0x86}, - {value: 0x8132, lo: 0x88, hi: 0x98}, - {value: 0x8132, lo: 0x9b, hi: 0xa1}, - {value: 0x8132, lo: 0xa3, hi: 0xa4}, - {value: 0x8132, lo: 0xa6, hi: 0xaa}, - // Block 0x96, offset 0x350 - {value: 0x0000, lo: 0x01}, - {value: 0x812d, lo: 0x90, hi: 0x96}, - // Block 0x97, offset 0x352 - {value: 0x0000, lo: 0x02}, - {value: 0x8132, lo: 0x84, hi: 0x89}, - {value: 0x8102, lo: 0x8a, hi: 0x8a}, - // Block 0x98, offset 0x355 - {value: 0x0002, lo: 0x09}, - {value: 0x0063, lo: 0x80, hi: 0x89}, - {value: 0x1951, lo: 0x8a, hi: 0x8a}, - {value: 0x1981, lo: 0x8b, hi: 0x8b}, - {value: 0x199c, lo: 0x8c, hi: 0x8c}, - {value: 0x19a2, lo: 0x8d, hi: 0x8d}, - {value: 0x1bc0, lo: 0x8e, hi: 0x8e}, - {value: 0x19ae, lo: 0x8f, hi: 0x8f}, - {value: 0x197b, lo: 0xaa, hi: 0xaa}, - {value: 0x197e, lo: 0xab, hi: 0xab}, - // Block 0x99, offset 0x35f - {value: 0x0000, lo: 0x01}, - {value: 0x193f, lo: 0x90, hi: 0x90}, - // Block 0x9a, offset 0x361 - {value: 0x0028, lo: 0x09}, - {value: 0x2862, lo: 0x80, hi: 0x80}, - {value: 0x2826, lo: 0x81, hi: 0x81}, - {value: 0x2830, lo: 0x82, hi: 0x82}, - {value: 0x2844, lo: 0x83, hi: 0x84}, - {value: 0x284e, lo: 0x85, hi: 0x86}, - {value: 0x283a, lo: 0x87, hi: 0x87}, - {value: 0x2858, lo: 0x88, hi: 0x88}, - {value: 0x0b6f, lo: 0x90, hi: 0x90}, - {value: 0x08e7, lo: 0x91, hi: 0x91}, -} - -// recompMap: 7520 bytes (entries only) -var recompMap = map[uint32]rune{ - 0x00410300: 0x00C0, - 0x00410301: 0x00C1, - 0x00410302: 0x00C2, - 0x00410303: 0x00C3, - 0x00410308: 0x00C4, - 0x0041030A: 0x00C5, - 0x00430327: 0x00C7, - 0x00450300: 0x00C8, - 0x00450301: 0x00C9, - 0x00450302: 0x00CA, - 0x00450308: 0x00CB, - 0x00490300: 0x00CC, - 0x00490301: 0x00CD, - 0x00490302: 0x00CE, - 0x00490308: 0x00CF, - 0x004E0303: 0x00D1, - 0x004F0300: 0x00D2, - 0x004F0301: 0x00D3, - 0x004F0302: 0x00D4, - 0x004F0303: 0x00D5, - 0x004F0308: 0x00D6, - 0x00550300: 0x00D9, - 0x00550301: 0x00DA, - 0x00550302: 0x00DB, - 0x00550308: 0x00DC, - 0x00590301: 0x00DD, - 0x00610300: 0x00E0, - 0x00610301: 0x00E1, - 0x00610302: 0x00E2, - 0x00610303: 0x00E3, - 0x00610308: 0x00E4, - 0x0061030A: 0x00E5, - 0x00630327: 0x00E7, - 0x00650300: 0x00E8, - 0x00650301: 0x00E9, - 0x00650302: 0x00EA, - 0x00650308: 0x00EB, - 0x00690300: 0x00EC, - 0x00690301: 0x00ED, - 0x00690302: 0x00EE, - 0x00690308: 0x00EF, - 0x006E0303: 0x00F1, - 0x006F0300: 0x00F2, - 0x006F0301: 0x00F3, - 0x006F0302: 0x00F4, - 0x006F0303: 0x00F5, - 0x006F0308: 0x00F6, - 0x00750300: 0x00F9, - 0x00750301: 0x00FA, - 0x00750302: 0x00FB, - 0x00750308: 0x00FC, - 0x00790301: 0x00FD, - 0x00790308: 0x00FF, - 0x00410304: 0x0100, - 0x00610304: 0x0101, - 0x00410306: 0x0102, - 0x00610306: 0x0103, - 0x00410328: 0x0104, - 0x00610328: 0x0105, - 0x00430301: 0x0106, - 0x00630301: 0x0107, - 0x00430302: 0x0108, - 0x00630302: 0x0109, - 0x00430307: 0x010A, - 0x00630307: 0x010B, - 0x0043030C: 0x010C, - 0x0063030C: 0x010D, - 0x0044030C: 0x010E, - 0x0064030C: 0x010F, - 0x00450304: 0x0112, - 0x00650304: 0x0113, - 0x00450306: 0x0114, - 0x00650306: 0x0115, - 0x00450307: 0x0116, - 0x00650307: 0x0117, - 0x00450328: 0x0118, - 0x00650328: 0x0119, - 0x0045030C: 0x011A, - 0x0065030C: 0x011B, - 0x00470302: 0x011C, - 0x00670302: 0x011D, - 0x00470306: 0x011E, - 0x00670306: 0x011F, - 0x00470307: 0x0120, - 0x00670307: 0x0121, - 0x00470327: 0x0122, - 0x00670327: 0x0123, - 0x00480302: 0x0124, - 0x00680302: 0x0125, - 0x00490303: 0x0128, - 0x00690303: 0x0129, - 0x00490304: 0x012A, - 0x00690304: 0x012B, - 0x00490306: 0x012C, - 0x00690306: 0x012D, - 0x00490328: 0x012E, - 0x00690328: 0x012F, - 0x00490307: 0x0130, - 0x004A0302: 0x0134, - 0x006A0302: 0x0135, - 0x004B0327: 0x0136, - 0x006B0327: 0x0137, - 0x004C0301: 0x0139, - 0x006C0301: 0x013A, - 0x004C0327: 0x013B, - 0x006C0327: 0x013C, - 0x004C030C: 0x013D, - 0x006C030C: 0x013E, - 0x004E0301: 0x0143, - 0x006E0301: 0x0144, - 0x004E0327: 0x0145, - 0x006E0327: 0x0146, - 0x004E030C: 0x0147, - 0x006E030C: 0x0148, - 0x004F0304: 0x014C, - 0x006F0304: 0x014D, - 0x004F0306: 0x014E, - 0x006F0306: 0x014F, - 0x004F030B: 0x0150, - 0x006F030B: 0x0151, - 0x00520301: 0x0154, - 0x00720301: 0x0155, - 0x00520327: 0x0156, - 0x00720327: 0x0157, - 0x0052030C: 0x0158, - 0x0072030C: 0x0159, - 0x00530301: 0x015A, - 0x00730301: 0x015B, - 0x00530302: 0x015C, - 0x00730302: 0x015D, - 0x00530327: 0x015E, - 0x00730327: 0x015F, - 0x0053030C: 0x0160, - 0x0073030C: 0x0161, - 0x00540327: 0x0162, - 0x00740327: 0x0163, - 0x0054030C: 0x0164, - 0x0074030C: 0x0165, - 0x00550303: 0x0168, - 0x00750303: 0x0169, - 0x00550304: 0x016A, - 0x00750304: 0x016B, - 0x00550306: 0x016C, - 0x00750306: 0x016D, - 0x0055030A: 0x016E, - 0x0075030A: 0x016F, - 0x0055030B: 0x0170, - 0x0075030B: 0x0171, - 0x00550328: 0x0172, - 0x00750328: 0x0173, - 0x00570302: 0x0174, - 0x00770302: 0x0175, - 0x00590302: 0x0176, - 0x00790302: 0x0177, - 0x00590308: 0x0178, - 0x005A0301: 0x0179, - 0x007A0301: 0x017A, - 0x005A0307: 0x017B, - 0x007A0307: 0x017C, - 0x005A030C: 0x017D, - 0x007A030C: 0x017E, - 0x004F031B: 0x01A0, - 0x006F031B: 0x01A1, - 0x0055031B: 0x01AF, - 0x0075031B: 0x01B0, - 0x0041030C: 0x01CD, - 0x0061030C: 0x01CE, - 0x0049030C: 0x01CF, - 0x0069030C: 0x01D0, - 0x004F030C: 0x01D1, - 0x006F030C: 0x01D2, - 0x0055030C: 0x01D3, - 0x0075030C: 0x01D4, - 0x00DC0304: 0x01D5, - 0x00FC0304: 0x01D6, - 0x00DC0301: 0x01D7, - 0x00FC0301: 0x01D8, - 0x00DC030C: 0x01D9, - 0x00FC030C: 0x01DA, - 0x00DC0300: 0x01DB, - 0x00FC0300: 0x01DC, - 0x00C40304: 0x01DE, - 0x00E40304: 0x01DF, - 0x02260304: 0x01E0, - 0x02270304: 0x01E1, - 0x00C60304: 0x01E2, - 0x00E60304: 0x01E3, - 0x0047030C: 0x01E6, - 0x0067030C: 0x01E7, - 0x004B030C: 0x01E8, - 0x006B030C: 0x01E9, - 0x004F0328: 0x01EA, - 0x006F0328: 0x01EB, - 0x01EA0304: 0x01EC, - 0x01EB0304: 0x01ED, - 0x01B7030C: 0x01EE, - 0x0292030C: 0x01EF, - 0x006A030C: 0x01F0, - 0x00470301: 0x01F4, - 0x00670301: 0x01F5, - 0x004E0300: 0x01F8, - 0x006E0300: 0x01F9, - 0x00C50301: 0x01FA, - 0x00E50301: 0x01FB, - 0x00C60301: 0x01FC, - 0x00E60301: 0x01FD, - 0x00D80301: 0x01FE, - 0x00F80301: 0x01FF, - 0x0041030F: 0x0200, - 0x0061030F: 0x0201, - 0x00410311: 0x0202, - 0x00610311: 0x0203, - 0x0045030F: 0x0204, - 0x0065030F: 0x0205, - 0x00450311: 0x0206, - 0x00650311: 0x0207, - 0x0049030F: 0x0208, - 0x0069030F: 0x0209, - 0x00490311: 0x020A, - 0x00690311: 0x020B, - 0x004F030F: 0x020C, - 0x006F030F: 0x020D, - 0x004F0311: 0x020E, - 0x006F0311: 0x020F, - 0x0052030F: 0x0210, - 0x0072030F: 0x0211, - 0x00520311: 0x0212, - 0x00720311: 0x0213, - 0x0055030F: 0x0214, - 0x0075030F: 0x0215, - 0x00550311: 0x0216, - 0x00750311: 0x0217, - 0x00530326: 0x0218, - 0x00730326: 0x0219, - 0x00540326: 0x021A, - 0x00740326: 0x021B, - 0x0048030C: 0x021E, - 0x0068030C: 0x021F, - 0x00410307: 0x0226, - 0x00610307: 0x0227, - 0x00450327: 0x0228, - 0x00650327: 0x0229, - 0x00D60304: 0x022A, - 0x00F60304: 0x022B, - 0x00D50304: 0x022C, - 0x00F50304: 0x022D, - 0x004F0307: 0x022E, - 0x006F0307: 0x022F, - 0x022E0304: 0x0230, - 0x022F0304: 0x0231, - 0x00590304: 0x0232, - 0x00790304: 0x0233, - 0x00A80301: 0x0385, - 0x03910301: 0x0386, - 0x03950301: 0x0388, - 0x03970301: 0x0389, - 0x03990301: 0x038A, - 0x039F0301: 0x038C, - 0x03A50301: 0x038E, - 0x03A90301: 0x038F, - 0x03CA0301: 0x0390, - 0x03990308: 0x03AA, - 0x03A50308: 0x03AB, - 0x03B10301: 0x03AC, - 0x03B50301: 0x03AD, - 0x03B70301: 0x03AE, - 0x03B90301: 0x03AF, - 0x03CB0301: 0x03B0, - 0x03B90308: 0x03CA, - 0x03C50308: 0x03CB, - 0x03BF0301: 0x03CC, - 0x03C50301: 0x03CD, - 0x03C90301: 0x03CE, - 0x03D20301: 0x03D3, - 0x03D20308: 0x03D4, - 0x04150300: 0x0400, - 0x04150308: 0x0401, - 0x04130301: 0x0403, - 0x04060308: 0x0407, - 0x041A0301: 0x040C, - 0x04180300: 0x040D, - 0x04230306: 0x040E, - 0x04180306: 0x0419, - 0x04380306: 0x0439, - 0x04350300: 0x0450, - 0x04350308: 0x0451, - 0x04330301: 0x0453, - 0x04560308: 0x0457, - 0x043A0301: 0x045C, - 0x04380300: 0x045D, - 0x04430306: 0x045E, - 0x0474030F: 0x0476, - 0x0475030F: 0x0477, - 0x04160306: 0x04C1, - 0x04360306: 0x04C2, - 0x04100306: 0x04D0, - 0x04300306: 0x04D1, - 0x04100308: 0x04D2, - 0x04300308: 0x04D3, - 0x04150306: 0x04D6, - 0x04350306: 0x04D7, - 0x04D80308: 0x04DA, - 0x04D90308: 0x04DB, - 0x04160308: 0x04DC, - 0x04360308: 0x04DD, - 0x04170308: 0x04DE, - 0x04370308: 0x04DF, - 0x04180304: 0x04E2, - 0x04380304: 0x04E3, - 0x04180308: 0x04E4, - 0x04380308: 0x04E5, - 0x041E0308: 0x04E6, - 0x043E0308: 0x04E7, - 0x04E80308: 0x04EA, - 0x04E90308: 0x04EB, - 0x042D0308: 0x04EC, - 0x044D0308: 0x04ED, - 0x04230304: 0x04EE, - 0x04430304: 0x04EF, - 0x04230308: 0x04F0, - 0x04430308: 0x04F1, - 0x0423030B: 0x04F2, - 0x0443030B: 0x04F3, - 0x04270308: 0x04F4, - 0x04470308: 0x04F5, - 0x042B0308: 0x04F8, - 0x044B0308: 0x04F9, - 0x06270653: 0x0622, - 0x06270654: 0x0623, - 0x06480654: 0x0624, - 0x06270655: 0x0625, - 0x064A0654: 0x0626, - 0x06D50654: 0x06C0, - 0x06C10654: 0x06C2, - 0x06D20654: 0x06D3, - 0x0928093C: 0x0929, - 0x0930093C: 0x0931, - 0x0933093C: 0x0934, - 0x09C709BE: 0x09CB, - 0x09C709D7: 0x09CC, - 0x0B470B56: 0x0B48, - 0x0B470B3E: 0x0B4B, - 0x0B470B57: 0x0B4C, - 0x0B920BD7: 0x0B94, - 0x0BC60BBE: 0x0BCA, - 0x0BC70BBE: 0x0BCB, - 0x0BC60BD7: 0x0BCC, - 0x0C460C56: 0x0C48, - 0x0CBF0CD5: 0x0CC0, - 0x0CC60CD5: 0x0CC7, - 0x0CC60CD6: 0x0CC8, - 0x0CC60CC2: 0x0CCA, - 0x0CCA0CD5: 0x0CCB, - 0x0D460D3E: 0x0D4A, - 0x0D470D3E: 0x0D4B, - 0x0D460D57: 0x0D4C, - 0x0DD90DCA: 0x0DDA, - 0x0DD90DCF: 0x0DDC, - 0x0DDC0DCA: 0x0DDD, - 0x0DD90DDF: 0x0DDE, - 0x1025102E: 0x1026, - 0x1B051B35: 0x1B06, - 0x1B071B35: 0x1B08, - 0x1B091B35: 0x1B0A, - 0x1B0B1B35: 0x1B0C, - 0x1B0D1B35: 0x1B0E, - 0x1B111B35: 0x1B12, - 0x1B3A1B35: 0x1B3B, - 0x1B3C1B35: 0x1B3D, - 0x1B3E1B35: 0x1B40, - 0x1B3F1B35: 0x1B41, - 0x1B421B35: 0x1B43, - 0x00410325: 0x1E00, - 0x00610325: 0x1E01, - 0x00420307: 0x1E02, - 0x00620307: 0x1E03, - 0x00420323: 0x1E04, - 0x00620323: 0x1E05, - 0x00420331: 0x1E06, - 0x00620331: 0x1E07, - 0x00C70301: 0x1E08, - 0x00E70301: 0x1E09, - 0x00440307: 0x1E0A, - 0x00640307: 0x1E0B, - 0x00440323: 0x1E0C, - 0x00640323: 0x1E0D, - 0x00440331: 0x1E0E, - 0x00640331: 0x1E0F, - 0x00440327: 0x1E10, - 0x00640327: 0x1E11, - 0x0044032D: 0x1E12, - 0x0064032D: 0x1E13, - 0x01120300: 0x1E14, - 0x01130300: 0x1E15, - 0x01120301: 0x1E16, - 0x01130301: 0x1E17, - 0x0045032D: 0x1E18, - 0x0065032D: 0x1E19, - 0x00450330: 0x1E1A, - 0x00650330: 0x1E1B, - 0x02280306: 0x1E1C, - 0x02290306: 0x1E1D, - 0x00460307: 0x1E1E, - 0x00660307: 0x1E1F, - 0x00470304: 0x1E20, - 0x00670304: 0x1E21, - 0x00480307: 0x1E22, - 0x00680307: 0x1E23, - 0x00480323: 0x1E24, - 0x00680323: 0x1E25, - 0x00480308: 0x1E26, - 0x00680308: 0x1E27, - 0x00480327: 0x1E28, - 0x00680327: 0x1E29, - 0x0048032E: 0x1E2A, - 0x0068032E: 0x1E2B, - 0x00490330: 0x1E2C, - 0x00690330: 0x1E2D, - 0x00CF0301: 0x1E2E, - 0x00EF0301: 0x1E2F, - 0x004B0301: 0x1E30, - 0x006B0301: 0x1E31, - 0x004B0323: 0x1E32, - 0x006B0323: 0x1E33, - 0x004B0331: 0x1E34, - 0x006B0331: 0x1E35, - 0x004C0323: 0x1E36, - 0x006C0323: 0x1E37, - 0x1E360304: 0x1E38, - 0x1E370304: 0x1E39, - 0x004C0331: 0x1E3A, - 0x006C0331: 0x1E3B, - 0x004C032D: 0x1E3C, - 0x006C032D: 0x1E3D, - 0x004D0301: 0x1E3E, - 0x006D0301: 0x1E3F, - 0x004D0307: 0x1E40, - 0x006D0307: 0x1E41, - 0x004D0323: 0x1E42, - 0x006D0323: 0x1E43, - 0x004E0307: 0x1E44, - 0x006E0307: 0x1E45, - 0x004E0323: 0x1E46, - 0x006E0323: 0x1E47, - 0x004E0331: 0x1E48, - 0x006E0331: 0x1E49, - 0x004E032D: 0x1E4A, - 0x006E032D: 0x1E4B, - 0x00D50301: 0x1E4C, - 0x00F50301: 0x1E4D, - 0x00D50308: 0x1E4E, - 0x00F50308: 0x1E4F, - 0x014C0300: 0x1E50, - 0x014D0300: 0x1E51, - 0x014C0301: 0x1E52, - 0x014D0301: 0x1E53, - 0x00500301: 0x1E54, - 0x00700301: 0x1E55, - 0x00500307: 0x1E56, - 0x00700307: 0x1E57, - 0x00520307: 0x1E58, - 0x00720307: 0x1E59, - 0x00520323: 0x1E5A, - 0x00720323: 0x1E5B, - 0x1E5A0304: 0x1E5C, - 0x1E5B0304: 0x1E5D, - 0x00520331: 0x1E5E, - 0x00720331: 0x1E5F, - 0x00530307: 0x1E60, - 0x00730307: 0x1E61, - 0x00530323: 0x1E62, - 0x00730323: 0x1E63, - 0x015A0307: 0x1E64, - 0x015B0307: 0x1E65, - 0x01600307: 0x1E66, - 0x01610307: 0x1E67, - 0x1E620307: 0x1E68, - 0x1E630307: 0x1E69, - 0x00540307: 0x1E6A, - 0x00740307: 0x1E6B, - 0x00540323: 0x1E6C, - 0x00740323: 0x1E6D, - 0x00540331: 0x1E6E, - 0x00740331: 0x1E6F, - 0x0054032D: 0x1E70, - 0x0074032D: 0x1E71, - 0x00550324: 0x1E72, - 0x00750324: 0x1E73, - 0x00550330: 0x1E74, - 0x00750330: 0x1E75, - 0x0055032D: 0x1E76, - 0x0075032D: 0x1E77, - 0x01680301: 0x1E78, - 0x01690301: 0x1E79, - 0x016A0308: 0x1E7A, - 0x016B0308: 0x1E7B, - 0x00560303: 0x1E7C, - 0x00760303: 0x1E7D, - 0x00560323: 0x1E7E, - 0x00760323: 0x1E7F, - 0x00570300: 0x1E80, - 0x00770300: 0x1E81, - 0x00570301: 0x1E82, - 0x00770301: 0x1E83, - 0x00570308: 0x1E84, - 0x00770308: 0x1E85, - 0x00570307: 0x1E86, - 0x00770307: 0x1E87, - 0x00570323: 0x1E88, - 0x00770323: 0x1E89, - 0x00580307: 0x1E8A, - 0x00780307: 0x1E8B, - 0x00580308: 0x1E8C, - 0x00780308: 0x1E8D, - 0x00590307: 0x1E8E, - 0x00790307: 0x1E8F, - 0x005A0302: 0x1E90, - 0x007A0302: 0x1E91, - 0x005A0323: 0x1E92, - 0x007A0323: 0x1E93, - 0x005A0331: 0x1E94, - 0x007A0331: 0x1E95, - 0x00680331: 0x1E96, - 0x00740308: 0x1E97, - 0x0077030A: 0x1E98, - 0x0079030A: 0x1E99, - 0x017F0307: 0x1E9B, - 0x00410323: 0x1EA0, - 0x00610323: 0x1EA1, - 0x00410309: 0x1EA2, - 0x00610309: 0x1EA3, - 0x00C20301: 0x1EA4, - 0x00E20301: 0x1EA5, - 0x00C20300: 0x1EA6, - 0x00E20300: 0x1EA7, - 0x00C20309: 0x1EA8, - 0x00E20309: 0x1EA9, - 0x00C20303: 0x1EAA, - 0x00E20303: 0x1EAB, - 0x1EA00302: 0x1EAC, - 0x1EA10302: 0x1EAD, - 0x01020301: 0x1EAE, - 0x01030301: 0x1EAF, - 0x01020300: 0x1EB0, - 0x01030300: 0x1EB1, - 0x01020309: 0x1EB2, - 0x01030309: 0x1EB3, - 0x01020303: 0x1EB4, - 0x01030303: 0x1EB5, - 0x1EA00306: 0x1EB6, - 0x1EA10306: 0x1EB7, - 0x00450323: 0x1EB8, - 0x00650323: 0x1EB9, - 0x00450309: 0x1EBA, - 0x00650309: 0x1EBB, - 0x00450303: 0x1EBC, - 0x00650303: 0x1EBD, - 0x00CA0301: 0x1EBE, - 0x00EA0301: 0x1EBF, - 0x00CA0300: 0x1EC0, - 0x00EA0300: 0x1EC1, - 0x00CA0309: 0x1EC2, - 0x00EA0309: 0x1EC3, - 0x00CA0303: 0x1EC4, - 0x00EA0303: 0x1EC5, - 0x1EB80302: 0x1EC6, - 0x1EB90302: 0x1EC7, - 0x00490309: 0x1EC8, - 0x00690309: 0x1EC9, - 0x00490323: 0x1ECA, - 0x00690323: 0x1ECB, - 0x004F0323: 0x1ECC, - 0x006F0323: 0x1ECD, - 0x004F0309: 0x1ECE, - 0x006F0309: 0x1ECF, - 0x00D40301: 0x1ED0, - 0x00F40301: 0x1ED1, - 0x00D40300: 0x1ED2, - 0x00F40300: 0x1ED3, - 0x00D40309: 0x1ED4, - 0x00F40309: 0x1ED5, - 0x00D40303: 0x1ED6, - 0x00F40303: 0x1ED7, - 0x1ECC0302: 0x1ED8, - 0x1ECD0302: 0x1ED9, - 0x01A00301: 0x1EDA, - 0x01A10301: 0x1EDB, - 0x01A00300: 0x1EDC, - 0x01A10300: 0x1EDD, - 0x01A00309: 0x1EDE, - 0x01A10309: 0x1EDF, - 0x01A00303: 0x1EE0, - 0x01A10303: 0x1EE1, - 0x01A00323: 0x1EE2, - 0x01A10323: 0x1EE3, - 0x00550323: 0x1EE4, - 0x00750323: 0x1EE5, - 0x00550309: 0x1EE6, - 0x00750309: 0x1EE7, - 0x01AF0301: 0x1EE8, - 0x01B00301: 0x1EE9, - 0x01AF0300: 0x1EEA, - 0x01B00300: 0x1EEB, - 0x01AF0309: 0x1EEC, - 0x01B00309: 0x1EED, - 0x01AF0303: 0x1EEE, - 0x01B00303: 0x1EEF, - 0x01AF0323: 0x1EF0, - 0x01B00323: 0x1EF1, - 0x00590300: 0x1EF2, - 0x00790300: 0x1EF3, - 0x00590323: 0x1EF4, - 0x00790323: 0x1EF5, - 0x00590309: 0x1EF6, - 0x00790309: 0x1EF7, - 0x00590303: 0x1EF8, - 0x00790303: 0x1EF9, - 0x03B10313: 0x1F00, - 0x03B10314: 0x1F01, - 0x1F000300: 0x1F02, - 0x1F010300: 0x1F03, - 0x1F000301: 0x1F04, - 0x1F010301: 0x1F05, - 0x1F000342: 0x1F06, - 0x1F010342: 0x1F07, - 0x03910313: 0x1F08, - 0x03910314: 0x1F09, - 0x1F080300: 0x1F0A, - 0x1F090300: 0x1F0B, - 0x1F080301: 0x1F0C, - 0x1F090301: 0x1F0D, - 0x1F080342: 0x1F0E, - 0x1F090342: 0x1F0F, - 0x03B50313: 0x1F10, - 0x03B50314: 0x1F11, - 0x1F100300: 0x1F12, - 0x1F110300: 0x1F13, - 0x1F100301: 0x1F14, - 0x1F110301: 0x1F15, - 0x03950313: 0x1F18, - 0x03950314: 0x1F19, - 0x1F180300: 0x1F1A, - 0x1F190300: 0x1F1B, - 0x1F180301: 0x1F1C, - 0x1F190301: 0x1F1D, - 0x03B70313: 0x1F20, - 0x03B70314: 0x1F21, - 0x1F200300: 0x1F22, - 0x1F210300: 0x1F23, - 0x1F200301: 0x1F24, - 0x1F210301: 0x1F25, - 0x1F200342: 0x1F26, - 0x1F210342: 0x1F27, - 0x03970313: 0x1F28, - 0x03970314: 0x1F29, - 0x1F280300: 0x1F2A, - 0x1F290300: 0x1F2B, - 0x1F280301: 0x1F2C, - 0x1F290301: 0x1F2D, - 0x1F280342: 0x1F2E, - 0x1F290342: 0x1F2F, - 0x03B90313: 0x1F30, - 0x03B90314: 0x1F31, - 0x1F300300: 0x1F32, - 0x1F310300: 0x1F33, - 0x1F300301: 0x1F34, - 0x1F310301: 0x1F35, - 0x1F300342: 0x1F36, - 0x1F310342: 0x1F37, - 0x03990313: 0x1F38, - 0x03990314: 0x1F39, - 0x1F380300: 0x1F3A, - 0x1F390300: 0x1F3B, - 0x1F380301: 0x1F3C, - 0x1F390301: 0x1F3D, - 0x1F380342: 0x1F3E, - 0x1F390342: 0x1F3F, - 0x03BF0313: 0x1F40, - 0x03BF0314: 0x1F41, - 0x1F400300: 0x1F42, - 0x1F410300: 0x1F43, - 0x1F400301: 0x1F44, - 0x1F410301: 0x1F45, - 0x039F0313: 0x1F48, - 0x039F0314: 0x1F49, - 0x1F480300: 0x1F4A, - 0x1F490300: 0x1F4B, - 0x1F480301: 0x1F4C, - 0x1F490301: 0x1F4D, - 0x03C50313: 0x1F50, - 0x03C50314: 0x1F51, - 0x1F500300: 0x1F52, - 0x1F510300: 0x1F53, - 0x1F500301: 0x1F54, - 0x1F510301: 0x1F55, - 0x1F500342: 0x1F56, - 0x1F510342: 0x1F57, - 0x03A50314: 0x1F59, - 0x1F590300: 0x1F5B, - 0x1F590301: 0x1F5D, - 0x1F590342: 0x1F5F, - 0x03C90313: 0x1F60, - 0x03C90314: 0x1F61, - 0x1F600300: 0x1F62, - 0x1F610300: 0x1F63, - 0x1F600301: 0x1F64, - 0x1F610301: 0x1F65, - 0x1F600342: 0x1F66, - 0x1F610342: 0x1F67, - 0x03A90313: 0x1F68, - 0x03A90314: 0x1F69, - 0x1F680300: 0x1F6A, - 0x1F690300: 0x1F6B, - 0x1F680301: 0x1F6C, - 0x1F690301: 0x1F6D, - 0x1F680342: 0x1F6E, - 0x1F690342: 0x1F6F, - 0x03B10300: 0x1F70, - 0x03B50300: 0x1F72, - 0x03B70300: 0x1F74, - 0x03B90300: 0x1F76, - 0x03BF0300: 0x1F78, - 0x03C50300: 0x1F7A, - 0x03C90300: 0x1F7C, - 0x1F000345: 0x1F80, - 0x1F010345: 0x1F81, - 0x1F020345: 0x1F82, - 0x1F030345: 0x1F83, - 0x1F040345: 0x1F84, - 0x1F050345: 0x1F85, - 0x1F060345: 0x1F86, - 0x1F070345: 0x1F87, - 0x1F080345: 0x1F88, - 0x1F090345: 0x1F89, - 0x1F0A0345: 0x1F8A, - 0x1F0B0345: 0x1F8B, - 0x1F0C0345: 0x1F8C, - 0x1F0D0345: 0x1F8D, - 0x1F0E0345: 0x1F8E, - 0x1F0F0345: 0x1F8F, - 0x1F200345: 0x1F90, - 0x1F210345: 0x1F91, - 0x1F220345: 0x1F92, - 0x1F230345: 0x1F93, - 0x1F240345: 0x1F94, - 0x1F250345: 0x1F95, - 0x1F260345: 0x1F96, - 0x1F270345: 0x1F97, - 0x1F280345: 0x1F98, - 0x1F290345: 0x1F99, - 0x1F2A0345: 0x1F9A, - 0x1F2B0345: 0x1F9B, - 0x1F2C0345: 0x1F9C, - 0x1F2D0345: 0x1F9D, - 0x1F2E0345: 0x1F9E, - 0x1F2F0345: 0x1F9F, - 0x1F600345: 0x1FA0, - 0x1F610345: 0x1FA1, - 0x1F620345: 0x1FA2, - 0x1F630345: 0x1FA3, - 0x1F640345: 0x1FA4, - 0x1F650345: 0x1FA5, - 0x1F660345: 0x1FA6, - 0x1F670345: 0x1FA7, - 0x1F680345: 0x1FA8, - 0x1F690345: 0x1FA9, - 0x1F6A0345: 0x1FAA, - 0x1F6B0345: 0x1FAB, - 0x1F6C0345: 0x1FAC, - 0x1F6D0345: 0x1FAD, - 0x1F6E0345: 0x1FAE, - 0x1F6F0345: 0x1FAF, - 0x03B10306: 0x1FB0, - 0x03B10304: 0x1FB1, - 0x1F700345: 0x1FB2, - 0x03B10345: 0x1FB3, - 0x03AC0345: 0x1FB4, - 0x03B10342: 0x1FB6, - 0x1FB60345: 0x1FB7, - 0x03910306: 0x1FB8, - 0x03910304: 0x1FB9, - 0x03910300: 0x1FBA, - 0x03910345: 0x1FBC, - 0x00A80342: 0x1FC1, - 0x1F740345: 0x1FC2, - 0x03B70345: 0x1FC3, - 0x03AE0345: 0x1FC4, - 0x03B70342: 0x1FC6, - 0x1FC60345: 0x1FC7, - 0x03950300: 0x1FC8, - 0x03970300: 0x1FCA, - 0x03970345: 0x1FCC, - 0x1FBF0300: 0x1FCD, - 0x1FBF0301: 0x1FCE, - 0x1FBF0342: 0x1FCF, - 0x03B90306: 0x1FD0, - 0x03B90304: 0x1FD1, - 0x03CA0300: 0x1FD2, - 0x03B90342: 0x1FD6, - 0x03CA0342: 0x1FD7, - 0x03990306: 0x1FD8, - 0x03990304: 0x1FD9, - 0x03990300: 0x1FDA, - 0x1FFE0300: 0x1FDD, - 0x1FFE0301: 0x1FDE, - 0x1FFE0342: 0x1FDF, - 0x03C50306: 0x1FE0, - 0x03C50304: 0x1FE1, - 0x03CB0300: 0x1FE2, - 0x03C10313: 0x1FE4, - 0x03C10314: 0x1FE5, - 0x03C50342: 0x1FE6, - 0x03CB0342: 0x1FE7, - 0x03A50306: 0x1FE8, - 0x03A50304: 0x1FE9, - 0x03A50300: 0x1FEA, - 0x03A10314: 0x1FEC, - 0x00A80300: 0x1FED, - 0x1F7C0345: 0x1FF2, - 0x03C90345: 0x1FF3, - 0x03CE0345: 0x1FF4, - 0x03C90342: 0x1FF6, - 0x1FF60345: 0x1FF7, - 0x039F0300: 0x1FF8, - 0x03A90300: 0x1FFA, - 0x03A90345: 0x1FFC, - 0x21900338: 0x219A, - 0x21920338: 0x219B, - 0x21940338: 0x21AE, - 0x21D00338: 0x21CD, - 0x21D40338: 0x21CE, - 0x21D20338: 0x21CF, - 0x22030338: 0x2204, - 0x22080338: 0x2209, - 0x220B0338: 0x220C, - 0x22230338: 0x2224, - 0x22250338: 0x2226, - 0x223C0338: 0x2241, - 0x22430338: 0x2244, - 0x22450338: 0x2247, - 0x22480338: 0x2249, - 0x003D0338: 0x2260, - 0x22610338: 0x2262, - 0x224D0338: 0x226D, - 0x003C0338: 0x226E, - 0x003E0338: 0x226F, - 0x22640338: 0x2270, - 0x22650338: 0x2271, - 0x22720338: 0x2274, - 0x22730338: 0x2275, - 0x22760338: 0x2278, - 0x22770338: 0x2279, - 0x227A0338: 0x2280, - 0x227B0338: 0x2281, - 0x22820338: 0x2284, - 0x22830338: 0x2285, - 0x22860338: 0x2288, - 0x22870338: 0x2289, - 0x22A20338: 0x22AC, - 0x22A80338: 0x22AD, - 0x22A90338: 0x22AE, - 0x22AB0338: 0x22AF, - 0x227C0338: 0x22E0, - 0x227D0338: 0x22E1, - 0x22910338: 0x22E2, - 0x22920338: 0x22E3, - 0x22B20338: 0x22EA, - 0x22B30338: 0x22EB, - 0x22B40338: 0x22EC, - 0x22B50338: 0x22ED, - 0x304B3099: 0x304C, - 0x304D3099: 0x304E, - 0x304F3099: 0x3050, - 0x30513099: 0x3052, - 0x30533099: 0x3054, - 0x30553099: 0x3056, - 0x30573099: 0x3058, - 0x30593099: 0x305A, - 0x305B3099: 0x305C, - 0x305D3099: 0x305E, - 0x305F3099: 0x3060, - 0x30613099: 0x3062, - 0x30643099: 0x3065, - 0x30663099: 0x3067, - 0x30683099: 0x3069, - 0x306F3099: 0x3070, - 0x306F309A: 0x3071, - 0x30723099: 0x3073, - 0x3072309A: 0x3074, - 0x30753099: 0x3076, - 0x3075309A: 0x3077, - 0x30783099: 0x3079, - 0x3078309A: 0x307A, - 0x307B3099: 0x307C, - 0x307B309A: 0x307D, - 0x30463099: 0x3094, - 0x309D3099: 0x309E, - 0x30AB3099: 0x30AC, - 0x30AD3099: 0x30AE, - 0x30AF3099: 0x30B0, - 0x30B13099: 0x30B2, - 0x30B33099: 0x30B4, - 0x30B53099: 0x30B6, - 0x30B73099: 0x30B8, - 0x30B93099: 0x30BA, - 0x30BB3099: 0x30BC, - 0x30BD3099: 0x30BE, - 0x30BF3099: 0x30C0, - 0x30C13099: 0x30C2, - 0x30C43099: 0x30C5, - 0x30C63099: 0x30C7, - 0x30C83099: 0x30C9, - 0x30CF3099: 0x30D0, - 0x30CF309A: 0x30D1, - 0x30D23099: 0x30D3, - 0x30D2309A: 0x30D4, - 0x30D53099: 0x30D6, - 0x30D5309A: 0x30D7, - 0x30D83099: 0x30D9, - 0x30D8309A: 0x30DA, - 0x30DB3099: 0x30DC, - 0x30DB309A: 0x30DD, - 0x30A63099: 0x30F4, - 0x30EF3099: 0x30F7, - 0x30F03099: 0x30F8, - 0x30F13099: 0x30F9, - 0x30F23099: 0x30FA, - 0x30FD3099: 0x30FE, - 0x109910BA: 0x1109A, - 0x109B10BA: 0x1109C, - 0x10A510BA: 0x110AB, - 0x11311127: 0x1112E, - 0x11321127: 0x1112F, - 0x1347133E: 0x1134B, - 0x13471357: 0x1134C, - 0x14B914BA: 0x114BB, - 0x14B914B0: 0x114BC, - 0x14B914BD: 0x114BE, - 0x15B815AF: 0x115BA, - 0x15B915AF: 0x115BB, -} - -// Total size of tables: 53KB (54006 bytes) diff --git a/vendor/golang.org/x/text/unicode/norm/transform.go b/vendor/golang.org/x/text/unicode/norm/transform.go deleted file mode 100644 index 8589067cd..000000000 --- a/vendor/golang.org/x/text/unicode/norm/transform.go +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package norm - -import ( - "unicode/utf8" - - "golang.org/x/text/transform" -) - -// Reset implements the Reset method of the transform.Transformer interface. -func (Form) Reset() {} - -// Transform implements the Transform method of the transform.Transformer -// interface. It may need to write segments of up to MaxSegmentSize at once. -// Users should either catch ErrShortDst and allow dst to grow or have dst be at -// least of size MaxTransformChunkSize to be guaranteed of progress. -func (f Form) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - n := 0 - // Cap the maximum number of src bytes to check. - b := src - eof := atEOF - if ns := len(dst); ns < len(b) { - err = transform.ErrShortDst - eof = false - b = b[:ns] - } - i, ok := formTable[f].quickSpan(inputBytes(b), n, len(b), eof) - n += copy(dst[n:], b[n:i]) - if !ok { - nDst, nSrc, err = f.transform(dst[n:], src[n:], atEOF) - return nDst + n, nSrc + n, err - } - if n < len(src) && !atEOF { - err = transform.ErrShortSrc - } - return n, n, err -} - -func flushTransform(rb *reorderBuffer) bool { - // Write out (must fully fit in dst, or else it is a ErrShortDst). - if len(rb.out) < rb.nrune*utf8.UTFMax { - return false - } - rb.out = rb.out[rb.flushCopy(rb.out):] - return true -} - -var errs = []error{nil, transform.ErrShortDst, transform.ErrShortSrc} - -// transform implements the transform.Transformer interface. It is only called -// when quickSpan does not pass for a given string. -func (f Form) transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - // TODO: get rid of reorderBuffer. See CL 23460044. - rb := reorderBuffer{} - rb.init(f, src) - for { - // Load segment into reorder buffer. - rb.setFlusher(dst[nDst:], flushTransform) - end := decomposeSegment(&rb, nSrc, atEOF) - if end < 0 { - return nDst, nSrc, errs[-end] - } - nDst = len(dst) - len(rb.out) - nSrc = end - - // Next quickSpan. - end = rb.nsrc - eof := atEOF - if n := nSrc + len(dst) - nDst; n < end { - err = transform.ErrShortDst - end = n - eof = false - } - end, ok := rb.f.quickSpan(rb.src, nSrc, end, eof) - n := copy(dst[nDst:], rb.src.bytes[nSrc:end]) - nSrc += n - nDst += n - if ok { - if n < rb.nsrc && !atEOF { - err = transform.ErrShortSrc - } - return nDst, nSrc, err - } - } -} diff --git a/vendor/golang.org/x/text/unicode/norm/trie.go b/vendor/golang.org/x/text/unicode/norm/trie.go deleted file mode 100644 index 423386bf4..000000000 --- a/vendor/golang.org/x/text/unicode/norm/trie.go +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package norm - -type valueRange struct { - value uint16 // header: value:stride - lo, hi byte // header: lo:n -} - -type sparseBlocks struct { - values []valueRange - offset []uint16 -} - -var nfcSparse = sparseBlocks{ - values: nfcSparseValues[:], - offset: nfcSparseOffset[:], -} - -var nfkcSparse = sparseBlocks{ - values: nfkcSparseValues[:], - offset: nfkcSparseOffset[:], -} - -var ( - nfcData = newNfcTrie(0) - nfkcData = newNfkcTrie(0) -) - -// lookupValue determines the type of block n and looks up the value for b. -// For n < t.cutoff, the block is a simple lookup table. Otherwise, the block -// is a list of ranges with an accompanying value. Given a matching range r, -// the value for b is by r.value + (b - r.lo) * stride. -func (t *sparseBlocks) lookup(n uint32, b byte) uint16 { - offset := t.offset[n] - header := t.values[offset] - lo := offset + 1 - hi := lo + uint16(header.lo) - for lo < hi { - m := lo + (hi-lo)/2 - r := t.values[m] - if r.lo <= b && b <= r.hi { - return r.value + uint16(b-r.lo)*header.value - } - if b < r.lo { - hi = m - } else { - lo = m + 1 - } - } - return 0 -} diff --git a/vendor/golang.org/x/text/unicode/norm/triegen.go b/vendor/golang.org/x/text/unicode/norm/triegen.go deleted file mode 100644 index 45d711900..000000000 --- a/vendor/golang.org/x/text/unicode/norm/triegen.go +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// Trie table generator. -// Used by make*tables tools to generate a go file with trie data structures -// for mapping UTF-8 to a 16-bit value. All but the last byte in a UTF-8 byte -// sequence are used to lookup offsets in the index table to be used for the -// next byte. The last byte is used to index into a table with 16-bit values. - -package main - -import ( - "fmt" - "io" -) - -const maxSparseEntries = 16 - -type normCompacter struct { - sparseBlocks [][]uint64 - sparseOffset []uint16 - sparseCount int - name string -} - -func mostFrequentStride(a []uint64) int { - counts := make(map[int]int) - var v int - for _, x := range a { - if stride := int(x) - v; v != 0 && stride >= 0 { - counts[stride]++ - } - v = int(x) - } - var maxs, maxc int - for stride, cnt := range counts { - if cnt > maxc || (cnt == maxc && stride < maxs) { - maxs, maxc = stride, cnt - } - } - return maxs -} - -func countSparseEntries(a []uint64) int { - stride := mostFrequentStride(a) - var v, count int - for _, tv := range a { - if int(tv)-v != stride { - if tv != 0 { - count++ - } - } - v = int(tv) - } - return count -} - -func (c *normCompacter) Size(v []uint64) (sz int, ok bool) { - if n := countSparseEntries(v); n <= maxSparseEntries { - return (n+1)*4 + 2, true - } - return 0, false -} - -func (c *normCompacter) Store(v []uint64) uint32 { - h := uint32(len(c.sparseOffset)) - c.sparseBlocks = append(c.sparseBlocks, v) - c.sparseOffset = append(c.sparseOffset, uint16(c.sparseCount)) - c.sparseCount += countSparseEntries(v) + 1 - return h -} - -func (c *normCompacter) Handler() string { - return c.name + "Sparse.lookup" -} - -func (c *normCompacter) Print(w io.Writer) (retErr error) { - p := func(f string, x ...interface{}) { - if _, err := fmt.Fprintf(w, f, x...); retErr == nil && err != nil { - retErr = err - } - } - - ls := len(c.sparseBlocks) - p("// %sSparseOffset: %d entries, %d bytes\n", c.name, ls, ls*2) - p("var %sSparseOffset = %#v\n\n", c.name, c.sparseOffset) - - ns := c.sparseCount - p("// %sSparseValues: %d entries, %d bytes\n", c.name, ns, ns*4) - p("var %sSparseValues = [%d]valueRange {", c.name, ns) - for i, b := range c.sparseBlocks { - p("\n// Block %#x, offset %#x", i, c.sparseOffset[i]) - var v int - stride := mostFrequentStride(b) - n := countSparseEntries(b) - p("\n{value:%#04x,lo:%#02x},", stride, uint8(n)) - for i, nv := range b { - if int(nv)-v != stride { - if v != 0 { - p(",hi:%#02x},", 0x80+i-1) - } - if nv != 0 { - p("\n{value:%#04x,lo:%#02x", nv, 0x80+i) - } - } - v = int(nv) - } - if v != 0 { - p(",hi:%#02x},", 0x80+len(b)-1) - } - } - p("\n}\n\n") - return -} diff --git a/vendor/google.golang.org/genproto/LICENSE b/vendor/google.golang.org/genproto/LICENSE deleted file mode 100644 index d64569567..000000000 --- a/vendor/google.golang.org/genproto/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/google.golang.org/genproto/googleapis/rpc/status/status.pb.go b/vendor/google.golang.org/genproto/googleapis/rpc/status/status.pb.go deleted file mode 100644 index ec26060bc..000000000 --- a/vendor/google.golang.org/genproto/googleapis/rpc/status/status.pb.go +++ /dev/null @@ -1,144 +0,0 @@ -// Code generated by protoc-gen-go. -// source: google/rpc/status.proto -// DO NOT EDIT! - -/* -Package status is a generated protocol buffer package. - -It is generated from these files: - google/rpc/status.proto - -It has these top-level messages: - Status -*/ -package status - -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" -import google_protobuf "github.com/golang/protobuf/ptypes/any" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package - -// The `Status` type defines a logical error model that is suitable for different -// programming environments, including REST APIs and RPC APIs. It is used by -// [gRPC](https://github.com/grpc). The error model is designed to be: -// -// - Simple to use and understand for most users -// - Flexible enough to meet unexpected needs -// -// # Overview -// -// The `Status` message contains three pieces of data: error code, error message, -// and error details. The error code should be an enum value of -// [google.rpc.Code][google.rpc.Code], but it may accept additional error codes if needed. The -// error message should be a developer-facing English message that helps -// developers *understand* and *resolve* the error. If a localized user-facing -// error message is needed, put the localized message in the error details or -// localize it in the client. The optional error details may contain arbitrary -// information about the error. There is a predefined set of error detail types -// in the package `google.rpc` which can be used for common error conditions. -// -// # Language mapping -// -// The `Status` message is the logical representation of the error model, but it -// is not necessarily the actual wire format. When the `Status` message is -// exposed in different client libraries and different wire protocols, it can be -// mapped differently. For example, it will likely be mapped to some exceptions -// in Java, but more likely mapped to some error codes in C. -// -// # Other uses -// -// The error model and the `Status` message can be used in a variety of -// environments, either with or without APIs, to provide a -// consistent developer experience across different environments. -// -// Example uses of this error model include: -// -// - Partial errors. If a service needs to return partial errors to the client, -// it may embed the `Status` in the normal response to indicate the partial -// errors. -// -// - Workflow errors. A typical workflow has multiple steps. Each step may -// have a `Status` message for error reporting purpose. -// -// - Batch operations. If a client uses batch request and batch response, the -// `Status` message should be used directly inside batch response, one for -// each error sub-response. -// -// - Asynchronous operations. If an API call embeds asynchronous operation -// results in its response, the status of those operations should be -// represented directly using the `Status` message. -// -// - Logging. If some API errors are stored in logs, the message `Status` could -// be used directly after any stripping needed for security/privacy reasons. -type Status struct { - // The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code]. - Code int32 `protobuf:"varint,1,opt,name=code" json:"code,omitempty"` - // A developer-facing error message, which should be in English. Any - // user-facing error message should be localized and sent in the - // [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client. - Message string `protobuf:"bytes,2,opt,name=message" json:"message,omitempty"` - // A list of messages that carry the error details. There will be a - // common set of message types for APIs to use. - Details []*google_protobuf.Any `protobuf:"bytes,3,rep,name=details" json:"details,omitempty"` -} - -func (m *Status) Reset() { *m = Status{} } -func (m *Status) String() string { return proto.CompactTextString(m) } -func (*Status) ProtoMessage() {} -func (*Status) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } - -func (m *Status) GetCode() int32 { - if m != nil { - return m.Code - } - return 0 -} - -func (m *Status) GetMessage() string { - if m != nil { - return m.Message - } - return "" -} - -func (m *Status) GetDetails() []*google_protobuf.Any { - if m != nil { - return m.Details - } - return nil -} - -func init() { - proto.RegisterType((*Status)(nil), "google.rpc.Status") -} - -func init() { proto.RegisterFile("google/rpc/status.proto", fileDescriptor0) } - -var fileDescriptor0 = []byte{ - // 209 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x4f, 0xcf, 0xcf, 0x4f, - 0xcf, 0x49, 0xd5, 0x2f, 0x2a, 0x48, 0xd6, 0x2f, 0x2e, 0x49, 0x2c, 0x29, 0x2d, 0xd6, 0x2b, 0x28, - 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x82, 0x48, 0xe8, 0x15, 0x15, 0x24, 0x4b, 0x49, 0x42, 0x15, 0x81, - 0x65, 0x92, 0x4a, 0xd3, 0xf4, 0x13, 0xf3, 0x2a, 0x21, 0xca, 0x94, 0xd2, 0xb8, 0xd8, 0x82, 0xc1, - 0xda, 0x84, 0x84, 0xb8, 0x58, 0x92, 0xf3, 0x53, 0x52, 0x25, 0x18, 0x15, 0x18, 0x35, 0x58, 0x83, - 0xc0, 0x6c, 0x21, 0x09, 0x2e, 0xf6, 0xdc, 0xd4, 0xe2, 0xe2, 0xc4, 0xf4, 0x54, 0x09, 0x26, 0x05, - 0x46, 0x0d, 0xce, 0x20, 0x18, 0x57, 0x48, 0x8f, 0x8b, 0x3d, 0x25, 0xb5, 0x24, 0x31, 0x33, 0xa7, - 0x58, 0x82, 0x59, 0x81, 0x59, 0x83, 0xdb, 0x48, 0x44, 0x0f, 0x6a, 0x21, 0xcc, 0x12, 0x3d, 0xc7, - 0xbc, 0xca, 0x20, 0x98, 0x22, 0xa7, 0x38, 0x2e, 0xbe, 0xe4, 0xfc, 0x5c, 0x3d, 0x84, 0xa3, 0x9c, - 0xb8, 0x21, 0xf6, 0x06, 0x80, 0x94, 0x07, 0x30, 0x46, 0x99, 0x43, 0xa5, 0xd2, 0xf3, 0x73, 0x12, - 0xf3, 0xd2, 0xf5, 0xf2, 0x8b, 0xd2, 0xf5, 0xd3, 0x53, 0xf3, 0xc0, 0x86, 0xe9, 0x43, 0xa4, 0x12, - 0x0b, 0x32, 0x8b, 0x91, 0xfc, 0x69, 0x0d, 0xa1, 0x16, 0x31, 0x31, 0x07, 0x05, 0x38, 0x27, 0xb1, - 0x81, 0x55, 0x1a, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0xa4, 0x53, 0xf0, 0x7c, 0x10, 0x01, 0x00, - 0x00, -} diff --git a/vendor/google.golang.org/grpc/CONTRIBUTING.md b/vendor/google.golang.org/grpc/CONTRIBUTING.md deleted file mode 100644 index 36cd6f758..000000000 --- a/vendor/google.golang.org/grpc/CONTRIBUTING.md +++ /dev/null @@ -1,46 +0,0 @@ -# How to contribute - -We definitely welcome patches and contribution to grpc! Here are some guidelines -and information about how to do so. - -## Sending patches - -### Getting started - -1. Check out the code: - - $ go get google.golang.org/grpc - $ cd $GOPATH/src/google.golang.org/grpc - -1. Create a fork of the grpc-go repository. -1. Add your fork as a remote: - - $ git remote add fork git@github.com:$YOURGITHUBUSERNAME/grpc-go.git - -1. Make changes, commit them. -1. Run the test suite: - - $ make test - -1. Push your changes to your fork: - - $ git push fork ... - -1. Open a pull request. - -## Legal requirements - -In order to protect both you and ourselves, you will need to sign the -[Contributor License Agreement](https://cla.developers.google.com/clas). - -## Filing Issues -When filing an issue, make sure to answer these five questions: - -1. What version of Go are you using (`go version`)? -2. What operating system and processor architecture are you using? -3. What did you do? -4. What did you expect to see? -5. What did you see instead? - -### Contributing code -Unless otherwise noted, the Go source files are distributed under the BSD-style license found in the LICENSE file. diff --git a/vendor/google.golang.org/grpc/LICENSE b/vendor/google.golang.org/grpc/LICENSE deleted file mode 100644 index f4988b450..000000000 --- a/vendor/google.golang.org/grpc/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -Copyright 2014, Google Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * 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. - * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT -OWNER 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. diff --git a/vendor/google.golang.org/grpc/Makefile b/vendor/google.golang.org/grpc/Makefile deleted file mode 100644 index 03bb01f0b..000000000 --- a/vendor/google.golang.org/grpc/Makefile +++ /dev/null @@ -1,52 +0,0 @@ -all: test testrace - -deps: - go get -d -v google.golang.org/grpc/... - -updatedeps: - go get -d -v -u -f google.golang.org/grpc/... - -testdeps: - go get -d -v -t google.golang.org/grpc/... - -updatetestdeps: - go get -d -v -t -u -f google.golang.org/grpc/... - -build: deps - go build google.golang.org/grpc/... - -proto: - @ if ! which protoc > /dev/null; then \ - echo "error: protoc not installed" >&2; \ - exit 1; \ - fi - go get -u -v github.com/golang/protobuf/protoc-gen-go - # use $$dir as the root for all proto files in the same directory - for dir in $$(git ls-files '*.proto' | xargs -n1 dirname | uniq); do \ - protoc -I $$dir --go_out=plugins=grpc:$$dir $$dir/*.proto; \ - done - -test: testdeps - go test -v -cpu 1,4 google.golang.org/grpc/... - -testrace: testdeps - go test -v -race -cpu 1,4 google.golang.org/grpc/... - -clean: - go clean -i google.golang.org/grpc/... - -coverage: testdeps - ./coverage.sh --coveralls - -.PHONY: \ - all \ - deps \ - updatedeps \ - testdeps \ - updatetestdeps \ - build \ - proto \ - test \ - testrace \ - clean \ - coverage diff --git a/vendor/google.golang.org/grpc/PATENTS b/vendor/google.golang.org/grpc/PATENTS deleted file mode 100644 index 69b47959f..000000000 --- a/vendor/google.golang.org/grpc/PATENTS +++ /dev/null @@ -1,22 +0,0 @@ -Additional IP Rights Grant (Patents) - -"This implementation" means the copyrightable works distributed by -Google as part of the gRPC project. - -Google hereby grants to You a perpetual, worldwide, non-exclusive, -no-charge, royalty-free, irrevocable (except as stated in this section) -patent license to make, have made, use, offer to sell, sell, import, -transfer and otherwise run, modify and propagate the contents of this -implementation of gRPC, where such license applies only to those patent -claims, both currently owned or controlled by Google and acquired in -the future, licensable by Google that are necessarily infringed by this -implementation of gRPC. This grant does not include claims that would be -infringed only as a consequence of further modification of this -implementation. If you or your agent or exclusive licensee institute or -order or agree to the institution of patent litigation against any -entity (including a cross-claim or counterclaim in a lawsuit) alleging -that this implementation of gRPC or any code incorporated within this -implementation of gRPC constitutes direct or contributory patent -infringement, or inducement of patent infringement, then any patent -rights granted to you under this License for this implementation of gRPC -shall terminate as of the date such litigation is filed. diff --git a/vendor/google.golang.org/grpc/README.md b/vendor/google.golang.org/grpc/README.md deleted file mode 100644 index c1e43c77b..000000000 --- a/vendor/google.golang.org/grpc/README.md +++ /dev/null @@ -1,45 +0,0 @@ -# gRPC-Go - -[![Build Status](https://travis-ci.org/grpc/grpc-go.svg)](https://travis-ci.org/grpc/grpc-go) [![GoDoc](https://godoc.org/google.golang.org/grpc?status.svg)](https://godoc.org/google.golang.org/grpc) - -The Go implementation of [gRPC](http://www.grpc.io/): A high performance, open source, general RPC framework that puts mobile and HTTP/2 first. For more information see the [gRPC Quick Start](http://www.grpc.io/docs/) guide. - -Installation ------------- - -To install this package, you need to install Go and setup your Go workspace on your computer. The simplest way to install the library is to run: - -``` -$ go get google.golang.org/grpc -``` - -Prerequisites -------------- - -This requires Go 1.6 or later. - -Constraints ------------ -The grpc package should only depend on standard Go packages and a small number of exceptions. If your contribution introduces new dependencies which are NOT in the [list](http://godoc.org/google.golang.org/grpc?imports), you need a discussion with gRPC-Go authors and consultants. - -Documentation -------------- -See [API documentation](https://godoc.org/google.golang.org/grpc) for package and API descriptions and find examples in the [examples directory](examples/). - -Performance ------------ -See the current benchmarks for some of the languages supported in [this dashboard](https://performance-dot-grpc-testing.appspot.com/explore?dashboard=5652536396611584&widget=490377658&container=1286539696). - -Status ------- -General Availability [Google Cloud Platform Launch Stages](https://cloud.google.com/terms/launch-stages). - -FAQ ---- - -#### Compiling error, undefined: grpc.SupportPackageIsVersion - -Please update proto package, gRPC package and rebuild the proto files: - - `go get -u github.com/golang/protobuf/{proto,protoc-gen-go}` - - `go get -u google.golang.org/grpc` - - `protoc --go_out=plugins=grpc:. *.proto` diff --git a/vendor/google.golang.org/grpc/backoff.go b/vendor/google.golang.org/grpc/backoff.go deleted file mode 100644 index c99024ee3..000000000 --- a/vendor/google.golang.org/grpc/backoff.go +++ /dev/null @@ -1,80 +0,0 @@ -package grpc - -import ( - "math/rand" - "time" -) - -// DefaultBackoffConfig uses values specified for backoff in -// https://github.com/grpc/grpc/blob/master/doc/connection-backoff.md. -var ( - DefaultBackoffConfig = BackoffConfig{ - MaxDelay: 120 * time.Second, - baseDelay: 1.0 * time.Second, - factor: 1.6, - jitter: 0.2, - } -) - -// backoffStrategy defines the methodology for backing off after a grpc -// connection failure. -// -// This is unexported until the gRPC project decides whether or not to allow -// alternative backoff strategies. Once a decision is made, this type and its -// method may be exported. -type backoffStrategy interface { - // backoff returns the amount of time to wait before the next retry given - // the number of consecutive failures. - backoff(retries int) time.Duration -} - -// BackoffConfig defines the parameters for the default gRPC backoff strategy. -type BackoffConfig struct { - // MaxDelay is the upper bound of backoff delay. - MaxDelay time.Duration - - // TODO(stevvooe): The following fields are not exported, as allowing - // changes would violate the current gRPC specification for backoff. If - // gRPC decides to allow more interesting backoff strategies, these fields - // may be opened up in the future. - - // baseDelay is the amount of time to wait before retrying after the first - // failure. - baseDelay time.Duration - - // factor is applied to the backoff after each retry. - factor float64 - - // jitter provides a range to randomize backoff delays. - jitter float64 -} - -func setDefaults(bc *BackoffConfig) { - md := bc.MaxDelay - *bc = DefaultBackoffConfig - - if md > 0 { - bc.MaxDelay = md - } -} - -func (bc BackoffConfig) backoff(retries int) time.Duration { - if retries == 0 { - return bc.baseDelay - } - backoff, max := float64(bc.baseDelay), float64(bc.MaxDelay) - for backoff < max && retries > 0 { - backoff *= bc.factor - retries-- - } - if backoff > max { - backoff = max - } - // Randomize backoff delays so that if a cluster of requests start at - // the same time, they won't operate in lockstep. - backoff *= 1 + bc.jitter*(rand.Float64()*2-1) - if backoff < 0 { - return 0 - } - return time.Duration(backoff) -} diff --git a/vendor/google.golang.org/grpc/balancer.go b/vendor/google.golang.org/grpc/balancer.go deleted file mode 100644 index 9af4ee70a..000000000 --- a/vendor/google.golang.org/grpc/balancer.go +++ /dev/null @@ -1,408 +0,0 @@ -/* - * - * Copyright 2016, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT - * OWNER 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. - * - */ - -package grpc - -import ( - "fmt" - "net" - "sync" - - "golang.org/x/net/context" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/credentials" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/naming" -) - -// Address represents a server the client connects to. -// This is the EXPERIMENTAL API and may be changed or extended in the future. -type Address struct { - // Addr is the server address on which a connection will be established. - Addr string - // Metadata is the information associated with Addr, which may be used - // to make load balancing decision. - Metadata interface{} -} - -// BalancerConfig specifies the configurations for Balancer. -type BalancerConfig struct { - // DialCreds is the transport credential the Balancer implementation can - // use to dial to a remote load balancer server. The Balancer implementations - // can ignore this if it does not need to talk to another party securely. - DialCreds credentials.TransportCredentials - // Dialer is the custom dialer the Balancer implementation can use to dial - // to a remote load balancer server. The Balancer implementations - // can ignore this if it doesn't need to talk to remote balancer. - Dialer func(context.Context, string) (net.Conn, error) -} - -// BalancerGetOptions configures a Get call. -// This is the EXPERIMENTAL API and may be changed or extended in the future. -type BalancerGetOptions struct { - // BlockingWait specifies whether Get should block when there is no - // connected address. - BlockingWait bool -} - -// Balancer chooses network addresses for RPCs. -// This is the EXPERIMENTAL API and may be changed or extended in the future. -type Balancer interface { - // Start does the initialization work to bootstrap a Balancer. For example, - // this function may start the name resolution and watch the updates. It will - // be called when dialing. - Start(target string, config BalancerConfig) error - // Up informs the Balancer that gRPC has a connection to the server at - // addr. It returns down which is called once the connection to addr gets - // lost or closed. - // TODO: It is not clear how to construct and take advantage of the meaningful error - // parameter for down. Need realistic demands to guide. - Up(addr Address) (down func(error)) - // Get gets the address of a server for the RPC corresponding to ctx. - // i) If it returns a connected address, gRPC internals issues the RPC on the - // connection to this address; - // ii) If it returns an address on which the connection is under construction - // (initiated by Notify(...)) but not connected, gRPC internals - // * fails RPC if the RPC is fail-fast and connection is in the TransientFailure or - // Shutdown state; - // or - // * issues RPC on the connection otherwise. - // iii) If it returns an address on which the connection does not exist, gRPC - // internals treats it as an error and will fail the corresponding RPC. - // - // Therefore, the following is the recommended rule when writing a custom Balancer. - // If opts.BlockingWait is true, it should return a connected address or - // block if there is no connected address. It should respect the timeout or - // cancellation of ctx when blocking. If opts.BlockingWait is false (for fail-fast - // RPCs), it should return an address it has notified via Notify(...) immediately - // instead of blocking. - // - // The function returns put which is called once the rpc has completed or failed. - // put can collect and report RPC stats to a remote load balancer. - // - // This function should only return the errors Balancer cannot recover by itself. - // gRPC internals will fail the RPC if an error is returned. - Get(ctx context.Context, opts BalancerGetOptions) (addr Address, put func(), err error) - // Notify returns a channel that is used by gRPC internals to watch the addresses - // gRPC needs to connect. The addresses might be from a name resolver or remote - // load balancer. gRPC internals will compare it with the existing connected - // addresses. If the address Balancer notified is not in the existing connected - // addresses, gRPC starts to connect the address. If an address in the existing - // connected addresses is not in the notification list, the corresponding connection - // is shutdown gracefully. Otherwise, there are no operations to take. Note that - // the Address slice must be the full list of the Addresses which should be connected. - // It is NOT delta. - Notify() <-chan []Address - // Close shuts down the balancer. - Close() error -} - -// downErr implements net.Error. It is constructed by gRPC internals and passed to the down -// call of Balancer. -type downErr struct { - timeout bool - temporary bool - desc string -} - -func (e downErr) Error() string { return e.desc } -func (e downErr) Timeout() bool { return e.timeout } -func (e downErr) Temporary() bool { return e.temporary } - -func downErrorf(timeout, temporary bool, format string, a ...interface{}) downErr { - return downErr{ - timeout: timeout, - temporary: temporary, - desc: fmt.Sprintf(format, a...), - } -} - -// RoundRobin returns a Balancer that selects addresses round-robin. It uses r to watch -// the name resolution updates and updates the addresses available correspondingly. -func RoundRobin(r naming.Resolver) Balancer { - return &roundRobin{r: r} -} - -type addrInfo struct { - addr Address - connected bool -} - -type roundRobin struct { - r naming.Resolver - w naming.Watcher - addrs []*addrInfo // all the addresses the client should potentially connect - mu sync.Mutex - addrCh chan []Address // the channel to notify gRPC internals the list of addresses the client should connect to. - next int // index of the next address to return for Get() - waitCh chan struct{} // the channel to block when there is no connected address available - done bool // The Balancer is closed. -} - -func (rr *roundRobin) watchAddrUpdates() error { - updates, err := rr.w.Next() - if err != nil { - grpclog.Printf("grpc: the naming watcher stops working due to %v.\n", err) - return err - } - rr.mu.Lock() - defer rr.mu.Unlock() - for _, update := range updates { - addr := Address{ - Addr: update.Addr, - Metadata: update.Metadata, - } - switch update.Op { - case naming.Add: - var exist bool - for _, v := range rr.addrs { - if addr == v.addr { - exist = true - grpclog.Println("grpc: The name resolver wanted to add an existing address: ", addr) - break - } - } - if exist { - continue - } - rr.addrs = append(rr.addrs, &addrInfo{addr: addr}) - case naming.Delete: - for i, v := range rr.addrs { - if addr == v.addr { - copy(rr.addrs[i:], rr.addrs[i+1:]) - rr.addrs = rr.addrs[:len(rr.addrs)-1] - break - } - } - default: - grpclog.Println("Unknown update.Op ", update.Op) - } - } - // Make a copy of rr.addrs and write it onto rr.addrCh so that gRPC internals gets notified. - open := make([]Address, len(rr.addrs)) - for i, v := range rr.addrs { - open[i] = v.addr - } - if rr.done { - return ErrClientConnClosing - } - rr.addrCh <- open - return nil -} - -func (rr *roundRobin) Start(target string, config BalancerConfig) error { - rr.mu.Lock() - defer rr.mu.Unlock() - if rr.done { - return ErrClientConnClosing - } - if rr.r == nil { - // If there is no name resolver installed, it is not needed to - // do name resolution. In this case, target is added into rr.addrs - // as the only address available and rr.addrCh stays nil. - rr.addrs = append(rr.addrs, &addrInfo{addr: Address{Addr: target}}) - return nil - } - w, err := rr.r.Resolve(target) - if err != nil { - return err - } - rr.w = w - rr.addrCh = make(chan []Address) - go func() { - for { - if err := rr.watchAddrUpdates(); err != nil { - return - } - } - }() - return nil -} - -// Up sets the connected state of addr and sends notification if there are pending -// Get() calls. -func (rr *roundRobin) Up(addr Address) func(error) { - rr.mu.Lock() - defer rr.mu.Unlock() - var cnt int - for _, a := range rr.addrs { - if a.addr == addr { - if a.connected { - return nil - } - a.connected = true - } - if a.connected { - cnt++ - } - } - // addr is only one which is connected. Notify the Get() callers who are blocking. - if cnt == 1 && rr.waitCh != nil { - close(rr.waitCh) - rr.waitCh = nil - } - return func(err error) { - rr.down(addr, err) - } -} - -// down unsets the connected state of addr. -func (rr *roundRobin) down(addr Address, err error) { - rr.mu.Lock() - defer rr.mu.Unlock() - for _, a := range rr.addrs { - if addr == a.addr { - a.connected = false - break - } - } -} - -// Get returns the next addr in the rotation. -func (rr *roundRobin) Get(ctx context.Context, opts BalancerGetOptions) (addr Address, put func(), err error) { - var ch chan struct{} - rr.mu.Lock() - if rr.done { - rr.mu.Unlock() - err = ErrClientConnClosing - return - } - - if len(rr.addrs) > 0 { - if rr.next >= len(rr.addrs) { - rr.next = 0 - } - next := rr.next - for { - a := rr.addrs[next] - next = (next + 1) % len(rr.addrs) - if a.connected { - addr = a.addr - rr.next = next - rr.mu.Unlock() - return - } - if next == rr.next { - // Has iterated all the possible address but none is connected. - break - } - } - } - if !opts.BlockingWait { - if len(rr.addrs) == 0 { - rr.mu.Unlock() - err = Errorf(codes.Unavailable, "there is no address available") - return - } - // Returns the next addr on rr.addrs for failfast RPCs. - addr = rr.addrs[rr.next].addr - rr.next++ - rr.mu.Unlock() - return - } - // Wait on rr.waitCh for non-failfast RPCs. - if rr.waitCh == nil { - ch = make(chan struct{}) - rr.waitCh = ch - } else { - ch = rr.waitCh - } - rr.mu.Unlock() - for { - select { - case <-ctx.Done(): - err = ctx.Err() - return - case <-ch: - rr.mu.Lock() - if rr.done { - rr.mu.Unlock() - err = ErrClientConnClosing - return - } - - if len(rr.addrs) > 0 { - if rr.next >= len(rr.addrs) { - rr.next = 0 - } - next := rr.next - for { - a := rr.addrs[next] - next = (next + 1) % len(rr.addrs) - if a.connected { - addr = a.addr - rr.next = next - rr.mu.Unlock() - return - } - if next == rr.next { - // Has iterated all the possible address but none is connected. - break - } - } - } - // The newly added addr got removed by Down() again. - if rr.waitCh == nil { - ch = make(chan struct{}) - rr.waitCh = ch - } else { - ch = rr.waitCh - } - rr.mu.Unlock() - } - } -} - -func (rr *roundRobin) Notify() <-chan []Address { - return rr.addrCh -} - -func (rr *roundRobin) Close() error { - rr.mu.Lock() - defer rr.mu.Unlock() - if rr.done { - return errBalancerClosed - } - rr.done = true - if rr.w != nil { - rr.w.Close() - } - if rr.waitCh != nil { - close(rr.waitCh) - rr.waitCh = nil - } - if rr.addrCh != nil { - close(rr.addrCh) - } - return nil -} diff --git a/vendor/google.golang.org/grpc/call.go b/vendor/google.golang.org/grpc/call.go deleted file mode 100644 index a2b89ac6a..000000000 --- a/vendor/google.golang.org/grpc/call.go +++ /dev/null @@ -1,324 +0,0 @@ -/* - * - * Copyright 2014, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT - * OWNER 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. - * - */ - -package grpc - -import ( - "bytes" - "io" - "time" - - "golang.org/x/net/context" - "golang.org/x/net/trace" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/peer" - "google.golang.org/grpc/stats" - "google.golang.org/grpc/status" - "google.golang.org/grpc/transport" -) - -// recvResponse receives and parses an RPC response. -// On error, it returns the error and indicates whether the call should be retried. -// -// TODO(zhaoq): Check whether the received message sequence is valid. -// TODO ctx is used for stats collection and processing. It is the context passed from the application. -func recvResponse(ctx context.Context, dopts dialOptions, t transport.ClientTransport, c *callInfo, stream *transport.Stream, reply interface{}) (err error) { - // Try to acquire header metadata from the server if there is any. - defer func() { - if err != nil { - if _, ok := err.(transport.ConnectionError); !ok { - t.CloseStream(stream, err) - } - } - }() - c.headerMD, err = stream.Header() - if err != nil { - return - } - p := &parser{r: stream} - var inPayload *stats.InPayload - if dopts.copts.StatsHandler != nil { - inPayload = &stats.InPayload{ - Client: true, - } - } - for { - if c.maxReceiveMessageSize == nil { - return Errorf(codes.Internal, "callInfo maxReceiveMessageSize field uninitialized(nil)") - } - if err = recv(p, dopts.codec, stream, dopts.dc, reply, *c.maxReceiveMessageSize, inPayload); err != nil { - if err == io.EOF { - break - } - return - } - } - if inPayload != nil && err == io.EOF && stream.Status().Code() == codes.OK { - // TODO in the current implementation, inTrailer may be handled before inPayload in some cases. - // Fix the order if necessary. - dopts.copts.StatsHandler.HandleRPC(ctx, inPayload) - } - c.trailerMD = stream.Trailer() - if peer, ok := peer.FromContext(stream.Context()); ok { - c.peer = peer - } - return nil -} - -// sendRequest writes out various information of an RPC such as Context and Message. -func sendRequest(ctx context.Context, dopts dialOptions, compressor Compressor, c *callInfo, callHdr *transport.CallHdr, stream *transport.Stream, t transport.ClientTransport, args interface{}, opts *transport.Options) (err error) { - defer func() { - if err != nil { - // If err is connection error, t will be closed, no need to close stream here. - if _, ok := err.(transport.ConnectionError); !ok { - t.CloseStream(stream, err) - } - } - }() - var ( - cbuf *bytes.Buffer - outPayload *stats.OutPayload - ) - if compressor != nil { - cbuf = new(bytes.Buffer) - } - if dopts.copts.StatsHandler != nil { - outPayload = &stats.OutPayload{ - Client: true, - } - } - outBuf, err := encode(dopts.codec, args, compressor, cbuf, outPayload) - if err != nil { - return Errorf(codes.Internal, "grpc: %v", err) - } - if c.maxSendMessageSize == nil { - return Errorf(codes.Internal, "callInfo maxSendMessageSize field uninitialized(nil)") - } - if len(outBuf) > *c.maxSendMessageSize { - return Errorf(codes.ResourceExhausted, "grpc: trying to send message larger than max (%d vs. %d)", len(outBuf), *c.maxSendMessageSize) - } - err = t.Write(stream, outBuf, opts) - if err == nil && outPayload != nil { - outPayload.SentTime = time.Now() - dopts.copts.StatsHandler.HandleRPC(ctx, outPayload) - } - // t.NewStream(...) could lead to an early rejection of the RPC (e.g., the service/method - // does not exist.) so that t.Write could get io.EOF from wait(...). Leave the following - // recvResponse to get the final status. - if err != nil && err != io.EOF { - return err - } - // Sent successfully. - return nil -} - -// Invoke sends the RPC request on the wire and returns after response is received. -// Invoke is called by generated code. Also users can call Invoke directly when it -// is really needed in their use cases. -func Invoke(ctx context.Context, method string, args, reply interface{}, cc *ClientConn, opts ...CallOption) error { - if cc.dopts.unaryInt != nil { - return cc.dopts.unaryInt(ctx, method, args, reply, cc, invoke, opts...) - } - return invoke(ctx, method, args, reply, cc, opts...) -} - -func invoke(ctx context.Context, method string, args, reply interface{}, cc *ClientConn, opts ...CallOption) (e error) { - c := defaultCallInfo - mc := cc.GetMethodConfig(method) - if mc.WaitForReady != nil { - c.failFast = !*mc.WaitForReady - } - - if mc.Timeout != nil && *mc.Timeout >= 0 { - var cancel context.CancelFunc - ctx, cancel = context.WithTimeout(ctx, *mc.Timeout) - defer cancel() - } - - opts = append(cc.dopts.callOptions, opts...) - for _, o := range opts { - if err := o.before(&c); err != nil { - return toRPCErr(err) - } - } - defer func() { - for _, o := range opts { - o.after(&c) - } - }() - - c.maxSendMessageSize = getMaxSize(mc.MaxReqSize, c.maxSendMessageSize, defaultClientMaxSendMessageSize) - c.maxReceiveMessageSize = getMaxSize(mc.MaxRespSize, c.maxReceiveMessageSize, defaultClientMaxReceiveMessageSize) - - if EnableTracing { - c.traceInfo.tr = trace.New("grpc.Sent."+methodFamily(method), method) - defer c.traceInfo.tr.Finish() - c.traceInfo.firstLine.client = true - if deadline, ok := ctx.Deadline(); ok { - c.traceInfo.firstLine.deadline = deadline.Sub(time.Now()) - } - c.traceInfo.tr.LazyLog(&c.traceInfo.firstLine, false) - // TODO(dsymonds): Arrange for c.traceInfo.firstLine.remoteAddr to be set. - defer func() { - if e != nil { - c.traceInfo.tr.LazyLog(&fmtStringer{"%v", []interface{}{e}}, true) - c.traceInfo.tr.SetError() - } - }() - } - ctx = newContextWithRPCInfo(ctx) - sh := cc.dopts.copts.StatsHandler - if sh != nil { - ctx = sh.TagRPC(ctx, &stats.RPCTagInfo{FullMethodName: method, FailFast: c.failFast}) - begin := &stats.Begin{ - Client: true, - BeginTime: time.Now(), - FailFast: c.failFast, - } - sh.HandleRPC(ctx, begin) - defer func() { - end := &stats.End{ - Client: true, - EndTime: time.Now(), - Error: e, - } - sh.HandleRPC(ctx, end) - }() - } - topts := &transport.Options{ - Last: true, - Delay: false, - } - for { - var ( - err error - t transport.ClientTransport - stream *transport.Stream - // Record the put handler from Balancer.Get(...). It is called once the - // RPC has completed or failed. - put func() - ) - // TODO(zhaoq): Need a formal spec of fail-fast. - callHdr := &transport.CallHdr{ - Host: cc.authority, - Method: method, - } - if cc.dopts.cp != nil { - callHdr.SendCompress = cc.dopts.cp.Type() - } - if c.creds != nil { - callHdr.Creds = c.creds - } - - gopts := BalancerGetOptions{ - BlockingWait: !c.failFast, - } - t, put, err = cc.getTransport(ctx, gopts) - if err != nil { - // TODO(zhaoq): Probably revisit the error handling. - if _, ok := status.FromError(err); ok { - return err - } - if err == errConnClosing || err == errConnUnavailable { - if c.failFast { - return Errorf(codes.Unavailable, "%v", err) - } - continue - } - // All the other errors are treated as Internal errors. - return Errorf(codes.Internal, "%v", err) - } - if c.traceInfo.tr != nil { - c.traceInfo.tr.LazyLog(&payload{sent: true, msg: args}, true) - } - stream, err = t.NewStream(ctx, callHdr) - if err != nil { - if put != nil { - if _, ok := err.(transport.ConnectionError); ok { - // If error is connection error, transport was sending data on wire, - // and we are not sure if anything has been sent on wire. - // If error is not connection error, we are sure nothing has been sent. - updateRPCInfoInContext(ctx, rpcInfo{bytesSent: true, bytesReceived: false}) - } - put() - } - if _, ok := err.(transport.ConnectionError); (ok || err == transport.ErrStreamDrain) && !c.failFast { - continue - } - return toRPCErr(err) - } - err = sendRequest(ctx, cc.dopts, cc.dopts.cp, &c, callHdr, stream, t, args, topts) - if err != nil { - if put != nil { - updateRPCInfoInContext(ctx, rpcInfo{ - bytesSent: stream.BytesSent(), - bytesReceived: stream.BytesReceived(), - }) - put() - } - // Retry a non-failfast RPC when - // i) there is a connection error; or - // ii) the server started to drain before this RPC was initiated. - if _, ok := err.(transport.ConnectionError); (ok || err == transport.ErrStreamDrain) && !c.failFast { - continue - } - return toRPCErr(err) - } - err = recvResponse(ctx, cc.dopts, t, &c, stream, reply) - if err != nil { - if put != nil { - updateRPCInfoInContext(ctx, rpcInfo{ - bytesSent: stream.BytesSent(), - bytesReceived: stream.BytesReceived(), - }) - put() - } - if _, ok := err.(transport.ConnectionError); (ok || err == transport.ErrStreamDrain) && !c.failFast { - continue - } - return toRPCErr(err) - } - if c.traceInfo.tr != nil { - c.traceInfo.tr.LazyLog(&payload{sent: false, msg: reply}, true) - } - t.CloseStream(stream, nil) - if put != nil { - updateRPCInfoInContext(ctx, rpcInfo{ - bytesSent: stream.BytesSent(), - bytesReceived: stream.BytesReceived(), - }) - put() - } - return stream.Status().Err() - } -} diff --git a/vendor/google.golang.org/grpc/clientconn.go b/vendor/google.golang.org/grpc/clientconn.go deleted file mode 100644 index 04c16526e..000000000 --- a/vendor/google.golang.org/grpc/clientconn.go +++ /dev/null @@ -1,1080 +0,0 @@ -/* - * - * Copyright 2014, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT - * OWNER 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. - * - */ - -package grpc - -import ( - "errors" - "fmt" - "net" - "strings" - "sync" - "time" - - "golang.org/x/net/context" - "golang.org/x/net/trace" - "google.golang.org/grpc/credentials" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/keepalive" - "google.golang.org/grpc/stats" - "google.golang.org/grpc/transport" -) - -var ( - // ErrClientConnClosing indicates that the operation is illegal because - // the ClientConn is closing. - ErrClientConnClosing = errors.New("grpc: the client connection is closing") - // ErrClientConnTimeout indicates that the ClientConn cannot establish the - // underlying connections within the specified timeout. - // DEPRECATED: Please use context.DeadlineExceeded instead. - ErrClientConnTimeout = errors.New("grpc: timed out when dialing") - - // errNoTransportSecurity indicates that there is no transport security - // being set for ClientConn. Users should either set one or explicitly - // call WithInsecure DialOption to disable security. - errNoTransportSecurity = errors.New("grpc: no transport security set (use grpc.WithInsecure() explicitly or set credentials)") - // errTransportCredentialsMissing indicates that users want to transmit security - // information (e.g., oauth2 token) which requires secure connection on an insecure - // connection. - errTransportCredentialsMissing = errors.New("grpc: the credentials require transport level security (use grpc.WithTransportCredentials() to set)") - // errCredentialsConflict indicates that grpc.WithTransportCredentials() - // and grpc.WithInsecure() are both called for a connection. - errCredentialsConflict = errors.New("grpc: transport credentials are set for an insecure connection (grpc.WithTransportCredentials() and grpc.WithInsecure() are both called)") - // errNetworkIO indicates that the connection is down due to some network I/O error. - errNetworkIO = errors.New("grpc: failed with network I/O error") - // errConnDrain indicates that the connection starts to be drained and does not accept any new RPCs. - errConnDrain = errors.New("grpc: the connection is drained") - // errConnClosing indicates that the connection is closing. - errConnClosing = errors.New("grpc: the connection is closing") - // errConnUnavailable indicates that the connection is unavailable. - errConnUnavailable = errors.New("grpc: the connection is unavailable") - // errBalancerClosed indicates that the balancer is closed. - errBalancerClosed = errors.New("grpc: balancer is closed") - // minimum time to give a connection to complete - minConnectTimeout = 20 * time.Second -) - -// dialOptions configure a Dial call. dialOptions are set by the DialOption -// values passed to Dial. -type dialOptions struct { - unaryInt UnaryClientInterceptor - streamInt StreamClientInterceptor - codec Codec - cp Compressor - dc Decompressor - bs backoffStrategy - balancer Balancer - block bool - insecure bool - timeout time.Duration - scChan <-chan ServiceConfig - copts transport.ConnectOptions - callOptions []CallOption -} - -const ( - defaultClientMaxReceiveMessageSize = 1024 * 1024 * 4 - defaultClientMaxSendMessageSize = 1024 * 1024 * 4 -) - -// DialOption configures how we set up the connection. -type DialOption func(*dialOptions) - -// WithInitialWindowSize returns a DialOption which sets the value for initial window size on a stream. -// The lower bound for window size is 64K and any value smaller than that will be ignored. -func WithInitialWindowSize(s int32) DialOption { - return func(o *dialOptions) { - o.copts.InitialWindowSize = s - } -} - -// WithInitialConnWindowSize returns a DialOption which sets the value for initial window size on a connection. -// The lower bound for window size is 64K and any value smaller than that will be ignored. -func WithInitialConnWindowSize(s int32) DialOption { - return func(o *dialOptions) { - o.copts.InitialConnWindowSize = s - } -} - -// WithMaxMsgSize returns a DialOption which sets the maximum message size the client can receive. Deprecated: use WithDefaultCallOptions(MaxCallRecvMsgSize(s)) instead. -func WithMaxMsgSize(s int) DialOption { - return WithDefaultCallOptions(MaxCallRecvMsgSize(s)) -} - -// WithDefaultCallOptions returns a DialOption which sets the default CallOptions for calls over the connection. -func WithDefaultCallOptions(cos ...CallOption) DialOption { - return func(o *dialOptions) { - o.callOptions = append(o.callOptions, cos...) - } -} - -// WithCodec returns a DialOption which sets a codec for message marshaling and unmarshaling. -func WithCodec(c Codec) DialOption { - return func(o *dialOptions) { - o.codec = c - } -} - -// WithCompressor returns a DialOption which sets a CompressorGenerator for generating message -// compressor. -func WithCompressor(cp Compressor) DialOption { - return func(o *dialOptions) { - o.cp = cp - } -} - -// WithDecompressor returns a DialOption which sets a DecompressorGenerator for generating -// message decompressor. -func WithDecompressor(dc Decompressor) DialOption { - return func(o *dialOptions) { - o.dc = dc - } -} - -// WithBalancer returns a DialOption which sets a load balancer. -func WithBalancer(b Balancer) DialOption { - return func(o *dialOptions) { - o.balancer = b - } -} - -// WithServiceConfig returns a DialOption which has a channel to read the service configuration. -func WithServiceConfig(c <-chan ServiceConfig) DialOption { - return func(o *dialOptions) { - o.scChan = c - } -} - -// WithBackoffMaxDelay configures the dialer to use the provided maximum delay -// when backing off after failed connection attempts. -func WithBackoffMaxDelay(md time.Duration) DialOption { - return WithBackoffConfig(BackoffConfig{MaxDelay: md}) -} - -// WithBackoffConfig configures the dialer to use the provided backoff -// parameters after connection failures. -// -// Use WithBackoffMaxDelay until more parameters on BackoffConfig are opened up -// for use. -func WithBackoffConfig(b BackoffConfig) DialOption { - // Set defaults to ensure that provided BackoffConfig is valid and - // unexported fields get default values. - setDefaults(&b) - return withBackoff(b) -} - -// withBackoff sets the backoff strategy used for retries after a -// failed connection attempt. -// -// This can be exported if arbitrary backoff strategies are allowed by gRPC. -func withBackoff(bs backoffStrategy) DialOption { - return func(o *dialOptions) { - o.bs = bs - } -} - -// WithBlock returns a DialOption which makes caller of Dial blocks until the underlying -// connection is up. Without this, Dial returns immediately and connecting the server -// happens in background. -func WithBlock() DialOption { - return func(o *dialOptions) { - o.block = true - } -} - -// WithInsecure returns a DialOption which disables transport security for this ClientConn. -// Note that transport security is required unless WithInsecure is set. -func WithInsecure() DialOption { - return func(o *dialOptions) { - o.insecure = true - } -} - -// WithTransportCredentials returns a DialOption which configures a -// connection level security credentials (e.g., TLS/SSL). -func WithTransportCredentials(creds credentials.TransportCredentials) DialOption { - return func(o *dialOptions) { - o.copts.TransportCredentials = creds - } -} - -// WithPerRPCCredentials returns a DialOption which sets -// credentials and places auth state on each outbound RPC. -func WithPerRPCCredentials(creds credentials.PerRPCCredentials) DialOption { - return func(o *dialOptions) { - o.copts.PerRPCCredentials = append(o.copts.PerRPCCredentials, creds) - } -} - -// WithTimeout returns a DialOption that configures a timeout for dialing a ClientConn -// initially. This is valid if and only if WithBlock() is present. -func WithTimeout(d time.Duration) DialOption { - return func(o *dialOptions) { - o.timeout = d - } -} - -// WithDialer returns a DialOption that specifies a function to use for dialing network addresses. -// If FailOnNonTempDialError() is set to true, and an error is returned by f, gRPC checks the error's -// Temporary() method to decide if it should try to reconnect to the network address. -func WithDialer(f func(string, time.Duration) (net.Conn, error)) DialOption { - return func(o *dialOptions) { - o.copts.Dialer = func(ctx context.Context, addr string) (net.Conn, error) { - if deadline, ok := ctx.Deadline(); ok { - return f(addr, deadline.Sub(time.Now())) - } - return f(addr, 0) - } - } -} - -// WithStatsHandler returns a DialOption that specifies the stats handler -// for all the RPCs and underlying network connections in this ClientConn. -func WithStatsHandler(h stats.Handler) DialOption { - return func(o *dialOptions) { - o.copts.StatsHandler = h - } -} - -// FailOnNonTempDialError returns a DialOption that specifies if gRPC fails on non-temporary dial errors. -// If f is true, and dialer returns a non-temporary error, gRPC will fail the connection to the network -// address and won't try to reconnect. -// The default value of FailOnNonTempDialError is false. -// This is an EXPERIMENTAL API. -func FailOnNonTempDialError(f bool) DialOption { - return func(o *dialOptions) { - o.copts.FailOnNonTempDialError = f - } -} - -// WithUserAgent returns a DialOption that specifies a user agent string for all the RPCs. -func WithUserAgent(s string) DialOption { - return func(o *dialOptions) { - o.copts.UserAgent = s - } -} - -// WithKeepaliveParams returns a DialOption that specifies keepalive paramaters for the client transport. -func WithKeepaliveParams(kp keepalive.ClientParameters) DialOption { - return func(o *dialOptions) { - o.copts.KeepaliveParams = kp - } -} - -// WithUnaryInterceptor returns a DialOption that specifies the interceptor for unary RPCs. -func WithUnaryInterceptor(f UnaryClientInterceptor) DialOption { - return func(o *dialOptions) { - o.unaryInt = f - } -} - -// WithStreamInterceptor returns a DialOption that specifies the interceptor for streaming RPCs. -func WithStreamInterceptor(f StreamClientInterceptor) DialOption { - return func(o *dialOptions) { - o.streamInt = f - } -} - -// WithAuthority returns a DialOption that specifies the value to be used as -// the :authority pseudo-header. This value only works with WithInsecure and -// has no effect if TransportCredentials are present. -func WithAuthority(a string) DialOption { - return func(o *dialOptions) { - o.copts.Authority = a - } -} - -// Dial creates a client connection to the given target. -func Dial(target string, opts ...DialOption) (*ClientConn, error) { - return DialContext(context.Background(), target, opts...) -} - -// DialContext creates a client connection to the given target. ctx can be used to -// cancel or expire the pending connection. Once this function returns, the -// cancellation and expiration of ctx will be noop. Users should call ClientConn.Close -// to terminate all the pending operations after this function returns. -func DialContext(ctx context.Context, target string, opts ...DialOption) (conn *ClientConn, err error) { - cc := &ClientConn{ - target: target, - conns: make(map[Address]*addrConn), - } - cc.ctx, cc.cancel = context.WithCancel(context.Background()) - - for _, opt := range opts { - opt(&cc.dopts) - } - cc.mkp = cc.dopts.copts.KeepaliveParams - - if cc.dopts.copts.Dialer == nil { - cc.dopts.copts.Dialer = newProxyDialer( - func(ctx context.Context, addr string) (net.Conn, error) { - return dialContext(ctx, "tcp", addr) - }, - ) - } - - if cc.dopts.copts.UserAgent != "" { - cc.dopts.copts.UserAgent += " " + grpcUA - } else { - cc.dopts.copts.UserAgent = grpcUA - } - - if cc.dopts.timeout > 0 { - var cancel context.CancelFunc - ctx, cancel = context.WithTimeout(ctx, cc.dopts.timeout) - defer cancel() - } - - defer func() { - select { - case <-ctx.Done(): - conn, err = nil, ctx.Err() - default: - } - - if err != nil { - cc.Close() - } - }() - - scSet := false - if cc.dopts.scChan != nil { - // Try to get an initial service config. - select { - case sc, ok := <-cc.dopts.scChan: - if ok { - cc.sc = sc - scSet = true - } - default: - } - } - // Set defaults. - if cc.dopts.codec == nil { - cc.dopts.codec = protoCodec{} - } - if cc.dopts.bs == nil { - cc.dopts.bs = DefaultBackoffConfig - } - creds := cc.dopts.copts.TransportCredentials - if creds != nil && creds.Info().ServerName != "" { - cc.authority = creds.Info().ServerName - } else if cc.dopts.insecure && cc.dopts.copts.Authority != "" { - cc.authority = cc.dopts.copts.Authority - } else { - cc.authority = target - } - waitC := make(chan error, 1) - go func() { - defer close(waitC) - if cc.dopts.balancer == nil && cc.sc.LB != nil { - cc.dopts.balancer = cc.sc.LB - } - if cc.dopts.balancer != nil { - var credsClone credentials.TransportCredentials - if creds != nil { - credsClone = creds.Clone() - } - config := BalancerConfig{ - DialCreds: credsClone, - Dialer: cc.dopts.copts.Dialer, - } - if err := cc.dopts.balancer.Start(target, config); err != nil { - waitC <- err - return - } - ch := cc.dopts.balancer.Notify() - if ch != nil { - if cc.dopts.block { - doneChan := make(chan struct{}) - go cc.lbWatcher(doneChan) - <-doneChan - } else { - go cc.lbWatcher(nil) - } - return - } - } - // No balancer, or no resolver within the balancer. Connect directly. - if err := cc.resetAddrConn(Address{Addr: target}, cc.dopts.block, nil); err != nil { - waitC <- err - return - } - }() - select { - case <-ctx.Done(): - return nil, ctx.Err() - case err := <-waitC: - if err != nil { - return nil, err - } - } - if cc.dopts.scChan != nil && !scSet { - // Blocking wait for the initial service config. - select { - case sc, ok := <-cc.dopts.scChan: - if ok { - cc.sc = sc - } - case <-ctx.Done(): - return nil, ctx.Err() - } - } - if cc.dopts.scChan != nil { - go cc.scWatcher() - } - - return cc, nil -} - -// ConnectivityState indicates the state of a client connection. -type ConnectivityState int - -const ( - // Idle indicates the ClientConn is idle. - Idle ConnectivityState = iota - // Connecting indicates the ClienConn is connecting. - Connecting - // Ready indicates the ClientConn is ready for work. - Ready - // TransientFailure indicates the ClientConn has seen a failure but expects to recover. - TransientFailure - // Shutdown indicates the ClientConn has started shutting down. - Shutdown -) - -func (s ConnectivityState) String() string { - switch s { - case Idle: - return "IDLE" - case Connecting: - return "CONNECTING" - case Ready: - return "READY" - case TransientFailure: - return "TRANSIENT_FAILURE" - case Shutdown: - return "SHUTDOWN" - default: - panic(fmt.Sprintf("unknown connectivity state: %d", s)) - } -} - -// ClientConn represents a client connection to an RPC server. -type ClientConn struct { - ctx context.Context - cancel context.CancelFunc - - target string - authority string - dopts dialOptions - - mu sync.RWMutex - sc ServiceConfig - conns map[Address]*addrConn - // Keepalive parameter can be udated if a GoAway is received. - mkp keepalive.ClientParameters -} - -// lbWatcher watches the Notify channel of the balancer in cc and manages -// connections accordingly. If doneChan is not nil, it is closed after the -// first successfull connection is made. -func (cc *ClientConn) lbWatcher(doneChan chan struct{}) { - for addrs := range cc.dopts.balancer.Notify() { - var ( - add []Address // Addresses need to setup connections. - del []*addrConn // Connections need to tear down. - ) - cc.mu.Lock() - for _, a := range addrs { - if _, ok := cc.conns[a]; !ok { - add = append(add, a) - } - } - for k, c := range cc.conns { - var keep bool - for _, a := range addrs { - if k == a { - keep = true - break - } - } - if !keep { - del = append(del, c) - delete(cc.conns, c.addr) - } - } - cc.mu.Unlock() - for _, a := range add { - if doneChan != nil { - err := cc.resetAddrConn(a, true, nil) - if err == nil { - close(doneChan) - doneChan = nil - } - } else { - cc.resetAddrConn(a, false, nil) - } - } - for _, c := range del { - c.tearDown(errConnDrain) - } - } -} - -func (cc *ClientConn) scWatcher() { - for { - select { - case sc, ok := <-cc.dopts.scChan: - if !ok { - return - } - cc.mu.Lock() - // TODO: load balance policy runtime change is ignored. - // We may revist this decision in the future. - cc.sc = sc - cc.mu.Unlock() - case <-cc.ctx.Done(): - return - } - } -} - -// resetAddrConn creates an addrConn for addr and adds it to cc.conns. -// If there is an old addrConn for addr, it will be torn down, using tearDownErr as the reason. -// If tearDownErr is nil, errConnDrain will be used instead. -func (cc *ClientConn) resetAddrConn(addr Address, block bool, tearDownErr error) error { - ac := &addrConn{ - cc: cc, - addr: addr, - dopts: cc.dopts, - } - cc.mu.RLock() - ac.dopts.copts.KeepaliveParams = cc.mkp - cc.mu.RUnlock() - ac.ctx, ac.cancel = context.WithCancel(cc.ctx) - ac.stateCV = sync.NewCond(&ac.mu) - if EnableTracing { - ac.events = trace.NewEventLog("grpc.ClientConn", ac.addr.Addr) - } - if !ac.dopts.insecure { - if ac.dopts.copts.TransportCredentials == nil { - return errNoTransportSecurity - } - } else { - if ac.dopts.copts.TransportCredentials != nil { - return errCredentialsConflict - } - for _, cd := range ac.dopts.copts.PerRPCCredentials { - if cd.RequireTransportSecurity() { - return errTransportCredentialsMissing - } - } - } - // Track ac in cc. This needs to be done before any getTransport(...) is called. - cc.mu.Lock() - if cc.conns == nil { - cc.mu.Unlock() - return ErrClientConnClosing - } - stale := cc.conns[ac.addr] - cc.conns[ac.addr] = ac - cc.mu.Unlock() - if stale != nil { - // There is an addrConn alive on ac.addr already. This could be due to - // 1) a buggy Balancer notifies duplicated Addresses; - // 2) goaway was received, a new ac will replace the old ac. - // The old ac should be deleted from cc.conns, but the - // underlying transport should drain rather than close. - if tearDownErr == nil { - // tearDownErr is nil if resetAddrConn is called by - // 1) Dial - // 2) lbWatcher - // In both cases, the stale ac should drain, not close. - stale.tearDown(errConnDrain) - } else { - stale.tearDown(tearDownErr) - } - } - if block { - if err := ac.resetTransport(false); err != nil { - if err != errConnClosing { - // Tear down ac and delete it from cc.conns. - cc.mu.Lock() - delete(cc.conns, ac.addr) - cc.mu.Unlock() - ac.tearDown(err) - } - if e, ok := err.(transport.ConnectionError); ok && !e.Temporary() { - return e.Origin() - } - return err - } - // Start to monitor the error status of transport. - go ac.transportMonitor() - } else { - // Start a goroutine connecting to the server asynchronously. - go func() { - if err := ac.resetTransport(false); err != nil { - grpclog.Printf("Failed to dial %s: %v; please retry.", ac.addr.Addr, err) - if err != errConnClosing { - // Keep this ac in cc.conns, to get the reason it's torn down. - ac.tearDown(err) - } - return - } - ac.transportMonitor() - }() - } - return nil -} - -// GetMethodConfig gets the method config of the input method. -// If there's an exact match for input method (i.e. /service/method), we return -// the corresponding MethodConfig. -// If there isn't an exact match for the input method, we look for the default config -// under the service (i.e /service/). If there is a default MethodConfig for -// the serivce, we return it. -// Otherwise, we return an empty MethodConfig. -func (cc *ClientConn) GetMethodConfig(method string) MethodConfig { - // TODO: Avoid the locking here. - cc.mu.RLock() - defer cc.mu.RUnlock() - m, ok := cc.sc.Methods[method] - if !ok { - i := strings.LastIndex(method, "/") - m, _ = cc.sc.Methods[method[:i+1]] - } - return m -} - -func (cc *ClientConn) getTransport(ctx context.Context, opts BalancerGetOptions) (transport.ClientTransport, func(), error) { - var ( - ac *addrConn - ok bool - put func() - ) - if cc.dopts.balancer == nil { - // If balancer is nil, there should be only one addrConn available. - cc.mu.RLock() - if cc.conns == nil { - cc.mu.RUnlock() - return nil, nil, toRPCErr(ErrClientConnClosing) - } - for _, ac = range cc.conns { - // Break after the first iteration to get the first addrConn. - ok = true - break - } - cc.mu.RUnlock() - } else { - var ( - addr Address - err error - ) - addr, put, err = cc.dopts.balancer.Get(ctx, opts) - if err != nil { - return nil, nil, toRPCErr(err) - } - cc.mu.RLock() - if cc.conns == nil { - cc.mu.RUnlock() - return nil, nil, toRPCErr(ErrClientConnClosing) - } - ac, ok = cc.conns[addr] - cc.mu.RUnlock() - } - if !ok { - if put != nil { - updateRPCInfoInContext(ctx, rpcInfo{bytesSent: false, bytesReceived: false}) - put() - } - return nil, nil, errConnClosing - } - t, err := ac.wait(ctx, cc.dopts.balancer != nil, !opts.BlockingWait) - if err != nil { - if put != nil { - updateRPCInfoInContext(ctx, rpcInfo{bytesSent: false, bytesReceived: false}) - put() - } - return nil, nil, err - } - return t, put, nil -} - -// Close tears down the ClientConn and all underlying connections. -func (cc *ClientConn) Close() error { - cc.cancel() - - cc.mu.Lock() - if cc.conns == nil { - cc.mu.Unlock() - return ErrClientConnClosing - } - conns := cc.conns - cc.conns = nil - cc.mu.Unlock() - if cc.dopts.balancer != nil { - cc.dopts.balancer.Close() - } - for _, ac := range conns { - ac.tearDown(ErrClientConnClosing) - } - return nil -} - -// addrConn is a network connection to a given address. -type addrConn struct { - ctx context.Context - cancel context.CancelFunc - - cc *ClientConn - addr Address - dopts dialOptions - events trace.EventLog - - mu sync.Mutex - state ConnectivityState - stateCV *sync.Cond - down func(error) // the handler called when a connection is down. - // ready is closed and becomes nil when a new transport is up or failed - // due to timeout. - ready chan struct{} - transport transport.ClientTransport - - // The reason this addrConn is torn down. - tearDownErr error -} - -// adjustParams updates parameters used to create transports upon -// receiving a GoAway. -func (ac *addrConn) adjustParams(r transport.GoAwayReason) { - switch r { - case transport.TooManyPings: - v := 2 * ac.dopts.copts.KeepaliveParams.Time - ac.cc.mu.Lock() - if v > ac.cc.mkp.Time { - ac.cc.mkp.Time = v - } - ac.cc.mu.Unlock() - } -} - -// printf records an event in ac's event log, unless ac has been closed. -// REQUIRES ac.mu is held. -func (ac *addrConn) printf(format string, a ...interface{}) { - if ac.events != nil { - ac.events.Printf(format, a...) - } -} - -// errorf records an error in ac's event log, unless ac has been closed. -// REQUIRES ac.mu is held. -func (ac *addrConn) errorf(format string, a ...interface{}) { - if ac.events != nil { - ac.events.Errorf(format, a...) - } -} - -// getState returns the connectivity state of the Conn -func (ac *addrConn) getState() ConnectivityState { - ac.mu.Lock() - defer ac.mu.Unlock() - return ac.state -} - -// waitForStateChange blocks until the state changes to something other than the sourceState. -func (ac *addrConn) waitForStateChange(ctx context.Context, sourceState ConnectivityState) (ConnectivityState, error) { - ac.mu.Lock() - defer ac.mu.Unlock() - if sourceState != ac.state { - return ac.state, nil - } - done := make(chan struct{}) - var err error - go func() { - select { - case <-ctx.Done(): - ac.mu.Lock() - err = ctx.Err() - ac.stateCV.Broadcast() - ac.mu.Unlock() - case <-done: - } - }() - defer close(done) - for sourceState == ac.state { - ac.stateCV.Wait() - if err != nil { - return ac.state, err - } - } - return ac.state, nil -} - -func (ac *addrConn) resetTransport(closeTransport bool) error { - for retries := 0; ; retries++ { - ac.mu.Lock() - ac.printf("connecting") - if ac.state == Shutdown { - // ac.tearDown(...) has been invoked. - ac.mu.Unlock() - return errConnClosing - } - if ac.down != nil { - ac.down(downErrorf(false, true, "%v", errNetworkIO)) - ac.down = nil - } - ac.state = Connecting - ac.stateCV.Broadcast() - t := ac.transport - ac.mu.Unlock() - if closeTransport && t != nil { - t.Close() - } - sleepTime := ac.dopts.bs.backoff(retries) - timeout := minConnectTimeout - if timeout < sleepTime { - timeout = sleepTime - } - ctx, cancel := context.WithTimeout(ac.ctx, timeout) - connectTime := time.Now() - sinfo := transport.TargetInfo{ - Addr: ac.addr.Addr, - Metadata: ac.addr.Metadata, - } - newTransport, err := transport.NewClientTransport(ctx, sinfo, ac.dopts.copts) - // Don't call cancel in success path due to a race in Go 1.6: - // https://github.com/golang/go/issues/15078. - if err != nil { - cancel() - - if e, ok := err.(transport.ConnectionError); ok && !e.Temporary() { - return err - } - grpclog.Printf("grpc: addrConn.resetTransport failed to create client transport: %v; Reconnecting to %v", err, ac.addr) - ac.mu.Lock() - if ac.state == Shutdown { - // ac.tearDown(...) has been invoked. - ac.mu.Unlock() - return errConnClosing - } - ac.errorf("transient failure: %v", err) - ac.state = TransientFailure - ac.stateCV.Broadcast() - if ac.ready != nil { - close(ac.ready) - ac.ready = nil - } - ac.mu.Unlock() - closeTransport = false - timer := time.NewTimer(sleepTime - time.Since(connectTime)) - select { - case <-timer.C: - case <-ac.ctx.Done(): - timer.Stop() - return ac.ctx.Err() - } - timer.Stop() - continue - } - ac.mu.Lock() - ac.printf("ready") - if ac.state == Shutdown { - // ac.tearDown(...) has been invoked. - ac.mu.Unlock() - newTransport.Close() - return errConnClosing - } - ac.state = Ready - ac.stateCV.Broadcast() - ac.transport = newTransport - if ac.ready != nil { - close(ac.ready) - ac.ready = nil - } - if ac.cc.dopts.balancer != nil { - ac.down = ac.cc.dopts.balancer.Up(ac.addr) - } - ac.mu.Unlock() - return nil - } -} - -// Run in a goroutine to track the error in transport and create the -// new transport if an error happens. It returns when the channel is closing. -func (ac *addrConn) transportMonitor() { - for { - ac.mu.Lock() - t := ac.transport - ac.mu.Unlock() - select { - // This is needed to detect the teardown when - // the addrConn is idle (i.e., no RPC in flight). - case <-ac.ctx.Done(): - select { - case <-t.Error(): - t.Close() - default: - } - return - case <-t.GoAway(): - ac.adjustParams(t.GetGoAwayReason()) - // If GoAway happens without any network I/O error, ac is closed without shutting down the - // underlying transport (the transport will be closed when all the pending RPCs finished or - // failed.). - // If GoAway and some network I/O error happen concurrently, ac and its underlying transport - // are closed. - // In both cases, a new ac is created. - select { - case <-t.Error(): - ac.cc.resetAddrConn(ac.addr, false, errNetworkIO) - default: - ac.cc.resetAddrConn(ac.addr, false, errConnDrain) - } - return - case <-t.Error(): - select { - case <-ac.ctx.Done(): - t.Close() - return - case <-t.GoAway(): - ac.adjustParams(t.GetGoAwayReason()) - ac.cc.resetAddrConn(ac.addr, false, errNetworkIO) - return - default: - } - ac.mu.Lock() - if ac.state == Shutdown { - // ac has been shutdown. - ac.mu.Unlock() - return - } - ac.state = TransientFailure - ac.stateCV.Broadcast() - ac.mu.Unlock() - if err := ac.resetTransport(true); err != nil { - ac.mu.Lock() - ac.printf("transport exiting: %v", err) - ac.mu.Unlock() - grpclog.Printf("grpc: addrConn.transportMonitor exits due to: %v", err) - if err != errConnClosing { - // Keep this ac in cc.conns, to get the reason it's torn down. - ac.tearDown(err) - } - return - } - } - } -} - -// wait blocks until i) the new transport is up or ii) ctx is done or iii) ac is closed or -// iv) transport is in TransientFailure and there is a balancer/failfast is true. -func (ac *addrConn) wait(ctx context.Context, hasBalancer, failfast bool) (transport.ClientTransport, error) { - for { - ac.mu.Lock() - switch { - case ac.state == Shutdown: - if failfast || !hasBalancer { - // RPC is failfast or balancer is nil. This RPC should fail with ac.tearDownErr. - err := ac.tearDownErr - ac.mu.Unlock() - return nil, err - } - ac.mu.Unlock() - return nil, errConnClosing - case ac.state == Ready: - ct := ac.transport - ac.mu.Unlock() - return ct, nil - case ac.state == TransientFailure: - if failfast || hasBalancer { - ac.mu.Unlock() - return nil, errConnUnavailable - } - } - ready := ac.ready - if ready == nil { - ready = make(chan struct{}) - ac.ready = ready - } - ac.mu.Unlock() - select { - case <-ctx.Done(): - return nil, toRPCErr(ctx.Err()) - // Wait until the new transport is ready or failed. - case <-ready: - } - } -} - -// tearDown starts to tear down the addrConn. -// TODO(zhaoq): Make this synchronous to avoid unbounded memory consumption in -// some edge cases (e.g., the caller opens and closes many addrConn's in a -// tight loop. -// tearDown doesn't remove ac from ac.cc.conns. -func (ac *addrConn) tearDown(err error) { - ac.cancel() - - ac.mu.Lock() - defer ac.mu.Unlock() - if ac.down != nil { - ac.down(downErrorf(false, false, "%v", err)) - ac.down = nil - } - if err == errConnDrain && ac.transport != nil { - // GracefulClose(...) may be executed multiple times when - // i) receiving multiple GoAway frames from the server; or - // ii) there are concurrent name resolver/Balancer triggered - // address removal and GoAway. - ac.transport.GracefulClose() - } - if ac.state == Shutdown { - return - } - ac.state = Shutdown - ac.tearDownErr = err - ac.stateCV.Broadcast() - if ac.events != nil { - ac.events.Finish() - ac.events = nil - } - if ac.ready != nil { - close(ac.ready) - ac.ready = nil - } - if ac.transport != nil && err != errConnDrain { - ac.transport.Close() - } - return -} diff --git a/vendor/google.golang.org/grpc/codec.go b/vendor/google.golang.org/grpc/codec.go deleted file mode 100644 index 001804d37..000000000 --- a/vendor/google.golang.org/grpc/codec.go +++ /dev/null @@ -1,119 +0,0 @@ -/* -* - * Copyright 2014, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT - * OWNER 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. - * -*/ - -package grpc - -import ( - "math" - "sync" - - "github.com/golang/protobuf/proto" -) - -// Codec defines the interface gRPC uses to encode and decode messages. -// Note that implementations of this interface must be thread safe; -// a Codec's methods can be called from concurrent goroutines. -type Codec interface { - // Marshal returns the wire format of v. - Marshal(v interface{}) ([]byte, error) - // Unmarshal parses the wire format into v. - Unmarshal(data []byte, v interface{}) error - // String returns the name of the Codec implementation. The returned - // string will be used as part of content type in transmission. - String() string -} - -// protoCodec is a Codec implementation with protobuf. It is the default codec for gRPC. -type protoCodec struct { -} - -type cachedProtoBuffer struct { - lastMarshaledSize uint32 - proto.Buffer -} - -func capToMaxInt32(val int) uint32 { - if val > math.MaxInt32 { - return uint32(math.MaxInt32) - } - return uint32(val) -} - -func (p protoCodec) marshal(v interface{}, cb *cachedProtoBuffer) ([]byte, error) { - protoMsg := v.(proto.Message) - newSlice := make([]byte, 0, cb.lastMarshaledSize) - - cb.SetBuf(newSlice) - cb.Reset() - if err := cb.Marshal(protoMsg); err != nil { - return nil, err - } - out := cb.Bytes() - cb.lastMarshaledSize = capToMaxInt32(len(out)) - return out, nil -} - -func (p protoCodec) Marshal(v interface{}) ([]byte, error) { - cb := protoBufferPool.Get().(*cachedProtoBuffer) - out, err := p.marshal(v, cb) - - // put back buffer and lose the ref to the slice - cb.SetBuf(nil) - protoBufferPool.Put(cb) - return out, err -} - -func (p protoCodec) Unmarshal(data []byte, v interface{}) error { - cb := protoBufferPool.Get().(*cachedProtoBuffer) - cb.SetBuf(data) - v.(proto.Message).Reset() - err := cb.Unmarshal(v.(proto.Message)) - cb.SetBuf(nil) - protoBufferPool.Put(cb) - return err -} - -func (protoCodec) String() string { - return "proto" -} - -var ( - protoBufferPool = &sync.Pool{ - New: func() interface{} { - return &cachedProtoBuffer{ - Buffer: proto.Buffer{}, - lastMarshaledSize: 16, - } - }, - } -) diff --git a/vendor/google.golang.org/grpc/codegen.sh b/vendor/google.golang.org/grpc/codegen.sh deleted file mode 100644 index 4cdc6ba7c..000000000 --- a/vendor/google.golang.org/grpc/codegen.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env bash - -# This script serves as an example to demonstrate how to generate the gRPC-Go -# interface and the related messages from .proto file. -# -# It assumes the installation of i) Google proto buffer compiler at -# https://github.com/google/protobuf (after v2.6.1) and ii) the Go codegen -# plugin at https://github.com/golang/protobuf (after 2015-02-20). If you have -# not, please install them first. -# -# We recommend running this script at $GOPATH/src. -# -# If this is not what you need, feel free to make your own scripts. Again, this -# script is for demonstration purpose. -# -proto=$1 -protoc --go_out=plugins=grpc:. $proto diff --git a/vendor/google.golang.org/grpc/codes/code_string.go b/vendor/google.golang.org/grpc/codes/code_string.go deleted file mode 100644 index e6762d084..000000000 --- a/vendor/google.golang.org/grpc/codes/code_string.go +++ /dev/null @@ -1,16 +0,0 @@ -// generated by stringer -type=Code; DO NOT EDIT - -package codes - -import "fmt" - -const _Code_name = "OKCanceledUnknownInvalidArgumentDeadlineExceededNotFoundAlreadyExistsPermissionDeniedResourceExhaustedFailedPreconditionAbortedOutOfRangeUnimplementedInternalUnavailableDataLossUnauthenticated" - -var _Code_index = [...]uint8{0, 2, 10, 17, 32, 48, 56, 69, 85, 102, 120, 127, 137, 150, 158, 169, 177, 192} - -func (i Code) String() string { - if i+1 >= Code(len(_Code_index)) { - return fmt.Sprintf("Code(%d)", i) - } - return _Code_name[_Code_index[i]:_Code_index[i+1]] -} diff --git a/vendor/google.golang.org/grpc/codes/codes.go b/vendor/google.golang.org/grpc/codes/codes.go deleted file mode 100644 index dcae5cc26..000000000 --- a/vendor/google.golang.org/grpc/codes/codes.go +++ /dev/null @@ -1,159 +0,0 @@ -/* - * - * Copyright 2014, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT - * OWNER 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. - * - */ - -// Package codes defines the canonical error codes used by gRPC. It is -// consistent across various languages. -package codes // import "google.golang.org/grpc/codes" - -// A Code is an unsigned 32-bit error code as defined in the gRPC spec. -type Code uint32 - -//go:generate stringer -type=Code - -const ( - // OK is returned on success. - OK Code = 0 - - // Canceled indicates the operation was canceled (typically by the caller). - Canceled Code = 1 - - // Unknown error. An example of where this error may be returned is - // if a Status value received from another address space belongs to - // an error-space that is not known in this address space. Also - // errors raised by APIs that do not return enough error information - // may be converted to this error. - Unknown Code = 2 - - // InvalidArgument indicates client specified an invalid argument. - // Note that this differs from FailedPrecondition. It indicates arguments - // that are problematic regardless of the state of the system - // (e.g., a malformed file name). - InvalidArgument Code = 3 - - // DeadlineExceeded means operation expired before completion. - // For operations that change the state of the system, this error may be - // returned even if the operation has completed successfully. For - // example, a successful response from a server could have been delayed - // long enough for the deadline to expire. - DeadlineExceeded Code = 4 - - // NotFound means some requested entity (e.g., file or directory) was - // not found. - NotFound Code = 5 - - // AlreadyExists means an attempt to create an entity failed because one - // already exists. - AlreadyExists Code = 6 - - // PermissionDenied indicates the caller does not have permission to - // execute the specified operation. It must not be used for rejections - // caused by exhausting some resource (use ResourceExhausted - // instead for those errors). It must not be - // used if the caller cannot be identified (use Unauthenticated - // instead for those errors). - PermissionDenied Code = 7 - - // Unauthenticated indicates the request does not have valid - // authentication credentials for the operation. - Unauthenticated Code = 16 - - // ResourceExhausted indicates some resource has been exhausted, perhaps - // a per-user quota, or perhaps the entire file system is out of space. - ResourceExhausted Code = 8 - - // FailedPrecondition indicates operation was rejected because the - // system is not in a state required for the operation's execution. - // For example, directory to be deleted may be non-empty, an rmdir - // operation is applied to a non-directory, etc. - // - // A litmus test that may help a service implementor in deciding - // between FailedPrecondition, Aborted, and Unavailable: - // (a) Use Unavailable if the client can retry just the failing call. - // (b) Use Aborted if the client should retry at a higher-level - // (e.g., restarting a read-modify-write sequence). - // (c) Use FailedPrecondition if the client should not retry until - // the system state has been explicitly fixed. E.g., if an "rmdir" - // fails because the directory is non-empty, FailedPrecondition - // should be returned since the client should not retry unless - // they have first fixed up the directory by deleting files from it. - // (d) Use FailedPrecondition if the client performs conditional - // REST Get/Update/Delete on a resource and the resource on the - // server does not match the condition. E.g., conflicting - // read-modify-write on the same resource. - FailedPrecondition Code = 9 - - // Aborted indicates the operation was aborted, typically due to a - // concurrency issue like sequencer check failures, transaction aborts, - // etc. - // - // See litmus test above for deciding between FailedPrecondition, - // Aborted, and Unavailable. - Aborted Code = 10 - - // OutOfRange means operation was attempted past the valid range. - // E.g., seeking or reading past end of file. - // - // Unlike InvalidArgument, this error indicates a problem that may - // be fixed if the system state changes. For example, a 32-bit file - // system will generate InvalidArgument if asked to read at an - // offset that is not in the range [0,2^32-1], but it will generate - // OutOfRange if asked to read from an offset past the current - // file size. - // - // There is a fair bit of overlap between FailedPrecondition and - // OutOfRange. We recommend using OutOfRange (the more specific - // error) when it applies so that callers who are iterating through - // a space can easily look for an OutOfRange error to detect when - // they are done. - OutOfRange Code = 11 - - // Unimplemented indicates operation is not implemented or not - // supported/enabled in this service. - Unimplemented Code = 12 - - // Internal errors. Means some invariants expected by underlying - // system has been broken. If you see one of these errors, - // something is very broken. - Internal Code = 13 - - // Unavailable indicates the service is currently unavailable. - // This is a most likely a transient condition and may be corrected - // by retrying with a backoff. - // - // See litmus test above for deciding between FailedPrecondition, - // Aborted, and Unavailable. - Unavailable Code = 14 - - // DataLoss indicates unrecoverable data loss or corruption. - DataLoss Code = 15 -) diff --git a/vendor/google.golang.org/grpc/coverage.sh b/vendor/google.golang.org/grpc/coverage.sh deleted file mode 100644 index b85f9181d..000000000 --- a/vendor/google.golang.org/grpc/coverage.sh +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/env bash - - -set -e - -workdir=.cover -profile="$workdir/cover.out" -mode=set -end2endtest="google.golang.org/grpc/test" - -generate_cover_data() { - rm -rf "$workdir" - mkdir "$workdir" - - for pkg in "$@"; do - if [ $pkg == "google.golang.org/grpc" -o $pkg == "google.golang.org/grpc/transport" -o $pkg == "google.golang.org/grpc/metadata" -o $pkg == "google.golang.org/grpc/credentials" ] - then - f="$workdir/$(echo $pkg | tr / -)" - go test -covermode="$mode" -coverprofile="$f.cover" "$pkg" - go test -covermode="$mode" -coverpkg "$pkg" -coverprofile="$f.e2e.cover" "$end2endtest" - fi - done - - echo "mode: $mode" >"$profile" - grep -h -v "^mode:" "$workdir"/*.cover >>"$profile" -} - -show_cover_report() { - go tool cover -${1}="$profile" -} - -push_to_coveralls() { - goveralls -coverprofile="$profile" -} - -generate_cover_data $(go list ./...) -show_cover_report func -case "$1" in -"") - ;; ---html) - show_cover_report html ;; ---coveralls) - push_to_coveralls ;; -*) - echo >&2 "error: invalid option: $1" ;; -esac -rm -rf "$workdir" diff --git a/vendor/google.golang.org/grpc/credentials/credentials.go b/vendor/google.golang.org/grpc/credentials/credentials.go deleted file mode 100644 index b16dbd6f4..000000000 --- a/vendor/google.golang.org/grpc/credentials/credentials.go +++ /dev/null @@ -1,234 +0,0 @@ -/* - * - * Copyright 2014, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT - * OWNER 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. - * - */ - -// Package credentials implements various credentials supported by gRPC library, -// which encapsulate all the state needed by a client to authenticate with a -// server and make various assertions, e.g., about the client's identity, role, -// or whether it is authorized to make a particular call. -package credentials // import "google.golang.org/grpc/credentials" - -import ( - "crypto/tls" - "crypto/x509" - "errors" - "fmt" - "io/ioutil" - "net" - "strings" - - "golang.org/x/net/context" -) - -var ( - // alpnProtoStr are the specified application level protocols for gRPC. - alpnProtoStr = []string{"h2"} -) - -// PerRPCCredentials defines the common interface for the credentials which need to -// attach security information to every RPC (e.g., oauth2). -type PerRPCCredentials interface { - // GetRequestMetadata gets the current request metadata, refreshing - // tokens if required. This should be called by the transport layer on - // each request, and the data should be populated in headers or other - // context. uri is the URI of the entry point for the request. When - // supported by the underlying implementation, ctx can be used for - // timeout and cancellation. - // TODO(zhaoq): Define the set of the qualified keys instead of leaving - // it as an arbitrary string. - GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) - // RequireTransportSecurity indicates whether the credentials requires - // transport security. - RequireTransportSecurity() bool -} - -// ProtocolInfo provides information regarding the gRPC wire protocol version, -// security protocol, security protocol version in use, server name, etc. -type ProtocolInfo struct { - // ProtocolVersion is the gRPC wire protocol version. - ProtocolVersion string - // SecurityProtocol is the security protocol in use. - SecurityProtocol string - // SecurityVersion is the security protocol version. - SecurityVersion string - // ServerName is the user-configured server name. - ServerName string -} - -// AuthInfo defines the common interface for the auth information the users are interested in. -type AuthInfo interface { - AuthType() string -} - -var ( - // ErrConnDispatched indicates that rawConn has been dispatched out of gRPC - // and the caller should not close rawConn. - ErrConnDispatched = errors.New("credentials: rawConn is dispatched out of gRPC") -) - -// TransportCredentials defines the common interface for all the live gRPC wire -// protocols and supported transport security protocols (e.g., TLS, SSL). -type TransportCredentials interface { - // ClientHandshake does the authentication handshake specified by the corresponding - // authentication protocol on rawConn for clients. It returns the authenticated - // connection and the corresponding auth information about the connection. - // Implementations must use the provided context to implement timely cancellation. - // gRPC will try to reconnect if the error returned is a temporary error - // (io.EOF, context.DeadlineExceeded or err.Temporary() == true). - // If the returned error is a wrapper error, implementations should make sure that - // the error implements Temporary() to have the correct retry behaviors. - ClientHandshake(context.Context, string, net.Conn) (net.Conn, AuthInfo, error) - // ServerHandshake does the authentication handshake for servers. It returns - // the authenticated connection and the corresponding auth information about - // the connection. - ServerHandshake(net.Conn) (net.Conn, AuthInfo, error) - // Info provides the ProtocolInfo of this TransportCredentials. - Info() ProtocolInfo - // Clone makes a copy of this TransportCredentials. - Clone() TransportCredentials - // OverrideServerName overrides the server name used to verify the hostname on the returned certificates from the server. - // gRPC internals also use it to override the virtual hosting name if it is set. - // It must be called before dialing. Currently, this is only used by grpclb. - OverrideServerName(string) error -} - -// TLSInfo contains the auth information for a TLS authenticated connection. -// It implements the AuthInfo interface. -type TLSInfo struct { - State tls.ConnectionState -} - -// AuthType returns the type of TLSInfo as a string. -func (t TLSInfo) AuthType() string { - return "tls" -} - -// tlsCreds is the credentials required for authenticating a connection using TLS. -type tlsCreds struct { - // TLS configuration - config *tls.Config -} - -func (c tlsCreds) Info() ProtocolInfo { - return ProtocolInfo{ - SecurityProtocol: "tls", - SecurityVersion: "1.2", - ServerName: c.config.ServerName, - } -} - -func (c *tlsCreds) ClientHandshake(ctx context.Context, addr string, rawConn net.Conn) (_ net.Conn, _ AuthInfo, err error) { - // use local cfg to avoid clobbering ServerName if using multiple endpoints - cfg := cloneTLSConfig(c.config) - if cfg.ServerName == "" { - colonPos := strings.LastIndex(addr, ":") - if colonPos == -1 { - colonPos = len(addr) - } - cfg.ServerName = addr[:colonPos] - } - conn := tls.Client(rawConn, cfg) - errChannel := make(chan error, 1) - go func() { - errChannel <- conn.Handshake() - }() - select { - case err := <-errChannel: - if err != nil { - return nil, nil, err - } - case <-ctx.Done(): - return nil, nil, ctx.Err() - } - return conn, TLSInfo{conn.ConnectionState()}, nil -} - -func (c *tlsCreds) ServerHandshake(rawConn net.Conn) (net.Conn, AuthInfo, error) { - conn := tls.Server(rawConn, c.config) - if err := conn.Handshake(); err != nil { - return nil, nil, err - } - return conn, TLSInfo{conn.ConnectionState()}, nil -} - -func (c *tlsCreds) Clone() TransportCredentials { - return NewTLS(c.config) -} - -func (c *tlsCreds) OverrideServerName(serverNameOverride string) error { - c.config.ServerName = serverNameOverride - return nil -} - -// NewTLS uses c to construct a TransportCredentials based on TLS. -func NewTLS(c *tls.Config) TransportCredentials { - tc := &tlsCreds{cloneTLSConfig(c)} - tc.config.NextProtos = alpnProtoStr - return tc -} - -// NewClientTLSFromCert constructs TLS credentials from the input certificate for client. -// serverNameOverride is for testing only. If set to a non empty string, -// it will override the virtual host name of authority (e.g. :authority header field) in requests. -func NewClientTLSFromCert(cp *x509.CertPool, serverNameOverride string) TransportCredentials { - return NewTLS(&tls.Config{ServerName: serverNameOverride, RootCAs: cp}) -} - -// NewClientTLSFromFile constructs TLS credentials from the input certificate file for client. -// serverNameOverride is for testing only. If set to a non empty string, -// it will override the virtual host name of authority (e.g. :authority header field) in requests. -func NewClientTLSFromFile(certFile, serverNameOverride string) (TransportCredentials, error) { - b, err := ioutil.ReadFile(certFile) - if err != nil { - return nil, err - } - cp := x509.NewCertPool() - if !cp.AppendCertsFromPEM(b) { - return nil, fmt.Errorf("credentials: failed to append certificates") - } - return NewTLS(&tls.Config{ServerName: serverNameOverride, RootCAs: cp}), nil -} - -// NewServerTLSFromCert constructs TLS credentials from the input certificate for server. -func NewServerTLSFromCert(cert *tls.Certificate) TransportCredentials { - return NewTLS(&tls.Config{Certificates: []tls.Certificate{*cert}}) -} - -// NewServerTLSFromFile constructs TLS credentials from the input certificate file and key -// file for server. -func NewServerTLSFromFile(certFile, keyFile string) (TransportCredentials, error) { - cert, err := tls.LoadX509KeyPair(certFile, keyFile) - if err != nil { - return nil, err - } - return NewTLS(&tls.Config{Certificates: []tls.Certificate{cert}}), nil -} diff --git a/vendor/google.golang.org/grpc/credentials/credentials_util_go17.go b/vendor/google.golang.org/grpc/credentials/credentials_util_go17.go deleted file mode 100644 index 7597b09e3..000000000 --- a/vendor/google.golang.org/grpc/credentials/credentials_util_go17.go +++ /dev/null @@ -1,75 +0,0 @@ -// +build go1.7 -// +build !go1.8 - -/* - * - * Copyright 2016, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT - * OWNER 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. - * - */ - -package credentials - -import ( - "crypto/tls" -) - -// cloneTLSConfig returns a shallow clone of the exported -// fields of cfg, ignoring the unexported sync.Once, which -// contains a mutex and must not be copied. -// -// If cfg is nil, a new zero tls.Config is returned. -func cloneTLSConfig(cfg *tls.Config) *tls.Config { - if cfg == nil { - return &tls.Config{} - } - return &tls.Config{ - Rand: cfg.Rand, - Time: cfg.Time, - Certificates: cfg.Certificates, - NameToCertificate: cfg.NameToCertificate, - GetCertificate: cfg.GetCertificate, - RootCAs: cfg.RootCAs, - NextProtos: cfg.NextProtos, - ServerName: cfg.ServerName, - ClientAuth: cfg.ClientAuth, - ClientCAs: cfg.ClientCAs, - InsecureSkipVerify: cfg.InsecureSkipVerify, - CipherSuites: cfg.CipherSuites, - PreferServerCipherSuites: cfg.PreferServerCipherSuites, - SessionTicketsDisabled: cfg.SessionTicketsDisabled, - SessionTicketKey: cfg.SessionTicketKey, - ClientSessionCache: cfg.ClientSessionCache, - MinVersion: cfg.MinVersion, - MaxVersion: cfg.MaxVersion, - CurvePreferences: cfg.CurvePreferences, - DynamicRecordSizingDisabled: cfg.DynamicRecordSizingDisabled, - Renegotiation: cfg.Renegotiation, - } -} diff --git a/vendor/google.golang.org/grpc/credentials/credentials_util_go18.go b/vendor/google.golang.org/grpc/credentials/credentials_util_go18.go deleted file mode 100644 index 0ecf342da..000000000 --- a/vendor/google.golang.org/grpc/credentials/credentials_util_go18.go +++ /dev/null @@ -1,53 +0,0 @@ -// +build go1.8 - -/* - * - * Copyright 2017, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT - * OWNER 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. - * - */ - -package credentials - -import ( - "crypto/tls" -) - -// cloneTLSConfig returns a shallow clone of the exported -// fields of cfg, ignoring the unexported sync.Once, which -// contains a mutex and must not be copied. -// -// If cfg is nil, a new zero tls.Config is returned. -func cloneTLSConfig(cfg *tls.Config) *tls.Config { - if cfg == nil { - return &tls.Config{} - } - - return cfg.Clone() -} diff --git a/vendor/google.golang.org/grpc/credentials/credentials_util_pre_go17.go b/vendor/google.golang.org/grpc/credentials/credentials_util_pre_go17.go deleted file mode 100644 index cfd40dfa3..000000000 --- a/vendor/google.golang.org/grpc/credentials/credentials_util_pre_go17.go +++ /dev/null @@ -1,72 +0,0 @@ -// +build !go1.7 - -/* - * - * Copyright 2016, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT - * OWNER 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. - * - */ - -package credentials - -import ( - "crypto/tls" -) - -// cloneTLSConfig returns a shallow clone of the exported -// fields of cfg, ignoring the unexported sync.Once, which -// contains a mutex and must not be copied. -// -// If cfg is nil, a new zero tls.Config is returned. -func cloneTLSConfig(cfg *tls.Config) *tls.Config { - if cfg == nil { - return &tls.Config{} - } - return &tls.Config{ - Rand: cfg.Rand, - Time: cfg.Time, - Certificates: cfg.Certificates, - NameToCertificate: cfg.NameToCertificate, - GetCertificate: cfg.GetCertificate, - RootCAs: cfg.RootCAs, - NextProtos: cfg.NextProtos, - ServerName: cfg.ServerName, - ClientAuth: cfg.ClientAuth, - ClientCAs: cfg.ClientCAs, - InsecureSkipVerify: cfg.InsecureSkipVerify, - CipherSuites: cfg.CipherSuites, - PreferServerCipherSuites: cfg.PreferServerCipherSuites, - SessionTicketsDisabled: cfg.SessionTicketsDisabled, - SessionTicketKey: cfg.SessionTicketKey, - ClientSessionCache: cfg.ClientSessionCache, - MinVersion: cfg.MinVersion, - MaxVersion: cfg.MaxVersion, - CurvePreferences: cfg.CurvePreferences, - } -} diff --git a/vendor/google.golang.org/grpc/doc.go b/vendor/google.golang.org/grpc/doc.go deleted file mode 100644 index a35f21885..000000000 --- a/vendor/google.golang.org/grpc/doc.go +++ /dev/null @@ -1,6 +0,0 @@ -/* -Package grpc implements an RPC system called gRPC. - -See www.grpc.io for more information about gRPC. -*/ -package grpc // import "google.golang.org/grpc" diff --git a/vendor/google.golang.org/grpc/go16.go b/vendor/google.golang.org/grpc/go16.go deleted file mode 100644 index eb4020334..000000000 --- a/vendor/google.golang.org/grpc/go16.go +++ /dev/null @@ -1,113 +0,0 @@ -// +build go1.6,!go1.7 - -/* - * Copyright 2016, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT - * OWNER 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. - * - */ - -package grpc - -import ( - "fmt" - "io" - "net" - "net/http" - "os" - - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" - "google.golang.org/grpc/transport" - - "golang.org/x/net/context" -) - -// dialContext connects to the address on the named network. -func dialContext(ctx context.Context, network, address string) (net.Conn, error) { - return (&net.Dialer{Cancel: ctx.Done()}).Dial(network, address) -} - -func sendHTTPRequest(ctx context.Context, req *http.Request, conn net.Conn) error { - req.Cancel = ctx.Done() - if err := req.Write(conn); err != nil { - return fmt.Errorf("failed to write the HTTP request: %v", err) - } - return nil -} - -// toRPCErr converts an error into an error from the status package. -func toRPCErr(err error) error { - if _, ok := status.FromError(err); ok { - return err - } - switch e := err.(type) { - case transport.StreamError: - return status.Error(e.Code, e.Desc) - case transport.ConnectionError: - return status.Error(codes.Internal, e.Desc) - default: - switch err { - case context.DeadlineExceeded: - return status.Error(codes.DeadlineExceeded, err.Error()) - case context.Canceled: - return status.Error(codes.Canceled, err.Error()) - case ErrClientConnClosing: - return status.Error(codes.FailedPrecondition, err.Error()) - } - } - return status.Error(codes.Unknown, err.Error()) -} - -// convertCode converts a standard Go error into its canonical code. Note that -// this is only used to translate the error returned by the server applications. -func convertCode(err error) codes.Code { - switch err { - case nil: - return codes.OK - case io.EOF: - return codes.OutOfRange - case io.ErrClosedPipe, io.ErrNoProgress, io.ErrShortBuffer, io.ErrShortWrite, io.ErrUnexpectedEOF: - return codes.FailedPrecondition - case os.ErrInvalid: - return codes.InvalidArgument - case context.Canceled: - return codes.Canceled - case context.DeadlineExceeded: - return codes.DeadlineExceeded - } - switch { - case os.IsExist(err): - return codes.AlreadyExists - case os.IsNotExist(err): - return codes.NotFound - case os.IsPermission(err): - return codes.PermissionDenied - } - return codes.Unknown -} diff --git a/vendor/google.golang.org/grpc/go17.go b/vendor/google.golang.org/grpc/go17.go deleted file mode 100644 index b9eb781d1..000000000 --- a/vendor/google.golang.org/grpc/go17.go +++ /dev/null @@ -1,113 +0,0 @@ -// +build go1.7 - -/* - * Copyright 2016, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT - * OWNER 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. - * - */ - -package grpc - -import ( - "context" - "io" - "net" - "net/http" - "os" - - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" - "google.golang.org/grpc/transport" - - netctx "golang.org/x/net/context" -) - -// dialContext connects to the address on the named network. -func dialContext(ctx context.Context, network, address string) (net.Conn, error) { - return (&net.Dialer{}).DialContext(ctx, network, address) -} - -func sendHTTPRequest(ctx context.Context, req *http.Request, conn net.Conn) error { - req = req.WithContext(ctx) - if err := req.Write(conn); err != nil { - return err - } - return nil -} - -// toRPCErr converts an error into an error from the status package. -func toRPCErr(err error) error { - if _, ok := status.FromError(err); ok { - return err - } - switch e := err.(type) { - case transport.StreamError: - return status.Error(e.Code, e.Desc) - case transport.ConnectionError: - return status.Error(codes.Internal, e.Desc) - default: - switch err { - case context.DeadlineExceeded, netctx.DeadlineExceeded: - return status.Error(codes.DeadlineExceeded, err.Error()) - case context.Canceled, netctx.Canceled: - return status.Error(codes.Canceled, err.Error()) - case ErrClientConnClosing: - return status.Error(codes.FailedPrecondition, err.Error()) - } - } - return status.Error(codes.Unknown, err.Error()) -} - -// convertCode converts a standard Go error into its canonical code. Note that -// this is only used to translate the error returned by the server applications. -func convertCode(err error) codes.Code { - switch err { - case nil: - return codes.OK - case io.EOF: - return codes.OutOfRange - case io.ErrClosedPipe, io.ErrNoProgress, io.ErrShortBuffer, io.ErrShortWrite, io.ErrUnexpectedEOF: - return codes.FailedPrecondition - case os.ErrInvalid: - return codes.InvalidArgument - case context.Canceled, netctx.Canceled: - return codes.Canceled - case context.DeadlineExceeded, netctx.DeadlineExceeded: - return codes.DeadlineExceeded - } - switch { - case os.IsExist(err): - return codes.AlreadyExists - case os.IsNotExist(err): - return codes.NotFound - case os.IsPermission(err): - return codes.PermissionDenied - } - return codes.Unknown -} diff --git a/vendor/google.golang.org/grpc/grpclb.go b/vendor/google.golang.org/grpc/grpclb.go deleted file mode 100644 index 8638fc92a..000000000 --- a/vendor/google.golang.org/grpc/grpclb.go +++ /dev/null @@ -1,765 +0,0 @@ -/* - * - * Copyright 2016, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT - * OWNER 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. - * - */ - -package grpc - -import ( - "errors" - "fmt" - "math/rand" - "net" - "sync" - "time" - - "golang.org/x/net/context" - "google.golang.org/grpc/codes" - lbpb "google.golang.org/grpc/grpclb/grpc_lb_v1" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/naming" -) - -// Client API for LoadBalancer service. -// Mostly copied from generated pb.go file. -// To avoid circular dependency. -type loadBalancerClient struct { - cc *ClientConn -} - -func (c *loadBalancerClient) BalanceLoad(ctx context.Context, opts ...CallOption) (*balanceLoadClientStream, error) { - desc := &StreamDesc{ - StreamName: "BalanceLoad", - ServerStreams: true, - ClientStreams: true, - } - stream, err := NewClientStream(ctx, desc, c.cc, "/grpc.lb.v1.LoadBalancer/BalanceLoad", opts...) - if err != nil { - return nil, err - } - x := &balanceLoadClientStream{stream} - return x, nil -} - -type balanceLoadClientStream struct { - ClientStream -} - -func (x *balanceLoadClientStream) Send(m *lbpb.LoadBalanceRequest) error { - return x.ClientStream.SendMsg(m) -} - -func (x *balanceLoadClientStream) Recv() (*lbpb.LoadBalanceResponse, error) { - m := new(lbpb.LoadBalanceResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -// AddressType indicates the address type returned by name resolution. -type AddressType uint8 - -const ( - // Backend indicates the server is a backend server. - Backend AddressType = iota - // GRPCLB indicates the server is a grpclb load balancer. - GRPCLB -) - -// AddrMetadataGRPCLB contains the information the name resolver for grpclb should provide. The -// name resolver used by the grpclb balancer is required to provide this type of metadata in -// its address updates. -type AddrMetadataGRPCLB struct { - // AddrType is the type of server (grpc load balancer or backend). - AddrType AddressType - // ServerName is the name of the grpc load balancer. Used for authentication. - ServerName string -} - -// NewGRPCLBBalancer creates a grpclb load balancer. -func NewGRPCLBBalancer(r naming.Resolver) Balancer { - return &balancer{ - r: r, - } -} - -type remoteBalancerInfo struct { - addr string - // the server name used for authentication with the remote LB server. - name string -} - -// grpclbAddrInfo consists of the information of a backend server. -type grpclbAddrInfo struct { - addr Address - connected bool - // dropForRateLimiting indicates whether this particular request should be - // dropped by the client for rate limiting. - dropForRateLimiting bool - // dropForLoadBalancing indicates whether this particular request should be - // dropped by the client for load balancing. - dropForLoadBalancing bool -} - -type balancer struct { - r naming.Resolver - target string - mu sync.Mutex - seq int // a sequence number to make sure addrCh does not get stale addresses. - w naming.Watcher - addrCh chan []Address - rbs []remoteBalancerInfo - addrs []*grpclbAddrInfo - next int - waitCh chan struct{} - done bool - expTimer *time.Timer - rand *rand.Rand - - clientStats lbpb.ClientStats -} - -func (b *balancer) watchAddrUpdates(w naming.Watcher, ch chan []remoteBalancerInfo) error { - updates, err := w.Next() - if err != nil { - grpclog.Printf("grpclb: failed to get next addr update from watcher: %v", err) - return err - } - b.mu.Lock() - defer b.mu.Unlock() - if b.done { - return ErrClientConnClosing - } - for _, update := range updates { - switch update.Op { - case naming.Add: - var exist bool - for _, v := range b.rbs { - // TODO: Is the same addr with different server name a different balancer? - if update.Addr == v.addr { - exist = true - break - } - } - if exist { - continue - } - md, ok := update.Metadata.(*AddrMetadataGRPCLB) - if !ok { - // TODO: Revisit the handling here and may introduce some fallback mechanism. - grpclog.Printf("The name resolution contains unexpected metadata %v", update.Metadata) - continue - } - switch md.AddrType { - case Backend: - // TODO: Revisit the handling here and may introduce some fallback mechanism. - grpclog.Printf("The name resolution does not give grpclb addresses") - continue - case GRPCLB: - b.rbs = append(b.rbs, remoteBalancerInfo{ - addr: update.Addr, - name: md.ServerName, - }) - default: - grpclog.Printf("Received unknow address type %d", md.AddrType) - continue - } - case naming.Delete: - for i, v := range b.rbs { - if update.Addr == v.addr { - copy(b.rbs[i:], b.rbs[i+1:]) - b.rbs = b.rbs[:len(b.rbs)-1] - break - } - } - default: - grpclog.Println("Unknown update.Op ", update.Op) - } - } - // TODO: Fall back to the basic round-robin load balancing if the resulting address is - // not a load balancer. - select { - case <-ch: - default: - } - ch <- b.rbs - return nil -} - -func (b *balancer) serverListExpire(seq int) { - b.mu.Lock() - defer b.mu.Unlock() - // TODO: gRPC interanls do not clear the connections when the server list is stale. - // This means RPCs will keep using the existing server list until b receives new - // server list even though the list is expired. Revisit this behavior later. - if b.done || seq < b.seq { - return - } - b.next = 0 - b.addrs = nil - // Ask grpc internals to close all the corresponding connections. - b.addrCh <- nil -} - -func convertDuration(d *lbpb.Duration) time.Duration { - if d == nil { - return 0 - } - return time.Duration(d.Seconds)*time.Second + time.Duration(d.Nanos)*time.Nanosecond -} - -func (b *balancer) processServerList(l *lbpb.ServerList, seq int) { - if l == nil { - return - } - servers := l.GetServers() - expiration := convertDuration(l.GetExpirationInterval()) - var ( - sl []*grpclbAddrInfo - addrs []Address - ) - for _, s := range servers { - md := metadata.Pairs("lb-token", s.LoadBalanceToken) - addr := Address{ - Addr: fmt.Sprintf("%s:%d", net.IP(s.IpAddress), s.Port), - Metadata: &md, - } - sl = append(sl, &grpclbAddrInfo{ - addr: addr, - dropForRateLimiting: s.DropForRateLimiting, - dropForLoadBalancing: s.DropForLoadBalancing, - }) - addrs = append(addrs, addr) - } - b.mu.Lock() - defer b.mu.Unlock() - if b.done || seq < b.seq { - return - } - if len(sl) > 0 { - // reset b.next to 0 when replacing the server list. - b.next = 0 - b.addrs = sl - b.addrCh <- addrs - if b.expTimer != nil { - b.expTimer.Stop() - b.expTimer = nil - } - if expiration > 0 { - b.expTimer = time.AfterFunc(expiration, func() { - b.serverListExpire(seq) - }) - } - } - return -} - -func (b *balancer) sendLoadReport(s *balanceLoadClientStream, interval time.Duration, done <-chan struct{}) { - ticker := time.NewTicker(interval) - defer ticker.Stop() - for { - select { - case <-ticker.C: - case <-done: - return - } - b.mu.Lock() - stats := b.clientStats - b.clientStats = lbpb.ClientStats{} // Clear the stats. - b.mu.Unlock() - t := time.Now() - stats.Timestamp = &lbpb.Timestamp{ - Seconds: t.Unix(), - Nanos: int32(t.Nanosecond()), - } - if err := s.Send(&lbpb.LoadBalanceRequest{ - LoadBalanceRequestType: &lbpb.LoadBalanceRequest_ClientStats{ - ClientStats: &stats, - }, - }); err != nil { - grpclog.Printf("grpclb: failed to send load report: %v", err) - return - } - } -} - -func (b *balancer) callRemoteBalancer(lbc *loadBalancerClient, seq int) (retry bool) { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - stream, err := lbc.BalanceLoad(ctx) - if err != nil { - grpclog.Printf("grpclb: failed to perform RPC to the remote balancer %v", err) - return - } - b.mu.Lock() - if b.done { - b.mu.Unlock() - return - } - b.mu.Unlock() - initReq := &lbpb.LoadBalanceRequest{ - LoadBalanceRequestType: &lbpb.LoadBalanceRequest_InitialRequest{ - InitialRequest: &lbpb.InitialLoadBalanceRequest{ - Name: b.target, - }, - }, - } - if err := stream.Send(initReq); err != nil { - grpclog.Printf("grpclb: failed to send init request: %v", err) - // TODO: backoff on retry? - return true - } - reply, err := stream.Recv() - if err != nil { - grpclog.Printf("grpclb: failed to recv init response: %v", err) - // TODO: backoff on retry? - return true - } - initResp := reply.GetInitialResponse() - if initResp == nil { - grpclog.Println("grpclb: reply from remote balancer did not include initial response.") - return - } - // TODO: Support delegation. - if initResp.LoadBalancerDelegate != "" { - // delegation - grpclog.Println("TODO: Delegation is not supported yet.") - return - } - streamDone := make(chan struct{}) - defer close(streamDone) - b.mu.Lock() - b.clientStats = lbpb.ClientStats{} // Clear client stats. - b.mu.Unlock() - if d := convertDuration(initResp.ClientStatsReportInterval); d > 0 { - go b.sendLoadReport(stream, d, streamDone) - } - // Retrieve the server list. - for { - reply, err := stream.Recv() - if err != nil { - grpclog.Printf("grpclb: failed to recv server list: %v", err) - break - } - b.mu.Lock() - if b.done || seq < b.seq { - b.mu.Unlock() - return - } - b.seq++ // tick when receiving a new list of servers. - seq = b.seq - b.mu.Unlock() - if serverList := reply.GetServerList(); serverList != nil { - b.processServerList(serverList, seq) - } - } - return true -} - -func (b *balancer) Start(target string, config BalancerConfig) error { - b.rand = rand.New(rand.NewSource(time.Now().Unix())) - // TODO: Fall back to the basic direct connection if there is no name resolver. - if b.r == nil { - return errors.New("there is no name resolver installed") - } - b.target = target - b.mu.Lock() - if b.done { - b.mu.Unlock() - return ErrClientConnClosing - } - b.addrCh = make(chan []Address) - w, err := b.r.Resolve(target) - if err != nil { - b.mu.Unlock() - grpclog.Printf("grpclb: failed to resolve address: %v, err: %v", target, err) - return err - } - b.w = w - b.mu.Unlock() - balancerAddrsCh := make(chan []remoteBalancerInfo, 1) - // Spawn a goroutine to monitor the name resolution of remote load balancer. - go func() { - for { - if err := b.watchAddrUpdates(w, balancerAddrsCh); err != nil { - grpclog.Printf("grpclb: the naming watcher stops working due to %v.\n", err) - close(balancerAddrsCh) - return - } - } - }() - // Spawn a goroutine to talk to the remote load balancer. - go func() { - var ( - cc *ClientConn - // ccError is closed when there is an error in the current cc. - // A new rb should be picked from rbs and connected. - ccError chan struct{} - rb *remoteBalancerInfo - rbs []remoteBalancerInfo - rbIdx int - ) - - defer func() { - if ccError != nil { - select { - case <-ccError: - default: - close(ccError) - } - } - if cc != nil { - cc.Close() - } - }() - - for { - var ok bool - select { - case rbs, ok = <-balancerAddrsCh: - if !ok { - return - } - foundIdx := -1 - if rb != nil { - for i, trb := range rbs { - if trb == *rb { - foundIdx = i - break - } - } - } - if foundIdx >= 0 { - if foundIdx >= 1 { - // Move the address in use to the beginning of the list. - b.rbs[0], b.rbs[foundIdx] = b.rbs[foundIdx], b.rbs[0] - rbIdx = 0 - } - continue // If found, don't dial new cc. - } else if len(rbs) > 0 { - // Pick a random one from the list, instead of always using the first one. - if l := len(rbs); l > 1 && rb != nil { - tmpIdx := b.rand.Intn(l - 1) - b.rbs[0], b.rbs[tmpIdx] = b.rbs[tmpIdx], b.rbs[0] - } - rbIdx = 0 - rb = &rbs[0] - } else { - // foundIdx < 0 && len(rbs) <= 0. - rb = nil - } - case <-ccError: - ccError = nil - if rbIdx < len(rbs)-1 { - rbIdx++ - rb = &rbs[rbIdx] - } else { - rb = nil - } - } - - if rb == nil { - continue - } - - if cc != nil { - cc.Close() - } - // Talk to the remote load balancer to get the server list. - var ( - err error - dopts []DialOption - ) - if creds := config.DialCreds; creds != nil { - if rb.name != "" { - if err := creds.OverrideServerName(rb.name); err != nil { - grpclog.Printf("grpclb: failed to override the server name in the credentials: %v", err) - continue - } - } - dopts = append(dopts, WithTransportCredentials(creds)) - } else { - dopts = append(dopts, WithInsecure()) - } - if dialer := config.Dialer; dialer != nil { - // WithDialer takes a different type of function, so we instead use a special DialOption here. - dopts = append(dopts, func(o *dialOptions) { o.copts.Dialer = dialer }) - } - ccError = make(chan struct{}) - cc, err = Dial(rb.addr, dopts...) - if err != nil { - grpclog.Printf("grpclb: failed to setup a connection to the remote balancer %v: %v", rb.addr, err) - close(ccError) - continue - } - b.mu.Lock() - b.seq++ // tick when getting a new balancer address - seq := b.seq - b.next = 0 - b.mu.Unlock() - go func(cc *ClientConn, ccError chan struct{}) { - lbc := &loadBalancerClient{cc} - b.callRemoteBalancer(lbc, seq) - cc.Close() - select { - case <-ccError: - default: - close(ccError) - } - }(cc, ccError) - } - }() - return nil -} - -func (b *balancer) down(addr Address, err error) { - b.mu.Lock() - defer b.mu.Unlock() - for _, a := range b.addrs { - if addr == a.addr { - a.connected = false - break - } - } -} - -func (b *balancer) Up(addr Address) func(error) { - b.mu.Lock() - defer b.mu.Unlock() - if b.done { - return nil - } - var cnt int - for _, a := range b.addrs { - if a.addr == addr { - if a.connected { - return nil - } - a.connected = true - } - if a.connected && !a.dropForRateLimiting && !a.dropForLoadBalancing { - cnt++ - } - } - // addr is the only one which is connected. Notify the Get() callers who are blocking. - if cnt == 1 && b.waitCh != nil { - close(b.waitCh) - b.waitCh = nil - } - return func(err error) { - b.down(addr, err) - } -} - -func (b *balancer) Get(ctx context.Context, opts BalancerGetOptions) (addr Address, put func(), err error) { - var ch chan struct{} - b.mu.Lock() - if b.done { - b.mu.Unlock() - err = ErrClientConnClosing - return - } - seq := b.seq - - defer func() { - if err != nil { - return - } - put = func() { - s, ok := rpcInfoFromContext(ctx) - if !ok { - return - } - b.mu.Lock() - defer b.mu.Unlock() - if b.done || seq < b.seq { - return - } - b.clientStats.NumCallsFinished++ - if !s.bytesSent { - b.clientStats.NumCallsFinishedWithClientFailedToSend++ - } else if s.bytesReceived { - b.clientStats.NumCallsFinishedKnownReceived++ - } - } - }() - - b.clientStats.NumCallsStarted++ - if len(b.addrs) > 0 { - if b.next >= len(b.addrs) { - b.next = 0 - } - next := b.next - for { - a := b.addrs[next] - next = (next + 1) % len(b.addrs) - if a.connected { - if !a.dropForRateLimiting && !a.dropForLoadBalancing { - addr = a.addr - b.next = next - b.mu.Unlock() - return - } - if !opts.BlockingWait { - b.next = next - if a.dropForLoadBalancing { - b.clientStats.NumCallsFinished++ - b.clientStats.NumCallsFinishedWithDropForLoadBalancing++ - } else if a.dropForRateLimiting { - b.clientStats.NumCallsFinished++ - b.clientStats.NumCallsFinishedWithDropForRateLimiting++ - } - b.mu.Unlock() - err = Errorf(codes.Unavailable, "%s drops requests", a.addr.Addr) - return - } - } - if next == b.next { - // Has iterated all the possible address but none is connected. - break - } - } - } - if !opts.BlockingWait { - if len(b.addrs) == 0 { - b.clientStats.NumCallsFinished++ - b.clientStats.NumCallsFinishedWithClientFailedToSend++ - b.mu.Unlock() - err = Errorf(codes.Unavailable, "there is no address available") - return - } - // Returns the next addr on b.addrs for a failfast RPC. - addr = b.addrs[b.next].addr - b.next++ - b.mu.Unlock() - return - } - // Wait on b.waitCh for non-failfast RPCs. - if b.waitCh == nil { - ch = make(chan struct{}) - b.waitCh = ch - } else { - ch = b.waitCh - } - b.mu.Unlock() - for { - select { - case <-ctx.Done(): - b.mu.Lock() - b.clientStats.NumCallsFinished++ - b.clientStats.NumCallsFinishedWithClientFailedToSend++ - b.mu.Unlock() - err = ctx.Err() - return - case <-ch: - b.mu.Lock() - if b.done { - b.clientStats.NumCallsFinished++ - b.clientStats.NumCallsFinishedWithClientFailedToSend++ - b.mu.Unlock() - err = ErrClientConnClosing - return - } - - if len(b.addrs) > 0 { - if b.next >= len(b.addrs) { - b.next = 0 - } - next := b.next - for { - a := b.addrs[next] - next = (next + 1) % len(b.addrs) - if a.connected { - if !a.dropForRateLimiting && !a.dropForLoadBalancing { - addr = a.addr - b.next = next - b.mu.Unlock() - return - } - if !opts.BlockingWait { - b.next = next - if a.dropForLoadBalancing { - b.clientStats.NumCallsFinished++ - b.clientStats.NumCallsFinishedWithDropForLoadBalancing++ - } else if a.dropForRateLimiting { - b.clientStats.NumCallsFinished++ - b.clientStats.NumCallsFinishedWithDropForRateLimiting++ - } - b.mu.Unlock() - err = Errorf(codes.Unavailable, "drop requests for the addreess %s", a.addr.Addr) - return - } - } - if next == b.next { - // Has iterated all the possible address but none is connected. - break - } - } - } - // The newly added addr got removed by Down() again. - if b.waitCh == nil { - ch = make(chan struct{}) - b.waitCh = ch - } else { - ch = b.waitCh - } - b.mu.Unlock() - } - } -} - -func (b *balancer) Notify() <-chan []Address { - return b.addrCh -} - -func (b *balancer) Close() error { - b.mu.Lock() - defer b.mu.Unlock() - if b.done { - return errBalancerClosed - } - b.done = true - if b.expTimer != nil { - b.expTimer.Stop() - } - if b.waitCh != nil { - close(b.waitCh) - } - if b.addrCh != nil { - close(b.addrCh) - } - if b.w != nil { - b.w.Close() - } - return nil -} diff --git a/vendor/google.golang.org/grpc/grpclb/grpc_lb_v1/grpclb.pb.go b/vendor/google.golang.org/grpc/grpclb/grpc_lb_v1/grpclb.pb.go deleted file mode 100644 index f63941bd8..000000000 --- a/vendor/google.golang.org/grpc/grpclb/grpc_lb_v1/grpclb.pb.go +++ /dev/null @@ -1,629 +0,0 @@ -// Code generated by protoc-gen-go. -// source: grpclb.proto -// DO NOT EDIT! - -/* -Package grpc_lb_v1 is a generated protocol buffer package. - -It is generated from these files: - grpclb.proto - -It has these top-level messages: - Duration - Timestamp - LoadBalanceRequest - InitialLoadBalanceRequest - ClientStats - LoadBalanceResponse - InitialLoadBalanceResponse - ServerList - Server -*/ -package grpc_lb_v1 - -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package - -type Duration struct { - // Signed seconds of the span of time. Must be from -315,576,000,000 - // to +315,576,000,000 inclusive. - Seconds int64 `protobuf:"varint,1,opt,name=seconds" json:"seconds,omitempty"` - // Signed fractions of a second at nanosecond resolution of the span - // of time. Durations less than one second are represented with a 0 - // `seconds` field and a positive or negative `nanos` field. For durations - // of one second or more, a non-zero value for the `nanos` field must be - // of the same sign as the `seconds` field. Must be from -999,999,999 - // to +999,999,999 inclusive. - Nanos int32 `protobuf:"varint,2,opt,name=nanos" json:"nanos,omitempty"` -} - -func (m *Duration) Reset() { *m = Duration{} } -func (m *Duration) String() string { return proto.CompactTextString(m) } -func (*Duration) ProtoMessage() {} -func (*Duration) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } - -func (m *Duration) GetSeconds() int64 { - if m != nil { - return m.Seconds - } - return 0 -} - -func (m *Duration) GetNanos() int32 { - if m != nil { - return m.Nanos - } - return 0 -} - -type Timestamp struct { - // Represents seconds of UTC time since Unix epoch - // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to - // 9999-12-31T23:59:59Z inclusive. - Seconds int64 `protobuf:"varint,1,opt,name=seconds" json:"seconds,omitempty"` - // Non-negative fractions of a second at nanosecond resolution. Negative - // second values with fractions must still have non-negative nanos values - // that count forward in time. Must be from 0 to 999,999,999 - // inclusive. - Nanos int32 `protobuf:"varint,2,opt,name=nanos" json:"nanos,omitempty"` -} - -func (m *Timestamp) Reset() { *m = Timestamp{} } -func (m *Timestamp) String() string { return proto.CompactTextString(m) } -func (*Timestamp) ProtoMessage() {} -func (*Timestamp) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } - -func (m *Timestamp) GetSeconds() int64 { - if m != nil { - return m.Seconds - } - return 0 -} - -func (m *Timestamp) GetNanos() int32 { - if m != nil { - return m.Nanos - } - return 0 -} - -type LoadBalanceRequest struct { - // Types that are valid to be assigned to LoadBalanceRequestType: - // *LoadBalanceRequest_InitialRequest - // *LoadBalanceRequest_ClientStats - LoadBalanceRequestType isLoadBalanceRequest_LoadBalanceRequestType `protobuf_oneof:"load_balance_request_type"` -} - -func (m *LoadBalanceRequest) Reset() { *m = LoadBalanceRequest{} } -func (m *LoadBalanceRequest) String() string { return proto.CompactTextString(m) } -func (*LoadBalanceRequest) ProtoMessage() {} -func (*LoadBalanceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } - -type isLoadBalanceRequest_LoadBalanceRequestType interface { - isLoadBalanceRequest_LoadBalanceRequestType() -} - -type LoadBalanceRequest_InitialRequest struct { - InitialRequest *InitialLoadBalanceRequest `protobuf:"bytes,1,opt,name=initial_request,json=initialRequest,oneof"` -} -type LoadBalanceRequest_ClientStats struct { - ClientStats *ClientStats `protobuf:"bytes,2,opt,name=client_stats,json=clientStats,oneof"` -} - -func (*LoadBalanceRequest_InitialRequest) isLoadBalanceRequest_LoadBalanceRequestType() {} -func (*LoadBalanceRequest_ClientStats) isLoadBalanceRequest_LoadBalanceRequestType() {} - -func (m *LoadBalanceRequest) GetLoadBalanceRequestType() isLoadBalanceRequest_LoadBalanceRequestType { - if m != nil { - return m.LoadBalanceRequestType - } - return nil -} - -func (m *LoadBalanceRequest) GetInitialRequest() *InitialLoadBalanceRequest { - if x, ok := m.GetLoadBalanceRequestType().(*LoadBalanceRequest_InitialRequest); ok { - return x.InitialRequest - } - return nil -} - -func (m *LoadBalanceRequest) GetClientStats() *ClientStats { - if x, ok := m.GetLoadBalanceRequestType().(*LoadBalanceRequest_ClientStats); ok { - return x.ClientStats - } - return nil -} - -// XXX_OneofFuncs is for the internal use of the proto package. -func (*LoadBalanceRequest) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { - return _LoadBalanceRequest_OneofMarshaler, _LoadBalanceRequest_OneofUnmarshaler, _LoadBalanceRequest_OneofSizer, []interface{}{ - (*LoadBalanceRequest_InitialRequest)(nil), - (*LoadBalanceRequest_ClientStats)(nil), - } -} - -func _LoadBalanceRequest_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { - m := msg.(*LoadBalanceRequest) - // load_balance_request_type - switch x := m.LoadBalanceRequestType.(type) { - case *LoadBalanceRequest_InitialRequest: - b.EncodeVarint(1<<3 | proto.WireBytes) - if err := b.EncodeMessage(x.InitialRequest); err != nil { - return err - } - case *LoadBalanceRequest_ClientStats: - b.EncodeVarint(2<<3 | proto.WireBytes) - if err := b.EncodeMessage(x.ClientStats); err != nil { - return err - } - case nil: - default: - return fmt.Errorf("LoadBalanceRequest.LoadBalanceRequestType has unexpected type %T", x) - } - return nil -} - -func _LoadBalanceRequest_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { - m := msg.(*LoadBalanceRequest) - switch tag { - case 1: // load_balance_request_type.initial_request - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - msg := new(InitialLoadBalanceRequest) - err := b.DecodeMessage(msg) - m.LoadBalanceRequestType = &LoadBalanceRequest_InitialRequest{msg} - return true, err - case 2: // load_balance_request_type.client_stats - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - msg := new(ClientStats) - err := b.DecodeMessage(msg) - m.LoadBalanceRequestType = &LoadBalanceRequest_ClientStats{msg} - return true, err - default: - return false, nil - } -} - -func _LoadBalanceRequest_OneofSizer(msg proto.Message) (n int) { - m := msg.(*LoadBalanceRequest) - // load_balance_request_type - switch x := m.LoadBalanceRequestType.(type) { - case *LoadBalanceRequest_InitialRequest: - s := proto.Size(x.InitialRequest) - n += proto.SizeVarint(1<<3 | proto.WireBytes) - n += proto.SizeVarint(uint64(s)) - n += s - case *LoadBalanceRequest_ClientStats: - s := proto.Size(x.ClientStats) - n += proto.SizeVarint(2<<3 | proto.WireBytes) - n += proto.SizeVarint(uint64(s)) - n += s - case nil: - default: - panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) - } - return n -} - -type InitialLoadBalanceRequest struct { - // Name of load balanced service (IE, balancer.service.com) - // length should be less than 256 bytes. - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` -} - -func (m *InitialLoadBalanceRequest) Reset() { *m = InitialLoadBalanceRequest{} } -func (m *InitialLoadBalanceRequest) String() string { return proto.CompactTextString(m) } -func (*InitialLoadBalanceRequest) ProtoMessage() {} -func (*InitialLoadBalanceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } - -func (m *InitialLoadBalanceRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// Contains client level statistics that are useful to load balancing. Each -// count except the timestamp should be reset to zero after reporting the stats. -type ClientStats struct { - // The timestamp of generating the report. - Timestamp *Timestamp `protobuf:"bytes,1,opt,name=timestamp" json:"timestamp,omitempty"` - // The total number of RPCs that started. - NumCallsStarted int64 `protobuf:"varint,2,opt,name=num_calls_started,json=numCallsStarted" json:"num_calls_started,omitempty"` - // The total number of RPCs that finished. - NumCallsFinished int64 `protobuf:"varint,3,opt,name=num_calls_finished,json=numCallsFinished" json:"num_calls_finished,omitempty"` - // The total number of RPCs that were dropped by the client because of rate - // limiting. - NumCallsFinishedWithDropForRateLimiting int64 `protobuf:"varint,4,opt,name=num_calls_finished_with_drop_for_rate_limiting,json=numCallsFinishedWithDropForRateLimiting" json:"num_calls_finished_with_drop_for_rate_limiting,omitempty"` - // The total number of RPCs that were dropped by the client because of load - // balancing. - NumCallsFinishedWithDropForLoadBalancing int64 `protobuf:"varint,5,opt,name=num_calls_finished_with_drop_for_load_balancing,json=numCallsFinishedWithDropForLoadBalancing" json:"num_calls_finished_with_drop_for_load_balancing,omitempty"` - // The total number of RPCs that failed to reach a server except dropped RPCs. - NumCallsFinishedWithClientFailedToSend int64 `protobuf:"varint,6,opt,name=num_calls_finished_with_client_failed_to_send,json=numCallsFinishedWithClientFailedToSend" json:"num_calls_finished_with_client_failed_to_send,omitempty"` - // The total number of RPCs that finished and are known to have been received - // by a server. - NumCallsFinishedKnownReceived int64 `protobuf:"varint,7,opt,name=num_calls_finished_known_received,json=numCallsFinishedKnownReceived" json:"num_calls_finished_known_received,omitempty"` -} - -func (m *ClientStats) Reset() { *m = ClientStats{} } -func (m *ClientStats) String() string { return proto.CompactTextString(m) } -func (*ClientStats) ProtoMessage() {} -func (*ClientStats) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } - -func (m *ClientStats) GetTimestamp() *Timestamp { - if m != nil { - return m.Timestamp - } - return nil -} - -func (m *ClientStats) GetNumCallsStarted() int64 { - if m != nil { - return m.NumCallsStarted - } - return 0 -} - -func (m *ClientStats) GetNumCallsFinished() int64 { - if m != nil { - return m.NumCallsFinished - } - return 0 -} - -func (m *ClientStats) GetNumCallsFinishedWithDropForRateLimiting() int64 { - if m != nil { - return m.NumCallsFinishedWithDropForRateLimiting - } - return 0 -} - -func (m *ClientStats) GetNumCallsFinishedWithDropForLoadBalancing() int64 { - if m != nil { - return m.NumCallsFinishedWithDropForLoadBalancing - } - return 0 -} - -func (m *ClientStats) GetNumCallsFinishedWithClientFailedToSend() int64 { - if m != nil { - return m.NumCallsFinishedWithClientFailedToSend - } - return 0 -} - -func (m *ClientStats) GetNumCallsFinishedKnownReceived() int64 { - if m != nil { - return m.NumCallsFinishedKnownReceived - } - return 0 -} - -type LoadBalanceResponse struct { - // Types that are valid to be assigned to LoadBalanceResponseType: - // *LoadBalanceResponse_InitialResponse - // *LoadBalanceResponse_ServerList - LoadBalanceResponseType isLoadBalanceResponse_LoadBalanceResponseType `protobuf_oneof:"load_balance_response_type"` -} - -func (m *LoadBalanceResponse) Reset() { *m = LoadBalanceResponse{} } -func (m *LoadBalanceResponse) String() string { return proto.CompactTextString(m) } -func (*LoadBalanceResponse) ProtoMessage() {} -func (*LoadBalanceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } - -type isLoadBalanceResponse_LoadBalanceResponseType interface { - isLoadBalanceResponse_LoadBalanceResponseType() -} - -type LoadBalanceResponse_InitialResponse struct { - InitialResponse *InitialLoadBalanceResponse `protobuf:"bytes,1,opt,name=initial_response,json=initialResponse,oneof"` -} -type LoadBalanceResponse_ServerList struct { - ServerList *ServerList `protobuf:"bytes,2,opt,name=server_list,json=serverList,oneof"` -} - -func (*LoadBalanceResponse_InitialResponse) isLoadBalanceResponse_LoadBalanceResponseType() {} -func (*LoadBalanceResponse_ServerList) isLoadBalanceResponse_LoadBalanceResponseType() {} - -func (m *LoadBalanceResponse) GetLoadBalanceResponseType() isLoadBalanceResponse_LoadBalanceResponseType { - if m != nil { - return m.LoadBalanceResponseType - } - return nil -} - -func (m *LoadBalanceResponse) GetInitialResponse() *InitialLoadBalanceResponse { - if x, ok := m.GetLoadBalanceResponseType().(*LoadBalanceResponse_InitialResponse); ok { - return x.InitialResponse - } - return nil -} - -func (m *LoadBalanceResponse) GetServerList() *ServerList { - if x, ok := m.GetLoadBalanceResponseType().(*LoadBalanceResponse_ServerList); ok { - return x.ServerList - } - return nil -} - -// XXX_OneofFuncs is for the internal use of the proto package. -func (*LoadBalanceResponse) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { - return _LoadBalanceResponse_OneofMarshaler, _LoadBalanceResponse_OneofUnmarshaler, _LoadBalanceResponse_OneofSizer, []interface{}{ - (*LoadBalanceResponse_InitialResponse)(nil), - (*LoadBalanceResponse_ServerList)(nil), - } -} - -func _LoadBalanceResponse_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { - m := msg.(*LoadBalanceResponse) - // load_balance_response_type - switch x := m.LoadBalanceResponseType.(type) { - case *LoadBalanceResponse_InitialResponse: - b.EncodeVarint(1<<3 | proto.WireBytes) - if err := b.EncodeMessage(x.InitialResponse); err != nil { - return err - } - case *LoadBalanceResponse_ServerList: - b.EncodeVarint(2<<3 | proto.WireBytes) - if err := b.EncodeMessage(x.ServerList); err != nil { - return err - } - case nil: - default: - return fmt.Errorf("LoadBalanceResponse.LoadBalanceResponseType has unexpected type %T", x) - } - return nil -} - -func _LoadBalanceResponse_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { - m := msg.(*LoadBalanceResponse) - switch tag { - case 1: // load_balance_response_type.initial_response - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - msg := new(InitialLoadBalanceResponse) - err := b.DecodeMessage(msg) - m.LoadBalanceResponseType = &LoadBalanceResponse_InitialResponse{msg} - return true, err - case 2: // load_balance_response_type.server_list - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - msg := new(ServerList) - err := b.DecodeMessage(msg) - m.LoadBalanceResponseType = &LoadBalanceResponse_ServerList{msg} - return true, err - default: - return false, nil - } -} - -func _LoadBalanceResponse_OneofSizer(msg proto.Message) (n int) { - m := msg.(*LoadBalanceResponse) - // load_balance_response_type - switch x := m.LoadBalanceResponseType.(type) { - case *LoadBalanceResponse_InitialResponse: - s := proto.Size(x.InitialResponse) - n += proto.SizeVarint(1<<3 | proto.WireBytes) - n += proto.SizeVarint(uint64(s)) - n += s - case *LoadBalanceResponse_ServerList: - s := proto.Size(x.ServerList) - n += proto.SizeVarint(2<<3 | proto.WireBytes) - n += proto.SizeVarint(uint64(s)) - n += s - case nil: - default: - panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) - } - return n -} - -type InitialLoadBalanceResponse struct { - // This is an application layer redirect that indicates the client should use - // the specified server for load balancing. When this field is non-empty in - // the response, the client should open a separate connection to the - // load_balancer_delegate and call the BalanceLoad method. Its length should - // be less than 64 bytes. - LoadBalancerDelegate string `protobuf:"bytes,1,opt,name=load_balancer_delegate,json=loadBalancerDelegate" json:"load_balancer_delegate,omitempty"` - // This interval defines how often the client should send the client stats - // to the load balancer. Stats should only be reported when the duration is - // positive. - ClientStatsReportInterval *Duration `protobuf:"bytes,2,opt,name=client_stats_report_interval,json=clientStatsReportInterval" json:"client_stats_report_interval,omitempty"` -} - -func (m *InitialLoadBalanceResponse) Reset() { *m = InitialLoadBalanceResponse{} } -func (m *InitialLoadBalanceResponse) String() string { return proto.CompactTextString(m) } -func (*InitialLoadBalanceResponse) ProtoMessage() {} -func (*InitialLoadBalanceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } - -func (m *InitialLoadBalanceResponse) GetLoadBalancerDelegate() string { - if m != nil { - return m.LoadBalancerDelegate - } - return "" -} - -func (m *InitialLoadBalanceResponse) GetClientStatsReportInterval() *Duration { - if m != nil { - return m.ClientStatsReportInterval - } - return nil -} - -type ServerList struct { - // Contains a list of servers selected by the load balancer. The list will - // be updated when server resolutions change or as needed to balance load - // across more servers. The client should consume the server list in order - // unless instructed otherwise via the client_config. - Servers []*Server `protobuf:"bytes,1,rep,name=servers" json:"servers,omitempty"` - // Indicates the amount of time that the client should consider this server - // list as valid. It may be considered stale after waiting this interval of - // time after receiving the list. If the interval is not positive, the - // client can assume the list is valid until the next list is received. - ExpirationInterval *Duration `protobuf:"bytes,3,opt,name=expiration_interval,json=expirationInterval" json:"expiration_interval,omitempty"` -} - -func (m *ServerList) Reset() { *m = ServerList{} } -func (m *ServerList) String() string { return proto.CompactTextString(m) } -func (*ServerList) ProtoMessage() {} -func (*ServerList) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } - -func (m *ServerList) GetServers() []*Server { - if m != nil { - return m.Servers - } - return nil -} - -func (m *ServerList) GetExpirationInterval() *Duration { - if m != nil { - return m.ExpirationInterval - } - return nil -} - -// Contains server information. When none of the [drop_for_*] fields are true, -// use the other fields. When drop_for_rate_limiting is true, ignore all other -// fields. Use drop_for_load_balancing only when it is true and -// drop_for_rate_limiting is false. -type Server struct { - // A resolved address for the server, serialized in network-byte-order. It may - // either be an IPv4 or IPv6 address. - IpAddress []byte `protobuf:"bytes,1,opt,name=ip_address,json=ipAddress,proto3" json:"ip_address,omitempty"` - // A resolved port number for the server. - Port int32 `protobuf:"varint,2,opt,name=port" json:"port,omitempty"` - // An opaque but printable token given to the frontend for each pick. All - // frontend requests for that pick must include the token in its initial - // metadata. The token is used by the backend to verify the request and to - // allow the backend to report load to the gRPC LB system. - // - // Its length is variable but less than 50 bytes. - LoadBalanceToken string `protobuf:"bytes,3,opt,name=load_balance_token,json=loadBalanceToken" json:"load_balance_token,omitempty"` - // Indicates whether this particular request should be dropped by the client - // for rate limiting. - DropForRateLimiting bool `protobuf:"varint,4,opt,name=drop_for_rate_limiting,json=dropForRateLimiting" json:"drop_for_rate_limiting,omitempty"` - // Indicates whether this particular request should be dropped by the client - // for load balancing. - DropForLoadBalancing bool `protobuf:"varint,5,opt,name=drop_for_load_balancing,json=dropForLoadBalancing" json:"drop_for_load_balancing,omitempty"` -} - -func (m *Server) Reset() { *m = Server{} } -func (m *Server) String() string { return proto.CompactTextString(m) } -func (*Server) ProtoMessage() {} -func (*Server) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } - -func (m *Server) GetIpAddress() []byte { - if m != nil { - return m.IpAddress - } - return nil -} - -func (m *Server) GetPort() int32 { - if m != nil { - return m.Port - } - return 0 -} - -func (m *Server) GetLoadBalanceToken() string { - if m != nil { - return m.LoadBalanceToken - } - return "" -} - -func (m *Server) GetDropForRateLimiting() bool { - if m != nil { - return m.DropForRateLimiting - } - return false -} - -func (m *Server) GetDropForLoadBalancing() bool { - if m != nil { - return m.DropForLoadBalancing - } - return false -} - -func init() { - proto.RegisterType((*Duration)(nil), "grpc.lb.v1.Duration") - proto.RegisterType((*Timestamp)(nil), "grpc.lb.v1.Timestamp") - proto.RegisterType((*LoadBalanceRequest)(nil), "grpc.lb.v1.LoadBalanceRequest") - proto.RegisterType((*InitialLoadBalanceRequest)(nil), "grpc.lb.v1.InitialLoadBalanceRequest") - proto.RegisterType((*ClientStats)(nil), "grpc.lb.v1.ClientStats") - proto.RegisterType((*LoadBalanceResponse)(nil), "grpc.lb.v1.LoadBalanceResponse") - proto.RegisterType((*InitialLoadBalanceResponse)(nil), "grpc.lb.v1.InitialLoadBalanceResponse") - proto.RegisterType((*ServerList)(nil), "grpc.lb.v1.ServerList") - proto.RegisterType((*Server)(nil), "grpc.lb.v1.Server") -} - -func init() { proto.RegisterFile("grpclb.proto", fileDescriptor0) } - -var fileDescriptor0 = []byte{ - // 733 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x55, 0xdd, 0x4e, 0x1b, 0x39, - 0x14, 0x66, 0x36, 0xfc, 0xe5, 0x24, 0x5a, 0x58, 0x93, 0x85, 0xc0, 0xc2, 0x2e, 0x1b, 0xa9, 0x34, - 0xaa, 0x68, 0x68, 0x43, 0x7b, 0xd1, 0x9f, 0x9b, 0x02, 0x45, 0x41, 0xe5, 0xa2, 0x72, 0xa8, 0x7a, - 0x55, 0x59, 0x4e, 0xc6, 0x80, 0xc5, 0xc4, 0x9e, 0xda, 0x4e, 0x68, 0x2f, 0x7b, 0xd9, 0x47, 0xe9, - 0x63, 0x54, 0x7d, 0x86, 0xbe, 0x4f, 0x65, 0x7b, 0x26, 0x33, 0x90, 0x1f, 0xd4, 0xbb, 0xf1, 0xf1, - 0x77, 0xbe, 0xf3, 0xf9, 0xd8, 0xdf, 0x19, 0x28, 0x5f, 0xa8, 0xb8, 0x1b, 0x75, 0x1a, 0xb1, 0x92, - 0x46, 0x22, 0xb0, 0xab, 0x46, 0xd4, 0x69, 0x0c, 0x1e, 0xd7, 0x9e, 0xc3, 0xe2, 0x51, 0x5f, 0x51, - 0xc3, 0xa5, 0x40, 0x55, 0x58, 0xd0, 0xac, 0x2b, 0x45, 0xa8, 0xab, 0xc1, 0x76, 0x50, 0x2f, 0xe0, - 0x74, 0x89, 0x2a, 0x30, 0x27, 0xa8, 0x90, 0xba, 0xfa, 0xc7, 0x76, 0x50, 0x9f, 0xc3, 0x7e, 0x51, - 0x7b, 0x01, 0xc5, 0x33, 0xde, 0x63, 0xda, 0xd0, 0x5e, 0xfc, 0xdb, 0xc9, 0xdf, 0x03, 0x40, 0xa7, - 0x92, 0x86, 0x07, 0x34, 0xa2, 0xa2, 0xcb, 0x30, 0xfb, 0xd8, 0x67, 0xda, 0xa0, 0xb7, 0xb0, 0xc4, - 0x05, 0x37, 0x9c, 0x46, 0x44, 0xf9, 0x90, 0xa3, 0x2b, 0x35, 0xef, 0x35, 0x32, 0xd5, 0x8d, 0x13, - 0x0f, 0x19, 0xcd, 0x6f, 0xcd, 0xe0, 0x3f, 0x93, 0xfc, 0x94, 0xf1, 0x25, 0x94, 0xbb, 0x11, 0x67, - 0xc2, 0x10, 0x6d, 0xa8, 0xf1, 0x2a, 0x4a, 0xcd, 0xb5, 0x3c, 0xdd, 0xa1, 0xdb, 0x6f, 0xdb, 0xed, - 0xd6, 0x0c, 0x2e, 0x75, 0xb3, 0xe5, 0xc1, 0x3f, 0xb0, 0x1e, 0x49, 0x1a, 0x92, 0x8e, 0x2f, 0x93, - 0x8a, 0x22, 0xe6, 0x73, 0xcc, 0x6a, 0x7b, 0xb0, 0x3e, 0x51, 0x09, 0x42, 0x30, 0x2b, 0x68, 0x8f, - 0x39, 0xf9, 0x45, 0xec, 0xbe, 0x6b, 0x5f, 0x67, 0xa1, 0x94, 0x2b, 0x86, 0xf6, 0xa1, 0x68, 0xd2, - 0x0e, 0x26, 0xe7, 0xfc, 0x3b, 0x2f, 0x6c, 0xd8, 0x5e, 0x9c, 0xe1, 0xd0, 0x03, 0xf8, 0x4b, 0xf4, - 0x7b, 0xa4, 0x4b, 0xa3, 0x48, 0xdb, 0x33, 0x29, 0xc3, 0x42, 0x77, 0xaa, 0x02, 0x5e, 0x12, 0xfd, - 0xde, 0xa1, 0x8d, 0xb7, 0x7d, 0x18, 0xed, 0x02, 0xca, 0xb0, 0xe7, 0x5c, 0x70, 0x7d, 0xc9, 0xc2, - 0x6a, 0xc1, 0x81, 0x97, 0x53, 0xf0, 0x71, 0x12, 0x47, 0x04, 0x1a, 0xa3, 0x68, 0x72, 0xcd, 0xcd, - 0x25, 0x09, 0x95, 0x8c, 0xc9, 0xb9, 0x54, 0x44, 0x51, 0xc3, 0x48, 0xc4, 0x7b, 0xdc, 0x70, 0x71, - 0x51, 0x9d, 0x75, 0x4c, 0xf7, 0x6f, 0x33, 0xbd, 0xe7, 0xe6, 0xf2, 0x48, 0xc9, 0xf8, 0x58, 0x2a, - 0x4c, 0x0d, 0x3b, 0x4d, 0xe0, 0x88, 0xc2, 0xde, 0x9d, 0x05, 0x72, 0xed, 0xb6, 0x15, 0xe6, 0x5c, - 0x85, 0xfa, 0x94, 0x0a, 0x59, 0xef, 0x6d, 0x89, 0x0f, 0xf0, 0x70, 0x52, 0x89, 0xe4, 0x19, 0x9c, - 0x53, 0x1e, 0xb1, 0x90, 0x18, 0x49, 0x34, 0x13, 0x61, 0x75, 0xde, 0x15, 0xd8, 0x19, 0x57, 0xc0, - 0x5f, 0xd5, 0xb1, 0xc3, 0x9f, 0xc9, 0x36, 0x13, 0x21, 0x6a, 0xc1, 0xff, 0x63, 0xe8, 0xaf, 0x84, - 0xbc, 0x16, 0x44, 0xb1, 0x2e, 0xe3, 0x03, 0x16, 0x56, 0x17, 0x1c, 0xe5, 0xd6, 0x6d, 0xca, 0x37, - 0x16, 0x85, 0x13, 0x50, 0xed, 0x47, 0x00, 0x2b, 0x37, 0x9e, 0x8d, 0x8e, 0xa5, 0xd0, 0x0c, 0xb5, - 0x61, 0x39, 0x73, 0x80, 0x8f, 0x25, 0x4f, 0x63, 0xe7, 0x2e, 0x0b, 0x78, 0x74, 0x6b, 0x06, 0x2f, - 0x0d, 0x3d, 0x90, 0x90, 0x3e, 0x83, 0x92, 0x66, 0x6a, 0xc0, 0x14, 0x89, 0xb8, 0x36, 0x89, 0x07, - 0x56, 0xf3, 0x7c, 0x6d, 0xb7, 0x7d, 0xca, 0x9d, 0x87, 0x40, 0x0f, 0x57, 0x07, 0x9b, 0xb0, 0x71, - 0xcb, 0x01, 0x9e, 0xd3, 0x5b, 0xe0, 0x5b, 0x00, 0x1b, 0x93, 0xa5, 0xa0, 0x27, 0xb0, 0x9a, 0x4f, - 0x56, 0x24, 0x64, 0x11, 0xbb, 0xa0, 0x26, 0xb5, 0x45, 0x25, 0xca, 0x92, 0xd4, 0x51, 0xb2, 0x87, - 0xde, 0xc1, 0x66, 0xde, 0xb2, 0x44, 0xb1, 0x58, 0x2a, 0x43, 0xb8, 0x30, 0x4c, 0x0d, 0x68, 0x94, - 0xc8, 0xaf, 0xe4, 0xe5, 0xa7, 0x43, 0x0c, 0xaf, 0xe7, 0xdc, 0x8b, 0x5d, 0xde, 0x49, 0x92, 0x56, - 0xfb, 0x12, 0x00, 0x64, 0xc7, 0x44, 0xbb, 0x76, 0x62, 0xd9, 0x95, 0x9d, 0x58, 0x85, 0x7a, 0xa9, - 0x89, 0x46, 0xfb, 0x81, 0x53, 0x08, 0x7a, 0x0d, 0x2b, 0xec, 0x53, 0xcc, 0x7d, 0x95, 0x4c, 0x4a, - 0x61, 0x8a, 0x14, 0x94, 0x25, 0x0c, 0x35, 0xfc, 0x0c, 0x60, 0xde, 0x53, 0xa3, 0x2d, 0x00, 0x1e, - 0x13, 0x1a, 0x86, 0x8a, 0x69, 0x3f, 0x34, 0xcb, 0xb8, 0xc8, 0xe3, 0x57, 0x3e, 0x60, 0xe7, 0x87, - 0x55, 0x9f, 0x4c, 0x4d, 0xf7, 0x6d, 0xed, 0x7c, 0xe3, 0x2e, 0x8c, 0xbc, 0x62, 0xc2, 0x69, 0x28, - 0xe2, 0xe5, 0x5c, 0x2b, 0xcf, 0x6c, 0x1c, 0xed, 0xc3, 0xea, 0x14, 0xdb, 0x2e, 0xe2, 0x95, 0x70, - 0x8c, 0x45, 0x9f, 0xc2, 0xda, 0x34, 0x2b, 0x2e, 0xe2, 0x4a, 0x38, 0xc6, 0x76, 0xcd, 0x0e, 0x94, - 0x73, 0xf7, 0xaf, 0x10, 0x86, 0x52, 0xf2, 0x6d, 0xc3, 0xe8, 0xdf, 0x7c, 0x83, 0x46, 0x87, 0xe5, - 0xc6, 0x7f, 0x13, 0xf7, 0xfd, 0x43, 0xaa, 0x07, 0x8f, 0x82, 0xce, 0xbc, 0xfb, 0x7d, 0xed, 0xff, - 0x0a, 0x00, 0x00, 0xff, 0xff, 0x64, 0xbf, 0xda, 0x5e, 0xce, 0x06, 0x00, 0x00, -} diff --git a/vendor/google.golang.org/grpc/grpclb/grpc_lb_v1/grpclb.proto b/vendor/google.golang.org/grpc/grpclb/grpc_lb_v1/grpclb.proto deleted file mode 100644 index a2502fb28..000000000 --- a/vendor/google.golang.org/grpc/grpclb/grpc_lb_v1/grpclb.proto +++ /dev/null @@ -1,179 +0,0 @@ -// Copyright 2016, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT -// OWNER 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. - -syntax = "proto3"; - -package grpc.lb.v1; - -message Duration { - // Signed seconds of the span of time. Must be from -315,576,000,000 - // to +315,576,000,000 inclusive. - int64 seconds = 1; - - // Signed fractions of a second at nanosecond resolution of the span - // of time. Durations less than one second are represented with a 0 - // `seconds` field and a positive or negative `nanos` field. For durations - // of one second or more, a non-zero value for the `nanos` field must be - // of the same sign as the `seconds` field. Must be from -999,999,999 - // to +999,999,999 inclusive. - int32 nanos = 2; -} - -message Timestamp { - - // Represents seconds of UTC time since Unix epoch - // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to - // 9999-12-31T23:59:59Z inclusive. - int64 seconds = 1; - - // Non-negative fractions of a second at nanosecond resolution. Negative - // second values with fractions must still have non-negative nanos values - // that count forward in time. Must be from 0 to 999,999,999 - // inclusive. - int32 nanos = 2; -} - -service LoadBalancer { - // Bidirectional rpc to get a list of servers. - rpc BalanceLoad(stream LoadBalanceRequest) - returns (stream LoadBalanceResponse); -} - -message LoadBalanceRequest { - oneof load_balance_request_type { - // This message should be sent on the first request to the load balancer. - InitialLoadBalanceRequest initial_request = 1; - - // The client stats should be periodically reported to the load balancer - // based on the duration defined in the InitialLoadBalanceResponse. - ClientStats client_stats = 2; - } -} - -message InitialLoadBalanceRequest { - // Name of load balanced service (IE, balancer.service.com) - // length should be less than 256 bytes. - string name = 1; -} - -// Contains client level statistics that are useful to load balancing. Each -// count except the timestamp should be reset to zero after reporting the stats. -message ClientStats { - // The timestamp of generating the report. - Timestamp timestamp = 1; - - // The total number of RPCs that started. - int64 num_calls_started = 2; - - // The total number of RPCs that finished. - int64 num_calls_finished = 3; - - // The total number of RPCs that were dropped by the client because of rate - // limiting. - int64 num_calls_finished_with_drop_for_rate_limiting = 4; - - // The total number of RPCs that were dropped by the client because of load - // balancing. - int64 num_calls_finished_with_drop_for_load_balancing = 5; - - // The total number of RPCs that failed to reach a server except dropped RPCs. - int64 num_calls_finished_with_client_failed_to_send = 6; - - // The total number of RPCs that finished and are known to have been received - // by a server. - int64 num_calls_finished_known_received = 7; -} - -message LoadBalanceResponse { - oneof load_balance_response_type { - // This message should be sent on the first response to the client. - InitialLoadBalanceResponse initial_response = 1; - - // Contains the list of servers selected by the load balancer. The client - // should send requests to these servers in the specified order. - ServerList server_list = 2; - } -} - -message InitialLoadBalanceResponse { - // This is an application layer redirect that indicates the client should use - // the specified server for load balancing. When this field is non-empty in - // the response, the client should open a separate connection to the - // load_balancer_delegate and call the BalanceLoad method. Its length should - // be less than 64 bytes. - string load_balancer_delegate = 1; - - // This interval defines how often the client should send the client stats - // to the load balancer. Stats should only be reported when the duration is - // positive. - Duration client_stats_report_interval = 2; -} - -message ServerList { - // Contains a list of servers selected by the load balancer. The list will - // be updated when server resolutions change or as needed to balance load - // across more servers. The client should consume the server list in order - // unless instructed otherwise via the client_config. - repeated Server servers = 1; - - // Indicates the amount of time that the client should consider this server - // list as valid. It may be considered stale after waiting this interval of - // time after receiving the list. If the interval is not positive, the - // client can assume the list is valid until the next list is received. - Duration expiration_interval = 3; -} - -// Contains server information. When none of the [drop_for_*] fields are true, -// use the other fields. When drop_for_rate_limiting is true, ignore all other -// fields. Use drop_for_load_balancing only when it is true and -// drop_for_rate_limiting is false. -message Server { - // A resolved address for the server, serialized in network-byte-order. It may - // either be an IPv4 or IPv6 address. - bytes ip_address = 1; - - // A resolved port number for the server. - int32 port = 2; - - // An opaque but printable token given to the frontend for each pick. All - // frontend requests for that pick must include the token in its initial - // metadata. The token is used by the backend to verify the request and to - // allow the backend to report load to the gRPC LB system. - // - // Its length is variable but less than 50 bytes. - string load_balance_token = 3; - - // Indicates whether this particular request should be dropped by the client - // for rate limiting. - bool drop_for_rate_limiting = 4; - - // Indicates whether this particular request should be dropped by the client - // for load balancing. - bool drop_for_load_balancing = 5; -} diff --git a/vendor/google.golang.org/grpc/grpclog/logger.go b/vendor/google.golang.org/grpc/grpclog/logger.go deleted file mode 100644 index 3b2933079..000000000 --- a/vendor/google.golang.org/grpc/grpclog/logger.go +++ /dev/null @@ -1,93 +0,0 @@ -/* - * - * Copyright 2015, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT - * OWNER 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. - * - */ - -/* -Package grpclog defines logging for grpc. -*/ -package grpclog // import "google.golang.org/grpc/grpclog" - -import ( - "log" - "os" -) - -// Use golang's standard logger by default. -// Access is not mutex-protected: do not modify except in init() -// functions. -var logger Logger = log.New(os.Stderr, "", log.LstdFlags) - -// Logger mimics golang's standard Logger as an interface. -type Logger interface { - Fatal(args ...interface{}) - Fatalf(format string, args ...interface{}) - Fatalln(args ...interface{}) - Print(args ...interface{}) - Printf(format string, args ...interface{}) - Println(args ...interface{}) -} - -// SetLogger sets the logger that is used in grpc. Call only from -// init() functions. -func SetLogger(l Logger) { - logger = l -} - -// Fatal is equivalent to Print() followed by a call to os.Exit() with a non-zero exit code. -func Fatal(args ...interface{}) { - logger.Fatal(args...) -} - -// Fatalf is equivalent to Printf() followed by a call to os.Exit() with a non-zero exit code. -func Fatalf(format string, args ...interface{}) { - logger.Fatalf(format, args...) -} - -// Fatalln is equivalent to Println() followed by a call to os.Exit()) with a non-zero exit code. -func Fatalln(args ...interface{}) { - logger.Fatalln(args...) -} - -// Print prints to the logger. Arguments are handled in the manner of fmt.Print. -func Print(args ...interface{}) { - logger.Print(args...) -} - -// Printf prints to the logger. Arguments are handled in the manner of fmt.Printf. -func Printf(format string, args ...interface{}) { - logger.Printf(format, args...) -} - -// Println prints to the logger. Arguments are handled in the manner of fmt.Println. -func Println(args ...interface{}) { - logger.Println(args...) -} diff --git a/vendor/google.golang.org/grpc/interceptor.go b/vendor/google.golang.org/grpc/interceptor.go deleted file mode 100644 index 19893be9d..000000000 --- a/vendor/google.golang.org/grpc/interceptor.go +++ /dev/null @@ -1,90 +0,0 @@ -/* - * - * Copyright 2016, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT - * OWNER 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. - * - */ - -package grpc - -import ( - "golang.org/x/net/context" -) - -// UnaryInvoker is called by UnaryClientInterceptor to complete RPCs. -type UnaryInvoker func(ctx context.Context, method string, req, reply interface{}, cc *ClientConn, opts ...CallOption) error - -// UnaryClientInterceptor intercepts the execution of a unary RPC on the client. invoker is the handler to complete the RPC -// and it is the responsibility of the interceptor to call it. -// This is an EXPERIMENTAL API. -type UnaryClientInterceptor func(ctx context.Context, method string, req, reply interface{}, cc *ClientConn, invoker UnaryInvoker, opts ...CallOption) error - -// Streamer is called by StreamClientInterceptor to create a ClientStream. -type Streamer func(ctx context.Context, desc *StreamDesc, cc *ClientConn, method string, opts ...CallOption) (ClientStream, error) - -// StreamClientInterceptor intercepts the creation of ClientStream. It may return a custom ClientStream to intercept all I/O -// operations. streamer is the handler to create a ClientStream and it is the responsibility of the interceptor to call it. -// This is an EXPERIMENTAL API. -type StreamClientInterceptor func(ctx context.Context, desc *StreamDesc, cc *ClientConn, method string, streamer Streamer, opts ...CallOption) (ClientStream, error) - -// UnaryServerInfo consists of various information about a unary RPC on -// server side. All per-rpc information may be mutated by the interceptor. -type UnaryServerInfo struct { - // Server is the service implementation the user provides. This is read-only. - Server interface{} - // FullMethod is the full RPC method string, i.e., /package.service/method. - FullMethod string -} - -// UnaryHandler defines the handler invoked by UnaryServerInterceptor to complete the normal -// execution of a unary RPC. -type UnaryHandler func(ctx context.Context, req interface{}) (interface{}, error) - -// UnaryServerInterceptor provides a hook to intercept the execution of a unary RPC on the server. info -// contains all the information of this RPC the interceptor can operate on. And handler is the wrapper -// of the service method implementation. It is the responsibility of the interceptor to invoke handler -// to complete the RPC. -type UnaryServerInterceptor func(ctx context.Context, req interface{}, info *UnaryServerInfo, handler UnaryHandler) (resp interface{}, err error) - -// StreamServerInfo consists of various information about a streaming RPC on -// server side. All per-rpc information may be mutated by the interceptor. -type StreamServerInfo struct { - // FullMethod is the full RPC method string, i.e., /package.service/method. - FullMethod string - // IsClientStream indicates whether the RPC is a client streaming RPC. - IsClientStream bool - // IsServerStream indicates whether the RPC is a server streaming RPC. - IsServerStream bool -} - -// StreamServerInterceptor provides a hook to intercept the execution of a streaming RPC on the server. -// info contains all the information of this RPC the interceptor can operate on. And handler is the -// service method implementation. It is the responsibility of the interceptor to invoke handler to -// complete the RPC. -type StreamServerInterceptor func(srv interface{}, ss ServerStream, info *StreamServerInfo, handler StreamHandler) error diff --git a/vendor/google.golang.org/grpc/internal/internal.go b/vendor/google.golang.org/grpc/internal/internal.go deleted file mode 100644 index 5489143a8..000000000 --- a/vendor/google.golang.org/grpc/internal/internal.go +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2016, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT - * OWNER 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. - * - */ - -// Package internal contains gRPC-internal code for testing, to avoid polluting -// the godoc of the top-level grpc package. -package internal - -// TestingCloseConns closes all existing transports but keeps -// grpcServer.lis accepting new connections. -// -// The provided grpcServer must be of type *grpc.Server. It is untyped -// for circular dependency reasons. -var TestingCloseConns func(grpcServer interface{}) - -// TestingUseHandlerImpl enables the http.Handler-based server implementation. -// It must be called before Serve and requires TLS credentials. -// -// The provided grpcServer must be of type *grpc.Server. It is untyped -// for circular dependency reasons. -var TestingUseHandlerImpl func(grpcServer interface{}) diff --git a/vendor/google.golang.org/grpc/keepalive/keepalive.go b/vendor/google.golang.org/grpc/keepalive/keepalive.go deleted file mode 100644 index 0f855ff46..000000000 --- a/vendor/google.golang.org/grpc/keepalive/keepalive.go +++ /dev/null @@ -1,80 +0,0 @@ -/* - * - * Copyright 2017, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT - * OWNER 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. - * - */ - -// Package keepalive defines configurable parameters for point-to-point healthcheck. -package keepalive - -import ( - "time" -) - -// ClientParameters is used to set keepalive parameters on the client-side. -// These configure how the client will actively probe to notice when a connection is broken -// and send pings so intermediaries will be aware of the liveness of the connection. -// Make sure these parameters are set in coordination with the keepalive policy on the server, -// as incompatible settings can result in closing of connection. -type ClientParameters struct { - // After a duration of this time if the client doesn't see any activity it pings the server to see if the transport is still alive. - Time time.Duration // The current default value is infinity. - // After having pinged for keepalive check, the client waits for a duration of Timeout and if no activity is seen even after that - // the connection is closed. - Timeout time.Duration // The current default value is 20 seconds. - // If true, client runs keepalive checks even with no active RPCs. - PermitWithoutStream bool // false by default. -} - -// ServerParameters is used to set keepalive and max-age parameters on the server-side. -type ServerParameters struct { - // MaxConnectionIdle is a duration for the amount of time after which an idle connection would be closed by sending a GoAway. - // Idleness duration is defined since the most recent time the number of outstanding RPCs became zero or the connection establishment. - MaxConnectionIdle time.Duration // The current default value is infinity. - // MaxConnectionAge is a duration for the maximum amount of time a connection may exist before it will be closed by sending a GoAway. - // A random jitter of +/-10% will be added to MaxConnectionAge to spread out connection storms. - MaxConnectionAge time.Duration // The current default value is infinity. - // MaxConnectinoAgeGrace is an additive period after MaxConnectionAge after which the connection will be forcibly closed. - MaxConnectionAgeGrace time.Duration // The current default value is infinity. - // After a duration of this time if the server doesn't see any activity it pings the client to see if the transport is still alive. - Time time.Duration // The current default value is 2 hours. - // After having pinged for keepalive check, the server waits for a duration of Timeout and if no activity is seen even after that - // the connection is closed. - Timeout time.Duration // The current default value is 20 seconds. -} - -// EnforcementPolicy is used to set keepalive enforcement policy on the server-side. -// Server will close connection with a client that violates this policy. -type EnforcementPolicy struct { - // MinTime is the minimum amount of time a client should wait before sending a keepalive ping. - MinTime time.Duration // The current default value is 5 minutes. - // If true, server expects keepalive pings even when there are no active streams(RPCs). - PermitWithoutStream bool // false by default. -} diff --git a/vendor/google.golang.org/grpc/metadata/metadata.go b/vendor/google.golang.org/grpc/metadata/metadata.go deleted file mode 100644 index 06688134d..000000000 --- a/vendor/google.golang.org/grpc/metadata/metadata.go +++ /dev/null @@ -1,144 +0,0 @@ -/* - * - * Copyright 2014, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT - * OWNER 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. - * - */ - -// Package metadata define the structure of the metadata supported by gRPC library. -// Please refer to http://www.grpc.io/docs/guides/wire.html for more information about custom-metadata. -package metadata // import "google.golang.org/grpc/metadata" - -import ( - "fmt" - "strings" - - "golang.org/x/net/context" -) - -// DecodeKeyValue returns k, v, nil. It is deprecated and should not be used. -func DecodeKeyValue(k, v string) (string, string, error) { - return k, v, nil -} - -// MD is a mapping from metadata keys to values. Users should use the following -// two convenience functions New and Pairs to generate MD. -type MD map[string][]string - -// New creates an MD from a given key-value map. -// Keys are automatically converted to lowercase. -func New(m map[string]string) MD { - md := MD{} - for k, val := range m { - key := strings.ToLower(k) - md[key] = append(md[key], val) - } - return md -} - -// Pairs returns an MD formed by the mapping of key, value ... -// Pairs panics if len(kv) is odd. -// Keys are automatically converted to lowercase. -func Pairs(kv ...string) MD { - if len(kv)%2 == 1 { - panic(fmt.Sprintf("metadata: Pairs got the odd number of input pairs for metadata: %d", len(kv))) - } - md := MD{} - var key string - for i, s := range kv { - if i%2 == 0 { - key = strings.ToLower(s) - continue - } - md[key] = append(md[key], s) - } - return md -} - -// Len returns the number of items in md. -func (md MD) Len() int { - return len(md) -} - -// Copy returns a copy of md. -func (md MD) Copy() MD { - return Join(md) -} - -// Join joins any number of mds into a single MD. -// The order of values for each key is determined by the order in which -// the mds containing those values are presented to Join. -func Join(mds ...MD) MD { - out := MD{} - for _, md := range mds { - for k, v := range md { - out[k] = append(out[k], v...) - } - } - return out -} - -type mdIncomingKey struct{} -type mdOutgoingKey struct{} - -// NewContext is a wrapper for NewOutgoingContext(ctx, md). Deprecated. -func NewContext(ctx context.Context, md MD) context.Context { - return NewOutgoingContext(ctx, md) -} - -// NewIncomingContext creates a new context with incoming md attached. -func NewIncomingContext(ctx context.Context, md MD) context.Context { - return context.WithValue(ctx, mdIncomingKey{}, md) -} - -// NewOutgoingContext creates a new context with outgoing md attached. -func NewOutgoingContext(ctx context.Context, md MD) context.Context { - return context.WithValue(ctx, mdOutgoingKey{}, md) -} - -// FromContext is a wrapper for FromIncomingContext(ctx). Deprecated. -func FromContext(ctx context.Context) (md MD, ok bool) { - return FromIncomingContext(ctx) -} - -// FromIncomingContext returns the incoming metadata in ctx if it exists. The -// returned MD should not be modified. Writing to it may cause races. -// Modification should be made to copies of the returned MD. -func FromIncomingContext(ctx context.Context) (md MD, ok bool) { - md, ok = ctx.Value(mdIncomingKey{}).(MD) - return -} - -// FromOutgoingContext returns the outgoing metadata in ctx if it exists. The -// returned MD should not be modified. Writing to it may cause races. -// Modification should be made to the copies of the returned MD. -func FromOutgoingContext(ctx context.Context) (md MD, ok bool) { - md, ok = ctx.Value(mdOutgoingKey{}).(MD) - return -} diff --git a/vendor/google.golang.org/grpc/naming/naming.go b/vendor/google.golang.org/grpc/naming/naming.go deleted file mode 100644 index c2e0871e6..000000000 --- a/vendor/google.golang.org/grpc/naming/naming.go +++ /dev/null @@ -1,74 +0,0 @@ -/* - * - * Copyright 2014, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT - * OWNER 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. - * - */ - -// Package naming defines the naming API and related data structures for gRPC. -// The interface is EXPERIMENTAL and may be suject to change. -package naming - -// Operation defines the corresponding operations for a name resolution change. -type Operation uint8 - -const ( - // Add indicates a new address is added. - Add Operation = iota - // Delete indicates an exisiting address is deleted. - Delete -) - -// Update defines a name resolution update. Notice that it is not valid having both -// empty string Addr and nil Metadata in an Update. -type Update struct { - // Op indicates the operation of the update. - Op Operation - // Addr is the updated address. It is empty string if there is no address update. - Addr string - // Metadata is the updated metadata. It is nil if there is no metadata update. - // Metadata is not required for a custom naming implementation. - Metadata interface{} -} - -// Resolver creates a Watcher for a target to track its resolution changes. -type Resolver interface { - // Resolve creates a Watcher for target. - Resolve(target string) (Watcher, error) -} - -// Watcher watches for the updates on the specified target. -type Watcher interface { - // Next blocks until an update or error happens. It may return one or more - // updates. The first call should get the full set of the results. It should - // return an error if and only if Watcher cannot recover. - Next() ([]*Update, error) - // Close closes the Watcher. - Close() -} diff --git a/vendor/google.golang.org/grpc/peer/peer.go b/vendor/google.golang.org/grpc/peer/peer.go deleted file mode 100644 index fa7de9aff..000000000 --- a/vendor/google.golang.org/grpc/peer/peer.go +++ /dev/null @@ -1,66 +0,0 @@ -/* - * - * Copyright 2014, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT - * OWNER 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. - * - */ - -// Package peer defines various peer information associated with RPCs and -// corresponding utils. -package peer - -import ( - "net" - - "golang.org/x/net/context" - "google.golang.org/grpc/credentials" -) - -// Peer contains the information of the peer for an RPC, such as the address -// and authentication information. -type Peer struct { - // Addr is the peer address. - Addr net.Addr - // AuthInfo is the authentication information of the transport. - // It is nil if there is no transport security being used. - AuthInfo credentials.AuthInfo -} - -type peerKey struct{} - -// NewContext creates a new context with peer information attached. -func NewContext(ctx context.Context, p *Peer) context.Context { - return context.WithValue(ctx, peerKey{}, p) -} - -// FromContext returns the peer information in ctx if it exists. -func FromContext(ctx context.Context) (p *Peer, ok bool) { - p, ok = ctx.Value(peerKey{}).(*Peer) - return -} diff --git a/vendor/google.golang.org/grpc/proxy.go b/vendor/google.golang.org/grpc/proxy.go deleted file mode 100644 index 10188dc34..000000000 --- a/vendor/google.golang.org/grpc/proxy.go +++ /dev/null @@ -1,145 +0,0 @@ -/* - * - * Copyright 2017, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT - * OWNER 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. - * - */ - -package grpc - -import ( - "bufio" - "errors" - "fmt" - "io" - "net" - "net/http" - "net/http/httputil" - "net/url" - - "golang.org/x/net/context" -) - -var ( - // errDisabled indicates that proxy is disabled for the address. - errDisabled = errors.New("proxy is disabled for the address") - // The following variable will be overwritten in the tests. - httpProxyFromEnvironment = http.ProxyFromEnvironment -) - -func mapAddress(ctx context.Context, address string) (string, error) { - req := &http.Request{ - URL: &url.URL{ - Scheme: "https", - Host: address, - }, - } - url, err := httpProxyFromEnvironment(req) - if err != nil { - return "", err - } - if url == nil { - return "", errDisabled - } - return url.Host, nil -} - -// To read a response from a net.Conn, http.ReadResponse() takes a bufio.Reader. -// It's possible that this reader reads more than what's need for the response and stores -// those bytes in the buffer. -// bufConn wraps the original net.Conn and the bufio.Reader to make sure we don't lose the -// bytes in the buffer. -type bufConn struct { - net.Conn - r io.Reader -} - -func (c *bufConn) Read(b []byte) (int, error) { - return c.r.Read(b) -} - -func doHTTPConnectHandshake(ctx context.Context, conn net.Conn, addr string) (_ net.Conn, err error) { - defer func() { - if err != nil { - conn.Close() - } - }() - - req := (&http.Request{ - Method: http.MethodConnect, - URL: &url.URL{Host: addr}, - Header: map[string][]string{"User-Agent": {grpcUA}}, - }) - - if err := sendHTTPRequest(ctx, req, conn); err != nil { - return nil, fmt.Errorf("failed to write the HTTP request: %v", err) - } - - r := bufio.NewReader(conn) - resp, err := http.ReadResponse(r, req) - if err != nil { - return nil, fmt.Errorf("reading server HTTP response: %v", err) - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - dump, err := httputil.DumpResponse(resp, true) - if err != nil { - return nil, fmt.Errorf("failed to do connect handshake, status code: %s", resp.Status) - } - return nil, fmt.Errorf("failed to do connect handshake, response: %q", dump) - } - - return &bufConn{Conn: conn, r: r}, nil -} - -// newProxyDialer returns a dialer that connects to proxy first if necessary. -// The returned dialer checks if a proxy is necessary, dial to the proxy with the -// provided dialer, does HTTP CONNECT handshake and returns the connection. -func newProxyDialer(dialer func(context.Context, string) (net.Conn, error)) func(context.Context, string) (net.Conn, error) { - return func(ctx context.Context, addr string) (conn net.Conn, err error) { - var skipHandshake bool - newAddr, err := mapAddress(ctx, addr) - if err != nil { - if err != errDisabled { - return nil, err - } - skipHandshake = true - newAddr = addr - } - - conn, err = dialer(ctx, newAddr) - if err != nil { - return - } - if !skipHandshake { - conn, err = doHTTPConnectHandshake(ctx, conn, addr) - } - return - } -} diff --git a/vendor/google.golang.org/grpc/rpc_util.go b/vendor/google.golang.org/grpc/rpc_util.go deleted file mode 100644 index a24257afe..000000000 --- a/vendor/google.golang.org/grpc/rpc_util.go +++ /dev/null @@ -1,533 +0,0 @@ -/* - * - * Copyright 2014, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT - * OWNER 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. - * - */ - -package grpc - -import ( - "bytes" - "compress/gzip" - "encoding/binary" - "io" - "io/ioutil" - "math" - "sync" - "time" - - "golang.org/x/net/context" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/credentials" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/peer" - "google.golang.org/grpc/stats" - "google.golang.org/grpc/status" - "google.golang.org/grpc/transport" -) - -// Compressor defines the interface gRPC uses to compress a message. -type Compressor interface { - // Do compresses p into w. - Do(w io.Writer, p []byte) error - // Type returns the compression algorithm the Compressor uses. - Type() string -} - -type gzipCompressor struct { - pool sync.Pool -} - -// NewGZIPCompressor creates a Compressor based on GZIP. -func NewGZIPCompressor() Compressor { - return &gzipCompressor{ - pool: sync.Pool{ - New: func() interface{} { - return gzip.NewWriter(ioutil.Discard) - }, - }, - } -} - -func (c *gzipCompressor) Do(w io.Writer, p []byte) error { - z := c.pool.Get().(*gzip.Writer) - z.Reset(w) - if _, err := z.Write(p); err != nil { - return err - } - return z.Close() -} - -func (c *gzipCompressor) Type() string { - return "gzip" -} - -// Decompressor defines the interface gRPC uses to decompress a message. -type Decompressor interface { - // Do reads the data from r and uncompress them. - Do(r io.Reader) ([]byte, error) - // Type returns the compression algorithm the Decompressor uses. - Type() string -} - -type gzipDecompressor struct { - pool sync.Pool -} - -// NewGZIPDecompressor creates a Decompressor based on GZIP. -func NewGZIPDecompressor() Decompressor { - return &gzipDecompressor{} -} - -func (d *gzipDecompressor) Do(r io.Reader) ([]byte, error) { - var z *gzip.Reader - switch maybeZ := d.pool.Get().(type) { - case nil: - newZ, err := gzip.NewReader(r) - if err != nil { - return nil, err - } - z = newZ - case *gzip.Reader: - z = maybeZ - if err := z.Reset(r); err != nil { - d.pool.Put(z) - return nil, err - } - } - - defer func() { - z.Close() - d.pool.Put(z) - }() - return ioutil.ReadAll(z) -} - -func (d *gzipDecompressor) Type() string { - return "gzip" -} - -// callInfo contains all related configuration and information about an RPC. -type callInfo struct { - failFast bool - headerMD metadata.MD - trailerMD metadata.MD - peer *peer.Peer - traceInfo traceInfo // in trace.go - maxReceiveMessageSize *int - maxSendMessageSize *int - creds credentials.PerRPCCredentials -} - -var defaultCallInfo = callInfo{failFast: true} - -// CallOption configures a Call before it starts or extracts information from -// a Call after it completes. -type CallOption interface { - // before is called before the call is sent to any server. If before - // returns a non-nil error, the RPC fails with that error. - before(*callInfo) error - - // after is called after the call has completed. after cannot return an - // error, so any failures should be reported via output parameters. - after(*callInfo) -} - -// EmptyCallOption does not alter the Call configuration. -// It can be embedded in another structure to carry satellite data for use -// by interceptors. -type EmptyCallOption struct{} - -func (EmptyCallOption) before(*callInfo) error { return nil } -func (EmptyCallOption) after(*callInfo) {} - -type beforeCall func(c *callInfo) error - -func (o beforeCall) before(c *callInfo) error { return o(c) } -func (o beforeCall) after(c *callInfo) {} - -type afterCall func(c *callInfo) - -func (o afterCall) before(c *callInfo) error { return nil } -func (o afterCall) after(c *callInfo) { o(c) } - -// Header returns a CallOptions that retrieves the header metadata -// for a unary RPC. -func Header(md *metadata.MD) CallOption { - return afterCall(func(c *callInfo) { - *md = c.headerMD - }) -} - -// Trailer returns a CallOptions that retrieves the trailer metadata -// for a unary RPC. -func Trailer(md *metadata.MD) CallOption { - return afterCall(func(c *callInfo) { - *md = c.trailerMD - }) -} - -// Peer returns a CallOption that retrieves peer information for a -// unary RPC. -func Peer(peer *peer.Peer) CallOption { - return afterCall(func(c *callInfo) { - if c.peer != nil { - *peer = *c.peer - } - }) -} - -// FailFast configures the action to take when an RPC is attempted on broken -// connections or unreachable servers. If failfast is true, the RPC will fail -// immediately. Otherwise, the RPC client will block the call until a -// connection is available (or the call is canceled or times out) and will retry -// the call if it fails due to a transient error. Please refer to -// https://github.com/grpc/grpc/blob/master/doc/wait-for-ready.md. -// Note: failFast is default to true. -func FailFast(failFast bool) CallOption { - return beforeCall(func(c *callInfo) error { - c.failFast = failFast - return nil - }) -} - -// MaxCallRecvMsgSize returns a CallOption which sets the maximum message size the client can receive. -func MaxCallRecvMsgSize(s int) CallOption { - return beforeCall(func(o *callInfo) error { - o.maxReceiveMessageSize = &s - return nil - }) -} - -// MaxCallSendMsgSize returns a CallOption which sets the maximum message size the client can send. -func MaxCallSendMsgSize(s int) CallOption { - return beforeCall(func(o *callInfo) error { - o.maxSendMessageSize = &s - return nil - }) -} - -// PerRPCCredentials returns a CallOption that sets credentials.PerRPCCredentials -// for a call. -func PerRPCCredentials(creds credentials.PerRPCCredentials) CallOption { - return beforeCall(func(c *callInfo) error { - c.creds = creds - return nil - }) -} - -// The format of the payload: compressed or not? -type payloadFormat uint8 - -const ( - compressionNone payloadFormat = iota // no compression - compressionMade -) - -// parser reads complete gRPC messages from the underlying reader. -type parser struct { - // r is the underlying reader. - // See the comment on recvMsg for the permissible - // error types. - r io.Reader - - // The header of a gRPC message. Find more detail - // at http://www.grpc.io/docs/guides/wire.html. - header [5]byte -} - -// recvMsg reads a complete gRPC message from the stream. -// -// It returns the message and its payload (compression/encoding) -// format. The caller owns the returned msg memory. -// -// If there is an error, possible values are: -// * io.EOF, when no messages remain -// * io.ErrUnexpectedEOF -// * of type transport.ConnectionError -// * of type transport.StreamError -// No other error values or types must be returned, which also means -// that the underlying io.Reader must not return an incompatible -// error. -func (p *parser) recvMsg(maxReceiveMessageSize int) (pf payloadFormat, msg []byte, err error) { - if _, err := p.r.Read(p.header[:]); err != nil { - return 0, nil, err - } - - pf = payloadFormat(p.header[0]) - length := binary.BigEndian.Uint32(p.header[1:]) - - if length == 0 { - return pf, nil, nil - } - if length > uint32(maxReceiveMessageSize) { - return 0, nil, Errorf(codes.ResourceExhausted, "grpc: received message larger than max (%d vs. %d)", length, maxReceiveMessageSize) - } - // TODO(bradfitz,zhaoq): garbage. reuse buffer after proto decoding instead - // of making it for each message: - msg = make([]byte, int(length)) - if _, err := p.r.Read(msg); err != nil { - if err == io.EOF { - err = io.ErrUnexpectedEOF - } - return 0, nil, err - } - return pf, msg, nil -} - -// encode serializes msg and prepends the message header. If msg is nil, it -// generates the message header of 0 message length. -func encode(c Codec, msg interface{}, cp Compressor, cbuf *bytes.Buffer, outPayload *stats.OutPayload) ([]byte, error) { - var ( - b []byte - length uint - ) - if msg != nil { - var err error - // TODO(zhaoq): optimize to reduce memory alloc and copying. - b, err = c.Marshal(msg) - if err != nil { - return nil, err - } - if outPayload != nil { - outPayload.Payload = msg - // TODO truncate large payload. - outPayload.Data = b - outPayload.Length = len(b) - } - if cp != nil { - if err := cp.Do(cbuf, b); err != nil { - return nil, err - } - b = cbuf.Bytes() - } - length = uint(len(b)) - } - if length > math.MaxUint32 { - return nil, Errorf(codes.ResourceExhausted, "grpc: message too large (%d bytes)", length) - } - - const ( - payloadLen = 1 - sizeLen = 4 - ) - - var buf = make([]byte, payloadLen+sizeLen+len(b)) - - // Write payload format - if cp == nil { - buf[0] = byte(compressionNone) - } else { - buf[0] = byte(compressionMade) - } - // Write length of b into buf - binary.BigEndian.PutUint32(buf[1:], uint32(length)) - // Copy encoded msg to buf - copy(buf[5:], b) - - if outPayload != nil { - outPayload.WireLength = len(buf) - } - - return buf, nil -} - -func checkRecvPayload(pf payloadFormat, recvCompress string, dc Decompressor) error { - switch pf { - case compressionNone: - case compressionMade: - if dc == nil || recvCompress != dc.Type() { - return Errorf(codes.Unimplemented, "grpc: Decompressor is not installed for grpc-encoding %q", recvCompress) - } - default: - return Errorf(codes.Internal, "grpc: received unexpected payload format %d", pf) - } - return nil -} - -func recv(p *parser, c Codec, s *transport.Stream, dc Decompressor, m interface{}, maxReceiveMessageSize int, inPayload *stats.InPayload) error { - pf, d, err := p.recvMsg(maxReceiveMessageSize) - if err != nil { - return err - } - if inPayload != nil { - inPayload.WireLength = len(d) - } - if err := checkRecvPayload(pf, s.RecvCompress(), dc); err != nil { - return err - } - if pf == compressionMade { - d, err = dc.Do(bytes.NewReader(d)) - if err != nil { - return Errorf(codes.Internal, "grpc: failed to decompress the received message %v", err) - } - } - if len(d) > maxReceiveMessageSize { - // TODO: Revisit the error code. Currently keep it consistent with java - // implementation. - return Errorf(codes.ResourceExhausted, "grpc: received message larger than max (%d vs. %d)", len(d), maxReceiveMessageSize) - } - if err := c.Unmarshal(d, m); err != nil { - return Errorf(codes.Internal, "grpc: failed to unmarshal the received message %v", err) - } - if inPayload != nil { - inPayload.RecvTime = time.Now() - inPayload.Payload = m - // TODO truncate large payload. - inPayload.Data = d - inPayload.Length = len(d) - } - return nil -} - -type rpcInfo struct { - bytesSent bool - bytesReceived bool -} - -type rpcInfoContextKey struct{} - -func newContextWithRPCInfo(ctx context.Context) context.Context { - return context.WithValue(ctx, rpcInfoContextKey{}, &rpcInfo{}) -} - -func rpcInfoFromContext(ctx context.Context) (s *rpcInfo, ok bool) { - s, ok = ctx.Value(rpcInfoContextKey{}).(*rpcInfo) - return -} - -func updateRPCInfoInContext(ctx context.Context, s rpcInfo) { - if ss, ok := rpcInfoFromContext(ctx); ok { - *ss = s - } - return -} - -// Code returns the error code for err if it was produced by the rpc system. -// Otherwise, it returns codes.Unknown. -// -// Deprecated; use status.FromError and Code method instead. -func Code(err error) codes.Code { - if s, ok := status.FromError(err); ok { - return s.Code() - } - return codes.Unknown -} - -// ErrorDesc returns the error description of err if it was produced by the rpc system. -// Otherwise, it returns err.Error() or empty string when err is nil. -// -// Deprecated; use status.FromError and Message method instead. -func ErrorDesc(err error) string { - if s, ok := status.FromError(err); ok { - return s.Message() - } - return err.Error() -} - -// Errorf returns an error containing an error code and a description; -// Errorf returns nil if c is OK. -// -// Deprecated; use status.Errorf instead. -func Errorf(c codes.Code, format string, a ...interface{}) error { - return status.Errorf(c, format, a...) -} - -// MethodConfig defines the configuration recommended by the service providers for a -// particular method. -// This is EXPERIMENTAL and subject to change. -type MethodConfig struct { - // WaitForReady indicates whether RPCs sent to this method should wait until - // the connection is ready by default (!failfast). The value specified via the - // gRPC client API will override the value set here. - WaitForReady *bool - // Timeout is the default timeout for RPCs sent to this method. The actual - // deadline used will be the minimum of the value specified here and the value - // set by the application via the gRPC client API. If either one is not set, - // then the other will be used. If neither is set, then the RPC has no deadline. - Timeout *time.Duration - // MaxReqSize is the maximum allowed payload size for an individual request in a - // stream (client->server) in bytes. The size which is measured is the serialized - // payload after per-message compression (but before stream compression) in bytes. - // The actual value used is the minumum of the value specified here and the value set - // by the application via the gRPC client API. If either one is not set, then the other - // will be used. If neither is set, then the built-in default is used. - MaxReqSize *int - // MaxRespSize is the maximum allowed payload size for an individual response in a - // stream (server->client) in bytes. - MaxRespSize *int -} - -// ServiceConfig is provided by the service provider and contains parameters for how -// clients that connect to the service should behave. -// This is EXPERIMENTAL and subject to change. -type ServiceConfig struct { - // LB is the load balancer the service providers recommends. The balancer specified - // via grpc.WithBalancer will override this. - LB Balancer - // Methods contains a map for the methods in this service. - // If there is an exact match for a method (i.e. /service/method) in the map, use the corresponding MethodConfig. - // If there's no exact match, look for the default config for the service (/service/) and use the corresponding MethodConfig if it exists. - // Otherwise, the method has no MethodConfig to use. - Methods map[string]MethodConfig -} - -func min(a, b *int) *int { - if *a < *b { - return a - } - return b -} - -func getMaxSize(mcMax, doptMax *int, defaultVal int) *int { - if mcMax == nil && doptMax == nil { - return &defaultVal - } - if mcMax != nil && doptMax != nil { - return min(mcMax, doptMax) - } - if mcMax != nil { - return mcMax - } - return doptMax -} - -// SupportPackageIsVersion4 is referenced from generated protocol buffer files -// to assert that that code is compatible with this version of the grpc package. -// -// This constant may be renamed in the future if a change in the generated code -// requires a synchronised update of grpc-go and protoc-gen-go. This constant -// should not be referenced from any other code. -const SupportPackageIsVersion4 = true - -// Version is the current grpc version. -const Version = "1.4.0-dev" - -const grpcUA = "grpc-go/" + Version diff --git a/vendor/google.golang.org/grpc/server.go b/vendor/google.golang.org/grpc/server.go deleted file mode 100644 index c2b523c7a..000000000 --- a/vendor/google.golang.org/grpc/server.go +++ /dev/null @@ -1,1151 +0,0 @@ -/* - * - * Copyright 2014, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT - * OWNER 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. - * - */ - -package grpc - -import ( - "bytes" - "errors" - "fmt" - "io" - "net" - "net/http" - "reflect" - "runtime" - "strings" - "sync" - "time" - - "golang.org/x/net/context" - "golang.org/x/net/http2" - "golang.org/x/net/trace" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/credentials" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/internal" - "google.golang.org/grpc/keepalive" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/stats" - "google.golang.org/grpc/status" - "google.golang.org/grpc/tap" - "google.golang.org/grpc/transport" -) - -const ( - defaultServerMaxReceiveMessageSize = 1024 * 1024 * 4 - defaultServerMaxSendMessageSize = 1024 * 1024 * 4 -) - -type methodHandler func(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor UnaryServerInterceptor) (interface{}, error) - -// MethodDesc represents an RPC service's method specification. -type MethodDesc struct { - MethodName string - Handler methodHandler -} - -// ServiceDesc represents an RPC service's specification. -type ServiceDesc struct { - ServiceName string - // The pointer to the service interface. Used to check whether the user - // provided implementation satisfies the interface requirements. - HandlerType interface{} - Methods []MethodDesc - Streams []StreamDesc - Metadata interface{} -} - -// service consists of the information of the server serving this service and -// the methods in this service. -type service struct { - server interface{} // the server for service methods - md map[string]*MethodDesc - sd map[string]*StreamDesc - mdata interface{} -} - -// Server is a gRPC server to serve RPC requests. -type Server struct { - opts options - - mu sync.Mutex // guards following - lis map[net.Listener]bool - conns map[io.Closer]bool - drain bool - ctx context.Context - cancel context.CancelFunc - // A CondVar to let GracefulStop() blocks until all the pending RPCs are finished - // and all the transport goes away. - cv *sync.Cond - m map[string]*service // service name -> service info - events trace.EventLog -} - -type options struct { - creds credentials.TransportCredentials - codec Codec - cp Compressor - dc Decompressor - unaryInt UnaryServerInterceptor - streamInt StreamServerInterceptor - inTapHandle tap.ServerInHandle - statsHandler stats.Handler - maxConcurrentStreams uint32 - maxReceiveMessageSize int - maxSendMessageSize int - useHandlerImpl bool // use http.Handler-based server - unknownStreamDesc *StreamDesc - keepaliveParams keepalive.ServerParameters - keepalivePolicy keepalive.EnforcementPolicy - initialWindowSize int32 - initialConnWindowSize int32 -} - -var defaultServerOptions = options{ - maxReceiveMessageSize: defaultServerMaxReceiveMessageSize, - maxSendMessageSize: defaultServerMaxSendMessageSize, -} - -// A ServerOption sets options such as credentials, codec and keepalive parameters, etc. -type ServerOption func(*options) - -// InitialWindowSize returns a ServerOption that sets window size for stream. -// The lower bound for window size is 64K and any value smaller than that will be ignored. -func InitialWindowSize(s int32) ServerOption { - return func(o *options) { - o.initialWindowSize = s - } -} - -// InitialConnWindowSize returns a ServerOption that sets window size for a connection. -// The lower bound for window size is 64K and any value smaller than that will be ignored. -func InitialConnWindowSize(s int32) ServerOption { - return func(o *options) { - o.initialConnWindowSize = s - } -} - -// KeepaliveParams returns a ServerOption that sets keepalive and max-age parameters for the server. -func KeepaliveParams(kp keepalive.ServerParameters) ServerOption { - return func(o *options) { - o.keepaliveParams = kp - } -} - -// KeepaliveEnforcementPolicy returns a ServerOption that sets keepalive enforcement policy for the server. -func KeepaliveEnforcementPolicy(kep keepalive.EnforcementPolicy) ServerOption { - return func(o *options) { - o.keepalivePolicy = kep - } -} - -// CustomCodec returns a ServerOption that sets a codec for message marshaling and unmarshaling. -func CustomCodec(codec Codec) ServerOption { - return func(o *options) { - o.codec = codec - } -} - -// RPCCompressor returns a ServerOption that sets a compressor for outbound messages. -func RPCCompressor(cp Compressor) ServerOption { - return func(o *options) { - o.cp = cp - } -} - -// RPCDecompressor returns a ServerOption that sets a decompressor for inbound messages. -func RPCDecompressor(dc Decompressor) ServerOption { - return func(o *options) { - o.dc = dc - } -} - -// MaxMsgSize returns a ServerOption to set the max message size in bytes the server can receive. -// If this is not set, gRPC uses the default limit. Deprecated: use MaxRecvMsgSize instead. -func MaxMsgSize(m int) ServerOption { - return MaxRecvMsgSize(m) -} - -// MaxRecvMsgSize returns a ServerOption to set the max message size in bytes the server can receive. -// If this is not set, gRPC uses the default 4MB. -func MaxRecvMsgSize(m int) ServerOption { - return func(o *options) { - o.maxReceiveMessageSize = m - } -} - -// MaxSendMsgSize returns a ServerOption to set the max message size in bytes the server can send. -// If this is not set, gRPC uses the default 4MB. -func MaxSendMsgSize(m int) ServerOption { - return func(o *options) { - o.maxSendMessageSize = m - } -} - -// MaxConcurrentStreams returns a ServerOption that will apply a limit on the number -// of concurrent streams to each ServerTransport. -func MaxConcurrentStreams(n uint32) ServerOption { - return func(o *options) { - o.maxConcurrentStreams = n - } -} - -// Creds returns a ServerOption that sets credentials for server connections. -func Creds(c credentials.TransportCredentials) ServerOption { - return func(o *options) { - o.creds = c - } -} - -// UnaryInterceptor returns a ServerOption that sets the UnaryServerInterceptor for the -// server. Only one unary interceptor can be installed. The construction of multiple -// interceptors (e.g., chaining) can be implemented at the caller. -func UnaryInterceptor(i UnaryServerInterceptor) ServerOption { - return func(o *options) { - if o.unaryInt != nil { - panic("The unary server interceptor was already set and may not be reset.") - } - o.unaryInt = i - } -} - -// StreamInterceptor returns a ServerOption that sets the StreamServerInterceptor for the -// server. Only one stream interceptor can be installed. -func StreamInterceptor(i StreamServerInterceptor) ServerOption { - return func(o *options) { - if o.streamInt != nil { - panic("The stream server interceptor was already set and may not be reset.") - } - o.streamInt = i - } -} - -// InTapHandle returns a ServerOption that sets the tap handle for all the server -// transport to be created. Only one can be installed. -func InTapHandle(h tap.ServerInHandle) ServerOption { - return func(o *options) { - if o.inTapHandle != nil { - panic("The tap handle was already set and may not be reset.") - } - o.inTapHandle = h - } -} - -// StatsHandler returns a ServerOption that sets the stats handler for the server. -func StatsHandler(h stats.Handler) ServerOption { - return func(o *options) { - o.statsHandler = h - } -} - -// UnknownServiceHandler returns a ServerOption that allows for adding a custom -// unknown service handler. The provided method is a bidi-streaming RPC service -// handler that will be invoked instead of returning the "unimplemented" gRPC -// error whenever a request is received for an unregistered service or method. -// The handling function has full access to the Context of the request and the -// stream, and the invocation passes through interceptors. -func UnknownServiceHandler(streamHandler StreamHandler) ServerOption { - return func(o *options) { - o.unknownStreamDesc = &StreamDesc{ - StreamName: "unknown_service_handler", - Handler: streamHandler, - // We need to assume that the users of the streamHandler will want to use both. - ClientStreams: true, - ServerStreams: true, - } - } -} - -// NewServer creates a gRPC server which has no service registered and has not -// started to accept requests yet. -func NewServer(opt ...ServerOption) *Server { - opts := defaultServerOptions - for _, o := range opt { - o(&opts) - } - if opts.codec == nil { - // Set the default codec. - opts.codec = protoCodec{} - } - s := &Server{ - lis: make(map[net.Listener]bool), - opts: opts, - conns: make(map[io.Closer]bool), - m: make(map[string]*service), - } - s.cv = sync.NewCond(&s.mu) - s.ctx, s.cancel = context.WithCancel(context.Background()) - if EnableTracing { - _, file, line, _ := runtime.Caller(1) - s.events = trace.NewEventLog("grpc.Server", fmt.Sprintf("%s:%d", file, line)) - } - return s -} - -// printf records an event in s's event log, unless s has been stopped. -// REQUIRES s.mu is held. -func (s *Server) printf(format string, a ...interface{}) { - if s.events != nil { - s.events.Printf(format, a...) - } -} - -// errorf records an error in s's event log, unless s has been stopped. -// REQUIRES s.mu is held. -func (s *Server) errorf(format string, a ...interface{}) { - if s.events != nil { - s.events.Errorf(format, a...) - } -} - -// RegisterService registers a service and its implementation to the gRPC -// server. It is called from the IDL generated code. This must be called before -// invoking Serve. -func (s *Server) RegisterService(sd *ServiceDesc, ss interface{}) { - ht := reflect.TypeOf(sd.HandlerType).Elem() - st := reflect.TypeOf(ss) - if !st.Implements(ht) { - grpclog.Fatalf("grpc: Server.RegisterService found the handler of type %v that does not satisfy %v", st, ht) - } - s.register(sd, ss) -} - -func (s *Server) register(sd *ServiceDesc, ss interface{}) { - s.mu.Lock() - defer s.mu.Unlock() - s.printf("RegisterService(%q)", sd.ServiceName) - if _, ok := s.m[sd.ServiceName]; ok { - grpclog.Fatalf("grpc: Server.RegisterService found duplicate service registration for %q", sd.ServiceName) - } - srv := &service{ - server: ss, - md: make(map[string]*MethodDesc), - sd: make(map[string]*StreamDesc), - mdata: sd.Metadata, - } - for i := range sd.Methods { - d := &sd.Methods[i] - srv.md[d.MethodName] = d - } - for i := range sd.Streams { - d := &sd.Streams[i] - srv.sd[d.StreamName] = d - } - s.m[sd.ServiceName] = srv -} - -// MethodInfo contains the information of an RPC including its method name and type. -type MethodInfo struct { - // Name is the method name only, without the service name or package name. - Name string - // IsClientStream indicates whether the RPC is a client streaming RPC. - IsClientStream bool - // IsServerStream indicates whether the RPC is a server streaming RPC. - IsServerStream bool -} - -// ServiceInfo contains unary RPC method info, streaming RPC method info and metadata for a service. -type ServiceInfo struct { - Methods []MethodInfo - // Metadata is the metadata specified in ServiceDesc when registering service. - Metadata interface{} -} - -// GetServiceInfo returns a map from service names to ServiceInfo. -// Service names include the package names, in the form of .. -func (s *Server) GetServiceInfo() map[string]ServiceInfo { - ret := make(map[string]ServiceInfo) - for n, srv := range s.m { - methods := make([]MethodInfo, 0, len(srv.md)+len(srv.sd)) - for m := range srv.md { - methods = append(methods, MethodInfo{ - Name: m, - IsClientStream: false, - IsServerStream: false, - }) - } - for m, d := range srv.sd { - methods = append(methods, MethodInfo{ - Name: m, - IsClientStream: d.ClientStreams, - IsServerStream: d.ServerStreams, - }) - } - - ret[n] = ServiceInfo{ - Methods: methods, - Metadata: srv.mdata, - } - } - return ret -} - -var ( - // ErrServerStopped indicates that the operation is now illegal because of - // the server being stopped. - ErrServerStopped = errors.New("grpc: the server has been stopped") -) - -func (s *Server) useTransportAuthenticator(rawConn net.Conn) (net.Conn, credentials.AuthInfo, error) { - if s.opts.creds == nil { - return rawConn, nil, nil - } - return s.opts.creds.ServerHandshake(rawConn) -} - -// Serve accepts incoming connections on the listener lis, creating a new -// ServerTransport and service goroutine for each. The service goroutines -// read gRPC requests and then call the registered handlers to reply to them. -// Serve returns when lis.Accept fails with fatal errors. lis will be closed when -// this method returns. -// Serve always returns non-nil error. -func (s *Server) Serve(lis net.Listener) error { - s.mu.Lock() - s.printf("serving") - if s.lis == nil { - s.mu.Unlock() - lis.Close() - return ErrServerStopped - } - s.lis[lis] = true - s.mu.Unlock() - defer func() { - s.mu.Lock() - if s.lis != nil && s.lis[lis] { - lis.Close() - delete(s.lis, lis) - } - s.mu.Unlock() - }() - - var tempDelay time.Duration // how long to sleep on accept failure - - for { - rawConn, err := lis.Accept() - if err != nil { - if ne, ok := err.(interface { - Temporary() bool - }); ok && ne.Temporary() { - if tempDelay == 0 { - tempDelay = 5 * time.Millisecond - } else { - tempDelay *= 2 - } - if max := 1 * time.Second; tempDelay > max { - tempDelay = max - } - s.mu.Lock() - s.printf("Accept error: %v; retrying in %v", err, tempDelay) - s.mu.Unlock() - timer := time.NewTimer(tempDelay) - select { - case <-timer.C: - case <-s.ctx.Done(): - } - timer.Stop() - continue - } - s.mu.Lock() - s.printf("done serving; Accept = %v", err) - s.mu.Unlock() - return err - } - tempDelay = 0 - // Start a new goroutine to deal with rawConn - // so we don't stall this Accept loop goroutine. - go s.handleRawConn(rawConn) - } -} - -// handleRawConn is run in its own goroutine and handles a just-accepted -// connection that has not had any I/O performed on it yet. -func (s *Server) handleRawConn(rawConn net.Conn) { - conn, authInfo, err := s.useTransportAuthenticator(rawConn) - if err != nil { - s.mu.Lock() - s.errorf("ServerHandshake(%q) failed: %v", rawConn.RemoteAddr(), err) - s.mu.Unlock() - grpclog.Printf("grpc: Server.Serve failed to complete security handshake from %q: %v", rawConn.RemoteAddr(), err) - // If serverHandShake returns ErrConnDispatched, keep rawConn open. - if err != credentials.ErrConnDispatched { - rawConn.Close() - } - return - } - - s.mu.Lock() - if s.conns == nil { - s.mu.Unlock() - conn.Close() - return - } - s.mu.Unlock() - - if s.opts.useHandlerImpl { - s.serveUsingHandler(conn) - } else { - s.serveHTTP2Transport(conn, authInfo) - } -} - -// serveHTTP2Transport sets up a http/2 transport (using the -// gRPC http2 server transport in transport/http2_server.go) and -// serves streams on it. -// This is run in its own goroutine (it does network I/O in -// transport.NewServerTransport). -func (s *Server) serveHTTP2Transport(c net.Conn, authInfo credentials.AuthInfo) { - config := &transport.ServerConfig{ - MaxStreams: s.opts.maxConcurrentStreams, - AuthInfo: authInfo, - InTapHandle: s.opts.inTapHandle, - StatsHandler: s.opts.statsHandler, - KeepaliveParams: s.opts.keepaliveParams, - KeepalivePolicy: s.opts.keepalivePolicy, - InitialWindowSize: s.opts.initialWindowSize, - InitialConnWindowSize: s.opts.initialConnWindowSize, - } - st, err := transport.NewServerTransport("http2", c, config) - if err != nil { - s.mu.Lock() - s.errorf("NewServerTransport(%q) failed: %v", c.RemoteAddr(), err) - s.mu.Unlock() - c.Close() - grpclog.Println("grpc: Server.Serve failed to create ServerTransport: ", err) - return - } - if !s.addConn(st) { - st.Close() - return - } - s.serveStreams(st) -} - -func (s *Server) serveStreams(st transport.ServerTransport) { - defer s.removeConn(st) - defer st.Close() - var wg sync.WaitGroup - st.HandleStreams(func(stream *transport.Stream) { - wg.Add(1) - go func() { - defer wg.Done() - s.handleStream(st, stream, s.traceInfo(st, stream)) - }() - }, func(ctx context.Context, method string) context.Context { - if !EnableTracing { - return ctx - } - tr := trace.New("grpc.Recv."+methodFamily(method), method) - return trace.NewContext(ctx, tr) - }) - wg.Wait() -} - -var _ http.Handler = (*Server)(nil) - -// serveUsingHandler is called from handleRawConn when s is configured -// to handle requests via the http.Handler interface. It sets up a -// net/http.Server to handle the just-accepted conn. The http.Server -// is configured to route all incoming requests (all HTTP/2 streams) -// to ServeHTTP, which creates a new ServerTransport for each stream. -// serveUsingHandler blocks until conn closes. -// -// This codepath is only used when Server.TestingUseHandlerImpl has -// been configured. This lets the end2end tests exercise the ServeHTTP -// method as one of the environment types. -// -// conn is the *tls.Conn that's already been authenticated. -func (s *Server) serveUsingHandler(conn net.Conn) { - if !s.addConn(conn) { - conn.Close() - return - } - defer s.removeConn(conn) - h2s := &http2.Server{ - MaxConcurrentStreams: s.opts.maxConcurrentStreams, - } - h2s.ServeConn(conn, &http2.ServeConnOpts{ - Handler: s, - }) -} - -func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { - st, err := transport.NewServerHandlerTransport(w, r) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - if !s.addConn(st) { - st.Close() - return - } - defer s.removeConn(st) - s.serveStreams(st) -} - -// traceInfo returns a traceInfo and associates it with stream, if tracing is enabled. -// If tracing is not enabled, it returns nil. -func (s *Server) traceInfo(st transport.ServerTransport, stream *transport.Stream) (trInfo *traceInfo) { - tr, ok := trace.FromContext(stream.Context()) - if !ok { - return nil - } - - trInfo = &traceInfo{ - tr: tr, - } - trInfo.firstLine.client = false - trInfo.firstLine.remoteAddr = st.RemoteAddr() - - if dl, ok := stream.Context().Deadline(); ok { - trInfo.firstLine.deadline = dl.Sub(time.Now()) - } - return trInfo -} - -func (s *Server) addConn(c io.Closer) bool { - s.mu.Lock() - defer s.mu.Unlock() - if s.conns == nil || s.drain { - return false - } - s.conns[c] = true - return true -} - -func (s *Server) removeConn(c io.Closer) { - s.mu.Lock() - defer s.mu.Unlock() - if s.conns != nil { - delete(s.conns, c) - s.cv.Broadcast() - } -} - -func (s *Server) sendResponse(t transport.ServerTransport, stream *transport.Stream, msg interface{}, cp Compressor, opts *transport.Options) error { - var ( - cbuf *bytes.Buffer - outPayload *stats.OutPayload - ) - if cp != nil { - cbuf = new(bytes.Buffer) - } - if s.opts.statsHandler != nil { - outPayload = &stats.OutPayload{} - } - p, err := encode(s.opts.codec, msg, cp, cbuf, outPayload) - if err != nil { - // This typically indicates a fatal issue (e.g., memory - // corruption or hardware faults) the application program - // cannot handle. - // - // TODO(zhaoq): There exist other options also such as only closing the - // faulty stream locally and remotely (Other streams can keep going). Find - // the optimal option. - grpclog.Fatalf("grpc: Server failed to encode response %v", err) - } - if len(p) > s.opts.maxSendMessageSize { - return status.Errorf(codes.ResourceExhausted, "grpc: trying to send message larger than max (%d vs. %d)", len(p), s.opts.maxSendMessageSize) - } - err = t.Write(stream, p, opts) - if err == nil && outPayload != nil { - outPayload.SentTime = time.Now() - s.opts.statsHandler.HandleRPC(stream.Context(), outPayload) - } - return err -} - -func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport.Stream, srv *service, md *MethodDesc, trInfo *traceInfo) (err error) { - sh := s.opts.statsHandler - if sh != nil { - begin := &stats.Begin{ - BeginTime: time.Now(), - } - sh.HandleRPC(stream.Context(), begin) - defer func() { - end := &stats.End{ - EndTime: time.Now(), - } - if err != nil && err != io.EOF { - end.Error = toRPCErr(err) - } - sh.HandleRPC(stream.Context(), end) - }() - } - if trInfo != nil { - defer trInfo.tr.Finish() - trInfo.firstLine.client = false - trInfo.tr.LazyLog(&trInfo.firstLine, false) - defer func() { - if err != nil && err != io.EOF { - trInfo.tr.LazyLog(&fmtStringer{"%v", []interface{}{err}}, true) - trInfo.tr.SetError() - } - }() - } - if s.opts.cp != nil { - // NOTE: this needs to be ahead of all handling, https://github.com/grpc/grpc-go/issues/686. - stream.SetSendCompress(s.opts.cp.Type()) - } - p := &parser{r: stream} - pf, req, err := p.recvMsg(s.opts.maxReceiveMessageSize) - if err == io.EOF { - // The entire stream is done (for unary RPC only). - return err - } - if err == io.ErrUnexpectedEOF { - err = Errorf(codes.Internal, io.ErrUnexpectedEOF.Error()) - } - if err != nil { - if st, ok := status.FromError(err); ok { - if e := t.WriteStatus(stream, st); e != nil { - grpclog.Printf("grpc: Server.processUnaryRPC failed to write status %v", e) - } - } else { - switch st := err.(type) { - case transport.ConnectionError: - // Nothing to do here. - case transport.StreamError: - if e := t.WriteStatus(stream, status.New(st.Code, st.Desc)); e != nil { - grpclog.Printf("grpc: Server.processUnaryRPC failed to write status %v", e) - } - default: - panic(fmt.Sprintf("grpc: Unexpected error (%T) from recvMsg: %v", st, st)) - } - } - return err - } - - if err := checkRecvPayload(pf, stream.RecvCompress(), s.opts.dc); err != nil { - if st, ok := status.FromError(err); ok { - if e := t.WriteStatus(stream, st); e != nil { - grpclog.Printf("grpc: Server.processUnaryRPC failed to write status %v", e) - } - return err - } - if e := t.WriteStatus(stream, status.New(codes.Internal, err.Error())); e != nil { - grpclog.Printf("grpc: Server.processUnaryRPC failed to write status %v", e) - } - - // TODO checkRecvPayload always return RPC error. Add a return here if necessary. - } - var inPayload *stats.InPayload - if sh != nil { - inPayload = &stats.InPayload{ - RecvTime: time.Now(), - } - } - df := func(v interface{}) error { - if inPayload != nil { - inPayload.WireLength = len(req) - } - if pf == compressionMade { - var err error - req, err = s.opts.dc.Do(bytes.NewReader(req)) - if err != nil { - return Errorf(codes.Internal, err.Error()) - } - } - if len(req) > s.opts.maxReceiveMessageSize { - // TODO: Revisit the error code. Currently keep it consistent with - // java implementation. - return status.Errorf(codes.ResourceExhausted, "grpc: received message larger than max (%d vs. %d)", len(req), s.opts.maxReceiveMessageSize) - } - if err := s.opts.codec.Unmarshal(req, v); err != nil { - return status.Errorf(codes.Internal, "grpc: error unmarshalling request: %v", err) - } - if inPayload != nil { - inPayload.Payload = v - inPayload.Data = req - inPayload.Length = len(req) - sh.HandleRPC(stream.Context(), inPayload) - } - if trInfo != nil { - trInfo.tr.LazyLog(&payload{sent: false, msg: v}, true) - } - return nil - } - reply, appErr := md.Handler(srv.server, stream.Context(), df, s.opts.unaryInt) - if appErr != nil { - appStatus, ok := status.FromError(appErr) - if !ok { - // Convert appErr if it is not a grpc status error. - appErr = status.Error(convertCode(appErr), appErr.Error()) - appStatus, _ = status.FromError(appErr) - } - if trInfo != nil { - trInfo.tr.LazyLog(stringer(appStatus.Message()), true) - trInfo.tr.SetError() - } - if e := t.WriteStatus(stream, appStatus); e != nil { - grpclog.Printf("grpc: Server.processUnaryRPC failed to write status: %v", e) - } - return appErr - } - if trInfo != nil { - trInfo.tr.LazyLog(stringer("OK"), false) - } - opts := &transport.Options{ - Last: true, - Delay: false, - } - if err := s.sendResponse(t, stream, reply, s.opts.cp, opts); err != nil { - if err == io.EOF { - // The entire stream is done (for unary RPC only). - return err - } - if s, ok := status.FromError(err); ok { - if e := t.WriteStatus(stream, s); e != nil { - grpclog.Printf("grpc: Server.processUnaryRPC failed to write status: %v", e) - } - } else { - switch st := err.(type) { - case transport.ConnectionError: - // Nothing to do here. - case transport.StreamError: - if e := t.WriteStatus(stream, status.New(st.Code, st.Desc)); e != nil { - grpclog.Printf("grpc: Server.processUnaryRPC failed to write status %v", e) - } - default: - panic(fmt.Sprintf("grpc: Unexpected error (%T) from sendResponse: %v", st, st)) - } - } - return err - } - if trInfo != nil { - trInfo.tr.LazyLog(&payload{sent: true, msg: reply}, true) - } - // TODO: Should we be logging if writing status failed here, like above? - // Should the logging be in WriteStatus? Should we ignore the WriteStatus - // error or allow the stats handler to see it? - return t.WriteStatus(stream, status.New(codes.OK, "")) -} - -func (s *Server) processStreamingRPC(t transport.ServerTransport, stream *transport.Stream, srv *service, sd *StreamDesc, trInfo *traceInfo) (err error) { - sh := s.opts.statsHandler - if sh != nil { - begin := &stats.Begin{ - BeginTime: time.Now(), - } - sh.HandleRPC(stream.Context(), begin) - defer func() { - end := &stats.End{ - EndTime: time.Now(), - } - if err != nil && err != io.EOF { - end.Error = toRPCErr(err) - } - sh.HandleRPC(stream.Context(), end) - }() - } - if s.opts.cp != nil { - stream.SetSendCompress(s.opts.cp.Type()) - } - ss := &serverStream{ - t: t, - s: stream, - p: &parser{r: stream}, - codec: s.opts.codec, - cp: s.opts.cp, - dc: s.opts.dc, - maxReceiveMessageSize: s.opts.maxReceiveMessageSize, - maxSendMessageSize: s.opts.maxSendMessageSize, - trInfo: trInfo, - statsHandler: sh, - } - if ss.cp != nil { - ss.cbuf = new(bytes.Buffer) - } - if trInfo != nil { - trInfo.tr.LazyLog(&trInfo.firstLine, false) - defer func() { - ss.mu.Lock() - if err != nil && err != io.EOF { - ss.trInfo.tr.LazyLog(&fmtStringer{"%v", []interface{}{err}}, true) - ss.trInfo.tr.SetError() - } - ss.trInfo.tr.Finish() - ss.trInfo.tr = nil - ss.mu.Unlock() - }() - } - var appErr error - var server interface{} - if srv != nil { - server = srv.server - } - if s.opts.streamInt == nil { - appErr = sd.Handler(server, ss) - } else { - info := &StreamServerInfo{ - FullMethod: stream.Method(), - IsClientStream: sd.ClientStreams, - IsServerStream: sd.ServerStreams, - } - appErr = s.opts.streamInt(server, ss, info, sd.Handler) - } - if appErr != nil { - appStatus, ok := status.FromError(appErr) - if !ok { - switch err := appErr.(type) { - case transport.StreamError: - appStatus = status.New(err.Code, err.Desc) - default: - appStatus = status.New(convertCode(appErr), appErr.Error()) - } - appErr = appStatus.Err() - } - if trInfo != nil { - ss.mu.Lock() - ss.trInfo.tr.LazyLog(stringer(appStatus.Message()), true) - ss.trInfo.tr.SetError() - ss.mu.Unlock() - } - t.WriteStatus(ss.s, appStatus) - // TODO: Should we log an error from WriteStatus here and below? - return appErr - } - if trInfo != nil { - ss.mu.Lock() - ss.trInfo.tr.LazyLog(stringer("OK"), false) - ss.mu.Unlock() - } - return t.WriteStatus(ss.s, status.New(codes.OK, "")) - -} - -func (s *Server) handleStream(t transport.ServerTransport, stream *transport.Stream, trInfo *traceInfo) { - sm := stream.Method() - if sm != "" && sm[0] == '/' { - sm = sm[1:] - } - pos := strings.LastIndex(sm, "/") - if pos == -1 { - if trInfo != nil { - trInfo.tr.LazyLog(&fmtStringer{"Malformed method name %q", []interface{}{sm}}, true) - trInfo.tr.SetError() - } - errDesc := fmt.Sprintf("malformed method name: %q", stream.Method()) - if err := t.WriteStatus(stream, status.New(codes.ResourceExhausted, errDesc)); err != nil { - if trInfo != nil { - trInfo.tr.LazyLog(&fmtStringer{"%v", []interface{}{err}}, true) - trInfo.tr.SetError() - } - grpclog.Printf("grpc: Server.handleStream failed to write status: %v", err) - } - if trInfo != nil { - trInfo.tr.Finish() - } - return - } - service := sm[:pos] - method := sm[pos+1:] - srv, ok := s.m[service] - if !ok { - if unknownDesc := s.opts.unknownStreamDesc; unknownDesc != nil { - s.processStreamingRPC(t, stream, nil, unknownDesc, trInfo) - return - } - if trInfo != nil { - trInfo.tr.LazyLog(&fmtStringer{"Unknown service %v", []interface{}{service}}, true) - trInfo.tr.SetError() - } - errDesc := fmt.Sprintf("unknown service %v", service) - if err := t.WriteStatus(stream, status.New(codes.Unimplemented, errDesc)); err != nil { - if trInfo != nil { - trInfo.tr.LazyLog(&fmtStringer{"%v", []interface{}{err}}, true) - trInfo.tr.SetError() - } - grpclog.Printf("grpc: Server.handleStream failed to write status: %v", err) - } - if trInfo != nil { - trInfo.tr.Finish() - } - return - } - // Unary RPC or Streaming RPC? - if md, ok := srv.md[method]; ok { - s.processUnaryRPC(t, stream, srv, md, trInfo) - return - } - if sd, ok := srv.sd[method]; ok { - s.processStreamingRPC(t, stream, srv, sd, trInfo) - return - } - if trInfo != nil { - trInfo.tr.LazyLog(&fmtStringer{"Unknown method %v", []interface{}{method}}, true) - trInfo.tr.SetError() - } - if unknownDesc := s.opts.unknownStreamDesc; unknownDesc != nil { - s.processStreamingRPC(t, stream, nil, unknownDesc, trInfo) - return - } - errDesc := fmt.Sprintf("unknown method %v", method) - if err := t.WriteStatus(stream, status.New(codes.Unimplemented, errDesc)); err != nil { - if trInfo != nil { - trInfo.tr.LazyLog(&fmtStringer{"%v", []interface{}{err}}, true) - trInfo.tr.SetError() - } - grpclog.Printf("grpc: Server.handleStream failed to write status: %v", err) - } - if trInfo != nil { - trInfo.tr.Finish() - } -} - -// Stop stops the gRPC server. It immediately closes all open -// connections and listeners. -// It cancels all active RPCs on the server side and the corresponding -// pending RPCs on the client side will get notified by connection -// errors. -func (s *Server) Stop() { - s.mu.Lock() - listeners := s.lis - s.lis = nil - st := s.conns - s.conns = nil - // interrupt GracefulStop if Stop and GracefulStop are called concurrently. - s.cv.Broadcast() - s.mu.Unlock() - - for lis := range listeners { - lis.Close() - } - for c := range st { - c.Close() - } - - s.mu.Lock() - s.cancel() - if s.events != nil { - s.events.Finish() - s.events = nil - } - s.mu.Unlock() -} - -// GracefulStop stops the gRPC server gracefully. It stops the server from -// accepting new connections and RPCs and blocks until all the pending RPCs are -// finished. -func (s *Server) GracefulStop() { - s.mu.Lock() - defer s.mu.Unlock() - if s.conns == nil { - return - } - for lis := range s.lis { - lis.Close() - } - s.lis = nil - s.cancel() - if !s.drain { - for c := range s.conns { - c.(transport.ServerTransport).Drain() - } - s.drain = true - } - for len(s.conns) != 0 { - s.cv.Wait() - } - s.conns = nil - if s.events != nil { - s.events.Finish() - s.events = nil - } -} - -func init() { - internal.TestingCloseConns = func(arg interface{}) { - arg.(*Server).testingCloseConns() - } - internal.TestingUseHandlerImpl = func(arg interface{}) { - arg.(*Server).opts.useHandlerImpl = true - } -} - -// testingCloseConns closes all existing transports but keeps s.lis -// accepting new connections. -func (s *Server) testingCloseConns() { - s.mu.Lock() - for c := range s.conns { - c.Close() - delete(s.conns, c) - } - s.mu.Unlock() -} - -// SetHeader sets the header metadata. -// When called multiple times, all the provided metadata will be merged. -// All the metadata will be sent out when one of the following happens: -// - grpc.SendHeader() is called; -// - The first response is sent out; -// - An RPC status is sent out (error or success). -func SetHeader(ctx context.Context, md metadata.MD) error { - if md.Len() == 0 { - return nil - } - stream, ok := transport.StreamFromContext(ctx) - if !ok { - return Errorf(codes.Internal, "grpc: failed to fetch the stream from the context %v", ctx) - } - return stream.SetHeader(md) -} - -// SendHeader sends header metadata. It may be called at most once. -// The provided md and headers set by SetHeader() will be sent. -func SendHeader(ctx context.Context, md metadata.MD) error { - stream, ok := transport.StreamFromContext(ctx) - if !ok { - return Errorf(codes.Internal, "grpc: failed to fetch the stream from the context %v", ctx) - } - t := stream.ServerTransport() - if t == nil { - grpclog.Fatalf("grpc: SendHeader: %v has no ServerTransport to send header metadata.", stream) - } - if err := t.WriteHeader(stream, md); err != nil { - return toRPCErr(err) - } - return nil -} - -// SetTrailer sets the trailer metadata that will be sent when an RPC returns. -// When called more than once, all the provided metadata will be merged. -func SetTrailer(ctx context.Context, md metadata.MD) error { - if md.Len() == 0 { - return nil - } - stream, ok := transport.StreamFromContext(ctx) - if !ok { - return Errorf(codes.Internal, "grpc: failed to fetch the stream from the context %v", ctx) - } - return stream.SetTrailer(md) -} diff --git a/vendor/google.golang.org/grpc/stats/handlers.go b/vendor/google.golang.org/grpc/stats/handlers.go deleted file mode 100644 index 5fdce2f5b..000000000 --- a/vendor/google.golang.org/grpc/stats/handlers.go +++ /dev/null @@ -1,79 +0,0 @@ -/* - * - * Copyright 2016, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT - * OWNER 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. - * - */ - -package stats - -import ( - "net" - - "golang.org/x/net/context" -) - -// ConnTagInfo defines the relevant information needed by connection context tagger. -type ConnTagInfo struct { - // RemoteAddr is the remote address of the corresponding connection. - RemoteAddr net.Addr - // LocalAddr is the local address of the corresponding connection. - LocalAddr net.Addr -} - -// RPCTagInfo defines the relevant information needed by RPC context tagger. -type RPCTagInfo struct { - // FullMethodName is the RPC method in the format of /package.service/method. - FullMethodName string - // FailFast indicates if this RPC is failfast. - // This field is only valid on client side, it's always false on server side. - FailFast bool -} - -// Handler defines the interface for the related stats handling (e.g., RPCs, connections). -type Handler interface { - // TagRPC can attach some information to the given context. - // The context used for the rest lifetime of the RPC will be derived from - // the returned context. - TagRPC(context.Context, *RPCTagInfo) context.Context - // HandleRPC processes the RPC stats. - HandleRPC(context.Context, RPCStats) - - // TagConn can attach some information to the given context. - // The returned context will be used for stats handling. - // For conn stats handling, the context used in HandleConn for this - // connection will be derived from the context returned. - // For RPC stats handling, - // - On server side, the context used in HandleRPC for all RPCs on this - // connection will be derived from the context returned. - // - On client side, the context is not derived from the context returned. - TagConn(context.Context, *ConnTagInfo) context.Context - // HandleConn processes the Conn stats. - HandleConn(context.Context, ConnStats) -} diff --git a/vendor/google.golang.org/grpc/stats/stats.go b/vendor/google.golang.org/grpc/stats/stats.go deleted file mode 100644 index 6c406c7ba..000000000 --- a/vendor/google.golang.org/grpc/stats/stats.go +++ /dev/null @@ -1,223 +0,0 @@ -/* - * - * Copyright 2016, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT - * OWNER 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. - * - */ - -// Package stats is for collecting and reporting various network and RPC stats. -// This package is for monitoring purpose only. All fields are read-only. -// All APIs are experimental. -package stats // import "google.golang.org/grpc/stats" - -import ( - "net" - "time" -) - -// RPCStats contains stats information about RPCs. -type RPCStats interface { - isRPCStats() - // IsClient returns true if this RPCStats is from client side. - IsClient() bool -} - -// Begin contains stats when an RPC begins. -// FailFast is only valid if this Begin is from client side. -type Begin struct { - // Client is true if this Begin is from client side. - Client bool - // BeginTime is the time when the RPC begins. - BeginTime time.Time - // FailFast indicates if this RPC is failfast. - FailFast bool -} - -// IsClient indicates if the stats information is from client side. -func (s *Begin) IsClient() bool { return s.Client } - -func (s *Begin) isRPCStats() {} - -// InPayload contains the information for an incoming payload. -type InPayload struct { - // Client is true if this InPayload is from client side. - Client bool - // Payload is the payload with original type. - Payload interface{} - // Data is the serialized message payload. - Data []byte - // Length is the length of uncompressed data. - Length int - // WireLength is the length of data on wire (compressed, signed, encrypted). - WireLength int - // RecvTime is the time when the payload is received. - RecvTime time.Time -} - -// IsClient indicates if the stats information is from client side. -func (s *InPayload) IsClient() bool { return s.Client } - -func (s *InPayload) isRPCStats() {} - -// InHeader contains stats when a header is received. -type InHeader struct { - // Client is true if this InHeader is from client side. - Client bool - // WireLength is the wire length of header. - WireLength int - - // The following fields are valid only if Client is false. - // FullMethod is the full RPC method string, i.e., /package.service/method. - FullMethod string - // RemoteAddr is the remote address of the corresponding connection. - RemoteAddr net.Addr - // LocalAddr is the local address of the corresponding connection. - LocalAddr net.Addr - // Compression is the compression algorithm used for the RPC. - Compression string -} - -// IsClient indicates if the stats information is from client side. -func (s *InHeader) IsClient() bool { return s.Client } - -func (s *InHeader) isRPCStats() {} - -// InTrailer contains stats when a trailer is received. -type InTrailer struct { - // Client is true if this InTrailer is from client side. - Client bool - // WireLength is the wire length of trailer. - WireLength int -} - -// IsClient indicates if the stats information is from client side. -func (s *InTrailer) IsClient() bool { return s.Client } - -func (s *InTrailer) isRPCStats() {} - -// OutPayload contains the information for an outgoing payload. -type OutPayload struct { - // Client is true if this OutPayload is from client side. - Client bool - // Payload is the payload with original type. - Payload interface{} - // Data is the serialized message payload. - Data []byte - // Length is the length of uncompressed data. - Length int - // WireLength is the length of data on wire (compressed, signed, encrypted). - WireLength int - // SentTime is the time when the payload is sent. - SentTime time.Time -} - -// IsClient indicates if this stats information is from client side. -func (s *OutPayload) IsClient() bool { return s.Client } - -func (s *OutPayload) isRPCStats() {} - -// OutHeader contains stats when a header is sent. -type OutHeader struct { - // Client is true if this OutHeader is from client side. - Client bool - // WireLength is the wire length of header. - WireLength int - - // The following fields are valid only if Client is true. - // FullMethod is the full RPC method string, i.e., /package.service/method. - FullMethod string - // RemoteAddr is the remote address of the corresponding connection. - RemoteAddr net.Addr - // LocalAddr is the local address of the corresponding connection. - LocalAddr net.Addr - // Compression is the compression algorithm used for the RPC. - Compression string -} - -// IsClient indicates if this stats information is from client side. -func (s *OutHeader) IsClient() bool { return s.Client } - -func (s *OutHeader) isRPCStats() {} - -// OutTrailer contains stats when a trailer is sent. -type OutTrailer struct { - // Client is true if this OutTrailer is from client side. - Client bool - // WireLength is the wire length of trailer. - WireLength int -} - -// IsClient indicates if this stats information is from client side. -func (s *OutTrailer) IsClient() bool { return s.Client } - -func (s *OutTrailer) isRPCStats() {} - -// End contains stats when an RPC ends. -type End struct { - // Client is true if this End is from client side. - Client bool - // EndTime is the time when the RPC ends. - EndTime time.Time - // Error is the error just happened. It implements status.Status if non-nil. - Error error -} - -// IsClient indicates if this is from client side. -func (s *End) IsClient() bool { return s.Client } - -func (s *End) isRPCStats() {} - -// ConnStats contains stats information about connections. -type ConnStats interface { - isConnStats() - // IsClient returns true if this ConnStats is from client side. - IsClient() bool -} - -// ConnBegin contains the stats of a connection when it is established. -type ConnBegin struct { - // Client is true if this ConnBegin is from client side. - Client bool -} - -// IsClient indicates if this is from client side. -func (s *ConnBegin) IsClient() bool { return s.Client } - -func (s *ConnBegin) isConnStats() {} - -// ConnEnd contains the stats of a connection when it ends. -type ConnEnd struct { - // Client is true if this ConnEnd is from client side. - Client bool -} - -// IsClient indicates if this is from client side. -func (s *ConnEnd) IsClient() bool { return s.Client } - -func (s *ConnEnd) isConnStats() {} diff --git a/vendor/google.golang.org/grpc/status/status.go b/vendor/google.golang.org/grpc/status/status.go deleted file mode 100644 index 99a4cbe51..000000000 --- a/vendor/google.golang.org/grpc/status/status.go +++ /dev/null @@ -1,145 +0,0 @@ -/* - * - * Copyright 2017, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT - * OWNER 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. - * - */ - -// Package status implements errors returned by gRPC. These errors are -// serialized and transmitted on the wire between server and client, and allow -// for additional data to be transmitted via the Details field in the status -// proto. gRPC service handlers should return an error created by this -// package, and gRPC clients should expect a corresponding error to be -// returned from the RPC call. -// -// This package upholds the invariants that a non-nil error may not -// contain an OK code, and an OK code must result in a nil error. -package status - -import ( - "fmt" - - "github.com/golang/protobuf/proto" - spb "google.golang.org/genproto/googleapis/rpc/status" - "google.golang.org/grpc/codes" -) - -// statusError is an alias of a status proto. It implements error and Status, -// and a nil statusError should never be returned by this package. -type statusError spb.Status - -func (se *statusError) Error() string { - p := (*spb.Status)(se) - return fmt.Sprintf("rpc error: code = %s desc = %s", codes.Code(p.GetCode()), p.GetMessage()) -} - -func (se *statusError) status() *Status { - return &Status{s: (*spb.Status)(se)} -} - -// Status represents an RPC status code, message, and details. It is immutable -// and should be created with New, Newf, or FromProto. -type Status struct { - s *spb.Status -} - -// Code returns the status code contained in s. -func (s *Status) Code() codes.Code { - if s == nil || s.s == nil { - return codes.OK - } - return codes.Code(s.s.Code) -} - -// Message returns the message contained in s. -func (s *Status) Message() string { - if s == nil || s.s == nil { - return "" - } - return s.s.Message -} - -// Proto returns s's status as an spb.Status proto message. -func (s *Status) Proto() *spb.Status { - if s == nil { - return nil - } - return proto.Clone(s.s).(*spb.Status) -} - -// Err returns an immutable error representing s; returns nil if s.Code() is -// OK. -func (s *Status) Err() error { - if s.Code() == codes.OK { - return nil - } - return (*statusError)(s.s) -} - -// New returns a Status representing c and msg. -func New(c codes.Code, msg string) *Status { - return &Status{s: &spb.Status{Code: int32(c), Message: msg}} -} - -// Newf returns New(c, fmt.Sprintf(format, a...)). -func Newf(c codes.Code, format string, a ...interface{}) *Status { - return New(c, fmt.Sprintf(format, a...)) -} - -// Error returns an error representing c and msg. If c is OK, returns nil. -func Error(c codes.Code, msg string) error { - return New(c, msg).Err() -} - -// Errorf returns Error(c, fmt.Sprintf(format, a...)). -func Errorf(c codes.Code, format string, a ...interface{}) error { - return Error(c, fmt.Sprintf(format, a...)) -} - -// ErrorProto returns an error representing s. If s.Code is OK, returns nil. -func ErrorProto(s *spb.Status) error { - return FromProto(s).Err() -} - -// FromProto returns a Status representing s. -func FromProto(s *spb.Status) *Status { - return &Status{s: proto.Clone(s).(*spb.Status)} -} - -// FromError returns a Status representing err if it was produced from this -// package, otherwise it returns nil, false. -func FromError(err error) (s *Status, ok bool) { - if err == nil { - return &Status{s: &spb.Status{Code: int32(codes.OK)}}, true - } - if s, ok := err.(*statusError); ok { - return s.status(), true - } - return nil, false -} diff --git a/vendor/google.golang.org/grpc/stream.go b/vendor/google.golang.org/grpc/stream.go deleted file mode 100644 index ed0ebe7b7..000000000 --- a/vendor/google.golang.org/grpc/stream.go +++ /dev/null @@ -1,657 +0,0 @@ -/* - * - * Copyright 2014, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT - * OWNER 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. - * - */ - -package grpc - -import ( - "bytes" - "errors" - "io" - "sync" - "time" - - "golang.org/x/net/context" - "golang.org/x/net/trace" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/stats" - "google.golang.org/grpc/status" - "google.golang.org/grpc/transport" -) - -// StreamHandler defines the handler called by gRPC server to complete the -// execution of a streaming RPC. -type StreamHandler func(srv interface{}, stream ServerStream) error - -// StreamDesc represents a streaming RPC service's method specification. -type StreamDesc struct { - StreamName string - Handler StreamHandler - - // At least one of these is true. - ServerStreams bool - ClientStreams bool -} - -// Stream defines the common interface a client or server stream has to satisfy. -type Stream interface { - // Context returns the context for this stream. - Context() context.Context - // SendMsg blocks until it sends m, the stream is done or the stream - // breaks. - // On error, it aborts the stream and returns an RPC status on client - // side. On server side, it simply returns the error to the caller. - // SendMsg is called by generated code. Also Users can call SendMsg - // directly when it is really needed in their use cases. - SendMsg(m interface{}) error - // RecvMsg blocks until it receives a message or the stream is - // done. On client side, it returns io.EOF when the stream is done. On - // any other error, it aborts the stream and returns an RPC status. On - // server side, it simply returns the error to the caller. - RecvMsg(m interface{}) error -} - -// ClientStream defines the interface a client stream has to satisfy. -type ClientStream interface { - // Header returns the header metadata received from the server if there - // is any. It blocks if the metadata is not ready to read. - Header() (metadata.MD, error) - // Trailer returns the trailer metadata from the server, if there is any. - // It must only be called after stream.CloseAndRecv has returned, or - // stream.Recv has returned a non-nil error (including io.EOF). - Trailer() metadata.MD - // CloseSend closes the send direction of the stream. It closes the stream - // when non-nil error is met. - CloseSend() error - Stream -} - -// NewClientStream creates a new Stream for the client side. This is called -// by generated code. -func NewClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, method string, opts ...CallOption) (_ ClientStream, err error) { - if cc.dopts.streamInt != nil { - return cc.dopts.streamInt(ctx, desc, cc, method, newClientStream, opts...) - } - return newClientStream(ctx, desc, cc, method, opts...) -} - -func newClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, method string, opts ...CallOption) (_ ClientStream, err error) { - var ( - t transport.ClientTransport - s *transport.Stream - put func() - cancel context.CancelFunc - ) - c := defaultCallInfo - mc := cc.GetMethodConfig(method) - if mc.WaitForReady != nil { - c.failFast = !*mc.WaitForReady - } - - if mc.Timeout != nil { - ctx, cancel = context.WithTimeout(ctx, *mc.Timeout) - } - - opts = append(cc.dopts.callOptions, opts...) - for _, o := range opts { - if err := o.before(&c); err != nil { - return nil, toRPCErr(err) - } - } - c.maxSendMessageSize = getMaxSize(mc.MaxReqSize, c.maxSendMessageSize, defaultClientMaxSendMessageSize) - c.maxReceiveMessageSize = getMaxSize(mc.MaxRespSize, c.maxReceiveMessageSize, defaultClientMaxReceiveMessageSize) - - callHdr := &transport.CallHdr{ - Host: cc.authority, - Method: method, - Flush: desc.ServerStreams && desc.ClientStreams, - } - if cc.dopts.cp != nil { - callHdr.SendCompress = cc.dopts.cp.Type() - } - if c.creds != nil { - callHdr.Creds = c.creds - } - var trInfo traceInfo - if EnableTracing { - trInfo.tr = trace.New("grpc.Sent."+methodFamily(method), method) - trInfo.firstLine.client = true - if deadline, ok := ctx.Deadline(); ok { - trInfo.firstLine.deadline = deadline.Sub(time.Now()) - } - trInfo.tr.LazyLog(&trInfo.firstLine, false) - ctx = trace.NewContext(ctx, trInfo.tr) - defer func() { - if err != nil { - // Need to call tr.finish() if error is returned. - // Because tr will not be returned to caller. - trInfo.tr.LazyPrintf("RPC: [%v]", err) - trInfo.tr.SetError() - trInfo.tr.Finish() - } - }() - } - ctx = newContextWithRPCInfo(ctx) - sh := cc.dopts.copts.StatsHandler - if sh != nil { - ctx = sh.TagRPC(ctx, &stats.RPCTagInfo{FullMethodName: method, FailFast: c.failFast}) - begin := &stats.Begin{ - Client: true, - BeginTime: time.Now(), - FailFast: c.failFast, - } - sh.HandleRPC(ctx, begin) - defer func() { - if err != nil { - // Only handle end stats if err != nil. - end := &stats.End{ - Client: true, - Error: err, - } - sh.HandleRPC(ctx, end) - } - }() - } - gopts := BalancerGetOptions{ - BlockingWait: !c.failFast, - } - for { - t, put, err = cc.getTransport(ctx, gopts) - if err != nil { - // TODO(zhaoq): Probably revisit the error handling. - if _, ok := status.FromError(err); ok { - return nil, err - } - if err == errConnClosing || err == errConnUnavailable { - if c.failFast { - return nil, Errorf(codes.Unavailable, "%v", err) - } - continue - } - // All the other errors are treated as Internal errors. - return nil, Errorf(codes.Internal, "%v", err) - } - - s, err = t.NewStream(ctx, callHdr) - if err != nil { - if _, ok := err.(transport.ConnectionError); ok && put != nil { - // If error is connection error, transport was sending data on wire, - // and we are not sure if anything has been sent on wire. - // If error is not connection error, we are sure nothing has been sent. - updateRPCInfoInContext(ctx, rpcInfo{bytesSent: true, bytesReceived: false}) - } - if put != nil { - put() - put = nil - } - if _, ok := err.(transport.ConnectionError); (ok || err == transport.ErrStreamDrain) && !c.failFast { - continue - } - return nil, toRPCErr(err) - } - break - } - cs := &clientStream{ - opts: opts, - c: c, - desc: desc, - codec: cc.dopts.codec, - cp: cc.dopts.cp, - dc: cc.dopts.dc, - cancel: cancel, - - put: put, - t: t, - s: s, - p: &parser{r: s}, - - tracing: EnableTracing, - trInfo: trInfo, - - statsCtx: ctx, - statsHandler: cc.dopts.copts.StatsHandler, - } - if cc.dopts.cp != nil { - cs.cbuf = new(bytes.Buffer) - } - // Listen on ctx.Done() to detect cancellation and s.Done() to detect normal termination - // when there is no pending I/O operations on this stream. - go func() { - select { - case <-t.Error(): - // Incur transport error, simply exit. - case <-cc.ctx.Done(): - cs.finish(ErrClientConnClosing) - cs.closeTransportStream(ErrClientConnClosing) - case <-s.Done(): - // TODO: The trace of the RPC is terminated here when there is no pending - // I/O, which is probably not the optimal solution. - cs.finish(s.Status().Err()) - cs.closeTransportStream(nil) - case <-s.GoAway(): - cs.finish(errConnDrain) - cs.closeTransportStream(errConnDrain) - case <-s.Context().Done(): - err := s.Context().Err() - cs.finish(err) - cs.closeTransportStream(transport.ContextErr(err)) - } - }() - return cs, nil -} - -// clientStream implements a client side Stream. -type clientStream struct { - opts []CallOption - c callInfo - t transport.ClientTransport - s *transport.Stream - p *parser - desc *StreamDesc - codec Codec - cp Compressor - cbuf *bytes.Buffer - dc Decompressor - cancel context.CancelFunc - - tracing bool // set to EnableTracing when the clientStream is created. - - mu sync.Mutex - put func() - closed bool - finished bool - // trInfo.tr is set when the clientStream is created (if EnableTracing is true), - // and is set to nil when the clientStream's finish method is called. - trInfo traceInfo - - // statsCtx keeps the user context for stats handling. - // All stats collection should use the statsCtx (instead of the stream context) - // so that all the generated stats for a particular RPC can be associated in the processing phase. - statsCtx context.Context - statsHandler stats.Handler -} - -func (cs *clientStream) Context() context.Context { - return cs.s.Context() -} - -func (cs *clientStream) Header() (metadata.MD, error) { - m, err := cs.s.Header() - if err != nil { - if _, ok := err.(transport.ConnectionError); !ok { - cs.closeTransportStream(err) - } - } - return m, err -} - -func (cs *clientStream) Trailer() metadata.MD { - return cs.s.Trailer() -} - -func (cs *clientStream) SendMsg(m interface{}) (err error) { - if cs.tracing { - cs.mu.Lock() - if cs.trInfo.tr != nil { - cs.trInfo.tr.LazyLog(&payload{sent: true, msg: m}, true) - } - cs.mu.Unlock() - } - // TODO Investigate how to signal the stats handling party. - // generate error stats if err != nil && err != io.EOF? - defer func() { - if err != nil { - cs.finish(err) - } - if err == nil { - return - } - if err == io.EOF { - // Specialize the process for server streaming. SendMesg is only called - // once when creating the stream object. io.EOF needs to be skipped when - // the rpc is early finished (before the stream object is created.). - // TODO: It is probably better to move this into the generated code. - if !cs.desc.ClientStreams && cs.desc.ServerStreams { - err = nil - } - return - } - if _, ok := err.(transport.ConnectionError); !ok { - cs.closeTransportStream(err) - } - err = toRPCErr(err) - }() - var outPayload *stats.OutPayload - if cs.statsHandler != nil { - outPayload = &stats.OutPayload{ - Client: true, - } - } - out, err := encode(cs.codec, m, cs.cp, cs.cbuf, outPayload) - defer func() { - if cs.cbuf != nil { - cs.cbuf.Reset() - } - }() - if err != nil { - return Errorf(codes.Internal, "grpc: %v", err) - } - if cs.c.maxSendMessageSize == nil { - return Errorf(codes.Internal, "callInfo maxSendMessageSize field uninitialized(nil)") - } - if len(out) > *cs.c.maxSendMessageSize { - return Errorf(codes.ResourceExhausted, "trying to send message larger than max (%d vs. %d)", len(out), *cs.c.maxSendMessageSize) - } - err = cs.t.Write(cs.s, out, &transport.Options{Last: false}) - if err == nil && outPayload != nil { - outPayload.SentTime = time.Now() - cs.statsHandler.HandleRPC(cs.statsCtx, outPayload) - } - return err -} - -func (cs *clientStream) RecvMsg(m interface{}) (err error) { - var inPayload *stats.InPayload - if cs.statsHandler != nil { - inPayload = &stats.InPayload{ - Client: true, - } - } - if cs.c.maxReceiveMessageSize == nil { - return Errorf(codes.Internal, "callInfo maxReceiveMessageSize field uninitialized(nil)") - } - err = recv(cs.p, cs.codec, cs.s, cs.dc, m, *cs.c.maxReceiveMessageSize, inPayload) - defer func() { - // err != nil indicates the termination of the stream. - if err != nil { - cs.finish(err) - } - }() - if err == nil { - if cs.tracing { - cs.mu.Lock() - if cs.trInfo.tr != nil { - cs.trInfo.tr.LazyLog(&payload{sent: false, msg: m}, true) - } - cs.mu.Unlock() - } - if inPayload != nil { - cs.statsHandler.HandleRPC(cs.statsCtx, inPayload) - } - if !cs.desc.ClientStreams || cs.desc.ServerStreams { - return - } - // Special handling for client streaming rpc. - // This recv expects EOF or errors, so we don't collect inPayload. - if cs.c.maxReceiveMessageSize == nil { - return Errorf(codes.Internal, "callInfo maxReceiveMessageSize field uninitialized(nil)") - } - err = recv(cs.p, cs.codec, cs.s, cs.dc, m, *cs.c.maxReceiveMessageSize, nil) - cs.closeTransportStream(err) - if err == nil { - return toRPCErr(errors.New("grpc: client streaming protocol violation: get , want ")) - } - if err == io.EOF { - if se := cs.s.Status().Err(); se != nil { - return se - } - cs.finish(err) - return nil - } - return toRPCErr(err) - } - if _, ok := err.(transport.ConnectionError); !ok { - cs.closeTransportStream(err) - } - if err == io.EOF { - if statusErr := cs.s.Status().Err(); statusErr != nil { - return statusErr - } - // Returns io.EOF to indicate the end of the stream. - return - } - return toRPCErr(err) -} - -func (cs *clientStream) CloseSend() (err error) { - err = cs.t.Write(cs.s, nil, &transport.Options{Last: true}) - defer func() { - if err != nil { - cs.finish(err) - } - }() - if err == nil || err == io.EOF { - return nil - } - if _, ok := err.(transport.ConnectionError); !ok { - cs.closeTransportStream(err) - } - err = toRPCErr(err) - return -} - -func (cs *clientStream) closeTransportStream(err error) { - cs.mu.Lock() - if cs.closed { - cs.mu.Unlock() - return - } - cs.closed = true - cs.mu.Unlock() - cs.t.CloseStream(cs.s, err) -} - -func (cs *clientStream) finish(err error) { - cs.mu.Lock() - defer cs.mu.Unlock() - if cs.finished { - return - } - cs.finished = true - defer func() { - if cs.cancel != nil { - cs.cancel() - } - }() - for _, o := range cs.opts { - o.after(&cs.c) - } - if cs.put != nil { - updateRPCInfoInContext(cs.s.Context(), rpcInfo{ - bytesSent: cs.s.BytesSent(), - bytesReceived: cs.s.BytesReceived(), - }) - cs.put() - cs.put = nil - } - if cs.statsHandler != nil { - end := &stats.End{ - Client: true, - EndTime: time.Now(), - } - if err != io.EOF { - // end.Error is nil if the RPC finished successfully. - end.Error = toRPCErr(err) - } - cs.statsHandler.HandleRPC(cs.statsCtx, end) - } - if !cs.tracing { - return - } - if cs.trInfo.tr != nil { - if err == nil || err == io.EOF { - cs.trInfo.tr.LazyPrintf("RPC: [OK]") - } else { - cs.trInfo.tr.LazyPrintf("RPC: [%v]", err) - cs.trInfo.tr.SetError() - } - cs.trInfo.tr.Finish() - cs.trInfo.tr = nil - } -} - -// ServerStream defines the interface a server stream has to satisfy. -type ServerStream interface { - // SetHeader sets the header metadata. It may be called multiple times. - // When call multiple times, all the provided metadata will be merged. - // All the metadata will be sent out when one of the following happens: - // - ServerStream.SendHeader() is called; - // - The first response is sent out; - // - An RPC status is sent out (error or success). - SetHeader(metadata.MD) error - // SendHeader sends the header metadata. - // The provided md and headers set by SetHeader() will be sent. - // It fails if called multiple times. - SendHeader(metadata.MD) error - // SetTrailer sets the trailer metadata which will be sent with the RPC status. - // When called more than once, all the provided metadata will be merged. - SetTrailer(metadata.MD) - Stream -} - -// serverStream implements a server side Stream. -type serverStream struct { - t transport.ServerTransport - s *transport.Stream - p *parser - codec Codec - cp Compressor - dc Decompressor - cbuf *bytes.Buffer - maxReceiveMessageSize int - maxSendMessageSize int - trInfo *traceInfo - - statsHandler stats.Handler - - mu sync.Mutex // protects trInfo.tr after the service handler runs. -} - -func (ss *serverStream) Context() context.Context { - return ss.s.Context() -} - -func (ss *serverStream) SetHeader(md metadata.MD) error { - if md.Len() == 0 { - return nil - } - return ss.s.SetHeader(md) -} - -func (ss *serverStream) SendHeader(md metadata.MD) error { - return ss.t.WriteHeader(ss.s, md) -} - -func (ss *serverStream) SetTrailer(md metadata.MD) { - if md.Len() == 0 { - return - } - ss.s.SetTrailer(md) - return -} - -func (ss *serverStream) SendMsg(m interface{}) (err error) { - defer func() { - if ss.trInfo != nil { - ss.mu.Lock() - if ss.trInfo.tr != nil { - if err == nil { - ss.trInfo.tr.LazyLog(&payload{sent: true, msg: m}, true) - } else { - ss.trInfo.tr.LazyLog(&fmtStringer{"%v", []interface{}{err}}, true) - ss.trInfo.tr.SetError() - } - } - ss.mu.Unlock() - } - }() - var outPayload *stats.OutPayload - if ss.statsHandler != nil { - outPayload = &stats.OutPayload{} - } - out, err := encode(ss.codec, m, ss.cp, ss.cbuf, outPayload) - defer func() { - if ss.cbuf != nil { - ss.cbuf.Reset() - } - }() - if err != nil { - err = Errorf(codes.Internal, "grpc: %v", err) - return err - } - if len(out) > ss.maxSendMessageSize { - return Errorf(codes.ResourceExhausted, "trying to send message larger than max (%d vs. %d)", len(out), ss.maxSendMessageSize) - } - if err := ss.t.Write(ss.s, out, &transport.Options{Last: false}); err != nil { - return toRPCErr(err) - } - if outPayload != nil { - outPayload.SentTime = time.Now() - ss.statsHandler.HandleRPC(ss.s.Context(), outPayload) - } - return nil -} - -func (ss *serverStream) RecvMsg(m interface{}) (err error) { - defer func() { - if ss.trInfo != nil { - ss.mu.Lock() - if ss.trInfo.tr != nil { - if err == nil { - ss.trInfo.tr.LazyLog(&payload{sent: false, msg: m}, true) - } else if err != io.EOF { - ss.trInfo.tr.LazyLog(&fmtStringer{"%v", []interface{}{err}}, true) - ss.trInfo.tr.SetError() - } - } - ss.mu.Unlock() - } - }() - var inPayload *stats.InPayload - if ss.statsHandler != nil { - inPayload = &stats.InPayload{} - } - if err := recv(ss.p, ss.codec, ss.s, ss.dc, m, ss.maxReceiveMessageSize, inPayload); err != nil { - if err == io.EOF { - return err - } - if err == io.ErrUnexpectedEOF { - err = Errorf(codes.Internal, io.ErrUnexpectedEOF.Error()) - } - return toRPCErr(err) - } - if inPayload != nil { - ss.statsHandler.HandleRPC(ss.s.Context(), inPayload) - } - return nil -} diff --git a/vendor/google.golang.org/grpc/tap/tap.go b/vendor/google.golang.org/grpc/tap/tap.go deleted file mode 100644 index 0f3664767..000000000 --- a/vendor/google.golang.org/grpc/tap/tap.go +++ /dev/null @@ -1,54 +0,0 @@ -/* - * - * Copyright 2016, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT - * OWNER 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. - * - */ - -// Package tap defines the function handles which are executed on the transport -// layer of gRPC-Go and related information. Everything here is EXPERIMENTAL. -package tap - -import ( - "golang.org/x/net/context" -) - -// Info defines the relevant information needed by the handles. -type Info struct { - // FullMethodName is the string of grpc method (in the format of - // /package.service/method). - FullMethodName string - // TODO: More to be added. -} - -// ServerInHandle defines the function which runs when a new stream is created -// on the server side. Note that it is executed in the per-connection I/O goroutine(s) instead -// of per-RPC goroutine. Therefore, users should NOT have any blocking/time-consuming -// work in this handle. Otherwise all the RPCs would slow down. -type ServerInHandle func(ctx context.Context, info *Info) (context.Context, error) diff --git a/vendor/google.golang.org/grpc/trace.go b/vendor/google.golang.org/grpc/trace.go deleted file mode 100644 index f6747e1df..000000000 --- a/vendor/google.golang.org/grpc/trace.go +++ /dev/null @@ -1,119 +0,0 @@ -/* - * - * Copyright 2015, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT - * OWNER 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. - * - */ - -package grpc - -import ( - "bytes" - "fmt" - "io" - "net" - "strings" - "time" - - "golang.org/x/net/trace" -) - -// EnableTracing controls whether to trace RPCs using the golang.org/x/net/trace package. -// This should only be set before any RPCs are sent or received by this program. -var EnableTracing = true - -// methodFamily returns the trace family for the given method. -// It turns "/pkg.Service/GetFoo" into "pkg.Service". -func methodFamily(m string) string { - m = strings.TrimPrefix(m, "/") // remove leading slash - if i := strings.Index(m, "/"); i >= 0 { - m = m[:i] // remove everything from second slash - } - if i := strings.LastIndex(m, "."); i >= 0 { - m = m[i+1:] // cut down to last dotted component - } - return m -} - -// traceInfo contains tracing information for an RPC. -type traceInfo struct { - tr trace.Trace - firstLine firstLine -} - -// firstLine is the first line of an RPC trace. -type firstLine struct { - client bool // whether this is a client (outgoing) RPC - remoteAddr net.Addr - deadline time.Duration // may be zero -} - -func (f *firstLine) String() string { - var line bytes.Buffer - io.WriteString(&line, "RPC: ") - if f.client { - io.WriteString(&line, "to") - } else { - io.WriteString(&line, "from") - } - fmt.Fprintf(&line, " %v deadline:", f.remoteAddr) - if f.deadline != 0 { - fmt.Fprint(&line, f.deadline) - } else { - io.WriteString(&line, "none") - } - return line.String() -} - -// payload represents an RPC request or response payload. -type payload struct { - sent bool // whether this is an outgoing payload - msg interface{} // e.g. a proto.Message - // TODO(dsymonds): add stringifying info to codec, and limit how much we hold here? -} - -func (p payload) String() string { - if p.sent { - return fmt.Sprintf("sent: %v", p.msg) - } - return fmt.Sprintf("recv: %v", p.msg) -} - -type fmtStringer struct { - format string - a []interface{} -} - -func (f *fmtStringer) String() string { - return fmt.Sprintf(f.format, f.a...) -} - -type stringer string - -func (s stringer) String() string { return string(s) } diff --git a/vendor/google.golang.org/grpc/transport/control.go b/vendor/google.golang.org/grpc/transport/control.go deleted file mode 100644 index 68dfdd568..000000000 --- a/vendor/google.golang.org/grpc/transport/control.go +++ /dev/null @@ -1,250 +0,0 @@ -/* - * - * Copyright 2014, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT - * OWNER 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. - * - */ - -package transport - -import ( - "fmt" - "math" - "sync" - "time" - - "golang.org/x/net/http2" -) - -const ( - // The default value of flow control window size in HTTP2 spec. - defaultWindowSize = 65535 - // The initial window size for flow control. - initialWindowSize = defaultWindowSize // for an RPC - initialConnWindowSize = defaultWindowSize * 16 // for a connection - infinity = time.Duration(math.MaxInt64) - defaultClientKeepaliveTime = infinity - defaultClientKeepaliveTimeout = time.Duration(20 * time.Second) - defaultMaxStreamsClient = 100 - defaultMaxConnectionIdle = infinity - defaultMaxConnectionAge = infinity - defaultMaxConnectionAgeGrace = infinity - defaultServerKeepaliveTime = time.Duration(2 * time.Hour) - defaultServerKeepaliveTimeout = time.Duration(20 * time.Second) - defaultKeepalivePolicyMinTime = time.Duration(5 * time.Minute) - // max window limit set by HTTP2 Specs. - maxWindowSize = math.MaxInt32 -) - -// The following defines various control items which could flow through -// the control buffer of transport. They represent different aspects of -// control tasks, e.g., flow control, settings, streaming resetting, etc. -type windowUpdate struct { - streamID uint32 - increment uint32 -} - -func (*windowUpdate) item() {} - -type settings struct { - ack bool - ss []http2.Setting -} - -func (*settings) item() {} - -type resetStream struct { - streamID uint32 - code http2.ErrCode -} - -func (*resetStream) item() {} - -type goAway struct { - code http2.ErrCode - debugData []byte -} - -func (*goAway) item() {} - -type flushIO struct { -} - -func (*flushIO) item() {} - -type ping struct { - ack bool - data [8]byte -} - -func (*ping) item() {} - -// quotaPool is a pool which accumulates the quota and sends it to acquire() -// when it is available. -type quotaPool struct { - c chan int - - mu sync.Mutex - quota int -} - -// newQuotaPool creates a quotaPool which has quota q available to consume. -func newQuotaPool(q int) *quotaPool { - qb := "aPool{ - c: make(chan int, 1), - } - if q > 0 { - qb.c <- q - } else { - qb.quota = q - } - return qb -} - -// add cancels the pending quota sent on acquired, incremented by v and sends -// it back on acquire. -func (qb *quotaPool) add(v int) { - qb.mu.Lock() - defer qb.mu.Unlock() - select { - case n := <-qb.c: - qb.quota += n - default: - } - qb.quota += v - if qb.quota <= 0 { - return - } - // After the pool has been created, this is the only place that sends on - // the channel. Since mu is held at this point and any quota that was sent - // on the channel has been retrieved, we know that this code will always - // place any positive quota value on the channel. - select { - case qb.c <- qb.quota: - qb.quota = 0 - default: - } -} - -// acquire returns the channel on which available quota amounts are sent. -func (qb *quotaPool) acquire() <-chan int { - return qb.c -} - -// inFlow deals with inbound flow control -type inFlow struct { - // The inbound flow control limit for pending data. - limit uint32 - - mu sync.Mutex - // pendingData is the overall data which have been received but not been - // consumed by applications. - pendingData uint32 - // The amount of data the application has consumed but grpc has not sent - // window update for them. Used to reduce window update frequency. - pendingUpdate uint32 - // delta is the extra window update given by receiver when an application - // is reading data bigger in size than the inFlow limit. - delta uint32 -} - -func (f *inFlow) maybeAdjust(n uint32) uint32 { - if n > uint32(math.MaxInt32) { - n = uint32(math.MaxInt32) - } - f.mu.Lock() - defer f.mu.Unlock() - // estSenderQuota is the receiver's view of the maximum number of bytes the sender - // can send without a window update. - estSenderQuota := int32(f.limit - (f.pendingData + f.pendingUpdate)) - // estUntransmittedData is the maximum number of bytes the sends might not have put - // on the wire yet. A value of 0 or less means that we have already received all or - // more bytes than the application is requesting to read. - estUntransmittedData := int32(n - f.pendingData) // Casting into int32 since it could be negative. - // This implies that unless we send a window update, the sender won't be able to send all the bytes - // for this message. Therefore we must send an update over the limit since there's an active read - // request from the application. - if estUntransmittedData > estSenderQuota { - // Sender's window shouldn't go more than 2^31 - 1 as speecified in the HTTP spec. - if f.limit+n > maxWindowSize { - f.delta = maxWindowSize - f.limit - } else { - // Send a window update for the whole message and not just the difference between - // estUntransmittedData and estSenderQuota. This will be helpful in case the message - // is padded; We will fallback on the current available window(at least a 1/4th of the limit). - f.delta = n - } - return f.delta - } - return 0 -} - -// onData is invoked when some data frame is received. It updates pendingData. -func (f *inFlow) onData(n uint32) error { - f.mu.Lock() - defer f.mu.Unlock() - f.pendingData += n - if f.pendingData+f.pendingUpdate > f.limit+f.delta { - return fmt.Errorf("received %d-bytes data exceeding the limit %d bytes", f.pendingData+f.pendingUpdate, f.limit) - } - return nil -} - -// onRead is invoked when the application reads the data. It returns the window size -// to be sent to the peer. -func (f *inFlow) onRead(n uint32) uint32 { - f.mu.Lock() - defer f.mu.Unlock() - if f.pendingData == 0 { - return 0 - } - f.pendingData -= n - if n > f.delta { - n -= f.delta - f.delta = 0 - } else { - f.delta -= n - n = 0 - } - f.pendingUpdate += n - if f.pendingUpdate >= f.limit/4 { - wu := f.pendingUpdate - f.pendingUpdate = 0 - return wu - } - return 0 -} - -func (f *inFlow) resetPendingData() uint32 { - f.mu.Lock() - defer f.mu.Unlock() - n := f.pendingData - f.pendingData = 0 - return n -} diff --git a/vendor/google.golang.org/grpc/transport/go16.go b/vendor/google.golang.org/grpc/transport/go16.go deleted file mode 100644 index 252509e15..000000000 --- a/vendor/google.golang.org/grpc/transport/go16.go +++ /dev/null @@ -1,59 +0,0 @@ -// +build go1.6,!go1.7 - -/* - * Copyright 2016, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT - * OWNER 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. - * - */ - -package transport - -import ( - "net" - - "google.golang.org/grpc/codes" - - "golang.org/x/net/context" -) - -// dialContext connects to the address on the named network. -func dialContext(ctx context.Context, network, address string) (net.Conn, error) { - return (&net.Dialer{Cancel: ctx.Done()}).Dial(network, address) -} - -// ContextErr converts the error from context package into a StreamError. -func ContextErr(err error) StreamError { - switch err { - case context.DeadlineExceeded: - return streamErrorf(codes.DeadlineExceeded, "%v", err) - case context.Canceled: - return streamErrorf(codes.Canceled, "%v", err) - } - return streamErrorf(codes.Internal, "Unexpected error from context packet: %v", err) -} diff --git a/vendor/google.golang.org/grpc/transport/go17.go b/vendor/google.golang.org/grpc/transport/go17.go deleted file mode 100644 index 29f8b14d9..000000000 --- a/vendor/google.golang.org/grpc/transport/go17.go +++ /dev/null @@ -1,60 +0,0 @@ -// +build go1.7 - -/* - * Copyright 2016, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT - * OWNER 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. - * - */ - -package transport - -import ( - "context" - "net" - - "google.golang.org/grpc/codes" - - netctx "golang.org/x/net/context" -) - -// dialContext connects to the address on the named network. -func dialContext(ctx context.Context, network, address string) (net.Conn, error) { - return (&net.Dialer{}).DialContext(ctx, network, address) -} - -// ContextErr converts the error from context package into a StreamError. -func ContextErr(err error) StreamError { - switch err { - case context.DeadlineExceeded, netctx.DeadlineExceeded: - return streamErrorf(codes.DeadlineExceeded, "%v", err) - case context.Canceled, netctx.Canceled: - return streamErrorf(codes.Canceled, "%v", err) - } - return streamErrorf(codes.Internal, "Unexpected error from context packet: %v", err) -} diff --git a/vendor/google.golang.org/grpc/transport/handler_server.go b/vendor/google.golang.org/grpc/transport/handler_server.go deleted file mode 100644 index 616440983..000000000 --- a/vendor/google.golang.org/grpc/transport/handler_server.go +++ /dev/null @@ -1,416 +0,0 @@ -/* - * Copyright 2016, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT - * OWNER 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. - * - */ - -// This file is the implementation of a gRPC server using HTTP/2 which -// uses the standard Go http2 Server implementation (via the -// http.Handler interface), rather than speaking low-level HTTP/2 -// frames itself. It is the implementation of *grpc.Server.ServeHTTP. - -package transport - -import ( - "errors" - "fmt" - "io" - "net" - "net/http" - "strings" - "sync" - "time" - - "golang.org/x/net/context" - "golang.org/x/net/http2" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/credentials" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/peer" - "google.golang.org/grpc/status" -) - -// NewServerHandlerTransport returns a ServerTransport handling gRPC -// from inside an http.Handler. It requires that the http Server -// supports HTTP/2. -func NewServerHandlerTransport(w http.ResponseWriter, r *http.Request) (ServerTransport, error) { - if r.ProtoMajor != 2 { - return nil, errors.New("gRPC requires HTTP/2") - } - if r.Method != "POST" { - return nil, errors.New("invalid gRPC request method") - } - if !validContentType(r.Header.Get("Content-Type")) { - return nil, errors.New("invalid gRPC request content-type") - } - if _, ok := w.(http.Flusher); !ok { - return nil, errors.New("gRPC requires a ResponseWriter supporting http.Flusher") - } - if _, ok := w.(http.CloseNotifier); !ok { - return nil, errors.New("gRPC requires a ResponseWriter supporting http.CloseNotifier") - } - - st := &serverHandlerTransport{ - rw: w, - req: r, - closedCh: make(chan struct{}), - writes: make(chan func()), - } - - if v := r.Header.Get("grpc-timeout"); v != "" { - to, err := decodeTimeout(v) - if err != nil { - return nil, streamErrorf(codes.Internal, "malformed time-out: %v", err) - } - st.timeoutSet = true - st.timeout = to - } - - var metakv []string - if r.Host != "" { - metakv = append(metakv, ":authority", r.Host) - } - for k, vv := range r.Header { - k = strings.ToLower(k) - if isReservedHeader(k) && !isWhitelistedPseudoHeader(k) { - continue - } - for _, v := range vv { - if k == "user-agent" { - // user-agent is special. Copying logic of http_util.go. - if i := strings.LastIndex(v, " "); i == -1 { - // There is no application user agent string being set - continue - } else { - v = v[:i] - } - } - v, err := decodeMetadataHeader(k, v) - if err != nil { - return nil, streamErrorf(codes.InvalidArgument, "malformed binary metadata: %v", err) - } - metakv = append(metakv, k, v) - } - } - st.headerMD = metadata.Pairs(metakv...) - - return st, nil -} - -// serverHandlerTransport is an implementation of ServerTransport -// which replies to exactly one gRPC request (exactly one HTTP request), -// using the net/http.Handler interface. This http.Handler is guaranteed -// at this point to be speaking over HTTP/2, so it's able to speak valid -// gRPC. -type serverHandlerTransport struct { - rw http.ResponseWriter - req *http.Request - timeoutSet bool - timeout time.Duration - didCommonHeaders bool - - headerMD metadata.MD - - closeOnce sync.Once - closedCh chan struct{} // closed on Close - - // writes is a channel of code to run serialized in the - // ServeHTTP (HandleStreams) goroutine. The channel is closed - // when WriteStatus is called. - writes chan func() -} - -func (ht *serverHandlerTransport) Close() error { - ht.closeOnce.Do(ht.closeCloseChanOnce) - return nil -} - -func (ht *serverHandlerTransport) closeCloseChanOnce() { close(ht.closedCh) } - -func (ht *serverHandlerTransport) RemoteAddr() net.Addr { return strAddr(ht.req.RemoteAddr) } - -// strAddr is a net.Addr backed by either a TCP "ip:port" string, or -// the empty string if unknown. -type strAddr string - -func (a strAddr) Network() string { - if a != "" { - // Per the documentation on net/http.Request.RemoteAddr, if this is - // set, it's set to the IP:port of the peer (hence, TCP): - // https://golang.org/pkg/net/http/#Request - // - // If we want to support Unix sockets later, we can - // add our own grpc-specific convention within the - // grpc codebase to set RemoteAddr to a different - // format, or probably better: we can attach it to the - // context and use that from serverHandlerTransport.RemoteAddr. - return "tcp" - } - return "" -} - -func (a strAddr) String() string { return string(a) } - -// do runs fn in the ServeHTTP goroutine. -func (ht *serverHandlerTransport) do(fn func()) error { - // Avoid a panic writing to closed channel. Imperfect but maybe good enough. - select { - case <-ht.closedCh: - return ErrConnClosing - default: - select { - case ht.writes <- fn: - return nil - case <-ht.closedCh: - return ErrConnClosing - } - - } -} - -func (ht *serverHandlerTransport) WriteStatus(s *Stream, st *status.Status) error { - err := ht.do(func() { - ht.writeCommonHeaders(s) - - // And flush, in case no header or body has been sent yet. - // This forces a separation of headers and trailers if this is the - // first call (for example, in end2end tests's TestNoService). - ht.rw.(http.Flusher).Flush() - - h := ht.rw.Header() - h.Set("Grpc-Status", fmt.Sprintf("%d", st.Code())) - if m := st.Message(); m != "" { - h.Set("Grpc-Message", encodeGrpcMessage(m)) - } - - // TODO: Support Grpc-Status-Details-Bin - - if md := s.Trailer(); len(md) > 0 { - for k, vv := range md { - // Clients don't tolerate reading restricted headers after some non restricted ones were sent. - if isReservedHeader(k) { - continue - } - for _, v := range vv { - // http2 ResponseWriter mechanism to send undeclared Trailers after - // the headers have possibly been written. - h.Add(http2.TrailerPrefix+k, encodeMetadataHeader(k, v)) - } - } - } - }) - close(ht.writes) - return err -} - -// writeCommonHeaders sets common headers on the first write -// call (Write, WriteHeader, or WriteStatus). -func (ht *serverHandlerTransport) writeCommonHeaders(s *Stream) { - if ht.didCommonHeaders { - return - } - ht.didCommonHeaders = true - - h := ht.rw.Header() - h["Date"] = nil // suppress Date to make tests happy; TODO: restore - h.Set("Content-Type", "application/grpc") - - // Predeclare trailers we'll set later in WriteStatus (after the body). - // This is a SHOULD in the HTTP RFC, and the way you add (known) - // Trailers per the net/http.ResponseWriter contract. - // See https://golang.org/pkg/net/http/#ResponseWriter - // and https://golang.org/pkg/net/http/#example_ResponseWriter_trailers - h.Add("Trailer", "Grpc-Status") - h.Add("Trailer", "Grpc-Message") - // TODO: Support Grpc-Status-Details-Bin - - if s.sendCompress != "" { - h.Set("Grpc-Encoding", s.sendCompress) - } -} - -func (ht *serverHandlerTransport) Write(s *Stream, data []byte, opts *Options) error { - return ht.do(func() { - ht.writeCommonHeaders(s) - ht.rw.Write(data) - if !opts.Delay { - ht.rw.(http.Flusher).Flush() - } - }) -} - -func (ht *serverHandlerTransport) WriteHeader(s *Stream, md metadata.MD) error { - return ht.do(func() { - ht.writeCommonHeaders(s) - h := ht.rw.Header() - for k, vv := range md { - // Clients don't tolerate reading restricted headers after some non restricted ones were sent. - if isReservedHeader(k) { - continue - } - for _, v := range vv { - v = encodeMetadataHeader(k, v) - h.Add(k, v) - } - } - ht.rw.WriteHeader(200) - ht.rw.(http.Flusher).Flush() - }) -} - -func (ht *serverHandlerTransport) HandleStreams(startStream func(*Stream), traceCtx func(context.Context, string) context.Context) { - // With this transport type there will be exactly 1 stream: this HTTP request. - - var ctx context.Context - var cancel context.CancelFunc - if ht.timeoutSet { - ctx, cancel = context.WithTimeout(context.Background(), ht.timeout) - } else { - ctx, cancel = context.WithCancel(context.Background()) - } - - // requestOver is closed when either the request's context is done - // or the status has been written via WriteStatus. - requestOver := make(chan struct{}) - - // clientGone receives a single value if peer is gone, either - // because the underlying connection is dead or because the - // peer sends an http2 RST_STREAM. - clientGone := ht.rw.(http.CloseNotifier).CloseNotify() - go func() { - select { - case <-requestOver: - return - case <-ht.closedCh: - case <-clientGone: - } - cancel() - }() - - req := ht.req - - s := &Stream{ - id: 0, // irrelevant - requestRead: func(int) {}, - cancel: cancel, - buf: newRecvBuffer(), - st: ht, - method: req.URL.Path, - recvCompress: req.Header.Get("grpc-encoding"), - } - pr := &peer.Peer{ - Addr: ht.RemoteAddr(), - } - if req.TLS != nil { - pr.AuthInfo = credentials.TLSInfo{State: *req.TLS} - } - ctx = metadata.NewIncomingContext(ctx, ht.headerMD) - ctx = peer.NewContext(ctx, pr) - s.ctx = newContextWithStream(ctx, s) - s.trReader = &transportReader{ - reader: &recvBufferReader{ctx: s.ctx, recv: s.buf}, - windowHandler: func(int) {}, - } - - // readerDone is closed when the Body.Read-ing goroutine exits. - readerDone := make(chan struct{}) - go func() { - defer close(readerDone) - - // TODO: minimize garbage, optimize recvBuffer code/ownership - const readSize = 8196 - for buf := make([]byte, readSize); ; { - n, err := req.Body.Read(buf) - if n > 0 { - s.buf.put(&recvMsg{data: buf[:n:n]}) - buf = buf[n:] - } - if err != nil { - s.buf.put(&recvMsg{err: mapRecvMsgError(err)}) - return - } - if len(buf) == 0 { - buf = make([]byte, readSize) - } - } - }() - - // startStream is provided by the *grpc.Server's serveStreams. - // It starts a goroutine serving s and exits immediately. - // The goroutine that is started is the one that then calls - // into ht, calling WriteHeader, Write, WriteStatus, Close, etc. - startStream(s) - - ht.runStream() - close(requestOver) - - // Wait for reading goroutine to finish. - req.Body.Close() - <-readerDone -} - -func (ht *serverHandlerTransport) runStream() { - for { - select { - case fn, ok := <-ht.writes: - if !ok { - return - } - fn() - case <-ht.closedCh: - return - } - } -} - -func (ht *serverHandlerTransport) Drain() { - panic("Drain() is not implemented") -} - -// mapRecvMsgError returns the non-nil err into the appropriate -// error value as expected by callers of *grpc.parser.recvMsg. -// In particular, in can only be: -// * io.EOF -// * io.ErrUnexpectedEOF -// * of type transport.ConnectionError -// * of type transport.StreamError -func mapRecvMsgError(err error) error { - if err == io.EOF || err == io.ErrUnexpectedEOF { - return err - } - if se, ok := err.(http2.StreamError); ok { - if code, ok := http2ErrConvTab[se.Code]; ok { - return StreamError{ - Code: code, - Desc: se.Error(), - } - } - } - return connectionErrorf(true, err, err.Error()) -} diff --git a/vendor/google.golang.org/grpc/transport/http2_client.go b/vendor/google.golang.org/grpc/transport/http2_client.go deleted file mode 100644 index 713f76223..000000000 --- a/vendor/google.golang.org/grpc/transport/http2_client.go +++ /dev/null @@ -1,1306 +0,0 @@ -/* - * - * Copyright 2014, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT - * OWNER 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. - * - */ - -package transport - -import ( - "bytes" - "io" - "math" - "net" - "strings" - "sync" - "sync/atomic" - "time" - - "golang.org/x/net/context" - "golang.org/x/net/http2" - "golang.org/x/net/http2/hpack" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/credentials" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/keepalive" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/peer" - "google.golang.org/grpc/stats" - "google.golang.org/grpc/status" -) - -// http2Client implements the ClientTransport interface with HTTP2. -type http2Client struct { - ctx context.Context - target string // server name/addr - userAgent string - md interface{} - conn net.Conn // underlying communication channel - remoteAddr net.Addr - localAddr net.Addr - authInfo credentials.AuthInfo // auth info about the connection - nextID uint32 // the next stream ID to be used - - // writableChan synchronizes write access to the transport. - // A writer acquires the write lock by sending a value on writableChan - // and releases it by receiving from writableChan. - writableChan chan int - // shutdownChan is closed when Close is called. - // Blocking operations should select on shutdownChan to avoid - // blocking forever after Close. - // TODO(zhaoq): Maybe have a channel context? - shutdownChan chan struct{} - // errorChan is closed to notify the I/O error to the caller. - errorChan chan struct{} - // goAway is closed to notify the upper layer (i.e., addrConn.transportMonitor) - // that the server sent GoAway on this transport. - goAway chan struct{} - // awakenKeepalive is used to wake up keepalive when after it has gone dormant. - awakenKeepalive chan struct{} - - framer *framer - hBuf *bytes.Buffer // the buffer for HPACK encoding - hEnc *hpack.Encoder // HPACK encoder - - // controlBuf delivers all the control related tasks (e.g., window - // updates, reset streams, and various settings) to the controller. - controlBuf *recvBuffer - fc *inFlow - // sendQuotaPool provides flow control to outbound message. - sendQuotaPool *quotaPool - // streamsQuota limits the max number of concurrent streams. - streamsQuota *quotaPool - - // The scheme used: https if TLS is on, http otherwise. - scheme string - - isSecure bool - - creds []credentials.PerRPCCredentials - - // Boolean to keep track of reading activity on transport. - // 1 is true and 0 is false. - activity uint32 // Accessed atomically. - kp keepalive.ClientParameters - - statsHandler stats.Handler - - initialWindowSize int32 - - mu sync.Mutex // guard the following variables - state transportState // the state of underlying connection - activeStreams map[uint32]*Stream - // The max number of concurrent streams - maxStreams int - // the per-stream outbound flow control window size set by the peer. - streamSendQuota uint32 - // goAwayID records the Last-Stream-ID in the GoAway frame from the server. - goAwayID uint32 - // prevGoAway ID records the Last-Stream-ID in the previous GOAway frame. - prevGoAwayID uint32 - // goAwayReason records the http2.ErrCode and debug data received with the - // GoAway frame. - goAwayReason GoAwayReason -} - -func dial(ctx context.Context, fn func(context.Context, string) (net.Conn, error), addr string) (net.Conn, error) { - if fn != nil { - return fn(ctx, addr) - } - return dialContext(ctx, "tcp", addr) -} - -func isTemporary(err error) bool { - switch err { - case io.EOF: - // Connection closures may be resolved upon retry, and are thus - // treated as temporary. - return true - case context.DeadlineExceeded: - // In Go 1.7, context.DeadlineExceeded implements Timeout(), and this - // special case is not needed. Until then, we need to keep this - // clause. - return true - } - - switch err := err.(type) { - case interface { - Temporary() bool - }: - return err.Temporary() - case interface { - Timeout() bool - }: - // Timeouts may be resolved upon retry, and are thus treated as - // temporary. - return err.Timeout() - } - return false -} - -// newHTTP2Client constructs a connected ClientTransport to addr based on HTTP2 -// and starts to receive messages on it. Non-nil error returns if construction -// fails. -func newHTTP2Client(ctx context.Context, addr TargetInfo, opts ConnectOptions) (_ ClientTransport, err error) { - scheme := "http" - conn, err := dial(ctx, opts.Dialer, addr.Addr) - if err != nil { - if opts.FailOnNonTempDialError { - return nil, connectionErrorf(isTemporary(err), err, "transport: error while dialing: %v", err) - } - return nil, connectionErrorf(true, err, "transport: Error while dialing %v", err) - } - // Any further errors will close the underlying connection - defer func(conn net.Conn) { - if err != nil { - conn.Close() - } - }(conn) - var ( - isSecure bool - authInfo credentials.AuthInfo - ) - if creds := opts.TransportCredentials; creds != nil { - scheme = "https" - conn, authInfo, err = creds.ClientHandshake(ctx, addr.Addr, conn) - if err != nil { - // Credentials handshake errors are typically considered permanent - // to avoid retrying on e.g. bad certificates. - temp := isTemporary(err) - return nil, connectionErrorf(temp, err, "transport: authentication handshake failed: %v", err) - } - isSecure = true - } - kp := opts.KeepaliveParams - // Validate keepalive parameters. - if kp.Time == 0 { - kp.Time = defaultClientKeepaliveTime - } - if kp.Timeout == 0 { - kp.Timeout = defaultClientKeepaliveTimeout - } - icwz := int32(initialConnWindowSize) - if opts.InitialConnWindowSize >= defaultWindowSize { - icwz = opts.InitialConnWindowSize - } - var buf bytes.Buffer - t := &http2Client{ - ctx: ctx, - target: addr.Addr, - userAgent: opts.UserAgent, - md: addr.Metadata, - conn: conn, - remoteAddr: conn.RemoteAddr(), - localAddr: conn.LocalAddr(), - authInfo: authInfo, - // The client initiated stream id is odd starting from 1. - nextID: 1, - writableChan: make(chan int, 1), - shutdownChan: make(chan struct{}), - errorChan: make(chan struct{}), - goAway: make(chan struct{}), - awakenKeepalive: make(chan struct{}, 1), - framer: newFramer(conn), - hBuf: &buf, - hEnc: hpack.NewEncoder(&buf), - controlBuf: newRecvBuffer(), - fc: &inFlow{limit: uint32(icwz)}, - sendQuotaPool: newQuotaPool(defaultWindowSize), - scheme: scheme, - state: reachable, - activeStreams: make(map[uint32]*Stream), - isSecure: isSecure, - creds: opts.PerRPCCredentials, - maxStreams: defaultMaxStreamsClient, - streamsQuota: newQuotaPool(defaultMaxStreamsClient), - streamSendQuota: defaultWindowSize, - kp: kp, - statsHandler: opts.StatsHandler, - initialWindowSize: initialWindowSize, - } - if opts.InitialWindowSize >= defaultWindowSize { - t.initialWindowSize = opts.InitialWindowSize - } - // Make sure awakenKeepalive can't be written upon. - // keepalive routine will make it writable, if need be. - t.awakenKeepalive <- struct{}{} - if t.statsHandler != nil { - t.ctx = t.statsHandler.TagConn(t.ctx, &stats.ConnTagInfo{ - RemoteAddr: t.remoteAddr, - LocalAddr: t.localAddr, - }) - connBegin := &stats.ConnBegin{ - Client: true, - } - t.statsHandler.HandleConn(t.ctx, connBegin) - } - // Start the reader goroutine for incoming message. Each transport has - // a dedicated goroutine which reads HTTP2 frame from network. Then it - // dispatches the frame to the corresponding stream entity. - go t.reader() - // Send connection preface to server. - n, err := t.conn.Write(clientPreface) - if err != nil { - t.Close() - return nil, connectionErrorf(true, err, "transport: failed to write client preface: %v", err) - } - if n != len(clientPreface) { - t.Close() - return nil, connectionErrorf(true, err, "transport: preface mismatch, wrote %d bytes; want %d", n, len(clientPreface)) - } - if t.initialWindowSize != defaultWindowSize { - err = t.framer.writeSettings(true, http2.Setting{ - ID: http2.SettingInitialWindowSize, - Val: uint32(t.initialWindowSize), - }) - } else { - err = t.framer.writeSettings(true) - } - if err != nil { - t.Close() - return nil, connectionErrorf(true, err, "transport: failed to write initial settings frame: %v", err) - } - // Adjust the connection flow control window if needed. - if delta := uint32(icwz - defaultWindowSize); delta > 0 { - if err := t.framer.writeWindowUpdate(true, 0, delta); err != nil { - t.Close() - return nil, connectionErrorf(true, err, "transport: failed to write window update: %v", err) - } - } - go t.controller() - if t.kp.Time != infinity { - go t.keepalive() - } - t.writableChan <- 0 - return t, nil -} - -func (t *http2Client) newStream(ctx context.Context, callHdr *CallHdr) *Stream { - // TODO(zhaoq): Handle uint32 overflow of Stream.id. - s := &Stream{ - id: t.nextID, - done: make(chan struct{}), - goAway: make(chan struct{}), - method: callHdr.Method, - sendCompress: callHdr.SendCompress, - buf: newRecvBuffer(), - fc: &inFlow{limit: uint32(t.initialWindowSize)}, - sendQuotaPool: newQuotaPool(int(t.streamSendQuota)), - headerChan: make(chan struct{}), - } - t.nextID += 2 - s.requestRead = func(n int) { - t.adjustWindow(s, uint32(n)) - } - // The client side stream context should have exactly the same life cycle with the user provided context. - // That means, s.ctx should be read-only. And s.ctx is done iff ctx is done. - // So we use the original context here instead of creating a copy. - s.ctx = ctx - s.trReader = &transportReader{ - reader: &recvBufferReader{ - ctx: s.ctx, - goAway: s.goAway, - recv: s.buf, - }, - windowHandler: func(n int) { - t.updateWindow(s, uint32(n)) - }, - } - - return s -} - -// NewStream creates a stream and registers it into the transport as "active" -// streams. -func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (_ *Stream, err error) { - pr := &peer.Peer{ - Addr: t.remoteAddr, - } - // Attach Auth info if there is any. - if t.authInfo != nil { - pr.AuthInfo = t.authInfo - } - ctx = peer.NewContext(ctx, pr) - var ( - authData = make(map[string]string) - audience string - ) - // Create an audience string only if needed. - if len(t.creds) > 0 || callHdr.Creds != nil { - // Construct URI required to get auth request metadata. - var port string - if pos := strings.LastIndex(t.target, ":"); pos != -1 { - // Omit port if it is the default one. - if t.target[pos+1:] != "443" { - port = ":" + t.target[pos+1:] - } - } - pos := strings.LastIndex(callHdr.Method, "/") - if pos == -1 { - pos = len(callHdr.Method) - } - audience = "https://" + callHdr.Host + port + callHdr.Method[:pos] - } - for _, c := range t.creds { - data, err := c.GetRequestMetadata(ctx, audience) - if err != nil { - return nil, streamErrorf(codes.Internal, "transport: %v", err) - } - for k, v := range data { - // Capital header names are illegal in HTTP/2. - k = strings.ToLower(k) - authData[k] = v - } - } - callAuthData := make(map[string]string) - // Check if credentials.PerRPCCredentials were provided via call options. - // Note: if these credentials are provided both via dial options and call - // options, then both sets of credentials will be applied. - if callCreds := callHdr.Creds; callCreds != nil { - if !t.isSecure && callCreds.RequireTransportSecurity() { - return nil, streamErrorf(codes.Unauthenticated, "transport: cannot send secure credentials on an insecure conneciton") - } - data, err := callCreds.GetRequestMetadata(ctx, audience) - if err != nil { - return nil, streamErrorf(codes.Internal, "transport: %v", err) - } - for k, v := range data { - // Capital header names are illegal in HTTP/2 - k = strings.ToLower(k) - callAuthData[k] = v - } - } - t.mu.Lock() - if t.activeStreams == nil { - t.mu.Unlock() - return nil, ErrConnClosing - } - if t.state == draining { - t.mu.Unlock() - return nil, ErrStreamDrain - } - if t.state != reachable { - t.mu.Unlock() - return nil, ErrConnClosing - } - t.mu.Unlock() - sq, err := wait(ctx, nil, nil, t.shutdownChan, t.streamsQuota.acquire()) - if err != nil { - return nil, err - } - // Returns the quota balance back. - if sq > 1 { - t.streamsQuota.add(sq - 1) - } - if _, err := wait(ctx, nil, nil, t.shutdownChan, t.writableChan); err != nil { - // Return the quota back now because there is no stream returned to the caller. - if _, ok := err.(StreamError); ok { - t.streamsQuota.add(1) - } - return nil, err - } - t.mu.Lock() - if t.state == draining { - t.mu.Unlock() - t.streamsQuota.add(1) - // Need to make t writable again so that the rpc in flight can still proceed. - t.writableChan <- 0 - return nil, ErrStreamDrain - } - if t.state != reachable { - t.mu.Unlock() - return nil, ErrConnClosing - } - s := t.newStream(ctx, callHdr) - t.activeStreams[s.id] = s - // If the number of active streams change from 0 to 1, then check if keepalive - // has gone dormant. If so, wake it up. - if len(t.activeStreams) == 1 { - select { - case t.awakenKeepalive <- struct{}{}: - t.framer.writePing(false, false, [8]byte{}) - default: - } - } - - t.mu.Unlock() - - // HPACK encodes various headers. Note that once WriteField(...) is - // called, the corresponding headers/continuation frame has to be sent - // because hpack.Encoder is stateful. - t.hBuf.Reset() - t.hEnc.WriteField(hpack.HeaderField{Name: ":method", Value: "POST"}) - t.hEnc.WriteField(hpack.HeaderField{Name: ":scheme", Value: t.scheme}) - t.hEnc.WriteField(hpack.HeaderField{Name: ":path", Value: callHdr.Method}) - t.hEnc.WriteField(hpack.HeaderField{Name: ":authority", Value: callHdr.Host}) - t.hEnc.WriteField(hpack.HeaderField{Name: "content-type", Value: "application/grpc"}) - t.hEnc.WriteField(hpack.HeaderField{Name: "user-agent", Value: t.userAgent}) - t.hEnc.WriteField(hpack.HeaderField{Name: "te", Value: "trailers"}) - - if callHdr.SendCompress != "" { - t.hEnc.WriteField(hpack.HeaderField{Name: "grpc-encoding", Value: callHdr.SendCompress}) - } - if dl, ok := ctx.Deadline(); ok { - // Send out timeout regardless its value. The server can detect timeout context by itself. - timeout := dl.Sub(time.Now()) - t.hEnc.WriteField(hpack.HeaderField{Name: "grpc-timeout", Value: encodeTimeout(timeout)}) - } - - for k, v := range authData { - t.hEnc.WriteField(hpack.HeaderField{Name: k, Value: encodeMetadataHeader(k, v)}) - } - for k, v := range callAuthData { - t.hEnc.WriteField(hpack.HeaderField{Name: k, Value: encodeMetadataHeader(k, v)}) - } - var ( - hasMD bool - endHeaders bool - ) - if md, ok := metadata.FromOutgoingContext(ctx); ok { - hasMD = true - for k, vv := range md { - // HTTP doesn't allow you to set pseudoheaders after non pseudoheaders were set. - if isReservedHeader(k) { - continue - } - for _, v := range vv { - t.hEnc.WriteField(hpack.HeaderField{Name: k, Value: encodeMetadataHeader(k, v)}) - } - } - } - if md, ok := t.md.(*metadata.MD); ok { - for k, vv := range *md { - if isReservedHeader(k) { - continue - } - for _, v := range vv { - t.hEnc.WriteField(hpack.HeaderField{Name: k, Value: encodeMetadataHeader(k, v)}) - } - } - } - first := true - bufLen := t.hBuf.Len() - // Sends the headers in a single batch even when they span multiple frames. - for !endHeaders { - size := t.hBuf.Len() - if size > http2MaxFrameLen { - size = http2MaxFrameLen - } else { - endHeaders = true - } - var flush bool - if endHeaders && (hasMD || callHdr.Flush) { - flush = true - } - if first { - // Sends a HeadersFrame to server to start a new stream. - p := http2.HeadersFrameParam{ - StreamID: s.id, - BlockFragment: t.hBuf.Next(size), - EndStream: false, - EndHeaders: endHeaders, - } - // Do a force flush for the buffered frames iff it is the last headers frame - // and there is header metadata to be sent. Otherwise, there is flushing until - // the corresponding data frame is written. - err = t.framer.writeHeaders(flush, p) - first = false - } else { - // Sends Continuation frames for the leftover headers. - err = t.framer.writeContinuation(flush, s.id, endHeaders, t.hBuf.Next(size)) - } - if err != nil { - t.notifyError(err) - return nil, connectionErrorf(true, err, "transport: %v", err) - } - } - s.bytesSent = true - - if t.statsHandler != nil { - outHeader := &stats.OutHeader{ - Client: true, - WireLength: bufLen, - FullMethod: callHdr.Method, - RemoteAddr: t.remoteAddr, - LocalAddr: t.localAddr, - Compression: callHdr.SendCompress, - } - t.statsHandler.HandleRPC(s.ctx, outHeader) - } - t.writableChan <- 0 - return s, nil -} - -// CloseStream clears the footprint of a stream when the stream is not needed any more. -// This must not be executed in reader's goroutine. -func (t *http2Client) CloseStream(s *Stream, err error) { - t.mu.Lock() - if t.activeStreams == nil { - t.mu.Unlock() - return - } - delete(t.activeStreams, s.id) - if t.state == draining && len(t.activeStreams) == 0 { - // The transport is draining and s is the last live stream on t. - t.mu.Unlock() - t.Close() - return - } - t.mu.Unlock() - // rstStream is true in case the stream is being closed at the client-side - // and the server needs to be intimated about it by sending a RST_STREAM - // frame. - // To make sure this frame is written to the wire before the headers of the - // next stream waiting for streamsQuota, we add to streamsQuota pool only - // after having acquired the writableChan to send RST_STREAM out (look at - // the controller() routine). - var rstStream bool - var rstError http2.ErrCode - defer func() { - // In case, the client doesn't have to send RST_STREAM to server - // we can safely add back to streamsQuota pool now. - if !rstStream { - t.streamsQuota.add(1) - return - } - t.controlBuf.put(&resetStream{s.id, rstError}) - }() - s.mu.Lock() - rstStream = s.rstStream - rstError = s.rstError - if q := s.fc.resetPendingData(); q > 0 { - if n := t.fc.onRead(q); n > 0 { - t.controlBuf.put(&windowUpdate{0, n}) - } - } - if s.state == streamDone { - s.mu.Unlock() - return - } - if !s.headerDone { - close(s.headerChan) - s.headerDone = true - } - s.state = streamDone - s.mu.Unlock() - if _, ok := err.(StreamError); ok { - rstStream = true - rstError = http2.ErrCodeCancel - } -} - -// Close kicks off the shutdown process of the transport. This should be called -// only once on a transport. Once it is called, the transport should not be -// accessed any more. -func (t *http2Client) Close() (err error) { - t.mu.Lock() - if t.state == closing { - t.mu.Unlock() - return - } - if t.state == reachable || t.state == draining { - close(t.errorChan) - } - t.state = closing - t.mu.Unlock() - close(t.shutdownChan) - err = t.conn.Close() - t.mu.Lock() - streams := t.activeStreams - t.activeStreams = nil - t.mu.Unlock() - // Notify all active streams. - for _, s := range streams { - s.mu.Lock() - if !s.headerDone { - close(s.headerChan) - s.headerDone = true - } - s.mu.Unlock() - s.write(recvMsg{err: ErrConnClosing}) - } - if t.statsHandler != nil { - connEnd := &stats.ConnEnd{ - Client: true, - } - t.statsHandler.HandleConn(t.ctx, connEnd) - } - return -} - -func (t *http2Client) GracefulClose() error { - t.mu.Lock() - switch t.state { - case unreachable: - // The server may close the connection concurrently. t is not available for - // any streams. Close it now. - t.mu.Unlock() - t.Close() - return nil - case closing: - t.mu.Unlock() - return nil - } - // Notify the streams which were initiated after the server sent GOAWAY. - select { - case <-t.goAway: - n := t.prevGoAwayID - if n == 0 && t.nextID > 1 { - n = t.nextID - 2 - } - m := t.goAwayID + 2 - if m == 2 { - m = 1 - } - for i := m; i <= n; i += 2 { - if s, ok := t.activeStreams[i]; ok { - close(s.goAway) - } - } - default: - } - if t.state == draining { - t.mu.Unlock() - return nil - } - t.state = draining - active := len(t.activeStreams) - t.mu.Unlock() - if active == 0 { - return t.Close() - } - return nil -} - -// Write formats the data into HTTP2 data frame(s) and sends it out. The caller -// should proceed only if Write returns nil. -// TODO(zhaoq): opts.Delay is ignored in this implementation. Support it later -// if it improves the performance. -func (t *http2Client) Write(s *Stream, data []byte, opts *Options) error { - r := bytes.NewBuffer(data) - for { - var p []byte - if r.Len() > 0 { - size := http2MaxFrameLen - // Wait until the stream has some quota to send the data. - sq, err := wait(s.ctx, s.done, s.goAway, t.shutdownChan, s.sendQuotaPool.acquire()) - if err != nil { - return err - } - // Wait until the transport has some quota to send the data. - tq, err := wait(s.ctx, s.done, s.goAway, t.shutdownChan, t.sendQuotaPool.acquire()) - if err != nil { - return err - } - if sq < size { - size = sq - } - if tq < size { - size = tq - } - p = r.Next(size) - ps := len(p) - if ps < sq { - // Overbooked stream quota. Return it back. - s.sendQuotaPool.add(sq - ps) - } - if ps < tq { - // Overbooked transport quota. Return it back. - t.sendQuotaPool.add(tq - ps) - } - } - var ( - endStream bool - forceFlush bool - ) - if opts.Last && r.Len() == 0 { - endStream = true - } - // Indicate there is a writer who is about to write a data frame. - t.framer.adjustNumWriters(1) - // Got some quota. Try to acquire writing privilege on the transport. - if _, err := wait(s.ctx, s.done, s.goAway, t.shutdownChan, t.writableChan); err != nil { - if _, ok := err.(StreamError); ok || err == io.EOF { - // Return the connection quota back. - t.sendQuotaPool.add(len(p)) - } - if t.framer.adjustNumWriters(-1) == 0 { - // This writer is the last one in this batch and has the - // responsibility to flush the buffered frames. It queues - // a flush request to controlBuf instead of flushing directly - // in order to avoid the race with other writing or flushing. - t.controlBuf.put(&flushIO{}) - } - return err - } - select { - case <-s.ctx.Done(): - t.sendQuotaPool.add(len(p)) - if t.framer.adjustNumWriters(-1) == 0 { - t.controlBuf.put(&flushIO{}) - } - t.writableChan <- 0 - return ContextErr(s.ctx.Err()) - default: - } - if r.Len() == 0 && t.framer.adjustNumWriters(0) == 1 { - // Do a force flush iff this is last frame for the entire gRPC message - // and the caller is the only writer at this moment. - forceFlush = true - } - // If WriteData fails, all the pending streams will be handled - // by http2Client.Close(). No explicit CloseStream() needs to be - // invoked. - if err := t.framer.writeData(forceFlush, s.id, endStream, p); err != nil { - t.notifyError(err) - return connectionErrorf(true, err, "transport: %v", err) - } - if t.framer.adjustNumWriters(-1) == 0 { - t.framer.flushWrite() - } - t.writableChan <- 0 - if r.Len() == 0 { - break - } - } - if !opts.Last { - return nil - } - s.mu.Lock() - if s.state != streamDone { - s.state = streamWriteDone - } - s.mu.Unlock() - return nil -} - -func (t *http2Client) getStream(f http2.Frame) (*Stream, bool) { - t.mu.Lock() - defer t.mu.Unlock() - s, ok := t.activeStreams[f.Header().StreamID] - return s, ok -} - -// adjustWindow sends out extra window update over the initial window size -// of stream if the application is requesting data larger in size than -// the window. -func (t *http2Client) adjustWindow(s *Stream, n uint32) { - s.mu.Lock() - defer s.mu.Unlock() - if s.state == streamDone { - return - } - if w := s.fc.maybeAdjust(n); w > 0 { - t.controlBuf.put(&windowUpdate{s.id, w}) - } -} - -// updateWindow adjusts the inbound quota for the stream and the transport. -// Window updates will deliver to the controller for sending when -// the cumulative quota exceeds the corresponding threshold. -func (t *http2Client) updateWindow(s *Stream, n uint32) { - s.mu.Lock() - defer s.mu.Unlock() - if s.state == streamDone { - return - } - if w := t.fc.onRead(n); w > 0 { - t.controlBuf.put(&windowUpdate{0, w}) - } - if w := s.fc.onRead(n); w > 0 { - t.controlBuf.put(&windowUpdate{s.id, w}) - } -} - -func (t *http2Client) handleData(f *http2.DataFrame) { - size := f.Header().Length - if err := t.fc.onData(uint32(size)); err != nil { - t.notifyError(connectionErrorf(true, err, "%v", err)) - return - } - // Select the right stream to dispatch. - s, ok := t.getStream(f) - if !ok { - if w := t.fc.onRead(uint32(size)); w > 0 { - t.controlBuf.put(&windowUpdate{0, w}) - } - return - } - if size > 0 { - s.mu.Lock() - if s.state == streamDone { - s.mu.Unlock() - // The stream has been closed. Release the corresponding quota. - if w := t.fc.onRead(uint32(size)); w > 0 { - t.controlBuf.put(&windowUpdate{0, w}) - } - return - } - if err := s.fc.onData(uint32(size)); err != nil { - s.rstStream = true - s.rstError = http2.ErrCodeFlowControl - s.finish(status.New(codes.Internal, err.Error())) - s.mu.Unlock() - s.write(recvMsg{err: io.EOF}) - return - } - if f.Header().Flags.Has(http2.FlagDataPadded) { - if w := t.fc.onRead(uint32(size) - uint32(len(f.Data()))); w > 0 { - t.controlBuf.put(&windowUpdate{0, w}) - } - if w := s.fc.onRead(uint32(size) - uint32(len(f.Data()))); w > 0 { - t.controlBuf.put(&windowUpdate{s.id, w}) - } - } - s.mu.Unlock() - // TODO(bradfitz, zhaoq): A copy is required here because there is no - // guarantee f.Data() is consumed before the arrival of next frame. - // Can this copy be eliminated? - if len(f.Data()) > 0 { - data := make([]byte, len(f.Data())) - copy(data, f.Data()) - s.write(recvMsg{data: data}) - } - } - // The server has closed the stream without sending trailers. Record that - // the read direction is closed, and set the status appropriately. - if f.FrameHeader.Flags.Has(http2.FlagDataEndStream) { - s.mu.Lock() - if s.state == streamDone { - s.mu.Unlock() - return - } - s.finish(status.New(codes.Internal, "server closed the stream without sending trailers")) - s.mu.Unlock() - s.write(recvMsg{err: io.EOF}) - } -} - -func (t *http2Client) handleRSTStream(f *http2.RSTStreamFrame) { - s, ok := t.getStream(f) - if !ok { - return - } - s.mu.Lock() - if s.state == streamDone { - s.mu.Unlock() - return - } - if !s.headerDone { - close(s.headerChan) - s.headerDone = true - } - statusCode, ok := http2ErrConvTab[http2.ErrCode(f.ErrCode)] - if !ok { - grpclog.Println("transport: http2Client.handleRSTStream found no mapped gRPC status for the received http2 error ", f.ErrCode) - statusCode = codes.Unknown - } - s.finish(status.Newf(statusCode, "stream terminated by RST_STREAM with error code: %d", f.ErrCode)) - s.mu.Unlock() - s.write(recvMsg{err: io.EOF}) -} - -func (t *http2Client) handleSettings(f *http2.SettingsFrame) { - if f.IsAck() { - return - } - var ss []http2.Setting - f.ForeachSetting(func(s http2.Setting) error { - ss = append(ss, s) - return nil - }) - // The settings will be applied once the ack is sent. - t.controlBuf.put(&settings{ack: true, ss: ss}) -} - -func (t *http2Client) handlePing(f *http2.PingFrame) { - if f.IsAck() { // Do nothing. - return - } - pingAck := &ping{ack: true} - copy(pingAck.data[:], f.Data[:]) - t.controlBuf.put(pingAck) -} - -func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) { - if f.ErrCode == http2.ErrCodeEnhanceYourCalm { - grpclog.Printf("Client received GoAway with http2.ErrCodeEnhanceYourCalm.") - } - t.mu.Lock() - if t.state == reachable || t.state == draining { - if f.LastStreamID > 0 && f.LastStreamID%2 != 1 { - t.mu.Unlock() - t.notifyError(connectionErrorf(true, nil, "received illegal http2 GOAWAY frame: stream ID %d is even", f.LastStreamID)) - return - } - select { - case <-t.goAway: - id := t.goAwayID - // t.goAway has been closed (i.e.,multiple GoAways). - if id < f.LastStreamID { - t.mu.Unlock() - t.notifyError(connectionErrorf(true, nil, "received illegal http2 GOAWAY frame: previously recv GOAWAY frame with LastStramID %d, currently recv %d", id, f.LastStreamID)) - return - } - t.prevGoAwayID = id - t.goAwayID = f.LastStreamID - t.mu.Unlock() - return - default: - t.setGoAwayReason(f) - } - t.goAwayID = f.LastStreamID - close(t.goAway) - } - t.mu.Unlock() -} - -// setGoAwayReason sets the value of t.goAwayReason based -// on the GoAway frame received. -// It expects a lock on transport's mutext to be held by -// the caller. -func (t *http2Client) setGoAwayReason(f *http2.GoAwayFrame) { - t.goAwayReason = NoReason - switch f.ErrCode { - case http2.ErrCodeEnhanceYourCalm: - if string(f.DebugData()) == "too_many_pings" { - t.goAwayReason = TooManyPings - } - } -} - -func (t *http2Client) GetGoAwayReason() GoAwayReason { - t.mu.Lock() - defer t.mu.Unlock() - return t.goAwayReason -} - -func (t *http2Client) handleWindowUpdate(f *http2.WindowUpdateFrame) { - id := f.Header().StreamID - incr := f.Increment - if id == 0 { - t.sendQuotaPool.add(int(incr)) - return - } - if s, ok := t.getStream(f); ok { - s.sendQuotaPool.add(int(incr)) - } -} - -// operateHeaders takes action on the decoded headers. -func (t *http2Client) operateHeaders(frame *http2.MetaHeadersFrame) { - s, ok := t.getStream(frame) - if !ok { - return - } - s.bytesReceived = true - var state decodeState - if err := state.decodeResponseHeader(frame); err != nil { - s.mu.Lock() - if !s.headerDone { - close(s.headerChan) - s.headerDone = true - } - s.mu.Unlock() - s.write(recvMsg{err: err}) - // Something wrong. Stops reading even when there is remaining. - return - } - - endStream := frame.StreamEnded() - var isHeader bool - defer func() { - if t.statsHandler != nil { - if isHeader { - inHeader := &stats.InHeader{ - Client: true, - WireLength: int(frame.Header().Length), - } - t.statsHandler.HandleRPC(s.ctx, inHeader) - } else { - inTrailer := &stats.InTrailer{ - Client: true, - WireLength: int(frame.Header().Length), - } - t.statsHandler.HandleRPC(s.ctx, inTrailer) - } - } - }() - - s.mu.Lock() - if !endStream { - s.recvCompress = state.encoding - } - if !s.headerDone { - if !endStream && len(state.mdata) > 0 { - s.header = state.mdata - } - close(s.headerChan) - s.headerDone = true - isHeader = true - } - if !endStream || s.state == streamDone { - s.mu.Unlock() - return - } - - if len(state.mdata) > 0 { - s.trailer = state.mdata - } - s.finish(state.status()) - s.mu.Unlock() - s.write(recvMsg{err: io.EOF}) -} - -func handleMalformedHTTP2(s *Stream, err error) { - s.mu.Lock() - if !s.headerDone { - close(s.headerChan) - s.headerDone = true - } - s.mu.Unlock() - s.write(recvMsg{err: err}) -} - -// reader runs as a separate goroutine in charge of reading data from network -// connection. -// -// TODO(zhaoq): currently one reader per transport. Investigate whether this is -// optimal. -// TODO(zhaoq): Check the validity of the incoming frame sequence. -func (t *http2Client) reader() { - // Check the validity of server preface. - frame, err := t.framer.readFrame() - if err != nil { - t.notifyError(err) - return - } - atomic.CompareAndSwapUint32(&t.activity, 0, 1) - sf, ok := frame.(*http2.SettingsFrame) - if !ok { - t.notifyError(err) - return - } - t.handleSettings(sf) - - // loop to keep reading incoming messages on this transport. - for { - frame, err := t.framer.readFrame() - atomic.CompareAndSwapUint32(&t.activity, 0, 1) - if err != nil { - // Abort an active stream if the http2.Framer returns a - // http2.StreamError. This can happen only if the server's response - // is malformed http2. - if se, ok := err.(http2.StreamError); ok { - t.mu.Lock() - s := t.activeStreams[se.StreamID] - t.mu.Unlock() - if s != nil { - // use error detail to provide better err message - handleMalformedHTTP2(s, streamErrorf(http2ErrConvTab[se.Code], "%v", t.framer.errorDetail())) - } - continue - } else { - // Transport error. - t.notifyError(err) - return - } - } - switch frame := frame.(type) { - case *http2.MetaHeadersFrame: - t.operateHeaders(frame) - case *http2.DataFrame: - t.handleData(frame) - case *http2.RSTStreamFrame: - t.handleRSTStream(frame) - case *http2.SettingsFrame: - t.handleSettings(frame) - case *http2.PingFrame: - t.handlePing(frame) - case *http2.GoAwayFrame: - t.handleGoAway(frame) - case *http2.WindowUpdateFrame: - t.handleWindowUpdate(frame) - default: - grpclog.Printf("transport: http2Client.reader got unhandled frame type %v.", frame) - } - } -} - -func (t *http2Client) applySettings(ss []http2.Setting) { - for _, s := range ss { - switch s.ID { - case http2.SettingMaxConcurrentStreams: - // TODO(zhaoq): This is a hack to avoid significant refactoring of the - // code to deal with the unrealistic int32 overflow. Probably will try - // to find a better way to handle this later. - if s.Val > math.MaxInt32 { - s.Val = math.MaxInt32 - } - t.mu.Lock() - ms := t.maxStreams - t.maxStreams = int(s.Val) - t.mu.Unlock() - t.streamsQuota.add(int(s.Val) - ms) - case http2.SettingInitialWindowSize: - t.mu.Lock() - for _, stream := range t.activeStreams { - // Adjust the sending quota for each stream. - stream.sendQuotaPool.add(int(s.Val - t.streamSendQuota)) - } - t.streamSendQuota = s.Val - t.mu.Unlock() - } - } -} - -// controller running in a separate goroutine takes charge of sending control -// frames (e.g., window update, reset stream, setting, etc.) to the server. -func (t *http2Client) controller() { - for { - select { - case i := <-t.controlBuf.get(): - t.controlBuf.load() - select { - case <-t.writableChan: - switch i := i.(type) { - case *windowUpdate: - t.framer.writeWindowUpdate(true, i.streamID, i.increment) - case *settings: - if i.ack { - t.framer.writeSettingsAck(true) - t.applySettings(i.ss) - } else { - t.framer.writeSettings(true, i.ss...) - } - case *resetStream: - // If the server needs to be to intimated about stream closing, - // then we need to make sure the RST_STREAM frame is written to - // the wire before the headers of the next stream waiting on - // streamQuota. We ensure this by adding to the streamsQuota pool - // only after having acquired the writableChan to send RST_STREAM. - t.streamsQuota.add(1) - t.framer.writeRSTStream(true, i.streamID, i.code) - case *flushIO: - t.framer.flushWrite() - case *ping: - t.framer.writePing(true, i.ack, i.data) - default: - grpclog.Printf("transport: http2Client.controller got unexpected item type %v\n", i) - } - t.writableChan <- 0 - continue - case <-t.shutdownChan: - return - } - case <-t.shutdownChan: - return - } - } -} - -// keepalive running in a separate goroutune makes sure the connection is alive by sending pings. -func (t *http2Client) keepalive() { - p := &ping{data: [8]byte{}} - timer := time.NewTimer(t.kp.Time) - for { - select { - case <-timer.C: - if atomic.CompareAndSwapUint32(&t.activity, 1, 0) { - timer.Reset(t.kp.Time) - continue - } - // Check if keepalive should go dormant. - t.mu.Lock() - if len(t.activeStreams) < 1 && !t.kp.PermitWithoutStream { - // Make awakenKeepalive writable. - <-t.awakenKeepalive - t.mu.Unlock() - select { - case <-t.awakenKeepalive: - // If the control gets here a ping has been sent - // need to reset the timer with keepalive.Timeout. - case <-t.shutdownChan: - return - } - } else { - t.mu.Unlock() - // Send ping. - t.controlBuf.put(p) - } - - // By the time control gets here a ping has been sent one way or the other. - timer.Reset(t.kp.Timeout) - select { - case <-timer.C: - if atomic.CompareAndSwapUint32(&t.activity, 1, 0) { - timer.Reset(t.kp.Time) - continue - } - t.Close() - return - case <-t.shutdownChan: - if !timer.Stop() { - <-timer.C - } - return - } - case <-t.shutdownChan: - if !timer.Stop() { - <-timer.C - } - return - } - } -} - -func (t *http2Client) Error() <-chan struct{} { - return t.errorChan -} - -func (t *http2Client) GoAway() <-chan struct{} { - return t.goAway -} - -func (t *http2Client) notifyError(err error) { - t.mu.Lock() - // make sure t.errorChan is closed only once. - if t.state == draining { - t.mu.Unlock() - t.Close() - return - } - if t.state == reachable { - t.state = unreachable - close(t.errorChan) - grpclog.Printf("transport: http2Client.notifyError got notified that the client transport was broken %v.", err) - } - t.mu.Unlock() -} diff --git a/vendor/google.golang.org/grpc/transport/http2_server.go b/vendor/google.golang.org/grpc/transport/http2_server.go deleted file mode 100644 index 559d28d3e..000000000 --- a/vendor/google.golang.org/grpc/transport/http2_server.go +++ /dev/null @@ -1,1100 +0,0 @@ -/* - * - * Copyright 2014, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT - * OWNER 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. - * - */ - -package transport - -import ( - "bytes" - "errors" - "io" - "math" - "math/rand" - "net" - "strconv" - "sync" - "sync/atomic" - "time" - - "github.com/golang/protobuf/proto" - "golang.org/x/net/context" - "golang.org/x/net/http2" - "golang.org/x/net/http2/hpack" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/credentials" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/keepalive" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/peer" - "google.golang.org/grpc/stats" - "google.golang.org/grpc/status" - "google.golang.org/grpc/tap" -) - -// ErrIllegalHeaderWrite indicates that setting header is illegal because of -// the stream's state. -var ErrIllegalHeaderWrite = errors.New("transport: the stream is done or WriteHeader was already called") - -// http2Server implements the ServerTransport interface with HTTP2. -type http2Server struct { - ctx context.Context - conn net.Conn - remoteAddr net.Addr - localAddr net.Addr - maxStreamID uint32 // max stream ID ever seen - authInfo credentials.AuthInfo // auth info about the connection - inTapHandle tap.ServerInHandle - // writableChan synchronizes write access to the transport. - // A writer acquires the write lock by receiving a value on writableChan - // and releases it by sending on writableChan. - writableChan chan int - // shutdownChan is closed when Close is called. - // Blocking operations should select on shutdownChan to avoid - // blocking forever after Close. - shutdownChan chan struct{} - framer *framer - hBuf *bytes.Buffer // the buffer for HPACK encoding - hEnc *hpack.Encoder // HPACK encoder - - // The max number of concurrent streams. - maxStreams uint32 - // controlBuf delivers all the control related tasks (e.g., window - // updates, reset streams, and various settings) to the controller. - controlBuf *recvBuffer - fc *inFlow - // sendQuotaPool provides flow control to outbound message. - sendQuotaPool *quotaPool - - stats stats.Handler - - // Flag to keep track of reading activity on transport. - // 1 is true and 0 is false. - activity uint32 // Accessed atomically. - // Keepalive and max-age parameters for the server. - kp keepalive.ServerParameters - - // Keepalive enforcement policy. - kep keepalive.EnforcementPolicy - // The time instance last ping was received. - lastPingAt time.Time - // Number of times the client has violated keepalive ping policy so far. - pingStrikes uint8 - // Flag to signify that number of ping strikes should be reset to 0. - // This is set whenever data or header frames are sent. - // 1 means yes. - resetPingStrikes uint32 // Accessed atomically. - - initialWindowSize int32 - - mu sync.Mutex // guard the following - state transportState - activeStreams map[uint32]*Stream - // the per-stream outbound flow control window size set by the peer. - streamSendQuota uint32 - // idle is the time instant when the connection went idle. - // This is either the begining of the connection or when the number of - // RPCs go down to 0. - // When the connection is busy, this value is set to 0. - idle time.Time -} - -// newHTTP2Server constructs a ServerTransport based on HTTP2. ConnectionError is -// returned if something goes wrong. -func newHTTP2Server(conn net.Conn, config *ServerConfig) (_ ServerTransport, err error) { - framer := newFramer(conn) - // Send initial settings as connection preface to client. - var settings []http2.Setting - // TODO(zhaoq): Have a better way to signal "no limit" because 0 is - // permitted in the HTTP2 spec. - maxStreams := config.MaxStreams - if maxStreams == 0 { - maxStreams = math.MaxUint32 - } else { - settings = append(settings, http2.Setting{ - ID: http2.SettingMaxConcurrentStreams, - Val: maxStreams, - }) - } - iwz := int32(initialWindowSize) - if config.InitialWindowSize >= defaultWindowSize { - iwz = config.InitialWindowSize - } - icwz := int32(initialConnWindowSize) - if config.InitialConnWindowSize >= defaultWindowSize { - icwz = config.InitialConnWindowSize - } - if iwz != defaultWindowSize { - settings = append(settings, http2.Setting{ - ID: http2.SettingInitialWindowSize, - Val: uint32(iwz)}) - } - if err := framer.writeSettings(true, settings...); err != nil { - return nil, connectionErrorf(true, err, "transport: %v", err) - } - // Adjust the connection flow control window if needed. - if delta := uint32(icwz - defaultWindowSize); delta > 0 { - if err := framer.writeWindowUpdate(true, 0, delta); err != nil { - return nil, connectionErrorf(true, err, "transport: %v", err) - } - } - kp := config.KeepaliveParams - if kp.MaxConnectionIdle == 0 { - kp.MaxConnectionIdle = defaultMaxConnectionIdle - } - if kp.MaxConnectionAge == 0 { - kp.MaxConnectionAge = defaultMaxConnectionAge - } - // Add a jitter to MaxConnectionAge. - kp.MaxConnectionAge += getJitter(kp.MaxConnectionAge) - if kp.MaxConnectionAgeGrace == 0 { - kp.MaxConnectionAgeGrace = defaultMaxConnectionAgeGrace - } - if kp.Time == 0 { - kp.Time = defaultServerKeepaliveTime - } - if kp.Timeout == 0 { - kp.Timeout = defaultServerKeepaliveTimeout - } - kep := config.KeepalivePolicy - if kep.MinTime == 0 { - kep.MinTime = defaultKeepalivePolicyMinTime - } - var buf bytes.Buffer - t := &http2Server{ - ctx: context.Background(), - conn: conn, - remoteAddr: conn.RemoteAddr(), - localAddr: conn.LocalAddr(), - authInfo: config.AuthInfo, - framer: framer, - hBuf: &buf, - hEnc: hpack.NewEncoder(&buf), - maxStreams: maxStreams, - inTapHandle: config.InTapHandle, - controlBuf: newRecvBuffer(), - fc: &inFlow{limit: uint32(icwz)}, - sendQuotaPool: newQuotaPool(defaultWindowSize), - state: reachable, - writableChan: make(chan int, 1), - shutdownChan: make(chan struct{}), - activeStreams: make(map[uint32]*Stream), - streamSendQuota: defaultWindowSize, - stats: config.StatsHandler, - kp: kp, - idle: time.Now(), - kep: kep, - initialWindowSize: iwz, - } - if t.stats != nil { - t.ctx = t.stats.TagConn(t.ctx, &stats.ConnTagInfo{ - RemoteAddr: t.remoteAddr, - LocalAddr: t.localAddr, - }) - connBegin := &stats.ConnBegin{} - t.stats.HandleConn(t.ctx, connBegin) - } - go t.controller() - go t.keepalive() - t.writableChan <- 0 - return t, nil -} - -// operateHeader takes action on the decoded headers. -func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func(*Stream), traceCtx func(context.Context, string) context.Context) (close bool) { - buf := newRecvBuffer() - s := &Stream{ - id: frame.Header().StreamID, - st: t, - buf: buf, - fc: &inFlow{limit: uint32(t.initialWindowSize)}, - } - - var state decodeState - for _, hf := range frame.Fields { - if err := state.processHeaderField(hf); err != nil { - if se, ok := err.(StreamError); ok { - t.controlBuf.put(&resetStream{s.id, statusCodeConvTab[se.Code]}) - } - return - } - } - - if frame.StreamEnded() { - // s is just created by the caller. No lock needed. - s.state = streamReadDone - } - s.recvCompress = state.encoding - if state.timeoutSet { - s.ctx, s.cancel = context.WithTimeout(t.ctx, state.timeout) - } else { - s.ctx, s.cancel = context.WithCancel(t.ctx) - } - pr := &peer.Peer{ - Addr: t.remoteAddr, - } - // Attach Auth info if there is any. - if t.authInfo != nil { - pr.AuthInfo = t.authInfo - } - s.ctx = peer.NewContext(s.ctx, pr) - // Cache the current stream to the context so that the server application - // can find out. Required when the server wants to send some metadata - // back to the client (unary call only). - s.ctx = newContextWithStream(s.ctx, s) - // Attach the received metadata to the context. - if len(state.mdata) > 0 { - s.ctx = metadata.NewIncomingContext(s.ctx, state.mdata) - } - s.trReader = &transportReader{ - reader: &recvBufferReader{ - ctx: s.ctx, - recv: s.buf, - }, - windowHandler: func(n int) { - t.updateWindow(s, uint32(n)) - }, - } - s.recvCompress = state.encoding - s.method = state.method - if t.inTapHandle != nil { - var err error - info := &tap.Info{ - FullMethodName: state.method, - } - s.ctx, err = t.inTapHandle(s.ctx, info) - if err != nil { - grpclog.Printf("transport: http2Server.operateHeaders got an error from InTapHandle: %v", err) - t.controlBuf.put(&resetStream{s.id, http2.ErrCodeRefusedStream}) - return - } - } - t.mu.Lock() - if t.state != reachable { - t.mu.Unlock() - return - } - if uint32(len(t.activeStreams)) >= t.maxStreams { - t.mu.Unlock() - t.controlBuf.put(&resetStream{s.id, http2.ErrCodeRefusedStream}) - return - } - if s.id%2 != 1 || s.id <= t.maxStreamID { - t.mu.Unlock() - // illegal gRPC stream id. - grpclog.Println("transport: http2Server.HandleStreams received an illegal stream id: ", s.id) - return true - } - t.maxStreamID = s.id - s.sendQuotaPool = newQuotaPool(int(t.streamSendQuota)) - t.activeStreams[s.id] = s - if len(t.activeStreams) == 1 { - t.idle = time.Time{} - } - t.mu.Unlock() - s.requestRead = func(n int) { - t.adjustWindow(s, uint32(n)) - } - s.ctx = traceCtx(s.ctx, s.method) - if t.stats != nil { - s.ctx = t.stats.TagRPC(s.ctx, &stats.RPCTagInfo{FullMethodName: s.method}) - inHeader := &stats.InHeader{ - FullMethod: s.method, - RemoteAddr: t.remoteAddr, - LocalAddr: t.localAddr, - Compression: s.recvCompress, - WireLength: int(frame.Header().Length), - } - t.stats.HandleRPC(s.ctx, inHeader) - } - handle(s) - return -} - -// HandleStreams receives incoming streams using the given handler. This is -// typically run in a separate goroutine. -// traceCtx attaches trace to ctx and returns the new context. -func (t *http2Server) HandleStreams(handle func(*Stream), traceCtx func(context.Context, string) context.Context) { - // Check the validity of client preface. - preface := make([]byte, len(clientPreface)) - if _, err := io.ReadFull(t.conn, preface); err != nil { - // Only log if it isn't a simple tcp accept check (ie: tcp balancer doing open/close socket) - if err != io.EOF { - grpclog.Printf("transport: http2Server.HandleStreams failed to receive the preface from client: %v", err) - } - t.Close() - return - } - if !bytes.Equal(preface, clientPreface) { - grpclog.Printf("transport: http2Server.HandleStreams received bogus greeting from client: %q", preface) - t.Close() - return - } - - frame, err := t.framer.readFrame() - if err == io.EOF || err == io.ErrUnexpectedEOF { - t.Close() - return - } - if err != nil { - grpclog.Printf("transport: http2Server.HandleStreams failed to read initial settings frame: %v", err) - t.Close() - return - } - atomic.StoreUint32(&t.activity, 1) - sf, ok := frame.(*http2.SettingsFrame) - if !ok { - grpclog.Printf("transport: http2Server.HandleStreams saw invalid preface type %T from client", frame) - t.Close() - return - } - t.handleSettings(sf) - - for { - frame, err := t.framer.readFrame() - atomic.StoreUint32(&t.activity, 1) - if err != nil { - if se, ok := err.(http2.StreamError); ok { - t.mu.Lock() - s := t.activeStreams[se.StreamID] - t.mu.Unlock() - if s != nil { - t.closeStream(s) - } - t.controlBuf.put(&resetStream{se.StreamID, se.Code}) - continue - } - if err == io.EOF || err == io.ErrUnexpectedEOF { - t.Close() - return - } - grpclog.Printf("transport: http2Server.HandleStreams failed to read frame: %v", err) - t.Close() - return - } - switch frame := frame.(type) { - case *http2.MetaHeadersFrame: - if t.operateHeaders(frame, handle, traceCtx) { - t.Close() - break - } - case *http2.DataFrame: - t.handleData(frame) - case *http2.RSTStreamFrame: - t.handleRSTStream(frame) - case *http2.SettingsFrame: - t.handleSettings(frame) - case *http2.PingFrame: - t.handlePing(frame) - case *http2.WindowUpdateFrame: - t.handleWindowUpdate(frame) - case *http2.GoAwayFrame: - // TODO: Handle GoAway from the client appropriately. - default: - grpclog.Printf("transport: http2Server.HandleStreams found unhandled frame type %v.", frame) - } - } -} - -func (t *http2Server) getStream(f http2.Frame) (*Stream, bool) { - t.mu.Lock() - defer t.mu.Unlock() - if t.activeStreams == nil { - // The transport is closing. - return nil, false - } - s, ok := t.activeStreams[f.Header().StreamID] - if !ok { - // The stream is already done. - return nil, false - } - return s, true -} - -// adjustWindow sends out extra window update over the initial window size -// of stream if the application is requesting data larger in size than -// the window. -func (t *http2Server) adjustWindow(s *Stream, n uint32) { - s.mu.Lock() - defer s.mu.Unlock() - if s.state == streamDone { - return - } - if w := s.fc.maybeAdjust(n); w > 0 { - t.controlBuf.put(&windowUpdate{s.id, w}) - } -} - -// updateWindow adjusts the inbound quota for the stream and the transport. -// Window updates will deliver to the controller for sending when -// the cumulative quota exceeds the corresponding threshold. -func (t *http2Server) updateWindow(s *Stream, n uint32) { - s.mu.Lock() - defer s.mu.Unlock() - if s.state == streamDone { - return - } - if w := t.fc.onRead(n); w > 0 { - t.controlBuf.put(&windowUpdate{0, w}) - } - if w := s.fc.onRead(n); w > 0 { - t.controlBuf.put(&windowUpdate{s.id, w}) - } -} - -func (t *http2Server) handleData(f *http2.DataFrame) { - size := f.Header().Length - if err := t.fc.onData(uint32(size)); err != nil { - grpclog.Printf("transport: http2Server %v", err) - t.Close() - return - } - // Select the right stream to dispatch. - s, ok := t.getStream(f) - if !ok { - if w := t.fc.onRead(uint32(size)); w > 0 { - t.controlBuf.put(&windowUpdate{0, w}) - } - return - } - if size > 0 { - s.mu.Lock() - if s.state == streamDone { - s.mu.Unlock() - // The stream has been closed. Release the corresponding quota. - if w := t.fc.onRead(uint32(size)); w > 0 { - t.controlBuf.put(&windowUpdate{0, w}) - } - return - } - if err := s.fc.onData(uint32(size)); err != nil { - s.mu.Unlock() - t.closeStream(s) - t.controlBuf.put(&resetStream{s.id, http2.ErrCodeFlowControl}) - return - } - if f.Header().Flags.Has(http2.FlagDataPadded) { - if w := t.fc.onRead(uint32(size) - uint32(len(f.Data()))); w > 0 { - t.controlBuf.put(&windowUpdate{0, w}) - } - if w := s.fc.onRead(uint32(size) - uint32(len(f.Data()))); w > 0 { - t.controlBuf.put(&windowUpdate{s.id, w}) - } - } - s.mu.Unlock() - // TODO(bradfitz, zhaoq): A copy is required here because there is no - // guarantee f.Data() is consumed before the arrival of next frame. - // Can this copy be eliminated? - if len(f.Data()) > 0 { - data := make([]byte, len(f.Data())) - copy(data, f.Data()) - s.write(recvMsg{data: data}) - } - } - if f.Header().Flags.Has(http2.FlagDataEndStream) { - // Received the end of stream from the client. - s.mu.Lock() - if s.state != streamDone { - s.state = streamReadDone - } - s.mu.Unlock() - s.write(recvMsg{err: io.EOF}) - } -} - -func (t *http2Server) handleRSTStream(f *http2.RSTStreamFrame) { - s, ok := t.getStream(f) - if !ok { - return - } - t.closeStream(s) -} - -func (t *http2Server) handleSettings(f *http2.SettingsFrame) { - if f.IsAck() { - return - } - var ss []http2.Setting - f.ForeachSetting(func(s http2.Setting) error { - ss = append(ss, s) - return nil - }) - // The settings will be applied once the ack is sent. - t.controlBuf.put(&settings{ack: true, ss: ss}) -} - -const ( - maxPingStrikes = 2 - defaultPingTimeout = 2 * time.Hour -) - -func (t *http2Server) handlePing(f *http2.PingFrame) { - if f.IsAck() { // Do nothing. - return - } - pingAck := &ping{ack: true} - copy(pingAck.data[:], f.Data[:]) - t.controlBuf.put(pingAck) - - now := time.Now() - defer func() { - t.lastPingAt = now - }() - // A reset ping strikes means that we don't need to check for policy - // violation for this ping and the pingStrikes counter should be set - // to 0. - if atomic.CompareAndSwapUint32(&t.resetPingStrikes, 1, 0) { - t.pingStrikes = 0 - return - } - t.mu.Lock() - ns := len(t.activeStreams) - t.mu.Unlock() - if ns < 1 && !t.kep.PermitWithoutStream { - // Keepalive shouldn't be active thus, this new ping should - // have come after atleast defaultPingTimeout. - if t.lastPingAt.Add(defaultPingTimeout).After(now) { - t.pingStrikes++ - } - } else { - // Check if keepalive policy is respected. - if t.lastPingAt.Add(t.kep.MinTime).After(now) { - t.pingStrikes++ - } - } - - if t.pingStrikes > maxPingStrikes { - // Send goaway and close the connection. - t.controlBuf.put(&goAway{code: http2.ErrCodeEnhanceYourCalm, debugData: []byte("too_many_pings")}) - } -} - -func (t *http2Server) handleWindowUpdate(f *http2.WindowUpdateFrame) { - id := f.Header().StreamID - incr := f.Increment - if id == 0 { - t.sendQuotaPool.add(int(incr)) - return - } - if s, ok := t.getStream(f); ok { - s.sendQuotaPool.add(int(incr)) - } -} - -func (t *http2Server) writeHeaders(s *Stream, b *bytes.Buffer, endStream bool) error { - first := true - endHeaders := false - var err error - defer func() { - if err == nil { - // Reset ping strikes when seding headers since that might cause the - // peer to send ping. - atomic.StoreUint32(&t.resetPingStrikes, 1) - } - }() - // Sends the headers in a single batch. - for !endHeaders { - size := t.hBuf.Len() - if size > http2MaxFrameLen { - size = http2MaxFrameLen - } else { - endHeaders = true - } - if first { - p := http2.HeadersFrameParam{ - StreamID: s.id, - BlockFragment: b.Next(size), - EndStream: endStream, - EndHeaders: endHeaders, - } - err = t.framer.writeHeaders(endHeaders, p) - first = false - } else { - err = t.framer.writeContinuation(endHeaders, s.id, endHeaders, b.Next(size)) - } - if err != nil { - t.Close() - return connectionErrorf(true, err, "transport: %v", err) - } - } - return nil -} - -// WriteHeader sends the header metedata md back to the client. -func (t *http2Server) WriteHeader(s *Stream, md metadata.MD) error { - s.mu.Lock() - if s.headerOk || s.state == streamDone { - s.mu.Unlock() - return ErrIllegalHeaderWrite - } - s.headerOk = true - if md.Len() > 0 { - if s.header.Len() > 0 { - s.header = metadata.Join(s.header, md) - } else { - s.header = md - } - } - md = s.header - s.mu.Unlock() - if _, err := wait(s.ctx, nil, nil, t.shutdownChan, t.writableChan); err != nil { - return err - } - t.hBuf.Reset() - t.hEnc.WriteField(hpack.HeaderField{Name: ":status", Value: "200"}) - t.hEnc.WriteField(hpack.HeaderField{Name: "content-type", Value: "application/grpc"}) - if s.sendCompress != "" { - t.hEnc.WriteField(hpack.HeaderField{Name: "grpc-encoding", Value: s.sendCompress}) - } - for k, vv := range md { - if isReservedHeader(k) { - // Clients don't tolerate reading restricted headers after some non restricted ones were sent. - continue - } - for _, v := range vv { - t.hEnc.WriteField(hpack.HeaderField{Name: k, Value: encodeMetadataHeader(k, v)}) - } - } - bufLen := t.hBuf.Len() - if err := t.writeHeaders(s, t.hBuf, false); err != nil { - return err - } - if t.stats != nil { - outHeader := &stats.OutHeader{ - WireLength: bufLen, - } - t.stats.HandleRPC(s.Context(), outHeader) - } - t.writableChan <- 0 - return nil -} - -// WriteStatus sends stream status to the client and terminates the stream. -// There is no further I/O operations being able to perform on this stream. -// TODO(zhaoq): Now it indicates the end of entire stream. Revisit if early -// OK is adopted. -func (t *http2Server) WriteStatus(s *Stream, st *status.Status) error { - var headersSent, hasHeader bool - s.mu.Lock() - if s.state == streamDone { - s.mu.Unlock() - return nil - } - if s.headerOk { - headersSent = true - } - if s.header.Len() > 0 { - hasHeader = true - } - s.mu.Unlock() - - if !headersSent && hasHeader { - t.WriteHeader(s, nil) - headersSent = true - } - - if _, err := wait(s.ctx, nil, nil, t.shutdownChan, t.writableChan); err != nil { - return err - } - t.hBuf.Reset() - if !headersSent { - t.hEnc.WriteField(hpack.HeaderField{Name: ":status", Value: "200"}) - t.hEnc.WriteField(hpack.HeaderField{Name: "content-type", Value: "application/grpc"}) - } - t.hEnc.WriteField( - hpack.HeaderField{ - Name: "grpc-status", - Value: strconv.Itoa(int(st.Code())), - }) - t.hEnc.WriteField(hpack.HeaderField{Name: "grpc-message", Value: encodeGrpcMessage(st.Message())}) - - if p := st.Proto(); p != nil && len(p.Details) > 0 { - stBytes, err := proto.Marshal(p) - if err != nil { - // TODO: return error instead, when callers are able to handle it. - panic(err) - } - - t.hEnc.WriteField(hpack.HeaderField{Name: "grpc-status-details-bin", Value: encodeBinHeader(stBytes)}) - } - - // Attach the trailer metadata. - for k, vv := range s.trailer { - // Clients don't tolerate reading restricted headers after some non restricted ones were sent. - if isReservedHeader(k) { - continue - } - for _, v := range vv { - t.hEnc.WriteField(hpack.HeaderField{Name: k, Value: encodeMetadataHeader(k, v)}) - } - } - bufLen := t.hBuf.Len() - if err := t.writeHeaders(s, t.hBuf, true); err != nil { - t.Close() - return err - } - if t.stats != nil { - outTrailer := &stats.OutTrailer{ - WireLength: bufLen, - } - t.stats.HandleRPC(s.Context(), outTrailer) - } - t.closeStream(s) - t.writableChan <- 0 - return nil -} - -// Write converts the data into HTTP2 data frame and sends it out. Non-nil error -// is returns if it fails (e.g., framing error, transport error). -func (t *http2Server) Write(s *Stream, data []byte, opts *Options) (err error) { - // TODO(zhaoq): Support multi-writers for a single stream. - var writeHeaderFrame bool - s.mu.Lock() - if s.state == streamDone { - s.mu.Unlock() - return streamErrorf(codes.Unknown, "the stream has been done") - } - if !s.headerOk { - writeHeaderFrame = true - } - s.mu.Unlock() - if writeHeaderFrame { - t.WriteHeader(s, nil) - } - defer func() { - if err == nil { - // Reset ping strikes when sending data since this might cause - // the peer to send ping. - atomic.StoreUint32(&t.resetPingStrikes, 1) - } - }() - r := bytes.NewBuffer(data) - for { - if r.Len() == 0 { - return nil - } - size := http2MaxFrameLen - // Wait until the stream has some quota to send the data. - sq, err := wait(s.ctx, nil, nil, t.shutdownChan, s.sendQuotaPool.acquire()) - if err != nil { - return err - } - // Wait until the transport has some quota to send the data. - tq, err := wait(s.ctx, nil, nil, t.shutdownChan, t.sendQuotaPool.acquire()) - if err != nil { - return err - } - if sq < size { - size = sq - } - if tq < size { - size = tq - } - p := r.Next(size) - ps := len(p) - if ps < sq { - // Overbooked stream quota. Return it back. - s.sendQuotaPool.add(sq - ps) - } - if ps < tq { - // Overbooked transport quota. Return it back. - t.sendQuotaPool.add(tq - ps) - } - t.framer.adjustNumWriters(1) - // Got some quota. Try to acquire writing privilege on the - // transport. - if _, err := wait(s.ctx, nil, nil, t.shutdownChan, t.writableChan); err != nil { - if _, ok := err.(StreamError); ok { - // Return the connection quota back. - t.sendQuotaPool.add(ps) - } - if t.framer.adjustNumWriters(-1) == 0 { - // This writer is the last one in this batch and has the - // responsibility to flush the buffered frames. It queues - // a flush request to controlBuf instead of flushing directly - // in order to avoid the race with other writing or flushing. - t.controlBuf.put(&flushIO{}) - } - return err - } - select { - case <-s.ctx.Done(): - t.sendQuotaPool.add(ps) - if t.framer.adjustNumWriters(-1) == 0 { - t.controlBuf.put(&flushIO{}) - } - t.writableChan <- 0 - return ContextErr(s.ctx.Err()) - default: - } - var forceFlush bool - if r.Len() == 0 && t.framer.adjustNumWriters(0) == 1 && !opts.Last { - forceFlush = true - } - if err := t.framer.writeData(forceFlush, s.id, false, p); err != nil { - t.Close() - return connectionErrorf(true, err, "transport: %v", err) - } - if t.framer.adjustNumWriters(-1) == 0 { - t.framer.flushWrite() - } - t.writableChan <- 0 - } - -} - -func (t *http2Server) applySettings(ss []http2.Setting) { - for _, s := range ss { - if s.ID == http2.SettingInitialWindowSize { - t.mu.Lock() - defer t.mu.Unlock() - for _, stream := range t.activeStreams { - stream.sendQuotaPool.add(int(s.Val - t.streamSendQuota)) - } - t.streamSendQuota = s.Val - } - - } -} - -// keepalive running in a separate goroutine does the following: -// 1. Gracefully closes an idle connection after a duration of keepalive.MaxConnectionIdle. -// 2. Gracefully closes any connection after a duration of keepalive.MaxConnectionAge. -// 3. Forcibly closes a connection after an additive period of keepalive.MaxConnectionAgeGrace over keepalive.MaxConnectionAge. -// 4. Makes sure a connection is alive by sending pings with a frequency of keepalive.Time and closes a non-resposive connection -// after an additional duration of keepalive.Timeout. -func (t *http2Server) keepalive() { - p := &ping{} - var pingSent bool - maxIdle := time.NewTimer(t.kp.MaxConnectionIdle) - maxAge := time.NewTimer(t.kp.MaxConnectionAge) - keepalive := time.NewTimer(t.kp.Time) - // NOTE: All exit paths of this function should reset their - // respecitve timers. A failure to do so will cause the - // following clean-up to deadlock and eventually leak. - defer func() { - if !maxIdle.Stop() { - <-maxIdle.C - } - if !maxAge.Stop() { - <-maxAge.C - } - if !keepalive.Stop() { - <-keepalive.C - } - }() - for { - select { - case <-maxIdle.C: - t.mu.Lock() - idle := t.idle - if idle.IsZero() { // The connection is non-idle. - t.mu.Unlock() - maxIdle.Reset(t.kp.MaxConnectionIdle) - continue - } - val := t.kp.MaxConnectionIdle - time.Since(idle) - if val <= 0 { - // The connection has been idle for a duration of keepalive.MaxConnectionIdle or more. - // Gracefully close the connection. - t.state = draining - t.mu.Unlock() - t.Drain() - // Reseting the timer so that the clean-up doesn't deadlock. - maxIdle.Reset(infinity) - return - } - t.mu.Unlock() - maxIdle.Reset(val) - case <-maxAge.C: - t.mu.Lock() - t.state = draining - t.mu.Unlock() - t.Drain() - maxAge.Reset(t.kp.MaxConnectionAgeGrace) - select { - case <-maxAge.C: - // Close the connection after grace period. - t.Close() - // Reseting the timer so that the clean-up doesn't deadlock. - maxAge.Reset(infinity) - case <-t.shutdownChan: - } - return - case <-keepalive.C: - if atomic.CompareAndSwapUint32(&t.activity, 1, 0) { - pingSent = false - keepalive.Reset(t.kp.Time) - continue - } - if pingSent { - t.Close() - // Reseting the timer so that the clean-up doesn't deadlock. - keepalive.Reset(infinity) - return - } - pingSent = true - t.controlBuf.put(p) - keepalive.Reset(t.kp.Timeout) - case <-t.shutdownChan: - return - } - } -} - -// controller running in a separate goroutine takes charge of sending control -// frames (e.g., window update, reset stream, setting, etc.) to the server. -func (t *http2Server) controller() { - for { - select { - case i := <-t.controlBuf.get(): - t.controlBuf.load() - select { - case <-t.writableChan: - switch i := i.(type) { - case *windowUpdate: - t.framer.writeWindowUpdate(true, i.streamID, i.increment) - case *settings: - if i.ack { - t.framer.writeSettingsAck(true) - t.applySettings(i.ss) - } else { - t.framer.writeSettings(true, i.ss...) - } - case *resetStream: - t.framer.writeRSTStream(true, i.streamID, i.code) - case *goAway: - t.mu.Lock() - if t.state == closing { - t.mu.Unlock() - // The transport is closing. - return - } - sid := t.maxStreamID - t.state = draining - t.mu.Unlock() - t.framer.writeGoAway(true, sid, i.code, i.debugData) - if i.code == http2.ErrCodeEnhanceYourCalm { - t.Close() - } - case *flushIO: - t.framer.flushWrite() - case *ping: - t.framer.writePing(true, i.ack, i.data) - default: - grpclog.Printf("transport: http2Server.controller got unexpected item type %v\n", i) - } - t.writableChan <- 0 - continue - case <-t.shutdownChan: - return - } - case <-t.shutdownChan: - return - } - } -} - -// Close starts shutting down the http2Server transport. -// TODO(zhaoq): Now the destruction is not blocked on any pending streams. This -// could cause some resource issue. Revisit this later. -func (t *http2Server) Close() (err error) { - t.mu.Lock() - if t.state == closing { - t.mu.Unlock() - return errors.New("transport: Close() was already called") - } - t.state = closing - streams := t.activeStreams - t.activeStreams = nil - t.mu.Unlock() - close(t.shutdownChan) - err = t.conn.Close() - // Cancel all active streams. - for _, s := range streams { - s.cancel() - } - if t.stats != nil { - connEnd := &stats.ConnEnd{} - t.stats.HandleConn(t.ctx, connEnd) - } - return -} - -// closeStream clears the footprint of a stream when the stream is not needed -// any more. -func (t *http2Server) closeStream(s *Stream) { - t.mu.Lock() - delete(t.activeStreams, s.id) - if len(t.activeStreams) == 0 { - t.idle = time.Now() - } - if t.state == draining && len(t.activeStreams) == 0 { - defer t.Close() - } - t.mu.Unlock() - // In case stream sending and receiving are invoked in separate - // goroutines (e.g., bi-directional streaming), cancel needs to be - // called to interrupt the potential blocking on other goroutines. - s.cancel() - s.mu.Lock() - if q := s.fc.resetPendingData(); q > 0 { - if w := t.fc.onRead(q); w > 0 { - t.controlBuf.put(&windowUpdate{0, w}) - } - } - if s.state == streamDone { - s.mu.Unlock() - return - } - s.state = streamDone - s.mu.Unlock() -} - -func (t *http2Server) RemoteAddr() net.Addr { - return t.remoteAddr -} - -func (t *http2Server) Drain() { - t.controlBuf.put(&goAway{code: http2.ErrCodeNo}) -} - -var rgen = rand.New(rand.NewSource(time.Now().UnixNano())) - -func getJitter(v time.Duration) time.Duration { - if v == infinity { - return 0 - } - // Generate a jitter between +/- 10% of the value. - r := int64(v / 10) - j := rgen.Int63n(2*r) - r - return time.Duration(j) -} diff --git a/vendor/google.golang.org/grpc/transport/http_util.go b/vendor/google.golang.org/grpc/transport/http_util.go deleted file mode 100644 index 9b31717c4..000000000 --- a/vendor/google.golang.org/grpc/transport/http_util.go +++ /dev/null @@ -1,613 +0,0 @@ -/* - * - * Copyright 2014, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT - * OWNER 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. - * - */ - -package transport - -import ( - "bufio" - "bytes" - "encoding/base64" - "fmt" - "io" - "net" - "net/http" - "strconv" - "strings" - "sync/atomic" - "time" - - "github.com/golang/protobuf/proto" - "golang.org/x/net/http2" - "golang.org/x/net/http2/hpack" - spb "google.golang.org/genproto/googleapis/rpc/status" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/status" -) - -const ( - // http2MaxFrameLen specifies the max length of a HTTP2 frame. - http2MaxFrameLen = 16384 // 16KB frame - // http://http2.github.io/http2-spec/#SettingValues - http2InitHeaderTableSize = 4096 - // http2IOBufSize specifies the buffer size for sending frames. - http2IOBufSize = 32 * 1024 -) - -var ( - clientPreface = []byte(http2.ClientPreface) - http2ErrConvTab = map[http2.ErrCode]codes.Code{ - http2.ErrCodeNo: codes.Internal, - http2.ErrCodeProtocol: codes.Internal, - http2.ErrCodeInternal: codes.Internal, - http2.ErrCodeFlowControl: codes.ResourceExhausted, - http2.ErrCodeSettingsTimeout: codes.Internal, - http2.ErrCodeStreamClosed: codes.Internal, - http2.ErrCodeFrameSize: codes.Internal, - http2.ErrCodeRefusedStream: codes.Unavailable, - http2.ErrCodeCancel: codes.Canceled, - http2.ErrCodeCompression: codes.Internal, - http2.ErrCodeConnect: codes.Internal, - http2.ErrCodeEnhanceYourCalm: codes.ResourceExhausted, - http2.ErrCodeInadequateSecurity: codes.PermissionDenied, - http2.ErrCodeHTTP11Required: codes.FailedPrecondition, - } - statusCodeConvTab = map[codes.Code]http2.ErrCode{ - codes.Internal: http2.ErrCodeInternal, - codes.Canceled: http2.ErrCodeCancel, - codes.Unavailable: http2.ErrCodeRefusedStream, - codes.ResourceExhausted: http2.ErrCodeEnhanceYourCalm, - codes.PermissionDenied: http2.ErrCodeInadequateSecurity, - } - httpStatusConvTab = map[int]codes.Code{ - // 400 Bad Request - INTERNAL. - http.StatusBadRequest: codes.Internal, - // 401 Unauthorized - UNAUTHENTICATED. - http.StatusUnauthorized: codes.Unauthenticated, - // 403 Forbidden - PERMISSION_DENIED. - http.StatusForbidden: codes.PermissionDenied, - // 404 Not Found - UNIMPLEMENTED. - http.StatusNotFound: codes.Unimplemented, - // 429 Too Many Requests - UNAVAILABLE. - http.StatusTooManyRequests: codes.Unavailable, - // 502 Bad Gateway - UNAVAILABLE. - http.StatusBadGateway: codes.Unavailable, - // 503 Service Unavailable - UNAVAILABLE. - http.StatusServiceUnavailable: codes.Unavailable, - // 504 Gateway timeout - UNAVAILABLE. - http.StatusGatewayTimeout: codes.Unavailable, - } -) - -// Records the states during HPACK decoding. Must be reset once the -// decoding of the entire headers are finished. -type decodeState struct { - encoding string - // statusGen caches the stream status received from the trailer the server - // sent. Client side only. Do not access directly. After all trailers are - // parsed, use the status method to retrieve the status. - statusGen *status.Status - // rawStatusCode and rawStatusMsg are set from the raw trailer fields and are not - // intended for direct access outside of parsing. - rawStatusCode *int - rawStatusMsg string - httpStatus *int - // Server side only fields. - timeoutSet bool - timeout time.Duration - method string - // key-value metadata map from the peer. - mdata map[string][]string -} - -// isReservedHeader checks whether hdr belongs to HTTP2 headers -// reserved by gRPC protocol. Any other headers are classified as the -// user-specified metadata. -func isReservedHeader(hdr string) bool { - if hdr != "" && hdr[0] == ':' { - return true - } - switch hdr { - case "content-type", - "grpc-message-type", - "grpc-encoding", - "grpc-message", - "grpc-status", - "grpc-timeout", - "grpc-status-details-bin", - "te": - return true - default: - return false - } -} - -// isWhitelistedPseudoHeader checks whether hdr belongs to HTTP2 pseudoheaders -// that should be propagated into metadata visible to users. -func isWhitelistedPseudoHeader(hdr string) bool { - switch hdr { - case ":authority": - return true - default: - return false - } -} - -func validContentType(t string) bool { - e := "application/grpc" - if !strings.HasPrefix(t, e) { - return false - } - // Support variations on the content-type - // (e.g. "application/grpc+blah", "application/grpc;blah"). - if len(t) > len(e) && t[len(e)] != '+' && t[len(e)] != ';' { - return false - } - return true -} - -func (d *decodeState) status() *status.Status { - if d.statusGen == nil { - // No status-details were provided; generate status using code/msg. - d.statusGen = status.New(codes.Code(int32(*(d.rawStatusCode))), d.rawStatusMsg) - } - return d.statusGen -} - -const binHdrSuffix = "-bin" - -func encodeBinHeader(v []byte) string { - return base64.RawStdEncoding.EncodeToString(v) -} - -func decodeBinHeader(v string) ([]byte, error) { - if len(v)%4 == 0 { - // Input was padded, or padding was not necessary. - return base64.StdEncoding.DecodeString(v) - } - return base64.RawStdEncoding.DecodeString(v) -} - -func encodeMetadataHeader(k, v string) string { - if strings.HasSuffix(k, binHdrSuffix) { - return encodeBinHeader(([]byte)(v)) - } - return v -} - -func decodeMetadataHeader(k, v string) (string, error) { - if strings.HasSuffix(k, binHdrSuffix) { - b, err := decodeBinHeader(v) - return string(b), err - } - return v, nil -} - -func (d *decodeState) decodeResponseHeader(frame *http2.MetaHeadersFrame) error { - for _, hf := range frame.Fields { - if err := d.processHeaderField(hf); err != nil { - return err - } - } - - // If grpc status exists, no need to check further. - if d.rawStatusCode != nil || d.statusGen != nil { - return nil - } - - // If grpc status doesn't exist and http status doesn't exist, - // then it's a malformed header. - if d.httpStatus == nil { - return streamErrorf(codes.Internal, "malformed header: doesn't contain status(gRPC or HTTP)") - } - - if *(d.httpStatus) != http.StatusOK { - code, ok := httpStatusConvTab[*(d.httpStatus)] - if !ok { - code = codes.Unknown - } - return streamErrorf(code, http.StatusText(*(d.httpStatus))) - } - - // gRPC status doesn't exist and http status is OK. - // Set rawStatusCode to be unknown and return nil error. - // So that, if the stream has ended this Unknown status - // will be propogated to the user. - // Otherwise, it will be ignored. In which case, status from - // a later trailer, that has StreamEnded flag set, is propogated. - code := int(codes.Unknown) - d.rawStatusCode = &code - return nil - -} - -func (d *decodeState) processHeaderField(f hpack.HeaderField) error { - switch f.Name { - case "content-type": - if !validContentType(f.Value) { - return streamErrorf(codes.FailedPrecondition, "transport: received the unexpected content-type %q", f.Value) - } - case "grpc-encoding": - d.encoding = f.Value - case "grpc-status": - code, err := strconv.Atoi(f.Value) - if err != nil { - return streamErrorf(codes.Internal, "transport: malformed grpc-status: %v", err) - } - d.rawStatusCode = &code - case "grpc-message": - d.rawStatusMsg = decodeGrpcMessage(f.Value) - case "grpc-status-details-bin": - v, err := decodeBinHeader(f.Value) - if err != nil { - return streamErrorf(codes.Internal, "transport: malformed grpc-status-details-bin: %v", err) - } - s := &spb.Status{} - if err := proto.Unmarshal(v, s); err != nil { - return streamErrorf(codes.Internal, "transport: malformed grpc-status-details-bin: %v", err) - } - d.statusGen = status.FromProto(s) - case "grpc-timeout": - d.timeoutSet = true - var err error - if d.timeout, err = decodeTimeout(f.Value); err != nil { - return streamErrorf(codes.Internal, "transport: malformed time-out: %v", err) - } - case ":path": - d.method = f.Value - case ":status": - code, err := strconv.Atoi(f.Value) - if err != nil { - return streamErrorf(codes.Internal, "transport: malformed http-status: %v", err) - } - d.httpStatus = &code - default: - if !isReservedHeader(f.Name) || isWhitelistedPseudoHeader(f.Name) { - if d.mdata == nil { - d.mdata = make(map[string][]string) - } - v, err := decodeMetadataHeader(f.Name, f.Value) - if err != nil { - grpclog.Printf("Failed to decode (%q, %q): %v", f.Name, f.Value, err) - return nil - } - d.mdata[f.Name] = append(d.mdata[f.Name], v) - } - } - return nil -} - -type timeoutUnit uint8 - -const ( - hour timeoutUnit = 'H' - minute timeoutUnit = 'M' - second timeoutUnit = 'S' - millisecond timeoutUnit = 'm' - microsecond timeoutUnit = 'u' - nanosecond timeoutUnit = 'n' -) - -func timeoutUnitToDuration(u timeoutUnit) (d time.Duration, ok bool) { - switch u { - case hour: - return time.Hour, true - case minute: - return time.Minute, true - case second: - return time.Second, true - case millisecond: - return time.Millisecond, true - case microsecond: - return time.Microsecond, true - case nanosecond: - return time.Nanosecond, true - default: - } - return -} - -const maxTimeoutValue int64 = 100000000 - 1 - -// div does integer division and round-up the result. Note that this is -// equivalent to (d+r-1)/r but has less chance to overflow. -func div(d, r time.Duration) int64 { - if m := d % r; m > 0 { - return int64(d/r + 1) - } - return int64(d / r) -} - -// TODO(zhaoq): It is the simplistic and not bandwidth efficient. Improve it. -func encodeTimeout(t time.Duration) string { - if t <= 0 { - return "0n" - } - if d := div(t, time.Nanosecond); d <= maxTimeoutValue { - return strconv.FormatInt(d, 10) + "n" - } - if d := div(t, time.Microsecond); d <= maxTimeoutValue { - return strconv.FormatInt(d, 10) + "u" - } - if d := div(t, time.Millisecond); d <= maxTimeoutValue { - return strconv.FormatInt(d, 10) + "m" - } - if d := div(t, time.Second); d <= maxTimeoutValue { - return strconv.FormatInt(d, 10) + "S" - } - if d := div(t, time.Minute); d <= maxTimeoutValue { - return strconv.FormatInt(d, 10) + "M" - } - // Note that maxTimeoutValue * time.Hour > MaxInt64. - return strconv.FormatInt(div(t, time.Hour), 10) + "H" -} - -func decodeTimeout(s string) (time.Duration, error) { - size := len(s) - if size < 2 { - return 0, fmt.Errorf("transport: timeout string is too short: %q", s) - } - unit := timeoutUnit(s[size-1]) - d, ok := timeoutUnitToDuration(unit) - if !ok { - return 0, fmt.Errorf("transport: timeout unit is not recognized: %q", s) - } - t, err := strconv.ParseInt(s[:size-1], 10, 64) - if err != nil { - return 0, err - } - return d * time.Duration(t), nil -} - -const ( - spaceByte = ' ' - tildaByte = '~' - percentByte = '%' -) - -// encodeGrpcMessage is used to encode status code in header field -// "grpc-message". -// It checks to see if each individual byte in msg is an -// allowable byte, and then either percent encoding or passing it through. -// When percent encoding, the byte is converted into hexadecimal notation -// with a '%' prepended. -func encodeGrpcMessage(msg string) string { - if msg == "" { - return "" - } - lenMsg := len(msg) - for i := 0; i < lenMsg; i++ { - c := msg[i] - if !(c >= spaceByte && c < tildaByte && c != percentByte) { - return encodeGrpcMessageUnchecked(msg) - } - } - return msg -} - -func encodeGrpcMessageUnchecked(msg string) string { - var buf bytes.Buffer - lenMsg := len(msg) - for i := 0; i < lenMsg; i++ { - c := msg[i] - if c >= spaceByte && c < tildaByte && c != percentByte { - buf.WriteByte(c) - } else { - buf.WriteString(fmt.Sprintf("%%%02X", c)) - } - } - return buf.String() -} - -// decodeGrpcMessage decodes the msg encoded by encodeGrpcMessage. -func decodeGrpcMessage(msg string) string { - if msg == "" { - return "" - } - lenMsg := len(msg) - for i := 0; i < lenMsg; i++ { - if msg[i] == percentByte && i+2 < lenMsg { - return decodeGrpcMessageUnchecked(msg) - } - } - return msg -} - -func decodeGrpcMessageUnchecked(msg string) string { - var buf bytes.Buffer - lenMsg := len(msg) - for i := 0; i < lenMsg; i++ { - c := msg[i] - if c == percentByte && i+2 < lenMsg { - parsed, err := strconv.ParseUint(msg[i+1:i+3], 16, 8) - if err != nil { - buf.WriteByte(c) - } else { - buf.WriteByte(byte(parsed)) - i += 2 - } - } else { - buf.WriteByte(c) - } - } - return buf.String() -} - -type framer struct { - numWriters int32 - reader io.Reader - writer *bufio.Writer - fr *http2.Framer -} - -func newFramer(conn net.Conn) *framer { - f := &framer{ - reader: bufio.NewReaderSize(conn, http2IOBufSize), - writer: bufio.NewWriterSize(conn, http2IOBufSize), - } - f.fr = http2.NewFramer(f.writer, f.reader) - // Opt-in to Frame reuse API on framer to reduce garbage. - // Frames aren't safe to read from after a subsequent call to ReadFrame. - f.fr.SetReuseFrames() - f.fr.ReadMetaHeaders = hpack.NewDecoder(http2InitHeaderTableSize, nil) - return f -} - -func (f *framer) adjustNumWriters(i int32) int32 { - return atomic.AddInt32(&f.numWriters, i) -} - -// The following writeXXX functions can only be called when the caller gets -// unblocked from writableChan channel (i.e., owns the privilege to write). - -func (f *framer) writeContinuation(forceFlush bool, streamID uint32, endHeaders bool, headerBlockFragment []byte) error { - if err := f.fr.WriteContinuation(streamID, endHeaders, headerBlockFragment); err != nil { - return err - } - if forceFlush { - return f.writer.Flush() - } - return nil -} - -func (f *framer) writeData(forceFlush bool, streamID uint32, endStream bool, data []byte) error { - if err := f.fr.WriteData(streamID, endStream, data); err != nil { - return err - } - if forceFlush { - return f.writer.Flush() - } - return nil -} - -func (f *framer) writeGoAway(forceFlush bool, maxStreamID uint32, code http2.ErrCode, debugData []byte) error { - if err := f.fr.WriteGoAway(maxStreamID, code, debugData); err != nil { - return err - } - if forceFlush { - return f.writer.Flush() - } - return nil -} - -func (f *framer) writeHeaders(forceFlush bool, p http2.HeadersFrameParam) error { - if err := f.fr.WriteHeaders(p); err != nil { - return err - } - if forceFlush { - return f.writer.Flush() - } - return nil -} - -func (f *framer) writePing(forceFlush, ack bool, data [8]byte) error { - if err := f.fr.WritePing(ack, data); err != nil { - return err - } - if forceFlush { - return f.writer.Flush() - } - return nil -} - -func (f *framer) writePriority(forceFlush bool, streamID uint32, p http2.PriorityParam) error { - if err := f.fr.WritePriority(streamID, p); err != nil { - return err - } - if forceFlush { - return f.writer.Flush() - } - return nil -} - -func (f *framer) writePushPromise(forceFlush bool, p http2.PushPromiseParam) error { - if err := f.fr.WritePushPromise(p); err != nil { - return err - } - if forceFlush { - return f.writer.Flush() - } - return nil -} - -func (f *framer) writeRSTStream(forceFlush bool, streamID uint32, code http2.ErrCode) error { - if err := f.fr.WriteRSTStream(streamID, code); err != nil { - return err - } - if forceFlush { - return f.writer.Flush() - } - return nil -} - -func (f *framer) writeSettings(forceFlush bool, settings ...http2.Setting) error { - if err := f.fr.WriteSettings(settings...); err != nil { - return err - } - if forceFlush { - return f.writer.Flush() - } - return nil -} - -func (f *framer) writeSettingsAck(forceFlush bool) error { - if err := f.fr.WriteSettingsAck(); err != nil { - return err - } - if forceFlush { - return f.writer.Flush() - } - return nil -} - -func (f *framer) writeWindowUpdate(forceFlush bool, streamID, incr uint32) error { - if err := f.fr.WriteWindowUpdate(streamID, incr); err != nil { - return err - } - if forceFlush { - return f.writer.Flush() - } - return nil -} - -func (f *framer) flushWrite() error { - return f.writer.Flush() -} - -func (f *framer) readFrame() (http2.Frame, error) { - return f.fr.ReadFrame() -} - -func (f *framer) errorDetail() error { - return f.fr.ErrorDetail() -} diff --git a/vendor/google.golang.org/grpc/transport/transport.go b/vendor/google.golang.org/grpc/transport/transport.go deleted file mode 100644 index 82efa4a13..000000000 --- a/vendor/google.golang.org/grpc/transport/transport.go +++ /dev/null @@ -1,682 +0,0 @@ -/* - * - * Copyright 2014, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT - * OWNER 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. - * - */ - -/* -Package transport defines and implements message oriented communication channel -to complete various transactions (e.g., an RPC). -*/ -package transport // import "google.golang.org/grpc/transport" - -import ( - "bytes" - "fmt" - "io" - "net" - "sync" - - "golang.org/x/net/context" - "golang.org/x/net/http2" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/credentials" - "google.golang.org/grpc/keepalive" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/stats" - "google.golang.org/grpc/status" - "google.golang.org/grpc/tap" -) - -// recvMsg represents the received msg from the transport. All transport -// protocol specific info has been removed. -type recvMsg struct { - data []byte - // nil: received some data - // io.EOF: stream is completed. data is nil. - // other non-nil error: transport failure. data is nil. - err error -} - -func (*recvMsg) item() {} - -// All items in an out of a recvBuffer should be the same type. -type item interface { - item() -} - -// recvBuffer is an unbounded channel of item. -type recvBuffer struct { - c chan item - mu sync.Mutex - backlog []item -} - -func newRecvBuffer() *recvBuffer { - b := &recvBuffer{ - c: make(chan item, 1), - } - return b -} - -func (b *recvBuffer) put(r item) { - b.mu.Lock() - defer b.mu.Unlock() - if len(b.backlog) == 0 { - select { - case b.c <- r: - return - default: - } - } - b.backlog = append(b.backlog, r) -} - -func (b *recvBuffer) load() { - b.mu.Lock() - defer b.mu.Unlock() - if len(b.backlog) > 0 { - select { - case b.c <- b.backlog[0]: - b.backlog[0] = nil - b.backlog = b.backlog[1:] - default: - } - } -} - -// get returns the channel that receives an item in the buffer. -// -// Upon receipt of an item, the caller should call load to send another -// item onto the channel if there is any. -func (b *recvBuffer) get() <-chan item { - return b.c -} - -// recvBufferReader implements io.Reader interface to read the data from -// recvBuffer. -type recvBufferReader struct { - ctx context.Context - goAway chan struct{} - recv *recvBuffer - last *bytes.Reader // Stores the remaining data in the previous calls. - err error -} - -// Read reads the next len(p) bytes from last. If last is drained, it tries to -// read additional data from recv. It blocks if there no additional data available -// in recv. If Read returns any non-nil error, it will continue to return that error. -func (r *recvBufferReader) Read(p []byte) (n int, err error) { - if r.err != nil { - return 0, r.err - } - defer func() { r.err = err }() - if r.last != nil && r.last.Len() > 0 { - // Read remaining data left in last call. - return r.last.Read(p) - } - select { - case <-r.ctx.Done(): - return 0, ContextErr(r.ctx.Err()) - case <-r.goAway: - return 0, ErrStreamDrain - case i := <-r.recv.get(): - r.recv.load() - m := i.(*recvMsg) - if m.err != nil { - return 0, m.err - } - r.last = bytes.NewReader(m.data) - return r.last.Read(p) - } -} - -type streamState uint8 - -const ( - streamActive streamState = iota - streamWriteDone // EndStream sent - streamReadDone // EndStream received - streamDone // the entire stream is finished. -) - -// Stream represents an RPC in the transport layer. -type Stream struct { - id uint32 - // nil for client side Stream. - st ServerTransport - // ctx is the associated context of the stream. - ctx context.Context - // cancel is always nil for client side Stream. - cancel context.CancelFunc - // done is closed when the final status arrives. - done chan struct{} - // goAway is closed when the server sent GoAways signal before this stream was initiated. - goAway chan struct{} - // method records the associated RPC method of the stream. - method string - recvCompress string - sendCompress string - buf *recvBuffer - trReader io.Reader - fc *inFlow - recvQuota uint32 - - // TODO: Remote this unused variable. - // The accumulated inbound quota pending for window update. - updateQuota uint32 - - // Callback to state application's intentions to read data. This - // is used to adjust flow control, if need be. - requestRead func(int) - - sendQuotaPool *quotaPool - // Close headerChan to indicate the end of reception of header metadata. - headerChan chan struct{} - // header caches the received header metadata. - header metadata.MD - // The key-value map of trailer metadata. - trailer metadata.MD - - mu sync.RWMutex // guard the following - // headerOK becomes true from the first header is about to send. - headerOk bool - state streamState - // true iff headerChan is closed. Used to avoid closing headerChan - // multiple times. - headerDone bool - // the status error received from the server. - status *status.Status - // rstStream indicates whether a RST_STREAM frame needs to be sent - // to the server to signify that this stream is closing. - rstStream bool - // rstError is the error that needs to be sent along with the RST_STREAM frame. - rstError http2.ErrCode - // bytesSent and bytesReceived indicates whether any bytes have been sent or - // received on this stream. - bytesSent bool - bytesReceived bool -} - -// RecvCompress returns the compression algorithm applied to the inbound -// message. It is empty string if there is no compression applied. -func (s *Stream) RecvCompress() string { - return s.recvCompress -} - -// SetSendCompress sets the compression algorithm to the stream. -func (s *Stream) SetSendCompress(str string) { - s.sendCompress = str -} - -// Done returns a chanel which is closed when it receives the final status -// from the server. -func (s *Stream) Done() <-chan struct{} { - return s.done -} - -// GoAway returns a channel which is closed when the server sent GoAways signal -// before this stream was initiated. -func (s *Stream) GoAway() <-chan struct{} { - return s.goAway -} - -// Header acquires the key-value pairs of header metadata once it -// is available. It blocks until i) the metadata is ready or ii) there is no -// header metadata or iii) the stream is canceled/expired. -func (s *Stream) Header() (metadata.MD, error) { - select { - case <-s.ctx.Done(): - return nil, ContextErr(s.ctx.Err()) - case <-s.goAway: - return nil, ErrStreamDrain - case <-s.headerChan: - return s.header.Copy(), nil - } -} - -// Trailer returns the cached trailer metedata. Note that if it is not called -// after the entire stream is done, it could return an empty MD. Client -// side only. -func (s *Stream) Trailer() metadata.MD { - s.mu.RLock() - defer s.mu.RUnlock() - return s.trailer.Copy() -} - -// ServerTransport returns the underlying ServerTransport for the stream. -// The client side stream always returns nil. -func (s *Stream) ServerTransport() ServerTransport { - return s.st -} - -// Context returns the context of the stream. -func (s *Stream) Context() context.Context { - return s.ctx -} - -// Method returns the method for the stream. -func (s *Stream) Method() string { - return s.method -} - -// Status returns the status received from the server. -func (s *Stream) Status() *status.Status { - return s.status -} - -// SetHeader sets the header metadata. This can be called multiple times. -// Server side only. -func (s *Stream) SetHeader(md metadata.MD) error { - s.mu.Lock() - defer s.mu.Unlock() - if s.headerOk || s.state == streamDone { - return ErrIllegalHeaderWrite - } - if md.Len() == 0 { - return nil - } - s.header = metadata.Join(s.header, md) - return nil -} - -// SetTrailer sets the trailer metadata which will be sent with the RPC status -// by the server. This can be called multiple times. Server side only. -func (s *Stream) SetTrailer(md metadata.MD) error { - if md.Len() == 0 { - return nil - } - s.mu.Lock() - defer s.mu.Unlock() - s.trailer = metadata.Join(s.trailer, md) - return nil -} - -func (s *Stream) write(m recvMsg) { - s.buf.put(&m) -} - -// Read reads all p bytes from the wire for this stream. -func (s *Stream) Read(p []byte) (n int, err error) { - // Don't request a read if there was an error earlier - if er := s.trReader.(*transportReader).er; er != nil { - return 0, er - } - s.requestRead(len(p)) - return io.ReadFull(s.trReader, p) -} - -// tranportReader reads all the data available for this Stream from the transport and -// passes them into the decoder, which converts them into a gRPC message stream. -// The error is io.EOF when the stream is done or another non-nil error if -// the stream broke. -type transportReader struct { - reader io.Reader - // The handler to control the window update procedure for both this - // particular stream and the associated transport. - windowHandler func(int) - er error -} - -func (t *transportReader) Read(p []byte) (n int, err error) { - n, err = t.reader.Read(p) - if err != nil { - t.er = err - return - } - t.windowHandler(n) - return -} - -// finish sets the stream's state and status, and closes the done channel. -// s.mu must be held by the caller. st must always be non-nil. -func (s *Stream) finish(st *status.Status) { - s.status = st - s.state = streamDone - close(s.done) -} - -// BytesSent indicates whether any bytes have been sent on this stream. -func (s *Stream) BytesSent() bool { - s.mu.Lock() - defer s.mu.Unlock() - return s.bytesSent -} - -// BytesReceived indicates whether any bytes have been received on this stream. -func (s *Stream) BytesReceived() bool { - s.mu.Lock() - defer s.mu.Unlock() - return s.bytesReceived -} - -// GoString is implemented by Stream so context.String() won't -// race when printing %#v. -func (s *Stream) GoString() string { - return fmt.Sprintf("", s, s.method) -} - -// The key to save transport.Stream in the context. -type streamKey struct{} - -// newContextWithStream creates a new context from ctx and attaches stream -// to it. -func newContextWithStream(ctx context.Context, stream *Stream) context.Context { - return context.WithValue(ctx, streamKey{}, stream) -} - -// StreamFromContext returns the stream saved in ctx. -func StreamFromContext(ctx context.Context) (s *Stream, ok bool) { - s, ok = ctx.Value(streamKey{}).(*Stream) - return -} - -// state of transport -type transportState int - -const ( - reachable transportState = iota - unreachable - closing - draining -) - -// ServerConfig consists of all the configurations to establish a server transport. -type ServerConfig struct { - MaxStreams uint32 - AuthInfo credentials.AuthInfo - InTapHandle tap.ServerInHandle - StatsHandler stats.Handler - KeepaliveParams keepalive.ServerParameters - KeepalivePolicy keepalive.EnforcementPolicy - InitialWindowSize int32 - InitialConnWindowSize int32 -} - -// NewServerTransport creates a ServerTransport with conn or non-nil error -// if it fails. -func NewServerTransport(protocol string, conn net.Conn, config *ServerConfig) (ServerTransport, error) { - return newHTTP2Server(conn, config) -} - -// ConnectOptions covers all relevant options for communicating with the server. -type ConnectOptions struct { - // UserAgent is the application user agent. - UserAgent string - // Authority is the :authority pseudo-header to use. This field has no effect if - // TransportCredentials is set. - Authority string - // Dialer specifies how to dial a network address. - Dialer func(context.Context, string) (net.Conn, error) - // FailOnNonTempDialError specifies if gRPC fails on non-temporary dial errors. - FailOnNonTempDialError bool - // PerRPCCredentials stores the PerRPCCredentials required to issue RPCs. - PerRPCCredentials []credentials.PerRPCCredentials - // TransportCredentials stores the Authenticator required to setup a client connection. - TransportCredentials credentials.TransportCredentials - // KeepaliveParams stores the keepalive parameters. - KeepaliveParams keepalive.ClientParameters - // StatsHandler stores the handler for stats. - StatsHandler stats.Handler - // InitialWindowSize sets the intial window size for a stream. - InitialWindowSize int32 - // InitialConnWindowSize sets the intial window size for a connection. - InitialConnWindowSize int32 -} - -// TargetInfo contains the information of the target such as network address and metadata. -type TargetInfo struct { - Addr string - Metadata interface{} -} - -// NewClientTransport establishes the transport with the required ConnectOptions -// and returns it to the caller. -func NewClientTransport(ctx context.Context, target TargetInfo, opts ConnectOptions) (ClientTransport, error) { - return newHTTP2Client(ctx, target, opts) -} - -// Options provides additional hints and information for message -// transmission. -type Options struct { - // Last indicates whether this write is the last piece for - // this stream. - Last bool - - // Delay is a hint to the transport implementation for whether - // the data could be buffered for a batching write. The - // Transport implementation may ignore the hint. - Delay bool -} - -// CallHdr carries the information of a particular RPC. -type CallHdr struct { - // Host specifies the peer's host. - Host string - - // Method specifies the operation to perform. - Method string - - // RecvCompress specifies the compression algorithm applied on - // inbound messages. - RecvCompress string - - // SendCompress specifies the compression algorithm applied on - // outbound message. - SendCompress string - - // Creds specifies credentials.PerRPCCredentials for a call. - Creds credentials.PerRPCCredentials - - // Flush indicates whether a new stream command should be sent - // to the peer without waiting for the first data. This is - // only a hint. The transport may modify the flush decision - // for performance purposes. - Flush bool -} - -// ClientTransport is the common interface for all gRPC client-side transport -// implementations. -type ClientTransport interface { - // Close tears down this transport. Once it returns, the transport - // should not be accessed any more. The caller must make sure this - // is called only once. - Close() error - - // GracefulClose starts to tear down the transport. It stops accepting - // new RPCs and wait the completion of the pending RPCs. - GracefulClose() error - - // Write sends the data for the given stream. A nil stream indicates - // the write is to be performed on the transport as a whole. - Write(s *Stream, data []byte, opts *Options) error - - // NewStream creates a Stream for an RPC. - NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, error) - - // CloseStream clears the footprint of a stream when the stream is - // not needed any more. The err indicates the error incurred when - // CloseStream is called. Must be called when a stream is finished - // unless the associated transport is closing. - CloseStream(stream *Stream, err error) - - // Error returns a channel that is closed when some I/O error - // happens. Typically the caller should have a goroutine to monitor - // this in order to take action (e.g., close the current transport - // and create a new one) in error case. It should not return nil - // once the transport is initiated. - Error() <-chan struct{} - - // GoAway returns a channel that is closed when ClientTranspor - // receives the draining signal from the server (e.g., GOAWAY frame in - // HTTP/2). - GoAway() <-chan struct{} - - // GetGoAwayReason returns the reason why GoAway frame was received. - GetGoAwayReason() GoAwayReason -} - -// ServerTransport is the common interface for all gRPC server-side transport -// implementations. -// -// Methods may be called concurrently from multiple goroutines, but -// Write methods for a given Stream will be called serially. -type ServerTransport interface { - // HandleStreams receives incoming streams using the given handler. - HandleStreams(func(*Stream), func(context.Context, string) context.Context) - - // WriteHeader sends the header metadata for the given stream. - // WriteHeader may not be called on all streams. - WriteHeader(s *Stream, md metadata.MD) error - - // Write sends the data for the given stream. - // Write may not be called on all streams. - Write(s *Stream, data []byte, opts *Options) error - - // WriteStatus sends the status of a stream to the client. WriteStatus is - // the final call made on a stream and always occurs. - WriteStatus(s *Stream, st *status.Status) error - - // Close tears down the transport. Once it is called, the transport - // should not be accessed any more. All the pending streams and their - // handlers will be terminated asynchronously. - Close() error - - // RemoteAddr returns the remote network address. - RemoteAddr() net.Addr - - // Drain notifies the client this ServerTransport stops accepting new RPCs. - Drain() -} - -// streamErrorf creates an StreamError with the specified error code and description. -func streamErrorf(c codes.Code, format string, a ...interface{}) StreamError { - return StreamError{ - Code: c, - Desc: fmt.Sprintf(format, a...), - } -} - -// connectionErrorf creates an ConnectionError with the specified error description. -func connectionErrorf(temp bool, e error, format string, a ...interface{}) ConnectionError { - return ConnectionError{ - Desc: fmt.Sprintf(format, a...), - temp: temp, - err: e, - } -} - -// ConnectionError is an error that results in the termination of the -// entire connection and the retry of all the active streams. -type ConnectionError struct { - Desc string - temp bool - err error -} - -func (e ConnectionError) Error() string { - return fmt.Sprintf("connection error: desc = %q", e.Desc) -} - -// Temporary indicates if this connection error is temporary or fatal. -func (e ConnectionError) Temporary() bool { - return e.temp -} - -// Origin returns the original error of this connection error. -func (e ConnectionError) Origin() error { - // Never return nil error here. - // If the original error is nil, return itself. - if e.err == nil { - return e - } - return e.err -} - -var ( - // ErrConnClosing indicates that the transport is closing. - ErrConnClosing = connectionErrorf(true, nil, "transport is closing") - // ErrStreamDrain indicates that the stream is rejected by the server because - // the server stops accepting new RPCs. - ErrStreamDrain = streamErrorf(codes.Unavailable, "the server stops accepting new RPCs") -) - -// TODO: See if we can replace StreamError with status package errors. - -// StreamError is an error that only affects one stream within a connection. -type StreamError struct { - Code codes.Code - Desc string -} - -func (e StreamError) Error() string { - return fmt.Sprintf("stream error: code = %s desc = %q", e.Code, e.Desc) -} - -// wait blocks until it can receive from ctx.Done, closing, or proceed. -// If it receives from ctx.Done, it returns 0, the StreamError for ctx.Err. -// If it receives from done, it returns 0, io.EOF if ctx is not done; otherwise -// it return the StreamError for ctx.Err. -// If it receives from goAway, it returns 0, ErrStreamDrain. -// If it receives from closing, it returns 0, ErrConnClosing. -// If it receives from proceed, it returns the received integer, nil. -func wait(ctx context.Context, done, goAway, closing <-chan struct{}, proceed <-chan int) (int, error) { - select { - case <-ctx.Done(): - return 0, ContextErr(ctx.Err()) - case <-done: - // User cancellation has precedence. - select { - case <-ctx.Done(): - return 0, ContextErr(ctx.Err()) - default: - } - return 0, io.EOF - case <-goAway: - return 0, ErrStreamDrain - case <-closing: - return 0, ErrConnClosing - case i := <-proceed: - return i, nil - } -} - -// GoAwayReason contains the reason for the GoAway frame received. -type GoAwayReason uint8 - -const ( - // Invalid indicates that no GoAway frame is received. - Invalid GoAwayReason = 0 - // NoReason is the default value when GoAway frame is received. - NoReason GoAwayReason = 1 - // TooManyPings indicates that a GoAway frame with ErrCodeEnhanceYourCalm - // was recieved and that the debug data said "too_many_pings". - TooManyPings GoAwayReason = 2 -) diff --git a/vendor/gopkg.in/alexcesaro/quotedprintable.v3/LICENSE b/vendor/gopkg.in/alexcesaro/quotedprintable.v3/LICENSE deleted file mode 100644 index 5f5c12af7..000000000 --- a/vendor/gopkg.in/alexcesaro/quotedprintable.v3/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Alexandre Cesaro - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/gopkg.in/alexcesaro/quotedprintable.v3/README.md b/vendor/gopkg.in/alexcesaro/quotedprintable.v3/README.md deleted file mode 100644 index 98ddf829f..000000000 --- a/vendor/gopkg.in/alexcesaro/quotedprintable.v3/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# quotedprintable - -## Introduction - -Package quotedprintable implements quoted-printable and message header encoding -as specified by RFC 2045 and RFC 2047. - -It is a copy of the Go 1.5 package `mime/quotedprintable`. It also includes -the new functions of package `mime` concerning RFC 2047. - -This code has minor changes with the standard library code in order to work -with Go 1.0 and newer. - -## Documentation - -https://godoc.org/gopkg.in/alexcesaro/quotedprintable.v3 diff --git a/vendor/gopkg.in/alexcesaro/quotedprintable.v3/encodedword.go b/vendor/gopkg.in/alexcesaro/quotedprintable.v3/encodedword.go deleted file mode 100644 index cfd02617c..000000000 --- a/vendor/gopkg.in/alexcesaro/quotedprintable.v3/encodedword.go +++ /dev/null @@ -1,279 +0,0 @@ -package quotedprintable - -import ( - "bytes" - "encoding/base64" - "errors" - "fmt" - "io" - "strings" - "unicode" - "unicode/utf8" -) - -// A WordEncoder is a RFC 2047 encoded-word encoder. -type WordEncoder byte - -const ( - // BEncoding represents Base64 encoding scheme as defined by RFC 2045. - BEncoding = WordEncoder('b') - // QEncoding represents the Q-encoding scheme as defined by RFC 2047. - QEncoding = WordEncoder('q') -) - -var ( - errInvalidWord = errors.New("mime: invalid RFC 2047 encoded-word") -) - -// Encode returns the encoded-word form of s. If s is ASCII without special -// characters, it is returned unchanged. The provided charset is the IANA -// charset name of s. It is case insensitive. -func (e WordEncoder) Encode(charset, s string) string { - if !needsEncoding(s) { - return s - } - return e.encodeWord(charset, s) -} - -func needsEncoding(s string) bool { - for _, b := range s { - if (b < ' ' || b > '~') && b != '\t' { - return true - } - } - return false -} - -// encodeWord encodes a string into an encoded-word. -func (e WordEncoder) encodeWord(charset, s string) string { - buf := getBuffer() - defer putBuffer(buf) - - buf.WriteString("=?") - buf.WriteString(charset) - buf.WriteByte('?') - buf.WriteByte(byte(e)) - buf.WriteByte('?') - - if e == BEncoding { - w := base64.NewEncoder(base64.StdEncoding, buf) - io.WriteString(w, s) - w.Close() - } else { - enc := make([]byte, 3) - for i := 0; i < len(s); i++ { - b := s[i] - switch { - case b == ' ': - buf.WriteByte('_') - case b <= '~' && b >= '!' && b != '=' && b != '?' && b != '_': - buf.WriteByte(b) - default: - enc[0] = '=' - enc[1] = upperhex[b>>4] - enc[2] = upperhex[b&0x0f] - buf.Write(enc) - } - } - } - buf.WriteString("?=") - return buf.String() -} - -const upperhex = "0123456789ABCDEF" - -// A WordDecoder decodes MIME headers containing RFC 2047 encoded-words. -type WordDecoder struct { - // CharsetReader, if non-nil, defines a function to generate - // charset-conversion readers, converting from the provided - // charset into UTF-8. - // Charsets are always lower-case. utf-8, iso-8859-1 and us-ascii charsets - // are handled by default. - // One of the the CharsetReader's result values must be non-nil. - CharsetReader func(charset string, input io.Reader) (io.Reader, error) -} - -// Decode decodes an encoded-word. If word is not a valid RFC 2047 encoded-word, -// word is returned unchanged. -func (d *WordDecoder) Decode(word string) (string, error) { - fields := strings.Split(word, "?") // TODO: remove allocation? - if len(fields) != 5 || fields[0] != "=" || fields[4] != "=" || len(fields[2]) != 1 { - return "", errInvalidWord - } - - content, err := decode(fields[2][0], fields[3]) - if err != nil { - return "", err - } - - buf := getBuffer() - defer putBuffer(buf) - - if err := d.convert(buf, fields[1], content); err != nil { - return "", err - } - - return buf.String(), nil -} - -// DecodeHeader decodes all encoded-words of the given string. It returns an -// error if and only if CharsetReader of d returns an error. -func (d *WordDecoder) DecodeHeader(header string) (string, error) { - // If there is no encoded-word, returns before creating a buffer. - i := strings.Index(header, "=?") - if i == -1 { - return header, nil - } - - buf := getBuffer() - defer putBuffer(buf) - - buf.WriteString(header[:i]) - header = header[i:] - - betweenWords := false - for { - start := strings.Index(header, "=?") - if start == -1 { - break - } - cur := start + len("=?") - - i := strings.Index(header[cur:], "?") - if i == -1 { - break - } - charset := header[cur : cur+i] - cur += i + len("?") - - if len(header) < cur+len("Q??=") { - break - } - encoding := header[cur] - cur++ - - if header[cur] != '?' { - break - } - cur++ - - j := strings.Index(header[cur:], "?=") - if j == -1 { - break - } - text := header[cur : cur+j] - end := cur + j + len("?=") - - content, err := decode(encoding, text) - if err != nil { - betweenWords = false - buf.WriteString(header[:start+2]) - header = header[start+2:] - continue - } - - // Write characters before the encoded-word. White-space and newline - // characters separating two encoded-words must be deleted. - if start > 0 && (!betweenWords || hasNonWhitespace(header[:start])) { - buf.WriteString(header[:start]) - } - - if err := d.convert(buf, charset, content); err != nil { - return "", err - } - - header = header[end:] - betweenWords = true - } - - if len(header) > 0 { - buf.WriteString(header) - } - - return buf.String(), nil -} - -func decode(encoding byte, text string) ([]byte, error) { - switch encoding { - case 'B', 'b': - return base64.StdEncoding.DecodeString(text) - case 'Q', 'q': - return qDecode(text) - } - return nil, errInvalidWord -} - -func (d *WordDecoder) convert(buf *bytes.Buffer, charset string, content []byte) error { - switch { - case strings.EqualFold("utf-8", charset): - buf.Write(content) - case strings.EqualFold("iso-8859-1", charset): - for _, c := range content { - buf.WriteRune(rune(c)) - } - case strings.EqualFold("us-ascii", charset): - for _, c := range content { - if c >= utf8.RuneSelf { - buf.WriteRune(unicode.ReplacementChar) - } else { - buf.WriteByte(c) - } - } - default: - if d.CharsetReader == nil { - return fmt.Errorf("mime: unhandled charset %q", charset) - } - r, err := d.CharsetReader(strings.ToLower(charset), bytes.NewReader(content)) - if err != nil { - return err - } - if _, err = buf.ReadFrom(r); err != nil { - return err - } - } - return nil -} - -// hasNonWhitespace reports whether s (assumed to be ASCII) contains at least -// one byte of non-whitespace. -func hasNonWhitespace(s string) bool { - for _, b := range s { - switch b { - // Encoded-words can only be separated by linear white spaces which does - // not include vertical tabs (\v). - case ' ', '\t', '\n', '\r': - default: - return true - } - } - return false -} - -// qDecode decodes a Q encoded string. -func qDecode(s string) ([]byte, error) { - dec := make([]byte, len(s)) - n := 0 - for i := 0; i < len(s); i++ { - switch c := s[i]; { - case c == '_': - dec[n] = ' ' - case c == '=': - if i+2 >= len(s) { - return nil, errInvalidWord - } - b, err := readHexByte(s[i+1], s[i+2]) - if err != nil { - return nil, err - } - dec[n] = b - i += 2 - case (c <= '~' && c >= ' ') || c == '\n' || c == '\r' || c == '\t': - dec[n] = c - default: - return nil, errInvalidWord - } - n++ - } - - return dec[:n], nil -} diff --git a/vendor/gopkg.in/alexcesaro/quotedprintable.v3/pool.go b/vendor/gopkg.in/alexcesaro/quotedprintable.v3/pool.go deleted file mode 100644 index 24283c52f..000000000 --- a/vendor/gopkg.in/alexcesaro/quotedprintable.v3/pool.go +++ /dev/null @@ -1,26 +0,0 @@ -// +build go1.3 - -package quotedprintable - -import ( - "bytes" - "sync" -) - -var bufPool = sync.Pool{ - New: func() interface{} { - return new(bytes.Buffer) - }, -} - -func getBuffer() *bytes.Buffer { - return bufPool.Get().(*bytes.Buffer) -} - -func putBuffer(buf *bytes.Buffer) { - if buf.Len() > 1024 { - return - } - buf.Reset() - bufPool.Put(buf) -} diff --git a/vendor/gopkg.in/alexcesaro/quotedprintable.v3/pool_go12.go b/vendor/gopkg.in/alexcesaro/quotedprintable.v3/pool_go12.go deleted file mode 100644 index d335b4ab5..000000000 --- a/vendor/gopkg.in/alexcesaro/quotedprintable.v3/pool_go12.go +++ /dev/null @@ -1,24 +0,0 @@ -// +build !go1.3 - -package quotedprintable - -import "bytes" - -var ch = make(chan *bytes.Buffer, 32) - -func getBuffer() *bytes.Buffer { - select { - case buf := <-ch: - return buf - default: - } - return new(bytes.Buffer) -} - -func putBuffer(buf *bytes.Buffer) { - buf.Reset() - select { - case ch <- buf: - default: - } -} diff --git a/vendor/gopkg.in/alexcesaro/quotedprintable.v3/reader.go b/vendor/gopkg.in/alexcesaro/quotedprintable.v3/reader.go deleted file mode 100644 index 955edca29..000000000 --- a/vendor/gopkg.in/alexcesaro/quotedprintable.v3/reader.go +++ /dev/null @@ -1,121 +0,0 @@ -// Package quotedprintable implements quoted-printable encoding as specified by -// RFC 2045. -package quotedprintable - -import ( - "bufio" - "bytes" - "fmt" - "io" -) - -// Reader is a quoted-printable decoder. -type Reader struct { - br *bufio.Reader - rerr error // last read error - line []byte // to be consumed before more of br -} - -// NewReader returns a quoted-printable reader, decoding from r. -func NewReader(r io.Reader) *Reader { - return &Reader{ - br: bufio.NewReader(r), - } -} - -func fromHex(b byte) (byte, error) { - switch { - case b >= '0' && b <= '9': - return b - '0', nil - case b >= 'A' && b <= 'F': - return b - 'A' + 10, nil - // Accept badly encoded bytes. - case b >= 'a' && b <= 'f': - return b - 'a' + 10, nil - } - return 0, fmt.Errorf("quotedprintable: invalid hex byte 0x%02x", b) -} - -func readHexByte(a, b byte) (byte, error) { - var hb, lb byte - var err error - if hb, err = fromHex(a); err != nil { - return 0, err - } - if lb, err = fromHex(b); err != nil { - return 0, err - } - return hb<<4 | lb, nil -} - -func isQPDiscardWhitespace(r rune) bool { - switch r { - case '\n', '\r', ' ', '\t': - return true - } - return false -} - -var ( - crlf = []byte("\r\n") - lf = []byte("\n") - softSuffix = []byte("=") -) - -// Read reads and decodes quoted-printable data from the underlying reader. -func (r *Reader) Read(p []byte) (n int, err error) { - // Deviations from RFC 2045: - // 1. in addition to "=\r\n", "=\n" is also treated as soft line break. - // 2. it will pass through a '\r' or '\n' not preceded by '=', consistent - // with other broken QP encoders & decoders. - for len(p) > 0 { - if len(r.line) == 0 { - if r.rerr != nil { - return n, r.rerr - } - r.line, r.rerr = r.br.ReadSlice('\n') - - // Does the line end in CRLF instead of just LF? - hasLF := bytes.HasSuffix(r.line, lf) - hasCR := bytes.HasSuffix(r.line, crlf) - wholeLine := r.line - r.line = bytes.TrimRightFunc(wholeLine, isQPDiscardWhitespace) - if bytes.HasSuffix(r.line, softSuffix) { - rightStripped := wholeLine[len(r.line):] - r.line = r.line[:len(r.line)-1] - if !bytes.HasPrefix(rightStripped, lf) && !bytes.HasPrefix(rightStripped, crlf) { - r.rerr = fmt.Errorf("quotedprintable: invalid bytes after =: %q", rightStripped) - } - } else if hasLF { - if hasCR { - r.line = append(r.line, '\r', '\n') - } else { - r.line = append(r.line, '\n') - } - } - continue - } - b := r.line[0] - - switch { - case b == '=': - if len(r.line[1:]) < 2 { - return n, io.ErrUnexpectedEOF - } - b, err = readHexByte(r.line[1], r.line[2]) - if err != nil { - return n, err - } - r.line = r.line[2:] // 2 of the 3; other 1 is done below - case b == '\t' || b == '\r' || b == '\n': - break - case b < ' ' || b > '~': - return n, fmt.Errorf("quotedprintable: invalid unescaped byte 0x%02x in body", b) - } - p[0] = b - p = p[1:] - r.line = r.line[1:] - n++ - } - return n, nil -} diff --git a/vendor/gopkg.in/alexcesaro/quotedprintable.v3/writer.go b/vendor/gopkg.in/alexcesaro/quotedprintable.v3/writer.go deleted file mode 100644 index 43359d51d..000000000 --- a/vendor/gopkg.in/alexcesaro/quotedprintable.v3/writer.go +++ /dev/null @@ -1,166 +0,0 @@ -package quotedprintable - -import "io" - -const lineMaxLen = 76 - -// A Writer is a quoted-printable writer that implements io.WriteCloser. -type Writer struct { - // Binary mode treats the writer's input as pure binary and processes end of - // line bytes as binary data. - Binary bool - - w io.Writer - i int - line [78]byte - cr bool -} - -// NewWriter returns a new Writer that writes to w. -func NewWriter(w io.Writer) *Writer { - return &Writer{w: w} -} - -// Write encodes p using quoted-printable encoding and writes it to the -// underlying io.Writer. It limits line length to 76 characters. The encoded -// bytes are not necessarily flushed until the Writer is closed. -func (w *Writer) Write(p []byte) (n int, err error) { - for i, b := range p { - switch { - // Simple writes are done in batch. - case b >= '!' && b <= '~' && b != '=': - continue - case isWhitespace(b) || !w.Binary && (b == '\n' || b == '\r'): - continue - } - - if i > n { - if err := w.write(p[n:i]); err != nil { - return n, err - } - n = i - } - - if err := w.encode(b); err != nil { - return n, err - } - n++ - } - - if n == len(p) { - return n, nil - } - - if err := w.write(p[n:]); err != nil { - return n, err - } - - return len(p), nil -} - -// Close closes the Writer, flushing any unwritten data to the underlying -// io.Writer, but does not close the underlying io.Writer. -func (w *Writer) Close() error { - if err := w.checkLastByte(); err != nil { - return err - } - - return w.flush() -} - -// write limits text encoded in quoted-printable to 76 characters per line. -func (w *Writer) write(p []byte) error { - for _, b := range p { - if b == '\n' || b == '\r' { - // If the previous byte was \r, the CRLF has already been inserted. - if w.cr && b == '\n' { - w.cr = false - continue - } - - if b == '\r' { - w.cr = true - } - - if err := w.checkLastByte(); err != nil { - return err - } - if err := w.insertCRLF(); err != nil { - return err - } - continue - } - - if w.i == lineMaxLen-1 { - if err := w.insertSoftLineBreak(); err != nil { - return err - } - } - - w.line[w.i] = b - w.i++ - w.cr = false - } - - return nil -} - -func (w *Writer) encode(b byte) error { - if lineMaxLen-1-w.i < 3 { - if err := w.insertSoftLineBreak(); err != nil { - return err - } - } - - w.line[w.i] = '=' - w.line[w.i+1] = upperhex[b>>4] - w.line[w.i+2] = upperhex[b&0x0f] - w.i += 3 - - return nil -} - -// checkLastByte encodes the last buffered byte if it is a space or a tab. -func (w *Writer) checkLastByte() error { - if w.i == 0 { - return nil - } - - b := w.line[w.i-1] - if isWhitespace(b) { - w.i-- - if err := w.encode(b); err != nil { - return err - } - } - - return nil -} - -func (w *Writer) insertSoftLineBreak() error { - w.line[w.i] = '=' - w.i++ - - return w.insertCRLF() -} - -func (w *Writer) insertCRLF() error { - w.line[w.i] = '\r' - w.line[w.i+1] = '\n' - w.i += 2 - - return w.flush() -} - -func (w *Writer) flush() error { - if _, err := w.w.Write(w.line[:w.i]); err != nil { - return err - } - - w.i = 0 - return nil -} - -func isWhitespace(b byte) bool { - return b == ' ' || b == '\t' -} diff --git a/vendor/gopkg.in/ini.v1/LICENSE b/vendor/gopkg.in/ini.v1/LICENSE deleted file mode 100644 index 37ec93a14..000000000 --- a/vendor/gopkg.in/ini.v1/LICENSE +++ /dev/null @@ -1,191 +0,0 @@ -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and -distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright -owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities -that control, are controlled by, or are under common control with that entity. -For the purposes of this definition, "control" means (i) the power, direct or -indirect, to cause the direction or management of such entity, whether by -contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the -outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising -permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including -but not limited to software source code, documentation source, and configuration -files. - -"Object" form shall mean any form resulting from mechanical transformation or -translation of a Source form, including but not limited to compiled object code, -generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made -available under the License, as indicated by a copyright notice that is included -in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that -is based on (or derived from) the Work and for which the editorial revisions, -annotations, elaborations, or other modifications represent, as a whole, an -original work of authorship. For the purposes of this License, Derivative Works -shall not include works that remain separable from, or merely link (or bind by -name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version -of the Work and any modifications or additions to that Work or Derivative Works -thereof, that is intentionally submitted to Licensor for inclusion in the Work -by the copyright owner or by an individual or Legal Entity authorized to submit -on behalf of the copyright owner. For the purposes of this definition, -"submitted" means any form of electronic, verbal, or written communication sent -to the Licensor or its representatives, including but not limited to -communication on electronic mailing lists, source code control systems, and -issue tracking systems that are managed by, or on behalf of, the Licensor for -the purpose of discussing and improving the Work, but excluding communication -that is conspicuously marked or otherwise designated in writing by the copyright -owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf -of whom a Contribution has been received by Licensor and subsequently -incorporated within the Work. - -2. Grant of Copyright License. - -Subject to the terms and conditions of this License, each Contributor hereby -grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, -irrevocable copyright license to reproduce, prepare Derivative Works of, -publicly display, publicly perform, sublicense, and distribute the Work and such -Derivative Works in Source or Object form. - -3. Grant of Patent License. - -Subject to the terms and conditions of this License, each Contributor hereby -grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, -irrevocable (except as stated in this section) patent license to make, have -made, use, offer to sell, sell, import, and otherwise transfer the Work, where -such license applies only to those patent claims licensable by such Contributor -that are necessarily infringed by their Contribution(s) alone or by combination -of their Contribution(s) with the Work to which such Contribution(s) was -submitted. If You institute patent litigation against any entity (including a -cross-claim or counterclaim in a lawsuit) alleging that the Work or a -Contribution incorporated within the Work constitutes direct or contributory -patent infringement, then any patent licenses granted to You under this License -for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. - -You may reproduce and distribute copies of the Work or Derivative Works thereof -in any medium, with or without modifications, and in Source or Object form, -provided that You meet the following conditions: - -You must give any other recipients of the Work or Derivative Works a copy of -this License; and -You must cause any modified files to carry prominent notices stating that You -changed the files; and -You must retain, in the Source form of any Derivative Works that You distribute, -all copyright, patent, trademark, and attribution notices from the Source form -of the Work, excluding those notices that do not pertain to any part of the -Derivative Works; and -If the Work includes a "NOTICE" text file as part of its distribution, then any -Derivative Works that You distribute must include a readable copy of the -attribution notices contained within such NOTICE file, excluding those notices -that do not pertain to any part of the Derivative Works, in at least one of the -following places: within a NOTICE text file distributed as part of the -Derivative Works; within the Source form or documentation, if provided along -with the Derivative Works; or, within a display generated by the Derivative -Works, if and wherever such third-party notices normally appear. The contents of -the NOTICE file are for informational purposes only and do not modify the -License. You may add Your own attribution notices within Derivative Works that -You distribute, alongside or as an addendum to the NOTICE text from the Work, -provided that such additional attribution notices cannot be construed as -modifying the License. -You may add Your own copyright statement to Your modifications and may provide -additional or different license terms and conditions for use, reproduction, or -distribution of Your modifications, or for any such Derivative Works as a whole, -provided Your use, reproduction, and distribution of the Work otherwise complies -with the conditions stated in this License. - -5. Submission of Contributions. - -Unless You explicitly state otherwise, any Contribution intentionally submitted -for inclusion in the Work by You to the Licensor shall be under the terms and -conditions of this License, without any additional terms or conditions. -Notwithstanding the above, nothing herein shall supersede or modify the terms of -any separate license agreement you may have executed with Licensor regarding -such Contributions. - -6. Trademarks. - -This License does not grant permission to use the trade names, trademarks, -service marks, or product names of the Licensor, except as required for -reasonable and customary use in describing the origin of the Work and -reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. - -Unless required by applicable law or agreed to in writing, Licensor provides the -Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, -including, without limitation, any warranties or conditions of TITLE, -NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are -solely responsible for determining the appropriateness of using or -redistributing the Work and assume any risks associated with Your exercise of -permissions under this License. - -8. Limitation of Liability. - -In no event and under no legal theory, whether in tort (including negligence), -contract, or otherwise, unless required by applicable law (such as deliberate -and grossly negligent acts) or agreed to in writing, shall any Contributor be -liable to You for damages, including any direct, indirect, special, incidental, -or consequential damages of any character arising as a result of this License or -out of the use or inability to use the Work (including but not limited to -damages for loss of goodwill, work stoppage, computer failure or malfunction, or -any and all other commercial damages or losses), even if such Contributor has -been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. - -While redistributing the Work or Derivative Works thereof, You may choose to -offer, and charge a fee for, acceptance of support, warranty, indemnity, or -other liability obligations and/or rights consistent with this License. However, -in accepting such obligations, You may act only on Your own behalf and on Your -sole responsibility, not on behalf of any other Contributor, and only if You -agree to indemnify, defend, and hold each Contributor harmless for any liability -incurred by, or claims asserted against, such Contributor by reason of your -accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work - -To apply the Apache License to your work, attach the following boilerplate -notice, with the fields enclosed by brackets "[]" replaced with your own -identifying information. (Don't include the brackets!) The text should be -enclosed in the appropriate comment syntax for the file format. We also -recommend that a file or class name and description of purpose be included on -the same "printed page" as the copyright notice for easier identification within -third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/gopkg.in/ini.v1/Makefile b/vendor/gopkg.in/ini.v1/Makefile deleted file mode 100644 index ac034e525..000000000 --- a/vendor/gopkg.in/ini.v1/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -.PHONY: build test bench vet - -build: vet bench - -test: - go test -v -cover -race - -bench: - go test -v -cover -race -test.bench=. -test.benchmem - -vet: - go vet diff --git a/vendor/gopkg.in/ini.v1/README.md b/vendor/gopkg.in/ini.v1/README.md deleted file mode 100644 index 85947422d..000000000 --- a/vendor/gopkg.in/ini.v1/README.md +++ /dev/null @@ -1,740 +0,0 @@ -INI [![Build Status](https://travis-ci.org/go-ini/ini.svg?branch=master)](https://travis-ci.org/go-ini/ini) [![Sourcegraph](https://sourcegraph.com/github.com/go-ini/ini/-/badge.svg)](https://sourcegraph.com/github.com/go-ini/ini?badge) -=== - -![](https://avatars0.githubusercontent.com/u/10216035?v=3&s=200) - -Package ini provides INI file read and write functionality in Go. - -[简体中文](README_ZH.md) - -## Feature - -- Load multiple data sources(`[]byte`, file and `io.ReadCloser`) with overwrites. -- Read with recursion values. -- Read with parent-child sections. -- Read with auto-increment key names. -- Read with multiple-line values. -- Read with tons of helper methods. -- Read and convert values to Go types. -- Read and **WRITE** comments of sections and keys. -- Manipulate sections, keys and comments with ease. -- Keep sections and keys in order as you parse and save. - -## Installation - -To use a tagged revision: - - go get gopkg.in/ini.v1 - -To use with latest changes: - - go get github.com/go-ini/ini - -Please add `-u` flag to update in the future. - -### Testing - -If you want to test on your machine, please apply `-t` flag: - - go get -t gopkg.in/ini.v1 - -Please add `-u` flag to update in the future. - -## Getting Started - -### Loading from data sources - -A **Data Source** is either raw data in type `[]byte`, a file name with type `string` or `io.ReadCloser`. You can load **as many data sources as you want**. Passing other types will simply return an error. - -```go -cfg, err := ini.Load([]byte("raw data"), "filename", ioutil.NopCloser(bytes.NewReader([]byte("some other data")))) -``` - -Or start with an empty object: - -```go -cfg := ini.Empty() -``` - -When you cannot decide how many data sources to load at the beginning, you will still be able to **Append()** them later. - -```go -err := cfg.Append("other file", []byte("other raw data")) -``` - -If you have a list of files with possibilities that some of them may not available at the time, and you don't know exactly which ones, you can use `LooseLoad` to ignore nonexistent files without returning error. - -```go -cfg, err := ini.LooseLoad("filename", "filename_404") -``` - -The cool thing is, whenever the file is available to load while you're calling `Reload` method, it will be counted as usual. - -#### Ignore cases of key name - -When you do not care about cases of section and key names, you can use `InsensitiveLoad` to force all names to be lowercased while parsing. - -```go -cfg, err := ini.InsensitiveLoad("filename") -//... - -// sec1 and sec2 are the exactly same section object -sec1, err := cfg.GetSection("Section") -sec2, err := cfg.GetSection("SecTIOn") - -// key1 and key2 are the exactly same key object -key1, err := cfg.GetKey("Key") -key2, err := cfg.GetKey("KeY") -``` - -#### MySQL-like boolean key - -MySQL's configuration allows a key without value as follows: - -```ini -[mysqld] -... -skip-host-cache -skip-name-resolve -``` - -By default, this is considered as missing value. But if you know you're going to deal with those cases, you can assign advanced load options: - -```go -cfg, err := LoadSources(LoadOptions{AllowBooleanKeys: true}, "my.cnf")) -``` - -The value of those keys are always `true`, and when you save to a file, it will keep in the same foramt as you read. - -To generate such keys in your program, you could use `NewBooleanKey`: - -```go -key, err := sec.NewBooleanKey("skip-host-cache") -``` - -#### Comment - -Take care that following format will be treated as comment: - -1. Line begins with `#` or `;` -2. Words after `#` or `;` -3. Words after section name (i.e words after `[some section name]`) - -If you want to save a value with `#` or `;`, please quote them with ``` ` ``` or ``` """ ```. - -### Working with sections - -To get a section, you would need to: - -```go -section, err := cfg.GetSection("section name") -``` - -For a shortcut for default section, just give an empty string as name: - -```go -section, err := cfg.GetSection("") -``` - -When you're pretty sure the section exists, following code could make your life easier: - -```go -section := cfg.Section("section name") -``` - -What happens when the section somehow does not exist? Don't panic, it automatically creates and returns a new section to you. - -To create a new section: - -```go -err := cfg.NewSection("new section") -``` - -To get a list of sections or section names: - -```go -sections := cfg.Sections() -names := cfg.SectionStrings() -``` - -### Working with keys - -To get a key under a section: - -```go -key, err := cfg.Section("").GetKey("key name") -``` - -Same rule applies to key operations: - -```go -key := cfg.Section("").Key("key name") -``` - -To check if a key exists: - -```go -yes := cfg.Section("").HasKey("key name") -``` - -To create a new key: - -```go -err := cfg.Section("").NewKey("name", "value") -``` - -To get a list of keys or key names: - -```go -keys := cfg.Section("").Keys() -names := cfg.Section("").KeyStrings() -``` - -To get a clone hash of keys and corresponding values: - -```go -hash := cfg.Section("").KeysHash() -``` - -### Working with values - -To get a string value: - -```go -val := cfg.Section("").Key("key name").String() -``` - -To validate key value on the fly: - -```go -val := cfg.Section("").Key("key name").Validate(func(in string) string { - if len(in) == 0 { - return "default" - } - return in -}) -``` - -If you do not want any auto-transformation (such as recursive read) for the values, you can get raw value directly (this way you get much better performance): - -```go -val := cfg.Section("").Key("key name").Value() -``` - -To check if raw value exists: - -```go -yes := cfg.Section("").HasValue("test value") -``` - -To get value with types: - -```go -// For boolean values: -// true when value is: 1, t, T, TRUE, true, True, YES, yes, Yes, y, ON, on, On -// false when value is: 0, f, F, FALSE, false, False, NO, no, No, n, OFF, off, Off -v, err = cfg.Section("").Key("BOOL").Bool() -v, err = cfg.Section("").Key("FLOAT64").Float64() -v, err = cfg.Section("").Key("INT").Int() -v, err = cfg.Section("").Key("INT64").Int64() -v, err = cfg.Section("").Key("UINT").Uint() -v, err = cfg.Section("").Key("UINT64").Uint64() -v, err = cfg.Section("").Key("TIME").TimeFormat(time.RFC3339) -v, err = cfg.Section("").Key("TIME").Time() // RFC3339 - -v = cfg.Section("").Key("BOOL").MustBool() -v = cfg.Section("").Key("FLOAT64").MustFloat64() -v = cfg.Section("").Key("INT").MustInt() -v = cfg.Section("").Key("INT64").MustInt64() -v = cfg.Section("").Key("UINT").MustUint() -v = cfg.Section("").Key("UINT64").MustUint64() -v = cfg.Section("").Key("TIME").MustTimeFormat(time.RFC3339) -v = cfg.Section("").Key("TIME").MustTime() // RFC3339 - -// Methods start with Must also accept one argument for default value -// when key not found or fail to parse value to given type. -// Except method MustString, which you have to pass a default value. - -v = cfg.Section("").Key("String").MustString("default") -v = cfg.Section("").Key("BOOL").MustBool(true) -v = cfg.Section("").Key("FLOAT64").MustFloat64(1.25) -v = cfg.Section("").Key("INT").MustInt(10) -v = cfg.Section("").Key("INT64").MustInt64(99) -v = cfg.Section("").Key("UINT").MustUint(3) -v = cfg.Section("").Key("UINT64").MustUint64(6) -v = cfg.Section("").Key("TIME").MustTimeFormat(time.RFC3339, time.Now()) -v = cfg.Section("").Key("TIME").MustTime(time.Now()) // RFC3339 -``` - -What if my value is three-line long? - -```ini -[advance] -ADDRESS = """404 road, -NotFound, State, 5000 -Earth""" -``` - -Not a problem! - -```go -cfg.Section("advance").Key("ADDRESS").String() - -/* --- start --- -404 road, -NotFound, State, 5000 -Earth ------- end --- */ -``` - -That's cool, how about continuation lines? - -```ini -[advance] -two_lines = how about \ - continuation lines? -lots_of_lines = 1 \ - 2 \ - 3 \ - 4 -``` - -Piece of cake! - -```go -cfg.Section("advance").Key("two_lines").String() // how about continuation lines? -cfg.Section("advance").Key("lots_of_lines").String() // 1 2 3 4 -``` - -Well, I hate continuation lines, how do I disable that? - -```go -cfg, err := ini.LoadSources(ini.LoadOptions{ - IgnoreContinuation: true, -}, "filename") -``` - -Holy crap! - -Note that single quotes around values will be stripped: - -```ini -foo = "some value" // foo: some value -bar = 'some value' // bar: some value -``` - -That's all? Hmm, no. - -#### Helper methods of working with values - -To get value with given candidates: - -```go -v = cfg.Section("").Key("STRING").In("default", []string{"str", "arr", "types"}) -v = cfg.Section("").Key("FLOAT64").InFloat64(1.1, []float64{1.25, 2.5, 3.75}) -v = cfg.Section("").Key("INT").InInt(5, []int{10, 20, 30}) -v = cfg.Section("").Key("INT64").InInt64(10, []int64{10, 20, 30}) -v = cfg.Section("").Key("UINT").InUint(4, []int{3, 6, 9}) -v = cfg.Section("").Key("UINT64").InUint64(8, []int64{3, 6, 9}) -v = cfg.Section("").Key("TIME").InTimeFormat(time.RFC3339, time.Now(), []time.Time{time1, time2, time3}) -v = cfg.Section("").Key("TIME").InTime(time.Now(), []time.Time{time1, time2, time3}) // RFC3339 -``` - -Default value will be presented if value of key is not in candidates you given, and default value does not need be one of candidates. - -To validate value in a given range: - -```go -vals = cfg.Section("").Key("FLOAT64").RangeFloat64(0.0, 1.1, 2.2) -vals = cfg.Section("").Key("INT").RangeInt(0, 10, 20) -vals = cfg.Section("").Key("INT64").RangeInt64(0, 10, 20) -vals = cfg.Section("").Key("UINT").RangeUint(0, 3, 9) -vals = cfg.Section("").Key("UINT64").RangeUint64(0, 3, 9) -vals = cfg.Section("").Key("TIME").RangeTimeFormat(time.RFC3339, time.Now(), minTime, maxTime) -vals = cfg.Section("").Key("TIME").RangeTime(time.Now(), minTime, maxTime) // RFC3339 -``` - -##### Auto-split values into a slice - -To use zero value of type for invalid inputs: - -```go -// Input: 1.1, 2.2, 3.3, 4.4 -> [1.1 2.2 3.3 4.4] -// Input: how, 2.2, are, you -> [0.0 2.2 0.0 0.0] -vals = cfg.Section("").Key("STRINGS").Strings(",") -vals = cfg.Section("").Key("FLOAT64S").Float64s(",") -vals = cfg.Section("").Key("INTS").Ints(",") -vals = cfg.Section("").Key("INT64S").Int64s(",") -vals = cfg.Section("").Key("UINTS").Uints(",") -vals = cfg.Section("").Key("UINT64S").Uint64s(",") -vals = cfg.Section("").Key("TIMES").Times(",") -``` - -To exclude invalid values out of result slice: - -```go -// Input: 1.1, 2.2, 3.3, 4.4 -> [1.1 2.2 3.3 4.4] -// Input: how, 2.2, are, you -> [2.2] -vals = cfg.Section("").Key("FLOAT64S").ValidFloat64s(",") -vals = cfg.Section("").Key("INTS").ValidInts(",") -vals = cfg.Section("").Key("INT64S").ValidInt64s(",") -vals = cfg.Section("").Key("UINTS").ValidUints(",") -vals = cfg.Section("").Key("UINT64S").ValidUint64s(",") -vals = cfg.Section("").Key("TIMES").ValidTimes(",") -``` - -Or to return nothing but error when have invalid inputs: - -```go -// Input: 1.1, 2.2, 3.3, 4.4 -> [1.1 2.2 3.3 4.4] -// Input: how, 2.2, are, you -> error -vals = cfg.Section("").Key("FLOAT64S").StrictFloat64s(",") -vals = cfg.Section("").Key("INTS").StrictInts(",") -vals = cfg.Section("").Key("INT64S").StrictInt64s(",") -vals = cfg.Section("").Key("UINTS").StrictUints(",") -vals = cfg.Section("").Key("UINT64S").StrictUint64s(",") -vals = cfg.Section("").Key("TIMES").StrictTimes(",") -``` - -### Save your configuration - -Finally, it's time to save your configuration to somewhere. - -A typical way to save configuration is writing it to a file: - -```go -// ... -err = cfg.SaveTo("my.ini") -err = cfg.SaveToIndent("my.ini", "\t") -``` - -Another way to save is writing to a `io.Writer` interface: - -```go -// ... -cfg.WriteTo(writer) -cfg.WriteToIndent(writer, "\t") -``` - -By default, spaces are used to align "=" sign between key and values, to disable that: - -```go -ini.PrettyFormat = false -``` - -## Advanced Usage - -### Recursive Values - -For all value of keys, there is a special syntax `%()s`, where `` is the key name in same section or default section, and `%()s` will be replaced by corresponding value(empty string if key not found). You can use this syntax at most 99 level of recursions. - -```ini -NAME = ini - -[author] -NAME = Unknwon -GITHUB = https://github.com/%(NAME)s - -[package] -FULL_NAME = github.com/go-ini/%(NAME)s -``` - -```go -cfg.Section("author").Key("GITHUB").String() // https://github.com/Unknwon -cfg.Section("package").Key("FULL_NAME").String() // github.com/go-ini/ini -``` - -### Parent-child Sections - -You can use `.` in section name to indicate parent-child relationship between two or more sections. If the key not found in the child section, library will try again on its parent section until there is no parent section. - -```ini -NAME = ini -VERSION = v1 -IMPORT_PATH = gopkg.in/%(NAME)s.%(VERSION)s - -[package] -CLONE_URL = https://%(IMPORT_PATH)s - -[package.sub] -``` - -```go -cfg.Section("package.sub").Key("CLONE_URL").String() // https://gopkg.in/ini.v1 -``` - -#### Retrieve parent keys available to a child section - -```go -cfg.Section("package.sub").ParentKeys() // ["CLONE_URL"] -``` - -### Unparseable Sections - -Sometimes, you have sections that do not contain key-value pairs but raw content, to handle such case, you can use `LoadOptions.UnparsableSections`: - -```go -cfg, err := LoadSources(LoadOptions{UnparseableSections: []string{"COMMENTS"}}, `[COMMENTS] -<1> This slide has the fuel listed in the wrong units `)) - -body := cfg.Section("COMMENTS").Body() - -/* --- start --- -<1> This slide has the fuel listed in the wrong units ------- end --- */ -``` - -### Auto-increment Key Names - -If key name is `-` in data source, then it would be seen as special syntax for auto-increment key name start from 1, and every section is independent on counter. - -```ini -[features] --: Support read/write comments of keys and sections --: Support auto-increment of key names --: Support load multiple files to overwrite key values -``` - -```go -cfg.Section("features").KeyStrings() // []{"#1", "#2", "#3"} -``` - -### Map To Struct - -Want more objective way to play with INI? Cool. - -```ini -Name = Unknwon -age = 21 -Male = true -Born = 1993-01-01T20:17:05Z - -[Note] -Content = Hi is a good man! -Cities = HangZhou, Boston -``` - -```go -type Note struct { - Content string - Cities []string -} - -type Person struct { - Name string - Age int `ini:"age"` - Male bool - Born time.Time - Note - Created time.Time `ini:"-"` -} - -func main() { - cfg, err := ini.Load("path/to/ini") - // ... - p := new(Person) - err = cfg.MapTo(p) - // ... - - // Things can be simpler. - err = ini.MapTo(p, "path/to/ini") - // ... - - // Just map a section? Fine. - n := new(Note) - err = cfg.Section("Note").MapTo(n) - // ... -} -``` - -Can I have default value for field? Absolutely. - -Assign it before you map to struct. It will keep the value as it is if the key is not presented or got wrong type. - -```go -// ... -p := &Person{ - Name: "Joe", -} -// ... -``` - -It's really cool, but what's the point if you can't give me my file back from struct? - -### Reflect From Struct - -Why not? - -```go -type Embeded struct { - Dates []time.Time `delim:"|"` - Places []string `ini:"places,omitempty"` - None []int `ini:",omitempty"` -} - -type Author struct { - Name string `ini:"NAME"` - Male bool - Age int - GPA float64 - NeverMind string `ini:"-"` - *Embeded -} - -func main() { - a := &Author{"Unknwon", true, 21, 2.8, "", - &Embeded{ - []time.Time{time.Now(), time.Now()}, - []string{"HangZhou", "Boston"}, - []int{}, - }} - cfg := ini.Empty() - err = ini.ReflectFrom(cfg, a) - // ... -} -``` - -So, what do I get? - -```ini -NAME = Unknwon -Male = true -Age = 21 -GPA = 2.8 - -[Embeded] -Dates = 2015-08-07T22:14:22+08:00|2015-08-07T22:14:22+08:00 -places = HangZhou,Boston -``` - -#### Name Mapper - -To save your time and make your code cleaner, this library supports [`NameMapper`](https://gowalker.org/gopkg.in/ini.v1#NameMapper) between struct field and actual section and key name. - -There are 2 built-in name mappers: - -- `AllCapsUnderscore`: it converts to format `ALL_CAPS_UNDERSCORE` then match section or key. -- `TitleUnderscore`: it converts to format `title_underscore` then match section or key. - -To use them: - -```go -type Info struct { - PackageName string -} - -func main() { - err = ini.MapToWithMapper(&Info{}, ini.TitleUnderscore, []byte("package_name=ini")) - // ... - - cfg, err := ini.Load([]byte("PACKAGE_NAME=ini")) - // ... - info := new(Info) - cfg.NameMapper = ini.AllCapsUnderscore - err = cfg.MapTo(info) - // ... -} -``` - -Same rules of name mapper apply to `ini.ReflectFromWithMapper` function. - -#### Value Mapper - -To expand values (e.g. from environment variables), you can use the `ValueMapper` to transform values: - -```go -type Env struct { - Foo string `ini:"foo"` -} - -func main() { - cfg, err := ini.Load([]byte("[env]\nfoo = ${MY_VAR}\n") - cfg.ValueMapper = os.ExpandEnv - // ... - env := &Env{} - err = cfg.Section("env").MapTo(env) -} -``` - -This would set the value of `env.Foo` to the value of the environment variable `MY_VAR`. - -#### Other Notes On Map/Reflect - -Any embedded struct is treated as a section by default, and there is no automatic parent-child relations in map/reflect feature: - -```go -type Child struct { - Age string -} - -type Parent struct { - Name string - Child -} - -type Config struct { - City string - Parent -} -``` - -Example configuration: - -```ini -City = Boston - -[Parent] -Name = Unknwon - -[Child] -Age = 21 -``` - -What if, yes, I'm paranoid, I want embedded struct to be in the same section. Well, all roads lead to Rome. - -```go -type Child struct { - Age string -} - -type Parent struct { - Name string - Child `ini:"Parent"` -} - -type Config struct { - City string - Parent -} -``` - -Example configuration: - -```ini -City = Boston - -[Parent] -Name = Unknwon -Age = 21 -``` - -## Getting Help - -- [API Documentation](https://gowalker.org/gopkg.in/ini.v1) -- [File An Issue](https://github.com/go-ini/ini/issues/new) - -## FAQs - -### What does `BlockMode` field do? - -By default, library lets you read and write values so we need a locker to make sure your data is safe. But in cases that you are very sure about only reading data through the library, you can set `cfg.BlockMode = false` to speed up read operations about **50-70%** faster. - -### Why another INI library? - -Many people are using my another INI library [goconfig](https://github.com/Unknwon/goconfig), so the reason for this one is I would like to make more Go style code. Also when you set `cfg.BlockMode = false`, this one is about **10-30%** faster. - -To make those changes I have to confirm API broken, so it's safer to keep it in another place and start using `gopkg.in` to version my package at this time.(PS: shorter import path) - -## License - -This project is under Apache v2 License. See the [LICENSE](LICENSE) file for the full license text. diff --git a/vendor/gopkg.in/ini.v1/README_ZH.md b/vendor/gopkg.in/ini.v1/README_ZH.md deleted file mode 100644 index 163432db9..000000000 --- a/vendor/gopkg.in/ini.v1/README_ZH.md +++ /dev/null @@ -1,727 +0,0 @@ -本包提供了 Go 语言中读写 INI 文件的功能。 - -## 功能特性 - -- 支持覆盖加载多个数据源(`[]byte`、文件和 `io.ReadCloser`) -- 支持递归读取键值 -- 支持读取父子分区 -- 支持读取自增键名 -- 支持读取多行的键值 -- 支持大量辅助方法 -- 支持在读取时直接转换为 Go 语言类型 -- 支持读取和 **写入** 分区和键的注释 -- 轻松操作分区、键值和注释 -- 在保存文件时分区和键值会保持原有的顺序 - -## 下载安装 - -使用一个特定版本: - - go get gopkg.in/ini.v1 - -使用最新版: - - go get github.com/go-ini/ini - -如需更新请添加 `-u` 选项。 - -### 测试安装 - -如果您想要在自己的机器上运行测试,请使用 `-t` 标记: - - go get -t gopkg.in/ini.v1 - -如需更新请添加 `-u` 选项。 - -## 开始使用 - -### 从数据源加载 - -一个 **数据源** 可以是 `[]byte` 类型的原始数据,`string` 类型的文件路径或 `io.ReadCloser`。您可以加载 **任意多个** 数据源。如果您传递其它类型的数据源,则会直接返回错误。 - -```go -cfg, err := ini.Load([]byte("raw data"), "filename", ioutil.NopCloser(bytes.NewReader([]byte("some other data")))) -``` - -或者从一个空白的文件开始: - -```go -cfg := ini.Empty() -``` - -当您在一开始无法决定需要加载哪些数据源时,仍可以使用 **Append()** 在需要的时候加载它们。 - -```go -err := cfg.Append("other file", []byte("other raw data")) -``` - -当您想要加载一系列文件,但是不能够确定其中哪些文件是不存在的,可以通过调用函数 `LooseLoad` 来忽略它们(`Load` 会因为文件不存在而返回错误): - -```go -cfg, err := ini.LooseLoad("filename", "filename_404") -``` - -更牛逼的是,当那些之前不存在的文件在重新调用 `Reload` 方法的时候突然出现了,那么它们会被正常加载。 - -#### 忽略键名的大小写 - -有时候分区和键的名称大小写混合非常烦人,这个时候就可以通过 `InsensitiveLoad` 将所有分区和键名在读取里强制转换为小写: - -```go -cfg, err := ini.InsensitiveLoad("filename") -//... - -// sec1 和 sec2 指向同一个分区对象 -sec1, err := cfg.GetSection("Section") -sec2, err := cfg.GetSection("SecTIOn") - -// key1 和 key2 指向同一个键对象 -key1, err := cfg.GetKey("Key") -key2, err := cfg.GetKey("KeY") -``` - -#### 类似 MySQL 配置中的布尔值键 - -MySQL 的配置文件中会出现没有具体值的布尔类型的键: - -```ini -[mysqld] -... -skip-host-cache -skip-name-resolve -``` - -默认情况下这被认为是缺失值而无法完成解析,但可以通过高级的加载选项对它们进行处理: - -```go -cfg, err := LoadSources(LoadOptions{AllowBooleanKeys: true}, "my.cnf")) -``` - -这些键的值永远为 `true`,且在保存到文件时也只会输出键名。 - -如果您想要通过程序来生成此类键,则可以使用 `NewBooleanKey`: - -```go -key, err := sec.NewBooleanKey("skip-host-cache") -``` - -#### 关于注释 - -下述几种情况的内容将被视为注释: - -1. 所有以 `#` 或 `;` 开头的行 -2. 所有在 `#` 或 `;` 之后的内容 -3. 分区标签后的文字 (即 `[分区名]` 之后的内容) - -如果你希望使用包含 `#` 或 `;` 的值,请使用 ``` ` ``` 或 ``` """ ``` 进行包覆。 - -### 操作分区(Section) - -获取指定分区: - -```go -section, err := cfg.GetSection("section name") -``` - -如果您想要获取默认分区,则可以用空字符串代替分区名: - -```go -section, err := cfg.GetSection("") -``` - -当您非常确定某个分区是存在的,可以使用以下简便方法: - -```go -section := cfg.Section("section name") -``` - -如果不小心判断错了,要获取的分区其实是不存在的,那会发生什么呢?没事的,它会自动创建并返回一个对应的分区对象给您。 - -创建一个分区: - -```go -err := cfg.NewSection("new section") -``` - -获取所有分区对象或名称: - -```go -sections := cfg.Sections() -names := cfg.SectionStrings() -``` - -### 操作键(Key) - -获取某个分区下的键: - -```go -key, err := cfg.Section("").GetKey("key name") -``` - -和分区一样,您也可以直接获取键而忽略错误处理: - -```go -key := cfg.Section("").Key("key name") -``` - -判断某个键是否存在: - -```go -yes := cfg.Section("").HasKey("key name") -``` - -创建一个新的键: - -```go -err := cfg.Section("").NewKey("name", "value") -``` - -获取分区下的所有键或键名: - -```go -keys := cfg.Section("").Keys() -names := cfg.Section("").KeyStrings() -``` - -获取分区下的所有键值对的克隆: - -```go -hash := cfg.Section("").KeysHash() -``` - -### 操作键值(Value) - -获取一个类型为字符串(string)的值: - -```go -val := cfg.Section("").Key("key name").String() -``` - -获取值的同时通过自定义函数进行处理验证: - -```go -val := cfg.Section("").Key("key name").Validate(func(in string) string { - if len(in) == 0 { - return "default" - } - return in -}) -``` - -如果您不需要任何对值的自动转变功能(例如递归读取),可以直接获取原值(这种方式性能最佳): - -```go -val := cfg.Section("").Key("key name").Value() -``` - -判断某个原值是否存在: - -```go -yes := cfg.Section("").HasValue("test value") -``` - -获取其它类型的值: - -```go -// 布尔值的规则: -// true 当值为:1, t, T, TRUE, true, True, YES, yes, Yes, y, ON, on, On -// false 当值为:0, f, F, FALSE, false, False, NO, no, No, n, OFF, off, Off -v, err = cfg.Section("").Key("BOOL").Bool() -v, err = cfg.Section("").Key("FLOAT64").Float64() -v, err = cfg.Section("").Key("INT").Int() -v, err = cfg.Section("").Key("INT64").Int64() -v, err = cfg.Section("").Key("UINT").Uint() -v, err = cfg.Section("").Key("UINT64").Uint64() -v, err = cfg.Section("").Key("TIME").TimeFormat(time.RFC3339) -v, err = cfg.Section("").Key("TIME").Time() // RFC3339 - -v = cfg.Section("").Key("BOOL").MustBool() -v = cfg.Section("").Key("FLOAT64").MustFloat64() -v = cfg.Section("").Key("INT").MustInt() -v = cfg.Section("").Key("INT64").MustInt64() -v = cfg.Section("").Key("UINT").MustUint() -v = cfg.Section("").Key("UINT64").MustUint64() -v = cfg.Section("").Key("TIME").MustTimeFormat(time.RFC3339) -v = cfg.Section("").Key("TIME").MustTime() // RFC3339 - -// 由 Must 开头的方法名允许接收一个相同类型的参数来作为默认值, -// 当键不存在或者转换失败时,则会直接返回该默认值。 -// 但是,MustString 方法必须传递一个默认值。 - -v = cfg.Seciont("").Key("String").MustString("default") -v = cfg.Section("").Key("BOOL").MustBool(true) -v = cfg.Section("").Key("FLOAT64").MustFloat64(1.25) -v = cfg.Section("").Key("INT").MustInt(10) -v = cfg.Section("").Key("INT64").MustInt64(99) -v = cfg.Section("").Key("UINT").MustUint(3) -v = cfg.Section("").Key("UINT64").MustUint64(6) -v = cfg.Section("").Key("TIME").MustTimeFormat(time.RFC3339, time.Now()) -v = cfg.Section("").Key("TIME").MustTime(time.Now()) // RFC3339 -``` - -如果我的值有好多行怎么办? - -```ini -[advance] -ADDRESS = """404 road, -NotFound, State, 5000 -Earth""" -``` - -嗯哼?小 case! - -```go -cfg.Section("advance").Key("ADDRESS").String() - -/* --- start --- -404 road, -NotFound, State, 5000 -Earth ------- end --- */ -``` - -赞爆了!那要是我属于一行的内容写不下想要写到第二行怎么办? - -```ini -[advance] -two_lines = how about \ - continuation lines? -lots_of_lines = 1 \ - 2 \ - 3 \ - 4 -``` - -简直是小菜一碟! - -```go -cfg.Section("advance").Key("two_lines").String() // how about continuation lines? -cfg.Section("advance").Key("lots_of_lines").String() // 1 2 3 4 -``` - -可是我有时候觉得两行连在一起特别没劲,怎么才能不自动连接两行呢? - -```go -cfg, err := ini.LoadSources(ini.LoadOptions{ - IgnoreContinuation: true, -}, "filename") -``` - -哇靠给力啊! - -需要注意的是,值两侧的单引号会被自动剔除: - -```ini -foo = "some value" // foo: some value -bar = 'some value' // bar: some value -``` - -这就是全部了?哈哈,当然不是。 - -#### 操作键值的辅助方法 - -获取键值时设定候选值: - -```go -v = cfg.Section("").Key("STRING").In("default", []string{"str", "arr", "types"}) -v = cfg.Section("").Key("FLOAT64").InFloat64(1.1, []float64{1.25, 2.5, 3.75}) -v = cfg.Section("").Key("INT").InInt(5, []int{10, 20, 30}) -v = cfg.Section("").Key("INT64").InInt64(10, []int64{10, 20, 30}) -v = cfg.Section("").Key("UINT").InUint(4, []int{3, 6, 9}) -v = cfg.Section("").Key("UINT64").InUint64(8, []int64{3, 6, 9}) -v = cfg.Section("").Key("TIME").InTimeFormat(time.RFC3339, time.Now(), []time.Time{time1, time2, time3}) -v = cfg.Section("").Key("TIME").InTime(time.Now(), []time.Time{time1, time2, time3}) // RFC3339 -``` - -如果获取到的值不是候选值的任意一个,则会返回默认值,而默认值不需要是候选值中的一员。 - -验证获取的值是否在指定范围内: - -```go -vals = cfg.Section("").Key("FLOAT64").RangeFloat64(0.0, 1.1, 2.2) -vals = cfg.Section("").Key("INT").RangeInt(0, 10, 20) -vals = cfg.Section("").Key("INT64").RangeInt64(0, 10, 20) -vals = cfg.Section("").Key("UINT").RangeUint(0, 3, 9) -vals = cfg.Section("").Key("UINT64").RangeUint64(0, 3, 9) -vals = cfg.Section("").Key("TIME").RangeTimeFormat(time.RFC3339, time.Now(), minTime, maxTime) -vals = cfg.Section("").Key("TIME").RangeTime(time.Now(), minTime, maxTime) // RFC3339 -``` - -##### 自动分割键值到切片(slice) - -当存在无效输入时,使用零值代替: - -```go -// Input: 1.1, 2.2, 3.3, 4.4 -> [1.1 2.2 3.3 4.4] -// Input: how, 2.2, are, you -> [0.0 2.2 0.0 0.0] -vals = cfg.Section("").Key("STRINGS").Strings(",") -vals = cfg.Section("").Key("FLOAT64S").Float64s(",") -vals = cfg.Section("").Key("INTS").Ints(",") -vals = cfg.Section("").Key("INT64S").Int64s(",") -vals = cfg.Section("").Key("UINTS").Uints(",") -vals = cfg.Section("").Key("UINT64S").Uint64s(",") -vals = cfg.Section("").Key("TIMES").Times(",") -``` - -从结果切片中剔除无效输入: - -```go -// Input: 1.1, 2.2, 3.3, 4.4 -> [1.1 2.2 3.3 4.4] -// Input: how, 2.2, are, you -> [2.2] -vals = cfg.Section("").Key("FLOAT64S").ValidFloat64s(",") -vals = cfg.Section("").Key("INTS").ValidInts(",") -vals = cfg.Section("").Key("INT64S").ValidInt64s(",") -vals = cfg.Section("").Key("UINTS").ValidUints(",") -vals = cfg.Section("").Key("UINT64S").ValidUint64s(",") -vals = cfg.Section("").Key("TIMES").ValidTimes(",") -``` - -当存在无效输入时,直接返回错误: - -```go -// Input: 1.1, 2.2, 3.3, 4.4 -> [1.1 2.2 3.3 4.4] -// Input: how, 2.2, are, you -> error -vals = cfg.Section("").Key("FLOAT64S").StrictFloat64s(",") -vals = cfg.Section("").Key("INTS").StrictInts(",") -vals = cfg.Section("").Key("INT64S").StrictInt64s(",") -vals = cfg.Section("").Key("UINTS").StrictUints(",") -vals = cfg.Section("").Key("UINT64S").StrictUint64s(",") -vals = cfg.Section("").Key("TIMES").StrictTimes(",") -``` - -### 保存配置 - -终于到了这个时刻,是时候保存一下配置了。 - -比较原始的做法是输出配置到某个文件: - -```go -// ... -err = cfg.SaveTo("my.ini") -err = cfg.SaveToIndent("my.ini", "\t") -``` - -另一个比较高级的做法是写入到任何实现 `io.Writer` 接口的对象中: - -```go -// ... -cfg.WriteTo(writer) -cfg.WriteToIndent(writer, "\t") -``` - -默认情况下,空格将被用于对齐键值之间的等号以美化输出结果,以下代码可以禁用该功能: - -```go -ini.PrettyFormat = false -``` - -## 高级用法 - -### 递归读取键值 - -在获取所有键值的过程中,特殊语法 `%()s` 会被应用,其中 `` 可以是相同分区或者默认分区下的键名。字符串 `%()s` 会被相应的键值所替代,如果指定的键不存在,则会用空字符串替代。您可以最多使用 99 层的递归嵌套。 - -```ini -NAME = ini - -[author] -NAME = Unknwon -GITHUB = https://github.com/%(NAME)s - -[package] -FULL_NAME = github.com/go-ini/%(NAME)s -``` - -```go -cfg.Section("author").Key("GITHUB").String() // https://github.com/Unknwon -cfg.Section("package").Key("FULL_NAME").String() // github.com/go-ini/ini -``` - -### 读取父子分区 - -您可以在分区名称中使用 `.` 来表示两个或多个分区之间的父子关系。如果某个键在子分区中不存在,则会去它的父分区中再次寻找,直到没有父分区为止。 - -```ini -NAME = ini -VERSION = v1 -IMPORT_PATH = gopkg.in/%(NAME)s.%(VERSION)s - -[package] -CLONE_URL = https://%(IMPORT_PATH)s - -[package.sub] -``` - -```go -cfg.Section("package.sub").Key("CLONE_URL").String() // https://gopkg.in/ini.v1 -``` - -#### 获取上级父分区下的所有键名 - -```go -cfg.Section("package.sub").ParentKeys() // ["CLONE_URL"] -``` - -### 无法解析的分区 - -如果遇到一些比较特殊的分区,它们不包含常见的键值对,而是没有固定格式的纯文本,则可以使用 `LoadOptions.UnparsableSections` 进行处理: - -```go -cfg, err := LoadSources(LoadOptions{UnparseableSections: []string{"COMMENTS"}}, `[COMMENTS] -<1> This slide has the fuel listed in the wrong units `)) - -body := cfg.Section("COMMENTS").Body() - -/* --- start --- -<1> This slide has the fuel listed in the wrong units ------- end --- */ -``` - -### 读取自增键名 - -如果数据源中的键名为 `-`,则认为该键使用了自增键名的特殊语法。计数器从 1 开始,并且分区之间是相互独立的。 - -```ini -[features] --: Support read/write comments of keys and sections --: Support auto-increment of key names --: Support load multiple files to overwrite key values -``` - -```go -cfg.Section("features").KeyStrings() // []{"#1", "#2", "#3"} -``` - -### 映射到结构 - -想要使用更加面向对象的方式玩转 INI 吗?好主意。 - -```ini -Name = Unknwon -age = 21 -Male = true -Born = 1993-01-01T20:17:05Z - -[Note] -Content = Hi is a good man! -Cities = HangZhou, Boston -``` - -```go -type Note struct { - Content string - Cities []string -} - -type Person struct { - Name string - Age int `ini:"age"` - Male bool - Born time.Time - Note - Created time.Time `ini:"-"` -} - -func main() { - cfg, err := ini.Load("path/to/ini") - // ... - p := new(Person) - err = cfg.MapTo(p) - // ... - - // 一切竟可以如此的简单。 - err = ini.MapTo(p, "path/to/ini") - // ... - - // 嗯哼?只需要映射一个分区吗? - n := new(Note) - err = cfg.Section("Note").MapTo(n) - // ... -} -``` - -结构的字段怎么设置默认值呢?很简单,只要在映射之前对指定字段进行赋值就可以了。如果键未找到或者类型错误,该值不会发生改变。 - -```go -// ... -p := &Person{ - Name: "Joe", -} -// ... -``` - -这样玩 INI 真的好酷啊!然而,如果不能还给我原来的配置文件,有什么卵用? - -### 从结构反射 - -可是,我有说不能吗? - -```go -type Embeded struct { - Dates []time.Time `delim:"|"` - Places []string `ini:"places,omitempty"` - None []int `ini:",omitempty"` -} - -type Author struct { - Name string `ini:"NAME"` - Male bool - Age int - GPA float64 - NeverMind string `ini:"-"` - *Embeded -} - -func main() { - a := &Author{"Unknwon", true, 21, 2.8, "", - &Embeded{ - []time.Time{time.Now(), time.Now()}, - []string{"HangZhou", "Boston"}, - []int{}, - }} - cfg := ini.Empty() - err = ini.ReflectFrom(cfg, a) - // ... -} -``` - -瞧瞧,奇迹发生了。 - -```ini -NAME = Unknwon -Male = true -Age = 21 -GPA = 2.8 - -[Embeded] -Dates = 2015-08-07T22:14:22+08:00|2015-08-07T22:14:22+08:00 -places = HangZhou,Boston -``` - -#### 名称映射器(Name Mapper) - -为了节省您的时间并简化代码,本库支持类型为 [`NameMapper`](https://gowalker.org/gopkg.in/ini.v1#NameMapper) 的名称映射器,该映射器负责结构字段名与分区名和键名之间的映射。 - -目前有 2 款内置的映射器: - -- `AllCapsUnderscore`:该映射器将字段名转换至格式 `ALL_CAPS_UNDERSCORE` 后再去匹配分区名和键名。 -- `TitleUnderscore`:该映射器将字段名转换至格式 `title_underscore` 后再去匹配分区名和键名。 - -使用方法: - -```go -type Info struct{ - PackageName string -} - -func main() { - err = ini.MapToWithMapper(&Info{}, ini.TitleUnderscore, []byte("package_name=ini")) - // ... - - cfg, err := ini.Load([]byte("PACKAGE_NAME=ini")) - // ... - info := new(Info) - cfg.NameMapper = ini.AllCapsUnderscore - err = cfg.MapTo(info) - // ... -} -``` - -使用函数 `ini.ReflectFromWithMapper` 时也可应用相同的规则。 - -#### 值映射器(Value Mapper) - -值映射器允许使用一个自定义函数自动展开值的具体内容,例如:运行时获取环境变量: - -```go -type Env struct { - Foo string `ini:"foo"` -} - -func main() { - cfg, err := ini.Load([]byte("[env]\nfoo = ${MY_VAR}\n") - cfg.ValueMapper = os.ExpandEnv - // ... - env := &Env{} - err = cfg.Section("env").MapTo(env) -} -``` - -本例中,`env.Foo` 将会是运行时所获取到环境变量 `MY_VAR` 的值。 - -#### 映射/反射的其它说明 - -任何嵌入的结构都会被默认认作一个不同的分区,并且不会自动产生所谓的父子分区关联: - -```go -type Child struct { - Age string -} - -type Parent struct { - Name string - Child -} - -type Config struct { - City string - Parent -} -``` - -示例配置文件: - -```ini -City = Boston - -[Parent] -Name = Unknwon - -[Child] -Age = 21 -``` - -很好,但是,我就是要嵌入结构也在同一个分区。好吧,你爹是李刚! - -```go -type Child struct { - Age string -} - -type Parent struct { - Name string - Child `ini:"Parent"` -} - -type Config struct { - City string - Parent -} -``` - -示例配置文件: - -```ini -City = Boston - -[Parent] -Name = Unknwon -Age = 21 -``` - -## 获取帮助 - -- [API 文档](https://gowalker.org/gopkg.in/ini.v1) -- [创建工单](https://github.com/go-ini/ini/issues/new) - -## 常见问题 - -### 字段 `BlockMode` 是什么? - -默认情况下,本库会在您进行读写操作时采用锁机制来确保数据时间。但在某些情况下,您非常确定只进行读操作。此时,您可以通过设置 `cfg.BlockMode = false` 来将读操作提升大约 **50-70%** 的性能。 - -### 为什么要写另一个 INI 解析库? - -许多人都在使用我的 [goconfig](https://github.com/Unknwon/goconfig) 来完成对 INI 文件的操作,但我希望使用更加 Go 风格的代码。并且当您设置 `cfg.BlockMode = false` 时,会有大约 **10-30%** 的性能提升。 - -为了做出这些改变,我必须对 API 进行破坏,所以新开一个仓库是最安全的做法。除此之外,本库直接使用 `gopkg.in` 来进行版本化发布。(其实真相是导入路径更短了) diff --git a/vendor/gopkg.in/ini.v1/error.go b/vendor/gopkg.in/ini.v1/error.go deleted file mode 100644 index 80afe7431..000000000 --- a/vendor/gopkg.in/ini.v1/error.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2016 Unknwon -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package ini - -import ( - "fmt" -) - -type ErrDelimiterNotFound struct { - Line string -} - -func IsErrDelimiterNotFound(err error) bool { - _, ok := err.(ErrDelimiterNotFound) - return ok -} - -func (err ErrDelimiterNotFound) Error() string { - return fmt.Sprintf("key-value delimiter not found: %s", err.Line) -} diff --git a/vendor/gopkg.in/ini.v1/ini.go b/vendor/gopkg.in/ini.v1/ini.go deleted file mode 100644 index 8a448d7a2..000000000 --- a/vendor/gopkg.in/ini.v1/ini.go +++ /dev/null @@ -1,549 +0,0 @@ -// Copyright 2014 Unknwon -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -// Package ini provides INI file read and write functionality in Go. -package ini - -import ( - "bytes" - "errors" - "fmt" - "io" - "io/ioutil" - "os" - "regexp" - "runtime" - "strconv" - "strings" - "sync" - "time" -) - -const ( - // Name for default section. You can use this constant or the string literal. - // In most of cases, an empty string is all you need to access the section. - DEFAULT_SECTION = "DEFAULT" - - // Maximum allowed depth when recursively substituing variable names. - _DEPTH_VALUES = 99 - _VERSION = "1.25.2" -) - -// Version returns current package version literal. -func Version() string { - return _VERSION -} - -var ( - // Delimiter to determine or compose a new line. - // This variable will be changed to "\r\n" automatically on Windows - // at package init time. - LineBreak = "\n" - - // Variable regexp pattern: %(variable)s - varPattern = regexp.MustCompile(`%\(([^\)]+)\)s`) - - // Indicate whether to align "=" sign with spaces to produce pretty output - // or reduce all possible spaces for compact format. - PrettyFormat = true - - // Explicitly write DEFAULT section header - DefaultHeader = false -) - -func init() { - if runtime.GOOS == "windows" { - LineBreak = "\r\n" - } -} - -func inSlice(str string, s []string) bool { - for _, v := range s { - if str == v { - return true - } - } - return false -} - -// dataSource is an interface that returns object which can be read and closed. -type dataSource interface { - ReadCloser() (io.ReadCloser, error) -} - -// sourceFile represents an object that contains content on the local file system. -type sourceFile struct { - name string -} - -func (s sourceFile) ReadCloser() (_ io.ReadCloser, err error) { - return os.Open(s.name) -} - -type bytesReadCloser struct { - reader io.Reader -} - -func (rc *bytesReadCloser) Read(p []byte) (n int, err error) { - return rc.reader.Read(p) -} - -func (rc *bytesReadCloser) Close() error { - return nil -} - -// sourceData represents an object that contains content in memory. -type sourceData struct { - data []byte -} - -func (s *sourceData) ReadCloser() (io.ReadCloser, error) { - return ioutil.NopCloser(bytes.NewReader(s.data)), nil -} - -// sourceReadCloser represents an input stream with Close method. -type sourceReadCloser struct { - reader io.ReadCloser -} - -func (s *sourceReadCloser) ReadCloser() (io.ReadCloser, error) { - return s.reader, nil -} - -// File represents a combination of a or more INI file(s) in memory. -type File struct { - // Should make things safe, but sometimes doesn't matter. - BlockMode bool - // Make sure data is safe in multiple goroutines. - lock sync.RWMutex - - // Allow combination of multiple data sources. - dataSources []dataSource - // Actual data is stored here. - sections map[string]*Section - - // To keep data in order. - sectionList []string - - options LoadOptions - - NameMapper - ValueMapper -} - -// newFile initializes File object with given data sources. -func newFile(dataSources []dataSource, opts LoadOptions) *File { - return &File{ - BlockMode: true, - dataSources: dataSources, - sections: make(map[string]*Section), - sectionList: make([]string, 0, 10), - options: opts, - } -} - -func parseDataSource(source interface{}) (dataSource, error) { - switch s := source.(type) { - case string: - return sourceFile{s}, nil - case []byte: - return &sourceData{s}, nil - case io.ReadCloser: - return &sourceReadCloser{s}, nil - default: - return nil, fmt.Errorf("error parsing data source: unknown type '%s'", s) - } -} - -type LoadOptions struct { - // Loose indicates whether the parser should ignore nonexistent files or return error. - Loose bool - // Insensitive indicates whether the parser forces all section and key names to lowercase. - Insensitive bool - // IgnoreContinuation indicates whether to ignore continuation lines while parsing. - IgnoreContinuation bool - // AllowBooleanKeys indicates whether to allow boolean type keys or treat as value is missing. - // This type of keys are mostly used in my.cnf. - AllowBooleanKeys bool - // AllowShadows indicates whether to keep track of keys with same name under same section. - AllowShadows bool - // Some INI formats allow group blocks that store a block of raw content that doesn't otherwise - // conform to key/value pairs. Specify the names of those blocks here. - UnparseableSections []string -} - -func LoadSources(opts LoadOptions, source interface{}, others ...interface{}) (_ *File, err error) { - sources := make([]dataSource, len(others)+1) - sources[0], err = parseDataSource(source) - if err != nil { - return nil, err - } - for i := range others { - sources[i+1], err = parseDataSource(others[i]) - if err != nil { - return nil, err - } - } - f := newFile(sources, opts) - if err = f.Reload(); err != nil { - return nil, err - } - return f, nil -} - -// Load loads and parses from INI data sources. -// Arguments can be mixed of file name with string type, or raw data in []byte. -// It will return error if list contains nonexistent files. -func Load(source interface{}, others ...interface{}) (*File, error) { - return LoadSources(LoadOptions{}, source, others...) -} - -// LooseLoad has exactly same functionality as Load function -// except it ignores nonexistent files instead of returning error. -func LooseLoad(source interface{}, others ...interface{}) (*File, error) { - return LoadSources(LoadOptions{Loose: true}, source, others...) -} - -// InsensitiveLoad has exactly same functionality as Load function -// except it forces all section and key names to be lowercased. -func InsensitiveLoad(source interface{}, others ...interface{}) (*File, error) { - return LoadSources(LoadOptions{Insensitive: true}, source, others...) -} - -// InsensitiveLoad has exactly same functionality as Load function -// except it allows have shadow keys. -func ShadowLoad(source interface{}, others ...interface{}) (*File, error) { - return LoadSources(LoadOptions{AllowShadows: true}, source, others...) -} - -// Empty returns an empty file object. -func Empty() *File { - // Ignore error here, we sure our data is good. - f, _ := Load([]byte("")) - return f -} - -// NewSection creates a new section. -func (f *File) NewSection(name string) (*Section, error) { - if len(name) == 0 { - return nil, errors.New("error creating new section: empty section name") - } else if f.options.Insensitive && name != DEFAULT_SECTION { - name = strings.ToLower(name) - } - - if f.BlockMode { - f.lock.Lock() - defer f.lock.Unlock() - } - - if inSlice(name, f.sectionList) { - return f.sections[name], nil - } - - f.sectionList = append(f.sectionList, name) - f.sections[name] = newSection(f, name) - return f.sections[name], nil -} - -// NewRawSection creates a new section with an unparseable body. -func (f *File) NewRawSection(name, body string) (*Section, error) { - section, err := f.NewSection(name) - if err != nil { - return nil, err - } - - section.isRawSection = true - section.rawBody = body - return section, nil -} - -// NewSections creates a list of sections. -func (f *File) NewSections(names ...string) (err error) { - for _, name := range names { - if _, err = f.NewSection(name); err != nil { - return err - } - } - return nil -} - -// GetSection returns section by given name. -func (f *File) GetSection(name string) (*Section, error) { - if len(name) == 0 { - name = DEFAULT_SECTION - } else if f.options.Insensitive { - name = strings.ToLower(name) - } - - if f.BlockMode { - f.lock.RLock() - defer f.lock.RUnlock() - } - - sec := f.sections[name] - if sec == nil { - return nil, fmt.Errorf("section '%s' does not exist", name) - } - return sec, nil -} - -// Section assumes named section exists and returns a zero-value when not. -func (f *File) Section(name string) *Section { - sec, err := f.GetSection(name) - if err != nil { - // Note: It's OK here because the only possible error is empty section name, - // but if it's empty, this piece of code won't be executed. - sec, _ = f.NewSection(name) - return sec - } - return sec -} - -// Section returns list of Section. -func (f *File) Sections() []*Section { - sections := make([]*Section, len(f.sectionList)) - for i := range f.sectionList { - sections[i] = f.Section(f.sectionList[i]) - } - return sections -} - -// SectionStrings returns list of section names. -func (f *File) SectionStrings() []string { - list := make([]string, len(f.sectionList)) - copy(list, f.sectionList) - return list -} - -// DeleteSection deletes a section. -func (f *File) DeleteSection(name string) { - if f.BlockMode { - f.lock.Lock() - defer f.lock.Unlock() - } - - if len(name) == 0 { - name = DEFAULT_SECTION - } - - for i, s := range f.sectionList { - if s == name { - f.sectionList = append(f.sectionList[:i], f.sectionList[i+1:]...) - delete(f.sections, name) - return - } - } -} - -func (f *File) reload(s dataSource) error { - r, err := s.ReadCloser() - if err != nil { - return err - } - defer r.Close() - - return f.parse(r) -} - -// Reload reloads and parses all data sources. -func (f *File) Reload() (err error) { - for _, s := range f.dataSources { - if err = f.reload(s); err != nil { - // In loose mode, we create an empty default section for nonexistent files. - if os.IsNotExist(err) && f.options.Loose { - f.parse(bytes.NewBuffer(nil)) - continue - } - return err - } - } - return nil -} - -// Append appends one or more data sources and reloads automatically. -func (f *File) Append(source interface{}, others ...interface{}) error { - ds, err := parseDataSource(source) - if err != nil { - return err - } - f.dataSources = append(f.dataSources, ds) - for _, s := range others { - ds, err = parseDataSource(s) - if err != nil { - return err - } - f.dataSources = append(f.dataSources, ds) - } - return f.Reload() -} - -// WriteToIndent writes content into io.Writer with given indention. -// If PrettyFormat has been set to be true, -// it will align "=" sign with spaces under each section. -func (f *File) WriteToIndent(w io.Writer, indent string) (n int64, err error) { - equalSign := "=" - if PrettyFormat { - equalSign = " = " - } - - // Use buffer to make sure target is safe until finish encoding. - buf := bytes.NewBuffer(nil) - for i, sname := range f.sectionList { - sec := f.Section(sname) - if len(sec.Comment) > 0 { - if sec.Comment[0] != '#' && sec.Comment[0] != ';' { - sec.Comment = "; " + sec.Comment - } - if _, err = buf.WriteString(sec.Comment + LineBreak); err != nil { - return 0, err - } - } - - if i > 0 || DefaultHeader { - if _, err = buf.WriteString("[" + sname + "]" + LineBreak); err != nil { - return 0, err - } - } else { - // Write nothing if default section is empty - if len(sec.keyList) == 0 { - continue - } - } - - if sec.isRawSection { - if _, err = buf.WriteString(sec.rawBody); err != nil { - return 0, err - } - continue - } - - // Count and generate alignment length and buffer spaces using the - // longest key. Keys may be modifed if they contain certain characters so - // we need to take that into account in our calculation. - alignLength := 0 - if PrettyFormat { - for _, kname := range sec.keyList { - keyLength := len(kname) - // First case will surround key by ` and second by """ - if strings.ContainsAny(kname, "\"=:") { - keyLength += 2 - } else if strings.Contains(kname, "`") { - keyLength += 6 - } - - if keyLength > alignLength { - alignLength = keyLength - } - } - } - alignSpaces := bytes.Repeat([]byte(" "), alignLength) - - KEY_LIST: - for _, kname := range sec.keyList { - key := sec.Key(kname) - if len(key.Comment) > 0 { - if len(indent) > 0 && sname != DEFAULT_SECTION { - buf.WriteString(indent) - } - if key.Comment[0] != '#' && key.Comment[0] != ';' { - key.Comment = "; " + key.Comment - } - if _, err = buf.WriteString(key.Comment + LineBreak); err != nil { - return 0, err - } - } - - if len(indent) > 0 && sname != DEFAULT_SECTION { - buf.WriteString(indent) - } - - switch { - case key.isAutoIncrement: - kname = "-" - case strings.ContainsAny(kname, "\"=:"): - kname = "`" + kname + "`" - case strings.Contains(kname, "`"): - kname = `"""` + kname + `"""` - } - - for _, val := range key.ValueWithShadows() { - if _, err = buf.WriteString(kname); err != nil { - return 0, err - } - - if key.isBooleanType { - if kname != sec.keyList[len(sec.keyList)-1] { - buf.WriteString(LineBreak) - } - continue KEY_LIST - } - - // Write out alignment spaces before "=" sign - if PrettyFormat { - buf.Write(alignSpaces[:alignLength-len(kname)]) - } - - // In case key value contains "\n", "`", "\"", "#" or ";" - if strings.ContainsAny(val, "\n`") { - val = `"""` + val + `"""` - } else if strings.ContainsAny(val, "#;") { - val = "`" + val + "`" - } - if _, err = buf.WriteString(equalSign + val + LineBreak); err != nil { - return 0, err - } - } - } - - // Put a line between sections - if _, err = buf.WriteString(LineBreak); err != nil { - return 0, err - } - } - - return buf.WriteTo(w) -} - -// WriteTo writes file content into io.Writer. -func (f *File) WriteTo(w io.Writer) (int64, error) { - return f.WriteToIndent(w, "") -} - -// SaveToIndent writes content to file system with given value indention. -func (f *File) SaveToIndent(filename, indent string) error { - // Note: Because we are truncating with os.Create, - // so it's safer to save to a temporary file location and rename afte done. - tmpPath := filename + "." + strconv.Itoa(time.Now().Nanosecond()) + ".tmp" - defer os.Remove(tmpPath) - - fw, err := os.Create(tmpPath) - if err != nil { - return err - } - - if _, err = f.WriteToIndent(fw, indent); err != nil { - fw.Close() - return err - } - fw.Close() - - // Remove old file and rename the new one. - os.Remove(filename) - return os.Rename(tmpPath, filename) -} - -// SaveTo writes content to file system. -func (f *File) SaveTo(filename string) error { - return f.SaveToIndent(filename, "") -} diff --git a/vendor/gopkg.in/ini.v1/key.go b/vendor/gopkg.in/ini.v1/key.go deleted file mode 100644 index 7058dc99e..000000000 --- a/vendor/gopkg.in/ini.v1/key.go +++ /dev/null @@ -1,680 +0,0 @@ -// Copyright 2014 Unknwon -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package ini - -import ( - "errors" - "fmt" - "strconv" - "strings" - "time" -) - -// Key represents a key under a section. -type Key struct { - s *Section - name string - value string - isAutoIncrement bool - isBooleanType bool - - isShadow bool - shadows []*Key - - Comment string -} - -// newKey simply return a key object with given values. -func newKey(s *Section, name, val string) *Key { - return &Key{ - s: s, - name: name, - value: val, - } -} - -func (k *Key) addShadow(val string) error { - if k.isShadow { - return errors.New("cannot add shadow to another shadow key") - } else if k.isAutoIncrement || k.isBooleanType { - return errors.New("cannot add shadow to auto-increment or boolean key") - } - - shadow := newKey(k.s, k.name, val) - shadow.isShadow = true - k.shadows = append(k.shadows, shadow) - return nil -} - -// AddShadow adds a new shadow key to itself. -func (k *Key) AddShadow(val string) error { - if !k.s.f.options.AllowShadows { - return errors.New("shadow key is not allowed") - } - return k.addShadow(val) -} - -// ValueMapper represents a mapping function for values, e.g. os.ExpandEnv -type ValueMapper func(string) string - -// Name returns name of key. -func (k *Key) Name() string { - return k.name -} - -// Value returns raw value of key for performance purpose. -func (k *Key) Value() string { - return k.value -} - -// ValueWithShadows returns raw values of key and its shadows if any. -func (k *Key) ValueWithShadows() []string { - if len(k.shadows) == 0 { - return []string{k.value} - } - vals := make([]string, len(k.shadows)+1) - vals[0] = k.value - for i := range k.shadows { - vals[i+1] = k.shadows[i].value - } - return vals -} - -// String returns string representation of value. -func (k *Key) String() string { - val := k.value - if k.s.f.ValueMapper != nil { - val = k.s.f.ValueMapper(val) - } - if strings.Index(val, "%") == -1 { - return val - } - - for i := 0; i < _DEPTH_VALUES; i++ { - vr := varPattern.FindString(val) - if len(vr) == 0 { - break - } - - // Take off leading '%(' and trailing ')s'. - noption := strings.TrimLeft(vr, "%(") - noption = strings.TrimRight(noption, ")s") - - // Search in the same section. - nk, err := k.s.GetKey(noption) - if err != nil { - // Search again in default section. - nk, _ = k.s.f.Section("").GetKey(noption) - } - - // Substitute by new value and take off leading '%(' and trailing ')s'. - val = strings.Replace(val, vr, nk.value, -1) - } - return val -} - -// Validate accepts a validate function which can -// return modifed result as key value. -func (k *Key) Validate(fn func(string) string) string { - return fn(k.String()) -} - -// parseBool returns the boolean value represented by the string. -// -// It accepts 1, t, T, TRUE, true, True, YES, yes, Yes, y, ON, on, On, -// 0, f, F, FALSE, false, False, NO, no, No, n, OFF, off, Off. -// Any other value returns an error. -func parseBool(str string) (value bool, err error) { - switch str { - case "1", "t", "T", "true", "TRUE", "True", "YES", "yes", "Yes", "y", "ON", "on", "On": - return true, nil - case "0", "f", "F", "false", "FALSE", "False", "NO", "no", "No", "n", "OFF", "off", "Off": - return false, nil - } - return false, fmt.Errorf("parsing \"%s\": invalid syntax", str) -} - -// Bool returns bool type value. -func (k *Key) Bool() (bool, error) { - return parseBool(k.String()) -} - -// Float64 returns float64 type value. -func (k *Key) Float64() (float64, error) { - return strconv.ParseFloat(k.String(), 64) -} - -// Int returns int type value. -func (k *Key) Int() (int, error) { - return strconv.Atoi(k.String()) -} - -// Int64 returns int64 type value. -func (k *Key) Int64() (int64, error) { - return strconv.ParseInt(k.String(), 10, 64) -} - -// Uint returns uint type valued. -func (k *Key) Uint() (uint, error) { - u, e := strconv.ParseUint(k.String(), 10, 64) - return uint(u), e -} - -// Uint64 returns uint64 type value. -func (k *Key) Uint64() (uint64, error) { - return strconv.ParseUint(k.String(), 10, 64) -} - -// Duration returns time.Duration type value. -func (k *Key) Duration() (time.Duration, error) { - return time.ParseDuration(k.String()) -} - -// TimeFormat parses with given format and returns time.Time type value. -func (k *Key) TimeFormat(format string) (time.Time, error) { - return time.Parse(format, k.String()) -} - -// Time parses with RFC3339 format and returns time.Time type value. -func (k *Key) Time() (time.Time, error) { - return k.TimeFormat(time.RFC3339) -} - -// MustString returns default value if key value is empty. -func (k *Key) MustString(defaultVal string) string { - val := k.String() - if len(val) == 0 { - k.value = defaultVal - return defaultVal - } - return val -} - -// MustBool always returns value without error, -// it returns false if error occurs. -func (k *Key) MustBool(defaultVal ...bool) bool { - val, err := k.Bool() - if len(defaultVal) > 0 && err != nil { - k.value = strconv.FormatBool(defaultVal[0]) - return defaultVal[0] - } - return val -} - -// MustFloat64 always returns value without error, -// it returns 0.0 if error occurs. -func (k *Key) MustFloat64(defaultVal ...float64) float64 { - val, err := k.Float64() - if len(defaultVal) > 0 && err != nil { - k.value = strconv.FormatFloat(defaultVal[0], 'f', -1, 64) - return defaultVal[0] - } - return val -} - -// MustInt always returns value without error, -// it returns 0 if error occurs. -func (k *Key) MustInt(defaultVal ...int) int { - val, err := k.Int() - if len(defaultVal) > 0 && err != nil { - k.value = strconv.FormatInt(int64(defaultVal[0]), 10) - return defaultVal[0] - } - return val -} - -// MustInt64 always returns value without error, -// it returns 0 if error occurs. -func (k *Key) MustInt64(defaultVal ...int64) int64 { - val, err := k.Int64() - if len(defaultVal) > 0 && err != nil { - k.value = strconv.FormatInt(defaultVal[0], 10) - return defaultVal[0] - } - return val -} - -// MustUint always returns value without error, -// it returns 0 if error occurs. -func (k *Key) MustUint(defaultVal ...uint) uint { - val, err := k.Uint() - if len(defaultVal) > 0 && err != nil { - k.value = strconv.FormatUint(uint64(defaultVal[0]), 10) - return defaultVal[0] - } - return val -} - -// MustUint64 always returns value without error, -// it returns 0 if error occurs. -func (k *Key) MustUint64(defaultVal ...uint64) uint64 { - val, err := k.Uint64() - if len(defaultVal) > 0 && err != nil { - k.value = strconv.FormatUint(defaultVal[0], 10) - return defaultVal[0] - } - return val -} - -// MustDuration always returns value without error, -// it returns zero value if error occurs. -func (k *Key) MustDuration(defaultVal ...time.Duration) time.Duration { - val, err := k.Duration() - if len(defaultVal) > 0 && err != nil { - k.value = defaultVal[0].String() - return defaultVal[0] - } - return val -} - -// MustTimeFormat always parses with given format and returns value without error, -// it returns zero value if error occurs. -func (k *Key) MustTimeFormat(format string, defaultVal ...time.Time) time.Time { - val, err := k.TimeFormat(format) - if len(defaultVal) > 0 && err != nil { - k.value = defaultVal[0].Format(format) - return defaultVal[0] - } - return val -} - -// MustTime always parses with RFC3339 format and returns value without error, -// it returns zero value if error occurs. -func (k *Key) MustTime(defaultVal ...time.Time) time.Time { - return k.MustTimeFormat(time.RFC3339, defaultVal...) -} - -// In always returns value without error, -// it returns default value if error occurs or doesn't fit into candidates. -func (k *Key) In(defaultVal string, candidates []string) string { - val := k.String() - for _, cand := range candidates { - if val == cand { - return val - } - } - return defaultVal -} - -// InFloat64 always returns value without error, -// it returns default value if error occurs or doesn't fit into candidates. -func (k *Key) InFloat64(defaultVal float64, candidates []float64) float64 { - val := k.MustFloat64() - for _, cand := range candidates { - if val == cand { - return val - } - } - return defaultVal -} - -// InInt always returns value without error, -// it returns default value if error occurs or doesn't fit into candidates. -func (k *Key) InInt(defaultVal int, candidates []int) int { - val := k.MustInt() - for _, cand := range candidates { - if val == cand { - return val - } - } - return defaultVal -} - -// InInt64 always returns value without error, -// it returns default value if error occurs or doesn't fit into candidates. -func (k *Key) InInt64(defaultVal int64, candidates []int64) int64 { - val := k.MustInt64() - for _, cand := range candidates { - if val == cand { - return val - } - } - return defaultVal -} - -// InUint always returns value without error, -// it returns default value if error occurs or doesn't fit into candidates. -func (k *Key) InUint(defaultVal uint, candidates []uint) uint { - val := k.MustUint() - for _, cand := range candidates { - if val == cand { - return val - } - } - return defaultVal -} - -// InUint64 always returns value without error, -// it returns default value if error occurs or doesn't fit into candidates. -func (k *Key) InUint64(defaultVal uint64, candidates []uint64) uint64 { - val := k.MustUint64() - for _, cand := range candidates { - if val == cand { - return val - } - } - return defaultVal -} - -// InTimeFormat always parses with given format and returns value without error, -// it returns default value if error occurs or doesn't fit into candidates. -func (k *Key) InTimeFormat(format string, defaultVal time.Time, candidates []time.Time) time.Time { - val := k.MustTimeFormat(format) - for _, cand := range candidates { - if val == cand { - return val - } - } - return defaultVal -} - -// InTime always parses with RFC3339 format and returns value without error, -// it returns default value if error occurs or doesn't fit into candidates. -func (k *Key) InTime(defaultVal time.Time, candidates []time.Time) time.Time { - return k.InTimeFormat(time.RFC3339, defaultVal, candidates) -} - -// RangeFloat64 checks if value is in given range inclusively, -// and returns default value if it's not. -func (k *Key) RangeFloat64(defaultVal, min, max float64) float64 { - val := k.MustFloat64() - if val < min || val > max { - return defaultVal - } - return val -} - -// RangeInt checks if value is in given range inclusively, -// and returns default value if it's not. -func (k *Key) RangeInt(defaultVal, min, max int) int { - val := k.MustInt() - if val < min || val > max { - return defaultVal - } - return val -} - -// RangeInt64 checks if value is in given range inclusively, -// and returns default value if it's not. -func (k *Key) RangeInt64(defaultVal, min, max int64) int64 { - val := k.MustInt64() - if val < min || val > max { - return defaultVal - } - return val -} - -// RangeTimeFormat checks if value with given format is in given range inclusively, -// and returns default value if it's not. -func (k *Key) RangeTimeFormat(format string, defaultVal, min, max time.Time) time.Time { - val := k.MustTimeFormat(format) - if val.Unix() < min.Unix() || val.Unix() > max.Unix() { - return defaultVal - } - return val -} - -// RangeTime checks if value with RFC3339 format is in given range inclusively, -// and returns default value if it's not. -func (k *Key) RangeTime(defaultVal, min, max time.Time) time.Time { - return k.RangeTimeFormat(time.RFC3339, defaultVal, min, max) -} - -// Strings returns list of string divided by given delimiter. -func (k *Key) Strings(delim string) []string { - str := k.String() - if len(str) == 0 { - return []string{} - } - - vals := strings.Split(str, delim) - for i := range vals { - vals[i] = strings.TrimSpace(vals[i]) - } - return vals -} - -// Float64s returns list of float64 divided by given delimiter. Any invalid input will be treated as zero value. -func (k *Key) Float64s(delim string) []float64 { - vals, _ := k.getFloat64s(delim, true, false) - return vals -} - -// Ints returns list of int divided by given delimiter. Any invalid input will be treated as zero value. -func (k *Key) Ints(delim string) []int { - vals, _ := k.getInts(delim, true, false) - return vals -} - -// Int64s returns list of int64 divided by given delimiter. Any invalid input will be treated as zero value. -func (k *Key) Int64s(delim string) []int64 { - vals, _ := k.getInt64s(delim, true, false) - return vals -} - -// Uints returns list of uint divided by given delimiter. Any invalid input will be treated as zero value. -func (k *Key) Uints(delim string) []uint { - vals, _ := k.getUints(delim, true, false) - return vals -} - -// Uint64s returns list of uint64 divided by given delimiter. Any invalid input will be treated as zero value. -func (k *Key) Uint64s(delim string) []uint64 { - vals, _ := k.getUint64s(delim, true, false) - return vals -} - -// TimesFormat parses with given format and returns list of time.Time divided by given delimiter. -// Any invalid input will be treated as zero value (0001-01-01 00:00:00 +0000 UTC). -func (k *Key) TimesFormat(format, delim string) []time.Time { - vals, _ := k.getTimesFormat(format, delim, true, false) - return vals -} - -// Times parses with RFC3339 format and returns list of time.Time divided by given delimiter. -// Any invalid input will be treated as zero value (0001-01-01 00:00:00 +0000 UTC). -func (k *Key) Times(delim string) []time.Time { - return k.TimesFormat(time.RFC3339, delim) -} - -// ValidFloat64s returns list of float64 divided by given delimiter. If some value is not float, then -// it will not be included to result list. -func (k *Key) ValidFloat64s(delim string) []float64 { - vals, _ := k.getFloat64s(delim, false, false) - return vals -} - -// ValidInts returns list of int divided by given delimiter. If some value is not integer, then it will -// not be included to result list. -func (k *Key) ValidInts(delim string) []int { - vals, _ := k.getInts(delim, false, false) - return vals -} - -// ValidInt64s returns list of int64 divided by given delimiter. If some value is not 64-bit integer, -// then it will not be included to result list. -func (k *Key) ValidInt64s(delim string) []int64 { - vals, _ := k.getInt64s(delim, false, false) - return vals -} - -// ValidUints returns list of uint divided by given delimiter. If some value is not unsigned integer, -// then it will not be included to result list. -func (k *Key) ValidUints(delim string) []uint { - vals, _ := k.getUints(delim, false, false) - return vals -} - -// ValidUint64s returns list of uint64 divided by given delimiter. If some value is not 64-bit unsigned -// integer, then it will not be included to result list. -func (k *Key) ValidUint64s(delim string) []uint64 { - vals, _ := k.getUint64s(delim, false, false) - return vals -} - -// ValidTimesFormat parses with given format and returns list of time.Time divided by given delimiter. -func (k *Key) ValidTimesFormat(format, delim string) []time.Time { - vals, _ := k.getTimesFormat(format, delim, false, false) - return vals -} - -// ValidTimes parses with RFC3339 format and returns list of time.Time divided by given delimiter. -func (k *Key) ValidTimes(delim string) []time.Time { - return k.ValidTimesFormat(time.RFC3339, delim) -} - -// StrictFloat64s returns list of float64 divided by given delimiter or error on first invalid input. -func (k *Key) StrictFloat64s(delim string) ([]float64, error) { - return k.getFloat64s(delim, false, true) -} - -// StrictInts returns list of int divided by given delimiter or error on first invalid input. -func (k *Key) StrictInts(delim string) ([]int, error) { - return k.getInts(delim, false, true) -} - -// StrictInt64s returns list of int64 divided by given delimiter or error on first invalid input. -func (k *Key) StrictInt64s(delim string) ([]int64, error) { - return k.getInt64s(delim, false, true) -} - -// StrictUints returns list of uint divided by given delimiter or error on first invalid input. -func (k *Key) StrictUints(delim string) ([]uint, error) { - return k.getUints(delim, false, true) -} - -// StrictUint64s returns list of uint64 divided by given delimiter or error on first invalid input. -func (k *Key) StrictUint64s(delim string) ([]uint64, error) { - return k.getUint64s(delim, false, true) -} - -// StrictTimesFormat parses with given format and returns list of time.Time divided by given delimiter -// or error on first invalid input. -func (k *Key) StrictTimesFormat(format, delim string) ([]time.Time, error) { - return k.getTimesFormat(format, delim, false, true) -} - -// StrictTimes parses with RFC3339 format and returns list of time.Time divided by given delimiter -// or error on first invalid input. -func (k *Key) StrictTimes(delim string) ([]time.Time, error) { - return k.StrictTimesFormat(time.RFC3339, delim) -} - -// getFloat64s returns list of float64 divided by given delimiter. -func (k *Key) getFloat64s(delim string, addInvalid, returnOnInvalid bool) ([]float64, error) { - strs := k.Strings(delim) - vals := make([]float64, 0, len(strs)) - for _, str := range strs { - val, err := strconv.ParseFloat(str, 64) - if err != nil && returnOnInvalid { - return nil, err - } - if err == nil || addInvalid { - vals = append(vals, val) - } - } - return vals, nil -} - -// getInts returns list of int divided by given delimiter. -func (k *Key) getInts(delim string, addInvalid, returnOnInvalid bool) ([]int, error) { - strs := k.Strings(delim) - vals := make([]int, 0, len(strs)) - for _, str := range strs { - val, err := strconv.Atoi(str) - if err != nil && returnOnInvalid { - return nil, err - } - if err == nil || addInvalid { - vals = append(vals, val) - } - } - return vals, nil -} - -// getInt64s returns list of int64 divided by given delimiter. -func (k *Key) getInt64s(delim string, addInvalid, returnOnInvalid bool) ([]int64, error) { - strs := k.Strings(delim) - vals := make([]int64, 0, len(strs)) - for _, str := range strs { - val, err := strconv.ParseInt(str, 10, 64) - if err != nil && returnOnInvalid { - return nil, err - } - if err == nil || addInvalid { - vals = append(vals, val) - } - } - return vals, nil -} - -// getUints returns list of uint divided by given delimiter. -func (k *Key) getUints(delim string, addInvalid, returnOnInvalid bool) ([]uint, error) { - strs := k.Strings(delim) - vals := make([]uint, 0, len(strs)) - for _, str := range strs { - val, err := strconv.ParseUint(str, 10, 0) - if err != nil && returnOnInvalid { - return nil, err - } - if err == nil || addInvalid { - vals = append(vals, uint(val)) - } - } - return vals, nil -} - -// getUint64s returns list of uint64 divided by given delimiter. -func (k *Key) getUint64s(delim string, addInvalid, returnOnInvalid bool) ([]uint64, error) { - strs := k.Strings(delim) - vals := make([]uint64, 0, len(strs)) - for _, str := range strs { - val, err := strconv.ParseUint(str, 10, 64) - if err != nil && returnOnInvalid { - return nil, err - } - if err == nil || addInvalid { - vals = append(vals, val) - } - } - return vals, nil -} - -// getTimesFormat parses with given format and returns list of time.Time divided by given delimiter. -func (k *Key) getTimesFormat(format, delim string, addInvalid, returnOnInvalid bool) ([]time.Time, error) { - strs := k.Strings(delim) - vals := make([]time.Time, 0, len(strs)) - for _, str := range strs { - val, err := time.Parse(format, str) - if err != nil && returnOnInvalid { - return nil, err - } - if err == nil || addInvalid { - vals = append(vals, val) - } - } - return vals, nil -} - -// SetValue changes key value. -func (k *Key) SetValue(v string) { - if k.s.f.BlockMode { - k.s.f.lock.Lock() - defer k.s.f.lock.Unlock() - } - - k.value = v - k.s.keysHash[k.name] = v -} diff --git a/vendor/gopkg.in/ini.v1/parser.go b/vendor/gopkg.in/ini.v1/parser.go deleted file mode 100644 index 673ef80ca..000000000 --- a/vendor/gopkg.in/ini.v1/parser.go +++ /dev/null @@ -1,358 +0,0 @@ -// Copyright 2015 Unknwon -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package ini - -import ( - "bufio" - "bytes" - "fmt" - "io" - "strconv" - "strings" - "unicode" -) - -type tokenType int - -const ( - _TOKEN_INVALID tokenType = iota - _TOKEN_COMMENT - _TOKEN_SECTION - _TOKEN_KEY -) - -type parser struct { - buf *bufio.Reader - isEOF bool - count int - comment *bytes.Buffer -} - -func newParser(r io.Reader) *parser { - return &parser{ - buf: bufio.NewReader(r), - count: 1, - comment: &bytes.Buffer{}, - } -} - -// BOM handles header of UTF-8, UTF-16 LE and UTF-16 BE's BOM format. -// http://en.wikipedia.org/wiki/Byte_order_mark#Representations_of_byte_order_marks_by_encoding -func (p *parser) BOM() error { - mask, err := p.buf.Peek(2) - if err != nil && err != io.EOF { - return err - } else if len(mask) < 2 { - return nil - } - - switch { - case mask[0] == 254 && mask[1] == 255: - fallthrough - case mask[0] == 255 && mask[1] == 254: - p.buf.Read(mask) - case mask[0] == 239 && mask[1] == 187: - mask, err := p.buf.Peek(3) - if err != nil && err != io.EOF { - return err - } else if len(mask) < 3 { - return nil - } - if mask[2] == 191 { - p.buf.Read(mask) - } - } - return nil -} - -func (p *parser) readUntil(delim byte) ([]byte, error) { - data, err := p.buf.ReadBytes(delim) - if err != nil { - if err == io.EOF { - p.isEOF = true - } else { - return nil, err - } - } - return data, nil -} - -func cleanComment(in []byte) ([]byte, bool) { - i := bytes.IndexAny(in, "#;") - if i == -1 { - return nil, false - } - return in[i:], true -} - -func readKeyName(in []byte) (string, int, error) { - line := string(in) - - // Check if key name surrounded by quotes. - var keyQuote string - if line[0] == '"' { - if len(line) > 6 && string(line[0:3]) == `"""` { - keyQuote = `"""` - } else { - keyQuote = `"` - } - } else if line[0] == '`' { - keyQuote = "`" - } - - // Get out key name - endIdx := -1 - if len(keyQuote) > 0 { - startIdx := len(keyQuote) - // FIXME: fail case -> """"""name"""=value - pos := strings.Index(line[startIdx:], keyQuote) - if pos == -1 { - return "", -1, fmt.Errorf("missing closing key quote: %s", line) - } - pos += startIdx - - // Find key-value delimiter - i := strings.IndexAny(line[pos+startIdx:], "=:") - if i < 0 { - return "", -1, ErrDelimiterNotFound{line} - } - endIdx = pos + i - return strings.TrimSpace(line[startIdx:pos]), endIdx + startIdx + 1, nil - } - - endIdx = strings.IndexAny(line, "=:") - if endIdx < 0 { - return "", -1, ErrDelimiterNotFound{line} - } - return strings.TrimSpace(line[0:endIdx]), endIdx + 1, nil -} - -func (p *parser) readMultilines(line, val, valQuote string) (string, error) { - for { - data, err := p.readUntil('\n') - if err != nil { - return "", err - } - next := string(data) - - pos := strings.LastIndex(next, valQuote) - if pos > -1 { - val += next[:pos] - - comment, has := cleanComment([]byte(next[pos:])) - if has { - p.comment.Write(bytes.TrimSpace(comment)) - } - break - } - val += next - if p.isEOF { - return "", fmt.Errorf("missing closing key quote from '%s' to '%s'", line, next) - } - } - return val, nil -} - -func (p *parser) readContinuationLines(val string) (string, error) { - for { - data, err := p.readUntil('\n') - if err != nil { - return "", err - } - next := strings.TrimSpace(string(data)) - - if len(next) == 0 { - break - } - val += next - if val[len(val)-1] != '\\' { - break - } - val = val[:len(val)-1] - } - return val, nil -} - -// hasSurroundedQuote check if and only if the first and last characters -// are quotes \" or \'. -// It returns false if any other parts also contain same kind of quotes. -func hasSurroundedQuote(in string, quote byte) bool { - return len(in) > 2 && in[0] == quote && in[len(in)-1] == quote && - strings.IndexByte(in[1:], quote) == len(in)-2 -} - -func (p *parser) readValue(in []byte, ignoreContinuation bool) (string, error) { - line := strings.TrimLeftFunc(string(in), unicode.IsSpace) - if len(line) == 0 { - return "", nil - } - - var valQuote string - if len(line) > 3 && string(line[0:3]) == `"""` { - valQuote = `"""` - } else if line[0] == '`' { - valQuote = "`" - } - - if len(valQuote) > 0 { - startIdx := len(valQuote) - pos := strings.LastIndex(line[startIdx:], valQuote) - // Check for multi-line value - if pos == -1 { - return p.readMultilines(line, line[startIdx:], valQuote) - } - - return line[startIdx : pos+startIdx], nil - } - - // Won't be able to reach here if value only contains whitespace. - line = strings.TrimSpace(line) - - // Check continuation lines when desired. - if !ignoreContinuation && line[len(line)-1] == '\\' { - return p.readContinuationLines(line[:len(line)-1]) - } - - i := strings.IndexAny(line, "#;") - if i > -1 { - p.comment.WriteString(line[i:]) - line = strings.TrimSpace(line[:i]) - } - - // Trim single quotes - if hasSurroundedQuote(line, '\'') || - hasSurroundedQuote(line, '"') { - line = line[1 : len(line)-1] - } - return line, nil -} - -// parse parses data through an io.Reader. -func (f *File) parse(reader io.Reader) (err error) { - p := newParser(reader) - if err = p.BOM(); err != nil { - return fmt.Errorf("BOM: %v", err) - } - - // Ignore error because default section name is never empty string. - section, _ := f.NewSection(DEFAULT_SECTION) - - var line []byte - var inUnparseableSection bool - for !p.isEOF { - line, err = p.readUntil('\n') - if err != nil { - return err - } - - line = bytes.TrimLeftFunc(line, unicode.IsSpace) - if len(line) == 0 { - continue - } - - // Comments - if line[0] == '#' || line[0] == ';' { - // Note: we do not care ending line break, - // it is needed for adding second line, - // so just clean it once at the end when set to value. - p.comment.Write(line) - continue - } - - // Section - if line[0] == '[' { - // Read to the next ']' (TODO: support quoted strings) - // TODO(unknwon): use LastIndexByte when stop supporting Go1.4 - closeIdx := bytes.LastIndex(line, []byte("]")) - if closeIdx == -1 { - return fmt.Errorf("unclosed section: %s", line) - } - - name := string(line[1:closeIdx]) - section, err = f.NewSection(name) - if err != nil { - return err - } - - comment, has := cleanComment(line[closeIdx+1:]) - if has { - p.comment.Write(comment) - } - - section.Comment = strings.TrimSpace(p.comment.String()) - - // Reset aotu-counter and comments - p.comment.Reset() - p.count = 1 - - inUnparseableSection = false - for i := range f.options.UnparseableSections { - if f.options.UnparseableSections[i] == name || - (f.options.Insensitive && strings.ToLower(f.options.UnparseableSections[i]) == strings.ToLower(name)) { - inUnparseableSection = true - continue - } - } - continue - } - - if inUnparseableSection { - section.isRawSection = true - section.rawBody += string(line) - continue - } - - kname, offset, err := readKeyName(line) - if err != nil { - // Treat as boolean key when desired, and whole line is key name. - if IsErrDelimiterNotFound(err) && f.options.AllowBooleanKeys { - kname, err := p.readValue(line, f.options.IgnoreContinuation) - if err != nil { - return err - } - key, err := section.NewBooleanKey(kname) - if err != nil { - return err - } - key.Comment = strings.TrimSpace(p.comment.String()) - p.comment.Reset() - continue - } - return err - } - - // Auto increment. - isAutoIncr := false - if kname == "-" { - isAutoIncr = true - kname = "#" + strconv.Itoa(p.count) - p.count++ - } - - value, err := p.readValue(line[offset:], f.options.IgnoreContinuation) - if err != nil { - return err - } - - key, err := section.NewKey(kname, value) - if err != nil { - return err - } - key.isAutoIncrement = isAutoIncr - key.Comment = strings.TrimSpace(p.comment.String()) - p.comment.Reset() - } - return nil -} diff --git a/vendor/gopkg.in/ini.v1/section.go b/vendor/gopkg.in/ini.v1/section.go deleted file mode 100644 index c9fa27e9c..000000000 --- a/vendor/gopkg.in/ini.v1/section.go +++ /dev/null @@ -1,234 +0,0 @@ -// Copyright 2014 Unknwon -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package ini - -import ( - "errors" - "fmt" - "strings" -) - -// Section represents a config section. -type Section struct { - f *File - Comment string - name string - keys map[string]*Key - keyList []string - keysHash map[string]string - - isRawSection bool - rawBody string -} - -func newSection(f *File, name string) *Section { - return &Section{ - f: f, - name: name, - keys: make(map[string]*Key), - keyList: make([]string, 0, 10), - keysHash: make(map[string]string), - } -} - -// Name returns name of Section. -func (s *Section) Name() string { - return s.name -} - -// Body returns rawBody of Section if the section was marked as unparseable. -// It still follows the other rules of the INI format surrounding leading/trailing whitespace. -func (s *Section) Body() string { - return strings.TrimSpace(s.rawBody) -} - -// NewKey creates a new key to given section. -func (s *Section) NewKey(name, val string) (*Key, error) { - if len(name) == 0 { - return nil, errors.New("error creating new key: empty key name") - } else if s.f.options.Insensitive { - name = strings.ToLower(name) - } - - if s.f.BlockMode { - s.f.lock.Lock() - defer s.f.lock.Unlock() - } - - if inSlice(name, s.keyList) { - if s.f.options.AllowShadows { - if err := s.keys[name].addShadow(val); err != nil { - return nil, err - } - } else { - s.keys[name].value = val - } - return s.keys[name], nil - } - - s.keyList = append(s.keyList, name) - s.keys[name] = newKey(s, name, val) - s.keysHash[name] = val - return s.keys[name], nil -} - -// NewBooleanKey creates a new boolean type key to given section. -func (s *Section) NewBooleanKey(name string) (*Key, error) { - key, err := s.NewKey(name, "true") - if err != nil { - return nil, err - } - - key.isBooleanType = true - return key, nil -} - -// GetKey returns key in section by given name. -func (s *Section) GetKey(name string) (*Key, error) { - // FIXME: change to section level lock? - if s.f.BlockMode { - s.f.lock.RLock() - } - if s.f.options.Insensitive { - name = strings.ToLower(name) - } - key := s.keys[name] - if s.f.BlockMode { - s.f.lock.RUnlock() - } - - if key == nil { - // Check if it is a child-section. - sname := s.name - for { - if i := strings.LastIndex(sname, "."); i > -1 { - sname = sname[:i] - sec, err := s.f.GetSection(sname) - if err != nil { - continue - } - return sec.GetKey(name) - } else { - break - } - } - return nil, fmt.Errorf("error when getting key of section '%s': key '%s' not exists", s.name, name) - } - return key, nil -} - -// HasKey returns true if section contains a key with given name. -func (s *Section) HasKey(name string) bool { - key, _ := s.GetKey(name) - return key != nil -} - -// Haskey is a backwards-compatible name for HasKey. -func (s *Section) Haskey(name string) bool { - return s.HasKey(name) -} - -// HasValue returns true if section contains given raw value. -func (s *Section) HasValue(value string) bool { - if s.f.BlockMode { - s.f.lock.RLock() - defer s.f.lock.RUnlock() - } - - for _, k := range s.keys { - if value == k.value { - return true - } - } - return false -} - -// Key assumes named Key exists in section and returns a zero-value when not. -func (s *Section) Key(name string) *Key { - key, err := s.GetKey(name) - if err != nil { - // It's OK here because the only possible error is empty key name, - // but if it's empty, this piece of code won't be executed. - key, _ = s.NewKey(name, "") - return key - } - return key -} - -// Keys returns list of keys of section. -func (s *Section) Keys() []*Key { - keys := make([]*Key, len(s.keyList)) - for i := range s.keyList { - keys[i] = s.Key(s.keyList[i]) - } - return keys -} - -// ParentKeys returns list of keys of parent section. -func (s *Section) ParentKeys() []*Key { - var parentKeys []*Key - sname := s.name - for { - if i := strings.LastIndex(sname, "."); i > -1 { - sname = sname[:i] - sec, err := s.f.GetSection(sname) - if err != nil { - continue - } - parentKeys = append(parentKeys, sec.Keys()...) - } else { - break - } - - } - return parentKeys -} - -// KeyStrings returns list of key names of section. -func (s *Section) KeyStrings() []string { - list := make([]string, len(s.keyList)) - copy(list, s.keyList) - return list -} - -// KeysHash returns keys hash consisting of names and values. -func (s *Section) KeysHash() map[string]string { - if s.f.BlockMode { - s.f.lock.RLock() - defer s.f.lock.RUnlock() - } - - hash := map[string]string{} - for key, value := range s.keysHash { - hash[key] = value - } - return hash -} - -// DeleteKey deletes a key from section. -func (s *Section) DeleteKey(name string) { - if s.f.BlockMode { - s.f.lock.Lock() - defer s.f.lock.Unlock() - } - - for i, k := range s.keyList { - if k == name { - s.keyList = append(s.keyList[:i], s.keyList[i+1:]...) - delete(s.keys, name) - return - } - } -} diff --git a/vendor/gopkg.in/ini.v1/struct.go b/vendor/gopkg.in/ini.v1/struct.go deleted file mode 100644 index 5ef38d865..000000000 --- a/vendor/gopkg.in/ini.v1/struct.go +++ /dev/null @@ -1,431 +0,0 @@ -// Copyright 2014 Unknwon -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package ini - -import ( - "bytes" - "errors" - "fmt" - "reflect" - "strings" - "time" - "unicode" -) - -// NameMapper represents a ini tag name mapper. -type NameMapper func(string) string - -// Built-in name getters. -var ( - // AllCapsUnderscore converts to format ALL_CAPS_UNDERSCORE. - AllCapsUnderscore NameMapper = func(raw string) string { - newstr := make([]rune, 0, len(raw)) - for i, chr := range raw { - if isUpper := 'A' <= chr && chr <= 'Z'; isUpper { - if i > 0 { - newstr = append(newstr, '_') - } - } - newstr = append(newstr, unicode.ToUpper(chr)) - } - return string(newstr) - } - // TitleUnderscore converts to format title_underscore. - TitleUnderscore NameMapper = func(raw string) string { - newstr := make([]rune, 0, len(raw)) - for i, chr := range raw { - if isUpper := 'A' <= chr && chr <= 'Z'; isUpper { - if i > 0 { - newstr = append(newstr, '_') - } - chr -= ('A' - 'a') - } - newstr = append(newstr, chr) - } - return string(newstr) - } -) - -func (s *Section) parseFieldName(raw, actual string) string { - if len(actual) > 0 { - return actual - } - if s.f.NameMapper != nil { - return s.f.NameMapper(raw) - } - return raw -} - -func parseDelim(actual string) string { - if len(actual) > 0 { - return actual - } - return "," -} - -var reflectTime = reflect.TypeOf(time.Now()).Kind() - -// setSliceWithProperType sets proper values to slice based on its type. -func setSliceWithProperType(key *Key, field reflect.Value, delim string) error { - strs := key.Strings(delim) - numVals := len(strs) - if numVals == 0 { - return nil - } - - var vals interface{} - - sliceOf := field.Type().Elem().Kind() - switch sliceOf { - case reflect.String: - vals = strs - case reflect.Int: - vals = key.Ints(delim) - case reflect.Int64: - vals = key.Int64s(delim) - case reflect.Uint: - vals = key.Uints(delim) - case reflect.Uint64: - vals = key.Uint64s(delim) - case reflect.Float64: - vals = key.Float64s(delim) - case reflectTime: - vals = key.Times(delim) - default: - return fmt.Errorf("unsupported type '[]%s'", sliceOf) - } - - slice := reflect.MakeSlice(field.Type(), numVals, numVals) - for i := 0; i < numVals; i++ { - switch sliceOf { - case reflect.String: - slice.Index(i).Set(reflect.ValueOf(vals.([]string)[i])) - case reflect.Int: - slice.Index(i).Set(reflect.ValueOf(vals.([]int)[i])) - case reflect.Int64: - slice.Index(i).Set(reflect.ValueOf(vals.([]int64)[i])) - case reflect.Uint: - slice.Index(i).Set(reflect.ValueOf(vals.([]uint)[i])) - case reflect.Uint64: - slice.Index(i).Set(reflect.ValueOf(vals.([]uint64)[i])) - case reflect.Float64: - slice.Index(i).Set(reflect.ValueOf(vals.([]float64)[i])) - case reflectTime: - slice.Index(i).Set(reflect.ValueOf(vals.([]time.Time)[i])) - } - } - field.Set(slice) - return nil -} - -// setWithProperType sets proper value to field based on its type, -// but it does not return error for failing parsing, -// because we want to use default value that is already assigned to strcut. -func setWithProperType(t reflect.Type, key *Key, field reflect.Value, delim string) error { - switch t.Kind() { - case reflect.String: - if len(key.String()) == 0 { - return nil - } - field.SetString(key.String()) - case reflect.Bool: - boolVal, err := key.Bool() - if err != nil { - return nil - } - field.SetBool(boolVal) - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - durationVal, err := key.Duration() - // Skip zero value - if err == nil && int(durationVal) > 0 { - field.Set(reflect.ValueOf(durationVal)) - return nil - } - - intVal, err := key.Int64() - if err != nil || intVal == 0 { - return nil - } - field.SetInt(intVal) - // byte is an alias for uint8, so supporting uint8 breaks support for byte - case reflect.Uint, reflect.Uint16, reflect.Uint32, reflect.Uint64: - durationVal, err := key.Duration() - // Skip zero value - if err == nil && int(durationVal) > 0 { - field.Set(reflect.ValueOf(durationVal)) - return nil - } - - uintVal, err := key.Uint64() - if err != nil { - return nil - } - field.SetUint(uintVal) - - case reflect.Float32, reflect.Float64: - floatVal, err := key.Float64() - if err != nil { - return nil - } - field.SetFloat(floatVal) - case reflectTime: - timeVal, err := key.Time() - if err != nil { - return nil - } - field.Set(reflect.ValueOf(timeVal)) - case reflect.Slice: - return setSliceWithProperType(key, field, delim) - default: - return fmt.Errorf("unsupported type '%s'", t) - } - return nil -} - -func (s *Section) mapTo(val reflect.Value) error { - if val.Kind() == reflect.Ptr { - val = val.Elem() - } - typ := val.Type() - - for i := 0; i < typ.NumField(); i++ { - field := val.Field(i) - tpField := typ.Field(i) - - tag := tpField.Tag.Get("ini") - if tag == "-" { - continue - } - - opts := strings.SplitN(tag, ",", 2) // strip off possible omitempty - fieldName := s.parseFieldName(tpField.Name, opts[0]) - if len(fieldName) == 0 || !field.CanSet() { - continue - } - - isAnonymous := tpField.Type.Kind() == reflect.Ptr && tpField.Anonymous - isStruct := tpField.Type.Kind() == reflect.Struct - if isAnonymous { - field.Set(reflect.New(tpField.Type.Elem())) - } - - if isAnonymous || isStruct { - if sec, err := s.f.GetSection(fieldName); err == nil { - if err = sec.mapTo(field); err != nil { - return fmt.Errorf("error mapping field(%s): %v", fieldName, err) - } - continue - } - } - - if key, err := s.GetKey(fieldName); err == nil { - if err = setWithProperType(tpField.Type, key, field, parseDelim(tpField.Tag.Get("delim"))); err != nil { - return fmt.Errorf("error mapping field(%s): %v", fieldName, err) - } - } - } - return nil -} - -// MapTo maps section to given struct. -func (s *Section) MapTo(v interface{}) error { - typ := reflect.TypeOf(v) - val := reflect.ValueOf(v) - if typ.Kind() == reflect.Ptr { - typ = typ.Elem() - val = val.Elem() - } else { - return errors.New("cannot map to non-pointer struct") - } - - return s.mapTo(val) -} - -// MapTo maps file to given struct. -func (f *File) MapTo(v interface{}) error { - return f.Section("").MapTo(v) -} - -// MapTo maps data sources to given struct with name mapper. -func MapToWithMapper(v interface{}, mapper NameMapper, source interface{}, others ...interface{}) error { - cfg, err := Load(source, others...) - if err != nil { - return err - } - cfg.NameMapper = mapper - return cfg.MapTo(v) -} - -// MapTo maps data sources to given struct. -func MapTo(v, source interface{}, others ...interface{}) error { - return MapToWithMapper(v, nil, source, others...) -} - -// reflectSliceWithProperType does the opposite thing as setSliceWithProperType. -func reflectSliceWithProperType(key *Key, field reflect.Value, delim string) error { - slice := field.Slice(0, field.Len()) - if field.Len() == 0 { - return nil - } - - var buf bytes.Buffer - sliceOf := field.Type().Elem().Kind() - for i := 0; i < field.Len(); i++ { - switch sliceOf { - case reflect.String: - buf.WriteString(slice.Index(i).String()) - case reflect.Int, reflect.Int64: - buf.WriteString(fmt.Sprint(slice.Index(i).Int())) - case reflect.Uint, reflect.Uint64: - buf.WriteString(fmt.Sprint(slice.Index(i).Uint())) - case reflect.Float64: - buf.WriteString(fmt.Sprint(slice.Index(i).Float())) - case reflectTime: - buf.WriteString(slice.Index(i).Interface().(time.Time).Format(time.RFC3339)) - default: - return fmt.Errorf("unsupported type '[]%s'", sliceOf) - } - buf.WriteString(delim) - } - key.SetValue(buf.String()[:buf.Len()-1]) - return nil -} - -// reflectWithProperType does the opposite thing as setWithProperType. -func reflectWithProperType(t reflect.Type, key *Key, field reflect.Value, delim string) error { - switch t.Kind() { - case reflect.String: - key.SetValue(field.String()) - case reflect.Bool: - key.SetValue(fmt.Sprint(field.Bool())) - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - key.SetValue(fmt.Sprint(field.Int())) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - key.SetValue(fmt.Sprint(field.Uint())) - case reflect.Float32, reflect.Float64: - key.SetValue(fmt.Sprint(field.Float())) - case reflectTime: - key.SetValue(fmt.Sprint(field.Interface().(time.Time).Format(time.RFC3339))) - case reflect.Slice: - return reflectSliceWithProperType(key, field, delim) - default: - return fmt.Errorf("unsupported type '%s'", t) - } - return nil -} - -// CR: copied from encoding/json/encode.go with modifications of time.Time support. -// TODO: add more test coverage. -func isEmptyValue(v reflect.Value) bool { - switch v.Kind() { - case reflect.Array, reflect.Map, reflect.Slice, reflect.String: - return v.Len() == 0 - case reflect.Bool: - return !v.Bool() - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return v.Int() == 0 - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return v.Uint() == 0 - case reflect.Float32, reflect.Float64: - return v.Float() == 0 - case reflectTime: - return v.Interface().(time.Time).IsZero() - case reflect.Interface, reflect.Ptr: - return v.IsNil() - } - return false -} - -func (s *Section) reflectFrom(val reflect.Value) error { - if val.Kind() == reflect.Ptr { - val = val.Elem() - } - typ := val.Type() - - for i := 0; i < typ.NumField(); i++ { - field := val.Field(i) - tpField := typ.Field(i) - - tag := tpField.Tag.Get("ini") - if tag == "-" { - continue - } - - opts := strings.SplitN(tag, ",", 2) - if len(opts) == 2 && opts[1] == "omitempty" && isEmptyValue(field) { - continue - } - - fieldName := s.parseFieldName(tpField.Name, opts[0]) - if len(fieldName) == 0 || !field.CanSet() { - continue - } - - if (tpField.Type.Kind() == reflect.Ptr && tpField.Anonymous) || - (tpField.Type.Kind() == reflect.Struct && tpField.Type.Name() != "Time") { - // Note: The only error here is section doesn't exist. - sec, err := s.f.GetSection(fieldName) - if err != nil { - // Note: fieldName can never be empty here, ignore error. - sec, _ = s.f.NewSection(fieldName) - } - if err = sec.reflectFrom(field); err != nil { - return fmt.Errorf("error reflecting field (%s): %v", fieldName, err) - } - continue - } - - // Note: Same reason as secion. - key, err := s.GetKey(fieldName) - if err != nil { - key, _ = s.NewKey(fieldName, "") - } - if err = reflectWithProperType(tpField.Type, key, field, parseDelim(tpField.Tag.Get("delim"))); err != nil { - return fmt.Errorf("error reflecting field (%s): %v", fieldName, err) - } - - } - return nil -} - -// ReflectFrom reflects secion from given struct. -func (s *Section) ReflectFrom(v interface{}) error { - typ := reflect.TypeOf(v) - val := reflect.ValueOf(v) - if typ.Kind() == reflect.Ptr { - typ = typ.Elem() - val = val.Elem() - } else { - return errors.New("cannot reflect from non-pointer struct") - } - - return s.reflectFrom(val) -} - -// ReflectFrom reflects file from given struct. -func (f *File) ReflectFrom(v interface{}) error { - return f.Section("").ReflectFrom(v) -} - -// ReflectFrom reflects data sources from given struct with name mapper. -func ReflectFromWithMapper(cfg *File, v interface{}, mapper NameMapper) error { - cfg.NameMapper = mapper - return cfg.ReflectFrom(v) -} - -// ReflectFrom reflects data sources from given struct. -func ReflectFrom(cfg *File, v interface{}) error { - return ReflectFromWithMapper(cfg, v, nil) -} diff --git a/vendor/gopkg.in/macaron.v1/LICENSE b/vendor/gopkg.in/macaron.v1/LICENSE deleted file mode 100644 index 37ec93a14..000000000 --- a/vendor/gopkg.in/macaron.v1/LICENSE +++ /dev/null @@ -1,191 +0,0 @@ -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and -distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright -owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities -that control, are controlled by, or are under common control with that entity. -For the purposes of this definition, "control" means (i) the power, direct or -indirect, to cause the direction or management of such entity, whether by -contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the -outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising -permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including -but not limited to software source code, documentation source, and configuration -files. - -"Object" form shall mean any form resulting from mechanical transformation or -translation of a Source form, including but not limited to compiled object code, -generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made -available under the License, as indicated by a copyright notice that is included -in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that -is based on (or derived from) the Work and for which the editorial revisions, -annotations, elaborations, or other modifications represent, as a whole, an -original work of authorship. For the purposes of this License, Derivative Works -shall not include works that remain separable from, or merely link (or bind by -name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version -of the Work and any modifications or additions to that Work or Derivative Works -thereof, that is intentionally submitted to Licensor for inclusion in the Work -by the copyright owner or by an individual or Legal Entity authorized to submit -on behalf of the copyright owner. For the purposes of this definition, -"submitted" means any form of electronic, verbal, or written communication sent -to the Licensor or its representatives, including but not limited to -communication on electronic mailing lists, source code control systems, and -issue tracking systems that are managed by, or on behalf of, the Licensor for -the purpose of discussing and improving the Work, but excluding communication -that is conspicuously marked or otherwise designated in writing by the copyright -owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf -of whom a Contribution has been received by Licensor and subsequently -incorporated within the Work. - -2. Grant of Copyright License. - -Subject to the terms and conditions of this License, each Contributor hereby -grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, -irrevocable copyright license to reproduce, prepare Derivative Works of, -publicly display, publicly perform, sublicense, and distribute the Work and such -Derivative Works in Source or Object form. - -3. Grant of Patent License. - -Subject to the terms and conditions of this License, each Contributor hereby -grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, -irrevocable (except as stated in this section) patent license to make, have -made, use, offer to sell, sell, import, and otherwise transfer the Work, where -such license applies only to those patent claims licensable by such Contributor -that are necessarily infringed by their Contribution(s) alone or by combination -of their Contribution(s) with the Work to which such Contribution(s) was -submitted. If You institute patent litigation against any entity (including a -cross-claim or counterclaim in a lawsuit) alleging that the Work or a -Contribution incorporated within the Work constitutes direct or contributory -patent infringement, then any patent licenses granted to You under this License -for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. - -You may reproduce and distribute copies of the Work or Derivative Works thereof -in any medium, with or without modifications, and in Source or Object form, -provided that You meet the following conditions: - -You must give any other recipients of the Work or Derivative Works a copy of -this License; and -You must cause any modified files to carry prominent notices stating that You -changed the files; and -You must retain, in the Source form of any Derivative Works that You distribute, -all copyright, patent, trademark, and attribution notices from the Source form -of the Work, excluding those notices that do not pertain to any part of the -Derivative Works; and -If the Work includes a "NOTICE" text file as part of its distribution, then any -Derivative Works that You distribute must include a readable copy of the -attribution notices contained within such NOTICE file, excluding those notices -that do not pertain to any part of the Derivative Works, in at least one of the -following places: within a NOTICE text file distributed as part of the -Derivative Works; within the Source form or documentation, if provided along -with the Derivative Works; or, within a display generated by the Derivative -Works, if and wherever such third-party notices normally appear. The contents of -the NOTICE file are for informational purposes only and do not modify the -License. You may add Your own attribution notices within Derivative Works that -You distribute, alongside or as an addendum to the NOTICE text from the Work, -provided that such additional attribution notices cannot be construed as -modifying the License. -You may add Your own copyright statement to Your modifications and may provide -additional or different license terms and conditions for use, reproduction, or -distribution of Your modifications, or for any such Derivative Works as a whole, -provided Your use, reproduction, and distribution of the Work otherwise complies -with the conditions stated in this License. - -5. Submission of Contributions. - -Unless You explicitly state otherwise, any Contribution intentionally submitted -for inclusion in the Work by You to the Licensor shall be under the terms and -conditions of this License, without any additional terms or conditions. -Notwithstanding the above, nothing herein shall supersede or modify the terms of -any separate license agreement you may have executed with Licensor regarding -such Contributions. - -6. Trademarks. - -This License does not grant permission to use the trade names, trademarks, -service marks, or product names of the Licensor, except as required for -reasonable and customary use in describing the origin of the Work and -reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. - -Unless required by applicable law or agreed to in writing, Licensor provides the -Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, -including, without limitation, any warranties or conditions of TITLE, -NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are -solely responsible for determining the appropriateness of using or -redistributing the Work and assume any risks associated with Your exercise of -permissions under this License. - -8. Limitation of Liability. - -In no event and under no legal theory, whether in tort (including negligence), -contract, or otherwise, unless required by applicable law (such as deliberate -and grossly negligent acts) or agreed to in writing, shall any Contributor be -liable to You for damages, including any direct, indirect, special, incidental, -or consequential damages of any character arising as a result of this License or -out of the use or inability to use the Work (including but not limited to -damages for loss of goodwill, work stoppage, computer failure or malfunction, or -any and all other commercial damages or losses), even if such Contributor has -been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. - -While redistributing the Work or Derivative Works thereof, You may choose to -offer, and charge a fee for, acceptance of support, warranty, indemnity, or -other liability obligations and/or rights consistent with this License. However, -in accepting such obligations, You may act only on Your own behalf and on Your -sole responsibility, not on behalf of any other Contributor, and only if You -agree to indemnify, defend, and hold each Contributor harmless for any liability -incurred by, or claims asserted against, such Contributor by reason of your -accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work - -To apply the Apache License to your work, attach the following boilerplate -notice, with the fields enclosed by brackets "[]" replaced with your own -identifying information. (Don't include the brackets!) The text should be -enclosed in the appropriate comment syntax for the file format. We also -recommend that a file or class name and description of purpose be included on -the same "printed page" as the copyright notice for easier identification within -third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/gopkg.in/macaron.v1/README.md b/vendor/gopkg.in/macaron.v1/README.md deleted file mode 100644 index cfc7f6fdb..000000000 --- a/vendor/gopkg.in/macaron.v1/README.md +++ /dev/null @@ -1,92 +0,0 @@ -Macaron [![Build Status](https://travis-ci.org/go-macaron/macaron.svg?branch=v1)](https://travis-ci.org/go-macaron/macaron) -======================= - -![Macaron Logo](https://raw.githubusercontent.com/go-macaron/macaron/v1/macaronlogo.png) - -Package macaron is a high productive and modular web framework in Go. - -## Getting Started - -The minimum requirement of Go is **1.3**. - -To install Macaron: - - go get gopkg.in/macaron.v1 - -The very basic usage of Macaron: - -```go -package main - -import "gopkg.in/macaron.v1" - -func main() { - m := macaron.Classic() - m.Get("/", func() string { - return "Hello world!" - }) - m.Run() -} -``` - -## Features - -- Powerful routing with suburl. -- Flexible routes combinations. -- Unlimited nested group routers. -- Directly integrate with existing services. -- Dynamically change template files at runtime. -- Allow to use in-memory template and static files. -- Easy to plugin/unplugin features with modular design. -- Handy dependency injection powered by [inject](https://github.com/codegangsta/inject). -- Better router layer and less reflection make faster speed. - -## Middlewares - -Middlewares allow you easily plugin/unplugin features for your Macaron applications. - -There are already many [middlewares](https://github.com/go-macaron) to simplify your work: - -- render - Go template engine -- static - Serves static files -- [gzip](https://github.com/go-macaron/gzip) - Gzip compression to all responses -- [binding](https://github.com/go-macaron/binding) - Request data binding and validation -- [i18n](https://github.com/go-macaron/i18n) - Internationalization and Localization -- [cache](https://github.com/go-macaron/cache) - Cache manager -- [session](https://github.com/go-macaron/session) - Session manager -- [csrf](https://github.com/go-macaron/csrf) - Generates and validates csrf tokens -- [captcha](https://github.com/go-macaron/captcha) - Captcha service -- [pongo2](https://github.com/go-macaron/pongo2) - Pongo2 template engine support -- [sockets](https://github.com/go-macaron/sockets) - WebSockets channels binding -- [bindata](https://github.com/go-macaron/bindata) - Embed binary data as static and template files -- [toolbox](https://github.com/go-macaron/toolbox) - Health check, pprof, profile and statistic services -- [oauth2](https://github.com/go-macaron/oauth2) - OAuth 2.0 backend -- [switcher](https://github.com/go-macaron/switcher) - Multiple-site support -- [method](https://github.com/go-macaron/method) - HTTP method override -- [permissions2](https://github.com/xyproto/permissions2) - Cookies, users and permissions -- [renders](https://github.com/go-macaron/renders) - Beego-like render engine(Macaron has built-in template engine, this is another option) - -## Use Cases - -- [Gogs](https://gogs.io): A painless self-hosted Git Service -- [Peach](https://peachdocs.org): A modern web documentation server -- [Go Walker](https://gowalker.org): Go online API documentation -- [Switch](https://gopm.io): Gopm registry -- [YouGam](http://yougam.com): Online Forum -- [Critical Stack Intel](https://intel.criticalstack.com/): A 100% free intel marketplace from Critical Stack, Inc. - -## Getting Help - -- [API Reference](https://gowalker.org/gopkg.in/macaron.v1) -- [Documentation](https://go-macaron.com) -- [FAQs](https://go-macaron.com/docs/faqs) -- [![Join the chat at https://gitter.im/Unknwon/macaron](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/go-macaron/macaron?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) - -## Credits - -- Basic design of [Martini](https://github.com/go-martini/martini). -- Logo is modified by [@insionng](https://github.com/insionng) based on [Tribal Dragon](http://xtremeyamazaki.deviantart.com/art/Tribal-Dragon-27005087). - -## License - -This project is under the Apache License, Version 2.0. See the [LICENSE](LICENSE) file for the full license text. diff --git a/vendor/gopkg.in/macaron.v1/context.go b/vendor/gopkg.in/macaron.v1/context.go deleted file mode 100644 index dffc50cf6..000000000 --- a/vendor/gopkg.in/macaron.v1/context.go +++ /dev/null @@ -1,527 +0,0 @@ -// Copyright 2014 The Macaron Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package macaron - -import ( - "crypto/sha256" - "encoding/hex" - "html/template" - "io" - "io/ioutil" - "mime/multipart" - "net/http" - "net/url" - "os" - "path" - "path/filepath" - "reflect" - "strconv" - "strings" - "time" - - "github.com/Unknwon/com" - "github.com/go-macaron/inject" - "golang.org/x/crypto/pbkdf2" -) - -// Locale reprents a localization interface. -type Locale interface { - Language() string - Tr(string, ...interface{}) string -} - -// RequestBody represents a request body. -type RequestBody struct { - reader io.ReadCloser -} - -// Bytes reads and returns content of request body in bytes. -func (rb *RequestBody) Bytes() ([]byte, error) { - return ioutil.ReadAll(rb.reader) -} - -// String reads and returns content of request body in string. -func (rb *RequestBody) String() (string, error) { - data, err := rb.Bytes() - return string(data), err -} - -// ReadCloser returns a ReadCloser for request body. -func (rb *RequestBody) ReadCloser() io.ReadCloser { - return rb.reader -} - -// Request represents an HTTP request received by a server or to be sent by a client. -type Request struct { - *http.Request -} - -func (r *Request) Body() *RequestBody { - return &RequestBody{r.Request.Body} -} - -// ContextInvoker is an inject.FastInvoker wrapper of func(ctx *Context). -type ContextInvoker func(ctx *Context) - -func (invoke ContextInvoker) Invoke(params []interface{}) ([]reflect.Value, error) { - invoke(params[0].(*Context)) - return nil, nil -} - -// Context represents the runtime context of current request of Macaron instance. -// It is the integration of most frequently used middlewares and helper methods. -type Context struct { - inject.Injector - handlers []Handler - action Handler - index int - - *Router - Req Request - Resp ResponseWriter - params Params - Render - Locale - Data map[string]interface{} -} - -func (c *Context) handler() Handler { - if c.index < len(c.handlers) { - return c.handlers[c.index] - } - if c.index == len(c.handlers) { - return c.action - } - panic("invalid index for context handler") -} - -func (c *Context) Next() { - c.index += 1 - c.run() -} - -func (c *Context) Written() bool { - return c.Resp.Written() -} - -func (c *Context) run() { - for c.index <= len(c.handlers) { - vals, err := c.Invoke(c.handler()) - if err != nil { - panic(err) - } - c.index += 1 - - // if the handler returned something, write it to the http response - if len(vals) > 0 { - ev := c.GetVal(reflect.TypeOf(ReturnHandler(nil))) - handleReturn := ev.Interface().(ReturnHandler) - handleReturn(c, vals) - } - - if c.Written() { - return - } - } -} - -// RemoteAddr returns more real IP address. -func (ctx *Context) RemoteAddr() string { - addr := ctx.Req.Header.Get("X-Real-IP") - if len(addr) == 0 { - addr = ctx.Req.Header.Get("X-Forwarded-For") - if addr == "" { - addr = ctx.Req.RemoteAddr - if i := strings.LastIndex(addr, ":"); i > -1 { - addr = addr[:i] - } - } - } - return addr -} - -func (ctx *Context) renderHTML(status int, setName, tplName string, data ...interface{}) { - if len(data) <= 0 { - ctx.Render.HTMLSet(status, setName, tplName, ctx.Data) - } else if len(data) == 1 { - ctx.Render.HTMLSet(status, setName, tplName, data[0]) - } else { - ctx.Render.HTMLSet(status, setName, tplName, data[0], data[1].(HTMLOptions)) - } -} - -// HTML calls Render.HTML but allows less arguments. -func (ctx *Context) HTML(status int, name string, data ...interface{}) { - ctx.renderHTML(status, DEFAULT_TPL_SET_NAME, name, data...) -} - -// HTML calls Render.HTMLSet but allows less arguments. -func (ctx *Context) HTMLSet(status int, setName, tplName string, data ...interface{}) { - ctx.renderHTML(status, setName, tplName, data...) -} - -func (ctx *Context) Redirect(location string, status ...int) { - code := http.StatusFound - if len(status) == 1 { - code = status[0] - } - - http.Redirect(ctx.Resp, ctx.Req.Request, location, code) -} - -// Maximum amount of memory to use when parsing a multipart form. -// Set this to whatever value you prefer; default is 10 MB. -var MaxMemory = int64(1024 * 1024 * 10) - -func (ctx *Context) parseForm() { - if ctx.Req.Form != nil { - return - } - - contentType := ctx.Req.Header.Get(_CONTENT_TYPE) - if (ctx.Req.Method == "POST" || ctx.Req.Method == "PUT") && - len(contentType) > 0 && strings.Contains(contentType, "multipart/form-data") { - ctx.Req.ParseMultipartForm(MaxMemory) - } else { - ctx.Req.ParseForm() - } -} - -// Query querys form parameter. -func (ctx *Context) Query(name string) string { - ctx.parseForm() - return ctx.Req.Form.Get(name) -} - -// QueryTrim querys and trims spaces form parameter. -func (ctx *Context) QueryTrim(name string) string { - return strings.TrimSpace(ctx.Query(name)) -} - -// QueryStrings returns a list of results by given query name. -func (ctx *Context) QueryStrings(name string) []string { - ctx.parseForm() - - vals, ok := ctx.Req.Form[name] - if !ok { - return []string{} - } - return vals -} - -// QueryEscape returns escapred query result. -func (ctx *Context) QueryEscape(name string) string { - return template.HTMLEscapeString(ctx.Query(name)) -} - -// QueryBool returns query result in bool type. -func (ctx *Context) QueryBool(name string) bool { - v, _ := strconv.ParseBool(ctx.Query(name)) - return v -} - -// QueryInt returns query result in int type. -func (ctx *Context) QueryInt(name string) int { - return com.StrTo(ctx.Query(name)).MustInt() -} - -// QueryInt64 returns query result in int64 type. -func (ctx *Context) QueryInt64(name string) int64 { - return com.StrTo(ctx.Query(name)).MustInt64() -} - -// QueryFloat64 returns query result in float64 type. -func (ctx *Context) QueryFloat64(name string) float64 { - v, _ := strconv.ParseFloat(ctx.Query(name), 64) - return v -} - -// Params returns value of given param name. -// e.g. ctx.Params(":uid") or ctx.Params("uid") -func (ctx *Context) Params(name string) string { - if len(name) == 0 { - return "" - } - if len(name) > 1 && name[0] != ':' { - name = ":" + name - } - return ctx.params[name] -} - -// SetParams sets value of param with given name. -func (ctx *Context) SetParams(name, val string) { - if !strings.HasPrefix(name, ":") { - name = ":" + name - } - ctx.params[name] = val -} - -// ParamsEscape returns escapred params result. -// e.g. ctx.ParamsEscape(":uname") -func (ctx *Context) ParamsEscape(name string) string { - return template.HTMLEscapeString(ctx.Params(name)) -} - -// ParamsInt returns params result in int type. -// e.g. ctx.ParamsInt(":uid") -func (ctx *Context) ParamsInt(name string) int { - return com.StrTo(ctx.Params(name)).MustInt() -} - -// ParamsInt64 returns params result in int64 type. -// e.g. ctx.ParamsInt64(":uid") -func (ctx *Context) ParamsInt64(name string) int64 { - return com.StrTo(ctx.Params(name)).MustInt64() -} - -// ParamsFloat64 returns params result in int64 type. -// e.g. ctx.ParamsFloat64(":uid") -func (ctx *Context) ParamsFloat64(name string) float64 { - v, _ := strconv.ParseFloat(ctx.Params(name), 64) - return v -} - -// GetFile returns information about user upload file by given form field name. -func (ctx *Context) GetFile(name string) (multipart.File, *multipart.FileHeader, error) { - return ctx.Req.FormFile(name) -} - -// SaveToFile reads a file from request by field name and saves to given path. -func (ctx *Context) SaveToFile(name, savePath string) error { - fr, _, err := ctx.GetFile(name) - if err != nil { - return err - } - defer fr.Close() - - fw, err := os.OpenFile(savePath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666) - if err != nil { - return err - } - defer fw.Close() - - _, err = io.Copy(fw, fr) - return err -} - -// SetCookie sets given cookie value to response header. -// FIXME: IE support? http://golanghome.com/post/620#reply2 -func (ctx *Context) SetCookie(name string, value string, others ...interface{}) { - cookie := http.Cookie{} - cookie.Name = name - cookie.Value = url.QueryEscape(value) - - if len(others) > 0 { - switch v := others[0].(type) { - case int: - cookie.MaxAge = v - case int64: - cookie.MaxAge = int(v) - case int32: - cookie.MaxAge = int(v) - } - } - - cookie.Path = "/" - if len(others) > 1 { - if v, ok := others[1].(string); ok && len(v) > 0 { - cookie.Path = v - } - } - - if len(others) > 2 { - if v, ok := others[2].(string); ok && len(v) > 0 { - cookie.Domain = v - } - } - - if len(others) > 3 { - switch v := others[3].(type) { - case bool: - cookie.Secure = v - default: - if others[3] != nil { - cookie.Secure = true - } - } - } - - if len(others) > 4 { - if v, ok := others[4].(bool); ok && v { - cookie.HttpOnly = true - } - } - - if len(others) > 5 { - if v, ok := others[5].(time.Time); ok { - cookie.Expires = v - cookie.RawExpires = v.Format(time.UnixDate) - } - } - - ctx.Resp.Header().Add("Set-Cookie", cookie.String()) -} - -// GetCookie returns given cookie value from request header. -func (ctx *Context) GetCookie(name string) string { - cookie, err := ctx.Req.Cookie(name) - if err != nil { - return "" - } - val, _ := url.QueryUnescape(cookie.Value) - return val -} - -// GetCookieInt returns cookie result in int type. -func (ctx *Context) GetCookieInt(name string) int { - return com.StrTo(ctx.GetCookie(name)).MustInt() -} - -// GetCookieInt64 returns cookie result in int64 type. -func (ctx *Context) GetCookieInt64(name string) int64 { - return com.StrTo(ctx.GetCookie(name)).MustInt64() -} - -// GetCookieFloat64 returns cookie result in float64 type. -func (ctx *Context) GetCookieFloat64(name string) float64 { - v, _ := strconv.ParseFloat(ctx.GetCookie(name), 64) - return v -} - -var defaultCookieSecret string - -// SetDefaultCookieSecret sets global default secure cookie secret. -func (m *Macaron) SetDefaultCookieSecret(secret string) { - defaultCookieSecret = secret -} - -// SetSecureCookie sets given cookie value to response header with default secret string. -func (ctx *Context) SetSecureCookie(name, value string, others ...interface{}) { - ctx.SetSuperSecureCookie(defaultCookieSecret, name, value, others...) -} - -// GetSecureCookie returns given cookie value from request header with default secret string. -func (ctx *Context) GetSecureCookie(key string) (string, bool) { - return ctx.GetSuperSecureCookie(defaultCookieSecret, key) -} - -// SetSuperSecureCookie sets given cookie value to response header with secret string. -func (ctx *Context) SetSuperSecureCookie(secret, name, value string, others ...interface{}) { - key := pbkdf2.Key([]byte(secret), []byte(secret), 1000, 16, sha256.New) - text, err := com.AESGCMEncrypt(key, []byte(value)) - if err != nil { - panic("error encrypting cookie: " + err.Error()) - } - - ctx.SetCookie(name, hex.EncodeToString(text), others...) -} - -// GetSuperSecureCookie returns given cookie value from request header with secret string. -func (ctx *Context) GetSuperSecureCookie(secret, name string) (string, bool) { - val := ctx.GetCookie(name) - if val == "" { - return "", false - } - - text, err := hex.DecodeString(val) - if err != nil { - return "", false - } - - key := pbkdf2.Key([]byte(secret), []byte(secret), 1000, 16, sha256.New) - text, err = com.AESGCMDecrypt(key, text) - return string(text), err == nil -} - -func (ctx *Context) setRawContentHeader() { - ctx.Resp.Header().Set("Content-Description", "Raw content") - ctx.Resp.Header().Set("Content-Type", "text/plain") - ctx.Resp.Header().Set("Expires", "0") - ctx.Resp.Header().Set("Cache-Control", "must-revalidate") - ctx.Resp.Header().Set("Pragma", "public") -} - -// ServeContent serves given content to response. -func (ctx *Context) ServeContent(name string, r io.ReadSeeker, params ...interface{}) { - modtime := time.Now() - for _, p := range params { - switch v := p.(type) { - case time.Time: - modtime = v - } - } - - ctx.setRawContentHeader() - http.ServeContent(ctx.Resp, ctx.Req.Request, name, modtime, r) -} - -// ServeFileContent serves given file as content to response. -func (ctx *Context) ServeFileContent(file string, names ...string) { - var name string - if len(names) > 0 { - name = names[0] - } else { - name = path.Base(file) - } - - f, err := os.Open(file) - if err != nil { - if Env == PROD { - http.Error(ctx.Resp, "Internal Server Error", 500) - } else { - http.Error(ctx.Resp, err.Error(), 500) - } - return - } - defer f.Close() - - ctx.setRawContentHeader() - http.ServeContent(ctx.Resp, ctx.Req.Request, name, time.Now(), f) -} - -// ServeFile serves given file to response. -func (ctx *Context) ServeFile(file string, names ...string) { - var name string - if len(names) > 0 { - name = names[0] - } else { - name = path.Base(file) - } - ctx.Resp.Header().Set("Content-Description", "File Transfer") - ctx.Resp.Header().Set("Content-Type", "application/octet-stream") - ctx.Resp.Header().Set("Content-Disposition", "attachment; filename="+name) - ctx.Resp.Header().Set("Content-Transfer-Encoding", "binary") - ctx.Resp.Header().Set("Expires", "0") - ctx.Resp.Header().Set("Cache-Control", "must-revalidate") - ctx.Resp.Header().Set("Pragma", "public") - http.ServeFile(ctx.Resp, ctx.Req.Request, file) -} - -// ChangeStaticPath changes static path from old to new one. -func (ctx *Context) ChangeStaticPath(oldPath, newPath string) { - if !filepath.IsAbs(oldPath) { - oldPath = filepath.Join(Root, oldPath) - } - dir := statics.Get(oldPath) - if dir != nil { - statics.Delete(oldPath) - - if !filepath.IsAbs(newPath) { - newPath = filepath.Join(Root, newPath) - } - *dir = http.Dir(newPath) - statics.Set(dir) - } -} diff --git a/vendor/gopkg.in/macaron.v1/logger.go b/vendor/gopkg.in/macaron.v1/logger.go deleted file mode 100644 index 3c54c24d5..000000000 --- a/vendor/gopkg.in/macaron.v1/logger.go +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright 2013 Martini Authors -// Copyright 2014 The Macaron Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package macaron - -import ( - "fmt" - "log" - "net/http" - "reflect" - "runtime" - "time" -) - -var ( - ColorLog = true - LogTimeFormat = "2006-01-02 15:04:05" -) - -func init() { - ColorLog = runtime.GOOS != "windows" -} - -// LoggerInvoker is an inject.FastInvoker wrapper of func(ctx *Context, log *log.Logger). -type LoggerInvoker func(ctx *Context, log *log.Logger) - -func (invoke LoggerInvoker) Invoke(params []interface{}) ([]reflect.Value, error) { - invoke(params[0].(*Context), params[1].(*log.Logger)) - return nil, nil -} - -// Logger returns a middleware handler that logs the request as it goes in and the response as it goes out. -func Logger() Handler { - return func(ctx *Context, log *log.Logger) { - start := time.Now() - - log.Printf("%s: Started %s %s for %s", time.Now().Format(LogTimeFormat), ctx.Req.Method, ctx.Req.RequestURI, ctx.RemoteAddr()) - - rw := ctx.Resp.(ResponseWriter) - ctx.Next() - - content := fmt.Sprintf("%s: Completed %s %v %s in %v", time.Now().Format(LogTimeFormat), ctx.Req.RequestURI, rw.Status(), http.StatusText(rw.Status()), time.Since(start)) - if ColorLog { - switch rw.Status() { - case 200, 201, 202: - content = fmt.Sprintf("\033[1;32m%s\033[0m", content) - case 301, 302: - content = fmt.Sprintf("\033[1;37m%s\033[0m", content) - case 304: - content = fmt.Sprintf("\033[1;33m%s\033[0m", content) - case 401, 403: - content = fmt.Sprintf("\033[4;31m%s\033[0m", content) - case 404: - content = fmt.Sprintf("\033[1;31m%s\033[0m", content) - case 500: - content = fmt.Sprintf("\033[1;36m%s\033[0m", content) - } - } - log.Println(content) - } -} diff --git a/vendor/gopkg.in/macaron.v1/macaron.go b/vendor/gopkg.in/macaron.v1/macaron.go deleted file mode 100644 index 30ffca1cd..000000000 --- a/vendor/gopkg.in/macaron.v1/macaron.go +++ /dev/null @@ -1,334 +0,0 @@ -// +build go1.3 - -// Copyright 2014 The Macaron Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -// Package macaron is a high productive and modular web framework in Go. -package macaron - -import ( - "io" - "log" - "net/http" - "os" - "reflect" - "strings" - "sync" - - "github.com/Unknwon/com" - "gopkg.in/ini.v1" - - "github.com/go-macaron/inject" -) - -const _VERSION = "1.2.1.0213" - -func Version() string { - return _VERSION -} - -// Handler can be any callable function. -// Macaron attempts to inject services into the handler's argument list, -// and panics if an argument could not be fullfilled via dependency injection. -type Handler interface{} - -// handlerFuncInvoker is an inject.FastInvoker wrapper of func(http.ResponseWriter, *http.Request). -type handlerFuncInvoker func(http.ResponseWriter, *http.Request) - -func (invoke handlerFuncInvoker) Invoke(params []interface{}) ([]reflect.Value, error) { - invoke(params[0].(http.ResponseWriter), params[1].(*http.Request)) - return nil, nil -} - -// internalServerErrorInvoker is an inject.FastInvoker wrapper of func(rw http.ResponseWriter, err error). -type internalServerErrorInvoker func(rw http.ResponseWriter, err error) - -func (invoke internalServerErrorInvoker) Invoke(params []interface{}) ([]reflect.Value, error) { - invoke(params[0].(http.ResponseWriter), params[1].(error)) - return nil, nil -} - -// validateAndWrapHandler makes sure a handler is a callable function, it panics if not. -// When the handler is also potential to be any built-in inject.FastInvoker, -// it wraps the handler automatically to have some performance gain. -func validateAndWrapHandler(h Handler) Handler { - if reflect.TypeOf(h).Kind() != reflect.Func { - panic("Macaron handler must be a callable function") - } - - if !inject.IsFastInvoker(h) { - switch v := h.(type) { - case func(*Context): - return ContextInvoker(v) - case func(*Context, *log.Logger): - return LoggerInvoker(v) - case func(http.ResponseWriter, *http.Request): - return handlerFuncInvoker(v) - case func(http.ResponseWriter, error): - return internalServerErrorInvoker(v) - } - } - return h -} - -// validateAndWrapHandlers preforms validation and wrapping for each input handler. -// It accepts an optional wrapper function to perform custom wrapping on handlers. -func validateAndWrapHandlers(handlers []Handler, wrappers ...func(Handler) Handler) []Handler { - var wrapper func(Handler) Handler - if len(wrappers) > 0 { - wrapper = wrappers[0] - } - - wrappedHandlers := make([]Handler, len(handlers)) - for i, h := range handlers { - h = validateAndWrapHandler(h) - if wrapper != nil && !inject.IsFastInvoker(h) { - h = wrapper(h) - } - wrappedHandlers[i] = h - } - - return wrappedHandlers -} - -// Macaron represents the top level web application. -// inject.Injector methods can be invoked to map services on a global level. -type Macaron struct { - inject.Injector - befores []BeforeHandler - handlers []Handler - action Handler - - hasURLPrefix bool - urlPrefix string // For suburl support. - *Router - - logger *log.Logger -} - -// NewWithLogger creates a bare bones Macaron instance. -// Use this method if you want to have full control over the middleware that is used. -// You can specify logger output writer with this function. -func NewWithLogger(out io.Writer) *Macaron { - m := &Macaron{ - Injector: inject.New(), - action: func() {}, - Router: NewRouter(), - logger: log.New(out, "[Macaron] ", 0), - } - m.Router.m = m - m.Map(m.logger) - m.Map(defaultReturnHandler()) - m.NotFound(http.NotFound) - m.InternalServerError(func(rw http.ResponseWriter, err error) { - http.Error(rw, err.Error(), 500) - }) - return m -} - -// New creates a bare bones Macaron instance. -// Use this method if you want to have full control over the middleware that is used. -func New() *Macaron { - return NewWithLogger(os.Stdout) -} - -// Classic creates a classic Macaron with some basic default middleware: -// macaron.Logger, macaron.Recovery and macaron.Static. -func Classic() *Macaron { - m := New() - m.Use(Logger()) - m.Use(Recovery()) - m.Use(Static("public")) - return m -} - -// Handlers sets the entire middleware stack with the given Handlers. -// This will clear any current middleware handlers, -// and panics if any of the handlers is not a callable function -func (m *Macaron) Handlers(handlers ...Handler) { - m.handlers = make([]Handler, 0) - for _, handler := range handlers { - m.Use(handler) - } -} - -// Action sets the handler that will be called after all the middleware has been invoked. -// This is set to macaron.Router in a macaron.Classic(). -func (m *Macaron) Action(handler Handler) { - handler = validateAndWrapHandler(handler) - m.action = handler -} - -// BeforeHandler represents a handler executes at beginning of every request. -// Macaron stops future process when it returns true. -type BeforeHandler func(rw http.ResponseWriter, req *http.Request) bool - -func (m *Macaron) Before(handler BeforeHandler) { - m.befores = append(m.befores, handler) -} - -// Use adds a middleware Handler to the stack, -// and panics if the handler is not a callable func. -// Middleware Handlers are invoked in the order that they are added. -func (m *Macaron) Use(handler Handler) { - handler = validateAndWrapHandler(handler) - m.handlers = append(m.handlers, handler) -} - -func (m *Macaron) createContext(rw http.ResponseWriter, req *http.Request) *Context { - c := &Context{ - Injector: inject.New(), - handlers: m.handlers, - action: m.action, - index: 0, - Router: m.Router, - Req: Request{req}, - Resp: NewResponseWriter(rw), - Render: &DummyRender{rw}, - Data: make(map[string]interface{}), - } - c.SetParent(m) - c.Map(c) - c.MapTo(c.Resp, (*http.ResponseWriter)(nil)) - c.Map(req) - return c -} - -// ServeHTTP is the HTTP Entry point for a Macaron instance. -// Useful if you want to control your own HTTP server. -// Be aware that none of middleware will run without registering any router. -func (m *Macaron) ServeHTTP(rw http.ResponseWriter, req *http.Request) { - if m.hasURLPrefix { - req.URL.Path = strings.TrimPrefix(req.URL.Path, m.urlPrefix) - } - for _, h := range m.befores { - if h(rw, req) { - return - } - } - m.Router.ServeHTTP(rw, req) -} - -func GetDefaultListenInfo() (string, int) { - host := os.Getenv("HOST") - if len(host) == 0 { - host = "0.0.0.0" - } - port := com.StrTo(os.Getenv("PORT")).MustInt() - if port == 0 { - port = 4000 - } - return host, port -} - -// Run the http server. Listening on os.GetEnv("PORT") or 4000 by default. -func (m *Macaron) Run(args ...interface{}) { - host, port := GetDefaultListenInfo() - if len(args) == 1 { - switch arg := args[0].(type) { - case string: - host = arg - case int: - port = arg - } - } else if len(args) >= 2 { - if arg, ok := args[0].(string); ok { - host = arg - } - if arg, ok := args[1].(int); ok { - port = arg - } - } - - addr := host + ":" + com.ToStr(port) - logger := m.GetVal(reflect.TypeOf(m.logger)).Interface().(*log.Logger) - logger.Printf("listening on %s (%s)\n", addr, safeEnv()) - logger.Fatalln(http.ListenAndServe(addr, m)) -} - -// SetURLPrefix sets URL prefix of router layer, so that it support suburl. -func (m *Macaron) SetURLPrefix(prefix string) { - m.urlPrefix = prefix - m.hasURLPrefix = len(m.urlPrefix) > 0 -} - -// ____ ____ .__ ___. .__ -// \ \ / /____ _______|__|____ \_ |__ | | ____ ______ -// \ Y /\__ \\_ __ \ \__ \ | __ \| | _/ __ \ / ___/ -// \ / / __ \| | \/ |/ __ \| \_\ \ |_\ ___/ \___ \ -// \___/ (____ /__| |__(____ /___ /____/\___ >____ > -// \/ \/ \/ \/ \/ - -const ( - DEV = "development" - PROD = "production" - TEST = "test" -) - -var ( - // Env is the environment that Macaron is executing in. - // The MACARON_ENV is read on initialization to set this variable. - Env = DEV - envLock sync.Mutex - - // Path of work directory. - Root string - - // Flash applies to current request. - FlashNow bool - - // Configuration convention object. - cfg *ini.File -) - -func setENV(e string) { - envLock.Lock() - defer envLock.Unlock() - - if len(e) > 0 { - Env = e - } -} - -func safeEnv() string { - envLock.Lock() - defer envLock.Unlock() - - return Env -} - -func init() { - setENV(os.Getenv("MACARON_ENV")) - - var err error - Root, err = os.Getwd() - if err != nil { - panic("error getting work directory: " + err.Error()) - } -} - -// SetConfig sets data sources for configuration. -func SetConfig(source interface{}, others ...interface{}) (_ *ini.File, err error) { - cfg, err = ini.Load(source, others...) - return Config(), err -} - -// Config returns configuration convention object. -// It returns an empty object if there is no one available. -func Config() *ini.File { - if cfg == nil { - return ini.Empty() - } - return cfg -} diff --git a/vendor/gopkg.in/macaron.v1/macaronlogo.png b/vendor/gopkg.in/macaron.v1/macaronlogo.png deleted file mode 100644 index 399759769..000000000 Binary files a/vendor/gopkg.in/macaron.v1/macaronlogo.png and /dev/null differ diff --git a/vendor/gopkg.in/macaron.v1/recovery.go b/vendor/gopkg.in/macaron.v1/recovery.go deleted file mode 100644 index ea3bdac04..000000000 --- a/vendor/gopkg.in/macaron.v1/recovery.go +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright 2013 Martini Authors -// Copyright 2014 The Macaron Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package macaron - -import ( - "bytes" - "fmt" - "io/ioutil" - "log" - "net/http" - "runtime" - - "github.com/go-macaron/inject" -) - -const ( - panicHtml = ` -PANIC: %s - - - -

PANIC

-
%s
-
%s
- -` -) - -var ( - dunno = []byte("???") - centerDot = []byte("·") - dot = []byte(".") - slash = []byte("/") -) - -// stack returns a nicely formated stack frame, skipping skip frames -func stack(skip int) []byte { - buf := new(bytes.Buffer) // the returned data - // As we loop, we open files and read them. These variables record the currently - // loaded file. - var lines [][]byte - var lastFile string - for i := skip; ; i++ { // Skip the expected number of frames - pc, file, line, ok := runtime.Caller(i) - if !ok { - break - } - // Print this much at least. If we can't find the source, it won't show. - fmt.Fprintf(buf, "%s:%d (0x%x)\n", file, line, pc) - if file != lastFile { - data, err := ioutil.ReadFile(file) - if err != nil { - continue - } - lines = bytes.Split(data, []byte{'\n'}) - lastFile = file - } - fmt.Fprintf(buf, "\t%s: %s\n", function(pc), source(lines, line)) - } - return buf.Bytes() -} - -// source returns a space-trimmed slice of the n'th line. -func source(lines [][]byte, n int) []byte { - n-- // in stack trace, lines are 1-indexed but our array is 0-indexed - if n < 0 || n >= len(lines) { - return dunno - } - return bytes.TrimSpace(lines[n]) -} - -// function returns, if possible, the name of the function containing the PC. -func function(pc uintptr) []byte { - fn := runtime.FuncForPC(pc) - if fn == nil { - return dunno - } - name := []byte(fn.Name()) - // The name includes the path name to the package, which is unnecessary - // since the file name is already included. Plus, it has center dots. - // That is, we see - // runtime/debug.*T·ptrmethod - // and want - // *T.ptrmethod - // Also the package path might contains dot (e.g. code.google.com/...), - // so first eliminate the path prefix - if lastslash := bytes.LastIndex(name, slash); lastslash >= 0 { - name = name[lastslash+1:] - } - if period := bytes.Index(name, dot); period >= 0 { - name = name[period+1:] - } - name = bytes.Replace(name, centerDot, dot, -1) - return name -} - -// Recovery returns a middleware that recovers from any panics and writes a 500 if there was one. -// While Martini is in development mode, Recovery will also output the panic as HTML. -func Recovery() Handler { - return func(c *Context, log *log.Logger) { - defer func() { - if err := recover(); err != nil { - stack := stack(3) - log.Printf("PANIC: %s\n%s", err, stack) - - // Lookup the current responsewriter - val := c.GetVal(inject.InterfaceOf((*http.ResponseWriter)(nil))) - res := val.Interface().(http.ResponseWriter) - - // respond with panic message while in development mode - var body []byte - if Env == DEV { - res.Header().Set("Content-Type", "text/html") - body = []byte(fmt.Sprintf(panicHtml, err, err, stack)) - } - - res.WriteHeader(http.StatusInternalServerError) - if nil != body { - res.Write(body) - } - } - }() - - c.Next() - } -} diff --git a/vendor/gopkg.in/macaron.v1/render.go b/vendor/gopkg.in/macaron.v1/render.go deleted file mode 100644 index f45e43124..000000000 --- a/vendor/gopkg.in/macaron.v1/render.go +++ /dev/null @@ -1,725 +0,0 @@ -// Copyright 2013 Martini Authors -// Copyright 2014 The Macaron Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package macaron - -import ( - "bytes" - "encoding/json" - "encoding/xml" - "fmt" - "html/template" - "io" - "io/ioutil" - "net/http" - "os" - "path" - "path/filepath" - "strings" - "sync" - "time" - - "github.com/Unknwon/com" -) - -const ( - _CONTENT_TYPE = "Content-Type" - _CONTENT_LENGTH = "Content-Length" - _CONTENT_BINARY = "application/octet-stream" - _CONTENT_JSON = "application/json" - _CONTENT_HTML = "text/html" - _CONTENT_PLAIN = "text/plain" - _CONTENT_XHTML = "application/xhtml+xml" - _CONTENT_XML = "text/xml" - _DEFAULT_CHARSET = "UTF-8" -) - -var ( - // Provides a temporary buffer to execute templates into and catch errors. - bufpool = sync.Pool{ - New: func() interface{} { return new(bytes.Buffer) }, - } - - // Included helper functions for use when rendering html - helperFuncs = template.FuncMap{ - "yield": func() (string, error) { - return "", fmt.Errorf("yield called with no layout defined") - }, - "current": func() (string, error) { - return "", nil - }, - } -) - -type ( - // TemplateFile represents a interface of template file that has name and can be read. - TemplateFile interface { - Name() string - Data() []byte - Ext() string - } - // TemplateFileSystem represents a interface of template file system that able to list all files. - TemplateFileSystem interface { - ListFiles() []TemplateFile - Get(string) (io.Reader, error) - } - - // Delims represents a set of Left and Right delimiters for HTML template rendering - Delims struct { - // Left delimiter, defaults to {{ - Left string - // Right delimiter, defaults to }} - Right string - } - - // RenderOptions represents a struct for specifying configuration options for the Render middleware. - RenderOptions struct { - // Directory to load templates. Default is "templates". - Directory string - // Addtional directories to overwite templates. - AppendDirectories []string - // Layout template name. Will not render a layout if "". Default is to "". - Layout string - // Extensions to parse template files from. Defaults are [".tmpl", ".html"]. - Extensions []string - // Funcs is a slice of FuncMaps to apply to the template upon compilation. This is useful for helper functions. Default is []. - Funcs []template.FuncMap - // Delims sets the action delimiters to the specified strings in the Delims struct. - Delims Delims - // Appends the given charset to the Content-Type header. Default is "UTF-8". - Charset string - // Outputs human readable JSON. - IndentJSON bool - // Outputs human readable XML. - IndentXML bool - // Prefixes the JSON output with the given bytes. - PrefixJSON []byte - // Prefixes the XML output with the given bytes. - PrefixXML []byte - // Allows changing of output to XHTML instead of HTML. Default is "text/html" - HTMLContentType string - // TemplateFileSystem is the interface for supporting any implmentation of template file system. - TemplateFileSystem - } - - // HTMLOptions is a struct for overriding some rendering Options for specific HTML call - HTMLOptions struct { - // Layout template name. Overrides Options.Layout. - Layout string - } - - Render interface { - http.ResponseWriter - SetResponseWriter(http.ResponseWriter) - - JSON(int, interface{}) - JSONString(interface{}) (string, error) - RawData(int, []byte) // Serve content as binary - PlainText(int, []byte) // Serve content as plain text - HTML(int, string, interface{}, ...HTMLOptions) - HTMLSet(int, string, string, interface{}, ...HTMLOptions) - HTMLSetString(string, string, interface{}, ...HTMLOptions) (string, error) - HTMLString(string, interface{}, ...HTMLOptions) (string, error) - HTMLSetBytes(string, string, interface{}, ...HTMLOptions) ([]byte, error) - HTMLBytes(string, interface{}, ...HTMLOptions) ([]byte, error) - XML(int, interface{}) - Error(int, ...string) - Status(int) - SetTemplatePath(string, string) - HasTemplateSet(string) bool - } -) - -// TplFile implements TemplateFile interface. -type TplFile struct { - name string - data []byte - ext string -} - -// NewTplFile cerates new template file with given name and data. -func NewTplFile(name string, data []byte, ext string) *TplFile { - return &TplFile{name, data, ext} -} - -func (f *TplFile) Name() string { - return f.name -} - -func (f *TplFile) Data() []byte { - return f.data -} - -func (f *TplFile) Ext() string { - return f.ext -} - -// TplFileSystem implements TemplateFileSystem interface. -type TplFileSystem struct { - files []TemplateFile -} - -// NewTemplateFileSystem creates new template file system with given options. -func NewTemplateFileSystem(opt RenderOptions, omitData bool) TplFileSystem { - fs := TplFileSystem{} - fs.files = make([]TemplateFile, 0, 10) - - // Directories are composed in reverse order because later one overwrites previous ones, - // so once found, we can directly jump out of the loop. - dirs := make([]string, 0, len(opt.AppendDirectories)+1) - for i := len(opt.AppendDirectories) - 1; i >= 0; i-- { - dirs = append(dirs, opt.AppendDirectories[i]) - } - dirs = append(dirs, opt.Directory) - - var err error - for i := range dirs { - // Skip ones that does not exists for symlink test, - // but allow non-symlink ones added after start. - if !com.IsExist(dirs[i]) { - continue - } - - dirs[i], err = filepath.EvalSymlinks(dirs[i]) - if err != nil { - panic("EvalSymlinks(" + dirs[i] + "): " + err.Error()) - } - } - lastDir := dirs[len(dirs)-1] - - // We still walk the last (original) directory because it's non-sense we load templates not exist in original directory. - if err = filepath.Walk(lastDir, func(path string, info os.FileInfo, err error) error { - r, err := filepath.Rel(lastDir, path) - if err != nil { - return err - } - - ext := GetExt(r) - - for _, extension := range opt.Extensions { - if ext != extension { - continue - } - - var data []byte - if !omitData { - // Loop over candidates of directory, break out once found. - // The file always exists because it's inside the walk function, - // and read original file is the worst case. - for i := range dirs { - path = filepath.Join(dirs[i], r) - if !com.IsFile(path) { - continue - } - - data, err = ioutil.ReadFile(path) - if err != nil { - return err - } - break - } - } - - name := filepath.ToSlash((r[0 : len(r)-len(ext)])) - fs.files = append(fs.files, NewTplFile(name, data, ext)) - } - - return nil - }); err != nil { - panic("NewTemplateFileSystem: " + err.Error()) - } - - return fs -} - -func (fs TplFileSystem) ListFiles() []TemplateFile { - return fs.files -} - -func (fs TplFileSystem) Get(name string) (io.Reader, error) { - for i := range fs.files { - if fs.files[i].Name()+fs.files[i].Ext() == name { - return bytes.NewReader(fs.files[i].Data()), nil - } - } - return nil, fmt.Errorf("file '%s' not found", name) -} - -func PrepareCharset(charset string) string { - if len(charset) != 0 { - return "; charset=" + charset - } - - return "; charset=" + _DEFAULT_CHARSET -} - -func GetExt(s string) string { - index := strings.Index(s, ".") - if index == -1 { - return "" - } - return s[index:] -} - -func compile(opt RenderOptions) *template.Template { - t := template.New(opt.Directory) - t.Delims(opt.Delims.Left, opt.Delims.Right) - // Parse an initial template in case we don't have any. - template.Must(t.Parse("Macaron")) - - if opt.TemplateFileSystem == nil { - opt.TemplateFileSystem = NewTemplateFileSystem(opt, false) - } - - for _, f := range opt.TemplateFileSystem.ListFiles() { - tmpl := t.New(f.Name()) - for _, funcs := range opt.Funcs { - tmpl.Funcs(funcs) - } - // Bomb out if parse fails. We don't want any silent server starts. - template.Must(tmpl.Funcs(helperFuncs).Parse(string(f.Data()))) - } - - return t -} - -const ( - DEFAULT_TPL_SET_NAME = "DEFAULT" -) - -// TemplateSet represents a template set of type *template.Template. -type TemplateSet struct { - lock sync.RWMutex - sets map[string]*template.Template - dirs map[string]string -} - -// NewTemplateSet initializes a new empty template set. -func NewTemplateSet() *TemplateSet { - return &TemplateSet{ - sets: make(map[string]*template.Template), - dirs: make(map[string]string), - } -} - -func (ts *TemplateSet) Set(name string, opt *RenderOptions) *template.Template { - t := compile(*opt) - - ts.lock.Lock() - defer ts.lock.Unlock() - - ts.sets[name] = t - ts.dirs[name] = opt.Directory - return t -} - -func (ts *TemplateSet) Get(name string) *template.Template { - ts.lock.RLock() - defer ts.lock.RUnlock() - - return ts.sets[name] -} - -func (ts *TemplateSet) GetDir(name string) string { - ts.lock.RLock() - defer ts.lock.RUnlock() - - return ts.dirs[name] -} - -func prepareRenderOptions(options []RenderOptions) RenderOptions { - var opt RenderOptions - if len(options) > 0 { - opt = options[0] - } - - // Defaults. - if len(opt.Directory) == 0 { - opt.Directory = "templates" - } - if len(opt.Extensions) == 0 { - opt.Extensions = []string{".tmpl", ".html"} - } - if len(opt.HTMLContentType) == 0 { - opt.HTMLContentType = _CONTENT_HTML - } - - return opt -} - -func ParseTplSet(tplSet string) (tplName string, tplDir string) { - tplSet = strings.TrimSpace(tplSet) - if len(tplSet) == 0 { - panic("empty template set argument") - } - infos := strings.Split(tplSet, ":") - if len(infos) == 1 { - tplDir = infos[0] - tplName = path.Base(tplDir) - } else { - tplName = infos[0] - tplDir = infos[1] - } - - if !com.IsDir(tplDir) { - panic("template set path does not exist or is not a directory") - } - return tplName, tplDir -} - -func renderHandler(opt RenderOptions, tplSets []string) Handler { - cs := PrepareCharset(opt.Charset) - ts := NewTemplateSet() - ts.Set(DEFAULT_TPL_SET_NAME, &opt) - - var tmpOpt RenderOptions - for _, tplSet := range tplSets { - tplName, tplDir := ParseTplSet(tplSet) - tmpOpt = opt - tmpOpt.Directory = tplDir - ts.Set(tplName, &tmpOpt) - } - - return func(ctx *Context) { - r := &TplRender{ - ResponseWriter: ctx.Resp, - TemplateSet: ts, - Opt: &opt, - CompiledCharset: cs, - } - ctx.Data["TmplLoadTimes"] = func() string { - if r.startTime.IsZero() { - return "" - } - return fmt.Sprint(time.Since(r.startTime).Nanoseconds()/1e6) + "ms" - } - - ctx.Render = r - ctx.MapTo(r, (*Render)(nil)) - } -} - -// Renderer is a Middleware that maps a macaron.Render service into the Macaron handler chain. -// An single variadic macaron.RenderOptions struct can be optionally provided to configure -// HTML rendering. The default directory for templates is "templates" and the default -// file extension is ".tmpl" and ".html". -// -// If MACARON_ENV is set to "" or "development" then templates will be recompiled on every request. For more performance, set the -// MACARON_ENV environment variable to "production". -func Renderer(options ...RenderOptions) Handler { - return renderHandler(prepareRenderOptions(options), []string{}) -} - -func Renderers(options RenderOptions, tplSets ...string) Handler { - return renderHandler(prepareRenderOptions([]RenderOptions{options}), tplSets) -} - -type TplRender struct { - http.ResponseWriter - *TemplateSet - Opt *RenderOptions - CompiledCharset string - - startTime time.Time -} - -func (r *TplRender) SetResponseWriter(rw http.ResponseWriter) { - r.ResponseWriter = rw -} - -func (r *TplRender) JSON(status int, v interface{}) { - var ( - result []byte - err error - ) - if r.Opt.IndentJSON { - result, err = json.MarshalIndent(v, "", " ") - } else { - result, err = json.Marshal(v) - } - if err != nil { - http.Error(r, err.Error(), 500) - return - } - - // json rendered fine, write out the result - r.Header().Set(_CONTENT_TYPE, _CONTENT_JSON+r.CompiledCharset) - r.WriteHeader(status) - if len(r.Opt.PrefixJSON) > 0 { - r.Write(r.Opt.PrefixJSON) - } - r.Write(result) -} - -func (r *TplRender) JSONString(v interface{}) (string, error) { - var result []byte - var err error - if r.Opt.IndentJSON { - result, err = json.MarshalIndent(v, "", " ") - } else { - result, err = json.Marshal(v) - } - if err != nil { - return "", err - } - return string(result), nil -} - -func (r *TplRender) XML(status int, v interface{}) { - var result []byte - var err error - if r.Opt.IndentXML { - result, err = xml.MarshalIndent(v, "", " ") - } else { - result, err = xml.Marshal(v) - } - if err != nil { - http.Error(r, err.Error(), 500) - return - } - - // XML rendered fine, write out the result - r.Header().Set(_CONTENT_TYPE, _CONTENT_XML+r.CompiledCharset) - r.WriteHeader(status) - if len(r.Opt.PrefixXML) > 0 { - r.Write(r.Opt.PrefixXML) - } - r.Write(result) -} - -func (r *TplRender) data(status int, contentType string, v []byte) { - if r.Header().Get(_CONTENT_TYPE) == "" { - r.Header().Set(_CONTENT_TYPE, contentType) - } - r.WriteHeader(status) - r.Write(v) -} - -func (r *TplRender) RawData(status int, v []byte) { - r.data(status, _CONTENT_BINARY, v) -} - -func (r *TplRender) PlainText(status int, v []byte) { - r.data(status, _CONTENT_PLAIN, v) -} - -func (r *TplRender) execute(t *template.Template, name string, data interface{}) (*bytes.Buffer, error) { - buf := bufpool.Get().(*bytes.Buffer) - return buf, t.ExecuteTemplate(buf, name, data) -} - -func (r *TplRender) addYield(t *template.Template, tplName string, data interface{}) { - funcs := template.FuncMap{ - "yield": func() (template.HTML, error) { - buf, err := r.execute(t, tplName, data) - // return safe html here since we are rendering our own template - return template.HTML(buf.String()), err - }, - "current": func() (string, error) { - return tplName, nil - }, - } - t.Funcs(funcs) -} - -func (r *TplRender) renderBytes(setName, tplName string, data interface{}, htmlOpt ...HTMLOptions) (*bytes.Buffer, error) { - t := r.TemplateSet.Get(setName) - if Env == DEV { - opt := *r.Opt - opt.Directory = r.TemplateSet.GetDir(setName) - t = r.TemplateSet.Set(setName, &opt) - } - if t == nil { - return nil, fmt.Errorf("html/template: template \"%s\" is undefined", tplName) - } - - opt := r.prepareHTMLOptions(htmlOpt) - - if len(opt.Layout) > 0 { - r.addYield(t, tplName, data) - tplName = opt.Layout - } - - out, err := r.execute(t, tplName, data) - if err != nil { - return nil, err - } - - return out, nil -} - -func (r *TplRender) renderHTML(status int, setName, tplName string, data interface{}, htmlOpt ...HTMLOptions) { - r.startTime = time.Now() - - out, err := r.renderBytes(setName, tplName, data, htmlOpt...) - if err != nil { - http.Error(r, err.Error(), http.StatusInternalServerError) - return - } - - r.Header().Set(_CONTENT_TYPE, r.Opt.HTMLContentType+r.CompiledCharset) - r.WriteHeader(status) - - if _, err := out.WriteTo(r); err != nil { - out.Reset() - } - bufpool.Put(out) -} - -func (r *TplRender) HTML(status int, name string, data interface{}, htmlOpt ...HTMLOptions) { - r.renderHTML(status, DEFAULT_TPL_SET_NAME, name, data, htmlOpt...) -} - -func (r *TplRender) HTMLSet(status int, setName, tplName string, data interface{}, htmlOpt ...HTMLOptions) { - r.renderHTML(status, setName, tplName, data, htmlOpt...) -} - -func (r *TplRender) HTMLSetBytes(setName, tplName string, data interface{}, htmlOpt ...HTMLOptions) ([]byte, error) { - out, err := r.renderBytes(setName, tplName, data, htmlOpt...) - if err != nil { - return []byte(""), err - } - return out.Bytes(), nil -} - -func (r *TplRender) HTMLBytes(name string, data interface{}, htmlOpt ...HTMLOptions) ([]byte, error) { - return r.HTMLSetBytes(DEFAULT_TPL_SET_NAME, name, data, htmlOpt...) -} - -func (r *TplRender) HTMLSetString(setName, tplName string, data interface{}, htmlOpt ...HTMLOptions) (string, error) { - p, err := r.HTMLSetBytes(setName, tplName, data, htmlOpt...) - return string(p), err -} - -func (r *TplRender) HTMLString(name string, data interface{}, htmlOpt ...HTMLOptions) (string, error) { - p, err := r.HTMLBytes(name, data, htmlOpt...) - return string(p), err -} - -// Error writes the given HTTP status to the current ResponseWriter -func (r *TplRender) Error(status int, message ...string) { - r.WriteHeader(status) - if len(message) > 0 { - r.Write([]byte(message[0])) - } -} - -func (r *TplRender) Status(status int) { - r.WriteHeader(status) -} - -func (r *TplRender) prepareHTMLOptions(htmlOpt []HTMLOptions) HTMLOptions { - if len(htmlOpt) > 0 { - return htmlOpt[0] - } - - return HTMLOptions{ - Layout: r.Opt.Layout, - } -} - -func (r *TplRender) SetTemplatePath(setName, dir string) { - if len(setName) == 0 { - setName = DEFAULT_TPL_SET_NAME - } - opt := *r.Opt - opt.Directory = dir - r.TemplateSet.Set(setName, &opt) -} - -func (r *TplRender) HasTemplateSet(name string) bool { - return r.TemplateSet.Get(name) != nil -} - -// DummyRender is used when user does not choose any real render to use. -// This way, we can print out friendly message which asks them to register one, -// instead of ugly and confusing 'nil pointer' panic. -type DummyRender struct { - http.ResponseWriter -} - -func renderNotRegistered() { - panic("middleware render hasn't been registered") -} - -func (r *DummyRender) SetResponseWriter(http.ResponseWriter) { - renderNotRegistered() -} - -func (r *DummyRender) JSON(int, interface{}) { - renderNotRegistered() -} - -func (r *DummyRender) JSONString(interface{}) (string, error) { - renderNotRegistered() - return "", nil -} - -func (r *DummyRender) RawData(int, []byte) { - renderNotRegistered() -} - -func (r *DummyRender) PlainText(int, []byte) { - renderNotRegistered() -} - -func (r *DummyRender) HTML(int, string, interface{}, ...HTMLOptions) { - renderNotRegistered() -} - -func (r *DummyRender) HTMLSet(int, string, string, interface{}, ...HTMLOptions) { - renderNotRegistered() -} - -func (r *DummyRender) HTMLSetString(string, string, interface{}, ...HTMLOptions) (string, error) { - renderNotRegistered() - return "", nil -} - -func (r *DummyRender) HTMLString(string, interface{}, ...HTMLOptions) (string, error) { - renderNotRegistered() - return "", nil -} - -func (r *DummyRender) HTMLSetBytes(string, string, interface{}, ...HTMLOptions) ([]byte, error) { - renderNotRegistered() - return nil, nil -} - -func (r *DummyRender) HTMLBytes(string, interface{}, ...HTMLOptions) ([]byte, error) { - renderNotRegistered() - return nil, nil -} - -func (r *DummyRender) XML(int, interface{}) { - renderNotRegistered() -} - -func (r *DummyRender) Error(int, ...string) { - renderNotRegistered() -} - -func (r *DummyRender) Status(int) { - renderNotRegistered() -} - -func (r *DummyRender) SetTemplatePath(string, string) { - renderNotRegistered() -} - -func (r *DummyRender) HasTemplateSet(string) bool { - renderNotRegistered() - return false -} diff --git a/vendor/gopkg.in/macaron.v1/response_writer.go b/vendor/gopkg.in/macaron.v1/response_writer.go deleted file mode 100644 index ab54f56c0..000000000 --- a/vendor/gopkg.in/macaron.v1/response_writer.go +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright 2013 Martini Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package macaron - -import ( - "bufio" - "fmt" - "net" - "net/http" -) - -// ResponseWriter is a wrapper around http.ResponseWriter that provides extra information about -// the response. It is recommended that middleware handlers use this construct to wrap a responsewriter -// if the functionality calls for it. -type ResponseWriter interface { - http.ResponseWriter - http.Flusher - // Status returns the status code of the response or 0 if the response has not been written. - Status() int - // Written returns whether or not the ResponseWriter has been written. - Written() bool - // Size returns the size of the response body. - Size() int - // Before allows for a function to be called before the ResponseWriter has been written to. This is - // useful for setting headers or any other operations that must happen before a response has been written. - Before(BeforeFunc) -} - -// BeforeFunc is a function that is called before the ResponseWriter has been written to. -type BeforeFunc func(ResponseWriter) - -// NewResponseWriter creates a ResponseWriter that wraps an http.ResponseWriter -func NewResponseWriter(rw http.ResponseWriter) ResponseWriter { - return &responseWriter{rw, 0, 0, nil} -} - -type responseWriter struct { - http.ResponseWriter - status int - size int - beforeFuncs []BeforeFunc -} - -func (rw *responseWriter) WriteHeader(s int) { - rw.callBefore() - rw.ResponseWriter.WriteHeader(s) - rw.status = s -} - -func (rw *responseWriter) Write(b []byte) (int, error) { - if !rw.Written() { - // The status will be StatusOK if WriteHeader has not been called yet - rw.WriteHeader(http.StatusOK) - } - size, err := rw.ResponseWriter.Write(b) - rw.size += size - return size, err -} - -func (rw *responseWriter) Status() int { - return rw.status -} - -func (rw *responseWriter) Size() int { - return rw.size -} - -func (rw *responseWriter) Written() bool { - return rw.status != 0 -} - -func (rw *responseWriter) Before(before BeforeFunc) { - rw.beforeFuncs = append(rw.beforeFuncs, before) -} - -func (rw *responseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) { - hijacker, ok := rw.ResponseWriter.(http.Hijacker) - if !ok { - return nil, nil, fmt.Errorf("the ResponseWriter doesn't support the Hijacker interface") - } - return hijacker.Hijack() -} - -func (rw *responseWriter) CloseNotify() <-chan bool { - return rw.ResponseWriter.(http.CloseNotifier).CloseNotify() -} - -func (rw *responseWriter) callBefore() { - for i := len(rw.beforeFuncs) - 1; i >= 0; i-- { - rw.beforeFuncs[i](rw) - } -} - -func (rw *responseWriter) Flush() { - flusher, ok := rw.ResponseWriter.(http.Flusher) - if ok { - flusher.Flush() - } -} diff --git a/vendor/gopkg.in/macaron.v1/return_handler.go b/vendor/gopkg.in/macaron.v1/return_handler.go deleted file mode 100644 index db6eec3e9..000000000 --- a/vendor/gopkg.in/macaron.v1/return_handler.go +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright 2013 Martini Authors -// Copyright 2014 The Macaron Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package macaron - -import ( - "net/http" - "reflect" - - "github.com/go-macaron/inject" -) - -// ReturnHandler is a service that Martini provides that is called -// when a route handler returns something. The ReturnHandler is -// responsible for writing to the ResponseWriter based on the values -// that are passed into this function. -type ReturnHandler func(*Context, []reflect.Value) - -func canDeref(val reflect.Value) bool { - return val.Kind() == reflect.Interface || val.Kind() == reflect.Ptr -} - -func isError(val reflect.Value) bool { - _, ok := val.Interface().(error) - return ok -} - -func isByteSlice(val reflect.Value) bool { - return val.Kind() == reflect.Slice && val.Type().Elem().Kind() == reflect.Uint8 -} - -func defaultReturnHandler() ReturnHandler { - return func(ctx *Context, vals []reflect.Value) { - rv := ctx.GetVal(inject.InterfaceOf((*http.ResponseWriter)(nil))) - resp := rv.Interface().(http.ResponseWriter) - var respVal reflect.Value - if len(vals) > 1 && vals[0].Kind() == reflect.Int { - resp.WriteHeader(int(vals[0].Int())) - respVal = vals[1] - } else if len(vals) > 0 { - respVal = vals[0] - - if isError(respVal) { - err := respVal.Interface().(error) - if err != nil { - ctx.internalServerError(ctx, err) - } - return - } else if canDeref(respVal) { - if respVal.IsNil() { - return // Ignore nil error - } - } - } - if canDeref(respVal) { - respVal = respVal.Elem() - } - if isByteSlice(respVal) { - resp.Write(respVal.Bytes()) - } else { - resp.Write([]byte(respVal.String())) - } - } -} diff --git a/vendor/gopkg.in/macaron.v1/router.go b/vendor/gopkg.in/macaron.v1/router.go deleted file mode 100644 index 21b00ec98..000000000 --- a/vendor/gopkg.in/macaron.v1/router.go +++ /dev/null @@ -1,370 +0,0 @@ -// Copyright 2014 The Macaron Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package macaron - -import ( - "net/http" - "strings" - "sync" -) - -var ( - // Known HTTP methods. - _HTTP_METHODS = map[string]bool{ - "GET": true, - "POST": true, - "PUT": true, - "DELETE": true, - "PATCH": true, - "OPTIONS": true, - "HEAD": true, - } -) - -// routeMap represents a thread-safe map for route tree. -type routeMap struct { - lock sync.RWMutex - routes map[string]map[string]*Leaf -} - -// NewRouteMap initializes and returns a new routeMap. -func NewRouteMap() *routeMap { - rm := &routeMap{ - routes: make(map[string]map[string]*Leaf), - } - for m := range _HTTP_METHODS { - rm.routes[m] = make(map[string]*Leaf) - } - return rm -} - -// getLeaf returns Leaf object if a route has been registered. -func (rm *routeMap) getLeaf(method, pattern string) *Leaf { - rm.lock.RLock() - defer rm.lock.RUnlock() - - return rm.routes[method][pattern] -} - -// add adds new route to route tree map. -func (rm *routeMap) add(method, pattern string, leaf *Leaf) { - rm.lock.Lock() - defer rm.lock.Unlock() - - rm.routes[method][pattern] = leaf -} - -type group struct { - pattern string - handlers []Handler -} - -// Router represents a Macaron router layer. -type Router struct { - m *Macaron - autoHead bool - routers map[string]*Tree - *routeMap - namedRoutes map[string]*Leaf - - groups []group - notFound http.HandlerFunc - internalServerError func(*Context, error) - - // handlerWrapper is used to wrap arbitrary function from Handler to inject.FastInvoker. - handlerWrapper func(Handler) Handler -} - -func NewRouter() *Router { - return &Router{ - routers: make(map[string]*Tree), - routeMap: NewRouteMap(), - namedRoutes: make(map[string]*Leaf), - } -} - -// SetAutoHead sets the value who determines whether add HEAD method automatically -// when GET method is added. Combo router will not be affected by this value. -func (r *Router) SetAutoHead(v bool) { - r.autoHead = v -} - -type Params map[string]string - -// Handle is a function that can be registered to a route to handle HTTP requests. -// Like http.HandlerFunc, but has a third parameter for the values of wildcards (variables). -type Handle func(http.ResponseWriter, *http.Request, Params) - -// Route represents a wrapper of leaf route and upper level router. -type Route struct { - router *Router - leaf *Leaf -} - -// Name sets name of route. -func (r *Route) Name(name string) { - if len(name) == 0 { - panic("route name cannot be empty") - } else if r.router.namedRoutes[name] != nil { - panic("route with given name already exists") - } - r.router.namedRoutes[name] = r.leaf -} - -// handle adds new route to the router tree. -func (r *Router) handle(method, pattern string, handle Handle) *Route { - method = strings.ToUpper(method) - - var leaf *Leaf - // Prevent duplicate routes. - if leaf = r.getLeaf(method, pattern); leaf != nil { - return &Route{r, leaf} - } - - // Validate HTTP methods. - if !_HTTP_METHODS[method] && method != "*" { - panic("unknown HTTP method: " + method) - } - - // Generate methods need register. - methods := make(map[string]bool) - if method == "*" { - for m := range _HTTP_METHODS { - methods[m] = true - } - } else { - methods[method] = true - } - - // Add to router tree. - for m := range methods { - if t, ok := r.routers[m]; ok { - leaf = t.Add(pattern, handle) - } else { - t := NewTree() - leaf = t.Add(pattern, handle) - r.routers[m] = t - } - r.add(m, pattern, leaf) - } - return &Route{r, leaf} -} - -// Handle registers a new request handle with the given pattern, method and handlers. -func (r *Router) Handle(method string, pattern string, handlers []Handler) *Route { - if len(r.groups) > 0 { - groupPattern := "" - h := make([]Handler, 0) - for _, g := range r.groups { - groupPattern += g.pattern - h = append(h, g.handlers...) - } - - pattern = groupPattern + pattern - h = append(h, handlers...) - handlers = h - } - handlers = validateAndWrapHandlers(handlers, r.handlerWrapper) - - return r.handle(method, pattern, func(resp http.ResponseWriter, req *http.Request, params Params) { - c := r.m.createContext(resp, req) - c.params = params - c.handlers = make([]Handler, 0, len(r.m.handlers)+len(handlers)) - c.handlers = append(c.handlers, r.m.handlers...) - c.handlers = append(c.handlers, handlers...) - c.run() - }) -} - -func (r *Router) Group(pattern string, fn func(), h ...Handler) { - r.groups = append(r.groups, group{pattern, h}) - fn() - r.groups = r.groups[:len(r.groups)-1] -} - -// Get is a shortcut for r.Handle("GET", pattern, handlers) -func (r *Router) Get(pattern string, h ...Handler) (leaf *Route) { - leaf = r.Handle("GET", pattern, h) - if r.autoHead { - r.Head(pattern, h...) - } - return leaf -} - -// Patch is a shortcut for r.Handle("PATCH", pattern, handlers) -func (r *Router) Patch(pattern string, h ...Handler) *Route { - return r.Handle("PATCH", pattern, h) -} - -// Post is a shortcut for r.Handle("POST", pattern, handlers) -func (r *Router) Post(pattern string, h ...Handler) *Route { - return r.Handle("POST", pattern, h) -} - -// Put is a shortcut for r.Handle("PUT", pattern, handlers) -func (r *Router) Put(pattern string, h ...Handler) *Route { - return r.Handle("PUT", pattern, h) -} - -// Delete is a shortcut for r.Handle("DELETE", pattern, handlers) -func (r *Router) Delete(pattern string, h ...Handler) *Route { - return r.Handle("DELETE", pattern, h) -} - -// Options is a shortcut for r.Handle("OPTIONS", pattern, handlers) -func (r *Router) Options(pattern string, h ...Handler) *Route { - return r.Handle("OPTIONS", pattern, h) -} - -// Head is a shortcut for r.Handle("HEAD", pattern, handlers) -func (r *Router) Head(pattern string, h ...Handler) *Route { - return r.Handle("HEAD", pattern, h) -} - -// Any is a shortcut for r.Handle("*", pattern, handlers) -func (r *Router) Any(pattern string, h ...Handler) *Route { - return r.Handle("*", pattern, h) -} - -// Route is a shortcut for same handlers but different HTTP methods. -// -// Example: -// m.Route("/", "GET,POST", h) -func (r *Router) Route(pattern, methods string, h ...Handler) (route *Route) { - for _, m := range strings.Split(methods, ",") { - route = r.Handle(strings.TrimSpace(m), pattern, h) - } - return route -} - -// Combo returns a combo router. -func (r *Router) Combo(pattern string, h ...Handler) *ComboRouter { - return &ComboRouter{r, pattern, h, map[string]bool{}, nil} -} - -// NotFound configurates http.HandlerFunc which is called when no matching route is -// found. If it is not set, http.NotFound is used. -// Be sure to set 404 response code in your handler. -func (r *Router) NotFound(handlers ...Handler) { - handlers = validateAndWrapHandlers(handlers) - r.notFound = func(rw http.ResponseWriter, req *http.Request) { - c := r.m.createContext(rw, req) - c.handlers = make([]Handler, 0, len(r.m.handlers)+len(handlers)) - c.handlers = append(c.handlers, r.m.handlers...) - c.handlers = append(c.handlers, handlers...) - c.run() - } -} - -// InternalServerError configurates handler which is called when route handler returns -// error. If it is not set, default handler is used. -// Be sure to set 500 response code in your handler. -func (r *Router) InternalServerError(handlers ...Handler) { - handlers = validateAndWrapHandlers(handlers) - r.internalServerError = func(c *Context, err error) { - c.index = 0 - c.handlers = handlers - c.Map(err) - c.run() - } -} - -// SetHandlerWrapper sets handlerWrapper for the router. -func (r *Router) SetHandlerWrapper(f func(Handler) Handler) { - r.handlerWrapper = f -} - -func (r *Router) ServeHTTP(rw http.ResponseWriter, req *http.Request) { - if t, ok := r.routers[req.Method]; ok { - h, p, ok := t.Match(req.URL.Path) - if ok { - if splat, ok := p["*0"]; ok { - p["*"] = splat // Easy name. - } - h(rw, req, p) - return - } - } - - r.notFound(rw, req) -} - -// URLFor builds path part of URL by given pair values. -func (r *Router) URLFor(name string, pairs ...string) string { - leaf, ok := r.namedRoutes[name] - if !ok { - panic("route with given name does not exists: " + name) - } - return leaf.URLPath(pairs...) -} - -// ComboRouter represents a combo router. -type ComboRouter struct { - router *Router - pattern string - handlers []Handler - methods map[string]bool // Registered methods. - - lastRoute *Route -} - -func (cr *ComboRouter) checkMethod(name string) { - if cr.methods[name] { - panic("method '" + name + "' has already been registered") - } - cr.methods[name] = true -} - -func (cr *ComboRouter) route(fn func(string, ...Handler) *Route, method string, h ...Handler) *ComboRouter { - cr.checkMethod(method) - cr.lastRoute = fn(cr.pattern, append(cr.handlers, h...)...) - return cr -} - -func (cr *ComboRouter) Get(h ...Handler) *ComboRouter { - return cr.route(cr.router.Get, "GET", h...) -} - -func (cr *ComboRouter) Patch(h ...Handler) *ComboRouter { - return cr.route(cr.router.Patch, "PATCH", h...) -} - -func (cr *ComboRouter) Post(h ...Handler) *ComboRouter { - return cr.route(cr.router.Post, "POST", h...) -} - -func (cr *ComboRouter) Put(h ...Handler) *ComboRouter { - return cr.route(cr.router.Put, "PUT", h...) -} - -func (cr *ComboRouter) Delete(h ...Handler) *ComboRouter { - return cr.route(cr.router.Delete, "DELETE", h...) -} - -func (cr *ComboRouter) Options(h ...Handler) *ComboRouter { - return cr.route(cr.router.Options, "OPTIONS", h...) -} - -func (cr *ComboRouter) Head(h ...Handler) *ComboRouter { - return cr.route(cr.router.Head, "HEAD", h...) -} - -// Name sets name of ComboRouter route. -func (cr *ComboRouter) Name(name string) { - if cr.lastRoute == nil { - panic("no corresponding route to be named") - } - cr.lastRoute.Name(name) -} diff --git a/vendor/gopkg.in/macaron.v1/static.go b/vendor/gopkg.in/macaron.v1/static.go deleted file mode 100644 index 60c521110..000000000 --- a/vendor/gopkg.in/macaron.v1/static.go +++ /dev/null @@ -1,220 +0,0 @@ -// Copyright 2013 Martini Authors -// Copyright 2014 The Macaron Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package macaron - -import ( - "encoding/base64" - "log" - "net/http" - "path" - "path/filepath" - "strings" - "sync" -) - -// StaticOptions is a struct for specifying configuration options for the macaron.Static middleware. -type StaticOptions struct { - // Prefix is the optional prefix used to serve the static directory content - Prefix string - // SkipLogging will disable [Static] log messages when a static file is served. - SkipLogging bool - // IndexFile defines which file to serve as index if it exists. - IndexFile string - // Expires defines which user-defined function to use for producing a HTTP Expires Header - // https://developers.google.com/speed/docs/insights/LeverageBrowserCaching - Expires func() string - // ETag defines if we should add an ETag header - // https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching#validating-cached-responses-with-etags - ETag bool - // FileSystem is the interface for supporting any implmentation of file system. - FileSystem http.FileSystem -} - -// FIXME: to be deleted. -type staticMap struct { - lock sync.RWMutex - data map[string]*http.Dir -} - -func (sm *staticMap) Set(dir *http.Dir) { - sm.lock.Lock() - defer sm.lock.Unlock() - - sm.data[string(*dir)] = dir -} - -func (sm *staticMap) Get(name string) *http.Dir { - sm.lock.RLock() - defer sm.lock.RUnlock() - - return sm.data[name] -} - -func (sm *staticMap) Delete(name string) { - sm.lock.Lock() - defer sm.lock.Unlock() - - delete(sm.data, name) -} - -var statics = staticMap{sync.RWMutex{}, map[string]*http.Dir{}} - -// staticFileSystem implements http.FileSystem interface. -type staticFileSystem struct { - dir *http.Dir -} - -func newStaticFileSystem(directory string) staticFileSystem { - if !filepath.IsAbs(directory) { - directory = filepath.Join(Root, directory) - } - dir := http.Dir(directory) - statics.Set(&dir) - return staticFileSystem{&dir} -} - -func (fs staticFileSystem) Open(name string) (http.File, error) { - return fs.dir.Open(name) -} - -func prepareStaticOption(dir string, opt StaticOptions) StaticOptions { - // Defaults - if len(opt.IndexFile) == 0 { - opt.IndexFile = "index.html" - } - // Normalize the prefix if provided - if opt.Prefix != "" { - // Ensure we have a leading '/' - if opt.Prefix[0] != '/' { - opt.Prefix = "/" + opt.Prefix - } - // Remove any trailing '/' - opt.Prefix = strings.TrimRight(opt.Prefix, "/") - } - if opt.FileSystem == nil { - opt.FileSystem = newStaticFileSystem(dir) - } - return opt -} - -func prepareStaticOptions(dir string, options []StaticOptions) StaticOptions { - var opt StaticOptions - if len(options) > 0 { - opt = options[0] - } - return prepareStaticOption(dir, opt) -} - -func staticHandler(ctx *Context, log *log.Logger, opt StaticOptions) bool { - if ctx.Req.Method != "GET" && ctx.Req.Method != "HEAD" { - return false - } - - file := ctx.Req.URL.Path - // if we have a prefix, filter requests by stripping the prefix - if opt.Prefix != "" { - if !strings.HasPrefix(file, opt.Prefix) { - return false - } - file = file[len(opt.Prefix):] - if file != "" && file[0] != '/' { - return false - } - } - - f, err := opt.FileSystem.Open(file) - if err != nil { - return false - } - defer f.Close() - - fi, err := f.Stat() - if err != nil { - return true // File exists but fail to open. - } - - // Try to serve index file - if fi.IsDir() { - // Redirect if missing trailing slash. - if !strings.HasSuffix(ctx.Req.URL.Path, "/") { - http.Redirect(ctx.Resp, ctx.Req.Request, ctx.Req.URL.Path+"/", http.StatusFound) - return true - } - - file = path.Join(file, opt.IndexFile) - f, err = opt.FileSystem.Open(file) - if err != nil { - return false // Discard error. - } - defer f.Close() - - fi, err = f.Stat() - if err != nil || fi.IsDir() { - return true - } - } - - if !opt.SkipLogging { - log.Println("[Static] Serving " + file) - } - - // Add an Expires header to the static content - if opt.Expires != nil { - ctx.Resp.Header().Set("Expires", opt.Expires()) - } - - if opt.ETag { - tag := GenerateETag(string(fi.Size()), fi.Name(), fi.ModTime().UTC().Format(http.TimeFormat)) - ctx.Resp.Header().Set("ETag", tag) - } - - http.ServeContent(ctx.Resp, ctx.Req.Request, file, fi.ModTime(), f) - return true -} - -// GenerateETag generates an ETag based on size, filename and file modification time -func GenerateETag(fileSize, fileName, modTime string) string { - etag := fileSize + fileName + modTime - return base64.StdEncoding.EncodeToString([]byte(etag)) -} - -// Static returns a middleware handler that serves static files in the given directory. -func Static(directory string, staticOpt ...StaticOptions) Handler { - opt := prepareStaticOptions(directory, staticOpt) - - return func(ctx *Context, log *log.Logger) { - staticHandler(ctx, log, opt) - } -} - -// Statics registers multiple static middleware handlers all at once. -func Statics(opt StaticOptions, dirs ...string) Handler { - if len(dirs) == 0 { - panic("no static directory is given") - } - opts := make([]StaticOptions, len(dirs)) - for i := range dirs { - opts[i] = prepareStaticOption(dirs[i], opt) - } - - return func(ctx *Context, log *log.Logger) { - for i := range opts { - if staticHandler(ctx, log, opts[i]) { - return - } - } - } -} diff --git a/vendor/gopkg.in/macaron.v1/tree.go b/vendor/gopkg.in/macaron.v1/tree.go deleted file mode 100644 index 8bba72fb3..000000000 --- a/vendor/gopkg.in/macaron.v1/tree.go +++ /dev/null @@ -1,379 +0,0 @@ -// Copyright 2015 The Macaron Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package macaron - -import ( - "regexp" - "strings" - - "github.com/Unknwon/com" -) - -type patternType int8 - -const ( - _PATTERN_STATIC patternType = iota // /home - _PATTERN_REGEXP // /:id([0-9]+) - _PATTERN_PATH_EXT // /*.* - _PATTERN_HOLDER // /:user - _PATTERN_MATCH_ALL // /* -) - -// Leaf represents a leaf route information. -type Leaf struct { - parent *Tree - - typ patternType - pattern string - rawPattern string // Contains wildcard instead of regexp - wildcards []string - reg *regexp.Regexp - optional bool - - handle Handle -} - -var wildcardPattern = regexp.MustCompile(`:[a-zA-Z0-9]+`) - -func isSpecialRegexp(pattern, regStr string, pos []int) bool { - return len(pattern) >= pos[1]+len(regStr) && pattern[pos[1]:pos[1]+len(regStr)] == regStr -} - -// getNextWildcard tries to find next wildcard and update pattern with corresponding regexp. -func getNextWildcard(pattern string) (wildcard, _ string) { - pos := wildcardPattern.FindStringIndex(pattern) - if pos == nil { - return "", pattern - } - wildcard = pattern[pos[0]:pos[1]] - - // Reach last character or no regexp is given. - if len(pattern) == pos[1] { - return wildcard, strings.Replace(pattern, wildcard, `(.+)`, 1) - } else if pattern[pos[1]] != '(' { - switch { - case isSpecialRegexp(pattern, ":int", pos): - pattern = strings.Replace(pattern, ":int", "([0-9]+)", 1) - case isSpecialRegexp(pattern, ":string", pos): - pattern = strings.Replace(pattern, ":string", "([\\w]+)", 1) - default: - return wildcard, strings.Replace(pattern, wildcard, `(.+)`, 1) - } - } - - // Cut out placeholder directly. - return wildcard, pattern[:pos[0]] + pattern[pos[1]:] -} - -func getWildcards(pattern string) (string, []string) { - wildcards := make([]string, 0, 2) - - // Keep getting next wildcard until nothing is left. - var wildcard string - for { - wildcard, pattern = getNextWildcard(pattern) - if len(wildcard) > 0 { - wildcards = append(wildcards, wildcard) - } else { - break - } - } - - return pattern, wildcards -} - -// getRawPattern removes all regexp but keeps wildcards for building URL path. -func getRawPattern(rawPattern string) string { - rawPattern = strings.Replace(rawPattern, ":int", "", -1) - rawPattern = strings.Replace(rawPattern, ":string", "", -1) - - for { - startIdx := strings.Index(rawPattern, "(") - if startIdx == -1 { - break - } - - closeIdx := strings.Index(rawPattern, ")") - if closeIdx > -1 { - rawPattern = rawPattern[:startIdx] + rawPattern[closeIdx+1:] - } - } - return rawPattern -} - -func checkPattern(pattern string) (typ patternType, rawPattern string, wildcards []string, reg *regexp.Regexp) { - pattern = strings.TrimLeft(pattern, "?") - rawPattern = getRawPattern(pattern) - - if pattern == "*" { - typ = _PATTERN_MATCH_ALL - } else if pattern == "*.*" { - typ = _PATTERN_PATH_EXT - } else if strings.Contains(pattern, ":") { - typ = _PATTERN_REGEXP - pattern, wildcards = getWildcards(pattern) - if pattern == "(.+)" { - typ = _PATTERN_HOLDER - } else { - reg = regexp.MustCompile(pattern) - } - } - return typ, rawPattern, wildcards, reg -} - -func NewLeaf(parent *Tree, pattern string, handle Handle) *Leaf { - typ, rawPattern, wildcards, reg := checkPattern(pattern) - optional := false - if len(pattern) > 0 && pattern[0] == '?' { - optional = true - } - return &Leaf{parent, typ, pattern, rawPattern, wildcards, reg, optional, handle} -} - -// URLPath build path part of URL by given pair values. -func (l *Leaf) URLPath(pairs ...string) string { - if len(pairs)%2 != 0 { - panic("number of pairs does not match") - } - - urlPath := l.rawPattern - parent := l.parent - for parent != nil { - urlPath = parent.rawPattern + "/" + urlPath - parent = parent.parent - } - for i := 0; i < len(pairs); i += 2 { - if len(pairs[i]) == 0 { - panic("pair value cannot be empty: " + com.ToStr(i)) - } else if pairs[i][0] != ':' && pairs[i] != "*" && pairs[i] != "*.*" { - pairs[i] = ":" + pairs[i] - } - urlPath = strings.Replace(urlPath, pairs[i], pairs[i+1], 1) - } - return urlPath -} - -// Tree represents a router tree in Macaron. -type Tree struct { - parent *Tree - - typ patternType - pattern string - rawPattern string - wildcards []string - reg *regexp.Regexp - - subtrees []*Tree - leaves []*Leaf -} - -func NewSubtree(parent *Tree, pattern string) *Tree { - typ, rawPattern, wildcards, reg := checkPattern(pattern) - return &Tree{parent, typ, pattern, rawPattern, wildcards, reg, make([]*Tree, 0, 5), make([]*Leaf, 0, 5)} -} - -func NewTree() *Tree { - return NewSubtree(nil, "") -} - -func (t *Tree) addLeaf(pattern string, handle Handle) *Leaf { - for i := 0; i < len(t.leaves); i++ { - if t.leaves[i].pattern == pattern { - return t.leaves[i] - } - } - - leaf := NewLeaf(t, pattern, handle) - - // Add exact same leaf to grandparent/parent level without optional. - if leaf.optional { - parent := leaf.parent - if parent.parent != nil { - parent.parent.addLeaf(parent.pattern, handle) - } else { - parent.addLeaf("", handle) // Root tree can add as empty pattern. - } - } - - i := 0 - for ; i < len(t.leaves); i++ { - if leaf.typ < t.leaves[i].typ { - break - } - } - - if i == len(t.leaves) { - t.leaves = append(t.leaves, leaf) - } else { - t.leaves = append(t.leaves[:i], append([]*Leaf{leaf}, t.leaves[i:]...)...) - } - return leaf -} - -func (t *Tree) addSubtree(segment, pattern string, handle Handle) *Leaf { - for i := 0; i < len(t.subtrees); i++ { - if t.subtrees[i].pattern == segment { - return t.subtrees[i].addNextSegment(pattern, handle) - } - } - - subtree := NewSubtree(t, segment) - i := 0 - for ; i < len(t.subtrees); i++ { - if subtree.typ < t.subtrees[i].typ { - break - } - } - - if i == len(t.subtrees) { - t.subtrees = append(t.subtrees, subtree) - } else { - t.subtrees = append(t.subtrees[:i], append([]*Tree{subtree}, t.subtrees[i:]...)...) - } - return subtree.addNextSegment(pattern, handle) -} - -func (t *Tree) addNextSegment(pattern string, handle Handle) *Leaf { - pattern = strings.TrimPrefix(pattern, "/") - - i := strings.Index(pattern, "/") - if i == -1 { - return t.addLeaf(pattern, handle) - } - return t.addSubtree(pattern[:i], pattern[i+1:], handle) -} - -func (t *Tree) Add(pattern string, handle Handle) *Leaf { - pattern = strings.TrimSuffix(pattern, "/") - return t.addNextSegment(pattern, handle) -} - -func (t *Tree) matchLeaf(globLevel int, url string, params Params) (Handle, bool) { - for i := 0; i < len(t.leaves); i++ { - switch t.leaves[i].typ { - case _PATTERN_STATIC: - if t.leaves[i].pattern == url { - return t.leaves[i].handle, true - } - case _PATTERN_REGEXP: - results := t.leaves[i].reg.FindStringSubmatch(url) - // Number of results and wildcasrd should be exact same. - if len(results)-1 != len(t.leaves[i].wildcards) { - break - } - - for j := 0; j < len(t.leaves[i].wildcards); j++ { - params[t.leaves[i].wildcards[j]] = results[j+1] - } - return t.leaves[i].handle, true - case _PATTERN_PATH_EXT: - j := strings.LastIndex(url, ".") - if j > -1 { - params[":path"] = url[:j] - params[":ext"] = url[j+1:] - } else { - params[":path"] = url - } - return t.leaves[i].handle, true - case _PATTERN_HOLDER: - params[t.leaves[i].wildcards[0]] = url - return t.leaves[i].handle, true - case _PATTERN_MATCH_ALL: - params["*"] = url - params["*"+com.ToStr(globLevel)] = url - return t.leaves[i].handle, true - } - } - return nil, false -} - -func (t *Tree) matchSubtree(globLevel int, segment, url string, params Params) (Handle, bool) { - for i := 0; i < len(t.subtrees); i++ { - switch t.subtrees[i].typ { - case _PATTERN_STATIC: - if t.subtrees[i].pattern == segment { - if handle, ok := t.subtrees[i].matchNextSegment(globLevel, url, params); ok { - return handle, true - } - } - case _PATTERN_REGEXP: - results := t.subtrees[i].reg.FindStringSubmatch(segment) - if len(results)-1 != len(t.subtrees[i].wildcards) { - break - } - - for j := 0; j < len(t.subtrees[i].wildcards); j++ { - params[t.subtrees[i].wildcards[j]] = results[j+1] - } - if handle, ok := t.subtrees[i].matchNextSegment(globLevel, url, params); ok { - return handle, true - } - case _PATTERN_HOLDER: - if handle, ok := t.subtrees[i].matchNextSegment(globLevel+1, url, params); ok { - params[t.subtrees[i].wildcards[0]] = segment - return handle, true - } - case _PATTERN_MATCH_ALL: - if handle, ok := t.subtrees[i].matchNextSegment(globLevel+1, url, params); ok { - params["*"+com.ToStr(globLevel)] = segment - return handle, true - } - } - } - - if len(t.leaves) > 0 { - leaf := t.leaves[len(t.leaves)-1] - if leaf.typ == _PATTERN_PATH_EXT { - url = segment + "/" + url - j := strings.LastIndex(url, ".") - if j > -1 { - params[":path"] = url[:j] - params[":ext"] = url[j+1:] - } else { - params[":path"] = url - } - return leaf.handle, true - } else if leaf.typ == _PATTERN_MATCH_ALL { - params["*"] = segment + "/" + url - params["*"+com.ToStr(globLevel)] = segment + "/" + url - return leaf.handle, true - } - } - return nil, false -} - -func (t *Tree) matchNextSegment(globLevel int, url string, params Params) (Handle, bool) { - i := strings.Index(url, "/") - if i == -1 { - return t.matchLeaf(globLevel, url, params) - } - return t.matchSubtree(globLevel, url[:i], url[i+1:], params) -} - -func (t *Tree) Match(url string) (Handle, Params, bool) { - url = strings.TrimPrefix(url, "/") - url = strings.TrimSuffix(url, "/") - params := make(Params) - handle, ok := t.matchNextSegment(0, url, params) - return handle, params, ok -} - -// MatchTest returns true if given URL is matched by given pattern. -func MatchTest(pattern, url string) bool { - t := NewTree() - t.Add(pattern, nil) - _, _, ok := t.Match(url) - return ok -} diff --git a/vendor/vendor.json b/vendor/vendor.json deleted file mode 100644 index 24776935c..000000000 --- a/vendor/vendor.json +++ /dev/null @@ -1,328 +0,0 @@ -{ - "comment": "", - "ignore": "test", - "package": [ - { - "checksumSHA1": "dflqt5AxPeRWDNy1T1BuhINCpNo=", - "path": "github.com/Tang-RoseChild/mahonia", - "revision": "0eef680515ccaa6e08f5b759e42b2192126bc3be", - "revisionTime": "2013-12-26T21:35:31Z" - }, - { - "checksumSHA1": "7HXb3cry6luicWeJM9Uxwzfo9Rs=", - "path": "github.com/Unknwon/com", - "revision": "0db4a625e949e956314d7d1adea9bf82384cc10c", - "revisionTime": "2017-02-13T07:20:14Z" - }, - { - "checksumSHA1": "1bK29RcAjCAMCYS2HS3O18w4m8k=", - "path": "github.com/cihub/seelog", - "revision": "f561c5e57575bb1e0a2167028b7339b3a8d16fb4", - "revisionTime": "2017-01-30T13:45:32Z" - }, - { - "checksumSHA1": "iMU6SM/jawaCOJnyvR5/w8C/C1w=", - "path": "github.com/cihub/seelog/archive", - "revision": "f561c5e57575bb1e0a2167028b7339b3a8d16fb4", - "revisionTime": "2017-01-30T13:45:32Z" - }, - { - "checksumSHA1": "oSd7EVei192qS3uYyCAMx9zV3Y8=", - "path": "github.com/cihub/seelog/archive/gzip", - "revision": "f561c5e57575bb1e0a2167028b7339b3a8d16fb4", - "revisionTime": "2017-01-30T13:45:32Z" - }, - { - "checksumSHA1": "emesF9mCsIQC59VUE2lvjZYpAHU=", - "path": "github.com/cihub/seelog/archive/tar", - "revision": "f561c5e57575bb1e0a2167028b7339b3a8d16fb4", - "revisionTime": "2017-01-30T13:45:32Z" - }, - { - "checksumSHA1": "TXLSkZsRlMifg3mg9+6QgEZJ6m4=", - "path": "github.com/cihub/seelog/archive/zip", - "revision": "f561c5e57575bb1e0a2167028b7339b3a8d16fb4", - "revisionTime": "2017-01-30T13:45:32Z" - }, - { - "checksumSHA1": "4772zXrOaPVeDeSgdiV7Vp4KEjk=", - "path": "github.com/dgrijalva/jwt-go", - "revision": "06ea1031745cb8b3dab3f6a236daf2b0aa468b7e", - "revisionTime": "2018-03-08T23:13:08Z" - }, - { - "checksumSHA1": "DB+/DpKJUO7dR+MyQVchJ+yyHoI=", - "path": "github.com/go-gomail/gomail", - "revision": "81ebce5c23dfd25c6c67194b37d3dd3f338c98b1", - "revisionTime": "2016-04-11T21:29:32Z" - }, - { - "checksumSHA1": "OkqfwXeTVoiIxNMDA7HKvmrCDw8=", - "path": "github.com/go-macaron/binding", - "revision": "48920167fa152d02f228cfbece7e0f1e452d200a", - "revisionTime": "2016-12-22T07:05:54Z" - }, - { - "path": "github.com/go-macaron/gzip", - "revision": "" - }, - { - "checksumSHA1": "y0olVbiMQ6/UOa/eh52XYnies90=", - "path": "github.com/go-macaron/inject", - "revision": "d8a0b8677191f4380287cfebd08e462217bac7ad", - "revisionTime": "2016-06-27T17:00:12Z" - }, - { - "checksumSHA1": "VMRkwnbl0mKWWvK/62CnIlv1oOg=", - "path": "github.com/go-macaron/toolbox", - "revision": "6766b8f16d1b135b250f09ba4dc4e24ab65b1107", - "revisionTime": "2017-02-20T18:37:56Z" - }, - { - "checksumSHA1": "QD6LqgLz2JMxXqns8TaxtK9AuHs=", - "path": "github.com/go-sql-driver/mysql", - "revision": "2e00b5cd70399450106cec6431c2e2ce3cae5034", - "revisionTime": "2016-12-24T12:10:19Z" - }, - { - "checksumSHA1": "Fh6Svimt+QyXHbaVxgSV7qwUHL8=", - "path": "github.com/go-xorm/builder", - "revision": "9c357861b643b7dd1023551fdf116b8d42030146", - "revisionTime": "2017-02-16T03:03:40Z" - }, - { - "checksumSHA1": "1BBE89UpNp+qVvrF5oKdRLTaBJc=", - "path": "github.com/go-xorm/core", - "revision": "7daacb215ed03af093a72e0af32a5fe79458613d", - "revisionTime": "2017-02-06T15:24:21Z" - }, - { - "checksumSHA1": "mTt9bHpv9b7cxh09G9m3dfWHa7g=", - "path": "github.com/go-xorm/xorm", - "revision": "e8fbd41c16b9c0468dbae8db2fe0161a21265b8a", - "revisionTime": "2017-02-21T11:08:50Z" - }, - { - "checksumSHA1": "kBeNcaKk56FguvPSUCEaH6AxpRc=", - "path": "github.com/golang/protobuf/proto", - "revision": "" - }, - { - "checksumSHA1": "Z4RIWIXH05QItZqVbmbONO9mWig=", - "path": "github.com/golang/protobuf/ptypes/any", - "revision": "" - }, - { - "checksumSHA1": "nzZPoKyx/lv8E/J7zZxuNQ5P1Bk=", - "path": "github.com/jakecoffman/cron", - "revision": "7e2009c226a5f6fb032692106d167ab0c3720692", - "revisionTime": "2019-01-06T20:08:28Z" - }, - { - "checksumSHA1": "iKPMvbAueGfdyHcWCgzwKzm8WVo=", - "path": "github.com/klauspost/cpuid", - "revision": "09cded8978dc9e80714c4d85b0322337b0a1e5e0", - "revisionTime": "2016-03-02T07:53:16Z" - }, - { - "checksumSHA1": "s6eyIXpJ7VAU06FM27GcEBM/5lo=", - "path": "github.com/lib/pq", - "revision": "90697d60dd844d5ef6ff15135d0203f65d2f53b8", - "revisionTime": "2018-05-23T17:54:26Z" - }, - { - "checksumSHA1": "AU3fA8Sm33Vj9PBoRPSeYfxLRuE=", - "path": "github.com/lib/pq/oid", - "revision": "90697d60dd844d5ef6ff15135d0203f65d2f53b8", - "revisionTime": "2018-05-23T17:54:26Z" - }, - { - "checksumSHA1": "TXREfPduAnd3j2nWhkqVXEcvufk=", - "path": "github.com/ouqiang/goutil", - "revision": "82b3d2997d337a2174b708d0ffe3f711ffb1eddf", - "revisionTime": "2018-04-18T01:28:05Z" - }, - { - "checksumSHA1": "aoYDmf0vxCZJOvIwTdElHi2IXH4=", - "path": "github.com/rakyll/statik", - "revision": "fcdcb7b85139b8b9ca1d8ef1d98d8593e90d117f", - "revisionTime": "2018-03-30T20:43:14Z" - }, - { - "checksumSHA1": "++Uxr4F++QrnFEbBlQsJ3VuQoNM=", - "path": "github.com/rakyll/statik/fs", - "revision": "fcdcb7b85139b8b9ca1d8ef1d98d8593e90d117f", - "revisionTime": "2018-03-30T20:43:14Z" - }, - { - "checksumSHA1": "1keN4Q9F8uHk/Gt5YXG0oCEecKM=", - "path": "github.com/urfave/cli", - "revision": "2526b57c56f30b50466c96c4133b1a4ad0f0191f", - "revisionTime": "2017-02-15T05:17:05Z" - }, - { - "checksumSHA1": "1MGpGDQqnUoRpv7VEcQrXOBydXE=", - "path": "golang.org/x/crypto/pbkdf2", - "revision": "453249f01cfeb54c3d549ddb75ff152ca243f9d8", - "revisionTime": "2017-02-08T20:51:15Z" - }, - { - "checksumSHA1": "Y+HGqEkYM15ir+J93MEaHdyFy0c=", - "path": "golang.org/x/net/context", - "revision": "ffcf1bedda3b04ebb15a168a59800a73d6dc0f4d", - "revisionTime": "2017-03-29T01:43:45Z" - }, - { - "checksumSHA1": "gWK2bRAGP52KF88V1fsdn5yD6vg=", - "path": "golang.org/x/net/http2", - "revision": "" - }, - { - "checksumSHA1": "ezWhc7n/FtqkLDQKeU2JbW+80tE=", - "path": "golang.org/x/net/http2/hpack", - "revision": "" - }, - { - "checksumSHA1": "VrzPJyWI6disCgYuVEQzkjqUsJk=", - "path": "golang.org/x/net/idna", - "revision": "" - }, - { - "checksumSHA1": "UxahDzW2v4mf/+aFxruuupaoIwo=", - "path": "golang.org/x/net/internal/timeseries", - "revision": "" - }, - { - "checksumSHA1": "3xyuaSNmClqG4YWC7g0isQIbUTc=", - "path": "golang.org/x/net/lex/httplex", - "revision": "" - }, - { - "checksumSHA1": "9EZG3s2eOREO7WkBvigjk57wK/8=", - "path": "golang.org/x/net/trace", - "revision": "" - }, - { - "checksumSHA1": "faFDXp++cLjLBlvsr+izZ+go1WU=", - "path": "golang.org/x/text/secure/bidirule", - "revision": "" - }, - { - "checksumSHA1": "ziMb9+ANGRJSSIuxYdRbA+cDRBQ=", - "path": "golang.org/x/text/transform", - "revision": "" - }, - { - "checksumSHA1": "KG+XZAbxdkpBm3Fa3bJ3Ylq8CKI=", - "path": "golang.org/x/text/unicode/bidi", - "revision": "" - }, - { - "checksumSHA1": "Anof4bt0AU+Sa3R8Rq0KBnlpbaQ=", - "path": "golang.org/x/text/unicode/norm", - "revision": "" - }, - { - "checksumSHA1": "61oRC/n7DFqHNu6Z+4fAKY1FVCY=", - "path": "google.golang.org/genproto/googleapis/rpc/status", - "revision": "" - }, - { - "checksumSHA1": "zX/r1cxU777gFup7n41Nphp7ZLg=", - "path": "google.golang.org/grpc", - "revision": "" - }, - { - "checksumSHA1": "xDFNvjW6gMsDQ+WRZ0t+8S/e4Qk=", - "path": "google.golang.org/grpc/codes", - "revision": "" - }, - { - "checksumSHA1": "ABO3qOTUiOZOk1UCq47NbQ64yWk=", - "path": "google.golang.org/grpc/credentials", - "revision": "" - }, - { - "checksumSHA1": "d0cyferoJguQhL6d2K6g2oC0mVM=", - "path": "google.golang.org/grpc/grpclb/grpc_lb_v1", - "revision": "" - }, - { - "checksumSHA1": "3Lt5hNAG8qJAYSsNghR5uA1zQns=", - "path": "google.golang.org/grpc/grpclog", - "revision": "" - }, - { - "checksumSHA1": "T3Q0p8kzvXFnRkMaK/G8mCv6mc0=", - "path": "google.golang.org/grpc/internal", - "revision": "" - }, - { - "checksumSHA1": "TY6NrgLRPSer6a5dBYOo/7o/ghk=", - "path": "google.golang.org/grpc/keepalive", - "revision": "" - }, - { - "checksumSHA1": "89fjWaU6NKVpmWI+0EoDION0dpE=", - "path": "google.golang.org/grpc/metadata", - "revision": "" - }, - { - "checksumSHA1": "4GSUFhOQ0kdFlBH4D5OTeKy78z0=", - "path": "google.golang.org/grpc/naming", - "revision": "" - }, - { - "checksumSHA1": "wUSBvomJRJhYf4ELuP0bSkFrzgc=", - "path": "google.golang.org/grpc/peer", - "revision": "" - }, - { - "checksumSHA1": "e7eoENPNFnm2QddUE5epm8UmFX8=", - "path": "google.golang.org/grpc/stats", - "revision": "" - }, - { - "checksumSHA1": "0tlQhEkF3hex/+tjcygLxeweuiY=", - "path": "google.golang.org/grpc/status", - "revision": "" - }, - { - "checksumSHA1": "N0TftT6/CyWqp6VRi2DqDx60+Fo=", - "path": "google.golang.org/grpc/tap", - "revision": "" - }, - { - "checksumSHA1": "IgcvdaQvvbUyNuPcrQVHDuKidc0=", - "path": "google.golang.org/grpc/transport", - "revision": "" - }, - { - "checksumSHA1": "6IzzHO9p32aHJhMYMwijccDUIVA=", - "path": "gopkg.in/alexcesaro/quotedprintable.v3", - "revision": "2caba252f4dc53eaf6b553000885530023f54623", - "revisionTime": "2015-07-16T17:19:45Z" - }, - { - "checksumSHA1": "v5M2URDb0vJwelofRjiIsml0Jts=", - "path": "gopkg.in/ini.v1", - "revision": "74bdc99692c3408cb103221e38675ce8fda0a718", - "revisionTime": "2017-02-22T11:10:43Z" - }, - { - "checksumSHA1": "1HJvJZheB5NNl3i1R9zZJpiJ1G0=", - "path": "gopkg.in/macaron.v1", - "revision": "a325110f8b392bce3e5cdeb8c44bf98078ada3be", - "revisionTime": "2017-02-13T09:12:08Z" - }, - { - "path": "https://code.google.com/p/mahonia", - "revision": "" - }, - { - "path": "https://github.com/go-gomail/gomail", - "revision": "" - } - ], - "rootPath": "github.com/ouqiang/gocron" -}